162 lines
No EOL
5.4 KiB
Text
162 lines
No EOL
5.4 KiB
Text
class "se_actor" (cse_alife_creature_actor)
|
|
--------------------
|
|
function se_actor:__init (section) super (section)
|
|
self.m_registred = false
|
|
self.start_position_filled = false
|
|
end
|
|
|
|
function se_actor:on_register()
|
|
cse_alife_creature_actor.on_register(self)
|
|
story_objects.get_story_objects_registry():register(self.id, "actor", true)
|
|
simulation_objects.get_sim_obj_registry():register(self)
|
|
self.m_registred = true
|
|
if not self.start_position_filled then
|
|
sim_board.get_sim_board():fill_start_position()
|
|
self.start_position_filled = true
|
|
end
|
|
end
|
|
|
|
function se_actor:on_unregister()
|
|
cse_alife_creature_actor.on_unregister(self)
|
|
unregister_story_object_by_id(self.id)
|
|
simulation_objects.get_sim_obj_registry():unregister(self)
|
|
end
|
|
|
|
--------------------
|
|
function se_actor:STATE_Write(packet)
|
|
cse_alife_creature_actor.STATE_Write(self, packet)
|
|
-- if self.m_registred ~= true then
|
|
-- return
|
|
-- end
|
|
set_save_marker(packet, "save", false, "se_actor")
|
|
packet:w_bool(self.start_position_filled)
|
|
-- story_objects.get_story_objects_registry():save(packet)
|
|
set_save_marker(packet, "save", true, "se_actor")
|
|
end
|
|
--------------------
|
|
function se_actor:STATE_Read(packet, size)
|
|
cse_alife_creature_actor.STATE_Read(self, packet, size)
|
|
-- ïîä LevelEditor íå ïûòàòüñÿ ÷èòàòü èç ïàêåòà íè÷åãî
|
|
if editor() then
|
|
return
|
|
end
|
|
-- if self.m_registred ~= true then
|
|
-- return
|
|
-- end
|
|
if db.actor == nil then
|
|
set_save_marker(packet, "load", false, "se_actor")
|
|
self.start_position_filled = packet:r_bool()
|
|
-- story_objects.get_story_objects_registry():load(packet)
|
|
set_save_marker(packet, "load", true, "se_actor")
|
|
end
|
|
end
|
|
|
|
|
|
--***********************************************************************************************
|
|
--* SIMULATION_TARGET_ACTOR *
|
|
--***********************************************************************************************
|
|
|
|
-- Ïîëó÷èòü ïîçèöèþ, ëåâåë âåðòåêñ, ãåéì âåðòåêñ îáüåêòà.
|
|
function se_actor:get_location()
|
|
return self.position, self.m_level_vertex_id, self.m_game_vertex_id
|
|
end
|
|
|
|
-- Äîñòèãíóò ëè ÿ îòðÿäîì âûáðàâøèì ìåíÿ êàê öåëü.
|
|
function se_actor:am_i_reached(squad)
|
|
return not level.object_by_id(self.id):alive()
|
|
end
|
|
|
|
-- Âûçûâàåòñÿ 1 ðàç ïîñëå äîñòèæåíèÿ ìåíÿ îòðÿäîì âûáðàâøèì ìåíÿ êàê öåëü.
|
|
function se_actor:on_after_reach(squad)
|
|
--squad.current_target_id = squad.smart_id
|
|
end
|
|
|
|
-- Âûçûâàåòñÿ 1 ðàç â ìîìåíò âûáîðà ìåíÿ êàê öåëè.
|
|
function se_actor:on_reach_target(squad)
|
|
squad:set_location_types()
|
|
for k in squad:squad_members() do
|
|
if db.offline_objects[k.id] ~= nil then
|
|
db.offline_objects[k.id] = {}
|
|
end
|
|
end
|
|
sim_board.get_sim_board():assign_squad_to_smart(squad, nil)
|
|
end
|
|
-- Âîçâðàùàåò CALifeSmartTerrainTask íà ìåíÿ, âûçûâàåòñÿ èç smart_terrain:task()
|
|
function se_actor:get_alife_task()
|
|
printf("Returning alife task for object [%s] game_vertex [%s] level_vertex [%s] position %s", self.id, self.m_game_vertex_id, self.m_level_vertex_id, vec_to_str(self.position))
|
|
return CALifeSmartTerrainTask(self.m_game_vertex_id, self.m_level_vertex_id)
|
|
end
|
|
|
|
local smarts_by_no_assault_zones = {
|
|
["zat_a2_sr_no_assault"] = "zat_stalker_base_smart",
|
|
["jup_a6_sr_no_assault"] = "jup_a6",
|
|
["jup_b41_sr_no_assault"] = "jup_b41"
|
|
}
|
|
|
|
function se_actor:sim_available()
|
|
-- Ïðîâåðèòü íå íàõîäèòñÿ ëè èãðîê áëèæå ÷åì 50 ìåòðîâ ê ñìàðòó çàêðûòîìó äëÿ ñèìóëÿöèè.
|
|
if smart_terrain.nearest_to_actor_smart.dist < 50
|
|
and simulation_objects.get_sim_obj_registry().objects[smart_terrain.nearest_to_actor_smart.id] == nil then
|
|
return false
|
|
end
|
|
for k,v in pairs (smarts_by_no_assault_zones) do
|
|
local zone = db.zone_by_name[k]
|
|
if zone and zone:inside(self.position) then
|
|
local smart = sim_board.get_sim_board():get_smart_by_name(v)
|
|
if smart and smart.base_on_actor_control ~= nil and smart.base_on_actor_control.status ~= smart_terrain_control.ALARM then
|
|
return false
|
|
end
|
|
end
|
|
end
|
|
-- Ïðîâåðèòü íå íàõîäèòñÿ ëè èãðîê â ñåéôðåñòðèêòîðå ñìàðòà âî âðåìÿ òðåâîãè.
|
|
if smart_terrain_control.current_smart_id == nil then
|
|
return true
|
|
end
|
|
local smart = alife():object(smart_terrain_control.current_smart_id)
|
|
if smart.base_on_actor_control ~= nil
|
|
and smart.base_on_actor_control.status == smart_terrain_control.NORMAL
|
|
and db.zone_by_name[smart.base_on_actor_control.noweap_zone]:inside(self.position) then
|
|
return false
|
|
end
|
|
return true
|
|
end
|
|
|
|
local is_squad_monster =
|
|
{
|
|
["monster_predatory_day"] = true,
|
|
["monster_predatory_night"] = true,
|
|
["monster_vegetarian"] = true,
|
|
["monster_zombied_day"] = true,
|
|
["monster_zombied_night"] = true,
|
|
["monster_special"] = true
|
|
}
|
|
|
|
-- Ìîé ïðåêîíäèøí.
|
|
function se_actor:target_precondition(squad)
|
|
local squad_params = sim_board.simulation_activities[squad.player_id]
|
|
if squad_params == nil or squad_params.actor == nil or squad_params.actor.prec(squad, self) == false then
|
|
return false
|
|
end
|
|
return true
|
|
|
|
--[[
|
|
if squad.player_id == "killer" then
|
|
return true
|
|
end
|
|
if is_squad_monster[squad.player_id] and in_time_interval(21, 8) and simulation_objects.sim_dist_to(squad, self) <= 900 then
|
|
return true
|
|
end
|
|
return false
|
|
]]
|
|
end
|
|
|
|
-- Ïîñ÷èòàòü ìîé ïðèîðèòåò äëÿ îòðÿäà.
|
|
function se_actor:evaluate_prior(squad)
|
|
return simulation_objects.evaluate_prior(self, squad)
|
|
end
|
|
|
|
|
|
|
|
|
|
--run_string xr_effects.teleport_squad(nil,nil,{"pri_a25_base_army_medic","pri_a16_pri_a25_medic_walk"})
|
|
--run_string give_info("pl") |