Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local DEBUG = false
- if SERVER then
- require ("mysqloo")
- AddCSLuaFile("autorun/ivt-startup.lua")
- util.AddNetworkString("ivt-playerlist-update")
- util.AddNetworkString("ivt-player-ban")
- util.AddNetworkString("ivt-player-unban")
- util.AddNetworkString("ivt-player-kick")
- util.AddNetworkString("ivt-player-ignite")
- util.AddNetworkString("ivt-player-launch")
- util.AddNetworkString("ivt-player-slay")
- --util.AddNetworkString("ivt-player-mute")
- util.AddNetworkString("ivt-maplist-request")
- util.AddNetworkString("ivt-maplist-load")
- util.AddNetworkString("ivt-map-change")
- if DEBUG then print("This server is running IVTools!") end
- -- DATABASE
- local DATABASE_HOST = "127.0.0.1"
- local DATABASE_PORT = 3306
- local DATABASE_NAME = "srcds"
- local DATABASE_USERNAME = "srcds"
- local DATABASE_PASSWORD = "pH367264c2So47e62x7LHYAB73Uhdc"
- database = mysqloo.connect(DATABASE_HOST, DATABASE_USERNAME, DATABASE_PASSWORD, DATABASE_NAME, DATABASE_PORT)
- function database:onConnectionFailed(error_message)
- print("IVT: Can't connect to the database")
- if DEBUG then print("Error: " .. error_message) end
- -- todo kill script?
- end
- database:connect()
- -- PLAYERS
- local playerDatabaseId = { }
- function FindPlayerByName(str)
- for i, ent in pairs(ents.GetAll()) do
- if ent:IsPlayer() and ent:GetName() == str then return ent end
- end
- return nil
- end
- function FindPlayerBySteamID(str)
- for i, ent in pairs(ents.GetAll()) do
- if ent:IsPlayer() and ent:SteamID() == str then return ent end
- end
- return nil
- end
- function PlayerIPAddress(ply)
- local ipAddress = ply:IPAddress()
- if ipAddress == "loopback" or ipAddress == "Error!" then
- return "127.0.0.1"
- end
- return string.Explode(":", ipAddress)[1]
- end
- function BroadcastMessage(str)
- for i, ply in pairs(player.GetAll()) do
- ply:PrintMessage(HUD_PRINTTALK, str)
- end
- end
- hook.Add("PlayerAuthed", "ivt-database-player-authed", function(ply, unused1, unused2)
- -- Initialize the database stuff for the player
- local steamID = string.Explode(":", string.Explode("_", ply:SteamID())[2])
- local x = steamID[1]
- local y = steamID[2]
- local z = steamID[3]
- local databaseId = getPlayerDatabaseId(x, y, z)
- if databaseId < 0 then
- databaseId = createPlayerDatabaseId(x, y, z, PlayerIPAddress(ply), ply:GetName())
- if databaseId < 0 then
- ply:Kick("Error occured while communicating with database. Try again later!")
- return
- end
- else
- updatePlayerLast(databaseId, PlayerIPAddress(ply), ply:GetName())
- -- Bans
- reapBannedPlayers()
- local banData = getPlayerBannedData(databaseId)
- if banData then
- local date = banData["expiration"]
- if date == "0000-00-00 00:00:00" then
- date = "never"
- else
- date = "in " .. date
- end
- ply:Kick("Banned by \"" .. banData["issuer_name"] .. "\" for the reason of \"" .. banData["reason"] .. "\" expiring " .. date)
- return
- end
- -- Mutes
- local muteData = getPlayerMutedData(databaseId)
- if muteData then
- mutedPlayers[ply] = true
- ply:PrintMessage(HUD_PRINTTALK, "You are currently muted on this server for reason \"" .. muteData["reason"] .. "\". You were muted by \"" .. muteData["issuer_name"])
- end
- end
- playerDatabaseId[ply:SteamID()] = databaseId
- end)
- hook.Add("PlayerDisconnected", "ivt-database-player-disconnected", function(ply)
- playerDatabaseId[ply:SteamID()] = nil
- mutedPlayers[ply] = nil
- end)
- hook.Add("PlayerCanHearPlayersVoice", function(listener, talker)
- return not mutedPlayers[talker]
- end)
- function createPlayerDatabaseId(x, y, z, ip_address, name)
- local insertQuery = database:query("INSERT INTO accounts (x, y, z, creation_ip, creation_date, last_ip, last_date, last_name) VALUES (".. database:escape(x) ..", ".. database:escape(y) ..", ".. database:escape(z) ..", INET_ATON('".. database:escape(ip_address) .."'), NOW(), INET_ATON('".. database:escape(ip_address) .."'), NOW(), '" .. database:escape(name) .. "')")
- insertQuery:start()
- insertQuery:wait()
- if insertQuery:error() == "" then
- return getPlayerDatabaseId(x, y, z)
- else
- return -1
- end
- end
- function getPlayerDatabaseId(x, y, z)
- local selectQuery = database:query("SELECT id FROM accounts WHERE x = ".. database:escape(x) .." AND y = ".. database:escape(y) .." AND z = ".. database:escape(z))
- selectQuery:start()
- selectQuery:wait()
- if selectQuery:error() == "" then
- local data = selectQuery:getData()
- if data[1] then
- return data[1]["id"]
- else
- return -1
- end
- else
- return -2
- end
- end
- function updatePlayerLast(playerDatabaseId, ip_address, name)
- local updateQuery = database:query("UPDATE accounts SET last_ip = INET_ATON('" .. database:escape(ip_address) .. "'), last_date = NOW(), last_name = '" .. database:escape(name) .. "' WHERE id = " .. playerDatabaseId)
- updateQuery:start()
- end
- function createBannedPlayer(playerDatabaseId, issuerDatabaseId, reason, minutes)
- local date = "0"
- if minutes ~= 0 then
- date = "DATE_ADD(NOW(), INTERVAL " .. minutes .. " MINUTE)"
- end
- local insertQuery = database:query("INSERT INTO banned_accounts (account_id, issuer_id, reason, expiration) VALUES (" .. playerDatabaseId .. ", " .. issuerDatabaseId .. ", '" .. database:escape(reason) .. "', " .. date .. ")")
- insertQuery:start()
- end
- function deleteBannedPlayer(banDatabaseId)
- local deleteQuery = database:query("DELETE FROM banned_accounts WHERE id = " .. banDatabaseId)
- deleteQuery:start()
- end
- function getPlayerBannedDatas()
- local selectQuery = database:query("SELECT ban.id,ban.account_id,ban.issuer_id,ban.reason,ban.expiration,account.last_name,issuer.last_name FROM `banned_accounts` ban INNER JOIN `accounts` account ON (ban.`account_id` = account.`id`) INNER JOIN `accounts` issuer ON (ban.`issuer_id` = issuer.`id`)")
- selectQuery:start()
- selectQuery:wait()
- if selectQuery:error() == "" then
- return selectQuery:getData()
- else
- return nil
- end
- end
- function getPlayerBannedData(playerDatabaseId)
- local selectQuery = database:query("SELECT ban.id,ban.account_id,ban.issuer_id,ban.reason,ban.expiration,account.last_name as account_name,issuer.last_name as issuer_name FROM `banned_accounts` ban INNER JOIN `accounts` account ON (ban.`account_id` = account.`id`) INNER JOIN `accounts` issuer ON (ban.`issuer_id` = issuer.`id`) WHERE ban.`account_id` = " .. playerDatabaseId)
- selectQuery:start()
- selectQuery:wait()
- if selectQuery:error() == "" then
- local data = selectQuery:getData()
- if data[1] then
- return data[1]
- else
- return nil
- end
- else
- return nil
- end
- end
- function reapBannedPlayers()
- local deleteQuery = database:query("DELETE FROM banned_users WHERE expiration != 0 AND expiration < NOW()")
- deleteQuery:start()
- deleteQuery:wait()
- return deleteQuery:error() == ""
- end
- function createMutedPlayer(playerDatabaseId, issuerDatabaseId, reason)
- local insertQuery = database:query("INSERT INTO muted_accounts (account_id, issuer_id, reason) VALUES (" .. playerDatabaseId .. ", " .. issuerDatabaseId .. ", '" .. database:escape(reason)")")
- insertQuery:start()
- end
- function deleteMutedPlayer(muteDatabaseId)
- local deleteQuery = database:query("DELETE FROM muted_accounts WHERE id = " .. muteDatabaseId)
- deleteQuery:start()
- end
- function getPlayerMutedDatas()
- local selectQuery = database:query("SELECT mute.id,mute.account_id,mute.issuer_id,mute.reason,account.last_name,issuer.last_name FROM `muted_accounts` mute INNER JOIN `accounts` account ON (mute.`account_id` = account.`id`) INNER JOIN `accounts` issuer ON (mute.`issuer_id` = issuer.`id`)")
- selectQuery:start()
- selectQuery:wait()
- if selectQuery:error() == "" then
- return selectQuery:getData()
- else
- return nil
- end
- end
- function getPlayerMutedData(playerDatabaseId)
- local selectQuery = database:query("SELECT mute.id,mute.account_id,mute.issuer_id,mute.reason,account.last_name as account_name,issuer.last_name as issuer_name FROM `muted_accounts` mute INNER JOIN `accounts` account ON (mute.`account_id` = account.`id`) INNER JOIN `accounts` issuer ON (mute.`issuer_id` = issuer.`id`) WHERE mute.`account_id` = " .. playerDatabaseId)
- selectQuery:start()
- selectQuery:wait()
- if selectQuery:error() == "" then
- local data = selectQuery:getData()
- if data[1] then
- return data[1]
- else
- return nil
- end
- else
- return nil
- end
- end
- -- NETWORK
- net.Receive("ivt-player-ban", function(length, admin)
- if not (admin:IsAdmin() or admin:IsSuperAdmin()) then
- admin:PrintMessage(HUD_PRINTTALK, "You must be an admin to ban players")
- return
- end
- local name = net.ReadString()
- local ply = FindPlayerByName(name)
- local minutes = net.ReadFloat()
- local reason = net.ReadString()
- if not ply then return end
- createBannedPlayer(playerDatabaseId[ply:SteamID()], playerDatabaseId[admin:SteamID()], reason, minutes)
- local banData = getPlayerBannedData(playerDatabaseId[ply:SteamID()])
- if not banData then
- ply:Kick("Error occured while communicating with database. Try again later!")
- else
- local date = banData["expiration"]
- if date == "0000-00-00 00:00:00" then
- date = "never"
- else
- date = "in " .. date
- end
- --BroadcastMessage("Player \"" .. name .. "\" was banned by \"" .. banData["issuer_name"] .. "\" for the reason of \"" .. banData["reason"] .. "\" expiring " .. date)
- ply:Kick("Banned by \"" .. banData["issuer_name"] .. "\" for the reason of \"" .. banData["reason"] .. "\" expiring " .. date)
- end
- if DEBUG then print(ply:GetName().." was banned from the server") end
- end)
- net.Receive("ivt-player-unban", function(length, admin)
- if not (admin:IsAdmin() or admin:IsSuperAdmin()) then
- admin:PrintMessage(HUD_PRINTTALK, "You must be an admin to unban players")
- return
- end
- local banId = net.ReadFloat()
- deleteBannedPlayer(banId)
- if DEBUG then print(banID .. " was unbanned from the server") end
- end)
- net.Receive("ivt-player-kick", function(length, admin)
- if not (admin:IsAdmin() or admin:IsSuperAdmin()) then
- admin:PrintMessage(HUD_PRINTTALK, "You must be an admin to kick players.")
- return
- end
- local name = net.ReadString()
- local reason = net.ReadString()
- local ply = FindPlayerByName(name)
- if not ply then return end
- --BroadcastMessage("Player \"" name .. "\" was kicked by \"" .. admin:GetName() .. "\" for the reason of \"" .. reason .. "\"")
- ply:Kick("Kicked by \"" .. admin:GetName() .. "\" for the reason of \"" .. reason .. "\"")
- if DEBUG then print(ply:GetName().." was kicked from the server.") end
- end)
- net.Receive("ivt-player-ignite", function(length, admin)
- if not (admin:IsAdmin() or admin:IsSuperAdmin()) then
- admin:PrintMessage(HUD_PRINTTALK, "You must be an admin to ignite players.")
- return
- end
- local name = net.ReadString()
- local duration = net.ReadFloat()
- local ply = FindPlayerByName(name)
- if not ply or ply:Team() == TEAM_SPECTATOR then return end
- BroadcastMessage("Player \"" .. name .. "\" was ignited by \"" .. admin:GetName() .. "\"")
- ply:Ignite(duration, 0)
- if DEBUG then print(ply:GetName().." is being ignited for "..duration.." seconds.") end
- end)
- net.Receive("ivt-player-launch", function(length, admin)
- if not (admin:IsAdmin() or admin:IsSuperAdmin()) then
- admin:PrintMessage(HUD_PRINTTALK, "You must be an admin to launch players.")
- return
- end
- local name = net.ReadString()
- local force = net.ReadFloat()
- local ply = FindPlayerByName(name)
- if not ply then return end
- BroadcastMessage("Player \"" .. name .. "\" was launched into the air by \"" .. admin:GetName() .. "\"")
- ply:SetVelocity(Vector(0, 0, force))
- if DEBUG then print(ply:GetName().." is being launched with a force of "..force..".") end
- end)
- net.Receive("ivt-player-slay", function(length, admin)
- if not (admin:IsAdmin() or admin:IsSuperAdmin()) then
- admin:PrintMessage(HUD_PRINTTALK, "You must be an admin to slay players.")
- return
- end
- local name = net.ReadString()
- local ply = FindPlayerByName(name)
- if not ply then return end
- BroadcastMessage("Player \"" .. name .. "\" was slayed by \"" .. admin:GetName() .. "\"")
- ply:Kill()
- if DEBUG then print(ply:GetName().." is being slayed.") end
- end)
- net.Receive("ivt-player-mute", function(length, admin)
- if not (admin:IsAdmin() or admin:IsSuperAdmin()) then
- admin:PrintMessage(HUD_PRINTTALK, "You must be an admin to mute players.")
- return
- end
- local name = net.ReadString()
- local reason = net.ReadString()
- local ply = FindPlayerByName(name)
- if not ply then return end
- createMutedPlayer(playerDatabaseId[ply:SteamID()], playerDatabaseId[admin:SteamID()], reason)
- local mutedDate = getPlayerMutedData(playerDatabaseId[ply:SteamID()])
- if not mutedData then
- ply:Kick("Error occured while communicating with database. Try again later!")
- else
- BroadcastMessage("Player \"" .. name .. "\" was muted by \"" .. admin:GetName() .. "\"")
- if DEBUG then print(ply:GetName().." is being muted.") end
- mutedPlayers[ply] = true
- end
- end)
- net.Receive("ivt-maplist-request", function(length, ply)
- local maps = file.Find("maps/*.bsp", "GAME")
- if DEBUG then print("SERVER: Player is ready!") end
- net.Start("ivt-maplist-load")
- do
- net.WriteFloat(#maps)
- for i = 1, #maps do
- net.WriteString(string.sub(maps[i], 1, #maps[i] - 4))
- end
- end
- net.Send(ply)
- end)
- net.Receive("ivt-map-change", function(length, admin)
- if not (admin:IsAdmin() or admin:IsSuperAdmin()) then
- admin:PrintMessage(HUD_PRINTTALK, "You must be an admin to change the map.")
- return
- end
- local map = net.ReadString()
- if DEBUG then print(admin:GetName().." is changing the map to "..map) end
- game.ConsoleCommand("changelevel "..map.."\n")
- end)
- -- EFFECTS
- hook.Add("PlayerCanHearPlayersVoice", function(p1, p2)
- return not mutedPlayers[p2]
- end)
- -- UPDATING
- timer.Create("ivt-playerlist-update-timer", 1, 0, function()
- local players = player.GetAll()
- net.Start("ivt-playerlist-update")
- do
- net.WriteFloat(#players)
- for k, ply in pairs(players) do
- net.WriteFloat(playerDatabaseId[ply:SteamID()])
- net.WriteString(ply:GetName())
- net.WriteString(ply:SteamID())
- if ply:Team() == TEAM_SPECTATOR then
- net.WriteInt(3, 8)
- elseif ply:Alive() then
- net.WriteInt(2, 8)
- else
- net.WriteInt(1, 8)
- end
- end
- end
- net.Broadcast()
- end)
- else
- resource.AddFile("materials/icon16/user_world.png")
- if DEBUG then print("Starting up IV Toolkit") end
- local panelIsOpen = false
- local frame
- local maps = nil
- local listedPlayers = { }
- function CreatePlayerInputFrame()
- local frame = vgui.Create("DFrame")
- frame:SetSize(200, 200)
- frame:Center()
- frame:SetVisible(true)
- frame:SetDraggable(true)
- frame:SetSizable(false)
- frame:ShowCloseButton(true)
- frame:SetDeleteOnClose(false)
- frame:SetKeyBoardInputEnabled(true)
- return frame
- end
- local function CreateToolkitFrame()
- if panelIsOpen then
- frame:Close()
- panelIsOpen = false
- return
- end
- panelIsOpen = true
- frame = vgui.Create("DFrame")
- local sheet = vgui.Create("DPropertySheet", frame)
- local playerTab = vgui.Create("DPanel", sheet)
- playerTab.banButton = vgui.Create("DButton", playerTab)
- playerTab.kickButton = vgui.Create("DButton", playerTab)
- playerTab.igniteButton = vgui.Create("DButton", playerTab)
- playerTab.launchButton = vgui.Create("DButton", playerTab)
- playerTab.slayButton = vgui.Create("DButton", playerTab)
- playerTab.muteButton = vgui.Create("DButton", playerTab)
- playerTab.playerList = vgui.Create("DListView")
- local mapTab = vgui.Create("DPanel", sheet)
- mapTab.changeButton = vgui.Create("DButton", mapTab)
- mapTab.mapList = vgui.Create("DListView", mapTab)
- frame:SetSize(800, 600)
- frame:Center()
- frame:SetTitle("Initial Vector Admin Panel")
- frame:SetVisible(true)
- frame:SetDraggable(true)
- frame:SetSizable(false)
- frame:ShowCloseButton(true)
- frame:SetDeleteOnClose(false)
- frame:MakePopup()
- frame:SetKeyBoardInputEnabled(false)
- function frame:OnClose()
- panelIsOpen = false
- end
- sheet:SetPos(5, 30)
- sheet:SetSize(frame:GetWide() - 10, frame:GetTall() - 40)
- function playerTab:Paint()
- surface.SetDrawColor(108, 111, 114, 255)
- surface.DrawRect(0, 0, self:GetWide(), self:GetTall())
- end
- local buttonHeight = playerTab.banButton:GetTall()
- playerTab.banButton:SetText("Ban")
- playerTab.banButton:SetPos(20, 20)
- playerTab.banButton:SetWide(70)
- function playerTab.banButton:DoClick()
- local playerInputFrame = CreatePlayerInputFrame()
- playerInputFrame:SetTitle("Ban a Player")
- playerInputFrame:SetSize(300, 168)
- playerInputFrame:MakePopup()
- local width = playerInputFrame:GetWide()
- local height = playerInputFrame:GetTall()
- playerInputFrame.dayWang = vgui.Create("DNumberWang", playerInputFrame)
- playerInputFrame.hourWang = vgui.Create("DNumberWang", playerInputFrame)
- playerInputFrame.minuteWang = vgui.Create("DNumberWang", playerInputFrame)
- playerInputFrame.secondWang = vgui.Create("DNumberWang", playerInputFrame)
- playerInputFrame.dayLabel = vgui.Create("DLabel", playerInputFrame)
- playerInputFrame.hourLabel = vgui.Create("DLabel", playerInputFrame)
- playerInputFrame.minuteLabel = vgui.Create("DLabel", playerInputFrame)
- playerInputFrame.secondLabel = vgui.Create("DLabel", playerInputFrame)
- playerInputFrame.reasonLabel = vgui.Create("DLabel", playerInputFrame)
- playerInputFrame.reasonEntry = vgui.Create("DTextEntry", playerInputFrame)
- playerInputFrame.banButton = vgui.Create("DButton", playerInputFrame)
- playerInputFrame.dayLabel:SetPos(10, 35)
- playerInputFrame.dayLabel:SetColor(Color(255,255,255,255))
- playerInputFrame.dayLabel:SetText("Days:")
- playerInputFrame.hourLabel:SetPos(10, 60)
- playerInputFrame.hourLabel:SetColor(Color(255,255,255,255))
- playerInputFrame.hourLabel:SetText("Hours:")
- playerInputFrame.minuteLabel:SetPos(10, 85)
- playerInputFrame.minuteLabel:SetColor(Color(255,255,255,255))
- playerInputFrame.minuteLabel:SetText("Minutes:")
- playerInputFrame.secondLabel:SetPos(10, 110)
- playerInputFrame.secondLabel:SetColor(Color(255,255,255,255))
- playerInputFrame.secondLabel:SetText("Seconds:")
- playerInputFrame.dayWang:SetPos(70, 35)
- playerInputFrame.dayWang:SetSize(40, 20)
- playerInputFrame.dayWang:SetMin(0)
- playerInputFrame.dayWang:SetMax(9e10)
- playerInputFrame.hourWang:SetPos(70, 60)
- playerInputFrame.hourWang:SetSize(40, 20)
- playerInputFrame.hourWang:SetMin(0)
- playerInputFrame.hourWang:SetMax(23)
- playerInputFrame.minuteWang:SetPos(70, 85)
- playerInputFrame.minuteWang:SetSize(40, 20)
- playerInputFrame.minuteWang:SetMin(0)
- playerInputFrame.minuteWang:SetMax(59)
- playerInputFrame.secondWang:SetPos(70, 110)
- playerInputFrame.secondWang:SetSize(40, 20)
- playerInputFrame.secondWang:SetMin(0)
- playerInputFrame.secondWang:SetMax(59)
- playerInputFrame.reasonLabel:SetPos(10, height - 33)
- playerInputFrame.reasonLabel:SetColor(Color(255,255,255,255))
- playerInputFrame.reasonLabel:SetText("Reason:")
- playerInputFrame.reasonEntry:SetMultiline(false)
- playerInputFrame.reasonEntry:SetPos(70, height - 33)
- playerInputFrame.reasonEntry:SetSize(width - 80, 20)
- playerInputFrame.banButton:SetText("Ban")
- playerInputFrame.banButton:SetPos(120, 35)
- playerInputFrame.banButton:SetSize(width - 130, 95)
- function playerInputFrame.banButton:DoClick()
- if #playerTab.playerList:GetSelected() == 0 then return end
- local days = playerInputFrame.dayWang:GetValue()
- local hours = playerInputFrame.hourWang:GetValue()
- local minutes = playerInputFrame.minuteWang:GetValue()
- local seconds = playerInputFrame.secondWang:GetValue()
- local minutes = days * 24 * 60 + hours * 60 + minutes + seconds/60
- local reason = playerInputFrame.reasonEntry:GetValue()
- for i, line in pairs(playerTab.playerList:GetSelected()) do
- local banName = line:GetValue(2)
- net.Start("ivt-player-ban")
- do
- net.WriteString(banName)
- net.WriteFloat(minutes)
- net.WriteString(reason)
- end
- net.SendToServer()
- end
- end
- end
- playerTab.kickButton:SetText("Kick")
- playerTab.kickButton:SetPos(100, 20)
- playerTab.kickButton:SetWide(70)
- function playerTab.kickButton:DoClick()
- local playerInputFrame = CreatePlayerInputFrame()
- playerInputFrame:SetTitle("Kick a Player")
- playerInputFrame:SetSize(300, 97)
- playerInputFrame:MakePopup()
- local width = playerInputFrame:GetWide()
- local height = playerInputFrame:GetTall()
- playerInputFrame.reasonLabel = vgui.Create("DLabel", playerInputFrame)
- playerInputFrame.reasonEntry = vgui.Create("DTextEntry", playerInputFrame)
- playerInputFrame.kickButton = vgui.Create("DButton", playerInputFrame)
- playerInputFrame.reasonLabel:SetPos(10, height - 63)
- playerInputFrame.reasonLabel:SetColor(Color(255,255,255,255))
- playerInputFrame.reasonLabel:SetText("Reason:")
- playerInputFrame.reasonEntry:SetMultiline(false)
- playerInputFrame.reasonEntry:SetPos(70, height - 63)
- playerInputFrame.reasonEntry:SetSize(width - 80, 20)
- playerInputFrame.kickButton:SetText("Kick")
- playerInputFrame.kickButton:SetPos(10, height - 33)
- playerInputFrame.kickButton:SetWide(width - 20)
- function playerInputFrame.kickButton:DoClick()
- if #playerTab.playerList:GetSelected() == 0 then return end
- local reason = playerInputFrame.reasonEntry:GetValue()
- for i, line in pairs(playerTab.playerList:GetSelected()) do
- local kickName = line:GetValue(2)
- net.Start("ivt-player-kick")
- do
- net.WriteString(kickName)
- net.WriteString(reason)
- end
- net.SendToServer()
- end
- end
- end
- playerTab.igniteButton:SetText("Ignite")
- playerTab.igniteButton:SetPos(180, 20)
- playerTab.igniteButton:SetWide(70)
- function playerTab.igniteButton:DoClick()
- local playerInputFrame = CreatePlayerInputFrame()
- playerInputFrame:SetTitle("Ignite a Player")
- playerInputFrame:SetSize(300, 68)
- playerInputFrame:MakePopup()
- local width = playerInputFrame:GetWide()
- local height = playerInputFrame:GetTall()
- playerInputFrame.durationLabel = vgui.Create("DLabel", playerInputFrame)
- playerInputFrame.durationWang = vgui.Create("DNumberWang", playerInputFrame)
- playerInputFrame.igniteButton = vgui.Create("DButton", playerInputFrame)
- playerInputFrame.durationLabel:SetPos(10, 35)
- playerInputFrame.durationLabel:SetColor(Color(255,255,255,255))
- playerInputFrame.durationLabel:SetText("Duration:")
- playerInputFrame.durationWang:SetPos(70, 35)
- playerInputFrame.durationWang:SetSize(40, 20)
- playerInputFrame.durationWang:SetMin(0)
- playerInputFrame.igniteButton:SetText("Ignite")
- playerInputFrame.igniteButton:SetPos(120, 35)
- playerInputFrame.igniteButton:SetWide(width - 130)
- function playerInputFrame.igniteButton:DoClick()
- if #playerTab.playerList:GetSelected() == 0 then return end
- local duration = playerInputFrame.durationWang:GetValue()
- for i, line in pairs(playerTab.playerList:GetSelected()) do
- local igniteName = line:GetValue(2)
- net.Start("ivt-player-ignite")
- do
- net.WriteString(igniteName)
- net.WriteFloat(duration)
- end
- net.SendToServer()
- end
- end
- end
- playerTab.launchButton:SetText("Launch")
- playerTab.launchButton:SetPos(260, 20)
- playerTab.launchButton:SetWide(70)
- function playerTab.launchButton:DoClick()
- local playerInputFrame = CreatePlayerInputFrame()
- playerInputFrame:SetTitle("Launch a Player")
- playerInputFrame:SetSize(300, 68)
- playerInputFrame:MakePopup()
- local width = playerInputFrame:GetWide()
- local height = playerInputFrame:GetTall()
- playerInputFrame.forceLabel = vgui.Create("DLabel", playerInputFrame)
- playerInputFrame.forceWang = vgui.Create("DNumberWang", playerInputFrame)
- playerInputFrame.launchButton = vgui.Create("DButton", playerInputFrame)
- playerInputFrame.forceLabel:SetPos(10, 35)
- playerInputFrame.forceLabel:SetColor(Color(255,255,255,255))
- playerInputFrame.forceLabel:SetText("Force:")
- playerInputFrame.forceWang:SetPos(70, 35)
- playerInputFrame.forceWang:SetSize(40, 20)
- playerInputFrame.forceWang:SetMin(0)
- playerInputFrame.launchButton:SetText("Launch")
- playerInputFrame.launchButton:SetPos(120, 35)
- playerInputFrame.launchButton:SetWide(width - 130)
- function playerInputFrame.launchButton:DoClick()
- if #playerTab.playerList:GetSelected() == 0 then return end
- local force = playerInputFrame.forceWang:GetValue()
- for i, line in pairs(playerTab.playerList:GetSelected()) do
- local forceName = line:GetValue(2)
- net.Start("ivt-player-launch")
- do
- net.WriteString(forceName)
- net.WriteFloat(force)
- end
- net.SendToServer()
- end
- end
- end
- playerTab.slayButton:SetText("Slay")
- playerTab.slayButton:SetPos(340, 20)
- playerTab.slayButton:SetWide(70)
- function playerTab.slayButton:DoClick()
- if #playerTab.playerList:GetSelected() == 0 then return end
- for i, line in pairs(playerTab.playerList:GetSelected()) do
- local slayName = line:GetValue(2)
- net.Start("ivt-player-slay")
- do
- net.WriteString(slayName)
- end
- net.SendToServer()
- end
- end
- playerTab.muteButton:SetText("Mute")
- playerTab.muteButton:SetPos(180, 20)
- playerTab.muteButton:SetWide(70)
- function playerTab.muteButton:DoClick()
- local playerInputFrame = CreatePlayerInputFrame()
- playerInputFrame:SetTitle("Mute a Player")
- playerInputFrame:SetSize(300, 97)
- playerInputFrame:MakePopup()
- local width = playerInputFrame:GetWide()
- local height = playerInputFrame:GetTall()
- playerInputFrame.reasonLabel = vgui.Create("DLabel", playerInputFrame)
- playerInputFrame.reasonEntry = vgui.Create("DTextEntry", playerInputFrame)
- playerInputFrame.muteButton = vgui.Create("DButton", playerInputFrame)
- playerInputFrame.reasonLabel:SetPos(10, height - 63)
- playerInputFrame.reasonLabel:SetColor(Color(255,255,255,255))
- playerInputFrame.reasonLabel:SetText("Reason:")
- playerInputFrame.reasonEntry:SetMultiline(false)
- playerInputFrame.reasonEntry:SetPos(70, height - 63)
- playerInputFrame.reasonEntry:SetSize(width - 80, 20)
- playerInputFrame.muteButton:SetText("Mute")
- playerInputFrame.muteButton:SetPos(10, height - 33)
- playerInputFrame.muteButton:SetWide(width - 20)
- function playerInputFrame.muteButton:DoClick()
- if #playerTab.playerList:GetSelected() == 0 then return end
- local reason = playerInputFrame.reasonEntry:GetValue()
- for i, line in pairs(playerTab.playerList:GetSelected()) do
- local muteName = line:GetValue(2)
- net.Start("ivt-player-mute")
- do
- net.WriteString(muteName)
- net.WriteString(reason)
- end
- net.SendToServer()
- end
- end
- end
- local playerTabWidth = sheet:GetWide()
- local playerTabHeight = sheet:GetTall()
- playerTab.playerList:SetParent(playerTab)
- playerTab.playerList:SetPos(20, 20 + buttonHeight + 20)
- playerTab.playerList:SetSize(playerTabWidth - 56, playerTabHeight - (40 + buttonHeight) - 40 - 16)
- playerTab.playerList:SetMultiSelect(true)
- playerTab.playerList:AddColumn("ID")
- playerTab.playerList:AddColumn("Display Name")
- playerTab.playerList:AddColumn("Steam ID")
- playerTab.playerList:AddColumn("Status")
- local mapTabWidth = sheet:GetWide()
- local mapTabHeight = sheet:GetTall()
- function mapTab:Paint()
- surface.SetDrawColor(108, 111, 114, 255)
- surface.DrawRect(0, 0, self:GetWide(), self:GetTall())
- end
- mapTab.changeButton:SetText("Change Map")
- mapTab.changeButton:SetPos(mapTabWidth/2 - mapTab.changeButton:GetWide()/2 - 8, 20)
- function mapTab.changeButton:DoClick()
- local selected = mapTab.mapList:GetSelected()
- if #selected ~= 1 then return end
- local mapName = selected[1]:GetValue(1)
- net.Start("ivt-map-change")
- do
- net.WriteString(mapName)
- end
- net.SendToServer()
- end
- mapTab.mapList:SetParent(mapTab)
- mapTab.mapList:SetPos(20, 20 + buttonHeight + 20)
- mapTab.mapList:SetSize(mapTabWidth - 56, mapTabHeight - (40 + buttonHeight) - 40 - 16)
- frame:SetVisible(true)
- mapTab.mapList:SetMultiSelect(false)
- mapTab.mapList:AddColumn("Name")
- if not maps then
- maps = { }
- net.Start("ivt-maplist-request")
- net.SendToServer()
- end
- net.Receive("ivt-maplist-load", function(length)
- if DEBUG then print("Loading maps from server.") end
- if DEBUG then print("Length of packet: "..length) end
- local mapCount = net.ReadFloat()
- if DEBUG then print("Number of maps: "..mapCount) end
- local mapIndex = 1
- for i = 1, mapCount do
- local mapName = net.ReadString()
- if DEBUG then print(mapName) end
- maps[mapName] = mapName
- mapTab.mapList:AddLine(mapName)
- end
- end)
- function getPlayerListLineByName(name)
- for i, line in pairs(playerTab.playerList:GetLines()) do
- local lineName = line:GetValue(2)
- if lineName == name then
- return line
- end
- end
- return nil
- end
- net.Receive("ivt-playerlist-update", function()
- local newListedPlayers = { }
- local playerCount = net.ReadFloat()
- for i = 1, playerCount do
- local playerID = net.ReadFloat()
- local playerName = net.ReadString()
- local playerSteamID = net.ReadString()
- local playerStatusData = net.ReadInt(8)
- local playerStatus
- if playerStatusData == 1 then
- playerStatus = "Dead"
- elseif playerStatusData == 2 then
- playerStatus = "Alive"
- elseif playerStatusData == 3 then
- playerStatus = "Spectator"
- end
- newListedPlayers[playerName] = {ID = playerID, steamID = playerSteamID, status = playerStatus}
- if not listedPlayers[playerName] then
- playerTab.playerList:AddLine(playerID, playerName, playerSteamID, playerStatus)
- else
- local line = getPlayerListLineByName(playerName)
- if line then
- line:SetValue(4, playerStatus)
- end
- end
- end
- for i, line in pairs(playerTab.playerList:GetLines()) do
- local playerName = line:GetValue(2)
- if not newListedPlayers[playerName] then
- playerTab.playerList:RemoveLine(i)
- end
- end
- listedPlayers = newListedPlayers
- end)
- for name, ply in pairs(listedPlayers) do
- playerTab.playerList:AddLine(ply.ID, name, ply.steamID, ply.status)
- end
- for k, map in pairs(maps) do
- mapTab.mapList:AddLine(map)
- end
- sheet:AddSheet("Player", playerTab, "icon16/user_world.png", false, false, "Player Commands")
- sheet:AddSheet("Map", mapTab, "icon16/user_world.png", false, false, "Map Change")
- end
- concommand.Add("ivt_open", CreateToolkitFrame)
- end
Add Comment
Please, Sign In to add comment