294 lines
11 KiB
Text
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
|