1138 lines
41 KiB
Plaintext
1138 lines
41 KiB
Plaintext
|
#define OBJECTIVE_SEWER_CONSTRUCT_JAMMER 0
|
||
|
#define OBJECTIVE_SEWER_DESTROY_DOOR_A 1
|
||
|
#define OBJECTIVE_SEWER_HACK_CONTROLS 2
|
||
|
#define OBJECTIVE_SEWER_DESTROY_DOOR_B 3
|
||
|
|
||
|
// MBJ Bot Action Groups
|
||
|
|
||
|
// Objective 1 - Barricade
|
||
|
#define GDF_DESTROY_BARRICADE 0
|
||
|
#define GDF_SUPPORT_BARRICADE 1
|
||
|
#define GDF_DEPLOY_BARRICADE 2
|
||
|
#define STROGG_DEFEND_BARRICADE 3
|
||
|
#define STROGG_DEPLOY_BARRICADE 4
|
||
|
|
||
|
// Objective 2 - Jamming Tower
|
||
|
#define GDF_CONSTRUCT_JAMMER 5
|
||
|
#define GDF_SUPPORT_JAMMER 6
|
||
|
#define STROGG_DEFEND_JAMMER 7
|
||
|
#define STROGG_DEPLOY_JAMMER 8
|
||
|
|
||
|
// Objective 3 - Sewer Attack
|
||
|
#define GDF_ATTACK_SEWER 9
|
||
|
#define STROGG_DEFEND_SEWER 10
|
||
|
|
||
|
// Objective 4 - South Door Attack
|
||
|
#define GDF_DESTROY_SOUTH_DOOR 11
|
||
|
#define GDF_SUPPORT_SOUTH_DOOR 12
|
||
|
#define GDF_SUPPORT_DOORS 13
|
||
|
#define STROGG_DEFEND_SOUTH_DOOR 14
|
||
|
#define STROGG_DEPLOY_SEWER 15
|
||
|
|
||
|
// Hack Objective
|
||
|
#define GDF_HACK_CONSOLE 16
|
||
|
#define STROGG_DEFEND_CONSOLE 17
|
||
|
|
||
|
#define GDF_DESTROY_NORTH_DOOR 18
|
||
|
#define GDF_DESTROY_HATCH 19
|
||
|
|
||
|
// Forward Spawns
|
||
|
#define GDF_HUT_SPAWN 20
|
||
|
#define STROGG_HUT_SPAWN 21
|
||
|
#define GDF_SEWER_SPAWN 22
|
||
|
#define STROGG_SEWER_SPAWN 23
|
||
|
|
||
|
#define GDF_SEWER_DESTROY_OVERFLOW 25
|
||
|
#define ALL_SEWER_CONSOLE_PREDOOR 26
|
||
|
|
||
|
#define GDF_CONSTRUCT_GUARDTOWER_BASE 27
|
||
|
#define ALL_GUARDTOWER_BASE 28
|
||
|
#define GDF_CONSTRUCT_GUARDTOWER_HUT 29
|
||
|
#define ALL_GUARDTOWER_HUT 30
|
||
|
|
||
|
#define STROGG_OVERFLOW_DEFENCE 40
|
||
|
#define STROGG_DEFEND_CONSOLE_INTERIOR 47 // interior actions from group 17
|
||
|
|
||
|
#define GDF_SUPPORT_SEWER_JAMMER_NEW 90
|
||
|
|
||
|
object mapObject_Sewer : mapObject_Default {
|
||
|
void destroy();
|
||
|
|
||
|
void InitObjectives();
|
||
|
|
||
|
void CompleteObjective( float index, entity p );
|
||
|
handle GetObjectiveMessage( float index );
|
||
|
|
||
|
void EndMap();
|
||
|
void OnTimeLimitHit();
|
||
|
|
||
|
void OnJammerBuilt();
|
||
|
void OnDoorsDestroyed();
|
||
|
void OnDoorADestroyed();
|
||
|
void OnDoorBDestroyed();
|
||
|
void OnControlsHacked();
|
||
|
|
||
|
void OnGuardTower1Built();
|
||
|
void OnGuardTower1Destroyed();
|
||
|
void OnGuardTower2Built();
|
||
|
void OnGuardTower2Destroyed();
|
||
|
void OnSubstationBarricadeDestroyed();
|
||
|
void OnOverflowHatchDestroyed();
|
||
|
void OnMaintenanceHatchDestroyed();
|
||
|
|
||
|
void OnConstructionComplete( entity obj );
|
||
|
void OnDestructionComplete( entity obj );
|
||
|
|
||
|
void StartFirstObjective();
|
||
|
void StartHackObjective();
|
||
|
|
||
|
vector GetGDFBasePosition() { return '-7360 -8290 2040'; }
|
||
|
|
||
|
void EMPThread();
|
||
|
void BarricadeDestroyedThread();
|
||
|
void DoorADestroyedThread();
|
||
|
void DoorBDestroyedThread();
|
||
|
|
||
|
// Bot Functions
|
||
|
void OnSpawnCaptured( string actionName );
|
||
|
void OnSpawnLiberated( string actionName );
|
||
|
void NeededClassFirstObjective();
|
||
|
void BotCheckSecondaryObjectives();
|
||
|
|
||
|
entity GetSpectateEntity();
|
||
|
|
||
|
float mainObjectiveIndex;
|
||
|
|
||
|
entity gdf_base_territory;
|
||
|
entity substation_territory;
|
||
|
entity spillway_territory;
|
||
|
|
||
|
entity gdf_base_spawn;
|
||
|
entity hut_capturable_spawn;
|
||
|
entity substation_spawn;
|
||
|
entity spillway_spawn;
|
||
|
entity spillway_capturable_spawn;
|
||
|
entity sewer_spawn;
|
||
|
|
||
|
entity objective1;
|
||
|
entity objective1Arrow1;
|
||
|
entity objective1Arrow2;
|
||
|
entity objective2a;
|
||
|
entity objective2b;
|
||
|
entity objective2Arrow1;
|
||
|
entity objective2Arrow2;
|
||
|
entity objective3;
|
||
|
|
||
|
entity strogg_triggerHurt_spillway_1;
|
||
|
entity strogg_triggerHurt_spillway_2;
|
||
|
entity strogg_triggerHurt_spillway_3;
|
||
|
entity strogg_trigger_hurtSewerinterior_1;
|
||
|
entity strogg_trigger_hurtSewerinterior_2;
|
||
|
entity strogg_trigger_hurtSewerinterior_3;
|
||
|
entity strogg_trigger_hurtSewerinterior_4;
|
||
|
entity strogg_trigger_hurtSewerinterior_5;
|
||
|
entity stroggshieldSpillway;
|
||
|
entity stroggshield_sewerInterior;
|
||
|
entity stroggshield_light_1;
|
||
|
entity stroggshield_light_2;
|
||
|
entity stroggshield_light_3;
|
||
|
entity stroggshield_light_4;
|
||
|
|
||
|
// Bot Functions
|
||
|
|
||
|
void SetupBotsObjectiveOne();
|
||
|
void BotsHackObjective();
|
||
|
void OpenDoorsFast();
|
||
|
|
||
|
// Bot Obstacles
|
||
|
entity bot_barricade;
|
||
|
entity bot_northdoor; // north and south grates
|
||
|
entity bot_southdoor;
|
||
|
entity bot_hatch; // maintenance hatch
|
||
|
entity bot_shield_sewerInterior1;
|
||
|
entity bot_shield_sewerInterior2;
|
||
|
entity bot_shield_sewerInterior3;
|
||
|
entity bot_shield_sewerInterior4;
|
||
|
entity bot_spillway1;
|
||
|
entity bot_spillway2;
|
||
|
entity bot_spillway3;
|
||
|
entity bot_overflow; // overflow hatch
|
||
|
entity bot_lowerdoor; // lower entrance shield underneath stairs
|
||
|
entity bot_sewerdoor_a; // automatic opening double doors for final obj
|
||
|
entity bot_sewerdoor_b;
|
||
|
entity bot_sewerdoor_c;
|
||
|
|
||
|
// grates
|
||
|
entity doorA;
|
||
|
entity doorB;
|
||
|
entity doorA_destroyed;
|
||
|
entity doorB_destroyed;
|
||
|
|
||
|
// bulkhead doors
|
||
|
entity sewer_door_a;
|
||
|
entity sewer_door_b;
|
||
|
entity sewer_door_c;
|
||
|
|
||
|
entity doorDualProxy;
|
||
|
entity jammerMaterials;
|
||
|
entity finalObjective;
|
||
|
|
||
|
boolean doorOpened;
|
||
|
|
||
|
entity emp_charge;
|
||
|
entity emp_fire;
|
||
|
|
||
|
entity shield_down_1;
|
||
|
entity shield_down_2;
|
||
|
entity shield_down_3;
|
||
|
entity shield_down_4;
|
||
|
|
||
|
entity sewer_door_1;
|
||
|
entity sewer_door_1_water;
|
||
|
entity sewer_door_2;
|
||
|
entity sewer_door_smoke_1;
|
||
|
entity sewer_door_smoke_2;
|
||
|
entity sewer_door_maintenance;
|
||
|
entity sewer_door_overflow_hatch;
|
||
|
|
||
|
entity flood;
|
||
|
|
||
|
entity noplant_barricade;
|
||
|
entity noplant_maintenance_hatch;
|
||
|
entity noplant_overflow_hatch;
|
||
|
entity noplant_north_grate;
|
||
|
entity noplant_south_grate;
|
||
|
|
||
|
// secondary objectives
|
||
|
entity guardTower1Construction;
|
||
|
entity guardTower2Construction;
|
||
|
entity guardTower1;
|
||
|
entity guardTower2;
|
||
|
boolean guardTower1Built;
|
||
|
boolean guardTower2Built;
|
||
|
|
||
|
entity substationBarricade;
|
||
|
entity substationBarricadeDestroyed;
|
||
|
boolean barricadeDestroyed;
|
||
|
|
||
|
entity overflowHatch;
|
||
|
entity maintenanceHatch;
|
||
|
|
||
|
entity endCameraA;
|
||
|
entity endCameraB;
|
||
|
|
||
|
cvar debug_script;
|
||
|
|
||
|
boolean maintenanceHatchAccessible;
|
||
|
boolean hutSpawnCaptured;
|
||
|
}
|
||
|
|
||
|
mapObject_Base Sewer_MapScript() {
|
||
|
return new mapObject_Sewer;
|
||
|
}
|
||
|
|
||
|
void mapObject_Sewer::destroy() {
|
||
|
}
|
||
|
|
||
|
void mapObject_Sewer::InitObjectives() {
|
||
|
gameRules.setWinningTeam( stroggTeam );
|
||
|
gdfTeam.SetRespawnWait( 20 );
|
||
|
stroggTeam.SetRespawnWait( 20 );
|
||
|
gdfTeam.InitRespawnTimeChange();
|
||
|
stroggTeam.InitRespawnTimeChange();
|
||
|
CreateRespawnTimeThread( gdfTeam );
|
||
|
|
||
|
gdf_base_territory = worldspawn.getEntityKey( "script_gdf_base_territory" );
|
||
|
substation_territory = worldspawn.getEntityKey( "script_substation_territory" );
|
||
|
spillway_territory = worldspawn.getEntityKey( "script_spillway_territory" );
|
||
|
|
||
|
gdf_base_spawn = worldspawn.getEntityKey( "script_gdf_base_spawn" );
|
||
|
hut_capturable_spawn = worldspawn.getEntityKey( "script_hut_capturable_spawn" );
|
||
|
substation_spawn = worldspawn.getEntityKey( "script_substation_spawn" );
|
||
|
spillway_spawn = worldspawn.getEntityKey( "script_spillway_spawn" );
|
||
|
spillway_capturable_spawn = worldspawn.getEntityKey( "script_spillway_capturable_spawn" );
|
||
|
sewer_spawn = worldspawn.getEntityKey( "script_sewer_spawn" );
|
||
|
|
||
|
gdf_base_territory.setActive( true );
|
||
|
substation_territory.setActive( true );
|
||
|
|
||
|
gdf_base_spawn.setGameTeam( gdfTeam );
|
||
|
hut_capturable_spawn.setGameTeam( $null_entity );
|
||
|
hut_capturable_spawn.vSetActive( true );
|
||
|
substation_spawn.setGameTeam( $null_entity );
|
||
|
spillway_spawn.setGameTeam( stroggTeam );
|
||
|
spillway_capturable_spawn.setGameTeam( gdfTeam );
|
||
|
spillway_capturable_spawn.vSetActive( false );
|
||
|
sewer_spawn.setGameTeam( stroggTeam );
|
||
|
|
||
|
objective1 = worldspawn.getEntityKey( "script_objective1" );
|
||
|
objective1Arrow1 = worldspawn.getEntityKey( "script_objective1_arrow1" );
|
||
|
objective1Arrow2 = worldspawn.getEntityKey( "script_objective1_arrow2" );
|
||
|
|
||
|
objective2a = worldspawn.getEntityKey( "script_objective2a" );
|
||
|
objective2b = worldspawn.getEntityKey( "script_objective2b" );
|
||
|
objective2Arrow1 = worldspawn.getEntityKey( "script_objective2_arrow1" );
|
||
|
objective2Arrow2 = worldspawn.getEntityKey( "script_objective2_arrow2" );
|
||
|
|
||
|
objective3 = worldspawn.getEntityKey( "script_objective3" );
|
||
|
|
||
|
emp_charge = worldspawn.getEntityKey( "script_emp_charge" );
|
||
|
emp_fire = worldspawn.getEntityKey( "script_emp_fire" );
|
||
|
|
||
|
shield_down_1 = worldspawn.getEntityKey( "script_shield_down_1" );
|
||
|
shield_down_2 = worldspawn.getEntityKey( "script_shield_down_2" );
|
||
|
shield_down_3 = worldspawn.getEntityKey( "script_shield_down_3" );
|
||
|
shield_down_4 = worldspawn.getEntityKey( "script_shield_down_4" );
|
||
|
|
||
|
sewer_door_1 = worldspawn.getEntityKey( "script_sewer_door_1" );
|
||
|
sewer_door_1_water = worldspawn.getEntityKey( "script_sewer_door_1_water" );
|
||
|
sewer_door_2 = worldspawn.getEntityKey( "script_sewer_door_2" );
|
||
|
sewer_door_smoke_1 = worldspawn.getEntityKey( "script_sewer_door_smoke_1" );
|
||
|
sewer_door_smoke_2 = worldspawn.getEntityKey( "script_sewer_door_smoke_2" );
|
||
|
sewer_door_maintenance = worldspawn.getEntityKey( "script_sewer_door_maintenance" );
|
||
|
sewer_door_overflow_hatch = worldspawn.getEntityKey( "script_sewer_door_overflow_hatch" );
|
||
|
flood = worldspawn.getEntityKey( "script_flood" );
|
||
|
|
||
|
objective1Arrow1.setGameTeam( gdfTeam );
|
||
|
objective1Arrow2.setGameTeam( gdfTeam );
|
||
|
objective2Arrow1.setGameTeam( gdfTeam );
|
||
|
objective2Arrow2.setGameTeam( gdfTeam );
|
||
|
|
||
|
objective1Arrow1.vStartObjective();
|
||
|
objective1Arrow2.vStartObjective();
|
||
|
objective1.vStartObjective();
|
||
|
|
||
|
objective2a.vStartObjective();
|
||
|
objective2b.vStartObjective();
|
||
|
|
||
|
objective3.vStartObjective();
|
||
|
|
||
|
strogg_triggerHurt_spillway_1 = worldspawn.getEntityKey( "script_strogg_trigger_hurt_spillway_1" );
|
||
|
strogg_triggerHurt_spillway_2 = worldspawn.getEntityKey( "script_strogg_trigger_hurt_spillway_2" );
|
||
|
strogg_triggerHurt_spillway_3 = worldspawn.getEntityKey( "script_strogg_trigger_hurt_spillway_3" );
|
||
|
strogg_trigger_hurtSewerinterior_1 = worldspawn.getEntityKey( "script_strogg_trigger_hurt_sewerinterior_1" );
|
||
|
strogg_trigger_hurtSewerinterior_2 = worldspawn.getEntityKey( "script_strogg_trigger_hurt_sewerinterior_2" );
|
||
|
strogg_trigger_hurtSewerinterior_3 = worldspawn.getEntityKey( "script_strogg_trigger_hurt_sewerinterior_3" );
|
||
|
strogg_trigger_hurtSewerinterior_4 = worldspawn.getEntityKey( "script_strogg_trigger_hurt_sewerinterior_4" );
|
||
|
strogg_trigger_hurtSewerinterior_5 = worldspawn.getEntityKey( "script_strogg_trigger_hurt_sewerinterior_5" );
|
||
|
stroggshieldSpillway = worldspawn.getEntityKey( "script_stroggshield_spillway" );
|
||
|
stroggshield_sewerInterior = worldspawn.getEntityKey( "script_stroggshield_sewer_interior" );
|
||
|
stroggshield_light_1 = worldspawn.getEntityKey( "script_stroggshield_light_interior_1" );
|
||
|
stroggshield_light_2 = worldspawn.getEntityKey( "script_stroggshield_light_interior_2" );
|
||
|
stroggshield_light_3 = worldspawn.getEntityKey( "script_stroggshield_light_interior_3" );
|
||
|
stroggshield_light_4 = worldspawn.getEntityKey( "script_stroggshield_light_interior_4" );
|
||
|
|
||
|
doorA = worldspawn.getEntityKey( "script_door_a" );
|
||
|
doorA_destroyed = worldspawn.getEntityKey( "script_door_a_destroyed" );
|
||
|
doorA.setTakesDamage( 0.0f );
|
||
|
doorA_destroyed.hide();
|
||
|
doorA_destroyed.forceDisableClip();
|
||
|
|
||
|
doorB = worldspawn.getEntityKey( "script_door_b" );
|
||
|
doorB_destroyed = worldspawn.getEntityKey( "script_door_b_destroyed" );
|
||
|
doorB.setTakesDamage( 0.0f );
|
||
|
doorB_destroyed.hide();
|
||
|
doorB_destroyed.forceDisableClip();
|
||
|
|
||
|
doorOpened = false;
|
||
|
|
||
|
sewer_door_a = worldspawn.getEntityKey( "script_sewer_door_a" );
|
||
|
sewer_door_b = worldspawn.getEntityKey( "script_sewer_door_b" );
|
||
|
sewer_door_c = worldspawn.getEntityKey( "script_sewer_door_c" );
|
||
|
|
||
|
noplant_barricade = worldspawn.getEntityKey( "script_noplant_barricade" );
|
||
|
noplant_maintenance_hatch = worldspawn.getEntityKey( "script_noplant_maintenance_hatch" );
|
||
|
noplant_overflow_hatch = worldspawn.getEntityKey( "script_noplant_overflow_hatch" );
|
||
|
noplant_north_grate = worldspawn.getEntityKey( "script_noplant_north_grate" );
|
||
|
noplant_south_grate = worldspawn.getEntityKey( "script_noplant_south_grate" );
|
||
|
|
||
|
doorDualProxy = worldspawn.getEntityKey( "script_door_dual_proxy" );
|
||
|
jammerMaterials = worldspawn.getEntityKey( "script_jammer_materials" );
|
||
|
finalObjective = worldspawn.getEntityKey( "script_final_objective" );
|
||
|
|
||
|
endCameraA = worldspawn.getEntityKey( "script_placement_camera_a" );
|
||
|
endCameraB = worldspawn.getEntityKey( "script_placement_camera_b" );
|
||
|
|
||
|
guardTower1Construction = worldspawn.getEntityKey( "script_guard_tower_1" );
|
||
|
guardTower2Construction = worldspawn.getEntityKey( "script_guard_tower_2" );
|
||
|
guardTower1 = worldspawn.getEntityKey( "script_guard_tower_1_object" );
|
||
|
guardTower2 = worldspawn.getEntityKey( "script_guard_tower_2_object" );
|
||
|
substationBarricade = worldspawn.getEntityKey( "script_substation_barricade" );
|
||
|
substationBarricadeDestroyed = worldspawn.getEntityKey( "script_substation_barricade_destroyed" );
|
||
|
|
||
|
substationBarricadeDestroyed.hide();
|
||
|
substationBarricadeDestroyed.forceDisableClip();
|
||
|
|
||
|
overflowHatch = worldspawn.getEntityKey( "script_overflow_hatch" );
|
||
|
maintenanceHatch = worldspawn.getEntityKey( "script_maintenance_hatch" );
|
||
|
|
||
|
// Bot Entities
|
||
|
|
||
|
bot_barricade = worldspawn.getEntityKey( "script_barricade_obstacle" );
|
||
|
bot_northdoor = worldspawn.getEntityKey( "script_northdoor_obstacle" );
|
||
|
bot_southdoor = worldspawn.getEntityKey( "script_southdoor_obstacle" );
|
||
|
bot_hatch = worldspawn.getEntityKey( "script_hatch_obstacle" );
|
||
|
bot_shield_sewerInterior1 = worldspawn.getEntityKey( "script_bot_shield_sewerinterior_1" );
|
||
|
bot_shield_sewerInterior2 = worldspawn.getEntityKey( "script_bot_shield_sewerinterior_2" );
|
||
|
bot_shield_sewerInterior3 = worldspawn.getEntityKey( "script_bot_shield_sewerinterior_3" );
|
||
|
bot_shield_sewerInterior4 = worldspawn.getEntityKey( "script_bot_shield_sewerinterior_4" );
|
||
|
bot_spillway1 = worldspawn.getEntityKey( "script_spillway_obstacle_1" );
|
||
|
bot_spillway2 = worldspawn.getEntityKey( "script_spillway_obstacle_2" );
|
||
|
bot_spillway3 = worldspawn.getEntityKey( "script_spillway_obstacle_3" );
|
||
|
bot_overflow = worldspawn.getEntityKey( "script_bjames_overflow_obstacle" );
|
||
|
bot_lowerdoor = worldspawn.getEntityKey( "script_sewer_newlower_obstacle" );
|
||
|
bot_sewerdoor_a = worldspawn.getEntityKey( "script_bot_obstacle_sewer_door_a" );
|
||
|
bot_sewerdoor_b = worldspawn.getEntityKey( "script_bot_obstacle_sewer_door_b" );
|
||
|
bot_sewerdoor_c = worldspawn.getEntityKey( "script_bot_obstacle_sewer_door_c" );
|
||
|
|
||
|
debug_script = sys.getCVar( "bot_debugMapScript", "1" );
|
||
|
|
||
|
CreateDeployTasks();
|
||
|
|
||
|
guardTower1Built = false;
|
||
|
guardTower2Built = false;
|
||
|
maintenanceHatchAccessible = false;
|
||
|
hutSpawnCaptured = false;
|
||
|
barricadeDestroyed = false;
|
||
|
|
||
|
gameRules.setEndGameCamera( endCameraB );
|
||
|
|
||
|
thread StartFirstObjective();
|
||
|
|
||
|
substationBarricade.vCreateMission();
|
||
|
guardTower1Construction.vCreateMission();
|
||
|
guardTower2Construction.vCreateMission();
|
||
|
|
||
|
mainObjectiveIndex = OBJECTIVE_SEWER_CONSTRUCT_JAMMER;
|
||
|
objManager.setNextObjective( gdfTeam, mainObjectiveIndex );
|
||
|
objManager.setNextObjective( stroggTeam, mainObjectiveIndex );
|
||
|
|
||
|
// Strogg only vehicle access while shields are up
|
||
|
objManager.setNodeTeam( "shield_node_1", STROGG );
|
||
|
objManager.setNodeTeam( "shield_node_2", STROGG );
|
||
|
objManager.setNodeTeam( "shield_node_3", STROGG );
|
||
|
objManager.setNodeTeam( "shield_node_4", STROGG );
|
||
|
|
||
|
// Added by MBJ - Set up Bots for first objective
|
||
|
SetupBotsObjectiveOne();
|
||
|
}
|
||
|
|
||
|
// ----------------------------------------------------------------------
|
||
|
// BOT OBJECTIVE: CONSTRUCT THE JAMMING TOWER
|
||
|
// ----------------------------------------------------------------------
|
||
|
void mapObject_Sewer::SetupBotsObjectiveOne() {
|
||
|
if ( debug_script.getBoolValue() ) {
|
||
|
sys.print( "********** BOTS SETUP FOR THE JAMMING TOWER OBJECTIVE **********\n" );
|
||
|
}
|
||
|
objManager.setAttackingTeam( GDF );
|
||
|
objManager.setBotSightDist( 3000.0f );
|
||
|
|
||
|
objManager.activateBotActionGroup( GDF_DESTROY_BARRICADE );
|
||
|
objManager.activateBotActionGroup( GDF_SUPPORT_BARRICADE );
|
||
|
objManager.activateBotActionGroup( GDF_CONSTRUCT_GUARDTOWER_BASE );
|
||
|
objManager.activateBotActionGroup( GDF_CONSTRUCT_GUARDTOWER_HUT );
|
||
|
objManager.activateBotActionGroup( GDF_DEPLOY_BARRICADE );
|
||
|
objManager.activateBotActionGroup( STROGG_DEFEND_BARRICADE );
|
||
|
objManager.activateBotActionGroup( STROGG_DEPLOY_BARRICADE );
|
||
|
objManager.activateBotActionGroup( GDF_CONSTRUCT_JAMMER );
|
||
|
objManager.activateBotActionGroup( GDF_SUPPORT_JAMMER );
|
||
|
objManager.activateBotActionGroup( STROGG_DEFEND_JAMMER );
|
||
|
objManager.activateBotActionGroup( STROGG_DEPLOY_JAMMER );
|
||
|
|
||
|
objManager.setBotCriticalClass( GDF, ENGINEER );
|
||
|
objManager.setBotCriticalClass( STROGG, ENGINEER );
|
||
|
thread NeededClassFirstObjective();
|
||
|
|
||
|
objManager.setPrimaryTeamAction( STROGG, "gdf_jammer_1" );
|
||
|
objManager.setPrimaryTeamAction( GDF, "gdf_jammer_1" );
|
||
|
objManager.setSecondaryTeamAction( GDF, "gdf_guardtower_5" );
|
||
|
//objManager.setSecondaryTeamAction( STROGG, "xxx" );
|
||
|
|
||
|
gdfTeam.setTeamRearSpawn( gdf_base_spawn );
|
||
|
objManager.setTeamUseRearSpawnPercentage( GDF, 100 );
|
||
|
objManager.setTeamUseRearSpawn( GDF, true );
|
||
|
|
||
|
stroggTeam.setTeamRearSpawn( sewer_spawn );
|
||
|
objManager.setTeamUseRearSpawnPercentage( STROGG, 50 );
|
||
|
objManager.setTeamUseRearSpawn( STROGG, true );
|
||
|
|
||
|
objManager.disableNode("barricade_dead_end" );
|
||
|
|
||
|
}
|
||
|
|
||
|
void mapObject_Sewer::NeededClassFirstObjective() {
|
||
|
sys.wait( 10 );
|
||
|
|
||
|
if ( debug_script.getBoolValue() ) {
|
||
|
sys.print( "********** SET UP CLASSES NEEDED FOR FIRST OBJECTIVE **********\n" );
|
||
|
}
|
||
|
objManager.setTeamNeededClass( GDF, ENGINEER, NOCLASS, 3, true, true );
|
||
|
objManager.setTeamNeededClass( GDF, FIELDOPS, NOCLASS, 1, true, false );
|
||
|
objManager.setTeamNeededClass( GDF, SOLDIER, NOCLASS, 2, true, false );
|
||
|
objManager.setTeamNeededClass( GDF, MEDIC, NOCLASS, 2, false, false );
|
||
|
objManager.setTeamNeededClass( STROGG, ENGINEER, NOCLASS, 2, true, true );
|
||
|
objManager.setTeamNeededClass( STROGG, MEDIC, NOCLASS, 2, true, false );
|
||
|
objManager.switchTeamWeapons( GDF, SOLDIER, -1, 6, 1 );
|
||
|
}
|
||
|
|
||
|
void mapObject_Sewer::CompleteObjective( float index, entity p ) {
|
||
|
if ( index == OBJECTIVE_SEWER_CONSTRUCT_JAMMER ) {
|
||
|
OnJammerBuilt();
|
||
|
} else if ( index == OBJECTIVE_SEWER_DESTROY_DOOR_A ) {
|
||
|
OnDoorADestroyed();
|
||
|
} else if ( index == OBJECTIVE_SEWER_DESTROY_DOOR_B ) {
|
||
|
OnDoorBDestroyed();
|
||
|
} else if ( index == OBJECTIVE_SEWER_HACK_CONTROLS ) {
|
||
|
OnControlsHacked();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void mapObject_Sewer::OnConstructionComplete( entity obj ) {
|
||
|
if ( obj == guardTower1Construction ) {
|
||
|
OnGuardTower1Built();
|
||
|
} else if ( obj == guardTower2Construction ) {
|
||
|
OnGuardTower2Built();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void mapObject_Sewer::OnDestructionComplete( entity obj ) {
|
||
|
if ( obj == guardTower1Construction ) {
|
||
|
OnGuardTower1Destroyed();
|
||
|
} else if ( obj == guardTower2Construction ) {
|
||
|
OnGuardTower2Destroyed();
|
||
|
} else if ( obj == substationBarricade ) {
|
||
|
OnSubstationBarricadeDestroyed();
|
||
|
} else if ( obj == overflowHatch ) {
|
||
|
OnOverflowHatchDestroyed();
|
||
|
} else if ( obj == maintenanceHatch ) {
|
||
|
OnMaintenanceHatchDestroyed();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
handle mapObject_Sewer::GetObjectiveMessage( float index ) {
|
||
|
if ( index == OBJECTIVE_SEWER_CONSTRUCT_JAMMER ) {
|
||
|
return sys.localizeString( "maps/sewer/obj_constructed" );
|
||
|
}
|
||
|
|
||
|
if ( index == OBJECTIVE_SEWER_DESTROY_DOOR_A ) {
|
||
|
return sys.localizeString( "maps/sewer/obj_destroyed_a" );
|
||
|
}
|
||
|
|
||
|
if ( index == OBJECTIVE_SEWER_DESTROY_DOOR_B ) {
|
||
|
return sys.localizeString( "maps/sewer/obj_destroyed_b" );
|
||
|
}
|
||
|
|
||
|
if ( index == OBJECTIVE_SEWER_HACK_CONTROLS ) {
|
||
|
return sys.localizeString( "maps/sewer/obj_hacked" );
|
||
|
}
|
||
|
|
||
|
return g_locStr_BadObjective;
|
||
|
}
|
||
|
|
||
|
// ----------------------------------------------------------------------
|
||
|
// SECONDARY OBJECTIVES: CONSTRUCTIONS AND DESTRUCTIONS
|
||
|
// ----------------------------------------------------------------------
|
||
|
void mapObject_Sewer::OnGuardTower1Built() {
|
||
|
guardTower1Built = true;
|
||
|
guardTower1Construction.vCompleteMission();
|
||
|
if ( mainObjectiveIndex < OBJECTIVE_SEWER_DESTROY_DOOR_A ) {
|
||
|
guardTower1.vCreateMission();
|
||
|
objManager.deactivateBotActionGroup( GDF_CONSTRUCT_GUARDTOWER_BASE );
|
||
|
objManager.activateBotActionGroup( ALL_GUARDTOWER_BASE );
|
||
|
BotCheckSecondaryObjectives();
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
void mapObject_Sewer::OnGuardTower1Destroyed() {
|
||
|
guardTower1Built = false;
|
||
|
guardTower1.vCompleteMission();
|
||
|
if ( mainObjectiveIndex < OBJECTIVE_SEWER_DESTROY_DOOR_A ) {
|
||
|
guardTower1Construction.vCreateMission();
|
||
|
objManager.activateBotActionGroup( GDF_CONSTRUCT_GUARDTOWER_BASE );
|
||
|
objManager.deactivateBotActionGroup( ALL_GUARDTOWER_BASE );
|
||
|
BotCheckSecondaryObjectives();
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
void mapObject_Sewer::OnGuardTower2Built() {
|
||
|
guardTower2Built = true;
|
||
|
guardTower2Construction.vCompleteMission();
|
||
|
if ( mainObjectiveIndex < OBJECTIVE_SEWER_DESTROY_DOOR_A ) {
|
||
|
guardTower2.vCreateMission();
|
||
|
objManager.deactivateBotActionGroup( GDF_CONSTRUCT_GUARDTOWER_HUT );
|
||
|
objManager.activateBotActionGroup( ALL_GUARDTOWER_HUT );
|
||
|
BotCheckSecondaryObjectives();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void mapObject_Sewer::OnGuardTower2Destroyed() {
|
||
|
guardTower2Built = false;
|
||
|
guardTower2.vCompleteMission();
|
||
|
if ( mainObjectiveIndex < OBJECTIVE_SEWER_DESTROY_DOOR_A ) {
|
||
|
guardTower2Construction.vCreateMission();
|
||
|
objManager.activateBotActionGroup( GDF_CONSTRUCT_GUARDTOWER_HUT );
|
||
|
objManager.deactivateBotActionGroup( ALL_GUARDTOWER_HUT );
|
||
|
BotCheckSecondaryObjectives();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// ----------------------------------------------------------------------
|
||
|
// BOT SECONDARY OBJECTIVE: PLANT HE CHARGE ON THE BARRICADE
|
||
|
// ----------------------------------------------------------------------
|
||
|
void mapObject_Sewer::BarricadeDestroyedThread() {
|
||
|
barricadeDestroyed = true;
|
||
|
if ( debug_script.getBoolValue() ) {
|
||
|
sys.print( "********** BOTS DESTROYED THE BARRICADE **********\n" );
|
||
|
}
|
||
|
objManager.killBotActionGroup( GDF_DESTROY_BARRICADE );
|
||
|
objManager.killBotActionGroup( GDF_SUPPORT_BARRICADE );
|
||
|
//objManager.killBotActionGroup( GDF_DEPLOY_BARRICADE );
|
||
|
objManager.killBotActionGroup( STROGG_DEFEND_BARRICADE );
|
||
|
objManager.killBotActionGroup( STROGG_DEPLOY_BARRICADE );
|
||
|
objManager.killBotAction( "strogg_mine_barricade" );
|
||
|
|
||
|
if ( mainObjectiveIndex < OBJECTIVE_SEWER_DESTROY_DOOR_A ) {
|
||
|
objManager.activateBotActionGroup( GDF_SUPPORT_SEWER_JAMMER_NEW );
|
||
|
objManager.switchTeamWeapons( GDF, SOLDIER, -1, 5, 1 );
|
||
|
BotCheckSecondaryObjectives();
|
||
|
}
|
||
|
|
||
|
objManager.enableNode("barricade_dead_end" );
|
||
|
bot_barricade.activate( bot_barricade );
|
||
|
|
||
|
substationBarricadeDestroyed.show();
|
||
|
sys.wait( 0.5f );
|
||
|
substationBarricadeDestroyed.forceEnableClip();
|
||
|
}
|
||
|
|
||
|
void mapObject_Sewer::OnSubstationBarricadeDestroyed() {
|
||
|
substationBarricade.vCompleteMission();
|
||
|
noplant_barricade.remove();
|
||
|
thread BarricadeDestroyedThread();
|
||
|
}
|
||
|
|
||
|
|
||
|
// ----------------------------------------------------------------------
|
||
|
// BOT SECONDARY OBJECTIVES: PLANT HE CHARGE ON HATCHES
|
||
|
// ----------------------------------------------------------------------
|
||
|
void mapObject_Sewer::OnOverflowHatchDestroyed() {
|
||
|
|
||
|
if ( !maintenanceHatchAccessible ) {
|
||
|
maintenanceHatchAccessible = true;
|
||
|
maintenanceHatch.vCreateMission();
|
||
|
}
|
||
|
bot_overflow.activate( bot_overflow );
|
||
|
objManager.killBotActionGroup( GDF_SEWER_DESTROY_OVERFLOW );
|
||
|
objManager.killBotAction( "overflow_disarm" );
|
||
|
|
||
|
overflowHatch.vCompleteMission();
|
||
|
noplant_overflow_hatch.remove();
|
||
|
|
||
|
sewer_door_overflow_hatch.vTriggerParticleEffect( 1 );
|
||
|
}
|
||
|
|
||
|
void mapObject_Sewer::OnMaintenanceHatchDestroyed() {
|
||
|
// Bot Obstacle Removal
|
||
|
bot_hatch.activate( bot_hatch );
|
||
|
objManager.killBotActionGroup( GDF_DESTROY_HATCH );
|
||
|
objManager.killBotAction( "mainthatch_disarm" );
|
||
|
|
||
|
maintenanceHatch.vCompleteMission();
|
||
|
noplant_maintenance_hatch.remove();
|
||
|
|
||
|
sewer_door_maintenance.vTriggerParticleEffect( 1 );
|
||
|
}
|
||
|
|
||
|
// ----------------------------------------------------------------------
|
||
|
|
||
|
void mapObject_Sewer::EMPThread() {
|
||
|
emp_charge.vTriggerParticleEffect( 1 );
|
||
|
|
||
|
sys.wait( 10.f );
|
||
|
emp_fire.vTriggerParticleEffect( 1 );
|
||
|
|
||
|
sys.wait( 5.f );
|
||
|
|
||
|
shield_down_1.vTriggerParticleEffect( 1 );
|
||
|
shield_down_2.vTriggerParticleEffect( 1 );
|
||
|
shield_down_3.vTriggerParticleEffect( 1 );
|
||
|
shield_down_4.vTriggerParticleEffect( 1 );
|
||
|
|
||
|
objManager.SetObjectiveEntity( doorDualProxy, mainObjectiveIndex );
|
||
|
|
||
|
// GDF vehicle access after shields are down
|
||
|
objManager.setNodeTeam( "shield_node_1", NOTEAM );
|
||
|
objManager.setNodeTeam( "shield_node_2", NOTEAM );
|
||
|
objManager.setNodeTeam( "shield_node_3", NOTEAM );
|
||
|
objManager.setNodeTeam( "shield_node_4", NOTEAM );
|
||
|
|
||
|
strogg_triggerHurt_spillway_1.remove();
|
||
|
strogg_triggerHurt_spillway_2.remove();
|
||
|
strogg_triggerHurt_spillway_3.remove();
|
||
|
strogg_trigger_hurtSewerinterior_1.remove();
|
||
|
strogg_trigger_hurtSewerinterior_2.remove();
|
||
|
strogg_trigger_hurtSewerinterior_3.remove();
|
||
|
strogg_trigger_hurtSewerinterior_4.remove();
|
||
|
strogg_trigger_hurtSewerinterior_5.remove();
|
||
|
stroggshieldSpillway.remove();
|
||
|
stroggshield_sewerInterior.remove();
|
||
|
stroggshield_light_1.remove();
|
||
|
stroggshield_light_2.remove();
|
||
|
stroggshield_light_3.remove();
|
||
|
stroggshield_light_4.remove();
|
||
|
// Bot Entity
|
||
|
bot_shield_sewerInterior1.activate( bot_shield_sewerInterior1 );
|
||
|
bot_shield_sewerInterior2.activate( bot_shield_sewerInterior2 );
|
||
|
bot_shield_sewerInterior3.activate( bot_shield_sewerInterior3 );
|
||
|
bot_shield_sewerInterior4.activate( bot_shield_sewerInterior4 );
|
||
|
bot_spillway1.activate( bot_spillway1 );
|
||
|
bot_spillway2.activate( bot_spillway2 );
|
||
|
bot_spillway3.activate( bot_spillway3 );
|
||
|
bot_lowerdoor.activate( bot_lowerdoor );
|
||
|
|
||
|
doorA.setTakesDamage( 1.0f );
|
||
|
doorB.setTakesDamage( 1.0f );
|
||
|
|
||
|
CreateInitialTimedMission( doorDualProxy );
|
||
|
|
||
|
doorA.vCreateMission();
|
||
|
doorB.vCreateMission();
|
||
|
|
||
|
overflowHatch.vCreateMission();
|
||
|
|
||
|
// ------------------------------------
|
||
|
// GDF BOT ACTIONS FOR SECOND OBJECTIVE
|
||
|
// ------------------------------------
|
||
|
|
||
|
objManager.activateBotActionGroup( GDF_ATTACK_SEWER );
|
||
|
objManager.activateBotActionGroup( GDF_DESTROY_SOUTH_DOOR );
|
||
|
objManager.activateBotActionGroup( GDF_DESTROY_NORTH_DOOR );
|
||
|
objManager.activateBotActionGroup( GDF_SUPPORT_SOUTH_DOOR );
|
||
|
objManager.activateBotActionGroup( GDF_SUPPORT_DOORS );
|
||
|
|
||
|
objManager.setPrimaryTeamAction( GDF, "gdf_southdoor_1" );
|
||
|
objManager.setSecondaryTeamAction( GDF, "gdf_forwardspawn_2" );
|
||
|
|
||
|
objManager.setBotCriticalClass( GDF, SOLDIER );
|
||
|
|
||
|
objManager.setTeamNeededClass( GDF, SOLDIER, NOCLASS, 3, true, true );
|
||
|
objManager.setTeamNeededClass( GDF, MEDIC, NOCLASS, 3, false, false );
|
||
|
|
||
|
gdfTeam.setTeamRearSpawn( substation_spawn );
|
||
|
objManager.setTeamUseRearSpawnPercentage( GDF, 50 );
|
||
|
|
||
|
objManager.clearTeamBotBoundEntities( GDF );
|
||
|
|
||
|
}
|
||
|
|
||
|
void mapObject_Sewer::OnJammerBuilt() {
|
||
|
mainObjectiveIndex = OBJECTIVE_SEWER_DESTROY_DOOR_A;
|
||
|
objManager.setNextObjective( gdfTeam, mainObjectiveIndex );
|
||
|
objManager.setNextObjective( stroggTeam, mainObjectiveIndex );
|
||
|
|
||
|
objective1.vFinishObjective();
|
||
|
objective1Arrow1.vFinishObjective();
|
||
|
objective1Arrow2.vFinishObjective();
|
||
|
|
||
|
objective2Arrow1.vStartObjective();
|
||
|
objective2Arrow2.vStartObjective();
|
||
|
|
||
|
substation_territory.setGameTeam( gdfTeam );
|
||
|
substation_spawn.setGameTeam( gdfTeam );
|
||
|
|
||
|
hut_capturable_spawn.vSetActive( false );
|
||
|
hut_capturable_spawn.setGameTeam( gdfTeam );
|
||
|
|
||
|
spillway_spawn.setGameTeam( $null_entity );
|
||
|
spillway_capturable_spawn.vSetActive( true );
|
||
|
|
||
|
objManager.SetObjectiveEntity( $null_entity, -1 );
|
||
|
|
||
|
jammerMaterials.vCompleteMission();
|
||
|
guardTower1.vFreeMission();
|
||
|
guardTower2.vFreeMission();
|
||
|
guardTower1Construction.vFreeMission();
|
||
|
guardTower2Construction.vFreeMission();
|
||
|
substationBarricade.vFreeMission();
|
||
|
|
||
|
StopTimedMission();
|
||
|
|
||
|
thread EMPThread();
|
||
|
|
||
|
gdf_base_territory.setActive( false );
|
||
|
spillway_territory.setActive( true );
|
||
|
|
||
|
gdfTeam.SetRespawnWait( 20 );
|
||
|
ResetRespawnTimeThread();
|
||
|
|
||
|
// ----------------------------------------------------------------------
|
||
|
// BOT OBJECTIVE: PLANT HE CHARGE ON ONE OF THE DOORS
|
||
|
// ----------------------------------------------------------------------
|
||
|
if ( debug_script.getBoolValue() ) {
|
||
|
sys.print( "********** BOTS SETUP FOR HE CHARGE OBJECTIVES **********\n" );
|
||
|
}
|
||
|
objManager.botUpdateForEvent( NOTEAM, NOCLASS, ACTION_STATE_NULL );
|
||
|
|
||
|
objManager.killBotActionGroup( GDF_SUPPORT_SEWER_JAMMER_NEW );
|
||
|
objManager.killBotActionGroup( GDF_CONSTRUCT_JAMMER );
|
||
|
objManager.killBotActionGroup( GDF_SUPPORT_JAMMER );
|
||
|
objManager.killBotActionGroup( STROGG_DEFEND_JAMMER );
|
||
|
objManager.killBotActionGroup( STROGG_DEPLOY_JAMMER );
|
||
|
objManager.killBotActionGroup( GDF_HUT_SPAWN );
|
||
|
objManager.killBotActionGroup( STROGG_HUT_SPAWN );
|
||
|
objManager.killBotActionGroup( GDF_DESTROY_BARRICADE );
|
||
|
objManager.killBotActionGroup( GDF_SUPPORT_BARRICADE );
|
||
|
objManager.killBotActionGroup( GDF_DEPLOY_BARRICADE );
|
||
|
objManager.killBotActionGroup( STROGG_DEFEND_BARRICADE );
|
||
|
objManager.killBotActionGroup( STROGG_DEPLOY_BARRICADE );
|
||
|
objManager.killBotActionGroup( GDF_CONSTRUCT_GUARDTOWER_BASE );
|
||
|
objManager.killBotActionGroup( ALL_GUARDTOWER_BASE );
|
||
|
objManager.killBotActionGroup( GDF_CONSTRUCT_GUARDTOWER_HUT );
|
||
|
objManager.killBotActionGroup( ALL_GUARDTOWER_HUT );
|
||
|
|
||
|
|
||
|
// ---------------------------------------
|
||
|
// STROGG BOT ACTIONS FOR SECOND OBJECTIVE
|
||
|
// GDF setup at end of EMPThread();
|
||
|
// ---------------------------------------
|
||
|
objManager.activateBotActionGroup( STROGG_DEFEND_SEWER );
|
||
|
objManager.activateBotActionGroup( STROGG_DEFEND_SOUTH_DOOR );
|
||
|
objManager.activateBotActionGroup( STROGG_DEPLOY_SEWER );
|
||
|
|
||
|
objManager.setBotCriticalClass( STROGG, ENGINEER );
|
||
|
objManager.setTeamNeededClass( STROGG, ENGINEER, NOCLASS, 3, true, true );
|
||
|
objManager.setTeamNeededClass( STROGG, MEDIC, NOCLASS, 2, false, false );
|
||
|
|
||
|
objManager.setPrimaryTeamAction( STROGG, "gdf_southdoor_1" );
|
||
|
}
|
||
|
|
||
|
void mapObject_Sewer::DoorADestroyedThread() {
|
||
|
doorA_destroyed.show();
|
||
|
sys.wait( 0.5f );
|
||
|
doorA_destroyed.forceEnableClip();
|
||
|
}
|
||
|
|
||
|
void mapObject_Sewer::DoorBDestroyedThread() {
|
||
|
doorB_destroyed.show();
|
||
|
sys.wait( 0.5f );
|
||
|
doorB_destroyed.forceEnableClip();
|
||
|
}
|
||
|
|
||
|
void mapObject_Sewer::OnDoorADestroyed() {
|
||
|
// SOUTH DOOR
|
||
|
bot_southdoor.activate( bot_southdoor );
|
||
|
objManager.deactivateBotActionGroup( GDF_DESTROY_SOUTH_DOOR );
|
||
|
objManager.killBotAction( "southdoor_disarm" );
|
||
|
doorA.vCompleteMission();
|
||
|
noplant_south_grate.remove();
|
||
|
OnDoorsDestroyed();
|
||
|
sewer_door_1.vTriggerParticleEffect( 1 );
|
||
|
sewer_door_smoke_1.vTriggerParticleEffect( 1 );
|
||
|
thread DoorADestroyedThread();
|
||
|
//sys.wait( 0.8f );
|
||
|
sewer_door_1_water.vTriggerParticleEffect( 1 );
|
||
|
|
||
|
objManager.setTeamNeededClass( STROGG, MEDIC, NOCLASS, 4, false, false );
|
||
|
}
|
||
|
|
||
|
void mapObject_Sewer::OnDoorBDestroyed() {
|
||
|
// NORTH DOOR
|
||
|
bot_northdoor.activate( bot_northdoor );
|
||
|
objManager.deactivateBotActionGroup( GDF_DESTROY_NORTH_DOOR );
|
||
|
objManager.killBotAction( "northdoor_disarm" );
|
||
|
doorB.vCompleteMission();
|
||
|
noplant_north_grate.remove();
|
||
|
OnDoorsDestroyed();
|
||
|
sewer_door_2.vTriggerParticleEffect( 1 );
|
||
|
thread DoorBDestroyedThread();
|
||
|
sewer_door_smoke_2.vTriggerParticleEffect( 1 );
|
||
|
|
||
|
objManager.setTeamNeededClass( STROGG, MEDIC, NOCLASS, 4, false, false );
|
||
|
}
|
||
|
|
||
|
void mapObject_Sewer::OnDoorsDestroyed() {
|
||
|
if ( !maintenanceHatchAccessible ) {
|
||
|
maintenanceHatchAccessible = true;
|
||
|
maintenanceHatch.vCreateMission();
|
||
|
}
|
||
|
if ( !doorOpened ) {
|
||
|
doorOpened = true;
|
||
|
objManager.activateBotActionGroup( GDF_DESTROY_HATCH );
|
||
|
objManager.activateBotActionGroup( GDF_SEWER_DESTROY_OVERFLOW ); //mal: was originally a part of the "JammerBuilt" event.
|
||
|
objManager.activateBotActionGroup( STROGG_OVERFLOW_DEFENCE ); // temp roams and camps so the strogg guard outside the doors
|
||
|
|
||
|
objManager.setActionPriority( "gdf_southdoor_1", false ); //mal: now that the hack obj is open, it is the priority. Dont worry so much about the grates anymore.
|
||
|
objManager.setActionPriority( "brandon_james_bot_action_32", false );
|
||
|
|
||
|
objManager.setTeamAttacksDeployables( GDF, false );
|
||
|
objManager.setTeamAttacksDeployables( STROGG, false );
|
||
|
|
||
|
mainObjectiveIndex = OBJECTIVE_SEWER_HACK_CONTROLS;
|
||
|
objManager.setNextObjective( gdfTeam, mainObjectiveIndex );
|
||
|
objManager.setNextObjective( stroggTeam, mainObjectiveIndex );
|
||
|
|
||
|
objective2a.vFinishObjective();
|
||
|
objective2b.vFinishObjective();
|
||
|
objective2Arrow1.vFinishObjective();
|
||
|
objective2Arrow2.vFinishObjective();
|
||
|
|
||
|
thread OpenDoorsFast();
|
||
|
|
||
|
/*
|
||
|
sewer_door_a.open();
|
||
|
sewer_door_b.open();
|
||
|
sewer_door_c.open();
|
||
|
*/
|
||
|
|
||
|
doorA.vFreeMission();
|
||
|
doorB.vFreeMission();
|
||
|
StopTimedMission();
|
||
|
|
||
|
objManager.SetObjectiveEntity( $null_entity, -1 );
|
||
|
|
||
|
thread StartHackObjective();
|
||
|
thread BotsHackObjective();
|
||
|
|
||
|
gdfTeam.SetRespawnWait( 20 );
|
||
|
ResetRespawnTimeThread();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// ----------------------------------------------------------------------
|
||
|
// BOT OBJECTIVE: HACK THE SEWER CONTROLS
|
||
|
// ----------------------------------------------------------------------
|
||
|
void mapObject_Sewer::BotsHackObjective() {
|
||
|
if ( debug_script.getBoolValue() ) {
|
||
|
sys.print( "********** BOTS SETUP FOR HACK OBJECTIVE **********\n" );
|
||
|
}
|
||
|
objManager.activateBotActionGroup( ALL_SEWER_CONSOLE_PREDOOR );
|
||
|
sys.wait( 20.f );
|
||
|
|
||
|
objManager.deactivateBotActionGroup( STROGG_DEFEND_SEWER );
|
||
|
objManager.activateBotActionGroup( STROGG_DEFEND_CONSOLE );
|
||
|
|
||
|
objManager.setBotCriticalClass( GDF, COVERTOPS );
|
||
|
objManager.setBotCriticalClass( STROGG, MEDIC );
|
||
|
|
||
|
objManager.setTeamNeededClass( GDF, COVERTOPS, NOCLASS, 3, true, true );
|
||
|
objManager.setTeamNeededClass( GDF, MEDIC, NOCLASS, 2, false, false );
|
||
|
objManager.setTeamNeededClass( STROGG, ENGINEER, NOCLASS, 2, false, false );
|
||
|
objManager.setTeamNeededClass( STROGG, MEDIC, NOCLASS, 2, false, true );
|
||
|
|
||
|
objManager.switchTeamWeapons( GDF, COVERTOPS, 15, 2, 0 );
|
||
|
objManager.switchTeamWeapons( STROGG, COVERTOPS, 15, 2, 1 );
|
||
|
objManager.switchTeamWeapons( STROGG, SOLDIER, -1, 5, 1 );
|
||
|
|
||
|
objManager.setPrimaryTeamAction( STROGG, "gdf_consolehack_1" );
|
||
|
objManager.setPrimaryTeamAction( GDF, "gdf_consolehack_1" );
|
||
|
objManager.setSecondaryTeamAction( GDF, "gdf_maintenancehatch_1" );
|
||
|
|
||
|
objManager.botUpdateForEvent( STROGG, NOCLASS, ACTION_STATE_NULL );
|
||
|
objManager.setBotTeamRetreatTime( STROGG, 10 );
|
||
|
|
||
|
sys.wait( 10.f ); //mal: give the strogg a head start to the defensive positions.
|
||
|
objManager.activateBotActionGroup( GDF_HACK_CONSOLE );
|
||
|
objManager.botUpdateForEvent( GDF, NOCLASS, ACTION_STATE_NULL );
|
||
|
}
|
||
|
|
||
|
// --------------------------------------------------------------------
|
||
|
|
||
|
void mapObject_Sewer::OpenDoorsFast() { //mal: experiment with the doors on a 3 second timer.
|
||
|
sys.wait( 30.f );
|
||
|
sewer_door_a.open();
|
||
|
sewer_door_b.open();
|
||
|
sewer_door_c.open();
|
||
|
bot_sewerdoor_a.activate( bot_sewerdoor_a ); // turn off bot obstacles
|
||
|
bot_sewerdoor_b.activate( bot_sewerdoor_b );
|
||
|
bot_sewerdoor_c.activate( bot_sewerdoor_c );
|
||
|
|
||
|
objManager.killBotActionGroup( STROGG_OVERFLOW_DEFENCE ); // nuke temp roams/camps now doors are open
|
||
|
objManager.activateBotActionGroup( STROGG_DEFEND_CONSOLE_INTERIOR );
|
||
|
}
|
||
|
|
||
|
void mapObject_Sewer::StartHackObjective() {
|
||
|
sys.wait( 8.f );
|
||
|
|
||
|
objManager.SetObjectiveEntity( finalObjective, mainObjectiveIndex );
|
||
|
CreateInitialTimedMission( finalObjective );
|
||
|
finalObjective.vCreateMission();
|
||
|
}
|
||
|
|
||
|
void mapObject_Sewer::OnControlsHacked() {
|
||
|
objective3.vFinishObjective();
|
||
|
|
||
|
objManager.SetObjectiveEntity( $null_entity, -1 );
|
||
|
|
||
|
finalObjective.vCompleteMission();
|
||
|
StopTimedMission();
|
||
|
|
||
|
gameRules.setEndGameCamera( endCameraA );
|
||
|
|
||
|
gameRules.setWinningTeam( gdfTeam );
|
||
|
|
||
|
flood.vTriggerParticleEffect( 1 );
|
||
|
|
||
|
thread EndMap();
|
||
|
}
|
||
|
|
||
|
void mapObject_Sewer::EndMap() {
|
||
|
sys.wait( 3.f );
|
||
|
|
||
|
objManager.PlaySound( worldspawn.getKey( "snd_gdfwin_strogg" ), stroggTeam );
|
||
|
objManager.PlaySound( worldspawn.getKey( "snd_gdfwin_gdf" ), gdfTeam );
|
||
|
|
||
|
gameRules.endGame();
|
||
|
}
|
||
|
|
||
|
void mapObject_Sewer::OnTimeLimitHit() {
|
||
|
FinishTimedMission();
|
||
|
objManager.SetObjectiveEntity( $null_entity, -1 );
|
||
|
|
||
|
objManager.PlaySound( worldspawn.getKey( "snd_gdflose_strogg" ), stroggTeam );
|
||
|
objManager.PlaySound( worldspawn.getKey( "snd_gdflose_gdf" ), gdfTeam );
|
||
|
}
|
||
|
|
||
|
void mapObject_Sewer::StartFirstObjective() {
|
||
|
sys.wait( 5.f );
|
||
|
|
||
|
objManager.SetObjectiveEntity( jammerMaterials, mainObjectiveIndex );
|
||
|
CreateInitialTimedMission( jammerMaterials );
|
||
|
jammerMaterials.vCreateMission();
|
||
|
}
|
||
|
|
||
|
// ----------------------------------------------------------------------
|
||
|
// Bot Forward Spawn Actions
|
||
|
// ----------------------------------------------------------------------
|
||
|
void mapObject_Sewer::OnSpawnCaptured( string actionName ) {
|
||
|
// Hilltop Cabin
|
||
|
if ( actionName == "gdf_forwardspawn_1" ) {
|
||
|
hutSpawnCaptured = true;
|
||
|
if ( debug_script.getBoolValue() ) {
|
||
|
sys.print( "********** GDF CAPTURED GDF SPAWN 1 **********\n" );
|
||
|
}
|
||
|
objManager.enableRoute( "bjames_gdf_hutspawn_route_start_1" );
|
||
|
objManager.enableRoute( "bjames_gdf_hutspawn_route_start_2" );
|
||
|
objManager.activateBotActionGroup( GDF_HUT_SPAWN );
|
||
|
objManager.deactivateBotActionGroup( STROGG_HUT_SPAWN );
|
||
|
BotCheckSecondaryObjectives();
|
||
|
}
|
||
|
// Spillway
|
||
|
if ( actionName == "gdf_forwardspawn_2" ) {
|
||
|
if ( debug_script.getBoolValue() ) {
|
||
|
sys.print( "********** GDF CAPTURED GDF SPAWN 2 **********\n" );
|
||
|
}
|
||
|
objManager.enableRoute( "bjames_gdf_sewerspawn_route_1" );
|
||
|
objManager.enableRoute( "bjames_gdf_sewerspawn_route_2" );
|
||
|
objManager.activateBotActionGroup( GDF_SEWER_SPAWN );
|
||
|
objManager.deactivateBotActionGroup( STROGG_SEWER_SPAWN );
|
||
|
objManager.deactivateBotActionGroup( GDF_ATTACK_SEWER );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void mapObject_Sewer::OnSpawnLiberated( string actionName ) {
|
||
|
// Hilltop Cabin
|
||
|
if ( actionName == "gdf_forwardspawn_1" ) {
|
||
|
hutSpawnCaptured = false;
|
||
|
if ( debug_script.getBoolValue() ) {
|
||
|
sys.print( "********** STROGG LIBERATED GDF SPAWN 1 **********\n" );
|
||
|
}
|
||
|
objManager.disableRoute( "bjames_gdf_hutspawn_route_start_1" );
|
||
|
objManager.disableRoute( "bjames_gdf_hutspawn_route_start_2" );
|
||
|
objManager.activateBotActionGroup( STROGG_HUT_SPAWN );
|
||
|
objManager.deactivateBotActionGroup( GDF_HUT_SPAWN );
|
||
|
BotCheckSecondaryObjectives();
|
||
|
}
|
||
|
// Spillway
|
||
|
if ( actionName == "gdf_forwardspawn_2" ) {
|
||
|
if ( debug_script.getBoolValue() ) {
|
||
|
sys.print( "********** STROGG LIBERATED GDF SPAWN 2 **********\n" );
|
||
|
}
|
||
|
objManager.disableRoute( "bjames_gdf_sewerspawn_route_1" );
|
||
|
objManager.disableRoute( "bjames_gdf_sewerspawn_route_2" );
|
||
|
objManager.activateBotActionGroup( STROGG_SEWER_SPAWN );
|
||
|
objManager.deactivateBotActionGroup( GDF_SEWER_SPAWN );
|
||
|
objManager.activateBotActionGroup( GDF_ATTACK_SEWER );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// ----------------------------------------------------------------------
|
||
|
// Bot Secondary Objectives For First Objective
|
||
|
// ----------------------------------------------------------------------
|
||
|
void mapObject_Sewer::BotCheckSecondaryObjectives() {
|
||
|
if ( mainObjectiveIndex > OBJECTIVE_SEWER_CONSTRUCT_JAMMER ) {
|
||
|
if ( debug_script.getBoolValue() ) {
|
||
|
sys.print( "********** NOT FIRST OBJECTIVE, RETURNING **********\n" );
|
||
|
}
|
||
|
return;
|
||
|
} else if ( !hutSpawnCaptured ) {
|
||
|
if ( debug_script.getBoolValue() ) {
|
||
|
sys.print( "********** SECONDARY OBJECTIVE SET TO HUT SPAWN **********\n" );
|
||
|
}
|
||
|
objManager.setSecondaryTeamAction( GDF, "gdf_forwardspawn_1" );
|
||
|
return;
|
||
|
} else if ( !guardTower1Built ) {
|
||
|
if ( debug_script.getBoolValue() ) {
|
||
|
sys.print( "********** SECONDARY OBJECTIVE SET TO BASE GUARD TOWER **********\n" );
|
||
|
}
|
||
|
objManager.setSecondaryTeamAction( GDF, "gdf_guardtower_5" );
|
||
|
return;
|
||
|
} else if ( !guardTower2Built ) {
|
||
|
if ( debug_script.getBoolValue() ) {
|
||
|
sys.print( "********** SECONDARY OBJECTIVE SET TO HUT GUARD TOWER **********\n" );
|
||
|
}
|
||
|
objManager.setSecondaryTeamAction( GDF, "gdf_guardtower_6" );
|
||
|
return;
|
||
|
} else if ( !barricadeDestroyed ) {
|
||
|
if ( debug_script.getBoolValue() ) {
|
||
|
sys.print( "********** SECONDARY OBJECTIVE SET TO BARRICADE **********\n" );
|
||
|
}
|
||
|
objManager.setSecondaryTeamAction( GDF, "gdf_barricade_1" );
|
||
|
return;
|
||
|
} else {
|
||
|
if ( debug_script.getBoolValue() ) {
|
||
|
sys.print( "********** SECONDARY OBJECTIVE SET TO HUT AVT ACTION **********\n" );
|
||
|
}
|
||
|
objManager.setSecondaryTeamAction( GDF, "hut_avt_deploy" );
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
entity mapObject_Sewer::GetSpectateEntity() {
|
||
|
if ( !jammerMaterials.vIsObjectiveComplete() ) {
|
||
|
return jammerMaterials.vGetSpectateEntity();
|
||
|
}
|
||
|
|
||
|
if ( doorA != $null_entity && doorB != $null_entity ) {
|
||
|
// second objective is the one
|
||
|
entity doorABomb = doorA.vGetSpectateEntity();
|
||
|
entity doorBBomb = doorB.vGetSpectateEntity();
|
||
|
|
||
|
if ( doorABomb != $null_entity && doorBBomb != $null_entity ) {
|
||
|
float fuseA = doorABomb.vGetFuseRemaining();
|
||
|
float fuseB = doorBBomb.vGetFuseRemaining();
|
||
|
|
||
|
if ( fuseA < fuseB ) {
|
||
|
return doorABomb;
|
||
|
} else {
|
||
|
return doorBBomb;
|
||
|
}
|
||
|
}
|
||
|
if ( doorABomb != $null_entity ) {
|
||
|
return doorABomb;
|
||
|
}
|
||
|
if ( doorBBomb != $null_entity ) {
|
||
|
return doorBBomb;
|
||
|
}
|
||
|
|
||
|
return $null_entity;
|
||
|
}
|
||
|
|
||
|
if ( !finalObjective.vIsObjectiveComplete() ) {
|
||
|
return finalObjective.vGetSpectateEntity();
|
||
|
}
|
||
|
|
||
|
return $null_entity;
|
||
|
}
|