Hello,
I am going to write a short tutorial here because it seems like most
everyone is just hacking up _rank.gsc. You don't need to do this and
it creates a lot of unused code. _rank.gsc is included in EVERYTHING
anyway, so you don't need it for any special functions or anything.
First, we are going to start of talking about making your own GSC file.
So, lets begin.
1. Make a new, blank file and save it as my.gsc
Then, you need to learn the way the code is executed, and what must be called
to start a game.
2. Define includes
These are the very top lines of the GSC file, and are executed each time the file
is processed, which will occur ~20 times a second. The most common and required
includes are:
3. Define Main()
Main is the section that sets things like, round timer and game type also defines
lots of other things for the level.
4. Define functions
As mentioned above, you will need to define each one of the functions you call in main.
I always start with this one:
We are going to continue to define functions...
Getting into the good functions now:
Now, we have to continue to define each function we called in main...
And that's it.
Now, save it, change it, save it and add it to mod.csv as a raw file.
Follow the thread to create localized strings and get rid of all your
other hacked up rank.gsc files.
This is the only GSC file you will have to have in your mod folder.
Everything else you can call by reaching out to that file.
Here is the entire GSC file:
I hope this helps you guys get away from hacking up rank.
Making me feel sick
I am going to write a short tutorial here because it seems like most
everyone is just hacking up _rank.gsc. You don't need to do this and
it creates a lot of unused code. _rank.gsc is included in EVERYTHING
anyway, so you don't need it for any special functions or anything.
First, we are going to start of talking about making your own GSC file.
So, lets begin.
1. Make a new, blank file and save it as my.gsc
Then, you need to learn the way the code is executed, and what must be called
to start a game.
2. Define includes
These are the very top lines of the GSC file, and are executed each time the file
is processed, which will occur ~20 times a second. The most common and required
includes are:
Code:
#include maps\mp\_utility;
#include maps\mp\gametypes\_hud_util;
#include common_scripts\utility;3. Define Main()
Main is the section that sets things like, round timer and game type also defines
lots of other things for the level.
Code:
main()
{
//Here we decide if we are staring the game or not...
if( GetDvar( #"mapname" ) == "mp_background" )
{
return;
}
//Define our models/weapons/etc
preCacheModel( "p_glo_barricade_wood_barb_pow" );
precacheitem( "crayons_mp5" );
//Start the required files to "start a game"
maps\mp\gametypes\_globallogic::init();
maps\mp\gametypes\_callbacksetup::SetupCallbacks();
maps\mp\gametypes\_globallogic::SetupCallbacks();
maps\mp\gametypes\_damagefeedback::init();
maps\mp\gametypes\_tweakables::init();
//Define our game dvars
maps\mp\gametypes\_globallogic_utils::registerTimeLimitDvar( level.gameType, 3.75, 0, 1440 );
maps\mp\gametypes\_globallogic_utils::registerScoreLimitDvar( level.gameType, 100, 0, 50000 );
maps\mp\gametypes\_globallogic_utils::registerRoundLimitDvar( level.gametype, 3, 0, 10 );
maps\mp\gametypes\_globallogic_utils::registerRoundWinLimitDvar( level.gametype, 2, 0, 10 );
maps\mp\gametypes\_globallogic_utils::registerNumLivesDvar( level.gametype, 1, 0, 10 );
maps\mp\gametypes\_serversettings::constrainMapSize(4);
//Define our gametype (this tricks the server into thinking its not custom)
//Change this to match your gametype, obviously, I wanted rounds and no respawn.
level.gametype = "sd";
//Level pers, these decide variables and which default functions we will be using.
level.endGameOnScoreLimit = true;
level.scoreRoundBased = false;
level.teamBased = true;
level.overrideTeamScore = true;
level.maxPlayerCount = 24;
//For each one of these, we will need to define the function below in the GSC
level.onPrecacheGameType = ::onPrecacheGameType;
level.onStartGameType = ::onStartGameType;
level.onSpawnPlayer = ::onSpawnPlayer;
level.onSpawnPlayerUnified = ::onSpawnPlayerUnified;
level.onRoundEndGame = ::onRoundEndGame;
level.onPlayerKilled = ::onPlayerKilled;
level.onOneLeftEvent = ::onOneLeftEvent;
level.onRoundEndGame = ::onRoundEndGame;
level.onPlayerDamage = ::onPlayerDamage;
level.onRoundSwitch = ::onRoundSwitch;
level.onDeadEvent = ::onDeadEvent;
//Load our FX
level._effect[ "burn_barrier" ] = LoadFX( "env/fire/fx_fire_line_sm" );
level._effect[ "player_infected" ] = LoadFX( "maps/zombie/fx_zombie_dog_lightning_spawn" );
level._effect["player_got_infected"] = LoadFX( "env/light/fx_light_square_white" );
//Load our game sounds
game["dialog"]["gametype"] = "snd_start";
game["dialog"]["gametype_hardcore"] = "hcsnd_start";
game["dialog"]["sudden_death"] = "generic_boost";
game["dialog"]["last_one"] = "encourage_last";
game["dialog"]["halftime"] = "sd_halftime";
//Set our scoreboard columns (requires additional work)
setscoreboardcolumns( "Cleaned", "infected", "suicide", "assists" );
//Start any threads we will want to always monitor that belong to the level
level thread onPlayerConnect();
}4. Define functions
As mentioned above, you will need to define each one of the functions you call in main.
I always start with this one:
Code:
onStartGameType()
{
//This is hud text
level.drawCopy = level CreateServerFontString( "objective", 1.0 );
level.drawCopy setPoint( "LEFTBOTTOM", "LEFTBOTTOM", 0,0 );
level.drawCopy setText( "^1INFECTED ^7::^1 2.3.2b ^7::^1 Build: 2034" );
//I set this dvar here, but could be set in cfg file.
SetDvar( "xblive_privatematch", 0 );
//Define level pers that start over each round
level.killstreaksenabled = 1;
level.hardpointsenabled = 1;
level.hardcoreMode = false;
level.firstInfected = false;
level.maxBarriers = 0;
level.dogCount = 0;
level.botCount = 0;
setClientNameMode( "manual_change" );
//This calls a function (below) that sets the location strings
infTeamSet();
//Set our objective text (can be custom from localized strings)
maps\mp\gametypes\_globallogic_ui::setObjectiveText( game["attackers"], &"OBJECTIVES_SD_ATTACKER" );
maps\mp\gametypes\_globallogic_ui::setObjectiveText( game["defenders"], &"OBJECTIVES_SD_DEFENDER" );
if ( level.splitscreen )
{
maps\mp\gametypes\_globallogic_ui::setObjectiveScoreText( game["attackers"], &"OBJECTIVES_SD_ATTACKER" );
maps\mp\gametypes\_globallogic_ui::setObjectiveScoreText( game["defenders"], &"OBJECTIVES_SD_DEFENDER" );
}
else
{
maps\mp\gametypes\_globallogic_ui::setObjectiveScoreText( game["attackers"], &"OBJECTIVES_SD_ATTACKER_SCORE" );
maps\mp\gametypes\_globallogic_ui::setObjectiveScoreText( game["defenders"], &"OBJECTIVES_SD_DEFENDER_SCORE" );
}
maps\mp\gametypes\_globallogic_ui::setObjectiveHintText( game["attackers"], &"OBJECTIVES_SD_ATTACKER_HINT" );
maps\mp\gametypes\_globallogic_ui::setObjectiveHintText( game["defenders"], &"OBJECTIVES_SD_DEFENDER_HINT" );
//Define spawn points
level.spawnMins = ( 0, 0, 0 );
level.spawnMaxs = ( 0, 0, 0 );
maps\mp\gametypes\_spawnlogic::placeSpawnPoints( "mp_tdm_spawn_allies_start" );
maps\mp\gametypes\_spawnlogic::placeSpawnPoints( "mp_tdm_spawn_axis_start" );
maps\mp\gametypes\_spawnlogic::addSpawnPoints( "allies", "mp_tdm_spawn" );
maps\mp\gametypes\_spawnlogic::addSpawnPoints( "axis", "mp_tdm_spawn" );
maps\mp\gametypes\_spawning::updateAllSpawnPoints();
level.spawn_axis_start= maps\mp\gametypes\_spawnlogic::getSpawnpointArray("mp_tdm_spawn_axis_start");
level.spawn_allies_start= maps\mp\gametypes\_spawnlogic::getSpawnpointArray("mp_tdm_spawn_allies_start");
level.mapCenter = maps\mp\gametypes\_spawnlogic::findBoxCenter( level.spawnMins, level.spawnMaxs );
setMapCenter( level.mapCenter );
spawnpoint = maps\mp\gametypes\_spawnlogic::getRandomIntermissionPoint();
setDemoIntermissionPoint( spawnpoint.origin, spawnpoint.angles );
//This is for the barriers in small map versions
allowed[0] = "tdm";
//Misc Variables
level.displayRoundEndText = true;
maps\mp\gametypes\_gameobjects::main( allowed );
maps\mp\gametypes\_spawning::create_map_placed_influencers();
if ( !isOneRound() )
{
level.displayRoundEndText = true;
if( isScoreRoundBased() )
{
maps\mp\gametypes\_globallogic_score::resetTeamScores();
}
}
maps\mp\gametypes\_rank::registerScoreInfo( "infected", 0 );
maps\mp\gametypes\_rank::registerScoreInfo( "cleaned", 0 );
maps\mp\gametypes\_rank::registerScoreInfo( "assist", 0 );
maps\mp\gametypes\_rank::registerScoreInfo( "suicide", 0 );
maps\mp\gametypes\_rank::registerScoreInfo( "teamkill", 0 );
//Set threads that restart on round change or game start
level thread firstInfected( self );
level thread doPlayerCount();
}We are going to continue to define functions...
Code:
infTeamSet()
{
SetDvar( "g_TeamName_allies", &"INFECTED_SHORT" );
SetDvar( "g_TeamName_axis", &"INFECTED_HUMANS_SHORT" );
game[ "strings" ][ "allies_win" ] = &"INFECTED_WIN_MATCH";
game[ "strings" ][ "allies_win_round" ] = &"INFECTED_WIN_ROUND";
game[ "strings" ][ "allies_mission_accomplished" ] = &"INFECTED_MISSION_ACCOMPLISHED";
game[ "strings" ][ "allies_eliminated" ] = &"INFECTED_ELIMINATED";
game[ "strings" ][ "allies_forfeited" ] = &"INFECTED_FORFEITED";
game[ "strings" ][ "allies_name" ] = &"INFECTED_NAME";
}
checkAllowSpectating()
{
wait ( 0.05 );
update = false;
if( !level.aliveCount[ game[ "allies" ] ] )
{
level.spectateOverride[game[ "allies" ]].allowEnemySpectate = 1;
update = true;
}
if( !level.aliveCount[ game[ "axis" ] ] )
{
level.spectateOverride[game[ "axis" ] ].allowEnemySpectate = 1;
update = true;
}
if( update )
{
maps\mp\gametypes\_spectating::updateSpectateSettings();
}
}
onPrecacheGameType()
{
}
onSpawnPlayerUnified()
{
self.usingObj = undefined;
if ( level.useStartSpawns && !level.inGracePeriod )
{
level.useStartSpawns = true;
}
maps\mp\gametypes\_spawning::onSpawnPlayer_Unified();
}
onOneLeftEvent( team )
{
self iPrintln("YOU ARE THE LAST PLAYER ON YOUR TEAM: " + team);
}
getSpawnPoint()
{
spawnteam = self.pers[ "team" ];
if ( IsDefined( game[ "switchedsides" ] ) && game[ "switchedsides" ] )
{
spawnteam = getOtherTeam( spawnteam );
}
if ( level.inGracePeriod )
{
spawnPoints = maps\mp\gametypes\_spawnlogic::getSpawnpointArray( "mp_tdm_spawn_" + spawnteam + "_start" );
if ( !spawnPoints.size )
spawnPoints = maps\mp\gametypes\_spawnlogic::getSpawnpointArray( "mp_sab_spawn_" + spawnteam + "_start" );
if ( !spawnPoints.size )
{
spawnPoints = maps\mp\gametypes\_spawnlogic::getTeamSpawnPoints( spawnteam );
spawnPoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_NearTeam( spawnPoints );
}
else
{
spawnPoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_Random( spawnPoints );
}
}
else
{
spawnPoints = maps\mp\gametypes\_spawnlogic::getTeamSpawnPoints( spawnteam );
spawnPoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_NearTeam( spawnPoints );
}
return spawnPoint;
}Getting into the good functions now:
Code:
onSpawnPlayer()
{
//What to do when a request to spawn player is called
//This is not "onPlayerSpawned" which is a different function (below)
spawnteam = self.pers["team"];
spawnteam = getOtherTeam( spawnteam );
if ( level.useStartSpawns )
{
if (spawnteam == "axis")
spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_Random(level.spawn_axis_start);
else
spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_Random(level.spawn_allies_start);
}
else
{
if (spawnteam == "axis")
spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_NearTeam(level.spawn_axis);
else
spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_NearTeam(level.spawn_allies);
}
assert( isDefined(spawnpoint) );
buildhud();
self spawn( spawnPoint.origin, spawnPoint.angles, "tdm");
//Everything from here down will occur only one time after player connects
self takeAllWeapons();
currentWeapon = "knife_mp";
self giveWeapon( currentWeapon );
self SwitchToWeapon( currentWeapon );
self.MaxDecoys = 0;
self.HealthPacks = 0;
self.zPortalUses = 0;
self FreezeControls(true);
self openMenu( "inf_choose_cl");
self thread onMenuResponse();
self thread doBarrierDamage();
self.rewardedStage1 = 0;
self.isFrozen = false;
self.canFreeze = true;
self.freezeTimer = false;
self thread updateDogScore();
}Now, we have to continue to define each function we called in main...
Code:
onEndGame( winningTeam )
{
if( IsDefined( winningTeam ) && ( winningTeam == "allies" || winningTeam == "axis" ) )
{
[[ level._setTeamScore ]]( winningTeam, [[ level._getTeamScore ]]( winningTeam ) + 1 );
}
}
onRoundSWitch()
{
//This can all be custom...
}
onRoundEndGame( winningTeam )
{
//this can all be custom...
}
onScoreCloseMusic()
{
//who really cares?
while( !level.gameEnded )
{
axisScore = [[ level._getTeamScore ]]( "axis" );
alliedScore = [[ level._getTeamScore ]]( "allies" );
scoreLimit = level.scoreLimit;
scoreThreshold = scoreLimit * .1;
scoreDif = abs( axisScore - alliedScore );
scoreThresholdStart = abs( scoreLimit - scoreThreshold );
scoreLimitCheck = scoreLimit - 10;
if ( alliedScore > axisScore )
{
currentScore = alliedScore;
}
else
{
currentScore = axisScore;
}
if ( scoreDif <= scoreThreshold && scoreThresholdStart <= currentScore )
{
thread maps\mp\gametypes\_globallogic_audio::set_music_on_team( "TIME_OUT", "both" );
thread maps\mp\gametypes\_globallogic_audio::actionMusicSet();
return;
}
wait( .5 );
}
}
onPlayerSpawned()
{
self endon( "disconnect" );
self waittill( "spawned_player" );
// This is all you need here, after this, can all be custom...
}Code:
onPlayerKilled( eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime, deathAnimDuration )
{
//can be all custom...
}
onPlayerConnect()
{
for( ;; )
{
level waittill( "connected", player );
wait 0.05;
player thread onPlayerSpawned();
player thread onPlayerDisconnect();
// You want to attach any threads to the player here...
}
}
onPlayerDisconnect()
{
level endon( "game_ended" );
self waittill( "disconnect" );
//Again, can set custom code here.
}
onPlayerDamage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime )
{
// All custom code here
}
onDeadEvent( team )
{
//Again, this function is called in MAIN.
//Can be all custom code...
if(level.inMiniGame )
{
return;
}
if ( team == "all" )
{
inf_endGameWithKillcam( game["defenders"], "EVERYONE IS DEAD" );
}
else if ( team == game["attackers"] )
{
inf_endGameWithKillcam( game["defenders"], "ALL INFECTION CLEANED" );
}
else if ( team == game["defenders"] )
{
inf_endGameWithKillcam( game["attackers"], "ALL HUMANS INFECTED" );
}
}And that's it.
Now, save it, change it, save it and add it to mod.csv as a raw file.
Follow the thread to create localized strings and get rid of all your
other hacked up rank.gsc files.
This is the only GSC file you will have to have in your mod folder.
Everything else you can call by reaching out to that file.
Here is the entire GSC file:
Code:
#include maps\mp\_utility;
#include maps\mp\gametypes\_hud_util;
#include common_scripts\utility;
#using_animtree( "generic_human" );
main()
{
if( GetDvar( #"mapname" ) == "mp_background" )
{
return;
}
preCacheModel( "p_glo_barricade_wood_barb_pow" );
precacheitem( "satchel_charge_mp" );
precacheitem( "commando_mp_wtf" );
precacheitem( "ray_gun_zm" );
precacheMenu( "inf_choose_cl" );
precachemodel( "c_brt_fullahead_soldier_body_g_torso" );
precacheitem( "crayons_mp5" );
precachemodel( "infected_char_3" );
precacheitem( "crayons_mp5" );
precachemodel( "mp_cone" );
maps\mp\gametypes\_globallogic::init();
maps\mp\gametypes\_callbacksetup::SetupCallbacks();
maps\mp\gametypes\_globallogic::SetupCallbacks();
maps\mp\gametypes\_damagefeedback::init();
maps\mp\gametypes\_tweakables::init();
maps\mp\gametypes\_globallogic_utils::registerTimeLimitDvar( level.gameType, 3.75, 0, 1440 );
maps\mp\gametypes\_globallogic_utils::registerScoreLimitDvar( level.gameType, 100, 0, 50000 );
maps\mp\gametypes\_globallogic_utils::registerRoundLimitDvar( level.gametype, 3, 0, 10 );
maps\mp\gametypes\_globallogic_utils::registerRoundWinLimitDvar( level.gametype, 2, 0, 10 );
maps\mp\gametypes\_globallogic_utils::registerNumLivesDvar( level.gametype, 1, 0, 10 );
maps\mp\gametypes\_serversettings::constrainMapSize(4);
level.gametype = "sd";
level.endGameOnScoreLimit = true;
level.scoreRoundBased = false;
level.teamBased = true;
level.overrideTeamScore = true;
level.maxPlayerCount = 24;
level.onPrecacheGameType = ::onPrecacheGameType;
level.onStartGameType = ::onStartGameType;
level.onSpawnPlayer = ::onSpawnPlayer;
level.onSpawnPlayerUnified = ::onSpawnPlayerUnified;
level.onRoundEndGame = ::onRoundEndGame;
level.onPlayerKilled = ::onPlayerKilled;
level.onOneLeftEvent = ::onOneLeftEvent;
level.onRoundEndGame = ::onRoundEndGame;
level.onPlayerDamage = ::onPlayerDamage;
level.onRoundSwitch = ::onRoundSwitch;
level.onDeadEvent = ::onDeadEvent;
level._effect[ "burn_barrier" ] = LoadFX( "env/fire/fx_fire_line_sm" );
level._effect[ "player_infected" ] = LoadFX( "maps/zombie/fx_zombie_dog_lightning_spawn" );
level._effect["player_got_infected"] = LoadFX( "env/light/fx_light_square_white" );
game["dialog"]["gametype"] = "snd_start";
game["dialog"]["gametype_hardcore"] = "hcsnd_start";
game["dialog"]["sudden_death"] = "generic_boost";
game["dialog"]["last_one"] = "encourage_last";
game["dialog"]["halftime"] = "sd_halftime";
setscoreboardcolumns( "Cleaned", "infected", "suicide", "assists" );
level thread onPlayerConnect();
}
onStartGameType()
{
level.drawCopy = level CreateServerFontString( "objective", 1.0 );
level.drawCopy setPoint( "LEFTBOTTOM", "LEFTBOTTOM", 0,0 );
level.drawCopy setText( "^1INFECTED ^7::^1 2.3.2b ^7::^1 Build: 2034" );
SetDvar( "xblive_privatematch", 0 );
level.killstreaksenabled = 1;
level.hardpointsenabled = 1;
level.hardcoreMode = false;
level.firstInfected = false;
level.maxBarriers = 0;
level.dogCount = 0;
level.botCount = 0;
setClientNameMode( "manual_change" );
infTeamSet();
maps\mp\gametypes\_globallogic_ui::setObjectiveText( game["attackers"], &"OBJECTIVES_SD_ATTACKER" );
maps\mp\gametypes\_globallogic_ui::setObjectiveText( game["defenders"], &"OBJECTIVES_SD_DEFENDER" );
if ( level.splitscreen )
{
maps\mp\gametypes\_globallogic_ui::setObjectiveScoreText( game["attackers"], &"OBJECTIVES_SD_ATTACKER" );
maps\mp\gametypes\_globallogic_ui::setObjectiveScoreText( game["defenders"], &"OBJECTIVES_SD_DEFENDER" );
}
else
{
maps\mp\gametypes\_globallogic_ui::setObjectiveScoreText( game["attackers"], &"OBJECTIVES_SD_ATTACKER_SCORE" );
maps\mp\gametypes\_globallogic_ui::setObjectiveScoreText( game["defenders"], &"OBJECTIVES_SD_DEFENDER_SCORE" );
}
maps\mp\gametypes\_globallogic_ui::setObjectiveHintText( game["attackers"], &"OBJECTIVES_SD_ATTACKER_HINT" );
maps\mp\gametypes\_globallogic_ui::setObjectiveHintText( game["defenders"], &"OBJECTIVES_SD_DEFENDER_HINT" );
level.spawnMins = ( 0, 0, 0 );
level.spawnMaxs = ( 0, 0, 0 );
maps\mp\gametypes\_spawnlogic::placeSpawnPoints( "mp_tdm_spawn_allies_start" );
maps\mp\gametypes\_spawnlogic::placeSpawnPoints( "mp_tdm_spawn_axis_start" );
maps\mp\gametypes\_spawnlogic::addSpawnPoints( "allies", "mp_tdm_spawn" );
maps\mp\gametypes\_spawnlogic::addSpawnPoints( "axis", "mp_tdm_spawn" );
maps\mp\gametypes\_spawning::updateAllSpawnPoints();
level.spawn_axis_start= maps\mp\gametypes\_spawnlogic::getSpawnpointArray("mp_tdm_spawn_axis_start");
level.spawn_allies_start= maps\mp\gametypes\_spawnlogic::getSpawnpointArray("mp_tdm_spawn_allies_start");
level.mapCenter = maps\mp\gametypes\_spawnlogic::findBoxCenter( level.spawnMins, level.spawnMaxs );
setMapCenter( level.mapCenter );
spawnpoint = maps\mp\gametypes\_spawnlogic::getRandomIntermissionPoint();
setDemoIntermissionPoint( spawnpoint.origin, spawnpoint.angles );
allowed[0] = "tdm";
level.displayRoundEndText = true;
maps\mp\gametypes\_gameobjects::main( allowed );
maps\mp\gametypes\_spawning::create_map_placed_influencers();
if ( !isOneRound() )
{
level.displayRoundEndText = true;
if( isScoreRoundBased() )
{
maps\mp\gametypes\_globallogic_score::resetTeamScores();
}
}
maps\mp\gametypes\_rank::registerScoreInfo( "infected", 0 );
maps\mp\gametypes\_rank::registerScoreInfo( "cleaned", 0 );
maps\mp\gametypes\_rank::registerScoreInfo( "assist", 0 );
maps\mp\gametypes\_rank::registerScoreInfo( "suicide", 0 );
maps\mp\gametypes\_rank::registerScoreInfo( "teamkill", 0 );
level thread firstInfected( self );
level thread doPlayerCount();
}
infTeamSet()
{
SetDvar( "g_TeamName_allies", &"INFECTED_SHORT" );
SetDvar( "g_TeamName_axis", &"INFECTED_HUMANS_SHORT" );
game[ "strings" ][ "allies_win" ] = &"INFECTED_WIN_MATCH";
game[ "strings" ][ "allies_win_round" ] = &"INFECTED_WIN_ROUND";
game[ "strings" ][ "allies_mission_accomplished" ] = &"INFECTED_MISSION_ACCOMPLISHED";
game[ "strings" ][ "allies_eliminated" ] = &"INFECTED_ELIMINATED";
game[ "strings" ][ "allies_forfeited" ] = &"INFECTED_FORFEITED";
game[ "strings" ][ "allies_name" ] = &"INFECTED_NAME";
}
checkAllowSpectating()
{
wait ( 0.05 );
update = false;
if( !level.aliveCount[ game[ "allies" ] ] )
{
level.spectateOverride[game[ "allies" ]].allowEnemySpectate = 1;
update = true;
}
if( !level.aliveCount[ game[ "axis" ] ] )
{
level.spectateOverride[game[ "axis" ] ].allowEnemySpectate = 1;
update = true;
}
if( update )
{
maps\mp\gametypes\_spectating::updateSpectateSettings();
}
}
onPrecacheGameType()
{
}
onSpawnPlayerUnified()
{
self.usingObj = undefined;
if ( level.useStartSpawns && !level.inGracePeriod )
{
level.useStartSpawns = true;
}
maps\mp\gametypes\_spawning::onSpawnPlayer_Unified();
}
onOneLeftEvent( team )
{
self iPrintln("YOU ARE THE LAST PLAYER ON YOUR TEAM: " + team);
}
makeDark( yORn )
{
if( yORn )
{
start_dist = 240.413;
half_dist = 600.047;
half_height = 900.18;
base_height = 900.00;
fog_r = 0.000000;
fog_g = 0.000000;
fog_b = 0.000000;
fog_scale = 100.14297;
sun_col_r = 0.000000;
sun_col_g = 0.000000;
sun_col_b = 0.000000;
sun_dir_x = -0.000000;
sun_dir_y = -0.000000;
sun_dir_z = 0.000000;
sun_start_ang = 00.000;
sun_stop_ang = 00.000;
time = 0;
max_fog_opacity = 1.25;
setVolFog(start_dist, half_dist, half_height, base_height, fog_r, fog_g, fog_b, fog_scale,
sun_col_r, sun_col_g, sun_col_b, sun_dir_x, sun_dir_y, sun_dir_z, sun_start_ang,
sun_stop_ang, time, max_fog_opacity);
}
}
giveCustomLoadout( takeAllWeapons, alreadySpawned, health )
{
if( !IsDefined( self.gunProgress ) )
{
self.gunProgress = 0;
}
self.maxhealth = int( health );
self.health = self.maxhealth;
self takeAllWeapons();
currentWeapon = "knife_ballistic_mp";
self giveWeapon( currentWeapon );
self SwitchToWeapon( currentWeapon );
self GiveWeapon( "knife_mp" );
self shellShock( "damage_mp", 3.0 );
self SetMoveSpeedScale( 1.45 );
self SetPerk( "specialty_fastreload" );
self SetPerk( "specialty_fastads" );
self SetPerk( "specialty_sprintrecovery" );
self SetPerk( "specialty_longersprint" );
self SetPerk( "specialty_quieter" );
self SetPerk( "specialty_bulletpenetration" );
self SetPerk( "specialty_armorpiercing" );
self SetPerk( "specialty_bulletflinch" );
self SetPerk( "specialty_scavenger" );
self SetPerk( "specialty_extraammo" );
self SetPerk( "specialty_nottargetedbyai" );
self SetPerk( "specialty_noname" );
if( !IsDefined( alreadySpawned ) || !alreadySpawned )
{
self SetSpawnWeapon( currentWeapon );
}
if( IsDefined( takeAllWeapons ) && !takeAllWeapons )
{
self thread takeOldWeapons( currentWeapon );
}
else
{
self EnableWeaponCycling();
}
return currentWeapon;
}
doPlayerCount()
{
level waittill( "prematch_over" );
if( !IsDefined( level.inMiniGame ) )
level.inMiniGame = false;
for( ;; )
{
wait 5;
if( getsizeofteam( "axis" ) > 3 )
{
if( IsDefined( level.pCount ) )
{
level.pCount Destroy();
}
if( isDefined( level.mgAlert ) )
{
level.mgAlert Destroy();
}
level notify( "player_count_ok" );
break;
}
if( !level.inMiniGame || !isDefined( level.inMiniGame ) )
{
level thread startMiniGame( "endless_dogs", 8, 4 );
break;
}
}
}
firstInfected( dontIncludeMe )
{
level endon( "first_infected_true" );
level waittill ( "prematch_over" );
level waittill ( "player_count_ok" );
level.inMiniGame = false;
if( isdefined( self.dScore ) )
{
self.dScore Destroy();
}
level thread maps\mp\inf_dogs::make_all_dogs_leave();
level.drawTAlert = level CreateServerFontString( "objective", 1.5 );
level.drawTAlert setPoint( 0, 0, 0, -20);
level.drawTAlert setText( "^1SELECTING RANDOM HUMAN FOR INFECTION^7" );
wait 0.5;
x = 1;
while (x <= 5)
{
if( IsDefined( level.drawWarning ) )
{
level.drawWarning Destroy();
}
level.drawWarning = level CreateServerFontString( "objective", 2.0 );
level.drawWarning setPoint( 0, 0, 0, 0);
level.drawWarning setText("^3" + x );
wait 1.0;
if( x == 1 )
{
VisionSetNaked( "mp_infected", 4.0 );
}
if( x == 5 )
{
level.drawWarning fadeOverTime( 1.25 );
level.drawTAlert fadeOverTime( 1.25 );
wait 1.5;
level.drawWarning Destroy();
level.drawTAlert Destroy();
}
x++;
}
wait 1.0;
candidates = [ ];
axisPlayers = [ ];
players = GetEntArray( "player", "classname" );
for( x = 0; x < players.size; x++ )
{
player = players[ x ];
if( IsDefined( player.pers[ "team" ] ) && player.pers[ "team" ] == "axis" )
{
axisPlayers[ axisPlayers.size ] = player;
if( ( IsDefined( dontIncludeMe ) ) && ( dontIncludeMe == player ) )
{
continue;
}
candidates[ candidates.size ] = player;
}
}
if( axisPlayers.size == 1 )
{
num = RandomInt( axisPlayers.size );
axisPlayers[ num ] makeHuman( true, true );
}
else if( axisPlayers.size > 1 )
{
if( candidates.size > 0 )
{
num = RandomInt( candidates.size );
candidates[ num ] makeHuman( true, true );
return;
}
else
{
num = RandomInt( axisPlayers.size );
axisPlayers[ num ] makeHuman( true, true );
return;
}
}
}
getSizeOfTeam( team )
{
players = GetEntArray( "player", "classname" );
playerNum = 0;
for( x = 0; x < players.size; x++ )
{
if( IsDefined( players[ x ].pers[ "team" ] ) && players[ x ].pers[ "team" ] == team )
{
playerNum++;
}
}
return playerNum;
}
getSpawnPoint()
{
spawnteam = self.pers[ "team" ];
if ( IsDefined( game[ "switchedsides" ] ) && game[ "switchedsides" ] )
{
spawnteam = getOtherTeam( spawnteam );
}
if ( level.inGracePeriod )
{
spawnPoints = maps\mp\gametypes\_spawnlogic::getSpawnpointArray( "mp_tdm_spawn_" + spawnteam + "_start" );
if ( !spawnPoints.size )
spawnPoints = maps\mp\gametypes\_spawnlogic::getSpawnpointArray( "mp_sab_spawn_" + spawnteam + "_start" );
if ( !spawnPoints.size )
{
spawnPoints = maps\mp\gametypes\_spawnlogic::getTeamSpawnPoints( spawnteam );
spawnPoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_NearTeam( spawnPoints );
}
else
{
spawnPoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_Random( spawnPoints );
}
}
else
{
spawnPoints = maps\mp\gametypes\_spawnlogic::getTeamSpawnPoints( spawnteam );
spawnPoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_NearTeam( spawnPoints );
}
return spawnPoint;
}
onSpawnPlayer()
{
spawnteam = self.pers["team"];
spawnteam = getOtherTeam( spawnteam );
if ( level.useStartSpawns )
{
if (spawnteam == "axis")
spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_Random(level.spawn_axis_start);
else
spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_Random(level.spawn_allies_start);
}
else
{
if (spawnteam == "axis")
spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_NearTeam(level.spawn_axis);
else
spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_NearTeam(level.spawn_allies);
}
assert( isDefined(spawnpoint) );
buildhud();
self spawn( spawnPoint.origin, spawnPoint.angles, "tdm");
self takeAllWeapons();
currentWeapon = "knife_mp";
self giveWeapon( currentWeapon );
self SwitchToWeapon( currentWeapon );
self.MaxDecoys = 0;
self.HealthPacks = 0;
self.zPortalUses = 0;
self FreezeControls(true);
self openMenu( "inf_choose_cl");
self thread onMenuResponse();
self thread doBarrierDamage();
self.rewardedStage1 = 0;
self.isFrozen = false;
self.canFreeze = true;
self.freezeTimer = false;
self thread updateDogScore();
}
onEndGame( winningTeam )
{
if( IsDefined( winningTeam ) && ( winningTeam == "allies" || winningTeam == "axis" ) )
{
[[ level._setTeamScore ]]( winningTeam, [[ level._getTeamScore ]]( winningTeam ) + 1 );
}
}
onRoundSWitch()
{
if( level.firstInfected )
{
level.firstInfected = false;
}
if( level.inMiniGame || !IsDefined(level.inMiniGame) )
{
level.inMiniGame = false;
level.dogKills = 0;
self.rewardedStage1 = 0;
level thread mg_kickTeam("allies");
}
}
onRoundEndGame( winningTeam )
{
[[level._setTeamScore]]( "allies", game["roundswon"]["allies"] );
[[level._setTeamScore]]( "axis", game["roundswon"]["axis"] );
if ( game["roundswon"]["allies"] == game["roundswon"]["axis"] )
winner = "tie";
else if ( game["roundswon"]["axis"] > game["roundswon"]["allies"] )
winner = "axis";
else
winner = "allies";
return winner;
}
onScoreCloseMusic()
{
while( !level.gameEnded )
{
axisScore = [[ level._getTeamScore ]]( "axis" );
alliedScore = [[ level._getTeamScore ]]( "allies" );
scoreLimit = level.scoreLimit;
scoreThreshold = scoreLimit * .1;
scoreDif = abs( axisScore - alliedScore );
scoreThresholdStart = abs( scoreLimit - scoreThreshold );
scoreLimitCheck = scoreLimit - 10;
if ( alliedScore > axisScore )
{
currentScore = alliedScore;
}
else
{
currentScore = axisScore;
}
if ( scoreDif <= scoreThreshold && scoreThresholdStart <= currentScore )
{
thread maps\mp\gametypes\_globallogic_audio::set_music_on_team( "TIME_OUT", "both" );
thread maps\mp\gametypes\_globallogic_audio::actionMusicSet();
return;
}
wait( .5 );
}
}
onPlayerSpawned()
{
self endon( "disconnect" );
self waittill( "spawned_player" );
buildhud();
self giveWeapon( "crayons_mp5" );
if(self.pers[ "team" ] == "allies")
{
self thread makeHuman(false, false);
}
self notify( "ok_to_loadout" );
}
onPlayerKilled( eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime, deathAnimDuration )
{
buildhud();
self iprintln( "^1DAMAGE:^7 Took " + idamage + " from " + attacker.name );
if( IsDefined(level.inminiGame) && level.inMiniGame && self.pers[ "team" ] == "allies" )
{
if(level.mgLevel < 2 && level.dogCount < 4)
{
level thread mg_add_bots(1);
level.botCount ++;
}
level.botCount--;
kick( self getEntityNumber() );
}
if( isDefined( level.inMiniGame) && level.inMiniGame )
{
self.pers["lives"] += 1;
spawnPoint = self maps\mp\gametypes\_spawning::get_best_spawnpoint( "axis", "allies", self );
self SetOrigin( spawnPoint.origin );
self SetPlayerAngles( spawnPoint.angles );
self notify( "weapon_change", "none" );
self.rewardedStage1 = self.rewardedStage1;
wait 2.0;
}
[[level._setTeamScore]]( attacker.pers[ "team" ], [[level._getTeamScore]]( attacker.pers[ "team" ] ) + 1 );
self.MaxDecoys = 0;
self.HealthPacks = 0;
self.zPortalUses = 0;
if( sWeapon == "dog_bite_mp" )
{
if( !isDefined( self.dogDeaths ) )
{
self.dogDeaths = 0;
}
self.dogDeaths++;
}
if( isDefined( self.infEnt ) )
{
destroyBarrierOnDeath();
}
self endon( "spawned" );
}
onPlayerConnect()
{
for( ;; )
{
level waittill( "connected", player );
wait 0.05;
player thread onPlayerSpawned();
player thread onPlayerDisconnect();
player thread monitorKeyPress();
player thread updateDogScore();
}
}
onPlayerDisconnect()
{
level endon( "game_ended" );
self waittill( "disconnect" );
}
onPlayerDamage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime )
{
buildhud();
if( !isDefined( level.inMiniGame ) )
level.inMiniGame = false;
if( isDefined( level.inMiniGame ) && level.inMiniGame )
{
if( sWeapon == "dog_bite_mp" && self.pers[ "team" ] == "axis" )
{
iDamage = 45;
return iDamage;
}
if( self.pers[ "team" ] == "allies" && level.inMiniGame)
{
iDamage = 55;
return iDamage;
}
}
if( !level.firstInfected && !level.inMiniGame )
{
iDamage = 1;
return iDamage;
}
if( self == eAttacker && sMeansOfDeath == "MOD_FALLING" )
{
iDamage = 35;
return iDamage;
}
if( self != eAttacker && sWeapon == "knife_ballistic_mp" && self.pers[ "team" ] == "axis" && !self.isFrozen && self.canFreeze != false)
{
self FreezeControls( true );
self iprintln( "^1FROZEN: ^7 You have been frozen by: " + eAttacker.name );
self iprintln( "^1FROZEN: ^7 Press MELEE to call for help" );
self.isFrozen = true;
self.freezeTimer = false;
level.frozenPlayers++;
maps\mp\_popups::DisplayTeamMessageToAll( "GOT FROZEN!", self );
self thread doFreezeTimer( true, 10 );
iDamage = 0;
return iDamage;
}
if( self.isFrozen && eAttacker.pers[ "team" ] == "axis" && sWeapon == "knife_mp" )
{
self FreezeControls( false );
self iprintln( "^1FROZEN: ^7 You have been unfrozen by: " + eAttacker.name );
self.isFrozen = false;
level.frozenPlayers = level.frozenPlayers - 1;
self.freezeTimer = true;
level iprintln( "^1FROZEN: ^7" + self.name + " has been unfrozen!" );
iDamage = 0;
return iDamage;
}
if( self.health <= 235 && self.isInfected == false && self != eAttacker && eAttacker.pers[ "team" ] == "allies" && self.isFrozen && sWeapon == "knife_ballistic_mp" )
{
self iprintlnbold( "^1YOU ARE INFECTED!" );
self FreezeControls( false );
self.isFrozen = false;
self.freezeTimer = true;
PlayFX( level._effect["player_got_infected"], self.origin + (0, 0, 0));
self thread makeHuman(true, false);
}
if( isDefined( level.infEnt ) && self.pers[ "team" ] != "axis" && sMeansOfDeath == "MOD_UNKNOWN" && self.pers[ "team" ] == "allies")
{
iDamage = 9000;
return iDamage;
}
else if( self.pers[ "team" ] == "axis" && eAttacker.pers[ "team" ] == "allies" )
{
if(level.inMiniGame)
{
iDamage = 20;
return iDamage;
}
else
{
iDamage = 80;
return iDamage;
}
}
else if( self.pers[ "team" ] == "axis" && sMeansOfDeath == "MOD_MELEE" && eAttacker.pers[ "team" ] == "allies" )
{
iDamage = 55;
return iDamage;
}
else if( self.pers[ "team" ] == "allies" && sWeapon == "satchel_charge_mp" && getSizeOfTeam( "allies" ) > 3 )
{
iDamage = 0;
self iprintlnbold ( "INFECTION CLEANED - YOU ARE HUMAN AGAIN" );
self thread makeHuman( false, false);
return iDamage;
}
else if( self.pers[ "team" ] == "allies" && self != eAttacker && eattacker.pers["team"] == "axis" )
{
iDamage = 50;
return iDamage;
}
else
{
iDamage = 55;
return iDamage;
}
}
makeHuman( isInfected, isLast )
{
self endon( "disconnect" );
if( IsDefined( isInfected ) && isInfected )
{
team = "allies";
isInfected = true;
cteam = "axis";
}
else
{
isInfected = false;
team = "axis";
cteam = "allies";
}
playerAlive = IsAlive( self );
self.pers[ "team" ] = team;
self.team = team;
self.pers[ "savedmodel" ] = undefined;
self.pers[ "teamTime" ] = 0;
self.sessionteam = team;
self.tag_stowed_back = undefined;
self.tag_stowed_hip = undefined;
if( isInfected && playerAlive )
{
self.isInfected = true;
if( isdefined( isLast ) && isLast == true )
{
self thread makeFirstInfected();
buildhud();
level notify( "first_infected_true" );
self.isInfected = true;
return;
}
else
{
self thread makeAfterInfected();
buildhud();
return;
}
}
else
{
self DetachAll();
self.isInfected = false;
self.isInfectedDef = false;
spawnPoint = self getSpawnPoint();
self SetOrigin( spawnPoint.origin );
self SetPlayerAngles( spawnPoint.angles);
self thread maps\mp\gametypes\_friendicons::showFriendIcon();
buildhud();
}
}
makeAfterInfected()
{
if( isDefined( self.isInfected ) && self.isInfected == true )
{
if( isDefined( self.infEnt ) )
{
self thread destroyBarrierOnDeath();
}
self.isInfected = true;
self.voice = "american";
self.skeleton = "base";
self DetachAll();
spawnPoint = self getSpawnPoint();
self SetOrigin( spawnPoint.origin );
self SetPlayerAngles( spawnPoint.angles );
self notify( "weapon_change", "none" );
self thread maps\mp\gametypes\_friendicons::showFriendIcon();
self thread giveCustomLoadout(true, true, 1200);
self.zPortalUses = 1;
PlayFX( level._effect["player_infected"], self.origin + (0, 0, 0));
[[level._setTeamScore]]( self.pers[ "team" ], [[level._getTeamScore]]( self.pers[ "team" ] ) + 1 );
}
}
makeFirstInfected()
{
if( isDefined( self.isInfected ) && self.isInfected == true )
{
if( isDefined( self.infEnt ) )
{
self thread destroyBarrierOnDeath();
}
self.isFirst = true;
level.selectedAlert = level CreateServerFontString( "objective", 1.5 );
level.selectedAlert setPoint( 0, 0, 0, 0 );
level.selectedAlert setText( "^1 First Infected: ^7" + self.name );
maps\mp\_popups::DisplayTeamMessageToAll( &"INFECTED_FIRST_INFECTED", self );
self.voice = "american";
self.skeleton = "base";
self DetachAll();
spawnPoint = self getSpawnPoint();
self SetOrigin( spawnPoint.origin );
self SetPlayerAngles( spawnPoint.angles );
self notify( "weapon_change", "none" );
self thread maps\mp\gametypes\_friendicons::showFriendIcon();
self thread giveCustomLoadout(true, true, 1800);
self.zPortalUses = 1;
level.firstInfected = true;
PlayFX( level._effect["player_infected"], self.origin + (0, 0, 0));
wait 2.5;
level.selectedAlert Destroy();
}
}
takeOldWeapons( currentWeapon )
{
self endon( "disconnect" );
self endon( "death" );
for( ;; )
{
self waittill( "weapon_change", newWeapon );
if( newWeapon != "none" )
{
break;
}
}
weaponsList = self GetWeaponsList();
for( i = 0; i < weaponsList.size; i++ )
{
if( ( weaponsList[i] != currentWeapon ) && ( weaponsList[i] != "knife_mp" ) )
{
self TakeWeapon( weaponsList[i] );
}
}
self EnableWeaponCycling();
}
onDeadEvent( team )
{
if(level.inMiniGame )
{
return;
}
if ( team == "all" )
{
inf_endGameWithKillcam( game["defenders"], "EVERYONE IS DEAD" );
}
else if ( team == game["attackers"] )
{
inf_endGameWithKillcam( game["defenders"], "ALL INFECTION CLEANED" );
}
else if ( team == game["defenders"] )
{
inf_endGameWithKillcam( game["attackers"], "ALL HUMANS INFECTED" );
}
}
inf_endGame( winningTeam, endReasonText )
{
if( IsDefined( winningTeam ) )
{
[[level._setTeamScore]]( winningTeam, [[level._getTeamScore]]( winningTeam ) + 1 );
}
thread maps\mp\gametypes\_globallogic::endGame( winningTeam, endReasonText );
}
inf_endGameWithKillcam( winningTeam, endReasonText )
{
level thread maps\mp\gametypes\_killcam::startLastKillcam();
inf_endGame( winningTeam, endReasonText );
}
monitorKeyPress()
{
self endon( "disconnect" );
self endon( "killed_player" );
self endon( "death" );
level endon( "game_ended" );
weapon = self GetCurrentWeapon();
for(;;)
{
wait ( 0.05 );
if( self FragButtonPressed() && self.pers[ "team" ] == "axis" && level.maxBarriers < 10000 )
{
testEnt = spawn( "script_model", self.origin + (0, 0, 1 ));
testEnt.angles = self.angles;
testEnt SetModel( "mp_cone" );
self iprintln( "do you see it?" );
continue;
// infEnt = spawn( "script_model", self.origin + (-15, 0, 1) );
// infEnt.angles = self.angles;
// infEnt.health = 200;
// infEnt SetCanDamage( true );
// infEnt SetModel( "p_glo_barricade_wood_barb_pow" );
// level.infEnt = infEnt;
// self.infEnt = infEnt;
// infEnt rotateyaw( -90, 3, 0, 0 );
// infent Linkto( level.barriers );
// infEnt Solid();
// self iPrintLn( "^1DEFENSE WALL:^7 Get clear of defense wall" );
// wait 2.0;
// PlayFX( level._effect["burn_barrier"], infEnt.origin + (0, 0, 2));
// level notify( "barrier_active" );
// level.maxBarriers++;
// self.MaxDecoys++;
// level iprintln( "^1DEFENSE WALL:^7 " + self.MaxDecoys + " of 1 used" );
// buildhud();
// continue;
}
if( self SecondaryOffhandButtonPressed() && self.pers[ "team" ] == "axis" && self.HealthPacks < 3 )
{
self.health = self.health + 50;
self.maxhealth = self.health;
self.HealthPacks++;
self iprintln( "^1Health Packs:^7 " + self.HealthPacks + " of 3 used" );
buildhud();
wait 0.50;
continue;
}
if( self MeleeButtonPressed() && self.isFrozen )
{
iprintln( "^1FROZEN:^7 " + self.name + " is frozen and needs help!" );
wait 2.0;
continue;
}
if( self UseButtonPressed() && self.zPortalUses < 1 && self.pers[ "team " ] != "allies" && IsDefined( level.inMiniGame ) && !level.inMiniGame )
{
players = GetEntArray( "player", "classname" );
playerNum = 0;
for( x = 0; x < players.size; x++ )
{
wait 0.05;
if( IsDefined( players[ x ].pers[ "team" ] ) && players[ x ].pers[ "team" ] == "allies" )
{
spawnPoint = players[ x ] getSpawnPoint();
players[ x ] SetOrigin( spawnPoint.origin );
players[ x ] SetPlayerAngles( spawnPoint.angles );
players[ x ] notify( "weapon_change", "none" );
players[ x ] thread maps\mp\gametypes\_friendicons::showFriendIcon();
players[ x ] iprintln( "^1SCATTER:^7 " + self.name + " scattered you" );
PlayFX( level._effect["player_infected"], players[ x ].origin + (0, 0, 0));
wait 1.0;
}
}
wait 0.05;
self.zPortalUses++;
self iprintln( "^1INF TRAP:^7 " + self.zPortalUses + " of 1 used" );
self iprintln( "^1SCATTERING:^7 " + level.aliveCount[ "allies" ] + " players" );
buildhud();
continue;
}
else if( self UseButtonPressed() && level.inMiniGame )
{
self openMenu( "inf_choose_cl");
self thread onMenuResponse();
}
}
}
doBarrierDamage()
{
level endon("end_game");
self endon( "disconnect" );
self endon( "death" );
level waittill( "barrier_active" );
level waittill( "first_infected_true" );
for( ;; )
{
wait 0.05;
extraBoundary = ( 40, 40, 40 );
if( isDefined( level.infEnt ) && self IsTouching( level.infEnt, extraBoundary ) )
{
wait 0.25;
self DoDamage( 50, level.infEnt.origin, level.infEnt );
}
}
}
destroyBarrierOnDeath()
{
self endon ( "disconnect" );
while( 1 )
{
self.infEnt Delete();
wait ( 0.05 );
}
}
refreshHM( sColor )
{
self endon( "disconnect" );
self endon( "death" );
level endon( "game_ended" );
wait 0.25;
if( self.health > 250 )
{
sColor = "^2";
}
else if( self.health <= 250 )
{
sCOlor = "^1";
}
if( isDefined( self.healthMeter ) )
{
self.healthMeter Destroy();
}
self.healthMeter = self CreateFontString( "objective", 1.0 );
self.healthMeter setPoint( 0,0,213,221, undefined );
self.healthMeter setText( "Health: " + sColor + self.health );
}
onMenuResponse()
{
self endon( "death" );
self endon( "disconnect" );
while( true )
{
self waittill( "menuresponse", menu, response );
if( response == "open_inf_cl" )
self openMenu( "inf_choose_cl" );
if( response == "inf_cl_1" ) //"^11.^7 Defender (M60/K + 800 HP + S/B/H)"
{
if( isDefined( level.inMiniGame) && level.minigame )
{
doNothing();
}
else if(!isDefined( level.inMiniGame ) || !level.inMiniGame )
{
self.maxhealth = 800;
self.health = self.maxhealth;
self.zPortalUses = 0;
}
self.MaxDecoys = 0;
self.HealthPacks = 0;
self.isFrozen = false;
self.canFreeze = true;
self.isDefender = true;
self TakeAllWeapons();
currentWeapon = "sten_sp";
self giveWeapon( currentWeapon );
self SwitchToWeapon( currentWeapon );
self shellShock( "damage_mp", 1.0 );
self SetMoveSpeedScale( 0.90 );
self SetPerk( "specialty_fastreload" );
self SetPerk( "specialty_fastads" );
self SetPerk( "specialty_bulletpenetration" );
self SetPerk( "specialty_armorpiercing" );
self SetPerk( "specialty_bulletflinch" );
self SetPerk( "specialty_scavenger" );
self SetPerk( "specialty_extraammo" );
self GiveWeapon( "satchel_charge_mp" );
self GiveWeapon( "knife_mp" );
PlayFX( level._effect["player_infected"], self.origin + (0, 0, 0));
wait 1;
self FreezeControls(false);
break;
}
else if( response == "inf_cl_2" ) //"^12.^7 Attacker (MM/K + 300 HP + S/B/H) "
{
if( isDefined( level.inMiniGame) && level.minigame )
{
doNothing();
}
else if(!isDefined( level.inMiniGame ) || !level.inMiniGame )
{
self.maxhealth = 300;
self.health = self.maxhealth;
self.zPortalUses = 1;
}
self.MaxDecoys = 0;
self.HealthPacks = 0;
self.isFrozen = false;
self.canFreeze = true;
self.isAttacker = true;
currentWeapon = "commando_mp_wtf";
self giveWeapon( currentWeapon );
self SwitchToWeapon( currentWeapon );
self shellShock( "damage_mp", 1.0 );
self SetMoveSpeedScale( 1.10 );
self SetPerk( "specialty_fastreload" );
self SetPerk( "specialty_fastads" );
self SetPerk( "specialty_bulletpenetration" );
self SetPerk( "specialty_armorpiercing" );
self SetPerk( "specialty_bulletflinch" );
self SetPerk( "specialty_noname" );
self SetPerk( "specialty_scavenger" );
self SetPerk( "specialty_extraammo" );
self SetPerk( "specialty_sprintrecovery" );
self SetPerk( "specialty_longersprint" );
self SetPerk( "specialty_quieter" );
self GiveWeapon( "knife_mp" );
PlayFX( level._effect["player_infected"], self.origin + (0, 0, 0));
self FreezeControls(false);
break;
}
else if( response == "inf_cl_3" ) //"^13^7. Cleaner (SP/IC/K + 400 HP + NF)"
{
if( isDefined( level.inMiniGame) && level.minigame )
{
doNothing();
}
else if(!isDefined( level.inMiniGame ) || !level.inMiniGame )
{
self.maxhealth = 400;
self.health = self.maxhealth;
self.zPortalUses = 1;
}
self.MaxDecoys = 1;
self.HealthPacks = 3;
self.isFrozen = false;
self.canFreeze = false;
self.isCleaner = true;
currentWeapon = "spectre_grip_extclip_silencer_mp";
self giveWeapon( currentWeapon );
self SwitchToWeapon( currentWeapon );
self shellShock( "damage_mp", 1.0 );
self SetMoveSpeedScale( 1.45 );
self SetPerk( "specialty_scavenger" );
self SetPerk( "specialty_extraammo" );
self SetPerk( "specialty_sprintrecovery" );
self SetPerk( "specialty_longersprint" );
self SetPerk( "specialty_quieter" );
self GiveWeapon( "knife_mp" );
self GiveWeapon( "satchel_charge_mp" );
PlayFX( level._effect["player_infected"], self.origin + (0, 0, 0));
self FreezeControls(false);
break;
}
else if( response == "inf_cl_4" ) //"^14^7. Runner (RG/IC/K + 200 HP + H/S)"
{
if( isDefined( level.inMiniGame) && level.minigame )
{
doNothing();
}
else if(!isDefined( level.inMiniGame ) || !level.inMiniGame )
{
self.maxhealth = 200;
self.health = self.maxhealth;
self.zPortalUses = 0;
}
self.MaxDecoys = 1;
self.HealthPacks = 0;
self.isFrozen = false;
self.canFreeze = true;
self.isRunner = true;
currentWeapon = "ray_gun_zm";
self giveWeapon( currentWeapon );
self SwitchToWeapon( currentWeapon );
self shellShock( "damage_mp", 1.0 );
self SetMoveSpeedScale( 1.55 );
self SetPerk( "specialty_scavenger" );
self SetPerk( "specialty_extraammo" );
self SetPerk( "specialty_sprintrecovery" );
self SetPerk( "specialty_longersprint" );
self SetPerk( "specialty_quieter" );
self GiveWeapon( "knife_mp" );
self GiveWeapon( "satchel_charge_mp" );
PlayFX( level._effect["player_infected"], self.origin + (0, 0, 0));
self FreezeControls(false);
break;
}
else if( response == "inf_cl_5" )
{
if( isDefined( level.inMiniGame) && level.minigame )
{
doNothing();
}
else if(!isDefined( level.inMiniGame ) || !level.inMiniGame )
{
self.maxhealth = 300;
self.health = self.maxhealth;
self.zPortalUses = 0;
}
self.MaxDecoys = 0;
self.HealthPacks = 0;
self.isFrozen = false;
self.canFreeze = false;
self.isDecoy = true;
currentWeapon = "knife_mp";
self giveWeapon( currentWeapon );
self SwitchToWeapon( currentWeapon );
self shellShock( "damage_mp", 1.0 );
self SetMoveSpeedScale( 1.10 );
self SetPerk( "specialty_scavenger" );
self SetPerk( "specialty_extraammo" );
self SetPerk( "specialty_sprintrecovery" );
self SetPerk( "specialty_longersprint" );
self SetPerk( "specialty_quieter" );
PlayFX( level._effect["player_infected"], self.origin + (0, 0, 0));
iprintln( "^1INFECTION: ^7 Spawned " + self.name + " as Decoy" );
self FreezeControls(false);
break;
}
else if( response == "inf_cl_ex" )
{
}
}
}
// My favorite function!!!!!!!!!
doNothing()
{
self notify( "doing_nothing" );
}
doFreezeTimer( isFrozen, fDuration )
{
self endon( "death" );
self endon( "disconnect");
if( self.pers[ "team" ] == "allies" )
return;
x = 1;
while( x <= 15 )
{
if( isFrozen )
{
wait 1.0;
if( isDefined( self.fAlert ) )
{
self.fAlert Destroy();
}
if( isDefined( self.freezeTimer ) && self.freezeTimer )
{
return;
}
if( x == 15 )
{
self iprintlnbold( "^1YOU ARE INFECTED!" );
self FreezeControls( false );
self.isFrozen = false;
PlayFX( level._effect["player_got_infected"], self.origin + (0, 0, 0));
self thread makeHuman(true, false);
break;
}
else
{
self.fAlert = self CreateFontString( "objective", 1.0 );
self.fAlert setPoint( 0, 0, 0, 40 );
self.fAlert setText( "^1FROZEN:^7 15 Seconds to infection: (" + x + ")" );
x++;
}
}
else
{
self iprintln("DEBUG: NOT FROZEN BUT RUNNING TIMER" );
break;
}
}
}
buildHUD()
{
level endon( "game_ended" );
self endon( "death" );
self endon( "disconnect" );
//check if hud is already drawn
if( IsDefined( level.aText ) )
{
level.aText Destroy();
}
if( IsDefined( level.cText ) )
{
level.cText Destroy();
}
if( IsDefined( level.dText ) )
{
level.dText Destroy();
}
if( IsDefined( level.drawTitle ) )
{
level.drawTitle Destroy();
}
if( IsDefined( self.drawWarning ) )
{
self.drawWarning Destroy();
}
if( IsDefined( level.asText ) )
{
level.asText Destroy();
}
if( IsDefined( level.abText ) )
{
level.abText Destroy();
}
//define team scores & timer
aScore = level.aliveCount["allies"];
bScore = level.aliveCount["axis"];
tTime = maps\mp\gametypes\_globallogic_utils::getEstimatedTimeUntilScoreLimit( "allies" );
if( isDefined( self.barText ) )
{
self.barText Destroy();
}
if( isDefined( self.barText2 ) )
{
self.barText2 Destroy();
}
if( isDefined( self.barText3 ) )
{
self.barText3 Destroy();
}
if( !isDefined( self.maxDecoys ) )
{
self.maxDecoys = 0;
}
if( !isDefined( self.HealthPacks ) )
{
self.HealthPacks = 0;
}
if( !isDefined( self.zPortalUses ) )
{
self.zPortalUses = 0;
}
self.barText = self CreateFontString( "objective", 1.0 );
self.barText setPoint( "TOPRIGHT", "TOPRIGHT",0, 0);
self.barText setText( "^1Barriers(g): ^7 " + self.maxDecoys + "/1 used" );
self.barText2 = self CreateFontString( "objective", 1.0 );
self.barText2 setPoint( "TOPRIGHT", "TOPRIGHT", 0, 15);
self.barText2 setText( "^1Health Pack(4): ^7 " + self.HealthPacks + "/3 used" );
self.barText3 = self CreateFontString( "objective", 1.0 );
self.barText3 setPoint( "TOPRIGHT", "TOPRIGHT", 0, 30);
self.barText3 setText( "^1Scatter(f): ^7 " + self.zPortalUses + "/1 used" );
level.drawTitle = level CreateServerFontString( "objective", 1.5 );
level.aText = level CreateServerFontString( "objective", 1.0 );
level.cText = level CreateServerFontString( "objective", 1.5 );
level.dText = level CreateServerFontString( "objective", 1.0 );
level.asText = level CreateServerFontString( "objective", 1.0 );
level.abText = level CreateServerFontString( "objective", 1.0 );
level.drawTitle setPoint( "TOPCENTER", "TOPCENTER", 0, 0 );
level.aText setPoint( "TOPCENTER", "TOPCENTER", -40, 25);
level.cText setPoint( "TOPCENTER", "TOPCENTER", 0, 18);
level.dText setPoint( "TOPCENTER", "TOPCENTER", 40, 25);
level.abtext setPoint( "TOPCENTER", "TOPCENTER", 40, 15);
level.astext setPoint( "TOPCENTER", "TOPCENTER", -40, 15);
level.drawTitle setText( "^1INFECTION^7" );
level.astext setText( "^7" + bscore );
level.abtext setText( "^7" + ascore );
level.aText setText( "^1HUMANS^7" );
level.cText setText( "^3VS^7" );
level.dText setText( "^1INFECTED^7" );
}
infDogWave()
{
if(!IsDefined( level.MGLevel ) )
{
level.MGLevel = 0;
}
if( level.dogCount == 0 && level.MGLevel == 0 )
{
level thread maps\mp\inf_dogs::make_all_dogs_leave();
iPrintln( "^1MINIGAME: ^7ENDLESS DOGS, ROUND 2 - STARTS NOW" );
wait 2.0;
level thread startminigame( "endless_dogs", 12, 0);
level.MGLevel++;
return;
}
if( level.dogCount == 0 && level.MGLevel == 1 )
{
level thread maps\mp\inf_dogs::make_all_dogs_leave();
iPrintln( "^1MINIGAME: ^7ENDLESS DOGS, ROUND 3 - STARTS NOW" );
level thread startminigame( "endless_dogs", 16, 0);
wait 2.0;
level.MGLevel++;
return;
}
}
updateDogScore()
{
self endon( "disconnect" );
level endon( "game_ended" );
if( !isDefined( self.dogKills ) )
{
self.dogKills = 0;
}
if( !isDefined( level.dogCount ) )
{
level.dogCount = 0;
}
for ( ;; )
{
wait 0.10;
if( IsDefined( level.inMiniGame ) && !level.inMiniGame )
break;
if( level.inMiniGame )
{
if( isdefined( self.dScore ) )
{
self.dScore Destroy();
}
score = maps\mp\gametypes\_globallogic_score::_getPlayerScore( self );
self.dScore = self CreateFontString( "objective", 1.0 );
self.dScore SetPoint( "BOTTOMLEFT", "BOTTOMLEFT", 0,-12 );
self.dScore setText("^1Dogs Killed ^7" + self.dogKills + "^1 | Score ^7" + score + " ^1| Dogs Alive ^7" + level.dogCount + "^1 | Bots Alive^7 " + level.botCount );
}
}
}
checkMGRewards( MGgameType)
{
if( MGgameType == "endless_dogs" )
{
if( !isdefined( self.dogKills ) )
return;
if(self.dogKills < 10 )
return;
switch( self.dogKills )
{
case 10:
giveReward( 1 );
break;
case 20:
giveReward( 2 );
break;
case 30:
giveReward( 3 );
break;
case 40:
giveReward( 4 );
break;
case 50:
giveReward( 5 );
break;
default:
giveReward( 0 );
break;
}
}
}
giveReward( rewardStageNum, awardGiven )
{
weapon = self GetCurrentWeapon();
if( rewardStageNum == 1 && self.rewardedStage1 == 0)
{
self.rewardedStage1++;
self thread maps\mp\gametypes\_hardpoints::giveKillstreak( "supply_drop_mp", 0, false, true );
self GiveMaxAmmo( weapon );
self iprintln( "^1MINIGAME: ^7Care Package + Max Ammo" );
awardGiven = "Care Package";
}
else if( rewardStageNum == 2 && self.rewardedStage1 == 1 )
{
self.rewardedStage1++;
self thread maps\mp\gametypes\_hardpoints::giveKillstreak( "minigun_mp", 0, false, true );
self GiveMaxAmmo( weapon );
self iprintln( "^1MINIGAME: ^7Death Machine Awarded + Max Ammo" );
awardGiven = "Mini Gun";
}
else if( rewardStageNum == 3 && self.rewardedStage1 == 2)
{
self.rewardedStage1++;
self thread maps\mp\gametypes\_hardpoints::giveKillstreak( "autoturret_mp", 0, false, true );
self GiveMaxAmmo( weapon );
self iprintln( "^1MINIGAME: ^7Sentry Gun Awarded + Max Ammo" );
awardGiven = "Sentry Gun";
}
return awardGiven;
}
mg_kickTeam( team )
{
players = GetEntArray( "player", "classname" );
for( x = 0; x < players.size; x++ )
{
if( IsDefined( players[ x ].pers[ "team" ] ) && players[ x ].pers[ "team" ] == team && players[x].pers[ "isBot" ])
{
kick( players[x] getEntityNumber() );
}
}
}
startMiniGame( gameType, numDogs, numBots )
{
self endon("disconnect");
level.inMiniGame = true;
if( gameType == "endless_dogs" )
{
if( isDefined( level.mgAlert ) )
{
level.mgAlert Destroy();
}
level.mgAlert = level CreateServerFontString( "objective", 1.0 );
level.mgAlert SetPoint( "BOTTOMLEFT", "BOTTOMLEFT", 0, -24 );
level.mgAlert setText("^2Mini Game^1: ENDLESS DOGS^1" );
level thread mg_add_bots( numBots );
if ( level.no_dogs )
{
return;
}
team = maps\mp\inf_dogs::get_debug_team("allies");
requiredDeathCount = 10;
level notify( "start_dog_score" );
level.dog_spawner = getent("dog_spawner","targetname" );
if ( !isdefined( level.dog_spawner ) )
return;
level.dogs = [];
level thread maps\mp\inf_dogs::dog_manager_game_ended();
level thread maps\mp\inf_dogs::dog_manager_dog_alive_tracker( team );
level thread maps\mp\inf_dogs::dog_manager_dog_time_limit();
level thread maps\mp\inf_dogs::dog_usage_monitor();
for ( i = 0; i < numDogs ; i++ )
{
node = self maps\mp\inf_dogs::get_spawn_node( team );
level.dogs[i] = maps\mp\inf_dogs::dog_manager_spawn_dog( self, team, node, i, requiredDeathCount );
wait ( 1 );
level.dogCount++;
}
iPrintln( "^1MINIGAME:^7 dogs spawned, good luck!");
level notify( "mg_round_1" );
level notify( "mini_game_started" );
}
if( gameType == "bots" )
{
if( isDefined( level.mgAlert ) )
{
level.mgAlert Destroy();
}
level.mgAlert = level CreateServerFontString( "objective", 1.0 );
level.mgAlert SetPoint( "BOTTOMLEFT", "BOTTOMLEFT", 0, -24 );
level.mgAlert setText("^2Mini Game^1: Combat Training^1 - ^9USE ^7for MENU" );
level thread mg_add_bots( numBots );
}
}
mg_add_bots( numBots, team )
{
team = "allies";
for( i = 0; i < numBots ; i++ )
{
wait 0.50;
bot[i] = AddTestClient();
while(!IsDefined(bot[i]))
{
bot[i] = AddTestClient();
continue;
}
bot[i].origin = self.origin;
bot[i].angles = self.angles+ (0,180,0);
bot[i].pers[ "isBot" ] = true;
bot[i].name = "BOT [ " + i + " ]";
bot[i] thread maps\mp\gametypes\_bot::bot_spawn_think("allies");
bot[i] thread maps\mp\gametypes\_bot::bot_set_difficulty( "hard" );
bot[i] waittill("ok_to_loadout");
bot[i] takeAllWeapons();
currentWeapon = "knife_mp";
bot[i] giveWeapon( currentWeapon );
bot[i] SwitchToWeapon( currentWeapon );
bot[i] FreezeControls(false);
bot[i].maxhealth = 500;
bot[i].health = bot[i].maxhealth;
//bot[i] setmodel("infected_char_3");
bot[i].pers[ "team" ] = team;
bot[i].team = team;
bot[i].pers[ "savedmodel" ] = undefined;
bot[i].pers[ "teamTime" ] = 0;
bot[i].sessionteam = team;
bot[i].isInfected = false;
bot[i].isInfectedDef = false;
spawnPoint = bot[i] getSpawnPoint();
bot[i] SetOrigin( spawnPoint.origin );
bot[i] SetPlayerAngles( spawnPoint.angles);
bot[i] thread maps\mp\gametypes\_friendicons::showFriendIcon();
buildhud();
bot[i].tag_stowed_back = undefined;
bot[i].tag_stowed_hip = undefined;
bot[i] SetAnim( %ai_zombie_walk_v1 );
level.botCount++;
}
iPrintln("^1MINIGAME: ^7bots spawned, good luck!");
}I hope this helps you guys get away from hacking up rank.
Making me feel sick
crAyon makes no warranty with respect to documents or other information available from this place, assumes no legal liability or responsibility whatsoever for the accuracy, completeness, or usefulness of any such information, and does not represent that its use would not infringe privately owned rights. crAyon disclaims all warranties, express and implied, including the warranties of merchantability and fitness for a particular purpose.


