Перейти к контенту

Скриптование


Svoboда

Рекомендуемые сообщения

Пытаюсь разобраться в работе логики 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

 

 

Поделиться этим сообщением


Ссылка на сообщение
  • Недавно просматривали   0 пользователей

    • Ни один зарегистрированный пользователь не просматривает эту страницу.
×
×
  • Создать...