diff --git a/Simple VoteKickSystem v1.1 [Developed by @ItsCahz]/main.gsc b/Simple VoteKickSystem v1.1 [Developed by @ItsCahz]/main.gsc new file mode 100644 index 0000000..d323ec7 --- /dev/null +++ b/Simple VoteKickSystem v1.1 [Developed by @ItsCahz]/main.gsc @@ -0,0 +1,356 @@ +/*///////////////////////////////// +// SIMPLE VOTE KICK SYSTEM BO2 // +// DEVELOPED BY @ITSCAHZ // +//////////////////////////////// + +THANKS @THEHIDDENHOUR FOR THE HELP AND ANSWERING QUESTIONS WHEN I HAD THEM + + VERSION 1.1 ADDED A DVAR FOR BANNING TO PREVENT SOMEONE FROM REJOINING AFTER BEING VOTEKICKED + ADDED VOTE KICK LIMIT: ONE VOTE KICK PER PERSON, PER MAP*/ + +#include maps\mp\_utility; +#include common_scripts\utility; +#include maps\mp\gametypes\_hud_util; +#include maps\mp\gametypes\_hud_message; + +init() +{ + level thread onPlayerConnect(); +} + +onPlayerConnect() +{ + for(;;) + { + level waittill("connected", player); + + if(getPlayerDvar(player, "banned") == "") {} // if the dvar "banned" = none: do nonthing + else if(getPlayerDvar(player, "banned") == true) // if the dvar "banned" = true, + kick(player getEntityNumber(),"EXE_PLAYERKICKED");// kick that lil bitch lmao + + player thread onPlayerSpawned(); + } +} + +onPlayerSpawned() +{ + self endon("disconnect"); + level endon("game_ended"); + for(;;) + { + self waittill("spawned_player"); + + self thread voteKickButtonMonitor(); + } +} + +voteKickButtonMonitor() +{ + self endon("disconnect"); + level endon("game_ended"); + for(;;) + { + if(self adsbuttonpressed() && self actionslottwobuttonpressed() && !isDefined(level.voting) && !isDefined(self.checkingToVote)) + { + self thread votekickText(); + self thread func_whotokick(); + } + wait 0.05; + } +} + +func_whotokick() +{ + self endon("disconnect"); + self endon("close_voting"); + level endon("game_ended"); + + self.checkingToVote = true; + level thread recountPlayers(); + + i = 0; + player = level.players[i]; + + self.VoteKickTopString setText("Vote Kick Who?"); + self.VoteKickBottomString setText("[{+actionslot 3}] << ^1"+player.name+"^7 >> [{+actionslot 4}]"); + self.VoteKickInfoString setText("^5Press [{+gostand}] to Select, [{+melee}] to Close"); + + for(;;) + { + if(self actionslotfourbuttonpressed()) + { + if(i != (level.players.size - 1)) + { + i++; + player = level.players[i]; + self.VoteKickBottomString setText("[{+actionslot 3}] << ^1"+player.name+"^7 >> [{+actionslot 4}]"); + } + else + { + i = 0; + player = level.players[i]; + self.VoteKickBottomString setText("[{+actionslot 3}] << ^1"+player.name+"^7 >> [{+actionslot 4}]"); + } + } + if(self actionslotthreebuttonpressed()) + { + if(i == 0) + { + i = (level.players.size - 1); + player = level.players[i]; + self.VoteKickBottomString setText("[{+actionslot 3}] << ^1"+player.name+"^7 >> [{+actionslot 4}]"); + } + else + { + i--; + player = level.players[i]; + self.VoteKickBottomString setText("[{+actionslot 3}] << ^1"+player.name+"^7 >> [{+actionslot 4}]"); + } + } + if(self meleebuttonpressed()) + { + self.checkingToVote = undefined; + self.VoteKickTopString destroy(); + self.VoteKickBottomString destroy(); + self.VoteKickInfoString destroy(); + self notify("close_voting"); + } + if(self jumpbuttonpressed()) + self thread CheckIfCanVoteKick(player); + wait 0.05; + } +} + +CheckIfCanVoteKick(badplayer) +{ + if(!isDefined(level.voting)) + { + + if(isDefined(self.VoteKickedAlready)) //only lets a player votekick once per game to prevent abuse + self iprintln("^1You cannot vote kick more than once a game!"); + /* + ----------------------------------------------- + | *USE THIS IF USING A VERFICATION SYSTEM* | + | TO STOP VERIFIED USERS FROM BEING VOTEKICKED | + ----------------------------------------------- + else if(badplayer isVerified()) + { + self iprintln("^1Cannot vote kick verified users!"); + } + */ + else + { + level.voting = true; + self.VoteKickedAlready = true; + foreach(player in level.players) + { + player.VoteKickTopString destroy(); + player.VoteKickBottomString destroy(); + player.VoteKickInfoString destroy(); + } + level thread StartVoteKick(badplayer); + self.checkingToVote = undefined; + self notify("close_voting"); + } + } + else + self iprintln("^1Voting taking place! Please wait until it has finished!"); +} + +StartVoteKick(badplayer) +{ + level endon("voting_ended"); + level endon("game_ended"); + + level thread StartVoteKickTimeLimit(badplayer); + level thread KickIfVotesAreEnough(badplayer); + + level.votesneeded = ceil(level.numberOfPlayers / 2); + level.votestokick = 0; + + foreach(player in level.players) + { + player thread votekickText(); + if(player.name == badplayer.name) + { + player freezeControls(true); + player.VoteKickTopString setText("^1Vote Kicking "+badplayer.name); + player.VoteKickBottomString setText("^1( "+level.votestokick+" / "+level.votesneeded+" ) ^7votes needed!"); + player.VoteKickInfoString setText("The lobby is vote kicking you please wait"); + } + else + { + player thread VotingButtonMonitor(badplayer); + player.VoteKickTopString setText("^1Vote Kicking "+badplayer.name); + player.VoteKickBottomString setText("^1( "+level.votestokick+" / "+level.votesneeded+" ) ^7votes needed!"); + player.VoteKickInfoString setText("^5Prone [{+actionslot 1}] ^1Vote to Kick\n^5Prone [{+actionslot 2}] ^2Vote to Stay"); + } + } +} + +VotingButtonMonitor(badplayer) +{ + self endon("disconnect"); + level endon("voting_ended"); + level endon("game_ended"); + + for(;;) + { + if(self getStance() == "prone" && self actionslotonebuttonpressed() && !isDefined(self.menu.open) && !isDefined(self.voted)) + { + self.voted = true; + level.votestokick += 1; + level notify("update_vote_text"); + self iprintln("^1You voted for ^5"+badplayer.name+" to get kicked!"); + self.VoteKickInfoString destroy(); + } + if(self getStance() == "prone" && self actionslottwobuttonpressed() && !isDefined(self.menu.open) && !isDefined(self.voted)) + { + self.voted = true; + self iprintln("^2You voted for ^5"+badplayer.name+" to stay!"); + self.VoteKickInfoString destroy(); + } + wait 0.05; + } +} + +KickIfVotesAreEnough(badplayer) +{ + level endon("voting_ended"); + level endon("game_ended"); + + for(;;) + { + wait 0.05; + if(level.votestokick >= level.votesneeded) + { + foreach(player in level.players) + { + player iprintln("^5Vote Passed! ^1"+badplayer.name+" got Kicked!"); + player.voted = undefined; + player.checkingToVote = undefined; + } + setPlayerDvar(badplayer, "banned", true); //this dvar is sticky, and will "ban" the player until + //the server is reset + kick(badplayer getentitynumber()); + level.votestokick = undefined; + level.voting = undefined; + level notify("voting_ended"); + } + } +} + +StartVoteKickTimeLimit(badplayer) +{ + level endon("voting_ended"); + level endon("game_ended"); + + level thread updateText(); + level thread removeText(); + level.votesneeded = ceil(level.numberOfPlayers / 2); + level.votestokick = 0; + wait 15; + if(level.votestokick < level.votesneeded) + { + foreach(player in level.players) + { + player.voted = undefined; + player.checkingToVote = undefined; + if(player.name == badplayer.name) + { + player iprintln("^1Not Enough votes to kick you!"); + player freezeControls(false); + } + else + player iprintln("^1Not Enough Votes to Kick ^5"+badplayer.name+"!"); + } + } + level.votestokick = undefined; + level.voting = undefined; + level notify("voting_ended"); +} + +updateText() +{ + level endon("voting_ended"); + + for(;;) + { + level waittill("update_vote_text"); + foreach(player in level.players) + player.VoteKickBottomString setText("^1( "+level.votestokick+" / "+level.votesneeded+" ) ^7votes needed!"); + } +} + +removeText() +{ + for(;;) + { + level waittill("voting_ended"); + foreach(player in level.players) + { + player.VoteKickTopString destroy(); + player.VoteKickBottomString destroy(); + player.VoteKickInfoString destroy(); + } + } +} + +votekickText() +{ + self.VoteKickTopString = self createFontString("objective", 1.2); + self.VoteKickTopString setPoint("CENTER", "CENTER", -345, -100); + self.VoteKickBottomString = self createFontString("objective", 1.2); + self.VoteKickBottomString setPoint("CENTER", "CENTER", -345, -85); + self.VoteKickInfoString = self createFontString("objective", 1); + self.VoteKickInfoString setPoint("CENTER", "CENTER", -345, -70); +} + +recountPlayers() +{ + level.numberOfBots = 0; + level.numberOfPlayers = 0; + foreach(player in level.players) + { + if(isDefined(player.pers["isBot"])&& player.pers["isBot"]) + level.numberOfBots += 1; + else + level.numberOfPlayers += 1; + } +} + +setPlayerDvar(player, dvar, value) +{ + thedvar = player getXUID() + "_" + dvar; + setDvar(thedvar, value); +} + +getPlayerDvar(player, dvar) +{ + thedvar = player getXUID() + "_" + dvar; + + return getDvar(thedvar); +} + +getPlayerDvarFloat(player, dvar) +{ + thedvar = player getXUID() + "_" + dvar; + + return getDvarFloat(thedvar); +} + +setPlayerDvarVector(player, dvar, vec) +{ + setPlayerDvar(player, dvar + "_0", vec[0]); + setPlayerDvar(player, dvar + "_1", vec[1]); + setPlayerDvar(player, dvar + "_2", vec[2]); +} + +getPlayerDvarVector(player, dvar) +{ + vec_0 = getPlayerDvarFloat(player, dvar + "_0"); + vec_1 = getPlayerDvarFloat(player, dvar + "_1"); + vec_2 = getPlayerDvarFloat(player, dvar + "_2"); + + return (vec_0, vec_1, vec_2); +}