AndreySol 215 Опубликовано 1 Ноября 2013 Akella-96 aka SvD Если я правильно понял, то в ф-ции del_antigas у Вас происходит спаун нового противогаза с секцией "helm_respirator_wo_filter" и удаление старого противогаза с секцией "helm_respirator" ? И если я опять правильно понял, то надо состояние противогаза "helm_respirator" установить для противогаза "helm_respirator_wo_filter" ? Поделиться этим сообщением Ссылка на сообщение
AndreySol 215 Опубликовано 2 Ноября 2013 Akella-96 aka SvD Ну тогда как-то так (с использованием модуля от Artos для работы с нет-пакетами): объявляем глобально helmet_spawn = level.client_spawn_manager() function helmet_spawn_callback(cond, id, obj) obj:set_condition(cond) -- устанавливаем "condition" клиентскому объекту -- end далее, в del_antigas local antigas = ActorHasItem("helm_respirator") if antigas then local set_cond = antigas:condition() local sobj = SpawnItemInInv("helm_respirator_wo_filter") if sobj then local pk = m_netpk.get(sobj) -- запрос нет-пакета if pk and pk:isOk() then local data = pk:get() -- читаем данные из нет-пакета if data and data.upd then ---- уст. "condition" серверному объекту ---- data.condition = set_cond data.upd.condition = set_cond pk:set(data) end end ----- уст. кэллбэк на выход клиентского объекта в он-лайн ----- helmet_spawn:add(sobj.id, -1, helmet_spawn_callback, set_cond) end local se_obj = alife():object(antigas:id()) alife():release(se_obj,true) awrp_cop.send_tip("Срок действия фильтра закончился.",nil,nil,5,"actor") if awrp_cop.has_g_timer("del_antigas") then awrp_cop.stop_g_timer("del_antigas") end end Поделиться этим сообщением Ссылка на сообщение
AndreySol 215 Опубликовано 2 Ноября 2013 Artos Дублирование возникло не спроста - как-то разбираясь с вопросом "заспавнить в инвентарь предмет с установкой ему требуемого состояния(condition)", обнаружил что для некоторых "инвентарных" предметов получается такая картина: если после создания предмета установить condition серверному объекту через нет-пакет, то при выходе клиентского объекта в он-лайн его condition = 100%, т.е. видимо нет синхронизации с серверным. А при сохранении и последующей загрузке уже устанавливается тот condition, что задали ранее нет-пакетом для серверного объекта. Потому и использую дублирование, т.к. оно обеспечивает "полную" установку condition и сохранение его после сохранения\загрузки. P.S. Всех объектов, с которыми эксперементировал, не упомню, но точно помню что для артефактов была именно такая картина. Все это на чистом ТЧ 1.0005. Поделиться этим сообщением Ссылка на сообщение
AndreySol 215 Опубликовано 2 Ноября 2013 Artos Тестовая ф-ция: function spawn_and_set_cond() local ser_obj = alife():create("af_dummy_pellicle", npc:position(), npc:level_vertex_id(), npc:game_vertex_id(), npc:id()) if ser_obj then local pk = m_netpk.get(ser_obj) -- запрос нет-пакета if pk and pk:isOk()then local data = pk:get() -- читаем данные из нет-пакета if data and data.upd then data.condition = 0.5 data.upd.condition = 0.5 pk:set(data) end end end end Инвентарь ГГ пуст, вызываю эту ф-цию. Открываю инвентарь - вижу там появившийся артефакт, кликаю по нему - полоска состояния полная, т.е. condition 100%. Закрываю инвентарь, сохраняюсь и сразу загружаю сохранение, открываю инвентарь, кликаю по артефакту - теперь полоска состояния ровно на половину. Все это, как я и указывал ранее, для чистой ТЧ 1.0005. В чем Вы видите оправдывание чепухи ? Повторите у себя - неужели у Вас артефакт будет с 50% condition ? Akella-96 aka SvD работает судя по всему с СоР, может там иначе... Поделиться этим сообщением Ссылка на сообщение
AndreySol 215 Опубликовано 7 Мая 2014 Graff46 Сохряняй это значение в pstor актера, и загружай оттуда-же, а pstor автоматически сохраняется в сэйв игры при переходах и сохр\загр. Алгоритм следующий - в биндере актора в методе actor_binder:save(packet) записываешь свои данные в pstor, а в actor_binder:net_spawn(data) загружаешь. И будет тебе счастье. 1 Поделиться этим сообщением Ссылка на сообщение
AndreySol 215 Опубликовано 31 Мая 2014 (изменено) Что-то мне подсказывает, что в инвентаре ГГ могут быть всякие патроны в пачках... А для их спавна ф-ция create не годится, а должно быть вроде create_ammo. Это так, на вскидку... Да и использование object_count на мой взгляд не оправдано - правильнее наверное iterate_inventory, меньше движений: в первом случае получаем число объектов, затем дергаем алайф, чтоб получить сам объект и от него уже секцию, а во втором - сразу получаем объект и секцию от него.... Изменено 31 Мая 2014 пользователем AndreySol Поделиться этим сообщением Ссылка на сообщение
AndreySol 215 Опубликовано 4 Июня 2014 Такая вот ситуация - есть инвентарный ящик. Создаю объект скриптом, допустим броник, указывая ему в parent_id этот самый ящик. Подхожу к ящику, открываю - вижу этот броник. Все нормально, броник из ящика можно взять, надеть на актора(ГГ). Но, если после создания броника не трогая его из ящика сделать сэйв\лоад - броник из ящика пропадает. Если этому бронику, после создания, с помощью нет-пакета выставить flCanSave в object_flags это исправит проблему с сэйв\лоад ? Если да, то подскажите как правильно выставить этот бит ? Ф-ции я вроде нашел, вот тока не пойму какая из них нужна ? function bit_and(number, number)function bit_not(number)function bit_or(number, number)function bit_xor(number, number) Поделиться этим сообщением Ссылка на сообщение
AndreySol 215 Опубликовано 18 Июня 2014 просто этот ящик с броником при спавне нужно засунуть в оффлайн, а потом достать оттуда назад в онлайн я об этом в курсе, вопрос в другом - почему объект пропадает ? Я сомневаюсь, что движок при сэйв\лоад проверяет инвентарные ящики и удаляет из них какие-то объекты, которые ему "негожи". Значит проблема с самим объектом ? Что-то в его свойствах мешает\не позволяет движку его нормально сохранить. Вот и хочется понять - что ? А понять проблему в большинстве случаев означает и решить ее. Поделиться этим сообщением Ссылка на сообщение
AndreySol 215 Опубликовано 19 Июня 2014 (изменено) Тогда игра корректно запоминает кому принадлежит вещь Т.е. Ваша версия - что неверно записывается\сохраняется для инвентарного предмета его владелец ? Вопрос по m_netpk.script от Artos такой код: local pk = m_netpk.get(obj_add) -- запрос нет-пакета if pk:isOk() then pk:setCallback(function(data) end) end вылетаю с ошибкой: attempt to call method 'setCallback' (a nil value) В m_netpk.script, есть: function net_dummy:setCallback() return false end --/> ................ Почему вылет ? Изменено 19 Июня 2014 пользователем AndreySol Поделиться этим сообщением Ссылка на сообщение
AndreySol 215 Опубликовано 19 Июня 2014 (изменено) Потому что у тебя не net_dummy? Посмотрел внимательнее m_netpk.script setCallback() есть еще как метод класса net_cse_abstract, который в свою очередь унаследован от net_base. Вот выдержка из m_netpk.txt function test_abstract() --/ Переносим вентилятор из каморки Сидоровича на тумбочку в подвальчике деревни новичков (на Кордоне) local sobj = alife():object("trader_ventilyator_0000") --/ находим в игре серверный объект вентилятора if sobj then --/ нашли? local pk = get_netpk(sobj,0) --/ или m_netpk.net_cse_abstract(sobj) if pk:isOk() then local vPos = vector():set(-212.8,-22.28,-127.20) --/ координаты 'на тумбочке в подвальчике' local vDir = vector():set(0,3.14,0) --/ направление: 'лопастями от стены' --/ var-1: установка колбэка с таблицей local status = pk:setCallback( { position = vPos, direction = vDir } ) --[[ --/ var-2: установка колбэка с функцией local status = pk:setCallback( function(data) data.position = vPos --/ change property 'position' in 'cse_abstract' data.direction = vDir --/ change property 'direction' in 'cse_abstract' end ) --]] end end end Делаю по образцу, но видно пример не совсем корректен ? Как-же тогда использовать этот setCallback ? Изменено 19 Июня 2014 пользователем AndreySol Поделиться этим сообщением Ссылка на сообщение
AndreySol 215 Опубликовано 19 Июня 2014 Модуль, который есть у меня датирован 08.03.2012. Староват, явно. А более свежий не получается найти - ссылки попадаются всё просроченные. Поделиться этим сообщением Ссылка на сообщение
AndreySol 215 Опубликовано 19 Июня 2014 Чтобы setcallback нормально работал, у тебя в нужном классе se_*.script должен быть прописан его вызов Дописал в методе STATE_Write для class "se_outfit" if self.cb_netpk then -- коллбэк для изменения свойств пакета self.cb_netpk(self, packet) end но этого похоже мало - self.cb_netpk видимо нужно объявить где-то в районе se_outfit:__init() и инициализировать ? Как это сделать правильно ? Поделиться этим сообщением Ссылка на сообщение
AndreySol 215 Опубликовано 19 Июня 2014 (изменено) А тебе кстати нужна именно cse_abstract часть? А то если нет, то все это и не нужно Похоже, что действительно не нужно. насчет проблемы с пропаданием предметов, заспавненых скриптом в инв.ящик. Проверил, после create, у серверного объекта parent_id=65535, а по идее должно-быть равно ID ящика-владельца ? Соответственно движок наверное и не хочет сохранять\загружать инвентарный предмет, для которого не указан владелец. Вот и хотел попробовать через нет-пакет изменить parent_id на нужный. Сваял такой вот код: local ser_obj = alife():story_object(2000) --"esc_simulation_box_1" if ser_obj then local obj = level.object_by_id(ser_obj.id) if obj then local obj_add = alife():create("novice_outfit", obj:position(), obj:level_vertex_id(), obj:game_vertex_id(), obj:id()) if obj_add then local pk = m_netpk.net_cse_abstract(obj_add) if pk then pk:setCallback({parent_id = ser_obj.id}) end end end end проверил - нифига не помогло. Наверное сама идея не верна. Изменено 19 Июня 2014 пользователем AndreySol Поделиться этим сообщением Ссылка на сообщение
AndreySol 215 Опубликовано 30 Июня 2014 (изменено) особенности в поведении объектов при спавне их в инвентарь актора Я то-же с этим дрюкался, и выход похоже только один: спавнить куда-нить не в инвентарь, устанавливать через нет-пакет нужные параметры, вешать на выход объекта в он-лайн кэллбэк, и по факту появления объекта в он-лайне - трансферить в инвентарь ГГ. Выявил такой факт - если спавним в инв.ГГ, через нет-пакет меняем что-то, то в инвентаре видим предмет без этих изменений, но стоит сделать сэйв\лоад - и предмет уже с измененными параметрами. И вообще где можно почитать информацию о классах, их регистрации в class_registator.script? Как обычно - в Справочнике по функциям и классам..... Изменено 30 Июня 2014 пользователем AndreySol Поделиться этим сообщением Ссылка на сообщение
AndreySol 215 Опубликовано 30 Июня 2014 при спавне в инвентарь патронов например, переписать им кастом-дату удается Если не секрет - что именно ? Поделиться этим сообщением Ссылка на сообщение
AndreySol 215 Опубликовано 9 Июля 2014 @Музафир Скриптом. Ф-ция iterate_invertory и иже с ней... 1 Поделиться этим сообщением Ссылка на сообщение
AndreySol 215 Опубликовано 12 Июля 2014 (изменено) Как сделать срабатывание функции через некоторое время после вызова Никак, если вызвал ф-цию - она отработает все свое содержимое и завершится. Судя по Например,чтоб сообщение приходило через 15сек. тебе видимо требуется это ? void give_game_news( -- выдать на экран сообщениеstring, -- само сообщение. Может содержать некоторые форматирующие элементы string, --текстура, из которой берется аватара "отправителя" Frect, --координаты и размеры вырезаемого из текстуры изображения int, --начало показа сообщения с текущего момента (в миллисекундах) -- поставь 15000 и сообщение прийдет через 15 секунд после вызова ф-ции в которой это сообщение будет послано. int --длительность показа сообщения (в миллисекундах) ) Если-же требуется из одной ф-ции вызвать другую, но с какой-то временной задержкой - тогда юзай таймеры... Изменено 12 Июля 2014 пользователем AndreySol Поделиться этим сообщением Ссылка на сообщение
AndreySol 215 Опубликовано 13 Июля 2014 Ну тут уж из самого названия, даже не глядя в содержимое ф-ции - старт\запуск таймера.... Поделиться этим сообщением Ссылка на сообщение
AndreySol 215 Опубликовано 13 Июля 2014 (изменено) Лучше спросить у автора(ов) скрипта. К какому оригиналу: ТЧ, ЧН, ЗП. Откуда скрипт взят ? Что он вообще делает -какие-то бомбы\мины\детонаторы... Судя по использованию таймеров - сначала надоадаптировать эти самые таймеры на не указаный оригинал. Надо знать - а есть-лисвязанные с этим скриптом другие скрипты, их тоже адаптировать. Конфиги незабыть... Изменено 13 Июля 2014 пользователем AndreySol Поделиться этим сообщением Ссылка на сообщение
AndreySol 215 Опубликовано 21 Июля 2014 при взятии предмета из рюкзака А конкретнее - что означает "взятие" ? Я проверяю есть ли арт вообще и нету ли арта в 11 слоте А что за 11 слот ? Поделиться этим сообщением Ссылка на сообщение