387 lines
12 KiB
Lua
387 lines
12 KiB
Lua
ix.util.Include("cl_plugin.lua")
|
||
ix.util.Include("sv_plugin.lua")
|
||
|
||
local PLUGIN = PLUGIN
|
||
PLUGIN.name = "Admin Mode"
|
||
PLUGIN.author = "Scripty"
|
||
PLUGIN.description = "Перекид игрока по команде в админ фракцию"
|
||
|
||
local accessAdminGroups = {
|
||
["superadmin"] = true,
|
||
["super admin"] = true,
|
||
["projectteam"] = true,
|
||
["teh.admin"] = true,
|
||
["curator"] = true,
|
||
["sudo-curator"] = true,
|
||
["asist-sudo"] = true,
|
||
["admin"] = true,
|
||
["st.admin"] = true,
|
||
["ivent"] = true,
|
||
["st.event"] = true,
|
||
["event"] = true,
|
||
["disp"] = true,
|
||
["assistant"] = true,
|
||
["specadmin"] = true
|
||
}
|
||
local playerMeta = FindMetaTable("Player")
|
||
|
||
function playerMeta:IsAdminMode()
|
||
return self:GetNetVar("AdminMode", false)
|
||
end
|
||
|
||
local function CanUseAdminMode(ply)
|
||
return accessAdminGroups[ply:GetUserGroup()] == true
|
||
end
|
||
|
||
local function CanUseNoclip(ply)
|
||
if ply:IsAdminMode() then return true end
|
||
|
||
if ply:GetUserGroup() == "superadmin" then return true end
|
||
|
||
return false
|
||
end
|
||
|
||
local function GetWeaponsList(ply)
|
||
local list = {}
|
||
for _, wep in ipairs(ply:GetWeapons()) do
|
||
if IsValid(wep) then
|
||
list[#list + 1] = wep:GetClass()
|
||
end
|
||
end
|
||
return list
|
||
end
|
||
|
||
if (SERVER) then
|
||
util.AddNetworkString("AdminMode_Groups")
|
||
|
||
hook.Add("PlayerInitialSpawn", "AdminMode_SendGroups", function(ply)
|
||
net.Start("AdminMode_Groups")
|
||
net.WriteTable(accessAdminGroups)
|
||
net.Send(ply)
|
||
end)
|
||
|
||
function PLUGIN:PlayerDisconnected(ply)
|
||
if ply:IsAdminMode() then
|
||
local char = ply:GetCharacter()
|
||
if char then
|
||
local oldFaction = char:GetData("AdminMode_OldFaction")
|
||
if oldFaction then char:SetFaction(oldFaction) end
|
||
|
||
local oldPodr = char:GetData("AdminMode_OldPodr")
|
||
if oldPodr then char:SetPodr(oldPodr) end
|
||
|
||
local oldSpec = char:GetData("AdminMode_OldSpec")
|
||
if oldSpec then char:SetSpec(oldSpec) end
|
||
|
||
local oldRank = char:GetData("AdminMode_OldRank")
|
||
if oldRank then char:SetRank(oldRank) end
|
||
end
|
||
ply:SetNetVar("HideFromTab", false)
|
||
ply:SetNetVar("AdminMode", false)
|
||
end
|
||
end
|
||
|
||
function PLUGIN:PlayerLoadedCharacter(ply, char)
|
||
local squads = ix.plugin.list["squads"]
|
||
|
||
if ply:IsAdminMode() and squads then
|
||
local squad, squadID = squads:GetPlayerSquad(ply)
|
||
if squad then
|
||
if squad.leader == ply:SteamID() then
|
||
squads:DisbandSquad(squadID)
|
||
else
|
||
squads:LeaveSquad(ply)
|
||
end
|
||
net.Start("ixSquadSync")
|
||
net.WriteString("{}")
|
||
net.Send(ply)
|
||
end
|
||
end
|
||
|
||
if char:GetFaction() == FACTION_ADMIN and not ply:IsAdminMode() then
|
||
|
||
local oldFaction = char:GetData("AdminMode_OldFaction")
|
||
local oldPodr = char:GetData("AdminMode_OldPodr")
|
||
local oldSpec = char:GetData("AdminMode_OldSpec")
|
||
local oldRank = char:GetData("AdminMode_OldRank")
|
||
|
||
if oldFaction then char:SetFaction(oldFaction) end
|
||
if oldPodr then char:SetPodr(oldPodr) end
|
||
if oldSpec then char:SetSpec(oldSpec) end
|
||
if oldRank then char:SetRank(oldRank) end
|
||
|
||
char:SetData("AdminMode_OldFaction", nil)
|
||
char:SetData("AdminMode_OldPodr", nil)
|
||
char:SetData("AdminMode_OldSpec", nil)
|
||
char:SetData("AdminMode_OldRank", nil)
|
||
char:SetData("AdminMode_OldModel", nil)
|
||
char:SetData("AdminMode_OldWeapons", nil)
|
||
|
||
ply:SetNetVar("AdminMode", false)
|
||
ply:SetNetVar("HideFromTab", false)
|
||
|
||
local radio = ix.plugin.list["radio"]
|
||
if radio then
|
||
radio:SyncRadioState(ply, radio.defaultFrequency, false, false)
|
||
end
|
||
elseif ply:IsAdminMode() and char:GetFaction() ~= FACTION_ADMIN then
|
||
self:ToggleAdminMode(ply)
|
||
end
|
||
|
||
if ply:IsAdminMode() then
|
||
local radio = ix.plugin.list["radio"]
|
||
if radio then
|
||
radio:SyncRadioState(ply, radio.defaultFrequency, false, false)
|
||
end
|
||
end
|
||
end
|
||
|
||
function PLUGIN:OnCharacterSave(char)
|
||
local ply = char:GetPlayer()
|
||
if not IsValid(ply) then return end
|
||
|
||
if ply:IsAdminMode() then
|
||
local oldFaction = char:GetData("AdminMode_OldFaction")
|
||
if oldFaction then char:SetFaction(oldFaction) end
|
||
|
||
local oldPodr = char:GetData("AdminMode_OldPodr")
|
||
if oldPodr then char:SetPodr(oldPodr) end
|
||
|
||
local oldSpec = char:GetData("AdminMode_OldSpec")
|
||
if oldSpec then char:SetSpec(oldSpec) end
|
||
|
||
local oldRank = char:GetData("AdminMode_OldRank")
|
||
if oldRank then char:SetRank(oldRank) end
|
||
|
||
ply:SetNetVar("AdminMode", false)
|
||
end
|
||
end
|
||
|
||
function PLUGIN:ToggleAdminMode(ply)
|
||
if not IsValid(ply) then return end
|
||
if not CanUseAdminMode(ply) then
|
||
ply:ChatPrint("[!] У вас нет доступа к админ-моду.")
|
||
return
|
||
end
|
||
|
||
local char = ply:GetCharacter()
|
||
if not char then
|
||
ply:ChatPrint("[!] У вас нет активного персонажа.")
|
||
return
|
||
end
|
||
|
||
local enable = not ply:IsAdminMode()
|
||
ply:SetNetVar("AdminMode", enable)
|
||
|
||
if enable then
|
||
local squads = ix.plugin.list["squads"]
|
||
if squads then
|
||
local squad, squadID = squads:GetPlayerSquad(ply)
|
||
if squad then
|
||
if squad.leader == ply:SteamID() then
|
||
squads:DisbandSquad(squadID)
|
||
else
|
||
squads:LeaveSquad(ply)
|
||
end
|
||
end
|
||
end
|
||
char:SetData("AdminMode_OldFaction", char:GetFaction())
|
||
char:SetData("AdminMode_OldPodr", char:GetPodr())
|
||
char:SetData("AdminMode_OldSpec", char:GetSpec())
|
||
char:SetData("AdminMode_OldRank", char:GetRank())
|
||
|
||
char:SetData("AdminMode_OldModel", ply:GetModel())
|
||
char:SetData("AdminMode_OldWeapons", GetWeaponsList(ply))
|
||
|
||
ply:SetModel("models/ft/ft_admin.mdl")
|
||
|
||
if FACTION_ADMIN then
|
||
char:SetFaction(FACTION_ADMIN)
|
||
end
|
||
|
||
ply:GodEnable()
|
||
ply:SetNoDraw(true)
|
||
ply:SetMoveType(MOVETYPE_NOCLIP)
|
||
|
||
ply:StripWeapons()
|
||
ply:Give("weapon_physgun")
|
||
ply:Give("gmod_tool")
|
||
ply:Give("ix_hands")
|
||
ply:SelectWeapon("ix_hands")
|
||
ply:SetNetVar("HideFromTab", true)
|
||
|
||
ply:ChatPrint("[!] Админ-мод включен.")
|
||
else
|
||
local oldFaction = char:GetData("AdminMode_OldFaction")
|
||
local oldPodr = char:GetData("AdminMode_OldPodr")
|
||
local oldSpec = char:GetData("AdminMode_OldSpec")
|
||
local oldRank = char:GetData("AdminMode_OldRank")
|
||
|
||
if oldFaction and char:GetFaction() == FACTION_ADMIN then char:SetFaction(oldFaction) end
|
||
if oldPodr then char:SetPodr(oldPodr) end
|
||
if oldSpec then char:SetSpec(oldSpec) end
|
||
if oldRank then char:SetRank(oldRank) end
|
||
|
||
local oldModel = char:GetData("AdminMode_OldModel")
|
||
if oldModel then
|
||
ply:SetModel(oldModel)
|
||
end
|
||
|
||
local oldWeapons = char:GetData("AdminMode_OldWeapons") or {}
|
||
ply:StripWeapons()
|
||
|
||
for _, class in ipairs(oldWeapons) do
|
||
ply:Give(class)
|
||
end
|
||
|
||
if ply.sam_uncloak then
|
||
ply:sam_uncloak()
|
||
end
|
||
|
||
ply:SetNoDraw(false)
|
||
ply:SetRenderMode(RENDERMODE_NORMAL)
|
||
ply:SetColor(Color(255, 255, 255, 255))
|
||
ply:Fire("alpha", 255, 0)
|
||
ply:DrawWorldModel(true)
|
||
ply:SetMaterial("")
|
||
|
||
ply:SetNetVar("ixNoDraw", false)
|
||
ply:DrawShadow(true)
|
||
ply:SetupHands()
|
||
|
||
if #oldWeapons == 0 then
|
||
ply:Give("ix_hands")
|
||
end
|
||
|
||
ply:GodDisable()
|
||
ply:SetMoveType(MOVETYPE_WALK)
|
||
|
||
local restoredFaction = char:GetFaction()
|
||
local class = char:GetClass() or "default"
|
||
|
||
local spawnPlugin = ix.plugin.list["spawns"]
|
||
|
||
if spawnPlugin and spawnPlugin.spawns then
|
||
local factionTable = ix.faction.indices[restoredFaction]
|
||
|
||
if factionTable then
|
||
local factionID = factionTable.uniqueID
|
||
local factionSpawns = spawnPlugin.spawns[factionID]
|
||
|
||
if factionSpawns then
|
||
local className = "default"
|
||
|
||
for _, v in ipairs(ix.class.list) do
|
||
if v.index == class then
|
||
className = v.uniqueID
|
||
break
|
||
end
|
||
end
|
||
|
||
local points = factionSpawns[className] or factionSpawns["default"]
|
||
|
||
if points and not table.IsEmpty(points) then
|
||
local pos = table.Random(points)
|
||
|
||
timer.Simple(0.1, function()
|
||
if IsValid(ply) then
|
||
ply:SetPos(pos)
|
||
end
|
||
end)
|
||
end
|
||
end
|
||
end
|
||
end
|
||
|
||
char:SetData("AdminMode_OldFaction", nil)
|
||
char:SetData("AdminMode_OldPodr", nil)
|
||
char:SetData("AdminMode_OldSpec", nil)
|
||
char:SetData("AdminMode_OldRank", nil)
|
||
char:SetData("AdminMode_OldModel", nil)
|
||
char:SetData("AdminMode_OldWeapons", nil)
|
||
ply:SetNetVar("HideFromTab", false)
|
||
local radio = ix.plugin.list["radio"]
|
||
if radio then
|
||
radio:SyncRadioState(ply, radio.defaultFrequency, false, false)
|
||
end
|
||
ply:ChatPrint("[!] Админ-мод выключен.")
|
||
end
|
||
|
||
hook.Run("PlayerAdminModeToggled", ply, enable)
|
||
end
|
||
|
||
function PLUGIN:EntityTakeDamage(target, dmg)
|
||
if IsValid(target) and target:IsPlayer() and target:IsAdminMode() then
|
||
return true
|
||
end
|
||
|
||
local attacker = dmg:GetAttacker()
|
||
if IsValid(attacker) and attacker:IsPlayer() and attacker:IsAdminMode() then
|
||
return true
|
||
end
|
||
end
|
||
|
||
function PLUGIN:OnCharacterVarChanged(char, key, oldValue, newValue)
|
||
if (key == "faction") then
|
||
local ply = char:GetPlayer()
|
||
|
||
if (IsValid(ply) and ply:IsAdminMode() and newValue ~= FACTION_ADMIN) then
|
||
self:ToggleAdminMode(ply)
|
||
end
|
||
end
|
||
end
|
||
|
||
function PLUGIN:PlayerNoClip(ply, desiredState)
|
||
if not IsValid(ply) then return false end
|
||
|
||
if CanUseNoclip(ply) then
|
||
ply:SetNoDraw(desiredState)
|
||
|
||
if desiredState then
|
||
ply:SetRenderMode(RENDERMODE_NONE)
|
||
ply:SetColor(Color(255, 255, 255, 0))
|
||
else
|
||
ply:SetRenderMode(RENDERMODE_NORMAL)
|
||
ply:SetColor(Color(255, 255, 255, 255))
|
||
end
|
||
|
||
if desiredState then
|
||
ply:SetNetVar("HideFromTab", true)
|
||
ply:SetNetVar("ixNoDraw", true)
|
||
else
|
||
if not ply:IsAdminMode() then
|
||
ply:SetNetVar("HideFromTab", false)
|
||
ply:SetNetVar("ixNoDraw", false)
|
||
end
|
||
end
|
||
|
||
return true
|
||
end
|
||
|
||
return false
|
||
end
|
||
|
||
ix.command.Add("admin", {
|
||
description = "Включить/выключить админ-мод.",
|
||
OnRun = function(self, ply)
|
||
PLUGIN:ToggleAdminMode(ply)
|
||
end
|
||
})
|
||
|
||
ix.command.Add("adm", {
|
||
description = "Синоним /admin.",
|
||
OnRun = function(self, ply)
|
||
PLUGIN:ToggleAdminMode(ply)
|
||
end
|
||
})
|
||
|
||
end
|
||
|
||
CLIENT_ADMIN_GROUPS = CLIENT_ADMIN_GROUPS or {}
|
||
|
||
if CLIENT then
|
||
net.Receive("AdminMode_Groups", function()
|
||
CLIENT_ADMIN_GROUPS = net.ReadTable()
|
||
end)
|
||
end
|