108 lines
3.1 KiB
Lua
108 lines
3.1 KiB
Lua
AddCSLuaFile()
|
|
DEFINE_BASECLASS( "base_wire_entity" )
|
|
ENT.PrintName = "Wire Nailer"
|
|
ENT.RenderGroup = RENDERGROUP_BOTH
|
|
ENT.WireDebugName = "Nailer"
|
|
|
|
function ENT:SetupDataTables()
|
|
self:NetworkVar( "Float", 0, "BeamLength" )
|
|
self:NetworkVar( "Bool", 0, "ShowBeam" )
|
|
end
|
|
|
|
if CLIENT then return end -- No more client
|
|
|
|
function ENT:Initialize()
|
|
self:PhysicsInit( SOLID_VPHYSICS )
|
|
self:SetMoveType( MOVETYPE_VPHYSICS )
|
|
self:SetSolid( SOLID_VPHYSICS )
|
|
self.Inputs = WireLib.CreateInputs(self, { "Weld", "Axis", "Ballsocket" })
|
|
self:SetBeamLength(2048)
|
|
end
|
|
|
|
function ENT:Setup(flim, Range, ShowBeam)
|
|
self.Flim = math.Clamp(flim, 0, 10000)
|
|
if Range then self:SetBeamLength(Range) end
|
|
if ShowBeam ~= nil then self:SetShowBeam(ShowBeam) end
|
|
self:ShowOutput()
|
|
end
|
|
|
|
function ENT:CanNail(trace)
|
|
-- Bail if we hit world or a player
|
|
if not IsValid(trace.Entity) or trace.Entity:IsPlayer() then return false end
|
|
-- If there's no physics object then we can't constraint it!
|
|
if not util.IsValidPhysicsObject(trace.Entity, trace.PhysicsBone) then return false end
|
|
-- The nailer tool no longer exists, but we ask for permission under its name anyway
|
|
if hook.Run( "CanTool", self:GetPlayer(), trace, "nailer" ) == false then return false end
|
|
return true
|
|
end
|
|
|
|
function ENT:TriggerInput(name, value)
|
|
if value == 0 then return end
|
|
|
|
local up = self:GetUp()
|
|
|
|
local trace1 = util.TraceLine( {
|
|
start = self:GetPos(),
|
|
endpos = self:GetPos() + up * self:GetBeamLength(),
|
|
filter = { self }
|
|
} )
|
|
|
|
if not self:CanNail( trace1 ) then return end
|
|
|
|
local trace2 = util.TraceLine( {
|
|
start = trace1.HitPos,
|
|
endpos = trace1.HitPos + up * 50,
|
|
filter = { trace1.Entity, self }
|
|
} )
|
|
|
|
if not self:CanNail( trace2 ) then return end
|
|
|
|
if name == "Weld" then
|
|
constraint.Weld( trace1.Entity,
|
|
trace2.Entity,
|
|
trace1.PhysicsBone,
|
|
trace2.PhysicsBone,
|
|
self.Flim
|
|
)
|
|
elseif name == "Axis" then
|
|
local phys1 = trace1.Entity:GetPhysicsObject()
|
|
local phys2 = trace2.Entity:GetPhysicsObject()
|
|
if not IsValid( phys1 ) or not IsValid( phys2 ) then return end
|
|
|
|
local LPos1 = phys1:WorldToLocal( trace2.HitPos + trace2.HitNormal )
|
|
local LPos2 = phys2:WorldToLocal( trace2.HitPos )
|
|
|
|
constraint.Axis( trace1.Entity,
|
|
trace2.Entity,
|
|
trace1.PhysicsBone,
|
|
trace2.PhysicsBone,
|
|
LPos1, LPos2,
|
|
self.Flim
|
|
)
|
|
elseif name == "Ballsocket" then
|
|
constraint.Ballsocket( trace1.Entity,
|
|
trace2.Entity,
|
|
trace1.PhysicsBone,
|
|
trace2.PhysicsBone,
|
|
trace2.Entity:WorldToLocal(trace1.HitPos),
|
|
self.Flim
|
|
)
|
|
end
|
|
|
|
-- effect on weld (tomb332)
|
|
local effectdata = EffectData()
|
|
effectdata:SetOrigin( trace2.HitPos )
|
|
effectdata:SetNormal( trace1.HitNormal )
|
|
effectdata:SetMagnitude( 5 )
|
|
effectdata:SetScale( 1 )
|
|
effectdata:SetRadius( 10 )
|
|
util.Effect( "Sparks", effectdata, false, true )
|
|
end
|
|
|
|
function ENT:ShowOutput()
|
|
self:SetOverlayText(string.format( "Range: %s\nForce limit: %s", math.Round(self:GetBeamLength(),2), math.Round(self.Flim,2) ))
|
|
end
|
|
|
|
WireLib.AddInputAlias( "A", "Weld" )
|
|
|
|
duplicator.RegisterEntityClass("gmod_wire_nailer", WireLib.MakeWireEnt, "Data", "Flim", "Range", "ShowBeam")
|