223 lines
6.6 KiB
Text
223 lines
6.6 KiB
Text
--[[------------------------------------------------------------------------------------------------
|
|
Helicoter binding
|
|
×óãàé Àëåêñàíäð
|
|
|
|
Ñäåëàòü:
|
|
- íàñòðîéêè â ltx
|
|
--------------------------------------------------------------------------------------------------]]
|
|
|
|
|
|
---------------------------------------------------------------------------------------------
|
|
-- Ôóíêöèÿ äëÿ áèíäà
|
|
---------------------------------------------------------------------------------------------
|
|
|
|
function bind( obj )
|
|
-- printf( "BIND HELICOPTER id=%d", obj:id() )
|
|
local ini = obj:spawn_ini()
|
|
if ini and ini:section_exist("logic") then
|
|
obj:bind_object( heli_binder( obj, ini ) )
|
|
end
|
|
end
|
|
|
|
---------------------------------------------------------------------------------------------
|
|
-- Áèíäåð âåðòîë¸òîâ
|
|
---------------------------------------------------------------------------------------------
|
|
class "heli_binder" ( object_binder )
|
|
|
|
function heli_binder:__init( obj, ini ) super( obj )
|
|
self.ini = ini
|
|
self.initialized = false
|
|
self.loaded = false
|
|
self.heli_fire = heli_fire.get_heli_firer(obj)
|
|
end
|
|
|
|
function heli_binder:reload( section )
|
|
object_binder.reload( self, section )
|
|
end
|
|
|
|
function heli_binder:reinit()
|
|
object_binder.reinit( self )
|
|
|
|
--printf( "heli_binder:reinit()" )
|
|
|
|
db.storage[self.object:id()] = {}
|
|
self.st = db.storage[self.object:id()]
|
|
|
|
self.heliObject = self.object:get_helicopter()
|
|
|
|
self.object:set_callback( callback.helicopter_on_point, self.on_point, self )
|
|
self.object:set_callback( callback.helicopter_on_hit, self.on_hit, self )
|
|
|
|
self.st.combat = heli_combat.heli_combat( self.object, self.heliObject )
|
|
|
|
self.last_hit_snd_timeout = 0
|
|
|
|
local ltx = system_ini()
|
|
|
|
self.flame_start_health = utils.cfg_get_number( ltx, "helicopter", "flame_start_health", self.object, true )
|
|
|
|
local object_ini = self.object:spawn_ini()
|
|
self.snd_hit = utils.cfg_get_string( object_ini, "helicopter", "snd_hit", self.object, false, "", "heli_hit")
|
|
self.snd_damage = utils.cfg_get_string( object_ini, "helicopter", "snd_damage", self.object, false, "", "heli_damaged")
|
|
self.snd_down = utils.cfg_get_string( object_ini, "helicopter", "snd_down", self.object, false, "", "heli_down")
|
|
|
|
-- íà ñëó÷àé çàãðóçêè
|
|
self.st.last_alt = self.heliObject:GetRealAltitude()
|
|
self.st.alt_check_time = time_global() + 1000
|
|
end
|
|
|
|
function heli_binder:update( delta )
|
|
object_binder.update( self, delta )
|
|
|
|
--printf( "heli_binder update" )
|
|
-- printf( "%d", self.object:level_vertex_light( db.actor:level_vertex_id() ) )
|
|
|
|
if not self.initialized and db.actor then
|
|
self.initialized = true
|
|
xr_logic.initialize_obj( self.object, self.st, self.loaded, db.actor, modules.stype_heli )
|
|
end
|
|
|
|
if self.st.active_section ~= nil then
|
|
xr_logic.issue_event( self.object, self.st[self.st.active_scheme], "update", delta )
|
|
end
|
|
|
|
|
|
self.object:info_clear()
|
|
local active_section = db.storage[self.object:id()].active_section
|
|
if active_section then
|
|
self.object:info_add('section -- ' .. active_section)
|
|
end
|
|
self:check_health()
|
|
|
|
xr_sound.update(self.object:id())
|
|
end
|
|
|
|
function heli_binder:net_spawn( data )
|
|
if not object_binder.net_spawn( self, data ) then
|
|
return false
|
|
end
|
|
|
|
db.add_obj( self.object )
|
|
db.add_heli( self.object )
|
|
|
|
return true
|
|
end
|
|
|
|
function heli_binder:net_destroy()
|
|
db.del_obj( self.object )
|
|
db.del_heli( self.object )
|
|
|
|
object_binder.net_destroy( self )
|
|
end
|
|
|
|
function heli_binder:net_save_relevant()
|
|
return true
|
|
end
|
|
|
|
function heli_binder:save( packet )
|
|
object_binder.save( self, packet )
|
|
set_save_marker(packet, "save", false, "heli_binder")
|
|
--printf( "heli_binder: save")
|
|
|
|
xr_logic.save_obj( self.object, packet )
|
|
set_save_marker(packet, "save", true, "heli_binder")
|
|
self.st.combat:save( packet )
|
|
end
|
|
|
|
function heli_binder:load( packet )
|
|
self.loaded = true
|
|
set_save_marker(packet, "load", false, "heli_binder")
|
|
--printf("generic_object_binder:load(): self.object:name()='%s'", self.object:name())
|
|
object_binder.load( self, packet )
|
|
|
|
--printf( "heli_binder: load")
|
|
|
|
xr_logic.load_obj( self.object, packet )
|
|
set_save_marker(packet, "load", true, "heli_binder")
|
|
self.st.combat:load( packet )
|
|
end
|
|
|
|
function heli_binder:check_health()
|
|
local heli = self.heliObject
|
|
|
|
--printf( "heli health: %d", heli:GetfHealth() )
|
|
|
|
if not heli.m_dead then
|
|
local health = get_heli_health( self.heliObject, self.st )
|
|
|
|
if health < self.flame_start_health and not heli.m_flame_started then
|
|
heli_start_flame( self.object )
|
|
-- xr_sound.set_sound_play(self.object:id(), self.snd_damage)
|
|
end
|
|
|
|
if health <= 0.005 and not self.st.immortal then
|
|
heli_die( self.object )
|
|
-- xr_sound.set_sound_play(self.object:id(), self.snd_down)
|
|
end
|
|
end
|
|
end
|
|
|
|
------------------------------ callbacks ---------------------------------
|
|
function heli_binder:on_hit( power, impulse, hit_type, enemy_id )
|
|
--printf( "heli_binder: hit callback")
|
|
|
|
local enemy = level.object_by_id( enemy_id )
|
|
local enemy_cls_id = get_clsid( enemy )
|
|
self.heli_fire.enemy = enemy
|
|
self.heli_fire:update_hit()
|
|
-- åñëè îáèä÷èê àêò¸ð èëè ñòàëêåð, òî ñäåëàòü åãî ñâîèì âðàãîì
|
|
if enemy_cls_id == clsid.actor or enemy_cls_id == clsid.script_stalker then
|
|
-- if not self.st.combat.enemy_id then
|
|
-- self.st.combat.enemy_id = enemy_id
|
|
-- end
|
|
|
|
if self.st.hit then
|
|
xr_logic.issue_event( self.object, self.st.hit, "hit_callback", self.object, power, nil, enemy, nil )
|
|
end
|
|
end
|
|
|
|
-- ïèëîòû ðóãàþòñÿ ïî ðàöèè
|
|
if self.last_hit_snd_timeout < time_global() then
|
|
-- xr_sound.set_sound_play(self.object:id(), self.snd_hit)
|
|
self.last_hit_snd_timeout = time_global() + math.random( 4000, 8000 )
|
|
end
|
|
end
|
|
|
|
function heli_binder:on_point( distance, position, path_idx )
|
|
if self.st.active_section ~= nil then
|
|
xr_logic.issue_event( self.object, self.st[self.st.active_scheme], "waypoint_callback", self.object, nil, path_idx )
|
|
end
|
|
end
|
|
|
|
--------------------------------------------------------------------------
|
|
function get_heli_health( heli, st )
|
|
local health
|
|
if st.invulnerable then
|
|
health = 1
|
|
heli:SetfHealth( health )
|
|
else
|
|
health = heli:GetfHealth()
|
|
if health < 0 then
|
|
heli:SetfHealth( 0 )
|
|
health = 0
|
|
end
|
|
end
|
|
return health
|
|
end
|
|
|
|
function is_heli_alive( obj )
|
|
return get_heli_health( obj:get_helicopter(), db.storage[obj:id()] ) > 0.005
|
|
end
|
|
|
|
function heli_start_flame( obj )
|
|
obj:get_helicopter():StartFlame()
|
|
end
|
|
|
|
function heli_die( obj )
|
|
local heli = obj:get_helicopter()
|
|
local st = db.storage[obj:id()]
|
|
heli:Die()
|
|
db.del_heli( obj )
|
|
st.last_alt = heli:GetRealAltitude()
|
|
st.alt_check_time = time_global() + 1000
|
|
end
|