Files
gtav-src/script/dev_ng/singleplayer/scripts/Ambient/PropertyManagement/pm_defend.sc
T
2025-09-29 00:52:08 +02:00

1837 lines
58 KiB
Python
Executable File

//|=======================================================================================|
//| Author: Lukasz Bogaj Date: 22/02/2013 |
//|=======================================================================================|
//| PM_DEFEND.sc |
//| PROPERTY MANAGEMENT DEFEND |
//|=======================================================================================|
//| Player has to protect a selected property from waves of enemies of various difficulty,|
//| number and weapons that spawn randomly in the property area. | |
//|=======================================================================================|
//Compile out Title Update changes to header functions.
//Must be before includes.
//CONST_INT USE_TU_CHANGES 0 // Removed by Kenneth R.
//|==================================== INCLUDE FILES ====================================|
USING "rage_builtins.sch"
USING "globals.sch"
USING "brains.sch"
USING "script_player.sch"
USING "commands_script.sch"
USING "properties_public.sch"
USING "script_blips.sch"
//|======================================= CONSTANTS =====================================|
CONST_INT MAX_PED_MODELS 3
CONST_INT MAX_WEAPON_MODELS 3
CONST_INT MAX_VEHCILE_MODELS 2
CONST_INT MAX_WANDER_AREAS 3
CONST_INT MAX_ENEMY_SQUADS 5
CONST_INT MAX_PEDS_IN_SQUAD 4
CONST_INT MAX_VEHICLES_IN_SQUAD 3
CONST_INT MAX_ENEMY_SPAWNPOINTS 6
CONST_INT MAX_SPAWNPOINTS_RESULTS 3
CONST_INT MAX_SPAWN_POSITIONS 10
CONST_FLOAT MAX_COMBAT_RANGE 300.0
//|===================================== END CONSTANTS ===================================|
//===================================== ENUMS & STRUCTS ==================================|
/// PURPOSE: Main states of property management defend game.
ENUM DEFEND_GAME_STATES
DEFEND_GAME_STATE_SETUP = 0,
DEFEND_GAME_STATE_RUNNING = 1,
DEFEND_GAME_STATE_END = 2
ENDENUM
ENUM DEFEND_GAME_AREA_SETUP_STATES
DEFEND_GAME_AREA_SETUP_FAR = 0,
DEFEND_GAME_AREA_SETUP_MEDIUM = 1,
DEFEND_GAME_AREA_SETUP_NEAR = 2
ENDENUM
/// PURPOSE: Difficulty levels of property management defend game.
ENUM DEFEND_GAME_DIFFICULTY
DEFEND_GAME_EASY = 0,
DEFEND_GAME_MEDIUM = 1,
DEFEND_GAME_HARD = 2
ENDENUM
/// PURPOSE: End reasons for property management defend game.
ENUM DEFEND_GAME_END_REASONS
DEFEND_GAME_NOT_FINISHED = 0,
DEFEND_GAME_AREA_DEFENDED = 1,
DEFEND_GAME_AREA_LEFT = 2
ENDENUM
/// PURPOSE: Enemy gangs in property management defend game.
ENUM DEFEND_GAME_ENEMY_GANGS
DEFEND_GAME_ENEMY_GANG_BALLAS = 0,
DEFEND_GAME_ENEMY_GANG_CULT = 1,
DEFEND_GAME_ENEMY_GANG_FAMILY = 2,
DEFEND_GAME_ENEMY_GANG_HILLBILLY = 3,
DEFEND_GAME_ENEMY_GANG_LOST = 4,
DEFEND_GAME_ENEMY_GANG_MARABUNTE = 5,
DEFEND_GAME_ENEMY_GANG_MEXICAN = 6,
DEFEND_GAME_ENEMY_GANG_SALVA = 7,
DEFEND_GAME_ENEMY_GANG_WEICHEN = 8
ENDENUM
ENUM SQUAD_TYPES
SQUAD_TYPE_STATIONARY = 0,
SQUAD_TYPE_DYNAMIC = 1
ENDENUM
/// PURPOSE:
ENUM SQUAD_STATES
SQUAD_STATE_IDLE = 0,
SQUAD_STATE_CHECKING_SPAWNPOINTS = 1,
SQUAD_STATE_SPAWNING = 2,
SQUAD_STATE_ACTIVE = 3,
SQUAD_STATE_DEAD = 4,
SQUAD_STATE_RESETTING = 5
ENDENUM
/// PURPOSE:
ENUM ENEMY_STATES
ENEMY_STATE_SPAWNING = 0,
ENEMY_STATE_ENTERING = 1,
ENEMY_STATE_UNALERTED = 2,
ENEMY_STATE_COMBAT = 3
ENDENUM
/// PURPOSE: Stores information about current property management defend game
STRUCT DEFEND_GAME_INFO
DEFEND_GAME_STATES eGameState
DEFEND_GAME_END_REASONS eGameEndReason
DEFEND_GAME_ENEMY_GANGS eEnemyGang
PROPERTY_ENUM eProperty
DEFEND_MISSION_VARIATION_ENUM eVariation
VECTOR vPropertyCenter
VECTOR vSpawnPositions[MAX_SPAWN_POSITIONS]
FLOAT fSpawnHeadings[MAX_SPAWN_POSITIONS]
INT iSpawnPositions
INT iSetupProgress
REL_GROUP_HASH RelGroupHash
MODEL_NAMES PedModels[MAX_PED_MODELS]
MODEL_NAMES VehicleModels[MAX_VEHCILE_MODELS]
WEAPON_TYPE WeaponTypes[MAX_WEAPON_MODELS]
INT iStationaryPeds
INT iStationaryVehicles
INT iStationaryPedsSpawned
INT iStationaryVehiclesSpawned
INT iSquadIterator
INT iRequiredKills
INT iTotalKills
BOOL bObjectivePrinted
VECTOR vClearAreaPosition
FLOAT fClearAreaRadius
VECTOR vScenarioBlockingAreaPosition
VECTOR vScenarioBlockingAreaSize
SCENARIO_BLOCKING_INDEX ScenarioBlockingIndex
INT iProgress
BOOL bEnemiesAlerted
STRING sMusicEventStart
STRING sMusicEventGunfight
STRING sMusicEventStop
STRING sMusicEventFail
BOOL bMusicEventStartTriggered
BOOL bMusicEventGunfightTriggered
ENDSTRUCT
STRUCT SPAWN_DATA
INT iNumOfResults
FLOAT fSpawnSearchResults[MAX_SPAWNPOINTS_RESULTS]
VECTOR vSpawnSearchResults[MAX_SPAWNPOINTS_RESULTS]
ENDSTRUCT
STRUCT PED_INFO
PED_INDEX PedIndex
AI_BLIP_STRUCT EnemyBlipData
ENEMY_STATES eEnemyState
VECTOR vPosition
FLOAT fHeading
MODEL_NAMES ModelName
WEAPON_TYPE WeaponType
BOOL bHasTask
INT iTimer
INT iSquadVehicle = -1
VEHICLE_SEAT eVehicleSeat
ENDSTRUCT
STRUCT VEHICLE_INFO
VEHICLE_INDEX VehicleIndex
VECTOR vPosition
VECTOR vDestination
FLOAT fHeading
MODEL_NAMES ModelName
ENDSTRUCT
STRUCT ENEMY_SQUAD_INFO
SQUAD_TYPES eType
SQUAD_STATES eSquadState
PED_INFO Peds[MAX_PEDS_IN_SQUAD]
VEHICLE_INFO Vehicles[MAX_VEHICLES_IN_SQUAD]
INT iNumberOfPeds
INT iNumberOfVehicles
INT iPedsSpawned
INT iVehiclesSpawned
INT iPedsKilled
INT iTrigger
INT iLeader
VECTOR vSpawnPosition
FLOAT fSpawnHeading
ENDSTRUCT
STRUCT WANDER_AREA_INFO
VECTOR vPosition
FLOAT fRadius
ENDSTRUCT
//=================================== END ENUMS & STRUCTS ================================|
//======================================== VARIABLES =====================================|
DEFEND_GAME_INFO DefendGameInfo
SPAWN_DATA SpawnData
INT iDisableReplayCameraTimer //Fix for bug 2227738
//|========================================= ARRAYS ======================================|
ENEMY_SQUAD_INFO EnemySquads[MAX_ENEMY_SQUADS]
WANDER_AREA_INFO WanderAreas[MAX_WANDER_AREAS]
//================================== FUNCTIONS & PROCEDURES ==============================|
PROC REQUEST_DEFEND_GAME_ASSETS(DEFEND_GAME_INFO GameInfo)
INT i
REPEAT MAX_PED_MODELS i
IF ( GameInfo.PedModels[i] <> DUMMY_MODEL_FOR_SCRIPT )
REQUEST_MODEL(GameInfo.PedModels[i])
ENDIF
ENDREPEAT
REPEAT MAX_VEHCILE_MODELS i
IF ( GameInfo.VehicleModels[i] <> DUMMY_MODEL_FOR_SCRIPT )
REQUEST_MODEL(GameInfo.VehicleModels[i])
REQUEST_VEHICLE_ASSET(GameInfo.VehicleModels[i])
ENDIF
ENDREPEAT
REPEAT MAX_WEAPON_MODELS i
IF ( GameInfo.WeaponTypes[i] <> WEAPONTYPE_INVALID )
REQUEST_WEAPON_ASSET(GameInfo.WeaponTypes[i])
ENDIF
ENDREPEAT
REQUEST_ADDITIONAL_TEXT("PMD", MISSION_TEXT_SLOT)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Requesting assets for property management defend game for ",
GET_PROPERTY_NAME_FOR_DEBUG(GameInfo.eProperty), ".")
#ENDIF
ENDPROC
FUNC BOOL ARE_DEFEND_GAME_ASSETS_LOADED(DEFEND_GAME_INFO GameInfo)
IF ( GameInfo.PedModels[0] = DUMMY_MODEL_FOR_SCRIPT OR HAS_MODEL_LOADED(GameInfo.PedModels[0]) )
AND ( GameInfo.PedModels[1] = DUMMY_MODEL_FOR_SCRIPT OR HAS_MODEL_LOADED(GameInfo.PedModels[1]) )
AND ( GameInfo.PedModels[2] = DUMMY_MODEL_FOR_SCRIPT OR HAS_MODEL_LOADED(GameInfo.PedModels[2]) )
AND ( GameInfo.VehicleModels[0] = DUMMY_MODEL_FOR_SCRIPT OR HAS_MODEL_LOADED(GameInfo.VehicleModels[0]) )
AND ( GameInfo.VehicleModels[1] = DUMMY_MODEL_FOR_SCRIPT OR HAS_MODEL_LOADED(GameInfo.VehicleModels[1]) )
AND ( GameInfo.VehicleModels[0] = DUMMY_MODEL_FOR_SCRIPT OR HAS_VEHICLE_ASSET_LOADED(GameInfo.VehicleModels[0]) )
AND ( GameInfo.VehicleModels[1] = DUMMY_MODEL_FOR_SCRIPT OR HAS_VEHICLE_ASSET_LOADED(GameInfo.VehicleModels[1]) )
AND ( GameInfo.WeaponTypes[0] = WEAPONTYPE_INVALID OR HAS_WEAPON_ASSET_LOADED(GameInfo.WeaponTypes[0]) )
AND ( GameInfo.WeaponTypes[1] = WEAPONTYPE_INVALID OR HAS_WEAPON_ASSET_LOADED(GameInfo.WeaponTypes[1]) )
AND ( GameInfo.WeaponTypes[2] = WEAPONTYPE_INVALID OR HAS_WEAPON_ASSET_LOADED(GameInfo.WeaponTypes[2]) )
AND HAS_ADDITIONAL_TEXT_LOADED(MISSION_TEXT_SLOT)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Assets loaded for property management defend game for ",
GET_PROPERTY_NAME_FOR_DEBUG(GameInfo.eProperty), ".")
#ENDIF
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
PROC RELEASE_DEFEND_GAME_ASSETS(DEFEND_GAME_INFO GameInfo)
INT i
REPEAT MAX_PED_MODELS i
IF ( GameInfo.PedModels[i] <> DUMMY_MODEL_FOR_SCRIPT )
SET_MODEL_AS_NO_LONGER_NEEDED(GameInfo.PedModels[i])
ENDIF
ENDREPEAT
REPEAT MAX_VEHCILE_MODELS i
IF ( GameInfo.VehicleModels[i] <> DUMMY_MODEL_FOR_SCRIPT )
SET_MODEL_AS_NO_LONGER_NEEDED(GameInfo.VehicleModels[i])
ENDIF
ENDREPEAT
REPEAT MAX_WEAPON_MODELS i
IF ( GameInfo.WeaponTypes[i] <> WEAPONTYPE_INVALID )
REMOVE_WEAPON_ASSET(GameInfo.WeaponTypes[i])
ENDIF
ENDREPEAT
ENDPROC
PROC CLEANUP_SQUAD_PED(ENEMY_SQUAD_INFO &array[], INT iSquad, INT iPed)
IF DOES_ENTITY_EXIST(array[iSquad].Peds[iPed].PedIndex)
IF NOT IS_ENTITY_DEAD(array[iSquad].Peds[iPed].PedIndex)
SET_PED_KEEP_TASK(array[iSquad].Peds[iPed].PedIndex, TRUE)
ENDIF
SET_PED_AS_NO_LONGER_NEEDED(array[iSquad].Peds[iPed].PedIndex)
CLEANUP_AI_PED_BLIP(array[iSquad].Peds[iPed].EnemyBlipData)
ENDIF
ENDPROC
PROC CLEANUP_DEFEND_GAME_PEDS(ENEMY_SQUAD_INFO &array[])
INT iSquad
INT iPed
REPEAT MAX_ENEMY_SQUADS iSquad
REPEAT MAX_PEDS_IN_SQUAD iPed
CLEANUP_SQUAD_PED(array, iSquad, iPed)
ENDREPEAT
ENDREPEAT
ENDPROC
PROC CLEANUP_DEFEND_GAME_VEHICLES(ENEMY_SQUAD_INFO &array[])
INT iSquad
INT iVehicle
REPEAT MAX_ENEMY_SQUADS iSquad
REPEAT MAX_VEHICLES_IN_SQUAD iVehicle
IF DOES_ENTITY_EXIST(array[iSquad].Vehicles[iVehicle].VehicleIndex)
SET_VEHICLE_AS_NO_LONGER_NEEDED(array[iSquad].Vehicles[iVehicle].VehicleIndex)
ENDIF
ENDREPEAT
ENDREPEAT
ENDPROC
PROC DEFEND_GAME_CLEANUP(DEFEND_GAME_INFO &GameInfo)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Starting cleanup property management defend for ", GET_PROPERTY_NAME_FOR_DEBUG(DefendGameInfo.eProperty), ".")
#ENDIF
RELEASE_DEFEND_GAME_ASSETS(GameInfo)
CLEANUP_DEFEND_GAME_PEDS(EnemySquads)
CLEANUP_DEFEND_GAME_VEHICLES(EnemySquads)
IF ( GameInfo.ScenarioBlockingIndex <> NULL )
REMOVE_SCENARIO_BLOCKING_AREA(GameInfo.ScenarioBlockingIndex)
ENDIF
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Finished cleanup property management defend for ", GET_PROPERTY_NAME_FOR_DEBUG(DefendGameInfo.eProperty), ".")
#ENDIF
TERMINATE_THIS_THREAD()
ENDPROC
PROC DEFEND_GAME_PASSED()
IF NOT IS_STRING_NULL_OR_EMPTY(DefendGameInfo.sMusicEventStop)
TRIGGER_MUSIC_EVENT(DefendGameInfo.sMusicEventStop)
ENDIF
SET_PROPERTY_MANAGEMENT_RESULT(PROPERTY_MANAGEMENT_RESULT_SUCCESS)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Property management defend for property ",
GET_PROPERTY_NAME_FOR_DEBUG(DefendGameInfo.eProperty), " passed.")
#ENDIF
DEFEND_GAME_CLEANUP(DefendGameInfo)
ENDPROC
PROC DEFEND_GAME_FAILED()
IF NOT IS_STRING_NULL_OR_EMPTY(DefendGameInfo.sMusicEventFail)
TRIGGER_MUSIC_EVENT(DefendGameInfo.sMusicEventFail)
ENDIF
SET_PROPERTY_MANAGEMENT_RESULT(PROPERTY_MANAGEMENT_RESULT_FAILURE)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Property management defend for property ",
GET_PROPERTY_NAME_FOR_DEBUG(DefendGameInfo.eProperty), " failed.")
#ENDIF
DEFEND_GAME_CLEANUP(DefendGameInfo)
ENDPROC
#IF IS_DEBUG_BUILD
DEBUGONLY PROC RUN_DEBUG_PASS_AND_FAIL_CHECK()
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_S)
DEFEND_GAME_PASSED()
ENDIF
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_F)
DEFEND_GAME_FAILED()
ENDIF
ENDPROC
DEBUGONLY FUNC STRING GET_ENEMY_STATE_NAME_FOR_DEBUG(ENEMY_STATES eEnemyState)
SWITCH eEnemyState
CASE ENEMY_STATE_SPAWNING
RETURN "ENEMY_STATE_SPAWNING"
BREAK
CASE ENEMY_STATE_ENTERING
RETURN "ENEMY_STATE_ENTERING"
BREAK
CASE ENEMY_STATE_UNALERTED
RETURN "ENEMY_STATE_UNALERTED"
BREAK
CASE ENEMY_STATE_COMBAT
RETURN "ENEMY_STATE_COMBAT"
BREAK
ENDSWITCH
RETURN "INVALID_ENEMY_STATE"
ENDFUNC
DEBUGONLY PROC DRAW_SPAWNPOINTS(DEFEND_GAME_INFO GameInfo)
INT i
REPEAT GameInfo.iSpawnPositions i
DRAW_DEBUG_SPHERE(GameInfo.vSpawnPositions[i], 0.25, 255, 0, 0, 255)
DRAW_DEBUG_TEXT_ABOVE_COORDS(GameInfo.vSpawnPositions[i], GET_STRING_FROM_INT(i), 0.3)
ENDREPEAT
ENDPROC
DEBUGONLY PROC DRAW_SQUAD_PEDS_DEBUG_INFO(ENEMY_SQUAD_INFO &array[])
INT iPed
INT iSquad
REPEAT MAX_ENEMY_SQUADS iSquad
REPEAT MAX_PEDS_IN_SQUAD iPed
DRAW_DEBUG_TEXT_ABOVE_ENTITY(array[iSquad].Peds[iPed].PedIndex, GET_ENEMY_STATE_NAME_FOR_DEBUG(array[iSquad].Peds[iPed].eEnemyState), 1.2)
DRAW_DEBUG_TEXT_ABOVE_ENTITY(array[iSquad].Peds[iPed].PedIndex, GET_STRING_FROM_INT(iSquad), 1.0)
DRAW_DEBUG_TEXT_ABOVE_ENTITY(array[iSquad].Peds[iPed].PedIndex, GET_STRING_FROM_INT(iPed), 0.8)
ENDREPEAT
ENDREPEAT
ENDPROC
#ENDIF
PROC GET_DEFEND_GAME_PED_AND_VEHCILE_NUMBERS(DEFEND_GAME_INFO &GameInfo)
INT i
REPEAT MAX_ENEMY_SQUADS i
IF ( EnemySquads[i].eType = SQUAD_TYPE_STATIONARY )
GameInfo.iStationaryPeds += EnemySquads[i].iNumberOfPeds
GameInfo.iStationaryVehicles += EnemySquads[i].iNumberOfVehicles
ENDIF
GameInfo.iRequiredKills += EnemySquads[i].iNumberOfPeds
ENDREPEAT
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": ********************** PROPERTY MANAGEMENT DEFEND GAME NUMBERS ************************")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Required kills : ", GameInfo.iRequiredKills, ".")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Stationary peds : ", GameInfo.iStationaryPeds, ".")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Stationary vehicles : ", GameInfo.iStationaryVehicles, ".")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": ***************************************************************************************")
#ENDIF
ENDPROC
PROC GET_DEFEND_GAME_MUSIC_EVENTS(DEFEND_GAME_INFO &GameInfo)
SWITCH GameInfo.eProperty
/*
CASE PROPERTY_PLANE_SCRAP_YARD
SWITCH GameInfo.eVariation
CASE DEFEND_MISSION_VARIATION_1
GameInfo.sMusicEventStart = "PM_PV1_START"
GameInfo.sMusicEventGunfight = "PM_PV1_GF"
GameInfo.sMusicEventStop = "PM_PV1_STOP"
GameInfo.sMusicEventFail = "PM_PV1_FAIL"
GameInfo.bMusicEventStartTriggered = FALSE
GameInfo.bMusicEventGunfightTriggered = FALSE
BREAK
CASE DEFEND_MISSION_VARIATION_2
GameInfo.sMusicEventStart = "PM_PV2_START"
GameInfo.sMusicEventGunfight = "PM_PV2_GF"
GameInfo.sMusicEventStop = "PM_PV2_STOP"
GameInfo.sMusicEventFail = "PM_PV2_FAIL"
GameInfo.bMusicEventStartTriggered = FALSE
GameInfo.bMusicEventGunfightTriggered = FALSE
BREAK
ENDSWITCH
BREAK
*/
CASE PROPERTY_CAR_SCRAP_YARD
SWITCH GameInfo.eVariation
CASE DEFEND_MISSION_VARIATION_1
GameInfo.sMusicEventStart = "PM_CV1_START"
GameInfo.sMusicEventGunfight = "PM_CV1_GF"
GameInfo.sMusicEventStop = "PM_CV1_STOP"
GameInfo.sMusicEventFail = "PM_CV1_FAIL"
GameInfo.bMusicEventStartTriggered = FALSE
GameInfo.bMusicEventGunfightTriggered = FALSE
BREAK
CASE DEFEND_MISSION_VARIATION_2
GameInfo.sMusicEventStart = "PM_CV2_START"
GameInfo.sMusicEventGunfight = "PM_CV2_GF"
GameInfo.sMusicEventStop = "PM_CV2_STOP"
GameInfo.sMusicEventFail = "PM_CV2_FAIL"
GameInfo.bMusicEventStartTriggered = FALSE
GameInfo.bMusicEventGunfightTriggered = FALSE
BREAK
ENDSWITCH
BREAK
ENDSWITCH
ENDPROC
PROC GET_DEFEND_GAME_INFO(DEFEND_GAME_INFO &GameInfo, PROPERTY_ENUM eProperty)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Starting property management defend game setup for ", GET_PROPERTY_NAME_FOR_DEBUG(eProperty), ".")
#ENDIF
SWITCH eProperty
/*
CASE PROPERTY_PLANE_SCRAP_YARD
GameInfo.eProperty = PROPERTY_PLANE_SCRAP_YARD
GameInfo.eVariation = GET_CURRENT_DEFEND_VARIATION()
GameInfo.vPropertyCenter = << 2381.66, 3093.17, 47.15 >>
GameInfo.eEnemyGang = DEFEND_GAME_ENEMY_GANG_LOST
GameInfo.PedModels[0] = G_M_Y_LOST_01
GameInfo.PedModels[1] = DUMMY_MODEL_FOR_SCRIPT
GameInfo.PedModels[2] = DUMMY_MODEL_FOR_SCRIPT
GameInfo.VehicleModels[0] = GBURRITO
GameInfo.VehicleModels[1] = HEXER
GameInfo.WeaponTypes[0] = WEAPONTYPE_PISTOL
GameInfo.WeaponTypes[1] = WEAPONTYPE_SAWNOFFSHOTGUN
GameInfo.WeaponTypes[2] = WEAPONTYPE_ASSAULTRIFLE
GameInfo.vClearAreaPosition = << 2381.66, 3093.17, 47.15 >>
GameInfo.fClearAreaRadius = 90.0
GameInfo.vScenarioBlockingAreaPosition = << 2381.66, 3093.17, 47.15 >>
GameInfo.vScenarioBlockingAreaSize = << 54.0, 68.0, 8.0>>
//block PLANE_WRECK scenario group
//allow PLANE_WRECK_DOG scenario group
GameInfo.iSpawnPositions = 10
GameInfo.vSpawnPositions[0] = <<2449.2949, 3090.4990, 46.2809>>
GameInfo.fSpawnHeadings[0] = 40.0873
GameInfo.vSpawnPositions[1] = <<2370.8997, 3140.7888, 47.2704>>
GameInfo.fSpawnHeadings[1] = 242.9508
GameInfo.vSpawnPositions[2] = << 2456.50, 3109.05, 47.24 >>
GameInfo.fSpawnHeadings[2] = 82.5337
GameInfo.vSpawnPositions[3] = <<2366.9919, 3100.9253, 46.8814>>
GameInfo.fSpawnHeadings[3] = 306.3424
GameInfo.vSpawnPositions[4] = <<2380.0427, 3142.1187, 46.6913>>
GameInfo.fSpawnHeadings[4] = 194.1393
GameInfo.vSpawnPositions[5] = <<2456.9529, 3125.1848, 47.8240>>
GameInfo.fSpawnHeadings[5] = 129.3712
GameInfo.vSpawnPositions[6] = <<2352.4404, 3099.1150, 46.9404>>
GameInfo.fSpawnHeadings[6] = 296.6261
GameInfo.vSpawnPositions[7] = <<2459.4766, 3119.7717, 47.5936>>
GameInfo.fSpawnHeadings[7] = 119.7956
GameInfo.vSpawnPositions[8] = <<2351.6853, 3090.1433, 47.0721>>
GameInfo.fSpawnHeadings[8] = 305.9977
GameInfo.vSpawnPositions[9] = << 2450.97, 3097.95, 46.66 >>
GameInfo.fSpawnHeadings[9] = 55.7607
//squads
EnemySquads[0].eType = SQUAD_TYPE_STATIONARY
EnemySquads[0].iNumberOfPeds = 4
EnemySquads[0].iNumberOfVehicles = 2
EnemySquads[0].Vehicles[0].vPosition = <<2395.8093, 3117.3870, 47.2097>>
EnemySquads[0].Vehicles[0].fHeading = 3.4938
EnemySquads[0].Vehicles[0].ModelName = GBURRITO
EnemySquads[0].Vehicles[1].vPosition = <<2377.4355, 3068.1887, 47.1528>>
EnemySquads[0].Vehicles[1].fHeading = 32.7103
EnemySquads[0].Vehicles[1].ModelName = GBURRITO
EnemySquads[0].Peds[0].vPosition = <<2398.2551, 3118.2932, 47.1679>>
EnemySquads[0].Peds[0].fHeading = 217.7723
EnemySquads[0].Peds[1].vPosition = <<2398.1587, 3115.3931, 47.1539>>
EnemySquads[0].Peds[1].fHeading = 301.8444
EnemySquads[0].Peds[2].vPosition = <<2425.1733, 3099.2117, 51.4251>>
EnemySquads[0].Peds[2].fHeading = 67.0656
EnemySquads[0].Peds[2].WeaponType = WEAPONTYPE_ASSAULTRIFLE
EnemySquads[0].Peds[3].vPosition = <<2376.8198, 3065.0352, 47.1527>>
EnemySquads[0].Peds[3].fHeading = 73.5416
EnemySquads[1].eType = SQUAD_TYPE_STATIONARY
EnemySquads[1].iNumberOfPeds = 4
EnemySquads[1].iNumberOfVehicles = 0
EnemySquads[1].Peds[0].vPosition = <<2429.7893, 3122.4861, 47.2321>>
EnemySquads[1].Peds[0].fHeading = 41.3063
EnemySquads[1].Peds[1].vPosition = <<2431.0244, 3123.6172, 47.2349>>
EnemySquads[1].Peds[1].fHeading = 66.287
EnemySquads[1].Peds[2].vPosition = <<2426.9817, 3121.6086, 47.2215>>
EnemySquads[1].Peds[2].fHeading = 343.8260
EnemySquads[1].Peds[3].vPosition = <<2404.0938, 3137.2078, 47.1533>>
EnemySquads[1].Peds[3].fHeading = 293.2100
EnemySquads[2].eType = SQUAD_TYPE_DYNAMIC
EnemySquads[2].iNumberOfPeds = 4
EnemySquads[2].iNumberOfVehicles = 1
EnemySquads[2].iTrigger = 6
EnemySquads[2].Vehicles[0].ModelName = HEXER
EnemySquads[2].Vehicles[0].vDestination = << 2403.79, 3107.63, 47.16 >>
EnemySquads[2].Peds[0].iSquadVehicle = 0
EnemySquads[2].Peds[0].eVehicleSeat = VS_DRIVER
EnemySquads[2].Peds[0].WeaponType = WEAPONTYPE_SAWNOFFSHOTGUN
EnemySquads[2].Peds[1].iSquadVehicle = 0
EnemySquads[2].Peds[1].eVehicleSeat = VS_FRONT_RIGHT
EnemySquads[2].Peds[1].WeaponType = WEAPONTYPE_PISTOL
EnemySquads[3].eType = SQUAD_TYPE_DYNAMIC
EnemySquads[3].iNumberOfPeds = 4
EnemySquads[3].iNumberOfVehicles = 0
EnemySquads[3].iTrigger = 10
EnemySquads[4].eType = SQUAD_TYPE_DYNAMIC
EnemySquads[4].iNumberOfPeds = 4
EnemySquads[4].iNumberOfVehicles = 1
EnemySquads[4].iTrigger = 14
EnemySquads[4].Vehicles[0].ModelName = GBURRITO
EnemySquads[4].Peds[0].iSquadVehicle = 0
EnemySquads[4].Peds[0].eVehicleSeat = VS_DRIVER
EnemySquads[4].Peds[0].WeaponType = WEAPONTYPE_PISTOL
EnemySquads[4].Peds[1].iSquadVehicle = 0
EnemySquads[4].Peds[1].eVehicleSeat = VS_FRONT_RIGHT
EnemySquads[4].Peds[1].WeaponType = WEAPONTYPE_PISTOL
EnemySquads[4].Peds[2].iSquadVehicle = 0
EnemySquads[4].Peds[2].eVehicleSeat = VS_BACK_LEFT
EnemySquads[4].Peds[2].WeaponType = WEAPONTYPE_ASSAULTRIFLE
EnemySquads[4].Peds[3].iSquadVehicle = 0
EnemySquads[4].Peds[3].eVehicleSeat = VS_BACK_RIGHT
EnemySquads[4].Peds[3].WeaponType = WEAPONTYPE_ASSAULTRIFLE
WanderAreas[0].vPosition = << 2424.82, 3153.86, 47.19 >>
WanderAreas[0].fRadius = 15.0
WanderAreas[1].vPosition = << 2432.83, 3112.63, 47.15 >>
WanderAreas[1].fRadius = 25.0
WanderAreas[2].vPosition = << 2365.88, 3057.55, 47.15 >>
WanderAreas[2].fRadius = 25.0
BREAK
*/
CASE PROPERTY_CAR_SCRAP_YARD
GameInfo.eProperty = PROPERTY_CAR_SCRAP_YARD
GameInfo.eVariation = GET_CURRENT_DEFEND_VARIATION()
GameInfo.vPropertyCenter = << 1533.77, -2135.35, 82.04 >>
GameInfo.eEnemyGang = DEFEND_GAME_ENEMY_GANG_LOST
GameInfo.PedModels[0] = G_M_Y_LOST_01
GameInfo.PedModels[1] = DUMMY_MODEL_FOR_SCRIPT
GameInfo.PedModels[2] = DUMMY_MODEL_FOR_SCRIPT
GameInfo.VehicleModels[0] = GBURRITO
GameInfo.VehicleModels[1] = HEXER
GameInfo.WeaponTypes[0] = WEAPONTYPE_PISTOL
GameInfo.WeaponTypes[1] = WEAPONTYPE_SAWNOFFSHOTGUN
GameInfo.WeaponTypes[2] = WEAPONTYPE_ASSAULTRIFLE
GameInfo.vClearAreaPosition = << 1533.77, -2135.35, 82.04 >>
GameInfo.fClearAreaRadius = 90.0
GameInfo.vScenarioBlockingAreaPosition = << 1533.77, -2135.35, 82.04 >>
GameInfo.vScenarioBlockingAreaSize = << 54.0, 72.0, 8.0>>
GameInfo.iSpawnPositions = 9
GameInfo.vSpawnPositions[0] = <<1578.1343, -2317.8584, 86.6360>>
GameInfo.fSpawnHeadings[0] = 36.2503
GameInfo.vSpawnPositions[1] = <<1571.4139, -2314.3787, 86.0904>>
GameInfo.fSpawnHeadings[1] = 37.4325
GameInfo.vSpawnPositions[2] = <<1555.6738, -2321.8572, 85.2531>>
GameInfo.fSpawnHeadings[2] = 2.4637
GameInfo.vSpawnPositions[3] = <<1516.6940, -1980.2734, 70.1538>>
GameInfo.fSpawnHeadings[3] = 203.6018
GameInfo.vSpawnPositions[4] = <<1505.0770, -1978.4091, 69.7940>>
GameInfo.fSpawnHeadings[4] = 217.0733
GameInfo.vSpawnPositions[5] = <<1498.1658, -1981.4690, 69.5705>>
GameInfo.fSpawnHeadings[5] = 256.7048
GameInfo.vSpawnPositions[6] = <<1670.8583, -2022.8442, 99.5899>>
GameInfo.fSpawnHeadings[6] = 142.5751
GameInfo.vSpawnPositions[7] = <<1677.0851, -2035.7852, 98.5593>>
GameInfo.fSpawnHeadings[7] = 109.2985
GameInfo.vSpawnPositions[8] = <<1659.1873, -2090.0271, 99.2239>>
GameInfo.fSpawnHeadings[8] = 9.0974
//squads
EnemySquads[0].eType = SQUAD_TYPE_STATIONARY
EnemySquads[0].iNumberOfPeds = 4
EnemySquads[0].iNumberOfVehicles = 2
EnemySquads[0].Vehicles[0].vPosition = <<1533.3752, -2087.2095, 76.0832>>
EnemySquads[0].Vehicles[0].fHeading = 152.9678
EnemySquads[0].Vehicles[0].ModelName = GBURRITO
EnemySquads[0].Vehicles[1].vPosition = <<1547.8243, -2091.3652, 76.1018>>
EnemySquads[0].Vehicles[1].fHeading = 55.5566
EnemySquads[0].Vehicles[1].ModelName = GBURRITO
EnemySquads[0].Peds[0].vPosition = <<1525.7605, -2092.8384, 76.0174>>
EnemySquads[0].Peds[0].fHeading = 232.9176
EnemySquads[0].Peds[1].vPosition = <<1527.1383, -2091.8323, 76.0310>>
EnemySquads[0].Peds[1].fHeading = 190.6337
EnemySquads[0].Peds[2].vPosition = <<1523.1084, -2115.1338, 75.6351>>
EnemySquads[0].Peds[2].fHeading = 350.4627
EnemySquads[0].Peds[3].vPosition = <<1522.6289, -2112.7676, 75.6853>>
EnemySquads[0].Peds[3].fHeading = 264.9478
EnemySquads[1].eType = SQUAD_TYPE_DYNAMIC
EnemySquads[1].iNumberOfPeds = 4
EnemySquads[1].iNumberOfVehicles = 1
EnemySquads[1].iTrigger = 2
EnemySquads[1].Vehicles[0].ModelName = GBURRITO
EnemySquads[1].Peds[0].iSquadVehicle = 0
EnemySquads[1].Peds[0].eVehicleSeat = VS_DRIVER
EnemySquads[1].Peds[0].WeaponType = WEAPONTYPE_PISTOL
EnemySquads[1].Peds[1].iSquadVehicle = 0
EnemySquads[1].Peds[1].eVehicleSeat = VS_FRONT_RIGHT
EnemySquads[1].Peds[1].WeaponType = WEAPONTYPE_PISTOL
EnemySquads[1].Peds[2].iSquadVehicle = 0
EnemySquads[1].Peds[2].eVehicleSeat = VS_BACK_LEFT
EnemySquads[1].Peds[2].WeaponType = WEAPONTYPE_ASSAULTRIFLE
EnemySquads[1].Peds[3].iSquadVehicle = 0
EnemySquads[1].Peds[3].eVehicleSeat = VS_BACK_RIGHT
EnemySquads[1].Peds[3].WeaponType = WEAPONTYPE_ASSAULTRIFLE
EnemySquads[2].eType = SQUAD_TYPE_DYNAMIC
EnemySquads[2].iNumberOfPeds = 4
EnemySquads[2].iNumberOfVehicles = 1
EnemySquads[2].iTrigger = 3
EnemySquads[2].Vehicles[0].ModelName = GBURRITO
EnemySquads[2].Peds[0].iSquadVehicle = 0
EnemySquads[2].Peds[0].eVehicleSeat = VS_DRIVER
EnemySquads[2].Peds[0].WeaponType = WEAPONTYPE_PISTOL
EnemySquads[2].Peds[1].iSquadVehicle = 0
EnemySquads[2].Peds[1].eVehicleSeat = VS_FRONT_RIGHT
EnemySquads[2].Peds[1].WeaponType = WEAPONTYPE_PISTOL
EnemySquads[2].Peds[2].iSquadVehicle = 0
EnemySquads[2].Peds[2].eVehicleSeat = VS_BACK_LEFT
EnemySquads[2].Peds[2].WeaponType = WEAPONTYPE_ASSAULTRIFLE
EnemySquads[2].Peds[3].iSquadVehicle = 0
EnemySquads[2].Peds[3].eVehicleSeat = VS_BACK_RIGHT
EnemySquads[2].Peds[3].WeaponType = WEAPONTYPE_ASSAULTRIFLE
BREAK
DEFAULT
GameInfo.eEnemyGang = DEFEND_GAME_ENEMY_GANG_MEXICAN
GameInfo.PedModels[0] = G_M_Y_MEXGOON_01
GameInfo.PedModels[1] = G_M_Y_MEXGOON_02
GameInfo.PedModels[2] = G_M_Y_MEXGOON_03
GameInfo.WeaponTypes[0] = WEAPONTYPE_PISTOL
GameInfo.WeaponTypes[1] = WEAPONTYPE_MICROSMG
GameInfo.WeaponTypes[2] = WEAPONTYPE_ASSAULTRIFLE
GameInfo.iRequiredKills = 10
BREAK
ENDSWITCH
GET_DEFEND_GAME_MUSIC_EVENTS(GameInfo)
GET_DEFEND_GAME_PED_AND_VEHCILE_NUMBERS(GameInfo)
ENDPROC
FUNC VEHICLE_INDEX CREATE_SQUAD_VEHICLE(ENEMY_SQUAD_INFO &array[], INT iSquadIndex, INT iVehicleIndex)
VEHICLE_INDEX VehicleIndex
VehicleIndex = CREATE_VEHICLE(array[iSquadIndex].Vehicles[iVehicleIndex].ModelName,
array[iSquadIndex].Vehicles[iVehicleIndex].vPosition,
array[iSquadIndex].Vehicles[iVehicleIndex].fHeading)
SET_VEHICLE_INFLUENCES_WANTED_LEVEL(VehicleIndex, FALSE)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created squad ", iSquadIndex, " vehicle ", iVehicleIndex, " with model ",
GET_MODEL_NAME_FOR_DEBUG(GET_ENTITY_MODEL(VehicleIndex)), " at coordinates ",
array[iSquadIndex].Vehicles[iVehicleIndex].vPosition, ".")
#ENDIF
RETURN VehicleIndex
ENDFUNC
FUNC PED_INDEX CREATE_SQUAD_PED(ENEMY_SQUAD_INFO &array[], INT iSquad, INT iPed)
PED_INDEX PedIndex
PedIndex = CREATE_PED(PEDTYPE_MISSION, DefendGameInfo.PedModels[0],
array[iSquad].Peds[iPed].vPosition,
array[iSquad].Peds[iPed].fHeading)
SET_PED_DIES_WHEN_INJURED(PedIndex, TRUE)
SET_PED_AS_ENEMY(PedIndex, TRUE)
SET_PED_RELATIONSHIP_GROUP_HASH(PedIndex, DefendGameInfo.RelGroupHash)
SET_ENTITY_IS_TARGET_PRIORITY(PedIndex, TRUE)
SET_PED_COMBAT_ATTRIBUTES(PedIndex, CA_ALWAYS_FIGHT, TRUE)
SET_PED_TARGET_LOSS_RESPONSE(PedIndex, TLR_NEVER_LOSE_TARGET)
SET_PED_CONFIG_FLAG(PedIndex, PCF_DontInfluenceWantedLevel, TRUE)
SET_PED_CONFIG_FLAG(PedIndex, PCF_KeepRelationshipGroupAfterCleanUp, TRUE)
SET_COMBAT_FLOAT(PedIndex, CCF_TIME_TO_INVALIDATE_INJURED_TARGET, 30.0)
//set the enemy ped accuracy low in general for now
SET_PED_ACCURACY(PedIndex, 5)
IF (array[iSquad].Peds[iPed].iSquadVehicle <> -1)
AND (array[iSquad].Peds[iPed].eVehicleSeat <> VS_ANY_PASSENGER)
INT i
i = array[iSquad].Peds[iPed].iSquadVehicle
IF DOES_ENTITY_EXIST(array[iSquad].Vehicles[i].VehicleIndex)
IF NOT IS_ENTITY_DEAD(array[iSquad].Vehicles[i].VehicleIndex)
SET_PED_INTO_VEHICLE(PedIndex, array[iSquad].Vehicles[i].VehicleIndex, array[iSquad].Peds[iPed].eVehicleSeat)
ENDIF
ENDIF
ENDIF
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created squad ", iSquad, " ped ", iPed, " with model ",
GET_MODEL_NAME_FOR_DEBUG(GET_ENTITY_MODEL(PedIndex)), " at coordinates ",
array[iSquad].Peds[iPed].vPosition, ".")
#ENDIF
iDisableReplayCameraTimer = GET_GAME_TIMER() + 1000 //Fix for bug 2227738
RETURN PedIndex
ENDFUNC
PROC GIVE_WEAPON_TO_ENEMY_PED(PED_INDEX PedIndex, DEFEND_GAME_INFO GameInfo, WEAPON_TYPE OverrideWeapon = WEAPONTYPE_INVALID)
IF DOES_ENTITY_EXIST(PedIndex)
IF NOT IS_ENTITY_DEAD(PedIndex)
WEAPON_TYPE eWeapon
eWeapon = GameInfo.WeaponTypes[GET_RANDOM_INT_IN_RANGE(0, 3)]
IF ( OverrideWeapon <> WEAPONTYPE_INVALID )
eWeapon = OverrideWeapon
ENDIF
GIVE_WEAPON_TO_PED(PedIndex, eWeapon, INFINITE_AMMO, TRUE)
SET_CURRENT_PED_WEAPON(PedIndex, eWeapon, TRUE)
SET_PED_INFINITE_AMMO(PedIndex, TRUE, eWeapon)
ENDIF
ENDIF
ENDPROC
PROC UPDATE_SQUAD_PED_BLIP(ENEMY_SQUAD_INFO &array[], INT iSquad, INT iPed, BOOL bPlayerDetected)
UPDATE_AI_PED_BLIP(array[iSquad].Peds[iPed].PedIndex, array[iSquad].Peds[iPed].EnemyBlipData, -1, NULL, NOT bPlayerDetected, FALSE, MAX_COMBAT_RANGE)
ENDPROC
//=========================== ENEMY SPAWNING FUNCTIONS & PROCEDURES ======================|
FUNC BOOL IS_POSITION_SAFE_FOR_ENTITY_CREATION(VECTOR vPosition, FLOAT fVehicleRadius = 6.0, FLOAT fPedRadius = 1.0, FLOAT fObjectRadius = 1.0,
FLOAT fViewRadius = 5.0, BOOL bCheckPlayerSight = TRUE, FLOAT fVisibleDistance = 120.0,
BOOL bCheckFires = TRUE, FLOAT fPlayerRadius = 25.0)
IF IS_VECTOR_ZERO(vPosition)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": IS_POSITION_SAFE_FOR_ENTITY_CREATION() - FALSE - The position is a zero vector.")
#ENDIF
RETURN FALSE
ENDIF
IF ( fVehicleRadius > 0 )
IF IS_ANY_VEHICLE_NEAR_POINT(vPosition, fVehicleRadius)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": IS_POSITION_SAFE_FOR_ENTITY_CREATION() - FALSE - A vehicle is near position ", vPosition, ".")
#ENDIF
RETURN FALSE
ENDIF
ENDIF
IF ( fPedRadius > 0 )
IF IS_ANY_PED_NEAR_POINT(<< vPosition.x, vPosition.y, vPosition.z + 1.0 >>, fPedRadius)
OR IS_ANY_PED_NEAR_POINT(vPosition, fPedRadius)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": IS_POSITION_SAFE_FOR_ENTITY_CREATION() - FALSE - A ped is near position ", vPosition, ".")
#ENDIF
RETURN FALSE
ENDIF
ENDIF
IF ( fObjectRadius > 0 )
IF IS_ANY_OBJECT_NEAR_POINT(vPosition, fObjectRadius)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": IS_POSITION_SAFE_FOR_ENTITY_CREATION() - FALSE - An object is near position ", vPosition, ".")
#ENDIF
RETURN FALSE
ENDIF
ENDIF
IF ( bCheckFires = TRUE )
IF GET_NUMBER_OF_FIRES_IN_RANGE(vPosition, 1.5) > 0
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": IS_POSITION_SAFE_FOR_ENTITY_CREATION() - FALSE - A fires is near position ", vPosition, ".")
#ENDIF
RETURN FALSE
ENDIF
ENDIF
IF ( bCheckPlayerSight = TRUE )
IF ( fViewRadius > 0 )
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), vPosition) <= fVisibleDistance + fViewRadius
IF IS_SPHERE_VISIBLE(vPosition, fViewRadius)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": IS_POSITION_SAFE_FOR_ENTITY_CREATION() - FALSE - The player can see position ", vPosition, ".")
#ENDIF
RETURN FALSE
ENDIF
ENDIF
ENDIF
ENDIF
IF ( fPlayerRadius > 0 )
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), vPosition) < fPlayerRadius
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": IS_POSITION_SAFE_FOR_ENTITY_CREATION() - FALSE - The player is near position ", vPosition, ".")
#ENDIF
RETURN FALSE
ENDIF
ENDIF
RETURN TRUE
ENDFUNC
FUNC BOOL CAN_GET_SPAWNPOINT_FOR_ENTITY_CREATION(VECTOR vCentrePosition, FLOAT fRadius, VECTOR &vReturnPosition, FLOAT &fReturnHeading)
IF NOT SPAWNPOINTS_IS_SEARCH_ACTIVE()
SPAWNPOINTS_START_SEARCH(vCentrePosition, fRadius, 5.0, SPAWNPOINTS_FLAG_MAY_SPAWN_IN_EXTERIOR, 2.0)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Starting spawnpoint search in position ", vCentrePosition, " and radius ", fRadius, ".")
#ENDIF
ELSE
IF SPAWNPOINTS_IS_SEARCH_COMPLETE()
INT k
SpawnData.iNumOfResults = 0
REPEAT MAX_SPAWNPOINTS_RESULTS k
SpawnData.fSpawnSearchResults[k] = 0.0
SpawnData.vSpawnSearchResults[k] = << 0.0, 0.0, 0.0 >>
ENDREPEAT
SpawnData.iNumOfResults = SPAWNPOINTS_GET_NUM_SEARCH_RESULTS()
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Spawnpoint search completed in position ", vCentrePosition, " and radius ", fRadius, " with ", SpawnData.iNumOfResults, " results.")
#ENDIF
IF ( SpawnData.iNumOfResults > 0 )
INT i
REPEAT SpawnData.iNumOfResults i
IF ( i < MAX_SPAWNPOINTS_RESULTS )
SPAWNPOINTS_GET_SEARCH_RESULT(i, vReturnPosition.x, vReturnPosition.y, vReturnPosition.z)
SpawnData.fSpawnSearchResults[i] = 0.0
SpawnData.vSpawnSearchResults[i] = vReturnPosition
ENDIF
ENDREPEAT
fReturnHeading = 0.0
SPAWNPOINTS_CANCEL_SEARCH()
RETURN TRUE
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL CAN_GET_SAFE_POSITION_IN_AREA_FOR_ENTITY_CREATION(VECTOR vCentrePosition, FLOAT fRadius, VECTOR &vReturnPosition,
FLOAT &fReturnHeading)
IF CAN_GET_SPAWNPOINT_FOR_ENTITY_CREATION(vCentrePosition, fRadius, vReturnPosition, fReturnHeading)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_GET_SAFE_POSITION_IN_AREA_FOR_ENTITY_CREATION() - Returning position ", vReturnPosition, " and heading ", fReturnHeading, ".")
#ENDIF
RETURN TRUE
ELSE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_GET_SAFE_POSITION_IN_AREA_FOR_ENTITY_CREATION() - Waiting for safe position and heading in area to spawn.")
#ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL CAN_GET_SAFE_POSITION_FOR_SQUAD_CREATION(VECTOR &vSquadPosition, FLOAT &fSquadHeading #IF IS_DEBUG_BUILD, INT iSquad #ENDIF)
INT i
VECTOR vRandomPosition
i = GET_RANDOM_INT_IN_RANGE(0, MAX_SPAWN_POSITIONS)
vRandomPosition = DefendGameInfo.vSpawnPositions[i]
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Picking random spawn point for squad ", iSquad, " at coords ", vRandomPosition, " and index ", i, ".")
#ENDIF
IF IS_POSITION_SAFE_FOR_ENTITY_CREATION(vRandomPosition)
vSquadPosition = vRandomPosition
fSquadHeading = DefendGameInfo.fSpawnHeadings[i]
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Selecting spawn point for squad ", iSquad, " at coords ", vSquadPosition, " and index ", i, ".")
#ENDIF
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
//========================= END ENEMY SPAWNING FUNCTIONS & PROCEDURES ====================|
PROC UPDATE_KILL_COUNTER(DEFEND_GAME_INFO &GameInfo)
GameInfo.iTotalKills++
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": ********************** PROPERTY MANAGEMENT DEFEND KILL COUNTER ************************")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Total kills : ", GameInfo.iTotalKills, ".")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Remaining kills : ", GameInfo.iRequiredKills - GameInfo.iTotalKills, ".")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": ***************************************************************************************")
#ENDIF
ENDPROC
PROC PRINT_OBJECTIVE()
IF ( DefendGameInfo.bObjectivePrinted = FALSE )
INT i
BOOL bPrinted
REPEAT MAX_PEDS_IN_SQUAD i
IF ( bPrinted = FALSE )
IF DOES_BLIP_EXIST(EnemySquads[0].Peds[i].EnemyBlipData.BlipID)
PRINT("PMD_OBJ", DEFAULT_GOD_TEXT_TIME, 1)
bPrinted = TRUE
DefendGameInfo.bObjectivePrinted = TRUE
ENDIF
ENDIF
ENDREPEAT
ENDIF
ENDPROC
PROC HANDLE_MUSIC_EVENTS()
IF ( DefendGameInfo.bMusicEventStartTriggered = FALSE )
IF ( DefendGameInfo.bObjectivePrinted = TRUE )
IF NOT IS_STRING_NULL_OR_EMPTY(DefendGameInfo.sMusicEventStart)
IF TRIGGER_MUSIC_EVENT(DefendGameInfo.sMusicEventStart)
DefendGameInfo.bMusicEventStartTriggered = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
IF ( DefendGameInfo.bMusicEventGunfightTriggered = FALSE )
IF ( DefendGameInfo.bEnemiesAlerted = TRUE )
IF NOT IS_STRING_NULL_OR_EMPTY(DefendGameInfo.sMusicEventGunfight)
IF TRIGGER_MUSIC_EVENT(DefendGameInfo.sMusicEventGunfight)
DefendGameInfo.bMusicEventGunfightTriggered = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
PROC CLEAR_DEFEND_GAME_AREA(DEFEND_GAME_INFO &GameInfo)
IF NOT IS_VECTOR_ZERO(GameInfo.vScenarioBlockingAreaPosition)
AND NOT IS_VECTOR_ZERO(GameInfo.vScenarioBlockingAreaSize)
GameInfo.ScenarioBlockingIndex = ADD_SCENARIO_BLOCKING_AREA(
<< GameInfo.vScenarioBlockingAreaPosition.x - GameInfo.vScenarioBlockingAreaSize.x,
GameInfo.vScenarioBlockingAreaPosition.y - GameInfo.vScenarioBlockingAreaSize.y,
GameInfo.vScenarioBlockingAreaPosition.z - GameInfo.vScenarioBlockingAreaSize.z >>,
<< GameInfo.vScenarioBlockingAreaPosition.x + GameInfo.vScenarioBlockingAreaSize.x,
GameInfo.vScenarioBlockingAreaPosition.y + GameInfo.vScenarioBlockingAreaSize.y,
GameInfo.vScenarioBlockingAreaPosition.z + GameInfo.vScenarioBlockingAreaSize.z >>)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Adding scenario blocking area for property management defend game for ",
GET_PROPERTY_NAME_FOR_DEBUG(GameInfo.eProperty), ".")
#ENDIF
ENDIF
IF NOT IS_VECTOR_ZERO(GameInfo.vClearAreaPosition)
AND NOT ( GameInfo.fClearAreaRadius <= 0.0 )
CLEAR_AREA(GameInfo.vClearAreaPosition, GameInfo.fClearAreaRadius, TRUE)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Calling clear_area() area for property management defend game for ",
GET_PROPERTY_NAME_FOR_DEBUG(GameInfo.eProperty), ".")
#ENDIF
ENDIF
ENDPROC
//================================ MAIN FUNCTIONS & PROCEDURES ===========================|
FUNC BOOL CREATE_STATIONARY_SQUAD_VEHICLES(DEFEND_GAME_INFO &GameInfo)
IF ( GameInfo.iStationaryVehiclesSpawned = GameInfo.iStationaryVehicles )
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created all stationary vehicles. Created ", GameInfo.iStationaryVehiclesSpawned,
"/", GameInfo.iStationaryVehicles, " stationary vehicles.")
#ENDIF
RETURN TRUE
ELSE
IF ( EnemySquads[GameInfo.iSquadIterator].eType = SQUAD_TYPE_STATIONARY )
IF ( EnemySquads[GameInfo.iSquadIterator].iVehiclesSpawned = EnemySquads[GameInfo.iSquadIterator].iNumberOfVehicles )
GameInfo.iSquadIterator++
ELSE
INT i = EnemySquads[GameInfo.iSquadIterator].iVehiclesSpawned
IF NOT DOES_ENTITY_EXIST(EnemySquads[GameInfo.iSquadIterator].Vehicles[i].VehicleIndex)
EnemySquads[GameInfo.iSquadIterator].Vehicles[i].VehicleIndex = CREATE_SQUAD_VEHICLE(EnemySquads, GameInfo.iSquadIterator, i)
EnemySquads[GameInfo.iSquadIterator].iVehiclesSpawned++
GameInfo.iStationaryVehiclesSpawned++
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Squad ", GameInfo.iSquadIterator, " has ",
EnemySquads[GameInfo.iSquadIterator].iVehiclesSpawned, "/",
EnemySquads[GameInfo.iSquadIterator].iNumberOfVehicles, " vehicles.")
#ENDIF
ENDIF
ENDIF
ELSE
GameInfo.iSquadIterator++
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL CREATE_STATIONARY_SQUAD_PEDS(DEFEND_GAME_INFO &GameInfo)
IF ( GameInfo.iStationaryPedsSpawned = GameInfo.iStationaryPeds )
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created all stationary peds. Created ", GameInfo.iStationaryPedsSpawned,
"/", GameInfo.iStationaryPeds, " stationary peds.")
#ENDIF
RETURN TRUE
ELSE
IF ( EnemySquads[GameInfo.iSquadIterator].eType = SQUAD_TYPE_STATIONARY )
IF ( EnemySquads[GameInfo.iSquadIterator].iPedsSpawned = EnemySquads[GameInfo.iSquadIterator].iNumberOfPeds )
GameInfo.iSquadIterator++
ELSE
INT i = EnemySquads[GameInfo.iSquadIterator].iPedsSpawned
IF NOT DOES_ENTITY_EXIST(EnemySquads[GameInfo.iSquadIterator].Peds[i].PedIndex)
EnemySquads[GameInfo.iSquadIterator].Peds[i].PedIndex = CREATE_SQUAD_PED(EnemySquads, GameInfo.iSquadIterator, i)
GIVE_WEAPON_TO_ENEMY_PED(EnemySquads[GameInfo.iSquadIterator].Peds[i].PedIndex, DefendGameInfo, EnemySquads[GameInfo.iSquadIterator].Peds[i].WeaponType)
EnemySquads[GameInfo.iSquadIterator].Peds[i].eEnemyState = ENEMY_STATE_UNALERTED
EnemySquads[GameInfo.iSquadIterator].iPedsSpawned++
GameInfo.iStationaryPedsSpawned++
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Squad ", GameInfo.iSquadIterator, " has ",
EnemySquads[GameInfo.iSquadIterator].iPedsSpawned, "/",
EnemySquads[GameInfo.iSquadIterator].iNumberOfPeds, " peds.")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Total of ", GameInfo.iStationaryPedsSpawned, " stationary peds spawned.")
#ENDIF
ENDIF
ENDIF
ELSE
GameInfo.iSquadIterator++
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
PROC GIVE_STATIONARY_TASKS()
IF DOES_ENTITY_EXIST(EnemySquads[1].Peds[3].PedIndex)
IF NOT IS_ENTITY_DEAD(EnemySquads[1].Peds[3].PedIndex)
TASK_WANDER_IN_AREA(EnemySquads[1].Peds[3].PedIndex, WanderAreas[0].vPosition, WanderAreas[0].fRadius)
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(EnemySquads[1].Peds[2].PedIndex)
IF NOT IS_ENTITY_DEAD(EnemySquads[1].Peds[2].PedIndex)
TASK_WANDER_IN_AREA(EnemySquads[1].Peds[2].PedIndex, WanderAreas[1].vPosition, WanderAreas[1].fRadius)
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(EnemySquads[0].Peds[3].PedIndex)
IF NOT IS_ENTITY_DEAD(EnemySquads[0].Peds[3].PedIndex)
TASK_WANDER_IN_AREA(EnemySquads[0].Peds[3].PedIndex, WanderAreas[2].vPosition, WanderAreas[2].fRadius)
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(EnemySquads[0].Peds[2].PedIndex)
IF NOT IS_ENTITY_DEAD(EnemySquads[0].Peds[2].PedIndex)
TASK_START_SCENARIO_IN_PLACE(EnemySquads[0].Peds[2].PedIndex, "WORLD_HUMAN_BINOCULARS")
ENDIF
ENDIF
ENDPROC
FUNC BOOL CREATE_DYNAMIC_SQUAD_VEHICLES(ENEMY_SQUAD_INFO &array[], INT iSquad)
IF ( array[iSquad].iVehiclesSpawned = array[iSquad].iNumberOfVehicles )
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created all squad ", iSquad, " vehicles. Created ", array[iSquad].iVehiclesSpawned,
"/", array[iSquad].iNumberOfVehicles, " squad vehicles.")
#ENDIF
RETURN TRUE
ELSE
INT i = array[iSquad].iVehiclesSpawned
IF NOT DOES_ENTITY_EXIST(array[iSquad].Vehicles[i].VehicleIndex)
array[iSquad].Vehicles[i].vPosition = array[iSquad].vSpawnPosition
array[iSquad].Vehicles[i].fHeading = array[iSquad].fSpawnHeading
array[iSquad].Vehicles[i].VehicleIndex = CREATE_SQUAD_VEHICLE(array, iSquad, i)
array[iSquad].iVehiclesSpawned++
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Squad ", iSquad, " has ", array[iSquad].iVehiclesSpawned, "/",
array[iSquad].iNumberOfVehicles, " vehicles.")
#ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL CREATE_DYNAMIC_SQUAD_PEDS(ENEMY_SQUAD_INFO &array[], INT iSquad)
IF ( array[iSquad].iPedsSpawned = array[iSquad].iNumberOfPeds )
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created all squad ", iSquad, " peds. Created ", array[iSquad].iPedsSpawned,
"/", array[iSquad].iNumberOfPeds, " squad peds.")
#ENDIF
RETURN TRUE
ELSE
INT i = array[iSquad].iPedsSpawned
IF NOT DOES_ENTITY_EXIST(array[iSquad].Peds[i].PedIndex)
array[iSquad].Peds[i].vPosition = array[iSquad].vSpawnPosition
array[iSquad].Peds[i].fHeading = array[iSquad].fSpawnHeading
array[iSquad].Peds[i].PedIndex = CREATE_SQUAD_PED(array, iSquad, i)
GIVE_WEAPON_TO_ENEMY_PED(array[iSquad].Peds[i].PedIndex, DefendGameInfo, array[iSquad].Peds[i].WeaponType)
array[iSquad].iPedsSpawned++
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Squad ", iSquad, " has ", array[iSquad].iPedsSpawned, "/",
array[iSquad].iNumberOfPeds, " peds.")
#ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
PROC GIVE_TASKS_TO_SQUAD(ENEMY_SQUAD_INFO &array[], INT iSquad)
INT iPed
REPEAT array[iSquad].iNumberOfPeds iPed
array[iSquad].Peds[iPed].eEnemyState = ENEMY_STATE_ENTERING
ENDREPEAT
ENDPROC
PROC SETUP_DEFEND_GAME()
SWITCH DefendGameInfo.iSetupProgress
CASE 0
GET_DEFEND_GAME_INFO(DefendGameInfo, GET_CURRENT_PROPERTY_MANAGEMENT_PROPERTY())
CLEAR_DEFEND_GAME_AREA(DefendGameInfo)
DefendGameInfo.iSetupProgress++
BREAK
CASE 1
REQUEST_DEFEND_GAME_ASSETS(DefendGameInfo)
DefendGameInfo.iSetupProgress++
BREAK
CASE 2
IF ARE_DEFEND_GAME_ASSETS_LOADED(DefendGameInfo)
DefendGameInfo.iSetupProgress++
ENDIF
BREAK
CASE 3
IF ADD_RELATIONSHIP_GROUP("PMD_ENEMIES", DefendGameInfo.RelGroupHash)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, RELGROUPHASH_PLAYER, DefendGameInfo.RelGroupHash)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, DefendGameInfo.RelGroupHash, RELGROUPHASH_COP)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, DefendGameInfo.RelGroupHash, RELGROUPHASH_PLAYER)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, DefendGameInfo.RelGroupHash, DefendGameInfo.RelGroupHash)
ENDIF
DefendGameInfo.eGameState = DEFEND_GAME_STATE_RUNNING
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Finished property management defend game setup for ",
GET_PROPERTY_NAME_FOR_DEBUG(DefendGameInfo.eProperty), ".")
#ENDIF
BREAK
ENDSWITCH
ENDPROC
PROC RUN_STATIONARY_SQUADS(ENEMY_SQUAD_INFO &array[])
INT iSquad
INT iPed
REPEAT MAX_ENEMY_SQUADS iSquad
SWITCH array[iSquad].eType
CASE SQUAD_TYPE_STATIONARY //update stationary squads
REPEAT MAX_PEDS_IN_SQUAD iPed
IF DOES_ENTITY_EXIST(array[iSquad].Peds[iPed].PedIndex)
IF NOT IS_ENTITY_DEAD(array[iSquad].Peds[iPed].PedIndex)
SWITCH array[iSquad].Peds[iPed].eEnemyState
CASE ENEMY_STATE_UNALERTED
IF IS_PED_IN_COMBAT(array[iSquad].Peds[iPed].PedIndex)
OR ( DefendGameInfo.bEnemiesAlerted = TRUE )
DefendGameInfo.bEnemiesAlerted = TRUE
array[iSquad].Peds[iPed].bHasTask = FALSE
array[iSquad].Peds[iPed].eEnemyState = ENEMY_STATE_COMBAT
ENDIF
BREAK
CASE ENEMY_STATE_COMBAT
IF ( array[iSquad].Peds[iPed].bHasTask = FALSE )
TASK_COMBAT_HATED_TARGETS_AROUND_PED(array[iSquad].Peds[iPed].PedIndex, 150.0)
array[iSquad].Peds[iPed].bHasTask = TRUE
ENDIF
BREAK
ENDSWITCH
UPDATE_SQUAD_PED_BLIP(array, iSquad, iPed, DefendGameInfo.bEnemiesAlerted)
ELSE
CLEANUP_SQUAD_PED(array, iSquad, iPed)
UPDATE_KILL_COUNTER(DefendGameInfo)
ENDIF
ENDIF
ENDREPEAT
BREAK
ENDSWITCH
ENDREPEAT
ENDPROC
PROC RUN_DYNAMIC_SQUADS(ENEMY_SQUAD_INFO &array[])
INT iPed
INT iSquad
VECTOR vSquadPosition
FLOAT fSquadHeading
REPEAT MAX_ENEMY_SQUADS iSquad
SWITCH array[iSquad].eType
CASE SQUAD_TYPE_DYNAMIC
SWITCH array[iSquad].eSquadState
CASE SQUAD_STATE_IDLE
IF ( DefendGameInfo.iTotalKills >= array[iSquad].iTrigger )
array[iSquad].eSquadState = SQUAD_STATE_CHECKING_SPAWNPOINTS
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Triggering dynamic squad ", iSquad, ". Squad trigger count is ",
array[iSquad].iTrigger, " and total kills are ", DefendGameInfo.iTotalKills, ".")
#ENDIF
ENDIF
BREAK
CASE SQUAD_STATE_CHECKING_SPAWNPOINTS
IF CAN_GET_SAFE_POSITION_FOR_SQUAD_CREATION(vSquadPosition, fSquadHeading #IF IS_DEBUG_BUILD, iSquad #ENDIF)
array[iSquad].eSquadState = SQUAD_STATE_SPAWNING
array[iSquad].vSpawnPosition = vSquadPosition
array[iSquad].fSpawnHeading = fSquadHeading
ENDIF
BREAK
CASE SQUAD_STATE_SPAWNING
IF CREATE_DYNAMIC_SQUAD_VEHICLES(array, iSquad)
IF CREATE_DYNAMIC_SQUAD_PEDS(array, iSquad)
GIVE_TASKS_TO_SQUAD(array, iSquad)
array[iSquad].eSquadState = SQUAD_STATE_ACTIVE
ENDIF
ENDIF
BREAK
CASE SQUAD_STATE_ACTIVE
REPEAT MAX_PEDS_IN_SQUAD iPed
IF DOES_ENTITY_EXIST(array[iSquad].Peds[iPed].PedIndex)
IF NOT IS_ENTITY_DEAD(array[iSquad].Peds[iPed].PedIndex)
SWITCH array[iSquad].Peds[iPed].eEnemyState
CASE ENEMY_STATE_ENTERING
IF ( array[iSquad].Peds[iPed].bHasTask = FALSE )
SET_PED_COMBAT_RANGE(array[iSquad].Peds[iPed].PedIndex, CR_NEAR)
SET_PED_COMBAT_MOVEMENT(array[iSquad].Peds[iPed].PedIndex, CM_WILLADVANCE)
SET_PED_COMBAT_ATTRIBUTES(array[iSquad].Peds[iPed].PedIndex, CA_USE_VEHICLE, IS_PED_IN_ANY_VEHICLE(array[iSquad].Peds[iPed].PedIndex))
SET_PED_COMBAT_ATTRIBUTES(array[iSquad].Peds[iPed].PedIndex, CA_LEAVE_VEHICLES, NOT IS_PED_IN_ANY_VEHICLE(array[iSquad].Peds[iPed].PedIndex))
IF ( array[iSquad].iLeader = iPed )
SET_COMBAT_FLOAT(array[iSquad].Peds[iPed].PedIndex, CCF_MIN_DISTANCE_TO_TARGET, 10.0)
SET_PED_COMBAT_ATTRIBUTES(array[iSquad].Peds[iPed].PedIndex, CA_MAINTAIN_MIN_DISTANCE_TO_TARGET, TRUE)
ENDIF
IF ( array[iSquad].iLeader <> iPed )
SET_PED_DEFENSIVE_SPHERE_ATTACHED_TO_PED(array[iSquad].Peds[iPed].PedIndex, array[iSquad].Peds[array[iSquad].iLeader].PedIndex,
<< 0.0, 0.0, 0.0 >>, 5.0)
ENDIF
TASK_COMBAT_HATED_TARGETS_AROUND_PED(array[iSquad].Peds[iPed].PedIndex, MAX_COMBAT_RANGE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(array[iSquad].Peds[iPed].PedIndex, FALSE)
array[iSquad].Peds[iPed].iTimer = GET_GAME_TIMER()
array[iSquad].Peds[iPed].bHasTask = TRUE
ENDIF
IF ( array[iSquad].iLeader <> iPed )
IF ( array[iSquad].Peds[iPed].iTimer <> 0 )
IF GET_GAME_TIMER() - array[iSquad].Peds[iPed].iTimer > 10000
array[iSquad].Peds[iPed].bHasTask = FALSE
array[iSquad].Peds[iPed].eEnemyState = ENEMY_STATE_COMBAT
ENDIF
ENDIF
ENDIF
IF ( array[iSquad].iLeader = iPed )
IF ( array[iSquad].Peds[iPed].iTimer <> 0 )
IF GET_GAME_TIMER() - array[iSquad].Peds[iPed].iTimer > 25000
OR GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(array[iSquad].Peds[iPed].PedIndex)) < 25.0
array[iSquad].Peds[iPed].bHasTask = FALSE
array[iSquad].Peds[iPed].eEnemyState = ENEMY_STATE_COMBAT
ENDIF
ENDIF
ENDIF
BREAK
CASE ENEMY_STATE_COMBAT
IF ( array[iSquad].Peds[iPed].bHasTask = FALSE )
REMOVE_PED_DEFENSIVE_AREA(array[iSquad].Peds[iPed].PedIndex)
SET_PED_COMBAT_MOVEMENT(array[iSquad].Peds[iPed].PedIndex, CM_WILLADVANCE)
SET_PED_COMBAT_ATTRIBUTES(array[iSquad].Peds[iPed].PedIndex, CA_USE_VEHICLE, FALSE)
SET_PED_COMBAT_ATTRIBUTES(array[iSquad].Peds[iPed].PedIndex, CA_LEAVE_VEHICLES, TRUE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(array[iSquad].Peds[iPed].PedIndex, MAX_COMBAT_RANGE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(array[iSquad].Peds[iPed].PedIndex, FALSE)
array[iSquad].Peds[iPed].bHasTask = TRUE
ENDIF
BREAK
ENDSWITCH
UPDATE_SQUAD_PED_BLIP(array, iSquad, iPed, DefendGameInfo.bEnemiesAlerted)
ELSE
CLEANUP_SQUAD_PED(array, iSquad, iPed)
UPDATE_KILL_COUNTER(DefendGameInfo)
ENDIF
ENDIF
ENDREPEAT
BREAK
ENDSWITCH
BREAK
ENDSWITCH
ENDREPEAT
ENDPROC
PROC RUN_DEFEND_GAME()
SWITCH DefendGameInfo.eProperty
CASE PROPERTY_CAR_SCRAP_YARD
REQUEST_PATH_NODES_IN_AREA_THIS_FRAME(1435.0, -2385.0, 1690.0, -1885.0)
BREAK
ENDSWITCH
SWITCH DefendGameInfo.iProgress
CASE 0
IF CREATE_STATIONARY_SQUAD_VEHICLES(DefendGameInfo)
DefendGameInfo.iSquadIterator = 0
DefendGameInfo.iProgress++
ENDIF
BREAK
CASE 1
IF CREATE_STATIONARY_SQUAD_PEDS(DefendGameInfo)
//SWITCH DefendGameInfo.eProperty
// CASE PROPERTY_PLANE_SCRAP_YARD
// GIVE_STATIONARY_TASKS()
// BREAK
//ENDSWITCH
DefendGameInfo.iSquadIterator = 0
DefendGameInfo.iProgress++
ENDIF
BREAK
CASE 2
PRINT_OBJECTIVE()
HANDLE_MUSIC_EVENTS()
RUN_STATIONARY_SQUADS(EnemySquads)
RUN_DYNAMIC_SQUADS(EnemySquads)
BREAK
ENDSWITCH
IF ( DefendGameInfo.iTotalKills >= DefendGameInfo.iRequiredKills )
DefendGameInfo.eGameState = DEFEND_GAME_STATE_END
DefendGameInfo.eGameEndReason = DEFEND_GAME_AREA_DEFENDED
ENDIF
IF GET_DISTANCE_BETWEEN_COORDS(GET_PROPERTY_PURCHASE_COORDS(DefendGameInfo.eProperty), GET_ENTITY_COORDS(PLAYER_PED_ID())) > 300.0
DefendGameInfo.eGameState = DEFEND_GAME_STATE_END
DefendGameInfo.eGameEndReason = DEFEND_GAME_AREA_LEFT
ENDIF
ENDPROC
PROC END_DEFEND_GAME()
SWITCH DefendGameInfo.eGameEndReason
CASE DEFEND_GAME_AREA_DEFENDED
DEFEND_GAME_PASSED()
BREAK
CASE DEFEND_GAME_AREA_LEFT
DEFEND_GAME_FAILED()
BREAK
ENDSWITCH
ENDPROC
//============================== END MAIN FUNCTIONS & PROCEDURES =========================|
//===================================== MAIN SCRIPT LOOP =================================|
SCRIPT
SET_MISSION_FLAG(TRUE)
IF HAS_FORCE_CLEANUP_OCCURRED()
IF NOT IS_STRING_NULL_OR_EMPTY(DefendGameInfo.sMusicEventFail)
TRIGGER_MUSIC_EVENT(DefendGameInfo.sMusicEventFail)
ENDIF
SET_PROPERTY_MANAGEMENT_RESULT(PROPERTY_MANAGEMENT_RESULT_FAILURE)
DEFEND_GAME_CLEANUP(DefendGameInfo)
ENDIF
WHILE TRUE
IF iDisableReplayCameraTimer > GET_GAME_TIMER()
REPLAY_DISABLE_CAMERA_MOVEMENT_THIS_FRAME() //Fix for bug 2227738
ENDIF
SWITCH DefendGameInfo.eGameState
CASE DEFEND_GAME_STATE_SETUP
SETUP_DEFEND_GAME()
BREAK
CASE DEFEND_GAME_STATE_RUNNING
RUN_DEFEND_GAME()
BREAK
CASE DEFEND_GAME_STATE_END
END_DEFEND_GAME()
BREAK
ENDSWITCH
#IF IS_DEBUG_BUILD
DRAW_SQUAD_PEDS_DEBUG_INFO(EnemySquads)
DRAW_SPAWNPOINTS(DefendGameInfo)
RUN_DEBUG_PASS_AND_FAIL_CHECK()
#ENDIF
WAIT(0)
ENDWHILE
ENDSCRIPT
//=================================== END MAIN SCRIPT LOOP ===============================|