#include maps\mp\_utility; #include common_scripts\utility; #include maps\mp\gametypes\_hud_util; /*************************************************************************** Map Vote Menu Mod Created by |UzD|GaZa Site / Support: http://www.uzd-zombies.com/viewtopic.php?f=29&t=33 Based on vote system 1.0 by banz Although now heavily edited/updated for use with a mouse UI by |UzD|GaZa **************************************************************************/ /*************************************************************************** ** Release Notes: ** First Release (30/05/2014):[/u] ** -Added vote menu file ** -Added menu support for banz voting gsc ** ** Update 0.5.0 (29/06/2017) ** -Added support for iw4x 0.5.0 ** -Added support for voting on custom maps ** -Added failsafe for 'sv_votemaps' ** ** Update 0.5.3 (04/07/2017) ** -Added support for iw4x 0.5.3 ** -Votes no longer run on a loop, now when users call ** -Mod is now standalone so works with all mods ** ** Update 0.5.4 (09/07/2017) ** -Added support for iw4x 0.5.4 ** -Added game type vote support ** ** Update 0.5.4-r2 (20/07/2017) ** -Cleaned the UI a little, ** removed some jaggy edges from map previews etc. ** Also bigger selected vote border ** -Better support for 4:3 resolutions *************************************************************************/ init(standalone, maps, gametypes, votetime, winnertime) { /**********INIT CHECKS************************************************************/ level.inVote = undefined;//Undefined here to catch errors later relating to non-standalone if(!isDefined(standalone)) standalone = true;//Default to true if(!isDefined(votetime) || (isDefined(votetime) && votetime < 0)) votetime = 0; if(!isDefined(winnertime) || (isDefined(winnertime) && winnertime < 0)) winnertime = 0; //Do not run if the vote times exceed 30 seconds for a dedicated server. if(!getDvarInt( "party_host" ) && (votetime + winnertime > 30) && standalone) { logPrint("Vote Mod: Not loaded, dedicated server vote times exceed 30 seconds. Check scripts\vote.gsc\n"); return; } //Do not run if the vote times exceed 10 seconds for a private match. else if(getDvarInt( "party_host" ) && (votetime + winnertime > 10) && standalone) { logPrint("Vote Mod: Not loaded, private match vote times exceed 10 seconds. Check scripts\vote.gsc\n"); return; } else if(!votetime || !winnertime) { logPrint("Vote Mod: Not loaded, no/incorrect vote times given. Check scripts\vote.gsc\n"); return; } //Do not run on a party server as there is no intermission else if(matchmakingGame() && standalone) { logPrint("Vote Mod: Not loaded, incompatible with a party server. Read how to disable standalone in scripts\vote.gsc\n"); return; } else logPrint("Vote Mod: Loaded Successfully.\n"); /****************************************************************************/ /***DVARS************************************************************/ //Maps if(!isDefined(maps)) maps = ""; setDvarIfUninitialized( "sv_votemaps", maps); //Game Modes if(!isDefined(gametypes)) gametypes = ""; setDvarIfUninitialized( "sv_gametypes", gametypes); level.VoteVoteTime = int(votetime); //Time available to vote level.VoteWinnerTime = int(winnertime); //Time the winning map is displayed for /****************************************************************************/ /****METHODS************************************************************/ CreateStockMapArray();//Add stock iw4x maps level thread onPlayerConnect();//Player connect if(standalone) level thread monitorIntermission();//Wait for intermission to start before injecting vote mod- Standalone (e.g no gamelogic.gsc) /****************************************************************************/ /*****DEFINE MENU************************************************************/ game["menu_vote"] = "vote"; precacheMenu(game["menu_vote"]); /****************************************************************************/ /*****SETUP VOTE MAPS************************************************************/ level.inVote = false; level.VotePosition = undefined; /******************MAPS*******************************/ level.mapTok = [];//Store Vote Maps level.mapVotes = [];//Store Votes for each map level.voteMaps = ""; level.voteMaps = getDvar( "sv_votemaps" ); if(level.voteMaps == "")//If the user hasnt entered any maps into 'sv_votemaps', set vote to default iw4x ones { stockmaps = getArrayKeys( level.iw4xmaps ); for(i=0;i index) restructArray[i - 1] = oldArray[i]; } return restructArray; } updateVoteDisplayForPlayers() { foreach(player in level.players) { player setClientDvar("hud_gamesize", level.players.size); for(i=0; i < level.mapTok.size; i++) { player setClientDvar(("hud_picName"+i), getPreviewName(level.mapTok[i])); player setClientDvar(("hud_mapName"+i), getLocalisedName(level.mapTok[i])); if(!isDefined(level.gamemodeTok)) GameTypeLocVotes = level.mapVotes[i]; else GameTypeLocVotes = (getGameTypeName(i) + " - " + level.mapVotes[i]); player setClientDvar(("hud_mapVotes"+i), GameTypeLocVotes); if(level.mapVotes[i] != 0) { if(!isDefined(level.gamemodeTok)) GameTypeLocVotes = ("^3"+level.mapVotes[getHighestVotedMap()]); else GameTypeLocVotes = ("^3" + getGameTypeName(getHighestVotedMap()) + " - " + level.mapVotes[getHighestVotedMap()]); player setClientDvar(("hud_mapVotes"+getHighestVotedMap()),GameTypeLocVotes ); player setClientDvar(("hud_mapName"+getHighestVotedMap()), ("^3"+getLocalisedName(level.mapTok[getHighestVotedMap()]))); } } } } getHighestVotedMap() { highest = 0; position = randomInt(level.mapVotes.size); for(i=0; i < level.mapVotes.size; i++ ) { if( level.mapVotes[i] > highest ) { highest = level.mapVotes[i]; position = i; } } return position; } castMap( number ) { if( !isDefined(self.hasVoted) || !self.hasVoted ) { self.hasVoted = 1; level.mapVotes[number]++; self.votedNum = number; updateVoteDisplayForPlayers(); if(!isDefined(level.gamemodeTok)) MapNameLoc = getLocalisedName(level.mapTok[self.votedNum]); else MapNameLoc = (getLocalisedName(level.mapTok[self.votedNum]) + " - " + getGameTypeName(self.votedNum)); self iprintln("You voted for ^3"+MapNameLoc); } else if( self.hasVoted && isDefined( self.votedNum ) && self.votedNum != number ) { level.mapVotes[self.votedNum]--; level.mapVotes[number]++; self.votedNum = number; updateVoteDisplayForPlayers(); if(!isDefined(level.gamemodeTok)) MapNameLoc = getLocalisedName(level.mapTok[self.votedNum]); else MapNameLoc = (getLocalisedName(level.mapTok[self.votedNum]) + " - " + getGameTypeName(self.votedNum)); self iprintln("You ^3re-voted ^7for ^3"+MapNameLoc); } } onDisconnect() { level endon ( "time_over" ); self waittill ( "disconnect" ); if(level.inVote && isDefined(level.VotePosition))//Remove players vote & update player count for all { if ( isDefined( self.votedNum ) ) level.mapVotes[self.votedNum]--; if (level.VotePosition == "voting") updateVoteDisplayForPlayers(); } } SetFinalVoteMap() { winNumberA = randomInt(level.mapTok.size); level.RandomMap = level.mapTok[winNumberA]; level.winMap = getMapName( level.RandomMap ); if( level.players.size > 0 ) { winNumberA = getHighestVotedMap(); level.winMap = getMapName( level.mapTok[winNumberA] ); foreach (player in level.players) { player setClientDvar(("hud_WinningName"), getPreviewName(level.mapTok[winNumberA])); if(!isDefined(level.gamemodeTok)) MapNameLoc = ("^3" + getLocalisedName(level.mapTok[winNumberA])); else MapNameLoc = ("^3" + getLocalisedName(level.mapTok[winNumberA]) + " - " + getGameTypeName(winNumberA)); player setClientDvar(("hud_WinningMap"), MapNameLoc); if(isDefined(level.gamemodeTok)) player setClientDvar(("ui_gametype"), level.gamemodeTok[winNumberA]); } } //Only Map no game modes logPrint("[VOTE MOD] Random Map was: " + level.RandomMap + "\n"); logPrint("[VOTE MOD] Winner Map: " + level.winMap + "\n"); if(!isDefined(level.gamemodeTok)) { setDvar("sv_maprotation", "map "+level.winMap); setDvar("sv_maprotationCurrent", "map "+level.winMap); } else//Set Game type and map { setDvar("sv_maprotation", "gametype " + level.gamemodeTok[winNumberA] + " map "+level.winMap); setDvar("sv_maprotationCurrent", "gametype " + level.gamemodeTok[winNumberA] + " map "+level.winMap); } }