local M = {} local camNode = 0 local volume, pitch = 3, 1 local fuelChimePlayed = false local tireChimePlayed = false local lastFuelLevel = 1 local lowFuelThreshold = 0.1 local lowTirePressureThreshold = 15 -- psi local spawnedRecently = true local spawnTimer = 0 local spawnCooldown = 1.5 -- seconds -- Check if camera is inside (driver view) local function inside() local cam = obj:getCameraPosition() local seat = obj:getPosition() + obj:getNodePosition(camNode) return cam and seat and cam:distance(seat) <= 0.6 end -- Determine if a tire is flat, destroyed, low pressure, or broken local function isTireBad(wheel) if not wheel then return false end return wheel.tireState == "deflated" or wheel.tireState == "destroyed" or (wheel.pressure or 999) < lowTirePressureThreshold or wheel.isBroken == true end local function update(dt) -- Delay after spawn/reset if spawnedRecently then spawnTimer = spawnTimer + dt if spawnTimer >= spawnCooldown then spawnedRecently = false else return end end if not inside() then return end -- Fuel chime logic local fuelLevel = electrics.values.fuel or 1 if not fuelChimePlayed and lastFuelLevel >= lowFuelThreshold and fuelLevel < lowFuelThreshold then obj:playSFXOnce("VivacedoorChime.wav", camNode, volume, pitch) fuelChimePlayed = true end lastFuelLevel = fuelLevel -- Tire check across all wheels local anyTireBad = false for i = 0, 3 do local wheel = wheels.wheels[i] if isTireBad(wheel) then anyTireBad = true break end end if anyTireBad and not tireChimePlayed then obj:playSFXOnce("VivacedoorChime.wav", camNode, volume, pitch) tireChimePlayed = true end end local function init() camNode = beamstate and beamstate.nodeNameMap and beamstate.nodeNameMap["driver"] or 0 obj:createSFXSource("/art/sound/vivace/VivacedoorChime.wav", "Audio2D", "VivacedoorChime.wav", -1) fuelChimePlayed = false tireChimePlayed = false lastFuelLevel = electrics.values.fuel or 1 spawnedRecently = true spawnTimer = 0 end local function onReset() fuelChimePlayed = false tireChimePlayed = false lastFuelLevel = electrics.values.fuel or 1 spawnedRecently = true spawnTimer = 0 end M.onInit = init M.onReset = onReset M.updateGFX = update return M