На багатьох форумах, часто ставлять таке питання: "Як перевести нпс в 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 буде неможливим, поки ця вказівка не буде знята.