Guest User

Untitled

a guest
Dec 15th, 2018
246
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 30.05 KB | None | 0 0
  1. local DEBUG = false
  2.  
  3. if SERVER then
  4.     require ("mysqloo")
  5.     AddCSLuaFile("autorun/ivt-startup.lua")
  6.     util.AddNetworkString("ivt-playerlist-update")
  7.     util.AddNetworkString("ivt-player-ban")
  8.     util.AddNetworkString("ivt-player-unban")
  9.     util.AddNetworkString("ivt-player-kick")
  10.     util.AddNetworkString("ivt-player-ignite")
  11.     util.AddNetworkString("ivt-player-launch")
  12.     util.AddNetworkString("ivt-player-slay")
  13.     --util.AddNetworkString("ivt-player-mute")
  14.     util.AddNetworkString("ivt-maplist-request")
  15.     util.AddNetworkString("ivt-maplist-load")
  16.     util.AddNetworkString("ivt-map-change")
  17.     if DEBUG then print("This server is running IVTools!") end
  18.  
  19.     -- DATABASE
  20.  
  21.     local DATABASE_HOST     = "127.0.0.1"
  22.     local DATABASE_PORT     = 3306
  23.     local DATABASE_NAME     = "srcds"
  24.     local DATABASE_USERNAME = "srcds"
  25.     local DATABASE_PASSWORD = "pH367264c2So47e62x7LHYAB73Uhdc"
  26.  
  27.     database = mysqloo.connect(DATABASE_HOST, DATABASE_USERNAME, DATABASE_PASSWORD, DATABASE_NAME, DATABASE_PORT)
  28.     function database:onConnectionFailed(error_message)
  29.         print("IVT: Can't connect to the database")
  30.         if DEBUG then print("Error: " .. error_message) end
  31.         -- todo kill script?
  32.     end
  33.     database:connect()
  34.  
  35.     -- PLAYERS
  36.  
  37.     local playerDatabaseId  = { }
  38.  
  39.     function FindPlayerByName(str)
  40.         for i, ent in pairs(ents.GetAll()) do
  41.             if ent:IsPlayer() and ent:GetName() == str then return ent end
  42.         end
  43.         return nil
  44.     end
  45.  
  46.     function FindPlayerBySteamID(str)
  47.         for i, ent in pairs(ents.GetAll()) do
  48.             if ent:IsPlayer() and ent:SteamID() == str then return ent end
  49.         end
  50.         return nil
  51.     end
  52.  
  53.     function PlayerIPAddress(ply)
  54.         local ipAddress = ply:IPAddress()
  55.         if ipAddress == "loopback" or ipAddress == "Error!" then
  56.             return "127.0.0.1"
  57.         end
  58.         return string.Explode(":", ipAddress)[1]
  59.     end
  60.  
  61.     function BroadcastMessage(str)
  62.         for i, ply in pairs(player.GetAll()) do
  63.             ply:PrintMessage(HUD_PRINTTALK, str)
  64.         end
  65.     end
  66.  
  67.     hook.Add("PlayerAuthed", "ivt-database-player-authed", function(ply, unused1, unused2)
  68.         -- Initialize the database stuff for the player
  69.         local steamID = string.Explode(":", string.Explode("_", ply:SteamID())[2])
  70.         local x = steamID[1]
  71.         local y = steamID[2]
  72.         local z = steamID[3]
  73.         local databaseId = getPlayerDatabaseId(x, y, z)
  74.         if databaseId < 0 then
  75.             databaseId = createPlayerDatabaseId(x, y, z, PlayerIPAddress(ply), ply:GetName())
  76.             if databaseId < 0 then
  77.                 ply:Kick("Error occured while communicating with database. Try again later!")
  78.                 return
  79.             end
  80.         else
  81.             updatePlayerLast(databaseId, PlayerIPAddress(ply), ply:GetName())
  82.  
  83.             -- Bans
  84.  
  85.             reapBannedPlayers()
  86.             local banData = getPlayerBannedData(databaseId)
  87.             if banData then
  88.                 local date = banData["expiration"]
  89.                 if date == "0000-00-00 00:00:00" then
  90.                     date = "never"
  91.                 else
  92.                     date = "in " .. date
  93.                 end
  94.                 ply:Kick("Banned by \"" .. banData["issuer_name"] .. "\" for the reason of \"" ..  banData["reason"] .. "\" expiring " .. date)
  95.                 return
  96.             end
  97.  
  98.             -- Mutes
  99.  
  100.             local muteData = getPlayerMutedData(databaseId)
  101.             if muteData then
  102.                 mutedPlayers[ply] = true
  103.                 ply:PrintMessage(HUD_PRINTTALK, "You are currently muted on this server for reason \"" .. muteData["reason"] .. "\". You were muted by \"" .. muteData["issuer_name"])
  104.             end
  105.         end
  106.         playerDatabaseId[ply:SteamID()] = databaseId
  107.     end)
  108.  
  109.     hook.Add("PlayerDisconnected", "ivt-database-player-disconnected", function(ply)
  110.         playerDatabaseId[ply:SteamID()] = nil
  111.         mutedPlayers[ply] = nil
  112.     end)
  113.  
  114.     hook.Add("PlayerCanHearPlayersVoice", function(listener, talker)
  115.         return not mutedPlayers[talker]
  116.     end)
  117.  
  118.     function createPlayerDatabaseId(x, y, z, ip_address, name)
  119.         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) .. "')")
  120.         insertQuery:start()
  121.         insertQuery:wait()
  122.         if insertQuery:error() == "" then
  123.             return getPlayerDatabaseId(x, y, z)
  124.         else
  125.             return -1
  126.         end
  127.     end
  128.  
  129.     function getPlayerDatabaseId(x, y, z)
  130.         local selectQuery = database:query("SELECT id FROM accounts WHERE x = ".. database:escape(x) .." AND y = ".. database:escape(y) .." AND z = ".. database:escape(z))
  131.         selectQuery:start()
  132.         selectQuery:wait()
  133.         if selectQuery:error() == "" then
  134.             local data = selectQuery:getData()
  135.             if data[1] then
  136.                 return data[1]["id"]
  137.             else
  138.                 return -1
  139.             end
  140.         else
  141.             return -2
  142.         end
  143.     end
  144.  
  145.     function updatePlayerLast(playerDatabaseId, ip_address, name)
  146.         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)
  147.         updateQuery:start()
  148.     end
  149.  
  150.     function createBannedPlayer(playerDatabaseId, issuerDatabaseId, reason, minutes)
  151.         local date = "0"
  152.         if minutes ~= 0 then
  153.             date = "DATE_ADD(NOW(), INTERVAL " .. minutes .. " MINUTE)"
  154.         end
  155.         local insertQuery = database:query("INSERT INTO banned_accounts (account_id, issuer_id, reason, expiration) VALUES (" .. playerDatabaseId .. ", " .. issuerDatabaseId .. ", '" .. database:escape(reason) .. "', " .. date .. ")")
  156.         insertQuery:start()
  157.     end
  158.  
  159.     function deleteBannedPlayer(banDatabaseId)
  160.         local deleteQuery = database:query("DELETE FROM banned_accounts WHERE id = " .. banDatabaseId)
  161.         deleteQuery:start()
  162.     end
  163.  
  164.     function getPlayerBannedDatas()
  165.         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`)")
  166.         selectQuery:start()
  167.         selectQuery:wait()
  168.         if selectQuery:error() == "" then
  169.             return selectQuery:getData()
  170.         else
  171.             return nil
  172.         end
  173.     end
  174.  
  175.     function getPlayerBannedData(playerDatabaseId)
  176.         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)
  177.         selectQuery:start()
  178.         selectQuery:wait()
  179.         if selectQuery:error() == "" then
  180.             local data = selectQuery:getData()
  181.             if data[1] then
  182.                 return data[1]
  183.             else
  184.                 return nil
  185.             end
  186.         else
  187.             return nil
  188.         end
  189.     end
  190.  
  191.     function reapBannedPlayers()
  192.         local deleteQuery = database:query("DELETE FROM banned_users WHERE expiration != 0 AND expiration < NOW()")
  193.         deleteQuery:start()
  194.         deleteQuery:wait()
  195.         return deleteQuery:error() == ""
  196.     end
  197.  
  198.     function createMutedPlayer(playerDatabaseId, issuerDatabaseId, reason)
  199.         local insertQuery = database:query("INSERT INTO muted_accounts (account_id, issuer_id, reason) VALUES (" .. playerDatabaseId .. ", " .. issuerDatabaseId .. ", '" .. database:escape(reason)")")
  200.         insertQuery:start()
  201.     end
  202.  
  203.     function deleteMutedPlayer(muteDatabaseId)
  204.         local deleteQuery = database:query("DELETE FROM muted_accounts WHERE id = " .. muteDatabaseId)
  205.         deleteQuery:start()
  206.     end
  207.  
  208.     function getPlayerMutedDatas()
  209.         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`)")
  210.         selectQuery:start()
  211.         selectQuery:wait()
  212.         if selectQuery:error() == "" then
  213.             return selectQuery:getData()
  214.         else
  215.             return nil
  216.         end
  217.     end
  218.  
  219.     function getPlayerMutedData(playerDatabaseId)
  220.         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)
  221.         selectQuery:start()
  222.         selectQuery:wait()
  223.         if selectQuery:error() == "" then
  224.             local data = selectQuery:getData()
  225.             if data[1] then
  226.                 return data[1]
  227.             else
  228.                 return nil
  229.             end
  230.         else
  231.             return nil
  232.         end
  233.     end
  234.  
  235.     -- NETWORK
  236.  
  237.     net.Receive("ivt-player-ban", function(length, admin)
  238.         if not (admin:IsAdmin() or admin:IsSuperAdmin()) then
  239.             admin:PrintMessage(HUD_PRINTTALK, "You must be an admin to ban players")
  240.             return
  241.         end
  242.  
  243.         local name = net.ReadString()
  244.         local ply  = FindPlayerByName(name)
  245.         local minutes = net.ReadFloat()
  246.         local reason  = net.ReadString()
  247.         if not ply then return end
  248.  
  249.         createBannedPlayer(playerDatabaseId[ply:SteamID()], playerDatabaseId[admin:SteamID()], reason, minutes)
  250.         local banData = getPlayerBannedData(playerDatabaseId[ply:SteamID()])
  251.         if not banData then
  252.             ply:Kick("Error occured while communicating with database. Try again later!")
  253.         else
  254.             local date = banData["expiration"]
  255.             if date == "0000-00-00 00:00:00" then
  256.                 date = "never"
  257.             else
  258.                 date = "in " .. date
  259.             end
  260.             --BroadcastMessage("Player \"" .. name .. "\" was banned by \"" .. banData["issuer_name"] .. "\" for the reason of \"" ..  banData["reason"] .. "\" expiring " .. date)
  261.             ply:Kick("Banned by \"" .. banData["issuer_name"] .. "\" for the reason of \"" ..  banData["reason"] .. "\" expiring " .. date)
  262.         end
  263.         if DEBUG then print(ply:GetName().." was banned from the server") end
  264.     end)
  265.  
  266.     net.Receive("ivt-player-unban", function(length, admin)
  267.         if not (admin:IsAdmin() or admin:IsSuperAdmin()) then
  268.             admin:PrintMessage(HUD_PRINTTALK, "You must be an admin to unban players")
  269.             return
  270.         end
  271.  
  272.         local banId = net.ReadFloat()
  273.         deleteBannedPlayer(banId)
  274.         if DEBUG then print(banID .. " was unbanned from the server") end
  275.     end)
  276.  
  277.     net.Receive("ivt-player-kick", function(length, admin)
  278.         if not (admin:IsAdmin() or admin:IsSuperAdmin()) then
  279.             admin:PrintMessage(HUD_PRINTTALK, "You must be an admin to kick players.")
  280.             return
  281.         end
  282.  
  283.         local name = net.ReadString()
  284.         local reason = net.ReadString()
  285.         local ply = FindPlayerByName(name)
  286.         if not ply then return end
  287.  
  288.         --BroadcastMessage("Player \"" name .. "\" was kicked by \"" .. admin:GetName() .. "\" for the reason of \"" .. reason .. "\"")
  289.         ply:Kick("Kicked by \"" .. admin:GetName() .. "\" for the reason of \"" .. reason .. "\"")
  290.         if DEBUG then print(ply:GetName().." was kicked from the server.") end
  291.     end)
  292.  
  293.     net.Receive("ivt-player-ignite", function(length, admin)
  294.         if not (admin:IsAdmin() or admin:IsSuperAdmin()) then
  295.             admin:PrintMessage(HUD_PRINTTALK, "You must be an admin to ignite players.")
  296.             return
  297.         end
  298.  
  299.         local name = net.ReadString()
  300.         local duration = net.ReadFloat()
  301.         local ply = FindPlayerByName(name)
  302.  
  303.         if not ply or ply:Team() == TEAM_SPECTATOR then return end
  304.         BroadcastMessage("Player \"" .. name .. "\" was ignited by \"" .. admin:GetName() .. "\"")
  305.         ply:Ignite(duration, 0)
  306.         if DEBUG then print(ply:GetName().." is being ignited for "..duration.." seconds.") end
  307.     end)
  308.  
  309.     net.Receive("ivt-player-launch", function(length, admin)
  310.         if not (admin:IsAdmin() or admin:IsSuperAdmin()) then
  311.             admin:PrintMessage(HUD_PRINTTALK, "You must be an admin to launch players.")
  312.             return
  313.         end
  314.  
  315.         local name = net.ReadString()
  316.         local force = net.ReadFloat()
  317.         local ply = FindPlayerByName(name)
  318.  
  319.         if not ply then return end
  320.         BroadcastMessage("Player \"" .. name .. "\" was launched into the air by \"" .. admin:GetName() .. "\"")
  321.         ply:SetVelocity(Vector(0, 0, force))
  322.         if DEBUG then print(ply:GetName().." is being launched with a force of "..force..".") end
  323.     end)
  324.  
  325.     net.Receive("ivt-player-slay", function(length, admin)
  326.         if not (admin:IsAdmin() or admin:IsSuperAdmin()) then
  327.             admin:PrintMessage(HUD_PRINTTALK, "You must be an admin to slay players.")
  328.             return
  329.         end
  330.  
  331.         local name = net.ReadString()
  332.         local ply = FindPlayerByName(name)
  333.  
  334.         if not ply then return end
  335.         BroadcastMessage("Player \"" .. name .. "\" was slayed by \"" .. admin:GetName() .. "\"")
  336.         ply:Kill()
  337.         if DEBUG then print(ply:GetName().." is being slayed.") end
  338.     end)
  339.  
  340.     net.Receive("ivt-player-mute", function(length, admin)
  341.         if not (admin:IsAdmin() or admin:IsSuperAdmin()) then
  342.             admin:PrintMessage(HUD_PRINTTALK, "You must be an admin to mute players.")
  343.             return
  344.         end
  345.  
  346.         local name = net.ReadString()
  347.         local reason = net.ReadString()
  348.         local ply = FindPlayerByName(name)
  349.  
  350.         if not ply then return end
  351.         createMutedPlayer(playerDatabaseId[ply:SteamID()], playerDatabaseId[admin:SteamID()], reason)
  352.         local mutedDate = getPlayerMutedData(playerDatabaseId[ply:SteamID()])
  353.         if not mutedData then
  354.             ply:Kick("Error occured while communicating with database. Try again later!")
  355.         else
  356.             BroadcastMessage("Player \"" .. name .. "\" was muted by \"" .. admin:GetName() .. "\"")
  357.             if DEBUG then print(ply:GetName().." is being muted.") end
  358.             mutedPlayers[ply] = true
  359.         end
  360.     end)
  361.  
  362.     net.Receive("ivt-maplist-request", function(length, ply)
  363.         local maps = file.Find("maps/*.bsp", "GAME")
  364.         if DEBUG then print("SERVER: Player is ready!") end
  365.  
  366.         net.Start("ivt-maplist-load")
  367.         do
  368.             net.WriteFloat(#maps)
  369.             for i = 1, #maps do
  370.                 net.WriteString(string.sub(maps[i], 1, #maps[i] - 4))
  371.             end
  372.         end
  373.         net.Send(ply)
  374.     end)
  375.  
  376.     net.Receive("ivt-map-change", function(length, admin)
  377.         if not (admin:IsAdmin() or admin:IsSuperAdmin()) then
  378.             admin:PrintMessage(HUD_PRINTTALK, "You must be an admin to change the map.")
  379.             return
  380.         end
  381.  
  382.         local map = net.ReadString()
  383.         if DEBUG then print(admin:GetName().." is changing the map to "..map) end
  384.         game.ConsoleCommand("changelevel "..map.."\n")
  385.     end)
  386.  
  387.     -- EFFECTS
  388.  
  389.     hook.Add("PlayerCanHearPlayersVoice", function(p1, p2)
  390.         return not mutedPlayers[p2]
  391.     end)
  392.  
  393.     -- UPDATING
  394.  
  395.     timer.Create("ivt-playerlist-update-timer", 1, 0, function()
  396.         local players = player.GetAll()
  397.         net.Start("ivt-playerlist-update")
  398.         do
  399.             net.WriteFloat(#players)
  400.             for k, ply in pairs(players) do
  401.                 net.WriteFloat(playerDatabaseId[ply:SteamID()])
  402.                 net.WriteString(ply:GetName())
  403.                 net.WriteString(ply:SteamID())
  404.                 if ply:Team() == TEAM_SPECTATOR then
  405.                     net.WriteInt(3, 8)
  406.                 elseif ply:Alive() then
  407.                     net.WriteInt(2, 8)
  408.                 else
  409.                     net.WriteInt(1, 8)
  410.                 end
  411.             end
  412.         end
  413.         net.Broadcast()
  414.     end)
  415. else
  416.     resource.AddFile("materials/icon16/user_world.png")
  417.     if DEBUG then print("Starting up IV Toolkit") end
  418.  
  419.     local panelIsOpen = false
  420.     local frame
  421.  
  422.     local maps           = nil
  423.     local listedPlayers  = { }
  424.  
  425.     function CreatePlayerInputFrame()
  426.         local frame = vgui.Create("DFrame")
  427.         frame:SetSize(200, 200)
  428.         frame:Center()
  429.         frame:SetVisible(true)
  430.         frame:SetDraggable(true)
  431.         frame:SetSizable(false)
  432.         frame:ShowCloseButton(true)
  433.         frame:SetDeleteOnClose(false)
  434.         frame:SetKeyBoardInputEnabled(true)
  435.         return frame
  436.     end
  437.  
  438.     local function CreateToolkitFrame()
  439.         if panelIsOpen then
  440.             frame:Close()
  441.             panelIsOpen = false
  442.             return
  443.         end
  444.  
  445.         panelIsOpen = true
  446.  
  447.         frame                  = vgui.Create("DFrame")
  448.  
  449.         local sheet            = vgui.Create("DPropertySheet", frame)
  450.  
  451.         local playerTab        = vgui.Create("DPanel", sheet)
  452.         playerTab.banButton    = vgui.Create("DButton", playerTab)
  453.         playerTab.kickButton   = vgui.Create("DButton", playerTab)
  454.         playerTab.igniteButton = vgui.Create("DButton", playerTab)
  455.         playerTab.launchButton = vgui.Create("DButton", playerTab)
  456.         playerTab.slayButton   = vgui.Create("DButton", playerTab)
  457.         playerTab.muteButton   = vgui.Create("DButton", playerTab)
  458.         playerTab.playerList   = vgui.Create("DListView")
  459.  
  460.         local mapTab           = vgui.Create("DPanel", sheet)
  461.         mapTab.changeButton    = vgui.Create("DButton", mapTab)
  462.         mapTab.mapList         = vgui.Create("DListView", mapTab)
  463.    
  464.         frame:SetSize(800, 600)
  465.         frame:Center()
  466.         frame:SetTitle("Initial Vector Admin Panel")
  467.         frame:SetVisible(true)
  468.         frame:SetDraggable(true)
  469.         frame:SetSizable(false)
  470.         frame:ShowCloseButton(true)
  471.         frame:SetDeleteOnClose(false)
  472.         frame:MakePopup()
  473.         frame:SetKeyBoardInputEnabled(false)
  474.  
  475.         function frame:OnClose()
  476.             panelIsOpen = false
  477.         end
  478.  
  479.         sheet:SetPos(5, 30)
  480.         sheet:SetSize(frame:GetWide() - 10, frame:GetTall() - 40)
  481.  
  482.         function playerTab:Paint()
  483.             surface.SetDrawColor(108, 111, 114, 255)
  484.             surface.DrawRect(0, 0, self:GetWide(), self:GetTall())
  485.         end
  486.  
  487.         local buttonHeight = playerTab.banButton:GetTall()
  488.  
  489.         playerTab.banButton:SetText("Ban")
  490.         playerTab.banButton:SetPos(20, 20)
  491.         playerTab.banButton:SetWide(70)
  492.  
  493.         function playerTab.banButton:DoClick()
  494.             local playerInputFrame = CreatePlayerInputFrame()
  495.  
  496.             playerInputFrame:SetTitle("Ban a Player")
  497.             playerInputFrame:SetSize(300, 168)
  498.             playerInputFrame:MakePopup()
  499.            
  500.             local width  = playerInputFrame:GetWide()
  501.             local height = playerInputFrame:GetTall()
  502.  
  503.             playerInputFrame.dayWang     = vgui.Create("DNumberWang", playerInputFrame)
  504.             playerInputFrame.hourWang    = vgui.Create("DNumberWang", playerInputFrame)
  505.             playerInputFrame.minuteWang  = vgui.Create("DNumberWang", playerInputFrame)
  506.             playerInputFrame.secondWang  = vgui.Create("DNumberWang", playerInputFrame)
  507.  
  508.             playerInputFrame.dayLabel    = vgui.Create("DLabel", playerInputFrame)
  509.             playerInputFrame.hourLabel   = vgui.Create("DLabel", playerInputFrame)
  510.             playerInputFrame.minuteLabel = vgui.Create("DLabel", playerInputFrame)
  511.             playerInputFrame.secondLabel = vgui.Create("DLabel", playerInputFrame)
  512.             playerInputFrame.reasonLabel = vgui.Create("DLabel", playerInputFrame)
  513.  
  514.             playerInputFrame.reasonEntry = vgui.Create("DTextEntry", playerInputFrame)
  515.  
  516.             playerInputFrame.banButton   = vgui.Create("DButton", playerInputFrame)
  517.  
  518.             playerInputFrame.dayLabel:SetPos(10, 35)
  519.             playerInputFrame.dayLabel:SetColor(Color(255,255,255,255))
  520.             playerInputFrame.dayLabel:SetText("Days:")
  521.  
  522.             playerInputFrame.hourLabel:SetPos(10, 60)
  523.             playerInputFrame.hourLabel:SetColor(Color(255,255,255,255))
  524.             playerInputFrame.hourLabel:SetText("Hours:")
  525.  
  526.             playerInputFrame.minuteLabel:SetPos(10, 85)
  527.             playerInputFrame.minuteLabel:SetColor(Color(255,255,255,255))
  528.             playerInputFrame.minuteLabel:SetText("Minutes:")
  529.  
  530.             playerInputFrame.secondLabel:SetPos(10, 110)
  531.             playerInputFrame.secondLabel:SetColor(Color(255,255,255,255))
  532.             playerInputFrame.secondLabel:SetText("Seconds:")
  533.  
  534.             playerInputFrame.dayWang:SetPos(70, 35)
  535.             playerInputFrame.dayWang:SetSize(40, 20)
  536.             playerInputFrame.dayWang:SetMin(0)
  537.             playerInputFrame.dayWang:SetMax(9e10)
  538.  
  539.             playerInputFrame.hourWang:SetPos(70, 60)
  540.             playerInputFrame.hourWang:SetSize(40, 20)
  541.             playerInputFrame.hourWang:SetMin(0)
  542.             playerInputFrame.hourWang:SetMax(23)
  543.  
  544.             playerInputFrame.minuteWang:SetPos(70, 85)
  545.             playerInputFrame.minuteWang:SetSize(40, 20)
  546.             playerInputFrame.minuteWang:SetMin(0)
  547.             playerInputFrame.minuteWang:SetMax(59)
  548.  
  549.             playerInputFrame.secondWang:SetPos(70, 110)
  550.             playerInputFrame.secondWang:SetSize(40, 20)
  551.             playerInputFrame.secondWang:SetMin(0)
  552.             playerInputFrame.secondWang:SetMax(59)
  553.  
  554.             playerInputFrame.reasonLabel:SetPos(10, height - 33)
  555.             playerInputFrame.reasonLabel:SetColor(Color(255,255,255,255))
  556.             playerInputFrame.reasonLabel:SetText("Reason:")
  557.  
  558.             playerInputFrame.reasonEntry:SetMultiline(false)
  559.             playerInputFrame.reasonEntry:SetPos(70, height - 33)
  560.             playerInputFrame.reasonEntry:SetSize(width - 80, 20)
  561.  
  562.             playerInputFrame.banButton:SetText("Ban")
  563.             playerInputFrame.banButton:SetPos(120, 35)
  564.             playerInputFrame.banButton:SetSize(width - 130, 95)
  565.  
  566.             function playerInputFrame.banButton:DoClick()
  567.                 if #playerTab.playerList:GetSelected() == 0 then return end
  568.                 local days    = playerInputFrame.dayWang:GetValue()
  569.                 local hours   = playerInputFrame.hourWang:GetValue()
  570.                 local minutes = playerInputFrame.minuteWang:GetValue()
  571.                 local seconds = playerInputFrame.secondWang:GetValue()
  572.  
  573.                 local minutes  = days * 24 * 60 + hours * 60 + minutes + seconds/60
  574.                 local reason   = playerInputFrame.reasonEntry:GetValue()
  575.  
  576.                 for i, line in pairs(playerTab.playerList:GetSelected()) do
  577.                     local banName = line:GetValue(2)
  578.                     net.Start("ivt-player-ban")
  579.                     do
  580.                         net.WriteString(banName)
  581.                         net.WriteFloat(minutes)
  582.                         net.WriteString(reason)
  583.                     end
  584.                     net.SendToServer()
  585.                 end
  586.             end
  587.         end
  588.  
  589.         playerTab.kickButton:SetText("Kick")
  590.         playerTab.kickButton:SetPos(100, 20)
  591.         playerTab.kickButton:SetWide(70)
  592.  
  593.         function playerTab.kickButton:DoClick()
  594.             local playerInputFrame = CreatePlayerInputFrame()
  595.  
  596.             playerInputFrame:SetTitle("Kick a Player")
  597.             playerInputFrame:SetSize(300, 97)
  598.             playerInputFrame:MakePopup()
  599.            
  600.             local width  = playerInputFrame:GetWide()
  601.             local height = playerInputFrame:GetTall()
  602.  
  603.             playerInputFrame.reasonLabel  = vgui.Create("DLabel", playerInputFrame)
  604.             playerInputFrame.reasonEntry  = vgui.Create("DTextEntry", playerInputFrame)
  605.             playerInputFrame.kickButton   = vgui.Create("DButton", playerInputFrame)
  606.  
  607.             playerInputFrame.reasonLabel:SetPos(10, height - 63)
  608.             playerInputFrame.reasonLabel:SetColor(Color(255,255,255,255))
  609.             playerInputFrame.reasonLabel:SetText("Reason:")
  610.  
  611.             playerInputFrame.reasonEntry:SetMultiline(false)
  612.             playerInputFrame.reasonEntry:SetPos(70, height - 63)
  613.             playerInputFrame.reasonEntry:SetSize(width - 80, 20)
  614.  
  615.             playerInputFrame.kickButton:SetText("Kick")
  616.             playerInputFrame.kickButton:SetPos(10, height - 33)
  617.             playerInputFrame.kickButton:SetWide(width - 20)
  618.  
  619.             function playerInputFrame.kickButton:DoClick()
  620.                 if #playerTab.playerList:GetSelected() == 0 then return end
  621.  
  622.                 local reason = playerInputFrame.reasonEntry:GetValue()
  623.  
  624.                 for i, line in pairs(playerTab.playerList:GetSelected()) do
  625.                     local kickName = line:GetValue(2)
  626.                     net.Start("ivt-player-kick")
  627.                     do
  628.                         net.WriteString(kickName)
  629.                         net.WriteString(reason)
  630.                     end
  631.                     net.SendToServer()
  632.                 end
  633.             end
  634.         end
  635.  
  636.         playerTab.igniteButton:SetText("Ignite")
  637.         playerTab.igniteButton:SetPos(180, 20)
  638.         playerTab.igniteButton:SetWide(70)
  639.  
  640.         function playerTab.igniteButton:DoClick()
  641.             local playerInputFrame = CreatePlayerInputFrame()
  642.  
  643.             playerInputFrame:SetTitle("Ignite a Player")
  644.             playerInputFrame:SetSize(300, 68)
  645.             playerInputFrame:MakePopup()
  646.            
  647.             local width  = playerInputFrame:GetWide()
  648.             local height = playerInputFrame:GetTall()
  649.  
  650.             playerInputFrame.durationLabel = vgui.Create("DLabel", playerInputFrame)
  651.             playerInputFrame.durationWang  = vgui.Create("DNumberWang", playerInputFrame)
  652.             playerInputFrame.igniteButton  = vgui.Create("DButton", playerInputFrame)
  653.  
  654.             playerInputFrame.durationLabel:SetPos(10, 35)
  655.             playerInputFrame.durationLabel:SetColor(Color(255,255,255,255))
  656.             playerInputFrame.durationLabel:SetText("Duration:")
  657.  
  658.             playerInputFrame.durationWang:SetPos(70, 35)
  659.             playerInputFrame.durationWang:SetSize(40, 20)
  660.             playerInputFrame.durationWang:SetMin(0)
  661.  
  662.             playerInputFrame.igniteButton:SetText("Ignite")
  663.             playerInputFrame.igniteButton:SetPos(120, 35)
  664.             playerInputFrame.igniteButton:SetWide(width - 130)
  665.  
  666.             function playerInputFrame.igniteButton:DoClick()
  667.                 if #playerTab.playerList:GetSelected() == 0 then return end
  668.  
  669.                 local duration = playerInputFrame.durationWang:GetValue()
  670.  
  671.                 for i, line in pairs(playerTab.playerList:GetSelected()) do
  672.                     local igniteName = line:GetValue(2)
  673.                     net.Start("ivt-player-ignite")
  674.                     do
  675.                         net.WriteString(igniteName)
  676.                         net.WriteFloat(duration)
  677.                     end
  678.                     net.SendToServer()
  679.                 end
  680.             end
  681.         end
  682.  
  683.         playerTab.launchButton:SetText("Launch")
  684.         playerTab.launchButton:SetPos(260, 20)
  685.         playerTab.launchButton:SetWide(70)
  686.  
  687.         function playerTab.launchButton:DoClick()
  688.             local playerInputFrame = CreatePlayerInputFrame()
  689.  
  690.             playerInputFrame:SetTitle("Launch a Player")
  691.             playerInputFrame:SetSize(300, 68)
  692.             playerInputFrame:MakePopup()
  693.            
  694.             local width  = playerInputFrame:GetWide()
  695.             local height = playerInputFrame:GetTall()
  696.  
  697.             playerInputFrame.forceLabel = vgui.Create("DLabel", playerInputFrame)
  698.             playerInputFrame.forceWang  = vgui.Create("DNumberWang", playerInputFrame)
  699.             playerInputFrame.launchButton  = vgui.Create("DButton", playerInputFrame)
  700.  
  701.             playerInputFrame.forceLabel:SetPos(10, 35)
  702.             playerInputFrame.forceLabel:SetColor(Color(255,255,255,255))
  703.             playerInputFrame.forceLabel:SetText("Force:")
  704.  
  705.             playerInputFrame.forceWang:SetPos(70, 35)
  706.             playerInputFrame.forceWang:SetSize(40, 20)
  707.             playerInputFrame.forceWang:SetMin(0)
  708.  
  709.             playerInputFrame.launchButton:SetText("Launch")
  710.             playerInputFrame.launchButton:SetPos(120, 35)
  711.             playerInputFrame.launchButton:SetWide(width - 130)
  712.  
  713.             function playerInputFrame.launchButton:DoClick()
  714.                 if #playerTab.playerList:GetSelected() == 0 then return end
  715.  
  716.                 local force = playerInputFrame.forceWang:GetValue()
  717.  
  718.                 for i, line in pairs(playerTab.playerList:GetSelected()) do
  719.                     local forceName = line:GetValue(2)
  720.                     net.Start("ivt-player-launch")
  721.                     do
  722.                         net.WriteString(forceName)
  723.                         net.WriteFloat(force)
  724.                     end
  725.                     net.SendToServer()
  726.                 end
  727.             end
  728.         end
  729.  
  730.         playerTab.slayButton:SetText("Slay")
  731.         playerTab.slayButton:SetPos(340, 20)
  732.         playerTab.slayButton:SetWide(70)
  733.  
  734.         function playerTab.slayButton:DoClick()
  735.             if #playerTab.playerList:GetSelected() == 0 then return end
  736.  
  737.             for i, line in pairs(playerTab.playerList:GetSelected()) do
  738.                 local slayName = line:GetValue(2)
  739.                 net.Start("ivt-player-slay")
  740.                 do
  741.                     net.WriteString(slayName)
  742.                 end
  743.                 net.SendToServer()
  744.             end
  745.         end
  746.  
  747.         playerTab.muteButton:SetText("Mute")
  748.         playerTab.muteButton:SetPos(180, 20)
  749.         playerTab.muteButton:SetWide(70)
  750.  
  751.         function playerTab.muteButton:DoClick()
  752.             local playerInputFrame = CreatePlayerInputFrame()
  753.  
  754.             playerInputFrame:SetTitle("Mute a Player")
  755.             playerInputFrame:SetSize(300, 97)
  756.             playerInputFrame:MakePopup()
  757.            
  758.             local width  = playerInputFrame:GetWide()
  759.             local height = playerInputFrame:GetTall()
  760.  
  761.             playerInputFrame.reasonLabel  = vgui.Create("DLabel", playerInputFrame)
  762.             playerInputFrame.reasonEntry  = vgui.Create("DTextEntry", playerInputFrame)
  763.             playerInputFrame.muteButton   = vgui.Create("DButton", playerInputFrame)
  764.  
  765.             playerInputFrame.reasonLabel:SetPos(10, height - 63)
  766.             playerInputFrame.reasonLabel:SetColor(Color(255,255,255,255))
  767.             playerInputFrame.reasonLabel:SetText("Reason:")
  768.  
  769.             playerInputFrame.reasonEntry:SetMultiline(false)
  770.             playerInputFrame.reasonEntry:SetPos(70, height - 63)
  771.             playerInputFrame.reasonEntry:SetSize(width - 80, 20)
  772.  
  773.             playerInputFrame.muteButton:SetText("Mute")
  774.             playerInputFrame.muteButton:SetPos(10, height - 33)
  775.             playerInputFrame.muteButton:SetWide(width - 20)
  776.  
  777.             function playerInputFrame.muteButton:DoClick()
  778.                 if #playerTab.playerList:GetSelected() == 0 then return end
  779.  
  780.                 local reason = playerInputFrame.reasonEntry:GetValue()
  781.  
  782.                 for i, line in pairs(playerTab.playerList:GetSelected()) do
  783.                     local muteName = line:GetValue(2)
  784.                     net.Start("ivt-player-mute")
  785.                     do
  786.                         net.WriteString(muteName)
  787.                         net.WriteString(reason)
  788.                     end
  789.                     net.SendToServer()
  790.                 end
  791.             end
  792.         end
  793.  
  794.         local playerTabWidth = sheet:GetWide()
  795.         local playerTabHeight = sheet:GetTall()
  796.         playerTab.playerList:SetParent(playerTab)
  797.         playerTab.playerList:SetPos(20, 20 + buttonHeight + 20)
  798.         playerTab.playerList:SetSize(playerTabWidth - 56, playerTabHeight - (40 + buttonHeight) - 40 - 16)
  799.         playerTab.playerList:SetMultiSelect(true)
  800.         playerTab.playerList:AddColumn("ID")
  801.         playerTab.playerList:AddColumn("Display Name")
  802.         playerTab.playerList:AddColumn("Steam ID")
  803.         playerTab.playerList:AddColumn("Status")
  804.  
  805.         local mapTabWidth = sheet:GetWide()
  806.         local mapTabHeight = sheet:GetTall()
  807.  
  808.         function mapTab:Paint()
  809.             surface.SetDrawColor(108, 111, 114, 255)
  810.             surface.DrawRect(0, 0, self:GetWide(), self:GetTall())
  811.         end
  812.  
  813.         mapTab.changeButton:SetText("Change Map")
  814.         mapTab.changeButton:SetPos(mapTabWidth/2 - mapTab.changeButton:GetWide()/2 - 8, 20)
  815.  
  816.         function mapTab.changeButton:DoClick()
  817.             local selected = mapTab.mapList:GetSelected()
  818.             if #selected ~= 1 then return end
  819.             local mapName = selected[1]:GetValue(1)
  820.             net.Start("ivt-map-change")
  821.             do
  822.                 net.WriteString(mapName)
  823.             end
  824.             net.SendToServer()
  825.         end
  826.  
  827.         mapTab.mapList:SetParent(mapTab)
  828.         mapTab.mapList:SetPos(20, 20 + buttonHeight + 20)
  829.         mapTab.mapList:SetSize(mapTabWidth - 56, mapTabHeight - (40 + buttonHeight) - 40 - 16)
  830.         frame:SetVisible(true)
  831.         mapTab.mapList:SetMultiSelect(false)
  832.         mapTab.mapList:AddColumn("Name")
  833.  
  834.         if not maps then
  835.             maps = { }
  836.             net.Start("ivt-maplist-request")
  837.             net.SendToServer()
  838.         end
  839.  
  840.         net.Receive("ivt-maplist-load", function(length)
  841.             if DEBUG then print("Loading maps from server.") end
  842.             if DEBUG then print("Length of packet: "..length) end
  843.             local mapCount = net.ReadFloat()
  844.             if DEBUG then print("Number of maps: "..mapCount) end
  845.             local mapIndex = 1
  846.  
  847.             for i = 1, mapCount do
  848.                 local mapName = net.ReadString()
  849.                 if DEBUG then print(mapName) end
  850.                 maps[mapName] = mapName
  851.                 mapTab.mapList:AddLine(mapName)
  852.             end
  853.         end)
  854.  
  855.         function getPlayerListLineByName(name)
  856.             for i, line in pairs(playerTab.playerList:GetLines()) do
  857.                 local lineName = line:GetValue(2)
  858.                 if lineName == name then
  859.                     return line
  860.                 end
  861.             end
  862.             return nil
  863.         end
  864.  
  865.         net.Receive("ivt-playerlist-update", function()
  866.             local newListedPlayers = { }
  867.             local playerCount = net.ReadFloat()
  868.             for i = 1, playerCount do
  869.                 local playerID = net.ReadFloat()
  870.                 local playerName     = net.ReadString()
  871.                 local playerSteamID  = net.ReadString()
  872.                 local playerStatusData    = net.ReadInt(8)
  873.                 local playerStatus
  874.                 if playerStatusData == 1 then
  875.                     playerStatus = "Dead"
  876.                 elseif playerStatusData == 2 then
  877.                     playerStatus = "Alive"
  878.                 elseif playerStatusData == 3 then
  879.                     playerStatus = "Spectator"
  880.                 end
  881.                 newListedPlayers[playerName] = {ID = playerID, steamID = playerSteamID, status = playerStatus}
  882.                 if not listedPlayers[playerName] then
  883.                     playerTab.playerList:AddLine(playerID, playerName, playerSteamID, playerStatus)
  884.                 else
  885.                     local line = getPlayerListLineByName(playerName)
  886.                     if line then
  887.                         line:SetValue(4, playerStatus)
  888.                     end
  889.                 end
  890.             end
  891.             for i, line in pairs(playerTab.playerList:GetLines()) do
  892.                 local playerName = line:GetValue(2)
  893.                 if not newListedPlayers[playerName] then
  894.                     playerTab.playerList:RemoveLine(i)
  895.                 end
  896.             end
  897.             listedPlayers = newListedPlayers
  898.         end)
  899.  
  900.         for name, ply in pairs(listedPlayers) do
  901.             playerTab.playerList:AddLine(ply.ID, name, ply.steamID, ply.status)
  902.         end
  903.  
  904.         for k, map in pairs(maps) do
  905.             mapTab.mapList:AddLine(map)
  906.         end
  907.  
  908.         sheet:AddSheet("Player", playerTab, "icon16/user_world.png", false, false, "Player Commands")
  909.         sheet:AddSheet("Map", mapTab, "icon16/user_world.png", false, false, "Map Change")
  910.     end
  911.  
  912.     concommand.Add("ivt_open", CreateToolkitFrame)
  913. end
Add Comment
Please, Sign In to add comment