-- Controls an elevator on a prismatic joint with two buttons -- The elevator continues at given speed until reaching the joint limit or the timer runs out pTimer = GetFloatParam("timer", 0.5) pSpeed = GetFloatParam("speed", 2.0) downTimer = nil upTimer = nil function init() motor = FindJoint("motor") limitMin, limitMax = GetJointLimits(motor) down = FindShape("down") up = FindShape("up") clickUp = LoadSound("clickup.ogg") clickDown = LoadSound("clickdown.ogg") motorSound = LoadLoop("vehicle/hydraulic-loop.ogg") SetShapeEmissiveScale(down, 0) SetShapeEmissiveScale(up, 0) SetTag(up, "interact", "loc@RAISE_CAR") SetTag(down, "interact", "loc@LOWER_CAR") downPressed = false downTimer = 0 upPressed = false upTimer = 0 end function press(shape) PlaySound(clickDown) local t = GetShapeLocalTransform(shape) t.pos[3] = t.pos[3] - 0.05 SetShapeLocalTransform(shape, t) SetShapeEmissiveScale(shape, 1) end function unpress(shape) PlaySound(clickUp) local t = GetShapeLocalTransform(shape) t.pos[3] = t.pos[3] + 0.05 SetShapeLocalTransform(shape, t) SetShapeEmissiveScale(shape, 0) end function tick(dt) downTimer = downTimer - dt upTimer = upTimer - dt if InputPressed("interact") and not downPressed and not upPressed then if GetPlayerInteractShape() == down then upTimer = 0 downTimer = pTimer downPressed = true press(down) end if GetPlayerInteractShape() == up then downTimer = 0 upTimer = pTimer upPressed = true press(up) end end if downTimer <= 0 then downTimer = 0 if downPressed then unpress(down) end downPressed = false end if upTimer <= 0 then upTimer = 0 if upPressed then unpress(up) end upPressed = false end local eps = 0.01 if downPressed then SetJointMotor(motor, pSpeed) PlayLoop(motorSound) if GetJointMovement(motor) < limitMin+eps then downTimer = 0.0 end elseif upPressed then SetJointMotor(motor, -pSpeed) PlayLoop(motorSound) if GetJointMovement(motor) > limitMax-eps then upTimer = 0.0 end else SetJointMotor(motor, 0.0) end end