AndreySol 215 Опубликовано 30 Июня 2012 Поделиться Опубликовано 30 Июня 2012 abramcumner Вообще-то способ с прописыванием сида в on_before_register давно и успешно у меня работает Если не секрет, как Вы прописываете story_id. Используете self.m_story_id ? Ссылка на комментарий
abramcumner 1 146 Опубликовано 30 Июня 2012 Поделиться Опубликовано 30 Июня 2012 Если не секрет, как Вы прописываете story_id. Используете self.m_story_id ? m_story_id - свойство только для чтения. Прописываю также через нет-пакеты. Только делаю это в se_stalker:on_before_register Ссылка на комментарий
Zander_driver 10 333 Опубликовано 30 Июня 2012 Поделиться Опубликовано 30 Июня 2012 (изменено) Столкнулся тут с непонятной проблемой. Имеем - 4 свои таблицы, в которых хранятся id онлайн-объектов четырех типов. неписи, монстры, аномалии, артефакты. биндеры аномалий и артефактов у меня сделаны. local dt_stalkers = {} local dt_monsters = {} local dt_anomalys = {} local dt_artefacts = {} function add_stalker_data(id) table.insert(dt_stalkers, id) end function del_stalker_data(id) local a = 1 local b = nil while dt_stalkers[a] ~= nil do if dt_stalkers[a] == id then b = a end a = a + 1 end if b then table.remove(dt_stalkers, b) else log("hdetect.sript:message:Error_deletestalker"..tostring(id)) end end function add_monster_data(id) table.insert(dt_monsters, id) end function del_monster_data(id) local a = 1 local b = nil while dt_monsters[a] ~= nil do if dt_monsters[a] == id then b = a end a = a + 1 end if b then table.remove(dt_monsters, b) else log("hdetect.sript:message:Error_deletemonster"..tostring(id)) end end function add_anomaly_data(id) table.insert(dt_anomalys, id) end function del_anomaly_data(id) local a = 1 local b = nil while dt_anomalys[a] ~= nil do if dt_anomalys[a] == id then b = a end a = a + 1 end if b then table.remove(dt_anomalys, b) else log("hdetect.sript:message:Error_deleteAnomaly"..tostring(id)) end end function add_artefact_data(id) table.insert(dt_artefacts, id) end function del_artefact_data(id) local a = 1 local b = nil while dt_artefacts[a] ~= nil do if dt_artefacts[a] == id then b = a end a = a + 1 end if b then table.remove(dt_artefacts, b) else log("hdetect.sript:message:Error_deleteartefact"..tostring(id)) end end функции add_XXX_data вызываются из net_spawn соответствующих объектов, функции del_XXX_data из net_destroy Ну так вот, как вы заметили, каждая функция удаления выдает сообщение в лог, если ей на удаление приходит объект, которого в таблице и не было. И при завершении игры/уходе гг с уровня на другой, в лог пачками валятся сообщения Error_deletestalker, т.е. запросы на удаление из таблицы неписей, которые в таблице не числятся. Такая ситуация только с неписями, а вот с аномалиями, артами и монстрами ни разу таких странностей не было. Получается, в онлайне могут присутствовать нпс, для которых не вызывался net_spawn, откуда же они тогда берутся и как их отловить? Перебором всех 65к объектов для их отлова заниматься не хочется... игра ТЧ 1,0004, амк-скриптов в составе мода практически нет, для вывода в лог используется модуль от RvP Изменено 30 Июня 2012 пользователем Zander_driver Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine. Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист. AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Ссылка на комментарий
kratos888 0 Опубликовано 30 Июня 2012 Поделиться Опубликовано 30 Июня 2012 panzyuza зачем мне ставить отметку на непися через другие функции, когда она ставится во время задания? Ссылка на комментарий
AndreySol 215 Опубликовано 30 Июня 2012 Поделиться Опубликовано 30 Июня 2012 (изменено) abramcumner Прописываю также через нет-пакеты. Только делаю это в se_stalker:on_before_register Каким образом ? Я пробовал нижеприведенный код - в on_register() он нормально работает (только надо офф\он-лайн или save\load), а в on_before_register нет, не проходит проверка "if ser_obj then". function se_stalker:on_before_register() local ser_obj = alife():object(self.id) if ser_obj then local pk = m_netpk.get(ser_obj) -- запрос нет-пакета if pk and pk:isOk() then local data = pk:get() -- читаем данные из нет-пакета if data then if data.story_id ~= 93 then data.story_id = 93 pk:set(data) end end end end self:fill_exclusives() end Получается в on_before_register серверный объект еще не зарегистрирован, а он нужен для получения нет-пакета. Модуль m_netpk - авторства Artos'а. Подскажите, что не так ? kratos888 зачем мне ставить отметку на непися через другие функции, когда она ставится во время задания? Не зачем. Правильнее будет присвоить НПСу story_id, вот только как это сделать по-умнее я и сам пытаюсь узнать. Изменено 30 Июня 2012 пользователем AndreySol Ссылка на комментарий
abramcumner 1 146 Опубликовано 1 Июля 2012 Поделиться Опубликовано 1 Июля 2012 (изменено) AndreySol, function se_stalker:on_before_register() local ser_obj = alife():object(self.id) se_stalker -это же и есть тот серверный объект, который ты получаешь смело используй self вместо ser_obj. Ну и как правильно заметил, в on_before_register объект еще не зарегистрирован. Кстати такой код всем подряд будет писать сид 93. Лучше уж перед alife():create установи глобальный флажок в 93, в on_before_register проверь флажок на нил,установи сид и флажок в nil. Изменено 1 Июля 2012 пользователем abramcumner Ссылка на комментарий
AndreySol 215 Опубликовано 1 Июля 2012 Поделиться Опубликовано 1 Июля 2012 abramcumner Насчет self я чет и не подумал, а ведь так оно и есть. Кстати такой код всем подряд будет писать сид 93 Это было просто для примера. Ссылка на комментарий
Кактус_523 1 Опубликовано 2 Июля 2012 Поделиться Опубликовано 2 Июля 2012 (изменено) Здравствуйте комрады. У меня дурной вопрос. Кто-нить пробовал спавнить фантомов на апдейте гуи? Вот на этом: C++ class CUIScriptWnd : CUIDialogWnd,DLL_Pure { CUIScriptWnd (); function Update(); Все прекрасно работает без спавна. Как только пытаюсь заспавнить фантома получаю вылет без лога. Добавлено через 116 мин.: Перечитал шапку и испугался Решил что недурно будет добавить кусок кода. local time1 = 0 local time2 = 1 function ra_phantoms:Update() CUIScriptWnd.Update(self) time2 = time_global() if time2>time1 then level.spawn_phantom(vector():set( 0,0,0)) time1 = time2+2000 end Изменено 2 Июля 2012 пользователем Кактус_523 МЯСО! Ссылка на комментарий
Shredder 49 Опубликовано 2 Июля 2012 Поделиться Опубликовано 2 Июля 2012 Версия игры какая? Помнится, в ЗП без некоторых ковыряний спавн фантома вызывает вылет. Ссылка на комментарий
Кактус_523 1 Опубликовано 2 Июля 2012 Поделиться Опубликовано 2 Июля 2012 Сетевая ЧН. Фантомы вне апдейта спавнятся на ура. МЯСО! Ссылка на комментарий
Kondr48 314 Опубликовано 9 Июля 2012 Поделиться Опубликовано 9 Июля 2012 Помогите мне, пожалуйста, столкнулся со следующей проблемой, когда я создаю скриптовые окна, и кнопки на них, для замеров координат в текстурах пользуюсь программой paint.net.Записываю левый верхний угол, потом размер текстуры, но происходит следующая непонятная вещь:либо кнопка или текстура находится не в том месте, либо она обрезана.А при указании текстуры в конфиге <ui_texture> <file_name>ui\notebook\password</file_name> <texture id="ui_button_okej_e" x="63" y="109" width="73" height="20" /> <texture id="ui_button_okej_t" x="63" y="109" width="73" height="20" /> <texture id="ui_button_okej_d" x="63" y="109" width="73" height="20" /> <texture id="ui_button_okej_h" x="63" y="109" width="73" height="20" /> <texture id="ui_button_chn_e" x="152" y="109" width="74" height="21" /> <texture id="ui_button_chn_t" x="152" y="109" width="74" height="21" /> <texture id="ui_button_chn_d" x="152" y="109" width="74" height="21" /> <texture id="ui_button_chn_h" x="152" y="109" width="74" height="21" /> <texture id="ui_button_cls_e" x="235" y="0" width="50" height="21" /> <texture id="ui_button_cls_t" x="235" y="0" width="50" height="21" /> <texture id="ui_button_cls_d" x="235" y="0" width="50" height="21" /> <texture id="ui_button_cls_h" x="235" y="0" width="50" height="21" /> </ui_texture> Отображается на кнопке, правильного размера, лишь растянутый кусочек самой текстуры, координаты все снимаю правильно, никто с подобным не стакивался?Как лечит? self.btn_cancel = CUI3tButton() self.btn_cancel:Init(537,350,74,21) self.btn_cancel:SetText("Cancel") self.btn_cancel:SetTextColor(255,216,186,140) self.btn_cancel:SetTextAlign(CGameFont.alCenter) self.btn_cancel:InitTexture("ui_button_chn") self:Register(self.btn_cancel,"btn_cancel") self.back:AttachChild(self.btn_cancel) self:AddCallback("btn_cancel",ui_events.BUTTON_DOWN,self.ClickBtnCancel,self) Ссылка на комментарий
Кактус_523 1 Опубликовано 9 Июля 2012 Поделиться Опубликовано 9 Июля 2012 (изменено) Хм. Я вот так кнопки делаю: LUA: local xml = CScriptXmlInit() xml:ParseFile("ui_radmin.xml") btn_viewscreen_cont = xml:InitButton("btn_viewscreen", self) self:Register(btn_viewscreen_cont,"btn_viewscreen") self:AddCallback("btn_viewscreen", ui_events.BUTTON_CLICKED, self.show_screenviewer, self) XML: <btn_EditItm x="695" y="585" width="150" height="29"> <texture>ui_ra_button_150</texture> <text font="letterica18" a="255" r="215" g="187" b="139">ui_ra_changemap</text> </btn_EditItm> У меня немного другая кнопка. Смени на свою если нужно. P.S.: Код для ЧН, но скорей всего пойдет и для всего остального. Изменено 9 Июля 2012 пользователем Кактус_523 МЯСО! Ссылка на комментарий
ins33 16 Опубликовано 14 Июля 2012 Поделиться Опубликовано 14 Июля 2012 Для ТЧ, делаю девайс, он уже работает, но хотелось бы добавить ключ, который позволит им пользоваться. (вызывать диалоговое окно). Подскажите ПЛЗ как, или хот намекните. СПС. Ссылка на комментарий
AndreySol 215 Опубликовано 15 Июля 2012 Поделиться Опубликовано 15 Июля 2012 ins33 но хотелось бы добавить ключ, который позволит им пользоваться Что имеется в виду ? Если доступ к девайсу по вводу пароля, тогда к примеру глянь в сторону реализации кодового замка - кажись, то что тебе требуется. Если вариант с ключем, как с предметом - тогда и диалог не нужен, отслеживай появление ключа в инвентаре и выдавай по факту инфо-порцию. Ссылка на комментарий
ins33 16 Опубликовано 16 Июля 2012 Поделиться Опубликовано 16 Июля 2012 AndreySol, Да вариант с ключем, как с предметом. local key = db.actor:object("key") --проверка на ключ if note and type(note) == "number" then if not level.object_by_id(note) then level.start_stop_menu(interfase.ui_repair(), true) --запускаем меню Ключа нет, а диалоговое окно открывается. Ссылка на комментарий
Shredder 49 Опубликовано 16 Июля 2012 Поделиться Опубликовано 16 Июля 2012 ins33, в твоём коде нет ни капли логики. Сперва ты присвоил переменной key объект с секцией "key", который находится у гг в инвентаре, если его нет, то присвоится nil. Потом проверяешь какую-то переменную note, которая возможно и описана у тебя выше по коду, но тут не понятно что в ней есть. В любом случае, у тебя сейчас никак не проверяется наличие ключа. Я думаю, что нужно сделать как-то так local key = db.actor:object("key") if key then --проверка на ключ level.start_stop_menu(interfase.ui_repair(), true) --запускаем меню end Ссылка на комментарий
ins33 16 Опубликовано 16 Июля 2012 Поделиться Опубликовано 16 Июля 2012 Shredder, Прописал так: if note and type(note) == "number" then if not level.object_by_id(note) then local key = db.actor:object("key") if key then --проверка на ключ level.start_stop_menu(interfase.ui_repair(), true) --запускаем меню alife():create("repair_kit", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id()) Вылет по бинду. Ссылка на комментарий
Shredder 49 Опубликовано 16 Июля 2012 Поделиться Опубликовано 16 Июля 2012 (изменено) Ты покажи всю функцию, мне всё равно не понятно что такое note и что в ней содержится. P.S. И вообще ты в курсе что каждый блок if ... then должен иметь закрывающий end? Изменено 16 Июля 2012 пользователем Shredder Ссылка на комментарий
ins33 16 Опубликовано 16 Июля 2012 Поделиться Опубликовано 16 Июля 2012 (изменено) Shredder, local note = nil function use_repkit() if note and type(note) == "number" then if not level.object_by_id(note) then local key = db.actor:object("key") if key then --проверка на ключ level.start_stop_menu(interfase.ui_repair(), true) --запускаем меню alife():create("repair_kit", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id()) end note = nil end if note and type(note) == "userdata" then note = note:id() else note = nil end end Изменено 16 Июля 2012 пользователем ins33 Ссылка на комментарий
Shredder 49 Опубликовано 16 Июля 2012 Поделиться Опубликовано 16 Июля 2012 (изменено) ins33, ты вообще сам понимаешь, что ты пишешь? Сразу видно, что ты вообще ничего не смыслишь в программировании, так закаким ты туда полез? function use_repkit() local key = db.actor:object("key") if key then --проверка на ключ level.start_stop_menu(interfase.ui_repair(), true) --запускаем меню alife():create("repair_kit", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id()) end end Изменено 16 Июля 2012 пользователем Shredder Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти