Files
wnsrc/lua/sam/modules/util.lua
lifestorm 94063e4369 Upload
2024-08-04 22:55:00 +03:00

579 lines
13 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("Utility")
command.new("map")
:SetPermission("map", "admin")
:AddArg("map")
:AddArg("text", {hint = "gamemode", optional = true, check = sam.is_valid_gamemode})
:Help("map_help")
:OnExecute(function(ply, map, gamemode)
if not gamemode then
sam.player.send_message(nil, "map_change", {
A = ply, V = map
})
else
sam.player.send_message(nil, "map_change2", {
A = ply, V = map, V_2 = gamemode
})
RunConsoleCommand("gamemode", gamemode)
end
if #player.GetHumans() == 0 then
RunConsoleCommand("changelevel", map)
else
timer.Create("SAM.Command.Map", 10, 1, function()
RunConsoleCommand("changelevel", map)
end)
end
end)
:End()
command.new("maprestart")
:SetPermission("maprestart", "admin")
:Help("map_restart_help")
:OnExecute(function(ply)
if #player.GetHumans() == 0 then
RunConsoleCommand("changelevel", game.GetMap())
else
timer.Create("SAM.Command.MapRestart", 10, 1, function()
RunConsoleCommand("changelevel", game.GetMap())
end)
sam.player.send_message(nil, "map_restart", {
A = ply
})
end
end)
:End()
command.new("mapreset")
:SetPermission("mapreset", "admin")
:Help("mapreset_help")
:OnExecute(function(ply)
game.CleanUpMap()
sam.player.send_message(nil, "mapreset", {
A = ply
})
end)
:End()
command.new("kick")
:SetPermission("kick", "admin")
:AddArg("player", {single_target = true})
:AddArg("text", {hint = "reason", optional = true, default = sam.language.get("default_reason")})
:GetRestArgs()
:Help("kick_help")
:OnExecute(function(ply, targets, reason)
local target = targets[1]
target:Kick(reason)
sam.player.send_message(nil, "kick", {
A = ply, T = target:Name(), V = reason
})
end)
:End()
command.new("ban")
:SetPermission("ban", "admin")
:AddArg("player", {single_target = true})
:AddArg("length", {optional = true, default = 0})
:AddArg("text", {hint = "reason", optional = true, default = sam.language.get("default_reason")})
:GetRestArgs()
:Help("ban_help")
:OnExecute(function(ply, targets, length, reason)
local target = targets[1]
if ply:GetBanLimit() ~= 0 then
if length == 0 then
length = ply:GetBanLimit()
else
length = math.Clamp(length, 1, ply:GetBanLimit())
end
end
target:sam_ban(length, reason, ply:SteamID())
sam.player.send_message(nil, "ban", {
A = ply, T = target:Name(), V = sam.format_length(length), V_2 = reason
})
end)
:End()
command.new("banid")
:SetPermission("banid", "admin")
:AddArg("steamid")
:AddArg("length", {optional = true, default = 0})
:AddArg("text", {hint = "reason", optional = true, default = sam.language.get("default_reason")})
:GetRestArgs()
:Help("banid_help")
:OnExecute(function(ply, promise, length, reason)
local a_steamid, a_name, a_ban_limit = ply:SteamID(), ply:Name(), ply:GetBanLimit()
promise:done(function(data)
local steamid, target = data[1], data[2]
if a_ban_limit ~= 0 then
if length == 0 then
length = a_ban_limit
else
length = math.Clamp(length, 1, a_ban_limit)
end
end
if target then
target:sam_ban(length, reason, a_steamid)
sam.player.send_message(nil, "ban", {
A = a_name, T = target:Name(), V = sam.format_length(length), V_2 = reason
})
else
sam.player.ban_id(steamid, length, reason, a_steamid)
sam.player.send_message(nil, "banid", {
A = a_name, T = steamid, V = sam.format_length(length), V_2 = reason
})
end
end)
end)
:End()
command.new("unban")
:SetPermission("unban", "admin")
:AddArg("steamid", {allow_higher_target = true})
:Help("unban_help")
:OnExecute(function(ply, steamid, reason)
sam.player.unban(steamid, ply:SteamID())
sam.player.send_message(nil, "unban", {
A = ply, T = steamid
})
end)
:End()
do
command.new("noclip")
:SetPermission("noclip", "admin")
:AddArg("player", {optional = true})
:Help("noclip_help")
:OnExecute(function(ply, targets)
local id
for i = 1, #targets do
local v = targets[i]
v:SetMoveType(v:GetMoveType() == MOVETYPE_WALK and MOVETYPE_NOCLIP or MOVETYPE_WALK)
if v == ply then
id = i
end
end
if id then
table.remove(targets, id)
if #targets == 0 then return end
end
sam.player.send_message(nil, "noclip", {
A = ply, T = targets
})
end)
:End()
sam.permissions.add("can_noclip", nil, "admin")
hook.Add("PlayerNoClip", "SAM.CanNoClip", function(ply)
if ply:HasPermission("can_noclip") then
return true
end
end)
end
do
local config = sam.config
sam.permissions.add("can_physgun_players", nil, "admin")
if CLIENT then
local add_setting = function(body, title, key)
local setting = body:Add("SAM.LabelPanel")
setting:Dock(TOP)
setting:SetLabel(title)
local enable = setting:Add("SAM.ToggleButton")
enable:SetConfig(key, true)
return setting
end
config.add_menu_setting("Physgun", function(body)
local setting_body
do
local p = add_setting(body, "Physgun (Enable/Disable all physgun features except picking up players)", "Physgun.Enabled")
p:DockMargin(8, 6, 8, 0)
end
setting_body = body:Add("Panel")
setting_body:Dock(TOP)
setting_body:DockMargin(8, 6, 8, 0)
setting_body:DockPadding(8, 0, 8, 0)
add_setting(setting_body, "No fall damage on drop", "Physgun.NoFallDamageOnDrop")
add_setting(setting_body, "Right click to freeze players", "Physgun.RightClickToFreeze")
add_setting(setting_body, "Reset Velocity to fix some issues when players fall", "Physgun.ResetVelocity")
function setting_body:PerformLayout()
setting_body:SizeToChildren(false, true)
end
end)
end
local freeze_player = function(ply)
if SERVER then
ply:Lock()
end
ply:SetMoveType(MOVETYPE_NONE)
ply:SetCollisionGroup(COLLISION_GROUP_WORLD)
end
sam.hook_first("PhysgunPickup", "SAM.CanPhysgunPlayer", function(ply, target)
if sam.type(target) == "Player" and ply:HasPermission("can_physgun_players") and ply:CanTarget(target) then
freeze_player(target)
return true
end
end)
local load_phygun_settings = function()
hook.Remove("PhysgunDrop", "SAM.PhysgunDrop")
hook.Remove("OnPlayerHitGround", "SAM.PhysgunDropOnPlayerHitGround")
if config.get("Physgun.Enabled", true) == false then
return
end
local right_click_to_freeze = config.get("Physgun.RightClickToFreeze", true)
local reset_velocity = config.get("Physgun.ResetVelocity", true)
hook.Add("PhysgunDrop", "SAM.PhysgunDrop", function(ply, target)
if sam.type(target) ~= "Player" then return end
if right_click_to_freeze and ply:KeyPressed(IN_ATTACK2) then
freeze_player(target)
if SERVER then
target:sam_set_nwvar("frozen", true)
target:sam_set_exclusive("frozen")
end
else
if reset_velocity then
target:SetLocalVelocity(Vector(0, 0, 0))
end
if SERVER then
target:UnLock()
target:sam_set_nwvar("frozen", false)
target:sam_set_exclusive(nil)
if target.sam_has_god_mode then
target:GodEnable()
end
target.sam_physgun_drop_was_frozen = not target:IsOnGround()
end
target:SetMoveType(MOVETYPE_WALK)
target:SetCollisionGroup(COLLISION_GROUP_PLAYER)
end
end)
if config.get("Physgun.NoFallDamageOnDrop", true) then
hook.Add("OnPlayerHitGround", "SAM.PhysgunDropOnPlayerHitGround", function(ply)
if ply.sam_physgun_drop_was_frozen then
ply.sam_physgun_drop_was_frozen = false
return true
end
end)
end
end
config.hook({"Physgun.Enabled", "Physgun.RightClickToFreeze", "Physgun.ResetVelocity", "Physgun.NoFallDamageOnDrop"}, load_phygun_settings)
end
do
command.new("cleardecals")
:SetPermission("cleardecals", "admin")
:Help("cleardecals_help")
:OnExecute(function(ply)
sam.netstream.Start(nil, "cleardecals")
sam.player.send_message(nil, "cleardecals", {
A = ply
})
end)
:End()
if CLIENT then
sam.netstream.Hook("cleardecals", function()
game.RemoveRagdolls()
RunConsoleCommand("r_cleardecals")
end)
end
end
do
command.new("stopsound")
:SetPermission("stopsound", "admin")
:Help("stopsound_help")
:OnExecute(function(ply)
sam.netstream.Start(nil, "stopsound")
sam.player.send_message(nil, "stopsound", {
A = ply
})
end)
:End()
if CLIENT then
sam.netstream.Hook("stopsound", function()
RunConsoleCommand("stopsound")
end)
end
end
command.new("exit")
:SetPermission("exit_vehicle", "admin")
:AddArg("player", {single_target = true})
:Help("exit_vehicle_help")
:OnExecute(function(ply, targets)
local target = targets[1]
if not target:InVehicle() then
if ply == target then
return ply:sam_send_message("not_in_vehicle")
else
return ply:sam_send_message("not_in_vehicle2", {
S = target:Name()
})
end
end
target:ExitVehicle()
sam.player.send_message(nil, "exit_vehicle", {
A = ply, T = targets
})
end)
:End()
command.new("time")
:SetPermission("time", "user")
:AddArg("player", {single_target = true, optional = true})
:Help("time_help")
:OnExecute(function(ply, targets)
if ply == targets[1] then
sam.player.send_message(ply, "time_your", {
V = sam.reverse_parse_length(targets[1]:sam_get_play_time() / 60)
})
else
sam.player.send_message(ply, "time_player", {
T = targets, V = sam.reverse_parse_length(targets[1]:sam_get_play_time() / 60)
})
end
end)
:End()
command.new("admin")
:SetPermission("admin_mode", "admin")
:Help("admin_help")
:OnExecute(function(ply)
ply:sam_cloak()
ply:GodEnable()
ply:SetMoveType(MOVETYPE_NOCLIP)
end)
:End()
command.new("unadmin")
:SetPermission("admin_mode", "admin")
:Help("unadmin_help")
:OnExecute(function(ply)
ply:sam_uncloak()
ply:GodDisable()
ply:SetMoveType(MOVETYPE_WALK)
end)
:End()
do
command.new("buddha")
:SetPermission("buddha", "admin")
:AddArg("player", {optional = true})
:Help("buddha_help")
:OnExecute(function(ply, targets)
for i = 1, #targets do
targets[i].sam_buddha = true
end
sam.player.send_message(nil, "buddha", {
A = ply, T = targets
})
end)
:End()
command.new("unbuddha")
:SetPermission("buddha", "admin")
:AddArg("player", {optional = true})
:Help("unbuddha_help")
:OnExecute(function(ply, targets)
for i = 1, #targets do
targets[i].sam_buddha = nil
end
sam.player.send_message(nil, "unbuddha", {
A = ply, T = targets
})
end)
:End()
if SERVER then
hook.Add("EntityTakeDamage", "SAM.BuddhaMode", function(ply, info)
if ply.sam_buddha and ply:Health() - info:GetDamage() <= 0 then
ply:SetHealth(1)
return true
end
end)
end
end
command.new("give")
:SetPermission("give", "superadmin")
:AddArg("player")
:AddArg("text", {hint = "weapon/entity"})
:Help("give_help")
:OnExecute(function(ply, targets, weapon)
for i = 1, #targets do
targets[i]:Give(weapon)
end
sam.player.send_message(nil, "give", {
A = ply, T = targets, V = weapon
})
end)
:End()
-- do
-- if CLIENT then
-- sam.netstream.Hook("GetFriends", function()
-- local friends = {}
-- local humans = player.GetHumans()
-- for i = 1, #humans do
-- local human = humans[i]
-- if human:GetFriendStatus() == "friend" then
-- table.insert(friends, human)
-- end
-- end
-- netstream.Start("GetFriends", friends)
-- end)
-- else
-- hook.Add("SAM.AuthedPlayer", "GetPlayerFriends", function(ply)
-- timer.Simple(0, function()
-- ply.sam_requesting_friends = true
-- netstream.Start(ply, "GetFriends")
-- end)
-- end)
-- local invalid_friends = function(ply, friends, new_list)
-- if not sam.istable(friends) then return true end
-- local count = #friends
-- local max_players = game.MaxPlayers()
-- for k, friend in pairs(friends) do
-- if not sam.isnumber(k) then return true end
-- if not sam.isentity(friend) then return true end
-- if k > max_players then return true end
-- if k > count then return true end
-- if IsValid(friend) then
-- table.insert(new_list, friend)
-- end
-- end
-- end
-- sam.netstream.Hook("GetFriends", function(ply, friends)
-- local new_list = {}
-- if invalid_friends(ply, friends, new_list) then
-- ply.sam_friends_invalid = true
-- return
-- end
-- ply.sam_friends = new_list
-- end, function()
-- return ply.sam_requesting_friends
-- end)
-- end
-- command.new("friends")
-- :SetPermission("friends", "superadmin")
-- :AddArg("player", {single_target = true})
-- :Help(language.get("friends_help"))
-- :OnExecute(function(ply, targets)
-- local target = targets[1]
-- target.sam_friends_requests = target.sam_friends_requests or {}
-- target.sam_friends_requests[ply] = true
-- end)
-- :End()
-- end