naxac 2 373 Опубликовано 12 Ноября 2015 Поделиться Опубликовано 12 Ноября 2015 @alex4321, local new_game = packet:r_u8() != 1Это же не C++, а Луа). Должно быть "~=". Аддон для ОП-2.09.2: Яндекс/Google/GitHub Ссылка на комментарий
Wlad777 24 Опубликовано 12 Ноября 2015 Поделиться Опубликовано 12 Ноября 2015 Камрады, подскажите, значение голода можно скриптово прочитать/установить? --------------------------------- www.amk-zone.de Ссылка на комментарий
naxac 2 373 Опубликовано 12 Ноября 2015 Поделиться Опубликовано 12 Ноября 2015 @Wlad777, без движковых правок - нет. Аддон для ОП-2.09.2: Яндекс/Google/GitHub Ссылка на комментарий
Kirgudu 957 Опубликовано 12 Ноября 2015 Поделиться Опубликовано 12 Ноября 2015 Но (см. комментарий) сообщения нет. з.ы. и да, проблема не в выводе сообщения - даже явное return 1/0 не приводит к вылету :-) (т.ею. до a4_message не доходит, при этом - даже если она вызывается из a4_on_update) И не будет никакого сообщения при таком коде. local packet = net_packet() local new_game = packet:r_u8() != 1 Во-первых, как справедливо заметил @naxac, неравенство должно обозначаться «~=». А во-вторых, чтобы пользоваться net-пакетами, надо для начала хотя бы изучить что они такое и с чем их едят. Начать можно с азов в теме «Справочник по функциям и классам», да и в целом на форуме информации предостаточно. Даже тут, на предыдущей странице, было обсуждение, которое могло бы навести на некоторые мысли. В частности, вызов конструктора local packet = net_packet() возвращает новый, чистый (!) net-пакет. Всегда. И пытаться получить из него признак запуска игры - бессмысленно. Вообще, использовать net-пакеты для сохранения признака того, что игра уже запускалась - это палить из пушки по воробьям. Один вопрос: зачем? Для этого лучше сохранить переменную в pstor; как это сделать - писалось много раз, в том числе на предыдущей странице. Инструмент Ссылка на комментарий
alex4321 1 Опубликовано 12 Ноября 2015 Поделиться Опубликовано 12 Ноября 2015 Спасибо, про сравнение даже не подумал как-то. Позор моим... (блин, седины нет :-) ) Вообще, использовать net-пакеты для сохранения признака того, что игра уже запускалась - это палить из пушки по воробьям. Один вопрос: зачем? Да так-то до них дело ещё не доходит - а в дальнейшем мне тут ещё будет что хранить. Хотя на данный момент да, идиотизм - целый пакет из-за 1байта (ну или. какое там выравнивание? :-) ) А за pstor - спасибо, сам при более ранних ковыряния видел только пакеты (ещё бы я помнил, где находил пример нужных мне действий :-) ) Ссылка на комментарий
Mododel15 2 Опубликовано 12 Ноября 2015 Поделиться Опубликовано 12 Ноября 2015 Можно и такЯ просто хотел реализовать худ предметов: схема такова - кушаем батон, спавнится сам худ на классе чего-нибудь, заводится таймер, и потом худ удаляется. Но вот со спавном этого худа проблемы... Ссылка на комментарий
Kirgudu 957 Опубликовано 12 Ноября 2015 Поделиться Опубликовано 12 Ноября 2015 а в дальнейшем мне тут ещё будет что хранитьВ зависимости от специфики и размера сохраняемых данных - пстор, обсуждавшиеся тут универсальные хранилища, нет-пакет конкретного объекта и т. д. Вариантов хватает. По целям надо и средства выбирать. Инструмент Ссылка на комментарий
alex4321 1 Опубликовано 12 Ноября 2015 Поделиться Опубликовано 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 Ссылка на комментарий
Wlad777 24 Опубликовано 12 Ноября 2015 Поделиться Опубликовано 12 Ноября 2015 (изменено) @Wlad777, без движковых правок - нет. Плохо. Опять костыли на костылях городить придётся. А вот следующий вопрос: есть zone_flame_small, рядом стоит актор. Дистанция до этого конкретного костра получена, нужно узнать горит он или нет. Можно ли это отследить? Изменено 12 Ноября 2015 пользователем Wlad777 --------------------------------- www.amk-zone.de Ссылка на комментарий
Kirgudu 957 Опубликовано 12 Ноября 2015 Поделиться Опубликовано 12 Ноября 2015 @alex4321, ещё раз: В частности, вызов конструктора local packet = net_packet() возвращает новый, чистый (!) net-пакет. Всегда. И пытаться получить из него признак запуска игры - бессмысленно. Поэтому local packet = net_packet() local new_game = packet:r_u8() вернёт что? Мне неизвестно - не пробовал получать значение из нового net-пакета. Инструмент Ссылка на комментарий
alex4321 1 Опубликовано 12 Ноября 2015 Поделиться Опубликовано 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 Ссылка на комментарий
Serge! 127 Опубликовано 12 Ноября 2015 Поделиться Опубликовано 12 Ноября 2015 вернёт что? попробовал. Вернула 0. Ссылка на комментарий
Kirgudu 957 Опубликовано 12 Ноября 2015 Поделиться Опубликовано 12 Ноября 2015 local actor = alife():actor() local cactor = level.object_by_id(sactor.id) Точно sactor.id? Строчкой раньше определяется переменная actor. Это первое.А второе - зачем такие мучения? Не проще ли сделать так? db.actor:give_game_news("Свободу тушканам!\\nТушканчики всех стран, объединяйтесь!","ui\\ui_npc_monster",Frect():set(0,215,163,105),1000,50000) @Serge!, это при условии, что там всегда 0. А также что позиция чтения установлена с начала пакета (см. выше). Инструмент Ссылка на комментарий
Serge! 127 Опубликовано 12 Ноября 2015 Поделиться Опубликовано 12 Ноября 2015 это при условии, что там всегда 0 этот ноль меня удивил, т.к. я ждал, что там какой-нибудь мусор. Никакие позиции не усанавлива, просто тупо скопировал строки из Вашего сообщения. Вот так: local packet = net_packet() news_manager.send_tip(db.actor," s -->"..tostring(packet:r_u8())) Добавлено Kirgudu, 12 Ноября 2015 Говоря про позицию чтения, я имел в виду ЗП/ЧН, где для вновь созданного пакета она может не равняться нулю, о чём и писалось несколькими сообщениями назад. Ссылка на комментарий
alex4321 1 Опубликовано 12 Ноября 2015 Поделиться Опубликовано 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 Ссылка на комментарий
Kirgudu 957 Опубликовано 12 Ноября 2015 Поделиться Опубликовано 12 Ноября 2015 Потому что в news_manager.send_tip() используется альтернативный метод вывода сообщения: db.actor:give_game_news("Свободу тушканам!", "Тушканчики всех стран, объединяйтесь!", "ui\\ui_npc_monster", 0, 50000) В этом варианте не указываются координаты и размеры вырезаемого из текстуры изображения. Возможно, в этом и причина неработоспособности первого варианта, если вырезаемый прямоугольник не совпадает с текстурой. Инструмент Ссылка на комментарий
alex4321 1 Опубликовано 12 Ноября 2015 Поделиться Опубликовано 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 Ссылка на комментарий
Карлан 1 049 Опубликовано 12 Ноября 2015 Поделиться Опубликовано 12 Ноября 2015 @alex4321, триггер добавляй прямо в коллбек, нечего всякие нагромождения городить, в оригинале там инфопоршень ставится на единоразовое отрабатывание, можешь поступить так же и туда еще один ивент добавить, но у меня нету, вот посмотри мой код: function actor_binder:update(delta) object_binder.update(self, delta) local time = time_global() if self.is_start then self.is_start = false if not has_alife_info("storyline_actor_start") and level.name() == "l01_escape" then give_info("storyline_actor_start") _G.g_start_avi = true end if not has_alife_info("global_dialogs") then give_info("global_dialogs") end --// Karlan to alex4321: сюда можешь вставлять ивент functions_task.add_lchanger_location() --// on delete [x] // Karlan to ALL: система переходов сейчас совсем другая event("update_1st"):trigger({time=time,delta=delta,binder=self}) end -- m_ammo.update_ammo() --// on delete [x] self.weather_manager:update() --// апдейт погоды --// on delete [x] -- self.actor_detector:update() --// апдейт схемы детектора --// on delete [x] xr_sound.update_actor() --// апдейт звуковой схемы актера --// on delete [x] --// обновление отключения ввода с клавиатуры if self.st.disable_input_time and game.get_game_time():diffSec(self.st.disable_input_time) >= self.st.disable_input_idle then self.st.disable_input_time = nil level.enable_input() end --// обновление через интервалы времени if self.tmr_upd < time then self.tmr_upd = time + 200 --// ~5 раз в сек --// обновление рестрикторов, которые под логикой, срабатывает через интервалы времени -- bind_restrictor.actor_update(delta) --// on delete [x] manager_task.actor_update() --// on delete [x] --// апдейт прятание оружия игрока во время диалога // Karlan to Karlan: утащить в инфо, или добавить в движок еще один и сделать через два if weapon_hide == true or actor:is_talking() then if self.weapon_hide == false then actor:hide_weapon() self.weapon_hide = true end else if self.weapon_hide == true then actor:restore_weapon() self.weapon_hide = false end end --// обновление сна с переносом чувака в указанную позицию // Karlan to ALL: это НИГДЕ не используется (todo: все удалить) --// on delete [x] --// Karlan to ALL: мое предположение: нокаутирующий удар с усыплением и переносом актора (грабеж/разбой/похищение?) (todo: посмотреть билды) if self.st.sleep_relocate_time and game.get_game_time():diffSec(self.st.sleep_relocate_time) >= self.st.sleep_relocate_idle then actor:set_actor_position(self.st.sleep_relocate_point) local dir = self.st.sleep_relocate_point:sub(self.st.sleep_relocate_look) actor:set_actor_direction(dir:getH()) self.st.sleep_relocate_time = nil end self.tmr_cnt = self.tmr_cnt +1 if self.tmr_cnt >= 5 then --// ~1 раз в сек self.tmr_cnt = 0 --// вывод сообщения о большой радиации if actor.radiation >= 0.7 then if not self.hud_rad then self.hud_rad = get_hud() if not self.hud_rad:GetCustomStatic("cs_radiation_danger") then self.hud_rad:AddCustomStatic("cs_radiation_danger", true) self.hud_rad:GetCustomStatic("cs_radiation_danger"):wnd():SetTextST("st_radiation_danger") end end elseif self.hud_rad then self.hud_rad:RemoveCustomStatic("cs_radiation_danger") self.hud_rad = nil end end end --// обновление пси-антенны if sr_psy_antenna.psy_antenna then sr_psy_antenna.psy_antenna:update(delta) end --// on delete [x] event("actor_update"):trigger({time=time,delta=delta,binder=self}) end 1 Ссылка на комментарий
hi_flyer 75 Опубликовано 12 Ноября 2015 Поделиться Опубликовано 12 Ноября 2015 Подскажите, каким образом можно скриптово убить всё население определённого гулага. И есть ли вообще такая возможность? Ссылка на комментарий
Карлан 1 049 Опубликовано 12 Ноября 2015 Поделиться Опубликовано 12 Ноября 2015 (изменено) @hi_flyer, в онлайне или оффлайне? на тебе пример для онлайна: function kill_npc_in_gulag(gulag_name) local gulag = xr_gulag.get_gulag_by_name(gulag_name) if gulag then for k,v in pairs(gulag.Object) do if type(v)=="userdata" then local o = level.object_by_id(k) --// можно сразу v:kill(v) if o then o:kill(o) end end end end end для оффлайна сам думаю сообразишь. Изменено 12 Ноября 2015 пользователем Карлан 1 Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти