mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-17 13:53:45 +03:00
118 lines
2.9 KiB
Lua
118 lines
2.9 KiB
Lua
|
|
--[[
|
||
|
|
| This file was obtained through the combined efforts
|
||
|
|
| of Madbluntz & Plymouth Antiquarian Society.
|
||
|
|
|
|
||
|
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||
|
|
| Maloy, DrPepper10 @ RIP, Atle!
|
||
|
|
|
|
||
|
|
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||
|
|
--]]
|
||
|
|
|
||
|
|
util.AddNetworkString("pac_to_contraption")
|
||
|
|
|
||
|
|
local receieved = {}
|
||
|
|
|
||
|
|
local function spawn(val,ply)
|
||
|
|
local model = val.mdl
|
||
|
|
|
||
|
|
if not model or model == "" or model:find("\n") or model:find("..", 1, true) then
|
||
|
|
return
|
||
|
|
end
|
||
|
|
|
||
|
|
pace.suppress_prop_spawn = true
|
||
|
|
local ok = hook.Run("PlayerSpawnProp", ply, model)
|
||
|
|
pace.suppress_prop_spawn = false
|
||
|
|
|
||
|
|
if not ok then
|
||
|
|
return
|
||
|
|
end
|
||
|
|
|
||
|
|
local ent = ents.Create("prop_physics")
|
||
|
|
|
||
|
|
SafeRemoveEntity(receieved[val.id])
|
||
|
|
receieved[val.id] = ent
|
||
|
|
|
||
|
|
ent:SetModel(model)-- insecure
|
||
|
|
ent:SetPos(val.pos)-- insecure
|
||
|
|
ent:SetAngles(val.ang)-- insecure
|
||
|
|
ent:SetSkin(val.skn)
|
||
|
|
ent:SetMaterial(val.mat) -- insecure
|
||
|
|
ent:Spawn()
|
||
|
|
ent:SetHealth(9999999)
|
||
|
|
ent:SetColor(val.clr)
|
||
|
|
ent:SetRenderMode( RENDERMODE_TRANSCOLOR )
|
||
|
|
|
||
|
|
hook.Run("PlayerSpawnedProp", ply, model, ent)
|
||
|
|
|
||
|
|
if ent.CPPISetOwner and not (ent:CPPIGetOwner() or NULL):IsValid() then
|
||
|
|
ent:CPPISetOwner(ply)
|
||
|
|
end
|
||
|
|
|
||
|
|
local phys = ent:GetPhysicsObject()
|
||
|
|
|
||
|
|
if phys:IsValid() then
|
||
|
|
phys:EnableMotion(false)
|
||
|
|
|
||
|
|
local maxabs = 150
|
||
|
|
|
||
|
|
val.scale.X = math.Clamp(val.scale.X,-maxabs,maxabs)
|
||
|
|
val.scale.Y = math.Clamp(val.scale.Y,-maxabs,maxabs)
|
||
|
|
val.scale.Z = math.Clamp(val.scale.Z,-maxabs,maxabs)
|
||
|
|
|
||
|
|
for i=0, ent:GetBoneCount()-1 do
|
||
|
|
ent:ManipulateBoneScale( i, val.scale )
|
||
|
|
end
|
||
|
|
|
||
|
|
undo.Create("Prop")
|
||
|
|
undo.SetPlayer(ply)
|
||
|
|
undo.AddEntity(ent)
|
||
|
|
undo.Finish("Prop ("..tostring(model)..")")
|
||
|
|
|
||
|
|
ply:AddCleanup("props", ent)
|
||
|
|
|
||
|
|
gamemode.Call("PlayerSpawnedProp", ply, model, ent)
|
||
|
|
else
|
||
|
|
ent:Remove()
|
||
|
|
end
|
||
|
|
|
||
|
|
end
|
||
|
|
|
||
|
|
local pac_to_contraption_allow = CreateConVar("pac_to_contraption_allow", "1")
|
||
|
|
local max_contraptions = CreateConVar("pac_max_contraption_entities", 60)
|
||
|
|
|
||
|
|
pace.PCallNetReceive(net.Receive, "pac_to_contraption", function(len, ply)
|
||
|
|
if not pac_to_contraption_allow:GetBool() then
|
||
|
|
net.Start("pac_submit_acknowledged")
|
||
|
|
net.WriteBool(false)
|
||
|
|
net.WriteString("This server does not allow spawning PAC contraptions.")
|
||
|
|
net.Send(ply)
|
||
|
|
|
||
|
|
return
|
||
|
|
end
|
||
|
|
|
||
|
|
if len < 64 then return end
|
||
|
|
|
||
|
|
local allowed = pac.RatelimitPlayer( ply, "pac_to_contraption", 5, 1, {"Player ", ply, " is spamming pac_to_contraption!"} )
|
||
|
|
if not allowed then return end
|
||
|
|
|
||
|
|
local data = net.ReadTable()
|
||
|
|
|
||
|
|
local max = max_contraptions:GetInt()
|
||
|
|
local count = table.Count(data)
|
||
|
|
if count > max then
|
||
|
|
net.Start("pac_submit_acknowledged")
|
||
|
|
net.WriteBool(false)
|
||
|
|
net.WriteString("You can only spawn " .. max .. " props at a time!")
|
||
|
|
net.Send(ply)
|
||
|
|
|
||
|
|
pac.Message(ply, " might have tried to crash the server by attempting to spawn ", count, " entities with the contraption system!")
|
||
|
|
return
|
||
|
|
end
|
||
|
|
|
||
|
|
pac.Message("Spawning contraption by ", ply, " with ", count, " entities")
|
||
|
|
|
||
|
|
for key, val in pairs(data) do
|
||
|
|
spawn(val,ply)
|
||
|
|
end
|
||
|
|
end)
|