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

78 lines
2.4 KiB
Lua

WireToolSetup.setCategory( "Physics" )
WireToolSetup.open( "spawner", "Prop Spawner", "gmod_wire_spawner", nil, "Prop Spawners" )
TOOL.ClientConVar = {
delay = 0,
undo_delay = 0,
spawn_effect = 0,
}
if CLIENT then
language.Add( "Tool.wire_spawner.name", "Prop Spawner (Wire)" )
language.Add( "Tool.wire_spawner.desc", "Spawns a prop at a pre-defined location" )
TOOL.Information = { { name = "left", text = "Click a prop to turn it into a " .. TOOL.Name } }
end
WireToolSetup.BaseLang()
WireToolSetup.SetupMax(10)
function TOOL:LeftClick(trace)
local ent = trace.Entity
if !ent or !ent:IsValid() then return false end
if ent:GetClass() != "prop_physics" && ent:GetClass() != "gmod_wire_spawner" then return false end
if CLIENT then return true end
local pl = self:GetOwner()
local delay = self:GetClientNumber("delay", 0)
local undo_delay = self:GetClientNumber("undo_delay", 0)
local spawn_effect = self:GetClientNumber("spawn_effect", 0)
// In multiplayer we clamp the delay to help prevent people being idiots
if !game.SinglePlayer() and delay < 0.1 then
delay = 0.1
end
if ent:GetClass() == "gmod_wire_spawner" then
ent:Setup(delay, undo_delay, spawn_effect)
return true
end
if !self:GetSWEP():CheckLimit("wire_spawners") then return false end
local phys = ent:GetPhysicsObject()
if !phys:IsValid() then return false end
local model = ent:GetModel()
local frozen = not phys:IsMoveable()
local Pos = ent:GetPos()
local Ang = ent:GetAngles()
local mat = ent:GetMaterial()
local c = ent:GetColor()
local skin = ent:GetSkin() or 0
local preserveMotion = phys:IsMotionEnabled()
local wire_spawner = WireLib.MakeWireEnt(pl, {Class = self.WireClass, Pos=Pos, Angle=Ang, Model=model}, delay, undo_delay, spawn_effect, mat, c.r, c.g, c.b, c.a, skin)
if !wire_spawner:IsValid() then return end
local physObj = wire_spawner:GetPhysicsObject()
if IsValid( physObj ) then
physObj:EnableMotion( preserveMotion )
end
ent:Remove()
undo.Create("gmod_wire_spawner")
undo.AddEntity( wire_spawner )
undo.SetPlayer( pl )
undo.Finish()
return true
end
function TOOL:Think() end -- Disable ghost
function TOOL.BuildCPanel( panel )
WireToolHelpers.MakePresetControl(panel, "wire_spawner")
panel:NumSlider("#Spawn Delay", "wire_spawner_delay", 0.1, 100, 2)
panel:NumSlider("#Automatic Undo Delay", "wire_spawner_undo_delay", 0.1, 100, 2)
panel:CheckBox("#Prop spawn effect", "wire_spawner_spawn_effect")
end