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

211 lines
6.5 KiB
Lua

WireToolSetup.setCategory( "Physics/Constraints" )
WireToolSetup.open( "hydraulic", "Hydraulic", "gmod_wire_hydraulic", nil, "Hydraulics" )
TOOL.ClientConVar = {
material = "cable/rope",
width = "3",
speed = "16",
model = "models/beer/wiremod/hydraulic.mdl",
modelsize = "",
fixed = "0",
stretchonly = "0",
}
if CLIENT then
language.Add( "Tool.wire_hydraulic.name", "Hydraulic Tool (Wire)" )
language.Add( "Tool.wire_hydraulic.desc", "Makes a controllable hydraulic" )
language.Add( "Tool.wire_hydraulic.stretchonly", "Winch Mode (Stretch Only)" )
language.Add( "Tool.wire_hydraulic.stretchonly.help", "If this isn't enabled then it acts like a spring, pushing away the objects as they move closer." )
language.Add( "Tool.wire_hydraulic.width", "Width:" )
language.Add( "Tool.wire_hydraulic.material", "Material:" )
language.Add( "Tool.wire_hydraulic.fixed", "Fixed" )
language.Add( "Tool.wire_hydraulic.speed", "In/Out Speed Mul" )
TOOL.Information = {
{ name = "left_0", stage = 0, text = "Place hydraulic" },
{ name = "right_0", stage = 0, text = "Place hydraulic along the hit normal" },
{ name = "left_1", stage = 1, text = "Choose the second point" },
{ name = "left_2", stage = 2, text = "Place the controller" },
}
end
WireToolSetup.BaseLang()
WireToolSetup.SetupMax(16)
if SERVER then
function TOOL:MakeEnt(ply, model, Ang, trace)
return MakeWireHydraulicController(ply, trace.HitPos, Ang, model, nil, self.constraint, self.rope)
end
end
function TOOL:GetConVars()
return self:GetClientInfo( "material" ) or "cable/rope",
self:GetClientNumber("width", 3),
self:GetClientNumber("speed", 16),
self:GetClientNumber("fixed", 0),
self:GetClientNumber("stretchonly", 0) ~= 0
end
function TOOL:LeftClick_Update( trace )
local const = trace.Entity.constraint
if IsValid( const ) then
-- Don't remove the controller when the constraint is removed
const:DontDeleteOnRemove( trace.Entity )
if IsValid(trace.Entity.rope) then trace.Entity.rope:DontDeleteOnRemove( trace.Entity ) end
-- Get constraint info
local tbl = const:GetTable()
-- Remove constraint
const:Remove()
-- Get convars
local material, width, speed, fixed, stretchonly = self:GetConVars()
-- Make new constraint, at the old constraint's position, but with the new convar settings
local const, rope = MakeWireHydraulic( self:GetOwner(),
tbl.Ent1, tbl.Ent2,
tbl.Bone1, tbl.Bone2,
tbl.LPos1, tbl.LPos2,
width, material, speed, fixed, stretchonly )
-- Set the new references
const.MyCrtl = trace.Entity:EntIndex()
trace.Entity:SetConstraint( const )
trace.Entity:DeleteOnRemove( const )
if rope then
trace.Entity:SetRope( rope )
trace.Entity:DeleteOnRemove( rope )
end
end
end
function TOOL:LeftClick( trace )
if not trace.Hit or ( trace.Entity:IsValid() and trace.Entity:IsPlayer() ) then return end
if ( SERVER and not util.IsValidPhysicsObject( trace.Entity, trace.PhysicsBone ) ) then return false end
local iNum = self:NumObjects()
-- Update existing constraint
if self:CheckHitOwnClass( trace ) and iNum == 0 then
if SERVER then
self:LeftClick_Update( trace )
end
return true
end
local Phys = trace.Entity:GetPhysicsObjectNum( trace.PhysicsBone )
self:SetObject( iNum + 1, trace.Entity, trace.HitPos, Phys, trace.PhysicsBone, trace.HitNormal )
if ( iNum > 1 ) then
if ( CLIENT ) then
self:ClearObjects()
return true
end
local ply = self:GetOwner()
local const, rope = self.constraint, self.rope
if not IsValid(const) then
WireLib.AddNotify(self:GetOwner(), "Wire Hydraulic Invalid!", NOTIFY_GENERIC, 7)
self:ClearObjects()
self:SetStage(0)
return
end
local controller = self:LeftClick_Make(trace, ply)
if isbool(controller) then return controller end
self:LeftClick_PostMake(controller, ply, trace)
if controller then
controller:DeleteOnRemove(const)
if rope then controller:DeleteOnRemove( rope ) end
end
self:ClearObjects()
self:SetStage(0)
elseif ( iNum == 1 ) then
if CLIENT then return true end
-- Get client's CVars
local material, width, speed, fixed, stretchonly = self:GetConVars()
-- Get information we're about to use
local Ent1, Ent2 = self:GetEnt(1), self:GetEnt(2)
local Bone1, Bone2 = self:GetBone(1), self:GetBone(2)
local LPos1, LPos2 = self:GetLocalPos(1),self:GetLocalPos(2)
local const, rope = MakeWireHydraulic(self:GetOwner(), Ent1, Ent2, Bone1, Bone2, LPos1, LPos2, width, material, speed, fixed, stretchonly)
if not IsValid(const) then
WireLib.AddNotify(self:GetOwner(), "Wire Hydraulic Invalid!", NOTIFY_GENERIC, 7)
self:ClearObjects()
self:SetStage(0)
return
end
self.constraint, self.rope = const,rope
undo.Create(self.WireClass)
undo.AddEntity(const)
if rope then undo.AddEntity(rope) end
undo.SetPlayer(self:GetOwner())
undo.Finish()
self:GetOwner():AddCleanup("ropeconstraints", const)
if rope then self:GetOwner():AddCleanup("ropeconstraints", rope) end
self:SetStage(2)
else
self:SetStage( iNum+1 )
end
return true
end
function TOOL:RightClick( trace )
if self:NumObjects() > 1 then
if not IsValid(self.constraint) then
self:ClearObjects()
self:SetStage(0)
else
return false
end
end
local tr = {}
tr.start = trace.HitPos
tr.endpos = tr.start + (trace.HitNormal * 16384)
tr.filter = {self:GetOwner()}
if IsValid(trace.Entity) then
tr.filter[2] = trace.Entity
end
local trace2 = util.TraceLine( tr )
if not hook.Run( "CanTool", self:GetOwner(), trace2, "wire_hydraulic" ) then return false end
return self:LeftClick(trace) and self:LeftClick(trace2)
end
function TOOL:Reload( trace )
if not IsValid(trace.Entity) or trace.Entity:IsPlayer() then return false end
if CLIENT then return true end
return constraint.RemoveConstraints( trace.Entity, "WireHydraulic" )
end
function TOOL:Think()
-- Disable ghost when making the constraint
if self:GetStage() == 2 then
WireToolObj.Think(self)
end
end
function TOOL.BuildCPanel(panel)
WireToolHelpers.MakeModelSizer(panel, "wire_hydraulic_modelsize")
WireDermaExts.ModelSelect(panel, "wire_hydraulic_model", list.Get( "Wire_Hydraulic_Models" ), 1, true)
panel:CheckBox("#Tool.wire_hydraulic.stretchonly","wire_hydraulic_stretchonly")
panel:ControlHelp("#Tool.wire_hydraulic.stretchonly.help")
panel:CheckBox("#Tool.wire_hydraulic.fixed","wire_hydraulic_fixed")
panel:NumSlider("#Tool.wire_hydraulic.speed","wire_hydraulic_speed",4,120,0)
panel:NumSlider("#Tool.wire_hydraulic.width","wire_hydraulic_width",1,20,2)
panel:AddControl( "RopeMaterial", { Label = "#Tool.wire_hydraulic.material", convar = "wire_hydraulic_material" } )
end