Divergent/mods/Hideout Furniture/gamedata/scripts/bind_light_furniture.script

227 lines
6.4 KiB
Plaintext

function turn_off_lamp(obj_id)
local obj = get_object_by_id(obj_id)
if not (obj) then
return
end
if not (obj.get_hanging_lamp) then
return
end
if not hf_obj_manager.get_data(obj_id).is_on then
obj:get_hanging_lamp():turn_off()
end
return true
end
local function get_time_elapsed()
return game.get_game_time():diffSec(level.get_start_time())
end
gc = game.translate_string
---------------------------------------------------------------------------------------------------
-- Physic objects binding
----------------------------------------------------------------------------------------------------
local lights = {}
local switch = false
local psi_influence_clsid = {
[clsid.poltergeist_s] = true,
[clsid.controller_s] = true,
}
function need_flicker(lamp_obj)
-- Flicker on Emission Wave or Vortex
if (level_environment.get_light_flicker()) then return true end
-- Flicker if Psi Mutant nearby
local psi_influence = false
local function iterate_func(obj)
if (obj and psi_influence_clsid[obj:clsid()] and obj:alive()) then
psi_influence = true
return true
end
end
level.iterate_nearest(lamp_obj:position(), 15, iterate_func)
if psi_influence then return true end
return switch
end
function init(obj)
obj:bind_object(placeable_light_wrapper(obj).binder)
end
---------------------------------------------------------------------------------------------
class "placeable_light_wrapper" (bind_hf_base.hf_binder_wrapper)
function placeable_light_wrapper:__init(obj) super(obj)
lights[obj:id()] = "light_flicker"
-- Get paths to sound files
local section = self.object:section()
self.humming_snd_path = ini_sys:r_string_ex(section,"snd_on")
self.turn_on_snd_path = ini_sys:r_string_ex(section,"snd_turn_on")
self.turn_off_snd_path = ini_sys:r_string_ex(section,"snd_turn_off")
self.particle_path = ini_sys:r_string_ex(section,"particle")
self.hide_bone_off = ini_sys:r_string_ex(section,"hide_bone_off")
if self.particle_path then
self.particles = particles_object(self.particle_path)
end
self.object:set_tip_text(gc("st_interact"))
self.tg = time_global()
self.time_last = get_time_elapsed() -- used to keep track of time difference in between updates
self.max_duration = ini_sys:r_string_ex(section,"fuel_duration")*3600
-- get data
local data = hf_obj_manager.get_data(obj:id())
self.fuel = data and data.condition or 1
self.infinite_fuel = data and data.is_world_obj
self.last_state = data and data.is_on or false
-- Turn off lamp is light is turned off
CreateTimeEvent("hf_light", "turn_off_"..obj:id(), 0, turn_off_lamp, obj:id())
end
function placeable_light_wrapper:update(delta)
bind_hf_base.hf_binder_wrapper.update(self, delta)
self.object:set_callback(callback.death, placeable_light_wrapper.death_callback, self)
local lamp_obj = self.object:get_hanging_lamp()
local is_flickering = lamp_obj:is_flickering()
local is_on = hf_obj_manager.get_data(self.object:id()).is_on
if (self.fuel <= 0.0 or not is_on) then
if lamp_obj:is_on() then lamp_obj:turn_off() end
else
if not lamp_obj:is_on() then
lamp_obj:turn_on()
end
end
if (self.last_state ~= is_on) then
-- Play humming sound
if (is_on) then
if (self.humming == nil and self.humming_snd_path) then
self.humming = sound_object(self.humming_snd_path)
end
if (self.humming ~= nil and not self.humming:playing()) then
self.humming:play_at_pos(self.object, self.object:position(), 0, sound_object.s3d + sound_object.looped)
self.humming.volume = 0.0
self.humming_max = time_global() + 5000
end
-- 'Turn on' sound
if self.turn_on_snd_path then
sound_object(self.turn_on_snd_path):play_no_feedback(self.object, sound_object.s3d, 0, self.object:position(), math.random(5,8), random_float(0.9, 1.1))
end
-- Show bone when on
if self.hide_bone_off then
self.object:set_bone_visible(self.hide_bone_off, true, true, false)
end
-- Stop humming sound
else
if (self.humming ~= nil and self.humming:playing()) then
self.humming:stop()
end
-- 'Turn off' sound
if self.turn_off_snd_path then
sound_object(self.turn_off_snd_path):play_no_feedback(self.object, sound_object.s3d, 0, self.object:position(), random_float(0.5, 0.9), random_float(0.9, 1.1))
end
-- Hide bone when off
if self.hide_bone_off then
self.object:set_bone_visible(self.hide_bone_off, false, true, false)
end
end
end
self.last_state = is_on
-- Slow Startup for Humming Sound
if (self.humming ~= nil and self.humming:playing() and (self.humming_max > time_global())) then
self.humming.volume = 0.6 - (self.humming_max - time_global()) / 5000.0
end
local needflicker = need_flicker(self.object)
if (needflicker and not is_flickering) then
-- color animator flicker on/off chance on/off base time color animator fps
lamp_obj:set_color_animator(lights[self.object:id()], true, math.random(25,75), random_float(0.75,1.75), math.random(10,20))
elseif (not needflicker and is_flickering) then
lamp_obj:reset_color_animator()
end
if (self.humming ~= nil and self.humming:playing()) then
self.humming:set_position(self.object:position())
end
local time_current = get_time_elapsed()
local time_diff = time_current - self.time_last
if is_on then
-- Create and move particles to bone_light
if self.particle_path then
if not self.particles:playing() then
self.particles:play_at_pos(self.object:bone_position("bone_light"))
end
self.particles:move_to(self.object:bone_position("bone_light"), VEC_Z)
end
-- Deplete light fuel by adjusting condition
if not self.infinite_fuel then
self.fuel = self.fuel - (time_diff / self.max_duration)
end
else
-- Stop particles if turned off
if self.particles and self.particles:playing() then
self.particles:stop()
end
end
self.time_last = time_current
self:save_data()
end
function placeable_light_wrapper:net_destroy()
self:save_data()
if (self.humming) then
self.humming:stop()
self.humming = nil
end
if self.particles and self.particles:playing() then
self.particles:stop()
end
lights[self.object:id()] = nil
end
function placeable_light_wrapper:death_callback(victim, who)
if (self.humming) then
self.humming:stop()
self.humming = nil
end
lights[self.object:id()] = nil
end
function placeable_light_wrapper:save_data()
hf_obj_manager.update_data(self.object:id(), {
condition = self.fuel
})
end