dukekan 5 Опубликовано 4 Июня 2013 (изменено) Получаю безлоговый вылет при загрузке новой игры. Пытался создать новую модель поведения. Модель - достаточно простая, состоит из одного условия и одного действия. Сам скрипт модели: local scheme_status={} local property_need_to_trade = 1821327 class "evaluator_need_to_trade" (property_evaluator) function evaluator_need_to_trade:__init(name, storage) super (nil, name) self.st = storage end function evaluator_need_to_trade:evaluate() amk.ls_send_tip(self.object:character_name().." evaluate()") if self.st==nil or self.st.enabled~=true then -- модель поведения запрещена return false end if not db.actor then -- ГГ ещё не заспаунился return false end if self.object:best_enemy() then return false -- Блокирование во время боя end local npc = self.object --нет ни одной аптечки, нет всего набора хавчика, при том, что деньги ещё остались if npc:money() < 100 then return false end -- денег нет - и суда нет local vertex = get_nearest_trader_vertex() if npc:level_vertex_id() == vertex then disable_scheme(npc,"npc_want_trade") end --дошёл до торговца if (npc:object("medkit")==nil and npc:object("medkit_army")== nil and npc:object("medkit_scientic")==nil) then return true end if npc:object("bread") == nil or npc:object("kolbasa") == nil or npc:object("conserva") == nil then return true end return false end class "action_go_to_trader" (action_base) function action_go_to_trader:__init(name, storage) super (nil, name) self.st=storage end function action_go_to_trader:initialize() action_base.initialize(self) local npc=self.object npc:set_desired_position() npc:set_desired_direction() npc:clear_animations() npc:set_detail_path_type(move.line) npc:set_body_state(move.standing) npc:set_movement_type(move.run) npc:set_path_type(game_object.level_path) npc:set_mental_state(anim.danger) npc:set_sight(look.danger, nil, 0) npc:remove_all_restrictions() self.offset=vector():set(math.random()*6-3,0,math.random()*6-3) self.offset:normalize() end function action_go_to_trader:execute() action_base.execute(self) amk.ls_send_tip(self.object:character_name().." execute()") if not actor then -- Хм, что-то не так. Может быть ГГ перешёл на другой уровень? Запрещаем схему поведения self.st.enabled=false end if self.delay and self.delay>time_global() then return end self.delay=time_global()+1000 local npc=self.object local actor=db.actor local vertex_id = get_nearest_trader_vertex() if vertex_id then npc:set_dest_level_vertex_id(vertex_id) end end function action_go_to_trader:finalize() action_base.finalize (self) end function add_to_binder(object, char_ini, scheme, section, st) local manager = object:motivation_action_manager() local property_wounded = xr_evaluators_id.sidor_wounded_base manager:remove_evaluator(property_need_to_trade) manager:add_evaluator(property_need_to_trade, evaluator_need_to_trade("npc_want_trade",st)) local action = this.action_go_to_trader("action_go_to_trader",st) action:add_precondition(world_property(stalker_ids.property_alive, true)) action:add_precondition(world_property(property_wounded, false)) if anomaly_evader then action:add_precondition (world_property(1099,false)) end action:add_precondition(world_property(property_need_to_trade, true)) action:add_effect (world_property(property_need_to_trade, false)) xr_motivator.addCommonPrecondition(action) manager:add_action (action_go_to_trader, action) -- Теперь подкорректируем стандартные операторы, чтобы помощник не отвлекался на всякую ерунду. action=manager:action(stalker_ids.action_alife_planner) action:add_precondition(world_property(property_need_to_trade, false)) action=manager:action(stalker_ids.action_combat_planner) action:add_precondition(world_property(property_need_to_trade, false)) action=manager:action(stalker_ids.action_danger_planner) action:add_precondition(world_property(property_need_to_trade, false)) end function set_need_trade(npc,ini) local st = xr_logic.assign_storage_and_bind(npc, ini, "npc_want_trade","npc_want_trade") st.enabled=true scheme_status[npc:id()]=true end function disable_scheme(npc,scheme) local st = db.storage[npc:id()][scheme] if st then st.enabled = false end scheme_status[npc:id()]=nil end function get_nearest_trader_vertex() return 64955--заглушка временная, для кордона end Зарегистрировал в modues.script if npc_trade then -- в этой строке мы проверяем что наш скрипт действительно существует load_scheme("npc_trade", "npc_want_trade", stype_stalker) end Запускаю модель автоматом в xr_logic.script, в функции enable_generic_schemes(ini, npc, stype, section) if npc_trade then npc_trade.set_need_trade(npc,ini) end Деактивирую так же автоматом в xr_logic.script, в функции disable_generic_schemes(npc, stype) if npc_trade then npc_trade.disable_scheme(npc,"npc_want_trade") end В xr_motivator.script в функции addCommonPrecondition(action) чтобы заблокировать стандартные схемы поведения: if npc_trade then action:add_precondition (world_property(npc_trade.property_need_to_trade,false)) end Ну и последнее, в функцию xr_motivator.net_spawn() if npc_trade then local manager = self.object:motivation_action_manager() manager:add_evaluator(npc_trade.property_need_to_trade, property_evaluator_const(false)) end Где может быть ошибка? Может, ошибка не синтаксическая, а логическая? Изменено 4 Июня 2013 пользователем ColR_iT Поделиться этим сообщением Ссылка на сообщение
dukekan 5 Опубликовано 4 Июня 2013 В фунции add_to_binder надо вместо вызова функции xr_motivator.addCommonPrecondition просто скопировать ее содержимое, за исключением условия, которое приводит к вылету. Попробовал, вылетает. Всё также безлогово Поделиться этим сообщением Ссылка на сообщение
dukekan 5 Опубликовано 7 Июня 2013 Замучался я с этой схемой. Жаль, что движок не выдаёт ошибок в действии модели поведения. Может, у кого ещё есть идеи, в чём ошибка? А то я всё больше склоняюсь к мысли не мучаться с "правильными" методами реализации поведения сталкеров, как это делали разработчики, а просто написать код без классов, который будет делать тоже самое. Потому как послать сталкера к торговцу "по простому" у меня заняло 15 минут, а здесь неделю) Поделиться этим сообщением Ссылка на сообщение
dukekan 5 Опубликовано 19 Июня 2013 Кто-нибудь знает способ сохранения данных в ТЧ? Просто мне нужно при запуске(именно при запуске, т.е. в главном меню) игры узнать результат предыдущей (одну переменную). Пробовал через Lua io.open, но не получается (я так понял, эти функции есть только в ЗП и ЧН). Помог бы конечно amk.save_variable, но ведь она действует только при уже загруженной игре. Поделиться этим сообщением Ссылка на сообщение
dukekan 5 Опубликовано 20 Июня 2013 (изменено) Действительно, вариант Charsi работает, спасибо. Кому понадобится, немного растолкую суть этого метода. -- Сохранение данных в S.T.A.L.K.E.R. Тень Чернобыля local value = 0 -- переменная, которую нужно сохранить-считать local concomm ="sv_vote_enabled" -- строка в конфиге my_config.ltx, после которой будет значение нашей переменной local con = get_console() function var_load() con:execute("cfg_load my_config") -- загружаем наш конфиг value = con:get_string(concomm) -- получаем значение, котрое идёт после sv_vote_enabled con:execute("cfg_load user")--загружаем стандартный конфиг user.ltx end function var_save() con:execute("cfg_load my_config")-- загружаем наш конфиг con:execute(concomm.." "..value) --сохраняем значение переменной con:execute("cfg_save my_config") -- сохраняем конфиг con:execute("cfg_load user") -- загружаем стандартный end my_config будет лежать там же, где и user.ltx Значение переменной vaue после загрузки будет не числовым, а строковым, и, к примеру, проверка её значения будет выглядеть так: if value == '3' then -- do something end Изменено 20 Июня 2013 пользователем dukekan Поделиться этим сообщением Ссылка на сообщение
dukekan 5 Опубликовано 19 Июля 2013 Кто нибудь отправлял НПС на другую локацию? utils.send_to_nearest_accessible_vertex( npc, vertex_id ) npc:set_dest_level_vertex_id(vertex_id) действуют в пределах локации, т.к. требуется level_vertex текущей локации ГГ Приходит на ум прописать сталкеру smart_terrain на другой локации,c помощью amk.write_stalker_params(), но метод какой-то криминальный). Может, кто знает более легальный метод? Поделиться этим сообщением Ссылка на сообщение
dukekan 5 Опубликовано 20 Июля 2013 Требуется смарт, требуется прописать в него непися, требуется заранее подготовить пути. Жаль конечно, что для массовки такой метод не подходит. Может быть тогда поступать как разработчики в ЗП, т.е. гнать НПС на край локации, как дойдёт - удалять его, заспавнив его же уже на другой локации. Но так, как я понимаю, НПС через 1 локацию не отправить, только на соседнюю. Поделиться этим сообщением Ссылка на сообщение
dukekan 5 Опубликовано 31 Марта 2016 (изменено) А если так: (Упс, не заметил, что ТЧ, да не вижу, как удалить) self.back = CUIStatic() self.back:SetWndRect(Frect():set(200,150,500,550)) self.back:InitTexture("ui\\computer\\text_window_note") self.back:SetWndPos(vector2():set(200,150)) self.back:SetWndSize(vector2():set(500,550)) self.back:SetStretchTexture(true) self:AttachChild(self.back) Изменено 31 Марта 2016 пользователем dukekan Поделиться этим сообщением Ссылка на сообщение
dukekan 5 Опубликовано 1 Апреля 2016 Кто-нибудь может подсказать, как подключить luaxml? Я сделал просто, скопировал все файлы в bin, вот они: http://hkar.ru/HGkt Потом на первом апдейте актора проверяю по примеру: require("LuaXML") -- load XML data from file "test.xml" into local table xfile local xfile = xml.load("test.xml") -- search for substatement having the tag "scene" local xscene = xfile:find("scene") -- if this substatement is found... if xscene ~= nil then -- ...print it to screen debug_info.stip("xml" .. xscene) -- print attribute id and first substatement debug_info.stip("xml" .. tostring(xscene.id) .. tostring(xscene[1]) ) -- set attribute id xscene["id"] = "newId" else debug_info.stip("xml nod not found") end Но апдейт вешается на строке с загрузкой xml.load. Поделиться этим сообщением Ссылка на сообщение
dukekan 5 Опубликовано 3 Апреля 2016 Вот здесь : http://www.amk-team.ru/forum/topic/6185-skriptovanie/page-349#entry985779 есть упоминание о правке в XE о получениии (и установке) свойств артефактов по смещению. Никто не натыкался на похожее, только под ЗП? Поделиться этим сообщением Ссылка на сообщение
dukekan 5 Опубликовано 24 Января 2017 Можно ли скриптово узнать, есть ли в шлеме/костюме ПНВ и какого он поколения (ЗП)? Поделиться этим сообщением Ссылка на сообщение
dukekan 5 Опубликовано 17 Июня 2017 Всем привет. У меня есть вопрос, кто может - подскажите пожалуйста. Есть идея упростить адаптацию заранее правильно подготовленной модификации к другим, но не хватает знаний по устройству классов Lua. С текстурами и бинарными файлами понятно, их или полностью заменять или оставлять оригинальные. Но в некоторых случаях, к примеру, при создании текстуры инвентаря, размещать элементы на большой текстуре инвентаря справа снизу, и своим предметам прописать эти координаты. Сами же конфиги предметов инклюдить, а не дописывать напрямую в стандартные файлы. Тоже адаптация нужна будет, но хоть поменьше. А вот со скриптами - непонятно. Возможно ли наследование классов Lua от друг друга? Тогда можно будет переопределить к примеру метод update класса actor_binder в своём классе, в нём вызвать метод родителя, для правильной работы механизмов игры и чужих скриптов, а далее уже дописывать свои необходимые действия в этот метод. И чужое не ломаем, и своё дописали так, что работает и адаптировать этот скрипт просто - положили в папку scripts и готово. Возможно ли такое? Поделиться этим сообщением Ссылка на сообщение