dobrograd-13-06-2022/garrysmod/addons/feature-wire/lua/wire/stools/wheel.lua
Jonny_Bro (Nikita) e4d5311906 first commit
2023-11-16 15:01:19 +05:00

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