Files
PlaneBuilding/scripts/modules/objects/Engine.lua
T

122 lines
3.7 KiB
Lua

local module = {}
local function rpm(rot)
return (rot/(math.pi*2))*60
end
local function rot(hinge)
return hinge.CFrame.Rotation:PointToObjectSpace(hinge.AssemblyAngularVelocity).Magnitude
end
function module.new(this,engine,context)
this.powered = _G.GetValue(engine,"Powered",true)
this.inverted = _G.GetInstance(engine,"Inverted")
this.speed = _G.GetInstance(engine,"Speed")
this.rotor = _G.GetInstance(engine,"Hinge")
this.hinge = _G.GetInstance(engine,"HingeConstraint")
this.rotor_sound = this.rotor:FindFirstChild("RotorSound")
this.starter_sound = this.rotor:FindFirstChild("Starter")
this.starter_ratio = engine:GetAttribute("StarterRatio") or 1
if this.powered then
this.hinge.ActuatorType = Enum.ActuatorType.Motor
else
this.hinge.ActuatorType = Enum.ActuatorType.None
end
this.hinge.LimitsEnabled = false
this.torque = engine:GetScale() * 100000
return this
end
function module.idle(this,engine) return true end
local begin = tick()
module.run = _G.Protect(function(this,engine,context)
local throttle = this.throttle or context.controls[_G.GetValue(engine,"Binding","throttle")] or this.Throttle or 0
if this.inverted.Value then throttle = throttle * -1 end
local starter = math.abs(throttle) > 0.1
local target_speed = this.speed.Value * throttle
local current_speed = rot(this.rotor)
local accel
if math.abs(current_speed) > this.speed.Value * 0.1 then
-- Running
starter = false
accel = 40
else
-- Starting
accel = 40 * this.starter_ratio --this.torque * (math.clamp(math.noise(0.123,0.456,(begin-tick())*0.5),0,1) + 0.5) * 0.2
end
this.hinge.MotorMaxAcceleration = accel
if math.abs(throttle) > 0.05 then
this.hinge.AngularVelocity = target_speed
else
this.hinge.AngularVelocity = 0
end
if not this.torque then print(this) return false end
this.hinge.MotorMaxTorque = this.torque * ((engine:GetAttribute("Health") or 1) / (engine:GetAttribute("MaxHealth") or 1)) * (1/(this.speed.Value + 1)) * 60
context.replicate(this,engine,module,{Throttle = throttle, Starter = starter})
return true
end)
local legal_detail = {
Throttle = true,
Mixture = true,
Temperature = true,
Oil = true,
Air = true,
Fuel = true,
Coolant = true,
Power = true
}
module.replication_delta = 0.25
function module.replicate(this,engine,context,details)
for index,item in pairs(details) do
if legal_detail[index] then
this[index] = item
engine:SetAttribute(index,item)
end
end
local speed = math.abs(rot(this.rotor))
if details.Starter then
-- Starter on
if this.starter_sound then if not this.starter_sound.Playing then this.starter_sound:Play() end end
if this.rotor_sound then if this.rotor_sound.Playing then this.rotor_sound:Pause() end end
elseif speed > this.speed.Value * 0.1 then
-- Running
if this.rotor_sound then
if not this.rotor_sound.Playing then this.rotor_sound:Play() end
_G.Print(engine,this.rotor_sound.PlaybackSpeed,speed,this.speed.Value/60)
this.rotor_sound.PlaybackSpeed = math.clamp(math.abs(speed/150) * 1.5,0.5,1.5)
this.rotor_sound.Volume = math.clamp(math.abs(speed/150) * 0.05 + 0.05,0,0.1)
end
if this.starter_sound then if this.starter_sound.Playing then this.starter_sound:Stop() end end
else
if this.rotor_sound then if this.rotor_sound.Playing then this.rotor_sound:Stop() end end
if this.starter_sound then if this.starter_sound.Playing then this.starter_sound:Stop() end end
end
end
module.messages = {
control = function(this,object,context,value)
this.throttle = value
end,
starter = function(this,object,context,value)
this.starter = value
end,
}
module.messages.default = module.messages.control
module.manifest = {
"Engine",
"Engine2",
"BigEngine",
"BigRadial",
"Radial",
"Jet",
"Motor",
"Motor1",
"BigSpinWheel",
"SpinWheel"
}
return module