Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*-------------------------------------------------------------------------------------------------------------------------
- -------------------------------------------------------------------------------------------------------------------------*/
- local PLUGIN = {}
- PLUGIN.Title = "VoteMap"
- PLUGIN.Description = "Vote for map"
- PLUGIN.Author = "Frankess"
- PLUGIN.ChatCommand = "votemap"
- PLUGIN.Usage = 'name/number or nothing to print list in console'
- PLUGIN.Privileges = { "Votemap" }
- PLUGIN.maps = {}
- PLUGIN.VM_Voters = {}
- if SERVER then
- util.AddNetworkString( "EV_Printmaps" )
- CreateConVar("ev_votemap_inprogress", 0)
- CreateConVar("ev_votemap_minratio", 0.6, _, "How many percent of votes is needed to vote become succesful")
- CreateConVar("ev_votemap_time", 30, _, "How many percent of votes is needed to vote become succesful")
- end
- for k,v in pairs (file.Find( "maps/*", "MOD" )) do
- if string.Right(v,4) == ".bsp" then
- table.insert(PLUGIN.maps, string.sub(v, 1, string.len(v)-4))
- end
- end
- function PLUGIN:FindMapNumber( map )
- for k,v in pairs (PLUGIN.maps) do
- if v == map then
- return tostring(k)
- end
- end
- end
- function PLUGIN:FindMap( map )
- local match = string.len(map)
- if match<=3 then return false end
- local closest = nil
- for _,v in pairs (self.maps) do
- if (v == map) then return true end
- if (string.Left(v, match) == map) then
- closest = v
- match = match + 1
- end
- end
- return false, closest
- end
- function PLUGIN:Call( ply, args )
- if ( ply:EV_HasPrivilege( "Votemap" ) ) then
- if ( #player.GetAll() < 3 and not ply:EV_IsRespected() ) then
- evolve:Notify( ply, evolve.colors.red, "There aren't enough players to start a vote!" )
- end
- if( #args == 0 and SERVER ) then
- net.Start( "EV_Printmaps" )
- net.WriteTable( self.maps )
- net.Send( ply )
- evolve:Notify( ply, evolve.colors.blue, "List of maps was sent to your console." )
- else
- local map = args[1]
- if string.byte(map,1,1) >= 48 and string.byte(map,1,1) <= 57 then
- if self.maps[tonumber(map)] then
- if not self.VM_InProgress then
- self:StartVoteMap( self.maps[tonumber(map)], ply )
- else
- 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
- self:VoteForMap( self.maps[tonumber(map)], ply )
- end
- else
- evolve:Notify( ply, evolve.colors.red, "There is no such map. Maybe you typed wrong number?" )
- end
- else
- local correct, closest = self:FindMap( map )
- if correct then
- if not self.VM_InProgress then
- self:StartVoteMap( map, ply )
- else
- 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
- self:VoteForMap( map, ply )
- end
- elseif closest then
- evolve:Notify( ply, evolve.colors.blue, "Did you mean ".. closest .."?" )
- else
- evolve:Notify( ply, evolve.colors.red, "There is no such map." )
- end
- end
- end
- else
- evolve:Notify( ply, evolve.colors.red, evolve.constants.notallowed )
- end
- end
- function PLUGIN:StartVoteMap( map, ply )
- local num = self:FindMapNumber( map )
- 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, ")" )
- self.VM_InProgress = true
- ply.VM_map = map
- table.insert(self.VM_Voters, ply)
- if ply:EV_IsRespected() then table.insert(self.VM_Voters, ply) end
- //timer.Create( "EV_VoteMapEnd", GetConVarNumber("ev_votemap_time"), 1, function() PLUGIN:VoteMapEnd() end )
- RunConsoleCommand("EV_BeginCountdown", GetConVarNumber("ev_votemap_time"), 'votemap end', 'EV_EndVoteMap')
- RunConsoleCommand("ev_votemap_inprogress", 1)
- end
- function PLUGIN:VoteForMap( map, ply )
- if not ply:IsValid() then return end
- if not ply.VM_map == map then
- table.insert(self.VM_Voters, ply)
- if ply:EV_IsRespected() then table.insert(self.VM_Voters, ply) end
- local num = self:FindMapNumber( map )
- 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, ")" )
- ply.VM_map = map
- else
- local num = self:FindMapNumber( map )
- 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, ")" )
- ply.VM_map = map
- end
- end
- function PLUGIN:VoteMapEnd()
- self.VM_InProgress = false
- if #self.VM_Voters <= 1 then
- evolve:Notify( evolve.colors.red, "Vote was unsuccessful" )
- RunConsoleCommand("ev_votemap_inprogress", 0)
- return
- end
- local Voters = #self.VM_Voters
- local Winner = nil
- local Winning = 0
- local maps = {}
- for _,v in ipairs (self.VM_Voters) do
- if not maps[v.VM_map] then
- maps[v.VM_map] = 1
- Winner = v.VM_map
- Winning = 1
- else
- maps[v.VM_map] = maps[v.VM_map] + 1
- if maps[v.VM_map] > Winning then
- Winner = v.VM_map
- Winning = maps[v.VM_map]
- end
- end
- end
- for _,v in ipairs (self.VM_Voters) do v.VM_map = nil end
- self.VM_Voters = {}
- if (Winning/Voters) < GetConVarNumber("ev_votemap_minratio") then
- evolve:Notify( evolve.colors.red, "Vote was unsuccessful" )
- RunConsoleCommand("ev_votemap_inprogress", 0)
- return
- else
- evolve:Notify( evolve.colors.blue, "Changing map to ", evolve.colors.red, Winner )
- //timer.Create( "EV_Changelevel", 10, 1, function() RunConsoleCommand("ev_votemap_inprogress", 0); RunConsoleCommand( "changelevel", Winner ) end )
- RunConsoleCommand("EV_BeginCountdown", 10, 'changelevel',"changelevel "..Winner)
- end
- end
- if SERVER then
- concommand.Add( "EV_VetoVoteMap", function(ply)
- if ply:EV_HasPrivilege( "Votemap" ) and ply:EV_HasPrivilege( "Veto" ) then
- timer.Destroy("EV_Changelevel")
- self.VM_Voters = {}
- PLUGIN:VoteMapEnd()
- RunConsoleCommand("EV_CountdownEnd")
- end
- end)
- concommand.Add( "EV_EndVoteMap", function(ply)
- if ply:EV_HasPrivilege( "Votemap" ) and ply:EV_HasPrivilege( "Veto" ) then
- PLUGIN:VoteMapEnd()
- end
- end)
- end
- if CLIENT then
- net.Receive( "EV_Printmaps", function()
- for k,v in ipairs (net.ReadTable()) do
- print(k..": "..v)
- end
- end )
- end
- evolve:RegisterPlugin( PLUGIN )
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement