SoC. Переход NPC в offline-online через скрипт — различия между версиями — S.T.A.L.K.E.R. Inside Wiki

SoC. Переход NPC в offline-online через скрипт — различия между версиями

Материал из S.T.A.L.K.E.R. Inside Wiki

Перейти к: навигация, поиск
Строка 4: Строка 4:
 
Итак. Вот сами операторы перевода:
 
Итак. Вот сами операторы перевода:
  
<pre>alife():set_switch_offline (id, value)
+
<lua>
 +
alife():set_switch_offline (id, value)
 
alife():set_switch_online (id, value)
 
alife():set_switch_online (id, value)
alife():set_interactive (id, value)</pre>
+
alife():set_interactive (id, value)
 +
</lua>
  
 
Есть условие их использования. Данные операторы должны использоваться только вместе. Правда зачем нужен оператор '''set_interactive''', я не в курсе. Вроде и без него работает. Но в оригинальных скриптах он везде используется, поэтому я его не стал исключать.
 
Есть условие их использования. Данные операторы должны использоваться только вместе. Правда зачем нужен оператор '''set_interactive''', я не в курсе. Вроде и без него работает. Но в оригинальных скриптах он везде используется, поэтому я его не стал исключать.
Строка 17: Строка 19:
 
Если наша функция будет вызываться из логики нпс, то '''userdata''' объекта будет передаваться в функцию автоматически. Главное правильно задать переменную в скобках наименования функции:
 
Если наша функция будет вызываться из логики нпс, то '''userdata''' объекта будет передаваться в функцию автоматически. Главное правильно задать переменную в скобках наименования функции:
  
<pre>function name(actor, npc)
+
<lua>
 +
function name(actor, npc)
 
...
 
...
end</pre>
+
end
 +
</lua>
  
 
Где, '''actor''' и '''npc''' -переменные содержащие '''userdata''' актора и непися, с логики которого данная функция вызывается, соответственно. Нужно всегда помнить, что в данной ситуации, первая переменная содержит '''userdata актора''', а вторая '''userdata непися'''. При этом, наименования переменных могут быть произвольными. Главное соблюдать порядок наименования.
 
Где, '''actor''' и '''npc''' -переменные содержащие '''userdata''' актора и непися, с логики которого данная функция вызывается, соответственно. Нужно всегда помнить, что в данной ситуации, первая переменная содержит '''userdata актора''', а вторая '''userdata непися'''. При этом, наименования переменных могут быть произвольными. Главное соблюдать порядок наименования.
 
Чтобы в данной ситуации определить его '''id''', не потребуется писать никаких действий, достаточно прописать определение '''id''' объекта, в том месте, где должно прописываться его '''id''':
 
Чтобы в данной ситуации определить его '''id''', не потребуется писать никаких действий, достаточно прописать определение '''id''' объекта, в том месте, где должно прописываться его '''id''':
  
<pre>npc:id()</pre>
+
<lua>
 +
npc:id()
 +
</lua>
  
 
Если наша функция будет вызываться не из логики, а например из скрипта, где при определённых условиях, определённый непись будет переводиться в '''offline''', нам понадобится его '''sid''', через который мы и определим его '''userdata'''. Есть два способа определения '''userdata''' через '''sid'''. Первый способ, это определение через функцию '''level_object_by_sid()''':
 
Если наша функция будет вызываться не из логики, а например из скрипта, где при определённых условиях, определённый непись будет переводиться в '''offline''', нам понадобится его '''sid''', через который мы и определим его '''userdata'''. Есть два способа определения '''userdata''' через '''sid'''. Первый способ, это определение через функцию '''level_object_by_sid()''':
  
<pre>local npc = level_object_by_sid( sid объекта )</pre>
+
<lua>
 +
local npc = level_object_by_sid( sid объекта )
 +
</lua>
  
 
Второй способ, это определение через '''alife()''':
 
Второй способ, это определение через '''alife()''':
  
<pre>local npc = alife():story_object( sid объекта )</pre>
+
<lua>
 +
local npc = alife():story_object( sid объекта )
 +
</lua>
  
 
При этом, первый способ срабатывает значительно быстрее, так как поиск объекта производится из списка объектов, находящихся в '''online'''. А, второй способ производит поиск объекта из списка всех объектов находящихся в игре.
 
При этом, первый способ срабатывает значительно быстрее, так как поиск объекта производится из списка объектов, находящихся в '''online'''. А, второй способ производит поиск объекта из списка всех объектов находящихся в игре.
Предпочтительно конечно использовать второй способ, так как при первом способе придётся писать дополнительные действия, для защиты от '''error''', когда нпс будет и так находиться в '''offline'''.
+
Предпочтительно, конечно, использовать второй способ, так как при первом способе придётся писать дополнительные действия, для защиты от '''error''', когда нпс будет и так находиться в '''offline'''.
 
Но у второго способа есть одно отличие от стандарта. '''Id''' объекта придётся определять не через функцию '''id()''', а через его переменную '''id''':
 
Но у второго способа есть одно отличие от стандарта. '''Id''' объекта придётся определять не через функцию '''id()''', а через его переменную '''id''':
  
<pre>npc.id</pre>
+
<lua>
 +
npc.id
 +
</lua>
  
 
Итак. Вроде как определились с данными '''id'''. Теперь создадим саму функцию перевода нпс в '''offline'''.
 
Итак. Вроде как определились с данными '''id'''. Теперь создадим саму функцию перевода нпс в '''offline'''.
Строка 44: Строка 56:
 
'''Для вызова функции из логики нпс:'''
 
'''Для вызова функции из логики нпс:'''
  
<pre>function name(actor, npc)
+
<lua>
 +
function name(actor, npc)
  
 
if npc then
 
if npc then
Строка 53: Строка 66:
  
 
end
 
end
end</pre>
+
end
 +
</lua>
  
 
'''Для вызова функции из другого скрипта, будет выглядеть так (если userdata не определена)''':
 
'''Для вызова функции из другого скрипта, будет выглядеть так (если userdata не определена)''':
  
<pre>function name()
+
<lua>
 +
function name()
  
 
local npc = alife():story_object( sid объекта )
 
local npc = alife():story_object( sid объекта )
Строка 68: Строка 83:
  
 
end
 
end
end</pre>
+
end
 +
</lua>
  
 
--------------------------------------------------------------------------
 
--------------------------------------------------------------------------
 
<big>'''Перевод в online:'''</big>
 
<big>'''Перевод в online:'''</big>
  
Для перевода в '''online''', действуют те же условия. С некоторыми отличиями. Первый способ определения '''userdata''' через '''sid''', не допустим. Так как данный оператор действителен, только если объект находится в '''online'''. В любом другом случае, он выдаст ошибку.
+
Для перевода в '''online''' действуют те же условия. С некоторыми отличиями. Первый способ определения '''userdata''' через '''sid''', не допустим. Так как данный оператор действителен, только если объект находится в '''online'''. В любом другом случае, он выдаст ошибку.
 
И конечно же, когда нпс находится в '''offline''', логика на него не может быть воздействована, поэтому остаётся только вызов функции из другого скрипта.
 
И конечно же, когда нпс находится в '''offline''', логика на него не может быть воздействована, поэтому остаётся только вызов функции из другого скрипта.
  
Строка 80: Строка 96:
 
'''Для вызова функции из другого скрипта,(если userdata не определена):'''
 
'''Для вызова функции из другого скрипта,(если userdata не определена):'''
  
<pre>function name()
+
<lua>
 +
function name()
  
 
local npc = alife():story_object( sid объекта )
 
local npc = alife():story_object( sid объекта )
Строка 91: Строка 108:
  
 
end
 
end
end</pre>
+
end
 +
</lua>
  
 
-------------------------------------------------------------------------------------------------------------------------------
 
-------------------------------------------------------------------------------------------------------------------------------
 
-------------------------------------------------------------------------------------------------------------------------------
 
-------------------------------------------------------------------------------------------------------------------------------
  
Переводы в offline и в online производится не зависимо от того, где находится актор, хоть нос к носу с переводимым нпс.
+
Переводы в offline и в online производится независимо от того, где находится актор, хоть нос к носу с переводимым нпс.
 
Есть одно ограничение. Если в логике нпс, хоть где-то указано постоянное нахождение в '''online''', то перевод его в '''offline''' будет не возможен, пока данное указание не будет снято.
 
Есть одно ограничение. Если в логике нпс, хоть где-то указано постоянное нахождение в '''online''', то перевод его в '''offline''' будет не возможен, пока данное указание не будет снято.
  

Версия 17:37, 3 июня 2010

На многих форумах, часто задают такой вопрос "Как перевести нпс в offline, а затем в online, через скрипт?". Но вразумительного ответа, так нигде и не дают. Перечисляют множество возможных операторов перевода, но при этом сами не уверены, работают они или нет. Просмотрев уже существующие скрипты, нашёл нужные операторы перевода мобов в offline-online.



Итак. Вот сами операторы перевода:

 
alife():set_switch_offline (id, value)
alife():set_switch_online (id, value)
alife():set_interactive (id, value)
 

Есть условие их использования. Данные операторы должны использоваться только вместе. Правда зачем нужен оператор set_interactive, я не в курсе. Вроде и без него работает. Но в оригинальных скриптах он везде используется, поэтому я его не стал исключать.


Перевод в offline:

Например, у нас есть уникальный нпс, которого нужно перевести в offline. Первое, что нам нужно сделать, это определить его id. Не sid из файла game_story_ids.ltx, а id объекта. Некоторые причисляют их к одному и тому же параметру. Хотя это не так. Sid -это принудительно-зарегистрированный ключ инициализации объекта, для управления объектом в не зависимости от того, где он находится. Id -это порядковый номер объекта, который задаётся автоматически, при спавне. Определение id может быть разнообразным. Всё зависит от ситуации и откуда наша функция будет вызываться. Но в любом случае, определение id объекта производится через его userdata. Если наша функция будет вызываться из логики нпс, то userdata объекта будет передаваться в функцию автоматически. Главное правильно задать переменную в скобках наименования функции:

 
function name(actor, npc)
...
end
 

Где, actor и npc -переменные содержащие userdata актора и непися, с логики которого данная функция вызывается, соответственно. Нужно всегда помнить, что в данной ситуации, первая переменная содержит userdata актора, а вторая userdata непися. При этом, наименования переменных могут быть произвольными. Главное соблюдать порядок наименования. Чтобы в данной ситуации определить его id, не потребуется писать никаких действий, достаточно прописать определение id объекта, в том месте, где должно прописываться его id:

 
npc:id()
 

Если наша функция будет вызываться не из логики, а например из скрипта, где при определённых условиях, определённый непись будет переводиться в offline, нам понадобится его sid, через который мы и определим его userdata. Есть два способа определения userdata через sid. Первый способ, это определение через функцию level_object_by_sid():

 
local npc = level_object_by_sid( sid объекта )
 

Второй способ, это определение через alife():

 
local npc = alife():story_object( sid объекта )
 

При этом, первый способ срабатывает значительно быстрее, так как поиск объекта производится из списка объектов, находящихся в online. А, второй способ производит поиск объекта из списка всех объектов находящихся в игре. Предпочтительно, конечно, использовать второй способ, так как при первом способе придётся писать дополнительные действия, для защиты от error, когда нпс будет и так находиться в offline. Но у второго способа есть одно отличие от стандарта. Id объекта придётся определять не через функцию id(), а через его переменную id:

 
npc.id
 

Итак. Вроде как определились с данными id. Теперь создадим саму функцию перевода нпс в offline.

Для вызова функции из логики нпс:

 
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
 

Для вызова функции из другого скрипта, будет выглядеть так (если userdata не определена):

 
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
 

Перевод в online:

Для перевода в online действуют те же условия. С некоторыми отличиями. Первый способ определения userdata через sid, не допустим. Так как данный оператор действителен, только если объект находится в online. В любом другом случае, он выдаст ошибку. И конечно же, когда нпс находится в offline, логика на него не может быть воздействована, поэтому остаётся только вызов функции из другого скрипта.

Итак, функция перевода нпс в online:

Для вызова функции из другого скрипта,(если userdata не определена):

 
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
 


Переводы в offline и в online производится независимо от того, где находится актор, хоть нос к носу с переводимым нпс. Есть одно ограничение. Если в логике нпс, хоть где-то указано постоянное нахождение в online, то перевод его в offline будет не возможен, пока данное указание не будет снято.


Автор статьи Singapur22

Другие места
LANGUAGE