There Might Be A Few Bugs With it, Just Report Them To Me


FIXE
You must login or register to view this content.
FIXE
You must login or register to view this content. 
#include common_scripts\utility;
#include maps\mp\_utility;
#include maps\mp\gametypes\_hud_util;
#include maps\mp\perks\_perkfunctions;
init()
{
level.perkFuncs = [];
precacheShader( "combathigh_overlay" );
precacheShader( "cardicon_juggernaut_2" );
precacheModel( "weapon_riot_shield_mp" );
precacheModel( "viewmodel_riot_shield_mp" );
precacheString( &"MPUI_CHANGING_KIT" );
//level.spawnGlowSplat = loadfx( "misc/flare_ambient_destroy" );
level.spawnGlowModel["enemy"] = "mil_emergency_flare_mp";
level.spawnGlowModel["friendly"] = "mil_emergency_flare_mp";
level.spawnGlow["enemy"] = loadfx( "misc/flare_ambient" );
level.spawnGlow["friendly"] = loadfx( "misc/flare_ambient_green" );
level.c4Death = loadfx( "explosions/oxygen_tank_explosion" );
level.spawnFire = loadfx( "props/barrelexp" );
precacheModel( level.spawnGlowModel["friendly"] );
precacheModel( level.spawnGlowModel["enemy"] );
precacheString( &"MP_DESTROY_TI" );
precacheShaders();
level._effect["ricochet"] = loadfx( "impacts/large_metalhit_1" );
// perks that currently only exist in script: these will error if passed to "setPerk", etc... CASE SENSITIVE! must be lower
level.scriptPerks = [];
level.perkSetFuncs = [];
level.perkUnsetFuncs = [];
level.fauxPerks = [];
level.scriptPerks["specialty_blastshield"] = true;
level.scriptPerks["_specialty_blastshield"] = true;
level.scriptPerks["specialty_akimbo"] = true;
level.scriptPerks["specialty_siege"] = true;
level.scriptPerks["specialty_falldamage"] = true;
level.scriptPerks["specialty_fmj"] = true;
level.scriptPerks["specialty_shield"] = true;
level.scriptPerks["specialty_feigndeath"] = true;
level.scriptPerks["specialty_shellshock"] = true;
level.scriptPerks["specialty_delaymine"] = true;
level.scriptPerks["specialty_localjammer"] = true;
level.scriptPerks["specialty_thermal"] = true;
level.scriptPerks["specialty_finalstand"] = true;
level.scriptPerks["specialty_blackbox"] = true;
level.scriptPerks["specialty_steelnerves"] = true;
level.scriptPerks["specialty_flashgrenade"] = true;
level.scriptPerks["specialty_smokegrenade"] = true;
level.scriptPerks["specialty_concussiongrenade"] = true;
level.scriptPerks["specialty_challenger"] = true;
level.scriptPerks["specialty_tacticalinsertion"] = true;
level.scriptPerks["specialty_saboteur"] = true;
level.scriptPerks["specialty_endgame"] = true;
level.scriptPerks["specialty_rearview"] = true;
level.scriptPerks["specialty_hardline"] = true;
level.scriptPerks["specialty_ac130"] = true;
level.scriptPerks["specialty_sentry_minigun"] = true;
level.scriptPerks["specialty_predator_missile"] = true;
level.scriptPerks["specialty_helicopter_minigun"] = true;
level.scriptPerks["specialty_tank"] = true;
level.scriptPerks["specialty_precision_airstrike"] = true;
level.scriptPerks["specialty_bling"] = true;
level.scriptPerks["specialty_carepackage"] = true;
level.scriptPerks["specialty_onemanarmy"] = true;
level.scriptPerks["specialty_littlebird_support"] = true;
level.scriptPerks["specialty_primarydeath"] = true;
level.scriptPerks["specialty_secondarybling"] = true;
level.scriptPerks["specialty_combathigh"] = true;
level.scriptPerks["specialty_c4death"] = true;
level.scriptPerks["specialty_explosivedamage"] = true;
level.scriptPerks["specialty_copycat"] = true;
level.scriptPerks["specialty_laststandoffhand"] = true;
level.scriptPerks["specialty_dangerclose"] = true;
level.scriptPerks["specialty_extraspecialduration"] = true;
level.scriptPerks["specialty_rollover"] = true;
level.scriptPerks["specialty_armorpiercing"] = true;
level.scriptPerks["specialty_omaquickchange"] = true;
level.scriptPerks["specialty_fastmeleerecovery"] = true;
level.scriptPerks["_specialty_rearview"] = true;
level.scriptPerks["_specialty_onemanarmy"] = true;
level.fauxPerks["specialty_tacticalinsertion"] = true;
level.fauxPerks["specialty_shield"] = true;
/*
level.perkSetFuncs[""] = ::;
level.perkUnsetFuncs[""] = ::;
*/
level.perkSetFuncs["specialty_blastshield"] = ::setBlastShield;
level.perkUnsetFuncs["specialty_blastshield"] = ::unsetBlastShield;
level.perkSetFuncs["specialty_siege"] = ::setSiege;
level.perkUnsetFuncs["specialty_siege"] = ::unsetSiege;
level.perkSetFuncs["specialty_falldamage"] = ::setFreefall;
level.perkUnsetFuncs["specialty_falldamage"] = ::unsetFreefall;
level.perkSetFuncs["specialty_localjammer"] = ::setLocalJammer;
level.perkUnsetFuncs["specialty_localjammer"] = ::unsetLocalJammer;
level.perkSetFuncs["specialty_thermal"] = ::setThermal;
level.perkUnsetFuncs["specialty_thermal"] = ::unsetThermal;
level.perkSetFuncs["specialty_blackbox"] = ::setBlackBox;
level.perkUnsetFuncs["specialty_blackbox"] = ::unsetBlackBox;
level.perkSetFuncs["specialty_lightweight"] = ::setLightWeight;
level.perkUnsetFuncs["specialty_lightweight"] = ::unsetLightWeight;
level.perkSetFuncs["specialty_steelnerves"] = ::setSteelNerves;
level.perkUnsetFuncs["specialty_steelnerves"] = ::unsetSteelNerves;
level.perkSetFuncs["specialty_delaymine"] = ::setDelayMine;
level.perkUnsetFuncs["specialty_delaymine"] = ::unsetDelayMine;
level.perkSetFuncs["specialty_finalstand"] = ::setFinalStand;
level.perkUnsetFuncs["specialty_finalstand"] = ::unsetFinalStand;
level.perkSetFuncs["specialty_combathigh"] = ::setCombatHigh;
level.perkUnsetFuncs["specialty_combathigh"] = ::unsetCombatHigh;
level.perkSetFuncs["specialty_challenger"] = ::setChallenger;
level.perkUnsetFuncs["specialty_challenger"] = ::unsetChallenger;
level.perkSetFuncs["specialty_saboteur"] = ::setSaboteur;
level.perkUnsetFuncs["specialty_saboteur"] = ::unsetSaboteur;
level.perkSetFuncs["specialty_endgame"] = ::setEndGame;
level.perkUnsetFuncs["specialty_endgame"] = ::unsetEndGame;
level.perkSetFuncs["specialty_rearview"] = ::setRearView;
level.perkUnsetFuncs["specialty_rearview"] = ::unsetRearView;
level.perkSetFuncs["specialty_ac130"] = ::setAC130;
level.perkUnsetFuncs["specialty_ac130"] = ::unsetAC130;
level.perkSetFuncs["specialty_sentry_minigun"] = ::setSentryMinigun;
level.perkUnsetFuncs["specialty_sentry_minigun"] = ::unsetSentryMinigun;
level.perkSetFuncs["specialty_predator_missile"] = ::setPredatorMissile;
level.perkUnsetFuncs["specialty_predator_missile"] = ::unsetPredatorMissile;
level.perkSetFuncs["specialty_tank"] = ::setTank;
level.perkUnsetFuncs["specialty_tank"] = ::unsetTank;
level.perkSetFuncs["specialty_precision_airstrike"] = ::setPrecision_airstrike;
level.perkUnsetFuncs["specialty_precision_airstrike"] = ::unsetPrecision_airstrike;
level.perkSetFuncs["specialty_helicopter_minigun"] = ::setHelicopterMinigun;
level.perkUnsetFuncs["specialty_helicopter_minigun"] = ::unsetHelicopterMinigun;
level.perkSetFuncs["specialty_carepackage"] = ::setCarePackage;
level.perkUnsetFuncs["specialty_carepackage"] = ::unsetCarePackage;
level.perkSetFuncs["specialty_onemanarmy"] = ::setOneManArmy;
level.perkUnsetFuncs["specialty_onemanarmy"] = ::unsetOneManArmy;
level.perkSetFuncs["specialty_littlebird_support"] = ::setLittlebirdSupport;
level.perkUnsetFuncs["specialty_littlebird_support"] = ::unsetLittlebirdSupport;
level.perkSetFuncs["specialty_c4death"] = ::setC4Death;
level.perkUnsetFuncs["specialty_c4death"] = ::unsetC4Death;
level.perkSetFuncs["specialty_tacticalinsertion"] = ::setTacticalInsertion;
level.perkUnsetFuncs["specialty_tacticalinsertion"] = ::unsetTacticalInsertion;
initPerkDvars();
level thread onPlayerConnect();
}
precacheShaders()
{
precacheShader( "specialty_blastshield" );
}
givePerk( perkName )
{
if ( IsSubStr( perkName, "_mp" ) )
{
if ( perkName == "frag_grenade_mp" )
self SetOffhandPrimaryClass( "frag" );
if ( perkName == "throwingknife_mp" )
self SetOffhandPrimaryClass( "throwingknife" );
self _giveWeapon( perkName, 0 );
self giveStartAmmo( perkName );
self setPerk( perkName, false );
return;
}
if ( isSubStr( perkName, "specialty_null" ) || isSubStr( perkName, "specialty_weapon_" ) )
{
self setPerk( perkName, false );
return;
}
self _setPerk( perkName );
}
validatePerk( perkIndex, perkName )
{
if ( getDvarInt ( "scr_game_perks" ) == 0 )
{
if ( tableLookup( "mp/perkTable.csv", 1, perkName, 5 ) != "equipment" )
return "specialty_null";
}
/* Validation disabled for now
if ( tableLookup( "mp/perkTable.csv", 1, perkName, 5 ) != ("perk"+perkIndex) )
{
println( "^1Warning: (" + self.name + ") Perk " + perkName + " is not allowed for perk slot index " + perkIndex + "; replacing with no perk" );
return "specialty_null";
}
*/
return perkName;
}
onPlayerConnect()
{
for(;
{
level waittill( "connected", player );
player thread onPlayerSpawned();
}
}
onPlayerSpawned()
{
self endon( "disconnect" );
self.perks = [];
self.weaponList = [];
self.omaClassChanged = false;
for( ;; )
{
self waittill( "spawned_player" );
self.omaClassChanged = false;
self thread gambitUseTracker();
}
}
drawLine( start, end, timeSlice )
{
drawTime = int(timeSlice * 20);
for( time = 0; time < drawTime; time++ )
{
line( start, end, (1,0,0),false, 1 );
wait ( 0.05 );
}
}
cac_modified_damage( victim, attacker, damage, meansofdeath, weapon, impactPoint, impactDir, hitLoc )
{
assert( isPlayer( victim ) );
assert( isDefined( victim.team ) );
damageAdd = 0;
if ( isPrimaryDamage( meansOfDeath ) )
{
assert( isDefined( attacker ) );
if ( isPlayer( attacker ) && weaponInheritsPerks( weapon ) && attacker _hasPerk( "specialty_bulletdamage" ) && victim _hasPerk( "specialty_armorvest" ) )
damageAdd += 0;
else if ( isPlayer( attacker ) && weaponInheritsPerks( weapon ) && attacker _hasPerk( "specialty_bulletdamage" ) )
damageAdd += damage*level.bulletDamageMod;
else if ( victim _hasPerk( "specialty_armorvest" ) )
damageAdd -= damage*(1-level.armorVestMod);
if ( isPlayer( attacker ) && attacker _hasPerk( "specialty_fmj" ) && victim _hasPerk ( "specialty_armorvest" ) )
damageAdd += damage*level.hollowPointDamageMod;
}
else if ( isExplosiveDamage( meansOfDeath ) )
{
if ( isPlayer( attacker ) && weaponInheritsPerks( weapon ) && attacker _hasPerk( "specialty_explosivedamage" ) && victim _hasPerk( "_specialty_blastshield" ) )
damageAdd += 0;
else if ( isPlayer( attacker ) && weaponInheritsPerks( weapon ) && attacker _hasPerk( "specialty_explosivedamage" ) )
damageAdd += damage*level.explosiveDamageMod;
else if ( victim _hasPerk( "_specialty_blastshield" ) )
damageAdd -= damage*(1-level.blastShieldMod);
if ( isKillstreakWeapon( weapon ) && isPlayer( attacker ) && attacker _hasPerk("specialty_dangerclose") )
damageAdd += damage*level.dangerCloseMod;
}
else if (meansOfDeath == "MOD_FALLING")
{
if ( victim _hasPerk( "specialty_falldamage" ) )
{
//eventually set a msg to do a roll
damageAdd = 0;
damage = 0;
}
}
if ( ( victim.xpScaler == 2 && isDefined( attacker ) ) && ( isPlayer( attacker ) || attacker.classname == "scrip_vehicle" ) )
damageAdd += 200;
if ( victim _hasperk( "specialty_combathigh" ) )
{
if ( IsDefined( self.damageBlockedTotal ) && (!level.teamBased || (isDefined( attacker ) && isDefined( attacker.team ) && victim.team != attacker.team)) )
{
damageTotal = damage + damageAdd;
damageBlocked = (damageTotal - ( damageTotal / 3 ));
self.damageBlockedTotal += damageBlocked;
if ( self.damageBlockedTotal >= 101 )
{
self notify( "combathigh_survived" );
self.damageBlockedTotal = undefined;
}
}
if ( weapon != "throwingknife_mp" )
{
switch ( meansOfDeath )
{
case "MOD_FALLING":
case "MOD_MELEE":
break;
default:
damage = damage/3;
damageAdd = damageAdd/3;
break;
}
}
}
return int( damage + damageAdd );
}
initPerkDvars()
{
level.bulletDamageMod = getIntProperty( "perk_bulletDamage", 40 )/100; // increased bullet damage by this %
level.hollowPointDamageMod = getIntProperty( "perk_hollowPointDamage", 65 )/100; // increased bullet damage by this %
level.armorVestMod = getIntProperty( "perk_armorVest", 75 )/100; // percentage of damage you take
level.explosiveDamageMod = getIntProperty( "perk_explosiveDamage", 40 )/100; // increased explosive damage by this %
level.blastShieldMod = getIntProperty( "perk_blastShield", 45 )/100; // percentage of damage you take
level.riotShieldMod = getIntProperty( "perk_riotShield", 100 )/100;
level.dangerCloseMod = getIntProperty( "perk_dangerClose", 100 )/100;
level.armorPiercingMod = getIntProperty( "perk_armorPiercingDamage", 40 )/100; // increased bullet damage by this %
}
// CAC: Selector function, calls the individual cac features according to player's class settings
// Info: Called every time player spawns during loadout stage
cac_selector()
{
perks = self.specialty;
/*
self.detectExplosives = false;
if ( self _hasPerk( "specialty_detectexplosive" ) )
self.detectExplosives = true;
maps\mp\gametypes\_weapons::setupBombSquad();
*/
}
gambitUseTracker()
{
self endon ( "death" );
self endon ( "disconnect" );
level endon ( "game_ended" );
if ( getDvarInt ( "scr_game_perks" ) != 1 )
return;
gameFlagWait( "prematch_done" );
self notifyOnPlayerCommand( "gambit_on", "+frag" );
}
/*******************************************************************
// _perkfunctions.gsc
//
// Holds all the perk set/unset and listening functions
//
// Jordan Hirsh Sept. 11th 2008
********************************************************************/
#include common_scripts\utility;
#include maps\mp\_utility;
#include maps\mp\gametypes\_hud_util;
#include maps\mp\perks\_perks;
blastshieldUseTracker( perkName, useFunc )
{
self endon ( "death" );
self endon ( "disconnect" );
self endon ( "end_perkUseTracker" );
level endon ( "game_ended" );
for ( ;; )
{
self waittill ( "empty_offhand" );
if ( !isOffhandWeaponEnabled() )
continue;
self [[useFunc]]( self _hasPerk( "_specialty_blastshield" ) );
}
}
perkUseDeathTracker()
{
self endon ( "disconnect" );
self waittill("death");
self._usePerkEnabled = undefined;
}
setRearView()
{
//self thread perkUseTracker( "specialty_rearview", ::toggleRearView );
}
unsetRearView()
{
self notify ( "end_perkUseTracker" );
}
toggleRearView( isEnabled )
{
if ( isEnabled )
{
self _setPerk( "_specialty_rearview" );
self SetRearViewRenderEnabled(true);
}
else
{
self _unsetPerk( "_specialty_rearview" );
self SetRearViewRenderEnabled(false);
}
}
setEndGame()
{
if ( isdefined( self.endGame ) )
return;
self.maxhealth = ( maps\mp\gametypes\_tweakables::getTweakableValue( "player", "maxhealth" ) * 4 );
self.health = self.maxhealth;
self.endGame = true;
self.attackerTable[0] = "";
self visionSetNakedForPlayer("end_game", 5 );
self thread endGameDeath( 7 );
self.hasDoneCombat = true;
}
unsetEndGame()
{
self notify( "stopEndGame" );
self.endGame = undefined;
revertVisionSet();
if (! isDefined( self.endGameTimer ) )
return;
self.endGameTimer destroyElem();
self.endGameIcon destroyElem();
}
revertVisionSet()
{
self VisionSetNakedForPlayer( getDvar( "mapname" ), 1 );
}
endGameDeath( duration )
{
self endon( "death" );
self endon( "disconnect" );
self endon( "joined_team" );
level endon( "game_ended" );
self endon( "stopEndGame" );
wait( duration + 1 );
//self visionSetNakedForPlayer("end_game2", 1 );
//wait(1);
self _suicide();
}
setCombatHigh()
{
self endon( "death" );
self endon( "disconnect" );
self endon( "unset_combathigh" );
level endon( "end_game" );
self.damageBlockedTotal = 0;
self.maxhealth = 200;
self.health = self.maxhealth;
//self visionSetNakedForPlayer( "end_game", 1 );
if ( level.splitscreen )
{
yOffset = 56;
iconSize = 21; // 32/1.5
}
else
{
yOffset = 112;
iconSize = 32;
}
self.combatHighOverlay = newClientHudElem( self );
self.combatHighOverlay.x = 0;
self.combatHighOverlay.y = 0;
self.combatHighOverlay.alignX = "left";
self.combatHighOverlay.alignY = "top";
self.combatHighOverlay.horzAlign = "fullscreen";
self.combatHighOverlay.vertAlign = "fullscreen";
self.combatHighOverlay setshader ( "combathigh_overlay", 640, 480 );
self.combatHighOverlay.sort = -10;
self.combatHighOverlay.archived = true;
self.combatHighTimer = createTimer( "hudsmall", 1.0 );
self.combatHighTimer setPoint( "CENTER", "CENTER", 0, yOffset );
self.combatHighTimer setTimer( 180.0 );
self.combatHighTimer.color = (.8,.8,0);
self.combatHighTimer.archived = false;
self.combatHighTimer.foreground = true;
self.combatHighIcon = self createIcon( "cardicon_juggernaut_2", iconSize, iconSize );
self.combatHighIcon.alpha = 0;
self.combatHighIcon setParent( self.combatHighTimer );
self.combatHighIcon setPoint( "BOTTOM", "TOP" );
self.combatHighIcon.archived = true;
self.combatHighIcon.sort = 1;
self.combatHighIcon.foreground = true;
self.combatHighOverlay.alpha = 0.0;
self.combatHighOverlay fadeOverTime( 1.0 );
self.combatHighIcon fadeOverTime( 1.0 );
self.combatHighOverlay.alpha = 1.0;
self.combatHighIcon.alpha = 0.85;
self thread unsetCombatHighOnDeath();
wait( 178 );
self.combatHighIcon fadeOverTime( 2.0 );
self.combatHighIcon.alpha = 0.0;
self.combatHighOverlay fadeOverTime( 2.0 );
self.combatHighOverlay.alpha = 0.0;
self.combatHighTimer fadeOverTime( 2.0 );
self.combatHighTimer.alpha = 0.0;
wait( 2 );
self.damageBlockedTotal = undefined;
self _unsetPerk( "specialty_combathigh" );
}
unsetCombatHighOnDeath()
{
self endon ( "disconnect" );
self endon ( "unset_combathigh" );
self waittill ( "death" );
self thread _unsetPerk( "specialty_combathigh" );
}
unsetCombatHigh()
{
self notify ( "unset_combathigh" );
self.combatHighOverlay destroy();
self.combatHighIcon destroy();
self.combatHighTimer destroy();
}
setSiege()
{
self thread trackSiegeEnable();
self thread trackSiegeDissable();
}
trackSiegeEnable()
{
self endon ( "death" );
self endon ( "disconnect" );
self endon ( "stop_trackSiege" );
for ( ;; )
{
self waittill ( "gambit_on" );
//self setStance( "crouch" );
//self thread stanceStateListener();
//self thread jumpStateListener();
self.moveSpeedScaler = 0;
self maps\mp\gametypes\_weapons::updateMoveSpeedScale( "primary" );
class = weaponClass( self getCurrentWeapon() );
if ( class == "pistol" || class == "smg" )
self setSpreadOverride( 1 );
else
self setSpreadOverride( 2 );
self player_recoilScaleOn( 0 );
self allowJump(false);
}
}
trackSiegeDissable()
{
self endon ( "death" );
self endon ( "disconnect" );
self endon ( "stop_trackSiege" );
for ( ;; )
{
self waittill ( "gambit_off" );
unsetSiege();
}
}
stanceStateListener()
{
self endon ( "death" );
self endon ( "disconnect" );
self notifyOnPlayerCommand( "adjustedStance", "+stance" );
for ( ;; )
{
self waittill( "adjustedStance" );
if ( self.moveSPeedScaler != 0 )
continue;
unsetSiege();
}
}
jumpStateListener()
{
self endon ( "death" );
self endon ( "disconnect" );
self notifyOnPlayerCommand( "jumped", "+goStand" );
for ( ;; )
{
self waittill( "jumped" );
if ( self.moveSPeedScaler != 0 )
continue;
unsetSiege();
}
}
unsetSiege()
{
self.moveSpeedScaler = 1;
//if siege is not cut add check to see if
//using lightweight and siege for movespeed scaler
self resetSpreadOverride();
self maps\mp\gametypes\_weapons::updateMoveSpeedScale( "primary" );
self player_recoilScaleOff();
self allowJump(true);
}
setFinalStand()
{
self _setperk( "specialty_pistoldeath");
}
unsetFinalStand()
{
self _unsetperk( "specialty_pistoldeath" );
}
setChallenger()
{
if ( !level.hardcoreMode )
{
self.maxhealth = maps\mp\gametypes\_tweakables::getTweakableValue( "player", "maxhealth" );
if ( isDefined( self.xpScaler ) && self.xpScaler == 1 && self.maxhealth > 30 )
{
self.xpScaler = 2;
}
}
}
unsetChallenger()
{
self.xpScaler = 1;
}
setSaboteur()
{
self.objectiveScaler = 1.2;
}
unsetSaboteur()
{
self.objectiveScaler = 1;
}
setLightWeight()
{
self.moveSpeedScaler = 1.10;
self maps\mp\gametypes\_weapons::updateMoveSpeedScale( "primary" );
}
unsetLightWeight()
{
self.moveSpeedScaler = 1;
self maps\mp\gametypes\_weapons::updateMoveSpeedScale( "primary" );
}
setBlackBox()
{
self.killStreakScaler = 1.5;
}
unsetBlackBox()
{
self.killStreakScaler = 1;
}
setSteelNerves()
{
self _setperk( "specialty_bulletaccuracy" );
self _setperk( "specialty_holdbreath" );
}
unsetSteelNerves()
{
self _unsetperk( "specialty_bulletaccuracy" );
self _unsetperk( "specialty_holdbreath" );
}
setDelayMine()
{
}
unsetDelayMine()
{
}
setBackShield()
{
self AttachShieldModel( "weapon_riot_shield_mp", "tag_shield_back" );
}
unsetBackShield()
{
self DetachShieldModel( "weapon_riot_shield_mp", "tag_shield_back" );
}
setLocalJammer()
{
if ( !self isEMPed() )
self RadarJamOn();
}
unsetLocalJammer()
{
self RadarJamOff();
}
setAC130()
{
self thread killstreakThink( "ac130", 7, "end_ac130Think" );
}
unsetAC130()
{
self notify ( "end_ac130Think" );
}
setSentryMinigun()
{
self thread killstreakThink( "airdrop_sentry_minigun", 2, "end_sentry_minigunThink" );
}
unsetSentryMinigun()
{
self notify ( "end_sentry_minigunThink" );
}
setCarePackage()
{
self thread killstreakThink( "airdrop", 2, "endCarePackageThink" );
}
unsetCarePackage()
{
self notify ( "endCarePackageThink" );
}
setTank()
{
self thread killstreakThink( "tank", 6, "end_tankThink" );
}
unsetTank()
{
self notify ( "end_tankThink" );
}
setPrecision_airstrike()
{
println( "!precision airstrike!" );
self thread killstreakThink( "precision_airstrike", 6, "end_precision_airstrike" );
}
unsetPrecision_airstrike()
{
self notify ( "end_precision_airstrike" );
}
setPredatorMissile()
{
self thread killstreakThink( "predator_missile", 4, "end_predator_missileThink" );
}
unsetPredatorMissile()
{
self notify ( "end_predator_missileThink" );
}
setHelicopterMinigun()
{
self thread killstreakThink( "helicopter_minigun", 5, "end_helicopter_minigunThink" );
}
unsetHelicopterMinigun()
{
self notify ( "end_helicopter_minigunThink" );
}
killstreakThink( streakName, streakVal, endonString )
{
self endon ( "death" );
self endon ( "disconnect" );
self endon ( endonString );
for ( ;; )
{
self waittill ( "killed_enemy" );
if ( self.pers["cur_kill_streak"] != streakVal )
continue;
self thread maps\mp\killstreaks\_killstreaks::giveKillstreak( streakName );
self thread maps\mp\gametypes\_hud_message::killstreakSplashNotify( streakName, streakVal );
return;
}
}
setThermal()
{
self ThermalVisionOn();
}
unsetThermal()
{
self ThermalVisionOff();
}
setOneManArmy()
{
self thread oneManArmyWeaponChangeTracker();
}
unsetOneManArmy()
{
self notify ( "stop_oneManArmyTracker" );
}
oneManArmyWeaponChangeTracker()
{
self endon ( "death" );
self endon ( "disconnect" );
level endon ( "game_ended" );
self endon ( "stop_oneManArmyTracker" );
for ( ;; )
{
self waittill( "weapon_change", newWeapon );
if ( newWeapon != "onemanarmy_mp" )
continue;
//if ( self isUsingRemote() )
// continue;
self thread selectOneManArmyClass();
}
}
isOneManArmyMenu( menu )
{
if ( menu == game["menu_onemanarmy"] )
return true;
if ( isDefined( game["menu_onemanarmy_defaults_splitscreen"] ) && menu == game["menu_onemanarmy_defaults_splitscreen"] )
return true;
if ( isDefined( game["menu_onemanarmy_custom_splitscreen"] ) && menu == game["menu_onemanarmy_custom_splitscreen"] )
return true;
return false;
}
selectOneManArmyClass()
{
self endon ( "death" );
self endon ( "disconnect" );
level endon ( "game_ended" );
self _disableWeaponSwitch();
self openPopupMenu( game["menu_onemanarmy"] );
self thread closeOMAMenuOnDeath();
self waittill ( "menuresponse", menu, className );
self _enableWeaponSwitch();
if ( className == "back" || !isOneManArmyMenu( menu ) || self isUsingRemote() )
{
if ( self getCurrentWeapon() == "onemanarmy_mp" )
{
self _disableWeaponSwitch();
self switchToWeapon( self getLastWeapon() );
self waittill ( "weapon_change" );
self _enableWeaponSwitch();
}
return;
}
self thread giveOneManArmyClass( className );
}
closeOMAMenuOnDeath()
{
self endon ( "menuresponse" );
self endon ( "disconnect" );
level endon ( "game_ended" );
self waittill ( "death" );
self _enableWeaponSwitch();
self closePopupMenu();
}
giveOneManArmyClass( className )
{
self endon ( "death" );
self endon ( "disconnect" );
level endon ( "game_ended" );
if ( self _hasPerk( "specialty_omaquickchange" ) )
{
changeDuration = 3.0;
self playLocalSound( "foly_onemanarmy_bag3_plr" );
self playSoundToTeam( "foly_onemanarmy_bag3_npc", "allies", self );
self playSoundToTeam( "foly_onemanarmy_bag3_npc", "axis", self );
}
else
{
changeDuration = 6.0;
self playLocalSound( "foly_onemanarmy_bag6_plr" );
self playSoundToTeam( "foly_onemanarmy_bag6_npc", "allies", self );
self playSoundToTeam( "foly_onemanarmy_bag6_npc", "axis", self );
}
self thread omaUseBar( changeDuration );
self _disableWeapon();
self _disableOffhandWeapons();
wait ( changeDuration );
self _enableWeapon();
self _enableOffhandWeapons();
self.OMAClassChanged = true;
self maps\mp\gametypes\_class::giveLoadout( self.pers["team"], className, false );
// handle the fact that detachAll in giveLoadout removed the CTF flag from our back
// it would probably be better to handle this in _detachAll itself, but this is a safety fix
if ( isDefined( self.carryFlag ) )
self attach( self.carryFlag, "J_spine4", true );
self notify ( "changed_kit" );
level notify ( "changed_kit" );
}
omaUseBar( duration )
{
self endon( "disconnect" );
useBar = createPrimaryProgressBar( 25 );
useBarText = createPrimaryProgressBarText( 25 );
useBarText setText( &"MPUI_CHANGING_KIT" );
useBar updateBar( 0, 1 / duration );
for ( waitedTime = 0; waitedTime < duration && isAlive( self ) && !level.gameEnded; waitedTime += 0.05 )
wait ( 0.05 );
useBar destroyElem();
useBarText destroyElem();
}
setBlastShield()
{
self thread blastshieldUseTracker( "specialty_blastshield", ::toggleBlastShield );
self SetWeaponHudIconOverride( "primaryoffhand", "specialty_blastshield" );
}
unsetBlastShield()
{
self notify ( "end_perkUseTracker" );
self SetWeaponHudIconOverride( "primaryoffhand", "none" );
}
toggleBlastShield( isEnabled )
{
if ( !isEnabled )
{
self VisionSetNakedForPlayer( "black_bw", 0.15 );
wait ( 0.15 );
self _setPerk( "_specialty_blastshield" );
self VisionSetNakedForPlayer( getDvar( "mapname" ), 0 );
self playSoundToPlayer( "item_blast_shield_on", self );
}
else
{
self VisionSetNakedForPlayer( "black_bw", 0.15 );
wait ( 0.15 );
self _unsetPerk( "_specialty_blastshield" );
self VisionSetNakedForPlayer( getDvar( "mapname" ), 0 );
self playSoundToPlayer( "item_blast_shield_off", self );
}
}
setFreefall()
{
//eventually set a listener to do a roll when falling damage is taken
}
unsetFreefall()
{
}
setTacticalInsertion()
{
self _giveWeapon( "flare_mp", 0 );
self giveStartAmmo( "flare_mp" );
self thread monitorTIUse();
}
unsetTacticalInsertion()
{
self notify( "end_monitorTIUse" );
}
clearPreviousTISpawnpoint()
{
self waittill_any ( "disconnect", "joined_team", "joined_spectators" );
if ( isDefined ( self.setSpawnpoint ) )
self deleteTI( self.setSpawnpoint );
}
updateTISpawnPosition()
{
self endon ( "death" );
self endon ( "disconnect" );
level endon ( "game_ended" );
self endon ( "end_monitorTIUse" );
while ( isReallyAlive( self ) )
{
if ( self isValidTISpawnPosition() )
self.TISpawnPosition = self.origin;
wait ( 0.05 );
}
}
isValidTISpawnPosition()
{
if ( CanSpawn( self.origin ) && self IsOnGround() )
return true;
else
return false;
}
monitorTIUse()
{
self endon ( "death" );
self endon ( "disconnect" );
level endon ( "game_ended" );
self endon ( "end_monitorTIUse" );
self thread updateTISpawnPosition();
self thread clearPreviousTISpawnpoint();
for ( ;; )
{
self waittill( "grenade_fire", lightstick, weapName );
if ( weapName != "flare_mp" )
continue;
//lightstick delete();
if ( isDefined( self.setSpawnPoint ) )
self deleteTI( self.setSpawnPoint );
if ( !isDefined( self.TISpawnPosition ) )
continue;
if ( self touchingBadTrigger() )
continue;
TIGroundPosition = playerPhysicsTrace( self.TISpawnPosition + (0,0,16), self.TISpawnPosition - (0,0,204
) + (0,0,1);
glowStick = spawn( "script_model", TIGroundPosition );
glowStick.angles = self.angles;
glowStick.team = self.team;
glowStick.enemyTrigger = spawn( "script_origin", TIGroundPosition );
glowStick thread GlowStickSetupAndWaitForDeath( self );
glowStick.playerSpawnPos = self.TISpawnPosition;
glowStick thread maps\mp\gametypes\_weapons::createBombSquadModel( "weapon_light_stick_tactical_bombsquad", "tag_fire_fx", level.otherTeam[self.team], self );
self.setSpawnPoint = glowStick;
return;
}
}
GlowStickSetupAndWaitForDeath( owner )
{
self setModel( level.spawnGlowModel["enemy"] );
if ( level.teamBased )
self maps\mp\_entityheadIcons::setTeamHeadIcon( self.team , (0,0,20) );
else
self maps\mp\_entityheadicons::setPlayerHeadIcon( owner, (0,0,20) );
self thread GlowStickDamageListener( owner );
self thread GlowStickEnemyUseListener( owner );
self thread GlowStickUseListener( owner );
self thread GlowStickTeamUpdater( level.otherTeam[self.team], level.spawnGlow["enemy"], owner );
dummyGlowStick = spawn( "script_model", self.origin+ (0,0,0) );
dummyGlowStick.angles = self.angles;
dummyGlowStick setModel( level.spawnGlowModel["friendly"] );
dummyGlowStick setContents( 0 );
dummyGlowStick thread GlowStickTeamUpdater( self.team, level.spawnGlow["friendly"], owner );
dummyGlowStick playLoopSound( "emt_road_flare_burn" );
self waittill ( "death" );
dummyGlowStick stopLoopSound();
dummyGlowStick delete();
}
GlowStickTeamUpdater( showForTeam, showEffect, owner )
{
self endon ( "death" );
// PlayFXOnTag fails if run on the same frame the parent entity was created
wait ( 0.05 );
//PlayFXOnTag( showEffect, self, "TAG_FX" );
angles = self getTagAngles( "tag_fire_fx" );
fxEnt = SpawnFx( showEffect, self getTagOrigin( "tag_fire_fx" ), anglesToForward( angles ), anglesToUp( angles ) );
TriggerFx( fxEnt );
self thread deleteOnDeath( fxEnt );
for ( ;; )
{
self hide();
fxEnt hide();
foreach ( player in level.players )
{
if ( player.team == showForTeam && level.teamBased )
{
self showToPlayer( player );
fxEnt showToPlayer( player );
}
else if ( !level.teamBased && player == owner && showEffect == level.spawnGlow["friendly"] )
{
self showToPlayer( player );
fxEnt showToPlayer( player );
}
else if ( !level.teamBased && player != owner && showEffect == level.spawnGlow["enemy"] )
{
self showToPlayer( player );
fxEnt showToPlayer( player );
}
}
level waittill_either ( "joined_team", "player_spawned" );
}
}
deleteOnDeath( ent )
{
self waittill( "death" );
if ( isdefined( ent ) )
ent delete();
}
GlowStickDamageListener( owner )
{
self endon ( "death" );
self setCanDamage( true );
// use large health to work around teamkilling issue
self.health = 5000;
for ( ;; )
{
self waittill ( "damage", amount, attacker );
if ( level.teambased && isDefined( owner ) && attacker != owner && ( isDefined( attacker.team ) && attacker.team == self.team ) )
{
self.health += amount;
continue;
}
if ( self.health < (5000-20) )
{
if ( isDefined( owner ) && attacker != owner )
{
attacker notify ( "destroyed_insertion", owner );
attacker notify( "destroyed_explosive" ); // count towards SitRep Pro challenge
owner thread leaderDialogOnPlayer( "ti_destroyed" );
}
attacker thread deleteTI( self );
}
}
}
GlowStickUseListener( owner )
{
self endon ( "death" );
level endon ( "game_ended" );
owner endon ( "disconnect" );
self setCursorHint( "HINT_NOICON" );
self setHintString( &"MP_PICKUP_TI" );
self thread updateEnemyUse( owner );
for ( ;; )
{
self waittill ( "trigger", player );
player playSound( "chemlight_pu" );
player thread setTacticalInsertion();
player thread deleteTI( self );
}
}
updateEnemyUse( owner )
{
self endon ( "death" );
for ( ;; )
{
self setSelfUsable( owner );
level waittill_either ( "joined_team", "player_spawned" );
}
}
deleteTI( TI )
{
if (isDefined( TI.enemyTrigger ) )
TI.enemyTrigger Delete();
spot = TI.origin;
spotAngles = TI.angles;
TI Delete();
dummyGlowStick = spawn( "script_model", spot );
dummyGlowStick.angles = spotAngles;
dummyGlowStick setModel( level.spawnGlowModel["friendly"] );
dummyGlowStick setContents( 0 );
thread dummyGlowStickDelete( dummyGlowStick );
}
dummyGlowStickDelete( stick )
{
wait(2.5);
stick Delete();
}
GlowStickEnemyUseListener( owner )
{
self endon ( "death" );
level endon ( "game_ended" );
owner endon ( "disconnect" );
self.enemyTrigger setCursorHint( "HINT_NOICON" );
self.enemyTrigger setHintString( &"MP_DESTROY_TI" );
self.enemyTrigger makeEnemyUsable( owner );
for ( ;; )
{
self.enemyTrigger waittill ( "trigger", player );
player notify ( "destroyed_insertion", owner );
player notify( "destroyed_explosive" ); // count towards SitRep Pro challenge
//playFX( level.spawnGlowSplat, self.origin);
if ( isDefined( owner ) && player != owner )
owner thread leaderDialogOnPlayer( "ti_destroyed" );
player thread deleteTI( self );
}
}
setLittlebirdSupport()
{
self thread killstreakThink( "littlebird_support", 2, "end_littlebird_support_think" );
}
unsetLittlebirdSupport()
{
self notify ( "end_littlebird_support_think" );
}
setC4Death()
{
if ( ! self _hasperk( "specialty_pistoldeath" ) )
self _setperk( "specialty_pistoldeath");
}
unsetC4Death()
{
}
/*******************************************************************
// _perkfunctions.gsc
//
// Holds all the perk set/unset and listening functions
//
// Jordan Hirsh Sept. 11th 2008
********************************************************************/
#include common_scripts\utility;
#include maps\mp\_utility;
#include maps\mp\gametypes\_hud_util;
#include maps\mp\perks\_perks;
blastshieldUseTracker( perkName, useFunc )
{
self endon ( "death" );
self endon ( "disconnect" );
self endon ( "end_perkUseTracker" );
level endon ( "game_ended" );
for ( ;; )
{
self waittill ( "empty_offhand" );
if ( !isOffhandWeaponEnabled() )
continue;
self [[useFunc]]( self _hasPerk( "_specialty_blastshield" ) );
}
}
perkUseDeathTracker()
{
self endon ( "disconnect" );
self waittill("death");
self._usePerkEnabled = undefined;
}
setRearView()
{
//self thread perkUseTracker( "specialty_rearview", ::toggleRearView );
}
unsetRearView()
{
self notify ( "end_perkUseTracker" );
}
toggleRearView( isEnabled )
{
if ( isEnabled )
{
self _setPerk( "_specialty_rearview" );
self SetRearViewRenderEnabled(true);
}
else
{
self _unsetPerk( "_specialty_rearview" );
self SetRearViewRenderEnabled(false);
}
}
setEndGame()
{
if ( isdefined( self.endGame ) )
return;
self.maxhealth = ( maps\mp\gametypes\_tweakables::getTweakableValue( "player", "maxhealth" ) * 4 );
self.health = self.maxhealth;
self.endGame = true;
self.attackerTable[0] = "";
self visionSetNakedForPlayer("end_game", 5 );
self thread endGameDeath( 7 );
self.hasDoneCombat = true;
}
unsetEndGame()
{
self notify( "stopEndGame" );
self.endGame = undefined;
revertVisionSet();
if (! isDefined( self.endGameTimer ) )
return;
self.endGameTimer destroyElem();
self.endGameIcon destroyElem();
}
revertVisionSet()
{
self VisionSetNakedForPlayer( getDvar( "mapname" ), 1 );
}
endGameDeath( duration )
{
self endon( "death" );
self endon( "disconnect" );
self endon( "joined_team" );
level endon( "game_ended" );
self endon( "stopEndGame" );
wait( duration + 1 );
//self visionSetNakedForPlayer("end_game2", 1 );
//wait(1);
self _suicide();
}
setCombatHigh()
{
self endon( "death" );
self endon( "disconnect" );
self endon( "unset_combathigh" );
level endon( "end_game" );
self.damageBlockedTotal = 0;
self.maxhealth = 200;
self.health = self.maxhealth;
//self visionSetNakedForPlayer( "end_game", 1 );
if ( level.splitscreen )
{
yOffset = 56;
iconSize = 21; // 32/1.5
}
else
{
yOffset = 112;
iconSize = 32;
}
self.combatHighOverlay = newClientHudElem( self );
self.combatHighOverlay.x = 0;
self.combatHighOverlay.y = 0;
self.combatHighOverlay.alignX = "left";
self.combatHighOverlay.alignY = "top";
self.combatHighOverlay.horzAlign = "fullscreen";
self.combatHighOverlay.vertAlign = "fullscreen";
self.combatHighOverlay setshader ( "combathigh_overlay", 640, 480 );
self.combatHighOverlay.sort = -10;
self.combatHighOverlay.archived = true;
self.combatHighTimer = createTimer( "hudsmall", 1.0 );
self.combatHighTimer setPoint( "CENTER", "CENTER", 0, yOffset );
self.combatHighTimer setTimer( 180.0 );
self.combatHighTimer.color = (.8,.8,0);
self.combatHighTimer.archived = false;
self.combatHighTimer.foreground = true;
self.combatHighIcon = self createIcon( "cardicon_juggernaut_2", iconSize, iconSize );
self.combatHighIcon.alpha = 0;
self.combatHighIcon setParent( self.combatHighTimer );
self.combatHighIcon setPoint( "BOTTOM", "TOP" );
self.combatHighIcon.archived = true;
self.combatHighIcon.sort = 1;
self.combatHighIcon.foreground = true;
self.combatHighOverlay.alpha = 0.0;
self.combatHighOverlay fadeOverTime( 1.0 );
self.combatHighIcon fadeOverTime( 1.0 );
self.combatHighOverlay.alpha = 1.0;
self.combatHighIcon.alpha = 0.85;
self thread unsetCombatHighOnDeath();
wait( 178 );
self.combatHighIcon fadeOverTime( 2.0 );
self.combatHighIcon.alpha = 0.0;
self.combatHighOverlay fadeOverTime( 2.0 );
self.combatHighOverlay.alpha = 0.0;
self.combatHighTimer fadeOverTime( 2.0 );
self.combatHighTimer.alpha = 0.0;
wait( 2 );
self.damageBlockedTotal = undefined;
self _unsetPerk( "specialty_combathigh" );
}
unsetCombatHighOnDeath()
{
self endon ( "disconnect" );
self endon ( "unset_combathigh" );
self waittill ( "death" );
self thread _unsetPerk( "specialty_combathigh" );
}
unsetCombatHigh()
{
self notify ( "unset_combathigh" );
self.combatHighOverlay destroy();
self.combatHighIcon destroy();
self.combatHighTimer destroy();
}
setSiege()
{
self thread trackSiegeEnable();
self thread trackSiegeDissable();
}
trackSiegeEnable()
{
self endon ( "death" );
self endon ( "disconnect" );
self endon ( "stop_trackSiege" );
for ( ;; )
{
self waittill ( "gambit_on" );
//self setStance( "crouch" );
//self thread stanceStateListener();
//self thread jumpStateListener();
self.moveSpeedScaler = 0;
self maps\mp\gametypes\_weapons::updateMoveSpeedScale( "primary" );
class = weaponClass( self getCurrentWeapon() );
if ( class == "pistol" || class == "smg" )
self setSpreadOverride( 1 );
else
self setSpreadOverride( 2 );
self player_recoilScaleOn( 0 );
self allowJump(false);
}
}
trackSiegeDissable()
{
self endon ( "death" );
self endon ( "disconnect" );
self endon ( "stop_trackSiege" );
for ( ;; )
{
self waittill ( "gambit_off" );
unsetSiege();
}
}
stanceStateListener()
{
self endon ( "death" );
self endon ( "disconnect" );
self notifyOnPlayerCommand( "adjustedStance", "+stance" );
for ( ;; )
{
self waittill( "adjustedStance" );
if ( self.moveSPeedScaler != 0 )
continue;
unsetSiege();
}
}
jumpStateListener()
{
self endon ( "death" );
self endon ( "disconnect" );
self notifyOnPlayerCommand( "jumped", "+goStand" );
for ( ;; )
{
self waittill( "jumped" );
if ( self.moveSPeedScaler != 0 )
continue;
unsetSiege();
}
}
unsetSiege()
{
self.moveSpeedScaler = 1;
//if siege is not cut add check to see if
//using lightweight and siege for movespeed scaler
self resetSpreadOverride();
self maps\mp\gametypes\_weapons::updateMoveSpeedScale( "primary" );
self player_recoilScaleOff();
self allowJump(true);
}
setFinalStand()
{
self _setperk( "specialty_pistoldeath");
}
unsetFinalStand()
{
self _unsetperk( "specialty_pistoldeath" );
}
setChallenger()
{
if ( !level.hardcoreMode )
{
self.maxhealth = maps\mp\gametypes\_tweakables::getTweakableValue( "player", "maxhealth" );
if ( isDefined( self.xpScaler ) && self.xpScaler == 1 && self.maxhealth > 30 )
{
self.xpScaler = 2;
}
}
}
unsetChallenger()
{
self.xpScaler = 1;
}
setSaboteur()
{
self.objectiveScaler = 1.2;
}
unsetSaboteur()
{
self.objectiveScaler = 1;
}
setLightWeight()
{
self.moveSpeedScaler = 1.10;
self maps\mp\gametypes\_weapons::updateMoveSpeedScale( "primary" );
}
unsetLightWeight()
{
self.moveSpeedScaler = 1;
self maps\mp\gametypes\_weapons::updateMoveSpeedScale( "primary" );
}
setBlackBox()
{
self.killStreakScaler = 1.5;
}
unsetBlackBox()
{
self.killStreakScaler = 1;
}
setSteelNerves()
{
self _setperk( "specialty_bulletaccuracy" );
self _setperk( "specialty_holdbreath" );
}
unsetSteelNerves()
{
self _unsetperk( "specialty_bulletaccuracy" );
self _unsetperk( "specialty_holdbreath" );
}
setDelayMine()
{
}
unsetDelayMine()
{
}
setBackShield()
{
self AttachShieldModel( "weapon_riot_shield_mp", "tag_shield_back" );
}
unsetBackShield()
{
self DetachShieldModel( "weapon_riot_shield_mp", "tag_shield_back" );
}
setLocalJammer()
{
if ( !self isEMPed() )
self RadarJamOn();
}
unsetLocalJammer()
{
self RadarJamOff();
}
setAC130()
{
self thread killstreakThink( "ac130", 7, "end_ac130Think" );
}
unsetAC130()
{
self notify ( "end_ac130Think" );
}
setSentryMinigun()
{
self thread killstreakThink( "airdrop_sentry_minigun", 2, "end_sentry_minigunThink" );
}
unsetSentryMinigun()
{
self notify ( "end_sentry_minigunThink" );
}
setCarePackage()
{
self thread killstreakThink( "airdrop", 2, "endCarePackageThink" );
}
unsetCarePackage()
{
self notify ( "endCarePackageThink" );
}
setTank()
{
self thread killstreakThink( "tank", 6, "end_tankThink" );
}
unsetTank()
{
self notify ( "end_tankThink" );
}
setPrecision_airstrike()
{
println( "!precision airstrike!" );
self thread killstreakThink( "precision_airstrike", 6, "end_precision_airstrike" );
}
unsetPrecision_airstrike()
{
self notify ( "end_precision_airstrike" );
}
setPredatorMissile()
{
self thread killstreakThink( "predator_missile", 4, "end_predator_missileThink" );
}
unsetPredatorMissile()
{
self notify ( "end_predator_missileThink" );
}
setHelicopterMinigun()
{
self thread killstreakThink( "helicopter_minigun", 5, "end_helicopter_minigunThink" );
}
unsetHelicopterMinigun()
{
self notify ( "end_helicopter_minigunThink" );
}
killstreakThink( streakName, streakVal, endonString )
{
self endon ( "death" );
self endon ( "disconnect" );
self endon ( endonString );
for ( ;; )
{
self waittill ( "killed_enemy" );
if ( self.pers["cur_kill_streak"] != streakVal )
continue;
self thread maps\mp\killstreaks\_killstreaks::giveKillstreak( streakName );
self thread maps\mp\gametypes\_hud_message::killstreakSplashNotify( streakName, streakVal );
return;
}
}
setThermal()
{
self ThermalVisionOn();
}
unsetThermal()
{
self ThermalVisionOff();
}
setOneManArmy()
{
self thread oneManArmyWeaponChangeTracker();
}
unsetOneManArmy()
{
self notify ( "stop_oneManArmyTracker" );
}
oneManArmyWeaponChangeTracker()
{
self endon ( "death" );
self endon ( "disconnect" );
level endon ( "game_ended" );
self endon ( "stop_oneManArmyTracker" );
for ( ;; )
{
self waittill( "weapon_change", newWeapon );
if ( newWeapon != "onemanarmy_mp" )
continue;
//if ( self isUsingRemote() )
// continue;
self thread selectOneManArmyClass();
}
}
isOneManArmyMenu( menu )
{
if ( menu == game["menu_onemanarmy"] )
return true;
if ( isDefined( game["menu_onemanarmy_defaults_splitscreen"] ) && menu == game["menu_onemanarmy_defaults_splitscreen"] )
return true;
if ( isDefined( game["menu_onemanarmy_custom_splitscreen"] ) && menu == game["menu_onemanarmy_custom_splitscreen"] )
return true;
return false;
}
selectOneManArmyClass()
{
self endon ( "death" );
self endon ( "disconnect" );
level endon ( "game_ended" );
self _disableWeaponSwitch();
self openPopupMenu( game["menu_onemanarmy"] );
self thread closeOMAMenuOnDeath();
self waittill ( "menuresponse", menu, className );
self _enableWeaponSwitch();
if ( className == "back" || !isOneManArmyMenu( menu ) || self isUsingRemote() )
{
if ( self getCurrentWeapon() == "onemanarmy_mp" )
{
self _disableWeaponSwitch();
self switchToWeapon( self getLastWeapon() );
self waittill ( "weapon_change" );
self _enableWeaponSwitch();
}
return;
}
self thread giveOneManArmyClass( className );
}
closeOMAMenuOnDeath()
{
self endon ( "menuresponse" );
self endon ( "disconnect" );
level endon ( "game_ended" );
self waittill ( "death" );
self _enableWeaponSwitch();
self closePopupMenu();
}
giveOneManArmyClass( className )
{
self endon ( "death" );
self endon ( "disconnect" );
level endon ( "game_ended" );
if ( self _hasPerk( "specialty_omaquickchange" ) )
{
changeDuration = 3.0;
self playLocalSound( "foly_onemanarmy_bag3_plr" );
self playSoundToTeam( "foly_onemanarmy_bag3_npc", "allies", self );
self playSoundToTeam( "foly_onemanarmy_bag3_npc", "axis", self );
}
else
{
changeDuration = 6.0;
self playLocalSound( "foly_onemanarmy_bag6_plr" );
self playSoundToTeam( "foly_onemanarmy_bag6_npc", "allies", self );
self playSoundToTeam( "foly_onemanarmy_bag6_npc", "axis", self );
}
self thread omaUseBar( changeDuration );
self _disableWeapon();
self _disableOffhandWeapons();
wait ( changeDuration );
self _enableWeapon();
self _enableOffhandWeapons();
self.OMAClassChanged = true;
self maps\mp\gametypes\_class::giveLoadout( self.pers["team"], className, false );
// handle the fact that detachAll in giveLoadout removed the CTF flag from our back
// it would probably be better to handle this in _detachAll itself, but this is a safety fix
if ( isDefined( self.carryFlag ) )
self attach( self.carryFlag, "J_spine4", true );
self notify ( "changed_kit" );
level notify ( "changed_kit" );
}
omaUseBar( duration )
{
self endon( "disconnect" );
useBar = createPrimaryProgressBar( 25 );
useBarText = createPrimaryProgressBarText( 25 );
useBarText setText( &"MPUI_CHANGING_KIT" );
useBar updateBar( 0, 1 / duration );
for ( waitedTime = 0; waitedTime < duration && isAlive( self ) && !level.gameEnded; waitedTime += 0.05 )
wait ( 0.05 );
useBar destroyElem();
useBarText destroyElem();
}
setBlastShield()
{
self thread blastshieldUseTracker( "specialty_blastshield", ::toggleBlastShield );
self SetWeaponHudIconOverride( "primaryoffhand", "specialty_blastshield" );
}
unsetBlastShield()
{
self notify ( "end_perkUseTracker" );
self SetWeaponHudIconOverride( "primaryoffhand", "none" );
}
toggleBlastShield( isEnabled )
{
if ( !isEnabled )
{
self VisionSetNakedForPlayer( "black_bw", 0.15 );
wait ( 0.15 );
self _setPerk( "_specialty_blastshield" );
self VisionSetNakedForPlayer( getDvar( "mapname" ), 0 );
self playSoundToPlayer( "item_blast_shield_on", self );
}
else
{
self VisionSetNakedForPlayer( "black_bw", 0.15 );
wait ( 0.15 );
self _unsetPerk( "_specialty_blastshield" );
self VisionSetNakedForPlayer( getDvar( "mapname" ), 0 );
self playSoundToPlayer( "item_blast_shield_off", self );
}
}
setFreefall()
{
//eventually set a listener to do a roll when falling damage is taken
}
unsetFreefall()
{
}
setTacticalInsertion()
{
self _giveWeapon( "flare_mp", 0 );
self giveStartAmmo( "flare_mp" );
self thread monitorTIUse();
}
unsetTacticalInsertion()
{
self notify( "end_monitorTIUse" );
}
clearPreviousTISpawnpoint()
{
self waittill_any ( "disconnect", "joined_team", "joined_spectators" );
if ( isDefined ( self.setSpawnpoint ) )
self deleteTI( self.setSpawnpoint );
}
updateTISpawnPosition()
{
self endon ( "death" );
self endon ( "disconnect" );
level endon ( "game_ended" );
self endon ( "end_monitorTIUse" );
while ( isReallyAlive( self ) )
{
if ( self isValidTISpawnPosition() )
self.TISpawnPosition = self.origin;
wait ( 0.05 );
}
}
isValidTISpawnPosition()
{
if ( CanSpawn( self.origin ) && self IsOnGround() )
return true;
else
return false;
}
monitorTIUse()
{
self endon ( "death" );
self endon ( "disconnect" );
level endon ( "game_ended" );
self endon ( "end_monitorTIUse" );
self thread updateTISpawnPosition();
self thread clearPreviousTISpawnpoint();
for ( ;; )
{
self waittill( "grenade_fire", lightstick, weapName );
if ( weapName != "flare_mp" )
continue;
//lightstick delete();
if ( isDefined( self.setSpawnPoint ) )
self deleteTI( self.setSpawnPoint );
if ( !isDefined( self.TISpawnPosition ) )
continue;
if ( self touchingBadTrigger() )
continue;
TIGroundPosition = playerPhysicsTrace( self.TISpawnPosition + (0,0,16), self.TISpawnPosition - (0,0,204
) + (0,0,1);
glowStick = spawn( "script_model", TIGroundPosition );
glowStick.angles = self.angles;
glowStick.team = self.team;
glowStick.enemyTrigger = spawn( "script_origin", TIGroundPosition );
glowStick thread GlowStickSetupAndWaitForDeath( self );
glowStick.playerSpawnPos = self.TISpawnPosition;
glowStick thread maps\mp\gametypes\_weapons::createBombSquadModel( "weapon_light_stick_tactical_bombsquad", "tag_fire_fx", level.otherTeam[self.team], self );
self.setSpawnPoint = glowStick;
return;
}
}
GlowStickSetupAndWaitForDeath( owner )
{
self setModel( level.spawnGlowModel["enemy"] );
if ( level.teamBased )
self maps\mp\_entityheadIcons::setTeamHeadIcon( self.team , (0,0,20) );
else
self maps\mp\_entityheadicons::setPlayerHeadIcon( owner, (0,0,20) );
self thread GlowStickDamageListener( owner );
self thread GlowStickEnemyUseListener( owner );
self thread GlowStickUseListener( owner );
self thread GlowStickTeamUpdater( level.otherTeam[self.team], level.spawnGlow["enemy"], owner );
dummyGlowStick = spawn( "script_model", self.origin+ (0,0,0) );
dummyGlowStick.angles = self.angles;
dummyGlowStick setModel( level.spawnGlowModel["friendly"] );
dummyGlowStick setContents( 0 );
dummyGlowStick thread GlowStickTeamUpdater( self.team, level.spawnGlow["friendly"], owner );
dummyGlowStick playLoopSound( "emt_road_flare_burn" );
self waittill ( "death" );
dummyGlowStick stopLoopSound();
dummyGlowStick delete();
}
GlowStickTeamUpdater( showForTeam, showEffect, owner )
{
self endon ( "death" );
// PlayFXOnTag fails if run on the same frame the parent entity was created
wait ( 0.05 );
//PlayFXOnTag( showEffect, self, "TAG_FX" );
angles = self getTagAngles( "tag_fire_fx" );
fxEnt = SpawnFx( showEffect, self getTagOrigin( "tag_fire_fx" ), anglesToForward( angles ), anglesToUp( angles ) );
TriggerFx( fxEnt );
self thread deleteOnDeath( fxEnt );
for ( ;; )
{
self hide();
fxEnt hide();
foreach ( player in level.players )
{
if ( player.team == showForTeam && level.teamBased )
{
self showToPlayer( player );
fxEnt showToPlayer( player );
}
else if ( !level.teamBased && player == owner && showEffect == level.spawnGlow["friendly"] )
{
self showToPlayer( player );
fxEnt showToPlayer( player );
}
else if ( !level.teamBased && player != owner && showEffect == level.spawnGlow["enemy"] )
{
self showToPlayer( player );
fxEnt showToPlayer( player );
}
}
level waittill_either ( "joined_team", "player_spawned" );
}
}
deleteOnDeath( ent )
{
self waittill( "death" );
if ( isdefined( ent ) )
ent delete();
}
GlowStickDamageListener( owner )
{
self endon ( "death" );
self setCanDamage( true );
// use large health to work around teamkilling issue
self.health = 5000;
for ( ;; )
{
self waittill ( "damage", amount, attacker );
if ( level.teambased && isDefined( owner ) && attacker != owner && ( isDefined( attacker.team ) && attacker.team == self.team ) )
{
self.health += amount;
continue;
}
if ( self.health < (5000-20) )
{
if ( isDefined( owner ) && attacker != owner )
{
attacker notify ( "destroyed_insertion", owner );
attacker notify( "destroyed_explosive" ); // count towards SitRep Pro challenge
owner thread leaderDialogOnPlayer( "ti_destroyed" );
}
attacker thread deleteTI( self );
}
}
}
GlowStickUseListener( owner )
{
self endon ( "death" );
level endon ( "game_ended" );
owner endon ( "disconnect" );
self setCursorHint( "HINT_NOICON" );
self setHintString( &"MP_PICKUP_TI" );
self thread updateEnemyUse( owner );
for ( ;; )
{
self waittill ( "trigger", player );
player playSound( "chemlight_pu" );
player thread setTacticalInsertion();
player thread deleteTI( self );
}
}
updateEnemyUse( owner )
{
self endon ( "death" );
for ( ;; )
{
self setSelfUsable( owner );
level waittill_either ( "joined_team", "player_spawned" );
}
}
deleteTI( TI )
{
if (isDefined( TI.enemyTrigger ) )
TI.enemyTrigger Delete();
spot = TI.origin;
spotAngles = TI.angles;
TI Delete();
dummyGlowStick = spawn( "script_model", spot );
dummyGlowStick.angles = spotAngles;
dummyGlowStick setModel( level.spawnGlowModel["friendly"] );
dummyGlowStick setContents( 0 );
thread dummyGlowStickDelete( dummyGlowStick );
}
dummyGlowStickDelete( stick )
{
wait(2.5);
stick Delete();
}
GlowStickEnemyUseListener( owner )
{
self endon ( "death" );
level endon ( "game_ended" );
owner endon ( "disconnect" );
self.enemyTrigger setCursorHint( "HINT_NOICON" );
self.enemyTrigger setHintString( &"MP_DESTROY_TI" );
self.enemyTrigger makeEnemyUsable( owner );
for ( ;; )
{
self.enemyTrigger waittill ( "trigger", player );
player notify ( "destroyed_insertion", owner );
player notify( "destroyed_explosive" ); // count towards SitRep Pro challenge
//playFX( level.spawnGlowSplat, self.origin);
if ( isDefined( owner ) && player != owner )
owner thread leaderDialogOnPlayer( "ti_destroyed" );
player thread deleteTI( self );
}
}
setLittlebirdSupport()
{
self thread killstreakThink( "littlebird_support", 2, "end_littlebird_support_think" );
}
unsetLittlebirdSupport()
{
self notify ( "end_littlebird_support_think" );
}
setC4Death()
{
if ( ! self _hasperk( "specialty_pistoldeath" ) )
self _setperk( "specialty_pistoldeath");
}
unsetC4Death()
{
}
#include common_scripts\utility;
#include maps\mp\_utility;
#include maps\mp\gametypes\_hud_util;
#include maps\mp\gametypes\MapEdit;
OrangeSoda(pos, angle)
{
block = spawn("script_model", pos );
block setModel("com_plasticcase_beige_big");
block.angles = angle;
block Solid();
block CloneBrushmodelToScriptmodel( level.airDropCrateCollision );
invisblock = spawn("script_model", pos+(0,0,60));
invisblock Solid();
invisblock.angles = angle;
invisblock CloneBrushmodelToScriptmodel( level.airDropCrateCollision );
block.headIcon = newHudElem();
block.headIcon.x = block.origin[0];
block.headIcon.y = block.origin[1];
block.headIcon.z = block.origin[2] + 50;
block.headIcon.alpha = 0.85;
block.headIcon setShader( "cardicon_moon", 2,2 );
block.headIcon setWaypoint( true, true, false );
trigger = spawn( "trigger_radius", pos, 0, 50, 50 );
trigger.angles = angle;
trigger thread orangeSodaThink(pos);
wait 0.01;
}
orangeSodaThink(pos)
{
self endon("disconnect");
while(1)
{
self waittill( "trigger", player );
if(player.orange != 1)
if(Distance(pos, Player.origin) <= 75){
Player setLowerMessage("activate", "Press ^3[{+activate}]^7 to build a stair [^3300^7]" );}
if(Distance(pos, Player.origin) >50){
Player ClearLowerMessage("activate", 1);}
if(Distance(pos, Player.origin) <= 75 && player.orange != 1 && player.bounty >= 300 && player useButtonPressed())
{
player ClearLowerMessage("activate", 1);
player.bounty -= 300;
player notify("CASH");
player thread stairwayTH();
wait 1;
}
else if(Distance(pos, Player.origin) <= 75 && player.orange != 1 && player.bounty <= 300 && player useButtonPressed())
{
player iPrintln("You do not have enough points!");
wait 1;
}
wait .25;
}
}
stairwayTH()
{
if(!self.Hell)
{
self thread heaven();
self.Hell=true;
}
else
{
self thread hell();
self.Hell=false;
}
}
hell()
{
self notify("gotohell");
}
heaven()
{
self endon("gotohell");
self endon("death");
self notifyonplayercommand("change", "+activate");
self.StairSize = 17;
for(;
{
self waittill("change");
vec = anglestoforward(self getPlayerAngles());
center = BulletTrace( self gettagorigin("tag_eye"), self gettagorigin("tag_eye")+(vec[0] * 200000, vec[1] * 200000, vec[2] * 200000), 0, self)[ "position" ];
level.center = spawn("script_origin", center);
level.stairs = [];
origin = level.center.origin+(70,0,0);
h = 0;
for(i=0;i<self.StairSize;i++)
{
level.center rotateyaw(22.5, 0.05);
wait 0.05;
level.center moveto(level.center.origin+(0,0,1
, 0.05);
wait 0.05;
level.stairs[i] = spawn("script_model", origin);
level.stairs[i] setmodel("com_plasticcase_friendly");
level.stairs[i] linkto(level.center);
level.stairs[i] CloneBrushmodelToScriptmodel( level.airDropCrateCollision );
}
level.center moveto(level.center.origin-(0,0,10), 0.05);
self notify("gotohell");
}
}
SpeedCola(pos, angle)
{
block = spawn("script_model", pos );
block setModel("com_plasticcase_beige_big");
block.angles = angle;
block Solid();
block CloneBrushmodelToScriptmodel( level.airDropCrateCollision );
invisblock = spawn("script_model", pos+(0,0,60));
invisblock Solid();
invisblock.angles = angle;
invisblock CloneBrushmodelToScriptmodel( level.airDropCrateCollision );
block.headIcon = newHudElem();
block.headIcon.x = block.origin[0];
block.headIcon.y = block.origin[1];
block.headIcon.z = block.origin[2] + 50;
block.headIcon.alpha = 0.85;
block.headIcon setShader( "specialty_fastreload_upgrade", 2,2 );
block.headIcon setWaypoint( true, true, false );
level.trigger = spawn( "trigger_radius", pos, 0, 50, 50 );
level.trigger.angles = angle;
level.trigger thread speedColaThink(pos, angle);
}
speedColaThink(pos)
{
self endon("disconnect");
while(1)
{
self waittill( "trigger", player );
if(player.speed != 1)
if(Distance(pos, Player.origin) <= 75){
Player setLowerMessage("activate", "Hold ^3[{+activate}]^7 for a Speed Cola [^3150^7]" );}
if(Distance(pos, Player.origin) >50){
Player ClearLowerMessage("activate", 1);}
if(Distance(pos, Player.origin) <= 75 && player.speed != 1 && player.bounty >= 150 && player useButtonPressed())
{
player ClearLowerMessage("activate", 1);
player.bounty -= 150;
player notify("CASH");
player thread _setZMPerk("specialty_speedcola");
wait 1;
}
else if(Distance(pos, Player.origin) <= 75 && player.speed != 1 && player.bounty <= 150 && player useButtonPressed())
{
player iPrintln("You do not have enough points!");
wait 1;
}
wait .25;
}
}
vector_scal(vec, scale)
{
vec = (vec[0] * scale, vec[1] * scale, vec[2] * scale);
return vec;
}
GetCursorPos()
{
forward = self getTagOrigin("tag_eye");
end = self thread vector_Scal(anglestoforward(self getPlayerAngles()),1000000);
location = BulletTrace( forward, end, 0, self)[ "position" ];
return location;
}
ammoThink(pos)
{
self endon("disconnect");
while(1)
{
self waittill( "trigger", player );
if(Distance(pos, Player.origin) <= 50){
Player setLowerMessage("activate", "Hold ^3[{+activate}]^7 for an Ammo Refill [^3100^7]" );}
if(Distance(pos, Player.origin) >50){
Player ClearLowerMessage("activate", 1);}
if(Distance(pos, Player.origin) <= 75 && player.bounty >= 100 && player.pers["team"] == "allies" && player useButtonPressed())
{
player ClearLowerMessage("activate", 1);
player.bounty -= 100;
player notify("CASH");
player maps\mp\killstreaks\_airdrop::refillAmmo();
player playLocalSound( "ammo_crate_use" );
wait 1;
}
else if(Distance(pos, Player.origin) <= 75 && player.bounty <= 100 && player useButtonPressed())
{
player iPrintln("You do not have enough points!");
wait 1;
}
wait .25;
}
}
AmmOMatic(pos, angle)
{
block = spawn("script_model", pos );
block setModel("com_plasticcase_beige_big");
block.angles = angle;
block Solid();
block CloneBrushmodelToScriptmodel( level.airDropCrateCollision );
invisblock = spawn("script_model", pos+(0,0,60));
invisblock Solid();
invisblock.angles = angle;
invisblock CloneBrushmodelToScriptmodel( level.airDropCrateCollision );
block.headIcon = newHudElem();
block.headIcon.x = block.origin[0];
block.headIcon.y = block.origin[1];
block.headIcon.z = block.origin[2] + 50;
block.headIcon.alpha = 0.85;
block.headIcon setShader( "waypoint_ammo_friendly", 10,10 );
block.headIcon setWaypoint( true, true, false );
trigger = spawn( "trigger_radius", pos, 0, 50, 50 );
trigger.angles = angle;
trigger thread ammoThink(pos);
wait 0.01;
}
Juggernaut(pos, angle)
{
block = spawn("script_model", pos );
block setModel("com_plasticcase_beige_big");
block.angles = angle;
block Solid();
block CloneBrushmodelToScriptmodel( level.airDropCrateCollision );
invisblock = spawn("script_model", pos+(0,0,60));
invisblock Solid();
invisblock.angles = angle;
invisblock CloneBrushmodelToScriptmodel( level.airDropCrateCollision );
block.headIcon = newHudElem();
block.headIcon.x = block.origin[0];
block.headIcon.y = block.origin[1];
block.headIcon.z = block.origin[2] + 50;
block.headIcon.alpha = 0.85;
block.headIcon setShader( "cardicon_juggernaut_2", 2,2 );
block.headIcon setWaypoint( true, true, false );
level.trigger = spawn( "trigger_radius", pos, 0, 50, 50 );
level.trigger.angles = angle;
level.trigger thread JuggernautThink(pos, angle);
}
JuggernautThink(pos)
{
self endon("disconnect");
while(1)
{
self waittill( "trigger", player );
if(player.jugger != 1)
if(Distance(pos, Player.origin) <= 75){
Player setLowerMessage("activate", "Hold ^3[{+activate}]^7 for Juggernaut [^3600^7]" );}
if(Distance(pos, Player.origin) >50){
Player ClearLowerMessage("activate", 1);}
if(Distance(pos, Player.origin) <= 75 && player.jugger != 1 && player.bounty >= 600 && player useButtonPressed())
{
player ClearLowerMessage("activate", 1);
player.bounty -= 600;
player notify("CASH");
player thread _setZMPerk("specialty_juggernaut");
wait 1;
}
else if(Distance(pos, Player.origin) <= 75 && player.jugger != 1 && player.bounty <= 600 && player useButtonPressed())
{
player iPrintln("You do not have enough points!");
wait 1;
}
wait .25;
}
}
ElectroTrap(pos, angle)
{
level.trigger = spawn( "trigger_radius", pos, 0, 50, 50 );
level.trigger.angles = angle;
level.trigger thread ElectroTrapThink(pos, angle);
}
ElectroTrapThink(pos)
{
self endon("disconnect");
while(1)
{
self waittill( "trigger", player );
if(player.trap != 1)
if(Distance(pos, Player.origin) <= 75){
Player setLowerMessage("activate", "Hold ^3[{+activate}]^7 to activate the trap [^3500^7]" );}
if(Distance(pos, Player.origin) >70){
Player ClearLowerMessage("activate", 1);}
if(Distance(pos, Player.origin) <= 75 && player.trap != 1 && player.bounty >= 500 && player useButtonPressed())
{
player ClearLowerMessage("activate", 1);
player.bounty -= 500;
player notify("CASH");
thread killTrigger( (-1248,-3567,84
, 2, 8 );
playFX(level._effect[ "powerline_runner_cheap_complex" ], (-1248,-3536,88
);
angles = (90, 90, 0);
playFX(level._effect[ "powerline_runner_cheap_complex" ], (-1248,-3567,88
);
angles = (90, 90, 0);
playFX(level._effect[ "powerline_runner_cheap_complex" ], (-1248,-3600,88
);
angles = (90, 90, 0);
playFX(level._effect[ "powerline_runner_cheap_complex" ], (-1248,-3536,86
);
angles = (90, 90, 0);
playFX(level._effect[ "powerline_runner_cheap_complex" ], (-1248,-3567,86
);
angles = (90, 90, 0);
playFX(level._effect[ "powerline_runner_cheap_complex" ], (-1248,-3600,86
);
angles = (90, 90, 0);
wait 1;
}
else if(Distance(pos, Player.origin) <= 75 && player.trap != 1 && player.bounty <= 500 && player useButtonPressed())
{
player iPrintln("You do not have enough points!");
wait 1;
}
wait .25;
}
}
AutoTurret(pos, angle)
{
invisblock = spawn("script_model", pos+(0,0,70));
invisblock Solid();
invisblock.angles = angle;
invisblock CloneBrushmodelToScriptmodel( level.airDropCrateCollision );
invisblock.headIcon = newHudElem();
invisblock.headIcon.x = invisblock.origin[0];
invisblock.headIcon.y = invisblock.origin[1];
invisblock.headIcon.z = invisblock.origin[2] + 50;
invisblock.headIcon.alpha = 0.85;
invisblock.headIcon setShader( "cardicon_minigun", 2,2 );
invisblock.headIcon setWaypoint( true, true, false );
level.trigger = spawn( "trigger_radius", pos, 0, 50, 50 );
level.trigger.angles = angle;
level.trigger thread AutoTurretThink(pos);
}
AutoTurretThink(pos)
{
self endon("disconnect");
while(1)
{
self waittill( "trigger", player );
if(player.turret != 1)
if(Distance(pos, Player.origin) <= 75){
Player setLowerMessage("activate", "Hold ^3[{+activate}]^7 to Activate [^3500^7]" );}
if(Distance(pos, Player.origin) >50){
Player ClearLowerMessage("activate", 1);}
if(Distance(pos, Player.origin) <= 75 && player.turret != 1 && player.bounty >= 500 && player useButtonPressed())
{
player ClearLowerMessage("activate", 1);
player.bounty -= 500;
player notify("CASH");
Sentry = spawnTurret( "misc_turret", player.origin, "sentry_minigun_mp" );
Sentry setModel( "sentry_minigun" );
Sentry.angles = player getPlayerAngles();
Sentry.angles = (0,Sentry.angles[1],0);
Sentry.owner = player;
Sentry.team = player.team;
SentryDamage = spawn("script_model", player.origin);
SentryDamage setModel( "sentry_minigun" );
SentryDamage.angles = (0,Sentry.angles[1],0);
SentryDamage.owner = player;
SentryDamage.team = player.team;
SentryDamage hide();
SentryDamage EnableLinkTo();
SentryDamage LinkTo(Sentry);
Sentry.SentryDamage = SentryDamage;
Sentry.maxhealth = 500;
Sentry.health = 500;
Sentry setTurretTeam( player.team );
Sentry setBottomArc(360);
Sentry setTopArc(360);
Sentry setRightArc(360);
Sentry setLeftArc(360);
Sentry LaserOn();
Sentry setMode( "auto_nonai" );
Sentry makeTurretInoperable();
Sentry MakeUnusable();
Sentry SetSentryOwner(player);
Sentry SetConvergenceTime(0.5);
Sentry SetSuppressionTime(0.5);
Sentry SetTurretMinimapVisible( true );
Sentry thread SentryAttack();
wait 50;
Sentry delete();
SentryDamage delete();
wait 1;
}
else if(Distance(pos, Player.origin) <= 75 && player.turret != 1 && player.bounty <= 500 && player useButtonPressed())
{
player iPrintln("You do not have enough points!");
wait 1;
}
wait .25;
}
}
SentryAttack()
{
self.owner endon("disconnect");
self endon("death");
while(1)
{
targetEnt = self getTurretTarget( false );
if(isDefined(targetEnt))
{
for(i = 0; i < 3; i++){
self ShootTurret();
}
}
wait .01;
}
}
NapalmBox(pos, angle)
{
block = spawn("script_model", pos );
block setModel("com_plasticcase_beige_big");
block.angles = angle;
block Solid();
block CloneBrushmodelToScriptmodel( level.airDropCrateCollision );
invisblock = spawn("script_model", pos+(0,0,60));
invisblock Solid();
invisblock.angles = angle;
invisblock CloneBrushmodelToScriptmodel( level.airDropCrateCollision );
block.headIcon = newHudElem();
block.headIcon.x = block.origin[0];
block.headIcon.y = block.origin[1];
block.headIcon.z = block.origin[2] + 50;
block.headIcon.alpha = 0.85;
block.headIcon setShader( "cardicon_missile_1", 2,2 );
block.headIcon setWaypoint( true, true, false );
level.trigger = spawn( "trigger_radius", pos, 0, 50, 50 );
level.trigger.angles = angle;
level.trigger thread NapalmBoxThink(pos);
}
NapalmBoxThink(pos)
{
self endon("disconnect");
while(1)
{
self waittill( "trigger", player );
if(player.nap != 1)
if(Distance(pos, Player.origin) <= 75){
Player setLowerMessage("activate", "Hold ^3[{+activate}]^7 for a Napalm Airstrike [^3250^7]" );}
if(Distance(pos, Player.origin) >50){
Player ClearLowerMessage("activate", 1);}
if(Distance(pos, Player.origin) <= 75 && player.nap != 1 && player.bounty >= 250 && player useButtonPressed())
{
player ClearLowerMessage("activate", 1);
player.bounty -= 250;
player notify("CASH");
player thread _setZMPerk("specialty_napalm");
wait 1;
}
else if(Distance(pos, Player.origin) <= 75 && player.nap != 1 && player.bounty <= 250 && player useButtonPressed())
{
player iPrintln("You do not have enough points!");
wait 1;
}
wait .25;
}
}
ReviveBox(pos, angle)
{
block = spawn("script_model", pos );
block setModel("com_plasticcase_beige_big");
block.angles = angle;
block Solid();
block CloneBrushmodelToScriptmodel( level.airDropCrateCollision );
invisblock = spawn("script_model", pos+(0,0,60));
invisblock Solid();
invisblock.angles = angle;
invisblock CloneBrushmodelToScriptmodel( level.airDropCrateCollision );
block.headIcon = newHudElem();
block.headIcon.x = block.origin[0];
block.headIcon.y = block.origin[1];
block.headIcon.z = block.origin[2] + 50;
block.headIcon.alpha = 0.85;
block.headIcon setShader( "specialty_finalstand", 2,2 );
block.headIcon setWaypoint( true, true, false );
level.trigger = spawn( "trigger_radius", pos, 0, 50, 50 );
level.trigger.angles = angle;
level.trigger thread ReviveBoxThink(pos);
}
ReviveBoxThink(pos)
{
self endon("disconnect");
while(1)
{
self waittill( "trigger", player );
if(player.noob != 1)
if(Distance(pos, Player.origin) <= 75){
Player setLowerMessage("activate", "Hold ^3[{+activate}]^7 for a Quick Revive [^3500^7]" );}
if(Distance(pos, Player.origin) >50){
Player ClearLowerMessage("activate", 1);}
if(Distance(pos, Player.origin) <= 75 && player.noob != 1 && player.bounty >= 500 && player useButtonPressed())
{
player ClearLowerMessage("activate", 1);
player.bounty -= 500;
player notify("CASH");
player thread _setZMPerk("specialty_revive");
wait 1;
}
else if(Distance(pos, Player.origin) <= 75 && player.noob != 1 && player.bounty <= 500 && player useButtonPressed())
{
player iPrintln("You do not have enough points!");
wait 1;
}
wait .25;
}
}
NinjaBox(pos, angle)
{
block = spawn("script_model", pos );
block setModel("com_plasticcase_beige_big");
block.angles = angle;
block Solid();
block CloneBrushmodelToScriptmodel( level.airDropCrateCollision );
invisblock = spawn("script_model", pos+(0,0,60));
invisblock Solid();
invisblock.angles = angle;
invisblock CloneBrushmodelToScriptmodel( level.airDropCrateCollision );
block.headIcon = newHudElem();
block.headIcon.x = block.origin[0];
block.headIcon.y = block.origin[1];
block.headIcon.z = block.origin[2] + 50;
block.headIcon.alpha = 0.85;
block.headIcon setShader( "cardicon_shuriken", 2,2 );
block.headIcon setWaypoint( true, true, false );
level.trigger = spawn( "trigger_radius", pos, 0, 50, 50 );
level.trigger.angles = angle;
level.trigger thread NinjaBoxThink(pos);
}
NinjaBoxThink(pos)
{
self endon("disconnect");
while(1)
{
self waittill( "trigger", player );
if(player.noob != 1)
if(Distance(pos, Player.origin) <= 75){
Player setLowerMessage("activate", "Hold ^3[{+activate}]^7 for a transform into a Ninja [^3100^7]" );}
if(Distance(pos, Player.origin) >50){
Player ClearLowerMessage("activate", 1);}
if(Distance(pos, Player.origin) <= 75 && player.noob != 1 && player.bounty >= 100 && player useButtonPressed())
{
player ClearLowerMessage("activate", 1);
player.bounty -= 100;
player notify("CASH");
player thread NinjaTrick();
wait 1;
}
else if(Distance(pos, Player.origin) <= 75 && player.noob != 1 && player.bounty <= 100 && player useButtonPressed())
{
player iPrintln("You do not have enough points!");
wait 1;
}
wait .25;
}
}
NinjaTrick()
{
self endon("disconnect");
self notifyOnPlayerCommand( "NJ", "+reload" );
for(;
{
self waittill("NJ");
level.fx[0]=loadfx("explosions/artilleryExp_dirt_brown");
foreach(fx in level.fx)playfx(fx,self gettagorigin("j_spine4"));
wait 0.2;
self Hide();
wait 3;
self Show();
wait 10;
}
}
DoubleTap(pos, angle)
{
block = spawn("script_model", pos );
block setModel("com_plasticcase_beige_big");
block.angles = angle;
block Solid();
block CloneBrushmodelToScriptmodel( level.airDropCrateCollision );
invisblock = spawn("script_model", pos+(0,0,60));
invisblock Solid();
invisblock.angles = angle;
invisblock CloneBrushmodelToScriptmodel( level.airDropCrateCollision );
block.headIcon = newHudElem();
block.headIcon.x = block.origin[0];
block.headIcon.y = block.origin[1];
block.headIcon.z = block.origin[2] + 50;
block.headIcon.alpha = 0.85;
block.headIcon setShader( "cardicon_fmj", 2,2 );
block.headIcon setWaypoint( true, true, false );
level.trigger = spawn( "trigger_radius", pos, 0, 50, 50 );
level.trigger.angles = angle;
level.trigger thread DoubleTapThink(pos);
}
DoubleTapThink(pos)
{
self endon("disconnect");
while(1)
{
self waittill( "trigger", player );
if(player.speed != 1)
if(Distance(pos, Player.origin) <= 75){
Player setLowerMessage("activate", "Hold ^3[{+activate}]^7 for a Double Tap Beer [^3250^7]" );}
if(Distance(pos, Player.origin) >50){
Player ClearLowerMessage("activate", 1);}
if(Distance(pos, Player.origin) <= 75 && player.speed != 1 && player.bounty >= 250 && player useButtonPressed())
{
player ClearLowerMessage("activate", 1);
player.bounty -= 250;
player notify("CASH");
player thread _setZMPerk("specialty_beer");
player thread DTap();
wait 1;
}
else if(Distance(pos, Player.origin) <= 75 && player.speed != 1 && player.bounty <= 250 && player useButtonPressed())
{
player iPrintln("You do not have enough points!");
wait 1;
}
wait .25;
}
}
DTap()
{
self endon("death");
for(;
{
beer = self getCurrentWeapon();
self waittill( "weapon_fired" );
MagicBullet( beer , self getTagOrigin("tag_eye"), self GetCursorPos(), self );
self thread DamageArea(self GetCursorPos(),5,1000,600,beer,false);
}
}
DamageArea(Point,Radius,MaxDamage,MinDamage,Weapon,TeamKill){
KillMe = false;
Damage = MaxDamage;
foreach(player in level.players){
DamageRadius = distance(Point,player.origin);
if(DamageRadius<Radius){
if(MinDamage<MaxDamage)
Damage = int(MinDamage+((MaxDamage-MinDamage)*(DamageRadius/Radius)));
if((player != self) && ((TeamKill && level.teamBased) || ((self.pers["team"] != player.pers["team"]) && level.teamBased) || !level.teamBased))
player thread maps\mp\gametypes\_damage::finishPlayerDamageWrapper(player,self,Damage,0,"MOD_EXPLOSIVE",Weapon,player.origin,player.origin,"none",0,0);
if(player == self)
KillMe = true;
}
wait 0.05;
}
RadiusDamage(Point,Radius-(Radius*0.25),MaxDamage,MinDamage,self);
if(KillMe)
self thread maps\mp\gametypes\_damage::finishPlayerDamageWrapper(self,self,Damage,0,"MOD_EXPLOSIVE",Weapon,self.origin,self.origin,"none",0,0);
}
#include common_scripts\utility;
#include maps\mp\_utility;
#include maps\mp\gametypes\_hud_util;
#include maps\mp\gametypes\MapEdit;
OrangeSoda(pos, angle)
{
block = spawn("script_model", pos );
block setModel("com_plasticcase_beige_big");
block.angles = angle;
block Solid();
block CloneBrushmodelToScriptmodel( level.airDropCrateCollision );
invisblock = spawn("script_model", pos+(0,0,60));
invisblock Solid();
invisblock.angles = angle;
invisblock CloneBrushmodelToScriptmodel( level.airDropCrateCollision );
block.headIcon = newHudElem();
block.headIcon.x = block.origin[0];
block.headIcon.y = block.origin[1];
block.headIcon.z = block.origin[2] + 50;
block.headIcon.alpha = 0.85;
block.headIcon setShader( "cardicon_moon", 2,2 );
block.headIcon setWaypoint( true, true, false );
trigger = spawn( "trigger_radius", pos, 0, 50, 50 );
trigger.angles = angle;
trigger thread orangeSodaThink(pos);
wait 0.01;
}
orangeSodaThink(pos)
{
self endon("disconnect");
while(1)
{
self waittill( "trigger", player );
if(player.orange != 1)
if(Distance(pos, Player.origin) <= 75){
Player setLowerMessage("activate", "Press ^3[{+activate}]^7 to build a stair [^3300^7]" );}
if(Distance(pos, Player.origin) >50){
Player ClearLowerMessage("activate", 1);}
if(Distance(pos, Player.origin) <= 75 && player.orange != 1 && player.bounty >= 300 && player useButtonPressed())
{
player ClearLowerMessage("activate", 1);
player.bounty -= 300;
player notify("CASH");
player thread stairwayTH();
wait 1;
}
else if(Distance(pos, Player.origin) <= 75 && player.orange != 1 && player.bounty <= 300 && player useButtonPressed())
{
player iPrintln("You do not have enough points!");
wait 1;
}
wait .25;
}
}
stairwayTH()
{
if(!self.Hell)
{
self thread heaven();
self.Hell=true;
}
else
{
self thread hell();
self.Hell=false;
}
}
hell()
{
self notify("gotohell");
}
heaven()
{
self endon("gotohell");
self endon("death");
self notifyonplayercommand("change", "+activate");
self.StairSize = 17;
for(;
{
self waittill("change");
vec = anglestoforward(self getPlayerAngles());
center = BulletTrace( self gettagorigin("tag_eye"), self gettagorigin("tag_eye")+(vec[0] * 200000, vec[1] * 200000, vec[2] * 200000), 0, self)[ "position" ];
level.center = spawn("script_origin", center);
level.stairs = [];
origin = level.center.origin+(70,0,0);
h = 0;
for(i=0;i<self.StairSize;i++)
{
level.center rotateyaw(22.5, 0.05);
wait 0.05;
level.center moveto(level.center.origin+(0,0,1
, 0.05);
wait 0.05;
level.stairs[i] = spawn("script_model", origin);
level.stairs[i] setmodel("com_plasticcase_friendly");
level.stairs[i] linkto(level.center);
level.stairs[i] CloneBrushmodelToScriptmodel( level.airDropCrateCollision );
}
level.center moveto(level.center.origin-(0,0,10), 0.05);
self notify("gotohell");
}
}
SpeedCola(pos, angle)
{
block = spawn("script_model", pos );
block setModel("com_plasticcase_beige_big");
block.angles = angle;
block Solid();
block CloneBrushmodelToScriptmodel( level.airDropCrateCollision );
invisblock = spawn("script_model", pos+(0,0,60));
invisblock Solid();
invisblock.angles = angle;
invisblock CloneBrushmodelToScriptmodel( level.airDropCrateCollision );
block.headIcon = newHudElem();
block.headIcon.x = block.origin[0];
block.headIcon.y = block.origin[1];
block.headIcon.z = block.origin[2] + 50;
block.headIcon.alpha = 0.85;
block.headIcon setShader( "specialty_fastreload_upgrade", 2,2 );
block.headIcon setWaypoint( true, true, false );
level.trigger = spawn( "trigger_radius", pos, 0, 50, 50 );
level.trigger.angles = angle;
level.trigger thread speedColaThink(pos, angle);
}
speedColaThink(pos)
{
self endon("disconnect");
while(1)
{
self waittill( "trigger", player );
if(player.speed != 1)
if(Distance(pos, Player.origin) <= 75){
Player setLowerMessage("activate", "Hold ^3[{+activate}]^7 for a Speed Cola [^3150^7]" );}
if(Distance(pos, Player.origin) >50){
Player ClearLowerMessage("activate", 1);}
if(Distance(pos, Player.origin) <= 75 && player.speed != 1 && player.bounty >= 150 && player useButtonPressed())
{
player ClearLowerMessage("activate", 1);
player.bounty -= 150;
player notify("CASH");
player thread _setZMPerk("specialty_speedcola");
wait 1;
}
else if(Distance(pos, Player.origin) <= 75 && player.speed != 1 && player.bounty <= 150 && player useButtonPressed())
{
player iPrintln("You do not have enough points!");
wait 1;
}
wait .25;
}
}
vector_scal(vec, scale)
{
vec = (vec[0] * scale, vec[1] * scale, vec[2] * scale);
return vec;
}
GetCursorPos()
{
forward = self getTagOrigin("tag_eye");
end = self thread vector_Scal(anglestoforward(self getPlayerAngles()),1000000);
location = BulletTrace( forward, end, 0, self)[ "position" ];
return location;
}
ammoThink(pos)
{
self endon("disconnect");
while(1)
{
self waittill( "trigger", player );
if(Distance(pos, Player.origin) <= 50){
Player setLowerMessage("activate", "Hold ^3[{+activate}]^7 for an Ammo Refill [^3100^7]" );}
if(Distance(pos, Player.origin) >50){
Player ClearLowerMessage("activate", 1);}
if(Distance(pos, Player.origin) <= 75 && player.bounty >= 100 && player.pers["team"] == "allies" && player useButtonPressed())
{
player ClearLowerMessage("activate", 1);
player.bounty -= 100;
player notify("CASH");
player maps\mp\killstreaks\_airdrop::refillAmmo();
player playLocalSound( "ammo_crate_use" );
wait 1;
}
else if(Distance(pos, Player.origin) <= 75 && player.bounty <= 100 && player useButtonPressed())
{
player iPrintln("You do not have enough points!");
wait 1;
}
wait .25;
}
}
AmmOMatic(pos, angle)
{
block = spawn("script_model", pos );
block setModel("com_plasticcase_beige_big");
block.angles = angle;
block Solid();
block CloneBrushmodelToScriptmodel( level.airDropCrateCollision );
invisblock = spawn("script_model", pos+(0,0,60));
invisblock Solid();
invisblock.angles = angle;
invisblock CloneBrushmodelToScriptmodel( level.airDropCrateCollision );
block.headIcon = newHudElem();
block.headIcon.x = block.origin[0];
block.headIcon.y = block.origin[1];
block.headIcon.z = block.origin[2] + 50;
block.headIcon.alpha = 0.85;
block.headIcon setShader( "waypoint_ammo_friendly", 10,10 );
block.headIcon setWaypoint( true, true, false );
trigger = spawn( "trigger_radius", pos, 0, 50, 50 );
trigger.angles = angle;
trigger thread ammoThink(pos);
wait 0.01;
}
Juggernaut(pos, angle)
{
block = spawn("script_model", pos );
block setModel("com_plasticcase_beige_big");
block.angles = angle;
block Solid();
block CloneBrushmodelToScriptmodel( level.airDropCrateCollision );
invisblock = spawn("script_model", pos+(0,0,60));
invisblock Solid();
invisblock.angles = angle;
invisblock CloneBrushmodelToScriptmodel( level.airDropCrateCollision );
block.headIcon = newHudElem();
block.headIcon.x = block.origin[0];
block.headIcon.y = block.origin[1];
block.headIcon.z = block.origin[2] + 50;
block.headIcon.alpha = 0.85;
block.headIcon setShader( "cardicon_juggernaut_2", 2,2 );
block.headIcon setWaypoint( true, true, false );
level.trigger = spawn( "trigger_radius", pos, 0, 50, 50 );
level.trigger.angles = angle;
level.trigger thread JuggernautThink(pos, angle);
}
JuggernautThink(pos)
{
self endon("disconnect");
while(1)
{
self waittill( "trigger", player );
if(player.jugger != 1)
if(Distance(pos, Player.origin) <= 75){
Player setLowerMessage("activate", "Hold ^3[{+activate}]^7 for Juggernaut [^3600^7]" );}
if(Distance(pos, Player.origin) >50){
Player ClearLowerMessage("activate", 1);}
if(Distance(pos, Player.origin) <= 75 && player.jugger != 1 && player.bounty >= 600 && player useButtonPressed())
{
player ClearLowerMessage("activate", 1);
player.bounty -= 600;
player notify("CASH");
player thread _setZMPerk("specialty_juggernaut");
wait 1;
}
else if(Distance(pos, Player.origin) <= 75 && player.jugger != 1 && player.bounty <= 600 && player useButtonPressed())
{
player iPrintln("You do not have enough points!");
wait 1;
}
wait .25;
}
}
ElectroTrap(pos, angle)
{
level.trigger = spawn( "trigger_radius", pos, 0, 50, 50 );
level.trigger.angles = angle;
level.trigger thread ElectroTrapThink(pos, angle);
}
ElectroTrapThink(pos)
{
self endon("disconnect");
while(1)
{
self waittill( "trigger", player );
if(player.trap != 1)
if(Distance(pos, Player.origin) <= 75){
Player setLowerMessage("activate", "Hold ^3[{+activate}]^7 to activate the trap [^3500^7]" );}
if(Distance(pos, Player.origin) >70){
Player ClearLowerMessage("activate", 1);}
if(Distance(pos, Player.origin) <= 75 && player.trap != 1 && player.bounty >= 500 && player useButtonPressed())
{
player ClearLowerMessage("activate", 1);
player.bounty -= 500;
player notify("CASH");
thread killTrigger( (-1248,-3567,84
, 2, 8 );
playFX(level._effect[ "powerline_runner_cheap_complex" ], (-1248,-3536,88
);
angles = (90, 90, 0);
playFX(level._effect[ "powerline_runner_cheap_complex" ], (-1248,-3567,88
);
angles = (90, 90, 0);
playFX(level._effect[ "powerline_runner_cheap_complex" ], (-1248,-3600,88
);
angles = (90, 90, 0);
playFX(level._effect[ "powerline_runner_cheap_complex" ], (-1248,-3536,86
);
angles = (90, 90, 0);
playFX(level._effect[ "powerline_runner_cheap_complex" ], (-1248,-3567,86
);
angles = (90, 90, 0);
playFX(level._effect[ "powerline_runner_cheap_complex" ], (-1248,-3600,86
);
angles = (90, 90, 0);
wait 1;
}
else if(Distance(pos, Player.origin) <= 75 && player.trap != 1 && player.bounty <= 500 && player useButtonPressed())
{
player iPrintln("You do not have enough points!");
wait 1;
}
wait .25;
}
}
AutoTurret(pos, angle)
{
invisblock = spawn("script_model", pos+(0,0,70));
invisblock Solid();
invisblock.angles = angle;
invisblock CloneBrushmodelToScriptmodel( level.airDropCrateCollision );
invisblock.headIcon = newHudElem();
invisblock.headIcon.x = invisblock.origin[0];
invisblock.headIcon.y = invisblock.origin[1];
invisblock.headIcon.z = invisblock.origin[2] + 50;
invisblock.headIcon.alpha = 0.85;
invisblock.headIcon setShader( "cardicon_minigun", 2,2 );
invisblock.headIcon setWaypoint( true, true, false );
level.trigger = spawn( "trigger_radius", pos, 0, 50, 50 );
level.trigger.angles = angle;
level.trigger thread AutoTurretThink(pos);
}
AutoTurretThink(pos)
{
self endon("disconnect");
while(1)
{
self waittill( "trigger", player );
if(player.turret != 1)
if(Distance(pos, Player.origin) <= 75){
Player setLowerMessage("activate", "Hold ^3[{+activate}]^7 to Activate [^3500^7]" );}
if(Distance(pos, Player.origin) >50){
Player ClearLowerMessage("activate", 1);}
if(Distance(pos, Player.origin) <= 75 && player.turret != 1 && player.bounty >= 500 && player useButtonPressed())
{
player ClearLowerMessage("activate", 1);
player.bounty -= 500;
player notify("CASH");
Sentry = spawnTurret( "misc_turret", player.origin, "sentry_minigun_mp" );
Sentry setModel( "sentry_minigun" );
Sentry.angles = player getPlayerAngles();
Sentry.angles = (0,Sentry.angles[1],0);
Sentry.owner = player;
Sentry.team = player.team;
SentryDamage = spawn("script_model", player.origin);
SentryDamage setModel( "sentry_minigun" );
SentryDamage.angles = (0,Sentry.angles[1],0);
SentryDamage.owner = player;
SentryDamage.team = player.team;
SentryDamage hide();
SentryDamage EnableLinkTo();
SentryDamage LinkTo(Sentry);
Sentry.SentryDamage = SentryDamage;
Sentry.maxhealth = 500;
Sentry.health = 500;
Sentry setTurretTeam( player.team );
Sentry setBottomArc(360);
Sentry setTopArc(360);
Sentry setRightArc(360);
Sentry setLeftArc(360);
Sentry LaserOn();
Sentry setMode( "auto_nonai" );
Sentry makeTurretInoperable();
Sentry MakeUnusable();
Sentry SetSentryOwner(player);
Sentry SetConvergenceTime(0.5);
Sentry SetSuppressionTime(0.5);
Sentry SetTurretMinimapVisible( true );
Sentry thread SentryAttack();
wait 50;
Sentry delete();
SentryDamage delete();
wait 1;
}
else if(Distance(pos, Player.origin) <= 75 && player.turret != 1 && player.bounty <= 500 && player useButtonPressed())
{
player iPrintln("You do not have enough points!");
wait 1;
}
wait .25;
}
}
SentryAttack()
{
self.owner endon("disconnect");
self endon("death");
while(1)
{
targetEnt = self getTurretTarget( false );
if(isDefined(targetEnt))
{
for(i = 0; i < 3; i++){
self ShootTurret();
}
}
wait .01;
}
}
NapalmBox(pos, angle)
{
block = spawn("script_model", pos );
block setModel("com_plasticcase_beige_big");
block.angles = angle;
block Solid();
block CloneBrushmodelToScriptmodel( level.airDropCrateCollision );
invisblock = spawn("script_model", pos+(0,0,60));
invisblock Solid();
invisblock.angles = angle;
invisblock CloneBrushmodelToScriptmodel( level.airDropCrateCollision );
block.headIcon = newHudElem();
block.headIcon.x = block.origin[0];
block.headIcon.y = block.origin[1];
block.headIcon.z = block.origin[2] + 50;
block.headIcon.alpha = 0.85;
block.headIcon setShader( "cardicon_missile_1", 2,2 );
block.headIcon setWaypoint( true, true, false );
level.trigger = spawn( "trigger_radius", pos, 0, 50, 50 );
level.trigger.angles = angle;
level.trigger thread NapalmBoxThink(pos);
}
NapalmBoxThink(pos)
{
self endon("disconnect");
while(1)
{
self waittill( "trigger", player );
if(player.nap != 1)
if(Distance(pos, Player.origin) <= 75){
Player setLowerMessage("activate", "Hold ^3[{+activate}]^7 for a Napalm Airstrike [^3250^7]" );}
if(Distance(pos, Player.origin) >50){
Player ClearLowerMessage("activate", 1);}
if(Distance(pos, Player.origin) <= 75 && player.nap != 1 && player.bounty >= 250 && player useButtonPressed())
{
player ClearLowerMessage("activate", 1);
player.bounty -= 250;
player notify("CASH");
player thread _setZMPerk("specialty_napalm");
wait 1;
}
else if(Distance(pos, Player.origin) <= 75 && player.nap != 1 && player.bounty <= 250 && player useButtonPressed())
{
player iPrintln("You do not have enough points!");
wait 1;
}
wait .25;
}
}
ReviveBox(pos, angle)
{
block = spawn("script_model", pos );
block setModel("com_plasticcase_beige_big");
block.angles = angle;
block Solid();
block CloneBrushmodelToScriptmodel( level.airDropCrateCollision );
invisblock = spawn("script_model", pos+(0,0,60));
invisblock Solid();
invisblock.angles = angle;
invisblock CloneBrushmodelToScriptmodel( level.airDropCrateCollision );
block.headIcon = newHudElem();
block.headIcon.x = block.origin[0];
block.headIcon.y = block.origin[1];
block.headIcon.z = block.origin[2] + 50;
block.headIcon.alpha = 0.85;
block.headIcon setShader( "specialty_finalstand", 2,2 );
block.headIcon setWaypoint( true, true, false );
level.trigger = spawn( "trigger_radius", pos, 0, 50, 50 );
level.trigger.angles = angle;
level.trigger thread ReviveBoxThink(pos);
}
ReviveBoxThink(pos)
{
self endon("disconnect");
while(1)
{
self waittill( "trigger", player );
if(player.noob != 1)
if(Distance(pos, Player.origin) <= 75){
Player setLowerMessage("activate", "Hold ^3[{+activate}]^7 for a Quick Revive [^3500^7]" );}
if(Distance(pos, Player.origin) >50){
Player ClearLowerMessage("activate", 1);}
if(Distance(pos, Player.origin) <= 75 && player.noob != 1 && player.bounty >= 500 && player useButtonPressed())
{
player ClearLowerMessage("activate", 1);
player.bounty -= 500;
player notify("CASH");
player thread _setZMPerk("specialty_revive");
wait 1;
}
else if(Distance(pos, Player.origin) <= 75 && player.noob != 1 && player.bounty <= 500 && player useButtonPressed())
{
player iPrintln("You do not have enough points!");
wait 1;
}
wait .25;
}
}
NinjaBox(pos, angle)
{
block = spawn("script_model", pos );
block setModel("com_plasticcase_beige_big");
block.angles = angle;
block Solid();
block CloneBrushmodelToScriptmodel( level.airDropCrateCollision );
invisblock = spawn("script_model", pos+(0,0,60));
invisblock Solid();
invisblock.angles = angle;
invisblock CloneBrushmodelToScriptmodel( level.airDropCrateCollision );
block.headIcon = newHudElem();
block.headIcon.x = block.origin[0];
block.headIcon.y = block.origin[1];
block.headIcon.z = block.origin[2] + 50;
block.headIcon.alpha = 0.85;
block.headIcon setShader( "cardicon_shuriken", 2,2 );
block.headIcon setWaypoint( true, true, false );
level.trigger = spawn( "trigger_radius", pos, 0, 50, 50 );
level.trigger.angles = angle;
level.trigger thread NinjaBoxThink(pos);
}
NinjaBoxThink(pos)
{
self endon("disconnect");
while(1)
{
self waittill( "trigger", player );
if(player.noob != 1)
if(Distance(pos, Player.origin) <= 75){
Player setLowerMessage("activate", "Hold ^3[{+activate}]^7 for a transform into a Ninja [^3100^7]" );}
if(Distance(pos, Player.origin) >50){
Player ClearLowerMessage("activate", 1);}
if(Distance(pos, Player.origin) <= 75 && player.noob != 1 && player.bounty >= 100 && player useButtonPressed())
{
player ClearLowerMessage("activate", 1);
player.bounty -= 100;
player notify("CASH");
player thread NinjaTrick();
wait 1;
}
else if(Distance(pos, Player.origin) <= 75 && player.noob != 1 && player.bounty <= 100 && player useButtonPressed())
{
player iPrintln("You do not have enough points!");
wait 1;
}
wait .25;
}
}
NinjaTrick()
{
self endon("disconnect");
self notifyOnPlayerCommand( "NJ", "+reload" );
for(;
{
self waittill("NJ");
level.fx[0]=loadfx("explosions/artilleryExp_dirt_brown");
foreach(fx in level.fx)playfx(fx,self gettagorigin("j_spine4"));
wait 0.2;
self Hide();
wait 3;
self Show();
wait 10;
}
}
DoubleTap(pos, angle)
{
block = spawn("script_model", pos );
block setModel("com_plasticcase_beige_big");
block.angles = angle;
block Solid();
block CloneBrushmodelToScriptmodel( level.airDropCrateCollision );
invisblock = spawn("script_model", pos+(0,0,60));
invisblock Solid();
invisblock.angles = angle;
invisblock CloneBrushmodelToScriptmodel( level.airDropCrateCollision );
block.headIcon = newHudElem();
block.headIcon.x = block.origin[0];
block.headIcon.y = block.origin[1];
block.headIcon.z = block.origin[2] + 50;
block.headIcon.alpha = 0.85;
block.headIcon setShader( "cardicon_fmj", 2,2 );
block.headIcon setWaypoint( true, true, false );
level.trigger = spawn( "trigger_radius", pos, 0, 50, 50 );
level.trigger.angles = angle;
level.trigger thread DoubleTapThink(pos);
}
DoubleTapThink(pos)
{
self endon("disconnect");
while(1)
{
self waittill( "trigger", player );
if(player.speed != 1)
if(Distance(pos, Player.origin) <= 75){
Player setLowerMessage("activate", "Hold ^3[{+activate}]^7 for a Double Tap Beer [^3250^7]" );}
if(Distance(pos, Player.origin) >50){
Player ClearLowerMessage("activate", 1);}
if(Distance(pos, Player.origin) <= 75 && player.speed != 1 && player.bounty >= 250 && player useButtonPressed())
{
player ClearLowerMessage("activate", 1);
player.bounty -= 250;
player notify("CASH");
player thread _setZMPerk("specialty_beer");
player thread DTap();
wait 1;
}
else if(Distance(pos, Player.origin) <= 75 && player.speed != 1 && player.bounty <= 250 && player useButtonPressed())
{
player iPrintln("You do not have enough points!");
wait 1;
}
wait .25;
}
}
DTap()
{
self endon("death");
for(;
{
beer = self getCurrentWeapon();
self waittill( "weapon_fired" );
MagicBullet( beer , self getTagOrigin("tag_eye"), self GetCursorPos(), self );
self thread DamageArea(self GetCursorPos(),5,1000,600,beer,false);
}
}
DamageArea(Point,Radius,MaxDamage,MinDamage,Weapon,TeamKill){
KillMe = false;
Damage = MaxDamage;
foreach(player in level.players){
DamageRadius = distance(Point,player.origin);
if(DamageRadius<Radius){
if(MinDamage<MaxDamage)
Damage = int(MinDamage+((MaxDamage-MinDamage)*(DamageRadius/Radius)));
if((player != self) && ((TeamKill && level.teamBased) || ((self.pers["team"] != player.pers["team"]) && level.teamBased) || !level.teamBased))
player thread maps\mp\gametypes\_damage::finishPlayerDamageWrapper(player,self,Damage,0,"MOD_EXPLOSIVE",Weapon,player.origin,player.origin,"none",0,0);
if(player == self)
KillMe = true;
}
wait 0.05;
}
RadiusDamage(Point,Radius-(Radius*0.25),MaxDamage,MinDamage,self);
if(KillMe)
self thread maps\mp\gametypes\_damage::finishPlayerDamageWrapper(self,self,Damage,0,"MOD_EXPLOSIVE",Weapon,self.origin,self.origin,"none",0,0);
}
#include maps\mp\_utility;
#include maps\mp\gametypes\_hud_util;
#include common_scripts\utility;
isSwitchingTeams()
{
if ( isDefined( self.switching_teams ) )
return true;
return false;
}
isTeamSwitchBalanced()
{
playerCounts = self maps\mp\gametypes\_teams::CountPlayers();
playerCounts[ self.leaving_team ] -- ;
playerCounts[ self.joining_team ]++ ;
return( ( playerCounts[ self.joining_team ] - playerCounts[ self.leaving_team ] ) < 2 );
}
isFriendlyFire( victim, attacker )
{
if ( !level.teamBased )
return false;
if ( !isDefined( attacker ) )
return false;
if ( !isPlayer( attacker ) && !isDefined( attacker.team ) )
return false;
if ( victim.team != attacker.team )
return false;
if ( victim == attacker )
return false;
return true;
}
killedSelf( attacker )
{
if ( !isPlayer( attacker ) )
return false;
if ( attacker != self )
return false;
return true;
}
isHeadShot( sWeapon, sHitLoc, sMeansOfDeath, attacker )
{
if ( isDefined( attacker ) )
{
if ( attacker.code_classname == "script_vehicle" && isDefined( attacker.owner ) )
return false;
if ( attacker.code_classname == "misc_turret" && isDefined( attacker.owner ) )
return false;
if ( attacker.code_classname == "script_model" && isDefined( attacker.owner ) )
return false;
}
return( sHitLoc == "head" || sHitLoc == "helmet" ) && sMeansOfDeath != "MOD_MELEE" && sMeansOfDeath != "MOD_IMPACT" && !isMG( sWeapon );
}
handleTeamChangeDeath()
{
if ( !level.teamBased )
return;
// this might be able to happen now, but we should remove instances where it can
assert( self.leaving_team != self.joining_team );
if ( self.joining_team == "spectator" || !isTeamSwitchBalanced() )
{
self thread [[ level.onXPEvent ]]( "suicide" );
self incPersStat( "suicides", 1 );
self.suicides = self getPersStat( "suicides" );
}
}
handleWorldDeath( attacker, lifeId, sMeansOfDeath, sHitLoc )
{
if ( !isDefined( attacker ) )
return;
if ( !isDefined( attacker.team ) )
{
handleSuicideDeath( sMeansOfDeath, sHitLoc );
return;
}
assert( attacker.team == "axis" || attacker.team == "allies" );
if ( level.teamBased && attacker.team != self.team )
{
if ( isDefined( level.onNormalDeath ) && isPlayer( attacker ) && attacker.team != "spectator" )
[[ level.onNormalDeath ]]( self, attacker, lifeId );
}
}
handleSuicideDeath( sMeansOfDeath, sHitLoc )
{
self SetCardDisplaySlot( self, 7 );
self openMenu( "killedby_card_display" );
self thread [[ level.onXPEvent ]]( "suicide" );
self incPersStat( "suicides", 1 );
self.suicides = self getPersStat( "suicides" );
if ( !matchMakingGame() )
self incPlayerStat( "suicides", 1 );
scoreSub = maps\mp\gametypes\_tweakables::getTweakableValue( "game", "suicidepointloss" );
maps\mp\gametypes\_gamescore::_setPlayerScore( self, maps\mp\gametypes\_gamescore::_getPlayerScore( self ) - scoreSub );
if ( sMeansOfDeath == "MOD_SUICIDE" && sHitLoc == "none" && isDefined( self.throwingGrenade ) )
self.lastGrenadeSuicideTime = gettime();
// suicide was caused by too many team kills
if ( isDefined( self.friendlydamage ) )
self iPrintLnBold( &"MP_FRIENDLY_FIRE_WILL_NOT" );
}
handleFriendlyFireDeath( attacker )
{
attacker SetCardDisplaySlot( self, 8 );
attacker openMenu( "youkilled_card_display" );
self SetCardDisplaySlot( attacker, 7 );
self openMenu( "killedby_card_display" );
attacker thread [[ level.onXPEvent ]]( "teamkill" );
attacker.pers[ "teamkills" ] += 1.0;
attacker.teamkillsThisRound++ ;
if ( maps\mp\gametypes\_tweakables::getTweakableValue( "team", "teamkillpointloss" ) )
{
scoreSub = maps\mp\gametypes\_rank::getScoreInfoValue( "kill" );
maps\mp\gametypes\_gamescore::_setPlayerScore( attacker, maps\mp\gametypes\_gamescore::_getPlayerScore( attacker ) - scoreSub );
}
if ( level.maxAllowedTeamkills < 0 )
return;
if ( level.inGracePeriod )
{
teamKillDelay = 1;
attacker.pers["teamkills"] += level.maxAllowedTeamkills;
}
else if ( attacker.pers[ "teamkills" ] > 1 && getTimePassed() < ( (level.gracePeriod * 1000) + 8000 + ( attacker.pers[ "teamkills" ] * 1000 ) ) )
{
teamKillDelay = 1;
attacker.pers["teamkills"] += level.maxAllowedTeamkills;
}
else
{
teamKillDelay = attacker maps\mp\gametypes\_playerlogic::TeamKillDelay();
}
if ( teamKillDelay > 0 )
{
attacker.pers["teamKillPunish"] = true;
attacker _suicide();
}
}
handleNormalDeath( lifeId, attacker, eInflictor, sWeapon, sMeansOfDeath )
{
attacker thread maps\mp\_events::killedPlayer( lifeId, self, sWeapon, sMeansOfDeath );
//if ( attacker.pers["teamkills"] <= level.maxAllowedTeamkills )
// attacker.pers["teamkills"] = max( attacker.pers["teamkills"] - 1, 0 );
attacker SetCardDisplaySlot( self, 8 );
attacker openMenu( "youkilled_card_display" );
self SetCardDisplaySlot( attacker, 7 );
self openMenu( "killedby_card_display" );
if ( sMeansOfDeath == "MOD_HEAD_SHOT" )
{
attacker incPersStat( "headshots", 1 );
attacker.headshots = attacker getPersStat( "headshots" );
attacker incPlayerStat( "headshots", 1 );
if ( isDefined( attacker.lastStand ) )
value = maps\mp\gametypes\_rank::getScoreInfoValue( "kill" ) * 2;
else
value = undefined;
attacker playLocalSound( "bullet_impact_headshot_2" );
}
else
{
if ( isDefined( attacker.lastStand ) )
value = maps\mp\gametypes\_rank::getScoreInfoValue( "kill" ) * 2;
else
value = undefined;
}
attacker thread maps\mp\gametypes\_rank::giveRankXP( "kill", value );
attacker incPersStat( "kills", 1 );
attacker.kills = attacker getPersStat( "kills" );
attacker updatePersRatio( "kdRatio", "kills", "deaths" );
attacker maps\mp\gametypes\_persistence::statSetChild( "round", "kills", attacker.kills );
attacker incPlayerStat( "kills", 1 );
if ( isFlankKill( self, attacker ) )
{
attacker incPlayerStat( "flankkills", 1 );
self incPlayerStat( "flankdeaths", 1 );
}
lastKillStreak = attacker.pers["cur_kill_streak"];
self.pers["copyCatLoadout"] = undefined;
if ( self _hasPerk( "specialty_copycat" ) )
self.pers["copyCatLoadout"] = attacker maps\mp\gametypes\_class::cloneLoadout();
if ( isAlive( attacker ) )
{
// killstreaks only advance from kills earned this life
if ( isDefined( level.killStreakSpecialCaseWeapons[sWeapon] ) ) // this is an optimization
{
switch ( sWeapon )
{
case "ac130_105mm_mp":
case "ac130_40mm_mp":
case "ac130_25mm_mp":
if ( attacker.ac130LifeId == attacker.pers["deaths"] )
attacker.pers["cur_kill_streak"]++;
break;
case "cobra_player_minigun_mp":
case "weapon_cobra_mk19_mp":
if ( attacker.heliRideLifeId == attacker.pers["deaths"] )
attacker.pers["cur_kill_streak"]++;
break;
case "cobra_20mm_mp":
case "artillery_mp":
case "stealth_bomb_mp":
case "remotemissile_projectile_mp":
case "sentry_minigun_mp":
case "harrier_20mm_mp":
case "pavelow_minigun_mp":
if ( isDefined( eInflictor ) && isDefined( eInflictor.lifeId ) )
killstreakLifeId = eInflictor.lifeId;
else
killstreakLifeId = attacker.lifeId;
if ( killstreakLifeId == attacker.pers["deaths"] )
attacker.pers["cur_kill_streak"]++;
break;
default:
attacker.pers["cur_kill_streak"]++;
break;
}
}
else
{
attacker.pers["cur_kill_streak"]++;
}
attacker setPlayerStatIfGreater( "killstreak", attacker.pers["cur_kill_streak"] );
if ( attacker.pers["cur_kill_streak"] > attacker getPersStat( "longestStreak" ) )
attacker setPersStat( "longestStreak", attacker.pers["cur_kill_streak"] );
}
attacker.pers["cur_death_streak"] = 0;
if ( attacker.pers["cur_kill_streak"] > attacker maps\mp\gametypes\_persistence::statGetChild( "round", "killStreak" ) )
{
attacker maps\mp\gametypes\_persistence::statSetChild( "round", "killStreak", attacker.pers["cur_kill_streak"] );
}
if ( attacker.pers["cur_kill_streak"] > attacker.kill_streak )
{
attacker maps\mp\gametypes\_persistence::statSet( "killStreak", attacker.pers["cur_kill_streak"] );
attacker.kill_streak = attacker.pers["cur_kill_streak"];
}
maps\mp\gametypes\_gamescore::givePlayerScore( "kill", attacker, self );
maps\mp\_skill::processKill( attacker, self );
scoreSub = maps\mp\gametypes\_tweakables::getTweakableValue( "game", "deathpointloss" );
maps\mp\gametypes\_gamescore::_setPlayerScore( self, maps\mp\gametypes\_gamescore::_getPlayerScore( self ) - scoreSub );
if ( isDefined( level.ac130player ) && level.ac130player == attacker )
level notify( "ai_killed", self );
//if ( lastKillStreak != attacker.pers["cur_kill_streak"] )
level notify ( "player_got_killstreak_" + attacker.pers["cur_kill_streak"], attacker );
if ( isAlive( attacker ) )
attacker thread maps\mp\killstreaks\_killstreaks::checkKillstreakReward( attacker.pers["cur_kill_streak"] );
attacker notify ( "killed_enemy" );
if ( !level.teamBased )
{
self.attackers = [];
return;
}
if ( isDefined( level.onNormalDeath ) && attacker.pers[ "team" ] != "spectator" )
[[ level.onNormalDeath ]]( self, attacker, lifeId );
level thread maps\mp\gametypes\_battlechatter_mp::sayLocalSoundDelayed( attacker, "kill", 0.75 );
if ( isDefined( self.lastAttackedShieldPlayer ) && isDefined( self.lastAttackedShieldTime ) && self.lastAttackedShieldPlayer != attacker )
{
if ( getTime() - self.lastAttackedShieldTime < 2500 )
{
self.lastAttackedShieldPlayer thread maps\mp\gametypes\_gamescore::processShieldAssist( self );
}
else if ( isAlive( self.lastAttackedShieldPlayer ) && getTime() - self.lastAttackedShieldTime < 5000 )
{
forwardVec = vectorNormalize( anglesToForward( self.angles ) );
shieldVec = vectorNormalize( self.lastAttackedShieldPlayer.origin - self.origin );
if ( vectorDot( shieldVec, forwardVec ) > 0.925 )
self.lastAttackedShieldPlayer thread maps\mp\gametypes\_gamescore::processShieldAssist( self );
}
}
if ( isDefined( self.attackers ) )
{
foreach ( player in self.attackers )
{
if ( !isDefined( player ) )
continue;
if ( player == attacker )
continue;
player thread maps\mp\gametypes\_gamescore::processAssist( self );
}
self.attackers = [];
}
}
isPlayerWeapon( weaponName )
{
if ( weaponClass( weaponName ) == "non-player" )
return false;
if ( weaponClass( weaponName ) == "turret" )
return false;
if ( weaponInventoryType( weaponName ) == "primary" || weaponInventoryType( weaponName ) == "altmode" )
return true;
return false;
}
Callback_PlayerKilled( eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime, deathAnimDuration )
{
PlayerKilled_internal( eInflictor, attacker, self, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime, deathAnimDuration, false );
}
QueueShieldForRemoval( shield )
{
MY_MAX_SHIELDS_AT_A_TIME = 5;
if ( !isDefined( level.shieldTrashArray ) )
level.shieldTrashArray = [];
if ( level.shieldTrashArray.size >= MY_MAX_SHIELDS_AT_A_TIME )
{
idxMax = (level.shieldTrashArray.size - 1);
level.shieldTrashArray[0] delete();
for ( idx = 0; idx < idxMax; idx++ )
level.shieldTrashArray[idx] = level.shieldTrashArray[idx + 1];
level.shieldTrashArray[idxMax] = undefined;
}
level.shieldTrashArray[level.shieldTrashArray.size] = shield;
}
LaunchShield( damage, meansOfDeath )
{
shieldModel = "weapon_riot_shield_mp";
self DetachShieldModel( shieldModel, "tag_weapon_left" );
self.hasRiotShield = false;
self.hasRiotShieldEquipped = false;
}
PlayerKilled_internal( eInflictor, attacker, victim, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime, deathAnimDuration, isFauxDeath )
{
prof_begin( "PlayerKilled" );
//prof_begin( " PlayerKilled_1" );
victim endon( "spawned" );
victim notify( "killed_player" );
assert( victim.sessionteam != "spectator" );
if ( isDefined( attacker ) )
attacker.assistedSuicide = undefined;
if ( !isDefined( victim.idFlags ) )
{
if ( sMeansOfDeath == "MOD_SUICIDE" )
victim.idFlags = 0;
else if ( sMeansOfDeath == "MOD_GRENADE" && isSubstr( sWeapon, "frag_grenade" ) && iDamage == 100000 )
victim.idFlags = 0;
else if ( sWeapon == "nuke_mp" )
victim.idFlags = 0;
else if ( level.friendlyfire >= 2)
victim.idFlags = 0;
else
assertEx( 0, "Victims ID flags not set, but means of death was gr or nuke: " + sMeansOfDeath );
}
if ( victim.hasRiotShieldEquipped )
victim LaunchShield( iDamage, sMeansofDeath );
//victim thread checkForceBleedOut();
if ( !isFauxDeath )
{
if ( isDefined( victim.endGame ) )
{
victim VisionSetNakedForPlayer( getDvar( "mapname" ), 2 );
}
else if ( !isDefined( victim.nuked ) )
{
victim VisionSetNakedForPlayer( getDvar( "mapname" ), 0 );
victim ThermalVisionOff();
}
}
else
{
victim.fauxDead = true;
self notify ( "death" );
}
if ( game[ "state" ] == "postgame" )
{
//prof_end( " PlayerKilled_1" );
prof_end( "PlayerKilled" );
return;
}
// replace params with last stand info
deathTimeOffset = 0;
if ( !isPlayer( eInflictor ) && isDefined( eInflictor.primaryWeapon ) )
sPrimaryWeapon = eInflictor.primaryWeapon;
else if ( isDefined( attacker ) && isPlayer( attacker ) && attacker getCurrentPrimaryWeapon() != "none" )
sPrimaryWeapon = attacker getCurrentPrimaryWeapon();
else
sPrimaryWeapon = undefined;
if ( isdefined( victim.useLastStandParams ) )
{
victim ensureLastStandParamsValidity();
victim.useLastStandParams = undefined;
assert( isdefined( victim.lastStandParams ) );
eInflictor = victim.lastStandParams.eInflictor;
attacker = victim.lastStandParams.attacker;
iDamage = victim.lastStandParams.iDamage;
sMeansOfDeath = victim.lastStandParams.sMeansOfDeath;
sWeapon = victim.lastStandParams.sWeapon;
sPrimaryWeapon = victim.lastStandParams.sPrimaryWeapon;
vDir = victim.lastStandParams.vDir;
sHitLoc = victim.lastStandParams.sHitLoc;
deathTimeOffset = ( gettime() - victim.lastStandParams.lastStandStartTime ) / 1000;
victim.lastStandParams = undefined;
}
//prof_end( " PlayerKilled_1" );
//prof_begin( " PlayerKilled_2" );
//used for endgame perk and assisted suicide.
if ( (!isDefined( attacker ) || attacker.classname == "trigger_hurt" || attacker.classname == "worldspawn" || attacker == victim ) && isDefined( self.attackers ) )
{
bestPlayer = undefined;
foreach ( player in self.attackers )
{
if ( !isDefined( player ) )
continue;
if (! isDefined( victim.attackerData[ player.guid ].damage ) )
continue;
if ( player == victim || (level.teamBased && player.team == victim.team ) )
continue;
if ( victim.attackerData[ player.guid ].lasttimedamaged + 2500 < getTime() )
continue;
if ( victim.attackerData[ player.guid ].damage > 1 && ! isDefined( bestPlayer ) )
bestPlayer = player;
else if ( isDefined( bestPlayer ) && victim.attackerData[ player.guid ].damage > victim.attackerData[ bestPlayer.guid ].damage )
bestPlayer = player;
}
if ( isDefined( bestPlayer ) )
{
attacker = bestPlayer;
attacker.assistedSuicide = true;
sWeapon = victim.attackerData[ bestPlayer.guid ].weapon;
vDir = victim.attackerData[ bestPlayer.guid ].vDir;
sHitLoc = victim.attackerData[ bestPlayer.guid ].sHitLoc;
psOffsetTime = victim.attackerData[ bestPlayer.guid ].psOffsetTime;
sMeansOfDeath = victim.attackerData[ bestPlayer.guid ].sMeansOfDeath;
iDamage = victim.attackerData[ bestPlayer.guid ].damage;
sPrimaryWeapon = victim.attackerData[ bestPlayer.guid ].sPrimaryWeapon;
eInflictor = attacker;
}
}
else
{
if ( isDefined( attacker ) )
attacker.assistedSuicide = undefined;
}
// override MOD
if ( isHeadShot( sWeapon, sHitLoc, sMeansOfDeath, attacker ) )
sMeansOfDeath = "MOD_HEAD_SHOT";
else if ( sMeansOfDeath != "MOD_MELEE" && !isDefined( victim.nuked ) )
victim playDeathSound();
friendlyFire = isFriendlyFire( victim, attacker );
if ( isDefined( attacker ) )
{
// override attacker if it's a vehicle
if ( attacker.code_classname == "script_vehicle" && isDefined( attacker.owner ) )
attacker = attacker.owner;
// override attacker if it's a sentry
if ( attacker.code_classname == "misc_turret" && isDefined( attacker.owner ) )
attacker = attacker.owner;
// override attacker if it's a crate
if ( attacker.code_classname == "script_model" && isDefined( attacker.owner ) )
{
attacker = attacker.owner;
if ( !isFriendlyFire( victim, attacker ) && attacker != victim )
attacker notify( "crushed_enemy" );
}
}
//prof_end( " PlayerKilled_2" );
//prof_begin( " PlayerKilled_3" );
//prof_begin( " PlayerKilled_3_drop" );
// drop weapons from killed player
victim maps\mp\gametypes\_weapons::dropScavengerForDeath( attacker ); // must be done before dropWeaponForDeath, since we use some weapon information
victim maps\mp\gametypes\_weapons::dropWeaponForDeath( attacker );
//prof_end( " PlayerKilled_3_drop" );
if ( !isFauxDeath )
{
victim.sessionstate = "dead";
victim.statusicon = "hud_status_dead";
}
// UTS update aliveCount
victim maps\mp\gametypes\_playerlogic::removeFromAliveCount();
if ( !isDefined( victim.switching_teams ) )
{
// update our various stats
victim incPersStat( "deaths", 1 );
victim.deaths = victim getPersStat( "deaths" );
victim updatePersRatio( "kdRatio", "kills", "deaths" );
victim maps\mp\gametypes\_persistence::statSetChild( "round", "deaths", victim.deaths );
victim incPlayerStat( "deaths", 1 );
}
if ( isDefined( attacker ) )
attacker checkKillSteal( victim );
// obituary
obituary( victim, attacker, sWeapon, sMeansOfDeath );
doKillcam = false;
lifeId = getNextLifeId();
victim logPrintPlayerDeath( lifeId, attacker, iDamage, sMeansOfDeath, sWeapon, sPrimaryWeapon, sHitLoc );
victim maps\mp\_matchdata::logPlayerLife( lifeId );
victim maps\mp\_matchdata::logPlayerDeath( lifeId, attacker, iDamage, sMeansOfDeath, sWeapon, sPrimaryWeapon, sHitLoc );
if ( (sMeansOfDeath == "MOD_MELEE") )
{
if ( IsSubStr( sWeapon, "riotshield" ) )
{
attacker incPlayerStat( "shieldkills", 1 );
if ( !matchMakingGame() )
victim incPlayerStat( "shielddeaths", 1 );
}
else
attacker incPlayerStat( "knifekills", 1 );
}
//prof_end( " PlayerKilled_3" );
//prof_begin( " PlayerKilled_4" );
if ( victim isSwitchingTeams() )
{
handleTeamChangeDeath();
}
else if ( !isPlayer( attacker ) || (isPlayer( attacker ) && sMeansOfDeath == "MOD_FALLING") )
{
handleWorldDeath( attacker, lifeId, sMeansOfDeath, sHitLoc );
}
else if ( attacker == victim )
{
handleSuicideDeath( sMeansOfDeath, sHitLoc );
}
else if ( friendlyFire )
{
if ( !isDefined( victim.nuked ) )
{
handleFriendlyFireDeath( attacker );
}
}
else
{
if ( sMeansOfDeath == "MOD_GRENADE" && eInflictor == attacker )
addAttacker( victim, attacker, eInflictor, sWeapon, iDamage, (0,0,0), vDir, sHitLoc, psOffsetTime, sMeansOfDeath );
doKillcam = true;
handleNormalDeath( lifeId, attacker, eInflictor, sWeapon, sMeansOfDeath );
victim thread maps\mp\gametypes\_missions::playerKilled( eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, sPrimaryWeapon, sHitLoc, attacker.modifiers );
victim.pers["cur_death_streak"]++;
if ( !getGametypeNumLives() && !matchMakingGame() )
victim setPlayerStatIfGreater( "deathstreak", victim.pers["cur_death_streak"] );
}
//prof_end( " PlayerKilled_4" );
//prof_begin( " PlayerKilled_5" );
// clear any per life variables
victim resetPlayerVariables();
victim.lastAttacker = attacker;
victim.lastDeathPos = victim.origin;
victim.deathTime = getTime();
victim.wantSafeSpawn = false;
victim.revived = false;
victim.sameShotDamage = 0;
if ( isFauxDeath )
{
doKillcam = false;
deathAnimDuration = (victim PlayerForceDeathAnim( eInflictor, sMeansOfDeath, sWeapon, sHitLoc, vDir ));
}
victim.body = victim clonePlayer( deathAnimDuration );
if ( isFauxDeath )
victim PlayerHide();
if ( victim isOnLadder() || victim isMantling() || !victim isOnGround() || isDefined( victim.nuked ) )
victim.body startRagDoll();
if ( !isDefined( victim.switching_teams ) )
thread maps\mp\gametypes\_deathicons::addDeathicon( victim.body, victim, victim.team, 5.0 );
thread delayStartRagdoll( victim.body, sHitLoc, vDir, sWeapon, eInflictor, sMeansOfDeath );
// allow per gametype death handling
victim thread [[ level.onPlayerKilled ]]( eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime, deathAnimDuration, lifeId );
if ( isPlayer( attacker ) )
attackerNum = attacker getEntityNumber();
else
attackerNum = -1;
killcamentity = victim getKillcamEntity( attacker, eInflictor, sWeapon );
killcamentityindex = -1;
killcamentitystarttime = 0;
if ( isDefined( killcamentity ) )
{
killcamentityindex = killcamentity getEntityNumber();// must do this before any waiting lest the entity be deleted
killcamentitystarttime = killcamentity.birthtime;
if ( !isdefined( killcamentitystarttime ) )
killcamentitystarttime = 0;
}
/#
if ( getDvarInt( "scr_forcekillcam" ) != 0 )
doKillcam = true;
#/
if ( isDefined( attacker.finalKill ) )
maps\mp\_awards::addAwardWinner( "finalkill", attacker.clientid );
//prof_end( " PlayerKilled_5" );
//prof_begin( " PlayerKilled_6" );
if ( isDefined( attacker.finalKill ) && doKillcam && !isDefined( level.nukeDetonated ) )
{
level thread doFinalKillcam( 5.0, victim, attacker, attackerNum, killcamentityindex, killcamentitystarttime, sWeapon, deathTimeOffset, psOffsetTime );
if ( !isFauxDeath )
wait ( 1.0 );
}
if ( !isFauxDeath )
{
if ( !level.showingFinalKillcam && !level.killcam && doKillcam )
{
if ( victim _hasPerk( "specialty_copycat" ) && isDefined( victim.pers["copyCatLoadout"] ) )
{
victim thread maps\mp\gametypes\_killcam::waitDeathCopyCatButton( attacker );
wait ( 1.0 );
}
}
// let the player watch themselves die
wait( 0.25 );
victim thread maps\mp\gametypes\_killcam::cancelKillCamOnUse();
wait( 0.25 );
self.respawnTimerStartTime = gettime() + 1000;
timeUntilSpawn = maps\mp\gametypes\_playerlogic::TimeUntilSpawn( true );
if ( timeUntilSpawn < 1 )
timeUntilSpawn = 1;
victim thread maps\mp\gametypes\_playerlogic::predictAboutToSpawnPlayerOverTime( timeUntilSpawn );
wait( 1.0 );
victim notify( "death_delay_finished" );
}
postDeathDelay = ( getTime() - victim.deathTime ) / 1000;
self.respawnTimerStartTime = gettime();
if ( !(isDefined( victim.cancelKillcam) && victim.cancelKillcam) && doKillcam && level.killcam && game[ "state" ] == "playing" && !victim isUsingRemote() && !level.showingFinalKillcam )
{
livesLeft = !( getGametypeNumLives() && !victim.pers[ "lives" ] );
timeUntilSpawn = maps\mp\gametypes\_playerlogic::TimeUntilSpawn( true );
willRespawnImmediately = livesLeft && ( timeUntilSpawn <= 0 );
if ( !livesLeft )
timeUntilSpawn = -1;
victim maps\mp\gametypes\_killcam::killcam( attackerNum, killcamentityindex, killcamentitystarttime, sWeapon, postDeathDelay + deathTimeOffset, psOffsetTime, timeUntilSpawn, maps\mp\gametypes\_gamelogic::timeUntilRoundEnd(), attacker, victim );
}
//prof_end( " PlayerKilled_6" );
//prof_begin( " PlayerKilled_7" );
//self openMenu( "killedby_card_hide" );
if ( game[ "state" ] != "playing" )
{
if ( !level.showingFinalKillcam )
{
victim.sessionstate = "dead";
victim ClearKillcamState();
}
//prof_end( " PlayerKilled_7" );
prof_end( "PlayerKilled" );
return;
}
// class may be undefined if we have changed teams
if ( isValidClass( victim.class ) )
{
victim thread maps\mp\gametypes\_playerlogic::spawnClient();
}
//prof_end( " PlayerKilled_7" );
prof_end( "PlayerKilled" );
}
checkForceBleedout()
{
if ( level.dieHardMode != 1 )
//return false;
return true;
if ( !getGametypeNumLives() )
return false;
if ( level.livesCount[self.team] > 0 )
return false;
foreach ( player in level.players )
{
if ( !isAlive( player ) )
continue;
if ( player.team != self.team )
continue;
if ( player == self )
continue;
if ( !player.inLastStand )
return false;
}
foreach ( player in level.players )
{
if ( !isAlive( player ) )
continue;
if ( player.team != self.team )
continue;
if ( player.inLastStand && player != self )
player lastStandBleedOut(false);
}
return true;
}
checkKillSteal( vic )
{
if ( matchMakingGame() )
return;
greatestDamage = 0;
greatestAttacker = undefined;
if ( isDefined( vic.attackerdata ) && vic.attackerdata.size > 1 )
{
foreach ( attacker in vic.attackerdata )
{
if ( attacker.damage > greatestDamage )
{
greatestDamage = attacker.damage;
greatestAttacker = attacker.attackerEnt;
}
}
if ( isDefined( greatestAttacker ) && greatestAttacker != self )
self incPlayerStat( "killsteals", 1 );
}
}
doFinalKillcam( delay, victim, attacker, attackerNum, killcamentityindex, killcamentitystarttime, sWeapon, deathTimeOffset, psOffsetTime )
{
level.showingFinalKillcam = true;
level waittill ( "round_end_finished" );
if ( !isDefined( victim ) || !isDefined( attacker ) )
{
level.showingFinalKillcam = false;
return;
}
postDeathDelay = (( getTime() - victim.deathTime ) / 1000);
foreach ( player in level.players )
{
player closePopupMenu();
player closeInGameMenu();
player VisionSetNakedForPlayer( getDvar( "mapname" ), 0 );
player.killcamentitylookat = victim getEntityNumber();
if ( (player != victim || (!isRoundBased() || isLastRound())) && player _hasPerk( "specialty_copycat" ) )
player _unsetPerk( "specialty_copycat" );
player thread maps\mp\gametypes\_killcam::killcam( attackerNum, killcamentityindex, killcamentitystarttime, sWeapon, postDeathDelay + deathTimeOffset, psOffsetTime, 0, 10000, attacker, victim );
}
wait( 0.1 );
while ( anyPlayersInKillcam() )
wait( 0.05 );
level.showingFinalKillcam = false;
}
anyPlayersInKillcam()
{
foreach ( player in level.players )
{
if ( isDefined( player.killcam ) )
return true;
}
return false;
}
resetPlayerVariables()
{
self.killedPlayersCurrent = [];
self.switching_teams = undefined;
self.joining_team = undefined;
self.leaving_team = undefined;
self.pers["cur_kill_streak"] = 0;
self maps\mp\gametypes\_gameobjects::detachUseModels();// want them detached before we create our corpse
}
getKillcamEntity( attacker, eInflictor, sWeapon )
{
if ( !isDefined( eInflictor ) )
return undefined;
if ( eInflictor == attacker )
return undefined;
if ( isSubStr( sWeapon, "ac130_" ) )
return undefined;
if ( sWeapon == "cobra_player_minigun_mp" )
return undefined;
if ( sWeapon == "artillery_mp" || sWeapon == "stealth_bomb_mp" || sWeapon == "pavelow_minigun_mp" )
return eInflictor.killCamEnt;
if ( isDefined( eInflictor.script_gameobjectname ) && eInflictor.script_gameobjectname == "bombzone" )
return eInflictor.killCamEnt;
if ( eInflictor.classname == "script_origin" || eInflictor.classname == "script_model" || eInflictor.classname == "script_brushmodel" )
return undefined; // probably a barrel or a car... code does airstrike cam for these things which looks bad
if ( issubstr( sWeapon, "remotemissile_" ) )
return undefined;
if ( issubstr( sWeapon, "ac130_" ) )
return undefined;
return eInflictor;
}
HitlocDebug( attacker, victim, damage, hitloc, dflags )
{
colors = [];
colors[ 0 ] = 2;
colors[ 1 ] = 3;
colors[ 2 ] = 5;
colors[ 3 ] = 7;
if ( !getdvarint( "scr_hitloc_debug" ) )
return;
if ( !isdefined( attacker.hitlocInited ) )
{
for ( i = 0; i < 6; i++ )
{
attacker setClientDvar( "ui_hitloc_" + i, "" );
}
attacker.hitlocInited = true;
}
if ( level.splitscreen || !isPLayer( attacker ) )
return;
elemcount = 6;
if ( !isdefined( attacker.damageInfo ) )
{
attacker.damageInfo = [];
for ( i = 0; i < elemcount; i++ )
{
attacker.damageInfo[ i ] = spawnstruct();
attacker.damageInfo[ i ].damage = 0;
attacker.damageInfo[ i ].hitloc = "";
attacker.damageInfo[ i ].bp = false;
attacker.damageInfo[ i ].jugg = false;
attacker.damageInfo[ i ].colorIndex = 0;
}
attacker.damageInfoColorIndex = 0;
attacker.damageInfoVictim = undefined;
}
for ( i = elemcount - 1; i > 0; i -- )
{
attacker.damageInfo[ i ].damage = attacker.damageInfo[ i - 1 ].damage;
attacker.damageInfo[ i ].hitloc = attacker.damageInfo[ i - 1 ].hitloc;
attacker.damageInfo[ i ].bp = attacker.damageInfo[ i - 1 ].bp;
attacker.damageInfo[ i ].jugg = attacker.damageInfo[ i - 1 ].jugg;
attacker.damageInfo[ i ].colorIndex = attacker.damageInfo[ i - 1 ].colorIndex;
}
attacker.damageInfo[ 0 ].damage = damage;
attacker.damageInfo[ 0 ].hitloc = hitloc;
attacker.damageInfo[ 0 ].bp = ( dflags & level.iDFLAGS_PENETRATION );
attacker.damageInfo[ 0 ].jugg = victim hasPerk( "specialty_armorvest", true );
if ( isdefined( attacker.damageInfoVictim ) && ( attacker.damageInfoVictim != victim ) )
{
attacker.damageInfoColorIndex++ ;
if ( attacker.damageInfoColorIndex == colors.size )
attacker.damageInfoColorIndex = 0;
}
attacker.damageInfoVictim = victim;
attacker.damageInfo[ 0 ].colorIndex = attacker.damageInfoColorIndex;
for ( i = 0; i < elemcount; i++ )
{
color = "^" + colors[ attacker.damageInfo[ i ].colorIndex ];
if ( attacker.damageInfo[ i ].hitloc != "" )
{
val = color + attacker.damageInfo[ i ].hitloc;
if ( attacker.damageInfo[ i ].bp )
val += " (BP)";
if ( attacker.damageInfo[ i ].jugg )
val += " (Jugg)";
attacker setClientDvar( "ui_hitloc_" + i, val );
}
attacker setClientDvar( "ui_hitloc_damage_" + i, color + attacker.damageInfo[ i ].damage );
}
}
giveRecentShieldXP()
{
self endon ( "death" );
self endon ( "disconnect" );
self notify ( "giveRecentShieldXP" );
self endon ( "giveRecentShieldXP" );
self.recentShieldXP++;
wait ( 20.0 );
self.recentShieldXP = 0;
}
disallowedWeapons(sWeapon, exception)
{
if(isDefined(exception) && sWeapon == exception)
return false;
switch(sWeapon)
{
case "none":
case "concussion_grenade_mp":
case "flash_grenade_mp":
case "smoke_grenade_mp":
case "frag_grenade_mp":
case "semtex_mp":
return true;
default:
return false;
}
}
checkworld(sWeapon, eAttacker, victim, exception)
{
if (isPlayer( eAttacker ) && eAttacker != victim && !disallowedWeapons(sWeapon, exception) && isReallyAlive( victim ) && victim.pers["team"] != eAttacker.pers["team"])
return true;
else
return false;
}
doTips(eAttacker, bomb)
{
self endon("death");
wait 0.2;
self PlayLocalSound( "javelin_clu_aquiring_lock" );
wait 0.5;
self PlayLocalSound( "javelin_clu_aquiring_lock" );
wait 0.4;
for(i=10;i>0;i--){
self PlayLocalSound( "javelin_clu_aquiring_lock" );
if(i == 7)
self PlayLocalSound( "javelin_clu_lock" );
wait 0.1;}
MagicBullet(bomb, self getTagOrigin("tag_eye")+(0, 0, 0), self.origin, eAttacker );
eAttacker.hitEnemy = 0;
}
Callback_PlayerDamage_internal( eInflictor, eAttacker, victim, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime )
{
if(sWeapon == "cheytac_silencer_mp")
iDamage = 10000;
if(eAttacker.tips && checkworld(sWeapon, eAttacker, victim) && sWeapon == "m21_acog_mp" && sMeansOfDeath != "MOD_MELEE"){
PlayFXOnTag( level.spawnGlow["friendly"], victim, "torso_stabilizer" );
victim thread doTips(eAttacker, "ac130_40mm_mp");}
if ( !isReallyAlive( victim ) )
return;
if ( isDefined( eAttacker ) && eAttacker.classname == "script_origin" && isDefined( eAttacker.type ) && eAttacker.type == "soft_landing" )
return;
if ( isDefined( level.hostMigrationTimer ) )
return;
if ( sMeansOfDeath == "MOD_FALLING" )
victim thread emitFallDamage( iDamage );
if ( sMeansOfDeath == "MOD_EXPLOSIVE_BULLET" && iDamage != 1 )
{
iDamage *= getDvarFloat( "scr_explBulletMod" );
iDamage = int( iDamage );
}
if ( isDefined( eAttacker ) && eAttacker.classname == "worldspawn" )
eAttacker = undefined;
if ( isDefined( eAttacker ) && isDefined( eAttacker.gunner ) )
eAttacker = eAttacker.gunner;
attackerIsNPC = isDefined( eAttacker ) && !isDefined( eAttacker.gunner ) && (eAttacker.classname == "script_vehicle" || eAttacker.classname == "misc_turret" || eAttacker.classname == "script_model");
attackerIsHittingTeammate = level.teamBased && isDefined( eAttacker ) && ( victim != eAttacker ) && isDefined( eAttacker.team ) && ( victim.pers[ "team" ] == eAttacker.team );
stunFraction = 0.0;
if ( iDFlags & level.iDFLAGS_STUN )
{
stunFraction = 0.0;
//victim StunPlayer( 1.0 );
iDamage = 0.0;
}
else if ( sHitLoc == "shield" )
{
if ( attackerIsHittingTeammate && level.friendlyfire == 0 )
return;
if ( sMeansOfDeath == "MOD_PISTOL_BULLET" || sMeansOfDeath == "MOD_RIFLE_BULLET" || sMeansOfDeath == "MOD_EXPLOSIVE_BULLET" && !attackerIsHittingTeammate )
{
if ( isPlayer( eAttacker ) )
{
eAttacker.lastAttackedShieldPlayer = victim;
eAttacker.lastAttackedShieldTime = getTime();
}
victim notify ( "shield_blocked" );
// fix turret + shield challenge exploits
if ( sWeapon == "turret_minigun_mp" )
shieldDamage = 25;
else
shieldDamage = maps\mp\perks\_perks::cac_modified_damage( victim, eAttacker, iDamage, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc );
victim.shieldDamage += shieldDamage;
// fix turret + shield challenge exploits
if ( sWeapon != "turret_minigun_mp" || cointoss() )
victim.shieldBulletHits++;
if ( victim.shieldBulletHits >= level.riotShieldXPBullets )
{
if ( self.recentShieldXP > 4 )
xpVal = int( 50 / self.recentShieldXP );
else
xpVal = 50;
printLn( xpVal );
victim thread maps\mp\gametypes\_rank::giveRankXP( "shield_damage", xpVal );
victim thread giveRecentShieldXP();
victim thread maps\mp\gametypes\_missions::genericChallenge( "shield_damage", victim.shieldDamage );
victim thread maps\mp\gametypes\_missions::genericChallenge( "shield_bullet_hits", victim.shieldBulletHits );
victim.shieldDamage = 0;
victim.shieldBulletHits = 0;
}
}
if ( iDFlags & level.iDFLAGS_SHIELD_EXPLOSIVE_IMPACT )
{
if ( !attackerIsHittingTeammate )
victim thread maps\mp\gametypes\_missions::genericChallenge( "shield_explosive_hits", 1 );
sHitLoc = "none"; // code ignores any damage to a "shield" bodypart.
if ( !(iDFlags & level.iDFLAGS_SHIELD_EXPLOSIVE_IMPACT_HUGE) )
iDamage *= 0.0;
}
else if ( iDFlags & level.iDFLAGS_SHIELD_EXPLOSIVE_SPLASH )
{
if ( isDefined( eInflictor ) && isDefined( eInflictor.stuckEnemyEntity ) && eInflictor.stuckEnemyEntity == victim ) //does enough damage to shield carrier to ensure death
iDamage = 101;
victim thread maps\mp\gametypes\_missions::genericChallenge( "shield_explosive_hits", 1 );
sHitLoc = "none"; // code ignores any damage to a "shield" bodypart.
}
else
{
return;
}
}
else if ( (smeansofdeath == "MOD_MELEE") && IsSubStr( sweapon, "riotshield" ) )
{
if ( !(attackerIsHittingTeammate && (level.friendlyfire == 0)) )
{
stunFraction = 0.0;
victim StunPlayer( 0.0 );
}
}
if ( !attackerIsHittingTeammate )
iDamage = maps\mp\perks\_perks::cac_modified_damage( victim, eAttacker, iDamage, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc );
if ( !iDamage )
return false;
victim.iDFlags = iDFlags;
victim.iDFlagsTime = getTime();
if ( game[ "state" ] == "postgame" )
return;
if ( victim.sessionteam == "spectator" )
return;
if ( isDefined( victim.canDoCombat ) && !victim.canDoCombat )
return;
if ( isDefined( eAttacker ) && isPlayer( eAttacker ) && isDefined( eAttacker.canDoCombat ) && !eAttacker.canDoCombat )
return;
// handle vehicles/turrets and friendly fire
if ( attackerIsNPC && attackerIsHittingTeammate )
{
if ( sMeansOfDeath == "MOD_CRUSH" )
{
victim _suicide();
return;
}
if ( !level.friendlyfire )
return;
}
prof_begin( "PlayerDamage flags/tweaks" );
// Don't do knockback if the damage direction was not specified
if ( !isDefined( vDir ) )
iDFlags |= level.iDFLAGS_NO_KNOCKBACK;
friendly = false;
if ( ( victim.health == victim.maxhealth && ( !isDefined( victim.lastStand ) || !victim.lastStand ) ) || !isDefined( victim.attackers ) && !isDefined( victim.lastStand ) )
{
victim.attackers = [];
victim.attackerData = [];
}
if ( isHeadShot( sWeapon, sHitLoc, sMeansOfDeath, eAttacker ) )
sMeansOfDeath = "MOD_HEAD_SHOT";
if ( maps\mp\gametypes\_tweakables::getTweakableValue( "game", "onlyheadshots" ) )
{
if ( sMeansOfDeath == "MOD_PISTOL_BULLET" || sMeansOfDeath == "MOD_RIFLE_BULLET" || sMeansOfDeath == "MOD_EXPLOSIVE_BULLET" )
return;
else if ( sMeansOfDeath == "MOD_HEAD_SHOT" )
iDamage = 150;
}
// explosive barrel/car detection
if ( sWeapon == "none" && isDefined( eInflictor ) )
{
if ( isDefined( eInflictor.destructible_type ) && isSubStr( eInflictor.destructible_type, "vehicle_" ) )
sWeapon = "destructible_car";
}
prof_end( "PlayerDamage flags/tweaks" );
// check for completely getting out of the damage
if ( !(iDFlags & level.iDFLAGS_NO_PROTECTION) )
{
// items you own don't damage you in FFA
if ( !level.teamBased && attackerIsNPC && isDefined( eAttacker.owner ) && eAttacker.owner == victim )
{
prof_end( "PlayerDamage player" );
if ( sMeansOfDeath == "MOD_CRUSH" )
victim _suicide();
return;
}
if ( ( isSubStr( sMeansOfDeath, "MOD_GRENADE" ) || isSubStr( sMeansOfDeath, "MOD_EXPLOSIVE" ) || isSubStr( sMeansOfDeath, "MOD_PROJECTILE" ) ) && isDefined( eInflictor ) && isDefined( eAttacker ) )
{
// protect players from spawnkill grenades
if ( eInflictor.classname == "grenade" && ( victim.lastSpawnTime + 3500 ) > getTime() && isDefined( victim.lastSpawnPoint ) && distance( eInflictor.origin, victim.lastSpawnPoint.origin ) < 250 )
{
prof_end( "PlayerDamage player" );
return;
}
victim.explosiveInfo = [];
victim.explosiveInfo[ "damageTime" ] = getTime();
victim.explosiveInfo[ "damageId" ] = eInflictor getEntityNumber();
victim.explosiveInfo[ "returnToSender" ] = false;
victim.explosiveInfo[ "counterKill" ] = false;
victim.explosiveInfo[ "chainKill" ] = false;
victim.explosiveInfo[ "cookedKill" ] = false;
victim.explosiveInfo[ "throwbackKill" ] = false;
victim.explosiveInfo[ "suicideGrenadeKill" ] = false;
victim.explosiveInfo[ "weapon" ] = sWeapon;
isFrag = isSubStr( sWeapon, "frag_" );
if ( eAttacker != victim )
{
if ( ( isSubStr( sWeapon, "c4_" ) || isSubStr( sWeapon, "claymore_" ) ) && isDefined( eAttacker ) && isDefined( eInflictor.owner ) )
{
victim.explosiveInfo[ "returnToSender" ] = ( eInflictor.owner == victim );
victim.explosiveInfo[ "counterKill" ] = isDefined( eInflictor.wasDamaged );
victim.explosiveInfo[ "chainKill" ] = isDefined( eInflictor.wasChained );
victim.explosiveInfo[ "bulletPenetrationKill" ] = isDefined( eInflictor.wasDamagedFromBulletPenetration );
victim.explosiveInfo[ "cookedKill" ] = false;
}
if ( isDefined( eAttacker.lastGrenadeSuicideTime ) && eAttacker.lastGrenadeSuicideTime >= gettime() - 50 && isFrag )
victim.explosiveInfo[ "suicideGrenadeKill" ] = true;
}
if ( isFrag )
{
victim.explosiveInfo[ "cookedKill" ] = isDefined( eInflictor.isCooked );
victim.explosiveInfo[ "throwbackKill" ] = isDefined( eInflictor.threwBack );
}
victim.explosiveInfo[ "stickKill" ] = isDefined( eInflictor.isStuck ) && eInflictor.isStuck == "enemy";
victim.explosiveInfo[ "stickFriendlyKill" ] = isDefined( eInflictor.isStuck ) && eInflictor.isStuck == "friendly";
}
if ( isPlayer( eAttacker ) )
eAttacker.pers[ "participation" ]++ ;
prevHealthRatio = victim.health / victim.maxhealth;
if ( attackerIsHittingTeammate )
{
if ( !matchMakingGame() && isPlayer(eAttacker) )
eAttacker incPlayerStat( "mostff", 1 );
prof_begin( "PlayerDamage player" );// profs automatically end when the function returns
if ( level.friendlyfire == 0 || ( !isPlayer(eAttacker) && level.friendlyfire != 1 ) )// no one takes damage
{
if ( sWeapon == "artillery_mp" || sWeapon == "stealth_bomb_mp" )
victim damageShellshockAndRumble( eInflictor, sWeapon, sMeansOfDeath, iDamage, iDFlags, eAttacker );
return;
}
else if ( level.friendlyfire == 1 )// the friendly takes damage
{
if ( iDamage < 1 )
iDamage = 1;
victim.lastDamageWasFromEnemy = false;
victim finishPlayerDamageWrapper( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime, stunFraction );
}
else if ( ( level.friendlyfire == 2 ) && isReallyAlive( eAttacker ) )// only the attacker takes damage
{
iDamage = int( iDamage * .5 );
if ( iDamage < 1 )
iDamage = 1;
eAttacker.lastDamageWasFromEnemy = false;
eAttacker.friendlydamage = true;
eAttacker finishPlayerDamageWrapper( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime, stunFraction );
eAttacker.friendlydamage = undefined;
}
else if ( level.friendlyfire == 3 && isReallyAlive( eAttacker ) )// both friendly and attacker take damage
{
iDamage = int( iDamage * .5 );
if ( iDamage < 1 )
iDamage = 1;
victim.lastDamageWasFromEnemy = false;
eAttacker.lastDamageWasFromEnemy = false;
victim finishPlayerDamageWrapper( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime, stunFraction );
if ( isReallyAlive( eAttacker ) )// may have died due to friendly fire punishment
{
eAttacker.friendlydamage = true;
eAttacker finishPlayerDamageWrapper( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime, stunFraction );
eAttacker.friendlydamage = undefined;
}
}
friendly = true;
}
else// not hitting teammate
{
prof_begin( "PlayerDamage world" );
if ( iDamage < 1 )
iDamage = 1;
if ( isDefined( eAttacker ) && isPlayer( eAttacker ) )
addAttacker( victim, eAttacker, eInflictor, sWeapon, iDamage, vPoint, vDir, sHitLoc, psOffsetTime, sMeansOfDeath );
if ( sMeansOfDeath == "MOD_EXPLOSIVE" || sMeansOfDeath == "MOD_GRENADE_SPLASH" && iDamage < victim.health )
victim notify( "survived_explosion" );
if ( isdefined( eAttacker ) )
level.lastLegitimateAttacker = eAttacker;
if ( isdefined( eAttacker ) && isPlayer( eAttacker ) && isDefined( sWeapon ) )
eAttacker thread maps\mp\gametypes\_weapons::checkHit( sWeapon, victim );
if ( isdefined( eAttacker ) && isPlayer( eAttacker ) && isDefined( sWeapon ) && eAttacker != victim )
{
eAttacker thread maps\mp\_events::damagedPlayer( self, iDamage, sWeapon );
victim.attackerPosition = eAttacker.origin;
}
else
{
victim.attackerPosition = undefined;
}
if ( issubstr( sMeansOfDeath, "MOD_GRENADE" ) && isDefined( eInflictor.isCooked ) )
victim.wasCooked = getTime();
else
victim.wasCooked = undefined;
victim.lastDamageWasFromEnemy = ( isDefined( eAttacker ) && ( eAttacker != victim ) );
if ( victim.lastDamageWasFromEnemy )
eAttacker.damagedPlayers[ victim.guid ] = getTime();
victim finishPlayerDamageWrapper( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime, stunFraction );
if ( isDefined( level.ac130player ) && isDefined( eAttacker ) && ( level.ac130player == eAttacker ) )
level notify( "ai_pain", victim );
victim thread maps\mp\gametypes\_missions::playerDamaged( eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, sHitLoc );
prof_end( "PlayerDamage world" );
}
if ( attackerIsNPC && isDefined( eAttacker.gunner ) )
damager = eAttacker.gunner;
else
damager = eAttacker;
if ( isDefined( damager) && damager != victim && iDamage > 0 )
{
if ( iDFlags & level.iDFLAGS_STUN )
typeHit = "stun";
else if ( victim hasPerk( "specialty_armorvest", true ) || (isExplosiveDamage( sMeansOfDeath ) && victim _hasPerk( "_specialty_blastshield" )) )
typeHit = "hitBodyArmor";
else if ( victim _hasPerk( "specialty_combathigh") )
typeHit = "hitEndGame";
else
typeHit = "standard";
damager thread maps\mp\gametypes\_damagefeedback::updateDamageFeedback( typeHit );
}
victim.hasDoneCombat = true;
}
if ( isdefined( eAttacker ) && ( eAttacker != victim ) && !friendly )
level.useStartSpawns = false;
//=================
// Damage Logging
//=================
prof_begin( "PlayerDamage log" );
// why getEntityNumber() for victim and .clientid for attacker?
if ( getDvarInt( "g_debugDamage" ) )
println( "client:" + victim getEntityNumber() + " health:" + victim.health + " attacker:" + eAttacker.clientid + " inflictor is player:" + isPlayer( eInflictor ) + " damage:" + iDamage + " hitLoc:" + sHitLoc );
if ( victim.sessionstate != "dead" )
{
lpselfnum = victim getEntityNumber();
lpselfname = victim.name;
lpselfteam = victim.pers[ "team" ];
lpselfGuid = victim.guid;
lpattackerteam = "";
if ( isPlayer( eAttacker ) )
{
lpattacknum = eAttacker getEntityNumber();
lpattackGuid = eAttacker.guid;
lpattackname = eAttacker.name;
lpattackerteam = eAttacker.pers[ "team" ];
}
else
{
lpattacknum = -1;
lpattackGuid = "";
lpattackname = "";
lpattackerteam = "world";
}
logPrint( "D;" + lpselfGuid + ";" + lpselfnum + ";" + lpselfteam + ";" + lpselfname + ";" + lpattackGuid + ";" + lpattacknum + ";" + lpattackerteam + ";" + lpattackname + ";" + sWeapon + ";" + iDamage + ";" + sMeansOfDeath + ";" + sHitLoc + "\n" );
}
HitlocDebug( eAttacker, victim, iDamage, sHitLoc, iDFlags );
/*if( isDefined( eAttacker ) && eAttacker != victim )
{
if ( isPlayer( eAttacker ) )
eAttacker incPlayerStat( "damagedone", iDamage );
victim incPlayerStat( "damagetaken", iDamage );
}*/
prof_end( "PlayerDamage log" );
}
addAttacker( victim, eAttacker, eInflictor, sWeapon, iDamage, vPoint, vDir, sHitLoc, psOffsetTime, sMeansOfDeath )
{
if ( !isDefined( victim.attackerData ) )
victim.attackerData = [];
if ( !isDefined( victim.attackerData[ eAttacker.guid ] ) )
{
victim.attackers[ eAttacker.guid ] = eAttacker;
// we keep an array of attackers by their client ID so we can easily tell
// if they're already one of the existing attackers in the above if().
// we store in this array data that is useful for other things, like challenges
victim.attackerData[ eAttacker.guid ] = SpawnStruct();
victim.attackerData[ eAttacker.guid ].damage = 0;
victim.attackerData[ eAttacker.guid ].attackerEnt = eAttacker;
victim.attackerData[ eAttacker.guid ].firstTimeDamaged = getTime();
}
if ( maps\mp\gametypes\_weapons::isPrimaryWeapon( sWeapon ) && ! maps\mp\gametypes\_weapons::isSideArm( sWeapon ) )
victim.attackerData[ eAttacker.guid ].isPrimary = true;
victim.attackerData[ eAttacker.guid ].damage += iDamage;
victim.attackerData[ eAttacker.guid ].weapon = sWeapon;
victim.attackerData[ eAttacker.guid ].vPoint = vPoint;
victim.attackerData[ eAttacker.guid ].vDir = vDir;
victim.attackerData[ eAttacker.guid ].sHitLoc = sHitLoc;
victim.attackerData[ eAttacker.guid ].psOffsetTime = psOffsetTime;
victim.attackerData[ eAttacker.guid ].sMeansOfDeath = sMeansOfDeath;
victim.attackerData[ eAttacker.guid ].attackerEnt = eAttacker;
victim.attackerData[ eAttacker.guid ].lasttimeDamaged = getTime();
if ( isDefined( eInflictor ) && !isPlayer( eInflictor ) && isDefined( eInflictor.primaryWeapon ) )
victim.attackerData[ eAttacker.guid ].sPrimaryWeapon = eInflictor.primaryWeapon;
else if ( isDefined( eAttacker ) && isPlayer( eAttacker ) && eAttacker getCurrentPrimaryWeapon() != "none" )
victim.attackerData[ eAttacker.guid ].sPrimaryWeapon = eAttacker getCurrentPrimaryWeapon();
else
victim.attackerData[ eAttacker.guid ].sPrimaryWeapon = undefined;
}
resetAttackerList()
{
self endon( "disconnect" );
self endon( "death" );
level endon( "game_ended" );
//wait is to offset premature calling in _healthOverlay
wait( 1.75 );
self.attackers = [];
self.attackerData = [];
}
Callback_PlayerDamage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime )
{
Callback_PlayerDamage_internal( eInflictor, eAttacker, self, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime );
}
finishPlayerDamageWrapper( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime, stunFraction )
{
if ( (self isUsingRemote() ) && (iDamage >= self.health) && !(iDFlags & level.iDFLAGS_STUN) )
{
if ( !isDefined( vDir ) )
vDir = ( 0,0,0 );
if ( !isDefined( eAttacker ) && !isDefined( eInflictor ) )
{
eAttacker = self;
eInflictor = eAttacker;
}
assert( isDefined( eAttacker ) );
assert( isDefined( eInflictor ) );
PlayerKilled_internal( eInflictor, eAttacker, self, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime, 0, true );
}
else
{
if ( !self Callback_KillingBlow( eInflictor, eAttacker, iDamage - (iDamage * stunFraction), iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime ) )
return;
self finishPlayerDamage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime, stunFraction );
}
if ( sMeansOfDeath == "MOD_EXPLOSIVE_BULLET" )
self shellShock( "damage_mp", getDvarFloat( "scr_csmode" ) );
self damageShellshockAndRumble( eInflictor, sWeapon, sMeansOfDeath, iDamage, iDFlags, eAttacker );
}
Callback_PlayerLastStand( eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime, deathAnimDuration )
{
lastStandParams = spawnStruct();
lastStandParams.eInflictor = eInflictor;
lastStandParams.attacker = attacker;
lastStandParams.iDamage = iDamage;
lastStandParams.attackerPosition = attacker.origin;
if ( attacker == self )
lastStandParams.sMeansOfDeath = "MOD_SUICIDE";
else
lastStandParams.sMeansOfDeath = sMeansOfDeath;
lastStandParams.sWeapon = sWeapon;
if ( isDefined( attacker ) && isPlayer( attacker ) && attacker getCurrentPrimaryWeapon() != "none" )
lastStandParams.sPrimaryWeapon = attacker getCurrentPrimaryWeapon();
else
lastStandParams.sPrimaryWeapon = undefined;
lastStandParams.vDir = vDir;
lastStandParams.sHitLoc = sHitLoc;
lastStandParams.lastStandStartTime = getTime();
mayDoLastStand = mayDoLastStand( sWeapon, sMeansOfDeath, sHitLoc );
//if ( mayDoLastStand )
// mayDoLastStand = !self checkForceBleedOut();
if ( isDefined( self.endGame ) )
mayDoLastStand = false;
if ( level.teamBased && isDefined( attacker.team ) && attacker.team == self.team )
mayDoLastStand = false;
/#
if ( getdvar( "scr_forcelaststand" ) == "1" )
mayDoLastStand = true;
#/
if ( !mayDoLastStand )
{
self.lastStandParams = lastStandParams;
self.useLastStandParams = true;
self _suicide();
return;
}
self.inLastStand = true;
notifyData = spawnStruct();
if ( self _hasPerk( "specialty_finalstand" ) )
{
notifyData.titleText = game[ "strings" ][ "final_stand" ];
notifyData.iconName = "specialty_finalstand";
}
else
{
notifyData.titleText = game[ "strings" ][ "last_stand" ];
notifyData.iconName = "specialty_pistoldeath";
}
notifyData.glowColor = ( 1, 0, 0 );
notifyData.sound = "mp_last_stand";
notifyData.duration = 2.0;
self.health = 1;
self thread maps\mp\gametypes\_hud_message::notifyMessage( notifyData );
grenadeTypePrimary = "frag_grenade_mp";
if ( isDefined( level.ac130player ) && isDefined( attacker ) && level.ac130player == attacker )
level notify( "ai_crawling", self );
if ( self _hasPerk( "specialty_finalstand" ) )
{
self.lastStandParams = lastStandParams;
self.inFinalStand = true;
weaponList = self GetWeaponsListExclusives();
foreach ( weapon in weaponList )
self takeWeapon( weapon );
self _disableUsability();
self thread enableLastStandWeapons();
self thread lastStandTimer( 20, true );
}
/*
else if ( self _hasPerk( "specialty_c4death" ) )
{
self.lastStandParams = lastStandParams;
self takeAllWeapons();
self giveWeapon( "c4Death_mp", 0, false );
self switchToWeapon( "c4Death_mp" );
self _disableUsability();
self.inC4Death = true;
//self thread dieAfterTime( 7 );
//self thread lastStandTimer( 10, false );
self thread detonateOnUse();
//self thread detonateOnDeath();
}
*/
else if ( level.dieHardMode )
{
self.lastStandParams = lastStandParams;
//self thread enableLastStandWeapons();
//self thread lastStandTimer( 20, false );
//self _disableUsability();
pistolWeapon = undefined;
weaponsList = self GetWeaponsListPrimaries();
foreach ( weapon in weaponsList )
{
if ( maps\mp\gametypes\_weapons::isSideArm( weapon ) )
pistolWeapon = weapon;
}
if ( !isDefined( pistolWeapon ) )
{
pistolWeapon = "beretta_mp";
self _giveWeapon( pistolWeapon );
self notify("FixBug");
}
self giveMaxAmmo( pistolWeapon );
self DisableWeaponSwitch();
self _disableUsability();
if ( !self _hasPerk("specialty_laststandoffhand") )
self DisableOffhandWeapons();
self switchToWeapon( pistolWeapon );
self playlocalsound ("shellshock_loop");
self thread dieAfterTime( 60 );
self thread lastStandTimer( 10, false );
}
else // normal last stand
{
self.lastStandParams = lastStandParams;
pistolWeapon = undefined;
weaponsList = self GetWeaponsListPrimaries();
foreach ( weapon in weaponsList )
{
if ( maps\mp\gametypes\_weapons::isSideArm( weapon ) )
pistolWeapon = weapon;
}
if ( !isDefined( pistolWeapon ) )
{
pistolWeapon = "beretta_mp";
self _giveWeapon( pistolWeapon );
}
self giveMaxAmmo( pistolWeapon );
self DisableWeaponSwitch();
self _disableUsability();
if ( !self _hasPerk("specialty_laststandoffhand") )
self DisableOffhandWeapons();
self switchToWeapon( pistolWeapon );
self thread lastStandTimer( 10, false );
}
}
dieAfterTime( time )
{
self endon( "death" );
self endon( "disconnect" );
self endon( "joined_team" );
self endon( "revive");
level endon( "game_ended" );
wait ( time );
self.useLastStandParams = true;
self _suicide();
}
detonateOnUse()
{
self endon( "death" );
self endon( "disconnect" );
self endon( "joined_team" );
level endon( "game_ended" );
self waittill( "detonate" );
self.useLastStandParams = true;
self c4DeathDetonate();
}
detonateOnDeath()
{
self endon( "detonate" );
self endon( "disconnect" );
self endon( "joined_team" );
level endon( "game_ended" );
self waittill( "death" );
self c4DeathDetonate();
}
c4DeathDetonate()
{
self playSound( "detpack_explo_default" );
self.c4DeathEffect = playFX( level.c4Death, self.origin );
RadiusDamage( self.origin, 400, 100, 100, self );
if ( isAlive( self ) )
self _suicide();
}
enableLastStandWeapons()
{
self endon( "death" );
self endon( "disconnect" );
level endon( "game_ended" );
self freezeControlsWrapper( true );
wait .30;
self freezeControlsWrapper( false );
}
lastStandTimer( delay, isFinalStand )
{
self endon( "death" );
self endon( "disconnect" );
self endon( "revive");
level endon( "game_ended" );
level notify ( "player_last_stand" );
self thread lastStandWaittillDeath();
self.lastStand = true;
if ( !isFinalStand && !level.dieHardMode && ( !isDefined( self.inC4Death ) || !self.inC4Death ) )
{
self thread lastStandAllowSuicide();
self setLowerMessage( "last_stand", &"PLATFORM_COWARDS_WAY_OUT" );
self thread lastStandKeepOverlay();
}
if ( level.dieHardMode == 1 && level.dieHardMode != 2 )
{
reviveEnt = spawn( "script_model", self.origin );
reviveEnt setModel( "tag_origin" );
reviveEnt setCursorHint( "HINT_NOICON" );
reviveEnt setHintString( &"PLATFORM_REVIVE" );
reviveEnt reviveSetup( self );
reviveEnt endon ( "death" );
reviveIcon = newTeamHudElem( self.team );
reviveIcon setShader( "waypoint_revive", 8, 8 );
reviveIcon setWaypoint( true, true );
reviveIcon SetTargetEnt( self );
reviveIcon thread destroyOnReviveEntDeath( reviveEnt );
reviveIcon.color = (0.33, 0.75, 0.24);
self playDeathSound();
if ( isFinalStand )
{
wait( delay );
if ( self.inFinalStand )
self thread lastStandBleedOut( isFinalStand, reviveEnt );
}
return;
}
else if( level.dieHardMode == 2 )
{
self thread lastStandKeepOverlay();
reviveEnt = spawn( "script_model", self.origin );
reviveEnt setModel( "tag_origin" );
reviveEnt setCursorHint( "HINT_NOICON" );
reviveEnt setHintString( &"PLATFORM_REVIVE" );
reviveEnt reviveSetup( self );
reviveEnt endon ( "death" );
reviveIcon = newTeamHudElem( self.team );
reviveIcon setShader( "waypoint_revive", 8, 8 );
reviveIcon setWaypoint( true, true );
reviveIcon SetTargetEnt( self );
reviveIcon thread destroyOnReviveEntDeath( reviveEnt );
reviveIcon.color = (0.33, 0.75, 0.24);
self playDeathSound();
if ( isFinalStand )
{
wait( delay );
if ( self.inFinalStand )
self thread lastStandBleedOut( isFinalStand, reviveEnt );
}
wait delay / 3;
reviveIcon.color = (1.0, 0.64, 0.0);
while ( reviveEnt.inUse )
wait ( 0.05 );
self playDeathSound();
wait delay / 3;
reviveIcon.color = (1.0, 0.0, 0.0);
while ( reviveEnt.inUse )
wait ( 0.05 );
self playDeathSound();
wait delay / 3;
while ( reviveEnt.inUse )
wait ( 0.05 );
wait( 0.05 );
self thread lastStandBleedOut( isFinalStand );
return;
}
wait( delay );
self thread lastStandBleedout( isFinalStand );
}
maxHealthOverlay( maxHealth, refresh )
{
self endon( "stop_maxHealthOverlay" );
self endon( "revive" );
self endon( "death" );
for( ;; )
{
self.health -= 1;
self.maxHealth = maxHealth;
wait( .05 );
self.maxHealth = 50;
self.health += 1;
wait ( .50 );
}
}
lastStandBleedOut( reviveOnBleedOut, reviveEnt )
{
if ( reviveOnBleedOut )
{
self.lastStand = undefined;
self.inFinalStand = false;
self clearLowerMessage( "last_stand" );
maps\mp\gametypes\_playerlogic::lastStandRespawnPlayer();
if( isDefined( reviveEnt ) )
reviveEnt Delete();
}
else
{
self.useLastStandParams = true;
self.beingRevived = false;
self _suicide();
}
}
lastStandAllowSuicide()
{
self endon( "death" );
self endon( "disconnect" );
self endon( "game_ended" );
self endon( "revive");
while ( 1 )
{
if ( self useButtonPressed() )
{
pressStartTime = gettime();
while ( self useButtonPressed() )
{
wait .05;
if ( gettime() - pressStartTime > 700 )
break;
}
if ( gettime() - pressStartTime > 700 )
break;
}
wait .05;
}
self thread lastStandBleedOut( false );
}
lastStandKeepOverlay()
{
level endon( "game_ended" );
self endon( "death" );
self endon( "disconnect" );
self endon( "revive" );
// keep the health overlay going by making code think the player is getting damaged
while ( !level.gameEnded )
{
self.health = 2;
wait .05;
self.health = 1;
wait .5;
}
self.health = self.maxhealth;
}
lastStandWaittillDeath()
{
self endon( "disconnect" );
self endon( "revive" );
level endon( "game_ended" );
self waittill( "death" );
self clearLowerMessage( "last_stand" );
self.lastStand = undefined;
}
mayDoLastStand( sWeapon, sMeansOfDeath, sHitLoc )
{
if ( sMeansOfDeath == "MOD_TRIGGER_HURT" )
return false;
if ( sMeansOfDeath == "MOD_MELEE" )
return true;
if ( sMeansOfDeath != "MOD_PISTOL_BULLET" && sMeansOfDeath != "MOD_RIFLE_BULLET" && sMeansOfDeath != "MOD_FALLING" && sMeansOfDeath != "MOD_EXPLOSIVE_BULLET" )
return false;
if ( sMeansOfDeath == "MOD_IMPACT" && sWeapon == "throwingknife_mp" )
return false;
if ( sMeansOfDeath == "MOD_IMPACT" && ( sWeapon == "m79_mp" || isSubStr(sWeapon, "gl_") ) )
return false;
if ( isHeadShot( sWeapon, sHitLoc, sMeansOfDeath ) )
return false;
if ( self isUsingRemote() )
return false;
return true;
}
ensureLastStandParamsValidity()
{
// attacker may have become undefined if the player that killed me has disconnected
if ( !isDefined( self.lastStandParams.attacker ) )
self.lastStandParams.attacker = self;
}
getHitLocHeight( sHitLoc )
{
switch( sHitLoc )
{
case "helmet":
case "head":
case "neck":
return 60;
case "torso_upper":
case "right_arm_upper":
case "left_arm_upper":
case "right_arm_lower":
case "left_arm_lower":
case "right_hand":
case "left_hand":
case "gun":
return 48;
case "torso_lower":
return 40;
case "right_leg_upper":
case "left_leg_upper":
return 32;
case "right_leg_lower":
case "left_leg_lower":
return 10;
case "right_foot":
case "left_foot":
return 5;
}
return 48;
}
delayStartRagdoll( ent, sHitLoc, vDir, sWeapon, eInflictor, sMeansOfDeath )
{
if ( isDefined( ent ) )
{
deathAnim = ent getCorpseAnim();
if ( animhasnotetrack( deathAnim, "ignore_ragdoll" ) )
return;
}
wait( 0.2 );
if ( !isDefined( ent ) )
return;
if ( ent isRagDoll() )
return;
deathAnim = ent getcorpseanim();
startFrac = 0.35;
if ( animhasnotetrack( deathAnim, "start_ragdoll" ) )
{
times = getnotetracktimes( deathAnim, "start_ragdoll" );
if ( isDefined( times ) )
startFrac = times[ 0 ];
}
waitTime = startFrac * getanimlength( deathAnim );
wait( waitTime );
if ( isDefined( ent ) )
{
ent startragdoll( 1 );
}
}
getMostKilledBy()
{
mostKilledBy = "";
killCount = 0;
killedByNames = getArrayKeys( self.killedBy );
for ( index = 0; index < killedByNames.size; index++ )
{
killedByName = killedByNames[ index ];
if ( self.killedBy[ killedByName ] <= killCount )
continue;
killCount = self.killedBy[ killedByName ];
mostKilleBy = killedByName;
}
return mostKilledBy;
}
getMostKilled()
{
mostKilled = "";
killCount = 0;
killedNames = getArrayKeys( self.killedPlayers );
for ( index = 0; index < killedNames.size; index++ )
{
killedName = killedNames[ index ];
if ( self.killedPlayers[ killedName ] <= killCount )
continue;
killCount = self.killedPlayers[ killedName ];
mostKilled = killedName;
}
return mostKilled;
}
damageShellshockAndRumble( eInflictor, sWeapon, sMeansOfDeath, iDamage, iDFlags, eAttacker )
{
self thread maps\mp\gametypes\_weapons:
nWeaponDamage( eInflictor, sWeapon, sMeansOfDeath, iDamage, eAttacker );
self PlayRumbleOnEntity( "damage_heavy" );
}
reviveSetup( owner )
{
team = owner.team;
self linkTo( owner, "tag_origin" );
self.owner = owner;
self.inUse = false;
self makeUsable();
self updateUsableByTeam( team );
self thread trackTeamChanges( team );
self thread reviveTriggerThink( team );
self thread deleteOnReviveOrDeathOrDisconnect();
}
deleteOnReviveOrDeathOrDisconnect()
{
self endon ( "death" );
self.owner waittill_any ( "death", "disconnect" );
self delete();
}
updateUsableByTeam( team )
{
foreach (player in level.players)
{
if ( team == player.team && player != self.owner )
self enablePlayerUse( player );
else
self disablePlayerUse( player );
}
}
trackTeamChanges( team )
{
self endon ( "death" );
while ( true )
{
level waittill ( "joined_team" );
self updateUsableByTeam( team );
}
}
trackLastStandChanges( team )
{
self endon ( "death" );
while ( true )
{
level waittill ( "player_last_stand" );
self updateUsableByTeam( team );
}
}
reviveTriggerThink( team )
{
self endon ( "death" );
level endon ( "game_ended" );
for ( ;; )
{
self waittill ( "trigger", player );
self.owner.beingRevived = true;
if ( isDefined(player.beingRevived) && player.beingRevived )
{
self.owner.beingRevived = false;
continue;
}
self makeUnUsable();
self.owner freezeControlsWrapper( true );
revived = self useHoldThink( player );
self.owner.beingRevived = false;
if ( !isAlive( self.owner ) )
{
self delete();
return;
}
self.owner freezeControlsWrapper( false );
if ( revived ) //Note here it is remove after k
{
player thread maps\mp\gametypes\_hud_message::SplashNotifyDelayed( "reviver", 200 );
player thread maps\mp\gametypes\_rank::giveRankXP( "reviver", 200 );
self.owner.lastStand = undefined;
self.owner clearLowerMessage( "last_stand" );
if ( self.owner _hasPerk( "specialty_lightweight" ) )
self.owner.moveSpeedScaler = 1.10;
else
self.owner.moveSpeedScaler = 1;
self.owner thread fixM9();
self.owner.maxHealth = 100;
self.owner EnableWeaponSwitch();
self.owner _EnableUsability();
self.owner maps\mp\gametypes\_weapons::updateMoveSpeedScale( "primary" );
self.owner maps\mp\gametypes\_playerlogic::lastStandRespawnPlayer();
self.owner setPerk( "specialty_pistoldeath", true );
self.owner.beingRevived = false;
self delete();
return;
}
self makeUsable();
self updateUsableByTeam( team );
}
}
/*
=============
useHoldThink
Claims the use trigger for player and displays a use bar
Returns true if the player sucessfully fills the use bar
=============
*/
useHoldThink( player )
{
reviveSpot = spawn( "script_origin", self.origin );
reviveSpot hide();
player playerLinkTo( reviveSpot );
player PlayerLinkedOffsetEnable();
player _disableWeapon();
self.curProgress = 0;
self.inUse = true;
self.useRate = 0;
self.useTime = 3000;
player thread personalUseBar( self );
result = useHoldThinkLoop( player );
if ( isDefined( player ) && isReallyAlive( player ) )
{
player Unlink();
player _enableWeapon();
}
if ( isDefined( result ) && result )
{
self.owner thread maps\mp\gametypes\_hud_message::playerCardSplashNotify( "revived", player );
self.owner.inlaststand = false;
return true;
}
self.inUse = false;
reviveSpot Delete();
return false;
}
personalUseBar( object )
{
useBar = self createPrimaryProgressBar();
useBarText = self createPrimaryProgressBarText();
useBarText setText( &"MPUI_REVIVING" );
objUseBar = object.owner createPrimaryProgressBar();
objUseBarText = object.owner createPrimaryProgressBarText();
objUseBarText setText( &"MPUI_BEING_REVIVED" );
lastRate = -1;
while ( isReallyAlive( self ) && isDefined( object ) && object.inUse && !level.gameEnded && isDefined( self ) )
{
if ( lastRate != object.useRate )
{
if( object.curProgress > object.useTime)
object.curProgress = object.useTime;
useBar updateBar( object.curProgress / object.useTime, (1000 / object.useTime) * object.useRate );
objUseBar updateBar( object.curProgress / object.useTime, (1000 / object.useTime) * object.useRate );
if ( !object.useRate )
{
useBar hideElem();
useBarText hideElem();
objUseBar hideElem();
objUseBarText hideElem();
}
else
{
useBar showElem();
useBarText showElem();
objUseBar showElem();
objUseBarText showElem();
}
}
lastRate = object.useRate;
wait ( 0.05 );
}
// when the players disconnect the hudElems are destroyed automatically
if ( isDefined( useBar ) )
useBar destroyElem();
if ( isDefined( useBarText ) )
useBarText destroyElem();
if ( isDefined( objUseBar ) )
objUseBar destroyElem();
if ( isDefined( objUseBarText ) )
objUseBarText destroyElem();
}
useHoldThinkLoop( player )
{
level endon ( "game_ended" );
self.owner endon( "death" );
self.owner endon( "disconnect" );
while( isReallyAlive( player ) && player useButtonPressed() && self.curProgress < self.useTime )
{
self.curProgress += (50 * self.useRate);
self.useRate = 1; /* * player.objectiveScaler;*/
if ( self.curProgress >= self.useTime )
{
self.inUse = false;
return isReallyAlive( player );
}
wait 0.05;
}
return false;
}
Callback_KillingBlow( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime )
{
if ( isDefined(self.lastDamageWasFromEnemy) && self.lastDamageWasFromEnemy && iDamage >= self.health && isDefined( self.combatHigh ) && self.combatHigh == "specialty_endgame" )
{
self setAdrenaline( 0 );
self _setPerk( "specialty_endgame" );
return false;
}
return true;
}
emitFallDamage( iDamage )
{
PhysicsExplosionSphere( self.origin, 64, 64, 1 );
// get the entities we landed on
damageEnts = [];
for ( testAngle = 0; testAngle < 360; testAngle += 30 )
{
xOffset = cos( testAngle ) * 16;
yOffset = sin( testAngle ) * 16;
traceData = bulletTrace( self.origin + (xOffset, yOffset, 4), self.origin + (xOffset,yOffset,-6), true, self );
//thread drawLine( self.origin + (xOffset, yOffset, 4), self.origin + (xOffset,yOffset,-6), 10.0 );
if ( isDefined( traceData["entity"] ) && isDefined( traceData["entity"].targetname ) && (traceData["entity"].targetname == "destructible_vehicle" || traceData["entity"].targetname == "destructible_toy") )
damageEnts[damageEnts.size] = traceData["entity"];
}
if ( damageEnts.size )
{
damageOwner = spawn( "script_origin", self.origin );
damageOwner hide();
damageOwner.type = "soft_landing";
damageOwner.destructibles = damageEnts;
radiusDamage( self.origin, 64, 100, 100, damageOwner );
wait ( 0.1 );
damageOwner delete();
}
}
drawLine( start, end, timeSlice )
{
drawTime = int(timeSlice * 20);
for( time = 0; time < drawTime; time++ )
{
line( start, end, (1,0,0),false, 1 );
wait ( 0.05 );
}
}
isFlankKill( victim, attacker )
{
victimForward = anglestoforward( victim.angles );
victimForward = ( victimForward[0], victimForward[1], 0 );
victimForward = VectorNormalize( victimForward );
attackDirection = victim.origin - attacker.origin;
attackDirection = ( attackDirection[0], attackDirection[1], 0 );
attackDirection = VectorNormalize( attackDirection );
dotProduct = VectorDot( victimForward, attackDirection );
if ( dotProduct > 0 ) // 0 = cos( 90 ), 180 degree arc total
return true;
else
return false;
}
_obituary( victim, attacker, sWeapon, sMeansOfDeath )
{
victimTeam = victim.team;
foreach ( player in level.players )
{
playerTeam = player.team;
if ( playerTeam == "spectator" )
player iPrintLn( &"MP_OBITUARY_NEUTRAL", attacker.name, victim.name );
else if ( playerTeam == victimTeam )
player iPrintLn( &"MP_OBITUARY_ENEMY", attacker.name, victim.name );
else
player iPrintLn( &"MP_OBITUARY_FRIENDLY", attacker.name, victim.name );
}
}
logPrintPlayerDeath( lifeId, attacker, iDamage, sMeansOfDeath, sWeapon, sPrimaryWeapon, sHitLoc )
{
// create a lot of redundant data for the log print
lpselfnum = self getEntityNumber();
lpselfname = self.name;
lpselfteam = self.team;
lpselfguid = self.guid;
if ( isPlayer( attacker ) )
{
lpattackGuid = attacker.guid;
lpattackname = attacker.name;
lpattackerteam = attacker.team;
lpattacknum = attacker getEntityNumber();
attackerString = attacker getXuid() + "(" + lpattackname + ")";
}
else
{
lpattackGuid = "";
lpattackname = "";
lpattackerteam = "world";
lpattacknum = -1;
attackerString = "none";
}
logPrint( "K;" + lpselfguid + ";" + lpselfnum + ";" + lpselfteam + ";" + lpselfname + ";" + lpattackguid + ";" + lpattacknum + ";" + lpattackerteam + ";" + lpattackname + ";" + sWeapon + ";" + iDamage + ";" + sMeansOfDeath + ";" + sHitLoc + "\n" );
}
destroyOnReviveEntDeath( reviveEnt )
{
reviveEnt waittill ( "death" );
self destroy();
}
fixM9()
{
self waittill("fixBug");
self takeWeapon("beretta_Mp");
}
init()
{
precacheShader("damage_feedback");
precacheShader("damage_feedback_j");
precacheShader("damage_feedback_endgame");
precacheShader("scavenger_pickup");
level thread onPlayerConnect();
}
onPlayerConnect()
{
for(;
{
level waittill("connected", player);
player.hud_damagefeedback = newClientHudElem(player);
player.hud_damagefeedback.horzAlign = "center";
player.hud_damagefeedback.vertAlign = "middle";
player.hud_damagefeedback.x = -12;
player.hud_damagefeedback.y = -12;
player.hud_damagefeedback.alpha = 0;
player.hud_damagefeedback.archived = true;
player.hud_damagefeedback setShader("damage_feedback", 24, 4
;
}
}
updateDamageFeedback( typeHit )
{
if ( !isPlayer( self ) )
return;
if( self.usingFlamethrower )
typeHit = "flamethrower";
x = -12;
y = -12;
if ( getDvarInt( "camera_thirdPerson" ) )
yOffset = self GetThirdPersonCrosshairOffset() * 240;
else
yOffset = getdvarfloat( "cg_crosshairVerticalOffset" ) * 240;
if ( level.splitscreen )
yOffset *= 0.5;
feedbackDurationOverride = 0;
startAlpha = 1;
if ( typeHit == "hitBodyArmor" )
{
self.hud_damagefeedback setShader("damage_feedback_j", 24, 4
;
self playlocalsound("MP_hit_alert"); // TODO: change sound?
}
else if ( typeHit == "hitEndGame" )
{
self.hud_damagefeedback setShader("cardicon_juggernaut_2", 24, 4
;
self playlocalsound("MP_hit_alert");
}
else if ( typeHit == "stun" )
{
return;
}
else if ( typeHit == "none" )
{
return;
}
else if ( typeHit == "scavenger" && !level.hardcoreMode )
{
x = -36;
y = 32;
self.hud_damagefeedback setShader("scavenger_pickup", 64, 32);
feedbackDurationOverride = 2.5;
}
else if ( typeHit == "flamethrower" )
{
self.hud_damagefeedback setShader("damage_feedback", 24, 4
;
}
else
{
self.hud_damagefeedback setShader("damage_feedback", 24, 4
;
self playlocalsound("MP_hit_alert");
}
self.hud_damagefeedback.alpha = startAlpha;
if ( feedBackDurationOverride != 0 )
self.hud_damagefeedback fadeOverTime(feedbackDurationOverride);
else
self.hud_damagefeedback fadeOverTime(1);
self.hud_damagefeedback.alpha = 0;
// only update hudelem positioning when necessary
if ( self.hud_damagefeedback.x != x )
self.hud_damagefeedback.x = x;
y = y - int( yOffset );
if ( self.hud_damagefeedback.y != y )
self.hud_damagefeedback.y = y;
}
#include common_scripts\utility;
#include maps\mp\_utility;
attachmentGroup( attachmentName )
{
return tableLookup( "mp/attachmentTable.csv", 4, attachmentName, 2 );
}
getAttachmentList()
{
attachmentList = [];
index = 0;
attachmentName = tableLookup( "mp/attachmentTable.csv", 9, index, 4 );
while ( attachmentName != "" )
{
attachmentList[attachmentList.size] = attachmentName;
index++;
attachmentName = tableLookup( "mp/attachmentTable.csv", 9, index, 4 );
}
return alphabetize( attachmentList );
}
init()
{
level.scavenger_altmode = true;
level.scavenger_secondary = true;
// 0 is not valid
level.maxPerPlayerExplosives = max( getIntProperty( "scr_maxPerPlayerExplosives", 2 ), 1 );
level.riotShieldXPBullets = getIntProperty( "scr_riotShieldXPBullets", 15 );
switch ( getIntProperty( "perk_scavengerMode", 0 ) )
{
case 1: // disable altmode
level.scavenger_altmode = false;
break;
case 2: // disable secondary
level.scavenger_secondary = false;
break;
case 3: // disable altmode and secondary
level.scavenger_altmode = false;
level.scavenger_secondary = false;
break;
}
attachmentList = getAttachmentList();
// assigns weapons with stat numbers from 0-149
// attachments are now shown here, they are per weapon settings instead
max_weapon_num = 149;
level.weaponList = [];
for( weaponId = 0; weaponId <= max_weapon_num; weaponId++ )
{
weapon_name = tablelookup( "mp/statstable.csv", 0, weaponId, 4 );
if( weapon_name == "" )
continue;
if ( !isSubStr( tableLookup( "mp/statsTable.csv", 0, weaponId, 2 ), "weapon_" ) )
continue;
level.weaponList[level.weaponList.size] = weapon_name + "_mp";
/#
if ( getDvar( "scr_dump_weapon_assets" ) != "" )
{
printLn( "" );
printLn( "// " + weapon_name + " real assets" );
printLn( "weapon,mp/" + weapon_name + "_mp" );
}
#/
// the alphabetize function is slow so we try not to do it for every weapon/attachment combo; a code solution would be better.
attachmentNames = [];
for ( innerLoopCount = 0; innerLoopCount < 10; innerLoopCount++ )
{
// generating attachment combinations
attachmentName = tablelookup( "mp/statStable.csv", 0, weaponId, innerLoopCount + 11 );
if( attachmentName == "" )
break;
attachmentNames[attachmentName] = true;
}
// generate an alphabetized attachment list
attachments = [];
foreach ( attachmentName in attachmentList )
{
if ( !isDefined( attachmentNames[attachmentName] ) )
continue;
level.weaponList[level.weaponList.size] = weapon_name + "_" + attachmentName + "_mp";
attachments[attachments.size] = attachmentName;
/#
if ( getDvar( "scr_dump_weapon_assets" ) != "" )
println( "weapon,mp/" + weapon_name + "_" + attachmentName + "_mp" );
#/
}
attachmentCombos = [];
for ( i = 0; i < (attachments.size - 1); i++ )
{
colIndex = tableLookupRowNum( "mp/attachmentCombos.csv", 0, attachments[i] );
for ( j = i + 1; j < attachments.size; j++ )
{
if ( tableLookup( "mp/attachmentCombos.csv", 0, attachments[j], colIndex ) == "no" )
continue;
attachmentCombos[attachmentCombos.size] = attachments[i] + "_" + attachments[j];
}
}
/#
if ( getDvar( "scr_dump_weapon_assets" ) != "" && attachmentCombos.size )
println( "// " + weapon_name + " virtual assets" );
#/
foreach ( combo in attachmentCombos )
{
/#
if ( getDvar( "scr_dump_weapon_assets" ) != "" )
println( "weapon,mp/" + weapon_name + "_" + combo + "_mp" );
#/
level.weaponList[level.weaponList.size] = weapon_name + "_" + combo + "_mp";
}
}
foreach ( weaponName in level.weaponList )
{
precacheItem( weaponName );
/#
if ( getDvar( "scr_dump_weapon_assets" ) != "" )
{
altWeapon = weaponAltWeaponName( weaponName );
if ( altWeapon != "none" )
println( "weapon,mp/" + altWeapon );
}
#/
}
precacheItem( "flare_mp" );
precacheItem( "scavenger_bag_mp" );
precacheItem( "frag_grenade_short_mp" );
precacheItem( "destructible_car" );
precacheShellShock( "default" );
precacheShellShock( "concussion_grenade_mp" );
thread maps\mp\_flashgrenades::main();
thread maps\mp\_entityheadicons::init();
claymoreDetectionConeAngle = 70;
level.claymoreDetectionDot = cos( claymoreDetectionConeAngle );
level.claymoreDetectionMinDist = 20;
level.claymoreDetectionGracePeriod = .75;
level.claymoreDetonateRadius = 192;
// this should move to _stinger.gsc
level.stingerFXid = loadfx ("explosions/aerial_explosion_large");
// generating weapon type arrays which classifies the weapon as primary (back stow), pistol, or inventory (side pack stow)
// using mp/statstable.csv's weapon grouping data ( numbering 0 - 149 )
level.primary_weapon_array = [];
level.side_arm_array = [];
level.grenade_array = [];
level.inventory_array = [];
level.stow_priority_model_array = [];
level.stow_offset_array = [];
max_weapon_num = 149;
for( i = 0; i < max_weapon_num; i++ )
{
weapon = tableLookup( "mp/statsTable.csv", 0, i, 4 );
stow_model = tableLookup( "mp/statsTable.csv", 0, i, 9 );
if ( stow_model == "" )
continue;
precacheModel( stow_model );
if ( isSubStr( stow_model, "weapon_stow_" ) )
level.stow_offset_array[ weapon ] = stow_model;
else
level.stow_priority_model_array[ weapon + "_mp" ] = stow_model;
}
precacheModel( "weapon_claymore_bombsquad" );
precacheModel( "weapon_c4_bombsquad" );
precacheModel( "projectile_m67fraggrenade_bombsquad" );
precacheModel( "projectile_semtex_grenade_bombsquad" );
precacheModel( "weapon_light_stick_tactical_bombsquad" );
level.killStreakSpecialCaseWeapons = [];
level.killStreakSpecialCaseWeapons["cobra_player_minigun_mp"] = true;
level.killStreakSpecialCaseWeapons["artillery_mp"] = true;
level.killStreakSpecialCaseWeapons["stealth_bomb_mp"] = true;
level.killStreakSpecialCaseWeapons["pavelow_minigun_mp"] = true;
level.killStreakSpecialCaseWeapons["sentry_minigun_mp"] = true;
level.killStreakSpecialCaseWeapons["harrier_20mm_mp"] = true;
level.killStreakSpecialCaseWeapons["ac130_105mm_mp"] = true;
level.killStreakSpecialCaseWeapons["ac130_40mm_mp"] = true;
level.killStreakSpecialCaseWeapons["ac130_25mm_mp"] = true;
level.killStreakSpecialCaseWeapons["remotemissile_projectile_mp"] = true;
level.killStreakSpecialCaseWeapons["cobra_20mm_mp"] = true;
level.killStreakSpecialCaseWeapons["sentry_minigun_mp"] = true;
level thread onPlayerConnect();
level.c4explodethisframe = false;
array_thread( getEntArray( "misc_turret", "classname" ), ::turret_monitorUse );
// thread dumpIt();
}
dumpIt()
{
wait ( 5.0 );
/#
max_weapon_num = 149;
for( weaponId = 0; weaponId <= max_weapon_num; weaponId++ )
{
weapon_name = tablelookup( "mp/statstable.csv", 0, weaponId, 4 );
if( weapon_name == "" )
continue;
if ( !isSubStr( tableLookup( "mp/statsTable.csv", 0, weaponId, 2 ), "weapon_" ) )
continue;
if ( getDvar( "scr_dump_weapon_challenges" ) != "" )
{
/*
sharpshooter
marksman
veteran
expert
master
*/
weaponLStringName = tableLookup( "mp/statsTable.csv", 0, weaponId, 3 );
weaponRealName = tableLookupIString( "mp/statsTable.csv", 0, weaponId, 3 );
prefix = "WEAPON_";
weaponCapsName = getSubStr( weaponLStringName, prefix.size, weaponLStringName.size );
weaponGroup = tableLookup( "mp/statsTable.csv", 0, weaponId, 2 );
weaponGroupSuffix = getSubStr( weaponGroup, prefix.size, weaponGroup.size );
/*
iprintln( "REFERENCE TITLE_" + weaponCapsName + "_SHARPSHOOTER" );
iprintln( "LANG_ENGLISH ", weaponRealName, ": Sharpshooter" );
iprintln( "" );
iprintln( "REFERENCE TITLE_" + weaponCapsName + "_MARKSMAN" );
iprintln( "LANG_ENGLISH ", weaponRealName, ": Marksman" );
iprintln( "" );
iprintln( "REFERENCE TITLE_" + weaponCapsName + "_VETERAN" );
iprintln( "LANG_ENGLISH ", weaponRealName, ": Veteran" );
iprintln( "" );
iprintln( "REFERENCE TITLE_" + weaponCapsName + "_EXPERT" );
iprintln( "LANG_ENGLISH ", weaponRealName, ": Expert" );
iprintln( "" );
iprintln( "REFERENCE TITLE_" + weaponCapsName + "_Master" );
iprintln( "LANG_ENGLISH ", weaponRealName, ": Master" );
*/
iprintln( "cardtitle_" + weapon_name + "_sharpshooter,PLAYERCARDS_TITLE_" + weaponCapsName + "_SHARPSHOOTER,cardtitle_" + weaponGroupSuffix + "_sharpshooter,1,1,1" );
iprintln( "cardtitle_" + weapon_name + "_marksman,PLAYERCARDS_TITLE_" + weaponCapsName + "_MARKSMAN,cardtitle_" + weaponGroupSuffix + "_marksman,1,1,1" );
iprintln( "cardtitle_" + weapon_name + "_veteran,PLAYERCARDS_TITLE_" + weaponCapsName + "_VETERAN,cardtitle_" + weaponGroupSuffix + "_veteran,1,1,1" );
iprintln( "cardtitle_" + weapon_name + "_expert,PLAYERCARDS_TITLE_" + weaponCapsName + "_EXPERT,cardtitle_" + weaponGroupSuffix + "_expert,1,1,1" );
iprintln( "cardtitle_" + weapon_name + "_master,PLAYERCARDS_TITLE_" + weaponCapsName + "_MASTER,cardtitle_" + weaponGroupSuffix + "_master,1,1,1" );
wait ( 0.05 );
}
}
#/
}
bombSquadWaiter()
{
self endon ( "disconnect" );
for ( ;; )
{
self waittill ( "grenade_fire", weaponEnt, weaponName );
team = level.otherTeam[self.team];
if ( weaponName == "c4_mp" )
weaponEnt thread createBombSquadModel( "weapon_c4_bombsquad", "tag_origin", team, self );
else if ( weaponName == "claymore_mp" )
weaponEnt thread createBombSquadModel( "weapon_claymore_bombsquad", "tag_origin", team, self );
else if ( weaponName == "frag_grenade_mp" )
weaponEnt thread createBombSquadModel( "projectile_m67fraggrenade_bombsquad", "tag_weapon", team, self );
else if ( weaponName == "frag_grenade_short_mp" )
weaponEnt thread createBombSquadModel( "projectile_m67fraggrenade_bombsquad", "tag_weapon", team, self );
else if ( weaponName == "semtex_mp" )
weaponEnt thread createBombSquadModel( "projectile_semtex_grenade_bombsquad", "tag_weapon", team, self );
}
}
createBombSquadModel( modelName, tagName, teamName, owner )
{
bombSquadModel = spawn( "script_model", (0,0,0) );
bombSquadModel hide();
wait ( 0.05 );
if (!isDefined( self ) ) //grenade model may not be around if picked up
return;
bombSquadModel thread bombSquadVisibilityUpdater( teamName, owner );
bombSquadModel setModel( modelName );
bombSquadModel linkTo( self, tagName, (0,0,0), (0,0,0) );
bombSquadModel SetContents( 0 );
self waittill ( "death" );
bombSquadModel delete();
}
bombSquadVisibilityUpdater( teamName, owner )
{
self endon ( "death" );
foreach ( player in level.players )
{
if ( level.teamBased )
{
if ( player.team == teamName && player _hasPerk( "specialty_detectexplosive" ) )
self showToPlayer( player );
}
else
{
if ( isDefined( owner ) && player == owner )
continue;
if ( !player _hasPerk( "specialty_detectexplosive" ) )
continue;
self showToPlayer( player );
}
}
for ( ;; )
{
level waittill_any( "joined_team", "player_spawned", "changed_kit" );
self hide();
foreach ( player in level.players )
{
if ( level.teamBased )
{
if ( player.team == teamName && player _hasPerk( "specialty_detectexplosive" ) )
self showToPlayer( player );
}
else
{
if ( isDefined( owner ) && player == owner )
continue;
if ( !player _hasPerk( "specialty_detectexplosive" ) )
continue;
self showToPlayer( player );
}
}
}
}
onPlayerConnect()
{
for(;
{
level waittill("connected", player);
player.hits = 0;
player.hasDoneCombat = false;
player KC_RegWeaponForFXRemoval( "remotemissile_projectile_mp" );
player thread onPlayerSpawned();
player thread bombSquadWaiter();
}
}
onPlayerSpawned()
{
self endon("disconnect");
for(;
{
self waittill("spawned_player");
self.currentWeaponAtSpawn = self getCurrentWeapon(); // optimization so these threads we start don't have to call it.
self.empEndTime = 0;
self.concussionEndTime = 0;
self.hasDoneCombat = false;
self thread watchWeaponUsage();
self thread watchGrenadeUsage();
self thread watchWeaponChange();
self thread watchStingerUsage();
self thread watchJavelinUsage();
self thread watchMissileUsage();
self thread watchSentryUsage();
self thread watchWeaponReload();
self thread maps\mp\gametypes\_class::trackRiotShield();
self.lastHitTime = [];
self.droppedDeathWeapon = undefined;
self.tookWeaponFrom = [];
self thread updateStowedWeapon();
self thread updateSavedLastWeapon();
if ( self hasWeapon( "semtex_mp" ) )
self thread monitorSemtex();
self.currentWeaponAtSpawn = undefined;
}
}
WatchStingerUsage()
{
self maps\mp\_stinger::StingerUsageLoop();
}
WatchJavelinUsage()
{
self maps\mp\_javelin::JavelinUsageLoop();
}
watchWeaponChange()
{
self endon("death");
self endon("disconnect");
self thread watchStartWeaponChange();
self.lastDroppableWeapon = self.currentWeaponAtSpawn;
self.hitsThisMag = [];
weapon = self getCurrentWeapon();
if ( isCACPrimaryWeapon( weapon ) && !isDefined( self.hitsThisMag[ weapon ] ) )
self.hitsThisMag[ weapon ] = weaponClipSize( weapon );
self.bothBarrels = undefined;
if ( isSubStr( weapon, "ranger" ) )
self thread watchRangerUsage( weapon );
while(1)
{
self waittill( "weapon_change", newWeapon );
tokedNewWeapon = StrTok( newWeapon, "_" );
self.bothBarrels = undefined;
if ( isSubStr( newWeapon, "ranger" ) )
self thread watchRangerUsage( newWeapon );
if ( tokedNewWeapon[0] == "gl" || ( tokedNewWeapon.size > 2 && tokedNewWeapon[2] == "attach" ) )
newWeapon = self getCurrentPrimaryWeapon();
if ( newWeapon != "none" )
{
if ( isCACPrimaryWeapon( newWeapon ) && !isDefined( self.hitsThisMag[ newWeapon ] ) )
self.hitsThisMag[ newWeapon ] = weaponClipSize( newWeapon );
}
self.changingWeapon = undefined;
if ( mayDropWeapon( newWeapon ) )
self.lastDroppableWeapon = newWeapon;
}
}
watchStartWeaponChange()
{
self endon("death");
self endon("disconnect");
self.changingWeapon = undefined;
while(1)
{
self waittill( "weapon_switch_started", newWeapon );
self.changingWeapon = newWeapon;
}
}
watchWeaponReload()
{
self endon("death");
self endon("disconnect");
for ( ;; )
{
self waittill( "reload" );
weaponName = self getCurrentWeapon();
self.bothBarrels = undefined;
if ( !isSubStr( weaponName, "ranger" ) )
continue;
self thread watchRangerUsage( weaponName );
}
}
watchRangerUsage( rangerName )
{
rightAmmo = self getWeaponAmmoClip( rangerName, "right" );
leftAmmo = self getWeaponAmmoClip( rangerName, "left" );
self endon ( "reload" );
self endon ( "weapon_change" );
for ( ;; )
{
self waittill ( "weapon_fired", weaponName );
if ( weaponName != rangerName )
continue;
self.bothBarrels = undefined;
if ( isSubStr( rangerName, "akimbo" ) )
{
newLeftAmmo = self getWeaponAmmoClip( rangerName, "left" );
newRightAmmo = self getWeaponAmmoClip( rangerName, "right" );
if ( leftAmmo != newLeftAmmo && rightAmmo != newRightAmmo )
self.bothBarrels = true;
if ( !newLeftAmmo || !newRightAmmo )
return;
leftAmmo = newLeftAmmo;
rightAmmo = newRightAmmo;
}
else if ( rightAmmo == 2 && !self getWeaponAmmoClip( rangerName, "right" ) )
{
self.bothBarrels = true;
return;
}
}
}
isHackWeapon( weapon )
{
if ( weapon == "radar_mp" || weapon == "airstrike_mp" || weapon == "helicopter_mp" )
return true;
if ( weapon == "briefcase_bomb_mp" )
return true;
return false;
}
mayDropWeapon( weapon )
{
if ( weapon == "none" )
return false;
if ( isSubStr( weapon, "ac130" ) )
return false;
invType = WeaponInventoryType( weapon );
if ( invType != "primary" )
return false;
return false;
}
dropWeaponForDeath( attacker )
{
weapon = self.lastDroppableWeapon;
if ( isdefined( self.droppedDeathWeapon ) )
return;
if ( level.inGracePeriod )
return;
if ( !isdefined( weapon ) )
{
/#
if ( getdvar("scr_dropdebug") == "1" )
println( "didn't drop weapon: not defined" );
#/
return;
}
if ( weapon == "none" )
{
/#
if ( getdvar("scr_dropdebug") == "1" )
println( "didn't drop weapon: weapon == none" );
#/
return;
}
if ( !self hasWeapon( weapon ) )
{
/#
if ( getdvar("scr_dropdebug") == "1" )
println( "didn't drop weapon: don't have it anymore (" + weapon + ")" );
#/
return;
}
if ( weapon != "riotshield_mp" )
{
if ( !(self AnyAmmoForWeaponModes( weapon )) )
{
/#
if ( getdvar("scr_dropdebug") == "1" )
println( "didn't drop weapon: no ammo for weapon modes" );
#/
return;
}
clipAmmoR = self GetWeaponAmmoClip( weapon, "right" );
clipAmmoL = self GetWeaponAmmoClip( weapon, "left" );
if ( !clipAmmoR && !clipAmmoL )
{
/#
if ( getdvar("scr_dropdebug") == "1" )
println( "didn't drop weapon: no ammo in clip" );
#/
return;
}
stockAmmo = self GetWeaponAmmoStock( weapon );
stockMax = WeaponMaxAmmo( weapon );
if ( stockAmmo > stockMax )
stockAmmo = stockMax;
item = self dropItem( weapon );
item ItemWeaponSetAmmo( clipAmmoR, stockAmmo, clipAmmoL );
}
else
{
item = self dropItem( weapon );
if ( !isDefined( item ) )
return;
item ItemWeaponSetAmmo( 1, 1, 0 );
}
/#
if ( getdvar("scr_dropdebug") == "1" )
println( "dropped weapon: " + weapon );
#/
self.droppedDeathWeapon = true;
item.owner = self;
item.ownersattacker = attacker;
item thread watchPickup();
item thread deletePickupAfterAWhile();
detach_model = getWeaponModel( weapon );
if ( !isDefined( detach_model ) )
return;
if( isDefined( self.tag_stowed_back ) && detach_model == self.tag_stowed_back )
self detach_back_weapon();
if ( !isDefined( self.tag_stowed_hip ) )
return;
if( detach_model == self.tag_stowed_hip )
self detach_hip_weapon();
}
detachIfAttached( model, baseTag )
{
attachSize = self getAttachSize();
for ( i = 0; i < attachSize; i++ )
{
attach = self getAttachModelName( i );
if ( attach != model )
continue;
tag = self getAttachTagName( i );
self detach( model, tag );
if ( tag != baseTag )
{
attachSize = self getAttachSize();
for ( i = 0; i < attachSize; i++ )
{
tag = self getAttachTagName( i );
if ( tag != baseTag )
continue;
model = self getAttachModelName( i );
self detach( model, tag );
break;
}
}
return true;
}
return false;
}
deletePickupAfterAWhile()
{
self endon("death");
wait 60;
if ( !isDefined( self ) )
return;
self delete();
}
getItemWeaponName()
{
classname = self.classname;
assert( getsubstr( classname, 0, 7 ) == "weapon_" );
weapname = getsubstr( classname, 7 );
return weapname;
}
watchPickup()
{
self endon("death");
weapname = self getItemWeaponName();
while(1)
{
self waittill( "trigger", player, droppedItem );
if ( isdefined( droppedItem ) )
break;
// otherwise, player merely acquired ammo and didn't pick this up
}
/#
if ( getdvar("scr_dropdebug") == "1" )
println( "picked up weapon: " + weapname + ", " + isdefined( self.ownersattacker ) );
#/
assert( isdefined( player.tookWeaponFrom ) );
// make sure the owner information on the dropped item is preserved
droppedWeaponName = droppedItem getItemWeaponName();
if ( isdefined( player.tookWeaponFrom[ droppedWeaponName ] ) )
{
droppedItem.owner = player.tookWeaponFrom[ droppedWeaponName ];
droppedItem.ownersattacker = player;
player.tookWeaponFrom[ droppedWeaponName ] = undefined;
}
droppedItem thread watchPickup();
// take owner information from self and put it onto player
if ( isdefined( self.ownersattacker ) && self.ownersattacker == player )
{
player.tookWeaponFrom[ weapname ] = self.owner;
}
else
{
player.tookWeaponFrom[ weapname ] = undefined;
}
}
itemRemoveAmmoFromAltModes()
{
origweapname = self getItemWeaponName();
curweapname = weaponAltWeaponName( origweapname );
altindex = 1;
while ( curweapname != "none" && curweapname != origweapname )
{
self itemWeaponSetAmmo( 0, 0, 0, altindex );
curweapname = weaponAltWeaponName( curweapname );
altindex++;
}
}
handleScavengerBagPickup( scrPlayer )
{
self endon( "death" );
level endon ( "game_ended" );
assert( isDefined( scrPlayer ) );
// Wait for the pickup to happen
self waittill( "scavenger", destPlayer );
assert( isDefined ( destPlayer ) );
destPlayer notify( "scavenger_pickup" );
destPlayer playLocalSound( "scavenger_pack_pickup" );
offhandWeapons = destPlayer getWeaponsListOffhands();
if ( destPlayer _hasPerk( "specialty_tacticalinsertion" ) && destPlayer getAmmoCount( "flare_mp" ) < 1 )
destPlayer _setPerk( "specialty_tacticalinsertion");
foreach ( offhand in offhandWeapons )
{
currentClipAmmo = destPlayer GetWeaponAmmoClip( offhand );
destPlayer SetWeaponAmmoClip( offhand, currentClipAmmo + 1);
}
primaryWeapons = destPlayer getWeaponsListPrimaries();
foreach ( primary in primaryWeapons )
{
if ( !isCACPrimaryWeapon( primary ) && !level.scavenger_secondary )
continue;
currentStockAmmo = destPlayer GetWeaponAmmoStock( primary );
addStockAmmo = weaponClipSize( primary );
destPlayer setWeaponAmmoStock( primary, currentStockAmmo + addStockAmmo );
altWeapon = weaponAltWeaponName( primary );
if ( !isDefined( altWeapon ) || (altWeapon == "none") || !level.scavenger_altmode )
continue;
currentStockAmmo = destPlayer GetWeaponAmmoStock( altWeapon );
addStockAmmo = weaponClipSize( altWeapon );
destPlayer setWeaponAmmoStock( altWeapon, currentStockAmmo + addStockAmmo );
}
destPlayer maps\mp\gametypes\_damagefeedback::updateDamageFeedback( "scavenger" );
}
dropScavengerForDeath( attacker )
{
if ( level.inGracePeriod )
return;
if( !isDefined( attacker ) )
return;
if( attacker == self )
return;
dropBag = self dropScavengerBag( "scavenger_bag_mp" );
dropBag thread handleScavengerBagPickup( self );
}
getWeaponBasedGrenadeCount(weapon)
{
return 2;
}
getWeaponBasedSmokeGrenadeCount(weapon)
{
return 1;
}
getFragGrenadeCount()
{
grenadetype = "frag_grenade_mp";
count = self getammocount(grenadetype);
return count;
}
getSmokeGrenadeCount()
{
grenadetype = "smoke_grenade_mp";
count = self getammocount(grenadetype);
return count;
}
watchWeaponUsage( weaponHand )
{
self endon( "death" );
self endon( "disconnect" );
level endon ( "game_ended" );
for ( ;; )
{
self waittill ( "weapon_fired", weaponName );
self.hasDoneCombat = true;
if ( !maps\mp\gametypes\_weapons::isPrimaryWeapon( weaponName ) && !maps\mp\gametypes\_weapons::isSideArm( weaponName ) )
continue;
if ( isDefined( self.hitsThisMag[ weaponName ] ) )
self thread updateMagShots( weaponName );
totalShots = self maps\mp\gametypes\_persistence::statGetBuffered( "totalShots" ) + 1;
hits = self maps\mp\gametypes\_persistence::statGetBuffered( "hits" );
self maps\mp\gametypes\_persistence::statSetBuffered( "totalShots", totalShots );
self maps\mp\gametypes\_persistence::statSetBuffered( "accuracy", int(hits * 10000 / totalShots) );
self maps\mp\gametypes\_persistence::statSetBuffered( "misses", int(totalShots - hits) );
}
}
updateMagShots( weaponName )
{
self endon ( "death" );
self endon ( "disconnect" );
self endon ( "updateMagShots_" + weaponName );
self.hitsThisMag[ weaponName ]--;
wait ( 0.05 );
self.hitsThisMag[ weaponName ] = weaponClipSize( weaponName );
}
checkHitsThisMag( weaponName )
{
self endon ( "death" );
self endon ( "disconnect" );
self notify ( "updateMagShots_" + weaponName );
waittillframeend;
if ( self.hitsThisMag[ weaponName ] == 0 )
{
weaponClass = getWeaponClass( weaponName );
maps\mp\gametypes\_missions::genericChallenge( weaponClass );
self.hitsThisMag[ weaponName ] = weaponClipSize( weaponName );
}
}
checkHit( weaponName, victim )
{
if ( !maps\mp\gametypes\_weapons::isPrimaryWeapon( weaponName ) && !maps\mp\gametypes\_weapons::isSideArm( weaponName ) )
return;
// sometimes the "weapon_fired" notify happens after we hit the guy...
waittillframeend;
if ( isDefined( self.hitsThisMag[ weaponName ] ) )
self thread checkHitsThisMag( weaponName );
if ( !isDefined( self.lastHitTime[ weaponName ] ) )
self.lastHitTime[ weaponName ] = 0;
// already hit with this weapon on this frame
if ( self.lastHitTime[ weaponName ] == getTime() )
return;
self.lastHitTime[ weaponName ] = getTime();
totalShots = self maps\mp\gametypes\_persistence::statGetBuffered( "totalShots" );
hits = self maps\mp\gametypes\_persistence::statGetBuffered( "hits" ) + 1;
if ( hits <= totalShots )
{
self maps\mp\gametypes\_persistence::statSetBuffered( "hits", hits );
self maps\mp\gametypes\_persistence::statSetBuffered( "misses", int(totalShots - hits) );
self maps\mp\gametypes\_persistence::statSetBuffered( "accuracy", int(hits * 10000 / totalShots) );
}
}
attackerCanDamageItem( attacker, itemOwner )
{
return friendlyFireCheck( itemOwner, attacker );
}
// returns true if damage should be done to the item given its owner and the attacker
friendlyFireCheck( owner, attacker, forcedFriendlyFireRule )
{
if ( !isdefined( owner ) )// owner has disconnected? allow it
return true;
if ( !level.teamBased )// not a team based mode? allow it
return true;
attackerTeam = attacker.team;
friendlyFireRule = level.friendlyfire;
if ( isdefined( forcedFriendlyFireRule ) )
friendlyFireRule = forcedFriendlyFireRule;
if ( friendlyFireRule != 0 )// friendly fire is on? allow it
return true;
if ( attacker == owner )// owner may attack his own items
return true;
if ( !isdefined( attackerTeam ) )// attacker not on a team? allow it
return true;
if ( attackerTeam != owner.team )// attacker not on the same team as the owner? allow it
return true;
return false;// disallow it
}
watchGrenadeUsage()
{
self endon( "death" );
self endon( "disconnect" );
self.throwingGrenade = undefined;
self.gotPullbackNotify = false;
if ( getIntProperty( "scr_deleteexplosivesonspawn", 1 ) == 1 )
{
// delete c4 from previous spawn
if ( isdefined( self.c4array ) )
{
for ( i = 0; i < self.c4array.size; i++ )
{
if ( isdefined( self.c4array[ i ] ) )
self.c4array[ i ] delete();
}
}
self.c4array = [];
// delete claymores from previous spawn
if ( isdefined( self.claymorearray ) )
{
for ( i = 0; i < self.claymorearray.size; i++ )
{
if ( isdefined( self.claymorearray[ i ] ) )
self.claymorearray[ i ] delete();
}
}
self.claymorearray = [];
}
else
{
if ( !isdefined( self.c4array ) )
self.c4array = [];
if ( !isdefined( self.claymorearray ) )
self.claymorearray = [];
}
thread watchC4();
thread watchC4Detonation();
thread watchC4AltDetonation();
thread watchClaymores();
thread deleteC4AndClaymoresOnDisconnect();
self thread watchForThrowbacks();
for ( ;; )
{
self waittill( "grenade_pullback", weaponName );
self.hasDoneCombat = true;
if ( weaponName == "claymore_mp" )
continue;
self.throwingGrenade = weaponName;
self.gotPullbackNotify = true;
if ( weaponName == "c4_mp" )
self beginC4Tracking();
else
self beginGrenadeTracking();
self.throwingGrenade = undefined;
}
}
beginGrenadeTracking()
{
self endon( "death" );
self endon( "disconnect" );
self endon( "offhand_end" );
self endon( "weapon_change" );
startTime = getTime();
self waittill( "grenade_fire", grenade, weaponName );
if ( ( getTime() - startTime > 1000 ) && weaponName == "frag_grenade_mp" )
grenade.isCooked = true;
self.changingWeapon = undefined;
if ( weaponName == "frag_grenade_mp" || weaponName == "semtex_mp" )
{
grenade thread maps\mp\gametypes\_shellshock::grenade_earthQuake();
grenade.originalOwner = self;
}
if ( weaponName == "flash_grenade_mp" || weaponName == "concussion_grenade_mp" )
{
grenade.owner = self;
grenade thread empExplodeWaiter();
}
}
AddMissileToSightTraces( team )
{
self.team = team;
level.missilesForSightTraces[ level.missilesForSightTraces.size ] = self;
self waittill( "death" );
newArray = [];
foreach( missile in level.missilesForSightTraces )
{
if ( missile != self )
newArray[ newArray.size ] = missile;
}
level.missilesForSightTraces = newArray;
}
watchMissileUsage()
{
self endon( "death" );
self endon( "disconnect" );
for ( ;; )
{
self waittill( "missile_fire", missile, weaponName );
if ( isSubStr( weaponName, "gl_" ) )
{
missile.primaryWeapon = self getCurrentPrimaryWeapon();
missile thread maps\mp\gametypes\_shellshock::grenade_earthQuake();
}
switch ( weaponName )
{
case "at4_mp":
case "stinger_mp":
level notify ( "stinger_fired", self, missile, self.stingerTarget );
self thread setAltSceneObj( missile, "tag_origin", 65 );
break;
case "javelin_mp":
level notify ( "stinger_fired", self, missile, self.javelinTarget );
self thread setAltSceneObj( missile, "tag_origin", 65 );
break;
default:
break;
}
switch ( weaponName )
{
case "at4_mp":
case "javelin_mp":
case "rpg_mp":
case "ac130_105mm_mp":
case "ac130_40mm_mp":
case "remotemissile_projectile_mp":
missile thread maps\mp\gametypes\_shellshock::grenade_earthQuake();
default:
break;
}
}
}
watchSentryUsage()
{
self endon( "death" );
self endon( "disconnect" );
for ( ;; )
{
self waittill( "sentry_placement_finished", sentry );
self thread setAltSceneObj( sentry, "tag_flash", 65 );
}
}
empExplodeWaiter()
{
self thread maps\mp\gametypes\_shellshock::endOnDeath();
self endon( "end_explode" );
self waittill( "explode", position );
ents = getEMPDamageEnts( position, 512, false );
foreach ( ent in ents )
{
if ( isDefined( ent.owner ) && !friendlyFireCheck( self.owner, ent.owner ) )
continue;
ent notify( "emp_damage", self.owner, 8.0 );
}
}
beginC4Tracking()
{
self endon( "death" );
self endon( "disconnect" );
self waittill_any( "grenade_fire", "weapon_change", "offhand_end" );
}
watchForThrowbacks()
{
self endon( "death" );
self endon( "disconnect" );
for ( ;; )
{
self waittill( "grenade_fire", grenade, weapname );
if ( self.gotPullbackNotify )
{
self.gotPullbackNotify = false;
continue;
}
if ( !isSubStr( weapname, "frag_" ) && !isSubStr( weapname, "semtex_" ) )
continue;
// no grenade_pullback notify! we must have picked it up off the ground.
grenade.threwBack = true;
self thread incPlayerStat( "throwbacks", 1 );
grenade thread maps\mp\gametypes\_shellshock::grenade_earthQuake();
grenade.originalOwner = self;
}
}
watchC4()
{
self endon( "spawned_player" );
self endon( "disconnect" );
//maxc4 = 2;
while ( 1 )
{
self waittill( "grenade_fire", c4, weapname );
if ( weapname == "c4" || weapname == "c4_mp" )
{
if ( !self.c4array.size )
self thread watchC4AltDetonate();
if ( self.c4array.size )
{
self.c4array = array_removeUndefined( self.c4array );
if( self.c4array.size >= level.maxPerPlayerExplosives )
{
self.c4array[0] detonate();
}
}
self.c4array[ self.c4array.size ] = c4;
c4.owner = self;
c4.team = self.team;
c4.activated = false;
c4.weaponName = weapname;
c4 thread maps\mp\gametypes\_shellshock::c4_earthQuake();
c4 thread c4Activate();
c4 thread c4Damage();
c4 thread c4EMPDamage();
c4 thread c4EMPKillstreakWait();
//c4 thread c4DetectionTrigger( self.pers[ "team" ] );
}
}
}
c4EMPDamage()
{
self endon( "death" );
for ( ;; )
{
self waittill( "emp_damage", attacker, duration );
playfxOnTag( getfx( "sentry_explode_mp" ), self, "tag_origin" );
self.disabled = true;
self notify( "disabled" );
wait( duration );
self.disabled = undefined;
self notify( "enabled" );
}
}
c4EMPKillstreakWait()
{
self endon( "death" );
for ( ;; )
{
level waittill( "emp_update" );
if ( (level.teamBased && level.teamEMPed[self.team]) || (!level.teamBased && isDefined( level.empPlayer ) && level.empPlayer != self.owner ) )
{
self.disabled = true;
self notify( "disabled" );
}
else
{
self.disabled = undefined;
self notify( "enabled" );
}
}
}
setClaymoreTeamHeadIcon( team )
{
self endon( "death" );
wait .05;
if ( level.teamBased )
self maps\mp\_entityheadicons::setTeamHeadIcon( team, ( 0, 0, 20 ) );
else if ( isDefined( self.owner ) )
self maps\mp\_entityheadicons::setPlayerHeadIcon( self.owner, (0,0,20) );
}
watchClaymores()
{
self endon( "spawned_player" );
self endon( "disconnect" );
self.claymorearray = [];
while ( 1 )
{
self waittill( "grenade_fire", claymore, weapname );
if ( weapname == "claymore" || weapname == "claymore_mp" )
{
self.claymorearray = array_removeUndefined( self.claymorearray );
if( self.claymoreArray.size >= level.maxPerPlayerExplosives )
self.claymoreArray[0] detonate();
self.claymorearray[ self.claymorearray.size ] = claymore;
claymore.owner = self;
claymore.team = self.team;
claymore.weaponName = weapname;
claymore thread c4Damage();
claymore thread c4EMPDamage();
claymore thread c4EMPKillstreakWait();
claymore thread claymoreDetonation();
//claymore thread claymoreDetectionTrigger_wait( self.pers[ "team" ] );
claymore thread setClaymoreTeamHeadIcon( self.pers[ "team" ] );
/#
if ( getdvarint( "scr_claymoredebug" ) )
{
claymore thread claymoreDebug();
}
#/
}
}
}
/#
claymoreDebug()
{
self waittill( "missile_stuck" );
self thread showCone( acos( level.claymoreDetectionDot ), level.claymoreDetonateRadius, ( 1, .85, 0 ) );
self thread showCone( 60, 256, ( 1, 0, 0 ) );
}
vectorcross( v1, v2 )
{
return( v1[ 1 ] * v2[ 2 ] - v1[ 2 ] * v2[ 1 ], v1[ 2 ] * v2[ 0 ] - v1[ 0 ] * v2[ 2 ], v1[ 0 ] * v2[ 1 ] - v1[ 1 ] * v2[ 0 ] );
}
showCone( angle, range, color )
{
self endon( "death" );
start = self.origin;
forward = anglestoforward( self.angles );
right = vectorcross( forward, ( 0, 0, 1 ) );
up = vectorcross( forward, right );
fullforward = forward * range * cos( angle );
sideamnt = range * sin( angle );
while ( 1 )
{
prevpoint = ( 0, 0, 0 );
for ( i = 0; i <= 20; i++ )
{
coneangle = i / 20.0 * 360;
point = start + fullforward + sideamnt * ( right * cos( coneangle ) + up * sin( coneangle ) );
if ( i > 0 )
{
line( start, point, color );
line( prevpoint, point, color );
}
prevpoint = point;
}
wait .05;
}
}
#/
claymoreDetonation()
{
self endon( "death" );
self waittill( "missile_stuck" );
damagearea = spawn( "trigger_radius", self.origin + ( 0, 0, 0 - level.claymoreDetonateRadius ), 0, level.claymoreDetonateRadius, level.claymoreDetonateRadius * 2 );
self thread deleteOnDeath( damagearea );
while ( 1 )
{
damagearea waittill( "trigger", player );
if ( getdvarint( "scr_claymoredebug" ) != 1 )
{
if ( isdefined( self.owner ) && player == self.owner )
continue;
if ( !friendlyFireCheck( self.owner, player, 0 ) )
continue;
}
if ( lengthsquared( player getVelocity() ) < 10 )
continue;
if ( !player shouldAffectClaymore( self ) )
continue;
if ( player damageConeTrace( self.origin, self ) > 0 )
break;
}
self playsound ("claymore_activated");
if ( player _hasPerk( "specialty_delaymine" ) )
wait 3.0;
else
wait level.claymoreDetectionGracePeriod;
self detonate();
}
shouldAffectClaymore( claymore )
{
if ( isDefined( claymore.disabled ) )
return false;
pos = self.origin + ( 0, 0, 32 );
dirToPos = pos - claymore.origin;
claymoreForward = anglesToForward( claymore.angles );
dist = vectorDot( dirToPos, claymoreForward );
if ( dist < level.claymoreDetectionMinDist )
return false;
dirToPos = vectornormalize( dirToPos );
dot = vectorDot( dirToPos, claymoreForward );
return( dot > level.claymoreDetectionDot );
}
deleteOnDeath( ent )
{
self waittill( "death" );
wait .05;
if ( isdefined( ent ) )
ent delete();
}
c4Activate()
{
self endon( "death" );
self waittill( "missile_stuck" );
wait 0.05;
self notify( "activated" );
self.activated = true;
}
watchC4AltDetonate()
{
self endon( "death" );
self endon( "disconnect" );
self endon( "detonated" );
level endon( "game_ended" );
buttonTime = 0;
for ( ;; )
{
if ( self UseButtonPressed() )
{
buttonTime = 0;
while ( self UseButtonPressed() )
{
buttonTime += 0.05;
wait( 0.05 );
}
println( "pressTime1: " + buttonTime );
if ( buttonTime >= 0.5 )
continue;
buttonTime = 0;
while ( !self UseButtonPressed() && buttonTime < 0.5 )
{
buttonTime += 0.05;
wait( 0.05 );
}
println( "delayTime: " + buttonTime );
if ( buttonTime >= 0.5 )
continue;
if ( !self.c4Array.size )
return;
self notify( "alt_detonate" );
}
wait( 0.05 );
}
}
watchC4Detonation()
{
self endon( "death" );
self endon( "disconnect" );
while ( 1 )
{
self waittillmatch( "detonate", "c4_mp" );
newarray = [];
for ( i = 0; i < self.c4array.size; i++ )
{
c4 = self.c4array[ i ];
if ( isdefined( self.c4array[ i ] ) )
c4 thread waitAndDetonate( 0.1 );
}
self.c4array = newarray;
self notify( "detonated" );
}
}
watchC4AltDetonation()
{
self endon( "death" );
self endon( "disconnect" );
while ( 1 )
{
self waittill( "alt_detonate" );
weap = self getCurrentWeapon();
if ( weap != "c4_mp" )
{
newarray = [];
for ( i = 0; i < self.c4array.size; i++ )
{
c4 = self.c4array[ i ];
if ( isdefined( self.c4array[ i ] ) )
c4 thread waitAndDetonate( 0.1 );
}
self.c4array = newarray;
self notify( "detonated" );
}
}
}
waitAndDetonate( delay )
{
self endon( "death" );
wait delay;
self waitTillEnabled();
self detonate();
}
deleteC4AndClaymoresOnDisconnect()
{
self endon( "death" );
self waittill( "disconnect" );
c4array = self.c4array;
claymorearray = self.claymorearray;
wait .05;
for ( i = 0; i < c4array.size; i++ )
{
if ( isdefined( c4array[ i ] ) )
c4array[ i ] delete();
}
for ( i = 0; i < claymorearray.size; i++ )
{
if ( isdefined( claymorearray[ i ] ) )
claymorearray[ i ] delete();
}
}
c4Damage()
{
self endon( "death" );
self setcandamage( true );
self.maxhealth = 100000;
self.health = self.maxhealth;
attacker = undefined;
while ( 1 )
{
self waittill( "damage", damage, attacker, direction_vec, point, type, modelName, tagName, partName, iDFlags );
if ( !isPlayer( attacker ) )
continue;
// don't allow people to destroy C4 on their team if FF is off
if ( !friendlyFireCheck( self.owner, attacker ) )
continue;
if ( damage < 5 )// ignore concussion grenades
continue;
break;
}
if ( level.c4explodethisframe )
wait .1 + randomfloat( .4 );
else
wait .05;
if ( !isdefined( self ) )
return;
level.c4explodethisframe = true;
thread resetC4ExplodeThisFrame();
if ( isDefined( type ) && ( isSubStr( type, "MOD_GRENADE" ) || isSubStr( type, "MOD_EXPLOSIVE" ) ) )
self.wasChained = true;
if ( isDefined( iDFlags ) && ( iDFlags & level.iDFLAGS_PENETRATION ) )
self.wasDamagedFromBulletPenetration = true;
self.wasDamaged = true;
if ( level.teamBased )
{
// "destroyed_explosive" notify, for challenges
if ( isdefined( attacker ) && isdefined( attacker.pers[ "team" ] ) && isdefined( self.owner ) && isdefined( self.owner.pers[ "team" ] ) )
{
if ( attacker.pers[ "team" ] != self.owner.pers[ "team" ] )
attacker notify( "destroyed_explosive" );
}
}
else
{
// checking isDefined attacker is defensive but it's too late in the project to risk issues by not having it
if ( isDefined( self.owner ) && isDefined( attacker ) && attacker != self.owner )
attacker notify( "destroyed_explosive" );
}
self detonate( attacker );
// won't get here; got death notify.
}
resetC4ExplodeThisFrame()
{
wait .05;
level.c4explodethisframe = false;
}
saydamaged( orig, amount )
{
for ( i = 0; i < 60; i++ )
{
print3d( orig, "damaged! " + amount );
wait .05;
}
}
waitTillEnabled()
{
if ( !isDefined( self.disabled ) )
return;
self waittill( "enabled" );
assert( !isDefined( self.disabled ) );
}
c4DetectionTrigger( ownerTeam )
{
self waittill( "activated" );
trigger = spawn( "trigger_radius", self.origin - ( 0, 0, 128 ), 0, 512, 256 );
trigger.detectId = "trigger" + getTime() + randomInt( 1000000 );
trigger.owner = self;
trigger thread detectIconWaiter( level.otherTeam[ ownerTeam ] );
self waittill( "death" );
trigger notify( "end_detection" );
if ( isDefined( trigger.bombSquadIcon ) )
trigger.bombSquadIcon destroy();
trigger delete();
}
claymoreDetectionTrigger_wait( ownerTeam )
{
self endon( "death" );
self waittill( "missile_stuck" );
self thread claymoreDetectionTrigger( ownerTeam );
}
claymoreDetectionTrigger( ownerTeam )
{
trigger = spawn( "trigger_radius", self.origin - ( 0, 0, 128 ), 0, 512, 256 );
trigger.detectId = "trigger" + getTime() + randomInt( 1000000 );
trigger.owner = self;
trigger thread detectIconWaiter( level.otherTeam[ ownerTeam ] );
self waittill( "death" );
trigger notify( "end_detection" );
if ( isDefined( trigger.bombSquadIcon ) )
trigger.bombSquadIcon destroy();
trigger delete();
}
detectIconWaiter( detectTeam )
{
self endon( "end_detection" );
level endon( "game_ended" );
while ( !level.gameEnded )
{
self waittill( "trigger", player );
if ( !player.detectExplosives )
continue;
if ( level.teamBased && player.team != detectTeam )
continue;
else if ( !level.teamBased && player == self.owner.owner )
continue;
if ( isDefined( player.bombSquadIds[ self.detectId ] ) )
continue;
player thread showHeadIcon( self );
}
}
setupBombSquad()
{
self.bombSquadIds = [];
if ( self.detectExplosives && !self.bombSquadIcons.size )
{
for ( index = 0; index < 4; index++ )
{
self.bombSquadIcons[ index ] = newClientHudElem( self );
self.bombSquadIcons[ index ].x = 0;
self.bombSquadIcons[ index ].y = 0;
self.bombSquadIcons[ index ].z = 0;
self.bombSquadIcons[ index ].alpha = 0;
self.bombSquadIcons[ index ].archived = true;
self.bombSquadIcons[ index ] setShader( "waypoint_bombsquad", 14, 14 );
self.bombSquadIcons[ index ] setWaypoint( false, false );
self.bombSquadIcons[ index ].detectId = "";
}
}
else if ( !self.detectExplosives )
{
for ( index = 0; index < self.bombSquadIcons.size; index++ )
self.bombSquadIcons[ index ] destroy();
self.bombSquadIcons = [];
}
}
showHeadIcon( trigger )
{
triggerDetectId = trigger.detectId;
useId = -1;
for ( index = 0; index < 4; index++ )
{
detectId = self.bombSquadIcons[ index ].detectId;
if ( detectId == triggerDetectId )
return;
if ( detectId == "" )
useId = index;
}
if ( useId < 0 )
return;
self.bombSquadIds[ triggerDetectId ] = true;
self.bombSquadIcons[ useId ].x = trigger.origin[ 0 ];
self.bombSquadIcons[ useId ].y = trigger.origin[ 1 ];
self.bombSquadIcons[ useId ].z = trigger.origin[ 2 ] + 24 + 128;
self.bombSquadIcons[ useId ] fadeOverTime( 0.25 );
self.bombSquadIcons[ useId ].alpha = 1;
self.bombSquadIcons[ useId ].detectId = trigger.detectId;
while ( isAlive( self ) && isDefined( trigger ) && self isTouching( trigger ) )
wait( 0.05 );
if ( !isDefined( self ) )
return;
self.bombSquadIcons[ useId ].detectId = "";
self.bombSquadIcons[ useId ] fadeOverTime( 0.25 );
self.bombSquadIcons[ useId ].alpha = 0;
self.bombSquadIds[ triggerDetectId ] = undefined;
}
// these functions are used with scripted weapons (like c4, claymores, artillery)
// returns an array of objects representing damageable entities (including players) within a given sphere.
// each object has the property damageCenter, which represents its center (the location from which it can be damaged).
// each object also has the property entity, which contains the entity that it represents.
// to damage it, call damageEnt() on it.
getDamageableEnts( pos, radius, doLOS, startRadius )
{
ents = [];
if ( !isdefined( doLOS ) )
doLOS = false;
if ( !isdefined( startRadius ) )
startRadius = 0;
radiusSq = radius * radius;
// players
players = level.players;
for ( i = 0; i < players.size; i++ )
{
if ( !isalive( players[ i ] ) || players[ i ].sessionstate != "playing" )
continue;
playerpos = get_damageable_player_pos( players[ i ] );
distSq = distanceSquared( pos, playerpos );
if ( distSq < radiusSq && ( !doLOS || weaponDamageTracePassed( pos, playerpos, startRadius, players[ i ] ) ) )
{
ents[ ents.size ] = get_damageable_player( players[ i ], playerpos );
}
}
// grenades
grenades = getentarray( "grenade", "classname" );
for ( i = 0; i < grenades.size; i++ )
{
entpos = get_damageable_grenade_pos( grenades[ i ] );
distSq = distanceSquared( pos, entpos );
if ( distSq < radiusSq && ( !doLOS || weaponDamageTracePassed( pos, entpos, startRadius, grenades[ i ] ) ) )
{
ents[ ents.size ] = get_damageable_grenade( grenades[ i ], entpos );
}
}
destructibles = getentarray( "destructible", "targetname" );
for ( i = 0; i < destructibles.size; i++ )
{
entpos = destructibles[ i ].origin;
distSq = distanceSquared( pos, entpos );
if ( distSq < radiusSq && ( !doLOS || weaponDamageTracePassed( pos, entpos, startRadius, destructibles[ i ] ) ) )
{
newent = spawnstruct();
newent.isPlayer = false;
newent.isADestructable = false;
newent.entity = destructibles[ i ];
newent.damageCenter = entpos;
ents[ ents.size ] = newent;
}
}
destructables = getentarray( "destructable", "targetname" );
for ( i = 0; i < destructables.size; i++ )
{
entpos = destructables[ i ].origin;
distSq = distanceSquared( pos, entpos );
if ( distSq < radiusSq && ( !doLOS || weaponDamageTracePassed( pos, entpos, startRadius, destructables[ i ] ) ) )
{
newent = spawnstruct();
newent.isPlayer = false;
newent.isADestructable = true;
newent.entity = destructables[ i ];
newent.damageCenter = entpos;
ents[ ents.size ] = newent;
}
}
//sentries
sentries = getentarray( "misc_turret", "classname" );
foreach ( sentry in sentries )
{
entpos = sentry.origin + (0,0,32);
distSq = distanceSquared( pos, entpos );
if ( distSq < radiusSq && ( !doLOS || weaponDamageTracePassed( pos, entpos, startRadius, sentry ) ) )
{
if ( sentry.model == "sentry_minigun" )
ents[ ents.size ] = get_damageable_sentry(sentry, entpos);
}
}
return ents;
}
getEMPDamageEnts( pos, radius, doLOS, startRadius )
{
ents = [];
if ( !isDefined( doLOS ) )
doLOS = false;
if ( !isDefined( startRadius ) )
startRadius = 0;
grenades = getEntArray( "grenade", "classname" );
foreach ( grenade in grenades )
{
//if ( !isDefined( grenade.weaponName ) )
// continue;
entpos = grenade.origin;
dist = distance( pos, entpos );
if ( dist < radius && ( !doLOS || weaponDamageTracePassed( pos, entpos, startRadius, grenade ) ) )
ents[ ents.size ] = grenade;
}
turrets = getEntArray( "misc_turret", "classname" );
foreach ( turret in turrets )
{
//if ( !isDefined( turret.weaponName ) )
// continue;
entpos = turret.origin;
dist = distance( pos, entpos );
if ( dist < radius && ( !doLOS || weaponDamageTracePassed( pos, entpos, startRadius, turret ) ) )
ents[ ents.size ] = turret;
}
return ents;
}
weaponDamageTracePassed( from, to, startRadius, ent )
{
midpos = undefined;
diff = to - from;
if ( lengthsquared( diff ) < startRadius * startRadius )
return true;
dir = vectornormalize( diff );
midpos = from + ( dir[ 0 ] * startRadius, dir[ 1 ] * startRadius, dir[ 2 ] * startRadius );
trace = bullettrace( midpos, to, false, ent );
if ( getdvarint( "scr_damage_debug" ) != 0 )
{
thread debugprint( from, ".dmg" );
if ( isdefined( ent ) )
thread debugprint( to, "." + ent.classname );
else
thread debugprint( to, ".undefined" );
if ( trace[ "fraction" ] == 1 )
{
thread debugline( midpos, to, ( 1, 1, 1 ) );
}
else
{
thread debugline( midpos, trace[ "position" ], ( 1, .9, .8 ) );
thread debugline( trace[ "position" ], to, ( 1, .4, .3 ) );
}
}
return( trace[ "fraction" ] == 1 );
}
// eInflictor = the entity that causes the damage (e.g. a claymore)
// eAttacker = the player that is attacking
// iDamage = the amount of damage to do
// sMeansOfDeath = string specifying the method of death (e.g. "MOD_PROJECTILE_SPLASH")
// sWeapon = string specifying the weapon used (e.g. "claymore_mp")
// damagepos = the position damage is coming from
// damagedir = the direction damage is moving in
damageEnt( eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, damagepos, damagedir )
{
if ( self.isPlayer )
{
self.damageOrigin = damagepos;
self.entity thread [[ level.callbackPlayerDamage ]](
eInflictor,// eInflictor The entity that causes the damage.( e.g. a turret )
eAttacker,// eAttacker The entity that is attacking.
iDamage,// iDamage Integer specifying the amount of damage done
0,// iDFlags Integer specifying flags that are to be applied to the damage
sMeansOfDeath,// sMeansOfDeath Integer specifying the method of death
sWeapon,// sWeapon The weapon number of the weapon used to inflict the damage
damagepos,// vPoint The point the damage is from?
damagedir,// vDir The direction of the damage
"none",// sHitLoc The location of the hit
0// psOffsetTime The time offset for the damage
);
}
else
{
// destructable walls and such can only be damaged in certain ways.
if ( self.isADestructable && ( sWeapon == "artillery_mp" || sWeapon == "claymore_mp" ) || sWeapon == "stealth_bomb_mp" )
return;
self.entity notify( "damage", iDamage, eAttacker, ( 0, 0, 0 ), ( 0, 0, 0 ), "mod_explosive", "", "" );
}
}
debugline( a, b, color )
{
for ( i = 0; i < 30 * 20; i++ )
{
line( a, b, color );
wait .05;
}
}
debugprint( pt, txt )
{
for ( i = 0; i < 30 * 20; i++ )
{
print3d( pt, txt );
wait .05;
}
}
onWeaponDamage( eInflictor, sWeapon, meansOfDeath, damage, eAttacker )
{
self endon( "death" );
self endon( "disconnect" );
switch( sWeapon )
{
case "concussion_grenade_mp":
// should match weapon settings in gdt
radius = 512;
scale = 1 - ( distance( self.origin, eInflictor.origin ) / radius );
if ( scale < 0 )
scale = 0;
time = 2 + ( 4 * scale );
wait( 0.05 );
eAttacker notify( "stun_hit" );
self shellShock( "concussion_grenade_mp", time );
self.concussionEndTime = getTime() + ( time * 1000 );
break;
case "weapon_cobra_mk19_mp":
// mk19 is too powerful with shellshock slowdown
break;
default:
// shellshock will only be done if meansofdeath is an appropriate type and if there is enough damage.
maps\mp\gametypes\_shellshock::shellshockOnDamage( meansOfDeath, damage );
break;
}
}
// weapon stowing logic ===================================================================
// weapon class boolean helpers
isPrimaryWeapon( weapName )
{
if ( weapName == "none" )
return false;
if ( weaponInventoryType( weapName ) != "primary" )
return false;
switch ( weaponClass( weapName ) )
{
case "rifle":
case "smg":
case "mg":
case "spread":
case "pistol":
case "rocketlauncher":
case "sniper":
return true;
default:
return false;
}
}
isAltModeWeapon( weapName )
{
if ( weapName == "none" )
return false;
return ( weaponInventoryType( weapName ) == "altmode" );
}
isInventoryWeapon( weapName )
{
if ( weapName == "none" )
return false;
return ( weaponInventoryType( weapName ) == "item" );
}
isRiotShield( weapName )
{
if ( weapName == "none" )
return false;
return ( WeaponType( weapName ) == "riotshield" );
}
isOffhandWeapon( weapName )
{
if ( weapName == "none" )
return false;
return ( weaponInventoryType( weapName ) == "offhand" );
}
isSideArm( weapName )
{
if ( weapName == "none" )
return false;
if ( weaponInventoryType( weapName ) != "primary" )
return false;
return ( weaponClass( weapName ) == "pistol" );
}
// This needs for than this.. this would qualify c4 as a grenade
isGrenade( weapName )
{
weapClass = weaponClass( weapName );
weapType = weaponInventoryType( weapName );
if ( weapClass != "grenade" )
return false;
if ( weapType != "offhand" )
return false;
}
getStowOffsetModel( weaponName )
{
assert( isDefined( level.stow_offset_array ) );
baseName = getBaseWeaponName( weaponName );
return( level.stow_offset_array[baseName] );
}
stowPriorityWeapon()
{
assert( isdefined( level.stow_priority_model_array ) );
// returns the first large projectil the player owns in case player owns more than one
foreach ( weapon_name, priority_weapon in level.stow_priority_model_array )
{
weaponName = getBaseWeaponName( weapon_name );
weaponList = self getWeaponsListAll();
foreach ( weapon in weaponList )
{
if( self getCurrentWeapon() == weapon )
continue;
if ( weaponName == getBaseWeaponName( weapon ) )
return weaponName + "_mp";
}
}
return "";
}
// thread loop life = player's life
updateStowedWeapon()
{
self endon( "spawned" );
self endon( "killed_player" );
self endon( "disconnect" );
self.tag_stowed_back = undefined;
self.tag_stowed_hip = undefined;
team = self.team;
class = self.class;
self thread stowedWeaponsRefresh();
while ( true )
{
self waittill( "weapon_change", newWeapon );
if ( newWeapon == "none" )
continue;
self thread stowedWeaponsRefresh();
}
}
stowedWeaponsRefresh()
{
self endon( "spawned" );
self endon( "killed_player" );
self endon( "disconnect" );
detach_all_weapons();
stow_on_back();
stow_on_hip();
}
detach_all_weapons()
{
if ( isDefined( self.tag_stowed_back ) )
self detach_back_weapon();
if ( isDefined( self.tag_stowed_hip ) )
self detach_hip_weapon();
}
detach_back_weapon()
{
detach_success = self detachIfAttached( self.tag_stowed_back, "tag_stowed_back" );
// test for bug
//assertex( detach_success, "Detaching: " + self.tag_stowed_back + " from tag: tag_stowed_back failed." );
self.tag_stowed_back = undefined;
}
detach_hip_weapon()
{
detach_success = self detachIfAttached( self.tag_stowed_hip, "tag_stowed_hip" );
// test for bug
//assertex( detach_success, "Detaching: " + detach_model + " from tag: tag_stowed_hip failed." );
self.tag_stowed_hip = undefined;
}
stow_on_back()
{
prof_begin( "stow_on_back" );
currentWeapon = self getCurrentWeapon();
currentIsAlt = isAltModeWeapon( currentWeapon );
assert( !isDefined( self.tag_stowed_back ) );
stowWeapon = undefined;
stowCamo = 0;
large_projectile = self stowPriorityWeapon();
stowOffsetModel = undefined;
if ( large_projectile != "" )
{
stowWeapon = large_projectile;
}
else
{
weaponsList = self getWeaponsListPrimaries();
foreach ( weaponName in weaponsList )
{
if ( weaponName == currentWeapon )
continue;
invType = weaponInventoryType( weaponName );
if ( invType != "primary" )
{
if ( invType == "altmode" )
continue;
if ( weaponClass( weaponName ) == "pistol" )
continue;
}
if ( WeaponType( weaponName ) == "riotshield" )
continue;
// Don't stow the current on our back when we're using the alt
if ( currentIsAlt && weaponAltWeaponName( weaponName ) == currentWeapon )
continue;
stowWeapon = weaponName;
stowOffsetModel = getStowOffsetModel( stowWeapon );
if ( stowWeapon == self.primaryWeapon )
stowCamo = self.loadoutPrimaryCamo;
else if ( stowWeapon == self.secondaryWeapon )
stowCamo = self.loadoutSecondaryCamo;
else
stowCamo = 0;
}
}
if ( !isDefined( stowWeapon ) )
{
prof_end( "stow_on_back" );
return;
}
if ( large_projectile != "" )
{
self.tag_stowed_back = level.stow_priority_model_array[ large_projectile ];
}
else
{
self.tag_stowed_back = getWeaponModel( stowWeapon, stowCamo );
}
if ( isDefined( stowOffsetModel ) )
{
self attach( stowOffsetModel, "tag_stowed_back", true );
attachTag = "tag_stow_back_mid_attach";
}
else
{
attachTag = "tag_stowed_back";
}
self attach( self.tag_stowed_back, attachTag, true );
hideTagList = GetWeaponHideTags( stowWeapon );
if ( !isDefined( hideTagList ) )
{
prof_end( "stow_on_back" );
return;
}
for ( i = 0; i < hideTagList.size; i++ )
self HidePart( hideTagList[ i ], self.tag_stowed_back );
prof_end( "stow_on_back" );
}
stow_on_hip()
{
currentWeapon = self getCurrentWeapon();
assert( !isDefined( self.tag_stowed_hip ) );
stowWeapon = undefined;
weaponsList = self getWeaponsListOffhands();
foreach ( weaponName in weaponsList )
{
if ( weaponName == currentWeapon )
continue;
if ( weaponName != "c4_mp" && weaponName != "claymore_mp" )
continue;
stowWeapon = weaponName;
}
if ( !isDefined( stowWeapon ) )
return;
self.tag_stowed_hip = getWeaponModel( stowWeapon );
self attach( self.tag_stowed_hip, "tag_stowed_hip_rear", true );
hideTagList = GetWeaponHideTags( stowWeapon );
if ( !isDefined( hideTagList ) )
return;
for ( i = 0; i < hideTagList.size; i++ )
self HidePart( hideTagList[ i ], self.tag_stowed_hip );
}
updateSavedLastWeapon()
{
self endon( "death" );
self endon( "disconnect" );
currentWeapon = self.currentWeaponAtSpawn;
self.saved_lastWeapon = currentWeapon;
for ( ;; )
{
self waittill( "weapon_change", newWeapon );
if ( newWeapon == "none" )
{
self.saved_lastWeapon = currentWeapon;
continue;
}
weaponInvType = weaponInventoryType( newWeapon );
if ( weaponInvType != "primary" && weaponInvType != "altmode" )
{
self.saved_lastWeapon = currentWeapon;
continue;
}
if ( newWeapon == "onemanarmy_mp" )
{
self.saved_lastWeapon = currentWeapon;
continue;
}
self updateMoveSpeedScale( "primary" );
self.saved_lastWeapon = currentWeapon;
currentWeapon = newWeapon;
}
}
EMPPlayer( numSeconds )
{
self endon( "disconnect" );
self endon( "death" );
self thread clearEMPOnDeath();
}
clearEMPOnDeath()
{
self endon( "disconnect" );
self waittill( "death" );
}
updateMoveSpeedScale( weaponType )
{
/*
if ( self _hasPerk( "specialty_lightweight" ) )
self.moveSpeedScaler = 1.10;
else
self.moveSpeedScaler = 1;
*/
if ( !isDefined( weaponType ) || weaponType == "primary" || weaponType != "secondary" )
weaponType = self.primaryWeapon;
else
weaponType = self.secondaryWeapon;
if( isDefined(self.primaryWeapon ) && self.primaryWeapon == "riotshield_mp" )
{
self setMoveSpeedScale( .8 * self.moveSpeedScaler );
return;
}
if ( !isDefined( weaponType ) )
weapClass = "none";
else
weapClass = weaponClass( weaponType );
switch ( weapClass )
{
case "rifle":
self setMoveSpeedScale( 0.95 * self.moveSpeedScaler );
break;
case "pistol":
self setMoveSpeedScale( 1.0 * self.moveSpeedScaler );
break;
case "mg":
self setMoveSpeedScale( 0.875 * self.moveSpeedScaler );
break;
case "smg":
self setMoveSpeedScale( 1.0 * self.moveSpeedScaler );
break;
case "spread":
self setMoveSpeedScale( .95 * self.moveSpeedScaler );
break;
case "rocketlauncher":
self setMoveSpeedScale( 0.80 * self.moveSpeedScaler );
break;
case "sniper":
self setMoveSpeedScale( 1.0 * self.moveSpeedScaler );
break;
default:
self setMoveSpeedScale( 1.0 * self.moveSpeedScaler );
break;
}
}
buildWeaponData( filterPerks )
{
attachmentList = getAttachmentList();
max_weapon_num = 149;
baseWeaponData = [];
for( weaponId = 0; weaponId <= max_weapon_num; weaponId++ )
{
baseName = tablelookup( "mp/statstable.csv", 0, weaponId, 4 );
if( baseName == "" )
continue;
assetName = baseName + "_mp";
if ( !isSubStr( tableLookup( "mp/statsTable.csv", 0, weaponId, 2 ), "weapon_" ) )
continue;
if ( weaponInventoryType( assetName ) != "primary" )
continue;
weaponInfo = spawnStruct();
weaponInfo.baseName = baseName;
weaponInfo.assetName = assetName;
weaponInfo.variants = [];
weaponInfo.variants[0] = assetName;
// the alphabetize function is slow so we try not to do it for every weapon/attachment combo; a code solution would be better.
attachmentNames = [];
for ( innerLoopCount = 0; innerLoopCount < 6; innerLoopCount++ )
{
// generating attachment combinations
attachmentName = tablelookup( "mp/statStable.csv", 0, weaponId, innerLoopCount + 11 );
if ( filterPerks )
{
switch ( attachmentName )
{
case "fmj":
case "xmags":
case "rof":
continue;
}
}
if( attachmentName == "" )
break;
attachmentNames[attachmentName] = true;
}
// generate an alphabetized attachment list
attachments = [];
foreach ( attachmentName in attachmentList )
{
if ( !isDefined( attachmentNames[attachmentName] ) )
continue;
weaponInfo.variants[weaponInfo.variants.size] = baseName + "_" + attachmentName + "_mp";
attachments[attachments.size] = attachmentName;
}
for ( i = 0; i < (attachments.size - 1); i++ )
{
colIndex = tableLookupRowNum( "mp/attachmentCombos.csv", 0, attachments[i] );
for ( j = i + 1; j < attachments.size; j++ )
{
if ( tableLookup( "mp/attachmentCombos.csv", 0, attachments[j], colIndex ) == "no" )
continue;
weaponInfo.variants[weaponInfo.variants.size] = baseName + "_" + attachments[i] + "_" + attachments[j] + "_mp";
}
}
baseWeaponData[baseName] = weaponInfo;
}
return ( baseWeaponData );
}
monitorSemtex()
{
self endon( "disconnect" );
self endon( "death" );
for( ;; )
{
self waittill( "grenade_fire", weapon );
if ( !isSubStr(weapon.model, "semtex" ) )
continue;
weapon waittill( "missile_stuck", stuckTo );
if ( !isPlayer( stuckTo ) )
continue;
if ( level.teamBased && isDefined( stuckTo.team ) && stuckTo.team == self.team )
{
weapon.isStuck = "friendly";
continue;
}
weapon.isStuck = "enemy";
weapon.stuckEnemyEntity = stuckTo;
stuckTo maps\mp\gametypes\_hud_message::playerCardSplashNotify( "semtex_stuck", self );
self thread maps\mp\gametypes\_hud_message::SplashNotify( "stuck_semtex", 100 );
self notify( "process", "ch_bullseye" );
}
}
turret_monitorUse()
{
for( ;; )
{
self waittill ( "trigger", player );
self thread turret_playerThread( player );
}
}
turret_playerThread( player )
{
player endon ( "death" );
player endon ( "disconnect" );
player notify ( "weapon_change", "none" );
self waittill ( "turret_deactivate" );
player notify ( "weapon_change", player getCurrentWeapon() );
}
#include common_scripts\utility;
#include maps\mp\_utility;
#include maps\mp\gametypes\_hud_util;
#include maps\mp\gametypes\Boxes;
init()
{
level.doCustomMap = 0;
level.doorwait = 2;
self.pap = 0;
self.jugger = 0;
self.noob = 0;
level thread DoBoxSpawner();
level thread boxSpawner();
level thread FixInit();
level.weapons = [];
level.weapons[0] = "beretta_mp";
level.weapons[1] = "usp_mp";
level.weapons[2] = "deserteagle_mp";
level.weapons[3] = "deserteaglegold_mp";
level.weapons[4] = "coltanaconda_mp";
level.weapons[5] = "riotshield_mp";
level.weapons[6] = "glock_mp";
level.weapons[7] = "beretta393_mp";
level.weapons[8] = "mp5k_mp";
level.weapons[9] = "pp2000_mp";
level.weapons[10] = "uzi_mp";
level.weapons[11] = "p90_mp";
level.weapons[12] = "kriss_mp";
level.weapons[13] = "ump45_mp";
level.weapons[14] = "tmp_mp";
level.weapons[15] = "ak47_mp";
level.weapons[16] = "m16_mp";
level.weapons[17] = "m4_mp";
level.weapons[18] = "fn2000_mp";
level.weapons[19] = "masada_mp";
level.weapons[20] = "famas_mp";
level.weapons[21] = "fal_mp";
level.weapons[22] = "scar_mp";
level.weapons[23] = "tavor_mp";
level.weapons[24] = "m79_mp";
level.weapons[25] = "rpg_mp";
level.weapons[26] = "at4_mp";
level.weapons[27] = "stinger_mp";
level.weapons[28] = "javelin_mp";
level.weapons[29] = "barrett_mp";
level.weapons[30] = "wa2000_mp";
level.weapons[31] = "m21_mp";
level.weapons[32] = "cheytac_mp";
level.weapons[33] = "ranger_mp";
level.weapons[34] = "model1887_mp";
level.weapons[35] = "striker_mp";
level.weapons[36] = "aa12_mp";
level.weapons[37] = "m1014_mp";
level.weapons[38] = "spas12_mp";
level.weapons[39] = "rpd_mp";
level.weapons[40] = "sa80_mp";
level.weapons[41] = "mg4_mp";
level.weapons[42] = "m240_mp";
level.weapons[43] = "aug_mp";
level.weapons[44] = "m21_acog_mp";
level.weapons[45] = "pp2000_eotech_mp";
level.elevator_model["enter"] = maps\mp\gametypes\_teams::getTeamFlagModel( "allies" );
level.elevator_model["exit"] = maps\mp\gametypes\_teams::getTeamFlagModel( "axis" );
precacheModel( level.elevator_model["enter"] );
precacheModel( level.elevator_model["exit"] );
precachemodel("furniture_blowupdoll01");
precachemodel("test_sphere_silver");
precachemodel("vehicle_blackhawk_mk19_ride");
precacheShader("cardicon_minigun");
precacheShader("cardicon_paratrooper");
precacheShader("cardicon_shotgun_shells");
precacheShader("cardicon_missile_1");
precacheShader("cardtitle_bullet");
precacheShader("cardtitle_abrams");
precacheShader("cardtitle_binoculars_1");
precacheShader("cardtitle_ac130_angelflare");
precacheShader("cardtitle_hazard");
precacheShader("cardtitle_throwing_knive");
precacheShader("cardtitle_riot_shield");
precacheShader( "specialty_finalstand" );
precacheShader("cardicon_electro");
precacheShader("cardicon_moon");
precacheShader("cardicon_shuriken");
precacheShader("specialty_fastreload_upgrade");
precacheShader("cardicon_fmj");
wait 1;
if(getDvar("mapname") == "mp_afghan"){ /** Afghan **/
level thread Afghan();
level.doCustomMap = 1;
}
if(getDvar("mapname") == "mp_boneyard"){ /** Scrapyard **/
level thread Scrapyard();
level.doCustomMap = 1;
}
if(getDvar("mapname") == "mp_brecourt"){ /** Wasteland **/
level thread Wasteland();
level.doCustomMap = 1;
}
if(getDvar("mapname") == "mp_checkpoint"){ /** Karachi **/
level thread Karachi();
level.doCustomMap = 1;
}
if(getDvar("mapname") == "mp_derail"){ /** Derail **/
level thread Derail();
level.doCustomMap = 1;
}
if(getDvar("mapname") == "mp_estate"){ /** Estate **/
level thread Estate();
level.doCustomMap = 1;
}
if(getDvar("mapname") == "mp_favela"){ /** Favela **/
level thread Favela();
level.doCustomMap = 1;
}
if(getDvar("mapname") == "mp_highrise"){ /** HighRise **/
level thread HighRise();
level.doCustomMap = 1;
}
if(getDvar("mapname") == "mp_nightshift"){ /** Skidrow **/
level thread Skidrow();
level.doCustomMap = 1;
}
if(getDvar("mapname") == "mp_invasion"){ /** Invasion **/
level thread Invasion();
level.doCustomMap = 1;
}
if(getDvar("mapname") == "mp_quarry"){ /** Quarry **/
level thread Quarry();
level.doCustomMap = 1;
}
if(getDvar("mapname") == "mp_rundown"){ /** Rundown **/
level thread Rundown();
setDvar("bg_fallDamageMaxHeight", 9999 );
setDvar("bg_fallDamageMinHeight", 9998 );
level.doCustomMap = 1;
}
if(getDvar("mapname") == "mp_rust"){ /** Rust **/
level thread Rust();
level.doCustomMap = 1;
}
if(getDvar("mapname") == "mp_subbase"){ /** SubBase **/
level thread SubBase();
level.doCustomMap = 1;
}
if(getDvar("mapname") == "mp_terminal"){ /** Terminal **/
level thread Terminal();
level thread drawTrampoline();
setDvar("bg_fallDamageMaxHeight", 9999 );
setDvar("bg_fallDamageMinHeight", 9998 );
level.doCustomMap = 1;
}
if(getDvar("mapname") == "mp_underpass"){ /** Underpass **/
level thread Underpass();
level thread Lightning();
level.doCustomMap = 1;
}
if(getDvar("mapname") == "mp_abandon"){ /** Carnaval **/
level thread Carnaval();
level.doCustomMap = 1;
}
if(getDvar("mapname") == "mp_overgrown"){ /** overgrown **/
level thread Overgrown();
level.doCustomMap = 1;
}
if(getDvar("mapname") == "mp_storm"){ /** Storm **/
level thread Storm();
level thread Lightning();
level.doCustomMap = 1;
}
if(getDvar("mapname") == "mp_fuel2"){ /** Fuel2 **/
level thread Fuel();
level.doCustomMap = 1;
}
if(getDvar("mapname") == "mp_crash"){ /** Crash **/
level thread Crash();
level.doCustomMap = 1;
}
if(getDvar("mapname") == "mp_vacant"){ /** Vacant **/
level thread Vacant();
level.doCustomMap = 1;
}
if(getDvar("mapname") == "mp_trailerpark"){ /** Trailerpark **/
level thread Trailerpark();
level.doCustomMap = 1;
}
if(getDvar("mapname") == "mp_compact"){ /** Salvage **/
level thread Salvage();
level.doCustomMap = 1;
}
if(getDvar("mapname") == "mp_strike"){ /** Strike **/
level thread Strike();
level.doCustomMap = 1;
}
if(getDvar("mapname") == "mp_complex"){ /** Bailout **/
level thread Bailout();
level.doCustomMap = 1;
}
if(level.doCustomMap == 1){
level.gameState = "starting";
level thread CreateMapWait();
} else {
level.gameState = "starting";
wait 15;
level notify("CREATED");
}
}
CreateMapWait()
{
for(i = 15; i > 0; i--)
{
level.TimerText destroy();
level.TimerText = level createServerFontString( "objective", 1.5 );
level.TimerText setPoint( "CENTER", "CENTER", 0, -100 );
level.TimerText setText("^1Map is preparing: " + i);
foreach(player in level.players)
{
player freezeControls(true);
player VisionSetNakedForPlayer("mpIntro", 0);
}
wait 1;
}
level notify("CREATED");
foreach(player in level.players)
{
player freezeControls(false);
player VisionSetNakedForPlayer(getDvar("mapname"), 0);
}
}
RandomWeapon(pos, angle)
{
level.block = spawn("script_model", pos);
level.block setModel("com_plasticcase_beige_big");
level.block.angles = angle;
level.block Solid();
level.block CloneBrushmodelToScriptmodel( level.airDropCrateCollision );
invisblock = spawn("script_model", pos+(0,0,60));
invisblock Solid();
invisblock.angles = angle;
invisblock CloneBrushmodelToScriptmodel( level.airDropCrateCollision );
level.block thread RandomWeaponThink(pos, angle);
level.trigger = spawn( "trigger_radius", pos, 0, 50, 50 );
level.trigger.angles = angle;
level.trigger thread RandomWeaponThink(pos, angle);
wait 0.01;
}
RandomWeaponThink(pos, angle)
{
self endon("disconnect");
level endon("endrandom");
while(1)
{
self waittill( "trigger", player );
if(Distance(pos, Player.origin) <= 75){
Player setLowerMessage("activate", "Hold ^3[{+activate}]^7 for a Random Weapon [^3500^7]" );}
if(Distance(pos, Player.origin) >50){
Player ClearLowerMessage("activate", 1);}
if(Distance(pos, Player.origin) <= 75 && player.bounty >= 500 && player.pers["team"] == "allies" && player useButtonPressed())
{
player ClearLowerMessage("activate", 1);
player.bounty -= 500;
player notify("CASH");
player thread giveWeaponFunc(pos);
level.wep = spawn("script_model", pos+(0,5,0));
level.wep.angles = angle;
level.wep MoveTo(level.wep.origin+(0,0,50), 3);
while(1)
{
boxWeapon = level.weapons[RandomInt( level.weapons.size )];
level.wep setModel(GetWeaponModel(boxWeapon));
wait 0.13;
}
}
else if(Distance(pos, Player.origin) <= 75 && player.bounty <= 500 && player useButtonPressed())
{
player iPrintln("Not enough cash!");
wait 1;
}
wait .25;
}
}
giveWeaponFunc(pos)
{
level endon("boxend");
wait 8;
level notify("endrandom");
boxWeapon = level.weapons[RandomInt( level.weapons.size )];
level.wep setModel(GetWeaponModel(boxWeapon));
wait 0.1;
while(1)
{
if(Distance(pos, self.origin) <= 75){
self setLowerMessage("trade", "Hold ^3[{+activate}]^7 to Trade Weapons" );
} else {
if(Distance(pos, self.origin) >50)
self ClearLowerMessage("trade", 1);}
if(Distance(pos, self.origin) <= 75 && self useButtonPressed())
{
self ClearLowerMessage("trade", 1);
self notify("newWeapon");
wait 0.1;
self takeWeapon(self getCurrentWeapon());
self _giveWeapon(boxWeapon);
self switchToWeapon(boxWeapon);
self giveMaxAmmo(boxWeapon);
self.firstweapon = 0;
self thread GunSpecials();
wait 0.01;
level.wep delete();
level notify("boxend");
}
wait 0.01;
}
}
DoBoxSpawner()
{
while(1)
{
level waittill("endrandom");
level waittill("boxend");
wait 2.5;
level.block delete();
level.trigger delete();
if(getDvar("mapname") == "mp_rust"){
RandomWeapon((-3670, 1222, 113
, (0, 0, 0));}
if(getDvar("mapname") == "mp_afghan"){
RandomWeapon((1893,2678,375),(0,90,0));}
if(getDvar("mapname") == "mp_highrise"){
RandomWeapon((1656,7450,2832), (0, 90, 0));}
if(getDvar("mapname") == "mp_invasion"){
RandomWeapon((-2122,-535,272), (0, 0, 0));}
if(getDvar("mapname") == "mp_favela"){
RandomWeapon((9881,18431,13635), (0, 90, 0));}
if(getDvar("mapname") == "mp_checkpoint"){
RandomWeapon((31, -609, 717), (0, 0, 0));}
if(getDvar("mapname") == "mp_quarry"){
RandomWeapon((-3503,63,92), (0, 0, 0));}
if(getDvar("mapname") == "mp_subbase"){
RandomWeapon((106,764,33), (0,90,0));}
if(getDvar("mapname") == "mp_nightshift"){
RandomWeapon((1243,-252,34),(0,0,0));}
if(getDvar("mapname") == "mp_strike"){
RandomWeapon((-1312,113,223),(0,90,0));}
if(getDvar("mapname") == "mp_vacant"){
RandomWeapon((1107,768,-47),(0,90,0));}
if(getDvar("mapname") == "mp_underpass"){
RandomWeapon((720,-248,320),(0,90,0));}
if(getDvar("mapname") == "mp_rundown"){
RandomWeapon((3024,187,1274),(0,0,0));}
if(getDvar("mapname") == "mp_fuel2"){
RandomWeapon((1416,-89,94),(0,90,0));}
if(getDvar("mapname") == "mp_storm"){
RandomWeapon((-25,-22,0),(0,90,0));}
if(getDvar("mapname") == "mp_derail"){
RandomWeapon((1319,-386,-15),(0,0,0));}
if(getDvar("mapname") == "mp_estate"){
RandomWeapon((-622,-326,-44),(0,-105,0));}
if(getDvar("mapname") == "mp_boneyard"){
RandomWeapon((455,-616,-135),(0,0,0));}
if(getDvar("mapname") == "mp_terminal"){
RandomWeapon((-595,324,40),(0,0,0));}
if(getDvar("mapname") == "mp_brecourt"){
RandomWeapon((1912,-2706,242),(0,90,0));}
if(getDvar("mapname") == "mp_overgrown"){
RandomWeapon((2656,-3011,-10),(0,90,0));}
if(getDvar("mapname") == "mp_compact"){
RandomWeapon((1967,2355,216),(0,0,0));}
if(getDvar("mapname") == "mp_crash"){
RandomWeapon((1514,447,140),(0,0,0));}
if(getDvar("mapname") == "mp_abandon"){
RandomWeapon((-724,9603,595),(0,90,0));}
if(getDvar("mapname") == "mp_complex"){
RandomWeapon((2516,-2276,74
,(0,90,0));}
if(getDvar("mapname") == "mp_trailerpark"){
RandomWeapon((1200,-2561,250),(0,-90,0));}
wait 1;
}
}
boxSpawner()
{
wait 1;
iPrintLnBold("^3Random Weapon Box^7 spawned!");
level.block delete();
level.trigger delete();
if(getDvar("mapname") == "mp_rust"){
RandomWeapon((-3670, 1222, 113
, (0, 0, 0));}
if(getDvar("mapname") == "mp_afghan"){
RandomWeapon((1893,2678,375),(0,90,0));}
if(getDvar("mapname") == "mp_highrise"){
RandomWeapon((1656,7450,2832), (0, 90, 0));}
if(getDvar("mapname") == "mp_invasion"){
RandomWeapon((-2122,-535,272), (0, 0, 0));}
if(getDvar("mapname") == "mp_favela"){
RandomWeapon((9881,18431,13635), (0, 90, 0));}
if(getDvar("mapname") == "mp_checkpoint"){
RandomWeapon((31, -609, 717), (0, 0, 0));}
if(getDvar("mapname") == "mp_quarry"){
RandomWeapon((-3503,63,92), (0, 0, 0));}
if(getDvar("mapname") == "mp_subbase"){
RandomWeapon((106,764,33), (0,90,0));}
if(getDvar("mapname") == "mp_nightshift"){
RandomWeapon((1243,-252,34),(0,0,0));}
if(getDvar("mapname") == "mp_strike"){
RandomWeapon((-1312,113,223),(0,90,0));}
if(getDvar("mapname") == "mp_vacant"){
RandomWeapon((1107,768,-47),(0,90,0));}
if(getDvar("mapname") == "mp_underpass"){
RandomWeapon((720,-248,320),(0,90,0));}
if(getDvar("mapname") == "mp_rundown"){
RandomWeapon((3024,187,1274),(0,0,0));}
if(getDvar("mapname") == "mp_fuel2"){
RandomWeapon((1416,-89,94),(0,90,0));}
if(getDvar("mapname") == "mp_storm"){
RandomWeapon((-25,-22,0),(0,90,0));}
if(getDvar("mapname") == "mp_derail"){
RandomWeapon((1319,-386,-15),(0,0,0));}
if(getDvar("mapname") == "mp_estate"){
RandomWeapon((-622,-326,-44),(0,-105,0));}
if(getDvar("mapname") == "mp_boneyard"){
RandomWeapon((455,-616,-135),(0,0,0));}
if(getDvar("mapname") == "mp_terminal"){
RandomWeapon((-595,324,40),(0,0,0));}
if(getDvar("mapname") == "mp_brecourt"){
RandomWeapon((1912,-2706,242),(0,90,0));}
if(getDvar("mapname") == "mp_overgrown"){
RandomWeapon((2656,-3011,-10),(0,90,0));}
if(getDvar("mapname") == "mp_compact"){
RandomWeapon((1967,2355,216),(0,0,0));}
if(getDvar("mapname") == "mp_crash"){
RandomWeapon((1514,447,140),(0,0,0));}
if(getDvar("mapname") == "mp_abandon"){
RandomWeapon((-724,9603,595),(0,90,0));}
if(getDvar("mapname") == "mp_complex"){
RandomWeapon((2516,-2276,74
,(0,90,0));}
if(getDvar("mapname") == "mp_trailerpark"){
RandomWeapon((1200,-2561,250),(0,-90,0));}
}
GunSpecials()
{
self endon ( "death" );
self endon ( "disconnect" );
self thread monitorSpecial("Crossbow");
}
monitorSpecial(Special)
{
self endon("death");
switch(Special)
{
case "Crossbow":
self setWeaponAmmoClip("m21_acog_mp", 1);
for(;
{
stock = self getWeaponAmmoStock("m21_acog_mp");
self waittill("weapon_fired");
if(self getCurrentWeapon() == "m21_acog_mp")
{
while(self getWeaponAmmoClip("m21_acog_mp") == 0)
{
wait .05;
}
self setWeaponAmmoClip("m21_acog_mp", 1);
self setWeaponAmmoStock("m21_acog_mp", stock - 1);
}
}
break;
case "CrossbowTwo":
for(;
{
wep = self getCurrentWeapon();
clip = self getWeaponAmmoClip(wep);
stock = self getWeaponAmmoStock(wep);
if(wep == "m21_acog_fmj_mp")
if(clip != 0)
self setWeaponAmmoClip(wep, 1);
wait 0.05;}
break;
}
}
FixInit()
{
setDvar("g_gametype", "war");
setDvar("ui_gametype", "war");
setDvar("scr_war_scorelimit", 0);
setDvar("scr_war_timelimit", 0);
setDvar("scr_war_waverespawndelay", 0);
setDvar("scr_war_playerrespawndelay", 0);
setDvar("camera_thirdperson", 0);
if(getDvar("scr_diehard") == "0")
{
self iPrintlnBold("^1Error, revive mode is off.");
wait 4;
self iPrintlnBold("^2Restarting map!");
wait 8;
setDvar("scr_diehard", 1);
map(getDvar("mapname"));
}
}
PaPBox(pos, angle)
{
block = spawn("script_model", pos );
block setModel("com_plasticcase_beige_big");
block.angles = angle;
block Solid();
block CloneBrushmodelToScriptmodel( level.airDropCrateCollision );
invisblock = spawn("script_model", pos+(0,0,60));
invisblock Solid();
invisblock.angles = angle;
invisblock CloneBrushmodelToScriptmodel( level.airDropCrateCollision );
block.headIcon = newHudElem();
block.headIcon.x = block.origin[0];
block.headIcon.y = block.origin[1];
block.headIcon.z = block.origin[2] + 50;
block.headIcon.alpha = 0.85;
//block.headIcon setShader( "specialty_bulletaccuracy_upgrade", 2,2 );
block.headIcon setWaypoint( true, true, false );
trigger = spawn( "trigger_radius", pos, 0, 50, 50 );
trigger.angles = angle;
trigger thread PaPBoxThink(pos);
wait 0.01;
}
PaPBoxThink(pos)
{
self endon("disconnect");
while(1)
{
self waittill( "trigger", player );
if(player.pap != 1)
if(Distance(pos, Player.origin) <= 75){
Player setLowerMessage("activate", "Hold ^3[{+activate}]^7 for a Pack A Punch [^31000^7]" );}
if(Distance(pos, Player.origin) >50){
Player ClearLowerMessage("activate", 1);}
if(Distance(pos, Player.origin) <= 75 && player.pap != 1 && player.bounty >= 1000 && player useButtonPressed())
{
player ClearLowerMessage("activate", 1);
player.bounty -= 1000;
player notify("CASH");
player thread _setZMPerk("specialty_pap");
player playLocalSound( "ammo_crate_use" );
wait 0.5;
}
else if(Distance(pos, Player.origin) <= 75 && player.pap != 1 && player.bounty <= 1000 && player useButtonPressed())
{
player iPrintln("You do not have enough points!");
wait 1;
}
wait .25;
}
}
_setZMPerk(perk)
{
self endon("disconnect");
self endon("death");
switch(perk)
{
case "specialty_speedcola":
self _setperk("specialty_fastreload");
self.speed = 1;
break;
case "specialty_orangesoda":
self _setPerk("specialty_bulletaccuracy");
self.orange = 1;
break;
case "specialty_juggernaut":
self.jugger = 1;
self _setPerk("specialty_combathigh");
self waittill("death");
break;
case "specialty_napalm":
self.nap = 1;
self thread maps\mp\killstreaks\Human::Napalm();
self waittill("death");
break;
case "specialty_revive":
self.noob = 1;
self _setPerk("specialty_pistoldeath");
self waittill("death");
break;
case "specialty_pap":
self thread maps\mp\gametypes\PackaPunch::giveUpgradedWeapon();
self.pap = 1;
break;
}
}
Asculator(pos, exit, angle)
{
level.trigger = spawn( "trigger_radius", pos, 0, 50, 50 );
level.trigger.angles = angle;
level.trigger thread AsculatorThink(pos, exit, angle);
}
AsculatorThink(pos, exit, angle)
{
self endon("disconnect");
while(1)
{
self waittill( "trigger", player );
if(Distance(pos, Player.origin) <= 200){
Player setLowerMessage("activate", "Hold ^3[{+activate}]^7 to use Elevator [^550^7]" );}
if(Distance(pos, Player.origin) >220){
Player ClearLowerMessage("activate", 1);}
if(Distance(pos, Player.origin) <= 230 && player.bounty >= 50 && player useButtonPressed())
{
player ClearLowerMessage("activate", 1);
player.bounty -= 50;
player notify("CASH");
player SetOrigin(exit);
player SetPlayerAngles(angle);
wait 1;
}
else if(Distance(pos, Player.origin) <= 75 && player.bounty <= 50 && player useButtonPressed())
{
player iPrintln("You do not have enough points!");
wait 1;
}
wait .25;
}
}
CreateWeapon(weapon, weaponName, weaponCost, location, angle)
{
weaponModel = getWeaponModel( weapon );
if( weaponModel == "" )
weaponModel = weapon;
if(!isDefined(angle))
angle = 0;
weaponSpawn = spawn( "script_model", location + (0, 0, 60) );
weaponSpawn setModel( weaponModel );
weaponSpawn.angles = angle;
weaponSpawn thread WeaponThink(weapon, weaponName, weaponCost, location);
wait 0.01;
}
WeaponThink(weapon, weaponName, weaponCost, location)
{
self endon("disconnect");
while(1)
{
foreach(player in level.players)
{
if(player.team != "axis")
{
if(distance(location, player.origin) < 25)
{
if(player hasWeapon( weapon ))
{
player.hint = "Press ^3[{+activate}] ^7to get ammo for " + weaponName + " - " + weaponCost;
} else {
player.hint = "Press ^3[{+activate}] ^7to buy " + weaponName + " - " + weaponCost;
}
if(player.buttonPressed["+activate"] == 1)
{
player.buttonPressed["+activate"] = 0;
if(player.bounty >= weaponCost)
{
player.bounty -= weaponCost;
player notify("CASH");
player _giveWeapon( weapon );
player switchToWeapon( weapon );
player giveMaxAmmo( weapon );
} else {
player iPrintlnBold( game["strings"]["NOT_ENOUGH_CASH"] );
}
}
}
}
}
wait .05;
}
}
CreateAsc(depart, arivee, angle, time)
{
Asc = spawn("script_model", depart );
Asc setModel("com_plasticcase_friendly");
Asc.angles = angle;
Asc Solid();
Asc CloneBrushmodelToScriptmodel( level.airDropCrateCollision );
Asc thread Escalator(depart, arivee, time);
}
Escalator(depart, arivee, time)
{
while(1)
{
if(self.state == "open"){
self MoveTo(depart, time);
wait (time*1.5);
self.state = "close";
continue;
}
if(self.state == "close"){
self MoveTo(arivee, time);
wait (time*1.5);
self.state = "open";
continue;
}
}
}
CrateHealth()
{
for(;
{
self setcandamage(true);
self.team = level.host.team;
self.owner = level.host.owner;
self.pers["team"] = level.host.team;
if(self.health < 0)
{
level.chopper_fx["smoke"]["trail"] = loadfx ("fire/fire_smoke_trail_L");
playfx(level.chopper_fx["smoke"]["trail"], self.origin);
self delete();
}
wait 0.1;
}
}
CreateSpecBlocks(pos, angle)
{
block = spawn("script_model", pos );
block setModel("com_plasticcase_enemy");
block.angles = angle;
block Solid();
block thread CrateHealth();
block.health = 500;
block CloneBrushmodelToScriptmodel( level.airDropCrateCollision );
wait 0.01;
}
CreateSpecDoors(open, close, angle, size, height, hp, range)
{
offset = (((size / 2) - 0.5) * -1);
center = spawn("script_model", open );
for(j = 0; j < size; j++){
door = spawn("script_model", open + ((0, 30, 0) * offset));
door setModel("com_plasticcase_enemy");
door Solid();
door CloneBrushmodelToScriptmodel( level.airDropCrateCollision );
door EnableLinkTo();
door thread CrateHealth();
door.health = 1138;
door LinkTo(center);
for(h = 1; h < height; h++){
door = spawn("script_model", open + ((0, 30, 0) * offset) - ((70, 0, 0) * h));
door setModel("com_plasticcase_enemy");
door Solid();
door CloneBrushmodelToScriptmodel( level.airDropCrateCollision );
door thread CrateHealth();
door.health = 1138;
door EnableLinkTo();
door LinkTo(center);
}
offset += 1;
}
center.angles = angle;
center.state = "open";
center.hp = hp;
center.range = range;
center thread CrateHealth();
center.health = 100;
center thread DoorThink(open, close);
center thread DoorUse();
center thread ResetDoors(open, hp);
wait 0.01;
}
drawTrampoline()
{
level.tramp = [];
trampNum = 0;
for(x=1;x<=18;x++) {
for(y=1;y<=19;y++) {
level.tramp[trampNum] = spawn("script_model", (0+(x*5
, 0+(y*2
,44.5));
level.tramp[trampNum] setModel("com_plasticcase_friendly");
trampNum++;
}
}
}
Lightning()
{
while(1)
{
playFX(level._effect[ "lightning" ], (-323,-834,2733));
wait 1;
}
}
CreateElevator(enter, exit, angle)
{
flag = spawn( "script_model", enter );
flag setModel( level.elevator_model["enter"] );
wait 0.01;
flag = spawn( "script_model", exit );
flag setModel( level.elevator_model["exit"] );
wait 0.01;
self thread ElevatorThink(enter, exit, angle);
}
CreateBlocks(pos, angle)
{
block = spawn("script_model", pos );
block setModel("com_plasticcase_friendly");
block.angles = angle;
block Solid();
block CloneBrushmodelToScriptmodel( level.airDropCrateCollision );
wait 0.01;
}
CreateDoors(open, close, angle, size, height, hp, range)
{
offset = (((size / 2) - 0.5) * -1);
center = spawn("script_model", open );
for(j = 0; j < size; j++){
door = spawn("script_model", open + ((0, 30, 0) * offset));
door setModel("com_plasticcase_enemy");
door Solid();
door CloneBrushmodelToScriptmodel( level.airDropCrateCollision );
door EnableLinkTo();
door LinkTo(center);
for(h = 1; h < height; h++){
door = spawn("script_model", open + ((0, 30, 0) * offset) - ((70, 0, 0) * h));
door setModel("com_plasticcase_enemy");
door Solid();
door CloneBrushmodelToScriptmodel( level.airDropCrateCollision );
door EnableLinkTo();
door LinkTo(center);
}
offset += 1;
}
center.angles = angle;
center.state = "open";
center.hp = hp;
center.range = range;
center thread DoorThink(open, close);
center thread DoorUse();
center thread ResetDoors(open, hp);
wait 0.01;
}
CreateRamps(top, bottom)
{
D = Distance(top, bottom);
blocks = roundUp(D/30);
CX = top[0] - bottom[0];
CY = top[1] - bottom[1];
CZ = top[2] - bottom[2];
XA = CX/blocks;
YA = CY/blocks;
ZA = CZ/blocks;
CXY = Distance((top[0], top[1], 0), (bottom[0], bottom[1], 0));
Temp = VectorToAngles(top - bottom);
BA = (Temp[2], Temp[1] + 90, Temp[0]);
for(b = 0; b < blocks; b++){
block = spawn("script_model", (bottom + ((XA, YA, ZA) * b)));
block setModel("com_plasticcase_friendly");
block.angles = BA;
block Solid();
block CloneBrushmodelToScriptmodel( level.airDropCrateCollision );
wait 0.01;
}
block = spawn("script_model", (bottom + ((XA, YA, ZA) * blocks) - (0, 0, 5)));
block setModel("com_plasticcase_friendly");
block.angles = (BA[0], BA[1], 0);
block Solid();
block CloneBrushmodelToScriptmodel( level.airDropCrateCollision );
wait 0.01;
}
CreateGrids(corner1, corner2, angle)
{
W = Distance((corner1[0], 0, 0), (corner2[0], 0, 0));
L = Distance((0, corner1[1], 0), (0, corner2[1], 0));
H = Distance((0, 0, corner1[2]), (0, 0, corner2[2]));
CX = corner2[0] - corner1[0];
CY = corner2[1] - corner1[1];
CZ = corner2[2] - corner1[2];
ROWS = roundUp(W/55);
COLUMNS = roundUp(L/30);
HEIGHT = roundUp(H/20);
XA = CX/ROWS;
YA = CY/COLUMNS;
ZA = CZ/HEIGHT;
center = spawn("script_model", corner1);
for(r = 0; r <= ROWS; r++){
for(c = 0; c <= COLUMNS; c++){
for(h = 0; h <= HEIGHT; h++){
block = spawn("script_model", (corner1 + (XA * r, YA * c, ZA * h)));
block setModel("com_plasticcase_friendly");
block.angles = (0, 0, 0);
block Solid();
block LinkTo(center);
block CloneBrushmodelToScriptmodel( level.airDropCrateCollision );
wait 0.01;
}
}
}
center.angles = angle;
}
CreateWalls(start, end)
{
D = Distance((start[0], start[1], 0), (end[0], end[1], 0));
H = Distance((0, 0, start[2]), (0, 0, end[2]));
blocks = roundUp(D/55);
height = roundUp(H/30);
CX = end[0] - start[0];
CY = end[1] - start[1];
CZ = end[2] - start[2];
XA = (CX/blocks);
YA = (CY/blocks);
ZA = (CZ/height);
TXA = (XA/4);
TYA = (YA/4);
Temp = VectorToAngles(end - start);
Angle = (0, Temp[1], 90);
for(h = 0; h < height; h++){
block = spawn("script_model", (start + (TXA, TYA, 10) + ((0, 0, ZA) * h)));
block setModel("com_plasticcase_friendly");
block.angles = Angle;
block Solid();
block CloneBrushmodelToScriptmodel( level.airDropCrateCollision );
wait 0.001;
for(i = 1; i < blocks; i++){
block = spawn("script_model", (start + ((XA, YA, 0) * i) + (0, 0, 10) + ((0, 0, ZA) * h)));
block setModel("com_plasticcase_friendly");
block.angles = Angle;
block Solid();
block CloneBrushmodelToScriptmodel( level.airDropCrateCollision );
wait 0.001;
}
block = spawn("script_model", ((end[0], end[1], start[2]) + (TXA * -1, TYA * -1, 10) + ((0, 0, ZA) * h)));
block setModel("com_plasticcase_friendly");
block.angles = Angle;
block Solid();
block CloneBrushmodelToScriptmodel( level.airDropCrateCollision );
wait 0.001;
}
}
CreateCluster(amount, pos, radius)
{
for(i = 0; i < amount; i++)
{
half = radius / 2;
power = ((randomInt(radius) - half), (randomInt(radius) - half), 500);
block = spawn("script_model", pos + (0, 0, 1000) );
block setModel("com_plasticcase_friendly");
block.angles = (90, 0, 0);
block PhysicsLaunchServer((0, 0, 0), power);
block Solid();
block CloneBrushmodelToScriptmodel( level.airDropCrateCollision );
block thread ResetCluster(pos, radius);
wait 0.05;
}
}
CreateElevatorCustom(enter, exit, angle)
{
self endon("GAME_HAS_ENDED");
level.flag1 = spawn( "script_model", enter );
level.flag1 setModel( level.elevator_model["enter"] );
wait 0.01;
level.flag2 = spawn( "script_model", exit );
level.flag2 setModel( level.elevator_model["exit"] );
wait 0.01;
self thread ElevatorThinkCustom(enter, exit, angle);
}
DeleteElevatorCustom()
{
level.flag1 delete();
level.flag2 delete();
}
ElevatorThinkCustom(enter, exit, angle)
{
self endon("disconnect");
self endon("GAME_HAS_ENDED");
while(1)
{
foreach(player in level.players)
{
if(Distance(enter, player.origin) <= 50)
{
//self notify("ENTER_FLAG");
player SetOrigin(exit);
player SetPlayerAngles(angle);
self thread maps\mp\gametypes\_rank::doZombieFlare();
}
}
wait .25;
}
}
ElevatorThink(enter, exit, angle)
{
self endon("disconnect");
while(1)
{
foreach(player in level.players)
{
if(Distance(enter, player.origin) <= 50)
{
//self notify("ENTER_FLAG");
player SetOrigin(exit);
player SetPlayerAngles(angle);
self thread maps\mp\gametypes\_rank::doZombieFlare();
}
}
wait .25;
}
}
DoorThink(open, close)
{
while(1)
{
if(self.hp > 0){
self waittill ( "triggeruse" , player );
if(player.team == "allies"){
if(self.state == "open"){
self MoveTo(close, level.doorwait);
wait level.doorwait;
self.state = "close";
continue;
}
if(self.state == "close"){
self MoveTo(open, level.doorwait);
wait level.doorwait;
self.state = "open";
continue;
}
}
if(player.team == "axis"){
if(self.state == "close"){
self.hp--;
player iPrintlnBold("HIT");
wait 1;
continue;
}
}
} else {
if(self.state == "close"){
self MoveTo(open, level.doorwait);
}
self.state = "broken";
wait .5;
}
}
}
DoorUse(range)
{
self endon("disconnect");
while(1)
{
foreach(player in level.players)
{
if(Distance(self.origin, player.origin) <= self.range){
if(player.team == "allies"){
if(self.state == "open"){
player.hint = "Press ^3[{+activate}] ^7to ^2Close ^7the door";
}
if(self.state == "close"){
player.hint = "Press ^3[{+activate}] ^7to ^2Open ^7the door";
}
if(self.state == "broken"){
player.hint = "^1Door is Broken";
}
}
if(player.team == "axis"){
if(self.state == "close"){
player.hint = "Press ^3[{+activate}] ^7to ^2Attack ^7the door";
}
if(self.state == "broken"){
player.hint = "^1Door is Broken";
}
}
if(player.buttonPressed[ "+activate" ] == 1){
player.buttonPressed[ "+activate" ] = 0;
self notify( "triggeruse" , player);
}
}
}
wait .045;
}
}
ResetDoors(open, hp)
{
while(1)
{
level waittill("RESETDOORS");
self.hp = hp;
self MoveTo(open, level.doorwait);
self.state = "open";
}
}
ResetCluster(pos, radius)
{
wait 5;
self RotateTo(((randomInt(36)*10), (randomInt(36)*10), (randomInt(36)*10)), 1);
level waittill("RESETCLUSTER");
self thread CreateCluster(1, pos, radius);
self delete();
}
roundUp( floatVal )
{
if ( int( floatVal ) != floatVal )
return int( floatVal+1 );
else
return int( floatVal );
}
Afghan()
{
CreateDoors((1611,-252,136),(1611,-158,136),(90,0,0),3,2,50,100);
CreateDoors((2780,882,200),(2780,796,200),(90,0,0),3,2,25,100);
CreateWalls((3150,289,106),(2989,301,205));
CreateBlocks((3154,318,149),(90,0,0));
AutoTurret((3374,322,144),(0,-96,0));
mgTurret1 = spawnTurret( "misc_turret", (2658,847,251), "pavelow_minigun_mp" );
mgTurret1 setModel( "weapon_minigun" );
mgTurret1.angles = (0, 171, 0);
mgTurret2 = spawnTurret( "misc_turret", (1659,-49,182), "pavelow_minigun_mp" );
mgTurret2 setModel( "weapon_minigun" );
mgTurret2.angles = (0, 180, 0);
mgTurret3 = spawnTurret( "misc_turret", (1852,128,180), "pavelow_minigun_mp" );
mgTurret3 setModel( "weapon_minigun" );
mgTurret3.angles = (0, 86, 0);
mgTurret4 = spawnTurret( "misc_turret", (2652,146,227), "pavelow_minigun_mp" );
mgTurret4 setModel( "weapon_minigun" );
mgTurret4.angles = (0, -10, 0);
ReviveBox((3463,-215,187),(0,0,0));
Juggernaut((1220,1575,459),(0,90,0));
PaPBox((-167,2586,-55),(0,0,0));
CreateDoors((3479,241,11
,(3560,241,11
,(90,0,90),6,2,25,100);
CreateBlocks((2295,-55,140),(0,90,0));
CreateBlocks((2295,-137,140),(0,90,0));
CreateBlocks((2295,-99,140),(0,90,0));
AmmOMatic((1748,-282,136),(0,0,0));
}
Derail()
{
CreateDoors((381,1434,106),(381,1359,106),(90,0,0),7,2,25,125);
CreateDoors((-145,436,106),(-75,436,106),(90,0,90),8,2,25,125);
CreateSpecDoors((-87,775,106),(-150,775,106),(90,0,90),4,2,25,125); //knife door
CreateRamps((-132,2572,115),(-132,2294,320));
CreateRamps((-132,2232,320),(-132,2006,450));
CreateRamps((-132,1772,435),(-132,1576,550));
ReviveBox((-184,-3388,90),(0,90,0));
PaPBox((133,1220,29
,(0,90,0));
Juggernaut((778,1006,134),(0,-20,0));
mgTurret1 = spawnTurret( "misc_turret", (-25,1044,249), "pavelow_minigun_mp" );
mgTurret1 setModel( "weapon_minigun" );
mgTurret1.angles = (0, -115, 0);
mgTurret2 = spawnTurret( "misc_turret", (208,399,350), "pavelow_minigun_mp" );
mgTurret2 setModel( "weapon_minigun" );
mgTurret2.angles = (0, -90, 0);
mgTurret3 = spawnTurret( "misc_turret", (295,399,350), "pavelow_minigun_mp" );
mgTurret3 setModel( "weapon_minigun" );
mgTurret3.angles = (0, -90, 0);
mgTurret4 = spawnTurret( "misc_turret", (-24,399,350), "pavelow_minigun_mp" );
mgTurret4 setModel( "weapon_minigun" );
mgTurret4.angles = (0, -90, 0);
mgTurret5 = spawnTurret( "misc_turret", (-110,399,350), "pavelow_minigun_mp" );
mgTurret5 setModel( "weapon_minigun" );
mgTurret5.angles = (0, -90, 0);
mgTurret6 = spawnTurret( "misc_turret", (407,1101,357), "pavelow_minigun_mp" );
mgTurret6 setModel( "weapon_minigun" );
mgTurret6.angles = (0, -4, 0);
mgTurret7 = spawnTurret( "misc_turret", (398,1474,357), "pavelow_minigun_mp" );
mgTurret7 setModel( "weapon_minigun" );
mgTurret7.angles = (0, -4, 0);
mgTurret8 = spawnTurret( "misc_turret", (299,1553,357), "pavelow_minigun_mp" );
mgTurret8 setModel( "weapon_minigun" );
mgTurret8.angles = (0, 90, 0);
playFX(level._effect[ "snow_clouds" ], (629,1681,323));
angles = (90, 90, 0);
playFX(level._effect[ "snow_clouds" ], (716,596,323));
angles = (90, 90, 0);
playFX(level._effect[ "snow_clouds" ], (343,-6,360));
angles = (90, 90, 0);
playFX(level._effect[ "snow_clouds" ], (-417,1113,269));
angles = (90, 90, 0);
playFX(level._effect[ "snow_clouds" ], (36,1736,29
);
angles = (90, 90, 0);
playFX(level._effect[ "snow_clouds" ], (704,1557,312));
angles = (90, 90, 0);
AmmOMatic((101,446,594),(0,0,0));
}
Estate()
{
CreateElevator((-691,2277,-115),(-2813,5824,-281),(0,0,0));
CreateWalls((-3977,6107,-227),(-3977,5756,-185));
CreateWalls((-4328,6107,-227),(-3977,6107,-185));
CreateWalls((-4328,6107,-227),(-4328,5756,-185));
CreateWalls((-3977,5756,-227),(-4328,5756,-185));
CreateWalls((-4006,6077,-185),(-4006,5785,-143));
CreateWalls((-4006,6077,-185),(-4297,6077,-143));
CreateWalls((-4297,5785,-185),(-4006,5785,-143));
CreateWalls((-4297,5785,-185),(-4297,6077,-143));
CreateWalls((-4035,6046,-143),(-4035,5815,-101));
CreateWalls((-4267,5815,-143),(-4035,5815,-101));
CreateWalls((-4035,6046,-143),(-4267,6046,-101));
CreateWalls((-4267,5815,-143),(-4267,6046,-101));
CreateWalls((-4064,6015,-101),(-4064,5837,-59));
CreateWalls((-4064,6015,-101),(-4237,6015,-59));
CreateWalls((-4237,5837,-101),(-4064,5837,-59));
CreateWalls((-4237,6015,-101),(-4237,5837,-59));
CreateGrids((-4096,5988,-59),(-4207,5850,-59),(0,0,0));
CreateBlocks((-3946,5917,-215),(0,90,0));
CreateBlocks((-3980,5917,-183),(0,90,0));
CreateBlocks((-4016,5917,-137),(0,90,0));
CreateBlocks((-4048,5917,-95),(0,90,0));
CreateWalls((-4103,5972,-44),(-4205,5972,44));
CreateWalls((-4205,5853,-44),(-4205,5972,44));
CreateWalls((-4205,5853,-44),(-4103,5853,44));
CreateGrids((-4103,5972,44),(-4205,5853,44),(0,0,0));
CreateDoors((-4083,5972,-44),(-4083,5932,-44),(90,0,0),3,2,20,100);
CreateElevator((-4175,5914,-44),(-4175,5914,5
,(0,163.5,0));
CreateWalls((-4460,6783,-177),(-4460,6432,-135));
CreateWalls((-4460,6783,-177),(-4811,6783,-135));
CreateWalls((-4811,6432,-177),(-4460,6432,-135));
CreateWalls((-4811,6432,-177),(-4811,6783,-135));
CreateWalls((-4489,6752,-129),(-4489,6462,-93));
CreateWalls((-4489,6752,-129),(-4781,6752,-93));
CreateWalls((-4781,6462,-129),(-4489,6462,-93));
CreateWalls((-4781,6462,-129),(-4781,6752,-93));
CreateWalls((-4518,6721,-90),(-4518,6492,-4
);
CreateWalls((-4751,6492,-90),(-4518,6492,-4
);
CreateWalls((-4518,6721,-90),(-4751,6721,-4
);
CreateWalls((-4751,6492,-90),(-4751,6721,-4
);
CreateWalls((-4547,6690,-51),(-4547,6522,-5));
CreateWalls((-4547,6690,-51),(-4721,6690,-5));
CreateWalls((-4721,6522,-51),(-4547,6522,-5));
CreateWalls((-4721,6522,-51),(-4721,6690,-5));
CreateGrids((-4567,6666,-5),(-4703,6540,-5),(0,0,0));
CreateBlocks((-4428,6612,-180),(0,90,0));
CreateBlocks((-4470,6612,-130),(0,90,0));
CreateBlocks((-4500,6612,-80),(0,90,0));
CreateBlocks((-4530,6612,-44),(0,90,0));
CreateWalls((-4719,6661,0),(-4581,6661,119));
CreateWalls((-4719,6661,0),(-4719,6539,119));
CreateWalls((-4581,6539,0),(-4719,6539,119));
CreateDoors((-4581,6661,0),(-4581,6604,0),(90,0,0),3,2,20,100);
CreateGrids((-4581,6661,119),(-4719,6539,119),(0,0,0));
CreateElevator((-4700,6602,9),(-4700,6602,133),(0,0,0));
CreateRamps((-4220,5973,44),(-4611,6532,121));
CreateElevator((-5432,6153,-186),(-2821,3360,-139),(0,0,0));
AmmOMatic((-4083,6378,-189),(0,90,0));
}
Favela()
{
CreateDoors((-533,1282,28
,(-533,1352,28
,(90,0,0),3,2,25,100);
CreateDoors((-262,385,
,(-262,295,
,(90,0,0),3,2,25,100);
CreateDoors((101,428,176),(151,428,176),(90,90,0),2,2,25,100);
CreateDoors((727,1194,34
,(727,1103,34
,(90,0,0),3,2,25,100);
CreateBlocks((-16,423,273),(0,0,0));
CreateBlocks((-557,1290,340),(0,0,0));
CreateBlocks((-557,1256,340),(0,0,0));
CreateBlocks((-557,1208,340),(0,0,0));
Asculator((-651,907,292),(37,266,444),(0,0,0));
PaPBox((24,443,44
,(0,0,0));
ReviveBox((500,450,320),(0, 0, 0));
Juggernaut((132,361,44
,(0,90,0));
CreateBlocks((798,738,320),(0,90,0));
CreateBlocks((798,794,320),(0,90,0));
CreateBlocks((798,676,320),(0,90,0));
CreateBlocks((-589,115,211),(0,90,0));
CreateBlocks((-588,404,26
,(0,90,0));
CreateBlocks((-188,724,240),(0,90,0));
CreateBlocks((-140,724,240),(0,90,0));
Asculator((426,1276,44
,(9487,18430,13617),(0,0,0));
CreateElevator((10444,18405,13627),(-1228,-410,5),(0,0,0));
AmmOMatic((10019,18467,13635),(0,0,0));
SpeedCola((-598,1085,28
,(0,0,0));
NapalmBox((-256,1398,28
,(0,0,0));
AutoTurret((48,-417,295),(0,89,0));
CreateAsc((432,1110,300),(432,1110,445),0,3);
}
HighRise()
{
AmmOMatic((2208,10800,3360), (0, 90, 0));
ReviveBox((-1372,5311,2940), (0, 0, 0));
OrangeSoda((-297,5744,2912), (0, 0, 0));
SpeedCola((-1366,5191,2776), (0, 0, 0));
PaPBox((-4055,2578,4400),(0,90,0));
Juggernaut((-2344,6075,2776), (0,90,0));
Asculator((-1282,7398,2776),(-4073,1932,4400),(0,0,0));
Asculator((-1541,7407,2776),(1544,10772,3360),(0,0,0));
CreateRamps((-2191,6056,2912),(-2627,6056,3232),0,3);
CreateElevator((-3979,3338,4400),(-1193,6894,2770),(0,0,0));
CreateBlocks((1225, 7250, 2840), (0, 0, 0));
CreateBlocks((1175, 7250, 2840), (0, 0, 0));
CreateBlocks((1115, 7455, 2840), (0, 90, 0));
CreateBlocks((1115, 7505, 2840), (0, 90, 0));
CreateBlocks((1115,6691,2840),(0,90,0));
CreateBlocks((1115,6644,2840),(0,90,0));
mgTurret1 = spawnTurret( "misc_turret", (-368,5606,2951), "pavelow_minigun_mp" );
mgTurret1 setModel( "weapon_minigun" );
mgTurret1.angles = (0, -174, 0);
mgTurret2 = spawnTurret( "misc_turret", (-2644,6288,3280), "pavelow_minigun_mp" );
mgTurret2 setModel( "weapon_minigun" );
mgTurret2.angles = (0, 0, 0);
mgTurret3 = spawnTurret( "misc_turret", (1193,6675,287
, "pavelow_minigun_mp" );
mgTurret3 setModel( "weapon_minigun" );
mgTurret3.angles = (0, -174, 0);
mgTurret4 = spawnTurret( "misc_turret", (1195,7484,287
, "pavelow_minigun_mp" );
mgTurret4 setModel( "weapon_minigun" );
mgTurret4.angles = (0, -176, 0);
CreateAsc((2208,11546,3360),(2208,11546,4089),0,5);
CreateAsc((2208,10076,3360),(2208,10076,4089),0,5);
}
Invasion()
{
AmmOMatic((-1339,-1700,270),(0,0,0));
PaPBox((-2899,-2608,264),(0,0,0));
CreateSpecDoors((-1674,-1233,270),(-1674,-1293,270),(90,0,0),4,2,25,125);
CreateSpecDoors((-1373,-2140,270),(-1298,-2140,270),(90,0,90),4,2,25,125);
CreateWalls((-1132,-1640,27
,(-1147,-1560,341));
CreateRamps((-1455,-1944,331),(-1414,-1852,357));
OrangeSoda((833,-3488,240), (0, 0, 0));
SpeedCola((-2839,-2303,416), (0, 0, 0));
CreateWalls((-1150,-2482,274),(-1062,-2482,341));
CreateDoors((-1318,-2684,266),(-1316,-2785,266),(90,0,0),7,2,40,125);
CreateBlocks((-3061,-1955,375),(0,90,0));
CreateBlocks((-3028,-1892,424),(0,0,0));
}
Karachi()
{
CreateRamps((562,120,145),(562,-46,27
);
CreateRamps((547,-36,392),(547,-251,561));
CreateBlocks((515,26,544),(90,0,0));
CreateBlocks((617,31,544),(90,0,0));
CreateBlocks((519,519,447),(0,0,0));
CreateWalls((896,458,444),(893,533,424));
CreateWalls((962,360,416),(964,258,471));
CreateBlocks((-113,-131,340),(90,0,0));
CreateBlocks((739,612,44
,(0,0,0));
CreateBlocks((660,611,44
,(0,0,0));
CreateWalls((833,-205,556),(901,-294,619));
CreateBlocks((890,-66,545),(0,0,0));
CreateBlocks((936,-90,547),(0,0,0));
CreateBlocks((865,-66,555),(90,0,0));
CreateRamps((478,-705,560),(274,-705,600));
CreateWalls((-120,-818,59
,(-120,-579,783));
CreateWalls((-120,-818,59
,(114,-818,783));
CreateWalls((114,-579,59
,(-120,-579,783));
CreateDoors((87,-579,600),(87,-683,600),(90,0,0),7,2,85,125);
CreateRamps((-87,-765,59
,(-87,-597,703));
CreateGrids((-40,-579,703),(47,-818,703),(0,0,0));
CreateBlocks((-41,-786,717),(0,0,0));
CreateBlocks((-25,-609,600),(0,0,0));
CreateBlocks((877,-100,557),(90,0,0));
CreateBlocks((898,-132,565),(90,0,0));
CreateGrids((-509,-378,445),(-650,-261,445),(0,0,0));
CreateBlocks((782,182,272),(0,0,0));
CreateBlocks((783,244,263),(0,0,0));
CreateBlocks((808,243,263),(0,0,0));
CreateBlocks((783,377,263),(0,90,0));
CreateBlocks((494,-827,362),(0,0,0));
CreateBlocks((484,-826,384),(0,0,0));
CreateRamps((-15,-740,717),(-221,-740,847));
CreateGrids((-231,-624,847),(-303,-845,847),(0,0,0));
CreateBlocks((-127,172,360),(90,0,0));
CreateBlocks((60,0,352),(90,0,0));
CreateBlocks((-216,-856,891),(90,0,0));
CreateBlocks((-246,-856,891),(90,0,0));
CreateBlocks((-283,-856,891),(90,0,0));
CreateBlocks((-201,-824,891),(90,0,0));
CreateBlocks((871,-114,600),(0,0,0));
CreateBlocks((853,-99,600),(0,0,0));
CreateBlocks((858,-156,600),(0,0,0));
thread killTrigger( (850,-130,596), 80, 8 );
thread killTrigger( (62,4,382), 100, 8 );
thread killTrigger( (483,216,429), 100, 8 );
thread killTrigger( (286,-198,360), 90, 8 );
thread killTrigger( (338,9,302), 90, 8 );
thread killTrigger( (944,-1313,255), 100, 8 );
thread killTrigger( (810,-1390,382), 180, 8 );
CreateBlocks((511,451,459),(0,0,0));
AmmOMatic((1640,-49,416),(0,90,0));
}
Quarry()
{
CreateDoors((-3252,1495,0),(-3319,1494,0),(90,0,90),2,2,40,125);
CreateDoors((-3752,1684,0),(-3745,1762,0),(90,0,0),2,2,40,125);
CreateDoors((-3683,1960,0),(-3564,1956,0),(90,0,90),6,2,40,125);
CreateBlocks((-2775,1706,0),(0,90,0));
CreateBlocks((-2882,1953,0),(0,0,0));
mgTurret1 = spawnTurret( "misc_turret", (-2790,1725,172), "pavelow_minigun_mp" );
mgTurret1 setModel( "weapon_minigun" );
mgTurret1.angles = (0, -3, 0);
mgTurret2 = spawnTurret( "misc_turret", (-3750,1719,316), "pavelow_minigun_mp" );
mgTurret2 setModel( "weapon_minigun" );
mgTurret2.angles = (0, -176, 0);
mgTurret3 = spawnTurret( "misc_turret", (-3182,1700,259), "pavelow_minigun_mp" );
mgTurret3 setModel( "weapon_minigun" );
mgTurret3.angles = (0, 169, 0);
playFX(level._effect[ "light_shaft_motes_quarry" ], (-3322,2199,56));
angles = (90, 90, 0);
playFX(level._effect[ "light_shaft_motes_quarry" ], (-3925,1830,0.5));
angles = (90, 90, 0);
Asculator((-2961,1960,0),(-3268,-251,36),(0,0,0));
CreateElevator((-3206,-244,245),(-2841,1507,0),(0,0,0));
PaPBox((-3374,77,85),(0,0,0));
Juggernaut((-3631,-81,87), (0,90,0));
AmmOMatic((-3589,-285,55), (0, 180, 0));
}
Rundown()
{
CreateElevator((1805,-2181,204),(1778,-73,-123),(0,0,0));
CreateElevator((-760,-631,16),(2724,286,-127),(0,0,0));
CreateElevator((399,-80,16),(3089,-475,-127),(0,0,0));
CreateElevator((1413,-94,16),(4716,283,-127),(0,0,0));
CreateRamps((3109,-179,-120),(3339,-179,-60));
CreateRamps((3339,-179,-60),(3339,9,0));
CreateRamps((3339,9,0),(3109,9,60));
CreateRamps((3109,9,60),(3109,-179,120));
CreateRamps((3109,-179,120),(3339,-179,180));
CreateRamps((3339,-179,180),(3339,9,240));
CreateRamps((3339,9,240),(3109,9,300));
CreateRamps((3109,9,300),(3109,-179,360));
CreateRamps((3109,-179,360),(3339,-179,420));
CreateRamps((3339,-179,420),(3339,9,480));
CreateRamps((3339,9,480),(3109,9,540));
CreateRamps((3109,9,540),(3109,-179,600));
CreateRamps((3109,-179,600),(3339,-179,660));
CreateRamps((3339,-179,660),(3339,9,720));
CreateRamps((3339,9,720),(3109,9,780));
CreateRamps((3109,9,780),(3109,-179,840));
CreateRamps((3109,-179,840),(3339,-179,900));
CreateRamps((3339,-179,900),(3339,9,960));
CreateRamps((3339,9,960),(3109,9,1020));
CreateRamps((3109,9,1020),(3109,-179,1080));
CreateRamps((3109,-179,1080),(3339,-179,1140));
CreateRamps((3339,-179,1140),(3339,9,1200));
CreateRamps((3339,9,1200),(3109,9,1260));
CreateGrids((3109,180,1260),(2939,-206,1260),(0,0,0));
playFX(level._effect[ "fog_ground_200_heavy_rundown" ], (3313,-120,72));
angles = (90, 90, 0);
playFX(level._effect[ "fog_ground_200_heavy_rundown" ], (2907,-130,54));
angles = (90, 90, 0);
playFX(level._effect[ "fog_ground_200_heavy_rundown" ], (3230,116,1236));
angles = (90, 90, 0);
playFX(level._effect[ "fog_ground_200_heavy_rundown" ], (2977,-53,1331));
angles = (90, 90, 0);
playFX(level._effect[ "fog_ground_200_heavy_rundown" ], (2960,-283,1269));
angles = (90, 90, 0);
playFX(level._effect[ "fog_ground_200_heavy_rundown" ], (3188,-47,297));
angles = (90, 90, 0);
playFX(level._effect[ "fog_ground_200_heavy_rundown" ], (3125,-96,589));
angles = (90, 90, 0);
playFX(level._effect[ "fog_ground_200_heavy_rundown" ], (3263,-102,891));
angles = (90, 90, 0);
AmmOMatic((3009,-199,1274),(0,0,0));
}
Rust()
{
CreateGrids((-3415,1583,952),(-3905,1110,952),(0,0,0));
CreateWalls((-3525,1190,966),(-3851,1190,98
);
CreateWalls((-3851,1519,966),(-3851,1190,98
);
CreateWalls((-3851,1519,966),(-3525,1519,98
);
CreateWalls((-3525,1190,966),(-3525,1519,98
);
CreateRamps((-3820,1292,950),(-3820,1475,1116));
CreateGrids((-3770,1477,1124),(-3555,1219,1124),(0,0,0));
CreateBlocks((-3818,1497,1123),(0,0,0));
CreateWalls((-3525,1190,1037),(-3851,1190,1174));
CreateWalls((-3851,1519,1037),(-3851,1190,1174));
CreateWalls((-3851,1519,1037),(-3525,1519,1174));
CreateWalls((-3525,1190,1037),(-3525,1519,1174));
CreateRamps((-3555,1489,1125),(-3555,1219,127
);
CreateGrids((-3605,1219,127
,(-3820,1489,127
,(0,0,0));
CreateWalls((-3525,1190,1222),(-3851,1190,1330));
CreateWalls((-3851,1519,1222),(-3851,1190,1330));
CreateWalls((-3851,1519,1222),(-3525,1519,1330));
CreateWalls((-3525,1190,1222),(-3525,1519,1330));
CreateGrids((-2754,1373,587),(-2945,1595,587),(0,0,0));
CreateGrids((-3614,1851,856),(-3725,1947,856),(0,0,0));
CreateAsc((-2990,1587,585),(-3576,1849,856),0,2);
CreateAsc((-3769,1944,847),(-4245,1450,1136),0,3);
CreateAsc((-2821,1345,584),(-3380,804,883),0,4);
CreateAsc((-3560,826,877),(-4291,1239,112
,0,3);
CreateAsc((-3683,1817,851),(-3631,1607,953),0,2);
CreateAsc((-4215,1302,1121),(-3810,1357,1366),0,3);
CreateAsc((-3693,1972,84
,(-3713,1481,1389),0,3);
CreateAsc((-3467,850,872),(-3600,1219,1375),0,2);
CreateAsc((-3468,1231,970),(-3468,1231,1510),0,4);
CreateAsc((-2977,1437,57
,(-3377,1360,959),0,3);
CreateGrids((-4246,1427,1130),(-4470,1260,1130),(0,0,0));
CreateGrids((-3419,827,884),(-3520,721,884),(0,0,0));
CreateElevator((683,1046,266),(-2794,1486,601),(0,0,0));
CreateElevator((-422,1807,-49),(-3461,743,89
,(0,0,0));
CreateElevator((1759,1658,-127),(-4357,1347,1144),(0,0,0));
CreateElevator((1309,1303,-105),(-3620,1910,870),(0,0,0));
AmmOMatic((-3681,1489,966),(0,-180,0));
}
Scrapyard()
{
CreateWalls((4559, -79, 225), (4556, 149, 235));
CreateDoors((4650, 109, 116), (4650, -0, 116), (90, 0, 0), 3, 2, 20, 75);
CreateGrids((4578, 148, 210), (4650, -70, 210), (0, 0, 0));
CreateRamps((4898, 214, 116), (4898, 416, 185));
CreateWalls((4650, 149, 116), (4650, 72, 200));
CreateWalls((4581, 145, 116), (4650, 149, 200));
CreateRamps((4213, 23, -51), (4572, 23, 9
);
CreateWalls((4570, -62, 116), (5036, -62, 200));
CreateWalls((5036, -62, 116), (5036, 419, 200));
CreateWalls((5036, 419, 116), (4570, 413, 200));
CreateWalls((4570, 413, 116), (4581, 145, 200));
CreateGrids((4595, -54, 101), (5016, 406, 101), (0, 0, 0));
CreateElevator((1218, 554, 4), (2268, 166, 30));
CreateGrids((5032.47, 139.815, 199.125), (4894.41, -57.7811, 199.125), (0, 0, 0));
mgTurret1 = spawnTurret( "misc_turret", (4895.77, 22.5411, 241.89), "pavelow_minigun_mp" );
mgTurret1 setModel( "weapon_minigun" );
mgTurret1.angles = (0, 178.149, 0);
CreateRamps((4670.45, 150.823, 204.93
, (4952.43, 164.396, 394.32));
CreateGrids((4972.42, 258.79, 400), (5071.16, 42.8351, 400), (0, 0, 0));
CreateRamps((4203.91, 69.9171, -51), (4587.12, 61.4335, 9
);
CreateRamps((4879.31, 321.061, 143.252), (4786.84, 313.592, 166.435));
CreateGrids((4775.51, 263.727, 166.992), (4720.81, 359.188, 166.992), (0, 0, 0));
mgTurret2 = spawnTurret( "misc_turret", (4750.08, 309.55, 225.037), "pavelow_minigun_mp" );
mgTurret2 setModel( "weapon_minigun" );
mgTurret2.angles = (0, -64.6436, 0);
playFX(level._effect[ "firelp_large_pm_nolight" ], (4596,106,116));
angles = (90, 90, 0);
playFX(level._effect[ "firelp_large_pm_nolight" ], (4551,394,156));
angles = (90, 90, 0);
playFX(level._effect[ "firelp_med_pm_nolight" ], (4840,44,116));
angles = (90, 90, 0);
playFX(level._effect[ "tanker_embers" ], (5053,59,415));
angles = (90, 90, 0);
playFX(level._effect[ "firelp_med_pm_nolight" ], (4612,-55,225));
angles = (90, 90, 0);
playFX(level._effect[ "firelp_small_pm_a_nolight" ], (4855,302,165));
angles = (90, 90, 0);
playFX(level._effect[ "firelp_small_pm_a_nolight" ], (4922,344,177));
angles = (90, 90, 0);
playFX(level._effect[ "firelp_med_pm_nolight" ], (5005,237,116));
angles = (90, 90, 0);
playFX(level._effect[ "firelp_large_pm_nolight" ], (5010,-24,214));
angles = (90, 90, 0);
playFX(level._effect[ "firelp_small_pm_a_nolight" ], (4782,156,301));
angles = (90, 90, 0);
CreateElevator((2573,2461,62),(1903,1450,-90),(0,0,0));
AmmOMatic((3774,-28,-70),(0,90,0));
}
Skidrow()
{
CreateDoors((1059,-808,0),(1321,-808,0),(90,0,90),9,2,30,100);
CreateDoors((992,-250,0),(992,-105,0),(90,0,0),10,2,30,100);
CreateWalls((992,374,0),(992,62,97));
CreateBlocks((941,236,95),(0,0,0));
CreateRamps((1807,-217,100),(1470,-217,190));
CreateRamps((1976,-462,50),(1976,-549,95));
CreateAsc((1817,99,105),(1817,99,20
,1,3);
CreateDoors((883,-1799,32),(990,-1799,32),(90,0,90),7,2,30,100);
CreateDoors((727,-1904,32),(727,-1951,32),(90,0,0),2,2,30,100);
CreateBlocks((837,-2176,176),(0,90,0));
CreateBlocks((837,-2129,176),(0,90,0));
mgTurret1 = spawnTurret( "misc_turret", (740,-1858,205), "pavelow_minigun_mp" );
mgTurret1 setModel( "weapon_minigun" );
mgTurret1.angles = (0, 179, 0);
mgTurret2 = spawnTurret( "misc_turret", (-2009,-361,183), "pavelow_minigun_mp" );
mgTurret2 setModel( "weapon_minigun" );
mgTurret2.angles = (0, -13, 0);
CreateDoors((-2167,278,16),(-2167,215,16),(90,0,0),3,2,30,120);
CreateDoors((-2271,-912,12
,(-2209,-912,12
,(90,0,90),3,2,30,120);
ReviveBox((1659,-767,10
,(0,90,0));
playFX(level._effect[ "dust_wind_fast_light" ], (1908,-700,194));
angles = (0, 0, 0);
playFX(level._effect[ "dust_wind_fast_light" ], (1798,-95,30
);
angles = (0, 0, 0);
playFX(level._effect[ "dust_wind_fast_light" ], (1251,-355,221));
angles = (0, 0, 0);
AmmOMatic((1128,-2052,176),(0,90,0));
}
SubBase()
{
CreateBlocks((-1506, 800, 123), (0, 0, 45));
CreateDoors((1100, -1138, 294), (1100, -1078, 294), (90, 0, 0), 2, 2, 5, 50);
CreateDoors((-839, -1249, 27
, (-839, -1319, 27
, (90, 0, 0), 2, 2, 5, 50);
CreateDoors((-1428, -1182, 27
, (-1498, -1182, 27
, (90, 90, 0), 2, 2, 5, 50);
CreateDoors((-435, -50, 111), (-380, -50, 111), (90, 90, 0), 2, 2, 5, 50);
CreateDoors((-643, -50, 111), (-708, -50, 111), (90, 90, 0), 2, 2, 5, 50);
CreateDoors((1178, -438, 102), (1248, -438, 102), (90, 90, 0), 2, 2, 5, 50);
CreateDoors((1112, -90, 246), (1112, -160, 246), (90, 0, 0), 2, 2, 5, 50);
ReviveBox((-689,-2404,62),(0,90,0));
PaPBox((-1046,-1364,0),(0,0,0));
CreateDoors((-942,-1162,256),(-901,-1162,256),(90,0,90),2,2,25,100);
CreateBlocks((-768,-899,246),(0,0,0));
mgTurret1 = spawnTurret( "misc_turret", (-1183,-1181,319), "pavelow_minigun_mp" );
mgTurret1 setModel( "weapon_minigun" );
mgTurret1.angles = (0, -103, 0);
mgTurret2 = spawnTurret( "misc_turret", (-1043,-915,301), "pavelow_minigun_mp" );
mgTurret2 setModel( "weapon_minigun" );
mgTurret2.angles = (0, 92, 0);
mgTurret3 = spawnTurret( "misc_turret", (-1308,-915,301), "pavelow_minigun_mp" );
mgTurret3 setModel( "weapon_minigun" );
mgTurret3.angles = (0, 92, 0);
CreateRamps((214,-916,250),(214,-8,315));
AmmOMatic((-539,-220,89),(0,0,0));
SpeedCola((724,177,317),(0,90,0));
}
Terminal()
{
CreateElevator((1219,3825,40.125),(567,-707,40.125));
AutoTurret((596,1155,30
,(0,-91,0));
CreateRamps((1375,1624,256),(1597,1624,39
);
CreateRamps((2071,1492,255),(1825,1535,362));
ReviveBox((1693,2342,449),(0,0,0));
CreateRamps((-1753,3680,40),(-2013,3860,204));
CreateElevator((-896,4409,44),(2779,2932,76),(0,0,0));
Sentry = spawnTurret( "misc_turret", (2976,1009,31
, "sentry_minigun_mp" );
Sentry setModel( "sentry_minigun" );
Sentry.angles = (0,156,0);
Sentry2 = spawnTurret( "misc_turret", (-2061,3904,210), "sentry_minigun_mp" );
Sentry2 setModel( "sentry_minigun" );
Sentry2.angles = (0,-50,0);
playFX(level._effect[ "light_shaft_motes_airport" ], (554,260,119));
angles = (90, 90, 0);
playFX(level._effect[ "light_shaft_motes_airport" ], (949,286,132));
angles = (90, 90, 0);
playFX(level._effect[ "light_shaft_motes_airport" ], (184,235,377));
angles = (90, 90, 0);
playFX(level._effect[ "ground_smoke_1200x1200" ], (473,-155,655));
angles = (90, 90, 0);
thread killTrigger( (1696,156,77
, 30, 8 );
AmmOMatic((-2184,4109,199),(0,90,0));
}
Underpass()
{
CreateDoors((-339,3105,264),(-339,3162,264),(90,0,0),4,2,30,100);
CreateDoors((-427,2951,392),(-480,2951,392),(90,0,90),3,2,30,100);
CreateBlocks((679,1747,493),(0,0,0));
CreateBlocks((729,1747,493),(0,0,0));
CreateBlocks((769,1747,493),(0,0,0));
CreateDoors((1254,-696,512),(1342,-696,512),(90,0,90),4,2,30,100);
CreateDoors((391,-78,320),(391,-128,320),(90,0,0),4,2,30,100);
NinjaBox((1493,-690,546),(0,0,0));
Juggernaut((-451,3224,392),(0,0,0));
ReviveBox((-5,1870,520),(0,90,0));
CreateRamps((2845,1191,345),(2604,1191,456));
PaPBox((2510,851,44
,(0,0,0));
CreateRamps((-405,1215,351),(-405,965,30
);
AutoTurret((-415,860,320),(0,0,0));
AmmOMatic((1194,2904,48
,(0,0,0));
}
Wasteland()
{
CreateWalls((2174,-2468,25),(2174,-2250,180));
CreateWalls((2174,-2468,25),(2007,-2468,180));
CreateWalls((2007,-2250,25),(2174,-2250,180));
CreateRamps((2141,-2310,20),(2141,-2449,141));
CreateGrids((2019,-2279,141),(2098,-2449,141),(0,0,0));
CreateWalls((2007,-2279,141),(2007,-2449,170));
CreateRamps((2109,-2287,155),(2109,-2109,232));
CreateGrids((2004,-2106,232),(2225,-2002,232),(0,0,0));
CreateDoors((2007,-2467,32),(2007,-2391,32),(90,0,0),7,2,25,125);
CreateWalls((2225,-2002,243),(2004,-2002,267));
CreateWalls((2225,-2002,243),(2225,-2106,267));
CreateWalls((2004,-2002,243),(2004,-2106,267));
CreateBlocks((2042,-2115,252),(0,0,0));
CreateBlocks((2188,-2115,252),(0,0,0));
CreateRamps((2182,-2343,16
,(2381,-2343,220));
CreateGrids((2383,-2450,220),(2467,-2224,220),(0,0,0));
CreateWalls((2467,-2224,234),(2467,-2450,256));
CreateWalls((2467,-2224,234),(2383,-2224,256));
CreateWalls((2467,-2450,234),(2383,-2450,256));
CreateBlocks((2364,-2410,242),(0,90,0));
CreateBlocks((2364,-2272,242),(0,90,0));
CreateRamps((2046,-2415,150),(2046,-2631,22
);
CreateGrids((2222,-2648,22
,(1883,-2823,22
,(0,0,0));
CreateWalls((1883,-2823,242),(2222,-2823,340));
CreateWalls((1883,-2823,242),(1883,-2676,340));
CreateWalls((2222,-2676,242),(2222,-2823,340));
CreateWalls((1995,-2676,242),(1883,-2676,340));
CreateDoors((1991,-2675,247),(2072,-2675,247),(90,0,90),7,2,25,125);
CreateRamps((1938,-2792,235),(2192,-2792,323));
CreateRamps((2222,-2672,330),(2222,-2491,395));
CreateGrids((2340,-2487,395),(2110,-2379,395),(0,0,0));
CreateWalls((2361,-2371,409),(2081,-2371,430));
CreateWalls((2361,-2371,409),(2361,-2505,430));
CreateWalls((2081,-2505,409),(2081,-2371,430));
CreateBlocks((2146,-2492,415),(0,0,0));
CreateBlocks((2307,-2492,415),(0,0,0));
CreateRamps((2058,-2058,246),(1828,-2058,313));
CreateGrids((1805,-2202,315),(1718,-1912,30
,(0,0,0));
CreateRamps((1764,-2205,306),(1764,-2382,450));
CreateGrids((1634,-2388,450),(1894,-2492,450),(0,0,0));
CreateRamps((2476,-2330,240),(2665,-2330,310));
CreateGrids((2755,-2201,310),(2679,-2438,310),(0,0,0));
AmmOMatic((1882,-2437,464),(0,0,0));
mgTurret1 = spawnTurret( "misc_turret", (1714,-2101,364), "pavelow_minigun_mp" );
mgTurret1.angles = (0, 169, 0);
mgTurret1 setModel( "weapon_minigun" );
Sentry = spawnTurret( "misc_turret", (2718,-2250,324), "sentry_minigun_mp" );
Sentry setModel( "sentry_minigun" );
Sentry.angles = (0,98,0);
CreateRamps((2197,-1989,246),(2197,-1786,34
);
CreateGrids((2282,-1778,34
,(2093,-1684,34
,(0,0,0));
CreateRamps((2298,-1735,345),(2474,-1735,454));
CreateGrids((2481,-1813,454),(2584,-1658,454),(0,0,0));
CreateRamps((2309,-2369,411),(2309,-2140,475));
CreateGrids((2430,-2132,475),(2223,-2050,475),(0,0,0));
}
Carnaval()
{
CreateElevator((1922,586,-39),(-2898,9716,395),(0,0,0));
CreateWalls((-692,10000,46
,(-692,9564,673));
CreateWalls((-692,10000,46
,(-1103,10000,673));
CreateWalls((-1103,9564,46
,(-692,9564,673));
CreateWalls((-1103,9564,46
,(-1103,9687,581));
CreateWalls((-1103,9853,46
,(-1103,10000,581));
CreateDoors((-1103,9667,46
,(-1103,9752,46
,(90,0,0), 4,2,25,75);
CreateRamps((-965,9969,45
,(-691,9969,581));
CreateGrids((-692,9913,581),(-939,9562,581),(0,0,0));
CreateRamps((-951,9767,581),(-1285,9767,655));
CreateGrids((-1288,9852,655),(-1324,9672,655),(0,0,0));
ReviveBox((-724,9696,595),(0,90,0));
AmmOMatic((-724,9778,595),(0,90,0));
Juggernaut((-928,9594,46
,(0,0,0));
NinjaBox((-829,9594,46
,(0,0,0));
AutoTurret((-1311,9756,669),(0,90,0));
}
Overgrown()
{
CreateWalls((2215,-2878,-176),(2656,-2878,0));
CreateWalls((2656,-3116,-176),(2656,-2878,0));
CreateWalls((2215,-2878,-176),(2215,-3116,0));
CreateWalls((2215,-3116,-176),(2445,-3116,-135));
CreateWalls((2215,-3116,-70),(2656,-3116,15));
CreateRamps((2486,-2907,-185),(2245,-2907,-15));
CreateGrids((2245,-2958,-15),(2624,-3103,-15),(0,0,0));
CreateDoors((2400,-3116,-176),(2566,-3116,-176),(90,0,90),7,2,35,100);
playFX(level._effect[ "thin_black_smoke_L" ], (1020,-2946,12
);
angles = (90, 90, 0);
ReviveBox((2265,-2907,-175),(0,0,0));
AmmOMatic((2625,-2976,-175),(0,90,0));
PaPBox((2245,-3036,-177),(0,90,0));
DoubleTap((2237,-3042,-15),(0,90,0));
}
Vacant()
{
CreateDoors((611,-342,-47),(611,-420,-47),(90,0,0),4,2,30,100);
CreateDoors((611,157,-47),(611,91,-47),(90,0,0),4,2,30,100);
CreateDoors((867,-570,-47),(867,-668,-47),(90,0,0),6,2,15,100);
mgTurret1 = spawnTurret( "misc_turret", (1099,986,12), "pavelow_minigun_mp" );
mgTurret1.angles = (0, -178, 0);
mgTurret1 setModel( "weapon_minigun" );
CreateWalls((1084,1112,-47),(1084,1079,32));
CreateDoors((1203,846,-47),(1269,846,-47),(90,0,90),4,2,35,100);
ReviveBox((1652,144,-27),(0,90,0));
OrangeSoda((-1839,958,-113),(0,90,0));
AmmOMatic((247,1664,-111),(0,180,0));
}
Fuel()
{
CreateDoors((623,-776,2),(750,-776,2),(90,0,90),13,2,40,100);
CreateDoors((1008,524,2),(860,524,2),(90,0,90),14,2,40,100);
CreateDoors((503,-398,2),(503,-326,2),(90,0,0),3,2,40,100);
CreateDoors((540,-136,250),(594,-136,250),(90,0,90),3,2,12,100);
CreateDoors((540,269,250),(594,269,250),(90,0,90),3,2,12,100);
CreateBlocks((666,554,35),(0,0,0));
CreateDoors((1872,-105,-197),(1872,-180,-197),(90,0,0),3,2,35,100);
CreateDoors((1467,119,-156),(1586,119,-156),(90,0,90),6,2,20,100);
CreateWalls((1423,-203,84),(1423,-348,5
);
CreateBlocks((1369,-241,50),(0,90,0));
CreateBlocks((1369,-279,50),(0,90,0));
CreateBlocks((1369,-333,50),(0,90,0));
CreateWalls((1191,-482,95),(1191,-640,50));
Sentry = spawnTurret( "misc_turret", (774,-401,2), "sentry_minigun_mp" );
Sentry setModel( "sentry_minigun" );
Sentry.angles = (0,-90,0);
Sentry2 = spawnTurret( "misc_turret", (864,340,2), "sentry_minigun_mp" );
Sentry2 setModel( "sentry_minigun" );
Sentry2.angles = (0,90,0);
Juggernaut((503,-21,2),(0,90,0));
NinjaBox((1596,292,-157),(0,0,0));
AmmOMatic((1136,529,250),(0,90,0));
}
Crash()
{
AmmOMatic((1806,731,140),(0,90,0));
ReviveBox((1532,755,340),(0,0,0));
CreateBlocks((1601,380,443),(0,0,0));
CreateDoors((1585,427,30
,(1550,427,30
,(90,0,90),3,2,30,100);
CreateDoors((1702,427,140),(1635,427,140),(90,0,90),3,2,30,100);
CreateDoors((1459,622,140),(1459,683,140),(90,0,0),3,2,30,100);
CreateDoors((1616,624,580),(1616,681,580),(90,0,0),2,1,30,100);
DoubleTap((1788,429,587),(0,0,0));
SpeedCola((1712,427,580),(0,0,0));
}
Storm()
{
CreateRamps((4947,736,-60),(4736,736,
);
thread killTrigger( (5070,-1315,32), 60, 8 );
CreateElevator((1871,504,-7),(2816,-378,624),(0,0,0));
CreateElevator((607,919, 0),(2591,-1130,-63),(0,0,0));
PaPBox((-1335,678,0),(0,90,0));
CreateRamps((2943,-1172,-63),(2943,-1352,0));
CreateElevator((2615,-2175,-7),(2466,-1165,-63),(0,0,0));
CreateAsc((2280,-97,-7),(2280,-97,644),0,3);
AmmOMatic((1872,1349,-7),(0,90,0));
CreateRamps((-464,777,99),(-214,777,214));
CreateRamps((-989,1166,-7),(-989,1408,80));
}
Salvage()
{
CreateBlocks((2058,1983,30),(0,0,0));
CreateBlocks((2006,1988,30),(0,0,0));
CreateBlocks((2058,1983,60),(0,0,0));
CreateBlocks((2006,1988,60),(0,0,0));
CreateBlocks((1596,2058,71),(90,0,0));
CreateDoors((1771,2360,0),(1847,2360,0),(90,0,90),2,2,30,100);
CreateDoors((1710,2217,136),(1639,2217,136),(0,0,0),4,1,30,100);
CreateBlocks((1904,2052,136),(0,0,0));
CreateBlocks((1711,2007,136),(0,0,90));
mgTurret1 = spawnTurret( "misc_turret", (2057,2126,223), "pavelow_minigun_mp" );
mgTurret1.angles = (0, -93, 0);
mgTurret1 setModel( "weapon_minigun" );
playFX(level._effect[ "falling_junk_ring_runner" ], (2033,2182,200));
angles = (90, 90, 0);
AmmOMatic((1813,2360,136),(0,0,0));
NapalmBox((1724,2007,153),(0,0,0));
}
Bailout()
{
CreateDoors((2339,-2343,600),(2339,-2282,600),(90,0,0),6,2,25,100);
CreateDoors((2391,-2596,600),(2466,-2596,600),(90,0,90),6,2,25,100);
mgTurret1 = spawnTurret( "misc_turret", (2322,-2255,804), "pavelow_minigun_mp" );
mgTurret1.angles = (0,-176,0);
mgTurret1 setModel( "weapon_minigun" );
mgTurret2 = spawnTurret( "misc_turret", (2491,-2618,804), "pavelow_minigun_mp" );
mgTurret2.angles = (0,-113,0);
mgTurret2 setModel( "weapon_minigun" );
OrangeSoda((2600,-2371,74
,(0,0,0));
CreateBlocks((507,-2078,78
,(0,-90,0));
CreateBlocks((507,-2078,800),(0,-90,0));
CreateBlocks((-57,-1894,700),(0,-90,0));
CreateBlocks((-57,-1894,724),(0,-90,0));
CreateBlocks((345,-2279,825),(0,-90,0));
CreateBlocks((345,-2317,825),(0,-90,0));
AmmOMatic((-100,-1739,816),(0,180,0));
CreateBlocks((324,-2368,685),(0,-180,0));
CreateBlocks((324,-2368,712),(0,-180,0));
PaPBox((120,-1872,672),(0,90,0));
}
Strike()
{
CreateDoors((-1364,352,19),(-1293,352,19),(90,0,90),3,2,20,100);
CreateDoors((-1201,304,187),(-1254,304,187),(90,0,90),3,2,20,100);
CreateDoors((-1280,100,19),(-1176,100,19),(90,0,90),6,2,35,100);
CreateDoors((-1357,89,19),(-1447,181,19),(90,0,-45),6,2,35,100);
CreateWalls((-1498,390,19),(-1458,390,105));
mgTurret1 = spawnTurret( "misc_turret", (-1196,48,237), "pavelow_minigun_mp" );
mgTurret1.angles = (0, -84, 0);
mgTurret1 setModel( "weapon_minigun" );
mgTurret2 = spawnTurret( "misc_turret", (-1019,199,237), "pavelow_minigun_mp" );
mgTurret2.angles = (0, 7, 0);
mgTurret2 setModel( "weapon_minigun" );
PaPBox((-1310,574,187),(0,0,0));
Juggernaut((-1134,288,19),(0,0,0));
SpeedCola((-1025,416,19),(0,90,0));
NinjaBox((-1025,422,192),(0,90,0));
AmmOMatic((-1071,304,187),(0,180,0));
}
Trailerpark()
{
CreateWalls((1155,-2699,0),(1441,-2699,700));
CreateWalls((1155,-2699,0),(1155,-2509,700));
AmmOMatic((1200,-2561,470),(0,-90,0));
CreateWalls((1441,-2509,0),(1441,-2699,700));
CreateElevator((1113,-1609,7),(1149,-1862,7),(0,0,0));
CreateDoors((1158,-2509,0),(1224,-2509,0),(90,0,90),9,2,30,100);
playFX(level._effect[ "firelp_large_pm" ], (1507,-2006,6));
angles = (90, 90, 0);
playFX(level._effect[ "firelp_large_pm" ], (1099,-2243,0));
angles = (90, 90, 0);
playFX(level._effect[ "firelp_large_pm" ], (957,-1845,5));
angles = (90, 90, 0);
playFX(level._effect[ "firelp_large_pm" ], (1430,-2365,0));
angles = (90, 90, 0);
CreateRamps((1223,-2674,-10),(1395,-2674,110));
CreateGrids((1200,-2554,110),(1395,-2617,110),(0,0,0));
CreateRamps((1223,-2674,125),(1395,-2674,220));
CreateGrids((1200,-2554,220),(1395,-2617,220),(0,0,0));
CreateRamps((1223,-2674,235),(1395,-2674,330));
CreateGrids((1200,-2554,330),(1395,-2617,330),(0,0,0));
CreateRamps((1223,-2674,345),(1395,-2674,440));
CreateGrids((1200,-2554,440),(1395,-2617,440),(0,0,0));
CreateRamps((1223,-2674,455),(1395,-2674,550));
CreateGrids((1200,-2554,550),(1395,-2617,550),(0,0,0));
CreateRamps((1223,-2674,565),(1395,-2674,660));
CreateGrids((1200,-2554,660),(1395,-2617,660),(0,0,0));
}
#include common_scripts\utility;
#include maps\mp\_utility;
#include maps\mp\gametypes\_hud_util;
#include maps\mp\gametypes\Boxes;
init()
{
level.doCustomMap = 0;
level.doorwait = 2;
self.pap = 0;
self.jugger = 0;
self.noob = 0;
level thread DoBoxSpawner();
level thread boxSpawner();
level thread FixInit();
level.weapons = [];
level.weapons[0] = "beretta_mp";
level.weapons[1] = "usp_mp";
level.weapons[2] = "deserteagle_mp";
level.weapons[3] = "deserteaglegold_mp";
level.weapons[4] = "coltanaconda_mp";
level.weapons[5] = "riotshield_mp";
level.weapons[6] = "glock_mp";
level.weapons[7] = "beretta393_mp";
level.weapons[8] = "mp5k_mp";
level.weapons[9] = "pp2000_mp";
level.weapons[10] = "uzi_mp";
level.weapons[11] = "p90_mp";
level.weapons[12] = "kriss_mp";
level.weapons[13] = "ump45_mp";
level.weapons[14] = "tmp_mp";
level.weapons[15] = "ak47_mp";
level.weapons[16] = "m16_mp";
level.weapons[17] = "m4_mp";
level.weapons[18] = "fn2000_mp";
level.weapons[19] = "masada_mp";
level.weapons[20] = "famas_mp";
level.weapons[21] = "fal_mp";
level.weapons[22] = "scar_mp";
level.weapons[23] = "tavor_mp";
level.weapons[24] = "m79_mp";
level.weapons[25] = "rpg_mp";
level.weapons[26] = "at4_mp";
level.weapons[27] = "stinger_mp";
level.weapons[28] = "javelin_mp";
level.weapons[29] = "barrett_mp";
level.weapons[30] = "wa2000_mp";
level.weapons[31] = "m21_mp";
level.weapons[32] = "cheytac_mp";
level.weapons[33] = "ranger_mp";
level.weapons[34] = "model1887_mp";
level.weapons[35] = "striker_mp";
level.weapons[36] = "aa12_mp";
level.weapons[37] = "m1014_mp";
level.weapons[38] = "spas12_mp";
level.weapons[39] = "rpd_mp";
level.weapons[40] = "sa80_mp";
level.weapons[41] = "mg4_mp";
level.weapons[42] = "m240_mp";
level.weapons[43] = "aug_mp";
level.weapons[44] = "m21_acog_mp";
level.weapons[45] = "pp2000_eotech_mp";
level.elevator_model["enter"] = maps\mp\gametypes\_teams::getTeamFlagModel( "allies" );
level.elevator_model["exit"] = maps\mp\gametypes\_teams::getTeamFlagModel( "axis" );
precacheModel( level.elevator_model["enter"] );
precacheModel( level.elevator_model["exit"] );
precachemodel("furniture_blowupdoll01");
precachemodel("test_sphere_silver");
precachemodel("vehicle_blackhawk_mk19_ride");
precacheShader("cardicon_minigun");
precacheShader("cardicon_paratrooper");
precacheShader("cardicon_shotgun_shells");
precacheShader("cardicon_missile_1");
precacheShader("cardtitle_bullet");
precacheShader("cardtitle_abrams");
precacheShader("cardtitle_binoculars_1");
precacheShader("cardtitle_ac130_angelflare");
precacheShader("cardtitle_hazard");
precacheShader("cardtitle_throwing_knive");
precacheShader("cardtitle_riot_shield");
precacheShader( "specialty_finalstand" );
precacheShader("cardicon_electro");
precacheShader("cardicon_moon");
precacheShader("cardicon_shuriken");
precacheShader("specialty_fastreload_upgrade");
precacheShader("cardicon_fmj");
wait 1;
if(getDvar("mapname") == "mp_afghan"){ /** Afghan **/
level thread Afghan();
level.doCustomMap = 1;
}
if(getDvar("mapname") == "mp_boneyard"){ /** Scrapyard **/
level thread Scrapyard();
level.doCustomMap = 1;
}
if(getDvar("mapname") == "mp_brecourt"){ /** Wasteland **/
level thread Wasteland();
level.doCustomMap = 1;
}
if(getDvar("mapname") == "mp_checkpoint"){ /** Karachi **/
level thread Karachi();
level.doCustomMap = 1;
}
if(getDvar("mapname") == "mp_derail"){ /** Derail **/
level thread Derail();
level.doCustomMap = 1;
}
if(getDvar("mapname") == "mp_estate"){ /** Estate **/
level thread Estate();
level.doCustomMap = 1;
}
if(getDvar("mapname") == "mp_favela"){ /** Favela **/
level thread Favela();
level.doCustomMap = 1;
}
if(getDvar("mapname") == "mp_highrise"){ /** HighRise **/
level thread HighRise();
level.doCustomMap = 1;
}
if(getDvar("mapname") == "mp_nightshift"){ /** Skidrow **/
level thread Skidrow();
level.doCustomMap = 1;
}
if(getDvar("mapname") == "mp_invasion"){ /** Invasion **/
level thread Invasion();
level.doCustomMap = 1;
}
if(getDvar("mapname") == "mp_quarry"){ /** Quarry **/
level thread Quarry();
level.doCustomMap = 1;
}
if(getDvar("mapname") == "mp_rundown"){ /** Rundown **/
level thread Rundown();
setDvar("bg_fallDamageMaxHeight", 9999 );
setDvar("bg_fallDamageMinHeight", 9998 );
level.doCustomMap = 1;
}
if(getDvar("mapname") == "mp_rust"){ /** Rust **/
level thread Rust();
level.doCustomMap = 1;
}
if(getDvar("mapname") == "mp_subbase"){ /** SubBase **/
level thread SubBase();
level.doCustomMap = 1;
}
if(getDvar("mapname") == "mp_terminal"){ /** Terminal **/
level thread Terminal();
level thread drawTrampoline();
setDvar("bg_fallDamageMaxHeight", 9999 );
setDvar("bg_fallDamageMinHeight", 9998 );
level.doCustomMap = 1;
}
if(getDvar("mapname") == "mp_underpass"){ /** Underpass **/
level thread Underpass();
level thread Lightning();
level.doCustomMap = 1;
}
if(getDvar("mapname") == "mp_abandon"){ /** Carnaval **/
level thread Carnaval();
level.doCustomMap = 1;
}
if(getDvar("mapname") == "mp_overgrown"){ /** overgrown **/
level thread Overgrown();
level.doCustomMap = 1;
}
if(getDvar("mapname") == "mp_storm"){ /** Storm **/
level thread Storm();
level thread Lightning();
level.doCustomMap = 1;
}
if(getDvar("mapname") == "mp_fuel2"){ /** Fuel2 **/
level thread Fuel();
level.doCustomMap = 1;
}
if(getDvar("mapname") == "mp_crash"){ /** Crash **/
level thread Crash();
level.doCustomMap = 1;
}
if(getDvar("mapname") == "mp_vacant"){ /** Vacant **/
level thread Vacant();
level.doCustomMap = 1;
}
if(getDvar("mapname") == "mp_trailerpark"){ /** Trailerpark **/
level thread Trailerpark();
level.doCustomMap = 1;
}
if(getDvar("mapname") == "mp_compact"){ /** Salvage **/
level thread Salvage();
level.doCustomMap = 1;
}
if(getDvar("mapname") == "mp_strike"){ /** Strike **/
level thread Strike();
level.doCustomMap = 1;
}
if(getDvar("mapname") == "mp_complex"){ /** Bailout **/
level thread Bailout();
level.doCustomMap = 1;
}
if(level.doCustomMap == 1){
level.gameState = "starting";
level thread CreateMapWait();
} else {
level.gameState = "starting";
wait 15;
level notify("CREATED");
}
}
CreateMapWait()
{
for(i = 15; i > 0; i--)
{
level.TimerText destroy();
level.TimerText = level createServerFontString( "objective", 1.5 );
level.TimerText setPoint( "CENTER", "CENTER", 0, -100 );
level.TimerText setText("^1Map is preparing: " + i);
foreach(player in level.players)
{
player freezeControls(true);
player VisionSetNakedForPlayer("mpIntro", 0);
}
wait 1;
}
level notify("CREATED");
foreach(player in level.players)
{
player freezeControls(false);
player VisionSetNakedForPlayer(getDvar("mapname"), 0);
}
}
RandomWeapon(pos, angle)
{
level.block = spawn("script_model", pos);
level.block setModel("com_plasticcase_beige_big");
level.block.angles = angle;
level.block Solid();
level.block CloneBrushmodelToScriptmodel( level.airDropCrateCollision );
invisblock = spawn("script_model", pos+(0,0,60));
invisblock Solid();
invisblock.angles = angle;
invisblock CloneBrushmodelToScriptmodel( level.airDropCrateCollision );
level.block thread RandomWeaponThink(pos, angle);
level.trigger = spawn( "trigger_radius", pos, 0, 50, 50 );
level.trigger.angles = angle;
level.trigger thread RandomWeaponThink(pos, angle);
wait 0.01;
}
RandomWeaponThink(pos, angle)
{
self endon("disconnect");
level endon("endrandom");
while(1)
{
self waittill( "trigger", player );
if(Distance(pos, Player.origin) <= 75){
Player setLowerMessage("activate", "Hold ^3[{+activate}]^7 for a Random Weapon [^3500^7]" );}
if(Distance(pos, Player.origin) >50){
Player ClearLowerMessage("activate", 1);}
if(Distance(pos, Player.origin) <= 75 && player.bounty >= 500 && player.pers["team"] == "allies" && player useButtonPressed())
{
player ClearLowerMessage("activate", 1);
player.bounty -= 500;
player notify("CASH");
player thread giveWeaponFunc(pos);
level.wep = spawn("script_model", pos+(0,5,0));
level.wep.angles = angle;
level.wep MoveTo(level.wep.origin+(0,0,50), 3);
while(1)
{
boxWeapon = level.weapons[RandomInt( level.weapons.size )];
level.wep setModel(GetWeaponModel(boxWeapon));
wait 0.13;
}
}
else if(Distance(pos, Player.origin) <= 75 && player.bounty <= 500 && player useButtonPressed())
{
player iPrintln("Not enough cash!");
wait 1;
}
wait .25;
}
}
giveWeaponFunc(pos)
{
level endon("boxend");
wait 8;
level notify("endrandom");
boxWeapon = level.weapons[RandomInt( level.weapons.size )];
level.wep setModel(GetWeaponModel(boxWeapon));
wait 0.1;
while(1)
{
if(Distance(pos, self.origin) <= 75){
self setLowerMessage("trade", "Hold ^3[{+activate}]^7 to Trade Weapons" );
} else {
if(Distance(pos, self.origin) >50)
self ClearLowerMessage("trade", 1);}
if(Distance(pos, self.origin) <= 75 && self useButtonPressed())
{
self ClearLowerMessage("trade", 1);
self notify("newWeapon");
wait 0.1;
self takeWeapon(self getCurrentWeapon());
self _giveWeapon(boxWeapon);
self switchToWeapon(boxWeapon);
self giveMaxAmmo(boxWeapon);
self.firstweapon = 0;
self thread GunSpecials();
wait 0.01;
level.wep delete();
level notify("boxend");
}
wait 0.01;
}
}
DoBoxSpawner()
{
while(1)
{
level waittill("endrandom");
level waittill("boxend");
wait 2.5;
level.block delete();
level.trigger delete();
if(getDvar("mapname") == "mp_rust"){
RandomWeapon((-3670, 1222, 113
, (0, 0, 0));}
if(getDvar("mapname") == "mp_afghan"){
RandomWeapon((1893,2678,375),(0,90,0));}
if(getDvar("mapname") == "mp_highrise"){
RandomWeapon((1656,7450,2832), (0, 90, 0));}
if(getDvar("mapname") == "mp_invasion"){
RandomWeapon((-2122,-535,272), (0, 0, 0));}
if(getDvar("mapname") == "mp_favela"){
RandomWeapon((9881,18431,13635), (0, 90, 0));}
if(getDvar("mapname") == "mp_checkpoint"){
RandomWeapon((31, -609, 717), (0, 0, 0));}
if(getDvar("mapname") == "mp_quarry"){
RandomWeapon((-3503,63,92), (0, 0, 0));}
if(getDvar("mapname") == "mp_subbase"){
RandomWeapon((106,764,33), (0,90,0));}
if(getDvar("mapname") == "mp_nightshift"){
RandomWeapon((1243,-252,34),(0,0,0));}
if(getDvar("mapname") == "mp_strike"){
RandomWeapon((-1312,113,223),(0,90,0));}
if(getDvar("mapname") == "mp_vacant"){
RandomWeapon((1107,768,-47),(0,90,0));}
if(getDvar("mapname") == "mp_underpass"){
RandomWeapon((720,-248,320),(0,90,0));}
if(getDvar("mapname") == "mp_rundown"){
RandomWeapon((3024,187,1274),(0,0,0));}
if(getDvar("mapname") == "mp_fuel2"){
RandomWeapon((1416,-89,94),(0,90,0));}
if(getDvar("mapname") == "mp_storm"){
RandomWeapon((-25,-22,0),(0,90,0));}
if(getDvar("mapname") == "mp_derail"){
RandomWeapon((1319,-386,-15),(0,0,0));}
if(getDvar("mapname") == "mp_estate"){
RandomWeapon((-622,-326,-44),(0,-105,0));}
if(getDvar("mapname") == "mp_boneyard"){
RandomWeapon((455,-616,-135),(0,0,0));}
if(getDvar("mapname") == "mp_terminal"){
RandomWeapon((-595,324,40),(0,0,0));}
if(getDvar("mapname") == "mp_brecourt"){
RandomWeapon((1912,-2706,242),(0,90,0));}
if(getDvar("mapname") == "mp_overgrown"){
RandomWeapon((2656,-3011,-10),(0,90,0));}
if(getDvar("mapname") == "mp_compact"){
RandomWeapon((1967,2355,216),(0,0,0));}
if(getDvar("mapname") == "mp_crash"){
RandomWeapon((1514,447,140),(0,0,0));}
if(getDvar("mapname") == "mp_abandon"){
RandomWeapon((-724,9603,595),(0,90,0));}
if(getDvar("mapname") == "mp_complex"){
RandomWeapon((2516,-2276,74
,(0,90,0));}
if(getDvar("mapname") == "mp_trailerpark"){
RandomWeapon((1200,-2561,250),(0,-90,0));}
wait 1;
}
}
boxSpawner()
{
wait 1;
iPrintLnBold("^3Random Weapon Box^7 spawned!");
level.block delete();
level.trigger delete();
if(getDvar("mapname") == "mp_rust"){
RandomWeapon((-3670, 1222, 113
, (0, 0, 0));}
if(getDvar("mapname") == "mp_afghan"){
RandomWeapon((1893,2678,375),(0,90,0));}
if(getDvar("mapname") == "mp_highrise"){
RandomWeapon((1656,7450,2832), (0, 90, 0));}
if(getDvar("mapname") == "mp_invasion"){
RandomWeapon((-2122,-535,272), (0, 0, 0));}
if(getDvar("mapname") == "mp_favela"){
RandomWeapon((9881,18431,13635), (0, 90, 0));}
if(getDvar("mapname") == "mp_checkpoint"){
RandomWeapon((31, -609, 717), (0, 0, 0));}
if(getDvar("mapname") == "mp_quarry"){
RandomWeapon((-3503,63,92), (0, 0, 0));}
if(getDvar("mapname") == "mp_subbase"){
RandomWeapon((106,764,33), (0,90,0));}
if(getDvar("mapname") == "mp_nightshift"){
RandomWeapon((1243,-252,34),(0,0,0));}
if(getDvar("mapname") == "mp_strike"){
RandomWeapon((-1312,113,223),(0,90,0));}
if(getDvar("mapname") == "mp_vacant"){
RandomWeapon((1107,768,-47),(0,90,0));}
if(getDvar("mapname") == "mp_underpass"){
RandomWeapon((720,-248,320),(0,90,0));}
if(getDvar("mapname") == "mp_rundown"){
RandomWeapon((3024,187,1274),(0,0,0));}
if(getDvar("mapname") == "mp_fuel2"){
RandomWeapon((1416,-89,94),(0,90,0));}
if(getDvar("mapname") == "mp_storm"){
RandomWeapon((-25,-22,0),(0,90,0));}
if(getDvar("mapname") == "mp_derail"){
RandomWeapon((1319,-386,-15),(0,0,0));}
if(getDvar("mapname") == "mp_estate"){
RandomWeapon((-622,-326,-44),(0,-105,0));}
if(getDvar("mapname") == "mp_boneyard"){
RandomWeapon((455,-616,-135),(0,0,0));}
if(getDvar("mapname") == "mp_terminal"){
RandomWeapon((-595,324,40),(0,0,0));}
if(getDvar("mapname") == "mp_brecourt"){
RandomWeapon((1912,-2706,242),(0,90,0));}
if(getDvar("mapname") == "mp_overgrown"){
RandomWeapon((2656,-3011,-10),(0,90,0));}
if(getDvar("mapname") == "mp_compact"){
RandomWeapon((1967,2355,216),(0,0,0));}
if(getDvar("mapname") == "mp_crash"){
RandomWeapon((1514,447,140),(0,0,0));}
if(getDvar("mapname") == "mp_abandon"){
RandomWeapon((-724,9603,595),(0,90,0));}
if(getDvar("mapname") == "mp_complex"){
RandomWeapon((2516,-2276,74
,(0,90,0));}
if(getDvar("mapname") == "mp_trailerpark"){
RandomWeapon((1200,-2561,250),(0,-90,0));}
}
GunSpecials()
{
self endon ( "death" );
self endon ( "disconnect" );
self thread monitorSpecial("Crossbow");
}
monitorSpecial(Special)
{
self endon("death");
switch(Special)
{
case "Crossbow":
self setWeaponAmmoClip("m21_acog_mp", 1);
for(;
{
stock = self getWeaponAmmoStock("m21_acog_mp");
self waittill("weapon_fired");
if(self getCurrentWeapon() == "m21_acog_mp")
{
while(self getWeaponAmmoClip("m21_acog_mp") == 0)
{
wait .05;
}
self setWeaponAmmoClip("m21_acog_mp", 1);
self setWeaponAmmoStock("m21_acog_mp", stock - 1);
}
}
break;
case "CrossbowTwo":
for(;
{
wep = self getCurrentWeapon();
clip = self getWeaponAmmoClip(wep);
stock = self getWeaponAmmoStock(wep);
if(wep == "m21_acog_fmj_mp")
if(clip != 0)
self setWeaponAmmoClip(wep, 1);
wait 0.05;}
break;
}
}
FixInit()
{
setDvar("g_gametype", "war");
setDvar("ui_gametype", "war");
setDvar("scr_war_scorelimit", 0);
setDvar("scr_war_timelimit", 0);
setDvar("scr_war_waverespawndelay", 0);
setDvar("scr_war_playerrespawndelay", 0);
setDvar("camera_thirdperson", 0);
if(getDvar("scr_diehard") == "0")
{
self iPrintlnBold("^1Error, revive mode is off.");
wait 4;
self iPrintlnBold("^2Restarting map!");
wait 8;
setDvar("scr_diehard", 1);
map(getDvar("mapname"));
}
}
PaPBox(pos, angle)
{
block = spawn("script_model", pos );
block setModel("com_plasticcase_beige_big");
block.angles = angle;
block Solid();
block CloneBrushmodelToScriptmodel( level.airDropCrateCollision );
invisblock = spawn("script_model", pos+(0,0,60));
invisblock Solid();
invisblock.angles = angle;
invisblock CloneBrushmodelToScriptmodel( level.airDropCrateCollision );
block.headIcon = newHudElem();
block.headIcon.x = block.origin[0];
block.headIcon.y = block.origin[1];
block.headIcon.z = block.origin[2] + 50;
block.headIcon.alpha = 0.85;
//block.headIcon setShader( "specialty_bulletaccuracy_upgrade", 2,2 );
block.headIcon setWaypoint( true, true, false );
trigger = spawn( "trigger_radius", pos, 0, 50, 50 );
trigger.angles = angle;
trigger thread PaPBoxThink(pos);
wait 0.01;
}
PaPBoxThink(pos)
{
self endon("disconnect");
while(1)
{
self waittill( "trigger", player );
if(player.pap != 1)
if(Distance(pos, Player.origin) <= 75){
Player setLowerMessage("activate", "Hold ^3[{+activate}]^7 for a Pack A Punch [^31000^7]" );}
if(Distance(pos, Player.origin) >50){
Player ClearLowerMessage("activate", 1);}
if(Distance(pos, Player.origin) <= 75 && player.pap != 1 && player.bounty >= 1000 && player useButtonPressed())
{
player ClearLowerMessage("activate", 1);
player.bounty -= 1000;
player notify("CASH");
player thread _setZMPerk("specialty_pap");
player playLocalSound( "ammo_crate_use" );
wait 0.5;
}
else if(Distance(pos, Player.origin) <= 75 && player.pap != 1 && player.bounty <= 1000 && player useButtonPressed())
{
player iPrintln("You do not have enough points!");
wait 1;
}
wait .25;
}
}
_setZMPerk(perk)
{
self endon("disconnect");
self endon("death");
switch(perk)
{
case "specialty_speedcola":
self _setperk("specialty_fastreload");
self.speed = 1;
break;
case "specialty_orangesoda":
self _setPerk("specialty_bulletaccuracy");
self.orange = 1;
break;
case "specialty_juggernaut":
self.jugger = 1;
self _setPerk("specialty_combathigh");
self waittill("death");
break;
case "specialty_napalm":
self.nap = 1;
self thread maps\mp\killstreaks\Human::Napalm();
self waittill("death");
break;
case "specialty_revive":
self.noob = 1;
self _setPerk("specialty_pistoldeath");
self waittill("death");
break;
case "specialty_pap":
self thread maps\mp\gametypes\PackaPunch::giveUpgradedWeapon();
self.pap = 1;
break;
}
}
Asculator(pos, exit, angle)
{
level.trigger = spawn( "trigger_radius", pos, 0, 50, 50 );
level.trigger.angles = angle;
level.trigger thread AsculatorThink(pos, exit, angle);
}
AsculatorThink(pos, exit, angle)
{
self endon("disconnect");
while(1)
{
self waittill( "trigger", player );
if(Distance(pos, Player.origin) <= 200){
Player setLowerMessage("activate", "Hold ^3[{+activate}]^7 to use Elevator [^550^7]" );}
if(Distance(pos, Player.origin) >220){
Player ClearLowerMessage("activate", 1);}
if(Distance(pos, Player.origin) <= 230 && player.bounty >= 50 && player useButtonPressed())
{
player ClearLowerMessage("activate", 1);
player.bounty -= 50;
player notify("CASH");
player SetOrigin(exit);
player SetPlayerAngles(angle);
wait 1;
}
else if(Distance(pos, Player.origin) <= 75 && player.bounty <= 50 && player useButtonPressed())
{
player iPrintln("You do not have enough points!");
wait 1;
}
wait .25;
}
}
CreateWeapon(weapon, weaponName, weaponCost, location, angle)
{
weaponModel = getWeaponModel( weapon );
if( weaponModel == "" )
weaponModel = weapon;
if(!isDefined(angle))
angle = 0;
weaponSpawn = spawn( "script_model", location + (0, 0, 60) );
weaponSpawn setModel( weaponModel );
weaponSpawn.angles = angle;
weaponSpawn thread WeaponThink(weapon, weaponName, weaponCost, location);
wait 0.01;
}
WeaponThink(weapon, weaponName, weaponCost, location)
{
self endon("disconnect");
while(1)
{
foreach(player in level.players)
{
if(player.team != "axis")
{
if(distance(location, player.origin) < 25)
{
if(player hasWeapon( weapon ))
{
player.hint = "Press ^3[{+activate}] ^7to get ammo for " + weaponName + " - " + weaponCost;
} else {
player.hint = "Press ^3[{+activate}] ^7to buy " + weaponName + " - " + weaponCost;
}
if(player.buttonPressed["+activate"] == 1)
{
player.buttonPressed["+activate"] = 0;
if(player.bounty >= weaponCost)
{
player.bounty -= weaponCost;
player notify("CASH");
player _giveWeapon( weapon );
player switchToWeapon( weapon );
player giveMaxAmmo( weapon );
} else {
player iPrintlnBold( game["strings"]["NOT_ENOUGH_CASH"] );
}
}
}
}
}
wait .05;
}
}
CreateAsc(depart, arivee, angle, time)
{
Asc = spawn("script_model", depart );
Asc setModel("com_plasticcase_friendly");
Asc.angles = angle;
Asc Solid();
Asc CloneBrushmodelToScriptmodel( level.airDropCrateCollision );
Asc thread Escalator(depart, arivee, time);
}
Escalator(depart, arivee, time)
{
while(1)
{
if(self.state == "open"){
self MoveTo(depart, time);
wait (time*1.5);
self.state = "close";
continue;
}
if(self.state == "close"){
self MoveTo(arivee, time);
wait (time*1.5);
self.state = "open";
continue;
}
}
}
CrateHealth()
{
for(;
{
self setcandamage(true);
self.team = level.host.team;
self.owner = level.host.owner;
self.pers["team"] = level.host.team;
if(self.health < 0)
{
level.chopper_fx["smoke"]["trail"] = loadfx ("fire/fire_smoke_trail_L");
playfx(level.chopper_fx["smoke"]["trail"], self.origin);
self delete();
}
wait 0.1;
}
}
CreateSpecBlocks(pos, angle)
{
block = spawn("script_model", pos );
block setModel("com_plasticcase_enemy");
block.angles = angle;
block Solid();
block thread CrateHealth();
block.health = 500;
block CloneBrushmodelToScriptmodel( level.airDropCrateCollision );
wait 0.01;
}
CreateSpecDoors(open, close, angle, size, height, hp, range)
{
offset = (((size / 2) - 0.5) * -1);
center = spawn("script_model", open );
for(j = 0; j < size; j++){
door = spawn("script_model", open + ((0, 30, 0) * offset));
door setModel("com_plasticcase_enemy");
door Solid();
door CloneBrushmodelToScriptmodel( level.airDropCrateCollision );
door EnableLinkTo();
door thread CrateHealth();
door.health = 1138;
door LinkTo(center);
for(h = 1; h < height; h++){
door = spawn("script_model", open + ((0, 30, 0) * offset) - ((70, 0, 0) * h));
door setModel("com_plasticcase_enemy");
door Solid();
door CloneBrushmodelToScriptmodel( level.airDropCrateCollision );
door thread CrateHealth();
door.health = 1138;
door EnableLinkTo();
door LinkTo(center);
}
offset += 1;
}
center.angles = angle;
center.state = "open";
center.hp = hp;
center.range = range;
center thread CrateHealth();
center.health = 100;
center thread DoorThink(open, close);
center thread DoorUse();
center thread ResetDoors(open, hp);
wait 0.01;
}
drawTrampoline()
{
level.tramp = [];
trampNum = 0;
for(x=1;x<=18;x++) {
for(y=1;y<=19;y++) {
level.tramp[trampNum] = spawn("script_model", (0+(x*5
, 0+(y*2
,44.5));
level.tramp[trampNum] setModel("com_plasticcase_friendly");
trampNum++;
}
}
}
Lightning()
{
while(1)
{
playFX(level._effect[ "lightning" ], (-323,-834,2733));
wait 1;
}
}
CreateElevator(enter, exit, angle)
{
flag = spawn( "script_model", enter );
flag setModel( level.elevator_model["enter"] );
wait 0.01;
flag = spawn( "script_model", exit );
flag setModel( level.elevator_model["exit"] );
wait 0.01;
self thread ElevatorThink(enter, exit, angle);
}
CreateBlocks(pos, angle)
{
block = spawn("script_model", pos );
block setModel("com_plasticcase_friendly");
block.angles = angle;
block Solid();
block CloneBrushmodelToScriptmodel( level.airDropCrateCollision );
wait 0.01;
}
CreateDoors(open, close, angle, size, height, hp, range)
{
offset = (((size / 2) - 0.5) * -1);
center = spawn("script_model", open );
for(j = 0; j < size; j++){
door = spawn("script_model", open + ((0, 30, 0) * offset));
door setModel("com_plasticcase_enemy");
door Solid();
door CloneBrushmodelToScriptmodel( level.airDropCrateCollision );
door EnableLinkTo();
door LinkTo(center);
for(h = 1; h < height; h++){
door = spawn("script_model", open + ((0, 30, 0) * offset) - ((70, 0, 0) * h));
door setModel("com_plasticcase_enemy");
door Solid();
door CloneBrushmodelToScriptmodel( level.airDropCrateCollision );
door EnableLinkTo();
door LinkTo(center);
}
offset += 1;
}
center.angles = angle;
center.state = "open";
center.hp = hp;
center.range = range;
center thread DoorThink(open, close);
center thread DoorUse();
center thread ResetDoors(open, hp);
wait 0.01;
}
CreateRamps(top, bottom)
{
D = Distance(top, bottom);
blocks = roundUp(D/30);
CX = top[0] - bottom[0];
CY = top[1] - bottom[1];
CZ = top[2] - bottom[2];
XA = CX/blocks;
YA = CY/blocks;
ZA = CZ/blocks;
CXY = Distance((top[0], top[1], 0), (bottom[0], bottom[1], 0));
Temp = VectorToAngles(top - bottom);
BA = (Temp[2], Temp[1] + 90, Temp[0]);
for(b = 0; b < blocks; b++){
block = spawn("script_model", (bottom + ((XA, YA, ZA) * b)));
block setModel("com_plasticcase_friendly");
block.angles = BA;
block Solid();
block CloneBrushmodelToScriptmodel( level.airDropCrateCollision );
wait 0.01;
}
block = spawn("script_model", (bottom + ((XA, YA, ZA) * blocks) - (0, 0, 5)));
block setModel("com_plasticcase_friendly");
block.angles = (BA[0], BA[1], 0);
block Solid();
block CloneBrushmodelToScriptmodel( level.airDropCrateCollision );
wait 0.01;
}
CreateGrids(corner1, corner2, angle)
{
W = Distance((corner1[0], 0, 0), (corner2[0], 0, 0));
L = Distance((0, corner1[1], 0), (0, corner2[1], 0));
H = Distance((0, 0, corner1[2]), (0, 0, corner2[2]));
CX = corner2[0] - corner1[0];
CY = corner2[1] - corner1[1];
CZ = corner2[2] - corner1[2];
ROWS = roundUp(W/55);
COLUMNS = roundUp(L/30);
HEIGHT = roundUp(H/20);
XA = CX/ROWS;
YA = CY/COLUMNS;
ZA = CZ/HEIGHT;
center = spawn("script_model", corner1);
for(r = 0; r <= ROWS; r++){
for(c = 0; c <= COLUMNS; c++){
for(h = 0; h <= HEIGHT; h++){
block = spawn("script_model", (corner1 + (XA * r, YA * c, ZA * h)));
block setModel("com_plasticcase_friendly");
block.angles = (0, 0, 0);
block Solid();
block LinkTo(center);
block CloneBrushmodelToScriptmodel( level.airDropCrateCollision );
wait 0.01;
}
}
}
center.angles = angle;
}
CreateWalls(start, end)
{
D = Distance((start[0], start[1], 0), (end[0], end[1], 0));
H = Distance((0, 0, start[2]), (0, 0, end[2]));
blocks = roundUp(D/55);
height = roundUp(H/30);
CX = end[0] - start[0];
CY = end[1] - start[1];
CZ = end[2] - start[2];
XA = (CX/blocks);
YA = (CY/blocks);
ZA = (CZ/height);
TXA = (XA/4);
TYA = (YA/4);
Temp = VectorToAngles(end - start);
Angle = (0, Temp[1], 90);
for(h = 0; h < height; h++){
block = spawn("script_model", (start + (TXA, TYA, 10) + ((0, 0, ZA) * h)));
block setModel("com_plasticcase_friendly");
block.angles = Angle;
block Solid();
block CloneBrushmodelToScriptmodel( level.airDropCrateCollision );
wait 0.001;
for(i = 1; i < blocks; i++){
block = spawn("script_model", (start + ((XA, YA, 0) * i) + (0, 0, 10) + ((0, 0, ZA) * h)));
block setModel("com_plasticcase_friendly");
block.angles = Angle;
block Solid();
block CloneBrushmodelToScriptmodel( level.airDropCrateCollision );
wait 0.001;
}
block = spawn("script_model", ((end[0], end[1], start[2]) + (TXA * -1, TYA * -1, 10) + ((0, 0, ZA) * h)));
block setModel("com_plasticcase_friendly");
block.angles = Angle;
block Solid();
block CloneBrushmodelToScriptmodel( level.airDropCrateCollision );
wait 0.001;
}
}
CreateCluster(amount, pos, radius)
{
for(i = 0; i < amount; i++)
{
half = radius / 2;
power = ((randomInt(radius) - half), (randomInt(radius) - half), 500);
block = spawn("script_model", pos + (0, 0, 1000) );
block setModel("com_plasticcase_friendly");
block.angles = (90, 0, 0);
block PhysicsLaunchServer((0, 0, 0), power);
block Solid();
block CloneBrushmodelToScriptmodel( level.airDropCrateCollision );
block thread ResetCluster(pos, radius);
wait 0.05;
}
}
CreateElevatorCustom(enter, exit, angle)
{
self endon("GAME_HAS_ENDED");
level.flag1 = spawn( "script_model", enter );
level.flag1 setModel( level.elevator_model["enter"] );
wait 0.01;
level.flag2 = spawn( "script_model", exit );
level.flag2 setModel( level.elevator_model["exit"] );
wait 0.01;
self thread ElevatorThinkCustom(enter, exit, angle);
}
DeleteElevatorCustom()
{
level.flag1 delete();
level.flag2 delete();
}
ElevatorThinkCustom(enter, exit, angle)
{
self endon("disconnect");
self endon("GAME_HAS_ENDED");
while(1)
{
foreach(player in level.players)
{
if(Distance(enter, player.origin) <= 50)
{
//self notify("ENTER_FLAG");
player SetOrigin(exit);
player SetPlayerAngles(angle);
self thread maps\mp\gametypes\_rank::doZombieFlare();
}
}
wait .25;
}
}
ElevatorThink(enter, exit, angle)
{
self endon("disconnect");
while(1)
{
foreach(player in level.players)
{
if(Distance(enter, player.origin) <= 50)
{
//self notify("ENTER_FLAG");
player SetOrigin(exit);
player SetPlayerAngles(angle);
self thread maps\mp\gametypes\_rank::doZombieFlare();
}
}
wait .25;
}
}
DoorThink(open, close)
{
while(1)
{
if(self.hp > 0){
self waittill ( "triggeruse" , player );
if(player.team == "allies"){
if(self.state == "open"){
self MoveTo(close, level.doorwait);
wait level.doorwait;
self.state = "close";
continue;
}
if(self.state == "close"){
self MoveTo(open, level.doorwait);
wait level.doorwait;
self.state = "open";
continue;
}
}
if(player.team == "axis"){
if(self.state == "close"){
self.hp--;
player iPrintlnBold("HIT");
wait 1;
continue;
}
}
} else {
if(self.state == "close"){
self MoveTo(open, level.doorwait);
}
self.state = "broken";
wait .5;
}
}
}
DoorUse(range)
{
self endon("disconnect");
while(1)
{
foreach(player in level.players)
{
if(Distance(self.origin, player.origin) <= self.range){
if(player.team == "allies"){
if(self.state == "open"){
player.hint = "Press ^3[{+activate}] ^7to ^2Close ^7the door";
}
if(self.state == "close"){
player.hint = "Press ^3[{+activate}] ^7to ^2Open ^7the door";
}
if(self.state == "broken"){
player.hint = "^1Door is Broken";
}
}
if(player.team == "axis"){
if(self.state == "close"){
player.hint = "Press ^3[{+activate}] ^7to ^2Attack ^7the door";
}
if(self.state == "broken"){
player.hint = "^1Door is Broken";
}
}
if(player.buttonPressed[ "+activate" ] == 1){
player.buttonPressed[ "+activate" ] = 0;
self notify( "triggeruse" , player);
}
}
}
wait .045;
}
}
ResetDoors(open, hp)
{
while(1)
{
level waittill("RESETDOORS");
self.hp = hp;
self MoveTo(open, level.doorwait);
self.state = "open";
}
}
ResetCluster(pos, radius)
{
wait 5;
self RotateTo(((randomInt(36)*10), (randomInt(36)*10), (randomInt(36)*10)), 1);
level waittill("RESETCLUSTER");
self thread CreateCluster(1, pos, radius);
self delete();
}
roundUp( floatVal )
{
if ( int( floatVal ) != floatVal )
return int( floatVal+1 );
else
return int( floatVal );
}
Afghan()
{
CreateDoors((1611,-252,136),(1611,-158,136),(90,0,0),3,2,50,100);
CreateDoors((2780,882,200),(2780,796,200),(90,0,0),3,2,25,100);
CreateWalls((3150,289,106),(2989,301,205));
CreateBlocks((3154,318,149),(90,0,0));
AutoTurret((3374,322,144),(0,-96,0));
mgTurret1 = spawnTurret( "misc_turret", (2658,847,251), "pavelow_minigun_mp" );
mgTurret1 setModel( "weapon_minigun" );
mgTurret1.angles = (0, 171, 0);
mgTurret2 = spawnTurret( "misc_turret", (1659,-49,182), "pavelow_minigun_mp" );
mgTurret2 setModel( "weapon_minigun" );
mgTurret2.angles = (0, 180, 0);
mgTurret3 = spawnTurret( "misc_turret", (1852,128,180), "pavelow_minigun_mp" );
mgTurret3 setModel( "weapon_minigun" );
mgTurret3.angles = (0, 86, 0);
mgTurret4 = spawnTurret( "misc_turret", (2652,146,227), "pavelow_minigun_mp" );
mgTurret4 setModel( "weapon_minigun" );
mgTurret4.angles = (0, -10, 0);
ReviveBox((3463,-215,187),(0,0,0));
Juggernaut((1220,1575,459),(0,90,0));
PaPBox((-167,2586,-55),(0,0,0));
CreateDoors((3479,241,11
,(3560,241,11
,(90,0,90),6,2,25,100);
CreateBlocks((2295,-55,140),(0,90,0));
CreateBlocks((2295,-137,140),(0,90,0));
CreateBlocks((2295,-99,140),(0,90,0));
AmmOMatic((1748,-282,136),(0,0,0));
}
Derail()
{
CreateDoors((381,1434,106),(381,1359,106),(90,0,0),7,2,25,125);
CreateDoors((-145,436,106),(-75,436,106),(90,0,90),8,2,25,125);
CreateSpecDoors((-87,775,106),(-150,775,106),(90,0,90),4,2,25,125); //knife door
CreateRamps((-132,2572,115),(-132,2294,320));
CreateRamps((-132,2232,320),(-132,2006,450));
CreateRamps((-132,1772,435),(-132,1576,550));
ReviveBox((-184,-3388,90),(0,90,0));
PaPBox((133,1220,29
,(0,90,0));
Juggernaut((778,1006,134),(0,-20,0));
mgTurret1 = spawnTurret( "misc_turret", (-25,1044,249), "pavelow_minigun_mp" );
mgTurret1 setModel( "weapon_minigun" );
mgTurret1.angles = (0, -115, 0);
mgTurret2 = spawnTurret( "misc_turret", (208,399,350), "pavelow_minigun_mp" );
mgTurret2 setModel( "weapon_minigun" );
mgTurret2.angles = (0, -90, 0);
mgTurret3 = spawnTurret( "misc_turret", (295,399,350), "pavelow_minigun_mp" );
mgTurret3 setModel( "weapon_minigun" );
mgTurret3.angles = (0, -90, 0);
mgTurret4 = spawnTurret( "misc_turret", (-24,399,350), "pavelow_minigun_mp" );
mgTurret4 setModel( "weapon_minigun" );
mgTurret4.angles = (0, -90, 0);
mgTurret5 = spawnTurret( "misc_turret", (-110,399,350), "pavelow_minigun_mp" );
mgTurret5 setModel( "weapon_minigun" );
mgTurret5.angles = (0, -90, 0);
mgTurret6 = spawnTurret( "misc_turret", (407,1101,357), "pavelow_minigun_mp" );
mgTurret6 setModel( "weapon_minigun" );
mgTurret6.angles = (0, -4, 0);
mgTurret7 = spawnTurret( "misc_turret", (398,1474,357), "pavelow_minigun_mp" );
mgTurret7 setModel( "weapon_minigun" );
mgTurret7.angles = (0, -4, 0);
mgTurret8 = spawnTurret( "misc_turret", (299,1553,357), "pavelow_minigun_mp" );
mgTurret8 setModel( "weapon_minigun" );
mgTurret8.angles = (0, 90, 0);
playFX(level._effect[ "snow_clouds" ], (629,1681,323));
angles = (90, 90, 0);
playFX(level._effect[ "snow_clouds" ], (716,596,323));
angles = (90, 90, 0);
playFX(level._effect[ "snow_clouds" ], (343,-6,360));
angles = (90, 90, 0);
playFX(level._effect[ "snow_clouds" ], (-417,1113,269));
angles = (90, 90, 0);
playFX(level._effect[ "snow_clouds" ], (36,1736,29
);
angles = (90, 90, 0);
playFX(level._effect[ "snow_clouds" ], (704,1557,312));
angles = (90, 90, 0);
AmmOMatic((101,446,594),(0,0,0));
}
Estate()
{
CreateElevator((-691,2277,-115),(-2813,5824,-281),(0,0,0));
CreateWalls((-3977,6107,-227),(-3977,5756,-185));
CreateWalls((-4328,6107,-227),(-3977,6107,-185));
CreateWalls((-4328,6107,-227),(-4328,5756,-185));
CreateWalls((-3977,5756,-227),(-4328,5756,-185));
CreateWalls((-4006,6077,-185),(-4006,5785,-143));
CreateWalls((-4006,6077,-185),(-4297,6077,-143));
CreateWalls((-4297,5785,-185),(-4006,5785,-143));
CreateWalls((-4297,5785,-185),(-4297,6077,-143));
CreateWalls((-4035,6046,-143),(-4035,5815,-101));
CreateWalls((-4267,5815,-143),(-4035,5815,-101));
CreateWalls((-4035,6046,-143),(-4267,6046,-101));
CreateWalls((-4267,5815,-143),(-4267,6046,-101));
CreateWalls((-4064,6015,-101),(-4064,5837,-59));
CreateWalls((-4064,6015,-101),(-4237,6015,-59));
CreateWalls((-4237,5837,-101),(-4064,5837,-59));
CreateWalls((-4237,6015,-101),(-4237,5837,-59));
CreateGrids((-4096,5988,-59),(-4207,5850,-59),(0,0,0));
CreateBlocks((-3946,5917,-215),(0,90,0));
CreateBlocks((-3980,5917,-183),(0,90,0));
CreateBlocks((-4016,5917,-137),(0,90,0));
CreateBlocks((-4048,5917,-95),(0,90,0));
CreateWalls((-4103,5972,-44),(-4205,5972,44));
CreateWalls((-4205,5853,-44),(-4205,5972,44));
CreateWalls((-4205,5853,-44),(-4103,5853,44));
CreateGrids((-4103,5972,44),(-4205,5853,44),(0,0,0));
CreateDoors((-4083,5972,-44),(-4083,5932,-44),(90,0,0),3,2,20,100);
CreateElevator((-4175,5914,-44),(-4175,5914,5
,(0,163.5,0));
CreateWalls((-4460,6783,-177),(-4460,6432,-135));
CreateWalls((-4460,6783,-177),(-4811,6783,-135));
CreateWalls((-4811,6432,-177),(-4460,6432,-135));
CreateWalls((-4811,6432,-177),(-4811,6783,-135));
CreateWalls((-4489,6752,-129),(-4489,6462,-93));
CreateWalls((-4489,6752,-129),(-4781,6752,-93));
CreateWalls((-4781,6462,-129),(-4489,6462,-93));
CreateWalls((-4781,6462,-129),(-4781,6752,-93));
CreateWalls((-4518,6721,-90),(-4518,6492,-4
);
CreateWalls((-4751,6492,-90),(-4518,6492,-4
);
CreateWalls((-4518,6721,-90),(-4751,6721,-4
);
CreateWalls((-4751,6492,-90),(-4751,6721,-4
);
CreateWalls((-4547,6690,-51),(-4547,6522,-5));
CreateWalls((-4547,6690,-51),(-4721,6690,-5));
CreateWalls((-4721,6522,-51),(-4547,6522,-5));
CreateWalls((-4721,6522,-51),(-4721,6690,-5));
CreateGrids((-4567,6666,-5),(-4703,6540,-5),(0,0,0));
CreateBlocks((-4428,6612,-180),(0,90,0));
CreateBlocks((-4470,6612,-130),(0,90,0));
CreateBlocks((-4500,6612,-80),(0,90,0));
CreateBlocks((-4530,6612,-44),(0,90,0));
CreateWalls((-4719,6661,0),(-4581,6661,119));
CreateWalls((-4719,6661,0),(-4719,6539,119));
CreateWalls((-4581,6539,0),(-4719,6539,119));
CreateDoors((-4581,6661,0),(-4581,6604,0),(90,0,0),3,2,20,100);
CreateGrids((-4581,6661,119),(-4719,6539,119),(0,0,0));
CreateElevator((-4700,6602,9),(-4700,6602,133),(0,0,0));
CreateRamps((-4220,5973,44),(-4611,6532,121));
CreateElevator((-5432,6153,-186),(-2821,3360,-139),(0,0,0));
AmmOMatic((-4083,6378,-189),(0,90,0));
}
Favela()
{
CreateDoors((-533,1282,28
,(-533,1352,28
,(90,0,0),3,2,25,100);
CreateDoors((-262,385,
,(-262,295,
,(90,0,0),3,2,25,100);
CreateDoors((101,428,176),(151,428,176),(90,90,0),2,2,25,100);
CreateDoors((727,1194,34
,(727,1103,34
,(90,0,0),3,2,25,100);
CreateBlocks((-16,423,273),(0,0,0));
CreateBlocks((-557,1290,340),(0,0,0));
CreateBlocks((-557,1256,340),(0,0,0));
CreateBlocks((-557,1208,340),(0,0,0));
Asculator((-651,907,292),(37,266,444),(0,0,0));
PaPBox((24,443,44
,(0,0,0));
ReviveBox((500,450,320),(0, 0, 0));
Juggernaut((132,361,44
,(0,90,0));
CreateBlocks((798,738,320),(0,90,0));
CreateBlocks((798,794,320),(0,90,0));
CreateBlocks((798,676,320),(0,90,0));
CreateBlocks((-589,115,211),(0,90,0));
CreateBlocks((-588,404,26
,(0,90,0));
CreateBlocks((-188,724,240),(0,90,0));
CreateBlocks((-140,724,240),(0,90,0));
Asculator((426,1276,44
,(9487,18430,13617),(0,0,0));
CreateElevator((10444,18405,13627),(-1228,-410,5),(0,0,0));
AmmOMatic((10019,18467,13635),(0,0,0));
SpeedCola((-598,1085,28
,(0,0,0));
NapalmBox((-256,1398,28
,(0,0,0));
AutoTurret((48,-417,295),(0,89,0));
CreateAsc((432,1110,300),(432,1110,445),0,3);
}
HighRise()
{
AmmOMatic((2208,10800,3360), (0, 90, 0));
ReviveBox((-1372,5311,2940), (0, 0, 0));
OrangeSoda((-297,5744,2912), (0, 0, 0));
SpeedCola((-1366,5191,2776), (0, 0, 0));
PaPBox((-4055,2578,4400),(0,90,0));
Juggernaut((-2344,6075,2776), (0,90,0));
Asculator((-1282,7398,2776),(-4073,1932,4400),(0,0,0));
Asculator((-1541,7407,2776),(1544,10772,3360),(0,0,0));
CreateRamps((-2191,6056,2912),(-2627,6056,3232),0,3);
CreateElevator((-3979,3338,4400),(-1193,6894,2770),(0,0,0));
CreateBlocks((1225, 7250, 2840), (0, 0, 0));
CreateBlocks((1175, 7250, 2840), (0, 0, 0));
CreateBlocks((1115, 7455, 2840), (0, 90, 0));
CreateBlocks((1115, 7505, 2840), (0, 90, 0));
CreateBlocks((1115,6691,2840),(0,90,0));
CreateBlocks((1115,6644,2840),(0,90,0));
mgTurret1 = spawnTurret( "misc_turret", (-368,5606,2951), "pavelow_minigun_mp" );
mgTurret1 setModel( "weapon_minigun" );
mgTurret1.angles = (0, -174, 0);
mgTurret2 = spawnTurret( "misc_turret", (-2644,6288,3280), "pavelow_minigun_mp" );
mgTurret2 setModel( "weapon_minigun" );
mgTurret2.angles = (0, 0, 0);
mgTurret3 = spawnTurret( "misc_turret", (1193,6675,287
, "pavelow_minigun_mp" );
mgTurret3 setModel( "weapon_minigun" );
mgTurret3.angles = (0, -174, 0);
mgTurret4 = spawnTurret( "misc_turret", (1195,7484,287
, "pavelow_minigun_mp" );
mgTurret4 setModel( "weapon_minigun" );
mgTurret4.angles = (0, -176, 0);
CreateAsc((2208,11546,3360),(2208,11546,4089),0,5);
CreateAsc((2208,10076,3360),(2208,10076,4089),0,5);
}
Invasion()
{
AmmOMatic((-1339,-1700,270),(0,0,0));
PaPBox((-2899,-2608,264),(0,0,0));
CreateSpecDoors((-1674,-1233,270),(-1674,-1293,270),(90,0,0),4,2,25,125);
CreateSpecDoors((-1373,-2140,270),(-1298,-2140,270),(90,0,90),4,2,25,125);
CreateWalls((-1132,-1640,27
,(-1147,-1560,341));
CreateRamps((-1455,-1944,331),(-1414,-1852,357));
OrangeSoda((833,-3488,240), (0, 0, 0));
SpeedCola((-2839,-2303,416), (0, 0, 0));
CreateWalls((-1150,-2482,274),(-1062,-2482,341));
CreateDoors((-1318,-2684,266),(-1316,-2785,266),(90,0,0),7,2,40,125);
CreateBlocks((-3061,-1955,375),(0,90,0));
CreateBlocks((-3028,-1892,424),(0,0,0));
}
Karachi()
{
CreateRamps((562,120,145),(562,-46,27
);
CreateRamps((547,-36,392),(547,-251,561));
CreateBlocks((515,26,544),(90,0,0));
CreateBlocks((617,31,544),(90,0,0));
CreateBlocks((519,519,447),(0,0,0));
CreateWalls((896,458,444),(893,533,424));
CreateWalls((962,360,416),(964,258,471));
CreateBlocks((-113,-131,340),(90,0,0));
CreateBlocks((739,612,44
,(0,0,0));
CreateBlocks((660,611,44
,(0,0,0));
CreateWalls((833,-205,556),(901,-294,619));
CreateBlocks((890,-66,545),(0,0,0));
CreateBlocks((936,-90,547),(0,0,0));
CreateBlocks((865,-66,555),(90,0,0));
CreateRamps((478,-705,560),(274,-705,600));
CreateWalls((-120,-818,59
,(-120,-579,783));
CreateWalls((-120,-818,59
,(114,-818,783));
CreateWalls((114,-579,59
,(-120,-579,783));
CreateDoors((87,-579,600),(87,-683,600),(90,0,0),7,2,85,125);
CreateRamps((-87,-765,59
,(-87,-597,703));
CreateGrids((-40,-579,703),(47,-818,703),(0,0,0));
CreateBlocks((-41,-786,717),(0,0,0));
CreateBlocks((-25,-609,600),(0,0,0));
CreateBlocks((877,-100,557),(90,0,0));
CreateBlocks((898,-132,565),(90,0,0));
CreateGrids((-509,-378,445),(-650,-261,445),(0,0,0));
CreateBlocks((782,182,272),(0,0,0));
CreateBlocks((783,244,263),(0,0,0));
CreateBlocks((808,243,263),(0,0,0));
CreateBlocks((783,377,263),(0,90,0));
CreateBlocks((494,-827,362),(0,0,0));
CreateBlocks((484,-826,384),(0,0,0));
CreateRamps((-15,-740,717),(-221,-740,847));
CreateGrids((-231,-624,847),(-303,-845,847),(0,0,0));
CreateBlocks((-127,172,360),(90,0,0));
CreateBlocks((60,0,352),(90,0,0));
CreateBlocks((-216,-856,891),(90,0,0));
CreateBlocks((-246,-856,891),(90,0,0));
CreateBlocks((-283,-856,891),(90,0,0));
CreateBlocks((-201,-824,891),(90,0,0));
CreateBlocks((871,-114,600),(0,0,0));
CreateBlocks((853,-99,600),(0,0,0));
CreateBlocks((858,-156,600),(0,0,0));
thread killTrigger( (850,-130,596), 80, 8 );
thread killTrigger( (62,4,382), 100, 8 );
thread killTrigger( (483,216,429), 100, 8 );
thread killTrigger( (286,-198,360), 90, 8 );
thread killTrigger( (338,9,302), 90, 8 );
thread killTrigger( (944,-1313,255), 100, 8 );
thread killTrigger( (810,-1390,382), 180, 8 );
CreateBlocks((511,451,459),(0,0,0));
AmmOMatic((1640,-49,416),(0,90,0));
}
Quarry()
{
CreateDoors((-3252,1495,0),(-3319,1494,0),(90,0,90),2,2,40,125);
CreateDoors((-3752,1684,0),(-3745,1762,0),(90,0,0),2,2,40,125);
CreateDoors((-3683,1960,0),(-3564,1956,0),(90,0,90),6,2,40,125);
CreateBlocks((-2775,1706,0),(0,90,0));
CreateBlocks((-2882,1953,0),(0,0,0));
mgTurret1 = spawnTurret( "misc_turret", (-2790,1725,172), "pavelow_minigun_mp" );
mgTurret1 setModel( "weapon_minigun" );
mgTurret1.angles = (0, -3, 0);
mgTurret2 = spawnTurret( "misc_turret", (-3750,1719,316), "pavelow_minigun_mp" );
mgTurret2 setModel( "weapon_minigun" );
mgTurret2.angles = (0, -176, 0);
mgTurret3 = spawnTurret( "misc_turret", (-3182,1700,259), "pavelow_minigun_mp" );
mgTurret3 setModel( "weapon_minigun" );
mgTurret3.angles = (0, 169, 0);
playFX(level._effect[ "light_shaft_motes_quarry" ], (-3322,2199,56));
angles = (90, 90, 0);
playFX(level._effect[ "light_shaft_motes_quarry" ], (-3925,1830,0.5));
angles = (90, 90, 0);
Asculator((-2961,1960,0),(-3268,-251,36),(0,0,0));
CreateElevator((-3206,-244,245),(-2841,1507,0),(0,0,0));
PaPBox((-3374,77,85),(0,0,0));
Juggernaut((-3631,-81,87), (0,90,0));
AmmOMatic((-3589,-285,55), (0, 180, 0));
}
Rundown()
{
CreateElevator((1805,-2181,204),(1778,-73,-123),(0,0,0));
CreateElevator((-760,-631,16),(2724,286,-127),(0,0,0));
CreateElevator((399,-80,16),(3089,-475,-127),(0,0,0));
CreateElevator((1413,-94,16),(4716,283,-127),(0,0,0));
CreateRamps((3109,-179,-120),(3339,-179,-60));
CreateRamps((3339,-179,-60),(3339,9,0));
CreateRamps((3339,9,0),(3109,9,60));
CreateRamps((3109,9,60),(3109,-179,120));
CreateRamps((3109,-179,120),(3339,-179,180));
CreateRamps((3339,-179,180),(3339,9,240));
CreateRamps((3339,9,240),(3109,9,300));
CreateRamps((3109,9,300),(3109,-179,360));
CreateRamps((3109,-179,360),(3339,-179,420));
CreateRamps((3339,-179,420),(3339,9,480));
CreateRamps((3339,9,480),(3109,9,540));
CreateRamps((3109,9,540),(3109,-179,600));
CreateRamps((3109,-179,600),(3339,-179,660));
CreateRamps((3339,-179,660),(3339,9,720));
CreateRamps((3339,9,720),(3109,9,780));
CreateRamps((3109,9,780),(3109,-179,840));
CreateRamps((3109,-179,840),(3339,-179,900));
CreateRamps((3339,-179,900),(3339,9,960));
CreateRamps((3339,9,960),(3109,9,1020));
CreateRamps((3109,9,1020),(3109,-179,1080));
CreateRamps((3109,-179,1080),(3339,-179,1140));
CreateRamps((3339,-179,1140),(3339,9,1200));
CreateRamps((3339,9,1200),(3109,9,1260));
CreateGrids((3109,180,1260),(2939,-206,1260),(0,0,0));
playFX(level._effect[ "fog_ground_200_heavy_rundown" ], (3313,-120,72));
angles = (90, 90, 0);
playFX(level._effect[ "fog_ground_200_heavy_rundown" ], (2907,-130,54));
angles = (90, 90, 0);
playFX(level._effect[ "fog_ground_200_heavy_rundown" ], (3230,116,1236));
angles = (90, 90, 0);
playFX(level._effect[ "fog_ground_200_heavy_rundown" ], (2977,-53,1331));
angles = (90, 90, 0);
playFX(level._effect[ "fog_ground_200_heavy_rundown" ], (2960,-283,1269));
angles = (90, 90, 0);
playFX(level._effect[ "fog_ground_200_heavy_rundown" ], (3188,-47,297));
angles = (90, 90, 0);
playFX(level._effect[ "fog_ground_200_heavy_rundown" ], (3125,-96,589));
angles = (90, 90, 0);
playFX(level._effect[ "fog_ground_200_heavy_rundown" ], (3263,-102,891));
angles = (90, 90, 0);
AmmOMatic((3009,-199,1274),(0,0,0));
}
Rust()
{
CreateGrids((-3415,1583,952),(-3905,1110,952),(0,0,0));
CreateWalls((-3525,1190,966),(-3851,1190,98
);
CreateWalls((-3851,1519,966),(-3851,1190,98
);
CreateWalls((-3851,1519,966),(-3525,1519,98
);
CreateWalls((-3525,1190,966),(-3525,1519,98
);
CreateRamps((-3820,1292,950),(-3820,1475,1116));
CreateGrids((-3770,1477,1124),(-3555,1219,1124),(0,0,0));
CreateBlocks((-3818,1497,1123),(0,0,0));
CreateWalls((-3525,1190,1037),(-3851,1190,1174));
CreateWalls((-3851,1519,1037),(-3851,1190,1174));
CreateWalls((-3851,1519,1037),(-3525,1519,1174));
CreateWalls((-3525,1190,1037),(-3525,1519,1174));
CreateRamps((-3555,1489,1125),(-3555,1219,127
);
CreateGrids((-3605,1219,127
,(-3820,1489,127
,(0,0,0));
CreateWalls((-3525,1190,1222),(-3851,1190,1330));
CreateWalls((-3851,1519,1222),(-3851,1190,1330));
CreateWalls((-3851,1519,1222),(-3525,1519,1330));
CreateWalls((-3525,1190,1222),(-3525,1519,1330));
CreateGrids((-2754,1373,587),(-2945,1595,587),(0,0,0));
CreateGrids((-3614,1851,856),(-3725,1947,856),(0,0,0));
CreateAsc((-2990,1587,585),(-3576,1849,856),0,2);
CreateAsc((-3769,1944,847),(-4245,1450,1136),0,3);
CreateAsc((-2821,1345,584),(-3380,804,883),0,4);
CreateAsc((-3560,826,877),(-4291,1239,112
,0,3);
CreateAsc((-3683,1817,851),(-3631,1607,953),0,2);
CreateAsc((-4215,1302,1121),(-3810,1357,1366),0,3);
CreateAsc((-3693,1972,84
,(-3713,1481,1389),0,3);
CreateAsc((-3467,850,872),(-3600,1219,1375),0,2);
CreateAsc((-3468,1231,970),(-3468,1231,1510),0,4);
CreateAsc((-2977,1437,57
,(-3377,1360,959),0,3);
CreateGrids((-4246,1427,1130),(-4470,1260,1130),(0,0,0));
CreateGrids((-3419,827,884),(-3520,721,884),(0,0,0));
CreateElevator((683,1046,266),(-2794,1486,601),(0,0,0));
CreateElevator((-422,1807,-49),(-3461,743,89
,(0,0,0));
CreateElevator((1759,1658,-127),(-4357,1347,1144),(0,0,0));
CreateElevator((1309,1303,-105),(-3620,1910,870),(0,0,0));
AmmOMatic((-3681,1489,966),(0,-180,0));
}
Scrapyard()
{
CreateWalls((4559, -79, 225), (4556, 149, 235));
CreateDoors((4650, 109, 116), (4650, -0, 116), (90, 0, 0), 3, 2, 20, 75);
CreateGrids((4578, 148, 210), (4650, -70, 210), (0, 0, 0));
CreateRamps((4898, 214, 116), (4898, 416, 185));
CreateWalls((4650, 149, 116), (4650, 72, 200));
CreateWalls((4581, 145, 116), (4650, 149, 200));
CreateRamps((4213, 23, -51), (4572, 23, 9
);
CreateWalls((4570, -62, 116), (5036, -62, 200));
CreateWalls((5036, -62, 116), (5036, 419, 200));
CreateWalls((5036, 419, 116), (4570, 413, 200));
CreateWalls((4570, 413, 116), (4581, 145, 200));
CreateGrids((4595, -54, 101), (5016, 406, 101), (0, 0, 0));
CreateElevator((1218, 554, 4), (2268, 166, 30));
CreateGrids((5032.47, 139.815, 199.125), (4894.41, -57.7811, 199.125), (0, 0, 0));
mgTurret1 = spawnTurret( "misc_turret", (4895.77, 22.5411, 241.89), "pavelow_minigun_mp" );
mgTurret1 setModel( "weapon_minigun" );
mgTurret1.angles = (0, 178.149, 0);
CreateRamps((4670.45, 150.823, 204.93
, (4952.43, 164.396, 394.32));
CreateGrids((4972.42, 258.79, 400), (5071.16, 42.8351, 400), (0, 0, 0));
CreateRamps((4203.91, 69.9171, -51), (4587.12, 61.4335, 9
);
CreateRamps((4879.31, 321.061, 143.252), (4786.84, 313.592, 166.435));
CreateGrids((4775.51, 263.727, 166.992), (4720.81, 359.188, 166.992), (0, 0, 0));
mgTurret2 = spawnTurret( "misc_turret", (4750.08, 309.55, 225.037), "pavelow_minigun_mp" );
mgTurret2 setModel( "weapon_minigun" );
mgTurret2.angles = (0, -64.6436, 0);
playFX(level._effect[ "firelp_large_pm_nolight" ], (4596,106,116));
angles = (90, 90, 0);
playFX(level._effect[ "firelp_large_pm_nolight" ], (4551,394,156));
angles = (90, 90, 0);
playFX(level._effect[ "firelp_med_pm_nolight" ], (4840,44,116));
angles = (90, 90, 0);
playFX(level._effect[ "tanker_embers" ], (5053,59,415));
angles = (90, 90, 0);
playFX(level._effect[ "firelp_med_pm_nolight" ], (4612,-55,225));
angles = (90, 90, 0);
playFX(level._effect[ "firelp_small_pm_a_nolight" ], (4855,302,165));
angles = (90, 90, 0);
playFX(level._effect[ "firelp_small_pm_a_nolight" ], (4922,344,177));
angles = (90, 90, 0);
playFX(level._effect[ "firelp_med_pm_nolight" ], (5005,237,116));
angles = (90, 90, 0);
playFX(level._effect[ "firelp_large_pm_nolight" ], (5010,-24,214));
angles = (90, 90, 0);
playFX(level._effect[ "firelp_small_pm_a_nolight" ], (4782,156,301));
angles = (90, 90, 0);
CreateElevator((2573,2461,62),(1903,1450,-90),(0,0,0));
AmmOMatic((3774,-28,-70),(0,90,0));
}
Skidrow()
{
CreateDoors((1059,-808,0),(1321,-808,0),(90,0,90),9,2,30,100);
CreateDoors((992,-250,0),(992,-105,0),(90,0,0),10,2,30,100);
CreateWalls((992,374,0),(992,62,97));
CreateBlocks((941,236,95),(0,0,0));
CreateRamps((1807,-217,100),(1470,-217,190));
CreateRamps((1976,-462,50),(1976,-549,95));
CreateAsc((1817,99,105),(1817,99,20
,1,3);
CreateDoors((883,-1799,32),(990,-1799,32),(90,0,90),7,2,30,100);
CreateDoors((727,-1904,32),(727,-1951,32),(90,0,0),2,2,30,100);
CreateBlocks((837,-2176,176),(0,90,0));
CreateBlocks((837,-2129,176),(0,90,0));
mgTurret1 = spawnTurret( "misc_turret", (740,-1858,205), "pavelow_minigun_mp" );
mgTurret1 setModel( "weapon_minigun" );
mgTurret1.angles = (0, 179, 0);
mgTurret2 = spawnTurret( "misc_turret", (-2009,-361,183), "pavelow_minigun_mp" );
mgTurret2 setModel( "weapon_minigun" );
mgTurret2.angles = (0, -13, 0);
CreateDoors((-2167,278,16),(-2167,215,16),(90,0,0),3,2,30,120);
CreateDoors((-2271,-912,12
,(-2209,-912,12
,(90,0,90),3,2,30,120);
ReviveBox((1659,-767,10
,(0,90,0));
playFX(level._effect[ "dust_wind_fast_light" ], (1908,-700,194));
angles = (0, 0, 0);
playFX(level._effect[ "dust_wind_fast_light" ], (1798,-95,30
);
angles = (0, 0, 0);
playFX(level._effect[ "dust_wind_fast_light" ], (1251,-355,221));
angles = (0, 0, 0);
AmmOMatic((1128,-2052,176),(0,90,0));
}
SubBase()
{
CreateBlocks((-1506, 800, 123), (0, 0, 45));
CreateDoors((1100, -1138, 294), (1100, -1078, 294), (90, 0, 0), 2, 2, 5, 50);
CreateDoors((-839, -1249, 27
, (-839, -1319, 27
, (90, 0, 0), 2, 2, 5, 50);
CreateDoors((-1428, -1182, 27
, (-1498, -1182, 27
, (90, 90, 0), 2, 2, 5, 50);
CreateDoors((-435, -50, 111), (-380, -50, 111), (90, 90, 0), 2, 2, 5, 50);
CreateDoors((-643, -50, 111), (-708, -50, 111), (90, 90, 0), 2, 2, 5, 50);
CreateDoors((1178, -438, 102), (1248, -438, 102), (90, 90, 0), 2, 2, 5, 50);
CreateDoors((1112, -90, 246), (1112, -160, 246), (90, 0, 0), 2, 2, 5, 50);
ReviveBox((-689,-2404,62),(0,90,0));
PaPBox((-1046,-1364,0),(0,0,0));
CreateDoors((-942,-1162,256),(-901,-1162,256),(90,0,90),2,2,25,100);
CreateBlocks((-768,-899,246),(0,0,0));
mgTurret1 = spawnTurret( "misc_turret", (-1183,-1181,319), "pavelow_minigun_mp" );
mgTurret1 setModel( "weapon_minigun" );
mgTurret1.angles = (0, -103, 0);
mgTurret2 = spawnTurret( "misc_turret", (-1043,-915,301), "pavelow_minigun_mp" );
mgTurret2 setModel( "weapon_minigun" );
mgTurret2.angles = (0, 92, 0);
mgTurret3 = spawnTurret( "misc_turret", (-1308,-915,301), "pavelow_minigun_mp" );
mgTurret3 setModel( "weapon_minigun" );
mgTurret3.angles = (0, 92, 0);
CreateRamps((214,-916,250),(214,-8,315));
AmmOMatic((-539,-220,89),(0,0,0));
SpeedCola((724,177,317),(0,90,0));
}
Terminal()
{
CreateElevator((1219,3825,40.125),(567,-707,40.125));
AutoTurret((596,1155,30
,(0,-91,0));
CreateRamps((1375,1624,256),(1597,1624,39
);
CreateRamps((2071,1492,255),(1825,1535,362));
ReviveBox((1693,2342,449),(0,0,0));
CreateRamps((-1753,3680,40),(-2013,3860,204));
CreateElevator((-896,4409,44),(2779,2932,76),(0,0,0));
Sentry = spawnTurret( "misc_turret", (2976,1009,31
, "sentry_minigun_mp" );
Sentry setModel( "sentry_minigun" );
Sentry.angles = (0,156,0);
Sentry2 = spawnTurret( "misc_turret", (-2061,3904,210), "sentry_minigun_mp" );
Sentry2 setModel( "sentry_minigun" );
Sentry2.angles = (0,-50,0);
playFX(level._effect[ "light_shaft_motes_airport" ], (554,260,119));
angles = (90, 90, 0);
playFX(level._effect[ "light_shaft_motes_airport" ], (949,286,132));
angles = (90, 90, 0);
playFX(level._effect[ "light_shaft_motes_airport" ], (184,235,377));
angles = (90, 90, 0);
playFX(level._effect[ "ground_smoke_1200x1200" ], (473,-155,655));
angles = (90, 90, 0);
thread killTrigger( (1696,156,77
, 30, 8 );
AmmOMatic((-2184,4109,199),(0,90,0));
}
Underpass()
{
CreateDoors((-339,3105,264),(-339,3162,264),(90,0,0),4,2,30,100);
CreateDoors((-427,2951,392),(-480,2951,392),(90,0,90),3,2,30,100);
CreateBlocks((679,1747,493),(0,0,0));
CreateBlocks((729,1747,493),(0,0,0));
CreateBlocks((769,1747,493),(0,0,0));
CreateDoors((1254,-696,512),(1342,-696,512),(90,0,90),4,2,30,100);
CreateDoors((391,-78,320),(391,-128,320),(90,0,0),4,2,30,100);
NinjaBox((1493,-690,546),(0,0,0));
Juggernaut((-451,3224,392),(0,0,0));
ReviveBox((-5,1870,520),(0,90,0));
CreateRamps((2845,1191,345),(2604,1191,456));
PaPBox((2510,851,44
,(0,0,0));
CreateRamps((-405,1215,351),(-405,965,30
);
AutoTurret((-415,860,320),(0,0,0));
AmmOMatic((1194,2904,48
,(0,0,0));
}
Wasteland()
{
CreateWalls((2174,-2468,25),(2174,-2250,180));
CreateWalls((2174,-2468,25),(2007,-2468,180));
CreateWalls((2007,-2250,25),(2174,-2250,180));
CreateRamps((2141,-2310,20),(2141,-2449,141));
CreateGrids((2019,-2279,141),(2098,-2449,141),(0,0,0));
CreateWalls((2007,-2279,141),(2007,-2449,170));
CreateRamps((2109,-2287,155),(2109,-2109,232));
CreateGrids((2004,-2106,232),(2225,-2002,232),(0,0,0));
CreateDoors((2007,-2467,32),(2007,-2391,32),(90,0,0),7,2,25,125);
CreateWalls((2225,-2002,243),(2004,-2002,267));
CreateWalls((2225,-2002,243),(2225,-2106,267));
CreateWalls((2004,-2002,243),(2004,-2106,267));
CreateBlocks((2042,-2115,252),(0,0,0));
CreateBlocks((2188,-2115,252),(0,0,0));
CreateRamps((2182,-2343,16
,(2381,-2343,220));
CreateGrids((2383,-2450,220),(2467,-2224,220),(0,0,0));
CreateWalls((2467,-2224,234),(2467,-2450,256));
CreateWalls((2467,-2224,234),(2383,-2224,256));
CreateWalls((2467,-2450,234),(2383,-2450,256));
CreateBlocks((2364,-2410,242),(0,90,0));
CreateBlocks((2364,-2272,242),(0,90,0));
CreateRamps((2046,-2415,150),(2046,-2631,22
);
CreateGrids((2222,-2648,22
,(1883,-2823,22
,(0,0,0));
CreateWalls((1883,-2823,242),(2222,-2823,340));
CreateWalls((1883,-2823,242),(1883,-2676,340));
CreateWalls((2222,-2676,242),(2222,-2823,340));
CreateWalls((1995,-2676,242),(1883,-2676,340));
CreateDoors((1991,-2675,247),(2072,-2675,247),(90,0,90),7,2,25,125);
CreateRamps((1938,-2792,235),(2192,-2792,323));
CreateRamps((2222,-2672,330),(2222,-2491,395));
CreateGrids((2340,-2487,395),(2110,-2379,395),(0,0,0));
CreateWalls((2361,-2371,409),(2081,-2371,430));
CreateWalls((2361,-2371,409),(2361,-2505,430));
CreateWalls((2081,-2505,409),(2081,-2371,430));
CreateBlocks((2146,-2492,415),(0,0,0));
CreateBlocks((2307,-2492,415),(0,0,0));
CreateRamps((2058,-2058,246),(1828,-2058,313));
CreateGrids((1805,-2202,315),(1718,-1912,30
,(0,0,0));
CreateRamps((1764,-2205,306),(1764,-2382,450));
CreateGrids((1634,-2388,450),(1894,-2492,450),(0,0,0));
CreateRamps((2476,-2330,240),(2665,-2330,310));
CreateGrids((2755,-2201,310),(2679,-2438,310),(0,0,0));
AmmOMatic((1882,-2437,464),(0,0,0));
mgTurret1 = spawnTurret( "misc_turret", (1714,-2101,364), "pavelow_minigun_mp" );
mgTurret1.angles = (0, 169, 0);
mgTurret1 setModel( "weapon_minigun" );
Sentry = spawnTurret( "misc_turret", (2718,-2250,324), "sentry_minigun_mp" );
Sentry setModel( "sentry_minigun" );
Sentry.angles = (0,98,0);
CreateRamps((2197,-1989,246),(2197,-1786,34
);
CreateGrids((2282,-1778,34
,(2093,-1684,34
,(0,0,0));
CreateRamps((2298,-1735,345),(2474,-1735,454));
CreateGrids((2481,-1813,454),(2584,-1658,454),(0,0,0));
CreateRamps((2309,-2369,411),(2309,-2140,475));
CreateGrids((2430,-2132,475),(2223,-2050,475),(0,0,0));
}
Carnaval()
{
CreateElevator((1922,586,-39),(-2898,9716,395),(0,0,0));
CreateWalls((-692,10000,46
,(-692,9564,673));
CreateWalls((-692,10000,46
,(-1103,10000,673));
CreateWalls((-1103,9564,46
,(-692,9564,673));
CreateWalls((-1103,9564,46
,(-1103,9687,581));
CreateWalls((-1103,9853,46
,(-1103,10000,581));
CreateDoors((-1103,9667,46
,(-1103,9752,46
,(90,0,0), 4,2,25,75);
CreateRamps((-965,9969,45
,(-691,9969,581));
CreateGrids((-692,9913,581),(-939,9562,581),(0,0,0));
CreateRamps((-951,9767,581),(-1285,9767,655));
CreateGrids((-1288,9852,655),(-1324,9672,655),(0,0,0));
ReviveBox((-724,9696,595),(0,90,0));
AmmOMatic((-724,9778,595),(0,90,0));
Juggernaut((-928,9594,46
,(0,0,0));
NinjaBox((-829,9594,46
,(0,0,0));
AutoTurret((-1311,9756,669),(0,90,0));
}
Overgrown()
{
CreateWalls((2215,-2878,-176),(2656,-2878,0));
CreateWalls((2656,-3116,-176),(2656,-2878,0));
CreateWalls((2215,-2878,-176),(2215,-3116,0));
CreateWalls((2215,-3116,-176),(2445,-3116,-135));
CreateWalls((2215,-3116,-70),(2656,-3116,15));
CreateRamps((2486,-2907,-185),(2245,-2907,-15));
CreateGrids((2245,-2958,-15),(2624,-3103,-15),(0,0,0));
CreateDoors((2400,-3116,-176),(2566,-3116,-176),(90,0,90),7,2,35,100);
playFX(level._effect[ "thin_black_smoke_L" ], (1020,-2946,12
);
angles = (90, 90, 0);
ReviveBox((2265,-2907,-175),(0,0,0));
AmmOMatic((2625,-2976,-175),(0,90,0));
PaPBox((2245,-3036,-177),(0,90,0));
DoubleTap((2237,-3042,-15),(0,90,0));
}
Vacant()
{
CreateDoors((611,-342,-47),(611,-420,-47),(90,0,0),4,2,30,100);
CreateDoors((611,157,-47),(611,91,-47),(90,0,0),4,2,30,100);
CreateDoors((867,-570,-47),(867,-668,-47),(90,0,0),6,2,15,100);
mgTurret1 = spawnTurret( "misc_turret", (1099,986,12), "pavelow_minigun_mp" );
mgTurret1.angles = (0, -178, 0);
mgTurret1 setModel( "weapon_minigun" );
CreateWalls((1084,1112,-47),(1084,1079,32));
CreateDoors((1203,846,-47),(1269,846,-47),(90,0,90),4,2,35,100);
ReviveBox((1652,144,-27),(0,90,0));
OrangeSoda((-1839,958,-113),(0,90,0));
AmmOMatic((247,1664,-111),(0,180,0));
}
Fuel()
{
CreateDoors((623,-776,2),(750,-776,2),(90,0,90),13,2,40,100);
CreateDoors((1008,524,2),(860,524,2),(90,0,90),14,2,40,100);
CreateDoors((503,-398,2),(503,-326,2),(90,0,0),3,2,40,100);
CreateDoors((540,-136,250),(594,-136,250),(90,0,90),3,2,12,100);
CreateDoors((540,269,250),(594,269,250),(90,0,90),3,2,12,100);
CreateBlocks((666,554,35),(0,0,0));
CreateDoors((1872,-105,-197),(1872,-180,-197),(90,0,0),3,2,35,100);
CreateDoors((1467,119,-156),(1586,119,-156),(90,0,90),6,2,20,100);
CreateWalls((1423,-203,84),(1423,-348,5
);
CreateBlocks((1369,-241,50),(0,90,0));
CreateBlocks((1369,-279,50),(0,90,0));
CreateBlocks((1369,-333,50),(0,90,0));
CreateWalls((1191,-482,95),(1191,-640,50));
Sentry = spawnTurret( "misc_turret", (774,-401,2), "sentry_minigun_mp" );
Sentry setModel( "sentry_minigun" );
Sentry.angles = (0,-90,0);
Sentry2 = spawnTurret( "misc_turret", (864,340,2), "sentry_minigun_mp" );
Sentry2 setModel( "sentry_minigun" );
Sentry2.angles = (0,90,0);
Juggernaut((503,-21,2),(0,90,0));
NinjaBox((1596,292,-157),(0,0,0));
AmmOMatic((1136,529,250),(0,90,0));
}
Crash()
{
AmmOMatic((1806,731,140),(0,90,0));
ReviveBox((1532,755,340),(0,0,0));
CreateBlocks((1601,380,443),(0,0,0));
CreateDoors((1585,427,30
,(1550,427,30
,(90,0,90),3,2,30,100);
CreateDoors((1702,427,140),(1635,427,140),(90,0,90),3,2,30,100);
CreateDoors((1459,622,140),(1459,683,140),(90,0,0),3,2,30,100);
CreateDoors((1616,624,580),(1616,681,580),(90,0,0),2,1,30,100);
DoubleTap((1788,429,587),(0,0,0));
SpeedCola((1712,427,580),(0,0,0));
}
Storm()
{
CreateRamps((4947,736,-60),(4736,736,
);
thread killTrigger( (5070,-1315,32), 60, 8 );
CreateElevator((1871,504,-7),(2816,-378,624),(0,0,0));
CreateElevator((607,919, 0),(2591,-1130,-63),(0,0,0));
PaPBox((-1335,678,0),(0,90,0));
CreateRamps((2943,-1172,-63),(2943,-1352,0));
CreateElevator((2615,-2175,-7),(2466,-1165,-63),(0,0,0));
CreateAsc((2280,-97,-7),(2280,-97,644),0,3);
AmmOMatic((1872,1349,-7),(0,90,0));
CreateRamps((-464,777,99),(-214,777,214));
CreateRamps((-989,1166,-7),(-989,1408,80));
}
Salvage()
{
CreateBlocks((2058,1983,30),(0,0,0));
CreateBlocks((2006,1988,30),(0,0,0));
CreateBlocks((2058,1983,60),(0,0,0));
CreateBlocks((2006,1988,60),(0,0,0));
CreateBlocks((1596,2058,71),(90,0,0));
CreateDoors((1771,2360,0),(1847,2360,0),(90,0,90),2,2,30,100);
CreateDoors((1710,2217,136),(1639,2217,136),(0,0,0),4,1,30,100);
CreateBlocks((1904,2052,136),(0,0,0));
CreateBlocks((1711,2007,136),(0,0,90));
mgTurret1 = spawnTurret( "misc_turret", (2057,2126,223), "pavelow_minigun_mp" );
mgTurret1.angles = (0, -93, 0);
mgTurret1 setModel( "weapon_minigun" );
playFX(level._effect[ "falling_junk_ring_runner" ], (2033,2182,200));
angles = (90, 90, 0);
AmmOMatic((1813,2360,136),(0,0,0));
NapalmBox((1724,2007,153),(0,0,0));
}
Bailout()
{
CreateDoors((2339,-2343,600),(2339,-2282,600),(90,0,0),6,2,25,100);
CreateDoors((2391,-2596,600),(2466,-2596,600),(90,0,90),6,2,25,100);
mgTurret1 = spawnTurret( "misc_turret", (2322,-2255,804), "pavelow_minigun_mp" );
mgTurret1.angles = (0,-176,0);
mgTurret1 setModel( "weapon_minigun" );
mgTurret2 = spawnTurret( "misc_turret", (2491,-2618,804), "pavelow_minigun_mp" );
mgTurret2.angles = (0,-113,0);
mgTurret2 setModel( "weapon_minigun" );
OrangeSoda((2600,-2371,74
,(0,0,0));
CreateBlocks((507,-2078,78
,(0,-90,0));
CreateBlocks((507,-2078,800),(0,-90,0));
CreateBlocks((-57,-1894,700),(0,-90,0));
CreateBlocks((-57,-1894,724),(0,-90,0));
CreateBlocks((345,-2279,825),(0,-90,0));
CreateBlocks((345,-2317,825),(0,-90,0));
AmmOMatic((-100,-1739,816),(0,180,0));
CreateBlocks((324,-2368,685),(0,-180,0));
CreateBlocks((324,-2368,712),(0,-180,0));
PaPBox((120,-1872,672),(0,90,0));
}
Strike()
{
CreateDoors((-1364,352,19),(-1293,352,19),(90,0,90),3,2,20,100);
CreateDoors((-1201,304,187),(-1254,304,187),(90,0,90),3,2,20,100);
CreateDoors((-1280,100,19),(-1176,100,19),(90,0,90),6,2,35,100);
CreateDoors((-1357,89,19),(-1447,181,19),(90,0,-45),6,2,35,100);
CreateWalls((-1498,390,19),(-1458,390,105));
mgTurret1 = spawnTurret( "misc_turret", (-1196,48,237), "pavelow_minigun_mp" );
mgTurret1.angles = (0, -84, 0);
mgTurret1 setModel( "weapon_minigun" );
mgTurret2 = spawnTurret( "misc_turret", (-1019,199,237), "pavelow_minigun_mp" );
mgTurret2.angles = (0, 7, 0);
mgTurret2 setModel( "weapon_minigun" );
PaPBox((-1310,574,187),(0,0,0));
Juggernaut((-1134,288,19),(0,0,0));
SpeedCola((-1025,416,19),(0,90,0));
NinjaBox((-1025,422,192),(0,90,0));
AmmOMatic((-1071,304,187),(0,180,0));
}
Trailerpark()
{
CreateWalls((1155,-2699,0),(1441,-2699,700));
CreateWalls((1155,-2699,0),(1155,-2509,700));
AmmOMatic((1200,-2561,470),(0,-90,0));
CreateWalls((1441,-2509,0),(1441,-2699,700));
CreateElevator((1113,-1609,7),(1149,-1862,7),(0,0,0));
CreateDoors((1158,-2509,0),(1224,-2509,0),(90,0,90),9,2,30,100);
playFX(level._effect[ "firelp_large_pm" ], (1507,-2006,6));
angles = (90, 90, 0);
playFX(level._effect[ "firelp_large_pm" ], (1099,-2243,0));
angles = (90, 90, 0);
playFX(level._effect[ "firelp_large_pm" ], (957,-1845,5));
angles = (90, 90, 0);
playFX(level._effect[ "firelp_large_pm" ], (1430,-2365,0));
angles = (90, 90, 0);
CreateRamps((1223,-2674,-10),(1395,-2674,110));
CreateGrids((1200,-2554,110),(1395,-2617,110),(0,0,0));
CreateRamps((1223,-2674,125),(1395,-2674,220));
CreateGrids((1200,-2554,220),(1395,-2617,220),(0,0,0));
CreateRamps((1223,-2674,235),(1395,-2674,330));
CreateGrids((1200,-2554,330),(1395,-2617,330),(0,0,0));
CreateRamps((1223,-2674,345),(1395,-2674,440));
CreateGrids((1200,-2554,440),(1395,-2617,440),(0,0,0));
CreateRamps((1223,-2674,455),(1395,-2674,550));
CreateGrids((1200,-2554,550),(1395,-2617,550),(0,0,0));
CreateRamps((1223,-2674,565),(1395,-2674,660));
CreateGrids((1200,-2554,660),(1395,-2617,660),(0,0,0));
}
, if you dont know why dont you ask??? :S
Copyright © 2026, NextGenUpdate.
All Rights Reserved.