airdrop_grnd,uav, 25,
airdrop_grnd,counter_uav, 25,
airdrop_grnd,deployable_vest, 21,
airdrop_grnd,sentry, 21,
airdrop_grnd,remote_mg_turret, 17,
airdrop_grnd,ims, 17,
airdrop_grnd,triple_uav, 13,
airdrop_grnd,predator_missile, 13,
airdrop_grnd,airdrop_trap, 11,
airdrop_grnd,precision_airstrike, 9,
airdrop_grnd,stealth_airstrike, 9,
airdrop_grnd,helicopter, 9,
airdrop_grnd,remote_tank, 7,
airdrop_grnd,sam_turret, 7,
airdrop_grnd,remote_uav, 7,
airdrop_grnd,littlebird_support, 4,
airdrop_grnd,airdrop_juggernaut_recon, 4,
airdrop_grnd,littlebird_flock, 2,
airdrop_grnd,helicopter_flares, 2,
airdrop_grnd,remote_mortar, 2,
airdrop_grnd,ac130, 2,
airdrop_grnd,airdrop_juggernaut, 1,
airdrop_grnd,osprey_gunner, 1,
airdrop_grnd,emp, 1,
#include common_scripts\utility;
#include maps\mp\_utility;
#include maps\mp\gametypes\_hud_util;
/*
Drop Zone
Objective: Score points for your team over time by holding the drop zone.
Periodic carepackage awarded to player who's been in drop zone the longest.
Map ends: When one team reaches the score limit, or time limit is reached
Respawning: No wait / Near teammates / Near drop zone
Level requirementss
------------------
Start Spawnpoints:
classname mp_sab_spawn_allies_start, mp_sab_spawn_axis_start
Spawnpoints:
classname mp_tdm_spawn
All players spawn from these. The spawnpoint chosen is dependent on the current locations of drop zone, teammates, and enemies
at the time of spawn. Players generally spawn behind their teammates relative to the direction of enemies.
Spectator Spawnpoints:
classname mp_global_intermission
Spectators spawn from these and intermission is viewed from these positions.
Atleast one is required, any more and they are randomly chosen between.
*/
GRND_ZONE_TOUCH_RADIUS = 300;
GRND_ZONE_DROP_RADIUS = 72;
main()
{
if(getdvar("mapname") == "mp_background")
return;
maps\mp\gametypes\_globallogic::init();
maps\mp\gametypes\_callbacksetup::SetupCallbacks();
maps\mp\gametypes\_globallogic::SetupCallbacks();
if ( isUsingMatchRulesData() )
{
level.initializeMatchRules = ::initializeMatchRules;
[[level.initializeMatchRules]]();
level thread reInitializeMatchRulesOnMigration();
}
else
{
registerRoundSwitchDvar( level.gameType, 0, 0, 9 );
registerTimeLimitDvar( level.gameType, 10 );
registerScoreLimitDvar( level.gameType, 20000 );
registerRoundLimitDvar( level.gameType, 1 );
registerWinLimitDvar( level.gameType, 1 );
registerNumLivesDvar( level.gameType, 0 );
registerHalfTimeDvar( level.gameType, 0 );
level.matchRules_dropTime = 30;
level.matchRules_zoneSwitchTime = 120;
level.matchRules_damageMultiplier = 0;
level.matchRules_vampirism = 0;
}
level.teamBased = true;
level.onPrecacheGameType = :
nPrecacheGameType;
level.onStartGameType = :
nStartGameType;
level.getSpawnPoint = ::getSpawnPoint;
level.onSpawnPlayer = :
nSpawnPlayer;
if ( level.matchRules_damageMultiplier || level.matchRules_vampirism )
level.modifyPlayerDamage = maps\mp\gametypes\_damage::gamemodeModifyPlayerDamage;
level.grnd_fx["smoke"] = loadFx( "smoke/airdrop_flare_mp_effect_now" );
level.grnd_fx["flare"] = loadFx( "smoke/signal_smoke_airdrop" );
createZones();
}
initializeMatchRules()
{
// set common values
setCommonRulesFromMatchRulesData();
// set everything else (private match options, default .cfg file values, and what normally is registered in the 'else' below)
level.matchRules_dropTime = GetMatchRulesData( "grndData", "dropTime" );
level.matchRules_zoneSwitchTime = 60 * GetMatchRulesData( "grndData", "zoneSwitchTime" );
SetDynamicDvar( "scr_grnd_roundswitch", 0 );
registerRoundSwitchDvar( "grnd", 0, 0, 9 );
SetDynamicDvar( "scr_grnd_roundlimit", 1 );
registerRoundLimitDvar( "grnd", 1 );
SetDynamicDvar( "scr_grnd_winlimit", 1 );
registerWinLimitDvar( "grnd", 1 );
SetDynamicDvar( "scr_grnd_halftime", 0 );
registerHalfTimeDvar( "grnd", 0 );
SetDynamicDvar( "scr_grnd_promode", 0 );
}
onPrecacheGameType()
{
precacheShader( "waypoint_captureneutral" );
precacheShader( "waypoint_capture" );
precacheShader( "waypoint_defend" );
precacheModel( "prop_flag_neutral" );
precacheString( &"OBJECTIVES_GRND" );
precacheString( &"OBJECTIVES_GRND_SCORE" );
precacheString( &"OBJECTIVES_GRND_HINT" );
precacheString( &"OBJECTIVES_GRND_CONFIRM" );
precacheString( &"MP_CALLING_AIRDROP" );
precacheString( &"MP_NEXT_DROP_ZONE_IN" );
precacheModel( "weapon_us_smoke_grenade_burnt2" );
}
onStartGameType()
{
setClientNameMode("auto_change");
if ( !isdefined( game["switchedsides"] ) )
game["switchedsides"] = false;
setObjectiveText( "allies", &"OBJECTIVES_GRND" );
setObjectiveText( "axis", &"OBJECTIVES_GRND" );
if ( level.splitscreen )
{
setObjectiveScoreText( "allies", &"OBJECTIVES_GRND" );
setObjectiveScoreText( "axis", &"OBJECTIVES_GRND" );
}
else
{
setObjectiveScoreText( "allies", &"OBJECTIVES_GRND_SCORE" );
setObjectiveScoreText( "axis", &"OBJECTIVES_GRND_SCORE" );
}
setObjectiveHintText( "allies", &"OBJECTIVES_GRND_HINT" );
setObjectiveHintText( "axis", &"OBJECTIVES_GRND_HINT" );
level.spawnMins = ( 0, 0, 0 );
level.spawnMaxs = ( 0, 0, 0 );
maps\mp\gametypes\_spawnlogic::placeSpawnPoints( "mp_sab_spawn_allies_start" );
maps\mp\gametypes\_spawnlogic::placeSpawnPoints( "mp_sab_spawn_axis_start" );
maps\mp\gametypes\_spawnlogic::addSpawnPoints( "allies", "mp_tdm_spawn" );
maps\mp\gametypes\_spawnlogic::addSpawnPoints( "axis", "mp_tdm_spawn" );
level.mapCenter = maps\mp\gametypes\_spawnlogic::findBoxCenter( level.spawnMins, level.spawnMaxs );
setMapCenter( level.mapCenter );
// get the central loction for first DZ using the SAB bomb, before it is removed
centerLocObj = getEnt( "sab_bomb", "targetname" );
level.grnd_centerLoc = centerLocObj.origin;
maps\mp\gametypes\_rank::registerScoreInfo( "zone_kill", 100 );
maps\mp\gametypes\_rank::registerScoreInfo( "zone_tick", 20 );
allowed[0] = level.gameType;
allowed[1] = "tdm";
maps\mp\gametypes\_gameobjects::main(allowed);
level.grnd_timerDisplay = createServerTimer( "objective", 1.4 );
level.grnd_timerDisplay setPoint( "TOPLEFT", "TOPLEFT", 115, 5 );
level.grnd_timerDisplay.label = &"MP_NEXT_DROP_ZONE_IN";
level.grnd_timerDisplay.alpha = 0;
level.grnd_timerDisplay.archived = false;
level.grnd_timerDisplay.hideWhenInMenu = true;
thread hideHudElementOnGameEnd( level.grnd_timerDisplay );
initFirstZone();
}
initFirstZone()
{
level.zonesCycling = false;
// find the closest zone to center
shortestDistance = 999999;
shortestDistanceIndex = 0;
for ( i=0; i<level.grnd_dropZones[level.script].size; i++ )
{
dropZone = level.grnd_dropZones[level.script][i];
distToCenter = distance2d( level.grnd_centerLoc, dropZone );
if ( distToCenter < shortestDistance )
{
shortestDistance = distToCenter;
shortestDistanceIndex = i;
}
}
level.grnd_initialIndex = shortestDistanceIndex;
initilPos = level.grnd_dropZones[level.script][shortestDistanceIndex];
// create marker
level.grnd_zone = spawn( "script_model", initilPos );
level.grnd_zone.origin = initilPos;
level.grnd_zone.angles = ( 90, 0, 0 );
level.grnd_zone setModel( "weapon_us_smoke_grenade_burnt2" );
// spawning
level.favorCloseSpawnEnt = level.grnd_zone;
level.favorCloseSpawnScalar = 5;
// make the rest
level thread initZones();
}
initZones()
{
level.grnd_zones = [];
for ( i=0; i<level.grnd_dropZones[level.script].size; i++ )
{
dropZone = level.grnd_dropZones[level.script][i];
level.grnd_zones[i] = spawn( "script_origin", dropZone );
level.grnd_zones[i].origin = dropZone;
wait( 0.05 );
}
level.grnd_zones[level.grnd_initialIndex] delete();
level.grnd_zones[level.grnd_initialIndex] = undefined;
level.grnd_zones = array_removeUndefined( level.grnd_zones );
}
getSpawnPoint()
{
if ( level.inGracePeriod )
{
spawnPoints = maps\mp\gametypes\_spawnlogic::getSpawnpointArray( "mp_sab_spawn_" + self.pers["team"] + "_start" );
spawnPoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_Random( spawnPoints );
}
else
{
spawnPoints = maps\mp\gametypes\_spawnlogic::getTeamSpawnPoints( self.pers["team"] );
spawnPoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_NearTeam( spawnPoints );
}
return spawnPoint;
}
onSpawnPlayer()
{
// in/out zone indicator
if ( !isDefined( self.inGrindZone ) )
{
level thread setPlayerMessages( self );
// let the first player in activate this
if ( !level.zonesCycling )
{
level thread cycleZones();
level thread locationScoring();
}
}
level notify ( "spawned_player" );
}
setPlayerMessages( player )
{
level endon( "game_ended" );
gameFlagWait( "prematch_done" );
// points
player.inGrindZonePoints = 0;
// hud indicator
player.grndHUDText = player createFontString( "small", 1.6 );
player.grndHUDText setPoint( "TOP LEFT", "TOP LEFT", 115, 22 );
player.grndHUDText.alpha = 1;
player.grndHUDText.hideWhenInMenu = true;
level thread hideHudElementOnGameEnd( player.grndHUDText );
// hud icon
player.grndHeadIcon = level.grnd_zone maps\mp\_entityheadIcons::setHeadIcon( player, "waypoint_captureneutral", (0,0,0), 14, 14, undefined, undefined, undefined, undefined, undefined, false );
// minimap waypoint
player.grndObjId = maps\mp\gametypes\_gameobjects::getNextObjID();
objective_add( player.grndObjId, "invisible", (0,0,0) );
objective_player( player.grndObjId, player getEntityNumber() );
Objective_OnEntity( player.grndObjId, level.grnd_zone );
objective_icon( player.grndObjId, "waypoint_captureneutral" );
objective_state( player.grndObjId, "active" );
if ( distance2D( level.grnd_zone.origin, player.origin ) < GRND_ZONE_TOUCH_RADIUS )
{
player.inGrindZone = true;
player.grndHUDText setText( &"OBJECTIVES_GRND_CONFIRM" );
player.grndHUDText.color = (0.6,1,0.6);
player.grndHeadIcon.alpha = 0;
}
else
{
player.inGrindZone = false;
player.grndHUDText setText( &"OBJECTIVES_GRND_HINT" );
player.grndHUDText.color = (1,0.6,0.6);
player.grndHeadIcon.alpha = 0.85;
}
player.grnd_wasSpectator = false;
if ( player.team == "spectator" )
{
player.inGrindZone = false;
player.inGrindZonePoints = 0;
player.grndHeadIcon.alpha = 0;
player.grndHUDText.alpha = 0;
player.grnd_wasSpectator = true;
}
player thread grndTracking();
}
getNextZone()
{
pos = undefined;
index = undefined;
if ( level.grnd_zones.size > 2 )
{
// get the distance to the current zone from all the remaining zones
// set index and save furthest and closest along the way
closestDistance = 999999;
furthestDistance = 0;
for ( i=0; i<level.grnd_zones.size; i++ )
{
level.grnd_zones[i].index = i;
level.grnd_zones[i].distToZone = distance( level.grnd_zones[i].origin, level.grnd_zone.origin );
if ( level.grnd_zones[i].distToZone > furthestDistance )
furthestDistance = level.grnd_zones[i].distToZone;
else if ( level.grnd_zones[i].distToZone < closestDistance )
closestDistance = level.grnd_zones[i].distToZone;
}
// try to get a grouping of far zones to randomly choose from
farZones = [];
closeZones = [];
halfDistance = int( ( closestDistance + furthestDistance ) / 2 );
for ( i=0; i<level.grnd_zones.size; i++ )
{
if ( level.grnd_zones[i].distToZone >= halfDistance )
farZones[farZones.size] = level.grnd_zones[i];
else
closeZones[closeZones.size] = level.grnd_zones[i];
}
zone = undefined;
if ( farZones.size > 1 )
zone = farZones[ randomIntRange( 0, farZones.size ) ];
else
zone = farZones[0];
index = zone.index;
}
else if ( level.grnd_zones.size == 2 )
{
distanceA = distance( level.grnd_zones[0].origin, level.grnd_zone.origin );
distanceB = distance( level.grnd_zones[1].origin, level.grnd_zone.origin );
if ( distanceA > distanceB )
index = 0;
else
index = 1;
}
else if ( level.grnd_zones.size == 1 )
{
index = 0;
}
if ( isDefined( index ) )
{
pos = level.grnd_zones[index].origin;
level.grnd_zones[index] delete();
level.grnd_zones[index] = undefined;
level.grnd_zones = array_removeUndefined( level.grnd_zones );
}
else
{
// start all over
pos = level.grnd_dropZones[level.script][level.grnd_initialIndex];
level thread initZones();
}
return pos;
}
cycleZones()
{
level endon( "game_ended" );
gameFlagWait( "prematch_done" );
while( true )
{
initialScores["axis"] = game["teamScores"]["axis"];
initialScores["allies"] = game["teamScores"]["allies"];
// move zone
pos = undefined;
if ( !level.zonesCycling )
{
level.zonesCycling = true;
pos = level.grnd_zone.origin;
}
else
{
pos = getNextZone();
StopFxOnTag( level.grnd_fx["smoke"], level.grnd_zone, "tag_fx" );
wait( 0.05 );
}
traceStart = pos;
traceEnd = pos + (0,0,-1000);
trace = bulletTrace( traceStart, traceEnd, false, undefined );
level.grnd_zone.origin = trace["position"]+(0,0,1);
// smoke
wait( 0.05 );
PlayFxOnTag( level.grnd_fx["smoke"], level.grnd_zone, "tag_fx" );
// reset drops
if ( level.matchRules_dropTime )
level thread randomDrops();
// wait
level.grnd_timerDisplay.label = &"MP_NEXT_DROP_ZONE_IN";
level.grnd_timerDisplay setTimer( level.matchRules_zoneSwitchTime );
level.grnd_timerDisplay.alpha = 1;
maps\mp\gametypes\_hostmigration::waitLongDurationWithHostMigrationPause( level.matchRules_zoneSwitchTime );
level.grnd_timerDisplay.alpha = 0;
// audio cue for progress
if ( game["teamScores"]["axis"] - initialScores["axis"] > game["teamScores"]["allies"] - initialScores["allies"] )
{
playSoundOnPlayers( "mp_obj_captured", "axis" );
playSoundOnPlayers( "mp_enemy_obj_captured", "allies" );
}
else if ( game["teamScores"]["allies"] - initialScores["allies"] > game["teamScores"]["axis"] - initialScores["axis"] )
{
playSoundOnPlayers( "mp_obj_captured", "allies" );
playSoundOnPlayers( "mp_enemy_obj_captured", "axis" );
}
}
}
grndTracking()
{
self endon( "disconnect" );
level endon( "game_ended" );
while( true )
{
if ( !self.grnd_wasSpectator && self.team == "spectator" )
{
self.inGrindZone = false;
self.inGrindZonePoints = 0;
self.grndHeadIcon.alpha = 0;
self.grndHUDText.alpha = 0;
self.grnd_wasSpectator = true;
}
else if ( self.team != "spectator" )
{
if ( ( self.grnd_wasSpectator || !self.inGrindZone ) && distance2D( level.grnd_zone.origin, self.origin ) < GRND_ZONE_TOUCH_RADIUS )
{
self.inGrindZone = true;
self.inGrindZonePoints = 0;
self.grndHUDText setText( &"OBJECTIVES_GRND_CONFIRM" );
self.grndHUDText.color = (0.6,1,0.6);
self.grndHUDText.alpha = 1;
self.grndHeadIcon.alpha = 0;
}
else if ( ( self.grnd_wasSpectator || self.inGrindZone ) && distance2D( level.grnd_zone.origin, self.origin ) >= GRND_ZONE_TOUCH_RADIUS )
{
self.inGrindZone = false;
self.inGrindZonePoints = 0;
self.grndHUDText setText( &"OBJECTIVES_GRND_HINT" );
self.grndHUDText.color = (1,0.6,0.6);
self.grndHUDText.alpha = 1;
self.grndHeadIcon.alpha = 0.85;
}
self.grnd_wasSpectator = false;
}
wait( 0.05 );
}
}
locationScoring()
{
level endon( "game_ended" );
gameFlagWait( "prematch_done" );
score = maps\mp\gametypes\_rank::getScoreInfoValue( "zone_tick" );
assert( isDefined( score ) );
while( true )
{
numPlayers["axis"] = 0;
numPlayers["allies"] = 0;
// score
foreach( player in level.players )
{
if ( isDefined( player.inGrindZone ) && isAlive( player ) && distance2D( level.grnd_zone.origin, player.origin ) < GRND_ZONE_TOUCH_RADIUS )
{
numPlayers[player.pers["team"]]++;
player.inGrindZonePoints += score;
}
}
if ( numPlayers["axis"] )
maps\mp\gametypes\_gamescore::giveTeamScoreForObjective( "axis", score * numPlayers["axis"] );
if ( numPlayers["allies"] )
maps\mp\gametypes\_gamescore::giveTeamScoreForObjective( "allies", score * numPlayers["allies"] );
// waypoints and compasspings
if ( numPlayers["axis"] == numPlayers["allies"] )
{
foreach( player in level.players )
{
if ( isDefined( player.inGrindZone ) )
{
player.grndHeadIcon setShader( "waypoint_captureneutral", 14, 14 );
player.grndHeadIcon setWaypoint( false, false, false, false );
objective_icon( player.grndObjId, "waypoint_captureneutral" );
}
}
}
else
{
foreach( player in level.players )
{
if ( isDefined( player.inGrindZone ) )
{
if ( numPlayers[player.pers["team"]] > numPlayers[level.otherTeam[player.pers["team"]]] )
{
player.grndHeadIcon setShader( "waypoint_defend", 14, 14 );
player.grndHeadIcon setWaypoint( false, false, false, false );
objective_icon( player.grndObjId, "waypoint_defend" );
}
else
{
player.grndHeadIcon setShader( "waypoint_capture", 14, 14 );
player.grndHeadIcon setWaypoint( false, false, false, false );
objective_icon( player.grndObjId, "waypoint_capture" );
}
}
}
}
// wait
maps\mp\gametypes\_hostmigration::waitLongDurationWithHostMigrationPause( 1.0 );
}
}
randomDrops()
{
level endon( "game_ended" );
level notify( "reset_grnd_drops" );
level endon( "reset_grnd_drops" );
// try for no repeats per zone
level.grnd_previousCrateTypes = [];
while( true )
{
owner = getBestPlayer();
numIncomingVehicles = 1;
if( isDefined( owner ) &&
currentActiveVehicleCount() < maxVehiclesAllowed() &&
level.fauxVehicleCount + numIncomingVehicles < maxVehiclesAllowed() &&
level.numDropCrates < 8 )
{
owner thread maps\mp\gametypes\_rank::xpEventPopup( &"SPLASHES_EARNED_CAREPACKAGE" );
thread teamPlayerCardSplash( "callout_earned_carepackage", owner );
owner thread leaderDialog( level.otherTeam[ owner.team ] + "_enemy_airdrop_assault_inbound", level.otherTeam[ owner.team ] );
owner thread leaderDialog( owner.team + "_friendly_airdrop_assault_inbound", owner.team );
playSoundOnPlayers( "mp_war_objective_taken", owner.team );
playSoundOnPlayers( "mp_war_objective_lost", level.otherTeam[owner.team] );
position = level.grnd_zone.origin + ( randomIntRange( (-1*GRND_ZONE_DROP_RADIUS), GRND_ZONE_DROP_RADIUS ), randomIntRange( (-1*GRND_ZONE_DROP_RADIUS), GRND_ZONE_DROP_RADIUS ), 0 );
crateType = getDropZoneCrateType();
if ( isSubStr( toLower( crateType ), "juggernaut" ) )
{
level thread maps\mp\killstreaks\_airdrop::doC130FlyBy( owner, position, randomFloat( 360 ), crateType );
}
else if ( crateType == "mega" )
{
level thread maps\mp\killstreaks\_airdrop::doMegaC130FlyBy( owner, position, randomFloat( 360 ), "airdrop_grnd", -360 );
}
else
{
level thread maps\mp\killstreaks\_airdrop::doFlyBy( owner, position, randomFloat( 360 ), "airdrop_grnd", 0, crateType );
}
waitTime = level.matchRules_dropTime;
}
else
waitTime = 0.5;
maps\mp\gametypes\_hostmigration::waitLongDurationWithHostMigrationPause( waitTime );
}
}
getBestPlayer()
{
bestPlayer = undefined;
bestPlayerPoints = 0;
// find the player with the currently highest accumulated points in the zone
foreach ( player in level.players )
{
if ( isAlive( player ) )
{
if ( distance2D( level.grnd_zone.origin, player.origin ) < GRND_ZONE_TOUCH_RADIUS && player.inGrindZonePoints > bestPlayerPoints )
{
bestPlayer = player;
bestPlayerPoints = player.inGrindZonePoints;
}
}
}
// may return undefined
return bestPlayer;
}
getDropZoneCrateType()
{
crateType = undefined;
if ( !isDefined( level.grnd_previousCrateTypes["mega"] ) && level.numDropCrates == 0 && randomIntRange( 0, 100 ) < 5 )
{
crateType = "mega";
}
else
{
if ( level.grnd_previousCrateTypes.size )
{
maxTries = 200;
while( maxTries )
{
crateType = maps\mp\killstreaks\_airdrop::getRandomCrateType( "airdrop_grnd" );
if ( isDefined( level.grnd_previousCrateTypes[crateType] ) )
crateType = undefined;
else
break;
maxTries--;
}
}
if ( !isDefined( crateType ) )
crateType = maps\mp\killstreaks\_airdrop::getRandomCrateType( "airdrop_grnd" );
}
// track it
level.grnd_previousCrateTypes[crateType] = 1;
if ( level.grnd_previousCrateTypes.size == 15 )
level.grnd_previousCrateTypes = [];
return crateType;
}
hideHudElementOnGameEnd( hudElement )
{
level waittill("game_ended");
hudElement.alpha = 0;
}
createZones()
{
level.grnd_dropZones = [];
// future way
dropZones = getEntArray( "grnd_dropZone", "targetname" );
if ( isDefined( dropZones ) && dropZones.size )
{
i=0;
foreach ( dropZone in dropZones )
{
level.grnd_dropZones[level.script][i] = dropZone.origin;
i++;
}
}
else
{
// current way
level.grnd_dropZones["mp_seatown"][0] = (-1226, -1399, 204);
level.grnd_dropZones["mp_seatown"][1] = (1048, 886, 22
;
level.grnd_dropZones["mp_seatown"][2] = (-1982, 1494, 229);
level.grnd_dropZones["mp_seatown"][3] = (-2297, -855, 210);
level.grnd_dropZones["mp_seatown"][4] = (-2261, -334, 24
;
level.grnd_dropZones["mp_seatown"][5] = (-2048, 512, 24
;
level.grnd_dropZones["mp_seatown"][6] = (-1439, 1065, 72);
level.grnd_dropZones["mp_seatown"][7] = (-410, 982, 127);
level.grnd_dropZones["mp_seatown"][8] = (-666, -217, 226);
level.grnd_dropZones["mp_seatown"][9] = (-523, -875, 260);
level.grnd_dropZones["mp_seatown"][10] = (-345, -1449, 254);
level.grnd_dropZones["mp_seatown"][11] = (1167, -533, 294);
level.grnd_dropZones["mp_seatown"][12] = (367, 991, 179);
level.grnd_dropZones["mp_seatown"][13] = (1106, 219, 292);
level.grnd_dropZones["mp_dome"][0] = (97, 898, -240);
level.grnd_dropZones["mp_dome"][1] = (-226, 1464, -231);
level.grnd_dropZones["mp_dome"][2] = (-603, 194, -35
;
level.grnd_dropZones["mp_dome"][3] = (814, -406, -335);
level.grnd_dropZones["mp_dome"][4] = (5, 1975, -231);
level.grnd_dropZones["mp_dome"][5] = (-673, 1100, -284);
level.grnd_dropZones["mp_dome"][6] = (669, 1028, -255);
level.grnd_dropZones["mp_dome"][7] = (1231, 807, -267);
level.grnd_dropZones["mp_dome"][8] = (709, 210, -342);
level.grnd_dropZones["mp_dome"][9] = (1223, 10, -336);
level.grnd_dropZones["mp_dome"][10] = (-222, 418, -333);
level.grnd_dropZones["mp_dome"][11] = (501, -183, -330);
level.grnd_dropZones["mp_plaza2"][0] = (221, 440, 754);
level.grnd_dropZones["mp_plaza2"][1] = (155, 1763, 66
;
level.grnd_dropZones["mp_plaza2"][2] = (-430, 1871, 691);
level.grnd_dropZones["mp_plaza2"][3] = (-1190, 1759, 66
;
level.grnd_dropZones["mp_plaza2"][4] = (-1273, 1279, 829);
level.grnd_dropZones["mp_plaza2"][5] = (-593, 1274, 676);
level.grnd_dropZones["mp_plaza2"][6] = (-251, 1006, 722);
level.grnd_dropZones["mp_plaza2"][7] = (80, 1343, 676);
level.grnd_dropZones["mp_plaza2"][8] = (397, -99, 70
;
level.grnd_dropZones["mp_plaza2"][9] = (-1109, 92, 741);
level.grnd_dropZones["mp_plaza2"][10] = (-280, -195, 700);
level.grnd_dropZones["mp_plaza2"][11] = (28, -1600, 66
;
level.grnd_dropZones["mp_plaza2"][12] = (764, -1752, 669);
level.grnd_dropZones["mp_mogadishu"][0] = (1448, 1945, 39);
level.grnd_dropZones["mp_mogadishu"][1] = (1499, -1193, 15);
level.grnd_dropZones["mp_mogadishu"][2] = (791, -880, 16);
level.grnd_dropZones["mp_mogadishu"][3] = (38, -1007, 16);
level.grnd_dropZones["mp_mogadishu"][4] = (-691, -260, 22);
level.grnd_dropZones["mp_mogadishu"][5] = (2, 52, 2);
level.grnd_dropZones["mp_mogadishu"][6] = (664, 69, 12);
level.grnd_dropZones["mp_mogadishu"][7] = (1676, 251, -1);
level.grnd_dropZones["mp_mogadishu"][8] = (2314, 1860, 63);
level.grnd_dropZones["mp_mogadishu"][9] = (73, 858, 3);
level.grnd_dropZones["mp_mogadishu"][10] = (710, 837, 16);
level.grnd_dropZones["mp_mogadishu"][11] = (-549, 829, 2);
level.grnd_dropZones["mp_mogadishu"][12] = (34, 1850, 84);
level.grnd_dropZones["mp_mogadishu"][13] = (-778, 2614, 157);
level.grnd_dropZones["mp_mogadishu"][14] = (-204, 3206, 152);
level.grnd_dropZones["mp_mogadishu"][15] = (752, 3189, 14
;
level.grnd_dropZones["mp_mogadishu"][16] = (692, 2354, 95);
level.grnd_dropZones["mp_paris"][0] = (-931, -921, 110);
level.grnd_dropZones["mp_paris"][1] = (1597, 1768, 47);
level.grnd_dropZones["mp_paris"][2] = (716, 1809, 33);
level.grnd_dropZones["mp_paris"][3] = (258, 2074, 36);
level.grnd_dropZones["mp_paris"][4] = (459, 1067, 37);
level.grnd_dropZones["mp_paris"][5] = (852, 1350, 11
;
level.grnd_dropZones["mp_paris"][6] = (1601, 897, 45);
level.grnd_dropZones["mp_paris"][7] = (1286, 420, 41);
level.grnd_dropZones["mp_paris"][8] = (1613, 181, 172);
level.grnd_dropZones["mp_paris"][9] = (466, -752, 67);
level.grnd_dropZones["mp_paris"][10] = (994, -625, 50);
level.grnd_dropZones["mp_paris"][11] = (-211, -60, 63);
level.grnd_dropZones["mp_paris"][12] = (-742, 177, 133);
level.grnd_dropZones["mp_paris"][13] = (-1532, 100, 250);
level.grnd_dropZones["mp_paris"][14] = (-343, 1922, 121);
level.grnd_dropZones["mp_paris"][15] = (-1127, 1555, 284);
level.grnd_dropZones["mp_paris"][16] = (-2025, 1327, 316);
level.grnd_dropZones["mp_paris"][17] = (-1039, 841, 187);
level.grnd_dropZones["mp_exchange"][0] = (-614, 1286, 113);
level.grnd_dropZones["mp_exchange"][1] = (182, 1155, 14
;
level.grnd_dropZones["mp_exchange"][2] = (1018, 1254, 120);
level.grnd_dropZones["mp_exchange"][3] = (2182, 1322, 145);
level.grnd_dropZones["mp_exchange"][4] = (655, 815, 13);
level.grnd_dropZones["mp_exchange"][5] = (761, -312, -1
;
level.grnd_dropZones["mp_exchange"][6] = (761, -771, 112);
level.grnd_dropZones["mp_exchange"][7] = (635, -1450, 110);
level.grnd_dropZones["mp_exchange"][8] = (152, -1538, 96);
level.grnd_dropZones["mp_exchange"][9] = (303, -824, 8
;
level.grnd_dropZones["mp_exchange"][10] = (-953, -768, 45);
level.grnd_dropZones["mp_exchange"][11] = (2392, 1305, 144);
level.grnd_dropZones["mp_exchange"][12] = (1634, 1329, 151);
level.grnd_dropZones["mp_exchange"][13] = (1315, 743, 159);
level.grnd_dropZones["mp_bootleg"][0] = (-1432, 1404,
;
level.grnd_dropZones["mp_bootleg"][1] = (-1017, 1787, -39);
level.grnd_dropZones["mp_bootleg"][2] = (-590, 1514, -43);
level.grnd_dropZones["mp_bootleg"][3] = (-588, 614, -12);
level.grnd_dropZones["mp_bootleg"][4] = (-1732, 84, 11);
level.grnd_dropZones["mp_bootleg"][5] = (-1809, -302, 140);
level.grnd_dropZones["mp_bootleg"][6] = (-1649, -1147, 92);
level.grnd_dropZones["mp_bootleg"][7] = (-884, -1035, -4);
level.grnd_dropZones["mp_bootleg"][8] = (-719, -1673, 60);
level.grnd_dropZones["mp_bootleg"][9] = (-335, -2111, 60);
level.grnd_dropZones["mp_bootleg"][10] = (208, -1955, 6
;
level.grnd_dropZones["mp_bootleg"][11] = (-198, -1726, 60);
level.grnd_dropZones["mp_bootleg"][12] = (100, -1101, -9);
level.grnd_dropZones["mp_bootleg"][13] = (-427, -100, -
;
level.grnd_dropZones["mp_bootleg"][14] = (949, -1132, -10);
level.grnd_dropZones["mp_bootleg"][15] = (884, 1182, -2
;
level.grnd_dropZones["mp_bootleg"][16] = (242, 1194, -45);
level.grnd_dropZones["mp_carbon"][0] = (-3330, -3392, 3630);
level.grnd_dropZones["mp_carbon"][1] = (-3635, -3735, 3630);
level.grnd_dropZones["mp_carbon"][2] = (-3625, -4189, 3633);
level.grnd_dropZones["mp_carbon"][3] = (-2992, -4339, 3627);
level.grnd_dropZones["mp_carbon"][4] = (-2925, -4999, 3673);
level.grnd_dropZones["mp_carbon"][5] = (-2573, -4771, 3784);
level.grnd_dropZones["mp_carbon"][6] = (-1705, -4643, 3813);
level.grnd_dropZones["mp_carbon"][7] = (-1799, -3957, 3813);
level.grnd_dropZones["mp_carbon"][8] = (-2141, -3647, 3815);
level.grnd_dropZones["mp_carbon"][9] = (-3212, -2879, 3807);
level.grnd_dropZones["mp_carbon"][10] = (-1623, -3339, 380
;
level.grnd_dropZones["mp_carbon"][11] = (-1223, -4234, 3834);
level.grnd_dropZones["mp_carbon"][12] = (-896, -4888, 3944);
level.grnd_dropZones["mp_carbon"][13] = (-228, -4535, 3975);
level.grnd_dropZones["mp_carbon"][14] = (-257, -3865, 3956);
level.grnd_dropZones["mp_carbon"][15] = (-215, -3260, 3967);
level.grnd_dropZones["mp_carbon"][16] = (-535, -3798, 3966);
level.grnd_dropZones["mp_hardhat"][0] = (2035, -229, 246);
level.grnd_dropZones["mp_hardhat"][1] = (1959, -772, 352);
level.grnd_dropZones["mp_hardhat"][2] = (1883, -1384, 351);
level.grnd_dropZones["mp_hardhat"][3] = (848, -1520, 334);
level.grnd_dropZones["mp_hardhat"][4] = (1326, -1380, 342);
level.grnd_dropZones["mp_hardhat"][5] = (-338, -1273, 34
;
level.grnd_dropZones["mp_hardhat"][6] = (-821, -884, 34
;
level.grnd_dropZones["mp_hardhat"][7] = (-920, -290, 230);
level.grnd_dropZones["mp_hardhat"][8] = (-463, -250, 333);
level.grnd_dropZones["mp_hardhat"][9] = (-741, 208, 245);
level.grnd_dropZones["mp_hardhat"][10] = (-201, 806, 437);
level.grnd_dropZones["mp_hardhat"][11] = (224, 980, 436);
level.grnd_dropZones["mp_hardhat"][12] = (1125, 656, 255);
level.grnd_dropZones["mp_hardhat"][13] = (1531, 1241, 364);
level.grnd_dropZones["mp_hardhat"][14] = (1522, 542, 244);
level.grnd_dropZones["mp_alpha"][0] = (-1979, 1653, 14
;
level.grnd_dropZones["mp_alpha"][1] = (-1392, 1623, 60);
level.grnd_dropZones["mp_alpha"][2] = (-1697, 1205, 52);
level.grnd_dropZones["mp_alpha"][3] = (-1671, 692, 54);
level.grnd_dropZones["mp_alpha"][4] = (-572, -272, 55);
level.grnd_dropZones["mp_alpha"][5] = (634, -345, 52);
level.grnd_dropZones["mp_alpha"][6] = (391, 121, 60);
level.grnd_dropZones["mp_alpha"][7] = (291, 1271, 60);
level.grnd_dropZones["mp_alpha"][8] = (-459, 868, 52);
level.grnd_dropZones["mp_alpha"][9] = (-353, 1334, 52);
level.grnd_dropZones["mp_alpha"][10] = (-37, 1637, 52);
level.grnd_dropZones["mp_alpha"][11] = (-5, 2226, 52);
level.grnd_dropZones["mp_alpha"][12] = (-407, 2198, 196);
level.grnd_dropZones["mp_village"][0] = (647, 1891, 332);
level.grnd_dropZones["mp_village"][1] = (-26, 1749, 334);
level.grnd_dropZones["mp_village"][2] = (104, 1292, 323);
level.grnd_dropZones["mp_village"][3] = (-1064, 1552, 322);
level.grnd_dropZones["mp_village"][4] = (-599, 886, 37
;
level.grnd_dropZones["mp_village"][5] = (-1038, 569, 317);
level.grnd_dropZones["mp_village"][6] = (-1899, 1217, 336);
level.grnd_dropZones["mp_village"][7] = (-1540, 289, 304);
level.grnd_dropZones["mp_village"][8] = (-454, -277, 270);
level.grnd_dropZones["mp_village"][9] = (-1734, -790, 365);
level.grnd_dropZones["mp_village"][10] = (-1418, -1371, 431);
level.grnd_dropZones["mp_village"][11] = (-928, -749, 417);
level.grnd_dropZones["mp_village"][12] = (-861, -2105, 40
;
level.grnd_dropZones["mp_village"][13] = (-191, -1550, 400);
level.grnd_dropZones["mp_village"][14] = (357, -678, 245);
level.grnd_dropZones["mp_village"][15] = (-216, 295, 223);
level.grnd_dropZones["mp_village"][16] = (162, -199, 229);
level.grnd_dropZones["mp_village"][17] = (179, -3052, 447);
level.grnd_dropZones["mp_village"][18] = (510, -1790, 375);
level.grnd_dropZones["mp_village"][19] = (1089, -615, 39
;
level.grnd_dropZones["mp_village"][20] = (1631, 394, 297);
level.grnd_dropZones["mp_village"][21] = (1007, 1385, 337);
level.grnd_dropZones["mp_village"][22] = (992, 248, 330);
level.grnd_dropZones["mp_village"][23] = (551, 732, 386);
level.grnd_dropZones["mp_lambeth"][0] = (-293, -1286, -180);
level.grnd_dropZones["mp_lambeth"][1] = (-938, -785, -130);
level.grnd_dropZones["mp_lambeth"][2] = (-375, -250, -187);
level.grnd_dropZones["mp_lambeth"][3] = (-355, 409, -196);
level.grnd_dropZones["mp_lambeth"][4] = (161, -5, -181);
level.grnd_dropZones["mp_lambeth"][5] = (682, -407, -197);
level.grnd_dropZones["mp_lambeth"][6] = (694, 263, -196);
level.grnd_dropZones["mp_lambeth"][7] = (690, 1158, -243);
level.grnd_dropZones["mp_lambeth"][8] = (1181, 801, -67);
level.grnd_dropZones["mp_lambeth"][9] = (1281, 1248, -257);
level.grnd_dropZones["mp_lambeth"][10] = (2057, 757, -249);
level.grnd_dropZones["mp_lambeth"][11] = (1470, -1040, -109);
level.grnd_dropZones["mp_lambeth"][12] = (1761, -258, -210);
level.grnd_dropZones["mp_lambeth"][13] = (2800, -652, -186);
level.grnd_dropZones["mp_lambeth"][14] = (2785, 445, -244);
level.grnd_dropZones["mp_lambeth"][15] = (2751, 1090, -263);
level.grnd_dropZones["mp_lambeth"][16] = (1535, 1980, -214);
level.grnd_dropZones["mp_lambeth"][17] = (1262, 2602, -213);
level.grnd_dropZones["mp_lambeth"][18] = (419, 2218, -183);
level.grnd_dropZones["mp_lambeth"][19] = (170, 1631, -182);
level.grnd_dropZones["mp_lambeth"][20] = (-606, 1549, -201);
level.grnd_dropZones["mp_lambeth"][21] = (-1199, 1030, -196);
level.grnd_dropZones["mp_radar"][0] = (-3482, -498, 1222);
level.grnd_dropZones["mp_radar"][1] = (-4263, -124, 1229);
level.grnd_dropZones["mp_radar"][2] = (-4006, 827, 123
;
level.grnd_dropZones["mp_radar"][3] = (-3375, 342, 1222);
level.grnd_dropZones["mp_radar"][4] = (-4623, 531, 129
;
level.grnd_dropZones["mp_radar"][5] = (-5157, 877, 1200);
level.grnd_dropZones["mp_radar"][6] = (-5950, 1071, 1305);
level.grnd_dropZones["mp_radar"][7] = (-6509, 1660, 1299);
level.grnd_dropZones["mp_radar"][8] = (-7013, 2955, 1359);
level.grnd_dropZones["mp_radar"][9] = (-6333, 3473, 1421);
level.grnd_dropZones["mp_radar"][10] = (-5675, 2923, 138
;
level.grnd_dropZones["mp_radar"][11] = (-7119, 4357, 1380);
level.grnd_dropZones["mp_radar"][12] = (-5487, 4077, 1356);
level.grnd_dropZones["mp_radar"][13] = (-5736, 2960, 1407);
level.grnd_dropZones["mp_radar"][14] = (-4908, 3281, 1225);
level.grnd_dropZones["mp_radar"][15] = (-4421, 4071, 126
;
level.grnd_dropZones["mp_radar"][16] = (-4979, 1816, 1205);
level.grnd_dropZones["mp_radar"][17] = (-4874, 2306, 1223);
level.grnd_dropZones["mp_interchange"][0] = (2465, -402, 149);
level.grnd_dropZones["mp_interchange"][1] = (2128, 199, 6
;
level.grnd_dropZones["mp_interchange"][2] = (1280, 1263, 126);
level.grnd_dropZones["mp_interchange"][3] = (762, 1747, 114);
level.grnd_dropZones["mp_interchange"][4] = (-9, 1836, 3
;
level.grnd_dropZones["mp_interchange"][5] = (-284, 1171, 159);
level.grnd_dropZones["mp_interchange"][6] = (-1028, 944, 31);
level.grnd_dropZones["mp_interchange"][7] = (-256, 264, 126);
level.grnd_dropZones["mp_interchange"][8] = (462, -463, 15
;
level.grnd_dropZones["mp_interchange"][9] = (1029, -1045, 179);
level.grnd_dropZones["mp_interchange"][10] = (1760, -1434, 142);
level.grnd_dropZones["mp_interchange"][11] = (1538, -361, 142);
level.grnd_dropZones["mp_interchange"][12] = (1150, -2977, 171);
level.grnd_dropZones["mp_interchange"][13] = (371, -2883, 209);
level.grnd_dropZones["mp_interchange"][14] = (399, -2149, 220);
level.grnd_dropZones["mp_underground"][0] = (-602, 3072, -6
;
level.grnd_dropZones["mp_underground"][1] = (-285, 2551, -215);
level.grnd_dropZones["mp_underground"][2] = (574, 2656, -40);
level.grnd_dropZones["mp_underground"][3] = (-627, 1579, -196);
level.grnd_dropZones["mp_underground"][4] = (28, 1556, -196);
level.grnd_dropZones["mp_underground"][5] = (727, 1615, -196);
level.grnd_dropZones["mp_underground"][6] = (-1491, 1268, -196);
level.grnd_dropZones["mp_underground"][7] = (-1370, 1757, -196);
level.grnd_dropZones["mp_underground"][8] = (-1259, 599, -156);
level.grnd_dropZones["mp_underground"][9] = (-959, -26, 60);
level.grnd_dropZones["mp_underground"][10] = (-303, -562, 60);
level.grnd_dropZones["mp_underground"][11] = (193, -922, 60);
level.grnd_dropZones["mp_underground"][12] = (305, 817, -6
;
level.grnd_dropZones["mp_underground"][13] = (-276, 370, -6
;
level.grnd_dropZones["mp_bravo"][0] = (-1359, 608, 975);
level.grnd_dropZones["mp_bravo"][1] = (-1686, 313, 991);
level.grnd_dropZones["mp_bravo"][2] = (-1228, 41, 976);
level.grnd_dropZones["mp_bravo"][3] = (-732, -715, 1032);
level.grnd_dropZones["mp_bravo"][4] = (31, -771, 103
;
level.grnd_dropZones["mp_bravo"][5] = (986, -833, 1116);
level.grnd_dropZones["mp_bravo"][6] = (1800, -577, 1229);
level.grnd_dropZones["mp_bravo"][7] = (1588, -55, 1181);
level.grnd_dropZones["mp_bravo"][8] = (619, 916, 1175);
level.grnd_dropZones["mp_bravo"][9] = (-129, 1310, 122
;
level.grnd_dropZones["mp_bravo"][10] = (-726, 1272, 126
;
level.grnd_dropZones["mp_bravo"][11] = (-741, 752, 1053);
level.grnd_dropZones["mp_bravo"][12] = (6, -136, 1282);
}
}
airdrop_grnd,uav, 25,
airdrop_grnd,counter_uav, 25,
airdrop_grnd,deployable_vest, 21,
airdrop_grnd,sentry, 21,
airdrop_grnd,remote_mg_turret, 17,
airdrop_grnd,ims, 17,
airdrop_grnd,triple_uav, 13,
airdrop_grnd,predator_missile, 13,
airdrop_grnd,airdrop_trap, 11,
airdrop_grnd,precision_airstrike, 9,
airdrop_grnd,stealth_airstrike, 9,
airdrop_grnd,helicopter, 9,
airdrop_grnd,remote_tank, 7,
airdrop_grnd,sam_turret, 7,
airdrop_grnd,remote_uav, 7,
airdrop_grnd,littlebird_support, 4,
airdrop_grnd,airdrop_juggernaut_recon, 4,
airdrop_grnd,littlebird_flock, 2,
airdrop_grnd,helicopter_flares, 2,
airdrop_grnd,remote_mortar, 2,
airdrop_grnd,ac130, 2,
airdrop_grnd,airdrop_juggernaut, 1,
airdrop_grnd,osprey_gunner, 1,
airdrop_grnd,emp, 1,
#include common_scripts\utility;
#include maps\mp\_utility;
#include maps\mp\gametypes\_hud_util;
/*
Drop Zone
Objective: Score points for your team over time by holding the drop zone.
Periodic carepackage awarded to player who's been in drop zone the longest.
Map ends: When one team reaches the score limit, or time limit is reached
Respawning: No wait / Near teammates / Near drop zone
Level requirementss
------------------
Start Spawnpoints:
classname mp_sab_spawn_allies_start, mp_sab_spawn_axis_start
Spawnpoints:
classname mp_tdm_spawn
All players spawn from these. The spawnpoint chosen is dependent on the current locations of drop zone, teammates, and enemies
at the time of spawn. Players generally spawn behind their teammates relative to the direction of enemies.
Spectator Spawnpoints:
classname mp_global_intermission
Spectators spawn from these and intermission is viewed from these positions.
Atleast one is required, any more and they are randomly chosen between.
*/
GRND_ZONE_TOUCH_RADIUS = 300;
GRND_ZONE_DROP_RADIUS = 72;
main()
{
if(getdvar("mapname") == "mp_background")
return;
maps\mp\gametypes\_globallogic::init();
maps\mp\gametypes\_callbacksetup::SetupCallbacks();
maps\mp\gametypes\_globallogic::SetupCallbacks();
if ( isUsingMatchRulesData() )
{
level.initializeMatchRules = ::initializeMatchRules;
[[level.initializeMatchRules]]();
level thread reInitializeMatchRulesOnMigration();
}
else
{
registerRoundSwitchDvar( level.gameType, 0, 0, 9 );
registerTimeLimitDvar( level.gameType, 10 );
registerScoreLimitDvar( level.gameType, 20000 );
registerRoundLimitDvar( level.gameType, 1 );
registerWinLimitDvar( level.gameType, 1 );
registerNumLivesDvar( level.gameType, 0 );
registerHalfTimeDvar( level.gameType, 0 );
level.matchRules_dropTime = 30;
level.matchRules_zoneSwitchTime = 120;
level.matchRules_damageMultiplier = 0;
level.matchRules_vampirism = 0;
}
level.teamBased = true;
level.onPrecacheGameType = :
nPrecacheGameType;
level.onStartGameType = :
nStartGameType;
level.getSpawnPoint = ::getSpawnPoint;
level.onSpawnPlayer = :
nSpawnPlayer;
if ( level.matchRules_damageMultiplier || level.matchRules_vampirism )
level.modifyPlayerDamage = maps\mp\gametypes\_damage::gamemodeModifyPlayerDamage;
level.grnd_fx["smoke"] = loadFx( "smoke/airdrop_flare_mp_effect_now" );
level.grnd_fx["flare"] = loadFx( "smoke/signal_smoke_airdrop" );
createZones();
}
initializeMatchRules()
{
// set common values
setCommonRulesFromMatchRulesData();
// set everything else (private match options, default .cfg file values, and what normally is registered in the 'else' below)
level.matchRules_dropTime = GetMatchRulesData( "grndData", "dropTime" );
level.matchRules_zoneSwitchTime = 60 * GetMatchRulesData( "grndData", "zoneSwitchTime" );
SetDynamicDvar( "scr_grnd_roundswitch", 0 );
registerRoundSwitchDvar( "grnd", 0, 0, 9 );
SetDynamicDvar( "scr_grnd_roundlimit", 1 );
registerRoundLimitDvar( "grnd", 1 );
SetDynamicDvar( "scr_grnd_winlimit", 1 );
registerWinLimitDvar( "grnd", 1 );
SetDynamicDvar( "scr_grnd_halftime", 0 );
registerHalfTimeDvar( "grnd", 0 );
SetDynamicDvar( "scr_grnd_promode", 0 );
}
onPrecacheGameType()
{
precacheShader( "waypoint_captureneutral" );
precacheShader( "waypoint_capture" );
precacheShader( "waypoint_defend" );
precacheModel( "prop_flag_neutral" );
precacheString( &"OBJECTIVES_GRND" );
precacheString( &"OBJECTIVES_GRND_SCORE" );
precacheString( &"OBJECTIVES_GRND_HINT" );
precacheString( &"OBJECTIVES_GRND_CONFIRM" );
precacheString( &"MP_CALLING_AIRDROP" );
precacheString( &"MP_NEXT_DROP_ZONE_IN" );
precacheModel( "weapon_us_smoke_grenade_burnt2" );
}
onStartGameType()
{
setClientNameMode("auto_change");
if ( !isdefined( game["switchedsides"] ) )
game["switchedsides"] = false;
setObjectiveText( "allies", &"OBJECTIVES_GRND" );
setObjectiveText( "axis", &"OBJECTIVES_GRND" );
if ( level.splitscreen )
{
setObjectiveScoreText( "allies", &"OBJECTIVES_GRND" );
setObjectiveScoreText( "axis", &"OBJECTIVES_GRND" );
}
else
{
setObjectiveScoreText( "allies", &"OBJECTIVES_GRND_SCORE" );
setObjectiveScoreText( "axis", &"OBJECTIVES_GRND_SCORE" );
}
setObjectiveHintText( "allies", &"OBJECTIVES_GRND_HINT" );
setObjectiveHintText( "axis", &"OBJECTIVES_GRND_HINT" );
level.spawnMins = ( 0, 0, 0 );
level.spawnMaxs = ( 0, 0, 0 );
maps\mp\gametypes\_spawnlogic::placeSpawnPoints( "mp_sab_spawn_allies_start" );
maps\mp\gametypes\_spawnlogic::placeSpawnPoints( "mp_sab_spawn_axis_start" );
maps\mp\gametypes\_spawnlogic::addSpawnPoints( "allies", "mp_tdm_spawn" );
maps\mp\gametypes\_spawnlogic::addSpawnPoints( "axis", "mp_tdm_spawn" );
level.mapCenter = maps\mp\gametypes\_spawnlogic::findBoxCenter( level.spawnMins, level.spawnMaxs );
setMapCenter( level.mapCenter );
// get the central loction for first DZ using the SAB bomb, before it is removed
centerLocObj = getEnt( "sab_bomb", "targetname" );
level.grnd_centerLoc = centerLocObj.origin;
maps\mp\gametypes\_rank::registerScoreInfo( "zone_kill", 100 );
maps\mp\gametypes\_rank::registerScoreInfo( "zone_tick", 20 );
allowed[0] = level.gameType;
allowed[1] = "tdm";
maps\mp\gametypes\_gameobjects::main(allowed);
level.grnd_timerDisplay = createServerTimer( "objective", 1.4 );
level.grnd_timerDisplay setPoint( "TOPLEFT", "TOPLEFT", 115, 5 );
level.grnd_timerDisplay.label = &"MP_NEXT_DROP_ZONE_IN";
level.grnd_timerDisplay.alpha = 0;
level.grnd_timerDisplay.archived = false;
level.grnd_timerDisplay.hideWhenInMenu = true;
thread hideHudElementOnGameEnd( level.grnd_timerDisplay );
initFirstZone();
}
initFirstZone()
{
level.zonesCycling = false;
// find the closest zone to center
shortestDistance = 999999;
shortestDistanceIndex = 0;
for ( i=0; i<level.grnd_dropZones[level.script].size; i++ )
{
dropZone = level.grnd_dropZones[level.script][i];
distToCenter = distance2d( level.grnd_centerLoc, dropZone );
if ( distToCenter < shortestDistance )
{
shortestDistance = distToCenter;
shortestDistanceIndex = i;
}
}
level.grnd_initialIndex = shortestDistanceIndex;
initilPos = level.grnd_dropZones[level.script][shortestDistanceIndex];
// create marker
level.grnd_zone = spawn( "script_model", initilPos );
level.grnd_zone.origin = initilPos;
level.grnd_zone.angles = ( 90, 0, 0 );
level.grnd_zone setModel( "weapon_us_smoke_grenade_burnt2" );
// spawning
level.favorCloseSpawnEnt = level.grnd_zone;
level.favorCloseSpawnScalar = 5;
// make the rest
level thread initZones();
}
initZones()
{
level.grnd_zones = [];
for ( i=0; i<level.grnd_dropZones[level.script].size; i++ )
{
dropZone = level.grnd_dropZones[level.script][i];
level.grnd_zones[i] = spawn( "script_origin", dropZone );
level.grnd_zones[i].origin = dropZone;
wait( 0.05 );
}
level.grnd_zones[level.grnd_initialIndex] delete();
level.grnd_zones[level.grnd_initialIndex] = undefined;
level.grnd_zones = array_removeUndefined( level.grnd_zones );
}
getSpawnPoint()
{
if ( level.inGracePeriod )
{
spawnPoints = maps\mp\gametypes\_spawnlogic::getSpawnpointArray( "mp_sab_spawn_" + self.pers["team"] + "_start" );
spawnPoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_Random( spawnPoints );
}
else
{
spawnPoints = maps\mp\gametypes\_spawnlogic::getTeamSpawnPoints( self.pers["team"] );
spawnPoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_NearTeam( spawnPoints );
}
return spawnPoint;
}
onSpawnPlayer()
{
// in/out zone indicator
if ( !isDefined( self.inGrindZone ) )
{
level thread setPlayerMessages( self );
// let the first player in activate this
if ( !level.zonesCycling )
{
level thread cycleZones();
level thread locationScoring();
}
}
level notify ( "spawned_player" );
}
setPlayerMessages( player )
{
level endon( "game_ended" );
gameFlagWait( "prematch_done" );
// points
player.inGrindZonePoints = 0;
// hud indicator
player.grndHUDText = player createFontString( "small", 1.6 );
player.grndHUDText setPoint( "TOP LEFT", "TOP LEFT", 115, 22 );
player.grndHUDText.alpha = 1;
player.grndHUDText.hideWhenInMenu = true;
level thread hideHudElementOnGameEnd( player.grndHUDText );
// hud icon
player.grndHeadIcon = level.grnd_zone maps\mp\_entityheadIcons::setHeadIcon( player, "waypoint_captureneutral", (0,0,0), 14, 14, undefined, undefined, undefined, undefined, undefined, false );
// minimap waypoint
player.grndObjId = maps\mp\gametypes\_gameobjects::getNextObjID();
objective_add( player.grndObjId, "invisible", (0,0,0) );
objective_player( player.grndObjId, player getEntityNumber() );
Objective_OnEntity( player.grndObjId, level.grnd_zone );
objective_icon( player.grndObjId, "waypoint_captureneutral" );
objective_state( player.grndObjId, "active" );
if ( distance2D( level.grnd_zone.origin, player.origin ) < GRND_ZONE_TOUCH_RADIUS )
{
player.inGrindZone = true;
player.grndHUDText setText( &"OBJECTIVES_GRND_CONFIRM" );
player.grndHUDText.color = (0.6,1,0.6);
player.grndHeadIcon.alpha = 0;
}
else
{
player.inGrindZone = false;
player.grndHUDText setText( &"OBJECTIVES_GRND_HINT" );
player.grndHUDText.color = (1,0.6,0.6);
player.grndHeadIcon.alpha = 0.85;
}
player.grnd_wasSpectator = false;
if ( player.team == "spectator" )
{
player.inGrindZone = false;
player.inGrindZonePoints = 0;
player.grndHeadIcon.alpha = 0;
player.grndHUDText.alpha = 0;
player.grnd_wasSpectator = true;
}
player thread grndTracking();
}
getNextZone()
{
pos = undefined;
index = undefined;
if ( level.grnd_zones.size > 2 )
{
// get the distance to the current zone from all the remaining zones
// set index and save furthest and closest along the way
closestDistance = 999999;
furthestDistance = 0;
for ( i=0; i<level.grnd_zones.size; i++ )
{
level.grnd_zones[i].index = i;
level.grnd_zones[i].distToZone = distance( level.grnd_zones[i].origin, level.grnd_zone.origin );
if ( level.grnd_zones[i].distToZone > furthestDistance )
furthestDistance = level.grnd_zones[i].distToZone;
else if ( level.grnd_zones[i].distToZone < closestDistance )
closestDistance = level.grnd_zones[i].distToZone;
}
// try to get a grouping of far zones to randomly choose from
farZones = [];
closeZones = [];
halfDistance = int( ( closestDistance + furthestDistance ) / 2 );
for ( i=0; i<level.grnd_zones.size; i++ )
{
if ( level.grnd_zones[i].distToZone >= halfDistance )
farZones[farZones.size] = level.grnd_zones[i];
else
closeZones[closeZones.size] = level.grnd_zones[i];
}
zone = undefined;
if ( farZones.size > 1 )
zone = farZones[ randomIntRange( 0, farZones.size ) ];
else
zone = farZones[0];
index = zone.index;
}
else if ( level.grnd_zones.size == 2 )
{
distanceA = distance( level.grnd_zones[0].origin, level.grnd_zone.origin );
distanceB = distance( level.grnd_zones[1].origin, level.grnd_zone.origin );
if ( distanceA > distanceB )
index = 0;
else
index = 1;
}
else if ( level.grnd_zones.size == 1 )
{
index = 0;
}
if ( isDefined( index ) )
{
pos = level.grnd_zones[index].origin;
level.grnd_zones[index] delete();
level.grnd_zones[index] = undefined;
level.grnd_zones = array_removeUndefined( level.grnd_zones );
}
else
{
// start all over
pos = level.grnd_dropZones[level.script][level.grnd_initialIndex];
level thread initZones();
}
return pos;
}
cycleZones()
{
level endon( "game_ended" );
gameFlagWait( "prematch_done" );
while( true )
{
initialScores["axis"] = game["teamScores"]["axis"];
initialScores["allies"] = game["teamScores"]["allies"];
// move zone
pos = undefined;
if ( !level.zonesCycling )
{
level.zonesCycling = true;
pos = level.grnd_zone.origin;
}
else
{
pos = getNextZone();
StopFxOnTag( level.grnd_fx["smoke"], level.grnd_zone, "tag_fx" );
wait( 0.05 );
}
traceStart = pos;
traceEnd = pos + (0,0,-1000);
trace = bulletTrace( traceStart, traceEnd, false, undefined );
level.grnd_zone.origin = trace["position"]+(0,0,1);
// smoke
wait( 0.05 );
PlayFxOnTag( level.grnd_fx["smoke"], level.grnd_zone, "tag_fx" );
// reset drops
if ( level.matchRules_dropTime )
level thread randomDrops();
// wait
level.grnd_timerDisplay.label = &"MP_NEXT_DROP_ZONE_IN";
level.grnd_timerDisplay setTimer( level.matchRules_zoneSwitchTime );
level.grnd_timerDisplay.alpha = 1;
maps\mp\gametypes\_hostmigration::waitLongDurationWithHostMigrationPause( level.matchRules_zoneSwitchTime );
level.grnd_timerDisplay.alpha = 0;
// audio cue for progress
if ( game["teamScores"]["axis"] - initialScores["axis"] > game["teamScores"]["allies"] - initialScores["allies"] )
{
playSoundOnPlayers( "mp_obj_captured", "axis" );
playSoundOnPlayers( "mp_enemy_obj_captured", "allies" );
}
else if ( game["teamScores"]["allies"] - initialScores["allies"] > game["teamScores"]["axis"] - initialScores["axis"] )
{
playSoundOnPlayers( "mp_obj_captured", "allies" );
playSoundOnPlayers( "mp_enemy_obj_captured", "axis" );
}
}
}
grndTracking()
{
self endon( "disconnect" );
level endon( "game_ended" );
while( true )
{
if ( !self.grnd_wasSpectator && self.team == "spectator" )
{
self.inGrindZone = false;
self.inGrindZonePoints = 0;
self.grndHeadIcon.alpha = 0;
self.grndHUDText.alpha = 0;
self.grnd_wasSpectator = true;
}
else if ( self.team != "spectator" )
{
if ( ( self.grnd_wasSpectator || !self.inGrindZone ) && distance2D( level.grnd_zone.origin, self.origin ) < GRND_ZONE_TOUCH_RADIUS )
{
self.inGrindZone = true;
self.inGrindZonePoints = 0;
self.grndHUDText setText( &"OBJECTIVES_GRND_CONFIRM" );
self.grndHUDText.color = (0.6,1,0.6);
self.grndHUDText.alpha = 1;
self.grndHeadIcon.alpha = 0;
}
else if ( ( self.grnd_wasSpectator || self.inGrindZone ) && distance2D( level.grnd_zone.origin, self.origin ) >= GRND_ZONE_TOUCH_RADIUS )
{
self.inGrindZone = false;
self.inGrindZonePoints = 0;
self.grndHUDText setText( &"OBJECTIVES_GRND_HINT" );
self.grndHUDText.color = (1,0.6,0.6);
self.grndHUDText.alpha = 1;
self.grndHeadIcon.alpha = 0.85;
}
self.grnd_wasSpectator = false;
}
wait( 0.05 );
}
}
locationScoring()
{
level endon( "game_ended" );
gameFlagWait( "prematch_done" );
score = maps\mp\gametypes\_rank::getScoreInfoValue( "zone_tick" );
assert( isDefined( score ) );
while( true )
{
numPlayers["axis"] = 0;
numPlayers["allies"] = 0;
// score
foreach( player in level.players )
{
if ( isDefined( player.inGrindZone ) && isAlive( player ) && distance2D( level.grnd_zone.origin, player.origin ) < GRND_ZONE_TOUCH_RADIUS )
{
numPlayers[player.pers["team"]]++;
player.inGrindZonePoints += score;
}
}
if ( numPlayers["axis"] )
maps\mp\gametypes\_gamescore::giveTeamScoreForObjective( "axis", score * numPlayers["axis"] );
if ( numPlayers["allies"] )
maps\mp\gametypes\_gamescore::giveTeamScoreForObjective( "allies", score * numPlayers["allies"] );
// waypoints and compasspings
if ( numPlayers["axis"] == numPlayers["allies"] )
{
foreach( player in level.players )
{
if ( isDefined( player.inGrindZone ) )
{
player.grndHeadIcon setShader( "waypoint_captureneutral", 14, 14 );
player.grndHeadIcon setWaypoint( false, false, false, false );
objective_icon( player.grndObjId, "waypoint_captureneutral" );
}
}
}
else
{
foreach( player in level.players )
{
if ( isDefined( player.inGrindZone ) )
{
if ( numPlayers[player.pers["team"]] > numPlayers[level.otherTeam[player.pers["team"]]] )
{
player.grndHeadIcon setShader( "waypoint_defend", 14, 14 );
player.grndHeadIcon setWaypoint( false, false, false, false );
objective_icon( player.grndObjId, "waypoint_defend" );
}
else
{
player.grndHeadIcon setShader( "waypoint_capture", 14, 14 );
player.grndHeadIcon setWaypoint( false, false, false, false );
objective_icon( player.grndObjId, "waypoint_capture" );
}
}
}
}
// wait
maps\mp\gametypes\_hostmigration::waitLongDurationWithHostMigrationPause( 1.0 );
}
}
randomDrops()
{
level endon( "game_ended" );
level notify( "reset_grnd_drops" );
level endon( "reset_grnd_drops" );
// try for no repeats per zone
level.grnd_previousCrateTypes = [];
while( true )
{
owner = getBestPlayer();
numIncomingVehicles = 1;
if( isDefined( owner ) &&
currentActiveVehicleCount() < maxVehiclesAllowed() &&
level.fauxVehicleCount + numIncomingVehicles < maxVehiclesAllowed() &&
level.numDropCrates < 8 )
{
owner thread maps\mp\gametypes\_rank::xpEventPopup( &"SPLASHES_EARNED_CAREPACKAGE" );
thread teamPlayerCardSplash( "callout_earned_carepackage", owner );
owner thread leaderDialog( level.otherTeam[ owner.team ] + "_enemy_airdrop_assault_inbound", level.otherTeam[ owner.team ] );
owner thread leaderDialog( owner.team + "_friendly_airdrop_assault_inbound", owner.team );
playSoundOnPlayers( "mp_war_objective_taken", owner.team );
playSoundOnPlayers( "mp_war_objective_lost", level.otherTeam[owner.team] );
position = level.grnd_zone.origin + ( randomIntRange( (-1*GRND_ZONE_DROP_RADIUS), GRND_ZONE_DROP_RADIUS ), randomIntRange( (-1*GRND_ZONE_DROP_RADIUS), GRND_ZONE_DROP_RADIUS ), 0 );
crateType = getDropZoneCrateType();
if ( isSubStr( toLower( crateType ), "juggernaut" ) )
{
level thread maps\mp\killstreaks\_airdrop::doC130FlyBy( owner, position, randomFloat( 360 ), crateType );
}
else if ( crateType == "mega" )
{
level thread maps\mp\killstreaks\_airdrop::doMegaC130FlyBy( owner, position, randomFloat( 360 ), "airdrop_grnd", -360 );
}
else
{
level thread maps\mp\killstreaks\_airdrop::doFlyBy( owner, position, randomFloat( 360 ), "airdrop_grnd", 0, crateType );
}
waitTime = level.matchRules_dropTime;
}
else
waitTime = 0.5;
maps\mp\gametypes\_hostmigration::waitLongDurationWithHostMigrationPause( waitTime );
}
}
getBestPlayer()
{
bestPlayer = undefined;
bestPlayerPoints = 0;
// find the player with the currently highest accumulated points in the zone
foreach ( player in level.players )
{
if ( isAlive( player ) )
{
if ( distance2D( level.grnd_zone.origin, player.origin ) < GRND_ZONE_TOUCH_RADIUS && player.inGrindZonePoints > bestPlayerPoints )
{
bestPlayer = player;
bestPlayerPoints = player.inGrindZonePoints;
}
}
}
// may return undefined
return bestPlayer;
}
getDropZoneCrateType()
{
crateType = undefined;
if ( !isDefined( level.grnd_previousCrateTypes["mega"] ) && level.numDropCrates == 0 && randomIntRange( 0, 100 ) < 5 )
{
crateType = "mega";
}
else
{
if ( level.grnd_previousCrateTypes.size )
{
maxTries = 200;
while( maxTries )
{
crateType = maps\mp\killstreaks\_airdrop::getRandomCrateType( "airdrop_grnd" );
if ( isDefined( level.grnd_previousCrateTypes[crateType] ) )
crateType = undefined;
else
break;
maxTries--;
}
}
if ( !isDefined( crateType ) )
crateType = maps\mp\killstreaks\_airdrop::getRandomCrateType( "airdrop_grnd" );
}
// track it
level.grnd_previousCrateTypes[crateType] = 1;
if ( level.grnd_previousCrateTypes.size == 15 )
level.grnd_previousCrateTypes = [];
return crateType;
}
hideHudElementOnGameEnd( hudElement )
{
level waittill("game_ended");
hudElement.alpha = 0;
}
createZones()
{
level.grnd_dropZones = [];
// future way
dropZones = getEntArray( "grnd_dropZone", "targetname" );
if ( isDefined( dropZones ) && dropZones.size )
{
i=0;
foreach ( dropZone in dropZones )
{
level.grnd_dropZones[level.script][i] = dropZone.origin;
i++;
}
}
else
{
// current way
level.grnd_dropZones["mp_seatown"][0] = (-1226, -1399, 204);
level.grnd_dropZones["mp_seatown"][1] = (1048, 886, 22
;
level.grnd_dropZones["mp_seatown"][2] = (-1982, 1494, 229);
level.grnd_dropZones["mp_seatown"][3] = (-2297, -855, 210);
level.grnd_dropZones["mp_seatown"][4] = (-2261, -334, 24
;
level.grnd_dropZones["mp_seatown"][5] = (-2048, 512, 24
;
level.grnd_dropZones["mp_seatown"][6] = (-1439, 1065, 72);
level.grnd_dropZones["mp_seatown"][7] = (-410, 982, 127);
level.grnd_dropZones["mp_seatown"][8] = (-666, -217, 226);
level.grnd_dropZones["mp_seatown"][9] = (-523, -875, 260);
level.grnd_dropZones["mp_seatown"][10] = (-345, -1449, 254);
level.grnd_dropZones["mp_seatown"][11] = (1167, -533, 294);
level.grnd_dropZones["mp_seatown"][12] = (367, 991, 179);
level.grnd_dropZones["mp_seatown"][13] = (1106, 219, 292);
level.grnd_dropZones["mp_dome"][0] = (97, 898, -240);
level.grnd_dropZones["mp_dome"][1] = (-226, 1464, -231);
level.grnd_dropZones["mp_dome"][2] = (-603, 194, -35
;
level.grnd_dropZones["mp_dome"][3] = (814, -406, -335);
level.grnd_dropZones["mp_dome"][4] = (5, 1975, -231);
level.grnd_dropZones["mp_dome"][5] = (-673, 1100, -284);
level.grnd_dropZones["mp_dome"][6] = (669, 1028, -255);
level.grnd_dropZones["mp_dome"][7] = (1231, 807, -267);
level.grnd_dropZones["mp_dome"][8] = (709, 210, -342);
level.grnd_dropZones["mp_dome"][9] = (1223, 10, -336);
level.grnd_dropZones["mp_dome"][10] = (-222, 418, -333);
level.grnd_dropZones["mp_dome"][11] = (501, -183, -330);
level.grnd_dropZones["mp_plaza2"][0] = (221, 440, 754);
level.grnd_dropZones["mp_plaza2"][1] = (155, 1763, 66
;
level.grnd_dropZones["mp_plaza2"][2] = (-430, 1871, 691);
level.grnd_dropZones["mp_plaza2"][3] = (-1190, 1759, 66
;
level.grnd_dropZones["mp_plaza2"][4] = (-1273, 1279, 829);
level.grnd_dropZones["mp_plaza2"][5] = (-593, 1274, 676);
level.grnd_dropZones["mp_plaza2"][6] = (-251, 1006, 722);
level.grnd_dropZones["mp_plaza2"][7] = (80, 1343, 676);
level.grnd_dropZones["mp_plaza2"][8] = (397, -99, 70
;
level.grnd_dropZones["mp_plaza2"][9] = (-1109, 92, 741);
level.grnd_dropZones["mp_plaza2"][10] = (-280, -195, 700);
level.grnd_dropZones["mp_plaza2"][11] = (28, -1600, 66
;
level.grnd_dropZones["mp_plaza2"][12] = (764, -1752, 669);
level.grnd_dropZones["mp_mogadishu"][0] = (1448, 1945, 39);
level.grnd_dropZones["mp_mogadishu"][1] = (1499, -1193, 15);
level.grnd_dropZones["mp_mogadishu"][2] = (791, -880, 16);
level.grnd_dropZones["mp_mogadishu"][3] = (38, -1007, 16);
level.grnd_dropZones["mp_mogadishu"][4] = (-691, -260, 22);
level.grnd_dropZones["mp_mogadishu"][5] = (2, 52, 2);
level.grnd_dropZones["mp_mogadishu"][6] = (664, 69, 12);
level.grnd_dropZones["mp_mogadishu"][7] = (1676, 251, -1);
level.grnd_dropZones["mp_mogadishu"][8] = (2314, 1860, 63);
level.grnd_dropZones["mp_mogadishu"][9] = (73, 858, 3);
level.grnd_dropZones["mp_mogadishu"][10] = (710, 837, 16);
level.grnd_dropZones["mp_mogadishu"][11] = (-549, 829, 2);
level.grnd_dropZones["mp_mogadishu"][12] = (34, 1850, 84);
level.grnd_dropZones["mp_mogadishu"][13] = (-778, 2614, 157);
level.grnd_dropZones["mp_mogadishu"][14] = (-204, 3206, 152);
level.grnd_dropZones["mp_mogadishu"][15] = (752, 3189, 14
;
level.grnd_dropZones["mp_mogadishu"][16] = (692, 2354, 95);
level.grnd_dropZones["mp_paris"][0] = (-931, -921, 110);
level.grnd_dropZones["mp_paris"][1] = (1597, 1768, 47);
level.grnd_dropZones["mp_paris"][2] = (716, 1809, 33);
level.grnd_dropZones["mp_paris"][3] = (258, 2074, 36);
level.grnd_dropZones["mp_paris"][4] = (459, 1067, 37);
level.grnd_dropZones["mp_paris"][5] = (852, 1350, 11
;
level.grnd_dropZones["mp_paris"][6] = (1601, 897, 45);
level.grnd_dropZones["mp_paris"][7] = (1286, 420, 41);
level.grnd_dropZones["mp_paris"][8] = (1613, 181, 172);
level.grnd_dropZones["mp_paris"][9] = (466, -752, 67);
level.grnd_dropZones["mp_paris"][10] = (994, -625, 50);
level.grnd_dropZones["mp_paris"][11] = (-211, -60, 63);
level.grnd_dropZones["mp_paris"][12] = (-742, 177, 133);
level.grnd_dropZones["mp_paris"][13] = (-1532, 100, 250);
level.grnd_dropZones["mp_paris"][14] = (-343, 1922, 121);
level.grnd_dropZones["mp_paris"][15] = (-1127, 1555, 284);
level.grnd_dropZones["mp_paris"][16] = (-2025, 1327, 316);
level.grnd_dropZones["mp_paris"][17] = (-1039, 841, 187);
level.grnd_dropZones["mp_exchange"][0] = (-614, 1286, 113);
level.grnd_dropZones["mp_exchange"][1] = (182, 1155, 14
;
level.grnd_dropZones["mp_exchange"][2] = (1018, 1254, 120);
level.grnd_dropZones["mp_exchange"][3] = (2182, 1322, 145);
level.grnd_dropZones["mp_exchange"][4] = (655, 815, 13);
level.grnd_dropZones["mp_exchange"][5] = (761, -312, -1
;
level.grnd_dropZones["mp_exchange"][6] = (761, -771, 112);
level.grnd_dropZones["mp_exchange"][7] = (635, -1450, 110);
level.grnd_dropZones["mp_exchange"][8] = (152, -1538, 96);
level.grnd_dropZones["mp_exchange"][9] = (303, -824, 8
;
level.grnd_dropZones["mp_exchange"][10] = (-953, -768, 45);
level.grnd_dropZones["mp_exchange"][11] = (2392, 1305, 144);
level.grnd_dropZones["mp_exchange"][12] = (1634, 1329, 151);
level.grnd_dropZones["mp_exchange"][13] = (1315, 743, 159);
level.grnd_dropZones["mp_bootleg"][0] = (-1432, 1404,
;
level.grnd_dropZones["mp_bootleg"][1] = (-1017, 1787, -39);
level.grnd_dropZones["mp_bootleg"][2] = (-590, 1514, -43);
level.grnd_dropZones["mp_bootleg"][3] = (-588, 614, -12);
level.grnd_dropZones["mp_bootleg"][4] = (-1732, 84, 11);
level.grnd_dropZones["mp_bootleg"][5] = (-1809, -302, 140);
level.grnd_dropZones["mp_bootleg"][6] = (-1649, -1147, 92);
level.grnd_dropZones["mp_bootleg"][7] = (-884, -1035, -4);
level.grnd_dropZones["mp_bootleg"][8] = (-719, -1673, 60);
level.grnd_dropZones["mp_bootleg"][9] = (-335, -2111, 60);
level.grnd_dropZones["mp_bootleg"][10] = (208, -1955, 6
;
level.grnd_dropZones["mp_bootleg"][11] = (-198, -1726, 60);
level.grnd_dropZones["mp_bootleg"][12] = (100, -1101, -9);
level.grnd_dropZones["mp_bootleg"][13] = (-427, -100, -
;
level.grnd_dropZones["mp_bootleg"][14] = (949, -1132, -10);
level.grnd_dropZones["mp_bootleg"][15] = (884, 1182, -2
;
level.grnd_dropZones["mp_bootleg"][16] = (242, 1194, -45);
level.grnd_dropZones["mp_carbon"][0] = (-3330, -3392, 3630);
level.grnd_dropZones["mp_carbon"][1] = (-3635, -3735, 3630);
level.grnd_dropZones["mp_carbon"][2] = (-3625, -4189, 3633);
level.grnd_dropZones["mp_carbon"][3] = (-2992, -4339, 3627);
level.grnd_dropZones["mp_carbon"][4] = (-2925, -4999, 3673);
level.grnd_dropZones["mp_carbon"][5] = (-2573, -4771, 3784);
level.grnd_dropZones["mp_carbon"][6] = (-1705, -4643, 3813);
level.grnd_dropZones["mp_carbon"][7] = (-1799, -3957, 3813);
level.grnd_dropZones["mp_carbon"][8] = (-2141, -3647, 3815);
level.grnd_dropZones["mp_carbon"][9] = (-3212, -2879, 3807);
level.grnd_dropZones["mp_carbon"][10] = (-1623, -3339, 380
;
level.grnd_dropZones["mp_carbon"][11] = (-1223, -4234, 3834);
level.grnd_dropZones["mp_carbon"][12] = (-896, -4888, 3944);
level.grnd_dropZones["mp_carbon"][13] = (-228, -4535, 3975);
level.grnd_dropZones["mp_carbon"][14] = (-257, -3865, 3956);
level.grnd_dropZones["mp_carbon"][15] = (-215, -3260, 3967);
level.grnd_dropZones["mp_carbon"][16] = (-535, -3798, 3966);
level.grnd_dropZones["mp_hardhat"][0] = (2035, -229, 246);
level.grnd_dropZones["mp_hardhat"][1] = (1959, -772, 352);
level.grnd_dropZones["mp_hardhat"][2] = (1883, -1384, 351);
level.grnd_dropZones["mp_hardhat"][3] = (848, -1520, 334);
level.grnd_dropZones["mp_hardhat"][4] = (1326, -1380, 342);
level.grnd_dropZones["mp_hardhat"][5] = (-338, -1273, 34
;
level.grnd_dropZones["mp_hardhat"][6] = (-821, -884, 34
;
level.grnd_dropZones["mp_hardhat"][7] = (-920, -290, 230);
level.grnd_dropZones["mp_hardhat"][8] = (-463, -250, 333);
level.grnd_dropZones["mp_hardhat"][9] = (-741, 208, 245);
level.grnd_dropZones["mp_hardhat"][10] = (-201, 806, 437);
level.grnd_dropZones["mp_hardhat"][11] = (224, 980, 436);
level.grnd_dropZones["mp_hardhat"][12] = (1125, 656, 255);
level.grnd_dropZones["mp_hardhat"][13] = (1531, 1241, 364);
level.grnd_dropZones["mp_hardhat"][14] = (1522, 542, 244);
level.grnd_dropZones["mp_alpha"][0] = (-1979, 1653, 14
;
level.grnd_dropZones["mp_alpha"][1] = (-1392, 1623, 60);
level.grnd_dropZones["mp_alpha"][2] = (-1697, 1205, 52);
level.grnd_dropZones["mp_alpha"][3] = (-1671, 692, 54);
level.grnd_dropZones["mp_alpha"][4] = (-572, -272, 55);
level.grnd_dropZones["mp_alpha"][5] = (634, -345, 52);
level.grnd_dropZones["mp_alpha"][6] = (391, 121, 60);
level.grnd_dropZones["mp_alpha"][7] = (291, 1271, 60);
level.grnd_dropZones["mp_alpha"][8] = (-459, 868, 52);
level.grnd_dropZones["mp_alpha"][9] = (-353, 1334, 52);
level.grnd_dropZones["mp_alpha"][10] = (-37, 1637, 52);
level.grnd_dropZones["mp_alpha"][11] = (-5, 2226, 52);
level.grnd_dropZones["mp_alpha"][12] = (-407, 2198, 196);
level.grnd_dropZones["mp_village"][0] = (647, 1891, 332);
level.grnd_dropZones["mp_village"][1] = (-26, 1749, 334);
level.grnd_dropZones["mp_village"][2] = (104, 1292, 323);
level.grnd_dropZones["mp_village"][3] = (-1064, 1552, 322);
level.grnd_dropZones["mp_village"][4] = (-599, 886, 37
;
level.grnd_dropZones["mp_village"][5] = (-1038, 569, 317);
level.grnd_dropZones["mp_village"][6] = (-1899, 1217, 336);
level.grnd_dropZones["mp_village"][7] = (-1540, 289, 304);
level.grnd_dropZones["mp_village"][8] = (-454, -277, 270);
level.grnd_dropZones["mp_village"][9] = (-1734, -790, 365);
level.grnd_dropZones["mp_village"][10] = (-1418, -1371, 431);
level.grnd_dropZones["mp_village"][11] = (-928, -749, 417);
level.grnd_dropZones["mp_village"][12] = (-861, -2105, 40
;
level.grnd_dropZones["mp_village"][13] = (-191, -1550, 400);
level.grnd_dropZones["mp_village"][14] = (357, -678, 245);
level.grnd_dropZones["mp_village"][15] = (-216, 295, 223);
level.grnd_dropZones["mp_village"][16] = (162, -199, 229);
level.grnd_dropZones["mp_village"][17] = (179, -3052, 447);
level.grnd_dropZones["mp_village"][18] = (510, -1790, 375);
level.grnd_dropZones["mp_village"][19] = (1089, -615, 39
;
level.grnd_dropZones["mp_village"][20] = (1631, 394, 297);
level.grnd_dropZones["mp_village"][21] = (1007, 1385, 337);
level.grnd_dropZones["mp_village"][22] = (992, 248, 330);
level.grnd_dropZones["mp_village"][23] = (551, 732, 386);
level.grnd_dropZones["mp_lambeth"][0] = (-293, -1286, -180);
level.grnd_dropZones["mp_lambeth"][1] = (-938, -785, -130);
level.grnd_dropZones["mp_lambeth"][2] = (-375, -250, -187);
level.grnd_dropZones["mp_lambeth"][3] = (-355, 409, -196);
level.grnd_dropZones["mp_lambeth"][4] = (161, -5, -181);
level.grnd_dropZones["mp_lambeth"][5] = (682, -407, -197);
level.grnd_dropZones["mp_lambeth"][6] = (694, 263, -196);
level.grnd_dropZones["mp_lambeth"][7] = (690, 1158, -243);
level.grnd_dropZones["mp_lambeth"][8] = (1181, 801, -67);
level.grnd_dropZones["mp_lambeth"][9] = (1281, 1248, -257);
level.grnd_dropZones["mp_lambeth"][10] = (2057, 757, -249);
level.grnd_dropZones["mp_lambeth"][11] = (1470, -1040, -109);
level.grnd_dropZones["mp_lambeth"][12] = (1761, -258, -210);
level.grnd_dropZones["mp_lambeth"][13] = (2800, -652, -186);
level.grnd_dropZones["mp_lambeth"][14] = (2785, 445, -244);
level.grnd_dropZones["mp_lambeth"][15] = (2751, 1090, -263);
level.grnd_dropZones["mp_lambeth"][16] = (1535, 1980, -214);
level.grnd_dropZones["mp_lambeth"][17] = (1262, 2602, -213);
level.grnd_dropZones["mp_lambeth"][18] = (419, 2218, -183);
level.grnd_dropZones["mp_lambeth"][19] = (170, 1631, -182);
level.grnd_dropZones["mp_lambeth"][20] = (-606, 1549, -201);
level.grnd_dropZones["mp_lambeth"][21] = (-1199, 1030, -196);
level.grnd_dropZones["mp_radar"][0] = (-3482, -498, 1222);
level.grnd_dropZones["mp_radar"][1] = (-4263, -124, 1229);
level.grnd_dropZones["mp_radar"][2] = (-4006, 827, 123
;
level.grnd_dropZones["mp_radar"][3] = (-3375, 342, 1222);
level.grnd_dropZones["mp_radar"][4] = (-4623, 531, 129
;
level.grnd_dropZones["mp_radar"][5] = (-5157, 877, 1200);
level.grnd_dropZones["mp_radar"][6] = (-5950, 1071, 1305);
level.grnd_dropZones["mp_radar"][7] = (-6509, 1660, 1299);
level.grnd_dropZones["mp_radar"][8] = (-7013, 2955, 1359);
level.grnd_dropZones["mp_radar"][9] = (-6333, 3473, 1421);
level.grnd_dropZones["mp_radar"][10] = (-5675, 2923, 138
;
level.grnd_dropZones["mp_radar"][11] = (-7119, 4357, 1380);
level.grnd_dropZones["mp_radar"][12] = (-5487, 4077, 1356);
level.grnd_dropZones["mp_radar"][13] = (-5736, 2960, 1407);
level.grnd_dropZones["mp_radar"][14] = (-4908, 3281, 1225);
level.grnd_dropZones["mp_radar"][15] = (-4421, 4071, 126
;
level.grnd_dropZones["mp_radar"][16] = (-4979, 1816, 1205);
level.grnd_dropZones["mp_radar"][17] = (-4874, 2306, 1223);
level.grnd_dropZones["mp_interchange"][0] = (2465, -402, 149);
level.grnd_dropZones["mp_interchange"][1] = (2128, 199, 6
;
level.grnd_dropZones["mp_interchange"][2] = (1280, 1263, 126);
level.grnd_dropZones["mp_interchange"][3] = (762, 1747, 114);
level.grnd_dropZones["mp_interchange"][4] = (-9, 1836, 3
;
level.grnd_dropZones["mp_interchange"][5] = (-284, 1171, 159);
level.grnd_dropZones["mp_interchange"][6] = (-1028, 944, 31);
level.grnd_dropZones["mp_interchange"][7] = (-256, 264, 126);
level.grnd_dropZones["mp_interchange"][8] = (462, -463, 15
;
level.grnd_dropZones["mp_interchange"][9] = (1029, -1045, 179);
level.grnd_dropZones["mp_interchange"][10] = (1760, -1434, 142);
level.grnd_dropZones["mp_interchange"][11] = (1538, -361, 142);
level.grnd_dropZones["mp_interchange"][12] = (1150, -2977, 171);
level.grnd_dropZones["mp_interchange"][13] = (371, -2883, 209);
level.grnd_dropZones["mp_interchange"][14] = (399, -2149, 220);
level.grnd_dropZones["mp_underground"][0] = (-602, 3072, -6
;
level.grnd_dropZones["mp_underground"][1] = (-285, 2551, -215);
level.grnd_dropZones["mp_underground"][2] = (574, 2656, -40);
level.grnd_dropZones["mp_underground"][3] = (-627, 1579, -196);
level.grnd_dropZones["mp_underground"][4] = (28, 1556, -196);
level.grnd_dropZones["mp_underground"][5] = (727, 1615, -196);
level.grnd_dropZones["mp_underground"][6] = (-1491, 1268, -196);
level.grnd_dropZones["mp_underground"][7] = (-1370, 1757, -196);
level.grnd_dropZones["mp_underground"][8] = (-1259, 599, -156);
level.grnd_dropZones["mp_underground"][9] = (-959, -26, 60);
level.grnd_dropZones["mp_underground"][10] = (-303, -562, 60);
level.grnd_dropZones["mp_underground"][11] = (193, -922, 60);
level.grnd_dropZones["mp_underground"][12] = (305, 817, -6
;
level.grnd_dropZones["mp_underground"][13] = (-276, 370, -6
;
level.grnd_dropZones["mp_bravo"][0] = (-1359, 608, 975);
level.grnd_dropZones["mp_bravo"][1] = (-1686, 313, 991);
level.grnd_dropZones["mp_bravo"][2] = (-1228, 41, 976);
level.grnd_dropZones["mp_bravo"][3] = (-732, -715, 1032);
level.grnd_dropZones["mp_bravo"][4] = (31, -771, 103
;
level.grnd_dropZones["mp_bravo"][5] = (986, -833, 1116);
level.grnd_dropZones["mp_bravo"][6] = (1800, -577, 1229);
level.grnd_dropZones["mp_bravo"][7] = (1588, -55, 1181);
level.grnd_dropZones["mp_bravo"][8] = (619, 916, 1175);
level.grnd_dropZones["mp_bravo"][9] = (-129, 1310, 122
;
level.grnd_dropZones["mp_bravo"][10] = (-726, 1272, 126
;
level.grnd_dropZones["mp_bravo"][11] = (-741, 752, 1053);
level.grnd_dropZones["mp_bravo"][12] = (6, -136, 1282);
}
}
Copyright © 2026, NextGenUpdate.
All Rights Reserved.