Как добавить строку с человеком который забанил и ваш стим id?

Надо добавить строчку с забанившим админом и строчку с стим айди забаненого
Система FAdmin
image
Autorun/client

surface.CreateFont("Ban.Hud.Font", {
	font = "Roboto",
	size = 35,
})
hook.Add("HUDPaint", "ShowBan.HUD", function()
	if LocalPlayer().BanReason == nil then return end
	draw.SimpleTextOutlined("Вы в бане!", "Ban.Hud.Font", ScrW() * 0.5, ScrH() * 0.05, Color(255, 0, 0), TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER, 1, Color(0, 0, 0))
	draw.SimpleTextOutlined("Осталось: " .. string.NiceTime((LocalPlayer().BanTime - os.time()) or 0), "Ban.Hud.Font", ScrW() * 0.5, ScrH() * 0.085, Color(255, 255, 255), TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER, 1, Color(0, 0, 0))
	draw.SimpleTextOutlined("Причина: " .. (LocalPlayer().BanReason or ""), "Ban.Hud.Font", ScrW() * 0.5, ScrH() * 0.12, Color(255, 255, 255), TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER, 1, Color(0, 0, 0))
end)

net.Receive("BanInfo", function()
	LocalPlayer().BanReason = net.ReadString()
	LocalPlayer().BanTime = net.ReadInt(32)
	if LocalPlayer().BanReason == "" then LocalPlayer().BanReason = nil end
end)

Autorun/server

local function RewriteFAdminBan()
	local function Kick(ply, cmd, args)
		local targets = FAdmin.FindPlayer(args[1])

		if not targets or #targets == 1 and not IsValid(targets[1]) then
			FAdmin.Messages.SendMessage(ply, 1, "Player not found")

			return false
		end

		local CanKick = hook.Call("FAdmin_CanKick", nil, ply, targets)
		if CanKick == false then return false end
		local stage = args[2] or ""
		stage = string.lower(stage)

		local stages = {"start", "cancel", "update", "execute"}

		local Reason = (not table.HasValue(stages, stage) and table.concat(args, ' ', 2)) or table.concat(args, ' ', 3) or ply.FAdminKickReason

		for _, target in pairs(targets) do
			if not FAdmin.Access.PlayerHasPrivilege(ply, "Kick", target) then
				FAdmin.Messages.SendMessage(ply, 5, "No access!")

				return false
			end

			if IsValid(target) then
				if stage == "start" then
					SendUserMessage("FAdmin_kick_start", target)
					target:Lock()
					target:KillSilent()
				elseif stage == "cancel" then
					SendUserMessage("FAdmin_kick_cancel", target)
					target:UnLock()
					target:Spawn()
					ply.FAdminKickReason = nil
				elseif stage == "update" then
					if not args[3] then return false end
					ply.FAdminKickReason = args[3]
					SendUserMessage("FAdmin_kick_update", target, args[3])
				else
					local name = IsValid(ply) and ply:IsPlayer() and ply:Nick() or "Console"
					Reason = Reason and string.gsub(Reason, ";", " ") or "No reason provided"
					hook.Call("FAdmin_Kick", nil, ply, target, Reason)
					game.ConsoleCommand(string.format("kickid %s %s\n", target:UserID(), "Kicked by " .. name .. " (" .. Reason .. ")"))
					ply.FAdminKickReason = nil
				end
			end
		end

		if stage ~= "start" and stage ~= "cancel" and stage ~= "update" then
			FAdmin.Messages.FireNotification("kick", ply, nil, {FAdmin.TargetsToString(targets), Reason})
		end

		return true, targets, stage, Reason
	end

	local StartBannedUsers = {}

	hook.Add("PlayerAuthed", "FAdmin_LeavingBeforeBan", function(ply, SteamID, ...)
		if not StartBannedUsers[SteamID] then return end

		if not IsValid(StartBannedUsers[SteamID].author) then
			StartBannedUsers[SteamID] = nil

			return
		end
	end)

	FAdmin.BANS = FAdmin.BANS or {}

	local function RequestBans(ply, cmd, args)
		if not FAdmin.Access.PlayerHasPrivilege(ply, "UnBan") then
			FAdmin.Messages.SendMessage(ply, 5, "No access!")

			return false
		end

		net.Start("FAdmin_retrievebans")
		net.WriteUInt(table.Count(FAdmin.BANS), 32)

		for k, v in pairs(FAdmin.BANS) do
			net.WriteString(k or "")
			net.WriteUInt(v.time or 0, 32)
			net.WriteString(v.name or "")
			net.WriteString(v.reason or "")
			net.WriteString(v.adminname or "")
			net.WriteString(v.adminsteam or "")
		end

		net.Send(ply)

		return true, FAdmin.BANS
	end

	timer.Create("FAdminCheckBans", 10, 0, function()
		for k, v in pairs(FAdmin.BANS) do
			if v.time and not isstring(v.time) and tonumber(v.time) < os.time() and v.time ~= 0 then
				FAdmin.BANS[k] = nil
			end
		end
	end)

	local function SaveBan(SteamID, Nick, Duration, Reason, AdminName, Admin_steam)
		local StoreBans = hook.Call("FAdmin_StoreBan", nil, SteamID, Nick, Duration, Reason, AdminName, Admin_steam)
		if StoreBans == true then return end

		if tonumber(Duration) == 0 then
			FAdmin.BANS[SteamID] = {}
			FAdmin.BANS[SteamID].time = 0
			FAdmin.BANS[SteamID].name = Nick
			FAdmin.BANS[SteamID].reason = Reason
			FAdmin.BANS[SteamID].adminname = AdminName
			FAdmin.BANS[SteamID].adminsteam = Admin_steam
		else
			FAdmin.BANS[SteamID] = {}
			FAdmin.BANS[SteamID].time = os.time() + Duration * 60
			FAdmin.BANS[SteamID].name = Nick
			FAdmin.BANS[SteamID].reason = Reason
			FAdmin.BANS[SteamID].adminname = AdminName
			FAdmin.BANS[SteamID].adminsteam = Admin_steam
		end
	end

	local function Ban(ply, cmd, args)
		if not args[2] then return false end
		local targets = FAdmin.FindPlayer(args[1])

		if not targets and string.find(args[1], "STEAM_") ~= 1 and string.find(args[2], "STEAM_") ~= 1 then
			FAdmin.Messages.SendMessage(ply, 1, "Player not found")

			return false
		elseif not targets and (string.find(args[1], "STEAM_") == 1 or string.find(args[2], "STEAM_") == 1) then
			targets = {(args[1] ~= "execute" and args[1]) or args[2]}

			if args[1] == "STEAM_0" then
				targets[1] = table.concat(args, "", 1, 5)
				args[1] = targets[1]
				args[2] = args[6]
				args[3] = args[7]

				for i = 2, #args do
					if i >= 4 then
						args[i] = nil
					end
				end
			end
		end

		local CanBan = hook.Call("FAdmin_CanBan", nil, ply, targets)
		if CanBan == false then return false end
		local stage = string.lower(args[2])

		local stages = {"start", "cancel", "update", "execute"}

		local Reason = (not table.HasValue(stages, stage) and table.concat(args, ' ', 3)) or table.concat(args, ' ', 4) or ply.FAdminKickReason
		local time

		for _, target in pairs(targets) do
			if (isstring(target) and not FAdmin.Access.PlayerHasPrivilege(ply, "Ban")) or not FAdmin.Access.PlayerHasPrivilege(ply, "Ban", target) then
				FAdmin.Messages.SendMessage(ply, 5, "No access!")

				return false
			end

			if stage == "start" and not isstring(target) and IsValid(target) then
				StartBannedUsers[target:SteamID()] = {
					author = ply
				}
			elseif stage == "cancel" then
				if not isstring(target) and IsValid(target) then
					StartBannedUsers[target:SteamID()] = nil
				else
					StartBannedUsers[args[1]] = nil
				end
			elseif stage == "update" then
				if not args[4] or isstring(target) or not IsValid(target) then return false end
				ply.FAdminKickReason = args[4]
			else
				time = tonumber(args[2]) or 0
				Reason = (Reason ~= "" and Reason) or args[3] or ""

				if stage == "execute" then
					time = tonumber(args[3]) or 60
					Reason = args[4] or ""
				end

				local TimeText = FAdmin.PlayerActions.ConvertBanTime(time)

				if not isstring(target) and IsValid(target) then
					StartBannedUsers[target:SteamID()] = nil
					local nick = ply.Nick and ply:Nick() or "console"
					SaveBan(target:SteamID(), target:Nick(), time, Reason, nick, ply.SteamID and ply:SteamID() or "Console")
					Reason = string.gsub(Reason, ";", " ")
				else
					StartBannedUsers[args[1]] = nil
					SaveBan(target, nil, time, Reason ~= "" and Reason, ply.Nick and ply:Nick() or "console", ply.SteamID and ply:SteamID() or "Console")
				end

				ply.FAdminKickReason = nil
			end
		end

		if stage ~= "start" and stage ~= "cancel" and stage ~= "update" then
			FAdmin.Messages.FireNotification("ban", ply, nil, {FAdmin.TargetsToString(targets), time, Reason})
		end

		return true, targets, stage, Reason
	end

	local function UnBan(ply, cmd, args)
		if not FAdmin.Access.PlayerHasPrivilege(ply, "UnBan") then
			FAdmin.Messages.SendMessage(ply, 5, "No access!")

			return false
		end

		if not args[1] then return false end
		local SteamID = string.upper(args[1])
		local nick = "Unknown"
		hook.Call("FAdmin_UnBan", nil, ply, SteamID)

		for k, v in pairs(FAdmin.BANS) do
			if string.upper(k) == SteamID then
				nick = FAdmin.BANS[k].name or nick
				FAdmin.BANS[k] = nil
				break
			end
		end

		StartBannedUsers[SteamID] = nil
		game.ConsoleCommand("removeid " .. SteamID .. "\n")

		FAdmin.Messages.FireNotification("unban", ply, nil, {nick, SteamID})

		return true, SteamID
	end

	FAdmin.StartHooks["KickBan"] = function()
		FAdmin.Commands.AddCommand("kick", Kick)
		FAdmin.Commands.AddCommand("ban", Ban)
		FAdmin.Commands.AddCommand("unban", UnBan)
		FAdmin.Commands.AddCommand("RequestBans", RequestBans)
		FAdmin.Access.AddPrivilege("Kick", 2)
		FAdmin.Access.AddPrivilege("Ban", 2)
		FAdmin.Access.AddPrivilege("UnBan", 2)
	end

	timer.Create("NewFAdminBan.CheckAllBan", 5, 0, function()
		if file.Exists("FAdmin/Bans.txt", "DATA") then
			local bans = util.KeyValuesToTable(file.Read("FAdmin/bans.txt", "DATA") or {})

			for k, v in pairs(bans) do
				FAdmin.BANS[string.upper(k)] = v
			end
		end
	end)

	hook.Add("DarkRPDBInitialized", "FAdmin_Retrievebans", function()
		timer.Simple(2, function()
			local RetrieveBans = hook.Call("FAdmin_RetrieveBans", nil)

			if RetrieveBans then
				for k, v in pairs(RetrieveBans) do
					FAdmin.BANS[string.upper(k)] = v
				end

				return
			end
		end)

		if file.Exists("FAdmin/Bans.txt", "DATA") then
			local bans = util.KeyValuesToTable(file.Read("FAdmin/bans.txt", "DATA") or {})

			for k, v in pairs(bans) do
				FAdmin.BANS[string.upper(k)] = v
			end

			for k, v in pairs(FAdmin.BANS) do
				v.time = tonumber(v.time)

				if v.time and v.time < os.time() then
					FAdmin.BANS[string.upper(k)] = nil
					continue
				elseif not v.time then
					continue
				end

				hook.Call("FAdmin_StoreBan", nil, string.upper(k), v.name, (v.time - os.time()) / 60, v.reason, v.adminname, v.adminsteam)
			end

			file.Delete("FAdmin/Bans.txt", "DATA")
		end
	end)

	hook.Add("DatabaseInitialized", "FAdmin_CreateMySQLTables", function()
		MySQLite.query("CREATE TABLE IF NOT EXISTS FAdminBans(SteamID VARCHAR(25) NOT NULL PRIMARY KEY, Nick VARCHAR(40), BanDate DATETIME, UnbanDate DATETIME, Reason VARCHAR(100), AdminName VARCHAR(40), Admin_steam VARCHAR(25));", function()
			hook.Call("FAdmin_RetrieveBans", nil)
		end)
	end)

	hook.Add("FAdmin_StoreBan", "MySQLBans", function(SteamID, Nick, Duration, Reason, AdminName, Admin_steam)
		local steam = MySQLite.SQLStr(SteamID)
		local nick = Nick and MySQLite.SQLStr(Nick) or "NULL"
		local bandate = MySQLite.isMySQL() and "NOW()" or "datetime('now')"
		local reason = Reason and MySQLite.SQLStr(Reason) or "NULL"
		local admin = AdminName and MySQLite.SQLStr(AdminName) or "NULL"
		local adminsteam = Admin_steam and MySQLite.SQLStr(Admin_steam) or "NULL"
		local duration

		if MySQLite.isMySQL() then
			duration = Duration == 0 and "NULL" or "DATE_ADD(NOW(), INTERVAL " .. tonumber(Duration or 60) .. " MINUTE)"
		else
			duration = Duration == 0 and "NULL" or "datetime('now', '+" .. tonumber(Duration or 60) .. " minutes')"
		end

		MySQLite.query("REPLACE INTO FAdminBans VALUES(" .. steam .. ", " .. nick .. ", " .. bandate .. ", " .. duration .. ", " .. reason .. ", " .. admin .. ", " .. adminsteam .. ");")
	end)

	hook.Add("FAdmin_UnBan", "FAdmin_MySQLUnban", function(ply, steamID)
		MySQLite.query("DELETE FROM FAdminBans WHERE steamID = " .. MySQLite.SQLStr(steamID))
	end)

	hook.Add("FAdmin_RetrieveBans", "getMySQLBans", function()
		FAdmin.BANS = FAdmin.BANS or {}
		local diffSeconds = MySQLite.isMySQL() and "TIMESTAMPDIFF(SECOND, NOW(), UnbanDate)" or "strftime('%s', UnbanDate) - strftime('%s','now')"
		local now = MySQLite.isMySQL() and "NOW()" or "datetime('now')"

		MySQLite.query("SELECT SteamID, Nick, " .. diffSeconds .. " AS duration, Reason, AdminName, Admin_steam FROM FAdminBans WHERE (UnbanDate > " .. now .. " OR UnbanDate IS NULL);", function(data)
			if not data then return end

			for _, v in ipairs(data) do
				if tonumber(v.SteamID) or not v.SteamID then continue end
				local duration = (not v.duration or v.duration == "NULL") and 0 or (os.time() + v.duration)

				FAdmin.BANS[string.upper(v.SteamID)] = {
					time = duration,
					name = v.Nick,
					reason = v.Reason,
					adminname = v.AdminName,
					adminsteam = v.Admin_steam
				}
			end

			for _, v in ipairs(player.GetAll()) do
				if not FAdmin.BANS[string.upper(v:SteamID())] then continue end
			end
		end)
	end)

	hook.Remove("PlayerInitialSpawn", "FAdmin_Bans")
	hook.Remove("CheckPassword", "FAdmin_Bans")
	hook.Remove("PlayerDisconnected", "FAdmin bans")
end

local function PlayerInBan(pl)
	local tbl_ban = FAdmin.BANS[pl:SteamID()]

	if tbl_ban then
		local time = tonumber(FAdmin.BANS[pl:SteamID()].time) or 0

		if time == 0 then
			pl:Kick("Вы были забанены навсегда.")

			return true
		end

		if time > os.time() then
			return true
		else
			return false
		end
	else
		return false
	end
end

hook.Add("PlayerPostThink", "NewFAdminBan.PlayerPostThink", function(pl)
	if not PlayerInBan(pl) then return end
	if pl:IsOnGround() then return end
	local vel = Vector(0, 0, 0)

	if pl:KeyDown(IN_JUMP) then
		vel = vel + pl:EyeAngles():Up()
	end

	if pl:KeyDown(IN_DUCK) then
		vel = vel - pl:EyeAngles():Up()
	end

	if pl:KeyDown(IN_FORWARD) then
		vel = vel + pl:EyeAngles():Forward()
	end

	if pl:KeyDown(IN_BACK) then
		vel = vel - pl:EyeAngles():Forward()
	end

	if pl:KeyDown(IN_MOVERIGHT) then
		vel = vel + pl:EyeAngles():Right()
	end

	if pl:KeyDown(IN_MOVELEFT) then
		vel = vel - pl:EyeAngles():Right()
	end

	if vel ~= Vector(0, 0, 0) then
		pl:SetVelocity(vel * 12)
	end
end)

hook.Add("PlayerCanHearPlayersVoice", "NewFAdminBan.PlayerCanHearPlayersVoice", function(_, pl)
	if PlayerInBan(pl) then return false end
end)

hook.Add("PlayerSay", "NewFAdminBan.PlayerSay", function(pl, text)
	if PlayerInBan(pl) then return "" end
end)

hook.Add("canChangeJob", "NewFAdminBan.canChangeJob", function(pl, job)
	if job == TEAM_BANNED and PlayerInBan(pl) then
		if PlayerInBan(pl) then
			return true
		else
			return false, "Вы не в бане."
		end
	end
end)

hook.Add("GetFallDamage", "NewFAdminBan.GetFallDamage", function(pl)
	if PlayerInBan(pl) then return 0 end
end)

util.AddNetworkString("BanInfo")

hook.Add("PlayerAuthed", "NewFAdminBan.Fix", function()
	RewriteFAdminBan()
end)

hook.Add("Think", "NewFAdminBan.Think", function()
	for _, pl in ipairs(player.GetAll()) do
		if PlayerInBan(pl) then
			if pl:Team() ~= TEAM_BANNED then
				pl:changeTeam(TEAM_BANNED, true)
				pl:KillSilent()
			end

			net.Start("BanInfo")
			net.WriteString(FAdmin.BANS[pl:SteamID()].reason)
			net.WriteInt(FAdmin.BANS[pl:SteamID()].time, 32)
			net.Send(pl)
			pl:StripWeapons()
		else
			if pl:Team() == TEAM_BANNED then
				net.Start("BanInfo")
				net.WriteString("")
				net.WriteInt(os.time(), 32)
				net.Send(pl)
				pl:changeTeam(GAMEMODE.DefaultTeam, true)
				pl:KillSilent()
			end
		end
	end
end)

hook.Add("CheckPassword", "NewFAdminBan.CheckPassword", function(sid64)
	RewriteFAdminBan()
	local sid = util.SteamIDFrom64(sid64)
	local tbl_ban = FAdmin.BANS[sid]

	if tbl_ban then
		local time = tonumber(FAdmin.BANS[sid].time) or 0
		if time == 0 then return false, "Вы были забанены навсегда.\nПричина: " .. FAdmin.BANS[sid].reason end
	end
end)

Куда добавить?

я скинул скрин с кодом

surface.CreateFont("Ban.Hud.Font", {
	font = "Roboto",
	size = 35,
})
hook.Add("HUDPaint", "ShowBan.HUD", function()
	if LocalPlayer().BanReason == nil then return end
	draw.SimpleTextOutlined("Вы в бане!", "Ban.Hud.Font", ScrW() * 0.5, ScrH() * 0.05, Color(255, 0, 0), TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER, 1, Color(0, 0, 0))
	draw.SimpleTextOutlined("Осталось: " .. string.NiceTime((LocalPlayer().BanTime - os.time()) or 0), "Ban.Hud.Font", ScrW() * 0.5, ScrH() * 0.085, Color(255, 255, 255), TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER, 1, Color(0, 0, 0))
	draw.SimpleTextOutlined("Причина: " .. (LocalPlayer().BanReason or ""), "Ban.Hud.Font", ScrW() * 0.5, ScrH() * 0.12, Color(255, 255, 255), TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER, 1, Color(0, 0, 0))
	draw.SimpleTextOutlined("Ваш STEAM:ID: " .. LocalPlayer():SteamID(), "Ban.Hud.Font", ScrW() * 0.5, ScrH() * 0.155, Color(255, 255, 255), TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER, 1, Color(0, 0, 0))
	draw.SimpleTextOutlined("Вас забанил: " .. (LocalPlayer().BanAdmin or ""), "Ban.Hud.Font", ScrW() * 0.5, ScrH() * 0.19, Color(255, 255, 255), TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER, 1, Color(0, 0, 0))
end)

net.Receive("BanInfo", function()
	LocalPlayer().BanReason = net.ReadString()
	LocalPlayer().BanTime = net.ReadInt(32)
	LocalPlayer().BanAdmin = net.ReadString() -- Нужно чтобы в net.Send тоже отправлялся админ и также вообще сохранялся при бане
	if LocalPlayer().BanReason == "" then LocalPlayer().BanReason = nil end
end)
  1. Я не знаю через что банится игрок и сохраняется ли там вообще админ. Если нет, то нужно добавить сохранение.
  2. После того, как мы поймём как он сохраняется, нужно добавить в SV часть передачу ника этого админа (или другой информации про него) (В net.Start("BanInfo"))
  3. Вижу тут проблему - а если причина не будет указана при бане? То считается для игрока, что бана нет? Может лучше делать проверку по времени бана?

такое выводит, кто забанил не пишет,
Кста, баны выдаются через FAdmin, я эту систему оставил

Найди у себя в SV строку net.WriteInt(FAdmin.BANS[pl:SteamID()].time, 32)

После неё добавляем передачу нужных данных об админе на клиент забаненному:

net.WriteString(FAdmin.BANS[pl:SteamID()].adminname)
net.WriteString(FAdmin.BANS[pl:SteamID()].adminsteam)

В CL часть соответственно добавляем принятие этой информации от сервера:

surface.CreateFont("Ban.Hud.Font", {
	font = "Roboto",
	size = 35,
})
hook.Add("HUDPaint", "ShowBan.HUD", function()
	if LocalPlayer().BanReason == nil then return end
	draw.SimpleTextOutlined("Вы в бане!", "Ban.Hud.Font", ScrW() * 0.5, ScrH() * 0.05, Color(255, 0, 0), TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER, 1, Color(0, 0, 0))
	draw.SimpleTextOutlined("Осталось: " .. string.NiceTime((LocalPlayer().BanTime - os.time()) or 0), "Ban.Hud.Font", ScrW() * 0.5, ScrH() * 0.085, Color(255, 255, 255), TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER, 1, Color(0, 0, 0))
	draw.SimpleTextOutlined("Причина: " .. (LocalPlayer().BanReason or ""), "Ban.Hud.Font", ScrW() * 0.5, ScrH() * 0.12, Color(255, 255, 255), TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER, 1, Color(0, 0, 0))
	draw.SimpleTextOutlined("Ваш STEAM:ID: " .. LocalPlayer():SteamID(), "Ban.Hud.Font", ScrW() * 0.5, ScrH() * 0.155, Color(255, 255, 255), TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER, 1, Color(0, 0, 0))
	draw.SimpleTextOutlined("Вас забанил: " .. (LocalPlayer().BanAdmin or ""), "Ban.Hud.Font", ScrW() * 0.5, ScrH() * 0.19, Color(255, 255, 255), TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER, 1, Color(0, 0, 0))
end)

net.Receive("BanInfo", function()
	LocalPlayer().BanReason = net.ReadString()
	LocalPlayer().BanTime = net.ReadInt(32)
	LocalPlayer().BanAdmin = net.ReadString() .. " (" .. net.ReadString() .. ")"
	if LocalPlayer().BanReason == "" then LocalPlayer().BanReason = nil end
end)

И должно всё заработать

P.S. В целом когда смотрю на то, что на клиенты через Think без задержки отправляют net сообщения, при этом выполняя одни и те же операции, то мне больно за производительность. Но работать будет…
(если я преувеличиваю, поправьте меня плиз)

1 лайк

Оу может глянешь как тут это правильно реализовать?

Как по твоему надо сделать, что бы напряг на сервер сильным не был?