316 lines
6.4 KiB
Lua

function reSetGaugeGui(p)
local gg = searchInTable(global.gaugeGuis, p, "player")
local shouldHaveGG = playerIsInHeli(p) and p.mod_settings["heli-gaugeGui-show"].value
if gg and not shouldHaveGG then
gg:destroy()
elseif not gg and shouldHaveGG then
local heli = getHeliFromBaseEntity(p.vehicle)
if heli then
insertInGlobal("gaugeGuis", gaugeGui.new(p, heli))
end
end
end
local pointerFrames = 128
gaugeGui =
{
prefix = "heli_gaugeGui_",
pointerData =
{
fuel =
{
min = 0,
max = 1,
fMin = 0.375 * pointerFrames,
fMax = 0.625 * pointerFrames,
clockwise = true,
},
speed =
{
min = 0,
max = 400,
fMin = 0.75 * pointerFrames,
fMax = 1.25 * pointerFrames,
clockwise = true,
},
height =
{
min = 0,
max = 25,
fMin = 0.5390625 * pointerFrames,
fMax = 0.965 * pointerFrames,
clockwise = true,
},
rpm =
{
min = 0,
max = 3000,
fMin = 0.4609375 * pointerFrames,
fMax = 0.035 * pointerFrames,
clockwise = false,
},
},
new = function(player, heli)
obj =
{
valid = true,
player = player,
heli = heli,
guiElems =
{
parent = mod_gui.get_frame_flow(player),
},
}
mtMgr.set(obj, "gaugeGui")
obj:buildGui()
heli:addGaugeGui(obj)
return obj
end,
destroy = function(self)
self.valid = false
if self.guiElems.root and self.guiElems.root.valid then
self.guiElems.root.destroy()
end
if self.heli.removeGaugeGui then
self.heli:removeGaugeGui(self)
end
removeInGlobal("gaugeGuis", self)
end,
hasMyPrefix = function(str)
return string.startswith(str, gaugeGui.prefix)
end,
OnGuiClick = function(self, e)
local name = e.element.name
if name == self.prefix .. "speaker_on_button" then
self:setMuted(true)
elseif name == self.prefix .. "speaker_off_button" then
self:setMuted(false)
end
end,
setMuted = function(self, muted)
local els = self.guiElems
local s = "on"
if muted then s = "off" end
self.muted = muted
Entity.set_data(self.player, muted, "gaugeGui_muted")
els.gauge_hr.speakerButtonFlow.clear()
els.gauge_hr.speaker_button = els.gauge_hr.speakerButtonFlow.add
{
type = "button",
name = self.prefix .. "speaker_" .. s .. "_button",
style = "heli-speaker_" .. s .. "_button",
}
end,
setGauge = function(self, gaugeName, pointerName, val)
local pD = self.pointerData[pointerName]
local pointer = self.guiElems[gaugeName].pointers[pointerName]
if pointer.noise then
val = val + pointer.noise:advance()
end
if pointer.lastVal ~= val then
pointer.lastVal = val
local pc = math.min(math.max(val / (pD.max - pD.min), 0), 1)
local frameDelta = math.abs(pD.fMax - pD.fMin)
local frame
if pD.clockwise then
frame = pD.fMin + pc * frameDelta
else
frame = pD.fMin - pc * frameDelta
end
if frame < 0 then
frame = pointerFrames + frame
end
frame = math.floor(frame % pointerFrames)
if pointer.lastFrame ~= frame then
pointer.lastFrame = frame
if pointer.elem then
pointer.elem.destroy()
end
pointer.elem = pointer.root.add
{
type = "sprite",
name = gaugeName .. "_pointer_" .. pointerName,
sprite = "heli_gauge_pointer_" .. frame,
tooltip = {"heli-gui-gauges-tt"},
}
end
end
end,
setLed = function(self, gaugeName, ledName, on)
local led = self.guiElems[gaugeName].leds[ledName]
if led.elem then
led.elem.destroy()
end
if on then
local fullName = gaugeName .. "_led_" .. ledName
led.elem = self.guiElems[gaugeName].leds.root.add
{
type = "sprite",
name = self.prefix .. fullName,
sprite = "heli_" .. fullName,
}
end
led.on = on
end,
setLedBlinking = function(self, gaugeName, ledName, on, interval, sound)
local led = self.guiElems[gaugeName].leds[ledName]
if not on then
led.sound = nil
if led.blinkInterval then
led.blinkInterval:cancel()
led.blinkInterval = nil
self:setLed("gauge_fs", "fuel", false)
end
else
led.sound = sound
if not led.blinkInterval then
led.blinkInterval = setInterval(function(timer)
local gg = timer.data.gg
local _led = timer.data.led
if not gg.valid then
timer:cancel()
else
gg:setLed("gauge_fs", "fuel", not _led.on)
if _led.sound and (not gg.muted) and gg.player.mod_settings["heli-gaugeGui-play-fuel-warning-sound"].value then
gg.player.play_sound{path = _led.sound}
end
end
end, interval, {gg = self, led = led})
else
led.blinkInterval.interval = interval
end
end
end,
setPointerNoise = function(self, gaugeName, pointerName, enable, magnitude, timeAdvance, minFrequency, maxFrequency)
local pointer = self.guiElems[gaugeName].pointers[pointerName]
if enable then
pointer.noise = simpleNoise.new(magnitude, timeAdvance, minFrequency, maxFrequency)
else
pointer.noise = nil
end
end,
buildGauge = function(self, parent, name, pointerNames, ledNames)
local gauge =
{
elem = parent.add
{
type = "sprite",
name = self.prefix .. name,
sprite = "heli_" .. name,
},
pointers = {},
}
gauge.leds =
{
root = gauge.elem.add
{
type = "sprite",
name = self.prefix .. name .. "_ledRoot",
sprite = "heli_void_128",
},
}
for k,v in pairs(pointerNames or {}) do
gauge.pointers[v] =
{
root = gauge.elem.add
{
type = "sprite",
name = self.prefix .. name .. "_pointer_" .. v .. "_root",
sprite = "heli_void_128",
}
}
end
for k,v in pairs(ledNames or {}) do
gauge.leds[v] = {}
end
return gauge
end,
buildGui = function(self)
local els = self.guiElems
els.root = els.parent.add
{
type = "frame",
name = self.prefix .. "rootFrame",
style = "frame",
tooltip = {"heli-gui-gauges-tt"},
}
els.gauge_fs = self:buildGauge(els.root, "gauge_fs", {"fuel", "speed"}, {"fuel"})
els.gauge_hr = self:buildGauge(els.root, "gauge_hr", {"height", "rpm"})
els.gauge_hr.speakerButtonFlow = els.root.add
{
type = "flow",
name = self.prefix .. "speakerButtonFlow",
direction = "horizontal",
tooltip = {"heli-gui-gauges-tt"},
}
self:setMuted(Entity.get_data(self.player, "gaugeGui_muted"))
self:setGauge("gauge_fs", "fuel", self.pointerData.fuel.min)
self:setGauge("gauge_fs", "speed", self.pointerData.speed.min)
self:setGauge("gauge_hr", "height", self.pointerData.height.min)
self:setGauge("gauge_hr", "rpm", self.pointerData.rpm.min)
end,
}
mtMgr.assign("gaugeGui", {__index = gaugeGui})