Перейти к контенту

Рекомендуемые сообщения

Struck

1.

но текстов ограниченное количество, а кликов неограниченное количество, и еще нужно сделать запоминание одного текста для кажлого лист итема...
- напрашивается однозначное ограничение - текстов в исходной таблице должно быть НЕ менее чем итемов -> тогда для каждого итема по первому по нему клику будет сопоставлен и запомнен(! должно быть!) и далее кликай сколько хочешь, т.к. будут выдаваться уже запомненные сопоставленные с итемами тексты. Т.о. условие "и он всегда должен выпадать когда я нажимаю на" удовлетворяется.

2. Напрашивается очевидное: при первом клике по итему из исходной таблицы изымается рандомный текст и помещается в поле второй (рабочей) таблице по ключу итема ( Tabl[item] = text_X ). При последующих кликах предварительно проверяется наличие ключа/поля в рабочей таблице и, если нет - то выбор для нового итема нового рандомного текста из исходной таблицы (с удаелнием из нее и запоминанием в рабочей).

3. Не очень понятна фраза:

... и еще нужно сделать запоминание одного текста для кажлого лист итема...
- если подразумевается что это некий второй сопоставленный с итемом текст, обязательный для показа, то ... маловато условий. Это типа заголовок/нотация, т.е. заведомо сопоставленный текст, или текст тоже как-т рандомно иль иначе выдается или еще что ...

В любом случае поле рабечей таблицы с ключом-итемом может быть составным и содержать пару сопоставленных итему текстов. Или же сделать третью табличку для "заголовков/описаний" итемов ... Тут уже фантазия и вусы. ;-)

 

Вот вроде в кратце и весь алгоритм (один из ...) - теперь воплощай в коды. ;-)

Изменено пользователем Artos

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

Всем доброго времени суток. На днях я столкнулся с проблемой считывания параметров NPC из XML-файла. Мне нужно считать параметр <bio>Краткая_биография</bio>.

Полазил в интернете, посмотрел различные шаблоны XML-парсинга на LUA, и функцию string.gfind. Так вот, шаблон для захвата я вроде бы составил (не уверен, что правильно):

function get_bio(npc)

local xml_npc_bio = string.gfind(" :( ", "(%w%p_)(*_bio)")

return xml_npc_bio

end

 

Хочу преобразовать исходное название шаблона "название_биографии_bio" в текст. Нужно для детальной информации...

 

То, что я отметил под смайликом :( - это место, где нужно начать поиск необходимого шаблона. Вот только где нужно начать поиск шаблона? Пробовал через npc:name(), через npc:id()..., но выскакивает ошибка, типа "нет функции".

 

Если кто разбирается в этом, помогите кто-нибудь, пожалуйста!

 

Мне почему-то казалось, что этот тег, не что иное, как рудимент.

ColR_iT

Изменено пользователем ColR_iT
Ссылка на комментарий

Получить значение поля bio не представляется возможным через функции. Можно конечно написать движковую функцию для того чтобы получать биографию, но врядли ты это осилишь. Поэтому придется парсить весь файл. Есть отличный парсер xml от Kirag, который отлично распарсивает весь файл в табличку, откуда я вынимал значения поля bio. Поищи на этом форуме

Freedom

Ссылка на комментарий

Кто-нибудь использовал для неписей или монстров функцию action()? Рабочая ли она? В ЧН она использовалась, но финальном ТЧ вроде нет.

 

Ты про какую конкретно функцию говоришь? Функция action есть в файле _g.scritp, есть метод класса planner_action, унаследованного от класса action_planner; есть в классах game_object и object.

ColR_iT

 

Добавлено через 53 мин.:

Пример: action(trader, anim("vstuplenie"), cond(cond.anim_end))

 

Эта функция из файла _g.script.

ColR_iT

Изменено пользователем ColR_iT
Ссылка на комментарий

Прошу помочь разобраться с вопросом.Имеем данный код

    if db.actor~=nil then
       db.actor:set_character_rank(db.actor:character_rank()+math.random(10,20))
       db.actor:change_character_reputation(db.actor:character_reputation()+math.random(88,99))
       relation_registry.change_community_goodwill("dolg",db.actor:id(),tonumber(5000))
    end

Таким образом добавляем актору очки ранга рандомно, прибавляем репутацию и устанавливаем отношение группировки Долг к актору нетрально.В случае если враги.Правильно ли я растолковал данные части кода?

Изменено пользователем panzyuza
Ссылка на комментарий

panzyuza, нет, в твоем коде та же ошибка что и в оригинальной игре, т.е. наступаешь на грабли, которые кочуют из мода в мод.

Функция change_character_reputation принимает аргументом число НА которое требуется изменить (change) ранг НПС, а не которое требуется установить.

Т.о. строка должна выглядеть так:

db.actor:change_character_reputation( math.random(88,99) )

- тогда имеющийся ранг актора (db.actor:character_reputation()) и будет изменен (увеличен/уменьшен) на задаваемое значение (88...99).

В твоем же случае, как и в оригинальной игре, к уже имеющемуся рангу будет добавлен такой же плюс твоя добавка -> и постепенно будет превышено максимальное значение для ранга и "ранг уйдет в минус".

Если же требуется установить фиксированное значение ранга - используй функцию установки, а не изменения: set_character_reputation(number)

 

То же самое касается и community_goodwill, т.е.:

- change_community_goodwill - изменяет на задаваемую дельту уже имеющееся текущее значение группировки к актору/НПС;

- set_community_goodwill - устанавливает заданное значение, отбрасывая прежнее.

Изменено пользователем Artos

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий
Artos, понятно.Спс.Просто был такой случай.Нужно было актору установить отношение к бандитам нейтрал(+2000).Но когда сработала функция set_community_goodwill ничего не произошло.Напротив change сработал. Изменено пользователем panzyuza
Ссылка на комментарий

panzyuza

Я дал информацию по теории, чтобы ты исправил практические ошибки. ;-)

На практике функции set_ действительно имеют некие коллизии в той или иной ситуации и вероятно это (переход от set к change без учета нюанса) и привело к ошибке в исходной игре.

Конечно, если требуется просто задать абсолютное значение рангу или отношениям проще использовать set, но и применяя правильно change - получаем тот же результат.

Из моей практики:

Установка отношения для конкретного непися ( oNPC:set_community_goodwill(iGoodwill, oTargetNPC) ) - вполне корректно работает.

А вот с группиповками похуже ... Тут для себя делаю так: Получаем текущее значение отношения:

iGoodwill = relation_registry.community_goodwill(sFaction, oActor:id())

далее вычисляем требуемое, с учетом НЕпереполнения(!):

iChkGoodwill = math.min(3000, math.max(0, iGoodwill +200))

ну и уже изменяем именно относительно текущего:

relation_registry.set_community_goodwill (sFaction, oActor:id(), iChkGoodwill)

- т.о. ставим именно сколько нам нужно, а не относительно имеющегося, которое может быть неприемлемым ... Несколько кучеряво - но надежно.

Изменено пользователем Artos

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

Кто подскажет, что это за метод такой чудный - play_no_feedback, у класса sound_object, что при его использовании метод playing, этого же класса, всегда возвращает false, хотя я отчётливо слышу в наушник, как звук проигрывается?

И вообще для чего у него аж пять аргументов? В принципе, первый, второй и пятый более менее понятны, а вот остальные для чего?

Ну и вдогонку по классу sound_object...

Совсем непонятны свойство frequency и метод stop_deffered. У кого какие мысли на счёт них?

Ссылка на комментарий

ColR_iT, какое-либо действие можно запустить на выполнение с или без обратной связи, т.е. с отслеживанием состояние действия или по принципу "дал команду выполнить и забыл".

При наличии обратной связи можно узнать, например относительно звука, играет ли звук, сколько времени еще осталось играть и т.п. ... Без обратной связи, отдав команду для проигрывания звука, ты не озаботился о последствиях и естественно в любом случае не можешь уже узнать играет звук или нет, т.е. попытка узнать это "всегда возвращает false".

3-ий аргумент - время задержки перед проигрыванием, т.е. начальная пауза.

4-ый аргумент - позиция относительно об'екта (1-ый аргумент), по которой будет проигрываться звук. т.е. звук не будет отслеживать об'ект, следуя за ним, а будет привязан к конкретной точке.

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

Artos, не очень понял твои слова об "обратной связи".

Вот код:

if hud:GetCustomStatic("main_task") then
    --# Определим объект и что будем играть
    local snd_obj = xr_sound.get_safe_sound_object([[detectors\bomb_timer]])
    --# Затычка запуска один раз
    if varible == 0 then
        --# Играем звук
        snd_obj:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), 1)
        --# "Затыкаем"
        varible = varible + 1
    end
    get_console():execute("load ~~~ Playing is "..tostring(snd_obj:playing()))
end

Висит на апдейте актора. Зажимаю Tab - в консоле только false. Если для проигрывания использую метод play:

snd_obj:play(db.actor, 0, sound_object.s2d)

То пока звук играет выводит true. Так задумано?

Ссылка на комментарий

ColR_iT, обратная связь - это как раз то, что запущенное событие способно тебе предоставлять информацтю о своем состоянии и ты можешь проверять играет ли и т.п.

Если ты запускаешь проигрывание звука методами play или play_at_pos - тем самым ты запускаешь с обратной связью и можешь "общаться" с запущенным процессом, проверяя playing, останавливать - stop и т.п.

Запуск методом play_no_feedback - НЕ дает обратной связи, т.е. ты просто дал команду "проиграть звук" и все, далее процесс автономен и не общается с тобою, т.е. не реагирует на твои запросы (нет обратной связи). Т.о. сделав запрос такому процессу: "Ты играешь?" - ты всегда будешь получать в ответ false, т.е. процесс тебя просто не слушает и не отвечает на твой запрос.

Изменено пользователем Artos

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий
как запомнить какой текст выпал и больше его не выдавать
Для твоих целей как нельзя лучше подходит совершенно замечательный код, написанный Рики Лэйком (Rici Lake, rici@ricilake.net) Изменено пользователем Gun12
Ссылка на комментарий

Проконсультируйте по такому вопросу:

У меня в моде получается очень много рестрикторов, который срабатывают один раз, а потом лежат мертвых грузом. Хотел бы узнать, как правильно удалить спейс_рестриктор чтобы не получить после удаления осложнений. Спейсы не прописаны в in/out рестрикторах у НПС. Подойдет ли здесь простое получение серверного объекта и его удаление через alife():release()?

Freedom

Ссылка на комментарий
_Призрак_, а чем плох метод перевода схемы рестриктора в nil? Их апдейты при этом не работают, схемы - подавно, висят себе в сохранениях... Изменено пользователем ColR_iT
Ссылка на комментарий

Не согдашусь с ColR_iT'ом, 'мусор" и рудименты в малых количествах может и хлопотнее подчищать чем не замечать, но ... и море состоит из капелек, так что и захлебнуться можно. :crazy:

 

Ну а серьезно, если рестриктор не прописывается куда/кому-либо, а обычный, то мало можно найти причин беспокоиться о его удалении. Если уж аномалии прямо "на ходу" удаляются - то уж с рестрикторами все гораздо проще.

_Призрак_, советую задуматься над довольно простым, но действенным вариантом зачистки отрабоотавщих рестрикторов:

1. Предпосылки:

- а зачем вообще спавнить все рестрикторы из алл.спавна в начале игры(?), и даже те, которые нужны то в самом конце на самых последних минутах и всего-то для простой мелочевки?

- в зачем оставлять по всей Зоне, хотя и невидимые, но никомму не нужные и по сути рудиментарные уже об'екты?

Ответ довольно прост, потому что засунув все в конфиги алл.спавна, на фоне всей кучи этого и не заметно, а в игре игрок и не подозревает. Для скриптового спавна же требуется немного заморочиться и с конфигами и с нет-пакетами (шейпами) ... В результате - как в столовой, берем на поднос весь ассортимент обеда и с него едим, хорошо хоть первое со вторыи и с компотом не замешано вместе, а по разным тарелкам/стаканам ... ;-)

Т.о. в моде, если у модмейкера голова на плечах и руки не из места "пониже" ... то и спавнить разовые рестрикторы можно по мере надобности, запоминая их хоть по ид-ам иль инаяе, и удалять когда отпала нужда. Вспомним разные телепорты и временные левел-ченджеры.

Наверное самое разумное: появляется ГГ на новом уровне первый раз - нужные рестрикторы спавнятся на локацию. Уходит с нее - отработавшие удаляются. Вернулся (если по сюжету) - другой набор рестрикторов ... и т.д. и т.п. Момент перехода актора на др.уровень ловить несложно, и по этому моменту принимать решение, так что даже с запасом время есть.

 

2. То, что отработавшие рестрикторы не сильно заняты в апдейтах - в общем да, но не забываем, что все они спавнятся (а это время), всем онлайновым инициализируется логика, для всех все одно вызывается и метод апдейта, проверяющий не отрабоотавший ли(?), т.е. в табличке ли апдейтящихся ...

Также, биндер в табличку апдейтов заносит по мере спавна (а значит при загрузке игры в net_spawn), а удаляет - по net_destroy, и, т.к. рестрикторы в оффлайн не уходят и на дистанцию алайфа чихают, то ... пока не выйдешь из игры/с локации - отключенные рестрикторы апдейтятся "по полной программе" (ну или около того).

Все это конечно вроде как мизер (для каждого в отдельности иль кучкой), но ... все это суммируясь отжирает русурсы. Так зачем же их терять с самого начала игры и копить баласт на протяжении всего похода по Зоне? Сами модмейкеры игроку и переносимый вес обрезают, и патрон/аптечек лишают, и здоровье при первом удобном случае норовят попортить ... а вот за "собою"подчищать и освобождать игру от "переносимого веса-баласта" - это как раз и как-то не принято. :-(

 

3. Ну про занятые и не освобождающие ID можно не поминать в суе ... но если, например, десятка два локаций и на каждой по сотне две отработанных рестрикторо - 20х200 = 4.000 - это уже более 6% (от 65535), что не так уж и мало только на баластные рестрикторы! На большом и развивающемся моде это может быть началом проблем.

 

Так что _Призрак_, уверен что рестриктор отработал - чисть его при первом удобном случае, но не превращай в погоню за "чистотою", так что затратишь не менее чем вычистишь. ;-)

 

P.S. В принципе, даже проверял и где-то применяю - в самой логике рестриктора по окончании активной секции переключая на 'nil' - вызываю функцию удаления "самого себя". Т.к. удаляется серверный об'ект а в потоке работает гейм-об'ект, удаление происходит чисто и удобно, т.е. без лишних телодвижений и затрат.

Изменено пользователем Artos

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

Доброго времени суток.

Камрад пытался реализовать, чтобы производился звук при одевании комбинезона.

На тестах получили следущее:

звук производится постоянно, вне зависимости от того, надевается предмет, стоит в слоте или вовсе в рюкзаке.

Делали так:

function proverka_na_helmet()
         local actor = db.actor
         local slot_twelve = db.actor:item_in_slot(12)
         
         if actor and slot_twelve == 0 then
         actor:disable_info_portion("info_to_twelve_mod")
         return
         end
                   if actor and slot_twelve ~= 0 and actor:disable_info_portion("info_to_twelve_mod") then
                   local snd = sound_object([[interface\mp_reward]]) -- Путь до звука
                   snd:play_no_feedback(db.actor,sound_object.s2d, 0, vector():set(0, 0, 0), 2.0)
                   actor:disable_info_portion("info_to_twelve_mod")
                   end
end

 

 

Не подскажете что не так?

Выводы модмейкера:

1)Вылетает - это хорошо. Значит, работает :)

2) Если хочешь сделать что-то хорошо, делай сам!

3) Если падёшь духом, падёт и мод.

4) Он живой... :o

Ссылка на комментарий

SibireaStalker, Попробуй так, сам не проверял, да и алгоритм не сильно экономичный.

 

local flag_s = false -- изначално звук запрещен.
function proverka_na_helmet()
    local actor = db.actor
    local slot_twelve = db.actor:item_in_slot(12)
        if actor then -- есть актор
            if slot_twelve == 0 then -- слот пуст =>
                flag_s = true -- разрешаем звук
             end
         end
    if flag_s then -- разрешен звук
        if     actor then -- есть актор
            if slot_twelve then -- есть костюм
                local snd = sound_object([[interface\mp_reward]]) -- Путь до звука
                   snd:play_no_feedback(db.actor,sound_object.s2d, 0, vector():set(0, 0, 0), 2.0)    -- даем звук
                   flag_s = false -- запрещаем звук.
            end
        end
    end               
end

 

 

Второй вариант, обрезал лишние апдейты.

 

local flag_s = false -- изначално звук запрещен.
function proverka_na_helmet()
    local actor = db.actor
    local slot_twelve = db.actor:item_in_slot(12)
        if not flag_s then -- работает только если звук запрещен...
            if actor then -- есть актор
                if slot_twelve == 0 then -- слот пуст =>
                    flag_s = true -- разрешаем звук
                end
            end
         end
    if flag_s then -- разрешен звук
        if     actor then -- есть актор
            if slot_twelve then -- есть костюм
                local snd = sound_object([[interface\mp_reward]]) -- Путь до звука
                   snd:play_no_feedback(db.actor,sound_object.s2d, 0, vector():set(0, 0, 0), 2.0)    -- даем звук
                   flag_s = false -- запрещаем звук.
            end
        end
    end               
end

 

 

Эти варианты - не панацея, можно сделать куда короче, но нужно подумать...

Изменено пользователем Vano_Santuri

Что-то кончается, что-то начинается...

Ссылка на комментарий

SibireaStalker,

стоп-стоп... Разве в оригинале НЕТ звука надевания костюма? о_О Что мешает изменить сам звук, если уж он не устраивает?

  • Согласен 1
Ссылка на комментарий

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   0 пользователей

    Ни один зарегистрированный пользователь не просматривает эту страницу.

AMK-Team.ru

×
×
  • Создать...