e4s-sdk/gamedata/scripts/se_actor.script
2026-06-17 23:06:51 +03:00

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")