316 lines
6.4 KiB
Lua
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}) |