Mistaken 0 Опубликовано 30 Января 2018 Пытаюсь разобраться в работе логики NPC. Написал новый биндер и тестовую схему, но сталкер стоит на месте как вкопаный. В чем, собственно, может быть причина? В родных скриптах игры каких-то особых манипуляций со сталкерами при добавлении им логики я не нашел. Скрытый текст class "CSchemeEval" (property_evaluator) function CSchemeEval:__init(storage) super(nil, "CSchemeEval") self.st = storage; end function CSchemeEval:evaluate() return self.st.enabled; end class "CSchemeAction" (action_base); function CSchemeAction:__init(storage) super(nil, "CSchemeAction") self.st = storage; end function CSchemeAction:initialize() action_base.initialize(self); self.object:set_dest_level_vertex_id(db.actor:level_vertex_id()); end function CSchemeAction:execute() action_base.execute(self); end function CSchemeAction:finalize() action_base.finalize(self); end local ACTION_BASE = 5000; local EVAL_BASE = 10000; function addToBinder(npc, storage) local manager = npc:motivation_action_manager(); manager:add_evaluator(EVAL_BASE + 1, CSchemeEval(storage)); local action = CSchemeAction(storage); action:add_precondition(world_property(stalker_ids.property_alive, true)); action:add_precondition(world_property(stalker_ids.property_danger, false)); action:add_precondition(world_property(stalker_ids.property_enemy, false)); action:add_precondition(world_property(stalker_ids.property_anomaly, false)); action:add_precondition(world_property(EVAL_BASE + 1, true)); action:add_effect(world_property(EVAL_BASE + 1, false)); manager:add_action(ACTION_BASE + 1, action); action = manager:action(xr_actions_id.alife); action:add_precondition(world_property(EVAL_BASE + 1, false)); end Скрытый текст function bind(object) object:bind_object(CNpcBinder(object)); end class "CNpcBinder" (object_binder) function CNpcBinder:__init(object) super(object) end function CNpcBinder:net_spawn(sobject) self.st = { enabled = true; }; local manager = self.object:motivation_action_manager() manager:remove_evaluator (stalker_ids.property_anomaly) manager:add_evaluator (stalker_ids.property_anomaly, property_evaluator_const(false)); scheme.addToBinder(self.object, self.st); return true; end function CNpcBinder:reinit() self.state_mgr = state_mgr.bind_manager(self.object) self.move_mgr = move_mgr.move_mgr(self.object) self.move_mgr:initialize() end function CNpcBinder:update(delta) if self.state_mgr then if self.object:alive() then self.state_mgr:update() else self.state_mgr = nil; end end end Поделиться этим сообщением Ссылка на сообщение