Advertisement
HK47

Custom Spawnpoints

Oct 31st, 2014
163
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 6.43 KB | None | 0 0
  1. if CLIENT then
  2.     cl_spawnpnts = {}
  3.    
  4.     usermessage.Hook("tws_clear", function() cl_spawnpnts = {} end)
  5.    
  6.     usermessage.Hook("tws_update", function(data)
  7.         local k = data:ReadString()
  8.         local v = data:ReadVector()
  9.        
  10.         table.insert(cl_spawnpnts, { name = k, pos = v })
  11.     end)
  12.    
  13.     local function OpenMenu()
  14.         local current = { name = "Nil", pos = Vector(0, 0, 0) }
  15.        
  16.         local win = vgui.Create("DFrame")
  17.         win:SetSize(600, 450)
  18.         win:Center()
  19.         win:SetTitle("Spawnpoints manager | " .. game.GetMap())
  20.         win:MakePopup()
  21.         win.Paint = function()
  22.             if win and IsValid(win) then
  23.                 local w = win:GetWide()
  24.                 local t = win:GetTall()
  25.                    
  26.                 draw.RoundedBox(0, 0, 0, w, t, Color(0, 0, 0, 230))
  27.             end
  28.         end
  29.        
  30.         local lab = vgui.Create("DLabel", win)
  31.         lab:SetPos(230, 40)
  32.         lab:SetFont("Trebuchet24")
  33.         lab.Think = function() if current.name then lab:SetText("Point: " .. current.name) lab:SizeToContents() end end
  34.        
  35.         local lab = vgui.Create("DLabel", win)
  36.         lab:SetPos(230, 70)
  37.         lab:SetFont("Trebuchet24")
  38.         lab.Think = function() if current.pos then lab:SetText("Pos: " .. tostring(current.pos)) lab:SizeToContents() end end
  39.        
  40.         local del = vgui.Create("DButton", win)
  41.         del:SetPos(230, 110)
  42.         del:SetSize(100, 25)
  43.         del:SetText("Delete spawn point")
  44.         del.DoClick = function()
  45.             net.Start("tws_removeptn")
  46.                 net.WriteString(current.name)
  47.                 net.WriteEntity(LocalPlayer())
  48.             net.SendToServer()
  49.            
  50.             win:Close()
  51.             timer.Simple(0.1, function() if IsValid(LocalPlayer()) then OpenMenu() end end)
  52.         end
  53.        
  54.         local lst = vgui.Create("DListView", win)
  55.         lst:SetSize(200, 400)
  56.         lst:SetPos(15, 35)
  57.         lst:AddColumn("Spawnpoint")
  58.        
  59.         for k, v in pairs(cl_spawnpnts) do
  60.             lst:AddLine(v.name)
  61.         end
  62.        
  63.         lst.OnClickLine = function(parent, line, isselected)
  64.             for k, v in pairs(cl_spawnpnts) do
  65.                 if line:GetValue(1) == v.name then current = v break end
  66.             end
  67.            
  68.             hook.Add("CalcView", "tws_viewing" .. LocalPlayer():EntIndex(), function()
  69.                 if not win then hook.Remove("CalcView", "tws_viewing" .. LocalPlayer():EntIndex()) return end
  70.                 if not IsValid(win) then hook.Remove("CalcView", "tws_viewing" .. LocalPlayer():EntIndex()) return end
  71.                 if LocalPlayer():KeyPressed(IN_ATTACK) then hook.Remove("CalcView", "tws_viewing" .. LocalPlayer():EntIndex()) return end
  72.            
  73.                 local pos
  74.                
  75.                 for k, v in pairs(cl_spawnpnts) do
  76.                     if line:GetValue(1) == v.name then pos = v.pos + Vector(0, 0, 50) break end
  77.                 end
  78.                
  79.                 if not pos then hook.Remove("CalcView", "tws_viewing" .. LocalPlayer():EntIndex()) return end
  80.            
  81.                 local view = {}
  82.                
  83.                 view.origin = pos
  84.                 view.angles = Angle(0, CurTime() * 20, 0)
  85.                 view.fov = 90
  86.                      
  87.                 return view
  88.             end)
  89.            
  90.             hook.Add("ShouldDrawLocalPlayer", "tws_shldviewingself" .. LocalPlayer():EntIndex(), function(ply)
  91.                 if not win then hook.Remove("ShouldDrawLocalPlayer", "tws_shldviewingself" .. LocalPlayer():EntIndex()) return end
  92.                 if not IsValid(win) then hook.Remove("ShouldDrawLocalPlayer", "tws_shldviewingself" .. LocalPlayer():EntIndex()) return end
  93.                
  94.                 return true
  95.             end)
  96.         end
  97.     end
  98.    
  99.     usermessage.Hook("tws_mngr", OpenMenu)
  100.    
  101.     return
  102. end
  103.  
  104. function GetSpawnpoints()
  105.     return file.Find("spawnpoints_tws/"  .. game.GetMap() .. "/" .. "*.txt", "DATA")
  106. end
  107.  
  108. function UpdateSpawnpoints()
  109.     umsg.Start("tws_clear")
  110.     umsg.End()
  111.    
  112.     local sp = GetSpawnpoints()
  113.    
  114.     for i = 1, #sp do
  115.         local ptn = string.Explode(".", sp[i])
  116.        
  117.         umsg.Start("tws_update")
  118.             umsg.String(ptn[1])
  119.             umsg.Vector(GetSpawnptnPos(ptn[1]))
  120.         umsg.End()
  121.     end
  122. end
  123.  
  124. function ExSpawnptn(name)
  125.     return file.Exists("spawnpoints_tws/" .. game.GetMap() .. "/" .. name .. ".txt", "DATA")
  126. end
  127.  
  128. function GetSpawnptnPos(name)
  129.     if ExSpawnptn(name) then
  130.         local pos = file.Read("spawnpoints_tws/" .. game.GetMap() .. "/" .. name .. ".txt", "DATA")
  131.         pos = string.Explode(" ", pos)
  132.        
  133.         local num = {}
  134.         for i = 1, 3 do num[i] = pos[i] end
  135.      
  136.         return Vector(num[1], num[2], num[3])
  137.     else
  138.         return nil
  139.     end
  140. end
  141.  
  142. function DelSpawnPoint(name, ply)
  143.     if ExSpawnptn(name) then
  144.         file.Delete("spawnpoints_tws/" .. game.GetMap() .. "/" .. name .. ".txt")
  145.         UpdateSpawnpoints()
  146.            
  147.         ply:ChatPrint(name .. " spawnpoints was deleted!")
  148.     end
  149. end
  150.  
  151. function AddSpawnPoint(name, ply)
  152.     if ExSpawnptn(name) then ply:ChatPrint("This spawnpoint is already existst!") return end
  153.    
  154.     file.Write("spawnpoints_tws/" .. game.GetMap() .. "/" .. name .. ".txt", tostring(ply:GetEyeTrace().HitPos))
  155.     UpdateSpawnpoints()
  156. end
  157.  
  158. util.AddNetworkString("tws_addptn")
  159. util.AddNetworkString("tws_removeptn")
  160.  
  161. /**********
  162.     Removing spawnpoint
  163. **********/
  164. net.Receive("tws_removeptn", function()
  165.     local name = net.ReadString()
  166.     local ply = net.ReadEntity()
  167.    
  168.     DelSpawnPoint(name, ply)
  169. end)
  170.  
  171. /**********
  172.     Adding spawnpoint
  173. **********/
  174. net.Receive("tws_addptn", function()
  175.     local name = net.ReadString()
  176.     local ply = net.ReadEntity()
  177.    
  178.     AddSpawnPoint(name, ply)
  179. end)
  180.  
  181. if not file.Exists("spawnpoints_tws", "DATA") then
  182.     file.CreateDir("spawnpoints_tws")
  183. end
  184.  
  185. if not file.Exists("spawnpoints_tws/" .. game.GetMap(), "DATA") then
  186.     file.CreateDir("spawnpoints_tws/" .. game.GetMap())
  187. else
  188.     local sp = GetSpawnpoints()
  189.    
  190.     for i = 1, #sp do
  191.         local ptn = string.Explode(".", sp[i])
  192.        
  193.         table.insert(SPAWNPOINTS_TWS, ptn[1])
  194.     end
  195.    
  196.     UpdateSpawnpoints()
  197. end
  198.  
  199.  
  200. hook.Add("PlayerSay", "custom_spawnp_tws", function(ply, text, team)
  201.     if not ply:IsAdmin() then return end
  202.    
  203.     local str = string.Explode(" ", text)
  204.    
  205.     if str[1] == "/mngr" then
  206.         UpdateSpawnpoints()
  207.        
  208.         umsg.Start("tws_mngr")
  209.         umsg.End()
  210.     end
  211.    
  212.     if str[1] == "/delsptn" then
  213.         DelSpawnPoint(str[2], ply)
  214.        
  215.         return ""
  216.     end
  217.    
  218.     if str[1] == "/addsptn" then
  219.         AddSpawnPoint(str[2], ply)
  220.    
  221.         ply:ChatPrint(str[2] .. " spawnpoint is done!")
  222.        
  223.         return ""
  224.     end
  225.    
  226.     if str[1] == "/showptn" then
  227.         for k, v in pairs(GetSpawnpoints()) do
  228.             ply:ChatPrint(v)
  229.         end
  230.        
  231.         return ""
  232.     end
  233. end)
  234.  
  235. hook.Add("PlayerSpawn", "ply_spawn_tws", function(ply)
  236.     local tbl = table.Random(GetSpawnpoints())
  237.     tbl = string.Explode(".", tbl)
  238.     tbl = tbl[1]
  239.    
  240.     if GetSpawnptnPos(tbl) then ply:SetPos(GetSpawnptnPos(tbl)) ply:SetEyeAngles(Angle(0, 0, 0)) end
  241. end)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement