Сповіщення
Очистити все

SoC. Перехід NPC до offline-online через скрипт


Ранг:
Майстер
Роль:
Гість
Записи:
752
Приєднався:
7 місяців тому
 

На багатьох форумах, часто ставлять таке питання: "Як перевести нпс в 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 об'єкта )
 

При цьому перший спосіб спрацьовує значно швидше, тому що пошук об'єкта проводиться зі списку об'єктів, що знаходяться в онлайн . А, другий спосіб здійснює пошук об'єкта зі списку всіх об'єктів, що перебувають у грі. Переважно, звичайно, використовувати другий спосіб, так як при першому способі доведеться писати додаткові дії, для захисту від 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 діють ті самі умови. З деякими відмінностями. Перший спосіб визначення userdata через sid , не допустимий. Так як даний оператор дійсний, тільки якщо об'єкт знаходиться в Інтернеті . У будь-якому іншому випадку він видасть помилку. І звичайно ж, коли нпс знаходиться в 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 буде неможливим, поки ця вказівка ​​не буде знята.


   
Цитата