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

154 lines
3.9 KiB
Text

function init(obj)
printf("_bp: init(): name='%s'", obj:name())
db.storage[obj:id()] = { }
local new_binder = signal_light_binder(obj)
obj:bind_object(new_binder)
end
---------------------------------------------------------------------------------------------
class "signal_light_binder" (object_binder)
function signal_light_binder:__init(obj) super(obj)
self.need_turn_off = true
-- self.initialized = false
self.loaded = false
end
function signal_light_binder:reload(section)
object_binder.reload(self, section)
end
function signal_light_binder:reinit()
object_binder.reinit(self)
db.signal_light[self.object:name()] = self
end
function signal_light_binder:update(delta)
object_binder.update(self, delta)
local obj = self.object
if self.start_time == nil then
if self.need_turn_off then
obj:get_hanging_lamp():turn_off()
self.need_turn_off = false
self.loaded = false
end
return
end
local fly_time = time_global() - self.start_time
if self.loaded then
self.start_time = self.start_time + time_global() - self.delta_time
self.delta_time = nil
self.loaded = false
fly_time = time_global() - self.start_time
if fly_time < 1500 then
obj:set_const_force(vector():set(0,1,0), 180+math.floor(fly_time/5), 1500-fly_time)
obj:start_particles("weapons\\light_signal", "link")
elseif fly_time < 20000 then
obj:set_const_force(vector():set(0,1,0), 33, 20000-fly_time)
obj:start_particles("weapons\\light_signal", "link")
end
return
end
-- Ãëàâíûé öèêë ïîëåòà ñèãíàëêè
if fly_time > 28500 then
self:stop()
return
end
if fly_time > 20500 then
self:stop_light()
return
end
if fly_time > 1500 then
if self.slow_fly_started ~= true then
self:slow_fly()
obj:start_particles("weapons\\light_signal", "link")
obj:get_hanging_lamp():turn_on()
end
end
end
function signal_light_binder:net_spawn(data)
if not object_binder.net_spawn(self, data) then
return false
end
return true
end
function signal_light_binder:net_destroy()
db.signal_light[self.object:name()] = nil
object_binder.net_destroy(self)
end
function signal_light_binder:launch()
if not(db.actor) then
return false
end
if self.start_time ~= nil then
return false
end
local obj = self.object
obj:set_const_force(vector():set(0,1,0), 180, 1500)
--obj:start_particles("weapons\\light_signal", "link")
--obj:get_hanging_lamp():turn_on()
self.start_time = time_global()
self.slow_fly_started = false
return true
end
function signal_light_binder:slow_fly()
self.slow_fly_started = true
self.object:set_const_force(vector():set(0,1,0), 30, 20000)
end
function signal_light_binder:stop_light()
self.slow_fly_started = false
local obj = self.object
obj:stop_particles("weapons\\light_signal", "link")
obj:get_hanging_lamp():turn_off()
end
function signal_light_binder:stop()
self.start_time = nil
end
function signal_light_binder:is_flying()
return self.start_time ~= nil
end
-- Standart function for save
function signal_light_binder:net_save_relevant()
return true
end
function signal_light_binder:save(packet)
set_save_marker(packet, "save", false, "signal_light_binder")
object_binder.save(self, packet)
if self.start_time == nil then
packet:w_u32(-1)
else
packet:w_u32(time_global()-self.start_time)
end
packet:w_bool(self.slow_fly_started==true)
set_save_marker(packet, "save", true, "signal_light_binder")
end
function signal_light_binder:load(reader)
set_save_marker(reader, "load", false, "signal_light_binder")
object_binder.load(self, reader)
local time = reader:r_u32()
if time ~= 4294967296 then
self.start_time = time_global() - time
end
self.slow_fly_started = reader:r_bool()
self.loaded = true
self.delta_time = time_global()
set_save_marker(reader, "load", true, "signal_light_binder")
end