naxac 2 447 Опубликовано 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 447 Опубликовано 12 Ноября 2015 Поделиться Опубликовано 12 Ноября 2015 @Wlad777, без движковых правок - нет. Аддон для ОП-2.09.2: Яндекс/Google/GitHub Ссылка на комментарий
Kirgudu 1 217 Опубликовано 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 1 217 Опубликовано 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 1 217 Опубликовано 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 1 217 Опубликовано 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 1 217 Опубликовано 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 Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти