mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-16 21:33:46 +03:00
654 lines
14 KiB
Lua
654 lines
14 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/
|
|
--]]
|
|
|
|
if SAM_LOADED then return end
|
|
|
|
local sam, command, language = sam, sam.command, sam.language
|
|
|
|
command.set_category("Fun")
|
|
|
|
do
|
|
local sounds = {}
|
|
for i = 1, 6 do
|
|
sounds[i] = "physics/body/body_medium_impact_hard" .. i .. ".wav"
|
|
end
|
|
|
|
local slap = function(ply, damage, admin)
|
|
if not ply:Alive() or ply:sam_get_nwvar("frozen") then return end
|
|
ply:ExitVehicle()
|
|
|
|
ply:SetVelocity(Vector(math.random(-100, 100), math.random(-100, 100), math.random(200, 400)))
|
|
ply:EmitSound(sounds[math.random(1, 6)], 60, math.random(80, 120))
|
|
|
|
if damage > 0 then
|
|
ply:TakeDamage(damage, admin, DMG_GENERIC)
|
|
end
|
|
end
|
|
|
|
command.new("slap")
|
|
:SetPermission("slap", "admin")
|
|
|
|
:AddArg("player")
|
|
:AddArg("number", {hint = "damage", round = true, optional = true, min = 0, default = 0})
|
|
|
|
:Help("slap_help")
|
|
|
|
:OnExecute(function(ply, targets, damage)
|
|
for i = 1, #targets do
|
|
slap(targets[i], damage, ply)
|
|
end
|
|
|
|
if damage > 0 then
|
|
sam.player.send_message(nil, "slap_damage", {
|
|
A = ply, T = targets, V = damage
|
|
})
|
|
else
|
|
sam.player.send_message(nil, "slap", {
|
|
A = ply, T = targets
|
|
})
|
|
end
|
|
end)
|
|
:End()
|
|
end
|
|
|
|
command.new("slay")
|
|
:SetPermission("slay", "admin")
|
|
|
|
:AddArg("player")
|
|
|
|
:Help("slay_help")
|
|
|
|
:OnExecute(function(ply, targets)
|
|
for i = 1, #targets do
|
|
local v = targets[i]
|
|
if not v:sam_get_exclusive(ply) then
|
|
v:Kill()
|
|
end
|
|
end
|
|
|
|
sam.player.send_message(nil, "slay", {
|
|
A = ply, T = targets
|
|
})
|
|
end)
|
|
:End()
|
|
|
|
command.new("hp")
|
|
:Aliases("sethp", "health", "sethealth")
|
|
|
|
:SetPermission("hp", "admin")
|
|
|
|
:AddArg("player")
|
|
:AddArg("number", {hint = "amount", min = 1, max = 2147483647, round = true, optional = true, default = 100})
|
|
|
|
:Help("hp_help")
|
|
|
|
:OnExecute(function(ply, targets, amount)
|
|
for i = 1, #targets do
|
|
targets[i]:SetHealth(amount)
|
|
end
|
|
|
|
sam.player.send_message(nil, "set_hp", {
|
|
A = ply, T = targets, V = amount
|
|
})
|
|
end)
|
|
:End()
|
|
|
|
command.new("armor")
|
|
:Aliases("setarmor")
|
|
|
|
:SetPermission("armor", "admin")
|
|
|
|
:AddArg("player")
|
|
:AddArg("number", {hint = "amount", min = 1, max = 2147483647, round = true, optional = true, default = 100})
|
|
|
|
:Help("armor_help")
|
|
|
|
:OnExecute(function(ply, targets, amount)
|
|
for i = 1, #targets do
|
|
targets[i]:SetArmor(amount)
|
|
end
|
|
|
|
sam.player.send_message(nil, "set_armor", {
|
|
A = ply, T = targets, V = amount
|
|
})
|
|
end)
|
|
:End()
|
|
|
|
command.new("ignite")
|
|
:SetPermission("ignite", "admin")
|
|
|
|
:AddArg("player")
|
|
:AddArg("number", {hint = "seconds", optional = true, default = 60, round = true})
|
|
|
|
:Help("ignite_help")
|
|
|
|
:OnExecute(function(ply, targets, length)
|
|
for i = 1, #targets do
|
|
local target = targets[i]
|
|
|
|
if target:IsOnFire() then
|
|
target:Extinguish()
|
|
end
|
|
|
|
target:Ignite(length)
|
|
end
|
|
|
|
sam.player.send_message(nil, "ignite", {
|
|
A = ply, T = targets, V = length
|
|
})
|
|
end)
|
|
:End()
|
|
|
|
command.new("unignite")
|
|
:Aliases("extinguish")
|
|
|
|
:SetPermission("ignite", "admin")
|
|
|
|
:AddArg("player", {optional = true})
|
|
|
|
:Help("unignite_help")
|
|
|
|
:OnExecute(function(ply, targets)
|
|
for i = 1, #targets do
|
|
targets[i]:Extinguish()
|
|
end
|
|
|
|
sam.player.send_message(nil, "unignite", {
|
|
A = ply, T = targets
|
|
})
|
|
end)
|
|
:End()
|
|
|
|
command.new("god")
|
|
:Aliases("invincible")
|
|
|
|
:SetPermission("god", "admin")
|
|
|
|
:AddArg("player", {optional = true})
|
|
|
|
:Help("god_help")
|
|
|
|
:OnExecute(function(ply, targets)
|
|
for i = 1, #targets do
|
|
local target = targets[i]
|
|
target:GodEnable()
|
|
target.sam_has_god_mode = true
|
|
end
|
|
|
|
sam.player.send_message(nil, "god", {
|
|
A = ply, T = targets
|
|
})
|
|
end)
|
|
:End()
|
|
|
|
command.new("ungod")
|
|
:Aliases("uninvincible")
|
|
|
|
:SetPermission("ungod", "admin")
|
|
|
|
:AddArg("player", {optional = true})
|
|
|
|
:Help("ungod_help")
|
|
|
|
:OnExecute(function(ply, targets)
|
|
for i = 1, #targets do
|
|
local target = targets[i]
|
|
target:GodDisable()
|
|
target.sam_has_god_mode = nil
|
|
end
|
|
|
|
sam.player.send_message(nil, "ungod", {
|
|
A = ply, T = targets
|
|
})
|
|
end)
|
|
:End()
|
|
|
|
do
|
|
command.new("freeze")
|
|
:SetPermission("freeze", "admin")
|
|
|
|
:AddArg("player")
|
|
|
|
:Help("freeze_help")
|
|
|
|
:OnExecute(function(ply, targets)
|
|
for i = 1, #targets do
|
|
local v = targets[i]
|
|
v:ExitVehicle()
|
|
if v:sam_get_nwvar("frozen") then
|
|
v:UnLock()
|
|
end
|
|
v:Lock()
|
|
v:sam_set_nwvar("frozen", true)
|
|
v:sam_set_exclusive("frozen")
|
|
end
|
|
|
|
sam.player.send_message(nil, "freeze", {
|
|
A = ply, T = targets
|
|
})
|
|
end)
|
|
:End()
|
|
|
|
command.new("unfreeze")
|
|
:SetPermission("unfreeze", "admin")
|
|
|
|
:AddArg("player", {optional = true})
|
|
|
|
:Help("unfreeze_help")
|
|
|
|
:OnExecute(function(ply, targets)
|
|
for i = 1, #targets do
|
|
local v = targets[i]
|
|
v:UnLock()
|
|
v:sam_set_nwvar("frozen", false)
|
|
v:sam_set_exclusive(nil)
|
|
end
|
|
|
|
sam.player.send_message(nil, "unfreeze", {
|
|
A = ply, T = targets
|
|
})
|
|
end)
|
|
:End()
|
|
|
|
local disallow = function(ply)
|
|
if ply:sam_get_nwvar("frozen") then
|
|
return false
|
|
end
|
|
end
|
|
|
|
for _, v in ipairs({"SAM.CanPlayerSpawn", "CanPlayerSuicide", "CanTool"}) do
|
|
hook.Add(v, "SAM.FreezePlayer." .. v, disallow)
|
|
end
|
|
end
|
|
|
|
command.new("cloak")
|
|
:SetPermission("cloak", "admin")
|
|
|
|
:AddArg("player", {optional = true})
|
|
|
|
:Help("cloak_help")
|
|
|
|
:OnExecute(function(ply, targets)
|
|
for i = 1, #targets do
|
|
targets[i]:sam_cloak()
|
|
end
|
|
|
|
sam.player.send_message(nil, "cloak", {
|
|
A = ply, T = targets
|
|
})
|
|
end)
|
|
:End()
|
|
|
|
command.new("uncloak")
|
|
:SetPermission("uncloak", "admin")
|
|
|
|
:AddArg("player", {optional = true})
|
|
|
|
:Help("uncloak_help")
|
|
|
|
:OnExecute(function(ply, targets)
|
|
for i = 1, #targets do
|
|
targets[i]:sam_uncloak()
|
|
end
|
|
|
|
sam.player.send_message(nil, "uncloak", {
|
|
A = ply, T = targets
|
|
})
|
|
end)
|
|
:End()
|
|
|
|
do
|
|
local jail_props = {
|
|
Vector(0, 0, -5), Angle(90, 0, 0);
|
|
Vector(0, 0, 97), Angle(90, 0, 0);
|
|
|
|
Vector(21, 31, 46), Angle(0, 90, 0);
|
|
Vector(21, -31, 46), Angle(0, 90, 0);
|
|
Vector(-21, 31, 46), Angle(0, 90, 0);
|
|
Vector(-21, -31, 46), Angle(0, 90, 0);
|
|
|
|
Vector(-52, 0, 46), Angle(0, 0, 0);
|
|
Vector(52, 0, 46), Angle(0, 0, 0)
|
|
}
|
|
|
|
local remove_jail = function(ply_jail_props)
|
|
for _, jail_prop in ipairs(ply_jail_props) do
|
|
if IsValid(jail_prop) then
|
|
jail_prop:Remove()
|
|
end
|
|
end
|
|
end
|
|
|
|
local unjail = function(ply)
|
|
if not IsValid(ply) then return end
|
|
if not ply:sam_get_nwvar("jailed") then return end
|
|
|
|
remove_jail(ply.sam_jail_props)
|
|
|
|
ply.sam_jail_props = nil
|
|
ply.sam_jail_pos = nil
|
|
|
|
ply:sam_set_nwvar("jailed", nil)
|
|
ply:sam_set_exclusive(nil)
|
|
|
|
timer.Remove("SAM.Unjail." .. ply:SteamID())
|
|
timer.Remove("SAM.Jail.Watch." .. ply:SteamID())
|
|
end
|
|
|
|
local return_false = function()
|
|
return false
|
|
end
|
|
|
|
local function jail(ply, time)
|
|
if not IsValid(ply) then return end
|
|
if not isnumber(time) or time < 0 then
|
|
time = 0
|
|
end
|
|
|
|
if ply:sam_get_nwvar("frozen") then
|
|
RunConsoleCommand("sam", "unfreeze", "#" .. ply:EntIndex())
|
|
end
|
|
|
|
if not ply:sam_get_nwvar("jailed") or (not ply.sam_jail_props or not IsValid(ply.sam_jail_props[1])) then
|
|
ply:ExitVehicle()
|
|
ply:SetMoveType(MOVETYPE_WALK)
|
|
|
|
ply.sam_jail_pos = ply:GetPos()
|
|
|
|
ply:sam_set_nwvar("jailed", true)
|
|
ply:sam_set_exclusive("in jail")
|
|
|
|
if ply.sam_jail_props then
|
|
for k, v in ipairs(ply.sam_jail_props) do
|
|
if IsValid(v) then
|
|
v:Remove()
|
|
end
|
|
end
|
|
end
|
|
|
|
local ply_jail_props = {}
|
|
for i = 1, #jail_props, 2 do
|
|
local jail_prop = ents.Create("prop_physics")
|
|
jail_prop:SetModel("models/props_building_details/Storefront_Template001a_Bars.mdl")
|
|
jail_prop:SetPos(ply.sam_jail_pos + jail_props[i])
|
|
jail_prop:SetAngles(jail_props[i + 1])
|
|
jail_prop:SetMoveType(MOVETYPE_NONE)
|
|
jail_prop:Spawn()
|
|
jail_prop:GetPhysicsObject():EnableMotion(false)
|
|
jail_prop.CanTool = return_false
|
|
jail_prop.PhysgunPickup = return_false
|
|
jail_prop.jailWall = true
|
|
table.insert(ply_jail_props, jail_prop)
|
|
end
|
|
ply.sam_jail_props = ply_jail_props
|
|
end
|
|
|
|
local steamid = ply:SteamID()
|
|
|
|
if time == 0 then
|
|
timer.Remove("SAM.Unjail." .. steamid)
|
|
else
|
|
timer.Create("SAM.Unjail." .. steamid, time, 1, function()
|
|
if IsValid(ply) then
|
|
unjail(ply)
|
|
end
|
|
end)
|
|
end
|
|
|
|
timer.Create("SAM.Jail.Watch." .. steamid, 0.5, 0, function()
|
|
if not IsValid(ply) then
|
|
return timer.Remove("SAM.Jail.Watch." .. steamid)
|
|
end
|
|
|
|
if ply:GetPos():DistToSqr(ply.sam_jail_pos) > 4900 then
|
|
ply:SetPos(ply.sam_jail_pos)
|
|
end
|
|
|
|
if not IsValid(ply.sam_jail_props[1]) then
|
|
jail(ply, timer.TimeLeft("SAM.Unjail." .. steamid) or 0)
|
|
end
|
|
end)
|
|
end
|
|
|
|
command.new("jail")
|
|
:SetPermission("jail", "admin")
|
|
|
|
:AddArg("player")
|
|
:AddArg("length", {optional = true, default = 0, min = 0})
|
|
:AddArg("text", {hint = "reason", optional = true, default = sam.language.get("default_reason")})
|
|
|
|
:GetRestArgs()
|
|
|
|
:Help("jail_help")
|
|
|
|
:OnExecute(function(ply, targets, length, reason)
|
|
for i = 1, #targets do
|
|
jail(targets[i], length * 60)
|
|
end
|
|
|
|
sam.player.send_message(nil, "jail", {
|
|
A = ply, T = targets, V = sam.format_length(length), V_2 = reason
|
|
})
|
|
end)
|
|
:End()
|
|
|
|
command.new("unjail")
|
|
:SetPermission("unjail", "admin")
|
|
|
|
:AddArg("player", {optional = true})
|
|
|
|
:Help("unjail_help")
|
|
|
|
:OnExecute(function(ply, targets)
|
|
for i = 1, #targets do
|
|
unjail(targets[i])
|
|
end
|
|
|
|
sam.player.send_message(nil, "unjail", {
|
|
A = ply, T = targets
|
|
})
|
|
end)
|
|
:End()
|
|
|
|
sam.hook_first("CanProperty", "SAM.Jail", function(_, property, ent)
|
|
if ent.jailWall and property == "remover" then
|
|
return false
|
|
end
|
|
end)
|
|
|
|
if SERVER then
|
|
hook.Add("PlayerSpawn", "SAM.Jail", function(ply)
|
|
if ply:sam_get_nwvar("jailed") or ply:sam_get_pdata("jailed") then
|
|
if ply.sam_jail_pos then
|
|
ply:SetPos(ply.sam_jail_pos)
|
|
else
|
|
ply:SetPos(ply:sam_get_pdata("jail_pos"))
|
|
jail(ply, ply:sam_get_pdata("jail_time_left"))
|
|
|
|
ply:sam_set_pdata("jailed", nil)
|
|
ply:sam_set_pdata("jail_pos", nil)
|
|
ply:sam_set_pdata("jail_time_left", nil)
|
|
end
|
|
end
|
|
end)
|
|
|
|
hook.Add("PlayerEnteredVehicle", "SAM.Jail", function(ply)
|
|
if ply:sam_get_nwvar("jailed") then
|
|
ply:ExitVehicle()
|
|
end
|
|
end)
|
|
|
|
hook.Add("PlayerDisconnected", "SAM.Jail", function(ply)
|
|
if ply:sam_get_nwvar("jailed") then
|
|
remove_jail(ply.sam_jail_props)
|
|
|
|
ply:sam_set_pdata("jailed", true)
|
|
ply:sam_set_pdata("jail_pos", ply.sam_jail_pos)
|
|
ply:sam_set_pdata("jail_time_left", timer.TimeLeft("SAM.Unjail." .. ply:SteamID()) or 0)
|
|
|
|
timer.Remove("SAM.Unjail." .. ply:SteamID())
|
|
timer.Remove("SAM.Jail.Watch." .. ply:SteamID())
|
|
end
|
|
end)
|
|
end
|
|
|
|
local disallow = function(ply)
|
|
if ply:sam_get_nwvar("jailed") then
|
|
return false
|
|
end
|
|
end
|
|
|
|
for _, v in ipairs({"PlayerNoClip", "SAM.CanPlayerSpawn", "CanPlayerEnterVehicle", "CanPlayerSuicide", "CanTool"}) do
|
|
hook.Add(v, "SAM.Jail", disallow)
|
|
end
|
|
end
|
|
|
|
command.new("strip")
|
|
:SetPermission("strip", "admin")
|
|
|
|
:AddArg("player")
|
|
|
|
:Help("strip_help")
|
|
|
|
:OnExecute(function(ply, targets)
|
|
for i = 1, #targets do
|
|
targets[i]:StripWeapons()
|
|
end
|
|
|
|
sam.player.send_message(nil, "strip", {
|
|
A = ply, T = targets
|
|
})
|
|
end)
|
|
:End()
|
|
|
|
command.new("respawn")
|
|
:SetPermission("respawn", "admin")
|
|
|
|
:AddArg("player", {optional = true})
|
|
|
|
:Help("respawn_help")
|
|
|
|
:OnExecute(function(ply, targets)
|
|
for i = 1, #targets do
|
|
targets[i]:Spawn()
|
|
end
|
|
|
|
sam.player.send_message(nil, "respawn", {
|
|
A = ply, T = targets
|
|
})
|
|
end)
|
|
:End()
|
|
|
|
command.new("setmodel")
|
|
:SetPermission("setmodel", "superadmin")
|
|
|
|
:AddArg("player")
|
|
:AddArg("text", {hint = "model"})
|
|
|
|
:Help("setmodel_help")
|
|
|
|
:OnExecute(function(ply, targets, model)
|
|
for i = 1, #targets do
|
|
targets[i]:SetModel(model)
|
|
end
|
|
|
|
sam.player.send_message(nil, "setmodel", {
|
|
A = ply, T = targets, V = model
|
|
})
|
|
end)
|
|
:End()
|
|
|
|
command.new("giveammo")
|
|
:Aliases("ammo")
|
|
|
|
:SetPermission("giveammo", "superadmin")
|
|
|
|
:AddArg("player")
|
|
:AddArg("number", {hint = "amount", min = 0, max = 99999})
|
|
|
|
:Help("giveammo_help")
|
|
|
|
:OnExecute(function(ply, targets, amount)
|
|
if amount == 0 then
|
|
amount = 99999
|
|
end
|
|
|
|
for i = 1, #targets do
|
|
local target = targets[i]
|
|
for _, wep in ipairs(target:GetWeapons()) do
|
|
if wep:GetPrimaryAmmoType() ~= -1 then
|
|
target:GiveAmmo(amount, wep:GetPrimaryAmmoType(), true)
|
|
end
|
|
|
|
if wep:GetSecondaryAmmoType() ~= -1 then
|
|
target:GiveAmmo(amount, wep:GetSecondaryAmmoType(), true)
|
|
end
|
|
end
|
|
end
|
|
|
|
sam.player.send_message(nil, "giveammo", {
|
|
A = ply, T = targets, V = amount
|
|
})
|
|
end)
|
|
:End()
|
|
|
|
do
|
|
command.new("scale")
|
|
:SetPermission("scale", "superadmin")
|
|
|
|
:AddArg("player")
|
|
:AddArg("number", {hint = "amount", optional = true, min = 0, max = 2.5, default = 1})
|
|
|
|
:Help("scale_help")
|
|
|
|
:OnExecute(function(ply, targets, amount)
|
|
for i = 1, #targets do
|
|
local v = targets[i]
|
|
v:SetModelScale(amount)
|
|
|
|
-- https://github.com/carz1175/More-ULX-Commands/blob/9b142ee4247a84f16e2dc2ec71c879ab76e145d4/lua/ulx/modules/sh/extended.lua#L313
|
|
v:SetViewOffset(Vector(0, 0, 64 * amount))
|
|
v:SetViewOffsetDucked(Vector(0, 0, 28 * amount))
|
|
|
|
v.sam_scaled = true
|
|
end
|
|
|
|
sam.player.send_message(nil, "scale", {
|
|
A = ply, T = targets, V = amount
|
|
})
|
|
end)
|
|
:End()
|
|
|
|
hook.Add("PlayerSpawn", "SAM.Scale", function(ply)
|
|
if ply.sam_scaled then
|
|
ply.sam_scaled = nil
|
|
ply:SetViewOffset(Vector(0, 0, 64))
|
|
ply:SetViewOffsetDucked(Vector(0, 0, 28))
|
|
end
|
|
end)
|
|
end
|
|
|
|
sam.command.new("freezeprops")
|
|
:SetPermission("freezeprops", "admin")
|
|
:Help("freezeprops_help")
|
|
|
|
:OnExecute(function(ply)
|
|
for _, prop in ipairs(ents.FindByClass("prop_physics")) do
|
|
local physics_obj = prop:GetPhysicsObject()
|
|
if IsValid(physics_obj) then
|
|
physics_obj:EnableMotion(false)
|
|
end
|
|
end
|
|
|
|
sam.player.send_message(nil, "freezeprops", {
|
|
A = ply
|
|
})
|
|
end)
|
|
:End() |