112 lines
3.1 KiB
Lua
112 lines
3.1 KiB
Lua
TOOL.Category = 'octolib'
|
||
TOOL.Name = 'Advanced Remover'
|
||
|
||
TOOL.Information = {
|
||
{ name = 'left' },
|
||
{ name = 'right' },
|
||
}
|
||
|
||
octolib.vars.init('tools.advremover.radius', 100)
|
||
octolib.vars.init('tools.advremover.own', true)
|
||
octolib.vars.init('tools.advremover.ignoreWeapons', true)
|
||
|
||
local function DoRemoveEntity(ent)
|
||
|
||
if (!IsValid(ent) || ent:IsPlayer()) then return false end
|
||
|
||
-- Nothing for the client to do here
|
||
if (CLIENT) then return true end
|
||
|
||
-- Remove all constraints (this stops ropes from hanging around)
|
||
constraint.RemoveAll(ent)
|
||
|
||
-- Remove it properly in 1 second
|
||
timer.Simple(1, function() if (IsValid(ent)) then ent:Remove() end end)
|
||
|
||
-- Make it non solid
|
||
ent:SetNotSolid(true)
|
||
ent:SetMoveType(MOVETYPE_NONE)
|
||
ent:SetNoDraw(true)
|
||
|
||
-- Send Effect
|
||
local ed = EffectData()
|
||
ed:SetOrigin(ent:GetPos())
|
||
ed:SetEntity(ent)
|
||
util.Effect('entity_remove', ed, true, true)
|
||
|
||
return true
|
||
|
||
end
|
||
|
||
local ignoreClasses = octolib.array.toKeys{ 'player', 'predicted_viewmodel' }
|
||
|
||
function TOOL:LeftClick(trace)
|
||
|
||
if SERVER then
|
||
local ply = self:GetOwner()
|
||
ply:GetClientVar({
|
||
'tools.advremover.radius',
|
||
'tools.advremover.own',
|
||
'tools.advremover.ignoreWeapons',
|
||
}, function(vars)
|
||
for _, ent in ipairs(ents.FindInSphere(trace.HitPos, math.Clamp(vars['tools.advremover.radius'], 1, 1000))) do
|
||
if hook.Run('CanTool', ply, octolib.entity.dummyTrace(ent), 'advremover') == false then continue end
|
||
if ignoreClasses[ent:GetClass()] then continue end
|
||
if vars['tools.advremover.own'] and ent:CPPIGetOwner() ~= ply then continue end
|
||
if vars['tools.advremover.ignoreWeapons'] and ent:IsWeapon() and IsValid(ent:GetOwner()) then continue end
|
||
|
||
DoRemoveEntity(ent)
|
||
end
|
||
end)
|
||
end
|
||
|
||
return true
|
||
|
||
end
|
||
|
||
local enabled = false
|
||
function TOOL:RightClick()
|
||
|
||
if SERVER or not IsFirstTimePredicted() then return end
|
||
|
||
enabled = not enabled
|
||
|
||
if enabled then
|
||
hook.Add('PostDrawTranslucentRenderables', 'octolib.advremover', function()
|
||
local pos = LocalPlayer():GetEyeTrace().HitPos
|
||
if not pos then return end
|
||
|
||
local r = octolib.vars.get('tools.advremover.radius')
|
||
local steps = math.Clamp(math.floor(math.pow(r, 0.5)), 6, 50)
|
||
|
||
render.DrawWireframeSphere(pos, r, steps, steps, ColorAlpha(color_white, 10))
|
||
render.DrawWireframeSphere(pos, r, steps, steps, color_white, true)
|
||
end)
|
||
else
|
||
hook.Remove('PostDrawTranslucentRenderables', 'octolib.advremover')
|
||
end
|
||
|
||
end
|
||
|
||
function TOOL:Holster()
|
||
|
||
if SERVER then return end
|
||
|
||
hook.Remove('PostDrawTranslucentRenderables', 'octolib.advremover')
|
||
|
||
end
|
||
|
||
function TOOL:BuildCPanel()
|
||
|
||
octolib.vars.slider(self, 'tools.advremover.radius', 'Радиус', 1, 1000, 0)
|
||
octolib.vars.checkBox(self, 'tools.advremover.own', 'Только мои энтити')
|
||
octolib.vars.checkBox(self, 'tools.advremover.ignoreWeapons', 'Игнорировать оружие в руках')
|
||
|
||
end
|
||
|
||
if CLIENT then
|
||
language.Add('Tool.advremover.name', 'Advanced Remover')
|
||
language.Add('Tool.advremover.desc', 'Удалитель с плюшками')
|
||
language.Add('Tool.advremover.left', 'Удалить в радиусе')
|
||
language.Add('Tool.advremover.left', 'Включить предпросмотр зоны')
|
||
end
|