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

294 lines
11 KiB
Text

--[[------------------------------------------------------------------------------------------------
Helicopter movement
Àíäðóùåíêî Èâàí
--------------------------------------------------------------------------------------------------]]
local state_move = 0
----------------------------------------------------------------------------------------------------
class "heli_move"
function heli_move:__init( obj, storage )
self.object = obj
self.heliObject = obj:get_helicopter()
self.a = storage
self.heli_fly = heli_fly.get_heli_flyer(obj)
self.heli_fire = heli_fire.get_heli_firer(obj)
self.heli_look = heli_look.get_heli_looker(obj)
end
function heli_move:reset_scheme( loading )
printf("heli_move: reset_scheme: %s", self.object:name())
self.a.signals = {}
self.heliObject:TurnEngineSound( self.a.engine_sound )
----------------------------------Âåéïîèíòû - Íà÷àëî------------------------------------------------
if not level.patrol_path_exists(self.a.path_move) then
abort("Patrol path %s doesnt exist", self.a.path_move)
end
self.patrol_move = patrol(self.a.path_move)
self.patrol_move_info = utils.path_parse_waypoints(self.a.path_move)
if self.a.path_look then
if self.a.path_look == "actor" then
self.heli_fly:set_look_point(db.actor:position())
self:update_look_state()
else
self.patrol_look = patrol(self.a.path_look)
self.heli_fly:set_look_point(self.patrol_look:point( 0 ))
self:update_look_state()
if not self.patrol_look then
abort("object '%s': unable to find path_look '%s' on the map",
self.object:name(), self.a.path_look)
end
end
else
self.patrol_look = nil
end
self.max_velocity = self.a.max_velocity
if loading then
self.state = xr_logic.pstor_retrieve( self.object, "st" )
self.last_index = xr_logic.pstor_retrieve( self.object, "li" ) or nil
self.next_index = xr_logic.pstor_retrieve( self.object, "ni" ) or nil
self.was_callback = xr_logic.pstor_retrieve( self.object, "wc" )
else
self.last_index = nil
self.next_index = nil
self.heli_fly.max_velocity = self.max_velocity
self.heli_fly.heliLAccFW = self.max_velocity / 15
self.heli_fly.heliLAccBW = 2 * self.heli_fly.heliLAccFW / 3
self.heliObject:SetLinearAcc(self.heli_fly.heliLAccFW, self.heli_fly.heliLAccBW);
self.heliObject:SetMaxVelocity( self.max_velocity )
self.state = nil
self.stop_point = nil
self.by_stop_fire_fly = false
self.was_callback = false
self._flag_to_wp_callback = false
self.heli_fire.enemy_ = self.a.enemy_
self.heli_fire.enemy = nil
self.heli_fire.flag_by_enemy = true
if self.a.fire_point then
self.heli_fire.fire_point = patrol(self.a.fire_point):point( 0 )
end
if self.a.max_mgun_dist then
self.heliObject.m_max_mgun_dist = self.a.max_mgun_dist
end
if self.a.max_rocket_dist then
self.heliObject.m_max_rocket_dist = self.a.max_rocket_dist
end
if self.a.min_mgun_dist then
self.heliObject.m_min_mgun_dist = self.a.min_mgun_dist
end
if self.a.min_rocket_dist then
self.heliObject.m_min_rocket_dist = self.a.min_rocket_dist
end
if self.a.use_mgun then
self.heliObject.m_use_mgun_on_attack = true
else
self.heliObject.m_use_mgun_on_attack = false
end
if self.a.use_rocket then
self.heliObject.m_use_rocket_on_attack = true
else
self.heliObject.m_use_rocket_on_attack = false
end
self.heli_fire.upd_vis = self.a.upd_vis
self.heli_fire:update_enemy_state()
self:update_movement_state()
if self.a.show_health then
self.heli_fire:cs_remove()
self.heli_fire.show_health = true
self.heli_fire:cs_heli()
else
self.heli_fire.show_health = false
self.heli_fire:cs_remove()
end
self.heliObject:UseFireTrail(self.a.fire_trail)
end
end
function heli_move:save()
xr_logic.pstor_store( self.object, "st", self.state )
----------------------------------Âåéïîèíòû - Íà÷àëî------------------------------------------------
xr_logic.pstor_store( self.object, "li", self.last_index or false )
xr_logic.pstor_store( self.object, "ni", self.next_index or false )
----------------------------------Âåéïîèíòû - Êîíåö-------------------------------------------------
xr_logic.pstor_store( self.object, "wc", self.was_callback )
end
function heli_move:update( delta )
if xr_logic.try_switch_to_another_section(self.object, self.a, db.actor) then
return
end
--self.heli_fire:update_enemy_state()
if self.was_callback then
self:update_movement_state()
self.was_callback = false
end
if self.a.path_look then
if self.a.path_look == "actor" then
self.heli_fly:set_look_point(db.actor:position())
if self.a.stop_fire then
if self.heliObject:isVisible( db.actor ) then
if not self.by_stop_fire_fly then
self.stop_point = self.object:position()
self.by_stop_fire_fly = true
self.was_callback = true
--'printf("Stop Fire!")
end
else
--'printf("Fly to next point!")
self.by_stop_fire_fly = false
self.was_callback = true
end
end
end
self:update_look_state()
end
if not self.a.path_look and self.heli_look.look_state then
self.heli_look:calc_look_point(self.heli_fly.dest_point, true)
end
end
function heli_move:update_movement_state()
--'printf("update_movement_state()")
self.state = state_move
if self.patrol_move then
if not self.last_index then
self.last_index = 0
self.next_index = 1
else
self.next_index = self.last_index + 1
if self.next_index >= self.patrol_move:count() then
self.next_index = 0
end
end
end
if not self.by_stop_fire_fly then
if self.patrol_move:count() > 2 then
self._flag_to_wp_callback = self.heli_fly:fly_on_point_with_vector(
self.patrol_move:point( self.last_index ),
self.patrol_move:point( self.next_index ),
self.max_velocity, self._flag_to_wp_callback, false)
else
if self.patrol_move:count() > 1 then
self._flag_to_wp_callback = self.heli_fly:fly_on_point_with_vector(
self.patrol_move:point( self.last_index ),
self.patrol_move:point( self.next_index ),
self.max_velocity, true, true)
else
self._flag_to_wp_callback = self.heli_fly:fly_on_point_with_vector(
self.patrol_move:point( self.last_index ),
self.patrol_move:point( self.last_index ),
self.max_velocity, true, true)
end
end
else
self._flag_to_wp_callback = self.heli_fly:fly_on_point_with_vector(
self.stop_point,
self.stop_point,
self.max_velocity, true, false)
self._flag_to_wp_callback = true
end
end
function heli_move:update_look_state()
--' printf("update_look_state()")
self.heli_fly:set_block_flook(true)
self.heli_fly:look_at_position()
end
function heli_move:waypoint_callback( obj, action_type, index )
----------------------------------Âåéïîèíòû - Íà÷àëî------------------------------------------------
if not self._flag_to_wp_callback then
--'printf("heli_pos=[%d;%d;%d]",self.object:position().x,self.object:position().y,self.object:position().z)
--'printf("dist_to_dest_point=%d",self.heliObject:GetDistanceToDestPosition())
if self.patrol_move then
if index == self.last_index then
return
end
if index ~= -1 then
self.last_index = index
else
--' Âûäàòü êîëëáåê
if self.patrol_move_info[self.last_index] ~= nil then
local signal = self.patrol_move_info[self.last_index]["sig"]
if signal ~= nil then
self.a.signals[signal] = true
end
end
if self.patrol_move:count()>1 then
self.last_index = self.next_index
end
end
end
end
----------------------------------Âåéïîèíòû - Êîíåö-------------------------------------------------
--' printf("Dist To Dest Point: %s", self.heliObject:GetDistanceToDestPosition())
--' printf("heli_move:waypoint_callback(): name=%s, index=%d", self.object:name(), index)
self.was_callback = true
end
---------------------------------------------------------------------------------------------------------------------
function add_to_binder( npc, ini, scheme, section, storage )
printf( "DEBUG: add_to_binder: npc:name()='%s', scheme='%s', section='%s'", npc:name(), scheme, section )
local new_action = heli_move( npc, storage )
-- Çàðåãèñòðèðîâàòü âñå actions, â êîòîðûõ äîëæåí áûòü âûçâàí ìåòîä reset_scheme ïðè èçìåíåíèè íàñòðîåê ñõåìû:
xr_logic.subscribe_action_for_events( npc, storage, new_action )
end
function set_scheme( npc, ini, scheme, section )
local a = xr_logic.assign_storage_and_bind( npc, ini, scheme, section )
a.logic = xr_logic.cfg_get_switch_conditions( ini, section, npc )
a.path_move = utils.cfg_get_string( ini, section, "path_move", npc, true, "")
a.path_look = utils.cfg_get_string( ini, section, "path_look", npc, false, "")
a.max_velocity = utils.cfg_get_number( ini, section, "max_velocity", npc, true, max_velocity )
a.enemy_ = utils.cfg_get_string( ini, section, "enemy", npc, false, "")
a.fire_point = utils.cfg_get_string( ini, section, "fire_point", npc, false, "")
a.max_mgun_dist = utils.cfg_get_number( ini, section, "max_mgun_attack_dist", npc, false )
a.max_rocket_dist = utils.cfg_get_number( ini, section, "max_rocket_attack_dist", npc, false )
a.min_mgun_dist = utils.cfg_get_number( ini, section, "min_mgun_attack_dist", npc, false )
a.min_rocket_dist = utils.cfg_get_number( ini, section, "min_rocket_attack_dist", npc, false )
a.use_rocket = utils.cfg_get_bool( ini, section, "use_rocket", npc, false, true )
a.use_mgun = utils.cfg_get_bool( ini, section, "use_mgun", npc, false, true )
a.engine_sound = utils.cfg_get_bool( ini, section, "engine_sound", npc, false, true )
a.upd_vis = utils.cfg_get_number( ini, section, "upd_vis", npc, false, 10 )
a.stop_fire = utils.cfg_get_bool( ini, section, "stop_fire", npc, false, false )
a.show_health = utils.cfg_get_bool( ini, section, "show_health", npc, false, false )
a.fire_trail = utils.cfg_get_bool( ini, section, "fire_trail", npc, false, false )
local st = db.storage[npc:id()]
st.invulnerable = utils.cfg_get_bool( ini, section, "invulnerable", npc, false, false )
st.immortal = utils.cfg_get_bool( ini, section, "immortal", npc, false, false )
st.mute = utils.cfg_get_bool( ini, section, "mute", npc, false, false )
end