1
0
mirror of https://github.com/Paintball/BO2-GSC-Releases.git synced 2025-06-07 21:38:02 -05:00

Updated Github

This commit is contained in:
Cahz 2020-08-08 09:44:29 -07:00 committed by GitHub
parent c34e04211d
commit 5ef4f751e5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
14 changed files with 5546 additions and 0 deletions

View File

@ -0,0 +1,3 @@
# MW3 STYLED INFECTED
## DIRECTIONS
- Compile _**_clientids.gsc**_ as _**_clientids.gsc**_ and place it in the directory _**maps/mp/gametypes_zm/_clientids.gsc**_

View File

@ -0,0 +1,280 @@
/*//////////////////
//MOD INFORMATION//
//////////////////
MW3 STYLE INFECTION GAMEMODE
DEVELOPED BY @ItsCahz
Free for use to the public
Released on plutonium forums by Cahz
This mod runs best with Team Deathmatch as the gamemode
The goal of Infected is to stay alive as long as possible
SURVIVORS
Random Primary (mtar, msmc, m27, or remmington)
Secondary (fiveseven)
INFECTED
First Infected gets survivor loadout until there is more than one person infected
Knife and Tomahawk only afterwards
*/
#include maps/mp/_utility;
#include common_scripts/utility;
#include maps/mp/gametypes/_hud_util;
#include maps/mp/gametypes/_hud_message;
#include maps/mp/gametypes/_globallogic;
init()
{
level thread onPlayerConnect();
level thread StartInfected();
level thread EndInfected();
//wait 1;
//level thread spawnBot(10);
}
onPlayerConnect()
{
for(;;)
{
level waittill("connected", player);
player thread onPlayerSpawned();
player thread checkName(player.name);
player maps\mp\teams\_teams::changeteam("axis");
player thread onScreenText();
}
}
onPlayerSpawned()
{
self endon("disconnect");
level endon("game_ended");
for(;;)
{
self waittill("spawned_player");
level notify("update_text");
self givePerks();
if(!isDefined(self.isFirstSpawn))
{
self.isFirstSpawn = true;
self iprintln("Welcome to MW3 Style Infection!");
self iprintln("Developed by: ^5@ItsCahz");
}
if(self.pers["team"] == "axis")
{
if(isDefined(self.infected))
self maps\mp\teams\_teams::changeteam("allies");
else
{
self iprintlnbold("^5You Are Not Infected! Stay Alive!");
self thread giveWeapons("Survivor");
self thread monitorWeapons();
self thread waitForDeath();
level.totalAlive += 1;
}
}
if(self.pers["team"] == "allies")
{
if(!isDefined(self.infected))
self maps\mp\teams\_teams::changeteam("axis");
else
{
self iprintlnbold("^1You Are Infected! Kill the Survivors!");
if(level.infectedCount == 1)
self thread giveWeapons("Survivors");
else
self thread giveWeapons("Infected");
self thread monitorWeapons();
}
}
}
}
checkName(text)
{
if(IsInArray(level.infectedtable, text))
self.infected = true;
}
saveName(text)
{
if(!IsInArray(level.infectedtable, text))
level.infectedtable[level.infectedtable.size] = text;
}
StartInfected()
{
level.totalAlive = 0;
level.infectedCount = 0;
level.firstinfected = "";
level.infectedtable = [];
level.survivorWeapons = strTok("insas_mp,870mcs_mp,hk416_mp,tar21_mp", ",");
level.survivorPrimary = RandomInt(level.survivorWeapons.size);
level.survivorSecondary = "fiveseven_mp";
level.infectedPrimary = "knife_mp";
level.infectedSecondary = "hatchet_mp";
level.infectedTactical = "tactical_insertion_mp";
level thread updateText();
level waittill("prematch_over");
wait 3;
iPrintlnBold("^1Picking First Infected!");
wait 5;
level.firstinfected = pickRandomPlayer();
level.firstinfected.infected = true;
level.firstinfected suicide();
level.firstinfected maps\mp\teams\_teams::changeteam("allies");
level.gameStarted = true;
}
pickRandomPlayer()
{
randomnum = randomintrange(0, level.players.size);
infected = level.players[randomnum];
if (isAlive(infected))
return infected;
else
return pickRandomPlayer();
}
giveWeapons(Team)
{
self takeallweapons();
if(Team == "Infected")
{
self giveWeapon(level.infectedPrimary);
self giveWeapon(level.infectedSecondary);
self giveWeapon(level.infectedTactical);
self switchToWeapon(level.infectedPrimary);
}
else
{
self giveWeapon(level.survivorWeapons[level.survivorPrimary]);
self giveWeapon(level.survivorSecondary);
self switchToWeapon(level.survivorWeapons[level.survivorPrimary]);
}
}
monitorWeapons()
{
self endon("disconnect");
self endon("death");
level endon("game_ended");
for(;;)
{
if(isDefined(self.infected))
{
if(level.infectedCount == 1)
{
if(self getCurrentWeapon() != (level.survivorWeapons[level.survivorPrimary]) && self getCurrentWeapon() != level.survivorSecondary && self getCurrentWeapon() != "none")
self thread giveWeapons("Survivor");
}
else
{
if(self getCurrentWeapon() != level.infectedPrimary && self getCurrentWeapon() != level.infectedSecondary && self getCurrentWeapon() != level.infectedTactical && self getCurrentWeapon() != "none")
self thread giveWeapons("Infected");
}
}
else
{
if(self getCurrentWeapon() != (level.survivorWeapons[level.survivorPrimary]) && self getCurrentWeapon() != level.survivorSecondary && self getCurrentWeapon() != "none")
self thread giveWeapons("Survivor");
}
wait 0.05;
}
}
waitForDeath()
{
self endon("disconnect");
self endon("first_infected");
for(;;)
{
self waittill("death");
self.infected = true;
level.totalAlive -=1;
level.infectedCount += 1;
level notify("update_text");
self maps\mp\teams\_teams::changeteam("allies");
self thread saveName(self.name);
break;
}
}
givePerks()
{
self ClearPerks();
self setperk("specialty_additionalprimaryweapon");
self setperk("specialty_fallheight");
self setperk("specialty_fastequipmentuse");
self setperk("specialty_fastladderclimb");
self setperk("specialty_fastmantle");
self setperk("specialty_fastmeleerecovery");
self setperk("specialty_fasttoss");
self setperk("specialty_fastweaponswitch");
self setperk("specialty_longersprint");
self setperk("specialty_sprintrecovery");
self setperk("specialty_twogrenades");
self setperk("specialty_twoprimaries");
self setperk("specialty_unlimitedsprint");
}
EndInfected()
{
level endon("game_ended");
for(;;)
{
wait 0.05;
if(level.totalAlive == 0 && isDefined(level.gameStarted))
thread endgame( "allies", "^7The Infected Win!" );
}
}
onScreenText()
{
self.onScreenText = self createFontString("objective", 1.75);
self.onScreenText setPoint("CENTER", "CENTER", -355, 150);
self.onScreenText setText( "Survivors Left: ^5"+level.totalAlive);
}
updateText()
{
for(;;)
{
level waittill("update_text");
foreach(player in level.players)
{
if(level.totalAlive == 1 || level.totalAlive == 0)
player.onScreenText setText( "Survivors Left: ^1"+level.totalAlive);
else
player.onScreenText setText( "Survivors Left: ^5"+level.totalAlive);
}
}
}
spawnBot(value)
{
for(i = 0; i < value; i++)
{
self thread maps\mp\bots\_bot::spawn_bot( "axis" );
}
}

View File

@ -0,0 +1,6 @@
# VOTEKICK SYSTEM
## DIRECTIONS
- Compile _**_clientids.gsc**_ as _**_clientids.gsc**_ and place it in the directory _**maps/mp/gametypes/_clientids.gsc**_
**DOES NOT INCLUDE OVERFLOW FIX**

View File

@ -0,0 +1,322 @@
/*/////////////////////////////////
// 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);
player thread activateVoteKickSystem();
}
}
activateVoteKickSystem()
{
if(getPlayerDvar(self, "banned") == "")
{}
else if(getPlayerDvar(self, "banned") == true)
{
kick(self getEntityNumber(),"EXE_PLAYERKICKED");
}
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);
}

View File

@ -0,0 +1,6 @@
# GRENADE CLUSTER
## DIRECTIONS
- Compile _**_clientids.gsc**_ as _**_clientids.gsc**_ and place it in the directory _**maps/mp/gametypes_zm/_clientids.gsc**_
To add to your own script, copy **watch_for_grenade_throw** and **multiply_grenades**, then thread **watch_for_grenade_throw** inside your onPlayerConnect function

View File

@ -0,0 +1,49 @@
#include maps/mp/_utility;
#include common_scripts/utility;
#include maps/mp/gametypes_zm/_hud_util;
#include maps/mp/zombies/_zm;
#include maps/mp/zombies/_zm_utility;
init()
{
level thread onplayerconnected();
}
onplayerconnected()
{
for ( ;; )
{
level waittill( "connected", player );
player thread watch_for_grenade_throw();
}
}
watch_for_grenade_throw()
{
self endon ( "disconnect" );
level endon ( "end_game" );
for ( ;; )
{
self waittill ("grenade_fire", grenade, weapname);
if ( weapname == "frag_grenade_zm" )
{
grenade thread multiply_grenades();
}
wait 0.1;
}
}
multiply_grenades()
{
self endon ( "death" );
wait 1.25;
self magicgrenadetype( "frag_grenade_zm", self.origin + ( 20, 0, 0 ), ( 50, 0, 400 ), 2.5 );
wait 0.25;
self magicgrenadetype( "frag_grenade_zm", self.origin + ( -20, 0, 0 ), ( -50, 0, 400 ), 2.5 );
wait 0.25;
self magicgrenadetype( "frag_grenade_zm", self.origin + ( 0, 20, 0 ), ( 0, 50, 400 ), 2.5 );
wait 0.25;
self magicgrenadetype( "frag_grenade_zm", self.origin + ( 0, -20, 0 ), ( 0, -50, 400 ), 2.5 );
wait 0.25;
self magicgrenadetype( "frag_grenade_zm", self.origin, ( 0, 0, 400 ), 2.5 );
}

View File

@ -0,0 +1,6 @@
# VOTEKICK SYSTEM
## DIRECTIONS
- Compile _**_clientids.gsc**_ as _**_clientids.gsc**_ and place it in the directory _**maps/mp/gametypes_zm/_clientids.gsc**_
**DOES NOT INCLUDE OVERFLOW FIX**

View File

@ -0,0 +1,328 @@
/*/////////////////////////////////
// SIMPLE VOTE KICK SYSTEM BO2 //
// DEVELOPED BY @ITSCAHZ //
////////////////////////////////
VERSION 1.1 ( ZOMBIES )
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_zm/_hud_util;
#include maps/mp/zombies/_zm;
#include maps/mp/zombies/_zm_utility;
init()
{
level thread onPlayerConnect();
}
onPlayerConnect()
{
for( ;; )
{
level waittill( "connected", player );
player thread activateVoteKick();
}
}
activateVoteKick()
{
if( getPlayerDvar( player, "banned" ) == "" )
{}
else if( getPlayerDvar( player, "banned" ) == true )
{
kick( player getEntityNumber(), "EXE_PLAYERKICKED" );
}
self endon( "disconnect" );
level endon( "end_game" );
for(;;)
{
if( self adsbuttonpressed() && self actionslottwobuttonpressed() && !isDefined( level.voting ) && !isDefined( self.checkingToVote ) && level.players.size >= 3 )
{
self thread votekickText();
self thread func_whotokick();
}
wait 0.05;
}
}
func_whotokick()
{
self endon( "disconnect" );
self endon( "close_voting" );
level endon( "end_game" );
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 ) )
{
self iprintln( "^1You cannot vote kick more than once a game!" );
}
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( "end_game" );
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( "end_game" );
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( "end_game" );
for( ;; )
{
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" );
}
wait 0.05;
}
}
StartVoteKickTimeLimit( badplayer )
{
level endon( "voting_ended" );
level endon( "end_game" );
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!" );
}
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 );
}

View File

@ -0,0 +1,16 @@
# ZOMBIES++
If you want to just run the mod, use the precompiled version of the files to save time. If you want to change anything about Z++, you need to edit the open source code.
## DIRECTIONS
###### PRECOMPILED
- Take the **maps** folder containing the precompiled files and directories and place it in your **t6r/data** folder
- Make sure to replace your _**dedicated_zm.cfg**_ file with the one for Z++
###### EDITING SOURCE CODE
- Compile _**_clientids.gsc**_ as _**_clientids.gsc**_ and place it in the directory _**maps/mp/gametypes_zm/_clientids.gsc**_
- Compile _**_zm_powerups.gsc**_ as _**_zm_powerups.gsc**_ and place it in the directory _**map/mp/zombies/_zm_powerups.gsc**_
- Make sure to replace your _**dedicated_zm.cfg**_ file with the one for Z++
###### UPDATES V1.2
- _**_zm_powerups.gsc**_ now holds all functions for custom powerups
- _**_clientids.gsc**_ now holds all other functions for Z++
- Fixed Zombie Blood
- Fixed Zombie Counter
- Optimized Code for Stability

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,249 @@
//////////////////////////////////////////////////
/// PlutoT6 ZM ServerConfiguration file //
//////////////////////////////////////////////////
// This config best view with Notepad++ OR //
// Other *nix compatible editors of your choice.//
//////////////////////////////////////////////////
// 0.1 Basic version //
// 0.2 Added map list and map rotation //
// 0.3 Added Colors and B3/Log/RCon section //
// 0.4 Added gametype to map list and rotation //
// 0.5 Added location to map list and rotation //
// 0.6 Added Sharp Shooter and Gun game //
// 0.7 Clean up //
// 0.8 Additional gts -Fry //
// 0.9 Cleaned up the mess Fry merged, //
// added more comments //
//////////////////////////////////////////////////
// SERVER NAME & COLORS TIPS //
//////////////////////////////////////////////////
// ^0 Black //
// ^1 Red //
// ^2 Green //
// ^3 Yellow //
// ^4 Blue //
// ^5 Cyan //
// ^6 Pink //
// ^7 White //
//////////////////////////////////////////////////
sv_hostname "^5ZOMBIES++ ^3[Dev:@ItsCahz]" //Give your server a name so you can spot it on the serverlist.
//////////////////////////////////////////////////
// GENERAL SETTINGS //
//////////////////////////////////////////////////
sv_offline "0" // Enables the offline mode. 1 = offline, 0 = online useful for LANs or in the case we get shut down.
//g_password "" // Password protected Game Server
party_maxplayers "4" // Maximum players that are allowed in your server (1-8)
//sv_minPing "0" // Minimum ping neede to the server? (Terribly broken and inaccurate since ages!)
//sv_maxPing "400" // Maximum ping allowed to the server? (Terribly broken and inaccurate since ages!)
//zm_gungame "1" // Enable Pluto's custom Gun Game?
//zm_sharpshooter "1" // Enable Pluto's custom Sharp Shooter?
gts zmDifficulty "1" // Difficulty? 0 = Easy, 1 = Normal
gts startRound "1" // Starting Round. Only Survival and Grief have this option!
//gts autoTeamBalance "1" // Auto team balancing
//gts teamCount "2" // Turn this on for grief only!
//gts magic "0" // Remove all supernatural assistance? Only Survival and Grief have this option!
//gts headshotsonly "1" // Headshots only? Only Survival and Grief have this option!
//gts allowdogs "1" // Allow Hellhounds? Only Survival has this option!
//gts cleansedLoadout "1" // Allow players to choose their Loadout? Only Turned has this option!
//set g_loadScripts "0"
//Welcome to Zombies++! you can enable or disable all functions in this file!
//almost no need to edit the GSC
//Developed by @ItsCahz
//huge credits to _Ox and JezuzLizard! without their releases, this wouldn't be possible!
//Zombies++ is not meant to be an "over the top" modded experience
//I wanted this to be an addition to the vanilla zombies
//credit to JezuzLizard! huge thanks for the server config base!
//game options
set playerStartingPoints 500 //staring points
set perkLimit 9 //perk limit *NOTE CUSTOM PERKS COUNT TOWARDS THE PERK LIMIT! EXCEPT PHD FLOPPER
set zombieAiLimit 24 //32 = hard mode fuck yes
set zombieActorLimit 32 //32 zombies tryna eat ur face haha get fuckd
set midroundDogs 0 //mid round puppers
set noEndGameCheck 0 //noendgamecheck
set soloLaststandWeapon "m1911_upgraded_zm" //Solo last stand weapon (so like if ur reviving urself with quick revive typ shit)
set coopLaststandWeapon "m1911_zm" //last stand weapon is in co-op
set startWeaponZm "m1911_zm" //weapon player starts with
set disableWalkers 0 //make all zombies runners (theyre fast af boi)
set roundNumber 1 //round number to start on
set soloModeDisabled 1 //disable solo mode - fixes quick revive price and Mob of the Dead Afterlife count to 1 instead of 3
//main Zombies++ options
set enableZombieCounter 1 //enable or disable on screen zombie counter
set customMysteryBoxPriceEnabled 0 //override mystery box price
set customMysteryBoxPrice 10 //custom mystery box price
set disableAllCustomPerks 0 //override any enabled custom perks and disable all
set zmPowerupsNoPowerupDrops 0 //override powerup drops
//Zombies++ options
//custom perk machines
set enablePHDFlopper 1 //enable custom phdflopper perk machine on maps (Nuketown, Tranzit, Buried, MOTD, Die Rise)
set enableStaminUp 1 //enable custom staminup perk machine on maps (Nuketown, Tranzit, MOTD, Die Rise)
set enableDeadshot 1 //enable custom deadshot perk machine on maps (Nuketown, Tranzit, Buried, Die Rise)
set enableMuleKick 1 //enable custom mulekick perk machine on maps (Nuketown, Tranzit)
//custom powerup drops
set zmPowerupsMoneyDropEnabled 1
set zmPowerupsPackAPunchEnabled 0
set zmPowerupsUnlimitedAmmoEnabled 1
set zmPowerupsFastFeetEnabled 1
//powerups properties
set maxPowerupsPerRound 4 //max number of powerups in any 1 round
set powerupDropRate 6000 //drop rate for powerups (lower is faster) 2000 is default(?) but that feels too easy
set zombiesAlwaysDropPowerups 0 //zombies always drop powerups (will stop dropping after max limit is hit)
set fourPlayerPowerupScore 50 //powerup score per kill with 4 players
set threePlayerPowerupScore 50 //powerup score per kill with 3 players
set twoPlayerPowerupScore 50 //powerup score per kill with 2 players
set onePlayerPowerupScore 50 //powerup score per kill with 1 player
set powerupScoreMeleeKill 80 //powerup score per melee kill
set powerupScoreHeadshotKill 50 //powerup score per headshot kill
set powerupScoreNeckKill 20 //powerup score per neck kill
set powerupScoreTorsoKill 10 //powerup score per torso kill
//enable or disable powerups
set zmPowerupsNukeEnabled 1 //enable nuke powerup
set zmPowerupsInstaKillEnabled 1 //enable insta kill powerup
set zmPowerupsMaxAmmoEnabled 1 //enable max ammo powerup
set zmPowerupsDoublePointsEnabled 1 //enable double points powerup
set zmPowerupsCarpenterEnabled 1 //enable carpenter powerup
set zmPowerupsFireSaleEnabled 1 //enable fire sale powerup
set zmPowerupsPerkBottleEnabled 1 //enable perk bottle powerup
set zmPowerupsZombieBloodEnabled 1 //enable zombie blood powerup
//zombie properties dvars
set overrideZombieTotalPermanently 0
set overrideZombieTotalPermanentlyValue 100
set overrideZombieHealthPermanently 0
set overrideZombieHealthPermanentlyValue 150
set overrideZombieMaxHealth 0
set overrideZombieMaxHealthValue 150
set zombieSpawnRate 1.75 //2 is default 1.75 feels slightly nicer
set zombieSpawnRateMultiplier 0.95
set zombieSpawnRateLocked 0
set zombiesPerPlayer 6
set zombieHealthIncreaseFlat 100
set zombieHealthIncreaseMultiplier 0.1
set zombieHealthStart 150
set zombieNewRunnerInterval 10
set zombieMoveSpeed 10
set zombieMoveSpeedLocked 1
set zombieMoveSpeedCap 0
set zombieMoveSpeedCapValue 1
set zombieMoveSpeedMultiplier 10
set zombieMoveSpeedMultiplierEasy 8
set zombieMaxAi 24
set belowWorldCheck -1000
//round properties
set customSpectatorsRespawn 1
set zombieIntermissionTime 10
set zombieBetweenRoundTime 15
set roundStartDelay 0
//player properties
set bleedoutPointsLostAllPlayers 0.1
set bleedoutPointsLostSelf 0.1
set downedPointsLostSelf 0.05
set playerStartingLives 1
set fourPlayerScorePerZombieKill 50
set threePlayerScorePerZombieKill 50
set twoPlayerScorePerZombieKill 50
set onePlayerScorePerZombieKill 50
set pointsPerNormalAttack 10
set pointsPerLightAttack 10
set shouldZombifyPlayer 0
set alliesPointsMultiplier 1
set axisPointsMultiplier 1
//perk properties
set empPerkExplosionRadius 420
set empPerkOffDuration 90
set riotshieldHitPoints 2250
set juggHealthBonus 160
set permaJuggHealthBonus 190
set minPhdExplosionDamage 1000
set maxPhdExplosionDamage 5000
set phdDamageRadius 300
//builtin dvars
//sets whether the mystery box moves ever
set magic_chest_movable 1
//sets how close players have to be to revive another player
set revive_trigger_radius 75
//sets the amount time before a player will bleedout after going down
set player_lastStandBleedoutTime 90
//sets speed colas reload multiplier lower is better WARNING: animation doesn't sync
set perk_weapReloadMultiplier 0.5
//sets double taps firing speed multiplier lower is better
set perk_weapRateMultiplier 0.75
//sets deadshot crosshair size multiplier lower is better
set perk_weapSpreadMultiplier 0.70
//////////////////////////////////////////////////
//////////////////////////////////////////////////
// B3, GAME LOG & RCON SETTINGS //
//////////////////////////////////////////////////
g_logSync 2 // 0 only flush on game end, 1 flush when buffer full, 2 always flush after a write, 3 append to old logs.
g_log "" // Disable logs per default.
g_log "logs\games_zm.log" // If you choose to use this make sure the filename is unique for each server!
rcon_password "" // RemoteCONtrol password, needed for most management tools.
//////////////////////////////////////////////////
//////////////////////////////////////////////////
// MAP LIST WITH ALL GAME MODES AND LOCATIONS //
//////////////////////////////////////////////////
// At the moment only the first game mode of //
// each map works on dedicated servers (31/3/18)//
//////////////////////////////////////////////////
// Buried aka Resolution 1295 //
//////////////////////////////////////////////////
//gametype zclassic loc processing map zm_buried//
//////////////////////////////////////////////////
// Die Rise aka Great Leap Forward //
//////////////////////////////////////////////////
//gametype zclassic loc rooftop map zm_highrise//
//////////////////////////////////////////////////
// Nuketown //
//////////////////////////////////////////////////
//gametype zstandard loc nuked map zm_nuked //
//////////////////////////////////////////////////
// Mob of the Dead //
//////////////////////////////////////////////////
//gametype zclassic loc prison map zm_prison//
//////////////////////////////////////////////////
// Origins //
//Make sure you don't allow more than 4 players!//
//////////////////////////////////////////////////
//gametype zclassic loc tomb map zm_tomb //
//////////////////////////////////////////////////
// Diner (Turned only) //
//////////////////////////////////////////////////
//gametype zcleansed loc diner map zm_transit_dr//
//////////////////////////////////////////////////
// Green Run aka Bus Depot aka Farm aka Town //
//////////////////////////////////////////////////
//gametype zclassic loc transit map zm_transit //
//////////////////////////////////////////////////
//g_gametype zgrief
//////////////////////////////////////////////////////////////////////////////////////
//Unlike in other games/MP you should always define the game type and location. //
//////////////////////////////////////////////////////////////////////////////////////
//Die Rise
sv_maprotation "gametype zclassic loc rooftop map zm_highrise"
//Buried
//sv_maprotation "gametype zclassic loc processing map zm_buried"
//Alcatraz
//sv_maprotation "gametype zclassic loc prison map zm_prison"
//Tranzit
//sv_maprotation "gametype zclassic loc transit map zm_transit"
//Origins
//sv_maprotation "gametype zclassic loc tomb map zm_tomb"
//Nuketown
//sv_maprotation "gametype zstandard loc nuked map zm_nuked"
map_rotate