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