add sborka
This commit is contained in:
194
garrysmod/gamemodes/militaryrp/plugins/adminmode/cl_plugin.lua
Normal file
194
garrysmod/gamemodes/militaryrp/plugins/adminmode/cl_plugin.lua
Normal file
@@ -0,0 +1,194 @@
|
||||
local PLUGIN = PLUGIN
|
||||
|
||||
function PLUGIN:HUDPaint()
|
||||
local client = LocalPlayer()
|
||||
if not IsValid(client) then return end
|
||||
|
||||
if not client:IsAdminMode() then return end
|
||||
|
||||
local scrW, scrH = ScrW(), ScrH()
|
||||
local w, h = 220, 36
|
||||
local x, y = scrW / 2 - w / 2, 20
|
||||
|
||||
surface.SetDrawColor(13, 13, 13, 220)
|
||||
surface.DrawRect(x, y, w, h)
|
||||
|
||||
surface.SetDrawColor(200, 80, 80, 255)
|
||||
surface.DrawOutlinedRect(x, y, w, h, 2)
|
||||
|
||||
draw.SimpleText("ADMIN MODE", "ixMenuButtonFont", scrW / 2, y + h / 2,
|
||||
Color(255, 255, 255), TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER)
|
||||
end
|
||||
|
||||
surface.CreateFont("AdminESPFontSmall", {
|
||||
font = "Arial",
|
||||
size = 12,
|
||||
weight = 500
|
||||
})
|
||||
|
||||
CLIENT_ADMIN_GROUPS = CLIENT_ADMIN_GROUPS or {}
|
||||
|
||||
local function Draw3DBox(ent, color)
|
||||
local mins, maxs = ent:OBBMins(), ent:OBBMaxs()
|
||||
local corners = {
|
||||
Vector(mins.x, mins.y, mins.z),
|
||||
Vector(mins.x, maxs.y, mins.z),
|
||||
Vector(maxs.x, maxs.y, mins.z),
|
||||
Vector(maxs.x, mins.y, mins.z),
|
||||
|
||||
Vector(mins.x, mins.y, maxs.z),
|
||||
Vector(mins.x, maxs.y, maxs.z),
|
||||
Vector(maxs.x, maxs.y, maxs.z),
|
||||
Vector(maxs.x, mins.y, maxs.z),
|
||||
}
|
||||
|
||||
local lines = {
|
||||
{1,2},{2,3},{3,4},{4,1},
|
||||
{5,6},{6,7},{7,8},{8,5},
|
||||
{1,5},{2,6},{3,7},{4,8}
|
||||
}
|
||||
|
||||
cam.Start3D()
|
||||
render.SetColorMaterial()
|
||||
for _, l in ipairs(lines) do
|
||||
render.DrawLine(
|
||||
ent:LocalToWorld(corners[l[1]]),
|
||||
ent:LocalToWorld(corners[l[2]]),
|
||||
color, true
|
||||
)
|
||||
end
|
||||
cam.End3D()
|
||||
end
|
||||
|
||||
local function CanSeeESP()
|
||||
local client = LocalPlayer()
|
||||
if not IsValid(client) then return false end
|
||||
if not client:IsAdminMode() then return false end
|
||||
|
||||
local group = client:GetUserGroup()
|
||||
if not CLIENT_ADMIN_GROUPS[group] then return false end
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
hook.Add("HUDPaint", "AdminMode_ESP", function()
|
||||
if not CanSeeESP() then return end
|
||||
|
||||
local client = LocalPlayer()
|
||||
|
||||
for _, ply in ipairs(player.GetAll()) do
|
||||
if ply ~= client and ply:Alive() then
|
||||
|
||||
local distance = client:GetPos():Distance(ply:GetPos())
|
||||
|
||||
Draw3DBox(ply, Color(255, 60, 60))
|
||||
|
||||
local char = ply:GetCharacter()
|
||||
local top = (ply:GetPos() + Vector(0,0,85)):ToScreen()
|
||||
local bottom = (ply:GetPos() + Vector(0,0,5)):ToScreen()
|
||||
|
||||
local faction = "Неизвестно"
|
||||
local podr = "Неизвестно"
|
||||
local spec = "Неизвестно"
|
||||
local rank = "Неизвестно"
|
||||
|
||||
local samGroup = ply:GetUserGroup()
|
||||
local samName = samGroup
|
||||
|
||||
if sam and sam.ranks and sam.ranks[samGroup] and sam.ranks[samGroup].Name then
|
||||
samName = sam.ranks[samGroup].Name
|
||||
end
|
||||
|
||||
if char then
|
||||
local factionID = char:GetFaction()
|
||||
local factionTable = ix.faction.indices[factionID]
|
||||
|
||||
if factionTable and factionTable.name then
|
||||
faction = factionTable.name
|
||||
end
|
||||
|
||||
if factionTable and factionTable.Podr and char.GetPodr then
|
||||
local id = char:GetPodr()
|
||||
if factionTable.Podr[id] and factionTable.Podr[id].name then
|
||||
podr = factionTable.Podr[id].name
|
||||
end
|
||||
end
|
||||
|
||||
if factionTable and factionTable.Spec and char.GetSpec then
|
||||
local id = char:GetSpec()
|
||||
if factionTable.Spec[id] and factionTable.Spec[id].name then
|
||||
spec = factionTable.Spec[id].name
|
||||
end
|
||||
end
|
||||
|
||||
if factionTable and factionTable.Ranks and char.GetRank then
|
||||
local id = char:GetRank()
|
||||
if factionTable.Ranks[id] and factionTable.Ranks[id][1] then
|
||||
rank = factionTable.Ranks[id][1]
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local steamid = ply:SteamID()
|
||||
local hp = ply:Health()
|
||||
local armor = ply:Armor()
|
||||
local wep = IsValid(ply:GetActiveWeapon()) and ply:GetActiveWeapon():GetClass() or "—"
|
||||
|
||||
local topLines = {}
|
||||
|
||||
if distance > 500 then
|
||||
-- Издалека: только ник
|
||||
topLines = { ply:Name() }
|
||||
elseif distance > 200 then
|
||||
-- Средняя дальность: ник + фракция + SteamID
|
||||
topLines = {
|
||||
ply:Name(),
|
||||
"" .. faction,
|
||||
"" .. steamid
|
||||
}
|
||||
else
|
||||
-- Близко: вся информация
|
||||
topLines = {
|
||||
ply:Name(),
|
||||
"" .. faction,
|
||||
"" .. podr,
|
||||
"" .. spec,
|
||||
"" .. rank,
|
||||
"" .. samName,
|
||||
"" .. steamid
|
||||
}
|
||||
end
|
||||
|
||||
local y = top.y
|
||||
for _, text in ipairs(topLines) do
|
||||
surface.SetDrawColor(0, 0, 0, 160)
|
||||
surface.DrawRect(top.x - 50, y - 5, 100, 12)
|
||||
|
||||
draw.SimpleText(text, "AdminESPFontSmall", top.x, y,
|
||||
Color(255,255,255), TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER)
|
||||
|
||||
y = y + 15
|
||||
end
|
||||
|
||||
-- Нижняя информация всегда показывается близко
|
||||
if distance <= 200 then
|
||||
local bottomLines = {
|
||||
"HP: " .. hp,
|
||||
"Armor: " .. armor,
|
||||
"Weapon: " .. wep
|
||||
}
|
||||
|
||||
local y2 = bottom.y
|
||||
for _, text in ipairs(bottomLines) do
|
||||
surface.SetDrawColor(0, 0, 0, 160)
|
||||
surface.DrawRect(bottom.x - 40, y2 - 5, 80, 10)
|
||||
|
||||
draw.SimpleText(text, "AdminESPFontSmall", bottom.x, y2,
|
||||
Color(255,255,255), TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER)
|
||||
|
||||
y2 = y2 + 12
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end)
|
||||
Reference in New Issue
Block a user