AspirinSGD, уже спросил. Итак, выкладываю полную версию скрипта, со всеми сопутсвующими функциями(внимание, не тестировал!(ибо не дома, ноут не тянет ваш шаталкер))! Огромная просьба создать себе файл с этим скриптом, подключить его к игре и проверить с помощью спавн-меню, после чего отписаться, не будет ли вылетов и т.д. Скрипт найдете под спойлером. За помощь выражаю благодарность народу с форума АМК, который объяснил мне кое-чего в скриптах им команды и помог начать освоение скриптов
self.chtime=time_global()+2000 if self.object:clsid()==clsid.controller_s and self.object:alive() then amk.mylog("zombifying") local npc=self.object:get_enemy() if npc then if npc:id()~=db.actor:id() and npc:clsid()==clsid.script_stalker and self.object:see(npc) and npc:character_community()~="zombied" and self.object:position():distance_to(npc:position())<30 then
local sobj=alife():object( npc:id() ) if sobj and sobj.online then local zomb=amk.load_table("zombies") zomb[sobj.id]={master=self.object:id(),comm=npc:character_community(),gw=npc:goodwill(db.actor)} amk.save_table("zombies",zomb) npc:set_character_community("zombied",0,0) local orgtbl=amk.read_stalker_params(sobj) if (not string.find(orgtbl.profile,"_zombi")) then orgtbl.profile=orgtbl.profile.."_zombi" end amk.mylog("zombied "..npc:name().." profile "..orgtbl.profile) amk.write_stalker_params(orgtbl,sobj) end end end end ===============================Реализация функций для скрипта(вынести в отдельный файл!)=======================================
function save_pstor_table(pk, tbl, obj) local tp for k, v in pairs(tbl) do if v == true then pk:w_u8(pstor_true) elseif v == false then pk:w_u8(pstor_false) else tp = type(v) if tp == "number" then pk:w_u8(pstor_number) pk:w_float(v) elseif tp == "string" then pk:w_u8(pstor_string) pk:w_stringZ(v) elseif tp == "table" then pk:w_u8(pstor_table) xr_logic.save_pstor_table(pk, v, obj) elseif tp == "userdata" then pk:w_u8(pstor_custom) pk:w_stringZ(v.classname == k and "" or v.classname) v:save(pk) else abort("xr_logic.save_pstor_table for %s: not registered type '%s' encountered [ %s :: %s ]", obj:name(), tv, k, utils.to_str(v)) end end pk:w_stringZ(k) end pk:w_u8(pstor_end_table) end
function load_pstor_table(pk, tbl, obj) local k, v, n while true do n = pk:r_u8() if n == pstor_end_table then return tbl else if n == pstor_true then v = true elseif n == pstor_false then v = false elseif n == pstor_number then v = pk:r_float() elseif n == pstor_string then v = pk:r_stringZ() elseif n == pstor_table then v = {} xr_logic.load_pstor_table(pk, v, obj) elseif n == pstor_custom then local cls = reader:r_stringZ() if cls == "" then cls = k end v = pstor_custom_impl[cls]() v:load(pk) else abort("У объекта [%s] повреждён пстор, этим сохранением нельзя пользоваться - удалите его и переиграйте с предыдущего.", obj:name()) v = nil end k = pk:r_stringZ() tbl[k] = v end end end
function pstor_save_all(obj, packet) local npc_id = obj:id() local pstor = db.storage[npc_id].pstor if not pstor then pstor = {} db.storage[npc_id].pstor = pstor end save_pstor_table(packet, pstor, obj) end
function pstor_load_all(obj, reader) local npc_id = obj:id() local pstor = db.storage[npc_id].pstor if not pstor then pstor = {} db.storage[npc_id].pstor = pstor end if (not db.actor) and npc_id ~= 0 then abort("Не создан актор. Возможно, синтаксическая ошибка в bind_stalker.script") end load_pstor_table(reader, pstor, obj) end
Сообщение отредактировал vlad8599 - Среда, 04.01.2017, 00:12
Stan, ну, аватар не особо много значит. Ты вначале попробуй включить скрипт в игру, поиграй с ним чуток, дабы убедиться, что не будет всяких обидных вылетов, а потом уже жалуйся. А я снова пойду просить совета у местных мододелов или попробую сам запилить фикс.
Добавлено (04.01.2017, 00:21) --------------------------------------------- NecrONIKS, эти параметры реализованы ниже. Вам остается только поправить имена параметров, дабы не вылетело при запуске.
Сообщение отредактировал vlad8599 - Среда, 04.01.2017, 00:25
Stan, ну так я описал выше. Спавним сталкеров через спавнер, спавним контролёра, прячемся и смотрим, стали ли они через какое-то время зомбированными. Надо только подключить сам файл с этим скриптом. Кстати, я кое-что жестко натупил(а точнее - не поменял имена со старых на новые). Поэтому выкладываю переписанный скрипт, надеюсь, что он будет работать.
self.chtime=time_global()+2000 if self.object:clsid()==clsid.controller_s and self.object:alive() then local npc=self.object:get_enemy() if npc then if npc:id()~=db.actor:id() and npc:clsid()==clsid.script_stalker and self.object:see(npc) and npc:character_community()~="zombied" and self.object:position():distance_to(npc:position())<30 then
local sobj=alife():object( npc:id() ) if sobj and sobj.online then local zomb=load_pstor_table("zombies") zomb[sobj.id]={master=self.object:id(),comm=npc:character_community(),gw=npc:goodwill(db.actor)} save_pstor_table("zombies",zomb) npc:set_character_community("zombied",0,0) local orgtbl=pstor_load_all(sobj) if (not string.find(orgtbl.profile,"_zombi")) then orgtbl.profile=orgtbl.profile.."_zombi" end pstor_save_all(orgtbl,sobj) end end end end ===============================Реализация функций для скрипта(вынести в отдельный файл!)=======================================
function save_pstor_table(pk, tbl, obj) local tp for k, v in pairs(tbl) do if v == true then pk:w_u8(pstor_true) elseif v == false then pk:w_u8(pstor_false) else tp = type(v) if tp == "number" then pk:w_u8(pstor_number) pk:w_float(v) elseif tp == "string" then pk:w_u8(pstor_string) pk:w_stringZ(v) elseif tp == "table" then pk:w_u8(pstor_table) xr_logic.save_pstor_table(pk, v, obj) elseif tp == "userdata" then pk:w_u8(pstor_custom) pk:w_stringZ(v.classname == k and "" or v.classname) v:save(pk) else abort("xr_logic.save_pstor_table for %s: not registered type '%s' encountered [ %s :: %s ]", obj:name(), tv, k, utils.to_str(v)) end end pk:w_stringZ(k) end pk:w_u8(pstor_end_table) end
function load_pstor_table(pk, tbl, obj) local k, v, n while true do n = pk:r_u8() if n == pstor_end_table then return tbl else if n == pstor_true then v = true elseif n == pstor_false then v = false elseif n == pstor_number then v = pk:r_float() elseif n == pstor_string then v = pk:r_stringZ() elseif n == pstor_table then v = {} xr_logic.load_pstor_table(pk, v, obj) elseif n == pstor_custom then local cls = reader:r_stringZ() if cls == "" then cls = k end v = pstor_custom_impl[cls]() v:load(pk) else abort("У объекта [%s] повреждён пстор, этим сохранением нельзя пользоваться - удалите его и переиграйте с предыдущего.", obj:name()) v = nil end k = pk:r_stringZ() tbl[k] = v end end end
function pstor_save_all(obj, packet) local npc_id = obj:id() local pstor = db.storage[npc_id].pstor if not pstor then pstor = {} db.storage[npc_id].pstor = pstor end save_pstor_table(packet, pstor, obj) end
function pstor_load_all(obj, reader) local npc_id = obj:id() local pstor = db.storage[npc_id].pstor if not pstor then pstor = {} db.storage[npc_id].pstor = pstor end if (not db.actor) and npc_id ~= 0 then abort("Не создан актор. Возможно, синтаксическая ошибка в bind_stalker.script") end load_pstor_table(reader, pstor, obj) end
vlad8599, ты выглядишь очень глупо. "Я хочу зомбирование неписей контроллером, вот, я нашел вам скрипт. Правда я в них не разбираюсь, но вы же обязательно это сделаете, я уверен! Я даже игру не качал, нет возможности проверить." По факту, движки ТЧ и ЗП отличаются, методы реализации, сделанные в АМК, могут не сработать в CoC, в котором, кстати, движок тоже серьезно перелопачен по сравнению с оригиналом. В том что ты скинул есть вызовы функций mylog и write_stalker_params, которых у тебя нет.