18771 lines
653 KiB
Python
Executable File
18771 lines
653 KiB
Python
Executable File
//|=======================================================================================|
|
|
//| Author: Lukasz Bogaj / Bobby Wright Date: 29/06/2011 |
|
|
//|=======================================================================================|
|
|
//| MICHAEL1.sc |
|
|
//| BURY THE HATCHET |
|
|
//| |
|
|
//|=======================================================================================|
|
|
|
|
//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"
|
|
|
|
//Commands headers
|
|
USING "commands_ped.sch"
|
|
USING "commands_pad.sch"
|
|
USING "commands_misc.sch"
|
|
USING "commands_fire.sch"
|
|
USING "commands_path.sch"
|
|
USING "commands_audio.sch"
|
|
USING "commands_script.sch"
|
|
USING "commands_player.sch"
|
|
USING "commands_camera.sch"
|
|
USING "commands_object.sch"
|
|
USING "commands_graphics.sch"
|
|
USING "commands_cutscene.sch"
|
|
USING "commands_itemsets.sch"
|
|
USING "commands_interiors.sch"
|
|
USING "commands_streaming.sch"
|
|
USING "commands_recording.sch"
|
|
|
|
//Script headers
|
|
USING "script_misc.sch"
|
|
USING "script_ped.sch"
|
|
USING "script_maths.sch"
|
|
USING "script_blips.sch"
|
|
USING "script_player.sch"
|
|
USING "script_buttons.sch"
|
|
USING "script_drawing.sch"
|
|
|
|
//Public headers
|
|
USING "flow_public_core_override.sch"
|
|
USING "flow_public_game.sch"
|
|
USING "replay_public.sch"
|
|
USING "locates_public.sch"
|
|
USING "emergency_call.sch"
|
|
USING "taxi_functions.sch"
|
|
USING "cutscene_public.sch"
|
|
USING "selector_public.sch"
|
|
USING "carsteal_public.sch"
|
|
USING "dialogue_public.sch"
|
|
USING "cellphone_public.sch"
|
|
USING "player_ped_public.sch"
|
|
USING "vehicle_gen_public.sch"
|
|
USING "achievement_public.sch"
|
|
USING "mission_stat_public.sch"
|
|
USING "cheat_controller_public.sch"
|
|
USING "CompletionPercentage_public.sch"
|
|
|
|
//Debug headers
|
|
#IF IS_DEBUG_BUILD
|
|
USING "script_debug.sch"
|
|
USING "select_mission_stage.sch"
|
|
USING "scripted_cam_editor_public.sch"
|
|
#ENDIF
|
|
|
|
//|===================================== ENUMS & STRUCTS =================================|
|
|
|
|
/// PURPOSE: Specifies stages of the mission
|
|
ENUM MISSION_STAGES
|
|
MISSION_STAGE_CUTSCENE_INTRO = 0, //Intro cutscene
|
|
MISSION_STAGE_GET_TO_AIRPORT = 1, //Michael and Trevor race to their specific airports
|
|
MISSION_STAGE_FLY_TO_NORTH_YANKTON = 2, //Trevor flies to North Yankton from countryside airport, used on retry or skip
|
|
MISSION_STAGE_CUTSCENE_AIRPORT = 3, //Cutscene showing Michael at airport terminal
|
|
MISSION_STAGE_GET_TO_GRAVEYARD = 4, //Michael drives to the graveyard
|
|
MISSION_STAGE_GET_TO_GRAVE = 5, //Michael walks to the grave
|
|
MISSION_STAGE_CUTSCENE_GRAVEYARD = 6, //Cutscene at the graveyard
|
|
MISSION_STAGE_GRAVEYARD_SHOOTOUT = 7, //Shootout at the graveyard
|
|
MISSION_STAGE_CUTSCENE_KIDNAPPED = 8, //Cutscene showing Michael getting kidnapped by the triads
|
|
MISSION_STAGE_FLY_HOME = 9, //Trevor flies back home
|
|
MISSION_STAGE_END = 10, //End of mission
|
|
MISSION_STAGE_PASSED, //Mission Passed
|
|
MISSION_STAGE_FAILED //Mission Failed
|
|
ENDENUM
|
|
|
|
/// PURPOSE: Specifies mission fail reasons.
|
|
ENUM MISSION_FAILS
|
|
MISSION_FAIL_EMPTY = 0, //Generic fail
|
|
MISSION_FAIL_MICHAELS_CAR_UNDRIVABLE, //Michael's car undrivable
|
|
MISSION_FAIL_MICHAELS_CAR_DEAD, //Michael's car destroyed
|
|
MISSION_FAIL_MICHAELS_CAR_LEFT_BEHIND, //Michael's car left behind
|
|
MISSION_FAIL_GRAVEYARD_NOT_REACHED, //Michael did not reach the graveyard, drove off route to graveyard
|
|
MISSION_FAIL_GRAVE_NOT_REACHED, //Michael did not reach the grave
|
|
MISSION_FAIL_GRAVEYARD_ABANDONED, //Michael left the graveyard area during the shootout
|
|
MISSION_FAIL_TREVORS_CAR_UNDRIVABLE, //Trevor's car undrivable
|
|
MISSION_FAIL_TREVORS_CAR_DEAD, //Trevor's car destroyed
|
|
MISSION_FAIL_TREVORS_CAR_LEFT_BEHIND, //Trevor's car left behind
|
|
MISSION_FAIL_TREVORS_PLANE_UNDRIVABLE, //Trevor's plane undrivable
|
|
MISSION_FAIL_TREVORS_PLANE_DEAD, //Trevor's plane destroyed
|
|
MISSION_FAIL_MICHAEL_DEAD, //Michael dead
|
|
MISSION_FAIL_TREVOR_DEAD, //Trevor dead
|
|
MISSION_FAIL_FORCE_FAIL, //Debug forced fail
|
|
|
|
MAX_MISSION_FAILS
|
|
ENDENUM
|
|
|
|
/// PURPOSE: Specifies mission checkpoints.
|
|
ENUM MID_MISSION_STAGES
|
|
MID_MISSION_STAGE_GET_TO_AIRPORT = 0, //Checkpoint at MISSION_STAGE_GET_TO_AIRPORT
|
|
MID_MISSION_STAGE_FLY_TO_NORTH_YANKTON = 1, //Checkpoint at MISSION_STAGE_FLY_TO_NORTH_YANKTON
|
|
MID_MISSION_STAGE_GET_TO_GRAVEYARD = 2, //Checkpoint at MISSION_STAGE_GET_TO_GRAVEYARD
|
|
MID_MISSION_STAGE_GET_TO_GRAVE = 3, //Checkpoint at MISSION_STAGE_GET_TO_GRAVE
|
|
MID_MISSION_STAGE_GRAVEYARD_SHOOTOUT = 4, //Checkpoint at MISSION_STAGE_GRAVEYARD_SHOOTOUT
|
|
MID_MISSION_STAGE_FLY_HOME = 5 //Checkpoint at MISSION_STAGE_FLY_HOME
|
|
ENDENUM
|
|
|
|
HASH_ENUM GRAVEYARD_GATES
|
|
GRAVEYARD_GATE_WEST_L, //0
|
|
GRAVEYARD_GATE_WEST_R, //1
|
|
GRAVEYARD_GATE_EAST_L, //2
|
|
GRAVEYARD_GATE_EAST_R, //3
|
|
GRAVEYARD_GATE_SOUTH_L, //4
|
|
GRAVEYARD_GATE_SOUTH_R //5
|
|
ENDENUM
|
|
|
|
ENUM ENEMY_STATES
|
|
ENEMY_STATE_IDLE = 0,
|
|
ENEMY_STATE_SCRIPTED_ENTRY,
|
|
ENEMY_STATE_PATROLLING,
|
|
ENEMY_STATE_INVESTIGATING,
|
|
ENEMY_STATE_MOVING_TO_LOCATION,
|
|
ENEMY_STATE_STANDING_AT_LOCATION,
|
|
ENEMY_STATE_PERFORMING_ENEMY_ACTION,
|
|
ENEMY_STATE_WAITING_FOR_TARGET,
|
|
ENEMY_STATE_GO_TO_COORD,
|
|
ENEMY_STATE_FOLLOW_WAYPOINT_RECORDING,
|
|
ENEMY_STATE_SNIPING,
|
|
ENEMY_STATE_COMBAT
|
|
ENDENUM
|
|
|
|
ENUM DETECTED_LOCATIONS
|
|
DL_NOT_DETECTED = 0,
|
|
DL_START_AREA = 1,
|
|
DL_MIDDLE_AREA_01 = 2,
|
|
DL_MIDDLE_AREA_02 = 3,
|
|
DL_CHURCH_AREA = 4,
|
|
DL_PARKING_LOT = 5
|
|
ENDENUM
|
|
|
|
ENUM PED_CLEANUP_REASONS
|
|
PED_CLEANUP_NO_CLEANUP = 0,
|
|
PED_CLEANUP_KILLED_BY_PLAYER_AS_MICHAEL = 1,
|
|
PED_CLEANUP_KILLED_BY_VEHICLE = 2
|
|
ENDENUM
|
|
|
|
/// PURPOSE: Specifies details of mission peds.
|
|
STRUCT PED_STRUCT
|
|
PED_INDEX PedIndex //Ped Index
|
|
BLIP_INDEX BlipIndex //Ped's Blip Index
|
|
VECTOR vPosition //Ped's start location
|
|
FLOAT fHeading //Ped's start heading
|
|
MODEL_NAMES ModelName //Ped's model
|
|
VECTOR vDestination //Ped's current destination vector
|
|
INT iTimer //Ped's timer
|
|
INT iConversationTimer
|
|
INT iConversationProgress
|
|
ENDSTRUCT
|
|
|
|
/// PURPOSE: Specifies details of mission enemies.
|
|
STRUCT ENEMY_STRUCT
|
|
PED_INDEX PedIndex //Enemy Ped Index
|
|
BLIP_INDEX BlipIndex //Enemy Blip Index
|
|
AI_BLIP_STRUCT EnemyBlipData //Enemy Blip Data
|
|
ITEMSET_INDEX ItemsetIndex //Enemy Itemset Index, used for preferred cover points
|
|
BOOL bCreated //Has this enemy been created
|
|
BOOL bHasTask
|
|
BOOL bFallingBack
|
|
BOOL bSearching
|
|
INT iProgress //Enemy progress counter
|
|
INT iTimer //Enemy timer
|
|
INT iConversationTimer
|
|
ENEMY_STATES eState
|
|
PED_CLEANUP_REASONS eCleanupReason
|
|
INT iPatrolNode
|
|
BOOL bReversing
|
|
VECTOR vAimPosition
|
|
INT iWaypointProgress
|
|
#IF IS_DEBUG_BUILD
|
|
TEXT_LABEL_31 sDebugName
|
|
#ENDIF
|
|
ENDSTRUCT
|
|
|
|
/// PURPOSE: Specifies details of mission vehicles used by player or other peds.
|
|
STRUCT VEH_STRUCT
|
|
VEHICLE_INDEX VehicleIndex //Vehicle index
|
|
BLIP_INDEX BlipIndex //Vehicle blip
|
|
VECTOR vPosition //Vehicle postion
|
|
FLOAT fHeading //Vehicle heading
|
|
MODEL_NAMES ModelName //Vehicle model
|
|
INT iRecordingNumber //Vehicle recording number
|
|
INT iProgress //Vehicle progress, used for set pieces
|
|
INT iTimer //Vehicle timer
|
|
FLOAT fPlaybackSpeed //Vehicle recording playback speed
|
|
BOOL bDriverDead //Vehicle Driver dead
|
|
BOOL bAutoDriveActive //Is vehicle currently using auto drive (used after hot swap)
|
|
BOOL bSmoking
|
|
ENDSTRUCT
|
|
|
|
/// PURPOSE: Specifies details of mission specific objects.
|
|
STRUCT OBJECT_STRUCT
|
|
OBJECT_INDEX ObjectIndex //Object index
|
|
MODEL_NAMES ModelName //Object model
|
|
VECTOR vPosition //Object postion
|
|
VECTOR vRotation //Object rotation
|
|
ENDSTRUCT
|
|
|
|
/// PURPOSE: Specifies details of mission trains.
|
|
STRUCT TRAIN_STRUCT
|
|
VEHICLE_INDEX VehicleIndex
|
|
PED_INDEX PedIndex
|
|
INT iConfiguration
|
|
VECTOR vPosition
|
|
MODEL_NAMES ModelName1
|
|
MODEL_NAMES ModelName2
|
|
MODEL_NAMES ModelName3
|
|
MODEL_NAMES ModelName4
|
|
INT iProgress
|
|
ENDSTRUCT
|
|
|
|
/// PURPOSE: Specifies details of locates used in mission.
|
|
STRUCT LOCATE_STRUCT
|
|
VECTOR vPosition //Locate position
|
|
VECTOR vSize //Locate size
|
|
ENDSTRUCT
|
|
|
|
/// PURPOSE: Specifies details of script created coverpoints to use for peds in combat.
|
|
STRUCT COVERPOINT_STRUCT
|
|
COVERPOINT_INDEX CoverpointIndex //CoverpointIndex
|
|
VECTOR vPosition //Coverpoint position
|
|
FLOAT fHeading //Coverpoint heading
|
|
COVERPOINT_USAGE CoverpointUsage //Coverpoint usage
|
|
COVERPOINT_HEIGHT CoverpointHeight //Coverpoint height
|
|
COVERPOINT_ARC CoverpointArc //Coverpoint arc
|
|
FLOAT fDistance //Coverpoint distance from the start of the street
|
|
BOOL bActive //Indicates if this coverpoint should be considered when searching for nearest coverpoint
|
|
BOOL bStationary //Indicates if this coverpoint is meant for stationary combat or cover combat
|
|
BOOL bTaken //Indicates if this coverpoint is already being moved to by another ped
|
|
PED_INDEX TakenPedIndex //Points at ped who is currently moving to this coverpoint
|
|
ENDSTRUCT
|
|
|
|
/// PURPOSE: Specifies details of spheres used for extra bullets to frag tombstones in the graveyard.
|
|
STRUCT TOMBSTONE_STRUCT
|
|
VECTOR vPosition //Tombstone position
|
|
VECTOR vShootSphereCenter //Center of the sphere used for extra bullets
|
|
FLOAT fShootSphereRadius //Radius of the sphere used for extra bullets
|
|
ENDSTRUCT
|
|
|
|
/// PURPOSE: Specifies details of gate props used to block player's exit from the graveyard area.
|
|
STRUCT GATE_STRUCT
|
|
GRAVEYARD_GATES eHashEnum //Door hash enum
|
|
VECTOR vPosition //Door position
|
|
MODEL_NAMES ModelName //Door model
|
|
BOOL bClosed //Specifies if door is closed (open ratio i 0.0)
|
|
ENDSTRUCT
|
|
|
|
/// PURPOSE: Specifies details of nodes used to check if player is not driving off route when driving to Ludendorff Cemetery
|
|
STRUCT ROADNODE_STRUCT
|
|
VECTOR vPosition
|
|
BOOL bCurrent
|
|
BOOL bVisited
|
|
BOOL bInVehicleOnly
|
|
FLOAT fAllowedDistance
|
|
FLOAT fFailDistance
|
|
ENDSTRUCT
|
|
|
|
//|======================================= CONSTANTS =====================================|
|
|
|
|
CONST_INT MAX_MODELS 6
|
|
CONST_INT MAX_CAR_RECORDINGS 6
|
|
CONST_INT MAX_GRAVEYARD_GATES 6
|
|
|
|
CONST_INT CHINESEGOON1SPEAKERID 3
|
|
CONST_INT CHINESEGOON2SPEAKERID 4
|
|
CONST_INT CHINESEGOON3SPEAKERID 5
|
|
CONST_INT CHINESEGOON4SPEAKERID 6
|
|
CONST_INT CHINESEGOON5SPEAKERID 7
|
|
|
|
STRING CHINESEGOON1VOICENAME = "MCH1CHIN1"
|
|
STRING CHINESEGOON2VOICENAME = "MCH1CHIN2"
|
|
STRING CHINESEGOON3VOICENAME = "MCH1CHIN3"
|
|
STRING CHINESEGOON4VOICENAME = "MCH1CHIN4"
|
|
STRING CHINESEGOON5VOICENAME = "MCH1CHIN5"
|
|
STRING NUMBERPLATES = "LB080984"
|
|
|
|
CONST_INT ABANDON_CAR_WARNING_RANGE 25 //30
|
|
CONST_INT ABANDON_CAR_FAIL_RANGE 90
|
|
|
|
TWEAK_FLOAT TRIGGER_CALL_RANGE 6200.0
|
|
TWEAK_FLOAT PEDMOVE_SLOWRUN 1.65
|
|
TWEAK_FLOAT PEDMOVE_SLOWWALK 0.70
|
|
|
|
TWEAK_FLOAT fFirstTrainSpeed 16.0
|
|
|
|
TWEAK_INT iCameraInterpolationTimer 2750
|
|
TWEAK_FLOAT fFirstRecordingEndTime 6300.0
|
|
TWEAK_FLOAT fSecondRecordingStartTime 1500.0
|
|
TWEAK_FLOAT fSecondRecordingEndTime 8200.0
|
|
TWEAK_FLOAT fPlaneRecordingSkipTime 500.0 //9000.0
|
|
|
|
TWEAK_INT iInterpTime 3000
|
|
TWEAK_INT iCutsceneTime 8000
|
|
|
|
STRING sVehicleRecordingsFile = "michaelone"
|
|
|
|
MODEL_NAMES mnEnemy = G_M_M_CHICOLD_01
|
|
MODEL_NAMES mnEnemyVan = BURRITO5
|
|
|
|
VECTOR vInteriorPosition = << -802.46, 173.03, 71.84 >> //room: V_Michael_G_Lounge
|
|
VECTOR vGravePosition = << 3259.89, -4573.24, 117.09 >>
|
|
VECTOR vShootoutStartPosition = << 3264.36, -4569.73, 117.07 >>
|
|
VECTOR vFlightBackDestination = << 1655.24, 3237.49, 39.55 >>//<< 1705.61, 3250.92, 40.01 >> //runway //<< 1731.52, 3310.17, 40.22 >> //hangar //<< 250.0, 2000.0, 40.0 >> //map center
|
|
VECTOR vZero = << 0.0, 0.0, 0.0 >>
|
|
VECTOR vGlobalFlightOffset = << -800.0, 350.0, 0.0 >> //<< 800.0 , 800.0, 20.0>>
|
|
VECTOR vLocalPlaneOffset = << 0.0, 0.0, 0.0 >> //<< -2.0, 0.0, -1.0 >>
|
|
VECTOR vFirstTrainPosition = << 3854.3, -4896.99, 111.58 >>
|
|
VECTOR vParticleFXPosition = << 0.0, -0.250, 1.200 >>
|
|
VECTOR vParticleFXRotation = << 0.0, 0.0, 0.0 >>
|
|
|
|
VECTOR vStreamTriggerPosition1 = << 5258.50, -5119.35, 83.92 >> //<< 5398.48, -5122.27, 84.26 >>
|
|
VECTOR vStreamTriggerPosition2 = << 3851.85, -5014.12, 104.46 >> //<< 3957.56, -5042.42, 109.03 >>
|
|
VECTOR vStreamTriggerPosition3 = << 3222.89, -4708.41, 111.88 >> //<< 3217.52, -4769.19, 110.82 >>
|
|
|
|
//used for vehicle tyre popping for burrito van
|
|
VECTOR vFrontLeftOffset = <<-1.0500, 1.8000, -0.4000>>
|
|
VECTOR vFrontRightOffset = <<1.0500, 1.8000, -0.4000>>
|
|
VECTOR vRearLeftOffset = <<-1.0500, -1.9500, -0.4000>>
|
|
VECTOR vRearRightOffset = <<1.0500, -1.9500, -0.4000>>
|
|
|
|
VECTOR vFrontLeftDamageOffset = <<-1.0000, 2.3500, 0.0500>>
|
|
VECTOR vFrontRightDamageOffset = <<1.0000, 2.3500, 0.0500>>
|
|
VECTOR vRearLeftDamageOffset = <<-1.1000, -2.3500, -0.0500>>
|
|
VECTOR vRearRightDamageOffset = <<1.1000, -2.3500, -0.0500>>
|
|
|
|
VECTOR vGraveyardDefAreaPosisiton1 = <<3264.078857,-4670.798340,111.055817>>
|
|
VECTOR vGraveyardDefAreaPosistion2 = <<3266.365723,-4562.407227,121.417885>>
|
|
CONST_FLOAT fGraveyardDefAreaWidth 48.0
|
|
|
|
TWEAK_FLOAT fFocusPushHintFOV 30.0
|
|
TWEAK_FLOAT fFocusPushSideOffset 0.010
|
|
TWEAK_FLOAT fFocusPushVerticalOffset -0.025
|
|
TWEAK_FLOAT fFocusPushFollowDistanceScalar 0.400
|
|
TWEAK_FLOAT fFocusPushBaseOrbitPitchOffset -4.0
|
|
|
|
TWEAK_FLOAT fParticleFXTriggerPhase 0.445
|
|
|
|
TWEAK_INT iFirstPersonFXTime 2500
|
|
|
|
//|======================================= VARIABLES =====================================|
|
|
|
|
MISSION_STAGES eMissionStage = MISSION_STAGE_CUTSCENE_INTRO
|
|
MISSION_FAILS eMissionFail = MISSION_FAIL_EMPTY
|
|
DETECTED_LOCATIONS eDetectedLocation = DL_NOT_DETECTED
|
|
WEAPON_TYPE eMichaelsFailWeapon = WEAPONTYPE_INVALID
|
|
|
|
//mission peds
|
|
PED_STRUCT psBrad
|
|
PED_STRUCT psTrevor
|
|
PED_STRUCT psMichael
|
|
|
|
//mission vehicles
|
|
VEH_STRUCT vsMichaelsCar
|
|
VEH_STRUCT vsTrevorsCar
|
|
VEH_STRUCT vsTrevorsPlane
|
|
VEH_STRUCT vsCutsceneCar
|
|
VEHICLE_SETUP_STRUCT TrevorsVehicleData
|
|
TRAIN_STRUCT tsTrain
|
|
|
|
OBJECT_STRUCT osGolfBall
|
|
OBJECT_STRUCT osPropShovel
|
|
OBJECT_STRUCT osPropPickaxe
|
|
OBJECT_STRUCT osPropCoffin
|
|
|
|
//structs and variables for hot swap
|
|
SELECTOR_PED_STRUCT sSelectorPeds
|
|
|
|
//locates header data
|
|
LOCATES_HEADER_DATA sLocatesData
|
|
|
|
//conversation struct
|
|
structPedsForConversation sMichael1Conversation
|
|
|
|
//mission locates
|
|
LOCATE_STRUCT sLocateFlight
|
|
|
|
REL_GROUP_HASH rgEnemies
|
|
|
|
//progress counters
|
|
INT iStageSetupProgress
|
|
INT iMichaelStageProgress
|
|
INT iTrevorStageProgress
|
|
INT iMissionStageProgress
|
|
|
|
//conversation flags and timers
|
|
INT iSnowStuckTimer
|
|
INT iEnemyConversationTimer
|
|
INT iMichaelRandomConversationDelay
|
|
INT iEnemyRandomConversationDelay
|
|
BOOL bShootingConversationFlag
|
|
BOOL bPlayVanExitConversation
|
|
BOOL bPlayVanOpenConversation
|
|
BOOL bStartSearching
|
|
BOOL bEnemiesBlockedByTrain
|
|
|
|
BOOL bSkipFlag
|
|
BOOL bReplayFlag
|
|
BOOL bLoadingFlag
|
|
BOOL bCutsceneSkipped
|
|
BOOL bStageReplayInProgress
|
|
|
|
BOOL bWeaponsHelpDisplayed
|
|
BOOL bMichaelsWeaponsStored
|
|
|
|
BOOL bSnowOn
|
|
BOOL bProloguePedComponentsActive
|
|
BOOL bPrologueMapActive
|
|
BOOL bPrologueGraveIPLSwapped
|
|
BOOL bTrevorFlightActive
|
|
|
|
INT iMichaelsObjectiveTimer
|
|
|
|
BOOL bTaxiLocationSet
|
|
BOOL bShouldDisplayMichaelsObjective
|
|
BOOL bMichaelTrevorPhoneCallTriggered
|
|
BOOL bCoverpointsCreated
|
|
BOOL bVehiclePlaybackInterrupted
|
|
BOOL bGameplayCameraSet
|
|
BOOL bCutsceneTriggeredByTrevor
|
|
BOOL bCutsceneTriggeredByMichael
|
|
BOOL bSafeToStartMichaelsCall
|
|
BOOL bCamViewModeContextChanged
|
|
BOOL bFirstPersonFXTriggered
|
|
|
|
BOOL bPlayerDroveOffRoute
|
|
BOOL bPlayerUsedAlternativePath
|
|
|
|
BOOL bMusicEventTrevorPlaneTriggered
|
|
BOOL bMusicEventArrivedChurchTriggered
|
|
BOOL bMusicEventShootoutStartTriggered
|
|
BOOL bMusicEventFirstTwoDeadTriggered
|
|
BOOL bMusicEventFirstVanTriggered
|
|
BOOL bMusicEventAlertedTriggered
|
|
BOOL bMusicEventTrainTriggered
|
|
BOOL bMusicEventKidnappedTriggered
|
|
BOOL bMusicEventReadyToFlyTriggered
|
|
|
|
//enemy waves
|
|
BOOL bPlayerDetected
|
|
BOOL bDetectedConversationPlaying
|
|
BOOL bFirstEnemyWaveSpawned
|
|
BOOL bSecondEnemyWaveSpawned
|
|
BOOL bThirdEnemyWaveSpawned
|
|
BOOL bFourthEnemyWaveSpawned
|
|
BOOL bFifthEnemyWaveSpawned
|
|
BOOL bFifthEnemyWaveIgnored
|
|
|
|
BOOL bFirstEnemyReinforcementWaveSpawned
|
|
BOOL bSecondEnemyReinforcementWaveSpawned
|
|
//BOOL bThirdEnemyReinforcementWaveSpawned
|
|
|
|
INT iSecondEnemyReinforcementDelayTimer
|
|
INT iThirdEnemyReinforcementDelayTimer
|
|
|
|
BOOL bOpenGateTriggered
|
|
BOOL bSmoothCloseGateTriggered
|
|
BOOL bTrevorsCarSetAsVehicleGenVehicle
|
|
|
|
INT iLoadSceneTimer
|
|
|
|
INT iLeadInTimer
|
|
BOOL bLeadInTiggered
|
|
BOOL bPlayerPedScriptTaskInterrupted
|
|
|
|
INT iGateCloseProgress
|
|
|
|
INT iRainOnPlaneSoundID
|
|
INT iTrainBellsSoundID
|
|
INT iChurchBellsSoundID
|
|
INT iChurchBellsProgress
|
|
|
|
//asset request counters
|
|
INT iModelsRequested
|
|
INT iRecordingsRequested
|
|
|
|
INT iFirstVanTriggerTimer
|
|
INT iPlayerMichaelKills
|
|
|
|
INT iWeatherTypeTimer
|
|
BOOL bWeatherTypeOvercastSet
|
|
BOOL bWeatherTypeRainSet
|
|
BOOL bWeatherTypeThunderSet
|
|
|
|
BOOL bRenderBlips
|
|
INT bRenderBlipsTimer
|
|
|
|
FLOAT fDistanceToDestination
|
|
|
|
TEXT_LABEL sLabelGTLC = "MCH1_GTLC"
|
|
TEXT_LABEL sLabelTOBJ1 = "MCH1_GT_T1"
|
|
TEXT_LABEL sLabelTGETBCK1 = "CMN_TGETBCK"
|
|
TEXT_LABEL sLabelTOBJ2 = "MCH1_GT_T3"
|
|
TEXT_LABEL sLabelTGETIN2 = "CMN_GENGETINPL"
|
|
TEXT_LABEL sLabelTGETBCK2 = "CMN_GENGETBCKPL"
|
|
|
|
//cutscene camera
|
|
CAMERA_INDEX ScriptedCamera
|
|
|
|
//tombstone fragging
|
|
PED_INDEX TombstoneShooterPed //ped index of the ped to shoot extra bullets
|
|
INT iEnemyTombstoneShootTimer //timer used to check if extra bullets should be fired
|
|
|
|
OBJECT_INDEX WeaponMichaelObjectIndex
|
|
OBJECT_INDEX WeaponEnemyObjectIndex
|
|
|
|
INT iHealthPickupPlacementFlags
|
|
INT iPistolPickupPlacementFlags
|
|
INT iRiflePickupPlacementFlags
|
|
PICKUP_INDEX HealthPickup
|
|
PICKUP_INDEX PistolPickup
|
|
PICKUP_INDEX RiflePickup
|
|
|
|
INT iPlaneSceneID = -1
|
|
INT iBradCadaverScene = -1
|
|
INT iBradCadaverProgress
|
|
|
|
INT iTrevorDriveOutProgress
|
|
//BOOL bShouldUseDefaultTrevorsCar
|
|
|
|
INT iCutsceneTriggerTimer
|
|
BOOL bCutsceneTimeTrigger
|
|
BOOL bCutsceneProximityTrigger
|
|
|
|
BOOL bPTFXStarted
|
|
|
|
BOOL bTextMessageSent
|
|
BOOL bDamageDecalApplied, bDirtDecalApplied
|
|
INT iSendTextMessageTimer
|
|
|
|
BOOL bStartFlashBackStream
|
|
INT iFlashbackStreamProgress
|
|
INT iFlashbackSubtitleProgress
|
|
|
|
BOOL bReplayStopEventTriggered, bReplayStartEventTriggered
|
|
|
|
INT iCarTrackedPoint = -1
|
|
|
|
INT iNMBlockingObject01 = -1 //blocks the right side train tracks nav mesh in graveyard
|
|
INT iNMBlockingObject02 = -1 //blocks the right gate nav mesh in graveyard
|
|
INT iNMBlockingObject03 = -1 //blocks the back gate nav mesh in graveyard
|
|
INT iNMBlockingObject04 = -1 //blocks the left gate nav mesh in graveyard
|
|
INT iNMBlockingObject05 = -1 //blocks the left side train tracks nav mesh in graveyard
|
|
INT iNMBlockingObject06 = -1 //blocks the road to the graveyard
|
|
INT iNMBlockingObject07 = -1 //blocks the uncovered grave, hopefully should stop peds falling into the grave
|
|
|
|
INT iBlockVehicleFirstPersonCameraTimer = 0 //used to block first person vehicle camera for limited time, see B*2031566
|
|
BOOL bBlockVehicleFirstPersonCamera = FALSE
|
|
|
|
//|========================================= ARRAYS ======================================|
|
|
|
|
//text printing
|
|
INT iTriggeredTextHashes[30]
|
|
INT iNumTextHashesStored
|
|
|
|
BOOL FailFlags[MAX_MISSION_FAILS]
|
|
|
|
//asset arrays
|
|
MODEL_NAMES MissionModels[MAX_MODELS]
|
|
INT MissionRecordings[MAX_CAR_RECORDINGS]
|
|
|
|
ROADNODE_STRUCT sRoadNodes[59]
|
|
|
|
ENEMY_STRUCT esVanEnemies[4]
|
|
ENEMY_STRUCT esWallEnemies[2]
|
|
ENEMY_STRUCT esMiddleEnemies[3]
|
|
ENEMY_STRUCT esChurchEnemies[2]
|
|
ENEMY_STRUCT esExitEnemies[5]
|
|
ENEMY_STRUCT esSideVanEnemies[2]
|
|
ENEMY_STRUCT esSideVanBackupEnemies[2]
|
|
ENEMY_STRUCT esRunners[2]
|
|
ENEMY_STRUCT esVan4Enemies[4]
|
|
ENEMY_STRUCT esSideEnemies[3]
|
|
|
|
ENEMY_STRUCT esFirstReinforcementEnemies[2]
|
|
ENEMY_STRUCT esSecondReinforcementEnemies[2]
|
|
ENEMY_STRUCT esThirdReinforcementEnemies[2]
|
|
|
|
VEH_STRUCT vsEnemyVans[5]
|
|
|
|
//scripted coverpints and positions for shootout
|
|
COVERPOINT_STRUCT csCoverpoints[36]
|
|
TOMBSTONE_STRUCT FraggableTombstones[3]
|
|
|
|
GATE_STRUCT Gates[MAX_GRAVEYARD_GATES]
|
|
|
|
//|========================= MISCELLANEOUS PROCEDURES & FUNCTIONS ========================|
|
|
|
|
/// PURPOSE:
|
|
/// Resets all mission flags and progress counters to their default values.
|
|
PROC RESET_MISSION_FLAGS()
|
|
|
|
//reset setup progress to 1, so that iSetupProgress = 0 only runs once, on initial mission load.
|
|
iStageSetupProgress = 1
|
|
|
|
iMichaelStageProgress = 0
|
|
iTrevorStageProgress = 0
|
|
iMissionStageProgress = 0
|
|
|
|
psMichael.iTimer = 0
|
|
psTrevor.iTimer = 0
|
|
|
|
psMichael.iConversationTimer = 0
|
|
psTrevor.iConversationTimer = 0
|
|
|
|
psMichael.iConversationProgress = 0
|
|
psTrevor.iConversationProgress = 0
|
|
|
|
tsTrain.iProgress = 0
|
|
|
|
iSnowStuckTimer = 0
|
|
iEnemyConversationTimer = 0
|
|
iMichaelRandomConversationDelay = 0
|
|
iEnemyRandomConversationDelay = 0
|
|
bShootingConversationFlag = FALSE
|
|
bPlayVanOpenConversation = FALSE
|
|
bPlayVanExitConversation = FALSE
|
|
bStartSearching = FALSE
|
|
bEnemiesBlockedByTrain = FALSE
|
|
|
|
bPrologueGraveIPLSwapped = FALSE
|
|
bPlayerDetected = FALSE
|
|
bDetectedConversationPlaying = FALSE
|
|
bFirstEnemyWaveSpawned = FALSE
|
|
bSecondEnemyWaveSpawned = FALSE
|
|
bThirdEnemyWaveSpawned = FALSE
|
|
bFourthEnemyWaveSpawned = FALSE
|
|
bFifthEnemyWaveSpawned = FALSE
|
|
bFifthEnemyWaveIgnored = FALSE
|
|
|
|
bFirstEnemyReinforcementWaveSpawned = FALSE
|
|
bSecondEnemyReinforcementWaveSpawned= FALSE
|
|
//bThirdEnemyReinforcementWaveSpawned = FALSE
|
|
|
|
iSecondEnemyReinforcementDelayTimer = 0
|
|
iThirdEnemyReinforcementDelayTimer = 0
|
|
|
|
iEnemyTombstoneShootTimer = 0
|
|
|
|
iMichaelsObjectiveTimer = 0
|
|
|
|
bTaxiLocationSet = FALSE
|
|
bShouldDisplayMichaelsObjective = FALSE
|
|
bMichaelTrevorPhoneCallTriggered = FALSE
|
|
|
|
bVehiclePlaybackInterrupted = FALSE
|
|
|
|
bCutsceneSkipped = FALSE
|
|
bStageReplayInProgress = FALSE
|
|
|
|
bOpenGateTriggered = FALSE
|
|
bSmoothcloseGateTriggered = FALSE
|
|
|
|
iGateCloseProgress = 0
|
|
|
|
iChurchBellsProgress = 0
|
|
|
|
iLoadSceneTimer = 0
|
|
|
|
bSafeToStartMichaelsCall = FALSE
|
|
|
|
bPlayerDroveOffRoute = FALSE
|
|
bPlayerUsedAlternativePath = FALSE
|
|
|
|
sLabelGTLC = "MCH1_GTLC"
|
|
sLabelTOBJ1 = "MCH1_GT_T1"
|
|
sLabelTGETBCK1 = "CMN_TGETBCK"
|
|
sLabelTOBJ2 = "MCH1_GT_T3"
|
|
sLabelTGETIN2 = "CMN_GENGETINPL"
|
|
sLabelTGETBCK2 = "CMN_GENGETBCKPL"
|
|
|
|
eDetectedLocation = DL_NOT_DETECTED
|
|
|
|
bMusicEventTrevorPlaneTriggered = FALSE
|
|
bMusicEventShootoutStartTriggered = FALSE
|
|
bMusicEventArrivedChurchTriggered = FALSE
|
|
bMusicEventFirstTwoDeadTriggered = FALSE
|
|
bMusicEventFirstVanTriggered = FALSE
|
|
bMusicEventAlertedTriggered = FALSE
|
|
bMusicEventTrainTriggered = FALSE
|
|
bMusicEventKidnappedTriggered = FALSE
|
|
bMusicEventReadyToFlyTriggered = FALSE
|
|
|
|
iFirstVanTriggerTimer = 0
|
|
|
|
iWeatherTypeTimer = 0
|
|
bWeatherTypeOvercastSet = FALSE
|
|
bWeatherTypeRainSet = FALSE
|
|
bWeatherTypeThunderSet = FALSE
|
|
|
|
iLeadInTimer = 0
|
|
bLeadInTiggered = FALSE
|
|
bPlayerPedScriptTaskInterrupted = FALSE
|
|
|
|
bRenderBlips = FALSE
|
|
bRenderBlipsTimer = 0
|
|
|
|
bTrevorFlightActive = FALSE
|
|
|
|
fDistanceToDestination = 0.0
|
|
|
|
iTrevorDriveOutProgress = 0
|
|
//bShouldUseDefaultTrevorsCar = FALSE
|
|
|
|
iBradCadaverProgress = 0
|
|
|
|
iSendTextMessageTimer = 0
|
|
|
|
iCutsceneTriggerTimer = 0
|
|
bCutsceneTimeTrigger = FALSE
|
|
bCutsceneProximityTrigger = FALSE
|
|
|
|
bPTFXStarted = FALSE
|
|
|
|
bStartFlashBackStream = FALSE
|
|
iFlashbackStreamProgress = 0
|
|
iFlashbackSubtitleProgress = 0
|
|
|
|
bReplayStopEventTriggered = FALSE
|
|
bReplayStartEventTriggered = FALSE
|
|
|
|
bFirstPersonFXTriggered = FALSE
|
|
bCamViewModeContextChanged = FALSE
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Mission flags and progress counters are reset.")
|
|
#ENDIF
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Sets all fail flags to specified boolean value.
|
|
/// PARAMS:
|
|
/// bNewBool - Boolean value to set all flags to TRUE or FALSE.
|
|
PROC SET_FAIL_FLAGS(BOOL bNewBool)
|
|
|
|
INT i = 0
|
|
|
|
FOR i = 0 TO ( COUNT_OF(FailFlags) - 1 )
|
|
|
|
FailFlags[i] = bNewBool
|
|
|
|
ENDFOR
|
|
|
|
ENDPROC
|
|
|
|
FUNC SCENARIO_BLOCKING_INDEX CREATE_SCENARIO_BLOCKING_AREA(VECTOR vPosition, VECTOR vSize)
|
|
RETURN ADD_SCENARIO_BLOCKING_AREA(<< vPosition.x - vSize.x, vPosition.y - vSize.y, vPosition.z - vSize.z >>,
|
|
<< vPosition.x + vSize.x, vPosition.y + vSize.y, vPosition.z + vSize.z >>)
|
|
ENDFUNC
|
|
|
|
PROC REMOVE_PED_WEAPONS_LEAVING_ONE(PED_INDEX PedIndex, WEAPON_TYPE eWeaponToLeave, INT iMinBulletCount = 100)
|
|
|
|
IF DOES_ENTITY_EXIST(PedIndex)
|
|
IF NOT IS_ENTITY_DEAD(PedIndex)
|
|
|
|
INT iWeaponSlot
|
|
WEAPON_SLOT eWeaponSlot
|
|
|
|
FOR iWeaponSlot = 0 TO ENUM_TO_INT(NUM_WEAPONSLOTS)-1
|
|
|
|
eWeaponSlot = GET_PLAYER_PED_WEAPON_SLOT_FROM_INT(iWeaponSlot)
|
|
|
|
IF ( eWeaponSlot != WEAPONSLOT_INVALID )
|
|
|
|
WEAPON_TYPE eCurrentWeaponType
|
|
|
|
eCurrentWeaponType = GET_PED_WEAPONTYPE_IN_SLOT(PedIndex, eWeaponSlot)
|
|
|
|
IF ( eCurrentWeaponType != eWeaponToLeave )
|
|
AND ( eCurrentWeaponType != WEAPONTYPE_UNARMED )
|
|
AND ( eCurrentWeaponType != WEAPONTYPE_INVALID )
|
|
|
|
SET_PED_AMMO(PedIndex, eCurrentWeaponType, 0)
|
|
REMOVE_WEAPON_FROM_PED(PedIndex, eCurrentWeaponType)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Removing ped weapon ", GET_WEAPON_NAME(eCurrentWeaponType), ".")
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDFOR
|
|
|
|
//remove dlc weapons
|
|
|
|
INT iDLCWeaponIndex
|
|
INT iDLCWeapons = GET_NUM_DLC_WEAPONS()
|
|
scrShopWeaponData weaponData
|
|
|
|
REPEAT iDLCWeapons iDLCWeaponIndex
|
|
IF GET_DLC_WEAPON_DATA(iDLCWeaponIndex, weaponData)
|
|
|
|
WEAPON_TYPE eCurrentWeaponType = INT_TO_ENUM(WEAPON_TYPE, weaponData.m_nameHash)
|
|
|
|
IF ( eCurrentWeaponType != eWeaponToLeave )
|
|
AND ( eCurrentWeaponType != WEAPONTYPE_INVALID )
|
|
AND ( eCurrentWeaponType != WEAPONTYPE_UNARMED )
|
|
|
|
SET_PED_AMMO(PedIndex, eCurrentWeaponType, 0)
|
|
REMOVE_WEAPON_FROM_PED(PedIndex, eCurrentWeaponType)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Removing ped DLC weapon ", GET_WEAPON_NAME(eCurrentWeaponType), ".")
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
|
|
//check if player has a pistol
|
|
|
|
IF HAS_PED_GOT_WEAPON(PedIndex, eWeaponToLeave)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Ped has weapon ", GET_WEAPON_NAME(eWeaponToLeave), ".")
|
|
#ENDIF
|
|
|
|
INT iAmmo = GET_AMMO_IN_PED_WEAPON(PedIndex, eWeaponToLeave)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Ped has got ", iAmmo, " bullets in weapon ", GET_WEAPON_NAME(eWeaponToLeave), ".")
|
|
#ENDIF
|
|
|
|
IF ( iAmmo < iMinBulletCount )
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Ped has got less than ", iMinBulletCount, " bullets in weapon ", GET_WEAPON_NAME(eWeaponToLeave), ".")
|
|
#ENDIF
|
|
|
|
INT iBulletCountDifference
|
|
|
|
iBulletCountDifference = iMinBulletCount - iAmmo
|
|
|
|
ADD_AMMO_TO_PED(PedIndex, eWeaponToLeave, iBulletCountDifference)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Adding ", iBulletCountDifference, " bullets to ped weapon ", GET_WEAPON_NAME(eWeaponToLeave), ".")
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Ped has now got ", GET_AMMO_IN_PED_WEAPON(PedIndex, eWeaponToLeave), " bullets in weapon ", GET_WEAPON_NAME(eWeaponToLeave), ".")
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Ped does not have weapon ", GET_WEAPON_NAME(eWeaponToLeave), ".")
|
|
#ENDIF
|
|
|
|
GIVE_WEAPON_TO_PED(PedIndex, eWeaponToLeave, iMinBulletCount, FALSE, FALSE)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Giving ped weapon ", GET_WEAPON_NAME(eWeaponToLeave), " with ", iMinBulletCount, " bullets.")
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC SET_CUTSCENE_TRIGGER_FLAG_FOR_PLAYER_PED_ENUM(enumCharacterList ePlayerPedCharacter, BOOL &bMichaelTriggerFlag, BOOL &bTrevorTriggerFlag)
|
|
|
|
IF ( ePlayerPedCharacter = CHAR_MICHAEL )
|
|
bMichaelTriggerFlag = TRUE
|
|
bTrevorTriggerFlag = FALSE
|
|
ELIF ( ePlayerPedCharacter = CHAR_TREVOR )
|
|
bMichaelTriggerFlag = FALSE
|
|
bTrevorTriggerFlag = TRUE
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting graveyard cutscene trigger flags bMichaelTriggerFlag to ", bMichaelTriggerFlag,
|
|
" and bTrevorTriggerFlag to ", bTrevorTriggerFlag, " due to debug skips, shit skip or mission replay.")
|
|
#ENDIF
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Returns the next mission stage after the specified mission stage.
|
|
/// PARAMS:
|
|
/// eStage - Mission stage to get the next mission stage.
|
|
/// RETURNS:
|
|
/// Mission stage that is next after the specified mission stage.
|
|
FUNC MISSION_STAGES GET_NEXT_MISSION_STAGE(MISSION_STAGES eStage)
|
|
|
|
IF eStage = MISSION_STAGE_END
|
|
RETURN MISSION_STAGE_END
|
|
ENDIF
|
|
|
|
IF eStage = MISSION_STAGE_GET_TO_AIRPORT
|
|
RETURN MISSION_STAGE_CUTSCENE_AIRPORT
|
|
ENDIF
|
|
|
|
MISSION_STAGES eNextStage
|
|
|
|
INT iNextStage = ENUM_TO_INT(eStage) + 1
|
|
|
|
eNextStage = INT_TO_ENUM(MISSION_STAGES, iNextStage)
|
|
|
|
RETURN eNextStage
|
|
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Check is the specified time has passed using specified timer.
|
|
/// PARAMS:
|
|
/// iTimeAmount - Time to check.
|
|
/// iTimer - Timer to use.
|
|
/// RETURNS:
|
|
/// True is the specified amount of time has passed for the specified timer.
|
|
FUNC BOOL HAS_TIME_PASSED(INT iTimeAmount, INT iTimer)
|
|
|
|
INT iCurrentTime
|
|
INT iTimeDifference
|
|
|
|
iCurrentTime = GET_GAME_TIMER()
|
|
|
|
iTimeDifference = iCurrentTime - iTimeAmount
|
|
|
|
IF iTimeDifference > iTimer
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Performs a screen fade in with a wait for a specified time.
|
|
/// PARAMS:
|
|
/// iTime - Duration of the fade in miliseconds.
|
|
PROC DO_SAFE_SCREEN_FADE_IN(INT iTime)
|
|
|
|
IF NOT IS_SCREEN_FADED_IN()
|
|
|
|
DO_SCREEN_FADE_IN(iTime)
|
|
|
|
WHILE NOT IS_SCREEN_FADED_IN()
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Performs a screen fade out with a wait for a specified time.
|
|
/// PARAMS:
|
|
/// iTime - Duration of the fade in miliseconds.
|
|
PROC DO_SAFE_SCREEN_FADE_OUT(INT iTime)
|
|
|
|
IF NOT IS_SCREEN_FADED_OUT()
|
|
|
|
DO_SCREEN_FADE_OUT(iTime)
|
|
|
|
WHILE NOT IS_SCREEN_FADED_OUT()
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Stops an active mocap cutscene and waits until it has finished.
|
|
PROC DO_SAFE_STOP_CUTSCENE()
|
|
|
|
IF IS_CUTSCENE_PLAYING()
|
|
SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, FALSE, FALSE)
|
|
STOP_CUTSCENE(TRUE)
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE) //needs to be called to make sure all scripted systems work correctly when cutscene is skipped
|
|
ENDIF
|
|
|
|
WHILE NOT HAS_CUTSCENE_FINISHED()
|
|
WAIT(0)
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Waiting for the cutscene to finish.")
|
|
#ENDIF
|
|
ENDWHILE
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Checks if the specified mocap cutscene has loaded.
|
|
/// Removes any other loaded mocap cutscene and requests the specified cutscene until it is loaded.
|
|
/// PARAMS:
|
|
/// sSceneName - Mocap cutscene name to check for being loaded.
|
|
/// CutsceneSection - Cutscene section specifying at what section to start the cutscene. Use CS_SECTION_1 to play from start.
|
|
/// RETURNS:
|
|
/// TRUE if the specified cutscene has loaded, FALSE if otherwise.
|
|
FUNC BOOL HAS_REQUESTED_CUTSCENE_LOADED(STRING sSceneName, CUTSCENE_SECTION CutsceneSection = CS_SECTION_1)
|
|
|
|
//check if the specified cutscene has loaded first
|
|
IF HAS_THIS_CUTSCENE_LOADED_WITH_FAILSAFE(sSceneName)
|
|
|
|
RETURN TRUE
|
|
|
|
ELSE
|
|
|
|
//if the expected reuqested cutscene has not loaded, but there already is a loaded cutscene
|
|
//then remove it and keep requesting specified mocap cutscene
|
|
IF HAS_CUTSCENE_LOADED_WITH_FAILSAFE()
|
|
|
|
REMOVE_CUTSCENE()
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": HAS_REQUESTED_CUTSCENE_LOADED() Removing cutscene from memory, because cutscene ", sSceneName, " was expected to be loaded.")
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF ( CutsceneSection = CS_SECTION_1)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Cutscene ", sSceneName, " is loading.")
|
|
#ENDIF
|
|
|
|
//if the cutscene is not loaded, keep requesting it
|
|
REQUEST_CUTSCENE(sSceneName)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Requesting ", sSceneName, ".")
|
|
#ENDIF
|
|
|
|
ELSE
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Cutscene ", sSceneName, " is loading with playback list.")
|
|
#ENDIF
|
|
|
|
//if the cutscene is not loaded, keep requesting it
|
|
REQUEST_CUTSCENE_WITH_PLAYBACK_LIST(sSceneName, CutsceneSection)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Requesting ", sSceneName, " cutscene with playback list.")
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
|
|
ENDFUNC
|
|
|
|
PROC START_CUTSCENE_AT_COORDS_WITH_HEADING(VECTOR vPosition, FLOAT fHeading)
|
|
|
|
SET_CUTSCENE_TRIGGER_AREA(vZero, 0.0, fHeading, 0.0)
|
|
|
|
START_CUTSCENE_AT_COORDS(vPosition)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Starting cutscene at ", vPosition, ", ", fHeading, ".")
|
|
#ENDIF
|
|
|
|
ENDPROC
|
|
|
|
FUNC BOOL IS_THIS_CONVERSATION_PLAYING(STRING sRoot)
|
|
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
TEXT_LABEL txtRoot = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_ROOT()
|
|
|
|
IF ARE_STRINGS_EQUAL(sRoot, txtRoot)
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
PROC REMOVE_LABEL_ARRAY_SPACES()
|
|
INT iArrayLength = COUNT_OF(iTriggeredTextHashes)
|
|
INT i = 0
|
|
|
|
REPEAT (iArrayLength - 1) i
|
|
IF iTriggeredTextHashes[i] = 0
|
|
IF iTriggeredTextHashes[i+1] != 0
|
|
iTriggeredTextHashes[i] = iTriggeredTextHashes[i+1]
|
|
iTriggeredTextHashes[i+1] = 0
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDPROC
|
|
|
|
FUNC INT GET_LABEL_INDEX(INT iLabelHash)
|
|
INT i = 0
|
|
|
|
REPEAT iNumTextHashesStored i
|
|
IF iTriggeredTextHashes[i] = iLabelHash
|
|
RETURN i
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
RETURN -1
|
|
ENDFUNC
|
|
|
|
FUNC BOOL HAS_LABEL_BEEN_TRIGGERED(STRING strLabel)
|
|
INT iHash = GET_HASH_KEY(strLabel)
|
|
|
|
IF GET_LABEL_INDEX(iHash) != -1
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
PROC SET_LABEL_AS_TRIGGERED(STRING strLabel, BOOL bTrigger)
|
|
INT iHash = GET_HASH_KEY(strLabel)
|
|
|
|
IF bTrigger
|
|
IF NOT HAS_LABEL_BEEN_TRIGGERED(strLabel)
|
|
INT iArraySize = COUNT_OF(iTriggeredTextHashes)
|
|
|
|
IF iNumTextHashesStored < iArraySize
|
|
iTriggeredTextHashes[iNumTextHashesStored] = iHash
|
|
iNumTextHashesStored++
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": SET_LABEL_AS_TRIGGERED(): ", strLabel, " TRUE.")
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": SET_LABEL_AS_TRIGGERED(): ", iNumTextHashesStored, "/", COUNT_OF(iTriggeredTextHashes), ".")
|
|
#ENDIF
|
|
ELSE
|
|
#IF IS_DEBUG_BUILD
|
|
SCRIPT_ASSERT("SET_LABEL_AS_TRIGGERED: Label array is full.")
|
|
#ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
INT iIndex = GET_LABEL_INDEX(iHash)
|
|
IF iIndex != -1
|
|
iTriggeredTextHashes[iIndex] = 0
|
|
REMOVE_LABEL_ARRAY_SPACES()
|
|
iNumTextHashesStored--
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": SET_LABEL_AS_TRIGGERED(): ", strLabel, " TRUE.")
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": SET_LABEL_AS_TRIGGERED(): ", iNumTextHashesStored, "/", COUNT_OF(iTriggeredTextHashes), ".")
|
|
#ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC CLEAR_TRIGGERED_LABELS()
|
|
INT iArraySize = COUNT_OF(iTriggeredTextHashes)
|
|
INT i = 0
|
|
|
|
REPEAT iArraySize i
|
|
iTriggeredTextHashes[i] = 0
|
|
ENDREPEAT
|
|
|
|
iNumTextHashesStored = 0
|
|
ENDPROC
|
|
|
|
PROC PRINT_GOD_TEXT_ADVANCED(STRING sLabel, INT iDuration = DEFAULT_GOD_TEXT_TIME, BOOL bOnce = TRUE)
|
|
IF NOT HAS_LABEL_BEEN_TRIGGERED(sLabel)
|
|
PRINT(sLabel, iDuration, 1)
|
|
SET_LABEL_AS_TRIGGERED(sLabel, bOnce)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Printing god text ", sLabel, ".")
|
|
#ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC PRINT_FAKE_SUBTITLE(STRING sLabel, INT iDuration = DEFAULT_GOD_TEXT_TIME)
|
|
|
|
FORCE_NEXT_MESSAGE_TO_PREVIOUS_BRIEFS_LIST(PREVIOUS_BRIEF_FORCE_DIALOGUE)
|
|
IF GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) = 1
|
|
CLEAR_PRINTS()
|
|
PRINT(sLabel, iDuration, 1)
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC DISPLAY_TEXT_ON_BLACK_SCREEN(STRING sText)
|
|
|
|
FLOAT fFontHeight
|
|
|
|
IF GET_CURRENT_LANGUAGE() = LANGUAGE_CHINESE
|
|
OR GET_CURRENT_LANGUAGE() = LANGUAGE_JAPANESE
|
|
OR GET_CURRENT_LANGUAGE() = LANGUAGE_KOREAN
|
|
OR GET_CURRENT_LANGUAGE() = LANGUAGE_CHINESE_SIMPLIFIED
|
|
SET_TEXT_SCALE(0.675, 0.675) //150% larger font for korean, japanese and chinese
|
|
fFontHeight = GET_RENDERED_CHARACTER_HEIGHT(0.675)
|
|
ELSE //all other languages
|
|
SET_TEXT_SCALE(0.45, 0.45)
|
|
fFontHeight = GET_RENDERED_CHARACTER_HEIGHT(0.45)
|
|
ENDIF
|
|
|
|
SET_TEXT_CENTRE(TRUE)
|
|
SET_SCRIPT_GFX_DRAW_ORDER(GFX_ORDER_AFTER_FADE)
|
|
|
|
BEGIN_TEXT_COMMAND_DISPLAY_TEXT(sText)
|
|
END_TEXT_COMMAND_DISPLAY_TEXT(0.5, 0.5 - (fFontHeight / 2))
|
|
|
|
RESET_SCRIPT_GFX_ALIGN()
|
|
HIDE_LOADING_ON_FADE_THIS_FRAME()
|
|
|
|
REPLAY_PREVENT_RECORDING_AND_UI_THIS_FRAME()
|
|
|
|
ENDPROC
|
|
|
|
PROC SMOOTH_LOCK_GRAVEYARD_GATE(INT i, FLOAT fSpeed = 0.2, FLOAT fTolerance = 0.01)
|
|
|
|
IF ( Gates[i].bClosed = FALSE )
|
|
|
|
FLOAT fOpenRatio
|
|
|
|
fOpenRatio = DOOR_SYSTEM_GET_OPEN_RATIO(ENUM_TO_INT(Gates[i].eHashEnum))
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
DRAW_DEBUG_TEXT_ABOVE_COORDS(Gates[i].vPosition, GET_STRING_FROM_FLOAT(fOpenRatio), 1.0)
|
|
#ENDIF
|
|
|
|
IF fOpenRatio <= -fTolerance
|
|
OR fOpenRatio >= fTolerance
|
|
|
|
IF fOpenRatio > 0.0
|
|
fOpenRatio -= fSpeed
|
|
ELIF fOpenRatio < 0.0
|
|
fOpenRatio += fSpeed
|
|
ENDIF
|
|
|
|
DOOR_SYSTEM_SET_OPEN_RATIO(ENUM_TO_INT(Gates[i].eHashEnum), fOpenRatio, FALSE, FALSE)
|
|
DOOR_SYSTEM_SET_DOOR_STATE(ENUM_TO_INT(Gates[i].eHashEnum), DOORSTATE_LOCKED, FALSE, TRUE)
|
|
|
|
CLEAR_AREA_OF_OBJECTS(Gates[i].vPosition, 2.0)
|
|
|
|
ELSE
|
|
|
|
fOpenRatio = 0.0
|
|
|
|
DOOR_SYSTEM_SET_OPEN_RATIO(ENUM_TO_INT(Gates[i].eHashEnum), fOpenRatio, FALSE, FALSE)
|
|
DOOR_SYSTEM_SET_DOOR_STATE(ENUM_TO_INT(Gates[i].eHashEnum), DOORSTATE_LOCKED, FALSE, TRUE)
|
|
|
|
Gates[i].bClosed = TRUE
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC REGISTER_GRAVEYARD_GATE(INT i)
|
|
|
|
IF NOT IS_DOOR_REGISTERED_WITH_SYSTEM(ENUM_TO_INT(Gates[i].eHashEnum))
|
|
ADD_DOOR_TO_SYSTEM(ENUM_TO_INT(Gates[i].eHashEnum), Gates[i].ModelName, Gates[i].vPosition, FALSE, FALSE)
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Adding door ", i, " with int ", ENUM_TO_INT(Gates[i].eHashEnum), " to system with model ",
|
|
GET_MODEL_NAME_FOR_DEBUG(Gates[i].ModelName), " at coordinates ", Gates[i].vPosition, ".")
|
|
#ENDIF
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC UNREGISTER_GRAVEYARD_GATE(INT i)
|
|
|
|
IF IS_DOOR_REGISTERED_WITH_SYSTEM(ENUM_TO_INT(Gates[i].eHashEnum))
|
|
REMOVE_DOOR_FROM_SYSTEM(ENUM_TO_INT(Gates[i].eHashEnum))
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Removing door ", i, " with int ", ENUM_TO_INT(Gates[i].eHashEnum), " from system with model ",
|
|
GET_MODEL_NAME_FOR_DEBUG(Gates[i].ModelName), " at coordinates ", Gates[i].vPosition, ".")
|
|
#ENDIF
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC LOCK_GRAVEYARD_GATE(INT i)
|
|
|
|
IF IS_DOOR_REGISTERED_WITH_SYSTEM(ENUM_TO_INT(Gates[i].eHashEnum))
|
|
DOOR_SYSTEM_SET_OPEN_RATIO(ENUM_TO_INT(Gates[i].eHashEnum), 0.0, FALSE, FALSE)
|
|
DOOR_SYSTEM_SET_DOOR_STATE(ENUM_TO_INT(Gates[i].eHashEnum), DOORSTATE_LOCKED, FALSE, TRUE)
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Locking door ", i, " with int ", ENUM_TO_INT(Gates[i].eHashEnum), " with model ",
|
|
GET_MODEL_NAME_FOR_DEBUG(Gates[i].ModelName), " at coordinates ", Gates[i].vPosition, ".")
|
|
#ENDIF
|
|
ELSE
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Door ", i, " with int ", ENUM_TO_INT(Gates[i].eHashEnum), " with model ",
|
|
GET_MODEL_NAME_FOR_DEBUG(Gates[i].ModelName), " at coordinates ", Gates[i].vPosition, " is not registered with door system.")
|
|
#ENDIF
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC UNLOCK_GRAVEYARD_GATE(INT i)
|
|
|
|
IF IS_DOOR_REGISTERED_WITH_SYSTEM(ENUM_TO_INT(Gates[i].eHashEnum))
|
|
DOOR_SYSTEM_SET_OPEN_RATIO(ENUM_TO_INT(Gates[i].eHashEnum), 0.0, FALSE, FALSE)
|
|
DOOR_SYSTEM_SET_DOOR_STATE(ENUM_TO_INT(Gates[i].eHashEnum), DOORSTATE_UNLOCKED, FALSE, TRUE)
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Unlocking door ", i, " with int ", ENUM_TO_INT(Gates[i].eHashEnum), " with model ",
|
|
GET_MODEL_NAME_FOR_DEBUG(Gates[i].ModelName), " at coordinates ", Gates[i].vPosition, ".")
|
|
#ENDIF
|
|
ELSE
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Door ", i, " with int ", ENUM_TO_INT(Gates[i].eHashEnum), " with model ",
|
|
GET_MODEL_NAME_FOR_DEBUG(Gates[i].ModelName), " at coordinates ", Gates[i].vPosition, " is not registered with door system.")
|
|
#ENDIF
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC REGISTER_GRAVEYARD_GATES()
|
|
|
|
INT i = 0
|
|
|
|
FOR i = 0 TO ( MAX_GRAVEYARD_GATES - 1 )
|
|
REGISTER_GRAVEYARD_GATE(i)
|
|
ENDFOR
|
|
|
|
ENDPROC
|
|
|
|
PROC UNREGISTER_GRAVEYARD_GATES()
|
|
|
|
INT i = 0
|
|
|
|
FOR i = 0 TO ( MAX_GRAVEYARD_GATES - 1 )
|
|
UNREGISTER_GRAVEYARD_GATE(i)
|
|
ENDFOR
|
|
|
|
ENDPROC
|
|
|
|
PROC LOCK_GRAVEYARD_GATES()
|
|
|
|
INT i = 0
|
|
|
|
FOR i = 0 TO ( MAX_GRAVEYARD_GATES - 1 )
|
|
LOCK_GRAVEYARD_GATE(i)
|
|
ENDFOR
|
|
|
|
ENDPROC
|
|
|
|
PROC UNLOCK_GRAVEYARD_GATES()
|
|
|
|
INT i = 0
|
|
|
|
FOR i = 0 TO ( MAX_GRAVEYARD_GATES - 1 )
|
|
UNLOCK_GRAVEYARD_GATE(i)
|
|
ENDFOR
|
|
|
|
ENDPROC
|
|
|
|
PROC RUN_GRAVEYARD_GATES_CHECK(MISSION_STAGES eStage, BOOL bOpenTriggered, BOOL bCloseTriggered, INT &iGateProgress)
|
|
|
|
SWITCH eStage
|
|
CASE MISSION_STAGE_GET_TO_GRAVEYARD
|
|
CASE MISSION_STAGE_GET_TO_GRAVE
|
|
CASE MISSION_STAGE_CUTSCENE_GRAVEYARD
|
|
CASE MISSION_STAGE_CUTSCENE_KIDNAPPED
|
|
|
|
// IF NOT IS_CUTSCENE_PLAYING()
|
|
// ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_GRAVEYARD_SHOOTOUT
|
|
|
|
SWITCH iGateProgress
|
|
|
|
CASE 0
|
|
|
|
LOCK_GRAVEYARD_GATE(0)
|
|
LOCK_GRAVEYARD_GATE(1)
|
|
|
|
iGateProgress++
|
|
|
|
BREAK
|
|
|
|
CASE 1
|
|
|
|
IF ( bOpenTriggered = TRUE )
|
|
|
|
UNLOCK_GRAVEYARD_GATE(0)
|
|
UNLOCK_GRAVEYARD_GATE(1)
|
|
|
|
Gates[0].bClosed = FALSE
|
|
Gates[1].bClosed = FALSE
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Unlocking doors for smooth locking.")
|
|
#ENDIF
|
|
|
|
iGateProgress++
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 2
|
|
|
|
IF ( bCloseTriggered = TRUE )
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Running smooth locking.")
|
|
#ENDIF
|
|
|
|
SMOOTH_LOCK_GRAVEYARD_GATE(0, 0.075, 0.05)
|
|
SMOOTH_LOCK_GRAVEYARD_GATE(1, 0.075, 0.05)
|
|
|
|
IF ( Gates[0].bClosed = TRUE )
|
|
AND ( Gates[1].bClosed = TRUE )
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Smooth locking is done.")
|
|
#ENDIF
|
|
|
|
iGateProgress++
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 3
|
|
|
|
LOCK_GRAVEYARD_GATE(0)
|
|
LOCK_GRAVEYARD_GATE(1)
|
|
|
|
iGateProgress++
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
ENDPROC
|
|
|
|
PROC ADD_NAVMESH_BLOCKING_OBJECTS()
|
|
|
|
IF ( iNMBlockingObject01 = -1)
|
|
iNMBlockingObject01 = ADD_NAVMESH_BLOCKING_OBJECT(<< 3242.716, -4707.644, 112.0 >>, << 18.144, 14.964, 5.0 >>, 0.0)
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Adding nav mesh blocking object iNMBlockingObject01.")
|
|
#ENDIF
|
|
ENDIF
|
|
IF ( iNMBlockingObject02 = -1)
|
|
iNMBlockingObject02 = ADD_NAVMESH_BLOCKING_OBJECT(<< 3294.783, -4613.386, 112.0 >>, << 4.200, 6.294, 5.0 >>, 0.0)
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Adding nav mesh blocking object iNMBlockingObject02.")
|
|
#ENDIF
|
|
ENDIF
|
|
IF ( iNMBlockingObject03 = -1)
|
|
iNMBlockingObject03 = ADD_NAVMESH_BLOCKING_OBJECT(<< 3263.877, -4560.729, 118.000 >>, << 6.650, 6.000, 5.0 >>, 0.0)
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Adding nav mesh blocking object iNMBlockingObject03.")
|
|
#ENDIF
|
|
ENDIF
|
|
IF ( iNMBlockingObject04 = -1)
|
|
iNMBlockingObject04 = ADD_NAVMESH_BLOCKING_OBJECT(<< 3238.994, -4592.786, 115.000 >>, << 6.650, 6.000, 5.0 >>, 0.0)
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Adding nav mesh blocking object iNMBlockingObject04.")
|
|
#ENDIF
|
|
ENDIF
|
|
IF ( iNMBlockingObject05 = -1)
|
|
iNMBlockingObject05 = ADD_NAVMESH_BLOCKING_OBJECT(<< 3198.355, -4706.313, 112.000 >>, << 12.179, 14.115, 5.0 >>, 0.0)
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Adding nav mesh blocking object iNMBlockingObject05.")
|
|
#ENDIF
|
|
ENDIF
|
|
IF ( iNMBlockingObject06 = -1)
|
|
iNMBlockingObject06 = ADD_NAVMESH_BLOCKING_OBJECT(<< 3214.000, -4765.436, 112.000 >>, << 64.0, 32.0, 8.0 >>, 0.0)
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Adding nav mesh blocking object iNMBlockingObject06.")
|
|
#ENDIF
|
|
ENDIF
|
|
IF ( iNMBlockingObject07 = -1)
|
|
iNMBlockingObject07 = ADD_NAVMESH_BLOCKING_OBJECT(<< 3259.800, -4573.900, 117.300 >>, << 2.5, 4.0, 2.0 >>, 0.0)
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Adding nav mesh blocking object iNMBlockingObject07.")
|
|
#ENDIF
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC REMOVE_NAVMESH_BLOCKING_OBJECTS()
|
|
|
|
IF ( iNMBlockingObject01 != -1)
|
|
REMOVE_NAVMESH_BLOCKING_OBJECT(iNMBlockingObject01)
|
|
iNMBlockingObject01 = -1
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Removing nav mesh blocking object iNMBlockingObject01.")
|
|
#ENDIF
|
|
ENDIF
|
|
IF ( iNMBlockingObject02 != -1)
|
|
REMOVE_NAVMESH_BLOCKING_OBJECT(iNMBlockingObject02)
|
|
iNMBlockingObject02 = -1
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Removing nav mesh blocking object iNMBlockingObject02.")
|
|
#ENDIF
|
|
ENDIF
|
|
IF ( iNMBlockingObject03 != -1)
|
|
REMOVE_NAVMESH_BLOCKING_OBJECT(iNMBlockingObject03)
|
|
iNMBlockingObject03 = -1
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Removing nav mesh blocking object iNMBlockingObject03.")
|
|
#ENDIF
|
|
ENDIF
|
|
IF ( iNMBlockingObject04 != -1)
|
|
REMOVE_NAVMESH_BLOCKING_OBJECT(iNMBlockingObject04)
|
|
iNMBlockingObject04 = -1
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Removing nav mesh blocking object iNMBlockingObject04.")
|
|
#ENDIF
|
|
ENDIF
|
|
IF ( iNMBlockingObject05 != -1)
|
|
REMOVE_NAVMESH_BLOCKING_OBJECT(iNMBlockingObject05)
|
|
iNMBlockingObject05 = -1
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Removing nav mesh blocking object iNMBlockingObject05.")
|
|
#ENDIF
|
|
ENDIF
|
|
IF ( iNMBlockingObject06 != -1)
|
|
REMOVE_NAVMESH_BLOCKING_OBJECT(iNMBlockingObject06)
|
|
iNMBlockingObject06 = -1
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Removing nav mesh blocking object iNMBlockingObject06.")
|
|
#ENDIF
|
|
ENDIF
|
|
IF ( iNMBlockingObject07 != -1)
|
|
REMOVE_NAVMESH_BLOCKING_OBJECT(iNMBlockingObject07)
|
|
iNMBlockingObject07 = -1
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Removing nav mesh blocking object iNMBlockingObject07.")
|
|
#ENDIF
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC CREATE_TRACKED_POINT_FOR_COORD(INT &iTrackedPoint, VECTOR vPosition, FLOAT fRadius)
|
|
|
|
IF ( iTrackedPoint = -1 )
|
|
iTrackedPoint = CREATE_TRACKED_POINT()
|
|
SET_TRACKED_POINT_INFO(iTrackedPoint, vPosition, fRadius)
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Creating tracked point with id ", iTrackedPoint, " for coord ", vPosition, " and radius ", fRadius, ".")
|
|
#ENDIF
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC CLEANUP_TRACKED_POINT(INT &iTrackedPoint)
|
|
|
|
IF ( iTrackedPoint != -1 )
|
|
DESTROY_TRACKED_POINT(iTrackedPoint)
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Destroying tracked point with id ", iTrackedPoint, ".")
|
|
#ENDIF
|
|
iTrackedPoint = -1
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
FUNC BOOL DOES_TRACKED_POINT_EXIST(INT iTrackedPoint)
|
|
|
|
RETURN iTrackedPoint != -1
|
|
|
|
ENDFUNC
|
|
|
|
FUNC BOOL CAN_GET_CLOSEST_COVERPOINT_FOR_PED(PED_INDEX PedIndex, COVERPOINT_STRUCT &sArray[], COVERPOINT_STRUCT &sResult,
|
|
BOOL bCheckForPlayerPed = FALSE, FLOAT fPlayerDistance = 3.0,
|
|
BOOL bPreferCoverPoints = FALSE)
|
|
|
|
INT i = 0
|
|
|
|
FLOAT fShortestDistance = 1000.0
|
|
|
|
FLOAT fCurrentDistance = 0.0
|
|
|
|
INT iClosestCoverpoint = -1
|
|
|
|
PED_INDEX ClosestPed
|
|
|
|
IF NOT IS_PED_INJURED(PedIndex)
|
|
|
|
FOR i = 0 TO ( COUNT_OF(sArray) - 1 )
|
|
|
|
IF ( sArray[i].bActive = TRUE )
|
|
AND ( sArray[i].bTaken = FALSE )
|
|
|
|
//check if there is no other ped there
|
|
IF NOT GET_CLOSEST_PED(sArray[i].vPosition, fPlayerDistance, FALSE, TRUE, ClosestPed)
|
|
|
|
IF ( bPreferCoverPoints = FALSE )
|
|
|
|
fCurrentDistance = GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PedIndex), sArray[i].vPosition)
|
|
|
|
IF ( fCurrentDistance < fShortestDistance)
|
|
|
|
IF ( bCheckForPlayerPed = TRUE)
|
|
|
|
IF ( GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), sArray[i].vPosition) > fPlayerDistance)
|
|
|
|
fShortestDistance = fCurrentDistance
|
|
|
|
iClosestCoverpoint = i
|
|
|
|
ELSE
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_GET_CLOSEST_COVERPOINT_FOR_PED() Player ped is within the distance of the selected active coverpoint with index ", i, ".")
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
|
|
ELIF ( bCheckForPlayerPed = FALSE )
|
|
|
|
fShortestDistance = fCurrentDistance
|
|
|
|
iClosestCoverpoint = i
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ELIF ( bPreferCoverPoints = TRUE )
|
|
|
|
IF ( sArray[i].bStationary = FALSE )
|
|
|
|
fCurrentDistance = GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PedIndex), sArray[i].vPosition)
|
|
|
|
IF ( fCurrentDistance < fShortestDistance)
|
|
|
|
IF ( bCheckForPlayerPed = TRUE)
|
|
|
|
IF ( GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), sArray[i].vPosition) > fPlayerDistance)
|
|
|
|
fShortestDistance = fCurrentDistance
|
|
|
|
iClosestCoverpoint = i
|
|
|
|
ELSE
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_GET_CLOSEST_COVERPOINT_FOR_PED() Player ped is within the distance of the selected active coverpoint with index ", i, ".")
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
|
|
ELIF ( bCheckForPlayerPed = FALSE )
|
|
|
|
fShortestDistance = fCurrentDistance
|
|
|
|
iClosestCoverpoint = i
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDFOR
|
|
|
|
ENDIF
|
|
|
|
IF ( iClosestCoverpoint = -1 )
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_GET_CLOSEST_COVERPOINT_FOR_PED() No active coverpoints found. Check your scripted coverpoints, fShortestDistance or ped's state.")
|
|
#ENDIF
|
|
|
|
RETURN FALSE
|
|
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_GET_CLOSEST_COVERPOINT_FOR_PED() Found closest active coverpoint from coverpoint array at index ", iClosestCoverpoint, ".")
|
|
#ENDIF
|
|
|
|
sResult = sArray[iClosestCoverpoint]
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_GET_CLOSEST_COVERPOINT_FOR_PED() Setting coverpoint at index ", iClosestCoverpoint, " as taken.")
|
|
#ENDIF
|
|
|
|
sArray[iClosestCoverpoint].bTaken = TRUE
|
|
sArray[iClosestCoverpoint].TakenPedIndex = PedIndex
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
DRAW_DEBUG_LINE(GET_ENTITY_COORDS(PedIndex), sArray[iClosestCoverpoint].vPosition, 0, 255, 0)
|
|
#ENDIF
|
|
|
|
RETURN TRUE
|
|
|
|
ENDFUNC
|
|
|
|
FUNC INT GET_NUMBER_OF_PEDS_FROM_RELATIONSHIP_GROUP_FOR_PED(PED_INDEX PedIndex, REL_GROUP_HASH rgHash, BOOL bCheckEntitiesOnScreen = FALSE)
|
|
|
|
PED_INDEX pedArray[16]
|
|
|
|
INT i = 0
|
|
|
|
INT iNumber = 0
|
|
|
|
IF NOT IS_PED_INJURED(PedIndex)
|
|
|
|
GET_PED_NEARBY_PEDS(PedIndex, pedArray, PEDTYPE_ANIMAL)
|
|
|
|
FOR i = 0 TO ( COUNT_OF(pedArray) - 1 )
|
|
|
|
IF DOES_ENTITY_EXIST(pedArray[i])
|
|
|
|
IF NOT IS_PED_INJURED(pedArray[i])
|
|
|
|
IF ( bCheckEntitiesOnScreen = TRUE )
|
|
|
|
IF IS_ENTITY_ON_SCREEN(pedArray[i])
|
|
IF ( GET_PED_RELATIONSHIP_GROUP_HASH(pedArray[i]) = rgHash )
|
|
iNumber++
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
IF ( GET_PED_RELATIONSHIP_GROUP_HASH(pedArray[i]) = rgHash )
|
|
iNumber++
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDFOR
|
|
|
|
ENDIF
|
|
|
|
// #IF IS_DEBUG_BUILD
|
|
// PRINTLN(GET_THIS_SCRIPT_NAME(), ": GET_NUMBER_OF_PEDS_FROM_RELATIONSHIP_GROUP_FOR_PED() returning ", iNumber, ".")
|
|
// #ENDIF
|
|
|
|
RETURN iNumber
|
|
|
|
ENDFUNC
|
|
|
|
FUNC PED_INDEX GET_CLOSEST_PED_FROM_RELATIONSHIP_GROUP_FOR_PED(PED_INDEX PedIndex, REL_GROUP_HASH rgHash, INT iProximity = 0, BOOL bOnScreen = FALSE
|
|
#IF IS_DEBUG_BUILD, INT iRed = 0, INT iGreen = 255, INT iBlue = 0 #ENDIF)
|
|
|
|
PED_INDEX pedArray[16]
|
|
|
|
INT i = 0
|
|
|
|
IF NOT IS_PED_INJURED(PedIndex)
|
|
|
|
GET_PED_NEARBY_PEDS(PedIndex, pedArray, PEDTYPE_ANIMAL)
|
|
|
|
FOR i = 0 TO ( COUNT_OF(pedArray) - 1 )
|
|
|
|
IF DOES_ENTITY_EXIST(pedArray[i])
|
|
|
|
IF NOT IS_PED_INJURED(pedArray[i])
|
|
|
|
IF ( GET_PED_RELATIONSHIP_GROUP_HASH(pedArray[i]) = rgHash )
|
|
|
|
IF ( iProximity <= 0)
|
|
|
|
IF ( bOnScreen = TRUE )
|
|
|
|
IF IS_ENTITY_ON_SCREEN(pedArray[i])
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
DRAW_DEBUG_LINE(GET_ENTITY_COORDS(PedIndex), GET_ENTITY_COORDS(pedArray[i]), iRed, iGreen, iBlue)
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Closest nearby ped on screen has index ", i, ".")
|
|
#ENDIF
|
|
|
|
RETURN pedArray[i]
|
|
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
DRAW_DEBUG_LINE(GET_ENTITY_COORDS(PedIndex), GET_ENTITY_COORDS(pedArray[i]), iRed, iGreen, iBlue)
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Closest nearby ped has index ", i, ".")
|
|
#ENDIF
|
|
|
|
RETURN pedArray[i]
|
|
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
IF ( i + iProximity <= COUNT_OF(pedArray) - 1 )
|
|
|
|
IF DOES_ENTITY_EXIST(pedArray[i + iProximity])
|
|
|
|
IF NOT IS_PED_INJURED(pedArray[i + iProximity])
|
|
|
|
IF ( GET_PED_RELATIONSHIP_GROUP_HASH(pedArray[i + iProximity]) = rgHash )
|
|
|
|
IF ( bOnScreen = TRUE )
|
|
|
|
IF IS_ENTITY_ON_SCREEN(pedArray[i + iProximity])
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
DRAW_DEBUG_LINE(GET_ENTITY_COORDS(PedIndex), GET_ENTITY_COORDS(pedArray[i + iProximity]), iRed, iGreen, iBlue)
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Nearby ped on screen offset by ", iProximity, " from closest nearby ped has index ", i + iProximity, ".")
|
|
#ENDIF
|
|
|
|
RETURN pedArray[i + iProximity]
|
|
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
DRAW_DEBUG_LINE(GET_ENTITY_COORDS(PedIndex), GET_ENTITY_COORDS(pedArray[i + iProximity]), iRed, iGreen, iBlue)
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Nearby ped offset by ", iProximity, " from closest nearby ped has index ", i + iProximity, ".")
|
|
#ENDIF
|
|
|
|
RETURN pedArray[i + iProximity]
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDFOR
|
|
|
|
ENDIF
|
|
|
|
RETURN NULL
|
|
|
|
ENDFUNC
|
|
|
|
FUNC PED_INDEX GET_CLOSEST_PED_FROM_RELATIONSHIP_GROUP_BETWEEN_PED_AND_COORD(PED_INDEX PedIndex, REL_GROUP_HASH rgHash, VECTOR vCoordinates
|
|
#IF IS_DEBUG_BUILD, INT iRed = 0, INT iGreen = 255, INT iBlue = 0 #ENDIF)
|
|
|
|
PED_INDEX pedArray[16]
|
|
|
|
INT i = 0
|
|
|
|
IF NOT IS_PED_INJURED(PedIndex)
|
|
|
|
//find nearby peds and sort them closest distance from specified ped
|
|
//put the found ped indexes in the array
|
|
GET_PED_NEARBY_PEDS(PedIndex, pedArray, PEDTYPE_ANIMAL)
|
|
|
|
VECTOR vPedCoords = GET_ENTITY_COORDS(PedIndex)
|
|
|
|
FOR i = 0 TO ( COUNT_OF(pedArray) - 1 )
|
|
|
|
IF DOES_ENTITY_EXIST(pedArray[i])
|
|
|
|
IF NOT IS_PED_INJURED(pedArray[i])
|
|
|
|
//first ped that is in the specified relationship group should be the closest one
|
|
//because GET_PED_NEARBY_PEDS sorts peds by distance
|
|
IF ( GET_PED_RELATIONSHIP_GROUP_HASH(pedArray[i]) = rgHash )
|
|
|
|
IF ( GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(pedArray[i]), vCoordinates) < GET_DISTANCE_BETWEEN_COORDS(vPedCoords, vCoordinates) )
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
DRAW_DEBUG_LINE(GET_ENTITY_COORDS(PedIndex), GET_ENTITY_COORDS(pedArray[i]), iRed, iGreen, iBlue)
|
|
// PRINTSTRING(GET_THIS_SCRIPT_NAME())PRINTSTRING(": GET_CLOSEST_PED_FROM_RELATIONSHIP_GROUP_BETWEEN_PED_AND_COORD() Found closest ped in relationship group ")
|
|
// IF (rgHash = rgEnemies)
|
|
// PRINTSTRING("ENEMIES")
|
|
// ENDIF
|
|
// PRINTSTRING(" between specified ped and coordinates ")
|
|
// PRINTSTRING(GET_STRING_FROM_VECTOR(vCoordinates))
|
|
// PRINTSTRING(" at coordinates ")PRINTSTRING(GET_STRING_FROM_VECTOR(GET_ENTITY_COORDS(pedArray[i])))
|
|
// PRINTSTRING(".")PRINTNL()
|
|
#ENDIF
|
|
|
|
RETURN pedArray[i]
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDFOR
|
|
|
|
ENDIF
|
|
|
|
//if no peds were found,
|
|
//or if peds are not in the specified relationship group
|
|
// #IF IS_DEBUG_BUILD
|
|
// PRINTLN(GET_THIS_SCRIPT_NAME(), ": GET_CLOSEST_PED_BETWEEN_PED_AND_COORD() No peds found between specified ped and coordinates ", vCoordinates, ".")
|
|
// #ENDIF
|
|
|
|
RETURN NULL
|
|
|
|
ENDFUNC
|
|
|
|
FUNC BOOL HAS_PED_DAMAGED_ENTITY(PED_INDEX PedIndex, ENTITY_INDEX EntityIndex)
|
|
|
|
IF NOT IS_PED_INJURED(PedIndex)
|
|
|
|
IF DOES_ENTITY_EXIST(EntityIndex)
|
|
|
|
IF NOT IS_ENTITY_DEAD(EntityIndex)
|
|
|
|
RETURN HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(EntityIndex, PedIndex, TRUE)
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
|
|
ENDFUNC
|
|
|
|
FUNC BOOL HAS_PED_DAMAGED_VEHICLES(PED_INDEX PedIndex, VEH_STRUCT &vsArray[])
|
|
|
|
INT i = 0
|
|
|
|
BOOL bReturn = FALSE
|
|
|
|
FOR i = 0 TO ( COUNT_OF(vsArray) - 1 )
|
|
|
|
IF HAS_PED_DAMAGED_ENTITY(PedIndex, vsArray[i].VehicleIndex)
|
|
|
|
bReturn = TRUE
|
|
|
|
ENDIF
|
|
|
|
ENDFOR
|
|
|
|
RETURN bReturn
|
|
|
|
ENDFUNC
|
|
|
|
FUNC BOOL IS_PED_SHOOTING_AT_ENTITY(PED_INDEX PedIndex, ENTITY_INDEX EntityIndex)
|
|
|
|
IF NOT IS_PED_INJURED(PedIndex)
|
|
|
|
IF DOES_ENTITY_EXIST(EntityIndex)
|
|
|
|
IF NOT IS_ENTITY_DEAD(EntityIndex)
|
|
|
|
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(EntityIndex, PedIndex, FALSE)
|
|
|
|
IF HAS_ENTITY_BEEN_DAMAGED_BY_WEAPON(EntityIndex, WEAPONTYPE_INVALID, GENERALWEAPON_TYPE_ANYWEAPON)
|
|
|
|
RETURN TRUE
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
|
|
ENDFUNC
|
|
|
|
FUNC BOOL IS_PED_SHOOTING_AT_VEHICLES(PED_INDEX PedIndex, VEH_STRUCT &vsArray[])
|
|
|
|
INT i = 0
|
|
|
|
BOOL bReturn = FALSE
|
|
|
|
FOR i = 0 TO ( COUNT_OF(vsArray) - 1 )
|
|
|
|
IF IS_PED_SHOOTING_AT_ENTITY(PedIndex, vsArray[i].VehicleIndex)
|
|
|
|
bReturn = TRUE
|
|
|
|
ENDIF
|
|
|
|
ENDFOR
|
|
|
|
RETURN bReturn
|
|
|
|
ENDFUNC
|
|
|
|
FUNC BOOL IS_PED_SHOOTING_AT_ENEMIES(PED_INDEX PedIndex, ENEMY_STRUCT &esArray[])
|
|
|
|
INT i = 0
|
|
|
|
BOOL bReturn = FALSE
|
|
|
|
FOR i = 0 TO ( COUNT_OF(esArray) - 1 )
|
|
|
|
IF IS_PED_SHOOTING_AT_ENTITY(PedIndex, esArray[i].PedIndex)
|
|
|
|
bReturn = TRUE
|
|
|
|
ENDIF
|
|
|
|
ENDFOR
|
|
|
|
RETURN bReturn
|
|
|
|
ENDFUNC
|
|
|
|
FUNC BOOL IS_PED_SHOOTING_AT_PEDS(PED_INDEX PedIndex, PED_STRUCT &psArray[])
|
|
|
|
INT i = 0
|
|
|
|
BOOL bReturn = FALSE
|
|
|
|
FOR i = 0 TO ( COUNT_OF(psArray) - 1 )
|
|
|
|
IF IS_PED_SHOOTING_AT_ENTITY(PedIndex, psArray[i].PedIndex)
|
|
|
|
bReturn = TRUE
|
|
|
|
ENDIF
|
|
|
|
ENDFOR
|
|
|
|
RETURN bReturn
|
|
|
|
ENDFUNC
|
|
|
|
FUNC BOOL IS_PLAYER_SHOOTING_AT_ANY_PEDS(PED_INDEX PedIndex)
|
|
|
|
IF IS_PLAYER_PLAYING(PLAYER_ID())
|
|
|
|
IF NOT IS_PED_INJURED(PedIndex)
|
|
|
|
IF IS_PED_SHOOTING(PedIndex)
|
|
|
|
IF HAS_PLAYER_DAMAGED_AT_LEAST_ONE_PED(PLAYER_ID())
|
|
|
|
CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_PED(PLAYER_ID())
|
|
|
|
RETURN TRUE
|
|
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
//reset the flag is player is not shooting
|
|
CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_PED(PLAYER_ID())
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
|
|
ENDFUNC
|
|
|
|
FUNC BOOL IS_PED_SHOOTING_AT_AREA(PED_INDEX PedIndex, BOOL bIsPlayer, VECTOR vPosition, FLOAT fRadius #IF IS_DEBUG_BUILD, BOOL bDrawDebugSphere = TRUE,
|
|
INT iRed = 255, INT iGreen = 0, INT iBlue = 0, INT iAlpha = 128 #ENDIF)
|
|
|
|
IF NOT IS_PED_INJURED(PedIndex)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
IF ( bDrawDebugSphere = TRUE )
|
|
DRAW_DEBUG_SPHERE(vPosition, fRadius, iRed, iGreen, iBlue, iAlpha)
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
IF IS_PED_SHOOTING(PedIndex)
|
|
RETURN IS_BULLET_IN_AREA(vPosition, fRadius, bIsPlayer)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
|
|
ENDFUNC
|
|
|
|
FUNC BOOL IS_ENTITY_IN_LOCATE(ENTITY_INDEX EntityIndex, VECTOR vPosition, VECTOR vSize #IF IS_DEBUG_BUILD, STRING sDisplayName = NULL #ENDIF)
|
|
|
|
//display debug locate name first
|
|
#IF IS_DEBUG_BUILD
|
|
IF NOT IS_STRING_NULL_OR_EMPTY(sDisplayName)
|
|
DRAW_DEBUG_TEXT(sDisplayName, vPosition)
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(EntityIndex)
|
|
IF NOT IS_ENTITY_DEAD(EntityIndex)
|
|
IF IS_ENTITY_AT_COORD(EntityIndex, vPosition, vSize)
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
|
|
ENDFUNC
|
|
|
|
FUNC BOOL IS_ENTITY_IN_ANGLED_AREA_LOCATE(ENTITY_INDEX EntityIndex, VECTOR vPosition1, VECTOR vPosition2, FLOAT fWidth #IF IS_DEBUG_BUILD, STRING sDisplayName = NULL #ENDIF)
|
|
|
|
//display debug locate name first
|
|
#IF IS_DEBUG_BUILD
|
|
IF NOT IS_STRING_NULL_OR_EMPTY(sDisplayName)
|
|
DRAW_DEBUG_TEXT(sDisplayName, vPosition1)
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(EntityIndex)
|
|
IF NOT IS_ENTITY_DEAD(EntityIndex)
|
|
IF IS_ENTITY_IN_ANGLED_AREA(EntityIndex, vPosition1, vPosition2, fWidth)
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
|
|
ENDFUNC
|
|
|
|
|
|
/// PURPOSE:
|
|
/// Shoots an extra bullet from specified ped's weapon at sphere specified by coordinates and radius if this ped is firing.
|
|
/// PARAMS:
|
|
/// PedIndex - PED_INDEX of ped to shoot the bullet.
|
|
/// vCoordinates - Specifies coordinates to shoot the bullet at.
|
|
/// fRadius - Specifies the radius of the sphere where the bullet will randomly fly after being fired. Use 0.0 for precise shot at specified coord.
|
|
/// iDamage - Specifies the damage the bullet should cause.
|
|
PROC SHOOT_BULLET_FROM_PED_WEAPON_AT_COORDS(PED_INDEX PedIndex, VECTOR vCoordinates, FLOAT fRadius, INT iDamage)
|
|
|
|
IF DOES_ENTITY_EXIST(PedIndex)
|
|
IF NOT IS_PED_INJURED(PedIndex)
|
|
|
|
IF IS_PED_SHOOTING(PedIndex)
|
|
|
|
WEAPON_TYPE CurrentWeapon
|
|
|
|
IF GET_CURRENT_PED_WEAPON(PedIndex, CurrentWeapon)
|
|
|
|
ENTITY_INDEX WeaponIndex = GET_CURRENT_PED_WEAPON_ENTITY_INDEX(PedIndex)
|
|
|
|
VECTOR vFinalCoordinates = << vCoordinates.X + GET_RANDOM_FLOAT_IN_RANGE(-fRadius, fRadius), vCoordinates.Y + GET_RANDOM_FLOAT_IN_RANGE(-fRadius, fRadius), vCoordinates.Z + GET_RANDOM_FLOAT_IN_RANGE(-fRadius, fRadius) >>
|
|
|
|
SHOOT_SINGLE_BULLET_BETWEEN_COORDS(GET_ENTITY_COORDS(WeaponIndex), vFinalCoordinates, iDamage, TRUE, CurrentWeapon, PedIndex)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
DRAW_DEBUG_LINE(GET_ENTITY_COORDS(WeaponIndex), vFinalCoordinates, 255, 255, 0)
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
DRAW_DEBUG_SPHERE(vCoordinates, fRadius, 255, 255, 0, 64)
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
FUNC BOOL IS_PED_AT_FRAGGABLE_TOMBSTONE_POSITION(PED_INDEX PedIndex, TOMBSTONE_STRUCT &TombstonesArray[], FLOAT fRadius, INT &iOutTombstone)
|
|
|
|
INT i = 0
|
|
|
|
IF NOT IS_PED_INJURED(PedIndex)
|
|
|
|
FOR i = 0 TO ( COUNT_OF(TombstonesArray) - 1 )
|
|
|
|
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PedIndex), TombstonesArray[i].vPosition) < fRadius
|
|
|
|
iOutTombstone = i
|
|
|
|
RETURN TRUE
|
|
|
|
ENDIF
|
|
|
|
ENDFOR
|
|
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
|
|
ENDFUNC
|
|
|
|
PROC RUN_TOMBSTONES_FRAG_CHECK(PED_INDEX PedIndex, PED_INDEX &EnemyPed, INT &iTimer, INT iTimeBetweenChecks, FLOAT fRadius)
|
|
|
|
IF NOT IS_PED_INJURED(PedIndex)
|
|
|
|
IF IS_PED_IN_COVER(PedIndex)
|
|
OR IS_PED_DUCKING(PedIndex)
|
|
|
|
INT iCurrentTombstone = 0
|
|
|
|
//if is ped at one of the specified tombstone fraggable points
|
|
IF IS_PED_AT_FRAGGABLE_TOMBSTONE_POSITION(PedIndex, FraggableTombstones, fRadius, iCurrentTombstone)
|
|
|
|
IF NOT DOES_ENTITY_EXIST(EnemyPed)
|
|
OR ( DOES_ENTITY_EXIST(EnemyPed) AND HAS_TIME_PASSED(iTimeBetweenChecks, iTimer) )
|
|
|
|
EnemyPed = GET_CLOSEST_PED_FROM_RELATIONSHIP_GROUP_FOR_PED(PedIndex, rgEnemies, 0, TRUE #IF IS_DEBUG_BUILD, 255, 255, 0 #ENDIF)
|
|
|
|
iTimer = GET_GAME_TIMER()
|
|
|
|
ENDIF
|
|
|
|
SHOOT_BULLET_FROM_PED_WEAPON_AT_COORDS(EnemyPed, FraggableTombstones[iCurrentTombstone].vShootSphereCenter,
|
|
FraggableTombstones[iCurrentTombstone].fShootSphereRadius, 100)
|
|
|
|
ELSE
|
|
|
|
EnemyPed = NULL
|
|
|
|
iTimer = GET_GAME_TIMER()
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Returns PED_INDEX for specified player ped character from enumCharacterList.
|
|
/// PARAMS:
|
|
/// CHAR_TYPE - Character to get ped index for. For example CHAR_FRANKLIN, CHAR_TREVOR or CHAR_MICHAEL.
|
|
/// RETURNS:
|
|
/// PED_INDEX for the specified player ped character.
|
|
FUNC PED_INDEX GET_PED_INDEX(enumCharacterList CHAR_TYPE)
|
|
|
|
IF ( GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TYPE )
|
|
|
|
RETURN PLAYER_PED_ID()
|
|
|
|
ELSE
|
|
|
|
RETURN sSelectorPeds.pedID[GET_SELECTOR_SLOT_FROM_PLAYER_PED_ENUM(CHAR_TYPE)]
|
|
|
|
ENDIF
|
|
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Warps specified ped to new coordinates and sets specified ped's new heading.
|
|
/// PARAMS:
|
|
/// ped - PED_INDEX to warp.
|
|
/// vNewPosition - VECTOR coordinates specifying new ped's position.
|
|
/// fNewHeading - FLOAT specifying new ped's heading.
|
|
/// bKeepVehicle - Specifies if ped should keep vehicle they are currently in.
|
|
/// bResetGameplayCamera - Specifies if gameplay camera should be positioned behind player's back. Works only for PLAYER_PED_ID().
|
|
/// bLoadScene - Specifies if scene at new provided coordinates should be loaded. Works only for PLAYER_PED_ID().
|
|
PROC WARP_PED(PED_INDEX ped, VECTOR vNewPosition, FLOAT fNewHeading, BOOL bKeepVehicle, BOOL bResetGameplayCamera, BOOL bLoadScene)
|
|
|
|
IF NOT IS_PED_INJURED(ped)
|
|
|
|
|
|
|
|
IF ( bKeepVehicle = TRUE )
|
|
SET_PED_COORDS_KEEP_VEHICLE(ped, vNewPosition)
|
|
ELIF ( bKeepVehicle = FALSE )
|
|
SET_ENTITY_COORDS(ped, vNewPosition)
|
|
ENDIF
|
|
|
|
SET_ENTITY_HEADING(ped, fNewHeading)
|
|
|
|
IF ( ped = PLAYER_PED_ID())
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Warping player ped to coordinates ", vNewPosition, " and heading ", fNewHeading, ".")
|
|
#ENDIF
|
|
|
|
IF ( bResetGameplayCamera = TRUE)
|
|
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0)
|
|
|
|
ENDIF
|
|
|
|
IF ( bLoadScene = TRUE )
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Calling LOAD_SCENE() at coordinates ", vNewPosition, ". This might take a while to load.")
|
|
#ENDIF
|
|
|
|
LOAD_SCENE(vNewPosition)
|
|
|
|
ENDIF
|
|
ELSE
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Warping ped to coordinates ", vNewPosition, " and heading ", fNewHeading, ".")
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC EQUIP_PED_BEST_WEAPON(PED_INDEX PedIndex, BOOL bForceIntoHand)
|
|
IF NOT IS_PED_INJURED(PedIndex)
|
|
WEAPON_TYPE eBestWeaponType = GET_BEST_PED_WEAPON(PedIndex, TRUE)
|
|
IF ( eBestWeaponType <> WEAPONTYPE_UNARMED )
|
|
SET_CURRENT_PED_WEAPON(PedIndex, eBestWeaponType, bForceIntoHand)
|
|
|
|
IF ( GET_AMMO_IN_PED_WEAPON(PedIndex, eBestWeaponType) < GET_MAX_AMMO_IN_CLIP(PedIndex, eBestWeaponType) )
|
|
ADD_AMMO_TO_PED(PedIndex, eBestWeaponType, GET_MAX_AMMO_IN_CLIP(PedIndex, eBestWeaponType) * 2)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Creates scripted coverpoints for peds to use in the shootout
|
|
/// PARAMS:
|
|
/// sArray - Array of coverpoint_struct instances, where all coverpoint details are stored.
|
|
PROC CREATE_COVERPOINTS(COVERPOINT_STRUCT &sArray[], VECTOR vStartPosition)
|
|
|
|
//player's start cover point
|
|
sArray[0].vPosition = << 3256.5776, -4575.2520, 117.2670 >>
|
|
sArray[0].fHeading = 180.0
|
|
sArray[0].CoverpointUsage = COVUSE_WALLTONEITHER
|
|
sArray[0].CoverpointHeight = COVHEIGHT_LOW
|
|
sArray[0].CoverpointArc = COVARC_90
|
|
sArray[0].bActive = FALSE
|
|
sArray[0].bStationary = FALSE
|
|
|
|
//enemy in mocap coverpoint
|
|
sArray[1].vPosition = << 3265.5886, -4590.6963, 116.0538 >>
|
|
sArray[1].fHeading = 356.8507
|
|
sArray[1].CoverpointUsage = COVUSE_WALLTORIGHT
|
|
sArray[1].CoverpointHeight = COVHEIGHT_TOOHIGH
|
|
sArray[1].CoverpointArc = COVARC_90
|
|
sArray[1].bActive = FALSE
|
|
sArray[1].bStationary = FALSE
|
|
|
|
sArray[2].vPosition = << 3252.2168, -4600.8184, 115.6129 >>
|
|
sArray[2].fHeading = 358.2709
|
|
sArray[2].CoverpointUsage = COVUSE_WALLTOLEFT
|
|
sArray[2].CoverpointHeight = COVHEIGHT_TOOHIGH
|
|
sArray[2].CoverpointArc = COVARC_90
|
|
sArray[2].bActive = TRUE
|
|
sArray[2].bStationary = FALSE
|
|
|
|
sArray[3].vPosition = << 3263.4075, -4671.8623, 112.9176 >>
|
|
sArray[3].fHeading = 343.1592
|
|
sArray[3].CoverpointUsage = COVUSE_WALLTONEITHER
|
|
sArray[3].CoverpointHeight = COVHEIGHT_TOOHIGH
|
|
sArray[3].CoverpointArc = COVARC_90
|
|
sArray[3].bActive = TRUE
|
|
sArray[3].bStationary = FALSE
|
|
|
|
sArray[4].vPosition = << 3259.5498, -4670.3813, 113.0985 >>
|
|
sArray[4].fHeading = 333.0004
|
|
sArray[4].CoverpointUsage = COVUSE_WALLTOLEFT
|
|
sArray[4].CoverpointHeight = COVHEIGHT_TOOHIGH
|
|
sArray[4].CoverpointArc = COVARC_90
|
|
sArray[4].bActive = TRUE
|
|
sArray[4].bStationary = FALSE
|
|
|
|
sArray[5].vPosition = << 3284.39, -4619.99, 115.01 >>
|
|
sArray[5].fHeading = 333.0004
|
|
sArray[5].CoverpointUsage = COVUSE_WALLTOLEFT
|
|
sArray[5].CoverpointHeight = COVHEIGHT_TOOHIGH
|
|
sArray[5].CoverpointArc = COVARC_180
|
|
sArray[5].bActive = TRUE
|
|
sArray[5].bStationary = TRUE
|
|
|
|
sArray[6].vPosition = << 3281.66, -4627.20, 114.88 >>
|
|
sArray[6].fHeading = 333.0004
|
|
sArray[6].CoverpointUsage = COVUSE_WALLTOLEFT
|
|
sArray[6].CoverpointHeight = COVHEIGHT_TOOHIGH
|
|
sArray[6].CoverpointArc = COVARC_180
|
|
sArray[6].bActive = TRUE
|
|
sArray[6].bStationary = TRUE
|
|
|
|
sArray[7].vPosition = << 3266.56, -4624.87, 115.22 >>
|
|
sArray[7].fHeading = 333.0004
|
|
sArray[7].CoverpointUsage = COVUSE_WALLTOLEFT
|
|
sArray[7].CoverpointHeight = COVHEIGHT_TOOHIGH
|
|
sArray[7].CoverpointArc = COVARC_180
|
|
sArray[7].bActive = TRUE
|
|
sArray[7].bStationary = TRUE
|
|
|
|
sArray[8].vPosition = << 3272.55, -4634.51, 114.69 >>
|
|
sArray[8].fHeading = 333.0004
|
|
sArray[8].CoverpointUsage = COVUSE_WALLTOLEFT
|
|
sArray[8].CoverpointHeight = COVHEIGHT_TOOHIGH
|
|
sArray[8].CoverpointArc = COVARC_180
|
|
sArray[8].bActive = TRUE
|
|
sArray[8].bStationary = TRUE
|
|
|
|
sArray[9].vPosition = <<3275.6057, -4655.5288, 113.0920>>
|
|
sArray[9].fHeading = 0.0
|
|
sArray[9].CoverpointUsage = COVUSE_WALLTONEITHER
|
|
sArray[9].CoverpointHeight = COVHEIGHT_LOW
|
|
sArray[9].CoverpointArc = COVARC_90
|
|
sArray[9].bActive = TRUE
|
|
sArray[9].bStationary = FALSE
|
|
|
|
sArray[10].vPosition = << 3270.9761, -4639.2290, 113.7132 >>
|
|
sArray[10].fHeading = 0.0
|
|
sArray[10].CoverpointUsage = COVUSE_WALLTOLEFT
|
|
sArray[10].CoverpointHeight = COVHEIGHT_TOOHIGH
|
|
sArray[10].CoverpointArc = COVARC_90
|
|
sArray[10].bActive = TRUE
|
|
sArray[10].bStationary = FALSE
|
|
|
|
sArray[11].vPosition = << 3274.2800, -4639.3032, 113.7452 >>
|
|
sArray[11].fHeading = 0.0
|
|
sArray[11].CoverpointUsage = COVUSE_WALLTORIGHT
|
|
sArray[11].CoverpointHeight = COVHEIGHT_TOOHIGH
|
|
sArray[11].CoverpointArc = COVARC_90
|
|
sArray[11].bActive = TRUE
|
|
sArray[11].bStationary = FALSE
|
|
|
|
sArray[12].vPosition = <<3269.2097, -4627.7412, 114.8999>>
|
|
sArray[12].fHeading = 0.0
|
|
sArray[12].CoverpointUsage = COVUSE_WALLTOLEFT
|
|
sArray[12].CoverpointHeight = COVHEIGHT_LOW
|
|
sArray[12].CoverpointArc = COVARC_90
|
|
sArray[12].bActive = TRUE
|
|
sArray[12].bStationary = FALSE
|
|
|
|
sArray[13].vPosition = <<3275.9355, -4617.3945, 115.1056>>
|
|
sArray[13].fHeading = 0.0
|
|
sArray[13].CoverpointUsage = COVUSE_WALLTORIGHT
|
|
sArray[13].CoverpointHeight = COVHEIGHT_LOW
|
|
sArray[13].CoverpointArc = COVARC_90
|
|
sArray[13].bActive = TRUE
|
|
sArray[13].bStationary = FALSE
|
|
|
|
sArray[14].vPosition = << 3278.8743, -4629.7856, 115.0547 >>
|
|
sArray[14].fHeading = 89.5197
|
|
sArray[14].CoverpointUsage = COVUSE_WALLTOLEFT
|
|
sArray[14].CoverpointHeight = COVHEIGHT_LOW
|
|
sArray[14].CoverpointArc = COVARC_90
|
|
sArray[14].bActive = TRUE
|
|
sArray[14].bStationary = FALSE
|
|
|
|
sArray[15].vPosition = << 3255.8416, -4685.8252, 111.9065 >>
|
|
sArray[15].fHeading = 346.2400
|
|
sArray[15].CoverpointUsage = COVUSE_WALLTOLEFT
|
|
sArray[15].CoverpointHeight = COVHEIGHT_LOW
|
|
sArray[15].CoverpointArc = COVARC_90
|
|
sArray[15].bActive = TRUE
|
|
sArray[15].bStationary = FALSE
|
|
|
|
sArray[16].vPosition = << 3256.8000, -4692.0205, 111.8840 >>
|
|
sArray[16].fHeading = 310.2977
|
|
sArray[16].CoverpointUsage = COVUSE_WALLTORIGHT
|
|
sArray[16].CoverpointHeight = COVHEIGHT_TOOHIGH
|
|
sArray[16].CoverpointArc = COVARC_180
|
|
sArray[16].bActive = TRUE
|
|
sArray[16].bStationary = FALSE
|
|
|
|
sArray[17].vPosition = <<3281.5632, -4665.9849, 113.1895>>
|
|
sArray[17].fHeading = 0.0
|
|
sArray[17].CoverpointUsage = COVUSE_WALLTORIGHT
|
|
sArray[17].CoverpointHeight = COVHEIGHT_TOOHIGH
|
|
sArray[17].CoverpointArc = COVARC_90
|
|
sArray[17].bActive = TRUE
|
|
sArray[17].bStationary = FALSE
|
|
|
|
sArray[18].vPosition = << 3251.7041, -4684.2788, 112.0217 >>
|
|
sArray[18].fHeading = 336.7272
|
|
sArray[18].CoverpointUsage = COVUSE_WALLTORIGHT
|
|
sArray[18].CoverpointHeight = COVHEIGHT_TOOHIGH
|
|
sArray[18].CoverpointArc = COVARC_0TO45
|
|
sArray[18].bActive = FALSE
|
|
sArray[18].bStationary = TRUE
|
|
|
|
sArray[19].vPosition = << 3262.1086, -4691.1997, 112.0502 >>
|
|
sArray[19].fHeading = 34.5997
|
|
sArray[19].CoverpointUsage = COVUSE_WALLTOLEFT
|
|
sArray[19].CoverpointHeight = COVHEIGHT_LOW
|
|
sArray[19].CoverpointArc = COVARC_180
|
|
sArray[19].bActive = TRUE
|
|
sArray[19].bStationary = FALSE
|
|
|
|
sArray[20].vPosition = <<3281.5667, -4649.8442, 113.5098>>
|
|
sArray[20].fHeading = 0.0
|
|
sArray[20].CoverpointUsage = COVUSE_WALLTORIGHT
|
|
sArray[20].CoverpointHeight = COVHEIGHT_TOOHIGH
|
|
sArray[20].CoverpointArc = COVARC_90
|
|
sArray[20].bActive = TRUE
|
|
sArray[20].bStationary = FALSE
|
|
|
|
sArray[21].vPosition = <<3275.0962, -4659.8999, 113.0035>>
|
|
sArray[21].fHeading = 0.0
|
|
sArray[21].CoverpointUsage = COVUSE_WALLTONEITHER
|
|
sArray[21].CoverpointHeight = COVHEIGHT_LOW
|
|
sArray[21].CoverpointArc = COVARC_90
|
|
sArray[21].bActive = TRUE
|
|
sArray[21].bStationary = FALSE
|
|
|
|
sArray[22].vPosition = <<3265.5234, -4657.7856, 113.0917>>
|
|
sArray[22].fHeading = 0.0
|
|
sArray[22].CoverpointUsage = COVUSE_WALLTONEITHER
|
|
sArray[22].CoverpointHeight = COVHEIGHT_LOW
|
|
sArray[22].CoverpointArc = COVARC_90
|
|
sArray[22].bActive = TRUE
|
|
sArray[22].bStationary = FALSE
|
|
|
|
sArray[23].vPosition = << 3246.5354, -4679.5972, 112.1638 >>
|
|
sArray[23].fHeading = 341.1975
|
|
sArray[23].CoverpointUsage = COVUSE_WALLTORIGHT
|
|
sArray[23].CoverpointHeight = COVHEIGHT_TOOHIGH
|
|
sArray[23].CoverpointArc = COVARC_90
|
|
sArray[23].bActive = TRUE
|
|
sArray[23].bStationary = FALSE
|
|
|
|
sArray[24].vPosition = << 3248.0078, -4680.0767, 112.3925 >>
|
|
sArray[24].fHeading = 337.8813
|
|
sArray[24].CoverpointUsage = COVUSE_WALLTORIGHT
|
|
sArray[24].CoverpointHeight = COVHEIGHT_TOOHIGH
|
|
sArray[24].CoverpointArc = COVARC_90
|
|
sArray[24].bActive = TRUE
|
|
sArray[24].bStationary = FALSE
|
|
|
|
sArray[25].vPosition = << 3240.0486, -4665.3052, 114.2898 >>
|
|
sArray[25].fHeading = 0.0
|
|
sArray[25].CoverpointUsage = COVUSE_WALLTORIGHT
|
|
sArray[25].CoverpointHeight = COVHEIGHT_TOOHIGH
|
|
sArray[25].CoverpointArc = COVARC_90
|
|
sArray[25].bActive = TRUE
|
|
sArray[25].bStationary = FALSE
|
|
|
|
sArray[26].vPosition = << 3231.7991, -4681.4941, 111.9197 >>
|
|
sArray[26].fHeading = 272.3667
|
|
sArray[26].CoverpointUsage = COVUSE_WALLTOLEFT
|
|
sArray[26].CoverpointHeight = COVHEIGHT_TOOHIGH
|
|
sArray[26].CoverpointArc = COVARC_90
|
|
sArray[26].bActive = TRUE
|
|
sArray[26].bStationary = FALSE
|
|
|
|
sArray[27].vPosition = <<3258.3953, -4608.1440, 115.4520>>
|
|
sArray[27].fHeading = 4.3189
|
|
sArray[27].CoverpointUsage = COVUSE_WALLTOLEFT
|
|
sArray[27].CoverpointHeight = COVHEIGHT_TOOHIGH
|
|
sArray[27].CoverpointArc = COVARC_90
|
|
sArray[27].bActive = TRUE
|
|
sArray[27].bStationary = FALSE
|
|
|
|
sArray[28].vPosition = << 3266.5139, -4616.4390, 115.0480 >>
|
|
sArray[28].fHeading = 3.0096
|
|
sArray[28].CoverpointUsage = COVUSE_WALLTONEITHER
|
|
sArray[28].CoverpointHeight = COVHEIGHT_TOOHIGH
|
|
sArray[28].CoverpointArc = COVARC_90
|
|
sArray[28].bActive = TRUE
|
|
sArray[28].bStationary = FALSE
|
|
|
|
sArray[29].vPosition = <<3213.1648, -4715.6494, 111.8129>> //<<3213.2832, -4715.4478, 111.8368>>
|
|
sArray[29].fHeading = 295.1623
|
|
sArray[29].CoverpointUsage = COVUSE_WALLTONEITHER
|
|
sArray[29].CoverpointHeight = COVHEIGHT_TOOHIGH
|
|
sArray[29].CoverpointArc = COVARC_90
|
|
sArray[29].bActive = FALSE
|
|
sArray[29].bStationary = FALSE
|
|
|
|
sArray[30].vPosition = <<3265.4260, -4586.9629, 117.0842>>
|
|
sArray[30].fHeading = 180.0
|
|
sArray[30].CoverpointUsage = COVUSE_WALLTONEITHER
|
|
sArray[30].CoverpointHeight = COVHEIGHT_LOW
|
|
sArray[30].CoverpointArc = COVARC_90
|
|
sArray[30].bActive = FALSE
|
|
sArray[30].bStationary = FALSE
|
|
|
|
//3262.43, -4586.83, 117.20
|
|
sArray[31].vPosition = << 3262.45, -4586.90, 117.11 >>
|
|
sArray[31].fHeading = 180.0
|
|
sArray[31].CoverpointUsage = COVUSE_WALLTONEITHER
|
|
sArray[31].CoverpointHeight = COVHEIGHT_LOW
|
|
sArray[31].CoverpointArc = COVARC_90
|
|
sArray[31].bActive = FALSE
|
|
sArray[31].bStationary = FALSE
|
|
|
|
sArray[32].vPosition = <<3274.1230, -4635.4863, 114.7559>>
|
|
sArray[32].fHeading = 180.0
|
|
sArray[32].CoverpointUsage = COVUSE_WALLTONEITHER
|
|
sArray[32].CoverpointHeight = COVHEIGHT_LOW
|
|
sArray[32].CoverpointArc = COVARC_90
|
|
sArray[32].bActive = FALSE
|
|
sArray[32].bStationary = FALSE
|
|
|
|
sArray[33].vPosition = <<3271.0203, -4635.4619, 114.6817>>
|
|
sArray[33].fHeading = 180.0
|
|
sArray[33].CoverpointUsage = COVUSE_WALLTONEITHER
|
|
sArray[33].CoverpointHeight = COVHEIGHT_LOW
|
|
sArray[33].CoverpointArc = COVARC_90
|
|
sArray[33].bActive = FALSE
|
|
sArray[33].bStationary = FALSE
|
|
|
|
sArray[34].vPosition = <<3260.0383, -4669.2715, 112.8813>>
|
|
sArray[34].fHeading = 161.3189
|
|
sArray[34].CoverpointUsage = COVUSE_WALLTORIGHT
|
|
sArray[34].CoverpointHeight = COVHEIGHT_TOOHIGH
|
|
sArray[34].CoverpointArc = COVARC_90
|
|
sArray[34].bActive = FALSE
|
|
sArray[34].bStationary = FALSE
|
|
|
|
sArray[35].vPosition = <<3233.0288, -4681.5645, 112.2276>>
|
|
sArray[35].fHeading = 92.2093
|
|
sArray[35].CoverpointUsage = COVUSE_WALLTORIGHT
|
|
sArray[35].CoverpointHeight = COVHEIGHT_TOOHIGH
|
|
sArray[35].CoverpointArc = COVARC_90
|
|
sArray[35].bActive = FALSE
|
|
sArray[35].bStationary = FALSE
|
|
|
|
|
|
//create coverpoints
|
|
INT i = 0
|
|
|
|
FOR i = 0 TO ( COUNT_OF(sArray) - 1 )
|
|
|
|
IF ( sArray[i].bStationary = FALSE )
|
|
|
|
sArray[i].CoverpointIndex = ADD_COVER_POINT(sArray[i].vPosition, sArray[i].fHeading, sArray[i].CoverpointUsage,
|
|
sArray[i].CoverpointHeight, sArray[i].CoverpointArc)
|
|
|
|
ENDIF
|
|
|
|
//save the distance from start of the shootout corrdinates
|
|
sArray[i].fDistance = VDIST2(vStartPosition, sArray[i].vPosition)
|
|
|
|
sArray[i].bTaken = FALSE
|
|
sArray[i].TakenPedIndex = NULL
|
|
|
|
ENDFOR
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created scripted coverpoints.")
|
|
#ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC REMOVE_COVERPOINTS(COVERPOINT_STRUCT &sArray[])
|
|
|
|
INT i = 0
|
|
|
|
FOR i = 0 TO ( COUNT_OF(sArray) - 1 )
|
|
|
|
REMOVE_COVER_POINT(sArray[i].CoverpointIndex)
|
|
|
|
ENDFOR
|
|
|
|
ENDPROC
|
|
|
|
PROC INITIALISE_FRAGGABLE_TOMBSTONES(TOMBSTONE_STRUCT &tArray[])
|
|
|
|
tArray[0].vPosition = << 3256.42, -4575.27, 117.15 >>
|
|
tArray[0].vShootSphereCenter = << 3256.39, -4575.69, 118.25 >>
|
|
tArray[0].fShootSphereRadius = 0.35
|
|
|
|
tArray[1].vPosition = << 3254.7119, -4575.1860, 117.1567 >>
|
|
tArray[1].vShootSphereCenter = << 3254.68, -4576.13, 118.15 >>
|
|
tArray[1].fShootSphereRadius = 0.35
|
|
|
|
tArray[2].vPosition = << 3252.7468, -4575.3774, 117.1567 >>
|
|
tArray[2].vShootSphereCenter = << 3252.76, -4576.09, 118.15 >>
|
|
tArray[2].fShootSphereRadius = 0.35
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Requests IPLs for prologue map
|
|
PROC REQUEST_PROLOGUE_IPLS(#IF IS_DEBUG_BUILD BOOL bPrintOutput = FALSE #ENDIF)
|
|
|
|
REQUEST_IPL("prologue01")
|
|
REQUEST_IPL("prologue01c")
|
|
REQUEST_IPL("prologue01d")
|
|
REQUEST_IPL("prologue01e")
|
|
REQUEST_IPL("prologue01f")
|
|
REQUEST_IPL("prologue01g")
|
|
REQUEST_IPL("prologue01h")
|
|
REQUEST_IPL("prologue01i")
|
|
REQUEST_IPL("prologue01j")
|
|
REQUEST_IPL("prologue01k")
|
|
REQUEST_IPL("prologue01z")
|
|
|
|
REQUEST_IPL("prologue02")
|
|
|
|
REQUEST_IPL("prologue03")
|
|
REQUEST_IPL("prologue03b")
|
|
|
|
REQUEST_IPL("prologue04")
|
|
REQUEST_IPL("prologue04b")
|
|
|
|
REQUEST_IPL("prologue05")
|
|
REQUEST_IPL("prologue05b")
|
|
|
|
REQUEST_IPL("prologue06")
|
|
REQUEST_IPL("prologue06b")
|
|
|
|
REQUEST_IPL("prologuerd")
|
|
REQUEST_IPL("prologuerdb")
|
|
|
|
REQUEST_IPL("prologue_occl")
|
|
|
|
REQUEST_IPL("prologue_m2_door") //cash depot door
|
|
REQUEST_IPL("prologue06_pannel")//cash depot panel covering blood decal
|
|
|
|
REQUEST_IPL("prologue_LODLights") REMOVE_IPL_FROM_REMOVAL_LIST("prologue_LODLights")
|
|
REQUEST_IPL("prologue_DistantLights") REMOVE_IPL_FROM_REMOVAL_LIST("prologue_DistantLights")
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
IF ( bPrintOutput = TRUE )
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Requesting prologue IPLs.")
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC REQUEST_PROLOGUE_GRAVE_IPL(BOOL bGraveCovered)
|
|
|
|
IF ( bGraveCovered = TRUE )
|
|
REQUEST_IPL("prologue03_grv_cov")
|
|
ELSE
|
|
REQUEST_IPL("prologue03_grv_dug")
|
|
REQUEST_IPL("prologue_grv_torch")
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC REMOVE_PROLOGUE_GRAVE_IPL(BOOL bGraveCovered)
|
|
|
|
IF ( bGraveCovered = TRUE )
|
|
REMOVE_IPL("prologue03_grv_cov")
|
|
ELSE
|
|
REMOVE_IPL("prologue03_grv_dug")
|
|
REMOVE_IPL("prologue_grv_torch")
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Removes IPLs for prologue map
|
|
PROC REMOVE_ALL_PROLOGUE_IPLS()
|
|
|
|
REMOVE_IPL("prologue01")
|
|
REMOVE_IPL("prologue01c")
|
|
REMOVE_IPL("prologue01d")
|
|
REMOVE_IPL("prologue01e")
|
|
REMOVE_IPL("prologue01f")
|
|
REMOVE_IPL("prologue01g")
|
|
REMOVE_IPL("prologue01h")
|
|
REMOVE_IPL("prologue01i")
|
|
REMOVE_IPL("prologue01j")
|
|
REMOVE_IPL("prologue01k")
|
|
REMOVE_IPL("prologue01z")
|
|
|
|
REMOVE_IPL("prologue02")
|
|
|
|
REMOVE_IPL("prologue03")
|
|
REMOVE_IPL("prologue03b")
|
|
|
|
REMOVE_IPL("prologue04")
|
|
REMOVE_IPL("prologue04b")
|
|
|
|
REMOVE_IPL("prologue05")
|
|
REMOVE_IPL("prologue05b")
|
|
|
|
REMOVE_IPL("prologue06")
|
|
REMOVE_IPL("prologue06b")
|
|
|
|
REMOVE_IPL("prologuerd")
|
|
REMOVE_IPL("prologuerdb")
|
|
|
|
REMOVE_IPL("prologue_occl")
|
|
|
|
REMOVE_IPL("prologue_m2_door") //cash depot door
|
|
REMOVE_IPL("prologue06_pannel") //cash depot panel covering blood decal
|
|
|
|
REMOVE_IPL_WHEN_SCREEN_IS_FADED_OUT("prologue_LODLights")
|
|
REMOVE_IPL_WHEN_SCREEN_IS_FADED_OUT("prologue_DistantLights")
|
|
|
|
//remove grave IPLs
|
|
REMOVE_IPL("prologue03_grv_cov") //grave covered up
|
|
REMOVE_IPL("prologue03_grv_dug") //grave dug up
|
|
REMOVE_IPL("prologue_grv_torch") //grave torch
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Removing prologue IPLs.")
|
|
#ENDIF
|
|
|
|
ENDPROC
|
|
|
|
FUNC BOOL ARE_PROLOGUE_IPLS_ACTIVE(#IF IS_DEBUG_BUILD BOOL bPrintOutput = FALSE #ENDIF)
|
|
|
|
IF IS_IPL_ACTIVE("prologue01")
|
|
AND IS_IPL_ACTIVE("prologue01c")
|
|
AND IS_IPL_ACTIVE("prologue01d")
|
|
AND IS_IPL_ACTIVE("prologue01e")
|
|
AND IS_IPL_ACTIVE("prologue01f")
|
|
AND IS_IPL_ACTIVE("prologue01g")
|
|
AND IS_IPL_ACTIVE("prologue01h")
|
|
AND IS_IPL_ACTIVE("prologue01i")
|
|
AND IS_IPL_ACTIVE("prologue01j")
|
|
AND IS_IPL_ACTIVE("prologue01k")
|
|
AND IS_IPL_ACTIVE("prologue01z")
|
|
AND IS_IPL_ACTIVE("prologue02")
|
|
AND IS_IPL_ACTIVE("prologue03")
|
|
AND IS_IPL_ACTIVE("prologue03b")
|
|
AND IS_IPL_ACTIVE("prologue04")
|
|
AND IS_IPL_ACTIVE("prologue04b")
|
|
AND IS_IPL_ACTIVE("prologue05")
|
|
AND IS_IPL_ACTIVE("prologue05b")
|
|
AND IS_IPL_ACTIVE("prologue06")
|
|
AND IS_IPL_ACTIVE("prologue06b")
|
|
AND IS_IPL_ACTIVE("prologuerd")
|
|
AND IS_IPL_ACTIVE("prologuerdb")
|
|
AND IS_IPL_ACTIVE("prologue_occl")
|
|
AND IS_IPL_ACTIVE("prologue_m2_door")
|
|
AND IS_IPL_ACTIVE("prologue06_pannel")
|
|
AND IS_IPL_ACTIVE("prologue_LODLights")
|
|
AND IS_IPL_ACTIVE("prologue_DistantLights")
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
IF ( bPrintOutput = TRUE )
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Requested prologue IPLs are active.")
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
RETURN TRUE
|
|
|
|
ELSE
|
|
|
|
REQUEST_PROLOGUE_IPLS(#IF IS_DEBUG_BUILD bPrintOutput #ENDIF)
|
|
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
|
|
ENDFUNC
|
|
|
|
FUNC BOOL IS_PROLOGUE_GRAVE_IPL_ACTIVE(BOOL bGraveCovered)
|
|
|
|
IF ( bGraveCovered = TRUE AND IS_IPL_ACTIVE("prologue03_grv_cov"))
|
|
OR ( bGraveCovered = FALSE AND IS_IPL_ACTIVE("prologue03_grv_dug") AND IS_IPL_ACTIVE("prologue_grv_torch") )
|
|
|
|
RETURN TRUE
|
|
|
|
ELSE
|
|
|
|
REQUEST_PROLOGUE_GRAVE_IPL(bGraveCovered)
|
|
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
|
|
ENDFUNC
|
|
|
|
PROC INITIALISE_ROADNODES(ROADNODE_STRUCT &sArray[])
|
|
|
|
INT i
|
|
|
|
FOR i = 0 TO ( COUNT_OF(sArray) - 1 )
|
|
sArray[i].bCurrent = FALSE
|
|
sArray[i].bVisited = FALSE
|
|
sArray[i].bInVehicleOnly = FALSE
|
|
sArray[i].fAllowedDistance = 30.0
|
|
sArray[i].fFailDistance = 65.0
|
|
ENDFOR
|
|
|
|
sArray[0].vPosition = << 5389.9370, -5119.8447, 77.2221 >>
|
|
sArray[0].fAllowedDistance = 60.0
|
|
sArray[0].fFailDistance = 75.0
|
|
|
|
sArray[1].vPosition = << 5345.9414, -5119.0063, 77.5530 >>
|
|
sArray[2].vPosition = << 5296.8979, -5117.0566, 77.7141 >>
|
|
sArray[3].vPosition = << 5247.0103, -5118.9624, 78.1801 >>
|
|
sArray[4].vPosition = << 5204.3687, -5109.8389, 80.1127 >>
|
|
sArray[5].vPosition = << 5159.1436, -5099.8164, 82.9601 >>
|
|
sArray[6].vPosition = << 5108.6816, -5096.3379, 85.0854 >>
|
|
sArray[7].vPosition = << 5062.9180, -5100.3804, 86.1269 >>
|
|
sArray[8].vPosition = << 5015.0063, -5099.8042, 87.3856 >>
|
|
sArray[9].vPosition = << 4969.4209, -5094.0811, 89.0202 >>
|
|
sArray[10].vPosition = << 4919.6489, -5074.7393, 92.9304 >>
|
|
sArray[11].vPosition = << 4870.7705, -5078.6123, 93.9856 >>
|
|
sArray[12].vPosition = << 4832.3604, -5084.3633, 99.4540 >>
|
|
sArray[13].vPosition = << 4785.0508, -5086.8774, 105.334 >>
|
|
sArray[14].vPosition = << 4738.4673, -5080.2607, 105.8345 >>
|
|
sArray[15].vPosition = << 4686.5527, -5076.7695, 104.6976 >>
|
|
sArray[16].vPosition = << 4647.9287, -5081.8486, 104.5225 >>
|
|
sArray[17].vPosition = << 4602.0444, -5065.8916, 107.5456 >>
|
|
sArray[18].vPosition = << 4565.0513, -5069.5972, 109.6650 >>
|
|
sArray[19].vPosition = << 4536.7461, -5087.0767, 109.5740 >>
|
|
sArray[20].vPosition = << 4509.1904, -5097.9014, 109.6287 >>
|
|
sArray[21].vPosition = << 4456.6255, -5103.6973, 110.0983 >>
|
|
sArray[22].vPosition = << 4424.8999, -5098.8540, 109.9986 >>
|
|
sArray[23].vPosition = << 4396.0020, -5093.2793, 110.1756 >>
|
|
sArray[24].vPosition = << 4353.3970, -5084.6865, 110.0036 >>
|
|
sArray[25].vPosition = << 4320.7988, -5079.9478, 109.9395 >>
|
|
sArray[26].vPosition = << 4291.6147, -5075.3096, 109.5563 >>
|
|
sArray[27].vPosition = << 4267.0718, -5073.1646, 109.8080 >>
|
|
sArray[28].vPosition = << 4226.2935, -5070.5444, 109.8746 >>
|
|
sArray[29].vPosition = << 4174.7227, -5066.4771, 109.3556 >>
|
|
sArray[30].vPosition = << 4143.5771, -5062.4434, 108.4574 >>
|
|
sArray[31].vPosition = << 4093.8284, -5059.8164, 107.4577 >>
|
|
sArray[32].vPosition = << 4052.0479, -5055.2261, 107.6872 >>
|
|
sArray[32].fFailDistance = 75.0
|
|
sArray[33].vPosition = << 4004.2981, -5049.7749, 108.2748 >>
|
|
sArray[33].fFailDistance = 75.0
|
|
sArray[34].vPosition = << 3964.8726, -5042.9771, 108.9244 >>
|
|
sArray[34].fFailDistance = 80.0
|
|
sArray[35].vPosition = << 3917.5972, -5032.8413, 109.8531 >>
|
|
sArray[35].fFailDistance = 80.0
|
|
sArray[36].vPosition = << 3878.2581, -5020.6216, 110.4011 >>
|
|
sArray[36].fFailDistance = 80.0
|
|
sArray[37].vPosition = << 3833.2644, -5007.9419, 110.8658 >>
|
|
sArray[37].fFailDistance = 80.0
|
|
sArray[38].vPosition = << 3794.0808, -4991.2241, 110.7152 >>
|
|
sArray[38].fFailDistance = 80.0
|
|
sArray[39].vPosition = << 3760.8127, -4980.0356, 110.1112 >>
|
|
sArray[39].fFailDistance = 80.0
|
|
sArray[40].vPosition = << 3732.6055, -4965.3408, 110.3322 >>
|
|
sArray[40].fFailDistance = 80.0
|
|
sArray[41].vPosition = << 3693.6980, -4948.2495, 110.6774 >>
|
|
sArray[41].fFailDistance = 80.0
|
|
sArray[42].vPosition = << 3671.0850, -4935.0083, 110.6896 >>
|
|
sArray[42].fFailDistance = 80.0
|
|
sArray[43].vPosition = << 3627.5833, -4914.8174, 110.6058 >>
|
|
sArray[44].vPosition = << 3590.4031, -4898.1479, 110.6681 >>
|
|
sArray[45].vPosition = << 3553.3826, -4885.2036, 110.7241 >>
|
|
sArray[46].vPosition = << 3524.9050, -4873.6226, 110.7502 >>
|
|
sArray[47].vPosition = << 3481.6187, -4862.8203, 110.7855 >>
|
|
sArray[48].vPosition = << 3447.1887, -4856.9600, 110.7985 >>
|
|
sArray[49].vPosition = << 3415.6260, -4851.4873, 110.8072 >>
|
|
sArray[50].vPosition = << 3387.0598, -4848.4624, 110.7909 >>
|
|
sArray[51].vPosition = << 3343.5305, -4845.6938, 110.8147 >>
|
|
sArray[52].vPosition = << 3313.5476, -4842.9521, 110.8140 >>
|
|
sArray[53].vPosition = << 3270.7791, -4839.1641, 110.8142 >>
|
|
sArray[54].vPosition = << 3242.1299, -4837.0957, 110.8146 >>
|
|
sArray[55].vPosition = << 3212.8823, -4833.6548, 110.8150 >>
|
|
sArray[55].fAllowedDistance = 25.0
|
|
sArray[55].fFailDistance = 50.0
|
|
sArray[56].vPosition = << 3214.8853, -4805.0098, 110.8144 >>
|
|
sArray[56].fAllowedDistance = 35.0
|
|
sArray[56].fFailDistance = 55.0
|
|
sArray[57].vPosition = << 3217.2200, -4777.5288, 110.8147 >>
|
|
sArray[58].vPosition = << 3220.8281, -4727.3423, 111.2513 >>
|
|
sArray[58].bInVehicleOnly = TRUE
|
|
|
|
ENDPROC
|
|
|
|
FUNC BOOL CAN_GET_CLOSEST_ROADNODE_FOR_PED(PED_INDEX PedIndex, ROADNODE_STRUCT &sArray[], ROADNODE_STRUCT &sResult
|
|
#IF IS_DEBUG_BUILD, BOOL bPrintOutput = FALSE #ENDIF)
|
|
|
|
INT i = 0
|
|
|
|
FLOAT fShortestDistance = 1000.0
|
|
|
|
FLOAT fCurrentDistance = 0.0
|
|
|
|
INT iClosestRoadNode = -1
|
|
|
|
IF NOT IS_PED_INJURED(PedIndex)
|
|
|
|
FOR i = 0 TO ( COUNT_OF(sArray) - 1 )
|
|
|
|
IF ( sArray[i].bVisited = FALSE ) //check only road nodes not yet visited
|
|
|
|
fCurrentDistance = GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PedIndex), sArray[i].vPosition)
|
|
|
|
IF ( fCurrentDistance < fShortestDistance)
|
|
|
|
fShortestDistance = fCurrentDistance
|
|
|
|
iClosestRoadNode = i
|
|
|
|
sArray[i].bCurrent = TRUE
|
|
|
|
IF ( i > 0 )
|
|
|
|
IF ( sArray[i - 1].bCurrent = TRUE )
|
|
sArray[i - 1].bCurrent = FALSE
|
|
sArray[i - 1].bVisited = TRUE
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDFOR
|
|
|
|
ENDIF
|
|
|
|
IF ( iClosestRoadNode = -1 )
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
IF ( bPrintOutput = TRUE )
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_GET_CLOSEST_ROADNODE_FOR_PED() No road nodes found.")
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
RETURN FALSE
|
|
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
IF ( bPrintOutput = TRUE )
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_GET_CLOSEST_ROADNODE_FOR_PED() Found closest road node from road nodes array at index ", iClosestRoadNode, ".")
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
sResult = sArray[iClosestRoadNode]
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
DRAW_DEBUG_LINE(GET_ENTITY_COORDS(PedIndex), sArray[iClosestRoadNode].vPosition, 0, 255, 0)
|
|
#ENDIF
|
|
|
|
RETURN TRUE
|
|
|
|
ENDFUNC
|
|
|
|
PROC RUN_ROADNODES_CHECK(PED_INDEX PedIndex #IF IS_DEBUG_BUILD, BOOL bPrintOutput = FALSE #ENDIF)
|
|
|
|
IF NOT IS_PED_INJURED(PedIndex)
|
|
|
|
ROADNODE_STRUCT sCurrentRoadNode
|
|
|
|
IF CAN_GET_CLOSEST_ROADNODE_FOR_PED(PedIndex, sRoadNodes, sCurrentRoadNode #IF IS_DEBUG_BUILD, bPrintOutput #ENDIF)
|
|
|
|
FLOAT fDistanceToCurrentRoadNode = GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PedIndex), sCurrentRoadNode.vPosition)
|
|
|
|
//check if player should fail the mission for driving far away from current road node
|
|
IF ( fDistanceToCurrentRoadNode > sCurrentRoadNode.fFailDistance )
|
|
|
|
IF ( sCurrentRoadNode.bInVehicleOnly = TRUE )
|
|
|
|
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip) //if player is in the mission car
|
|
OR IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) //or if player is in any other car (used to push mission car around), fix for B*1713614
|
|
bPlayerDroveOffRoute = TRUE
|
|
|
|
ENDIF
|
|
ELSE
|
|
|
|
bPlayerDroveOffRoute = TRUE //this will cause a fail in run_fail_checks() proc
|
|
|
|
ENDIF
|
|
|
|
ELIF ( fDistanceToCurrentRoadNode > sCurrentRoadNode.fAllowedDistance ) //warn the player about driving too far away
|
|
|
|
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip) //if player is in the car
|
|
|
|
IF NOT HAS_LABEL_BEEN_TRIGGERED("MCH1_GBRLC")
|
|
IF IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData)
|
|
CLEAR_PRINTS()
|
|
ENDIF
|
|
PRINT_GOD_TEXT_ADVANCED("MCH1_GBRLC")
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
//IF NOT IS_THIS_PRINT_BEING_DISPLAYED("MCH1_GBRLC")
|
|
// IF HAS_LABEL_BEEN_TRIGGERED("MCH1_GBRLC")
|
|
// SET_LABEL_AS_TRIGGERED("MCH1_GBRLC", FALSE)
|
|
// ENDIF
|
|
//ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Adds a model to model request array.
|
|
/// PARAMS:
|
|
/// ModelName - Model name being requested.
|
|
/// array - MODEL_NAMES array to add the requested model name to.
|
|
/// iArrayLength - Maximum length of the array.
|
|
/// iModelsAlreadyRequested - Number of models already requested in this array.
|
|
PROC ADD_MODEL_REQUEST_TO_ARRAY(MODEL_NAMES ModelName, MODEL_NAMES &array[], INT iArrayLength, INT &iModelsAlreadyRequested)
|
|
|
|
INT i = 0
|
|
|
|
BOOL bModelAlreadyRequested = FALSE
|
|
|
|
IF ( iModelsAlreadyRequested >= 0 )
|
|
|
|
IF ( iModelsAlreadyRequested <= ( iArrayLength - 1 ) )
|
|
|
|
//loop through the array (from 0 to number of models already requested)
|
|
//to see if the array already contains the model name being requested
|
|
//modify the boolean flag if the model was found in array, otherwise leave the flag unchanged
|
|
FOR i = 0 TO ( iModelsAlreadyRequested )
|
|
|
|
IF ( array[i] = ModelName )
|
|
|
|
bModelAlreadyRequested = TRUE
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Requested model ", GET_MODEL_NAME_FOR_DEBUG(ModelName), " is already in model array.")
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDFOR
|
|
|
|
IF ( bModelAlreadyRequested = FALSE )
|
|
|
|
REQUEST_MODEL(ModelName)
|
|
|
|
//iModelsAlreadyRequested will be the model array index of the model being requested
|
|
array[iModelsAlreadyRequested] = ModelName
|
|
|
|
iModelsAlreadyRequested++
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Requested model ", GET_MODEL_NAME_FOR_DEBUG(ModelName), " and added to model array.")
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Number of models requested: ", iModelsAlreadyRequested, ".")
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
SCRIPT_ASSERT("Number of requested models is greater than the length of the model array.")
|
|
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
SCRIPT_ASSERT("Number of requested models is less than 0.")
|
|
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Checks if all requested models from model array are loaded into memory.
|
|
/// PARAMS:
|
|
/// array - MODEL_NAMES array holding the models.
|
|
/// iModelsAlreadyRequested - Number of already requested models. Should be greated than 0, since 0 means no models have been requested.
|
|
/// RETURNS:
|
|
/// TRUE if all models from model array are loaded into memory. FALSE if otherwise.
|
|
FUNC BOOL ARE_REQUESTED_MODELS_LOADED(MODEL_NAMES &array[], INT &iModelsAlreadyRequested)
|
|
|
|
INT i = 0
|
|
|
|
IF ( iModelsAlreadyRequested > 0 )
|
|
|
|
FOR i = 0 TO ( iModelsAlreadyRequested - 1 )
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Model in array[", i, "]: ", GET_MODEL_NAME_FOR_DEBUG(array[i]), ".")
|
|
#ENDIF
|
|
|
|
IF NOT HAS_MODEL_LOADED(array[i])
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Model ", GET_MODEL_NAME_FOR_DEBUG(array[i]), " is loading.")
|
|
#ENDIF
|
|
|
|
//if the model is not loaded keep requesting it
|
|
REQUEST_MODEL(array[i])
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Requesting model ", GET_MODEL_NAME_FOR_DEBUG(array[i]), ".")
|
|
#ENDIF
|
|
|
|
RETURN FALSE
|
|
|
|
ENDIF
|
|
|
|
ENDFOR
|
|
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Models from model array loaded. Number of models loaded: ", iModelsAlreadyRequested, ".")
|
|
#ENDIF
|
|
|
|
RETURN TRUE
|
|
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Cleans model array from requested models.
|
|
/// PARAMS:
|
|
/// array - MODEL_NAMES array.
|
|
/// iModelsAlreadyRequested - Number of already requested models. Should be greated than 0, since 0 means no models have been requested.
|
|
PROC CLEANUP_MODEL_ARRAY(MODEL_NAMES &array[], INT &iModelsAlreadyRequested)
|
|
|
|
INT i = 0
|
|
|
|
IF ( iModelsAlreadyRequested > 0 )
|
|
|
|
FOR i = 0 TO ( iModelsAlreadyRequested - 1 )
|
|
|
|
IF array[i] <> DUMMY_MODEL_FOR_SCRIPT
|
|
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(array[i])
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Model ", GET_MODEL_NAME_FOR_DEBUG(array[i]), " cleaned up from model array by setting it as no longer needed.")
|
|
#ENDIF
|
|
|
|
array[i] = DUMMY_MODEL_FOR_SCRIPT
|
|
ENDIF
|
|
|
|
ENDFOR
|
|
|
|
ENDIF
|
|
|
|
iModelsAlreadyRequested = 0
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Model array cleaned up. Number of requested models set to 0.")
|
|
#ENDIF
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Adds a car recording number to recording request array.
|
|
/// PARAMS:
|
|
/// iRecording - Recording number being requested.
|
|
/// sFile - Name of the file containing the car recording.
|
|
/// array - INT arry to add the requested recording number to.
|
|
/// iArrayLength - Maximum length of the array
|
|
/// iRecordingsAlreadyRequested - Number of recordings already requested in this array.
|
|
PROC ADD_CARREC_REQUEST_TO_ARRAY(INT iRecording, STRING sFile, INT &array[], INT iArrayLength, INT &iRecordingsAlreadyRequested)
|
|
|
|
INT i = 0
|
|
|
|
BOOL bRecordingRequested = FALSE
|
|
|
|
IF ( iRecordingsAlreadyRequested >= 0 )
|
|
|
|
IF ( iRecordingsAlreadyRequested <= ( iArrayLength - 1 ) )
|
|
|
|
FOR i = 0 TO ( iRecordingsAlreadyRequested )
|
|
|
|
IF array[i] = iRecording
|
|
|
|
bRecordingRequested = TRUE
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Requested car recording ", iRecording, " is already in recording array.")
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDFOR
|
|
|
|
IF ( bRecordingRequested = FALSE )
|
|
|
|
REQUEST_VEHICLE_RECORDING(iRecording, sFile)
|
|
|
|
array[iRecordingsAlreadyRequested] = iRecording
|
|
|
|
iRecordingsAlreadyRequested++
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Requested car recording ", iRecording, " and added to recording array.")
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Number of car recordings requested: ", iRecordingsAlreadyRequested, ".")
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
SCRIPT_ASSERT("Number of requested recordings is greater than the length of the recording array.")
|
|
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
SCRIPT_ASSERT("Number of requested recordings is less than 0.")
|
|
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Checks if all requested car recordings are loaded into memory.
|
|
/// PARAMS:
|
|
/// sFile - File name of the car recording file.
|
|
/// array - INT array holding the recording numbers.
|
|
/// iRecordingsAlreadyRequested - Number of already requested recordings. Should be greated than 0, since 0 means no recordings have been requested.
|
|
/// RETURNS:
|
|
/// TRUE if all recordings from recording array are loaded into memory. FALSE if otherwise.
|
|
FUNC BOOL ARE_REQUESTED_CARRECS_LOADED(STRING sFile, INT &array[], INT &iRecordingsAlreadyRequested)
|
|
|
|
INT i = 0
|
|
|
|
IF ( iRecordingsAlreadyRequested > 0 )
|
|
|
|
FOR i = 0 TO ( iRecordingsAlreadyRequested - 1 )
|
|
|
|
IF NOT HAS_VEHICLE_RECORDING_BEEN_LOADED(array[i], sFile)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Car recording ", array[i], " is loading.")
|
|
#ENDIF
|
|
|
|
//if the vehicle recording is not loaded keep requesting it
|
|
REQUEST_VEHICLE_RECORDING(array[i], sFile)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Requesting vehicle recording ", array[i], ".")
|
|
#ENDIF
|
|
|
|
RETURN FALSE
|
|
|
|
ENDIF
|
|
|
|
ENDFOR
|
|
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Car recordings from recording array loaded. Number of car recordings loaded: ", iRecordingsAlreadyRequested, ".")
|
|
#ENDIF
|
|
|
|
RETURN TRUE
|
|
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Cleans recording array from requested recordings.
|
|
/// PARAMS:
|
|
/// sFile - File name of the car recording file.
|
|
/// array - INT array holding the recording numbers.
|
|
/// iRecordingsAlreadyRequested - Number of already requested recordings. Should be greated than 0, since 0 means no recordings have been requested.
|
|
PROC CLEANUP_CARREC_ARRAY(STRING sFile, INT &array[], INT &iRecordingsAlreadyRequested)
|
|
|
|
INT i = 0
|
|
|
|
IF ( iRecordingsAlreadyRequested > 0 )
|
|
|
|
FOR i = 0 TO ( iRecordingsAlreadyRequested - 1 )
|
|
|
|
IF HAS_VEHICLE_RECORDING_BEEN_LOADED(array[i], sFile)
|
|
|
|
REMOVE_VEHICLE_RECORDING(array[i], sFile)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Car recording ", array[i], " cleaned up from recording array.")
|
|
#ENDIF
|
|
|
|
array[i] = 0
|
|
|
|
ENDIF
|
|
|
|
ENDFOR
|
|
|
|
ENDIF
|
|
|
|
iRecordingsAlreadyRequested = 0
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Recording array cleaned up. Number of requested car recordings set to 0.")
|
|
#ENDIF
|
|
|
|
ENDPROC
|
|
|
|
//|======================= END MISCELLANEOUS PROCEDURES & FUNCTIONS ======================|
|
|
|
|
//|============================== CLEANUP PROCEDURES & FUNCTIONS =========================|
|
|
|
|
FUNC PED_CLEANUP_REASONS GET_PED_CLEANUP_REASON(PED_INDEX PedIndex #IF IS_DEBUG_BUILD, STRING sDebugName #ENDIF)
|
|
|
|
IF DOES_ENTITY_EXIST(PedIndex)
|
|
|
|
IF IS_ENTITY_DEAD(PedIndex)
|
|
|
|
ENTITY_INDEX SourceOfDeathEntity
|
|
|
|
SourceOfDeathEntity = GET_PED_SOURCE_OF_DEATH(PedIndex)
|
|
|
|
IF IS_ENTITY_A_PED(SourceOfDeathEntity)
|
|
|
|
PED_INDEX SourceOfDeathPed
|
|
|
|
SourceOfDeathPed = GET_PED_INDEX_FROM_ENTITY_INDEX(SourceOfDeathEntity)
|
|
|
|
IF ( SourceOfDeathPed = PLAYER_PED_ID() )
|
|
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Ped ", sDebugName, " cleaned up with reason PED_CLEANUP_KILLED_BY_PLAYER_AS_MICHAEL.")
|
|
#ENDIF
|
|
RETURN PED_CLEANUP_KILLED_BY_PLAYER_AS_MICHAEL
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ELIF IS_ENTITY_A_VEHICLE(SourceOfDeathEntity)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Ped ", sDebugName, " cleaned up with reason PED_CLEANUP_KILLED_BY_VEHICLE.")
|
|
#ENDIF
|
|
|
|
RETURN PED_CLEANUP_KILLED_BY_VEHICLE
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
RETURN PED_CLEANUP_NO_CLEANUP
|
|
|
|
ENDFUNC
|
|
|
|
PROC UPDATE_PLAYER_KILL_COUNTERS(PED_CLEANUP_REASONS eCleanupReason, INT &iPlayerKillsAsMichael)
|
|
|
|
SWITCH eCleanupReason
|
|
CASE PED_CLEANUP_KILLED_BY_PLAYER_AS_MICHAEL
|
|
iPlayerKillsAsMichael++
|
|
INFORM_MISSION_STATS_OF_INCREMENT(MIC1_KILLS) //increment mission stat
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": **************************** UPDATE_PLAYER_KILL_COUNTERS ******************************")
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Player kills as Michael: ", iPlayerKillsAsMichael, ".")
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": ***************************************************************************************")
|
|
#ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC CLEANUP_ENEMY_PED(ENEMY_STRUCT &enemy, BOOL bDelete = FALSE, BOOL bDeathOnly = TRUE, BOOL bKeepTask = TRUE)
|
|
|
|
IF ( bDelete = FALSE )
|
|
|
|
IF DOES_ENTITY_EXIST(enemy.PedIndex)
|
|
|
|
IF ( bDeathOnly = TRUE )
|
|
|
|
IF IS_PED_INJURED(enemy.PedIndex)
|
|
|
|
enemy.eCleanupReason = GET_PED_CLEANUP_REASON(enemy.PedIndex #IF IS_DEBUG_BUILD, enemy.sDebugName #ENDIF)
|
|
|
|
UPDATE_PLAYER_KILL_COUNTERS(enemy.eCleanupReason, iPlayerMichaelKills)
|
|
|
|
REMOVE_PED_DEFENSIVE_AREA(enemy.PedIndex)
|
|
|
|
SET_PED_AS_NO_LONGER_NEEDED(enemy.PedIndex)
|
|
|
|
IF DOES_BLIP_EXIST(enemy.BlipIndex)
|
|
REMOVE_BLIP(enemy.BlipIndex)
|
|
ENDIF
|
|
|
|
IF IS_ITEMSET_VALID(enemy.ItemsetIndex)
|
|
DESTROY_ITEMSET(enemy.ItemsetIndex)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ELIF ( bDeathOnly = FALSE )
|
|
|
|
IF NOT IS_PED_INJURED(enemy.PedIndex)
|
|
|
|
SET_PED_KEEP_TASK(enemy.PedIndex, bKeepTask)
|
|
SET_PED_AS_NO_LONGER_NEEDED(enemy.PedIndex)
|
|
|
|
IF DOES_BLIP_EXIST(enemy.BlipIndex)
|
|
REMOVE_BLIP(enemy.BlipIndex)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF IS_ITEMSET_VALID(enemy.ItemsetIndex)
|
|
DESTROY_ITEMSET(enemy.ItemsetIndex)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ELIF ( bDelete = TRUE )
|
|
|
|
IF DOES_ENTITY_EXIST(enemy.PedIndex)
|
|
|
|
IF IS_PED_INJURED(enemy.PedIndex)
|
|
OR NOT IS_PED_INJURED(enemy.PedIndex)
|
|
|
|
IF IS_ENTITY_DEAD(enemy.PedIndex)
|
|
OR NOT IS_ENTITY_DEAD(enemy.PedIndex)
|
|
REMOVE_PED_DEFENSIVE_AREA(enemy.PedIndex)
|
|
ENDIF
|
|
|
|
DELETE_PED(enemy.PedIndex)
|
|
|
|
IF DOES_BLIP_EXIST(enemy.BlipIndex)
|
|
REMOVE_BLIP(enemy.BlipIndex)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF IS_ITEMSET_VALID(enemy.ItemsetIndex)
|
|
DESTROY_ITEMSET(enemy.ItemsetIndex)
|
|
ENDIF
|
|
|
|
CLEANUP_AI_PED_BLIP(enemy.EnemyBlipData)
|
|
|
|
enemy.bCreated = FALSE
|
|
enemy.bFallingBack = FALSE
|
|
enemy.bHasTask = FALSE
|
|
enemy.bSearching = FALSE
|
|
enemy.bReversing = FALSE
|
|
|
|
enemy.iTimer = 0
|
|
enemy.iProgress = 0
|
|
enemy.iWaypointProgress = 0
|
|
enemy.iConversationTimer = 0
|
|
enemy.eCleanupReason = PED_CLEANUP_NO_CLEANUP
|
|
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Handles removing dead enemy peds from a specified enemy ped array by setting them as no longer needed.
|
|
/// Deletes the peds no matter of their health state if bDelete is set to TRUE.
|
|
/// PARAMS:
|
|
/// array - Array of enemy peds to cleanup.
|
|
/// bDelete - If set to TRUE this will delete the peds no matter if they are dead or alive.
|
|
/// bDeathOnly - IF set to TRUE this will set peds as no longer needed, when bDelete is FALSE. Use for mission cleanup.
|
|
/// bKeepTask - IF set to TRUE this will make peds keep their tasks. Use for mission cleanup.
|
|
PROC CLEANUP_ENEMY_GROUP(ENEMY_STRUCT &array[], BOOL bDelete = FALSE, BOOL bDeathOnly = TRUE, BOOL bKeepTask = TRUE)
|
|
|
|
INT i = 0
|
|
|
|
FOR i = 0 TO ( COUNT_OF(array) - 1 )
|
|
CLEANUP_ENEMY_PED(array[i], bDelete, bDeathOnly, bKeepTask)
|
|
IF ( bDelete = TRUE )
|
|
array[i].bCreated = FALSE
|
|
ENDIF
|
|
ENDFOR
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Handles removing dead enemy vehicles from a specified vehicle struct array by setting them as no longer needed.
|
|
/// Deletes the vehicles no matter of their health state if bDelete is set to TRUE.
|
|
/// PARAMS:
|
|
/// vsArray - Array of instances of vehicle_struct.
|
|
/// bDelete - If set to TRUE this will delete the vehicles no matter if they are dead or alive.
|
|
/// bDeathOnly - If set to TRUE this will set vehicles as no longer needed, when bDelete is FALSE. Use for mission cleanup.
|
|
/// bBlipOnly - If set to TRUE this will remove dead or undriveable vehicle blip only.
|
|
PROC CLEANUP_ENEMY_VEHICLES(VEH_STRUCT &vsArray[], BOOL bDelete = FALSE, BOOL bDeathOnly = TRUE, BOOL bBlipOnly = FALSE)
|
|
|
|
INT i = 0
|
|
|
|
FOR i = 0 TO ( COUNT_OF(vsArray) - 1 )
|
|
|
|
IF ( bDelete = TRUE )
|
|
|
|
IF DOES_ENTITY_EXIST(vsArray[i].VehicleIndex)
|
|
|
|
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
|
|
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID(), TRUE)
|
|
IF GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID()) = vsArray[i].VehicleIndex
|
|
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
DELETE_VEHICLE(vsArray[i].VehicleIndex)
|
|
ENDIF
|
|
|
|
IF DOES_BLIP_EXIST(vsArray[i].BlipIndex)
|
|
REMOVE_BLIP(vsArray[i].BlipIndex)
|
|
ENDIF
|
|
|
|
vsArray[i].iProgress = 0
|
|
vsArray[i].bSmoking = FALSE
|
|
vsArray[i].bDriverDead = FALSE
|
|
vsArray[i].bAutoDriveActive = FALSE
|
|
|
|
ELIF ( bDelete = FALSE )
|
|
|
|
IF DOES_ENTITY_EXIST(vsArray[i].VehicleIndex)
|
|
|
|
IF ( bDeathOnly = TRUE )
|
|
|
|
IF ( bBlipOnly = FALSE )
|
|
|
|
SET_VEHICLE_AS_NO_LONGER_NEEDED(vsArray[i].VehicleIndex)
|
|
|
|
ENDIF
|
|
|
|
IF DOES_BLIP_EXIST(vsArray[i].BlipIndex)
|
|
REMOVE_BLIP(vsArray[i].BlipIndex)
|
|
ENDIF
|
|
|
|
ELIF ( bDeathOnly = FALSE )
|
|
|
|
IF DOES_BLIP_EXIST(vsArray[i].BlipIndex)
|
|
REMOVE_BLIP(vsArray[i].BlipIndex)
|
|
ENDIF
|
|
|
|
SET_VEHICLE_AS_NO_LONGER_NEEDED(vsArray[i].VehicleIndex)
|
|
|
|
vsArray[i].iProgress = 0
|
|
vsArray[i].bDriverDead = FALSE
|
|
vsArray[i].bAutoDriveActive = FALSE
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDFOR
|
|
|
|
ENDPROC
|
|
|
|
PROC CLEANUP_MISSION_OBJECT(OBJECT_STRUCT &osObject, BOOL bDelete = FALSE)
|
|
|
|
IF DOES_ENTITY_EXIST(osObject.ObjectIndex)
|
|
|
|
IF IS_ENTITY_ATTACHED(osObject.ObjectIndex)
|
|
DETACH_ENTITY(osObject.ObjectIndex)
|
|
ENDIF
|
|
|
|
IF ( bDelete = TRUE )
|
|
DELETE_OBJECT(osObject.ObjectIndex)
|
|
ELSE
|
|
SET_OBJECT_AS_NO_LONGER_NEEDED(osObject.ObjectIndex)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC RUN_MISSION_STAGE_CLEANUP(MISSION_STAGES eStage)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Starting mission stage cleanup.")
|
|
#ENDIF
|
|
|
|
KILL_PHONE_CONVERSATION()
|
|
HANG_UP_AND_PUT_AWAY_PHONE(TRUE)
|
|
|
|
KILL_ANY_CONVERSATION()
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
|
|
CLEAR_MISSION_LOCATION_TEXT_AND_BLIPS(sLocatesData)
|
|
|
|
REMOVE_CUTSCENE()
|
|
|
|
IF ( bReplayStartEventTriggered = TRUE )
|
|
REPLAY_STOP_EVENT()
|
|
ENDIF
|
|
|
|
IF ( bProloguePedComponentsActive = TRUE ) //set non prologue clothes on player peds
|
|
|
|
IF DOES_ENTITY_EXIST(GET_PED_INDEX(CHAR_MICHAEL))
|
|
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_MICHAEL))
|
|
RESTORE_PLAYER_PED_VARIATIONS(GET_PED_INDEX(CHAR_MICHAEL))
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(GET_PED_INDEX(CHAR_TREVOR))
|
|
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_TREVOR))
|
|
RESTORE_PLAYER_PED_VARIATIONS(GET_PED_INDEX(CHAR_TREVOR))
|
|
ENDIF
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Restoring default player ped component variations.")
|
|
#ENDIF
|
|
|
|
bProloguePedComponentsActive = FALSE
|
|
|
|
ENDIF
|
|
|
|
//general stage cleanup
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
|
|
|
|
IF NOT IS_PED_INJURED(psTrevor.PedIndex)
|
|
DELETE_PED(psTrevor.PedIndex)
|
|
ENDIF
|
|
|
|
IF DOES_BLIP_EXIST(psTrevor.BlipIndex)
|
|
REMOVE_BLIP(psTrevor.BlipIndex)
|
|
ENDIF
|
|
|
|
IF DOES_BLIP_EXIST(psMichael.BlipIndex)
|
|
REMOVE_BLIP(psMichael.BlipIndex)
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(vsMichaelsCar.VehicleIndex)
|
|
DELETE_VEHICLE(vsMichaelsCar.VehicleIndex)
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(vsTrevorsCar.VehicleIndex)
|
|
DELETE_VEHICLE(vsTrevorsCar.VehicleIndex)
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(vsTrevorsPlane.VehicleIndex)
|
|
DELETE_VEHICLE(vsTrevorsPlane.VehicleIndex)
|
|
ENDIF
|
|
|
|
IF DOES_BLIP_EXIST(vsMichaelsCar.BlipIndex)
|
|
REMOVE_BLIP(vsMichaelsCar.BlipIndex)
|
|
ENDIF
|
|
|
|
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
|
|
|
|
IF NOT IS_PED_INJURED(psMichael.PedIndex)
|
|
DELETE_PED(psMichael.PedIndex)
|
|
ENDIF
|
|
|
|
IF DOES_BLIP_EXIST(psMichael.BlipIndex)
|
|
REMOVE_BLIP(psMichael.BlipIndex)
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(vsMichaelsCar.VehicleIndex)
|
|
DELETE_VEHICLE(vsMichaelsCar.VehicleIndex)
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(vsTrevorsCar.VehicleIndex)
|
|
DELETE_VEHICLE(vsTrevorsCar.VehicleIndex)
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(vsTrevorsPlane.VehicleIndex)
|
|
DELETE_VEHICLE(vsTrevorsPlane.VehicleIndex)
|
|
ENDIF
|
|
|
|
IF DOES_BLIP_EXIST(vsTrevorsCar.BlipIndex)
|
|
REMOVE_BLIP(vsTrevorsCar.BlipIndex)
|
|
ENDIF
|
|
|
|
IF DOES_BLIP_EXIST(vsTrevorsPlane.BlipIndex)
|
|
REMOVE_BLIP(vsTrevorsPlane.BlipIndex)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(psBrad.PedIndex)
|
|
DELETE_PED(psBrad.PedIndex)
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(vsCutsceneCar.VehicleIndex)
|
|
DELETE_VEHICLE(vsCutsceneCar.VehicleIndex)
|
|
ENDIF
|
|
|
|
|
|
DESTROY_ALL_CAMS()
|
|
RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
|
|
|
|
DISPLAY_HUD(TRUE)
|
|
DISPLAY_RADAR(TRUE)
|
|
|
|
|
|
SET_FRONTEND_RADIO_ACTIVE(TRUE)
|
|
|
|
IF DOES_ENTITY_EXIST(tsTrain.VehicleIndex)
|
|
AND DOES_ENTITY_EXIST(tsTrain.PedIndex)
|
|
DELETE_PED(tsTrain.PedIndex)
|
|
DELETE_MISSION_TRAIN(tsTrain.VehicleIndex)
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Deleted mission train.")
|
|
#ENDIF
|
|
ENDIF
|
|
|
|
DISABLE_CELLPHONE(FALSE)
|
|
DISABLE_TAXI_HAILING(FALSE)
|
|
|
|
//reset this flag for skips
|
|
bGameplayCameraSet = FALSE
|
|
|
|
CLEANUP_MISSION_OBJECT(osGolfBall, TRUE)
|
|
CLEANUP_MISSION_OBJECT(osPropCoffin, TRUE)
|
|
CLEANUP_MISSION_OBJECT(osPropShovel, TRUE)
|
|
CLEANUP_MISSION_OBJECT(osPropPickaxe, TRUE)
|
|
|
|
CLEANUP_TRACKED_POINT(iCarTrackedPoint)
|
|
|
|
REMOVE_ANIM_DICT("dead")
|
|
REMOVE_ANIM_DICT("missmic1ig_2")
|
|
REMOVE_ANIM_DICT("missmic1ig_3_patrol")
|
|
REMOVE_ANIM_DICT("missmic1ig_zero_hit_wheel")
|
|
REMOVE_ANIM_DICT("missmic1leadinoutmic_1_mcs_2")
|
|
|
|
//specific stage cleanup
|
|
SWITCH eStage
|
|
|
|
CASE MISSION_STAGE_GET_TO_GRAVEYARD
|
|
CASE MISSION_STAGE_GET_TO_GRAVE
|
|
CASE MISSION_STAGE_CUTSCENE_GRAVEYARD
|
|
CASE MISSION_STAGE_GRAVEYARD_SHOOTOUT
|
|
|
|
CLEANUP_ENEMY_GROUP(esWallEnemies, TRUE)
|
|
CLEANUP_ENEMY_GROUP(esVanEnemies, TRUE)
|
|
CLEANUP_ENEMY_GROUP(esMiddleEnemies, TRUE)
|
|
CLEANUP_ENEMY_GROUP(esChurchEnemies, TRUE)
|
|
CLEANUP_ENEMY_GROUP(esSideVanEnemies, TRUE)
|
|
CLEANUP_ENEMY_GROUP(esSideVanBackupEnemies, TRUE)
|
|
CLEANUP_ENEMY_GROUP(esExitEnemies, TRUE)
|
|
CLEANUP_ENEMY_GROUP(esRunners, TRUE)
|
|
CLEANUP_ENEMY_GROUP(esVan4Enemies, TRUE)
|
|
CLEANUP_ENEMY_GROUP(esSideEnemies, TRUE)
|
|
|
|
CLEANUP_ENEMY_GROUP(esFirstReinforcementEnemies, TRUE)
|
|
CLEANUP_ENEMY_GROUP(esSecondReinforcementEnemies, TRUE)
|
|
CLEANUP_ENEMY_GROUP(esThirdReinforcementEnemies, TRUE)
|
|
|
|
CLEANUP_ENEMY_VEHICLES(vsEnemyVans, TRUE)
|
|
|
|
//reset stats for headshots
|
|
RESET_MISSION_STATS_ENTITY_WATCH()
|
|
|
|
REMOVE_COVERPOINTS(csCoverpoints)
|
|
bCoverpointsCreated = FALSE
|
|
|
|
//remove the tombstones
|
|
REMOVE_IPL("prologue03b")
|
|
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(mnEnemy)
|
|
|
|
IF DOES_ENTITY_EXIST(WeaponMichaelObjectIndex)
|
|
DELETE_OBJECT(WeaponMichaelObjectIndex)
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(WeaponEnemyObjectIndex)
|
|
DELETE_OBJECT(WeaponEnemyObjectIndex)
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
IF DOES_PICKUP_EXIST(HealthPickup)
|
|
REMOVE_PICKUP(HealthPickup)
|
|
ENDIF
|
|
|
|
IF DOES_PICKUP_EXIST(PistolPickup)
|
|
REMOVE_PICKUP(PistolPickup)
|
|
ENDIF
|
|
|
|
IF DOES_PICKUP_EXIST(RiflePickup)
|
|
REMOVE_PICKUP(RiflePickup)
|
|
ENDIF
|
|
|
|
//music score stop & cleanup
|
|
TRIGGER_MUSIC_EVENT("MIC1_FAIL")
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Triggering music event MIC1_FAIL.")
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Stopping score music.")
|
|
#ENDIF
|
|
CANCEL_MUSIC_EVENT("MIC1_ARRIVED_CHURCH")
|
|
CANCEL_MUSIC_EVENT("MIC1_SHOOTOUT_START")
|
|
CANCEL_MUSIC_EVENT("MIC1_1ST_VAN")
|
|
CANCEL_MUSIC_EVENT("MIC1_ALERTED")
|
|
CANCEL_MUSIC_EVENT("MIC1_KIDNAPPED")
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Cancelling music events.")
|
|
#ENDIF
|
|
|
|
STOP_STREAM()
|
|
STOP_AUDIO_SCENES()
|
|
|
|
STOP_SOUND(iTrainBellsSoundID)
|
|
STOP_SOUND(iChurchBellsSoundID)
|
|
STOP_SOUND(iRainOnPlaneSoundID)
|
|
|
|
RELEASE_NAMED_SCRIPT_AUDIO_BANK("Prologue_Sounds")
|
|
RELEASE_NAMED_SCRIPT_AUDIO_BANK("SCRIPT\\FBI_HEIST_3B_SHOOTOUT")
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Finished mission stage cleanup.")
|
|
#ENDIF
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Handles cleaning up when mission ends.
|
|
PROC MISSION_CLEANUP()
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Starting mission cleanup.")
|
|
#ENDIF
|
|
|
|
CLEAR_PRINTS()
|
|
CLEAR_HELP(TRUE)
|
|
|
|
KILL_FACE_TO_FACE_CONVERSATION()
|
|
KILL_ANY_CONVERSATION()
|
|
|
|
CLEANUP_MODEL_ARRAY(MissionModels, iModelsRequested)
|
|
CLEANUP_CARREC_ARRAY(sVehicleRecordingsFile, MissionRecordings, iRecordingsRequested)
|
|
|
|
CLEAR_MISSION_LOCATION_TEXT_AND_BLIPS(sLocatesData)
|
|
|
|
RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
DESTROY_ALL_CAMS()
|
|
|
|
IF ( bReplayStartEventTriggered = TRUE )
|
|
REPLAY_STOP_EVENT()
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
SET_PLAYER_ANGRY(PLAYER_PED_ID(), FALSE)
|
|
STOP_PED_SPEAKING(PLAYER_PED_ID(), FALSE)
|
|
ENDIF
|
|
|
|
IF ( bProloguePedComponentsActive = TRUE ) //set non prologue clothes on player peds
|
|
|
|
IF DOES_ENTITY_EXIST(GET_PED_INDEX(CHAR_MICHAEL))
|
|
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_MICHAEL))
|
|
//RESTORE_PLAYER_PED_VARIATIONS(GET_PED_INDEX(CHAR_MICHAEL))
|
|
RESTORE_MISSION_START_OUTFIT()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(GET_PED_INDEX(CHAR_TREVOR))
|
|
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_TREVOR))
|
|
RESTORE_PLAYER_PED_VARIATIONS(GET_PED_INDEX(CHAR_TREVOR))
|
|
ENDIF
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Restoring default player ped component variations.")
|
|
#ENDIF
|
|
|
|
bProloguePedComponentsActive = FALSE
|
|
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(psBrad.PedIndex)
|
|
IF NOT IS_ENTITY_DEAD(psBrad.PedIndex)
|
|
SET_PED_KEEP_TASK(psBrad.PedIndex, TRUE)
|
|
SET_PED_AS_NO_LONGER_NEEDED(psBrad.PedIndex)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//clear mission vehicles
|
|
IF DOES_ENTITY_EXIST(vsMichaelsCar.VehicleIndex)
|
|
IF NOT IS_ENTITY_DEAD(vsMichaelsCar.VehicleIndex)
|
|
SET_VEHICLE_AUTOMATICALLY_ATTACHES(vsMichaelsCar.VehicleIndex, TRUE)
|
|
IF IS_ENTITY_A_MISSION_ENTITY(vsMichaelsCar.VehicleIndex)
|
|
AND DOES_ENTITY_BELONG_TO_THIS_SCRIPT(vsMichaelsCar.VehicleIndex)
|
|
SET_VEHICLE_AS_NO_LONGER_NEEDED(vsMichaelsCar.VehicleIndex)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(vsTrevorsCar.VehicleIndex)
|
|
IF NOT IS_ENTITY_DEAD(vsTrevorsCar.VehicleIndex)
|
|
SET_VEHICLE_AUTOMATICALLY_ATTACHES(vsTrevorsCar.VehicleIndex, TRUE)
|
|
IF ( bTrevorsCarSetAsVehicleGenVehicle = FALSE )
|
|
IF IS_ENTITY_A_MISSION_ENTITY(vsTrevorsCar.VehicleIndex)
|
|
AND DOES_ENTITY_BELONG_TO_THIS_SCRIPT(vsTrevorsCar.VehicleIndex)
|
|
SET_VEHICLE_AS_NO_LONGER_NEEDED(vsTrevorsCar.VehicleIndex)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(vsTrevorsPlane.VehicleIndex)
|
|
IF NOT IS_ENTITY_DEAD(vsTrevorsPlane.VehicleIndex)
|
|
IF IS_ENTITY_A_MISSION_ENTITY(vsTrevorsPlane.VehicleIndex)
|
|
AND DOES_ENTITY_BELONG_TO_THIS_SCRIPT(vsTrevorsPlane.VehicleIndex)
|
|
SET_VEHICLE_AS_NO_LONGER_NEEDED(vsTrevorsPlane.VehicleIndex)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(tsTrain.VehicleIndex)
|
|
IF NOT IS_ENTITY_DEAD(tsTrain.VehicleIndex)
|
|
IF IS_SCREEN_FADED_OUT()
|
|
DELETE_MISSION_TRAIN(tsTrain.VehicleIndex)
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Deleting mission train.")
|
|
#ENDIF
|
|
ELSE
|
|
SET_MISSION_TRAIN_AS_NO_LONGER_NEEDED(tsTrain.VehicleIndex)
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting mission train as no longer needed.")
|
|
#ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(vsCutsceneCar.VehicleIndex)
|
|
SET_VEHICLE_AS_NO_LONGER_NEEDED(vsCutsceneCar.VehicleIndex)
|
|
ENDIF
|
|
|
|
//clear blips
|
|
IF DOES_BLIP_EXIST(psMichael.BlipIndex)
|
|
REMOVE_BLIP(psMichael.BlipIndex)
|
|
ENDIF
|
|
|
|
IF DOES_BLIP_EXIST(psTrevor.BlipIndex)
|
|
REMOVE_BLIP(psTrevor.BlipIndex)
|
|
ENDIF
|
|
|
|
IF DOES_BLIP_EXIST(vsMichaelsCar.BlipIndex)
|
|
REMOVE_BLIP(vsMichaelsCar.BlipIndex)
|
|
ENDIF
|
|
|
|
IF DOES_BLIP_EXIST(vsTrevorsCar.BlipIndex)
|
|
REMOVE_BLIP(vsTrevorsCar.BlipIndex)
|
|
ENDIF
|
|
|
|
IF DOES_BLIP_EXIST(vsTrevorsPlane.BlipIndex)
|
|
REMOVE_BLIP(vsTrevorsPlane.BlipIndex)
|
|
ENDIF
|
|
|
|
CLEANUP_ENEMY_GROUP(esVanEnemies, IS_SCREEN_FADED_OUT(), FALSE)
|
|
CLEANUP_ENEMY_GROUP(esMiddleEnemies, IS_SCREEN_FADED_OUT(), FALSE)
|
|
CLEANUP_ENEMY_GROUP(esWallEnemies, IS_SCREEN_FADED_OUT(), FALSE)
|
|
CLEANUP_ENEMY_GROUP(esChurchEnemies, IS_SCREEN_FADED_OUT(), FALSE)
|
|
CLEANUP_ENEMY_GROUP(esSideVanBackupEnemies, IS_SCREEN_FADED_OUT(), FALSE)
|
|
CLEANUP_ENEMY_GROUP(esSideVanEnemies, IS_SCREEN_FADED_OUT(), FALSE)
|
|
CLEANUP_ENEMY_GROUP(esExitEnemies, IS_SCREEN_FADED_OUT(), FALSE)
|
|
CLEANUP_ENEMY_GROUP(esVan4Enemies, IS_SCREEN_FADED_OUT(), FALSE)
|
|
CLEANUP_ENEMY_GROUP(esRunners, IS_SCREEN_FADED_OUT(), FALSE)
|
|
CLEANUP_ENEMY_GROUP(esSideEnemies, IS_SCREEN_FADED_OUT(), FALSE)
|
|
CLEANUP_ENEMY_GROUP(esFirstReinforcementEnemies, IS_SCREEN_FADED_OUT(), FALSE)
|
|
CLEANUP_ENEMY_GROUP(esSecondReinforcementEnemies, IS_SCREEN_FADED_OUT(), FALSE)
|
|
CLEANUP_ENEMY_GROUP(esThirdReinforcementEnemies, IS_SCREEN_FADED_OUT(), FALSE)
|
|
|
|
CLEANUP_ENEMY_VEHICLES(vsEnemyVans, IS_SCREEN_FADED_OUT(), FALSE)
|
|
|
|
CLEANUP_MISSION_OBJECT(osGolfBall, FALSE)
|
|
CLEANUP_MISSION_OBJECT(osPropCoffin, FALSE)
|
|
CLEANUP_MISSION_OBJECT(osPropShovel, FALSE)
|
|
CLEANUP_MISSION_OBJECT(osPropPickaxe, FALSE)
|
|
|
|
CLEANUP_TRACKED_POINT(iCarTrackedPoint)
|
|
|
|
IF DOES_PICKUP_EXIST(HealthPickup)
|
|
REMOVE_PICKUP(HealthPickup)
|
|
ENDIF
|
|
|
|
IF DOES_PICKUP_EXIST(PistolPickup)
|
|
REMOVE_PICKUP(PistolPickup)
|
|
ENDIF
|
|
|
|
IF DOES_PICKUP_EXIST(RiflePickup)
|
|
REMOVE_PICKUP(RiflePickup)
|
|
ENDIF
|
|
|
|
DISPLAY_HUD(TRUE)
|
|
DISPLAY_RADAR(TRUE)
|
|
|
|
SET_FRONTEND_RADIO_ACTIVE(TRUE)
|
|
|
|
SET_VEHICLE_MODEL_IS_SUPPRESSED(GET_PLAYER_VEH_MODEL(CHAR_MICHAEL), FALSE)
|
|
SET_VEHICLE_MODEL_IS_SUPPRESSED(GET_PLAYER_VEH_MODEL(CHAR_TREVOR), FALSE)
|
|
SET_VEHICLE_MODEL_IS_SUPPRESSED(TAXI, FALSE)
|
|
SET_VEHICLE_MODEL_IS_SUPPRESSED(ASEA2, FALSE)
|
|
SET_VEHICLE_MODEL_IS_SUPPRESSED(MESA2, FALSE)
|
|
SET_VEHICLE_MODEL_IS_SUPPRESSED(POLICEOLD1, FALSE)
|
|
SET_VEHICLE_MODEL_IS_SUPPRESSED(POLICEOLD2, FALSE)
|
|
SET_PED_MODEL_IS_SUPPRESSED(mnEnemy, FALSE)
|
|
|
|
//enable the car gen on mission cleanup
|
|
DISABLE_VEHICLE_GEN_ON_MISSION(FALSE)
|
|
|
|
DISABLE_CELLPHONE(FALSE)
|
|
DISABLE_TAXI_HAILING(FALSE)
|
|
|
|
SET_MAX_WANTED_LEVEL(5)
|
|
SET_CREATE_RANDOM_COPS(TRUE)
|
|
SET_WANTED_LEVEL_MULTIPLIER(1.0)
|
|
|
|
//enable dispatch services
|
|
ENABLE_DISPATCH_SERVICE(DT_POLICE_AUTOMOBILE, TRUE)
|
|
ENABLE_DISPATCH_SERVICE(DT_POLICE_HELICOPTER, TRUE)
|
|
ENABLE_DISPATCH_SERVICE(DT_FIRE_DEPARTMENT, TRUE)
|
|
ENABLE_DISPATCH_SERVICE(DT_SWAT_AUTOMOBILE, TRUE)
|
|
ENABLE_DISPATCH_SERVICE(DT_AMBULANCE_DEPARTMENT, TRUE)
|
|
|
|
STOP_SOUND(iTrainBellsSoundID)
|
|
RELEASE_SOUND_ID(iTrainBellsSoundID)
|
|
|
|
STOP_SOUND(iChurchBellsSoundID)
|
|
RELEASE_SOUND_ID(iChurchBellsSoundID)
|
|
|
|
STOP_SOUND(iRainOnPlaneSoundID)
|
|
RELEASE_SOUND_ID(iRainOnPlaneSoundID)
|
|
|
|
SET_ROADS_IN_ANGLED_AREA(<<5526.240234,-5137.229980,61.789253>>, <<3679.326660,-4973.879395,125.082840>>, 192.0, FALSE, FALSE)
|
|
SET_ROADS_IN_ANGLED_AREA(<<3691.211426,-4941.240234,94.593681>>, <<3511.115479,-4869.191406,126.762108>>, 16.0, FALSE, FALSE)
|
|
SET_ROADS_IN_ANGLED_AREA(<<3510.004395,-4865.810059,94.695572>>, <<3204.424316,-4833.816895,126.815216>>, 16.0, FALSE, FALSE)
|
|
SET_ROADS_IN_ANGLED_AREA(<<3186.533691,-4832.797852,109.814827>>, <<3202.187256,-4833.993164,114.814995>>, 16.0, FALSE, FALSE) //road leading down into town
|
|
|
|
REMOVE_PTFX_ASSET()
|
|
REMOVE_ANIM_DICT("missmic1ig_2")
|
|
REMOVE_ANIM_DICT("missmic1ig_3_patrol")
|
|
REMOVE_ANIM_DICT("missmic1ig_zero_hit_wheel")
|
|
REMOVE_ANIM_DICT("missmic1leadinoutmic_1_mcs_2")
|
|
|
|
SET_USER_RADIO_CONTROL_ENABLED(TRUE)
|
|
RELEASE_NAMED_SCRIPT_AUDIO_BANK("Prologue_Sounds")
|
|
RELEASE_NAMED_SCRIPT_AUDIO_BANK("SCRIPT\\FBI_HEIST_3B_SHOOTOUT")
|
|
RELEASE_SCRIPT_AUDIO_BANK()
|
|
|
|
STOP_STREAM()
|
|
STOP_AUDIO_SCENES()
|
|
|
|
//music score stop & cleanup
|
|
TRIGGER_MUSIC_EVENT("MIC1_FAIL")
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Triggering music event MIC1_FAIL.")
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Stopping score music.")
|
|
#ENDIF
|
|
CANCEL_MUSIC_EVENT("MIC1_ARRIVED_CHURCH")
|
|
CANCEL_MUSIC_EVENT("MIC1_SHOOTOUT_START")
|
|
CANCEL_MUSIC_EVENT("MIC1_1ST_VAN")
|
|
CANCEL_MUSIC_EVENT("MIC1_ALERTED")
|
|
CANCEL_MUSIC_EVENT("MIC1_KIDNAPPED")
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Cancelling music events.")
|
|
#ENDIF
|
|
|
|
IF ( bWeatherTypeOvercastSet = TRUE )
|
|
OR ( bWeatherTypeRainSet = TRUE )
|
|
OR ( bWeatherTypeThunderSet = TRUE )
|
|
CLEAR_WEATHER_TYPE_PERSIST()
|
|
ENDIF
|
|
|
|
SET_PLAYER_PED_DATA_IN_CUTSCENES(TRUE, TRUE)
|
|
|
|
REMOVE_NAVMESH_BLOCKING_OBJECTS()
|
|
REMOVE_SCENARIO_BLOCKING_AREAS()
|
|
|
|
RELEASE_SUPPRESSED_EMERGENCY_CALLS()
|
|
|
|
LOCK_AUTOMATIC_DOOR_OPEN(AUTODOOR_MICHAEL_MANSION_GATE, FALSE)
|
|
|
|
SET_RANDOM_TRAINS(TRUE)
|
|
SET_ALLOW_STREAM_PROLOGUE_NODES(FALSE)
|
|
|
|
SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_NONE)
|
|
|
|
RESET_WORLD_BOUNDARY_FOR_PLAYER()
|
|
|
|
REMOVE_ALL_COVER_BLOCKING_AREAS()
|
|
|
|
IF IS_CHEAT_DISABLED(CHEAT_TYPE_SUPER_JUMP)
|
|
DISABLE_CHEAT(CHEAT_TYPE_SUPER_JUMP, FALSE)
|
|
ENDIF
|
|
IF IS_CHEAT_DISABLED(CHEAT_TYPE_SPAWN_VEHICLE)
|
|
DISABLE_CHEAT(CHEAT_TYPE_SPAWN_VEHICLE, FALSE)
|
|
ENDIF
|
|
IF IS_CHEAT_DISABLED(CHEAT_TYPE_ADVANCE_WEATHER)
|
|
DISABLE_CHEAT(CHEAT_TYPE_ADVANCE_WEATHER, FALSE)
|
|
ENDIF
|
|
|
|
SET_AMBIENT_VEHICLE_NEON_ENABLED(TRUE)
|
|
|
|
SET_AUDIO_FLAG("DisableReplayScriptStreamRecording", FALSE)
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting audio flag DisableReplayScriptStreamRecording to false.")
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Finished mission cleanup.")
|
|
#ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC PROLOGUE_MAP_CLEANUP()
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Starting prologue map cleanup.")
|
|
#ENDIF
|
|
|
|
UNLOCK_GRAVEYARD_GATES()
|
|
UNREGISTER_GRAVEYARD_GATES()
|
|
|
|
REMOVE_ALL_PROLOGUE_IPLS()
|
|
|
|
SET_MINIMAP_IN_PROLOGUE_AND_HANDLE_STATIC_BLIPS(FALSE)
|
|
|
|
IF ( bSnowOn = TRUE )
|
|
//clear weather type
|
|
SET_WEATHER_TYPE_NOW_PERSIST("EXTRASUNNY")
|
|
CLEAR_WEATHER_TYPE_PERSIST()
|
|
UNLOAD_ALL_CLOUD_HATS()
|
|
ELIF ( bSnowOn = FALSE )
|
|
CLEAR_WEATHER_TYPE_PERSIST()
|
|
ENDIF
|
|
|
|
CLEAR_TIMECYCLE_MODIFIER()
|
|
DISABLE_MOON_CYCLE_OVERRIDE()
|
|
SET_AMBIENT_VEHICLE_NEON_ENABLED(TRUE)
|
|
|
|
DELETE_ALL_TRAINS()
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Finished prologue map cleanup.")
|
|
#ENDIF
|
|
|
|
ENDPROC
|
|
|
|
//|============================ END CLEANUP PROCEDURES & FUNCTIONS =======================|
|
|
|
|
//|======================= DEBUG VARIABLES, PROCEDURES & FUNCTIONS =======================|
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
|
|
//mission skip menu variables
|
|
MissionStageMenuTextStruct SkipMenu[11]
|
|
INT iReturnStage
|
|
BOOL bStageResetFlag
|
|
|
|
//debug widgets veriables
|
|
WIDGET_GROUP_ID Michael1Widgets
|
|
BOOL bResetGameplayHint = FALSE
|
|
BOOL bSnowToggle = FALSE
|
|
BOOL bApplyForceToggle = FALSE
|
|
BOOL bEnableApplyForceWidget = FALSE
|
|
BOOL bPrintDebugOutput = FALSE
|
|
BOOL bDrawDebugLinesAndSpheres
|
|
BOOL bDrawDebugStates
|
|
BOOL bDrawDebugCoverpoints
|
|
VECTOR vApplyForceWidgetForce
|
|
VECTOR vApplyForceWidgetOffset
|
|
|
|
FUNC STRING GET_MISSION_STAGE_NAME_FOR_DEBUG(MISSION_STAGES eStage)
|
|
|
|
SWITCH eStage
|
|
CASE MISSION_STAGE_CUTSCENE_INTRO
|
|
RETURN "MISSION_STAGE_CUTSCENE_INTRO"
|
|
BREAK
|
|
CASE MISSION_STAGE_GET_TO_AIRPORT
|
|
RETURN "MISSION_STAGE_GET_TO_AIRPORT"
|
|
BREAK
|
|
CASE MISSION_STAGE_FLY_TO_NORTH_YANKTON
|
|
RETURN "MISSION_STAGE_FLY_TO_NORTH_YANKTON"
|
|
BREAK
|
|
CASE MISSION_STAGE_CUTSCENE_AIRPORT
|
|
RETURN "MISSION_STAGE_CUTSCENE_AIRPORT"
|
|
BREAK
|
|
CASE MISSION_STAGE_GET_TO_GRAVEYARD
|
|
RETURN "MISSION_STAGE_GET_TO_GRAVEYARD"
|
|
BREAK
|
|
CASE MISSION_STAGE_GET_TO_GRAVE
|
|
RETURN "MISSION_STAGE_GET_TO_GRAVE"
|
|
BREAK
|
|
CASE MISSION_STAGE_CUTSCENE_GRAVEYARD
|
|
RETURN "MISSION_STAGE_CUTSCENE_GRAVEYARD"
|
|
BREAK
|
|
CASE MISSION_STAGE_GRAVEYARD_SHOOTOUT
|
|
RETURN "MISSION_STAGE_GRAVEYARD_SHOOTOUT"
|
|
BREAK
|
|
CASE MISSION_STAGE_CUTSCENE_KIDNAPPED
|
|
RETURN "MISSION_STAGE_CUTSCENE_KIDNAPPED"
|
|
BREAK
|
|
CASE MISSION_STAGE_FLY_HOME
|
|
RETURN "MISSION_STAGE_FLY_HOME"
|
|
BREAK
|
|
CASE MISSION_STAGE_END
|
|
RETURN "MISSION_STAGE_END"
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
RETURN "INCORRECT_MISSION_STAGE"
|
|
|
|
ENDFUNC
|
|
|
|
FUNC STRING GET_MISSION_FAIL_NAME_FOR_DEBUG(MISSION_FAILS eFailReason)
|
|
|
|
SWITCH eFailReason
|
|
CASE MISSION_FAIL_MICHAELS_CAR_UNDRIVABLE
|
|
RETURN "MISSION_FAIL_MICHAELS_CAR_UNDRIVABLE"
|
|
BREAK
|
|
CASE MISSION_FAIL_MICHAELS_CAR_DEAD
|
|
RETURN "MISSION_FAIL_MICHAELS_CAR_DEAD"
|
|
BREAK
|
|
CASE MISSION_FAIL_MICHAELS_CAR_LEFT_BEHIND
|
|
RETURN "MISSION_FAIL_MICHAELS_CAR_LEFT_BEHIND"
|
|
BREAK
|
|
CASE MISSION_FAIL_GRAVEYARD_ABANDONED
|
|
RETURN "MISSION_FAIL_GRAVEYARD_ABANDONED"
|
|
BREAK
|
|
CASE MISSION_FAIL_GRAVEYARD_NOT_REACHED
|
|
RETURN "MISSION_FAIL_GRAVEYARD_NOT_REACHED"
|
|
BREAK
|
|
CASE MISSION_FAIL_GRAVE_NOT_REACHED
|
|
RETURN "MISSION_FAIL_GRAVE_NOT_REACHED"
|
|
BREAK
|
|
CASE MISSION_FAIL_TREVORS_CAR_UNDRIVABLE
|
|
RETURN "MISSION_FAIL_TREVORS_CAR_UNDRIVABLE"
|
|
BREAK
|
|
CASE MISSION_FAIL_TREVORS_CAR_DEAD
|
|
RETURN "MISSION_FAIL_TREVORS_CAR_DEAD"
|
|
BREAK
|
|
CASE MISSION_FAIL_TREVORS_CAR_LEFT_BEHIND
|
|
RETURN "MISSION_FAIL_TREVORS_CAR_LEFT_BEHIND"
|
|
BREAK
|
|
CASE MISSION_FAIL_TREVORS_PLANE_UNDRIVABLE
|
|
RETURN "MISSION_FAIL_TREVORS_PLANE_UNDRIVABLE"
|
|
BREAK
|
|
CASE MISSION_FAIL_TREVORS_PLANE_DEAD
|
|
RETURN "MISSION_FAIL_TREVORS_PLANE_DEAD"
|
|
BREAK
|
|
CASE MISSION_FAIL_MICHAEL_DEAD
|
|
RETURN "MISSION_FAIL_MICHAEL_DEAD"
|
|
BREAK
|
|
CASE MISSION_FAIL_TREVOR_DEAD
|
|
RETURN "MISSION_FAIL_TREVOR_DEAD"
|
|
BREAK
|
|
CASE MISSION_FAIL_FORCE_FAIL
|
|
RETURN "MISSION_FAIL_FORCE_FAIL"
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
RETURN "INCORRECT_MISSION_FAIL"
|
|
ENDFUNC
|
|
|
|
PROC CREATE_DEBUG_WIDGETS()
|
|
|
|
IF NOT DOES_WIDGET_GROUP_EXIST(Michael1Widgets)
|
|
|
|
Michael1Widgets = START_WIDGET_GROUP("Mission: Michael1")
|
|
|
|
ADD_WIDGET_BOOL("Print debug output", bPrintDebugOutput)
|
|
|
|
ADD_WIDGET_BOOL("Toggle snow", bSnowToggle)
|
|
|
|
START_WIDGET_GROUP("Focus push")
|
|
ADD_WIDGET_BOOL("bResetGameplayHint", bResetGameplayHint)
|
|
ADD_WIDGET_FLOAT_SLIDER("fFocusPushHintFOV", fFocusPushHintFOV, 1.0, 60.0, 1.0)
|
|
ADD_WIDGET_FLOAT_SLIDER("fFocusPushSideOffset", fFocusPushSideOffset, -10.0, 10.0, 0.1)
|
|
ADD_WIDGET_FLOAT_SLIDER("fFocusPushVerticalOffset", fFocusPushVerticalOffset, -10.0, 10.0, 0.1)
|
|
ADD_WIDGET_FLOAT_SLIDER("fFocusPushFollowDistanceScalar", fFocusPushFollowDistanceScalar, -10.0, 10.0, 0.1)
|
|
STOP_WIDGET_GROUP()
|
|
|
|
START_WIDGET_GROUP("Shovel PTFX")
|
|
ADD_WIDGET_FLOAT_SLIDER("fParticleFXTriggerPhase", fParticleFXTriggerPhase, 0.0, 1.0, 0.1)
|
|
ADD_WIDGET_VECTOR_SLIDER("vParticleFXPosition", vParticleFXPosition, -10.0, 10.0, 1.0)
|
|
ADD_WIDGET_VECTOR_SLIDER("vParticleFXRotation", vParticleFXRotation, -10.0, 10.0, 1.0)
|
|
STOP_WIDGET_GROUP()
|
|
|
|
ADD_WIDGET_FLOAT_SLIDER("fPlaneRecordingSkipTime", fPlaneRecordingSkipTime, 0.0, 10000.0, 1.0)
|
|
ADD_WIDGET_VECTOR_SLIDER("Flight global offset", vGlobalFlightOffset, -1000, 1000, 1.0)
|
|
ADD_WIDGET_VECTOR_SLIDER("Flight plane offset", vLocalPlaneOffset, -1000, 1000, 1.0)
|
|
ADD_WIDGET_VECTOR_SLIDER("vFirstTrainPosition", vFirstTrainPosition, -10000, 10000, 1.0)
|
|
ADD_WIDGET_FLOAT_SLIDER("fFirstTrainSpeed", fFirstTrainSpeed, 0.0, 20.0, 1.0)
|
|
|
|
START_WIDGET_GROUP("Flight locate settings")
|
|
|
|
ADD_WIDGET_VECTOR_SLIDER("Position", sLocateFlight.vPosition, 0.0, 10000.0, 10.0)
|
|
|
|
ADD_WIDGET_VECTOR_SLIDER("Size", sLocateFlight.vSize, 0.0, 5000.0, 1.0)
|
|
|
|
STOP_WIDGET_GROUP()
|
|
|
|
START_WIDGET_GROUP("Vehicle Damage")
|
|
|
|
ADD_WIDGET_BOOL("Enable widget", bEnableApplyForceWidget)
|
|
|
|
ADD_WIDGET_BOOL("Apply force", bApplyForceToggle)
|
|
|
|
ADD_WIDGET_VECTOR_SLIDER("Force", vApplyForceWidgetForce, 0.0, 100.0, 1.0)
|
|
|
|
ADD_WIDGET_VECTOR_SLIDER("Offset", vApplyForceWidgetOffset, -10.0, 10, 0.1)
|
|
|
|
STOP_WIDGET_GROUP()
|
|
|
|
START_WIDGET_GROUP("Flight cutscene")
|
|
|
|
ADD_WIDGET_INT_SLIDER("iInterpTime", iInterpTime, 0, 10000, 1)
|
|
ADD_WIDGET_INT_SLIDER("iCutsceneTime", iCutsceneTime, 0, 10000, 1)
|
|
|
|
STOP_WIDGET_GROUP()
|
|
|
|
START_WIDGET_GROUP("Arival cutscenes")
|
|
|
|
ADD_WIDGET_INT_SLIDER("iCameraInterpolationTimer", iCameraInterpolationTimer, 0, 5000, 1)
|
|
ADD_WIDGET_FLOAT_SLIDER("fFirstRecordingEndTime", fFirstRecordingEndTime, 0, 20000.0, 1.0)
|
|
ADD_WIDGET_FLOAT_SLIDER("fSecondRecordingStartTime", fSecondRecordingStartTime, 0, 20000.0, 1.0)
|
|
ADD_WIDGET_FLOAT_SLIDER("fSecondRecordingEndTime", fSecondRecordingEndTime, 0, 20000.0, 1.0)
|
|
|
|
STOP_WIDGET_GROUP()
|
|
|
|
ADD_WIDGET_INT_SLIDER("iFirstPersonFXTime", iFirstPersonFXTime, 0, 10000, 100)
|
|
|
|
STOP_WIDGET_GROUP()
|
|
|
|
SET_LOCATES_HEADER_WIDGET_GROUP(Michael1Widgets)
|
|
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC DELETE_DEBUG_WIDGETS()
|
|
IF DOES_WIDGET_GROUP_EXIST(Michael1Widgets)
|
|
DELETE_WIDGET_GROUP(Michael1Widgets)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC CREATE_DEBUG_MISSION_STAGE_MENU()
|
|
|
|
SkipMenu[0].sTxtLabel = "CUT - INTRO - MIC_1_INT"
|
|
SkipMenu[1].sTxtLabel = "GET TO AIRPORT"
|
|
SkipMenu[2].sTxtLabel = "FLY TO NORTH YANKTON"
|
|
SkipMenu[3].sTxtLabel = "CUT - AIRPORT - MIC_1_MCS_1"
|
|
SkipMenu[4].sTxtLabel = "GET TO GRAVEYARD"
|
|
SkipMenu[5].sTxtLabel = "GET TO GRAVE"
|
|
SkipMenu[6].sTxtLabel = "CUT - GRAVEYARD - MIC_1_MCS_2"
|
|
SkipMenu[7].sTxtLabel = "GRAVEYARD SHOOTOUT"
|
|
SkipMenu[8].sTxtLabel = "CUT - KIDNAPPED - MIC_1_MCS_3"
|
|
SkipMenu[9].sTxtLabel = "FLY HOME"
|
|
SkipMenu[10].sTxtLabel = "END"
|
|
|
|
ENDPROC
|
|
|
|
PROC RUN_DEBUG_MISSION_STAGE_MENU(INT &iSelectedStage, MISSION_STAGES &eStage, BOOL &bSkipActive, BOOL &bResetStage)
|
|
|
|
IF LAUNCH_MISSION_STAGE_MENU(SkipMenu, iSelectedStage, ENUM_TO_INT(eStage), FALSE, "MICHAEL 1")
|
|
|
|
DO_SAFE_SCREEN_FADE_OUT(DEFAULT_FADE_TIME)
|
|
|
|
DO_SAFE_STOP_CUTSCENE()
|
|
|
|
CLEAR_PRINTS()
|
|
|
|
CLEAR_HELP()
|
|
|
|
SET_ENTITY_INVINCIBLE(PLAYER_PED_ID(), TRUE)
|
|
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting player ped invincible for debug skip.")
|
|
|
|
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
|
|
|
|
RUN_MISSION_STAGE_CLEANUP(eStage)
|
|
|
|
CLEAR_MISSION_LOCATE_STUFF(sLocatesData)
|
|
|
|
CLEAR_MISSION_LOCATION_TEXT_AND_BLIPS(sLocatesData)
|
|
|
|
CLEAR_TRIGGERED_LABELS()
|
|
|
|
eStage = INT_TO_ENUM(MISSION_STAGES, iSelectedStage)
|
|
|
|
IF ( eStage = MISSION_STAGE_CUTSCENE_GRAVEYARD )
|
|
SET_CUTSCENE_TRIGGER_FLAG_FOR_PLAYER_PED_ENUM(GET_CURRENT_PLAYER_PED_ENUM(), bCutsceneTriggeredByMichael, bCutsceneTriggeredByTrevor)
|
|
ENDIF
|
|
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Current mission stage changed to ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eStage), " via mission stage menu.")
|
|
|
|
bResetStage = FALSE
|
|
|
|
bSkipActive = TRUE
|
|
|
|
RESET_MISSION_FLAGS()
|
|
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC RUN_DEBUG_WIDGETS(MISSION_STAGES eStage)
|
|
|
|
INT i = 0
|
|
|
|
IF ( bEnableApplyForceWidget = TRUE )
|
|
|
|
ENTITY_INDEX entityFocus = GET_FOCUS_ENTITY_INDEX()
|
|
|
|
IF NOT IS_ENTITY_DEAD(entityFocus)
|
|
AND IS_ENTITY_A_VEHICLE(entityFocus)
|
|
|
|
VEHICLE_INDEX vehicleFocus = GET_VEHICLE_INDEX_FROM_ENTITY_INDEX(entityFocus)
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(vehicleFocus)
|
|
|
|
DRAW_DEBUG_SPHERE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(vehicleFocus, vApplyForceWidgetOffset), 0.125, 255, 0, 0)
|
|
|
|
IF ( bApplyForceToggle = TRUE )
|
|
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehicleFocus)
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(vehicleFocus)
|
|
ENDIF
|
|
|
|
APPLY_FORCE_TO_ENTITY(vehicleFocus, APPLY_TYPE_IMPULSE, vApplyForceWidgetForce, vApplyForceWidgetOffset, 0, TRUE, TRUE, TRUE)
|
|
|
|
bApplyForceToggle = FALSE
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF ( bPrologueMapActive = TRUE )
|
|
|
|
//control snow toggle
|
|
IF ( bSnowToggle = TRUE )
|
|
|
|
IF bSnowOn = FALSE
|
|
SET_WEATHER_TYPE_NOW_PERSIST("SNOWLIGHT") //gives clear sky
|
|
UNLOAD_ALL_CLOUD_HATS()
|
|
LOAD_CLOUD_HAT("Snowy 01")
|
|
bSnowOn = TRUE
|
|
|
|
ELIF bSnowOn = TRUE
|
|
SET_WEATHER_TYPE_NOW_PERSIST("EXTRASUNNY")
|
|
CLEAR_WEATHER_TYPE_PERSIST()
|
|
UNLOAD_ALL_CLOUD_HATS()
|
|
bSnowOn = FALSE
|
|
ENDIF
|
|
|
|
bSnowToggle = FALSE
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
SWITCH eStage
|
|
|
|
CASE MISSION_STAGE_GET_TO_GRAVEYARD
|
|
CASE MISSION_STAGE_GET_TO_GRAVE
|
|
CASE MISSION_STAGE_CUTSCENE_GRAVEYARD
|
|
CASE MISSION_STAGE_GRAVEYARD_SHOOTOUT
|
|
CASE MISSION_STAGE_CUTSCENE_KIDNAPPED
|
|
|
|
IF ( bDrawDebugLinesAndSpheres = TRUE )
|
|
|
|
FOR i = 0 TO ( COUNT_OF(sRoadNodes) - 1 )
|
|
IF ( sRoadNodes[i].bCurrent = TRUE )
|
|
DRAW_DEBUG_SPHERE(sRoadNodes[i].vPosition, 1.0, 0, 255, 0)
|
|
ELIF ( sRoadNodes[i].bVisited = TRUE )
|
|
DRAW_DEBUG_SPHERE(sRoadNodes[i].vPosition, 1.0, 255, 0, 0)
|
|
ELSE
|
|
DRAW_DEBUG_SPHERE(sRoadNodes[i].vPosition, 1.0, 0, 0, 255)
|
|
ENDIF
|
|
DRAW_DEBUG_TEXT(GET_STRING_FROM_INT(i), << sRoadNodes[i].vPosition.x, sRoadNodes[i].vPosition.y, sRoadNodes[i].vPosition.z + 1.5>>)
|
|
ENDFOR
|
|
|
|
DRAW_DEBUG_SPHERE(vStreamTriggerPosition1, 0.5, 255, 255, 255)
|
|
DRAW_DEBUG_TEXT("STREAM 1", << vStreamTriggerPosition1.x, vStreamTriggerPosition1.y, vStreamTriggerPosition1.z + 1.5>>)
|
|
|
|
DRAW_DEBUG_SPHERE(vStreamTriggerPosition2, 0.5, 255, 255, 255)
|
|
DRAW_DEBUG_TEXT("STREAM 2", << vStreamTriggerPosition2.x, vStreamTriggerPosition2.y, vStreamTriggerPosition2.z + 1.5>>)
|
|
|
|
DRAW_DEBUG_SPHERE(vStreamTriggerPosition3, 0.5, 255, 255, 255)
|
|
DRAW_DEBUG_TEXT("STREAM 3", << vStreamTriggerPosition3.x, vStreamTriggerPosition3.y, vStreamTriggerPosition3.z + 1.5>>)
|
|
|
|
IF ( bDrawDebugCoverpoints = TRUE )
|
|
|
|
|
|
FOR i = 0 TO ( COUNT_OF(csCoverpoints) - 1 )
|
|
|
|
IF ( csCoverpoints[i].bActive = TRUE )
|
|
|
|
//draw non stationary coverpoints
|
|
IF ( csCoverpoints[i].bStationary = FALSE )
|
|
|
|
DRAW_DEBUG_SPHERE(csCoverpoints[i].vPosition, 0.25, 0, 255, 0)
|
|
|
|
//draw stationary coverpoints
|
|
ELIF ( csCoverpoints[i].bStationary = TRUE )
|
|
|
|
DRAW_DEBUG_SPHERE(csCoverpoints[i].vPosition, 0.25, 0, 255, 255)
|
|
|
|
ENDIF
|
|
|
|
DRAW_DEBUG_TEXT(GET_STRING_FROM_INT(i), << csCoverpoints[i].vPosition.x, csCoverpoints[i].vPosition.y, csCoverpoints[i].vPosition.z + 0.25>>)
|
|
|
|
IF ( csCoverpoints[i].bTaken = TRUE )
|
|
|
|
DRAW_DEBUG_TEXT("TAKEN", << csCoverpoints[i].vPosition.x, csCoverpoints[i].vPosition.y, csCoverpoints[i].vPosition.z + 0.55>>)
|
|
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
DRAW_DEBUG_SPHERE(csCoverpoints[i].vPosition, 0.25, 255, 0, 0)
|
|
|
|
DRAW_DEBUG_TEXT(GET_STRING_FROM_INT(i), << csCoverpoints[i].vPosition.x, csCoverpoints[i].vPosition.y, csCoverpoints[i].vPosition.z + 0.25>>)
|
|
|
|
ENDIF
|
|
|
|
ENDFOR
|
|
|
|
FOR i = 0 TO ( COUNT_OF(FraggableTombstones) - 1 )
|
|
|
|
DRAW_DEBUG_SPHERE(FraggableTombstones[i].vPosition, 1.25, 255, 255, 0, 64)
|
|
|
|
DRAW_DEBUG_TEXT(GET_STRING_FROM_INT(i), << FraggableTombstones[i].vPosition.x, FraggableTombstones[i].vPosition.y, FraggableTombstones[i].vPosition.z + 0.5>>)
|
|
|
|
ENDFOR
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
ENDPROC
|
|
|
|
PROC RUN_DEBUG_PASS_AND_FAIL_CHECK(MISSION_STAGES &eStage, MISSION_FAILS &eFailReason)
|
|
|
|
IF IS_KEYBOARD_KEY_PRESSED (KEY_S)
|
|
|
|
//force player to be Trevor on s-pass, since mission can be normally only completed as Trevor
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() <> CHAR_TREVOR
|
|
|
|
IF ( bMichaelsWeaponsStored = FALSE )
|
|
STORE_PLAYER_PED_WEAPONS_IN_SNAPSHOT(PLAYER_PED_ID())
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Calling STORE_PLAYER_PED_WEAPONS_IN_SNAPSHOT(PLAYER_PED_ID()).")
|
|
#ENDIF
|
|
REMOVE_PED_WEAPONS_LEAVING_ONE(PLAYER_PED_ID(), WEAPONTYPE_PISTOL)
|
|
bMichaelsWeaponsStored = TRUE
|
|
ENDIF
|
|
|
|
WHILE NOT SET_CURRENT_SELECTOR_PED(SELECTOR_PED_TREVOR)
|
|
WAIT(0)
|
|
ENDWHILE
|
|
ENDIF
|
|
|
|
eStage = MISSION_STAGE_PASSED
|
|
ENDIF
|
|
|
|
IF IS_KEYBOARD_KEY_PRESSED (KEY_F)
|
|
eStage = MISSION_STAGE_FAILED
|
|
eFailReason = MISSION_FAIL_FORCE_FAIL
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC RUN_DEBUG_SKIPS(MISSION_STAGES &eStage, BOOL &bSkipActive, BOOL &bResetStage)
|
|
|
|
INT iCurrentStage = ENUM_TO_INT(eStage)
|
|
|
|
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_J)
|
|
|
|
IF eStage <> MISSION_STAGE_END
|
|
|
|
DO_SAFE_SCREEN_FADE_OUT(DEFAULT_FADE_TIME)
|
|
|
|
DO_SAFE_STOP_CUTSCENE()
|
|
|
|
CLEAR_PRINTS()
|
|
|
|
CLEAR_HELP()
|
|
|
|
SET_ENTITY_INVINCIBLE(PLAYER_PED_ID(), TRUE)
|
|
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting player ped invincible for debug j-skip.")
|
|
|
|
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
|
|
|
|
RUN_MISSION_STAGE_CLEANUP(eStage)
|
|
|
|
iCurrentStage++
|
|
|
|
eStage = INT_TO_ENUM(MISSION_STAGES, iCurrentStage)
|
|
|
|
//If playing as Trevor, J-skip on get to airport should take you to the fly plane stage.
|
|
IF eStage = MISSION_STAGE_FLY_TO_NORTH_YANKTON
|
|
|
|
IF ( GET_CURRENT_PLAYER_PED_ENUM() <> CHAR_TREVOR )
|
|
iCurrentStage++
|
|
eStage = INT_TO_ENUM(MISSION_STAGES, iCurrentStage)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF ( eStage = MISSION_STAGE_CUTSCENE_GRAVEYARD )
|
|
SET_CUTSCENE_TRIGGER_FLAG_FOR_PLAYER_PED_ENUM(GET_CURRENT_PLAYER_PED_ENUM(), bCutsceneTriggeredByMichael, bCutsceneTriggeredByTrevor)
|
|
ENDIF
|
|
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Current mission stage changed to ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eStage), " via J skip.")
|
|
|
|
bResetStage = FALSE
|
|
|
|
bSkipActive = TRUE
|
|
|
|
RESET_MISSION_FLAGS()
|
|
|
|
ENDIF
|
|
|
|
ELIF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_P)
|
|
|
|
IF eStage <> MISSION_STAGE_CUTSCENE_INTRO
|
|
|
|
DO_SAFE_SCREEN_FADE_OUT(DEFAULT_FADE_TIME)
|
|
|
|
DO_SAFE_STOP_CUTSCENE()
|
|
|
|
CLEAR_PRINTS()
|
|
|
|
CLEAR_HELP()
|
|
|
|
SET_ENTITY_INVINCIBLE(PLAYER_PED_ID(), TRUE)
|
|
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting player ped invincible for debug p-skip.")
|
|
|
|
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
|
|
|
|
RUN_MISSION_STAGE_CLEANUP(eStage)
|
|
|
|
//handle normal p-skip
|
|
IF ( bResetStage = FALSE )
|
|
|
|
iCurrentStage--
|
|
|
|
eStage = INT_TO_ENUM(MISSION_STAGES, iCurrentStage)
|
|
|
|
IF eStage = MISSION_STAGE_CUTSCENE_AIRPORT
|
|
IF ( GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR )
|
|
iCurrentStage--
|
|
eStage = INT_TO_ENUM(MISSION_STAGES, iCurrentStage)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eStage = MISSION_STAGE_FLY_TO_NORTH_YANKTON
|
|
IF ( GET_CURRENT_PLAYER_PED_ENUM() <> CHAR_TREVOR )
|
|
iCurrentStage--
|
|
eStage = INT_TO_ENUM(MISSION_STAGES, iCurrentStage)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF ( eStage = MISSION_STAGE_CUTSCENE_GRAVEYARD )
|
|
SET_CUTSCENE_TRIGGER_FLAG_FOR_PLAYER_PED_ENUM(GET_CURRENT_PLAYER_PED_ENUM(), bCutsceneTriggeredByMichael, bCutsceneTriggeredByTrevor)
|
|
ENDIF
|
|
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Current mission stage changed to ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eStage), " via P skip.")
|
|
|
|
//handle p-skip stage reset
|
|
ELIF ( bResetStage = TRUE )
|
|
|
|
eStage = INT_TO_ENUM(MISSION_STAGES, iCurrentStage)
|
|
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Current mission stage ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eStage), " reset via P skip.")
|
|
|
|
ENDIF
|
|
|
|
bResetStage = FALSE
|
|
|
|
bSkipActive = TRUE
|
|
|
|
RESET_MISSION_FLAGS()
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
FUNC STRING GET_ENEMY_STATE_NAME_FOR_DEBUG(ENEMY_STATES eState)
|
|
|
|
SWITCH eState
|
|
|
|
CASE ENEMY_STATE_IDLE
|
|
RETURN "ENEMY_STATE_IDLE"
|
|
BREAK
|
|
CASE ENEMY_STATE_SCRIPTED_ENTRY
|
|
RETURN "ENEMY_STATE_SCRIPTED_ENTRY"
|
|
BREAK
|
|
CASE ENEMY_STATE_PATROLLING
|
|
RETURN "ENEMY_STATE_PATROLLING"
|
|
BREAK
|
|
CASE ENEMY_STATE_INVESTIGATING
|
|
RETURN "ENEMY_STATE_INVESTIGATING"
|
|
BREAK
|
|
CASE ENEMY_STATE_MOVING_TO_LOCATION
|
|
RETURN "ENEMY_STATE_MOVING_TO_LOCATION"
|
|
BREAK
|
|
CASE ENEMY_STATE_STANDING_AT_LOCATION
|
|
RETURN "ENEMY_STATE_STANDING_AT_LOCATION"
|
|
BREAK
|
|
CASE ENEMY_STATE_PERFORMING_ENEMY_ACTION
|
|
RETURN "ENEMY_STATE_PERFORMING_ENEMY_ACTION"
|
|
BREAK
|
|
CASE ENEMY_STATE_WAITING_FOR_TARGET
|
|
RETURN "ENEMY_STATE_WAITING_FOR_TARGET"
|
|
BREAK
|
|
CASE ENEMY_STATE_GO_TO_COORD
|
|
RETURN "ENEMY_STATE_GO_TO_COORD"
|
|
BREAK
|
|
CASE ENEMY_STATE_FOLLOW_WAYPOINT_RECORDING
|
|
RETURN "ENEMY_STATE_FOLLOW_WAYPOINT_RECORDING"
|
|
BREAK
|
|
CASE ENEMY_STATE_SNIPING
|
|
RETURN "ENEMY_STATE_SNIPING"
|
|
BREAK
|
|
CASE ENEMY_STATE_COMBAT
|
|
RETURN "ENEMY_STATE_COMBAT"
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
RETURN "INVALID_ENEMY_STATE"
|
|
|
|
ENDFUNC
|
|
|
|
FUNC STRING GET_DETECTED_LOCATION_NAME_FOR_DEBUG(DETECTED_LOCATIONS eLocation)
|
|
|
|
SWITCH eLocation
|
|
|
|
CASE DL_NOT_DETECTED
|
|
RETURN "DL_NOT_DETECTED"
|
|
BREAK
|
|
CASE DL_START_AREA
|
|
RETURN "DL_START_AREA"
|
|
BREAK
|
|
CASE DL_MIDDLE_AREA_01
|
|
RETURN "DL_MIDDLE_AREA_01"
|
|
BREAK
|
|
CASE DL_MIDDLE_AREA_02
|
|
RETURN "DL_MIDDLE_AREA_02"
|
|
BREAK
|
|
CASE DL_CHURCH_AREA
|
|
RETURN "DL_CHURCH_AREA"
|
|
BREAK
|
|
CASE DL_PARKING_LOT
|
|
RETURN "DL_PARKING_LOT"
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
RETURN "INVALID_SPOTTED_LOCATION"
|
|
|
|
ENDFUNC
|
|
|
|
PROC RUN_DEBUG_INFORMATION_DISPLAY()
|
|
|
|
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_NUMPAD4)
|
|
IF ( bDrawDebugLinesAndSpheres = FALSE)
|
|
SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE)
|
|
bDrawDebugLinesAndSpheres = TRUE
|
|
ELSE
|
|
SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(FALSE)
|
|
bDrawDebugLinesAndSpheres = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_NUMPAD5)
|
|
IF ( bDrawDebugStates = FALSE)
|
|
bDrawDebugStates = TRUE
|
|
ELSE
|
|
bDrawDebugStates = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_NUMPAD6)
|
|
IF ( bDrawDebugCoverpoints = FALSE)
|
|
bDrawDebugCoverpoints = TRUE
|
|
ELSE
|
|
bDrawDebugCoverpoints = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
#ENDIF
|
|
//|===================== END DEBUG VARIABLES, PROCEDURES & FUNCTIONS =====================|
|
|
|
|
//|======================== CAR RECORDING PROCEDURES & FUNCTIONS =========================|
|
|
|
|
//Author: Ross Wallace
|
|
//PURPOSE: Returns the percentage progress of a car recording...
|
|
FUNC FLOAT GET_VEHICLE_RECORDING_PLAYBACK_PERCENTAGE(VEHICLE_INDEX VehicleIndex #IF IS_DEBUG_BUILD, BOOL bPrintRecordingTime = FALSE #ENDIF)
|
|
|
|
IF DOES_ENTITY_EXIST(VehicleIndex)
|
|
AND IS_VEHICLE_DRIVEABLE(VehicleIndex)
|
|
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(VehicleIndex)
|
|
|
|
RECORDING_ID RecordingID = GET_CURRENT_PLAYBACK_FOR_VEHICLE(VehicleIndex)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
INT iPercentage = ROUND( 100.0 * ( GET_TIME_POSITION_IN_RECORDING(VehicleIndex) / GET_TOTAL_DURATION_OF_VEHICLE_RECORDING_ID(RecordingID) ) )
|
|
TEXT_LABEL_63 debugName = GET_VEHICLE_RECORDING_NAME(RecordingID)
|
|
debugName += iPercentage
|
|
SET_VEHICLE_NAME_DEBUG(VehicleIndex, debugName)
|
|
IF ( bPrintRecordingTime = TRUE )
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Recording ", GET_VEHICLE_RECORDING_NAME(RecordingID), " playback percentage ", 100.0 * ( GET_TIME_POSITION_IN_RECORDING(VehicleIndex) / GET_TOTAL_DURATION_OF_VEHICLE_RECORDING_ID(RecordingID) ) )
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
IF ( bPrintRecordingTime = TRUE )
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Recording ", GET_VEHICLE_RECORDING_NAME(RecordingID), " time is ", GET_TIME_POSITION_IN_RECORDING(VehicleIndex), ".")
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
RETURN ( 100.0 * ( GET_TIME_POSITION_IN_RECORDING(VehicleIndex) / GET_TOTAL_DURATION_OF_VEHICLE_RECORDING_ID(RecordingID) ) )
|
|
|
|
ELSE
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": GET_VEHICLE_RECORDING_PLAYBACK_PERCENTAGE: Playback not going on for vehicle.")
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": GET_VEHICLE_RECORDING_PLAYBACK_PERCENTAGE: Vehicle does not exist or is not driveable.")
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
|
|
RETURN -1.0
|
|
|
|
ENDFUNC
|
|
|
|
PROC START_VEHICLE_RECORDING_PLAYBACK_FOR_VEHICLE(VEH_STRUCT vsCar, STRING sFileName, FLOAT fPlaybackSpeed, BOOL bPaused = FALSE,
|
|
FLOAT fTime = 0.0, BOOL bSkipToVehiclePosition = FALSE, BOOL bUseFlags = FALSE,
|
|
INT iFlags = SWITCH_ON_PLAYER_VEHICLE_IMPACT)
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(vsCar.VehicleIndex)
|
|
|
|
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vsCar.VehicleIndex)
|
|
|
|
IF HAS_VEHICLE_RECORDING_BEEN_LOADED(vsCar.iRecordingNumber, sFileName)
|
|
|
|
IF ( bUseFlags = FALSE )
|
|
|
|
START_PLAYBACK_RECORDED_VEHICLE(vsCar.VehicleIndex, vsCar.iRecordingNumber, sFileName)
|
|
|
|
ELIF ( bUseFlags = TRUE )
|
|
|
|
START_PLAYBACK_RECORDED_VEHICLE_WITH_FLAGS(vsCar.VehicleIndex, vsCar.iRecordingNumber, sFileName, iFlags)
|
|
|
|
ENDIF
|
|
|
|
IF ( fTime > 0.0 )
|
|
SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vsCar.VehicleIndex, fTime)
|
|
|
|
ELIF ( bSkipToVehiclePosition = TRUE )
|
|
|
|
SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vsCar.VehicleIndex, GET_CLOSEST_TIME_POSITION_IN_RECORDING_TO_POINT(GET_ENTITY_COORDS(vsCar.VehicleIndex), vsCar.iRecordingNumber, sFileName, 16))
|
|
|
|
ENDIF
|
|
|
|
SET_PLAYBACK_SPEED(vsCar.VehicleIndex, fPlaybackSpeed)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Vehicle recording ", sFileName, " number ", vsCar.iRecordingNumber, " for vehicle ", GET_MODEL_NAME_FOR_DEBUG(vsCar.ModelName), " started with playback speed ", fPlaybackSpeed, ".")
|
|
#ENDIF
|
|
|
|
|
|
IF ( bPaused = TRUE )
|
|
PAUSE_PLAYBACK_RECORDED_VEHICLE(vsCar.VehicleIndex)
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Vehicle recording ", sFileName, " number ", vsCar.iRecordingNumber, " for vehicle ", GET_MODEL_NAME_FOR_DEBUG(vsCar.ModelName), " paused.")
|
|
#ENDIF
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Vehicle recording number ", vsCar.iRecordingNumber, " for vehicle ", GET_MODEL_NAME_FOR_DEBUG(vsCar.ModelName), " is not loaded.")
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
//|====================== END CAR RECORDING PROCEDURES & FUNCTIONS =======================|
|
|
|
|
//|==================================== PROCEDURES =======================================|
|
|
|
|
/// PURPOSE:
|
|
/// Sets mission stage enum for replay.
|
|
/// PARAMS:
|
|
/// eStage - Mission stage enum variable.
|
|
/// iValue - Mid-mission replay value returned by the script when replaying the mission.
|
|
PROC SET_MISSION_STAGE_FOR_REPLAY(MISSION_STAGES &eStage, INT iValue)
|
|
|
|
IF iValue = ENUM_TO_INT(MID_MISSION_STAGE_GET_TO_AIRPORT)
|
|
|
|
eStage = MISSION_STAGE_GET_TO_AIRPORT
|
|
|
|
ELIF iValue = ENUM_TO_INT(MID_MISSION_STAGE_FLY_TO_NORTH_YANKTON)
|
|
|
|
eStage = MISSION_STAGE_FLY_TO_NORTH_YANKTON
|
|
|
|
ELIF iValue = ENUM_TO_INT(MID_MISSION_STAGE_GET_TO_GRAVEYARD)
|
|
|
|
eStage = MISSION_STAGE_GET_TO_GRAVEYARD
|
|
|
|
ELIF iValue = ENUM_TO_INT(MID_MISSION_STAGE_GET_TO_GRAVE)
|
|
|
|
eStage = MISSION_STAGE_GET_TO_GRAVE
|
|
|
|
ELIF iValue = ENUM_TO_INT(MID_MISSION_STAGE_GRAVEYARD_SHOOTOUT)
|
|
|
|
eStage = MISSION_STAGE_GRAVEYARD_SHOOTOUT
|
|
|
|
ELIF iValue = ENUM_TO_INT(MID_MISSION_STAGE_FLY_HOME)
|
|
|
|
eStage = MISSION_STAGE_FLY_HOME
|
|
|
|
ENDIF
|
|
|
|
bStageReplayInProgress = TRUE
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Mission is being replayed at stage ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eStage), ".")
|
|
#ENDIF
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Initialise arrays for peds, vehicles, objects etc for a specified stage.
|
|
/// PARAMS:
|
|
/// eStage - Mission stage to initialise arrays for.
|
|
PROC INITIALISE_ARRAYS_FOR_MISSION_STAGE(MISSION_STAGES eStage)
|
|
|
|
//Michael's ped details, identical for every mission stage
|
|
psMichael.ModelName = GET_PLAYER_PED_MODEL(CHAR_MICHAEL)
|
|
|
|
//Trevor's ped details, identical for every mission stage
|
|
psTrevor.ModelName = GET_PLAYER_PED_MODEL(CHAR_TREVOR)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Initialising arrays for ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eStage), ".")
|
|
#ENDIF
|
|
|
|
Gates[0].eHashEnum = GRAVEYARD_GATE_WEST_L
|
|
Gates[0].vPosition = <<3293.6226, -4611.3037, 116.7559>>
|
|
Gates[0].ModelName = prop_cs_gravyard_gate_l
|
|
|
|
Gates[1].eHashEnum = GRAVEYARD_GATE_WEST_R
|
|
Gates[1].vPosition = <<3293.2231, -4615.0601, 116.7540>>
|
|
Gates[1].ModelName = prop_cs_gravyard_gate_r
|
|
|
|
Gates[2].eHashEnum = GRAVEYARD_GATE_EAST_L
|
|
Gates[2].vPosition = <<3239.1865, -4594.8237, 117.7705>>
|
|
Gates[2].ModelName = prop_cs_gravyard_gate_l
|
|
|
|
Gates[3].eHashEnum = GRAVEYARD_GATE_EAST_R
|
|
Gates[3].vPosition = <<3239.9766, -4591.1299, 117.7685>>
|
|
Gates[3].ModelName = prop_cs_gravyard_gate_r
|
|
|
|
Gates[4].eHashEnum = GRAVEYARD_GATE_SOUTH_L
|
|
Gates[4].vPosition = <<3262.5972, -4561.6587, 119.0779>>
|
|
Gates[4].ModelName = prop_cs_gravyard_gate_l
|
|
|
|
Gates[5].eHashEnum = GRAVEYARD_GATE_SOUTH_R
|
|
Gates[5].vPosition = <<3266.3745, -4561.6631, 119.0760>>
|
|
Gates[5].ModelName = prop_cs_gravyard_gate_r
|
|
|
|
SWITCH eStage
|
|
|
|
CASE MISSION_STAGE_CUTSCENE_INTRO
|
|
|
|
psTrevor.vPosition = <<-802.4639, 173.0358, 71.8447>>
|
|
psTrevor.fHeading = 288.8440
|
|
psTrevor.vDestination = << 1733.6469, 3306.0200, 40.2261 >>
|
|
|
|
psMichael.vPosition = <<-802.4639, 173.0358, 71.8447>>
|
|
psMichael.fHeading = 288.8440
|
|
psMichael.vDestination = << -1033.20, -2731.17, 19.05 >>
|
|
|
|
vsMichaelsCar.ModelName = GET_PLAYER_VEH_MODEL(CHAR_MICHAEL)
|
|
vsMichaelsCar.vPosition = <<-829.2751, 176.4524, 69.8634>>
|
|
vsMichaelsCar.fHeading = 151.8630
|
|
vsMichaelsCar.iRecordingNumber = 003
|
|
|
|
vsTrevorsCar.ModelName = GET_PLAYER_VEH_MODEL(CHAR_TREVOR)
|
|
vsTrevorsCar.vPosition = << -825.8718, 157.3143, 69.4619 >>
|
|
vsTrevorsCar.fHeading = 90.0
|
|
vsTrevorsCar.iRecordingNumber = 001
|
|
|
|
vsTrevorsPlane.ModelName = CUBAN800
|
|
vsTrevorsPlane.vPosition = <<1731.8021, 3308.9109, 40.2237>>
|
|
vsTrevorsPlane.fHeading = 194.8553
|
|
vsTrevorsPlane.iRecordingNumber = 002
|
|
|
|
sLocateFlight.vPosition = <<-3841.2847, 5020.6064, 174.8651>>//<< 4390.0, 8850.0, 900.0 >>
|
|
sLocateFlight.vSize = << 0.5, 0.5, 0.5 >>
|
|
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_GET_TO_AIRPORT
|
|
|
|
psTrevor.vPosition = <<-818.0981, 158.3042, 69.7868>>
|
|
psTrevor.fHeading = 109.1361
|
|
psTrevor.vDestination = << 1733.6469, 3306.0200, 40.2261 >>
|
|
|
|
psMichael.vPosition = <<-813.9473, 179.2056, 71.1592>>
|
|
psMichael.fHeading = 111.3824
|
|
psMichael.vDestination = << -1033.20, -2731.17, 19.05 >>
|
|
|
|
vsMichaelsCar.ModelName = GET_PLAYER_VEH_MODEL(CHAR_MICHAEL)
|
|
vsMichaelsCar.vPosition = <<-829.2751, 176.4524, 69.8634>>
|
|
vsMichaelsCar.fHeading = 151.8630
|
|
vsMichaelsCar.iRecordingNumber = 003
|
|
|
|
vsTrevorsCar.ModelName = GET_PLAYER_VEH_MODEL(CHAR_TREVOR)
|
|
vsTrevorsCar.vPosition = << -825.8718, 157.3143, 69.4619 >>
|
|
vsTrevorsCar.fHeading = 90.0
|
|
vsTrevorsCar.iRecordingNumber = 001
|
|
|
|
vsTrevorsPlane.ModelName = CUBAN800
|
|
vsTrevorsPlane.vPosition = <<1731.8021, 3308.9109, 40.2237>>
|
|
vsTrevorsPlane.fHeading = 194.8553
|
|
vsTrevorsPlane.iRecordingNumber = 002
|
|
|
|
sLocateFlight.vPosition = <<-3841.2847, 5020.6064, 174.8651>>//<< 4390.0, 8850.0, 900.0 >>
|
|
sLocateFlight.vSize = << 0.5, 0.5, 0.5 >>
|
|
|
|
osGolfBall.vPosition = sLocateFlight.vPosition
|
|
osGolfBall.vRotation = << 0.0, 0.0, 0.0 >>
|
|
osGolfBall.ModelName = PROP_GOLF_BALL
|
|
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_FLY_TO_NORTH_YANKTON
|
|
|
|
psTrevor.vPosition = << 1746.7969, 3291.4446, 40.1072 >>
|
|
psTrevor.fHeading = 55.8571
|
|
psTrevor.vDestination = << 1733.6469, 3306.0200, 40.2261 >>
|
|
|
|
psMichael.vPosition = << -826.91, 176.45, 69.97 >>
|
|
psMichael.fHeading = 129.1458
|
|
psMichael.vDestination = << -1033.20, -2731.17, 19.05 >>
|
|
|
|
vsMichaelsCar.ModelName = GET_PLAYER_VEH_MODEL(CHAR_MICHAEL)
|
|
vsMichaelsCar.vPosition = << -828.4514, 177.0704, 69.9859 >>
|
|
vsMichaelsCar.fHeading = 147.0378
|
|
vsMichaelsCar.iRecordingNumber = 003
|
|
|
|
vsTrevorsCar.ModelName = GET_PLAYER_VEH_MODEL(CHAR_TREVOR)
|
|
vsTrevorsCar.vPosition = << 1747.3265, 3294.0227, 40.1071 >>
|
|
vsTrevorsCar.fHeading = 84.1211
|
|
vsTrevorsCar.iRecordingNumber = 001
|
|
|
|
vsTrevorsPlane.ModelName = CUBAN800
|
|
vsTrevorsPlane.vPosition = <<1731.8021, 3308.9109, 40.2237>>
|
|
vsTrevorsPlane.fHeading = 194.8553
|
|
vsTrevorsPlane.iRecordingNumber = 002
|
|
|
|
sLocateFlight.vPosition = <<-3841.2847, 5020.6064, 174.8651>>//<< 4390.0, 8850.0, 900.0 >>
|
|
sLocateFlight.vSize = << 0.5, 0.5, 0.5 >>
|
|
|
|
osGolfBall.vPosition = sLocateFlight.vPosition
|
|
osGolfBall.vRotation = << 0.0, 0.0, 0.0 >>
|
|
osGolfBall.ModelName = PROP_GOLF_BALL
|
|
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_CUTSCENE_AIRPORT
|
|
|
|
psMichael.vPosition = << -1033.3214, -2727.2915, 19.1813 >>
|
|
psMichael.fHeading = 239.5299
|
|
psMichael.vDestination = << 0.0, 0.0, 0.0 >>
|
|
|
|
psTrevor.vPosition = << -1012.2794, -2738.5303, 19.1873 >>
|
|
psTrevor.fHeading = 329.2714
|
|
psTrevor.vDestination = << 0.0, 0.0, 0.0 >>
|
|
|
|
vsMichaelsCar.ModelName = GET_PLAYER_VEH_MODEL(CHAR_MICHAEL)
|
|
vsMichaelsCar.vPosition = << -1033.4814, -2728.8206, 19.1441 >>
|
|
vsMichaelsCar.fHeading = 239.6801
|
|
|
|
vsTrevorsPlane.ModelName = CUBAN800
|
|
vsTrevorsPlane.vPosition = <<1731.8021, 3308.9109, 40.2237>>
|
|
vsTrevorsPlane.fHeading = 194.8553
|
|
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_GET_TO_GRAVEYARD
|
|
|
|
psMichael.vPosition = << 5482.5986, -5125.9849, 77.4370 >>
|
|
psMichael.fHeading = 264.8607
|
|
psMichael.vDestination = << 3216.8445, -4682.9536, 111.7127 >>
|
|
|
|
psTrevor.vPosition = << 3259.5271, -4571.6938, 117.1567 >>
|
|
psTrevor.fHeading = 181.5470
|
|
|
|
vsMichaelsCar.ModelName = ASEA2
|
|
vsMichaelsCar.vPosition = << 5575.9858, -5130.2427, 79.5043 >>
|
|
vsMichaelsCar.fHeading = 86.0572
|
|
vsMichaelsCar.iRecordingNumber = 005
|
|
|
|
vsTrevorsCar.ModelName = MESA2
|
|
vsTrevorsCar.vPosition = <<3257.9006, -4689.8130, 111.8699>>
|
|
vsTrevorsCar.fHeading = 278.2631
|
|
|
|
tsTrain.iConfiguration = 9
|
|
tsTrain.vPosition = vFirstTrainPosition
|
|
tsTrain.ModelName1 = FREIGHT
|
|
tsTrain.ModelName2 = FREIGHTCAR
|
|
tsTrain.ModelName3 = FREIGHTGRAIN
|
|
tsTrain.ModelName4 = S_M_M_TRUCKER_01
|
|
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_GET_TO_GRAVE
|
|
|
|
psMichael.vPosition = <<3216.5117, -4688.0327, 111.6721>>
|
|
psMichael.fHeading = 268.5004
|
|
|
|
psTrevor.vPosition = << 3259.5271, -4571.6938, 117.1567 >>
|
|
psTrevor.fHeading = 181.5470
|
|
|
|
vsMichaelsCar.ModelName = ASEA2
|
|
vsMichaelsCar.vPosition = << 3212.0027, -4689.3232, 111.6762 >>
|
|
vsMichaelsCar.fHeading = 225.1631
|
|
|
|
vsTrevorsCar.ModelName = MESA2
|
|
vsTrevorsCar.vPosition = <<3257.9006, -4689.8130, 111.8699>>
|
|
vsTrevorsCar.fHeading = 278.2631
|
|
|
|
osPropShovel.vPosition = <<3259.5710, -4572.7739, 116.1162>>
|
|
osPropShovel.vRotation = <<-91.0000, -38.0000, 0.0000>>
|
|
osPropShovel.ModelName = PROP_LD_SHOVEL
|
|
|
|
osPropPickaxe.vPosition = <<3259.2451, -4573.0298, 116.8103>>
|
|
osPropPickaxe.vRotation = <<158.0000, 0.0000, 77.4000>>
|
|
osPropPickaxe.ModelName = PROP_TOOL_PICKAXE
|
|
|
|
osPropCoffin.vPosition = <<3259.7339, -4573.8970, 115.8785>>
|
|
osPropCoffin.vRotation = <<5.0000, 0.0000, -180.0000>>
|
|
osPropCoffin.ModelName = PROP_COFFIN_02
|
|
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_CUTSCENE_GRAVEYARD
|
|
|
|
psBrad.vPosition = <<3240.7776, -4559.6108, 116.9483>>
|
|
psBrad.fHeading = 92.2719
|
|
psBrad.ModelName = CS_BRADCADAVER
|
|
|
|
psMichael.vPosition = << 3258.16, -4572.49, 117.16 >>
|
|
psMichael.fHeading = 180.0
|
|
psMichael.vDestination = << 0.0, 0.0, 0.0 >>
|
|
|
|
psTrevor.vPosition = << 3257.53, -4574.04, 117.16 >>
|
|
psTrevor.fHeading = 0.0
|
|
psTrevor.vDestination = << 0.0, 0.0, 0.0 >>
|
|
|
|
vsMichaelsCar.ModelName = ASEA2
|
|
vsMichaelsCar.vPosition = << 3211.3403, -4688.4854, 111.7328 >>
|
|
vsMichaelsCar.fHeading = 222.9433
|
|
|
|
vsTrevorsCar.ModelName = MESA2
|
|
vsTrevorsCar.vPosition = <<3257.9006, -4689.8130, 111.8699>>
|
|
vsTrevorsCar.fHeading = 278.2631
|
|
|
|
osPropShovel.vPosition = <<3259.5710, -4572.7739, 116.1162>>
|
|
osPropShovel.vRotation = <<-91.0000, -38.0000, 0.0000>>
|
|
osPropShovel.ModelName = PROP_LD_SHOVEL
|
|
|
|
osPropPickaxe.vPosition = <<3259.2451, -4573.0298, 116.8103>>
|
|
osPropPickaxe.vRotation = <<158.0000, 0.0000, 77.4000>>
|
|
osPropPickaxe.ModelName = PROP_TOOL_PICKAXE
|
|
|
|
osPropCoffin.vPosition = <<3259.7339, -4573.8970, 115.8785>>
|
|
osPropCoffin.vRotation = <<5.0000, 0.0000, -180.0000>>
|
|
osPropCoffin.ModelName = PROP_COFFIN_02
|
|
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_GRAVEYARD_SHOOTOUT
|
|
|
|
psBrad.vPosition = <<3240.7776, -4559.6108, 116.9483>>
|
|
psBrad.fHeading = 92.2719
|
|
psBrad.ModelName = CS_BRADCADAVER
|
|
|
|
psMichael.vPosition = << 3256.4697, -4575.1128, 117.1567 >>
|
|
psMichael.fHeading = 273.8974
|
|
psMichael.vDestination = << 3248.886230, -4687.962891, 114.841042 >>
|
|
|
|
vsMichaelsCar.ModelName = ASEA2
|
|
vsMichaelsCar.vPosition = << 3211.3403, -4688.4854, 111.7328 >>
|
|
vsMichaelsCar.fHeading = 222.9433
|
|
|
|
osPropShovel.vPosition = <<3259.5710, -4572.7739, 116.1162>>
|
|
osPropShovel.vRotation = <<-91.0000, -38.0000, 0.0000>>
|
|
osPropShovel.ModelName = PROP_LD_SHOVEL
|
|
|
|
osPropPickaxe.vPosition = <<3259.2451, -4573.0298, 116.8103>>
|
|
osPropPickaxe.vRotation = <<158.0000, 0.0000, 77.4000>>
|
|
osPropPickaxe.ModelName = PROP_TOOL_PICKAXE
|
|
|
|
osPropCoffin.vPosition = <<3259.7339, -4573.8970, 115.8785>>
|
|
osPropCoffin.vRotation = <<5.0000, 0.0000, -180.0000>>
|
|
osPropCoffin.ModelName = PROP_COFFIN_02
|
|
|
|
vsEnemyVans[0].vPosition = << 3304.86, -4641.48, 113.08 >>
|
|
vsEnemyVans[0].fHeading = 27.521
|
|
vsEnemyVans[0].ModelName = mnEnemyVan
|
|
vsEnemyVans[0].iRecordingNumber = 012
|
|
|
|
vsEnemyVans[1].vPosition = << 3242.78, -4673.15, 113.18 >>
|
|
vsEnemyVans[1].fHeading = 53.3085
|
|
vsEnemyVans[1].ModelName = mnEnemyVan
|
|
vsEnemyVans[1].iRecordingNumber = 013
|
|
|
|
vsEnemyVans[2].vPosition = << 3259.67, -4690.98, 112.69 >>
|
|
vsEnemyVans[2].fHeading = 303.13
|
|
vsEnemyVans[2].ModelName = mnEnemyVan
|
|
|
|
vsEnemyVans[3].vPosition = << 3254.34, -4683.82, 112.67 >>
|
|
vsEnemyVans[3].fHeading = 249.15
|
|
vsEnemyVans[3].ModelName = mnEnemyVan
|
|
|
|
vsEnemyVans[4].vPosition = << 3235.7214, -4835.2661, 110.8135 >>
|
|
vsEnemyVans[4].fHeading = 84.1679
|
|
vsEnemyVans[4].ModelName = mnEnemyVan
|
|
vsEnemyVans[4].iRecordingNumber = 015
|
|
|
|
tsTrain.iConfiguration = 23
|
|
tsTrain.vPosition = << 3154.38, -4698.16, 111.63 >>
|
|
tsTrain.ModelName1 = FREIGHT
|
|
tsTrain.ModelName2 = FREIGHTCAR
|
|
tsTrain.ModelName3 = FREIGHTCONT1
|
|
tsTrain.ModelName4 = S_M_M_TRUCKER_01
|
|
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_CUTSCENE_KIDNAPPED
|
|
|
|
psMichael.vPosition = << 3217.3970, -4687.5581, 111.7128 >>
|
|
psMichael.fHeading = 94.6391
|
|
|
|
vsMichaelsCar.ModelName = ASEA2
|
|
vsMichaelsCar.vPosition = << 3211.3403, -4688.4854, 111.7328 >>
|
|
vsMichaelsCar.fHeading = 222.9433
|
|
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_FLY_HOME
|
|
|
|
psTrevor.vPosition = <<-4568.2949, 4981.7153, 136.7620>> //<< 3382.9780, 8102.7705, 21.5856 >>
|
|
psTrevor.fHeading = 259.5159 //143.8278
|
|
|
|
vsTrevorsPlane.ModelName = CUBAN800
|
|
vsTrevorsPlane.vPosition = <<-4568.2949, 4981.7153, 136.7620>> //<< 3382.9780, 8102.7705, 21.5856 >>
|
|
vsTrevorsPlane.fHeading = 259.5159 //143.8278
|
|
vsTrevorsPlane.iRecordingNumber = 008 //006
|
|
|
|
vsTrevorsCar.ModelName = GET_PLAYER_VEH_MODEL(CHAR_TREVOR)
|
|
vsTrevorsCar.vPosition = << 1747.3265, 3294.0227, 40.1071 >>
|
|
vsTrevorsCar.fHeading = 84.1211
|
|
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_END
|
|
|
|
psTrevor.vPosition = <<1725.0645, 3304.4546, 40.2237>>
|
|
psTrevor.fHeading = 345.1909
|
|
|
|
vsTrevorsPlane.ModelName = CUBAN800
|
|
vsTrevorsPlane.vPosition = <<1732.3759, 3306.6619, 40.2237>>
|
|
vsTrevorsPlane.fHeading = 14.8253
|
|
|
|
vsTrevorsCar.ModelName = GET_PLAYER_VEH_MODEL(CHAR_TREVOR)
|
|
vsTrevorsCar.vPosition = << 1747.3265, 3294.0227, 40.1071 >>
|
|
vsTrevorsCar.fHeading = 84.1211
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Finished initialising arrays for ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eStage), ".")
|
|
#ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC BUILD_REQUEST_BANK_FOR_MISSION_STAGE(MISSION_STAGES eStage)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Building request bank for ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eStage), ".")
|
|
#ENDIF
|
|
|
|
SWITCH eStage
|
|
|
|
CASE MISSION_STAGE_CUTSCENE_INTRO
|
|
//don't request anything here
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_GET_TO_AIRPORT
|
|
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
|
|
CASE CHAR_MICHAEL
|
|
//
|
|
BREAK
|
|
CASE CHAR_TREVOR
|
|
IF NOT DOES_ENTITY_EXIST(vsTrevorsPlane.VehicleIndex)
|
|
ADD_MODEL_REQUEST_TO_ARRAY(vsTrevorsPlane.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_FLY_TO_NORTH_YANKTON
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
|
|
IF NOT DOES_ENTITY_EXIST(psTrevor.PedIndex)
|
|
ADD_MODEL_REQUEST_TO_ARRAY(psTrevor.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
|
|
ENDIF
|
|
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
|
|
IF NOT DOES_ENTITY_EXIST(psMichael.PedIndex)
|
|
ADD_MODEL_REQUEST_TO_ARRAY(psTrevor.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
|
|
ENDIF
|
|
ENDIF
|
|
IF NOT DOES_ENTITY_EXIST(vsTrevorsPlane.VehicleIndex)
|
|
ADD_MODEL_REQUEST_TO_ARRAY(vsTrevorsPlane.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_CUTSCENE_AIRPORT
|
|
//
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_GET_TO_GRAVEYARD
|
|
REQUEST_PTFX_ASSET()
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
|
|
IF NOT DOES_ENTITY_EXIST(psMichael.PedIndex)
|
|
ADD_MODEL_REQUEST_TO_ARRAY(psMichael.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
|
|
ENDIF
|
|
ENDIF
|
|
IF NOT DOES_ENTITY_EXIST(vsMichaelsCar.VehicleIndex)
|
|
ADD_MODEL_REQUEST_TO_ARRAY(vsMichaelsCar.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
|
|
ENDIF
|
|
IF NOT DOES_ENTITY_EXIST(vsTrevorsCar.VehicleIndex)
|
|
ADD_MODEL_REQUEST_TO_ARRAY(vsTrevorsCar.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
|
|
ENDIF
|
|
ADD_CARREC_REQUEST_TO_ARRAY(004, sVehicleRecordingsFile, MissionRecordings, MAX_CAR_RECORDINGS, iRecordingsRequested)
|
|
ADD_CARREC_REQUEST_TO_ARRAY(005, sVehicleRecordingsFile, MissionRecordings, MAX_CAR_RECORDINGS, iRecordingsRequested)
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_GET_TO_GRAVE
|
|
REQUEST_PTFX_ASSET()
|
|
IF NOT DOES_ENTITY_EXIST(vsMichaelsCar.VehicleIndex)
|
|
ADD_MODEL_REQUEST_TO_ARRAY(vsMichaelsCar.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
|
|
ENDIF
|
|
IF NOT DOES_ENTITY_EXIST(vsTrevorsCar.VehicleIndex)
|
|
ADD_MODEL_REQUEST_TO_ARRAY(vsTrevorsCar.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_CUTSCENE_GRAVEYARD
|
|
IF NOT DOES_ENTITY_EXIST(vsMichaelsCar.VehicleIndex)
|
|
ADD_MODEL_REQUEST_TO_ARRAY(vsMichaelsCar.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_GRAVEYARD_SHOOTOUT
|
|
REQUEST_PTFX_ASSET()
|
|
IF NOT DOES_ENTITY_EXIST(vsMichaelsCar.VehicleIndex)
|
|
ADD_MODEL_REQUEST_TO_ARRAY(vsMichaelsCar.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
|
|
ENDIF
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
|
|
IF NOT DOES_ENTITY_EXIST(psMichael.PedIndex)
|
|
ADD_MODEL_REQUEST_TO_ARRAY(psMichael.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
|
|
ENDIF
|
|
ENDIF
|
|
ADD_MODEL_REQUEST_TO_ARRAY(mnEnemy, MissionModels, MAX_MODELS, iModelsRequested)
|
|
ADD_MODEL_REQUEST_TO_ARRAY(mnEnemyVan, MissionModels, MAX_MODELS, iModelsRequested)
|
|
ADD_CARREC_REQUEST_TO_ARRAY(vsEnemyVans[0].iRecordingNumber, sVehicleRecordingsFile, MissionRecordings, MAX_CAR_RECORDINGS, iRecordingsRequested)
|
|
ADD_CARREC_REQUEST_TO_ARRAY(vsEnemyVans[1].iRecordingNumber, sVehicleRecordingsFile, MissionRecordings, MAX_CAR_RECORDINGS, iRecordingsRequested)
|
|
ADD_CARREC_REQUEST_TO_ARRAY(vsEnemyVans[4].iRecordingNumber, sVehicleRecordingsFile, MissionRecordings, MAX_CAR_RECORDINGS, iRecordingsRequested)
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_CUTSCENE_KIDNAPPED
|
|
REQUEST_PTFX_ASSET()
|
|
IF NOT DOES_ENTITY_EXIST(psMichael.PedIndex)
|
|
ADD_MODEL_REQUEST_TO_ARRAY(psMichael.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
|
|
ENDIF
|
|
IF NOT DOES_ENTITY_EXIST(vsMichaelsCar.VehicleIndex)
|
|
ADD_MODEL_REQUEST_TO_ARRAY(vsMichaelsCar.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_FLY_HOME
|
|
IF NOT DOES_ENTITY_EXIST(psTrevor.PedIndex)
|
|
ADD_MODEL_REQUEST_TO_ARRAY(psTrevor.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
|
|
ENDIF
|
|
IF NOT DOES_ENTITY_EXIST(vsTrevorsPlane.VehicleIndex)
|
|
ADD_MODEL_REQUEST_TO_ARRAY(vsTrevorsPlane.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
|
|
ENDIF
|
|
ADD_CARREC_REQUEST_TO_ARRAY(vsTrevorsPlane.iRecordingNumber, sVehicleRecordingsFile, MissionRecordings, MAX_CAR_RECORDINGS, iRecordingsRequested)
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_END
|
|
IF NOT DOES_ENTITY_EXIST(psTrevor.PedIndex)
|
|
ADD_MODEL_REQUEST_TO_ARRAY(psTrevor.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
|
|
ENDIF
|
|
IF NOT DOES_ENTITY_EXIST(vsTrevorsPlane.VehicleIndex)
|
|
ADD_MODEL_REQUEST_TO_ARRAY(vsTrevorsPlane.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
|
|
ENDIF
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Finished building request bank for ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eStage), ".")
|
|
#ENDIF
|
|
|
|
ENDPROC
|
|
|
|
FUNC BOOL IS_VEHICLE_STUCK_IN_SNOW_TIMER_UP(VEHICLE_INDEX VehicleIndex, INT &iStuckTimer, INT iStuckTime)
|
|
|
|
IF DOES_ENTITY_EXIST(VehicleIndex)
|
|
IF NOT IS_ENTITY_DEAD(VehicleIndex)
|
|
|
|
MATERIAL_NAMES eLastMaterialName = GET_LAST_MATERIAL_HIT_BY_ENTITY(VehicleIndex)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
SWITCH eLastMaterialName
|
|
CASE GENERAL_SNOW_LOOSE
|
|
DRAW_DEBUG_TEXT_ABOVE_ENTITY(VehicleIndex, "GENERAL_SNOW_LOOSE", 1.0)
|
|
BREAK
|
|
CASE GENERAL_SNOW_COMPACT
|
|
DRAW_DEBUG_TEXT_ABOVE_ENTITY(VehicleIndex, "GENERAL_SNOW_COMPACT", 1.0)
|
|
BREAK
|
|
CASE GENERAL_SNOW_DEEP
|
|
DRAW_DEBUG_TEXT_ABOVE_ENTITY(VehicleIndex, "GENERAL_SNOW_DEEP", 1.0)
|
|
BREAK
|
|
CASE GENERAL_SNOW_TARMAC
|
|
DRAW_DEBUG_TEXT_ABOVE_ENTITY(VehicleIndex, "GENERAL_SNOW_TARMAC", 1.0)
|
|
BREAK
|
|
ENDSWITCH
|
|
#ENDIF
|
|
|
|
SWITCH eLastMaterialName
|
|
CASE GENERAL_SNOW_LOOSE
|
|
CASE GENERAL_SNOW_COMPACT
|
|
CASE GENERAL_SNOW_DEEP
|
|
CASE GENERAL_SNOW_TARMAC
|
|
|
|
IF ( NOT IS_VEHICLE_STOPPED(VehicleIndex) AND GET_ENTITY_SPEED(VehicleIndex) < 2.0 )
|
|
OR ( IS_VEHICLE_STOPPED(VehicleIndex) AND ( ROUND(GET_CONTROL_NORMAL(PLAYER_CONTROL, INPUT_VEH_ACCELERATE) * 255.0) >=250 OR ROUND(GET_CONTROL_NORMAL(PLAYER_CONTROL, INPUT_VEH_BRAKE) * 255.0) >=250 ))
|
|
IF ( iStuckTimer = 0 )
|
|
iStuckTimer = GET_GAME_TIMER()
|
|
ELSE
|
|
IF HAS_TIME_PASSED(iStuckTime, iStuckTimer)
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
iStuckTimer = 0
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
DRAW_DEBUG_TEXT_ABOVE_ENTITY(VehicleIndex, GET_STRING_FROM_INT(CLAMP_INT(iStuckTime - ( GET_GAME_TIMER() - iStuckTimer ), 0, iStuckTime)), 1.25)
|
|
#ENDIF
|
|
|
|
BREAK
|
|
|
|
DEFAULT
|
|
iStuckTimer = 0
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
|
|
ENDFUNC
|
|
|
|
FUNC BOOL IS_VEHICLE_PERMANENTLY_STUCK_WITH_TIMERS(VEHICLE_INDEX &veh, INT iRoofTime = ROOF_TIME, INT iJammedTime = 30000,
|
|
INT iHungUpTime = 15000, INT iSideTime = 20000)
|
|
IF IS_VEHICLE_DRIVEABLE(veh)
|
|
IF IS_VEHICLE_STUCK_TIMER_UP(veh, VEH_STUCK_ON_ROOF, iRoofTime)
|
|
OR IS_VEHICLE_STUCK_TIMER_UP(veh, VEH_STUCK_JAMMED, iJammedTime)
|
|
OR IS_VEHICLE_STUCK_TIMER_UP(veh, VEH_STUCK_HUNG_UP, iHungUpTime)
|
|
OR IS_VEHICLE_STUCK_TIMER_UP(veh, VEH_STUCK_ON_SIDE, iSideTime)
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Checks for various mission fail conditions. Redirects mission flow to MISSION_STAGE_FAILED when one of fail conditions is true.
|
|
/// PARAMS:
|
|
/// eStage - Mission stage variable.
|
|
/// eFail - Mission fail reason.
|
|
PROC RUN_FAIL_CHECKS(MISSION_STAGES &eStage, MISSION_FAILS &eFail)
|
|
|
|
IF eStage <> MISSION_STAGE_PASSED
|
|
AND eStage <> MISSION_STAGE_FAILED
|
|
|
|
IF NOT IS_CUTSCENE_PLAYING()
|
|
AND NOT IS_SELECTOR_CAM_ACTIVE()
|
|
|
|
IF DOES_ENTITY_EXIST(vsMichaelsCar.VehicleIndex)
|
|
IF ( FailFlags[MISSION_FAIL_MICHAELS_CAR_UNDRIVABLE] = TRUE )
|
|
IF IS_VEHICLE_PERMANENTLY_STUCK(vsMichaelsCar.VehicleIndex)
|
|
eFail = MISSION_FAIL_MICHAELS_CAR_UNDRIVABLE
|
|
eStage = MISSION_STAGE_FAILED
|
|
ENDIF
|
|
IF ( eStage = MISSION_STAGE_GET_TO_GRAVEYARD )
|
|
IF IS_VEHICLE_STUCK_IN_SNOW_TIMER_UP(vsMichaelsCar.VehicleIndex, iSnowStuckTimer, 4000)
|
|
eFail = MISSION_FAIL_MICHAELS_CAR_UNDRIVABLE
|
|
eStage = MISSION_STAGE_FAILED
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF ( FailFlags[MISSION_FAIL_MICHAELS_CAR_DEAD] = TRUE )
|
|
IF NOT IS_VEHICLE_DRIVEABLE(vsMichaelsCar.VehicleIndex, TRUE)
|
|
eFail = MISSION_FAIL_MICHAELS_CAR_DEAD
|
|
eStage = MISSION_STAGE_FAILED
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF ( FailFlags[MISSION_FAIL_MICHAELS_CAR_LEFT_BEHIND] = TRUE )
|
|
IF IS_VEHICLE_DRIVEABLE(vsMichaelsCar.VehicleIndex)
|
|
IF ( eStage = MISSION_STAGE_GRAVEYARD_SHOOTOUT )
|
|
IF NOT IS_ENTITY_IN_ANGLED_AREA_LOCATE(PLAYER_PED_ID(), << 3263.05, -4704.67, 104.67 >>,
|
|
<< 3267.14, -4561.37, 132.76 >>, 64.0 #IF IS_DEBUG_BUILD, "CarParkAreaLocate" #ENDIF)
|
|
IF GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), vsMichaelsCar.VehicleIndex) > ABANDON_CAR_FAIL_RANGE
|
|
eFail = MISSION_FAIL_MICHAELS_CAR_LEFT_BEHIND
|
|
eStage = MISSION_STAGE_FAILED
|
|
ENDIF
|
|
ENDIF
|
|
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<3165.779785,-4700.698242,113.623360>>, << 16.0, 16.0,3.0 >>) //train tracks check
|
|
OR IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<3287.108887,-4719.235840,113.776268>>, << 16.0, 16.0,3.0 >>) //train tracks check
|
|
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<3257.560059,-4712.962891,111.171898>>, <<3273.731201,-4714.457520,116.705261>>, 18.0)
|
|
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<3229.477539,-4768.596680,110.500343>>, <<3308.396484,-4775.955078,124.718132>>, 100.000000)
|
|
eFail = MISSION_FAIL_MICHAELS_CAR_LEFT_BEHIND
|
|
eStage = MISSION_STAGE_FAILED
|
|
ENDIF
|
|
ELSE
|
|
IF DOES_ENTITY_EXIST(GET_PED_INDEX(CHAR_MICHAEL))
|
|
IF GET_DISTANCE_BETWEEN_ENTITIES(GET_PED_INDEX(CHAR_MICHAEL), vsMichaelsCar.VehicleIndex) > ABANDON_CAR_FAIL_RANGE
|
|
eFail = MISSION_FAIL_MICHAELS_CAR_LEFT_BEHIND
|
|
eStage = MISSION_STAGE_FAILED
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF ( FailFlags[MISSION_FAIL_GRAVEYARD_NOT_REACHED] = TRUE )
|
|
IF ( eStage = MISSION_STAGE_GET_TO_GRAVEYARD )
|
|
IF ( bPlayerDroveOffRoute = TRUE )
|
|
eFail = MISSION_FAIL_GRAVEYARD_NOT_REACHED
|
|
eStage = MISSION_STAGE_FAILED
|
|
ENDIF
|
|
//fix for B*1713614, extra checks if player tries to get further into north yankton town
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<3122.884277,-4705.447754,110.703247>>, <<3107.735596,-4895.832520,130.591019>>, 64.000000)
|
|
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<3165.752686,-4756.501465,110.109207>>, <<3167.850830,-4733.836914,119.107994>>, 32.000000)
|
|
eFail = MISSION_FAIL_GRAVEYARD_NOT_REACHED
|
|
eStage = MISSION_STAGE_FAILED
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF ( FailFlags[MISSION_FAIL_GRAVE_NOT_REACHED] = TRUE )
|
|
IF ( eStage = MISSION_STAGE_GET_TO_GRAVE )
|
|
IF NOT IS_ENTITY_IN_ANGLED_AREA_LOCATE(PLAYER_PED_ID(), << 3263.05, -4704.67, 104.67 >>,
|
|
<< 3267.14, -4561.37, 132.76 >>, 64.0 #IF IS_DEBUG_BUILD, "CarParkAreaLocate" #ENDIF)
|
|
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), vsMichaelsCar.vPosition) > ABANDON_CAR_FAIL_RANGE
|
|
eFail = MISSION_FAIL_GRAVE_NOT_REACHED
|
|
eStage = MISSION_STAGE_FAILED
|
|
ENDIF
|
|
ENDIF
|
|
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), << 3165.78, -4700.70, 113.62 >>, << 16.0, 16.0,3.0 >>) //train tracks check
|
|
OR IS_ENTITY_AT_COORD(PLAYER_PED_ID(), << 3287.11, -4719.23, 113.77 >>, << 16.0, 16.0,3.0 >>) //train tracks check
|
|
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), << 3257.56, -4712.96, 111.17 >>, << 3273.73, -4714.45, 116.70 >>, 18.0)
|
|
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<3229.477539,-4768.596680,110.500343>>, <<3308.396484,-4775.955078,124.718132>>, 100.000000)
|
|
eFail = MISSION_FAIL_GRAVE_NOT_REACHED
|
|
eStage = MISSION_STAGE_FAILED
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF ( FailFlags[MISSION_FAIL_GRAVEYARD_ABANDONED] = TRUE )
|
|
IF ( eStage = MISSION_STAGE_GRAVEYARD_SHOOTOUT )
|
|
IF NOT IS_ENTITY_IN_LOCATE(PLAYER_PED_ID(), <<3255.412842,-4628.320801,125.917946>>,
|
|
<< 58.0, 78.0, 16.0 >> #IF IS_DEBUG_BUILD, "GraveyardLocate" #ENDIF)
|
|
eFail = MISSION_FAIL_GRAVEYARD_ABANDONED
|
|
eStage = MISSION_STAGE_FAILED
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(vsTrevorsCar.VehicleIndex)
|
|
IF ( FailFlags[MISSION_FAIL_TREVORS_CAR_UNDRIVABLE] = TRUE )
|
|
IF IS_VEHICLE_PERMANENTLY_STUCK(vsTrevorsCar.VehicleIndex)
|
|
eFail = MISSION_FAIL_TREVORS_CAR_UNDRIVABLE
|
|
eStage = MISSION_STAGE_FAILED
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF ( FailFlags[MISSION_FAIL_TREVORS_CAR_DEAD] = TRUE )
|
|
IF NOT IS_VEHICLE_DRIVEABLE(vsTrevorsCar.VehicleIndex, TRUE)
|
|
eFail = MISSION_FAIL_TREVORS_CAR_DEAD
|
|
eStage = MISSION_STAGE_FAILED
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF ( FailFlags[MISSION_FAIL_TREVORS_CAR_LEFT_BEHIND] = TRUE )
|
|
IF IS_VEHICLE_DRIVEABLE(vsTrevorsCar.VehicleIndex)
|
|
IF GET_DISTANCE_BETWEEN_ENTITIES(GET_PED_INDEX(CHAR_TREVOR), vsTrevorsCar.VehicleIndex) > 100
|
|
eFail = MISSION_FAIL_TREVORS_CAR_LEFT_BEHIND
|
|
eStage = MISSION_STAGE_FAILED
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(vsTrevorsPlane.VehicleIndex)
|
|
IF ( FailFlags[MISSION_FAIL_TREVORS_PLANE_UNDRIVABLE] = TRUE )
|
|
IF IS_VEHICLE_PERMANENTLY_STUCK_WITH_TIMERS(vsTrevorsPlane.VehicleIndex)
|
|
eFail = MISSION_FAIL_TREVORS_PLANE_UNDRIVABLE
|
|
eStage = MISSION_STAGE_FAILED
|
|
ENDIF
|
|
ENDIF
|
|
IF ( FailFlags[MISSION_FAIL_TREVORS_PLANE_DEAD] = TRUE )
|
|
IF NOT IS_VEHICLE_DRIVEABLE(vsTrevorsPlane.VehicleIndex, TRUE)
|
|
eFail = MISSION_FAIL_TREVORS_PLANE_DEAD
|
|
eStage = MISSION_STAGE_FAILED
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(psMichael.PedIndex)
|
|
IF ( FailFlags[MISSION_FAIL_MICHAEL_DEAD] = TRUE )
|
|
IF IS_PED_INJURED(psMichael.PedIndex)
|
|
eFail = MISSION_FAIL_MICHAEL_DEAD
|
|
eStage = MISSION_STAGE_FAILED
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(psTrevor.PedIndex)
|
|
IF ( FailFlags[MISSION_FAIL_TREVOR_DEAD] = TRUE )
|
|
IF IS_PED_INJURED(psTrevor.PedIndex)
|
|
eFail = MISSION_FAIL_TREVOR_DEAD
|
|
eStage = MISSION_STAGE_FAILED
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Sets mission as failed and provides mission flow with reason to print on screen.
|
|
/// PARAMS:
|
|
/// eFailReason - One of MISSION_FAILS values.
|
|
PROC SET_MISSION_FAILED_WITH_REASON(MISSION_FAILS eFailReason, BOOL bPlayerInPrologue)
|
|
|
|
SWITCH eFailReason
|
|
CASE MISSION_FAIL_MICHAELS_CAR_UNDRIVABLE //Michael's car is undriveable
|
|
IF ( bPlayerInPrologue = FALSE )
|
|
MISSION_FLOW_MISSION_FAILED_WITH_REASON("MCH1_MCUND")
|
|
ELSE
|
|
MISSION_FLOW_MISSION_FAILED_WITH_REASON("MCH1_CUND")
|
|
ENDIF
|
|
BREAK
|
|
CASE MISSION_FAIL_MICHAELS_CAR_DEAD //Michael's car is destroyed
|
|
IF ( bPlayerInPrologue = FALSE )
|
|
MISSION_FLOW_MISSION_FAILED_WITH_REASON("CMN_MDEST")
|
|
ELSE
|
|
MISSION_FLOW_MISSION_FAILED_WITH_REASON("CMN_GENDEST")
|
|
ENDIF
|
|
BREAK
|
|
CASE MISSION_FAIL_MICHAELS_CAR_LEFT_BEHIND //Michael's car is left behind
|
|
IF ( bPlayerInPrologue = FALSE )
|
|
MISSION_FLOW_MISSION_FAILED_WITH_REASON("MCH1_MCLEFT")
|
|
ELSE
|
|
MISSION_FLOW_MISSION_FAILED_WITH_REASON("MCH1_CLEFT")
|
|
ENDIF
|
|
BREAK
|
|
CASE MISSION_FAIL_GRAVEYARD_ABANDONED //Cemetery is abandoned
|
|
MISSION_FLOW_MISSION_FAILED_WITH_REASON("MCH1_CLEFT")
|
|
BREAK
|
|
CASE MISSION_FAIL_GRAVEYARD_NOT_REACHED //Cemetery is not reached
|
|
MISSION_FLOW_MISSION_FAILED_WITH_REASON("MCH1_FTRC")
|
|
BREAK
|
|
CASE MISSION_FAIL_GRAVE_NOT_REACHED //Grave is not reached
|
|
MISSION_FLOW_MISSION_FAILED_WITH_REASON("MCH1_FTRG")
|
|
BREAK
|
|
CASE MISSION_FAIL_TREVORS_CAR_UNDRIVABLE //Trevor's car is undriveable
|
|
MISSION_FLOW_MISSION_FAILED_WITH_REASON("MCH1_TCUND")
|
|
BREAK
|
|
CASE MISSION_FAIL_TREVORS_CAR_DEAD //Trevor's car is destroyed
|
|
MISSION_FLOW_MISSION_FAILED_WITH_REASON("CMN_TDEST")
|
|
BREAK
|
|
CASE MISSION_FAIL_TREVORS_CAR_LEFT_BEHIND //Trevor's car left behind
|
|
MISSION_FLOW_MISSION_FAILED_WITH_REASON("MCH1_TCLEFT")
|
|
BREAK
|
|
CASE MISSION_FAIL_TREVORS_PLANE_UNDRIVABLE //Trevor's plane is undriveable
|
|
MISSION_FLOW_MISSION_FAILED_WITH_REASON("MCH1_PUND")
|
|
BREAK
|
|
CASE MISSION_FAIL_TREVORS_PLANE_DEAD //Trevor's plane is destroyed
|
|
MISSION_FLOW_MISSION_FAILED_WITH_REASON("MCH1_PDEAD")
|
|
BREAK
|
|
CASE MISSION_FAIL_MICHAEL_DEAD //Michael is dead
|
|
MISSION_FLOW_MISSION_FAILED_WITH_REASON("CMN_MDIED")
|
|
BREAK
|
|
CASE MISSION_FAIL_TREVOR_DEAD //Trevor is dead
|
|
MISSION_FLOW_MISSION_FAILED_WITH_REASON("CMN_TDIED")
|
|
BREAK
|
|
CASE MISSION_FAIL_FORCE_FAIL //Debug forced fail
|
|
MISSION_FLOW_MISSION_FAILED_WITH_REASON("MCH1_FAIL")
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Mission failed with reason ", GET_MISSION_FAIL_NAME_FOR_DEBUG(eFailReason), ".")
|
|
#ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC SET_MISSION_PED_PROPERTIES(PED_INDEX PedIndex, REL_GROUP_HASH relGroupHash, BOOL bCanFlyThroughWindscreen, BOOL bKeepRelGroupOnCleanup,
|
|
BOOL bCanBeTargetted, BOOL bIsEnemy)
|
|
|
|
IF DOES_ENTITY_EXIST(PedIndex)
|
|
IF NOT IS_PED_INJURED(PedIndex)
|
|
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(PedIndex, TRUE)
|
|
SET_PED_CONFIG_FLAG(PedIndex, PCF_WillFlyThroughWindscreen, bCanFlyThroughWindscreen)
|
|
SET_PED_CONFIG_FLAG(PedIndex, PCF_KeepRelationshipGroupAfterCleanUp, bKeepRelGroupOnCleanup)
|
|
SET_PED_CAN_BE_TARGETTED(PedIndex, bCanBeTargetted)
|
|
SET_PED_AS_ENEMY(PedIndex, bIsEnemy)
|
|
|
|
IF relGroupHash != RELGROUPHASH_NO_RELATIONSHIP
|
|
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(PedIndex, relGroupHash)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Creates a ped or player ped to be used by player and returns TRUE if such pad was created successfully.
|
|
/// PARAMS:
|
|
/// psPed - PED_STRUCT containg ped details, like PED_INDEX, blip, coordinates, heading, model etc.
|
|
/// bPlayerPed - Boolean indicating if a player ped or NPC ped should be created.
|
|
/// relGroupHash - Relationship group hash for the created ped.
|
|
/// bCreateBlip - Boolean indicating if a blip for this ped should be created.
|
|
/// eCharacter - Enum specifying character from story characters list. Use NO_CHARACTER for characters not stored in that list and provide a MODEL_NAMES in PED_STRUCT.
|
|
/// bCanFlyThroughWindscreen - Sets if ped can fly through windscreen when car crashes.
|
|
/// bCanBeTargetted - Sets if ped can be targetted by player.
|
|
/// bIsEnemy - Sets if ped is considered an enemy.
|
|
/// VehicleIndex - Specify a vehicle index if ped should be created inside a vehicle. IF not use NULL.
|
|
/// eVehicleSeat - Vehicle seat enum for peds created in vehicles.
|
|
/// RETURNS:
|
|
/// TRUE if ped was created successfully, FALSE if otherwise.
|
|
FUNC BOOL HAS_MISSION_PED_BEEN_CREATED(PED_STRUCT &psPed, BOOL bPlayerPed, REL_GROUP_HASH relGroupHash, BOOL bCreateBlip, enumCharacterList eCharacter,
|
|
BOOL bCanFlyThroughWindscreen = FALSE, BOOL bCanBeTargetted = FALSE, BOOL bIsEnemy = FALSE, VEHICLE_INDEX VehicleIndex = NULL,
|
|
VEHICLE_SEAT eVehicleSeat = VS_DRIVER, BOOL bKeepRelGroupOnCleanup = TRUE #IF IS_DEBUG_BUILD, STRING sDebugName = NULL #ENDIF)
|
|
|
|
IF ( bPlayerPed = FALSE ) //create non player ped
|
|
|
|
IF NOT DOES_ENTITY_EXIST(psPed.PedIndex)
|
|
|
|
REQUEST_MODEL(psPed.ModelName)
|
|
|
|
IF HAS_MODEL_LOADED(psPed.ModelName)
|
|
|
|
IF ( VehicleIndex = NULL ) //create ped outside of vehicle
|
|
|
|
IF ( eCharacter = NO_CHARACTER ) //use MODEL_NAMES stored in the PED_STRUCT if no character was specified
|
|
|
|
psPed.PedIndex = CREATE_PED(PEDTYPE_MISSION, psPed.ModelName, psPed.vPosition, psPed.fHeading)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(psPed.ModelName)
|
|
|
|
ELSE //use character name to define the ped MODEL_NAMES
|
|
|
|
IF CREATE_NPC_PED_ON_FOOT(psPed.PedIndex, eCharacter, psPed.vPosition, psPed.fHeading)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(psPed.ModelName)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(psPed.PedIndex)
|
|
|
|
SET_MISSION_PED_PROPERTIES(psPed.PedIndex, relGroupHash, bCanFlyThroughWindscreen, bKeepRelGroupOnCleanup,
|
|
bCanBeTargetted, bIsEnemy)
|
|
|
|
IF ( bCreateBlip = TRUE )
|
|
psPed.BlipIndex = CREATE_BLIP_FOR_ENTITY(psPed.PedIndex, FALSE)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
IF NOT Is_String_Null_Or_Empty(sDebugName)
|
|
SET_PED_NAME_DEBUG(psPed.PedIndex, sDebugName)
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created mission ped ", sDebugName, " with model ", GET_MODEL_NAME_FOR_DEBUG(psPed.ModelName), " at coordinates ", psPed.vPosition, ".")
|
|
ELSE
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created mission ped with model ", GET_MODEL_NAME_FOR_DEBUG(psPed.ModelName), " at coordinates ", psPed.vPosition, ".")
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
ELIF ( VehicleIndex != NULL ) //create ped in a vehicle
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(VehicleIndex)
|
|
|
|
IF ( eCharacter = NO_CHARACTER ) //use MODEL_NAMES stored in the PED_STRUCT
|
|
|
|
psPed.PedIndex = CREATE_PED_INSIDE_VEHICLE(VehicleIndex, PEDTYPE_MISSION, psPed.ModelName, eVehicleSeat)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(psPed.ModelName)
|
|
|
|
ELSE //use character name to define the ped MODEL_NAMES
|
|
|
|
IF CREATE_NPC_PED_INSIDE_VEHICLE(psPed.PedIndex, eCharacter, VehicleIndex, eVehicleSeat)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(psPed.ModelName)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(psPed.PedIndex)
|
|
|
|
SET_MISSION_PED_PROPERTIES(psPed.PedIndex, relGroupHash, bCanFlyThroughWindscreen, bKeepRelGroupOnCleanup,
|
|
bCanBeTargetted, bIsEnemy)
|
|
|
|
IF ( bCreateBlip = TRUE )
|
|
psPed.BlipIndex = CREATE_BLIP_FOR_ENTITY(psPed.PedIndex, FALSE)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
IF NOT Is_String_Null_Or_Empty(sDebugName)
|
|
SET_PED_NAME_DEBUG(psPed.PedIndex, sDebugName)
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created mission ped ", sDebugName, " with model ", GET_MODEL_NAME_FOR_DEBUG(psPed.ModelName), " in vehicle.")
|
|
ELSE
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created mission ped with model ", GET_MODEL_NAME_FOR_DEBUG(psPed.ModelName), " in vehicle.")
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
//if the ped already exists return true
|
|
RETURN TRUE
|
|
|
|
ENDIF
|
|
|
|
|
|
ELIF ( bPlayerPed = TRUE ) //create player ped, for example a ped that player can hotswap to and take control of
|
|
|
|
IF NOT DOES_ENTITY_EXIST(psPed.PedIndex)
|
|
|
|
IF ( VehicleIndex = NULL ) //create player ped outside of vehicle
|
|
|
|
IF CREATE_PLAYER_PED_ON_FOOT(psPed.PedIndex, eCharacter, psPed.vPosition, psPed.fHeading, TRUE)
|
|
|
|
SET_MISSION_PED_PROPERTIES(psPed.PedIndex, relGroupHash, bCanFlyThroughWindscreen, bKeepRelGroupOnCleanup,
|
|
bCanBeTargetted, bIsEnemy)
|
|
|
|
IF ( bCreateBlip = TRUE )
|
|
psPed.BlipIndex = CREATE_BLIP_FOR_ENTITY(psPed.PedIndex, FALSE)
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
IF NOT Is_String_Null_Or_Empty(sDebugName)
|
|
SET_PED_NAME_DEBUG(psPed.PedIndex, sDebugName)
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created player ped ", sDebugName, " with model ", GET_MODEL_NAME_FOR_DEBUG(psPed.ModelName), " at coordinates ", psPed.vPosition, ".")
|
|
ELSE
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created player ped with model ", GET_MODEL_NAME_FOR_DEBUG(psPed.ModelName), " at coordinates ", psPed.vPosition, ".")
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
RETURN TRUE
|
|
|
|
ENDIF
|
|
|
|
ELIF ( VehicleIndex != NULL ) //create player ped in a vehicle
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(VehicleIndex)
|
|
|
|
IF CREATE_PLAYER_PED_INSIDE_VEHICLE(psPed.PedIndex, eCharacter, VehicleIndex, eVehicleSeat, TRUE)
|
|
|
|
SET_MISSION_PED_PROPERTIES(psPed.PedIndex, relGroupHash, bCanFlyThroughWindscreen, bKeepRelGroupOnCleanup,
|
|
bCanBeTargetted, bIsEnemy)
|
|
|
|
IF ( bCreateBlip = TRUE )
|
|
psPed.BlipIndex = CREATE_BLIP_FOR_ENTITY(psPed.PedIndex, FALSE)
|
|
ENDIF
|
|
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
IF NOT Is_String_Null_Or_Empty(sDebugName)
|
|
SET_PED_NAME_DEBUG(psPed.PedIndex, sDebugName)
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created player ped ", sDebugName, " in vehicle with model ", GET_MODEL_NAME_FOR_DEBUG(psPed.ModelName), ".")
|
|
ELSE
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created player ped in vehicle with model ", GET_MODEL_NAME_FOR_DEBUG(psPed.ModelName), ".")
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
RETURN TRUE
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
//if the ped already exists, return true
|
|
RETURN TRUE
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Creates vehicle to be used on a mission by player and returns TRUE if such vehicle was created successfully.
|
|
/// PARAMS:
|
|
/// vsVehicle - VEH_STRUCT containing model, position and heading of the vehicle.
|
|
/// bPlayerVehicle - If set to TRUE will create player specific vehicles using CREATE_PLAYER_VEHICLE()
|
|
/// bCarStealVehicle - If set to TRUE will create car steal strand vehicle with a specific command. Works when bPlayerVehicle is FALSE.
|
|
/// eCharacter - Character enum indicating which character specific vehicle to create.
|
|
/// bMissionCritical - Sets the vehicle to be unable to leak oil/petrol and break off doors. Set to TRUE to stop these damage types to vehicle.
|
|
/// iColourCombination - Colour combination of the vehicle.
|
|
/// iColour1 - Colour 1 of the vehicle.
|
|
/// iColour2 - Colour 2 of the vehicle.
|
|
/// RETURNS:
|
|
/// TRUE if vehicle was created, FALSE if otherwise.
|
|
FUNC BOOL HAS_MISSION_VEHICLE_BEEN_CREATED(VEH_STRUCT &vsVehicle, BOOL bPlayerVehicle = FALSE, BOOL bCarStealVehicle = FALSE, enumCharacterList eCharacter = CHAR_MICHAEL,
|
|
BOOL bMissionCritical = TRUE, INT iColourCombination = -1, INT iColour1 = -1, INT iColour2 = -1
|
|
#IF IS_DEBUG_BUILD, STRING sDebugName = NULL #ENDIF)
|
|
|
|
//create any vehicle that can be used on a mission by player
|
|
IF ( bPlayerVehicle = FALSE )
|
|
|
|
IF NOT DOES_ENTITY_EXIST(vsVehicle.VehicleIndex)
|
|
|
|
REQUEST_MODEL(vsVehicle.ModelName)
|
|
|
|
IF HAS_MODEL_LOADED(vsVehicle.ModelName)
|
|
|
|
IF( bCarStealVehicle = TRUE )
|
|
|
|
vsVehicle.VehicleIndex = CREATE_CAR_STEAL_STRAND_CAR(vsVehicle.ModelName, vsVehicle.vPosition, vsVehicle.fHeading)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(vsVehicle.ModelName)
|
|
|
|
ELSE
|
|
|
|
IF ( eCharacter = NO_CHARACTER )
|
|
|
|
vsVehicle.VehicleIndex = CREATE_VEHICLE(vsVehicle.ModelName, vsVehicle.vPosition, vsVehicle.fHeading)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(vsVehicle.ModelName)
|
|
|
|
ELSE //create npc vehicle based on the character enum specified
|
|
|
|
IF CREATE_NPC_VEHICLE(vsVehicle.VehicleIndex, eCharacter, vsVehicle.vPosition, vsVehicle.fHeading)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(vsVehicle.ModelName)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(vsVehicle.VehicleIndex)
|
|
|
|
//set vehicle colours, if they are provided
|
|
IF ( iColour1 != -1)
|
|
AND ( iColour2 != -1 )
|
|
SET_VEHICLE_COLOURS(vsVehicle.VehicleIndex, iColour1, iColour2)
|
|
ENDIF
|
|
|
|
//set vehicle colour combination, if it is provided
|
|
IF ( iColourCombination != -1 )
|
|
SET_VEHICLE_COLOUR_COMBINATION(vsVehicle.VehicleIndex, iColourCombination)
|
|
ENDIF
|
|
|
|
SET_VEHICLE_HAS_STRONG_AXLES(vsVehicle.VehicleIndex, bMissionCritical)
|
|
|
|
//limit damage that can be done to the vehicle
|
|
SET_VEHICLE_CAN_LEAK_OIL(vsVehicle.VehicleIndex, NOT bMissionCritical)
|
|
SET_VEHICLE_CAN_LEAK_PETROL(vsVehicle.VehicleIndex, NOT bMissionCritical)
|
|
|
|
//make the vehicle not attach to tow truck if mission critical
|
|
SET_VEHICLE_AUTOMATICALLY_ATTACHES(vsVehicle.VehicleIndex, NOT bMissionCritical)
|
|
|
|
IF IS_THIS_MODEL_A_CAR(vsVehicle.ModelName)
|
|
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(vsVehicle.VehicleIndex, SC_DOOR_FRONT_LEFT, NOT bMissionCritical)
|
|
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(vsVehicle.VehicleIndex, SC_DOOR_FRONT_RIGHT, NOT bMissionCritical)
|
|
ENDIF
|
|
|
|
IF IS_THIS_MODEL_A_HELI(vsVehicle.ModelName)
|
|
OR IS_THIS_MODEL_A_PLANE(vsVehicle.ModelName)
|
|
SET_VEHICLE_ENGINE_CAN_DEGRADE(vsVehicle.VehicleIndex, NOT bMissionCritical)
|
|
ENDIF
|
|
|
|
SET_VEHICLE_ON_GROUND_PROPERLY(vsVehicle.VehicleIndex)
|
|
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
IF NOT Is_String_Null_Or_Empty(sDebugName)
|
|
SET_VEHICLE_NAME_DEBUG(vsVehicle.VehicleIndex, sDebugName)
|
|
IF ( bCarStealVehicle = TRUE )
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created car steal strand vehicle ", sDebugName, " with model ", GET_MODEL_NAME_FOR_DEBUG(vsVehicle.ModelName), " at coordinates ", vsVehicle.vPosition, ".")
|
|
ELSE
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created vehicle ", sDebugName, " with model ", GET_MODEL_NAME_FOR_DEBUG(vsVehicle.ModelName), " at coordinates ", vsVehicle.vPosition, ".")
|
|
ENDIF
|
|
ELSE
|
|
IF ( bCarStealVehicle = TRUE )
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created car steal strand vehicle with model ", GET_MODEL_NAME_FOR_DEBUG(vsVehicle.ModelName), " at coordinates ", vsVehicle.vPosition, ".")
|
|
ELSE
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created vehicle with model ", GET_MODEL_NAME_FOR_DEBUG(vsVehicle.ModelName), " at coordinates ", vsVehicle.vPosition, ".")
|
|
ENDIF
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
RETURN TRUE
|
|
|
|
ENDIF
|
|
|
|
ELSE //if the vehicle exists, return true
|
|
|
|
RETURN TRUE
|
|
|
|
ENDIF
|
|
|
|
//create player specific vehicle
|
|
ELIF ( bPlayerVehicle = TRUE )
|
|
|
|
IF NOT DOES_ENTITY_EXIST(vsVehicle.VehicleIndex)
|
|
|
|
//delete all previous instances of player ped vehicle in the world
|
|
DELETE_ALL_SCRIPT_CREATED_PLAYER_VEHICLES(eCharacter)
|
|
|
|
//call the player vehicle creation until it returns true
|
|
IF CREATE_PLAYER_VEHICLE(vsVehicle.VehicleIndex, eCharacter, vsVehicle.vPosition, vsVehicle.fHeading, TRUE)
|
|
|
|
SET_VEHICLE_HAS_STRONG_AXLES(vsVehicle.VehicleIndex, bMissionCritical)
|
|
|
|
//limit damage that can be done to the vehicle
|
|
SET_VEHICLE_CAN_LEAK_OIL(vsVehicle.VehicleIndex, NOT bMissionCritical)
|
|
SET_VEHICLE_CAN_LEAK_PETROL(vsVehicle.VehicleIndex, NOT bMissionCritical)
|
|
|
|
//make the vehicle not attach to tow truck if mission critical
|
|
SET_VEHICLE_AUTOMATICALLY_ATTACHES(vsVehicle.VehicleIndex, NOT bMissionCritical)
|
|
|
|
IF IS_THIS_MODEL_A_CAR(vsVehicle.ModelName)
|
|
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(vsVehicle.VehicleIndex, SC_DOOR_FRONT_LEFT, NOT bMissionCritical)
|
|
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(vsVehicle.VehicleIndex, SC_DOOR_FRONT_RIGHT, NOT bMissionCritical)
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
IF NOT Is_String_Null_Or_Empty(sDebugName)
|
|
SET_VEHICLE_NAME_DEBUG(vsVehicle.VehicleIndex, sDebugName)
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created player vehicle ", sDebugName, " with model ", GET_MODEL_NAME_FOR_DEBUG(vsVehicle.ModelName), " at coordinates ", vsVehicle.vPosition, ".")
|
|
ELSE
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created player vehicle with model ", GET_MODEL_NAME_FOR_DEBUG(vsVehicle.ModelName), " at coordinates ", vsVehicle.vPosition, ".")
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
RETURN TRUE
|
|
|
|
ENDIF
|
|
|
|
ELSE //if the vehicle exists, return true
|
|
|
|
RETURN TRUE
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
|
|
ENDFUNC
|
|
|
|
PROC SET_VEHICLE_AS_MISSION_CRITICAL(VEH_STRUCT &vehicle, BOOL bMissionCritical)
|
|
|
|
SET_VEHICLE_HAS_STRONG_AXLES(vehicle.VehicleIndex, bMissionCritical)
|
|
|
|
//limit damage that can be done to the vehicle
|
|
SET_VEHICLE_CAN_LEAK_OIL(vehicle.VehicleIndex, NOT bMissionCritical)
|
|
SET_VEHICLE_CAN_LEAK_PETROL(vehicle.VehicleIndex, NOT bMissionCritical)
|
|
|
|
//make the vehicle not attach to tow truck if mission critical
|
|
SET_VEHICLE_AUTOMATICALLY_ATTACHES(vehicle.VehicleIndex, NOT bMissionCritical)
|
|
|
|
IF IS_THIS_MODEL_A_CAR(vehicle.ModelName)
|
|
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(vehicle.VehicleIndex, SC_DOOR_FRONT_LEFT, NOT bMissionCritical)
|
|
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(vehicle.VehicleIndex, SC_DOOR_FRONT_RIGHT, NOT bMissionCritical)
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Creates an object and returns TRUE if such object was created successfully.
|
|
/// PARAMS:
|
|
/// osObject - OBJECT_STRUCT containing model, position and rotation of the object.
|
|
/// bFreezeObject - Specify if this object's position should be frozen.
|
|
/// RETURNS:
|
|
/// TRUE if object was created, FALSE if otherwise.
|
|
FUNC BOOL HAS_MISSION_OBJECT_BEEN_CREATED(OBJECT_STRUCT &osObject, BOOL bFreezeObject = FALSE)
|
|
|
|
IF NOT DOES_ENTITY_EXIST(osObject.ObjectIndex)
|
|
|
|
REQUEST_MODEL(osObject.ModelName)
|
|
|
|
IF HAS_MODEL_LOADED(osObject.ModelName)
|
|
|
|
osObject.ObjectIndex = CREATE_OBJECT(osObject.ModelName, osObject.vPosition)
|
|
SET_ENTITY_COORDS_NO_OFFSET(osObject.ObjectIndex, osObject.vPosition)
|
|
SET_ENTITY_ROTATION(osObject.ObjectIndex, osObject.vRotation)
|
|
FREEZE_ENTITY_POSITION(osObject.ObjectIndex, bFreezeObject)
|
|
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(osObject.ModelName)
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(osObject.ObjectIndex)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created object with model ", GET_MODEL_NAME_FOR_DEBUG(osObject.ModelName), " at coordinates ", osObject.vPosition, ".")
|
|
#ENDIF
|
|
|
|
RETURN TRUE
|
|
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
|
|
ENDFUNC
|
|
|
|
FUNC BOOL HAS_MISSION_TRAIN_BEEN_CREATED(TRAIN_STRUCT &sTrain, FLOAT fSpeed, BOOL bDirectionFlag = FALSE)
|
|
|
|
IF NOT DOES_ENTITY_EXIST(sTrain.VehicleIndex)
|
|
|
|
REQUEST_MODEL(sTrain.ModelName1)
|
|
REQUEST_MODEL(sTrain.ModelName2)
|
|
REQUEST_MODEL(sTrain.ModelName3)
|
|
REQUEST_MODEL(sTrain.ModelName4)
|
|
|
|
IF HAS_MODEL_LOADED(sTrain.ModelName1)
|
|
AND HAS_MODEL_LOADED(sTrain.ModelName2)
|
|
AND HAS_MODEL_LOADED(sTrain.ModelName3)
|
|
AND HAS_MODEL_LOADED(sTrain.ModelName4)
|
|
|
|
sTrain.VehicleIndex = CREATE_MISSION_TRAIN(sTrain.iConfiguration, sTrain.vPosition, bDirectionFlag)
|
|
sTrain.PedIndex = CREATE_PED_INSIDE_VEHICLE(sTrain.VehicleIndex, PEDTYPE_MISSION, sTrain.ModelName4)
|
|
|
|
SET_TRAIN_SPEED(sTrain.VehicleIndex, fSpeed)
|
|
SET_TRAIN_CRUISE_SPEED(sTrain.VehicleIndex, fSpeed)
|
|
|
|
SET_CAN_AUTO_VAULT_ON_ENTITY(sTrain.VehicleIndex, FALSE)
|
|
SET_CAN_CLIMB_ON_ENTITY(sTrain.VehicleIndex, FALSE)
|
|
|
|
SET_PED_CONFIG_FLAG(sTrain.PedIndex, PCF_GetOutBurningVehicle, TRUE)
|
|
SET_PED_CONFIG_FLAG(sTrain.PedIndex, PCF_GetOutUndriveableVehicle, TRUE)
|
|
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sTrain.PedIndex, TRUE)
|
|
|
|
INT i
|
|
|
|
FOR i = 0 TO 12
|
|
|
|
VEHICLE_INDEX CarriageVehicleIndex
|
|
|
|
CarriageVehicleIndex = GET_TRAIN_CARRIAGE(sTrain.VehicleIndex, i)
|
|
|
|
IF DOES_ENTITY_EXIST(CarriageVehicleIndex)
|
|
IF NOT IS_ENTITY_DEAD(CarriageVehicleIndex)
|
|
SET_CAN_AUTO_VAULT_ON_ENTITY(CarriageVehicleIndex, FALSE)
|
|
SET_CAN_CLIMB_ON_ENTITY(CarriageVehicleIndex, FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDFOR
|
|
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(sTrain.ModelName1)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(sTrain.ModelName2)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(sTrain.ModelName3)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(sTrain.ModelName4)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created mission train with configuration ", sTrain.iConfiguration, " at coordinates ", sTrain.vPosition, ".")
|
|
#ENDIF
|
|
|
|
RETURN TRUE
|
|
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(sTrain.VehicleIndex)
|
|
|
|
RETURN TRUE
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
|
|
ENDFUNC
|
|
|
|
PROC SET_PED_PROPERTIES_AFTER_HOTSWAP(PED_STRUCT &psPed, PED_INDEX ped, BOOL bCreateBlip, REL_GROUP_HASH relGroupHash)
|
|
|
|
IF NOT IS_PED_INJURED(ped)
|
|
|
|
psPed.PedIndex = ped
|
|
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(psPed.PedIndex, TRUE)
|
|
SET_PED_CAN_BE_TARGETTED(psPed.PedIndex, FALSE)
|
|
SET_PED_AS_ENEMY(psPed.PedIndex, FALSE)
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(psPed.PedIndex, relGroupHash)
|
|
|
|
|
|
IF ( bCreateBlip = TRUE )
|
|
|
|
IF NOT DOES_BLIP_EXIST(psPed.BlipIndex)
|
|
|
|
psPed.BlipIndex = CREATE_BLIP_FOR_ENTITY(psPed.PedIndex, FALSE)
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
//set the ped timer to current game timer when the hotswap happens
|
|
psPed.iTimer = GET_GAME_TIMER()
|
|
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Use for blocking first person camera for a limited time, see B*2031566
|
|
PROC UPDATE_FIRST_PERSON_VEHICLE_CAMERA_BLOCKING()
|
|
|
|
IF ( bBlockVehicleFirstPersonCamera = TRUE )
|
|
|
|
//block first person vehicle camera
|
|
DISABLE_CINEMATIC_BONNET_CAMERA_THIS_UPDATE()
|
|
DISABLE_CONTROL_ACTION(CAMERA_CONTROL, INPUT_NEXT_CAMERA)
|
|
DISABLE_CONTROL_ACTION(CAMERA_CONTROL, INPUT_LOOK_BEHIND)
|
|
DISABLE_CONTROL_ACTION(CAMERA_CONTROL, INPUT_VEH_LOOK_BEHIND)
|
|
|
|
//check timer
|
|
IF ( iBlockVehicleFirstPersonCameraTimer != 0 )
|
|
IF HAS_TIME_PASSED(2000, iBlockVehicleFirstPersonCameraTimer)
|
|
bBlockVehicleFirstPersonCamera = FALSE
|
|
ELIF HAS_TIME_PASSED(1700, iBlockVehicleFirstPersonCameraTimer)
|
|
IF ( bFirstPersonFXTriggered = FALSE )
|
|
ANIMPOSTFX_PLAY("CamPushInNeutral", 0, FALSE)
|
|
PLAY_SOUND_FRONTEND(-1, "1st_Person_Transition", "PLAYER_SWITCH_CUSTOM_SOUNDSET")
|
|
bFirstPersonFXTriggered = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
FUNC BOOL IS_MISSION_STAGE_LOADED(MISSION_STAGES eStage, INT &iSetupProgress, BOOL &bStageLoaded, BOOL &bStageSkippedTo, BOOL &bStageReplayed)
|
|
|
|
//handle initial mission setup
|
|
//only run this IF block once, when the mission first loads
|
|
IF ( iSetupProgress = 0 )
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Starting initial mission loading.")
|
|
#ENDIF
|
|
|
|
//clear the screen of any text displayed before mission started
|
|
CLEAR_PRINTS()
|
|
CLEAR_HELP()
|
|
|
|
//loads the mission text
|
|
REQUEST_ADDITIONAL_TEXT("MCH1", MISSION_TEXT_SLOT)
|
|
|
|
REQUEST_ADDITIONAL_TEXT("MCH1AUD", MISSION_DIALOGUE_TEXT_SLOT)
|
|
|
|
WHILE NOT HAS_ADDITIONAL_TEXT_LOADED(MISSION_TEXT_SLOT)
|
|
OR NOT HAS_ADDITIONAL_TEXT_LOADED(MISSION_DIALOGUE_TEXT_SLOT)
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
//suppress Michael's and Trevor's cars for the duration of the mission
|
|
SET_VEHICLE_MODEL_IS_SUPPRESSED(GET_PLAYER_VEH_MODEL(CHAR_MICHAEL), TRUE)
|
|
SET_VEHICLE_MODEL_IS_SUPPRESSED(GET_PLAYER_VEH_MODEL(CHAR_TREVOR), TRUE)
|
|
|
|
SET_PED_MODEL_IS_SUPPRESSED(mnEnemy, TRUE)
|
|
|
|
ADD_RELATIONSHIP_GROUP("ENEMIES", rgEnemies)
|
|
|
|
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE,rgEnemies,RELGROUPHASH_PLAYER)
|
|
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE,RELGROUPHASH_PLAYER,rgEnemies)
|
|
|
|
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE,RELGROUPHASH_PLAYER,RELGROUPHASH_PLAYER)
|
|
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE,rgEnemies,rgEnemies)
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
SET_PED_CONFIG_FLAG(PLAYER_PED_ID(), PCF_WillFlyThroughWindscreen, FALSE)
|
|
ENDIF
|
|
|
|
IF IS_REPLAY_IN_PROGRESS() OR IS_REPEAT_PLAY_ACTIVE()
|
|
DISABLE_VEHICLE_GEN_ON_MISSION(TRUE)
|
|
DELETE_VEHICLE_GEN_VEHICLE(VEHGEN_MICHAEL_SAVEHOUSE)
|
|
ENDIF
|
|
|
|
iTrainBellsSoundID = GET_SOUND_ID()
|
|
iRainOnPlaneSoundID = GET_SOUND_ID()
|
|
iChurchBellsSoundID = GET_SOUND_ID()
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
IF IS_REPLAY_START_VEHICLE_AVAILABLE()
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Player replay start vehicle model is ", GET_MODEL_NAME_FOR_DEBUG(GET_REPLAY_START_VEHICLE_MODEL()), ".")
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
IF IS_REPLAY_CHECKPOINT_VEHICLE_AVAILABLE()
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Player replay checkpoint vehicle model is ", GET_MODEL_NAME_FOR_DEBUG(GET_REPLAY_CHECKPOINT_VEHICLE_MODEL()), ".")
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
IF ( bStageReplayed = FALSE )
|
|
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
|
|
CASE CHAR_MICHAEL
|
|
//
|
|
BREAK
|
|
CASE CHAR_TREVOR
|
|
INFORM_STAT_SYSTEM_OF_BOOL_STAT_HAPPENED(MIC1_STARTING_CHAR)
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
|
|
CREATE_SCENARIO_BLOCKING_AREA(<< 1415.83, 3108.05, 41.00 >>, << 48.0, 16.0, 2.0 >>)
|
|
|
|
ADD_COVER_BLOCKING_AREA(<<3278.639160 - 0.1, -4629.158691 - 0.1, 115.868752 - 1.5>>,
|
|
<<3278.639160 + 0.1, -4629.158691 + 0.1, 115.868752 + 1.5>>, TRUE, TRUE, TRUE)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Finished initial mission loading.")
|
|
#ENDIF
|
|
|
|
iSetupProgress++
|
|
|
|
ENDIF
|
|
|
|
|
|
//run this each time new mission stage needs to be loaded
|
|
IF ( iSetupProgress = 1 )
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Started mission stage loading for ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eStage), ".")
|
|
#ENDIF
|
|
|
|
bStageLoaded = FALSE
|
|
|
|
//initialise arrays for peds, vehicles and objects
|
|
INITIALISE_ARRAYS_FOR_MISSION_STAGE(eStage)
|
|
|
|
//cleanup the asset arrays so that they are ready to be populated with assets needed for the stage being loaded
|
|
CLEANUP_MODEL_ARRAY(MissionModels, iModelsRequested)
|
|
CLEANUP_CARREC_ARRAY(sVehicleRecordingsFile, MissionRecordings, iRecordingsRequested)
|
|
|
|
//clear triggered text labels
|
|
CLEAR_TRIGGERED_LABELS()
|
|
|
|
iSetupProgress++
|
|
|
|
ENDIF
|
|
|
|
//handle player positioning when current stage is being skipped to or played normally
|
|
//fade in the screen if it was faded out due to skipping
|
|
IF ( iSetupProgress = 2 )
|
|
|
|
//stage was skipped to or is being replayed
|
|
IF ( bStageSkippedTo = TRUE OR bStageReplayed = TRUE )
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Warping player ped to new position for mission stage being loaded due to skipping or replay.")
|
|
#ENDIF
|
|
|
|
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
|
|
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
|
|
ENDIF
|
|
|
|
IF ( GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL )
|
|
WARP_PED(PLAYER_PED_ID(), psMichael.vPosition, psMichael.fHeading, FALSE, TRUE, FALSE)
|
|
ELIF ( GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR )
|
|
WARP_PED(PLAYER_PED_ID(), psTrevor.vPosition, psTrevor.fHeading, FALSE, TRUE, FALSE)
|
|
ENDIF
|
|
|
|
IF ( bStageSkippedTo )
|
|
//pin the interior at player start position for stages starting in interiors or requiring interiors
|
|
IF ( eStage = MISSION_STAGE_CUTSCENE_INTRO )
|
|
OR ( eStage = MISSION_STAGE_GET_TO_AIRPORT AND GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL )
|
|
|
|
WHILE NOT IS_INTERIOR_READY(GET_INTERIOR_AT_COORDS(vInteriorPosition))
|
|
|
|
PIN_INTERIOR_IN_MEMORY(GET_INTERIOR_AT_COORDS(vInteriorPosition))
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Pinning interior at coordinates ", vInteriorPosition, " in memory.")
|
|
#ENDIF
|
|
|
|
WAIT(0)
|
|
|
|
ENDWHILE
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
|
|
CLEAR_PED_WETNESS(PLAYER_PED_ID())
|
|
CLEAR_PED_DECORATIONS(PLAYER_PED_ID())
|
|
CLEAR_PED_BLOOD_DAMAGE(PLAYER_PED_ID())
|
|
RESET_PED_VISIBLE_DAMAGE(PLAYER_PED_ID())
|
|
RESTORE_PLAYER_PED_TATTOOS(PLAYER_PED_ID())
|
|
|
|
STOP_PED_SPEAKING(PLAYER_PED_ID(), FALSE)
|
|
SET_PED_STEALTH_MOVEMENT(PLAYER_PED_ID(), FALSE)
|
|
SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), FALSE)
|
|
|
|
CLEAR_AREA(GET_ENTITY_COORDS(PLAYER_PED_ID()), 1000.0, TRUE)
|
|
STOP_FIRE_IN_RANGE(GET_ENTITY_COORDS(PLAYER_PED_ID()), 1000.0)
|
|
REMOVE_DECALS_IN_RANGE(GET_ENTITY_COORDS(PLAYER_PED_ID()), 1000.0)
|
|
REMOVE_PARTICLE_FX_IN_RANGE(GET_ENTITY_COORDS(PLAYER_PED_ID()), 1000.0)
|
|
|
|
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED, TRUE)
|
|
SET_ENTITY_HEALTH(PLAYER_PED_ID(), GET_PED_MAX_HEALTH(PLAYER_PED_ID()))
|
|
ENDIF
|
|
|
|
IF IS_PLAYER_PLAYING(PLAYER_ID())
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
|
|
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
|
|
ENDIF
|
|
|
|
bDirtDecalApplied = FALSE
|
|
bDamageDecalApplied = FALSE
|
|
bWeaponsHelpDisplayed = FALSE
|
|
|
|
bBlockVehicleFirstPersonCamera = FALSE
|
|
iBlockVehicleFirstPersonCameraTimer = 0
|
|
|
|
SWITCH eStage
|
|
CASE MISSION_STAGE_CUTSCENE_INTRO
|
|
CASE MISSION_STAGE_GET_TO_AIRPORT
|
|
CASE MISSION_STAGE_FLY_TO_NORTH_YANKTON
|
|
CASE MISSION_STAGE_CUTSCENE_AIRPORT
|
|
CASE MISSION_STAGE_FLY_HOME
|
|
CASE MISSION_STAGE_END
|
|
REMOVE_ALL_PROLOGUE_IPLS()
|
|
BREAK
|
|
CASE MISSION_STAGE_GET_TO_GRAVEYARD
|
|
CASE MISSION_STAGE_GET_TO_GRAVE
|
|
CASE MISSION_STAGE_CUTSCENE_GRAVEYARD
|
|
CASE MISSION_STAGE_GRAVEYARD_SHOOTOUT
|
|
CASE MISSION_STAGE_CUTSCENE_KIDNAPPED
|
|
REQUEST_PROLOGUE_IPLS()
|
|
REQUEST_PROLOGUE_GRAVE_IPL(FALSE)
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
ENDIF
|
|
|
|
IF ( bStageReplayed = TRUE )
|
|
|
|
IF ( GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL )
|
|
START_REPLAY_SETUP(psMichael.vPosition, psMichael.fHeading)
|
|
ELIF ( GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR )
|
|
START_REPLAY_SETUP(psTrevor.vPosition, psTrevor.fHeading)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
//request assets needed for current stage
|
|
BUILD_REQUEST_BANK_FOR_MISSION_STAGE(eStage)
|
|
|
|
iSetupProgress++
|
|
|
|
ENDIF
|
|
|
|
//handle loading of mission models that have been requested in the previous stage in BUILD_REQUEST_BANK_FOR_MISSION_STAGE()
|
|
IF ( iSetupProgress = 3)
|
|
|
|
IF ARE_REQUESTED_MODELS_LOADED(MissionModels, iModelsRequested)
|
|
IF ARE_REQUESTED_CARRECS_LOADED(sVehicleRecordingsFile, MissionRecordings, iRecordingsRequested)
|
|
iSetupProgress++
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
//handle creating vehicles/peds and setting up fail flags
|
|
//run this each time new mission stage needs to be loaded
|
|
//THIS SETUP SECTION ASSUMES THAT ALL REQUIRED ASSETS HAVE BEEN ALREADY LOADED TO MEMORY IN PREVIOUS SETUP SECTIONS
|
|
IF ( iSetupProgress = 4 )
|
|
|
|
SET_FAIL_FLAGS(FALSE)
|
|
|
|
SWITCH eStage
|
|
|
|
CASE MISSION_STAGE_CUTSCENE_INTRO
|
|
iSetupProgress++
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_GET_TO_AIRPORT
|
|
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL //when playing as Michael
|
|
|
|
IF HAS_MISSION_PED_BEEN_CREATED(psTrevor, TRUE, RELGROUPHASH_PLAYER, FALSE, CHAR_TREVOR, FALSE, FALSE, FALSE, vsMichaelsCar.VehicleIndex)//vsTrevorsCar.VehicleIndex)
|
|
|
|
FailFlags[MISSION_FAIL_TREVOR_DEAD] = TRUE
|
|
FailFlags[MISSION_FAIL_TREVORS_CAR_DEAD] = TRUE
|
|
FailFlags[MISSION_FAIL_TREVORS_CAR_UNDRIVABLE] = TRUE
|
|
|
|
IF ( bStageReplayed = TRUE ) //if this is a mission replay
|
|
AND IS_REPLAY_CHECKPOINT_VEHICLE_AVAILABLE() //and snapshot vehicle data exists
|
|
AND IS_THIS_MODEL_A_CAR(GET_REPLAY_CHECKPOINT_VEHICLE_MODEL())
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Replay checkpoint vehicle is available for stage replay for player ped Michael.")
|
|
#ENDIF
|
|
|
|
IF NOT DOES_ENTITY_EXIST(vsMichaelsCar.VehicleIndex) //create replay start vehicle
|
|
|
|
REQUEST_REPLAY_CHECKPOINT_VEHICLE_MODEL()
|
|
|
|
IF HAS_MODEL_LOADED(GET_REPLAY_CHECKPOINT_VEHICLE_MODEL())
|
|
|
|
vsMichaelsCar.VehicleIndex = CREATE_REPLAY_CHECKPOINT_VEHICLE(vsMichaelsCar.vPosition, vsMichaelsCar.fHeading)
|
|
|
|
SET_VEHICLE_DOORS_SHUT(vsMichaelsCar.VehicleIndex, TRUE)
|
|
SET_VEHICLE_ON_GROUND_PROPERLY(vsMichaelsCar.VehicleIndex)
|
|
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(GET_REPLAY_CHECKPOINT_VEHICLE_MODEL())
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
SET_VEHICLE_NAME_DEBUG(vsMichaelsCar.VehicleIndex, "RC_Michaels_Car")
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Creating replay checkpoint vehicle for player ped Michael with model ", GET_MODEL_NAME_FOR_DEBUG(GET_REPLAY_CHECKPOINT_VEHICLE_MODEL()), ".")
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(vsMichaelsCar.VehicleIndex)
|
|
|
|
FailFlags[MISSION_FAIL_MICHAELS_CAR_DEAD] = FALSE
|
|
FailFlags[MISSION_FAIL_MICHAELS_CAR_UNDRIVABLE] = FALSE
|
|
FailFlags[MISSION_FAIL_MICHAELS_CAR_LEFT_BEHIND] = FALSE
|
|
|
|
iSetupProgress++
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ELSE //create Michael's default car
|
|
|
|
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsMichaelsCar, TRUE, FALSE, CHAR_MICHAEL)
|
|
|
|
FailFlags[MISSION_FAIL_MICHAELS_CAR_DEAD] = FALSE
|
|
FailFlags[MISSION_FAIL_MICHAELS_CAR_UNDRIVABLE] = FALSE
|
|
FailFlags[MISSION_FAIL_MICHAELS_CAR_LEFT_BEHIND] = FALSE
|
|
|
|
iSetupProgress++
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
|
|
|
|
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsTrevorsPlane, FALSE, FALSE, NO_CHARACTER, TRUE, 1)
|
|
|
|
FailFlags[MISSION_FAIL_TREVORS_PLANE_DEAD] = TRUE
|
|
FailFlags[MISSION_FAIL_TREVORS_PLANE_UNDRIVABLE] = TRUE
|
|
|
|
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsMichaelsCar, TRUE, FALSE, CHAR_MICHAEL) //create default Michael's car
|
|
|
|
FailFlags[MISSION_FAIL_MICHAELS_CAR_DEAD] = FALSE
|
|
FailFlags[MISSION_FAIL_MICHAELS_CAR_UNDRIVABLE] = FALSE
|
|
FailFlags[MISSION_FAIL_MICHAELS_CAR_LEFT_BEHIND] = FALSE
|
|
|
|
SET_VEHICLE_AS_RESTRICTED(vsMichaelsCar.VehicleIndex, 0) //set it as restricted so that if Trevor
|
|
//takes it will be deleted on mission cleanup
|
|
//so that only 1 instance of Michael's car exists
|
|
//in the world
|
|
|
|
IF ( bStageReplayed = TRUE ) //if this is a mission replay
|
|
AND IS_REPLAY_START_VEHICLE_AVAILABLE() //and snapshot vehicle data exists
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Replay start vehicle is available for stage replay for player ped Trevor.")
|
|
#ENDIF
|
|
|
|
IF NOT DOES_ENTITY_EXIST(vsTrevorsCar.VehicleIndex) //create replay start vehicle
|
|
|
|
REQUEST_REPLAY_START_VEHICLE_MODEL()
|
|
|
|
IF HAS_MODEL_LOADED(GET_REPLAY_START_VEHICLE_MODEL())
|
|
|
|
vsTrevorsCar.VehicleIndex = CREATE_REPLAY_START_VEHICLE(vsTrevorsCar.vPosition, vsTrevorsCar.fHeading)
|
|
|
|
SET_VEHICLE_DOORS_SHUT(vsTrevorsCar.VehicleIndex, TRUE)
|
|
SET_VEHICLE_ON_GROUND_PROPERLY(vsTrevorsCar.VehicleIndex)
|
|
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(GET_REPLAY_START_VEHICLE_MODEL())
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
SET_VEHICLE_NAME_DEBUG(vsTrevorsCar.VehicleIndex, "RS_Trevors_Car")
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Creating replay start vehicle for player ped Trevor with model ", GET_MODEL_NAME_FOR_DEBUG(GET_REPLAY_START_VEHICLE_MODEL()), ".")
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(vsTrevorsCar.VehicleIndex)
|
|
|
|
FailFlags[MISSION_FAIL_TREVORS_CAR_DEAD] = FALSE
|
|
FailFlags[MISSION_FAIL_TREVORS_CAR_UNDRIVABLE] = FALSE
|
|
FailFlags[MISSION_FAIL_TREVORS_CAR_LEFT_BEHIND] = FALSE
|
|
|
|
iSetupProgress++
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ELSE //create Trevor's default car
|
|
|
|
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsTrevorsCar, TRUE, FALSE, CHAR_TREVOR)
|
|
|
|
FailFlags[MISSION_FAIL_TREVORS_CAR_DEAD] = FALSE
|
|
FailFlags[MISSION_FAIL_TREVORS_CAR_UNDRIVABLE] = FALSE
|
|
FailFlags[MISSION_FAIL_TREVORS_CAR_LEFT_BEHIND] = FALSE
|
|
|
|
iSetupProgress++
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_FLY_TO_NORTH_YANKTON
|
|
|
|
IF HAS_MISSION_OBJECT_BEEN_CREATED(osGolfBall, TRUE)
|
|
|
|
IF DOES_ENTITY_EXIST(osGolfBall.ObjectIndex)
|
|
IF NOT IS_ENTITY_DEAD(osGolfBall.ObjectIndex)
|
|
SET_ENTITY_HEADING(osGolfBall.ObjectIndex, 315.0)
|
|
SET_ENTITY_VISIBLE(osGolfBall.ObjectIndex, FALSE)
|
|
SET_ENTITY_COLLISION(osGolfBall.ObjectIndex, FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsTrevorsPlane, FALSE, FALSE, NO_CHARACTER, TRUE, 1)
|
|
|
|
FailFlags[MISSION_FAIL_TREVORS_PLANE_DEAD] = TRUE
|
|
FailFlags[MISSION_FAIL_TREVORS_PLANE_UNDRIVABLE] = TRUE
|
|
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
|
|
|
|
IF HAS_MISSION_PED_BEEN_CREATED(psTrevor, TRUE, RELGROUPHASH_PLAYER, FALSE, CHAR_TREVOR)
|
|
|
|
sSelectorPeds.pedID[SELECTOR_PED_TREVOR] = psTrevor.PedIndex
|
|
|
|
FailFlags[MISSION_FAIL_TREVOR_DEAD] = TRUE
|
|
|
|
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsTrevorsCar, TRUE, FALSE, CHAR_TREVOR)
|
|
|
|
FailFlags[MISSION_FAIL_TREVORS_CAR_DEAD] = FALSE
|
|
FailFlags[MISSION_FAIL_TREVORS_CAR_UNDRIVABLE] = FALSE
|
|
FailFlags[MISSION_FAIL_TREVORS_CAR_LEFT_BEHIND] = FALSE
|
|
|
|
iSetupProgress++
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
|
|
|
|
IF ( bStageReplayed = TRUE ) //if this is a mission replay
|
|
AND IS_REPLAY_CHECKPOINT_VEHICLE_AVAILABLE() //and snapshot vehicle data exists
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Replay checkpoint vehicle is available for stage replay for player ped Trevor.")
|
|
#ENDIF
|
|
|
|
IF NOT DOES_ENTITY_EXIST(vsTrevorsCar.VehicleIndex) //create replay checkpoint vehicle
|
|
|
|
REQUEST_REPLAY_CHECKPOINT_VEHICLE_MODEL()
|
|
|
|
IF HAS_REPLAY_CHECKPOINT_VEHICLE_LOADED()
|
|
|
|
vsTrevorsCar.VehicleIndex = CREATE_REPLAY_CHECKPOINT_VEHICLE(vsTrevorsCar.vPosition, vsTrevorsCar.fHeading)
|
|
|
|
SET_VEHICLE_DOORS_SHUT(vsTrevorsCar.VehicleIndex, TRUE)
|
|
SET_VEHICLE_ON_GROUND_PROPERLY(vsTrevorsCar.VehicleIndex)
|
|
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(GET_REPLAY_CHECKPOINT_VEHICLE_MODEL())
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
SET_VEHICLE_NAME_DEBUG(vsTrevorsCar.VehicleIndex, "RS_Trevors_Car")
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Creating replay checkpoint vehicle for player ped Trevor with model ", GET_MODEL_NAME_FOR_DEBUG(GET_REPLAY_CHECKPOINT_VEHICLE_MODEL()), ".")
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(vsTrevorsCar.VehicleIndex)
|
|
|
|
FailFlags[MISSION_FAIL_TREVORS_CAR_DEAD] = FALSE
|
|
FailFlags[MISSION_FAIL_TREVORS_CAR_UNDRIVABLE] = FALSE
|
|
FailFlags[MISSION_FAIL_TREVORS_CAR_LEFT_BEHIND] = FALSE
|
|
|
|
iSetupProgress++
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ELSE //create Trevor's default car
|
|
|
|
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsTrevorsCar, TRUE, FALSE, CHAR_TREVOR)
|
|
|
|
FailFlags[MISSION_FAIL_TREVORS_CAR_DEAD] = FALSE
|
|
FailFlags[MISSION_FAIL_TREVORS_CAR_UNDRIVABLE] = FALSE
|
|
FailFlags[MISSION_FAIL_TREVORS_CAR_LEFT_BEHIND] = FALSE
|
|
|
|
iSetupProgress++
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_CUTSCENE_AIRPORT
|
|
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
|
|
|
|
iSetupProgress++
|
|
|
|
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
|
|
|
|
iSetupProgress++
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_GET_TO_GRAVEYARD
|
|
|
|
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsMichaelsCar, FALSE, FALSE, NO_CHARACTER, TRUE, -1, 86, 0)
|
|
|
|
FailFlags[MISSION_FAIL_MICHAELS_CAR_DEAD] = TRUE
|
|
FailFlags[MISSION_FAIL_MICHAELS_CAR_UNDRIVABLE] = TRUE
|
|
FailFlags[MISSION_FAIL_MICHAELS_CAR_LEFT_BEHIND] = TRUE
|
|
FailFlags[MISSION_FAIL_GRAVEYARD_NOT_REACHED] = TRUE
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(vsMichaelsCar.VehicleIndex)
|
|
SET_VEH_RADIO_STATION(vsMichaelsCar.VehicleIndex, "OFF")
|
|
SET_VEHICLE_RADIO_ENABLED(vsMichaelsCar.VehicleIndex, FALSE)
|
|
SET_VEHICLE_NUMBER_PLATE_TEXT(vsMichaelsCar.VehicleIndex, NUMBERPLATES)
|
|
SET_VEHICLE_ACTIVE_DURING_PLAYBACK(vsMichaelsCar.VehicleIndex, TRUE)
|
|
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(vsMichaelsCar.VehicleIndex, TRUE)
|
|
ENDIF
|
|
|
|
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsTrevorsCar, FALSE, FALSE, NO_CHARACTER)
|
|
|
|
FailFlags[MISSION_FAIL_TREVORS_CAR_DEAD] = FALSE //TRUE
|
|
FailFlags[MISSION_FAIL_TREVORS_CAR_UNDRIVABLE] = FALSE //TRUE
|
|
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
|
|
|
|
iSetupProgress++
|
|
|
|
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
|
|
|
|
IF HAS_MISSION_PED_BEEN_CREATED(psMichael, TRUE, RELGROUPHASH_PLAYER, FALSE, CHAR_MICHAEL, FALSE, FALSE, FALSE, vsMichaelsCar.VehicleIndex)
|
|
|
|
sSelectorPeds.pedID[SELECTOR_PED_MICHAEL] = psMichael.PedIndex
|
|
|
|
FailFlags[MISSION_FAIL_MICHAEL_DEAD] = TRUE
|
|
|
|
iSetupProgress++
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_GET_TO_GRAVE
|
|
|
|
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsMichaelsCar, FALSE, FALSE, NO_CHARACTER, TRUE, -1, 86, 0)
|
|
|
|
FailFlags[MISSION_FAIL_MICHAELS_CAR_DEAD] = TRUE
|
|
FailFlags[MISSION_FAIL_MICHAELS_CAR_UNDRIVABLE] = TRUE
|
|
FailFlags[MISSION_FAIL_GRAVE_NOT_REACHED] = TRUE
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(vsMichaelsCar.VehicleIndex)
|
|
SET_VEH_RADIO_STATION(vsMichaelsCar.VehicleIndex, "OFF")
|
|
SET_VEHICLE_RADIO_ENABLED(vsMichaelsCar.VehicleIndex, FALSE)
|
|
SET_VEHICLE_NUMBER_PLATE_TEXT(vsMichaelsCar.VehicleIndex, NUMBERPLATES)
|
|
SET_VEHICLE_ACTIVE_DURING_PLAYBACK(vsMichaelsCar.VehicleIndex, TRUE)
|
|
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(vsMichaelsCar.VehicleIndex, FALSE)
|
|
ENDIF
|
|
|
|
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsTrevorsCar, FALSE, FALSE, NO_CHARACTER)
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(vsTrevorsCar.VehicleIndex)
|
|
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(vsTrevorsCar.VehicleIndex, FALSE)
|
|
ENDIF
|
|
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
|
|
|
|
FailFlags[MISSION_FAIL_TREVOR_DEAD] = TRUE
|
|
FailFlags[MISSION_FAIL_MICHAEL_DEAD] = TRUE
|
|
|
|
iSetupProgress++
|
|
|
|
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
|
|
|
|
IF HAS_MISSION_PED_BEEN_CREATED(psMichael, TRUE, RELGROUPHASH_PLAYER, FALSE, CHAR_MICHAEL, FALSE, FALSE, FALSE)
|
|
|
|
sSelectorPeds.pedID[SELECTOR_PED_MICHAEL] = psMichael.PedIndex
|
|
|
|
FailFlags[MISSION_FAIL_TREVOR_DEAD] = TRUE
|
|
FailFlags[MISSION_FAIL_MICHAEL_DEAD] = TRUE
|
|
|
|
iSetupProgress++
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_CUTSCENE_GRAVEYARD
|
|
|
|
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsMichaelsCar, FALSE, FALSE, NO_CHARACTER, TRUE, -1, 86, 0)
|
|
|
|
FailFlags[MISSION_FAIL_MICHAELS_CAR_DEAD] = TRUE
|
|
FailFlags[MISSION_FAIL_MICHAELS_CAR_UNDRIVABLE] = TRUE
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(vsMichaelsCar.VehicleIndex)
|
|
SET_VEH_RADIO_STATION(vsMichaelsCar.VehicleIndex, "OFF")
|
|
SET_VEHICLE_RADIO_ENABLED(vsMichaelsCar.VehicleIndex, FALSE)
|
|
SET_VEHICLE_NUMBER_PLATE_TEXT(vsMichaelsCar.VehicleIndex, NUMBERPLATES)
|
|
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(vsMichaelsCar.VehicleIndex, TRUE)
|
|
ENDIF
|
|
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
|
|
|
|
FailFlags[MISSION_FAIL_TREVOR_DEAD] = TRUE
|
|
FailFlags[MISSION_FAIL_MICHAEL_DEAD] = TRUE
|
|
|
|
iSetupProgress++
|
|
|
|
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
|
|
|
|
IF HAS_MISSION_PED_BEEN_CREATED(psMichael, TRUE, RELGROUPHASH_PLAYER, FALSE, CHAR_MICHAEL)
|
|
|
|
sSelectorPeds.pedID[SELECTOR_PED_MICHAEL] = psMichael.PedIndex
|
|
|
|
FailFlags[MISSION_FAIL_TREVOR_DEAD] = TRUE
|
|
FailFlags[MISSION_FAIL_MICHAEL_DEAD] = TRUE
|
|
|
|
iSetupProgress++
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_GRAVEYARD_SHOOTOUT
|
|
|
|
IF ( bCoverpointsCreated = FALSE )
|
|
CREATE_COVERPOINTS(csCoverpoints, vShootoutStartPosition)
|
|
INITIALISE_FRAGGABLE_TOMBSTONES(FraggableTombstones)
|
|
bCoverpointsCreated = TRUE
|
|
ENDIF
|
|
|
|
iPlayerMichaelKills = 0
|
|
|
|
IF HAS_MISSION_OBJECT_BEEN_CREATED(osPropCoffin, TRUE)
|
|
AND HAS_MISSION_OBJECT_BEEN_CREATED(osPropShovel, TRUE)
|
|
AND HAS_MISSION_OBJECT_BEEN_CREATED(osPropPickaxe, TRUE)
|
|
AND HAS_MISSION_PED_BEEN_CREATED(psBrad, FALSE, RELGROUPHASH_NO_RELATIONSHIP, FALSE, NO_CHARACTER, FALSE, FALSE, FALSE)
|
|
|
|
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsMichaelsCar, FALSE, FALSE, NO_CHARACTER, TRUE, -1, 86, 0)
|
|
|
|
FailFlags[MISSION_FAIL_MICHAELS_CAR_DEAD] = TRUE
|
|
FailFlags[MISSION_FAIL_MICHAELS_CAR_UNDRIVABLE] = TRUE
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(vsMichaelsCar.VehicleIndex)
|
|
SET_VEH_RADIO_STATION(vsMichaelsCar.VehicleIndex, "OFF")
|
|
SET_VEHICLE_RADIO_ENABLED(vsMichaelsCar.VehicleIndex, FALSE)
|
|
SET_VEHICLE_NUMBER_PLATE_TEXT(vsMichaelsCar.VehicleIndex, NUMBERPLATES)
|
|
SET_VEHICLE_UNDRIVEABLE(vsMichaelsCar.VehicleIndex, TRUE)
|
|
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(vsMichaelsCar.VehicleIndex, TRUE)
|
|
ENDIF
|
|
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
|
|
|
|
iSetupProgress++
|
|
|
|
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
|
|
|
|
IF HAS_MISSION_PED_BEEN_CREATED(psMichael, TRUE, RELGROUPHASH_PLAYER, FALSE, CHAR_MICHAEL)
|
|
|
|
sSelectorPeds.pedID[SELECTOR_PED_MICHAEL] = psMichael.PedIndex
|
|
|
|
FailFlags[MISSION_FAIL_MICHAEL_DEAD] = TRUE
|
|
|
|
iSetupProgress++
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_CUTSCENE_KIDNAPPED
|
|
|
|
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsMichaelsCar, FALSE, FALSE, NO_CHARACTER, TRUE, -1, 86, 0)
|
|
|
|
FailFlags[MISSION_FAIL_MICHAELS_CAR_DEAD] = TRUE
|
|
FailFlags[MISSION_FAIL_MICHAELS_CAR_UNDRIVABLE] = TRUE
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(vsMichaelsCar.VehicleIndex)
|
|
SET_VEH_RADIO_STATION(vsMichaelsCar.VehicleIndex, "OFF")
|
|
SET_VEHICLE_RADIO_ENABLED(vsMichaelsCar.VehicleIndex, FALSE)
|
|
SET_VEHICLE_NUMBER_PLATE_TEXT(vsMichaelsCar.VehicleIndex, NUMBERPLATES)
|
|
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(vsMichaelsCar.VehicleIndex, TRUE)
|
|
ENDIF
|
|
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
|
|
|
|
iSetupProgress++
|
|
|
|
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
|
|
|
|
IF HAS_MISSION_PED_BEEN_CREATED(psMichael, TRUE, RELGROUPHASH_PLAYER, FALSE, CHAR_MICHAEL)
|
|
|
|
sSelectorPeds.pedID[SELECTOR_PED_MICHAEL] = psMichael.PedIndex
|
|
|
|
FailFlags[MISSION_FAIL_MICHAEL_DEAD] = TRUE
|
|
|
|
iSetupProgress++
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_FLY_HOME
|
|
CASE MISSION_STAGE_END
|
|
|
|
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsTrevorsPlane, FALSE, FALSE, NO_CHARACTER, TRUE, 1)
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(vsTrevorsPlane.VehicleIndex)
|
|
SET_VEHICLE_ACTIVE_DURING_PLAYBACK(vsTrevorsPlane.VehicleIndex, TRUE)
|
|
ENDIF
|
|
|
|
FailFlags[MISSION_FAIL_TREVORS_PLANE_DEAD] = TRUE
|
|
FailFlags[MISSION_FAIL_TREVORS_PLANE_UNDRIVABLE] = TRUE
|
|
|
|
SWITCH eStage
|
|
CASE MISSION_STAGE_FLY_HOME
|
|
IF IS_VEHICLE_DRIVEABLE(vsTrevorsPlane.VehicleIndex)
|
|
FREEZE_ENTITY_POSITION(vsTrevorsPlane.VehicleIndex, TRUE)
|
|
ENDIF
|
|
BREAK
|
|
CASE MISSION_STAGE_END
|
|
IF ( bStageSkippedTo = TRUE OR bStageReplayed = TRUE )
|
|
IF IS_VEHICLE_DRIVEABLE(vsTrevorsPlane.VehicleIndex)
|
|
SET_HELI_BLADES_FULL_SPEED(vsTrevorsPlane.VehicleIndex)
|
|
SET_VEHICLE_ENGINE_ON(vsTrevorsPlane.VehicleIndex, TRUE, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
SWITCH GET_PLAYER_CHARACTER_AT_MISSION_START()
|
|
CASE CHAR_MICHAEL
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Mission started as Michael.")
|
|
BREAK
|
|
CASE CHAR_TREVOR
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Mission started as Trevor.")
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
|
|
CASE CHAR_MICHAEL
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Player playing as Michael.")
|
|
BREAK
|
|
CASE CHAR_TREVOR
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Player playing as Trevor.")
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF IS_REPLAY_START_VEHICLE_AVAILABLE()
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Replay start vehicle with model ", GET_MODEL_NAME_FOR_DEBUG(GET_REPLAY_START_VEHICLE_MODEL()), " is available for stage.")
|
|
ENDIF
|
|
IF IS_REPLAY_CHECKPOINT_VEHICLE_AVAILABLE()
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Replay checkpoint vehicle with model ", GET_MODEL_NAME_FOR_DEBUG(GET_REPLAY_CHECKPOINT_VEHICLE_MODEL()), " is available for stage.")
|
|
ENDIF
|
|
IF ( TrevorsVehicleData.eModel <> DUMMY_MODEL_FOR_SCRIPT )
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": TrevorsVehicleData.eModel is model ", GET_MODEL_NAME_FOR_DEBUG(TrevorsVehicleData.eModel), ".")
|
|
ENDIF
|
|
|
|
#ENDIF
|
|
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
|
|
|
|
IF HAS_MISSION_PED_BEEN_CREATED(psTrevor, TRUE, RELGROUPHASH_PLAYER, FALSE, CHAR_TREVOR, FALSE, FALSE, FALSE, vsTrevorsPlane.VehicleIndex)
|
|
|
|
sSelectorPeds.pedID[SELECTOR_PED_TREVOR] = psTrevor.PedIndex
|
|
|
|
FailFlags[MISSION_FAIL_TREVOR_DEAD] = TRUE
|
|
|
|
IF GET_PLAYER_CHARACTER_AT_MISSION_START() = CHAR_TREVOR AND IS_REPLAY_CHECKPOINT_VEHICLE_AVAILABLE()
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Replay checkpoint vehicle with model ", GET_MODEL_NAME_FOR_DEBUG(GET_REPLAY_CHECKPOINT_VEHICLE_MODEL()), " is available for stage.")
|
|
#ENDIF
|
|
|
|
IF NOT DOES_ENTITY_EXIST(vsTrevorsCar.VehicleIndex) //create replay checkpoint saved vehicle
|
|
|
|
REQUEST_REPLAY_CHECKPOINT_VEHICLE_MODEL()
|
|
|
|
IF HAS_REPLAY_CHECKPOINT_VEHICLE_LOADED()
|
|
|
|
CLEAR_AREA(vsTrevorsCar.vPosition, 10.0, TRUE)
|
|
|
|
vsTrevorsCar.VehicleIndex = CREATE_REPLAY_CHECKPOINT_VEHICLE(vsTrevorsCar.vPosition, vsTrevorsCar.fHeading)
|
|
|
|
SET_VEHICLE_DOORS_SHUT(vsTrevorsCar.VehicleIndex, TRUE)
|
|
SET_VEHICLE_ON_GROUND_PROPERLY(vsTrevorsCar.VehicleIndex)
|
|
|
|
IF IS_THIS_MODEL_A_HELI(GET_REPLAY_CHECKPOINT_VEHICLE_MODEL())
|
|
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(vsTrevorsCar.VehicleIndex, TRUE)
|
|
ENDIF
|
|
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(GET_REPLAY_CHECKPOINT_VEHICLE_MODEL())
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
SET_VEHICLE_NAME_DEBUG(vsTrevorsCar.VehicleIndex, "RS_Trevors_Car")
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Creating replay checkpoint vehicle for player ped Trevor with model ", GET_MODEL_NAME_FOR_DEBUG(GET_REPLAY_CHECKPOINT_VEHICLE_MODEL()), ".")
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
iSetupProgress++
|
|
|
|
ENDIF
|
|
|
|
ELIF GET_PLAYER_CHARACTER_AT_MISSION_START() = CHAR_MICHAEL AND IS_REPLAY_CHECKPOINT_VEHICLE_AVAILABLE()
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Replay checkpoint vehicle with model ", GET_MODEL_NAME_FOR_DEBUG(GET_REPLAY_CHECKPOINT_VEHICLE_MODEL()), " is available for stage.")
|
|
#ENDIF
|
|
|
|
IF NOT DOES_ENTITY_EXIST(vsTrevorsCar.VehicleIndex) //create replay checkpoint saved vehicle
|
|
|
|
REQUEST_REPLAY_CHECKPOINT_VEHICLE_MODEL()
|
|
|
|
IF HAS_REPLAY_CHECKPOINT_VEHICLE_LOADED()
|
|
|
|
CLEAR_AREA(vsTrevorsCar.vPosition, 10.0, TRUE)
|
|
|
|
vsTrevorsCar.VehicleIndex = CREATE_REPLAY_CHECKPOINT_VEHICLE(vsTrevorsCar.vPosition, vsTrevorsCar.fHeading)
|
|
|
|
SET_VEHICLE_DOORS_SHUT(vsTrevorsCar.VehicleIndex, TRUE)
|
|
SET_VEHICLE_ON_GROUND_PROPERLY(vsTrevorsCar.VehicleIndex)
|
|
|
|
IF IS_THIS_MODEL_A_HELI(GET_REPLAY_CHECKPOINT_VEHICLE_MODEL())
|
|
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(vsTrevorsCar.VehicleIndex, TRUE)
|
|
ENDIF
|
|
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(GET_REPLAY_CHECKPOINT_VEHICLE_MODEL())
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
SET_VEHICLE_NAME_DEBUG(vsTrevorsCar.VehicleIndex, "RS_Trevors_Car")
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Creating replay checkpoint vehicle for player ped Trevor with model ", GET_MODEL_NAME_FOR_DEBUG(GET_REPLAY_CHECKPOINT_VEHICLE_MODEL()), ".")
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
iSetupProgress++
|
|
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
IF ( TrevorsVehicleData.eModel = DUMMY_MODEL_FOR_SCRIPT AND HAS_MISSION_VEHICLE_BEEN_CREATED(vsTrevorsCar, TRUE, FALSE, CHAR_TREVOR) )
|
|
OR ( TrevorsVehicleData.eModel <> DUMMY_MODEL_FOR_SCRIPT )
|
|
|
|
IF DOES_ENTITY_EXIST(vsTrevorsCar.VehicleIndex)
|
|
IF NOT IS_ENTITY_DEAD(vsTrevorsCar.VehicleIndex)
|
|
IF IS_THIS_MODEL_A_HELI(GET_ENTITY_MODEL(vsTrevorsCar.VehicleIndex))
|
|
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(vsTrevorsCar.VehicleIndex, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
iSetupProgress++
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
|
|
|
|
IF GET_PLAYER_CHARACTER_AT_MISSION_START() = CHAR_TREVOR AND IS_REPLAY_CHECKPOINT_VEHICLE_AVAILABLE()
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Replay checkpoint vehicle with model ", GET_MODEL_NAME_FOR_DEBUG(GET_REPLAY_CHECKPOINT_VEHICLE_MODEL()), " is available for stage.")
|
|
#ENDIF
|
|
|
|
IF NOT DOES_ENTITY_EXIST(vsTrevorsCar.VehicleIndex) //create replay checkpoint saved vehicle
|
|
|
|
REQUEST_REPLAY_CHECKPOINT_VEHICLE_MODEL()
|
|
|
|
IF HAS_REPLAY_CHECKPOINT_VEHICLE_LOADED()
|
|
|
|
CLEAR_AREA(vsTrevorsCar.vPosition, 10.0, TRUE)
|
|
|
|
vsTrevorsCar.VehicleIndex = CREATE_REPLAY_CHECKPOINT_VEHICLE(vsTrevorsCar.vPosition, vsTrevorsCar.fHeading)
|
|
|
|
SET_VEHICLE_DOORS_SHUT(vsTrevorsCar.VehicleIndex, TRUE)
|
|
SET_VEHICLE_ON_GROUND_PROPERLY(vsTrevorsCar.VehicleIndex)
|
|
|
|
IF IS_THIS_MODEL_A_HELI(GET_REPLAY_CHECKPOINT_VEHICLE_MODEL())
|
|
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(vsTrevorsCar.VehicleIndex, TRUE)
|
|
ENDIF
|
|
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(GET_REPLAY_CHECKPOINT_VEHICLE_MODEL())
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
SET_VEHICLE_NAME_DEBUG(vsTrevorsCar.VehicleIndex, "RS_Trevors_Car")
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Creating replay checkpoint vehicle for player ped Trevor with model ", GET_MODEL_NAME_FOR_DEBUG(GET_REPLAY_CHECKPOINT_VEHICLE_MODEL()), ".")
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
iSetupProgress++
|
|
|
|
ENDIF
|
|
|
|
ELIF GET_PLAYER_CHARACTER_AT_MISSION_START() = CHAR_MICHAEL AND IS_REPLAY_CHECKPOINT_VEHICLE_AVAILABLE()
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Replay checkpoint vehicle with model ", GET_MODEL_NAME_FOR_DEBUG(GET_REPLAY_CHECKPOINT_VEHICLE_MODEL()), " is available for stage.")
|
|
#ENDIF
|
|
|
|
IF NOT DOES_ENTITY_EXIST(vsTrevorsCar.VehicleIndex) //create replay checkpoint saved vehicle
|
|
|
|
REQUEST_REPLAY_CHECKPOINT_VEHICLE_MODEL()
|
|
|
|
IF HAS_REPLAY_CHECKPOINT_VEHICLE_LOADED()
|
|
|
|
CLEAR_AREA(vsTrevorsCar.vPosition, 10.0, TRUE)
|
|
|
|
vsTrevorsCar.VehicleIndex = CREATE_REPLAY_CHECKPOINT_VEHICLE(vsTrevorsCar.vPosition, vsTrevorsCar.fHeading)
|
|
|
|
SET_VEHICLE_DOORS_SHUT(vsTrevorsCar.VehicleIndex, TRUE)
|
|
SET_VEHICLE_ON_GROUND_PROPERLY(vsTrevorsCar.VehicleIndex)
|
|
|
|
IF IS_THIS_MODEL_A_HELI(GET_REPLAY_CHECKPOINT_VEHICLE_MODEL())
|
|
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(vsTrevorsCar.VehicleIndex, TRUE)
|
|
ENDIF
|
|
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(GET_REPLAY_CHECKPOINT_VEHICLE_MODEL())
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
SET_VEHICLE_NAME_DEBUG(vsTrevorsCar.VehicleIndex, "RS_Trevors_Car")
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Creating replay checkpoint vehicle for player ped Trevor with model ", GET_MODEL_NAME_FOR_DEBUG(GET_REPLAY_CHECKPOINT_VEHICLE_MODEL()), ".")
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
iSetupProgress++
|
|
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
IF ( TrevorsVehicleData.eModel = DUMMY_MODEL_FOR_SCRIPT AND HAS_MISSION_VEHICLE_BEEN_CREATED(vsTrevorsCar, TRUE, FALSE, CHAR_TREVOR) )
|
|
OR ( TrevorsVehicleData.eModel <> DUMMY_MODEL_FOR_SCRIPT )
|
|
|
|
IF DOES_ENTITY_EXIST(vsTrevorsCar.VehicleIndex)
|
|
IF NOT IS_ENTITY_DEAD(vsTrevorsCar.VehicleIndex)
|
|
IF IS_THIS_MODEL_A_HELI(GET_ENTITY_MODEL(vsTrevorsCar.VehicleIndex))
|
|
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(vsTrevorsCar.VehicleIndex, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
iSetupProgress++
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
ENDIF
|
|
|
|
//set the current player ped enum depending on mission stage
|
|
//delete the other player ped if mission stage requires only one player ped
|
|
IF ( iSetupProgress = 5 )
|
|
|
|
bTrevorFlightActive = FALSE
|
|
|
|
SWITCH eStage
|
|
|
|
CASE MISSION_STAGE_CUTSCENE_INTRO
|
|
//
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_GET_TO_AIRPORT
|
|
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
|
|
CASE CHAR_MICHAEL
|
|
LOCK_AUTOMATIC_DOOR_OPEN(AUTODOOR_MICHAEL_MANSION_GATE, TRUE)
|
|
BREAK
|
|
CASE CHAR_TREVOR
|
|
EXTEND_WORLD_BOUNDARY_FOR_PLAYER(sLocateFlight.vPosition)
|
|
LOCK_AUTOMATIC_DOOR_OPEN(AUTODOOR_MICHAEL_MANSION_GATE, TRUE)
|
|
BREAK
|
|
ENDSWITCH
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_FLY_TO_NORTH_YANKTON
|
|
|
|
bTrevorFlightActive = TRUE
|
|
|
|
IF ( bStageSkippedTo = TRUE )
|
|
OR ( bStageReplayed = TRUE )
|
|
|
|
IF MAKE_SELECTOR_PED_SELECTION(sSelectorPeds, SELECTOR_PED_TREVOR)
|
|
TAKE_CONTROL_OF_SELECTOR_PED(sSelectorPeds)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Performing script controlled hotswap to Trevor for mission stage being loaded. Setting Michael player ped as no longer needed.")
|
|
#ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
DELETE_PED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
EXTEND_WORLD_BOUNDARY_FOR_PLAYER(sLocateFlight.vPosition)
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_CUTSCENE_AIRPORT
|
|
//
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_GET_TO_GRAVEYARD
|
|
CASE MISSION_STAGE_GET_TO_GRAVE
|
|
CASE MISSION_STAGE_CUTSCENE_GRAVEYARD
|
|
CASE MISSION_STAGE_GRAVEYARD_SHOOTOUT
|
|
CASE MISSION_STAGE_CUTSCENE_KIDNAPPED
|
|
|
|
IF MAKE_SELECTOR_PED_SELECTION(sSelectorPeds, SELECTOR_PED_MICHAEL)
|
|
TAKE_CONTROL_OF_SELECTOR_PED(sSelectorPeds)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Performing script controlled hotswap to Michael for mission stage being loaded. Setting Trevor player ped as no longer needed.")
|
|
#ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
DELETE_PED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Deleting Trevor ped.")
|
|
#ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_FLY_HOME
|
|
CASE MISSION_STAGE_END
|
|
|
|
bTrevorFlightActive = TRUE
|
|
|
|
IF MAKE_SELECTOR_PED_SELECTION(sSelectorPeds, SELECTOR_PED_TREVOR)
|
|
TAKE_CONTROL_OF_SELECTOR_PED(sSelectorPeds)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Performing script controlled hotswap to Trevor for mission stage being loaded. Setting Michael player ped as no longer needed.")
|
|
#ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
DELETE_PED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
SWITCH eStage
|
|
CASE MISSION_STAGE_FLY_HOME
|
|
EXTEND_WORLD_BOUNDARY_FOR_PLAYER(vsTrevorsPlane.vPosition + vGlobalFlightOffset)
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
iSetupProgress++
|
|
|
|
ENDIF
|
|
|
|
//handle the prologue minimap display, weather and dispatch services depending on current mission stage
|
|
//run this each time new mission stage needs to be loaded
|
|
IF ( iSetupProgress = 6 )
|
|
|
|
SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_NONE)
|
|
|
|
SWITCH eStage
|
|
|
|
//mission is in san andreas map
|
|
CASE MISSION_STAGE_CUTSCENE_INTRO
|
|
CASE MISSION_STAGE_GET_TO_AIRPORT
|
|
CASE MISSION_STAGE_FLY_TO_NORTH_YANKTON
|
|
CASE MISSION_STAGE_CUTSCENE_AIRPORT
|
|
CASE MISSION_STAGE_FLY_HOME
|
|
CASE MISSION_STAGE_END
|
|
|
|
SET_PLAYER_PED_DATA_IN_CUTSCENES(TRUE, TRUE)
|
|
|
|
//if prologue map is active, which means mission stages are skipped backwards
|
|
//then remove the prologue IPLs
|
|
IF ( bPrologueMapActive = TRUE )
|
|
|
|
UNLOCK_GRAVEYARD_GATES()
|
|
UNREGISTER_GRAVEYARD_GATES()
|
|
|
|
REMOVE_ALL_PROLOGUE_IPLS()
|
|
|
|
SET_ROADS_IN_ANGLED_AREA(<<5526.240234,-5137.229980,61.789253>>, <<3679.326660,-4973.879395,125.082840>>, 192.0, FALSE, FALSE)
|
|
SET_ROADS_IN_ANGLED_AREA(<<3691.211426,-4941.240234,94.593681>>, <<3511.115479,-4869.191406,126.762108>>, 16.0, FALSE, FALSE)
|
|
SET_ROADS_IN_ANGLED_AREA(<<3510.004395,-4865.810059,94.695572>>, <<3204.424316,-4833.816895,126.815216>>, 16.0, FALSE, FALSE)
|
|
SET_ROADS_IN_ANGLED_AREA(<<3186.533691,-4832.797852,109.814827>>, <<3202.187256,-4833.993164,114.814995>>, 16.0, FALSE, FALSE) //road leading down into town
|
|
|
|
CLEAR_TIMECYCLE_MODIFIER()
|
|
DISABLE_MOON_CYCLE_OVERRIDE()
|
|
SET_AMBIENT_VEHICLE_NEON_ENABLED(TRUE)
|
|
|
|
RELEASE_SUPPRESSED_EMERGENCY_CALLS()
|
|
|
|
IF DOES_PICKUP_EXIST(HealthPickup)
|
|
REMOVE_PICKUP(HealthPickup)
|
|
ENDIF
|
|
|
|
IF IS_CHEAT_DISABLED(CHEAT_TYPE_SUPER_JUMP)
|
|
DISABLE_CHEAT(CHEAT_TYPE_SUPER_JUMP, FALSE)
|
|
ENDIF
|
|
IF IS_CHEAT_DISABLED(CHEAT_TYPE_SPAWN_VEHICLE)
|
|
DISABLE_CHEAT(CHEAT_TYPE_SPAWN_VEHICLE, FALSE)
|
|
ENDIF
|
|
IF IS_CHEAT_DISABLED(CHEAT_TYPE_ADVANCE_WEATHER)
|
|
DISABLE_CHEAT(CHEAT_TYPE_ADVANCE_WEATHER, FALSE)
|
|
ENDIF
|
|
|
|
bPrologueMapActive = FALSE
|
|
|
|
ENDIF
|
|
|
|
SET_RANDOM_TRAINS(TRUE) //allow random trains when not in prologue map
|
|
SET_ALLOW_STREAM_PROLOGUE_NODES(FALSE) //turn streaming of prologue vehicle nodes off
|
|
SET_MINIMAP_IN_PROLOGUE_AND_HANDLE_STATIC_BLIPS(FALSE) //turn prologue minimap off
|
|
|
|
//enable dispatch services
|
|
ENABLE_DISPATCH_SERVICE(DT_POLICE_AUTOMOBILE, TRUE)
|
|
ENABLE_DISPATCH_SERVICE(DT_POLICE_HELICOPTER, TRUE)
|
|
ENABLE_DISPATCH_SERVICE(DT_FIRE_DEPARTMENT, TRUE)
|
|
ENABLE_DISPATCH_SERVICE(DT_SWAT_AUTOMOBILE, TRUE)
|
|
ENABLE_DISPATCH_SERVICE(DT_AMBULANCE_DEPARTMENT, TRUE)
|
|
|
|
//set non prologue multipliers
|
|
SET_MAX_WANTED_LEVEL(5)
|
|
SET_CREATE_RANDOM_COPS(TRUE)
|
|
SET_WANTED_LEVEL_MULTIPLIER(1.0)
|
|
|
|
SET_VEHICLE_MODEL_IS_SUPPRESSED(ASEA2, FALSE)
|
|
SET_VEHICLE_MODEL_IS_SUPPRESSED(MESA2, FALSE)
|
|
SET_VEHICLE_MODEL_IS_SUPPRESSED(TAXI, FALSE)
|
|
|
|
//turn snow off if it is snowing
|
|
IF ( bSnowOn = TRUE )
|
|
SET_WEATHER_TYPE_NOW_PERSIST("EXTRASUNNY")
|
|
CLEAR_WEATHER_TYPE_PERSIST()
|
|
UNLOAD_ALL_CLOUD_HATS()
|
|
bSnowOn = FALSE
|
|
ENDIF
|
|
|
|
SET_MAPDATACULLBOX_ENABLED("prologue", FALSE)
|
|
|
|
#IF USE_TU_CHANGES
|
|
SET_MAPDATACULLBOX_ENABLED("Prologue_Main", FALSE)
|
|
#ENDIF
|
|
|
|
IF ( bProloguePedComponentsActive = TRUE ) //set non prologue clothes on player peds
|
|
OR ( bStageSkippedTo = TRUE )
|
|
OR ( bStageReplayed = TRUE )
|
|
|
|
SWITCH eStage
|
|
|
|
CASE MISSION_STAGE_FLY_HOME
|
|
CASE MISSION_STAGE_END
|
|
|
|
RESTORE_PLAYER_PED_VARIATIONS(GET_PED_INDEX(CHAR_TREVOR))
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Restoring player ped variations.")
|
|
#ENDIF
|
|
|
|
BREAK
|
|
|
|
DEFAULT
|
|
|
|
RESTORE_MISSION_START_OUTFIT()
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Restoring default player ped component variations.")
|
|
#ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
bProloguePedComponentsActive = FALSE
|
|
|
|
ENDIF
|
|
|
|
IF ( eStage = MISSION_STAGE_FLY_HOME )
|
|
SET_CLOCK_TIME(6, 15, 0)
|
|
//SET_WEATHER_TYPE_NOW("THUNDER")
|
|
SET_WEATHER_TYPE_NOW("OVERCAST")
|
|
ENDIF
|
|
|
|
//enable vehicle radios
|
|
SET_FRONTEND_RADIO_ACTIVE(TRUE)
|
|
SET_USER_RADIO_CONTROL_ENABLED(TRUE)
|
|
STOP_AUDIO_SCENE("MIC1_RADIO_DISABLE")
|
|
|
|
SET_AMBIENT_ZONE_LIST_STATE("ZL_YANKTON_ZONE_KILL_LIST", TRUE, TRUE)
|
|
SET_AMBIENT_ZONE_LIST_STATE("ZONE_LIST_YANKTON", FALSE, TRUE)
|
|
|
|
REMOVE_NAVMESH_BLOCKING_OBJECTS()
|
|
|
|
IF ( bStageSkippedTo = TRUE ) //on debug skip unblock player ped weapons and restore them
|
|
IF ( bMichaelsWeaponsStored = TRUE )
|
|
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
|
|
CASE CHAR_MICHAEL
|
|
RESTORE_PLAYER_PED_WEAPONS_IN_SNAPSHOT(PLAYER_PED_ID())
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Calling RESTORE_PLAYER_PED_WEAPONS_IN_SNAPSHOT(PLAYER_PED_ID()).")
|
|
#ENDIF
|
|
BREAK
|
|
CASE CHAR_TREVOR
|
|
RESTORE_PLAYER_PED_WEAPONS_IN_SNAPSHOT_FOR_CHAR(CHAR_MICHAEL)
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Calling RESTORE_PLAYER_PED_WEAPONS_IN_SNAPSHOT_FOR_CHAR(CHAR_MICHAEL).")
|
|
#ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
bMichaelsWeaponsStored = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_DOOR_REGISTERED_WITH_SYSTEM(ENUM_TO_INT(DOORHASH_M_MANSION_F_L))
|
|
DOOR_SYSTEM_SET_OPEN_RATIO(ENUM_TO_INT(DOORHASH_M_MANSION_F_L), 0.0, FALSE, FALSE)
|
|
DOOR_SYSTEM_SET_DOOR_STATE(ENUM_TO_INT(DOORHASH_M_MANSION_F_L), DOORSTATE_FORCE_UNLOCKED_THIS_FRAME, FALSE, TRUE)
|
|
g_eCurrentDoorState[DOORNAME_M_MANSION_F_L] = DOORSTATE_FORCE_UNLOCKED_THIS_FRAME //set state for building controller to pick up
|
|
ENDIF
|
|
|
|
IF IS_DOOR_REGISTERED_WITH_SYSTEM(ENUM_TO_INT(DOORHASH_M_MANSION_F_R))
|
|
DOOR_SYSTEM_SET_OPEN_RATIO(ENUM_TO_INT(DOORHASH_M_MANSION_F_R), 0.0, FALSE, FALSE)
|
|
DOOR_SYSTEM_SET_DOOR_STATE(ENUM_TO_INT(DOORHASH_M_MANSION_F_R), DOORSTATE_FORCE_UNLOCKED_THIS_FRAME, FALSE, TRUE)
|
|
g_eCurrentDoorState[DOORNAME_M_MANSION_F_R] = DOORSTATE_FORCE_UNLOCKED_THIS_FRAME //set state for building controller to pick up
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
//mission is in north yankton map
|
|
CASE MISSION_STAGE_GET_TO_GRAVEYARD
|
|
CASE MISSION_STAGE_GET_TO_GRAVE
|
|
CASE MISSION_STAGE_CUTSCENE_GRAVEYARD
|
|
CASE MISSION_STAGE_GRAVEYARD_SHOOTOUT
|
|
CASE MISSION_STAGE_CUTSCENE_KIDNAPPED
|
|
|
|
SET_PLAYER_PED_DATA_IN_CUTSCENES(FALSE, TRUE)
|
|
|
|
IF ( bPrologueMapActive = FALSE )
|
|
|
|
IF NOT IS_REPLAY_BEING_SET_UP()
|
|
REQUEST_PROLOGUE_IPLS()
|
|
REQUEST_PROLOGUE_GRAVE_IPL(FALSE)
|
|
ENDIF
|
|
|
|
REGISTER_GRAVEYARD_GATES()
|
|
LOCK_GRAVEYARD_GATES()
|
|
|
|
SET_ROADS_IN_ANGLED_AREA(<<5526.240234,-5137.229980,61.789253>>, <<3679.326660,-4973.879395,125.082840>>, 192.0, FALSE, TRUE)
|
|
SET_ROADS_IN_ANGLED_AREA(<<3691.211426,-4941.240234,94.593681>>, <<3511.115479,-4869.191406,126.762108>>, 16.0, FALSE, TRUE)
|
|
SET_ROADS_IN_ANGLED_AREA(<<3510.004395,-4865.810059,94.695572>>, <<3204.424316,-4833.816895,126.815216>>, 16.0, FALSE, TRUE)
|
|
SET_ROADS_IN_ANGLED_AREA(<<3186.533691,-4832.797852,109.814827>>, <<3202.187256,-4833.993164,114.814995>>, 16.0, FALSE, TRUE) //road leading down into town
|
|
|
|
SUPPRESS_EMERGENCY_CALLS()
|
|
|
|
SWITCH eStage
|
|
CASE MISSION_STAGE_GET_TO_GRAVEYARD
|
|
SET_CLOCK_TIME(22, 0, 0)
|
|
BREAK
|
|
CASE MISSION_STAGE_GET_TO_GRAVE
|
|
CASE MISSION_STAGE_CUTSCENE_GRAVEYARD
|
|
CASE MISSION_STAGE_GRAVEYARD_SHOOTOUT
|
|
CASE MISSION_STAGE_CUTSCENE_KIDNAPPED
|
|
SET_CLOCK_TIME(0, 0, 0)
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
//handle taking away weapons from Michael and leaving him only with a pistol for North Yankton stages
|
|
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
|
|
CASE CHAR_MICHAEL
|
|
IF ( bMichaelsWeaponsStored = FALSE )
|
|
IF NOT bStageReplayInProgress
|
|
STORE_PLAYER_PED_WEAPONS_IN_SNAPSHOT(PLAYER_PED_ID())
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Calling STORE_PLAYER_PED_WEAPONS_IN_SNAPSHOT(PLAYER_PED_ID()).")
|
|
#ENDIF
|
|
ENDIF
|
|
REMOVE_PED_WEAPONS_LEAVING_ONE(PLAYER_PED_ID(), WEAPONTYPE_PISTOL)
|
|
bMichaelsWeaponsStored = TRUE
|
|
ENDIF
|
|
BREAK
|
|
CASE CHAR_TREVOR
|
|
//
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF NOT DOES_PICKUP_EXIST(HealthPickup) //create health pickup in the graveyard
|
|
|
|
iHealthPickupPlacementFlags = 0
|
|
|
|
SET_BIT(iHealthPickupPlacementFlags, ENUM_TO_INT(PLACEMENT_FLAG_FIXED))
|
|
SET_BIT(iHealthPickupPlacementFlags, ENUM_TO_INT(PLACEMENT_FLAG_UPRIGHT))
|
|
SET_BIT(iHealthPickupPlacementFlags, ENUM_TO_INT(PLACEMENT_FLAG_ORIENT_TO_GROUND))
|
|
|
|
HealthPickup = CREATE_PICKUP_ROTATE(PICKUP_HEALTH_STANDARD, << 3243.380 , -4647.380, 114.975 >>,
|
|
<< 0.0, 0.0, 94.5 >>, iHealthPickupPlacementFlags)
|
|
ENDIF
|
|
|
|
DISABLE_CHEAT(CHEAT_TYPE_SUPER_JUMP, TRUE)
|
|
DISABLE_CHEAT(CHEAT_TYPE_SPAWN_VEHICLE, TRUE)
|
|
DISABLE_CHEAT(CHEAT_TYPE_ADVANCE_WEATHER, TRUE)
|
|
|
|
ENABLE_MOON_CYCLE_OVERRIDE(0.5)
|
|
SET_AMBIENT_VEHICLE_NEON_ENABLED(FALSE)
|
|
|
|
bPrologueMapActive = TRUE
|
|
|
|
ENDIF
|
|
|
|
SWITCH eStage
|
|
CASE MISSION_STAGE_GET_TO_GRAVEYARD
|
|
CLEAR_TIMECYCLE_MODIFIER()
|
|
BREAK
|
|
CASE MISSION_STAGE_GET_TO_GRAVE
|
|
SET_TRANSITION_TIMECYCLE_MODIFIER("graveyard_shootout", 30.0)
|
|
BREAK
|
|
CASE MISSION_STAGE_CUTSCENE_GRAVEYARD
|
|
CASE MISSION_STAGE_GRAVEYARD_SHOOTOUT
|
|
CASE MISSION_STAGE_CUTSCENE_KIDNAPPED
|
|
IF ( bStageSkippedTo = TRUE OR bStageReplayed = TRUE )
|
|
SET_TIMECYCLE_MODIFIER("graveyard_shootout")
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
SWITCH eStage
|
|
CASE MISSION_STAGE_GRAVEYARD_SHOOTOUT
|
|
SPECIAL_ABILITY_FILL_METER(PLAYER_ID(), TRUE)
|
|
SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_SHOOTING)
|
|
|
|
IF NOT DOES_PICKUP_EXIST(PistolPickup) //create pistol pickup in the graveyard, Trevor throws pistol in the cutscene
|
|
|
|
iPistolPickupPlacementFlags = 0
|
|
|
|
SET_BIT(iPistolPickupPlacementFlags, ENUM_TO_INT(PLACEMENT_FLAG_FIXED))
|
|
SET_BIT(iPistolPickupPlacementFlags, ENUM_TO_INT(PLACEMENT_FLAG_UPRIGHT))
|
|
SET_BIT(iPistolPickupPlacementFlags, ENUM_TO_INT(PLACEMENT_FLAG_ORIENT_TO_GROUND))
|
|
|
|
PistolPickup = CREATE_PICKUP_ROTATE(PICKUP_WEAPON_PISTOL, <<3258.7891, -4575.3062, 117.2570>>,
|
|
<<-88.2000, 65.8800, 0.0000>>, iPistolPickupPlacementFlags, 12)
|
|
ENDIF
|
|
|
|
IF NOT DOES_PICKUP_EXIST(RiflePickup) //create rifle pickup in the graveyard
|
|
|
|
iRiflePickupPlacementFlags = 0
|
|
|
|
SET_BIT(iRiflePickupPlacementFlags, ENUM_TO_INT(PLACEMENT_FLAG_FIXED))
|
|
SET_BIT(iRiflePickupPlacementFlags, ENUM_TO_INT(PLACEMENT_FLAG_UPRIGHT))
|
|
SET_BIT(iRiflePickupPlacementFlags, ENUM_TO_INT(PLACEMENT_FLAG_ORIENT_TO_GROUND))
|
|
|
|
RiflePickup = CREATE_PICKUP_ROTATE(PICKUP_WEAPON_ASSAULTRIFLE, <<3265.8049, -4591.3149, 116.1286>>,
|
|
<<-70.2000, -14.4000, -28.8000>>, iRiflePickupPlacementFlags, 50)
|
|
ENDIF
|
|
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
SET_RANDOM_TRAINS(FALSE) //allow random trains when not in prologue map
|
|
SET_ALLOW_STREAM_PROLOGUE_NODES(TRUE) //turn streaming of prologue vehicle nodes off
|
|
SET_MINIMAP_IN_PROLOGUE_AND_HANDLE_STATIC_BLIPS(TRUE) //turn prologue minimap off
|
|
|
|
//disable dispatch services
|
|
ENABLE_DISPATCH_SERVICE(DT_POLICE_AUTOMOBILE, FALSE)
|
|
ENABLE_DISPATCH_SERVICE(DT_POLICE_HELICOPTER, FALSE)
|
|
ENABLE_DISPATCH_SERVICE(DT_FIRE_DEPARTMENT, FALSE)
|
|
ENABLE_DISPATCH_SERVICE(DT_SWAT_AUTOMOBILE, FALSE)
|
|
ENABLE_DISPATCH_SERVICE(DT_AMBULANCE_DEPARTMENT, FALSE)
|
|
|
|
//set prologue multipliers
|
|
SET_MAX_WANTED_LEVEL(0)
|
|
SET_CREATE_RANDOM_COPS(FALSE)
|
|
SET_WANTED_LEVEL_MULTIPLIER(0.0)
|
|
|
|
IF IS_PLAYER_PLAYING(PLAYER_ID())
|
|
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
|
|
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
|
|
ENDIF
|
|
|
|
//suppress the prologue specific vehicles and peds
|
|
SET_VEHICLE_MODEL_IS_SUPPRESSED(ASEA2, TRUE)
|
|
SET_VEHICLE_MODEL_IS_SUPPRESSED(MESA2, TRUE)
|
|
SET_VEHICLE_MODEL_IS_SUPPRESSED(POLICEOLD1, TRUE)
|
|
SET_VEHICLE_MODEL_IS_SUPPRESSED(POLICEOLD2, TRUE)
|
|
SET_VEHICLE_MODEL_IS_SUPPRESSED(TAXI, TRUE)
|
|
|
|
//turn snow on if it is not snowing
|
|
//set the time once only
|
|
IF ( bSnowOn = FALSE )
|
|
CLEAR_WEATHER_TYPE_PERSIST()
|
|
SET_WEATHER_TYPE_NOW_PERSIST("SNOWLIGHT")
|
|
UNLOAD_ALL_CLOUD_HATS()
|
|
LOAD_CLOUD_HAT("Snowy 01")
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting weather type to SNOWLIGHT.")
|
|
#ENDIF
|
|
bSnowOn = TRUE
|
|
ENDIF
|
|
|
|
SET_MAPDATACULLBOX_ENABLED("prologue", TRUE)
|
|
|
|
#IF USE_TU_CHANGES
|
|
SET_MAPDATACULLBOX_ENABLED("Prologue_Main", TRUE)
|
|
#ENDIF
|
|
|
|
IF ( bProloguePedComponentsActive = FALSE ) //set prologue clothes on player peds
|
|
|
|
IF DOES_ENTITY_EXIST(GET_PED_INDEX(CHAR_MICHAEL))
|
|
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_MICHAEL))
|
|
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_MICHAEL), COMP_TYPE_OUTFIT, OUTFIT_P0_LUDENDORFF, FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(GET_PED_INDEX(CHAR_TREVOR))
|
|
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_TREVOR))
|
|
SET_PED_COMP_ITEM_CURRENT_SP(GET_PED_INDEX(CHAR_TREVOR), COMP_TYPE_OUTFIT, OUTFIT_P2_LUDENDORFF, FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting prologue player ped component variations.")
|
|
#ENDIF
|
|
|
|
bProloguePedComponentsActive = TRUE
|
|
|
|
ENDIF
|
|
|
|
SWITCH eStage
|
|
CASE MISSION_STAGE_GRAVEYARD_SHOOTOUT
|
|
CASE MISSION_STAGE_CUTSCENE_KIDNAPPED
|
|
IF ( bDamageDecalApplied = FALSE )
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
APPLY_PED_DAMAGE_DECAL(PLAYER_PED_ID(), PDZ_HEAD, 0.621, 0.755, 55.084, 0.01, 1.0, 1, TRUE, "bruise")
|
|
bDamageDecalApplied = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
//disable vehicle radios in prologue
|
|
SET_FRONTEND_RADIO_ACTIVE(FALSE)
|
|
SET_USER_RADIO_CONTROL_ENABLED(FALSE)
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("MIC1_RADIO_DISABLE")
|
|
START_AUDIO_SCENE("MIC1_RADIO_DISABLE")
|
|
ENDIF
|
|
|
|
SET_AMBIENT_ZONE_LIST_STATE("ZL_YANKTON_ZONE_KILL_LIST", FALSE, TRUE)
|
|
SET_AMBIENT_ZONE_LIST_STATE("ZONE_LIST_YANKTON", TRUE, TRUE)
|
|
|
|
ADD_NAVMESH_BLOCKING_OBJECTS()
|
|
|
|
IF ( bStageSkippedTo = TRUE OR bStageReplayed = TRUE )
|
|
DELETE_ALL_TRAINS()
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
iSetupProgress++
|
|
|
|
ENDIF
|
|
|
|
//make sure prologue IPLs are loaded when going to prologue map
|
|
IF ( iSetupProgress = 7 )
|
|
|
|
IF ( bPrologueMapActive = TRUE )
|
|
|
|
REQUEST_PTFX_ASSET()
|
|
|
|
IF HAS_PTFX_ASSET_LOADED()
|
|
AND ARE_PROLOGUE_IPLS_ACTIVE()
|
|
AND IS_PROLOGUE_GRAVE_IPL_ACTIVE(FALSE)
|
|
AND REQUEST_SCRIPT_AUDIO_BANK("ICE_FOOTSTEPS")
|
|
AND REQUEST_SCRIPT_AUDIO_BANK("SNOW_FOOTSTEPS")
|
|
AND REQUEST_SCRIPT_AUDIO_BANK("SCRIPT\\FBI_HEIST_3B_SHOOTOUT")
|
|
iSetupProgress++
|
|
ENDIF
|
|
|
|
ELIF ( bPrologueMapActive = FALSE )
|
|
|
|
REMOVE_PTFX_ASSET()
|
|
RELEASE_SCRIPT_AUDIO_BANK()
|
|
RELEASE_NAMED_SCRIPT_AUDIO_BANK("SCRIPT\\FBI_HEIST_3B_SHOOTOUT")
|
|
|
|
iSetupProgress++
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
//handle setup peds for dialogue, taxi hailing, cellphone
|
|
IF ( iSetupProgress = 8 )
|
|
|
|
REMOVE_PED_FOR_DIALOGUE(sMichael1Conversation, 0) //Michael
|
|
REMOVE_PED_FOR_DIALOGUE(sMichael1Conversation, 2) //Trevor
|
|
REMOVE_PED_FOR_DIALOGUE(sMichael1Conversation, 3) //Chinese Goon 1 /Dave Norton (phone call)
|
|
REMOVE_PED_FOR_DIALOGUE(sMichael1Conversation, 4) //Chinese Goon 2 /Ron (phone call)
|
|
REMOVE_PED_FOR_DIALOGUE(sMichael1Conversation, 5) //Chinese Goon 3 /Cheng senior (phone call)
|
|
REMOVE_PED_FOR_DIALOGUE(sMichael1Conversation, 6) //Chinese Goon 4
|
|
REMOVE_PED_FOR_DIALOGUE(sMichael1Conversation, 7) //Chinese Goon 5
|
|
REMOVE_PED_FOR_DIALOGUE(sMichael1Conversation, 8) //Air traffic control
|
|
|
|
SET_AUDIO_FLAG("DisableReplayScriptStreamRecording", FALSE)
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting audio flag DisableReplayScriptStreamRecording to false.")
|
|
|
|
SWITCH eStage
|
|
|
|
CASE MISSION_STAGE_GET_TO_AIRPORT
|
|
CASE MISSION_STAGE_FLY_TO_NORTH_YANKTON
|
|
|
|
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
|
|
CASE CHAR_MICHAEL
|
|
ADD_PED_FOR_DIALOGUE(sMichael1Conversation, 0, PLAYER_PED_ID(), "MICHAEL")
|
|
ADD_PED_FOR_DIALOGUE(sMichael1Conversation, 2, NULL, "TREVOR")
|
|
BREAK
|
|
CASE CHAR_TREVOR
|
|
ADD_PED_FOR_DIALOGUE(sMichael1Conversation, 2, PLAYER_PED_ID(), "TREVOR")
|
|
ADD_PED_FOR_DIALOGUE(sMichael1Conversation, 0, NULL, "MICHAEL")
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
ADD_PED_FOR_DIALOGUE(sMichael1Conversation, 3, NULL, "DAVE")
|
|
ADD_PED_FOR_DIALOGUE(sMichael1Conversation, 4, NULL, "NERVOUSRON")
|
|
ADD_PED_FOR_DIALOGUE(sMichael1Conversation, 8, NULL, "MCH1AIRTRAFFIC")
|
|
|
|
DISABLE_CELLPHONE(FALSE)
|
|
DISABLE_TAXI_HAILING(FALSE)
|
|
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_GET_TO_GRAVEYARD
|
|
CASE MISSION_STAGE_GET_TO_GRAVE
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
ADD_PED_FOR_DIALOGUE(sMichael1Conversation, 0, PLAYER_PED_ID(), "MICHAEL")
|
|
ENDIF
|
|
|
|
DISABLE_CELLPHONE(FALSE)
|
|
DISABLE_TAXI_HAILING(TRUE)
|
|
|
|
SET_AUDIO_FLAG("DisableReplayScriptStreamRecording", TRUE)
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting audio flag DisableReplayScriptStreamRecording to true.")
|
|
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_GRAVEYARD_SHOOTOUT
|
|
CASE MISSION_STAGE_CUTSCENE_KIDNAPPED
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
ADD_PED_FOR_DIALOGUE(sMichael1Conversation, 0, PLAYER_PED_ID(), "MICHAEL")
|
|
ENDIF
|
|
|
|
DISABLE_CELLPHONE(FALSE)
|
|
DISABLE_TAXI_HAILING(TRUE)
|
|
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_FLY_HOME
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
ADD_PED_FOR_DIALOGUE(sMichael1Conversation, 2, PLAYER_PED_ID(), "TREVOR")
|
|
ENDIF
|
|
|
|
ADD_PED_FOR_DIALOGUE(sMichael1Conversation, 5, NULL, "CHENGSR")
|
|
|
|
DISABLE_CELLPHONE(FALSE)
|
|
DISABLE_TAXI_HAILING(TRUE)
|
|
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_END
|
|
DISABLE_CELLPHONE(FALSE)
|
|
DISABLE_TAXI_HAILING(FALSE)
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
iSetupProgress++
|
|
|
|
ENDIF
|
|
|
|
IF ( iSetupProgress = 9 )
|
|
|
|
//stage was skipped to or is being replayed
|
|
IF ( bStageSkippedTo = TRUE )
|
|
OR ( bStageReplayed = TRUE )
|
|
|
|
SWITCH eStage
|
|
CASE MISSION_STAGE_GET_TO_AIRPORT
|
|
|
|
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
|
|
CASE CHAR_MICHAEL
|
|
iSetupProgress++
|
|
BREAK
|
|
CASE CHAR_TREVOR
|
|
|
|
REQUEST_WAYPOINT_RECORDING("mic1_tdrive")
|
|
|
|
IF GET_IS_WAYPOINT_RECORDING_LOADED("mic1_tdrive")
|
|
IF DOES_ENTITY_EXIST(vsMichaelsCar.VehicleIndex)
|
|
IF NOT IS_ENTITY_DEAD(vsMichaelsCar.VehicleIndex)
|
|
|
|
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vsMichaelsCar.VehicleIndex)
|
|
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), vsMichaelsCar.VehicleIndex, VS_DRIVER)
|
|
ENDIF
|
|
|
|
CLEAR_AREA_OF_PEDS(<<-857.8701, 172.5816, 67.0251>>, 10.0)
|
|
CLEAR_AREA_OF_VEHICLES(<<-857.8701, 172.5816, 67.0251>>, 10.0)
|
|
|
|
SET_ENTITY_COORDS(vsMichaelsCar.VehicleIndex, <<-857.8701, 172.5816, 67.0251>>)
|
|
SET_ENTITY_HEADING(vsMichaelsCar.VehicleIndex, 355.2254)
|
|
SET_VEHICLE_ON_GROUND_PROPERLY(vsMichaelsCar.VehicleIndex)
|
|
|
|
OVERRIDE_REPLAY_CHECKPOINT_VEHICLE(vsMichaelsCar.VehicleIndex)
|
|
|
|
SET_VEHICLE_ENGINE_ON(vsMichaelsCar.VehicleIndex, TRUE, TRUE)
|
|
SET_VEHICLE_FORWARD_SPEED(vsMichaelsCar.VehicleIndex, 10.0)
|
|
TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING(PLAYER_PED_ID(), vsMichaelsCar.VehicleIndex, "mic1_tdrive", DRIVINGMODE_AVOIDCARS_RECKLESS, 0, EWAYPOINT_START_FROM_CLOSEST_POINT)
|
|
|
|
iSetupProgress++
|
|
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
BREAK
|
|
DEFAULT
|
|
iSetupProgress++
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
ELSE
|
|
|
|
iSetupProgress++
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
//handle player positioning when current stage is being skipped to replayed
|
|
//fade in the screen if it was faded out due to skipping
|
|
IF ( iSetupProgress = 10 )
|
|
|
|
//stage was skipped to or is being replayed
|
|
IF ( bStageSkippedTo = TRUE )
|
|
OR ( bStageReplayed = TRUE )
|
|
|
|
|
|
IF ( bStageReplayed = FALSE )
|
|
|
|
VECTOR vPlayerCoords = GET_ENTITY_COORDS(PLAYER_PED_ID())
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Calling LOAD_SCENE() at coordinates ", vPlayerCoords, " for mission replay or stage skip. This might take a while to load.")
|
|
#ENDIF
|
|
|
|
LOAD_SCENE(vPlayerCoords)
|
|
|
|
WAIT(1000) //add wait to hide any load scene freezes
|
|
|
|
ELSE
|
|
|
|
END_REPLAY_SETUP(NULL, VS_DRIVER, FALSE)
|
|
|
|
ENDIF
|
|
|
|
|
|
|
|
//put player in vehicle
|
|
SWITCH eStage
|
|
|
|
CASE MISSION_STAGE_GRAVEYARD_SHOOTOUT
|
|
|
|
WARP_PED(PLAYER_PED_ID(), << 3256.5776, -4575.2520, 117.2670 >>, 267.6326, FALSE, FALSE, FALSE)
|
|
TASK_PUT_PED_DIRECTLY_INTO_COVER(PLAYER_PED_ID(), csCoverpoints[0].vPosition, -1, TRUE, 0, TRUE, TRUE, csCoverpoints[0].CoverpointIndex)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID(), TRUE)
|
|
|
|
//check for Michaels's fail weapon
|
|
IF ( eMichaelsFailWeapon = WEAPONTYPE_INVALID )
|
|
OR ( eMichaelsFailWeapon = WEAPONTYPE_UNARMED )
|
|
eMichaelsFailWeapon = GET_BEST_PED_WEAPON(PLAYER_PED_ID(), TRUE)
|
|
IF ( eMichaelsFailWeapon = WEAPONTYPE_INVALID )
|
|
OR ( eMichaelsFailWeapon = WEAPONTYPE_UNARMED )
|
|
eMichaelsFailWeapon = WEAPONTYPE_PISTOL //if fail weapon is invalid or unarmed, give scripted weapon
|
|
ENDIF
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Michael's fail weapon is on stage retry is ", GET_WEAPON_NAME(eMichaelsFailWeapon), ".")
|
|
#ENDIF
|
|
|
|
INT iAmmo
|
|
|
|
IF ( GET_AMMO_IN_PED_WEAPON(PLAYER_PED_ID(), eMichaelsFailWeapon) < GET_MAX_AMMO_IN_CLIP(PLAYER_PED_ID(), eMichaelsFailWeapon) )
|
|
iAmmo = GET_MAX_AMMO_IN_CLIP(PLAYER_PED_ID(), eMichaelsFailWeapon) * 2
|
|
ENDIF
|
|
|
|
GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), eMichaelsFailWeapon, iAmmo, TRUE)
|
|
|
|
WAIT(500)
|
|
|
|
BREAK
|
|
|
|
//put player ped into vehicle
|
|
CASE MISSION_STAGE_CUTSCENE_AIRPORT
|
|
CASE MISSION_STAGE_GET_TO_GRAVEYARD
|
|
|
|
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_MICHAEL))
|
|
IF IS_VEHICLE_DRIVEABLE(vsMichaelsCar.VehicleIndex)
|
|
SET_PED_INTO_VEHICLE(GET_PED_INDEX(CHAR_MICHAEL), vsMichaelsCar.VehicleIndex, VS_DRIVER)
|
|
SET_VEHICLE_ON_GROUND_PROPERLY(vsMichaelsCar.VehicleIndex)
|
|
SET_VEHICLE_ENGINE_ON(vsMichaelsCar.VehicleIndex, TRUE, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_FLY_HOME
|
|
CASE MISSION_STAGE_END
|
|
|
|
IF NOT IS_PED_INJURED(GET_PED_INDEX(CHAR_TREVOR))
|
|
IF IS_VEHICLE_DRIVEABLE(vsTrevorsPlane.VehicleIndex)
|
|
IF NOT IS_PED_SITTING_IN_VEHICLE(GET_PED_INDEX(CHAR_TREVOR), vsTrevorsPlane.VehicleIndex)
|
|
SET_PED_INTO_VEHICLE(GET_PED_INDEX(CHAR_TREVOR), vsTrevorsPlane.VehicleIndex, VS_DRIVER)
|
|
ENDIF
|
|
SET_VEHICLE_ENGINE_ON(vsTrevorsPlane.VehicleIndex, TRUE, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
IF ( bStageSkippedTo = TRUE )
|
|
SET_ENTITY_INVINCIBLE(PLAYER_PED_ID(), FALSE)
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Removing player ped invincibility for mission stage being skipped to.")
|
|
#ENDIF
|
|
ENDIF
|
|
|
|
IF ( eStage = MISSION_STAGE_GRAVEYARD_SHOOTOUT )
|
|
IF ( bGameplayCameraSet = FALSE )
|
|
IF GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_ON_FOOT) = CAM_VIEW_MODE_FIRST_PERSON
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(-16.536800)
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(-45.0000)
|
|
ELSE
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(-16.536800)
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(-72.373550)
|
|
ENDIF
|
|
bGameplayCameraSet = TRUE
|
|
ENDIF
|
|
ELSE
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0)
|
|
ENDIF
|
|
|
|
//handle music for skips/retry/replay of mission stages
|
|
SWITCH eStage
|
|
|
|
CASE MISSION_STAGE_GRAVEYARD_SHOOTOUT
|
|
TRIGGER_MUSIC_EVENT("MIC1_SHOOTOUT_RT")
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_CUTSCENE_KIDNAPPED
|
|
TRIGGER_MUSIC_EVENT("MIC1_SKIPPED_TO_KIDNAP")
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_FLY_HOME
|
|
TRIGGER_MUSIC_EVENT("MIC1_FLY_HOME_RT")
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
SWITCH eStage
|
|
CASE MISSION_STAGE_GET_TO_AIRPORT
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
SET_PLAYER_ANGRY(PLAYER_PED_ID(), TRUE)
|
|
ENDIF
|
|
BREAK
|
|
DEFAULT
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
SET_PLAYER_ANGRY(PLAYER_PED_ID(), FALSE)
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
//handle fade in for each mission stage
|
|
//some stages start with or require a fade out
|
|
SWITCH eStage
|
|
|
|
CASE MISSION_STAGE_CUTSCENE_INTRO
|
|
CASE MISSION_STAGE_CUTSCENE_AIRPORT
|
|
CASE MISSION_STAGE_GET_TO_GRAVEYARD
|
|
CASE MISSION_STAGE_CUTSCENE_GRAVEYARD
|
|
CASE MISSION_STAGE_CUTSCENE_KIDNAPPED
|
|
CASE MISSION_STAGE_FLY_HOME
|
|
|
|
//do not fade in, mission stage will handle a fade in from fade out
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Halting loading screen fade in for skip to a mission stage that will fade the screen in.")
|
|
#ENDIF
|
|
|
|
BREAK
|
|
|
|
DEFAULT
|
|
|
|
//fade in
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Calling a loading screen fade in.")
|
|
#ENDIF
|
|
IF IS_SCREEN_FADED_OUT()
|
|
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
ENDIF
|
|
|
|
iSetupProgress++
|
|
|
|
ENDIF
|
|
|
|
//handle setting of mid-mission replay checkpoints
|
|
IF ( iSetupProgress = 11 )
|
|
|
|
SWITCH eStage
|
|
|
|
CASE MISSION_STAGE_GET_TO_AIRPORT
|
|
|
|
//don't store replay checkpoint vehicle here, the replay start vehicle can be used here
|
|
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(ENUM_TO_INT(MID_MISSION_STAGE_GET_TO_AIRPORT), "GET TO AIRPORT", FALSE, FALSE, NULL, FALSE)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting replay mid-mission checkpoint to ", ENUM_TO_INT(MID_MISSION_STAGE_GET_TO_AIRPORT), " for stage ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eStage), ".")
|
|
#ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_FLY_TO_NORTH_YANKTON
|
|
|
|
//store replay checkpoint vehicle here
|
|
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(ENUM_TO_INT(MID_MISSION_STAGE_FLY_TO_NORTH_YANKTON), "FLY TO NORTH YANKTON", FALSE)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting replay mid-mission checkpoint to ", ENUM_TO_INT(MID_MISSION_STAGE_FLY_TO_NORTH_YANKTON), " for stage ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eStage), ".")
|
|
#ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_GET_TO_GRAVEYARD
|
|
|
|
//don't store replay checkpoint vehicle here
|
|
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(ENUM_TO_INT(MID_MISSION_STAGE_GET_TO_GRAVEYARD), "GET TO GRAVEYARD", FALSE, FALSE, NULL, FALSE)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting replay mid-mission checkpoint to ", ENUM_TO_INT(MID_MISSION_STAGE_GET_TO_GRAVEYARD), " for stage ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eStage), ".")
|
|
#ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_GET_TO_GRAVE
|
|
|
|
//don't store replay checkpoint vehicle here
|
|
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(ENUM_TO_INT(MID_MISSION_STAGE_GET_TO_GRAVE), "GET TO GRAVE", FALSE, FALSE, NULL, FALSE)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting replay mid-mission checkpoint to ", ENUM_TO_INT(MID_MISSION_STAGE_GET_TO_GRAVE), " for stage ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eStage), ".")
|
|
#ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_GRAVEYARD_SHOOTOUT
|
|
|
|
//don't store replay checkpoint vehicle here
|
|
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(ENUM_TO_INT(MID_MISSION_STAGE_GRAVEYARD_SHOOTOUT), "GRAVEYARD SHOOTOUT", FALSE, FALSE, NULL, FALSE)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting replay mid-mission checkpoint to ", ENUM_TO_INT(MID_MISSION_STAGE_GRAVEYARD_SHOOTOUT), " for stage ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eStage), ".")
|
|
#ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_FLY_HOME
|
|
|
|
//don't store replay checkpoint vehicle here
|
|
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(ENUM_TO_INT(MID_MISSION_STAGE_FLY_HOME), "FLY HOME", TRUE, FALSE, NULL, FALSE)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting replay mid-mission checkpoint to ", ENUM_TO_INT(MID_MISSION_STAGE_FLY_HOME), " for stage ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eStage), ".")
|
|
#ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
iSetupProgress++
|
|
|
|
ENDIF
|
|
|
|
//print the message only once per mission stage
|
|
IF ( iSetupProgress = 12 )
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Finished mission stage loading for ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eStage), ".")
|
|
#ENDIF
|
|
|
|
bStageLoaded = TRUE
|
|
bStageReplayed = FALSE
|
|
bStageSkippedTo = FALSE
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
|
|
iSetupProgress++
|
|
|
|
ENDIF
|
|
|
|
IF ( iSetupProgress = 13 )
|
|
|
|
RETURN TRUE
|
|
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
|
|
ENDFUNC
|
|
|
|
//|============================ COMBAT PROCEDURES & FUNCTIONS ============================|
|
|
|
|
FUNC PED_INDEX CREATE_ENEMY_PED(MODEL_NAMES modelName, VECTOR vPosition, FLOAT fHeading, REL_GROUP_HASH group,
|
|
WEAPON_TYPE eWeaponType = WEAPONTYPE_UNARMED, WEAPONCOMPONENT_TYPE eWeaponComponent = WEAPONCOMPONENT_INVALID,
|
|
BOOL bDucking = FALSE, INT iHealth = 200, INT iArmour = 0)
|
|
|
|
|
|
PED_INDEX PedIndex = CREATE_PED(PEDTYPE_MISSION, modelName, vPosition, fHeading)
|
|
|
|
SET_PED_COMPONENT_VARIATION(PedIndex, PED_COMP_HAIR, 1, 0)
|
|
|
|
//enemy health and armor
|
|
SET_PED_MAX_HEALTH(PedIndex, iHealth)
|
|
SET_ENTITY_HEALTH(PedIndex, iHealth)
|
|
ADD_ARMOUR_TO_PED(PedIndex, iArmour)
|
|
SET_PED_DIES_WHEN_INJURED(PedIndex, TRUE)
|
|
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(PedIndex, group)
|
|
SET_PED_AS_ENEMY(PedIndex, TRUE)
|
|
SET_PED_TARGET_LOSS_RESPONSE(PedIndex, TLR_NEVER_LOSE_TARGET)
|
|
SET_PED_COMBAT_ATTRIBUTES(PedIndex, CA_USE_VEHICLE, FALSE)
|
|
SET_PED_COMBAT_ATTRIBUTES(PedIndex, CA_ENABLE_TACTICAL_POINTS_WHEN_DEFENSIVE, TRUE)
|
|
|
|
//enemy weapons
|
|
GIVE_WEAPON_TO_PED(PedIndex, eWeaponType, INFINITE_AMMO, TRUE)
|
|
SET_CURRENT_PED_WEAPON(PedIndex, eWeaponType, TRUE)
|
|
SET_PED_INFINITE_AMMO(PedIndex, TRUE, eWeaponType)
|
|
|
|
IF ( eWeaponComponent <> WEAPONCOMPONENT_INVALID )
|
|
GIVE_WEAPON_COMPONENT_TO_PED(PedIndex, eWeaponType, eWeaponComponent)
|
|
ENDIF
|
|
|
|
SET_PED_DUCKING(PedIndex, bDucking)
|
|
|
|
//disable ped being able to climb
|
|
SET_PED_PATH_CAN_USE_CLIMBOVERS(PedIndex, FALSE)
|
|
|
|
SET_PED_CONFIG_FLAG(PedIndex, PCF_DisableHurt, TRUE)
|
|
SET_PED_CONFIG_FLAG(PedIndex, PCF_RunFromFiresAndExplosions, FALSE)
|
|
SET_PED_CONFIG_FLAG(PedIndex, PCF_KeepRelationshipGroupAfterCleanUp, TRUE)
|
|
SET_COMBAT_FLOAT(PedIndex, CCF_TIME_TO_INVALIDATE_INJURED_TARGET, 30.0)
|
|
|
|
//add ped to be watched by headshot stat
|
|
INFORM_MISSION_STATS_OF_HEADSHOT_WATCH_ENTITY(PedIndex)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created enemy ped with model ", GET_MODEL_NAME_FOR_DEBUG(modelName), " at coordinates ", vPosition, ".")
|
|
#ENDIF
|
|
|
|
RETURN PedIndex
|
|
|
|
ENDFUNC
|
|
|
|
FUNC PED_INDEX CREATE_ENEMY_PED_IN_VEHICLE(MODEL_NAMES modelName, VEHICLE_INDEX vehicleIndex, VEHICLE_SEAT eSeat, REL_GROUP_HASH group,
|
|
WEAPON_TYPE eWeaponType = WEAPONTYPE_UNARMED, WEAPONCOMPONENT_TYPE eWeaponComponent = WEAPONCOMPONENT_INVALID,
|
|
INT iHealth = 200, INT iArmour = 0)
|
|
|
|
PED_INDEX ped
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(vehicleIndex)
|
|
ped = CREATE_ENEMY_PED(modelName, GET_ENTITY_COORDS(vehicleIndex) + <<0.0, 0.0, 3.0>>, 0.0, group, eWeaponType, eWeaponComponent, FALSE, iHealth, iArmour)
|
|
SET_PED_INTO_VEHICLE(ped, vehicleIndex, eSeat)
|
|
ENDIF
|
|
|
|
RETURN ped
|
|
|
|
ENDFUNC
|
|
|
|
PROC SET_ENEMY_PED_PROPERTIES(PED_INDEX PedIndex, REL_GROUP_HASH group, WEAPON_TYPE eWeaponType = WEAPONTYPE_UNARMED, BOOL bCanClimb = FALSE,
|
|
INT iHealth = 200, INT iArmour = 0, BOOL bKeepRelGroupOnCleanup = TRUE)
|
|
|
|
IF DOES_ENTITY_EXIST(PedIndex)
|
|
IF NOT IS_PED_INJURED(PedIndex)
|
|
|
|
SET_ENTITY_AS_MISSION_ENTITY(PedIndex, TRUE)
|
|
|
|
GIVE_WEAPON_TO_PED(PedIndex, eWeaponType, INFINITE_AMMO, FALSE)
|
|
SET_PED_INFINITE_AMMO(PedIndex, TRUE, eWeaponType)
|
|
SET_PED_MAX_HEALTH(PedIndex, iHealth)
|
|
SET_ENTITY_HEALTH(PedIndex, iHealth)
|
|
ADD_ARMOUR_TO_PED(PedIndex, iArmour)
|
|
SET_PED_DIES_WHEN_INJURED(PedIndex, TRUE)
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(PedIndex, group)
|
|
SET_PED_AS_ENEMY(PedIndex, TRUE)
|
|
SET_PED_TARGET_LOSS_RESPONSE(PedIndex, TLR_NEVER_LOSE_TARGET)
|
|
SET_PED_COMBAT_ATTRIBUTES(PedIndex, CA_USE_VEHICLE, FALSE)
|
|
|
|
//disable ped being able to climb
|
|
SET_PED_PATH_CAN_USE_CLIMBOVERS(PedIndex, bCanClimb)
|
|
|
|
SET_PED_CONFIG_FLAG(PedIndex, PCF_RunFromFiresAndExplosions, FALSE)
|
|
SET_PED_CONFIG_FLAG(PedIndex, PCF_KeepRelationshipGroupAfterCleanUp, bKeepRelGroupOnCleanup)
|
|
|
|
//add ped to be watched by headshot stat
|
|
INFORM_MISSION_STATS_OF_HEADSHOT_WATCH_ENTITY(PedIndex)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Set enemy ped properties.")
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC INITIALISE_ENEMY_GROUP(ENEMY_STRUCT &esEnemies[], BOOL bAddBlips = TRUE #IF IS_DEBUG_BUILD, STRING sDebugGroupName = NULL #ENDIF)
|
|
|
|
INT i = 0
|
|
|
|
FOR i = 0 TO ( COUNT_OF(esEnemies) - 1 )
|
|
|
|
IF NOT IS_PED_INJURED(esEnemies[i].PedIndex)
|
|
|
|
TASK_STAND_STILL(esEnemies[i].PedIndex, -1)
|
|
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(esEnemies[i].PedIndex, TRUE)
|
|
|
|
IF ( bAddBlips = TRUE )
|
|
esEnemies[i].BlipIndex = CREATE_BLIP_FOR_ENTITY(esEnemies[i].PedIndex, TRUE)
|
|
ENDIF
|
|
|
|
esEnemies[i].bCreated = TRUE
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
IF NOT IS_STRING_NULL_OR_EMPTY(sDebugGroupName)
|
|
TEXT_LABEL_31 tlDebugName = sDebugGroupName
|
|
tlDebugName += i
|
|
SET_PED_NAME_DEBUG(esEnemies[i].PedIndex, tlDebugName)
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Initialised enemy ped with debug name ", tlDebugName, ".")
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDFOR
|
|
|
|
ENDPROC
|
|
|
|
PROC ADD_BLIPS_FOR_ENEMY_GROUP(ENEMY_STRUCT &esEnemies[])
|
|
|
|
INT i = 0
|
|
|
|
FOR i = 0 TO ( COUNT_OF(esEnemies) - 1 )
|
|
|
|
IF DOES_ENTITY_EXIST(esEnemies[i].PedIndex)
|
|
IF NOT IS_PED_INJURED(esEnemies[i].PedIndex)
|
|
IF NOT DOES_BLIP_EXIST(esEnemies[i].BlipIndex)
|
|
esEnemies[i].BlipIndex = CREATE_BLIP_FOR_ENTITY(esEnemies[i].PedIndex, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDFOR
|
|
|
|
ENDPROC
|
|
|
|
PROC UPDATE_AI_PED_BLIPS_FOR_ENEMY_GROUP(ENEMY_STRUCT &array[], BOOL bRenderBlip = TRUE)
|
|
|
|
INT i
|
|
|
|
FOR i = 0 TO ( COUNT_OF(array) - 1 )
|
|
IF ( bRenderBlip = TRUE )
|
|
UPDATE_AI_PED_BLIP(array[i].PedIndex, array[i].EnemyBlipData)
|
|
ELSE
|
|
CLEANUP_AI_PED_BLIP(array[i].EnemyBlipData)
|
|
ENDIF
|
|
ENDFOR
|
|
|
|
ENDPROC
|
|
|
|
PROC BLOCK_WEAPON_FIRE_FOR_ENEMY_GROUP(ENEMY_STRUCT &array[])
|
|
|
|
INT i
|
|
|
|
FOR i = 0 TO ( COUNT_OF(array) - 1 )
|
|
IF DOES_ENTITY_EXIST(array[i].PedIndex)
|
|
IF NOT IS_ENTITY_DEAD(array[i].PedIndex)
|
|
SET_PED_RESET_FLAG(array[i].PedIndex, PRF_BlockWeaponFire, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDFOR
|
|
|
|
ENDPROC
|
|
|
|
PROC SET_PED_COMBAT_PROPERTIES(PED_INDEX pedIndex, COMBAT_MOVEMENT eCombatMovement, COMBAT_ABILITY_LEVEL eCombatAbilityLevel,
|
|
COMBAT_RANGE eCombatRange, COMBAT_ATTRIBUTE eCombatAttributes, BOOL bCanRagdoll = TRUE)
|
|
|
|
IF NOT IS_PED_INJURED(pedIndex)
|
|
|
|
SET_PED_TARGET_LOSS_RESPONSE(pedIndex, TLR_NEVER_LOSE_TARGET)
|
|
|
|
SET_PED_COMBAT_MOVEMENT(pedIndex, eCombatMovement)
|
|
SET_PED_COMBAT_ABILITY(pedIndex, eCombatAbilityLevel)
|
|
SET_PED_COMBAT_RANGE(pedIndex, eCombatRange)
|
|
SET_PED_COMBAT_ATTRIBUTES(pedIndex, CA_USE_VEHICLE, FALSE)
|
|
SET_PED_COMBAT_ATTRIBUTES(pedIndex, CA_DO_DRIVEBYS, FALSE)
|
|
SET_PED_COMBAT_ATTRIBUTES(pedIndex, CA_LEAVE_VEHICLES, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(pedIndex, CA_CAN_INVESTIGATE, FALSE)
|
|
|
|
IF ( eCombatAttributes <> CA_INVALID)
|
|
SET_PED_COMBAT_ATTRIBUTES(pedIndex, eCombatAttributes, TRUE)
|
|
ENDIF
|
|
|
|
SET_PED_CAN_RAGDOLL(pedIndex, bCanRagdoll)
|
|
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC SET_PED_COMBAT_MOVEMENT_VALUES(PED_INDEX PedIndex, FLOAT fStrafeMovingChance, FLOAT fWalkStrafingChance)
|
|
|
|
IF NOT IS_PED_INJURED(PedIndex)
|
|
SET_COMBAT_FLOAT(PedIndex, CCF_STRAFE_WHEN_MOVING_CHANCE, fStrafeMovingChance)
|
|
SET_COMBAT_FLOAT(PedIndex, CCF_WALK_WHEN_STRAFING_CHANCE, fWalkStrafingChance)
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC SET_PED_DEFENSIVE_AREA_ANGLED(PED_INDEX PedIndex, VECTOR vPosition1, VECTOR vPosition2, FLOAT fWidth, BOOL bGoToCenter = FALSE)
|
|
IF NOT IS_PED_INJURED(PedIndex)
|
|
SET_PED_ANGLED_DEFENSIVE_AREA(PedIndex, vPosition1, vPosition2, fWidth, bGoToCenter)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC SET_PED_DEFENSIVE_AREA_SPHERE(PED_INDEX PedIndex, VECTOR vPosition, FLOAT fRadius, BOOL bGoToCenter = FALSE)
|
|
IF NOT IS_PED_INJURED(PedIndex)
|
|
SET_PED_SPHERE_DEFENSIVE_AREA(PedIndex, vPosition, fRadius, bGoToCenter)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC SET_PED_SHOOTING_PROPERTIES(PED_INDEX PedIndex, INT iAccuracy, INT iShootRate = 100, FIRING_PATTERN_HASH eFiringPattern = FIRING_PATTERN_BURST_FIRE)
|
|
|
|
IF NOT IS_PED_INJURED(PedIndex)
|
|
SET_PED_ACCURACY(PedIndex, iAccuracy)
|
|
SET_PED_SHOOT_RATE(PedIndex, iShootRate)
|
|
SET_PED_FIRING_PATTERN(PedIndex, eFiringPattern)
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC SET_PED_COVER_PROPERTIES(PED_INDEX PedIndex, BOOL bCanUseCover, BOOL bForceFaceLeft = FALSE, BOOL bForceFaceRight = FALSE,
|
|
BOOL bBlockTurnInCover = FALSE, FLOAT fTimeBetweenPeeks = 10.0, BOOL bCanBlindFire = TRUE,
|
|
FLOAT fBlindFireChance = 0.05, FLOAT fTimeBetweenBursts = 1.25, FLOAT fBurstDuration = 4.0)
|
|
|
|
IF NOT IS_PED_INJURED(PedIndex)
|
|
|
|
SET_PED_COMBAT_ATTRIBUTES(pedIndex, CA_USE_COVER, bCanUseCover)
|
|
|
|
SET_PED_CONFIG_FLAG(PedIndex, PCF_ForcePedToFaceLeftInCover, bForceFaceLeft)
|
|
SET_PED_CONFIG_FLAG(PedIndex, PCF_ForcePedToFaceRightInCover, bForceFaceRight)
|
|
SET_PED_CONFIG_FLAG(PedIndex, PCF_BlockPedFromTurningInCover, bBlockTurnInCover)
|
|
|
|
SET_PED_COMBAT_ATTRIBUTES(PedIndex, CA_BLIND_FIRE_IN_COVER, bCanBlindFire)
|
|
|
|
IF ( fTimeBetweenPeeks >= 0.0 )
|
|
SET_COMBAT_FLOAT(PedIndex, CCF_TIME_BETWEEN_PEEKS, fTimeBetweenPeeks)
|
|
ENDIF
|
|
|
|
IF ( fTimeBetweenBursts >= 0.0 )
|
|
SET_COMBAT_FLOAT(PedIndex, CCF_TIME_BETWEEN_BURSTS_IN_COVER, fTimeBetweenBursts)
|
|
ENDIF
|
|
|
|
IF ( fBurstDuration >= 0.0 )
|
|
SET_COMBAT_FLOAT(PedIndex, CCF_BURST_DURATION_IN_COVER, fBurstDuration)
|
|
ENDIF
|
|
|
|
IF ( fBlindFireChance >= 0.0 )
|
|
SET_COMBAT_FLOAT(PedIndex, CCF_BLIND_FIRE_CHANCE, fBlindFireChance)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC SET_PED_PREFERRED_COVERPOINT(PED_INDEX PedIndex, ITEMSET_INDEX &ItemsetIndex, COVERPOINT_INDEX &CoverpointIndex)
|
|
|
|
IF NOT IS_PED_INJURED(PedIndex)
|
|
|
|
IF IS_ITEMSET_VALID(ItemsetIndex)
|
|
|
|
DESTROY_ITEMSET(ItemsetIndex)
|
|
|
|
ENDIF
|
|
|
|
IF NOT IS_ITEMSET_VALID(ItemsetIndex)
|
|
ItemsetIndex = CREATE_ITEMSET(TRUE)
|
|
ENDIF
|
|
|
|
ADD_TO_ITEMSET(CoverpointIndex, ItemsetIndex)
|
|
SET_PED_PREFERRED_COVER_SET(PedIndex, ItemsetIndex)
|
|
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC REMOVE_PED_PREFERRED_COVERPOINT(PED_INDEX PedIndex, ITEMSET_INDEX &ItemsetIndex)
|
|
|
|
IF NOT IS_PED_INJURED(PedIndex)
|
|
REMOVE_PED_PREFERRED_COVER_SET(PedIndex)
|
|
IF IS_ITEMSET_VALID(ItemsetIndex)
|
|
DESTROY_ITEMSET(ItemsetIndex)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
FUNC INT GET_NUMBER_OF_ENEMIES_ALIVE(ENEMY_STRUCT &esArray[])
|
|
|
|
INT i = 0
|
|
|
|
INT iEnemiesAlive = 0
|
|
|
|
FOR i = 0 TO ( COUNT_OF(esArray) - 1 )
|
|
|
|
IF DOES_ENTITY_EXIST(esArray[i].PedIndex)
|
|
|
|
IF NOT IS_PED_INJURED(esArray[i].PedIndex)
|
|
|
|
iEnemiesAlive++
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDFOR
|
|
|
|
RETURN iEnemiesAlive
|
|
|
|
ENDFUNC
|
|
|
|
FUNC INT GET_NUMBER_OF_ENEMIES_DEAD(ENEMY_STRUCT &esArray[])
|
|
|
|
INT i = 0
|
|
|
|
INT iEnemiesDead = 0
|
|
|
|
FOR i = 0 TO (COUNT_OF(esArray) - 1)
|
|
|
|
IF ( esArray[i].bCreated = TRUE )
|
|
|
|
IF DOES_ENTITY_EXIST(esArray[i].PedIndex)
|
|
|
|
IF IS_PED_INJURED(esArray[i].PedIndex)
|
|
OR IS_ENTITY_DEAD(esArray[i].PedIndex)
|
|
|
|
iEnemiesDead++
|
|
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
iEnemiesDead++
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDFOR
|
|
|
|
RETURN iEnemiesDead
|
|
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Checks if all enemy peds in specified group are dead.
|
|
/// If this group has not been created yet, it will be treated as dead.
|
|
/// PARAMS:
|
|
/// esArray - Enemy ped array to check.
|
|
/// RETURNS:
|
|
/// TRUE if all created enemy peds from specified group are dead, or if the peds have not yet been created.
|
|
/// FALSE if otherwise.
|
|
FUNC BOOL IS_ENEMY_GROUP_DEAD(ENEMY_STRUCT &esArray[])
|
|
|
|
INT i = 0
|
|
|
|
FOR i = 0 TO (COUNT_OF(esArray) - 1)
|
|
|
|
IF ( esArray[i].bCreated = TRUE )
|
|
|
|
IF NOT IS_PED_INJURED(esArray[i].PedIndex)
|
|
RETURN FALSE
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDFOR
|
|
|
|
RETURN TRUE
|
|
|
|
ENDFUNC
|
|
|
|
PROC GO_TO_ENEMY_STATE(ENEMY_STRUCT &enemy, ENEMY_STATES eNewEnemyState)
|
|
|
|
enemy.bHasTask = FALSE
|
|
enemy.eState = eNewEnemyState
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
IF NOT IS_STRING_NULL_OR_EMPTY(enemy.sDebugName)
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Sending enemy ped with debug name ", enemy.sDebugName, " to state ", GET_ENEMY_STATE_NAME_FOR_DEBUG(eNewEnemyState), ".")
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
ENDPROC
|
|
|
|
FUNC BOOL IS_ENEMY_IN_ENEMY_STATE(ENEMY_STRUCT &enemy, ENEMY_STATES eEnemyState)
|
|
|
|
IF DOES_ENTITY_EXIST(enemy.PedIndex)
|
|
IF NOT IS_PED_INJURED(enemy.PedIndex)
|
|
IF ( enemy.eState = eEnemyState )
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
|
|
ENDFUNC
|
|
|
|
FUNC VEHICLE_INDEX CREATE_ENEMY_VEHICLE(VEH_STRUCT &sVehicle, INT iHealth = 1000, BOOL bCreateBlip = FALSE, BOOL bConsideredByPlayer = FALSE, BOOL bDriveable = TRUE, BOOL bCanBeTargetted = FALSE,
|
|
LOCK_STATE eLockState = VEHICLELOCK_UNLOCKED, INT iColour1 = -1, INT iColour2 = -1,
|
|
BOOL bFrozen = FALSE #IF IS_DEBUG_BUILD, STRING sDebugName = NULL #ENDIF)
|
|
|
|
VEHICLE_INDEX VehicleIndex = CREATE_VEHICLE(sVehicle.ModelName, sVehicle.vPosition, sVehicle.fHeading)
|
|
|
|
//vehicle health
|
|
SET_ENTITY_HEALTH(VehicleIndex, iHealth)
|
|
SET_VEHICLE_ENGINE_HEALTH(VehicleIndex, TO_FLOAT(iHealth))
|
|
SET_VEHICLE_PETROL_TANK_HEALTH(VehicleIndex, TO_FLOAT(iHealth))
|
|
|
|
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(VehicleIndex, bConsideredByPlayer)
|
|
SET_VEHICLE_UNDRIVEABLE(VehicleIndex, NOT bDriveable)
|
|
SET_VEHICLE_CAN_BE_TARGETTED(VehicleIndex, bCanBeTargetted)
|
|
SET_VEHICLE_DOORS_LOCKED(VehicleIndex, eLockState)
|
|
|
|
//disable radio
|
|
SET_VEHICLE_RADIO_ENABLED(VehicleIndex, FALSE)
|
|
|
|
IF ( bCreateBlip = TRUE )
|
|
IF NOT DOES_BLIP_EXIST(sVehicle.BlipIndex)
|
|
sVehicle.BlipIndex = CREATE_BLIP_FOR_VEHICLE(VehicleIndex, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF ( iColour1 != -1)
|
|
AND ( iColour2 != -1 )
|
|
SET_VEHICLE_COLOURS(VehicleIndex, iColour1, iColour2)
|
|
SET_VEHICLE_EXTRA_COLOURS(VehicleIndex, 0, 0) //make sure only normal colours are set, no extras
|
|
ENDIF
|
|
|
|
IF ( bFrozen = TRUE )
|
|
FREEZE_ENTITY_POSITION(VehicleIndex, bFrozen)
|
|
SET_VEHICLE_STAYS_FROZEN_WHEN_CLEANED_UP(VehicleIndex, bFrozen)
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
IF NOT Is_String_Null_Or_Empty(sDebugName)
|
|
SET_VEHICLE_NAME_DEBUG(VehicleIndex, sDebugName)
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created enemy vehicle with model ", GET_MODEL_NAME_FOR_DEBUG(sVehicle.ModelName), " and debug name ", sDebugName, " and health ", GET_ENTITY_HEALTH(VehicleIndex), ".")
|
|
ELSE
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created enemy vehicle with model ", GET_MODEL_NAME_FOR_DEBUG(sVehicle.ModelName), ".")
|
|
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
RETURN vehicleIndex
|
|
|
|
ENDFUNC
|
|
|
|
PROC COMBAT_SEQUENCE_GO_TO_COMBAT(PED_INDEX PedIndex, FLOAT fRange = 100.0)
|
|
|
|
IF NOT IS_PED_INJURED(PedIndex)
|
|
|
|
SEQUENCE_INDEX SequenceIndex
|
|
|
|
OPEN_SEQUENCE_TASK(SequenceIndex)
|
|
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, fRange)
|
|
|
|
CLOSE_SEQUENCE_TASK(SequenceIndex)
|
|
|
|
TASK_PERFORM_SEQUENCE(PedIndex, SequenceIndex)
|
|
|
|
CLEAR_SEQUENCE_TASK(SequenceIndex)
|
|
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC COMBAT_SEQUENCE_GO_TO_COORD_THEN_COMBAT(PED_INDEX PedIndex, VECTOR vDestination, FLOAT fMoveSpeed, INT iTime = DEFAULT_TIME_BEFORE_WARP, BOOL bUseNavmesh = TRUE,
|
|
FLOAT fRange = 100.0, FLOAT fRadius = DEFAULT_NAVMESH_RADIUS, ENAV_SCRIPT_FLAGS eNavigationFlags = ENAV_DEFAULT)
|
|
|
|
IF NOT IS_PED_INJURED(PedIndex)
|
|
|
|
SEQUENCE_INDEX SequenceIndex
|
|
|
|
OPEN_SEQUENCE_TASK(SequenceIndex)
|
|
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
|
|
|
|
IF ( bUseNavmesh = TRUE )
|
|
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, vDestination, fMoveSpeed, iTime, fRadius, eNavigationFlags)
|
|
|
|
ELSE
|
|
|
|
TASK_GO_STRAIGHT_TO_COORD(NULL, vDestination, fMoveSpeed, iTime)
|
|
|
|
ENDIF
|
|
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, fRange)
|
|
|
|
CLOSE_SEQUENCE_TASK(SequenceIndex)
|
|
|
|
TASK_PERFORM_SEQUENCE(PedIndex, SequenceIndex)
|
|
|
|
CLEAR_SEQUENCE_TASK(SequenceIndex)
|
|
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC COMBAT_SEQUENCE_GO_TO_COORD_WHILE_AIMING_THEN_COMBAT(PED_INDEX PedIndex, VECTOR vDestination, FLOAT fMoveSpeed,
|
|
BOOL bAimAtHatedPeds, VECTOR vAimPosition, ENTITY_INDEX EntityIndex = NULL,
|
|
BOOL bShootWhileMoving = FALSE, BOOL bCombatAfterStopped = TRUE,
|
|
BOOL bShootAfterStopped = FALSE, INT iAimShootTime = 1000,
|
|
FIRING_TYPE eFiringType = FIRING_TYPE_RANDOM_BURSTS,
|
|
BOOL bUnblockEvents = TRUE, FLOAT fTargetDistance = 0.5,
|
|
FLOAT fSlowDistance = 0.5, BOOL bUseNavmesh = TRUE, FLOAT fCombatRange = 100.0,
|
|
ENAV_SCRIPT_FLAGS eNavigationFlags = ENAV_DEFAULT)
|
|
|
|
IF NOT IS_PED_INJURED(PedIndex)
|
|
|
|
SEQUENCE_INDEX SequenceIndex
|
|
|
|
OPEN_SEQUENCE_TASK(SequenceIndex)
|
|
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
|
|
IF ( bAimAtHatedPeds = TRUE ) //aim at hated entities makes the ped automatically change aiming to nearest hated ped, once the initial ped is dead
|
|
|
|
IF IS_ENTITY_DEAD(EntityIndex)
|
|
|
|
TASK_GO_TO_COORD_AND_AIM_AT_HATED_ENTITIES_NEAR_COORD(NULL, vDestination, vAimPosition, fMoveSpeed, bShootWhileMoving, fTargetDistance, fSlowDistance, bUseNavmesh, eNavigationFlags)
|
|
|
|
ELSE
|
|
|
|
//if the entity does not exist, what then? might end up aiming at <<0,0,0>>
|
|
TASK_GO_TO_COORD_AND_AIM_AT_HATED_ENTITIES_NEAR_COORD(NULL, vDestination, GET_ENTITY_COORDS(EntityIndex), fMoveSpeed, bShootWhileMoving, fTargetDistance, fSlowDistance, bUseNavmesh, eNavigationFlags)
|
|
|
|
ENDIF
|
|
|
|
ELIF ( bAimAtHatedPeds = FALSE ) // aim at entity does not update aiming when that entity is dead, ped will keep aiming at dead ped
|
|
|
|
IF IS_ENTITY_DEAD(EntityIndex)
|
|
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, vDestination, vAimPosition, fMoveSpeed, bShootWhileMoving, fTargetDistance, fSlowdistance, bUseNavmesh)
|
|
|
|
ELSE
|
|
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(NULL, vDestination, EntityIndex, fMoveSpeed, bShootWhileMoving, fTargetDistance, fSlowDistance, bUseNavmesh)
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF ( bCombatAfterStopped = FALSE )
|
|
|
|
IF IS_ENTITY_DEAD(EntityIndex)
|
|
|
|
IF ( bShootAfterStopped = TRUE )
|
|
|
|
TASK_SHOOT_AT_COORD(NULL, vAimPosition, iAimShootTime, eFiringType)
|
|
|
|
ELSE
|
|
|
|
TASK_AIM_GUN_AT_COORD(NULL, vAimPosition, iAimShootTime)
|
|
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
IF ( bShootAfterStopped = TRUE )
|
|
|
|
TASK_SHOOT_AT_ENTITY(NULL, EntityIndex, iAimShootTime, eFiringType)
|
|
|
|
ELSE
|
|
|
|
TASK_AIM_GUN_AT_ENTITY(NULL, EntityIndex, iAimShootTime)
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF ( bUnblockEvents = TRUE )
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
ENDIF
|
|
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, fCombatRange)
|
|
|
|
CLOSE_SEQUENCE_TASK(SequenceIndex)
|
|
|
|
TASK_PERFORM_SEQUENCE(PedIndex, SequenceIndex)
|
|
|
|
CLEAR_SEQUENCE_TASK(SequenceIndex)
|
|
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC COMBAT_SEQUENCE_GO_TO_COVER_WHILE_AIMING_THEN_COMBAT(PED_INDEX PedIndex, VECTOR vDestination, FLOAT fMoveSpeed,
|
|
BOOL bAimAtHatedPeds, VECTOR vAimPosition, ENTITY_INDEX EntityIndex = NULL,
|
|
BOOL bShootWhileMoving = FALSE, INT iTimeInCover = 1000, BOOL bCanPeekAndAim = FALSE,
|
|
BOOL bForceFaceDirection = FALSE, BOOL bForceFaceLeft = FALSE,
|
|
BOOL bAimShootAfterStopped = FALSE, BOOL bShootAfterStopped = FALSE,
|
|
INT iAimShootTime = 1000, FIRING_TYPE eFiringType = FIRING_TYPE_RANDOM_BURSTS,
|
|
BOOL bUnblockEvents = TRUE, FLOAT fTargetDistance = 0.5,
|
|
FLOAT fSlowDistance = 0.5, BOOL bUseNavmesh = TRUE, FLOAT fCombatRange = 100.0,
|
|
ENAV_SCRIPT_FLAGS eNavigationFlags = ENAV_DEFAULT)
|
|
|
|
IF NOT IS_PED_INJURED(PedIndex)
|
|
|
|
SEQUENCE_INDEX SequenceIndex
|
|
|
|
OPEN_SEQUENCE_TASK(SequenceIndex)
|
|
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
|
|
IF ( bAimAtHatedPeds = TRUE ) //aim at hated entities makes the ped automatically change aiming to nearest hated ped, once the initial ped is dead
|
|
|
|
IF IS_ENTITY_DEAD(EntityIndex)
|
|
|
|
TASK_GO_TO_COORD_AND_AIM_AT_HATED_ENTITIES_NEAR_COORD(NULL, vDestination, vAimPosition, fMoveSpeed, bShootWhileMoving, fTargetDistance, fSlowDistance, bUseNavmesh, eNavigationFlags)
|
|
|
|
ELSE
|
|
|
|
//if the entity does not exist, what then? might end up aiming at <<0,0,0>>
|
|
TASK_GO_TO_COORD_AND_AIM_AT_HATED_ENTITIES_NEAR_COORD(NULL, vDestination, GET_ENTITY_COORDS(EntityIndex), fMoveSpeed, bShootWhileMoving, fTargetDistance, fSlowDistance, bUseNavmesh, eNavigationFlags)
|
|
|
|
ENDIF
|
|
|
|
ELIF ( bAimAtHatedPeds = FALSE ) // aim at entity does not update aiming when that entity is dead, ped will keep aiming at dead ped
|
|
|
|
IF IS_ENTITY_DEAD(EntityIndex)
|
|
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, vDestination, vAimPosition, fMoveSpeed, bShootWhileMoving, fTargetDistance, fSlowdistance, bUseNavmesh)
|
|
|
|
ELSE
|
|
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(NULL, vDestination, EntityIndex, fMoveSpeed, bShootWhileMoving, fTargetDistance, fSlowDistance, bUseNavmesh)
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF ( bAimShootAfterStopped = TRUE )
|
|
|
|
IF IS_ENTITY_DEAD(EntityIndex)
|
|
|
|
IF ( bShootAfterStopped = TRUE )
|
|
|
|
TASK_SHOOT_AT_COORD(NULL, vAimPosition, iAimShootTime, eFiringType)
|
|
|
|
ELSE
|
|
|
|
TASK_AIM_GUN_AT_COORD(NULL, vAimPosition, iAimShootTime)
|
|
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
IF ( bShootAfterStopped = TRUE )
|
|
|
|
TASK_SHOOT_AT_ENTITY(NULL, EntityIndex, iAimShootTime, eFiringType)
|
|
|
|
ELSE
|
|
|
|
TASK_AIM_GUN_AT_ENTITY(NULL, EntityIndex, iAimShootTime)
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
TASK_PUT_PED_DIRECTLY_INTO_COVER(NULL, vDestination, iTimeInCover, bCanPeekAndAim, 1.5, bForceFaceDirection, bForceFaceLeft, NULL, TRUE)
|
|
|
|
IF ( bUnblockEvents = TRUE )
|
|
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
|
|
ENDIF
|
|
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, fCombatRange)
|
|
|
|
CLOSE_SEQUENCE_TASK(SequenceIndex)
|
|
|
|
TASK_PERFORM_SEQUENCE(PedIndex, SequenceIndex)
|
|
|
|
CLEAR_SEQUENCE_TASK(SequenceIndex)
|
|
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
//|========================== END COMBAT PROCEDURES & FUNCTIONS ==========================|
|
|
|
|
//|=============================== MISSION STAGES FUNCTIONS ==============================|
|
|
|
|
FUNC BOOL IS_MISSION_STAGE_CUTSCENE_INTRO_COMPLETED(INT &iStageProgress)
|
|
|
|
SWITCH iStageProgress
|
|
|
|
CASE 0
|
|
|
|
IF ( GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL )
|
|
|
|
IF HAS_REQUESTED_CUTSCENE_LOADED("mic_1_int", CS_SECTION_1 | CS_SECTION_2 | CS_SECTION_3 | CS_SECTION_4)
|
|
|
|
REGISTER_ENTITY_FOR_CUTSCENE(psTrevor.PedIndex, "Trevor", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, GET_PLAYER_PED_MODEL(CHAR_TREVOR))
|
|
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
|
|
|
|
START_CUTSCENE()
|
|
|
|
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
iStageProgress++
|
|
|
|
ELSE
|
|
|
|
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
|
|
//Michael's variations
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", PLAYER_PED_ID())
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ELIF ( GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR )
|
|
//Activate multihead blinders early
|
|
SET_MULTIHEAD_SAFE(TRUE,TRUE)
|
|
|
|
IF HAS_REQUESTED_CUTSCENE_LOADED("mic_1_int", CS_SECTION_2 | CS_SECTION_3 | CS_SECTION_4 | CS_SECTION_5)
|
|
|
|
IF DOES_ENTITY_EXIST(g_sTriggerSceneAssets.ped[0])
|
|
IF NOT IS_ENTITY_DEAD(g_sTriggerSceneAssets.ped[0])
|
|
|
|
SET_ENTITY_AS_MISSION_ENTITY(g_sTriggerSceneAssets.ped[0], TRUE, TRUE)
|
|
|
|
psMichael.PedIndex = g_sTriggerSceneAssets.ped[0]
|
|
|
|
SET_MISSION_PED_PROPERTIES(psMichael.PedIndex, RELGROUPHASH_PLAYER, FALSE, TRUE, FALSE, FALSE)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
SET_PED_NAME_DEBUG(psMichael.PedIndex, "TS_Michael")
|
|
#ENDIF
|
|
|
|
REGISTER_ENTITY_FOR_CUTSCENE(psMichael.PedIndex, "Michael", CU_ANIMATE_AND_DELETE_EXISTING_SCRIPT_ENTITY, PLAYER_ZERO)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(g_sTriggerSceneAssets.veh[0])
|
|
IF IS_VEHICLE_DRIVEABLE(g_sTriggerSceneAssets.veh[0])
|
|
|
|
SET_ENTITY_AS_MISSION_ENTITY(g_sTriggerSceneAssets.veh[0], TRUE, TRUE)
|
|
|
|
vsMichaelsCar.VehicleIndex = g_sTriggerSceneAssets.veh[0]
|
|
|
|
SET_VEHICLE_ENGINE_ON(vsMichaelsCar.VehicleIndex, TRUE, TRUE)
|
|
SET_VEHICLE_LIGHTS(vsMichaelsCar.VehicleIndex, SET_VEHICLE_LIGHTS_ON)
|
|
SET_VEHICLE_USE_PLAYER_LIGHT_SETTINGS(vsMichaelsCar.VehicleIndex, TRUE)
|
|
SET_VEHICLE_DOORS_LOCKED(vsMichaelsCar.VehicleIndex, VEHICLELOCK_UNLOCKED)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(vsMichaelsCar.VehicleIndex, "Michaels_car", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, TAILGATER)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
SET_VEHICLE_NAME_DEBUG(vsMichaelsCar.VehicleIndex, "TS_Michaels_Car")
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Registering trigger scene vehicle for intro cutscene as Michaels_car.")
|
|
#ENDIF
|
|
|
|
ELSE
|
|
|
|
SET_ENTITY_AS_MISSION_ENTITY(g_sTriggerSceneAssets.veh[0], TRUE, TRUE)
|
|
DELETE_VEHICLE(g_sTriggerSceneAssets.veh[0])
|
|
CLEAR_AREA(vsMichaelsCar.vPosition, 10.0, TRUE)
|
|
|
|
REGISTER_ENTITY_FOR_CUTSCENE(vsMichaelsCar.VehicleIndex, "Michaels_car", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, TAILGATER)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Registering Michaels_car to be created by the cutscene due to trigger scene vehcile being undriveable.")
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
IF IS_REPLAY_START_VEHICLE_AVAILABLE()
|
|
AND GET_REPLAY_VEHICLE_OWNER(TRUE) = CHAR_TREVOR
|
|
AND DOES_ENTITY_EXIST(GET_MISSION_START_VEHICLE_INDEX())
|
|
AND IS_VEHICLE_DRIVEABLE(GET_MISSION_START_VEHICLE_INDEX(), TRUE)
|
|
|
|
IF IS_VEHICLE_A_PLAYER_PERSONAL_VEHICLE(GET_MISSION_START_VEHICLE_INDEX(), CHAR_MICHAEL)
|
|
|
|
SET_ENTITY_AS_MISSION_ENTITY(GET_MISSION_START_VEHICLE_INDEX(), TRUE, TRUE)
|
|
|
|
vsMichaelsCar.VehicleIndex = GET_MISSION_START_VEHICLE_INDEX()
|
|
|
|
SET_VEHICLE_AS_MISSION_CRITICAL(vsMichaelsCar, TRUE)
|
|
SET_VEHICLE_ENGINE_ON(vsMichaelsCar.VehicleIndex, TRUE, TRUE)
|
|
SET_VEHICLE_LIGHTS(vsMichaelsCar.VehicleIndex, SET_VEHICLE_LIGHTS_ON)
|
|
|
|
SET_ENTITY_HEALTH(vsMichaelsCar.VehicleIndex, GET_ENTITY_HEALTH(vsMichaelsCar.VehicleIndex) + 500)
|
|
SET_VEHICLE_ENGINE_HEALTH(vsMichaelsCar.VehicleIndex, GET_VEHICLE_ENGINE_HEALTH(vsMichaelsCar.VehicleIndex) + 500)
|
|
SET_VEHICLE_PETROL_TANK_HEALTH(vsMichaelsCar.VehicleIndex, GET_VEHICLE_PETROL_TANK_HEALTH(vsMichaelsCar.VehicleIndex) + 500)
|
|
STOP_FIRE_IN_RANGE(GET_ENTITY_COORDS(vsMichaelsCar.VehicleIndex), 2.5)
|
|
|
|
IF IS_VEHICLE_TYRE_BURST(vsMichaelsCar.VehicleIndex, SC_WHEEL_CAR_FRONT_LEFT)
|
|
SET_VEHICLE_TYRE_FIXED(vsMichaelsCar.VehicleIndex, SC_WHEEL_CAR_FRONT_LEFT)
|
|
ENDIF
|
|
IF IS_VEHICLE_TYRE_BURST(vsMichaelsCar.VehicleIndex, SC_WHEEL_CAR_FRONT_RIGHT)
|
|
SET_VEHICLE_TYRE_FIXED(vsMichaelsCar.VehicleIndex, SC_WHEEL_CAR_FRONT_RIGHT)
|
|
ENDIF
|
|
IF IS_VEHICLE_TYRE_BURST(vsMichaelsCar.VehicleIndex, SC_WHEEL_CAR_REAR_LEFT)
|
|
SET_VEHICLE_TYRE_FIXED(vsMichaelsCar.VehicleIndex, SC_WHEEL_CAR_REAR_LEFT)
|
|
ENDIF
|
|
IF IS_VEHICLE_TYRE_BURST(vsMichaelsCar.VehicleIndex, SC_WHEEL_CAR_REAR_RIGHT)
|
|
SET_VEHICLE_TYRE_FIXED(vsMichaelsCar.VehicleIndex, SC_WHEEL_CAR_REAR_RIGHT)
|
|
ENDIF
|
|
|
|
REGISTER_ENTITY_FOR_CUTSCENE(vsMichaelsCar.VehicleIndex, "Michaels_car", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, TAILGATER)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Registering Trevor's mission start vehicle with intro cutscene as it was player CHAR_MICHAEL personal vehicle.")
|
|
#ENDIF
|
|
|
|
|
|
ELSE
|
|
|
|
REGISTER_ENTITY_FOR_CUTSCENE(vsMichaelsCar.VehicleIndex, "Michaels_car", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, TAILGATER)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Registering Michaels_car to be created by the cutscene due to trigger scene vehicle not existing and CHAR_TREVOR mission start vehicle not being CHAR_MICHAEL personal vehicle.")
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
REGISTER_ENTITY_FOR_CUTSCENE(vsMichaelsCar.VehicleIndex, "Michaels_car", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, TAILGATER)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Registering Michaels_car to be created by the cutscene due to trigger scene vehicle not existing and mission start vehicle not existing.")
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
|
|
|
|
START_CUTSCENE(CUTSCENE_SUPPRESS_FP_TRANSITION_FLASH)
|
|
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
|
|
iStageProgress++
|
|
|
|
ELSE
|
|
|
|
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
|
|
//Trevor's variations
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Trevor", PLAYER_PED_ID())
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 1 //fade screen in if screen was faded out due to shit skip or debug skip
|
|
|
|
IF IS_CUTSCENE_PLAYING()
|
|
|
|
IF IS_VEHICLE_GEN_AVAILABLE(VEHGEN_MICHAEL_SAVEHOUSE)
|
|
AND DOES_ENTITY_EXIST(GET_VEHICLE_GEN_VEHICLE_INDEX(VEHGEN_MICHAEL_SAVEHOUSE))
|
|
AND IS_VEHICLE_DRIVEABLE(GET_VEHICLE_GEN_VEHICLE_INDEX(VEHGEN_MICHAEL_SAVEHOUSE), TRUE)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Vehicle gen vehicle VEHGEN_MICHAEL_SAVEHOUSE is available for mission use.")
|
|
#ENDIF
|
|
|
|
IF NOT DOES_ENTITY_BELONG_TO_THIS_SCRIPT(GET_VEHICLE_GEN_VEHICLE_INDEX(VEHGEN_MICHAEL_SAVEHOUSE))
|
|
|
|
SET_ENTITY_AS_MISSION_ENTITY(GET_VEHICLE_GEN_VEHICLE_INDEX(VEHGEN_MICHAEL_SAVEHOUSE), TRUE, TRUE)
|
|
|
|
vsMichaelsCar.VehicleIndex = GET_VEHICLE_GEN_VEHICLE_INDEX(VEHGEN_MICHAEL_SAVEHOUSE)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting vehicle gen vehicle VEHGEN_MICHAEL_SAVEHOUSE as mission entity.")
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(vsMichaelsCar.VehicleIndex)
|
|
|
|
STOP_FIRE_IN_RANGE(GET_ENTITY_COORDS(vsMichaelsCar.VehicleIndex), 2.5)
|
|
SET_ENTITY_HEALTH(vsMichaelsCar.VehicleIndex, GET_ENTITY_HEALTH(vsMichaelsCar.VehicleIndex) + 500)
|
|
SET_VEHICLE_ENGINE_HEALTH(vsMichaelsCar.VehicleIndex, GET_VEHICLE_ENGINE_HEALTH(vsMichaelsCar.VehicleIndex) + 500)
|
|
SET_VEHICLE_PETROL_TANK_HEALTH(vsMichaelsCar.VehicleIndex, GET_VEHICLE_PETROL_TANK_HEALTH(vsMichaelsCar.VehicleIndex) + 500)
|
|
|
|
IF IS_VEHICLE_TYRE_BURST(vsMichaelsCar.VehicleIndex, SC_WHEEL_CAR_FRONT_LEFT)
|
|
SET_VEHICLE_TYRE_FIXED(vsMichaelsCar.VehicleIndex, SC_WHEEL_CAR_FRONT_LEFT)
|
|
ENDIF
|
|
IF IS_VEHICLE_TYRE_BURST(vsMichaelsCar.VehicleIndex, SC_WHEEL_CAR_FRONT_RIGHT)
|
|
SET_VEHICLE_TYRE_FIXED(vsMichaelsCar.VehicleIndex, SC_WHEEL_CAR_FRONT_RIGHT)
|
|
ENDIF
|
|
IF IS_VEHICLE_TYRE_BURST(vsMichaelsCar.VehicleIndex, SC_WHEEL_CAR_REAR_LEFT)
|
|
SET_VEHICLE_TYRE_FIXED(vsMichaelsCar.VehicleIndex, SC_WHEEL_CAR_REAR_LEFT)
|
|
ENDIF
|
|
IF IS_VEHICLE_TYRE_BURST(vsMichaelsCar.VehicleIndex, SC_WHEEL_CAR_REAR_RIGHT)
|
|
SET_VEHICLE_TYRE_FIXED(vsMichaelsCar.VehicleIndex, SC_WHEEL_CAR_REAR_RIGHT)
|
|
ENDIF
|
|
|
|
SET_VEHICLE_AS_MISSION_CRITICAL(vsMichaelsCar, TRUE)
|
|
SET_VEHICLE_ENGINE_ON(vsMichaelsCar.VehicleIndex, FALSE, TRUE)
|
|
SET_ENTITY_COORDS(vsMichaelsCar.VehicleIndex, vsMichaelsCar.vPosition)
|
|
SET_ENTITY_HEADING(vsMichaelsCar.VehicleIndex, vsMichaelsCar.fHeading)
|
|
SET_VEHICLE_ON_GROUND_PROPERLY(vsMichaelsCar.VehicleIndex)
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF IS_REPLAY_START_VEHICLE_AVAILABLE()
|
|
|
|
SWITCH GET_REPLAY_VEHICLE_OWNER(TRUE)
|
|
|
|
CASE CHAR_MICHAEL
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Replay start vehicle is available for player ped CHAR_MICHAEL.")
|
|
#ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(GET_PLAYERS_LAST_VEHICLE()) AND IS_VEHICLE_DRIVEABLE(GET_PLAYERS_LAST_VEHICLE(), TRUE)
|
|
|
|
IF IS_THIS_MODEL_A_CAR(GET_ENTITY_MODEL(GET_PLAYERS_LAST_VEHICLE()))
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Last player CHAR_MICHAEL vehicle is model ", GET_MODEL_NAME_FOR_DEBUG(GET_ENTITY_MODEL(GET_PLAYERS_LAST_VEHICLE())), " which is allowed for mission.")
|
|
#ENDIF
|
|
|
|
IF NOT DOES_ENTITY_EXIST(vsMichaelsCar.VehicleIndex)
|
|
|
|
IF NOT IS_ENTITY_A_MISSION_ENTITY(GET_PLAYERS_LAST_VEHICLE())
|
|
SET_ENTITY_AS_MISSION_ENTITY(GET_PLAYERS_LAST_VEHICLE())
|
|
ENDIF
|
|
|
|
vsMichaelsCar.VehicleIndex = GET_PLAYERS_LAST_VEHICLE()
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting last player CHAR_MICHAEL vehicle with model ", GET_MODEL_NAME_FOR_DEBUG(GET_ENTITY_MODEL(GET_PLAYERS_LAST_VEHICLE())), " as mission entity.")
|
|
#ENDIF
|
|
|
|
SET_VEHICLE_AS_MISSION_CRITICAL(vsMichaelsCar, TRUE)
|
|
SET_ENTITY_HEALTH(vsMichaelsCar.VehicleIndex, GET_ENTITY_HEALTH(vsMichaelsCar.VehicleIndex) + 500)
|
|
SET_VEHICLE_ENGINE_HEALTH(vsMichaelsCar.VehicleIndex, GET_VEHICLE_ENGINE_HEALTH(vsMichaelsCar.VehicleIndex) + 500)
|
|
SET_VEHICLE_PETROL_TANK_HEALTH(vsMichaelsCar.VehicleIndex, GET_VEHICLE_PETROL_TANK_HEALTH(vsMichaelsCar.VehicleIndex) + 500)
|
|
STOP_FIRE_IN_RANGE(GET_ENTITY_COORDS(vsMichaelsCar.VehicleIndex), 2.5)
|
|
|
|
IF IS_VEHICLE_TYRE_BURST(vsMichaelsCar.VehicleIndex, SC_WHEEL_CAR_FRONT_LEFT)
|
|
SET_VEHICLE_TYRE_FIXED(vsMichaelsCar.VehicleIndex, SC_WHEEL_CAR_FRONT_LEFT)
|
|
ENDIF
|
|
IF IS_VEHICLE_TYRE_BURST(vsMichaelsCar.VehicleIndex, SC_WHEEL_CAR_FRONT_RIGHT)
|
|
SET_VEHICLE_TYRE_FIXED(vsMichaelsCar.VehicleIndex, SC_WHEEL_CAR_FRONT_RIGHT)
|
|
ENDIF
|
|
IF IS_VEHICLE_TYRE_BURST(vsMichaelsCar.VehicleIndex, SC_WHEEL_CAR_REAR_LEFT)
|
|
SET_VEHICLE_TYRE_FIXED(vsMichaelsCar.VehicleIndex, SC_WHEEL_CAR_REAR_LEFT)
|
|
ENDIF
|
|
IF IS_VEHICLE_TYRE_BURST(vsMichaelsCar.VehicleIndex, SC_WHEEL_CAR_REAR_RIGHT)
|
|
SET_VEHICLE_TYRE_FIXED(vsMichaelsCar.VehicleIndex, SC_WHEEL_CAR_REAR_RIGHT)
|
|
ENDIF
|
|
|
|
SET_VEHICLE_DOORS_SHUT(vsMichaelsCar.VehicleIndex, TRUE)
|
|
SET_VEHICLE_ENGINE_ON(vsMichaelsCar.VehicleIndex, FALSE, TRUE)
|
|
SET_ENTITY_COORDS(vsMichaelsCar.VehicleIndex, vsMichaelsCar.vPosition)
|
|
SET_ENTITY_HEADING(vsMichaelsCar.VehicleIndex, vsMichaelsCar.fHeading)
|
|
SET_VEHICLE_ON_GROUND_PROPERLY(vsMichaelsCar.VehicleIndex)
|
|
|
|
ELSE
|
|
|
|
DELETE_VEHICLE_GEN_VEHICLE(VEHGEN_MISSION_VEH)
|
|
SET_VEHICLE_DOORS_SHUT(GET_PLAYERS_LAST_VEHICLE(), TRUE)
|
|
SET_VEHICLE_ENGINE_ON(GET_PLAYERS_LAST_VEHICLE(), FALSE, TRUE)
|
|
SET_ENTITY_COORDS(GET_PLAYERS_LAST_VEHICLE(), vsTrevorsCar.vPosition)
|
|
SET_ENTITY_HEADING(GET_PLAYERS_LAST_VEHICLE(), vsTrevorsCar.fHeading)
|
|
SET_VEHICLE_ON_GROUND_PROPERLY(GET_PLAYERS_LAST_VEHICLE())
|
|
SET_MISSION_VEHICLE_GEN_VEHICLE(GET_PLAYERS_LAST_VEHICLE(), vsTrevorsCar.vPosition, vsTrevorsCar.fHeading)
|
|
CLEAR_MUST_LEAVE_AREA_VEHICLE_GEN_FLAG(VEHGEN_MISSION_VEH)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting last player CHAR_MICHAEL vehicle with model ", GET_MODEL_NAME_FOR_DEBUG(GET_ENTITY_MODEL(GET_PLAYERS_LAST_VEHICLE())), " as mission vehicle gen vehicle.")
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Last player CHAR_MICHAEL vehicle is model ", GET_MODEL_NAME_FOR_DEBUG(GET_ENTITY_MODEL(GET_PLAYERS_LAST_VEHICLE())), " which is not allowed for mission.")
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE CHAR_TREVOR
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Replay start vehicle is available for player ped CHAR_TREVOR.")
|
|
#ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(GET_PLAYERS_LAST_VEHICLE())
|
|
AND IS_VEHICLE_DRIVEABLE(GET_PLAYERS_LAST_VEHICLE(), TRUE)
|
|
AND NOT IS_THIS_MODEL_A_HELI(GET_ENTITY_MODEL(GET_PLAYERS_LAST_VEHICLE()))
|
|
AND NOT IS_THIS_MODEL_A_PLANE(GET_ENTITY_MODEL(GET_PLAYERS_LAST_VEHICLE()))
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Last player CHAR_TREVOR vehicle is model ", GET_MODEL_NAME_FOR_DEBUG(GET_ENTITY_MODEL(GET_PLAYERS_LAST_VEHICLE())), " which is allowed for mission.")
|
|
#ENDIF
|
|
|
|
IF NOT IS_VEHICLE_A_PLAYER_PERSONAL_VEHICLE(GET_PLAYERS_LAST_VEHICLE(), CHAR_MICHAEL)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Last player CHAR_TREVOR vehicle with model ", GET_MODEL_NAME_FOR_DEBUG(GET_ENTITY_MODEL(GET_PLAYERS_LAST_VEHICLE())), " is not a personal vehicle of ped CHAR_MICHAEL.")
|
|
#ENDIF
|
|
|
|
IF NOT IS_ENTITY_A_MISSION_ENTITY(GET_PLAYERS_LAST_VEHICLE())
|
|
SET_ENTITY_AS_MISSION_ENTITY(GET_PLAYERS_LAST_VEHICLE())
|
|
ENDIF
|
|
|
|
SET_ENTITY_HEALTH(GET_PLAYERS_LAST_VEHICLE(), GET_ENTITY_HEALTH(GET_PLAYERS_LAST_VEHICLE()) + 500)
|
|
SET_VEHICLE_ENGINE_HEALTH(GET_PLAYERS_LAST_VEHICLE(), GET_VEHICLE_ENGINE_HEALTH(GET_PLAYERS_LAST_VEHICLE()) + 500)
|
|
SET_VEHICLE_PETROL_TANK_HEALTH(GET_PLAYERS_LAST_VEHICLE(), GET_VEHICLE_PETROL_TANK_HEALTH(GET_PLAYERS_LAST_VEHICLE()) + 500)
|
|
STOP_FIRE_IN_RANGE(GET_ENTITY_COORDS(GET_PLAYERS_LAST_VEHICLE()), 2.5)
|
|
|
|
IF IS_VEHICLE_TYRE_BURST(GET_PLAYERS_LAST_VEHICLE(), SC_WHEEL_CAR_FRONT_LEFT)
|
|
SET_VEHICLE_TYRE_FIXED(GET_PLAYERS_LAST_VEHICLE(), SC_WHEEL_CAR_FRONT_LEFT)
|
|
ENDIF
|
|
IF IS_VEHICLE_TYRE_BURST(GET_PLAYERS_LAST_VEHICLE(), SC_WHEEL_CAR_FRONT_RIGHT)
|
|
SET_VEHICLE_TYRE_FIXED(GET_PLAYERS_LAST_VEHICLE(), SC_WHEEL_CAR_FRONT_RIGHT)
|
|
ENDIF
|
|
IF IS_VEHICLE_TYRE_BURST(GET_PLAYERS_LAST_VEHICLE(), SC_WHEEL_CAR_REAR_LEFT)
|
|
SET_VEHICLE_TYRE_FIXED(GET_PLAYERS_LAST_VEHICLE(), SC_WHEEL_CAR_REAR_LEFT)
|
|
ENDIF
|
|
IF IS_VEHICLE_TYRE_BURST(GET_PLAYERS_LAST_VEHICLE(), SC_WHEEL_CAR_REAR_RIGHT)
|
|
SET_VEHICLE_TYRE_FIXED(GET_PLAYERS_LAST_VEHICLE(), SC_WHEEL_CAR_REAR_RIGHT)
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Last player CHAR_TREVOR vehicle with model ", GET_MODEL_NAME_FOR_DEBUG(GET_ENTITY_MODEL(GET_PLAYERS_LAST_VEHICLE())), " is a personal vehicle of ped CHAR_MICHAEL.")
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(vsMichaelsCar.VehicleIndex)
|
|
OVERRIDE_REPLAY_CHECKPOINT_VEHICLE(vsMichaelsCar.VehicleIndex)
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Overriding replay checkpoint vehicle with vehicle with model ", GET_MODEL_NAME_FOR_DEBUG(GET_ENTITY_MODEL(vsMichaelsCar.VehicleIndex)), ".")
|
|
#ENDIF
|
|
ENDIF
|
|
|
|
DISABLE_VEHICLE_GEN_ON_MISSION(TRUE)
|
|
//DELETE_VEHICLE_GEN_VEHICLE(VEHGEN_MICHAEL_SAVEHOUSE)
|
|
LOCK_AUTOMATIC_DOOR_OPEN(AUTODOOR_MICHAEL_MANSION_GATE, TRUE)
|
|
|
|
CLEAR_AREA(psMichael.vPosition, 25.0, TRUE)
|
|
CLEAR_AREA_OF_PEDS(psMichael.vPosition, 250.0)
|
|
CLEAR_AREA_OF_VEHICLES(psMichael.vPosition, 250.0)
|
|
CLEAR_AREA_OF_PROJECTILES(psMichael.vPosition, 250.0)
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
REMOVE_PED_HELMET(PLAYER_PED_ID(), TRUE)
|
|
ENDIF
|
|
|
|
IF IS_SCREEN_FADED_OUT()
|
|
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
|
|
ENDIF
|
|
|
|
iStageProgress++
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 2
|
|
|
|
//create player peds by extracting them from mocap cutscene
|
|
IF ( GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL )
|
|
IF NOT DOES_ENTITY_EXIST(psTrevor.PedIndex)
|
|
IF DOES_CUTSCENE_ENTITY_EXIST("Trevor")
|
|
IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Trevor"))
|
|
|
|
psTrevor.PedIndex = GET_PED_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Trevor"))
|
|
|
|
SET_MISSION_PED_PROPERTIES(psTrevor.PedIndex, RELGROUPHASH_PLAYER, FALSE, TRUE, FALSE, FALSE)
|
|
|
|
sSelectorPeds.pedID[SELECTOR_PED_TREVOR] = psTrevor.PedIndex
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Set up properites for mission player ped Trevor created in the intro cutscene.")
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//create vehicles during mocap cutscene
|
|
IF IS_CUTSCENE_PLAYING()
|
|
|
|
//create Michael's car for the mission
|
|
IF NOT DOES_ENTITY_EXIST(vsMichaelsCar.VehicleIndex)
|
|
|
|
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
|
|
|
|
CASE CHAR_MICHAEL
|
|
|
|
IF IS_REPLAY_START_VEHICLE_AVAILABLE()
|
|
AND DOES_ENTITY_EXIST(GET_PLAYERS_LAST_VEHICLE())
|
|
AND IS_VEHICLE_DRIVEABLE(GET_PLAYERS_LAST_VEHICLE())
|
|
AND IS_THIS_MODEL_A_CAR(GET_ENTITY_MODEL(GET_PLAYERS_LAST_VEHICLE()))
|
|
|
|
vsMichaelsCar.VehicleIndex = GET_PLAYERS_LAST_VEHICLE()
|
|
|
|
IF NOT IS_ENTITY_A_MISSION_ENTITY(vsMichaelsCar.VehicleIndex)
|
|
SET_ENTITY_AS_MISSION_ENTITY(vsMichaelsCar.VehicleIndex)
|
|
ENDIF
|
|
|
|
SET_VEHICLE_AS_MISSION_CRITICAL(vsMichaelsCar, TRUE)
|
|
|
|
SET_ENTITY_COORDS(vsMichaelsCar.VehicleIndex, vsMichaelsCar.vPosition)
|
|
SET_ENTITY_HEADING(vsMichaelsCar.VehicleIndex, vsMichaelsCar.fHeading)
|
|
|
|
SET_VEHICLE_DOORS_SHUT(vsMichaelsCar.VehicleIndex)
|
|
SET_VEHICLE_ON_GROUND_PROPERLY(vsMichaelsCar.VehicleIndex)
|
|
SET_VEHICLE_DOORS_LOCKED(vsMichaelsCar.VehicleIndex, VEHICLELOCK_UNLOCKED)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
SET_VEHICLE_NAME_DEBUG(vsMichaelsCar.VehicleIndex, "RS_Michaels_Car")
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Using player's replay start vehicle as Michael's mission vehicle for player to use.")
|
|
#ENDIF
|
|
|
|
ELSE
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Creating Michael's car during intro cutscene for player to use.")
|
|
#ENDIF
|
|
HAS_MISSION_VEHICLE_BEEN_CREATED(vsMichaelsCar, TRUE, FALSE, CHAR_MICHAEL, TRUE, -1, -1, -1 #IF IS_DEBUG_BUILD, "M_Michaels_Car" #ENDIF)
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE CHAR_TREVOR
|
|
|
|
IF DOES_CUTSCENE_ENTITY_EXIST("Michaels_car")
|
|
IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Michaels_car"))
|
|
|
|
vsMichaelsCar.VehicleIndex = GET_VEHICLE_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Michaels_car"))
|
|
|
|
SET_VEHICLE_AS_MISSION_CRITICAL(vsMichaelsCar, TRUE)
|
|
SET_VEHICLE_ENGINE_ON(vsMichaelsCar.VehicleIndex, TRUE, TRUE)
|
|
SET_VEHICLE_LIGHTS(vsMichaelsCar.VehicleIndex, SET_VEHICLE_LIGHTS_ON)
|
|
SET_VEHICLE_USE_PLAYER_LIGHT_SETTINGS(vsMichaelsCar.VehicleIndex, TRUE)
|
|
SET_VEHICLE_DOORS_LOCKED(vsMichaelsCar.VehicleIndex, VEHICLELOCK_UNLOCKED)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
SET_VEHICLE_NAME_DEBUG(vsMichaelsCar.VehicleIndex, "CS_Michaels_Car")
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created vehicle Michaels_car from the cutscene.")
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
ELSE
|
|
IF NOT IS_ENTITY_DEAD(vsMichaelsCar.VehicleIndex)
|
|
REQUEST_VEHICLE_HIGH_DETAIL_MODEL(vsMichaelsCar.VehicleIndex)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//create Trevor's car parked in the back of the driveway
|
|
IF NOT DOES_ENTITY_EXIST(vsTrevorsCar.VehicleIndex)
|
|
|
|
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
|
|
|
|
CASE CHAR_MICHAEL
|
|
//don't create Trevor's car when player is Michael
|
|
BREAK
|
|
|
|
CASE CHAR_TREVOR
|
|
|
|
IF IS_REPLAY_START_VEHICLE_AVAILABLE() AND GET_REPLAY_VEHICLE_OWNER(TRUE) = CHAR_TREVOR
|
|
AND DOES_ENTITY_EXIST(GET_PLAYERS_LAST_VEHICLE()) AND IS_VEHICLE_DRIVEABLE(GET_PLAYERS_LAST_VEHICLE())
|
|
|
|
vsTrevorsCar.VehicleIndex = GET_PLAYERS_LAST_VEHICLE()
|
|
|
|
IF NOT IS_ENTITY_A_MISSION_ENTITY(vsTrevorsCar.VehicleIndex)
|
|
SET_ENTITY_AS_MISSION_ENTITY(vsTrevorsCar.VehicleIndex)
|
|
ENDIF
|
|
|
|
SET_VEHICLE_AS_MISSION_CRITICAL(vsTrevorsCar, TRUE)
|
|
|
|
SET_ENTITY_COORDS(vsTrevorsCar.VehicleIndex, vsTrevorsCar.vPosition)
|
|
SET_ENTITY_HEADING(vsTrevorsCar.VehicleIndex, vsTrevorsCar.fHeading)
|
|
|
|
SET_VEHICLE_DOORS_SHUT(vsTrevorsCar.VehicleIndex)
|
|
SET_VEHICLE_ON_GROUND_PROPERLY(vsTrevorsCar.VehicleIndex)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
SET_VEHICLE_NAME_DEBUG(vsTrevorsCar.VehicleIndex, "RS_Trevors_Car")
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Using player's replay start vehicle as Trevor's mission vehicle for player to use.")
|
|
#ENDIF
|
|
|
|
ELSE
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Creating Trevor's car during intro cutscene for player to use.")
|
|
#ENDIF
|
|
HAS_MISSION_VEHICLE_BEEN_CREATED(vsTrevorsCar, TRUE, FALSE, CHAR_TREVOR, TRUE, -1, -1, -1 #IF IS_DEBUG_BUILD, "M_Trevors_Car" #ENDIF)
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
ELSE
|
|
IF NOT IS_ENTITY_DEAD(vsTrevorsCar.VehicleIndex)
|
|
REQUEST_VEHICLE_HIGH_DETAIL_MODEL(vsTrevorsCar.VehicleIndex)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michaels_car")
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY() returned true for Michaels_car.")
|
|
#ENDIF
|
|
|
|
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
|
|
CASE CHAR_MICHAEL
|
|
//don't do anything when playing mission as Michael
|
|
BREAK
|
|
CASE CHAR_TREVOR
|
|
IF IS_VEHICLE_DRIVEABLE(vsMichaelsCar.VehicleIndex)
|
|
SET_VEHICLE_ENGINE_ON(vsMichaelsCar.VehicleIndex, TRUE, TRUE)
|
|
SET_VEHICLE_FORWARD_SPEED(vsMichaelsCar.VehicleIndex, 10.0)
|
|
SET_VEHICLE_DOORS_LOCKED(vsMichaelsCar.VehicleIndex, VEHICLELOCK_UNLOCKED)
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michael")
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY() returned true for Michael.")
|
|
#ENDIF
|
|
|
|
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
|
|
CASE CHAR_MICHAEL
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
IF ( bCutsceneSkipped = FALSE )
|
|
SET_PED_STEALTH_MOVEMENT(PLAYER_PED_ID(), FALSE)
|
|
WARP_PED(PLAYER_PED_ID(), <<-808.4427, 177.8966, 71.3801>>, 18.2986, FALSE, TRUE, FALSE)
|
|
SEQUENCE_INDEX SequenceIndex
|
|
CLEAR_SEQUENCE_TASK(SequenceIndex)
|
|
OPEN_SEQUENCE_TASK(SequenceIndex)
|
|
IF GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_ON_FOOT) = CAM_VIEW_MODE_FIRST_PERSON
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, << -809.27, 179.55, 71.15 >>, PEDMOVE_RUN, DEFAULT_TIME_BEFORE_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_NO_STOPPING)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, << -811.32, 180.11, 71.15 >>, PEDMOVE_RUN, DEFAULT_TIME_BEFORE_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_NO_STOPPING)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, << -813.92, 179.22, 71.16 >>, PEDMOVE_RUN, DEFAULT_TIME_BEFORE_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_STOP_EXACTLY, 111.3824)
|
|
ELSE
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, << -809.27, 179.55, 71.15 >>, PEDMOVE_RUN, DEFAULT_TIME_BEFORE_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_NO_STOPPING)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, << -811.32, 180.11, 71.15 >>, PEDMOVE_RUN, DEFAULT_TIME_BEFORE_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_NO_STOPPING)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, << -813.17, 179.48, 71.16 >>, PEDMOVE_RUN, DEFAULT_TIME_BEFORE_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_NO_STOPPING)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, << -813.92, 179.22, 71.16 >>, PEDMOVE_RUN, DEFAULT_TIME_BEFORE_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_SUPPRESS_EXACT_STOP)
|
|
ENDIF
|
|
CLOSE_SEQUENCE_TASK(SequenceIndex)
|
|
TASK_PERFORM_SEQUENCE(PLAYER_PED_ID(), SequenceIndex)
|
|
CLEAR_SEQUENCE_TASK(SequenceIndex)
|
|
FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_ON_FOOT_RUN, FALSE, FAUS_CUTSCENE_EXIT)
|
|
ELSE
|
|
SET_PED_STEALTH_MOVEMENT(PLAYER_PED_ID(), FALSE)
|
|
WARP_PED(PLAYER_PED_ID(), <<-813.9473, 179.2056, 71.1592>>, 111.3824, FALSE, TRUE, FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
CASE CHAR_TREVOR
|
|
//
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Trevor")
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY() returned true for Trevor.")
|
|
#ENDIF
|
|
|
|
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
|
|
CASE CHAR_MICHAEL
|
|
IF DOES_ENTITY_EXIST(psTrevor.PedIndex)
|
|
IF NOT IS_ENTITY_DEAD(psTrevor.PedIndex)
|
|
IF DOES_ENTITY_EXIST(vsMichaelsCar.VehicleIndex)
|
|
IF NOT IS_ENTITY_DEAD(vsMichaelsCar.VehicleIndex)
|
|
SET_PED_INTO_VEHICLE(psTrevor.PedIndex, vsMichaelsCar.VehicleIndex, VS_DRIVER)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
CASE CHAR_TREVOR
|
|
|
|
IF GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_IN_VEHICLE) = CAM_VIEW_MODE_FIRST_PERSON
|
|
bBlockVehicleFirstPersonCamera = TRUE //start blocking first person vehicle camera
|
|
iBlockVehicleFirstPersonCameraTimer = GET_GAME_TIMER() //start first person vehicle camera blocking timer, see B*2031566
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
|
|
IF GET_IS_WAYPOINT_RECORDING_LOADED("mic1_tdrive")
|
|
IF DOES_ENTITY_EXIST(vsMichaelsCar.VehicleIndex)
|
|
IF NOT IS_ENTITY_DEAD(vsMichaelsCar.VehicleIndex)
|
|
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vsMichaelsCar.VehicleIndex)
|
|
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), vsMichaelsCar.VehicleIndex, VS_DRIVER)
|
|
ENDIF
|
|
SET_VEHICLE_ENGINE_ON(vsMichaelsCar.VehicleIndex, TRUE, TRUE)
|
|
SET_VEHICLE_FORWARD_SPEED(vsMichaelsCar.VehicleIndex, 10.0)
|
|
TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING(PLAYER_PED_ID(), vsMichaelsCar.VehicleIndex, "mic1_tdrive",
|
|
DRIVINGMODE_AVOIDCARS_RECKLESS, 0, EWAYPOINT_START_FROM_CLOSEST_POINT)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_CAMERA(TRUE)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_SET_EXIT_STATE_FOR_CAMERA() returned true for camera.")
|
|
#ENDIF
|
|
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0)
|
|
ENDIF
|
|
|
|
IF HAS_CUTSCENE_FINISHED()
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Intro mocap cutscene has finished.")
|
|
#ENDIF
|
|
|
|
IF ( GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL AND HAS_MISSION_VEHICLE_BEEN_CREATED(vsMichaelsCar, TRUE, FALSE, CHAR_MICHAEL) )
|
|
OR ( GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR AND HAS_MISSION_VEHICLE_BEEN_CREATED(vsTrevorsCar, TRUE, FALSE, CHAR_TREVOR) AND HAS_MISSION_VEHICLE_BEEN_CREATED(vsMichaelsCar, TRUE, FALSE, CHAR_MICHAEL) )
|
|
|
|
IF IS_INTERIOR_READY(GET_INTERIOR_AT_COORDS(vInteriorPosition))
|
|
UNPIN_INTERIOR(GET_INTERIOR_AT_COORDS(vInteriorPosition))
|
|
ENDIF
|
|
|
|
REPLAY_STOP_EVENT()
|
|
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
|
|
REPLAY_RECORD_BACK_FOR_TIME(0.0, 15.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
ELSE
|
|
REPLAY_RECORD_BACK_FOR_TIME(0.0, 7.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
ENDIF
|
|
|
|
MISSION_FLOW_RELEASE_TRIGGER_SCENE_ASSETS(SP_MISSION_MICHAEL_1)
|
|
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
|
|
|
|
IF IS_SCREEN_FADED_OUT()
|
|
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
|
|
ENDIF
|
|
|
|
RETURN TRUE
|
|
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
//if cutscene is skipped, fade out and remain cutscene on faded out screen
|
|
IF (bCutsceneSkipped = FALSE )
|
|
IF WAS_CUTSCENE_SKIPPED()
|
|
SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, FALSE, FALSE)
|
|
bCutsceneSkipped = TRUE
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Intro mocap cutscene was skipped by the player.")
|
|
#ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
REQUEST_WAYPOINT_RECORDING("mic1_tdrive")
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
RETURN FALSE
|
|
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Handles cell phone conversations for Michael and Trevor when they drive to the airports.
|
|
/// PARAMS:
|
|
/// iMichaelProgress -
|
|
/// iTrevorProgress -
|
|
PROC MANAGE_CONVERSATIONS_DURING_AIRPORT_RIDE(INT &iMichaelProgress, INT &iTrevorProgress)
|
|
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
|
|
|
|
SWITCH iMichaelProgress
|
|
|
|
CASE 0
|
|
|
|
//IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
|
|
psMichael.iConversationTimer = GET_GAME_TIMER()
|
|
iMichaelProgress++
|
|
//ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 1
|
|
|
|
IF NOT HAS_LABEL_BEEN_TRIGGERED("MCH1_TTMC")
|
|
IF DOES_ENTITY_EXIST(psTrevor.PedIndex)
|
|
IF NOT IS_ENTITY_DEAD(psTrevor.PedIndex)
|
|
IF IS_PED_IN_ANY_VEHICLE(psTrevor.PedIndex)
|
|
IF HAS_ENTITY_CLEAR_LOS_TO_ENTITY(PLAYER_PED_ID(), GET_VEHICLE_PED_IS_USING(psTrevor.PedIndex))
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(sMichael1Conversation, "MCH1AUD", "MCH1_TTMC", CONV_PRIORITY_MEDIUM)
|
|
SET_LABEL_AS_TRIGGERED("MCH1_TTMC", TRUE)
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_AMBIENT_SPEECH_PLAYING(PLAYER_PED_ID())
|
|
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(PLAYER_PED_ID(), "MCH1_AEAA", "MICHAEL", SPEECH_PARAMS_FORCE_NORMAL)
|
|
SET_LABEL_AS_TRIGGERED("MCH1_TTMC", TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
SET_LABEL_AS_TRIGGERED("MCH1_TTMC", TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF ( bMichaelTrevorPhoneCallTriggered = FALSE )
|
|
|
|
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
|
|
//IF HAS_TIME_PASSED(10000, psMichael.iConversationTimer)
|
|
IF NOT DOES_ENTITY_EXIST(psTrevor.PedIndex) //when Trevor is removed
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData)
|
|
|
|
IF NOT DOES_ENTITY_EXIST(GET_PED_INDEX(CHAR_TREVOR))
|
|
REMOVE_PED_FOR_DIALOGUE(sMichael1Conversation, 2) //remove Trevor from dialogue
|
|
ADD_PED_FOR_DIALOGUE(sMichael1Conversation, 2, NULL, "TREVOR") //add Trevor for dialogue with ped index null
|
|
ENDIF
|
|
|
|
IF PLAYER_CALL_CHAR_CELLPHONE(sMichael1Conversation, CHAR_TREVOR, "MCH1AUD", "MCH1_CP01M", CONV_PRIORITY_VERY_HIGH)
|
|
REQUEST_ANIM_DICT("missmic1ig_zero_hit_wheel")
|
|
bMichaelTrevorPhoneCallTriggered = TRUE
|
|
iMichaelProgress++
|
|
ENDIF
|
|
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 2
|
|
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
psMichael.iConversationTimer = GET_GAME_TIMER()
|
|
iMichaelProgress++
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 3
|
|
|
|
REQUEST_ANIM_DICT("missmic1ig_zero_hit_wheel")
|
|
|
|
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
|
|
IF HAS_ANIM_DICT_LOADED("missmic1ig_zero_hit_wheel")
|
|
IF HAS_TIME_PASSED(2000, psMichael.iConversationTimer)
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(sMichael1Conversation, "MCH1AUD", "MCH1_MSHIT", CONV_PRIORITY_MEDIUM)
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
IF IS_THIS_MODEL_A_CAR(GET_ENTITY_MODEL(GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID())))
|
|
TASK_PLAY_ANIM(PLAYER_PED_ID(), "missmic1ig_zero_hit_wheel", "michael_hit_wheel",
|
|
SLOW_BLEND_IN, SLOW_BLEND_OUT, -1, AF_SECONDARY | AF_UPPERBODY)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
iMichaelProgress++
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 4
|
|
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
psMichael.iConversationTimer = GET_GAME_TIMER()
|
|
iMichaelProgress++
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 5
|
|
|
|
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
|
|
IF HAS_TIME_PASSED(3500, psMichael.iConversationTimer)
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData)
|
|
IF PLAYER_CALL_CHAR_CELLPHONE(sMichael1Conversation, CHAR_DAVE, "MCH1AUD", "MCH1_CP02", CONV_PRIORITY_VERY_HIGH)
|
|
REMOVE_ANIM_DICT("missmic1ig_zero_hit_wheel")
|
|
iMichaelProgress++
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
|
|
|
|
//check for locates header destination blip
|
|
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
|
|
|
|
//resume paused conversations when player gets back in the car
|
|
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
IF IS_FACE_TO_FACE_CONVERSATION_PAUSED()
|
|
PAUSE_FACE_TO_FACE_CONVERSATION(FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ELSE //destination blip does not exist, player is out of the vehicle or wanted
|
|
|
|
//handle wanted level dialogue when it gets added
|
|
|
|
// IF IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0) //when wanted, kill conversation, pause it and play wanted conversation
|
|
//
|
|
// IF ( bConversationPaused = FALSE )
|
|
//
|
|
// IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
// lConversationLabel = GET_STANDARD_CONVERSATION_LABEL_FOR_FUTURE_RESUMPTION()
|
|
// KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
// ENDIF
|
|
// IF CREATE_CONVERSATION(sFranklin1Conversation, "FKN1AUD", "F1_WNTD", CONV_PRIORITY_HIGH)
|
|
// bConversationPaused = TRUE
|
|
// ENDIF
|
|
//
|
|
// ENDIF
|
|
//
|
|
// ELSE //player not wanted, pause face to face conversations
|
|
|
|
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
IF NOT IS_FACE_TO_FACE_CONVERSATION_PAUSED()
|
|
PAUSE_FACE_TO_FACE_CONVERSATION(TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// ENDIF
|
|
|
|
ENDIF
|
|
|
|
SWITCH iTrevorProgress
|
|
|
|
CASE 0
|
|
|
|
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip) //this blip will exist but will not be displayed
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID()) //player as Trevor can now use any vehicle
|
|
IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
OR ( GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), psTrevor.vPosition) > 100.0 )
|
|
psTrevor.iConversationTimer = GET_GAME_TIMER()
|
|
iTrevorProgress++
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 1
|
|
|
|
IF ( bMichaelTrevorPhoneCallTriggered = FALSE )
|
|
IF ( bSafeToStartMichaelsCall = TRUE )
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
OR ( GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), psTrevor.vPosition) > 100.0 )
|
|
IF HAS_TIME_PASSED(10000, psTrevor.iConversationTimer)
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData)
|
|
|
|
IF NOT DOES_ENTITY_EXIST(GET_PED_INDEX(CHAR_MICHAEL))
|
|
REMOVE_PED_FOR_DIALOGUE(sMichael1Conversation, 0) //remove Michael from dialogue
|
|
ADD_PED_FOR_DIALOGUE(sMichael1Conversation, 0, NULL, "MICHAEL") //add Michael for dialogue with ped index null
|
|
ENDIF
|
|
|
|
IF CHAR_CALL_PLAYER_CELLPHONE_FORCE_ANSWER(sMichael1Conversation, CHAR_MICHAEL, "MCH1AUD", "MCH1_CP01T", CONV_PRIORITY_VERY_HIGH)
|
|
bMichaelTrevorPhoneCallTriggered = TRUE
|
|
iTrevorProgress++
|
|
ENDIF
|
|
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELIF ( bMichaelTrevorPhoneCallTriggered = TRUE )
|
|
iTrevorProgress++
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 2
|
|
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
psTrevor.iConversationTimer = GET_GAME_TIMER()
|
|
iTrevorProgress++
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 3
|
|
|
|
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
OR ( GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), psTrevor.vPosition) > 100.0 )
|
|
|
|
//check if the player is not too close to the airport, so that the phone call with Ron makes sense
|
|
//and not in the plane already
|
|
IF NOT IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<1738.423584,3291.455322,40.149773>>, << 500.0, 500.0, 50.0 >>)
|
|
AND NOT IS_PED_IN_THIS_VEHICLE(PLAYER_PED_ID(), vsTrevorsPlane.VehicleIndex)
|
|
IF HAS_TIME_PASSED(5000, psTrevor.iConversationTimer)
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData)
|
|
IF PLAYER_CALL_CHAR_CELLPHONE(sMichael1Conversation, CHAR_RON, "MCH1AUD", "MCH1_CP03", CONV_PRIORITY_VERY_HIGH)
|
|
iTrevorProgress++
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE //if player is too close to the airport on in the plane already, then skip the conversation with Ron completely
|
|
iTrevorProgress++
|
|
ENDIF
|
|
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
FUNC BOOL IS_PLAYER_IN_CONTROL_OF_VEHICLE(VEHICLE_INDEX VehicleIndex)
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(VehicleIndex)
|
|
|
|
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), VehicleIndex)
|
|
|
|
INT iXValue, iYValue
|
|
|
|
iXValue = ROUND(GET_CONTROL_NORMAL(PLAYER_CONTROL, INPUT_VEH_MOVE_LR) * 255.0)
|
|
iYValue = ROUND(GET_CONTROL_NORMAL(PLAYER_CONTROL, INPUT_VEH_MOVE_UD) * 255.0)
|
|
|
|
IF (iXValue < -50 OR iXValue > 50)
|
|
OR (iYValue < -50 OR iYValue > 50)
|
|
OR IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_AIM)
|
|
OR IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_EXIT)
|
|
OR IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_HORN)
|
|
OR IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_BRAKE)
|
|
OR IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_ATTACK)
|
|
OR IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_ATTACK2)
|
|
OR IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_CIN_CAM)
|
|
OR IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_HEADLIGHT)
|
|
OR IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_ACCELERATE)
|
|
OR IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_HANDBRAKE)
|
|
OR IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_DUCK)
|
|
|
|
RETURN TRUE
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
|
|
ENDFUNC
|
|
|
|
PROC UPDATE_TRIGGERED_LABEL(TEXT_LABEL &sLabel)
|
|
|
|
IF NOT IS_STRING_NULL_OR_EMPTY(sLabel) //if the label is not empty, which means not yet printed by locates header
|
|
|
|
IF NOT HAS_LABEL_BEEN_TRIGGERED(sLabel) //if it was not set as triggered by script
|
|
|
|
IF IS_THIS_PRINT_BEING_DISPLAYED(sLabel) //if the label was displayed on screen
|
|
|
|
SET_LABEL_AS_TRIGGERED(sLabel, TRUE) //mark it as triggered
|
|
|
|
ENDIF
|
|
|
|
ELSE //if the label was set as triggered by script,
|
|
//which means it was printed by locates header
|
|
IF NOT IS_THIS_PRINT_BEING_DISPLAYED(sLabel) //but is not currently being printed, cleared off screen or timed out
|
|
|
|
sLabel = "" //mark is as empty
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC MANAGE_TREVOR_DRIVING_OUT(PED_STRUCT &ped, INT &iProgress)
|
|
|
|
IF DOES_ENTITY_EXIST(ped.PedIndex)
|
|
IF NOT IS_ENTITY_DEAD(ped.PedIndex)
|
|
|
|
SWITCH iProgress
|
|
|
|
CASE 0
|
|
|
|
REQUEST_WAYPOINT_RECORDING("mic1_tdrive")
|
|
|
|
IF GET_IS_WAYPOINT_RECORDING_LOADED("mic1_tdrive")
|
|
|
|
IF NOT IS_PED_IN_VEHICLE(ped.PedIndex, vsMichaelsCar.VehicleIndex)
|
|
IF IS_VEHICLE_DRIVEABLE(vsMichaelsCar.VehicleIndex)
|
|
SET_PED_INTO_VEHICLE(ped.PedIndex, vsMichaelsCar.VehicleIndex, VS_DRIVER)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
CLEAR_AREA_OF_PROJECTILES(vsMichaelsCar.vPosition, 5.0)
|
|
SET_PED_CONFIG_FLAG(ped.PedIndex, PCF_GetOutBurningVehicle, FALSE)
|
|
SET_PED_CONFIG_FLAG(ped.PedIndex, PCF_GetOutUndriveableVehicle, FALSE)
|
|
|
|
CREATE_TRACKED_POINT_FOR_COORD(iCarTrackedPoint, vsMichaelsCar.vPosition, 4.5)
|
|
|
|
ped.iTimer = GET_GAME_TIMER()
|
|
iProgress++
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 1
|
|
|
|
IF HAS_TIME_PASSED(15000, ped.iTimer)
|
|
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), << -818.93, 180.14, 70.23 >>, << -817.07, 175.22, 75.23 >>, 3.5) //front door exterior
|
|
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), << -791.74, 177.00, 71.33 >>, << -799.15, 174.12, 75.83 >>, 3.0) //garden side door
|
|
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), << -806.57, 185.56, 71.26 >>, << -805.63, 183.03, 73.85 >>, 1.8) //garage door corridor, start Trevor earlier if player is trying to reach garage
|
|
OR NOT IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), << -817.04, 172.44,68.58 >>, << -791.70, 182.09, 79.83 >>, 18.0) //house
|
|
OR ( IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), << -818.52, 177.49, 71.02 >>, << -796.41, 186.11, 75.10 >>, 6.5)
|
|
AND DOES_TRACKED_POINT_EXIST(iCarTrackedPoint) AND IS_TRACKED_POINT_VISIBLE(iCarTrackedPoint) ) //front hall interior player can see the car
|
|
|
|
IF DOES_ENTITY_EXIST(vsMichaelsCar.VehicleIndex)
|
|
IF NOT IS_ENTITY_DEAD(vsMichaelsCar.VehicleIndex)
|
|
|
|
IF NOT IS_PED_IN_VEHICLE(ped.PedIndex, vsMichaelsCar.VehicleIndex)
|
|
SET_PED_INTO_VEHICLE(ped.PedIndex, vsMichaelsCar.VehicleIndex, VS_DRIVER)
|
|
ENDIF
|
|
|
|
SET_VEHICLE_ENGINE_ON(vsMichaelsCar.VehicleIndex, TRUE, TRUE)
|
|
|
|
IF IS_PED_RUNNING(PLAYER_PED_ID())
|
|
OR IS_PED_SPRINTING(PLAYER_PED_ID())
|
|
SET_VEHICLE_FORWARD_SPEED(vsMichaelsCar.VehicleIndex, 15.0)
|
|
ELSE
|
|
SET_VEHICLE_FORWARD_SPEED(vsMichaelsCar.VehicleIndex, 12.5)
|
|
ENDIF
|
|
|
|
TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING(ped.PedIndex, vsMichaelsCar.VehicleIndex, "mic1_tdrive", DRIVINGMODE_AVOIDCARS_RECKLESS)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ped.PedIndex, TRUE)
|
|
|
|
CLEANUP_TRACKED_POINT(iCarTrackedPoint)
|
|
|
|
TRACK_VEHICLE_FOR_IMPOUND(vsMichaelsCar.VehicleIndex, CHAR_MICHAEL) // Send this to Michael's impound when deleted
|
|
|
|
vsMichaelsCar.bAutoDriveActive = FALSE //use this flag to control the michael's house gate
|
|
|
|
iProgress++
|
|
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 2
|
|
|
|
IF GET_SCRIPT_TASK_STATUS(ped.PedIndex, SCRIPT_TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING) = PERFORMING_TASK
|
|
|
|
IF DOES_ENTITY_EXIST(vsMichaelsCar.VehicleIndex)
|
|
IF NOT IS_ENTITY_DEAD(vsMichaelsCar.VehicleIndex)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
DRAW_DEBUG_TEXT_ABOVE_ENTITY(vsMichaelsCar.VehicleIndex, GET_STRING_FROM_INT(GET_VEHICLE_WAYPOINT_PROGRESS(vsMichaelsCar.VehicleIndex)), 1.0)
|
|
DRAW_DEBUG_TEXT_ABOVE_ENTITY(vsMichaelsCar.VehicleIndex, GET_STRING_FROM_FLOAT(GET_ENTITY_SPEED(vsMichaelsCar.VehicleIndex)), 2.0)
|
|
#ENDIF
|
|
|
|
IF GET_VEHICLE_WAYPOINT_PROGRESS(vsMichaelsCar.VehicleIndex) >= 10
|
|
OR IS_ENTITY_AT_COORD(vsMichaelsCar.VehicleIndex,<<-845.781982,159.075562,67.057610>>, << 1.5, 3.0, 2.0 >>)
|
|
bShouldDisplayMichaelsObjective = TRUE
|
|
ENDIF
|
|
|
|
IF GET_VEHICLE_WAYPOINT_PROGRESS(vsMichaelsCar.VehicleIndex) >= 45 //50
|
|
OR ( GET_VEHICLE_WAYPOINT_PROGRESS(vsMichaelsCar.VehicleIndex) >= 35 AND GET_DISTANCE_BETWEEN_PEDS(ped.PedIndex, PLAYER_PED_ID()) > 25.0 )
|
|
|
|
IF NOT IS_ENTITY_ON_SCREEN(vsMichaelsCar.VehicleIndex)
|
|
OR IS_ENTITY_OCCLUDED(vsMichaelsCar.VehicleIndex)
|
|
DELETE_PED(ped.PedIndex)
|
|
DELETE_VEHICLE(vsMichaelsCar.VehicleIndex)
|
|
REMOVE_WAYPOINT_RECORDING("mic1_tdrive")
|
|
ELSE
|
|
TASK_VEHICLE_MISSION_PED_TARGET(ped.PedIndex, vsMichaelsCar.VehicleIndex, PLAYER_PED_ID(), MISSION_FLEE, 20.0, DRIVINGMODE_AVOIDCARS_RECKLESS, 1000.0, 10.0)
|
|
SET_PED_KEEP_TASK(ped.PedIndex, TRUE)
|
|
SET_PED_AS_NO_LONGER_NEEDED(ped.PedIndex)
|
|
SET_VEHICLE_AS_NO_LONGER_NEEDED(vsMichaelsCar.VehicleIndex)
|
|
REMOVE_WAYPOINT_RECORDING("mic1_tdrive")
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
//fix for B*1815090
|
|
//delete Trevor when he is off screen if the player is using a vehicle to chase after him
|
|
IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
|
|
IF NOT DOES_TRACKED_POINT_EXIST(iCarTrackedPoint)
|
|
CREATE_TRACKED_POINT_FOR_COORD(iCarTrackedPoint, GET_ENTITY_COORDS(vsMichaelsCar.VehicleIndex), 4.0)
|
|
ELSE
|
|
SET_TRACKED_POINT_INFO(iCarTrackedPoint, GET_ENTITY_COORDS(vsMichaelsCar.VehicleIndex), 4.0)
|
|
ENDIF
|
|
|
|
IF ( GET_VEHICLE_WAYPOINT_PROGRESS(vsMichaelsCar.VehicleIndex) >= 17 AND GET_DISTANCE_BETWEEN_PEDS(ped.PedIndex, PLAYER_PED_ID()) > 35.0 )
|
|
|
|
IF DOES_TRACKED_POINT_EXIST(iCarTrackedPoint) AND NOT IS_TRACKED_POINT_VISIBLE(iCarTrackedPoint)
|
|
DELETE_PED(ped.PedIndex)
|
|
DELETE_VEHICLE(vsMichaelsCar.VehicleIndex)
|
|
REMOVE_WAYPOINT_RECORDING("mic1_tdrive")
|
|
CLEANUP_TRACKED_POINT(iCarTrackedPoint)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//fix for B*1956131 and B*1956140
|
|
//delete Trevor's car earlier if player is trying to use a bike
|
|
IF IS_THIS_MODEL_A_BIKE(GET_ENTITY_MODEL(GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID())))
|
|
|
|
IF ( GET_VEHICLE_WAYPOINT_PROGRESS(vsMichaelsCar.VehicleIndex) >= 10 )
|
|
|
|
IF DOES_TRACKED_POINT_EXIST(iCarTrackedPoint) AND NOT IS_TRACKED_POINT_VISIBLE(iCarTrackedPoint)
|
|
DELETE_PED(ped.PedIndex)
|
|
DELETE_VEHICLE(vsMichaelsCar.VehicleIndex)
|
|
REMOVE_WAYPOINT_RECORDING("mic1_tdrive")
|
|
CLEANUP_TRACKED_POINT(iCarTrackedPoint)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
FUNC BOOL IS_MISSION_STAGE_GET_TO_AIRPORT_COMPLETED(INT &iStageProgress)
|
|
|
|
//don't use locates header J skip
|
|
SET_BIT(sLocatesData.iLocatesBitSet, BS_DONT_DO_J_SKIP)
|
|
|
|
MANAGE_CONVERSATIONS_DURING_AIRPORT_RIDE(psMichael.iConversationProgress, psTrevor.iConversationProgress)
|
|
|
|
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
|
|
|
|
CASE CHAR_MICHAEL
|
|
|
|
IF IS_PLAYER_PLAYING(PLAYER_ID())
|
|
SET_ALL_RANDOM_PEDS_FLEE_THIS_FRAME(PLAYER_ID())
|
|
ENDIF
|
|
|
|
IF IS_PLAYER_BROWSING_ITEMS_IN_ANY_SHOP()
|
|
OR IS_PLAYER_CHANGING_CLOTHES() //check if player changed clothes before cutscene
|
|
|
|
IF HAS_THIS_CUTSCENE_LOADED("mic_1_mcs_1")
|
|
OR HAS_CUTSCENE_LOADED()
|
|
OR IS_CUTSCENE_ACTIVE()
|
|
REMOVE_CUTSCENE() //remove cutscene from memory if player changed clothes
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Player browsing items in a shop or changing clothes. Removing cutscene.")
|
|
#ENDIF
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
IF GET_DISTANCE_BETWEEN_COORDS(<< -1037.0256, -2735.8008, 19.1693 >>, GET_ENTITY_COORDS(PLAYER_PED_ID())) < DEFAULT_CUTSCENE_LOAD_DIST
|
|
|
|
//request mocap cutscene for Michael
|
|
REQUEST_CUTSCENE("mic_1_mcs_1")
|
|
|
|
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", PLAYER_PED_ID()) //Michael's variations
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting cutscene ped components for cutscene ped Michael from player ped.")
|
|
#ENDIF
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
IF HAS_THIS_CUTSCENE_LOADED("mic_1_mcs_1")
|
|
OR HAS_CUTSCENE_LOADED()
|
|
OR IS_CUTSCENE_ACTIVE()
|
|
REMOVE_CUTSCENE()
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Player too far away from destination to keep cutscene in memory. Removing cutscene.")
|
|
#ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
MANAGE_TREVOR_DRIVING_OUT(psTrevor, iTrevorDriveOutProgress)
|
|
|
|
SWITCH iStageProgress
|
|
|
|
CASE 0
|
|
|
|
SET_VEHICLE_GENERATOR_AREA_OF_INTEREST(<< -1039.57, -2664.37, 12.83 >>, 30.0)
|
|
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("MI_1_MIC_DRIVE_TO_AIRPORT")
|
|
START_AUDIO_SCENE("MI_1_MIC_DRIVE_TO_AIRPORT")
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
|
|
IF GET_SCRIPT_TASK_STATUS(PLAYER_PED_ID(), SCRIPT_TASK_PERFORM_SEQUENCE) = PERFORMING_TASK
|
|
|
|
SET_PED_MIN_MOVE_BLEND_RATIO(PLAYER_PED_ID(), PEDMOVE_RUN)
|
|
|
|
IF ( bPlayerPedScriptTaskInterrupted = FALSE )
|
|
IF IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_SPRINT)
|
|
OR IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_JUMP)
|
|
OR (ROUND(GET_CONTROL_NORMAL(PLAYER_CONTROL, INPUT_MOVE_LR) * 255.0) < -20 OR ROUND(GET_CONTROL_NORMAL(PLAYER_CONTROL, INPUT_MOVE_LR) * 255.0) > 20)
|
|
OR (ROUND(GET_CONTROL_NORMAL(PLAYER_CONTROL, INPUT_MOVE_UD) * 255.0) < -20 OR ROUND(GET_CONTROL_NORMAL(PLAYER_CONTROL, INPUT_MOVE_UD) * 255.0) > 20)
|
|
CLEAR_PED_TASKS(PLAYER_PED_ID())
|
|
bPlayerPedScriptTaskInterrupted = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF ( bShouldDisplayMichaelsObjective = FALSE )
|
|
IF ( iMichaelsObjectiveTimer = 0 )
|
|
iMichaelsObjectiveTimer = GET_GAME_TIMER()
|
|
ELSE
|
|
IF HAS_TIME_PASSED(7500, iMichaelsObjectiveTimer)
|
|
bShouldDisplayMichaelsObjective = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF ( bShouldDisplayMichaelsObjective = TRUE )
|
|
IS_PLAYER_AT_LOCATION_ANY_MEANS(sLocatesData, << -1037.8436, -2655.3862, 12.8312 >>, << 0.25, 0.25, LOCATE_SIZE_HEIGHT >>, TRUE, "MCH1_GTLSIA", TRUE)
|
|
ENDIF
|
|
|
|
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
|
|
|
|
IF ( bTaxiLocationSet = FALSE )
|
|
SET_TAXI_DROPOFF_LOCATION_FOR_BLIP(sLocatesData.LocationBlip, <<-1051.6487, -2712.0117, 12.7057>>, 241.7918)
|
|
bTaxiLocationSet = TRUE
|
|
ENDIF
|
|
|
|
//player can drive or walk into the parking lot locates
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-1047.949463,-2649.732422,12.331177>>, <<-1027.131958,-2661.605469,15.981733>>, 7.0)
|
|
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-1037.549438,-2680.126465,12.481735>>, <<-1047.742188,-2670.507324,15.831176>>, 7.0)
|
|
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-1057.455078,-2653.344482,12.331177>>, <<-1047.972046,-2671.035645,15.831175>>, 7.0)
|
|
iStageProgress++
|
|
ENDIF
|
|
//player can only be on foot in this bigger locate
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-962.393799,-2736.521484,11.818534>>, <<-1083.925415,-2666.653564,28.817842>>, 78.0)
|
|
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
iStageProgress++
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_INTERIOR_READY(GET_INTERIOR_AT_COORDS(vInteriorPosition)) //unpin the interior if it is pinned and player is away from it
|
|
IF ( GET_DISTANCE_BETWEEN_COORDS(psMichael.vPosition, GET_ENTITY_COORDS(PLAYER_PED_ID()), TRUE) > 50.0 )
|
|
UNPIN_INTERIOR(GET_INTERIOR_AT_COORDS(vInteriorPosition))
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Unpinning interior at coordinates ", vInteriorPosition, " in memory.")
|
|
#ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 1
|
|
|
|
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
IF BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID()), 4.0)
|
|
CLEAR_MISSION_LOCATION_TEXT_AND_BLIPS(sLocatesData)
|
|
iStageProgress++
|
|
ENDIF
|
|
ELSE
|
|
CLEAR_MISSION_LOCATION_TEXT_AND_BLIPS(sLocatesData)
|
|
iStageProgress++
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 2
|
|
|
|
IF IS_AUDIO_SCENE_ACTIVE("MI_1_MIC_DRIVE_TO_AIRPORT")
|
|
STOP_AUDIO_SCENE("MI_1_MIC_DRIVE_TO_AIRPORT")
|
|
ENDIF
|
|
|
|
IS_PLAYER_AT_LOCATION_ANY_MEANS(sLocatesData, << -1037.63, -2737.48, 19.17 >>, << 0.25, 0.25, LOCATE_SIZE_HEIGHT>>, TRUE, "", TRUE)
|
|
|
|
//print objective to walk to terminal
|
|
IF NOT HAS_LABEL_BEEN_TRIGGERED("MCH1_GTTE")
|
|
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_DIALOGUE_IF_SUBTITLES_OFF)
|
|
PRINT_GOD_TEXT_ADVANCED("MCH1_GTTE", DEFAULT_GOD_TEXT_TIME, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
|
|
IF DOES_BLIP_HAVE_GPS_ROUTE(sLocatesData.LocationBlip)
|
|
IF GET_DISTANCE_BETWEEN_COORDS(GET_BLIP_COORDS(sLocatesData.LocationBlip), GET_ENTITY_COORDS(PLAYER_PED_ID())) < 100.0
|
|
SET_BLIP_ROUTE(sLocatesData.LocationBlip, FALSE)
|
|
ENDIF
|
|
ELSE
|
|
IF GET_DISTANCE_BETWEEN_COORDS(GET_BLIP_COORDS(sLocatesData.LocationBlip), GET_ENTITY_COORDS(PLAYER_PED_ID())) > 110.0
|
|
SET_BLIP_ROUTE(sLocatesData.LocationBlip, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-1026.306519,-2741.366699,18.669733>>, <<-1046.329590,-2730.003174,23.169733>>, 18.0)
|
|
iStageProgress++
|
|
ENDIF
|
|
ELSE
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-1046.410645,-2736.281982,18.670202>>, <<-1032.384521,-2744.483154,23.170202>>, 17.0)
|
|
iStageProgress++
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 3
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
IF BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID()), 4.0)
|
|
KILL_ANY_CONVERSATION()
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
TASK_LEAVE_ANY_VEHICLE(PLAYER_PED_ID())
|
|
CLEAR_MISSION_LOCATION_TEXT_AND_BLIPS(sLocatesData)
|
|
iStageProgress++
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
KILL_ANY_CONVERSATION()
|
|
CLEAR_MISSION_LOCATION_TEXT_AND_BLIPS(sLocatesData)
|
|
iStageProgress++
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 4
|
|
|
|
IF NOT DOES_CAM_EXIST(ScriptedCamera)
|
|
|
|
//create animated camera for establishing shot
|
|
DESTROY_ALL_CAMS()
|
|
|
|
ScriptedCamera = CREATE_CAMERA(CAMTYPE_SCRIPTED, TRUE)
|
|
SET_CAM_PARAMS(ScriptedCamera, <<-1011.717896,-2738.015137,22.563950>>, <<-0.092603,-0.004846,82.387924>>, 39.955357)
|
|
SET_CAM_PARAMS(ScriptedCamera, <<-1012.978027,-2737.459717,22.562250>>, <<0.573072,-0.004846,83.246178>>, 39.955357,
|
|
5000, GRAPH_TYPE_LINEAR, GRAPH_TYPE_LINEAR)
|
|
|
|
SHAKE_CAM(ScriptedCamera, "HAND_SHAKE", 0.2)
|
|
|
|
DISPLAY_HUD(FALSE)
|
|
DISPLAY_RADAR(FALSE)
|
|
RENDER_SCRIPT_CAMS(TRUE, FALSE)
|
|
|
|
psMichael.iTimer = GET_GAME_TIMER()
|
|
|
|
//task the player to walk to cutscene start coords
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(PLAYER_PED_ID(), << -1038.07, -2738.51, 19.17 >>, PEDMOVE_WALK)
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
IF IS_CAM_RENDERING(ScriptedCamera)
|
|
IF HAS_TIME_PASSED(4000, psMichael.iTimer)
|
|
OR IS_ENTITY_AT_COORD(PLAYER_PED_ID(), << -1038.07, -2738.51, 19.17 >>, << 2.0, 2.0, 2.0 >>)
|
|
|
|
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
|
|
IF DOES_ENTITY_EXIST(vsMichaelsCar.VehicleIndex)
|
|
SET_VEHICLE_AS_NO_LONGER_NEEDED(vsMichaelsCar.VehicleIndex)
|
|
ENDIF
|
|
|
|
REMOVE_ANIM_DICT("missmic1ig_zero_hit_wheel")
|
|
|
|
RETURN TRUE
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
BREAK
|
|
|
|
CASE CHAR_TREVOR
|
|
|
|
FLOAT fDistanceToBlip
|
|
VECTOR vOffsetToBlip
|
|
VECTOR vPlayerPosition
|
|
|
|
vPlayerPosition = GET_ENTITY_COORDS(PLAYER_PED_ID())
|
|
|
|
UPDATE_TRIGGERED_LABEL(sLabelTOBJ1)
|
|
UPDATE_TRIGGERED_LABEL(sLabelTOBJ2)
|
|
UPDATE_TRIGGERED_LABEL(sLabelTGETBCK1)
|
|
UPDATE_TRIGGERED_LABEL(sLabelTGETBCK2)
|
|
UPDATE_TRIGGERED_LABEL(sLabelTGETIN2)
|
|
|
|
SWITCH iStageProgress
|
|
|
|
CASE 0
|
|
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("MI_1_TREV_DRIVE_TO_PLANE")
|
|
START_AUDIO_SCENE("MI_1_TREV_DRIVE_TO_PLANE")
|
|
ENDIF
|
|
|
|
IF ( psTrevor.iTimer = 0 )
|
|
psTrevor.iTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
|
|
IF GET_SCRIPT_TASK_STATUS(PLAYER_PED_ID(), SCRIPT_TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING) = PERFORMING_TASK
|
|
IF ( bPlayerPedScriptTaskInterrupted = FALSE )
|
|
IF ( psTrevor.iTimer != 0 )
|
|
IF HAS_TIME_PASSED(3000, psTrevor.iTimer)
|
|
IF IS_PLAYER_IN_CONTROL_OF_VEHICLE(GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID()))
|
|
CLEAR_PED_TASKS(PLAYER_PED_ID())
|
|
bPlayerPedScriptTaskInterrupted = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
IF HAS_TIME_PASSED(10000, psTrevor.iTimer)
|
|
CLEAR_PED_TASKS(PLAYER_PED_ID())
|
|
bPlayerPedScriptTaskInterrupted = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//need locates header stuff here
|
|
IS_PLAYER_AT_LOCATION_ANY_MEANS(sLocatesData, << 1743.932739, 3289.193848, 40.1 >>, << 0.25, 0.25, LOCATE_SIZE_HEIGHT >>, TRUE, sLabelTOBJ1, TRUE)
|
|
|
|
IF ( bSafeToStartMichaelsCall = FALSE )
|
|
|
|
//if player is close enough to the desert airport destination (far enough from Michael's house)
|
|
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), <<1743.932739,3289.193848,42.103081>>) < 3800.0
|
|
|
|
bSafeToStartMichaelsCall = TRUE
|
|
|
|
ELSE
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
DRAW_DEBUG_TEXT_ABOVE_ENTITY(PLAYER_PED_ID(), GET_STRING_FROM_FLOAT(GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), <<1743.932739,3289.193848,42.103081>>)), 1.25)
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
//if player walks into the countryside airport locate with car being outside the locate
|
|
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<1743.932739,3289.193848,42.103081>>,<<18.000000,12.000000,2.000000>>)
|
|
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<1739.666504,3280.869141,39.093464>>, <<1726.727661,3328.008057,44.226074>>, 28.0)
|
|
|
|
CLEAR_MISSION_LOCATION_TEXT_AND_BLIPS(sLocatesData)
|
|
|
|
FailFlags[MISSION_FAIL_TREVORS_CAR_UNDRIVABLE] = FALSE
|
|
FailFlags[MISSION_FAIL_TREVORS_CAR_DEAD] = FALSE
|
|
FailFlags[MISSION_FAIL_TREVORS_CAR_LEFT_BEHIND] = FALSE
|
|
|
|
psTrevor.iTimer = GET_GAME_TIMER()
|
|
|
|
bTrevorFlightActive = TRUE
|
|
|
|
//set checkpoint reached and store mid mission snapshot vehicle
|
|
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(ENUM_TO_INT(MID_MISSION_STAGE_FLY_TO_NORTH_YANKTON), "FLY TO NORTH YANKTON", FALSE)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting replay mid-mission checkpoint to ", ENUM_TO_INT(MID_MISSION_STAGE_FLY_TO_NORTH_YANKTON), " for stage ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eMissionStage), ".")
|
|
IF IS_REPLAY_CHECKPOINT_VEHICLE_AVAILABLE()
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Player's replay checkpoint vehicle model is ", GET_MODEL_NAME_FOR_DEBUG(GET_REPLAY_CHECKPOINT_VEHICLE_MODEL()), ".")
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
IF (GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID()) <> vsTrevorsCar.VehicleIndex)
|
|
IF IS_VEHICLE_DRIVEABLE(GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID()))
|
|
IF IS_PED_SITTING_IN_VEHICLE_SEAT(PLAYER_PED_ID(), GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID()), VS_DRIVER)
|
|
|
|
VEHICLE_INDEX TrevorsVehicleIndex
|
|
|
|
TrevorsVehicleIndex = GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID())
|
|
|
|
IF DOES_ENTITY_EXIST(TrevorsVehicleIndex)
|
|
IF NOT IS_ENTITY_DEAD(TrevorsVehicleIndex)
|
|
IF IS_VEHICLE_DRIVEABLE(TrevorsVehicleIndex)
|
|
|
|
GET_VEHICLE_SETUP(TrevorsVehicleIndex, TrevorsVehicleData)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Saving vehicle setup for player vehicle with model ", GET_MODEL_NAME_FOR_DEBUG(TrevorsVehicleData.eModel), " for mid-mission checkpoint.")
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
iStageProgress++
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 1
|
|
|
|
IF IS_AUDIO_SCENE_ACTIVE("MI_1_TREV_DRIVE_TO_PLANE")
|
|
STOP_AUDIO_SCENE("MI_1_TREV_DRIVE_TO_PLANE")
|
|
ENDIF
|
|
|
|
//check if player as Trevor is in Trevor's plane
|
|
IF IS_VEHICLE_DRIVEABLE(vsTrevorsPlane.VehicleIndex)
|
|
AND NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
|
|
IF IS_PLAYER_CONTROL_ON(PLAYER_ID())
|
|
|
|
//use locates header to take care of the objective and text and blips
|
|
IS_PLAYER_AT_LOCATION_IN_VEHICLE(sLocatesData, sLocateFlight.vPosition, sLocateFlight.vSize, FALSE, vsTrevorsPlane.VehicleIndex, sLabelTOBJ2, sLabelTGETIN2, sLabelTGETBCK2, TRUE)
|
|
|
|
//remove Trevor's plane blip if it exists from previous stage
|
|
//when Trevor was driving to the plane
|
|
IF DOES_BLIP_EXIST(sLocatesData.vehicleBlip)
|
|
IF DOES_BLIP_EXIST(vsTrevorsPlane.BlipIndex)
|
|
REMOVE_BLIP(vsTrevorsPlane.BlipIndex)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//move on when player gets inside the plane
|
|
IF IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), vsTrevorsPlane.VehicleIndex)
|
|
|
|
REPLAY_RECORD_BACK_FOR_TIME(10.0, 3.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
TRIGGER_MUSIC_EVENT("MIC1_TREVOR_PLANE")
|
|
|
|
START_AUDIO_SCENE("MI_1_TREV_FLY_TO_LUDENDORFF")
|
|
|
|
iStageProgress++
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Player as Trevor entered the plane.")
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
|
|
//if by any chance Trevor is performing a sequence which was not cleared during the hotswap call of CLEAR_PED_TASKS
|
|
//and now player is unable to control Trevor because he is performing a sequnce, then clear it
|
|
//this can for example happen when ped is playing animation of getting in/out of a vehicle
|
|
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vsTrevorsPlane.VehicleIndex)
|
|
IF DOES_ENTITY_EXIST(psTrevor.PedIndex)
|
|
IF GET_SCRIPT_TASK_STATUS(psTrevor.PedIndex, SCRIPT_TASK_PERFORM_SEQUENCE) = PERFORMING_TASK
|
|
CLEAR_PED_TASKS(psTrevor.PedIndex)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Clearing Trevor player ped tasks. Trevor ped was performing a sequence while being the current player ped enum.")
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 2
|
|
|
|
//check if player as Trevor is in Trevor's plane
|
|
IF IS_VEHICLE_DRIVEABLE(vsTrevorsPlane.VehicleIndex)
|
|
AND NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
|
|
IF IS_PLAYER_CONTROL_ON(PLAYER_ID())
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(vsTrevorsPlane.VehicleIndex)
|
|
|
|
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vsTrevorsPlane.VehicleIndex)
|
|
|
|
IF DOES_BLIP_EXIST(sLocatesData.vehicleBlip)
|
|
//remove collision flag for the plane entity
|
|
SET_ENTITY_LOAD_COLLISION_FLAG(vsTrevorsPlane.VehicleIndex, FALSE)
|
|
ENDIF
|
|
|
|
IF ( bWeatherTypeOvercastSet = FALSE )
|
|
SET_WEATHER_TYPE_OVERTIME_PERSIST("OVERCAST", 60.0)
|
|
iWeatherTypeTimer = GET_GAME_TIMER()
|
|
bWeatherTypeOvercastSet = TRUE
|
|
ENDIF
|
|
|
|
IF ( bWeatherTypeRainSet = FALSE )
|
|
IF ( bWeatherTypeOvercastSet = TRUE)
|
|
IF ( iWeatherTypeTimer <> 0 AND HAS_TIME_PASSED(60000, iWeatherTypeTimer) )
|
|
SET_WEATHER_TYPE_OVERTIME_PERSIST("RAIN", 35.0)
|
|
IF IS_VEHICLE_DRIVEABLE(vsTrevorsPlane.VehicleIndex)
|
|
PLAY_SOUND_FROM_ENTITY(iRainOnPlaneSoundID, "MIC_1_RAIN_ON_PLANE_MASTER", vsTrevorsPlane.VehicleIndex)
|
|
ENDIF
|
|
iWeatherTypeTimer = GET_GAME_TIMER()
|
|
bWeatherTypeRainSet = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF ( bWeatherTypeThunderSet = FALSE )
|
|
IF ( bWeatherTypeRainSet = TRUE)
|
|
IF ( iWeatherTypeTimer <> 0 AND HAS_TIME_PASSED(35000, iWeatherTypeTimer) )
|
|
SET_WEATHER_TYPE_OVERTIME_PERSIST("THUNDER", 35.0)
|
|
bWeatherTypeThunderSet = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ELSE
|
|
IF NOT DOES_BLIP_EXIST(sLocatesData.vehicleBlip)
|
|
//add collision flag for the plane entity
|
|
SET_ENTITY_LOAD_COLLISION_FLAG(vsTrevorsPlane.VehicleIndex, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF NOT DOES_ENTITY_EXIST(osGolfBall.ObjectIndex)
|
|
IF HAS_MISSION_OBJECT_BEEN_CREATED(osGolfBall, TRUE)
|
|
SET_ENTITY_HEADING(osGolfBall.ObjectIndex, 315.0)
|
|
SET_ENTITY_VISIBLE(osGolfBall.ObjectIndex, FALSE)
|
|
SET_ENTITY_COLLISION(osGolfBall.ObjectIndex, FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
|
|
fDistanceToBlip = GET_DISTANCE_BETWEEN_COORDS(GET_BLIP_COORDS(sLocatesData.LocationBlip), vPlayerPosition)
|
|
IF DOES_ENTITY_EXIST(osGolfBall.ObjectIndex)
|
|
IF NOT IS_ENTITY_DEAD(osGolfBall.ObjectIndex)
|
|
vOffsetToBlip = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(osGolfBall.ObjectIndex, vPlayerPosition)
|
|
ENDIF
|
|
ENDIF
|
|
#IF IS_DEBUG_BUILD
|
|
DRAW_DEBUG_TEXT_ABOVE_ENTITY(vsTrevorsPlane.VehicleIndex, GET_STRING_FROM_FLOAT(fDistanceToBlip), 1.25)
|
|
DRAW_DEBUG_TEXT_ABOVE_ENTITY(vsTrevorsPlane.VehicleIndex, GET_STRING_FROM_FLOAT(vOffsetToBlip.y), 2.0)
|
|
DRAW_DEBUG_SPHERE(GET_BLIP_COORDS(sLocatesData.LocationBlip), 500, 0, 0, 255, 128)
|
|
#ENDIF
|
|
ENDIF
|
|
|
|
IF NOT HAS_LABEL_BEEN_TRIGGERED("MCH1_TRON")
|
|
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
|
|
IF fDistanceToBlip > 0 AND fDistanceToBlip < 2200
|
|
SEND_TEXT_MESSAGE_TO_CURRENT_PLAYER(CHAR_RON, "MCH1_TRON", TXTMSG_UNLOCKED, TXTMSG_CRITICAL)
|
|
SET_LABEL_AS_TRIGGERED("MCH1_TRON", TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_PLAYER_AT_LOCATION_IN_VEHICLE(sLocatesData, << sLocateFlight.vPosition.x, sLocateFlight.vPosition.y, vPlayerPosition.z >>, sLocateFlight.vSize, FALSE, vsTrevorsPlane.VehicleIndex, sLabelTOBJ2, sLabelTGETIN2, sLabelTGETBCK2, TRUE)
|
|
OR ( DOES_BLIP_EXIST(sLocatesData.LocationBlip) AND vOffsetToBlip.y > 0 AND fDistanceToBlip > 0 AND fDistanceToBlip < 500 ) //plane in front of blip
|
|
CLEAR_MISSION_LOCATION_TEXT_AND_BLIPS(sLocatesData)
|
|
|
|
TRIGGER_MUSIC_EVENT("MIC1_FLIGHT_ARRIVING")
|
|
|
|
iStageProgress++
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Player as Trevor entered the North Yankton flight locate.")
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
//stop Trevor's plane recording playback when player is playing as Trevor
|
|
//switch off Trevor's plane invincibility
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vsTrevorsPlane.VehicleIndex)
|
|
IF IS_PLAYER_CONTROL_ON(PLAYER_ID())
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(vsTrevorsPlane.VehicleIndex)
|
|
SET_ENTITY_INVINCIBLE(vsTrevorsPlane.VehicleIndex, FALSE)
|
|
SET_VEHICLE_CAN_BE_VISIBLY_DAMAGED(vsTrevorsPlane.VehicleIndex, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 3
|
|
|
|
//remove Michael's car
|
|
IF DOES_ENTITY_EXIST(vsMichaelsCar.VehicleIndex)
|
|
DELETE_VEHICLE(vsMichaelsCar.VehicleIndex)
|
|
ENDIF
|
|
|
|
//remove Trevor's car
|
|
IF DOES_ENTITY_EXIST(vsTrevorsCar.VehicleIndex)
|
|
DELETE_VEHICLE(vsTrevorsCar.VehicleIndex)
|
|
ENDIF
|
|
|
|
DISABLE_CELLPHONE_THIS_FRAME_ONLY()
|
|
CLEANUP_MISSION_OBJECT(osGolfBall, TRUE)
|
|
|
|
//also remove Trevor's plane on fade out
|
|
IF IS_VEHICLE_DRIVEABLE(vsTrevorsPlane.VehicleIndex)
|
|
SET_VEHICLE_AS_NO_LONGER_NEEDED(vsTrevorsPlane.VehicleIndex)
|
|
ENDIF
|
|
|
|
IF NOT HAS_SOUND_FINISHED(iRainOnPlaneSoundID)
|
|
STOP_SOUND(iRainOnPlaneSoundID)
|
|
ENDIF
|
|
|
|
REMOVE_CUTSCENE()
|
|
|
|
bCutsceneTriggeredByTrevor = TRUE
|
|
|
|
DO_SCREEN_FADE_OUT(DEFAULT_FADE_TIME_LONG)
|
|
|
|
iStageProgress++
|
|
|
|
BREAK
|
|
|
|
CASE 4
|
|
|
|
DISABLE_CELLPHONE_THIS_FRAME_ONLY()
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_EXIT)
|
|
|
|
IF IS_SCREEN_FADED_OUT() AND NOT IS_SCREEN_FADING_OUT()
|
|
|
|
RETURN TRUE
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL IS_MISSION_STAGE_FLY_TO_NORTH_YANKTON_COMPLETED(INT &iTrevorProgress)
|
|
|
|
//don't use locates header J skip
|
|
SET_BIT(sLocatesData.iLocatesBitSet, BS_DONT_DO_J_SKIP)
|
|
|
|
FLOAT fDistanceToBlip
|
|
VECTOR vOffsetToBlip
|
|
VECTOR vPlayerPosition = GET_ENTITY_COORDS(PLAYER_PED_ID())
|
|
|
|
SWITCH iTrevorProgress
|
|
|
|
CASE 0
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(vsTrevorsPlane.VehicleIndex)
|
|
|
|
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vsTrevorsPlane.VehicleIndex)
|
|
IF DOES_BLIP_EXIST(sLocatesData.vehicleBlip)
|
|
//remove collision flag for the plane entity
|
|
SET_ENTITY_LOAD_COLLISION_FLAG(vsTrevorsPlane.VehicleIndex, FALSE)
|
|
ENDIF
|
|
|
|
IF ( bMusicEventTrevorPlaneTriggered = FALSE )
|
|
IF IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), vsTrevorsPlane.VehicleIndex)
|
|
IF TRIGGER_MUSIC_EVENT("MIC1_TREVOR_PLANE")
|
|
START_AUDIO_SCENE("MI_1_TREV_FLY_TO_LUDENDORFF")
|
|
bMusicEventTrevorPlaneTriggered = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF ( bWeatherTypeOvercastSet = FALSE )
|
|
SET_WEATHER_TYPE_OVERTIME_PERSIST("OVERCAST", 60.0)
|
|
iWeatherTypeTimer = GET_GAME_TIMER()
|
|
bWeatherTypeOvercastSet = TRUE
|
|
ENDIF
|
|
|
|
IF ( bWeatherTypeRainSet = FALSE )
|
|
IF ( bWeatherTypeOvercastSet = TRUE)
|
|
IF ( iWeatherTypeTimer <> 0 AND HAS_TIME_PASSED(60000, iWeatherTypeTimer) )
|
|
SET_WEATHER_TYPE_OVERTIME_PERSIST("RAIN", 35.0)
|
|
IF IS_VEHICLE_DRIVEABLE(vsTrevorsPlane.VehicleIndex)
|
|
PLAY_SOUND_FROM_ENTITY(iRainOnPlaneSoundID, "MIC_1_RAIN_ON_PLANE_MASTER", vsTrevorsPlane.VehicleIndex)
|
|
ENDIF
|
|
iWeatherTypeTimer = GET_GAME_TIMER()
|
|
bWeatherTypeRainSet = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF ( bWeatherTypeThunderSet = FALSE )
|
|
IF ( bWeatherTypeRainSet = TRUE)
|
|
IF ( iWeatherTypeTimer <> 0 AND HAS_TIME_PASSED(35000, iWeatherTypeTimer) )
|
|
SET_WEATHER_TYPE_OVERTIME_PERSIST("THUNDER", 35.0)
|
|
bWeatherTypeThunderSet = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ELSE
|
|
IF NOT DOES_BLIP_EXIST(sLocatesData.vehicleBlip)
|
|
//add collision flag for the plane entity
|
|
SET_ENTITY_LOAD_COLLISION_FLAG(vsTrevorsPlane.VehicleIndex, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
|
|
fDistanceToBlip = GET_DISTANCE_BETWEEN_COORDS(GET_BLIP_COORDS(sLocatesData.LocationBlip), vPlayerPosition)
|
|
IF DOES_ENTITY_EXIST(osGolfBall.ObjectIndex)
|
|
IF NOT IS_ENTITY_DEAD(osGolfBall.ObjectIndex)
|
|
vOffsetToBlip = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(osGolfBall.ObjectIndex, vPlayerPosition)
|
|
ENDIF
|
|
ENDIF
|
|
#IF IS_DEBUG_BUILD
|
|
DRAW_DEBUG_TEXT_ABOVE_ENTITY(vsTrevorsPlane.VehicleIndex, GET_STRING_FROM_FLOAT(fDistanceToBlip), 1.25)
|
|
DRAW_DEBUG_TEXT_ABOVE_ENTITY(vsTrevorsPlane.VehicleIndex, GET_STRING_FROM_FLOAT(vOffsetToBlip.y), 2.0)
|
|
DRAW_DEBUG_SPHERE(GET_BLIP_COORDS(sLocatesData.LocationBlip), 500, 0, 0, 255, 128)
|
|
#ENDIF
|
|
ENDIF
|
|
|
|
IF NOT HAS_LABEL_BEEN_TRIGGERED("MCH1_TRON")
|
|
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
|
|
IF fDistanceToBlip > 0 AND fDistanceToBlip < 2200
|
|
SEND_TEXT_MESSAGE_TO_CURRENT_PLAYER(CHAR_RON, "MCH1_TRON", TXTMSG_UNLOCKED, TXTMSG_CRITICAL)
|
|
SET_LABEL_AS_TRIGGERED("MCH1_TRON", TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_PLAYER_AT_LOCATION_IN_VEHICLE(sLocatesData, << sLocateFlight.vPosition.x, sLocateFlight.vPosition.y, vPlayerPosition.z >> , sLocateFlight.vSize, FALSE, vsTrevorsPlane.VehicleIndex, "MCH1_GT_T3", "CMN_GENGETINPL", "CMN_GENGETBCKPL", TRUE)
|
|
OR ( DOES_BLIP_EXIST(sLocatesData.LocationBlip) AND vOffsetToBlip.y > 0 AND fDistanceToBlip > 0 AND fDistanceToBlip < 500 ) //plane in front of blip
|
|
|
|
CLEAR_MISSION_LOCATION_TEXT_AND_BLIPS(sLocatesData)
|
|
|
|
TRIGGER_MUSIC_EVENT("MIC1_FLIGHT_ARRIVING")
|
|
|
|
IF NOT IS_PED_INJURED(psMichael.PedIndex)
|
|
CLEAR_PED_TASKS(psMichael.PedIndex)
|
|
SET_PED_AS_NO_LONGER_NEEDED(psMichael.PedIndex)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(vsMichaelsCar.VehicleIndex)
|
|
SET_VEHICLE_AS_NO_LONGER_NEEDED(vsMichaelsCar.VehicleIndex)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
CLEAR_PED_TASKS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
SET_PED_AS_NO_LONGER_NEEDED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
ENDIF
|
|
|
|
IF DOES_BLIP_EXIST(psMichael.BlipIndex)
|
|
REMOVE_BLIP(psMichael.BlipIndex)
|
|
ENDIF
|
|
|
|
DISABLE_CELLPHONE_THIS_FRAME_ONLY()
|
|
CLEANUP_MISSION_OBJECT(osGolfBall, TRUE)
|
|
|
|
//also remove Trevor's plane on fade out
|
|
IF IS_VEHICLE_DRIVEABLE(vsTrevorsPlane.VehicleIndex)
|
|
SET_VEHICLE_AS_NO_LONGER_NEEDED(vsTrevorsPlane.VehicleIndex)
|
|
ENDIF
|
|
|
|
bCutsceneTriggeredByTrevor = TRUE
|
|
|
|
DO_SCREEN_FADE_OUT(DEFAULT_FADE_TIME_LONG)
|
|
|
|
iTrevorProgress++
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 1
|
|
|
|
DISABLE_CELLPHONE_THIS_FRAME_ONLY()
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_EXIT)
|
|
|
|
IF IS_SCREEN_FADED_OUT() AND NOT IS_SCREEN_FADING_OUT()
|
|
|
|
RETURN TRUE
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
RETURN FALSE
|
|
|
|
ENDFUNC
|
|
|
|
FUNC BOOL IS_MISSION_STAGE_CUTSCENE_AIRPORT_COMPLETED(INT &iMichaelProgress, INT &iTrevorProgress)
|
|
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
|
|
|
|
SWITCH iMichaelProgress
|
|
|
|
CASE 0
|
|
|
|
IF HAS_REQUESTED_CUTSCENE_LOADED("mic_1_mcs_1")
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
REGISTER_ENTITY_FOR_CUTSCENE(PLAYER_PED_ID(), "Michael", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
|
|
REGISTER_ENTITY_FOR_CUTSCENE(vsCutsceneCar.VehicleIndex, "Chinese_Goon_Car", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, ORACLE2)
|
|
|
|
CLEAR_PRINTS()
|
|
CLEAR_HELP()
|
|
|
|
IF IS_PLAYER_PLAYING(PLAYER_ID())
|
|
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
|
|
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
|
|
ENDIF
|
|
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
|
|
|
|
START_CUTSCENE()
|
|
|
|
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, TRUE, FALSE) //make sure the cutscene fades out at the end
|
|
|
|
iMichaelProgress++
|
|
|
|
ELSE
|
|
|
|
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
|
|
//Michael's variations
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", PLAYER_PED_ID())
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 1 //fade screen in if screen was faded out due to shit skip or debug skip
|
|
|
|
IF IS_CUTSCENE_PLAYING()
|
|
|
|
SUPPRESS_RESTRICTED_AREA_WANTED_LEVEL(AC_AIRPORT_AIRSIDE) //this will stop player from being wanted for being at the airport
|
|
|
|
IF DOES_CAM_EXIST(ScriptedCamera)
|
|
DESTROY_ALL_CAMS()
|
|
RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
DISPLAY_HUD(TRUE)
|
|
DISPLAY_RADAR(TRUE)
|
|
ENDIF
|
|
|
|
VEHICLE_INDEX LastPlayerVehicleIndex
|
|
|
|
LastPlayerVehicleIndex = GET_PLAYERS_LAST_VEHICLE()
|
|
|
|
IF DOES_ENTITY_EXIST(LastPlayerVehicleIndex)
|
|
|
|
IF NOT IS_ENTITY_DEAD(LastPlayerVehicleIndex)
|
|
|
|
IF GET_DISTANCE_BETWEEN_COORDS(psMichael.vPosition, GET_ENTITY_COORDS(LastPlayerVehicleIndex)) < 15.0
|
|
|
|
IF ( LastPlayerVehicleIndex <> vsMichaelsCar.VehicleIndex )
|
|
SET_ENTITY_AS_MISSION_ENTITY(LastPlayerVehicleIndex)
|
|
ENDIF
|
|
|
|
SET_ENTITY_COORDS(LastPlayerVehicleIndex, vsMichaelsCar.vPosition)
|
|
SET_ENTITY_HEADING(LastPlayerVehicleIndex, vsMichaelsCar.fHeading)
|
|
SET_VEHICLE_ON_GROUND_PROPERLY(LastPlayerVehicleIndex)
|
|
SET_VEHICLE_DOORS_SHUT(LastPlayerVehicleIndex, TRUE)
|
|
SET_VEHICLE_ENGINE_ON(LastPlayerVehicleIndex, FALSE, TRUE)
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
//clear area when starting the cutscene
|
|
//CLEAR_AREA(psMichael.vPosition, 25.0, TRUE)
|
|
STOP_FIRE_IN_RANGE(psMichael.vPosition, 25.0)
|
|
CLEAR_AREA_OF_VEHICLES(psMichael.vPosition, 25.0)
|
|
CLEAR_AREA_OF_PROJECTILES(psMichael.vPosition, 25.0)
|
|
REMOVE_PARTICLE_FX_IN_RANGE(psMichael.vPosition, 25.0)
|
|
|
|
//clear area of peds that could run into the cutscene area, see B*1799643
|
|
CLEAR_AREA_OF_PEDS(<< -1035.41455, -2743.94922, 19.16928 >>, 6.0)
|
|
CLEAR_AREA_OF_PEDS(<< -1035.51782, -2739.14380, 19.16928 >>, 3.5)
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
REMOVE_PED_HELMET(PLAYER_PED_ID(), TRUE)
|
|
ENDIF
|
|
|
|
IF IS_SCREEN_FADED_OUT()
|
|
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
|
|
ENDIF
|
|
|
|
iMichaelProgress++
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 2
|
|
|
|
VEHICLE_INDEX LastPlayerVehicleIndex
|
|
|
|
LastPlayerVehicleIndex = GET_PLAYERS_LAST_VEHICLE()
|
|
|
|
IF DOES_ENTITY_EXIST(LastPlayerVehicleIndex)
|
|
IF ( LastPlayerVehicleIndex <> vsMichaelsCar.VehicleIndex )
|
|
IF IS_ENTITY_A_MISSION_ENTITY(LastPlayerVehicleIndex)
|
|
SET_VEHICLE_AS_NO_LONGER_NEEDED(LastPlayerVehicleIndex)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT DOES_ENTITY_EXIST(vsCutsceneCar.VehicleIndex)
|
|
IF DOES_CUTSCENE_ENTITY_EXIST("Chinese_Goon_Car")
|
|
IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Chinese_Goon_Car"))
|
|
vsCutsceneCar.VehicleIndex = GET_VEHICLE_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Chinese_Goon_Car"))
|
|
SET_VEHICLE_ENGINE_ON(vsCutsceneCar.VehicleIndex, TRUE, TRUE)
|
|
SET_VEHICLE_LIGHTS(vsCutsceneCar.VehicleIndex, SET_VEHICLE_LIGHTS_ON)
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created vehicle Chinese_Goon_Car in the cutscene.")
|
|
#ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Chinese_Goon_Car")
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY() returned true for Chinese_Goon_Car.")
|
|
#ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(vsCutsceneCar.VehicleIndex)
|
|
DELETE_VEHICLE(vsCutsceneCar.VehicleIndex)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF HAS_CUTSCENE_FINISHED()
|
|
|
|
IF DOES_ENTITY_EXIST(vsMichaelsCar.VehicleIndex)
|
|
SET_VEHICLE_AS_NO_LONGER_NEEDED(vsMichaelsCar.VehicleIndex)
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(vsCutsceneCar.VehicleIndex)
|
|
DELETE_VEHICLE(vsCutsceneCar.VehicleIndex)
|
|
ENDIF
|
|
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
|
|
|
|
iMichaelProgress++
|
|
|
|
ELSE
|
|
|
|
//if cutscene is skipped keep the screen faded out
|
|
//it will be faded in during the next stage
|
|
IF WAS_CUTSCENE_SKIPPED()
|
|
|
|
SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, FALSE, FALSE)
|
|
|
|
ENDIF
|
|
|
|
//start requesting prologue IPLs
|
|
REQUEST_PROLOGUE_IPLS(#IF IS_DEBUG_BUILD bPrintDebugOutput #ENDIF)
|
|
REQUEST_PROLOGUE_GRAVE_IPL(FALSE)
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 3
|
|
//This is a hacky fix for 2834796 where the warning message forces a fade-in
|
|
IF NOT IS_SCREEN_FADING_OUT() OR NOT IS_SCREEN_FADED_OUT()
|
|
DO_SCREEN_FADE_OUT(0)
|
|
ENDIF
|
|
|
|
IF IS_SCREEN_FADED_OUT()
|
|
|
|
IF ARE_PROLOGUE_IPLS_ACTIVE()
|
|
AND IS_PROLOGUE_GRAVE_IPL_ACTIVE(FALSE)
|
|
REPLAY_STOP_EVENT()
|
|
RETURN TRUE
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
|
|
|
|
IF IS_SCREEN_FADED_OUT()
|
|
|
|
DISABLE_CELLPHONE_THIS_FRAME_ONLY()
|
|
|
|
SWITCH iTrevorProgress
|
|
|
|
CASE 0
|
|
|
|
//start requesting prologue IPLs
|
|
REQUEST_PROLOGUE_IPLS(#IF IS_DEBUG_BUILD TRUE #ENDIF)
|
|
|
|
IF IS_PLAYER_PLAYING(PLAYER_ID())
|
|
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
|
|
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
|
|
ENDIF
|
|
|
|
iTrevorProgress++
|
|
|
|
BREAK
|
|
|
|
CASE 1
|
|
|
|
IF ARE_PROLOGUE_IPLS_ACTIVE(#IF IS_DEBUG_BUILD TRUE #ENDIF)
|
|
AND IS_PROLOGUE_GRAVE_IPL_ACTIVE(TRUE)
|
|
|
|
REPLAY_STOP_EVENT()
|
|
|
|
RETURN TRUE
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
|
|
ENDFUNC
|
|
|
|
PROC MANAGE_MISSION_TRAIN_DURING_DRIVE_TO_GRAVEYARD(INT &iProgress)
|
|
|
|
SWITCH iProgress
|
|
|
|
CASE 0
|
|
|
|
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<4363.457031,-5083.799805,109.941292>>,<<32.000000,164.000000,8.000000>>)
|
|
|
|
iProgress++
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 1
|
|
|
|
IF REQUEST_SCRIPT_AUDIO_BANK("Prologue_Train_Sounds")
|
|
AND HAS_MISSION_TRAIN_BEEN_CREATED(tsTrain, fFirstTrainSpeed, FALSE)
|
|
|
|
IF HAS_SOUND_FINISHED(iTrainBellsSoundID)
|
|
PLAY_SOUND_FROM_COORD(iTrainBellsSoundID, "Train_Bell", << 3882.67, -5017.19, 113.72 >>, "Prologue_Sounds")
|
|
ENDIF
|
|
|
|
iProgress++
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 2
|
|
|
|
IF DOES_ENTITY_EXIST(tsTrain.VehicleIndex)
|
|
AND DOES_ENTITY_EXIST(tsTrain.PedIndex)
|
|
|
|
IF IS_ENTITY_AT_COORD(tsTrain.VehicleIndex, << 3960.78, -5569.91, 110.00 >>, << 10.0, 10.0, 10.0 >>)
|
|
|
|
DELETE_PED(tsTrain.PedIndex)
|
|
DELETE_MISSION_TRAIN(tsTrain.VehicleIndex)
|
|
|
|
IF NOT HAS_SOUND_FINISHED(iTrainBellsSoundID)
|
|
STOP_SOUND(iTrainBellsSoundID)
|
|
ENDIF
|
|
|
|
RELEASE_NAMED_SCRIPT_AUDIO_BANK("Prologue_Train_Sounds")
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Deleted mission train.")
|
|
#ENDIF
|
|
|
|
iProgress++
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
ENDPROC
|
|
|
|
PROC MANAGE_WEAPONS_HELP_TEXT()
|
|
|
|
IF ( bWeaponsHelpDisplayed = FALSE )
|
|
IF NOT HAS_LABEL_BEEN_TRIGGERED("MCH1_HWEAP")
|
|
IF IS_HUD_COMPONENT_ACTIVE(NEW_HUD_WEAPON_WHEEL)
|
|
PRINT_HELP("MCH1_HWEAP", DEFAULT_HELP_TEXT_TIME)
|
|
SET_LABEL_AS_TRIGGERED("MCH1_HWEAP", TRUE)
|
|
bWeaponsHelpDisplayed = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC MANAGE_FLASHBACK_STREAM(INT &iProgress)
|
|
|
|
IF ( bStartFlashBackStream = TRUE )
|
|
SWITCH iProgress
|
|
CASE 0
|
|
IF NOT IS_STREAM_PLAYING()
|
|
|
|
IF IS_AUDIO_SCENE_ACTIVE("MI_1_MIC_DUCKING_FOR_SPEECH_SCENE")
|
|
STOP_AUDIO_SCENE("MI_1_MIC_DUCKING_FOR_SPEECH_SCENE")
|
|
ENDIF
|
|
|
|
IF LOAD_STREAM("FLASHBACK_01", "MICHAEL1_FLASHBACK_SOUNDSET")
|
|
IF IS_PED_SITTING_IN_THIS_VEHICLE(PLAYER_PED_ID(), vsMichaelsCar.VehicleIndex)
|
|
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), vStreamTriggerPosition1, << 42.0, 128.0, 8.0 >>)
|
|
PLAY_STREAM_FRONTEND()
|
|
iFlashbackSubtitleProgress = 0
|
|
SET_LABEL_AS_TRIGGERED("FLASHBACK_01", TRUE)
|
|
START_AUDIO_SCENE("MI_1_MIC_DUCKING_FOR_SPEECH_SCENE")
|
|
iProgress++
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
CASE 1
|
|
IF NOT IS_STREAM_PLAYING()
|
|
|
|
IF IS_AUDIO_SCENE_ACTIVE("MI_1_MIC_DUCKING_FOR_SPEECH_SCENE")
|
|
STOP_AUDIO_SCENE("MI_1_MIC_DUCKING_FOR_SPEECH_SCENE")
|
|
ENDIF
|
|
|
|
IF LOAD_STREAM("FLASHBACK_02", "MICHAEL1_FLASHBACK_SOUNDSET")
|
|
IF IS_PED_SITTING_IN_THIS_VEHICLE(PLAYER_PED_ID(), vsMichaelsCar.VehicleIndex)
|
|
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), vStreamTriggerPosition2, << 132.0, 196.0, 16.0 >>)
|
|
PLAY_STREAM_FRONTEND()
|
|
iFlashbackSubtitleProgress = 10
|
|
SET_LABEL_AS_TRIGGERED("FLASHBACK_02", TRUE)
|
|
START_AUDIO_SCENE("MI_1_MIC_DUCKING_FOR_SPEECH_SCENE")
|
|
iProgress++
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
CASE 2
|
|
IF NOT IS_STREAM_PLAYING()
|
|
|
|
IF IS_AUDIO_SCENE_ACTIVE("MI_1_MIC_DUCKING_FOR_SPEECH_SCENE")
|
|
STOP_AUDIO_SCENE("MI_1_MIC_DUCKING_FOR_SPEECH_SCENE")
|
|
ENDIF
|
|
|
|
IF LOAD_STREAM("FLASHBACK_03", "MICHAEL1_FLASHBACK_SOUNDSET")
|
|
IF IS_PED_SITTING_IN_THIS_VEHICLE(PLAYER_PED_ID(), vsMichaelsCar.VehicleIndex)
|
|
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), vStreamTriggerPosition3, << 72.0, 72.0, 16.0 >>)
|
|
PLAY_STREAM_FRONTEND()
|
|
iFlashbackSubtitleProgress = 20
|
|
SET_LABEL_AS_TRIGGERED("FLASHBACK_03", TRUE)
|
|
START_AUDIO_SCENE("MI_1_MIC_DUCKING_FOR_SPEECH_SCENE")
|
|
iProgress++
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
|
|
SWITCH iFlashbackSubtitleProgress
|
|
CASE 0
|
|
IF HAS_LABEL_BEEN_TRIGGERED("FLASHBACK_01")
|
|
IF IS_STREAM_PLAYING()
|
|
IF GET_STREAM_PLAY_TIME() >= 100
|
|
IF NOT IS_THIS_PRINT_BEING_DISPLAYED("MCH1_GBRLC")
|
|
PRINT_FAKE_SUBTITLE("MCH1_FLASH1", 10000)
|
|
ENDIF
|
|
iFlashbackSubtitleProgress++
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
CASE 1
|
|
IF IS_STREAM_PLAYING()
|
|
IF GET_STREAM_PLAY_TIME() >= 10300
|
|
IF NOT IS_THIS_PRINT_BEING_DISPLAYED("MCH1_GBRLC")
|
|
PRINT_FAKE_SUBTITLE("MCH1_FLASH2", DEFAULT_GOD_TEXT_TIME)
|
|
ENDIF
|
|
iFlashbackSubtitleProgress++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
CASE 2
|
|
IF IS_STREAM_PLAYING()
|
|
IF GET_STREAM_PLAY_TIME() >= 13500
|
|
IF NOT IS_THIS_PRINT_BEING_DISPLAYED("MCH1_GBRLC")
|
|
PRINT_FAKE_SUBTITLE("MCH1_FLASH3", 10000)
|
|
ENDIF
|
|
iFlashbackSubtitleProgress++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
CASE 3
|
|
IF IS_STREAM_PLAYING()
|
|
IF GET_STREAM_PLAY_TIME() >= 23000
|
|
IF NOT IS_THIS_PRINT_BEING_DISPLAYED("MCH1_GBRLC")
|
|
PRINT_FAKE_SUBTITLE("MCH1_FLASH4", DEFAULT_GOD_TEXT_TIME)
|
|
ENDIF
|
|
iFlashbackSubtitleProgress++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
CASE 4
|
|
IF IS_STREAM_PLAYING()
|
|
IF GET_STREAM_PLAY_TIME() >= 26500
|
|
IF NOT IS_THIS_PRINT_BEING_DISPLAYED("MCH1_GBRLC")
|
|
PRINT_FAKE_SUBTITLE("MCH1_FLASH5", 10000)
|
|
ENDIF
|
|
iFlashbackSubtitleProgress++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
CASE 5
|
|
IF IS_STREAM_PLAYING()
|
|
IF GET_STREAM_PLAY_TIME() >= 36500
|
|
IF NOT IS_THIS_PRINT_BEING_DISPLAYED("MCH1_GBRLC")
|
|
PRINT_FAKE_SUBTITLE("MCH1_FLASH6", 10000)
|
|
ENDIF
|
|
iFlashbackSubtitleProgress++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
CASE 6
|
|
IF IS_STREAM_PLAYING()
|
|
IF GET_STREAM_PLAY_TIME() >= 42300
|
|
IF NOT IS_THIS_PRINT_BEING_DISPLAYED("MCH1_GBRLC")
|
|
PRINT_FAKE_SUBTITLE("MCH1_FLASH7", 5000)
|
|
iFlashbackSubtitleProgress++
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 10
|
|
IF HAS_LABEL_BEEN_TRIGGERED("FLASHBACK_02")
|
|
IF IS_STREAM_PLAYING()
|
|
IF GET_STREAM_PLAY_TIME() >= 100
|
|
IF NOT IS_THIS_PRINT_BEING_DISPLAYED("MCH1_GBRLC")
|
|
PRINT_FAKE_SUBTITLE("MCH1_FLASH8", DEFAULT_GOD_TEXT_TIME)
|
|
ENDIF
|
|
iFlashbackSubtitleProgress++
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
CASE 11
|
|
IF IS_STREAM_PLAYING()
|
|
IF GET_STREAM_PLAY_TIME() >= 7500
|
|
IF NOT IS_THIS_PRINT_BEING_DISPLAYED("MCH1_GBRLC")
|
|
PRINT_FAKE_SUBTITLE("MCH1_FLASH9", DEFAULT_GOD_TEXT_TIME)
|
|
ENDIF
|
|
iFlashbackSubtitleProgress++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
CASE 12
|
|
IF IS_STREAM_PLAYING()
|
|
IF GET_STREAM_PLAY_TIME() >= 12500
|
|
IF NOT IS_THIS_PRINT_BEING_DISPLAYED("MCH1_GBRLC")
|
|
PRINT_FAKE_SUBTITLE("MCH1_FLASH10", 10000)
|
|
ENDIF
|
|
iFlashbackSubtitleProgress++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
CASE 13
|
|
IF IS_STREAM_PLAYING()
|
|
IF GET_STREAM_PLAY_TIME() >= 22600
|
|
IF NOT IS_THIS_PRINT_BEING_DISPLAYED("MCH1_GBRLC")
|
|
PRINT_FAKE_SUBTITLE("MCH1_FLASH11", 4300)
|
|
ENDIF
|
|
iFlashbackSubtitleProgress++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 20
|
|
IF HAS_LABEL_BEEN_TRIGGERED("FLASHBACK_03")
|
|
IF IS_STREAM_PLAYING()
|
|
IF GET_STREAM_PLAY_TIME() >= 100
|
|
IF NOT IS_THIS_PRINT_BEING_DISPLAYED("MCH1_GBRLC")
|
|
PRINT_FAKE_SUBTITLE("MCH1_FLASH12", DEFAULT_GOD_TEXT_TIME)
|
|
ENDIF
|
|
iFlashbackSubtitleProgress++
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
CASE 21
|
|
IF IS_STREAM_PLAYING()
|
|
IF GET_STREAM_PLAY_TIME() >= 4000
|
|
IF NOT IS_THIS_PRINT_BEING_DISPLAYED("MCH1_GBRLC")
|
|
PRINT_FAKE_SUBTITLE("MCH1_FLASH13", DEFAULT_GOD_TEXT_TIME)
|
|
ENDIF
|
|
iFlashbackSubtitleProgress++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
CASE 22
|
|
IF IS_STREAM_PLAYING()
|
|
IF GET_STREAM_PLAY_TIME() >= 7500
|
|
IF NOT IS_THIS_PRINT_BEING_DISPLAYED("MCH1_GBRLC")
|
|
PRINT_FAKE_SUBTITLE("MCH1_FLASH14", 4500)
|
|
ENDIF
|
|
iFlashbackSubtitleProgress++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF IS_STREAM_PLAYING()
|
|
IF NOT IS_PED_IN_THIS_VEHICLE(PLAYER_PED_ID(), vsMichaelsCar.VehicleIndex) AND bMusicEventArrivedChurchTriggered = FALSE //if not in mission vehicle and not arrived at church yet
|
|
|
|
STOP_STREAM()
|
|
STOP_AUDIO_SCENE("MI_1_MIC_DUCKING_FOR_SPEECH_SCENE")
|
|
|
|
IF IS_THIS_PRINT_BEING_DISPLAYED("MCH1_FLASH1")
|
|
OR IS_THIS_PRINT_BEING_DISPLAYED("MCH1_FLASH2")
|
|
OR IS_THIS_PRINT_BEING_DISPLAYED("MCH1_FLASH3")
|
|
OR IS_THIS_PRINT_BEING_DISPLAYED("MCH1_FLASH4")
|
|
OR IS_THIS_PRINT_BEING_DISPLAYED("MCH1_FLASH5")
|
|
OR IS_THIS_PRINT_BEING_DISPLAYED("MCH1_FLASH6")
|
|
OR IS_THIS_PRINT_BEING_DISPLAYED("MCH1_FLASH7")
|
|
OR IS_THIS_PRINT_BEING_DISPLAYED("MCH1_FLASH8")
|
|
OR IS_THIS_PRINT_BEING_DISPLAYED("MCH1_FLASH9")
|
|
OR IS_THIS_PRINT_BEING_DISPLAYED("MCH1_FLASH10")
|
|
OR IS_THIS_PRINT_BEING_DISPLAYED("MCH1_FLASH11")
|
|
OR IS_THIS_PRINT_BEING_DISPLAYED("MCH1_FLASH12")
|
|
OR IS_THIS_PRINT_BEING_DISPLAYED("MCH1_FLASH13")
|
|
OR IS_THIS_PRINT_BEING_DISPLAYED("MCH1_FLASH14")
|
|
CLEAR_PRINTS()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Fix for B*1713614, disable jumpin and climbing in norty yankton locates that allowed player to escape playable map area.
|
|
PROC DISABLE_JUMPING_AND_CLIMBING_TO_STOP_MAP_ESCAPE()
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<3198.784912,-4801.354004,115.809845>>,<<5.000000,5.000000,5.000000>>)
|
|
OR IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<3187.924316,-4756.938965,115.639969>>,<<20.000000,46.000000,5.000000>>)
|
|
SET_PED_RESET_FLAG(PLAYER_PED_ID(), PRF_DisablePlayerAutoVaulting, TRUE)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_JUMP)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
FUNC BOOL IS_MISSION_STAGE_GET_TO_GRAVEYARD_COMPLETED(INT &iStageProgress)
|
|
|
|
SET_BIT(sLocatesData.iLocatesBitSet, BS_DONT_DO_J_SKIP)
|
|
|
|
IF DOES_CAM_EXIST(ScriptedCamera)
|
|
HIDE_HUD_AND_RADAR_THIS_FRAME()
|
|
ENDIF
|
|
|
|
IF ( GET_CLOCK_HOURS() < 22 )
|
|
OR ( GET_CLOCK_HOURS() = 23 AND GET_CLOCK_MINUTES() = 59)
|
|
SET_CLOCK_TIME(0, 0, 0)
|
|
ENDIF
|
|
|
|
MANAGE_WEAPONS_HELP_TEXT()
|
|
UPDATE_TRIGGERED_LABEL(sLabelGTLC)
|
|
MANAGE_FLASHBACK_STREAM(iFlashbackStreamProgress)
|
|
MANAGE_MISSION_TRAIN_DURING_DRIVE_TO_GRAVEYARD(tsTrain.iProgress)
|
|
|
|
DISABLE_JUMPING_AND_CLIMBING_TO_STOP_MAP_ESCAPE() //fix for B*1713614
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
IF ( bDrawDebugStates = TRUE )
|
|
DRAW_DEBUG_VEHICLE_RECORDING_INFO(vsMichaelsCar.VehicleIndex, 1.0)
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
SWITCH iStageProgress
|
|
|
|
CASE 0
|
|
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("MI_1_MIC_DRIVE_TO_GRAVEYARD")
|
|
START_AUDIO_SCENE("MI_1_MIC_DRIVE_TO_GRAVEYARD")
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(vsMichaelsCar.VehicleIndex)
|
|
|
|
STOP_PED_SPEAKING(PLAYER_PED_ID(), TRUE)
|
|
|
|
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), vsMichaelsCar.VehicleIndex, VS_DRIVER)
|
|
SET_VEHICLE_ENGINE_ON(vsMichaelsCar.VehicleIndex, TRUE, TRUE)
|
|
SET_VEHICLE_ON_GROUND_PROPERLY(vsMichaelsCar.VehicleIndex)
|
|
MODIFY_VEHICLE_TOP_SPEED(vsMichaelsCar.VehicleIndex, -20.0)
|
|
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0)
|
|
|
|
ENDIF
|
|
|
|
INITIALISE_ROADNODES(sRoadNodes)
|
|
|
|
DISABLE_CELLPHONE(TRUE)
|
|
|
|
DISPLAY_RADAR(FALSE)
|
|
DISPLAY_HUD(FALSE)
|
|
|
|
IF IS_PLAYER_PLAYING(PLAYER_ID())
|
|
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
|
|
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
|
|
ENDIF
|
|
|
|
iStageProgress++
|
|
|
|
BREAK
|
|
|
|
CASE 1 //create scripted camera for Ludendorff arrival
|
|
|
|
//create scripted camera for graveyard arrival
|
|
IF NOT DOES_CAM_EXIST(ScriptedCamera)
|
|
|
|
ScriptedCamera = CREATE_CAMERA(CAMTYPE_SCRIPTED, TRUE)
|
|
|
|
SET_CAM_PARAMS(ScriptedCamera,<<5442.244141,-5127.124023,78.327057>>,<<-0.382159,-0.560862,56.809986>>,41.604355)
|
|
|
|
SHAKE_CAM(ScriptedCamera, "HAND_SHAKE", 0.1)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created scripted camera.")
|
|
#ENDIF
|
|
|
|
//SET_FRONTEND_RADIO_ACTIVE(FALSE)
|
|
|
|
ENDIF
|
|
|
|
IF DOES_CAM_EXIST(ScriptedCamera)
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
|
|
iStageProgress++
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 2
|
|
|
|
IF NOT IS_NEW_LOAD_SCENE_ACTIVE()
|
|
|
|
NEW_LOAD_SCENE_START(<< 5442.24, -5127.12, 78.24 >>, << -0.84, 0.55, -0.01>>, 128.0)
|
|
|
|
iLoadSceneTimer = GET_GAME_TIMER()
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Calling NEW_LOAD_SCENE_START().")
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Load scene timer: ", GET_GAME_TIMER() - iLoadSceneTimer, ".")
|
|
#ENDIF
|
|
|
|
IF IS_NEW_LOAD_SCENE_LOADED()
|
|
OR HAS_TIME_PASSED(10000, iLoadSceneTimer)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
IF HAS_TIME_PASSED(10000, iLoadSceneTimer)
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Calling NEW_LOAD_SCENE_STOP() due to iLoadSceneTimer timeout.")
|
|
ELSE
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Calling NEW_LOAD_SCENE_STOP() due to IS_NEW_LOAD_SCENE_LOADED() returning TRUE.")
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
NEW_LOAD_SCENE_STOP()
|
|
|
|
iStageProgress++
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 3
|
|
|
|
//start rendering the interpolating camera
|
|
IF DOES_CAM_EXIST(ScriptedCamera)
|
|
IF NOT IS_CAM_RENDERING(ScriptedCamera)
|
|
|
|
SET_CAM_PARAMS(ScriptedCamera,<<5442.244141,-5127.124023,78.327057>>,<<-0.382159,-0.560862,56.809986>>,41.604355)
|
|
SET_CAM_PARAMS(ScriptedCamera,<<5442.244141,-5127.124023,78.086525>>,<<-0.382159,-0.560862,56.809986>>,41.604355, 6000,
|
|
GRAPH_TYPE_LINEAR, GRAPH_TYPE_LINEAR)
|
|
|
|
DISPLAY_RADAR(FALSE)
|
|
DISPLAY_HUD(FALSE)
|
|
|
|
RENDER_SCRIPT_CAMS(TRUE, FALSE)
|
|
|
|
REPLAY_RECORD_BACK_FOR_TIME(0.0, 15.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
CLEAR_AREA_OF_VEHICLES(<< 5433.34, -5122.94, 77.07 >>, 60.0)
|
|
|
|
IF IS_SCREEN_FADED_OUT()
|
|
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
|
|
ENDIF
|
|
|
|
//start vehicle recording playback
|
|
START_VEHICLE_RECORDING_PLAYBACK_FOR_VEHICLE(vsMichaelsCar, sVehicleRecordingsFile, 0.75, FALSE, 3750)
|
|
|
|
TRIGGER_MUSIC_EVENT("MIC1_DRIVE_TO_GRAVEYARD")
|
|
|
|
bStartFlashBackStream = TRUE
|
|
|
|
iStageProgress++
|
|
|
|
BREAK
|
|
|
|
CASE 4
|
|
|
|
IF DOES_ENTITY_EXIST(vsMichaelsCar.VehicleIndex)
|
|
IF NOT IS_ENTITY_DEAD(vsMichaelsCar.VehicleIndex)
|
|
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vsMichaelsCar.VehicleIndex)
|
|
IF GET_TIME_POSITION_IN_RECORDING(vsMichaelsCar.VehicleIndex) >= fFirstRecordingEndTime
|
|
|
|
//destroy scripted camera
|
|
IF DOES_CAM_EXIST(ScriptedCamera)
|
|
|
|
IF GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_IN_VEHICLE) = CAM_VIEW_MODE_FIRST_PERSON
|
|
SETTIMERA(0)
|
|
SETTIMERB(0)
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": TIMERA is ", TIMERA(), ".")
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": TIMERB is ", TIMERB(), ".")
|
|
bFirstPersonFXTriggered = FALSE
|
|
bCamViewModeContextChanged = TRUE
|
|
SET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_IN_VEHICLE, CAM_VIEW_MODE_THIRD_PERSON_MEDIUM)
|
|
ENDIF
|
|
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0)
|
|
|
|
SET_CAM_ACTIVE(ScriptedCamera, FALSE)
|
|
RENDER_SCRIPT_CAMS(FALSE, TRUE, iCameraInterpolationTimer)
|
|
DESTROY_CAM(ScriptedCamera)
|
|
DISPLAY_RADAR(TRUE)
|
|
DISPLAY_HUD(TRUE)
|
|
//SET_FRONTEND_RADIO_ACTIVE(TRUE)
|
|
ENDIF
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
|
|
vsMichaelsCar.iRecordingNumber = 004 //change the recording number for the next recording needed
|
|
|
|
DISABLE_CELLPHONE(FALSE)
|
|
|
|
iStageProgress++
|
|
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 5
|
|
|
|
//disable default first person flash and handle one manually
|
|
DISABLE_FIRST_PERSON_FLASH_EFFECT_THIS_UPDATE()
|
|
|
|
//disable player camera control when camera is interpolating from script camera to gameplay camera
|
|
IF IS_INTERPOLATING_FROM_SCRIPT_CAMS()
|
|
DISABLE_CONTROL_ACTION(CAMERA_CONTROL, INPUT_LOOK_BEHIND)
|
|
DISABLE_CONTROL_ACTION(CAMERA_CONTROL, INPUT_VEH_LOOK_BEHIND)
|
|
DISABLE_CONTROL_ACTION(CAMERA_CONTROL, INPUT_LOOK_LR)
|
|
DISABLE_CONTROL_ACTION(CAMERA_CONTROL, INPUT_LOOK_UD)
|
|
DISABLE_CONTROL_ACTION(CAMERA_CONTROL, INPUT_NEXT_CAMERA)
|
|
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": TIMERA is ", TIMERA(), ".")
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": TIMERB is ", TIMERB(), ".")
|
|
|
|
IF ( bCamViewModeContextChanged = TRUE )
|
|
IF ( bFirstPersonFXTriggered = FALSE )
|
|
IF TIMERA() > iFirstPersonFXTime
|
|
ANIMPOSTFX_PLAY("CamPushInNeutral", 0, FALSE)
|
|
PLAY_SOUND_FRONTEND(-1, "1st_Person_Transition", "PLAYER_SWITCH_CUSTOM_SOUNDSET")
|
|
bFirstPersonFXTriggered = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF ( bCamViewModeContextChanged = TRUE )
|
|
SET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_IN_VEHICLE, CAM_VIEW_MODE_FIRST_PERSON)
|
|
bCamViewModeContextChanged = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//check for playback interruption from player controls
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vsMichaelsCar.VehicleIndex)
|
|
|
|
IF ( bVehiclePlaybackInterrupted = FALSE )
|
|
|
|
IF GET_TIME_POSITION_IN_RECORDING(vsMichaelsCar.VehicleIndex) >= 10250.0
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(vsMichaelsCar.VehicleIndex)
|
|
ENDIF
|
|
|
|
IF IS_PLAYER_IN_CONTROL_OF_VEHICLE(vsMichaelsCar.VehicleIndex)
|
|
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(vsMichaelsCar.VehicleIndex)
|
|
|
|
CLEAR_PED_TASKS(PLAYER_PED_ID())
|
|
|
|
bVehiclePlaybackInterrupted = TRUE
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
//display locates stuff and objective
|
|
IS_PLAYER_AT_LOCATION_IN_VEHICLE(sLocatesData, psMichael.vDestination, << 0.25, 0.25, LOCATE_SIZE_HEIGHT >>, TRUE, vsMichaelsCar.VehicleIndex, sLabelGTLC, "CMN_GENGETIN", "CMN_GENGETBCK", TRUE)
|
|
|
|
RUN_ROADNODES_CHECK(PLAYER_PED_ID() #IF IS_DEBUG_BUILD, bPrintDebugOutput #ENDIF)
|
|
|
|
PREPARE_MUSIC_EVENT("MIC1_ARRIVED_CHURCH")
|
|
|
|
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
|
|
IF IS_ENTITY_AT_COORD(vsMichaelsCar.VehicleIndex, << 3219.976563, -4706.303223, 112.876556 >>, << 18.0, 20.0, 2.0 >>)
|
|
|
|
//create scripted camera for graveyard arrival
|
|
IF NOT DOES_CAM_EXIST(ScriptedCamera)
|
|
|
|
ScriptedCamera = CREATE_CAMERA(CAMTYPE_SCRIPTED, TRUE)
|
|
|
|
SET_CAM_PARAMS(ScriptedCamera, <<3212.395996,-4728.643555,113.433495>>,<<7.027314,0.084961,-27.492634>>,33.441017)
|
|
SET_CAM_PARAMS(ScriptedCamera, <<3213.253906,-4726.994629,113.662704>>,<<7.027314,0.084961,-27.492634>>,33.441017, 10000,
|
|
GRAPH_TYPE_DECEL, GRAPH_TYPE_DECEL)
|
|
|
|
SHAKE_CAM(ScriptedCamera, "HAND_SHAKE", 0.1)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created scripted camera.")
|
|
#ENDIF
|
|
|
|
DISPLAY_HUD(FALSE)
|
|
DISPLAY_RADAR(FALSE)
|
|
|
|
RENDER_SCRIPT_CAMS(TRUE, FALSE)
|
|
|
|
REPLAY_RECORD_BACK_FOR_TIME(8.0, 15.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
//SET_FRONTEND_RADIO_ACTIVE(FALSE)
|
|
|
|
ENDIF
|
|
|
|
IF DOES_CAM_EXIST(ScriptedCamera)
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
|
|
START_VEHICLE_RECORDING_PLAYBACK_FOR_VEHICLE(vsMichaelsCar, sVehicleRecordingsFile, 1.0, FALSE, fSecondRecordingStartTime)
|
|
|
|
DISABLE_CELLPHONE(TRUE)
|
|
KILL_FACE_TO_FACE_CONVERSATION()
|
|
INFORM_MISSION_STATS_SYSTEM_OF_INGAME_CUTSCENE_START()
|
|
|
|
iStageProgress++
|
|
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(vsMichaelsCar.VehicleIndex)
|
|
IF NOT IS_ENTITY_DEAD(vsMichaelsCar.VehicleIndex)
|
|
CLEAR_AREA_OF_PROJECTILES(GET_ENTITY_COORDS(vsMichaelsCar.VehicleIndex), 5.0)
|
|
REMOVE_PARTICLE_FX_IN_RANGE(GET_ENTITY_COORDS(vsMichaelsCar.VehicleIndex), 5.0)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
CLEAR_AREA(<< 3223.31, -4703.96, 111.83 >>, 10.0, TRUE)
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(vsMichaelsCar.VehicleIndex)
|
|
SET_VEHICLE_DOORS_SHUT(vsMichaelsCar.VehicleIndex, TRUE)
|
|
SET_ENTITY_INVINCIBLE(vsMichaelsCar.VehicleIndex, TRUE)
|
|
IF NOT IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), vsMichaelsCar.VehicleIndex)
|
|
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), vsMichaelsCar.VehicleIndex, VS_DRIVER)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<3236.007568,-4682.933105,113.858047>>,<<36.000000,16.000000,3.000000>>)
|
|
AND IS_ENTITY_AT_COORD(vsMichaelsCar.VehicleIndex, <<3236.007568,-4682.933105,113.858047>>,<<36.000000,16.000000,3.000000>>)
|
|
|
|
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
TASK_LEAVE_ANY_VEHICLE(PLAYER_PED_ID())
|
|
ENDIF
|
|
|
|
IF PREPARE_MUSIC_EVENT("MIC1_ARRIVED_CHURCH")
|
|
IF TRIGGER_MUSIC_EVENT("MIC1_ARRIVED_CHURCH")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
KILL_FACE_TO_FACE_CONVERSATION()
|
|
|
|
iStageProgress = 9 //skip to the last case of this stage
|
|
|
|
ENDIF
|
|
|
|
REQUEST_VEHICLE_RECORDING(vsMichaelsCar.iRecordingNumber, sVehicleRecordingsFile)
|
|
|
|
BREAK
|
|
|
|
CASE 6
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(vsMichaelsCar.VehicleIndex)
|
|
|
|
IF ( bMusicEventArrivedChurchTriggered = FALSE)
|
|
IF PREPARE_MUSIC_EVENT("MIC1_ARRIVED_CHURCH")
|
|
IF ( GET_TIME_POSITION_IN_RECORDING(vsMichaelsCar.VehicleIndex) > 3750.0 )
|
|
IF TRIGGER_MUSIC_EVENT("MIC1_ARRIVED_CHURCH")
|
|
bMusicEventArrivedChurchTriggered = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vsMichaelsCar.VehicleIndex)
|
|
IF GET_TIME_POSITION_IN_RECORDING(vsMichaelsCar.VehicleIndex) >= fSecondRecordingEndTime
|
|
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(vsMichaelsCar.VehicleIndex)
|
|
|
|
SET_ENTITY_COORDS(vsMichaelsCar.VehicleIndex, << 3212.0027, -4689.3232, 111.6762 >>)
|
|
SET_ENTITY_HEADING(vsMichaelsCar.VehicleIndex, 225.1631)
|
|
|
|
SET_VEHICLE_LIGHTS(vsMichaelsCar.VehicleIndex, FORCE_VEHICLE_LIGHTS_OFF)
|
|
SET_VEHICLE_ON_GROUND_PROPERLY(vsMichaelsCar.VehicleIndex)
|
|
|
|
psMichael.iTimer = GET_GAME_TIMER()
|
|
|
|
iStageProgress++
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 7
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(vsMichaelsCar.VehicleIndex)
|
|
|
|
IF HAS_TIME_PASSED(1000, psMichael.iTimer)
|
|
|
|
IF IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), vsMichaelsCar.VehicleIndex)
|
|
|
|
IF DOES_CAM_EXIST(ScriptedCamera)
|
|
|
|
SET_CAM_PARAMS(ScriptedCamera, <<3209.035889,-4688.779297,113.423576>>,<<-1.887575,-0.000000,-81.365829>>,54.466209)
|
|
SET_CAM_PARAMS(ScriptedCamera, <<3209.035889,-4688.779297,113.423576>>,<<-1.887575,-0.000000,-78.470566>>,54.466209, 3000,
|
|
GRAPH_TYPE_DECEL, GRAPH_TYPE_DECEL)
|
|
|
|
SHAKE_CAM(ScriptedCamera, "HAND_SHAKE", 0.1)
|
|
|
|
ENDIF
|
|
|
|
SEQUENCE_INDEX SequenceIndex
|
|
CLEAR_SEQUENCE_TASK(SequenceIndex)
|
|
OPEN_SEQUENCE_TASK(SequenceIndex)
|
|
TASK_LEAVE_VEHICLE(NULL, vsMichaelsCar.VehicleIndex)
|
|
TASK_TURN_PED_TO_FACE_COORD(NULL, << 3255.48, -4685.06, 113.11 >>)
|
|
TASK_LOOK_AT_COORD(NULL, << 3255.48, -4685.06, 113.11 >>, 3000)
|
|
CLOSE_SEQUENCE_TASK(SequenceIndex)
|
|
TASK_PERFORM_SEQUENCE(PLAYER_PED_ID(), SequenceIndex)
|
|
CLEAR_SEQUENCE_TASK(SequenceIndex)
|
|
|
|
INFORM_MISSION_STATS_SYSTEM_OF_INGAME_CUTSCENE_END()
|
|
|
|
psMichael.iTimer = GET_GAME_TIMER()
|
|
bFirstPersonFXTriggered = FALSE
|
|
|
|
iStageProgress++
|
|
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 8
|
|
|
|
IF DOES_CAM_EXIST(ScriptedCamera)
|
|
|
|
IF HAS_TIME_PASSED(1500, psMichael.iTimer)
|
|
|
|
iStageProgress++
|
|
|
|
ELIF HAS_TIME_PASSED(1200, psMichael.iTimer)
|
|
IF GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_ON_FOOT) = CAM_VIEW_MODE_FIRST_PERSON
|
|
IF ( bFirstPersonFXTriggered = FALSE )
|
|
ANIMPOSTFX_PLAY("CamPushInNeutral", 0, FALSE)
|
|
PLAY_SOUND_FRONTEND(-1, "1st_Person_Transition", "PLAYER_SWITCH_CUSTOM_SOUNDSET")
|
|
bFirstPersonFXTriggered = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 9 //other cases reference this value, update them as well, when this value changes
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(vsMichaelsCar.VehicleIndex)
|
|
SET_ENTITY_INVINCIBLE(vsMichaelsCar.VehicleIndex, FALSE)
|
|
ENDIF
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
|
|
CLEAR_MISSION_LOCATION_TEXT_AND_BLIPS(sLocatesData)
|
|
|
|
DISABLE_CELLPHONE(FALSE)
|
|
|
|
bCutsceneTriggeredByMichael = TRUE
|
|
|
|
STOP_AUDIO_SCENE("MI_1_MIC_DRIVE_TO_GRAVEYARD")
|
|
|
|
IF NOT IS_STREAM_PLAYING()
|
|
STOP_AUDIO_SCENE("MI_1_MIC_DUCKING_FOR_SPEECH_SCENE")
|
|
ENDIF
|
|
|
|
iStageProgress++
|
|
|
|
BREAK
|
|
|
|
CASE 10
|
|
|
|
IF DOES_CAM_EXIST(ScriptedCamera)
|
|
|
|
IF GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_ON_FOOT) = CAM_VIEW_MODE_FIRST_PERSON
|
|
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(45.0)
|
|
|
|
RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
ELSE
|
|
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
|
|
|
|
STOP_RENDERING_SCRIPT_CAMS_USING_CATCH_UP()
|
|
ENDIF
|
|
|
|
DISPLAY_HUD(TRUE)
|
|
DISPLAY_RADAR(TRUE)
|
|
|
|
DESTROY_CAM(ScriptedCamera)
|
|
DESTROY_ALL_CAMS()
|
|
|
|
ENDIF
|
|
|
|
CLEAR_PED_TASKS(PLAYER_PED_ID())
|
|
STOP_PED_SPEAKING(PLAYER_PED_ID(), FALSE)
|
|
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED, TRUE)
|
|
|
|
IF DOES_ENTITY_EXIST(tsTrain.VehicleIndex)
|
|
AND DOES_ENTITY_EXIST(tsTrain.PedIndex)
|
|
DELETE_PED(tsTrain.PedIndex)
|
|
DELETE_MISSION_TRAIN(tsTrain.VehicleIndex)
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Deleted mission train.")
|
|
#ENDIF
|
|
ENDIF
|
|
|
|
IF NOT HAS_SOUND_FINISHED(iTrainBellsSoundID)
|
|
STOP_SOUND(iTrainBellsSoundID)
|
|
ENDIF
|
|
|
|
RELEASE_NAMED_SCRIPT_AUDIO_BANK("Prologue_Train_Sounds")
|
|
|
|
RETURN TRUE
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
RETURN FALSE
|
|
|
|
ENDFUNC
|
|
|
|
PROC MANAGE_GAMEPLAY_HINT()
|
|
|
|
IF NOT IS_GAMEPLAY_HINT_ACTIVE()
|
|
SET_GAMEPLAY_HINT_FOV(fFocusPushHintFOV)
|
|
SET_GAMEPLAY_ENTITY_HINT(psTrevor.PedIndex, << 0.0, 0.0, 1.0>>, TRUE, -1, 2500)
|
|
|
|
SET_GAMEPLAY_HINT_CAMERA_BLEND_TO_FOLLOW_PED_MEDIUM_VIEW_MODE(TRUE)
|
|
|
|
SET_GAMEPLAY_HINT_CAMERA_RELATIVE_SIDE_OFFSET(fFocusPushSideOffset)
|
|
SET_GAMEPLAY_HINT_CAMERA_RELATIVE_VERTICAL_OFFSET(fFocusPushVerticalOffset)
|
|
|
|
SET_GAMEPLAY_HINT_FOLLOW_DISTANCE_SCALAR(fFocusPushFollowDistanceScalar)
|
|
SET_GAMEPLAY_HINT_BASE_ORBIT_PITCH_OFFSET(fFocusPushBaseOrbitPitchOffset)
|
|
ELSE
|
|
#IF IS_DEBUG_BUILD
|
|
IF ( bResetGameplayHint = TRUE )
|
|
STOP_GAMEPLAY_HINT(TRUE)
|
|
bResetGameplayHint = FALSE
|
|
ENDIF
|
|
#ENDIF
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
FUNC BOOL IS_MISSION_STAGE_GET_TO_GRAVE_COMPLETED(INT &iStageProgress)
|
|
|
|
SET_BIT(sLocatesData.iLocatesBitSet, BS_DONT_DO_J_SKIP)
|
|
|
|
IF ( GET_CLOCK_HOURS() < 22 )
|
|
OR ( GET_CLOCK_HOURS() = 23 AND GET_CLOCK_MINUTES() = 59)
|
|
SET_CLOCK_TIME(0, 0, 0)
|
|
ENDIF
|
|
|
|
MANAGE_WEAPONS_HELP_TEXT()
|
|
DISABLE_JUMPING_AND_CLIMBING_TO_STOP_MAP_ESCAPE() //fix for B*1713614
|
|
|
|
IF GET_DISTANCE_BETWEEN_COORDS(vGravePosition, GET_ENTITY_COORDS(PLAYER_PED_ID())) < 75.0
|
|
|
|
REQUEST_CUTSCENE_WITH_PLAYBACK_LIST("mic_1_mcs_2", CS_SECTION_3 | CS_SECTION_4 | CS_SECTION_5)
|
|
|
|
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
|
|
//Michael's variation
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", PLAYER_PED_ID())
|
|
//Trevor's variation
|
|
IF DOES_ENTITY_EXIST(psTrevor.PedIndex)
|
|
IF NOT IS_ENTITY_DEAD(psTrevor.PedIndex)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Trevor", psTrevor.PedIndex, GET_PLAYER_PED_MODEL(CHAR_TREVOR))
|
|
ENDIF
|
|
ELSE
|
|
SET_CUTSCENE_PED_OUTFIT("Trevor", GET_PLAYER_PED_MODEL(CHAR_TREVOR), OUTFIT_P2_LUDENDORFF)
|
|
ENDIF
|
|
//Chinese gunman's variations
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Chinese_gunman", PED_COMP_HAIR, 1, 0)
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
IF HAS_THIS_CUTSCENE_LOADED("mic_1_mcs_2")
|
|
OR HAS_CUTSCENE_LOADED()
|
|
OR IS_CUTSCENE_ACTIVE()
|
|
REMOVE_CUTSCENE()
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Player too far away from destination to keep cutscene in memory. Removing cutscene.")
|
|
#ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
SWITCH iStageProgress
|
|
|
|
CASE 0
|
|
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ENTER)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_EXIT)
|
|
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("MI_1_MIC_WALK_TO_GRAVEYARD")
|
|
IF IS_STREAM_PLAYING() STOP_STREAM() ENDIF
|
|
START_AUDIO_SCENE("MI_1_MIC_WALK_TO_GRAVEYARD")
|
|
ENDIF
|
|
|
|
IF IS_AUDIO_SCENE_ACTIVE("MI_1_MIC_DUCKING_FOR_SPEECH_SCENE")
|
|
IF NOT IS_STREAM_PLAYING()
|
|
STOP_AUDIO_SCENE("MI_1_MIC_DUCKING_FOR_SPEECH_SCENE")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT DOES_BLIP_EXIST(psMichael.BlipIndex)
|
|
psMichael.BlipIndex = ADD_BLIP_FOR_COORD(vGravePosition)
|
|
ENDIF
|
|
|
|
IF NOT HAS_LABEL_BEEN_TRIGGERED("MCH1_GRAVE")
|
|
IF DOES_BLIP_EXIST(psMichael.BlipIndex)
|
|
PRINT_GOD_TEXT_ADVANCED("MCH1_GRAVE", DEFAULT_GOD_TEXT_TIME, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT HAS_LABEL_BEEN_TRIGGERED("MCH1_GBTLC")
|
|
IF DOES_BLIP_EXIST(psMichael.BlipIndex)
|
|
IF NOT IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), << 3263.05, -4704.67, 104.67 >>, << 3267.14, -4561.37, 132.76 >>, 64.0)
|
|
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), vsMichaelsCar.vPosition) > ABANDON_CAR_WARNING_RANGE
|
|
CLEAR_PRINTS()
|
|
PRINT_GOD_TEXT_ADVANCED("MCH1_GBTLC", DEFAULT_GOD_TEXT_TIME, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(psTrevor.PedIndex)
|
|
IF NOT IS_ENTITY_DEAD(psTrevor.PedIndex)
|
|
|
|
REQUEST_PTFX_ASSET()
|
|
SET_PED_RESET_FLAG(psTrevor.PedIndex, PRF_DisableFriendlyGunReactAudio, TRUE)
|
|
|
|
IF NOT DOES_ENTITY_EXIST(osPropShovel.ObjectIndex)
|
|
HAS_MISSION_OBJECT_BEEN_CREATED(osPropShovel, FALSE)
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(osPropShovel.ObjectIndex)
|
|
IF NOT IS_ENTITY_DEAD(osPropShovel.ObjectIndex)
|
|
IF NOT IS_ENTITY_ATTACHED(osPropShovel.ObjectIndex)
|
|
ATTACH_ENTITY_TO_ENTITY(osPropShovel.ObjectIndex, psTrevor.PedIndex,
|
|
GET_PED_BONE_INDEX(psTrevor.PedIndex, BONETAG_PH_R_HAND),vZero, vZero)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF HAS_PTFX_ASSET_LOADED()
|
|
IF DOES_ENTITY_EXIST(osPropShovel.ObjectIndex) AND NOT IS_ENTITY_DEAD(osPropShovel.ObjectIndex)
|
|
IF DOES_ENTITY_EXIST(psTrevor.PedIndex) AND NOT IS_ENTITY_DEAD(psTrevor.PedIndex)
|
|
IF IS_ENTITY_ATTACHED_TO_ENTITY(osPropShovel.ObjectIndex, psTrevor.PedIndex)
|
|
IF IS_ENTITY_PLAYING_ANIM(psTrevor.PedIndex, "missmic1leadinoutmic_1_mcs_2", "_leadin_trevor")
|
|
IF GET_ENTITY_ANIM_CURRENT_TIME(psTrevor.PedIndex, "missmic1leadinoutmic_1_mcs_2", "_leadin_trevor") <= 0.1
|
|
bPTFXStarted = FALSE
|
|
ENDIF
|
|
IF GET_ENTITY_ANIM_CURRENT_TIME(psTrevor.PedIndex, "missmic1leadinoutmic_1_mcs_2", "_leadin_trevor") >= fParticleFXTriggerPhase
|
|
IF ( bPTFXStarted = FALSE )
|
|
IF START_PARTICLE_FX_NON_LOOPED_ON_ENTITY("cs_mich1_spade_dirt_throw", psTrevor.PedIndex,
|
|
vParticleFXPosition, vParticleFXRotation)
|
|
bPTFXStarted = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_PLAYING_ANIM(psTrevor.PedIndex, "missmic1leadinoutmic_1_mcs_2", "_leadin_trevor")
|
|
REQUEST_ANIM_DICT("missmic1leadinoutmic_1_mcs_2")
|
|
IF HAS_ANIM_DICT_LOADED("missmic1leadinoutmic_1_mcs_2")
|
|
TASK_PLAY_ANIM_ADVANCED(psTrevor.PedIndex, "missmic1leadinoutmic_1_mcs_2", "_leadin_trevor",
|
|
vGravePosition, << 0.0, 0.0, 137.88 >>, INSTANT_BLEND_IN, NORMAL_BLEND_OUT, -1,
|
|
AF_LOOPING | AF_EXTRACT_INITIAL_OFFSET | AF_NOT_INTERRUPTABLE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<3240.262695,-4574.430176,115.941917>>, <<3294.226807,-4574.134766,120.941917>>, 31.0)//28.0)
|
|
|
|
bLeadInTiggered = TRUE
|
|
|
|
IF ( iLeadInTimer = 0 )
|
|
iLeadInTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF ( bLeadInTiggered = TRUE )
|
|
|
|
MANAGE_GAMEPLAY_HINT()
|
|
UPDATE_BLOCKED_PLAYER_FOR_LEAD_IN(TRUE)
|
|
|
|
IF IS_ENTITY_PLAYING_ANIM(psTrevor.PedIndex, "missmic1leadinoutmic_1_mcs_2", "_leadin_trevor")
|
|
IF HAS_TIME_PASSED(3000, iLeadIntimer)
|
|
IF GET_ENTITY_ANIM_CURRENT_TIME(psTrevor.PedIndex, "missmic1leadinoutmic_1_mcs_2", "_leadin_trevor") > 0.75
|
|
|
|
bCutsceneTriggeredByMichael = TRUE
|
|
|
|
REMOVE_ANIM_DICT("missmic1leadinoutmic_1_mcs_2")
|
|
|
|
IF DOES_BLIP_EXIST(psMichael.BlipIndex)
|
|
REMOVE_BLIP(psMichael.BlipIndex)
|
|
ENDIF
|
|
|
|
STOP_AUDIO_SCENE("MI_1_MIC_DRIVE_TO_GRAVEYARD")
|
|
STOP_AUDIO_SCENE("MI_1_MIC_WALK_TO_GRAVEYARD")
|
|
|
|
RETURN TRUE
|
|
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
ELSE
|
|
IF HAS_MISSION_PED_BEEN_CREATED(psTrevor, TRUE, RELGROUPHASH_PLAYER, FALSE, CHAR_TREVOR)
|
|
|
|
SET_ENTITY_LOD_DIST(psTrevor.PedIndex, 150)
|
|
SET_PED_LOD_MULTIPLIER(psTrevor.PedIndex, 5.0)
|
|
|
|
STOP_PED_SPEAKING(psTrevor.PedIndex, TRUE)
|
|
SET_PED_CONFIG_FLAG(psTrevor.PedIndex, PCF_CannotBeTargeted, TRUE)
|
|
SET_PED_CONFIG_FLAG(psTrevor.PedIndex, PCF_DisableExplosionReactions, TRUE)
|
|
SET_PED_COMP_ITEM_CURRENT_SP(psTrevor.PedIndex, COMP_TYPE_OUTFIT, OUTFIT_P2_LUDENDORFF, FALSE)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(psTrevor.PedIndex, TRUE)
|
|
|
|
IF ( bDirtDecalApplied = FALSE )
|
|
CLEAR_PED_DECORATIONS_LEAVE_SCARS(psTrevor.PedIndex)//fix for B*2018060
|
|
APPLY_PED_DAMAGE_DECAL(psTrevor.PedIndex, PDZ_HEAD, 0.590, 0.720, 25.0, 1.0, 1.0, 0, TRUE, "basic_dirt_skin")
|
|
APPLY_PED_DAMAGE_DECAL(psTrevor.PedIndex, PDZ_HEAD, 0.400, 0.440, 30.0, 1.0, 1.0, 1, TRUE, "basic_dirt_skin")
|
|
APPLY_PED_DAMAGE_DECAL(psTrevor.PedIndex, PDZ_RIGHT_ARM, 0.400, 0.120, 30.0, 0.6, 1.0, 1, TRUE, "basic_dirt_skin")
|
|
APPLY_PED_DAMAGE_DECAL(psTrevor.PedIndex, PDZ_LEFT_ARM, 0.480, 0.120, 30.0, 0.6, 1.0, 1, TRUE, "basic_dirt_skin")
|
|
APPLY_PED_DAMAGE_DECAL(psTrevor.PedIndex, PDZ_TORSO, 0.644, 0.407, 30.0, 1.0, 1.0, 6, TRUE, "basic_dirt_cloth")
|
|
APPLY_PED_DAMAGE_DECAL(psTrevor.PedIndex, PDZ_TORSO, 0.860, 0.632, 90.0, 1.0, 1.0, 6, TRUE, "basic_dirt_cloth")
|
|
APPLY_PED_DAMAGE_DECAL(psTrevor.PedIndex, PDZ_LEFT_LEG, 0.775, 0.550, 0.0, 1.0, 1.0, 0, TRUE, "basic_dirt_cloth")
|
|
APPLY_PED_DAMAGE_DECAL(psTrevor.PedIndex, PDZ_RIGHT_LEG, 0.415, 0.750, 36.0, 1.0, 1.0, 1, TRUE, "basic_dirt_cloth")
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Applying basic_dirt_cloth and basic_dirt_skin damage decal to Trevor ped before mocap cutscene.")
|
|
#ENDIF
|
|
bDirtDecalApplied = TRUE
|
|
ENDIF
|
|
|
|
FailFlags[MISSION_FAIL_TREVOR_DEAD] = TRUE
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
RETURN FALSE
|
|
|
|
ENDFUNC
|
|
|
|
FUNC BOOL IS_MISSION_STAGE_CUTSCENE_GRAVEYARD_COMPLETED(INT &iStageProgress)
|
|
|
|
SWITCH iStageProgress
|
|
|
|
CASE 0
|
|
|
|
STOP_AUDIO_SCENE("MI_1_MIC_DRIVE_TO_GRAVEYARD")
|
|
STOP_AUDIO_SCENE("MI_1_MIC_WALK_TO_GRAVEYARD")
|
|
STOP_AUDIO_SCENE("MI_1_TREV_FLY_TO_LUDENDORFF")
|
|
|
|
IF ( bCutsceneTriggeredByMichael = TRUE )
|
|
|
|
REQUEST_CUTSCENE_WITH_PLAYBACK_LIST("mic_1_mcs_2", CS_SECTION_3 | CS_SECTION_4 | CS_SECTION_5)
|
|
|
|
//go straight to cutscene start
|
|
iStageProgress = 3
|
|
|
|
ELIF ( bCutsceneTriggeredByTrevor = TRUE )
|
|
|
|
CLEAR_HELP()
|
|
CLEAR_PRINTS()
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
CLEAR_PED_TASKS(PLAYER_PED_ID())
|
|
WARP_PED(PLAYER_PED_ID(), psMichael.vPosition, psMichael.fHeading, FALSE, FALSE, FALSE)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(psTrevor.PedIndex)
|
|
CLEAR_PED_TASKS(psTrevor.PedIndex)
|
|
WARP_PED(psTrevor.PedIndex, psTrevor.vPosition, psTrevor.fHeading, FALSE, FALSE, FALSE)
|
|
ENDIF
|
|
|
|
SETTIMERA(0)
|
|
|
|
iStageProgress++
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 1
|
|
|
|
IF ( bCutsceneTriggeredByTrevor = TRUE )
|
|
|
|
DISABLE_CELLPHONE_THIS_FRAME_ONLY()
|
|
DISPLAY_TEXT_ON_BLACK_SCREEN("MH1_SETTING")
|
|
|
|
IF ( TIMERA() > 5000 )
|
|
|
|
iStageProgress++
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 2 //make sure weapons are loaded and in hand of the peds before they get registered for the cutscene
|
|
|
|
DISABLE_CELLPHONE_THIS_FRAME_ONLY()
|
|
DISPLAY_TEXT_ON_BLACK_SCREEN("MH1_SETTING")
|
|
|
|
REMOVE_PROLOGUE_GRAVE_IPL(FALSE)
|
|
REQUEST_PROLOGUE_GRAVE_IPL(TRUE)
|
|
|
|
REQUEST_WEAPON_ASSET(WEAPONTYPE_PISTOL)
|
|
|
|
IF IS_PROLOGUE_GRAVE_IPL_ACTIVE(TRUE)
|
|
AND HAS_WEAPON_ASSET_LOADED(WEAPONTYPE_PISTOL)
|
|
|
|
IPL_GROUP_SWAP_START("prologue03_grv_cov", "prologue03_grv_dug")
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Starting prologue IPLs swap for prologue03_grv_cov to prologue03_grv_dug by calling IPL_GROUP_SWAP_START().")
|
|
#ENDIF
|
|
|
|
iStageProgress++
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 3
|
|
|
|
IF ( bCutsceneTriggeredByMichael = TRUE )
|
|
|
|
IF HAS_REQUESTED_CUTSCENE_LOADED("mic_1_mcs_2", CS_SECTION_3 | CS_SECTION_4 | CS_SECTION_5)
|
|
|
|
IF DOES_ENTITY_EXIST(psTrevor.PedIndex)
|
|
IF NOT IS_ENTITY_DEAD(psTrevor.PedIndex)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(psTrevor.PedIndex, "Trevor", CU_ANIMATE_AND_DELETE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(osPropShovel.ObjectIndex)
|
|
IF NOT IS_ENTITY_DEAD(osPropShovel.ObjectIndex)
|
|
IF IS_ENTITY_ATTACHED(osPropShovel.ObjectIndex)
|
|
DETACH_ENTITY(osPropShovel.ObjectIndex)
|
|
ENDIF
|
|
REGISTER_ENTITY_FOR_CUTSCENE(osPropShovel.ObjectIndex, "MIC1_Shovel", CU_ANIMATE_AND_DELETE_EXISTING_SCRIPT_ENTITY, osPropShovel.ModelName)
|
|
ENDIF
|
|
ELSE
|
|
REGISTER_ENTITY_FOR_CUTSCENE(osPropShovel.ObjectIndex, "MIC1_Shovel", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, osPropShovel.ModelName)
|
|
ENDIF
|
|
|
|
REGISTER_ENTITY_FOR_CUTSCENE(psBrad.PedIndex, "Dead_Brad", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, CS_BRADCADAVER)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(osPropPickaxe.ObjectIndex, "MIC1_PickAxe", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, osPropPickaxe.ModelName)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(osPropCoffin.ObjectIndex, "Coffin", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, osPropCoffin.ModelName)
|
|
|
|
REGISTER_ENTITY_FOR_CUTSCENE(esWallEnemies[0].PedIndex, "Chinese_gunman", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, mnEnemy)
|
|
|
|
WeaponMichaelObjectIndex = CREATE_WEAPON_OBJECT_FROM_PED_WEAPON_WITH_COMPONENTS(PLAYER_PED_ID(), WEAPONTYPE_PISTOL, FALSE)
|
|
|
|
IF HAS_PED_GOT_WEAPON_COMPONENT(PLAYER_PED_ID(), WEAPONTYPE_PISTOL, WEAPONCOMPONENT_AT_PI_SUPP_02)
|
|
REMOVE_WEAPON_COMPONENT_FROM_WEAPON_OBJECT(WeaponMichaelObjectIndex, WEAPONCOMPONENT_AT_PI_SUPP_02)
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Removing WEAPONCOMPONENT_AT_PI_SUPP_02 from player weapon WEAPONTYPE_PISTOL for cutscene.")
|
|
#ENDIF
|
|
ENDIF
|
|
|
|
REGISTER_ENTITY_FOR_CUTSCENE(WeaponMichaelObjectIndex, "FBI_Agent_1_Gun", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
|
|
CLEAR_HELP()
|
|
CLEAR_PRINTS()
|
|
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
|
|
|
|
START_CUTSCENE()
|
|
|
|
|
|
bPrologueGraveIPLSwapped = TRUE
|
|
|
|
iStageProgress++
|
|
|
|
ENDIF
|
|
|
|
ELIF ( bCutsceneTriggeredByTrevor = TRUE )
|
|
|
|
DISABLE_CELLPHONE_THIS_FRAME_ONLY()
|
|
DISPLAY_TEXT_ON_BLACK_SCREEN("MH1_SETTING") //display the text on black for one more frame until the cutscene is active
|
|
|
|
IF HAS_REQUESTED_CUTSCENE_LOADED("mic_1_mcs_2")
|
|
AND IS_PROLOGUE_GRAVE_IPL_ACTIVE(TRUE)
|
|
AND IPL_GROUP_SWAP_IS_READY()
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
REGISTER_ENTITY_FOR_CUTSCENE(PLAYER_PED_ID(), "Michael", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(psTrevor.PedIndex)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(psTrevor.PedIndex, "Trevor", CU_ANIMATE_AND_DELETE_EXISTING_SCRIPT_ENTITY)
|
|
ELSE
|
|
REGISTER_ENTITY_FOR_CUTSCENE(psTrevor.PedIndex, "Trevor", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, psTrevor.ModelName)
|
|
ENDIF
|
|
|
|
REGISTER_ENTITY_FOR_CUTSCENE(psBrad.PedIndex, "Dead_Brad", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, CS_BRADCADAVER)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(osPropShovel.ObjectIndex, "MIC1_Shovel", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, osPropShovel.ModelName)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(osPropPickaxe.ObjectIndex, "MIC1_PickAxe", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, osPropPickaxe.ModelName)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(osPropCoffin.ObjectIndex, "Coffin", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, osPropCoffin.ModelName)
|
|
|
|
REGISTER_ENTITY_FOR_CUTSCENE(esWallEnemies[0].PedIndex, "Chinese_gunman", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, mnEnemy)
|
|
|
|
WeaponMichaelObjectIndex = CREATE_WEAPON_OBJECT_FROM_PED_WEAPON_WITH_COMPONENTS(PLAYER_PED_ID(), WEAPONTYPE_PISTOL, FALSE)
|
|
|
|
IF HAS_PED_GOT_WEAPON_COMPONENT(PLAYER_PED_ID(), WEAPONTYPE_PISTOL, WEAPONCOMPONENT_AT_PI_SUPP_02)
|
|
REMOVE_WEAPON_COMPONENT_FROM_WEAPON_OBJECT(WeaponMichaelObjectIndex, WEAPONCOMPONENT_AT_PI_SUPP_02)
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Removing WEAPONCOMPONENT_AT_PI_SUPP_02 from player weapon WEAPONTYPE_PISTOL for cutscene.")
|
|
#ENDIF
|
|
ENDIF
|
|
|
|
REGISTER_ENTITY_FOR_CUTSCENE(WeaponMichaelObjectIndex, "FBI_Agent_1_Gun", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
|
|
CLEAR_HELP()
|
|
CLEAR_PRINTS()
|
|
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
|
|
|
|
START_CUTSCENE(CUTSCENE_PLAYER_FP_FLASH_MICHAEL)
|
|
|
|
iStageProgress++
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
|
|
//Michael's variation
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", PLAYER_PED_ID())
|
|
//Trevor's variation
|
|
SET_CUTSCENE_PED_OUTFIT("Trevor", GET_PLAYER_PED_MODEL(CHAR_TREVOR), OUTFIT_P2_LUDENDORFF)
|
|
//Chinese gunman's variations
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Chinese_gunman", PED_COMP_HAIR, 1, 0)
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 4
|
|
|
|
IF IS_CUTSCENE_PLAYING()
|
|
|
|
STOP_GAMEPLAY_HINT(TRUE)
|
|
|
|
CLEAR_AREA(psMichael.vPosition, 250.0, TRUE)
|
|
CLEAR_AREA_OF_VEHICLES(psMichael.vPosition, 250.0)
|
|
|
|
//destroy scripted camera
|
|
IF DOES_CAM_EXIST(ScriptedCamera)
|
|
SET_CAM_ACTIVE(ScriptedCamera, FALSE)
|
|
RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
DESTROY_CAM(ScriptedCamera)
|
|
DISPLAY_RADAR(TRUE)
|
|
DISPLAY_HUD(TRUE)
|
|
//SET_FRONTEND_RADIO_ACTIVE(TRUE)
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(vsTrevorsCar.VehicleIndex)
|
|
DELETE_VEHICLE(vsTrevorsCar.VehicleIndex)
|
|
ENDIF
|
|
|
|
//reposition Michael's car
|
|
IF DOES_ENTITY_EXIST(vsMichaelsCar.VehicleIndex)
|
|
IF NOT IS_ENTITY_DEAD(vsMichaelsCar.VehicleIndex)
|
|
SET_ENTITY_COORDS(vsMichaelsCar.VehicleIndex, vsMichaelsCar.vPosition)
|
|
SET_ENTITY_HEADING(vsMichaelsCar.VehicleIndex, vsMichaelsCar.fHeading)
|
|
SET_VEHICLE_ON_GROUND_PROPERLY(vsMichaelsCar.VehicleIndex)
|
|
SET_VEHICLE_ENGINE_ON(vsMichaelsCar.VehicleIndex, FALSE, TRUE)
|
|
SET_VEHICLE_DOORS_SHUT(vsMichaelsCar.VehicleIndex, TRUE)
|
|
SET_VEHICLE_ENGINE_CAN_DEGRADE(vsMichaelsCar.VehicleIndex, FALSE)
|
|
SET_ENTITY_HEALTH(vsMichaelsCar.VehicleIndex, GET_ENTITY_HEALTH(vsMichaelsCar.VehicleIndex) + 500)
|
|
SET_VEHICLE_ENGINE_HEALTH(vsMichaelsCar.VehicleIndex, GET_VEHICLE_ENGINE_HEALTH(vsMichaelsCar.VehicleIndex) + 500)
|
|
SET_VEHICLE_PETROL_TANK_HEALTH(vsMichaelsCar.VehicleIndex, GET_VEHICLE_PETROL_TANK_HEALTH(vsMichaelsCar.VehicleIndex) + 500)
|
|
STOP_FIRE_IN_RANGE(GET_ENTITY_COORDS(vsMichaelsCar.VehicleIndex), 2.5)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
TRIGGER_MUSIC_EVENT("MIC1_GRAVE_CS")
|
|
|
|
SET_CLOCK_TIME(0, 0, 0)
|
|
|
|
IF IS_SCREEN_FADED_OUT()
|
|
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
|
|
ENDIF
|
|
|
|
REPLAY_RECORD_BACK_FOR_TIME(5.0, 0.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
iStageProgress++
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 5
|
|
|
|
IF ( bCutsceneTriggeredByTrevor = TRUE )
|
|
IF ( bPrologueGraveIPLSwapped = FALSE )
|
|
IF ( GET_CUTSCENE_TIME() >= 24634 )
|
|
REQUEST_IPL("prologue_grv_torch")
|
|
IPL_GROUP_SWAP_FINISH()
|
|
bPrologueGraveIPLSwapped = TRUE
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Swapping prologue IPLs prologue03_grv_cov for prologue03_grv_dug by calling IPL_GROUP_SWAP_FINISH().")
|
|
#ENDIF
|
|
|
|
IF ( bDirtDecalApplied = FALSE )
|
|
IF NOT IS_PED_INJURED(psTrevor.PedIndex)
|
|
CLEAR_PED_DECORATIONS_LEAVE_SCARS(psTrevor.PedIndex)//fix for B*2018060
|
|
APPLY_PED_DAMAGE_DECAL(psTrevor.PedIndex, PDZ_HEAD, 0.590, 0.720, 25.0, 1.0, 1.0, 0, TRUE, "basic_dirt_skin")
|
|
APPLY_PED_DAMAGE_DECAL(psTrevor.PedIndex, PDZ_HEAD, 0.400, 0.440, 30.0, 1.0, 1.0, 1, TRUE, "basic_dirt_skin")
|
|
APPLY_PED_DAMAGE_DECAL(psTrevor.PedIndex, PDZ_RIGHT_ARM, 0.400, 0.120, 30.0, 0.6, 1.0, 1, TRUE, "basic_dirt_skin")
|
|
APPLY_PED_DAMAGE_DECAL(psTrevor.PedIndex, PDZ_LEFT_ARM, 0.480, 0.120, 30.0, 0.6, 1.0, 1, TRUE, "basic_dirt_skin")
|
|
APPLY_PED_DAMAGE_DECAL(psTrevor.PedIndex, PDZ_TORSO, 0.644, 0.407, 30.0, 1.0, 1.0, 6, TRUE, "basic_dirt_cloth")
|
|
APPLY_PED_DAMAGE_DECAL(psTrevor.PedIndex, PDZ_TORSO, 0.860, 0.632, 90.0, 1.0, 1.0, 6, TRUE, "basic_dirt_cloth")
|
|
APPLY_PED_DAMAGE_DECAL(psTrevor.PedIndex, PDZ_LEFT_LEG, 0.775, 0.550, 0.0, 1.0, 1.0, 0, TRUE, "basic_dirt_cloth")
|
|
APPLY_PED_DAMAGE_DECAL(psTrevor.PedIndex, PDZ_RIGHT_LEG, 0.415, 0.750, 36.0, 1.0, 1.0, 1, TRUE, "basic_dirt_cloth")
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Applying basic_dirt_cloth and basic_dirt_skin damage decal to Trevor ped during mocap cutscene.")
|
|
#ENDIF
|
|
ENDIF
|
|
bDirtDecalApplied = TRUE
|
|
ENDIF
|
|
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF ( bDamageDecalApplied = FALSE )
|
|
IF IS_CUTSCENE_PLAYING()
|
|
IF ( GET_CUTSCENE_TIME() > 173000 )
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
APPLY_PED_DAMAGE_DECAL(PLAYER_PED_ID(), PDZ_HEAD, 0.621, 0.755, 55.084, 0.01, 1.0, 1, TRUE, "bruise")
|
|
bDamageDecalApplied = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF ( bMusicEventShootoutStartTriggered = FALSE )
|
|
IF IS_CUTSCENE_PLAYING()
|
|
IF ( GET_CUTSCENE_TIME() > 160000 )
|
|
IF PREPARE_MUSIC_EVENT("MIC1_SHOOTOUT_START")
|
|
IF ( GET_CUTSCENE_TIME() > 170500 )
|
|
IF ( bMusicEventShootoutStartTriggered = FALSE )
|
|
IF TRIGGER_MUSIC_EVENT("MIC1_SHOOTOUT_START")
|
|
bMusicEventShootoutStartTriggered = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT DOES_ENTITY_EXIST(psTrevor.PedIndex)
|
|
IF DOES_CUTSCENE_ENTITY_EXIST("Trevor")
|
|
IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Trevor"))
|
|
psTrevor.PedIndex = GET_PED_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Trevor"))
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created ped Trevor in the cutscene.")
|
|
#ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT DOES_ENTITY_EXIST(psBrad.PedIndex)
|
|
IF DOES_CUTSCENE_ENTITY_EXIST("Dead_Brad")
|
|
IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Dead_Brad"))
|
|
psBrad.PedIndex = GET_PED_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Dead_Brad"))
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created ped Dead_Brad in the cutscene.")
|
|
#ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT DOES_ENTITY_EXIST(osPropShovel.ObjectIndex)
|
|
IF DOES_CUTSCENE_ENTITY_EXIST("MIC1_Shovel")
|
|
IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("MIC1_Shovel"))
|
|
osPropShovel.ObjectIndex = GET_OBJECT_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("MIC1_Shovel"))
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created object MIC1_Shovel in the cutscene.")
|
|
#ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT DOES_ENTITY_EXIST(osPropPickaxe.ObjectIndex)
|
|
IF DOES_CUTSCENE_ENTITY_EXIST("MIC1_PickAxe")
|
|
IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("MIC1_PickAxe"))
|
|
osPropPickaxe.ObjectIndex = GET_OBJECT_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("MIC1_PickAxe"))
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created object MIC1_PickAxe in the cutscene.")
|
|
#ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT DOES_ENTITY_EXIST(osPropCoffin.ObjectIndex)
|
|
IF DOES_CUTSCENE_ENTITY_EXIST("Coffin")
|
|
IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Coffin"))
|
|
osPropCoffin.ObjectIndex = GET_OBJECT_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Coffin"))
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created object Coffin in the cutscene.")
|
|
#ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//create enemy ped during the mocap cutscene
|
|
IF NOT DOES_ENTITY_EXIST(esWallEnemies[0].PedIndex)
|
|
IF DOES_CUTSCENE_ENTITY_EXIST("Chinese_gunman")
|
|
IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Chinese_gunman"))
|
|
|
|
esWallEnemies[0].PedIndex = GET_PED_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Chinese_gunman"))
|
|
|
|
SET_ENEMY_PED_PROPERTIES(esWallEnemies[0].PedIndex, rgEnemies, WEAPONTYPE_PISTOL)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Set up properites for enemy ped 'Chinese_gunman' in the cutscene.")
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Dead_Brad")
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY() returned true for Dead_Brad.")
|
|
#ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(psBrad.PedIndex)
|
|
IF HAS_ANIM_DICT_LOADED("dead")
|
|
IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iBradCadaverScene)
|
|
|
|
iBradCadaverScene = CREATE_SYNCHRONIZED_SCENE(<< 3258.899, -4574.090, 115.350 >>, << 173.880, 51.480, 5.040 >>, EULER_XYZ)
|
|
|
|
TASK_SYNCHRONIZED_SCENE(psBrad.PedIndex, iBradCadaverScene, "dead", "dead_g", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT, RBF_BULLET_IMPACT | RBF_PLAYER_IMPACT | RBF_MELEE)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(psBrad.PedIndex)
|
|
|
|
STOP_PED_SPEAKING(psBrad.PedIndex, TRUE)
|
|
SET_ENTITY_INVINCIBLE(psBrad.PedIndex, TRUE)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(psBrad.PedIndex, TRUE)
|
|
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Trevor")
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY() returned true for Trevor.")
|
|
#ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(psTrevor.PedIndex)
|
|
DELETE_PED(psTrevor.PedIndex)
|
|
ENDIF
|
|
|
|
IF NOT DOES_PICKUP_EXIST(PistolPickup)
|
|
|
|
iPistolPickupPlacementFlags = 0
|
|
|
|
SET_BIT(iPistolPickupPlacementFlags, ENUM_TO_INT(PLACEMENT_FLAG_FIXED))
|
|
SET_BIT(iPistolPickupPlacementFlags, ENUM_TO_INT(PLACEMENT_FLAG_UPRIGHT))
|
|
SET_BIT(iPistolPickupPlacementFlags, ENUM_TO_INT(PLACEMENT_FLAG_ORIENT_TO_GROUND))
|
|
|
|
PistolPickup = CREATE_PICKUP_ROTATE(PICKUP_WEAPON_PISTOL, <<3258.7891, -4575.3062, 117.2570>>,
|
|
<<-88.2000, 65.8800, 0.0000>>, iPistolPickupPlacementFlags)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michael")
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY() returned true for Michael.")
|
|
#ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
|
|
SET_PED_STEALTH_MOVEMENT(PLAYER_PED_ID(), FALSE)
|
|
|
|
WARP_PED(PLAYER_PED_ID(), << 3256.5776, -4575.2520, 117.2670 >>, 267.6326, FALSE, FALSE, FALSE)
|
|
TASK_PUT_PED_DIRECTLY_INTO_COVER(PLAYER_PED_ID(), csCoverpoints[0].vPosition, -1, TRUE, 0, TRUE, TRUE, csCoverpoints[0].CoverpointIndex)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID(), TRUE)
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("FBI_Agent_1_Gun")
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY() returned true for FBI_Agent_1_Gun.")
|
|
#ENDIF
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
GIVE_WEAPON_OBJECT_TO_PED(WeaponMichaelObjectIndex, PLAYER_PED_ID())
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_CAMERA()
|
|
IF GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_ON_FOOT) = CAM_VIEW_MODE_FIRST_PERSON
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(-16.536800)
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(-45.0000)
|
|
ELSE
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(-16.536800)
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(-72.373550)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Chinese_gunman")
|
|
IF NOT IS_PED_INJURED(esWallEnemies[0].PedIndex)
|
|
WARP_PED(esWallEnemies[0].PedIndex, csCoverpoints[1].vPosition, csCoverpoints[1].fHeading, FALSE, FALSE, FALSE)
|
|
SET_CURRENT_PED_WEAPON(esWallEnemies[0].PedIndex, WEAPONTYPE_PISTOL, TRUE)
|
|
TASK_PUT_PED_DIRECTLY_INTO_COVER(esWallEnemies[0].PedIndex, csCoverpoints[1].vPosition, -1, FALSE, 0, TRUE, TRUE, csCoverpoints[1].CoverpointIndex)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(esWallEnemies[0].PedIndex)
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Enemy ped is put directly into cover in position ", csCoverpoints[1].vPosition, " when CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY() returned true for 'Chinese_gunman'.")
|
|
#ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("MIC1_Shovel")
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY() returned true for MIC1_Shovel.")
|
|
#ENDIF
|
|
IF DOES_ENTITY_EXIST(osPropShovel.ObjectIndex)
|
|
IF NOT IS_ENTITY_DEAD(osPropShovel.ObjectIndex)
|
|
SET_ENTITY_COORDS_NO_OFFSET(osPropShovel.ObjectIndex, osPropShovel.vPosition)
|
|
SET_ENTITY_ROTATION(osPropShovel.ObjectIndex, osPropShovel.vRotation)
|
|
FREEZE_ENTITY_POSITION(osPropShovel.ObjectIndex, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("MIC1_PickAxe")
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY() returned true for MIC1_PickAxe.")
|
|
#ENDIF
|
|
IF DOES_ENTITY_EXIST(osPropPickaxe.ObjectIndex)
|
|
IF NOT IS_ENTITY_DEAD(osPropPickaxe.ObjectIndex)
|
|
SET_ENTITY_COORDS_NO_OFFSET(osPropPickaxe.ObjectIndex, osPropPickaxe.vPosition)
|
|
SET_ENTITY_ROTATION(osPropPickaxe.ObjectIndex, osPropPickaxe.vRotation)
|
|
FREEZE_ENTITY_POSITION(osPropPickaxe.ObjectIndex, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Coffin")
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY() returned true for Coffin.")
|
|
#ENDIF
|
|
IF DOES_ENTITY_EXIST(osPropCoffin.ObjectIndex)
|
|
IF NOT IS_ENTITY_DEAD(osPropCoffin.ObjectIndex)
|
|
SET_ENTITY_COORDS_NO_OFFSET(osPropCoffin.ObjectIndex, osPropCoffin.vPosition)
|
|
SET_ENTITY_ROTATION(osPropCoffin.ObjectIndex, osPropCoffin.vRotation)
|
|
FREEZE_ENTITY_POSITION(osPropCoffin.ObjectIndex, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF HAS_CUTSCENE_FINISHED()
|
|
|
|
IF HAS_WEAPON_ASSET_LOADED(WEAPONTYPE_PISTOL)
|
|
AND ( bCoverpointsCreated = TRUE )
|
|
AND IS_PROLOGUE_GRAVE_IPL_ACTIVE(FALSE)
|
|
|
|
IF ( bCutsceneSkipped = TRUE )
|
|
|
|
IF ( bDamageDecalApplied = FALSE )
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
APPLY_PED_DAMAGE_DECAL(PLAYER_PED_ID(), PDZ_HEAD, 0.621, 0.755, 55.084, 0.01, 1.0, 1, TRUE, "bruise")
|
|
bDamageDecalApplied = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
WAIT(2000) //wait until player ped is in low cover pose to hide any pops from standing still into low cover
|
|
ENDIF
|
|
|
|
IF ( bCutsceneSkipped = TRUE ) //set the gameplay camera relative pitch and heading again after skip
|
|
IF GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_ON_FOOT) = CAM_VIEW_MODE_FIRST_PERSON
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
IF IS_PED_IN_COVER(PLAYER_PED_ID())
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(-16.536800)
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(-45.0000)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
|
|
|
|
psMichael.iTimer = GET_GAME_TIMER()
|
|
|
|
IF ( bCutsceneSkipped = FALSE )
|
|
TRIGGER_MUSIC_EVENT("MIC1_GAMEPLAY_STARTS")
|
|
ELSE
|
|
CANCEL_MUSIC_EVENT("MIC1_SHOOTOUT_START")
|
|
TRIGGER_MUSIC_EVENT("MIC1_ARGUE_CS_SKIP")
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(vsTrevorsCar.VehicleIndex)
|
|
DELETE_VEHICLE(vsTrevorsCar.VehicleIndex)
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(WeaponMichaelObjectIndex)
|
|
DELETE_OBJECT(WeaponMichaelObjectIndex)
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(psTrevor.PedIndex)
|
|
DELETE_PED(psTrevor.PedIndex)
|
|
ENDIF
|
|
|
|
IF IS_SCREEN_FADED_OUT()
|
|
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
|
|
ENDIF
|
|
|
|
REPLAY_STOP_EVENT()
|
|
REPLAY_RECORD_BACK_FOR_TIME(0.0, 10.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
RETURN TRUE
|
|
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
REQUEST_ANIM_DICT("dead")
|
|
REQUEST_WEAPON_ASSET(WEAPONTYPE_PISTOL)
|
|
|
|
//create coverpoints during cutscene
|
|
IF ( bCoverpointsCreated = FALSE )
|
|
CREATE_COVERPOINTS(csCoverpoints, vShootoutStartPosition)
|
|
INITIALISE_FRAGGABLE_TOMBSTONES(FraggableTombstones)
|
|
bCoverpointsCreated = TRUE
|
|
ENDIF
|
|
|
|
//if cutscene is skipped take control of the fade
|
|
IF ( bCutsceneSkipped = FALSE )
|
|
IF WAS_CUTSCENE_SKIPPED()
|
|
SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, FALSE, FALSE)
|
|
bCutsceneSkipped = TRUE
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Cutscene was skipped by the player.")
|
|
#ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
RETURN FALSE
|
|
|
|
ENDFUNC
|
|
|
|
PROC MANAGE_CONVERSATIONS_DURING_SHOOTOUT(INT &iConversationProgress, INT &iConversationTimer, INT &iEnemyTimer, INT &iMichaelTime,
|
|
INT &iEnemyTime, BOOL &bShootingConversationPlayed)
|
|
|
|
PED_INDEX ClosestEnemyPed
|
|
FLOAT fDistanceToClosestEnemyPed
|
|
INT i, k
|
|
INT iEnemySpeakerID
|
|
STRING sEnemyVoiceName
|
|
STRING sEnemyConversationRoot
|
|
|
|
SWITCH iConversationProgress
|
|
|
|
CASE 0
|
|
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
|
|
ClosestEnemyPed = GET_CLOSEST_PED_FROM_RELATIONSHIP_GROUP_FOR_PED(PLAYER_PED_ID(), rgEnemies)
|
|
|
|
IF ( ClosestEnemyPed <> NULL )
|
|
AND NOT IS_PED_SITTING_IN_ANY_VEHICLE(ClosestEnemyPed)
|
|
|
|
ADD_PED_FOR_DIALOGUE(sMichael1Conversation, CHINESEGOON4SPEAKERID, ClosestEnemyPed, CHINESEGOON4VOICENAME)
|
|
|
|
IF CREATE_CONVERSATION(sMichael1Conversation, "MCH1AUD", "MCH1_GSGCB", CONV_PRIORITY_MEDIUM)
|
|
|
|
iMichaelTime = 5000 + GET_RANDOM_INT_IN_RANGE(0, 3001)
|
|
iEnemyTime = 7000 + GET_RANDOM_INT_IN_RANGE(0, 3001)
|
|
iConversationTimer = GET_GAME_TIMER()
|
|
iEnemyTimer = GET_GAME_TIMER()
|
|
|
|
bShootingConversationPlayed = FALSE
|
|
|
|
iConversationProgress++
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 1
|
|
|
|
IF NOT HAS_LABEL_BEEN_TRIGGERED("MCH1_GSMA")
|
|
IF ( GET_NUMBER_OF_ENEMIES_DEAD(esWallEnemies) >=2 )
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(sMichael1Conversation, "MCH1AUD", "MCH1_GSMA", CONV_PRIORITY_MEDIUM)
|
|
SET_LABEL_AS_TRIGGERED("MCH1_GSMA", TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT HAS_LABEL_BEEN_TRIGGERED("MCH1_GSS08")
|
|
IF DOES_ENTITY_EXIST(vsEnemyVans[0].VehicleIndex)
|
|
IF DOES_ENTITY_EXIST(esVanEnemies[0].PedIndex)
|
|
OR DOES_ENTITY_EXIST(esVanEnemies[1].PedIndex)
|
|
OR DOES_ENTITY_EXIST(esVanEnemies[2].PedIndex)
|
|
OR DOES_ENTITY_EXIST(esVanEnemies[3].PedIndex)
|
|
IF ( bSmoothCloseGateTriggered = TRUE )
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
|
|
i = GET_RANDOM_INT_IN_RANGE(0, 4)
|
|
|
|
IF NOT IS_PED_INJURED(esVanEnemies[i].PedIndex)
|
|
|
|
FOR k = CHINESEGOON1SPEAKERID TO CHINESEGOON5SPEAKERID
|
|
REMOVE_PED_FOR_DIALOGUE(sMichael1Conversation, k)
|
|
ENDFOR
|
|
|
|
ADD_PED_FOR_DIALOGUE(sMichael1Conversation, CHINESEGOON4SPEAKERID, esVanEnemies[i].PedIndex, CHINESEGOON4VOICENAME)
|
|
|
|
IF CREATE_CONVERSATION(sMichael1Conversation, "MCH1AUD", "MCH1_GSS08", CONV_PRIORITY_MEDIUM)
|
|
SET_LABEL_AS_TRIGGERED("MCH1_GSS08", TRUE)
|
|
iConversationTimer = GET_GAME_TIMER()
|
|
iEnemyTimer = GET_GAME_TIMER()
|
|
iMichaelTime = 6000 + GET_RANDOM_INT_IN_RANGE(0, 3001)
|
|
iEnemyTime = 6000 + GET_RANDOM_INT_IN_RANGE(0, 3001)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//play dialogue for enemies exiting the van
|
|
IF NOT HAS_LABEL_BEEN_TRIGGERED("MCH1_GSGR2")
|
|
AND NOT HAS_LABEL_BEEN_TRIGGERED("MCH1_GSGR3")
|
|
AND NOT HAS_LABEL_BEEN_TRIGGERED("MCH1_GSGR4")
|
|
|
|
IF ( bPlayVanOpenConversation = TRUE )
|
|
|
|
IF DOES_ENTITY_EXIST(esVanEnemies[0].PedIndex) //check if any of the peds in van exists
|
|
OR DOES_ENTITY_EXIST(esVanEnemies[1].PedIndex)
|
|
OR DOES_ENTITY_EXIST(esVanEnemies[2].PedIndex)
|
|
OR DOES_ENTITY_EXIST(esVanEnemies[3].PedIndex)
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
|
|
i = GET_RANDOM_INT_IN_RANGE(0, 4) //select random ped exiting the van
|
|
|
|
IF NOT IS_PED_INJURED(esVanEnemies[i].PedIndex) //check if selected ped is not injured
|
|
|
|
SWITCH i
|
|
|
|
CASE 0
|
|
iEnemySpeakerID = CHINESEGOON2SPEAKERID
|
|
sEnemyVoiceName = CHINESEGOON2VOICENAME
|
|
sEnemyConversationRoot = "MCH1_GSGR2"
|
|
BREAK
|
|
|
|
CASE 1
|
|
iEnemySpeakerID = CHINESEGOON2SPEAKERID
|
|
sEnemyVoiceName = CHINESEGOON2VOICENAME
|
|
sEnemyConversationRoot = "MCH1_GSGR2"
|
|
BREAK
|
|
|
|
CASE 2
|
|
iEnemySpeakerID = CHINESEGOON4SPEAKERID
|
|
sEnemyVoiceName = CHINESEGOON4VOICENAME
|
|
sEnemyConversationRoot = "MCH1_GSGR3"
|
|
BREAK
|
|
|
|
CASE 3
|
|
iEnemySpeakerID = CHINESEGOON4SPEAKERID
|
|
sEnemyVoiceName = CHINESEGOON4VOICENAME
|
|
sEnemyConversationRoot = "MCH1_GSGR4"
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
FOR k = CHINESEGOON1SPEAKERID TO CHINESEGOON5SPEAKERID
|
|
REMOVE_PED_FOR_DIALOGUE(sMichael1Conversation, k)
|
|
ENDFOR
|
|
|
|
ADD_PED_FOR_DIALOGUE(sMichael1Conversation, iEnemySpeakerID, esVanEnemies[i].PedIndex, sEnemyVoiceName)
|
|
|
|
IF CREATE_CONVERSATION(sMichael1Conversation, "MCH1AUD", sEnemyConversationRoot, CONV_PRIORITY_MEDIUM)
|
|
SET_LABEL_AS_TRIGGERED(sEnemyConversationRoot, TRUE)
|
|
iConversationTimer = GET_GAME_TIMER()
|
|
iEnemyTimer = GET_GAME_TIMER()
|
|
iMichaelTime = 6000 + GET_RANDOM_INT_IN_RANGE(0, 3001)
|
|
iEnemyTime = 7000 + GET_RANDOM_INT_IN_RANGE(0, 3001)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//play dialogue for enemy ped who exited the van and is calling out for the player
|
|
IF NOT HAS_LABEL_BEEN_TRIGGERED("MCH1_GSGCA")
|
|
IF HAS_LABEL_BEEN_TRIGGERED("MCH1_GSGR2")
|
|
OR HAS_LABEL_BEEN_TRIGGERED("MCH1_GSGR3")
|
|
OR HAS_LABEL_BEEN_TRIGGERED("MCH1_GSGR4")
|
|
IF ( bPlayVanExitConversation = TRUE)
|
|
IF DOES_ENTITY_EXIST(esVanEnemies[2].PedIndex)
|
|
IF NOT IS_PED_INJURED(esVanEnemies[2].PedIndex)
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
|
|
FOR k = CHINESEGOON1SPEAKERID TO CHINESEGOON5SPEAKERID
|
|
REMOVE_PED_FOR_DIALOGUE(sMichael1Conversation, k)
|
|
ENDFOR
|
|
|
|
ADD_PED_FOR_DIALOGUE(sMichael1Conversation, CHINESEGOON4SPEAKERID, esVanEnemies[2].PedIndex, CHINESEGOON4VOICENAME)
|
|
|
|
IF CREATE_CONVERSATION(sMichael1Conversation, "MCH1AUD", "MCH1_GSGCA", CONV_PRIORITY_MEDIUM)
|
|
SET_LABEL_AS_TRIGGERED("MCH1_GSGCA", TRUE)
|
|
iConversationTimer = GET_GAME_TIMER()
|
|
iEnemyTimer = GET_GAME_TIMER()
|
|
iMichaelTime = 6000 + GET_RANDOM_INT_IN_RANGE(0, 3001)
|
|
iEnemyTime = 7000 + GET_RANDOM_INT_IN_RANGE(0, 3001)
|
|
IF ( bReplayStopEventTriggered = FALSE )
|
|
IF ( bReplayStartEventTriggered = TRUE )
|
|
REPLAY_STOP_EVENT()
|
|
bReplayStopEventTriggered = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//play dialogue for more enemies running from behind church
|
|
IF NOT HAS_LABEL_BEEN_TRIGGERED("MCH1_GSM04")
|
|
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<3262.183105,-4629.664551,116.845070>>, << 30.0, 2.0, 3.0 >>)
|
|
IF ( esExitEnemies[COUNT_OF(esExitEnemies) - 1].bCreated = TRUE )
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(sMichael1Conversation, "MCH1AUD", "MCH1_GSM04", CONV_PRIORITY_HIGH)
|
|
SET_LABEL_AS_TRIGGERED("MCH1_GSM04", TRUE)
|
|
iConversationTimer = GET_GAME_TIMER()
|
|
iEnemyTimer = GET_GAME_TIMER()
|
|
iMichaelTime = 6000 + GET_RANDOM_INT_IN_RANGE(0, 3001)
|
|
iEnemyTime = 6000 + GET_RANDOM_INT_IN_RANGE(0, 3001)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//play dialogue for enemies blocked by the train when they arrive
|
|
IF NOT HAS_LABEL_BEEN_TRIGGERED("MCH1_GSGBA")
|
|
IF ( bEnemiesBlockedByTrain = TRUE )
|
|
IF DOES_ENTITY_EXIST(esVan4Enemies[0].PedIndex)
|
|
OR DOES_ENTITY_EXIST(esVan4Enemies[1].PedIndex)
|
|
OR DOES_ENTITY_EXIST(esVan4Enemies[2].PedIndex)
|
|
OR DOES_ENTITY_EXIST(esVan4Enemies[3].PedIndex)
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
|
|
i = GET_RANDOM_INT_IN_RANGE(0, 4)
|
|
|
|
IF NOT IS_PED_INJURED(esVan4Enemies[i].PedIndex)
|
|
|
|
FOR k = CHINESEGOON1SPEAKERID TO CHINESEGOON5SPEAKERID
|
|
REMOVE_PED_FOR_DIALOGUE(sMichael1Conversation, k)
|
|
ENDFOR
|
|
|
|
ADD_PED_FOR_DIALOGUE(sMichael1Conversation, CHINESEGOON5SPEAKERID, esVan4Enemies[i].PedIndex, CHINESEGOON5VOICENAME)
|
|
|
|
IF CREATE_CONVERSATION(sMichael1Conversation, "MCH1AUD", "MCH1_GSGBA", CONV_PRIORITY_MEDIUM)
|
|
SET_LABEL_AS_TRIGGERED("MCH1_GSGBA", TRUE)
|
|
iConversationTimer = GET_GAME_TIMER()
|
|
iEnemyTimer = GET_GAME_TIMER()
|
|
iMichaelTime = 6000 + GET_RANDOM_INT_IN_RANGE(0, 3001)
|
|
iEnemyTime = 7000 + GET_RANDOM_INT_IN_RANGE(0, 3001)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF ( bPlayerDetected = FALSE ) //player not detected by enemies
|
|
|
|
//play van exit conversations for enemies
|
|
IF NOT HAS_LABEL_BEEN_TRIGGERED("MCH1_MOVE1")
|
|
IF ( bPlayVanExitConversation = TRUE)
|
|
IF DOES_ENTITY_EXIST(esVanEnemies[2].PedIndex)
|
|
IF NOT IS_PED_INJURED(esVanEnemies[2].PedIndex)
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
|
|
FOR k = CHINESEGOON1SPEAKERID TO CHINESEGOON5SPEAKERID
|
|
REMOVE_PED_FOR_DIALOGUE(sMichael1Conversation, k)
|
|
ENDFOR
|
|
|
|
ADD_PED_FOR_DIALOGUE(sMichael1Conversation, CHINESEGOON1SPEAKERID, esVanEnemies[2].PedIndex, CHINESEGOON1VOICENAME)
|
|
|
|
IF CREATE_CONVERSATION(sMichael1Conversation, "MCH1AUD", "MCH1_MOVE1", CONV_PRIORITY_MEDIUM)
|
|
SET_LABEL_AS_TRIGGERED("MCH1_MOVE1", TRUE)
|
|
iConversationTimer = GET_GAME_TIMER()
|
|
iEnemyTimer = GET_GAME_TIMER()
|
|
iMichaelTime = 6000 + GET_RANDOM_INT_IN_RANGE(0, 3001)
|
|
iEnemyTime = 7000 + GET_RANDOM_INT_IN_RANGE(0, 3001)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
|
|
//play dialogue when middle enemies are spawned
|
|
IF NOT HAS_LABEL_BEEN_TRIGGERED("MCH1_MOVE3")
|
|
IF ( bSecondEnemyWaveSpawned = TRUE )
|
|
IF DOES_ENTITY_EXIST(esMiddleEnemies[0].PedIndex)
|
|
OR DOES_ENTITY_EXIST(esMiddleEnemies[1].PedIndex)
|
|
OR DOES_ENTITY_EXIST(esMiddleEnemies[2].PedIndex)
|
|
|
|
i = GET_RANDOM_INT_IN_RANGE(0, 3)
|
|
|
|
IF NOT IS_PED_INJURED(esMiddleEnemies[i].PedIndex)
|
|
|
|
FOR k = CHINESEGOON1SPEAKERID TO CHINESEGOON5SPEAKERID
|
|
REMOVE_PED_FOR_DIALOGUE(sMichael1Conversation, k)
|
|
ENDFOR
|
|
|
|
ADD_PED_FOR_DIALOGUE(sMichael1Conversation, CHINESEGOON3SPEAKERID, esMiddleEnemies[i].PedIndex, CHINESEGOON3VOICENAME)
|
|
|
|
IF CREATE_CONVERSATION(sMichael1Conversation, "MCH1AUD", "MCH1_MOVE3", CONV_PRIORITY_MEDIUM)
|
|
SET_LABEL_AS_TRIGGERED("MCH1_MOVE3", TRUE)
|
|
iConversationTimer = GET_GAME_TIMER()
|
|
iEnemyTimer = GET_GAME_TIMER()
|
|
iMichaelTime = 6000 + GET_RANDOM_INT_IN_RANGE(0, 3001)
|
|
iEnemyTime = 4000 + GET_RANDOM_INT_IN_RANGE(0, 2001)
|
|
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//play enemy searching dialogue
|
|
IF ( esMiddleEnemies[1].bSearching = TRUE )
|
|
IF DOES_ENTITY_EXIST(esMiddleEnemies[1].PedIndex)
|
|
IF NOT IS_PED_INJURED(esMiddleEnemies[1].PedIndex)
|
|
IF (esMiddleEnemies[1].iConversationTimer != 0)
|
|
IF HAS_TIME_PASSED(7500, esMiddleEnemies[1].iConversationTimer)
|
|
|
|
IF NOT IS_PED_INJURED(esMiddleEnemies[1].PedIndex)
|
|
|
|
FOR k = CHINESEGOON1SPEAKERID TO CHINESEGOON5SPEAKERID
|
|
REMOVE_PED_FOR_DIALOGUE(sMichael1Conversation, k)
|
|
ENDFOR
|
|
|
|
ADD_PED_FOR_DIALOGUE(sMichael1Conversation, CHINESEGOON3SPEAKERID, esMiddleEnemies[1].PedIndex, CHINESEGOON3VOICENAME)
|
|
|
|
ENDIF
|
|
|
|
IF CREATE_CONVERSATION(sMichael1Conversation, "MCH1AUD", "MCH1_SURR3", CONV_PRIORITY_MEDIUM, DO_NOT_DISPLAY_SUBTITLES)
|
|
esMiddleEnemies[1].iConversationTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
esMiddleEnemies[1].iConversationTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF HAS_TIME_PASSED(iEnemyTime, iEnemyTimer)
|
|
|
|
ClosestEnemyPed = GET_CLOSEST_PED_FROM_RELATIONSHIP_GROUP_FOR_PED(PLAYER_PED_ID(), rgEnemies, GET_RANDOM_INT_IN_RANGE(0, 4))
|
|
|
|
IF ( ClosestEnemyPed <> NULL )
|
|
AND NOT IS_PED_SITTING_IN_ANY_VEHICLE(ClosestEnemyPed)
|
|
|
|
FOR k = CHINESEGOON1SPEAKERID TO CHINESEGOON5SPEAKERID
|
|
REMOVE_PED_FOR_DIALOGUE(sMichael1Conversation, k)
|
|
ENDFOR
|
|
|
|
IF ( GET_NUMBER_OF_PEDS_FROM_RELATIONSHIP_GROUP_FOR_PED(PLAYER_PED_ID(), rgEnemies, FALSE) >= 1 )
|
|
|
|
SWITCH GET_RANDOM_INT_IN_RANGE(0,4)
|
|
|
|
CASE 0
|
|
|
|
ADD_PED_FOR_DIALOGUE(sMichael1Conversation, CHINESEGOON1SPEAKERID, ClosestEnemyPed, CHINESEGOON1VOICENAME)
|
|
IF CREATE_CONVERSATION(sMichael1Conversation, "MCH1AUD", "MCH1_MOVE1", CONV_PRIORITY_MEDIUM)
|
|
iEnemyTimer = GET_GAME_TIMER()
|
|
iEnemyTime = 6000 + GET_RANDOM_INT_IN_RANGE(0, 3001)
|
|
bShootingConversationPlayed = FALSE
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 1
|
|
|
|
ADD_PED_FOR_DIALOGUE(sMichael1Conversation, CHINESEGOON1SPEAKERID, ClosestEnemyPed, CHINESEGOON1VOICENAME)
|
|
IF CREATE_CONVERSATION(sMichael1Conversation, "MCH1AUD", "MCH1_SURR1", CONV_PRIORITY_MEDIUM)
|
|
iEnemyTimer = GET_GAME_TIMER()
|
|
iEnemyTime = 6000 + GET_RANDOM_INT_IN_RANGE(0, 3001)
|
|
bShootingConversationPlayed = FALSE
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 2
|
|
|
|
ADD_PED_FOR_DIALOGUE(sMichael1Conversation, CHINESEGOON2SPEAKERID, ClosestEnemyPed, CHINESEGOON2VOICENAME)
|
|
IF CREATE_CONVERSATION(sMichael1Conversation, "MCH1AUD", "MCH1_MOVE2", CONV_PRIORITY_MEDIUM)
|
|
iEnemyTimer = GET_GAME_TIMER()
|
|
iEnemyTime = 6000 + GET_RANDOM_INT_IN_RANGE(0, 3001)
|
|
bShootingConversationPlayed = FALSE
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 3
|
|
|
|
ADD_PED_FOR_DIALOGUE(sMichael1Conversation, CHINESEGOON2SPEAKERID, ClosestEnemyPed, CHINESEGOON2VOICENAME)
|
|
IF CREATE_CONVERSATION(sMichael1Conversation, "MCH1AUD", "MCH1_SURR2", CONV_PRIORITY_MEDIUM)
|
|
iEnemyTimer = GET_GAME_TIMER()
|
|
iEnemyTime = 6000 + GET_RANDOM_INT_IN_RANGE(0, 3001)
|
|
bShootingConversationPlayed = FALSE
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
ENDIF
|
|
|
|
|
|
ELSE
|
|
iEnemyTimer = GET_GAME_TIMER()
|
|
iEnemyTime = 2000 + GET_RANDOM_INT_IN_RANGE(0, 1001)
|
|
bShootingConversationPlayed = FALSE
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ELSE //player detected by enemies
|
|
|
|
//play dialogue for enemies spotting Michael
|
|
IF NOT HAS_LABEL_BEEN_TRIGGERED("MCH1_SPOT1")
|
|
AND NOT HAS_LABEL_BEEN_TRIGGERED("MCH1_SPOT2")
|
|
AND NOT HAS_LABEL_BEEN_TRIGGERED("MCH1_SPOT3")
|
|
AND NOT HAS_LABEL_BEEN_TRIGGERED("MCH1_SPOT4")
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
|
|
ClosestEnemyPed = GET_CLOSEST_PED_FROM_RELATIONSHIP_GROUP_FOR_PED(PLAYER_PED_ID(), rgEnemies)
|
|
|
|
IF ( ClosestEnemyPed <> NULL )
|
|
|
|
FOR k = CHINESEGOON1SPEAKERID TO CHINESEGOON5SPEAKERID
|
|
REMOVE_PED_FOR_DIALOGUE(sMichael1Conversation, k)
|
|
ENDFOR
|
|
|
|
SWITCH GET_RANDOM_INT_IN_RANGE(1, 4)
|
|
CASE 1
|
|
ADD_PED_FOR_DIALOGUE(sMichael1Conversation, CHINESEGOON1SPEAKERID, ClosestEnemyPed, CHINESEGOON1VOICENAME)
|
|
IF CREATE_CONVERSATION(sMichael1Conversation, "MCH1AUD", "MCH1_SPOT1", CONV_PRIORITY_MEDIUM, DO_NOT_DISPLAY_SUBTITLES)
|
|
SET_LABEL_AS_TRIGGERED("MCH1_SPOT1", TRUE)
|
|
iConversationTimer = GET_GAME_TIMER()
|
|
iEnemyTimer = GET_GAME_TIMER()
|
|
iMichaelTime = 6000 + GET_RANDOM_INT_IN_RANGE(0, 3001)
|
|
iEnemyTime = 7000 + GET_RANDOM_INT_IN_RANGE(0, 3001)
|
|
bDetectedConversationPlaying = TRUE
|
|
ENDIF
|
|
BREAK
|
|
CASE 2
|
|
ADD_PED_FOR_DIALOGUE(sMichael1Conversation, CHINESEGOON2SPEAKERID, ClosestEnemyPed, CHINESEGOON2VOICENAME)
|
|
IF CREATE_CONVERSATION(sMichael1Conversation, "MCH1AUD", "MCH1_SPOT2", CONV_PRIORITY_MEDIUM, DO_NOT_DISPLAY_SUBTITLES)
|
|
SET_LABEL_AS_TRIGGERED("MCH1_SPOT2", TRUE)
|
|
iConversationTimer = GET_GAME_TIMER()
|
|
iEnemyTimer = GET_GAME_TIMER()
|
|
iMichaelTime = 6000 + GET_RANDOM_INT_IN_RANGE(0, 3001)
|
|
iEnemyTime = 7000 + GET_RANDOM_INT_IN_RANGE(0, 3001)
|
|
bDetectedConversationPlaying = TRUE
|
|
ENDIF
|
|
BREAK
|
|
CASE 3
|
|
ADD_PED_FOR_DIALOGUE(sMichael1Conversation, CHINESEGOON3SPEAKERID, ClosestEnemyPed, CHINESEGOON3VOICENAME)
|
|
IF CREATE_CONVERSATION(sMichael1Conversation, "MCH1AUD", "MCH1_SPOT3", CONV_PRIORITY_MEDIUM, DO_NOT_DISPLAY_SUBTITLES)
|
|
SET_LABEL_AS_TRIGGERED("MCH1_SPOT3", TRUE)
|
|
iConversationTimer = GET_GAME_TIMER()
|
|
iEnemyTimer = GET_GAME_TIMER()
|
|
iMichaelTime = 6000 + GET_RANDOM_INT_IN_RANGE(0, 3001)
|
|
iEnemyTime = 7000 + GET_RANDOM_INT_IN_RANGE(0, 3001)
|
|
bDetectedConversationPlaying = TRUE
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
ENDIF
|
|
ELSE
|
|
|
|
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
|
|
TEXT_LABEL_23 CurrentConversationRoot
|
|
|
|
CurrentConversationRoot = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_ROOT()
|
|
|
|
IF NOT IS_STRING_NULL_OR_EMPTY(CurrentConversationRoot)
|
|
IF ARE_STRINGS_EQUAL(CurrentConversationRoot, "MCH1_SPOT1")
|
|
OR ARE_STRINGS_EQUAL(CurrentConversationRoot, "MCH1_SPOT2")
|
|
OR ARE_STRINGS_EQUAL(CurrentConversationRoot, "MCH1_SPOT3")
|
|
OR ARE_STRINGS_EQUAL(CurrentConversationRoot, "MCH1_SPOT4")
|
|
bDetectedConversationPlaying = TRUE
|
|
ELSE
|
|
bDetectedConversationPlaying = FALSE
|
|
ENDIF
|
|
ELSE
|
|
bDetectedConversationPlaying = FALSE
|
|
ENDIF
|
|
ELSE
|
|
bDetectedConversationPlaying = FALSE
|
|
ENDIF
|
|
|
|
IF NOT HAS_LABEL_BEEN_TRIGGERED("MCH1_SURROUND")
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
|
|
ClosestEnemyPed = GET_CLOSEST_PED_FROM_RELATIONSHIP_GROUP_FOR_PED(PLAYER_PED_ID(), rgEnemies)
|
|
|
|
IF ( ClosestEnemyPed <> NULL )
|
|
|
|
FOR k = CHINESEGOON1SPEAKERID TO CHINESEGOON5SPEAKERID
|
|
REMOVE_PED_FOR_DIALOGUE(sMichael1Conversation, k)
|
|
ENDFOR
|
|
|
|
SWITCH GET_RANDOM_INT_IN_RANGE(1, 4)
|
|
CASE 1
|
|
ADD_PED_FOR_DIALOGUE(sMichael1Conversation, CHINESEGOON1SPEAKERID, ClosestEnemyPed, CHINESEGOON1VOICENAME)
|
|
IF CREATE_CONVERSATION(sMichael1Conversation, "MCH1AUD", "MCH1_SURR1", CONV_PRIORITY_MEDIUM, DO_NOT_DISPLAY_SUBTITLES)
|
|
SET_LABEL_AS_TRIGGERED("MCH1_SURROUND", TRUE)
|
|
iConversationTimer = GET_GAME_TIMER()
|
|
iEnemyTimer = GET_GAME_TIMER()
|
|
iMichaelTime = 6000 + GET_RANDOM_INT_IN_RANGE(0, 3001)
|
|
iEnemyTime = 7000 + GET_RANDOM_INT_IN_RANGE(0, 3001)
|
|
bDetectedConversationPlaying = TRUE
|
|
ENDIF
|
|
BREAK
|
|
CASE 2
|
|
ADD_PED_FOR_DIALOGUE(sMichael1Conversation, CHINESEGOON2SPEAKERID, ClosestEnemyPed, CHINESEGOON2VOICENAME)
|
|
IF CREATE_CONVERSATION(sMichael1Conversation, "MCH1AUD", "MCH1_SURR2", CONV_PRIORITY_MEDIUM, DO_NOT_DISPLAY_SUBTITLES)
|
|
SET_LABEL_AS_TRIGGERED("MCH1_SURROUND", TRUE)
|
|
iConversationTimer = GET_GAME_TIMER()
|
|
iEnemyTimer = GET_GAME_TIMER()
|
|
iMichaelTime = 6000 + GET_RANDOM_INT_IN_RANGE(0, 3001)
|
|
iEnemyTime = 7000 + GET_RANDOM_INT_IN_RANGE(0, 3001)
|
|
bDetectedConversationPlaying = TRUE
|
|
ENDIF
|
|
BREAK
|
|
CASE 3
|
|
ADD_PED_FOR_DIALOGUE(sMichael1Conversation, CHINESEGOON3SPEAKERID, ClosestEnemyPed, CHINESEGOON3VOICENAME)
|
|
IF CREATE_CONVERSATION(sMichael1Conversation, "MCH1AUD", "MCH1_SURR3", CONV_PRIORITY_MEDIUM, DO_NOT_DISPLAY_SUBTITLES)
|
|
SET_LABEL_AS_TRIGGERED("MCH1_SURROUND", TRUE)
|
|
iConversationTimer = GET_GAME_TIMER()
|
|
iEnemyTimer = GET_GAME_TIMER()
|
|
iMichaelTime = 6000 + GET_RANDOM_INT_IN_RANGE(0, 3001)
|
|
iEnemyTime = 7000 + GET_RANDOM_INT_IN_RANGE(0, 3001)
|
|
bDetectedConversationPlaying = TRUE
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
|
|
//play Michael's shooting dialogue
|
|
IF ( bShootingConversationPlayed = FALSE )
|
|
//check for number of alive enemies
|
|
IF ( GET_NUMBER_OF_PEDS_FROM_RELATIONSHIP_GROUP_FOR_PED(PLAYER_PED_ID(), rgEnemies, FALSE) > 0 )
|
|
IF IS_PLAYER_SHOOTING_AT_ANY_PEDS(PLAYER_PED_ID())
|
|
|
|
SWITCH GET_RANDOM_INT_IN_RANGE(0, 4) //play shooting conversation with 75% chance
|
|
|
|
CASE 0
|
|
CASE 1
|
|
CASE 2
|
|
|
|
IF CREATE_CONVERSATION(sMichael1Conversation, "MCH1AUD", "MCH1_GSM02", CONV_PRIORITY_HIGH)
|
|
iConversationTimer = GET_GAME_TIMER()
|
|
iMichaelTime = 9000 + GET_RANDOM_INT_IN_RANGE(0, 3001)
|
|
bShootingConversationPlayed = TRUE
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
DEFAULT
|
|
//play no conversation, 25% chance
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
//play Michael's random dialogue
|
|
IF HAS_TIME_PASSED(iMichaelTime, iConversationTimer)
|
|
|
|
ClosestEnemyPed = GET_CLOSEST_PED_FROM_RELATIONSHIP_GROUP_FOR_PED(PLAYER_PED_ID(), rgEnemies) //get closest enemy
|
|
|
|
IF ( ClosestEnemyPed <> NULL ) //if the closest enemy ped exists
|
|
|
|
fDistanceToClosestEnemyPed = GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), ClosestEnemyPed) //get distance to enemy
|
|
|
|
IF ( fDistanceToClosestEnemyPed < 35.0 ) //do a distance check
|
|
|
|
IF CREATE_CONVERSATION(sMichael1Conversation, "MCH1AUD", "MCH1_GSM01", CONV_PRIORITY_MEDIUM)
|
|
iConversationTimer = GET_GAME_TIMER()
|
|
iMichaelTime = 9000 + GET_RANDOM_INT_IN_RANGE(0, 3001)
|
|
bShootingConversationPlayed = FALSE
|
|
ENDIF
|
|
|
|
ELSE
|
|
iConversationTimer = GET_GAME_TIMER() //if distance check failed
|
|
iMichaelTime = 4000 + GET_RANDOM_INT_IN_RANGE(0, 2001) //reset conversation timers and flags
|
|
bShootingConversationPlayed = FALSE //set time amount between checks to be lower than usual
|
|
ENDIF
|
|
|
|
ELSE
|
|
iConversationTimer = GET_GAME_TIMER()
|
|
iMichaelTime = 9000 + GET_RANDOM_INT_IN_RANGE(0, 3001)
|
|
bShootingConversationPlayed = FALSE
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
//play enemy random dialogue
|
|
IF HAS_TIME_PASSED(iEnemyTime, iEnemyTimer)
|
|
|
|
IF ( GET_NUMBER_OF_PEDS_FROM_RELATIONSHIP_GROUP_FOR_PED(PLAYER_PED_ID(), rgEnemies, FALSE) = 1 ) //one enemy is alive
|
|
|
|
ClosestEnemyPed = GET_CLOSEST_PED_FROM_RELATIONSHIP_GROUP_FOR_PED(PLAYER_PED_ID(), rgEnemies)
|
|
|
|
SWITCH GET_RANDOM_INT_IN_RANGE(0, 4)
|
|
|
|
CASE 0 //Chinese Goon 1 is the last enemy remaining
|
|
iEnemySpeakerID = CHINESEGOON1SPEAKERID
|
|
sEnemyVoiceName = CHINESEGOON1VOICENAME
|
|
sEnemyConversationRoot = "MCH1_GSGL1"
|
|
BREAK
|
|
|
|
CASE 1 //Chinese Goon 2 is the last enemy remaining
|
|
iEnemySpeakerID = CHINESEGOON2SPEAKERID
|
|
sEnemyVoiceName = CHINESEGOON2VOICENAME
|
|
sEnemyConversationRoot = "MCH1_GSGL2"
|
|
BREAK
|
|
|
|
CASE 2 //Chinese Goon 3 is the last enemy remaining, actual voice name 4
|
|
iEnemySpeakerID = CHINESEGOON4SPEAKERID
|
|
sEnemyVoiceName = CHINESEGOON4VOICENAME
|
|
sEnemyConversationRoot = "MCH1_GSGL3"
|
|
BREAK
|
|
|
|
CASE 3 //Chinese Goon 4 is the last enemy remaining
|
|
iEnemySpeakerID = CHINESEGOON4SPEAKERID
|
|
sEnemyVoiceName = CHINESEGOON4VOICENAME
|
|
sEnemyConversationRoot = "MCH1_GSGL4"
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
FOR k = CHINESEGOON1SPEAKERID TO CHINESEGOON5SPEAKERID
|
|
REMOVE_PED_FOR_DIALOGUE(sMichael1Conversation, k)
|
|
ENDFOR
|
|
|
|
ADD_PED_FOR_DIALOGUE(sMichael1Conversation, iEnemySpeakerID, ClosestEnemyPed, sEnemyVoiceName)
|
|
|
|
IF CREATE_CONVERSATION(sMichael1Conversation, "MCH1AUD", sEnemyConversationRoot, CONV_PRIORITY_MEDIUM)
|
|
iEnemyTimer = GET_GAME_TIMER()
|
|
iEnemyTime = 7000 + GET_RANDOM_INT_IN_RANGE(0, 3001)
|
|
bShootingConversationPlayed = FALSE
|
|
ENDIF
|
|
|
|
ELSE //multiple enemies are alive
|
|
|
|
ClosestEnemyPed = GET_CLOSEST_PED_FROM_RELATIONSHIP_GROUP_FOR_PED(PLAYER_PED_ID(), rgEnemies, GET_RANDOM_INT_IN_RANGE(0, 3))
|
|
|
|
IF ( ClosestEnemyPed <> NULL )
|
|
|
|
SWITCH GET_RANDOM_INT_IN_RANGE(0, 2) //randomly play enemy shouting to themselves or enemy shouting to Michael
|
|
|
|
CASE 0 //enemies shout to themselves in Mandarin
|
|
|
|
SWITCH GET_RANDOM_INT_IN_RANGE(0, 5)
|
|
|
|
CASE 0 //Chinese Goon 1 attacks and shouts to other goons in Mandarin
|
|
iEnemySpeakerID = CHINESEGOON1SPEAKERID
|
|
sEnemyVoiceName = CHINESEGOON1VOICENAME
|
|
sEnemyConversationRoot = "MCH1_GSGA1"
|
|
BREAK
|
|
|
|
CASE 1 //Chinese Goon 2 attacks and shouts to other goons in Mandarin
|
|
iEnemySpeakerID = CHINESEGOON2SPEAKERID
|
|
sEnemyVoiceName = CHINESEGOON2VOICENAME
|
|
sEnemyConversationRoot = "MCH1_GSGA2"
|
|
BREAK
|
|
|
|
CASE 2 //Chinese Goon 3 attacks and shouts to other goons in Mandarin, actual vaoice name is 4
|
|
iEnemySpeakerID = CHINESEGOON4SPEAKERID
|
|
sEnemyVoiceName = CHINESEGOON4VOICENAME
|
|
sEnemyConversationRoot = "MCH1_GSGA3"
|
|
BREAK
|
|
|
|
CASE 3 //Chinese Goon 4 attacks and shouts to other goons in Mandarin
|
|
iEnemySpeakerID = CHINESEGOON4SPEAKERID
|
|
sEnemyVoiceName = CHINESEGOON4VOICENAME
|
|
sEnemyConversationRoot = "MCH1_GSGA4"
|
|
BREAK
|
|
|
|
CASE 4 //Chinese Goon 5 attacks and shouts to to other goons in Mandarin, train is blocking them
|
|
IF ( bEnemiesBlockedByTrain = TRUE )
|
|
iEnemySpeakerID = CHINESEGOON5SPEAKERID
|
|
sEnemyVoiceName = CHINESEGOON5VOICENAME
|
|
sEnemyConversationRoot = "MCH1_GSGA5"
|
|
ELSE
|
|
iEnemySpeakerID = CHINESEGOON4SPEAKERID
|
|
sEnemyVoiceName = CHINESEGOON4VOICENAME
|
|
sEnemyConversationRoot = "MCH1_GSGA4"
|
|
ENDIF
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
BREAK
|
|
|
|
CASE 1 //enemies shout to Michael
|
|
|
|
SWITCH GET_RANDOM_INT_IN_RANGE(0, 5)
|
|
|
|
CASE 0 //Chinese Goon 1 shouts to Michael
|
|
iEnemySpeakerID = CHINESEGOON1SPEAKERID
|
|
sEnemyVoiceName = CHINESEGOON1VOICENAME
|
|
sEnemyConversationRoot = "MCH1_GSGS1"
|
|
BREAK
|
|
|
|
CASE 1 //Chinese Goon 2 shouts to Michael
|
|
iEnemySpeakerID = CHINESEGOON2SPEAKERID
|
|
sEnemyVoiceName = CHINESEGOON2VOICENAME
|
|
sEnemyConversationRoot = "MCH1_GSGS2"
|
|
BREAK
|
|
|
|
CASE 2 //Chinese Goon 3 shouts to Michael, actual voice name is 4
|
|
iEnemySpeakerID = CHINESEGOON4SPEAKERID
|
|
sEnemyVoiceName = CHINESEGOON4VOICENAME
|
|
sEnemyConversationRoot = "MCH1_GSGS3"
|
|
BREAK
|
|
|
|
CASE 3 //Chinese Goon 4 shouts to Michael
|
|
iEnemySpeakerID = CHINESEGOON4SPEAKERID
|
|
sEnemyVoiceName = CHINESEGOON4VOICENAME
|
|
sEnemyConversationRoot = "MCH1_GSGS4"
|
|
BREAK
|
|
|
|
CASE 4 //Chinese Goon 5 shouts to Michael, train is blocking them
|
|
IF ( bEnemiesBlockedByTrain = TRUE )
|
|
iEnemySpeakerID = CHINESEGOON5SPEAKERID
|
|
sEnemyVoiceName = CHINESEGOON5VOICENAME
|
|
sEnemyConversationRoot = "MCH1_GSGS5"
|
|
ELSE
|
|
iEnemySpeakerID = CHINESEGOON4SPEAKERID
|
|
sEnemyVoiceName = CHINESEGOON4VOICENAME
|
|
sEnemyConversationRoot = "MCH1_GSGS4"
|
|
ENDIF
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
FOR k = CHINESEGOON1SPEAKERID TO CHINESEGOON5SPEAKERID
|
|
REMOVE_PED_FOR_DIALOGUE(sMichael1Conversation, k)
|
|
ENDFOR
|
|
|
|
ADD_PED_FOR_DIALOGUE(sMichael1Conversation, iEnemySpeakerID, ClosestEnemyPed, sEnemyVoiceName)
|
|
|
|
IF CREATE_CONVERSATION(sMichael1Conversation, "MCH1AUD", sEnemyConversationRoot, CONV_PRIORITY_MEDIUM)
|
|
iEnemyTimer = GET_GAME_TIMER()
|
|
iEnemyTime = 7000 + GET_RANDOM_INT_IN_RANGE(0, 3001)
|
|
bShootingConversationPlayed = FALSE
|
|
ENDIF
|
|
|
|
ELSE
|
|
iEnemyTimer = GET_GAME_TIMER()
|
|
iEnemyTime = 5000 + GET_RANDOM_INT_IN_RANGE(0, 3001)
|
|
bShootingConversationPlayed = FALSE
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
//play dialogue for spotting the second van
|
|
IF NOT HAS_LABEL_BEEN_TRIGGERED("MCH1_GSM05_1")
|
|
IF DOES_ENTITY_EXIST(vsEnemyVans[1].VehicleIndex) AND NOT IS_ENTITY_DEAD(vsEnemyVans[1].VehicleIndex)
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vsEnemyVans[1].VehicleIndex)
|
|
IF HAS_ENTITY_CLEAR_LOS_TO_ENTITY_IN_FRONT(PLAYER_PED_ID(), vsEnemyVans[1].VehicleIndex)
|
|
IF CREATE_CONVERSATION(sMichael1Conversation, "MCH1AUD", "MCH1_GSM05", CONV_PRIORITY_MEDIUM)
|
|
iConversationTimer = GET_GAME_TIMER()
|
|
iMichaelTime = 9000 + GET_RANDOM_INT_IN_RANGE(0, 3001)
|
|
SET_LABEL_AS_TRIGGERED("MCH1_GSM05_1", TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//play dialogue for spotting the third van
|
|
IF NOT HAS_LABEL_BEEN_TRIGGERED("MCH1_GSM05_2")
|
|
IF DOES_ENTITY_EXIST(vsEnemyVans[4].VehicleIndex) AND NOT IS_ENTITY_DEAD(vsEnemyVans[4].VehicleIndex)
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vsEnemyVans[4].VehicleIndex)
|
|
IF HAS_ENTITY_CLEAR_LOS_TO_ENTITY_IN_FRONT(PLAYER_PED_ID(), vsEnemyVans[4].VehicleIndex)
|
|
IF CREATE_CONVERSATION(sMichael1Conversation, "MCH1AUD", "MCH1_GSM05", CONV_PRIORITY_MEDIUM)
|
|
SET_LABEL_AS_TRIGGERED("MCH1_GSM05_2", TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT HAS_LABEL_BEEN_TRIGGERED("MCH1_GSM06")
|
|
IF DOES_ENTITY_EXIST(vsEnemyVans[4].VehicleIndex) AND NOT IS_ENTITY_DEAD(vsEnemyVans[4].VehicleIndex)
|
|
IF DOES_ENTITY_EXIST(tsTrain.VehicleIndex) AND NOT IS_ENTITY_DEAD(tsTrain.VehicleIndex)
|
|
IF IS_VEHICLE_STOPPED(vsEnemyVans[4].VehicleIndex)
|
|
IF IS_ENTITY_AT_COORD(tsTrain.VehicleIndex, <<3245.581543,-4715.378906,115.788742>>,<<128.000000,32.000000,6.000000>>)
|
|
AND IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<3227.010742,-4693.197754,115.645851>>,<<28.000000,22.000000,6.000000>>)
|
|
IF CREATE_CONVERSATION(sMichael1Conversation, "MCH1AUD", "MCH1_GSM06", CONV_PRIORITY_MEDIUM)
|
|
iConversationTimer = GET_GAME_TIMER()
|
|
iMichaelTime = 9000 + GET_RANDOM_INT_IN_RANGE(0, 3001)
|
|
SET_LABEL_AS_TRIGGERED("MCH1_GSM06", TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
ENDPROC
|
|
|
|
PROC MANAGE_CHURCH_BELL_SOUNDS(INT &iProgress)
|
|
|
|
IF NOT REQUEST_AMBIENT_AUDIO_BANK("CHURCH_BELL")
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Loading ambient audio bank CHURCH_BELL.")
|
|
#ENDIF
|
|
|
|
ELSE
|
|
|
|
SWITCH iProgress
|
|
|
|
CASE 0
|
|
|
|
iProgress++
|
|
|
|
BREAK
|
|
|
|
CASE 1
|
|
|
|
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<3259.471436,-4664.254395,116.152191>>,<<36.000000,30.000000,5.000000>>)
|
|
PLAY_SOUND_FROM_COORD(iChurchBellsSoundID, "RING", << 3243.52, -4665.81, 126.0 >>, "CHURCH_BELL_SOUNDSET")
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Playing sound RING.")
|
|
#ENDIF
|
|
iProgress++
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 2
|
|
|
|
IF NOT HAS_SOUND_FINISHED(iChurchBellsSoundID)
|
|
SET_VARIABLE_ON_SOUND(iChurchBellsSoundID, "CHURCH_BELL_RING_COUNT", 0.0)
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Sound playing, setting variable.")
|
|
#ENDIF
|
|
ELSE
|
|
iProgress++
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Sound finished.")
|
|
#ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC RUN_VEHICLE_TYRE_BURST_CHECK(VEHICLE_INDEX VehicleIndex, SC_WHEEL_LIST eVehicleWheel, VECTOR vWheelOffset, FLOAT fRadius, BOOL bPlayerOnly,
|
|
BOOL bApplyDamage, VECTOR vDamageOffset, FLOAT fDamage = 100.0, FLOAT fDeformation = 100.0
|
|
#IF IS_DEBUG_BUILD, BOOL bDrawDebugInfo = TRUE #ENDIF)
|
|
|
|
IF DOES_ENTITY_EXIST(VehicleIndex)
|
|
IF IS_VEHICLE_DRIVEABLE(VehicleIndex)
|
|
IF NOT IS_VEHICLE_TYRE_BURST(VehicleIndex, eVehicleWheel)
|
|
IF IS_BULLET_IN_AREA(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(VehicleIndex, vWheelOffset), fRadius, bPlayerOnly)
|
|
|
|
SWITCH eVehicleWheel
|
|
|
|
CASE SC_WHEEL_CAR_FRONT_LEFT
|
|
SET_VEHICLE_TYRE_BURST(VehicleIndex, SC_WHEEL_CAR_FRONT_LEFT)
|
|
SMASH_VEHICLE_WINDOW(VehicleIndex, SC_WINDOW_FRONT_LEFT)
|
|
BREAK
|
|
|
|
CASE SC_WHEEL_CAR_FRONT_RIGHT
|
|
SET_VEHICLE_TYRE_BURST(VehicleIndex, SC_WHEEL_CAR_FRONT_RIGHT)
|
|
SMASH_VEHICLE_WINDOW(VehicleIndex, SC_WINDOW_FRONT_RIGHT)
|
|
BREAK
|
|
|
|
CASE SC_WHEEL_CAR_REAR_LEFT
|
|
SET_VEHICLE_TYRE_BURST(VehicleIndex, SC_WHEEL_CAR_REAR_LEFT)
|
|
SMASH_VEHICLE_WINDOW(VehicleIndex, SC_WINDOW_REAR_LEFT)
|
|
BREAK
|
|
|
|
CASE SC_WHEEL_CAR_REAR_RIGHT
|
|
SET_VEHICLE_TYRE_BURST(VehicleIndex, SC_WHEEL_CAR_REAR_RIGHT)
|
|
SMASH_VEHICLE_WINDOW(VehicleIndex, SC_WINDOW_REAR_RIGHT)
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
IF ( bApplyDamage = TRUE )
|
|
SET_VEHICLE_DAMAGE(VehicleIndex, vDamageOffset, fDamage, fDeformation, TRUE)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
|
|
IF ( bDrawDebugInfo = TRUE )
|
|
|
|
DRAW_DEBUG_SPHERE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(VehicleIndex, vWheelOffset), fRadius, 0, 0, 255, 64)
|
|
DRAW_DEBUG_SPHERE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(VehicleIndex, vDamageOffset), 0.1, 255, 0, 0)
|
|
|
|
// DRAW_DEBUG_TEXT(GET_STRING_FROM_VECTOR(vDamageOffset),GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(VehicleIndex, vDamageOffset), 255, 0, 0)
|
|
//
|
|
// SWITCH eVehicleWheel
|
|
//
|
|
// CASE SC_WHEEL_CAR_FRONT_LEFT
|
|
// DRAW_DEBUG_TEXT("FRONT LEFT", GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(VehicleIndex, vWheelOffset))
|
|
// BREAK
|
|
//
|
|
// CASE SC_WHEEL_CAR_FRONT_RIGHT
|
|
// DRAW_DEBUG_TEXT("FRONT RIGHT", GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(VehicleIndex, vWheelOffset))
|
|
// BREAK
|
|
//
|
|
// CASE SC_WHEEL_CAR_REAR_LEFT
|
|
// DRAW_DEBUG_TEXT("REAR LEFT", GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(VehicleIndex, vWheelOffset))
|
|
// BREAK
|
|
//
|
|
// CASE SC_WHEEL_CAR_REAR_RIGHT
|
|
// DRAW_DEBUG_TEXT("REAR RIGHT", GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(VehicleIndex, vWheelOffset))
|
|
// BREAK
|
|
//
|
|
// ENDSWITCH
|
|
ENDIF
|
|
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC CHECK_VEHICLE_FOR_DRIVING_INTO_LOCATE(VEH_STRUCT &sVehicle, PED_INDEX PedIndex, VECTOR vLocatePosition, VECTOR vLocateSize)
|
|
|
|
IF NOT IS_PED_INJURED(PedIndex)
|
|
|
|
IF DOES_ENTITY_EXIST(sVehicle.VehicleIndex)
|
|
IF IS_VEHICLE_DRIVEABLE(sVehicle.VehicleIndex)
|
|
|
|
IF NOT IS_ENTITY_DEAD(sVehicle.VehicleIndex)
|
|
|
|
IF ( sVehicle.bSmoking = FALSE ) //use this flag to mark vehicle as no longer usable by player
|
|
|
|
//make the vehicle look like undriveable when it is driven into a locate
|
|
IF IS_PED_IN_VEHICLE(PedIndex, sVehicle.VehicleIndex)
|
|
IF IS_ENTITY_AT_COORD(sVehicle.VehicleIndex, vLocatePosition, vLocateSize)
|
|
SET_VEHICLE_ENGINE_HEALTH(sVehicle.VehicleIndex, 50)
|
|
SET_VEHICLE_ENGINE_ON(sVehicle.VehicleIndex, FALSE, TRUE)
|
|
SET_VEHICLE_UNDRIVEABLE(sVehicle.VehicleIndex, TRUE)
|
|
sVehicle.bSmoking = TRUE //use this flag to mark vehicle as no longer usable by player
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC UPDATE_VEHICLE_DAMAGE_FROM_PED(VEHICLE_INDEX VehicleIndex, PED_INDEX PedIndex, INT iExplodeHealth, INT iSmokeHealth, BOOL &bSmokingFlag,
|
|
VECTOR vDistanceFromVehicle, VECTOR vForce, VECTOR vForceOffset, BOOL bApplyForceDuringPlayback = FALSE,
|
|
FLOAT fStartPlaybackPercentage = 0.0, FLOAT fEndPlaybackPercentage = 100.0)
|
|
|
|
IF NOT IS_PED_INJURED(PedIndex)
|
|
|
|
IF DOES_ENTITY_EXIST(VehicleIndex)
|
|
IF NOT IS_ENTITY_DEAD(VehicleIndex)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
DRAW_DEBUG_TEXT_ABOVE_ENTITY(VehicleIndex, GET_STRING_FROM_INT(GET_ENTITY_HEALTH(VehicleIndex)), 2.15)
|
|
DRAW_DEBUG_TEXT_ABOVE_ENTITY(VehicleIndex, GET_STRING_FROM_FLOAT(GET_VEHICLE_ENGINE_HEALTH(VehicleIndex)), 1.95)
|
|
DRAW_DEBUG_TEXT_ABOVE_ENTITY(VehicleIndex, GET_STRING_FROM_FLOAT(GET_VEHICLE_PETROL_TANK_HEALTH(VehicleIndex)), 1.75)
|
|
#ENDIF
|
|
|
|
IF ( GET_ENTITY_HEALTH(VehicleIndex) = 0 )
|
|
|
|
IF NOT IS_ENTITY_AT_ENTITY(PedIndex, VehicleIndex, vDistanceFromVehicle)
|
|
EXPLODE_VEHICLE(VehicleIndex)
|
|
ELSE
|
|
SET_VEHICLE_ENGINE_HEALTH(VehicleIndex, -100)
|
|
SET_VEHICLE_PETROL_TANK_HEALTH(VehicleIndex, -100)
|
|
ENDIF
|
|
|
|
ELIF ( GET_ENTITY_HEALTH(VehicleIndex) < iExplodeHealth )
|
|
|
|
//only player can damage it below certain health to make it explode
|
|
IF IS_PED_SHOOTING_AT_ENTITY(PedIndex, VehicleIndex)
|
|
IF NOT IS_ENTITY_AT_ENTITY(PedIndex, VehicleIndex, vDistanceFromVehicle)
|
|
|
|
IF ( bApplyForceDuringPlayback = TRUE )
|
|
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(VehicleIndex)
|
|
|
|
FLOAT fPlaybackPercentage
|
|
|
|
fPlaybackPercentage = GET_VEHICLE_RECORDING_PLAYBACK_PERCENTAGE(VehicleIndex)
|
|
|
|
IF ( fPlaybackPercentage > fStartPlaybackPercentage AND fPlaybackPercentage < fEndPlaybackPercentage )
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(VehicleIndex)
|
|
APPLY_FORCE_TO_ENTITY(VehicleIndex, APPLY_TYPE_IMPULSE, vForce, vForceOffset, 0, TRUE, TRUE, TRUE)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
EXPLODE_VEHICLE(VehicleIndex)
|
|
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(VehicleIndex)
|
|
REPLAY_RECORD_BACK_FOR_TIME(3, 0, REPLAY_IMPORTANCE_HIGH)
|
|
ELSE
|
|
SET_VEHICLE_ENGINE_HEALTH(VehicleIndex, -100)
|
|
SET_VEHICLE_PETROL_TANK_HEALTH(VehicleIndex, -100)
|
|
SET_ENTITY_HEALTH(VehicleIndex, 100)
|
|
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(VehicleIndex)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ELIF ( GET_ENTITY_HEALTH(VehicleIndex) < iSmokeHealth )
|
|
|
|
IF ( bSmokingFlag = FALSE )
|
|
|
|
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(VehicleIndex)
|
|
SET_VEHICLE_ENGINE_HEALTH(VehicleIndex, 50)
|
|
SET_VEHICLE_UNDRIVEABLE(VehicleIndex, TRUE)
|
|
bSmokingFlag = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Checks if a recording playback is going on for a vehicle or vehicle driver was killed when recording playback was going on for vehicle.
|
|
/// PARAMS:
|
|
/// VehicleIndex - Vehicle to check for playback or dead driver during playback.
|
|
/// fPlaybackPercentage - Outputs the playback percentage going on for the specified vehicle.
|
|
/// bDriverDead - Outputs if the driver of the specified vehicle was killed when playback was going of the vehicle.
|
|
/// RETURNS:
|
|
/// TRUE if recording playback is going on for vehicle or the driver was killed during an ongoing playback, FALSE if otherwise.
|
|
FUNC BOOL IS_VEHICLE_RECORDING_PLAYBACK_RUNNING_OR_DRIVER_DEAD(VEHICLE_INDEX VehicleIndex, FLOAT &fPlaybackPercentage, BOOL &bDriverDead)
|
|
|
|
IF DOES_ENTITY_EXIST(VehicleIndex)
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(VehicleIndex)
|
|
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(VehicleIndex)
|
|
|
|
fPlaybackPercentage = GET_VEHICLE_RECORDING_PLAYBACK_PERCENTAGE(VehicleIndex #IF IS_DEBUG_BUILD, bPrintDebugOutput #ENDIF)
|
|
|
|
PED_INDEX DriverPedIndex
|
|
|
|
DriverPedIndex = GET_PED_IN_VEHICLE_SEAT(VehicleIndex, VS_DRIVER)
|
|
|
|
IF DOES_ENTITY_EXIST(DriverPedIndex)
|
|
IF IS_PED_INJURED(DriverPedIndex)
|
|
|
|
bDriverDead = TRUE
|
|
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(VehicleIndex)
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN TRUE
|
|
|
|
ELSE
|
|
|
|
IF ( bDriverDead = TRUE )
|
|
|
|
RETURN TRUE
|
|
|
|
ELSE
|
|
|
|
RETURN FALSE
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Checks if one enemy ped should
|
|
/// PARAMS:
|
|
/// esEnemy1 - Enemy ped to replace the other enemy ped when esEnemy2 dies.
|
|
/// esEnemy2 - Enemy ped to check for death.
|
|
/// RETURNS:
|
|
/// TRUE if both enemy peds were created, one esEnemy2 has died, while esEnemy1 is alive.
|
|
FUNC BOOL SHOULD_ENEMY_REPLACE_DEAD_ENEMY(ENEMY_STRUCT esEnemy, ENEMY_STRUCT esDeadEnemy)
|
|
|
|
//only run this if both enemies were created
|
|
//and if the enemy is not already replacing another dead ped
|
|
IF ( esDeadEnemy.bCreated = TRUE )
|
|
AND ( esEnemy.bCreated = TRUE )
|
|
AND ( esEnemy.iProgress = 0 )
|
|
|
|
IF IS_PED_INJURED(esDeadEnemy.PedIndex)
|
|
AND NOT IS_PED_INJURED(esEnemy.PedIndex)
|
|
|
|
RETURN TRUE
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
|
|
ENDFUNC
|
|
|
|
PROC MANAGE_PARKED_ENEMY_VEHICLES(INT &iProgress)
|
|
|
|
SWITCH iProgress
|
|
|
|
CASE 0
|
|
|
|
REQUEST_MODEL(mnEnemy)
|
|
REQUEST_MODEL(mnEnemyVan)
|
|
|
|
iProgress++
|
|
|
|
BREAK
|
|
|
|
CASE 1 //create parked vans
|
|
|
|
REQUEST_MODEL(mnEnemy)
|
|
REQUEST_MODEL(mnEnemyVan)
|
|
|
|
IF HAS_MODEL_LOADED(mnEnemy)
|
|
AND HAS_MODEL_LOADED(mnEnemyVan)
|
|
|
|
vsEnemyVans[2].VehicleIndex = CREATE_ENEMY_VEHICLE(vsEnemyVans[2], 1000, FALSE, TRUE, TRUE, FALSE, VEHICLELOCK_UNLOCKED, -1, -1, FALSE #IF IS_DEBUG_BUILD,"EnemyVan 2" #ENDIF)
|
|
vsEnemyVans[3].VehicleIndex = CREATE_ENEMY_VEHICLE(vsEnemyVans[3], 800, FALSE, TRUE, TRUE, FALSE, VEHICLELOCK_UNLOCKED, -1, -1, FALSE #IF IS_DEBUG_BUILD, "EnemyVan 3" #ENDIF)
|
|
|
|
iProgress++
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
|
|
|
|
ENDSWITCH
|
|
|
|
// UPDATE_VEHICLE_DAMAGE_FROM_PED(vsEnemyVans[2].VehicleIndex, PLAYER_PED_ID(), 250, 475, vsEnemyVans[2].bSmoking,
|
|
// <<10.0, 10.0, 3.0>>, <<0.0, 0.0, 5.0>>, <<0.0, -1.5, 0.0>>, TRUE, 45.0, 70.0)
|
|
CHECK_VEHICLE_FOR_DRIVING_INTO_LOCATE(vsEnemyVans[2], PLAYER_PED_ID(), <<3222.843506,-4688.635742,114.212746>>, << 12.0, 16.0, 3.0 >>)
|
|
|
|
UPDATE_VEHICLE_DAMAGE_FROM_PED(vsEnemyVans[3].VehicleIndex, PLAYER_PED_ID(), 300, 475, vsEnemyVans[3].bSmoking,
|
|
<<10.0, 10.0, 3.0>>, <<0.0, 0.0, 5.0>>, <<0.0, -1.5, 0.0>>, TRUE, 45.0, 70.0)
|
|
CHECK_VEHICLE_FOR_DRIVING_INTO_LOCATE(vsEnemyVans[3], PLAYER_PED_ID(), <<3222.843506,-4688.635742,114.212746>>,<< 12.0, 16.0, 3.0 >>)
|
|
|
|
RUN_VEHICLE_TYRE_BURST_CHECK(vsEnemyVans[2].VehicleIndex, SC_WHEEL_CAR_FRONT_RIGHT, vFrontRightOffset, 0.8, FALSE, TRUE, vFrontRightDamageOffset, 150.0)
|
|
RUN_VEHICLE_TYRE_BURST_CHECK(vsEnemyVans[2].VehicleIndex, SC_WHEEL_CAR_FRONT_LEFT, vFrontLeftOffset, 0.8, FALSE, TRUE, vFrontLeftDamageOffset, 150.0)
|
|
RUN_VEHICLE_TYRE_BURST_CHECK(vsEnemyVans[2].VehicleIndex, SC_WHEEL_CAR_REAR_LEFT, vRearLeftOffset, 0.8, FALSE, TRUE, vRearLeftDamageOffset, 150.0)
|
|
RUN_VEHICLE_TYRE_BURST_CHECK(vsEnemyVans[2].VehicleIndex, SC_WHEEL_CAR_REAR_RIGHT, vRearRightOffset, 0.8, FALSE, TRUE, vRearRightDamageOffset, 150.0)
|
|
|
|
RUN_VEHICLE_TYRE_BURST_CHECK(vsEnemyVans[3].VehicleIndex, SC_WHEEL_CAR_FRONT_RIGHT, vFrontRightOffset, 0.8, FALSE, TRUE, vFrontRightDamageOffset, 150.0)
|
|
RUN_VEHICLE_TYRE_BURST_CHECK(vsEnemyVans[3].VehicleIndex, SC_WHEEL_CAR_FRONT_LEFT, vFrontLeftOffset, 0.8, FALSE, TRUE, vFrontLeftDamageOffset, 150.0)
|
|
RUN_VEHICLE_TYRE_BURST_CHECK(vsEnemyVans[3].VehicleIndex, SC_WHEEL_CAR_REAR_LEFT, vRearLeftOffset, 0.8, FALSE, TRUE, vRearLeftDamageOffset, 150.0)
|
|
RUN_VEHICLE_TYRE_BURST_CHECK(vsEnemyVans[3].VehicleIndex, SC_WHEEL_CAR_REAR_RIGHT, vRearRightOffset, 0.8, FALSE, TRUE, vRearRightDamageOffset, 150.0)
|
|
|
|
ENDPROC
|
|
|
|
PROC MANAGE_MISSION_TRAIN(INT &iProgress)
|
|
|
|
SWITCH iProgress
|
|
|
|
CASE 0
|
|
|
|
IF HAS_MISSION_TRAIN_BEEN_CREATED(tsTrain, 8.0, FALSE)
|
|
|
|
iProgress++
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 1
|
|
|
|
IF DOES_ENTITY_EXIST(tsTrain.VehicleIndex)
|
|
AND DOES_ENTITY_EXIST(tsTrain.PedIndex)
|
|
|
|
IF HAS_SOUND_FINISHED(iTrainBellsSoundID)
|
|
IF REQUEST_SCRIPT_AUDIO_BANK("Prologue_Train_Sounds")
|
|
PLAY_SOUND_FROM_COORD(iTrainBellsSoundID, "Train_Bell", << 3217.51, -4702.84, 115.13 >>, "Prologue_Sounds")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_ENTITY_AT_COORD(tsTrain.VehicleIndex, <<4297.463867,-4725.532715,120.312271>>, << 10.0, 10.0, 10.0 >>)
|
|
|
|
DELETE_PED(tsTrain.PedIndex)
|
|
DELETE_MISSION_TRAIN(tsTrain.VehicleIndex)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Deleted mission train.")
|
|
#ENDIF
|
|
|
|
IF NOT HAS_SOUND_FINISHED(iTrainBellsSoundID)
|
|
STOP_SOUND(iTrainBellsSoundID)
|
|
ENDIF
|
|
|
|
RELEASE_NAMED_SCRIPT_AUDIO_BANK("Prologue_Train_Sounds")
|
|
|
|
iProgress++
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
ENDPROC
|
|
|
|
PROC MANAGE_FIRST_ENEMY_WAVE(BOOL &bCurrentEnemyWaveSpawned, BOOL bPreviousEnemyWaveSpawned)
|
|
|
|
//create enemy wave when locate is reached
|
|
IF ( bCurrentEnemyWaveSpawned = FALSE )
|
|
|
|
IF ( bPreviousEnemyWaveSpawned = TRUE )
|
|
|
|
IF HAS_MODEL_LOADED(mnEnemy)
|
|
|
|
//create first wall enemies
|
|
IF NOT DOES_ENTITY_EXIST(esWallEnemies[0].PedIndex)
|
|
esWallEnemies[0].PedIndex = CREATE_ENEMY_PED(mnEnemy, << 3265.4900, -4590.8828, 115.9832 >>, 94.4126, rgEnemies, WEAPONTYPE_PISTOL)
|
|
ENDIF
|
|
esWallEnemies[1].PedIndex = CREATE_ENEMY_PED(mnEnemy, << 3262.19, -4593.96, 115.82 >>, 0.0, rgEnemies, WEAPONTYPE_ASSAULTRIFLE, WEAPONCOMPONENT_AT_AR_FLSH)
|
|
INITIALISE_ENEMY_GROUP(esWallEnemies, FALSE #IF IS_DEBUG_BUILD, "Wall " #ENDIF)
|
|
|
|
SET_PED_COMBAT_PROPERTIES(esWallEnemies[0].PedIndex, CM_DEFENSIVE, CAL_POOR, CR_FAR, CA_USE_COVER)
|
|
SET_PED_DEFENSIVE_AREA_ANGLED(esWallEnemies[0].PedIndex, <<3264.836914,-4590.833496,115.385437>>, <<3265.977295,-4590.834961,118.236443>>, 1.0)
|
|
SET_PED_PREFERRED_COVERPOINT(esWallEnemies[0].PedIndex, esWallEnemies[0].ItemsetIndex, csCoverpoints[1].CoverpointIndex)
|
|
SET_PED_COVER_PROPERTIES(esWallEnemies[0].PedIndex, TRUE, TRUE, FALSE, FALSE, 5.0, FALSE, 0.0, -1.0)
|
|
SET_PED_SHOOTING_PROPERTIES(esWallEnemies[0].PedIndex, 3)
|
|
|
|
SET_PED_COMBAT_ATTRIBUTES(esWallEnemies[0].PedIndex, CA_CAN_CHARGE, TRUE)
|
|
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(esWallEnemies[0].PedIndex, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esWallEnemies[0].PedIndex, 100.0)
|
|
esWallEnemies[0].iTimer = GET_GAME_TIMER()
|
|
|
|
|
|
COMBAT_SEQUENCE_GO_TO_COORD_WHILE_AIMING_THEN_COMBAT(esWallEnemies[1].PedIndex, << 3264.27, -4585.25, 117.07 >>, PEDMOVE_RUN, FALSE, << 3256.55, -4575.72, 118.63 >>,
|
|
PLAYER_PED_ID(), FALSE, FALSE, FALSE, 1750, FIRING_TYPE_CONTINUOUS)
|
|
SET_PED_COMBAT_PROPERTIES(esWallEnemies[1].PedIndex, CM_WILLADVANCE, CAL_POOR, CR_NEAR, CA_AGGRESSIVE)
|
|
SET_PED_COMBAT_ATTRIBUTES(esWallEnemies[1].PedIndex, CA_CAN_CHARGE, TRUE)
|
|
SET_PED_SHOOTING_PROPERTIES(esWallEnemies[1].PedIndex, 3, 100, FIRING_PATTERN_BURST_FIRE)
|
|
esWallEnemies[1].iTimer = GET_GAME_TIMER()
|
|
bCurrentEnemyWaveSpawned = TRUE
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ELSE //wave is spawned, keep updating enemy behaviours
|
|
|
|
//update the first goon, who was in the cutscene
|
|
IF NOT IS_PED_INJURED(esWallEnemies[0].PedIndex)
|
|
SWITCH esWallEnemies[0].iProgress
|
|
|
|
CASE 0
|
|
|
|
IF HAS_TIME_PASSED(10000, esWallEnemies[0].iTimer)
|
|
OR IS_PED_INJURED(esWallEnemies[1].PedIndex)
|
|
|
|
esWallEnemies[0].bHasTask = FALSE
|
|
esWallEnemies[0].iProgress++
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 1 //make the enemy peek more from cover
|
|
|
|
IF ( esWallEnemies[0].bHasTask = FALSE )
|
|
SET_PED_COMBAT_ATTRIBUTES(esWallEnemies[0].PedIndex, CA_CAN_CHARGE, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(esWallEnemies[0].PedIndex, CA_CAN_USE_FRUSTRATED_ADVANCE, TRUE)
|
|
SET_PED_COVER_PROPERTIES(esWallEnemies[0].PedIndex, TRUE, TRUE, FALSE, FALSE, 10.0, FALSE, 0.0, 1.0, 5.0)
|
|
esWallEnemies[0].iTimer = GET_GAME_TIMER()
|
|
esWallEnemies[0].bHasTask = TRUE
|
|
ENDIF
|
|
|
|
IF HAS_TIME_PASSED(18000, esWallEnemies[0].iTimer)
|
|
esWallEnemies[0].bHasTask = FALSE
|
|
esWallEnemies[0].iProgress++
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 2
|
|
|
|
IF ( esWallEnemies[0].bHasTask = FALSE )
|
|
REMOVE_PED_DEFENSIVE_AREA(esWallEnemies[0].PedIndex)
|
|
SET_PED_COMBAT_PROPERTIES(esWallEnemies[0].PedIndex, CM_WILLADVANCE, CAL_POOR, CR_NEAR, CA_AGGRESSIVE)
|
|
SET_PED_COMBAT_ATTRIBUTES(esWallEnemies[0].PedIndex, CA_CAN_CHARGE, TRUE)
|
|
SET_PED_COVER_PROPERTIES(esWallEnemies[0].PedIndex, TRUE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esWallEnemies[0].PedIndex, 100.0)
|
|
esWallEnemies[0].iTimer = GET_GAME_TIMER()
|
|
esWallEnemies[0].bHasTask = TRUE
|
|
ENDIF
|
|
|
|
IF HAS_TIME_PASSED(10000, esWallEnemies[0].iTimer)
|
|
esWallEnemies[0].bHasTask = FALSE
|
|
esWallEnemies[0].iProgress++
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 3 //make the enemy more aggressive
|
|
|
|
IF ( esWallEnemies[0].bHasTask = FALSE )
|
|
REMOVE_PED_DEFENSIVE_AREA(esWallEnemies[0].PedIndex)
|
|
SET_PED_COMBAT_ATTRIBUTES(esWallEnemies[0].PedIndex, CA_CAN_FLANK, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(esWallEnemies[0].PedIndex, CA_CAN_CHARGE, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(esWallEnemies[0].PedIndex, CA_AGGRESSIVE, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(esWallEnemies[0].PedIndex, CA_CAN_USE_FRUSTRATED_ADVANCE, TRUE)
|
|
SET_PED_COMBAT_RANGE(esWallEnemies[0].PedIndex, CR_NEAR)
|
|
SET_PED_COMBAT_MOVEMENT(esWallEnemies[0].PedIndex, CM_WILLADVANCE)
|
|
SET_PED_SHOOTING_PROPERTIES(esWallEnemies[0].PedIndex, 3, 125, FIRING_PATTERN_BURST_FIRE)
|
|
esWallEnemies[0].bHasTask = TRUE
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
ENDIF
|
|
|
|
//update the second goon, the one who charges at the player initially
|
|
IF NOT IS_PED_INJURED(esWallEnemies[1].PedIndex)
|
|
SWITCH esWallEnemies[1].iProgress
|
|
|
|
CASE 0
|
|
|
|
IF HAS_TIME_PASSED(6000, esWallEnemies[1].iTimer)
|
|
OR IS_PED_IN_COMBAT(esWallEnemies[1].PedIndex)
|
|
|
|
esWallEnemies[1].bHasTask = FALSE
|
|
esWallEnemies[1].iProgress++
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 1 //make the enemy move to the left
|
|
|
|
IF ( esWallEnemies[1].bHasTask = FALSE )
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esWallEnemies[1].PedIndex, 100.0)
|
|
SET_PED_COMBAT_ATTRIBUTES(esWallEnemies[1].PedIndex, CA_CAN_CHARGE, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(esWallEnemies[1].PedIndex, CA_CAN_USE_FRUSTRATED_ADVANCE, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(esWallEnemies[1].PedIndex, CA_OPEN_COMBAT_WHEN_DEFENSIVE_AREA_IS_REACHED, TRUE)
|
|
SET_PED_COMBAT_PROPERTIES(esWallEnemies[1].PedIndex, CM_WILLADVANCE, CAL_AVERAGE, CR_NEAR, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH)
|
|
SET_PED_COMBAT_MOVEMENT_VALUES(esWallEnemies[1].PedIndex, 1.0, 1.0)
|
|
SET_PED_DEFENSIVE_AREA_SPHERE(esWallEnemies[1].PedIndex, << 3267.71, -4577.71, 117.21 >>, 1.25)
|
|
SET_PED_COVER_PROPERTIES(esWallEnemies[1].PedIndex, TRUE, FALSE, FALSE, FALSE, 6.0, FALSE, 0.0, 2.0)
|
|
SET_PED_SHOOTING_PROPERTIES(esWallEnemies[1].PedIndex, 3, 125, FIRING_PATTERN_BURST_FIRE)
|
|
esWallEnemies[1].iTimer = GET_GAME_TIMER()
|
|
esWallEnemies[1].bHasTask = TRUE
|
|
ENDIF
|
|
|
|
IF HAS_TIME_PASSED(15000, esWallEnemies[1].iTimer)
|
|
|
|
esWallEnemies[1].bHasTask = FALSE
|
|
esWallEnemies[1].iProgress++
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 2 //make the enemy more aggressive
|
|
|
|
IF ( esWallEnemies[1].bHasTask = FALSE )
|
|
REMOVE_PED_DEFENSIVE_AREA(esWallEnemies[1].PedIndex)
|
|
SET_PED_COMBAT_ATTRIBUTES(esWallEnemies[1].PedIndex, CA_CAN_FLANK, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(esWallEnemies[1].PedIndex, CA_CAN_CHARGE, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(esWallEnemies[1].PedIndex, CA_AGGRESSIVE, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(esWallEnemies[1].PedIndex, CA_CAN_USE_FRUSTRATED_ADVANCE, TRUE)
|
|
SET_PED_COMBAT_RANGE(esWallEnemies[1].PedIndex, CR_NEAR)
|
|
SET_PED_COMBAT_MOVEMENT(esWallEnemies[1].PedIndex, CM_WILLADVANCE)
|
|
SET_PED_SHOOTING_PROPERTIES(esWallEnemies[1].PedIndex, 3, 150, FIRING_PATTERN_BURST_FIRE)
|
|
esWallEnemies[1].bHasTask = TRUE
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
ENDIF
|
|
|
|
CLEANUP_ENEMY_GROUP(esWallEnemies)
|
|
|
|
IF ( GET_NUMBER_OF_ENEMIES_DEAD(esWallEnemies) = 2 )
|
|
IF ( iFirstVanTriggerTimer = 0 )
|
|
iFirstVanTriggerTimer = GET_GAME_TIMER()
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Staring van trigger timer.")
|
|
#ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
UPDATE_AI_PED_BLIPS_FOR_ENEMY_GROUP(esWallEnemies)
|
|
|
|
ENDPROC
|
|
|
|
PROC MANAGE_SECOND_ENEMY_WAVE(BOOL &bCurrentEnemyWaveSpawned, BOOL bPreviousEnemyWaveSpawned, INT iAliveEnemiesCountToTriggerWave)
|
|
|
|
//create enemy wave when locate is reached
|
|
IF ( bCurrentEnemyWaveSpawned = FALSE )
|
|
|
|
IF ( bPreviousEnemyWaveSpawned = TRUE )
|
|
|
|
IF IS_ENTITY_IN_LOCATE(PLAYER_PED_ID(), << 3267.560303, -4588.922363, 118.005730 >>, << 30.0, 3.5, 2.0 >> #IF IS_DEBUG_BUILD, "SecondWaveTriggerLocate" #ENDIF)
|
|
OR ( iFirstVanTriggerTimer != 0 AND HAS_TIME_PASSED(26000, iFirstVanTriggerTimer) )
|
|
OR ( GET_NUMBER_OF_ENEMIES_ALIVE(esWallEnemies) <= iAliveEnemiesCountToTriggerWave )
|
|
|
|
//create middle enemies
|
|
esMiddleEnemies[0].PedIndex = CREATE_ENEMY_PED(mnEnemy, << 3270.1250, -4642.8452, 113.1802 >>, 5.9782, rgEnemies, WEAPONTYPE_ASSAULTRIFLE, WEAPONCOMPONENT_INVALID, TRUE)
|
|
esMiddleEnemies[1].PedIndex = CREATE_ENEMY_PED(mnEnemy, << 3275.9019, -4645.0601, 113.2832 >>, 359.8844, rgEnemies, WEAPONTYPE_ASSAULTRIFLE, WEAPONCOMPONENT_AT_AR_FLSH, TRUE)
|
|
esMiddleEnemies[2].PedIndex = CREATE_ENEMY_PED(mnEnemy, << 3268.3623, -4654.7510, 113.0602 >>, 359.9476, rgEnemies, WEAPONTYPE_ASSAULTRIFLE, WEAPONCOMPONENT_INVALID, TRUE)
|
|
INITIALISE_ENEMY_GROUP(esMiddleEnemies, FALSE #IF IS_DEBUG_BUILD, "Middle " #ENDIF)
|
|
|
|
SET_PED_SEEING_RANGE(esMiddleEnemies[0].PedIndex, 20.0)
|
|
SET_PED_SEEING_RANGE(esMiddleEnemies[1].PedIndex, 15.0)
|
|
SET_PED_SEEING_RANGE(esMiddleEnemies[2].PedIndex, 20.0)
|
|
|
|
GO_TO_ENEMY_STATE(esMiddleEnemies[0], ENEMY_STATE_SCRIPTED_ENTRY)
|
|
GO_TO_ENEMY_STATE(esMiddleEnemies[1], ENEMY_STATE_SCRIPTED_ENTRY)
|
|
GO_TO_ENEMY_STATE(esMiddleEnemies[2], ENEMY_STATE_SCRIPTED_ENTRY)
|
|
|
|
bCurrentEnemyWaveSpawned = TRUE
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ELSE //wave is spawned, keep updating enemy behaviours
|
|
|
|
//block enemy weapon fire until the 'player detected' conversation plays out
|
|
IF ( bPlayerDetected = FALSE )
|
|
BLOCK_WEAPON_FIRE_FOR_ENEMY_GROUP(esMiddleEnemies)
|
|
ELIF ( bPlayerDetected = TRUE )
|
|
IF ( bDetectedConversationPlaying = TRUE )
|
|
BLOCK_WEAPON_FIRE_FOR_ENEMY_GROUP(esMiddleEnemies)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(esMiddleEnemies[0].PedIndex)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
DRAW_DEBUG_TEXT_ABOVE_ENTITY(esMiddleEnemies[0].PedIndex, GET_ENEMY_STATE_NAME_FOR_DEBUG(esMiddleEnemies[0].eState), 1.25)
|
|
#ENDIF
|
|
|
|
SWITCH esMiddleEnemies[0].eState
|
|
|
|
CASE ENEMY_STATE_SCRIPTED_ENTRY
|
|
|
|
SWITCH esMiddleEnemies[0].iProgress
|
|
|
|
CASE 0
|
|
|
|
esMiddleEnemies[0].iTimer = GET_GAME_TIMER()
|
|
esMiddleEnemies[0].iProgress++
|
|
BREAK
|
|
|
|
CASE 1
|
|
|
|
IF ( esMiddleEnemies[0].bHasTask = FALSE )
|
|
IF HAS_TIME_PASSED(5000, esMiddleEnemies[0].iTimer)
|
|
|
|
COMBAT_SEQUENCE_GO_TO_COVER_WHILE_AIMING_THEN_COMBAT(esMiddleEnemies[0].PedIndex, << 3276.90, -4617.48, 115.02 >>, PEDMOVE_SLOWRUN, FALSE, << 3273.65, -4590.99, 117.19 >>, NULL, FALSE, -1)
|
|
SET_PED_COMBAT_PROPERTIES(esMiddleEnemies[0].PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_FAR, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH)
|
|
SET_PED_COMBAT_ATTRIBUTES(esMiddleEnemies[0].PedIndex, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
|
|
SET_PED_DEFENSIVE_AREA_SPHERE(esMiddleEnemies[0].PedIndex, << 3276.90, -4617.48, 115.02 >>, 2.75)
|
|
SET_PED_COVER_PROPERTIES(esMiddleEnemies[0].PedIndex, TRUE, TRUE, FALSE, FALSE, 6.0, FALSE, 0.0, 3.0)
|
|
SET_PED_SHOOTING_PROPERTIES(esMiddleEnemies[0].PedIndex, 4)
|
|
|
|
esMiddleEnemies[0].bHasTask = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF ( esMiddleEnemies[0].bFallingBack = FALSE )
|
|
IF ( bPlayerUsedAlternativePath = TRUE )
|
|
esMiddleEnemies[0].bHasTask = FALSE
|
|
esMiddleEnemies[0].iProgress = 100
|
|
esMiddleEnemies[0].bFallingBack = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 100
|
|
|
|
IF ( esMiddleEnemies[0].bHasTask = FALSE )
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esMiddleEnemies[0].PedIndex, 100.0)
|
|
SET_PED_COMBAT_PROPERTIES(esMiddleEnemies[0].PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH)
|
|
SET_PED_DEFENSIVE_AREA_ANGLED(esMiddleEnemies[0].PedIndex, <<3266.473145,-4689.624023,111.113983>>, <<3226.107422,-4686.157715,118.637154>>, 22.0)
|
|
SET_PED_COMBAT_MOVEMENT_VALUES(esMiddleEnemies[0].PedIndex, 0.8, 0.25)
|
|
SET_PED_COVER_PROPERTIES(esMiddleEnemies[0].PedIndex, TRUE, FALSE, FALSE, FALSE, 6.0, TRUE, 0.1, 2.0)
|
|
|
|
esMiddleEnemies[0].bHasTask = TRUE
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
IF IS_PED_IN_COMBAT(esMiddleEnemies[0].PedIndex)
|
|
OR ( bPlayerDetected = TRUE )
|
|
GO_TO_ENEMY_STATE(esMiddleEnemies[0], ENEMY_STATE_COMBAT)
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE ENEMY_STATE_COMBAT
|
|
|
|
IF ( esMiddleEnemies[0].bHasTask = FALSE )
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esMiddleEnemies[0].PedIndex, 100.0)
|
|
SET_PED_COMBAT_PROPERTIES(esMiddleEnemies[0].PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_FAR, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH)
|
|
SET_PED_COMBAT_ATTRIBUTES(esMiddleEnemies[0].PedIndex, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(esMiddleEnemies[0].PedIndex, CA_CAN_USE_FRUSTRATED_ADVANCE, TRUE)
|
|
SET_PED_DEFENSIVE_AREA_SPHERE(esMiddleEnemies[0].PedIndex, << 3276.90, -4617.48, 115.02 >>, 2.75)
|
|
SET_PED_COVER_PROPERTIES(esMiddleEnemies[0].PedIndex, TRUE, TRUE, FALSE, FALSE, 6.0, FALSE, 0.0, 3.0)
|
|
SET_PED_SHOOTING_PROPERTIES(esMiddleEnemies[0].PedIndex, 4)
|
|
SET_PED_VISUAL_FIELD_PROPERTIES(esMiddleEnemies[0].PedIndex)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(esMiddleEnemies[0].PedIndex, FALSE)
|
|
bPlayerDetected = TRUE
|
|
esMiddleEnemies[0].bHasTask = TRUE
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(esMiddleEnemies[1].PedIndex)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
DRAW_DEBUG_TEXT_ABOVE_ENTITY(esMiddleEnemies[1].PedIndex, GET_ENEMY_STATE_NAME_FOR_DEBUG(esMiddleEnemies[1].eState), 1.25)
|
|
#ENDIF
|
|
|
|
SWITCH esMiddleEnemies[1].eState
|
|
|
|
CASE ENEMY_STATE_SCRIPTED_ENTRY
|
|
|
|
SWITCH esMiddleEnemies[1].iProgress
|
|
|
|
CASE 0
|
|
esMiddleEnemies[1].iTimer = GET_GAME_TIMER()
|
|
esMiddleEnemies[1].iProgress++
|
|
BREAK
|
|
|
|
CASE 1
|
|
|
|
IF ( esMiddleEnemies[1].bHasTask = FALSE )
|
|
|
|
IF HAS_TIME_PASSED(5000, esMiddleEnemies[1].iTimer)
|
|
COMBAT_SEQUENCE_GO_TO_COVER_WHILE_AIMING_THEN_COMBAT(esMiddleEnemies[1].PedIndex, << 3269.19, -4627.51, 114.85 >>, PEDMOVE_SLOWRUN, FALSE, << 3273.65, -4590.99, 117.19 >>, NULL, FALSE, -1)
|
|
SET_PED_COMBAT_PROPERTIES(esMiddleEnemies[1].PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_FAR, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH)
|
|
SET_PED_COMBAT_ATTRIBUTES(esMiddleEnemies[1].PedIndex, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
|
|
SET_PED_DEFENSIVE_AREA_SPHERE(esMiddleEnemies[1].PedIndex,<< 3269.19, -4627.51, 114.85 >>, 3.0)
|
|
SET_PED_COVER_PROPERTIES(esMiddleEnemies[1].PedIndex, TRUE, FALSE, TRUE, FALSE, 7.0, FALSE, 0.0, 3.0)
|
|
SET_PED_SHOOTING_PROPERTIES(esMiddleEnemies[1].PedIndex, 4)
|
|
esMiddleEnemies[1].bHasTask = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
|
|
IF ( bStartSearching = TRUE )
|
|
GO_TO_ENEMY_STATE(esMiddleEnemies[1], ENEMY_STATE_FOLLOW_WAYPOINT_RECORDING)
|
|
ENDIF
|
|
|
|
IF ( esMiddleEnemies[1].bFallingBack = FALSE )
|
|
IF ( bPlayerUsedAlternativePath = TRUE )
|
|
esMiddleEnemies[1].bHasTask = FALSE
|
|
esMiddleEnemies[1].iProgress = 100
|
|
esMiddleEnemies[1].bFallingBack = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 100
|
|
|
|
IF ( esMiddleEnemies[1].bHasTask = FALSE )
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esMiddleEnemies[1].PedIndex, 100.0)
|
|
SET_PED_COMBAT_PROPERTIES(esMiddleEnemies[1].PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_NEAR, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH)
|
|
SET_PED_DEFENSIVE_AREA_ANGLED(esMiddleEnemies[1].PedIndex, <<3266.473145,-4689.624023,111.113983>>, <<3226.107422,-4686.157715,118.637154>>, 22.0)
|
|
SET_PED_COMBAT_MOVEMENT_VALUES(esMiddleEnemies[1].PedIndex, 0.9, 0.1)
|
|
SET_PED_COVER_PROPERTIES(esMiddleEnemies[1].PedIndex, TRUE, FALSE, FALSE, FALSE, 6.0, TRUE, 0.1, 2.0)
|
|
esMiddleEnemies[1].bHasTask = TRUE
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
IF IS_PED_IN_COMBAT(esMiddleEnemies[1].PedIndex)
|
|
OR ( bPlayerDetected = TRUE )
|
|
GO_TO_ENEMY_STATE(esMiddleEnemies[1], ENEMY_STATE_COMBAT)
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE ENEMY_STATE_FOLLOW_WAYPOINT_RECORDING
|
|
|
|
SET_PED_RESET_FLAG(esMiddleEnemies[1].PedIndex, PRF_UseHeadOrientationForPerception, TRUE)
|
|
|
|
IF ( esMiddleEnemies[1].bHasTask = FALSE )
|
|
|
|
REQUEST_WAYPOINT_RECORDING("mic1_c")
|
|
REQUEST_ANIM_DICT("missmic1ig_3_patrol")
|
|
|
|
|
|
IF GET_IS_WAYPOINT_RECORDING_LOADED("mic1_c")
|
|
AND HAS_ANIM_DICT_LOADED("missmic1ig_3_patrol")
|
|
|
|
INT iClostestWaypoint
|
|
|
|
IF WAYPOINT_RECORDING_GET_CLOSEST_WAYPOINT("mic1_c", GET_ENTITY_COORDS(esMiddleEnemies[1].PedIndex), iClostestWaypoint)
|
|
AND ( iClostestWaypoint > 30 ) //this makes enemy walk in a loop forever starting from waypoint 33 in the route
|
|
TASK_FOLLOW_WAYPOINT_RECORDING(esMiddleEnemies[1].PedIndex, "mic1_c", 32, EWAYPOINT_TURN_TO_FACE_WAYPOINT_HEADING_AT_END)
|
|
ELSE //this makes enemy walk to the start waypoint in the route
|
|
TASK_FOLLOW_WAYPOINT_RECORDING(esMiddleEnemies[1].PedIndex, "mic1_c", 0, EWAYPOINT_START_FROM_CLOSEST_POINT | EWAYPOINT_TURN_TO_FACE_WAYPOINT_HEADING_AT_END)
|
|
ENDIF
|
|
|
|
esMiddleEnemies[1].iWaypointProgress = 0
|
|
esMiddleEnemies[1].bSearching = TRUE
|
|
esMiddleEnemies[1].bHasTask = TRUE
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF IS_WAYPOINT_PLAYBACK_GOING_ON_FOR_PED(esMiddleEnemies[1].PedIndex)
|
|
AND NOT IS_ENTITY_PLAYING_ANIM(esMiddleEnemies[1].PedIndex, "missmic1ig_3_patrol", "search_walk_fwd_b")
|
|
|
|
IF ( esMiddleEnemies[1].iWaypointProgress != 0 )
|
|
|
|
IF ( esMiddleEnemies[1].iWaypointProgress != GET_PED_WAYPOINT_PROGRESS(esMiddleEnemies[1].PedIndex) )
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Progress: ", GET_PED_WAYPOINT_PROGRESS(esMiddleEnemies[1].PedIndex))
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": enemy.iWaypointProgress: ", esMiddleEnemies[1].iWaypointProgress)
|
|
#ENDIF
|
|
|
|
INT iTotalPoints
|
|
VECTOR vNodeVector
|
|
|
|
IF WAYPOINT_RECORDING_GET_NUM_POINTS("mic1_c", iTotalPoints)
|
|
|
|
IF ( esMiddleEnemies[1].iWaypointProgress < iTotalPoints )
|
|
|
|
IF WAYPOINT_RECORDING_GET_COORD("mic1_c", esMiddleEnemies[1].iWaypointProgress + 3, vNodeVector)
|
|
|
|
TASK_PLAY_ANIM(esMiddleEnemies[1].PedIndex, "missmic1ig_3_patrol", "search_walk_fwd_b",
|
|
WALK_BLEND_IN, WALK_BLEND_OUT, -1, AF_SECONDARY | AF_LOOPING |
|
|
AF_TAG_SYNC_IN | AF_TAG_SYNC_OUT | AF_TAG_SYNC_CONTINUOUS | AF_UPPERBODY)
|
|
|
|
esMiddleEnemies[1].iWaypointProgress = GET_PED_WAYPOINT_PROGRESS(esMiddleEnemies[1].PedIndex)
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
esMiddleEnemies[1].iWaypointProgress = GET_PED_WAYPOINT_PROGRESS(esMiddleEnemies[1].PedIndex)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Progress: ", GET_PED_WAYPOINT_PROGRESS(esMiddleEnemies[1].PedIndex))
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": enemy.iWaypointProgress: ", esMiddleEnemies[1].iWaypointProgress)
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
IF GET_SCRIPT_TASK_STATUS(esMiddleEnemies[1].PedIndex, SCRIPT_TASK_FOLLOW_WAYPOINT_ROUTE) = FINISHED_TASK
|
|
GO_TO_ENEMY_STATE(esMiddleEnemies[1], ENEMY_STATE_FOLLOW_WAYPOINT_RECORDING)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF IS_PED_IN_COMBAT(esMiddleEnemies[1].PedIndex)
|
|
OR ( bPlayerDetected = TRUE )
|
|
CLEAR_PED_SECONDARY_TASK(esMiddleEnemies[1].PedIndex)
|
|
GO_TO_ENEMY_STATE(esMiddleEnemies[1], ENEMY_STATE_COMBAT)
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE ENEMY_STATE_COMBAT
|
|
|
|
IF ( esMiddleEnemies[1].bHasTask = FALSE )
|
|
CLEAR_PED_SECONDARY_TASK(esMiddleEnemies[1].PedIndex)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esMiddleEnemies[1].PedIndex, 100.0)
|
|
SET_PED_COMBAT_PROPERTIES(esMiddleEnemies[1].PedIndex, CM_WILLADVANCE, CAL_AVERAGE, CR_NEAR, CA_USE_COVER)
|
|
SET_PED_COMBAT_ATTRIBUTES(esMiddleEnemies[1].PedIndex, CA_CAN_CHARGE, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(esMiddleEnemies[1].PedIndex, CA_CAN_USE_FRUSTRATED_ADVANCE, TRUE)
|
|
REMOVE_PED_DEFENSIVE_AREA(esMiddleEnemies[1].PedIndex)
|
|
SET_PED_SHOOTING_PROPERTIES(esMiddleEnemies[1].PedIndex, 4, 100, FIRING_PATTERN_BURST_FIRE)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(esMiddleEnemies[1].PedIndex, FALSE)
|
|
SET_PED_VISUAL_FIELD_PROPERTIES(esMiddleEnemies[1].PedIndex)
|
|
bPlayerDetected = TRUE
|
|
esMiddleEnemies[1].bSearching = FALSE
|
|
esMiddleEnemies[1].bHasTask = TRUE
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(esMiddleEnemies[2].PedIndex)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
DRAW_DEBUG_TEXT_ABOVE_ENTITY(esMiddleEnemies[2].PedIndex, GET_ENEMY_STATE_NAME_FOR_DEBUG(esMiddleEnemies[2].eState), 1.25)
|
|
#ENDIF
|
|
|
|
SWITCH esMiddleEnemies[2].eState
|
|
|
|
CASE ENEMY_STATE_SCRIPTED_ENTRY
|
|
|
|
SWITCH esMiddleEnemies[2].iProgress
|
|
|
|
CASE 0
|
|
esMiddleEnemies[2].iTimer = GET_GAME_TIMER()
|
|
esMiddleEnemies[2].iProgress++
|
|
BREAK
|
|
|
|
CASE 1
|
|
|
|
IF ( esMiddleEnemies[2].bHasTask = FALSE )
|
|
IF HAS_TIME_PASSED(5000, esMiddleEnemies[2].iTimer)
|
|
COMBAT_SEQUENCE_GO_TO_COVER_WHILE_AIMING_THEN_COMBAT(esMiddleEnemies[2].PedIndex, << 3279.21, -4628.83, 114.92 >>, PEDMOVE_SLOWRUN, FALSE, << 3273.65, -4590.99, 117.19 >>, NULL, FALSE, -1)
|
|
SET_PED_COMBAT_PROPERTIES(esMiddleEnemies[2].PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_FAR, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH)
|
|
SET_PED_COMBAT_ATTRIBUTES(esMiddleEnemies[2].PedIndex, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
|
|
SET_PED_DEFENSIVE_AREA_SPHERE(esMiddleEnemies[2].PedIndex, << 3279.21, -4628.83, 114.92 >>, 3.0)
|
|
SET_PED_COVER_PROPERTIES(esMiddleEnemies[2].PedIndex, TRUE, FALSE, TRUE, FALSE, 5.0, FALSE, 0.0, 2.5)
|
|
SET_PED_SHOOTING_PROPERTIES(esMiddleEnemies[2].PedIndex, 4)
|
|
esMiddleEnemies[2].bHasTask = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF ( esMiddleEnemies[2].bFallingBack = FALSE )
|
|
IF ( bPlayerUsedAlternativePath = TRUE )
|
|
esMiddleEnemies[2].bHasTask = FALSE
|
|
esMiddleEnemies[2].iProgress = 100
|
|
esMiddleEnemies[2].bFallingBack = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 100
|
|
|
|
IF ( esMiddleEnemies[2].bHasTask = FALSE )
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esMiddleEnemies[2].PedIndex, 100.0)
|
|
SET_PED_COMBAT_PROPERTIES(esMiddleEnemies[2].PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_NEAR, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH)
|
|
SET_PED_DEFENSIVE_AREA_ANGLED(esMiddleEnemies[2].PedIndex, <<3266.473145,-4689.624023,111.113983>>, <<3226.107422,-4686.157715,118.637154>>, 22.0)
|
|
SET_PED_COMBAT_MOVEMENT_VALUES(esMiddleEnemies[2].PedIndex, 0.9, 0.1)
|
|
SET_PED_COVER_PROPERTIES(esMiddleEnemies[2].PedIndex, TRUE, FALSE, FALSE, FALSE, 6.0, TRUE, 0.1, 2.0)
|
|
esMiddleEnemies[2].bHasTask = TRUE
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
IF IS_PED_IN_COMBAT(esMiddleEnemies[2].PedIndex)
|
|
OR ( bPlayerDetected = TRUE )
|
|
GO_TO_ENEMY_STATE(esMiddleEnemies[2], ENEMY_STATE_COMBAT)
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE ENEMY_STATE_COMBAT
|
|
|
|
IF ( esMiddleEnemies[2].bHasTask = FALSE )
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esMiddleEnemies[2].PedIndex, 100.0)
|
|
SET_PED_COMBAT_PROPERTIES(esMiddleEnemies[2].PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_FAR, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH)
|
|
SET_PED_COMBAT_ATTRIBUTES(esMiddleEnemies[2].PedIndex, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(esMiddleEnemies[2].PedIndex, CA_CAN_USE_FRUSTRATED_ADVANCE, TRUE)
|
|
SET_PED_DEFENSIVE_AREA_SPHERE(esMiddleEnemies[2].PedIndex, << 3279.21, -4628.83, 114.92 >>, 3.0)
|
|
SET_PED_COVER_PROPERTIES(esMiddleEnemies[2].PedIndex, TRUE, FALSE, TRUE, FALSE, 5.0, FALSE, 0.0, 2.5)
|
|
SET_PED_SHOOTING_PROPERTIES(esMiddleEnemies[2].PedIndex, 4)
|
|
SET_PED_VISUAL_FIELD_PROPERTIES(esMiddleEnemies[2].PedIndex)
|
|
esMiddleEnemies[2].bHasTask = TRUE
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
ENDIF
|
|
|
|
CLEANUP_ENEMY_GROUP(esMiddleEnemies)
|
|
|
|
ENDIF
|
|
|
|
UPDATE_AI_PED_BLIPS_FOR_ENEMY_GROUP(esMiddleEnemies)
|
|
|
|
ENDPROC
|
|
|
|
PROC MANAGE_THIRD_ENEMY_WAVE(BOOL &bCurrentEnemyWaveSpawned, BOOL bPreviousEnemyWaveSpawned)
|
|
|
|
//create enemy wave when locate is reached
|
|
IF ( bCurrentEnemyWaveSpawned = FALSE )
|
|
|
|
IF ( bPreviousEnemyWaveSpawned = TRUE )
|
|
|
|
IF IS_ENTITY_IN_LOCATE(PLAYER_PED_ID(), << 3264.409424, -4611.560547, 117.022507 >>, << 30.0, 3.0, 2.0 >> #IF IS_DEBUG_BUILD, "ThirdWaveLocate" #ENDIF)
|
|
//OR ( GET_NUMBER_OF_ENEMIES_DEAD(esMiddleEnemies) + GET_NUMBER_OF_ENEMIES_DEAD(esVanEnemies) >= 6 )
|
|
|
|
esRunners[0].PedIndex = CREATE_ENEMY_PED(mnEnemy, << 3266.25, -4642.72, 113.23 >>, 324.2408, rgEnemies, WEAPONTYPE_ASSAULTRIFLE)
|
|
esRunners[1].PedIndex = CREATE_ENEMY_PED(mnEnemy, << 3274.37, -4640.03, 113.66 >>, 0.0, rgEnemies, WEAPONTYPE_PISTOL)
|
|
INITIALISE_ENEMY_GROUP(esRunners, FALSE #IF IS_DEBUG_BUILD, "Runners " #ENDIF)
|
|
|
|
COMBAT_SEQUENCE_GO_TO_COORD_WHILE_AIMING_THEN_COMBAT(esRunners[0].PedIndex, << 3271.2998, -4631.0703, 114.7037 >>, PEDMOVE_RUN, FALSE, vZero, PLAYER_PED_ID(), TRUE)
|
|
SET_PED_COMBAT_PROPERTIES(esRunners[0].PedIndex, CM_WILLADVANCE, CAL_POOR, CR_NEAR, CA_AGGRESSIVE)
|
|
SET_PED_COMBAT_ATTRIBUTES(esRunners[0].PedIndex, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(esRunners[0].PedIndex, CA_CAN_USE_FRUSTRATED_ADVANCE, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(esRunners[0].PedIndex, CA_CAN_CHARGE, TRUE)
|
|
SET_PED_SHOOTING_PROPERTIES(esRunners[0].PedIndex, 4, 50, FIRING_PATTERN_FULL_AUTO)
|
|
|
|
COMBAT_SEQUENCE_GO_TO_COORD_WHILE_AIMING_THEN_COMBAT(esRunners[1].PedIndex, << 3273.3306, -4623.3579, 114.7698 >>, PEDMOVE_RUN, FALSE, vZero, PLAYER_PED_ID(), TRUE)
|
|
SET_PED_COMBAT_PROPERTIES(esRunners[1].PedIndex, CM_WILLADVANCE, CAL_POOR, CR_NEAR, CA_AGGRESSIVE)
|
|
SET_PED_COMBAT_ATTRIBUTES(esRunners[1].PedIndex, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(esRunners[1].PedIndex, CA_CAN_USE_FRUSTRATED_ADVANCE, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(esRunners[1].PedIndex, CA_CAN_CHARGE, TRUE)
|
|
SET_PED_SHOOTING_PROPERTIES(esRunners[1].PedIndex, 4)
|
|
|
|
esChurchEnemies[0].PedIndex = CREATE_ENEMY_PED(mnEnemy, << 3285.61, -4651.54, 112.84 >>, 0.0, rgEnemies, WEAPONTYPE_ASSAULTRIFLE)
|
|
esChurchEnemies[1].PedIndex = CREATE_ENEMY_PED(mnEnemy, << 3279.87, -4671.24, 112.83 >>, 0.0, rgEnemies, WEAPONTYPE_ASSAULTRIFLE, WEAPONCOMPONENT_INVALID, TRUE)
|
|
INITIALISE_ENEMY_GROUP(esChurchEnemies, FALSE #IF IS_DEBUG_BUILD, "Church " #ENDIF)
|
|
|
|
COMBAT_SEQUENCE_GO_TO_COMBAT(esChurchEnemies[0].PedIndex)
|
|
SET_PED_COMBAT_PROPERTIES(esChurchEnemies[0].PedIndex, CM_DEFENSIVE, CAL_POOR, CR_FAR, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH)
|
|
SET_PED_COMBAT_ATTRIBUTES(esChurchEnemies[0].PedIndex, CA_CAN_USE_FRUSTRATED_ADVANCE, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(esChurchEnemies[0].PedIndex, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
|
|
SET_PED_DEFENSIVE_AREA_ANGLED(esChurchEnemies[0].PedIndex, <<3282.731934,-4650.353516,112.839226>>, <<3278.938232,-4650.336426,115.636375>>, 2.0)
|
|
SET_PED_COVER_PROPERTIES(esChurchEnemies[0].PedIndex, TRUE, TRUE, FALSE, TRUE, 6.0, FALSE, 0.0, 3.0)
|
|
//SET_PED_PREFERRED_COVERPOINT(esChurchEnemies[0].PedIndex, esChurchEnemies[0].ItemsetIndex, csCoverpoints[20].CoverpointIndex)
|
|
SET_PED_SHOOTING_PROPERTIES(esChurchEnemies[0].PedIndex, 3)
|
|
|
|
COMBAT_SEQUENCE_GO_TO_COORD_THEN_COMBAT(esChurchEnemies[1].PedIndex, << 3277.91, -4670.24, 112.87 >>, PEDMOVE_WALK, -1)
|
|
SET_PED_COMBAT_PROPERTIES(esChurchEnemies[1].PedIndex, CM_DEFENSIVE, CAL_POOR, CR_FAR, CA_USE_COVER)
|
|
SET_PED_COMBAT_ATTRIBUTES(esChurchEnemies[1].PedIndex, CA_CAN_USE_FRUSTRATED_ADVANCE, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(esChurchEnemies[1].PedIndex, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
|
|
SET_PED_DEFENSIVE_AREA_SPHERE(esChurchEnemies[1].PedIndex, <<3277.91, -4670.24, 112.87>>, 2.0)
|
|
SET_PED_SHOOTING_PROPERTIES(esChurchEnemies[1].PedIndex, 4)
|
|
|
|
bCurrentEnemyWaveSpawned = TRUE
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ELSE //wave is spawned, keep updating enemy behaviours
|
|
|
|
//update the first runner ped charging at the player
|
|
IF NOT IS_PED_INJURED(esRunners[0].PedIndex)
|
|
|
|
IF ( esRunners[0].bFallingBack = FALSE )
|
|
IF ( bPlayerUsedAlternativePath = TRUE )
|
|
esRunners[0].bHasTask = FALSE
|
|
esRunners[0].iProgress = 100
|
|
esRunners[0].bFallingBack = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SWITCH esRunners[0].iProgress
|
|
|
|
CASE 0
|
|
|
|
IF IS_PED_IN_COMBAT(esRunners[0].PedIndex) //if the enemy ped is done with the combat sequence and is now in combat
|
|
|
|
esRunners[0].bHasTask = FALSE
|
|
esRunners[0].iProgress++
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 1 //make the runner enemy go to ai combat and try to seek cover
|
|
|
|
IF ( esRunners[0].bHasTask = FALSE )
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esRunners[0].PedIndex, 100.0)
|
|
SET_PED_COMBAT_PROPERTIES(esRunners[0].PedIndex, CM_WILLRETREAT, CAL_POOR, CR_MEDIUM, CA_USE_COVER)
|
|
SET_PED_SHOOTING_PROPERTIES(esRunners[0].PedIndex, 4)
|
|
esRunners[0].bHasTask = TRUE
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 100 //make the enemy fall back to the parking lot
|
|
|
|
IF ( esRunners[0].bHasTask = FALSE )
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esRunners[0].PedIndex, 100.0)
|
|
SET_PED_COMBAT_PROPERTIES(esRunners[0].PedIndex, CM_DEFENSIVE, CAL_POOR, CR_MEDIUM, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH)
|
|
SET_PED_DEFENSIVE_AREA_ANGLED(esRunners[0].PedIndex, <<3266.473145,-4689.624023,111.113983>>, <<3226.107422,-4686.157715,118.637154>>, 22.0)
|
|
SET_PED_COMBAT_MOVEMENT_VALUES(esRunners[0].PedIndex, 0.5, 0.0)
|
|
esRunners[0].bHasTask = TRUE
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
ENDIF
|
|
|
|
//update the second runner ped charging at the player
|
|
IF NOT IS_PED_INJURED(esRunners[1].PedIndex)
|
|
|
|
IF ( esRunners[1].bFallingBack = FALSE )
|
|
IF ( bPlayerUsedAlternativePath = TRUE )
|
|
esRunners[1].bHasTask = FALSE
|
|
esRunners[1].iProgress = 100
|
|
esRunners[1].bFallingBack = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SWITCH esRunners[1].iProgress
|
|
|
|
CASE 0
|
|
|
|
IF IS_PED_IN_COMBAT(esRunners[1].PedIndex)
|
|
|
|
esRunners[1].bHasTask = FALSE
|
|
esRunners[1].iProgress++
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 1 //make the runner enemy go to ai combat and try to seek cover
|
|
|
|
IF ( esRunners[1].bHasTask = FALSE )
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esRunners[1].PedIndex, 100.0)
|
|
SET_PED_COMBAT_PROPERTIES(esRunners[1].PedIndex, CM_WILLRETREAT, CAL_POOR, CR_MEDIUM, CA_USE_COVER)
|
|
SET_PED_SHOOTING_PROPERTIES(esRunners[1].PedIndex, 4)
|
|
esRunners[1].bHasTask = TRUE
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 100 //make the enemy fall back to the parking lot
|
|
|
|
IF ( esRunners[1].bHasTask = FALSE )
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esRunners[1].PedIndex, 100.0)
|
|
SET_PED_COMBAT_PROPERTIES(esRunners[1].PedIndex, CM_DEFENSIVE, CAL_POOR, CR_MEDIUM, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH)
|
|
SET_PED_DEFENSIVE_AREA_ANGLED(esRunners[1].PedIndex, <<3266.473145,-4689.624023,111.113983>>, <<3226.107422,-4686.157715,118.637154>>, 22.0)
|
|
SET_PED_COMBAT_MOVEMENT_VALUES(esRunners[1].PedIndex, 0.5, 0.0)
|
|
esRunners[1].bHasTask = TRUE
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(esChurchEnemies[0].PedIndex)
|
|
|
|
IF ( esChurchEnemies[0].bFallingBack = FALSE )
|
|
IF ( bPlayerUsedAlternativePath = TRUE )
|
|
esChurchEnemies[0].bHasTask = FALSE
|
|
esChurchEnemies[0].iProgress = 100
|
|
esChurchEnemies[0].bFallingBack = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SWITCH esChurchEnemies[0].iProgress
|
|
|
|
CASE 100
|
|
|
|
IF ( esChurchEnemies[0].bHasTask = FALSE )
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esChurchEnemies[0].PedIndex, 100.0)
|
|
SET_PED_COMBAT_PROPERTIES(esChurchEnemies[0].PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH)
|
|
SET_PED_DEFENSIVE_AREA_ANGLED(esChurchEnemies[0].PedIndex, <<3266.473145,-4689.624023,111.113983>>, <<3226.107422,-4686.157715,118.637154>>, 22.0)
|
|
SET_PED_COMBAT_MOVEMENT_VALUES(esChurchEnemies[0].PedIndex, 0.5, 0.0)
|
|
SET_PED_COVER_PROPERTIES(esChurchEnemies[0].PedIndex, TRUE, FALSE, FALSE, FALSE, 6.0, TRUE, 0.1, 2.0)
|
|
//SET_PED_PREFERRED_COVERPOINT(esChurchEnemies[0].PedIndex, esChurchEnemies[0].ItemsetIndex, csCoverpoints[26].CoverpointIndex)
|
|
esChurchEnemies[0].bHasTask = TRUE
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(esChurchEnemies[1].PedIndex)
|
|
|
|
IF ( esChurchEnemies[1].bFallingBack = FALSE )
|
|
IF ( bPlayerUsedAlternativePath = TRUE )
|
|
esChurchEnemies[1].bHasTask = FALSE
|
|
esChurchEnemies[1].iProgress = 100
|
|
esChurchEnemies[1].bFallingBack = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SWITCH esChurchEnemies[1].iProgress
|
|
|
|
CASE 100
|
|
|
|
IF ( esChurchEnemies[1].bHasTask = FALSE )
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esChurchEnemies[1].PedIndex, 100.0)
|
|
SET_PED_COMBAT_PROPERTIES(esChurchEnemies[1].PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH)
|
|
SET_PED_DEFENSIVE_AREA_ANGLED(esChurchEnemies[1].PedIndex, <<3266.473145,-4689.624023,111.113983>>, <<3226.107422,-4686.157715,118.637154>>, 22.0)
|
|
SET_PED_COMBAT_MOVEMENT_VALUES(esChurchEnemies[1].PedIndex, 0.5, 0.0)
|
|
SET_PED_COVER_PROPERTIES(esChurchEnemies[1].PedIndex, TRUE, FALSE, FALSE, FALSE, 6.0, TRUE, 0.1, 2.0)
|
|
esChurchEnemies[1].bHasTask = TRUE
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
ENDIF
|
|
|
|
CLEANUP_ENEMY_GROUP(esRunners)
|
|
CLEANUP_ENEMY_GROUP(esChurchEnemies)
|
|
|
|
ENDIF
|
|
|
|
UPDATE_AI_PED_BLIPS_FOR_ENEMY_GROUP(esRunners)
|
|
UPDATE_AI_PED_BLIPS_FOR_ENEMY_GROUP(esChurchEnemies)
|
|
|
|
ENDPROC
|
|
|
|
PROC MANAGE_FOURTH_ENEMY_WAVE(BOOL &bCurrentEnemyWaveSpawned, BOOL bPreviousEnemyWaveSpawned, INT iAliveEnemiesCountToTriggerWave)
|
|
|
|
//create enemy wave when locate is reached
|
|
IF ( bCurrentEnemyWaveSpawned = FALSE )
|
|
|
|
IF ( bPreviousEnemyWaveSpawned = TRUE )
|
|
|
|
IF IS_ENTITY_IN_LOCATE(PLAYER_PED_ID(), <<3262.183105,-4629.664551,116.845070>>, << 30.0, 2.0, 3.0 >> #IF IS_DEBUG_BUILD, "FourthWaveLocate" #ENDIF)
|
|
OR ( ( GET_NUMBER_OF_ENEMIES_ALIVE(esRunners) + GET_NUMBER_OF_ENEMIES_ALIVE(esChurchEnemies) ) <= iAliveEnemiesCountToTriggerWave )
|
|
|
|
esExitEnemies[0].PedIndex = CREATE_ENEMY_PED(mnEnemy, << 3253.03, -4672.16, 113.57 >>, 0.0, rgEnemies, WEAPONTYPE_ASSAULTRIFLE)
|
|
esExitEnemies[1].PedIndex = CREATE_ENEMY_PED(mnEnemy, << 3253.27, -4686.10, 111.96 >>, 341.08, rgEnemies, WEAPONTYPE_ASSAULTRIFLE)
|
|
esExitEnemies[2].PedIndex = CREATE_ENEMY_PED(mnEnemy, << 3257.50, -4695.39, 111.85 >>, 345.48, rgEnemies, WEAPONTYPE_PUMPSHOTGUN)
|
|
esExitEnemies[3].PedIndex = CREATE_ENEMY_PED(mnEnemy, << 3251.4146, -4686.4194, 111.8743 >>, 350.8474, rgEnemies, WEAPONTYPE_PUMPSHOTGUN)
|
|
esExitEnemies[4].PedIndex = CREATE_ENEMY_PED(mnEnemy, << 3261.0928, -4693.9453, 111.8941 >>, 0.7368, rgEnemies, WEAPONTYPE_ASSAULTRIFLE, WEAPONCOMPONENT_INVALID, TRUE)
|
|
INITIALISE_ENEMY_GROUP(esExitEnemies, FALSE #IF IS_DEBUG_BUILD, "Exit " #ENDIF)
|
|
|
|
COMBAT_SEQUENCE_GO_TO_COORD_WHILE_AIMING_THEN_COMBAT(esExitEnemies[0].PedIndex, << 3272.56, -4664.50, 112.84 >>, PEDMOVE_RUN, FALSE, vZero, PLAYER_PED_ID(), TRUE)
|
|
SET_PED_SHOOTING_PROPERTIES(esExitEnemies[0].PedIndex, 3)
|
|
SET_PED_COMBAT_ATTRIBUTES(esExitEnemies[0].PedIndex, CA_CAN_USE_FRUSTRATED_ADVANCE, TRUE)
|
|
|
|
COMBAT_SEQUENCE_GO_TO_COMBAT(esExitEnemies[1].PedIndex)
|
|
SET_PED_COMBAT_PROPERTIES(esExitEnemies[1].PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_FAR, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH)
|
|
SET_PED_DEFENSIVE_AREA_SPHERE(esExitEnemies[1].PedIndex, << 3256.53, -4686.60, 111.91 >>, 3.0)
|
|
SET_PED_COVER_PROPERTIES(esExitEnemies[1].PedIndex, TRUE, FALSE, TRUE, FALSE, 0.0, FALSE)
|
|
SET_PED_SHOOTING_PROPERTIES(esExitEnemies[1].PedIndex, 4)
|
|
SET_PED_COMBAT_ATTRIBUTES(esExitEnemies[1].PedIndex, CA_CAN_USE_FRUSTRATED_ADVANCE, TRUE)
|
|
|
|
COMBAT_SEQUENCE_GO_TO_COMBAT(esExitEnemies[2].PedIndex)
|
|
SET_PED_COMBAT_PROPERTIES(esExitEnemies[2].PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_FAR, CA_USE_COVER)
|
|
SET_PED_DEFENSIVE_AREA_SPHERE(esExitEnemies[2].PedIndex, << 3255.64, -4692.65, 111.84 >>, 3.0)
|
|
SET_PED_COVER_PROPERTIES(esExitEnemies[2].PedIndex, TRUE, TRUE, FALSE, FALSE, 0.0, FALSE)
|
|
SET_PED_SHOOTING_PROPERTIES(esExitEnemies[2].PedIndex, 3)
|
|
SET_PED_COMBAT_ATTRIBUTES(esExitEnemies[2].PedIndex, CA_CAN_USE_FRUSTRATED_ADVANCE, TRUE)
|
|
|
|
COMBAT_SEQUENCE_GO_TO_COMBAT(esExitEnemies[3].PedIndex)
|
|
SET_PED_COMBAT_PROPERTIES(esExitEnemies[3].PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_FAR, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH)
|
|
SET_PED_DEFENSIVE_AREA_SPHERE(esExitEnemies[3].PedIndex, << 3263.23, -4672.08, 112.81 >>, 1.5)
|
|
SET_PED_COVER_PROPERTIES(esExitEnemies[3].PedIndex, TRUE, TRUE, FALSE, FALSE, 0.0, FALSE)
|
|
SET_PED_SHOOTING_PROPERTIES(esExitEnemies[3].PedIndex, 4)
|
|
SET_PED_COMBAT_ATTRIBUTES(esExitEnemies[3].PedIndex, CA_CAN_USE_FRUSTRATED_ADVANCE, TRUE)
|
|
|
|
COMBAT_SEQUENCE_GO_TO_COMBAT(esExitEnemies[4].PedIndex)
|
|
SET_PED_COMBAT_PROPERTIES(esExitEnemies[4].PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_FAR, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH)
|
|
SET_PED_DEFENSIVE_AREA_SPHERE(esExitEnemies[4].PedIndex, << 3261.49, -4691.44, 112.03 >>, 3.0)
|
|
SET_PED_COVER_PROPERTIES(esExitEnemies[4].PedIndex, TRUE, FALSE, TRUE, FALSE, 0.0, FALSE)
|
|
SET_PED_SHOOTING_PROPERTIES(esExitEnemies[4].PedIndex, 3)
|
|
SET_PED_COMBAT_ATTRIBUTES(esExitEnemies[4].PedIndex, CA_CAN_USE_FRUSTRATED_ADVANCE, TRUE)
|
|
|
|
bCurrentEnemyWaveSpawned = TRUE
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ELSE //wave is spawned, keep updating enemy behaviours
|
|
|
|
IF NOT IS_PED_INJURED(esExitEnemies[0].PedIndex)
|
|
|
|
IF ( esExitEnemies[0].bFallingBack = FALSE )
|
|
IF ( bPlayerUsedAlternativePath = TRUE )
|
|
esExitEnemies[0].bHasTask = FALSE
|
|
esExitEnemies[0].iProgress = 100
|
|
esExitEnemies[0].bFallingBack = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SWITCH esExitEnemies[0].iProgress
|
|
|
|
CASE 100
|
|
|
|
IF ( esExitEnemies[0].bHasTask = FALSE )
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esExitEnemies[0].PedIndex, 100.0)
|
|
SET_PED_COMBAT_PROPERTIES(esExitEnemies[0].PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH)
|
|
SET_PED_DEFENSIVE_AREA_ANGLED(esExitEnemies[0].PedIndex, <<3266.473145,-4689.624023,111.113983>>, <<3226.107422,-4686.157715,118.637154>>, 22.0)
|
|
SET_PED_COMBAT_MOVEMENT_VALUES(esExitEnemies[0].PedIndex, 0.5, 0.0)
|
|
SET_PED_COVER_PROPERTIES(esExitEnemies[0].PedIndex, TRUE, FALSE, FALSE, FALSE, 6.0, TRUE, 0.1, 2.0)
|
|
esExitEnemies[0].bHasTask = TRUE
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(esExitEnemies[1].PedIndex)
|
|
|
|
IF ( esExitEnemies[1].bFallingBack = FALSE )
|
|
IF ( bPlayerUsedAlternativePath = TRUE )
|
|
esExitEnemies[1].bHasTask = FALSE
|
|
esExitEnemies[1].iProgress = 100
|
|
esExitEnemies[1].bFallingBack = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SWITCH esExitEnemies[1].iProgress
|
|
|
|
CASE 0
|
|
|
|
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<3257.505371,-4658.068848,116.680290>>,<<36.0,10.0,4.0>>)
|
|
//OR ( GET_NUMBER_OF_ENEMIES_ALIVE(esChurchEnemies) + GET_NUMBER_OF_ENEMIES_ALIVE(esSideVanEnemies) < 3 )
|
|
|
|
esExitEnemies[1].bHasTask = FALSE
|
|
esExitEnemies[1].iProgress++
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 1
|
|
|
|
IF ( esExitEnemies[1].bHasTask = FALSE )
|
|
COMBAT_SEQUENCE_GO_TO_COMBAT(esExitEnemies[1].PedIndex)
|
|
SET_PED_COMBAT_PROPERTIES(esExitEnemies[1].PedIndex, CM_WILLADVANCE, CAL_PROFESSIONAL, CR_MEDIUM, CA_CAN_CHARGE)
|
|
SET_PED_COVER_PROPERTIES(esExitEnemies[1].PedIndex, TRUE, FALSE, TRUE, FALSE, 7.5, FALSE, 0.0, 2.5, 5.5)
|
|
SET_PED_SHOOTING_PROPERTIES(esExitEnemies[1].PedIndex, 4)
|
|
esExitEnemies[1].bHasTask = TRUE
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 100
|
|
|
|
IF ( esExitEnemies[1].bHasTask = FALSE )
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esExitEnemies[1].PedIndex, 100.0)
|
|
SET_PED_COMBAT_PROPERTIES(esExitEnemies[1].PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH)
|
|
SET_PED_DEFENSIVE_AREA_ANGLED(esExitEnemies[1].PedIndex, <<3266.473145,-4689.624023,111.113983>>, <<3226.107422,-4686.157715,118.637154>>, 22.0)
|
|
SET_PED_COMBAT_MOVEMENT_VALUES(esExitEnemies[1].PedIndex, 0.5, 0.0)
|
|
SET_PED_COVER_PROPERTIES(esExitEnemies[1].PedIndex, TRUE, FALSE, FALSE, FALSE, 6.0, TRUE, 0.1, 2.0)
|
|
esExitEnemies[1].bHasTask = TRUE
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(esExitEnemies[2].PedIndex)
|
|
|
|
IF ( esExitEnemies[2].bFallingBack = FALSE )
|
|
IF ( bPlayerUsedAlternativePath = TRUE )
|
|
esExitEnemies[2].bHasTask = FALSE
|
|
esExitEnemies[2].iProgress = 100
|
|
esExitEnemies[2].bFallingBack = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SWITCH esExitEnemies[2].iProgress
|
|
|
|
CASE 0
|
|
|
|
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<3257.505371,-4658.068848,116.680290>>,<<36.0,10.0,4.0>>)
|
|
//OR ( GET_NUMBER_OF_ENEMIES_ALIVE(esChurchEnemies) + GET_NUMBER_OF_ENEMIES_ALIVE(esSideVanEnemies) < 3 )
|
|
|
|
esExitEnemies[2].bHasTask = FALSE
|
|
esExitEnemies[2].iProgress++
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 1
|
|
|
|
IF ( esExitEnemies[2].bHasTask = FALSE )
|
|
COMBAT_SEQUENCE_GO_TO_COMBAT(esExitEnemies[2].PedIndex)
|
|
SET_PED_COMBAT_PROPERTIES(esExitEnemies[2].PedIndex, CM_WILLADVANCE, CAL_PROFESSIONAL, CR_MEDIUM, CA_CAN_CHARGE)
|
|
SET_PED_COVER_PROPERTIES(esExitEnemies[2].PedIndex, TRUE, TRUE, FALSE, FALSE, 9.0, FALSE, 0.0, 3.0, 4.0)
|
|
SET_PED_SHOOTING_PROPERTIES(esExitEnemies[2].PedIndex, 3)
|
|
esExitEnemies[2].bHasTask = TRUE
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 100
|
|
|
|
IF ( esExitEnemies[2].bHasTask = FALSE )
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esExitEnemies[2].PedIndex, 100.0)
|
|
SET_PED_COMBAT_PROPERTIES(esExitEnemies[2].PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH)
|
|
SET_PED_DEFENSIVE_AREA_ANGLED(esExitEnemies[2].PedIndex, <<3266.473145,-4689.624023,111.113983>>, <<3226.107422,-4686.157715,118.637154>>, 22.0)
|
|
SET_PED_COMBAT_MOVEMENT_VALUES(esExitEnemies[2].PedIndex, 0.5, 0.0)
|
|
SET_PED_COVER_PROPERTIES(esExitEnemies[2].PedIndex, TRUE, FALSE, FALSE, FALSE, 6.0, TRUE, 0.1, 2.0)
|
|
REMOVE_PED_PREFERRED_COVERPOINT(esExitEnemies[2].PedIndex, esExitEnemies[2].ItemsetIndex)
|
|
esExitEnemies[2].bHasTask = TRUE
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(esExitEnemies[3].PedIndex)
|
|
|
|
IF ( esExitEnemies[3].bFallingBack = FALSE )
|
|
IF ( bPlayerUsedAlternativePath = TRUE )
|
|
esExitEnemies[3].bHasTask = FALSE
|
|
esExitEnemies[3].iProgress = 100
|
|
esExitEnemies[3].bFallingBack = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SWITCH esExitEnemies[3].iProgress
|
|
|
|
CASE 0
|
|
|
|
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<3257.505371,-4658.068848,116.680290>>,<<36.0,10.0,4.0>>)
|
|
OR ( GET_NUMBER_OF_ENEMIES_ALIVE(esChurchEnemies) + GET_NUMBER_OF_ENEMIES_ALIVE(esSideVanEnemies) < 3 )
|
|
|
|
esExitEnemies[3].bHasTask = FALSE
|
|
esExitEnemies[3].iProgress++
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 1
|
|
|
|
IF ( esExitEnemies[3].bHasTask = FALSE )
|
|
COMBAT_SEQUENCE_GO_TO_COORD_WHILE_AIMING_THEN_COMBAT(esExitEnemies[3].PedIndex, << 3263.08, -4665.64, 112.71 >>, PEDMOVE_RUN, FALSE, vZero, PLAYER_PED_ID(), FALSE)
|
|
SET_PED_COMBAT_PROPERTIES(esExitEnemies[3].PedIndex, CM_WILLADVANCE, CAL_PROFESSIONAL, CR_MEDIUM, CA_USE_COVER)
|
|
SET_PED_COMBAT_ATTRIBUTES(esExitEnemies[3].PedIndex, CA_CAN_CHARGE, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(esExitEnemies[3].PedIndex, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
|
|
SET_PED_COVER_PROPERTIES(esExitEnemies[3].PedIndex, TRUE, FALSE, FALSE, FALSE, 0.0, FALSE)
|
|
SET_PED_SHOOTING_PROPERTIES(esExitEnemies[3].PedIndex, 4)
|
|
esExitEnemies[3].bHasTask = TRUE
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 100
|
|
|
|
IF ( esExitEnemies[3].bHasTask = FALSE )
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esExitEnemies[3].PedIndex, 100.0)
|
|
SET_PED_COMBAT_PROPERTIES(esExitEnemies[3].PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH)
|
|
SET_PED_DEFENSIVE_AREA_ANGLED(esExitEnemies[3].PedIndex, <<3266.473145,-4689.624023,111.113983>>, <<3226.107422,-4686.157715,118.637154>>, 22.0)
|
|
SET_PED_COMBAT_MOVEMENT_VALUES(esExitEnemies[3].PedIndex, 0.5, 0.0)
|
|
SET_PED_COVER_PROPERTIES(esExitEnemies[3].PedIndex, TRUE, FALSE, FALSE, FALSE, 6.0, TRUE, 0.1, 2.0)
|
|
esExitEnemies[3].bHasTask = TRUE
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(esExitEnemies[4].PedIndex)
|
|
|
|
IF ( esExitEnemies[4].bFallingBack = FALSE )
|
|
IF ( bPlayerUsedAlternativePath = TRUE )
|
|
esExitEnemies[4].bHasTask = FALSE
|
|
esExitEnemies[4].iProgress = 100
|
|
esExitEnemies[4].bFallingBack = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SWITCH esExitEnemies[4].iProgress
|
|
|
|
CASE 0
|
|
|
|
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<3257.505371,-4658.068848,116.680290>>,<<36.0,10.0,4.0>>)
|
|
OR ( GET_NUMBER_OF_ENEMIES_ALIVE(esChurchEnemies) + GET_NUMBER_OF_ENEMIES_ALIVE(esSideVanEnemies) < 3 )
|
|
|
|
esExitEnemies[4].bHasTask = FALSE
|
|
esExitEnemies[4].iProgress++
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 1
|
|
|
|
IF ( esExitEnemies[4].bHasTask = FALSE )
|
|
COMBAT_SEQUENCE_GO_TO_COORD_WHILE_AIMING_THEN_COMBAT(esExitEnemies[4].PedIndex, << 3261.90, -4680.61, 111.95 >>, PEDMOVE_RUN, FALSE, vZero, PLAYER_PED_ID(), TRUE)
|
|
SET_PED_COMBAT_PROPERTIES(esExitEnemies[4].PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH)
|
|
SET_PED_COMBAT_ATTRIBUTES(esExitEnemies[4].PedIndex, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
|
|
SET_PED_DEFENSIVE_AREA_SPHERE(esExitEnemies[4].PedIndex, << 3268.94, -4663.72, 112.88 >>, 4.0)
|
|
SET_PED_COVER_PROPERTIES(esExitEnemies[4].PedIndex, TRUE, FALSE, FALSE, FALSE, 0.0, FALSE)
|
|
SET_PED_SHOOTING_PROPERTIES(esExitEnemies[4].PedIndex, 3)
|
|
esExitEnemies[4].bHasTask = TRUE
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 100
|
|
|
|
IF ( esExitEnemies[4].bHasTask = FALSE )
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esExitEnemies[4].PedIndex, 100.0)
|
|
SET_PED_COMBAT_PROPERTIES(esExitEnemies[4].PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH)
|
|
SET_PED_DEFENSIVE_AREA_ANGLED(esExitEnemies[4].PedIndex, <<3266.473145,-4689.624023,111.113983>>, <<3226.107422,-4686.157715,118.637154>>, 22.0)
|
|
SET_PED_COMBAT_MOVEMENT_VALUES(esExitEnemies[4].PedIndex, 0.5, 0.0)
|
|
SET_PED_COVER_PROPERTIES(esExitEnemies[4].PedIndex, TRUE, FALSE, FALSE, FALSE, 6.0, TRUE, 0.1, 2.0)
|
|
esExitEnemies[4].bHasTask = TRUE
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
ENDIF
|
|
|
|
CLEANUP_ENEMY_GROUP(esExitEnemies)
|
|
|
|
ENDIF
|
|
|
|
UPDATE_AI_PED_BLIPS_FOR_ENEMY_GROUP(esExitEnemies)
|
|
|
|
ENDPROC
|
|
|
|
PROC MANAGE_FIFTH_ENEMY_WAVE(BOOL &bCurrentEnemyWaveSpawned, BOOL&bCurrentEnemyWaveIgnored, BOOL bPreviousEnemyWaveSpawned)
|
|
|
|
//check if locate ignoring this enemy wave was reached
|
|
IF ( bCurrentEnemyWaveIgnored = FALSE )
|
|
IF IS_ENTITY_IN_ANGLED_AREA_LOCATE(PLAYER_PED_ID(), <<3294.089111,-4665.589844,112.151215>>,
|
|
<<3222.692383,-4659.922852,117.261169>>, 16.0 #IF IS_DEBUG_BUILD, "IgnoreFifthWaveLocate" #ENDIF)
|
|
bCurrentEnemyWaveIgnored = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//create enemy wave when locate is reached
|
|
IF ( bCurrentEnemyWaveSpawned = FALSE )
|
|
|
|
IF ( bPreviousEnemyWaveSpawned = TRUE )
|
|
|
|
IF ( bCurrentEnemyWaveIgnored = FALSE ) //create this enemy wave when locate for ignoring was not reached by player
|
|
AND IS_ENTITY_IN_ANGLED_AREA_LOCATE(PLAYER_PED_ID(), <<3238.833984,-4639.374023,113.510277>>,
|
|
<<3234.517334,-4652.879395,118.686172>>, 14.0 #IF IS_DEBUG_BUILD, "FifthWaveLocate" #ENDIF)
|
|
|
|
esSideEnemies[0].PedIndex = CREATE_ENEMY_PED(mnEnemy, << 3240.9082, -4665.7764, 114.6382 >>, 0.0, rgEnemies, WEAPONTYPE_ASSAULTRIFLE)
|
|
esSideEnemies[1].PedIndex = CREATE_ENEMY_PED(mnEnemy, << 3244.5220, -4672.7925, 113.1723 >>, 48.64, rgEnemies, WEAPONTYPE_PUMPSHOTGUN)
|
|
esSideEnemies[2].PedIndex = CREATE_ENEMY_PED(mnEnemy, << 3231.5359, -4684.4063, 111.6351 >>, 306.53, rgEnemies, WEAPONTYPE_ASSAULTRIFLE)
|
|
INITIALISE_ENEMY_GROUP(esSideEnemies, FALSE #IF IS_DEBUG_BUILD, "Side " #ENDIF)
|
|
|
|
|
|
SET_PED_COMBAT_PROPERTIES(esSideEnemies[0].PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_FAR, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH)
|
|
SET_PED_COMBAT_ATTRIBUTES(esSideEnemies[0].PedIndex, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(esSideEnemies[0].PedIndex, CA_CAN_USE_FRUSTRATED_ADVANCE, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(esSideEnemies[0].PedIndex, CA_DISABLE_SEEK_DUE_TO_LINE_OF_SIGHT, FALSE)
|
|
SET_PED_DEFENSIVE_AREA_ANGLED(esSideEnemies[0].PedIndex, <<3239.528320,-4665.080566,113.577934>>, <<3240.278564,-4665.159180,116.508667>>, 1.0)
|
|
SET_PED_PREFERRED_COVERPOINT(esSideEnemies[0].PedIndex, esSideEnemies[0].ItemsetIndex, csCoverpoints[25].CoverpointIndex)
|
|
SET_PED_COVER_PROPERTIES(esSideEnemies[0].PedIndex, TRUE, TRUE, FALSE, FALSE, 8.0, FALSE, 0.0, 1.0, 4.5)
|
|
SET_PED_SHOOTING_PROPERTIES(esSideEnemies[0].PedIndex, 15)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(esSideEnemies[0].PedIndex, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esSideEnemies[0].PedIndex, 100.0)
|
|
esSideEnemies[0].iTimer = GET_GAME_TIMER()
|
|
|
|
COMBAT_SEQUENCE_GO_TO_COORD_WHILE_AIMING_THEN_COMBAT(esSideEnemies[1].PedIndex, << 3237.66, -4665.48, 113.57 >>, PEDMOVE_RUN,
|
|
FALSE, vZero, PLAYER_PED_ID(), FALSE, FALSE, TRUE, 1000, FIRING_TYPE_CONTINUOUS)
|
|
SET_PED_COMBAT_PROPERTIES(esSideEnemies[1].PedIndex, CM_WILLADVANCE, CAL_PROFESSIONAL, CR_NEAR, CA_AGGRESSIVE)
|
|
SET_PED_COMBAT_ATTRIBUTES(esSideEnemies[1].PedIndex, CA_CAN_CHARGE, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(esSideEnemies[1].PedIndex, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(esSideEnemies[1].PedIndex, CA_CAN_USE_FRUSTRATED_ADVANCE, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(esSideEnemies[1].PedIndex, CA_DISABLE_SEEK_DUE_TO_LINE_OF_SIGHT, FALSE)
|
|
SET_PED_SHOOTING_PROPERTIES(esSideEnemies[1].PedIndex, 15, 125, FIRING_PATTERN_FULL_AUTO)
|
|
|
|
SET_PED_COMBAT_PROPERTIES(esSideEnemies[2].PedIndex, CM_WILLADVANCE, CAL_PROFESSIONAL, CR_NEAR, CA_AGGRESSIVE)
|
|
SET_PED_COMBAT_ATTRIBUTES(esSideEnemies[2].PedIndex, CA_CAN_CHARGE, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(esSideEnemies[2].PedIndex, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(esSideEnemies[2].PedIndex, CA_CAN_USE_FRUSTRATED_ADVANCE, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(esSideEnemies[2].PedIndex, CA_DISABLE_SEEK_DUE_TO_LINE_OF_SIGHT, FALSE)
|
|
SET_PED_SHOOTING_PROPERTIES(esSideEnemies[2].PedIndex, 15, 125, FIRING_PATTERN_FULL_AUTO)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(esSideEnemies[2].PedIndex, FALSE)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esSideEnemies[2].PedIndex, 100.0)
|
|
|
|
bCurrentEnemyWaveSpawned = TRUE
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ELSE //wave is spawned, keep updating enemy behaviours
|
|
|
|
CLEANUP_ENEMY_GROUP(esSideEnemies)
|
|
|
|
ENDIF
|
|
|
|
UPDATE_AI_PED_BLIPS_FOR_ENEMY_GROUP(esSideEnemies)
|
|
|
|
ENDPROC
|
|
|
|
PROC MANAGE_FIRST_ENEMY_REINFORCEMENT_WAVE(BOOL &bCurrentEnemyWaveSpawned, BOOL bMainEnemyWaveSpawned)
|
|
|
|
IF ( bCurrentEnemyWaveSpawned = FALSE )
|
|
|
|
IF ( bMainEnemyWaveSpawned = FALSE )
|
|
|
|
IF ( GET_NUMBER_OF_ENEMIES_DEAD(esMiddleEnemies) + GET_NUMBER_OF_ENEMIES_DEAD(esVanEnemies) + GET_NUMBER_OF_ENEMIES_DEAD(esWallEnemies) >= 8 )
|
|
|
|
esFirstReinforcementEnemies[0].PedIndex = CREATE_ENEMY_PED(mnEnemy, <<3265.5913, -4642.5308, 113.3619>>, 341.20, rgEnemies, WEAPONTYPE_ASSAULTRIFLE, WEAPONCOMPONENT_AT_AR_FLSH, TRUE)
|
|
esFirstReinforcementEnemies[1].PedIndex = CREATE_ENEMY_PED(mnEnemy, <<3284.5649, -4651.4722, 113.3171>>, 6.62, rgEnemies, WEAPONTYPE_PUMPSHOTGUN, WEAPONCOMPONENT_INVALID, TRUE)
|
|
INITIALISE_ENEMY_GROUP(esFirstReinforcementEnemies, FALSE #IF IS_DEBUG_BUILD, "1st " #ENDIF)
|
|
|
|
bCurrentEnemyWaveSpawned = TRUE
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ELSE //wave is spawned, keep updating enemy behaviours
|
|
|
|
IF DOES_ENTITY_EXIST(esFirstReinforcementEnemies[0].PedIndex)
|
|
IF NOT IS_ENTITY_DEAD(esFirstReinforcementEnemies[0].PedIndex)
|
|
|
|
SWITCH esFirstReinforcementEnemies[0].iProgress
|
|
|
|
CASE 0
|
|
IF ( esFirstReinforcementEnemies[0].bHasTask = FALSE )
|
|
|
|
SET_PED_COMBAT_ATTRIBUTES(esFirstReinforcementEnemies[0].PedIndex, CA_CAN_CHARGE, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(esFirstReinforcementEnemies[0].PedIndex, CA_AGGRESSIVE, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(esFirstReinforcementEnemies[0].PedIndex, CA_USE_VEHICLE, FALSE)
|
|
SET_PED_COMBAT_ATTRIBUTES(esFirstReinforcementEnemies[0].PedIndex, CA_LEAVE_VEHICLES, TRUE)
|
|
|
|
SET_PED_COMBAT_RANGE(esFirstReinforcementEnemies[0].PedIndex, CR_NEAR)
|
|
SET_PED_COMBAT_MOVEMENT(esFirstReinforcementEnemies[0].PedIndex, CM_WILLADVANCE)
|
|
|
|
SET_PED_SHOOTING_PROPERTIES(esFirstReinforcementEnemies[0].PedIndex, 3)
|
|
|
|
SET_COMBAT_FLOAT(esFirstReinforcementEnemies[0].PedIndex, CCF_STRAFE_WHEN_MOVING_CHANCE, 1.0)
|
|
SET_COMBAT_FLOAT(esFirstReinforcementEnemies[0].PedIndex, CCF_WALK_WHEN_STRAFING_CHANCE, 0.0)
|
|
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esFirstReinforcementEnemies[0].PedIndex, 200.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(esFirstReinforcementEnemies[0].PedIndex, FALSE)
|
|
|
|
esFirstReinforcementEnemies[0].bHasTask = TRUE
|
|
ENDIF
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(esFirstReinforcementEnemies[1].PedIndex)
|
|
IF NOT IS_ENTITY_DEAD(esFirstReinforcementEnemies[1].PedIndex)
|
|
|
|
SWITCH esFirstReinforcementEnemies[1].iProgress
|
|
|
|
CASE 0
|
|
IF ( esFirstReinforcementEnemies[1].bHasTask = FALSE )
|
|
|
|
SET_PED_COMBAT_ATTRIBUTES(esFirstReinforcementEnemies[1].PedIndex, CA_CAN_CHARGE, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(esFirstReinforcementEnemies[1].PedIndex, CA_AGGRESSIVE, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(esFirstReinforcementEnemies[1].PedIndex, CA_USE_VEHICLE, FALSE)
|
|
SET_PED_COMBAT_ATTRIBUTES(esFirstReinforcementEnemies[1].PedIndex, CA_LEAVE_VEHICLES, TRUE)
|
|
|
|
SET_PED_COMBAT_RANGE(esFirstReinforcementEnemies[1].PedIndex, CR_NEAR)
|
|
SET_PED_COMBAT_MOVEMENT(esFirstReinforcementEnemies[1].PedIndex, CM_WILLADVANCE)
|
|
|
|
SET_PED_SHOOTING_PROPERTIES(esFirstReinforcementEnemies[1].PedIndex, 4)
|
|
|
|
SET_COMBAT_FLOAT(esFirstReinforcementEnemies[1].PedIndex, CCF_STRAFE_WHEN_MOVING_CHANCE, 1.0)
|
|
SET_COMBAT_FLOAT(esFirstReinforcementEnemies[1].PedIndex, CCF_WALK_WHEN_STRAFING_CHANCE, 0.0)
|
|
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esFirstReinforcementEnemies[1].PedIndex, 200.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(esFirstReinforcementEnemies[1].PedIndex, FALSE)
|
|
|
|
esFirstReinforcementEnemies[1].bHasTask = TRUE
|
|
ENDIF
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
CLEANUP_ENEMY_GROUP(esFirstReinforcementEnemies)
|
|
|
|
ENDIF
|
|
|
|
UPDATE_AI_PED_BLIPS_FOR_ENEMY_GROUP(esFirstReinforcementEnemies)
|
|
|
|
ENDPROC
|
|
|
|
PROC MANAGE_SECOND_ENEMY_REINFORCEMENT_WAVE(BOOL &bCurrentEnemyWaveSpawned, BOOL bPreviousEnemyWaveSpawned, BOOL bMainEnemyWaveSpawned)
|
|
|
|
IF ( bCurrentEnemyWaveSpawned = FALSE )
|
|
|
|
IF ( bMainEnemyWaveSpawned = FALSE)
|
|
AND ( bPreviousEnemyWaveSpawned = TRUE )
|
|
|
|
IF ( GET_NUMBER_OF_ENEMIES_DEAD(esFirstReinforcementEnemies) >= 1 )
|
|
|
|
IF iSecondEnemyReinforcementDelayTimer = 0
|
|
|
|
iSecondEnemyReinforcementDelayTimer = GET_GAME_TIMER()
|
|
|
|
ELSE
|
|
|
|
IF HAS_TIME_PASSED(3000, iSecondEnemyReinforcementDelayTimer)
|
|
|
|
esSecondReinforcementEnemies[0].PedIndex = CREATE_ENEMY_PED(mnEnemy, <<3283.0278, -4639.9214, 114.3816>>, 7.6314, rgEnemies, WEAPONTYPE_ASSAULTRIFLE, WEAPONCOMPONENT_AT_AR_FLSH, TRUE)
|
|
esSecondReinforcementEnemies[1].PedIndex = CREATE_ENEMY_PED(mnEnemy, <<3261.2634, -4645.3687, 112.9646>>, 352.95, rgEnemies, WEAPONTYPE_PISTOL, WEAPONCOMPONENT_INVALID, TRUE)
|
|
INITIALISE_ENEMY_GROUP(esSecondReinforcementEnemies, FALSE #IF IS_DEBUG_BUILD, "2nd " #ENDIF)
|
|
|
|
bCurrentEnemyWaveSpawned = TRUE
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ELSE //wave is spawned, keep updating enemy behaviours
|
|
|
|
IF DOES_ENTITY_EXIST(esSecondReinforcementEnemies[0].PedIndex)
|
|
IF NOT IS_ENTITY_DEAD(esSecondReinforcementEnemies[0].PedIndex)
|
|
|
|
SWITCH esSecondReinforcementEnemies[0].iProgress
|
|
|
|
CASE 0
|
|
IF ( esSecondReinforcementEnemies[0].bHasTask = FALSE )
|
|
|
|
SET_PED_COMBAT_ATTRIBUTES(esSecondReinforcementEnemies[0].PedIndex, CA_CAN_CHARGE, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(esSecondReinforcementEnemies[0].PedIndex, CA_AGGRESSIVE, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(esSecondReinforcementEnemies[0].PedIndex, CA_USE_VEHICLE, FALSE)
|
|
SET_PED_COMBAT_ATTRIBUTES(esSecondReinforcementEnemies[0].PedIndex, CA_LEAVE_VEHICLES, TRUE)
|
|
|
|
SET_PED_COMBAT_RANGE(esSecondReinforcementEnemies[0].PedIndex, CR_NEAR)
|
|
SET_PED_COMBAT_MOVEMENT(esSecondReinforcementEnemies[0].PedIndex, CM_WILLADVANCE)
|
|
|
|
SET_PED_SHOOTING_PROPERTIES(esSecondReinforcementEnemies[0].PedIndex, 3)
|
|
|
|
SET_COMBAT_FLOAT(esSecondReinforcementEnemies[0].PedIndex, CCF_STRAFE_WHEN_MOVING_CHANCE, 1.0)
|
|
SET_COMBAT_FLOAT(esSecondReinforcementEnemies[0].PedIndex, CCF_WALK_WHEN_STRAFING_CHANCE, 0.0)
|
|
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esSecondReinforcementEnemies[0].PedIndex, 200.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(esSecondReinforcementEnemies[0].PedIndex, FALSE)
|
|
|
|
esSecondReinforcementEnemies[0].bHasTask = TRUE
|
|
ENDIF
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(esSecondReinforcementEnemies[1].PedIndex)
|
|
IF NOT IS_ENTITY_DEAD(esSecondReinforcementEnemies[1].PedIndex)
|
|
|
|
SWITCH esSecondReinforcementEnemies[1].iProgress
|
|
|
|
CASE 0
|
|
IF ( esSecondReinforcementEnemies[1].bHasTask = FALSE )
|
|
|
|
SET_PED_COMBAT_ATTRIBUTES(esSecondReinforcementEnemies[1].PedIndex, CA_CAN_CHARGE, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(esSecondReinforcementEnemies[1].PedIndex, CA_AGGRESSIVE, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(esSecondReinforcementEnemies[1].PedIndex, CA_USE_VEHICLE, FALSE)
|
|
SET_PED_COMBAT_ATTRIBUTES(esSecondReinforcementEnemies[1].PedIndex, CA_LEAVE_VEHICLES, TRUE)
|
|
|
|
SET_PED_COMBAT_RANGE(esSecondReinforcementEnemies[1].PedIndex, CR_NEAR)
|
|
SET_PED_COMBAT_MOVEMENT(esSecondReinforcementEnemies[1].PedIndex, CM_WILLADVANCE)
|
|
|
|
SET_PED_SHOOTING_PROPERTIES(esSecondReinforcementEnemies[1].PedIndex, 4)
|
|
|
|
SET_COMBAT_FLOAT(esSecondReinforcementEnemies[1].PedIndex, CCF_STRAFE_WHEN_MOVING_CHANCE, 1.0)
|
|
SET_COMBAT_FLOAT(esSecondReinforcementEnemies[1].PedIndex, CCF_WALK_WHEN_STRAFING_CHANCE, 0.0)
|
|
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esSecondReinforcementEnemies[1].PedIndex, 200.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(esSecondReinforcementEnemies[1].PedIndex, FALSE)
|
|
|
|
esSecondReinforcementEnemies[1].bHasTask = TRUE
|
|
ENDIF
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
CLEANUP_ENEMY_GROUP(esSecondReinforcementEnemies)
|
|
|
|
ENDIF
|
|
|
|
UPDATE_AI_PED_BLIPS_FOR_ENEMY_GROUP(esSecondReinforcementEnemies)
|
|
|
|
ENDPROC
|
|
|
|
PROC MANAGE_THIRD_ENEMY_REINFORCEMENT_WAVE(BOOL &bCurrentEnemyWaveSpawned, BOOL bPreviousEnemyWaveSpawned, BOOL bMainEnemyWaveSpawned)
|
|
|
|
IF ( bCurrentEnemyWaveSpawned = FALSE )
|
|
|
|
IF ( bMainEnemyWaveSpawned = FALSE)
|
|
AND ( bPreviousEnemyWaveSpawned = TRUE )
|
|
|
|
IF ( GET_NUMBER_OF_ENEMIES_DEAD(esSecondReinforcementEnemies) >= 1 )
|
|
|
|
IF iThirdEnemyReinforcementDelayTimer = 0
|
|
|
|
iThirdEnemyReinforcementDelayTimer = GET_GAME_TIMER()
|
|
|
|
ELSE
|
|
|
|
IF HAS_TIME_PASSED(5000, iThirdEnemyReinforcementDelayTimer)
|
|
|
|
esThirdReinforcementEnemies[0].PedIndex = CREATE_ENEMY_PED(mnEnemy, <<3265.5913, -4642.5308, 113.3619>>, 341.20, rgEnemies, WEAPONTYPE_PUMPSHOTGUN, WEAPONCOMPONENT_INVALID, TRUE)
|
|
esThirdReinforcementEnemies[1].PedIndex = CREATE_ENEMY_PED(mnEnemy, <<3284.5649, -4651.4722, 113.3171>>, 6.62, rgEnemies, WEAPONTYPE_PUMPSHOTGUN, WEAPONCOMPONENT_INVALID, TRUE)
|
|
INITIALISE_ENEMY_GROUP(esThirdReinforcementEnemies, FALSE #IF IS_DEBUG_BUILD, "3rd " #ENDIF)
|
|
|
|
bCurrentEnemyWaveSpawned = TRUE
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ELSE //wave is spawned, keep updating enemy behaviours
|
|
|
|
IF DOES_ENTITY_EXIST(esThirdReinforcementEnemies[0].PedIndex)
|
|
IF NOT IS_ENTITY_DEAD(esThirdReinforcementEnemies[0].PedIndex)
|
|
|
|
SWITCH esThirdReinforcementEnemies[0].iProgress
|
|
|
|
CASE 0
|
|
IF ( esThirdReinforcementEnemies[0].bHasTask = FALSE )
|
|
|
|
SET_PED_COMBAT_ATTRIBUTES(esThirdReinforcementEnemies[0].PedIndex, CA_CAN_CHARGE, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(esThirdReinforcementEnemies[0].PedIndex, CA_AGGRESSIVE, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(esThirdReinforcementEnemies[0].PedIndex, CA_USE_VEHICLE, FALSE)
|
|
SET_PED_COMBAT_ATTRIBUTES(esThirdReinforcementEnemies[0].PedIndex, CA_LEAVE_VEHICLES, TRUE)
|
|
|
|
SET_PED_COMBAT_RANGE(esThirdReinforcementEnemies[0].PedIndex, CR_NEAR)
|
|
SET_PED_COMBAT_MOVEMENT(esThirdReinforcementEnemies[0].PedIndex, CM_WILLADVANCE)
|
|
|
|
SET_PED_SHOOTING_PROPERTIES(esThirdReinforcementEnemies[0].PedIndex, 3)
|
|
|
|
SET_COMBAT_FLOAT(esThirdReinforcementEnemies[0].PedIndex, CCF_STRAFE_WHEN_MOVING_CHANCE, 1.0)
|
|
SET_COMBAT_FLOAT(esThirdReinforcementEnemies[0].PedIndex, CCF_WALK_WHEN_STRAFING_CHANCE, 0.0)
|
|
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esThirdReinforcementEnemies[0].PedIndex, 200.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(esThirdReinforcementEnemies[0].PedIndex, FALSE)
|
|
|
|
esThirdReinforcementEnemies[0].bHasTask = TRUE
|
|
ENDIF
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(esThirdReinforcementEnemies[1].PedIndex)
|
|
IF NOT IS_ENTITY_DEAD(esThirdReinforcementEnemies[1].PedIndex)
|
|
|
|
SWITCH esThirdReinforcementEnemies[1].iProgress
|
|
|
|
CASE 0
|
|
IF ( esThirdReinforcementEnemies[1].bHasTask = FALSE )
|
|
|
|
SET_PED_COMBAT_ATTRIBUTES(esThirdReinforcementEnemies[1].PedIndex, CA_CAN_CHARGE, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(esThirdReinforcementEnemies[1].PedIndex, CA_AGGRESSIVE, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(esThirdReinforcementEnemies[1].PedIndex, CA_USE_VEHICLE, FALSE)
|
|
SET_PED_COMBAT_ATTRIBUTES(esThirdReinforcementEnemies[1].PedIndex, CA_LEAVE_VEHICLES, TRUE)
|
|
|
|
SET_PED_COMBAT_RANGE(esThirdReinforcementEnemies[1].PedIndex, CR_NEAR)
|
|
SET_PED_COMBAT_MOVEMENT(esThirdReinforcementEnemies[1].PedIndex, CM_WILLADVANCE)
|
|
|
|
SET_PED_SHOOTING_PROPERTIES(esThirdReinforcementEnemies[1].PedIndex, 4)
|
|
|
|
SET_COMBAT_FLOAT(esThirdReinforcementEnemies[1].PedIndex, CCF_STRAFE_WHEN_MOVING_CHANCE, 1.0)
|
|
SET_COMBAT_FLOAT(esThirdReinforcementEnemies[1].PedIndex, CCF_WALK_WHEN_STRAFING_CHANCE, 0.0)
|
|
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esThirdReinforcementEnemies[1].PedIndex, 200.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(esThirdReinforcementEnemies[1].PedIndex, FALSE)
|
|
|
|
esThirdReinforcementEnemies[1].bHasTask = TRUE
|
|
ENDIF
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
CLEANUP_ENEMY_GROUP(esThirdReinforcementEnemies)
|
|
|
|
ENDIF
|
|
|
|
UPDATE_AI_PED_BLIPS_FOR_ENEMY_GROUP(esThirdReinforcementEnemies)
|
|
|
|
ENDPROC
|
|
|
|
PROC MANAGE_FIRST_ENEMY_VAN_AND_ENEMIES(INT &iProgress)
|
|
|
|
FLOAT fPlaybackPercentage
|
|
|
|
SWITCH iProgress
|
|
|
|
CASE 0
|
|
|
|
REQUEST_ANIM_DICT("missmic1ig_2")
|
|
|
|
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), << 3267.560303, -4588.922363, 118.005730 >>, << 30.0, 3.5, 2.0 >>)
|
|
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<3287.814453,-4589.952148,116.589165>>, <<3294.002441,-4561.976074,120.122002>>, 12.0)
|
|
OR ( iFirstVanTriggerTimer != 0 AND HAS_TIME_PASSED(25000, iFirstVanTriggerTimer) )
|
|
|
|
IF HAS_MODEL_LOADED(mnEnemy)
|
|
AND HAS_MODEL_LOADED(mnEnemyVan)
|
|
|
|
//first van on recording
|
|
vsEnemyVans[0].VehicleIndex = CREATE_ENEMY_VEHICLE(vsEnemyVans[0], 800, FALSE, TRUE, TRUE, TRUE, VEHICLELOCK_UNLOCKED, 30, 2, FALSE #IF IS_DEBUG_BUILD, "EnemyVan 0" #ENDIF)
|
|
|
|
//make the van only take damage from the player initially, so that it does not take damage when smashing through the gate
|
|
SET_ENTITY_INVINCIBLE(vsEnemyVans[0].VehicleIndex, TRUE)
|
|
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(vsEnemyVans[0].VehicleIndex, TRUE)
|
|
SET_VEHICLE_CAN_BE_VISIBLY_DAMAGED(vsEnemyVans[0].VehicleIndex, FALSE)
|
|
SET_VEHICLE_ACTIVE_DURING_PLAYBACK(vsEnemyVans[0].VehicleIndex, TRUE)
|
|
|
|
esVanEnemies[0].PedIndex = CREATE_ENEMY_PED_IN_VEHICLE(mnEnemy, vsEnemyVans[0].VehicleIndex, VS_DRIVER, rgEnemies, WEAPONTYPE_PISTOL)
|
|
esVanEnemies[1].PedIndex = CREATE_ENEMY_PED_IN_VEHICLE(mnEnemy, vsEnemyVans[0].VehicleIndex, VS_FRONT_RIGHT, rgEnemies, WEAPONTYPE_PISTOL, WEAPONCOMPONENT_AT_PI_FLSH)
|
|
esVanEnemies[2].PedIndex = CREATE_ENEMY_PED_IN_VEHICLE(mnEnemy, vsEnemyVans[0].VehicleIndex, VS_BACK_LEFT, rgEnemies, WEAPONTYPE_ASSAULTRIFLE, WEAPONCOMPONENT_AT_AR_FLSH)
|
|
esVanEnemies[3].PedIndex = CREATE_ENEMY_PED_IN_VEHICLE(mnEnemy, vsEnemyVans[0].VehicleIndex, VS_BACK_RIGHT, rgEnemies, WEAPONTYPE_ASSAULTRIFLE)
|
|
INITIALISE_ENEMY_GROUP(esVanEnemies, FALSE #IF IS_DEBUG_BUILD, "Van " #ENDIF)
|
|
|
|
SET_PED_SEEING_RANGE(esVanEnemies[0].PedIndex, 20.0)
|
|
SET_PED_SEEING_RANGE(esVanEnemies[1].PedIndex, 15.0)
|
|
SET_PED_SEEING_RANGE(esVanEnemies[2].PedIndex, 20.0)
|
|
SET_PED_SEEING_RANGE(esVanEnemies[3].PedIndex, 20.0)
|
|
|
|
SET_ENTITY_INVINCIBLE(esVanEnemies[0].PedIndex, TRUE)
|
|
SET_ENTITY_INVINCIBLE(esVanEnemies[1].PedIndex, TRUE)
|
|
SET_ENTITY_INVINCIBLE(esVanEnemies[2].PedIndex, TRUE)
|
|
SET_ENTITY_INVINCIBLE(esVanEnemies[3].PedIndex, TRUE)
|
|
|
|
START_VEHICLE_RECORDING_PLAYBACK_FOR_VEHICLE(vsEnemyVans[0], sVehicleRecordingsFile, 1.35)
|
|
|
|
START_AUDIO_SCENE("MI_1_VAN_ARRIVES_01")
|
|
ADD_ENTITY_TO_AUDIO_MIX_GROUP(vsEnemyVans[0].VehicleIndex, "MI_1_VAN_01")
|
|
|
|
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGH)
|
|
bReplayStartEventTriggered = TRUE
|
|
|
|
iProgress++
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 1
|
|
|
|
REQUEST_ANIM_DICT("missmic1ig_2")
|
|
|
|
IF IS_VEHICLE_RECORDING_PLAYBACK_RUNNING_OR_DRIVER_DEAD(vsEnemyVans[0].VehicleIndex, fPlaybackPercentage, vsEnemyVans[0].bDriverDead)
|
|
|
|
IF ( fPlaybackPercentage > 32.0 )
|
|
AND ( fPlaybackPercentage < 48.0 )
|
|
|
|
bOpenGateTriggered = TRUE
|
|
|
|
ELIF ( fPlaybackPercentage > 48.0 )
|
|
|
|
IF ( bSmoothCloseGateTriggered = FALSE )
|
|
|
|
//make the van be damaged by anything and any ped after it has got past the gate
|
|
IF IS_VEHICLE_DRIVEABLE(vsEnemyVans[0].VehicleIndex)
|
|
SET_ENTITY_INVINCIBLE(vsEnemyVans[0].VehicleIndex, FALSE)
|
|
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(vsEnemyVans[0].VehicleIndex, FALSE)
|
|
SET_VEHICLE_CAN_BE_VISIBLY_DAMAGED(vsEnemyVans[0].VehicleIndex, TRUE)
|
|
|
|
IF DOES_ENTITY_EXIST(esVanEnemies[0].PedIndex)
|
|
IF NOT IS_ENTITY_DEAD(esVanEnemies[0].PedIndex)
|
|
SET_ENTITY_INVINCIBLE(esVanEnemies[0].PedIndex, FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
IF DOES_ENTITY_EXIST(esVanEnemies[1].PedIndex)
|
|
IF NOT IS_ENTITY_DEAD(esVanEnemies[1].PedIndex)
|
|
SET_ENTITY_INVINCIBLE(esVanEnemies[1].PedIndex, FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
IF DOES_ENTITY_EXIST(esVanEnemies[2].PedIndex)
|
|
IF NOT IS_ENTITY_DEAD(esVanEnemies[2].PedIndex)
|
|
SET_ENTITY_INVINCIBLE(esVanEnemies[2].PedIndex, FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
IF DOES_ENTITY_EXIST(esVanEnemies[3].PedIndex)
|
|
IF NOT IS_ENTITY_DEAD(esVanEnemies[3].PedIndex)
|
|
SET_ENTITY_INVINCIBLE(esVanEnemies[3].PedIndex, FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
bSmoothCloseGateTriggered = TRUE
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
|
|
IF ( fPlaybackPercentage > 97.0 )
|
|
|
|
IF ( esVanEnemies[0].bHasTask = FALSE )
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(vsEnemyVans[0].VehicleIndex)
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(vsEnemyVans[0].VehicleIndex)
|
|
ENDIF
|
|
|
|
esVanEnemies[0].bHasTask = TRUE
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
//if driver was killed during a playback was going on
|
|
//make the peds leave the vehicle and reset the dead driver flag
|
|
//to make IS_VEHICLE_RECORDING_PLAYBACK_RUNNING_OR_DRIVER_DEAD() keep returning FALSE next frame
|
|
IF ( vsEnemyVans[0].bDriverDead = TRUE )
|
|
vsEnemyVans[0].bDriverDead = FALSE
|
|
ENDIF
|
|
|
|
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(vsEnemyVans[0].VehicleIndex, PLAYER_PED_ID())
|
|
bPlayerDetected = TRUE
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Player damaged enemy van 0 during recording playback. Setting bPlayerDetected to TRUE.")
|
|
#ENDIF
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
iProgress++
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 2 //play the van exit animation
|
|
|
|
REQUEST_ANIM_DICT("missmic1ig_2")
|
|
|
|
IF HAS_ANIM_DICT_LOADED("missmic1ig_2")
|
|
|
|
IF NOT IS_ENTITY_DEAD(vsEnemyVans[0].VehicleIndex)
|
|
|
|
IF ( bPlayerDetected = FALSE )
|
|
|
|
VECTOR vVanPosition
|
|
VECTOR vVanRotation
|
|
|
|
vVanPosition = GET_ENTITY_COORDS(vsEnemyVans[0].VehicleIndex)
|
|
vVanRotation = GET_ENTITY_ROTATION(vsEnemyVans[0].VehicleIndex)
|
|
|
|
IF NOT IS_ENTITY_DEAD(esVanEnemies[0].PedIndex)
|
|
CLEAR_PED_TASKS_IMMEDIATELY(esVanEnemies[0].PedIndex)
|
|
EQUIP_PED_BEST_WEAPON(esVanEnemies[0].PedIndex, TRUE)
|
|
SET_ENTITY_NO_COLLISION_ENTITY(esVanEnemies[0].PedIndex, vsEnemyVans[0].VehicleIndex, TRUE)
|
|
TASK_PLAY_ANIM_ADVANCED(esVanEnemies[0].PedIndex, "missmic1ig_2", "jump_out_peda", vVanPosition, vVanRotation,
|
|
SLOW_BLEND_IN, SLOW_BLEND_OUT, -1,
|
|
AF_EXTRACT_INITIAL_OFFSET | AF_NOT_INTERRUPTABLE)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(esVanEnemies[0].PedIndex)
|
|
SET_RAGDOLL_BLOCKING_FLAGS(esVanEnemies[0].PedIndex, RBF_BULLET_IMPACT)
|
|
SET_RAGDOLL_BLOCKING_FLAGS(esVanEnemies[0].PedIndex, RBF_PLAYER_IMPACT)
|
|
SET_RAGDOLL_BLOCKING_FLAGS(esVanEnemies[0].PedIndex, RBF_ALLOW_BLOCK_DEAD_PED)
|
|
|
|
GO_TO_ENEMY_STATE(esVanEnemies[0], ENEMY_STATE_SCRIPTED_ENTRY)
|
|
esVanEnemies[0].iProgress = 0
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_DEAD(esVanEnemies[1].PedIndex)
|
|
CLEAR_PED_TASKS_IMMEDIATELY(esVanEnemies[1].PedIndex)
|
|
EQUIP_PED_BEST_WEAPON(esVanEnemies[1].PedIndex, TRUE)
|
|
SET_ENTITY_NO_COLLISION_ENTITY(esVanEnemies[1].PedIndex, vsEnemyVans[0].VehicleIndex, TRUE)
|
|
TASK_PLAY_ANIM_ADVANCED(esVanEnemies[1].PedIndex, "missmic1ig_2", "jump_out_pedb", vVanPosition, vVanRotation,
|
|
SLOW_BLEND_IN, SLOW_BLEND_OUT, -1,
|
|
AF_EXTRACT_INITIAL_OFFSET | AF_NOT_INTERRUPTABLE)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(esVanEnemies[1].PedIndex)
|
|
SET_RAGDOLL_BLOCKING_FLAGS(esVanEnemies[1].PedIndex, RBF_BULLET_IMPACT)
|
|
SET_RAGDOLL_BLOCKING_FLAGS(esVanEnemies[1].PedIndex, RBF_PLAYER_IMPACT)
|
|
SET_RAGDOLL_BLOCKING_FLAGS(esVanEnemies[1].PedIndex, RBF_ALLOW_BLOCK_DEAD_PED)
|
|
|
|
GO_TO_ENEMY_STATE(esVanEnemies[1], ENEMY_STATE_SCRIPTED_ENTRY)
|
|
esVanEnemies[1].iProgress = 0
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_DEAD(esVanEnemies[2].PedIndex)
|
|
CLEAR_PED_TASKS_IMMEDIATELY(esVanEnemies[2].PedIndex)
|
|
EQUIP_PED_BEST_WEAPON(esVanEnemies[2].PedIndex, TRUE)
|
|
SET_ENTITY_NO_COLLISION_ENTITY(esVanEnemies[2].PedIndex, vsEnemyVans[0].VehicleIndex, TRUE)
|
|
TASK_PLAY_ANIM_ADVANCED(esVanEnemies[2].PedIndex, "missmic1ig_2", "jump_out_pedc", vVanPosition, vVanRotation,
|
|
SLOW_BLEND_IN, SLOW_BLEND_OUT, -1,
|
|
AF_EXTRACT_INITIAL_OFFSET | AF_NOT_INTERRUPTABLE | AF_HOLD_LAST_FRAME)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(esVanEnemies[2].PedIndex)
|
|
SET_RAGDOLL_BLOCKING_FLAGS(esVanEnemies[2].PedIndex, RBF_BULLET_IMPACT)
|
|
SET_RAGDOLL_BLOCKING_FLAGS(esVanEnemies[2].PedIndex, RBF_PLAYER_IMPACT)
|
|
SET_RAGDOLL_BLOCKING_FLAGS(esVanEnemies[2].PedIndex, RBF_ALLOW_BLOCK_DEAD_PED)
|
|
|
|
GO_TO_ENEMY_STATE(esVanEnemies[2], ENEMY_STATE_SCRIPTED_ENTRY)
|
|
esVanEnemies[2].iProgress = 0
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_DEAD(esVanEnemies[3].PedIndex)
|
|
CLEAR_PED_TASKS_IMMEDIATELY(esVanEnemies[3].PedIndex)
|
|
EQUIP_PED_BEST_WEAPON(esVanEnemies[3].PedIndex, TRUE)
|
|
SET_ENTITY_NO_COLLISION_ENTITY(esVanEnemies[3].PedIndex, vsEnemyVans[0].VehicleIndex, TRUE)
|
|
TASK_PLAY_ANIM_ADVANCED(esVanEnemies[3].PedIndex, "missmic1ig_2", "jump_out_pedd", vVanPosition, vVanRotation,
|
|
SLOW_BLEND_IN, SLOW_BLEND_OUT, -1,
|
|
AF_EXTRACT_INITIAL_OFFSET | AF_NOT_INTERRUPTABLE)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(esVanEnemies[3].PedIndex)
|
|
SET_RAGDOLL_BLOCKING_FLAGS(esVanEnemies[3].PedIndex, RBF_BULLET_IMPACT)
|
|
SET_RAGDOLL_BLOCKING_FLAGS(esVanEnemies[3].PedIndex, RBF_PLAYER_IMPACT)
|
|
SET_RAGDOLL_BLOCKING_FLAGS(esVanEnemies[3].PedIndex, RBF_ALLOW_BLOCK_DEAD_PED)
|
|
|
|
GO_TO_ENEMY_STATE(esVanEnemies[3], ENEMY_STATE_SCRIPTED_ENTRY)
|
|
esVanEnemies[3].iProgress = 0
|
|
ENDIF
|
|
|
|
//lower the health a bit when enemies start coming out
|
|
SET_ENTITY_HEALTH(vsEnemyVans[0].VehicleIndex, CLAMP_INT(GET_ENTITY_HEALTH(vsEnemyVans[0].VehicleIndex) - 100, 400, 700))
|
|
|
|
//make the van no longer targetable
|
|
SET_VEHICLE_CAN_BE_TARGETTED(vsEnemyVans[0].VehicleIndex, FALSE)
|
|
|
|
ELSE
|
|
|
|
GO_TO_ENEMY_STATE(esVanEnemies[0], ENEMY_STATE_COMBAT)
|
|
GO_TO_ENEMY_STATE(esVanEnemies[1], ENEMY_STATE_COMBAT)
|
|
GO_TO_ENEMY_STATE(esVanEnemies[2], ENEMY_STATE_COMBAT)
|
|
GO_TO_ENEMY_STATE(esVanEnemies[3], ENEMY_STATE_COMBAT)
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
STOP_AUDIO_SCENE("MI_1_VAN_ARRIVES_01")
|
|
IF IS_VEHICLE_DRIVEABLE(vsEnemyVans[0].VehicleIndex)
|
|
REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(vsEnemyVans[0].VehicleIndex)
|
|
ENDIF
|
|
|
|
iProgress++
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 3 //update enemies
|
|
|
|
//block enemy weapon fire until the 'player detected' conversation plays out
|
|
IF ( bPlayerDetected = FALSE )
|
|
BLOCK_WEAPON_FIRE_FOR_ENEMY_GROUP(esVanEnemies)
|
|
ELIF ( bPlayerDetected = TRUE )
|
|
IF ( bDetectedConversationPlaying = TRUE )
|
|
BLOCK_WEAPON_FIRE_FOR_ENEMY_GROUP(esVanEnemies)
|
|
ENDIF
|
|
IF ( bReplayStopEventTriggered = FALSE )
|
|
REPLAY_STOP_EVENT()
|
|
bReplayStopEventTriggered = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(esVanEnemies[0].PedIndex)
|
|
IF NOT IS_ENTITY_DEAD(esVanEnemies[0].PedIndex)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
DRAW_DEBUG_TEXT_ABOVE_ENTITY(esVanEnemies[0].PedIndex, GET_ENEMY_STATE_NAME_FOR_DEBUG(esVanEnemies[0].eState), 1.25)
|
|
esVanEnemies[0].sDebugName = "VanEnemy 0"
|
|
#ENDIF
|
|
|
|
SWITCH esVanEnemies[0].eState
|
|
|
|
CASE ENEMY_STATE_SCRIPTED_ENTRY
|
|
|
|
SWITCH esVanEnemies[0].iProgress
|
|
|
|
CASE 0
|
|
|
|
IF IS_ENTITY_PLAYING_ANIM(esVanEnemies[0].PedIndex, "missmic1ig_2", "jump_out_peda")
|
|
IF HAS_ANIM_EVENT_FIRED(esVanEnemies[0].PedIndex, GET_HASH_KEY("door"))
|
|
IF NOT IS_ENTITY_DEAD(vsEnemyVans[0].VehicleIndex)
|
|
SET_VEHICLE_DOOR_OPEN(vsEnemyVans[0].VehicleIndex, SC_DOOR_FRONT_LEFT)
|
|
bPlayVanOpenConversation = TRUE
|
|
esVanEnemies[0].iProgress++
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 1
|
|
|
|
IF IS_ENTITY_PLAYING_ANIM(esVanEnemies[0].PedIndex, "missmic1ig_2", "jump_out_peda")
|
|
IF ( GET_ENTITY_ANIM_CURRENT_TIME(esVanEnemies[0].PedIndex, "missmic1ig_2", "jump_out_peda") > 0.975 )
|
|
esVanEnemies[0].bHasTask = FALSE
|
|
esVanEnemies[0].iProgress++
|
|
ELSE
|
|
IF ( GET_ENTITY_ANIM_CURRENT_TIME(esVanEnemies[0].PedIndex, "missmic1ig_2", "jump_out_peda") > 0.4 )
|
|
|
|
CLEAR_RAGDOLL_BLOCKING_FLAGS(esVanEnemies[0].PedIndex, RBF_BULLET_IMPACT)
|
|
CLEAR_RAGDOLL_BLOCKING_FLAGS(esVanEnemies[0].PedIndex, RBF_PLAYER_IMPACT)
|
|
CLEAR_RAGDOLL_BLOCKING_FLAGS(esVanEnemies[0].PedIndex, RBF_ALLOW_BLOCK_DEAD_PED)
|
|
|
|
IF ( GET_DISTANCE_BETWEEN_PEDS(esVanEnemies[0].PedIndex, PLAYER_PED_ID()) < 5.0 )
|
|
AND CAN_PED_SEE_HATED_PED(esVanEnemies[0].PedIndex, PLAYER_PED_ID())
|
|
GO_TO_ENEMY_STATE(esVanEnemies[0], ENEMY_STATE_COMBAT)
|
|
esVanEnemies[0].iProgress = 0
|
|
ENDIF
|
|
IF IS_ENTITY_TOUCHING_ENTITY(esVanEnemies[0].PedIndex, PLAYER_PED_ID())
|
|
OR HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(esVanEnemies[0].PedIndex, PLAYER_PED_ID())
|
|
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(esVanEnemies[0].PedIndex)
|
|
GO_TO_ENEMY_STATE(esVanEnemies[0], ENEMY_STATE_COMBAT)
|
|
bPlayerDetected = TRUE //set the player detected flag to true here for other peds to react
|
|
esVanEnemies[0].iProgress = 0
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 2
|
|
|
|
IF ( esVanEnemies[0].bHasTask = FALSE )
|
|
TASK_PUT_PED_DIRECTLY_INTO_COVER(esVanEnemies[0].PedIndex, csCoverpoints[28].vPosition, -1, FALSE, 0, TRUE, TRUE, csCoverpoints[28].CoverpointIndex)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(esVanEnemies[0].PedIndex, FALSE)
|
|
esVanEnemies[0].iTimer = GET_GAME_TIMER()
|
|
esVanEnemies[0].bHasTask = TRUE
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
IF IS_PED_IN_COMBAT(esVanEnemies[0].PedIndex)
|
|
OR HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(esVanEnemies[0].PedIndex, PLAYER_PED_ID())
|
|
OR ( bPlayerDetected = TRUE )
|
|
IF NOT IS_ENTITY_PLAYING_ANIM(esVanEnemies[0].PedIndex, "missmic1ig_2", "jump_out_peda")
|
|
OR ( IS_ENTITY_PLAYING_ANIM(esVanEnemies[0].PedIndex, "missmic1ig_2", "jump_out_peda")
|
|
AND GET_ENTITY_ANIM_CURRENT_TIME(esVanEnemies[0].PedIndex, "missmic1ig_2", "jump_out_peda") > 0.4 )
|
|
|
|
CLEAR_RAGDOLL_BLOCKING_FLAGS(esVanEnemies[0].PedIndex, RBF_BULLET_IMPACT)
|
|
CLEAR_RAGDOLL_BLOCKING_FLAGS(esVanEnemies[0].PedIndex, RBF_PLAYER_IMPACT)
|
|
CLEAR_RAGDOLL_BLOCKING_FLAGS(esVanEnemies[0].PedIndex, RBF_ALLOW_BLOCK_DEAD_PED)
|
|
|
|
GO_TO_ENEMY_STATE(esVanEnemies[0], ENEMY_STATE_COMBAT)
|
|
esVanEnemies[0].iProgress = 0
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF ( bPlayerDetected = FALSE )
|
|
IF DOES_ENTITY_EXIST(vsEnemyVans[0].VehicleIndex)
|
|
IF NOT IS_ENTITY_DEAD(vsEnemyVans[0].VehicleIndex)
|
|
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(vsEnemyVans[0].VehicleIndex, PLAYER_PED_ID())
|
|
OR IS_PED_SHOOTING_AT_AREA(PLAYER_PED_ID(), TRUE, GET_ENTITY_COORDS(vsEnemyVans[0].VehicleIndex), 4.0 #IF IS_DEBUG_BUILD, TRUE #ENDIF)
|
|
bPlayerDetected = TRUE
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Player shot at enemy van 0 during scripted entry state. Setting bPlayerDetected to TRUE.")
|
|
#ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE ENEMY_STATE_COMBAT
|
|
|
|
IF ( esVanEnemies[0].bHasTask = FALSE )
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esVanEnemies[0].PedIndex, 100.0)
|
|
SET_PED_COMBAT_PROPERTIES(esVanEnemies[0].PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_FAR, CA_USE_COVER)
|
|
SET_PED_COMBAT_ATTRIBUTES(esVanEnemies[0].PedIndex, CA_CAN_USE_FRUSTRATED_ADVANCE, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(esVanEnemies[0].PedIndex, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
|
|
SET_PED_DEFENSIVE_AREA_SPHERE(esVanEnemies[0].PedIndex, << 3266.66, -4615.01, 115.07 >>, 2.75)
|
|
SET_PED_COMBAT_MOVEMENT_VALUES(esVanEnemies[0].PedIndex, 1.0, 1.0)
|
|
SET_PED_COVER_PROPERTIES(esVanEnemies[0].PedIndex, TRUE, FALSE, FALSE, FALSE, 6.0, FALSE, 0.0, 2.5)
|
|
//SET_PED_PREFERRED_COVERPOINT(esVanEnemies[0].PedIndex, esVanEnemies[0].ItemsetIndex, csCoverpoints[28].CoverpointIndex)
|
|
SET_PED_SHOOTING_PROPERTIES(esVanEnemies[0].PedIndex, 4)
|
|
SET_PED_VISUAL_FIELD_PROPERTIES(esVanEnemies[0].PedIndex) //restore ped's default seeing values
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(esVanEnemies[0].PedIndex, FALSE)
|
|
|
|
bPlayerDetected = TRUE
|
|
|
|
esVanEnemies[0].bHasTask = TRUE
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
ELSE
|
|
|
|
IF IS_ENTITY_PLAYING_ANIM(esVanEnemies[0].PedIndex, "missmic1ig_2", "jump_out_peda")
|
|
AND GET_ENTITY_ANIM_CURRENT_TIME(esVanEnemies[0].PedIndex, "missmic1ig_2", "jump_out_peda") > 0.399
|
|
STOP_ANIM_PLAYBACK(esVanEnemies[0].PedIndex)
|
|
SET_HIGH_FALL_TASK(esVanEnemies[0].PedIndex, 2000, 10000)
|
|
APPLY_FORCE_TO_ENTITY(esVanEnemies[0].PedIndex, APPLY_TYPE_IMPULSE, << 0.0, 5.0, 0.0 >>, << 0.0, 0.0, 0.0 >>, 0, TRUE, TRUE, FALSE)
|
|
ENDIF
|
|
|
|
IF ( bPlayerDetected = FALSE )
|
|
IF ( esVanEnemies[0].eState = ENEMY_STATE_SCRIPTED_ENTRY )
|
|
IF DOES_ENTITY_EXIST(GET_PED_SOURCE_OF_DEATH(esVanEnemies[0].PedIndex))
|
|
IF ( GET_PED_INDEX_FROM_ENTITY_INDEX(GET_PED_SOURCE_OF_DEATH(esVanEnemies[0].PedIndex)) = PLAYER_PED_ID() )
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Player detected for killing ", esVanEnemies[0].sDebugName, " in scripted entry state.")
|
|
#ENDIF
|
|
bPlayerDetected = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_PLAYING_ANIM(esVanEnemies[0].PedIndex, "missmic1ig_2", "jump_out_peda")
|
|
CLEANUP_ENEMY_PED(esVanEnemies[0])
|
|
ENDIF
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(esVanEnemies[1].PedIndex)
|
|
IF NOT IS_ENTITY_DEAD(esVanEnemies[1].PedIndex)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
DRAW_DEBUG_TEXT_ABOVE_ENTITY(esVanEnemies[1].PedIndex, GET_ENEMY_STATE_NAME_FOR_DEBUG(esVanEnemies[1].eState), 1.25)
|
|
esVanEnemies[1].sDebugName = "VanEnemy 1"
|
|
#ENDIF
|
|
|
|
SWITCH esVanEnemies[1].eState
|
|
|
|
CASE ENEMY_STATE_SCRIPTED_ENTRY
|
|
|
|
SWITCH esVanEnemies[1].iProgress
|
|
|
|
CASE 0
|
|
|
|
IF IS_ENTITY_PLAYING_ANIM(esVanEnemies[1].PedIndex, "missmic1ig_2", "jump_out_pedb")
|
|
IF HAS_ANIM_EVENT_FIRED(esVanEnemies[1].PedIndex, GET_HASH_KEY("door"))
|
|
IF NOT IS_ENTITY_DEAD(vsEnemyVans[0].VehicleIndex)
|
|
SET_VEHICLE_DOOR_OPEN(vsEnemyVans[0].VehicleIndex, SC_DOOR_FRONT_RIGHT)
|
|
bPlayVanOpenConversation = TRUE
|
|
esVanEnemies[1].iProgress++
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1
|
|
|
|
IF IS_ENTITY_PLAYING_ANIM(esVanEnemies[1].PedIndex, "missmic1ig_2", "jump_out_pedb")
|
|
IF ( GET_ENTITY_ANIM_CURRENT_TIME(esVanEnemies[1].PedIndex, "missmic1ig_2", "jump_out_pedb") > 0.95 )
|
|
esVanEnemies[1].bHasTask = FALSE
|
|
esVanEnemies[1].iProgress++
|
|
ELSE
|
|
IF ( GET_ENTITY_ANIM_CURRENT_TIME(esVanEnemies[1].PedIndex, "missmic1ig_2", "jump_out_pedb") > 0.185 )
|
|
|
|
CLEAR_RAGDOLL_BLOCKING_FLAGS(esVanEnemies[1].PedIndex, RBF_BULLET_IMPACT)
|
|
CLEAR_RAGDOLL_BLOCKING_FLAGS(esVanEnemies[1].PedIndex, RBF_PLAYER_IMPACT)
|
|
CLEAR_RAGDOLL_BLOCKING_FLAGS(esVanEnemies[1].PedIndex, RBF_ALLOW_BLOCK_DEAD_PED)
|
|
|
|
IF ( GET_DISTANCE_BETWEEN_PEDS(esVanEnemies[1].PedIndex, PLAYER_PED_ID()) < 5.0 )
|
|
AND CAN_PED_SEE_HATED_PED(esVanEnemies[1].PedIndex, PLAYER_PED_ID())
|
|
GO_TO_ENEMY_STATE(esVanEnemies[1], ENEMY_STATE_COMBAT)
|
|
esVanEnemies[1].iProgress = 0
|
|
ENDIF
|
|
IF IS_ENTITY_TOUCHING_ENTITY(esVanEnemies[1].PedIndex, PLAYER_PED_ID())
|
|
OR HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(esVanEnemies[1].PedIndex, PLAYER_PED_ID())
|
|
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(esVanEnemies[1].PedIndex)
|
|
GO_TO_ENEMY_STATE(esVanEnemies[1], ENEMY_STATE_COMBAT)
|
|
bPlayerDetected = TRUE //set the player detected flag to true here for other peds to react
|
|
esVanEnemies[1].iProgress = 0
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 2
|
|
|
|
//make ped stay move to the pillar cover while aiming
|
|
IF ( esVanEnemies[1].bHasTask = FALSE )
|
|
SEQUENCE_INDEX SequenceIndex
|
|
OPEN_SEQUENCE_TASK(SequenceIndex)
|
|
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, csCoverpoints[2].vPosition, << 3254.10, -4587.78, 118.05 >>, PEDMOVE_SLOWWALK, FALSE, 1.0, 0.0, TRUE, ENAV_NO_STOPPING)
|
|
TASK_PUT_PED_DIRECTLY_INTO_COVER(NULL, csCoverpoints[2].vPosition, -1, TRUE, 0.25, TRUE, FALSE, csCoverpoints[2].CoverpointIndex, TRUE)
|
|
CLOSE_SEQUENCE_TASK(SequenceIndex)
|
|
TASK_PERFORM_SEQUENCE(esVanEnemies[1].PedIndex, SequenceIndex)
|
|
CLEAR_SEQUENCE_TASK(SequenceIndex)
|
|
SET_PED_COMBAT_PROPERTIES(esVanEnemies[1].PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_FAR, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED)
|
|
SET_PED_DEFENSIVE_AREA_SPHERE(esVanEnemies[1].PedIndex, << 3252.73, -4600.65, 115.64 >>, 1.5)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(esVanEnemies[1].PedIndex, FALSE)
|
|
esVanEnemies[1].iTimer = GET_GAME_TIMER()
|
|
esVanEnemies[1].bHasTask = TRUE
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
IF IS_PED_IN_COMBAT(esVanEnemies[1].PedIndex)
|
|
OR HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(esVanEnemies[1].PedIndex, PLAYER_PED_ID())
|
|
OR ( bPlayerDetected = TRUE )
|
|
IF NOT IS_ENTITY_PLAYING_ANIM(esVanEnemies[1].PedIndex, "missmic1ig_2", "jump_out_pedb")
|
|
OR ( IS_ENTITY_PLAYING_ANIM(esVanEnemies[1].PedIndex, "missmic1ig_2", "jump_out_pedb")
|
|
AND GET_ENTITY_ANIM_CURRENT_TIME(esVanEnemies[1].PedIndex, "missmic1ig_2", "jump_out_pedb") > 0.185 )
|
|
|
|
CLEAR_RAGDOLL_BLOCKING_FLAGS(esVanEnemies[1].PedIndex, RBF_BULLET_IMPACT)
|
|
CLEAR_RAGDOLL_BLOCKING_FLAGS(esVanEnemies[1].PedIndex, RBF_PLAYER_IMPACT)
|
|
CLEAR_RAGDOLL_BLOCKING_FLAGS(esVanEnemies[1].PedIndex, RBF_ALLOW_BLOCK_DEAD_PED)
|
|
|
|
GO_TO_ENEMY_STATE(esVanEnemies[1], ENEMY_STATE_COMBAT)
|
|
esVanEnemies[1].iProgress = 0
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF ( bPlayerDetected = FALSE )
|
|
IF DOES_ENTITY_EXIST(vsEnemyVans[0].VehicleIndex)
|
|
IF NOT IS_ENTITY_DEAD(vsEnemyVans[0].VehicleIndex)
|
|
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(vsEnemyVans[0].VehicleIndex, PLAYER_PED_ID())
|
|
OR IS_PED_SHOOTING_AT_AREA(PLAYER_PED_ID(), TRUE, GET_ENTITY_COORDS(vsEnemyVans[0].VehicleIndex), 4.0 #IF IS_DEBUG_BUILD, TRUE #ENDIF)
|
|
bPlayerDetected = TRUE
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Player shot at enemy van 0 during scripted entry state. Setting bPlayerDetected to TRUE.")
|
|
#ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE ENEMY_STATE_COMBAT
|
|
|
|
IF ( esVanEnemies[1].bHasTask = FALSE )
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esVanEnemies[1].PedIndex, 100.0)
|
|
SET_PED_COMBAT_PROPERTIES(esVanEnemies[1].PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED)
|
|
SET_PED_DEFENSIVE_AREA_SPHERE(esVanEnemies[1].PedIndex, << 3252.73, -4600.65, 115.64 >>, 1.5)
|
|
SET_PED_SHOOTING_PROPERTIES(esVanEnemies[1].PedIndex, 4)
|
|
SET_PED_COMBAT_ATTRIBUTES(esVanEnemies[1].PedIndex, CA_CAN_CHARGE, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(esVanEnemies[1].PedIndex, CA_CAN_USE_FRUSTRATED_ADVANCE, TRUE)
|
|
SET_COMBAT_FLOAT(esVanEnemies[1].PedIndex, CCF_BLIND_FIRE_CHANCE, 0.05)
|
|
SET_PED_VISUAL_FIELD_PROPERTIES(esVanEnemies[1].PedIndex) //restore ped's default seeing values
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(esVanEnemies[1].PedIndex, FALSE)
|
|
bPlayerDetected = TRUE
|
|
esVanEnemies[1].bHasTask = TRUE
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
ELSE
|
|
|
|
IF IS_ENTITY_PLAYING_ANIM(esVanEnemies[1].PedIndex, "missmic1ig_2", "jump_out_pedb")
|
|
AND GET_ENTITY_ANIM_CURRENT_TIME(esVanEnemies[1].PedIndex, "missmic1ig_2", "jump_out_pedb") > 0.165
|
|
STOP_ANIM_PLAYBACK(esVanEnemies[1].PedIndex)
|
|
SET_HIGH_FALL_TASK(esVanEnemies[1].PedIndex, 2000, 10000)
|
|
APPLY_FORCE_TO_ENTITY(esVanEnemies[1].PedIndex, APPLY_TYPE_IMPULSE, << 0.0, 5.0, 0.0 >>, << 0.0, 0.0, 0.0 >>, 0, TRUE, TRUE, FALSE)
|
|
ENDIF
|
|
|
|
IF ( bPlayerDetected = FALSE )
|
|
IF ( esVanEnemies[1].eState = ENEMY_STATE_SCRIPTED_ENTRY )
|
|
IF DOES_ENTITY_EXIST(GET_PED_SOURCE_OF_DEATH(esVanEnemies[1].PedIndex))
|
|
IF ( GET_PED_INDEX_FROM_ENTITY_INDEX(GET_PED_SOURCE_OF_DEATH(esVanEnemies[1].PedIndex)) = PLAYER_PED_ID() )
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Player detected for killing ", esVanEnemies[1].sDebugName, " in scripted entry state.")
|
|
#ENDIF
|
|
bPlayerDetected = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_PLAYING_ANIM(esVanEnemies[1].PedIndex, "missmic1ig_2", "jump_out_pedb")
|
|
CLEANUP_ENEMY_PED(esVanEnemies[1])
|
|
ENDIF
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(esVanEnemies[2].PedIndex)
|
|
IF NOT IS_ENTITY_DEAD(esVanEnemies[2].PedIndex)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
DRAW_DEBUG_TEXT_ABOVE_ENTITY(esVanEnemies[2].PedIndex, GET_ENEMY_STATE_NAME_FOR_DEBUG(esVanEnemies[2].eState), 1.25)
|
|
esVanEnemies[2].sDebugName = "VanEnemy 2"
|
|
#ENDIF
|
|
|
|
SWITCH esVanEnemies[2].eState
|
|
|
|
CASE ENEMY_STATE_SCRIPTED_ENTRY
|
|
|
|
SWITCH esVanEnemies[2].iProgress
|
|
|
|
CASE 0
|
|
|
|
IF IS_ENTITY_PLAYING_ANIM(esVanEnemies[2].PedIndex, "missmic1ig_2", "jump_out_pedc")
|
|
IF HAS_ANIM_EVENT_FIRED(esVanEnemies[2].PedIndex, GET_HASH_KEY("door"))
|
|
IF NOT IS_ENTITY_DEAD(vsEnemyVans[0].VehicleIndex)
|
|
SET_VEHICLE_DOOR_OPEN(vsEnemyVans[0].VehicleIndex, SC_DOOR_REAR_LEFT)
|
|
bPlayVanOpenConversation = TRUE
|
|
esVanEnemies[2].iProgress++
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 1
|
|
|
|
IF IS_ENTITY_PLAYING_ANIM(esVanEnemies[2].PedIndex, "missmic1ig_2", "jump_out_pedc")
|
|
|
|
SET_PED_RESET_FLAG(esVanEnemies[2].PedIndex, PRF_InstantBlendToAim, TRUE)
|
|
|
|
IF ( GET_ENTITY_ANIM_CURRENT_TIME(esVanEnemies[2].PedIndex, "missmic1ig_2", "jump_out_pedc") > 0.925 )
|
|
esVanEnemies[2].bHasTask = FALSE
|
|
esVanEnemies[2].iProgress++
|
|
ELSE
|
|
IF ( GET_ENTITY_ANIM_CURRENT_TIME(esVanEnemies[2].PedIndex, "missmic1ig_2", "jump_out_pedc") > 0.585 )
|
|
|
|
CLEAR_RAGDOLL_BLOCKING_FLAGS(esVanEnemies[2].PedIndex, RBF_BULLET_IMPACT)
|
|
CLEAR_RAGDOLL_BLOCKING_FLAGS(esVanEnemies[2].PedIndex, RBF_PLAYER_IMPACT)
|
|
CLEAR_RAGDOLL_BLOCKING_FLAGS(esVanEnemies[2].PedIndex, RBF_ALLOW_BLOCK_DEAD_PED)
|
|
|
|
IF ( GET_DISTANCE_BETWEEN_PEDS(esVanEnemies[2].PedIndex, PLAYER_PED_ID()) < 5.0 )
|
|
AND CAN_PED_SEE_HATED_PED(esVanEnemies[2].PedIndex, PLAYER_PED_ID())
|
|
GO_TO_ENEMY_STATE(esVanEnemies[2], ENEMY_STATE_COMBAT)
|
|
esVanEnemies[2].iProgress = 0
|
|
ENDIF
|
|
IF IS_ENTITY_TOUCHING_ENTITY(esVanEnemies[2].PedIndex, PLAYER_PED_ID())
|
|
OR HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(esVanEnemies[2].PedIndex, PLAYER_PED_ID())
|
|
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(esVanEnemies[2].PedIndex)
|
|
GO_TO_ENEMY_STATE(esVanEnemies[2], ENEMY_STATE_COMBAT)
|
|
bPlayerDetected = TRUE //set the player detected flag to true here for other peds to react
|
|
esVanEnemies[2].iProgress = 0
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 2
|
|
|
|
SET_PED_RESET_FLAG(esVanEnemies[2].PedIndex, PRF_InstantBlendToAim, TRUE)
|
|
|
|
IF ( esVanEnemies[2].bHasTask = FALSE )
|
|
COMBAT_SEQUENCE_GO_TO_COORD_WHILE_AIMING_THEN_COMBAT(esVanEnemies[2].PedIndex, << 3260.40, -4605.49, 115.50 >>, PEDMOVE_SLOWWALK, FALSE, << 3264.06, -4588.00, 116.88 >>, NULL, FALSE, FALSE, FALSE, -1)
|
|
esVanEnemies[2].iTimer = GET_GAME_TIMER()
|
|
esVanEnemies[2].bHasTask = TRUE
|
|
ENDIF
|
|
|
|
IF HAS_TIME_PASSED(750, esVanEnemies[2].iTimer)
|
|
bPlayVanExitConversation = TRUE
|
|
ENDIF
|
|
|
|
IF HAS_TIME_PASSED(6000, esVanEnemies[2].iTimer)
|
|
GO_TO_ENEMY_STATE(esVanEnemies[2], ENEMY_STATE_STANDING_AT_LOCATION)
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
IF IS_PED_IN_COMBAT(esVanEnemies[2].PedIndex)
|
|
OR HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(esVanEnemies[2].PedIndex, PLAYER_PED_ID())
|
|
OR ( bPlayerDetected = TRUE )
|
|
IF NOT IS_ENTITY_PLAYING_ANIM(esVanEnemies[2].PedIndex, "missmic1ig_2", "jump_out_pedc")
|
|
OR ( IS_ENTITY_PLAYING_ANIM(esVanEnemies[2].PedIndex, "missmic1ig_2", "jump_out_pedc")
|
|
AND GET_ENTITY_ANIM_CURRENT_TIME(esVanEnemies[2].PedIndex, "missmic1ig_2", "jump_out_pedc") > 0.585 )
|
|
|
|
CLEAR_RAGDOLL_BLOCKING_FLAGS(esVanEnemies[2].PedIndex, RBF_BULLET_IMPACT)
|
|
CLEAR_RAGDOLL_BLOCKING_FLAGS(esVanEnemies[2].PedIndex, RBF_PLAYER_IMPACT)
|
|
CLEAR_RAGDOLL_BLOCKING_FLAGS(esVanEnemies[2].PedIndex, RBF_ALLOW_BLOCK_DEAD_PED)
|
|
|
|
GO_TO_ENEMY_STATE(esVanEnemies[2], ENEMY_STATE_COMBAT)
|
|
esVanEnemies[2].iProgress = 0
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF ( bPlayerDetected = FALSE )
|
|
IF DOES_ENTITY_EXIST(vsEnemyVans[0].VehicleIndex)
|
|
IF NOT IS_ENTITY_DEAD(vsEnemyVans[0].VehicleIndex)
|
|
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(vsEnemyVans[0].VehicleIndex, PLAYER_PED_ID())
|
|
OR IS_PED_SHOOTING_AT_AREA(PLAYER_PED_ID(), TRUE, GET_ENTITY_COORDS(vsEnemyVans[0].VehicleIndex), 4.0 #IF IS_DEBUG_BUILD, TRUE #ENDIF)
|
|
bPlayerDetected = TRUE
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Player shot at enemy van 0 during scripted entry state. Setting bPlayerDetected to TRUE.")
|
|
#ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE ENEMY_STATE_STANDING_AT_LOCATION
|
|
|
|
IF ( esVanEnemies[2].bHasTask = FALSE )
|
|
SEQUENCE_INDEX SequenceIndex
|
|
OPEN_SEQUENCE_TASK(SequenceIndex)
|
|
TASK_AIM_GUN_AT_COORD(NULL, << 3264.06, -4588.00, 116.88 >>, 5000, FALSE)
|
|
TASK_AIM_GUN_AT_COORD(NULL, << 3251.02, -4590.45, 117.24 >>, 5000, FALSE)
|
|
TASK_AIM_GUN_AT_COORD(NULL, << 3264.06, -4588.00, 116.88 >>, 5000, FALSE)
|
|
TASK_AIM_GUN_AT_COORD(NULL, << 3272.29, -4590.30, 117.61 >>, 5000, FALSE)
|
|
SET_SEQUENCE_TO_REPEAT(SequenceIndex, REPEAT_FOREVER)
|
|
CLOSE_SEQUENCE_TASK(SequenceIndex)
|
|
TASK_PERFORM_SEQUENCE(esVanEnemies[2].PedIndex, SequenceIndex)
|
|
CLEAR_SEQUENCE_TASK(SequenceIndex)
|
|
esVanEnemies[2].iTimer = GET_GAME_TIMER()
|
|
esVanEnemies[2].bHasTask = TRUE
|
|
ENDIF
|
|
|
|
IF HAS_TIME_PASSED(10000, esVanEnemies[2].iTimer)
|
|
bStartSearching = TRUE
|
|
ENDIF
|
|
|
|
IF IS_PED_IN_COMBAT(esVanEnemies[2].PedIndex)
|
|
OR ( bPlayerDetected = TRUE )
|
|
GO_TO_ENEMY_STATE(esVanEnemies[2], ENEMY_STATE_COMBAT)
|
|
esVanEnemies[2].iProgress = 0
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE ENEMY_STATE_COMBAT
|
|
|
|
IF ( esVanEnemies[2].bHasTask = FALSE )
|
|
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esVanEnemies[2].PedIndex, 100.0)
|
|
SET_PED_COMBAT_PROPERTIES(esVanEnemies[2].PedIndex, CM_WILLADVANCE, CAL_AVERAGE, CR_NEAR, CA_AGGRESSIVE)
|
|
SET_PED_COMBAT_ATTRIBUTES(esVanEnemies[2].PedIndex, CA_CAN_CHARGE, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(esVanEnemies[2].PedIndex, CA_CAN_USE_FRUSTRATED_ADVANCE, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(esVanEnemies[2].PedIndex, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
|
|
REMOVE_PED_DEFENSIVE_AREA(esVanEnemies[2].PedIndex)
|
|
SET_PED_COVER_PROPERTIES(esVanEnemies[2].PedIndex, TRUE)
|
|
SET_PED_SHOOTING_PROPERTIES(esVanEnemies[2].PedIndex, 3)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(esVanEnemies[2].PedIndex, FALSE)
|
|
SET_PED_VISUAL_FIELD_PROPERTIES(esVanEnemies[2].PedIndex) //restore ped's default seeing values
|
|
bPlayerDetected = TRUE
|
|
|
|
esVanEnemies[2].bHasTask = TRUE
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
ELSE
|
|
|
|
IF IS_ENTITY_PLAYING_ANIM(esVanEnemies[2].PedIndex, "missmic1ig_2", "jump_out_pedc")
|
|
AND GET_ENTITY_ANIM_CURRENT_TIME(esVanEnemies[2].PedIndex, "missmic1ig_2", "jump_out_pedc") > 0.51
|
|
STOP_ANIM_PLAYBACK(esVanEnemies[2].PedIndex)
|
|
SET_HIGH_FALL_TASK(esVanEnemies[2].PedIndex, 2000, 10000)
|
|
APPLY_FORCE_TO_ENTITY(esVanEnemies[2].PedIndex, APPLY_TYPE_IMPULSE, << 0.0, 5.0, 0.0 >>, << 0.0, 0.0, 0.0 >>, 0, TRUE, TRUE, FALSE)
|
|
ENDIF
|
|
|
|
IF ( bPlayerDetected = FALSE )
|
|
IF ( esVanEnemies[2].eState = ENEMY_STATE_SCRIPTED_ENTRY )
|
|
IF DOES_ENTITY_EXIST(GET_PED_SOURCE_OF_DEATH(esVanEnemies[2].PedIndex))
|
|
IF ( GET_PED_INDEX_FROM_ENTITY_INDEX(GET_PED_SOURCE_OF_DEATH(esVanEnemies[2].PedIndex)) = PLAYER_PED_ID() )
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Player detected for killing ", esVanEnemies[2].sDebugName, " in scripted entry state.")
|
|
#ENDIF
|
|
bPlayerDetected = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_PLAYING_ANIM(esVanEnemies[2].PedIndex, "missmic1ig_2", "jump_out_pedc")
|
|
CLEANUP_ENEMY_PED(esVanEnemies[2])
|
|
ENDIF
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(esVanEnemies[3].PedIndex)
|
|
IF NOT IS_ENTITY_DEAD(esVanEnemies[3].PedIndex)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
DRAW_DEBUG_TEXT_ABOVE_ENTITY(esVanEnemies[3].PedIndex, GET_ENEMY_STATE_NAME_FOR_DEBUG(esVanEnemies[3].eState), 1.25)
|
|
esVanEnemies[3].sDebugName = "VanEnemy 3"
|
|
#ENDIF
|
|
|
|
SWITCH esVanEnemies[3].eState
|
|
|
|
CASE ENEMY_STATE_SCRIPTED_ENTRY
|
|
|
|
SWITCH esVanEnemies[3].iProgress
|
|
|
|
CASE 0
|
|
|
|
IF IS_ENTITY_PLAYING_ANIM(esVanEnemies[3].PedIndex, "missmic1ig_2", "jump_out_pedd")
|
|
IF HAS_ANIM_EVENT_FIRED(esVanEnemies[3].PedIndex, GET_HASH_KEY("door"))
|
|
IF NOT IS_ENTITY_DEAD(vsEnemyVans[0].VehicleIndex)
|
|
SET_VEHICLE_DOOR_OPEN(vsEnemyVans[0].VehicleIndex, SC_DOOR_REAR_RIGHT)
|
|
bPlayVanOpenConversation = TRUE
|
|
esVanEnemies[3].iProgress++
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 1
|
|
|
|
IF IS_ENTITY_PLAYING_ANIM(esVanEnemies[3].PedIndex, "missmic1ig_2", "jump_out_pedd")
|
|
IF ( GET_ENTITY_ANIM_CURRENT_TIME(esVanEnemies[3].PedIndex, "missmic1ig_2", "jump_out_pedd") > 0.95 )
|
|
esVanEnemies[3].bHasTask = FALSE
|
|
esVanEnemies[3].iProgress++
|
|
ELSE
|
|
IF ( GET_ENTITY_ANIM_CURRENT_TIME(esVanEnemies[3].PedIndex, "missmic1ig_2", "jump_out_pedd") > 0.53 )
|
|
|
|
CLEAR_RAGDOLL_BLOCKING_FLAGS(esVanEnemies[3].PedIndex, RBF_BULLET_IMPACT)
|
|
CLEAR_RAGDOLL_BLOCKING_FLAGS(esVanEnemies[3].PedIndex, RBF_PLAYER_IMPACT)
|
|
CLEAR_RAGDOLL_BLOCKING_FLAGS(esVanEnemies[3].PedIndex, RBF_ALLOW_BLOCK_DEAD_PED)
|
|
|
|
IF ( GET_DISTANCE_BETWEEN_PEDS(esVanEnemies[3].PedIndex, PLAYER_PED_ID()) < 5.0 )
|
|
AND CAN_PED_SEE_HATED_PED(esVanEnemies[3].PedIndex, PLAYER_PED_ID())
|
|
GO_TO_ENEMY_STATE(esVanEnemies[3], ENEMY_STATE_COMBAT)
|
|
esVanEnemies[3].iProgress = 0
|
|
ENDIF
|
|
IF IS_ENTITY_TOUCHING_ENTITY(esVanEnemies[3].PedIndex, PLAYER_PED_ID())
|
|
OR HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(esVanEnemies[3].PedIndex, PLAYER_PED_ID())
|
|
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(esVanEnemies[3].PedIndex)
|
|
GO_TO_ENEMY_STATE(esVanEnemies[3], ENEMY_STATE_COMBAT)
|
|
bPlayerDetected = TRUE //set the player detected flag to true here for other peds to react
|
|
esVanEnemies[3].iProgress = 0
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 2
|
|
|
|
IF ( esVanEnemies[3].bHasTask = FALSE )
|
|
TASK_PUT_PED_DIRECTLY_INTO_COVER(esVanEnemies[3].PedIndex, csCoverpoints[27].vPosition, -1, FALSE, 0, TRUE, FALSE, csCoverpoints[27].CoverpointIndex)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(esVanEnemies[3].PedIndex, FALSE)
|
|
esVanEnemies[3].iTimer = GET_GAME_TIMER()
|
|
esVanEnemies[3].bHasTask = TRUE
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
IF IS_PED_IN_COMBAT(esVanEnemies[3].PedIndex)
|
|
OR HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(esVanEnemies[3].PedIndex, PLAYER_PED_ID())
|
|
OR ( bPlayerDetected = TRUE )
|
|
IF NOT IS_ENTITY_PLAYING_ANIM(esVanEnemies[3].PedIndex, "missmic1ig_2", "jump_out_pedd")
|
|
OR ( IS_ENTITY_PLAYING_ANIM(esVanEnemies[3].PedIndex, "missmic1ig_2", "jump_out_pedd")
|
|
AND GET_ENTITY_ANIM_CURRENT_TIME(esVanEnemies[3].PedIndex, "missmic1ig_2", "jump_out_pedd") > 0.53 )
|
|
|
|
CLEAR_RAGDOLL_BLOCKING_FLAGS(esVanEnemies[3].PedIndex, RBF_BULLET_IMPACT)
|
|
CLEAR_RAGDOLL_BLOCKING_FLAGS(esVanEnemies[3].PedIndex, RBF_PLAYER_IMPACT)
|
|
CLEAR_RAGDOLL_BLOCKING_FLAGS(esVanEnemies[3].PedIndex, RBF_ALLOW_BLOCK_DEAD_PED)
|
|
|
|
GO_TO_ENEMY_STATE(esVanEnemies[3], ENEMY_STATE_COMBAT)
|
|
esVanEnemies[3].iProgress = 0
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF ( bPlayerDetected = FALSE )
|
|
IF DOES_ENTITY_EXIST(vsEnemyVans[0].VehicleIndex)
|
|
IF NOT IS_ENTITY_DEAD(vsEnemyVans[0].VehicleIndex)
|
|
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(vsEnemyVans[0].VehicleIndex, PLAYER_PED_ID())
|
|
OR IS_PED_SHOOTING_AT_AREA(PLAYER_PED_ID(), TRUE, GET_ENTITY_COORDS(vsEnemyVans[0].VehicleIndex), 4.0 #IF IS_DEBUG_BUILD, TRUE #ENDIF)
|
|
bPlayerDetected = TRUE
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Player shot at enemy van 0 during scripted entry state. Setting bPlayerDetected to TRUE.")
|
|
#ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE ENEMY_STATE_COMBAT
|
|
|
|
IF ( esVanEnemies[3].bHasTask = FALSE )
|
|
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esVanEnemies[3].PedIndex, 100.0)
|
|
SET_PED_COMBAT_PROPERTIES(esVanEnemies[3].PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_MEDIUM, CA_USE_COVER)
|
|
SET_PED_COMBAT_ATTRIBUTES(esVanEnemies[3].PedIndex, CA_CAN_CHARGE, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(esVanEnemies[3].PedIndex, CA_CAN_USE_FRUSTRATED_ADVANCE, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(esVanEnemies[3].PedIndex, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
|
|
SET_PED_DEFENSIVE_AREA_SPHERE(esVanEnemies[3].PedIndex, << 3259.12, -4608.15, 115.51 >>, 2.5)
|
|
SET_PED_COVER_PROPERTIES(esVanEnemies[3].PedIndex, TRUE, FALSE, TRUE, FALSE, 5.0, FALSE, 0.0, 2.0)
|
|
//SET_PED_PREFERRED_COVERPOINT(esVanEnemies[3].PedIndex, esVanEnemies[3].ItemsetIndex, csCoverpoints[27].CoverpointIndex)
|
|
SET_PED_SHOOTING_PROPERTIES(esVanEnemies[3].PedIndex, 3)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(esVanEnemies[3].PedIndex, FALSE)
|
|
SET_PED_VISUAL_FIELD_PROPERTIES(esVanEnemies[3].PedIndex) //restore ped's default seeing values
|
|
bPlayerDetected = TRUE
|
|
|
|
esVanEnemies[3].bHasTask = TRUE
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
ELSE
|
|
|
|
IF IS_ENTITY_PLAYING_ANIM(esVanEnemies[3].PedIndex, "missmic1ig_2", "jump_out_pedd")
|
|
AND GET_ENTITY_ANIM_CURRENT_TIME(esVanEnemies[3].PedIndex, "missmic1ig_2", "jump_out_pedd") > 0.51
|
|
STOP_ANIM_PLAYBACK(esVanEnemies[3].PedIndex)
|
|
SET_HIGH_FALL_TASK(esVanEnemies[3].PedIndex, 2000, 10000)
|
|
APPLY_FORCE_TO_ENTITY(esVanEnemies[3].PedIndex, APPLY_TYPE_IMPULSE, << 0.0, 5.0, 0.0 >>, << 0.0, 0.0, 0.0 >>, 0, TRUE, TRUE, FALSE)
|
|
ENDIF
|
|
|
|
IF ( bPlayerDetected = FALSE )
|
|
IF ( esVanEnemies[3].eState = ENEMY_STATE_SCRIPTED_ENTRY )
|
|
IF DOES_ENTITY_EXIST(GET_PED_SOURCE_OF_DEATH(esVanEnemies[3].PedIndex))
|
|
IF ( GET_PED_INDEX_FROM_ENTITY_INDEX(GET_PED_SOURCE_OF_DEATH(esVanEnemies[3].PedIndex)) = PLAYER_PED_ID() )
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Player detected for killing ", esVanEnemies[3].sDebugName, " in scripted entry state.")
|
|
#ENDIF
|
|
bPlayerDetected = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_PLAYING_ANIM(esVanEnemies[3].PedIndex, "missmic1ig_2", "jump_out_pedd")
|
|
CLEANUP_ENEMY_PED(esVanEnemies[3])
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
//CLEANUP_ENEMY_GROUP(esVanEnemies)
|
|
|
|
UPDATE_VEHICLE_DAMAGE_FROM_PED(vsEnemyVans[0].VehicleIndex, PLAYER_PED_ID(), 300, 400, vsEnemyVans[0].bSmoking,
|
|
<<10.0, 10.0, 3.0>>, <<0.0, 0.0, 5.0>>, <<0.0, -1.5, 0.0>>, TRUE, 45.0, 70.0)
|
|
CHECK_VEHICLE_FOR_DRIVING_INTO_LOCATE(vsEnemyVans[0], PLAYER_PED_ID(), <<3238.346680,-4687.663086,114.673004>>,<<36.0,15.0,4.0>>)
|
|
|
|
RUN_VEHICLE_TYRE_BURST_CHECK(vsEnemyVans[0].VehicleIndex, SC_WHEEL_CAR_FRONT_RIGHT, vFrontRightOffset, 0.8, FALSE, TRUE, vFrontRightDamageOffset, 150.0)
|
|
RUN_VEHICLE_TYRE_BURST_CHECK(vsEnemyVans[0].VehicleIndex, SC_WHEEL_CAR_FRONT_LEFT, vFrontLeftOffset, 0.8, FALSE, TRUE, vFrontLeftDamageOffset, 150.0)
|
|
RUN_VEHICLE_TYRE_BURST_CHECK(vsEnemyVans[0].VehicleIndex, SC_WHEEL_CAR_REAR_LEFT, vRearLeftOffset, 0.8, FALSE, TRUE, vRearLeftDamageOffset, 150.0)
|
|
RUN_VEHICLE_TYRE_BURST_CHECK(vsEnemyVans[0].VehicleIndex, SC_WHEEL_CAR_REAR_RIGHT, vRearRightOffset, 0.8, FALSE, TRUE, vRearRightDamageOffset, 150.0)
|
|
|
|
UPDATE_AI_PED_BLIPS_FOR_ENEMY_GROUP(esVanEnemies)
|
|
|
|
ENDPROC
|
|
|
|
PROC MANAGE_SECOND_ENEMY_VAN_AND_ENEMIES(INT &iProgress)
|
|
|
|
FLOAT fPlaybackPercentage
|
|
|
|
SWITCH iProgress
|
|
|
|
CASE 0
|
|
|
|
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), << 3266.92, -4603.24, 116.83 >>, << 30.0, 3.5, 3.0 >>)
|
|
OR ( GET_NUMBER_OF_ENEMIES_DEAD(esMiddleEnemies) + GET_NUMBER_OF_ENEMIES_DEAD(esVanEnemies) >= 5 )
|
|
|
|
IF HAS_MODEL_LOADED(mnEnemy)
|
|
AND HAS_MODEL_LOADED(mnEnemyVan)
|
|
|
|
//second van on recording
|
|
vsEnemyVans[1].VehicleIndex = CREATE_ENEMY_VEHICLE(vsEnemyVans[1], 600, FALSE, TRUE, TRUE, FALSE, VEHICLELOCK_UNLOCKED, 56, 1, FALSE #IF IS_DEBUG_BUILD, "Van 1" #ENDIF)
|
|
|
|
SET_ENTITY_INVINCIBLE(vsEnemyVans[1].VehicleIndex, TRUE)
|
|
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(vsEnemyVans[1].VehicleIndex, TRUE)
|
|
SET_VEHICLE_CAN_BE_VISIBLY_DAMAGED(vsEnemyVans[1].VehicleIndex, FALSE)
|
|
SET_VEHICLE_ACTIVE_DURING_PLAYBACK(vsEnemyVans[1].VehicleIndex, TRUE)
|
|
|
|
esSideVanEnemies[0].PedIndex = CREATE_ENEMY_PED_IN_VEHICLE(mnEnemy, vsEnemyVans[1].VehicleIndex, VS_DRIVER, rgEnemies, WEAPONTYPE_ASSAULTRIFLE)
|
|
esSideVanEnemies[1].PedIndex = CREATE_ENEMY_PED_IN_VEHICLE(mnEnemy, vsEnemyVans[1].VehicleIndex, VS_FRONT_RIGHT, rgEnemies, WEAPONTYPE_ASSAULTRIFLE)
|
|
INITIALISE_ENEMY_GROUP(esSideVanEnemies, FALSE #IF IS_DEBUG_BUILD, "SideVan " #ENDIF)
|
|
|
|
//only create backup enemies if player triggered this wave based of kills of the previous wave
|
|
//commenting this backup wave for now
|
|
//IF NOT IS_ENTITY_AT_COORD(PLAYER_PED_ID(), << 3266.92, -4603.24, 116.83 >>, << 30.0, 3.5, 3.0 >>)
|
|
//AND ( GET_NUMBER_OF_ENEMIES_DEAD(esMiddleEnemies) + GET_NUMBER_OF_ENEMIES_DEAD(esVanEnemies) >= 5 )
|
|
// esSideVanBackupEnemies[0].PedIndex = CREATE_ENEMY_PED_IN_VEHICLE(mnEnemy, vsEnemyVans[1].VehicleIndex, VS_BACK_LEFT, rgEnemies, WEAPONTYPE_PISTOL, WEAPONCOMPONENT_AT_PI_FLSH)
|
|
// esSideVanBackupEnemies[1].PedIndex = CREATE_ENEMY_PED_IN_VEHICLE(mnEnemy, vsEnemyVans[1].VehicleIndex, VS_BACK_RIGHT, rgEnemies, WEAPONTYPE_PUMPSHOTGUN)
|
|
// INITIALISE_ENEMY_GROUP(esSideVanBackupEnemies, FALSE #IF IS_DEBUG_BUILD, "SideVanBackup " #ENDIF)
|
|
//ENDIF
|
|
|
|
START_VEHICLE_RECORDING_PLAYBACK_FOR_VEHICLE(vsEnemyVans[1], sVehicleRecordingsFile, 1.40, FALSE, 1750)
|
|
|
|
START_AUDIO_SCENE("MI_1_VAN_ARRIVES_02")
|
|
ADD_ENTITY_TO_AUDIO_MIX_GROUP(vsEnemyVans[1].VehicleIndex, "MI_1_VAN_02")
|
|
|
|
bRenderBlips = FALSE
|
|
bRenderBlipsTimer = GET_GAME_TIMER()
|
|
|
|
iProgress++
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 1
|
|
|
|
IF IS_VEHICLE_RECORDING_PLAYBACK_RUNNING_OR_DRIVER_DEAD(vsEnemyVans[1].VehicleIndex, fPlaybackPercentage, vsEnemyVans[1].bDriverDead)
|
|
|
|
IF ( fPlaybackPercentage > 57.5)
|
|
OR ( vsEnemyVans[1].bDriverDead = TRUE )
|
|
SET_ENTITY_INVINCIBLE(vsEnemyVans[1].VehicleIndex, FALSE)
|
|
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(vsEnemyVans[1].VehicleIndex, FALSE)
|
|
SET_VEHICLE_CAN_BE_VISIBLY_DAMAGED(vsEnemyVans[1].VehicleIndex, TRUE)
|
|
ENDIF
|
|
|
|
|
|
IF ( fPlaybackPercentage > 96.0 )
|
|
OR ( vsEnemyVans[1].bDriverDead = TRUE )
|
|
|
|
IF DOES_BLIP_EXIST(vsEnemyVans[1].BlipIndex)
|
|
REMOVE_BLIP(vsEnemyVans[1].BlipIndex)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF ( fPlaybackPercentage > 96.0 )
|
|
OR ( vsEnemyVans[1].bDriverDead = TRUE )
|
|
|
|
IF NOT IS_PED_INJURED(esSideVanEnemies[0].PedIndex)
|
|
SET_PED_DEFENSIVE_AREA_ANGLED(esSideVanEnemies[0].PedIndex, vGraveyardDefAreaPosisiton1, vGraveyardDefAreaPosistion2, fGraveyardDefAreaWidth)
|
|
SET_PED_COMBAT_PROPERTIES(esSideVanEnemies[0].PedIndex, CM_WILLADVANCE, CAL_AVERAGE, CR_MEDIUM, CA_USE_COVER)
|
|
SET_PED_COMBAT_ATTRIBUTES(esSideVanEnemies[0].PedIndex, CA_CAN_CHARGE, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(esSideVanEnemies[0].PedIndex, CA_CAN_USE_FRUSTRATED_ADVANCE, TRUE)
|
|
SET_PED_SHOOTING_PROPERTIES(esSideVanEnemies[0].PedIndex, 4)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esSideVanEnemies[0].PedIndex, 100.0)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(esSideVanEnemies[1].PedIndex)
|
|
SET_PED_DEFENSIVE_AREA_ANGLED(esSideVanEnemies[1].PedIndex, vGraveyardDefAreaPosisiton1, vGraveyardDefAreaPosistion2, fGraveyardDefAreaWidth)
|
|
SET_PED_COMBAT_PROPERTIES(esSideVanEnemies[1].PedIndex, CM_WILLADVANCE, CAL_AVERAGE, CR_MEDIUM, CA_USE_COVER)
|
|
SET_PED_COMBAT_ATTRIBUTES(esSideVanEnemies[1].PedIndex, CA_CAN_CHARGE, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(esSideVanEnemies[1].PedIndex, CA_CAN_USE_FRUSTRATED_ADVANCE, TRUE)
|
|
SET_PED_SHOOTING_PROPERTIES(esSideVanEnemies[1].PedIndex, 3)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esSideVanEnemies[1].PedIndex, 100.0)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF ( vsEnemyVans[1].bDriverDead = TRUE )
|
|
vsEnemyVans[1].bDriverDead = FALSE
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
iProgress++
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 2 //enemies are out of the van, keep updating their combat tasks here
|
|
|
|
IF IS_AUDIO_SCENE_ACTIVE("MI_1_VAN_ARRIVES_02")
|
|
STOP_AUDIO_SCENE("MI_1_VAN_ARRIVES_02")
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(vsEnemyVans[1].VehicleIndex)
|
|
REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(vsEnemyVans[1].VehicleIndex)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(esSideVanEnemies[0].PedIndex)
|
|
|
|
IF ( esSideVanEnemies[0].bFallingBack = FALSE )
|
|
IF ( bPlayerUsedAlternativePath = TRUE )
|
|
esSideVanEnemies[0].bHasTask = FALSE
|
|
esSideVanEnemies[0].iProgress = 100
|
|
esSideVanEnemies[0].bFallingBack = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SWITCH esSideVanEnemies[0].iProgress
|
|
|
|
CASE 100
|
|
|
|
IF ( esSideVanEnemies[0].bHasTask = FALSE )
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esSideVanEnemies[0].PedIndex, 100.0)
|
|
SET_PED_COMBAT_PROPERTIES(esSideVanEnemies[0].PedIndex, CM_DEFENSIVE, CAL_AVERAGE, CR_MEDIUM, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH)
|
|
SET_PED_DEFENSIVE_AREA_ANGLED(esSideVanEnemies[0].PedIndex, <<3266.473145,-4689.624023,111.113983>>, <<3226.107422,-4686.157715,118.637154>>, 22.0)
|
|
SET_PED_COMBAT_MOVEMENT_VALUES(esSideVanEnemies[0].PedIndex, 0.6, 0.25)
|
|
SET_PED_COVER_PROPERTIES(esSideVanEnemies[0].PedIndex, TRUE, FALSE, FALSE, FALSE, 6.0, TRUE, 0.1, 2.0)
|
|
esSideVanEnemies[0].bHasTask = TRUE
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(esSideVanEnemies[1].PedIndex)
|
|
|
|
IF ( esSideVanEnemies[1].bFallingBack = FALSE )
|
|
IF ( bPlayerUsedAlternativePath = TRUE )
|
|
esSideVanEnemies[1].bHasTask = FALSE
|
|
esSideVanEnemies[1].iProgress = 100
|
|
esSideVanEnemies[1].bFallingBack = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SWITCH esSideVanEnemies[1].iProgress
|
|
|
|
CASE 100
|
|
|
|
IF ( esSideVanEnemies[1].bHasTask = FALSE )
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esSideVanEnemies[1].PedIndex, 100.0)
|
|
SET_PED_COMBAT_PROPERTIES(esSideVanEnemies[1].PedIndex, CM_DEFENSIVE, CAL_AVERAGE, CR_MEDIUM, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH)
|
|
SET_PED_DEFENSIVE_AREA_ANGLED(esSideVanEnemies[1].PedIndex, <<3266.473145,-4689.624023,111.113983>>, <<3226.107422,-4686.157715,118.637154>>, 22.0)
|
|
SET_PED_COMBAT_MOVEMENT_VALUES(esSideVanEnemies[1].PedIndex, 0.75, 0.0)
|
|
SET_PED_COVER_PROPERTIES(esSideVanEnemies[1].PedIndex, TRUE, FALSE, FALSE, FALSE, 6.0, TRUE, 0.1, 2.0)
|
|
esSideVanEnemies[1].bHasTask = TRUE
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(esSideVanBackupEnemies[0].PedIndex)
|
|
IF NOT IS_ENTITY_DEAD(esSideVanBackupEnemies[0].PedIndex)
|
|
|
|
SWITCH esSideVanBackupEnemies[0].iProgress
|
|
|
|
CASE 0
|
|
IF ( esSideVanBackupEnemies[0].bHasTask = FALSE )
|
|
|
|
SET_PED_COMBAT_ATTRIBUTES(esSideVanBackupEnemies[0].PedIndex, CA_CAN_CHARGE, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(esSideVanBackupEnemies[0].PedIndex, CA_AGGRESSIVE, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(esSideVanBackupEnemies[0].PedIndex, CA_USE_VEHICLE, FALSE)
|
|
SET_PED_COMBAT_ATTRIBUTES(esSideVanBackupEnemies[0].PedIndex, CA_LEAVE_VEHICLES, TRUE)
|
|
|
|
SET_PED_COMBAT_RANGE(esSideVanBackupEnemies[0].PedIndex, CR_FAR)
|
|
SET_PED_COMBAT_MOVEMENT(esSideVanBackupEnemies[0].PedIndex, CM_WILLADVANCE)
|
|
|
|
SET_PED_SHOOTING_PROPERTIES(esSideVanBackupEnemies[0].PedIndex, 4)
|
|
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esSideVanBackupEnemies[0].PedIndex, 200.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(esSideVanBackupEnemies[0].PedIndex, FALSE)
|
|
|
|
esSideVanBackupEnemies[0].bHasTask = TRUE
|
|
ENDIF
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(esSideVanBackupEnemies[1].PedIndex)
|
|
IF NOT IS_ENTITY_DEAD(esSideVanBackupEnemies[1].PedIndex)
|
|
|
|
SWITCH esSideVanBackupEnemies[1].iProgress
|
|
|
|
CASE 0
|
|
IF ( esSideVanBackupEnemies[1].bHasTask = FALSE )
|
|
|
|
SET_PED_COMBAT_ATTRIBUTES(esSideVanBackupEnemies[1].PedIndex, CA_CAN_CHARGE, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(esSideVanBackupEnemies[1].PedIndex, CA_AGGRESSIVE, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(esSideVanBackupEnemies[1].PedIndex, CA_USE_VEHICLE, FALSE)
|
|
SET_PED_COMBAT_ATTRIBUTES(esSideVanBackupEnemies[1].PedIndex, CA_LEAVE_VEHICLES, TRUE)
|
|
|
|
SET_PED_COMBAT_RANGE(esSideVanBackupEnemies[1].PedIndex, CR_MEDIUM)
|
|
SET_PED_COMBAT_MOVEMENT(esSideVanBackupEnemies[1].PedIndex, CM_WILLADVANCE)
|
|
|
|
SET_PED_SHOOTING_PROPERTIES(esSideVanBackupEnemies[1].PedIndex, 4)
|
|
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esSideVanBackupEnemies[1].PedIndex, 200.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(esSideVanBackupEnemies[1].PedIndex, FALSE)
|
|
|
|
esSideVanBackupEnemies[1].bHasTask = TRUE
|
|
ENDIF
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
CLEANUP_ENEMY_GROUP(esSideVanEnemies)
|
|
CLEANUP_ENEMY_GROUP(esSideVanBackupEnemies)
|
|
|
|
UPDATE_VEHICLE_DAMAGE_FROM_PED(vsEnemyVans[1].VehicleIndex, PLAYER_PED_ID(), 300, 450, vsEnemyVans[1].bSmoking,
|
|
<<10.0, 10.0, 3.0>>, <<0.0, 0.0, 5.0>>, <<0.0, -1.5, 0.0>>)
|
|
CHECK_VEHICLE_FOR_DRIVING_INTO_LOCATE(vsEnemyVans[1], PLAYER_PED_ID(), <<3238.346680,-4687.663086,114.673004>>,<<36.0,15.0,4.0>>)
|
|
|
|
RUN_VEHICLE_TYRE_BURST_CHECK(vsEnemyVans[1].VehicleIndex, SC_WHEEL_CAR_FRONT_RIGHT, vFrontRightOffset, 0.8, FALSE, TRUE, vFrontRightDamageOffset, 150.0)
|
|
RUN_VEHICLE_TYRE_BURST_CHECK(vsEnemyVans[1].VehicleIndex, SC_WHEEL_CAR_FRONT_LEFT, vFrontLeftOffset, 0.8, FALSE, TRUE, vFrontLeftDamageOffset, 150.0)
|
|
RUN_VEHICLE_TYRE_BURST_CHECK(vsEnemyVans[1].VehicleIndex, SC_WHEEL_CAR_REAR_LEFT, vRearLeftOffset, 0.8, FALSE, TRUE, vRearLeftDamageOffset, 150.0)
|
|
RUN_VEHICLE_TYRE_BURST_CHECK(vsEnemyVans[1].VehicleIndex, SC_WHEEL_CAR_REAR_RIGHT, vRearRightOffset, 0.8, FALSE, TRUE, vRearRightDamageOffset, 150.0)
|
|
|
|
IF ( bRenderBlips = FALSE )
|
|
IF ( bRenderBlipsTimer <> 0 )
|
|
IF HAS_TIME_PASSED(2000, bRenderBlipsTimer)
|
|
bRenderBlips = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
UPDATE_AI_PED_BLIPS_FOR_ENEMY_GROUP(esSideVanEnemies, bRenderBlips)
|
|
UPDATE_AI_PED_BLIPS_FOR_ENEMY_GROUP(esSideVanBackupEnemies, bRenderBlips)
|
|
|
|
ENDPROC
|
|
|
|
PROC MANAGE_THIRD_ENEMY_VAN_AND_ENEMIES(INT &iProgress)
|
|
|
|
SWITCH iProgress
|
|
|
|
CASE 0
|
|
|
|
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<3238.346680,-4687.663086,114.673004>>, <<36.0,15.0,4.0>>)
|
|
|
|
iProgress++
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 1
|
|
|
|
REQUEST_MODEL(mnEnemyVan)
|
|
REQUEST_MODEL(mnEnemy)
|
|
REQUEST_VEHICLE_RECORDING(vsEnemyVans[4].iRecordingNumber, sVehicleRecordingsFile)
|
|
|
|
IF HAS_MODEL_LOADED(mnEnemyVan)
|
|
AND HAS_MODEL_LOADED(mnEnemy)
|
|
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(vsEnemyVans[4].iRecordingNumber, sVehicleRecordingsFile)
|
|
|
|
vsEnemyVans[4].VehicleIndex = CREATE_ENEMY_VEHICLE(vsEnemyVans[4], 950, FALSE, TRUE, TRUE, FALSE, VEHICLELOCK_UNLOCKED, -1, -1, FALSE #IF IS_DEBUG_BUILD, "EnemyVan 4" #ENDIF)
|
|
|
|
esVan4Enemies[0].PedIndex = CREATE_ENEMY_PED_IN_VEHICLE(mnEnemy, vsEnemyVans[4].VehicleIndex, VS_DRIVER, rgEnemies, WEAPONTYPE_ASSAULTRIFLE)
|
|
esVan4Enemies[1].PedIndex = CREATE_ENEMY_PED_IN_VEHICLE(mnEnemy, vsEnemyVans[4].VehicleIndex, VS_FRONT_RIGHT, rgEnemies, WEAPONTYPE_ASSAULTRIFLE)
|
|
esVan4Enemies[2].PedIndex = CREATE_ENEMY_PED_IN_VEHICLE(mnEnemy, vsEnemyVans[4].VehicleIndex, VS_BACK_LEFT, rgEnemies, WEAPONTYPE_ASSAULTRIFLE)
|
|
esVan4Enemies[3].PedIndex = CREATE_ENEMY_PED_IN_VEHICLE(mnEnemy, vsEnemyVans[4].VehicleIndex, VS_BACK_RIGHT, rgEnemies, WEAPONTYPE_ASSAULTRIFLE)
|
|
INITIALISE_ENEMY_GROUP(esVan4Enemies, FALSE #IF IS_DEBUG_BUILD, "Van4 " #ENDIF)
|
|
|
|
START_VEHICLE_RECORDING_PLAYBACK_FOR_VEHICLE(vsEnemyVans[4], sVehicleRecordingsFile, 1.2, FALSE, 2750)
|
|
|
|
START_AUDIO_SCENE("MI_1_VAN_ARRIVES_03")
|
|
ADD_ENTITY_TO_AUDIO_MIX_GROUP(vsEnemyVans[4].VehicleIndex, "MI_1_VAN_03")
|
|
SET_VEHICLE_ACTIVE_DURING_PLAYBACK(vsEnemyVans[4].VehicleIndex, TRUE)
|
|
|
|
iProgress++
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 2
|
|
|
|
IF ( GET_VEHICLE_RECORDING_PLAYBACK_PERCENTAGE(vsEnemyVans[4].VehicleIndex) > 98.0 )
|
|
|
|
IF DOES_BLIP_EXIST(vsEnemyVans[4].BlipIndex)
|
|
REMOVE_BLIP(vsEnemyVans[4].BlipIndex)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(esVan4Enemies[0].PedIndex)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esVan4Enemies[0].PedIndex, 150.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(esVan4Enemies[0].PedIndex, FALSE)
|
|
SET_PED_COMBAT_PROPERTIES(esVan4Enemies[0].PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_FAR, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH)
|
|
SET_PED_DEFENSIVE_AREA_SPHERE(esVan4Enemies[0].PedIndex, << 3214.98, -4716.22, 111.82 >>, 2.0)
|
|
SET_PED_SHOOTING_PROPERTIES(esVan4Enemies[0].PedIndex, 3, 100, FIRING_PATTERN_FULL_AUTO)
|
|
SET_PED_COVER_PROPERTIES(esVan4Enemies[0].PedIndex, TRUE, FALSE, FALSE, FALSE)
|
|
SET_PED_PREFERRED_COVERPOINT(esVan4Enemies[0].PedIndex, esVan4Enemies[0].ItemsetIndex, csCoverpoints[29].CoverpointIndex)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(esVan4Enemies[1].PedIndex)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esVan4Enemies[1].PedIndex, 150.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(esVan4Enemies[1].PedIndex, FALSE)
|
|
SET_PED_COMBAT_PROPERTIES(esVan4Enemies[1].PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_FAR, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH)
|
|
SET_PED_DEFENSIVE_AREA_SPHERE(esVan4Enemies[1].PedIndex, << 3224.99, -4716.13, 111.41 >>, 1.5)
|
|
SET_PED_SHOOTING_PROPERTIES(esVan4Enemies[1].PedIndex, 3, 100, FIRING_PATTERN_FULL_AUTO)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(esVan4Enemies[2].PedIndex)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esVan4Enemies[2].PedIndex, 150.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(esVan4Enemies[2].PedIndex, FALSE)
|
|
SET_PED_COMBAT_PROPERTIES(esVan4Enemies[2].PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_FAR, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH)
|
|
SET_PED_DEFENSIVE_AREA_SPHERE(esVan4Enemies[2].PedIndex, << 3218.49, -4716.52, 111.37 >>, 2.0)
|
|
SET_PED_SHOOTING_PROPERTIES(esVan4Enemies[2].PedIndex, 4, 100, FIRING_PATTERN_FULL_AUTO)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(esVan4Enemies[3].PedIndex)
|
|
TASK_COMBAT_HATED_TARGETS_AROUND_PED(esVan4Enemies[3].PedIndex, 150.0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(esVan4Enemies[3].PedIndex, FALSE)
|
|
SET_PED_COMBAT_PROPERTIES(esVan4Enemies[3].PedIndex, CM_DEFENSIVE, CAL_PROFESSIONAL, CR_FAR, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH)
|
|
SET_PED_DEFENSIVE_AREA_SPHERE(esVan4Enemies[3].PedIndex, << 3224.70, -4718.32, 111.37 >>, 1.5)
|
|
SET_PED_SHOOTING_PROPERTIES(esVan4Enemies[3].PedIndex, 4, 100, FIRING_PATTERN_FULL_AUTO)
|
|
ENDIF
|
|
|
|
bEnemiesBlockedByTrain = TRUE
|
|
|
|
vsEnemyVans[4].iTimer = GET_GAME_TIMER()
|
|
|
|
STOP_AUDIO_SCENE("MI_1_VAN_ARRIVES_03")
|
|
REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(vsEnemyVans[4].VehicleIndex)
|
|
|
|
iProgress++
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 3
|
|
|
|
IF HAS_TIME_PASSED(34000, vsEnemyVans[4].iTimer) //40000
|
|
|
|
IF NOT IS_PED_INJURED(esVan4Enemies[0].PedIndex)
|
|
SET_PED_COMBAT_PROPERTIES(esVan4Enemies[0].PedIndex, CM_WILLADVANCE, CAL_PROFESSIONAL, CR_NEAR, CA_AGGRESSIVE)
|
|
SET_PED_COMBAT_ATTRIBUTES(esVan4Enemies[0].PedIndex, CA_CAN_CHARGE, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(esVan4Enemies[0].PedIndex, CA_CAN_USE_FRUSTRATED_ADVANCE, TRUE)
|
|
REMOVE_PED_DEFENSIVE_AREA(esVan4Enemies[0].PedIndex)
|
|
ENDIF
|
|
IF NOT IS_PED_INJURED(esVan4Enemies[1].PedIndex)
|
|
SET_PED_COMBAT_PROPERTIES(esVan4Enemies[1].PedIndex, CM_WILLADVANCE, CAL_PROFESSIONAL, CR_NEAR, CA_AGGRESSIVE)
|
|
SET_PED_COMBAT_ATTRIBUTES(esVan4Enemies[1].PedIndex, CA_CAN_CHARGE, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(esVan4Enemies[1].PedIndex, CA_CAN_USE_FRUSTRATED_ADVANCE, TRUE)
|
|
REMOVE_PED_DEFENSIVE_AREA(esVan4Enemies[1].PedIndex)
|
|
ENDIF
|
|
IF NOT IS_PED_INJURED(esVan4Enemies[2].PedIndex)
|
|
SET_PED_COMBAT_PROPERTIES(esVan4Enemies[2].PedIndex, CM_WILLADVANCE, CAL_PROFESSIONAL, CR_NEAR, CA_AGGRESSIVE)
|
|
SET_PED_COMBAT_ATTRIBUTES(esVan4Enemies[2].PedIndex, CA_CAN_CHARGE, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(esVan4Enemies[2].PedIndex, CA_CAN_USE_FRUSTRATED_ADVANCE, TRUE)
|
|
REMOVE_PED_DEFENSIVE_AREA(esVan4Enemies[2].PedIndex)
|
|
ENDIF
|
|
IF NOT IS_PED_INJURED(esVan4Enemies[3].PedIndex)
|
|
SET_PED_COMBAT_PROPERTIES(esVan4Enemies[3].PedIndex, CM_WILLADVANCE, CAL_PROFESSIONAL, CR_NEAR, CA_AGGRESSIVE)
|
|
SET_PED_COMBAT_ATTRIBUTES(esVan4Enemies[3].PedIndex, CA_CAN_CHARGE, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(esVan4Enemies[3].PedIndex, CA_CAN_USE_FRUSTRATED_ADVANCE, TRUE)
|
|
REMOVE_PED_DEFENSIVE_AREA(esVan4Enemies[3].PedIndex)
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Moving enemies from third van.")
|
|
#ENDIF
|
|
|
|
iProgress++
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
CLEANUP_ENEMY_GROUP(esVan4Enemies)
|
|
|
|
UPDATE_VEHICLE_DAMAGE_FROM_PED(vsEnemyVans[4].VehicleIndex, PLAYER_PED_ID(), 300, 500, vsEnemyVans[4].bSmoking,
|
|
<<10.0, 10.0, 3.0>>, <<0.0, 0.0, 5.0>>, <<0.0, -1.5, 0.0>>)
|
|
|
|
CHECK_VEHICLE_FOR_DRIVING_INTO_LOCATE(vsEnemyVans[4], PLAYER_PED_ID(), <<3222.843506,-4688.635742,114.212746>>, << 12.0, 16.0, 3.0 >>)
|
|
CHECK_VEHICLE_FOR_DRIVING_INTO_LOCATE(vsEnemyVans[4], PLAYER_PED_ID(), <<3217.266113,-4748.119629,112.924225>>, << 16.0, 16.0, 3.0 >>)
|
|
|
|
RUN_VEHICLE_TYRE_BURST_CHECK(vsEnemyVans[4].VehicleIndex, SC_WHEEL_CAR_FRONT_RIGHT, vFrontRightOffset, 0.8, FALSE, TRUE, vFrontRightDamageOffset, 150.0)
|
|
RUN_VEHICLE_TYRE_BURST_CHECK(vsEnemyVans[4].VehicleIndex, SC_WHEEL_CAR_FRONT_LEFT, vFrontLeftOffset, 0.8, FALSE, TRUE, vFrontLeftDamageOffset, 150.0)
|
|
RUN_VEHICLE_TYRE_BURST_CHECK(vsEnemyVans[4].VehicleIndex, SC_WHEEL_CAR_REAR_LEFT, vRearLeftOffset, 0.8, FALSE, TRUE, vRearLeftDamageOffset, 150.0)
|
|
RUN_VEHICLE_TYRE_BURST_CHECK(vsEnemyVans[4].VehicleIndex, SC_WHEEL_CAR_REAR_RIGHT, vRearRightOffset, 0.8, FALSE, TRUE, vRearRightDamageOffset, 150.0)
|
|
|
|
UPDATE_AI_PED_BLIPS_FOR_ENEMY_GROUP(esVan4Enemies)
|
|
|
|
ENDPROC
|
|
|
|
PROC CHECK_PLAYER_DETECTED_LOCATION(BOOL bPlayerSpotted, DETECTED_LOCATIONS &eLocation)
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
|
|
IF ( eLocation = DL_NOT_DETECTED )
|
|
|
|
IF ( bPlayerSpotted = TRUE )
|
|
|
|
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<3267.363770,-4574.668457,119.156708>>,<<36.000000,16.000000,4.000000>>)
|
|
|
|
eLocation = DL_START_AREA
|
|
|
|
ELIF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<3266.107422,-4602.592773,117.675850>>,<<36.000000,13.000000,4.000000>>)
|
|
|
|
eLocation = DL_MIDDLE_AREA_01
|
|
|
|
ELIF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<3264.762207,-4626.325195,117.186195>>,<<36.000000,11.000000,4.000000>>)
|
|
|
|
eLocation = DL_MIDDLE_AREA_02
|
|
|
|
ELIF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<3262.034668,-4655.088379,114.936089>>,<<36.000000,17.000000,4.000000>>)
|
|
|
|
eLocation = DL_CHURCH_AREA
|
|
|
|
ELIF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<3243.011963,-4691.706055,113.654236>>,<<50.000000,20.000000,4.000000>>)
|
|
|
|
eLocation = DL_PARKING_LOT
|
|
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Player detected in location ", GET_DETECTED_LOCATION_NAME_FOR_DEBUG(eLocation), ".")
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC TRIGGER_MUSIC_EVENTS()
|
|
|
|
IF ( bMusicEventFirstTwoDeadTriggered = FALSE )
|
|
IF ( bMusicEventAlertedTriggered = FALSE )
|
|
IF ( GET_NUMBER_OF_ENEMIES_DEAD(esWallEnemies) = 2 )
|
|
IF TRIGGER_MUSIC_EVENT("MIC1_FIRST_TWO_DEAD")
|
|
bMusicEventFirstTwoDeadTriggered = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF ( bMusicEventFirstVanTriggered = FALSE )
|
|
IF ( bOpenGateTriggered = TRUE )
|
|
IF PREPARE_MUSIC_EVENT("MIC1_1ST_VAN")
|
|
IF TRIGGER_MUSIC_EVENT("MIC1_1ST_VAN")
|
|
bMusicEventFirstVanTriggered = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF ( bMusicEventAlertedTriggered = FALSE )
|
|
|
|
IF ( bPlayerDetected = TRUE )
|
|
IF HAS_LABEL_BEEN_TRIGGERED("MCH1_SPOT1")
|
|
OR HAS_LABEL_BEEN_TRIGGERED("MCH1_SPOT2")
|
|
OR HAS_LABEL_BEEN_TRIGGERED("MCH1_SPOT3")
|
|
OR HAS_LABEL_BEEN_TRIGGERED("MCH1_SPOT4")
|
|
OR HAS_LABEL_BEEN_TRIGGERED("MCH1_SURROUND")
|
|
IF PREPARE_MUSIC_EVENT("MIC1_ALERTED")
|
|
IF TRIGGER_MUSIC_EVENT("MIC1_ALERTED")
|
|
STOP_AUDIO_SCENE("MI_1_SHOOTOUT_STEALTH")
|
|
START_AUDIO_SCENE("MI_1_SHOOTOUT_ENEMIES_ALERTED")
|
|
bMusicEventAlertedTriggered = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF ( bMusicEventTrainTriggered = FALSE )
|
|
IF ( bEnemiesBlockedByTrain = TRUE )
|
|
IF TRIGGER_MUSIC_EVENT("MIC1_TRAIN")
|
|
bMusicEventTrainTriggered = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC MANAGE_BRAD_CADAVER(INT &iProgress)
|
|
|
|
IF DOES_ENTITY_EXIST(psBrad.PedIndex)
|
|
IF NOT IS_ENTITY_DEAD(psBrad.PedIndex)
|
|
|
|
SWITCH iProgress
|
|
|
|
CASE 0
|
|
|
|
IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iBradCadaverScene)
|
|
|
|
REQUEST_ANIM_DICT("dead")
|
|
|
|
IF HAS_ANIM_DICT_LOADED("dead")
|
|
IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iBradCadaverScene)
|
|
|
|
iBradCadaverScene = CREATE_SYNCHRONIZED_SCENE(<< 3258.899, -4574.090, 115.350 >>, << 173.880, 51.480, 5.040 >>, EULER_XYZ)
|
|
|
|
TASK_SYNCHRONIZED_SCENE(psBrad.PedIndex, iBradCadaverScene, "dead", "dead_g", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT, RBF_BULLET_IMPACT | RBF_PLAYER_IMPACT | RBF_MELEE)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(psBrad.PedIndex)
|
|
|
|
STOP_PED_SPEAKING(psBrad.PedIndex, TRUE)
|
|
SET_ENTITY_INVINCIBLE(psBrad.PedIndex, TRUE)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(psBrad.PedIndex, TRUE)
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
SET_RAGDOLL_BLOCKING_FLAGS(psBrad.PedIndex, RBF_FIRE)
|
|
SET_RAGDOLL_BLOCKING_FLAGS(psBrad.PedIndex, RBF_MELEE)
|
|
SET_RAGDOLL_BLOCKING_FLAGS(psBrad.PedIndex, RBF_EXPLOSION)
|
|
SET_RAGDOLL_BLOCKING_FLAGS(psBrad.PedIndex, RBF_PLAYER_BUMP)
|
|
SET_RAGDOLL_BLOCKING_FLAGS(psBrad.PedIndex, RBF_BULLET_IMPACT)
|
|
SET_RAGDOLL_BLOCKING_FLAGS(psBrad.PedIndex, RBF_PLAYER_IMPACT)
|
|
SET_RAGDOLL_BLOCKING_FLAGS(psBrad.PedIndex, RBF_IMPACT_OBJECT)
|
|
|
|
iProgress++
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 1
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
FUNC BOOL IS_MISSION_STAGE_GRAVEYARD_SHOOTOUT_COMPLETED(INT &iStageProgress)
|
|
|
|
//don't use locates header J skip
|
|
SET_BIT(sLocatesData.iLocatesBitSet, BS_DONT_DO_J_SKIP)
|
|
|
|
SET_CLOCK_TIME(0, 0, 0)
|
|
SET_PICKUP_AMMO_AMOUNT_SCALER(3.0)
|
|
|
|
//using locates header display player objective and check if player made it to the graveyard entrance
|
|
IF ( iStageProgress < 40 )
|
|
|
|
IF NOT DOES_BLIP_EXIST(vsMichaelsCar.BlipIndex)
|
|
vsMichaelsCar.BlipIndex = CREATE_BLIP_FOR_VEHICLE(vsMichaelsCar.VehicleIndex)
|
|
PRINT_GOD_TEXT_ADVANCED("CMN_GENGETIN")
|
|
ENDIF
|
|
|
|
IF ( bPlayerUsedAlternativePath = FALSE )
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<3276.662598,-4691.776367,112.158768>>, <<3218.352783,-4637.393066,120.542297>>, 16.000000)
|
|
bPlayerUsedAlternativePath = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_ENTITY_IN_LOCATE(PLAYER_PED_ID(), <<3238.346680,-4687.663086,114.673004>>,<<36.0,15.0,4.0>> #IF IS_DEBUG_BUILD, "GraveyardEntranceLocate" #ENDIF)
|
|
|
|
//set the fail flag for abandoning the car
|
|
FailFlags[MISSION_FAIL_MICHAELS_CAR_LEFT_BEHIND] = TRUE
|
|
|
|
//unset the fail for leaving the graveyard, distance to car check will now take over checking for fails
|
|
FailFlags[MISSION_FAIL_GRAVEYARD_ABANDONED] = FALSE
|
|
|
|
iStageProgress = 40
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
RUN_TOMBSTONES_FRAG_CHECK(PLAYER_PED_ID(), TombstoneShooterPed, iEnemyTombstoneShootTimer, 4000, 1.25)
|
|
|
|
MANAGE_FIRST_ENEMY_WAVE(bFirstEnemyWaveSpawned, TRUE)
|
|
MANAGE_SECOND_ENEMY_WAVE(bSecondEnemyWaveSpawned, bFirstEnemyWaveSpawned, -1)
|
|
MANAGE_THIRD_ENEMY_WAVE(bThirdEnemyWaveSpawned, bSecondEnemyWaveSpawned)
|
|
MANAGE_FOURTH_ENEMY_WAVE(bFourthEnemyWaveSpawned, bThirdEnemyWaveSpawned, -1)
|
|
MANAGE_FIFTH_ENEMY_WAVE(bFifthEnemyWaveSpawned, bFifthEnemyWaveIgnored, TRUE)
|
|
|
|
MANAGE_FIRST_ENEMY_REINFORCEMENT_WAVE(bFirstEnemyReinforcementWaveSpawned, bThirdEnemyWaveSpawned)
|
|
MANAGE_SECOND_ENEMY_REINFORCEMENT_WAVE(bSecondEnemyReinforcementWaveSpawned, bFirstEnemyReinforcementWaveSpawned, bThirdEnemyWaveSpawned)
|
|
//MANAGE_THIRD_ENEMY_REINFORCEMENT_WAVE(bThirdEnemyReinforcementWaveSpawned, bSecondEnemyReinforcementWaveSpawned, bThirdEnemyWaveSpawned)
|
|
|
|
MANAGE_FIRST_ENEMY_VAN_AND_ENEMIES(vsEnemyVans[0].iProgress)
|
|
MANAGE_SECOND_ENEMY_VAN_AND_ENEMIES(vsEnemyVans[1].iProgress)
|
|
MANAGE_THIRD_ENEMY_VAN_AND_ENEMIES(vsEnemyVans[4].iProgress)
|
|
|
|
TRIGGER_MUSIC_EVENTS()
|
|
MANAGE_CHURCH_BELL_SOUNDS(iChurchBellsProgress)
|
|
MANAGE_PARKED_ENEMY_VEHICLES(vsEnemyVans[2].iProgress)
|
|
CHECK_PLAYER_DETECTED_LOCATION(bPlayerDetected, eDetectedLocation)
|
|
MANAGE_CONVERSATIONS_DURING_SHOOTOUT(psMichael.iConversationProgress, psMichael.iConversationTimer, iEnemyConversationTimer,
|
|
iMichaelRandomConversationDelay, iEnemyRandomConversationDelay, bShootingConversationFlag)
|
|
|
|
CLEANUP_ENEMY_VEHICLES(vsEnemyVans, FALSE, TRUE, TRUE)
|
|
|
|
MANAGE_WEAPONS_HELP_TEXT()
|
|
MANAGE_BRAD_CADAVER(iBradCadaverProgress)
|
|
|
|
SWITCH iStageProgress
|
|
|
|
CASE 0
|
|
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("MI_1_SHOOTOUT_STEALTH")
|
|
START_AUDIO_SCENE("MI_1_SHOOTOUT_STEALTH")
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
|
|
//IF NOT IS_PED_IN_COVER(PLAYER_PED_ID())
|
|
// TASK_PUT_PED_DIRECTLY_INTO_COVER(PLAYER_PED_ID(), csCoverpoints[0].vPosition, -1, TRUE, 0, TRUE, TRUE, csCoverpoints[0].CoverpointIndex)
|
|
// FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID())
|
|
//ENDIF
|
|
|
|
SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), TRUE)
|
|
|
|
ENDIF
|
|
|
|
IF ( bGameplayCameraSet = FALSE )
|
|
//SET_GAMEPLAY_CAM_RELATIVE_PITCH(-16.536800)
|
|
//SET_GAMEPLAY_CAM_RELATIVE_HEADING(-72.373550)
|
|
bGameplayCameraSet = TRUE
|
|
ENDIF
|
|
|
|
FailFlags[MISSION_FAIL_GRAVEYARD_ABANDONED] = TRUE
|
|
|
|
SETTIMERB(0)
|
|
|
|
psMichael.iTimer = GET_GAME_TIMER()
|
|
|
|
iStageProgress++
|
|
|
|
BREAK
|
|
|
|
CASE 1
|
|
|
|
IF ( TIMERB() > 5000 )
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
bStageResetFlag = TRUE
|
|
#ENDIF
|
|
|
|
iStageProgress++
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 40
|
|
|
|
IF NOT HAS_LABEL_BEEN_TRIGGERED("MCH1_RTC")
|
|
IF NOT IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), << 3263.05, -4704.67, 104.67 >>, << 3267.14, -4561.37, 132.76 >>, 64.0)
|
|
IF GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), vsMichaelsCar.VehicleIndex) > ABANDON_CAR_WARNING_RANGE
|
|
CLEAR_PRINTS()
|
|
PRINT_GOD_TEXT_ADVANCED("MCH1_RTC", DEFAULT_GOD_TEXT_TIME, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//if in the target vehicle only
|
|
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vsMichaelsCar.VehicleIndex, TRUE)
|
|
DISABLE_PLAYER_VEHICLE_DRIVING_CONTROLS_THIS_FRAME()
|
|
IF DOES_BLIP_EXIST(vsMichaelsCar.BlipIndex)
|
|
REMOVE_BLIP(vsMichaelsCar.BlipIndex)
|
|
ENDIF
|
|
ELSE
|
|
IF NOT DOES_BLIP_EXIST(vsMichaelsCar.BlipIndex)
|
|
vsMichaelsCar.BlipIndex = CREATE_BLIP_FOR_VEHICLE(vsMichaelsCar.VehicleIndex)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("MI_1_GET_TO_CAR")
|
|
START_AUDIO_SCENE("MI_1_GET_TO_CAR")
|
|
ENDIF
|
|
|
|
MANAGE_MISSION_TRAIN(tsTrain.iProgress)
|
|
|
|
//if player enters the carreaches the car
|
|
IF IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), vsMichaelsCar.VehicleIndex)
|
|
//Speed up the multihead blinders
|
|
SET_MULTIHEAD_SAFE(TRUE)
|
|
|
|
IF ( bCutsceneTimeTrigger = FALSE )
|
|
IF ( iCutsceneTriggerTimer = 0)
|
|
iCutsceneTriggerTimer = GET_GAME_TIMER()
|
|
ELSE
|
|
IF HAS_TIME_PASSED(1000, iCutsceneTriggerTimer)
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Triggering mic_1_mcs_3 cutscene due to timer trigger.")
|
|
#ENDIF
|
|
bCutsceneTimeTrigger = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF ( bCutsceneProximityTrigger = FALSE )
|
|
|
|
PED_INDEX ClosestPedIndex
|
|
|
|
ClosestPedIndex = GET_PED_CLOSEST_PED_FROM_RELATIONSHIP_GROUP(PLAYER_PED_ID(), rgEnemies)
|
|
|
|
IF DOES_ENTITY_EXIST(ClosestPedIndex)
|
|
IF NOT IS_ENTITY_DEAD(ClosestPedIndex)
|
|
IF GET_DISTANCE_BETWEEN_PEDS(PLAYER_PED_ID(), ClosestPedIndex) < 5.0
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Triggering mic_1_mcs_3 cutscene due to proximity trigger.")
|
|
#ENDIF
|
|
bCutsceneProximityTrigger = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_DISABLED_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_ACCELERATE)
|
|
OR bCutsceneProximityTrigger = TRUE OR bCutsceneTimeTrigger = TRUE
|
|
|
|
KILL_ANY_CONVERSATION()
|
|
KILL_FACE_TO_FACE_CONVERSATION()
|
|
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
|
|
IF DOES_BLIP_EXIST(vsMichaelsCar.BlipIndex)
|
|
REMOVE_BLIP(vsMichaelsCar.BlipIndex)
|
|
ENDIF
|
|
|
|
IF ( bCoverpointsCreated = TRUE )
|
|
REMOVE_COVERPOINTS(csCoverpoints)
|
|
bCoverpointsCreated = FALSE
|
|
ENDIF
|
|
|
|
STOP_SOUND(iChurchBellsSoundID)
|
|
|
|
REMOVE_ANIM_DICT("dead")
|
|
REMOVE_ANIM_DICT("missmic1ig_2")
|
|
|
|
IF IS_AUDIO_SCENE_ACTIVE("MI_1_GET_TO_CAR")
|
|
STOP_AUDIO_SCENE("MI_1_GET_TO_CAR")
|
|
ENDIF
|
|
|
|
IF IS_AUDIO_SCENE_ACTIVE("MI_1_SHOOTOUT_ENEMIES_ALERTED")
|
|
STOP_AUDIO_SCENE("MI_1_SHOOTOUT_ENEMIES_ALERTED")
|
|
ENDIF
|
|
|
|
RELEASE_NAMED_SCRIPT_AUDIO_BANK("SCRIPT\\FBI_HEIST_3B_SHOOTOUT")
|
|
|
|
CLEANUP_MISSION_OBJECT(osPropCoffin, TRUE)
|
|
CLEANUP_MISSION_OBJECT(osPropShovel, TRUE)
|
|
CLEANUP_MISSION_OBJECT(osPropPickaxe, TRUE)
|
|
|
|
IF DOES_ENTITY_EXIST(psBrad.PedIndex)
|
|
DELETE_PED(psBrad.PedIndex)
|
|
ENDIF
|
|
|
|
RETURN TRUE
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
REQUEST_CUTSCENE("mic_1_mcs_3")
|
|
|
|
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", PLAYER_PED_ID())
|
|
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Left_Gun", PED_COMP_HAIR, 1, 0)
|
|
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Kneeling_Gunman", PED_COMP_HAIR, 1, 0)
|
|
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Chinese_Goon", PED_COMP_HEAD, 0, 0) //(head)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Chinese_Goon", PED_COMP_HAIR, 0, 0) //(hair)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Chinese_Goon", PED_COMP_TORSO, 1, 0) //(uppr)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Chinese_Goon", PED_COMP_LEG, 1, 0) //(lowr)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Chinese_Goon", PED_COMP_HAND, 1, 0) //(hand)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Chinese_Goon", PED_COMP_FEET, 1, 0) //(feet)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Chinese_Goon", PED_COMP_JBIB, 1, 0) //(jbib)
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
RETURN FALSE
|
|
|
|
ENDFUNC
|
|
|
|
FUNC BOOL IS_MISSION_STAGE_CUTSCENE_KIDNAPPED_COMPLETED(INT &iStageProgress)
|
|
|
|
SWITCH iStageProgress
|
|
|
|
CASE 0
|
|
|
|
IF HAS_REQUESTED_CUTSCENE_LOADED("mic_1_mcs_3")
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
REGISTER_ENTITY_FOR_CUTSCENE(PLAYER_PED_ID(), "Michael", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(vsMichaelsCar.VehicleIndex)
|
|
|
|
// IF IS_VEHICLE_DOOR_DAMAGED(vsMichaelsCar.VehicleIndex, SC_DOOR_FRONT_LEFT)
|
|
// SET_VEHICLE_DOOR_CONTROL(vsMichaelsCar.VehicleIndex, SC_DOOR_FRONT_LEFT, DT_DOOR_INTACT, 0.0)
|
|
// ENDIF
|
|
// IF IS_VEHICLE_DOOR_DAMAGED(vsMichaelsCar.VehicleIndex, SC_DOOR_FRONT_RIGHT)
|
|
// SET_VEHICLE_DOOR_CONTROL(vsMichaelsCar.VehicleIndex, SC_DOOR_FRONT_RIGHT, DT_DOOR_INTACT, 0.0)
|
|
// ENDIF
|
|
|
|
SET_VEHICLE_ENGINE_ON(vsMichaelsCar.VehicleIndex, FALSE, TRUE)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(vsMichaelsCar.VehicleIndex, "Chinese_Goon_Car", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
|
|
CLEAR_PRINTS()
|
|
CLEAR_HELP()
|
|
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
|
|
|
|
//clear area when starting the cutscene
|
|
CLEAR_AREA(psMichael.vPosition, 100.0, TRUE)
|
|
CLEAR_AREA_OF_VEHICLES(psMichael.vPosition, 100.0)
|
|
|
|
START_CUTSCENE()
|
|
|
|
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, TRUE, FALSE) //make sure cutscene ends with a fade
|
|
|
|
iStageProgress++
|
|
|
|
ELSE
|
|
|
|
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", PLAYER_PED_ID())
|
|
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Left_Gun", PED_COMP_HAIR, 1, 0)
|
|
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Kneeling_Gunman", PED_COMP_HAIR, 1, 0)
|
|
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Chinese_Goon", PED_COMP_HEAD, 0, 0) //(head)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Chinese_Goon", PED_COMP_HAIR, 0, 0) //(hair)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Chinese_Goon", PED_COMP_TORSO, 1, 0) //(uppr)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Chinese_Goon", PED_COMP_LEG, 1, 0) //(lowr)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Chinese_Goon", PED_COMP_HAND, 1, 0) //(hand)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Chinese_Goon", PED_COMP_FEET, 1, 0) //(feet)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Chinese_Goon", PED_COMP_JBIB, 1, 0) //(jbib)
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 1 //fade screen in if screen was faded out due to shit skip or debug skip
|
|
|
|
IF IS_CUTSCENE_PLAYING()
|
|
|
|
CLEANUP_ENEMY_GROUP(esVanEnemies, TRUE)
|
|
CLEANUP_ENEMY_GROUP(esMiddleEnemies, TRUE)
|
|
CLEANUP_ENEMY_GROUP(esWallEnemies, TRUE)
|
|
CLEANUP_ENEMY_GROUP(esChurchEnemies, TRUE)
|
|
CLEANUP_ENEMY_GROUP(esSideVanEnemies, TRUE)
|
|
CLEANUP_ENEMY_GROUP(esSideVanBackupEnemies, TRUE)
|
|
CLEANUP_ENEMY_GROUP(esExitEnemies, TRUE)
|
|
CLEANUP_ENEMY_GROUP(esVan4Enemies, TRUE)
|
|
CLEANUP_ENEMY_GROUP(esRunners, TRUE)
|
|
CLEANUP_ENEMY_GROUP(esSideEnemies, TRUE)
|
|
CLEANUP_ENEMY_GROUP(esFirstReinforcementEnemies, TRUE)
|
|
CLEANUP_ENEMY_GROUP(esSecondReinforcementEnemies, TRUE)
|
|
CLEANUP_ENEMY_GROUP(esThirdReinforcementEnemies, TRUE)
|
|
|
|
CLEANUP_ENEMY_VEHICLES(vsEnemyVans, TRUE)
|
|
|
|
IF IS_SCREEN_FADED_OUT()
|
|
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
|
|
ENDIF
|
|
|
|
iStageProgress++
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 2
|
|
|
|
IF ( bMusicEventKidnappedTriggered = FALSE )
|
|
IF PREPARE_MUSIC_EVENT("MIC1_KIDNAPPED")
|
|
IF TRIGGER_MUSIC_EVENT("MIC1_KIDNAPPED")
|
|
bMusicEventKidnappedTriggered = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF ( bMusicEventReadyToFlyTriggered = FALSE )
|
|
IF IS_CUTSCENE_PLAYING()
|
|
IF ( GET_CUTSCENE_TIME() > 4500 )
|
|
IF TRIGGER_MUSIC_EVENT("MIC1_READY_TO_FLY")
|
|
bMusicEventReadyToFlyTriggered = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("asea")
|
|
IF IS_VEHICLE_DRIVEABLE(vsMichaelsCar.VehicleIndex)
|
|
SET_VEHICLE_ENGINE_ON(vsMichaelsCar.VehicleIndex, FALSE, TRUE)
|
|
SET_VEHICLE_ON_GROUND_PROPERLY(vsMichaelsCar.VehicleIndex)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michael")
|
|
IF IS_VEHICLE_DRIVEABLE(vsMichaelsCar.VehicleIndex)
|
|
AND NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), vsMichaelsCar.VehicleIndex, VS_DRIVER)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID())
|
|
SET_PED_STEALTH_MOVEMENT(PLAYER_PED_ID(), FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
|
|
IF HAS_CUTSCENE_FINISHED()
|
|
|
|
REPLAY_STOP_EVENT()
|
|
|
|
//start rendering from scripted camera early so that map streams in
|
|
IF DOES_CAM_EXIST(ScriptedCamera)
|
|
RENDER_SCRIPT_CAMS(TRUE, FALSE)
|
|
ENDIF
|
|
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
|
|
|
|
iStageProgress++
|
|
|
|
ELSE
|
|
|
|
//create scripted camera in advance
|
|
IF NOT DOES_CAM_EXIST(ScriptedCamera)
|
|
|
|
ScriptedCamera = CREATE_CAMERA(CAMTYPE_SCRIPTED, TRUE)
|
|
|
|
SET_CAM_PARAMS(ScriptedCamera, <<3157.128906,7499.776855,5.372416>>,<<11.137081,-0.000000,145.805832>>,59.407524)
|
|
SHAKE_CAM(ScriptedCamera, "HAND_SHAKE", 0.25)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created scripted camera.")
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 3
|
|
|
|
IF IS_SCREEN_FADED_OUT()
|
|
|
|
//delete train when screen is faded out if the train exists
|
|
IF DOES_ENTITY_EXIST(tsTrain.VehicleIndex)
|
|
AND DOES_ENTITY_EXIST(tsTrain.PedIndex)
|
|
DELETE_PED(tsTrain.PedIndex)
|
|
DELETE_MISSION_TRAIN(tsTrain.VehicleIndex)
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Deleted mission train.")
|
|
#ENDIF
|
|
ENDIF
|
|
|
|
IF NOT HAS_SOUND_FINISHED(iTrainBellsSoundID)
|
|
STOP_SOUND(iTrainBellsSoundID)
|
|
ENDIF
|
|
|
|
RELEASE_NAMED_SCRIPT_AUDIO_BANK("Prologue_Train_Sounds")
|
|
|
|
//warp player ped out of the car
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
|
|
ENDIF
|
|
|
|
//delete player's car
|
|
IF DOES_ENTITY_EXIST(vsMichaelsCar.VehicleIndex)
|
|
IF IS_VEHICLE_DRIVEABLE(vsMichaelsCar.VehicleIndex)
|
|
DELETE_VEHICLE(vsMichaelsCar.VehicleIndex)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
UNLOCK_GRAVEYARD_GATES()
|
|
UNREGISTER_GRAVEYARD_GATES()
|
|
|
|
RESTORE_PLAYER_PED_WEAPONS_IN_SNAPSHOT(PLAYER_PED_ID())
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Calling RESTORE_PLAYER_PED_WEAPONS_IN_SNAPSHOT(PLAYER_PED_ID()).")
|
|
#ENDIF
|
|
|
|
RETURN TRUE
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
RETURN FALSE
|
|
|
|
ENDFUNC
|
|
|
|
PROC MANAGE_CONVERSATIONS_DURING_FLIGHT_HOME(INT &iTrevorProgress)
|
|
|
|
SWITCH iTrevorProgress
|
|
|
|
CASE 0
|
|
|
|
IF IS_PED_SITTING_IN_THIS_VEHICLE(PLAYER_PED_ID(), vsTrevorsPlane.VehicleIndex)
|
|
IF ( fDistanceToDestination != 0 AND fDistanceToDestination < TRIGGER_CALL_RANGE )
|
|
psTrevor.iConversationTimer = GET_GAME_TIMER()
|
|
iTrevorProgress++
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 1
|
|
|
|
IF IS_PED_SITTING_IN_THIS_VEHICLE(PLAYER_PED_ID(), vsTrevorsPlane.VehicleIndex)
|
|
IF CHAR_CALL_PLAYER_CELLPHONE_FORCE_ANSWER(sMichael1Conversation, CHAR_CHENGSR, "MCH1AUD",
|
|
PICK_STRING(bStageReplayInProgress, "MCH1_CP04", "MCH1_CP04b"), CONV_PRIORITY_MEDIUM)
|
|
SET_LABEL_AS_TRIGGERED("MCH1_CP04", TRUE)
|
|
|
|
REPLAY_RECORD_BACK_FOR_TIME(1.0, 12.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
iTrevorProgress++
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 2
|
|
|
|
IF HAS_LABEL_BEEN_TRIGGERED("MCH1_CP04")
|
|
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
psTrevor.iConversationTimer = GET_GAME_TIMER()
|
|
iTrevorProgress++
|
|
ENDIF
|
|
|
|
IF WAS_LAST_CELLPHONE_CALL_INTERRUPTED()
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Last phone call was interrupted.")
|
|
#ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 3
|
|
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
|
|
iTrevorProgress++
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 4
|
|
|
|
ADD_CONTACT_TO_PHONEBOOK(CHAR_CHENGSR, TREVOR_BOOK, TRUE)
|
|
|
|
iTrevorProgress++
|
|
|
|
BREAK
|
|
|
|
CASE 5
|
|
|
|
IF ( bTextMessageSent = FALSE )
|
|
IF ( iSendTextMessageTimer = 0 )
|
|
iSendTextMessageTimer = GET_GAME_TIMER()
|
|
ELSE
|
|
IF HAS_TIME_PASSED(16000, iSendTextMessageTimer)
|
|
SEND_TEXT_MESSAGE_TO_CURRENT_PLAYER(CHAR_LAMAR, "MIC1_END", TXTMSG_UNLOCKED, TXTMSG_CRITICAL)
|
|
bTextMessageSent = TRUE
|
|
iSendTextMessageTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
ENDPROC
|
|
|
|
FUNC BOOL IS_MISSION_STAGE_FLY_HOME_COMPLETED(INT &iStageProgress)
|
|
|
|
//don't use locates header J skip
|
|
SET_BIT(sLocatesData.iLocatesBitSet, BS_DONT_DO_J_SKIP)
|
|
|
|
SWITCH iStageProgress
|
|
|
|
CASE 0
|
|
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("MI_1_FLY_PRE_PHONECALL")
|
|
START_AUDIO_SCENE("MI_1_FLY_PRE_PHONECALL")
|
|
ENDIF
|
|
|
|
IF NOT DOES_CAM_EXIST(ScriptedCamera)
|
|
|
|
ScriptedCamera = CREATE_CAMERA(CAMTYPE_SCRIPTED, TRUE)
|
|
|
|
SET_CAM_PARAMS(ScriptedCamera, <<3157.128906,7499.776855,5.372416>> + vGlobalFlightOffset, <<11.137081,-0.000000,145.805832>>,59.407524)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created scripted camera.")
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
|
|
DISPLAY_HUD(FALSE)
|
|
DISPLAY_RADAR(FALSE)
|
|
|
|
IF IS_PLAYER_PLAYING(PLAYER_ID())
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
|
|
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(vsTrevorsPlane.VehicleIndex)
|
|
|
|
SET_HELI_BLADES_FULL_SPEED(vsTrevorsPlane.VehicleIndex)
|
|
SET_VEHICLE_ENGINE_ON(vsTrevorsPlane.VehicleIndex, TRUE, TRUE)
|
|
|
|
FREEZE_ENTITY_POSITION(vsTrevorsPlane.VehicleIndex, TRUE)
|
|
ENDIF
|
|
|
|
bTextMessageSent = FALSE
|
|
|
|
iStageProgress++
|
|
|
|
BREAK
|
|
|
|
CASE 1
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(vsTrevorsPlane.VehicleIndex)
|
|
|
|
IF NOT IS_NEW_LOAD_SCENE_ACTIVE()
|
|
|
|
NEW_LOAD_SCENE_START(GET_CAM_COORD(ScriptedCamera), GET_ENTITY_FORWARD_VECTOR(vsTrevorsPlane.VehicleIndex), 4500.0)
|
|
|
|
iLoadSceneTimer = GET_GAME_TIMER()
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Calling NEW_LOAD_SCENE_START().")
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Load scene timer: ", GET_GAME_TIMER() - iLoadSceneTimer, ".")
|
|
#ENDIF
|
|
|
|
IF IS_NEW_LOAD_SCENE_LOADED()
|
|
OR HAS_TIME_PASSED(10000, iLoadSceneTimer)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
IF HAS_TIME_PASSED(10000, iLoadSceneTimer)
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Calling NEW_LOAD_SCENE_STOP() due to iLoadSceneTimer timeout.")
|
|
ELSE
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Calling NEW_LOAD_SCENE_STOP() due to IS_NEW_LOAD_SCENE_LOADED() returning TRUE.")
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
NEW_LOAD_SCENE_STOP()
|
|
|
|
REPLAY_RECORD_BACK_FOR_TIME(0.0, 12.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
iStageProgress++
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 2 //scene visible in camera should be streamed in by now
|
|
|
|
REQUEST_ANIM_DICT("missmic1")
|
|
|
|
IF HAS_ANIM_DICT_LOADED("missmic1")
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(vsTrevorsPlane.VehicleIndex)
|
|
|
|
FREEZE_ENTITY_POSITION(vsTrevorsPlane.VehicleIndex, FALSE)
|
|
|
|
START_PLAYBACK_RECORDED_VEHICLE(vsTrevorsPlane.VehicleIndex, vsTrevorsPlane.iRecordingNumber, sVehicleRecordingsFile)
|
|
SET_GLOBAL_POSITION_OFFSET_FOR_RECORDED_VEHICLE_PLAYBACK(vsTrevorsPlane.VehicleIndex, vGlobalFlightOffset)
|
|
SET_POSITION_OFFSET_FOR_RECORDED_VEHICLE_PLAYBACK(vsTrevorsPlane.VehicleIndex, vLocalPlaneOffset)
|
|
|
|
SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vsTrevorsPlane.VehicleIndex, fPlaneRecordingSkipTime)
|
|
SET_PLAYBACK_SPEED(vsTrevorsPlane.VehicleIndex, 0.9)
|
|
|
|
SET_VEHICLE_ENGINE_ON(vsTrevorsPlane.VehicleIndex, TRUE, TRUE)
|
|
SET_HELI_BLADES_FULL_SPEED(vsTrevorsPlane.VehicleIndex)
|
|
CONTROL_LANDING_GEAR(vsTrevorsPlane.VehicleIndex, LGC_RETRACT_INSTANT)
|
|
|
|
ENDIF
|
|
|
|
IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iPlaneSceneID)
|
|
|
|
iPlaneSceneID = CREATE_SYNCHRONIZED_SCENE(<< 0.0, 0.0, 0.0 >>, << 0.0, 0.0, 0.0 >>)
|
|
|
|
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(iPlaneSceneID, vsTrevorsPlane.VehicleIndex, 0)
|
|
|
|
DESTROY_ALL_CAMS()
|
|
|
|
ScriptedCamera = CREATE_CAMERA(CAMTYPE_ANIMATED, TRUE)
|
|
|
|
PLAY_SYNCHRONIZED_CAM_ANIM(ScriptedCamera, iPlaneSceneID, "trevor_plane_cam", "missmic1")
|
|
|
|
IF GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_IN_AIRCRAFT) = CAM_VIEW_MODE_FIRST_PERSON
|
|
bCamViewModeContextChanged = TRUE
|
|
SET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_IN_AIRCRAFT, CAM_VIEW_MODE_THIRD_PERSON_MEDIUM)
|
|
ENDIF
|
|
|
|
RENDER_SCRIPT_CAMS(TRUE, FALSE)
|
|
|
|
ENDIF
|
|
|
|
psTrevor.iTimer = GET_GAME_TIMER()
|
|
|
|
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME_LONG)
|
|
|
|
iStageProgress++
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 3
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
IF IS_VEHICLE_DRIVEABLE(vsTrevorsPlane.VehicleIndex)
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vsTrevorsPlane.VehicleIndex)
|
|
DRAW_DEBUG_TEXT_ABOVE_ENTITY(vsTrevorsPlane.VehicleIndex, GET_STRING_FROM_FLOAT(GET_TIME_POSITION_IN_RECORDING(vsTrevorsPlane.VehicleIndex)), 1.25)
|
|
ENDIF
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
DISABLE_PLAYER_VEHICLE_CONTROLS_THIS_FRAME()
|
|
DISABLE_CONTROL_ACTION(CAMERA_CONTROL, INPUT_NEXT_CAMERA)
|
|
|
|
DISABLE_FIRST_PERSON_FLASH_EFFECT_THIS_UPDATE()
|
|
|
|
IF HAS_TIME_PASSED(iCutsceneTime, psTrevor.iTimer)
|
|
|
|
RENDER_SCRIPT_CAMS(FALSE, TRUE, iInterpTime, FALSE) //interpolate back to gameplay camera from animated camera
|
|
|
|
DISPLAY_HUD(TRUE)
|
|
DISPLAY_RADAR(TRUE)
|
|
|
|
IF bStageReplayInProgress = FALSE
|
|
IF bCamViewModeContextChanged = FALSE
|
|
ANIMPOSTFX_PLAY("SwitchSceneTrevor", 0, FALSE)
|
|
PLAY_SOUND_FRONTEND(-1, "Hit_1", "LONG_PLAYER_SWITCH_SOUNDS")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_PLAYER_PLAYING(PLAYER_ID())
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
ENDIF
|
|
|
|
INFORM_MISSION_STATS_SYSTEM_OF_TIME_WINDOW_OPEN(MIC1_LANDING_TIME)
|
|
|
|
bWeatherTypeThunderSet = FALSE
|
|
bWeatherTypeOvercastSet = FALSE
|
|
bFirstPersonFXTriggered = FALSE
|
|
|
|
SETTIMERA(0)
|
|
|
|
iStageProgress++
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 4
|
|
|
|
IF ( bWeatherTypeOvercastSet = FALSE )
|
|
SET_WEATHER_TYPE_OVERTIME_PERSIST("EXTRASUNNY", 60.0)
|
|
iWeatherTypeTimer = GET_GAME_TIMER()
|
|
bWeatherTypeOvercastSet = TRUE
|
|
ENDIF
|
|
|
|
fDistanceToDestination = GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), vFlightBackDestination)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
DRAW_DEBUG_TEXT_ABOVE_ENTITY(PLAYER_PED_ID(), GET_STRING_FROM_FLOAT(fDistanceToDestination), 0.5, 255, 255, 255)
|
|
#ENDIF
|
|
|
|
//disable player camera control when camera is interpolating from script camera to gameplay camera
|
|
IF IS_INTERPOLATING_FROM_SCRIPT_CAMS()
|
|
DISABLE_CONTROL_ACTION(CAMERA_CONTROL, INPUT_LOOK_BEHIND)
|
|
DISABLE_CONTROL_ACTION(CAMERA_CONTROL, INPUT_VEH_LOOK_BEHIND)
|
|
DISABLE_CONTROL_ACTION(CAMERA_CONTROL, INPUT_LOOK_LR)
|
|
DISABLE_CONTROL_ACTION(CAMERA_CONTROL, INPUT_LOOK_UD)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ENTER)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_EXIT)
|
|
DISABLE_CONTROL_ACTION(CAMERA_CONTROL, INPUT_NEXT_CAMERA)
|
|
|
|
IF ( bCamViewModeContextChanged = TRUE )
|
|
IF ( bFirstPersonFXTriggered = FALSE )
|
|
IF TIMERA() > iInterpTime - 300
|
|
ANIMPOSTFX_PLAY("CamPushInTrevor", 0, FALSE)
|
|
PLAY_SOUND_FRONTEND(-1, "1st_Person_Transition", "PLAYER_SWITCH_CUSTOM_SOUNDSET")
|
|
bFirstPersonFXTriggered = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ELSE
|
|
IF ( bCamViewModeContextChanged = TRUE )
|
|
SET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_IN_AIRCRAFT, CAM_VIEW_MODE_FIRST_PERSON)
|
|
bCamViewModeContextChanged = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
MANAGE_CONVERSATIONS_DURING_FLIGHT_HOME(psTrevor.iConversationProgress)
|
|
|
|
IS_PLAYER_AT_LOCATION_IN_VEHICLE(sLocatesData, vFlightBackDestination, DEFAULT_LOCATES_SIZE_VECTOR(), TRUE, vsTrevorsPlane.VehicleIndex, "MCH1_GT_T8", sLabelTGETIN2, sLabelTGETBCK2, TRUE)
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(vsTrevorsPlane.VehicleIndex)
|
|
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vsTrevorsPlane.VehicleIndex)
|
|
|
|
IF ( bVehiclePlaybackInterrupted = FALSE )
|
|
|
|
IF ( GET_VEHICLE_RECORDING_PLAYBACK_PERCENTAGE(vsTrevorsPlane.VehicleIndex) > 98.0 )
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(vsTrevorsPlane.VehicleIndex)
|
|
ENDIF
|
|
|
|
IF IS_PLAYER_IN_CONTROL_OF_VEHICLE(vsTrevorsPlane.VehicleIndex)
|
|
|
|
STOP_PLAYBACK_RECORDED_VEHICLE(vsTrevorsPlane.VehicleIndex)
|
|
|
|
CLEAR_PED_TASKS(PLAYER_PED_ID())
|
|
|
|
bVehiclePlaybackInterrupted = TRUE
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
|
|
IF IS_VEHICLE_DRIVEABLE(vsTrevorsPlane.VehicleIndex)
|
|
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<1719.452637,3254.324951,40.144505>>, <<1048.329956,3073.852295,50.704060>>, 34.0)
|
|
AND IS_ENTITY_IN_ANGLED_AREA(vsTrevorsPlane.VehicleIndex, <<1719.452637,3254.324951,40.144505>>, <<1048.329956,3073.852295,50.704060>>, 34.0)
|
|
|
|
IF ( GET_ENTITY_HEIGHT_ABOVE_GROUND(vsTrevorsPlane.VehicleIndex) < 2.0 )
|
|
IF ( GET_ENTITY_SPEED(vsTrevorsPlane.VehicleIndex) < 10.0 )
|
|
OR IS_VEHICLE_STOPPED(vsTrevorsPlane.VehicleIndex)
|
|
|
|
iStageProgress++
|
|
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 5
|
|
|
|
IF BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(vsTrevorsPlane.VehicleIndex, 6.0)
|
|
|
|
REPLAY_RECORD_BACK_FOR_TIME(10.0, 5.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
DESTROY_ALL_CAMS()
|
|
|
|
TRIGGER_MUSIC_EVENT("MIC1_FLIGHT_LANDED")
|
|
|
|
CLEAR_MISSION_LOCATION_TEXT_AND_BLIPS(sLocatesData)
|
|
|
|
INFORM_MISSION_STATS_SYSTEM_OF_TIME_WINDOW_CLOSED()
|
|
|
|
RETURN TRUE
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
RETURN FALSE
|
|
|
|
ENDFUNC
|
|
|
|
FUNC BOOL IS_MISSION_STAGE_END_COMPLETED(INT &iStageProgress)
|
|
|
|
SWITCH iStageProgress
|
|
|
|
CASE 0
|
|
|
|
IF DOES_ENTITY_EXIST(vsTrevorsCar.VehicleIndex)
|
|
IF NOT IS_ENTITY_DEAD(vsTrevorsCar.VehicleIndex)
|
|
IF IS_THIS_MODEL_A_HELI(GET_ENTITY_MODEL(vsTrevorsCar.VehicleIndex))
|
|
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(vsTrevorsCar.VehicleIndex, FALSE)
|
|
ENDIF
|
|
SET_MISSION_VEHICLE_GEN_VEHICLE(vsTrevorsCar.VehicleIndex, vsTrevorsCar.vPosition, vsTrevorsCar.fHeading)
|
|
bTrevorsCarSetAsVehicleGenVehicle = TRUE
|
|
WAIT(1)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF ( bTextMessageSent = FALSE )
|
|
SEND_TEXT_MESSAGE_TO_CURRENT_PLAYER(CHAR_LAMAR, "MIC1_END", TXTMSG_UNLOCKED, TXTMSG_CRITICAL)
|
|
bTextMessageSent = TRUE
|
|
ENDIF
|
|
|
|
RETURN TRUE
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
RETURN FALSE
|
|
|
|
ENDFUNC
|
|
|
|
//|============================= END MISSION STAGES FUNCTIONS ============================|
|
|
|
|
//|=================================== MAIN SCRIPT LOOP ==================================|
|
|
|
|
SCRIPT
|
|
|
|
SET_MISSION_FLAG (TRUE)
|
|
|
|
//check for death or arrest
|
|
IF HAS_FORCE_CLEANUP_OCCURRED()
|
|
|
|
STORE_FAIL_WEAPON(GET_PED_INDEX(CHAR_MICHAEL), ENUM_TO_INT(SELECTOR_PED_MICHAEL))
|
|
|
|
Mission_Flow_Mission_Force_Cleanup()
|
|
|
|
MISSION_CLEANUP()
|
|
|
|
IF ( bPrologueMapActive = TRUE ) //call the delayed cleanup of prologue assets/settings
|
|
SET_CLEANUP_TO_RUN_ON_RESPAWN(RCI_MICHAEL1) //any changes to this script prologue cleanup
|
|
//should be updated in RUN_RCI_MICHAEL1() from respawn_cleanup_data.sch
|
|
|
|
g_RestoreSnapshotWeaponsOnDeath = TRUE
|
|
RESTORE_PLAYER_PED_WEAPONS_IN_SNAPSHOT_FOR_CHAR(CHAR_MICHAEL)
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Calling RESTORE_PLAYER_PED_WEAPONS_IN_SNAPSHOT(PLAYER_PED_ID()).")
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
|
|
TERMINATE_THIS_THREAD()
|
|
|
|
ENDIF
|
|
|
|
//create debug widgets and skip menu
|
|
#IF IS_DEBUG_BUILD
|
|
CREATE_DEBUG_MISSION_STAGE_MENU()
|
|
CREATE_DEBUG_WIDGETS()
|
|
#ENDIF
|
|
|
|
//handle mission replay
|
|
IF IS_REPLAY_IN_PROGRESS()
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Mission replay is in progress.")
|
|
#ENDIF
|
|
|
|
SET_MISSION_STAGE_FOR_REPLAY(eMissionStage, Get_Replay_Mid_Mission_Stage())
|
|
|
|
eMichaelsFailWeapon = GET_FAIL_WEAPON(ENUM_TO_INT(SELECTOR_PED_MICHAEL))
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Michael's fail weapon from GET_FAIL_WEAPON() is ", GET_WEAPON_NAME(eMichaelsFailWeapon), ".")
|
|
#ENDIF
|
|
|
|
bReplayFlag = TRUE
|
|
|
|
//handle shitskip message
|
|
IF ( g_bShitSkipAccepted = TRUE )
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Shitskip accepted by the player.")
|
|
#ENDIF
|
|
|
|
SWITCH eMissionStage //check current mission stage when shit skip is accepted
|
|
|
|
CASE MISSION_STAGE_GET_TO_AIRPORT //if replaying and shit skipping MISSION_STAGE_GET_TO_AIRPORT
|
|
|
|
SWITCH GET_PLAYER_CHARACTER_AT_MISSION_START() //check character who started the mission
|
|
CASE CHAR_TREVOR //if mission was started as Trevor
|
|
eMissionStage = MISSION_STAGE_FLY_TO_NORTH_YANKTON //change stage to MISSION_STAGE_FLY_TO_NORTH_YANKTON
|
|
BREAK
|
|
CASE CHAR_MICHAEL
|
|
eMissionStage = GET_NEXT_MISSION_STAGE(eMissionStage)
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_FLY_TO_NORTH_YANKTON
|
|
|
|
SWITCH GET_PLAYER_CHARACTER_AT_MISSION_START() //check character who started the mission
|
|
CASE CHAR_TREVOR //if mission was started as Trevor
|
|
eMissionStage = MISSION_STAGE_CUTSCENE_GRAVEYARD //change stage to MISSION_STAGE_FLY_TO_NORTH_YANKTON
|
|
BREAK
|
|
CASE CHAR_MICHAEL
|
|
eMissionStage = GET_NEXT_MISSION_STAGE(eMissionStage)
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
BREAK
|
|
|
|
DEFAULT
|
|
eMissionStage = GET_NEXT_MISSION_STAGE(eMissionStage)
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Shitskip changed mission stage to ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eMissionStage), ".")
|
|
#ENDIF
|
|
|
|
ELSE
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Shitskip not triggered.")
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
|
|
//if mission is being replayed or shit skipped to stage MISSION_STAGE_CUTSCENE_GRAVEYARD
|
|
IF ( eMissionStage = MISSION_STAGE_CUTSCENE_GRAVEYARD )
|
|
SET_CUTSCENE_TRIGGER_FLAG_FOR_PLAYER_PED_ENUM(GET_PLAYER_CHARACTER_AT_MISSION_START(), bCutsceneTriggeredByMichael, bCutsceneTriggeredByTrevor)
|
|
ENDIF
|
|
|
|
ELSE
|
|
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(ENUM_TO_INT(MID_MISSION_STAGE_GET_TO_AIRPORT), "GET TO AIRPORT", FALSE)
|
|
ENDIF
|
|
|
|
IF IS_REPEAT_PLAY_ACTIVE()
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Repeat play is active.")
|
|
#ENDIF
|
|
|
|
IF NOT IS_REPLAY_IN_PROGRESS()
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Repeat play is active and mission replay is not in progress.")
|
|
#ENDIF
|
|
|
|
eMissionStage = MISSION_STAGE_CUTSCENE_INTRO
|
|
|
|
bReplayFlag = TRUE
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting local replay flag to TRUE for stage loading.")
|
|
#ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Mission stage is ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eMissionStage), " for repeat play and no mission replay.")
|
|
#ENDIF
|
|
|
|
ELSE
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Repeat play is active and mission replay is in progress.")
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Mission stage is ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eMissionStage), " for repeat play and mission replay.")
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
//loop forever until mission is passed or failed
|
|
WHILE TRUE
|
|
|
|
//check each frame if mission is failed due to fail conditions
|
|
//check only if mission stage loading has finished
|
|
IF ( bLoadingFlag = TRUE )
|
|
RUN_FAIL_CHECKS(eMissionStage, eMissionFail)
|
|
ENDIF
|
|
|
|
IF ( bPrologueMapActive = TRUE )
|
|
RUN_GRAVEYARD_GATES_CHECK(eMissionStage, bOpenGateTriggered, bSmoothCloseGateTriggered, iGateCloseProgress)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
IF NOT IS_ENTITY_DEAD(GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID()))
|
|
IF IS_THIS_MODEL_A_CAR(GET_ENTITY_MODEL(GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID())))
|
|
IF NOT DOES_ENTITY_EXIST(g_MissionStatSingleSpeedWatchEntity)
|
|
OR (IS_ENTITY_A_VEHICLE(g_MissionStatSingleSpeedWatchEntity) AND GET_VEHICLE_INDEX_FROM_ENTITY_INDEX(g_MissionStatSingleSpeedWatchEntity) != GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID()))
|
|
INFORM_MISSION_STATS_OF_SPEED_WATCH_ENTITY(GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID()))
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
REPLAY_CHECK_FOR_EVENT_THIS_FRAME("M_BuryTheHatchet")
|
|
|
|
SWITCH eMissionStage
|
|
|
|
CASE MISSION_STAGE_CUTSCENE_INTRO
|
|
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
|
|
UPDATE_FIRST_PERSON_VEHICLE_CAMERA_BLOCKING()
|
|
|
|
IF IS_MISSION_STAGE_LOADED(eMissionStage, iStageSetupProgress, bLoadingFlag, bSkipFlag, bReplayFlag)
|
|
IF IS_MISSION_STAGE_CUTSCENE_INTRO_COMPLETED(iMissionStageProgress)
|
|
RESET_MISSION_FLAGS()
|
|
eMissionStage = MISSION_STAGE_GET_TO_AIRPORT
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_GET_TO_AIRPORT
|
|
|
|
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
|
|
CASE CHAR_MICHAEL
|
|
IF DOES_ENTITY_EXIST(psTrevor.PedIndex)
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.5)
|
|
ENDIF
|
|
BREAK
|
|
CASE CHAR_TREVOR
|
|
IF IS_PED_IN_THIS_VEHICLE(PLAYER_PED_ID(), vsTrevorsPlane.VehicleIndex)
|
|
HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_AREA_NAME)
|
|
HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_DISTRICT_NAME)
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
UPDATE_FIRST_PERSON_VEHICLE_CAMERA_BLOCKING()
|
|
|
|
IF IS_MISSION_STAGE_LOADED(eMissionStage, iStageSetupProgress, bLoadingFlag, bSkipFlag, bReplayFlag)
|
|
IF IS_MISSION_STAGE_GET_TO_AIRPORT_COMPLETED(iMissionStageProgress)
|
|
RESET_MISSION_FLAGS()
|
|
eMissionStage = MISSION_STAGE_CUTSCENE_AIRPORT
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_FLY_TO_NORTH_YANKTON //this stage can only be reached on a retry or debug skip
|
|
|
|
IF IS_PED_IN_THIS_VEHICLE(PLAYER_PED_ID(), vsTrevorsPlane.VehicleIndex)
|
|
HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_AREA_NAME)
|
|
HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_DISTRICT_NAME)
|
|
ENDIF
|
|
|
|
IF IS_MISSION_STAGE_LOADED(eMissionStage, iStageSetupProgress, bLoadingFlag, bSkipFlag, bReplayFlag)
|
|
IF IS_MISSION_STAGE_FLY_TO_NORTH_YANKTON_COMPLETED(iMissionStageProgress)
|
|
RESET_MISSION_FLAGS()
|
|
REPLAY_RECORD_BACK_FOR_TIME(8.0, 0.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
eMissionStage = MISSION_STAGE_CUTSCENE_AIRPORT
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_CUTSCENE_AIRPORT
|
|
IF IS_MISSION_STAGE_LOADED(eMissionStage, iStageSetupProgress, bLoadingFlag, bSkipFlag, bReplayFlag)
|
|
IF IS_MISSION_STAGE_CUTSCENE_AIRPORT_COMPLETED(iMichaelStageProgress, iTrevorStageProgress)
|
|
RESET_MISSION_FLAGS()
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
|
|
eMissionStage = MISSION_STAGE_GET_TO_GRAVEYARD
|
|
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
|
|
eMissionStage = MISSION_STAGE_CUTSCENE_GRAVEYARD
|
|
bCutsceneTriggeredByMichael = FALSE
|
|
bCutsceneTriggeredByTrevor = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_GET_TO_GRAVEYARD
|
|
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.5)
|
|
REPLAY_DISABLE_CAMERA_MOVEMENT_THIS_FRAME()
|
|
|
|
IF IS_MISSION_STAGE_LOADED(eMissionStage, iStageSetupProgress, bLoadingFlag, bSkipFlag, bReplayFlag)
|
|
IF IS_MISSION_STAGE_GET_TO_GRAVEYARD_COMPLETED(iMissionStageProgress)
|
|
RESET_MISSION_FLAGS()
|
|
eMissionStage = MISSION_STAGE_GET_TO_GRAVE
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_GET_TO_GRAVE
|
|
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
REPLAY_DISABLE_CAMERA_MOVEMENT_THIS_FRAME()
|
|
|
|
IF IS_MISSION_STAGE_LOADED(eMissionStage, iStageSetupProgress, bLoadingFlag, bSkipFlag, bReplayFlag)
|
|
IF IS_MISSION_STAGE_GET_TO_GRAVE_COMPLETED(iMissionStageProgress)
|
|
RESET_MISSION_FLAGS()
|
|
eMissionStage = MISSION_STAGE_CUTSCENE_GRAVEYARD
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_CUTSCENE_GRAVEYARD
|
|
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
REPLAY_DISABLE_CAMERA_MOVEMENT_THIS_FRAME()
|
|
|
|
IF IS_MISSION_STAGE_LOADED(eMissionStage, iStageSetupProgress, bLoadingFlag, bSkipFlag, bReplayFlag)
|
|
IF IS_MISSION_STAGE_CUTSCENE_GRAVEYARD_COMPLETED(iMissionStageProgress)
|
|
RESET_MISSION_FLAGS()
|
|
eMissionStage = MISSION_STAGE_GRAVEYARD_SHOOTOUT
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_GRAVEYARD_SHOOTOUT
|
|
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
REPLAY_DISABLE_CAMERA_MOVEMENT_THIS_FRAME()
|
|
|
|
IF IS_MISSION_STAGE_LOADED(eMissionStage, iStageSetupProgress, bLoadingFlag, bSkipFlag, bReplayFlag)
|
|
IF IS_MISSION_STAGE_GRAVEYARD_SHOOTOUT_COMPLETED(iMissionStageProgress)
|
|
RESET_MISSION_FLAGS()
|
|
eMissionStage = MISSION_STAGE_CUTSCENE_KIDNAPPED
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_CUTSCENE_KIDNAPPED
|
|
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
REPLAY_DISABLE_CAMERA_MOVEMENT_THIS_FRAME()
|
|
|
|
IF IS_MISSION_STAGE_LOADED(eMissionStage, iStageSetupProgress, bLoadingFlag, bSkipFlag, bReplayFlag)
|
|
IF IS_MISSION_STAGE_CUTSCENE_KIDNAPPED_COMPLETED(iMissionStageProgress)
|
|
RESET_MISSION_FLAGS()
|
|
eMissionStage = MISSION_STAGE_FLY_HOME
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_FLY_HOME
|
|
|
|
HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_AREA_NAME)
|
|
HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_DISTRICT_NAME)
|
|
|
|
IF IS_MISSION_STAGE_LOADED(eMissionStage, iStageSetupProgress, bLoadingFlag, bSkipFlag, bReplayFlag)
|
|
IF IS_MISSION_STAGE_FLY_HOME_COMPLETED(iMissionStageProgress)
|
|
RESET_MISSION_FLAGS()
|
|
eMissionStage = MISSION_STAGE_END
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_END
|
|
IF IS_MISSION_STAGE_LOADED(eMissionStage, iStageSetupProgress, bLoadingFlag, bSkipFlag, bReplayFlag)
|
|
IF IS_MISSION_STAGE_END_COMPLETED(iMissionStageProgress)
|
|
RESET_MISSION_FLAGS()
|
|
eMissionStage = MISSION_STAGE_PASSED
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_PASSED
|
|
|
|
AWARD_ACHIEVEMENT_FOR_MISSION(ACH03) // The Not-So Shallow Grave
|
|
|
|
MISSION_FLOW_MISSION_PASSED()
|
|
|
|
MISSION_CLEANUP()
|
|
|
|
IF ( bPrologueMapActive = TRUE )
|
|
PROLOGUE_MAP_CLEANUP() //remove prologue map if active
|
|
ENDIF
|
|
|
|
TERMINATE_THIS_THREAD()
|
|
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_FAILED
|
|
|
|
STORE_FAIL_WEAPON(GET_PED_INDEX(CHAR_MICHAEL), ENUM_TO_INT(SELECTOR_PED_MICHAEL))
|
|
|
|
SET_MISSION_FAILED_WITH_REASON(eMissionFail, bPrologueMapActive)
|
|
|
|
CLEAR_HELP()
|
|
CLEAR_PRINTS()
|
|
KILL_ANY_CONVERSATION()
|
|
IF NOT IS_REPEAT_PLAY_ACTIVE()
|
|
REMOVE_CONTACT_FROM_INDIVIDUAL_PHONEBOOK(CHAR_CHENGSR, TREVOR_BOOK)
|
|
ENDIF
|
|
|
|
TRIGGER_MUSIC_EVENT("MIC1_FAIL") //stop all music
|
|
IF IS_STREAM_PLAYING() STOP_STREAM() ENDIF //stop flashback stream if it is playing
|
|
|
|
IF ( bPlayerDroveOffRoute = TRUE ) //if player failed for going off route
|
|
IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID()) //stop the player when going off route
|
|
BRING_VEHICLE_TO_HALT(GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID()), 10.0, 5) //to the graveyard
|
|
ENDIF
|
|
ENDIF
|
|
|
|
WHILE NOT GET_MISSION_FLOW_SAFE_TO_CLEANUP()
|
|
WAIT(0)
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Waiting for GET_MISSION_FLOW_SAFE_TO_CLEANUP() to return TRUE.")
|
|
#ENDIF
|
|
ENDWHILE
|
|
|
|
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
|
|
CASE CHAR_MICHAEL
|
|
IF ( bPrologueMapActive = TRUE )
|
|
RESTORE_PLAYER_PED_WEAPONS_IN_SNAPSHOT(PLAYER_PED_ID()) //restore weapons stroed in snapshot
|
|
MISSION_FLOW_SET_FAIL_WARP_LOCATION(<<-1039.6115, -2740.5698, 19.1693>>, 328.9699) //warp Michael to airport terminal
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Calling RESTORE_PLAYER_PED_WEAPONS_IN_SNAPSHOT(PLAYER_PED_ID()).")
|
|
#ENDIF
|
|
ENDIF
|
|
BREAK
|
|
CASE CHAR_TREVOR
|
|
IF ( bTrevorFlightActive = TRUE )
|
|
MISSION_FLOW_SET_FAIL_WARP_LOCATION(<<1782.9651, 3314.9270, 40.4374>>, 341.4644) //warp Trevor near countryside air
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
MISSION_CLEANUP()
|
|
|
|
IF ( bPrologueMapActive = TRUE )
|
|
PROLOGUE_MAP_CLEANUP() //remove prologue map if active
|
|
ENDIF
|
|
|
|
|
|
TERMINATE_THIS_THREAD()
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
|
|
INFORM_MISSION_STATS_OF_DAMAGE_WATCH_ENTITY(PLAYER_PED_ID(), MIC1_DAMAGE)
|
|
|
|
IF DOES_ENTITY_EXIST(vsTrevorsPlane.VehicleIndex)
|
|
AND IS_VEHICLE_DRIVEABLE(vsTrevorsPlane.VehicleIndex)
|
|
AND IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vsTrevorsPlane.VehicleIndex)
|
|
INFORM_MISSION_STATS_OF_DAMAGE_WATCH_ENTITY(vsTrevorsPlane.VehicleIndex, MIC1_PLANE_DAMAGE)
|
|
ELSE
|
|
INFORM_MISSION_STATS_OF_DAMAGE_WATCH_ENTITY(NULL, MIC1_PLANE_DAMAGE)
|
|
ENDIF
|
|
|
|
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
AND (IS_THIS_MODEL_A_CAR(GET_ENTITY_MODEL(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()))) OR IS_THIS_MODEL_A_BIKE(GET_ENTITY_MODEL(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()))))
|
|
INFORM_MISSION_STATS_OF_DAMAGE_WATCH_ENTITY(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()), MIC1_CAR_DAMAGE)
|
|
ELSE
|
|
INFORM_MISSION_STATS_OF_DAMAGE_WATCH_ENTITY(NULL, MIC1_CAR_DAMAGE)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD //handle debug functionality
|
|
RUN_DEBUG_PASS_AND_FAIL_CHECK(eMissionStage, eMissionFail) //handle key_f and key_s presses
|
|
RUN_DEBUG_MISSION_STAGE_MENU(iReturnStage, eMissionStage, bSkipFlag, bStageResetFlag) //handle z-skip menu
|
|
RUN_DEBUG_SKIPS(eMissionStage, bSkipFlag, bStageResetFlag) //handle j-skip and p-skip
|
|
RUN_DEBUG_WIDGETS(eMissionStage) //handle rag widgets
|
|
RUN_DEBUG_INFORMATION_DISPLAY() //handle drawing of debug information
|
|
#ENDIF
|
|
|
|
WAIT(0)
|
|
|
|
ENDWHILE
|
|
|
|
ENDSCRIPT
|