mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-17 13:53:45 +03:00
Upload
This commit is contained in:
579
addons/sam-master/lua/sam/modules/util.lua
Normal file
579
addons/sam-master/lua/sam/modules/util.lua
Normal file
@@ -0,0 +1,579 @@
|
||||
--[[
|
||||
| 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
|
||||
Reference in New Issue
Block a user