alex4321 1 Опубликовано 11 Ноября 2015 Возник вопрос - как запустить определенный код (речь о Lua) после начала новой игры в CoP (т.е. оно должно отработать 1 раз). Найти чего-то подходящего именно к такому случаю - я не смог, запихнуть в actor_proxy:net_spawn - вариант, но в случае CoP - срабатывает оно ещё до полной загрузки, а в update - как-то не айс запихивать сюда одноразовое событие же. Поделиться этим сообщением Ссылка на сообщение
alex4321 1 Опубликовано 12 Ноября 2015 (изменено) @alex4321, другого не дано, только апдейт, заюзай системы событий, подпишешь - отпишешь.Спасибо, пытаюсь приюзать xs_sandbox. Вроде как устройство вполне прозрачное, но вызвать обработчик пока не получается.В _g.script инициализация добавлена. -- list of registered modules, can have dependence one from other (must be grouped in table) -- in every module must be an "init()" function for module's initialization -- for some events (like packet save or load) order is VERY important binds = { "a4_system", } function actor_binder:update(delta) object_binder.update(self, delta) if string.find(command_line(), "-designer") then return end --надо бы проверить, не отработал ли этот return if self.already_jumped==false and jump_level.need_jump==true and (device().frame > self.spawn_frame+2000) then jump_level.try_to_jump() self.already_jumped = true return end ... event("actor_update"):trigger({}) end Соответственно, если я всё делаю правильно - то будет вызван обработчик, повешенный к actor_update function a4_message() local actor = alife():actor() local cactor = level.object_by_id(sactor.id) cactor:give_game_news( "Свободу тушканам!\\nТушканчики всех стран, объединяйтесь!", -- строка сообщение, может быть многострочной "ui\\ui_npc_monster", --текстура, из которой берется аватара "отправителя" Frect():set(0,215,163,105), --координаты и размеры вырезаемого из текстуры изображения 1000, --начало показа сообщения с текущего момента (в миллисекундах) 50000 --длительность показа сообщения (в миллисекундах) ) end function a4_on_update() -- Вполне вероятные ошибки в работе с net_packet-м, но доэтой стадии не доходит, т.к. попытка вызвать a4_message() ни к чему не приводит local packet = net_packet() local new_game = packet:r_u8() != 1 if new_game then event("game_new"):trigger({}) packet:w_u8(1) end event("actor_update"):unregister(a4_on_update) end function a4_on_new_game() a4_message() end function init() event("game_new"):register(a4_on_new_game) event("actor_update"):register(a4_on_update) end Но (см. комментарий) сообщения нет. з.ы. и да, проблема не в выводе сообщения - даже явное return 1/0 не приводит к вылету :-) (т.ею. до a4_message не доходит, при этом - даже если она вызывается из a4_on_update) Изменено 12 Ноября 2015 пользователем Kirgudu Поделиться этим сообщением Ссылка на сообщение
alex4321 1 Опубликовано 12 Ноября 2015 Спасибо, про сравнение даже не подумал как-то. Позор моим... (блин, седины нет :-) ) Вообще, использовать net-пакеты для сохранения признака того, что игра уже запускалась - это палить из пушки по воробьям. Один вопрос: зачем? Да так-то до них дело ещё не доходит - а в дальнейшем мне тут ещё будет что хранить. Хотя на данный момент да, идиотизм - целый пакет из-за 1байта (ну или. какое там выравнивание? :-) ) А за pstor - спасибо, сам при более ранних ковыряния видел только пакеты (ещё бы я помнил, где находил пример нужных мне действий :-) ) Поделиться этим сообщением Ссылка на сообщение
alex4321 1 Опубликовано 12 Ноября 2015 @Kirgudu, да, похоже - действительно была проблема в синтаксисе. Теперь a4_on_update таки выполняется (return 1/0 приводит к падению). Впрочем, сообщение показать не удается function a4_message() local actor = alife():actor() local cactor = level.object_by_id(actor.id) cactor:give_game_news("Свободу тушканам!\\nТушканчики всех стран, объединяйтесь!", "ui\\ui_npc_monster", Frect():set(0,215,163,105), 1000, 50000) end Поделиться этим сообщением Ссылка на сообщение
alex4321 1 Опубликовано 12 Ноября 2015 Да пофиг, что оно вернет - я пока что сократил до function a4_on_update() a4_message() end net_packet-в я сейчас не юзаю. В таком варианте оно на каждый вызов actor_binder:update должно вызывать мой код, т.к. я не отписываюсь от события. Как минимум - 1 раз вызывает, раз крешится при замене a4_message() на return 1/0. Но вывода сообщения не проходит. Т.е. проблема с function a4_message() local actor = alife():actor() local cactor = level.object_by_id(sactor.id) cactor:give_game_news("Свободу тушканам!\\nТушканчики всех стран, объединяйтесь!","ui\\ui_npc_monster",Frect():set(0,215,163,105),1000,50000) end Поделиться этим сообщением Ссылка на сообщение
alex4321 1 Опубликовано 12 Ноября 2015 (изменено) db.actor:give_game_news("Свободу тушканам!\\nТушканчики всех стран, объединяйтесь!","ui\\ui_npc_monster",Frect():set(0,215,163,105),1000,50000) Кстати, верно - опечатку в коде поправил, а тут как висела, так и оставалась. Ну и за упрощенный вариант спасибо. Но сейчас у меня такой код : function a4_message() db.actor:give_game_news("Свободу тушканам!\\nТушканчики всех стран, объединяйтесь!","ui\\ui_npc_monster",Frect():set(0,215,163,105),1000,50000) end function a4_on_update() -- Вполне вероятные ошибки в работе с net_packet-м, но доэтой стадии не доходит, т.к. попытка вызвать a4_message() ни к чему не приводит a4_message() end function a4_on_new_game() a4_message() end function init() event("game_new"):register(a4_on_new_game) event("actor_update"):register(a4_on_update) end Однако, сообщения нет. Более того - если я помещаю db.actor:give_game_news... в bind_stalker:update - тоже нет. А по return 1/0 - падает, т.е. до выполнения этого кода дело доходит. upd. А вот вариант с news_manager.send_tip в моём случае подходит и работает. Т.к. мне это вообще только для отладки - то и хрен с ним, буду показывать инфу так. function a4_message() news_manager.send_tip(db.actor, "TEST", nil, nil, 30000) end Изменено 12 Ноября 2015 пользователем alex4321 Поделиться этим сообщением Ссылка на сообщение
alex4321 1 Опубликовано 12 Ноября 2015 Кстати, вероятно - но проверить пока не могу. А код такой вышел : function a4_message() news_manager.send_tip(db.actor, "TEST", nil, nil, 30000) end function a4_on_update() if xr_logic.pstor_retrieve(db.actor, "game_started", false) == false then event("game_new"):trigger({}) xr_logic.pstor_store(db.actor, "game_started", true) end event("actor_update"):removeThisCallback() end function a4_on_new_game() a4_message() end function init() event("game_new"):register(a4_on_new_game) event("actor_update"):register(a4_on_update) end Теперь я уже могу подписываться на событие game_new в своих скриптах. Отрабатывает как и должно по задумке - 1 раз при старте новой игры. 1 Поделиться этим сообщением Ссылка на сообщение