etqw-sdk/base/script/maps/outskirts.script

963 lines
36 KiB
Plaintext

#define OBJECTIVE_OUTSKIRTS_DESTROY_BARRICADE 0
#define OBJECTIVE_OUTSKIRTS_CAPTURE_OUTPOST 1
#define OBJECTIVE_OUTSKIRTS_HACK_OBJECTIVE 2
#define OBJECTIVE_OUTSKIRTS_TRANSMIT_DATABRAIN 3
// Bases
#define OUT_GDF_BASE_DEPLOY 0 // turn on at start
#define OUT_STROGG_BASE_DEPLOY 1
// Objective 1 - HE Charge on Barricade
#define OUT_OBJECTIVE_BARRICADE 2 // turn on at start
#define OUT_GDF_ATTACK_BARRICADE 3 // turn on at start
#define OUT_GDF_DEPLOY_BARRICADE 4 // turn on at start
#define OUT_STROGG_DEFEND_BARRICADE 5 // turn on at start
#define OUT_STROGG_DEPLOY_BARRICADE 6 // turn on at start
// Objective 2 - Deploy MCP at Outpost
#define OUT_OBJECTIVE_MCP_OUTPOST 7
#define OUT_GDF_ATTACK_MCP_OUTPOST 8
#define OUT_GDF_DEPLOY_MCP_OUTPOST 9
#define OUT_STROGG_DEFEND_MCP_OUTPOST 10
#define OUT_STROGG_DEPLOY_MCP_OUTPOST 11
// Objective 3 - Hack the Shield Generator
#define OUT_OBJECTIVE_HACK 12
#define OUT_GDF_ATTACK_HACK 13
#define OUT_GDF_DEPLOY_HACK 14
#define OUT_STROGG_DEFEND_HACK 15
#define OUT_STROGG_DEPLOY_HACK 16
// Objective 4 - Steal the Data Brain
#define OUT_OBJECTIVE_DATABRAIN 17
#define OUT_GDF_ATTACK_DATABRAIN1 18 // Data Brain building
#define OUT_GDF_ATTACK_DATABRAIN2 19 // Telecomms building
#define OUT_GDF_DEPLOY_DATABRAIN 20
#define OUT_STROGG_DEFEND_DATABRAIN1 21 // Data Brain building
#define OUT_STROGG_DEFEND_DATABRAIN2 22 // Telecomms building
#define OUT_STROGG_DEPLOY_DATABRAIN 23
// Forward Spawns
#define OUT_OBJECTIVE_GDF_SPAWN1 24
#define OUT_GDF_ATTACK_GDF_SPAWN1 25
#define OUT_GDF_DEFEND_GDF_SPAWN1 26
#define OUT_STROGG_ATTACK_GDF_SPAWN1 27
#define OUT_STROGG_DEFEND_GDF_SPAWN1 28
#define OUT_OBJECTIVE_GDF_SPAWN2 29
#define OUT_GDF_ATTACK_GDF_SPAWN2 30
#define OUT_GDF_DEFEND_GDF_SPAWN2 31
#define OUT_STROGG_ATTACK_GDF_SPAWN2 32
#define OUT_STROGG_DEFEND_GDF_SPAWN2 33
// ----------------------------------------------------------------------
object mapObject_Outskirts : mapObject_Default {
void destroy();
void InitObjectives();
void CompleteObjective( float index, entity p );
handle GetObjectiveMessage( float index );
void OnTimeLimitHit();
void OnBarricadeDestroyed();
void OnOutpostCaptured();
void OnHackObjective();
void OnDatabrainTransmitted();
void OnShieldDeployed( entity obj, entity trigger );
void OnHackComplete( entity obj );
void OnShieldHacked();
//void OnShieldDeployed( entity obj, entity trigger );
void OnMCPSpawned( entity obj );
void OnMCPDestroyed( entity obj, vector newLocation, vector newAngles );
void OnMCPDelivered( entity obj );
void BarricadeDestroyThread();
void BarricadeEffectsThread();
void BuildingEffectsThread();
void PostBarricadeDestroyedAudio();
void PostDataBrainBuildingDestroyedAudio();
void StartShieldObjective();
void OnShieldDestroyedScud( entity trigger );
void StartFirstObjective();
void ClearMCPData();
vector GetGDFBasePosition() { return '-10980 10980 590'; }
// Bot Functions
void OnSpawnCaptured( string actionName );
void OnSpawnLiberated( string actionName );
void OnCarryableItemStolen( string actionName );
void OnCarryableItemReturned( string actionName );
void NeededClassFirstObjective();
void CarryableItemTemp();
void StroggBrainDefence();
void RunBotMCPMapScript( float actionGroupOff, float actionGroupOn );
entity GetSpectateEntity();
// ----------------------------------------------------------------------
float mainObjectiveIndex;
entity gdfBaseTerritory;
entity barricadeTerritory;
entity outpostTerritory;
entity towersTerritory;
entity stroggBaseTerritory;
entity objective1Arrow1;
entity objective1Arrow2;
entity objective2Arrow1;
entity objective2Arrow2;
entity objective3Arrow1;
entity objective3Arrow2;
entity objective4Arrow1;
entity objective4Arrow2;
entity objective1Marker;
entity objective2Marker;
entity objective3Marker;
entity objective4Marker;
entity barricade_smoke;
entity barricade_rubble;
entity building_smoke;
entity barricadeFlare1;
entity barricadeFlare2;
entity barricadeFlare3;
entity barricadeFlare4;
entity barricadeFlare5;
entity barricadeFlare6;
entity barricadeLight;
entity barricadeStroyent;
entity scudTrigger;
entity gdfBaseSpawn;
entity stroggBaseSpawn;
entity gdfOutpostSpawn;
entity stroggOutpostSpawn;
entity stroggFactorySpawn;
entity stroggMonumentSpawn;
entity gdfFactoryOfficesSpawn;
entity gdfSiloSpawn;
entity gdfHillSpawn;
entity stroggForcefields;
entity stroggTriggerHurts_1;
entity stroggTriggerHurts_2;
entity stroggTriggerHurts_3;
entity stroggBuildingWall;
entity endCameraA;
entity endCameraB;
entity barricades;
entity barricade_clip;
entity barricade_destroyed;
entity mcpRoute;
entity mcpCaller;
entity shieldCaller;
entity dataBrain;
entity dataBrainclip;
entity noplant_barricade;
entity currentMCP;
// Bot Obstacles;
entity bot_barricade1;
entity bot_brainBuilding1;
entity bot_brainBuilding2;
entity bot_brainBuilding3;
entity bot_brainBuilding4;
cvar debug_script;
}
mapObject_Base OutSkirts_MapScript() {
return new mapObject_Outskirts;
}
void mapObject_Outskirts::destroy() {
}
// ----------------------------------------------------------------------
void mapObject_Outskirts::InitObjectives() {
gameRules.setWinningTeam( stroggTeam );
gdfTeam.SetRespawnWait( 20 );
stroggTeam.SetRespawnWait( 30 );
gdfTeam.InitRespawnTimeChange();
stroggTeam.InitRespawnTimeChange();
CreateRespawnTimeThread( gdfTeam );
gdfBaseTerritory = worldspawn.getEntityKey( "script_gdf_base_territory" );
barricadeTerritory = worldspawn.getEntityKey( "script_barricade_territory" );
outpostTerritory = worldspawn.getEntityKey( "script_outpost_territory" );
towersTerritory = worldspawn.getEntityKey( "script_towers_territory" );
stroggBaseTerritory = worldspawn.getEntityKey( "script_strogg_base_territory" );
objective1Marker = worldspawn.getEntityKey( "script_obj1_marker" );
objective1Arrow1 = worldspawn.getEntityKey( "script_obj1_arrow1" );
objective1Arrow2 = worldspawn.getEntityKey( "script_obj1_arrow2" );
objective2Marker = worldspawn.getEntityKey( "script_obj2_marker" );
objective2Arrow1 = worldspawn.getEntityKey( "script_obj2_arrow1" );
objective2Arrow2 = worldspawn.getEntityKey( "script_obj2_arrow2" );
objective3Marker = worldspawn.getEntityKey( "script_obj3_marker" );
objective3Arrow1 = worldspawn.getEntityKey( "script_obj3_arrow1" );
objective3Arrow2 = worldspawn.getEntityKey( "script_obj3_arrow2" );
objective4Marker = worldspawn.getEntityKey( "script_obj4_marker" );
objective4Arrow1 = worldspawn.getEntityKey( "script_obj4_arrow1" );
objective4Arrow2 = worldspawn.getEntityKey( "script_obj4_arrow2" );
barricade_smoke = worldspawn.getEntityKey( "script_barricade_smoke" );
barricade_rubble = worldspawn.getEntityKey( "script_barricade_rubble" );
building_smoke = worldspawn.getEntityKey( "script_building_smoke" );
barricadeFlare1 = worldspawn.getEntityKey( "script_barricade_flare1" );
barricadeFlare2 = worldspawn.getEntityKey( "script_barricade_flare2" );
barricadeFlare3 = worldspawn.getEntityKey( "script_barricade_flare3" );
barricadeFlare4 = worldspawn.getEntityKey( "script_barricade_flare4" );
barricadeFlare5 = worldspawn.getEntityKey( "script_barricade_flare5" );
barricadeFlare6 = worldspawn.getEntityKey( "script_barricade_flare6" );
barricadeLight = worldspawn.getEntityKey( "script_barricade_light" );
barricadeStroyent = worldspawn.getEntityKey( "script_barricade_stroyent" );
endCameraA = worldspawn.getEntityKey( "script_placement_camera_a" );
endCameraB = worldspawn.getEntityKey( "script_placement_camera_b" );
gdfBaseSpawn = worldspawn.getEntityKey( "script_gdf_base_spawn" );
stroggBaseSpawn = worldspawn.getEntityKey( "script_strogg_base_spawn" );
gdfOutpostSpawn = worldspawn.getEntityKey( "script_gdf_outpost_spawn" );
stroggFactorySpawn = worldspawn.getEntityKey( "script_strogg_factory_spawn" );
stroggOutpostSpawn = worldspawn.getEntityKey( "script_strogg_outpost_spawn" );
stroggMonumentSpawn = worldspawn.getEntityKey( "script_strogg_monument_spawn" );
gdfFactoryOfficesSpawn = worldspawn.getEntityKey( "script_gdf_factoryoffices_spawn" );
gdfSiloSpawn = worldspawn.getEntityKey( "script_gdf_silo_spawn" );
gdfHillSpawn = worldspawn.getEntityKey( "script_gdf_hill_spawn" );
stroggForcefields = worldspawn.getEntityKey( "script_strogg_forcefields" );
stroggTriggerHurts_1 = worldspawn.getEntityKey( "script_strogg_trigger_hurts_1" );
stroggTriggerHurts_2 = worldspawn.getEntityKey( "script_strogg_trigger_hurts_2" );
stroggTriggerHurts_3 = worldspawn.getEntityKey( "script_strogg_trigger_hurts_3" );
stroggBuildingWall = worldspawn.getEntityKey( "script_strogg_building_wall" );
dataBrain = worldspawn.getEntityKey( "script_databrain" );
dataBrainclip = worldspawn.getEntityKey( "script_data_brain_clip" );
barricades = worldspawn.getEntityKey( "script_barricade" );
barricade_clip = worldspawn.getEntityKey( "script_barricade_clip"); // clip added to top of barricade to keep bots from getting stuck when parachuting in to obj
barricade_destroyed = worldspawn.getEntityKey( "script_barricade_destroyed" );
barricade_destroyed.hide();
barricade_destroyed.forceDisableClip();
mcpRoute = worldspawn.getEntityKey( "script_mcp_route" );
mcpCaller = worldspawn.getEntityKey( "script_mcp_caller" );
noplant_barricade = worldspawn.getEntityKey( "script_noplant_barricade" );
shieldCaller = worldspawn.getEntityKey( "script_shieldgen_caller" );
// Bot Obstacles
bot_barricade1 = worldspawn.getEntityKey( "script_bot_barricade_1" );
bot_brainBuilding1 = worldspawn.getEntityKey( "script_bot_obstacle_brainbuilding_1" );
bot_brainBuilding2 = worldspawn.getEntityKey( "script_bot_obstacle_brainbuilding_2" );
bot_brainBuilding3 = worldspawn.getEntityKey( "script_bot_obstacle_brainbuilding_3" );
bot_brainBuilding4 = worldspawn.getEntityKey( "script_bot_obstacle_brainbuilding_4" );
debug_script = sys.getCVar( "bot_debugMapScript", "1" );
CreateDeployTasks();
// -----------------------------------------------------
objManager.setNextObjective( gdfTeam, OBJECTIVE_OUTSKIRTS_DESTROY_BARRICADE );
objManager.setNextObjective( stroggTeam, OBJECTIVE_OUTSKIRTS_DESTROY_BARRICADE );
gdfOutpostSpawn.setGameTeam( $null );
gdfSiloSpawn.setGameTeam( $null );
gdfHillSpawn.vSetActive( false );
gdfFactoryOfficesSpawn.vSetActive( false );
stroggFactorySpawn.setGameTeam( stroggTeam );
stroggOutpostSpawn.setGameTeam( stroggTeam );
stroggMonumentSpawn.setGameTeam( stroggTeam );
gdfBaseTerritory.setActive( true );
barricadeTerritory.setActive( true );
outpostTerritory.setActive( false );
towersTerritory.setActive( false );
stroggBaseTerritory.setActive( false );
objective1Marker.vStartObjective();
objective1Arrow1.vStartObjective();
objective1Arrow1.setGameTeam( gdfTeam );
objective1Arrow2.vStartObjective();
objective1Arrow2.setGameTeam( gdfTeam );
objective2Marker.vStartObjective();
objective3Marker.vStartObjective();
objective4Marker.vStartObjective();
objManager.disableNode( "Barricade_Node" ); // disable node inside building, past barricade
mainObjectiveIndex = OBJECTIVE_OUTSKIRTS_DESTROY_BARRICADE;
gameRules.setEndGameCamera( endCameraB );
thread StartFirstObjective();
// ----------------------------------------------------------------------
// BOT OBJECTIVE: PLANT HE CHARGE ON BARRICADE
// ----------------------------------------------------------------------
if ( debug_script.getBoolValue() ) {
sys.print( "***** BOTS SETUP FOR BARRICADE OBJECTIVE *****\n" );
}
objManager.setAttackingTeam( GDF );
objManager.setBotSightDist( 3000.0f );
objManager.activateBotActionGroup( OUT_GDF_BASE_DEPLOY );
objManager.activateBotActionGroup( OUT_OBJECTIVE_BARRICADE );
objManager.activateBotActionGroup( OUT_GDF_ATTACK_BARRICADE );
objManager.activateBotActionGroup( OUT_GDF_DEPLOY_BARRICADE );
objManager.activateBotActionGroup( OUT_STROGG_DEFEND_BARRICADE );
objManager.activateBotActionGroup( OUT_STROGG_DEPLOY_BARRICADE );
objManager.setPrimaryTeamAction( GDF, "gdf_destroy_barricade_9" );
objManager.setPrimaryTeamAction( STROGG, "gdf_destroy_barricade_9" );
objManager.setPrimaryTeamAction( STROGG, "strogg_disarm_barricade_1" );
objManager.setPrimaryTeamAction( STROGG, "strogg_disarm_barricade_2" );
//objManager.setSecondaryTeamAction( GDF, "xxx" );
objManager.setSecondaryTeamAction( STROGG, "strogg_fallback_mcp_deploy_1" );
objManager.setBotCriticalClass( GDF, SOLDIER );
objManager.setBotCriticalClass( STROGG, ENGINEER );
thread NeededClassFirstObjective();
//objManager.setTeamUseRearSpawn( GDF, false );
//gdfTeam.setTeamRearSpawn( gdfBaseSpawn );
objManager.setTeamUseRearSpawn( STROGG, true );
stroggTeam.setTeamRearSpawn( stroggOutpostSpawn );
objManager.setTeamUseRearSpawnPercentage( STROGG, 50 );
thread CarryableItemTemp();
}
void mapObject_Outskirts::NeededClassFirstObjective() {
sys.wait( 10 );
if ( debug_script.getBoolValue() ) {
sys.print( "********** SET UP CLASSES NEEDED FOR FIRST OBJECTIVE **********\n" );
}
objManager.setTeamNeededClass( GDF, SOLDIER, NOCLASS, 2, true, true );
objManager.setTeamNeededClass( GDF, MEDIC, NOCLASS, 2, false, false );
objManager.setTeamNeededClass( STROGG, ENGINEER, NOCLASS, 2, true, true );
objManager.setTeamNeededClass( STROGG, MEDIC, NOCLASS, 2, false, false );
}
void mapObject_Outskirts::CarryableItemTemp() {
sys.wait( 1 );
if ( debug_script.getBoolValue() ) {
sys.print( "********** TEMP DEACTIVATE CARRYABLE ACTION **********\n" );
}
objManager.deactivateBotActionGroup( OUT_OBJECTIVE_DATABRAIN );
}
void mapObject_Outskirts::StroggBrainDefence() {
sys.wait( 5 );
objManager.deactivateBotActionGroup( OUT_STROGG_DEFEND_DATABRAIN1 );
}
// ----------------------------------------------------------------------
void mapObject_Outskirts::CompleteObjective( float index, entity p ) {
if ( index == OBJECTIVE_OUTSKIRTS_DESTROY_BARRICADE ) {
OnBarricadeDestroyed();
} else if ( index == OBJECTIVE_OUTSKIRTS_CAPTURE_OUTPOST ) {
OnOutpostCaptured();
} else if ( index == OBJECTIVE_OUTSKIRTS_HACK_OBJECTIVE ) {
OnHackObjective();
} else if ( index == OBJECTIVE_OUTSKIRTS_TRANSMIT_DATABRAIN ) {
OnDatabrainTransmitted();
}
}
void mapObject_Outskirts::ClearMCPData() {
if ( currentMCP != $null_entity ) {
currentMCP.vFreeMission();
currentMCP = $null_entity;
}
}
void mapObject_Outskirts::OnMCPSpawned( entity obj ) {
ClearMCPData();
}
void mapObject_Outskirts::OnMCPDestroyed( entity obj, vector newLocation, vector newAngles ) {
if ( currentMCP != obj ) {
return;
}
ClearMCPData();
mcpCaller.vCallDrop( newLocation, newAngles );
}
void mapObject_Outskirts::OnMCPDelivered( entity obj ) {
ClearMCPData();
if ( mainObjectiveIndex == OBJECTIVE_OUTSKIRTS_CAPTURE_OUTPOST ) {
currentMCP = obj;
objManager.SetObjectiveEntity( currentMCP, mainObjectiveIndex );
currentMCP.vSetGoalMarker( objective2Marker );
currentMCP.vSetPathTargets( mcpCaller.getWorldOrigin(), objective2Marker.getWorldOrigin() );
currentMCP.setTrackerEntity( mcpRoute );
currentMCP.vCreateMission();
CreateInitialTimedMission( currentMCP );
}
}
void mapObject_Outskirts::OnHackComplete( entity obj ) {
if ( obj == scudTrigger ) {
OnShieldHacked();
objManager.deactivateBotActionGroup( 12 );//turn off hack obj bot actions immediately after hack
}
}
void mapObject_Outskirts::OnShieldHacked() {
objManager.SetObjectiveEntity( $null_entity, -1 );
scudTrigger.vCompleteMission();
StopTimedMission();
}
handle mapObject_Outskirts::GetObjectiveMessage( float index ) {
if ( index == OBJECTIVE_OUTSKIRTS_DESTROY_BARRICADE ) {
return sys.localizeString( "maps/outskirts/obj_destroy_barricade" );
}
if ( index == OBJECTIVE_OUTSKIRTS_CAPTURE_OUTPOST ) {
return sys.localizeString( "maps/outskirts/obj_capture_outpost" );
}
if ( index == OBJECTIVE_OUTSKIRTS_HACK_OBJECTIVE ) {
return sys.localizeString( "maps/outskirts/obj_destroy_defence" );
}
if ( index == OBJECTIVE_OUTSKIRTS_TRANSMIT_DATABRAIN ) {
return sys.localizeString( "maps/outskirts/obj_capture_module" );
}
return g_locStr_BadObjective;
}
// ----------------------------------------------------------------------
void mapObject_Outskirts::OnBarricadeDestroyed() {
barricades.vCompleteMission();
noplant_barricade.remove();
//barricade_clip.remove();
barricade_clip.forceDisableClip();
objManager.enableNode( "Barricade_Node" ); // enable node inside building after barricade is destroyed
objManager.activateBotAction( "Mcp_Wait_Area" );
StopTimedMission();
mainObjectiveIndex = OBJECTIVE_OUTSKIRTS_CAPTURE_OUTPOST;
objManager.setNextObjective( gdfTeam, OBJECTIVE_OUTSKIRTS_CAPTURE_OUTPOST );
objManager.setNextObjective( stroggTeam, OBJECTIVE_OUTSKIRTS_CAPTURE_OUTPOST );
barricadeFlare1.remove();
barricadeFlare2.remove();
barricadeFlare3.remove();
barricadeFlare4.remove();
barricadeFlare5.remove();
barricadeFlare6.remove();
barricadeLight.remove();
barricadeStroyent.remove();
barricadeTerritory.setGameTeam( gdfTeam );
gdfSiloSpawn.setGameTeam( gdfTeam );
stroggFactorySpawn.setGameTeam( $null_entity );
gdfFactoryOfficesSpawn.vSetActive( true );
gdfBaseTerritory.setActive( false );
barricadeTerritory.setActive( true );
outpostTerritory.setActive( true );
thread BarricadeDestroyThread();
thread BarricadeEffectsThread();
objective1Marker.vFinishObjective();
objective1Arrow1.vFinishObjective();
objective1Arrow2.vFinishObjective();
objective2Arrow1.vStartObjective();
objective2Arrow1.setGameTeam( gdfTeam );
objective2Arrow2.vStartObjective();
objective2Arrow2.setGameTeam( gdfTeam );
mcpCaller.vOnDeploy();
thread PostBarricadeDestroyedAudio();
gdfTeam.SetRespawnWait( 20 );
stroggTeam.SetRespawnWait( 30 );
ResetRespawnTimeThread();
// ----------------------------------------------------------------------
// BOT OBJECTIVE: DEPLOY MCP AT OUTPOST
// ----------------------------------------------------------------------
if ( debug_script.getBoolValue() ) {
sys.print( "***** BOTS SETUP FOR MCP OBJECTIVE *****\n" );
}
objManager.botUpdateForEvent( NOTEAM, NOCLASS, ACTION_STATE_NULL );
objManager.killBotActionGroup( OUT_GDF_BASE_DEPLOY );
objManager.killBotActionGroup( OUT_OBJECTIVE_BARRICADE );
objManager.killBotActionGroup( OUT_GDF_ATTACK_BARRICADE );
objManager.killBotActionGroup( OUT_GDF_DEPLOY_BARRICADE );
objManager.killBotActionGroup( OUT_STROGG_DEFEND_BARRICADE );
objManager.killBotActionGroup( OUT_STROGG_DEPLOY_BARRICADE );
objManager.activateBotActionGroup( OUT_OBJECTIVE_MCP_OUTPOST );
objManager.activateBotActionGroup( OUT_GDF_ATTACK_MCP_OUTPOST );
objManager.activateBotActionGroup( OUT_GDF_DEPLOY_MCP_OUTPOST );
objManager.activateBotActionGroup( OUT_STROGG_DEFEND_MCP_OUTPOST );
objManager.activateBotActionGroup( OUT_STROGG_DEPLOY_MCP_OUTPOST );
objManager.activateBotActionGroup( OUT_OBJECTIVE_GDF_SPAWN1 );
objManager.activateBotActionGroup( OUT_GDF_ATTACK_GDF_SPAWN1 );
objManager.activateBotActionGroup( OUT_STROGG_DEFEND_GDF_SPAWN1 );
objManager.setPrimaryTeamAction( GDF, "gdf_mcp_outpost_1" );
objManager.setPrimaryTeamAction( STROGG, "gdf_mcp_outpost_1" );
objManager.setBotCriticalClass( GDF, ENGINEER );
objManager.setBotCriticalClass( STROGG, ENGINEER );
objManager.setTeamNeededClass( GDF, MEDIC, NOCLASS, 2, false, false );
objManager.setTeamNeededClass( GDF, SOLDIER, NOCLASS, 1, false, false );
objManager.setTeamNeededClass( GDF, ENGINEER, NOCLASS, 3, true, true );
objManager.setTeamNeededClass( STROGG, SOLDIER, NOCLASS, 2, false, false );
objManager.setTeamNeededClass( STROGG, ENGINEER, NOCLASS, 3, true, true );
objManager.switchTeamWeapons( 1, 1, 2, 6, 0 );
objManager.setMapHasMCPGoal( true );
objManager.setBotTeamRetreatTime( GDF, 10 );
objManager.setTeamUseRearSpawn( GDF, true );
gdfTeam.setTeamRearSpawn( gdfBaseSpawn );
objManager.setTeamUseRearSpawnPercentage( GDF, 75 );
//objManager.setTeamUseRearSpawn( STROGG, false );
//stroggTeam.setTeamRearSpawn( stroggBaseSpawn );
objManager.clearTeamBotBoundEntities( GDF );
}
void mapObject_Outskirts::BarricadeDestroyThread() {
barricade_destroyed.show();
sys.wait( 0.5f );
barricade_destroyed.forceEnableClip();
// Bot Obstacle
bot_barricade1.activate( bot_barricade1 );
}
void mapObject_Outskirts::BarricadeEffectsThread() {
barricade_smoke.vTriggerParticleEffect( 1 );
sys.wait( 0.4f );
barricade_rubble.vTriggerParticleEffect( 1 );
}
// ----------------------------------------------------------------------
void mapObject_Outskirts::OnOutpostCaptured() {
mainObjectiveIndex = OBJECTIVE_OUTSKIRTS_HACK_OBJECTIVE;
objManager.setNextObjective( gdfTeam, OBJECTIVE_OUTSKIRTS_HACK_OBJECTIVE );
objManager.setNextObjective( stroggTeam, OBJECTIVE_OUTSKIRTS_HACK_OBJECTIVE );
outpostTerritory.setGameTeam( gdfTeam );
gdfHillSpawn.vSetActive( true );
gdfFactoryOfficesSpawn.vSetActive( false );
gdfFactoryOfficesSpawn.setGameTeam( gdfTeam );
gdfOutpostSpawn.setGameTeam( gdfTeam ); // switch spawn controllers
stroggOutpostSpawn.setGameTeam( $null_entity); // get rid of this spawn controller as the strogg won't use it again
barricadeTerritory.setActive( false );
outpostTerritory.setActive( true );
towersTerritory.setActive( true );
objective2Marker.vFinishObjective();
objective2Arrow1.vFinishObjective();
objective2Arrow2.vFinishObjective();
objective3Arrow1.vStartObjective();
objective3Arrow1.setGameTeam( gdfTeam );
objective3Arrow2.vStartObjective();
objective3Arrow2.setGameTeam( gdfTeam );
if ( currentMCP != $null ) {
currentMCP.vCompleteMission();
}
StopTimedMission();
shieldCaller.vOnDeploy();
objManager.SetObjectiveEntity( $null_entity, -1 );
G_PlayObjectiveCompletedRoll( GDF );
objManager.PlaySound( worldspawn.getKey( "snd_outpost_captured_strogg" ), stroggTeam );
objManager.PlaySound( worldspawn.getKey( "snd_outpost_captured_gdf" ), gdfTeam );
gdfTeam.SetRespawnWait( 20 );
stroggTeam.SetRespawnWait( 30 );
ResetRespawnTimeThread();
// ----------------------------------------------------------------------
// BOT OBJECTIVE: HACK SHIELD GENERATOR
// ----------------------------------------------------------------------
if ( debug_script.getBoolValue() ) {
sys.print( "***** BOTS SETUP FOR HACK OBJECTIVE *****\n" );
}
objManager.botUpdateForEvent( NOTEAM, NOCLASS, ACTION_STATE_NULL );
objManager.killBotActionGroup( OUT_OBJECTIVE_MCP_OUTPOST );
objManager.killBotActionGroup( OUT_GDF_ATTACK_MCP_OUTPOST );
objManager.killBotActionGroup( OUT_GDF_DEPLOY_MCP_OUTPOST );
objManager.killBotActionGroup( OUT_STROGG_DEFEND_MCP_OUTPOST );
objManager.killBotActionGroup( OUT_STROGG_DEPLOY_MCP_OUTPOST );
objManager.killBotActionGroup( OUT_OBJECTIVE_GDF_SPAWN1 );
objManager.killBotActionGroup( OUT_GDF_ATTACK_GDF_SPAWN1 );
objManager.killBotActionGroup( OUT_GDF_DEFEND_GDF_SPAWN1 );
objManager.killBotActionGroup( OUT_STROGG_ATTACK_GDF_SPAWN1 );
objManager.killBotActionGroup( OUT_STROGG_DEFEND_GDF_SPAWN1 );
objManager.activateBotActionGroup( OUT_OBJECTIVE_HACK );
objManager.activateBotActionGroup( OUT_GDF_ATTACK_HACK );
objManager.activateBotActionGroup( OUT_GDF_DEPLOY_HACK );
objManager.activateBotActionGroup( OUT_STROGG_DEFEND_HACK );
objManager.activateBotActionGroup( OUT_STROGG_DEPLOY_HACK );
objManager.activateBotActionGroup( OUT_OBJECTIVE_GDF_SPAWN2 );
objManager.activateBotActionGroup( OUT_GDF_ATTACK_GDF_SPAWN2 );
objManager.activateBotActionGroup( OUT_STROGG_DEFEND_GDF_SPAWN2 );
objManager.setPrimaryTeamAction( GDF, "gdf_hack_shield_17" );
objManager.setPrimaryTeamAction( STROGG, "gdf_hack_shield_17" );
objManager.setSecondaryTeamAction( STROGG, "strogg_fallback_mine_brain" );
objManager.setBotCriticalClass( GDF, COVERTOPS );
objManager.setBotCriticalClass( STROGG, ENGINEER );
objManager.setTeamNeededClass( GDF, MEDIC, NOCLASS, 2, false, false );
objManager.setTeamNeededClass( GDF, COVERTOPS, NOCLASS, 3, true, true );
objManager.setTeamNeededClass( STROGG, ENGINEER, NOCLASS, 3, false, true );
objManager.setTeamNeededClass( STROGG, MEDIC, NOCLASS, 1, false, false );
objManager.switchTeamWeapons( GDF, COVERTOPS, 1, 0, 100 );
objManager.setMapHasMCPGoal( false );
objManager.setBotTeamRetreatTime( GDF, 10 );
//objManager.setTeamUseRearSpawn( GDF, false );
//gdfTeam.setTeamRearSpawn( gdfSiloSpawn );
objManager.setTeamUseRearSpawn( STROGG, true );
stroggTeam.setTeamRearSpawn( stroggBaseSpawn );
objManager.setTeamUseRearSpawnPercentage( STROGG, 100 );
objManager.clearTeamBotBoundEntities( GDF );
}
// ----------------------------------------------------------------------
void mapObject_Outskirts::OnHackObjective() {
mainObjectiveIndex = OBJECTIVE_OUTSKIRTS_TRANSMIT_DATABRAIN;
objManager.setNextObjective( gdfTeam, OBJECTIVE_OUTSKIRTS_TRANSMIT_DATABRAIN );
objManager.setNextObjective( stroggTeam, OBJECTIVE_OUTSKIRTS_TRANSMIT_DATABRAIN );
stroggForcefields.remove();
stroggTriggerHurts_1.remove();
stroggTriggerHurts_2.remove();
stroggTriggerHurts_3.remove();
stroggBuildingWall.remove();
gdfHillSpawn.vSetActive( false );
gdfHillSpawn.setGameTeam( gdfTeam );
towersTerritory.setGameTeam( gdfTeam );
stroggMonumentSpawn.setGameTeam( $null_entity );
outpostTerritory.setActive( false );
towersTerritory.setActive( true );
stroggBaseTerritory.setActive( true );
thread BuildingEffectsThread();
objective3Marker.vFinishObjective();
objective3Arrow1.vFinishObjective();
objective3Arrow2.vFinishObjective();
objective4Arrow1.vStartObjective();
objective4Arrow1.setGameTeam( gdfTeam );
objective4Arrow2.vStartObjective();
objective4Arrow2.setGameTeam( gdfTeam );
objManager.SetObjectiveEntity( dataBrain, mainObjectiveIndex );
dataBrainclip.remove();
thread PostDataBrainBuildingDestroyedAudio();
gdfTeam.SetRespawnWait( 20 );
stroggTeam.SetRespawnWait( 30 );
ResetRespawnTimeThread();
// ----------------------------------------------------------------------
// BOT OBJECTIVE: STEAL THE DATABRAIN
// ----------------------------------------------------------------------
if ( debug_script.getBoolValue() ) {
sys.print( "***** BOTS SETUP FOR DATABRAIN OBJECTIVE *****\n" );
}
objManager.botUpdateForEvent( NOTEAM, NOCLASS, ACTION_STATE_NULL );
objManager.killBotActionGroup( OUT_OBJECTIVE_HACK );
objManager.killBotActionGroup( OUT_GDF_ATTACK_HACK );
objManager.killBotActionGroup( OUT_GDF_DEPLOY_HACK );
objManager.killBotActionGroup( OUT_STROGG_DEFEND_HACK );
objManager.killBotActionGroup( OUT_STROGG_DEPLOY_HACK );
objManager.killBotActionGroup( OUT_OBJECTIVE_GDF_SPAWN2 );
objManager.killBotActionGroup( OUT_GDF_ATTACK_GDF_SPAWN2 );
objManager.killBotActionGroup( OUT_GDF_DEFEND_GDF_SPAWN2 );
objManager.killBotActionGroup( OUT_STROGG_ATTACK_GDF_SPAWN2 );
objManager.killBotActionGroup( OUT_STROGG_DEFEND_GDF_SPAWN2 );
objManager.activateBotActionGroup( OUT_OBJECTIVE_DATABRAIN );
objManager.activateBotActionGroup( OUT_GDF_ATTACK_DATABRAIN1 );
objManager.activateBotActionGroup( OUT_GDF_ATTACK_DATABRAIN2 );
objManager.activateBotActionGroup( OUT_GDF_DEPLOY_DATABRAIN );
objManager.activateBotActionGroup( OUT_STROGG_DEFEND_DATABRAIN1 );
objManager.activateBotActionGroup( OUT_STROGG_DEFEND_DATABRAIN2 );
objManager.activateBotActionGroup( OUT_STROGG_DEPLOY_DATABRAIN );
objManager.activateBotActionGroup( OUT_STROGG_BASE_DEPLOY );
objManager.setPrimaryTeamAction( GDF, "gdf_steal_databrain_1" );
objManager.setPrimaryTeamAction( STROGG, "gdf_steal_databrain_1" );
//objManager.setSecondaryTeamAction( GDF, "xxx" );
//objManager.setSecondaryTeamAction( STROGG, "xxx" );
objManager.setBotCriticalClass( GDF, MEDIC );
objManager.setBotCriticalClass( STROGG, ENGINEER );
objManager.setTeamNeededClass( GDF, MEDIC, NOCLASS, 2, false, false );
objManager.setTeamNeededClass( GDF, SOLDIER, NOCLASS, 2, false, false );
objManager.setTeamNeededClass( STROGG, MEDIC, NOCLASS, 2, false, false );
objManager.setTeamNeededClass( STROGG, ENGINEER, NOCLASS, 2, false, false );
objManager.switchTeamWeapons( GDF, COVERTOPS, 0, 1, 50 );
objManager.switchTeamWeapons( GDF, SOLDIER, 0, 2, 50 );
objManager.setTeamUseRearSpawn( GDF, true );
gdfTeam.setTeamRearSpawn( gdfOutpostSpawn );
objManager.setTeamUseRearSpawnPercentage( GDF, 20 );
objManager.setTeamUseRearSpawn( STROGG, true );
stroggTeam.setTeamRearSpawn( stroggBaseSpawn );
objManager.setTeamUseRearSpawnPercentage( STROGG, 100 );
//objManager.setTeamAttacksDeployables( GDF, false );
objManager.setTeamAttacksDeployables( STROGG, false );
objManager.clearTeamBotBoundEntities( GDF );
// Bot Obstacles
bot_brainBuilding1.activate( bot_brainBuilding1 );
bot_brainBuilding2.activate( bot_brainBuilding2 );
bot_brainBuilding3.activate( bot_brainBuilding3 );
bot_brainBuilding4.activate( bot_brainBuilding4 );
}
// ----------------------------------------------------------------------
void mapObject_Outskirts::BuildingEffectsThread() {
sys.wait( 0.1f );
building_smoke.vTriggerParticleEffect( 1 );
}
void mapObject_Outskirts::OnDatabrainTransmitted() {
objective4Marker.vFinishObjective();
objManager.SetObjectiveEntity( $null_entity, -1 );
objManager.PlaySound( worldspawn.getKey( "snd_gdfwin_strogg" ), stroggTeam );
objManager.PlaySound( worldspawn.getKey( "snd_gdfwin_gdf" ), gdfTeam );
gameRules.setEndGameCamera( endCameraA );
gameRules.setWinningTeam( gdfTeam );
gameRules.endGame();
}
void mapObject_Outskirts::PostBarricadeDestroyedAudio() {
sys.wait( 3.f );
objManager.PlaySound( worldspawn.getKey( "snd_mcp_intro_strogg" ), stroggTeam );
objManager.PlaySound( worldspawn.getKey( "snd_mcp_intro_gdf" ), gdfTeam );
}
void mapObject_Outskirts::PostDataBrainBuildingDestroyedAudio() {
objManager.PlaySound( worldspawn.getKey( "snd_transmit_databrain_strogg" ), stroggTeam );
objManager.PlaySound( worldspawn.getKey( "snd_transmit_databrain_gdf" ), gdfTeam );
sys.wait( 10.f );
objManager.PlaySound( worldspawn.getKey( "snd_databrain_defend_strogg" ), stroggTeam );
objManager.PlaySound( worldspawn.getKey( "snd_databrain_grab_gdf" ), gdfTeam );
}
void mapObject_Outskirts::StartShieldObjective() {
sys.wait( 5.f );
scudTrigger.vSetActive( 1.f );
objManager.SetObjectiveEntity( scudTrigger, mainObjectiveIndex );
scudTrigger.vCreateMission();
CreateInitialTimedMission( scudTrigger );
}
void mapObject_Outskirts::OnShieldDestroyedScud( entity trigger ) {
thread StartShieldObjective();
}
void mapObject_Outskirts::StartFirstObjective() {
sys.wait( 5.f );
objManager.SetObjectiveEntity( barricades, mainObjectiveIndex );
barricades.vCreateMission();
CreateInitialTimedMission( barricades );
}
void mapObject_Outskirts::OnShieldDeployed( entity obj, entity trigger ) {
scudTrigger = trigger;
scudTrigger.vStartObjective();
}
void mapObject_Outskirts::OnTimeLimitHit() {
FinishTimedMission();
objManager.SetObjectiveEntity( $null_entity, -1 );
objManager.PlaySound( worldspawn.getKey( "snd_gdflose_strogg" ), stroggTeam );
objManager.PlaySound( worldspawn.getKey( "snd_gdflose_gdf" ), gdfTeam );
}
// ----------------------------------------------------------------------
// Bot Forward Spawn Actions
// ----------------------------------------------------------------------
void mapObject_Outskirts::OnSpawnCaptured( string actionName ) {
// Factory Offices Spawn Point
if( actionName == "gdf_forward_spawn_action_1" ) {
if ( debug_script.getBoolValue() ) {
sys.print( "***** GDF CAPTURED GDF SPAWN 1 *****\n" );
}
objManager.activateBotActionGroup( OUT_GDF_DEFEND_GDF_SPAWN1 );
objManager.activateBotActionGroup( OUT_STROGG_ATTACK_GDF_SPAWN1 );
objManager.deactivateBotActionGroup( OUT_GDF_ATTACK_GDF_SPAWN1 );
objManager.deactivateBotActionGroup( OUT_STROGG_DEFEND_GDF_SPAWN1 );
//gdfTeam.setTeamRearSpawn( gdfSiloSpawn );
//objManager.setTeamUseRearSpawnPercentage( GDF, 100 );
}
// Hilltop Building Spawn Point
if( actionName == "gdf_forward_spawn_action_2" ) {
if ( debug_script.getBoolValue() ) {
sys.print( "***** GDF CAPTURED GDF SPAWN 2 *****\n" );
}
objManager.activateBotActionGroup( OUT_GDF_DEFEND_GDF_SPAWN2 );
objManager.activateBotActionGroup( OUT_STROGG_ATTACK_GDF_SPAWN2 );
objManager.deactivateBotActionGroup( OUT_GDF_ATTACK_GDF_SPAWN2 );
objManager.deactivateBotActionGroup( OUT_STROGG_DEFEND_GDF_SPAWN2 );
//objManager.setTeamUseRearSpawn( GDF, true );
//gdfTeam.setTeamRearSpawn( gdfOutpostSpawn );
//objManager.setTeamUseRearSpawnPercentage( GDF, 100 );
}
}
void mapObject_Outskirts::OnSpawnLiberated( string actionName ) {
// Factory Offices Spawn Point
if( actionName == "gdf_forward_spawn_action_1" ) {
if ( debug_script.getBoolValue() ) {
sys.print( "***** STROGG LIBERATED GDF SPAWN 1 *****\n" );
}
objManager.activateBotActionGroup( OUT_GDF_ATTACK_GDF_SPAWN1 );
objManager.activateBotActionGroup( OUT_STROGG_DEFEND_GDF_SPAWN1 );
objManager.deactivateBotActionGroup( OUT_GDF_DEFEND_GDF_SPAWN1 );
objManager.deactivateBotActionGroup( OUT_STROGG_ATTACK_GDF_SPAWN1 );
//gdfTeam.setTeamRearSpawn( gdfBaseSpawn );
//objManager.setTeamUseRearSpawnPercentage( GDF, 20 );
}
// Hilltop Building Spawn Point
if( actionName == "gdf_forward_spawn_action_2" ) {
if ( debug_script.getBoolValue() ) {
sys.print( "***** STROGG LIBERATED GDF SPAWN 2 *****\n" );
}
objManager.activateBotActionGroup( OUT_GDF_ATTACK_GDF_SPAWN2 );
objManager.activateBotActionGroup( OUT_STROGG_DEFEND_GDF_SPAWN2 );
objManager.deactivateBotActionGroup( OUT_GDF_DEFEND_GDF_SPAWN2 );
objManager.deactivateBotActionGroup( OUT_STROGG_ATTACK_GDF_SPAWN2 );
//objManager.setTeamUseRearSpawn( GDF, false );
}
}
// ----------------------------------------------------------------------
// Bot Carryable Item Actions
// ----------------------------------------------------------------------
void mapObject_Outskirts::OnCarryableItemStolen( string actionName ) {
if( actionName == "gdf_steal_databrain_1" ) {
if ( debug_script.getBoolValue() ) {
sys.print( "***** DATABRAIN TAKEN *****\n" );
}
objManager.enableRoute( "bot_route_gdf_transmit" );
objManager.deactivateBotActionGroup( OUT_GDF_ATTACK_DATABRAIN1 );
thread StroggBrainDefence();
}
}
void mapObject_Outskirts::OnCarryableItemReturned( string actionName ) {
if( actionName == "gdf_steal_databrain_1" ) {
if ( debug_script.getBoolValue() ) {
sys.print( "***** DATABRAIN RETURNED *****\n" );
}
objManager.disableRoute( "bot_route_gdf_transmit" );
objManager.activateBotActionGroup( OUT_GDF_ATTACK_DATABRAIN1 );
objManager.activateBotActionGroup( OUT_STROGG_DEFEND_DATABRAIN1 );
}
}
// ----------------------------------------------------------------------
// MCP turret disable trigger
// ----------------------------------------------------------------------
void mapObject_Outskirts::RunBotMCPMapScript( float actionGroupOff, float actionGroupOn ) {
if ( actionGroupOff == OUT_STROGG_DEPLOY_BARRICADE && actionGroupOn == OUT_STROGG_DEPLOY_MCP_OUTPOST ) {
objManager.deactivateBotAction( "nkd_bot_action_344" );
objManager.deactivateBotAction( "nkd_bot_action_355" );
}
}
entity mapObject_Outskirts::GetSpectateEntity() {
if ( barricades != $null_entity ) {
return barricades.vGetSpectateEntity();
}
entity deployedMCP = G_FindDeployedMCP();
if ( currentMCP == $null_entity && deployedMCP == $null_entity ) {
return $null_entity;
}
if ( currentMCP != $null_entity ) {
if ( !currentMCP.vIsObjectiveComplete() ) {
return currentMCP.vGetSpectateEntity();
}
}
if ( !scudTrigger.vIsObjectiveComplete() ) {
return scudTrigger.vGetSpectateEntity();
}
if ( dataBrain != $null_entity ) {
return dataBrain.vGetSpectateEntity();
}
return $null_entity;
}