Advertisement
Frankess

sh_votemap

Jan 14th, 2013
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 6.35 KB | None | 0 0
  1. /*-------------------------------------------------------------------------------------------------------------------------
  2.    
  3. -------------------------------------------------------------------------------------------------------------------------*/
  4.  
  5. local PLUGIN = {}
  6. PLUGIN.Title = "VoteMap"
  7. PLUGIN.Description = "Vote for map"
  8. PLUGIN.Author = "Frankess"
  9. PLUGIN.ChatCommand = "votemap"
  10. PLUGIN.Usage = 'name/number or nothing to print list in console'
  11. PLUGIN.Privileges = { "Votemap" }
  12. PLUGIN.maps = {}
  13. PLUGIN.VM_Voters = {}
  14.  
  15. if SERVER then
  16.     util.AddNetworkString( "EV_Printmaps" )
  17.     CreateConVar("ev_votemap_inprogress", 0)
  18.     CreateConVar("ev_votemap_minratio", 0.6, _, "How many percent of votes is needed to vote become succesful")
  19.     CreateConVar("ev_votemap_time", 30, _, "How many percent of votes is needed to vote become succesful")
  20. end
  21.  
  22. for k,v in pairs (file.Find( "maps/*", "MOD" )) do
  23.     if string.Right(v,4) == ".bsp" then
  24.         table.insert(PLUGIN.maps, string.sub(v, 1, string.len(v)-4))
  25.     end
  26. end
  27.  
  28. function PLUGIN:FindMapNumber( map )
  29.     for k,v in pairs (PLUGIN.maps) do
  30.         if v == map then
  31.             return tostring(k)
  32.         end
  33.     end
  34. end
  35.  
  36. function PLUGIN:FindMap( map )
  37.     local match = string.len(map)
  38.     if match<=3 then return false end
  39.     local closest = nil
  40.     for _,v in pairs (self.maps) do
  41.         if (v == map) then return true end
  42.         if (string.Left(v, match) == map) then
  43.             closest = v
  44.             match = match + 1
  45.         end
  46.     end
  47.     return false, closest
  48. end
  49.  
  50. function PLUGIN:Call( ply, args )
  51.     if ( ply:EV_HasPrivilege( "Votemap" ) ) then
  52.     if ( #player.GetAll() < 3 and not ply:EV_IsRespected() ) then
  53.         evolve:Notify( ply, evolve.colors.red, "There aren't enough players to start a vote!" )
  54.     end
  55.    
  56.         if( #args == 0 and SERVER ) then
  57.             net.Start( "EV_Printmaps" )
  58.                 net.WriteTable( self.maps )
  59.             net.Send( ply )
  60.             evolve:Notify( ply, evolve.colors.blue, "List of maps was sent to your console." )
  61.         else
  62.             local map = args[1]
  63.             if string.byte(map,1,1) >= 48 and string.byte(map,1,1) <= 57 then
  64.                 if self.maps[tonumber(map)] then
  65.                     if not self.VM_InProgress then
  66.                         self:StartVoteMap( self.maps[tonumber(map)], ply )
  67.                     else
  68.                         if ply.VM_map and ply.VM_map == self.maps[tonumber(map)] then evolve:Notify( ply, evolve.colors.red, "You have already voted for that map" ); return end
  69.                         self:VoteForMap( self.maps[tonumber(map)], ply )
  70.                     end
  71.                 else
  72.                     evolve:Notify( ply, evolve.colors.red, "There is no such map. Maybe you typed wrong number?" )
  73.                 end
  74.             else
  75.                 local correct, closest = self:FindMap( map )
  76.                 if correct then
  77.                     if not self.VM_InProgress then
  78.                         self:StartVoteMap( map, ply )
  79.                     else
  80.                         if ply.VM_map and ply.VM_map == map then evolve:Notify( ply, evolve.colors.red, "You have already voted for that map" ); return end
  81.                         self:VoteForMap( map, ply )
  82.                     end
  83.                 elseif closest then
  84.                     evolve:Notify( ply, evolve.colors.blue, "Did you mean ".. closest .."?" )
  85.                 else
  86.                     evolve:Notify( ply, evolve.colors.red, "There is no such map." )
  87.                 end
  88.             end
  89.         end
  90.     else
  91.         evolve:Notify( ply, evolve.colors.red, evolve.constants.notallowed )
  92.     end
  93. end
  94.  
  95. function PLUGIN:StartVoteMap( map, ply  )
  96.     local num = self:FindMapNumber( map )
  97.     evolve:Notify( evolve.colors.blue, ply:Nick(), evolve.colors.white, " started votemap for ", evolve.colors.red, map, evolve.colors.white, " (", evolve.colors.red, num, evolve.colors.white, ")"  )
  98.     self.VM_InProgress = true
  99.     ply.VM_map = map
  100.     table.insert(self.VM_Voters, ply)
  101.     if ply:EV_IsRespected() then table.insert(self.VM_Voters, ply) end
  102.     //timer.Create( "EV_VoteMapEnd", GetConVarNumber("ev_votemap_time"), 1, function() PLUGIN:VoteMapEnd() end )
  103.     RunConsoleCommand("EV_BeginCountdown", GetConVarNumber("ev_votemap_time"), 'votemap end', 'EV_EndVoteMap')
  104.    
  105.     RunConsoleCommand("ev_votemap_inprogress", 1)
  106. end
  107.  
  108. function PLUGIN:VoteForMap( map, ply  )
  109.     if not ply:IsValid() then return end
  110.     if not ply.VM_map == map then
  111.         table.insert(self.VM_Voters, ply)
  112.         if ply:EV_IsRespected() then table.insert(self.VM_Voters, ply) end
  113.         local num = self:FindMapNumber( map )
  114.         evolve:Notify( evolve.colors.blue, ply:Nick(), evolve.colors.white, " voted for ", evolve.colors.red, map, evolve.colors.white, " (", evolve.colors.red, num, evolve.colors.white, ")"  )
  115.         ply.VM_map = map
  116.     else
  117.         local num = self:FindMapNumber( map )
  118.         evolve:Notify( evolve.colors.blue, ply:Nick(), evolve.colors.white, " changed his vote to ", evolve.colors.red, map, evolve.colors.white, " (", evolve.colors.red, num, evolve.colors.white, ")"  )
  119.         ply.VM_map = map
  120.     end
  121. end
  122.  
  123. function PLUGIN:VoteMapEnd()
  124.     self.VM_InProgress = false
  125.    
  126.     if #self.VM_Voters <= 1 then
  127.         evolve:Notify( evolve.colors.red, "Vote was unsuccessful" )
  128.         RunConsoleCommand("ev_votemap_inprogress", 0)
  129.         return
  130.     end
  131.    
  132.     local Voters = #self.VM_Voters
  133.     local Winner = nil
  134.     local Winning = 0
  135.     local maps = {}
  136.    
  137.     for _,v in ipairs (self.VM_Voters) do
  138.         if not maps[v.VM_map] then
  139.             maps[v.VM_map] = 1
  140.             Winner = v.VM_map
  141.             Winning = 1
  142.         else
  143.             maps[v.VM_map] = maps[v.VM_map] + 1
  144.             if maps[v.VM_map] > Winning then
  145.                 Winner = v.VM_map
  146.                 Winning = maps[v.VM_map]
  147.             end
  148.         end
  149.     end
  150.    
  151.     for _,v in ipairs (self.VM_Voters) do v.VM_map = nil end
  152.     self.VM_Voters = {}
  153.    
  154.     if (Winning/Voters) < GetConVarNumber("ev_votemap_minratio") then
  155.         evolve:Notify( evolve.colors.red, "Vote was unsuccessful" )
  156.         RunConsoleCommand("ev_votemap_inprogress", 0)
  157.         return
  158.     else
  159.         evolve:Notify( evolve.colors.blue, "Changing map to ", evolve.colors.red, Winner )
  160.         //timer.Create( "EV_Changelevel", 10, 1, function() RunConsoleCommand("ev_votemap_inprogress", 0); RunConsoleCommand( "changelevel", Winner )  end )
  161.         RunConsoleCommand("EV_BeginCountdown", 10, 'changelevel',"changelevel "..Winner)
  162.     end
  163. end
  164. if SERVER then
  165.     concommand.Add( "EV_VetoVoteMap", function(ply)
  166.         if ply:EV_HasPrivilege( "Votemap" ) and ply:EV_HasPrivilege( "Veto" ) then
  167.             timer.Destroy("EV_Changelevel")
  168.             self.VM_Voters = {}
  169.             PLUGIN:VoteMapEnd()
  170.             RunConsoleCommand("EV_CountdownEnd")
  171.         end
  172.     end)
  173.     concommand.Add( "EV_EndVoteMap", function(ply)
  174.         if ply:EV_HasPrivilege( "Votemap" ) and ply:EV_HasPrivilege( "Veto" ) then
  175.             PLUGIN:VoteMapEnd()
  176.         end
  177.     end)
  178. end
  179.  
  180. if CLIENT then
  181.     net.Receive( "EV_Printmaps", function()
  182.         for k,v in ipairs (net.ReadTable()) do
  183.             print(k..": "..v)
  184.         end
  185.     end )
  186. end
  187.  
  188. evolve:RegisterPlugin( PLUGIN )
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement