MegaStalker 66 Опубликовано 3 Января 2017 Поделиться Опубликовано 3 Января 2017 @naxac, понял. То есть никакие доп.функции из АМК мне не придется адаптировать? Все зовут меня Пришедший из Ниоткуда...Почему?Потому что я пришел из ниоткуда и иду в никуда... Ссылка на комментарий
naxac 2 447 Опубликовано 3 Января 2017 Поделиться Опубликовано 3 Января 2017 (изменено) @MegaStalker, придется. load_table/save_table - функции для сохранения/загрузки таблиц из пстора read_stalker_params/write_stalker_params - для чтения/записи нет-пакета нпс. Для нет-пакетов я бы рекомендовал что-нибудь другое использовать, не из АМК, т.к. там местами неверно пакет читается/пишется. Модуль m_netpk от Артоса например. А таблицы в АМК пакуются в строки - тоже так себе, но если альтернативы нет, то пойдет. Изменено 3 Января 2017 пользователем naxac Аддон для ОП-2.09.2: Яндекс/Google/GitHub Ссылка на комментарий
Kondr48 314 Опубликовано 3 Января 2017 Поделиться Опубликовано 3 Января 2017 (изменено) А таблицы в АМК пакуются в строки - тоже так себе, но если альтернативы нет, то пойдет. А чем плох этот вариант? И какие бывают альтернативы? Я просто пользуюсь хранилищем в 7 патче и о размерах сохраняемого особо никогда не задумываюсь Изменено 3 Января 2017 пользователем Kondr48 Ссылка на комментарий
naxac 2 447 Опубликовано 3 Января 2017 Поделиться Опубликовано 3 Января 2017 А чем плох этот вариант? И какие бывают альтернативы?Слишком он тормозной, мне кажется, особенно для использования на апдейте.Альтернативы - например, сохранение напрямую, без паковки 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 2 Аддон для ОП-2.09.2: Яндекс/Google/GitHub Ссылка на комментарий
MegaStalker 66 Опубликовано 3 Января 2017 Поделиться Опубликовано 3 Января 2017 (изменено) @naxac, ого, классно сделано! И относительно понятно для человека, никогда не писавшего скрипты. Представить себе не могу, чтобы я без твоей помощи делал. @naxac, смотри, я постарался поменять кое-что в соотвествии с твоими функциями. Просьба поправить, если где-то что-то не так(я скрипты только начал изучать) 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 Изменено 3 Января 2017 пользователем MegaStalker Все зовут меня Пришедший из Ниоткуда...Почему?Потому что я пришел из ниоткуда и иду в никуда... Ссылка на комментарий
Капрал Хикс 534 Опубликовано 3 Января 2017 Поделиться Опубликовано 3 Января 2017 Можно ли в ТЧ скриптовым способом, в обход движка, запретить перемещать артефакты на пояс при отсутствии надетого на ГГ определённого костюма (со встроенным контейнером для артов)? В идеале бы неплохо разное количество переносимых артов для разных костюмов как в ЧН / ЗП... Ссылка на комментарий
naxac 2 447 Опубликовано 4 Января 2017 Поделиться Опубликовано 4 Января 2017 @MegaStalker, ты меня не понял. Я привел пример, как переписать сохранение пстора в xr_logic.script для возможности хранения таблиц. Читать нетпакет этими функциями нельзя, как нельзя и сохранять таблицы напрямую. if (self.chtime or 0) < time_global() then 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 = xr_logic.pstor_retrieve(db.actor, "zombies", {}) zomb[sobj.id]={master=self.object:id(),comm=npc:character_community(),gw=npc:goodwill(db.actor)} xr_ligic.pstor_store(db.actor, "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.write_stalker_params(orgtbl,sobj) end end end end end Аддон для ОП-2.09.2: Яндекс/Google/GitHub Ссылка на комментарий
Kondr48 314 Опубликовано 4 Января 2017 Поделиться Опубликовано 4 Января 2017 (изменено) Капрал Хикс, да можно конечно, но правки движка все равно понадобятся (X-RAY EXTENSIONS например уже подойдет). Добавляйте в конфиг костюма нужную строку, затем когда что-то попало к нам на пояс, проверяем сколько может на поясе лежать артефактов и скидываем "лишние". Ну а как нарисовать картинку поверх ячейки артефактов: мол она недоступна, отслеживаем нужные инфопоршня на открытие / закрытие инвентаря и рисуем, примеров достаточно . Изменено 4 Января 2017 пользователем Kondr48 1 Ссылка на комментарий
MegaStalker 66 Опубликовано 4 Января 2017 Поделиться Опубликовано 4 Января 2017 (изменено) @naxac, я совсем запутался. Вот смотри, у меня есть указанный тобой файл, для своего удобства я оставил в нем только твои функции. А как мне их теперь применить в самом скрипте зомбирования? Мне надо переименовывать что-то или как? Ведь в скрипте имя функции одно, а в файле xr_logic другое. Изменено 4 Января 2017 пользователем MegaStalker Все зовут меня Пришедший из Ниоткуда...Почему?Потому что я пришел из ниоткуда и иду в никуда... Ссылка на комментарий
TIGER_VLAD 361 Опубликовано 4 Января 2017 Поделиться Опубликовано 4 Января 2017 Всем привет. Есть какие-то варианты отключения звука шагов в определенный момент? Ну или как-то заменять звук шагов на свой звук(пустой) ? Ссылка на комментарий
dsh 3 824 Опубликовано 4 Января 2017 Поделиться Опубликовано 4 Января 2017 @TIGER_VLAD,мне в голову приходит только одна мысль. Я знаю, что звук шагов привязан к костюму. Полагаю, если сделать два одинаковых костюма и один из них сделать без звука шагов, то в нужный момент можно актора переодевать. 1 dsh mod: https://github.com/dsh2dsh/op2ogse Ссылка на комментарий
TIGER_VLAD 361 Опубликовано 4 Января 2017 Поделиться Опубликовано 4 Января 2017 @dsh, да знаю, этот момент( как-то раз неправильно настроил костюм в SDK и звук шагов пропал). Такой вариант не хочу использовать и так костылей хватает у меня)) Ссылка на комментарий
Kondr48 314 Опубликовано 4 Января 2017 Поделиться Опубликовано 4 Января 2017 (изменено) TIGER_VLAD, Такой вариант не хочу использовать и так костылей хватает у меня В таком случае, добро пожаловать в исходники, например экспортируйте в скрипты возможность изменения звука шагов) Изменено 4 Января 2017 пользователем Kondr48 1 Ссылка на комментарий
Капрал Хикс 534 Опубликовано 4 Января 2017 Поделиться Опубликовано 4 Января 2017 @Kondr48, окей, параметр в костюмы дописать не проблема... А что конкретно из X-ray extensions подключать? У меня SVN_portable_r230, если что. И где подсмотреть примеры скриптов? Ссылка на комментарий
Kondr48 314 Опубликовано 4 Января 2017 Поделиться Опубликовано 4 Января 2017 Капрал Хикс, что конкретно сказать не могу. Все функции для работы с инвентарем и поясом нужны (ну они скорее всего по умолчанию идут) плюс колбеки, аналогично. А примеров использования колбеков, функций этих и рисования скриптом в инвентаре элементов больше чем достаточно в том же OGSE 0.6.9.3. Ссылка на комментарий
MegaStalker 66 Опубликовано 6 Января 2017 Поделиться Опубликовано 6 Января 2017 Народ, никак не могу из указанного мной скрипта найти функции - такие, как amk.write, amk.read... Все скрипты перерыл, они упоминаются - но алгоритмы самих функций не могу найти. Вопрос - где находятся объявления этих функций и можно ли переписать скрипт без их использования? Все зовут меня Пришедший из Ниоткуда...Почему?Потому что я пришел из ниоткуда и иду в никуда... Ссылка на комментарий
losiara 13 Опубликовано 6 Января 2017 Поделиться Опубликовано 6 Января 2017 (изменено) MegaStalker Таких функций там и нет, есть вот такие: "amk.write_stalker_params и amk.read_stalker_params" Соот. amk. - название файла где лежит функция - write_stalker_params и read_stalker_params!!! function write_stalker_params(tbl,sobj)local stpk=net_packet()local uppk=net_packet()amk.fill_stalker_packet(tbl,stpk,uppk)local size=stpk:w_tell()local size1=uppk:w_tell()-- amk.mylog("wsp "..size.." "..size1)stpk:r_seek(0)uppk:r_seek(0)sobj:STATE_Read(stpk,size)sobj:UPDATE_Read(uppk)local npc=level.object_by_id(sobj.id)if npc thenamk.convert_npc[sobj.id]=trueswitch_offline(npc)endendfunction read_stalker_params(sobj)local stpk=net_packet()local uppk=net_packet()sobj:STATE_Write(stpk)sobj:UPDATE_Write(uppk)local size=stpk:w_tell()local size1=uppk:w_tell()-- amk.mylog("rsp "..size.." "..size1)stpk:r_seek(0)uppk:r_seek(0)local tbl=amk.parse_stalker_packet({},stpk,uppk,size)-- amk.mylog("rsp "..size.." "..size1.." "..stpk:r_tell())return tblend Но у АМК все взаимосвязано, одно на другое ссылается и т. д. поэтому придется использовать файл целиком либо корректировать по своему усмотрению если сможешь конечно... Изменено 6 Января 2017 пользователем losiara Жизнь следует измерять поступками, а не временем... Ссылка на комментарий
Kondr48 314 Опубликовано 6 Января 2017 Поделиться Опубликовано 6 Января 2017 Не сочтите за оффтоп, но правда интересно, зачем использовать эти функции и скрипты амк? 2 Ссылка на комментарий
losiara 13 Опубликовано 7 Января 2017 Поделиться Опубликовано 7 Января 2017 (изменено) Мне не ведомо зачем они потребовались MegaStalker,у меня лично используются при присвоении SID-ов через скрипт. Примерно так: function aes2_monolit22()local obj = alife():create("aes2_monolit_kvest",vector():set(272.838,0.150,151.652),96637,2576)local tbl = amk.read_stalker_params(obj)tbl.sid = 5514amk.write_stalker_params(tbl, obj)end Изменено 7 Января 2017 пользователем HellRatz Жизнь следует измерять поступками, а не временем... Ссылка на комментарий
MegaStalker 66 Опубликовано 7 Января 2017 Поделиться Опубликовано 7 Января 2017 (изменено) @Kondr48, я хочу поиграть в мод CoC, который по сути является платформой для собственных модов. Поэтому я хотел перенести из АМК зомбирование неписей контролёром. Но поскольку ссылок тут на другие функции, судя по всему, целая туча, мне проще всего будет использовать весь файл скрипта. За информацию большое спасибо, она мне еще пригодится в будущем. Изменено 7 Января 2017 пользователем MegaStalker 1 Все зовут меня Пришедший из Ниоткуда...Почему?Потому что я пришел из ниоткуда и иду в никуда... Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти