Starbound/assets/devel/objects/pump/pump.lua
2025-03-21 22:23:30 +11:00

56 lines
1.6 KiB
Lua

require "/scripts/vec2.lua"
function init()
self.inputPosition = config.getParameter("inputPosition")
self.outputPosition = config.getParameter("outputPosition")
if object.direction() < 0 then
self.inputPosition, self.outputPosition = self.outputPosition, self.inputPosition
end
local pos = entity.position()
self.inputPosition = vec2.add(vec2.add(self.inputPosition, pos), {0.5, 0.5})
self.outputPosition = vec2.add(vec2.add(self.outputPosition, pos), {0.5, 0.5})
self.pumpTimer = 0
self.pumpFrequency = config.getParameter("pumpFrequency", 0.25)
storage.pumping = storage.pumping or false
end
function update(dt)
-- world.debugPoint(self.inputPosition, "blue")
-- world.debugPoint(self.outputPosition, "green")
if object.isInputNodeConnected(0) then
object.setInteractive(false)
storage.pumping = object.getInputNodeLevel(0)
else
object.setInteractive(true)
end
local pumpAnimationState = storage.pumping and ((world.liquidAt(self.inputPosition) and not world.pointCollision(self.outputPosition)) and "pump" or "error") or "idle"
animator.setAnimationState("pumping", pumpAnimationState)
self.pumpTimer = math.max(0, self.pumpTimer - dt)
if storage.pumping and self.pumpTimer == 0 then
pump()
self.pumpTimer = self.pumpFrequency
end
end
function onInteraction(args)
storage.pumping = not storage.pumping
end
function uninit()
end
function pump()
local liquid = world.liquidAt(self.inputPosition)
if liquid and not world.pointCollision(self.outputPosition) then
world.destroyLiquid(self.inputPosition)
world.spawnLiquid(self.outputPosition, table.unpack(liquid))
end
end