|
|
Строка 1: |
Строка 1: |
− | На многих форумах, часто задают такой вопрос '''"Как перевести нпс в offline, а затем в online, через скрипт?"'''. Но вразумительного ответа, так нигде и не дают. Перечисляют множество возможных операторов перевода, но при этом сами не уверены, работают они или нет. Просмотрев уже существующие скрипты, нашёл нужные операторы перевода мобов в '''offline-online'''.
| + | comment6, |
− | ---------------------------------------------------------------------------------------------------------------------------------------------
| + | |
− | ---------------------------------------------------------------------------------------------------------------------------------------------
| + | |
− | Итак. Вот сами операторы перевода:
| + | |
− | | + | |
− | <lua>
| + | |
− | alife():set_switch_offline (id, value)
| + | |
− | alife():set_switch_online (id, value)
| + | |
− | alife():set_interactive (id, value)
| + | |
− | </lua>
| + | |
− | | + | |
− | Есть условие их использования. Данные операторы должны использоваться только вместе. Правда зачем нужен оператор '''set_interactive''', я не в курсе. Вроде и без него работает. Но в оригинальных скриптах он везде используется, поэтому я его не стал исключать.
| + | |
− | | + | |
− | ---------------------------------------------------------------------------
| + | |
− | <big>'''Перевод в offline:'''</big>
| + | |
− | | + | |
− | Например, у нас есть уникальный нпс, которого нужно перевести в '''offline'''. Первое, что нам нужно сделать, это определить его '''id'''. Не '''sid''' из файла '''game_story_ids.ltx''', а '''id''' объекта. Некоторые причисляют их к одному и тому же параметру. Хотя это не так. '''Sid''' -это принудительно-зарегистрированный ключ инициализации объекта, для управления объектом в не зависимости от того, где он находится. '''Id''' -это порядковый номер объекта, который задаётся автоматически, при спавне.
| + | |
− | Определение '''id''' может быть разнообразным. Всё зависит от ситуации и откуда наша функция будет вызываться. Но в любом случае, определение '''id''' объекта производится через его '''userdata'''.
| + | |
− | Если наша функция будет вызываться из логики нпс, то '''userdata''' объекта будет передаваться в функцию автоматически. Главное правильно задать переменную в скобках наименования функции:
| + | |
− | | + | |
− | <lua>
| + | |
− | function name(actor, npc)
| + | |
− | ...
| + | |
− | end
| + | |
− | </lua>
| + | |
− | | + | |
− | Где, '''actor''' и '''npc''' -переменные содержащие '''userdata''' актора и непися, с логики которого данная функция вызывается, соответственно. Нужно всегда помнить, что в данной ситуации, первая переменная содержит '''userdata актора''', а вторая '''userdata непися'''. При этом, наименования переменных могут быть произвольными. Главное соблюдать порядок наименования.
| + | |
− | Чтобы в данной ситуации определить его '''id''', не потребуется писать никаких действий, достаточно прописать определение '''id''' объекта, в том месте, где должно прописываться его '''id''':
| + | |
− | | + | |
− | <lua>
| + | |
− | npc:id()
| + | |
− | </lua>
| + | |
− | | + | |
− | Если наша функция будет вызываться не из логики, а например из скрипта, где при определённых условиях, определённый непись будет переводиться в '''offline''', нам понадобится его '''sid''', через который мы и определим его '''userdata'''. Есть два способа определения '''userdata''' через '''sid'''. Первый способ, это определение через функцию '''level_object_by_sid()''':
| + | |
− | | + | |
− | <lua>
| + | |
− | local npc = level_object_by_sid( sid объекта )
| + | |
− | </lua>
| + | |
− | | + | |
− | Второй способ, это определение через '''alife()''':
| + | |
− | | + | |
− | <lua>
| + | |
− | local npc = alife():story_object( sid объекта )
| + | |
− | </lua>
| + | |
− | | + | |
− | При этом, первый способ срабатывает значительно быстрее, так как поиск объекта производится из списка объектов, находящихся в '''online'''. А, второй способ производит поиск объекта из списка всех объектов находящихся в игре.
| + | |
− | Предпочтительно, конечно, использовать второй способ, так как при первом способе придётся писать дополнительные действия, для защиты от '''error''', когда нпс будет и так находиться в '''offline'''.
| + | |
− | Но у второго способа есть одно отличие от стандарта. '''Id''' объекта придётся определять не через функцию '''id()''', а через его переменную '''id''':
| + | |
− | | + | |
− | <lua>
| + | |
− | npc.id
| + | |
− | </lua>
| + | |
− | | + | |
− | Итак. Вроде как определились с данными '''id'''. Теперь создадим саму функцию перевода нпс в '''offline'''.
| + | |
− | | + | |
− | '''Для вызова функции из логики нпс:'''
| + | |
− | | + | |
− | <lua>
| + | |
− | function name(actor, npc)
| + | |
− | | + | |
− | if npc then
| + | |
− | | + | |
− | alife():set_switch_offline (npc:id(), true)
| + | |
− | alife():set_switch_online (npc:id(), false)
| + | |
− | alife():set_interactive (npc:id(), false)
| + | |
− | | + | |
− | end
| + | |
− | end
| + | |
− | </lua>
| + | |
− | | + | |
− | '''Для вызова функции из другого скрипта, будет выглядеть так (если userdata не определена)''':
| + | |
− | | + | |
− | <lua>
| + | |
− | function name()
| + | |
− | | + | |
− | local npc = alife():story_object( sid объекта )
| + | |
− | | + | |
− | if npc then
| + | |
− | | + | |
− | alife():set_switch_offline (npc.id, true)
| + | |
− | alife():set_switch_online (npc.id, false)
| + | |
− | alife():set_interactive (npc.id, false)
| + | |
− | | + | |
− | end
| + | |
− | end
| + | |
− | </lua>
| + | |
− | | + | |
− | --------------------------------------------------------------------------
| + | |
− | <big>'''Перевод в online:'''</big>
| + | |
− | | + | |
− | Для перевода в '''online''' действуют те же условия. С некоторыми отличиями. Первый способ определения '''userdata''' через '''sid''', не допустим. Так как данный оператор действителен, только если объект находится в '''online'''. В любом другом случае, он выдаст ошибку.
| + | |
− | И конечно же, когда нпс находится в '''offline''', логика на него не может быть воздействована, поэтому остаётся только вызов функции из другого скрипта.
| + | |
− | | + | |
− | Итак, функция перевода нпс в '''online''':
| + | |
− | | + | |
− | '''Для вызова функции из другого скрипта,(если userdata не определена):'''
| + | |
− | | + | |
− | <lua>
| + | |
− | function name()
| + | |
− | | + | |
− | local npc = alife():story_object( sid объекта )
| + | |
− | | + | |
− | if npc then
| + | |
− | | + | |
− | alife():set_switch_offline (npc.id, false)
| + | |
− | alife():set_switch_online (npc.id, true)
| + | |
− | alife():set_interactive (npc.id, true)
| + | |
− | | + | |
− | end
| + | |
− | end
| + | |
− | </lua>
| + | |
− | | + | |
− | -------------------------------------------------------------------------------------------------------------------------------
| + | |
− | -------------------------------------------------------------------------------------------------------------------------------
| + | |
− | | + | |
− | Переводы в offline и в online производится независимо от того, где находится актор, хоть нос к носу с переводимым нпс.
| + | |
− | Есть одно ограничение. Если в логике нпс, хоть где-то указано постоянное нахождение в '''online''', то перевод его в '''offline''' будет не возможен, пока данное указание не будет снято.
| + | |
− | | + | |
− | ---------------------------------------------------------------------
| + | |
− | | + | |
− | Автор статьи <big>'''Singapur22'''</big>
| + | |
− | | + | |
− | [[Категория: скрипты ]]
| + | |