114 lines
4.6 KiB
Lua
114 lines
4.6 KiB
Lua
WireToolSetup.setCategory( "Physics/Force" )
|
|
WireToolSetup.open( "wheel", "Wheel", "gmod_wire_wheel", nil, "Wheels" )
|
|
|
|
if CLIENT then
|
|
language.Add( "tool.wire_wheel.name", "Wheel Tool (wire)" )
|
|
language.Add( "tool.wire_wheel.desc", "Attaches a wheel to something." )
|
|
TOOL.Information = { { name = "left", text = "Attach a wheel" } }
|
|
|
|
language.Add( "tool.wire_wheel.group", "Input value to go forward:" )
|
|
language.Add( "tool.wire_wheel.group_reverse", "Input value to go in reverse:" )
|
|
language.Add( "tool.wire_wheel.group_stop", "Input value for no acceleration:" )
|
|
language.Add( "tool.wire_wheel.group_desc", "All these values need to be different." )
|
|
end
|
|
WireToolSetup.BaseLang()
|
|
WireToolSetup.SetupMax( 30 )
|
|
|
|
TOOL.ClientConVar = {
|
|
torque = 3000,
|
|
friction = 1,
|
|
nocollide = 1,
|
|
forcelimit = 0,
|
|
fwd = 1, -- Forward
|
|
bck = -1, -- Back
|
|
stop = 0, -- Stop
|
|
}
|
|
|
|
if SERVER then
|
|
function TOOL:GetConVars()
|
|
return self:GetClientNumber( "fwd" ), self:GetClientNumber( "bck" ), self:GetClientNumber( "stop" ), self:GetClientNumber( "torque" )
|
|
end
|
|
|
|
function TOOL:MakeEnt( ply, model, Ang, trace )
|
|
local targetPhys = trace.Entity:GetPhysicsObjectNum( trace.PhysicsBone )
|
|
|
|
-- Get client's CVars
|
|
local friction = self:GetClientNumber( "friction" )
|
|
local nocollide = self:GetClientNumber( "nocollide" )
|
|
local limit = self:GetClientNumber( "forcelimit" )
|
|
|
|
local fwd,bck,stop,torque = self:GetConVars() -- These are the ones used in Setup
|
|
if fwd == stop or bck == stop or fwd == bck then return false end
|
|
|
|
-- Create the wheel
|
|
local wheelEnt = WireLib.MakeWireEnt(ply, {Class = self.WireClass, Pos=trace.HitPos, Angle=Ang, Model=model}, fwd, bck, stop, torque )
|
|
self:SetPos( wheelEnt, trace )
|
|
|
|
-- Wake up the physics object so that the entity updates
|
|
wheelEnt:GetPhysicsObject():Wake()
|
|
|
|
-- Set the hinge Axis perpendicular to the trace hit surface
|
|
local LPos1 = wheelEnt:GetPhysicsObject():WorldToLocal( wheelEnt:GetPos() + trace.HitNormal )
|
|
local LPos2 = targetPhys:WorldToLocal( trace.HitPos )
|
|
|
|
local constraint, axis = constraint.Motor( wheelEnt, trace.Entity, 0, trace.PhysicsBone, LPos1, LPos2, friction, 1000, 0, nocollide, false, ply, limit )
|
|
|
|
undo.Create(self.WireClass)
|
|
undo.AddEntity( axis )
|
|
undo.AddEntity( constraint )
|
|
undo.AddEntity( wheelEnt )
|
|
undo.SetPlayer( ply )
|
|
undo.Finish()
|
|
|
|
ply:AddCleanup( self.WireClass, axis )
|
|
ply:AddCleanup( self.WireClass, constraint )
|
|
ply:AddCleanup( self.WireClass, wheelEnt )
|
|
|
|
--BUGFIX:WIREMOD-11:Deleting prop did not deleting wheels
|
|
wheelEnt:SetWheelBase(trace.Entity)
|
|
|
|
wheelEnt:SetMotor( constraint )
|
|
wheelEnt:SetDirection( constraint.direction )
|
|
wheelEnt:SetAxis( trace.HitNormal )
|
|
wheelEnt:DoDirectionEffect()
|
|
|
|
return wheelEnt
|
|
end
|
|
|
|
function TOOL:LeftClick_PostMake(_, _, _) end -- We're handling this in MakeEnt since theres a motor
|
|
end
|
|
|
|
function TOOL:GetAngle(trace)
|
|
return trace.HitNormal:Angle() + Angle(self:GetOwner():GetInfoNum( "wheel_rx", 0 ), self:GetOwner():GetInfoNum( "wheel_ry", 0 ), self:GetOwner():GetInfoNum( "wheel_rz", 0 ))
|
|
end
|
|
function TOOL:SetPos( ent, trace )
|
|
local wheelOffset = ent:GetPos() - ent:NearestPoint( ent:GetPos() - (trace.HitNormal * 512) )
|
|
ent:SetPos( trace.HitPos + wheelOffset + trace.HitNormal )
|
|
end
|
|
|
|
function TOOL:GetModel()
|
|
local ply = self:GetOwner()
|
|
if self:CheckValidModel(ply:GetInfo("wheel_model")) then --use a valid model or the server crashes :<
|
|
return ply:GetInfo("wheel_model")
|
|
else
|
|
return "models/props_c17/oildrum001.mdl" --use some other random, valid prop instead
|
|
end
|
|
end
|
|
|
|
function TOOL.BuildCPanel( panel )
|
|
WireToolHelpers.MakePresetControl(panel, "wire_wheel")
|
|
panel:NumSlider("#tool.wire_wheel.group", "wire_wheel_fwd", -10, 10, 0)
|
|
panel:NumSlider("#tool.wire_wheel.group_stop", "wire_wheel_stop", -10, 10, 0)
|
|
panel:NumSlider("#tool.wire_wheel.group_reverse", "wire_wheel_bck", -10, 10, 0)
|
|
--WireDermaExts.ModelSelect(panel, "wheel_model", list.Get( "WheelModels" ), 3, true) -- This doesn't seem to set the wheel_rx convars right
|
|
panel:AddControl( "PropSelect", { Label = "#tool.wheel.model",
|
|
ConVar = "wheel_model",
|
|
Category = "Wheels",
|
|
height = 5,
|
|
Models = list.Get( "WheelModels" ) } )
|
|
panel:NumSlider("#tool.wheel.torque", "wire_wheel_torque", 10, 10000, 0)
|
|
panel:NumSlider("#tool.wheel.forcelimit", "wire_wheel_forcelimit", 0, 50000, 0)
|
|
local frictionPanel = panel:NumSlider("#tool.wheel.friction", "wire_wheel_friction", 0, 50, 2)
|
|
frictionPanel:SetTooltip("How quickly the wheel comes to a stop. Note: An existing wheel's friction cannot be updated")
|
|
panel:CheckBox("#tool.wheel.nocollide", "wire_wheel_nocollide")
|
|
end
|