Files
2025-09-29 00:52:08 +02:00

17809 lines
727 KiB
Python
Executable File

//
//
// Author: Alan Litobarski Date: 16/08/2011
//
//
//
// Michael 2 - Fresh Meat (Michael2.sc)
//
// Player gets kidnapped.
// Use hot-swap to narrow down the location of a ped.
//
//
//Compile out Title Update changes to header functions.
//Must be before includes.
//CONST_INT USE_TU_CHANGES 0 // Removed by Kenneth R.
// HEADERS
USING "rage_builtins.sch"
USING "globals.sch"
USING "commands_misc.sch"
USING "commands_pad.sch"
USING "commands_script.sch"
USING "commands_player.sch"
USING "commands_streaming.sch"
USING "commands_vehicle.sch"
USING "commands_camera.sch"
USING "commands_path.sch"
USING "commands_fire.sch"
USING "commands_graphics.sch"
USING "commands_object.sch"
USING "commands_task.sch"
USING "commands_misc.sch"
USING "commands_entity.sch"
USING "commands_hud.sch"
USING "commands_object.sch"
USING "commands_interiors.sch"
USING "commands_misc.sch"
USING "cellphone_public.sch"
USING "flow_public_core_override.sch"
USING "model_enums.sch"
USING "script_player.sch"
USING "selector_public.sch"
USING "player_ped_public.sch"
USING "dialogue_public.sch"
USING "locates_public.sch"
USING "chase_hint_cam.sch"
USING "LineActivation.sch"
USING "script_blips.sch"
USING "script_heist.sch"
USING "script_buttons.sch"
USING "replay_public.sch"
USING "cam_recording_public.sch"
USING "help_at_location.sch"
USING "cutscene_public.sch"
USING "mission_stat_public.sch"
USING "CompletionPercentage_public.sch"
USING "taxi_functions.sch"
USING "shared_hud_displays.sch"
USING "emergency_call.sch"
USING "spline_cam_edit.sch"
USING "building_control_public.sch"
USING "cheat_controller_public.sch"
USING "commands_recording.sch"
USING "push_in_public.sch"
USING "script_misc.sch"
#IF IS_DEBUG_BUILD
USING "script_debug.sch"
USING "select_mission_stage.sch"
#ENDIF
// CONST
CONST_INT iTotalRailNodes 40
CONST_INT iEnemyIntroCut 10
CONST_INT iEnemyOutside 3
CONST_INT iEnemyShootout 16
CONST_INT iEnemyBackup 12
CONST_INT iEnemySetPiece 10
CONST_INT iEnemyEscape 8
CONST_INT iEnemyChase 2
CONST_INT iTotalEnemy iEnemyIntroCut + iEnemyOutside + iEnemyShootout + iEnemyBackup + iEnemySetPiece + iEnemyEscape + iEnemyChase
// ENUMS
ENUM MissionObjective
initMission,
stageCutIntro,
stageFindMichael,
stageAbattoirShootout,
stageSwitchToMichael,
stageMichaelEscape,
stageMichaelFree,
stageTriadsChase,
stageBackToMichaels,
stageCutEnd,
passMission,
failMission
ENDENUM
MissionObjective eMissionObjective = initMission
#IF IS_DEBUG_BUILD
MissionObjective eMissionObjectiveAutoJSkip = initMission
#ENDIF
ENUM MissionFail
failFranklinDied,
failMichaelDied,
failFranklinAbandon,
failMichaelAbandon,
failCarDestroyed,
failOutOfAmmo,
failGeneric
ENDENUM
MissionFail eMissionFail
//Combat Attributes
ENUM ADVANCE_STYLE
GO_TO_COMBAT,
GO_TO_POINT,
AIM_TO_POINT,
GUN_TO_POINT,
PEEK_FROM_POINT
ENDENUM
//Audio
ENUM AUDIO_TRACK
NO_AUDIO,
MIC2_START,
MIC2_FRANK_VEH,
MIC2_FIND_A_WAY,
MIC2_SWITCHED,
MIC2_FIGHT_BEGINS,
MIC2_FIGHT_CONT,
MIC2_ABATTOIR_PROGRESS,
MIC2_ACID_BATH_OS,
MIC2_MULCHED,
MIC2_SPINNING_BLADES,
MIC2_HANGING_MICHAEL,
MIC2_BACK_TO_FRANK,
MIC3_FRANK_DOWN,
MIC2_FRANK_SAVED,
MIC2_VEHICLE_READY,
MIC2_LOSE_TRIADS,
MIC2_TRIADS_LOST,
MIC2_RADIO_SETUP,
MIC2_OVER,
MIC2_DEAD,
MIC2_FIND_MIKE_RT,
MIC2_FIGHT_BEGINS_RT,
MIC2_HANGING_RT,
MIC2_MICHAEL_ESCAPE_RT,
MIC2_TRIADS_CHASE_RT
ENDENUM
AUDIO_TRACK ePrepAudioTrack = NO_AUDIO
AUDIO_TRACK ePlayAudioTrack = NO_AUDIO
// STRUCTURES
//SWITCH
SELECTOR_PED_STRUCT sSelectorPeds
SELECTOR_CAM_STRUCT sCamDetails
//Dialogue
structPedsForConversation sPedsForConversation
//Locates Struct
LOCATES_HEADER_DATA sLocatesData
STRUCT RAIL_NODE_STRUCT
VECTOR vPos
VECTOR vRot
ENDSTRUCT
RAIL_NODE_STRUCT sRailNodes[iTotalRailNodes]
STRUCT ACTOR
PED_INDEX pedIndex
BLIP_INDEX blipIndex
INT iStage = 0
INT iTimer
//Advance Conditions
INT iTime[3]
PED_INDEX pedCheck[3]
VECTOR vLocate[3]
VECTOR vLocSize[3]
FLOAT fDist[3]
INT iBitsetStrict //BOOL bStrict[3]
//Advance Style
ADVANCE_STYLE eAdvanceStyle[3]
FLOAT fSpeed[3]
INT iBitsetNavMesh //BOOL bNavMesh[3]
//Advance Point
VECTOR vPoint[3]
//Advance Point
STRING sAnimDict
STRING sAnimName
#IF IS_DEBUG_BUILD
STRING sDebugName
#ENDIF
ENDSTRUCT
ACTOR sEnemyIntroCut[iEnemyIntroCut]
ACTOR sEnemyOutside[iEnemyOutside]
ACTOR sEnemyShootout[iEnemyShootout]
ACTOR sEnemyBackup[iEnemyBackup]
ACTOR sEnemySetPiece[iEnemySetPiece]
ACTOR sEnemyEscape[iEnemyEscape]
ACTOR sEnemyChase[iEnemyChase]
AI_BLIP_STRUCT blipStructOutside[iEnemyOutside]
AI_BLIP_STRUCT blipStructShootout[iEnemyShootout]
AI_BLIP_STRUCT blipStructBackup[iEnemyBackup]
AI_BLIP_STRUCT blipStructSetPiece[iEnemySetPiece]
AI_BLIP_STRUCT blipStructEscape[iEnemyEscape]
// VARIABLES
//Rail Variables
INT iCurrentNode
INT iRailNodeToStopAt
BOOL bOkToMoveRail
BOOl bOkToHangFromHook
//BOOL bFixedRotation
VECTOR vRailCurrent
FLOAT fMoveSpeedMult = 0.225 // / 2
FLOAT fHookMass = 2000.0
//Switch Variables
BOOL bOkToSwitch
//BOOL bReattach
//INT iReattach
BOOL bRailInit
FLOAT fDistTotalFirstFinalNode
FLOAT fDistFromCurrentNode
FLOAT fDistFromFinalNode
INT iTimerNode = -1
//VECTOR vHeadingForSwappingToFranklin
//VECTOR vFranklinGameCamRot = <<0.0, 0.0, 190.5426>>
//BOOL bUseNewInterpCam
//Gun Throw Variables
//BOOL bShootingUpsideDown
FLOAT fHeadingTrack
//Set Piece Variables
ENUM SET_PIECE
SET_PIECE_FALL,
// SET_PIECE_KNIFE,
SET_PIECE_RAIL,
SET_PIECE_STEAM,
SET_PIECE_STAIR,
SET_PIECE_GRINDER,
SET_PIECE_CUTTER,
SET_PIECE_MINCER,
SET_PIECE_CONVEYOR,
SET_PIECE_GRAPPLE,
SET_PIECE_COW
ENDENUM
INT iSetPiece[COUNT_OF(SET_PIECE)]
INT sceneSteam
INT sceneGrinder
INT sceneConveyor
INT sceneGrapple
VECTOR vGrapplePos = <<997.380, -2103.649, 29.450 + 0.07>>
VECTOR vGrappleRot = <<0.0, 0.0, -95.0>>
INT iGrappleStage //Grapple set piece Sync Scene stage
//Integers
INT iCutsceneStage
INT iDialogueStage = 0
INT iDialogueLineCount[5]
INT iDialogueTimer[4]
//#IF IS_DEBUG_BUILD
//INT iDebugNode = -1 //DEBUG REMOVE THIS
//#ENDIF
//INT iHealthStore = -1
BOOL bBlood //Track if blood has been applied to Michael
enumCharacterList pedBlood //Ped char changes...
INT iBulletTimer //For tracking the time since the player shot their weapon
INT iDamageTimer //Time before peds can be damaged by buddy
INT iAdvanceTimer //Time before peds advance
INT iCowShootTimer
OBJECT_INDEX objCow
INT iDoesObjectOfTypeExistAtCoords
//INT iDriveByTimer
ENUM CHASE_TIMER_INDEX
CHASE_TIMER_ENEMY_1,
CHASE_TIMER_ENEMY_2,
CHASE_TIMER_CAR
ENDENUM
INT iChaseTimer[3]
VECTOR vCurrentPoint, vChasePoint
FLOAT fCurrentPoint, fChasePoint
//Stats
//INT iAmmo = -1
//WEAPON_TYPE wtCurrent
//Bools
BOOL bVideoRecording
BOOL bInitStage
BOOL bCleanupStage
BOOL bRadar
#IF IS_DEBUG_BUILD //Debug
BOOL bAutoSkipping
#ENDIF
#IF IS_DEBUG_BUILD //Debug
BOOL bDebugMichaelDeathSkip
BOOL bDebugMichaelDeathDoNotFail
BOOL bDebugMichaelSkipToStart
BOOL bDebugMichaelSkipToCapture
BOOL bDebugMichaelCapturePoint
INT iCaptureNode
VECTOR vCaptureCurrent, vRailCurrentRot
INT iCaptureStage
INT iCaptureTimer
BOOL bDebugMichaelPausePlay
INT iDebugMichaelDebugTime = -1
BOOL bDebugMichaelDebugTime
BOOL bDebugMichaelSetDebugCam
BOOL bDebugMichaelCaptureDebugCam
CAMERA_INDEX camDebug
INT iDebugMichaelHandCam, iDebugMichaelHandCamLast
FLOAT fDebugMichaelHandCam = 1.0
#ENDIF
BOOL bSkipped //Used for J-skipping and Mid Mission Replay
BOOL bReplaySkip
BOOL bCutsceneSkipped //Tracks if WAS_CUTSCENE_SKIPPED() returns TRUE
BOOL bPreloaded //For Preloaded Cutscene
BOOL bPinnedAbattoir
BOOL bGrabGrinder
BOOL bGrabCutter
BOOL bGrabMincer
BOOL bFranklinToMichael
BOOL bPhoneSwitch
BOOL bHaltVehicle
BOOL bPassed //Passed the mission
BOOL bSetUncapped
#IF IS_DEBUG_BUILD
BOOL bDebugAudio
#ENDIF
BOOL bFrankToMikeSwitchCam, bFrankToMikeSwitchCam2 //Keep whichever camera is loaded for the switch, even if the player gets out the car again
//Vectors and Floats
VECTOR VECTOR_ZERO = <<0.0, 0.0, 0.0>>
VECTOR vPlayerStart = <<997.8165, -2178.0439, 28.3477>>
CONST_FLOAT fPlayerStart 87.8708
VECTOR vChainOffset = <<0.0, -0.09, -0.875>>
VECTOR vChainRotation = <<-0.01, 0.0, 180.0>>
VECTOR vPadlockOffset = <<0.0, 0.075, -0.91>>
VECTOR vPadlockRotation = <<0.0, 0.0, 180.0>>
VECTOR vMichaelAttachOffset = <<-0.01, -0.05, -2.05 + 0.25>>
//VECTOR vHookPosOffset = VECTOR_ZERO
//Strings
STRING sAnimDictMic2SetPiece1 = "missmic2@goon1"
STRING sAnimDictMic2SetPiece2 = "missmic2@goon2"
STRING sAnimDictMic2Hook = "missmic2@meat_hook"
STRING sAnimDictMic2Switch = "missmic2@switch"
STRING sAnimDictMic2Smoking = "missmic2@enemy"
STRING sAnimDictMic2WashFace = "missmic2_washing_face"
STRING sAnimDictMic2FranklinBeckon = "missmic2@franklin_beckon"
STRING sAnimDictMic2LeadOut = "missmic_2_intleadout"
STRING sAnimDictMic2IG11 = "missmic2ig_11"
//STRING sAnimDictHang = "misswiphanging"
STRING sAnimDictIdle1 = "amb@world_human_hang_out_street@male_a@idle_a" //idle_a b c d e
STRING sAnimDictIdle2 = "amb@world_human_hang_out_street@male_b@idle_a" //idle_a b c d
STRING sAnimDictIdle3 = "amb@world_human_hang_out_street@male_c@base" //base
STRING sAnimDictIdle4 = "amb@world_human_hang_out_street@male_c@idle_a" //idle_a b c
STRING sAnimDictMachine = "missmic2@machine"
//Scenes
INT sceneSwitch
VECTOR sceneSwitchPos = <<994.094, -2150.380, 31.385>> //<<994.157, -2150.380, 31.385>>
VECTOR sceneSwitchRot = <<0.0, -4.430, -6.840>> //<<0.526, 0.0, -4.430>>
INT sceneCow
VECTOR sceneCowPos = <<964.096, -2106.750, 30.469>>
VECTOR sceneCowRot = <<0.0, 0.0, -4.0>>
INT sceneWashFace
VECTOR sceneWashFacePos = <<-803.583, 168.284, 76.285>>
VECTOR sceneWashFaceRot = <<0.0, 0.0, 110.0>>
// INDEXES
//Ped
PED_INDEX pedClosestEnemy
PED_INDEX pedIntro
PED_INDEX pedDenise
PED_INDEX pedFriend1
PED_INDEX pedFriend2
//Vehicle
VEHICLE_INDEX vehCar
VEHICLE_INDEX vehFranklin
VEHICLE_INDEX vehEnemy[iEnemyChase]
VEHICLE_INDEX vehEnemyChase[iEnemyChase / 2]
VEHICLE_INDEX vehHachiRoku
VEHICLE_INDEX vehEscape
VEHICLE_INDEX vehEnd
//Blip
BLIP_INDEX blipMichael
BLIP_INDEX blipFranklin
BLIP_INDEX blipDestination
BLIP_INDEX blipEnemyVan[iEnemyChase / 2]
BLIP_INDEX blipGuns
//Pickup
//Camera
CAMERA_INDEX camMain
CAMERA_INDEX camAnim
CAMERA_INDEX camSwitch
//Sequence
SEQUENCE_INDEX seqMain
//Interior
INTERIOR_INSTANCE_INDEX intAbattoir
INTERIOR_INSTANCE_INDEX intMansion
//Object
OBJECT_INDEX objDoorAnim
OBJECT_INDEX objDoorReal
OBJECT_INDEX objHook
OBJECT_INDEX objChain
OBJECT_INDEX objPadlock
OBJECT_INDEX objCrate[3]
OBJECT_INDEX objGrinder
OBJECT_INDEX objCutter
OBJECT_INDEX objMincer
VECTOR vCigaretteAttachOffset = <<0.035, 0.0, 0.0>>
VECTOR vCigaretteParticleOffset = <<-0.08, 0.0, 0.0>>
PTFX_ID ptfxCigarette[4]
OBJECT_INDEX objCigarette[4]
OBJECT_INDEX objGun
//OBJECT_INDEX objBinBag
//Pickup
PICKUP_INDEX piPickups[5]
//Doors
INT iFrontDoor = HASH("DOORHASH_F_HOUSE_SC_F")
INT iEntranceDoor = ENUM_TO_INT(DOORHASH_ABBATOIR_FRONT_L)
INT iExitDoor = HASH("DOORHASH_ABATTOIR_EXIT")
//Navmesh
INT iNavBlock[5]
//Particle
//Cover
COVERPOINT_INDEX covPoint[22]
//Groups
//Weapons
WEAPON_TYPE wtLastWeapon = WEAPONTYPE_UNARMED
//Relationship Groups
REL_GROUP_HASH relGroupFriendlyFire
REL_GROUP_HASH relGroupBuddy
REL_GROUP_HASH relGroupEnemy
REL_GROUP_HASH relGroupPassive
//Sound
INT sfxRail = -1
INT sfxWoosh = -1
INT sfxCow = -1
//Push In Cam Struct
PUSH_IN_DATA pushInData //BUG 2006022, 2005375, 2005357
//Rayfire
//Model Names
#IF IS_DEBUG_BUILD
WIDGET_GROUP_ID widGroup
#ENDIF
// FUNCTIONS
BOOL bPlayerControl = TRUE
PROC SAFE_SET_PLAYER_CONTROL(PLAYER_INDEX iPlayerIndex, BOOL bSetControlOn, SET_PLAYER_CONTROL_FLAGS iFlags = 0)
SET_PLAYER_CONTROL(iPlayerIndex, bSetControlOn, iFlags)
bPlayerControl = bSetControlOn
ENDPROC
FUNC BOOL SAFE_IS_PLAYER_CONTROL_ON()
IF bPlayerControl
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
//Stage Selector
#IF IS_DEBUG_BUILD
INT iStageSkipMenu
CONST_INT MAX_SKIP_MENU_LENGTH COUNT_OF(MissionObjective) - 2 //Number of stages in mission minus Pass/Fail
MissionStageMenuTextStruct SkipMenuStruct[MAX_SKIP_MENU_LENGTH]
PROC MissionNames()
SkipMenuStruct[0].sTxtLabel = "initMission"
SkipMenuStruct[1].sTxtLabel = "stageCutIntro - (MIC_2_INT)"
SkipMenuStruct[2].sTxtLabel = "stageFindMichael - (MIC_2_MCS_1)"
SkipMenuStruct[3].sTxtLabel = "stageAbattoirShootout"
SkipMenuStruct[4].sTxtLabel = "stageSwitchToMichael"
SkipMenuStruct[5].sTxtLabel = "stageMichaelEscape"
SkipMenuStruct[6].sTxtLabel = "stageMichaelFree"
SkipMenuStruct[7].sTxtLabel = "stageTriadsChase"
SkipMenuStruct[8].sTxtLabel = "stageBackToMichaels"
SkipMenuStruct[9].sTxtLabel = "stageCutEnd - (mic_2_mcs_3_concat)"
ENDPROC
#ENDIF
//Text
STRING sConversationBlock = "MCH2AUD"
INT iTriggeredTextHashes[120]
INT iNumTextHashesStored = 0
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++
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--
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
//Models
INT iLoadedModelHashes[20]
FUNC BOOL HAS_MODEL_BEEN_LOADED(MODEL_NAMES mnModel)
INT iHash = ENUM_TO_INT(mnModel)
INT i
REPEAT COUNT_OF(iLoadedModelHashes) i
IF iLoadedModelHashes[i] = iHash
RETURN TRUE
ENDIF
ENDREPEAT
RETURN FALSE
ENDFUNC
PROC SET_MODEL_AS_LOADED(MODEL_NAMES mnModel, BOOL bIsLoaded)
INT iHash = ENUM_TO_INT(mnModel)
INT i = 0
BOOL bQuitLoop = FALSE
WHILE i < COUNT_OF(iLoadedModelHashes) AND NOT bQuitLoop
IF bIsLoaded
IF iLoadedModelHashes[i] = 0
iLoadedModelHashes[i] = iHash
bQuitLoop = TRUE
ENDIF
ELSE
IF iLoadedModelHashes[i] = iHash
iLoadedModelHashes[i] = 0
bQuitLoop = TRUE
ENDIF
ENDIF
i++
ENDWHILE
ENDPROC
PROC CLEAR_LOADED_MODELS()
INT i = 0
REPEAT COUNT_OF(iLoadedModelHashes) i
iLoadedModelHashes[i] = 0
ENDREPEAT
ENDPROC
FUNC BOOL HAS_MODEL_LOADED_CHECK(MODEL_NAMES mnModel)
IF NOT HAS_MODEL_BEEN_LOADED(mnModel)
REQUEST_MODEL(mnModel) #IF IS_DEBUG_BUILD PRINTLN("LOADING MODEL #", ENUM_TO_INT(mnModel)) #ENDIF
IF HAS_MODEL_LOADED(mnModel)
SET_MODEL_AS_LOADED(mnModel, TRUE) #IF IS_DEBUG_BUILD PRINTLN("MODEL #", ENUM_TO_INT(mnModel), " LOADED") #ENDIF
ENDIF
ELSE
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
//Recordings
INT iLoadedRecordingHashes[30]
FUNC BOOL HAS_RECORDING_BEEN_LOADED(INT iFileNumber, STRING sRecordingName)
TEXT_LABEL txtHash
txtHash = iFileNumber
txtHash += sRecordingName
INT iHash = GET_HASH_KEY(txtHash)
INT i
REPEAT COUNT_OF(iLoadedRecordingHashes) i
IF iLoadedRecordingHashes[i] = iHash
RETURN TRUE
ENDIF
ENDREPEAT
RETURN FALSE
ENDFUNC
PROC SET_RECORDING_AS_LOADED(INT iFileNumber, STRING sRecordingName, BOOL bIsLoaded)
TEXT_LABEL txtHash
txtHash = iFileNumber
txtHash += sRecordingName
INT iHash = GET_HASH_KEY(txtHash)
INT i = 0
BOOL bQuitLoop = FALSE
WHILE i < COUNT_OF(iLoadedRecordingHashes) AND NOT bQuitLoop
IF bIsLoaded
IF iLoadedRecordingHashes[i] = 0
iLoadedRecordingHashes[i] = iHash
bQuitLoop = TRUE
ENDIF
ELSE
IF iLoadedRecordingHashes[i] = iHash
iLoadedRecordingHashes[i] = 0
bQuitLoop = TRUE
ENDIF
ENDIF
i++
ENDWHILE
ENDPROC
PROC CLEAR_LOADED_RECORDINGS()
INT i = 0
REPEAT COUNT_OF(iLoadedRecordingHashes) i
iLoadedRecordingHashes[i] = 0
ENDREPEAT
ENDPROC
FUNC BOOL HAS_RECORDING_LOADED_CHECK(INT iFileNumber, STRING sRecordingName)
IF NOT HAS_RECORDING_BEEN_LOADED(iFileNumber, sRecordingName)
REQUEST_VEHICLE_RECORDING(iFileNumber, sRecordingName)
IF HAS_VEHICLE_RECORDING_BEEN_LOADED(iFileNumber, sRecordingName)
SET_RECORDING_AS_LOADED(iFileNumber, sRecordingName, TRUE)
PRINTSTRING("RECORDING ") PRINTINT(iFileNumber) PRINTSTRING(" ") PRINTSTRING(sRecordingName) PRINTSTRING(" LOADED")
PRINTNL()
ELSE
PRINTSTRING("LOADING RECORDING ") PRINTINT(iFileNumber) PRINTSTRING(" ") PRINTSTRING(sRecordingName)
PRINTNL()
ENDIF
ELSE
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
//Animation Dictionaries
INT iAnimDictHashes[20]
FUNC BOOL HAS_ANIM_DICT_BEEN_LOADED(STRING strAnimDict)
INT iHash = GET_HASH_KEY(strAnimDict)
INT iNumHashes = COUNT_OF(iAnimDictHashes)
INT i = 0
REPEAT iNumHashes i
IF iAnimDictHashes[i] = iHash
RETURN TRUE
ENDIF
ENDREPEAT
RETURN FALSE
ENDFUNC
PROC SET_ANIM_DICT_AS_LOADED(STRING strAnimDict, BOOL bIsLoaded)
INT iHash = GET_HASH_KEY(strAnimDict)
INT iNumHashes = COUNT_OF(iAnimDictHashes)
INT i = 0
BOOL bQuitLoop = FALSE
WHILE i < iNumHashes AND NOT bQuitLoop
IF bIsLoaded
IF iAnimDictHashes[i] = 0
iAnimDictHashes[i] = iHash
bQuitLoop = TRUE
ENDIF
ELSE
IF iAnimDictHashes[i] = iHash
iAnimDictHashes[i] = 0
bQuitLoop = TRUE
ENDIF
ENDIF
i++
ENDWHILE
ENDPROC
PROC CLEAR_LOADED_ANIM_DICTS()
INT iNumHashes = COUNT_OF(iAnimDictHashes)
INT i = 0
REPEAT iNumHashes i
iAnimDictHashes[i] = 0
ENDREPEAT
ENDPROC
FUNC BOOL HAS_ANIM_DICT_LOADED_CHECK(STRING strAnimDict)
IF NOT HAS_ANIM_DICT_BEEN_LOADED(strAnimDict)
REQUEST_ANIM_DICT(strAnimDict) #IF IS_DEBUG_BUILD PRINTLN("LOADING ANIM DICT ", strAnimDict) #ENDIF
IF HAS_ANIM_DICT_LOADED(strAnimDict)
SET_ANIM_DICT_AS_LOADED(strAnimDict, TRUE) #IF IS_DEBUG_BUILD PRINTLN("LOADING ANIM DICT ", strAnimDict, " LOADED") #ENDIF
ENDIF
ELSE
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
PROC UNLOAD_ANIM_DICT(STRING strAnimDict)
IF HAS_ANIM_DICT_BEEN_LOADED(strAnimDict)
REMOVE_ANIM_DICT(strAnimDict) #IF IS_DEBUG_BUILD PRINTLN("REMOVE ANIM DICT ", strAnimDict) #ENDIF
SET_ANIM_DICT_AS_LOADED(strAnimDict, FALSE)
ENDIF
ENDPROC
PROC ADVANCE_CUTSCENE()
SETTIMERA(0)
iCutsceneStage++
PRINTLN("iCutsceneStage = ", iCutsceneStage)
ENDPROC
PROC ADVANCE_STAGE()
bCleanupStage = TRUE
ENDPROC
FUNC BOOL SKIPPED_STAGE()
IF bSkipped = TRUE
bSkipped = FALSE
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
ENDFUNC
FUNC BOOL INIT_STAGE()
IF bInitStage = FALSE
SETTIMERA(0)
bInitStage = TRUE
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
ENDFUNC
FUNC BOOL CLEANUP_STAGE()
IF bCleanupStage = TRUE
SETTIMERA(0)
bInitStage = FALSE
bCleanupStage = FALSE
iCutsceneStage = 0
iDialogueStage = 0
INT i
REPEAT COUNT_OF(iDialogueLineCount) i
iDialogueLineCount[i] = -1
ENDREPEAT
REPEAT COUNT_OF(iDialogueTimer) i
iDialogueTimer[i] = 0
ENDREPEAT
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
ENDFUNC
PROC SAFE_CLEAR_HELP(BOOL bClearNow = TRUE)
IF IS_HELP_MESSAGE_BEING_DISPLAYED()
CLEAR_HELP(bClearNow)
ENDIF
ENDPROC
PROC CLEAR_TEXT()
CLEAR_PRINTS()
SAFE_CLEAR_HELP(TRUE)
CLEAR_ALL_FLOATING_HELP()
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDPROC
PROC PRINT_ADV(STRING sPrint, INT iDuration = DEFAULT_GOD_TEXT_TIME, BOOL bOnce = TRUE)
IF NOT HAS_LABEL_BEEN_TRIGGERED(sPrint)
PRINT_NOW(sPrint, iDuration, 1)
SET_LABEL_AS_TRIGGERED(sPrint, bOnce)
ENDIF
ENDPROC
PROC PRINT_HELP_ADV(STRING sPrint, BOOL bOnce = TRUE, BOOL bForever = FALSE, INT iOverrideTime = -1)
IF NOT HAS_LABEL_BEEN_TRIGGERED(sPrint)
IF NOT bForever
PRINT_HELP(sPrint, iOverrideTime)
ELSE
PRINT_HELP_FOREVER(sPrint)
ENDIF
SET_LABEL_AS_TRIGGERED(sPrint, bOnce)
ENDIF
ENDPROC
PROC PRINT_HELP_ADV_POS(STRING sPrint, VECTOR vLocation, ENTITY_INDEX entIndex = NULL, BOOL bOnce = TRUE, eARROW_DIRECTION eArrow = HELP_TEXT_SOUTH, INT iDuration = 7500)
IF NOT HAS_LABEL_BEEN_TRIGGERED(sPrint)
IF NOT ARE_VECTORS_EQUAL(vLocation, VECTOR_ZERO)
AND vLocation.Z != 0.0
AND entIndex = NULL
HELP_AT_LOCATION(sPrint, vLocation, eArrow, iDuration)
ELIF NOT ARE_VECTORS_EQUAL(vLocation, VECTOR_ZERO)
AND vLocation.Z = 0.0
AND entIndex = NULL
HELP_AT_SCREEN_LOCATION(sPrint, vLocation.X, vLocation.Y, eArrow, iDuration)
ELIF entIndex != NULL
AND ARE_VECTORS_EQUAL(vLocation, VECTOR_ZERO)
HELP_AT_ENTITY(sPrint, entIndex, eArrow, iDuration)
ELIF entIndex != NULL
AND NOT ARE_VECTORS_EQUAL(vLocation, VECTOR_ZERO)
HELP_AT_ENTITY_OFFSET(sPrint, entIndex, vLocation, eArrow, iDuration)
ENDIF
SET_LABEL_AS_TRIGGERED(sPrint, bOnce)
ENDIF
ENDPROC
FUNC PED_INDEX PLAYER_PED(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
FUNC PED_INDEX NOT_PLAYER_PED_ID()
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN
RETURN sSelectorPeds.pedID[GET_SELECTOR_SLOT_FROM_PLAYER_PED_ENUM(CHAR_MICHAEL)]
ELSE //GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN
RETURN sSelectorPeds.pedID[GET_SELECTOR_SLOT_FROM_PLAYER_PED_ENUM(CHAR_FRANKLIN)]
ENDIF
ENDFUNC
PROC SET_PED_POSITION(PED_INDEX pedIndex, VECTOR vCoords, FLOAT fHeading, BOOL bKeepVehicle = TRUE)
IF bKeepVehicle = TRUE
SET_PED_COORDS_KEEP_VEHICLE(pedIndex, vCoords)
ELSE
SET_ENTITY_COORDS(pedIndex, vCoords)
ENDIF
SET_ENTITY_HEADING(pedIndex, fHeading)
ENDPROC
PROC SET_VEHICLE_POSITION(VEHICLE_INDEX vehicleIndex, VECTOR vCoords, FLOAT fHeading)
SET_ENTITY_COORDS(vehicleIndex, vCoords)
SET_ENTITY_HEADING(vehicleIndex, fHeading)
ENDPROC
PROC SPAWN_PLAYER(PED_INDEX &pedIndex, enumCharacterList eChar, VECTOR vStart, FLOAT fStart = 0.0, BOOL bDefault = FALSE)
IF NOT DOES_ENTITY_EXIST(pedIndex)
WHILE NOT CREATE_PLAYER_PED_ON_FOOT(pedIndex, eChar, vStart, fStart)
WAIT(0)
ENDWHILE
IF bDefault = TRUE
SET_PED_DEFAULT_COMPONENT_VARIATION(pedIndex)
ENDIF
ENDIF
ENDPROC
PROC SPAWN_PED(PED_INDEX &pedIndex, MODEL_NAMES eModel, VECTOR vStart, FLOAT fStart = 0.0, BOOL bDefault = TRUE)
IF NOT DOES_ENTITY_EXIST(pedIndex)
pedIndex = CREATE_PED(PEDTYPE_MISSION, eModel, vStart, fStart)
IF bDefault = TRUE
SET_PED_DEFAULT_COMPONENT_VARIATION(pedIndex)
ENDIF
ENDIF
ENDPROC
PROC SPAWN_VEHICLE(VEHICLE_INDEX &vehIndex, MODEL_NAMES eModel, VECTOR vStart, FLOAT fStart = 0.0, INT iColour = -1, FLOAT fDirt = 0.0)
IF NOT DOES_ENTITY_EXIST(vehIndex)
vehIndex = CREATE_VEHICLE(eModel, vStart, fStart)
IF iColour >= 0
SET_VEHICLE_COLOURS(vehIndex, iColour, iColour)
ENDIF
SET_VEHICLE_DIRT_LEVEL(vehIndex, fDirt)
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(vehIndex, TRUE)
ENDIF
ENDPROC
FUNC BOOL SAFE_IS_PED_DEAD(PED_INDEX &pedIndex)
IF DOES_ENTITY_EXIST(pedIndex)
IF IS_PED_INJURED(pedIndex)
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SAFE_IS_VEHICLE_DEAD(VEHICLE_INDEX &vehIndex)
IF DOES_ENTITY_EXIST(vehIndex)
IF IS_ENTITY_DEAD(vehIndex)
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SAFE_DEATH_CHECK_PED(PED_INDEX &pedIndex)
IF DOES_ENTITY_EXIST(pedIndex)
IF IS_ENTITY_DEAD(pedIndex)
OR IS_PED_INJURED(pedIndex)
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SAFE_DEATH_CHECK_VEHICLE(VEHICLE_INDEX &vehIndex)
IF DOES_ENTITY_EXIST(vehIndex)
IF IS_ENTITY_DEAD(vehIndex)
OR NOT IS_VEHICLE_DRIVEABLE(vehIndex)
OR IS_VEHICLE_PERMANENTLY_STUCK(vehIndex)
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
PROC SAFE_ADD_BLIP_LOCATION(BLIP_INDEX &blipIndex, VECTOR vCoords, BOOL bRoute = FALSE)
IF NOT DOES_BLIP_EXIST(blipIndex)
blipIndex = CREATE_BLIP_FOR_COORD(vCoords, bRoute)
SET_BLIP_PRIORITY(blipIndex, BLIPPRIORITY_HIGHEST)
ENDIF
ENDPROC
PROC SAFE_ADD_BLIP_PED(BLIP_INDEX &blipIndex, PED_INDEX &pedIndex, BOOL bEnemy = TRUE)
IF NOT DOES_BLIP_EXIST(blipIndex)
IF DOES_ENTITY_EXIST(pedIndex)
IF NOT IS_PED_INJURED(pedIndex)
blipIndex = CREATE_BLIP_FOR_PED(pedIndex, bEnemy)
IF bEnemy = FALSE
SET_BLIP_PRIORITY(blipIndex, BLIPPRIORITY_HIGH)
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
PROC SAFE_ADD_BLIP_VEHICLE(BLIP_INDEX &blipIndex, VEHICLE_INDEX &vehIndex, BOOL bEnemy = TRUE)
IF NOT DOES_BLIP_EXIST(blipIndex)
IF DOES_ENTITY_EXIST(vehIndex)
IF NOT IS_ENTITY_DEAD(vehIndex)
blipIndex = CREATE_BLIP_FOR_VEHICLE(vehIndex, bEnemy)
IF bEnemy = FALSE
SET_BLIP_PRIORITY(blipIndex, BLIPPRIORITY_HIGH)
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
PROC SAFE_REMOVE_BLIP(BLIP_INDEX &blipIndex)
IF DOES_BLIP_EXIST(blipIndex)
REMOVE_BLIP(blipIndex)
ENDIF
ENDPROC
PROC SAFE_DELETE_PED(PED_INDEX &pedIndex)
IF DOES_ENTITY_EXIST(pedIndex)
DELETE_PED(pedIndex)
ENDIF
ENDPROC
PROC SAFE_DELETE_VEHICLE(VEHICLE_INDEX &vehicleIndex)
IF DOES_ENTITY_EXIST(vehicleIndex)
DELETE_VEHICLE(vehicleIndex)
ENDIF
ENDPROC
PROC SAFE_DELETE_OBJECT(OBJECT_INDEX &objectIndex)
IF DOES_ENTITY_EXIST(objectIndex)
DELETE_OBJECT(objectIndex)
ENDIF
ENDPROC
PROC SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(VEHICLE_INDEX &vehIndex, FLOAT fTime)
IF IS_VEHICLE_DRIVEABLE(vehIndex)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehIndex)
SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehIndex, fTime - GET_TIME_POSITION_IN_RECORDING(vehIndex))
ENDIF
ENDIF
ENDPROC
STRUCT BLIP_TIMER
BLIP_INDEX blipIndex
INT iBlipTimer
ENDSTRUCT
BLIP_TIMER sBlipTimer[10]
PROC SET_BLIP_FLASH_DURATION(BLIP_INDEX blipIndex, INT iDuration = 7500)
INT i
BOOL bSlotCheck
BOOL bFreeSlot
REPEAT 10 i
IF sBlipTimer[i].blipIndex = blipIndex
bSlotCheck = TRUE
ENDIF
ENDREPEAT
IF bSlotCheck = FALSE
REPEAT 10 i
IF bFreeSlot = FALSE
IF sBlipTimer[i].blipIndex = NULL
sBlipTimer[i].blipIndex = blipIndex
sBlipTimer[i].iBlipTimer = GET_GAME_TIMER() + iDuration
SET_BLIP_FLASHES(sBlipTimer[i].blipIndex, TRUE)
bFreeSlot = TRUE
ENDIF
ENDIF
ENDREPEAT
ENDIF
IF bFreeSlot = FALSE
SCRIPT_ASSERT("No free blip timer slots! Consider expanding array.")
ENDIF
ENDPROC
PROC UPDATE_BLIP_FLASH_TIMERS()
INT i
REPEAT 10 i
IF sBlipTimer[i].blipIndex != NULL
IF GET_GAME_TIMER() > sBlipTimer[i].iblipTimer
SET_BLIP_FLASHES(sBlipTimer[i].blipIndex, FALSE)
sBlipTimer[i].blipIndex = NULL
sBlipTimer[i].iblipTimer = 0
ENDIF
ENDIF
ENDREPEAT
ENDPROC
PROC SAFE_FREEZE_ENTITY_POSITION(ENTITY_INDEX EntityIndex, BOOL FrozenByScriptFlag)
IF NOT IS_ENTITY_ATTACHED(EntityIndex)
IF (IS_ENTITY_A_PED(EntityIndex)
AND NOT IS_PED_IN_ANY_VEHICLE(GET_PED_INDEX_FROM_ENTITY_INDEX(EntityIndex)))
OR NOT IS_ENTITY_A_PED(EntityIndex)
FREEZE_ENTITY_POSITION(EntityIndex, FrozenByScriptFlag)
ENDIF
ENDIF
ENDPROC
FUNC STRUCT_ENTITY_ID CONSTRUCT_ENTITY_ID()
STRUCT_ENTITY_ID structEntityID
RETURN structEntityID
ENDFUNC
FUNC FLOAT RETURN_GROUND_Z_FOR_3D_COORD(VECTOR vCoord)
GET_GROUND_Z_FOR_3D_COORD(vCoord, vCoord.Z)
RETURN vCoord.Z
ENDFUNC
FUNC FLOAT GET_INTERP_POINT_FLOAT(FLOAT fStartPos, FLOAT fEndPos, FLOAT fStartTime, FLOAT fEndTime, FLOAT fPointTime)
RETURN ((((fEndPos - fStartPos) / (fEndTime - fStartTime)) * (fPointTime - fStartTime)) + fStartPos)
ENDFUNC
FUNC VECTOR GET_INTERP_POINT_VECTOR(VECTOR vStartPos, VECTOR vEndPos, FLOAT fStartTime, FLOAT fEndTime, FLOAT fPointTime)
RETURN <<GET_INTERP_POINT_FLOAT(vStartPos.X, vEndPos.X, fStartTime, fEndTime, fPointTime), GET_INTERP_POINT_FLOAT(vStartPos.Y, vEndPos.Y, fStartTime, fEndTime, fPointTime), GET_INTERP_POINT_FLOAT(vStartPos.Z, vEndPos.Z, fStartTime, fEndTime, fPointTime)>>
ENDFUNC
//This function will return the value of a number after it has been raised to a power
FUNC FLOAT TPO(FLOAT fNumber, INT iPower)
INT iLoopControl //This will act as a counter to control how long the loop runs
FLOAT fInitialValue = fNumber //This will be used in the loop to multiply the new value
//by its initial value
FLOAT fResult = 0 //This is the value that the function returns
//Use an if statement to determine how to handle the power function
//This loop will determine how many times to multiply the number by itself
IF iPower = 0
fResult = 1 //Note n^0 = 1
ELIF iPower = 1
fResult = fNumber
ELIF iPower < 0
iLoopControl = -iPower + 1
WHILE iLoopControl > 0
fNumber *= fInitialValue
iLoopControl--
ENDWHILE
fResult = 1 / fNumber
ELIF iPower > 1
iLoopControl = iPower - 1
WHILE iLoopControl > 0
fNumber *= fInitialValue
iLoopControl--
ENDWHILE
fResult = fNumber
ENDIF
RETURN fResult
ENDFUNC
FUNC VECTOR HERMITE_CURVE(VECTOR vStartPoint, VECTOR vStartTangent, VECTOR vEndPoint, VECTOR vEndTangent, FLOAT fStartTime, FLOAT fEndTime, FLOAT fPointTime)
FLOAT fScale, H1, H2, H3, H4
VECTOR vPoint
fScale = fPointTime / (fEndTime - fStartTime)
H1 = 2 * TPO(fScale, 3) - 3 * TPO(fScale, 2) + 1
H2 = -2 * TPO(fScale, 3) + 3 * TPO(fScale, 2)
H3 = TPO(fScale, 3) - 2 * TPO(fScale, 2) + fScale
H4 = TPO(fScale, 3) - TPO(fScale, 2)
vPoint = H1 * vStartPoint + H2 * vEndPoint + H3 * vStartTangent + H4 * vEndTangent
RETURN vPoint
ENDFUNC
///Function for returning the position on the Bezier curve defined by the values passed at time "fTime".
FUNC VECTOR GET_POSITION_ON_CURVE(VECTOR vStartPos, VECTOR vInterPos1, VECTOR vInterPos2, VECTOR vEndPos, FLOAT fTime, BOOL bIsCubic = TRUE)
IF bIsCubic
RETURN (((1-fTime) * (1-fTime) * (1-fTime) * vStartPos)
+ (3 * (1 - fTime) * (1 - fTime) * fTime * vInterPos1)
+ (3 * (1 - fTime) * fTime * fTime * vInterPos2)
+ (fTime * fTime * fTime * vEndPos))
ENDIF
RETURN ((((1-fTime)* (1-fTime)) * vStartPos)
+ (2 * (1-fTime) * fTime * vInterPos1)
+ (fTime * fTime * vEndPos))
ENDFUNC
FUNC FLOAT HEADING_BETWEEN_COORDS(VECTOR vCoord1, VECTOR vCoord2)
VECTOR vDirection = vCoord2 - vCoord1
RETURN ATAN2(vDirection.Y, vDirection.X)
ENDFUNC
#IF IS_DEBUG_BUILD
FUNC STRING CONCATENATE_STRINGS(STRING sString1, STRING sString2, STRING sString3 = NULL, STRING sString4 = NULL, STRING sString5 = NULL, STRING sString6 = NULL, STRING sString7 = NULL, STRING sString8 = NULL)
TEXT_LABEL txtStrings = sString1
txtStrings += sString2
IF NOT IS_STRING_NULL_OR_EMPTY(sString3)
txtStrings += sString3
ENDIF
IF NOT IS_STRING_NULL_OR_EMPTY(sString4)
txtStrings += sString4
ENDIF
IF NOT IS_STRING_NULL_OR_EMPTY(sString5)
txtStrings += sString5
ENDIF
IF NOT IS_STRING_NULL_OR_EMPTY(sString6)
txtStrings += sString6
ENDIF
IF NOT IS_STRING_NULL_OR_EMPTY(sString7)
txtStrings += sString7
ENDIF
IF NOT IS_STRING_NULL_OR_EMPTY(sString8)
txtStrings += sString8
ENDIF
RETURN GET_STRING_FROM_STRING(txtStrings, 0, GET_LENGTH_OF_LITERAL_STRING(txtStrings))
ENDFUNC
#ENDIF
FUNC FLOAT GET_HEADING_BETWEEN_VECTORS(VECTOR V1, VECTOR V2)
RETURN GET_HEADING_FROM_VECTOR_2D(V2.x-V1.x, V2.y-V1.y)
ENDFUNC
FUNC FLOAT GET_HEADING_FROM_VECTOR(VECTOR vVector)
RETURN vVector.Z
ENDFUNC
//MIC2_START = 2/2
//MIC2_FRANK_VEH =
//MIC2_FIND_A_WAY =
//MIC2_SWITCHED =
//MIC2_FIGHT_BEGINS = 2/2
//MIC2_FIGHT_CONT =
//MIC2_ABATTOIR_PROGRESS =
//MIC2_ACID_BATH_OS = 2/2
//MIC2_MULCHED = 2/2
//MIC2_SPINNING_BLADES = 2/2
//MIC2_HANGING_MICHAEL =
//MIC2_BACK_TO_FRANK =
//MIC3_FRANK_DOWN = 2/2
//MIC2_FRANK_SAVED = 2/2
//MIC2_VEHICLE_READY =
//MIC2_LOSE_TRIADS = 2/2
//MIC2_TRIADS_LOST =
//MIC2_OVER =
//MIC2_DEAD =
//MIC2_FIND_MIKE_RT =
//MIC2_FIGHT_BEGINS_RT =
//MIC2_HANGING_RT =
//MIC2_MICHAEL_ESCAPE_RT =
//MIC2_TRIADS_CHASE_RT =
STRING sAudioEvent
INT iAudioPrepareTimer //This is an override in case an audio event is prepared but never used
PROC AUDIO_CONTROLLER() #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("<<<<<<<< AUDIO_CONTROLLER >>>>>>>> (sAudioEvent = ", sAudioEvent, ")") ENDIF #ENDIF
IF ePlayAudioTrack = NO_AUDIO
AND (NOT IS_MUSIC_ONESHOT_PLAYING()
OR GET_GAME_TIMER() > iAudioPrepareTimer)
SWITCH ePrepAudioTrack
CASE MIC2_START #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Prepare - MIC2_START") ENDIF #ENDIF
IF IS_STRING_NULL_OR_EMPTY(sAudioEvent)
OR NOT ARE_STRINGS_EQUAL(sAudioEvent, "MIC2_START")
IF NOT IS_STRING_NULL_OR_EMPTY(sAudioEvent)
#IF IS_DEBUG_BUILD IF #ENDIF CANCEL_MUSIC_EVENT(sAudioEvent) #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Cancelled audio - sAudioEvent = ", sAudioEvent) ENDIF ENDIF #ENDIF
ENDIF
sAudioEvent = "MIC2_START" #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Preparing audio - sAudioEvent = ", sAudioEvent) ENDIF #ENDIF
ELSE
IF PREPARE_MUSIC_EVENT("MIC2_START")
ePrepAudioTrack = NO_AUDIO #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Prepared audio - MIC2_START") ENDIF #ENDIF
ENDIF
ENDIF
BREAK
CASE MIC2_FIGHT_BEGINS #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Prepare - MIC2_FIGHT_BEGINS") ENDIF #ENDIF
IF IS_STRING_NULL_OR_EMPTY(sAudioEvent)
OR NOT ARE_STRINGS_EQUAL(sAudioEvent, "MIC2_FIGHT_BEGINS")
IF NOT IS_STRING_NULL_OR_EMPTY(sAudioEvent)
#IF IS_DEBUG_BUILD IF #ENDIF CANCEL_MUSIC_EVENT(sAudioEvent) #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Cancelled audio - sAudioEvent = ", sAudioEvent) ENDIF ENDIF #ENDIF
ENDIF
sAudioEvent = "MIC2_FIGHT_BEGINS" #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Preparing audio - sAudioEvent = ", sAudioEvent) ENDIF #ENDIF
ELSE
IF PREPARE_MUSIC_EVENT("MIC2_FIGHT_BEGINS")
ePrepAudioTrack = NO_AUDIO #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Prepared audio - MIC2_FIGHT_BEGINS") ENDIF #ENDIF
ENDIF
ENDIF
BREAK
CASE MIC2_ACID_BATH_OS #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Prepare - MIC2_ACID_BATH_OS") ENDIF #ENDIF
IF IS_STRING_NULL_OR_EMPTY(sAudioEvent)
OR NOT ARE_STRINGS_EQUAL(sAudioEvent, "MIC2_ACID_BATH_OS")
IF NOT IS_STRING_NULL_OR_EMPTY(sAudioEvent)
#IF IS_DEBUG_BUILD IF #ENDIF CANCEL_MUSIC_EVENT(sAudioEvent) #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Cancelled audio - sAudioEvent = ", sAudioEvent) ENDIF ENDIF #ENDIF
ENDIF
sAudioEvent = "MIC2_ACID_BATH_OS" #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Preparing audio - sAudioEvent = ", sAudioEvent) ENDIF #ENDIF
ELSE
IF PREPARE_MUSIC_EVENT("MIC2_ACID_BATH_OS")
ePrepAudioTrack = NO_AUDIO #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Prepared audio - MIC2_ACID_BATH_OS") ENDIF #ENDIF
ENDIF
ENDIF
BREAK
CASE MIC2_MULCHED #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Prepare - MIC2_MULCHED") ENDIF #ENDIF
IF IS_STRING_NULL_OR_EMPTY(sAudioEvent)
OR NOT ARE_STRINGS_EQUAL(sAudioEvent, "MIC2_MULCHED")
IF NOT IS_STRING_NULL_OR_EMPTY(sAudioEvent)
#IF IS_DEBUG_BUILD IF #ENDIF CANCEL_MUSIC_EVENT(sAudioEvent) #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Cancelled audio - sAudioEvent = ", sAudioEvent) ENDIF ENDIF #ENDIF
ENDIF
sAudioEvent = "MIC2_MULCHED" #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Preparing audio - sAudioEvent = ", sAudioEvent) ENDIF #ENDIF
ELSE
IF PREPARE_MUSIC_EVENT("MIC2_MULCHED")
ePrepAudioTrack = NO_AUDIO #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Prepared audio - MIC2_MULCHED") ENDIF #ENDIF
ENDIF
ENDIF
BREAK
CASE MIC2_SPINNING_BLADES #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Prepare - MIC2_SPINNING_BLADES") ENDIF #ENDIF
IF IS_STRING_NULL_OR_EMPTY(sAudioEvent)
OR NOT ARE_STRINGS_EQUAL(sAudioEvent, "MIC2_SPINNING_BLADES")
IF NOT IS_STRING_NULL_OR_EMPTY(sAudioEvent)
#IF IS_DEBUG_BUILD IF #ENDIF CANCEL_MUSIC_EVENT(sAudioEvent) #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Cancelled audio - sAudioEvent = ", sAudioEvent) ENDIF ENDIF #ENDIF
ENDIF
sAudioEvent = "MIC2_SPINNING_BLADES" #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Preparing audio - sAudioEvent = ", sAudioEvent) ENDIF #ENDIF
ELSE
IF PREPARE_MUSIC_EVENT("MIC2_SPINNING_BLADES")
ePrepAudioTrack = NO_AUDIO #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Prepared audio - MIC2_SPINNING_BLADES") ENDIF #ENDIF
ENDIF
ENDIF
BREAK
CASE MIC3_FRANK_DOWN #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Prepare - MIC3_FRANK_DOWN") ENDIF #ENDIF
IF IS_STRING_NULL_OR_EMPTY(sAudioEvent)
OR NOT ARE_STRINGS_EQUAL(sAudioEvent, "MIC3_FRANK_DOWN")
IF NOT IS_STRING_NULL_OR_EMPTY(sAudioEvent)
#IF IS_DEBUG_BUILD IF #ENDIF CANCEL_MUSIC_EVENT(sAudioEvent) #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Cancelled audio - sAudioEvent = ", sAudioEvent) ENDIF ENDIF #ENDIF
ENDIF
sAudioEvent = "MIC3_FRANK_DOWN" #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Preparing audio - sAudioEvent = ", sAudioEvent) ENDIF #ENDIF
ELSE
IF PREPARE_MUSIC_EVENT("MIC3_FRANK_DOWN")
ePrepAudioTrack = NO_AUDIO #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Prepared audio - MIC3_FRANK_DOWN") ENDIF #ENDIF
ENDIF
ENDIF
BREAK
CASE MIC2_FRANK_SAVED #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Prepare - MIC2_FRANK_SAVED") ENDIF #ENDIF
IF IS_STRING_NULL_OR_EMPTY(sAudioEvent)
OR NOT ARE_STRINGS_EQUAL(sAudioEvent, "MIC2_FRANK_SAVED")
IF NOT IS_STRING_NULL_OR_EMPTY(sAudioEvent)
#IF IS_DEBUG_BUILD IF #ENDIF CANCEL_MUSIC_EVENT(sAudioEvent) #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Cancelled audio - sAudioEvent = ", sAudioEvent) ENDIF ENDIF #ENDIF
ENDIF
sAudioEvent = "MIC2_FRANK_SAVED" #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Preparing audio - sAudioEvent = ", sAudioEvent) ENDIF #ENDIF
ELSE
IF PREPARE_MUSIC_EVENT("MIC2_FRANK_SAVED")
ePrepAudioTrack = NO_AUDIO #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Prepared audio - MIC2_FRANK_SAVED") ENDIF #ENDIF
ENDIF
ENDIF
BREAK
CASE MIC2_LOSE_TRIADS #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Prepare - MIC2_LOSE_TRIADS") ENDIF #ENDIF
IF IS_STRING_NULL_OR_EMPTY(sAudioEvent)
OR NOT ARE_STRINGS_EQUAL(sAudioEvent, "MIC2_LOSE_TRIADS")
IF NOT IS_STRING_NULL_OR_EMPTY(sAudioEvent)
#IF IS_DEBUG_BUILD IF #ENDIF CANCEL_MUSIC_EVENT(sAudioEvent) #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Cancelled audio - sAudioEvent = ", sAudioEvent) ENDIF ENDIF #ENDIF
ENDIF
sAudioEvent = "MIC2_LOSE_TRIADS" #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Preparing audio - sAudioEvent = ", sAudioEvent) ENDIF #ENDIF
ELSE
IF PREPARE_MUSIC_EVENT("MIC2_LOSE_TRIADS")
ePrepAudioTrack = NO_AUDIO #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Prepared audio - MIC2_LOSE_TRIADS") ENDIF #ENDIF
ENDIF
ENDIF
BREAK
CASE MIC2_RADIO_SETUP #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Prepare - MIC2_RADIO_SETUP") ENDIF #ENDIF
IF IS_STRING_NULL_OR_EMPTY(sAudioEvent)
OR NOT ARE_STRINGS_EQUAL(sAudioEvent, "MIC2_RADIO_SETUP")
IF NOT IS_STRING_NULL_OR_EMPTY(sAudioEvent)
#IF IS_DEBUG_BUILD IF #ENDIF CANCEL_MUSIC_EVENT(sAudioEvent) #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Cancelled audio - sAudioEvent = ", sAudioEvent) ENDIF ENDIF #ENDIF
ENDIF
sAudioEvent = "MIC2_RADIO_SETUP" #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Preparing audio - sAudioEvent = ", sAudioEvent) ENDIF #ENDIF
ELSE
IF PREPARE_MUSIC_EVENT("MIC2_RADIO_SETUP")
ePrepAudioTrack = NO_AUDIO #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Prepared audio - MIC2_RADIO_SETUP") ENDIF #ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDIF
SWITCH ePlayAudioTrack
CASE MIC2_START #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Play - MIC2_START") ENDIF #ENDIF
IF IS_STRING_NULL_OR_EMPTY(sAudioEvent)
OR NOT ARE_STRINGS_EQUAL(sAudioEvent, "MIC2_START")
IF NOT IS_STRING_NULL_OR_EMPTY(sAudioEvent)
#IF IS_DEBUG_BUILD IF #ENDIF CANCEL_MUSIC_EVENT(sAudioEvent) #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Cancelled audio - sAudioEvent = ", sAudioEvent) ENDIF ENDIF #ENDIF
ENDIF
sAudioEvent = "MIC2_START" #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Preparing audio - sAudioEvent = ", sAudioEvent) ENDIF #ENDIF
ELSE
IF PREPARE_MUSIC_EVENT("MIC2_START")
IF TRIGGER_MUSIC_EVENT("MIC2_START")
iAudioPrepareTimer = GET_GAME_TIMER() + 5000 //Assumes 5 seconds is long enough for the one shot to play
ePlayAudioTrack = NO_AUDIO #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Playing audio - MIC2_START") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE MIC2_FRANK_VEH #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Play - MIC2_FRANK_VEH") ENDIF #ENDIF
IF TRIGGER_MUSIC_EVENT("MIC2_FRANK_VEH")
ePlayAudioTrack = NO_AUDIO #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Playing audio - MIC2_FRANK_VEH") ENDIF #ENDIF
ENDIF
BREAK
CASE MIC2_FIND_A_WAY #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Play - MIC2_FIND_A_WAY") ENDIF #ENDIF
IF TRIGGER_MUSIC_EVENT("MIC2_FIND_A_WAY")
ePlayAudioTrack = NO_AUDIO #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Playing audio - MIC2_FIND_A_WAY") ENDIF #ENDIF
ENDIF
BREAK
CASE MIC2_SWITCHED #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Play - MIC2_SWITCHED") ENDIF #ENDIF
IF TRIGGER_MUSIC_EVENT("MIC2_SWITCHED")
ePlayAudioTrack = NO_AUDIO #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Playing audio - MIC2_SWITCHED") ENDIF #ENDIF
ENDIF
BREAK
CASE MIC2_FIGHT_BEGINS #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Play - MIC2_FIGHT_BEGINS") ENDIF #ENDIF
IF IS_STRING_NULL_OR_EMPTY(sAudioEvent)
OR NOT ARE_STRINGS_EQUAL(sAudioEvent, "MIC2_FIGHT_BEGINS")
IF NOT IS_STRING_NULL_OR_EMPTY(sAudioEvent)
#IF IS_DEBUG_BUILD IF #ENDIF CANCEL_MUSIC_EVENT(sAudioEvent) #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Cancelled audio - sAudioEvent = ", sAudioEvent) ENDIF ENDIF #ENDIF
ENDIF
sAudioEvent = "MIC2_FIGHT_BEGINS" #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Preparing audio - sAudioEvent = ", sAudioEvent) ENDIF #ENDIF
ELSE
IF PREPARE_MUSIC_EVENT("MIC2_FIGHT_BEGINS")
IF TRIGGER_MUSIC_EVENT("MIC2_FIGHT_BEGINS")
iAudioPrepareTimer = GET_GAME_TIMER() + 5000 //Assumes 5 seconds is long enough for the one shot to play
ePlayAudioTrack = NO_AUDIO #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Playing audio - MIC2_FIGHT_BEGINS") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE MIC2_FIGHT_CONT #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Play - MIC2_FIGHT_CONT") ENDIF #ENDIF
IF TRIGGER_MUSIC_EVENT("MIC2_FIGHT_CONT")
ePlayAudioTrack = NO_AUDIO #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Playing audio - MIC2_FIGHT_CONT") ENDIF #ENDIF
ENDIF
BREAK
CASE MIC2_ABATTOIR_PROGRESS #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Play - MIC2_ABATTOIR_PROGRESS") ENDIF #ENDIF
IF TRIGGER_MUSIC_EVENT("MIC2_ABATTOIR_PROGRESS")
ePlayAudioTrack = NO_AUDIO #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Playing audio - MIC2_ABATTOIR_PROGRESS") ENDIF #ENDIF
ENDIF
BREAK
CASE MIC2_ACID_BATH_OS #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Play - MIC2_ACID_BATH_OS") ENDIF #ENDIF
IF IS_STRING_NULL_OR_EMPTY(sAudioEvent)
OR NOT ARE_STRINGS_EQUAL(sAudioEvent, "MIC2_ACID_BATH_OS")
IF NOT IS_STRING_NULL_OR_EMPTY(sAudioEvent)
#IF IS_DEBUG_BUILD IF #ENDIF CANCEL_MUSIC_EVENT(sAudioEvent) #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Cancelled audio - sAudioEvent = ", sAudioEvent) ENDIF ENDIF #ENDIF
ENDIF
sAudioEvent = "MIC2_ACID_BATH_OS" #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Preparing audio - sAudioEvent = ", sAudioEvent) ENDIF #ENDIF
ELSE
IF PREPARE_MUSIC_EVENT("MIC2_ACID_BATH_OS")
IF TRIGGER_MUSIC_EVENT("MIC2_ACID_BATH_OS")
iAudioPrepareTimer = GET_GAME_TIMER() + 5000 //Assumes 5 seconds is long enough for the one shot to play
ePlayAudioTrack = NO_AUDIO #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Playing audio - MIC2_ACID_BATH_OS") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE MIC2_MULCHED #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Play - MIC2_MULCHED") ENDIF #ENDIF
IF IS_STRING_NULL_OR_EMPTY(sAudioEvent)
OR NOT ARE_STRINGS_EQUAL(sAudioEvent, "MIC2_MULCHED")
IF NOT IS_STRING_NULL_OR_EMPTY(sAudioEvent)
#IF IS_DEBUG_BUILD IF #ENDIF CANCEL_MUSIC_EVENT(sAudioEvent) #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Cancelled audio - sAudioEvent = ", sAudioEvent) ENDIF ENDIF #ENDIF
ENDIF
sAudioEvent = "MIC2_MULCHED" #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Preparing audio - sAudioEvent = ", sAudioEvent) ENDIF #ENDIF
ELSE
IF PREPARE_MUSIC_EVENT("MIC2_MULCHED")
IF TRIGGER_MUSIC_EVENT("MIC2_MULCHED")
iAudioPrepareTimer = GET_GAME_TIMER() + 5000 //Assumes 5 seconds is long enough for the one shot to play
ePlayAudioTrack = NO_AUDIO #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Playing audio - MIC2_MULCHED") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE MIC2_SPINNING_BLADES #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Play - MIC2_SPINNING_BLADES") ENDIF #ENDIF
IF IS_STRING_NULL_OR_EMPTY(sAudioEvent)
OR NOT ARE_STRINGS_EQUAL(sAudioEvent, "MIC2_SPINNING_BLADES")
IF NOT IS_STRING_NULL_OR_EMPTY(sAudioEvent)
#IF IS_DEBUG_BUILD IF #ENDIF CANCEL_MUSIC_EVENT(sAudioEvent) #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Cancelled audio - sAudioEvent = ", sAudioEvent) ENDIF ENDIF #ENDIF
ENDIF
sAudioEvent = "MIC2_SPINNING_BLADES" #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Preparing audio - sAudioEvent = ", sAudioEvent) ENDIF #ENDIF
ELSE
IF PREPARE_MUSIC_EVENT("MIC2_SPINNING_BLADES")
IF TRIGGER_MUSIC_EVENT("MIC2_SPINNING_BLADES")
iAudioPrepareTimer = GET_GAME_TIMER() + 5000 //Assumes 5 seconds is long enough for the one shot to play
ePlayAudioTrack = NO_AUDIO #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Playing audio - MIC2_SPINNING_BLADES") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE MIC2_HANGING_MICHAEL #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Play - MIC2_HANGING_MICHAEL") ENDIF #ENDIF
IF TRIGGER_MUSIC_EVENT("MIC2_HANGING_MICHAEL")
ePlayAudioTrack = NO_AUDIO #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Playing audio - MIC2_HANGING_MICHAEL") ENDIF #ENDIF
ENDIF
BREAK
CASE MIC2_BACK_TO_FRANK #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Play - MIC2_BACK_TO_FRANK") ENDIF #ENDIF
IF TRIGGER_MUSIC_EVENT("MIC2_BACK_TO_FRANK")
ePlayAudioTrack = NO_AUDIO #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Playing audio - MIC2_BACK_TO_FRANK") ENDIF #ENDIF
ENDIF
BREAK
CASE MIC3_FRANK_DOWN #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Play - MIC3_FRANK_DOWN") ENDIF #ENDIF
IF IS_STRING_NULL_OR_EMPTY(sAudioEvent)
OR NOT ARE_STRINGS_EQUAL(sAudioEvent, "MIC3_FRANK_DOWN")
IF NOT IS_STRING_NULL_OR_EMPTY(sAudioEvent)
#IF IS_DEBUG_BUILD IF #ENDIF CANCEL_MUSIC_EVENT(sAudioEvent) #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Cancelled audio - sAudioEvent = ", sAudioEvent) ENDIF ENDIF #ENDIF
ENDIF
sAudioEvent = "MIC3_FRANK_DOWN" #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Preparing audio - sAudioEvent = ", sAudioEvent) ENDIF #ENDIF
ELSE
IF PREPARE_MUSIC_EVENT("MIC3_FRANK_DOWN")
IF TRIGGER_MUSIC_EVENT("MIC3_FRANK_DOWN")
iAudioPrepareTimer = GET_GAME_TIMER() + 5000 //Assumes 5 seconds is long enough for the one shot to play
ePlayAudioTrack = NO_AUDIO #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Playing audio - MIC3_FRANK_DOWN") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE MIC2_FRANK_SAVED #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Play - MIC2_FRANK_SAVED") ENDIF #ENDIF
IF IS_STRING_NULL_OR_EMPTY(sAudioEvent)
OR NOT ARE_STRINGS_EQUAL(sAudioEvent, "MIC2_FRANK_SAVED")
IF NOT IS_STRING_NULL_OR_EMPTY(sAudioEvent)
#IF IS_DEBUG_BUILD IF #ENDIF CANCEL_MUSIC_EVENT(sAudioEvent) #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Cancelled audio - sAudioEvent = ", sAudioEvent) ENDIF ENDIF #ENDIF
ENDIF
sAudioEvent = "MIC2_FRANK_SAVED" #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Preparing audio - sAudioEvent = ", sAudioEvent) ENDIF #ENDIF
ELSE
IF PREPARE_MUSIC_EVENT("MIC2_FRANK_SAVED")
IF TRIGGER_MUSIC_EVENT("MIC2_FRANK_SAVED")
iAudioPrepareTimer = GET_GAME_TIMER() + 5000 //Assumes 5 seconds is long enough for the one shot to play
ePlayAudioTrack = NO_AUDIO #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Playing audio - MIC2_FRANK_SAVED") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE MIC2_VEHICLE_READY #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Play - MIC2_VEHICLE_READY") ENDIF #ENDIF
IF TRIGGER_MUSIC_EVENT("MIC2_VEHICLE_READY")
ePlayAudioTrack = NO_AUDIO #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Playing audio - MIC2_VEHICLE_READY") ENDIF #ENDIF
ENDIF
BREAK
CASE MIC2_LOSE_TRIADS #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Play - MIC2_LOSE_TRIADS") ENDIF #ENDIF
IF IS_STRING_NULL_OR_EMPTY(sAudioEvent)
OR NOT ARE_STRINGS_EQUAL(sAudioEvent, "MIC2_LOSE_TRIADS")
IF NOT IS_STRING_NULL_OR_EMPTY(sAudioEvent)
#IF IS_DEBUG_BUILD IF #ENDIF CANCEL_MUSIC_EVENT(sAudioEvent) #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Cancelled audio - sAudioEvent = ", sAudioEvent) ENDIF ENDIF #ENDIF
ENDIF
sAudioEvent = "MIC2_LOSE_TRIADS" #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Preparing audio - sAudioEvent = ", sAudioEvent) ENDIF #ENDIF
ELSE
IF PREPARE_MUSIC_EVENT("MIC2_LOSE_TRIADS")
IF TRIGGER_MUSIC_EVENT("MIC2_LOSE_TRIADS")
iAudioPrepareTimer = GET_GAME_TIMER() + 5000 //Assumes 5 seconds is long enough for the one shot to play
ePlayAudioTrack = NO_AUDIO #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Playing audio - MIC2_LOSE_TRIADS") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE MIC2_TRIADS_LOST #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Play - MIC2_TRIADS_LOST") ENDIF #ENDIF
IF TRIGGER_MUSIC_EVENT("MIC2_TRIADS_LOST")
ePlayAudioTrack = NO_AUDIO #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Playing audio - MIC2_TRIADS_LOST") ENDIF #ENDIF
ENDIF
BREAK
CASE MIC2_RADIO_SETUP #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Play - MIC2_RADIO_SETUP") ENDIF #ENDIF
IF IS_STRING_NULL_OR_EMPTY(sAudioEvent)
OR NOT ARE_STRINGS_EQUAL(sAudioEvent, "MIC2_RADIO_SETUP")
IF NOT IS_STRING_NULL_OR_EMPTY(sAudioEvent)
#IF IS_DEBUG_BUILD IF #ENDIF CANCEL_MUSIC_EVENT(sAudioEvent) #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Cancelled audio - sAudioEvent = ", sAudioEvent) ENDIF ENDIF #ENDIF
ENDIF
sAudioEvent = "MIC2_RADIO_SETUP" #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Preparing audio - sAudioEvent = ", sAudioEvent) ENDIF #ENDIF
ELSE
IF PREPARE_MUSIC_EVENT("MIC2_RADIO_SETUP")
IF TRIGGER_MUSIC_EVENT("MIC2_RADIO_SETUP")
iAudioPrepareTimer = GET_GAME_TIMER() + 5000 //Assumes 5 seconds is long enough for the one shot to play
ePlayAudioTrack = NO_AUDIO #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Playing audio - MIC2_RADIO_SETUP") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE MIC2_OVER #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Play - MIC2_OVER") ENDIF #ENDIF
IF TRIGGER_MUSIC_EVENT("MIC2_OVER")
ePlayAudioTrack = NO_AUDIO #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Playing audio - MIC2_OVER") ENDIF #ENDIF
ENDIF
BREAK
CASE MIC2_DEAD #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Play - MIC2_DEAD") ENDIF #ENDIF
IF TRIGGER_MUSIC_EVENT("MIC2_DEAD")
ePlayAudioTrack = NO_AUDIO #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Playing audio - MIC2_DEAD") ENDIF #ENDIF
ENDIF
BREAK
CASE MIC2_FIND_MIKE_RT #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Play - MIC2_FIND_MIKE_RT") ENDIF #ENDIF
IF TRIGGER_MUSIC_EVENT("MIC2_FIND_MIKE_RT")
ePlayAudioTrack = NO_AUDIO #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Playing audio - MIC2_FIND_MIKE_RT") ENDIF #ENDIF
ENDIF
BREAK
CASE MIC2_FIGHT_BEGINS_RT #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Play - MIC2_FIGHT_BEGINS_RT") ENDIF #ENDIF
IF TRIGGER_MUSIC_EVENT("MIC2_FIGHT_BEGINS_RT")
ePlayAudioTrack = NO_AUDIO #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Playing audio - MIC2_FIGHT_BEGINS_RT") ENDIF #ENDIF
ENDIF
BREAK
CASE MIC2_HANGING_RT #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Play - MIC2_HANGING_RT") ENDIF #ENDIF
IF TRIGGER_MUSIC_EVENT("MIC2_HANGING_RT")
ePlayAudioTrack = NO_AUDIO #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Playing audio - MIC2_HANGING_RT") ENDIF #ENDIF
ENDIF
BREAK
CASE MIC2_MICHAEL_ESCAPE_RT #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Play - MIC2_MICHAEL_ESCAPE_RT") ENDIF #ENDIF
IF TRIGGER_MUSIC_EVENT("MIC2_MICHAEL_ESCAPE_RT")
ePlayAudioTrack = NO_AUDIO #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Playing audio - MIC2_MICHAEL_ESCAPE_RT") ENDIF #ENDIF
ENDIF
BREAK
CASE MIC2_TRIADS_CHASE_RT #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Play - MIC2_TRIADS_CHASE_RT") ENDIF #ENDIF
IF TRIGGER_MUSIC_EVENT("MIC2_TRIADS_CHASE_RT")
ePlayAudioTrack = NO_AUDIO #IF IS_DEBUG_BUILD IF bDebugAudio PRINTLN("Playing audio - MIC2_TRIADS_CHASE_RT") ENDIF #ENDIF
ENDIF
BREAK
ENDSWITCH
ENDPROC
PROC LOAD_AUDIO(AUDIO_TRACK eSetAudioTrack)
ePrepAudioTrack = eSetAudioTrack
AUDIO_CONTROLLER()
ENDPROC
PROC PLAY_AUDIO(AUDIO_TRACK eSetAudioTrack)
ePlayAudioTrack = eSetAudioTrack
AUDIO_CONTROLLER()
ENDPROC
STRUCT SPLINE_NODE
VECTOR vPos
VECTOR vRot
FLOAT fFov
ENDSTRUCT
//SPLINE_NODE splineNodes[18]
//
//PROC initSplineNodeList() //FOV 50.0
// //Clockwise
// splineNodes[0].vPos = <<1012.896301, -2101.372314, 33.291309>>
// splineNodes[0].vRot = <<-1.982723, 0.338979, 173.891754>>
// splineNodes[0].fFov = 50.0
// splineNodes[1].vPos = <<1007.293213, -2167.156982, 33.054180>>
// splineNodes[1].vRot = <<-1.182525, 0.338979, 174.261124>>
// splineNodes[1].fFov = 50.0
// splineNodes[2].vPos = <<989.095398, -2197.869385, 33.599380>>
// splineNodes[2].vRot = <<-2.301748, 0.338979, 88.595459>>
// splineNodes[2].fFov = 50.0
// splineNodes[3].vPos = <<955.204102, -2196.909912, 32.745079>>
// splineNodes[3].vRot = <<-8.845912, 0.338979, -1.773986>>
// splineNodes[3].fFov = 50.0
// splineNodes[4].vPos = <<938.759583, -2185.577393, 32.985966>>
// splineNodes[4].vRot = <<-8.738976, 0.338979, -96.202721>>
// splineNodes[4].fFov = 50.0
// splineNodes[5].vPos = <<958.455505, -2184.489014, 31.564182>>
// splineNodes[5].vRot = <<-6.233361, 0.338979, -94.898773>>
// splineNodes[5].fFov = 50.0
//
// //Counter-Clockwise
// splineNodes[6].vPos = <<983.426758, -2090.378418, 33.904240>>
// splineNodes[6].vRot = <<-0.707793, 0.0, 89.679756>>
// splineNodes[6].fFov = 50.0
// splineNodes[7].vPos = <<933.889465,-2107.938232,32.834606>>
// splineNodes[7].vRot = <<-2.559668,0.000000,175.719452>>
// splineNodes[7].fFov = 50.0
// splineNodes[8].vPos = <<930.852417, -2135.413330, 32.779202>>
// splineNodes[8].vRot = <<-0.668986, -6.738220, 173.527206>>
// splineNodes[8].fFov = 50.0
// splineNodes[9].vPos = <<929.129028, -2172.105713, 33.454044>>
// splineNodes[9].vRot = <<-3.121807, -21.816061, -133.945679>>
// splineNodes[9].fFov = 50.0
// splineNodes[10].vPos = <<952.159302, -2183.835449, 31.973093>>
// splineNodes[10].vRot = <<-3.935187, -5.522160, -102.999886>>
// splineNodes[10].fFov = 50.0
// splineNodes[11].vPos = <<974.950012, -2186.682373, 31.249016>>
// splineNodes[11].vRot = <<-2.949606, -1.684473, -96.856033>>
// splineNodes[11].fFov = 50.0
//
// //Inside
// splineNodes[12].vPos = <<991.835388, -2187.673828, 31.325569>> + <<2.5, 5.0, 0.0>>
// splineNodes[12].vRot = <<0.243132, -25.443731, -54.801926>>
// splineNodes[12].fFov = 50.0
// splineNodes[13].vPos = <<995.288513, -2173.272461, 31.397337>>
// splineNodes[13].vRot = <<0.243132, -25.443737, 47.891655>>
// splineNodes[13].fFov = 50.0
// splineNodes[14].vPos = <<983.897522, -2168.887207, 31.449553>>
// splineNodes[14].vRot = <<0.243131, 0.0, 82.929100>>
// splineNodes[14].fFov = 50.0
// splineNodes[15].vPos = <<969.269470, -2163.052002, 31.514753>>
// splineNodes[15].vRot = <<1.166207, 30.385775, -12.229650>>
// splineNodes[15].fFov = 50.0
// splineNodes[16].vPos = <<982.599854, -2159.198730, 31.864603>>
// splineNodes[16].vRot = <<1.659278, 0.0, -94.700310>>
// splineNodes[16].fFov = 50.0
// splineNodes[17].vPos = <<995.072327, -2156.664307, 32.219673>>
// splineNodes[17].vRot = <<0.836721, -26.218670, -6.102451>>
// splineNodes[17].fFov = 50.0
//ENDPROC
FUNC BOOL HAS_HOOK_REACHED_RAIL_NODE(INT iNode)
RETURN (iCurrentNode >= iNode)
ENDFUNC
PROC SET_RAIL_FINAL_NODE(INT iFinalNode)
//Occasionally want to stop the rail moving at a point before the end of the node list. Will stop at node iFinalNode.
iRailNodeToStopAt = iFinalNode + 1
//Get total distance from first node to final node
INT i
fDistTotalFirstFinalNode = 0
REPEAT iRailNodeToStopAt i
fDistTotalFirstFinalNode += GET_DISTANCE_BETWEEN_COORDS(sRailNodes[CLAMP_INT(i, 0, COUNT_OF(sRailNodes) - 1)].vPos, sRailNodes[CLAMP_INT(i + 1, 0, COUNT_OF(sRailNodes) - 1)].vPos)
ENDREPEAT
ENDPROC
///PURPOSE: The hook "moves" along the rail by interplolating betwee a series of nodes. This defines the position & rotation of all the nodes
PROC initRailNodeList()
sRailNodes[0].vPos = <<997.99719, -2178.23584, 33.21508>>
sRailNodes[0].vRot = <<0.0, 0.0, -90.0>>
sRailNodes[1].vPos = <<998.68988, -2170.42310, 33.21508>>
sRailNodes[1].vRot = <<0.0, 0.0, -90.0>>
sRailNodes[2].vPos = <<998.58350, -2170.03711, 33.21508>>
sRailNodes[2].vRot = <<0.0, 0.0, -55.8000>>
sRailNodes[3].vPos = <<998.14276, -2169.83252, 33.21508>>
sRailNodes[3].vRot = <<0.0, 0.0, -20.0>>
sRailNodes[4].vPos = <<992.80927, -2169.33667, 33.21372>>
sRailNodes[4].vRot = <<0.0, 0.0, 0.0>>
sRailNodes[5].vPos = <<988.82288, -2169.05298, 33.04533>>
sRailNodes[5].vRot = <<0.0, 0.0, 0.0>>
sRailNodes[6].vPos = <<981.45752, -2168.24048, 33.04327>>
sRailNodes[6].vRot = <<0.0, 0.0, 0.0>>
sRailNodes[7].vPos = <<969.84045, -2167.29272, 33.00440>>
sRailNodes[7].vRot = <<0.0, 0.0, -17.0000>>
sRailNodes[8].vPos = <<969.53687, -2167.20068, 33.00438>>
sRailNodes[8].vRot = <<0.0, 0.0, -20.0>>
sRailNodes[9].vPos = <<969.34314, -2167.00415, 33.00327>>
sRailNodes[9].vRot = <<0.0, 0.0, -40.8500>>
sRailNodes[10].vPos = <<969.27594, -2166.70215, 32.97229>>
sRailNodes[10].vRot = <<0.0, 0.0, -84.0000>>
sRailNodes[11].vPos = <<969.87482, -2160.25610, 32.97181>>
sRailNodes[11].vRot = <<0.0, 0.0, -93.0000>>
sRailNodes[12].vPos = <<970.00366, -2159.66211, 32.96849>>
sRailNodes[12].vRot = <<0.0, 0.0, -109.6500>>
sRailNodes[13].vPos = <<970.22723, -2159.42822, 32.96897>>
sRailNodes[13].vRot = <<0.0, 0.0, -129.0000>>
sRailNodes[14].vPos = <<970.54535, -2159.38843, 32.96876>>
sRailNodes[14].vRot = <<0.0, 0.0, -173.0000>>
sRailNodes[15].vPos = <<979.39026, -2160.19849, 33.00122>>
sRailNodes[15].vRot = <<0.0, 0.0, -186.0000>>
sRailNodes[16].vPos = <<979.91333, -2160.17480, 33.00301>>
sRailNodes[16].vRot = <<0.0, 0.0, -175.0000>>
sRailNodes[17].vPos = <<980.32690, -2160.36475, 33.00453>>
sRailNodes[17].vRot = <<0.0, 0.0, 164.5500>>
sRailNodes[18].vPos = <<981.12488, -2160.94116, 33.04178>>
sRailNodes[18].vRot = <<0.0, 0.0, 174.0000>>
sRailNodes[19].vPos = <<985.11310, -2161.31104, 33.06876>>
sRailNodes[19].vRot = <<0.0, 0.0, -185.0000>>
sRailNodes[20].vPos = <<985.51215, -2161.29443, 33.06952>>
sRailNodes[20].vRot = <<0.0, 0.0, -178.3000>>
sRailNodes[21].vPos = <<985.83417, -2161.06323, 33.07181>>
sRailNodes[21].vRot = <<0.0, 0.0, -124.7500>>
sRailNodes[22].vPos = <<985.97974, -2160.69263, 33.07404>>
sRailNodes[22].vRot = <<0.0, 0.0, -102.4500>>
sRailNodes[23].vPos = <<986.08618, -2159.59692, 33.07473>>
sRailNodes[23].vRot = <<0.0, 0.0, -95.5000>>
sRailNodes[24].vPos = <<986.22394, -2159.27075, 33.07572>>
sRailNodes[24].vRot = <<0.0, 0.0, -110.8500>>
sRailNodes[25].vPos = <<986.44983, -2159.14307, 33.07625>>
sRailNodes[25].vRot = <<0.0, 0.0, -145.8500>>
sRailNodes[26].vPos = <<986.96997, -2159.15112, 33.07859>>
sRailNodes[26].vRot = <<0.0, 0.0, -177.2999>>
sRailNodes[27].vPos = <<992.41510, -2159.66333, 33.06979>>
sRailNodes[27].vRot = <<0.0, 0.0, -178.7499>>
sRailNodes[28].vPos = <<992.87366, -2159.68018, 33.07030>>
sRailNodes[28].vRot = <<0.0, 0.0, -175.3499>>
sRailNodes[29].vPos = <<993.19458, -2159.43481, 33.07386>>
sRailNodes[29].vRot = <<0.0, 0.0, -132.3499>>
sRailNodes[30].vPos = <<993.33282, -2159.03345, 33.07018>>
sRailNodes[30].vRot = <<0.0, 0.0, 83.4>>
sRailNodes[31].vPos = <<994.17920, -2150.31909, 33.06801>>
sRailNodes[31].vRot = <<0.0, 0.0, 83.4>>
sRailNodes[32].vPos = <<995.29425, -2150.44263, 33.01155>>
sRailNodes[32].vRot = <<0.0, 0.0, 83.4>>
sRailNodes[33].vPos = <<996.92010, -2150.59131, 33.00539>>
sRailNodes[33].vRot = <<0.0, 0.0, -77.9499>>
sRailNodes[34].vPos = <<997.23938, -2150.55811, 33.00547>>
sRailNodes[34].vRot = <<0.0, 0.0, -83.3499>>
sRailNodes[35].vPos = <<997.46094, -2150.40381, 33.00445>>
sRailNodes[35].vRot = <<0.0, 0.0, -102.3499>>
sRailNodes[36].vPos = <<997.57794, -2150.12500, 32.97338>>
sRailNodes[36].vRot = <<0.0, 0.0, -115.4499>>
sRailNodes[37].vPos = <<998.53046, -2139.93213, 32.97335>>
sRailNodes[37].vRot = <<0.0, 0.0, -100.0999>>
sRailNodes[38].vPos = <<998.78827, -2137.11938, 32.97280>>
sRailNodes[38].vRot = <<0.0, 0.0, -97.5499>>
sRailNodes[39].vPos = <<998.78827, -2137.11938, 32.97280>>
sRailNodes[39].vRot = <<0.0, 0.0, -97.5499>>
INT i
REPEAT COUNT_OF(sRailNodes) i
sRailNodes[i].vRot.X = 0.0
ENDREPEAT
SET_RAIL_FINAL_NODE(40)
ENDPROC
//Cleanup
PROC MISSION_CLEANUP(BOOL bRestart = FALSE, BOOL bDeathArrest = FALSE)
IF bVideoRecording
REPLAY_STOP_EVENT()
bVideoRecording = FALSE
ENDIF
INT i
RESET_PUSH_IN(pushInData)
//Stats
INFORM_MISSION_STATS_OF_DAMAGE_WATCH_ENTITY(NULL)
HIDE_CELLPHONE_SIGNIFIERS_FOR_CUTSCENE(FALSE)
//Doors
IF bDeathArrest
IF IS_DOOR_REGISTERED_WITH_SYSTEM(iEntranceDoor)
IF DOOR_SYSTEM_GET_DOOR_STATE(iEntranceDoor) != DOORSTATE_LOCKED
DOOR_SYSTEM_SET_DOOR_STATE(iEntranceDoor, DOORSTATE_LOCKED, FALSE, TRUE)
ENDIF
ENDIF
ELSE
IF IS_DOOR_REGISTERED_WITH_SYSTEM(iEntranceDoor)
IF DOOR_SYSTEM_GET_OPEN_RATIO(iEntranceDoor) <> 0.0
OR DOOR_SYSTEM_GET_DOOR_STATE(iEntranceDoor) != DOORSTATE_FORCE_LOCKED_THIS_FRAME
DOOR_SYSTEM_SET_OPEN_RATIO(iEntranceDoor, 0.0, FALSE, FALSE)
DOOR_SYSTEM_SET_DOOR_STATE(iEntranceDoor, DOORSTATE_FORCE_LOCKED_THIS_FRAME, FALSE, TRUE)
ENDIF
ENDIF
ENDIF
//Reset player
SET_EVERYONE_IGNORE_PLAYER(PLAYER_ID(), FALSE)
IF IS_PLAYER_PLAYING(PLAYER_ID())
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
IF bPassed
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF NOT IS_PED_GETTING_INTO_A_VEHICLE(PLAYER_PED_ID())
IF IS_ENTITY_ATTACHED(PLAYER_PED_ID())
DETACH_ENTITY(PLAYER_PED_ID())
ENDIF
ENDIF
ELSE
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
ENDIF
ENDIF
SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), FALSE)
SET_ENTITY_INVINCIBLE(PLAYER_PED_ID(), FALSE)
//SET_PLAYER_FORCED_AIM(PLAYER_ID(), FALSE)
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(PLAYER_PED(CHAR_MICHAEL))
AND NOT IS_PED_INJURED(PLAYER_PED(CHAR_MICHAEL))
SET_ENABLE_BOUND_ANKLES(PLAYER_PED(CHAR_MICHAEL), FALSE)
RESTORE_PLAYER_PED_WEAPONS_IN_SNAPSHOT(PLAYER_PED(CHAR_MICHAEL), FALSE)
ENDIF
IF DOES_ENTITY_EXIST(PLAYER_PED(CHAR_FRANKLIN))
AND NOT IS_PED_INJURED(PLAYER_PED(CHAR_FRANKLIN))
AND PLAYER_PED(CHAR_FRANKLIN) != PLAYER_PED_ID()
SET_ENTITY_LOAD_COLLISION_FLAG(PLAYER_PED(CHAR_FRANKLIN), FALSE)
ENDIF
CLEAR_FOCUS()
REMOVE_NAVMESH_REQUIRED_REGIONS()
//Delete all peds, vehicles, objects and blips
REMOVE_ALL_COVER_BLOCKING_AREAS()
REPEAT COUNT_OF(covPoint) i
REMOVE_COVER_POINT(covPoint[i])
ENDREPEAT
REPEAT COUNT_OF(piPickups) i
IF DOES_PICKUP_EXIST(piPickups[i])
REMOVE_PICKUP(piPickups[i])
ENDIF
ENDREPEAT
#IF IS_DEBUG_BUILD IF bAutoSkipping #ENDIF //Z-skips cleanup
SAFE_DELETE_PED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
SAFE_DELETE_PED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
SAFE_DELETE_PED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
SAFE_DELETE_PED(pedIntro)
#IF IS_DEBUG_BUILD ENDIF #ENDIF
//Actors
REPEAT iEnemyIntroCut i
IF DOES_ENTITY_EXIST(sEnemyIntroCut[i].pedIndex)
#IF IS_DEBUG_BUILD IF bAutoSkipping #ENDIF //Z-skips cleanup
SAFE_DELETE_PED(sEnemyIntroCut[i].pedIndex)
#IF IS_DEBUG_BUILD ENDIF #ENDIF
ENDIF
SAFE_REMOVE_BLIP(sEnemyIntroCut[i].blipIndex)
ENDREPEAT
REPEAT iEnemyOutside i
IF DOES_ENTITY_EXIST(sEnemyOutside[i].pedIndex)
SET_PED_AS_NO_LONGER_NEEDED(sEnemyOutside[i].pedIndex)
ENDIF
SAFE_REMOVE_BLIP(sEnemyOutside[i].blipIndex)
ENDREPEAT
REPEAT iEnemyShootout i
IF DOES_ENTITY_EXIST(sEnemyShootout[i].pedIndex)
SET_PED_AS_NO_LONGER_NEEDED(sEnemyShootout[i].pedIndex)
ENDIF
SAFE_REMOVE_BLIP(sEnemyShootout[i].blipIndex)
ENDREPEAT
REPEAT iEnemyBackup i
IF DOES_ENTITY_EXIST(sEnemyBackup[i].pedIndex)
SET_PED_AS_NO_LONGER_NEEDED(sEnemyBackup[i].pedIndex)
ENDIF
SAFE_REMOVE_BLIP(sEnemyBackup[i].blipIndex)
ENDREPEAT
REPEAT iEnemySetPiece i
IF DOES_ENTITY_EXIST(sEnemySetPiece[i].pedIndex)
SET_PED_AS_NO_LONGER_NEEDED(sEnemySetPiece[i].pedIndex)
ENDIF
SAFE_REMOVE_BLIP(sEnemySetPiece[i].blipIndex)
ENDREPEAT
REPEAT iEnemyEscape i
IF DOES_ENTITY_EXIST(sEnemyEscape[i].pedIndex)
SET_PED_AS_NO_LONGER_NEEDED(sEnemyEscape[i].pedIndex)
ENDIF
SAFE_REMOVE_BLIP(sEnemyEscape[i].blipIndex)
ENDREPEAT
REPEAT iEnemyChase i
IF DOES_ENTITY_EXIST(sEnemyChase[i].pedIndex)
SET_PED_AS_NO_LONGER_NEEDED(sEnemyChase[i].pedIndex)
ENDIF
SAFE_REMOVE_BLIP(sEnemyChase[i].blipIndex)
ENDREPEAT
//Vehicle
IF DOES_ENTITY_EXIST(vehFranklin)
AND NOT IS_ENTITY_DEAD(vehFranklin)
IF IS_ENTITY_A_MISSION_ENTITY(vehFranklin)
AND DOES_ENTITY_BELONG_TO_THIS_SCRIPT(vehFranklin)
SET_VEHICLE_AS_NO_LONGER_NEEDED(vehFranklin)
ENDIF
ENDIF
REPEAT COUNT_OF(vehEnemyChase) i
IF DOES_ENTITY_EXIST(vehEnemyChase[i])
SET_VEHICLE_AS_NO_LONGER_NEEDED(vehEnemyChase[i])
ENDIF
ENDREPEAT
REPEAT COUNT_OF(vehEnemy) i
IF DOES_ENTITY_EXIST(vehEnemy[i])
SET_VEHICLE_AS_NO_LONGER_NEEDED(vehEnemy[i])
ENDIF
ENDREPEAT
#IF IS_DEBUG_BUILD IF bAutoSkipping #ENDIF //Z-skips cleanup
SAFE_DELETE_VEHICLE(vehCar)
IF DOES_ENTITY_EXIST(vehHachiRoku)
SET_VEHICLE_AS_NO_LONGER_NEEDED(vehHachiRoku)
ENDIF
IF DOES_ENTITY_EXIST(vehEscape)
SET_VEHICLE_AS_NO_LONGER_NEEDED(vehEscape)
ENDIF
#IF IS_DEBUG_BUILD ENDIF #ENDIF
#IF IS_DEBUG_BUILD IF bAutoSkipping #ENDIF //Z-skips cleanup
//Object
SAFE_DELETE_OBJECT(objHook)
SAFE_DELETE_OBJECT(objChain)
SAFE_DELETE_OBJECT(objPadlock)
REPEAT COUNT_OF(objCrate) i
SAFE_DELETE_OBJECT(objCrate[i])
ENDREPEAT
REPEAT COUNT_OF(objCigarette) i
IF DOES_PARTICLE_FX_LOOPED_EXIST(ptfxCigarette[i])
STOP_PARTICLE_FX_LOOPED(ptfxCigarette[i])
ENDIF
SAFE_DELETE_OBJECT(objCigarette[i])
ENDREPEAT
SAFE_DELETE_OBJECT(objGun)
// SAFE_DELETE_OBJECT(objBinBag)
#IF IS_DEBUG_BUILD ENDIF #ENDIF
//Doors
// IF IS_DOOR_REGISTERED_WITH_SYSTEM(iFrontDoor)
// REMOVE_DOOR_FROM_SYSTEM(iFrontDoor)
// ENDIF
//
// IF IS_DOOR_REGISTERED_WITH_SYSTEM(iExitDoor)
// REMOVE_DOOR_FROM_SYSTEM(iExitDoor)
// ENDIF
//Blip
SAFE_REMOVE_BLIP(blipMichael)
SAFE_REMOVE_BLIP(blipDestination)
SAFE_REMOVE_BLIP(blipFranklin)
REPEAT COUNT_OF(blipEnemyVan) i
SAFE_REMOVE_BLIP(blipEnemyVan[i])
ENDREPEAT
SAFE_REMOVE_BLIP(blipGuns)
//Particles
//Camera
STOP_GAMEPLAY_HINT()
DESTROY_ALL_CAMS()
RENDER_SCRIPT_CAMS(FALSE, FALSE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
// REPEAT COUNT_OF(splineNodes) i
// IF DOES_CAM_EXIST(camSplineNode[i])
// DESTROY_CAM(camSplineNode[i])
// ENDIF
// ENDREPEAT
//Dialogue
REMOVE_PED_FOR_DIALOGUE(sPedsForConversation, 0)
REMOVE_PED_FOR_DIALOGUE(sPedsForConversation, 1)
REMOVE_PED_FOR_DIALOGUE(sPedsForConversation, 3)
REMOVE_PED_FOR_DIALOGUE(sPedsForConversation, 8)
//Reset Variables
bPassed = FALSE //Reset the bool
iCurrentNode = 0
SET_RAIL_FINAL_NODE(0)
iTimerNode = -1
bOkToMoveRail = FALSE
bOkToHangFromHook = FALSE
vRailCurrent = VECTOR_ZERO
bRailInit = FALSE
fMoveSpeedMult = 0.225 // / 2
fHookMass = 2000.0
bOkToSwitch = FALSE
bFrankToMikeSwitchCam = FALSE
bFrankToMikeSwitchCam2 = FALSE
// bReattach = FALSE
// iReattach = 0
// vHeadingForSwappingToFranklin = VECTOR_ZERO
// vFranklinGameCamRot = VECTOR_ZERO
// bUseNewInterpCam = FALSE
//bShootingUpsideDown = FALSE
REPEAT COUNT_OF(SET_PIECE) i
iSetPiece[i] = 0
ENDREPEAT
bBlood = FALSE
intAbattoir = NULL
bPinnedAbattoir = FALSE
IF intMansion <> NULL
UNPIN_INTERIOR(intMansion)
intMansion = NULL
ENDIF
// vHookPosOffset = VECTOR_ZERO
// initSplineNodeList()
initRailNodeList()
REPEAT COUNT_OF(sRailNodes) i
sRailNodes[i].vRot.X = 0.0
ENDREPEAT
CLEAR_TRIGGERED_LABELS()
CLEAR_LOADED_MODELS()
CLEAR_LOADED_RECORDINGS()
CLEAR_LOADED_ANIM_DICTS()
SETTIMERA(0)
SETTIMERB(0)
iGrappleStage = 0
iCutsceneStage = 0
iDialogueStage = 0
REPEAT COUNT_OF(iDialogueLineCount) i
iDialogueLineCount[i] = -1
ENDREPEAT
REPEAT COUNT_OF(iDialogueTimer) i
iDialogueTimer[i] = 0
ENDREPEAT
bInitStage = FALSE
bReplaySkip = FALSE
bCutsceneSkipped = FALSE
CLEAR_MISSION_LOCATE_STUFF(sLocatesData, TRUE)
IF IS_CELLPHONE_DISABLED()
DISABLE_CELLPHONE(FALSE)
ENDIF
//Radio
SET_FRONTEND_RADIO_ACTIVE(TRUE)
//Sound
IF sfxRail != -1
STOP_SOUND(sfxRail)
RELEASE_SOUND_ID(sfxRail)
sfxRail = -1
ENDIF
IF sfxWoosh != -1
STOP_SOUND(sfxWoosh)
RELEASE_SOUND_ID(sfxWoosh)
sfxWoosh = -1
ENDIF
IF sfxCow != -1
STOP_SOUND(sfxCow)
RELEASE_SOUND_ID(sfxCow)
sfxCow = -1
ENDIF
//Audio Scene
IF IS_AUDIO_SCENE_ACTIVE("MI_2_MICHAEL_ON_MEATHOOK")
STOP_AUDIO_SCENE("MI_2_MICHAEL_ON_MEATHOOK")
ENDIF
IF IS_AUDIO_SCENE_ACTIVE("MI_2_DRIVE_TO_SLAUGHTERHOUSE")
STOP_AUDIO_SCENE("MI_2_DRIVE_TO_SLAUGHTERHOUSE")
ENDIF
IF IS_AUDIO_SCENE_ACTIVE("MI_2_FIND_A_WAY_IN")
STOP_AUDIO_SCENE("MI_2_FIND_A_WAY_IN")
ENDIF
IF IS_AUDIO_SCENE_ACTIVE("MI_2_SPLINE_CAM_1")
STOP_AUDIO_SCENE("MI_2_SPLINE_CAM_1")
ENDIF
IF IS_AUDIO_SCENE_ACTIVE("MI_2_SHOOTOUT_MAIN")
STOP_AUDIO_SCENE("MI_2_SHOOTOUT_MAIN")
ENDIF
IF IS_AUDIO_SCENE_ACTIVE("MI_2_SHOOTOUT_ACID")
STOP_AUDIO_SCENE("MI_2_SHOOTOUT_ACID")
ENDIF
IF IS_AUDIO_SCENE_ACTIVE("MI_2_GRINDER_1")
STOP_AUDIO_SCENE("MI_2_GRINDER_1")
ENDIF
IF IS_AUDIO_SCENE_ACTIVE("MI_2_SHOOT_THE_GUARD")
STOP_AUDIO_SCENE("MI_2_SHOOT_THE_GUARD")
ENDIF
IF IS_AUDIO_SCENE_ACTIVE("MI_2_MEAT_SLICER")
STOP_AUDIO_SCENE("MI_2_MEAT_SLICER")
ENDIF
IF IS_AUDIO_SCENE_ACTIVE("MI_2_THROW_THE_GUN")
STOP_AUDIO_SCENE("MI_2_THROW_THE_GUN")
ENDIF
IF IS_AUDIO_SCENE_ACTIVE("MI_2_SHOOT_FROM_MEATHOOK")
STOP_AUDIO_SCENE("MI_2_SHOOT_FROM_MEATHOOK")
ENDIF
IF IS_AUDIO_SCENE_ACTIVE("MI_2_FRANKLIN_KNIFE_ATTACK")
STOP_AUDIO_SCENE("MI_2_FRANKLIN_KNIFE_ATTACK")
ENDIF
IF IS_AUDIO_SCENE_ACTIVE("MI_2_SPLINE_2")
STOP_AUDIO_SCENE("MI_2_SPLINE_2")
ENDIF
IF IS_AUDIO_SCENE_ACTIVE("MI_2_SAVE_FRANKLIN")
STOP_AUDIO_SCENE("MI_2_SAVE_FRANKLIN")
ENDIF
IF IS_AUDIO_SCENE_ACTIVE("MI_2_ESCAPE_SHOOTOUT")
STOP_AUDIO_SCENE("MI_2_ESCAPE_SHOOTOUT")
ENDIF
IF IS_AUDIO_SCENE_ACTIVE("MI_2_GRINDER_2")
STOP_AUDIO_SCENE("MI_2_GRINDER_2")
ENDIF
IF IS_AUDIO_SCENE_ACTIVE("MI_2_ESCAPE_IN_CAR")
STOP_AUDIO_SCENE("MI_2_ESCAPE_IN_CAR")
ENDIF
IF IS_AUDIO_SCENE_ACTIVE("MI_2_DRIVE_HOME")
STOP_AUDIO_SCENE("MI_2_DRIVE_HOME")
ENDIF
//Audio
PLAY_AUDIO(MIC2_DEAD)
RELEASE_SCRIPT_AUDIO_BANK()
UNREGISTER_SCRIPT_WITH_AUDIO()
//Navmesh Blocking
REPEAT COUNT_OF(iNavBlock) i
IF iNavBlock[i] <> 0
REMOVE_NAVMESH_BLOCKING_OBJECT(iNavBlock[i])
iNavBlock[i] = 0
ENDIF
ENDREPEAT
//Waypoints
//Sequence
CLEAR_SEQUENCE_TASK(seqMain)
//Assisted
//Relationship Groups
REMOVE_RELATIONSHIP_GROUP(relGroupFriendlyFire)
REMOVE_RELATIONSHIP_GROUP(relGroupBuddy)
REMOVE_RELATIONSHIP_GROUP(relGroupEnemy)
REMOVE_RELATIONSHIP_GROUP(relGroupPassive)
//Trackify
ENABLE_SECOND_SCREEN_TRACKIFY_APP(FALSE)
//Interface
DISPLAY_RADAR(TRUE)
DISPLAY_HUD(TRUE)
//Roads
SET_ROADS_BACK_TO_ORIGINAL(<<-877.67, 224.67, 72.30>>, <<-853.08, 125.01, 56.63>>)
//Budget
SET_PED_POPULATION_BUDGET(3)
SET_VEHICLE_POPULATION_BUDGET(3)
SET_REDUCE_PED_MODEL_BUDGET(FALSE)
SET_REDUCE_VEHICLE_MODEL_BUDGET(FALSE)
//New Load Scene
IF IS_NEW_LOAD_SCENE_ACTIVE()
NEW_LOAD_SCENE_STOP()
ENDIF
//Shops
SET_ALL_SHOPS_TEMPORARILY_UNAVAILABLE(FALSE)
//Changing clothes
SET_PLAYER_CAN_CHANGE_CLOTHES_ON_MISSION(TRUE)
//Taxi
DISABLE_TAXI_HAILING(FALSE)
//Cheat
DISABLE_CHEAT(CHEAT_TYPE_GIVE_WEAPONS, FALSE)
//Wanted
SET_MAX_WANTED_LEVEL(6)
SET_WANTED_LEVEL_MULTIPLIER(1.0)
//Emergency Calls
RELEASE_SUPPRESSED_EMERGENCY_CALLS()
//Ambulances etc.
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)
ENABLE_DISPATCH_SERVICE(DT_GANGS, TRUE)
IF NOT CAN_CREATE_RANDOM_COPS()
SET_CREATE_RANDOM_COPS(TRUE)
ENDIF
//Cap Interior
IF bRestart = FALSE
SET_INTERIOR_CAPPED_ON_EXIT(INTERIOR_V_ABATTOIR, TRUE)
ELSE
SET_INTERIOR_CAPPED(INTERIOR_V_ABATTOIR, TRUE)
ENDIF
IF bRestart = FALSE
TERMINATE_THIS_THREAD()
ENDIF
ENDPROC
//Mission Passed
PROC missionPassed()
IF IS_SCREEN_FADED_OUT()
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
ENDIF
CLEAR_TEXT()
Mission_Flow_Mission_Passed()
bPassed = TRUE
MISSION_CLEANUP()
ENDPROC
/// PURPOSE:
/// Sets Michael as unavailable.
/// Called in normal fail and force cleanup
PROC SET_MICHAEL_UNAVAILABLE_ON_FAIL()
SET_PLAYER_PED_AVAILABLE(CHAR_MICHAEL, FALSE)
ENDPROC
//Mission Failed
PROC missionFailed()
enumCharacterList eCharFail = GET_CURRENT_PLAYER_PED_ENUM()
STORE_FAIL_WEAPON(PLAYER_PED_ID(), ENUM_TO_INT(eCharFail))
CLEAR_TEXT()
//Audio
PLAY_AUDIO(MIC2_DEAD)
SWITCH eMissionFail
CASE failFranklinDied
MISSION_FLOW_SET_FAIL_REASON("MCH2_FFDED")
BREAK
CASE failMichaelDied
MISSION_FLOW_SET_FAIL_REASON("MCH2_FMDED")
BREAK
CASE failFranklinAbandon
MISSION_FLOW_SET_FAIL_REASON("CMN_FLEFT")
BREAK
CASE failMichaelAbandon
MISSION_FLOW_SET_FAIL_REASON("CMN_MLEFT")
BREAK
CASE failCarDestroyed
MISSION_FLOW_SET_FAIL_REASON("MCH2_FCAR")
BREAK
CASE failOutOfAmmo
MISSION_FLOW_SET_FAIL_REASON("MCH2_FAMMO")
BREAK
CASE failGeneric
//Shouldn't get here
BREAK
ENDSWITCH
Mission_Flow_Mission_Failed()
WHILE NOT GET_MISSION_FLOW_SAFE_TO_CLEANUP()
//Maintain anything that could look weird during fade out (e.g. enemies walking off).
//Keep disabling first person camera when fading out if on the hook as Michael
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
IF GET_SCRIPT_TASK_STATUS(PLAYER_PED_ID(), SCRIPT_TASK_AIM_GUN_SCRIPTED) = PERFORMING_TASK
DISABLE_ON_FOOT_FIRST_PERSON_VIEW_THIS_UPDATE() PRINTLN("DISABLE_ON_FOOT_FIRST_PERSON_VIEW_THIS_UPDATE() 2")
ENDIF
ENDIF
ENDIF
WAIT(0)
ENDWHILE
//1988571 - Need to deal with keeping the player out of the factory when rejecting a replay (and keeping Michael inside).
IF NOT HAS_PLAYER_ACCEPTED_REPLAY()
//Lock the exit to the factory.
IF IS_DOOR_REGISTERED_WITH_SYSTEM(iExitDoor)
DOOR_SYSTEM_SET_OPEN_RATIO(iExitDoor, 0.0, FALSE, FALSE)
DOOR_SYSTEM_SET_DOOR_STATE(iExitDoor, DOORSTATE_FORCE_LOCKED_THIS_FRAME, FALSE, TRUE)
ENDIF
//If the player is Michael (and isn't still tied up) then warp them inside the factory, otherwise it's possible for Franklin to meet him when rejecting a retry.
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
AND NOT IS_ENTITY_ATTACHED(PLAYER_PED_ID())
AND VDIST(GET_ENTITY_COORDS(PLAYER_PED_ID()), <<933.0538, -2162.6216, 29.5012>>) < 200.0
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<985.9138, -2126.9465, 29.4755>>)
ENDIF
ENDIF
// check if we need to respawn the player in a different position,
// if so call MISSION_FLOW_SET_FAIL_WARP_LOCATION() + SET_REPLAY_DECLINED_VEHICLE_WARP_LOCATION here
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<967.567566, -2195.217529, 25.539518>>, <<972.950378, -2098.676270, 49.888527>>, 70.0)
MISSION_FLOW_SET_FAIL_WARP_LOCATION(<<933.0538, -2162.6216, 29.5012>>, 96.4993)
SET_REPLAY_DECLINED_VEHICLE_WARP_LOCATION(<<929.5760, -2162.3455, 29.3527>>, 175.2960)
ENDIF
//Michael Unavailable
SET_MICHAEL_UNAVAILABLE_ON_FAIL()
MISSION_CLEANUP() // must only take 1 frame and terminate the thread
ENDPROC
PROC DEATH_CHECKS()
IF IS_ENTITY_DEAD(PLAYER_PED_ID())
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN
eMissionFail = failFranklinDied
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
eMissionFail = failMichaelDied
ENDIF
missionFailed()
ENDIF
IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
AND NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
IF DOES_ENTITY_EXIST(objHook)
AND DOES_ENTITY_EXIST(objChain)
AND DOES_ENTITY_EXIST(objPadlock)
IF IS_ENTITY_ATTACHED_TO_ENTITY(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], objHook)
IF IS_EXPLOSION_IN_SPHERE(EXP_TAG_DONTCARE, GET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], FALSE), 3.0)
OR GET_NUMBER_OF_FIRES_IN_RANGE(GET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], FALSE), 3.0) > 0
OR IS_ENTITY_ON_FIRE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
OR IS_ENTITY_ON_FIRE(objHook)
OR IS_ENTITY_ON_FIRE(objChain)
OR IS_ENTITY_ON_FIRE(objPadlock)
APPLY_DAMAGE_TO_PED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], 1000, TRUE)
SET_PED_TO_RAGDOLL(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], 10000, 10000, TASK_RELAX, FALSE, FALSE)
//Pin the ankle to the bottom of the hook
VECTOR vRightFootAttach
vRightFootAttach = <<-0.075, -0.1, -0.85>>
ATTACH_ENTITY_TO_ENTITY_PHYSICALLY(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], objHook, GET_PED_BONE_INDEX(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], BONETAG_R_FOOT), -1, vRightFootAttach, VECTOR_ZERO, VECTOR_ZERO, -1.0, TRUE, FALSE, FALSE, FALSE)
ATTACH_ENTITY_TO_ENTITY_PHYSICALLY(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], objHook, GET_PED_BONE_INDEX(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], BONETAG_L_FOOT), -1, <<-vRightFootAttach.X, vRightFootAttach.Y, vRightFootAttach.Z>>, VECTOR_ZERO, VECTOR_ZERO, -1.0, TRUE, FALSE, FALSE, FALSE)
ENDIF
ENDIF
ENDIF
ENDIF
IF SAFE_DEATH_CHECK_PED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
SAFE_REMOVE_BLIP(blipMichael)
eMissionFail = failMichaelDied
missionFailed()
ENDIF
IF SAFE_DEATH_CHECK_PED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
SAFE_REMOVE_BLIP(blipFranklin)
eMissionFail = failFranklinDied
missionFailed()
ENDIF
// IF eMissionObjective = stageTriadsChase
// IF SAFE_DEATH_CHECK_VEHICLE(vehEscape)
// OR SAFE_DEATH_CHECK_VEHICLE(vehHachiRoku)
// eMissionFail = failCarDestroyed
//
// missionFailed()
// ENDIF
// ENDIF
//Actors
// BOOL bInAbattoir
//
// IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<974.844238, -2100.828613, 28.905632>>, <<966.149780, -2201.403564, 45.697361>>, 60.0)
// bInAbattoir = TRUE
// ENDIF
IF eMissionObjective < stageMichaelEscape
IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
IF NOT IS_ENTITY_DEAD(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
IF bPinnedAbattoir = FALSE
SAFE_FREEZE_ENTITY_POSITION(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], TRUE)
ELSE
SAFE_FREEZE_ENTITY_POSITION(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], FALSE)
ENDIF
ENDIF
ENDIF
ENDIF
//Closest Ped
PED_INDEX pedClosestEnemyTemp = pedClosestEnemy //We'll store this to check for a closer ped to speak. Saves extra script elsewhere.
INT i
REPEAT iEnemyIntroCut i
IF DOES_ENTITY_EXIST(sEnemyIntroCut[i].pedIndex)
IF NOT IS_ENTITY_DEAD(sEnemyIntroCut[i].pedIndex)
IF bPinnedAbattoir = FALSE
FREEZE_ENTITY_POSITION(sEnemyIntroCut[i].pedIndex, TRUE)
ELSE
FREEZE_ENTITY_POSITION(sEnemyIntroCut[i].pedIndex, FALSE)
ENDIF
ENDIF
// IF NOT IS_PED_INJURED(sEnemyIntroCut[i].pedIndex)
// IF NOT DOES_ENTITY_EXIST(pedClosestEnemy)
// OR (DOES_ENTITY_EXIST(pedClosestEnemy)
// AND IS_PED_INJURED(pedClosestEnemy))
// OR GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sEnemyIntroCut[i].pedIndex)) < GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(pedClosestEnemy, FALSE))
// pedClosestEnemy = sEnemyIntroCut[i].pedIndex
// ENDIF
// ENDIF
ENDIF
ENDREPEAT
REPEAT iEnemyOutside i
IF DOES_ENTITY_EXIST(sEnemyOutside[i].pedIndex)
// IF IS_ENTITY_DEAD(sEnemyOutside[i].pedIndex)
// OR eMissionObjective >= stageTriadsChase
// SAFE_REMOVE_BLIP(sEnemyOutside[i].blipIndex)
// ELSE
// IF NOT DOES_BLIP_EXIST(sEnemyOutside[i].blipIndex)
// IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(sEnemyOutside[i].pedIndex), GET_ENTITY_COORDS(PLAYER_PED_ID())) < 15.0
// AND IS_ENTITY_ON_SCREEN(sEnemyOutside[i].pedIndex)
// SAFE_ADD_BLIP_PED(sEnemyOutside[i].blipIndex, sEnemyOutside[i].pedIndex, TRUE)
// ENDIF
// ENDIF
// ENDIF
UPDATE_AI_PED_BLIP(sEnemyOutside[i].pedIndex, blipStructOutside[i])
// IF NOT IS_ENTITY_DEAD(sEnemyOutside[i].pedIndex)
// IF bPinnedAbattoir = FALSE
// SAFE_FREEZE_ENTITY_POSITION(sEnemyOutside[i].pedIndex, TRUE)
// ELSE
// SAFE_FREEZE_ENTITY_POSITION(sEnemyOutside[i].pedIndex, FALSE)
// ENDIF
// ENDIF
// IF NOT IS_PED_INJURED(sEnemyOutside[i].pedIndex)
// IF NOT DOES_ENTITY_EXIST(pedClosestEnemy)
// OR (DOES_ENTITY_EXIST(pedClosestEnemy)
// AND IS_PED_INJURED(pedClosestEnemy))
// OR GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sEnemyOutside[i].pedIndex)) < GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(pedClosestEnemy, FALSE))
// pedClosestEnemy = sEnemyOutside[i].pedIndex
// ENDIF
// ENDIF
ENDIF
ENDREPEAT
REPEAT iEnemyShootout i
IF DOES_ENTITY_EXIST(sEnemyShootout[i].pedIndex)
// IF IS_ENTITY_DEAD(sEnemyShootout[i].pedIndex)
// OR eMissionObjective >= stageTriadsChase //OR bInAbattoir = FALSE
// SAFE_REMOVE_BLIP(sEnemyShootout[i].blipIndex)
// ELSE
// SAFE_ADD_BLIP_PED(sEnemyShootout[i].blipIndex, sEnemyShootout[i].pedIndex, TRUE)
// ENDIF
UPDATE_AI_PED_BLIP(sEnemyShootout[i].pedIndex, blipStructShootout[i])
IF NOT IS_ENTITY_DEAD(sEnemyShootout[i].pedIndex)
IF bPinnedAbattoir = FALSE
FREEZE_ENTITY_POSITION(sEnemyShootout[i].pedIndex, TRUE)
ELSE
FREEZE_ENTITY_POSITION(sEnemyShootout[i].pedIndex, FALSE)
ENDIF
ENDIF
IF NOT IS_PED_INJURED(sEnemyShootout[i].pedIndex)
IF NOT DOES_ENTITY_EXIST(pedClosestEnemy)
OR (DOES_ENTITY_EXIST(pedClosestEnemy)
AND IS_PED_INJURED(pedClosestEnemy))
OR GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sEnemyShootout[i].pedIndex)) < GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(pedClosestEnemy, FALSE))
pedClosestEnemy = sEnemyShootout[i].pedIndex
ENDIF
ENDIF
ENDIF
ENDREPEAT
REPEAT iEnemyBackup i
IF DOES_ENTITY_EXIST(sEnemyBackup[i].pedIndex)
// IF IS_ENTITY_DEAD(sEnemyBackup[i].pedIndex)
// OR eMissionObjective >= stageTriadsChase //OR bInAbattoir = FALSE
// SAFE_REMOVE_BLIP(sEnemyBackup[i].blipIndex)
// ELSE
// SAFE_ADD_BLIP_PED(sEnemyBackup[i].blipIndex, sEnemyBackup[i].pedIndex, TRUE)
// ENDIF
UPDATE_AI_PED_BLIP(sEnemyBackup[i].pedIndex, blipStructBackup[i])
IF NOT IS_ENTITY_DEAD(sEnemyBackup[i].pedIndex)
IF bPinnedAbattoir = FALSE
FREEZE_ENTITY_POSITION(sEnemyBackup[i].pedIndex, TRUE)
ELSE
FREEZE_ENTITY_POSITION(sEnemyBackup[i].pedIndex, FALSE)
ENDIF
ENDIF
IF NOT IS_PED_INJURED(sEnemyBackup[i].pedIndex)
IF NOT DOES_ENTITY_EXIST(pedClosestEnemy)
OR (DOES_ENTITY_EXIST(pedClosestEnemy)
AND IS_PED_INJURED(pedClosestEnemy))
OR GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sEnemyBackup[i].pedIndex)) < GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(pedClosestEnemy, FALSE))
pedClosestEnemy = sEnemyBackup[i].pedIndex
ENDIF
ENDIF
ENDIF
ENDREPEAT
REPEAT iEnemySetPiece i
IF DOES_ENTITY_EXIST(sEnemySetPiece[i].pedIndex)
AND NOT (i = ENUM_TO_INT(SET_PIECE_CUTTER)
AND iSetPiece[SET_PIECE_CUTTER] >= 3)
// IF IS_ENTITY_DEAD(sEnemySetPiece[i].pedIndex)
// OR eMissionObjective >= stageTriadsChase //OR bInAbattoir = FALSE
// SAFE_REMOVE_BLIP(sEnemySetPiece[i].blipIndex)
// ELSE
// IF i <> ENUM_TO_INT(SET_PIECE_GRAPPLE)
// SAFE_ADD_BLIP_PED(sEnemySetPiece[i].blipIndex, sEnemySetPiece[i].pedIndex, TRUE)
// ENDIF
// ENDIF
IF i <> ENUM_TO_INT(SET_PIECE_GRAPPLE)
UPDATE_AI_PED_BLIP(sEnemySetPiece[i].pedIndex, blipStructSetPiece[i])
ENDIF
IF NOT IS_ENTITY_DEAD(sEnemySetPiece[i].pedIndex)
IF bPinnedAbattoir = FALSE
FREEZE_ENTITY_POSITION(sEnemySetPiece[i].pedIndex, TRUE)
ELSE
FREEZE_ENTITY_POSITION(sEnemySetPiece[i].pedIndex, FALSE)
ENDIF
ENDIF
// IF NOT IS_PED_INJURED(sEnemySetPiece[i].pedIndex)
// IF NOT DOES_ENTITY_EXIST(pedClosestEnemy)
// OR (DOES_ENTITY_EXIST(pedClosestEnemy)
// AND IS_PED_INJURED(pedClosestEnemy))
// OR GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sEnemySetPiece[i].pedIndex)) < GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(pedClosestEnemy, FALSE))
// pedClosestEnemy = sEnemySetPiece[i].pedIndex
// ENDIF
// ENDIF
ENDIF
ENDREPEAT
REPEAT iEnemyEscape i
IF DOES_ENTITY_EXIST(sEnemyEscape[i].pedIndex)
// IF IS_ENTITY_DEAD(sEnemyEscape[i].pedIndex)
// OR eMissionObjective >= stageTriadsChase //OR bInAbattoir = FALSE
// SAFE_REMOVE_BLIP(sEnemyEscape[i].blipIndex)
// ELSE
// SAFE_ADD_BLIP_PED(sEnemyEscape[i].blipIndex, sEnemyEscape[i].pedIndex, TRUE)
// ENDIF
UPDATE_AI_PED_BLIP(sEnemyEscape[i].pedIndex, blipStructEscape[i])
IF NOT IS_ENTITY_DEAD(sEnemyEscape[i].pedIndex)
IF bPinnedAbattoir = FALSE
FREEZE_ENTITY_POSITION(sEnemyEscape[i].pedIndex, TRUE)
ELSE
FREEZE_ENTITY_POSITION(sEnemyEscape[i].pedIndex, FALSE)
ENDIF
ENDIF
IF NOT IS_PED_INJURED(sEnemyEscape[i].pedIndex)
IF NOT DOES_ENTITY_EXIST(pedClosestEnemy)
OR (DOES_ENTITY_EXIST(pedClosestEnemy)
AND IS_PED_INJURED(pedClosestEnemy))
OR GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sEnemyEscape[i].pedIndex)) < GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(pedClosestEnemy, FALSE))
pedClosestEnemy = sEnemyEscape[i].pedIndex
ENDIF
ENDIF
ENDIF
ENDREPEAT
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
AND pedClosestEnemyTemp != pedClosestEnemy
ADD_PED_FOR_DIALOGUE(sPedsForConversation, 3, pedClosestEnemy, "MCH2GOON")
ENDIF
ENDPROC
PROC WAIT_WITH_DEATH_CHECKS(INT iWait = 0)
INT iGameTime = GET_GAME_TIMER() + iWait
WHILE GET_GAME_TIMER() <= iGameTime
WAIT(0)
//Video Recorder
REPLAY_CHECK_FOR_EVENT_THIS_FRAME("M_FreshMeat")
DEATH_CHECKS()
ENDWHILE
ENDPROC
PROC LOAD_SCENE_ADV(VECTOR vCoords, FLOAT fRadius = 20.0)
NEW_LOAD_SCENE_START_SPHERE(vCoords, fRadius)
INT iTimeOut = GET_GAME_TIMER() + 20000
WHILE IS_NEW_LOAD_SCENE_ACTIVE()
AND NOT IS_NEW_LOAD_SCENE_LOADED()
AND GET_GAME_TIMER() < iTimeOut
#IF IS_DEBUG_BUILD
PRINTLN("NEW_LOAD_SCENE_START_SPHERE(", vCoords.X, ", ", vCoords.Y, ", ", vCoords.Z, ", ", fRadius, ")...")
#ENDIF
PRINTLN("GET_GAME_TIMER() = ", GET_GAME_TIMER(), " | iTimeOut = ", iTimeOut)
WAIT_WITH_DEATH_CHECKS(0)
ENDWHILE
#IF IS_DEBUG_BUILD
IF GET_GAME_TIMER() > iTimeOut
SCRIPT_ASSERT("NEW_LOAD_SCENE_START_SPHERE timed out, see log for details.")
ENDIF
#ENDIF
NEW_LOAD_SCENE_STOP()
ENDPROC
PROC CREATE_CONVERSATION_ADV(STRING sLabel, enumConversationPriority eConvPriority = CONV_PRIORITY_MEDIUM, BOOL bOnce = TRUE, enumSubtitlesState ShouldDisplaySubtitles = DISPLAY_SUBTITLES, enumBriefScreenState ShouldAddToBriefScreen = DO_ADD_TO_BRIEF_SCREEN)
IF NOT HAS_LABEL_BEEN_TRIGGERED(sLabel)
WHILE NOT CREATE_CONVERSATION(sPedsForConversation, sConversationBlock, sLabel, eConvPriority, ShouldDisplaySubtitles, ShouldAddToBriefScreen)
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDIF
PRINTSTRING("TRYING TO PLAY ") PRINTSTRING(sLabel) PRINTSTRING(" CONVERSATION")
PRINTNL()
WAIT_WITH_DEATH_CHECKS(0)
ENDWHILE
SET_LABEL_AS_TRIGGERED(sLabel, bOnce)
ENDIF
ENDPROC
PROC CREATE_CONVERSATION_FROM_SPECIFIC_LINE_ADV(STRING sLabel, STRING sLabelSub, enumConversationPriority eConvPriority = CONV_PRIORITY_MEDIUM, BOOL bOnce = TRUE)
IF NOT HAS_LABEL_BEEN_TRIGGERED(sLabelSub)
WHILE NOT CREATE_CONVERSATION_FROM_SPECIFIC_LINE(sPedsForConversation, sConversationBlock, sLabel, sLabelSub, eConvPriority)
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDIF
PRINTSTRING("TRYING TO PLAY ") PRINTSTRING(sLabel) PRINTSTRING(" CONVERSATION")
PRINTNL()
WAIT_WITH_DEATH_CHECKS(0)
ENDWHILE
SET_LABEL_AS_TRIGGERED(sLabel, bOnce)
ENDIF
ENDPROC
PROC PLAY_SINGLE_LINE_FROM_CONVERSATION_ADV(STRING sLabel, STRING sLabelSub, enumConversationPriority eConvPriority = CONV_PRIORITY_MEDIUM, BOOL bOnce = TRUE)
IF NOT HAS_LABEL_BEEN_TRIGGERED(sLabelSub)
WHILE NOT PLAY_SINGLE_LINE_FROM_CONVERSATION(sPedsForConversation, sConversationBlock, sLabel, sLabelSub, eConvPriority)
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDIF
PRINTSTRING("TRYING TO PLAY ") PRINTSTRING(sLabel) PRINTSTRING(", ") PRINTSTRING(sLabelSub) PRINTSTRING(" CONVERSATION")
PRINTNL()
WAIT_WITH_DEATH_CHECKS(0)
ENDWHILE
SET_LABEL_AS_TRIGGERED(sLabelSub, bOnce)
ENDIF
ENDPROC
FUNC BOOL IS_THIS_CONVERSATION_ONGOING_OR_QUEUED(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
FUNC BOOL SAFE_START_CUTSCENE(FLOAT fRadius = 0.0)
IF CAN_PLAYER_START_CUTSCENE() = TRUE
IF fRadius <> 0.0
CLEAR_AREA(GET_ENTITY_COORDS(PLAYER_PED_ID()), fRadius, TRUE)
ENDIF
CLEAR_TEXT()
KILL_PHONE_CONVERSATION()
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
ENDIF
RETURN CAN_PLAYER_START_CUTSCENE()
ENDFUNC
PROC createEnemy(ACTOR &sEnemy, VECTOR vPosition, FLOAT fHeading, WEAPON_TYPE wpType = WEAPONTYPE_PISTOL, MODEL_NAMES modelName = G_M_M_CHIGOON_02)
SPAWN_PED(sEnemy.pedIndex, modelName, vPosition, fHeading)
SET_PED_RANDOM_COMPONENT_VARIATION(sEnemy.pedIndex)
IF modelName = G_M_M_CHIGOON_02
INT iRandHair = GET_RANDOM_INT_IN_RANGE(0, 2) //Hair
IF iRandHair = 0
SET_PED_COMPONENT_VARIATION(sEnemy.pedIndex, PED_COMP_HAIR, 0, GET_RANDOM_INT_IN_RANGE(0, 2))
ELIF iRandHair = 1
SET_PED_COMPONENT_VARIATION(sEnemy.pedIndex, PED_COMP_HAIR, 1, GET_RANDOM_INT_IN_RANGE(0, 2))
ELIF iRandHair = 2
SET_PED_COMPONENT_VARIATION(sEnemy.pedIndex, PED_COMP_HAIR, 2, 0)
ENDIF
ENDIF
SET_PED_KEEP_TASK(sEnemy.pedIndex, TRUE)
SET_PED_RELATIONSHIP_GROUP_HASH(sEnemy.pedIndex, relGroupEnemy)
SET_PED_AS_ENEMY(sEnemy.pedIndex, TRUE)
SET_PED_SPHERE_DEFENSIVE_AREA(sEnemy.pedIndex, vPosition, 3.0)
SET_ENTITY_HEALTH(sEnemy.pedIndex, 200)
SET_PED_MAX_HEALTH(sEnemy.pedIndex, 200)
SET_PED_DIES_WHEN_INJURED(sEnemy.pedIndex, TRUE)
SET_PED_ACCURACY(sEnemy.pedIndex, 7)
GIVE_WEAPON_TO_PED(sEnemy.pedIndex, wpType, INFINITE_AMMO, TRUE)
SET_CURRENT_PED_WEAPON(sEnemy.pedIndex, wpType, TRUE)
//SET_PED_SHOOT_RATE(sEnemy.pedIndex, 99)
SET_PED_COMBAT_MOVEMENT(sEnemy.pedIndex, CM_DEFENSIVE)
//SET_PED_COMBAT_ATTRIBUTES(sEnemy.pedIndex, CA_REQUIRES_LOS_TO_SHOOT, TRUE)
SET_PED_COMBAT_ATTRIBUTES(sEnemy.pedIndex, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, TRUE)
//SET_PED_COMBAT_ATTRIBUTES(sEnemy.pedIndex, CA_OPEN_COMBAT_WHEN_DEFENSIVE_AREA_IS_REACHED, TRUE)
//SET_COMBAT_FLOAT(sEnemy.pedIndex, CCF_BURST_DURATION_IN_COVER, 4.0)
//SET_COMBAT_FLOAT(sEnemy.pedIndex, CCF_TIME_BETWEEN_BURSTS_IN_COVER, 0.5)
//SET_COMBAT_FLOAT(sEnemy.pedIndex, CCF_TIME_BETWEEN_PEEKS, 5.0)
SET_PED_CONFIG_FLAG(sEnemy.pedIndex, PCF_DisableHurt, TRUE)
SET_PED_CONFIG_FLAG(sEnemy.pedIndex, PCF_KillWhenTrapped, TRUE)
SET_PED_CONFIG_FLAG(sEnemy.pedIndex, PCF_RunFromFiresAndExplosions, FALSE)
SET_PED_CONFIG_FLAG(sEnemy.pedIndex, PCF_DisableExplosionReactions, TRUE)
SET_PED_COMBAT_ATTRIBUTES(sEnemy.pedIndex, CA_DISABLE_PINNED_DOWN, TRUE)
IF HAS_CLIP_SET_LOADED("MOVE_STRAFE@COP")
SET_PED_STRAFE_CLIPSET(sEnemy.pedIndex, "MOVE_STRAFE@COP")
ENDIF
INT i
sEnemy.iStage = 0
sEnemy.iTimer = 0
REPEAT 3 i
sEnemy.iTime[i] = -1
sEnemy.pedCheck[i] = NULL
sEnemy.vLocate[i] = VECTOR_ZERO
sEnemy.vLocSize[i] = VECTOR_ZERO
sEnemy.fDist[i] = -1.0
CLEAR_BIT(sEnemy.iBitsetStrict, i) //sEnemy.bStrict[i] = FALSE
sEnemy.eAdvanceStyle[i] = GO_TO_COMBAT
sEnemy.fSpeed[i] = 1.0
CLEAR_BIT(sEnemy.iBitsetNavMesh, i) //sEnemy.bNavMesh[i] = TRUE
sEnemy.vPoint[i] = VECTOR_ZERO
ENDREPEAT
#IF IS_DEBUG_BUILD
sEnemy.sDebugName = NULL
#ENDIF
//Stats
INFORM_MISSION_STATS_OF_HEADSHOT_WATCH_ENTITY(sEnemy.pedIndex)
ENDPROC
// -----------------------------------------------------------------------------------------------------------
// SWITCH CAM VARIABLES
// -----------------------------------------------------------------------------------------------------------
ENUM MICHAEL2_SWITCH_CAM_STATE
SWITCH_CAM_IDLE,
SWITCH_CAM_REQUEST_ASSETS,
SWITCH_CAM_SETUP_SPLINE,
SWITCH_CAM_PLAYING_SPLINE,
SWITCH_CAM_SHUTDOWN_SPLINE,
SWITCH_CAM_RETURN_TO_GAMEPLAY
ENDENUM
MICHAEL2_SWITCH_CAM_STATE eSwitchCamState = SWITCH_CAM_IDLE
SWITCH_CAM_STRUCT scsSwitchCam_FranklinToMichael
SWITCH_CAM_STRUCT scsSwitchCam_FranklinInCarToMichael
BOOL bFrankToMikeSwitchComplete
SWITCH_CAM_STRUCT scsSwitchCam_MichaelToFranklin
SWITCH_CAM_STRUCT scsSwitchCam_FranklinGrappleToMichael
#IF IS_DEBUG_BUILD
//BOOL bSwitchCamDebugScenarioEnabled = TRUE
//BOOL bResetDebugScenario = FALSE
#ENDIF
BOOL bPlayerControlGiven
FLOAT SwitchCamGameplayCamHeading = 0.0
FLOAT SwitchCamGameplayCamPitch = 0.0
FLOAT FrankGrappleToMikeGameplayCamHeading = 0.0
FLOAT FrankGrappleToMikeGameplayCamPitch = -2.8
BOOL bFranklinPlayedCellAnim
BOOL bFranklinPlayAnimFromHangupPos
OBJECT_INDEX oiFrankCellPhoneProp
OBJECT_INDEX oiFrankCellPhoneDisplay
INT iFrankToMike_PhoneAudID
BOOL bFrankToMikeSwitch_PhoneSoundPlayed
BOOL bMikeToFrank_SwitchToFrank
BOOL bMikeToFrank_StopDialogue
FLOAT fMikeToFrank_StopDialoguePhase = 0.53
BOOL bMikeToFrank_SwitchedToFrank
FLOAT fMikeToFrank_SwitchToFrankPhase = 0.6
//BOOL bMikeToFrank_DestGeoRequested
//FLOAT fMikeToFrank_PreloadDestGeo = 0.0
//FLOAT fSRLTime
PED_INDEX piMichaelSwitch
PED_INDEX piFranklinSwitch
MODEL_NAMES mn_FrankPhoneDisplay = PROP_PHONE_OVERLAY_01
VECTOR v_FrankPhoneDisplayOffset = <<0.0, 0.0, 0.0>>
VECTOR v_FrankPhoneDisplayRotation = <<0.0, 0.0, 0.0>>
#IF IS_DEBUG_BUILD
INT iFrankToMike_MikeHangingAnimNum = 2
#ENDIF
BOOL bDoMikeToFranklinCustomSwitch
BOOL bMikeToFranklinSwitchTriggered
#IF IS_DEBUG_BUILD
BOOL bSkipToFrankToMikeSwitch = FALSE
BOOL bSkipCombatFrankGrappleToMikeSwitch = FALSE
#ENDIF
BOOL bFrankGrappleToMike_GameplayCamShakeActivated = FALSE
INT iFrankGrappleToMike_GameplayCamShakeDuration = 8000
FLOAT fFrankGrappleToMike_GameplayCamShakeAmplitude = 0.2
FLOAT fFrankGrappleToMike_ReturnPlayerControlPhase = 0.62
PROC SETUP_SPLINE_CAM_NODE_ARRAY_FRANKLIN_TO_MICHAEL(SWITCH_CAM_STRUCT &thisSwitchCam, PED_INDEX &piFranklin, PED_INDEX &piMichael)
CDEBUG3LN(DEBUG_MISSION, "SETUP_SPLINE_CAM_NODE_ARRAY_FRANKLIN_TO_MICHAEL")
bMikeToFranklinSwitchTriggered = bMikeToFranklinSwitchTriggered
bDoMikeToFranklinCustomSwitch = bDoMikeToFranklinCustomSwitch
IF NOT thisSwitchCam.bInitialized
//--- Start of Cam Data ---
thisSwitchCam.nodes[0].vNodePos = <<-0.0606, 1.7105 - 0.35, 0.3801>>
thisSwitchCam.nodes[0].vNodeDir = <<0.2063, 0.0631, 0.4815>>
thisSwitchCam.nodes[0].bPointAtEntity = TRUE
thisSwitchCam.nodes[0].bPointAtOffsetIsRelative = TRUE
thisSwitchCam.nodes[0].bAttachOffsetIsRelative = TRUE
thisSwitchCam.nodes[0].fNodeFOV = 30.0000
thisSwitchCam.nodes[0].bCamEaseForceLinear = TRUE
thisSwitchCam.nodes[1].iNodeTime = 1200
thisSwitchCam.nodes[1].vNodePos = <<-0.0610, 1.7100 - 0.35, 0.3800>>
thisSwitchCam.nodes[1].vNodeDir = <<0.2060, 0.0630, 0.4810>>
thisSwitchCam.nodes[1].bPointAtEntity = TRUE
thisSwitchCam.nodes[1].bPointAtOffsetIsRelative = TRUE
thisSwitchCam.nodes[1].bAttachOffsetIsRelative = TRUE
thisSwitchCam.nodes[1].fNodeFOV = 30.0000
thisSwitchCam.nodes[1].fNodeTimePostFXBlendTime = 1.0000
thisSwitchCam.nodes[1].iCamEaseType = 2
thisSwitchCam.nodes[1].fCamEaseScaler = 1.0000
thisSwitchCam.nodes[1].bCamEaseForceLinear = TRUE
thisSwitchCam.nodes[1].bFlashEnabled = TRUE
thisSwitchCam.nodes[1].SCFE_FlashEffectUsed = SCFE_SwitchShortFranklinIn
thisSwitchCam.nodes[1].fFlashNodePhaseOffset = 0.9500
thisSwitchCam.nodes[2].iNodeTime = 600
thisSwitchCam.nodes[2].vNodePos = <<-0.0838, 1.8496, 2.7160>>
thisSwitchCam.nodes[2].vNodeDir = <<0.1833, 0.2025, 2.8170>>
thisSwitchCam.nodes[2].bPointAtEntity = TRUE
thisSwitchCam.nodes[2].bPointAtOffsetIsRelative = TRUE
thisSwitchCam.nodes[2].bAttachOffsetIsRelative = TRUE
thisSwitchCam.nodes[2].fNodeFOV = 30.0000
thisSwitchCam.nodes[2].fNodeTimePostFXBlendTime = 1.0000
thisSwitchCam.nodes[2].fNodeMotionBlur = 1.0000
thisSwitchCam.nodes[2].bCamEaseForceLinear = TRUE
thisSwitchCam.nodes[2].bFlashEnabled = TRUE
thisSwitchCam.nodes[2].SCFE_FlashEffectUsed = SCFE_SwitchShortMichaelMid
thisSwitchCam.nodes[2].fMinExposure = 200.0000
thisSwitchCam.nodes[2].fMaxExposure = 200.0000
thisSwitchCam.nodes[2].iRampUpDuration = 50
thisSwitchCam.nodes[2].iRampDownDuration = 50
thisSwitchCam.nodes[2].iHoldDuration = 100
thisSwitchCam.nodes[2].fFlashNodePhaseOffset = 0.4000
thisSwitchCam.nodes[3].bIsCamCutNode = TRUE
thisSwitchCam.nodes[4].vNodePos = <<-1.1545, 1.0247, -1.9282>>
thisSwitchCam.nodes[4].vNodeDir = <<-2.8900, 0.0000, -132.1460>>
thisSwitchCam.nodes[4].fNodeFOV = 50.0000
thisSwitchCam.nodes[4].fNodeMotionBlur = 0.3000
thisSwitchCam.nodes[4].iCamEaseType = 1
thisSwitchCam.nodes[4].fCamEaseScaler = 1.0000
thisSwitchCam.nodes[4].bCamEaseForceLinear = TRUE
thisSwitchCam.nodes[4].bCamEaseForceLevel = TRUE
thisSwitchCam.nodes[5].iNodeTime = 600
thisSwitchCam.nodes[5].vNodePos = <<-1.0990, 0.9744, -0.4433>>
thisSwitchCam.nodes[5].vNodeDir = <<-2.8898, 0.0000, -132.1461>>
thisSwitchCam.nodes[5].fNodeFOV = 50.0000
thisSwitchCam.nodes[5].fNodeMotionBlur = 0.4000
thisSwitchCam.nodes[5].bCamEaseForceLinear = TRUE
thisSwitchCam.nodes[5].bCamEaseForceLevel = TRUE
thisSwitchCam.nodes[6].iNodeTime = 1600
thisSwitchCam.nodes[6].vNodePos = <<-1.04405, 0.92568, -0.4433>> //<<-1.2667, 1.1257, -0.4319>>
thisSwitchCam.nodes[6].vNodeDir = <<-2.8898, 0.0000, -132.1461>>
thisSwitchCam.nodes[6].fNodeFOV = 50.0000
thisSwitchCam.nodes[6].bCamEaseForceLinear = TRUE
thisSwitchCam.nodes[6].bCamEaseForceLevel = TRUE
thisSwitchCam.iNumNodes = 7
thisSwitchCam.iCamSwitchFocusNode = 3
thisSwitchCam.fSwitchSoundAudioStartPhase = 0.3000
thisSwitchCam.fSwitchSoundAudioEndPhase = 0.4500
thisSwitchCam.bSwitchSoundPlayOpeningPulse = TRUE
thisSwitchCam.bSwitchSoundPlayMoveLoop = TRUE
thisSwitchCam.bSwitchSoundPlayExitPulse = FALSE
thisSwitchCam.bSplineNoSmoothing = TRUE
thisSwitchCam.bAddGameplayCamAsLastNode = FALSE
thisSwitchCam.iGameplayNodeBlendDuration = 0
//--- End of Cam Data ---
thisSwitchCam.strOutputStructName = "thisSwitchCam"
thisSwitchCam.strOutputFileName = "CameraInfo_Michael2_FranklinToMichael.txt"
thisSwitchCam.strXMLFileName = "CameraInfo_Michael2_FranklinToMichael.xml"
thisSwitchCam.bInitialized = TRUE
ENDIF
thisSwitchCam.piPeds[0] = piFranklin
thisSwitchCam.piPeds[1] = piMichael
ENDPROC
PROC SETUP_SPLINE_CAM_NODE_ARRAY_FRANKLIN_IN_CAR_TO_MICHAEL(SWITCH_CAM_STRUCT &thisSwitchCam, PED_INDEX &piFranklin, PED_INDEX &piMichael)
CDEBUG3LN(DEBUG_MISSION, "SETUP_SPLINE_CAM_NODE_ARRAY_FRANKLIN_IN_CAR_TO_MICHAEL")
bMikeToFranklinSwitchTriggered = bMikeToFranklinSwitchTriggered
bDoMikeToFranklinCustomSwitch = bDoMikeToFranklinCustomSwitch
IF NOT thisSwitchCam.bInitialized
//--- Start of Cam Data ---
thisSwitchCam.nodes[0].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
thisSwitchCam.nodes[0].iForceCamPointAtEntityIndex = -1
thisSwitchCam.nodes[0].bIsGameplayCamCopy = FALSE
thisSwitchCam.nodes[0].iNodeTime = 0
thisSwitchCam.nodes[0].vNodePos = <<-0.1073, 2.1319, 0.6445>>
thisSwitchCam.nodes[0].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>>
thisSwitchCam.nodes[0].fNodeOffsetDist = 0.0000
thisSwitchCam.nodes[0].fNodeVerticleOffset = 0.0000
thisSwitchCam.nodes[0].bAttachToOriginPed = FALSE
thisSwitchCam.nodes[0].vNodeDir = <<0.2353, 0.0176, 0.5680>>
thisSwitchCam.nodes[0].bPointAtEntity = TRUE
thisSwitchCam.nodes[0].bPointAtOffsetIsRelative = TRUE
thisSwitchCam.nodes[0].bAttachOffsetIsRelative = TRUE
thisSwitchCam.nodes[0].fNodeFOV = 30.0000
thisSwitchCam.nodes[0].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>>
thisSwitchCam.nodes[0].iNodeToClone = 0
thisSwitchCam.nodes[0].NodeTimePostFX_Type = NO_EFFECT
thisSwitchCam.nodes[0].fNodeTimePostFXBlendTime = 0.0000
thisSwitchCam.nodes[0].fNodeTimePostFXTimeOffset = 0.0000
thisSwitchCam.nodes[0].fNodeMotionBlur = 0.0000
thisSwitchCam.nodes[0].NodeCamShakeType = CAM_SHAKE_DEFAULT
thisSwitchCam.nodes[0].fNodeCamShake = 0.0000
thisSwitchCam.nodes[0].iCamEaseType = 0
thisSwitchCam.nodes[0].fCamEaseScaler = 0.0000
thisSwitchCam.nodes[0].fCamNodeVelocityScale = 0.0000
thisSwitchCam.nodes[0].bCamEaseForceLinear = TRUE
thisSwitchCam.nodes[0].bCamEaseForceLevel = FALSE
thisSwitchCam.nodes[0].fTimeScale = 1.0000
thisSwitchCam.nodes[0].iTimeScaleEaseType = 0
thisSwitchCam.nodes[0].fTimeScaleEaseScaler = 0.0000
thisSwitchCam.nodes[0].bFlashEnabled = FALSE
thisSwitchCam.nodes[0].SCFE_FlashEffectUsed = SCFE_CODE_FLASH
thisSwitchCam.nodes[0].fMinExposure = 0.0000
thisSwitchCam.nodes[0].fMaxExposure = 0.0000
thisSwitchCam.nodes[0].iRampUpDuration = 0
thisSwitchCam.nodes[0].iRampDownDuration = 0
thisSwitchCam.nodes[0].iHoldDuration = 0
thisSwitchCam.nodes[0].fFlashNodePhaseOffset = 0.0000
thisSwitchCam.nodes[0].bIsLowDetailNode = FALSE
thisSwitchCam.nodes[0].bUseCustomDOF = FALSE
thisSwitchCam.nodes[0].NodeDOF_Info.fDOF_NearDOF = 0.0000
thisSwitchCam.nodes[0].NodeDOF_Info.fDOF_FarDOF = 0.0000
thisSwitchCam.nodes[0].NodeDOF_Info.fDOF_EffectStrength = 0.0000
thisSwitchCam.nodes[1].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
thisSwitchCam.nodes[1].iForceCamPointAtEntityIndex = -1
thisSwitchCam.nodes[1].bIsGameplayCamCopy = FALSE
thisSwitchCam.nodes[1].iNodeTime = 1200
thisSwitchCam.nodes[1].vNodePos = <<-0.1199, 2.2099, 0.6473>>
thisSwitchCam.nodes[1].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>>
thisSwitchCam.nodes[1].fNodeOffsetDist = 0.0000
thisSwitchCam.nodes[1].fNodeVerticleOffset = 0.0000
thisSwitchCam.nodes[1].bAttachToOriginPed = FALSE
thisSwitchCam.nodes[1].vNodeDir = <<0.2354, 0.0176, 0.5680>>
thisSwitchCam.nodes[1].bPointAtEntity = TRUE
thisSwitchCam.nodes[1].bPointAtOffsetIsRelative = TRUE
thisSwitchCam.nodes[1].bAttachOffsetIsRelative = TRUE
thisSwitchCam.nodes[1].fNodeFOV = 30.0000
thisSwitchCam.nodes[1].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>>
thisSwitchCam.nodes[1].iNodeToClone = 0
thisSwitchCam.nodes[1].NodeTimePostFX_Type = NO_EFFECT
thisSwitchCam.nodes[1].fNodeTimePostFXBlendTime = 1.0000
thisSwitchCam.nodes[1].fNodeTimePostFXTimeOffset = 0.0000
thisSwitchCam.nodes[1].fNodeMotionBlur = 0.0000
thisSwitchCam.nodes[1].NodeCamShakeType = CAM_SHAKE_DEFAULT
thisSwitchCam.nodes[1].fNodeCamShake = 0.0000
thisSwitchCam.nodes[1].iCamEaseType = 2
thisSwitchCam.nodes[1].fCamEaseScaler = 1.0000
thisSwitchCam.nodes[1].fCamNodeVelocityScale = 0.0000
thisSwitchCam.nodes[1].bCamEaseForceLinear = TRUE
thisSwitchCam.nodes[1].bCamEaseForceLevel = FALSE
thisSwitchCam.nodes[1].fTimeScale = 1.0000
thisSwitchCam.nodes[1].iTimeScaleEaseType = 0
thisSwitchCam.nodes[1].fTimeScaleEaseScaler = 0.0000
thisSwitchCam.nodes[1].bFlashEnabled = TRUE
thisSwitchCam.nodes[1].SCFE_FlashEffectUsed = SCFE_SwitchShortFranklinIn
thisSwitchCam.nodes[1].fMinExposure = 0.0000
thisSwitchCam.nodes[1].fMaxExposure = 0.0000
thisSwitchCam.nodes[1].iRampUpDuration = 0
thisSwitchCam.nodes[1].iRampDownDuration = 0
thisSwitchCam.nodes[1].iHoldDuration = 0
thisSwitchCam.nodes[1].fFlashNodePhaseOffset = 0.9500
thisSwitchCam.nodes[1].bIsLowDetailNode = FALSE
thisSwitchCam.nodes[1].bUseCustomDOF = FALSE
thisSwitchCam.nodes[1].NodeDOF_Info.fDOF_NearDOF = 0.0000
thisSwitchCam.nodes[1].NodeDOF_Info.fDOF_FarDOF = 0.0000
thisSwitchCam.nodes[1].NodeDOF_Info.fDOF_EffectStrength = 0.0000
thisSwitchCam.nodes[2].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
thisSwitchCam.nodes[2].iForceCamPointAtEntityIndex = -1
thisSwitchCam.nodes[2].bIsGameplayCamCopy = FALSE
thisSwitchCam.nodes[2].iNodeTime = 600
thisSwitchCam.nodes[2].vNodePos = <<-0.1100, 2.1471, 2.4307>>
thisSwitchCam.nodes[2].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>>
thisSwitchCam.nodes[2].fNodeOffsetDist = 0.0000
thisSwitchCam.nodes[2].fNodeVerticleOffset = 0.0000
thisSwitchCam.nodes[2].bAttachToOriginPed = FALSE
thisSwitchCam.nodes[2].vNodeDir = <<0.2453, -0.0454, 2.3514>>
thisSwitchCam.nodes[2].bPointAtEntity = TRUE
thisSwitchCam.nodes[2].bPointAtOffsetIsRelative = TRUE
thisSwitchCam.nodes[2].bAttachOffsetIsRelative = TRUE
thisSwitchCam.nodes[2].fNodeFOV = 30.0000
thisSwitchCam.nodes[2].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>>
thisSwitchCam.nodes[2].iNodeToClone = 0
thisSwitchCam.nodes[2].NodeTimePostFX_Type = NO_EFFECT
thisSwitchCam.nodes[2].fNodeTimePostFXBlendTime = 1.0000
thisSwitchCam.nodes[2].fNodeTimePostFXTimeOffset = 0.0000
thisSwitchCam.nodes[2].fNodeMotionBlur = 1.0000
thisSwitchCam.nodes[2].NodeCamShakeType = CAM_SHAKE_DEFAULT
thisSwitchCam.nodes[2].fNodeCamShake = 0.0000
thisSwitchCam.nodes[2].iCamEaseType = 0
thisSwitchCam.nodes[2].fCamEaseScaler = 0.0000
thisSwitchCam.nodes[2].fCamNodeVelocityScale = 0.0000
thisSwitchCam.nodes[2].bCamEaseForceLinear = TRUE
thisSwitchCam.nodes[2].bCamEaseForceLevel = FALSE
thisSwitchCam.nodes[2].fTimeScale = 1.0000
thisSwitchCam.nodes[2].iTimeScaleEaseType = 0
thisSwitchCam.nodes[2].fTimeScaleEaseScaler = 0.0000
thisSwitchCam.nodes[2].bFlashEnabled = TRUE
thisSwitchCam.nodes[2].SCFE_FlashEffectUsed = SCFE_SwitchShortMichaelMid
thisSwitchCam.nodes[2].fMinExposure = 200.0000
thisSwitchCam.nodes[2].fMaxExposure = 200.0000
thisSwitchCam.nodes[2].iRampUpDuration = 50
thisSwitchCam.nodes[2].iRampDownDuration = 50
thisSwitchCam.nodes[2].iHoldDuration = 100
thisSwitchCam.nodes[2].fFlashNodePhaseOffset = 0.4000
thisSwitchCam.nodes[2].bIsLowDetailNode = FALSE
thisSwitchCam.nodes[2].bUseCustomDOF = FALSE
thisSwitchCam.nodes[2].NodeDOF_Info.fDOF_NearDOF = 0.0000
thisSwitchCam.nodes[2].NodeDOF_Info.fDOF_FarDOF = 0.0000
thisSwitchCam.nodes[2].NodeDOF_Info.fDOF_EffectStrength = 0.0000
thisSwitchCam.nodes[3].bIsCamCutNode = TRUE
thisSwitchCam.nodes[4].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
thisSwitchCam.nodes[4].iForceCamPointAtEntityIndex = -1
thisSwitchCam.nodes[4].bIsGameplayCamCopy = FALSE
thisSwitchCam.nodes[4].iNodeTime = 0
thisSwitchCam.nodes[4].vNodePos = <<-1.1545, 1.0247, -1.9282>>
thisSwitchCam.nodes[4].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>>
thisSwitchCam.nodes[4].fNodeOffsetDist = 0.0000
thisSwitchCam.nodes[4].fNodeVerticleOffset = 0.0000
thisSwitchCam.nodes[4].bAttachToOriginPed = FALSE
thisSwitchCam.nodes[4].vNodeDir = <<-2.8900, 0.0000, -132.1460>>
thisSwitchCam.nodes[4].bPointAtEntity = FALSE
thisSwitchCam.nodes[4].bPointAtOffsetIsRelative = FALSE
thisSwitchCam.nodes[4].bAttachOffsetIsRelative = FALSE
thisSwitchCam.nodes[4].fNodeFOV = 50.0000
thisSwitchCam.nodes[4].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>>
thisSwitchCam.nodes[4].iNodeToClone = 0
thisSwitchCam.nodes[4].NodeTimePostFX_Type = NO_EFFECT
thisSwitchCam.nodes[4].fNodeTimePostFXBlendTime = 0.0000
thisSwitchCam.nodes[4].fNodeTimePostFXTimeOffset = 0.0000
thisSwitchCam.nodes[4].fNodeMotionBlur = 0.3000
thisSwitchCam.nodes[4].NodeCamShakeType = CAM_SHAKE_DEFAULT
thisSwitchCam.nodes[4].fNodeCamShake = 0.0000
thisSwitchCam.nodes[4].iCamEaseType = 1
thisSwitchCam.nodes[4].fCamEaseScaler = 1.0000
thisSwitchCam.nodes[4].fCamNodeVelocityScale = 0.0000
thisSwitchCam.nodes[4].bCamEaseForceLinear = TRUE
thisSwitchCam.nodes[4].bCamEaseForceLevel = TRUE
thisSwitchCam.nodes[4].fTimeScale = 1.0000
thisSwitchCam.nodes[4].iTimeScaleEaseType = 0
thisSwitchCam.nodes[4].fTimeScaleEaseScaler = 0.0000
thisSwitchCam.nodes[4].bFlashEnabled = FALSE
thisSwitchCam.nodes[4].SCFE_FlashEffectUsed = SCFE_CODE_FLASH
thisSwitchCam.nodes[4].fMinExposure = 0.0000
thisSwitchCam.nodes[4].fMaxExposure = 0.0000
thisSwitchCam.nodes[4].iRampUpDuration = 0
thisSwitchCam.nodes[4].iRampDownDuration = 0
thisSwitchCam.nodes[4].iHoldDuration = 0
thisSwitchCam.nodes[4].fFlashNodePhaseOffset = 0.0000
thisSwitchCam.nodes[4].bIsLowDetailNode = FALSE
thisSwitchCam.nodes[4].bUseCustomDOF = FALSE
thisSwitchCam.nodes[4].NodeDOF_Info.fDOF_NearDOF = 0.0000
thisSwitchCam.nodes[4].NodeDOF_Info.fDOF_FarDOF = 0.0000
thisSwitchCam.nodes[4].NodeDOF_Info.fDOF_EffectStrength = 0.0000
thisSwitchCam.nodes[5].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
thisSwitchCam.nodes[5].iForceCamPointAtEntityIndex = -1
thisSwitchCam.nodes[5].bIsGameplayCamCopy = FALSE
thisSwitchCam.nodes[5].iNodeTime = 600
thisSwitchCam.nodes[5].vNodePos = <<-1.0990, 0.9744, -0.4433>>
thisSwitchCam.nodes[5].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>>
thisSwitchCam.nodes[5].fNodeOffsetDist = 0.0000
thisSwitchCam.nodes[5].fNodeVerticleOffset = 0.0000
thisSwitchCam.nodes[5].bAttachToOriginPed = FALSE
thisSwitchCam.nodes[5].vNodeDir = <<-2.8898, 0.0000, -132.1461>>
thisSwitchCam.nodes[5].bPointAtEntity = FALSE
thisSwitchCam.nodes[5].bPointAtOffsetIsRelative = FALSE
thisSwitchCam.nodes[5].bAttachOffsetIsRelative = FALSE
thisSwitchCam.nodes[5].fNodeFOV = 50.0000
thisSwitchCam.nodes[5].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>>
thisSwitchCam.nodes[5].iNodeToClone = 0
thisSwitchCam.nodes[5].NodeTimePostFX_Type = NO_EFFECT
thisSwitchCam.nodes[5].fNodeTimePostFXBlendTime = 0.0000
thisSwitchCam.nodes[5].fNodeTimePostFXTimeOffset = 0.0000
thisSwitchCam.nodes[5].fNodeMotionBlur = 0.4000
thisSwitchCam.nodes[5].NodeCamShakeType = CAM_SHAKE_DEFAULT
thisSwitchCam.nodes[5].fNodeCamShake = 0.0000
thisSwitchCam.nodes[5].iCamEaseType = 0
thisSwitchCam.nodes[5].fCamEaseScaler = 0.0000
thisSwitchCam.nodes[5].fCamNodeVelocityScale = 0.0000
thisSwitchCam.nodes[5].bCamEaseForceLinear = TRUE
thisSwitchCam.nodes[5].bCamEaseForceLevel = TRUE
thisSwitchCam.nodes[5].fTimeScale = 1.0000
thisSwitchCam.nodes[5].iTimeScaleEaseType = 0
thisSwitchCam.nodes[5].fTimeScaleEaseScaler = 0.0000
thisSwitchCam.nodes[5].bFlashEnabled = FALSE
thisSwitchCam.nodes[5].SCFE_FlashEffectUsed = SCFE_CODE_FLASH
thisSwitchCam.nodes[5].fMinExposure = 0.0000
thisSwitchCam.nodes[5].fMaxExposure = 0.0000
thisSwitchCam.nodes[5].iRampUpDuration = 0
thisSwitchCam.nodes[5].iRampDownDuration = 0
thisSwitchCam.nodes[5].iHoldDuration = 0
thisSwitchCam.nodes[5].fFlashNodePhaseOffset = 0.0000
thisSwitchCam.nodes[5].bIsLowDetailNode = FALSE
thisSwitchCam.nodes[5].bUseCustomDOF = FALSE
thisSwitchCam.nodes[5].NodeDOF_Info.fDOF_NearDOF = 0.0000
thisSwitchCam.nodes[5].NodeDOF_Info.fDOF_FarDOF = 0.0000
thisSwitchCam.nodes[5].NodeDOF_Info.fDOF_EffectStrength = 0.0000
thisSwitchCam.nodes[6].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
thisSwitchCam.nodes[6].iForceCamPointAtEntityIndex = -1
thisSwitchCam.nodes[6].bIsGameplayCamCopy = FALSE
thisSwitchCam.nodes[6].iNodeTime = 1600
thisSwitchCam.nodes[6].vNodePos = <<-1.04405, 0.92568, -0.4433>> //<<-1.2667, 1.1257, -0.4319>>
thisSwitchCam.nodes[6].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>>
thisSwitchCam.nodes[6].fNodeOffsetDist = 0.0000
thisSwitchCam.nodes[6].fNodeVerticleOffset = 0.0000
thisSwitchCam.nodes[6].bAttachToOriginPed = FALSE
thisSwitchCam.nodes[6].vNodeDir = <<-2.8898, 0.0000, -132.1461>>
thisSwitchCam.nodes[6].bPointAtEntity = FALSE
thisSwitchCam.nodes[6].bPointAtOffsetIsRelative = FALSE
thisSwitchCam.nodes[6].bAttachOffsetIsRelative = FALSE
thisSwitchCam.nodes[6].fNodeFOV = 50.0000
thisSwitchCam.nodes[6].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>>
thisSwitchCam.nodes[6].iNodeToClone = 0
thisSwitchCam.nodes[6].NodeTimePostFX_Type = NO_EFFECT
thisSwitchCam.nodes[6].fNodeTimePostFXBlendTime = 0.0000
thisSwitchCam.nodes[6].fNodeTimePostFXTimeOffset = 0.0000
thisSwitchCam.nodes[6].fNodeMotionBlur = 0.0000
thisSwitchCam.nodes[6].NodeCamShakeType = CAM_SHAKE_DEFAULT
thisSwitchCam.nodes[6].fNodeCamShake = 0.0000
thisSwitchCam.nodes[6].iCamEaseType = 0
thisSwitchCam.nodes[6].fCamEaseScaler = 0.0000
thisSwitchCam.nodes[6].fCamNodeVelocityScale = 0.0000
thisSwitchCam.nodes[6].bCamEaseForceLinear = TRUE
thisSwitchCam.nodes[6].bCamEaseForceLevel = TRUE
thisSwitchCam.nodes[6].fTimeScale = 1.0000
thisSwitchCam.nodes[6].iTimeScaleEaseType = 0
thisSwitchCam.nodes[6].fTimeScaleEaseScaler = 0.0000
thisSwitchCam.nodes[6].bFlashEnabled = FALSE
thisSwitchCam.nodes[6].SCFE_FlashEffectUsed = SCFE_CODE_FLASH
thisSwitchCam.nodes[6].fMinExposure = 0.0000
thisSwitchCam.nodes[6].fMaxExposure = 0.0000
thisSwitchCam.nodes[6].iRampUpDuration = 0
thisSwitchCam.nodes[6].iRampDownDuration = 0
thisSwitchCam.nodes[6].iHoldDuration = 0
thisSwitchCam.nodes[6].fFlashNodePhaseOffset = 0.0000
thisSwitchCam.nodes[6].bIsLowDetailNode = FALSE
thisSwitchCam.nodes[6].bUseCustomDOF = FALSE
thisSwitchCam.nodes[6].NodeDOF_Info.fDOF_NearDOF = 0.0000
thisSwitchCam.nodes[6].NodeDOF_Info.fDOF_FarDOF = 0.0000
thisSwitchCam.nodes[6].NodeDOF_Info.fDOF_EffectStrength = 0.0000
thisSwitchCam.iNumNodes = 7
thisSwitchCam.iCamSwitchFocusNode = 3
thisSwitchCam.fSwitchSoundAudioStartPhase = 0.3000
thisSwitchCam.fSwitchSoundAudioEndPhase = 0.4500
thisSwitchCam.bSwitchSoundPlayOpeningPulse = TRUE
thisSwitchCam.bSwitchSoundPlayMoveLoop = TRUE
thisSwitchCam.bSwitchSoundPlayExitPulse = FALSE
thisSwitchCam.bSplineNoSmoothing = TRUE
thisSwitchCam.bAddGameplayCamAsLastNode = FALSE
thisSwitchCam.iGameplayNodeBlendDuration = 0
//--- End of Cam Data ---
thisSwitchCam.strOutputStructName = "thisSwitchCam"
thisSwitchCam.strOutputFileName = "CameraInfo_Michael2_FranklinInCarToMichael.txt"
thisSwitchCam.strXMLFileName = "CameraInfo_Michael2_FranklinInCarToMichael.xml"
thisSwitchCam.bInitialized = TRUE
ENDIF
thisSwitchCam.piPeds[0] = piFranklin
thisSwitchCam.piPeds[1] = piMichael
ENDPROC
/// PURPOSE:
/// Handle the playback of the switch cam. The will setup, play, shut down and cleanup the switch cam spline
/// PARAMS:
/// thisSwitchCam - Switch camera to playback
/// bReturnTrueOnce - If you only want this function to return TRUE once upon completion. Set to FALSE to have this function to return true every time this is called once the camera is finished playback.
/// RETURNS:
/// TRUE when camera is complete, FALSE if playback is still active, or if the camera has completed playback and bReturnTrueOnce is set to TRUE.
FUNC BOOL HANDLE_SWITCH_CAM_FRANKLIN_TO_MICHAEL(SWITCH_CAM_STRUCT &thisSwitchCam, BOOL bReturnTrueOnce = TRUE)
INT iCurrentSwitchNode
SWITCH eSwitchCamState
CASE SWITCH_CAM_IDLE
CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_IDLE")
BREAK
CASE SWITCH_CAM_REQUEST_ASSETS
CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_REQUEST_ASSETS")
SET_PED_POPULATION_BUDGET(0)
SET_VEHICLE_POPULATION_BUDGET(0)
SET_REDUCE_PED_MODEL_BUDGET(TRUE)
SET_REDUCE_VEHICLE_MODEL_BUDGET(TRUE)
REQUEST_CUTSCENE("MIC_2_MCS_1")
BREAK
CASE SWITCH_CAM_SETUP_SPLINE
CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_SETUP_SPLINE")
piMichaelSwitch = PLAYER_PED(CHAR_MICHAEL)
piFranklinSwitch = PLAYER_PED(CHAR_FRANKLIN)
IF NOT IS_PED_IN_ANY_VEHICLE(piFranklinSwitch)
SETUP_SPLINE_CAM_NODE_ARRAY_FRANKLIN_TO_MICHAEL(thisSwitchCam, piFranklinSwitch, piMichaelSwitch)
ELSE
SETUP_SPLINE_CAM_NODE_ARRAY_FRANKLIN_IN_CAR_TO_MICHAEL(thisSwitchCam, piFranklinSwitch, piMichaelSwitch)
ENDIF
IF DOES_SWITCH_CAM_EXIST(thisSwitchCam)
DESTROY_SWITCH_CAM(thisSwitchCam)
ENDIF
CREATE_SPLINE_CAM(thisSwitchCam)
SET_CAM_ACTIVE(thisSwitchCam.ciSpline, TRUE)
SHAKE_CAM(thisSwitchCam.ciSpline, "HAND_SHAKE", 1.0)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
DISPLAY_RADAR(FALSE)
DISPLAY_HUD(FALSE)
SETTIMERB(0)
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED(CHAR_FRANKLIN))
VEHICLE_INDEX vehBringToHalt
vehBringToHalt = GET_VEHICLE_PED_IS_IN(PLAYER_PED(CHAR_FRANKLIN))
SET_VEHICLE_RADIO_ENABLED(vehBringToHalt, FALSE)
IF DOES_ENTITY_EXIST(vehBringToHalt)
AND NOT IS_ENTITY_DEAD(vehBringToHalt)
bHaltVehicle = TRUE
ELSE
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
ENDIF
ELSE
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
ENDIF
IF HAS_LABEL_BEEN_TRIGGERED("SHAPETEST[TRUE]")
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED(CHAR_FRANKLIN))
SET_PED_POSITION(PLAYER_PED(CHAR_FRANKLIN), <<-14.5290, -1446.9047, 29.6462>>, 182.3441, FALSE)
TASK_PLAY_ANIM(PLAYER_PED(CHAR_FRANKLIN), "cellphone@", "cellphone_text_read_base", INSTANT_BLEND_IN, DEFAULT, DEFAULT, AF_LOOPING | AF_UPPERBODY) // | AF_SECONDARY)
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED(CHAR_FRANKLIN), TRUE)
ELIF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED(CHAR_FRANKLIN))
FORCE_PED_MOTION_STATE(PLAYER_PED(CHAR_FRANKLIN), MS_ON_FOOT_IDLE)
ENDIF
bPlayerControlGiven = FALSE
bFrankToMikeSwitch_PhoneSoundPlayed = FALSE
iFrankToMike_PhoneAudID = 0
SET_GAME_PAUSES_FOR_STREAMING(FALSE)
IF NOT IS_ENTITY_ATTACHED(piMichaelSwitch)
ATTACH_ENTITY_TO_ENTITY(piMichaelSwitch, objHook, 0, vMichaelAttachOffset, <<0.0, 0.0, 180.0>>, TRUE, TRUE)
ENDIF
eSwitchCamState = SWITCH_CAM_PLAYING_SPLINE
FALLTHRU
CASE SWITCH_CAM_PLAYING_SPLINE
CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_PLAYING_SPLINE")
CDEBUG3LN(DEBUG_MISSION, GET_CAM_SPLINE_PHASE(thisSwitchCam.ciSpline))
iCurrentSwitchNode = UPDATE_SPLINE_CAM(thisSwitchCam)
IF IS_CAM_ACTIVE(thisSwitchCam.ciSpline)
IF iCurrentSwitchNode >= thisSwitchCam.iCamSwitchFocusNode
IF NOT HAS_LABEL_BEEN_TRIGGERED("LoadSceneFranklin")
// SET_GAMEPLAY_CAM_RELATIVE_HEADING(SwitchCamGameplayCamHeading)
// SET_GAMEPLAY_CAM_RELATIVE_PITCH(SwitchCamGameplayCamPitch)
CLEAR_PED_TASKS(PLAYER_PED(CHAR_FRANKLIN))
// IF IS_NEW_LOAD_SCENE_ACTIVE()
// NEW_LOAD_SCENE_STOP()
// ENDIF
// PLAY_SOUND_FRONTEND(-1, "Hit_Out", "PLAYER_SWITCH_CUSTOM_SOUNDSET")
// PLAY_SOUND_FRONTEND(-1, "Short_Transition_Out", "PLAYER_SWITCH_CUSTOM_SOUNDSET")
WAIT_WITH_DEATH_CHECKS(0)
//[MF] Loading geo at Franklin's position for the next switch RIGHT AWAY.
NEW_LOAD_SCENE_START_SPHERE(<<-85.4048, -1483.7083, 32.0893>>, 200.0) //, NEWLOADSCENE_FLAG_LONGSWITCH_CUTSCENE) //GET_ENTITY_COORDS(piFranklinSwitch, FALSE)
SET_LABEL_AS_TRIGGERED("LoadSceneFranklin", TRUE)
ENDIF
ENDIF
IF NOT bFrankToMikeSwitch_PhoneSoundPlayed
PLAY_SOUND_FRONTEND(iFrankToMike_PhoneAudID, "Pull_Out", "Phone_SoundSet_Franklin")
bFrankToMikeSwitch_PhoneSoundPlayed = TRUE
ENDIF
//[MF] Once cam is at the end, reset the gameplay cam positon and advance to next state.
IF MAKE_SELECTOR_PED_SELECTION(sSelectorPeds, SELECTOR_PED_MICHAEL)
AND GET_CAM_SPLINE_PHASE(thisSwitchCam.ciSpline) >= 1.00
IF TAKE_CONTROL_OF_SELECTOR_PED(sSelectorPeds, TRUE, TRUE, TCF_CLEAR_TASK_INTERRUPT_CHECKS)
CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_RETURN_TO_GAMEPLAY")
eSwitchCamState = SWITCH_CAM_RETURN_TO_GAMEPLAY
ENDIF
ELSE
RETURN FALSE
ENDIF
ENDIF
FALLTHRU
CASE SWITCH_CAM_RETURN_TO_GAMEPLAY
SET_TIME_SCALE(1.0)
IF NOT bPlayerControlGiven
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
bPlayerControlGiven = TRUE
ENDIF
eSwitchCamState = SWITCH_CAM_IDLE
thisSwitchCam.bIsSplineCamFinishedPlaying = TRUE
sCamDetails.bRun = FALSE
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
SET_GAME_PAUSES_FOR_STREAMING(TRUE)
SET_PED_POPULATION_BUDGET(3)
SET_VEHICLE_POPULATION_BUDGET(3)
SET_REDUCE_PED_MODEL_BUDGET(FALSE)
SET_REDUCE_VEHICLE_MODEL_BUDGET(FALSE)
DELETE_OBJECT(oiFrankCellPhoneProp)
SET_MODEL_AS_NO_LONGER_NEEDED(Prop_phone_ING_03)
DELETE_OBJECT(oiFrankCellPhoneDisplay)
SET_MODEL_AS_NO_LONGER_NEEDED(mn_FrankPhoneDisplay)
CLEAR_PED_SECONDARY_TASK(PLAYER_PED(CHAR_FRANKLIN))
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED(CHAR_FRANKLIN))
SET_VEHICLE_RADIO_ENABLED(GET_VEHICLE_PED_IS_IN(PLAYER_PED(CHAR_FRANKLIN)), TRUE)
ENDIF
RETURN TRUE
BREAK
ENDSWITCH
IF bReturnTrueOnce
RETURN FALSE
ELSE
RETURN thisSwitchCam.bIsSplineCamFinishedPlaying
ENDIF
ENDFUNC
PROC SETUP_SPLINE_CAM_NODE_ARRAY_MICHAEL_TO_FRANKLIN(SWITCH_CAM_STRUCT &thisSwitchCam, PED_INDEX &piMichael, PED_INDEX &piFranklin)
CDEBUG3LN(DEBUG_MISSION, "SETUP_SPLINE_CAM_NODE_ARRAY_MICHAEL_TO_FRANKLIN")
IF NOT thisSwitchCam.bInitialized
//--- Start of Cam Data ---
thisSwitchCam.nodes[0].vNodePos = <<0.8701, 1.3396, -0.5233>>
thisSwitchCam.nodes[0].vNodeDir = <<0.0970, -0.0262, -0.5900>>
thisSwitchCam.nodes[0].bPointAtEntity = TRUE
thisSwitchCam.nodes[0].bPointAtOffsetIsRelative = TRUE
thisSwitchCam.nodes[0].bAttachOffsetIsRelative = TRUE
thisSwitchCam.nodes[0].fNodeFOV = 30.0000
thisSwitchCam.nodes[0].bCamEaseForceLinear = TRUE
thisSwitchCam.nodes[0].bIsLowDetailNode = TRUE
thisSwitchCam.nodes[1].iNodeTime = 3200
thisSwitchCam.nodes[1].vNodePos = <<0.5453, 1.0492, -0.4973>>
thisSwitchCam.nodes[1].vNodeDir = <<-0.0304, 0.0807, -0.5986>>
thisSwitchCam.nodes[1].bPointAtEntity = TRUE
thisSwitchCam.nodes[1].bPointAtOffsetIsRelative = TRUE
thisSwitchCam.nodes[1].bAttachOffsetIsRelative = TRUE
thisSwitchCam.nodes[1].fNodeFOV = 30.0000
thisSwitchCam.nodes[1].fNodeTimePostFXBlendTime = 1.0000
thisSwitchCam.nodes[1].iCamEaseType = 2
thisSwitchCam.nodes[1].fCamEaseScaler = 0.9000
thisSwitchCam.nodes[1].bCamEaseForceLinear = TRUE
thisSwitchCam.nodes[1].bFlashEnabled = TRUE
thisSwitchCam.nodes[1].SCFE_FlashEffectUsed = SCFE_SwitchShortMichaelIn
thisSwitchCam.nodes[1].fFlashNodePhaseOffset = 0.9900
thisSwitchCam.nodes[1].bIsLowDetailNode = TRUE
thisSwitchCam.nodes[2].iNodeTime = 600
thisSwitchCam.nodes[2].vNodePos = <<0.7067, 1.7139, 1.9620>>
thisSwitchCam.nodes[2].vNodeDir = <<-0.0713, 0.0428, 1.9701>>
thisSwitchCam.nodes[2].bPointAtEntity = TRUE
thisSwitchCam.nodes[2].bPointAtOffsetIsRelative = TRUE
thisSwitchCam.nodes[2].bAttachOffsetIsRelative = TRUE
thisSwitchCam.nodes[2].fNodeFOV = 30.0000
thisSwitchCam.nodes[2].fNodeTimePostFXBlendTime = 1.0000
thisSwitchCam.nodes[2].bCamEaseForceLinear = TRUE
// thisSwitchCam.nodes[2].bFlashEnabled = TRUE
// thisSwitchCam.nodes[2].SCFE_FlashEffectUsed = SCFE_SwitchShortFranklinMid
thisSwitchCam.nodes[2].fMinExposure = 200.0000
thisSwitchCam.nodes[2].fMaxExposure = 200.0000
thisSwitchCam.nodes[2].iRampUpDuration = 50
thisSwitchCam.nodes[2].iRampDownDuration = 50
thisSwitchCam.nodes[2].iHoldDuration = 100
thisSwitchCam.nodes[2].fFlashNodePhaseOffset = 0.6000
thisSwitchCam.nodes[2].bIsLowDetailNode = TRUE
thisSwitchCam.nodes[3].bIsCamCutNode = TRUE
thisSwitchCam.nodes[4].vNodePos = <<-1.8041, 2.1361, -0.3195>>
thisSwitchCam.nodes[4].vNodeDir = <<0.2940, 0.3268, -0.1647>>
thisSwitchCam.nodes[4].bPointAtEntity = TRUE
thisSwitchCam.nodes[4].bPointAtOffsetIsRelative = TRUE
thisSwitchCam.nodes[4].bAttachOffsetIsRelative = TRUE
thisSwitchCam.nodes[4].fNodeFOV = 45.0000
thisSwitchCam.nodes[4].iCamEaseType = 1
thisSwitchCam.nodes[4].fCamEaseScaler = 0.9000
thisSwitchCam.nodes[4].bCamEaseForceLinear = TRUE
thisSwitchCam.nodes[4].bCamEaseForceLevel = TRUE
thisSwitchCam.nodes[5].iNodeTime = 500
thisSwitchCam.nodes[5].vNodePos = <<-1.9438 - 0.25, 1.9582 - 1.35, 0.3947>>
thisSwitchCam.nodes[5].vNodeDir = <<0.2150, 0.2517, 0.2640>>
thisSwitchCam.nodes[5].bPointAtEntity = TRUE
thisSwitchCam.nodes[5].bPointAtOffsetIsRelative = TRUE
thisSwitchCam.nodes[5].bAttachOffsetIsRelative = TRUE
thisSwitchCam.nodes[5].fNodeFOV = 45.0000
thisSwitchCam.nodes[5].bCamEaseForceLinear = TRUE
thisSwitchCam.nodes[5].bCamEaseForceLevel = TRUE
thisSwitchCam.nodes[6].iNodeTime = 3000
thisSwitchCam.nodes[6].vNodePos = <<-1.9158 + 1.25 - 0.25, 1.7808 - 1.35, 0.5142>>
thisSwitchCam.nodes[6].vNodeDir = <<0.0695, 0.1097, 0.5908>>
thisSwitchCam.nodes[6].bPointAtEntity = TRUE
thisSwitchCam.nodes[6].bPointAtOffsetIsRelative = TRUE
thisSwitchCam.nodes[6].bAttachOffsetIsRelative = TRUE
thisSwitchCam.nodes[6].fNodeFOV = 45.0000
thisSwitchCam.nodes[6].bCamEaseForceLinear = TRUE
thisSwitchCam.nodes[6].bCamEaseForceLevel = TRUE
IF GET_CAM_VIEW_MODE_FOR_CONTEXT(GET_CAM_ACTIVE_VIEW_MODE_CONTEXT()) = CAM_VIEW_MODE_FIRST_PERSON
thisSwitchCam.nodes[7].iNodeTime = 500
thisSwitchCam.nodes[7].vNodePos = <<-0.3329, 0.5154, 0.5142>>
thisSwitchCam.nodes[7].vNodeDir = <<0.0695, 0.1097, 0.5908>>
thisSwitchCam.nodes[7].bPointAtEntity = TRUE
thisSwitchCam.nodes[7].bPointAtOffsetIsRelative = TRUE
thisSwitchCam.nodes[7].bAttachOffsetIsRelative = TRUE
thisSwitchCam.nodes[7].fNodeFOV = 45.0000
thisSwitchCam.nodes[7].bCamEaseForceLinear = TRUE
thisSwitchCam.nodes[7].bCamEaseForceLevel = TRUE
ENDIF
IF GET_CAM_VIEW_MODE_FOR_CONTEXT(GET_CAM_ACTIVE_VIEW_MODE_CONTEXT()) = CAM_VIEW_MODE_FIRST_PERSON
thisSwitchCam.iNumNodes = 8
ELSE
thisSwitchCam.iNumNodes = 7
ENDIF
thisSwitchCam.iCamSwitchFocusNode = 3
thisSwitchCam.fSwitchSoundAudioStartPhase = 0.4500
thisSwitchCam.fSwitchSoundAudioEndPhase = 0.5200
thisSwitchCam.bSwitchSoundPlayOpeningPulse = TRUE
thisSwitchCam.bSwitchSoundPlayMoveLoop = TRUE
thisSwitchCam.bSwitchSoundPlayExitPulse = TRUE
thisSwitchCam.bSplineNoSmoothing = TRUE
thisSwitchCam.bAddGameplayCamAsLastNode = FALSE
thisSwitchCam.iGameplayNodeBlendDuration = 0
//--- End of Cam Data ---
thisSwitchCam.strOutputStructName = "thisSwitchCam"
thisSwitchCam.strOutputFileName = "CameraInfo_Michael2_MichaelToFranklin.txt"
thisSwitchCam.strXMLFileName = "CameraInfo_Michael2_MichaelToFranklin.xml"
thisSwitchCam.bInitialized = TRUE
ENDIF
thisSwitchCam.piPeds[0] = piMichael
thisSwitchCam.piPeds[1] = piFranklin
ENDPROC
/// PURPOSE:
/// Handle the playback of the switch cam. The will setup, play, shut down and cleanup the switch cam spline
/// PARAMS:
/// thisSwitchCam - Switch camera to playback
/// bReturnTrueOnce - If you only want this function to return TRUE once upon completion. Set to FALSE to have this function to return true every time this is called once the camera is finished playback.
/// RETURNS:
/// TRUE when camera is complete, FALSE if playback is still active, or if the camera has completed playback and bReturnTrueOnce is set to TRUE.
FUNC BOOL HANDLE_SWITCH_CAM_MICHAEL_TO_FRANKLIN(SWITCH_CAM_STRUCT &thisSwitchCam, BOOL bReturnTrueOnce = TRUE)
//INT iCurrentSwitchNode
SWITCH eSwitchCamState
CASE SWITCH_CAM_IDLE
CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_IDLE")
BREAK
CASE SWITCH_CAM_REQUEST_ASSETS
CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_REQUEST_ASSETS")
NEW_LOAD_SCENE_START_SPHERE(<<-85.4048, -1483.7083, 32.0893>>, 200.0) //, NEWLOADSCENE_FLAG_LONGSWITCH_CUTSCENE) //GET_ENTITY_COORDS(piFranklinSwitch)
SET_ENTITY_LOAD_COLLISION_FLAG(PLAYER_PED(CHAR_FRANKLIN), TRUE)
SET_FOCUS_ENTITY(PLAYER_PED(CHAR_FRANKLIN))
ADD_NAVMESH_REQUIRED_REGION(990.39264, -2162.96143, 25.0)
// SET_FOCUS_POS_AND_VEL()
// PREFETCH_SRL("mike2_mike_to_frank")
BREAK
CASE SWITCH_CAM_SETUP_SPLINE
CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_SETUP_SPLINE")
piMichaelSwitch = PLAYER_PED(CHAR_MICHAEL)
piFranklinSwitch = PLAYER_PED(CHAR_FRANKLIN)
//PREFETCH_SRL("mike2_mike_to_frank")
// IF IS_SRL_LOADED()
// CDEBUG3LN(DEBUG_MISSION, "SRL Loaded")
SETUP_SPLINE_CAM_NODE_ARRAY_MICHAEL_TO_FRANKLIN(thisSwitchCam, piMichaelSwitch, piFranklinSwitch)
IF DOES_SWITCH_CAM_EXIST(thisSwitchCam)
DESTROY_SWITCH_CAM(thisSwitchCam)
ENDIF
CREATE_SPLINE_CAM(thisSwitchCam)
SET_CAM_ACTIVE(thisSwitchCam.ciSpline, TRUE)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
DISPLAY_RADAR(FALSE)
DISPLAY_HUD(FALSE)
SETTIMERB(0)
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
bPlayerControlGiven = FALSE
// bMikeToFrank_DestGeoRequested = FALSE
bMikeToFrank_SwitchToFrank = FALSE
bMikeToFrank_SwitchedToFrank = FALSE
bMikeToFrank_StopDialogue = FALSE
SET_GAME_PAUSES_FOR_STREAMING(TRUE)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehFranklin)
STOP_PLAYBACK_RECORDED_VEHICLE(vehFranklin)
ENDIF
IF IS_PED_IN_VEHICLE(PLAYER_PED(CHAR_FRANKLIN), vehFranklin)
START_PLAYBACK_RECORDED_VEHICLE(vehFranklin, 001, "ALrollingstart") PRINTLN("START_PLAYBACK_RECORDED_VEHICLE(vehFranklin, 001, 'ALrollingstart')")
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehFranklin, GET_TOTAL_DURATION_OF_VEHICLE_RECORDING(001, "ALrollingstart") - 4000.0)
SET_PLAYBACK_SPEED(vehFranklin, 0.0)
SET_VEHICLE_ENGINE_ON(vehFranklin, TRUE, TRUE)
ENDIF
// SET_SRL_READAHEAD_TIMES(-1, 6, -1, 6)
// BEGIN_SRL()
// SET_SRL_POST_CUTSCENE_CAMERA(<<-99.7, -1499.5, 34.9>>, <<-0.8, 0.1, 140.7>>)
// fSRLTime = 0
// SET_SRL_TIME(fSRLTime)
eSwitchCamState = SWITCH_CAM_PLAYING_SPLINE
FALLTHRU
// ENDIF
BREAK
CASE SWITCH_CAM_PLAYING_SPLINE
CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_PLAYING_SPLINE")
CDEBUG3LN(DEBUG_MISSION, GET_CAM_SPLINE_PHASE(thisSwitchCam.ciSpline))
//iCurrentSwitchNode = UPDATE_SPLINE_CAM(thisSwitchCam)
UPDATE_SPLINE_CAM(thisSwitchCam)
//[MF] To fix an issue where the HUD and radar were getting displayed early
HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_RETICLE)
HIDE_HUD_AND_RADAR_THIS_FRAME()
IF IS_CAM_ACTIVE(thisSwitchCam.ciSpline)
OVERRIDE_LODSCALE_THIS_FRAME(1.0)
// IF NOT bMikeToFrank_DestGeoRequested
// IF GET_CAM_SPLINE_PHASE(thisSwitchCam.ciSpline) >= fMikeToFrank_PreloadDestGeo
// NEW_LOAD_SCENE_START_SPHERE(GET_ENTITY_COORDS(piFranklinSwitch), 100.0, NEWLOADSCENE_FLAG_LONGSWITCH_CUTSCENE)
// bMikeToFrank_DestGeoRequested = TRUE
// ENDIF
// ENDIF
IF GET_CAM_SPLINE_PHASE(thisSwitchCam.ciSpline) >= fMikeToFrank_SwitchToFrankPhase
IF NOT bMikeToFrank_SwitchToFrank
bMikeToFrank_SwitchToFrank = TRUE
SET_GAME_PAUSES_FOR_STREAMING(FALSE)
ENDIF
SET_GAMEPLAY_CAM_RELATIVE_HEADING(SwitchCamGameplayCamHeading)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(SwitchCamGameplayCamPitch)
ENDIF
IF NOT bMikeToFrank_StopDialogue
IF GET_CAM_SPLINE_PHASE(thisSwitchCam.ciSpline) > fMikeToFrank_StopDialoguePhase
STOP_SCRIPTED_CONVERSATION(FALSE)
bMikeToFrank_StopDialogue = TRUE
ENDIF
ENDIF
// PRINTLN("TIMERB() = ", TIMERB())
// PRINTLN("GET_CAM_SPLINE_PHASE(thisSwitchCam.ciSpline) = ", GET_CAM_SPLINE_PHASE(thisSwitchCam.ciSpline))
IF NOT HAS_LABEL_BEEN_TRIGGERED("MichaelToFranklinCarSwitchCut")
IF GET_CAM_SPLINE_PHASE(thisSwitchCam.ciSpline) >= 0.506712 //0.479589 //0.517945
ANIMPOSTFX_PLAY("SwitchShortFranklinMid", 0, FALSE)
PRINTLN("SwitchShortFranklinMid . . .")
SET_LABEL_AS_TRIGGERED("MichaelToFranklinCarSwitchCut", TRUE)
ENDIF
ENDIF
//IF iCurrentSwitchNode >= (thisSwitchCam.iCamSwitchFocusNode -1)
// fSRLTime += GET_FRAME_TIME()
// IF fSRLTime < 0.0
// fSRLTime = 0.0
// ENDIF
// SET_SRL_TIME(fSRLTime)
//ENDIF
IF GET_CAM_VIEW_MODE_FOR_CONTEXT(GET_CAM_ACTIVE_VIEW_MODE_CONTEXT()) = CAM_VIEW_MODE_FIRST_PERSON
IF NOT HAS_LABEL_BEEN_TRIGGERED("SwitchFlashIntoFranklinDriving")
IF GET_CAM_SPLINE_PHASE(thisSwitchCam.ciSpline) >= 0.75 //1.0
AND bMikeToFrank_SwitchedToFrank
ANIMPOSTFX_PLAY("CamPushInNeutral", 0, FALSE)
PLAY_SOUND_FRONTEND(-1, "1st_Person_Transition", "PLAYER_SWITCH_CUSTOM_SOUNDSET")
SET_LABEL_AS_TRIGGERED("SwitchFlashIntoFranklinDriving", TRUE)
ENDIF
ENDIF
ENDIF
//[MF] Once cam is at the end, reset the gameplay cam positon and advance to next state.
IF GET_CAM_SPLINE_PHASE(thisSwitchCam.ciSpline) >= 0.8 //1.0
AND bMikeToFrank_SwitchedToFrank
CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_RETURN_TO_GAMEPLAY")
eSwitchCamState = SWITCH_CAM_RETURN_TO_GAMEPLAY
ELSE
RETURN FALSE
ENDIF
ENDIF
FALLTHRU
CASE SWITCH_CAM_RETURN_TO_GAMEPLAY
REPLAY_RECORD_BACK_FOR_TIME(4.0, 6.0)
SET_TIME_SCALE(1.0)
RENDER_SCRIPT_CAMS(FALSE, FALSE)
IF DOES_SWITCH_CAM_EXIST(thisSwitchCam)
SET_CAM_ACTIVE(thisSwitchCam.ciSpline, FALSE)
DESTROY_SWITCH_CAM(thisSwitchCam)
ENDIF
IF NOT bPlayerControlGiven
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
bPlayerControlGiven = TRUE
ENDIF
eSwitchCamState = SWITCH_CAM_IDLE
thisSwitchCam.bIsSplineCamFinishedPlaying = TRUE
bOkToSwitch = TRUE
sCamDetails.bRun = FALSE
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
SET_GAME_PAUSES_FOR_STREAMING(TRUE)
IF IS_NEW_LOAD_SCENE_ACTIVE()
NEW_LOAD_SCENE_STOP()
ENDIF
// END_SRL()
RETURN TRUE
BREAK
ENDSWITCH
IF bReturnTrueOnce
RETURN FALSE
ELSE
RETURN thisSwitchCam.bIsSplineCamFinishedPlaying
ENDIF
ENDFUNC
PROC SETUP_SPLINE_CAM_NODE_ARRAY_FRANKLIN_GRAPPLE_TO_MICHAEL(SWITCH_CAM_STRUCT &thisSwitchCam, PED_INDEX &piMichael, PED_INDEX &piFranklin)
CDEBUG3LN(DEBUG_MISSION, "SETUP_SPLINE_CAM_NODE_ARRAY_FRANKLIN_TO_MICHAEL")
IF NOT thisSwitchCam.bInitialized
//--- Start of Cam Data ---
thisSwitchCam.nodes[0].SwitchCamType = SWITCH_CAM_WORLD_POS
thisSwitchCam.nodes[0].vNodePos = <<998.4370, -2109.4990, 30.0180>>
thisSwitchCam.nodes[0].vNodeDir = <<-1.8130, 2.1560, -4.1430>>
thisSwitchCam.nodes[0].fNodeFOV = 25.0000
thisSwitchCam.nodes[1].SwitchCamType = SWITCH_CAM_WORLD_POS
thisSwitchCam.nodes[1].iNodeTime = 2000
thisSwitchCam.nodes[1].vNodePos = <<998.4368, -2109.4993, 30.0184>>
thisSwitchCam.nodes[1].vNodeDir = <<-1.8126, 2.1560, -4.1427>>
thisSwitchCam.nodes[1].fNodeFOV = 25.0000
thisSwitchCam.nodes[1].iCamEaseType = 2
thisSwitchCam.nodes[1].fCamEaseScaler = 0.6000
thisSwitchCam.nodes[1].bFlashEnabled = TRUE
thisSwitchCam.nodes[1].SCFE_FlashEffectUsed = SCFE_SwitchShortFranklinIn
thisSwitchCam.nodes[1].fFlashNodePhaseOffset = 0.9000
thisSwitchCam.nodes[2].iNodeTime = 600
thisSwitchCam.nodes[2].vNodePos = <<-4.3700, -43.7979, 0.0358>>
thisSwitchCam.nodes[2].vNodeDir = <<-0.9587, 0.0000, -2.0252>>
thisSwitchCam.nodes[2].fNodeFOV = 45.0000
thisSwitchCam.nodes[2].fNodeMotionBlur = 0.0700
thisSwitchCam.nodes[3].bIsGameplayCamCopy = TRUE
thisSwitchCam.nodes[3].iNodeTime = 1500
thisSwitchCam.nodes[3].vNodePos = <<-0.2142, -0.7233, -0.9051>>
thisSwitchCam.nodes[3].vNodeDir = <<0.5315, 0.0000, -7.4585>>
thisSwitchCam.nodes[3].bAttachOffsetIsRelative = TRUE
thisSwitchCam.nodes[3].fNodeFOV = 45.0000
thisSwitchCam.nodes[3].fNodeCamShake = 1.0000
thisSwitchCam.nodes[3].bFlashEnabled = TRUE
thisSwitchCam.nodes[3].SCFE_FlashEffectUsed = SCFE_SwitchShortMichaelMid
thisSwitchCam.iNumNodes = 4
thisSwitchCam.iCamSwitchFocusNode = 3
thisSwitchCam.fSwitchSoundAudioStartPhase = 0.4300
thisSwitchCam.fSwitchSoundAudioEndPhase = 0.5800
thisSwitchCam.bSwitchSoundPlayOpeningPulse = TRUE
thisSwitchCam.bSwitchSoundPlayMoveLoop = TRUE
thisSwitchCam.bSwitchSoundPlayExitPulse = TRUE
thisSwitchCam.bSplineNoSmoothing = FALSE
thisSwitchCam.bAddGameplayCamAsLastNode = TRUE
thisSwitchCam.iGameplayNodeBlendDuration = 500
//--- End of Cam Data ---
thisSwitchCam.strOutputStructName = "thisSwitchCam"
thisSwitchCam.strOutputFileName = "CameraInfo_Michael2_FrankGrappleToMike.txt"
thisSwitchCam.strXMLFileName = "CameraInfo_Michael2_FrankGrappleToMike.xml"
thisSwitchCam.bInitialized = TRUE
ENDIF
thisSwitchCam.piPeds[0] = piMichael
thisSwitchCam.piPeds[1] = piFranklin
ENDPROC
/// PURPOSE:
/// Handle the playback of the switch cam. The will setup, play, shut down and cleanup the switch cam spline
/// PARAMS:
/// thisSwitchCam - Switch camera to playback
/// bReturnTrueOnce - If you only want this function to return TRUE once upon completion. Set to FALSE to have this function to return true every time this is called once the camera is finished playback.
/// RETURNS:
/// TRUE when camera is complete, FALSE if playback is still active, or if the camera has completed playback and bReturnTrueOnce is set to TRUE.
FUNC BOOL HANDLE_SWITCH_CAM_FRANKLIN_GRAPPLE_TO_MICHAEL(SWITCH_CAM_STRUCT &thisSwitchCam, BOOL bReturnTrueOnce = TRUE)
SWITCH eSwitchCamState
CASE SWITCH_CAM_IDLE
CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_IDLE")
BREAK
CASE SWITCH_CAM_REQUEST_ASSETS
CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_REQUEST_ASSETS")
piMichaelSwitch = PLAYER_PED(CHAR_MICHAEL)
piFranklinSwitch = PLAYER_PED(CHAR_FRANKLIN)
SETUP_SPLINE_CAM_NODE_ARRAY_FRANKLIN_GRAPPLE_TO_MICHAEL(thisSwitchCam, piFranklinSwitch, piMichaelSwitch)
LOAD_CAM_SHAKE_LIBRARIES(thisSwitchCam)
BREAK
CASE SWITCH_CAM_SETUP_SPLINE
CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_SETUP_SPLINE")
piMichaelSwitch = PLAYER_PED(CHAR_MICHAEL)
piFranklinSwitch = PLAYER_PED(CHAR_FRANKLIN)
SETUP_SPLINE_CAM_NODE_ARRAY_FRANKLIN_GRAPPLE_TO_MICHAEL(thisSwitchCam, piFranklinSwitch, piMichaelSwitch)
//[MF] Required to make space for our switch cams.
//DESTROY_ALL_CAMS()
IF DOES_SWITCH_CAM_EXIST(thisSwitchCam)
DESTROY_SWITCH_CAM(thisSwitchCam)
ENDIF
CREATE_SPLINE_CAM(thisSwitchCam)
SET_CAM_ACTIVE(thisSwitchCam.ciSpline, TRUE)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
DISPLAY_RADAR(FALSE)
DISPLAY_HUD(FALSE)
SETTIMERB(0)
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
bPlayerControlGiven = FALSE
sCamDetails.bPedSwitched = FALSE
sCamDetails.bOKToSwitchPed = FALSE
// bMikeToFrank_DestGeoRequested = FALSE
bMikeToFrank_SwitchToFrank = FALSE
bMikeToFrank_SwitchedToFrank = FALSE
bFrankGrappleToMike_GameplayCamShakeActivated = FALSE
eSwitchCamState = SWITCH_CAM_PLAYING_SPLINE
BREAK
CASE SWITCH_CAM_PLAYING_SPLINE
CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_PLAYING_SPLINE", " ", GET_CAM_SPLINE_PHASE(thisSwitchCam.ciSpline))
UPDATE_SPLINE_CAM(thisSwitchCam)
IF IS_CAM_ACTIVE(thisSwitchCam.ciSpline)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(FrankGrappleToMikeGameplayCamHeading)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(FrankGrappleToMikeGameplayCamPitch)
IF GET_CAM_SPLINE_PHASE(thisSwitchCam.ciSpline) >= thisSwitchCam.iCamSwitchFocusNode
sCamDetails.bOKToSwitchPed = TRUE
ENDIF
IF GET_CAM_SPLINE_PHASE(thisSwitchCam.ciSpline) >= fFrankGrappleToMike_ReturnPlayerControlPhase
IF NOT bPlayerControlGiven
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
DISPLAY_RADAR(TRUE)
DISPLAY_HUD(TRUE)
bPlayerControlGiven = TRUE
ENDIF
SHOW_HUD_COMPONENT_THIS_FRAME(NEW_HUD_RETICLE) //[MF] Force the reticle to draw on screen
ELSE
HIDE_HUD_AND_RADAR_THIS_FRAME() //[MF] This is temp until we can figure out what else in the script is turning these elements back on.
ENDIF
//[MF] Once cam is at the end, reset the gameplay cam positon and advance to next state.
IF GET_CAM_SPLINE_PHASE(thisSwitchCam.ciSpline) >= 1.00
CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_RETURN_TO_GAMEPLAY")
eSwitchCamState = SWITCH_CAM_RETURN_TO_GAMEPLAY
ELSE
RETURN FALSE
ENDIF
ENDIF
FALLTHRU
CASE SWITCH_CAM_RETURN_TO_GAMEPLAY
SET_TIME_SCALE(1.0)
RENDER_SCRIPT_CAMS(FALSE, FALSE)
IF DOES_SWITCH_CAM_EXIST(thisSwitchCam)
SET_CAM_ACTIVE(thisSwitchCam.ciSpline, FALSE)
DESTROY_SWITCH_CAM(thisSwitchCam)
ENDIF
IF NOT bPlayerControlGiven
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
DISPLAY_RADAR(TRUE)
DISPLAY_HUD(TRUE)
bPlayerControlGiven = TRUE
ENDIF
bRadar = TRUE
// SETTIMERA(0)
SETTIMERB(0)
eSwitchCamState = SWITCH_CAM_IDLE
thisSwitchCam.bIsSplineCamFinishedPlaying = TRUE
sCamDetails.bRun = FALSE
SHAKE_GAMEPLAY_CAM("DRUNK_SHAKE", fFrankGrappleToMike_GameplayCamShakeAmplitude)
bFrankGrappleToMike_GameplayCamShakeActivated = TRUE
RETURN TRUE
BREAK
ENDSWITCH
IF bReturnTrueOnce
RETURN FALSE
ELSE
RETURN thisSwitchCam.bIsSplineCamFinishedPlaying
ENDIF
ENDFUNC
#IF IS_DEBUG_BUILD
/// PURPOSE:
/// Create the debug widgets for working with the scripted character switch cam.
PROC CREATE_SWITCH_CAM_SCRIPT_SPECIFIC_WIDGETS()
CDEBUG3LN(DEBUG_MISSION, "CREATE_SWITCH_CAM_SCRIPT_SPECIFIC_WIDGETS")
START_WIDGET_GROUP("Custom Switch Cameras - Extra Tunables")
START_WIDGET_GROUP("Franklin To Michael")
ADD_WIDGET_BOOL("Skip To: Frank to Mike Switch", bSkipToFrankToMikeSwitch)
ADD_WIDGET_VECTOR_SLIDER("Phone Display Offset", v_FrankPhoneDisplayOffset, 0.0, 1.0, 0.01)
ADD_WIDGET_VECTOR_SLIDER("Phone Display Rotation", v_FrankPhoneDisplayRotation, -360.0, 360.0, 10.0)
START_WIDGET_GROUP("Michael Tuner")
START_NEW_WIDGET_COMBO()
ADD_TO_WIDGET_COMBO("Anim A")
ADD_TO_WIDGET_COMBO("Anim B")
ADD_TO_WIDGET_COMBO("Anim C")
ADD_TO_WIDGET_COMBO("Anim D")
STOP_WIDGET_COMBO("Michael Hanging Anim", iFrankToMike_MikeHangingAnimNum)
STOP_WIDGET_GROUP()
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Michael to Franklin")
// ADD_WIDGET_FLOAT_SLIDER("Request Geo Cam Phase", fMikeToFrank_PreloadDestGeo, 0.0, 1.0, 0.1)
ADD_WIDGET_FLOAT_SLIDER("Switch To Franklin Cam Phase", fMikeToFrank_SwitchToFrankPhase, 0.0, 1.0, 0.1)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Frank Grapple to Mike")
ADD_WIDGET_BOOL("Skip Combat", bSkipCombatFrankGrappleToMikeSwitch)
ADD_WIDGET_FLOAT_SLIDER("Return Player Control Phase", fFrankGrappleToMike_ReturnPlayerControlPhase, 0.0, 1.0, 0.1)
START_WIDGET_GROUP("Gameplay Cam Angle Tuner")
ADD_WIDGET_FLOAT_SLIDER("Gameplay Cam Heading", FrankGrappleToMikeGameplayCamHeading, -180.0, 180.0, 1.0)
ADD_WIDGET_FLOAT_SLIDER("Gameplay Cam Pitch", FrankGrappleToMikeGameplayCamPitch, -180.0, 180.0, 1.0)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Gameplay Cam Shake Tuner")
ADD_WIDGET_FLOAT_SLIDER("Gameplay Cam Shake Amplitude", fFrankGrappleToMike_GameplayCamShakeAmplitude, 0.0, 2.0, 0.1)
ADD_WIDGET_INT_SLIDER("Gameplay Cam Shake Duration", iFrankGrappleToMike_GameplayCamShakeDuration, 0, 20000, 500)
STOP_WIDGET_GROUP()
STOP_WIDGET_GROUP()
STOP_WIDGET_GROUP()
ENDPROC
PROC HANDLE_SWITCH_CAM_SCRIPT_SPECIFIC_WIDGETS()
IF bSkipCombatFrankGrappleToMikeSwitch = TRUE
INT index
REPEAT COUNT_OF(sEnemyBackup) index
IF NOT IS_ENTITY_DEAD(sEnemyBackup[index].pedIndex)
PRINTLN("Killing sEnemyBackup: ", index)
SET_ENTITY_HEALTH(sEnemyBackup[index].pedIndex, 0)
ENDIF
ENDREPEAT
ENDIF
ENDPROC
#ENDIF
#IF IS_DEBUG_BUILD
PROC ASSIGN_DEBUG_NAMES(PED_INDEX pedIndex, STRING sName, INT iIndex)
TEXT_LABEL tDebugName = sName
IF iIndex <> -1
tDebugName += iIndex
ENDIF
SET_PED_NAME_DEBUG(pedIndex, tDebugName)
ENDPROC
#ENDIF
PROC ADVANCE_COMBAT_UPDATE(ACTOR &sEnemy)
IF DOES_ENTITY_EXIST(sEnemy.pedIndex)
IF NOT IS_PED_INJURED(sEnemy.pedIndex)
IF sEnemy.iStage < 3
BOOL bProceed = FALSE
//Timer
IF sEnemy.iTime[sEnemy.iStage] <> -1
IF IS_PED_IN_COMBAT(sEnemy.pedIndex)
IF sEnemy.iTimer = -1
sEnemy.iTimer = GET_GAME_TIMER() + sEnemy.iTime[sEnemy.iStage] PRINTLN("Timer Started: ", sEnemy.iTimer)
ELIF GET_GAME_TIMER() > sEnemy.iTimer
bProceed = TRUE
#IF IS_DEBUG_BUILD PRINTLN(sEnemy.sDebugName, " Timer Ended: bProceed = TRUE") #ENDIF
ENDIF
ENDIF
ENDIF
//Ped
IF sEnemy.pedCheck[sEnemy.iStage] != NULL
IF DOES_ENTITY_EXIST(sEnemy.pedCheck[sEnemy.iStage])
IF IS_PED_INJURED(GET_PED_INDEX_FROM_ENTITY_INDEX(sEnemy.pedCheck[sEnemy.iStage]))
bProceed = TRUE
#IF IS_DEBUG_BUILD PRINTLN(sEnemy.sDebugName, " PedCheck Died: bProceed = TRUE") #ENDIF
ENDIF
ENDIF
ENDIF
//Locate
IF NOT ARE_VECTORS_EQUAL(sEnemy.vLocate[sEnemy.iStage], VECTOR_ZERO)
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), sEnemy.vLocate[sEnemy.iStage], sEnemy.vLocSize[sEnemy.iStage])
bProceed = TRUE
#IF IS_DEBUG_BUILD PRINTLN(sEnemy.sDebugName, " PedCheck Died: bProceed = TRUE") #ENDIF
ENDIF
ENDIF
//Distance
IF sEnemy.fDist[sEnemy.iStage] <> -1.0
IF IS_ENTITY_ON_SCREEN(sEnemy.pedIndex)
AND NOT IS_ENTITY_OCCLUDED(sEnemy.pedIndex)
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(sEnemy.pedIndex), GET_ENTITY_COORDS(PLAYER_PED_ID())) < sEnemy.fDist[sEnemy.iStage]
bProceed = TRUE
#IF IS_DEBUG_BUILD PRINTLN(sEnemy.sDebugName, " Distance Under: bProceed = TRUE") #ENDIF
ENDIF
ENDIF
ENDIF
//Advance Combat Stage
IF bProceed = TRUE
//Reset Combat Float
SET_COMBAT_FLOAT(sEnemy.pedIndex, CCF_TIME_BETWEEN_BURSTS_IN_COVER, 0.5)
SWITCH sEnemy.eAdvanceStyle[sEnemy.iStage]
CASE GO_TO_COMBAT
REMOVE_PED_DEFENSIVE_AREA(sEnemy.pedIndex)
CLEAR_PED_TASKS(sEnemy.pedIndex)
TASK_COMBAT_PED(sEnemy.pedIndex, PLAYER_PED_ID())
#IF IS_DEBUG_BUILD PRINTLN(sEnemy.sDebugName, " GO_TO_COMBAT...") #ENDIF
BREAK
CASE GO_TO_POINT
REMOVE_PED_DEFENSIVE_AREA(sEnemy.pedIndex)
CLEAR_PED_TASKS(sEnemy.pedIndex)
OPEN_SEQUENCE_TASK(seqMain)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
IF IS_BIT_SET(sEnemy.iBitsetStrict, sEnemy.iStage) //sEnemy.bStrict[sEnemy.iStage] = TRUE
IF IS_BIT_SET(sEnemy.iBitsetNavMesh, sEnemy.iStage) //sEnemy.bNavMesh[sEnemy.iStage] = TRUE
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, sEnemy.vPoint[sEnemy.iStage], sEnemy.fSpeed[sEnemy.iStage])
ELSE
TASK_GO_STRAIGHT_TO_COORD(NULL, sEnemy.vPoint[sEnemy.iStage], sEnemy.fSpeed[sEnemy.iStage])
ENDIF
ENDIF
TASK_SET_SPHERE_DEFENSIVE_AREA(NULL, sEnemy.vPoint[sEnemy.iStage], 2.0)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
TASK_COMBAT_PED(NULL, PLAYER_PED_ID())
CLOSE_SEQUENCE_TASK(seqMain)
TASK_PERFORM_SEQUENCE(sEnemy.pedIndex, seqMain)
CLEAR_SEQUENCE_TASK(seqMain)
#IF IS_DEBUG_BUILD PRINTLN(sEnemy.sDebugName, " GO_TO_POINT...") #ENDIF
BREAK
CASE AIM_TO_POINT
REMOVE_PED_DEFENSIVE_AREA(sEnemy.pedIndex)
CLEAR_PED_TASKS(sEnemy.pedIndex)
OPEN_SEQUENCE_TASK(seqMain)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
IF IS_BIT_SET(sEnemy.iBitsetStrict, sEnemy.iStage) //IF sEnemy.bStrict[sEnemy.iStage] = TRUE
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(NULL, sEnemy.vPoint[sEnemy.iStage], PLAYER_PED_ID(), sEnemy.fSpeed[sEnemy.iStage], FALSE, 0.5, 4, IS_BIT_SET(sEnemy.iBitsetNavMesh, sEnemy.iStage)) //sEnemy.bNavMesh[sEnemy.iStage])
ENDIF
TASK_SET_SPHERE_DEFENSIVE_AREA(NULL, sEnemy.vPoint[sEnemy.iStage], 2.0)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
TASK_COMBAT_PED(NULL, PLAYER_PED_ID())
CLOSE_SEQUENCE_TASK(seqMain)
TASK_PERFORM_SEQUENCE(sEnemy.pedIndex, seqMain)
CLEAR_SEQUENCE_TASK(seqMain)
#IF IS_DEBUG_BUILD PRINTLN(sEnemy.sDebugName, " AIM_TO_POINT...") #ENDIF
BREAK
CASE GUN_TO_POINT
REMOVE_PED_DEFENSIVE_AREA(sEnemy.pedIndex)
CLEAR_PED_TASKS(sEnemy.pedIndex)
OPEN_SEQUENCE_TASK(seqMain)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
IF IS_BIT_SET(sEnemy.iBitsetStrict, sEnemy.iStage) //IF sEnemy.bStrict[sEnemy.iStage] = TRUE
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(NULL, sEnemy.vPoint[sEnemy.iStage], PLAYER_PED_ID(), sEnemy.fSpeed[sEnemy.iStage], TRUE, 0.5, 4, IS_BIT_SET(sEnemy.iBitsetNavMesh, sEnemy.iStage)) //sEnemy.bNavMesh[sEnemy.iStage])
ENDIF
TASK_SET_SPHERE_DEFENSIVE_AREA(NULL, sEnemy.vPoint[sEnemy.iStage], 2.0)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
TASK_COMBAT_PED(NULL, PLAYER_PED_ID())
CLOSE_SEQUENCE_TASK(seqMain)
TASK_PERFORM_SEQUENCE(sEnemy.pedIndex, seqMain)
CLEAR_SEQUENCE_TASK(seqMain)
#IF IS_DEBUG_BUILD PRINTLN(sEnemy.sDebugName, " GUN_TO_POINT...") #ENDIF
BREAK
CASE PEEK_FROM_POINT
SET_PED_CAN_PEEK_IN_COVER(sEnemy.pedIndex, TRUE)
SET_COMBAT_FLOAT(sEnemy.pedIndex, CCF_TIME_BETWEEN_BURSTS_IN_COVER, -1) //Set Combat Float
REMOVE_PED_DEFENSIVE_AREA(sEnemy.pedIndex)
CLEAR_PED_TASKS_IMMEDIATELY(sEnemy.pedIndex)
OPEN_SEQUENCE_TASK(seqMain)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
IF IS_BIT_SET(sEnemy.iBitsetStrict, sEnemy.iStage) //IF sEnemy.bStrict[sEnemy.iStage] = TRUE
TASK_PUT_PED_DIRECTLY_INTO_COVER(NULL, sEnemy.vPoint[sEnemy.iStage], -1, TRUE)
ENDIF
TASK_SET_SPHERE_DEFENSIVE_AREA(NULL, sEnemy.vPoint[sEnemy.iStage], 2.0)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
CLOSE_SEQUENCE_TASK(seqMain)
TASK_PERFORM_SEQUENCE(sEnemy.pedIndex, seqMain)
CLEAR_SEQUENCE_TASK(seqMain)
#IF IS_DEBUG_BUILD PRINTLN(sEnemy.sDebugName, " PEEK_FROM_POINT...") #ENDIF
BREAK
ENDSWITCH
sEnemy.iTimer = -1
sEnemy.iStage++
#IF IS_DEBUG_BUILD PRINTLN(sEnemy.sDebugName, " iStage = ", sEnemy.iStage) #ENDIF
ENDIF
ENDIF
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), GET_ENTITY_COORDS(sEnemy.pedIndex) - <<0.0, 0.0, 1.0>>, <<5.0, 5.0, 5.0>>)
// SET_PED_COMBAT_MOVEMENT(sEnemy.pedIndex, CM_WILLADVANCE)
// SET_PED_COMBAT_ATTRIBUTES(sEnemy.pedIndex, CA_AGGRESSIVE, TRUE)
// SET_PED_COMBAT_ATTRIBUTES(sEnemy.pedIndex, CA_USE_COVER, FALSE)
SET_PED_COMBAT_ATTRIBUTES(sEnemy.pedIndex, CA_CAN_USE_FRUSTRATED_ADVANCE, TRUE)
REMOVE_PED_DEFENSIVE_AREA(sEnemy.pedIndex)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sEnemy.pedIndex, FALSE)
sEnemy.iStage = 3
ENDIF
ENDIF
ENDIF
ENDPROC
//Mid Mission Replay
ENUM MissionReplay
replayStart,
replayAbattoirShootout,
replayMichaelEscape,
replayMichaelFree,
replayTriadsChase,
replayCutEnd
ENDENUM
PROC MISSION_REPLAY(MissionReplay eMissionReplay = replayStart)
//- Replay Specific Position
VECTOR vStartReplay
FLOAT fStartReplay
SWITCH eMissionReplay
CASE replayStart
vStartReplay = vPlayerStart
fStartReplay = fPlayerStart
BREAK
CASE replayAbattoirShootout
vStartReplay = <<934.6419, -2183.5613, 29.4654>>
fStartReplay = 355.3260
BREAK
CASE replayMichaelEscape
vStartReplay = <<996.5976, -2148.9912, 29.0>>
fStartReplay = 143.7361
BREAK
CASE replayMichaelFree
vStartReplay = <<993.9323, -2150.0239, 28.4763>>
fStartReplay = 354.8923
BREAK
CASE replayTriadsChase
vStartReplay = <<961.2763, -2106.1240, 30.5098>>
fStartReplay = 89.0595
BREAK
CASE replayCutEnd
vStartReplay = <<-860.1198, 157.7610, 63.9212>>
fStartReplay = 339.3617
BREAK
ENDSWITCH
START_REPLAY_SETUP(vStartReplay, fStartReplay, FALSE)
//Set Player
IF eMissionReplay <> replayTriadsChase
WHILE NOT SET_CURRENT_SELECTOR_PED(SELECTOR_PED_FRANKLIN)
WAIT(0)
ENDWHILE
ENDIF
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
SWITCH eMissionReplay
CASE replayStart
//Michael
// REQUEST_MODEL(GET_PLAYER_VEH_MODEL(CHAR_FRANKLIN))
//
// WHILE NOT HAS_MODEL_LOADED(GET_PLAYER_VEH_MODEL(CHAR_FRANKLIN))
// WAIT(0)
// ENDWHILE
//
// WHILE NOT CREATE_PLAYER_VEHICLE(vehCar, CHAR_FRANKLIN, <<-25.2062, -1445.3279, 29.6541>>, 180.2567, TRUE, VEHICLE_TYPE_CAR)
// WAIT(0)
// ENDWHILE
// SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(vehCar, TRUE)
//
// SET_VEHICLE_ON_GROUND_PROPERLY(vehCar)
// ACTIVATE_PHYSICS(vehCar)
eMissionObjective = stageFindMichael
BREAK
CASE replayAbattoirShootout
//Michael
REQUEST_MODEL(GET_PLAYER_PED_MODEL(CHAR_MICHAEL))
WHILE NOT HAS_MODEL_LOADED(GET_PLAYER_PED_MODEL(CHAR_MICHAEL))
WAIT(0)
ENDWHILE
WHILE NOT CREATE_PLAYER_PED_ON_FOOT(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], CHAR_MICHAEL, vPlayerStart, fPlayerStart)
WAIT(0)
ENDWHILE
SET_PED_COMP_ITEM_CURRENT_SP(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], COMP_TYPE_OUTFIT, OUTFIT_P0_DEFAULT, FALSE)
SET_PED_COMPONENT_VARIATION(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], PED_COMP_TORSO, 19, 0)
SET_PED_POSITION(PLAYER_PED_ID(), vPlayerStart, fPlayerStart)
SET_PED_TARGET_LOSS_RESPONSE(PLAYER_PED_ID(), TLR_NEVER_LOSE_TARGET)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(PLAYER_PED_ID(), TRUE)
SET_PED_CONFIG_FLAG(PLAYER_PED_ID(), PCF_RunFromFiresAndExplosions, FALSE)
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED, TRUE)
CLEAR_AREA(vPlayerStart, 500.0, TRUE)
ADD_SCENARIO_BLOCKING_AREA(<<-26.816481, -1446.621826, 44.654160>> - <<30.0, 30.0, 30.0>>, <<-26.816481, -1446.621826, 44.654160>> + <<30.0, 30.0, 30.0>>)
CLEAR_AREA(<<941.6578, -2181.0586, 29.5517>>, 1000.0, TRUE)
ADD_SCENARIO_BLOCKING_AREA(<<966.108276, -2149.353271, 55.977444>> - <<60.0, 70.0, 30.0>>, <<966.108276, -2149.353271, 55.977444>> + <<60.0, 70.0, 30.0>>)
//Franklin
// GIVE_WEAPON_TO_PED(PLAYER_PED(CHAR_FRANKLIN), WEAPONTYPE_PUMPSHOTGUN, 50)
// GIVE_WEAPON_TO_PED(PLAYER_PED(CHAR_FRANKLIN), WEAPONTYPE_ASSAULTRIFLE , 200, TRUE)
SET_CURRENT_PED_WEAPON(PLAYER_PED(CHAR_FRANKLIN), WEAPONTYPE_UNARMED, TRUE)
IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
SET_PED_RELATIONSHIP_GROUP_HASH(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], relGroupBuddy)
ENDIF
//Dialogue
REMOVE_PED_FOR_DIALOGUE(sPedsForConversation, 0)
REMOVE_PED_FOR_DIALOGUE(sPedsForConversation, 1)
ADD_PED_FOR_DIALOGUE(sPedsForConversation, 0, PLAYER_PED(CHAR_MICHAEL), "MICHAEL")
ADD_PED_FOR_DIALOGUE(sPedsForConversation, 1, PLAYER_PED(CHAR_FRANKLIN), "FRANKLIN")
//Enemy (Outside)
REQUEST_MODEL(G_M_M_CHIGOON_01)
REQUEST_MODEL(G_M_M_CHIGOON_02)
WHILE NOT HAS_MODEL_LOADED(G_M_M_CHIGOON_01)
OR NOT HAS_MODEL_LOADED(G_M_M_CHIGOON_02)
WAIT(0)
ENDWHILE
createEnemy(sEnemyOutside[0], <<951.0605, -2184.5310, 29.5517>>, 24.5982, WEAPONTYPE_PISTOL)
SET_PED_COMPONENT_VARIATION(sEnemyOutside[0].pedIndex, PED_COMP_HAIR, 2, 0)
SET_PED_COMBAT_ATTRIBUTES(sEnemyOutside[0].pedIndex, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, TRUE)
SET_PED_COMBAT_ATTRIBUTES(sEnemyOutside[0].pedIndex, CA_OPEN_COMBAT_WHEN_DEFENSIVE_AREA_IS_REACHED, TRUE)
SET_PED_SPHERE_DEFENSIVE_AREA(sEnemyOutside[0].pedIndex, <<953.1196, -2190.9177, 29.5518>>, 2.0)
//SET_PED_RELATIONSHIP_GROUP_HASH(sEnemyOutside[0].pedIndex, relGroupPassive)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sEnemyOutside[0].pedIndex, TRUE)
SET_LABEL_AS_TRIGGERED("sEnemyOutside[0]Blocking", TRUE)
ADD_PED_FOR_DIALOGUE(sPedsForConversation, 3, sEnemyOutside[0].pedIndex, "MCH2CHIN1")
// createEnemy(sEnemyOutside[1], <<962.5493, -2166.0269, 36.0140>>, 179.9051, WEAPONTYPE_PISTOL)
// sEnemyOutside[1].vLocate[0] = <<948.549438,-2178.816895,32.051651>> sEnemyOutside[1].vLocSize[0] = <<12.0, 10.0 ,2.5>> sEnemyOutside[1].eAdvanceStyle[0] = GUN_TO_POINT sEnemyOutside[1].vPoint[0] = <<955.2181, -2169.3628, 35.9913>>
createEnemy(sEnemyOutside[2], <<951.1171, -2183.3445, 29.5517>>, 186.0809, WEAPONTYPE_PISTOL)
SET_PED_COMBAT_ATTRIBUTES(sEnemyOutside[2].pedIndex, CA_OPEN_COMBAT_WHEN_DEFENSIVE_AREA_IS_REACHED, TRUE)
SET_PED_COMBAT_ATTRIBUTES(sEnemyOutside[2].pedIndex, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, TRUE)
SET_PED_SPHERE_DEFENSIVE_AREA(sEnemyOutside[2].pedIndex, <<954.4744, -2186.4724, 29.5518>>, 2.0)
//SET_PED_RELATIONSHIP_GROUP_HASH(sEnemyOutside[2].pedIndex, relGroupPassive)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sEnemyOutside[2].pedIndex, TRUE)
SET_LABEL_AS_TRIGGERED("sEnemyOutside[2]Blocking", TRUE)
ADD_PED_FOR_DIALOGUE(sPedsForConversation, 7, sEnemyOutside[2].pedIndex, "MCH2CHIN5")
#IF IS_DEBUG_BUILD
INT i
REPEAT COUNT_OF(sEnemyOutside) i
IF NOT IS_PED_INJURED(sEnemyOutside[i].pedIndex)
ASSIGN_DEBUG_NAMES(sEnemyOutside[i].pedIndex, "Outside ", i)
sEnemyOutside[i].sDebugName = CONCATENATE_STRINGS("Outside ", GET_STRING_FROM_INT(i))
ENDIF
ENDREPEAT
#ENDIF
//Rail
SET_RAIL_FINAL_NODE(31)
//Hook
objHook = CREATE_OBJECT_NO_OFFSET(PROP_LD_HOOK, sRailNodes[31].vPos)
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(objHook, FALSE)
FREEZE_ENTITY_POSITION(objHook, TRUE)
RETAIN_ENTITY_IN_INTERIOR(objHook, intAbattoir)
objChain = CREATE_OBJECT_NO_OFFSET(PROP_CS_LEG_CHAIN_01, GET_ENTITY_COORDS(objHook) + <<0.0, 0.0, 0.01>>)
ATTACH_ENTITY_TO_ENTITY(objChain, objHook, -1, vChainOffset, vChainRotation)
objPadlock = CREATE_OBJECT_NO_OFFSET(PROP_CS_PADLOCK, GET_ENTITY_COORDS(objHook) + <<0.0, 0.0, -0.01>>)
ATTACH_ENTITY_TO_ENTITY(objPadlock, objHook, -1, vPadlockOffset, vPadlockRotation)
//Particles
//Cam
IF NOT DOES_CAM_EXIST(camMain)
camMain = CREATE_CAM("DEFAULT_SCRIPTED_CAMERA", TRUE)
ENDIF
eMissionObjective = stageAbattoirShootout
BREAK
CASE replayMichaelEscape
//Michael
REQUEST_MODEL(GET_PLAYER_PED_MODEL(CHAR_MICHAEL))
WHILE NOT HAS_MODEL_LOADED(GET_PLAYER_PED_MODEL(CHAR_MICHAEL))
WAIT(0)
ENDWHILE
WHILE NOT CREATE_PLAYER_PED_ON_FOOT(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], CHAR_MICHAEL, vPlayerStart, fPlayerStart)
WAIT(0)
ENDWHILE
SET_PED_COMP_ITEM_CURRENT_SP(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], COMP_TYPE_OUTFIT, OUTFIT_P0_DEFAULT, FALSE)
SET_PED_COMPONENT_VARIATION(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], PED_COMP_TORSO, 19, 0)
SET_PED_POSITION(PLAYER_PED_ID(), vPlayerStart, fPlayerStart)
SET_PED_TARGET_LOSS_RESPONSE(PLAYER_PED_ID(), TLR_NEVER_LOSE_TARGET)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(PLAYER_PED_ID(), TRUE)
SET_PED_CONFIG_FLAG(PLAYER_PED_ID(), PCF_RunFromFiresAndExplosions, FALSE)
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED, TRUE)
CLEAR_AREA(vPlayerStart, 500.0, TRUE)
ADD_SCENARIO_BLOCKING_AREA(<<-26.816481, -1446.621826, 44.654160>> - <<30.0, 30.0, 30.0>>, <<-26.816481, -1446.621826, 44.654160>> + <<30.0, 30.0, 30.0>>)
CLEAR_AREA(<<941.6578, -2181.0586, 29.5517>>, 1000.0, TRUE)
ADD_SCENARIO_BLOCKING_AREA(<<966.108276, -2149.353271, 55.977444>> - <<60.0, 70.0, 30.0>>, <<966.108276, -2149.353271, 55.977444>> + <<60.0, 70.0, 30.0>>)
IF GET_CURRENT_PLAYER_PED_ENUM() != CHAR_MICHAEL
MAKE_SELECTOR_PED_SELECTION(sSelectorPeds, SELECTOR_PED_MICHAEL)
TAKE_CONTROL_OF_SELECTOR_PED(sSelectorPeds)
ENDIF
//ADD_ARMOUR_TO_PED(PLAYER_PED(CHAR_MICHAEL), 200)
IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[CHAR_MICHAEL])
SET_PED_RELATIONSHIP_GROUP_HASH(sSelectorPeds.pedID[CHAR_MICHAEL], relGroupBuddy)
ENDIF
//Franklin
SET_PED_CAN_BE_TARGETTED(PLAYER_PED(CHAR_FRANKLIN), FALSE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(PLAYER_PED(CHAR_FRANKLIN), TRUE)
SET_PED_CONFIG_FLAG(PLAYER_PED(CHAR_FRANKLIN), PCF_RunFromFiresAndExplosions, FALSE)
// GIVE_WEAPON_TO_PED(PLAYER_PED(CHAR_FRANKLIN), WEAPONTYPE_PUMPSHOTGUN, 50)
// GIVE_WEAPON_TO_PED(PLAYER_PED(CHAR_FRANKLIN), WEAPONTYPE_ASSAULTRIFLE , 200, TRUE)
SET_CURRENT_PED_WEAPON(PLAYER_PED(CHAR_FRANKLIN), WEAPONTYPE_UNARMED, TRUE)
IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[CHAR_FRANKLIN])
SET_PED_RELATIONSHIP_GROUP_HASH(sSelectorPeds.pedID[CHAR_FRANKLIN], relGroupBuddy)
ENDIF
//Dialogue
REMOVE_PED_FOR_DIALOGUE(sPedsForConversation, 0)
REMOVE_PED_FOR_DIALOGUE(sPedsForConversation, 1)
ADD_PED_FOR_DIALOGUE(sPedsForConversation, 0, PLAYER_PED(CHAR_MICHAEL), "MICHAEL")
ADD_PED_FOR_DIALOGUE(sPedsForConversation, 1, PLAYER_PED(CHAR_FRANKLIN), "FRANKLIN")
//Rail
SET_RAIL_FINAL_NODE(31)
//Hook
objHook = CREATE_OBJECT_NO_OFFSET(PROP_LD_HOOK, sRailNodes[31].vPos)
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(objHook, FALSE)
FREEZE_ENTITY_POSITION(objHook, TRUE)
RETAIN_ENTITY_IN_INTERIOR(objHook, intAbattoir)
objChain = CREATE_OBJECT_NO_OFFSET(PROP_CS_LEG_CHAIN_01, GET_ENTITY_COORDS(objHook) + <<0.0, 0.0, 0.01>>)
ATTACH_ENTITY_TO_ENTITY(objChain, objHook, -1, vChainOffset, vChainRotation)
objPadlock = CREATE_OBJECT_NO_OFFSET(PROP_CS_PADLOCK, GET_ENTITY_COORDS(objHook) + <<0.0, 0.0, -0.01>>)
ATTACH_ENTITY_TO_ENTITY(objPadlock, objHook, -1, vPadlockOffset, vPadlockRotation)
//Particles
//Cam
IF NOT DOES_CAM_EXIST(camMain)
camMain = CREATE_CAM("DEFAULT_SCRIPTED_CAMERA", TRUE)
ENDIF
//Reset gameplay camera to third person, see B*1993022
IF GET_FOLLOW_PED_CAM_VIEW_MODE() = CAM_VIEW_MODE_FIRST_PERSON
SET_FOLLOW_PED_CAM_VIEW_MODE(CAM_VIEW_MODE_THIRD_PERSON_NEAR)
PRINTLN("RESETTING GAMEPLAY CAM VIEW MODE TO CAM_VIEW_MODE_THIRD_PERSON_NEAR 1")
ENDIF
eMissionObjective = stageMichaelEscape
BREAK
CASE replayMichaelFree
//Michael
REQUEST_MODEL(GET_PLAYER_PED_MODEL(CHAR_MICHAEL))
WHILE NOT HAS_MODEL_LOADED(GET_PLAYER_PED_MODEL(CHAR_MICHAEL))
WAIT(0)
ENDWHILE
WHILE NOT CREATE_PLAYER_PED_ON_FOOT(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], CHAR_MICHAEL, vPlayerStart, fPlayerStart)
WAIT(0)
ENDWHILE
SET_PED_COMP_ITEM_CURRENT_SP(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], COMP_TYPE_OUTFIT, OUTFIT_P0_DEFAULT, FALSE)
SET_PED_COMPONENT_VARIATION(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], PED_COMP_TORSO, 19, 0)
SET_PED_POSITION(PLAYER_PED_ID(), vPlayerStart, fPlayerStart)
SET_PED_TARGET_LOSS_RESPONSE(PLAYER_PED_ID(), TLR_NEVER_LOSE_TARGET)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(PLAYER_PED_ID(), TRUE)
SET_PED_CONFIG_FLAG(PLAYER_PED_ID(), PCF_RunFromFiresAndExplosions, FALSE)
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED, TRUE)
CLEAR_AREA(vPlayerStart, 500.0, TRUE)
ADD_SCENARIO_BLOCKING_AREA(<<-26.816481, -1446.621826, 44.654160>> - <<30.0, 30.0, 30.0>>, <<-26.816481, -1446.621826, 44.654160>> + <<30.0, 30.0, 30.0>>)
CLEAR_AREA(<<941.6578, -2181.0586, 29.5517>>, 1000.0, TRUE)
ADD_SCENARIO_BLOCKING_AREA(<<966.108276, -2149.353271, 55.977444>> - <<60.0, 70.0, 30.0>>, <<966.108276, -2149.353271, 55.977444>> + <<60.0, 70.0, 30.0>>)
IF GET_CURRENT_PLAYER_PED_ENUM() != CHAR_MICHAEL
MAKE_SELECTOR_PED_SELECTION(sSelectorPeds, SELECTOR_PED_MICHAEL)
TAKE_CONTROL_OF_SELECTOR_PED(sSelectorPeds)
ENDIF
IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[CHAR_MICHAEL])
SET_PED_RELATIONSHIP_GROUP_HASH(sSelectorPeds.pedID[CHAR_MICHAEL], relGroupBuddy)
ENDIF
//Franklin
SET_PED_CAN_BE_TARGETTED(PLAYER_PED(CHAR_FRANKLIN), FALSE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(PLAYER_PED(CHAR_FRANKLIN), TRUE)
SET_PED_CONFIG_FLAG(PLAYER_PED(CHAR_FRANKLIN), PCF_RunFromFiresAndExplosions, FALSE)
// GIVE_WEAPON_TO_PED(PLAYER_PED(CHAR_FRANKLIN), WEAPONTYPE_PUMPSHOTGUN, 50)
// GIVE_WEAPON_TO_PED(PLAYER_PED(CHAR_FRANKLIN), WEAPONTYPE_ASSAULTRIFLE , 200, TRUE)
SET_CURRENT_PED_WEAPON(PLAYER_PED(CHAR_FRANKLIN), WEAPONTYPE_UNARMED, TRUE)
IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[CHAR_FRANKLIN])
SET_PED_RELATIONSHIP_GROUP_HASH(sSelectorPeds.pedID[CHAR_FRANKLIN], relGroupBuddy)
ENDIF
//Dialogue
REMOVE_PED_FOR_DIALOGUE(sPedsForConversation, 0)
REMOVE_PED_FOR_DIALOGUE(sPedsForConversation, 1)
ADD_PED_FOR_DIALOGUE(sPedsForConversation, 0, PLAYER_PED(CHAR_MICHAEL), "MICHAEL")
ADD_PED_FOR_DIALOGUE(sPedsForConversation, 1, PLAYER_PED(CHAR_FRANKLIN), "FRANKLIN")
//Rail
SET_RAIL_FINAL_NODE(31)
//Hook
objHook = CREATE_OBJECT_NO_OFFSET(PROP_LD_HOOK, sRailNodes[31].vPos)
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(objHook, FALSE)
FREEZE_ENTITY_POSITION(objHook, TRUE)
RETAIN_ENTITY_IN_INTERIOR(objHook, intAbattoir)
objChain = CREATE_OBJECT_NO_OFFSET(PROP_CS_LEG_CHAIN_01, GET_ENTITY_COORDS(objHook) + <<0.0, 0.0, 0.01>>)
ATTACH_ENTITY_TO_ENTITY(objChain, objHook, -1, vChainOffset, vChainRotation)
objPadlock = CREATE_OBJECT_NO_OFFSET(PROP_CS_PADLOCK, GET_ENTITY_COORDS(objHook) + <<0.0, 0.0, -0.01>>)
ATTACH_ENTITY_TO_ENTITY(objPadlock, objHook, -1, vPadlockOffset, vPadlockRotation)
//Particles
//Cam
IF NOT DOES_CAM_EXIST(camMain)
camMain = CREATE_CAM("DEFAULT_SCRIPTED_CAMERA", TRUE)
ENDIF
eMissionObjective = stageMichaelFree
BREAK
CASE replayTriadsChase
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
//Michael
REQUEST_MODEL(GET_PLAYER_PED_MODEL(CHAR_FRANKLIN))
WHILE NOT HAS_MODEL_LOADED(GET_PLAYER_PED_MODEL(CHAR_FRANKLIN))
WAIT(0)
ENDWHILE
WHILE NOT CREATE_PLAYER_PED_ON_FOOT(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], CHAR_FRANKLIN, vPlayerStart, fPlayerStart)
WAIT(0)
ENDWHILE
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN
//Michael
REQUEST_MODEL(GET_PLAYER_PED_MODEL(CHAR_MICHAEL))
WHILE NOT HAS_MODEL_LOADED(GET_PLAYER_PED_MODEL(CHAR_MICHAEL))
WAIT(0)
ENDWHILE
WHILE NOT CREATE_PLAYER_PED_ON_FOOT(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], CHAR_MICHAEL, vPlayerStart, fPlayerStart)
WAIT(0)
ENDWHILE
#IF IS_DEBUG_BUILD
ELSE
SCRIPT_ASSERT("Warning - The player is not Michael or Franklin!")
#ENDIF
ENDIF
SET_PED_TARGET_LOSS_RESPONSE(PLAYER_PED_ID(), TLR_NEVER_LOSE_TARGET)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(PLAYER_PED_ID(), TRUE)
SET_PED_CONFIG_FLAG(PLAYER_PED_ID(), PCF_RunFromFiresAndExplosions, FALSE)
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED, TRUE)
CLEAR_AREA(vPlayerStart, 500.0, TRUE)
ADD_SCENARIO_BLOCKING_AREA(<<-26.816481, -1446.621826, 44.654160>> - <<30.0, 30.0, 30.0>>, <<-26.816481, -1446.621826, 44.654160>> + <<30.0, 30.0, 30.0>>)
CLEAR_AREA(<<941.6578, -2181.0586, 29.5517>>, 1000.0, TRUE)
ADD_SCENARIO_BLOCKING_AREA(<<966.108276, -2149.353271, 55.977444>> - <<60.0, 70.0, 30.0>>, <<966.108276, -2149.353271, 55.977444>> + <<60.0, 70.0, 30.0>>)
//ADD_ARMOUR_TO_PED(NOT_PLAYER_PED_ID(), 200)
//Michael
SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED(CHAR_MICHAEL), COMP_TYPE_OUTFIT, OUTFIT_P0_DEFAULT, FALSE)
SET_PED_COMPONENT_VARIATION(PLAYER_PED(CHAR_MICHAEL), PED_COMP_TORSO, 19, 0)
IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[CHAR_MICHAEL])
SET_PED_RELATIONSHIP_GROUP_HASH(sSelectorPeds.pedID[CHAR_MICHAEL], relGroupBuddy)
ENDIF
//Franklin
SET_PED_CAN_BE_TARGETTED(PLAYER_PED(CHAR_FRANKLIN), FALSE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(PLAYER_PED(CHAR_FRANKLIN), TRUE)
SET_PED_CONFIG_FLAG(PLAYER_PED(CHAR_FRANKLIN), PCF_RunFromFiresAndExplosions, FALSE)
// GIVE_WEAPON_TO_PED(PLAYER_PED(CHAR_FRANKLIN), WEAPONTYPE_PUMPSHOTGUN, 50)
// GIVE_WEAPON_TO_PED(PLAYER_PED(CHAR_FRANKLIN), WEAPONTYPE_ASSAULTRIFLE , 200, TRUE)
SET_CURRENT_PED_WEAPON(PLAYER_PED(CHAR_FRANKLIN), WEAPONTYPE_UNARMED, TRUE)
IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[CHAR_FRANKLIN])
SET_PED_RELATIONSHIP_GROUP_HASH(sSelectorPeds.pedID[CHAR_FRANKLIN], relGroupBuddy)
ENDIF
//Dialogue
REMOVE_PED_FOR_DIALOGUE(sPedsForConversation, 0)
REMOVE_PED_FOR_DIALOGUE(sPedsForConversation, 1)
ADD_PED_FOR_DIALOGUE(sPedsForConversation, 0, PLAYER_PED(CHAR_MICHAEL), "MICHAEL")
ADD_PED_FOR_DIALOGUE(sPedsForConversation, 1, PLAYER_PED(CHAR_FRANKLIN), "FRANKLIN")
//Car
REQUEST_MODEL(COQUETTE)
WHILE NOT HAS_MODEL_LOADED(COQUETTE)
WAIT(0)
ENDWHILE
vehHachiRoku = CREATE_VEHICLE(COQUETTE, <<950.4739, -2104.9517, 29.6107>>, 106.1659)
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(vehHachiRoku, TRUE)
SET_VEHICLE_COLOURS(vehHachiRoku, 4, 0)
SET_VEHICLE_EXTRA_COLOURS(vehHachiRoku, 0, 0)
SET_VEHICLE_ON_GROUND_PROPERLY(vehHachiRoku)
SET_VEHICLE_TYRES_CAN_BURST(vehHachiRoku, FALSE)
SET_MODEL_AS_NO_LONGER_NEEDED(COQUETTE)
//Car
REQUEST_MODEL(FELTZER2)
WHILE NOT HAS_MODEL_LOADED(FELTZER2)
WAIT(0)
ENDWHILE
vehEscape = CREATE_VEHICLE(FELTZER2, <<953.9548, -2113.3518, 29.5516>>, 88.1350)
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(vehEscape, TRUE)
SET_VEHICLE_COLOURS(vehEscape, 38, 0)
SET_VEHICLE_ON_GROUND_PROPERLY(vehEscape)
SET_VEHICLE_TYRES_CAN_BURST(vehEscape, FALSE)
SET_MODEL_AS_NO_LONGER_NEEDED(FELTZER2)
//Cam
IF NOT DOES_CAM_EXIST(camMain)
camMain = CREATE_CAM("DEFAULT_SCRIPTED_CAMERA", TRUE)
ENDIF
eMissionObjective = stageTriadsChase
BREAK
CASE replayCutEnd
//Michael
REQUEST_MODEL(GET_PLAYER_PED_MODEL(CHAR_MICHAEL))
WHILE NOT HAS_MODEL_LOADED(GET_PLAYER_PED_MODEL(CHAR_MICHAEL))
WAIT(0)
ENDWHILE
WHILE NOT CREATE_PLAYER_PED_ON_FOOT(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], CHAR_MICHAEL, <<-860.1198, 157.7610, 63.9212>>, 339.3617)
WAIT(0)
ENDWHILE
SET_PED_COMP_ITEM_CURRENT_SP(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], COMP_TYPE_OUTFIT, OUTFIT_P0_DEFAULT, FALSE)
SET_PED_COMPONENT_VARIATION(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], PED_COMP_TORSO, 19, 0)
SET_PED_TARGET_LOSS_RESPONSE(PLAYER_PED_ID(), TLR_NEVER_LOSE_TARGET)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(PLAYER_PED_ID(), TRUE)
SET_PED_CONFIG_FLAG(PLAYER_PED_ID(), PCF_RunFromFiresAndExplosions, FALSE)
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED, TRUE)
CLEAR_AREA(vPlayerStart, 500.0, TRUE)
ADD_SCENARIO_BLOCKING_AREA(<<-26.816481, -1446.621826, 44.654160>> - <<30.0, 30.0, 30.0>>, <<-26.816481, -1446.621826, 44.654160>> + <<30.0, 30.0, 30.0>>)
CLEAR_AREA(<<941.6578, -2181.0586, 29.5517>>, 1000.0, TRUE)
ADD_SCENARIO_BLOCKING_AREA(<<966.108276, -2149.353271, 55.977444>> - <<60.0, 70.0, 30.0>>, <<966.108276, -2149.353271, 55.977444>> + <<60.0, 70.0, 30.0>>)
IF GET_CURRENT_PLAYER_PED_ENUM() != CHAR_MICHAEL
MAKE_SELECTOR_PED_SELECTION(sSelectorPeds, SELECTOR_PED_MICHAEL)
TAKE_CONTROL_OF_SELECTOR_PED(sSelectorPeds)
ENDIF
//ADD_ARMOUR_TO_PED(PLAYER_PED(CHAR_MICHAEL), 200)
IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[CHAR_MICHAEL])
SET_PED_RELATIONSHIP_GROUP_HASH(sSelectorPeds.pedID[CHAR_MICHAEL], relGroupBuddy)
ENDIF
//Franklin
SET_PED_CAN_BE_TARGETTED(PLAYER_PED(CHAR_FRANKLIN), FALSE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(PLAYER_PED(CHAR_FRANKLIN), TRUE)
SET_PED_CONFIG_FLAG(PLAYER_PED(CHAR_FRANKLIN), PCF_RunFromFiresAndExplosions, FALSE)
// GIVE_WEAPON_TO_PED(PLAYER_PED(CHAR_FRANKLIN), WEAPONTYPE_PUMPSHOTGUN, 50)
// GIVE_WEAPON_TO_PED(PLAYER_PED(CHAR_FRANKLIN), WEAPONTYPE_ASSAULTRIFLE , 200, TRUE)
SET_CURRENT_PED_WEAPON(PLAYER_PED(CHAR_FRANKLIN), WEAPONTYPE_UNARMED, TRUE)
IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[CHAR_FRANKLIN])
SET_PED_RELATIONSHIP_GROUP_HASH(sSelectorPeds.pedID[CHAR_FRANKLIN], relGroupBuddy)
ENDIF
//Dialogue
REMOVE_PED_FOR_DIALOGUE(sPedsForConversation, 0)
REMOVE_PED_FOR_DIALOGUE(sPedsForConversation, 1)
ADD_PED_FOR_DIALOGUE(sPedsForConversation, 0, PLAYER_PED(CHAR_MICHAEL), "MICHAEL")
ADD_PED_FOR_DIALOGUE(sPedsForConversation, 1, PLAYER_PED(CHAR_FRANKLIN), "FRANKLIN")
eMissionObjective = stageCutEnd
BREAK
ENDSWITCH
END_REPLAY_SETUP(NULL, VS_DRIVER, FALSE)
bSkipped = TRUE
bReplaySkip = TRUE
// IF IS_SCREEN_FADED_OUT()
// DO_SCREEN_FADE_IN(1000)
// ENDIF
ENDPROC
PROC LOAD_UNLOAD_ASSETS()
//Stages Reference
//stageFindMichael
//passMission
//failMission
//Mission Peds:
//GET_PLAYER_PED_MODEL(CHAR_MICHAEL)
//GET_PLAYER_PED_MODEL(CHAR_FRANKLIN)
//G_M_M_CHIGOON_01
//G_M_M_CHIGOON_02
//Mission Cars:
//BISON
//FELTZER2
//COQUETTE
//BURRITO
//Mission Props:
//PROP_LD_HOOK
//PROP_CS_PADLOCK
//PROP_CS_LEG_CHAIN_01
//Mission Recordings:
IF eMissionObjective >= stageCutIntro
AND eMissionObjective <= stageFindMichael
HAS_RECORDING_LOADED_CHECK(001, "ALrollingstart")
ENDIF
//Request Models
//Vehicle Recordings
//Waypoint Recordings
//Request Model
HAS_MODEL_LOADED_CHECK(GET_PLAYER_PED_MODEL(CHAR_MICHAEL))
HAS_MODEL_LOADED_CHECK(GET_PLAYER_PED_MODEL(CHAR_FRANKLIN))
IF eMissionObjective >= stageFindMichael
AND eMissionObjective <= stageTriadsChase
HAS_MODEL_LOADED_CHECK(G_M_M_CHIGOON_01)
HAS_MODEL_LOADED_CHECK(G_M_M_CHIGOON_02)
HAS_MODEL_LOADED_CHECK(CSB_CHIN_GOON)
ENDIF
IF eMissionObjective >= stageFindMichael
AND eMissionObjective <= stageMichaelFree
HAS_MODEL_LOADED_CHECK(PROP_LD_HOOK)
HAS_MODEL_LOADED_CHECK(PROP_CS_PADLOCK)
HAS_MODEL_LOADED_CHECK(PROP_CS_LEG_CHAIN_01)
ENDIF
IF eMissionObjective >= stageFindMichael
AND eMissionObjective <= stageAbattoirShootout
HAS_MODEL_LOADED_CHECK(BISON)
ENDIF
IF eMissionObjective >= stageMichaelEscape
AND eMissionObjective <= stageTriadsChase
HAS_MODEL_LOADED_CHECK(FELTZER2)
ENDIF
IF eMissionObjective >= stageMichaelEscape
AND eMissionObjective <= stageTriadsChase
HAS_MODEL_LOADED_CHECK(COQUETTE)
ENDIF
IF eMissionObjective >= stageAbattoirShootout
AND eMissionObjective <= stageMichaelFree
HAS_MODEL_LOADED_CHECK(PROP_WATERCRATE_01)
ENDIF
// HAS_MODEL_LOADED_CHECK(BURRITO)
IF eMissionObjective >= stageAbattoirShootout
AND eMissionObjective <= stageMichaelFree
HAS_MODEL_LOADED_CHECK(GET_WEAPONTYPE_MODEL(WEAPONTYPE_COMBATPISTOL))
REQUEST_WEAPON_ASSET(WEAPONTYPE_COMBATPISTOL)
ENDIF
IF eMissionObjective >= stageSwitchToMichael
AND eMissionObjective <= stageMichaelFree
HAS_MODEL_LOADED_CHECK(V_IND_COO_HALF)
ENDIF
//Animation Dictionaries
IF eMissionObjective >= stageCutIntro
AND eMissionObjective <= stageMichaelFree
HAS_ANIM_DICT_LOADED_CHECK(sAnimDictMic2Hook)
ELSE
UNLOAD_ANIM_DICT(sAnimDictMic2Hook)
ENDIF
IF eMissionObjective >= stageAbattoirShootout
AND eMissionObjective <= stageSwitchToMichael
HAS_ANIM_DICT_LOADED_CHECK(sAnimDictMic2Switch)
ELSE
UNLOAD_ANIM_DICT(sAnimDictMic2Switch)
ENDIF
IF eMissionObjective >= stageFindMichael
AND eMissionObjective <= stageAbattoirShootout
HAS_ANIM_DICT_LOADED_CHECK(sAnimDictMic2SetPiece1)
ELSE
UNLOAD_ANIM_DICT(sAnimDictMic2SetPiece1)
ENDIF
IF eMissionObjective >= stageMichaelEscape
AND eMissionObjective <= stageMichaelFree
HAS_ANIM_DICT_LOADED_CHECK(sAnimDictMic2SetPiece2)
ELSE
UNLOAD_ANIM_DICT(sAnimDictMic2SetPiece2)
ENDIF
IF eMissionObjective >= stageCutIntro
AND eMissionObjective <= stageAbattoirShootout
HAS_ANIM_DICT_LOADED_CHECK(sAnimDictMic2Smoking)
ELSE
UNLOAD_ANIM_DICT(sAnimDictMic2Smoking)
ENDIF
IF eMissionObjective >= stageBackToMichaels
AND eMissionObjective <= stageCutEnd
HAS_ANIM_DICT_LOADED_CHECK(sAnimDictMic2WashFace)
ELSE
UNLOAD_ANIM_DICT(sAnimDictMic2WashFace)
ENDIF
IF eMissionObjective >= stageMichaelEscape
AND eMissionObjective <= stageMichaelFree
HAS_ANIM_DICT_LOADED_CHECK(sAnimDictMic2FranklinBeckon)
ELSE
UNLOAD_ANIM_DICT(sAnimDictMic2FranklinBeckon)
ENDIF
IF eMissionObjective >= stageCutIntro
AND eMissionObjective <= stageFindMichael
HAS_ANIM_DICT_LOADED_CHECK(sAnimDictIdle1)
HAS_ANIM_DICT_LOADED_CHECK(sAnimDictIdle2)
HAS_ANIM_DICT_LOADED_CHECK(sAnimDictIdle3)
HAS_ANIM_DICT_LOADED_CHECK(sAnimDictIdle4)
ELSE
UNLOAD_ANIM_DICT(sAnimDictIdle1)
UNLOAD_ANIM_DICT(sAnimDictIdle2)
UNLOAD_ANIM_DICT(sAnimDictIdle3)
UNLOAD_ANIM_DICT(sAnimDictIdle4)
ENDIF
IF eMissionObjective = stageMichaelEscape
HAS_ANIM_DICT_LOADED_CHECK(sAnimDictMic2IG11)
ELSE
UNLOAD_ANIM_DICT(sAnimDictMic2IG11)
ENDIF
IF eMissionObjective >= stageFindMichael
AND eMissionObjective <= stageAbattoirShootout
IF NOT HAS_CLIP_SET_LOADED("move_ped_strafing")
REQUEST_CLIP_SET("move_ped_strafing")
ENDIF
ENDIF
IF eMissionObjective >= stageCutIntro
AND eMissionObjective <= stageTriadsChase
IF NOT HAS_CLIP_SET_LOADED("MOVE_STRAFE@COP")
REQUEST_CLIP_SET("MOVE_STRAFE@COP")
ENDIF
ENDIF
IF eMissionObjective >= stageAbattoirShootout
AND eMissionObjective <= stageMichaelFree
IF NOT HAS_CLIP_SET_LOADED(GET_CLIP_SET_FOR_SCRIPTED_GUN_TASK(SCRIPTED_GUN_TASK_HANGING_UPSIDE_DOWN))
REQUEST_CLIP_SET(GET_CLIP_SET_FOR_SCRIPTED_GUN_TASK(SCRIPTED_GUN_TASK_HANGING_UPSIDE_DOWN))
ENDIF
// ELSE
// IF HAS_CLIP_SET_LOADED(GET_CLIP_SET_FOR_SCRIPTED_GUN_TASK(SCRIPTED_GUN_TASK_HANGING_UPSIDE_DOWN))
// REMOVE_CLIP_SET(GET_CLIP_SET_FOR_SCRIPTED_GUN_TASK(SCRIPTED_GUN_TASK_HANGING_UPSIDE_DOWN))
// ENDIF
ENDIF
//Audio
// IF eMissionObjective >= stageFindMichael
REQUEST_SCRIPT_AUDIO_BANK("Michael_2_Kidnap_Rail")
// ENDIF
ENDPROC
PROC SET_PED_ON_GROUND_PROPERLY(PED_INDEX &pedIndex)
VECTOR vGround = GET_ENTITY_COORDS(pedIndex)
GET_GROUND_Z_FOR_3D_COORD(GET_ENTITY_COORDS(pedIndex), vGround.Z)
SET_PED_POSITION(pedIndex, vGround, GET_ENTITY_HEADING(pedIndex))
ENDPROC
//PURPOSE: Stores the details of the currently active cutscene cam while Michael is attached to the rail
PROC GET_ACTIVE_MICHAEL_CAM_DETAILS(VECTOR &vPos, VECTOR &vRot, FLOAT &fFov)
BOOL bGotDetails = FALSE
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
IF DOES_CAM_EXIST(camMain)
IF IS_CAM_ACTIVE(camMain)
vPos = GET_CAM_COORD(camMain)
vRot = GET_CAM_ROT(camMain)
fFov = GET_CAM_FOV(camMain)
bGotDetails = TRUE
ENDIF
ENDIF
ELSE
bGotDetails = TRUE
ENDIF
IF NOT bGotDetails
PRINTLN("eMichaelHostageProg: ", ENUM_TO_INT(eMissionObjective))
SCRIPT_ASSERT("GET_ACTIVE_MICHAEL_CAM_DETAILS: Didn't get cam details")
ENDIF
ENDPROC
PROC SWITCH_CONTROL()
#IF IS_DEBUG_BUILD
IF DOES_CAM_EXIST(sCamDetails.camID)
PRINTLN("SPLINE PHASE = ", GET_CAM_SPLINE_PHASE(sCamDetails.camID))
ENDIF
#ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("DeathSwitch")
IF iCurrentNode > 31
AND GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN
SET_LABEL_AS_TRIGGERED("DeathSwitch", TRUE)
ENDIF
ENDIF
IF ((bOkToSwitch
AND iCurrentNode <= 31)
OR HAS_LABEL_BEEN_TRIGGERED("DeathSwitch"))
IF NOT sCamDetails.bRun
BOOL bSwitchPedSelected
IF NOT HAS_LABEL_BEEN_TRIGGERED("DeathSwitchOnce")
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
SET_SELECTOR_PED_HINT(sSelectorPeds, SELECTOR_PED_FRANKLIN, TRUE)
SET_SELECTOR_PED_HINT(sSelectorPeds, SELECTOR_PED_MICHAEL, FALSE)
IF UPDATE_SELECTOR_HUD(sSelectorPeds, FALSE)
bSwitchPedSelected = TRUE
ENDIF
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN
SET_SELECTOR_PED_HINT(sSelectorPeds, SELECTOR_PED_MICHAEL, FALSE)
SET_SELECTOR_PED_HINT(sSelectorPeds, SELECTOR_PED_FRANKLIN, FALSE)
IF (NOT IS_ENTITY_AT_COORD(PLAYER_PED(CHAR_FRANKLIN), <<974.402039, -2147.449463, 49.164970>>, <<67.25, 64.5, 20.0>>)
AND UPDATE_SELECTOR_HUD(sSelectorPeds)) //Returns TRUE when the player has made a selection
OR HAS_LABEL_BEEN_TRIGGERED("DeathSwitch")
IF HAS_LABEL_BEEN_TRIGGERED("DeathSwitch")
MAKE_SELECTOR_PED_SELECTION(sSelectorPeds, SELECTOR_PED_MICHAEL)
SET_LABEL_AS_TRIGGERED("DeathSwitchOnce", TRUE)
ENDIF
VEHICLE_INDEX vehBringToHalt
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED(CHAR_FRANKLIN))
vehBringToHalt = GET_VEHICLE_PED_IS_IN(PLAYER_PED(CHAR_FRANKLIN))
ENDIF
IF DOES_ENTITY_EXIST(vehBringToHalt)
AND NOT IS_ENTITY_DEAD(vehBringToHalt)
BRING_VEHICLE_TO_HALT(vehBringToHalt, DEFAULT_VEH_STOPPING_DISTANCE, 1, TRUE)
ENDIF
bSwitchPedSelected = TRUE
ENDIF
ENDIF
ENDIF
IF bSwitchPedSelected = TRUE
IF IS_CELLPHONE_TRACKIFY_IN_USE()
bPhoneSwitch = IS_PHONE_ONSCREEN(TRUE)
ENDIF
//Stats
INFORM_MISSION_STATS_OF_INCREMENT(MIC2_TIMES_SWITCHED)
IF NOT bDoMikeToFranklinCustomSwitch
CLEAR_TEXT()
KILL_ANY_CONVERSATION()
ELSE
CLEAR_PRINTS()
SAFE_CLEAR_HELP(TRUE)
ENDIF
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN
bFranklinToMichael = TRUE
ENDIF
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
IF NOT HAS_LABEL_BEEN_TRIGGERED("RollingStartInit")
IF DOES_ENTITY_EXIST(vehFranklin)
AND NOT IS_ENTITY_DEAD(vehFranklin)
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED(CHAR_FRANKLIN)), <<-16.57771, -1445.89917, 29.64787>>) < 60.0
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED(CHAR_FRANKLIN), vehFranklin)
AND IS_VEHICLE_SEAT_FREE(vehFranklin)
SET_PED_INTO_VEHICLE(PLAYER_PED(CHAR_FRANKLIN), vehFranklin)
ENDIF
IF IS_PED_IN_VEHICLE(PLAYER_PED(CHAR_FRANKLIN), vehFranklin)
IF NOT IS_ENTITY_AT_COORD(vehFranklin, GET_POSITION_OF_VEHICLE_RECORDING_AT_TIME(001, GET_TOTAL_DURATION_OF_VEHICLE_RECORDING(001, "ALrollingstart"), "ALrollingstart"), <<5.0, 5.0, 5.0>>)
SET_VEHICLE_POSITION(vehFranklin, GET_POSITION_OF_VEHICLE_RECORDING_AT_TIME(001, GET_TOTAL_DURATION_OF_VEHICLE_RECORDING(001, "ALrollingstart"), "ALrollingstart"), GET_HEADING_FROM_VECTOR(GET_ROTATION_OF_VEHICLE_RECORDING_AT_TIME(001, GET_TOTAL_DURATION_OF_VEHICLE_RECORDING(001, "ALrollingstart"), "ALrollingstart")))
ENDIF
ENDIF
IF IS_PED_IN_VEHICLE(PLAYER_PED(CHAR_FRANKLIN), vehFranklin)
START_PLAYBACK_RECORDED_VEHICLE(vehFranklin, 001, "ALrollingstart") PRINTLN("START_PLAYBACK_RECORDED_VEHICLE(vehFranklin, 001, 'ALrollingstart')")
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehFranklin, GET_TOTAL_DURATION_OF_VEHICLE_RECORDING(001, "ALrollingstart") - 4000.0)
SET_PLAYBACK_SPEED(vehFranklin, 0.0)
SET_VEHICLE_ENGINE_ON(vehFranklin, TRUE, TRUE)
ENDIF
ENDIF
SET_LABEL_AS_TRIGGERED("RollingStartInit", TRUE)
ENDIF
ENDIF
bFranklinToMichael = FALSE
ENDIF
sCamDetails.pedTo = sSelectorPeds.pedID[sSelectorPeds.eNewSelectorPed]
sCamDetails.bRun = TRUE
ENDIF
ENDIF
IF sCamDetails.bRun
BOOL bSwapping = FALSE
IF HAS_LABEL_BEEN_TRIGGERED("MCH2_ABATTF")
AND IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED(CHAR_FRANKLIN), <<969.710876, -2070.853760, 28.733320>>, <<958.640198, -2220.841797, 39.551666>>, 100.0)
IF NOT HAS_LABEL_BEEN_TRIGGERED("AudioSwitched")
PLAY_AUDIO(MIC2_SWITCHED)
SET_LABEL_AS_TRIGGERED("AudioSwitched", TRUE)
ENDIF
IF bFranklinToMichael = TRUE
IF RUN_SWITCH_CAM_FROM_PLAYER_TO_PED(sCamDetails) //, 0, 0, SELECTOR_CAM_DEFAULT, 0)
bSwapping = TRUE
ENDIF
ELSE
IF RUN_SWITCH_CAM_FROM_PLAYER_TO_PED(sCamDetails) //Returns FALSE when the camera spline is complete
bSwapping = TRUE
ENDIF
ENDIF
// IF IS_SCREEN_FADED_IN()
// IF IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED_WITH_DELAY()
// IF IS_CAM_ACTIVE(sCamDetails.camID)
// DO_SCREEN_FADE_OUT(500)
// ENDIF
// ENDIF
// ENDIF
//
// IF IS_SCREEN_FADED_OUT()
// IF IS_GAMEPLAY_CAM_RENDERING()
// DO_SCREEN_FADE_IN(500)
// ELSE
// SET_CAM_SPLINE_PHASE(sCamDetails.camID, 1.0)
//
// SET_CAM_ACTIVE(sCamDetails.camID, FALSE)
//
// RENDER_SCRIPT_CAMS(FALSE, FALSE)
// SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
// ENDIF
// ENDIF
ELSE
IF NOT HAS_LABEL_BEEN_TRIGGERED("SwitchCamera")
IF bFranklinToMichael = FALSE
IF NOT DOES_CAM_EXIST(camSwitch)
IF DOES_ENTITY_EXIST(vehFranklin)
AND NOT IS_ENTITY_DEAD(vehFranklin)
AND IS_PED_IN_VEHICLE(PLAYER_PED(CHAR_FRANKLIN), vehFranklin)
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED(CHAR_FRANKLIN)), <<-16.57771, -1445.89917, 29.64787>>) < 60.0
IF NOT DOES_CAM_EXIST(camSwitch)
camSwitch = CREATE_CAM("DEFAULT_SCRIPTED_CAMERA", FALSE)
ENDIF
SET_CAM_PARAMS(camSwitch,
<<-108.298317, -1512.187012, 52.940929>>,
<<-89.499535, -0.000218, 142.212173>>,
45.0,
0)
ENDIF
ENDIF
SET_LABEL_AS_TRIGGERED("SwitchCamera", TRUE)
ENDIF
ENDIF
ENDIF
IF NOT bDoMikeToFranklinCustomSwitch
PRINTLN("bFranklinToMichael = ", bFranklinToMichael)
IF (bFranklinToMichael = TRUE
AND RUN_SWITCH_CAM_FROM_PLAYER_TO_PED_LONG_RANGE(sCamDetails, ENUM_TO_INT(SWITCH_FLAG_SKIP_OUTRO)))
bSwapping = TRUE PRINTLN("RUN_SWITCH_CAM_FROM_PLAYER_TO_PED_LONG_RANGE(sCamDetails, ENUM_TO_INT(SWITCH_FLAG_SKIP_OUTRO))")
ENDIF
IF bFranklinToMichael = FALSE
IF NOT HAS_LABEL_BEEN_TRIGGERED("RollingStartStop")
IF RUN_SWITCH_CAM_FROM_PLAYER_TO_CAM_LONG_RANGE(sCamDetails, camSwitch, ENUM_TO_INT(SWITCH_FLAG_SKIP_INTRO))
bSwapping = TRUE
PRINTLN("RUN_SWITCH_CAM_FROM_PLAYER_TO_CAM_LONG_RANGE(sCamDetails, camSwitch, ENUM_TO_INT(SWITCH_FLAG_SKIP_INTRO)) - bSwapping = TRUE")
ENDIF
ELSE
IF RUN_SWITCH_CAM_FROM_PLAYER_TO_PED_LONG_RANGE(sCamDetails, ENUM_TO_INT(SWITCH_FLAG_SKIP_INTRO))
bSwapping = TRUE
PRINTLN("(RUN_SWITCH_CAM_FROM_PLAYER_TO_PED_LONG_RANGE(sCamDetails, ENUM_TO_INT(SWITCH_FLAG_SKIP_INTRO) - bSwapping = TRUE")
ENDIF
ENDIF
ENDIF
ELSE
IF HAS_SELECTOR_PED_BEEN_SELECTED(sSelectorPeds, SELECTOR_PED_FRANKLIN)
bMikeToFranklinSwitchTriggered = TRUE
ENDIF
IF bMikeToFranklinSwitchTriggered
IF DOES_ENTITY_EXIST(vehFranklin) AND IS_VEHICLE_DRIVEABLE(vehFranklin)
SET_FORCE_HD_VEHICLE(vehFranklin, TRUE)
ENDIF
IF HAS_LABEL_BEEN_TRIGGERED("RollingStartStop")
OR (DOES_ENTITY_EXIST(vehFranklin) AND IS_VEHICLE_DRIVEABLE(vehFranklin) AND IS_VEHICLE_HIGH_DETAIL(vehFranklin)) PRINTLN("IS_VEHICLE_HIGH_DETAIL(vehFranklin) = TRUE")
IF HANDLE_SWITCH_CAM_MICHAEL_TO_FRANKLIN(scsSwitchCam_MichaelToFranklin)
bSwapping = FALSE
bMikeToFranklinSwitchTriggered = FALSE
bDoMikeToFranklinCustomSwitch = FALSE
ELSE
IF bMikeToFrank_SwitchToFrank
IF NOT bMikeToFrank_SwitchedToFrank
SET_ENTITY_LOAD_COLLISION_FLAG(PLAYER_PED(CHAR_FRANKLIN), FALSE)
CLEAR_FOCUS()
REMOVE_NAVMESH_REQUIRED_REGIONS()
IF TAKE_CONTROL_OF_SELECTOR_PED(sSelectorPeds, TRUE, TRUE) //, TCF_CLEAR_TASK_INTERRUPT_CHECKS)
INT i
REPEAT COUNT_OF(sEnemyIntroCut) i
SAFE_DELETE_PED(sEnemyIntroCut[i].pedIndex)
ENDREPEAT
bMikeToFrank_SwitchedToFrank = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF bSwapping = TRUE
IF sCamDetails.bOKToSwitchPed
IF NOT sCamDetails.bPedSwitched
TAKE_CONTROL_OF_PED_FLAGS eTakeControlFlags = TCF_NONE
IF bFranklinToMichael
eTakeControlFlags = TCF_CLEAR_TASK_INTERRUPT_CHECKS
ENDIF
IF TAKE_CONTROL_OF_SELECTOR_PED(sSelectorPeds, TRUE, TRUE, eTakeControlFlags) #IF IS_DEBUG_BUILD PRINTLN("Michael 2 - TAKE_CONTROL_OF_SELECTOR_PED") #ENDIF
//Create or delete intro enemies
IF eMissionObjective = stageFindMichael
IF bFranklinToMichael = FALSE
INT i
REPEAT COUNT_OF(sEnemyIntroCut) i
SAFE_DELETE_PED(sEnemyIntroCut[i].pedIndex)
ENDREPEAT
ELSE
//Enemy Intro (Inside)
createEnemy(sEnemyIntroCut[0], <<996.9860, -2185.0713, 28.9775>>, 9.6956, WEAPONTYPE_SMG, G_M_M_CHIGOON_01) //Original Position: <<991.6176, -2171.4707, 29.2246>>, 270.7684
SET_PED_DEFAULT_COMPONENT_VARIATION(sEnemyIntroCut[0].pedIndex)
SET_MODEL_AS_NO_LONGER_NEEDED(CSB_CHIN_GOON)
createEnemy(sEnemyIntroCut[1], <<992.2509, -2175.3486 -0.4, 28.9769>>, 242.3, WEAPONTYPE_PISTOL, G_M_M_CHIGOON_01)
createEnemy(sEnemyIntroCut[2], <<988.6379, -2170.6748, 29.2006>>, 352.4113, WEAPONTYPE_PISTOL)
createEnemy(sEnemyIntroCut[3], <<977.6, -2166.4, 30.4104 + 0.25>>, 70.2, WEAPONTYPE_UNARMED)
createEnemy(sEnemyIntroCut[4], <<970.7029, -2169.6233, 28.4637>>, 170.9878, WEAPONTYPE_UNARMED, G_M_M_CHIGOON_01)
createEnemy(sEnemyIntroCut[5], <<977.9589, -2156.2410, 30.0791>>, 125.1269, WEAPONTYPE_UNARMED, G_M_M_CHIGOON_01)
createEnemy(sEnemyIntroCut[6], <<984.0753, -2158.3696, 30.0793>>, 219.8727, WEAPONTYPE_PISTOL)
createEnemy(sEnemyIntroCut[7], <<997.6616, -2157.8818, 28.4766>>, 265.7728, WEAPONTYPE_MICROSMG, G_M_M_CHIGOON_01)
createEnemy(sEnemyIntroCut[8], <<999.5024, -2145.7878, 28.4765>>, 275.3511, WEAPONTYPE_SMG) //Patrol: <<969.6483, -2160.4150, 28.4750>>, 178.3322
createEnemy(sEnemyIntroCut[9], <<969.2003, -2164.1885, 28.4756>>, 187.7889, WEAPONTYPE_SMG, G_M_M_CHIGOON_01) //Patrol: <<997.3615, -2168.5959, 28.4752>>, 358.6634
INT i
REPEAT COUNT_OF(sEnemyIntroCut) i
IF DOES_ENTITY_EXIST(sEnemyIntroCut[i].pedIndex)
//RETAIN_ENTITY_IN_INTERIOR(sEnemyIntroCut[i].pedIndex, intAbattoir)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sEnemyIntroCut[i].pedIndex, TRUE)
ENDIF
ENDREPEAT
#IF IS_DEBUG_BUILD
REPEAT COUNT_OF(sEnemyIntroCut) i
IF NOT IS_PED_INJURED(sEnemyIntroCut[i].pedIndex)
ASSIGN_DEBUG_NAMES(sEnemyIntroCut[i].pedIndex, "IntroCut ", i)
sEnemyIntroCut[i].sDebugName = CONCATENATE_STRINGS("IntroCut ", GET_STRING_FROM_INT(i))
ENDIF
ENDREPEAT
#ENDIF
ENDIF
ENDIF
RENDER_SCRIPT_CAMS(FALSE, FALSE)
IF DOES_CAM_EXIST(camSwitch)
DESTROY_CAM(camSwitch)
ENDIF
SET_PED_TARGET_LOSS_RESPONSE(PLAYER_PED(CHAR_MICHAEL), TLR_NEVER_LOSE_TARGET)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(PLAYER_PED(CHAR_MICHAEL), TRUE)
//[MF] Fix for Michael being invisible when we switch to him.
// IF eMissionObjective = stageFindMichael
// IF PLAYER_PED_ID() = PLAYER_PED(CHAR_MICHAEL)
// WHILE NOT IS_INTERIOR_READY(intAbattoir)
// PRINTLN("Loading Interior....")
// WAIT(0)
// ENDWHILE
// FORCE_ROOM_FOR_ENTITY(PLAYER_PED(CHAR_MICHAEL), intAbattoir, GET_ROOM_KEY_FROM_ENTITY(objHook))
// ENDIF
// ENDIF
IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[CHAR_MICHAEL])
SET_PED_RELATIONSHIP_GROUP_HASH(sSelectorPeds.pedID[CHAR_MICHAEL], relGroupFriendlyFire)
ENDIF
IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[CHAR_FRANKLIN])
SET_PED_RELATIONSHIP_GROUP_HASH(sSelectorPeds.pedID[CHAR_FRANKLIN], relGroupBuddy)
ENDIF
REMOVE_PED_FOR_DIALOGUE(sPedsForConversation, 0)
REMOVE_PED_FOR_DIALOGUE(sPedsForConversation, 1)
IF eMissionObjective = stageFindMichael
ADD_PED_FOR_DIALOGUE(sPedsForConversation, 0, NULL, "MICHAEL")
ELSE
ADD_PED_FOR_DIALOGUE(sPedsForConversation, 0, PLAYER_PED(CHAR_MICHAEL), "MICHAEL")
ENDIF
ADD_PED_FOR_DIALOGUE(sPedsForConversation, 1, PLAYER_PED(CHAR_FRANKLIN), "FRANKLIN")
//Interior
IF intAbattoir = NULL
intAbattoir = GET_INTERIOR_AT_COORDS_WITH_TYPE(vPlayerStart, "v_abattoir")
ENDIF
RETAIN_ENTITY_IN_INTERIOR(PLAYER_PED(CHAR_MICHAEL), intAbattoir)
sCamDetails.bPedSwitched = TRUE
ENDIF
ELSE
SET_GAMEPLAY_CAM_FOLLOW_PED_THIS_UPDATE(sCamDetails.pedTo)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
FUNC BOOL SHOULD_RAIL_STOP_MOVING(INT iNextNodeToMoveTo)
//Stop moving the rail if we've reached the maximum number of nodes,
//if the next node hasn't been defined (i.e. it's position is at the origin),
//or if the next node is a pre-determined stop point (iRailNodeToStopAt)
RETURN((iNextNodeToMoveTo = iTotalRailNodes)
OR (iNextNodeToMoveTo = iRailNodeToStopAt)
OR (ARE_VECTORS_EQUAL(sRailNodes[iNextNodeToMoveTo].vPos, VECTOR_ZERO)))
ENDFUNC
///PURPOSE: Controls moving the ped dangling from the hook along the rail. This version uses the new DANGLE_FROM_MEATHOOK behaviour to update the position on the rail
FUNC BOOL MOVE_PED_ALONG_RAIL()
VECTOR vHookCurLoc
VECTOR vHookToNextNode
VECTOR vPotentialNextPos
INT iNextNodeIndex = iCurrentNode + 1
IF NOT DOES_ENTITY_EXIST(objHook)
SCRIPT_ASSERT("Hook doesn't exist!")
RETURN TRUE
ENDIF
IF IS_ENTITY_DEAD(PLAYER_PED(CHAR_MICHAEL))
SCRIPT_ASSERT("Rail ped is dead!")
ENDIF
IF bRailInit = FALSE
iCurrentNode = 0
vRailCurrent = sRailNodes[0].vPos
iNextNodeIndex = iCurrentNode + 1
PRINTLN("Initialised Rail Node Variables...")
bRailInit = TRUE
ENDIF
IF IS_ENTITY_WAITING_FOR_WORLD_COLLISION(objHook)
PRINTLN("objHook WAITING FOR COLLISION...")
ENDIF
#IF IS_DEBUG_BUILD
IF bDebugMichaelDeathSkip
SET_RAIL_FINAL_NODE(40)
iCurrentNode = 33
vRailCurrent = sRailNodes[33].vPos
SET_ENTITY_COORDS_NO_OFFSET(objHook, vRailCurrent)
SET_ENTITY_ROTATION(objHook, sRailNodes[33].vRot)
iCutsceneStage = 22
SETTIMERA(13000 * 2)
bDebugMichaelDeathSkip = FALSE
ENDIF
IF bDebugMichaelSkipToStart
SET_RAIL_FINAL_NODE(40)
iCurrentNode = 0
vRailCurrent = sRailNodes[0].vPos
SET_ENTITY_COORDS_NO_OFFSET(objHook, vRailCurrent)
SET_ENTITY_ROTATION(objHook, sRailNodes[0].vRot)
iCutsceneStage = 2
SETTIMERA(0)
bDebugMichaelSkipToStart = FALSE
ENDIF
IF bDebugMichaelSkipToCapture
SET_RAIL_FINAL_NODE(40)
iCurrentNode = iCaptureNode
vRailCurrent = vCaptureCurrent
SET_ENTITY_COORDS_NO_OFFSET(objHook, vRailCurrent)
SET_ENTITY_ROTATION(objHook, vRailCurrentRot)
iCutsceneStage = iCaptureStage
SETTIMERA(iCaptureTimer)
bDebugMichaelSkipToCapture = FALSE
ENDIF
IF bDebugMichaelCapturePoint
iCaptureNode = iCurrentNode
vCaptureCurrent = vRailCurrent
vRailCurrentRot = GET_ENTITY_ROTATION(objHook)
iCaptureStage = iCutsceneStage
iCaptureTimer = TIMERA()
bDebugMichaelCapturePoint = FALSE
ENDIF
IF bDebugMichaelPausePlay
IF fMoveSpeedMult <> 0.225
fMoveSpeedMult = 0.225
iDebugMichaelDebugTime = -1
ELSE
fMoveSpeedMult = 0.0
iDebugMichaelDebugTime = TIMERA()
ENDIF
bDebugMichaelPausePlay = FALSE
ENDIF
IF iDebugMichaelDebugTime <> -1
SETTIMERA(iDebugMichaelDebugTime)
ENDIF
IF bDebugMichaelDebugTime
TEXT_LABEL txtLabel
txtLabel = "Time: "
txtLabel += TIMERA()
SET_TEXT_SCALE(0.5, 0.5)
SET_TEXT_CENTRE(TRUE)
IF fMoveSpeedMult <> 0.225
SET_TEXT_COLOUR(255, 0, 0, 255)
ELSE
SET_TEXT_COLOUR(255, 255, 0, 255)
ENDIF
DISPLAY_TEXT(0.1, 0.9, txtLabel)
txtLabel = "Stage: "
txtLabel += iCutsceneStage
SET_TEXT_SCALE(0.5, 0.5)
SET_TEXT_CENTRE(TRUE)
IF fMoveSpeedMult <> 0.225
SET_TEXT_COLOUR(255, 0, 0, 255)
ELSE
SET_TEXT_COLOUR(255, 255, 0, 255)
ENDIF
DISPLAY_TEXT(0.1, 0.925, txtLabel)
ENDIF
CAMERA_INDEX camDebugCurrent = GET_DEBUG_CAM()
IF NOT DOES_CAM_EXIST(camDebug)
camDebug = CREATE_CAMERA(CAMTYPE_SCRIPTED)
ENDIF
IF bDebugMichaelSetDebugCam
SET_CAM_COORD(camDebugCurrent, GET_CAM_COORD(camDebug))
SET_CAM_ROT(camDebugCurrent, GET_CAM_ROT(camDebug))
SET_CAM_FOV(camDebugCurrent, GET_CAM_FOV(camDebug))
bDebugMichaelSetDebugCam = FALSE
ENDIF
IF bDebugMichaelCaptureDebugCam
SET_CAM_COORD(camDebug, GET_CAM_COORD(camDebugCurrent))
SET_CAM_ROT(camDebug, GET_CAM_ROT(camDebugCurrent))
SET_CAM_FOV(camDebug, GET_CAM_FOV(camDebugCurrent))
bDebugMichaelCaptureDebugCam = FALSE
ENDIF
IF iDebugMichaelHandCamLast <> iDebugMichaelHandCam
IF iDebugMichaelHandCam = 0 //NONE
IF IS_CAM_SHAKING(camDebugCurrent)
STOP_CAM_SHAKING(camDebugCurrent, TRUE)
ENDIF
ELIF iDebugMichaelHandCam = 1 //"light"
IF HAS_ANIM_DICT_LOADED("shake_cam_all@")
ANIMATED_SHAKE_CAM(camDebugCurrent, "shake_cam_all@", "light", "", fDebugMichaelHandCam)
ENDIF
ELIF iDebugMichaelHandCam = 2 //"medium"
IF HAS_ANIM_DICT_LOADED("shake_cam_all@")
ANIMATED_SHAKE_CAM(camDebugCurrent, "shake_cam_all@", "medium", "", fDebugMichaelHandCam)
ENDIF
ELIF iDebugMichaelHandCam = 3 //"heavy"
IF HAS_ANIM_DICT_LOADED("shake_cam_all@")
ANIMATED_SHAKE_CAM(camDebugCurrent, "shake_cam_all@", "heavy", "", fDebugMichaelHandCam)
ENDIF
ENDIF
iDebugMichaelHandCamLast = iDebugMichaelHandCam
ENDIF
#ENDIF
vHookCurloc = vRailCurrent
IF NOT SHOULD_RAIL_STOP_MOVING(iNextNodeIndex)
AND fMoveSpeedMult <> 0.0
vHookToNextNode = sRailNodes[iNextNodeIndex].vPos - vHookCurLoc
vPotentialNextPos = vHookCurLoc +((GET_FRAME_TIME() * NORMALISE_VECTOR(vHookToNextNode) * fMoveSpeedMult))
vRailCurrent = vPotentialNextPos
SET_ENTITY_COORDS_NO_OFFSET(objHook, vRailCurrent)
IF GET_DISTANCE_BETWEEN_COORDS(vPotentialNextPos, sRailNodes[iNextNodeIndex].vPos)
< GET_DISTANCE_BETWEEN_COORDS(vHookCurloc, sRailNodes[iNextNodeIndex].vPos)
// IF GET_ENABLE_BOUND_ANKLES(PLAYER_PED(CHAR_MICHAEL))
// vRailCurrent = vPotentialNextPos
// FREEZE_ENTITY_POSITION(objHook, FALSE)
// DANGLE_FROM_MEATHOOK(FALSE, PLAYER_PED(CHAR_MICHAEL), objHook, vRailCurrent + vHookPosOffset, FALSE, 0.0, 1000, 60000, bFixedRotation, -0.3, -0.3, -0.3, 0.3, 0.3, 0.3) //#IF IS_DEBUG_BUILD PRINTLN("DANGLE_FROM_MEATHOOK REF1") #ENDIF
//// PRINTLN("Hook should be at: <<", vRailCurrent.X, ", ", vRailCurrent.Y, ", ", vRailCurrent.Z, ">>")
// ELSE
// SET_ENABLE_BOUND_ANKLES(PLAYER_PED(CHAR_MICHAEL), TRUE)
// PRINTLN("Bind those ankles!")
// ENDIF
ELSE
PRINTLN("iCurrentNode(", iCurrentNode, ") = iNextNodeIndex(", iNextNodeIndex, ")")
iCurrentNode = iNextNodeIndex
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
INT iLastAnim = 2 //Michael_meat_hook_react_c
///PURPOSE: Deals with moving the rail, and making sure the ragdoll behaviour doesn't timeout
PROC UPDATE_RAIL_MOVE()
IF bOkToMoveRail
MOVE_PED_ALONG_RAIL()
IF sfxRail = -1
sfxRail = GET_SOUND_ID()
PLAY_SOUND_FROM_ENTITY(sfxRail, "RAIL_LOOP", objHook, "MICHAEL_2_SOUNDS")
ENDIF
ELSE
IF sfxRail != -1
STOP_SOUND(sfxRail)
RELEASE_SOUND_ID(sfxRail)
sfxRail = -1
ENDIF
ENDIF
IF bOkToHangFromHook
//Reattach
IF DOES_ENTITY_EXIST(objHook)
IF GET_SCRIPT_TASK_STATUS(PLAYER_PED_ID(), SCRIPT_TASK_AIM_GUN_SCRIPTED) != WAITING_TO_START_TASK
AND GET_SCRIPT_TASK_STATUS(PLAYER_PED_ID(), SCRIPT_TASK_AIM_GUN_SCRIPTED) != PERFORMING_TASK
IF NOT IS_ENTITY_ATTACHED(PLAYER_PED(CHAR_MICHAEL))
ATTACH_ENTITY_TO_ENTITY(PLAYER_PED(CHAR_MICHAEL), objHook, 0, vMichaelAttachOffset, <<0.0, 0.0, 180.0>>, TRUE, TRUE)
ELSE
IF HAS_ENTITY_ANIM_FINISHED(PLAYER_PED(CHAR_MICHAEL), sAnimDictMic2Hook, "michael_meat_hook_react_a")
OR HAS_ENTITY_ANIM_FINISHED(PLAYER_PED(CHAR_MICHAEL), sAnimDictMic2Hook, "michael_meat_hook_react_b")
OR HAS_ENTITY_ANIM_FINISHED(PLAYER_PED(CHAR_MICHAEL), sAnimDictMic2Hook, "michael_meat_hook_react_c")
OR HAS_ENTITY_ANIM_FINISHED(PLAYER_PED(CHAR_MICHAEL), sAnimDictMic2Hook, "michael_meat_hook_react_d")
OR (IS_ENTITY_PLAYING_ANIM(PLAYER_PED(CHAR_MICHAEL), sAnimDictMic2Hook, "michael_meat_hook_react_a")
AND GET_ENTITY_ANIM_CURRENT_TIME(PLAYER_PED(CHAR_MICHAEL), sAnimDictMic2Hook, "michael_meat_hook_react_a") > 0.675)
OR (IS_ENTITY_PLAYING_ANIM(PLAYER_PED(CHAR_MICHAEL), sAnimDictMic2Hook, "michael_meat_hook_react_b")
AND GET_ENTITY_ANIM_CURRENT_TIME(PLAYER_PED(CHAR_MICHAEL), sAnimDictMic2Hook, "michael_meat_hook_react_b") > 0.8)
OR (IS_ENTITY_PLAYING_ANIM(PLAYER_PED(CHAR_MICHAEL), sAnimDictMic2Hook, "michael_meat_hook_react_c")
AND GET_ENTITY_ANIM_CURRENT_TIME(PLAYER_PED(CHAR_MICHAEL), sAnimDictMic2Hook, "michael_meat_hook_react_c") > 0.685)
OR (IS_ENTITY_PLAYING_ANIM(PLAYER_PED(CHAR_MICHAEL), sAnimDictMic2Hook, "michael_meat_hook_react_d")
AND GET_ENTITY_ANIM_CURRENT_TIME(PLAYER_PED(CHAR_MICHAEL), sAnimDictMic2Hook, "michael_meat_hook_react_d") > 0.675)
INT iRand
iRand = GET_RANDOM_INT_IN_RANGE(0, 4)
IF iRand = iLastAnim
iRand = GET_RANDOM_INT_IN_RANGE(0, 4)
ENDIF
IF iRand = iLastAnim
iRand = GET_RANDOM_INT_IN_RANGE(0, 4)
ENDIF
IF iRand = 0
TASK_PLAY_ANIM(PLAYER_PED(CHAR_MICHAEL), sAnimDictMic2Hook, "michael_meat_hook_react_a", REALLY_SLOW_BLEND_IN, REALLY_SLOW_BLEND_OUT, -1, AF_HOLD_LAST_FRAME | AF_NOT_INTERRUPTABLE, 0.025)
ELIF iRand = 1
TASK_PLAY_ANIM(PLAYER_PED(CHAR_MICHAEL), sAnimDictMic2Hook, "michael_meat_hook_react_b", REALLY_SLOW_BLEND_IN, REALLY_SLOW_BLEND_OUT, -1, AF_HOLD_LAST_FRAME | AF_NOT_INTERRUPTABLE, 0.1)
ELIF iRand = 2
TASK_PLAY_ANIM(PLAYER_PED(CHAR_MICHAEL), sAnimDictMic2Hook, "michael_meat_hook_react_c", REALLY_SLOW_BLEND_IN, REALLY_SLOW_BLEND_OUT, -1, AF_HOLD_LAST_FRAME | AF_NOT_INTERRUPTABLE, 0.030)
ELIF iRand = 3
TASK_PLAY_ANIM(PLAYER_PED(CHAR_MICHAEL), sAnimDictMic2Hook, "michael_meat_hook_react_d", REALLY_SLOW_BLEND_IN, REALLY_SLOW_BLEND_OUT, -1, AF_HOLD_LAST_FRAME | AF_NOT_INTERRUPTABLE, 0.15)
ENDIF
iLastAnim = iRand
ENDIF
ENDIF
ENDIF
// IF NOT IS_ENTITY_ATTACHED_TO_ENTITY(PLAYER_PED(CHAR_MICHAEL), objHook)
// OR GET_DISTANCE_BETWEEN_COORDS(GET_PED_BONE_COORDS(PLAYER_PED(CHAR_MICHAEL), BONETAG_L_FOOT, VECTOR_ZERO), GET_ENTITY_COORDS(objHook)) > 1.0
// OR GET_DISTANCE_BETWEEN_COORDS(GET_PED_BONE_COORDS(PLAYER_PED(CHAR_MICHAEL), BONETAG_R_FOOT, VECTOR_ZERO), GET_ENTITY_COORDS(objHook)) > 1.0
// #IF IS_DEBUG_BUILD
// PRINTLN("Left Foot Dist: ", GET_DISTANCE_BETWEEN_COORDS(GET_PED_BONE_COORDS(PLAYER_PED(CHAR_MICHAEL), BONETAG_L_FOOT, VECTOR_ZERO), GET_ENTITY_COORDS(objHook)), " Right Foot Dist: ", GET_DISTANCE_BETWEEN_COORDS(GET_PED_BONE_COORDS(PLAYER_PED(CHAR_MICHAEL), BONETAG_R_FOOT, VECTOR_ZERO), GET_ENTITY_COORDS(objHook)))
// #ENDIF
//
// IF IS_VECTOR_ZERO(vRailCurrent)
// vRailCurrent = sRailNodes[0].vPos
// ENDIF
//
// SAFE_DELETE_OBJECT(objHook)
// objHook = CREATE_OBJECT_NO_OFFSET(PROP_LD_HOOK, vRailCurrent)
//
// SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(objHook, FALSE)
// RETAIN_ENTITY_IN_INTERIOR(objHook, intAbattoir)
//
// WHILE NOT DOES_ENTITY_HAVE_PHYSICS(objHook)
// OR NOT HAS_COLLISION_FOR_MODEL_LOADED(PROP_LD_HOOK)
// WAIT_WITH_DEATH_CHECKS(0)
// ENDWHILE
//
// SET_OBJECT_PHYSICS_PARAMS(objHook, fHookMass, -1.0, <<-1.0, -1.0, -1.0>>, <<-1.0, -1.0, -1.0>>)
// SET_ENTITY_DYNAMIC(objHook, TRUE)
//
// SET_ENTITY_COORDS_NO_OFFSET(objHook, vRailCurrent)
// SET_ENTITY_ROTATION(objHook, sRailNodes[iCurrentNode].vRot)
// FREEZE_ENTITY_POSITION(objHook, TRUE)
//
// //Attach Michael to hook
// ATTACH_ENTITY_TO_ENTITY(PLAYER_PED(CHAR_MICHAEL), objHook, 0, vMichaelAttachOffset, <<0.0, 0.0, 180.0>>, TRUE, TRUE)
//
// WHILE NOT IS_ENTITY_ATTACHED(PLAYER_PED(CHAR_MICHAEL))
// WAIT_WITH_DEATH_CHECKS(0)
// ENDWHILE
//
// TASK_PLAY_ANIM(PLAYER_PED(CHAR_MICHAEL), sAnimDictMic2Hook, "michael_meat_hook_idle", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1, AF_LOOPING) //TASK_PLAY_ANIM(PLAYER_PED(CHAR_MICHAEL), sAnimDictHang, "idle", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1, AF_LOOPING)
// //FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED(CHAR_MICHAEL))
//
// iReattach = 0
//
// bReattach = TRUE
// ENDIF
//
// IF bReattach = TRUE
// SET_ENTITY_COORDS_NO_OFFSET(objHook, vRailCurrent)
// SET_ENTITY_ROTATION(objHook, sRailNodes[iCurrentNode].vRot)
//
// ATTACH_ENTITY_TO_ENTITY(PLAYER_PED(CHAR_MICHAEL), objHook, 0, vMichaelAttachOffset, <<0.0, 0.0, 180.0>>, TRUE, TRUE)
//
// IF IS_ENTITY_PLAYING_ANIM(PLAYER_PED(CHAR_MICHAEL), sAnimDictMic2Hook, "michael_meat_hook_idle") //IF IS_ENTITY_PLAYING_ANIM(PLAYER_PED(CHAR_MICHAEL), sAnimDictHang, "idle")
// IF iReattach = 0
// #IF IS_DEBUG_BUILD
// PRINTLN("1 second to reattach...")
// #ENDIF
//
// iReattach = GET_GAME_TIMER() + 1000
// ENDIF
// ENDIF
//
// IF iReattach > 0 AND GET_GAME_TIMER() > iReattach
// AND IS_ENTITY_PLAYING_ANIM(PLAYER_PED(CHAR_MICHAEL), sAnimDictMic2Hook, "michael_meat_hook_idle") //AND IS_ENTITY_PLAYING_ANIM(PLAYER_PED(CHAR_MICHAEL), sAnimDictHang, "idle")
// AND NOT IS_ENTITY_WAITING_FOR_WORLD_COLLISION(PLAYER_PED(CHAR_MICHAEL))
// IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(PLAYER_PED(CHAR_MICHAEL))) < 10.0
// OR (IS_ENTITY_ON_SCREEN(PLAYER_PED(CHAR_MICHAEL)) AND NOT IS_ENTITY_OCCLUDED(PLAYER_PED(CHAR_MICHAEL)))
// FREEZE_ENTITY_POSITION(objHook, FALSE)
//
// DETACH_ENTITY(PLAYER_PED(CHAR_MICHAEL))
// DANGLE_FROM_MEATHOOK(TRUE, PLAYER_PED(CHAR_MICHAEL), objHook, vRailCurrent, FALSE, 0.0, 1000, 60000, bFixedRotation, -0.3, -0.3, -0.3, 0.3, 0.3, 0.3) //#IF IS_DEBUG_BUILD PRINTLN("DANGLE_FROM_MEATHOOK REF2") #ENDIF
// STOP_ANIM_TASK(PLAYER_PED(CHAR_MICHAEL), sAnimDictMic2Hook, "michael_meat_hook_idle", INSTANT_BLEND_OUT) //STOP_ANIM_TASK(PLAYER_PED(CHAR_MICHAEL), sAnimDictHang, "idle", INSTANT_BLEND_OUT)
//
// //Add ankle cuffs
// SET_ENABLE_BOUND_ANKLES(PLAYER_PED(CHAR_MICHAEL), TRUE)
//
// //Pin the ankle to the bottom of the hook
// VECTOR vLeftFootAttach
// vLeftFootAttach = <<-0.075, -0.1, -0.85>>
// ATTACH_ENTITY_TO_ENTITY_PHYSICALLY(PLAYER_PED(CHAR_MICHAEL), objHook, GET_PED_BONE_INDEX(PLAYER_PED(CHAR_MICHAEL), BONETAG_L_FOOT), -1, vLeftFootAttach, VECTOR_ZERO, VECTOR_ZERO, -1.0, TRUE, FALSE, FALSE, FALSE)
// ATTACH_ENTITY_TO_ENTITY_PHYSICALLY(PLAYER_PED(CHAR_MICHAEL), objHook, GET_PED_BONE_INDEX(PLAYER_PED(CHAR_MICHAEL), BONETAG_R_FOOT), -1, <<-vLeftFootAttach.X, vLeftFootAttach.Y, vLeftFootAttach.Z>>, VECTOR_ZERO, VECTOR_ZERO, -1.0, TRUE, FALSE, FALSE, FALSE)
//
// #IF IS_DEBUG_BUILD
// PRINTLN("Reattached!")
// #ENDIF
//
// bReattach = FALSE
// iReattach = 0
// ENDIF
// ENDIF
// ENDIF
//
// IF NOT IS_PED_INJURED(PLAYER_PED(CHAR_MICHAEL))
// IF IS_PED_RAGDOLL(PLAYER_PED(CHAR_MICHAEL))
// IF IS_PED_RUNNING_RAGDOLL_TASK(PLAYER_PED(CHAR_MICHAEL))
// RESET_PED_RAGDOLL_TIMER(PLAYER_PED(CHAR_MICHAEL)) //#IF IS_DEBUG_BUILD PRINTLN("RESET_PED_RAGDOLL_TIMER") #ENDIF
// ENDIF
// ENDIF
// ENDIF
// IF bShootingUpsideDown
// SET_ENTITY_COORDS_NO_OFFSET(objHook, vRailCurrent)
// VECTOR vFinalCam = GET_FINAL_RENDERED_CAM_ROT()
// SET_ENTITY_ROTATION(objHook, <<sRailNodes[0].vRot.X, sRailNodes[0].vRot.Y, vFinalCam.Z>>)
//
// ATTACH_ENTITY_TO_ENTITY(PLAYER_PED(CHAR_MICHAEL), objHook, 0, <<-0.025, -0.05, -1.68>>, <<0.0, 0.0, 180.0>>)
// ENDIF
ENDIF
ENDIF
ENDPROC
//#IF IS_DEBUG_BUILD
//
//CONST_INT iDebugWindow 10
//
//STRUCT DEBUG_WINDOW
// BOOL bActive
// FLOAT xPos
// FLOAT yPos
// FLOAT fWidth
// FLOAT fHeight
// STRING sTitle = NULL
// BOOL bCenterOrigin = FALSE
// BOOL bMaxBox = TRUE
// BOOL bMinBox = TRUE
// BOOL bCloseBox = TRUE
// BOOL bSimple = FALSE
// BOOL bGradient = TRUE
// VECTOR vColourTopLeft
// VECTOR vColourTopRight
// VECTOR vColourBottomLeft
// VECTOR vColourBottomRight
//ENDSTRUCT
//
//DEBUG_WINDOW sDebugWindow[iDebugWindow]
//
//PROC DRAW_DEBUG_WINDOW()
// SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE)
//
// INT i
//
// REPEAT COUNT_OF(sDebugWindow) i
// IF sDebugWindow[i].bActive = TRUE
// IF sDebugWindow[i].bSimple = FALSE
// VECTOR vOrigin
//
// IF sDebugWindow[i].bCenterOrigin = FALSE
// vOrigin = <<sDebugWindow[i].xPos, sDebugWindow[i].yPos, 0.0>>
// ELSE
// vOrigin = <<sDebugWindow[i].xPos - (sDebugWindow[i].fWidth / 2), sDebugWindow[i].yPos - (sDebugWindow[i].fHeight / 2), 0.0>>
// ENDIF
//
// DRAW_DEBUG_POLY_2D_WITH_THREE_COLOURS(vOrigin, //Top Left
// vOrigin + <<sDebugWindow[i].fWidth, 0.0, 0.0>>, //Top Right
// vOrigin + <<0.0, sDebugWindow[i].fHeight, 0.0>>, //Bottom Left
// ROUND(sDebugWindow[i].vColourTopLeft.X), ROUND(sDebugWindow[i].vColourTopLeft.Y), ROUND(sDebugWindow[i].vColourTopLeft.Z), //Top Left Colour
// ROUND(sDebugWindow[i].vColourTopRight.X), ROUND(sDebugWindow[i].vColourTopRight.Y), ROUND(sDebugWindow[i].vColourTopRight.Z), //Top Right Colour
// ROUND(sDebugWindow[i].vColourBottomLeft.X), ROUND(sDebugWindow[i].vColourBottomLeft.Y), ROUND(sDebugWindow[i].vColourBottomLeft.Z)) //Bottom Left Colour
//
// DRAW_DEBUG_POLY_2D_WITH_THREE_COLOURS(vOrigin + <<0.0, sDebugWindow[i].fHeight, 0.0>>, //Bottom Left
// vOrigin + <<sDebugWindow[i].fWidth, 0.0, 0.0>>, //Top Right
// vOrigin + <<sDebugWindow[i].fWidth, sDebugWindow[i].fHeight, 0.0>>, //Bottom Right
// ROUND(sDebugWindow[i].vColourBottomLeft.X), ROUND(sDebugWindow[i].vColourBottomLeft.Y), ROUND(sDebugWindow[i].vColourBottomLeft.Z), //Top Left Colour
// ROUND(sDebugWindow[i].vColourTopRight.X), ROUND(sDebugWindow[i].vColourTopRight.Y), ROUND(sDebugWindow[i].vColourTopRight.Z), //Top Right Colour
// ROUND(sDebugWindow[i].vColourBottomRight.X), ROUND(sDebugWindow[i].vColourBottomRight.Y), ROUND(sDebugWindow[i].vColourBottomRight.Z)) //Bottom Left Colour
// ELSE
// VECTOR vOrigin
//
// IF sDebugWindow[i].bCenterOrigin = FALSE
// vOrigin = <<sDebugWindow[i].xPos, sDebugWindow[i].yPos, 0.0>>
// ELSE
// vOrigin = <<sDebugWindow[i].xPos - (sDebugWindow[i].fWidth / 2), sDebugWindow[i].yPos - (sDebugWindow[i].fHeight / 2), 0.0>>
// ENDIF
//
// DRAW_DEBUG_POLY_2D_WITH_THREE_COLOURS(vOrigin, //Top Left
// vOrigin + <<sDebugWindow[i].fWidth, 0.0, 0.0>>, //Top Right
// vOrigin + <<0.0, sDebugWindow[i].fHeight, 0.0>>, //Bottom Left
// ROUND(sDebugWindow[i].vColourTopLeft.X), ROUND(sDebugWindow[i].vColourTopLeft.Y), ROUND(sDebugWindow[i].vColourTopLeft.Z), //Top Left Colour
// ROUND(sDebugWindow[i].vColourTopRight.X), ROUND(sDebugWindow[i].vColourTopRight.Y), ROUND(sDebugWindow[i].vColourTopRight.Z), //Top Right Colour
// ROUND(sDebugWindow[i].vColourBottomLeft.X), ROUND(sDebugWindow[i].vColourBottomLeft.Y), ROUND(sDebugWindow[i].vColourBottomLeft.Z)) //Bottom Left Colour
//
// DRAW_DEBUG_POLY_2D_WITH_THREE_COLOURS(vOrigin + <<0.0, sDebugWindow[i].fHeight, 0.0>>, //Bottom Left
// vOrigin + <<sDebugWindow[i].fWidth, 0.0, 0.0>>, //Top Right
// vOrigin + <<sDebugWindow[i].fWidth, sDebugWindow[i].fHeight, 0.0>>, //Bottom Right
// ROUND(sDebugWindow[i].vColourBottomLeft.X), ROUND(sDebugWindow[i].vColourBottomLeft.Y), ROUND(sDebugWindow[i].vColourBottomLeft.Z), //Top Left Colour
// ROUND(sDebugWindow[i].vColourTopRight.X), ROUND(sDebugWindow[i].vColourTopRight.Y), ROUND(sDebugWindow[i].vColourTopRight.Z), //Top Right Colour
// ROUND(sDebugWindow[i].vColourBottomRight.X), ROUND(sDebugWindow[i].vColourBottomRight.Y), ROUND(sDebugWindow[i].vColourBottomRight.Z)) //Bottom Left Colour
// ENDIF
// ENDIF
// ENDREPEAT
//ENDPROC
//
//#ENDIF
#IF IS_DEBUG_BUILD
//Debug Variables
//- General
BOOL bAutoUpdateSpline_SCE = TRUE
BOOL bUpdateSpline_SCE
INT iSplineCamType_SCE, iSplineCamTypeLast_SCE
INT iTotalDuration_SCE
INT iSmoothingStyle_SCE
CAMERA_INDEX camEdit_SCE
CAMERA_INDEX camEditSpline_SCE
CONST_INT iTotalNodes_SCE 20
STRUCT SPLINE_CAM_NODE_SCE
VECTOR vPos
VECTOR vRot
FLOAT fFov
INT iTime
INT iCAM_SPLINE_NODE_FLAGS
ENDSTRUCT
SPLINE_CAM_NODE_SCE SplineCamNodes_SCE[iTotalNodes_SCE]
//- Editing
INT iCurrentNode_SCE, iCurrentNodeLast_SCE
BOOL bCaptureCurrentCamera_SCE
VECTOR vCurrentNodePos_SCE
VECTOR vCurrentNodeRot_SCE
FLOAT fCurrentNodeFOV_SCE
INT iCurrentNodeTime_SCE
INT iCurrentCAM_SPLINE_NODE_FLAGS_SCE
//- Preview
BOOL bRenderSplineCam_SCE
BOOl bStartSplineCam_SCE
//- Drawing
BOOL bDrawDebug_SCE
//BOOL bDrawCam_SCE
//BOOL bDrawNode_SCE
//BOOL bDrawPath_SCE
//BOOL bDrawSpeed_SCE
//INT iDrawPathDetail_SCE
//ENUM DRAWNODE_SCE
// DRAWNODE_NONE_SCE,
// DRAWNODE_POINT_SCE,
// DRAWNODE_WIREFRAME_SCE,
// DRAWNODE_SOLID_SCE
//ENDENUM
//DRAWNODE_SCE eDrawNode_SCE
//- Save/Load
PROC GENERATE_SPLINE_ROUTE()
IF DOES_CAM_EXIST(camEditSpline_SCE)
DESTROY_CAM(camEditSpline_SCE)
ENDIF
IF NOT DOES_CAM_EXIST(camEditSpline_SCE)
IF iSplineCamType_SCE = 0
camEditSpline_SCE = CREATE_CAM("TIMED_SPLINE_CAMERA")
ELIF iSplineCamType_SCE = 1
camEditSpline_SCE = CREATE_CAM("ROUNDED_SPLINE_CAMERA")
ELIF iSplineCamType_SCE = 2
camEditSpline_SCE = CREATE_CAM("SMOOTHED_SPLINE_CAMERA")
ENDIF
ENDIF
BOOL bBreak
INT iLoop
WHILE bBreak = FALSE
IF DOES_CAM_EXIST(camEditSpline_SCE)
IF IS_VECTOR_ZERO(SplineCamNodes_SCE[iLoop].vPos)
bBreak = TRUE
ELSE
SET_CAM_PARAMS(camEdit_SCE, SplineCamNodes_SCE[iLoop].vPos, SplineCamNodes_SCE[iLoop].vRot, SplineCamNodes_SCE[iLoop].fFov)
ADD_CAM_SPLINE_NODE_USING_CAMERA(camEditSpline_SCE, camEdit_SCE, SplineCamNodes_SCE[iLoop].iTime, INT_TO_ENUM(CAM_SPLINE_NODE_FLAGS, SplineCamNodes_SCE[iLoop].iCAM_SPLINE_NODE_FLAGS))
iLoop++
IF iLoop = iTotalNodes_SCE
bBreak = TRUE
ENDIF
ENDIF
ELSE
bBreak = TRUE
ENDIF
ENDWHILE
IF DOES_CAM_EXIST(camEditSpline_SCE)
IF iSplineCamType_SCE = 0
ELIF iSplineCamType_SCE = 1
SET_CAM_SPLINE_SMOOTHING_STYLE(camEditSpline_SCE, INT_TO_ENUM(CAM_SPLINE_SMOOTHING_FLAGS, iSmoothingStyle_SCE + 1))
SET_CAM_SPLINE_DURATION(camEditSpline_SCE, iTotalDuration_SCE)
ELIF iSplineCamType_SCE = 2
SET_CAM_SPLINE_SMOOTHING_STYLE(camEditSpline_SCE, INT_TO_ENUM(CAM_SPLINE_SMOOTHING_FLAGS, iSmoothingStyle_SCE + 1))
SET_CAM_SPLINE_DURATION(camEditSpline_SCE, iTotalDuration_SCE)
ENDIF
ENDIF
ENDPROC
PROC SPLINE_CAM_EDITOR
IF NOT DOES_CAM_EXIST(camEdit_SCE)
camEdit_SCE = CREATE_CAM("DEFAULT_SCRIPTED_CAMERA")
ENDIF
IF bUpdateSpline_SCE = TRUE
GENERATE_SPLINE_ROUTE()
bUpdateSpline_SCE = FALSE
ENDIF
IF iSplineCamTypeLast_SCE <> iSplineCamType_SCE
GENERATE_SPLINE_ROUTE()
iSplineCamTypeLast_SCE = iSplineCamType_SCE
ENDIF
//ADD_CAM_SPLINE_NODE_USING_CAMERA(camEditSpline_SCE, camEdit_SCE, 0)
IF bCaptureCurrentCamera_SCE = TRUE
vCurrentNodePos_SCE = GET_FINAL_RENDERED_CAM_COORD()
vCurrentNodeRot_SCE = GET_FINAL_RENDERED_CAM_ROT()
fCurrentNodeFOV_SCE = GET_FINAL_RENDERED_CAM_FOV()
bCaptureCurrentCamera_SCE = FALSE
ENDIF
IF iCurrentNodeLast_SCE <> iCurrentNode_SCE
vCurrentNodePos_SCE = SplineCamNodes_SCE[iCurrentNode_SCE].vPos
vCurrentNodeRot_SCE = SplineCamNodes_SCE[iCurrentNode_SCE].vRot
fCurrentNodeFOV_SCE = SplineCamNodes_SCE[iCurrentNode_SCE].fFOV
iCurrentNodeTime_SCE = SplineCamNodes_SCE[iCurrentNode_SCE].iTime
iCurrentCAM_SPLINE_NODE_FLAGS_SCE = SplineCamNodes_SCE[iCurrentNode_SCE].iCAM_SPLINE_NODE_FLAGS
iCurrentNodeLast_SCE = iCurrentNode_SCE
ENDIF
SplineCamNodes_SCE[iCurrentNode_SCE].vPos = vCurrentNodePos_SCE
SplineCamNodes_SCE[iCurrentNode_SCE].vRot = vCurrentNodeRot_SCE
SplineCamNodes_SCE[iCurrentNode_SCE].fFOV = fCurrentNodeFOV_SCE
SplineCamNodes_SCE[iCurrentNode_SCE].iTime = iCurrentNodeTime_SCE
SplineCamNodes_SCE[iCurrentNode_SCE].iCAM_SPLINE_NODE_FLAGS = iCurrentCAM_SPLINE_NODE_FLAGS_SCE
IF bRenderSplineCam_SCE
IF DOES_CAM_EXIST(camEditSpline_SCE)
//SET_DEBUG_CAM_ACTIVE(FALSE)
IF IS_CAM_ACTIVE(camEditSpline_SCE)
SET_CAM_ACTIVE(camEditSpline_SCE, FALSE)
ENDIF
SET_CAM_ACTIVE(camEditSpline_SCE, TRUE)
RENDER_SCRIPT_CAMS(TRUE, FALSE) PRINTLN("Camera Preview Started...")
ENDIF
bRenderSplineCam_SCE = FALSE
ENDIF
IF DOES_CAM_EXIST(camEditSpline_SCE)
WHILE IS_CAM_ACTIVE(camEditSpline_SCE)
PRINTLN("Previewing Camera!")
IF GET_CAM_SPLINE_PHASE(camEditSpline_SCE) >= 1.0
SET_CAM_ACTIVE(camEditSpline_SCE, FALSE)
RENDER_SCRIPT_CAMS(FALSE, FALSE) PRINTLN("Camera Preview Ended...")
SET_CAM_SPLINE_PHASE(camEditSpline_SCE, 0.0)
ENDIF
WAIT(0)
ENDWHILE
ENDIF
IF bStartSplineCam_SCE
// SET_CAM_ACTIVE(camEditSpline_SCE, TRUE)
// RENDER_SCRIPT_CAMS(FALSE, FALSE)
bStartSplineCam_SCE = FALSE
ENDIF
IF bDrawDebug_SCE
ENDIF
ENDPROC
#ENDIF
//Creation Proc
PROC MAKE_PICKUPS()
INT iPlacementFlags
//Set health pack placement flags
iPlacementFlags = 0
SET_BIT(iPlacementFlags, ENUM_TO_INT(PLACEMENT_FLAG_FIXED))
IF NOT DOES_PICKUP_EXIST(piPickups[0])
piPickups[0] = CREATE_PICKUP_ROTATE(PICKUP_HEALTH_STANDARD, <<988.861, -2126.522, 30.976>>, <<0, 0, 269>>, iPlacementFlags)
ADD_PICKUP_TO_INTERIOR_ROOM_BY_NAME(piPickups[0], "abaprodfloor")
ENDIF
IF NOT DOES_PICKUP_EXIST(piPickups[1])
piPickups[1] = CREATE_PICKUP_ROTATE(PICKUP_HEALTH_STANDARD, <<992.9708, -2174.6101, 30.4568>>, <<0, 0, -6>>, iPlacementFlags)
ADD_PICKUP_TO_INTERIOR_ROOM_BY_NAME(piPickups[1], "abaSLAUGHT")
ENDIF
IF NOT DOES_PICKUP_EXIST(piPickups[2])
piPickups[2] = CREATE_PICKUP_ROTATE(PICKUP_HEALTH_STANDARD, <<989.534, -2150.114, 31.046>>, <<0, 0, 88>>, iPlacementFlags)
ADD_PICKUP_TO_INTERIOR_ROOM_BY_NAME(piPickups[2], "abattmainsec2")
ENDIF
IF NOT DOES_PICKUP_EXIST(piPickups[3])
piPickups[3] = CREATE_PICKUP_ROTATE(PICKUP_WEAPON_PISTOL, <<952.2078, -2127.2258, 31.1718>>, <<90, 0, 0>>, iPlacementFlags)
ADD_PICKUP_TO_INTERIOR_ROOM_BY_NAME(piPickups[3], "ababackpass")
ENDIF
IF NOT DOES_PICKUP_EXIST(piPickups[4])
piPickups[4] = CREATE_PICKUP_ROTATE(PICKUP_ARMOUR_STANDARD, <<953.7915, -2127.4309, 31.2614>>, <<90, 0, 0>>, iPlacementFlags)
ADD_PICKUP_TO_INTERIOR_ROOM_BY_NAME(piPickups[4], "ababackpass")
ENDIF
ENDPROC
// OBJECTIVE PROCEDURES
PROC initialiseMission()
IF INIT_STAGE()
//INFORM_MISSION_STATS_OF_MISSION_START_MICHAEL_TWO()
//Michael Available
SET_PLAYER_PED_AVAILABLE(CHAR_MICHAEL, TRUE)
//Enable Special Ability
ENABLE_SPECIAL_ABILITY(PLAYER_ID(), TRUE)
//Cap Interior
SET_INTERIOR_CAPPED(INTERIOR_V_ABATTOIR, FALSE)
#IF IS_DEBUG_BUILD
//Auto Skipping
IF bAutoSkipping = TRUE
IF NOT IS_SCREEN_FADED_OUT()
DO_SCREEN_FADE_OUT(500)
ENDIF
ENDIF
#ENDIF
//Prepare Mission
SAFE_SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
//Block Shops
SET_ALL_SHOPS_TEMPORARILY_UNAVAILABLE(TRUE)
//Block changing clothes
SET_PLAYER_CAN_CHANGE_CLOTHES_ON_MISSION(FALSE)
//Block Ambient Variations
SET_PLAYER_PED_DATA_IN_CUTSCENES(FALSE, TRUE)
//Request Additional Text
REQUEST_ADDITIONAL_TEXT("MCH2", MISSION_TEXT_SLOT)
//REQUEST_ADDITIONAL_TEXT("MCH2AUD", 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)
PRINTSTRING("LOADING TEXT")
PRINTNL()
ENDWHILE
//Doors
IF NOT IS_DOOR_REGISTERED_WITH_SYSTEM(iExitDoor)
ADD_DOOR_TO_SYSTEM(iExitDoor, PROP_ABAT_SLIDE, <<962.9084, -2105.8137, 34.6432>>)
ENDIF
//Particle Effects
REQUEST_PTFX_ASSET()
WHILE NOT HAS_PTFX_ASSET_LOADED()
WAIT(0)
PRINTSTRING("LOADING PARTICLES")
PRINTNL()
ENDWHILE
//Audio
REGISTER_SCRIPT_WITH_AUDIO()
//Relationships
ADD_RELATIONSHIP_GROUP("FRIEND", relGroupFriendlyFire)
ADD_RELATIONSHIP_GROUP("BUDDIES", relGroupBuddy)
ADD_RELATIONSHIP_GROUP("ENEMIES", relGroupEnemy)
ADD_RELATIONSHIP_GROUP("PASSIVE", relGroupPassive)
//Buddy
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, relGroupBuddy, RELGROUPHASH_PLAYER)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, RELGROUPHASH_PLAYER, relGroupBuddy)
//Friendly Fire
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, RELGROUPHASH_PLAYER, relGroupFriendlyFire)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, relGroupFriendlyFire, RELGROUPHASH_PLAYER)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, relGroupBuddy, relGroupFriendlyFire)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, relGroupFriendlyFire, relGroupBuddy)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, relGroupEnemy, relGroupFriendlyFire)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, relGroupFriendlyFire, relGroupEnemy)
//Passive
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_IGNORE, relGroupPassive, relGroupBuddy)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_IGNORE, relGroupBuddy, relGroupPassive)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_IGNORE, relGroupPassive, RELGROUPHASH_PLAYER)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_IGNORE, RELGROUPHASH_PLAYER, relGroupPassive)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_IGNORE, relGroupPassive, relGroupEnemy)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_IGNORE, relGroupEnemy, relGroupPassive)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_IGNORE, relGroupPassive, relGroupFriendlyFire)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_IGNORE, relGroupFriendlyFire, relGroupPassive)
//Enemy
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, relGroupBuddy, relGroupEnemy)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, relGroupEnemy, relGroupBuddy)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, RELGROUPHASH_PLAYER, relGroupEnemy)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, relGroupEnemy, RELGROUPHASH_PLAYER)
#IF IS_DEBUG_BUILD
IF NOT DOES_WIDGET_GROUP_EXIST(widGroup)
widGroup = START_WIDGET_GROUP("MICHAEL 2")
START_WIDGET_GROUP("Debug Print")
ADD_WIDGET_BOOL("Audio", bDebugAudio)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Debug Michael Rail Death")
ADD_WIDGET_BOOL("Skip to End", bDebugMichaelDeathSkip)
ADD_WIDGET_BOOL("Do Not Fail", bDebugMichaelDeathDoNotFail)
ADD_WIDGET_STRING("")
ADD_WIDGET_BOOL("Skip to Start", bDebugMichaelSkipToStart)
ADD_WIDGET_STRING("")
ADD_WIDGET_BOOL("Skip to Capture", bDebugMichaelSkipToCapture)
ADD_WIDGET_BOOL("Capture Point", bDebugMichaelCapturePoint)
ADD_WIDGET_STRING("")
ADD_WIDGET_BOOL("Pause/Play", bDebugMichaelPausePlay)
ADD_WIDGET_STRING("")
ADD_WIDGET_BOOL("Debug Time", bDebugMichaelDebugTime)
ADD_WIDGET_STRING("")
ADD_WIDGET_BOOL("Set Debug Cam", bDebugMichaelSetDebugCam)
ADD_WIDGET_BOOL("Capture Debug Cam", bDebugMichaelCaptureDebugCam)
ADD_WIDGET_STRING("")
START_NEW_WIDGET_COMBO()
ADD_TO_WIDGET_COMBO("NONE")
ADD_TO_WIDGET_COMBO("SHAKE_CAM_LIGHT")
ADD_TO_WIDGET_COMBO("SHAKE_CAM_MEDIUM")
ADD_TO_WIDGET_COMBO("SHAKE_CAM_HEAVY")
STOP_WIDGET_COMBO("Handcam Shake", iDebugMichaelHandCam)
ADD_WIDGET_FLOAT_SLIDER("Handcam Amplitude", fDebugMichaelHandCam, 0.0, 10.0, 0.1)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Spline Camera Editor")
START_NEW_WIDGET_COMBO()
ADD_TO_WIDGET_COMBO("TIMED_SPLINE_CAMERA")
ADD_TO_WIDGET_COMBO("ROUNDED_SPLINE_CAMERA")
ADD_TO_WIDGET_COMBO("SMOOTHED_SPLINE_CAMERA")
STOP_WIDGET_COMBO("Spline Camera Type", iSplineCamType_SCE)
ADD_WIDGET_BOOL("Auto Update Spline Path", bAutoUpdateSpline_SCE)
ADD_WIDGET_BOOL("Update Spline Path", bUpdateSpline_SCE)
ADD_WIDGET_STRING("")
START_WIDGET_GROUP("Rounded and Smoothed Splines")
START_NEW_WIDGET_COMBO()
ADD_TO_WIDGET_COMBO("NO_SMOOTH")
ADD_TO_WIDGET_COMBO("SLOW_IN_SMOOTH")
ADD_TO_WIDGET_COMBO("SLOW_OUT_SMOOTH")
ADD_TO_WIDGET_COMBO("SLOW_IN_OUT_SMOOTH")
STOP_WIDGET_COMBO("Smoothing Style", iSmoothingStyle_SCE)
ADD_WIDGET_INT_SLIDER("Total Spline Duration (0 = Off)", iTotalDuration_SCE, 0, 100000, 1)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Nodes Edit")
ADD_WIDGET_INT_SLIDER("Camera Index", iCurrentNode_SCE, 0, iTotalNodes_SCE - 1, 1)
ADD_WIDGET_BOOL("Capture Current Camera as Node", bCaptureCurrentCamera_SCE)
ADD_WIDGET_STRING("")
ADD_WIDGET_FLOAT_SLIDER("Camera Position X", vCurrentNodePos_SCE.X, -10000.0, 10000.0, 0.1)
ADD_WIDGET_FLOAT_SLIDER("Camera Position Y", vCurrentNodePos_SCE.Y, -10000.0, 10000.0, 0.1)
ADD_WIDGET_FLOAT_SLIDER("Camera Position Z", vCurrentNodePos_SCE.Z, -10000.0, 10000.0, 0.1)
ADD_WIDGET_STRING("")
ADD_WIDGET_FLOAT_SLIDER("Camera Rotation X", vCurrentNodeRot_SCE.X, -10000.0, 10000.0, 0.1)
ADD_WIDGET_FLOAT_SLIDER("Camera Rotation Y", vCurrentNodeRot_SCE.Y, -10000.0, 10000.0, 0.1)
ADD_WIDGET_FLOAT_SLIDER("Camera Rotation Z", vCurrentNodeRot_SCE.Z, -10000.0, 10000.0, 0.1)
ADD_WIDGET_STRING("")
ADD_WIDGET_FLOAT_SLIDER("Camera FOV", fCurrentNodeFOV_SCE, 0.0, 130.0, 0.1)
ADD_WIDGET_STRING("")
ADD_WIDGET_INT_SLIDER("Camera Time", iCurrentNodeTime_SCE, 0, 100000, 1)
ADD_WIDGET_STRING("")
START_NEW_WIDGET_COMBO()
ADD_TO_WIDGET_COMBO("NO_FLAGS")
ADD_TO_WIDGET_COMBO("SMOOTH_ROT")
ADD_TO_WIDGET_COMBO("SMOOTH_LENS_PARAMS")
STOP_WIDGET_COMBO("CAM_SPLINE_NODE_FLAGS", iCurrentCAM_SPLINE_NODE_FLAGS_SCE)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Preview")
ADD_WIDGET_BOOL("Preview Spline Camera", bRenderSplineCam_SCE)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Debug Drawing")
STOP_WIDGET_GROUP()
STOP_WIDGET_GROUP()
CREATE_SWITCH_CAM_SCRIPT_SPECIFIC_WIDGETS()
STOP_WIDGET_GROUP()
SET_LOCATES_HEADER_WIDGET_GROUP(widGroup)
SETUP_SPLINE_CAM_NODE_ARRAY_FRANKLIN_TO_MICHAEL(scsSwitchCam_FranklinToMichael, piFranklinSwitch, piMichaelSwitch)
SETUP_SPLINE_CAM_NODE_ARRAY_FRANKLIN_IN_CAR_TO_MICHAEL(scsSwitchCam_FranklinInCarToMichael, piFranklinSwitch, piMichaelSwitch)
SETUP_SPLINE_CAM_NODE_ARRAY_MICHAEL_TO_FRANKLIN(scsSwitchCam_MichaelToFranklin, piFranklinSwitch, piMichaelSwitch)
SETUP_SPLINE_CAM_NODE_ARRAY_FRANKLIN_GRAPPLE_TO_MICHAEL(scsSwitchCam_FranklinGrappleToMichael, piFranklinSwitch, piMichaelSwitch)
CREATE_SPLINE_CAM_WIDGETS(scsSwitchCam_FranklinToMichael, "Franklin", "Michael", widGroup)
CREATE_SPLINE_CAM_WIDGETS(scsSwitchCam_FranklinInCarToMichael, "Franklin Car", "Michael", widGroup)
CREATE_SPLINE_CAM_WIDGETS(scsSwitchCam_MichaelToFranklin, "Michael", "Franklin", widGroup)
CREATE_SPLINE_CAM_WIDGETS(scsSwitchCam_FranklinGrappleToMichael, "Frank Grapple", "Michael", widGroup)
ENDIF
#ENDIF
//Variables
// initSplineNodeList()
initRailNodeList()
//Traffic
SET_VEHICLE_MODEL_IS_SUPPRESSED(GET_PLAYER_VEH_MODEL(CHAR_FRANKLIN), TRUE)
SET_VEHICLE_MODEL_IS_SUPPRESSED(FELTZER2, TRUE)
SET_VEHICLE_MODEL_IS_SUPPRESSED(COQUETTE, TRUE)
//Taxi
DISABLE_TAXI_HAILING(TRUE)
SUPPRESS_EMERGENCY_CALLS()
//Franklin's Vehicle
IF NOT IS_REPLAY_START_VEHICLE_UNDER_SIZE_LIMIT(<<3.5, 10.0, 3.0>>, FALSE)
OR (DOES_ENTITY_EXIST(vehFranklin) AND IS_THIS_MODEL_A_BOAT(GET_ENTITY_MODEL(vehFranklin)))
OR (DOES_ENTITY_EXIST(vehFranklin) AND IS_THIS_MODEL_A_HELI(GET_ENTITY_MODEL(vehFranklin)))
OR (DOES_ENTITY_EXIST(vehFranklin) AND IS_THIS_MODEL_A_PLANE(GET_ENTITY_MODEL(vehFranklin)))
OR (DOES_ENTITY_EXIST(vehFranklin) AND IS_THIS_MODEL_A_TRAIN(GET_ENTITY_MODEL(vehFranklin)))
SAFE_DELETE_VEHICLE(vehFranklin)
ENDIF
IF NOT DOES_ENTITY_EXIST(vehFranklin)
DELETE_ALL_SCRIPT_CREATED_PLAYER_VEHICLES(CHAR_FRANKLIN)
WHILE NOT CREATE_PLAYER_VEHICLE(vehFranklin, CHAR_FRANKLIN, <<-24.1802, -1437.7277, 29.6542>>, 181.1853, TRUE, VEHICLE_TYPE_CAR)
WAIT(0)
ENDWHILE
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(vehFranklin, TRUE)
ELSE
IF NOT IS_ENTITY_DEAD(vehFranklin)
SET_VEHICLE_POSITION(vehFranklin, <<-24.1802, -1437.7277, 29.6542>>, 181.1853)
ENDIF
ENDIF
//Set player
IF NOT IS_CUTSCENE_PLAYING()
WHILE NOT SET_CURRENT_SELECTOR_PED(SELECTOR_PED_FRANKLIN)
WAIT(0)
ENDWHILE
ENDIF
//Dialogue
ADD_PED_FOR_DIALOGUE(sPedsForConversation, 3, NULL, "MCH2GOON")
//Minimap
bRadar = TRUE
IF SKIPPED_STAGE()
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(-10)
IF IS_SCREEN_FADED_OUT()
DO_SCREEN_FADE_IN(500)
ENDIF
ENDIF
ELSE
ADVANCE_STAGE()
ENDIF
IF CLEANUP_STAGE()
//Cleanup (Blips, peds, variables etc.)
eMissionObjective = INT_TO_ENUM(MissionObjective, ENUM_TO_INT(eMissionObjective) + 1)
#IF IS_DEBUG_BUILD
IF bAutoSkipping = FALSE
#ENDIF
//Your mission is being replayed
IF IS_REPLAY_IN_PROGRESS()
IF g_bShitskipAccepted = TRUE
MISSION_REPLAY(INT_TO_ENUM(MissionReplay, GET_REPLAY_MID_MISSION_STAGE() + 1))
ELSE
MISSION_REPLAY(INT_TO_ENUM(MissionReplay, GET_REPLAY_MID_MISSION_STAGE()))
ENDIF
ENDIF
#IF IS_DEBUG_BUILD
ENDIF
#ENDIF
//SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(ENUM_TO_INT(replayStart), "initMission")
ENDIF
ENDPROC
PROC cutIntro()
IF INIT_STAGE()
//Set player
SAFE_SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
//Cutscene
IF bReplaySkip = FALSE
AND bPreloaded = FALSE
REQUEST_CUTSCENE("MIC_2_INT")
ENDIF
ADD_PED_FOR_DIALOGUE(sPedsForConversation, 8, NULL, "LESTER")
//Trackify
ENABLE_SECOND_SCREEN_TRACKIFY_APP(TRUE)
SET_TRACKIFY_TARGET_VECTOR(<<997.1, -2178.9, 30.8>>)
//Radar
bRadar = FALSE
//Audio
LOAD_AUDIO(MIC2_START)
IF SKIPPED_STAGE()
SET_PED_POSITION(PLAYER_PED_ID(), <<-14.4239, -1446.2704, 29.6472>>, 120.3018, FALSE)
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED, TRUE)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(-10)
IF IS_SCREEN_FADED_OUT()
DO_SCREEN_FADE_IN(500)
ENDIF
ENDIF
ELSE
//Request Cutscene Variations - MIC_2_INT
IF bReplaySkip = FALSE
AND bPreloaded = FALSE
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
// IF DOES_ENTITY_EXIST(PLAYER_PED(CHAR_FRANKLIN))
// SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Franklin", PLAYER_PED(CHAR_FRANKLIN))
// ENDIF
//
// IF DOES_ENTITY_EXIST(PLAYER_PED(CHAR_TREVOR))
// AND NOT IS_PED_INJURED(PLAYER_PED(CHAR_TREVOR))
// SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Trevor", PLAYER_PED(CHAR_TREVOR))
// ENDIF
SET_STORED_PLAYER_PED_CUTSCENE_VARIATIONS(CHAR_FRANKLIN, "Franklin")
SET_STORED_PLAYER_PED_CUTSCENE_VARIATIONS(CHAR_TREVOR, "Trevor")
ENDIF
ENDIF
SWITCH iCutsceneStage
CASE 0
IF SAFE_START_CUTSCENE(1000.0)
OR bReplaySkip = TRUE
OR bPreloaded = TRUE
IF HAS_THIS_CUTSCENE_LOADED("MIC_2_INT")
OR bReplaySkip = TRUE
OR bPreloaded = TRUE
IF bReplaySkip = FALSE
AND bPreloaded = FALSE
REGISTER_ENTITY_FOR_CUTSCENE(pedIntro, "Knocked_Out_Ped", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, G_M_Y_FAMCA_01)
IF GET_CURRENT_PLAYER_PED_ENUM() != CHAR_FRANKLIN
IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
REGISTER_ENTITY_FOR_CUTSCENE(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], "Franklin", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, GET_PLAYER_PED_MODEL(CHAR_FRANKLIN))
ELSE
REGISTER_ENTITY_FOR_CUTSCENE(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], "Franklin", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, GET_PLAYER_PED_MODEL(CHAR_FRANKLIN))
ENDIF
ENDIF
IF GET_CURRENT_PLAYER_PED_ENUM() != CHAR_TREVOR
IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
REGISTER_ENTITY_FOR_CUTSCENE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], "Trevor", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, GET_PLAYER_PED_MODEL(CHAR_TREVOR))
ELSE
REGISTER_ENTITY_FOR_CUTSCENE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], "Trevor", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, GET_PLAYER_PED_MODEL(CHAR_TREVOR))
ENDIF
ENDIF
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
START_CUTSCENE()
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
WAIT_WITH_DEATH_CHECKS(0)
//Clear Area
CLEAR_AREA(vPlayerStart, 200.0, TRUE)
IF IS_SCREEN_FADED_OUT()
DO_SCREEN_FADE_IN(500)
ENDIF
SET_EVERYONE_IGNORE_PLAYER(PLAYER_ID(), TRUE)
ENDIF
SET_FRONTEND_RADIO_ACTIVE(FALSE)
ADVANCE_CUTSCENE()
ENDIF
ENDIF
BREAK
CASE 1
IF DOES_ENTITY_EXIST(objDoorAnim)
IF GET_CUTSCENE_TIME() > ROUND(10.000000 * 1000.0)
OR WAS_CUTSCENE_SKIPPED()
SAFE_DELETE_OBJECT(objDoorAnim)
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(objDoorReal)
IF GET_CUTSCENE_TIME() > ROUND(10.000000 * 1000.0)
OR WAS_CUTSCENE_SKIPPED()
IF NOT IS_ENTITY_VISIBLE(objDoorReal)
SET_ENTITY_VISIBLE(objDoorReal, TRUE)
ENDIF
SET_OBJECT_AS_NO_LONGER_NEEDED(objDoorReal)
ENDIF
ENDIF
IF GET_CUTSCENE_TIME() > ROUND(10.000000 * 1000.0)
IF NOT IS_DOOR_REGISTERED_WITH_SYSTEM(iFrontDoor)
ADD_DOOR_TO_SYSTEM(iFrontDoor, V_ILEV_FA_FRONTDOOR, <<-14.8689, -1441.1821, 31.1932>>)
ELSE
IF DOOR_SYSTEM_GET_OPEN_RATIO(iFrontDoor) <> 0.0
OR DOOR_SYSTEM_GET_DOOR_STATE(iFrontDoor) != DOORSTATE_FORCE_LOCKED_THIS_FRAME
DOOR_SYSTEM_SET_OPEN_RATIO(iFrontDoor, 0.0, FALSE, FALSE)
DOOR_SYSTEM_SET_DOOR_STATE(iFrontDoor, DOORSTATE_FORCE_LOCKED_THIS_FRAME, FALSE, TRUE)
ENDIF
ENDIF
ENDIF
IF NOT DOES_ENTITY_EXIST(pedIntro)
ENTITY_INDEX entityIntro
entityIntro = GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Knocked_Out_Ped")
IF DOES_ENTITY_EXIST(entityIntro)
pedIntro = GET_PED_INDEX_FROM_ENTITY_INDEX(entityIntro)
ENDIF
ENDIF
IF GET_CURRENT_PLAYER_PED_ENUM() != CHAR_FRANKLIN
IF NOT DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
ENTITY_INDEX entityFranklin
entityFranklin = GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Franklin")
IF DOES_ENTITY_EXIST(entityFranklin)
sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN] = GET_PED_INDEX_FROM_ENTITY_INDEX(entityFranklin)
ENDIF
ENDIF
ENDIF
IF GET_CURRENT_PLAYER_PED_ENUM() != CHAR_TREVOR
IF NOT DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
ENTITY_INDEX entityTrevor
entityTrevor = GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Trevor")
IF DOES_ENTITY_EXIST(entityTrevor)
sSelectorPeds.pedID[SELECTOR_PED_TREVOR] = GET_PED_INDEX_FROM_ENTITY_INDEX(entityTrevor)
ENDIF
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_CAMERA()
REPLAY_STOP_EVENT()
SET_GAMEPLAY_CAM_RELATIVE_HEADING(168.6 - GET_ENTITY_HEADING(PLAYER_PED_ID()))
SET_GAMEPLAY_CAM_RELATIVE_PITCH(-10)
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Knocked_Out_Ped")
IF DOES_ENTITY_EXIST(pedIntro)
AND NOT IS_ENTITY_DEAD(pedIntro)
DISABLE_PED_PAIN_AUDIO(pedIntro, TRUE)
// TASK_PLAY_ANIM_ADVANCED(pedIntro, sAnimDictMic2LeadOut, "mic_2_int_leadout_ped", <<-13.818, -1449.380, 30.608>>, <<0.0, 0.0, 180.0>>, INSTANT_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_EXTRACT_INITIAL_OFFSET | AF_NOT_INTERRUPTABLE | AF_USE_KINEMATIC_PHYSICS | AF_USE_MOVER_EXTRACTION | AF_HOLD_LAST_FRAME, 1.0, EULER_YXZ, AIK_DISABLE_LEG_IK)
//
// FORCE_PED_AI_AND_ANIMATION_UPDATE(pedIntro)
SET_PED_TO_RAGDOLL(pedIntro, 10000, 10000, TASK_RELAX)
SET_ENTITY_HEALTH(pedIntro, 5)
APPLY_DAMAGE_TO_PED(pedIntro, 500, FALSE)
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Franklin")
IF GET_CURRENT_PLAYER_PED_ENUM() != CHAR_FRANKLIN
MAKE_SELECTOR_PED_SELECTION(sSelectorPeds, SELECTOR_PED_FRANKLIN)
TAKE_CONTROL_OF_SELECTOR_PED(sSelectorPeds)
SET_LABEL_AS_TRIGGERED("SwitchFX[MIC_2_INT]", TRUE)
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Trevor")
IF GET_CURRENT_PLAYER_PED_ENUM() != CHAR_FRANKLIN
MAKE_SELECTOR_PED_SELECTION(sSelectorPeds, SELECTOR_PED_FRANKLIN)
TAKE_CONTROL_OF_SELECTOR_PED(sSelectorPeds)
SET_LABEL_AS_TRIGGERED("SwitchFX[MIC_2_INT]", TRUE)
ENDIF
IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
AND NOT IS_ENTITY_DEAD(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
// OPEN_SEQUENCE_TASK(seqMain)
// IF WAS_CUTSCENE_SKIPPED()
// TASK_PLAY_ANIM_ADVANCED(NULL, sAnimDictMic2LeadOut, "mic_2_int_leadout_trv", <<-13.818, -1449.380, 30.608>>, <<0.0, 0.0, 180.0>>, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_EXTRACT_INITIAL_OFFSET | AF_NOT_INTERRUPTABLE | AF_USE_KINEMATIC_PHYSICS | AF_USE_MOVER_EXTRACTION, 1.0, EULER_YXZ, AIK_DISABLE_LEG_IK)
// ELSE
// TASK_PLAY_ANIM_ADVANCED(NULL, sAnimDictMic2LeadOut, "mic_2_int_leadout_trv", <<-13.818, -1449.380, 30.608>>, <<0.0, 0.0, 180.0>>, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_EXTRACT_INITIAL_OFFSET | AF_NOT_INTERRUPTABLE | AF_USE_KINEMATIC_PHYSICS | AF_USE_MOVER_EXTRACTION, 0.006, EULER_YXZ, AIK_DISABLE_LEG_IK)
// ENDIF
// TASK_WANDER_STANDARD(NULL, 92.8)
// CLOSE_SEQUENCE_TASK(seqMain)
// TASK_PERFORM_SEQUENCE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], seqMain)
// CLEAR_SEQUENCE_TASK(seqMain)
TASK_WANDER_STANDARD(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], 92.8)
FORCE_PED_AI_AND_ANIMATION_UPDATE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
ENDIF
ENDIF
IF WAS_CUTSCENE_SKIPPED()
SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, TRUE, FALSE)
bCutsceneSkipped = TRUE
ENDIF
IF HAS_CUTSCENE_FINISHED()
OR bReplaySkip = TRUE
IF bReplaySkip = FALSE
IF bCutsceneSkipped
LOAD_SCENE_ADV(<<-14.0313, -1446.6488, 29.6462>>, 50.0)
SET_PED_POSITION(PLAYER_PED(CHAR_FRANKLIN), <<-14.0313, -1446.6488, 29.6462>>, 157.2684)
IF NOT DOES_ENTITY_EXIST(pedIntro)
REQUEST_MODEL(G_M_Y_FamCA_01)
WHILE NOT HAS_MODEL_LOADED(G_M_Y_FamCA_01)
WAIT_WITH_DEATH_CHECKS(0)
ENDWHILE
SPAWN_PED(pedIntro, G_M_Y_FamCA_01, <<-13.818, -1449.380, 30.608>>, 0.0)
DISABLE_PED_PAIN_AUDIO(pedIntro, TRUE)
TASK_PLAY_ANIM_ADVANCED(pedIntro, sAnimDictMic2LeadOut, "mic_2_int_leadout_ped", <<-13.818, -1449.380, 30.608>>, <<0.0, 0.0, 180.0>>, INSTANT_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_EXTRACT_INITIAL_OFFSET | AF_NOT_INTERRUPTABLE | AF_USE_KINEMATIC_PHYSICS | AF_USE_MOVER_EXTRACTION | AF_HOLD_LAST_FRAME, 1.0, EULER_YXZ, AIK_DISABLE_LEG_IK)
FORCE_PED_AI_AND_ANIMATION_UPDATE(pedIntro)
SET_PED_TO_RAGDOLL(pedIntro, 10000, 10000, TASK_RELAX)
SET_ENTITY_HEALTH(pedIntro, 5)
APPLY_DAMAGE_TO_PED(pedIntro, 500, FALSE)
ENDIF
IF NOT DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
SPAWN_PLAYER(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], CHAR_TREVOR, <<-18.4660, -1452.3175, 29.5917>>, 93.9740)
TASK_WANDER_STANDARD(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], 92.8)
FORCE_PED_AI_AND_ANIMATION_UPDATE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
ENDIF
CLEAR_AREA(<<-14.0313, -1446.6488, 29.6462>>, 100.0, TRUE)
DO_SCREEN_FADE_IN(1000) #IF IS_DEBUG_BUILD PRINTLN("DO_SCREEN_FADE_IN") #ENDIF
ENDIF
bCutsceneSkipped = FALSE
SET_EVERYONE_IGNORE_PLAYER(PLAYER_ID(), FALSE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
WAIT_WITH_DEATH_CHECKS(0)
//SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
//SET_GAMEPLAY_CAM_RELATIVE_PITCH(-10)
SAFE_SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
IF HAS_LABEL_BEEN_TRIGGERED("SwitchFX[MIC_2_INT]")
ANIMPOSTFX_PLAY("SwitchSceneFranklin", 0, FALSE)
PLAY_SOUND_FRONTEND(-1, "Hit_1", "LONG_PLAYER_SWITCH_SOUNDS")
ENDIF
//Radar
bRadar = TRUE
DISABLE_CELLPHONE(FALSE)
ADD_PED_FOR_DIALOGUE(sPedsForConversation, 1, PLAYER_PED_ID(), "FRANKLIN")
REPLAY_RECORD_BACK_FOR_TIME(0.0, 10.0)
WHILE NOT PLAYER_CALL_CHAR_CELLPHONE(sPedsForConversation, CHAR_LESTER, sConversationBlock, "MCH2_PHO", CONV_PRIORITY_HIGH, TRUE, DISPLAY_SUBTITLES, DO_ADD_TO_BRIEF_SCREEN, FALSE)
WAIT_WITH_DEATH_CHECKS(0)
ENDWHILE
WHILE NOT IS_PHONE_ONSCREEN()
WAIT_WITH_DEATH_CHECKS(0)
ENDWHILE
// SET_FINISHED_CALL_RETURNS_TO_HOMESCREEN(TRUE)
ENDIF
IF DOES_ENTITY_EXIST(objDoorAnim)
SAFE_DELETE_OBJECT(objDoorAnim)
ENDIF
IF DOES_ENTITY_EXIST(objDoorReal)
IF NOT IS_ENTITY_VISIBLE(objDoorReal)
SET_ENTITY_VISIBLE(objDoorReal, TRUE)
ENDIF
SET_OBJECT_AS_NO_LONGER_NEEDED(objDoorReal)
ENDIF
//Cutscene
REQUEST_CUTSCENE("MIC_2_MCS_1")
//Interior
IF bPinnedAbattoir = FALSE
intAbattoir = GET_INTERIOR_AT_COORDS_WITH_TYPE(vPlayerStart, "v_abattoir")
PIN_INTERIOR_IN_MEMORY(intAbattoir)
ENDIF
eSwitchCamState = SWITCH_CAM_REQUEST_ASSETS
HANDLE_SWITCH_CAM_FRANKLIN_TO_MICHAEL(scsSwitchCam_FranklinToMichael)
bFranklinPlayedCellAnim = FALSE
bFranklinPlayAnimFromHangupPos = FALSE
ADVANCE_CUTSCENE()
ENDIF
BREAK
CASE 2
// IF IS_CELLPHONE_ON_HOMESCREEN()
// OR NOT IS_PHONE_ONSCREEN()
// LAUNCH_TRACKIFY_IMMEDIATELY()
TEXT_LABEL_23 txtRoot
txtRoot = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_LABEL()
IF (IS_THIS_CONVERSATION_ONGOING_OR_QUEUED("MCH2_PHO")
AND ARE_STRINGS_EQUAL(txtRoot, "MCH2_PHO_7"))
OR IS_CELLPHONE_ON_HOMESCREEN()
OR NOT IS_PHONE_ONSCREEN()
IF IS_CELLPHONE_ON_HOMESCREEN()
OR NOT IS_PHONE_ONSCREEN()
bFranklinPlayAnimFromHangupPos = TRUE
ENDIF
SEND_TEXT_MESSAGE_TO_CURRENT_PLAYER(CHAR_LESTER, "MCH2_APPTXT", TXTMSG_UNLOCKED)
ADVANCE_CUTSCENE()
ENDIF
BREAK
CASE 3
// IF (IS_CELLPHONE_TRACKIFY_IN_USE()
// AND TIMERA() > 4000)
// OR (NOT IS_CELLPHONE_TRACKIFY_IN_USE()
// AND TIMERA() > 1000)
IF NOT IS_THIS_CONVERSATION_ONGOING_OR_QUEUED("MCH2_PHO")
OR IS_CELLPHONE_ON_HOMESCREEN()
OR NOT IS_PHONE_ONSCREEN()
OR g_ConversationStatus = CONV_STATE_HANGUPAWAY
DISABLE_CELLPHONE(TRUE) //DISABLE_CELLPHONE_THIS_FRAME_ONLY()
IF NOT bFranklinPlayedCellAnim
IF HAS_ANIM_DICT_LOADED("cellphone@")
AND HAS_MODEL_LOADED(Prop_phone_ING_03)
AND HAS_MODEL_LOADED(mn_FrankPhoneDisplay)
IF NOT (IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) AND GET_CAM_VIEW_MODE_FOR_CONTEXT(GET_CAM_ACTIVE_VIEW_MODE_CONTEXT()) = CAM_VIEW_MODE_FIRST_PERSON)
oiFrankCellPhoneProp = CREATE_OBJECT(Prop_phone_ING_03, GET_ENTITY_COORDS(PLAYER_PED_ID()))
oiFrankCellPhoneDisplay = CREATE_OBJECT(mn_FrankPhoneDisplay, GET_ENTITY_COORDS(PLAYER_PED_ID()))
ATTACH_ENTITY_TO_ENTITY(oiFrankCellPhoneProp, PLAYER_PED_ID(), GET_PED_BONE_INDEX(PLAYER_PED_ID(), BONETAG_PH_R_HAND), (<<0.0, 0.0, 0.0>>), (<<0.0, 0.0, 0.0>>))
ATTACH_ENTITY_TO_ENTITY(oiFrankCellPhoneDisplay, PLAYER_PED_ID(), GET_PED_BONE_INDEX(PLAYER_PED_ID(), BONETAG_PH_R_HAND), v_FrankPhoneDisplayOffset, v_FrankPhoneDisplayRotation)
//[MF] Depending on if Franklin has recieved the Trackify app yet or not, play a slightly different animation to better match his current state.
IF bFranklinPlayAnimFromHangupPos
OPEN_SEQUENCE_TASK(seqMain)
TASK_PLAY_ANIM(NULL, "cellphone@", "cellphone_text_in", SLOW_BLEND_IN, NORMAL_BLEND_OUT, DEFAULT, AF_UPPERBODY)
TASK_PLAY_ANIM(NULL, "cellphone@", "cellphone_text_read_base", NORMAL_BLEND_IN, DEFAULT, DEFAULT, AF_LOOPING | AF_UPPERBODY) // | AF_SECONDARY)
CLOSE_SEQUENCE_TASK(seqMain)
TASK_PERFORM_SEQUENCE(PLAYER_PED_ID(), seqMain)
CLEAR_SEQUENCE_TASK(seqMain)
ELSE
CLEAR_PED_SECONDARY_TASK(PLAYER_PED_ID())
OPEN_SEQUENCE_TASK(seqMain)
TASK_PLAY_ANIM(NULL, "cellphone@", "cellphone_call_to_text", SLOW_BLEND_IN, NORMAL_BLEND_OUT, DEFAULT, AF_UPPERBODY) // | AF_SECONDARY)
TASK_PLAY_ANIM(NULL, "cellphone@", "cellphone_text_read_base", NORMAL_BLEND_IN, DEFAULT, DEFAULT, AF_LOOPING | AF_UPPERBODY) // | AF_SECONDARY)
CLOSE_SEQUENCE_TASK(seqMain)
TASK_PERFORM_SEQUENCE(PLAYER_PED_ID(), seqMain)
CLEAR_SEQUENCE_TASK(seqMain)
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID(), TRUE)
ENDIF
IF GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_ON_FOOT) = CAM_VIEW_MODE_FIRST_PERSON
SET_GAMEPLAY_ENTITY_HINT(oiFrankCellPhoneProp, VECTOR_ZERO, DEFAULT, DEFAULT_DWELL_TIME, DEFAULT_INTERP_IN_TIME / 4, DEFAULT_INTERP_OUT_TIME, HINTTYPE_NO_FOV)
ENDIF
ENDIF
bFranklinPlayedCellAnim = TRUE
ENDIF
ENDIF
ENDIF
IF TIMERA() > 3000
AND NOT IS_THIS_CONVERSATION_ONGOING_OR_QUEUED("MCH2_PHO")
AND bFranklinPlayedCellAnim
// DO_SCREEN_FADE_OUT(500)
//
// WHILE NOT IS_SCREEN_FADED_OUT()
// WAIT_WITH_DEATH_CHECKS(0)
// ENDWHILE
HIDE_CELLPHONE_SIGNIFIERS_FOR_CUTSCENE(TRUE)
DISABLE_CELLPHONE(TRUE)
ADVANCE_STAGE()
ENDIF
BREAK
ENDSWITCH
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SPECIAL_ABILITY)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SPECIAL_ABILITY_PC)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SPECIAL_ABILITY_SECONDARY)
SET_PED_MAX_MOVE_BLEND_RATIO(PLAYER_PED_ID(), PEDMOVE_WALK)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_JUMP)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_DUCK)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_COVER)
SET_PED_RESET_FLAG(PLAYER_PED_ID(), PRF_DisablePlayerAutoVaulting, TRUE)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_NEXT_WEAPON)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_PREV_WEAPON)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SELECT_WEAPON)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_HEAVY)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_LIGHT)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK1)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK2)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_BLOCK)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK1)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK2)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_BLOCK)
//Request Cutscene Variations - MIC_2_MCS_1
IF iCutsceneStage > 1
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
SET_STORED_PLAYER_PED_CUTSCENE_VARIATIONS(CHAR_MICHAEL, "Michael") //SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", PLAYER_PED(CHAR_MICHAEL))
// SET_CUTSCENE_PED_COMPONENT_VARIATION("Michael", PED_COMP_HAIR, g_savedGlobals.sPlayerData.sInfo.sVariations[CHAR_MICHAEL].iDrawableVariation[PED_COMP_HAIR], g_savedGlobals.sPlayerData.sInfo.sVariations[CHAR_MICHAEL].iTextureVariation[PED_COMP_HAIR])
// SET_CUTSCENE_PED_COMPONENT_VARIATION("Michael", PED_COMP_HEAD, g_savedGlobals.sPlayerData.sInfo.sVariations[CHAR_MICHAEL].iDrawableVariation[PED_COMP_HEAD], g_savedGlobals.sPlayerData.sInfo.sVariations[CHAR_MICHAEL].iTextureVariation[PED_COMP_HEAD])
// SET_CUTSCENE_PED_COMPONENT_VARIATION("Michael", PED_COMP_BERD, g_savedGlobals.sPlayerData.sInfo.sVariations[CHAR_MICHAEL].iDrawableVariation[PED_COMP_BERD], g_savedGlobals.sPlayerData.sInfo.sVariations[CHAR_MICHAEL].iTextureVariation[PED_COMP_BERD])
SET_CUTSCENE_PED_COMPONENT_VARIATION("Michael", PED_COMP_TORSO, 19, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Michael", PED_COMP_LEG, 0, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Michael", PED_COMP_HAND, 0, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Michael", PED_COMP_FEET, 0, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Michael", PED_COMP_TEETH, 0, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Michael", PED_COMP_SPECIAL, 0, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Michael", PED_COMP_SPECIAL2, 0, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Michael", PED_COMP_DECL, 0, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Michael", PED_COMP_JBIB, 0, 0)
SET_CUTSCENE_PED_PROP_VARIATION("Michael", ANCHOR_HEAD, -1)
SET_CUTSCENE_PED_PROP_VARIATION("Michael", ANCHOR_EYES, -1)
SET_CUTSCENE_PED_PROP_VARIATION("Michael", ANCHOR_EARS, -1)
SET_CUTSCENE_PED_PROP_VARIATION("Michael", ANCHOR_MOUTH, -1)
SET_CUTSCENE_PED_PROP_VARIATION("Michael", ANCHOR_LEFT_HAND, -1)
SET_CUTSCENE_PED_PROP_VARIATION("Michael", ANCHOR_RIGHT_HAND, -1)
SET_CUTSCENE_PED_PROP_VARIATION("Michael", ANCHOR_LEFT_WRIST, -1)
SET_CUTSCENE_PED_PROP_VARIATION("Michael", ANCHOR_RIGHT_WRIST, -1)
SET_CUTSCENE_PED_PROP_VARIATION("Michael", ANCHOR_HIP, -1)
// SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Chinese_gunman", sEnemyIntroCut[0].pedIndex)
ENDIF
ENDIF
ENDIF
IF CLEANUP_STAGE()
//Cleanup (Blips, peds, variables etc.)
REMOVE_TEXT_MESSAGE_FEED_ENTRY("MCH2_APPTXT")
DELETE_TEXT_MESSAGE_BY_LABEL_FROM_ALL_PLAYER_CHARACTERS("MCH2_APPTXT")
CLEAR_AUTO_LAUNCH_TO_TEXT_MESSAGE_APP_FOR_THIS_SP_CHARACTER(CHAR_FRANKLIN)
REMOVE_PED_FOR_DIALOGUE(sPedsForConversation, 8)
IF GET_CURRENT_PLAYER_PED_ENUM() != CHAR_FRANKLIN
SET_PED_POSITION(PLAYER_PED_ID(), <<-14.9012, -1446.1061, 29.6447>>, 53.1046)
IF NOT DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
WHILE NOT CREATE_PLAYER_PED_ON_FOOT(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], CHAR_FRANKLIN, <<-24.2141, -1448.7147, 29.6236>>, 150.7758)
WAIT_WITH_DEATH_CHECKS(0)
ENDWHILE
ENDIF
MAKE_SELECTOR_PED_SELECTION(sSelectorPeds, SELECTOR_PED_FRANKLIN)
TAKE_CONTROL_OF_SELECTOR_PED(sSelectorPeds)
SET_PED_POSITION(PLAYER_PED_ID(), <<-24.2141, -1448.7147, 29.6236>>, 150.7758)
ENDIF
ADD_PED_FOR_DIALOGUE(sPedsForConversation, 1, PLAYER_PED_ID(), "FRANKLIN")
IF NOT HAS_THIS_CUTSCENE_LOADED("MIC_2_MCS_1")
REMOVE_CUTSCENE()
WHILE HAS_CUTSCENE_LOADED()
WAIT_WITH_DEATH_CHECKS(0)
ENDWHILE
ENDIF
HANG_UP_AND_PUT_AWAY_PHONE()
SET_FRONTEND_RADIO_ACTIVE(TRUE)
SET_EVERYONE_IGNORE_PLAYER(PLAYER_ID(), FALSE)
//Hint
STOP_GAMEPLAY_HINT()
eMissionObjective = INT_TO_ENUM(MissionObjective, ENUM_TO_INT(eMissionObjective) + 1)
ENDIF
ENDPROC
PROC findMichael()
IF INIT_STAGE()
//Set player
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED(CHAR_FRANKLIN)) AND bReplaySkip = FALSE
SAFE_SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
ENDIF
//Trackify
ENABLE_SECOND_SCREEN_TRACKIFY_APP(TRUE)
SET_TRACKIFY_TARGET_VECTOR(<<997.1, -2178.9, 30.8>>)
//Uncapped
bSetUncapped = TRUE
//Interior
intAbattoir = GET_INTERIOR_AT_COORDS_WITH_TYPE(vPlayerStart, "v_abattoir")
PIN_INTERIOR_IN_MEMORY(intAbattoir)
WHILE NOT IS_INTERIOR_READY(intAbattoir)
PRINTLN("PINNING INTERIOR...")
WAIT_WITH_DEATH_CHECKS(0)
ENDWHILE
bPinnedAbattoir = TRUE
MAKE_PICKUPS()
// VECTOR vFranklinPosition = <<-14.4239, -1446.2704, 29.6472>>
// FLOAT fFranklinHeading = 120.3018
//
// IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED(CHAR_FRANKLIN)), <<-14.4239, -1446.2704, 29.6472>>) < 50.0
// vFranklinPosition = GET_ENTITY_COORDS(PLAYER_PED(CHAR_FRANKLIN))
// fFranklinHeading = GET_ENTITY_HEADING(PLAYER_PED(CHAR_FRANKLIN))
// ENDIF
//
// SET_PED_POSITION(PLAYER_PED_ID(), vPlayerStart, fPlayerStart, FALSE)
//Radar
bRadar = FALSE
//Set player
IF GET_CURRENT_PLAYER_PED_ENUM() != CHAR_MICHAEL
// SET_PED_POSITION(PLAYER_PED_ID(), <<-14.9012, -1446.1061, 29.6447>>, 53.1046)
IF NOT DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
WHILE NOT CREATE_PLAYER_PED_ON_FOOT(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], CHAR_MICHAEL, vPlayerStart, fPlayerStart)
WAIT_WITH_DEATH_CHECKS(0)
ENDWHILE
ENDIF
// MAKE_SELECTOR_PED_SELECTION(sSelectorPeds, SELECTOR_PED_MICHAEL)
// TAKE_CONTROL_OF_SELECTOR_PED(sSelectorPeds)
//
// SET_PED_POSITION(PLAYER_PED_ID(), vPlayerStart, fPlayerStart)
ENDIF
CLEAR_AREA(vPlayerStart, 500.0, TRUE)
ADD_SCENARIO_BLOCKING_AREA(<<-26.816481, -1446.621826, 44.654160>> - <<30.0, 30.0, 30.0>>, <<-26.816481, -1446.621826, 44.654160>> + <<30.0, 30.0, 30.0>>)
CLEAR_AREA(<<941.6578, -2181.0586, 29.5517>>, 1000.0, TRUE)
ADD_SCENARIO_BLOCKING_AREA(<<966.108276, -2149.353271, 55.977444>> - <<60.0, 70.0, 30.0>>, <<966.108276, -2149.353271, 55.977444>> + <<60.0, 70.0, 30.0>>)
RETAIN_ENTITY_IN_INTERIOR(PLAYER_PED(CHAR_MICHAEL), intAbattoir)
SET_PED_POSITION(PLAYER_PED(CHAR_MICHAEL), vPlayerStart, fPlayerStart, FALSE)
SET_PED_TARGET_LOSS_RESPONSE(PLAYER_PED(CHAR_MICHAEL), TLR_NEVER_LOSE_TARGET)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(PLAYER_PED(CHAR_MICHAEL), TRUE)
SET_PED_CONFIG_FLAG(PLAYER_PED(CHAR_MICHAEL), PCF_RunFromFiresAndExplosions, FALSE)
REMOVE_ALL_PED_WEAPONS(PLAYER_PED(CHAR_MICHAEL))
SET_CURRENT_PED_WEAPON(PLAYER_PED(CHAR_MICHAEL), WEAPONTYPE_UNARMED, TRUE)
// SET_PED_DEFAULT_COMPONENT_VARIATION(PLAYER_PED(CHAR_MICHAEL))
WHILE NOT SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED(CHAR_MICHAEL), COMP_TYPE_OUTFIT, OUTFIT_P0_DEFAULT, FALSE)
WAIT_WITH_DEATH_CHECKS(0)
ENDWHILE
SET_PED_COMPONENT_VARIATION(PLAYER_PED(CHAR_MICHAEL), PED_COMP_TORSO, 19, 0)
WHILE NOT HAVE_ALL_STREAMING_REQUESTS_COMPLETED(PLAYER_PED(CHAR_MICHAEL))
WAIT_WITH_DEATH_CHECKS(0)
ENDWHILE
//Franklin
//CREATE_PLAYER_PED_ON_FOOT(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], CHAR_FRANKLIN, vFranklinPosition, fFranklinHeading) //<<-24.2141, -1448.7147, 29.6236>>, 150.7758)
// GIVE_WEAPON_TO_PED(PLAYER_PED(CHAR_FRANKLIN), WEAPONTYPE_PUMPSHOTGUN, 50)
// GIVE_WEAPON_TO_PED(PLAYER_PED(CHAR_FRANKLIN), WEAPONTYPE_ASSAULTRIFLE , 200, TRUE)
SET_CURRENT_PED_WEAPON(PLAYER_PED(CHAR_FRANKLIN), WEAPONTYPE_UNARMED, TRUE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(PLAYER_PED(CHAR_FRANKLIN), TRUE)
SET_PED_CONFIG_FLAG(PLAYER_PED(CHAR_FRANKLIN), PCF_RunFromFiresAndExplosions, FALSE)
//Friendly Fire Relationship Group
IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[CHAR_MICHAEL])
SET_PED_RELATIONSHIP_GROUP_HASH(sSelectorPeds.pedID[CHAR_MICHAEL], relGroupFriendlyFire)
ENDIF
IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[CHAR_FRANKLIN])
SET_PED_RELATIONSHIP_GROUP_HASH(sSelectorPeds.pedID[CHAR_FRANKLIN], relGroupBuddy)
ENDIF
//Dialogue
REMOVE_PED_FOR_DIALOGUE(sPedsForConversation, 0)
REMOVE_PED_FOR_DIALOGUE(sPedsForConversation, 1)
ADD_PED_FOR_DIALOGUE(sPedsForConversation, 0, NULL, "MICHAEL") //PLAYER_PED(CHAR_MICHAEL)
ADD_PED_FOR_DIALOGUE(sPedsForConversation, 1, PLAYER_PED(CHAR_FRANKLIN), "FRANKLIN")
//Rail
bOkToHangFromHook = FALSE
bOkToMoveRail = FALSE
bOkToSwitch = FALSE
SET_RAIL_FINAL_NODE(40)
//Hook
objHook = CREATE_OBJECT_NO_OFFSET(PROP_LD_HOOK, sRailNodes[0].vPos)
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(objHook, FALSE)
FREEZE_ENTITY_POSITION(objHook, TRUE)
RETAIN_ENTITY_IN_INTERIOR(objHook, intAbattoir)
objChain = CREATE_OBJECT_NO_OFFSET(PROP_CS_LEG_CHAIN_01, GET_ENTITY_COORDS(objHook) + <<0.0, 0.0, 0.01>>)
ATTACH_ENTITY_TO_ENTITY(objChain, objHook, -1, vChainOffset, vChainRotation)
objPadlock = CREATE_OBJECT_NO_OFFSET(PROP_CS_PADLOCK, GET_ENTITY_COORDS(objHook) + <<0.0, 0.0, -0.01>>)
ATTACH_ENTITY_TO_ENTITY(objPadlock, objHook, -1, vPadlockOffset, vPadlockRotation)
WHILE NOT DOES_ENTITY_HAVE_PHYSICS(objHook)
OR NOT HAS_COLLISION_FOR_MODEL_LOADED(PROP_LD_HOOK)
WAIT_WITH_DEATH_CHECKS(0)
ENDWHILE
SET_ENTITY_COORDS_NO_OFFSET(objHook, sRailNodes[0].vPos)
SET_ENTITY_ROTATION(objHook, sRailNodes[0].vRot)
FREEZE_ENTITY_POSITION(objHook, TRUE)
SET_OBJECT_PHYSICS_PARAMS(objHook, fHookMass, -1.0, <<-1.0, -1.0, -1.0>>, <<-1.0, -1.0, -1.0>>)
SET_ENTITY_DYNAMIC(objHook, TRUE)
//Attach Michael to hook
ATTACH_ENTITY_TO_ENTITY(PLAYER_PED(CHAR_MICHAEL), objHook, 0, vMichaelAttachOffset, <<0.0, 0.0, 180.0>>, TRUE, TRUE)
WHILE NOT IS_ENTITY_ATTACHED(PLAYER_PED(CHAR_MICHAEL))
WAIT_WITH_DEATH_CHECKS(0)
ENDWHILE
TASK_PLAY_ANIM(PLAYER_PED(CHAR_MICHAEL), sAnimDictMic2Hook, "michael_meat_hook_react_b", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1, AF_LOOPING) //TASK_PLAY_ANIM(PLAYER_PED(CHAR_MICHAEL), sAnimDictHang, "idle", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1, AF_LOOPING)
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED(CHAR_MICHAEL))
SET_PED_RESET_FLAG(PLAYER_PED(CHAR_MICHAEL), PRF_AllowUpdateIfNoCollisionLoaded, TRUE)
//Enemy Intro (Inside)
createEnemy(sEnemyIntroCut[0], <<996.9860, -2185.0713, 28.9775>>, 9.6956, WEAPONTYPE_SMG, CSB_CHIN_GOON) //Original Position: <<991.6176, -2171.4707, 29.2246>>, 270.7684
SET_PED_DEFAULT_COMPONENT_VARIATION(sEnemyIntroCut[0].pedIndex)
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(sEnemyIntroCut[0].pedIndex, FALSE)
SET_MODEL_AS_NO_LONGER_NEEDED(CSB_CHIN_GOON)
createEnemy(sEnemyIntroCut[1], <<992.2509, -2175.3486 -0.4, 28.9769>>, 242.3, WEAPONTYPE_PISTOL, G_M_M_CHIGOON_01)
createEnemy(sEnemyIntroCut[2], <<988.6379, -2170.6748, 29.2006>>, 352.4113, WEAPONTYPE_PISTOL)
createEnemy(sEnemyIntroCut[3], <<977.6, -2166.4, 30.4104 + 0.25>>, 70.2, WEAPONTYPE_UNARMED)
createEnemy(sEnemyIntroCut[4], <<970.7029, -2169.6233, 28.4637>>, 170.9878, WEAPONTYPE_UNARMED, G_M_M_CHIGOON_01)
createEnemy(sEnemyIntroCut[5], <<977.9589, -2156.2410, 30.0791>>, 125.1269, WEAPONTYPE_UNARMED, G_M_M_CHIGOON_01)
createEnemy(sEnemyIntroCut[6], <<984.0753, -2158.3696, 30.0793>>, 219.8727, WEAPONTYPE_PISTOL)
createEnemy(sEnemyIntroCut[7], <<997.6616, -2157.8818, 28.4766>>, 265.7728, WEAPONTYPE_MICROSMG, G_M_M_CHIGOON_01)
createEnemy(sEnemyIntroCut[8], <<999.5024, -2145.7878, 28.4765>>, 275.3511, WEAPONTYPE_SMG) //Patrol: <<969.6483, -2160.4150, 28.4750>>, 178.3322
createEnemy(sEnemyIntroCut[9], <<969.2003, -2164.1885, 28.4756>>, 187.7889, WEAPONTYPE_SMG, G_M_M_CHIGOON_01) //Patrol: <<997.3615, -2168.5959, 28.4752>>, 358.6634
INT i
REPEAT COUNT_OF(sEnemyIntroCut) i
IF DOES_ENTITY_EXIST(sEnemyIntroCut[i].pedIndex)
//RETAIN_ENTITY_IN_INTERIOR(sEnemyIntroCut[i].pedIndex, intAbattoir)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sEnemyIntroCut[i].pedIndex, TRUE)
ENDIF
ENDREPEAT
#IF IS_DEBUG_BUILD
REPEAT COUNT_OF(sEnemyIntroCut) i
IF NOT IS_PED_INJURED(sEnemyIntroCut[i].pedIndex)
ASSIGN_DEBUG_NAMES(sEnemyIntroCut[i].pedIndex, "IntroCut ", i)
sEnemyIntroCut[i].sDebugName = CONCATENATE_STRINGS("IntroCut ", GET_STRING_FROM_INT(i))
ENDIF
ENDREPEAT
#ENDIF
//Enemy (Outside)
createEnemy(sEnemyOutside[0], <<951.0605, -2184.5310, 29.5517>>, 24.5982, WEAPONTYPE_PISTOL)
SET_PED_COMPONENT_VARIATION(sEnemyOutside[0].pedIndex, PED_COMP_HAIR, 2, 0)
SET_PED_COMBAT_ATTRIBUTES(sEnemyOutside[0].pedIndex, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, TRUE)
SET_PED_COMBAT_ATTRIBUTES(sEnemyOutside[0].pedIndex, CA_OPEN_COMBAT_WHEN_DEFENSIVE_AREA_IS_REACHED, TRUE)
SET_PED_SPHERE_DEFENSIVE_AREA(sEnemyOutside[0].pedIndex, <<953.1196, -2190.9177, 29.5518>>, 2.0)
//SET_PED_RELATIONSHIP_GROUP_HASH(sEnemyOutside[0].pedIndex, relGroupPassive)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sEnemyOutside[0].pedIndex, TRUE)
SET_LABEL_AS_TRIGGERED("sEnemyOutside[0]Blocking", TRUE)
// createEnemy(sEnemyOutside[1], <<962.5493, -2166.0269, 36.0140>>, 179.9051, WEAPONTYPE_PISTOL)
// sEnemyOutside[1].vLocate[0] = <<948.549438,-2178.816895,32.051651>> sEnemyOutside[1].vLocSize[0] = <<12.0, 10.0 ,2.5>> sEnemyOutside[1].eAdvanceStyle[0] = GUN_TO_POINT sEnemyOutside[1].vPoint[0] = <<955.2181, -2169.3628, 35.9913>>
createEnemy(sEnemyOutside[2], <<951.1171, -2183.3445, 29.5517>>, 186.0809, WEAPONTYPE_PISTOL)
SET_PED_COMBAT_ATTRIBUTES(sEnemyOutside[2].pedIndex, CA_OPEN_COMBAT_WHEN_DEFENSIVE_AREA_IS_REACHED, TRUE)
SET_PED_COMBAT_ATTRIBUTES(sEnemyOutside[2].pedIndex, CA_MOVE_TO_LOCATION_BEFORE_COVER_SEARCH, TRUE)
SET_PED_SPHERE_DEFENSIVE_AREA(sEnemyOutside[2].pedIndex, <<954.4744, -2186.4724, 29.5518>>, 2.0)
//SET_PED_RELATIONSHIP_GROUP_HASH(sEnemyOutside[2].pedIndex, relGroupPassive)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sEnemyOutside[2].pedIndex, TRUE)
SET_LABEL_AS_TRIGGERED("sEnemyOutside[2]Blocking", TRUE)
#IF IS_DEBUG_BUILD
REPEAT COUNT_OF(sEnemyOutside) i
IF NOT IS_PED_INJURED(sEnemyOutside[i].pedIndex)
ASSIGN_DEBUG_NAMES(sEnemyOutside[i].pedIndex, "Outside ", i)
sEnemyOutside[i].sDebugName = CONCATENATE_STRINGS("Outside ", GET_STRING_FROM_INT(i))
ENDIF
ENDREPEAT
#ENDIF
//Particles
//Cam
IF NOT DOES_CAM_EXIST(camMain)
camMain = CREATE_CAM("DEFAULT_SCRIPTED_CAMERA", TRUE)
ENDIF
#IF IS_DEBUG_BUILD
IF bAutoSkipping = FALSE
#ENDIF
IF NOT bReplaySkip
REQUEST_CUTSCENE("MIC_2_MCS_1")
ENDIF
//SET_RADIO_AUTO_UNFREEZE(TRUE)
#IF IS_DEBUG_BUILD
ENDIF
#ENDIF
//[MF] Setup Franklin To Michael switch so it's ready to start playback.
eSwitchCamState = SWITCH_CAM_SETUP_SPLINE
IF SKIPPED_STAGE()
SET_PED_POSITION(PLAYER_PED(CHAR_FRANKLIN), <<-24.2141, -1448.7147, 29.6236>>, 150.7758)
MAKE_SELECTOR_PED_SELECTION(sSelectorPeds, SELECTOR_PED_MICHAEL)
TAKE_CONTROL_OF_SELECTOR_PED(sSelectorPeds)
SET_PED_POSITION(PLAYER_PED_ID(), vPlayerStart, fPlayerStart)
IF NOT bReplaySkip
LOAD_SCENE_ADV(<<997.8495, -2178.1909, 31.5116>>, 40.0)
ENDIF
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(-10)
//Audio
PLAY_AUDIO(MIC2_FIND_MIKE_RT)
SAFE_SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
IF g_bShitskipAccepted = TRUE
bReplaySkip = FALSE
ENDIF
// IF bReplaySkip = FALSE
// IF IS_SCREEN_FADED_OUT()
// DO_SCREEN_FADE_IN(500)
// ENDIF
// ENDIF
ENDIF
ELSE
//Request Cutscene Variations - MIC_2_MCS_1
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
SET_STORED_PLAYER_PED_CUTSCENE_VARIATIONS(CHAR_MICHAEL, "Michael") //SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", PLAYER_PED(CHAR_MICHAEL))
// SET_CUTSCENE_PED_COMPONENT_VARIATION("Michael", PED_COMP_HAIR, g_savedGlobals.sPlayerData.sInfo.sVariations[CHAR_MICHAEL].iDrawableVariation[PED_COMP_HAIR], g_savedGlobals.sPlayerData.sInfo.sVariations[CHAR_MICHAEL].iTextureVariation[PED_COMP_HAIR])
// SET_CUTSCENE_PED_COMPONENT_VARIATION("Michael", PED_COMP_HEAD, g_savedGlobals.sPlayerData.sInfo.sVariations[CHAR_MICHAEL].iDrawableVariation[PED_COMP_HEAD], g_savedGlobals.sPlayerData.sInfo.sVariations[CHAR_MICHAEL].iTextureVariation[PED_COMP_HEAD])
// SET_CUTSCENE_PED_COMPONENT_VARIATION("Michael", PED_COMP_BERD, g_savedGlobals.sPlayerData.sInfo.sVariations[CHAR_MICHAEL].iDrawableVariation[PED_COMP_BERD], g_savedGlobals.sPlayerData.sInfo.sVariations[CHAR_MICHAEL].iTextureVariation[PED_COMP_BERD])
SET_CUTSCENE_PED_COMPONENT_VARIATION("Michael", PED_COMP_TORSO, 19, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Michael", PED_COMP_LEG, 0, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Michael", PED_COMP_HAND, 0, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Michael", PED_COMP_FEET, 0, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Michael", PED_COMP_TEETH, 0, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Michael", PED_COMP_SPECIAL, 0, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Michael", PED_COMP_SPECIAL2, 0, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Michael", PED_COMP_DECL, 0, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Michael", PED_COMP_JBIB, 0, 0)
SET_CUTSCENE_PED_PROP_VARIATION("Michael", ANCHOR_HEAD, -1)
SET_CUTSCENE_PED_PROP_VARIATION("Michael", ANCHOR_EYES, -1)
SET_CUTSCENE_PED_PROP_VARIATION("Michael", ANCHOR_EARS, -1)
SET_CUTSCENE_PED_PROP_VARIATION("Michael", ANCHOR_MOUTH, -1)
SET_CUTSCENE_PED_PROP_VARIATION("Michael", ANCHOR_LEFT_HAND, -1)
SET_CUTSCENE_PED_PROP_VARIATION("Michael", ANCHOR_RIGHT_HAND, -1)
SET_CUTSCENE_PED_PROP_VARIATION("Michael", ANCHOR_LEFT_WRIST, -1)
SET_CUTSCENE_PED_PROP_VARIATION("Michael", ANCHOR_RIGHT_WRIST, -1)
SET_CUTSCENE_PED_PROP_VARIATION("Michael", ANCHOR_HIP, -1)
// SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Chinese_gunman", sEnemyIntroCut[0].pedIndex)
ENDIF
// IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[CHAR_MICHAEL])
// IF NOT SAFE_IS_PLAYER_CONTROL_ON()
// SAFE_SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
// ENDIF
// ENDIF
//
// IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[CHAR_FRANKLIN])
// SAFE_SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
// ENDIF
//Rail
// IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
// AND NOT IS_PLAYER_SWITCH_IN_PROGRESS()
// AND NOT (DOES_CAM_EXIST(sCamDetails.camID)
// AND (IS_CAM_ACTIVE(sCamDetails.camID)
// OR IS_CAM_RENDERING(sCamDetails.camID)))
// SET_RAIL_FINAL_NODE(40)
// ELSE
// SET_RAIL_FINAL_NODE(31)
// ENDIF
// IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
// IF iCutsceneStage > 0 AND iCutsceneStage < 3
// IF IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED_WITH_DELAY()
// CLEAR_TEXT()
// SET_LABEL_AS_TRIGGERED("MCH2_INT1", TRUE)
// SET_LABEL_AS_TRIGGERED("MCH2_INT2", TRUE)
// SET_LABEL_AS_TRIGGERED("INTRO2", TRUE)
//
// SETTIMERA(7000)
//
// iCutsceneStage = 3
// ENDIF
// ENDIF
// ENDIF
SWITCH iCutsceneStage
CASE 0
SET_PED_RESET_FLAG(PLAYER_PED(CHAR_MICHAEL), PRF_AllowUpdateIfNoCollisionLoaded, TRUE)
IF bReplaySkip = TRUE
OR HAS_THIS_CUTSCENE_LOADED("MIC_2_MCS_1")
OVERRIDE_LODSCALE_THIS_FRAME(1.0)
IF NOT IS_SCREEN_FADED_OUT()
AND NOT HAS_LABEL_BEEN_TRIGGERED("SHAPETEST[RAN]")
AND NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED(CHAR_FRANKLIN))
BOOL bShapeTest
SHAPETEST_INDEX shapeTest
SHAPETEST_STATUS shapeTestStatus
INT bShapeTestHitSomething
VECTOR vShapeTestPos
VECTOR vShapeTestNormal
ENTITY_INDEX shapeTestEntityIndex
shapeTest = START_SHAPE_TEST_CAPSULE(GET_ENTITY_COORDS(PLAYER_PED(CHAR_FRANKLIN)), GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(PLAYER_PED(CHAR_FRANKLIN), <<0.0, 2.5, 0.0>>), 0.5, DEFAULT, PLAYER_PED(CHAR_FRANKLIN))
PRINTLN("SHAPETEST[STARTING]")
WHILE NOT bShapeTest
shapeTestStatus = GET_SHAPE_TEST_RESULT(shapeTest, bShapeTestHitSomething, vShapeTestPos, vShapeTestNormal, shapeTestEntityIndex)
PRINTLN("SHAPETEST[RUNNING]")
IF shapeTestStatus != SHAPETEST_STATUS_RESULTS_NOTREADY
IF shapeTestStatus = SHAPETEST_STATUS_RESULTS_READY
PRINTLN("SHAPETEST[SHAPETEST_STATUS_RESULTS_READY]")
ELIF shapeTestStatus = SHAPETEST_STATUS_NONEXISTENT
PRINTLN("SHAPETEST[SHAPETEST_STATUS_NONEXISTENT]")
ENDIF
PRINTLN("SHAPETEST[HitSomething=", bShapeTestHitSomething, "]")
PRINTLN("SHAPETEST[shapeTestEntityIndex=", DOES_ENTITY_EXIST(shapeTestEntityIndex), "]")
IF bShapeTestHitSomething = 1
OR DOES_ENTITY_EXIST(shapeTestEntityIndex)
PRINTLN("SHAPETEST[TRUE]")
SET_LABEL_AS_TRIGGERED("SHAPETEST[TRUE]", TRUE)
ENDIF
bShapeTest = !bShapeTest
SET_LABEL_AS_TRIGGERED("SHAPETEST[RAN]", TRUE)
ENDIF
WAIT_WITH_DEATH_CHECKS(0)
ENDWHILE
ENDIF
IF NOT IS_SCREEN_FADED_OUT()
IF (IS_PED_IN_ANY_VEHICLE(PLAYER_PED(CHAR_FRANKLIN)) AND bFrankToMikeSwitchCam2 = FALSE)
OR bFrankToMikeSwitchCam = TRUE
bFrankToMikeSwitchComplete = HANDLE_SWITCH_CAM_FRANKLIN_TO_MICHAEL(scsSwitchCam_FranklinInCarToMichael)
bFrankToMikeSwitchCam = TRUE
ELSE
bFrankToMikeSwitchComplete = HANDLE_SWITCH_CAM_FRANKLIN_TO_MICHAEL(scsSwitchCam_FranklinToMichael)
bFrankToMikeSwitchCam2 = TRUE
ENDIF
ENDIF
IF IS_SCREEN_FADED_OUT() //[MF] Assuming we're starting from a z-skip or other case where we don't want to play the switch cam.
OR bFrankToMikeSwitchComplete
//[MF] Incase we're transitioning from a Z-skip
IF IS_SCREEN_FADED_OUT()
//[MF]Put Franklin in his car
IF DOES_ENTITY_EXIST(vehFranklin)
AND NOT IS_ENTITY_DEAD(vehFranklin)
AND GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED(CHAR_FRANKLIN), vehFranklin)
SET_PED_INTO_VEHICLE(PLAYER_PED(CHAR_FRANKLIN), vehFranklin)
PRINTLN("SET FRANKLIN INTO HIS CAR")
ENDIF
ENDIF
ENDIF
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
IF NOT bReplaySkip
IF NOT IS_CUTSCENE_PLAYING()
DETACH_ENTITY(PLAYER_PED(CHAR_MICHAEL))
DETACH_ENTITY(objChain)
DETACH_ENTITY(objPadlock)
REGISTER_ENTITY_FOR_CUTSCENE(PLAYER_PED(CHAR_MICHAEL), "Michael", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, GET_PLAYER_PED_MODEL(CHAR_MICHAEL), CEO_PRESERVE_FACE_BLOOD_DAMAGE | CEO_PRESERVE_BODY_BLOOD_DAMAGE)
REGISTER_ENTITY_FOR_CUTSCENE(sEnemyIntroCut[0].pedIndex, "Chinese_gunman", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
REGISTER_ENTITY_FOR_CUTSCENE(objHook, "Meathook", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
REGISTER_ENTITY_FOR_CUTSCENE(objChain, "Leg_Chain", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
REGISTER_ENTITY_FOR_CUTSCENE(objPadlock, "Padlock", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
// REPLAY_RECORD_BACK_FOR_TIME(3.0)
START_CUTSCENE()
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
ENDIF
ENDIF
SAFE_DELETE_PED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
//Audio
PLAY_AUDIO(MIC2_START)
bFrankToMikeSwitchComplete = FALSE
SET_ENTITY_LOAD_COLLISION_FLAG(PLAYER_PED(CHAR_FRANKLIN), TRUE)
ADVANCE_CUTSCENE()
ELSE
IF DOES_CAM_EXIST(scsSwitchCam_FranklinToMichael.ciSpline)
IF GET_CAM_SPLINE_NODE_INDEX(scsSwitchCam_FranklinToMichael.ciSpline) > scsSwitchCam_FranklinToMichael.iCamSwitchFocusNode
IF DOES_ENTITY_EXIST(vehFranklin)
AND NOT IS_ENTITY_DEAD(vehFranklin)
AND GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED(CHAR_FRANKLIN), vehFranklin)
SET_PED_INTO_VEHICLE(PLAYER_PED(CHAR_FRANKLIN), vehFranklin)
PRINTLN("SET FRANKLIN INTO HIS CAR")
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE 1
SET_PED_RESET_FLAG(PLAYER_PED(CHAR_MICHAEL), PRF_AllowUpdateIfNoCollisionLoaded, TRUE)
//Fade
IF NOT WAS_CUTSCENE_SKIPPED()
AND bReplaySkip = FALSE
IF IS_SCREEN_FADED_OUT()
DO_SCREEN_FADE_IN(500)
ENDIF
ENDIF
//[MF] destroy old switch cam if it still exists
IF DOES_SWITCH_CAM_EXIST(scsSwitchCam_FranklinToMichael)
DESTROY_SWITCH_CAM(scsSwitchCam_FranklinToMichael)
ENDIF
IF CAN_SET_EXIT_STATE_FOR_CAMERA(TRUE)
IF NOT DOES_CAM_EXIST(camMain)
camMain = CREATE_CAM("DEFAULT_SCRIPTED_CAMERA", TRUE)
ENDIF
SET_CAM_ACTIVE(camMain, TRUE)
SET_CAM_PARAMS(camMain,
<<995.944946,-2170.087158,31.105616>>,
<<1.338266,0.000000,-174.621979>>,
26.994741)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
REPLAY_STOP_EVENT()
REPLAY_RECORD_BACK_FOR_TIME(0.0, 8.0, REPLAY_IMPORTANCE_HIGHEST)
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Chinese_gunman")
OR bReplaySkip = TRUE
IF DOES_ENTITY_EXIST(sEnemyIntroCut[0].pedIndex)
IF NOT IS_PED_INJURED(sEnemyIntroCut[0].pedIndex)
IF NOT HAS_LABEL_BEEN_TRIGGERED("UpdateChineseGunman")
IF NOT IS_ENTITY_PLAYING_ANIM(sEnemyIntroCut[0].pedIndex, sAnimDictMic2Smoking, "smoking_loop")
SET_PED_POSITION(sEnemyIntroCut[0].pedIndex, <<996.9860, -2185.0713, 28.9775>>, 9.6956)
//SET_PED_ON_GROUND_PROPERLY(sEnemyIntroCut[0].pedIndex)
TASK_PLAY_ANIM(sEnemyIntroCut[0].pedIndex, sAnimDictMic2Smoking, "smoking_loop", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING)
SET_CURRENT_PED_WEAPON(sEnemyIntroCut[0].pedIndex, WEAPONTYPE_UNARMED, TRUE)
FORCE_PED_AI_AND_ANIMATION_UPDATE(sEnemyIntroCut[0].pedIndex)
SET_LABEL_AS_TRIGGERED("UpdateChineseGunman", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Meathook")
OR bReplaySkip = TRUE
SET_ENTITY_COORDS_NO_OFFSET(objHook, sRailNodes[0].vPos)
SET_ENTITY_ROTATION(objHook, sRailNodes[0].vRot)
FREEZE_ENTITY_POSITION(objHook, TRUE)
FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(objHook)
IF sfxRail = -1
sfxRail = GET_SOUND_ID()
PLAY_SOUND_FROM_ENTITY(sfxRail, "Rail_Loop_Skip_Start", objHook, "MICHAEL_2_SOUNDS")
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Leg_Chain")
ATTACH_ENTITY_TO_ENTITY(objChain, objHook, -1, vChainOffset, vChainRotation)
FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(objChain)
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Leg_Chain^1")
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Padlock")
ATTACH_ENTITY_TO_ENTITY(objPadlock, objHook, -1, vPadlockOffset, vPadlockRotation)
FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(objPadlock)
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michael")
OR bReplaySkip = TRUE
//Attach Michael to hook
ATTACH_ENTITY_TO_ENTITY(PLAYER_PED(CHAR_MICHAEL), objHook, 0, vMichaelAttachOffset, <<0.0, 0.0, 180.0>>, TRUE, TRUE)
TASK_PLAY_ANIM(PLAYER_PED(CHAR_MICHAEL), sAnimDictMic2Hook, "michael_meat_hook_react_c", INSTANT_BLEND_IN, REALLY_SLOW_BLEND_OUT, -1, AF_HOLD_LAST_FRAME | AF_NOT_INTERRUPTABLE, 0.5) //TASK_PLAY_ANIM(PLAYER_PED(CHAR_MICHAEL), sAnimDictHang, "idle", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1, AF_LOOPING)
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED(CHAR_MICHAEL))
bOkToHangFromHook = TRUE
bOkToMoveRail = TRUE
bOkToSwitch = TRUE
bDoMikeToFranklinCustomSwitch = TRUE
UPDATE_RAIL_MOVE()
PRINTLN("Michael EXIT STATE")
ENDIF
IF HAS_CUTSCENE_FINISHED()
OR bReplaySkip = TRUE
eSwitchCamState = SWITCH_CAM_REQUEST_ASSETS
HANDLE_SWITCH_CAM_MICHAEL_TO_FRANKLIN(scsSwitchCam_MichaelToFranklin)
eSwitchCamState = SWITCH_CAM_SETUP_SPLINE
IF DOES_ENTITY_EXIST(sEnemyIntroCut[0].pedIndex)
IF NOT IS_PED_INJURED(sEnemyIntroCut[0].pedIndex)
IF NOT HAS_LABEL_BEEN_TRIGGERED("UpdateChineseGunman")
IF NOT IS_ENTITY_PLAYING_ANIM(sEnemyIntroCut[0].pedIndex, sAnimDictMic2Smoking, "smoking_loop")
SET_PED_POSITION(sEnemyIntroCut[0].pedIndex, <<996.9860, -2185.0713, 28.9775>>, 9.6956)
//SET_PED_ON_GROUND_PROPERLY(sEnemyIntroCut[0].pedIndex)
TASK_PLAY_ANIM(sEnemyIntroCut[0].pedIndex, sAnimDictMic2Smoking, "smoking_loop", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING)
SET_CURRENT_PED_WEAPON(sEnemyIntroCut[0].pedIndex, WEAPONTYPE_UNARMED, TRUE)
FORCE_PED_AI_AND_ANIMATION_UPDATE(sEnemyIntroCut[0].pedIndex)
SET_LABEL_AS_TRIGGERED("UpdateChineseGunman", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
HIDE_CELLPHONE_SIGNIFIERS_FOR_CUTSCENE(FALSE)
DISABLE_CELLPHONE(FALSE)
bRadar = TRUE
ADVANCE_CUTSCENE()
ENDIF
BREAK
CASE 2
ADVANCE_CUTSCENE()
BREAK
CASE 3
//Stats
INFORM_MISSION_STATS_SYSTEM_OF_TIME_WINDOW_OPEN(MIC2_MIKE_RESCUE_TIMER)
ADVANCE_CUTSCENE()
BREAK
CASE 4
ADVANCE_CUTSCENE()
BREAK
CASE 5
IF DOES_CAM_EXIST(camMain)
SET_CAM_PARAMS(camMain, //Camera 1
GET_INTERP_POINT_VECTOR(<<995.944946,-2170.087158,31.105616>>, <<996.894836,-2169.905273,31.103991>>, 0, 8000 * 2, TO_FLOAT(TIMERA())),
GET_INTERP_POINT_VECTOR(<<1.338266,0.000000,-174.621979>>, <<-1.324255,0.000000,-165.109879>>, 0, 8000 * 2, TO_FLOAT(TIMERA())),
GET_INTERP_POINT_FLOAT(26.994741, 26.994741, 0, 8000 * 2, TO_FLOAT(TIMERA())))
ENDIF
IF TIMERA() > 500
IF IS_SCREEN_FADED_OUT()
DO_SCREEN_FADE_IN(500)
ENDIF
ENDIF
IF TIMERA() > 8000 * 2
IF HAS_ANIM_DICT_LOADED("shake_cam_all@")
ANIMATED_SHAKE_CAM(camMain, "shake_cam_all@", "light", "", 1.0)
ENDIF
ADVANCE_CUTSCENE()
ENDIF
BREAK
CASE 6
SET_CAM_PARAMS(camMain, //Camera 2 - Range = (0 to 2000 * 2)
GET_INTERP_POINT_VECTOR(<<998.115906, -2178.469971, 31.164551>>, <<998.277161, -2174.949463, 31.030722>>, 0, (2000 * 2) + (11000 * 2), TO_FLOAT(TIMERA())),
GET_INTERP_POINT_VECTOR(<<-2.174487, 0.0, -2.626945>>, <<-0.057604, 0.0, -2.078272>>, 0, (2000 * 2) + (11000 * 2), TO_FLOAT(TIMERA())),
GET_INTERP_POINT_FLOAT(36.612831, 36.612831, 0, (2000 * 2) + (11000 * 2), TO_FLOAT(TIMERA())))
IF TIMERA() > 2000 * 2
IF NOT IS_PED_INJURED(sEnemyIntroCut[0].pedIndex)
OPEN_SEQUENCE_TASK(seqMain)
TASK_CLEAR_LOOK_AT(NULL)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<982.7635, -2169.8921, 29.6195>>, 0.5, -1, 0.5)
TASK_ACHIEVE_HEADING(NULL, 1.9956)
TASK_LOOK_AT_ENTITY(NULL, PLAYER_PED(CHAR_MICHAEL), -1)
CLOSE_SEQUENCE_TASK(seqMain)
TASK_PERFORM_SEQUENCE(sEnemyIntroCut[0].pedIndex, seqMain)
CLEAR_SEQUENCE_TASK(seqMain)
ENDIF
IF NOT IS_PED_INJURED(sEnemyIntroCut[1].pedIndex)
OPEN_SEQUENCE_TASK(seqMain)
TASK_CLEAR_LOOK_AT(NULL)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<983.6574, -2169.6614, 29.6194>>, 0.5, -1, 0.5)
TASK_ACHIEVE_HEADING(NULL, 1.9956)
TASK_LOOK_AT_ENTITY(NULL, PLAYER_PED(CHAR_MICHAEL), -1)
CLOSE_SEQUENCE_TASK(seqMain)
TASK_PERFORM_SEQUENCE(sEnemyIntroCut[1].pedIndex, seqMain)
CLEAR_SEQUENCE_TASK(seqMain)
ENDIF
ADVANCE_CUTSCENE()
ENDIF
BREAK
CASE 7
SET_CAM_PARAMS(camMain, //Camera 2 cont. - Range = (2000 * 2 to 11000 * 2)
GET_INTERP_POINT_VECTOR(<<998.115906, -2178.469971, 31.164551>>, <<998.277161, -2174.949463, 31.030722>>, 0, (2000 * 2) + (11000 * 2), TO_FLOAT(TIMERA() + (2000 * 2))),
GET_INTERP_POINT_VECTOR(<<-2.174487, 0.0, -2.626945>>, <<-0.057604, 0.0, -2.078272>>, 0, (2000 * 2) + (11000 * 2), TO_FLOAT(TIMERA() + (2000 * 2))),
GET_INTERP_POINT_FLOAT(36.612831, 36.612831, 0, (2000 * 2) + (11000 * 2), TO_FLOAT(TIMERA() + (2000 * 2))))
IF TIMERA() > 11000 * 2
ADVANCE_CUTSCENE()
ENDIF
BREAK
CASE 8
SET_CAM_PARAMS(camMain, //Camera 3
GET_INTERP_POINT_VECTOR(<<999.704102,-2170.810303,31.299297>>, <<995.043762,-2170.193115,30.922483>>, 0, 11000 * 2, TO_FLOAT(TIMERA())),
GET_INTERP_POINT_VECTOR(<<-4.819607,0.134012,73.641083>>, <<-1.248098,0.134012,75.161530>>, 0, 11000 * 2, TO_FLOAT(TIMERA())),
GET_INTERP_POINT_FLOAT(49.755203, 49.755203, 0, 11000 * 2, TO_FLOAT(TIMERA())))
IF TIMERA() > 11000 * 2
ADVANCE_CUTSCENE()
ENDIF
BREAK
CASE 9
SET_CAM_PARAMS(camMain,
GET_INTERP_POINT_VECTOR(<<992.238770,-2172.430420,31.089552>>, <<988.114502,-2171.906006,31.098305>>, 0, 9000 * 2, TO_FLOAT(TIMERA())),
GET_INTERP_POINT_VECTOR(<<-3.338497,0.120910,-7.401173>>, <<-3.338496,0.120910,-5.875839>>, 0, 9000 * 2, TO_FLOAT(TIMERA())),
GET_INTERP_POINT_FLOAT(43.777863, 43.777863, 0, 9000 * 2, TO_FLOAT(TIMERA())))
IF TIMERA() > 9000 * 2
ADVANCE_CUTSCENE()
ENDIF
BREAK
CASE 10
SET_CAM_PARAMS(camMain,
GET_INTERP_POINT_VECTOR(<<983.821472,-2171.255615,30.270624>>, <<980.964600,-2170.211670,30.421558>>, 0, 10000 * 2, TO_FLOAT(TIMERA())),
GET_INTERP_POINT_VECTOR(<<8.599643,-0.371932,-67.799362>>, <<5.847109,0.120910,-68.360344>>, 0, 10000 * 2, TO_FLOAT(TIMERA())),
GET_INTERP_POINT_FLOAT(32.738300, 43.777863, 0, 10000 * 2, TO_FLOAT(TIMERA())))
IF TIMERA() > 7000 * 2
ADVANCE_CUTSCENE()
ENDIF
BREAK
CASE 11
SET_CAM_PARAMS(camMain,
GET_INTERP_POINT_VECTOR(<<978.0251, -2166.5701, 32.8924>>, <<973.6019, -2166.4131, 32.8924>>, 0, 10000 * 2, TO_FLOAT(TIMERA())),
GET_INTERP_POINT_VECTOR(<<-11.5991, 0.0000, -109.7861>>, <<-11.5991, 0.0000, -109.8682>>, 0, 10000 * 2, TO_FLOAT(TIMERA())),
GET_INTERP_POINT_FLOAT(30.4727, 30.4727, 0, 10000 * 2, TO_FLOAT(TIMERA())))
IF TIMERA() > 9500 * 2
ADVANCE_CUTSCENE()
ENDIF
BREAK
CASE 12
SET_CAM_PARAMS(camMain,
GET_INTERP_POINT_VECTOR(<<969.461731,-2170.036377,30.004295>>, <<968.464966,-2168.176270,30.004295>>, 0, 13000 * 2, TO_FLOAT(TIMERA())),
GET_INTERP_POINT_VECTOR(<<8.817223,-0.000000,-75.833801>>, <<8.817223,-0.000000,-75.833801>>, 0, 13000 * 2, TO_FLOAT(TIMERA())),
GET_INTERP_POINT_FLOAT(32.738300, 32.738300, 0, 13000 * 2, TO_FLOAT(TIMERA())))
IF TIMERA() > 12500 * 2
ADVANCE_CUTSCENE()
ENDIF
BREAK
CASE 13
SET_CAM_PARAMS(camMain,
GET_INTERP_POINT_VECTOR(<<967.195313,-2170.564453,33.671185>>, <<967.195313,-2170.564453,31.921423>>, 0, 13000 * 2, TO_FLOAT(TIMERA())),
GET_INTERP_POINT_VECTOR(<<-14.831502,-0.000000,-70.284996>>, <<-5.630730,-0.000001,-31.627630>>, 0, 13000 * 2, TO_FLOAT(TIMERA())),
GET_INTERP_POINT_FLOAT(25.751530, 33.373501, 0, 13000 * 2, TO_FLOAT(TIMERA())))
IF TIMERA() > 13000 * 2
IF NOT IS_PED_INJURED(sEnemyIntroCut[5].pedIndex)
OPEN_SEQUENCE_TASK(seqMain)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<978.9319, -2157.5186, 29.6194>>, PEDMOVE_WALK, -1, 0.5)
TASK_ACHIEVE_HEADING(NULL, 105.8316)
CLOSE_SEQUENCE_TASK(seqMain)
TASK_PERFORM_SEQUENCE(sEnemyIntroCut[5].pedIndex, seqMain)
ENDIF
SET_CAM_PARAMS(camMain,
<<965.011719,-2162.894287,29.411800>>,
<<9.375818,-0.000001,-101.021996>>,
45.0,
0)
POINT_CAM_AT_COORD(camMain, GET_ENTITY_COORDS(objHook) - <<0.0, 0.0, 2.5>>)
ADVANCE_CUTSCENE()
ENDIF
BREAK
CASE 14
POINT_CAM_AT_COORD(camMain, GET_ENTITY_COORDS(objHook) - <<0.0, 0.0, 2.5>>)
IF TIMERA() > 13500 * 2
IF DOES_CAM_EXIST(camMain)
STOP_CAM_POINTING(camMain)
ENDIF
ADVANCE_CUTSCENE()
ENDIF
BREAK
CASE 15
SET_CAM_PARAMS(camMain,
GET_INTERP_POINT_VECTOR(<<974.405823,-2155.704590,29.089001>>, <<974.405823,-2155.704590,29.089001>>, 0, 10000 * 2, TO_FLOAT(TIMERA())),
GET_INTERP_POINT_VECTOR(<<22.455841,-0.000001,126.167778>>, <<22.455843,-0.000000,165.535431>>, 0, 10000 * 2, TO_FLOAT(TIMERA())),
GET_INTERP_POINT_FLOAT(33.373501, 33.373501, 0, 10000 * 2, TO_FLOAT(TIMERA())))
IF TIMERA() > 10000 * 2
ADVANCE_CUTSCENE()
ENDIF
BREAK
CASE 16
SET_CAM_PARAMS(camMain,
GET_INTERP_POINT_VECTOR(<<980.607300,-2156.581787,32.035435>>, <<981.430054,-2157.140869,32.099709>>, 0, 10000 * 2, TO_FLOAT(TIMERA())),
GET_INTERP_POINT_VECTOR(<<-6.997153,0.000000,117.716827>>, <<-6.997152,0.000000,115.624878>>, 0, 10000 * 2, TO_FLOAT(TIMERA())),
GET_INTERP_POINT_FLOAT(30.322689, 30.322689, 0, 10000 * 2, TO_FLOAT(TIMERA())))
IF TIMERA() > 10000 * 2
ADVANCE_CUTSCENE()
ENDIF
BREAK
CASE 17
SET_CAM_PARAMS(camMain,
GET_INTERP_POINT_VECTOR(<<976.429810,-2161.189453 + 0.2,28.865499>>, <<979.780518,-2161.445801 + 0.2,28.865499>>, 0, 12000 * 2, TO_FLOAT(TIMERA())),
GET_INTERP_POINT_VECTOR(<<46.458088,0.000003,-62.346085>>, <<46.458088,0.000003,-62.346085>>, 0, 12000 * 2, TO_FLOAT(TIMERA())),
GET_INTERP_POINT_FLOAT(36.598598, 36.598598, 0, 12000 * 2, TO_FLOAT(TIMERA())))
IF TIMERA() > 10000 * 2
ADVANCE_CUTSCENE()
ENDIF
BREAK
CASE 18
SET_CAM_PARAMS(camMain,
GET_INTERP_POINT_VECTOR(<<983.044556,-2164.222168,31.131218>>, <<985.341797,-2163.953613,31.142937>>, 0, 15000 * 2, TO_FLOAT(TIMERA())),
GET_INTERP_POINT_VECTOR(<<1.462163,-0.294281,7.502443>>, <<1.133829,-0.294281,-4.563818>>, 0, 15000 * 2, TO_FLOAT(TIMERA())),
GET_INTERP_POINT_FLOAT(34.916599, 34.916599, 0, 15000 * 2, TO_FLOAT(TIMERA())))
IF TIMERA() > 14000 * 2
SET_CAM_PARAMS(camMain,
<<986.355103,-2155.670166,31.569838>>,
<<-0.775808,-0.000000,-167.990448>>,
40.113567,
0)
POINT_CAM_AT_COORD(camMain, GET_ENTITY_COORDS(objHook) - <<0.0, 0.0, 2.5>>)
ADVANCE_CUTSCENE()
ENDIF
BREAK
CASE 19
POINT_CAM_AT_COORD(camMain, GET_ENTITY_COORDS(objHook) - <<0.0, 0.0, 2.5>>)
IF TIMERA() > 10000 * 2
STOP_CAM_POINTING(camMain)
ADVANCE_CUTSCENE()
ENDIF
BREAK
CASE 20
SET_CAM_PARAMS(camMain,
GET_INTERP_POINT_VECTOR(<<998.1546, -2155.2043, 30.5652>>, <<998.4847, -2156.0303, 30.5652>>, 0, 12000 * 2, TO_FLOAT(TIMERA())),
GET_INTERP_POINT_VECTOR(<<2.0353, 0.0000, 111.5716>>, <<2.0353, 0.0000, 111.5716>>, 0, 12000 * 2, TO_FLOAT(TIMERA())),
GET_INTERP_POINT_FLOAT(25.4629, 25.4629, 0, 12000 * 2, TO_FLOAT(TIMERA())))
#IF IS_DEBUG_BUILD IF #ENDIF
LOAD_STREAM("MIC_2_MICHAEL_CHOPPED_UP_MASTER")
#IF IS_DEBUG_BUILD PRINTLN("MIC_2_MICHAEL_CHOPPED_UP_MASTER - Loaded")
ELSE
PRINTLN("MIC_2_MICHAEL_CHOPPED_UP_MASTER - Loading...")
ENDIF #ENDIF
IF TIMERA() > 10000 * 2
ADVANCE_CUTSCENE()
ENDIF
BREAK
CASE 21
SET_CAM_PARAMS(camMain,
GET_INTERP_POINT_VECTOR(<<992.222351,-2158.235840,34.462818>>, <<992.181763,-2154.594238,34.462818>>, 0, 10000 * 2, TO_FLOAT(TIMERA())),
GET_INTERP_POINT_VECTOR(<<-64.751854,5.262573,-49.382565>>, <<-64.751854,5.262573,-49.382565>>, 0, 10000 * 2, TO_FLOAT(TIMERA())),
GET_INTERP_POINT_FLOAT(37.423904, 37.423904, 0, 10000 * 2, TO_FLOAT(TIMERA())))
#IF IS_DEBUG_BUILD IF #ENDIF
LOAD_STREAM("MIC_2_MICHAEL_CHOPPED_UP_MASTER")
#IF IS_DEBUG_BUILD PRINTLN("MIC_2_MICHAEL_CHOPPED_UP_MASTER - Loaded")
ELSE
PRINTLN("MIC_2_MICHAEL_CHOPPED_UP_MASTER - Loading...")
ENDIF #ENDIF
IF TIMERA() > 10000 * 2
ADVANCE_CUTSCENE()
ENDIF
BREAK
CASE 22
SET_CAM_PARAMS(camMain,
GET_INTERP_POINT_VECTOR(<<989.786743,-2145.830322,32.251602>>, <<989.792480,-2145.666260,32.267788>>, 0, 15000 * 2, TO_FLOAT(TIMERA())),
GET_INTERP_POINT_VECTOR(<<-8.540795,0.396388,-139.441086>>, <<-8.816824,0.396388,-129.708176>>, 0, 15000 * 2, TO_FLOAT(TIMERA())),
GET_INTERP_POINT_FLOAT(22.816650, 22.816650, 0, 15000 * 2, TO_FLOAT(TIMERA())))
#IF IS_DEBUG_BUILD IF #ENDIF
LOAD_STREAM("MIC_2_MICHAEL_CHOPPED_UP_MASTER")
#IF IS_DEBUG_BUILD PRINTLN("MIC_2_MICHAEL_CHOPPED_UP_MASTER - Loaded")
ELSE
PRINTLN("MIC_2_MICHAEL_CHOPPED_UP_MASTER - Loading...")
ENDIF #ENDIF
IF TIMERA() > 13000 * 2
ADVANCE_CUTSCENE()
ENDIF
BREAK
CASE 23
SET_CAM_PARAMS(camMain,
GET_INTERP_POINT_VECTOR(<<998.532532,-2154.596924,31.448441>>, <<997.954041,-2153.499023,31.398094>>, 0, 12000 * 2, TO_FLOAT(TIMERA())),
GET_INTERP_POINT_VECTOR(<<-1.786677,0.000000,13.967978>>, <<-0.549397,0.000000,-0.618225>>, 0, 12000 * 2, TO_FLOAT(TIMERA())),
GET_INTERP_POINT_FLOAT(32.833126, 32.833126, 0, 12000 * 2, TO_FLOAT(TIMERA())))
#IF IS_DEBUG_BUILD IF #ENDIF
LOAD_STREAM("MIC_2_MICHAEL_CHOPPED_UP_MASTER")
#IF IS_DEBUG_BUILD PRINTLN("MIC_2_MICHAEL_CHOPPED_UP_MASTER - Loaded")
ELSE
PRINTLN("MIC_2_MICHAEL_CHOPPED_UP_MASTER - Loading...")
ENDIF #ENDIF
IF TIMERA() > 6000 * 2
ADVANCE_CUTSCENE()
ENDIF
BREAK
CASE 24
SET_CAM_PARAMS(camMain,
GET_INTERP_POINT_VECTOR(<<998.532532,-2154.596924,31.448441>>, <<997.954041,-2153.499023,31.398094>>, 0, 12000 * 2, TO_FLOAT(TIMERA()) + (6000 * 2)),
GET_INTERP_POINT_VECTOR(<<-1.786677,0.000000,13.967978>>, <<-0.549397,0.000000,-0.618225>>, 0, 12000 * 2, TO_FLOAT(TIMERA()) + (6000 * 2)),
GET_INTERP_POINT_FLOAT(32.833126, 32.833126, 0, 12000 * 2, TO_FLOAT(TIMERA()) + (6000 * 2)))
#IF IS_DEBUG_BUILD IF #ENDIF
LOAD_STREAM("MIC_2_MICHAEL_CHOPPED_UP_MASTER")
#IF IS_DEBUG_BUILD PRINTLN("MIC_2_MICHAEL_CHOPPED_UP_MASTER - Loaded")
ELSE
PRINTLN("MIC_2_MICHAEL_CHOPPED_UP_MASTER - Loading...")
ENDIF #ENDIF
IF TIMERA() > 5000 * 2
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
PLAY_PED_AMBIENT_SPEECH(PLAYER_PED(CHAR_MICHAEL), "GENERIC_FRIGHTENED_HIGH", SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
ENDIF
ADVANCE_CUTSCENE()
ENDIF
BREAK
CASE 25
SET_CAM_PARAMS(camMain,
GET_INTERP_POINT_VECTOR(<<999.275269,-2133.896729,30.527813>>, <<998.915771,-2136.124023,30.771074>>, 0, 4000 * 2, TO_FLOAT(TIMERA())),
GET_INTERP_POINT_VECTOR(<<6.171403,0.000000,175.146454>>, <<4.129750,-0.000000,174.688812>>, 0, 4000 * 2, TO_FLOAT(TIMERA())),
GET_INTERP_POINT_FLOAT(31.021326, 31.021326, 0, 4000 * 2, TO_FLOAT(TIMERA())))
IF TIMERA() > 4000 * 2
TASK_PLAY_ANIM(PLAYER_PED(CHAR_MICHAEL), sAnimDictMic2Hook, "michael_meat_hook_minced", REALLY_SLOW_BLEND_IN, INSTANT_BLEND_OUT, -1, AF_HOLD_LAST_FRAME | AF_NOT_INTERRUPTABLE)
ADVANCE_CUTSCENE()
ENDIF
BREAK
CASE 26
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
AND (NOT IS_MESSAGE_BEING_DISPLAYED() OR GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) = 0)
IF TIMERA() > 1500 * 2
CREATE_CONVERSATION_ADV("MCH2_MINCE")
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("MIC_2_MICHAEL_CHOPPED_UP_MASTER")
IF LOAD_STREAM("MIC_2_MICHAEL_CHOPPED_UP_MASTER")
IF TIMERA() > 1500 * 2
PLAY_STREAM_FRONTEND()
SET_LABEL_AS_TRIGGERED("MIC_2_MICHAEL_CHOPPED_UP_MASTER", TRUE)
ENDIF
ELSE
PRINTLN("LOAD_STREAM('MIC_2_MICHAEL_CHOPPED_UP_MASTER') did not load in time!")
ENDIF
ENDIF
SET_CAM_PARAMS(camMain,
GET_INTERP_POINT_VECTOR(<<992.797363,-2142.922119,28.903460>>, <<993.104980,-2140.263184,28.906197>>, 0, 5000 * 2, TO_FLOAT(TIMERA())),
GET_INTERP_POINT_VECTOR(<<21.775642,0.063216,-99.448692>>, <<21.775642,0.063216,-94.619537>>, 0, 5000 * 2, TO_FLOAT(TIMERA())),
GET_INTERP_POINT_FLOAT(27.044939, 27.044939, 0, 5000 * 2, TO_FLOAT(TIMERA())))
IF TIMERA() > 4250 * 2
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
START_PARTICLE_FX_NON_LOOPED_ON_ENTITY("scr_abattoir_ped_sliced", PLAYER_PED_ID(), <<0.0, -0.1, 0.0>>, <<0.0, 0.0, 0.0>>, 1.0)
ADVANCE_CUTSCENE()
ENDIF
BREAK
CASE 27
SET_CAM_PARAMS(camMain,
GET_INTERP_POINT_VECTOR(<<992.797363,-2142.922119,28.903460>>, <<993.104980,-2140.263184,28.906197>>, 0, 5000 * 2, TO_FLOAT(TIMERA()) + (4250 * 2)),
GET_INTERP_POINT_VECTOR(<<21.775642,0.063216,-99.448692>>, <<21.775642,0.063216,-94.619537>>, 0, 5000 * 2, TO_FLOAT(TIMERA()) + (4250 * 2)),
GET_INTERP_POINT_FLOAT(27.044939, 27.044939, 0, 5000 * 2, TO_FLOAT(TIMERA()) + (4250 * 2)))
SET_CONTROL_SHAKE(PLAYER_CONTROL, 100, 100)
IF TIMERA() > 2000
#IF IS_DEBUG_BUILD AND bDebugMichaelDeathDoNotFail = FALSE #ENDIF
eMissionFail = failMichaelDied
missionFailed()
ENDIF
BREAK
ENDSWITCH
INT i
//Text
IF NOT sCamDetails.bRun
IF iCutsceneStage > 0
IF iCutsceneStage > 3
IF NOT HAS_LABEL_BEEN_TRIGGERED("MCH2_INTRO2")
ADD_PED_FOR_DIALOGUE(sPedsForConversation, 0, PLAYER_PED(CHAR_MICHAEL), "MICHAEL")
CREATE_CONVERSATION_ADV("MCH2_IG1", CONV_PRIORITY_MEDIUM, FALSE, DO_NOT_DISPLAY_SUBTITLES)
ENDIF
PRINT_ADV("MCH2_INTRO2")
IF NOT IS_CELLPHONE_DISABLED()
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN
AND (NOT DOES_CAM_EXIST(sCamDetails.camID)
OR (DOES_CAM_EXIST(sCamDetails.camID)
AND NOT IS_CAM_ACTIVE(sCamDetails.camID)))
IF NOT HAS_LABEL_BEEN_TRIGGERED("MCH2_INTRO3")
CLEAR_TEXT()
PRINT_ADV("MCH2_INTRO3")
PRINT_HELP_ADV("MCH2_INT3HLP2", TRUE, FALSE, DEFAULT_HELP_TEXT_TIME * 2)
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("MCH2_INT3HLP3")
IF HAS_LABEL_BEEN_TRIGGERED("MCH2_INT3HLP2")
IF NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("MCH2_INT3HLP2")
IF IS_CELLPHONE_TRACKIFY_IN_USE()
PRINT_HELP_ADV("MCH2_INT3HLP3")
ENDIF
ENDIF
ENDIF
ENDIF
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
AND IS_CAM_RENDERING(camMain)
IF NOT IS_MESSAGE_BEING_DISPLAYED()
AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF iDialogueStage = 0
IF GET_GAME_TIMER() > iDialogueTimer[0]
IF iDialogueLineCount[iDialogueStage] = -1
iDialogueLineCount[iDialogueStage] = 6 - 1 //One line plays alongside the god text
ENDIF
IF iDialogueLineCount[iDialogueStage] > 0
ADD_PED_FOR_DIALOGUE(sPedsForConversation, 0, PLAYER_PED(CHAR_MICHAEL), "MICHAEL")
CREATE_CONVERSATION_ADV("MCH2_IG1", CONV_PRIORITY_MEDIUM, FALSE)
iDialogueTimer[0] = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(12000, 15000)
iDialogueLineCount[iDialogueStage]--
ELIF iCutsceneStage < 25
PLAY_PED_AMBIENT_SPEECH(PLAYER_PED(CHAR_MICHAEL), "GENERIC_CURSE_HIGH", SPEECH_PARAMS_FORCE_SHOUTED_CLEAR) //also there is GENERIC_CURSE_MED
iDialogueTimer[0] = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(12000, 15000)
ENDIF
ENDIF
ELIF iDialogueStage = 1
IF NOT HAS_LABEL_BEEN_TRIGGERED("MCH2_HOOK1")
INT iClosest
REPEAT iEnemyIntroCut i
IF DOES_ENTITY_EXIST(sEnemyIntroCut[i].pedIndex)
AND NOT IS_PED_INJURED(sEnemyIntroCut[i].pedIndex)
IF NOT DOES_ENTITY_EXIST(sEnemyIntroCut[iClosest].pedIndex)
OR (DOES_ENTITY_EXIST(sEnemyIntroCut[iClosest].pedIndex)
AND IS_PED_INJURED(sEnemyIntroCut[iClosest].pedIndex))
OR (DOES_ENTITY_EXIST(sEnemyIntroCut[iClosest].pedIndex)
AND NOT IS_PED_INJURED(sEnemyIntroCut[iClosest].pedIndex)
OR GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sEnemyIntroCut[i].pedIndex)) < GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sEnemyIntroCut[iClosest].pedIndex, FALSE)))
iClosest = i
ENDIF
ENDIF
ENDREPEAT
IF DOES_ENTITY_EXIST(sEnemyIntroCut[iClosest].pedIndex)
AND NOT IS_PED_INJURED(sEnemyIntroCut[iClosest].pedIndex)
AND GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sEnemyIntroCut[iClosest].pedIndex)) < 10.0
ADD_PED_FOR_DIALOGUE(sPedsForConversation, 4, sEnemyIntroCut[iClosest].pedIndex, "MCH2CHIN2")
CREATE_CONVERSATION_ADV("MCH2_HOOK1")
iDialogueTimer[0] = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(25000, 25000)
ENDIF
ELIF NOT HAS_LABEL_BEEN_TRIGGERED("MCH2_HOOK2")
INT iClosest
REPEAT iEnemyIntroCut i
IF DOES_ENTITY_EXIST(sEnemyIntroCut[i].pedIndex)
AND NOT IS_PED_INJURED(sEnemyIntroCut[i].pedIndex)
IF NOT DOES_ENTITY_EXIST(sEnemyIntroCut[iClosest].pedIndex)
OR (DOES_ENTITY_EXIST(sEnemyIntroCut[iClosest].pedIndex)
AND IS_PED_INJURED(sEnemyIntroCut[iClosest].pedIndex))
OR (DOES_ENTITY_EXIST(sEnemyIntroCut[iClosest].pedIndex)
AND NOT IS_PED_INJURED(sEnemyIntroCut[iClosest].pedIndex)
OR GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sEnemyIntroCut[i].pedIndex)) < GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sEnemyIntroCut[iClosest].pedIndex, FALSE)))
iClosest = i
ENDIF
ENDIF
ENDREPEAT
IF DOES_ENTITY_EXIST(sEnemyIntroCut[iClosest].pedIndex)
AND NOT IS_PED_INJURED(sEnemyIntroCut[iClosest].pedIndex)
AND GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sEnemyIntroCut[iClosest].pedIndex)) < 10.0
ADD_PED_FOR_DIALOGUE(sPedsForConversation, 4, sEnemyIntroCut[iClosest].pedIndex, "MCH2CHIN2")
CREATE_CONVERSATION_ADV("MCH2_HOOK2")
iDialogueTimer[0] = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(20000, 25000)
ENDIF
ELSE
IF GET_GAME_TIMER() > iDialogueTimer[0]
IF iDialogueLineCount[iDialogueStage] = -1
iDialogueLineCount[iDialogueStage] = 6
ENDIF
IF iDialogueLineCount[iDialogueStage] > 0
INT iClosest
REPEAT iEnemyIntroCut i
IF DOES_ENTITY_EXIST(sEnemyIntroCut[i].pedIndex)
AND NOT IS_PED_INJURED(sEnemyIntroCut[i].pedIndex)
IF NOT DOES_ENTITY_EXIST(sEnemyIntroCut[iClosest].pedIndex)
OR (DOES_ENTITY_EXIST(sEnemyIntroCut[iClosest].pedIndex)
AND IS_PED_INJURED(sEnemyIntroCut[iClosest].pedIndex))
OR (DOES_ENTITY_EXIST(sEnemyIntroCut[iClosest].pedIndex)
AND NOT IS_PED_INJURED(sEnemyIntroCut[iClosest].pedIndex)
OR GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sEnemyIntroCut[i].pedIndex)) < GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sEnemyIntroCut[iClosest].pedIndex, FALSE)))
iClosest = i
ENDIF
ENDIF
ENDREPEAT
IF DOES_ENTITY_EXIST(sEnemyIntroCut[iClosest].pedIndex)
AND NOT IS_PED_INJURED(sEnemyIntroCut[iClosest].pedIndex)
AND GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sEnemyIntroCut[iClosest].pedIndex)) < 10.0
ADD_PED_FOR_DIALOGUE(sPedsForConversation, 4, sEnemyIntroCut[iClosest].pedIndex, "MCH2CHIN2")
CREATE_CONVERSATION_ADV("MCH2_WATCH", CONV_PRIORITY_MEDIUM, FALSE)
iDialogueTimer[0] = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(12000, 15000)
iDialogueLineCount[iDialogueStage]--
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF iDialogueStage < 1
iDialogueStage++
ELSE
iDialogueStage = 0
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<952.6562, -2186.5637, 29.5517>>, <<300.0, 300.0, 300.0>>, TRUE)
IF NOT DOES_ENTITY_EXIST(vehEnemy[0])
IF HAS_MODEL_LOADED_CHECK(BISON)
vehEnemy[0] = CREATE_VEHICLE(BISON, <<953.1112, -2187.5334, 29.5516>>, 159.9804)
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(vehEnemy[0], TRUE)
SET_VEHICLE_COLOURS(vehEnemy[0], 42, 42)
SET_VEHICLE_ON_GROUND_PROPERLY(vehEnemy[0])
SET_VEHICLE_DOORS_LOCKED(vehEnemy[0], VEHICLELOCK_LOCKED)
ENDIF
ENDIF
IF NOT DOES_ENTITY_EXIST(vehEnemy[1])
IF HAS_MODEL_LOADED_CHECK(BISON)
vehEnemy[1] = CREATE_VEHICLE(BISON, <<941.9060, -2177.2876, 29.5517>>, 9.5321)
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(vehEnemy[1], TRUE)
SET_VEHICLE_COLOURS(vehEnemy[0], 52, 52)
SET_VEHICLE_ON_GROUND_PROPERLY(vehEnemy[1])
SET_VEHICLE_DOORS_LOCKED(vehEnemy[1], VEHICLELOCK_LOCKED)
ENDIF
ENDIF
ENDIF
ENDIF
//Render Rail Cam
IF NOT sCamDetails.bRun
OR (GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
AND IS_PLAYER_SWITCH_IN_PROGRESS()
AND GET_PLAYER_SWITCH_TYPE() != SWITCH_TYPE_SHORT
AND GET_PLAYER_SWITCH_STATE() = SWITCH_STATE_OUTRO_HOLD)
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
IF DOES_CAM_EXIST(camMain)
IF NOT IS_CAM_RENDERING(camMain)
AND (IS_GAMEPLAY_CAM_RENDERING()
OR (IS_PLAYER_SWITCH_IN_PROGRESS()
AND GET_PLAYER_SWITCH_TYPE() != SWITCH_TYPE_SHORT
AND GET_PLAYER_SWITCH_STATE() = SWITCH_STATE_OUTRO_HOLD))
IF IS_ENTITY_ATTACHED_TO_ENTITY(PLAYER_PED(CHAR_MICHAEL), objHook)
SET_CAM_ACTIVE(camMain, TRUE)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
ENDIF
ENDIF
ENDIF
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN
IF DOES_CAM_EXIST(camMain)
IF IS_CAM_RENDERING(camMain)
RENDER_SCRIPT_CAMS(FALSE, FALSE)
ENDIF
ENDIF
ENDIF
ENDIF
//Game Viewport for Cameras
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
IF DOES_CAM_EXIST(camMain)
IF IS_CAM_RENDERING(camMain)
SWITCH iCutsceneStage
CASE 0
SET_ROOM_FOR_GAME_VIEWPORT_BY_NAME("abaSLAUGHT")
BREAK
CASE 1
CASE 2
CASE 3
CASE 4
CASE 5
SET_ROOM_FOR_GAME_VIEWPORT_BY_NAME("ababetween")
BREAK
CASE 6
CASE 7
SET_ROOM_FOR_GAME_VIEWPORT_BY_NAME("abaSLAUGHT")
BREAK
CASE 8
CASE 9
CASE 10
CASE 11
CASE 12
CASE 13
CASE 14
SET_ROOM_FOR_GAME_VIEWPORT_BY_NAME("ababetween")
BREAK
CASE 15
CASE 16
CASE 17
CASE 18
CASE 19
CASE 20
CASE 21
CASE 22
SET_ROOM_FOR_GAME_VIEWPORT_BY_NAME("abattmainsec1")
BREAK
CASE 23
SET_ROOM_FOR_GAME_VIEWPORT_BY_NAME("abattmainsec2")
BREAK
ENDSWITCH
ENDIF
ENDIF
ENDIF
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
IF iCutsceneStage > 1
REPEAT COUNT_OF(sEnemyIntroCut) i
IF DOES_ENTITY_EXIST(sEnemyIntroCut[i].pedIndex)
IF NOT IS_PED_INJURED(sEnemyIntroCut[i].pedIndex)
IF i <> 0 AND i <> 2 AND i <> 4 AND i <> 5 AND i <> 8 AND i <> 9
IF sEnemyIntroCut[i].iTimer < GET_GAME_TIMER()
IF NOT IS_ENTITY_PLAYING_ANIM(sEnemyIntroCut[i].pedIndex, sAnimDictIdle1, "idle_a")
AND NOT IS_ENTITY_PLAYING_ANIM(sEnemyIntroCut[i].pedIndex, sAnimDictIdle1, "idle_b")
AND NOT IS_ENTITY_PLAYING_ANIM(sEnemyIntroCut[i].pedIndex, sAnimDictIdle1, "idle_c")
AND NOT IS_ENTITY_PLAYING_ANIM(sEnemyIntroCut[i].pedIndex, sAnimDictIdle1, "idle_d")
AND NOT IS_ENTITY_PLAYING_ANIM(sEnemyIntroCut[i].pedIndex, sAnimDictIdle1, "idle_e")
AND NOT IS_ENTITY_PLAYING_ANIM(sEnemyIntroCut[i].pedIndex, sAnimDictIdle2, "idle_a")
AND NOT IS_ENTITY_PLAYING_ANIM(sEnemyIntroCut[i].pedIndex, sAnimDictIdle2, "idle_b")
AND NOT IS_ENTITY_PLAYING_ANIM(sEnemyIntroCut[i].pedIndex, sAnimDictIdle2, "idle_c")
AND NOT IS_ENTITY_PLAYING_ANIM(sEnemyIntroCut[i].pedIndex, sAnimDictIdle2, "idle_d")
AND NOT IS_ENTITY_PLAYING_ANIM(sEnemyIntroCut[i].pedIndex, sAnimDictIdle4, "idle_a")
AND NOT IS_ENTITY_PLAYING_ANIM(sEnemyIntroCut[i].pedIndex, sAnimDictIdle4, "idle_b")
AND NOT IS_ENTITY_PLAYING_ANIM(sEnemyIntroCut[i].pedIndex, sAnimDictIdle4, "idle_c")
INT iAnimDict = GET_RANDOM_INT_IN_RANGE(0, 3)
INT iAnimName = GET_RANDOM_INT_IN_RANGE(0, 5 - iAnimDict)
SWITCH iAnimDict
CASE 0
sEnemyIntroCut[i].sAnimDict = sAnimDictIdle1
BREAK
CASE 1
sEnemyIntroCut[i].sAnimDict = sAnimDictIdle2
BREAK
CASE 2
sEnemyIntroCut[i].sAnimDict = sAnimDictIdle4
BREAK
ENDSWITCH
SWITCH iAnimName
CASE 0
sEnemyIntroCut[i].sAnimName = "idle_a"
BREAK
CASE 1
sEnemyIntroCut[i].sAnimName = "idle_b"
BREAK
CASE 2
sEnemyIntroCut[i].sAnimName = "idle_c"
BREAK
CASE 3
sEnemyIntroCut[i].sAnimName = "idle_d"
BREAK
CASE 4
sEnemyIntroCut[i].sAnimName = "idle_e"
BREAK
ENDSWITCH
TASK_PLAY_ANIM(sEnemyIntroCut[i].pedIndex, sEnemyIntroCut[i].sAnimDict, sEnemyIntroCut[i].sAnimName, SLOW_BLEND_IN, SLOW_BLEND_OUT, -1, AF_UPPERBODY)
PRINTLN("TASK_PLAY_ANIM(sEnemyIntroCut[i].pedIndex, ", sEnemyIntroCut[i].sAnimDict, ", ", sEnemyIntroCut[i].sAnimName, ", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_UPPERBODY)")
ELSE
sEnemyIntroCut[i].iTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(1000 + (ROUND(GET_ENTITY_ANIM_TOTAL_TIME(sEnemyIntroCut[i].pedIndex, sEnemyIntroCut[i].sAnimDict, sEnemyIntroCut[i].sAnimName)) * 1000), 5000 + (ROUND(GET_ENTITY_ANIM_TOTAL_TIME(sEnemyIntroCut[i].pedIndex, sEnemyIntroCut[i].sAnimDict, sEnemyIntroCut[i].sAnimName)) * 1000))
PRINTLN("GET_ENTITY_ANIM_TOTAL_TIME = ", ROUND(GET_ENTITY_ANIM_TOTAL_TIME(sEnemyIntroCut[i].pedIndex, sEnemyIntroCut[i].sAnimDict, sEnemyIntroCut[i].sAnimName)) * 1000)
ENDIF
ENDIF
IF NOT IS_ENTITY_PLAYING_ANIM(sEnemyIntroCut[i].pedIndex, sAnimDictIdle1, "idle_a")
AND NOT IS_ENTITY_PLAYING_ANIM(sEnemyIntroCut[i].pedIndex, sAnimDictIdle1, "idle_b")
AND NOT IS_ENTITY_PLAYING_ANIM(sEnemyIntroCut[i].pedIndex, sAnimDictIdle1, "idle_c")
AND NOT IS_ENTITY_PLAYING_ANIM(sEnemyIntroCut[i].pedIndex, sAnimDictIdle1, "idle_d")
AND NOT IS_ENTITY_PLAYING_ANIM(sEnemyIntroCut[i].pedIndex, sAnimDictIdle1, "idle_e")
AND NOT IS_ENTITY_PLAYING_ANIM(sEnemyIntroCut[i].pedIndex, sAnimDictIdle2, "idle_a")
AND NOT IS_ENTITY_PLAYING_ANIM(sEnemyIntroCut[i].pedIndex, sAnimDictIdle2, "idle_b")
AND NOT IS_ENTITY_PLAYING_ANIM(sEnemyIntroCut[i].pedIndex, sAnimDictIdle2, "idle_c")
AND NOT IS_ENTITY_PLAYING_ANIM(sEnemyIntroCut[i].pedIndex, sAnimDictIdle2, "idle_d")
AND NOT IS_ENTITY_PLAYING_ANIM(sEnemyIntroCut[i].pedIndex, sAnimDictIdle4, "idle_a")
AND NOT IS_ENTITY_PLAYING_ANIM(sEnemyIntroCut[i].pedIndex, sAnimDictIdle4, "idle_b")
AND NOT IS_ENTITY_PLAYING_ANIM(sEnemyIntroCut[i].pedIndex, sAnimDictIdle4, "idle_c")
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(sEnemyIntroCut[i].pedIndex), GET_ENTITY_COORDS(PLAYER_PED(CHAR_MICHAEL))) < 10.0
IF NOT IS_PED_FACING_PED(sEnemyIntroCut[i].pedIndex, PLAYER_PED(CHAR_MICHAEL), 60.0)
IF GET_SCRIPT_TASK_STATUS(sEnemyIntroCut[i].pedIndex, SCRIPT_TASK_TURN_PED_TO_FACE_ENTITY) != PERFORMING_TASK
AND GET_SCRIPT_TASK_STATUS(sEnemyIntroCut[i].pedIndex, SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
TASK_TURN_PED_TO_FACE_COORD(sEnemyIntroCut[i].pedIndex, GET_ENTITY_COORDS(PLAYER_PED(CHAR_MICHAEL)))
ENDIF
ENDIF
ENDIF
ENDIF
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(sEnemyIntroCut[i].pedIndex), GET_ENTITY_COORDS(PLAYER_PED(CHAR_MICHAEL))) < 10.0
TASK_LOOK_AT_ENTITY(sEnemyIntroCut[i].pedIndex, PLAYER_PED(CHAR_MICHAEL), 10000)
ENDIF
ELIF i = 0 OR i = 4
INT iCigarette
IF i = 0
iCigarette = 0
ELSE
iCigarette = 2
ENDIF
IF NOT IS_ENTITY_PLAYING_ANIM(sEnemyIntroCut[i].pedIndex, sAnimDictMic2Smoking, "smoking_loop")
TASK_PLAY_ANIM(sEnemyIntroCut[i].pedIndex, sAnimDictMic2Smoking, "smoking_loop", SLOW_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING)
SET_CURRENT_PED_WEAPON(sEnemyIntroCut[i].pedIndex, WEAPONTYPE_UNARMED, TRUE)
ELSE
TEXT_LABEL txtLabel
txtLabel = "SMOKINGPUFF"
txtLabel += i
IF NOT HAS_LABEL_BEEN_TRIGGERED(txtLabel)
IF GET_ENTITY_ANIM_CURRENT_TIME(sEnemyIntroCut[i].pedIndex, sAnimDictMic2Smoking, "smoking_loop") >= 0.3
AND GET_ENTITY_ANIM_CURRENT_TIME(sEnemyIntroCut[i].pedIndex, sAnimDictMic2Smoking, "smoking_loop") < 0.4
START_PARTICLE_FX_NON_LOOPED_ON_PED_BONE("cs_cig_exhale_mouth", sEnemyIntroCut[i].pedIndex, <<0.0, 0.15, -0.05>>, VECTOR_ZERO, BONETAG_HEAD)
SET_LABEL_AS_TRIGGERED(txtLabel, TRUE)
ENDIF
ELSE
IF GET_ENTITY_ANIM_CURRENT_TIME(sEnemyIntroCut[i].pedIndex, sAnimDictMic2Smoking, "smoking_loop") >= 0.9
START_PARTICLE_FX_NON_LOOPED_ON_PED_BONE("cs_cig_exhale_mouth", sEnemyIntroCut[i].pedIndex, <<0.0, 0.15, -0.05>>, VECTOR_ZERO, BONETAG_HEAD)
SET_LABEL_AS_TRIGGERED(txtLabel, FALSE)
ENDIF
ENDIF
ENDIF
IF NOT DOES_ENTITY_EXIST(objCigarette[iCigarette])
IF HAS_MODEL_LOADED_CHECK(PROP_CS_CIGGY_01)
objCigarette[iCigarette] = CREATE_OBJECT(PROP_CS_CIGGY_01, GET_PED_BONE_COORDS(sEnemyIntroCut[i].pedIndex, BONETAG_PH_R_HAND, VECTOR_ZERO))
ENDIF
ELSE
IF NOT IS_ENTITY_ATTACHED_TO_ENTITY(objCigarette[iCigarette], sEnemyIntroCut[i].pedIndex)
ATTACH_ENTITY_TO_ENTITY(objCigarette[iCigarette], sEnemyIntroCut[i].pedIndex, GET_PED_BONE_INDEX(sEnemyIntroCut[i].pedIndex, BONETAG_PH_R_HAND), vCigaretteAttachOffset, VECTOR_ZERO)
IF NOT DOES_PARTICLE_FX_LOOPED_EXIST(ptfxCigarette[iCigarette])
ptfxCigarette[iCigarette] = START_PARTICLE_FX_LOOPED_ON_ENTITY("cs_cig_smoke", objCigarette[iCigarette], vCigaretteParticleOffset, VECTOR_ZERO)
ENDIF
SET_CURRENT_PED_WEAPON(sEnemyIntroCut[i].pedIndex, WEAPONTYPE_UNARMED, TRUE)
ENDIF
ENDIF
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(sEnemyIntroCut[i].pedIndex), GET_ENTITY_COORDS(PLAYER_PED(CHAR_MICHAEL))) < 10.0
TASK_LOOK_AT_ENTITY(sEnemyIntroCut[i].pedIndex, PLAYER_PED(CHAR_MICHAEL), 10000)
ENDIF
ELIF i = 2 OR i = 5
IF NOT IS_ENTITY_PLAYING_ANIM(sEnemyIntroCut[i].pedIndex, sAnimDictIdle3, "base")
TASK_PLAY_ANIM(sEnemyIntroCut[i].pedIndex, sAnimDictIdle3, "base", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING | AF_UPPERBODY | AF_SECONDARY)
ENDIF
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(sEnemyIntroCut[i].pedIndex), GET_ENTITY_COORDS(PLAYER_PED(CHAR_MICHAEL))) < 10.0
TASK_LOOK_AT_ENTITY(sEnemyIntroCut[i].pedIndex, PLAYER_PED(CHAR_MICHAEL), 10000)
ENDIF
ELIF i = 8
IF IS_ENTITY_AT_COORD(sEnemyIntroCut[i].pedIndex, <<999.5024, -2145.7878, 28.4765>>, <<5.0, 5.0, 5.0>>)
IF GET_SCRIPT_TASK_STATUS(sEnemyIntroCut[i].pedIndex, SCRIPT_TASK_FOLLOW_NAV_MESH_TO_COORD) != PERFORMING_TASK
TASK_FOLLOW_NAV_MESH_TO_COORD(sEnemyIntroCut[i].pedIndex, <<969.6483, -2160.4150, 28.4750>>, PEDMOVE_WALK, DEFAULT_TIME_NEVER_WARP) //, DEFAULT_NAVMESH_RADIUS, ENAV_DEFAULT, 178.3322)
ENDIF
ENDIF
IF IS_ENTITY_AT_COORD(sEnemyIntroCut[i].pedIndex, <<969.6483, -2160.4150, 28.4750>>, <<5.0, 5.0, 5.0>>)
IF GET_SCRIPT_TASK_STATUS(sEnemyIntroCut[i].pedIndex, SCRIPT_TASK_FOLLOW_NAV_MESH_TO_COORD) != PERFORMING_TASK
TASK_FOLLOW_NAV_MESH_TO_COORD(sEnemyIntroCut[i].pedIndex, <<999.5024, -2145.7878, 28.4765>>, PEDMOVE_WALK, DEFAULT_TIME_NEVER_WARP) //, DEFAULT_NAVMESH_RADIUS, ENAV_DEFAULT, 275.3511)
ENDIF
ENDIF
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(sEnemyIntroCut[i].pedIndex), GET_ENTITY_COORDS(PLAYER_PED(CHAR_MICHAEL))) < 10.0
TASK_LOOK_AT_ENTITY(sEnemyIntroCut[i].pedIndex, PLAYER_PED(CHAR_MICHAEL), 10000)
ENDIF
ELIF i = 9
IF IS_ENTITY_AT_COORD(sEnemyIntroCut[i].pedIndex, <<969.2003, -2164.1885, 28.4756>>, <<5.0, 5.0, 5.0>>)
IF GET_SCRIPT_TASK_STATUS(sEnemyIntroCut[i].pedIndex, SCRIPT_TASK_FOLLOW_NAV_MESH_TO_COORD) != PERFORMING_TASK
TASK_FOLLOW_NAV_MESH_TO_COORD(sEnemyIntroCut[i].pedIndex, <<997.3615, -2168.5959, 28.4752>>, PEDMOVE_WALK, DEFAULT_TIME_NEVER_WARP) //, DEFAULT_NAVMESH_RADIUS, ENAV_DEFAULT, 358.6634)
ENDIF
ENDIF
IF IS_ENTITY_AT_COORD(sEnemyIntroCut[i].pedIndex, <<997.3615, -2168.5959, 28.4752>>, <<5.0, 5.0, 5.0>>)
IF GET_SCRIPT_TASK_STATUS(sEnemyIntroCut[i].pedIndex, SCRIPT_TASK_FOLLOW_NAV_MESH_TO_COORD) != PERFORMING_TASK
TASK_FOLLOW_NAV_MESH_TO_COORD(sEnemyIntroCut[i].pedIndex, <<969.2003, -2164.1885, 28.4756>>, PEDMOVE_WALK, DEFAULT_TIME_NEVER_WARP) //, DEFAULT_NAVMESH_RADIUS, ENAV_DEFAULT, 187.7889)
ENDIF
ENDIF
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(sEnemyIntroCut[i].pedIndex), GET_ENTITY_COORDS(PLAYER_PED(CHAR_MICHAEL))) < 10.0
TASK_LOOK_AT_ENTITY(sEnemyIntroCut[i].pedIndex, PLAYER_PED(CHAR_MICHAEL), 10000)
ENDIF
ENDIF
ENDIF
ENDIF
ENDREPEAT
ENDIF
ENDIF
//Audio
IF NOT HAS_LABEL_BEEN_TRIGGERED("AudioInCar")
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED(CHAR_FRANKLIN))
PLAY_AUDIO(MIC2_FRANK_VEH)
SET_LABEL_AS_TRIGGERED("AudioInCar", TRUE)
ENDIF
ENDIF
//Radar / Mini Map
DISABLE_SELECTOR_MAP_UPDATE_THIS_FRAME()
//Michael Reaches Abattoir
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
REQUEST_SCRIPT_AUDIO_BANK("Michael_2_Kidnap_Rail")
REQUEST_SCRIPT_AUDIO_BANK("Michael_2_Meat_Chopper")
DISABLE_CELLPHONE_THIS_FRAME_ONLY()
IF NOT bMikeToFrank_SwitchedToFrank
SET_FORCE_OBJECT_THIS_FRAME(GET_ENTITY_COORDS(PLAYER_PED(CHAR_MICHAEL)), 30.0)
ENDIF
ELSE
RELEASE_NAMED_SCRIPT_AUDIO_BANK("Michael_2_Kidnap_Rail")
RELEASE_NAMED_SCRIPT_AUDIO_BANK("Michael_2_Meat_Chopper")
ENDIF
//Franklin Reaches Abattoir
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN
IF IS_NEW_LOAD_SCENE_ACTIVE()
IF NOT IS_PLAYER_SWITCH_IN_PROGRESS()
NEW_LOAD_SCENE_STOP()
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("MCH2_WAYIN")
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
AND (NOT IS_MESSAGE_BEING_DISPLAYED() OR GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) = 0)
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED(CHAR_FRANKLIN), <<982.266663, -2198.750977, 28.551861>>, <<991.753418, -2096.931885, 55.123489>>, 40.0)
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED(CHAR_FRANKLIN), <<936.555542, -2116.675781, 28.508316>>, <<1009.005981, -2123.745361, 54.551849>>, 40.0)
CREATE_CONVERSATION_ADV("MCH2_WAYIN")
ENDIF
ENDIF
ENDIF
IF (NOT IS_MESSAGE_BEING_DISPLAYED() OR GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) = 0)
AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF (DOES_ENTITY_EXIST(sEnemyOutside[0].pedIndex)
AND NOT IS_PED_INJURED(sEnemyOutside[0].pedIndex))
AND (DOES_ENTITY_EXIST(sEnemyOutside[2].pedIndex)
AND NOT IS_PED_INJURED(sEnemyOutside[2].pedIndex))
IF GET_GAME_TIMER() > iDialogueTimer[3]
IF IS_ENTITY_AT_COORD(PLAYER_PED(CHAR_FRANKLIN), <<950.836731, -2183.857666, 38.551857>>, <<25.0, 25.0, 10.0>>)
IF NOT HAS_LABEL_BEEN_TRIGGERED("MCH2_TALK_1")
ADD_PED_FOR_DIALOGUE(sPedsForConversation, 3, sEnemyOutside[0].pedIndex, "MCH2CHIN1")
ADD_PED_FOR_DIALOGUE(sPedsForConversation, 7, sEnemyOutside[2].pedIndex, "MCH2CHIN5")
PLAY_SINGLE_LINE_FROM_CONVERSATION_ADV("MCH2_TALK", "MCH2_TALK_1")
ELIF NOT HAS_LABEL_BEEN_TRIGGERED("MCH2_TALK_2")
PLAY_SINGLE_LINE_FROM_CONVERSATION_ADV("MCH2_TALK", "MCH2_TALK_2")
ELIF NOT HAS_LABEL_BEEN_TRIGGERED("MCH2_TALK2_1")
PLAY_SINGLE_LINE_FROM_CONVERSATION_ADV("MCH2_TALK2", "MCH2_TALK2_1")
ELIF NOT HAS_LABEL_BEEN_TRIGGERED("MCH2_TALK2_2")
PLAY_SINGLE_LINE_FROM_CONVERSATION_ADV("MCH2_TALK2", "MCH2_TALK2_2")
ENDIF
iDialogueTimer[3] = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(7500, 10000)
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("MCH2_ABATTF")
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED(CHAR_FRANKLIN), <<972.600098, -2065.420410, 26.316271>>, <<959.969910, -2203.768799, 39.551682>>, 100.0)
SET_LABEL_AS_TRIGGERED("MCH2_ABATTF", TRUE) //PRINT_ADV("MCH2_ABATTF")
// PRINT_HELP_ADV("MCH2_SWITCHCAM")
PLAY_AUDIO(MIC2_FIND_A_WAY)
ENDIF
ELSE
IF HAS_ANIM_DICT_LOADED_CHECK(sAnimDictMic2Smoking)
IF DOES_ENTITY_EXIST(sEnemyOutside[0].pedIndex)
IF NOT IS_PED_INJURED(sEnemyOutside[0].pedIndex)
IF NOT IS_ENTITY_PLAYING_ANIM(sEnemyOutside[0].pedIndex, sAnimDictMic2Smoking, "smoking_loop")
TASK_PLAY_ANIM(sEnemyOutside[0].pedIndex, sAnimDictMic2Smoking, "smoking_loop", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING)
SET_CURRENT_PED_WEAPON(sEnemyOutside[0].pedIndex, WEAPONTYPE_UNARMED, TRUE)
ENDIF
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(sEnemyOutside[2].pedIndex)
IF NOT IS_PED_INJURED(sEnemyOutside[2].pedIndex)
IF NOT IS_ENTITY_PLAYING_ANIM(sEnemyOutside[2].pedIndex, sAnimDictMic2Smoking, "smoking_loop")
TASK_PLAY_ANIM(sEnemyOutside[2].pedIndex, sAnimDictMic2Smoking, "smoking_loop", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING, 0.75)
SET_CURRENT_PED_WEAPON(sEnemyOutside[0].pedIndex, WEAPONTYPE_UNARMED, TRUE)
ELSE
SET_ENTITY_ANIM_SPEED(sEnemyOutside[2].pedIndex, sAnimDictMic2Smoking, "smoking_loop", 0.75)
ENDIF
ENDIF
ENDIF
ENDIF
IF (IS_EXPLOSION_IN_AREA(EXP_TAG_GRENADE, <<914.99, -2146.68, 28.63>>, <<981.29, -2201.92, 40.55>>)
OR IS_EXPLOSION_IN_AREA(EXP_TAG_GRENADELAUNCHER, <<914.99, -2146.68, 28.63>>, <<981.29, -2201.92, 40.55>>)
OR IS_EXPLOSION_IN_AREA(EXP_TAG_STICKYBOMB, <<914.99, -2146.68, 28.63>>, <<981.29, -2201.92, 40.55>>)
OR IS_EXPLOSION_IN_AREA(EXP_TAG_MOLOTOV, <<914.99, -2146.68, 28.63>>, <<981.29, -2201.92, 40.55>>)
OR IS_EXPLOSION_IN_AREA(EXP_TAG_ROCKET, <<914.99, -2146.68, 28.63>>, <<981.29, -2201.92, 40.55>>)
OR IS_EXPLOSION_IN_AREA(EXP_TAG_TANKSHELL, <<914.99, -2146.68, 28.63>>, <<981.29, -2201.92, 40.55>>)
OR IS_EXPLOSION_IN_AREA(EXP_TAG_HI_OCTANE, <<914.99, -2146.68, 28.63>>, <<981.29, -2201.92, 40.55>>)
OR IS_EXPLOSION_IN_AREA(EXP_TAG_BULLET, <<914.99, -2146.68, 28.63>>, <<981.29, -2201.92, 40.55>>)
OR IS_EXPLOSION_IN_AREA(EXP_TAG_SMOKE_GRENADE, <<914.99, -2146.68, 28.63>>, <<981.29, -2201.92, 40.55>>)
OR IS_EXPLOSION_IN_AREA(EXP_TAG_FLARE, <<914.99, -2146.68, 28.63>>, <<981.29, -2201.92, 40.55>>)
OR IS_EXPLOSION_IN_AREA(EXP_TAG_PROGRAMMABLEAR, <<914.99, -2146.68, 28.63>>, <<981.29, -2201.92, 40.55>>))
OR IS_PROJECTILE_IN_AREA(<<914.99, -2146.68, 28.63>>, <<981.29, -2201.92, 40.55>>, FALSE)
OR IS_BULLET_IN_BOX(<<914.99, -2146.68, 28.63>>, <<981.29, -2201.92, 40.55>>, FALSE)
OR IS_PED_SHOOTING_IN_AREA(PLAYER_PED_ID(), <<914.99, -2146.68, 28.63>>, <<981.29, -2201.92, 40.55>>, FALSE)
OR ((IS_PLAYER_FREE_AIMING(PLAYER_ID())
OR IS_PLAYER_TARGETTING_ENTITY(PLAYER_ID(), sEnemyOutside[0].pedIndex)
OR IS_PLAYER_TARGETTING_ENTITY(PLAYER_ID(), sEnemyOutside[2].pedIndex))
AND IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<951.146362, -2185.526367, 34.551811>>, <<15.0, 15.0, 5.0>>))
OR (DOES_ENTITY_EXIST(sEnemyOutside[0].pedIndex)
AND GET_ENTITY_HEALTH(sEnemyOutside[0].pedIndex) < 200)
OR (DOES_ENTITY_EXIST(sEnemyOutside[2].pedIndex)
AND GET_ENTITY_HEALTH(sEnemyOutside[2].pedIndex) < 200)
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<980.336243, -2159.359131, 32.683861>>, <<964.162415, -2157.859863, 35.670811>>, 10.0)
OR IS_BULLET_IN_ANGLED_AREA(<<980.336243, -2159.359131, 32.683861>>, <<964.162415, -2157.859863, 35.670811>>, 10.0)
SET_LABEL_AS_TRIGGERED("AlertedTriads", TRUE)
ENDIF
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<951.146362, -2185.526367, 34.551811>>, <<15.0, 15.0, 5.0>>)
OR HAS_LABEL_BEEN_TRIGGERED("AlertedTriads")
ADVANCE_STAGE()
ENDIF
ENDIF
ENDIF
ENDIF
IF CLEANUP_STAGE()
//Cleanup (Blips, peds, variables etc.)
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
VEHICLE_INDEX vehRollingStart = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehRollingStart)
STOP_PLAYBACK_RECORDED_VEHICLE(vehRollingStart)
ENDIF
ENDIF
IF IS_NEW_LOAD_SCENE_ACTIVE()
NEW_LOAD_SCENE_STOP()
ENDIF
RELEASE_NAMED_SCRIPT_AUDIO_BANK("Michael_2_Kidnap_Rail")
RELEASE_NAMED_SCRIPT_AUDIO_BANK("Michael_2_Meat_Chopper")
SET_SELECTOR_PED_HINT(sSelectorPeds, SELECTOR_PED_FRANKLIN, FALSE)
SET_SELECTOR_PED_HINT(sSelectorPeds, SELECTOR_PED_MICHAEL, FALSE)
IF GET_CURRENT_PLAYER_PED_ENUM() != CHAR_FRANKLIN
MAKE_SELECTOR_PED_SELECTION(sSelectorPeds, SELECTOR_PED_FRANKLIN)
TAKE_CONTROL_OF_SELECTOR_PED(sSelectorPeds)
ENDIF
HIDE_CELLPHONE_SIGNIFIERS_FOR_CUTSCENE(FALSE)
DISABLE_CELLPHONE(FALSE)
IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[CHAR_FRANKLIN])
SET_PED_RELATIONSHIP_GROUP_HASH(sSelectorPeds.pedID[CHAR_FRANKLIN], relGroupBuddy)
ENDIF
INT i
REPEAT COUNT_OF(sEnemyIntroCut) i
SAFE_DELETE_PED(sEnemyIntroCut[i].pedIndex)
ENDREPEAT
REMOVE_PED_FOR_DIALOGUE(sPedsForConversation, 5)
SAFE_DELETE_PED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
INFORM_MISSION_STATS_SYSTEM_OF_TIME_WINDOW_CLOSED(FALSE, MIC2_MIKE_RESCUE_TIMER)
eMissionObjective = INT_TO_ENUM(MissionObjective, ENUM_TO_INT(eMissionObjective) + 1)
ENDIF
ENDPROC
PROC abattoirShootout()
IF INIT_STAGE()
//Set player
SAFE_SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
//Trackify
ENABLE_SECOND_SCREEN_TRACKIFY_APP(TRUE)
SET_TRACKIFY_TARGET_VECTOR(<<994.2946, -2150.3882, 29.4763>>)
//Uncapped
bSetUncapped = TRUE
//Cover Blocking
ADD_COVER_BLOCKING_AREA(<<997.93073, -2186.16016, 28.97771>>, <<997.42834, -2185.66040, 28.97763>>, TRUE, TRUE, TRUE)
ADD_COVER_BLOCKING_AREA(<<978.15338, -2186.26709, 28.97741>>, <<979.04889, -2185.23193, 28.97736>>, TRUE, TRUE, TRUE)
ADD_COVER_BLOCKING_AREA(<<978.405457, -2186.15625, 28.7274>>, <<978.905457, -2185.65625, 31.2274>>, TRUE, TRUE, TRUE)
ADD_COVER_BLOCKING_AREA(<<993.80737, -2174.23584, 29.20387>> - <<0.25, 0.25, 1.0>>, <<993.80737, -2174.23584, 29.20387>> + <<0.25, 0.25, 1.25>>, TRUE, TRUE, TRUE)
ADD_COVER_BLOCKING_AREA(<<972.773499, -2165.905273, 29.469034>> - <<0.35, 1.0, 1.5>>, <<972.773499, -2165.905273, 29.469034>> + <<0.35, 1.0, 1.5>>, TRUE, TRUE, TRUE)
//Wanted
SET_MAX_WANTED_LEVEL(0)
SET_WANTED_LEVEL_MULTIPLIER(0.0)
//Ambulances etc.
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)
ENABLE_DISPATCH_SERVICE(DT_GANGS, FALSE)
IF CAN_CREATE_RANDOM_COPS()
SET_CREATE_RANDOM_COPS(FALSE)
ENDIF
//Radar
bRadar = TRUE
//Cam
IF NOT DOES_CAM_EXIST(camMain)
camMain = CREATE_CAM("DEFAULT_SCRIPTED_CAMERA", TRUE)
ENDIF
RENDER_SCRIPT_CAMS(FALSE, FALSE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
IF DOES_CAM_EXIST(camMain)
STOP_CAM_POINTING(camMain)
ENDIF
//Michael
SET_PED_CONFIG_FLAG(PLAYER_PED(CHAR_MICHAEL), PCF_RunFromFiresAndExplosions, TRUE)
SET_PED_CONFIG_FLAG(PLAYER_PED(CHAR_MICHAEL), PCF_DisableExplosionReactions, TRUE)
//Switch
bOkToSwitch = FALSE
//Rail
bOkToMoveRail = FALSE
bOkToHangFromHook = TRUE
// bReattach = TRUE
// bFixedRotation = TRUE
//Skip Michael Forwards!
SET_RAIL_FINAL_NODE(31)
iCurrentNode = 31
vRailCurrent = sRailNodes[31].vPos
// IF DOES_ENTITY_EXIST(objHook)
// IF IS_PED_RAGDOLL(PLAYER_PED(CHAR_MICHAEL))
// DANGLE_FROM_MEATHOOK(TRUE, PLAYER_PED(CHAR_MICHAEL), objHook, vRailCurrent + vHookPosOffset, FALSE, 0.0, 1000, 60000, bFixedRotation, -0.3, -0.3, -0.3, 0.3, 0.3, 0.3) //#IF IS_DEBUG_BUILD PRINTLN("DANGLE_FROM_MEATHOOK REF4") #ENDIF
// ELIF IS_ENTITY_ATTACHED_TO_ENTITY(PLAYER_PED(CHAR_MICHAEL), objHook)
// SET_ENTITY_COORDS_NO_OFFSET(objHook, vRailCurrent)
// SET_ENTITY_ROTATION(objHook, sRailNodes[31].vRot)
//
// ATTACH_ENTITY_TO_ENTITY(PLAYER_PED(CHAR_MICHAEL), objHook, 0, vMichaelAttachOffset, <<0.0, 0.0, 180.0>>, TRUE, TRUE)
// ENDIF
// ENDIF
SET_ENTITY_COORDS_NO_OFFSET(objHook, vRailCurrent)
SET_ENTITY_ROTATION(objHook, sRailNodes[31].vRot)
IF NOT IS_ENTITY_ATTACHED(PLAYER_PED(CHAR_MICHAEL))
ATTACH_ENTITY_TO_ENTITY(PLAYER_PED(CHAR_MICHAEL), objHook, 0, vMichaelAttachOffset, <<0.0, 0.0, 180.0>>, TRUE, TRUE)
ENDIF
IF NOT IS_ENTITY_PLAYING_ANIM(PLAYER_PED(CHAR_MICHAEL), sAnimDictMic2Hook, "michael_meat_hook_react_c")
TASK_PLAY_ANIM(PLAYER_PED(CHAR_MICHAEL), sAnimDictMic2Hook, "michael_meat_hook_react_c", INSTANT_BLEND_IN, REALLY_SLOW_BLEND_OUT, -1, AF_HOLD_LAST_FRAME | AF_NOT_INTERRUPTABLE)
ENDIF
RETAIN_ENTITY_IN_INTERIOR(PLAYER_PED(CHAR_MICHAEL), intAbattoir)
SET_PED_CAN_BE_TARGETTED(PLAYER_PED(CHAR_MICHAEL), FALSE)
SET_RAGDOLL_BLOCKING_FLAGS(PLAYER_PED(CHAR_MICHAEL), RBF_PLAYER_BUMP | RBF_PLAYER_IMPACT | RBF_PLAYER_RAGDOLL_BUMP)
REMOVE_ALL_PED_WEAPONS(PLAYER_PED(CHAR_MICHAEL))
SET_CURRENT_PED_WEAPON(PLAYER_PED(CHAR_MICHAEL), WEAPONTYPE_UNARMED, TRUE)
CLEAR_TEXT()
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(ENUM_TO_INT(replayAbattoirShootout), "stageAbattoirShootout")
IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[CHAR_MICHAEL])
SET_PED_RELATIONSHIP_GROUP_HASH(sSelectorPeds.pedID[CHAR_MICHAEL], relGroupFriendlyFire)
ENDIF
IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[CHAR_FRANKLIN])
SET_PED_RELATIONSHIP_GROUP_HASH(sSelectorPeds.pedID[CHAR_FRANKLIN], relGroupBuddy)
ENDIF
#IF IS_DEBUG_BUILD
IF bAutoSkipping = FALSE
#ENDIF
//Audio Scene
IF NOT IS_AUDIO_SCENE_ACTIVE("MI_2_SHOOTOUT_MAIN")
START_AUDIO_SCENE("MI_2_SHOOTOUT_MAIN")
ENDIF
//Audio
LOAD_AUDIO(MIC2_FIGHT_BEGINS)
PLAY_SOUND_FROM_COORD(-1, "MINCER_LOOP", <<992.7037, -2161.9229, 31.8097 - 0.5>>, "MICHAEL_2_SOUNDS")
//Cover
IF NOT DOES_SCRIPTED_COVER_POINT_EXIST_AT_COORDS(<<961.5743, -2185.7659, 29.4823>>)
covPoint[0] = ADD_COVER_POINT(<<961.5743, -2185.7659, 29.4823>>, 265.3580, COVUSE_WALLTORIGHT, COVHEIGHT_TOOHIGH, COVARC_120, TRUE)
ENDIF
IF NOT DOES_SCRIPTED_COVER_POINT_EXIST_AT_COORDS(<<970.8589, -2186.5432, 28.9773>>)
covPoint[1] = ADD_COVER_POINT(<<970.8589, -2186.5432, 28.9773>>, 82.2686, COVUSE_WALLTOLEFT, COVHEIGHT_LOW, COVARC_120)
ENDIF
IF NOT DOES_SCRIPTED_COVER_POINT_EXIST_AT_COORDS(<<981.2763, -2188.5393, 28.9777>>)
covPoint[2] = ADD_COVER_POINT(<<981.2763, -2188.5393, 28.9777>>, 84.4550, COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_120)
ENDIF
IF NOT DOES_SCRIPTED_COVER_POINT_EXIST_AT_COORDS(<<996.7552, -2187.5620, 28.9779>>)
covPoint[3] = ADD_COVER_POINT(<<996.7552, -2187.5620, 28.9779>>, 353.0754, COVUSE_WALLTORIGHT, COVHEIGHT_LOW, COVARC_120, TRUE)
ENDIF
IF NOT DOES_SCRIPTED_COVER_POINT_EXIST_AT_COORDS(<<988.2324, -2166.8076, 28.4755>>)
covPoint[4] = ADD_COVER_POINT(<<988.2324, -2166.8076, 28.4755>>, 89.9152, COVUSE_WALLTORIGHT, COVHEIGHT_LOW, COVARC_120)
ENDIF
IF NOT DOES_SCRIPTED_COVER_POINT_EXIST_AT_COORDS(<<993.1907, -2172.7732, 29.2011>>)
covPoint[5] = ADD_COVER_POINT(<<993.1907, -2172.7732, 29.2011>>, 177.1490, COVUSE_WALLTORIGHT, COVHEIGHT_TOOHIGH, COVARC_120)
ENDIF
IF NOT DOES_SCRIPTED_COVER_POINT_EXIST_AT_COORDS(<<954.7870, -2182.6062, 29.5519>>)
covPoint[6] = ADD_COVER_POINT(<<954.7870, -2182.6062, 29.5519>>, 256.9729, COVUSE_WALLTOLEFT, COVHEIGHT_LOW, COVARC_120)
ENDIF
IF NOT DOES_SCRIPTED_COVER_POINT_EXIST_AT_COORDS(<<986.1974, -2166.4761, 28.4756>>)
covPoint[7] = ADD_COVER_POINT(<<986.1974, -2166.4761, 28.4756>>, 262.3954, COVUSE_WALLTOLEFT, COVHEIGHT_LOW, COVARC_120)
ENDIF
IF NOT DOES_SCRIPTED_COVER_POINT_EXIST_AT_COORDS(<<972.2457, -2168.9514, 28.4613>>)
covPoint[8] = ADD_COVER_POINT(<<972.2457, -2168.9514, 28.4613>>, 264.5069, COVUSE_WALLTORIGHT, COVHEIGHT_LOW, COVARC_120)
ENDIF
IF NOT DOES_SCRIPTED_COVER_POINT_EXIST_AT_COORDS(<<973.2443, -2162.0090, 28.4757>>)
covPoint[9] = ADD_COVER_POINT(<<973.2443, -2162.0090, 28.4757>>, 263.8469, COVUSE_WALLTONEITHER, COVHEIGHT_TOOHIGH, COVARC_120)
ENDIF
IF NOT DOES_SCRIPTED_COVER_POINT_EXIST_AT_COORDS(<<967.4846, -2157.8857, 28.4747>>)
covPoint[10] = ADD_COVER_POINT(<<967.4846, -2157.8857, 28.4747>>, 205.8383, COVUSE_WALLTORIGHT, COVHEIGHT_LOW, COVARC_120)
ENDIF
IF NOT DOES_SCRIPTED_COVER_POINT_EXIST_AT_COORDS(<<986.0016, -2162.1299, 28.4763>>)
covPoint[11] = ADD_COVER_POINT(<<986.0016, -2162.1299, 28.4763>>, 83.7432, COVUSE_WALLTORIGHT, COVHEIGHT_LOW, COVARC_120)
ENDIF
IF NOT DOES_SCRIPTED_COVER_POINT_EXIST_AT_COORDS(<<996.7911, -2158.3494, 28.4766>>)
covPoint[12] = ADD_COVER_POINT(<<996.7911, -2158.3494, 28.4766>>, 85.2102, COVUSE_WALLTOLEFT, COVHEIGHT_LOW, COVARC_120)
ENDIF
IF NOT DOES_SCRIPTED_COVER_POINT_EXIST_AT_COORDS(<<996.3251, -2142.2861, 28.4762>>)
covPoint[13] = ADD_COVER_POINT(<<996.3251, -2142.2861, 28.4762>>, 4.7376, COVUSE_WALLTORIGHT, COVHEIGHT_TOOHIGH, COVARC_120)
ENDIF
IF NOT DOES_SCRIPTED_COVER_POINT_EXIST_AT_COORDS(<<976.4183, -2166.4651, 28.5421>>)
covPoint[14] = ADD_COVER_POINT(<<976.4183, -2166.4651, 28.5421>>, 85.8822, COVUSE_WALLTORIGHT, COVHEIGHT_LOW, COVARC_120)
ENDIF
IF NOT DOES_SCRIPTED_COVER_POINT_EXIST_AT_COORDS(<<973.4745, -2167.0322, 28.4617>>)
covPoint[15] = ADD_COVER_POINT(<<973.4745, -2167.0322, 28.4617>>, 359.6113, COVUSE_WALLTORIGHT, COVHEIGHT_LOW, COVARC_120)
ENDIF
IF NOT DOES_SCRIPTED_COVER_POINT_EXIST_AT_COORDS(<<993.2383, -2131.0708, 29.4758>>)
covPoint[16] = ADD_COVER_POINT(<<993.2383, -2131.0708, 29.4758>>, 11.4085, COVUSE_WALLTOLEFT, COVHEIGHT_LOW, COVARC_120)
ENDIF
IF NOT DOES_SCRIPTED_COVER_POINT_EXIST_AT_COORDS(<<989.3762, -2108.0239, 29.4751>>)
covPoint[17] = ADD_COVER_POINT(<<989.3762, -2108.0239, 29.4751>>, 178.0079, COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_120, TRUE)
ENDIF
IF NOT DOES_SCRIPTED_COVER_POINT_EXIST_AT_COORDS(<<934.6276, -2183.5769, 29.4658>>)
covPoint[18] = ADD_COVER_POINT(<<934.6276, -2183.5769, 29.4658>>, 272.6803, COVUSE_WALLTORIGHT, COVHEIGHT_TOOHIGH, COVARC_120, TRUE)
ENDIF
IF NOT DOES_SCRIPTED_COVER_POINT_EXIST_AT_COORDS(<<969.1201, -2186.1074, 28.9771>>)
covPoint[19] = ADD_COVER_POINT(<<969.1201, -2186.1074, 28.9771>>, 264.5366, COVUSE_WALLTORIGHT, COVHEIGHT_LOW, COVARC_120, TRUE)
ENDIF
IF NOT DOES_SCRIPTED_COVER_POINT_EXIST_AT_COORDS(<<975.9344, -2185.0681, 28.9773>>)
covPoint[20] = ADD_COVER_POINT(<<975.9344, -2185.0681, 28.9773>>, 265.3824, COVUSE_WALLTOLEFT, COVHEIGHT_LOW, COVARC_120, TRUE)
ENDIF
IF NOT DOES_SCRIPTED_COVER_POINT_EXIST_AT_COORDS(<<984.1754, -2186.1909, 28.9776>>)
covPoint[21] = ADD_COVER_POINT(<<984.1754, -2186.1909, 28.9776>>, 265.3159, COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_120, TRUE)
ENDIF
//Gang Inside Abattoir
createEnemy(sEnemyShootout[0], <<978.5643, -2185.9519, 29.0001>>, 173.2941, WEAPONTYPE_PISTOL)
sEnemyShootout[0].vLocate[0] = <<960.382202, -2185.503418, 32.497513>> sEnemyShootout[0].vLocSize[0] = <<10.0, 3.0, 3.0>> sEnemyShootout[0].eAdvanceStyle[0] = GUN_TO_POINT sEnemyShootout[0].vPoint[0] = <<978.6102, -2186.8325, 29.0012>> sEnemyShootout[0].fSpeed[0] = PEDMOVE_SPRINT
SET_PED_COMBAT_ATTRIBUTES(sEnemyShootout[0].pedIndex, CA_OPEN_COMBAT_WHEN_DEFENSIVE_AREA_IS_REACHED, TRUE)
sEnemyShootout[0].iTime[1] = 1000 sEnemyShootout[0].eAdvanceStyle[1] = GUN_TO_POINT sEnemyShootout[0].vPoint[1] = <<970.7040, -2186.3083, 29.0011>> sEnemyShootout[0].fSpeed[1] = PEDMOVE_SPRINT
createEnemy(sEnemyShootout[1], <<981.2392, -2188.4341, 28.9778>>, 353.2939, WEAPONTYPE_SMG)
sEnemyShootout[1].vLocate[0] = <<964.029846, -2185.516846, 31.073631>> sEnemyShootout[1].vLocSize[0] = <<2.0, 2.0, 2.0>> sEnemyShootout[1].pedCheck[0] = sEnemyShootout[0].pedIndex sEnemyShootout[1].eAdvanceStyle[0] = GUN_TO_POINT sEnemyShootout[1].vPoint[0] = <<978.5643, -2185.9519, 29.0001>> sEnemyShootout[1].fSpeed[0] = PEDMOVEBLENDRATIO_RUN
sEnemyShootout[1].fDist[1] = 8.0 sEnemyShootout[1].eAdvanceStyle[1] = GUN_TO_POINT sEnemyShootout[1].vPoint[1] = <<985.3617, -2186.0742, 29.7047>> sEnemyShootout[1].fSpeed[1] = PEDMOVEBLENDRATIO_RUN
createEnemy(sEnemyShootout[2], <<971.4545, -2182.5701, 28.9997>>, 86.5340, WEAPONTYPE_ASSAULTRIFLE, G_M_M_CHIGOON_01)
SET_PED_COMBAT_ATTRIBUTES(sEnemyShootout[2].pedIndex, CA_BLIND_FIRE_IN_COVER, FALSE)
sEnemyShootout[2].vLocate[0] = <<960.322937, -2185.139648, 31.551695>> sEnemyShootout[2].vLocSize[0] = <<2.5, 2.5, 2.5>> sEnemyShootout[2].eAdvanceStyle[0] = GUN_TO_POINT sEnemyShootout[2].vPoint[0] = <<985.5667, -2183.5007, 29.7432>> sEnemyShootout[2].fSpeed[0] = PEDMOVE_RUN SET_BIT(sEnemyShootout[2].iBitsetStrict, 0) /*sEnemyShootout[2].bStrict[0] = TRUE*/ SET_ENTITY_HEALTH(sEnemyShootout[2].pedIndex, 105)
sEnemyShootout[2].vLocate[1] = <<979.112732, -2186.871338, 31.000574>> sEnemyShootout[2].vLocSize[1] = <<2.5, 2.5, 2.0>> sEnemyShootout[2].eAdvanceStyle[1] = GUN_TO_POINT sEnemyShootout[2].vPoint[1] = <<985.7039, -2182.7744, 29.7432>> sEnemyShootout[2].fSpeed[1] = PEDMOVE_RUN
sEnemyShootout[2].iTime[2] = 0 sEnemyShootout[2].eAdvanceStyle[2] = GUN_TO_POINT sEnemyShootout[2].vPoint[2] = <<994.7982, -2173.6492, 29.2247>> sEnemyShootout[2].fSpeed[2] = PEDMOVE_WALK
createEnemy(sEnemyShootout[3], <<998.0875, -2188.8955, 28.9782>>, 353.2941, WEAPONTYPE_PISTOL)
SET_PED_SPHERE_DEFENSIVE_AREA(sEnemyShootout[3].pedIndex, <<998.0875, -2188.8955, 28.9782>>, 1.5)
//Ped who runs out
createEnemy(sEnemyShootout[10], <<964.1022, -2186.9495, 29.3077>>, 49.2363, WEAPONTYPE_PISTOL)
SET_PED_COMBAT_MOVEMENT(sEnemyShootout[10].pedIndex, CM_STATIONARY)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sEnemyShootout[10].pedIndex, TRUE)
//Entry Corridoor - Shootout: 4, 5, 6
//Entry Room - Shootout: 7, 8, 9 and Set Piece: SET_PIECE_STEAM, SET_PIECE_RAIL
//Main Corridoor - Shootout: 11, 12, 13, 14, 15 and Set Piece: SET_PIECE_STAIR, SET_PIECE_GRINDER, SET_PIECE_CUTTER
INT i
REPEAT COUNT_OF(sEnemyShootout) i
IF DOES_ENTITY_EXIST(sEnemyShootout[i].pedIndex)
//RETAIN_ENTITY_IN_INTERIOR(sEnemyShootout[i].pedIndex, intAbattoir)
ENDIF
ENDREPEAT
#IF IS_DEBUG_BUILD
REPEAT COUNT_OF(sEnemyShootout) i
IF NOT IS_PED_INJURED(sEnemyShootout[i].pedIndex)
ASSIGN_DEBUG_NAMES(sEnemyShootout[i].pedIndex, "Shootout ", i)
sEnemyShootout[i].sDebugName = CONCATENATE_STRINGS("Shootout ", GET_STRING_FROM_INT(i))
ENDIF
ENDREPEAT
#ENDIF
//Enemy Cars
IF NOT DOES_ENTITY_EXIST(vehEnemy[0])
vehEnemy[0] = CREATE_VEHICLE(BISON, <<952.7221, -2187.8667, 29.5517>>, 187.2181)
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(vehEnemy[0], TRUE)
SET_VEHICLE_COLOURS(vehEnemy[0], 42, 42)
SET_VEHICLE_ON_GROUND_PROPERLY(vehEnemy[0])
SET_VEHICLE_DOORS_LOCKED(vehEnemy[0], VEHICLELOCK_LOCKED)
ENDIF
IF NOT DOES_ENTITY_EXIST(vehEnemy[1])
vehEnemy[1] = CREATE_VEHICLE(BISON, <<941.9060, -2177.2876, 29.5517>>, 9.5321)
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(vehEnemy[1], TRUE)
SET_VEHICLE_COLOURS(vehEnemy[0], 52, 52)
SET_VEHICLE_ON_GROUND_PROPERLY(vehEnemy[1])
SET_VEHICLE_DOORS_LOCKED(vehEnemy[1], VEHICLELOCK_LOCKED)
ENDIF
#IF IS_DEBUG_BUILD
ENDIF
#ENDIF
IF SKIPPED_STAGE()
IF bReplaySkip = TRUE
SET_PED_POSITION(PLAYER_PED(CHAR_FRANKLIN), <<934.6419, -2183.5613, 29.4654>>, 355.3260, FALSE)
TASK_PUT_PED_DIRECTLY_INTO_COVER(PLAYER_PED(CHAR_FRANKLIN), <<934.6419, -2183.5613, 29.4654>>, -1, FALSE, 0, TRUE, TRUE, covPoint[18])
TASK_COMBAT_PED(sEnemyOutside[0].pedIndex, PLAYER_PED(CHAR_FRANKLIN), COMBAT_PED_DISABLE_AIM_INTRO)
TASK_COMBAT_PED(sEnemyOutside[2].pedIndex, PLAYER_PED(CHAR_FRANKLIN), COMBAT_PED_DISABLE_AIM_INTRO)
SET_PED_COMBAT_MOVEMENT(sEnemyOutside[2].pedIndex, CM_STATIONARY)
SET_LABEL_AS_TRIGGERED("AlertedTriads", TRUE)
SET_LABEL_AS_TRIGGERED("MCH2_ABATTF", TRUE)
ELSE
SET_PED_POSITION(PLAYER_PED(CHAR_FRANKLIN), <<931.4130, -2179.8796, 29.3223>>, 263.7494, FALSE)
ENDIF
IF GET_BEST_PED_WEAPON(PLAYER_PED(CHAR_FRANKLIN)) = WEAPONTYPE_UNARMED
IF NOT HAS_PED_GOT_WEAPON(PLAYER_PED(CHAR_FRANKLIN), WEAPONTYPE_ASSAULTRIFLE)
GIVE_WEAPON_TO_PED(PLAYER_PED(CHAR_FRANKLIN), WEAPONTYPE_ASSAULTRIFLE, 350, TRUE)
ENDIF
ENDIF
enumCharacterList eCharFail = GET_CURRENT_PLAYER_PED_ENUM()
IF GET_FAIL_WEAPON(ENUM_TO_INT(eCharFail)) != WEAPONTYPE_UNARMED AND GET_FAIL_WEAPON(ENUM_TO_INT(eCharFail)) != WEAPONTYPE_INVALID AND HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), GET_FAIL_WEAPON(ENUM_TO_INT(eCharFail)))
SET_CURRENT_PED_WEAPON(PLAYER_PED(CHAR_FRANKLIN), GET_FAIL_WEAPON(ENUM_TO_INT(eCharFail)), TRUE)
ELSE
SET_CURRENT_PED_WEAPON(PLAYER_PED(CHAR_FRANKLIN), GET_BEST_PED_WEAPON(PLAYER_PED(CHAR_FRANKLIN)), TRUE)
ENDIF
IF NOT bReplaySkip
LOAD_SCENE_ADV(<<941.6578, -2181.0586, 29.5517>>, 40.0)
ENDIF
WAIT_WITH_DEATH_CHECKS(0)
MAKE_PICKUPS()
//Dialogue
REMOVE_PED_FOR_DIALOGUE(sPedsForConversation, 0)
REMOVE_PED_FOR_DIALOGUE(sPedsForConversation, 1)
ADD_PED_FOR_DIALOGUE(sPedsForConversation, 0, NULL, "MICHAEL")
ADD_PED_FOR_DIALOGUE(sPedsForConversation, 1, PLAYER_PED(CHAR_FRANKLIN), "FRANKLIN")
//Audio
PLAY_AUDIO(MIC2_FIGHT_BEGINS_RT)
IF bReplaySkip = TRUE
SET_GAMEPLAY_CAM_RELATIVE_HEADING(-109.5 - GET_ENTITY_HEADING(PLAYER_PED_ID()))
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0)
ELSE
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(-10)
ENDIF
REPLAY_RECORD_BACK_FOR_TIME(3.0, 10.0, REPLAY_IMPORTANCE_HIGHEST)
IF IS_SCREEN_FADED_OUT()
DO_SCREEN_FADE_IN(500)
ENDIF
ENDIF
ELSE
IF IS_NEW_LOAD_SCENE_ACTIVE()
NEW_LOAD_SCENE_STOP()
ENDIF
INT i
SWITCH iCutsceneStage
CASE 0
IF NOT HAS_LABEL_BEEN_TRIGGERED("MCH2_ABATTF")
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED(CHAR_FRANKLIN), <<972.600098, -2065.420410, 26.316271>>, <<959.969910, -2203.768799, 39.551682>>, 100.0)
PRINT_ADV("MCH2_ABATTF") //SET_LABEL_AS_TRIGGERED("MCH2_ABATTF", TRUE)
ENDIF
ELSE
IF NOT HAS_LABEL_BEEN_TRIGGERED("AlertedTriads")
IF HAS_ANIM_DICT_LOADED_CHECK(sAnimDictMic2Smoking)
IF DOES_ENTITY_EXIST(sEnemyOutside[0].pedIndex)
IF NOT IS_PED_INJURED(sEnemyOutside[0].pedIndex)
IF NOT IS_ENTITY_PLAYING_ANIM(sEnemyOutside[0].pedIndex, sAnimDictMic2Smoking, "smoking_loop")
IF NOT HAS_LABEL_BEEN_TRIGGERED("Goon0Intimidate")
TASK_PLAY_ANIM(sEnemyOutside[0].pedIndex, sAnimDictMic2Smoking, "smoking_loop", SLOW_BLEND_IN, SLOW_BLEND_OUT, -1, AF_LOOPING)
SET_CURRENT_PED_WEAPON(sEnemyOutside[0].pedIndex, WEAPONTYPE_UNARMED, TRUE)
ELSE
TASK_PLAY_ANIM(sEnemyOutside[0].pedIndex, sAnimDictMic2Smoking, "smoking_loop", SLOW_BLEND_IN, SLOW_BLEND_OUT, -1, AF_LOOPING | AF_UPPERBODY | AF_SECONDARY)
SET_CURRENT_PED_WEAPON(sEnemyOutside[0].pedIndex, WEAPONTYPE_UNARMED, TRUE)
ENDIF
ENDIF
IF NOT DOES_ENTITY_EXIST(objCigarette[0])
IF HAS_MODEL_LOADED_CHECK(PROP_CS_CIGGY_01)
objCigarette[0] = CREATE_OBJECT(PROP_CS_CIGGY_01, GET_PED_BONE_COORDS(sEnemyOutside[0].pedIndex, BONETAG_PH_R_HAND, VECTOR_ZERO))
ATTACH_ENTITY_TO_ENTITY(objCigarette[0], sEnemyOutside[0].pedIndex, GET_PED_BONE_INDEX(sEnemyOutside[0].pedIndex, BONETAG_PH_R_HAND), vCigaretteAttachOffset, VECTOR_ZERO)
IF NOT DOES_PARTICLE_FX_LOOPED_EXIST(ptfxCigarette[0])
ptfxCigarette[0] = START_PARTICLE_FX_LOOPED_ON_ENTITY("cs_cig_smoke", objCigarette[0], vCigaretteParticleOffset, VECTOR_ZERO)
ENDIF
SET_CURRENT_PED_WEAPON(sEnemyOutside[0].pedIndex, WEAPONTYPE_UNARMED, TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(sEnemyOutside[2].pedIndex)
IF NOT IS_PED_INJURED(sEnemyOutside[2].pedIndex)
IF NOT IS_ENTITY_PLAYING_ANIM(sEnemyOutside[2].pedIndex, sAnimDictMic2Smoking, "smoking_loop")
IF NOT HAS_LABEL_BEEN_TRIGGERED("Goon2Intimidate")
TASK_PLAY_ANIM(sEnemyOutside[2].pedIndex, sAnimDictMic2Smoking, "smoking_loop", SLOW_BLEND_IN, SLOW_BLEND_OUT, -1, AF_LOOPING, 0.75)
SET_CURRENT_PED_WEAPON(sEnemyOutside[2].pedIndex, WEAPONTYPE_UNARMED, TRUE)
ELSE
TASK_PLAY_ANIM(sEnemyOutside[2].pedIndex, sAnimDictMic2Smoking, "smoking_loop", SLOW_BLEND_IN, SLOW_BLEND_OUT, -1, AF_LOOPING | AF_UPPERBODY | AF_SECONDARY, 0.75)
SET_CURRENT_PED_WEAPON(sEnemyOutside[2].pedIndex, WEAPONTYPE_UNARMED, TRUE)
ENDIF
ELSE
SET_ENTITY_ANIM_SPEED(sEnemyOutside[2].pedIndex, sAnimDictMic2Smoking, "smoking_loop", 0.75)
ENDIF
IF NOT DOES_ENTITY_EXIST(objCigarette[1])
IF HAS_MODEL_LOADED_CHECK(PROP_CS_CIGGY_01)
objCigarette[1] = CREATE_OBJECT(PROP_CS_CIGGY_01, GET_PED_BONE_COORDS(sEnemyOutside[2].pedIndex, BONETAG_PH_R_HAND, VECTOR_ZERO))
ATTACH_ENTITY_TO_ENTITY(objCigarette[1], sEnemyOutside[2].pedIndex, GET_PED_BONE_INDEX(sEnemyOutside[2].pedIndex, BONETAG_PH_R_HAND), vCigaretteAttachOffset, VECTOR_ZERO)
IF NOT DOES_PARTICLE_FX_LOOPED_EXIST(ptfxCigarette[1])
ptfxCigarette[1] = START_PARTICLE_FX_LOOPED_ON_ENTITY("cs_cig_smoke", objCigarette[1], vCigaretteParticleOffset, VECTOR_ZERO)
ENDIF
SET_CURRENT_PED_WEAPON(sEnemyOutside[2].pedIndex, WEAPONTYPE_UNARMED, TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BOOL bAlert
bAlert = FALSE
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<951.146362, -2185.526367, 34.551811>>, <<15.0, 15.0, 5.0>>)
IF NOT HAS_LABEL_BEEN_TRIGGERED("BestWeaponEquip")
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF GET_PEDS_CURRENT_WEAPON(PLAYER_PED_ID()) = WEAPONTYPE_UNARMED
AND NOT IS_PED_CLIMBING(PLAYER_PED_ID())
AND NOT IS_PED_JUMPING(PLAYER_PED_ID())
AND NOT IS_PED_RAGDOLL(PLAYER_PED_ID())
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), GET_BEST_PED_WEAPON(PLAYER_PED_ID()), TRUE)
SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), TRUE)
SET_LABEL_AS_TRIGGERED("BestWeaponEquip", TRUE)
ENDIF
ENDIF
ENDIF
IF (DOES_ENTITY_EXIST(sEnemyOutside[0].pedIndex)
AND NOT IS_PED_INJURED(sEnemyOutside[0].pedIndex)
AND NOT IS_PLAYER_TARGETTING_ENTITY(PLAYER_ID(), sEnemyOutside[0].pedIndex) AND NOT IS_PLAYER_FREE_AIMING_AT_ENTITY(PLAYER_ID(), sEnemyOutside[0].pedIndex) AND NOT IS_PED_SHOOTING(PLAYER_PED_ID()) AND (HAS_LABEL_BEEN_TRIGGERED("sEnemyOutside[0]Blocking") AND CAN_PED_SEE_HATED_PED(sEnemyOutside[0].pedIndex, PLAYER_PED_ID())))
OR (DOES_ENTITY_EXIST(sEnemyOutside[2].pedIndex)
AND NOT IS_PED_INJURED(sEnemyOutside[2].pedIndex)
AND NOT IS_PLAYER_TARGETTING_ENTITY(PLAYER_ID(), sEnemyOutside[2].pedIndex) AND NOT IS_PLAYER_FREE_AIMING_AT_ENTITY(PLAYER_ID(), sEnemyOutside[2].pedIndex) AND NOT IS_PED_SHOOTING(PLAYER_PED_ID()) AND (HAS_LABEL_BEEN_TRIGGERED("sEnemyOutside[2]Blocking") AND CAN_PED_SEE_HATED_PED(sEnemyOutside[2].pedIndex, PLAYER_PED_ID())))
IF HAS_LABEL_BEEN_TRIGGERED("MCH2_SEESF")
IF (NOT IS_MESSAGE_BEING_DISPLAYED() OR GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) = 0)
AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
PLAY_SINGLE_LINE_FROM_CONVERSATION_ADV("MCH2_SHTS", "MCH2_SHTS_1") PRINTLN("SCRIPT POINT 1")
ELSE
IF HAS_LABEL_BEEN_TRIGGERED("MCH2_SHTS_1")
IF TIMERA() > 1500
bAlert = TRUE
ENDIF
ELSE
SETTIMERA(0)
ENDIF
ENDIF
ELSE
IF DOES_ENTITY_EXIST(sEnemyOutside[0].pedIndex)
IF NOT IS_PED_INJURED(sEnemyOutside[0].pedIndex)
IF NOT HAS_LABEL_BEEN_TRIGGERED("Goon0Intimidate")
IF IS_ENTITY_AT_COORD(PLAYER_PED(CHAR_FRANKLIN), <<940.934326, -2180.620605, 32.547226>>, <<5.0, 8.0, 3.0>>)
CLEAR_PED_TASKS(sEnemyOutside[0].pedIndex)
TASK_GO_STRAIGHT_TO_COORD(sEnemyOutside[0].pedIndex, <<946.9802, -2184.5342, 29.5519>>, PEDMOVE_WALK)
ENDIF
SET_LABEL_AS_TRIGGERED("Goon0Intimidate", TRUE)
ENDIF
SET_PED_MOVE_RATE_OVERRIDE(sEnemyOutside[0].pedIndex, 0.6)
TASK_LOOK_AT_ENTITY(sEnemyOutside[0].pedIndex, PLAYER_PED(CHAR_FRANKLIN), -1)
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(sEnemyOutside[2].pedIndex)
IF NOT IS_PED_INJURED(sEnemyOutside[2].pedIndex)
IF NOT HAS_LABEL_BEEN_TRIGGERED("Goon2Intimidate")
IF IS_ENTITY_AT_COORD(PLAYER_PED(CHAR_FRANKLIN), <<940.934326, -2180.620605, 32.547226>>, <<5.0, 8.0, 3.0>>)
CLEAR_PED_TASKS(sEnemyOutside[2].pedIndex)
TASK_GO_STRAIGHT_TO_COORD(sEnemyOutside[2].pedIndex, <<948.7826, -2182.6172, 29.5519>>, PEDMOVE_WALK)
ENDIF
SET_LABEL_AS_TRIGGERED("Goon2Intimidate", TRUE)
ENDIF
SET_PED_MOVE_RATE_OVERRIDE(sEnemyOutside[2].pedIndex, 0.5)
TASK_LOOK_AT_ENTITY(sEnemyOutside[2].pedIndex, PLAYER_PED(CHAR_FRANKLIN), -1)
ENDIF
ENDIF
IF (DOES_ENTITY_EXIST(sEnemyOutside[0].pedIndex)
AND NOT IS_PED_INJURED(sEnemyOutside[0].pedIndex))
AND (DOES_ENTITY_EXIST(sEnemyOutside[2].pedIndex)
AND NOT IS_PED_INJURED(sEnemyOutside[2].pedIndex))
IF (NOT IS_MESSAGE_BEING_DISPLAYED() OR GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) = 0)
AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT HAS_LABEL_BEEN_TRIGGERED("MCH2_SEES")
ADD_PED_FOR_DIALOGUE(sPedsForConversation, 7, sEnemyOutside[2].pedIndex, "MCH2CHIN5")
REPLAY_RECORD_BACK_FOR_TIME(5.0, 5.0)
CREATE_CONVERSATION_ADV("MCH2_SEES")
ELSE
ADD_PED_FOR_DIALOGUE(sPedsForConversation, 3, sEnemyOutside[0].pedIndex, "MCH2CHIN1")
REPLAY_RECORD_BACK_FOR_TIME(5.0, 5.0)
CREATE_CONVERSATION_ADV("MCH2_SEESF")
ENDIF
ELSE
IF IS_THIS_CONVERSATION_ONGOING_OR_QUEUED("MCH2_TALK")
OR IS_THIS_CONVERSATION_ONGOING_OR_QUEUED("MCH2_TALK2")
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF (NOT IS_MESSAGE_BEING_DISPLAYED() OR GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) = 0)
AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF (DOES_ENTITY_EXIST(sEnemyOutside[0].pedIndex)
AND NOT IS_PED_INJURED(sEnemyOutside[0].pedIndex))
AND (DOES_ENTITY_EXIST(sEnemyOutside[2].pedIndex)
AND NOT IS_PED_INJURED(sEnemyOutside[2].pedIndex))
IF NOT HAS_LABEL_BEEN_TRIGGERED("Goon0Intimidate")
AND bAlert = FALSE
IF GET_GAME_TIMER() > iDialogueTimer[3]
IF IS_ENTITY_AT_COORD(PLAYER_PED(CHAR_FRANKLIN), <<950.836731, -2183.857666, 38.551857>>, <<25.0, 25.0, 10.0>>)
IF NOT HAS_LABEL_BEEN_TRIGGERED("MCH2_TALK_1")
ADD_PED_FOR_DIALOGUE(sPedsForConversation, 3, sEnemyOutside[0].pedIndex, "MCH2CHIN1")
ADD_PED_FOR_DIALOGUE(sPedsForConversation, 7, sEnemyOutside[2].pedIndex, "MCH2CHIN5")
PLAY_SINGLE_LINE_FROM_CONVERSATION_ADV("MCH2_TALK", "MCH2_TALK_1")
ELIF NOT HAS_LABEL_BEEN_TRIGGERED("MCH2_TALK_2")
PLAY_SINGLE_LINE_FROM_CONVERSATION_ADV("MCH2_TALK", "MCH2_TALK_2")
ELIF NOT HAS_LABEL_BEEN_TRIGGERED("MCH2_TALK2_1")
PLAY_SINGLE_LINE_FROM_CONVERSATION_ADV("MCH2_TALK2", "MCH2_TALK2_1")
ELIF NOT HAS_LABEL_BEEN_TRIGGERED("MCH2_TALK2_2")
PLAY_SINGLE_LINE_FROM_CONVERSATION_ADV("MCH2_TALK2", "MCH2_TALK2_2")
ENDIF
iDialogueTimer[3] = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(7500, 10000)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF bAlert = TRUE
PRINTLN("bAlert = TRUE")
ENDIF
IF (DOES_ENTITY_EXIST(sEnemyOutside[0].pedIndex)
AND NOT IS_ENTITY_DEAD(sEnemyOutside[0].pedIndex)
AND IS_PLAYER_TARGETTING_ENTITY(PLAYER_ID(), sEnemyOutside[0].pedIndex))
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sEnemyOutside[0].pedIndex, FALSE)
SET_LABEL_AS_TRIGGERED("sEnemyOutside[0]Blocking", FALSE)
ELSE
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sEnemyOutside[0].pedIndex, TRUE)
SET_LABEL_AS_TRIGGERED("sEnemyOutside[0]Blocking", TRUE)
ENDIF
IF (DOES_ENTITY_EXIST(sEnemyOutside[2].pedIndex)
AND NOT IS_ENTITY_DEAD(sEnemyOutside[2].pedIndex)
AND IS_PLAYER_TARGETTING_ENTITY(PLAYER_ID(), sEnemyOutside[2].pedIndex))
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sEnemyOutside[2].pedIndex, FALSE)
SET_LABEL_AS_TRIGGERED("sEnemyOutside[2]Blocking", FALSE)
ELSE
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sEnemyOutside[2].pedIndex, TRUE)
SET_LABEL_AS_TRIGGERED("sEnemyOutside[2]Blocking", TRUE)
ENDIF
#IF IS_DEBUG_BUILD
IF IS_EXPLOSION_IN_AREA(EXP_TAG_GRENADE, <<914.99, -2146.68, 28.63>>, <<981.29, -2201.92, 40.55>>)
OR IS_EXPLOSION_IN_AREA(EXP_TAG_GRENADELAUNCHER, <<914.99, -2146.68, 28.63>>, <<981.29, -2201.92, 40.55>>)
OR IS_EXPLOSION_IN_AREA(EXP_TAG_STICKYBOMB, <<914.99, -2146.68, 28.63>>, <<981.29, -2201.92, 40.55>>)
OR IS_EXPLOSION_IN_AREA(EXP_TAG_MOLOTOV, <<914.99, -2146.68, 28.63>>, <<981.29, -2201.92, 40.55>>)
OR IS_EXPLOSION_IN_AREA(EXP_TAG_ROCKET, <<914.99, -2146.68, 28.63>>, <<981.29, -2201.92, 40.55>>)
OR IS_EXPLOSION_IN_AREA(EXP_TAG_TANKSHELL, <<914.99, -2146.68, 28.63>>, <<981.29, -2201.92, 40.55>>)
OR IS_EXPLOSION_IN_AREA(EXP_TAG_HI_OCTANE, <<914.99, -2146.68, 28.63>>, <<981.29, -2201.92, 40.55>>)
OR IS_EXPLOSION_IN_AREA(EXP_TAG_BULLET, <<914.99, -2146.68, 28.63>>, <<981.29, -2201.92, 40.55>>)
OR IS_EXPLOSION_IN_AREA(EXP_TAG_SMOKE_GRENADE, <<914.99, -2146.68, 28.63>>, <<981.29, -2201.92, 40.55>>)
OR IS_EXPLOSION_IN_AREA(EXP_TAG_FLARE, <<914.99, -2146.68, 28.63>>, <<981.29, -2201.92, 40.55>>)
OR IS_EXPLOSION_IN_AREA(EXP_TAG_PROGRAMMABLEAR, <<914.99, -2146.68, 28.63>>, <<981.29, -2201.92, 40.55>>)
PRINTLN("IS_EXPLOSION_IN_AREA([-SEE SCRIPT-], <<914.99, -2146.68, 28.63>>, <<981.29, -2201.92, 40.55>>)")
ENDIF
IF IS_PROJECTILE_IN_AREA(<<914.99, -2146.68, 28.63>>, <<981.29, -2201.92, 40.55>>, FALSE)
PRINTLN("IS_PROJECTILE_IN_AREA(<<914.99, -2146.68, 28.63>>, <<981.29, -2201.92, 40.55>>, FALSE)")
ENDIF
IF IS_BULLET_IN_BOX(<<914.99, -2146.68, 28.63>>, <<981.29, -2201.92, 40.55>>, FALSE)
PRINTLN("IS_BULLET_IN_BOX(<<914.99, -2146.68, 28.63>>, <<981.29, -2201.92, 40.55>>, FALSE)")
ENDIF
IF IS_PED_SHOOTING_IN_AREA(PLAYER_PED_ID(), <<914.99, -2146.68, 28.63>>, <<981.29, -2201.92, 40.55>>, FALSE)
PRINTLN("IS_PED_SHOOTING_IN_AREA(PLAYER_PED_ID(), <<914.99, -2146.68, 28.63>>, <<981.29, -2201.92, 40.55>>, FALSE)")
ENDIF
IF IS_PLAYER_FREE_AIMING(PLAYER_ID())
PRINTLN("IS_PLAYER_FREE_AIMING(PLAYER_ID()")
ENDIF
IF DOES_ENTITY_EXIST(sEnemyOutside[0].pedIndex)
AND NOT IS_ENTITY_DEAD(sEnemyOutside[0].pedIndex)
AND IS_PLAYER_TARGETTING_ENTITY(PLAYER_ID(), sEnemyOutside[0].pedIndex)
AND IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<951.146362, -2185.526367, 34.551811>>, <<15.0, 15.0, 5.0>>)
PRINTLN("IS_PLAYER_TARGETTING_ENTITY(PLAYER_ID(), sEnemyOutside[0].pedIndex)")
ENDIF
IF DOES_ENTITY_EXIST(sEnemyOutside[2].pedIndex)
AND NOT IS_ENTITY_DEAD(sEnemyOutside[2].pedIndex)
AND IS_PLAYER_TARGETTING_ENTITY(PLAYER_ID(), sEnemyOutside[2].pedIndex)
AND IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<951.146362, -2185.526367, 34.551811>>, <<15.0, 15.0, 5.0>>)
PRINTLN("IS_PLAYER_TARGETTING_ENTITY(PLAYER_ID(), sEnemyOutside[2].pedIndex)")
ENDIF
IF (DOES_ENTITY_EXIST(sEnemyOutside[0].pedIndex)
AND GET_ENTITY_HEALTH(sEnemyOutside[0].pedIndex) < 200)
PRINTLN("GET_ENTITY_HEALTH(sEnemyOutside[0].pedIndex) < 200")
ENDIF
IF (DOES_ENTITY_EXIST(sEnemyOutside[2].pedIndex)
AND GET_ENTITY_HEALTH(sEnemyOutside[2].pedIndex) < 200)
PRINTLN("GET_ENTITY_HEALTH(sEnemyOutside[2].pedIndex) < 200")
ENDIF
#ENDIF
IF bAlert = TRUE
OR HAS_LABEL_BEEN_TRIGGERED("AlertedTriads")
OR (IS_EXPLOSION_IN_AREA(EXP_TAG_GRENADE, <<914.99, -2146.68, 28.63>>, <<981.29, -2201.92, 40.55>>)
OR IS_EXPLOSION_IN_AREA(EXP_TAG_GRENADELAUNCHER, <<914.99, -2146.68, 28.63>>, <<981.29, -2201.92, 40.55>>)
OR IS_EXPLOSION_IN_AREA(EXP_TAG_STICKYBOMB, <<914.99, -2146.68, 28.63>>, <<981.29, -2201.92, 40.55>>)
OR IS_EXPLOSION_IN_AREA(EXP_TAG_MOLOTOV, <<914.99, -2146.68, 28.63>>, <<981.29, -2201.92, 40.55>>)
OR IS_EXPLOSION_IN_AREA(EXP_TAG_ROCKET, <<914.99, -2146.68, 28.63>>, <<981.29, -2201.92, 40.55>>)
OR IS_EXPLOSION_IN_AREA(EXP_TAG_TANKSHELL, <<914.99, -2146.68, 28.63>>, <<981.29, -2201.92, 40.55>>)
OR IS_EXPLOSION_IN_AREA(EXP_TAG_HI_OCTANE, <<914.99, -2146.68, 28.63>>, <<981.29, -2201.92, 40.55>>)
OR IS_EXPLOSION_IN_AREA(EXP_TAG_BULLET, <<914.99, -2146.68, 28.63>>, <<981.29, -2201.92, 40.55>>)
OR IS_EXPLOSION_IN_AREA(EXP_TAG_SMOKE_GRENADE, <<914.99, -2146.68, 28.63>>, <<981.29, -2201.92, 40.55>>)
OR IS_EXPLOSION_IN_AREA(EXP_TAG_FLARE, <<914.99, -2146.68, 28.63>>, <<981.29, -2201.92, 40.55>>)
OR IS_EXPLOSION_IN_AREA(EXP_TAG_PROGRAMMABLEAR, <<914.99, -2146.68, 28.63>>, <<981.29, -2201.92, 40.55>>))
OR IS_PROJECTILE_IN_AREA(<<914.99, -2146.68, 28.63>>, <<981.29, -2201.92, 40.55>>, FALSE)
OR IS_BULLET_IN_BOX(<<914.99, -2146.68, 28.63>>, <<981.29, -2201.92, 40.55>>, FALSE)
OR IS_PED_SHOOTING_IN_AREA(PLAYER_PED_ID(), <<914.99, -2146.68, 28.63>>, <<981.29, -2201.92, 40.55>>, FALSE)
OR ((IS_PLAYER_FREE_AIMING(PLAYER_ID())
OR (DOES_ENTITY_EXIST(sEnemyOutside[0].pedIndex)
AND NOT IS_ENTITY_DEAD(sEnemyOutside[0].pedIndex)
AND IS_PLAYER_TARGETTING_ENTITY(PLAYER_ID(), sEnemyOutside[0].pedIndex))
OR (DOES_ENTITY_EXIST(sEnemyOutside[2].pedIndex)
AND NOT IS_ENTITY_DEAD(sEnemyOutside[2].pedIndex)
AND IS_PLAYER_TARGETTING_ENTITY(PLAYER_ID(), sEnemyOutside[2].pedIndex)))
AND IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<951.146362, -2185.526367, 34.551811>>, <<15.0, 15.0, 2.0>>))
OR (DOES_ENTITY_EXIST(sEnemyOutside[0].pedIndex)
AND GET_ENTITY_HEALTH(sEnemyOutside[0].pedIndex) < 200)
OR (DOES_ENTITY_EXIST(sEnemyOutside[2].pedIndex)
AND GET_ENTITY_HEALTH(sEnemyOutside[2].pedIndex) < 200)
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<980.336243, -2159.359131, 32.683861>>, <<964.162415, -2157.859863, 35.670811>>, 10.0)
OR IS_BULLET_IN_ANGLED_AREA(<<980.336243, -2159.359131, 32.683861>>, <<964.162415, -2157.859863, 35.670811>>, 10.0)
IF DOES_ENTITY_EXIST(sEnemyOutside[0].pedIndex)
IF NOT IS_PED_INJURED(sEnemyOutside[0].pedIndex)
IF NOT IS_PED_IN_COMBAT(sEnemyOutside[0].pedIndex)
CLEAR_PED_TASKS(sEnemyOutside[0].pedIndex)
ENDIF
CLEAR_PED_SECONDARY_TASK(sEnemyOutside[0].pedIndex)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sEnemyOutside[0].pedIndex, FALSE)
SET_LABEL_AS_TRIGGERED("sEnemyOutside[0]Blocking", FALSE)
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(sEnemyOutside[2].pedIndex)
IF NOT IS_PED_INJURED(sEnemyOutside[2].pedIndex)
IF bAlert = TRUE
WAIT_WITH_DEATH_CHECKS(250)
ELSE
SET_PED_COMBAT_MOVEMENT(sEnemyOutside[2].pedIndex, CM_STATIONARY)
ENDIF
IF NOT IS_PED_IN_COMBAT(sEnemyOutside[2].pedIndex)
CLEAR_PED_TASKS(sEnemyOutside[2].pedIndex)
ENDIF
CLEAR_PED_SECONDARY_TASK(sEnemyOutside[2].pedIndex)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sEnemyOutside[2].pedIndex, FALSE)
SET_LABEL_AS_TRIGGERED("sEnemyOutside[2]Blocking", FALSE)
ENDIF
ENDIF
//SET_PED_RELATIONSHIP_GROUP_HASH(sEnemyOutside[0].pedIndex, relGroupEnemy)
//SET_PED_RELATIONSHIP_GROUP_HASH(sEnemyOutside[2].pedIndex, relGroupEnemy)
//TASK_COMBAT_PED(sEnemyOutside[0].pedIndex, PLAYER_PED(CHAR_FRANKLIN))
//TASK_COMBAT_PED(sEnemyOutside[2].pedIndex, PLAYER_PED(CHAR_FRANKLIN))
REPEAT COUNT_OF(sEnemyShootout) i
IF i != 6
IF DOES_ENTITY_EXIST(sEnemyShootout[i].pedIndex)
IF NOT IS_PED_INJURED(sEnemyShootout[i].pedIndex)
TASK_COMBAT_PED(sEnemyShootout[i].pedIndex, PLAYER_PED(CHAR_FRANKLIN))
ENDIF
ENDIF
ENDIF
ENDREPEAT
SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), TRUE)
REPEAT COUNT_OF(objCigarette) i
IF DOES_PARTICLE_FX_LOOPED_EXIST(ptfxCigarette[i])
STOP_PARTICLE_FX_LOOPED(ptfxCigarette[i])
ENDIF
SAFE_DELETE_OBJECT(objCigarette[i])
ENDREPEAT
SET_MODEL_AS_NO_LONGER_NEEDED(PROP_CS_CIGGY_01)
//Audio
PLAY_AUDIO(MIC2_FIGHT_BEGINS)
ADVANCE_CUTSCENE()
ENDIF
ENDIF
BREAK
CASE 1
IF TIMERA() > 250
IF DOES_ENTITY_EXIST(sEnemyOutside[2].pedIndex)
AND NOT IS_PED_INJURED(sEnemyOutside[2].pedIndex)
SET_PED_COMBAT_MOVEMENT(sEnemyOutside[2].pedIndex, CM_DEFENSIVE)
ENDIF
ENDIF
IF (NOT IS_MESSAGE_BEING_DISPLAYED() OR GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) = 0)
AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_PED_INJURED(sEnemyOutside[0].pedIndex)
AND GET_INTERIOR_FROM_ENTITY(PLAYER_PED_ID()) != intAbattoir
ADD_PED_FOR_DIALOGUE(sPedsForConversation, 3, sEnemyOutside[0].pedIndex, "MCH2CHIN1")
CREATE_CONVERSATION_ADV("MCH2_GUN1")
ELIF NOT IS_PED_INJURED(sEnemyOutside[2].pedIndex)
AND GET_INTERIOR_FROM_ENTITY(PLAYER_PED_ID()) != intAbattoir
ADD_PED_FOR_DIALOGUE(sPedsForConversation, 7, sEnemyOutside[2].pedIndex, "MCH2CHIN5")
CREATE_CONVERSATION_ADV("MCH2_GUN")
ELSE
IF DOES_ENTITY_EXIST(sEnemyShootout[10].pedIndex)
AND NOT IS_PED_INJURED(sEnemyShootout[10].pedIndex)
CLEAR_PED_TASKS(sEnemyShootout[10].pedIndex)
TASK_COMBAT_PED(sEnemyShootout[10].pedIndex, PLAYER_PED(CHAR_FRANKLIN))
SET_PED_ALERTNESS(sEnemyShootout[10].pedIndex, AS_MUST_GO_TO_COMBAT)
FORCE_PED_MOTION_STATE(sEnemyShootout[10].pedIndex, MS_ON_FOOT_RUN)
SET_PED_SPHERE_DEFENSIVE_AREA(sEnemyShootout[10].pedIndex, <<957.4456, -2185.1714, 29.5391>>, 1.0)
SET_COMBAT_FLOAT(sEnemyShootout[10].pedIndex, CCF_STRAFE_WHEN_MOVING_CHANCE, 0.0)
SET_PED_COMBAT_ATTRIBUTES(sEnemyShootout[10].pedIndex, CA_CAN_USE_DYNAMIC_STRAFE_DECISIONS, FALSE)
SET_PED_COMBAT_ATTRIBUTES(sEnemyShootout[10].pedIndex, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
SET_PED_COMBAT_MOVEMENT(sEnemyShootout[10].pedIndex, CM_DEFENSIVE)
SET_PED_COMBAT_ATTRIBUTES(sEnemyShootout[10].pedIndex, CA_CAN_CHARGE, TRUE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sEnemyShootout[10].pedIndex, FALSE)
ADD_PED_FOR_DIALOGUE(sPedsForConversation, 4, sEnemyShootout[10].pedIndex, "MCH2CHIN2")
PLAY_PED_AMBIENT_SPEECH(sEnemyShootout[10].pedIndex, "GENERIC_CURSE_HIGH", SPEECH_PARAMS_FORCE_SHOUTED)
ENDIF
ADVANCE_CUTSCENE()
ENDIF
ENDIF
BREAK
CASE 2
IF DOES_ENTITY_EXIST(sEnemyOutside[2].pedIndex)
AND NOT IS_PED_INJURED(sEnemyOutside[2].pedIndex)
SET_PED_COMBAT_MOVEMENT(sEnemyOutside[2].pedIndex, CM_DEFENSIVE)
ENDIF
IF (NOT IS_MESSAGE_BEING_DISPLAYED() OR GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) = 0)
AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
AND GET_INTERIOR_FROM_ENTITY(PLAYER_PED_ID()) = intAbattoir
PRINT_ADV("MCH2_RESCUE")
SAFE_ADD_BLIP_PED(blipMichael, sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], FALSE)
ADVANCE_CUTSCENE()
ENDIF
BREAK
CASE 3
IF HAS_LABEL_BEEN_TRIGGERED("MCH2_RESCUE")
AND NOT IS_THIS_PRINT_BEING_DISPLAYED("MCH2_RESCUE")
AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
CREATE_CONVERSATION_FROM_SPECIFIC_LINE_ADV("MCH2_SHTS", "MCH2_SHTS_2")
ADVANCE_CUTSCENE()
ENDIF
BREAK
CASE 4
IF IS_GAMEPLAY_CAM_RENDERING()
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
AND NOT IS_MESSAGE_BEING_DISPLAYED()
IF GET_GAME_TIMER() > iDialogueTimer[0]
OR (NOT IS_PED_INJURED(sEnemySetPiece[SET_PIECE_RAIL].pedIndex)
AND iSetPiece[SET_PIECE_RAIL] = 3)
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(pedClosestEnemy)) < 20.0
AND IS_ENTITY_ON_SCREEN(pedClosestEnemy)
AND IS_PED_SHOOTING(PLAYER_PED(CHAR_FRANKLIN))
OR (NOT IS_PED_INJURED(sEnemySetPiece[SET_PIECE_RAIL].pedIndex)
AND iSetPiece[SET_PIECE_RAIL] = 3)
IF iDialogueLineCount[0] = -1
iDialogueLineCount[0] = 6
ENDIF
IF iDialogueLineCount[1] = -1
iDialogueLineCount[1] = 6
ENDIF
IF iDialogueLineCount[2] = -1
iDialogueLineCount[2] = 6
ENDIF
IF iDialogueLineCount[iDialogueStage] > 0
IF iDialogueStage = 0
IF DOES_ENTITY_EXIST(pedClosestEnemy)
AND NOT IS_PED_INJURED(pedClosestEnemy)
ADD_PED_FOR_DIALOGUE(sPedsForConversation, 3, pedClosestEnemy, "MCH2CHIN1")
CREATE_CONVERSATION_ADV("MCH2_BEFORE")
ENDIF
iDialogueTimer[0] = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(2000, 5000)
iDialogueLineCount[iDialogueStage]--
iDialogueStage++
ELIF iDialogueStage = 1
IF DOES_ENTITY_EXIST(pedClosestEnemy)
AND NOT IS_PED_INJURED(pedClosestEnemy)
ADD_PED_FOR_DIALOGUE(sPedsForConversation, 4, pedClosestEnemy, "MCH2CHIN5")
CREATE_CONVERSATION_ADV("MCH2_BEFOR2")
ENDIF
iDialogueTimer[0] = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(2000, 5000)
iDialogueLineCount[iDialogueStage]--
iDialogueStage++
ELIF iDialogueStage = 2
CREATE_CONVERSATION_ADV("MCH2_SHTF", CONV_PRIORITY_MEDIUM, FALSE)
iDialogueTimer[0] = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(2000, 5000)
iDialogueLineCount[iDialogueStage]--
iDialogueStage = 0
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
IF NOT HAS_LABEL_BEEN_TRIGGERED("EnteredAbattoir")
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<984.463074, -2187.068848, 28.977724>>, <<952.025391, -2183.805908, 33.051861>>, 4.0)
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<980.336243, -2159.359131, 32.683861>>, <<964.162415, -2157.859863, 35.670811>>, 10.0)
OR IS_BULLET_IN_ANGLED_AREA(<<980.336243, -2159.359131, 32.683861>>, <<964.162415, -2157.859863, 35.670811>>, 10.0)
OR (intAbattoir != NULL
AND GET_INTERIOR_FROM_ENTITY(PLAYER_PED_ID()) = intAbattoir)
SET_LABEL_AS_TRIGGERED("EnteredAbattoir", TRUE)
ENDIF
ELSE
//Spawn Enemies
IF NOT HAS_LABEL_BEEN_TRIGGERED("ShootoutWave1") //Entry Corridoor - Shootout: 4, 5, 6
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<974.844421, -2184.315918, 31.977201>>, <<10.0, 5.0, 3.0>>)
//sEnemyShootout
createEnemy(sEnemyShootout[4], <<998.4456, -2180.6499, 28.7595>>, 135.8026, WEAPONTYPE_SMG, G_M_M_CHIGOON_01)
sEnemyShootout[4].vLocate[0] = <<984.091248, -2187.797119, 30.501015>> sEnemyShootout[4].vLocSize[0] = <<1.5, 1.5, 1.5>> sEnemyShootout[4].eAdvanceStyle[0] = GUN_TO_POINT sEnemyShootout[4].vPoint[0] = <<997.2999, -2185.4778, 29.0007>> sEnemyShootout[4].fSpeed[0] = PEDMOVEBLENDRATIO_RUN
SET_PED_COMBAT_ATTRIBUTES(sEnemyShootout[4].pedIndex, CA_BLIND_FIRE_IN_COVER, FALSE)
createEnemy(sEnemyShootout[5], <<993.3096, -2172.7703, 29.2005>>, 263.6470, WEAPONTYPE_PUMPSHOTGUN, G_M_M_CHIGOON_01)
SET_PED_SPHERE_DEFENSIVE_AREA(sEnemyShootout[5].pedIndex, <<993.3096, -2172.7703, 29.2005>>, 1.5)
SET_PED_COMBAT_ATTRIBUTES(sEnemyShootout[5].pedIndex, CA_BLIND_FIRE_IN_COVER, FALSE)
TASK_STAY_IN_COVER(sEnemyShootout[5].pedIndex)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sEnemyShootout[5].pedIndex, 500.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sEnemyShootout[5].pedIndex, TRUE)
createEnemy(sEnemyShootout[6], <<995.6730, -2179.0708, 29.0006>>, -5.3, WEAPONTYPE_SMG)
SET_PED_COMBAT_MOVEMENT(sEnemyShootout[6].pedIndex, CM_STATIONARY)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sEnemyShootout[6].pedIndex, TRUE)
REPEAT COUNT_OF(sEnemyShootout) i
IF DOES_ENTITY_EXIST(sEnemyShootout[i].pedIndex)
//RETAIN_ENTITY_IN_INTERIOR(sEnemyShootout[i].pedIndex, intAbattoir)
ENDIF
ENDREPEAT
#IF IS_DEBUG_BUILD
REPEAT COUNT_OF(sEnemyShootout) i
IF NOT IS_PED_INJURED(sEnemyShootout[i].pedIndex)
ASSIGN_DEBUG_NAMES(sEnemyShootout[i].pedIndex, "Shootout ", i)
sEnemyShootout[i].sDebugName = CONCATENATE_STRINGS("Shootout ", GET_STRING_FROM_INT(i))
ENDIF
ENDREPEAT
#ENDIF
REPEAT COUNT_OF(sEnemyShootout) i
IF i != 6
IF DOES_ENTITY_EXIST(sEnemyShootout[i].pedIndex)
IF NOT IS_PED_INJURED(sEnemyShootout[i].pedIndex)
TASK_COMBAT_PED(sEnemyShootout[i].pedIndex, PLAYER_PED(CHAR_FRANKLIN))
ENDIF
ENDIF
ENDIF
ENDREPEAT
SET_LABEL_AS_TRIGGERED("ShootoutWave1", TRUE)
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("ShootoutWave2") //Entry Room - Shootout: 7, 8, 9 and Set Piece: SET_PIECE_STEAM, SET_PIECE_RAIL
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<994.374084, -2175.041748, 31.483383>>, <<7.0, 8.0, 3.5>>)
//sEnemyShootout
createEnemy(sEnemyShootout[7], <<970.51898, -2158.60938, 28.4752>>, 266.3385, WEAPONTYPE_PISTOL)
SET_PED_COMBAT_MOVEMENT(sEnemyShootout[7].pedIndex, CM_STATIONARY)
SET_PED_ACCURACY(sEnemyShootout[7].pedIndex, 1)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sEnemyShootout[7].pedIndex, TRUE)
createEnemy(sEnemyShootout[8], <<967.1279, -2166.9990, 29.8864>>, 265.5443, WEAPONTYPE_ASSAULTRIFLE, G_M_M_CHIGOON_01)
SET_ENTITY_HEALTH(sEnemyShootout[8].pedIndex, 105)
SET_PED_COMBAT_MOVEMENT(sEnemyShootout[8].pedIndex, CM_STATIONARY)
SET_PED_SPHERE_DEFENSIVE_AREA(sEnemyShootout[8].pedIndex, <<967.1279, -2166.9990, 29.8864>>, 1.5, TRUE)
createEnemy(sEnemyShootout[9], <<966.2576, -2161.1187, 28.4930>>, 178.2352, WEAPONTYPE_SMG)
SET_PED_COMBAT_MOVEMENT(sEnemyShootout[9].pedIndex, CM_DEFENSIVE)
REPEAT COUNT_OF(sEnemyShootout) i
IF DOES_ENTITY_EXIST(sEnemyShootout[i].pedIndex)
//RETAIN_ENTITY_IN_INTERIOR(sEnemyShootout[i].pedIndex, intAbattoir)
ENDIF
ENDREPEAT
#IF IS_DEBUG_BUILD
REPEAT COUNT_OF(sEnemyShootout) i
IF NOT IS_PED_INJURED(sEnemyShootout[i].pedIndex)
ASSIGN_DEBUG_NAMES(sEnemyShootout[i].pedIndex, "Shootout ", i)
sEnemyShootout[i].sDebugName = CONCATENATE_STRINGS("Shootout ", GET_STRING_FROM_INT(i))
ENDIF
ENDREPEAT
#ENDIF
REPEAT COUNT_OF(sEnemyShootout) i
IF i != 6
IF DOES_ENTITY_EXIST(sEnemyShootout[i].pedIndex)
IF NOT IS_PED_INJURED(sEnemyShootout[i].pedIndex)
TASK_COMBAT_PED(sEnemyShootout[i].pedIndex, PLAYER_PED(CHAR_FRANKLIN))
ENDIF
ENDIF
ENDIF
ENDREPEAT
//sEnemySetPiece
createEnemy(sEnemySetPiece[SET_PIECE_STEAM], <<976.6239, -2166.3784, 30.4104 + 0.25>>, 266.3925, WEAPONTYPE_ASSAULTRIFLE)
SET_PED_ALLOWED_TO_DUCK(sEnemySetPiece[SET_PIECE_STEAM].pedIndex, FALSE)
createEnemy(sEnemySetPiece[SET_PIECE_RAIL], <<970.7867, -2163.6367, 28.4890>>, 266.1377, WEAPONTYPE_PISTOL)
#IF IS_DEBUG_BUILD
REPEAT COUNT_OF(sEnemySetPiece) i
IF DOES_ENTITY_EXIST(sEnemySetPiece[i].pedIndex)
IF NOT IS_PED_INJURED(sEnemySetPiece[i].pedIndex)
ASSIGN_DEBUG_NAMES(sEnemySetPiece[i].pedIndex, "SetPiece ", i)
sEnemySetPiece[i].sDebugName = CONCATENATE_STRINGS("SetPiece ", GET_STRING_FROM_INT(i))
ENDIF
ENDIF
ENDREPEAT
#ENDIF
REPEAT COUNT_OF(sEnemySetPiece) i
IF i = ENUM_TO_INT(SET_PIECE_STEAM) OR i = ENUM_TO_INT(SET_PIECE_GRINDER) OR i = ENUM_TO_INT(SET_PIECE_CUTTER)
IF DOES_ENTITY_EXIST(sEnemySetPiece[i].pedIndex)
//RETAIN_ENTITY_IN_INTERIOR(sEnemySetPiece[i].pedIndex, intAbattoir)
SET_PED_CONFIG_FLAG(sEnemySetPiece[i].pedIndex, PCF_DontActivateRagdollFromBulletImpact, TRUE)
SET_PED_CONFIG_FLAG(sEnemySetPiece[i].pedIndex, PCF_DontActivateRagdollFromElectrocution, TRUE)
SET_PED_CONFIG_FLAG(sEnemySetPiece[i].pedIndex, PCF_DontActivateRagdollFromFire, TRUE)
SET_RAGDOLL_BLOCKING_FLAGS(sEnemySetPiece[i].pedIndex, RBF_BULLET_IMPACT | RBF_EXPLOSION | RBF_ELECTROCUTION | RBF_FIRE | RBF_RUBBER_BULLET)SET_RAGDOLL_BLOCKING_FLAGS(sEnemySetPiece[i].pedIndex, RBF_FIRE)
SET_PED_COMBAT_MOVEMENT(sEnemySetPiece[i].pedIndex, CM_STATIONARY) #IF IS_DEBUG_BUILD PRINTLN("SET_PED_COMBAT_MOVEMENT(sEnemySetPiece[", i,"].pedIndex, CM_STATIONARY)") #ENDIF
SET_PED_SUFFERS_CRITICAL_HITS(sEnemySetPiece[i].pedIndex, FALSE)
SET_PED_MAX_HEALTH(sEnemySetPiece[i].pedIndex, 1000)
SET_ENTITY_HEALTH(sEnemySetPiece[i].pedIndex, 1000)
SET_PED_STRAFE_CLIPSET(sEnemySetPiece[i].pedIndex, "move_ped_strafing")
ENDIF
ENDIF
ENDREPEAT
IF DOES_ENTITY_EXIST(sEnemySetPiece[SET_PIECE_RAIL].pedIndex)
//RETAIN_ENTITY_IN_INTERIOR(sEnemySetPiece[SET_PIECE_RAIL].pedIndex, intAbattoir)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sEnemySetPiece[SET_PIECE_RAIL].pedIndex, TRUE)
ENDIF
SET_LABEL_AS_TRIGGERED("ShootoutWave2", TRUE)
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("ShootoutWave3") //Main Corridoor - Shootout: 11, 12, 13, 14, 15 and Set Piece: SET_PIECE_STAIR, SET_PIECE_GRINDER, SET_PIECE_CUTTER
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<972.544800, -2166.483154, 31.963011>>, <<8.5, 5.5, 3.5>>)
//sEnemyShootout
createEnemy(sEnemyShootout[11], <<994.4498, -2152.9666, 28.4764>>, 137.2933, WEAPONTYPE_PISTOL)
SET_PED_COMBAT_MOVEMENT(sEnemyShootout[11].pedIndex, CM_STATIONARY)
createEnemy(sEnemyShootout[12], <<985.8372, -2161.9763, 28.4865>>, 353.2941, WEAPONTYPE_ASSAULTRIFLE, G_M_M_CHIGOON_01)
SET_PED_COMBAT_MOVEMENT(sEnemyShootout[12].pedIndex, CM_DEFENSIVE)
SET_ENTITY_LOD_DIST(sEnemyShootout[12].pedIndex, 20)
createEnemy(sEnemyShootout[13], <<996.5764, -2158.7720, 28.5003>>, 173.2941, WEAPONTYPE_SMG)
SET_PED_COMBAT_MOVEMENT(sEnemyShootout[13].pedIndex, CM_DEFENSIVE)
createEnemy(sEnemyShootout[14], <<996.8381, -2152.1233, 28.4765>>, 137.2934, WEAPONTYPE_SMG)
SET_PED_COMBAT_MOVEMENT(sEnemyShootout[14].pedIndex, CM_STATIONARY)
createEnemy(sEnemyShootout[15], <<975.6500, -2159.4011, 28.4758>>, 209.9887, WEAPONTYPE_PISTOL, G_M_M_CHIGOON_01)
SET_PED_COMBAT_MOVEMENT(sEnemyShootout[15].pedIndex, CM_DEFENSIVE)
SET_PED_SPHERE_DEFENSIVE_AREA(sEnemyShootout[15].pedIndex, <<975.6500, -2159.4011, 28.4758>>, 1.5, TRUE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sEnemyShootout[15].pedIndex, TRUE)
REPEAT COUNT_OF(sEnemyShootout) i
IF DOES_ENTITY_EXIST(sEnemyShootout[i].pedIndex)
//RETAIN_ENTITY_IN_INTERIOR(sEnemyShootout[i].pedIndex, intAbattoir)
ENDIF
ENDREPEAT
#IF IS_DEBUG_BUILD
REPEAT COUNT_OF(sEnemyShootout) i
IF NOT IS_PED_INJURED(sEnemyShootout[i].pedIndex)
ASSIGN_DEBUG_NAMES(sEnemyShootout[i].pedIndex, "Shootout ", i)
sEnemyShootout[i].sDebugName = CONCATENATE_STRINGS("Shootout ", GET_STRING_FROM_INT(i))
ENDIF
ENDREPEAT
#ENDIF
REPEAT COUNT_OF(sEnemyShootout) i
IF i != 6
IF DOES_ENTITY_EXIST(sEnemyShootout[i].pedIndex)
IF NOT IS_PED_INJURED(sEnemyShootout[i].pedIndex)
TASK_COMBAT_PED(sEnemyShootout[i].pedIndex, PLAYER_PED(CHAR_FRANKLIN))
ENDIF
ENDIF
ENDIF
ENDREPEAT
//sEnemySetPiece
createEnemy(sEnemySetPiece[SET_PIECE_GRINDER], <<990.69, -2161.42, 30.4404>>, 82.2840, WEAPONTYPE_SMG, G_M_M_CHIGOON_01)
SET_PED_ALLOWED_TO_DUCK(sEnemySetPiece[SET_PIECE_GRINDER].pedIndex, FALSE)
createEnemy(sEnemySetPiece[SET_PIECE_STAIR], <<978.2984, -2156.2178, 30.1027>>, 86.4433, WEAPONTYPE_PUMPSHOTGUN, G_M_M_CHIGOON_01)
createEnemy(sEnemySetPiece[SET_PIECE_CUTTER], <<997.6876, -2144.3420, 28.5000>>, 173.3068, WEAPONTYPE_ASSAULTRIFLE)
#IF IS_DEBUG_BUILD
REPEAT COUNT_OF(sEnemySetPiece) i
IF DOES_ENTITY_EXIST(sEnemySetPiece[i].pedIndex)
IF NOT IS_PED_INJURED(sEnemySetPiece[i].pedIndex)
ASSIGN_DEBUG_NAMES(sEnemySetPiece[i].pedIndex, "SetPiece ", i)
sEnemySetPiece[i].sDebugName = CONCATENATE_STRINGS("SetPiece ", GET_STRING_FROM_INT(i))
ENDIF
ENDIF
ENDREPEAT
#ENDIF
REPEAT COUNT_OF(sEnemySetPiece) i
IF i = ENUM_TO_INT(SET_PIECE_STEAM) OR i = ENUM_TO_INT(SET_PIECE_GRINDER) OR i = ENUM_TO_INT(SET_PIECE_CUTTER)
IF DOES_ENTITY_EXIST(sEnemySetPiece[i].pedIndex)
//RETAIN_ENTITY_IN_INTERIOR(sEnemySetPiece[i].pedIndex, intAbattoir)
SET_PED_CONFIG_FLAG(sEnemySetPiece[i].pedIndex, PCF_DontActivateRagdollFromBulletImpact, TRUE)
SET_PED_CONFIG_FLAG(sEnemySetPiece[i].pedIndex, PCF_DontActivateRagdollFromElectrocution, TRUE)
SET_PED_CONFIG_FLAG(sEnemySetPiece[i].pedIndex, PCF_DontActivateRagdollFromFire, TRUE)
SET_RAGDOLL_BLOCKING_FLAGS(sEnemySetPiece[i].pedIndex, RBF_BULLET_IMPACT | RBF_EXPLOSION | RBF_ELECTROCUTION | RBF_FIRE | RBF_RUBBER_BULLET)SET_RAGDOLL_BLOCKING_FLAGS(sEnemySetPiece[i].pedIndex, RBF_FIRE)
SET_PED_COMBAT_MOVEMENT(sEnemySetPiece[i].pedIndex, CM_STATIONARY) #IF IS_DEBUG_BUILD PRINTLN("SET_PED_COMBAT_MOVEMENT(sEnemySetPiece[", i,"].pedIndex, CM_STATIONARY)") #ENDIF
SET_PED_SUFFERS_CRITICAL_HITS(sEnemySetPiece[i].pedIndex, FALSE)
SET_PED_MAX_HEALTH(sEnemySetPiece[i].pedIndex, 1000)
SET_ENTITY_HEALTH(sEnemySetPiece[i].pedIndex, 1000)
SET_PED_STRAFE_CLIPSET(sEnemySetPiece[i].pedIndex, "move_ped_strafing")
ENDIF
ENDIF
ENDREPEAT
IF DOES_ENTITY_EXIST(sEnemySetPiece[SET_PIECE_STAIR].pedIndex)
//RETAIN_ENTITY_IN_INTERIOR(sEnemySetPiece[SET_PIECE_STAIR].pedIndex, intAbattoir)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sEnemySetPiece[SET_PIECE_STAIR].pedIndex, TRUE)
ENDIF
IF DOES_ENTITY_EXIST(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex, TRUE)
ENDIF
SET_LABEL_AS_TRIGGERED("ShootoutWave3", TRUE)
ENDIF
ENDIF
ENDIF
IF (iCutsceneStage < 3
OR TIMERA() < 3000)
AND NOT HAS_LABEL_BEEN_TRIGGERED("EnteredAbattoir")
REPEAT COUNT_OF(sEnemyShootout) i
IF i <> 10
IF DOES_ENTITY_EXIST(sEnemyShootout[i].pedIndex)
AND NOT IS_PED_INJURED(sEnemyShootout[i].pedIndex)
SET_PED_RESET_FLAG(sEnemyShootout[i].pedIndex, PRF_BlockWeaponFire, TRUE)
ENDIF
ENDIF
ENDREPEAT
ENDIF
// IF IS_ENTITY_ON_SCREEN(PLAYER_PED(CHAR_MICHAEL))
// IF NOT bDoPlayerShootUpsideDown
// IF CREATE_CONVERSATION(sPedsForConversation, "MCH2AUD", "MCHHP1", CONV_PRIORITY_MEDIUM)
// iShootDownMichaelTextProg++
// ENDIF
// ELSE
// IF CREATE_CONVERSATION(sPedsForConversation, "MCH2AUD", "MCHTWP", CONV_PRIORITY_MEDIUM) //Franklin! Throw me a fucking gun!
// iShootDownMichaelTextProg++
// ENDIF
// ENDIF
// ENDIF
// IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
// IF NOT bDoPlayerSHootUpsideDown
// PRINT_ADV("MCH2_RELMCH")
//
// IF DOES_ENTITY_EXIST(objHook)
// SET_OBJECT_TARGETTABLE(objHook, TRUE)
// ENDIF
//
// iShootDownMichaelTextProg++
// ELSE
// PRINT_ADV("MCH2_GETCLM") //Get closer to Michael
// iShootDownMichaelTextProg++
// ENDIF
// ENDIF
// BREAK
// CASE 2
// IF NOT IS_MESSAGE_BEING_DISPLAYED()
// IF NOT bDoPlayerSHootUpsideDown
// IF iShootDownMichaelTimer = 0
// GET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), wtPlayer)
//
// IF wtPlayer = WEAPONTYPE_PUMPSHOTGUN
// IF NOT IS_ENTITY_DEAD(sBuddy[MISSION_CHAR_MICHAEL].ped)
// IF IS_PLAYER_TARGETTING_ENTITY(PLAYER_ID(), sBuddy[MISSION_CHAR_MICHAEL].ped)
// OR IS_PLAYER_TARGETTING_ENTITY(PLAYER_ID(), objHook)
// OR IS_PLAYER_FREE_AIMING_AT_ENTITY( PLAYER_ID(), sBuddy[MISSION_CHAR_MICHAEL].ped)
// OR IS_PLAYER_FREE_AIMING_AT_ENTITY( PLAYER_ID(), objHook)
// IF CREATE_CONVERSATION(sPedsForConversation, "MCH2AUD", "MCHES4", CONV_PRIORITY_MEDIUM)
// iShootDownMichaelTextProg++
// ENDIF
// ELSE
// IF CREATE_CONVERSATION(sPedsForConversation, "MCH2AUD", "MCHHP2", CONV_PRIORITY_MEDIUM)
// iShootDownMichaelTextProg++
// ENDIF
// ENDIF
// ENDIF
// ELSE
// IF CREATE_CONVERSATION(sPedsForConversation, "MCH2AUD", "MCHHP2", CONV_PRIORITY_MEDIUM)
// iShootDownMichaelTextProg++
// ENDIF
// ENDIF
// ENDIF
// ELSE
// IF bPlayerSHootingUpsideDown
// PRINT_HELP_ADV("MCH2_UPSAIM") //Controls for aiming upside down
// iShootDownMichaelTextProg++
// ENDIF
// ENDIF
// ENDIF
// BREAK
// CASE 3
// IF NOT bDoPlayerSHootUpsideDown
// IF iShootDownMichaelTimer = 0
// GET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), wtPlayer)
// IF wtPlayer = WEAPONTYPE_PUMPSHOTGUN
// KILL_ANY_CONVERSATION()
// IF NOT IS_ENTITY_DEAD(sBuddy[MISSION_CHAR_MICHAEL].ped)
// IF IS_PLAYER_TARGETTING_ENTITY(PLAYER_ID(), sBuddy[MISSION_CHAR_MICHAEL].ped)
// OR IS_PLAYER_TARGETTING_ENTITY(PLAYER_ID(), objHook)
// OR IS_PLAYER_FREE_AIMING_AT_ENTITY(PLAYER_ID(), sBuddy[MISSION_CHAR_MICHAEL].ped)
// OR IS_PLAYER_FREE_AIMING_AT_ENTITY(PLAYER_ID(), objHook)
// CREATE_CONVERSATION_ADV("MCHES4")
//
// iShootDownMichaelTextProg++
// ENDIF
// ENDIF
// ENDIF
// ENDIF
// ELSE
// IF NOT IS_HELP_MESSAGE_BEING_DISPLAYED()
// PRINT_HELP("MCH2_RELMCH2")
// iShootDownMichaelTextProg++
// ENDIF
// ENDIF
// BREAK
// ENDSWITCH
//Tyre Burst!
IF NOT IS_ENTITY_DEAD(vehEnemy[0])
//CAR MODEL: Bison
//FRONT LEFT WHEEL OFFSET: <<-1.0000, 1.8000, -0.1500>>
//FRONT RIGHT WHEEL OFFSET: <<1.0000, 1.8000, -0.1500>>
//REAR LEFT WHEEL OFFSET: <<1.0000, -1.6000, -0.1500>>
//REAR RIGHT WHEEL OFFSET: <<-1.0000, -1.6000, -0.1500>>
//FRONT LEFT DAMAGE OFFSET: <<-1.0000, 0.6500, 0.5000>>
//FRONT RIGHT DAMAGE OFFSET: <<1.0000, 0.6500, 0.5000>>
//REAR LEFT DAMAGE OFFSET: <<-1.0000, -2.0000, 0.5000>>
//REAR RIGHT DAMAGE OFFSET: <<1.0000, -2.0500, 0.5000>>
//DAMAGE: 100.0000
//DEFORMATION: 100.0000
IF NOT IS_VEHICLE_TYRE_BURST(vehEnemy[0], SC_WHEEL_CAR_FRONT_RIGHT)
IF IS_BULLET_IN_AREA(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(vehEnemy[0], <<1.0000, 1.8000, -0.1500>>), 2.0)
SET_VEHICLE_TYRE_BURST(vehEnemy[0], SC_WHEEL_CAR_FRONT_RIGHT)
SMASH_VEHICLE_WINDOW(vehEnemy[0], SC_WINDOW_FRONT_RIGHT)
SMASH_VEHICLE_WINDOW(vehEnemy[0], SC_WINDOW_REAR_RIGHT)
//SET_VEHICLE_DAMAGE(vehEnemy[0], <<1.0000, 0.6500, 0.5000>>, 100.0, 100.0, TRUE)
ENDIF
ENDIF
IF NOT IS_VEHICLE_TYRE_BURST(vehEnemy[0], SC_WHEEL_CAR_REAR_RIGHT)
IF IS_BULLET_IN_AREA(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(vehEnemy[0], <<1.0000, -1.6000, -0.1500>>), 2.0)
SET_VEHICLE_TYRE_BURST(vehEnemy[0], SC_WHEEL_CAR_REAR_RIGHT)
//SET_VEHICLE_DAMAGE(vehEnemy[0], <<1.0000, -2.0500, 0.5000>>, 100.0, 100.0, TRUE)
ENDIF
ENDIF
ENDIF
//Open Combat
IF DOES_ENTITY_EXIST(sEnemyShootout[10].pedIndex)
AND NOT IS_PED_INJURED(sEnemyShootout[10].pedIndex)
IF NOT HAS_LABEL_BEEN_TRIGGERED("OpenCombat")
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sEnemyShootout[10].pedIndex)) <= 7.5
OR GET_ENTITY_HEALTH(sEnemyShootout[10].pedIndex) < 200
OR IS_PED_RAGDOLL(sEnemyShootout[10].pedIndex)
OR IS_ENTITY_AT_COORD(sEnemyShootout[10].pedIndex, <<957.4456, -2185.1714, 29.5391>>, <<1.0, 1.0, 3.0>>)
SET_PED_ALERTNESS(sEnemyShootout[10].pedIndex, AS_MUST_GO_TO_COMBAT)
REMOVE_PED_DEFENSIVE_AREA(sEnemyShootout[10].pedIndex)
SET_COMBAT_FLOAT(sEnemyShootout[10].pedIndex, CCF_STRAFE_WHEN_MOVING_CHANCE, 0.75)
SET_PED_COMBAT_ATTRIBUTES(sEnemyShootout[10].pedIndex, CA_CAN_USE_DYNAMIC_STRAFE_DECISIONS, TRUE)
SET_PED_COMBAT_ATTRIBUTES(sEnemyShootout[10].pedIndex, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
SET_PED_COMBAT_MOVEMENT(sEnemyShootout[10].pedIndex, CM_WILLADVANCE)
SET_PED_COMBAT_ATTRIBUTES(sEnemyShootout[10].pedIndex, CA_CAN_CHARGE, TRUE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sEnemyShootout[10].pedIndex, FALSE)
SET_LABEL_AS_TRIGGERED("OpenCombat", TRUE)
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("OpenCombat0")
IF DOES_ENTITY_EXIST(sEnemyShootout[1].pedIndex)
IF NOT IS_PED_INJURED(sEnemyShootout[1].pedIndex)
IF GET_ENTITY_HEALTH(sEnemyShootout[0].pedIndex) < 200
OR IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<963.077393, -2185.471924, 31.150967>>, <<3.0, 2.0, 2.0>>)
SET_PED_SPHERE_DEFENSIVE_AREA(sEnemyShootout[1].pedIndex, <<978.5643, -2185.9519, 29.0001>>, 2.0)
SET_PED_COMBAT_ATTRIBUTES(sEnemyShootout[1].pedIndex, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
SET_PED_COMBAT_MOVEMENT(sEnemyShootout[1].pedIndex, CM_WILLADVANCE)
SET_PED_COMBAT_ATTRIBUTES(sEnemyShootout[1].pedIndex, CA_CAN_CHARGE, TRUE)
IF NOT IS_PED_INJURED(sEnemyShootout[0].pedIndex)
SET_PED_COMBAT_ATTRIBUTES(sEnemyShootout[0].pedIndex, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
SET_PED_COMBAT_MOVEMENT(sEnemyShootout[0].pedIndex, CM_WILLADVANCE)
SET_PED_COMBAT_ATTRIBUTES(sEnemyShootout[0].pedIndex, CA_CAN_CHARGE, TRUE)
ENDIF
SET_LABEL_AS_TRIGGERED("OpenCombat0", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("OpenCombat1")
IF DOES_ENTITY_EXIST(sEnemyShootout[3].pedIndex)
IF NOT IS_PED_INJURED(sEnemyShootout[3].pedIndex)
IF GET_ENTITY_HEALTH(sEnemyShootout[3].pedIndex) < 200
OR IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<982.726868, -2187.271484, 30.727684>>, <<2.0, 2.0, 2.0>>)
OR (IS_PED_INJURED(sEnemyShootout[0].pedIndex)
AND IS_PED_INJURED(sEnemyShootout[1].pedIndex)
AND IS_PED_INJURED(sEnemyShootout[2].pedIndex))
REMOVE_PED_DEFENSIVE_AREA(sEnemyShootout[3].pedIndex)
SET_PED_COMBAT_ATTRIBUTES(sEnemyShootout[3].pedIndex, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
SET_PED_COMBAT_MOVEMENT(sEnemyShootout[3].pedIndex, CM_WILLADVANCE)
SET_PED_COMBAT_ATTRIBUTES(sEnemyShootout[3].pedIndex, CA_CAN_CHARGE, TRUE)
SET_LABEL_AS_TRIGGERED("OpenCombat1", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("OpenCombat2")
IF DOES_ENTITY_EXIST(sEnemyShootout[4].pedIndex)
IF NOT IS_PED_INJURED(sEnemyShootout[4].pedIndex)
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<982.726868, -2187.271484, 30.727684>>, <<2.0, 2.0, 2.0>>)
REMOVE_PED_DEFENSIVE_AREA(sEnemyShootout[4].pedIndex)
SET_PED_COMBAT_ATTRIBUTES(sEnemyShootout[4].pedIndex, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
SET_PED_COMBAT_MOVEMENT(sEnemyShootout[4].pedIndex, CM_WILLADVANCE)
SET_PED_COMBAT_ATTRIBUTES(sEnemyShootout[4].pedIndex, CA_CAN_CHARGE, TRUE)
SET_LABEL_AS_TRIGGERED("OpenCombat2", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("OpenCombat3")
IF DOES_ENTITY_EXIST(sEnemyShootout[5].pedIndex)
IF NOT IS_PED_INJURED(sEnemyShootout[5].pedIndex)
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<993.417542, -2174.615967, 28.490120>>, <<991.907959, -2190.386963, 33.978271>>, 12.5)
AND IS_ENTITY_ON_SCREEN(PLAYER_PED_ID())
AND NOT IS_ENTITY_OCCLUDED(PLAYER_PED_ID())
REMOVE_PED_DEFENSIVE_AREA(sEnemyShootout[5].pedIndex)
SET_PED_COMBAT_ATTRIBUTES(sEnemyShootout[5].pedIndex, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
SET_PED_COMBAT_MOVEMENT(sEnemyShootout[5].pedIndex, CM_WILLADVANCE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sEnemyShootout[5].pedIndex, 500.0)
SET_PED_COMBAT_ATTRIBUTES(sEnemyShootout[5].pedIndex, CA_CAN_CHARGE, TRUE)
SET_LABEL_AS_TRIGGERED("OpenCombat3", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("OpenCombat4")
IF DOES_ENTITY_EXIST(sEnemyShootout[6].pedIndex)
IF NOT IS_PED_INJURED(sEnemyShootout[6].pedIndex)
IF IS_PED_INJURED(sEnemyShootout[5].pedIndex)
OR IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<996.895630, -2172.183350, 30.974617>>, <<4.0, 2.0, 3.0>>)
REMOVE_PED_DEFENSIVE_AREA(sEnemyShootout[6].pedIndex)
SET_PED_COMBAT_ATTRIBUTES(sEnemyShootout[6].pedIndex, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
SET_PED_COMBAT_MOVEMENT(sEnemyShootout[6].pedIndex, CM_WILLADVANCE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sEnemyShootout[6].pedIndex, 500.0)
SET_PED_COMBAT_ATTRIBUTES(sEnemyShootout[6].pedIndex, CA_CAN_CHARGE, TRUE)
SET_LABEL_AS_TRIGGERED("OpenCombat4", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("OpenCombat4a")
IF DOES_ENTITY_EXIST(sEnemyShootout[7].pedIndex)
IF NOT IS_PED_INJURED(sEnemyShootout[7].pedIndex)
IF IS_PED_INJURED(sEnemyShootout[8].pedIndex)
OR IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<984.216492, -2168.708496, 32.463554>>, <<5.0, 4.0, 4.0>>)
OPEN_SEQUENCE_TASK(seqMain)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(NULL, <<971.6310, -2169.5830, 28.5254>>, PLAYER_PED_ID(), PEDMOVE_RUN, TRUE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 500.0)
CLOSE_SEQUENCE_TASK(seqMain)
TASK_PERFORM_SEQUENCE(sEnemyShootout[7].pedIndex, seqMain)
CLEAR_SEQUENCE_TASK(seqMain)
REMOVE_PED_DEFENSIVE_AREA(sEnemyShootout[7].pedIndex)
SET_PED_COMBAT_ATTRIBUTES(sEnemyShootout[7].pedIndex, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
SET_PED_COMBAT_MOVEMENT(sEnemyShootout[7].pedIndex, CM_WILLADVANCE)
SET_PED_COMBAT_ATTRIBUTES(sEnemyShootout[7].pedIndex, CA_CAN_CHARGE, TRUE)
SET_LABEL_AS_TRIGGERED("OpenCombat4a", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("OpenCombat5")
IF DOES_ENTITY_EXIST(sEnemyShootout[9].pedIndex)
IF NOT IS_PED_INJURED(sEnemyShootout[9].pedIndex)
IF (IS_PED_INJURED(sEnemyShootout[6].pedIndex)
AND IS_PED_INJURED(sEnemyShootout[7].pedIndex)
AND IS_PED_INJURED(sEnemyShootout[8].pedIndex))
OR IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<968.906372, -2167.271240, 30.966833>>,<<4.0, 4.0, 3.0>>)
REMOVE_PED_DEFENSIVE_AREA(sEnemyShootout[9].pedIndex)
SET_PED_COMBAT_ATTRIBUTES(sEnemyShootout[9].pedIndex, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
SET_PED_COMBAT_MOVEMENT(sEnemyShootout[9].pedIndex, CM_WILLADVANCE)
SET_PED_COMBAT_ATTRIBUTES(sEnemyShootout[9].pedIndex, CA_CAN_CHARGE, TRUE)
SET_LABEL_AS_TRIGGERED("OpenCombat5", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
IF HAS_LABEL_BEEN_TRIGGERED("OpenCombat5")
IF NOT HAS_LABEL_BEEN_TRIGGERED("OpenCombat5a")
IF DOES_ENTITY_EXIST(sEnemyShootout[15].pedIndex)
IF NOT IS_PED_INJURED(sEnemyShootout[15].pedIndex)
IF NOT HAS_LABEL_BEEN_TRIGGERED("EnteredArea5a")
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<963.611145, -2166.840820, 28.225246>>, <<977.714966, -2168.133057, 33.455669>>, 7.0)
iAdvanceTimer = GET_GAME_TIMER() + 1000
SET_LABEL_AS_TRIGGERED("EnteredArea5a", TRUE)
ENDIF
ENDIF
IF HAS_LABEL_BEEN_TRIGGERED("EnteredArea5a")
AND (GET_GAME_TIMER() > iAdvanceTimer
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<972.798096, -2167.464355, 28.460669>>, <<963.478210, -2166.797852, 33.475464>>, 7.5))
OPEN_SEQUENCE_TASK(seqMain)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(NULL, <<970.4205, -2166.4172, 28.4646>>, PLAYER_PED_ID(), PEDMOVE_RUN, TRUE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 500.0)
CLOSE_SEQUENCE_TASK(seqMain)
TASK_PERFORM_SEQUENCE(sEnemyShootout[15].pedIndex, seqMain)
CLEAR_SEQUENCE_TASK(seqMain)
REMOVE_PED_DEFENSIVE_AREA(sEnemyShootout[15].pedIndex)
SET_PED_COMBAT_ATTRIBUTES(sEnemyShootout[15].pedIndex, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
SET_PED_COMBAT_MOVEMENT(sEnemyShootout[15].pedIndex, CM_WILLADVANCE)
SET_PED_COMBAT_ATTRIBUTES(sEnemyShootout[15].pedIndex, CA_CAN_CHARGE, TRUE)
SET_LABEL_AS_TRIGGERED("OpenCombat5a", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("FreeEnemy")
IF DOES_ENTITY_EXIST(sEnemyShootout[2].pedIndex)
IF NOT IS_PED_INJURED(sEnemyShootout[2].pedIndex)
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<984.336243, -2168.873291, 28.462013>>, <<990.817139, -2169.578857, 33.468571>>, 7.5)
AND NOT IS_ENTITY_ON_SCREEN(sEnemyShootout[2].pedIndex)
AND IS_ENTITY_OCCLUDED(sEnemyShootout[2].pedIndex)
SET_PED_POSITION(sEnemyShootout[2].pedIndex, <<987.8972, -2181.2058, 29.0561>>, 311.3820)
REMOVE_PED_DEFENSIVE_AREA(sEnemyShootout[2].pedIndex)
SET_PED_COMBAT_ATTRIBUTES(sEnemyShootout[2].pedIndex, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
SET_PED_COMBAT_MOVEMENT(sEnemyShootout[2].pedIndex, CM_WILLADVANCE)
SET_PED_COMBAT_ATTRIBUTES(sEnemyShootout[2].pedIndex, CA_CAN_CHARGE, TRUE)
SET_LABEL_AS_TRIGGERED("FreeEnemy", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("OpenCombat6")
IF DOES_ENTITY_EXIST(sEnemyShootout[12].pedIndex)
IF NOT IS_PED_INJURED(sEnemyShootout[12].pedIndex)
IF IS_PED_INJURED(sEnemySetPiece[SET_PIECE_STAIR].pedIndex)
OR IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<969.533569, -2158.632324, 30.974899>>, <<6.0, 6.0, 3.0>>)
OPEN_SEQUENCE_TASK(seqMain)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
IF NOT IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<973.709839, -2159.690430, 30.475533>>, <<2.0, 2.0, 2.0>>)
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(NULL, <<976.0801, -2159.8713, 28.4758>>, PLAYER_PED_ID(), PEDMOVE_RUN, TRUE)
ENDIF
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 500.0)
CLOSE_SEQUENCE_TASK(seqMain)
TASK_PERFORM_SEQUENCE(sEnemyShootout[12].pedIndex, seqMain)
CLEAR_SEQUENCE_TASK(seqMain)
SET_PED_ANGLED_DEFENSIVE_AREA(sEnemyShootout[12].pedIndex, <<991.809692, -2160.414063, 28.580540>>, <<973.678284, -2158.776123, 35.475449>>, 11.0)
SET_PED_COMBAT_ATTRIBUTES(sEnemyShootout[12].pedIndex, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
SET_PED_COMBAT_MOVEMENT(sEnemyShootout[12].pedIndex, CM_WILLADVANCE)
SET_PED_COMBAT_ATTRIBUTES(sEnemyShootout[12].pedIndex, CA_CAN_CHARGE, TRUE)
SET_LABEL_AS_TRIGGERED("OpenCombat6", TRUE)
ENDIF
ENDIF
ENDIF
ELSE
IF DOES_ENTITY_EXIST(sEnemyShootout[12].pedIndex)
IF NOT IS_PED_INJURED(sEnemyShootout[12].pedIndex)
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<973.709839, -2159.690430, 30.475533>>, <<2.0, 2.0, 2.0>>)
IF GET_SCRIPT_TASK_STATUS(sEnemyShootout[12].pedIndex, SCRIPT_TASK_PERFORM_SEQUENCE) = PERFORMING_TASK
CLEAR_PED_TASKS(sEnemyShootout[12].pedIndex)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sEnemyShootout[12].pedIndex, 500.0)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("OpenCombat7")
IF DOES_ENTITY_EXIST(sEnemyShootout[11].pedIndex)
AND DOES_ENTITY_EXIST(sEnemyShootout[14].pedIndex)
IF NOT IS_PED_INJURED(sEnemyShootout[11].pedIndex)
AND NOT IS_PED_INJURED(sEnemyShootout[14].pedIndex)
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<975.501404, -2163.882324, 28.475899>>, <<976.430664, -2153.790771, 32.475471>>, 5.0)
OR IS_PLAYER_TARGETTING_ENTITY(PLAYER_ID(), sEnemySetPiece[SET_PIECE_GRINDER].pedIndex)
OR IS_PLAYER_FREE_AIMING_AT_ENTITY(PLAYER_ID(), sEnemySetPiece[SET_PIECE_GRINDER].pedIndex)
OPEN_SEQUENCE_TASK(seqMain)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(NULL, <<989.3090, -2159.1226, 28.4763>>, PLAYER_PED_ID(), PEDMOVE_SPRINT, TRUE)
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(NULL, <<986.5796, -2161.7283, 28.4763>>, PLAYER_PED_ID(), PEDMOVE_SPRINT, TRUE)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
CLOSE_SEQUENCE_TASK(seqMain)
TASK_PERFORM_SEQUENCE(sEnemyShootout[11].pedIndex, seqMain)
CLEAR_SEQUENCE_TASK(seqMain)
FORCE_PED_MOTION_STATE(sEnemyShootout[11].pedIndex, MS_ON_FOOT_RUN)
SET_PED_ANGLED_DEFENSIVE_AREA(sEnemyShootout[11].pedIndex, <<991.809692, -2160.414063, 28.580540>>, <<973.678284, -2158.776123, 35.475449>>, 11.0)
SET_PED_COMBAT_ATTRIBUTES(sEnemyShootout[11].pedIndex, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
SET_PED_COMBAT_MOVEMENT(sEnemyShootout[11].pedIndex, CM_WILLADVANCE)
SET_PED_COMBAT_ATTRIBUTES(sEnemyShootout[11].pedIndex, CA_CAN_CHARGE, TRUE)
OPEN_SEQUENCE_TASK(seqMain)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(NULL, <<984.2305, -2157.1267, 30.0791>>, PLAYER_PED_ID(), PEDMOVE_SPRINT, TRUE)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
CLOSE_SEQUENCE_TASK(seqMain)
TASK_PERFORM_SEQUENCE(sEnemyShootout[14].pedIndex, seqMain)
CLEAR_SEQUENCE_TASK(seqMain)
FORCE_PED_MOTION_STATE(sEnemyShootout[14].pedIndex, MS_ON_FOOT_RUN)
SET_PED_ANGLED_DEFENSIVE_AREA(sEnemyShootout[14].pedIndex, <<991.809692, -2160.414063, 28.580540>>, <<973.678284, -2158.776123, 35.475449>>, 11.0)
SET_PED_COMBAT_ATTRIBUTES(sEnemyShootout[14].pedIndex, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
SET_PED_COMBAT_MOVEMENT(sEnemyShootout[14].pedIndex, CM_WILLADVANCE)
SET_PED_COMBAT_ATTRIBUTES(sEnemyShootout[14].pedIndex, CA_CAN_CHARGE, TRUE)
SET_LABEL_AS_TRIGGERED("OpenCombat7", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("OpenCombat8")
IF DOES_ENTITY_EXIST(sEnemyShootout[13].pedIndex)
IF NOT IS_PED_INJURED(sEnemyShootout[13].pedIndex)
IF (IS_PED_INJURED(sEnemyShootout[11].pedIndex)
AND IS_PED_INJURED(sEnemyShootout[14].pedIndex))
OR IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<981.156494, -2159.278564, 30.976007>>,<<6.0, 5.5, 3.0>>)
REMOVE_PED_DEFENSIVE_AREA(sEnemyShootout[13].pedIndex)
SET_PED_COMBAT_ATTRIBUTES(sEnemyShootout[13].pedIndex, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
SET_PED_COMBAT_MOVEMENT(sEnemyShootout[13].pedIndex, CM_WILLADVANCE)
SET_PED_COMBAT_ATTRIBUTES(sEnemyShootout[13].pedIndex, CA_CAN_CHARGE, TRUE)
SET_LABEL_AS_TRIGGERED("OpenCombat8", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
//Runs
IF NOT HAS_LABEL_BEEN_TRIGGERED("PedRuns")
IF DOES_ENTITY_EXIST(sEnemyShootout[6].pedIndex)
IF NOT IS_PED_INJURED(sEnemyShootout[6].pedIndex)
VECTOR vGameCamRot = GET_GAMEPLAY_CAM_ROT()
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<995.530334, -2190.534180, 28.978443>>, <<996.244202, -2182.337158, 34.977020>>, 6.5)
OR (IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<985.945251, -2187.553955, 28.977818>>, <<993.839844, -2188.007324, 35.035198>>, 7.0)
AND (WRAP(vGameCamRot.Z, 0.0, 360.0) < 10.0 OR WRAP(vGameCamRot.Z, 0.0, 360.0) > 280.0)
AND IS_ENTITY_ON_SCREEN(sEnemyShootout[6].pedIndex))
OPEN_SEQUENCE_TASK(seqMain)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<981.6053, -2171.1108, 29.2243>>, PEDMOVE_RUN)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
CLOSE_SEQUENCE_TASK(seqMain)
TASK_PERFORM_SEQUENCE(sEnemyShootout[6].pedIndex, seqMain)
CLEAR_SEQUENCE_TASK(seqMain)
FORCE_PED_MOTION_STATE(sEnemyShootout[6].pedIndex, MS_ON_FOOT_RUN)
SET_LABEL_AS_TRIGGERED("PedRuns", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
//Rail
SWITCH iSetPiece[SET_PIECE_RAIL]
CASE 0
IF DOES_ENTITY_EXIST(sEnemySetPiece[SET_PIECE_RAIL].pedIndex)
IF NOT IS_PED_INJURED(sEnemySetPiece[SET_PIECE_RAIL].pedIndex)
IF HAS_ANIM_DICT_LOADED_CHECK(sAnimDictMic2SetPiece1)
TASK_PLAY_ANIM_ADVANCED(sEnemySetPiece[SET_PIECE_RAIL].pedIndex, sAnimDictMic2SetPiece1, "goon_leap_rail", <<979.592, -2168.694, 28.539>>, <<0.0, 0.0, 0.0>>, INSTANT_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_FORCE_START | AF_EXTRACT_INITIAL_OFFSET | AF_OVERRIDE_PHYSICS | AF_IGNORE_GRAVITY, 0.0, EULER_YXZ, AIK_DISABLE_LEG_IK)
FORCE_PED_AI_AND_ANIMATION_UPDATE(sEnemySetPiece[SET_PIECE_RAIL].pedIndex)
iSetPiece[SET_PIECE_RAIL]++
ENDIF
ENDIF
ENDIF
BREAK
CASE 1
IF IS_ENTITY_PLAYING_ANIM(sEnemySetPiece[SET_PIECE_RAIL].pedIndex, sAnimDictMic2SetPiece1, "goon_leap_rail")
SET_ENTITY_ANIM_CURRENT_TIME(sEnemySetPiece[SET_PIECE_RAIL].pedIndex, sAnimDictMic2SetPiece1, "goon_leap_rail", 0.400)
SET_ENTITY_ANIM_SPEED(sEnemySetPiece[SET_PIECE_RAIL].pedIndex, sAnimDictMic2SetPiece1, "goon_leap_rail", 0.0)
iSetPiece[SET_PIECE_RAIL]++
ENDIF
BREAK
CASE 2
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<995.957214, -2169.708740, 31.497860>>, <<5.0, 5.0, 3.0>>)
IF IS_ENTITY_PLAYING_ANIM(sEnemySetPiece[SET_PIECE_RAIL].pedIndex, sAnimDictMic2SetPiece1, "goon_leap_rail")
SET_ENTITY_ANIM_SPEED(sEnemySetPiece[SET_PIECE_RAIL].pedIndex, sAnimDictMic2SetPiece1, "goon_leap_rail", 1.0)
iSetPiece[SET_PIECE_RAIL]++
ENDIF
ENDIF
BREAK
CASE 3
IF NOT IS_PED_INJURED(sEnemySetPiece[SET_PIECE_RAIL].pedIndex)
IF NOT IS_ENTITY_PLAYING_ANIM(sEnemySetPiece[SET_PIECE_RAIL].pedIndex, sAnimDictMic2SetPiece1, "goon_leap_rail")
OR IS_PED_RAGDOLL(sEnemySetPiece[SET_PIECE_RAIL].pedIndex)
IF NOT IS_PED_RAGDOLL(sEnemySetPiece[SET_PIECE_RAIL].pedIndex)
TASK_PUT_PED_DIRECTLY_INTO_COVER(sEnemySetPiece[SET_PIECE_RAIL].pedIndex, <<986.1974, -2166.4761, 28.4756>>, -1, FALSE, 0.0, TRUE, FALSE, covPoint[7])
FORCE_PED_AI_AND_ANIMATION_UPDATE(sEnemySetPiece[SET_PIECE_RAIL].pedIndex, TRUE)
ENDIF
iSetPiece[SET_PIECE_RAIL]++
ENDIF
ENDIF
BREAK
CASE 4
IF NOT IS_PED_INJURED(sEnemySetPiece[SET_PIECE_RAIL].pedIndex)
IF IS_PED_IN_COVER(sEnemySetPiece[SET_PIECE_RAIL].pedIndex, TRUE)
OR IS_PED_RAGDOLL(sEnemySetPiece[SET_PIECE_RAIL].pedIndex)
OR GET_SCRIPT_TASK_STATUS(sEnemySetPiece[SET_PIECE_RAIL].pedIndex, SCRIPT_TASK_ANY) != PERFORMING_TASK
// OR (NOT IS_PED_IN_COVER(sEnemySetPiece[SET_PIECE_RAIL].pedIndex)
// AND NOT IS_PED_GOING_INTO_COVER(sEnemySetPiece[SET_PIECE_RAIL].pedIndex))
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sEnemySetPiece[SET_PIECE_RAIL].pedIndex, FALSE)
SET_PED_ALERTNESS(sEnemySetPiece[SET_PIECE_RAIL].pedIndex, AS_MUST_GO_TO_COMBAT)
TASK_COMBAT_PED(sEnemySetPiece[SET_PIECE_RAIL].pedIndex, PLAYER_PED(CHAR_FRANKLIN)) //TASK_COMBAT_HATED_TARGETS_AROUND_PED(sEnemySetPiece[SET_PIECE_RAIL].pedIndex, 1000.0)
REMOVE_PED_DEFENSIVE_AREA(sEnemySetPiece[SET_PIECE_RAIL].pedIndex)
SET_PED_COMBAT_ATTRIBUTES(sEnemySetPiece[SET_PIECE_RAIL].pedIndex, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
SET_PED_COMBAT_MOVEMENT(sEnemySetPiece[SET_PIECE_RAIL].pedIndex, CM_WILLADVANCE)
SET_PED_COMBAT_ATTRIBUTES(sEnemySetPiece[SET_PIECE_RAIL].pedIndex, CA_CAN_CHARGE, TRUE)
iSetPiece[SET_PIECE_RAIL]++
ENDIF
ENDIF
BREAK
ENDSWITCH
IF iSetPiece[SET_PIECE_RAIL] < 3
IF DOES_ENTITY_EXIST(sEnemySetPiece[SET_PIECE_RAIL].pedIndex)
IF NOT IS_PED_INJURED(sEnemySetPiece[SET_PIECE_RAIL].pedIndex)
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<980.336243, -2159.359131, 32.683861>>, <<964.162415, -2157.859863, 35.670811>>, 10.0)
CLEAR_PED_TASKS(sEnemySetPiece[SET_PIECE_RAIL].pedIndex)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sEnemySetPiece[SET_PIECE_RAIL].pedIndex, FALSE)
SET_PED_SPHERE_DEFENSIVE_AREA(sEnemySetPiece[SET_PIECE_RAIL].pedIndex, <<986.2274, -2166.6877, 28.4755>>, 2.0)
iSetPiece[SET_PIECE_RAIL] = 100
ENDIF
ENDIF
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(sEnemySetPiece[SET_PIECE_STEAM].pedIndex)
IF NOT IS_ENTITY_DEAD(sEnemySetPiece[SET_PIECE_STEAM].pedIndex)
REQUEST_SCRIPT_AUDIO_BANK("Michael_2_Acid_Bath")
ELSE
RELEASE_NAMED_SCRIPT_AUDIO_BANK("Michael_2_Acid_Bath")
ENDIF
ENDIF
//Steam
SWITCH iSetPiece[SET_PIECE_STEAM]
CASE 0
IF DOES_ENTITY_EXIST(sEnemySetPiece[SET_PIECE_STEAM].pedIndex)
PED_BONETAG pbt
GET_PED_LAST_DAMAGE_BONE(sEnemySetPiece[SET_PIECE_STEAM].pedIndex, pbt)
IF GET_ENTITY_HEALTH(sEnemySetPiece[SET_PIECE_STEAM].pedIndex) = GET_PED_MAX_HEALTH(sEnemySetPiece[SET_PIECE_STEAM].pedIndex)
IF NOT IS_ENTITY_AT_COORD(sEnemySetPiece[SET_PIECE_STEAM].pedIndex, <<976.603149, -2166.035400, 32.155220>>, <<1.25, 1.25, 1.75>>)
SET_PED_POSITION(sEnemySetPiece[SET_PIECE_STEAM].pedIndex, <<976.6239, -2166.3784, 30.4104 + 0.25>>, 266.3925)
ENDIF
ENDIF
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<980.336243, -2159.359131, 32.683861>>, <<964.162415, -2157.859863, 35.670811>>, 10.0)
CLEAR_PED_TASKS(sEnemySetPiece[SET_PIECE_STEAM].pedIndex)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sEnemySetPiece[SET_PIECE_STEAM].pedIndex, FALSE)
SET_ENTITY_HEALTH(sEnemySetPiece[SET_PIECE_STEAM].pedIndex, 105)
iSetPiece[SET_PIECE_STEAM] = 100
ENDIF
IF NOT IS_ENTITY_DEAD(sEnemySetPiece[SET_PIECE_STEAM].pedIndex)
IF (GET_ENTITY_HEALTH(sEnemySetPiece[SET_PIECE_STEAM].pedIndex) < 925
OR pbt = BONETAG_HEAD)
IF NOT IS_PED_INJURED(sEnemySetPiece[SET_PIECE_STEAM].pedIndex)
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<990.087097, -2169.110107, 32.472157>>, <<10.0, 8.5, 4.0>>)
AND IS_ENTITY_AT_COORD(sEnemySetPiece[SET_PIECE_STEAM].pedIndex, <<976.603149, -2166.035400, 32.155220>>, <<1.25, 1.25, 1.75>>)
AND NOT IS_EXPLOSION_IN_SPHERE(EXP_TAG_DONTCARE, GET_ENTITY_COORDS(sEnemySetPiece[SET_PIECE_STEAM].pedIndex), 5.0)
INFORM_MISSION_STATS_OF_INCREMENT(MIC2_UNIQUE_TRIAD_DEATHS)
SET_PED_CAN_BE_TARGETTED(sEnemySetPiece[SET_PIECE_STEAM].pedIndex, FALSE)
//TASK_PLAY_ANIM_ADVANCED(sEnemySetPiece[SET_PIECE_STEAM].pedIndex, sAnimDictMic2SetPiece1, "goonfall_into_bin", <<976.661, -2166.402, 31.687>>, <<0.0, 0.0, -124.560>>, INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1, AF_FORCE_START | AF_EXTRACT_INITIAL_OFFSET | AF_NOT_INTERRUPTABLE | AF_OVERRIDE_PHYSICS | AF_IGNORE_GRAVITY | AF_HOLD_LAST_FRAME, 0.02, EULER_YXZ, AIK_DISABLE_LEG_IK)
sceneSteam = CREATE_SYNCHRONIZED_SCENE(<<976.661, -2166.402, 31.687>>, <<0.0, 0.0, -124.560>>)
TASK_SYNCHRONIZED_SCENE(sEnemySetPiece[SET_PIECE_STEAM].pedIndex, sceneSteam, sAnimDictMic2SetPiece1, "goonfall_into_bin", SLOW_BLEND_IN, SLOW_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT, RBF_NONE, SLOW_BLEND_IN, AIK_DISABLE_LEG_IK)
SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(sceneSteam, TRUE)
FORCE_PED_AI_AND_ANIMATION_UPDATE(sEnemySetPiece[SET_PIECE_STEAM].pedIndex)
SET_PED_DROPS_WEAPON(sEnemySetPiece[SET_PIECE_STEAM].pedIndex)
//Audio Scene
IF NOT IS_AUDIO_SCENE_ACTIVE("MI_2_SHOOTOUT_ACID")
START_AUDIO_SCENE("MI_2_SHOOTOUT_ACID")
ENDIF
//Audio
PLAY_AUDIO(MIC2_ACID_BATH_OS)
LOAD_AUDIO(MIC2_MULCHED)
PLAY_SOUND_FROM_ENTITY(-1, "ACID_BATH_FALL", sEnemySetPiece[SET_PIECE_STEAM].pedIndex, "MICHAEL_2_SOUNDS")
IF NOT bVideoRecording
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGH)
bVideoRecording = TRUE
ENDIF
SETTIMERB(0)
iSetPiece[SET_PIECE_STEAM]++
ELSE
SET_ENTITY_HEALTH(sEnemySetPiece[SET_PIECE_STEAM].pedIndex, 5)
APPLY_DAMAGE_TO_PED(sEnemySetPiece[SET_PIECE_STEAM].pedIndex, 500, FALSE)
SAFE_REMOVE_BLIP(sEnemySetPiece[SET_PIECE_STEAM].blipIndex)
iSetPiece[SET_PIECE_STEAM] = 100
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE 1
// HIDE_HUD_AND_RADAR_THIS_FRAME()
IF IS_SYNCHRONIZED_SCENE_RUNNING(sceneSteam) //IF IS_ENTITY_PLAYING_ANIM(sEnemySetPiece[SET_PIECE_STEAM].pedIndex, sAnimDictMic2SetPiece1, "goonfall_into_bin")
SET_SYNCHRONIZED_SCENE_RATE(sceneSteam, 0.75) //SET_ENTITY_ANIM_SPEED(sEnemySetPiece[SET_PIECE_STEAM].pedIndex, sAnimDictMic2SetPiece1, "goonfall_into_bin", 0.75)
ENDIF
IF IS_SYNCHRONIZED_SCENE_RUNNING(sceneSteam) //IF IS_ENTITY_PLAYING_ANIM(sEnemySetPiece[SET_PIECE_STEAM].pedIndex, sAnimDictMic2SetPiece1, "goonfall_into_bin")
AND GET_SYNCHRONIZED_SCENE_PHASE(sceneSteam) >= 0.400 //AND GET_ENTITY_ANIM_CURRENT_TIME(sEnemySetPiece[SET_PIECE_STEAM].pedIndex, sAnimDictMic2SetPiece1, "goonfall_into_bin") > 0.400
//Removed by request - 740685
START_PARTICLE_FX_NON_LOOPED_AT_COORD("scr_acid_bath_splash", <<975.0, -2166.0, 29.5>>, VECTOR_ZERO)
// SHAKE_CAM(camMain, "ROAD_VIBRATION_SHAKE", 1.5)
//
// SET_CONTROL_SHAKE(PLAYER_CONTROL, 1000, 150)
IF NOT IS_MESSAGE_BEING_DISPLAYED()
AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF DOES_ENTITY_EXIST(pedClosestEnemy)
AND NOT IS_PED_INJURED(pedClosestEnemy)
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(pedClosestEnemy)) < 20.0
ADD_PED_FOR_DIALOGUE(sPedsForConversation, 6, pedClosestEnemy, "MCH2CHIN4")
CREATE_CONVERSATION_ADV("MCH2_EWW")
ENDIF
ENDIF
ENDIF
SETTIMERB(0)
iSetPiece[SET_PIECE_STEAM]++
ENDIF
BREAK
CASE 2
// HIDE_HUD_AND_RADAR_THIS_FRAME()
IF IS_SYNCHRONIZED_SCENE_RUNNING(sceneSteam) //IF IS_ENTITY_PLAYING_ANIM(sEnemySetPiece[SET_PIECE_STEAM].pedIndex, sAnimDictMic2SetPiece1, "goonfall_into_bin")
AND GET_SYNCHRONIZED_SCENE_PHASE(sceneSteam) >= 0.7 //AND GET_ENTITY_ANIM_CURRENT_TIME(sEnemySetPiece[SET_PIECE_STEAM].pedIndex, sAnimDictMic2SetPiece1, "goonfall_into_bin") >= 0.7 //0.800
IF NOT IS_PED_INJURED(sEnemySetPiece[SET_PIECE_STEAM].pedIndex)
SET_ENTITY_HEALTH(sEnemySetPiece[SET_PIECE_STEAM].pedIndex, 5)
APPLY_DAMAGE_TO_PED(sEnemySetPiece[SET_PIECE_STEAM].pedIndex, 500, FALSE)
SAFE_REMOVE_BLIP(sEnemySetPiece[SET_PIECE_STEAM].blipIndex)
SET_ENTITY_VISIBLE(sEnemySetPiece[SET_PIECE_STEAM].pedIndex, FALSE)
ENDIF
// IF NOT IS_PED_IN_COVER(PLAYER_PED_ID())
// SET_ENTITY_HEADING(PLAYER_PED_ID(), fHeadingTrack)
// ENDIF
//
// SAFE_SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
//
// SHAKE_CAM(camMain, "ROAD_VIBRATION_SHAKE", 2.0)
//
// STOP_CAM_SHAKING(camMain, TRUE)
// RENDER_SCRIPT_CAMS(FALSE, FALSE)
// SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
//Audio Scene
IF IS_AUDIO_SCENE_ACTIVE("MI_2_SHOOTOUT_ACID")
STOP_AUDIO_SCENE("MI_2_SHOOTOUT_ACID")
ENDIF
SETTIMERB(0)
iSetPiece[SET_PIECE_STEAM]++
ENDIF
BREAK
CASE 3
IF TIMERB() > 1000
// SET_ENTITY_INVINCIBLE(PLAYER_PED_ID(), FALSE)
IF bVideoRecording
REPLAY_STOP_EVENT()
bVideoRecording = FALSE
ENDIF
SETTIMERB(0)
iSetPiece[SET_PIECE_STEAM]++
ENDIF
BREAK
ENDSWITCH
//Stair
SWITCH iSetPiece[SET_PIECE_STAIR]
CASE 0
IF DOES_ENTITY_EXIST(sEnemySetPiece[SET_PIECE_STAIR].pedIndex)
IF NOT IS_PED_INJURED(sEnemySetPiece[SET_PIECE_STAIR].pedIndex)
IF HAS_ANIM_DICT_LOADED_CHECK(sAnimDictMic2SetPiece1)
TASK_PLAY_ANIM_ADVANCED(sEnemySetPiece[SET_PIECE_STAIR].pedIndex, sAnimDictMic2SetPiece1, "goon_rundownstair", <<974.258, -2155.561, 28.499>> + <<0.81, -0.07, 0.0>>, <<0.0, 0.0, 0.0>>, INSTANT_BLEND_IN, REALLY_SLOW_BLEND_OUT, -1, AF_EXTRACT_INITIAL_OFFSET | AF_OVERRIDE_PHYSICS | AF_IGNORE_GRAVITY, 0.0, EULER_YXZ, AIK_DISABLE_LEG_IK) //AF_FORCE_START
FORCE_PED_AI_AND_ANIMATION_UPDATE(sEnemySetPiece[SET_PIECE_STAIR].pedIndex)
REPLAY_RECORD_BACK_FOR_TIME(3.0, 8.0, REPLAY_IMPORTANCE_HIGHEST)
iSetPiece[SET_PIECE_STAIR]++
ENDIF
ENDIF
ENDIF
BREAK
CASE 1
IF NOT IS_PED_INJURED(sEnemySetPiece[SET_PIECE_STAIR].pedIndex)
IF IS_ENTITY_PLAYING_ANIM(sEnemySetPiece[SET_PIECE_STAIR].pedIndex, sAnimDictMic2SetPiece1, "goon_rundownstair")
SET_ENTITY_ANIM_CURRENT_TIME(sEnemySetPiece[SET_PIECE_STAIR].pedIndex, sAnimDictMic2SetPiece1, "goon_rundownstair", 0.2)
SET_ENTITY_ANIM_SPEED(sEnemySetPiece[SET_PIECE_STAIR].pedIndex, sAnimDictMic2SetPiece1, "goon_rundownstair", 0.0)
iSetPiece[SET_PIECE_STAIR]++
ENDIF
ENDIF
BREAK
CASE 2
IF NOT IS_PED_INJURED(sEnemySetPiece[SET_PIECE_STAIR].pedIndex)
VECTOR vGameCamRot
vGameCamRot = GET_GAMEPLAY_CAM_ROT()
IF (IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<972.404663, -2160.942139, 28.475464>>, <<963.123535, -2170.124512, 33.975536>>, 9.0)
AND (WRAP(vGameCamRot.Z, 0.0, 360.0) < 20.0 OR WRAP(vGameCamRot.Z, 0.0, 360.0) > 240.0))
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<973.534729, -2162.575195, 28.475765>>, <<963.480103, -2161.785400, 33.974361>>, 3.5)
OR IS_BULLET_IN_ANGLED_AREA(<<980.336243, -2159.359131, 32.683861>>, <<964.162415, -2157.859863, 35.670811>>, 10.0)
IF IS_ENTITY_PLAYING_ANIM(sEnemySetPiece[SET_PIECE_STAIR].pedIndex, sAnimDictMic2SetPiece1, "goon_rundownstair")
SET_ENTITY_ANIM_SPEED(sEnemySetPiece[SET_PIECE_STAIR].pedIndex, sAnimDictMic2SetPiece1, "goon_rundownstair", 1.0)
iSetPiece[SET_PIECE_STAIR]++
ENDIF
ENDIF
ENDIF
BREAK
CASE 3
IF NOT IS_PED_INJURED(sEnemySetPiece[SET_PIECE_STAIR].pedIndex)
IF ((IS_ENTITY_PLAYING_ANIM(sEnemySetPiece[SET_PIECE_STAIR].pedIndex, sAnimDictMic2SetPiece1, "goon_rundownstair")
AND GET_ENTITY_ANIM_CURRENT_TIME(sEnemySetPiece[SET_PIECE_STAIR].pedIndex, sAnimDictMic2SetPiece1, "goon_rundownstair") > 0.552) //0.573)
AND CAN_PED_SEE_HATED_PED(sEnemySetPiece[SET_PIECE_STAIR].pedIndex, PLAYER_PED(CHAR_FRANKLIN)))
OR NOT IS_ENTITY_PLAYING_ANIM(sEnemySetPiece[SET_PIECE_STAIR].pedIndex, sAnimDictMic2SetPiece1, "goon_rundownstair")
OR GET_ENTITY_HEALTH(sEnemySetPiece[SET_PIECE_STAIR].pedIndex) < 200
SET_PED_RESET_FLAG(sEnemySetPiece[SET_PIECE_STAIR].pedIndex, PRF_InstantBlendToAim, TRUE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sEnemySetPiece[SET_PIECE_STAIR].pedIndex, FALSE)
SET_PED_SPHERE_DEFENSIVE_AREA(sEnemySetPiece[SET_PIECE_STAIR].pedIndex, <<967.4478, -2157.9443, 28.4746>>, 2.0)
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<963.701782, -2158.603516, 28.474281>>, <<983.335876, -2160.993896, 34.476147>>, 10.0)
IF NOT IS_PED_IN_COMBAT(sEnemySetPiece[SET_PIECE_STAIR].pedIndex)
OPEN_SEQUENCE_TASK(seqMain)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(NULL, <<967.4478, -2157.9443, 28.4746>>, PLAYER_PED_ID(), PEDMOVE_RUN, TRUE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
CLOSE_SEQUENCE_TASK(seqMain)
TASK_PERFORM_SEQUENCE(sEnemySetPiece[SET_PIECE_STAIR].pedIndex, seqMain)
CLEAR_SEQUENCE_TASK(seqMain)
ENDIF
ENDIF
SET_PED_COMBAT_ATTRIBUTES(sEnemySetPiece[SET_PIECE_STAIR].pedIndex, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
SET_PED_COMBAT_MOVEMENT(sEnemySetPiece[SET_PIECE_STAIR].pedIndex, CM_WILLADVANCE)
SET_PED_COMBAT_ATTRIBUTES(sEnemySetPiece[SET_PIECE_STAIR].pedIndex, CA_CAN_CHARGE, TRUE)
iSetPiece[SET_PIECE_STAIR]++
ENDIF
ENDIF
BREAK
CASE 4
IF NOT IS_PED_INJURED(sEnemySetPiece[SET_PIECE_STAIR].pedIndex)
IF NOT IS_PED_IN_COMBAT(sEnemySetPiece[SET_PIECE_STAIR].pedIndex)
IF (IS_ENTITY_PLAYING_ANIM(sEnemySetPiece[SET_PIECE_STAIR].pedIndex, sAnimDictMic2SetPiece1, "goon_rundownstair")
AND GET_ENTITY_ANIM_CURRENT_TIME(sEnemySetPiece[SET_PIECE_STAIR].pedIndex, sAnimDictMic2SetPiece1, "goon_rundownstair") > 0.5)
OPEN_SEQUENCE_TASK(seqMain)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(NULL, <<967.4478, -2157.9443, 28.4746>>, PLAYER_PED_ID(), PEDMOVE_RUN, TRUE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
CLOSE_SEQUENCE_TASK(seqMain)
TASK_PERFORM_SEQUENCE(sEnemySetPiece[SET_PIECE_STAIR].pedIndex, seqMain)
CLEAR_SEQUENCE_TASK(seqMain)
ENDIF
ENDIF
SET_PED_RESET_FLAG(sEnemySetPiece[SET_PIECE_STAIR].pedIndex, PRF_InstantBlendToAim, TRUE)
ENDIF
BREAK
ENDSWITCH
IF iSetPiece[SET_PIECE_STAIR] < 3
IF DOES_ENTITY_EXIST(sEnemySetPiece[SET_PIECE_STAIR].pedIndex)
IF NOT IS_PED_INJURED(sEnemySetPiece[SET_PIECE_STAIR].pedIndex)
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<980.336243, -2159.359131, 32.683861>>, <<964.162415, -2157.859863, 35.670811>>, 10.0)
CLEAR_PED_TASKS(sEnemySetPiece[SET_PIECE_STAIR].pedIndex)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sEnemySetPiece[SET_PIECE_STAIR].pedIndex, FALSE)
SET_PED_SPHERE_DEFENSIVE_AREA(sEnemySetPiece[SET_PIECE_STAIR].pedIndex, <<967.4478, -2157.9443, 28.4746>>, 2.0)
iSetPiece[SET_PIECE_STAIR] = 100
ENDIF
ENDIF
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(sEnemySetPiece[SET_PIECE_GRINDER].pedIndex)
IF NOT IS_ENTITY_DEAD(sEnemySetPiece[SET_PIECE_GRINDER].pedIndex)
REQUEST_SCRIPT_AUDIO_BANK("Michael_2_Kidnap_Mincer")
ELSE
RELEASE_NAMED_SCRIPT_AUDIO_BANK("Michael_2_Kidnap_Mincer")
ENDIF
ENDIF
//Grinder
SWITCH iSetPiece[SET_PIECE_GRINDER]
CASE 0
IF DOES_ENTITY_EXIST(sEnemySetPiece[SET_PIECE_GRINDER].pedIndex)
PED_BONETAG pbt
GET_PED_LAST_DAMAGE_BONE(sEnemySetPiece[SET_PIECE_GRINDER].pedIndex, pbt)
IF GET_ENTITY_HEALTH(sEnemySetPiece[SET_PIECE_GRINDER].pedIndex) = GET_PED_MAX_HEALTH(sEnemySetPiece[SET_PIECE_GRINDER].pedIndex)
IF NOT IS_ENTITY_AT_COORD(sEnemySetPiece[SET_PIECE_GRINDER].pedIndex, <<990.705078, -2161.330322, 32.166130>>, <<2.0, 2.0, 2.0>>)
SET_PED_POSITION(sEnemySetPiece[SET_PIECE_GRINDER].pedIndex, <<990.69, -2161.42, 30.4404>>, 82.2840)
ENDIF
ENDIF
IF NOT IS_ENTITY_DEAD(sEnemySetPiece[SET_PIECE_GRINDER].pedIndex)
IF (GET_ENTITY_HEALTH(sEnemySetPiece[SET_PIECE_GRINDER].pedIndex) < 925
OR pbt = BONETAG_HEAD)
IF NOT IS_PED_INJURED(sEnemySetPiece[SET_PIECE_GRINDER].pedIndex)
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<975.189087, -2158.689941, 30.939890>>, <<12.0, 7.0, 2.25>>)
AND IS_ENTITY_AT_COORD(sEnemySetPiece[SET_PIECE_GRINDER].pedIndex, <<990.705078, -2161.330322, 32.166130>>, <<2.0, 2.0, 2.0>>)
AND NOT IS_EXPLOSION_IN_SPHERE(EXP_TAG_DONTCARE, GET_ENTITY_COORDS(sEnemySetPiece[SET_PIECE_GRINDER].pedIndex), 5.0)
INFORM_MISSION_STATS_OF_INCREMENT(MIC2_UNIQUE_TRIAD_DEATHS)
SET_PED_CAN_BE_TARGETTED(sEnemySetPiece[SET_PIECE_GRINDER].pedIndex, FALSE)
//TASK_PLAY_ANIM_ADVANCED(sEnemySetPiece[SET_PIECE_GRINDER].pedIndex, sAnimDictMic2SetPiece1, "goonfall_into_grinder", <<990.626, -2161.452, 31.691>>, <<0.0, 0.0, 90.0>>, INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1, AF_FORCE_START | AF_EXTRACT_INITIAL_OFFSET | AF_NOT_INTERRUPTABLE | AF_OVERRIDE_PHYSICS | AF_IGNORE_GRAVITY | AF_HOLD_LAST_FRAME, 0.0, EULER_YXZ, AIK_DISABLE_LEG_IK) //, 0.04
sceneGrinder = CREATE_SYNCHRONIZED_SCENE(<<990.626, -2161.452, 31.691>>, <<0.0, 0.0, 90.0>>)
TASK_SYNCHRONIZED_SCENE(sEnemySetPiece[SET_PIECE_GRINDER].pedIndex, sceneGrinder, sAnimDictMic2SetPiece1, "goonfall_into_grinder", SLOW_BLEND_IN, SLOW_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT, RBF_NONE, SLOW_BLEND_IN, AIK_DISABLE_LEG_IK)
SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(sceneGrinder, TRUE)
FORCE_PED_AI_AND_ANIMATION_UPDATE(sEnemySetPiece[SET_PIECE_GRINDER].pedIndex)
REPLAY_RECORD_BACK_FOR_TIME(3.0, 8.0, REPLAY_IMPORTANCE_HIGHEST)
//Audio Scene
IF NOT IS_AUDIO_SCENE_ACTIVE("MI_2_GRINDER_1")
START_AUDIO_SCENE("MI_2_GRINDER_1")
ENDIF
//Audio
PLAY_AUDIO(MIC2_MULCHED)
LOAD_AUDIO(MIC2_SPINNING_BLADES)
IF NOT bVideoRecording
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGH)
bVideoRecording = TRUE
ENDIF
SETTIMERB(0)
iSetPiece[SET_PIECE_GRINDER]++
ELSE
APPLY_DAMAGE_TO_PED(sEnemySetPiece[SET_PIECE_GRINDER].pedIndex, 500, FALSE) //SET_ENTITY_HEALTH(sEnemySetPiece[SET_PIECE_GRINDER].pedIndex, 5)
SAFE_REMOVE_BLIP(sEnemySetPiece[SET_PIECE_GRINDER].blipIndex)
iSetPiece[SET_PIECE_GRINDER] = 100
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE 1
// HIDE_HUD_AND_RADAR_THIS_FRAME()
IF IS_SYNCHRONIZED_SCENE_RUNNING(sceneGrinder) //IF IS_ENTITY_PLAYING_ANIM(sEnemySetPiece[SET_PIECE_GRINDER].pedIndex, sAnimDictMic2SetPiece1, "goonfall_into_grinder")
AND GET_SYNCHRONIZED_SCENE_PHASE(sceneGrinder) >= 0.409 //AND GET_ENTITY_ANIM_CURRENT_TIME(sEnemySetPiece[SET_PIECE_GRINDER].pedIndex, sAnimDictMic2SetPiece1, "goonfall_into_grinder") > 0.409 //0.265
START_PARTICLE_FX_NON_LOOPED_AT_COORD("scr_abattoir_ped_minced", <<992.7037, -2161.6229, 31.8097 - 1.0>>, VECTOR_ZERO)
PLAY_SOUND_FROM_ENTITY(-1, "MINCER_FALL", sEnemySetPiece[SET_PIECE_GRINDER].pedIndex, "MICHAEL_2_SOUNDS") //<<992.7037, -2161.9229, 31.8097 - 0.5>>
IF NOT IS_MESSAGE_BEING_DISPLAYED()
AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF DOES_ENTITY_EXIST(pedClosestEnemy)
AND NOT IS_PED_INJURED(pedClosestEnemy)
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(pedClosestEnemy)) < 20.0
ADD_PED_FOR_DIALOGUE(sPedsForConversation, 5, pedClosestEnemy, "MCH2CHIN3")
CREATE_CONVERSATION_ADV("MCH2_EWW2")
ENDIF
ENDIF
ENDIF
// SET_CAM_PARAMS(camMain,
// <<991.046021,-2158.079102,30.699644>>,
// <<7.825684,-0.000000,-155.579086>>,
// 23.640654,
// 0)
//
// SET_CAM_PARAMS(camMain,
// <<991.211609,-2158.388672,30.747850>>,
// <<5.259593,-0.000000,-153.277069>>,
// 23.640654,
// 2000,
// GRAPH_TYPE_LINEAR,
// GRAPH_TYPE_LINEAR)
//
// SHAKE_CAM(camMain, "ROAD_VIBRATION_SHAKE", 2.0)
SETTIMERB(0)
iSetPiece[SET_PIECE_GRINDER]++
ENDIF
BREAK
CASE 2
// HIDE_HUD_AND_RADAR_THIS_FRAME()
//
// SET_CONTROL_SHAKE(PLAYER_CONTROL, 100, 100)
IF IS_SYNCHRONIZED_SCENE_RUNNING(sceneGrinder) //IF IS_ENTITY_PLAYING_ANIM(sEnemySetPiece[SET_PIECE_GRINDER].pedIndex, sAnimDictMic2SetPiece1, "goonfall_into_grinder")
AND GET_SYNCHRONIZED_SCENE_PHASE(sceneGrinder) >= 0.9 //AND GET_ENTITY_ANIM_CURRENT_TIME(sEnemySetPiece[SET_PIECE_GRINDER].pedIndex, sAnimDictMic2SetPiece1, "goonfall_into_grinder") >= 0.9 //1.000
IF NOT IS_PED_INJURED(sEnemySetPiece[SET_PIECE_GRINDER].pedIndex)
SET_ENTITY_HEALTH(sEnemySetPiece[SET_PIECE_GRINDER].pedIndex, 5)
APPLY_DAMAGE_TO_PED(sEnemySetPiece[SET_PIECE_GRINDER].pedIndex, 500, FALSE)
SAFE_REMOVE_BLIP(sEnemySetPiece[SET_PIECE_GRINDER].blipIndex)
ENDIF
SAFE_DELETE_PED(sEnemySetPiece[SET_PIECE_GRINDER].pedIndex)
// IF NOT IS_PED_IN_COVER(PLAYER_PED_ID())
// SET_ENTITY_HEADING(PLAYER_PED_ID(), fHeadingTrack)
// ENDIF
// SAFE_SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
//
// STOP_CAM_SHAKING(camMain, TRUE)
// RENDER_SCRIPT_CAMS(FALSE, FALSE)
// SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
//Audio Scene
IF IS_AUDIO_SCENE_ACTIVE("MI_2_GRINDER_1")
STOP_AUDIO_SCENE("MI_2_GRINDER_1")
ENDIF
SETTIMERB(0)
iSetPiece[SET_PIECE_GRINDER]++
ENDIF
BREAK
CASE 3
IF TIMERB() > 1000
// SET_ENTITY_INVINCIBLE(PLAYER_PED_ID(), FALSE)
IF bVideoRecording
REPLAY_STOP_EVENT()
bVideoRecording = FALSE
ENDIF
SETTIMERB(0)
iSetPiece[SET_PIECE_GRINDER]++
ENDIF
BREAK
ENDSWITCH
IF DOES_ENTITY_EXIST(objCutter)
REQUEST_SCRIPT_AUDIO_BANK("Michael_2_Meat_Chopper")
ELSE
RELEASE_NAMED_SCRIPT_AUDIO_BANK("Michael_2_Meat_Chopper")
ENDIF
//Cutter
SWITCH iSetPiece[SET_PIECE_CUTTER]
CASE 0
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<996.487732, -2158.077881, 32.500244>>, <<25.0, 25.0, 4.0>>)
LOAD_STREAM("MICHAEL_2_GOON_CHOPPED_APART_MASTER")
ENDIF
IF DOES_ENTITY_EXIST(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex)
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<996.487732, -2158.077881, 32.500244>>, <<15.0, 15.0, 4.0>>)
TASK_AIM_GUN_AT_ENTITY(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex, PLAYER_PED(CHAR_MICHAEL), -1)
SETTIMERB(0)
iSetPiece[SET_PIECE_CUTTER]++
ENDIF
IF IS_BULLET_IN_AREA(GET_ENTITY_COORDS(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex), 5.0)
OR IS_ENTITY_AT_COORD(PLAYER_PED_ID(), GET_ENTITY_COORDS(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex), <<5.0, 5.0, 4.0>>)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex, 100.0)
REMOVE_PED_DEFENSIVE_AREA(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex)
SET_PED_COMBAT_ATTRIBUTES(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
SET_PED_COMBAT_MOVEMENT(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex, CM_WILLADVANCE)
SET_PED_COMBAT_ATTRIBUTES(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex, CA_CAN_CHARGE, TRUE)
SET_ENTITY_HEALTH(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex, 150)
SAFE_REMOVE_BLIP(sEnemySetPiece[SET_PIECE_CUTTER].blipIndex)
CLEANUP_AI_PED_BLIP(blipStructSetPiece[SET_PIECE_CUTTER])
iSetPiece[SET_PIECE_CUTTER] = 100
ENDIF
ENDIF
BREAK
CASE 1
LOAD_STREAM("MICHAEL_2_GOON_CHOPPED_APART_MASTER")
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<996.487732, -2158.077881, 32.500244>>, <<6.0, 7.5, 4.0>>)
AND NOT IS_PED_INJURED(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex)
TASK_AIM_GUN_AT_ENTITY(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex, PLAYER_PED(CHAR_MICHAEL), -1)
ADD_PED_FOR_DIALOGUE(sPedsForConversation, 3, sEnemySetPiece[SET_PIECE_CUTTER].pedIndex, "MCH2GOON")
CREATE_CONVERSATION_ADV("MCH2_GSHT")
//Audio Scene
IF NOT IS_AUDIO_SCENE_ACTIVE("MI_2_SHOOT_THE_GUARD")
START_AUDIO_SCENE("MI_2_SHOOT_THE_GUARD")
ENDIF
iBulletTimer = -1
SETTIMERB(0)
iSetPiece[SET_PIECE_CUTTER]++
ENDIF
IF IS_BULLET_IN_AREA(GET_ENTITY_COORDS(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex), 5.0)
OR IS_ENTITY_AT_COORD(PLAYER_PED_ID(), GET_ENTITY_COORDS(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex), <<5.0, 5.0, 4.0>>)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex, 100.0)
REMOVE_PED_DEFENSIVE_AREA(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex)
SET_PED_COMBAT_ATTRIBUTES(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
SET_PED_COMBAT_MOVEMENT(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex, CM_WILLADVANCE)
SET_PED_COMBAT_ATTRIBUTES(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex, CA_CAN_CHARGE, TRUE)
SET_ENTITY_HEALTH(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex, 150)
SAFE_REMOVE_BLIP(sEnemySetPiece[SET_PIECE_CUTTER].blipIndex)
CLEANUP_AI_PED_BLIP(blipStructSetPiece[SET_PIECE_CUTTER])
iSetPiece[SET_PIECE_CUTTER] = 100
ENDIF
BREAK
CASE 2
LOAD_STREAM("MICHAEL_2_GOON_CHOPPED_APART_MASTER")
PED_BONETAG pbt
GET_PED_LAST_DAMAGE_BONE(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex, pbt)
IF NOT IS_ENTITY_DEAD(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex)
IF (GET_ENTITY_HEALTH(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex) < 975
OR pbt = BONETAG_HEAD)
IF NOT IS_PED_INJURED(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex)
IF IS_ENTITY_AT_COORD(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex, <<998.189453, -2143.476318, 30.476349>>, <<1.5, 1.5, 2.25>>)
AND IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<993.761047, -2156.059082, 30.976448>>, <<8.0, 10.0, 2.75>>)
AND NOT IS_EXPLOSION_IN_SPHERE(EXP_TAG_DONTCARE, GET_ENTITY_COORDS(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex), 5.0)
INFORM_MISSION_STATS_OF_INCREMENT(MIC2_UNIQUE_TRIAD_DEATHS)
IF IS_THIS_CONVERSATION_ONGOING_OR_QUEUED("MCH2_GSHT")
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDIF
IF LOAD_STREAM("MICHAEL_2_GOON_CHOPPED_APART_MASTER")
PLAY_STREAM_FROM_PED(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex) //PLAY_STREAM_FRONTEND()
ENDIF
SAFE_SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
SET_ENTITY_INVINCIBLE(PLAYER_PED_ID(), TRUE)
fHeadingTrack = GET_ENTITY_HEADING(PLAYER_PED_ID())
REPLAY_RECORD_BACK_FOR_TIME(3.0, 10.0, REPLAY_IMPORTANCE_HIGHEST)
SET_CAM_PARAMS(camMain,
<<996.938293,-2145.933838,31.029486>>,
<<-28.754696,-0.006011,-40.283401>>,
21.381561,
0)
SET_CAM_PARAMS(camMain,
<<996.989197,-2145.752930,30.981258>>,
<<-22.393389,0.499936,-24.676105>>,
21.381561,
1300,
GRAPH_TYPE_LINEAR,
GRAPH_TYPE_LINEAR)
SHAKE_CAM(camMain, "HAND_SHAKE", 1.0)
SET_CAM_ACTIVE(camMain, TRUE)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
HANG_UP_AND_PUT_AWAY_PHONE(TRUE)
HIDE_HUD_AND_RADAR_THIS_FRAME()
SET_PED_CAN_BE_TARGETTED(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex, FALSE)
TASK_PLAY_ANIM_ADVANCED(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex, sAnimDictMic2SetPiece1, "goon_meatslicer", <<997.507, -2143.002, 28.507>>, <<0.0, 0.0, 0.0>>, INSTANT_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_FORCE_START | AF_NOT_INTERRUPTABLE | AF_EXTRACT_INITIAL_OFFSET | AF_OVERRIDE_PHYSICS | AF_IGNORE_GRAVITY | AF_ENDS_IN_DEAD_POSE, 0.0, EULER_YXZ, AIK_DISABLE_LEG_IK)
PLAY_FACIAL_ANIM(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex, "Goon_MeatSlicer_Facial", sAnimDictMic2SetPiece1)
FORCE_PED_AI_AND_ANIMATION_UPDATE(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex)
IF DOES_ENTITY_EXIST(objCutter)
IF HAS_ANIM_DICT_LOADED_CHECK(sAnimDictMachine)
IF IS_ENTITY_PLAYING_ANIM(objCutter, sAnimDictMachine, "beefsplitter_loop")
SET_ENTITY_ANIM_CURRENT_TIME(objCutter, sAnimDictMachine, "beefsplitter_loop", 0.600)
ENDIF
ENDIF
ENDIF
//Audio Scene
IF IS_AUDIO_SCENE_ACTIVE("MI_2_SHOOT_THE_GUARD")
STOP_AUDIO_SCENE("MI_2_SHOOT_THE_GUARD")
ENDIF
IF NOT IS_AUDIO_SCENE_ACTIVE("MI_2_MEAT_SLICER")
START_AUDIO_SCENE("MI_2_MEAT_SLICER")
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("AudioSpinningBlades")
//Audio
PLAY_AUDIO(MIC2_SPINNING_BLADES)
SET_LABEL_AS_TRIGGERED("AudioSpinningBlades", TRUE)
ENDIF
IF NOT bVideoRecording
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGH)
bVideoRecording = TRUE
ENDIF
SETTIMERB(0)
iSetPiece[SET_PIECE_CUTTER]++
ELSE #IF IS_DEBUG_BUILD PRINTLN("PEDS NOT IN THEIR POSITIONS") #ENDIF
SET_ENTITY_HEALTH(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex, 5)
APPLY_DAMAGE_TO_PED(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex, 500, FALSE)
SAFE_REMOVE_BLIP(sEnemySetPiece[SET_PIECE_CUTTER].blipIndex)
CLEANUP_AI_PED_BLIP(blipStructSetPiece[SET_PIECE_CUTTER])
iSetPiece[SET_PIECE_CUTTER] = 100
ENDIF
ENDIF
ENDIF
ENDIF
IF iSetPiece[SET_PIECE_CUTTER] = 2
IF TIMERB() > 7000
OR IS_BULLET_IN_AREA(GET_ENTITY_COORDS(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex), 5.0)
OR IS_EXPLOSION_IN_SPHERE(EXP_TAG_DONTCARE, GET_ENTITY_COORDS(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex), 5.0)
OR IS_ENTITY_AT_COORD(PLAYER_PED_ID(), GET_ENTITY_COORDS(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex), <<5.0, 5.0, 4.0>>)
#IF IS_DEBUG_BUILD PRINTLN("TOO LONG, SHOT WRONG OR OUT OF PLACE") #ENDIF
IF iBulletTimer = -1
iBulletTimer = GET_GAME_TIMER() + 100
ELIF GET_GAME_TIMER() > iBulletTimer
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex, 100.0)
REMOVE_PED_DEFENSIVE_AREA(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex)
SET_PED_COMBAT_ATTRIBUTES(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
SET_PED_COMBAT_MOVEMENT(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex, CM_WILLADVANCE)
SET_PED_COMBAT_ATTRIBUTES(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex, CA_CAN_CHARGE, TRUE)
SET_ENTITY_HEALTH(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex, 150)
SAFE_REMOVE_BLIP(sEnemySetPiece[SET_PIECE_CUTTER].blipIndex)
CLEANUP_AI_PED_BLIP(blipStructSetPiece[SET_PIECE_CUTTER])
iSetPiece[SET_PIECE_CUTTER] = 100
ENDIF
ENDIF
ENDIF
BREAK
CASE 3
HIDE_HUD_AND_RADAR_THIS_FRAME()
IF NOT IS_ENTITY_DEAD(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex)
IF IS_ENTITY_PLAYING_ANIM(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex, sAnimDictMic2SetPiece1, "goon_meatslicer")
AND GET_ENTITY_ANIM_CURRENT_TIME(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex, sAnimDictMic2SetPiece1, "goon_meatslicer") > 0.128 //0.200
SET_CAM_PARAMS(camMain,
<<998.183350,-2143.903076,29.707603>>,
<<-0.967933,0.515198,-5.987529>>,
39.959354,
0)
SET_CAM_PARAMS(camMain,
<<998.147949,-2143.089355,29.527300>>,
<<48.835812,0.311738,-7.783955>>,
40.035347,
3500,
GRAPH_TYPE_DECEL,
GRAPH_TYPE_DECEL)
SHAKE_CAM(camMain, "HAND_SHAKE", 1.0)
PLAY_PAIN(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex, AUD_DAMAGE_REASON_SCREAM_PANIC)
SETTIMERB(0)
iSetPiece[SET_PIECE_CUTTER]++
ENDIF
ENDIF
BREAK
CASE 4
HIDE_HUD_AND_RADAR_THIS_FRAME()
IF NOT IS_ENTITY_DEAD(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex)
IF IS_ENTITY_PLAYING_ANIM(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex, sAnimDictMic2SetPiece1, "goon_meatslicer")
AND GET_ENTITY_ANIM_CURRENT_TIME(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex, sAnimDictMic2SetPiece1, "goon_meatslicer") > 0.350
// SET_CAM_PARAMS(camMain,
// <<998.295959,-2141.102539,32.364044>>,
// <<-83.002708,-2.292470,139.844986>>,
// 32.875706,
// 0)
//
// SET_CAM_PARAMS(camMain,
// <<998.144470,-2140.178467,31.618706>>,
// <<-85.997765,-2.292466,150.822296>>,
// 32.875706,
// 4000,
// GRAPH_TYPE_DECEL,
// GRAPH_TYPE_DECEL)
//
// SHAKE_CAM(camMain, "HAND_SHAKE", 1.6)
IF NOT IS_PED_IN_COVER(PLAYER_PED_ID())
SET_ENTITY_HEADING(PLAYER_PED_ID(), fHeadingTrack)
ENDIF
SAFE_SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
STOP_CAM_SHAKING(camMain, TRUE)
RENDER_SCRIPT_CAMS(FALSE, FALSE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
PLAY_PAIN(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex, AUD_DAMAGE_REASON_SCREAM_TERROR)
SETTIMERB(0)
iSetPiece[SET_PIECE_CUTTER]++
ENDIF
ENDIF
BREAK
CASE 5
HIDE_HUD_AND_RADAR_THIS_FRAME()
IF NOT IS_ENTITY_DEAD(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex)
IF IS_ENTITY_PLAYING_ANIM(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex, sAnimDictMic2SetPiece1, "goon_meatslicer")
AND GET_ENTITY_ANIM_CURRENT_TIME(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex, sAnimDictMic2SetPiece1, "goon_meatslicer") > 0.400
// SHAKE_CAM(camMain, "ROAD_VIBRATION_SHAKE", 4.0)
//
// PLAY_PAIN(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex, AUD_DAMAGE_REASON_ON_FIRE)
//
// START_PARTICLE_FX_NON_LOOPED_ON_ENTITY("scr_abattoir_ped_sliced", sEnemySetPiece[SET_PIECE_CUTTER].pedIndex, <<0.0, -0.1, -0.25>>, <<0.0, 0.0, 84.0 + 90.0>>, 0.6)
//
// SET_CONTROL_SHAKE(PLAYER_CONTROL, 1000, 200)
//
// IF NOT IS_MESSAGE_BEING_DISPLAYED()
// AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
// IF DOES_ENTITY_EXIST(pedClosestEnemy)
// AND NOT IS_PED_INJURED(pedClosestEnemy)
// IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(pedClosestEnemy)) < 20.0
// ADD_PED_FOR_DIALOGUE(sPedsForConversation, 3, pedClosestEnemy, "MCH2CHIN1")
//
// CREATE_CONVERSATION_ADV("MCH2_EWW3")
// ENDIF
// ENDIF
// ENDIF
SETTIMERB(0)
iSetPiece[SET_PIECE_CUTTER]++
ENDIF
ENDIF
BREAK
CASE 6
HIDE_HUD_AND_RADAR_THIS_FRAME()
IF NOT IS_ENTITY_DEAD(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex)
IF NOT IS_ENTITY_PLAYING_ANIM(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex, sAnimDictMic2SetPiece1, "goon_meatslicer")
OR (IS_ENTITY_PLAYING_ANIM(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex, sAnimDictMic2SetPiece1, "goon_meatslicer")
AND GET_ENTITY_ANIM_CURRENT_TIME(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex, sAnimDictMic2SetPiece1, "goon_meatslicer") >= 0.460) //0.550)
PLAY_PAIN(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex, AUD_DAMAGE_REASON_ON_FIRE)
START_PARTICLE_FX_NON_LOOPED_ON_ENTITY("scr_abattoir_ped_sliced", sEnemySetPiece[SET_PIECE_CUTTER].pedIndex, <<0.0, -0.1, -0.25>>, <<0.0, 0.0, 84.0 + 90.0>>, 0.6)
APPLY_PED_BLOOD_SPECIFIC(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex, ENUM_TO_INT(PDZ_TORSO), 0.725, 0.434, 302.360, 1.0, 0, 0.0, "ShotgunLargeMonolithic")
APPLY_PED_BLOOD_SPECIFIC(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex, ENUM_TO_INT(PDZ_TORSO), 0.624, 0.434, 310.913, 1.0, 0, 0.0, "ShotgunLargeMonolithic")
APPLY_PED_BLOOD_SPECIFIC(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex, ENUM_TO_INT(PDZ_TORSO), 0.519, 0.434, 317.949, 1.0, 0, 0.0, "ShotgunLargeMonolithic")
APPLY_PED_BLOOD_SPECIFIC(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex, ENUM_TO_INT(PDZ_TORSO), 0.810, 0.434, 293.645, 1.0, 0, 0.0, "ShotgunLargeMonolithic")
APPLY_PED_BLOOD_SPECIFIC(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex, ENUM_TO_INT(PDZ_TORSO), 0.921, 0.434, 280.271, 1.0, 0, 0.0, "ShotgunLargeMonolithic")
APPLY_PED_BLOOD_SPECIFIC(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex, ENUM_TO_INT(PDZ_RIGHT_ARM), 0.000, 0.413, 337.557, 1.0, 0, 0.0, "ShotgunLargeMonolithic")
APPLY_PED_BLOOD_SPECIFIC(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex, ENUM_TO_INT(PDZ_RIGHT_ARM), 0.259, 0.413, 330.867, 1.0, 0, 0.0, "ShotgunLargeMonolithic")
APPLY_PED_BLOOD_SPECIFIC(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex, ENUM_TO_INT(PDZ_LEFT_LEG), 0.836, 0.698, 283.194, 1.0, 0, 0.0, "ShotgunLargeMonolithic")
APPLY_PED_BLOOD_SPECIFIC(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex, ENUM_TO_INT(PDZ_LEFT_LEG), 0.704, 0.698, 292.980, 1.0, 1, 0.0, "ShotgunLargeMonolithic")
APPLY_PED_BLOOD_SPECIFIC(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex, ENUM_TO_INT(PDZ_LEFT_LEG), 0.587, 0.667, 301.741, 1.0, 0, 0.0, "ShotgunLargeMonolithic")
APPLY_PED_BLOOD_SPECIFIC(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex, ENUM_TO_INT(PDZ_RIGHT_LEG), 0.164, 0.693, 320.334, 1.0, 0, 0.0, "ShotgunLargeMonolithic")
APPLY_PED_BLOOD_SPECIFIC(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex, ENUM_TO_INT(PDZ_RIGHT_LEG), 0.376, 0.688, 312.187, 1.0, 1, 0.0, "ShotgunLargeMonolithic")
APPLY_PED_BLOOD_SPECIFIC(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex, ENUM_TO_INT(PDZ_TORSO), 0.730, 0.614, 301.073, 1.0, 1, 0.0, "Scripted_Ped_Splash_Back")
APPLY_PED_BLOOD_SPECIFIC(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex, ENUM_TO_INT(PDZ_TORSO), 0.730, 0.444, 315.623, 1.0, 2, 0.0, "Scripted_Ped_Splash_Back")
APPLY_PED_BLOOD_SPECIFIC(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex, ENUM_TO_INT(PDZ_TORSO), 0.730, 0.339, 330.850, 1.0, 0, 0.0, "Scripted_Ped_Splash_Back")
//Audio Scene
IF IS_AUDIO_SCENE_ACTIVE("MI_2_MEAT_SLICER")
STOP_AUDIO_SCENE("MI_2_MEAT_SLICER")
ENDIF
IF NOT IS_AUDIO_SCENE_ACTIVE("MI_2_THROW_THE_GUN")
START_AUDIO_SCENE("MI_2_THROW_THE_GUN")
ENDIF
SETTIMERB(0)
iSetPiece[SET_PIECE_CUTTER]++
ENDIF
ELSE
SAFE_SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
STOP_CAM_SHAKING(camMain, TRUE)
RENDER_SCRIPT_CAMS(FALSE, FALSE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
//Audio Scene
IF IS_AUDIO_SCENE_ACTIVE("MI_2_MEAT_SLICER")
STOP_AUDIO_SCENE("MI_2_MEAT_SLICER")
ENDIF
IF NOT IS_AUDIO_SCENE_ACTIVE("MI_2_THROW_THE_GUN")
START_AUDIO_SCENE("MI_2_THROW_THE_GUN")
ENDIF
SETTIMERB(0)
iSetPiece[SET_PIECE_CUTTER]++
ENDIF
BREAK
CASE 7
//HIDE_HUD_AND_RADAR_THIS_FRAME()
IF NOT IS_ENTITY_DEAD(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex)
IF NOT IS_ENTITY_PLAYING_ANIM(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex, sAnimDictMic2SetPiece1, "goon_meatslicer")
OR (IS_ENTITY_PLAYING_ANIM(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex, sAnimDictMic2SetPiece1, "goon_meatslicer")
AND GET_ENTITY_ANIM_CURRENT_TIME(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex, sAnimDictMic2SetPiece1, "goon_meatslicer") >= 1.000)
SET_ENTITY_HEALTH(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex, 5)
APPLY_DAMAGE_TO_PED(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex, 500, FALSE)
SAFE_REMOVE_BLIP(sEnemySetPiece[SET_PIECE_CUTTER].blipIndex)
CLEANUP_AI_PED_BLIP(blipStructSetPiece[SET_PIECE_CUTTER])
SETTIMERB(0)
iSetPiece[SET_PIECE_CUTTER]++
ENDIF
ELSE
SAFE_REMOVE_BLIP(sEnemySetPiece[SET_PIECE_CUTTER].blipIndex)
CLEANUP_AI_PED_BLIP(blipStructSetPiece[SET_PIECE_CUTTER])
SETTIMERB(0)
iSetPiece[SET_PIECE_CUTTER]++
ENDIF
BREAK
CASE 8
IF TIMERB() > 1000
SET_ENTITY_INVINCIBLE(PLAYER_PED_ID(), FALSE)
IF bVideoRecording
REPLAY_STOP_EVENT()
bVideoRecording = FALSE
ENDIF
SETTIMERB(0)
iSetPiece[SET_PIECE_CUTTER]++
ENDIF
BREAK
ENDSWITCH
IF NOT IS_GAMEPLAY_CAM_RENDERING()
IF iSetPiece[SET_PIECE_CUTTER] > 2
AND iSetPiece[SET_PIECE_CUTTER] < 4
IF IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED_WITH_DELAY()
IF NOT IS_ENTITY_DEAD(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex)
IF IS_ENTITY_PLAYING_ANIM(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex, sAnimDictMic2SetPiece1, "goon_meatslicer")
SET_ENTITY_ANIM_CURRENT_TIME(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex, sAnimDictMic2SetPiece1, "goon_meatslicer", 0.99)
ENDIF
// IF IS_STREAM_PLAYING()
// STOP_STREAM()
// ENDIF
iSetPiece[SET_PIECE_CUTTER] = 4
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("AudioSpinningBlades")
IF DOES_ENTITY_EXIST(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex)
IF IS_PED_INJURED(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex)
//Audio
PLAY_AUDIO(MIC2_SPINNING_BLADES)
SET_LABEL_AS_TRIGGERED("AudioSpinningBlades", TRUE)
ENDIF
ENDIF
ENDIF
IF (intAbattoir != NULL
AND GET_INTERIOR_FROM_ENTITY(PLAYER_PED_ID()) = intAbattoir)
IF NOT DOES_BLIP_EXIST(blipMichael)
IF HAS_LABEL_BEEN_TRIGGERED("MCH2_RESCUE")
SAFE_ADD_BLIP_PED(blipMichael, sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], FALSE)
ENDIF
ENDIF
// IF IS_ENTITY_AT_COORD(PLAYER_PED(CHAR_FRANKLIN), <<995.975464, -2148.494629, 33.499943>>, <<25.0, 25.0, 15.0>>)
// //Cutscene
// REQUEST_CUTSCENE("mic_2_mcs_2")
//
// //Request Cutscene Variations - mic_2_mcs_2
// IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
// SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Franklin", PLAYER_PED(CHAR_FRANKLIN))
// SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", PLAYER_PED(CHAR_MICHAEL))
// ENDIF
// ENDIF
IF (NOT IS_MESSAGE_BEING_DISPLAYED() OR GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) = 0)
AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT HAS_LABEL_BEEN_TRIGGERED("AbandonMichael")
// IF NOT HAS_LABEL_BEEN_TRIGGERED("MCH2_FIND1")
// IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<994.403198, -2184.370850, 28.477783>>, <<996.124634, -2166.494141, 32.963730>>, 10.0)
// CREATE_CONVERSATION_ADV("MCH2_FIND1")
// ENDIF
// ELIF NOT HAS_LABEL_BEEN_TRIGGERED("MCH2_FIND2")
// IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<963.563538, -2165.346924, 28.029001>>, <<993.229797, -2167.891113, 32.475231>>, 10.0)
// CREATE_CONVERSATION_ADV("MCH2_FIND2")
// ENDIF
// ELIF NOT HAS_LABEL_BEEN_TRIGGERED("MCH2_FIND3")
// IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<973.843018, -2158.792725, 27.975471>>, <<999.225342, -2160.920166, 32.476738>>, 10.0)
// CREATE_CONVERSATION_ADV("MCH2_FIND3")
// ENDIF
// ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("MCH2_HLP1")
//Far from Michael
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED(CHAR_FRANKLIN), <<963.563843, -2166.085693, 28.475433>>, <<974.759644, -2167.140625, 34.459885>>, 5.250)
SET_LABEL_AS_TRIGGERED("ApproachingMichael", FALSE)
ENDIF
//Near to Michael
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED(CHAR_FRANKLIN), <<963.502747, -2160.814941, 28.474331>>, <<974.999939, -2161.838135, 34.475826>>, 5.250)
SET_LABEL_AS_TRIGGERED("ApproachingMichael", TRUE)
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("ApproachingMichael")
IF GET_GAME_TIMER() > iDialogueTimer[2]
IF iDialogueLineCount[4] = -1
iDialogueLineCount[4] = 8
ELIF iDialogueLineCount[4] > 0
iDialogueTimer[2] = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(4000, 6000)
iDialogueLineCount[4]--
CREATE_CONVERSATION_ADV("MCH2_LOOK", CONV_PRIORITY_MEDIUM, FALSE)
ENDIF
ENDIF
ENDIF
IF HAS_LABEL_BEEN_TRIGGERED("ApproachingMichael")
IF GET_GAME_TIMER() > iDialogueTimer[2]
IF NOT HAS_LABEL_BEEN_TRIGGERED("MCH2_STUCK") AND NOT HAS_LABEL_BEEN_TRIGGERED("MCH2_STUCK2")
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED(CHAR_FRANKLIN)), GET_ENTITY_COORDS(PLAYER_PED(CHAR_MICHAEL))) < 15.0
CREATE_CONVERSATION_ADV("MCH2_STUCK") //Near
ELSE
CREATE_CONVERSATION_ADV("MCH2_STUCK2") //Far
ENDIF
ELIF NOT HAS_LABEL_BEEN_TRIGGERED("MCH2_HLP1_01")
PLAY_SINGLE_LINE_FROM_CONVERSATION_ADV("MCH2_HLP1", "MCH2_HLP1_01")
ELIF NOT HAS_LABEL_BEEN_TRIGGERED("MCH2_HLP1_02")
PLAY_SINGLE_LINE_FROM_CONVERSATION_ADV("MCH2_HLP1", "MCH2_HLP1_02")
ELIF NOT HAS_LABEL_BEEN_TRIGGERED("MCH2_HLP1_03")
PLAY_SINGLE_LINE_FROM_CONVERSATION_ADV("MCH2_HLP1", "MCH2_HLP1_03")
ELIF NOT HAS_LABEL_BEEN_TRIGGERED("MCH2_HLP1_04")
PLAY_SINGLE_LINE_FROM_CONVERSATION_ADV("MCH2_HLP1", "MCH2_HLP1_04")
ENDIF
iDialogueTimer[2] = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(4000, 6000)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF HAS_LABEL_BEEN_TRIGGERED("MCH2_GSHT")
OR (DOES_ENTITY_EXIST(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex)
AND IS_PED_INJURED(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex))
IF (NOT IS_MESSAGE_BEING_DISPLAYED() OR GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) = 0)
AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
// IF NOT HAS_LABEL_BEEN_TRIGGERED("MCH2_GREET1")
// IF IS_GAMEPLAY_CAM_RENDERING()
// IF IS_ENTITY_AT_COORD(PLAYER_PED(CHAR_FRANKLIN), <<995.128967, -2150.473389, 31.476431>>, <<7.0, 16.0, 3.0>>)
// CREATE_CONVERSATION_ADV("MCH2_GREET1")
// ENDIF
// ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("MCH2_STUCK") AND NOT HAS_LABEL_BEEN_TRIGGERED("MCH2_STUCK2")
CREATE_CONVERSATION_ADV("MCH2_STUCK")
ELIF NOT HAS_LABEL_BEEN_TRIGGERED("MCH2_GREET2")
IF IS_GAMEPLAY_CAM_RENDERING()
IF IS_ENTITY_AT_COORD(PLAYER_PED(CHAR_FRANKLIN), <<995.128967, -2150.473389, 31.476431>>, <<7.0, 16.0, 3.0>>)
IF GET_GAME_TIMER() > iDialogueTimer[1]
CREATE_CONVERSATION_ADV("MCH2_GREET2")
iDialogueTimer[1] = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(4000, 5000)
ENDIF
ENDIF
ENDIF
ELIF NOT HAS_LABEL_BEEN_TRIGGERED("MCH2_TWPM")
IF IS_GAMEPLAY_CAM_RENDERING()
IF IS_ENTITY_AT_COORD(PLAYER_PED(CHAR_FRANKLIN), <<995.128967, -2150.473389, 31.476431>>, <<7.0, 16.0, 3.0>>)
IF GET_GAME_TIMER() > iDialogueTimer[1]
CREATE_CONVERSATION_ADV("MCH2_TWPM")
iDialogueTimer[1] = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(4000, 5000)
ENDIF
ENDIF
ENDIF
ELIF NOT HAS_LABEL_BEEN_TRIGGERED("MCH2_HLP2")
IF IS_GAMEPLAY_CAM_RENDERING()
IF IS_ENTITY_AT_COORD(PLAYER_PED(CHAR_FRANKLIN), <<995.128967, -2150.473389, 31.476431>>, <<7.0, 16.0, 3.0>>)
IF GET_GAME_TIMER() > iDialogueTimer[1]
CREATE_CONVERSATION_ADV("MCH2_HLP2")
iDialogueTimer[1] = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(4000, 5000)
ENDIF
ENDIF
ENDIF
ELSE
IF IS_GAMEPLAY_CAM_RENDERING()
IF IS_ENTITY_AT_COORD(PLAYER_PED(CHAR_FRANKLIN), <<988.615295, -2144.727051, 31.475969>>, <<12.0, 20.0, 3.0>>)
IF GET_GAME_TIMER() > iDialogueTimer[1]
IF iDialogueLineCount[3] = -1
iDialogueLineCount[3] = 5
ELIF iDialogueLineCount[3] > 0
iDialogueTimer[1] = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(4000, 6000)
iDialogueLineCount[3]--
CREATE_CONVERSATION_ADV("MCH2_HELP", CONV_PRIORITY_MEDIUM, FALSE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF IS_ENTITY_AT_COORD(PLAYER_PED(CHAR_FRANKLIN), <<995.975464, -2148.494629, 33.499943>>, <<8.0, 8.0, 5.0>>)
IF IS_ENTITY_ON_SCREEN(PLAYER_PED(CHAR_MICHAEL))
IF IS_GAMEPLAY_CAM_RENDERING()
FLOAT fDistance = 50.0
REPEAT COUNT_OF(sEnemyShootout) i
IF DOES_ENTITY_EXIST(sEnemyShootout[i].pedIndex)
AND NOT IS_PED_INJURED(sEnemyShootout[i].pedIndex)
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sEnemyShootout[i].pedIndex)) < fDistance
fDistance = GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sEnemyShootout[i].pedIndex))
ENDIF
ENDIF
ENDREPEAT
REPEAT COUNT_OF(sEnemySetPiece) i
IF i <> ENUM_TO_INT(SET_PIECE_STEAM)
IF DOES_ENTITY_EXIST(sEnemySetPiece[i].pedIndex)
AND NOT IS_PED_INJURED(sEnemySetPiece[i].pedIndex)
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sEnemySetPiece[i].pedIndex)) < fDistance
AND NOT IS_ENTITY_PLAYING_ANIM(sEnemySetPiece[i].pedIndex, sAnimDictMic2SetPiece1, "goon_meatslicer")
AND iSetPiece[SET_PIECE_CUTTER] <= 4
fDistance = GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sEnemySetPiece[i].pedIndex))
ENDIF
ENDIF
ENDIF
ENDREPEAT
IF fDistance > 30.0
PRINT_HELP_ADV("MCH2_THRWP", TRUE, TRUE)
SET_LABEL_AS_TRIGGERED("AbandonMichael", TRUE)
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CONTEXT)
AND NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED(CHAR_FRANKLIN))
REPLAY_RECORD_BACK_FOR_TIME(4.0, 8.0, REPLAY_IMPORTANCE_HIGHEST)
ADVANCE_STAGE()
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("MCH2_THRWP")
SAFE_CLEAR_HELP()
SET_LABEL_AS_TRIGGERED("MCH2_THRWP", FALSE)
ENDIF
ENDIF
//Audio
IF NOT HAS_LABEL_BEEN_TRIGGERED("AudioEnter")
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED(CHAR_FRANKLIN), <<962.123413, -2184.951416, 28.976068>>, <<969.415161, -2185.648193, 33.977135>>, 5.0)
PLAY_AUDIO(MIC2_FIGHT_CONT)
LOAD_AUDIO(MIC2_ACID_BATH_OS)
SET_LABEL_AS_TRIGGERED("AudioEnter", TRUE)
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("AudioProgress")
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED(CHAR_FRANKLIN), <<994.319214, -2166.333984, 28.476685>>, <<993.632202, -2173.296875, 34.201157>>, 14.0)
PLAY_AUDIO(MIC2_ABATTOIR_PROGRESS)
SET_LABEL_AS_TRIGGERED("AudioProgress", TRUE)
ENDIF
ENDIF
ENDIF
IF HAS_LABEL_BEEN_TRIGGERED("AbandonMichael")
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED(CHAR_MICHAEL)), GET_ENTITY_COORDS(PLAYER_PED(CHAR_FRANKLIN))) > 20.0
IF NOT HAS_LABEL_BEEN_TRIGGERED("Abandon1")
PRINT_ADV("CMN_MLEAVE", DEFAULT_GOD_TEXT_TIME, FALSE)
SET_LABEL_AS_TRIGGERED("Abandon1", TRUE)
ENDIF
ENDIF
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED(CHAR_MICHAEL)), GET_ENTITY_COORDS(PLAYER_PED(CHAR_FRANKLIN))) > 30.0
eMissionFail = failMichaelAbandon
missionFailed()
ENDIF
ENDIF
IF HAS_LABEL_BEEN_TRIGGERED("MCH2_ABATTF")
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED(CHAR_MICHAEL)), GET_ENTITY_COORDS(PLAYER_PED(CHAR_FRANKLIN))) > 250.0
eMissionFail = failMichaelAbandon
missionFailed()
ENDIF
ENDIF
//Clear blocking vehicle
IF (intAbattoir = NULL
OR (intAbattoir != NULL
AND GET_INTERIOR_FROM_ENTITY(PLAYER_PED_ID()) != intAbattoir))
AND NOT IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<936.760864, -2183.205811, 39.011833>>, <<30.0, 20.0, 10.0>>)
VEHICLE_INDEX vehClosest = GET_CLOSEST_VEHICLE(<<962.19891, -2184.75244, 29.47602>>, 7.5, DUMMY_MODEL_FOR_SCRIPT, ENUM_TO_INT(VEHICLE_SEARCH_FLAG_RETURN_MISSION_VEHICLES | VEHICLE_SEARCH_FLAG_RETURN_LAW_ENFORCER_VEHICLES | VEHICLE_SEARCH_FLAG_RETURN_RANDOM_VEHICLES))
IF DOES_ENTITY_EXIST(vehClosest)
PRINTLN("vehClosest = ", NATIVE_TO_INT(vehClosest), " [model = ", GET_MODEL_NAME_FOR_DEBUG(GET_ENTITY_MODEL(vehClosest)), "]")
IF NOT IS_VEHICLE_DRIVEABLE(vehClosest)
PRINTLN("vehClosest is not driveable")
IF NOT IS_ENTITY_ON_SCREEN(vehClosest)
OR IS_ENTITY_OCCLUDED(vehClosest)
PRINTLN("vehClosest is out of sight")
IF IS_ENTITY_A_MISSION_ENTITY(vehClosest)
PRINTLN("vehClosest is a mission vehicle, marking as no longer needed")
SET_VEHICLE_AS_NO_LONGER_NEEDED(vehClosest)
ENDIF
CLEAR_AREA_OF_VEHICLES(<<962.19891, -2184.75244, 29.47602>>, 7.5)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF CLEANUP_STAGE()
//Cleanup (Blips, peds, variables etc.)
INT i
REPEAT COUNT_OF(objCigarette) i
IF DOES_PARTICLE_FX_LOOPED_EXIST(ptfxCigarette[i])
STOP_PARTICLE_FX_LOOPED(ptfxCigarette[i])
ENDIF
SAFE_DELETE_OBJECT(objCigarette[i])
ENDREPEAT
SET_MODEL_AS_NO_LONGER_NEEDED(PROP_CS_CIGGY_01)
IF DOES_ENTITY_EXIST(vehFranklin)
AND NOT IS_ENTITY_DEAD(vehFranklin)
IF IS_ENTITY_A_MISSION_ENTITY(vehFranklin)
AND DOES_ENTITY_BELONG_TO_THIS_SCRIPT(vehFranklin)
SET_MISSION_VEHICLE_GEN_VEHICLE(vehFranklin, <<930.7598, -2158.7644, 29.3458>>, 174.4858)
SET_VEHICLE_AS_NO_LONGER_NEEDED(vehFranklin)
ENDIF
ENDIF
//Audio Scene
IF IS_AUDIO_SCENE_ACTIVE("MI_2_SHOOTOUT_MAIN")
STOP_AUDIO_SCENE("MI_2_SHOOTOUT_MAIN")
ENDIF
IF IS_AUDIO_SCENE_ACTIVE("MI_2_SHOOTOUT_ACID")
STOP_AUDIO_SCENE("MI_2_SHOOTOUT_ACID")
ENDIF
IF IS_AUDIO_SCENE_ACTIVE("MI_2_GRINDER_1")
STOP_AUDIO_SCENE("MI_2_GRINDER_1")
ENDIF
IF IS_AUDIO_SCENE_ACTIVE("MI_2_SHOOT_THE_GUARD")
STOP_AUDIO_SCENE("MI_2_SHOOT_THE_GUARD")
ENDIF
IF IS_AUDIO_SCENE_ACTIVE("MI_2_MEAT_SLICER")
STOP_AUDIO_SCENE("MI_2_MEAT_SLICER")
ENDIF
IF IS_AUDIO_SCENE_ACTIVE("MI_2_THROW_THE_GUN")
STOP_AUDIO_SCENE("MI_2_THROW_THE_GUN")
ENDIF
REPEAT COUNT_OF(sEnemyShootout) i
SAFE_DELETE_PED(sEnemyShootout[i].pedIndex)
ENDREPEAT
REPEAT COUNT_OF(sEnemySetPiece) i
IF i <> ENUM_TO_INT(SET_PIECE_CUTTER)
SAFE_DELETE_PED(sEnemySetPiece[i].pedIndex)
ENDIF
ENDREPEAT
CLEAR_TEXT()
SET_ENTITY_INVINCIBLE(PLAYER_PED_ID(), FALSE)
SAFE_REMOVE_BLIP(sEnemySetPiece[SET_PIECE_CUTTER].blipIndex)
CLEANUP_AI_PED_BLIP(blipStructSetPiece[SET_PIECE_CUTTER])
//Trackify
ENABLE_SECOND_SCREEN_TRACKIFY_APP(FALSE)
eMissionObjective = INT_TO_ENUM(MissionObjective, ENUM_TO_INT(eMissionObjective) + 1)
ENDIF
ENDPROC
PROC switchToMichael
IF INIT_STAGE()
//Replay
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(ENUM_TO_INT(replayMichaelEscape), "stageMichaelEscape")
//Uncapped
bSetUncapped = TRUE
//Wanted
SET_MAX_WANTED_LEVEL(0)
SET_WANTED_LEVEL_MULTIPLIER(0.0)
//Ambulances etc.
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)
ENABLE_DISPATCH_SERVICE(DT_GANGS, FALSE)
IF CAN_CREATE_RANDOM_COPS()
SET_CREATE_RANDOM_COPS(FALSE)
ENDIF
//Radar
bRadar = FALSE
//Rail
bOkToHangFromHook = FALSE
// //Skip Michael Forwards!
// iCurrentNode = 31
// vRailCurrent = sRailNodes[31].vPos
// SET_ENTITY_COORDS_NO_OFFSET(objHook, sRailNodes[31].vPos)
// SET_ENTITY_ROTATION(objHook, sRailNodes[31].vRot)
// SAFE_FREEZE_ENTITY_POSITION(objHook, TRUE)
//Navmesh Blocking Areas
IF iNavBlock[1] = 0
iNavBlock[1] = ADD_NAVMESH_BLOCKING_OBJECT(<<992.0, -2121.8, 29.5>>, <<4.0, 20.0, 10.0>>, (-5.0 / 360) * 6.28)
PRINTLN("ADD_NAVMESH_BLOCKING_OBJECT | iNavBlock[1] = ", iNavBlock[1])
ENDIF
IF iNavBlock[2] = 0
iNavBlock[2] = ADD_NAVMESH_BLOCKING_OBJECT(<<1001.1, -2121.8, 29.5>>, <<4.6, 20.0, 10.0>>, (-5.0 / 360) * 6.28)
PRINTLN("ADD_NAVMESH_BLOCKING_OBJECT | iNavBlock[2] = ", iNavBlock[2])
ENDIF
IF iNavBlock[3] = 0
iNavBlock[3] = ADD_NAVMESH_BLOCKING_OBJECT(<<984.1, -2135.5, 29.0>>, <<8.3, 8.0, 10.0>>, (-5.250 / 360) * 6.28)
PRINTLN("ADD_NAVMESH_BLOCKING_OBJECT | iNavBlock[3] = ", iNavBlock[3])
ENDIF
//Setup Franklin as the buddy
SET_ENTITY_PROOFS(PLAYER_PED(CHAR_FRANKLIN), TRUE, TRUE, TRUE, TRUE, TRUE)
SET_PED_CAN_BE_TARGETTED(PLAYER_PED(CHAR_FRANKLIN), FALSE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(PLAYER_PED(CHAR_FRANKLIN), TRUE)
SET_PED_CONFIG_FLAG(PLAYER_PED(CHAR_FRANKLIN), PCF_RunFromFiresAndExplosions, FALSE)
REMOVE_PED_FOR_DIALOGUE(sPedsForConversation, 0)
REMOVE_PED_FOR_DIALOGUE(sPedsForConversation, 1)
ADD_PED_FOR_DIALOGUE(sPedsForConversation, 0, PLAYER_PED(CHAR_MICHAEL), "MICHAEL")
ADD_PED_FOR_DIALOGUE(sPedsForConversation, 1, PLAYER_PED(CHAR_FRANKLIN), "FRANKLIN")
REQUEST_WEAPON_ASSET(WEAPONTYPE_COMBATPISTOL)
IF bSkipped
#IF IS_DEBUG_BUILD
OR bAutoSkipping
#ENDIF
INT i
REPEAT COUNT_OF(sEnemyOutside) i
SAFE_DELETE_PED(sEnemyOutside[i].pedIndex)
ENDREPEAT
REPEAT COUNT_OF(sEnemyShootout) i
SAFE_DELETE_PED(sEnemyShootout[i].pedIndex)
ENDREPEAT
SAFE_DELETE_PED(sEnemySetPiece[SET_PIECE_RAIL].pedIndex)
SAFE_DELETE_PED(sEnemySetPiece[SET_PIECE_STEAM].pedIndex)
SAFE_DELETE_PED(sEnemySetPiece[SET_PIECE_STAIR].pedIndex)
SAFE_DELETE_PED(sEnemySetPiece[SET_PIECE_GRINDER].pedIndex)
SAFE_DELETE_PED(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex)
ENDIF
#IF IS_DEBUG_BUILD
IF bAutoSkipping = FALSE
#ENDIF
// //Cutscene
// REQUEST_CUTSCENE("mic_2_mcs_2")
#IF IS_DEBUG_BUILD
ENDIF
#ENDIF
IF SKIPPED_STAGE()
SET_PED_POSITION(PLAYER_PED(CHAR_FRANKLIN), <<998.7538, -2150.1536, 28.5002>>, 90.6113, FALSE)
//Freeze
SAFE_FREEZE_ENTITY_POSITION(PLAYER_PED(CHAR_FRANKLIN), TRUE)
//Pin Interior
IF intAbattoir = NULL
intAbattoir = GET_INTERIOR_AT_COORDS_WITH_TYPE(<<990.9518, -2178.6208, 29.0257>>, "v_abattoir")
ENDIF
PIN_INTERIOR_IN_MEMORY(intAbattoir)
WHILE NOT IS_INTERIOR_READY(intAbattoir)
PRINTLN("PINNING INTERIOR...")
WAIT_WITH_DEATH_CHECKS(0)
ENDWHILE
bPinnedAbattoir = TRUE
//Unfreeze
SAFE_FREEZE_ENTITY_POSITION(PLAYER_PED(CHAR_FRANKLIN), FALSE)
IF NOT bReplaySkip
LOAD_SCENE_ADV(<<996.5976, -2148.9912, 29.0>>)
ENDIF
//Audio
PLAY_AUDIO(MIC2_HANGING_RT)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(-10)
IF IS_SCREEN_FADED_OUT()
DO_SCREEN_FADE_IN(500)
ENDIF
ENDIF
ELSE
// //Request Cutscene Variations - mic_2_mcs_2
// IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
// SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Franklin", PLAYER_PED(CHAR_FRANKLIN))
// SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", PLAYER_PED(CHAR_MICHAEL))
// ENDIF
REPLAY_PREVENT_RECORDING_AND_UI_THIS_FRAME() //Fix for bug 2159461
SWITCH iCutsceneStage
CASE 0
IF SAFE_START_CUTSCENE(10.0)
//Force the switch to Michael
IF GET_CURRENT_PLAYER_PED_ENUM() != CHAR_MICHAEL
MAKE_SELECTOR_PED_SELECTION(sSelectorPeds, SELECTOR_PED_MICHAEL)
TAKE_CONTROL_OF_SELECTOR_PED(sSelectorPeds)
ENDIF
IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[CHAR_MICHAEL])
SET_PED_RELATIONSHIP_GROUP_HASH(sSelectorPeds.pedID[CHAR_MICHAEL], relGroupBuddy)
ENDIF
IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[CHAR_FRANKLIN])
SET_PED_RELATIONSHIP_GROUP_HASH(sSelectorPeds.pedID[CHAR_FRANKLIN], relGroupBuddy)
ENDIF
SET_GAMEPLAY_CAM_FOLLOW_PED_THIS_UPDATE(PLAYER_PED(CHAR_FRANKLIN))
SAFE_SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
bRadar = FALSE
CLEAR_TEXT()
GET_CURRENT_PED_WEAPON(PLAYER_PED(CHAR_FRANKLIN), wtLastWeapon)
SET_CURRENT_PED_WEAPON(PLAYER_PED(CHAR_FRANKLIN), WEAPONTYPE_UNARMED, TRUE)
SET_CURRENT_PED_WEAPON(PLAYER_PED(CHAR_MICHAEL), WEAPONTYPE_UNARMED, TRUE)
//Skip Michael Forwards!
iCurrentNode = 31
vRailCurrent = sRailNodes[31].vPos
SET_ENTITY_COORDS_NO_OFFSET(objHook, sRailNodes[31].vPos)
SET_ENTITY_ROTATION(objHook, <<0.0, 0.0, -6.6>>) //sRailNodes[31].vRot)
FREEZE_ENTITY_POSITION(objHook, TRUE)
DETACH_ENTITY(PLAYER_PED(CHAR_MICHAEL))
IF NOT DOES_ENTITY_EXIST(objGun)
objGun = CREATE_OBJECT(GET_WEAPONTYPE_MODEL(WEAPONTYPE_COMBATPISTOL), sRailNodes[31].vPos)
ENDIF
sceneSwitch = CREATE_SYNCHRONIZED_SCENE(sceneSwitchPos, sceneSwitchRot)
TASK_SYNCHRONIZED_SCENE(PLAYER_PED(CHAR_MICHAEL), sceneSwitch, sAnimDictMic2Switch, "meathook_gun_switch_mic", INSTANT_BLEND_IN, INSTANT_BLEND_OUT)
TASK_SYNCHRONIZED_SCENE(PLAYER_PED(CHAR_FRANKLIN), sceneSwitch, sAnimDictMic2Switch, "meathook_gun_switch_fra", INSTANT_BLEND_IN, INSTANT_BLEND_OUT)
PLAY_SYNCHRONIZED_ENTITY_ANIM(objGun, sceneSwitch, "meathook_gun_switch_pistol", sAnimDictMic2Switch, INSTANT_BLEND_IN)
//Cam
IF NOT DOES_CAM_EXIST(camAnim)
camAnim = CREATE_CAMERA(CAMTYPE_ANIMATED, TRUE)
ENDIF
PLAY_SYNCHRONIZED_CAM_ANIM(camAnim, sceneSwitch, "meathook_gun_switch_cam", sAnimDictMic2Switch)
SET_CAM_ACTIVE(camAnim, TRUE)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
HANG_UP_AND_PUT_AWAY_PHONE(TRUE)
WHILE NOT HAS_WEAPON_ASSET_LOADED(WEAPONTYPE_COMBATPISTOL)
WAIT_WITH_DEATH_CHECKS(0)
ENDWHILE
IF NOT DOES_ENTITY_EXIST(sEnemyBackup[0].pedIndex)
createEnemy(sEnemyBackup[0], <<997.7915, -2118.1855, 29.4757>>, 174.1204, WEAPONTYPE_PUMPSHOTGUN)
//sEnemyBackup[0].iTime[0] = 0 sEnemyBackup[0].eAdvanceStyle[0] = GUN_TO_POINT sEnemyBackup[0].vPoint[0] = <<993.5497, -2142.2900, 28.4761>> sEnemyBackup[0].fSpeed[0] = PEDMOVEBLENDRATIO_RUN
SET_PED_RESET_FLAG(sEnemyBackup[0].pedIndex, PRF_InstantBlendToAim, TRUE)
TASK_COMBAT_PED(sEnemyBackup[0].pedIndex, PLAYER_PED(CHAR_MICHAEL))
SET_PED_SPHERE_DEFENSIVE_AREA(sEnemyBackup[0].pedIndex, <<993.5497, -2142.2900, 28.4761>>, 2.0)
SET_PED_COMBAT_ATTRIBUTES(sEnemyBackup[0].pedIndex, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
//RETAIN_ENTITY_IN_INTERIOR(sEnemyBackup[0].pedIndex, intAbattoir)
ENDIF
IF NOT DOES_ENTITY_EXIST(sEnemyBackup[1].pedIndex)
createEnemy(sEnemyBackup[1], <<996.0300, -2123.4690, 29.4757>>, 174.1522, WEAPONTYPE_ASSAULTRIFLE)
//sEnemyBackup[1].iTime[0] = 0 sEnemyBackup[1].eAdvanceStyle[0] = GUN_TO_POINT sEnemyBackup[1].vPoint[0] = <<995.7127, -2135.2080, 29.4761>> sEnemyBackup[1].fSpeed[0] = PEDMOVEBLENDRATIO_RUN
SET_PED_RESET_FLAG(sEnemyBackup[1].pedIndex, PRF_InstantBlendToAim, TRUE)
TASK_COMBAT_PED(sEnemyBackup[1].pedIndex, PLAYER_PED(CHAR_MICHAEL))
SET_PED_SPHERE_DEFENSIVE_AREA(sEnemyBackup[1].pedIndex, <<995.7127, -2135.2080, 29.4761>>, 1.5)
SET_PED_COMBAT_ATTRIBUTES(sEnemyBackup[1].pedIndex, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
//RETAIN_ENTITY_IN_INTERIOR(sEnemyBackup[1].pedIndex, intAbattoir)
ENDIF
REPLAY_RECORD_BACK_FOR_TIME(5.0, 10.0, REPLAY_IMPORTANCE_HIGHEST)
ADVANCE_CUTSCENE()
ENDIF
BREAK
CASE 1
IF (NOT IS_MESSAGE_BEING_DISPLAYED() OR GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) = 0)
AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
CREATE_CONVERSATION_ADV("MCH2_TWPF")
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("SwitchFX[Flash1]")
IF (IS_SYNCHRONIZED_SCENE_RUNNING(sceneSwitch)
AND GET_SYNCHRONIZED_SCENE_PHASE(sceneSwitch) >= 0.375)
PLAY_SOUND_FRONTEND(-1, "Hit_Out", "PLAYER_SWITCH_CUSTOM_SOUNDSET")
IF sfxWoosh = -1
sfxWoosh = GET_SOUND_ID()
PLAY_SOUND_FRONTEND(sfxWoosh, "Short_Transition_In", "PLAYER_SWITCH_CUSTOM_SOUNDSET")
ENDIF
ANIMPOSTFX_PLAY("SwitchShortFranklinIn", 0, FALSE)
SET_LABEL_AS_TRIGGERED("SwitchFX[Flash1]", TRUE)
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("SwitchFX[Flash2]")
IF (IS_SYNCHRONIZED_SCENE_RUNNING(sceneSwitch)
AND GET_SYNCHRONIZED_SCENE_PHASE(sceneSwitch) >= 0.550)
PLAY_SOUND_FRONTEND(-1, "1st_Person_Transition", "PLAYER_SWITCH_CUSTOM_SOUNDSET")
IF sfxWoosh != -1
STOP_SOUND(sfxWoosh)
RELEASE_SOUND_ID(sfxWoosh)
sfxWoosh = -1
ENDIF
ANIMPOSTFX_PLAY("SwitchShortMichaelMid", 0, FALSE)
SET_LABEL_AS_TRIGGERED("SwitchFX[Flash2]", TRUE)
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("InterpCam")
IF (IS_SYNCHRONIZED_SCENE_RUNNING(sceneSwitch)
AND GET_SYNCHRONIZED_SCENE_PHASE(sceneSwitch) >= 0.8)
//RENDER_SCRIPT_CAMS(FALSE, TRUE, 500, FALSE)
IF NOT DOES_CAM_EXIST(camMain)
camMain = CREATE_CAM("DEFAULT_SCRIPTED_CAMERA")
ENDIF
SET_CAM_PARAMS(camMain,
<<993.677734, -2151.261230, 30.430367>>,
<<0.0, 0.0, -6.601181>>,
45.0)
SET_CAM_ACTIVE_WITH_INTERP(camMain, camAnim, 500, GRAPH_TYPE_DECEL, GRAPH_TYPE_DECEL)
PRINTLN("SET_CAM_ACTIVE_WITH_INTERP, GET_SYNCHRONIZED_SCENE_PHASE(sceneSwitch) = ", GET_SYNCHRONIZED_SCENE_PHASE(sceneSwitch))
bRadar = TRUE
SET_LABEL_AS_TRIGGERED("InterpCam", TRUE)
ENDIF
ENDIF
IF ((IS_SYNCHRONIZED_SCENE_RUNNING(sceneSwitch)
AND GET_SYNCHRONIZED_SCENE_PHASE(sceneSwitch) >= 1.0)
OR NOT IS_SYNCHRONIZED_SCENE_RUNNING(sceneSwitch))
//Michael
//ADD_ARMOUR_TO_PED(PLAYER_PED(CHAR_MICHAEL), 200)
//Start the upside down shoot task
ATTACH_ENTITY_TO_ENTITY(PLAYER_PED(CHAR_MICHAEL), objHook, 0, <<-0.0148, -0.063, -1.683>>, <<0.0, 0.0, 0.0>>, TRUE, TRUE) //<<0.0, -0.05, -1.68>>
// TASK_PLAY_ANIM(PLAYER_PED(CHAR_MICHAEL), sAnimDictHang, "idle", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1, AF_LOOPING)
// FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED(CHAR_MICHAEL))
// WHILE NOT IS_ENTITY_PLAYING_ANIM(PLAYER_PED(CHAR_MICHAEL), sAnimDictHang, "idle")
// WAIT_WITH_DEATH_CHECKS(0)
// ENDWHILE
//SET_PLAYER_FORCED_AIM(PLAYER_ID(), TRUE)
//SET_PLAYER_FORCED_ZOOM(PLAYER_ID(), TRUE)
GIVE_WEAPON_TO_PED(PLAYER_PED(CHAR_MICHAEL), WEAPONTYPE_COMBATPISTOL, 350, TRUE)
SET_PED_AMMO(PLAYER_PED(CHAR_MICHAEL), WEAPONTYPE_COMBATPISTOL, 350)
TASK_AIM_GUN_SCRIPTED(PLAYER_PED(CHAR_MICHAEL), SCRIPTED_GUN_TASK_HANGING_UPSIDE_DOWN, TRUE, TRUE) PRINTLN("SHOOTING/HANGING UPSIDE DOWN!")
//Rail
bOkToMoveRail = FALSE
bOkToHangFromHook = FALSE
//SET_ENTITY_HEADING(PLAYER_PED(CHAR_MICHAEL), -1.90)
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED(CHAR_MICHAEL), TRUE)
SAFE_SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
RENDER_SCRIPT_CAMS(FALSE, FALSE)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
ADVANCE_STAGE()
ENDIF
BREAK
ENDSWITCH
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_NEXT_CAMERA)
ENDIF
IF CLEANUP_STAGE()
//Cleanup (Blips, peds, variables etc.)
IF sfxWoosh != -1
STOP_SOUND(sfxWoosh)
RELEASE_SOUND_ID(sfxWoosh)
sfxWoosh = -1
ENDIF
//Force the switch to Michael
IF GET_CURRENT_PLAYER_PED_ENUM() != CHAR_MICHAEL
MAKE_SELECTOR_PED_SELECTION(sSelectorPeds, SELECTOR_PED_MICHAEL)
TAKE_CONTROL_OF_SELECTOR_PED(sSelectorPeds)
IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[CHAR_MICHAEL])
SET_PED_RELATIONSHIP_GROUP_HASH(sSelectorPeds.pedID[CHAR_MICHAEL], relGroupBuddy)
ENDIF
IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[CHAR_FRANKLIN])
SET_PED_RELATIONSHIP_GROUP_HASH(sSelectorPeds.pedID[CHAR_FRANKLIN], relGroupBuddy)
ENDIF
//Franklin
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED(CHAR_FRANKLIN))
IF NOT HAS_PED_GOT_WEAPON(PLAYER_PED(CHAR_FRANKLIN), WEAPONTYPE_ASSAULTRIFLE)
GIVE_WEAPON_TO_PED(PLAYER_PED(CHAR_FRANKLIN), WEAPONTYPE_ASSAULTRIFLE, 350, TRUE)
ENDIF
SET_CURRENT_PED_WEAPON(PLAYER_PED(CHAR_FRANKLIN), WEAPONTYPE_ASSAULTRIFLE, TRUE)
SET_ENTITY_PROOFS(PLAYER_PED(CHAR_FRANKLIN), FALSE, FALSE, FALSE, FALSE, FALSE)
SAFE_SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
ENDIF
IF GET_AMMO_IN_PED_WEAPON(PLAYER_PED(CHAR_FRANKLIN), WEAPONTYPE_ASSAULTRIFLE) < (GET_WEAPON_CLIP_SIZE(WEAPONTYPE_ASSAULTRIFLE) * 4)
SET_PED_AMMO(PLAYER_PED(CHAR_FRANKLIN), WEAPONTYPE_ASSAULTRIFLE, (GET_WEAPON_CLIP_SIZE(WEAPONTYPE_ASSAULTRIFLE) * 4))
ENDIF
// REMOVE_CUTSCENE()
//
// WHILE HAS_CUTSCENE_LOADED()
// WAIT_WITH_DEATH_CHECKS(0)
// ENDWHILE
IF NOT IS_GAMEPLAY_CAM_RENDERING()
RENDER_SCRIPT_CAMS(FALSE, FALSE)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
ENDIF
IF DOES_CAM_EXIST(camAnim)
DESTROY_CAM(camAnim)
ENDIF
SAFE_DELETE_OBJECT(objGun)
SAFE_REMOVE_BLIP(blipMichael)
//Rail
SET_RAIL_FINAL_NODE(31)
fMoveSpeedMult = 0.0
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
eMissionObjective = INT_TO_ENUM(MissionObjective, ENUM_TO_INT(eMissionObjective) + 1)
ENDIF
ENDPROC
PROC michaelEscape()
IF INIT_STAGE()
//Replay
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(ENUM_TO_INT(replayMichaelEscape), "stageMichaelEscape")
//Uncapped
bSetUncapped = TRUE
//Cheat
DISABLE_CHEAT(CHEAT_TYPE_GIVE_WEAPONS, TRUE)
//Wanted
SET_MAX_WANTED_LEVEL(0)
SET_WANTED_LEVEL_MULTIPLIER(0.0)
//Ambulances etc.
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)
ENABLE_DISPATCH_SERVICE(DT_GANGS, FALSE)
IF CAN_CREATE_RANDOM_COPS()
SET_CREATE_RANDOM_COPS(FALSE)
ENDIF
//Player
SAFE_SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
SPECIAL_ABILITY_FILL_METER(PLAYER_ID(), TRUE)
//Cam
// RENDER_SCRIPT_CAMS(FALSE, FALSE)
// SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
//
// SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
// SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
//
// DESTROY_ALL_CAMS()
//Radar
bRadar = TRUE
//Vehicle
vehHachiRoku = CREATE_VEHICLE(COQUETTE, <<950.4739, -2104.9517, 29.6107>>, 106.1659)
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(vehHachiRoku, TRUE)
SET_VEHICLE_COLOURS(vehHachiRoku, 4, 0)
SET_VEHICLE_EXTRA_COLOURS(vehHachiRoku, 0, 0)
SET_VEHICLE_ON_GROUND_PROPERLY(vehHachiRoku)
SET_VEHICLE_TYRES_CAN_BURST(vehHachiRoku, FALSE)
SET_MODEL_AS_NO_LONGER_NEEDED(COQUETTE)
vehEscape = CREATE_VEHICLE(FELTZER2, <<953.9548, -2113.3518, 29.5516>>, 88.1350)
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(vehEscape, TRUE)
SET_VEHICLE_COLOURS(vehEscape, 38, 0)
SET_VEHICLE_ON_GROUND_PROPERLY(vehEscape)
SET_VEHICLE_TYRES_CAN_BURST(vehEscape, FALSE)
SET_MODEL_AS_NO_LONGER_NEEDED(FELTZER2)
//Rail
bOkToMoveRail = FALSE
bOkToHangFromHook = FALSE
//Audio
PLAY_AUDIO(MIC2_HANGING_MICHAEL)
#IF IS_DEBUG_BUILD
IF bAutoSkipping = FALSE
#ENDIF
//Audio Scene
IF NOT IS_AUDIO_SCENE_ACTIVE("MI_2_SHOOT_FROM_MEATHOOK")
START_AUDIO_SCENE("MI_2_SHOOT_FROM_MEATHOOK")
ENDIF
//bShootingUpsideDown = TRUE
CREATE_CONVERSATION_ADV("MCH2_MORE", CONV_PRIORITY_MEDIUM, TRUE, DO_NOT_DISPLAY_SUBTITLES)
SAFE_ADD_BLIP_PED(blipFranklin, sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], FALSE)
//Crates
IF NOT DOES_ENTITY_EXIST(objCrate[0])
objCrate[0] = CREATE_OBJECT_NO_OFFSET(PROP_WATERCRATE_01, <<985.1165, -2111.0317, 29.4751>>)
RETAIN_ENTITY_IN_INTERIOR(objCrate[0], intAbattoir)
ENDIF
IF NOT DOES_ENTITY_EXIST(objCrate[1])
objCrate[1] = CREATE_OBJECT_NO_OFFSET(PROP_WATERCRATE_01, <<977.4531, -2128.1602, 29.4753>>)
RETAIN_ENTITY_IN_INTERIOR(objCrate[1], intAbattoir)
ENDIF
IF NOT DOES_ENTITY_EXIST(objCrate[2])
objCrate[2] = CREATE_OBJECT_NO_OFFSET(PROP_WATERCRATE_01, <<987.7, -2125.6, 29.4753>>)
RETAIN_ENTITY_IN_INTERIOR(objCrate[2], intAbattoir)
ENDIF
//Cover
IF NOT DOES_SCRIPTED_COVER_POINT_EXIST_AT_COORDS(<<996.3627, -2142.4551, 28.4762>>)
covPoint[13] = ADD_COVER_POINT(<<996.3627, -2142.4551, 28.4762>>, 4.7376, COVUSE_WALLTORIGHT, COVHEIGHT_TOOHIGH, COVARC_120)
ENDIF
IF NOT DOES_SCRIPTED_COVER_POINT_EXIST_AT_COORDS(<<993.2383, -2131.0708, 29.4758>>)
covPoint[16] = ADD_COVER_POINT(<<993.2383, -2131.0708, 29.4758>>, 11.4085, COVUSE_WALLTOLEFT, COVHEIGHT_LOW, COVARC_120)
ENDIF
IF NOT DOES_SCRIPTED_COVER_POINT_EXIST_AT_COORDS(<<989.3762, -2108.0239, 29.4751>>)
covPoint[17] = ADD_COVER_POINT(<<989.3762, -2108.0239, 29.4751>>, 178.0079, COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_120, TRUE)
ENDIF
ADD_COVER_BLOCKING_AREA(<<985.11951, -2110.06934, 29.47508>>, <<984.31635, -2110.86963, 29.47506>>, TRUE, TRUE, TRUE)
ADD_COVER_BLOCKING_AREA(<<990.234863, -2109.403076, 29.475147>>, <<991.734863, -2107.903076, 35.475147>>, TRUE, TRUE, TRUE)
ADD_COVER_BLOCKING_AREA(<<984.292725, -2125.887451, 29.475412>>, <<985.292725, -2124.887451, 33.475412>>, TRUE, TRUE, TRUE)
//Navmesh Blocking Areas
IF iNavBlock[1] = 0
iNavBlock[1] = ADD_NAVMESH_BLOCKING_OBJECT(<<992.0, -2121.8, 29.5>>, <<4.0, 20.0, 10.0>>, (-5.0 / 360) * 6.28)
PRINTLN("ADD_NAVMESH_BLOCKING_OBJECT | iNavBlock[1] = ", iNavBlock[1])
ENDIF
IF iNavBlock[2] = 0
iNavBlock[2] = ADD_NAVMESH_BLOCKING_OBJECT(<<1001.1, -2121.8, 29.5>>, <<4.6, 20.0, 10.0>>, (-5.0 / 360) * 6.28)
PRINTLN("ADD_NAVMESH_BLOCKING_OBJECT | iNavBlock[2] = ", iNavBlock[2])
ENDIF
IF iNavBlock[3] = 0
iNavBlock[3] = ADD_NAVMESH_BLOCKING_OBJECT(<<984.1, -2135.5, 29.0>>, <<8.3, 8.0, 10.0>>, (-5.250 / 360) * 6.28)
PRINTLN("ADD_NAVMESH_BLOCKING_OBJECT | iNavBlock[3] = ", iNavBlock[3])
ENDIF
//Enemies
//Set Piece
createEnemy(sEnemySetPiece[SET_PIECE_GRAPPLE], <<983.5596, -2110.1997, 29.4750>>, 299.8301, WEAPONTYPE_KNIFE)
IF DOES_ENTITY_EXIST(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex)
SET_ENTITY_VISIBLE(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex, FALSE)
//RETAIN_ENTITY_IN_INTERIOR(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex, intAbattoir)
SET_PED_CONFIG_FLAG(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex, PCF_DontActivateRagdollFromBulletImpact, TRUE)
SET_PED_CONFIG_FLAG(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex, PCF_DontActivateRagdollFromExplosions, TRUE)
SET_PED_CONFIG_FLAG(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex, PCF_DontActivateRagdollFromElectrocution, TRUE)
SET_PED_CONFIG_FLAG(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex, PCF_DontActivateRagdollFromFire, TRUE)
SET_RAGDOLL_BLOCKING_FLAGS(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex, RBF_BULLET_IMPACT | RBF_EXPLOSION | RBF_ELECTROCUTION | RBF_FIRE | RBF_RUBBER_BULLET)
SET_ENTITY_PROOFS(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex, TRUE, TRUE, TRUE, TRUE, TRUE)
SET_ENTITY_INVINCIBLE(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex, TRUE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex, TRUE)
SET_PED_COMBAT_MOVEMENT(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex, CM_STATIONARY)
SET_PED_MAX_HEALTH(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex, 600)
SET_ENTITY_HEALTH(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex, 600)
ENDIF
//Backup
IF NOT DOES_ENTITY_EXIST(sEnemyBackup[0].pedIndex)
createEnemy(sEnemyBackup[0], <<997.7915, -2118.1855, 29.4757>>, 174.1204, WEAPONTYPE_PUMPSHOTGUN)
//sEnemyBackup[0].iTime[0] = 0 sEnemyBackup[0].eAdvanceStyle[0] = GUN_TO_POINT sEnemyBackup[0].vPoint[0] = <<993.5497, -2142.2900, 28.4761>> sEnemyBackup[0].fSpeed[0] = PEDMOVEBLENDRATIO_RUN
SET_PED_RESET_FLAG(sEnemyBackup[0].pedIndex, PRF_InstantBlendToAim, TRUE)
TASK_COMBAT_PED(sEnemyBackup[0].pedIndex, PLAYER_PED(CHAR_MICHAEL))
SET_PED_SPHERE_DEFENSIVE_AREA(sEnemyBackup[0].pedIndex, <<993.5497, -2142.2900, 28.4761>>, 2.0)
SET_PED_COMBAT_ATTRIBUTES(sEnemyBackup[0].pedIndex, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
//RETAIN_ENTITY_IN_INTERIOR(sEnemyBackup[0].pedIndex, intAbattoir)
ENDIF
IF NOT DOES_ENTITY_EXIST(sEnemyBackup[1].pedIndex)
createEnemy(sEnemyBackup[1], <<996.0300, -2123.4690, 29.4757>>, 174.1522, WEAPONTYPE_ASSAULTRIFLE)
//sEnemyBackup[1].iTime[0] = 0 sEnemyBackup[1].eAdvanceStyle[0] = GUN_TO_POINT sEnemyBackup[1].vPoint[0] = <<995.7127, -2135.2080, 29.4761>> sEnemyBackup[1].fSpeed[0] = PEDMOVEBLENDRATIO_RUN
SET_PED_RESET_FLAG(sEnemyBackup[1].pedIndex, PRF_InstantBlendToAim, TRUE)
TASK_COMBAT_PED(sEnemyBackup[1].pedIndex, PLAYER_PED(CHAR_MICHAEL))
SET_PED_SPHERE_DEFENSIVE_AREA(sEnemyBackup[1].pedIndex, <<993.2, -2143.0, 29.4761>>, 1.5)
SET_PED_COMBAT_ATTRIBUTES(sEnemyBackup[1].pedIndex, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
//RETAIN_ENTITY_IN_INTERIOR(sEnemyBackup[1].pedIndex, intAbattoir)
ENDIF
createEnemy(sEnemyBackup[2], <<995.9071, -2108.7920, 29.4754>>, 185.6451, WEAPONTYPE_SMG, G_M_M_CHIGOON_01)
TASK_COMBAT_PED(sEnemyBackup[2].pedIndex, PLAYER_PED(CHAR_MICHAEL))
SET_PED_SPHERE_DEFENSIVE_AREA(sEnemyBackup[2].pedIndex, <<994.2408, -2136.2017, 29.2397>>, 1.5)
SET_PED_COMBAT_ATTRIBUTES(sEnemyBackup[2].pedIndex, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
//sEnemyBackup[2].pedCheck[0] = sEnemyBackup[0].pedIndex sEnemyBackup[2].eAdvanceStyle[0] = GUN_TO_POINT sEnemyBackup[2].vPoint[0] = <<994.2408, -2136.2017, 29.2397>> sEnemyBackup[2].fSpeed[0] = PEDMOVEBLENDRATIO_RUN
createEnemy(sEnemyBackup[3], <<993.0202, -2106.5718, 29.6306>>, 223.5710, WEAPONTYPE_SMG)
sEnemyBackup[3].pedCheck[0] = sEnemyBackup[1].pedIndex sEnemyBackup[3].eAdvanceStyle[0] = GUN_TO_POINT sEnemyBackup[3].vPoint[0] = <<994.7, -2134.4, 29.4761>> sEnemyBackup[3].fSpeed[0] = PEDMOVEBLENDRATIO_RUN
createEnemy(sEnemyBackup[4], <<995.6806, -2106.8789, 29.6252>>, 183.2036, WEAPONTYPE_ASSAULTRIFLE)
sEnemyBackup[4].pedCheck[0] = sEnemyBackup[2].pedIndex sEnemyBackup[4].eAdvanceStyle[0] = GUN_TO_POINT sEnemyBackup[4].vPoint[0] = <<995.0988, -2129.1052, 29.4759>> sEnemyBackup[4].fSpeed[0] = PEDMOVEBLENDRATIO_RUN
createEnemy(sEnemyBackup[5], <<990.7935, -2105.4414, 29.6615>>, 185.5090, WEAPONTYPE_PISTOL, G_M_M_CHIGOON_01)
sEnemyBackup[5].vLocate[0] = <<995.4, -2133.0, 31.225800>> sEnemyBackup[5].vLocSize[0] = <<5.0, 4.0, 3.0>> sEnemyBackup[5].eAdvanceStyle[0] = GUN_TO_POINT sEnemyBackup[5].vPoint[0] = <<999.898499, -2137.357666, 29.0755>> sEnemyBackup[5].fSpeed[0] = PEDMOVE_SPRINT
createEnemy(sEnemyBackup[6], <<989.1515, -2105.3550, 29.4987>>, 268.4109, WEAPONTYPE_PISTOL)
sEnemyBackup[6].vLocate[0] = <<997.6, -2119.8, 31.225800>> sEnemyBackup[6].vLocSize[0] = <<5.0, 4.0, 3.0>> sEnemyBackup[6].eAdvanceStyle[0] = GUN_TO_POINT sEnemyBackup[6].vPoint[0] = <<997.829773, -2116.072266, 29.4993>> sEnemyBackup[6].fSpeed[0] = PEDMOVE_SPRINT
//Two more enemies created in "OpenCombat9"
//Three more enemies created in "OpenCombat10"
// SET_PED_SPHERE_DEFENSIVE_AREA(sEnemyBackup[0].pedIndex, <<993.6147, -2129.6279, 29.4995>>, 2.0)
// SET_PED_SPHERE_DEFENSIVE_AREA(sEnemyBackup[1].pedIndex, <<995.8074, -2130.9795, 29.4996>>, 2.0)
SET_PED_SPHERE_DEFENSIVE_AREA(sEnemyBackup[2].pedIndex, <<992.9218, -2134.4761, 29.4997>>, 2.0)
// SET_PED_SPHERE_DEFENSIVE_AREA(sEnemyBackup[3].pedIndex, <<991.7494, -2137.2988, 29.2466>>, 2.0)
// SET_PED_SPHERE_DEFENSIVE_AREA(sEnemyBackup[4].pedIndex, <<999.7883, -2137.4788, 29.2466>>, 2.0)
INT i
REPEAT COUNT_OF(sEnemyBackup) i
IF DOES_ENTITY_EXIST(sEnemyBackup[i].pedIndex)
IF i <> 0 AND i <> 1
//RETAIN_ENTITY_IN_INTERIOR(sEnemyBackup[i].pedIndex, intAbattoir)
SET_ENTITY_HEALTH(sEnemyBackup[i].pedIndex, 170)
SET_PED_MAX_HEALTH(sEnemyBackup[i].pedIndex, 170)
ENDIF
ENDIF
ENDREPEAT
#IF IS_DEBUG_BUILD
REPEAT COUNT_OF(sEnemyBackup) i
IF NOT IS_PED_INJURED(sEnemyBackup[i].pedIndex)
ASSIGN_DEBUG_NAMES(sEnemyBackup[i].pedIndex, "sEnemyBackup ", i)
sEnemyBackup[i].sDebugName = CONCATENATE_STRINGS("sEnemyBackup ", GET_STRING_FROM_INT(i))
ENDIF
ENDREPEAT
#ENDIF
//Michael
SET_PED_CONFIG_FLAG(PLAYER_PED(CHAR_MICHAEL), PCF_RunFromFiresAndExplosions, FALSE)
SET_PED_CONFIG_FLAG(PLAYER_PED(CHAR_MICHAEL), PCF_DisableExplosionReactions, TRUE)
SET_PED_COMBAT_ATTRIBUTES(PLAYER_PED(CHAR_MICHAEL), CA_DISABLE_BULLET_REACTIONS, TRUE)
SET_PED_COMBAT_ATTRIBUTES(PLAYER_PED(CHAR_MICHAEL), CA_SWITCH_TO_ADVANCE_IF_CANT_FIND_COVER, FALSE)
SET_PED_COMBAT_MOVEMENT(PLAYER_PED(CHAR_MICHAEL), CM_DEFENSIVE)
SET_RAGDOLL_BLOCKING_FLAGS(PLAYER_PED(CHAR_MICHAEL), RBF_BULLET_IMPACT | RBF_PLAYER_BUMP | RBF_PLAYER_RAGDOLL_BUMP)
SET_PED_CAN_BE_TARGETTED(PLAYER_PED(CHAR_MICHAEL), FALSE)
//Franklin Combat
SET_PED_CONFIG_FLAG(PLAYER_PED(CHAR_FRANKLIN), PCF_RunFromFiresAndExplosions, FALSE)
SET_PED_CONFIG_FLAG(PLAYER_PED(CHAR_FRANKLIN), PCF_DisableExplosionReactions, TRUE)
SET_PED_COMBAT_ATTRIBUTES(PLAYER_PED(CHAR_FRANKLIN), CA_DISABLE_BULLET_REACTIONS, TRUE)
SET_PED_COMBAT_ATTRIBUTES(PLAYER_PED(CHAR_FRANKLIN), CA_SWITCH_TO_ADVANCE_IF_CANT_FIND_COVER, FALSE)
SET_PED_COMBAT_ATTRIBUTES(PLAYER_PED(CHAR_FRANKLIN), CA_DISABLE_PINNED_DOWN, TRUE)
SET_PED_COMBAT_MOVEMENT(PLAYER_PED(CHAR_FRANKLIN), CM_DEFENSIVE)
SET_PED_ACCURACY(PLAYER_PED(CHAR_FRANKLIN), 20)
SET_RAGDOLL_BLOCKING_FLAGS(PLAYER_PED(CHAR_FRANKLIN), RBF_BULLET_IMPACT)
SET_PED_SPHERE_DEFENSIVE_AREA(PLAYER_PED(CHAR_FRANKLIN), <<996.1766, -2142.4341, 28.50>>, 1.0)
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED(CHAR_FRANKLIN))
IF NOT HAS_PED_GOT_WEAPON(PLAYER_PED(CHAR_FRANKLIN), WEAPONTYPE_ASSAULTRIFLE)
GIVE_WEAPON_TO_PED(PLAYER_PED(CHAR_FRANKLIN), WEAPONTYPE_ASSAULTRIFLE, 350, TRUE)
ENDIF
SET_CURRENT_PED_WEAPON(PLAYER_PED(CHAR_FRANKLIN), WEAPONTYPE_ASSAULTRIFLE, TRUE)
SET_ENTITY_PROOFS(PLAYER_PED(CHAR_FRANKLIN), FALSE, FALSE, FALSE, FALSE, FALSE)
OPEN_SEQUENCE_TASK(seqMain)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
TASK_GO_TO_COORD_AND_AIM_AT_HATED_ENTITIES_NEAR_COORD(NULL, <<996.2867, -2143.0442, 28.4763>>, <<994.3478, -2136.1184, 29.2463>>, PEDMOVE_RUN, TRUE, 4.0, 4.0, TRUE, ENAV_NO_STOPPING | ENAV_DONT_ADJUST_TARGET_POSITION)
TASK_PUT_PED_DIRECTLY_INTO_COVER(NULL, <<996.3146, -2142.4307, 28.4762>>, 1000, FALSE, 1.0, TRUE, TRUE, covPoint[13], TRUE)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 1000.0)
CLOSE_SEQUENCE_TASK(seqMain)
TASK_PERFORM_SEQUENCE(PLAYER_PED(CHAR_FRANKLIN), seqMain)
CLEAR_SEQUENCE_TASK(seqMain)
SET_PED_USING_ACTION_MODE(PLAYER_PED(CHAR_FRANKLIN), TRUE, -1, "DEFAULT_ACTION")
#IF IS_DEBUG_BUILD
ENDIF
#ENDIF
IF SKIPPED_STAGE()
SET_PED_POSITION(PLAYER_PED(CHAR_FRANKLIN), <<996.5976, -2148.9912, 29.0>>, 143.7361, FALSE)
//Freeze
SAFE_FREEZE_ENTITY_POSITION(PLAYER_PED(CHAR_MICHAEL), TRUE)
SAFE_FREEZE_ENTITY_POSITION(PLAYER_PED(CHAR_FRANKLIN), TRUE)
//Pin Interior
IF intAbattoir = NULL
intAbattoir = GET_INTERIOR_AT_COORDS_WITH_TYPE(<<990.9518, -2178.6208, 29.0257>>, "v_abattoir")
ENDIF
PIN_INTERIOR_IN_MEMORY(intAbattoir)
WHILE NOT IS_INTERIOR_READY(intAbattoir)
PRINTLN("PINNING INTERIOR...")
WAIT_WITH_DEATH_CHECKS(0)
ENDWHILE
bPinnedAbattoir = TRUE
//Unfreeze
SAFE_FREEZE_ENTITY_POSITION(PLAYER_PED(CHAR_MICHAEL), FALSE)
SAFE_FREEZE_ENTITY_POSITION(PLAYER_PED(CHAR_FRANKLIN), FALSE)
IF NOT bReplaySkip
LOAD_SCENE_ADV(<<996.5976, -2148.9912, 29.0>>)
ENDIF
WAIT_WITH_DEATH_CHECKS(0)
MAKE_PICKUPS()
//Michael
//ADD_ARMOUR_TO_PED(PLAYER_PED(CHAR_MICHAEL), 200)
//Skip Michael Forwards!
iCurrentNode = 31
vRailCurrent = sRailNodes[31].vPos
SET_ENTITY_COORDS_NO_OFFSET(objHook, sRailNodes[31].vPos)
SET_ENTITY_ROTATION(objHook, <<0.0, 0.0, -6.6>>) //sRailNodes[31].vRot
FREEZE_ENTITY_POSITION(objHook, TRUE)
REQUEST_WEAPON_ASSET(WEAPONTYPE_COMBATPISTOL)
REQUEST_WEAPON_ASSET(WEAPONTYPE_ASSAULTRIFLE)
WHILE NOT HAS_WEAPON_ASSET_LOADED(WEAPONTYPE_COMBATPISTOL)
OR NOT HAS_WEAPON_ASSET_LOADED(WEAPONTYPE_ASSAULTRIFLE)
PRINTLN("LOADING WEAPON ASSETS (WEAPONTYPE_COMBATPISTOL)...")
PRINTLN("LOADING WEAPON ASSETS (WEAPONTYPE_ASSAULTRIFLE)...")
WAIT_WITH_DEATH_CHECKS(0)
ENDWHILE
//Start the upside down shoot task
ATTACH_ENTITY_TO_ENTITY(PLAYER_PED(CHAR_MICHAEL), objHook, 0, <<0.0, -0.05, -1.68>> , <<0.0, 0.0, 0.0>>, TRUE, TRUE)
// TASK_PLAY_ANIM(PLAYER_PED(CHAR_MICHAEL), sAnimDictHang, "idle", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1, AF_LOOPING)
// FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED(CHAR_MICHAEL))
// WHILE NOT IS_ENTITY_PLAYING_ANIM(PLAYER_PED(CHAR_MICHAEL), sAnimDictHang, "idle")
// WAIT_WITH_DEATH_CHECKS(0)
// ENDWHILE
//SET_PLAYER_FORCED_AIM(PLAYER_ID(), TRUE)
//Reset gameplay camera to third person, see B*1993022
IF GET_FOLLOW_PED_CAM_VIEW_MODE() = CAM_VIEW_MODE_FIRST_PERSON
SET_FOLLOW_PED_CAM_VIEW_MODE(CAM_VIEW_MODE_THIRD_PERSON_NEAR)
PRINTLN("RESETTING GAMEPLAY CAM VIEW MODE TO CAM_VIEW_MODE_THIRD_PERSON_NEAR 2")
ENDIF
REMOVE_ALL_PED_WEAPONS(PLAYER_PED(CHAR_MICHAEL))
GIVE_WEAPON_TO_PED(PLAYER_PED(CHAR_MICHAEL), WEAPONTYPE_COMBATPISTOL, 350, TRUE)
SET_PED_AMMO(PLAYER_PED(CHAR_MICHAEL), WEAPONTYPE_COMBATPISTOL, 350)
TASK_AIM_GUN_SCRIPTED(PLAYER_PED(CHAR_MICHAEL), SCRIPTED_GUN_TASK_HANGING_UPSIDE_DOWN) PRINTLN("SHOOTING/HANGING UPSIDE DOWN!")
// SET_ENTITY_HEADING(PLAYER_PED(CHAR_MICHAEL), -1.90)
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED(CHAR_MICHAEL))
SAFE_SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
//Franklin
IF NOT HAS_PED_GOT_WEAPON(PLAYER_PED(CHAR_FRANKLIN), WEAPONTYPE_ASSAULTRIFLE)
GIVE_WEAPON_TO_PED(PLAYER_PED(CHAR_FRANKLIN), WEAPONTYPE_ASSAULTRIFLE, 350, TRUE)
ENDIF
enumCharacterList eCharFail = GET_CURRENT_PLAYER_PED_ENUM()
IF GET_FAIL_WEAPON(ENUM_TO_INT(eCharFail)) != WEAPONTYPE_UNARMED AND GET_FAIL_WEAPON(ENUM_TO_INT(eCharFail)) != WEAPONTYPE_INVALID AND HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), GET_FAIL_WEAPON(ENUM_TO_INT(eCharFail)))
SET_CURRENT_PED_WEAPON(PLAYER_PED(CHAR_FRANKLIN), GET_FAIL_WEAPON(ENUM_TO_INT(eCharFail)), TRUE)
ELSE
SET_CURRENT_PED_WEAPON(PLAYER_PED(CHAR_FRANKLIN), WEAPONTYPE_ASSAULTRIFLE, TRUE)
ENDIF
//Dialogue
REMOVE_PED_FOR_DIALOGUE(sPedsForConversation, 0)
REMOVE_PED_FOR_DIALOGUE(sPedsForConversation, 1)
ADD_PED_FOR_DIALOGUE(sPedsForConversation, 0, PLAYER_PED(CHAR_MICHAEL), "MICHAEL")
ADD_PED_FOR_DIALOGUE(sPedsForConversation, 1, PLAYER_PED(CHAR_FRANKLIN), "FRANKLIN")
//Audio
PLAY_AUDIO(MIC2_HANGING_RT)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(-10)
// IF IS_SCREEN_FADED_OUT()
// DO_SCREEN_FADE_IN(500)
// ENDIF
ENDIF
ELSE
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
IF IS_ENTITY_ATTACHED_TO_ENTITY(PLAYER_PED_ID(), objHook)
INT iTolerance
iTolerance = 0
INT iLTSx, iLTSy, iRTSx, iRTSy
GET_CONTROL_VALUE_OF_ANALOGUE_STICKS(iLTSx, iLTSy, iRTSx, iRTSy)
VECTOR vGameplayCamRot = GET_GAMEPLAY_CAM_ROT()
//SET_THIRD_PERSON_CAM_RELATIVE_HEADING_LIMITS_THIS_UPDATE()
IF vGameplayCamRot.Z < -80.0
IF iRTSx > iTolerance
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_LR) //PRINTLN("DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_RIGHT)")
ENDIF
IF vGameplayCamRot.Z < -85.0
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ATTACK)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ATTACK2)
HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_RETICLE)
ENDIF
ELIF vGameplayCamRot.Z > 80.0
IF iRTSx < -iTolerance
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_LR) //PRINTLN("DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_LEFT)")
ENDIF
IF vGameplayCamRot.Z > 85.0
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ATTACK)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ATTACK2)
HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_RETICLE)
ENDIF
ENDIF
IF TIMERB() > 1000
IF NOT HAS_LABEL_BEEN_TRIGGERED("MichaelIntro")
IF GET_SCRIPT_TASK_STATUS(PLAYER_PED_ID(), SCRIPT_TASK_AIM_GUN_SCRIPTED) != WAITING_TO_START_TASK
AND GET_SCRIPT_TASK_STATUS(PLAYER_PED_ID(), SCRIPT_TASK_AIM_GUN_SCRIPTED) != PERFORMING_TASK
SETTIMERB(0)
ELSE
IF IS_SCREEN_FADED_OUT()
DO_SCREEN_FADE_IN(500)
ENDIF
SET_LABEL_AS_TRIGGERED("MichaelIntro", TRUE)
ENDIF
ENDIF
ENDIF
IF GET_AMMO_IN_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_COMBATPISTOL) <= 0
eMissionFail = failOutOfAmmo
missionFailed()
ENDIF
IF NOT IS_PED_INJURED(sEnemyBackup[0].pedIndex)
OR NOT IS_PED_INJURED(sEnemyBackup[1].pedIndex)
OR NOT IS_PED_INJURED(sEnemyBackup[2].pedIndex)
OR NOT IS_PED_INJURED(sEnemyBackup[3].pedIndex)
OR NOT IS_PED_INJURED(sEnemyBackup[4].pedIndex)
OR NOT IS_PED_INJURED(sEnemyBackup[7].pedIndex)
OR NOT IS_PED_INJURED(sEnemyBackup[8].pedIndex)
OR NOT IS_PED_INJURED(sEnemyBackup[9].pedIndex)
OR NOT IS_PED_INJURED(sEnemyBackup[10].pedIndex)
OR NOT IS_PED_INJURED(sEnemyBackup[11].pedIndex)
IF (NOT IS_MESSAGE_BEING_DISPLAYED() OR GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) = 0)
AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF GET_GAME_TIMER() > iDialogueTimer[0]
IF NOT HAS_LABEL_BEEN_TRIGGERED("MCH2_BKUP_1")
PLAY_SINGLE_LINE_FROM_CONVERSATION_ADV("MCH2_BKUP", "MCH2_BKUP_1")
iDialogueTimer[0] = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(4000, 7000)
ELIF NOT HAS_LABEL_BEEN_TRIGGERED("MCH2_BKUP_2")
PLAY_SINGLE_LINE_FROM_CONVERSATION_ADV("MCH2_BKUP", "MCH2_BKUP_2")
iDialogueTimer[0] = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(4000, 7000)
ELIF NOT HAS_LABEL_BEEN_TRIGGERED("MCH2_BKUP_3")
PLAY_SINGLE_LINE_FROM_CONVERSATION_ADV("MCH2_BKUP", "MCH2_BKUP_3")
iDialogueTimer[0] = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(1000, 3000)
ELIF NOT HAS_LABEL_BEEN_TRIGGERED("MCH2_BKUP_4")
PLAY_SINGLE_LINE_FROM_CONVERSATION_ADV("MCH2_BKUP", "MCH2_BKUP_4")
ENDIF
ENDIF
ENDIF
ENDIF
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_NEXT_WEAPON)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_PREV_WEAPON)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SELECT_WEAPON)
ENDIF
bOkToHangFromHook = FALSE
ELSE
//SET_PLAYER_FORCED_ZOOM(PLAYER_ID(), FALSE)
ENDIF
// IF NOT HAS_LABEL_BEEN_TRIGGERED("SwitchToFranklin")
// IF IS_PED_AIMING_FROM_COVER(PLAYER_PED(CHAR_FRANKLIN))
// SET_PED_CONFIG_FLAG(PLAYER_PED(CHAR_FRANKLIN), PCF_ForcedToStayInCover, TRUE)
// ENDIF
// ENDIF
IF HAS_LABEL_BEEN_TRIGGERED("FranklinGrapple")
IF NOT HAS_LABEL_BEEN_TRIGGERED("PrepMichaelAnim")
IF NOT IS_ENTITY_PLAYING_ANIM(PLAYER_PED(CHAR_MICHAEL), sAnimDictMic2Hook, "michael_meat_hook_fall")
SAFE_SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_LEAVE_CAMERA_CONTROL_ON)
DETACH_ENTITY(PLAYER_PED(CHAR_MICHAEL))
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED(CHAR_MICHAEL))
SET_ENABLE_BOUND_ANKLES(PLAYER_PED(CHAR_MICHAEL), FALSE)
bOkToMoveRail = FALSE
bOkToHangFromHook = FALSE
SET_PED_USING_ACTION_MODE(PLAYER_PED(CHAR_MICHAEL), TRUE)
TASK_PLAY_ANIM_ADVANCED(PLAYER_PED(CHAR_MICHAEL), sAnimDictMic2Hook, "michael_meat_hook_fall", <<994.205, -2150.821, 29.474>> + <<-0.09, 0.40, -0.00>>, <<0.0, 0.0, 0.0>>, INSTANT_BLEND_IN, SLOW_BLEND_OUT, -1, AF_FORCE_START | AF_NOT_INTERRUPTABLE | AF_EXTRACT_INITIAL_OFFSET | AF_OVERRIDE_PHYSICS | AF_IGNORE_GRAVITY, 0.0, EULER_YXZ, AIK_DISABLE_LEG_IK) //0.552)
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED(CHAR_MICHAEL))
SET_ENTITY_HEADING(PLAYER_PED(CHAR_MICHAEL), 350.8180)
ELSE
SET_ENTITY_ANIM_CURRENT_TIME(PLAYER_PED(CHAR_MICHAEL), sAnimDictMic2Hook, "michael_meat_hook_fall", 0.0)
SET_ENTITY_ANIM_SPEED(PLAYER_PED(CHAR_MICHAEL), sAnimDictMic2Hook, "michael_meat_hook_fall", 0.0)
FILL_PUSH_IN_DATA(pushInData, PLAYER_PED(CHAR_MICHAEL), CHAR_MICHAEL, 0.75, 800, 800, 500, 400, PUSH_IN_SPEED_UP_PROPORTION)
SET_LABEL_AS_TRIGGERED("PrepMichaelAnim", TRUE)
ENDIF
ELIF HAS_LABEL_BEEN_TRIGGERED("StartMichaelAnim")
IF IS_ENTITY_PLAYING_ANIM(PLAYER_PED(CHAR_MICHAEL), sAnimDictMic2Hook, "michael_meat_hook_fall")
SET_ENTITY_ANIM_SPEED(PLAYER_PED(CHAR_MICHAEL), sAnimDictMic2Hook, "michael_meat_hook_fall", 1.0)
ENDIF
bRadar = TRUE
// INT iTolerance
//
// iTolerance = 16
//
// INT iLTSx, iLTSy, iRTSx, iRTSy
//
// GET_CONTROL_VALUE_OF_ANALOGUE_STICKS(iLTSx, iLTSy, iRTSx, iRTSy)
//
// IF (iLTSx < -iTolerance OR iLTSx > iTolerance)
// OR (iLTSy < -iTolerance OR iLTSy > iTolerance)
// IF IS_ENTITY_PLAYING_ANIM(PLAYER_PED(CHAR_MICHAEL), sAnimDictMic2Hook, "michael_meat_hook_fall")
// AND GET_ENTITY_ANIM_CURRENT_TIME(PLAYER_PED(CHAR_MICHAEL), sAnimDictMic2Hook, "michael_meat_hook_fall") > 0.775
// CLEAR_PED_TASKS(PLAYER_PED(CHAR_MICHAEL))
//
// SET_ENTITY_HEADING(PLAYER_PED(CHAR_MICHAEL), 350.8180)
//
// FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED(CHAR_MICHAEL))
// ENDIF
// ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("MichaelFallShot")
IF (IS_ENTITY_PLAYING_ANIM(PLAYER_PED(CHAR_MICHAEL), sAnimDictMic2Hook, "michael_meat_hook_fall")
AND GET_ENTITY_ANIM_CURRENT_TIME(PLAYER_PED(CHAR_MICHAEL), sAnimDictMic2Hook, "michael_meat_hook_fall") > 0.258)
SET_PED_SHOOTS_AT_COORD(PLAYER_PED(CHAR_MICHAEL), GET_ENTITY_COORDS(PLAYER_PED(CHAR_MICHAEL)) + <<0.0, 0.0, 2.0>>)
INT iFramePass
FOR iFramePass = 0 TO 10
DISABLE_ON_FOOT_FIRST_PERSON_VIEW_THIS_UPDATE() PRINTLN("DISABLE_ON_FOOT_FIRST_PERSON_VIEW_THIS_UPDATE()")
WAIT_WITH_DEATH_CHECKS(0)
ENDFOR
START_PARTICLE_FX_NON_LOOPED_AT_COORD("scr_mich2_spark_impact", <<994.175659, -2150.427490, 32.231403>>, VECTOR_ZERO)
SET_LABEL_AS_TRIGGERED("MichaelFallShot", TRUE)
ENDIF
ENDIF
//Push In
IF GET_CAM_VIEW_MODE_FOR_CONTEXT(GET_CAM_ACTIVE_VIEW_MODE_CONTEXT()) = CAM_VIEW_MODE_FIRST_PERSON
IF NOT HAS_LABEL_BEEN_TRIGGERED("MichaelFallPushIn")
IF (IS_ENTITY_PLAYING_ANIM(PLAYER_PED(CHAR_MICHAEL), sAnimDictMic2Hook, "michael_meat_hook_fall")
AND GET_ENTITY_ANIM_CURRENT_TIME(PLAYER_PED(CHAR_MICHAEL), sAnimDictMic2Hook, "michael_meat_hook_fall") > 0.85)
PRINTLN("PUSH IN CAM ACTIVE!")
IF HANDLE_PUSH_IN(pushInData, DEFAULT, DEFAULT, DEFAULT, DEFAULT, FALSE)
SET_LABEL_AS_TRIGGERED("MichaelFallPushIn", TRUE) PRINTLN("SET_LABEL_AS_TRIGGERED(\"MichaelFallPushIn\", TRUE)")
ENDIF
ENDIF
ENDIF
ENDIF
IF (IS_ENTITY_PLAYING_ANIM(PLAYER_PED(CHAR_MICHAEL), sAnimDictMic2Hook, "michael_meat_hook_fall")
AND GET_ENTITY_ANIM_CURRENT_TIME(PLAYER_PED(CHAR_MICHAEL), sAnimDictMic2Hook, "michael_meat_hook_fall") > 0.99)
OR NOT IS_ENTITY_PLAYING_ANIM(PLAYER_PED(CHAR_MICHAEL), sAnimDictMic2Hook, "michael_meat_hook_fall")
OR HAS_LABEL_BEEN_TRIGGERED("MichaelFallPushIn")
SAFE_SET_PLAYER_CONTROL(PLAYER_ID(), TRUE, SPC_LEAVE_CAMERA_CONTROL_ON)
SAFE_FREEZE_ENTITY_POSITION(PLAYER_PED(CHAR_MICHAEL), FALSE)
IF GET_CAM_VIEW_MODE_FOR_CONTEXT(GET_CAM_ACTIVE_VIEW_MODE_CONTEXT()) = CAM_VIEW_MODE_FIRST_PERSON
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED(CHAR_MICHAEL))
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED(CHAR_MICHAEL))
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0)
ENDIF
// IF GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_ON_FOOT) = CAM_VIEW_MODE_FIRST_PERSON
// ANIMPOSTFX_PLAY("CamPushInMichael", 0, FALSE)
// ENDIF
// CLEAR_PED_TASKS(PLAYER_PED(CHAR_MICHAEL))
//
// SET_ENTITY_HEADING(PLAYER_PED(CHAR_MICHAEL), 350.8180)
//
// FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED(CHAR_MICHAEL))
ENDIF
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_NEXT_CAMERA)
ENDIF
ELSE
bOkToHangFromHook = TRUE
ENDIF
IF HAS_LABEL_BEEN_TRIGGERED("MCH2_ESCF1")
IF IS_GAMEPLAY_CAM_RENDERING()
AND NOT IS_INTERPOLATING_FROM_SCRIPT_CAMS()
IF GET_SCRIPT_TASK_STATUS(PLAYER_PED_ID(), SCRIPT_TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD) = PERFORMING_TASK
INT iTolerance
iTolerance = 16
INT iLTSx, iLTSy, iRTSx, iRTSy
GET_CONTROL_VALUE_OF_ANALOGUE_STICKS(iLTSx, iLTSy, iRTSx, iRTSy)
IF (iLTSx < -iTolerance OR iLTSx > iTolerance)
OR (iLTSy < -iTolerance OR iLTSy > iTolerance)
CLEAR_PED_TASKS(PLAYER_PED_ID())
ENDIF
ENDIF
ELIF IS_INTERPOLATING_FROM_SCRIPT_CAMS()
IF GET_SCRIPT_TASK_STATUS(PLAYER_PED_ID(), SCRIPT_TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD) = PERFORMING_TASK
SET_GAMEPLAY_CAM_RELATIVE_HEADING(-6.0 - (GET_ENTITY_HEADING(PLAYER_PED_ID()) - 90.0))
SET_GAMEPLAY_CAM_RELATIVE_PITCH(-10)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_LR)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_UD)
ENDIF
ENDIF
ENDIF
IF IS_INTERPOLATING_FROM_SCRIPT_CAMS()
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_LR)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_UD)
ENDIF
//Open Combat
IF NOT HAS_LABEL_BEEN_TRIGGERED("OpenCombat9")
INT iEnemiesRemain = 5
IF IS_PED_INJURED(sEnemyBackup[0].pedIndex)
iEnemiesRemain--
ENDIF
IF IS_PED_INJURED(sEnemyBackup[1].pedIndex)
iEnemiesRemain--
ENDIF
IF IS_PED_INJURED(sEnemyBackup[2].pedIndex)
iEnemiesRemain--
ENDIF
IF IS_PED_INJURED(sEnemyBackup[3].pedIndex)
iEnemiesRemain--
ENDIF
IF IS_PED_INJURED(sEnemyBackup[4].pedIndex)
iEnemiesRemain--
ENDIF
IF iEnemiesRemain <= 1
VECTOR vPlayerCoord = GET_ENTITY_COORDS(PLAYER_PED_ID())
createEnemy(sEnemyBackup[7], <<982.8243, -2144.1726, 28.4757>>, 314.9142, WEAPONTYPE_PISTOL)
createEnemy(sEnemyBackup[8], <<986.0364, -2144.4543, 28.4759>>, 318.1739, WEAPONTYPE_PISTOL)
OPEN_SEQUENCE_TASK(seqMain)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, <<988.5842, -2143.4475, 28.4759>>, <<vPlayerCoord.X, vPlayerCoord.Y, 28.4759>>, PEDMOVE_RUN, TRUE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
CLOSE_SEQUENCE_TASK(seqMain)
TASK_PERFORM_SEQUENCE(sEnemyBackup[7].pedIndex, seqMain)
CLEAR_SEQUENCE_TASK(seqMain)
OPEN_SEQUENCE_TASK(seqMain)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NULL, <<988.7651, -2139.6868, 28.4759>>, <<vPlayerCoord.X, vPlayerCoord.Y, 28.4759>>, PEDMOVE_RUN, TRUE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
CLOSE_SEQUENCE_TASK(seqMain)
TASK_PERFORM_SEQUENCE(sEnemyBackup[8].pedIndex, seqMain)
CLEAR_SEQUENCE_TASK(seqMain)
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(sEnemyBackup[7].pedIndex, TRUE)
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(sEnemyBackup[8].pedIndex, TRUE)
SET_PED_ANGLED_DEFENSIVE_AREA(sEnemyBackup[7].pedIndex, <<994.424316, -2143.735352, 27.976158>>, <<984.857361, -2131.580078, 32.475563>>, 10.0)
SET_PED_COMBAT_MOVEMENT(sEnemyBackup[7].pedIndex, CM_WILLADVANCE)
SET_PED_ANGLED_DEFENSIVE_AREA(sEnemyBackup[8].pedIndex, <<994.424316, -2143.735352, 27.976158>>, <<984.857361, -2131.580078, 32.475563>>, 10.0)
SET_PED_COMBAT_MOVEMENT(sEnemyBackup[8].pedIndex, CM_WILLADVANCE)
iDamageTimer = GET_GAME_TIMER() + 15000
iAdvanceTimer = GET_GAME_TIMER() + 15000
SET_LABEL_AS_TRIGGERED("OpenCombat9", TRUE)
ENDIF
ELSE
IF GET_GAME_TIMER() > iDamageTimer
IF NOT IS_PED_INJURED(sEnemyBackup[7].pedIndex)
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(sEnemyBackup[7].pedIndex, FALSE)
ENDIF
IF NOT IS_PED_INJURED(sEnemyBackup[8].pedIndex)
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(sEnemyBackup[8].pedIndex, FALSE)
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("MCH2_FLANK_RESPONSE")
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
AND (NOT IS_MESSAGE_BEING_DISPLAYED() OR GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) = 0)
IF NOT IS_PED_INJURED(sEnemyBackup[7].pedIndex)
OR NOT IS_PED_INJURED(sEnemyBackup[8].pedIndex)
IF NOT HAS_LABEL_BEEN_TRIGGERED("MCH2_FLANK")
CREATE_CONVERSATION_ADV("MCH2_FLANK")
ELIF NOT HAS_LABEL_BEEN_TRIGGERED("MCH2_MOREF")
CREATE_CONVERSATION_ADV("MCH2_MOREF", CONV_PRIORITY_MEDIUM, FALSE)
SET_LABEL_AS_TRIGGERED("MCH2_FLANK_RESPONSE", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
//Open Combat
IF NOT HAS_LABEL_BEEN_TRIGGERED("OpenCombat10")
INT iEnemiesRemain = 5
IF IS_PED_INJURED(sEnemyBackup[0].pedIndex)
iEnemiesRemain--
ENDIF
IF IS_PED_INJURED(sEnemyBackup[1].pedIndex)
iEnemiesRemain--
ENDIF
IF IS_PED_INJURED(sEnemyBackup[2].pedIndex)
iEnemiesRemain--
ENDIF
IF IS_PED_INJURED(sEnemyBackup[3].pedIndex)
iEnemiesRemain--
ENDIF
IF IS_PED_INJURED(sEnemyBackup[4].pedIndex)
iEnemiesRemain--
ENDIF
IF (iEnemiesRemain <= 1
AND (IS_PED_INJURED(sEnemyBackup[7].pedIndex)
OR IS_PED_INJURED(sEnemyBackup[8].pedIndex)))
OR (HAS_LABEL_BEEN_TRIGGERED("OpenCombat9")
AND GET_GAME_TIMER() > iAdvanceTimer)
createEnemy(sEnemyBackup[9], <<993.0953, -2105.2952, 29.4752>>, 204.5829, WEAPONTYPE_PISTOL)
createEnemy(sEnemyBackup[10], <<993.6476, -2106.8474, 29.4752>>, 261.5278, WEAPONTYPE_SMG)
createEnemy(sEnemyBackup[11], <<994.7681, -2106.3376, 29.4753>>, 186.8079, WEAPONTYPE_SMG)
SET_PED_ANGLED_DEFENSIVE_AREA(sEnemyBackup[9].pedIndex, <<994.966064, -2130.581299, 28.225883>>, <<993.716187, -2143.722168, 32.476128>>, 10.0)
SET_PED_COMBAT_MOVEMENT(sEnemyBackup[9].pedIndex, CM_WILLADVANCE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sEnemyBackup[9].pedIndex, 500.0)
SET_PED_ANGLED_DEFENSIVE_AREA(sEnemyBackup[10].pedIndex, <<994.966064, -2130.581299, 28.225883>>, <<993.716187, -2143.722168, 32.476128>>, 10.0)
SET_PED_COMBAT_MOVEMENT(sEnemyBackup[10].pedIndex, CM_WILLADVANCE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sEnemyBackup[10].pedIndex, 500.0)
SET_ENTITY_HEALTH(sEnemyBackup[11].pedIndex, 105)
SET_PED_COMBAT_MOVEMENT(sEnemyBackup[11].pedIndex, CM_STATIONARY)
SET_PED_SPHERE_DEFENSIVE_AREA(sEnemyBackup[11].pedIndex, <<999.9770, -2137.3657, 29.2547>>, 1.5, TRUE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sEnemyBackup[11].pedIndex, TRUE)
TASK_GO_STRAIGHT_TO_COORD(sEnemyBackup[11].pedIndex, <<1002.3436, -2114.6580, 29.4758>>, PEDMOVE_RUN)
SET_PED_CAN_BE_TARGETTED(sEnemyBackup[11].pedIndex, FALSE)
SET_LABEL_AS_TRIGGERED("OpenCombat10", TRUE)
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(sEnemyBackup[11].pedIndex)
AND NOT IS_PED_INJURED(sEnemyBackup[11].pedIndex)
IF NOT HAS_LABEL_BEEN_TRIGGERED("OpenCombat10a")
IF IS_ENTITY_AT_COORD(sEnemyBackup[11].pedIndex, <<1002.3436, -2114.6580, 29.4758>>, <<2.0, 2.0, 2.0>>)
SET_PED_POSITION(sEnemyBackup[11].pedIndex, <<1000.0, -2132.2, 29.4763>>, 173.1776)
OPEN_SEQUENCE_TASK(seqMain)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(NULL, <<999.9770, -2137.3657, 29.2547>>, PLAYER_PED_ID(), PEDMOVE_WALK, TRUE, 0.1, 1, FALSE)
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(NULL, <<994.3035, -2136.5476, 29.2231>>, PLAYER_PED_ID(), PEDMOVE_RUN, TRUE, 0.1, 1, FALSE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
CLOSE_SEQUENCE_TASK(seqMain)
TASK_PERFORM_SEQUENCE(sEnemyBackup[11].pedIndex, seqMain)
CLEAR_SEQUENCE_TASK(seqMain)
REMOVE_PED_DEFENSIVE_AREA(sEnemyBackup[11].pedIndex)
SET_PED_COMBAT_ATTRIBUTES(sEnemyBackup[11].pedIndex, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
SET_PED_COMBAT_MOVEMENT(sEnemyBackup[11].pedIndex, CM_WILLADVANCE)
SET_PED_CAN_BE_TARGETTED(sEnemyBackup[11].pedIndex, TRUE)
SET_LABEL_AS_TRIGGERED("OpenCombat10a", TRUE)
ENDIF
ELSE
IF NOT HAS_LABEL_BEEN_TRIGGERED("MCH2_MACHINE_RESPONSE")
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
AND (NOT IS_MESSAGE_BEING_DISPLAYED() OR GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) = 0)
IF NOT IS_PED_INJURED(sEnemyBackup[7].pedIndex)
OR NOT IS_PED_INJURED(sEnemyBackup[8].pedIndex)
IF NOT HAS_LABEL_BEEN_TRIGGERED("MCH2_MACHINE")
CREATE_CONVERSATION_ADV("MCH2_MACHINE")
ELIF NOT HAS_LABEL_BEEN_TRIGGERED("MCH2_MOREG")
CREATE_CONVERSATION_ADV("MCH2_MOREG", CONV_PRIORITY_MEDIUM, FALSE)
SET_LABEL_AS_TRIGGERED("MCH2_MACHINE_RESPONSE", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF IS_PED_INJURED(sEnemyBackup[0].pedIndex)
AND IS_PED_INJURED(sEnemyBackup[1].pedIndex)
AND IS_PED_INJURED(sEnemyBackup[2].pedIndex)
AND IS_PED_INJURED(sEnemyBackup[3].pedIndex)
AND IS_PED_INJURED(sEnemyBackup[4].pedIndex)
AND IS_PED_INJURED(sEnemyBackup[7].pedIndex)
AND IS_PED_INJURED(sEnemyBackup[8].pedIndex)
AND IS_PED_INJURED(sEnemyBackup[9].pedIndex)
AND IS_PED_INJURED(sEnemyBackup[10].pedIndex)
AND IS_PED_INJURED(sEnemyBackup[11].pedIndex)
IF GET_SCRIPT_TASK_STATUS(PLAYER_PED_ID(), SCRIPT_TASK_COMBAT_HATED_TARGETS_AROUND_PED) = PERFORMING_TASK
CLEAR_PED_TASKS(PLAYER_PED_ID())
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("SwitchToFranklin")
SET_SELECTOR_PED_HINT(sSelectorPeds, SELECTOR_PED_FRANKLIN)
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("MCH2_ESCF1")
IF IS_PED_IN_COMBAT(PLAYER_PED(CHAR_FRANKLIN))
CLEAR_PED_TASKS(PLAYER_PED(CHAR_FRANKLIN))
TASK_PUT_PED_DIRECTLY_INTO_COVER(PLAYER_PED(CHAR_FRANKLIN), <<996.3146, -2142.4307, 28.4762>>, -1, FALSE, 1.0, TRUE, TRUE, covPoint[13], TRUE)
PRINTLN("Franklin was in combat, so we clear his tasks to put him into cover!")
ENDIF
IF NOT IS_ENTITY_AT_COORD(PLAYER_PED(CHAR_FRANKLIN), <<996.3133, -2142.4089, 28.4762>>, <<2.0, 2.0, 2.0>>)
IF GET_SCRIPT_TASK_STATUS(PLAYER_PED(CHAR_FRANKLIN), SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
OPEN_SEQUENCE_TASK(seqMain)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
TASK_GO_TO_COORD_AND_AIM_AT_HATED_ENTITIES_NEAR_COORD(NULL, <<996.2867, -2143.0442, 28.4763>>, <<994.3478, -2136.1184, 29.2463>>, PEDMOVE_RUN, TRUE)
TASK_PUT_PED_DIRECTLY_INTO_COVER(NULL, <<996.3146, -2142.4307, 28.4762>>, -1, FALSE, 1.0, TRUE, TRUE, covPoint[13], TRUE)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
CLOSE_SEQUENCE_TASK(seqMain)
TASK_PERFORM_SEQUENCE(PLAYER_PED(CHAR_FRANKLIN), seqMain)
CLEAR_SEQUENCE_TASK(seqMain)
PRINTLN("Franklin wasn't in the right spot, so he gets a sequence to enter cover in the right place!")
ENDIF
ENDIF
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
AND (NOT IS_MESSAGE_BEING_DISPLAYED() OR GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) = 0)
IF NOT HAS_LABEL_BEEN_TRIGGERED("MCH2_AHEAD_1")
PLAY_SINGLE_LINE_FROM_CONVERSATION_ADV("MCH2_AHEAD", "MCH2_AHEAD_1") PRINTLN("All the enemies are dead, so we can switch to Franklin!")
ELIF NOT HAS_LABEL_BEEN_TRIGGERED("MCH2_AHEAD_2")
PLAY_SINGLE_LINE_FROM_CONVERSATION_ADV("MCH2_AHEAD", "MCH2_AHEAD_2")
// ELIF NOT HAS_LABEL_BEEN_TRIGGERED("SwitchToFranklin")
// AND GET_PLAYER_PED_ENUM(PLAYER_PED_ID()) = CHAR_MICHAEL
// PRINT_ADV("MCH2_FSWITCH")
ENDIF
ENDIF
// ELIF NOT HAS_LABEL_BEEN_TRIGGERED("OneFrameDisableFirstPersonCam")
// DISABLE_ON_FOOT_FIRST_PERSON_VIEW_THIS_UPDATE() PRINTLN("DISABLE_ON_FOOT_FIRST_PERSON_VIEW_THIS_UPDATE()")
//
// SET_LABEL_AS_TRIGGERED("OneFrameDisableFirstPersonCam", TRUE)
ENDIF
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
AND (NOT IS_MESSAGE_BEING_DISPLAYED() OR GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) = 0)
IF HAS_LABEL_BEEN_TRIGGERED("MCH2_ESCF1")
AND NOT HAS_LABEL_BEEN_TRIGGERED("MCH2_ESCF2")
IF IS_ENTITY_AT_COORD(PLAYER_PED(CHAR_FRANKLIN), <<993.211975, -2149.697754, 31.476280>>, <<8.0, 8.0, 3.0>>)
CREATE_CONVERSATION_ADV("MCH2_CLEAR")
ENDIF
ENDIF
ENDIF
ENDIF
IF HAS_LABEL_BEEN_TRIGGERED("MCH2_AHEAD_1")
REQUEST_SCRIPT_AUDIO_BANK("Michael_2_Break_Free")
IF NOT sCamDetails.bRun
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
OR (IS_PED_INJURED(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex)
OR iSetPiece[SET_PIECE_GRAPPLE] > 4)
IF NOT IS_ENTITY_PLAYING_ANIM(PLAYER_PED(CHAR_FRANKLIN), sAnimDictMic2IG11, "mic_2_ig_11_intro_p_one")
AND NOT IS_ENTITY_PLAYING_ANIM(PLAYER_PED(CHAR_FRANKLIN), sAnimDictMic2IG11, "mic_2_ig_11_winning_p_one")
AND NOT IS_ENTITY_PLAYING_ANIM(PLAYER_PED(CHAR_FRANKLIN), sAnimDictMic2IG11, "mic_2_ig_11_losing_p_one")
AND NOT IS_ENTITY_PLAYING_ANIM(PLAYER_PED(CHAR_FRANKLIN), sAnimDictMic2IG11, "mic_2_ig_11_a_p_one")
AND NOT IS_ENTITY_PLAYING_ANIM(PLAYER_PED(CHAR_FRANKLIN), sAnimDictMic2IG11, "mic_2_ig_11_b_p_one")
AND NOT IS_ENTITY_PLAYING_ANIM(PLAYER_PED(CHAR_MICHAEL), sAnimDictMic2Hook, "michael_meat_hook_fall")
AND NOT IS_SYNCHRONIZED_SCENE_RUNNING(sceneGrapple)
IF (NOT HAS_LABEL_BEEN_TRIGGERED("SwitchToFranklin") //UPDATE_SELECTOR_HUD(sSelectorPeds)
AND IS_PED_IN_COVER(PLAYER_PED(CHAR_FRANKLIN)))
IF NOT HAS_SELECTOR_PED_BEEN_SELECTED(sSelectorPeds, SELECTOR_PED_MULTIPLAYER)
CLEAR_PRINTS()
MAKE_SELECTOR_PED_SELECTION(sSelectorPeds, SELECTOR_PED_FRANKLIN)
//Stats
INFORM_MISSION_STATS_OF_INCREMENT(MIC2_TIMES_SWITCHED)
// IF NOT HAS_LABEL_BEEN_TRIGGERED("SwitchToFranklin")
// MAKE_SELECTOR_PED_SELECTION(sSelectorPeds, SELECTOR_PED_FRANKLIN)
// ELSE
// //Stats
// INFORM_MISSION_STATS_OF_INCREMENT(MIC2_TIMES_SWITCHED)
// ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("MCH2_ESCF1")
GET_CURRENT_PED_WEAPON(PLAYER_PED(CHAR_FRANKLIN), wtLastWeapon)
ENDIF
sCamDetails.pedTo = sSelectorPeds.pedID[sSelectorPeds.eNewSelectorPed]
sCamDetails.bRun = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_NEXT_CAMERA)
IF NOT (IS_PLAYER_SWITCH_IN_PROGRESS() AND GET_PLAYER_SHORT_SWITCH_STATE() >= SHORT_SWITCH_STATE_OUTRO)
DISABLE_ON_FOOT_FIRST_PERSON_VIEW_THIS_UPDATE() PRINTLN("DISABLE_ON_FOOT_FIRST_PERSON_VIEW_THIS_UPDATE()")
ENDIF
IF RUN_SWITCH_CAM_FROM_PLAYER_TO_PED_SHORT_RANGE(sCamDetails) //RUN_CAM_SPLINE_FROM_PLAYER_TO_PED_RACE(sCamDetails) //Returns FALSE when the camera spline is complete
IF sCamDetails.bOKToSwitchPed
IF NOT sCamDetails.bPedSwitched
TAKE_CONTROL_OF_PED_FLAGS eTakeControlFlags = TCF_NONE
IF NOT HAS_LABEL_BEEN_TRIGGERED("SwitchToFranklin")
eTakeControlFlags = TCF_CLEAR_TASK_INTERRUPT_CHECKS
SET_LABEL_AS_TRIGGERED("SwitchToFranklin", TRUE)
ENDIF
IF TAKE_CONTROL_OF_SELECTOR_PED(sSelectorPeds, TRUE, TRUE, eTakeControlFlags)
//Dialogue
REMOVE_PED_FOR_DIALOGUE(sPedsForConversation, 0)
REMOVE_PED_FOR_DIALOGUE(sPedsForConversation, 1)
ADD_PED_FOR_DIALOGUE(sPedsForConversation, 0, PLAYER_PED(CHAR_MICHAEL), "MICHAEL")
ADD_PED_FOR_DIALOGUE(sPedsForConversation, 1, PLAYER_PED(CHAR_FRANKLIN), "FRANKLIN")
//Update the relationship groups
IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[CHAR_MICHAEL])
SET_PED_RELATIONSHIP_GROUP_HASH(sSelectorPeds.pedID[CHAR_MICHAEL], relGroupBuddy)
ENDIF
IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[CHAR_FRANKLIN])
SET_PED_RELATIONSHIP_GROUP_HASH(sSelectorPeds.pedID[CHAR_FRANKLIN], relGroupBuddy)
ENDIF
SET_PED_DEFENSIVE_AREA_ATTACHED_TO_PED(PLAYER_PED(CHAR_FRANKLIN), PLAYER_PED(CHAR_MICHAEL), <<5.0, 0.0, 5.0>>, <<-5.0, 0.0, -5.0>>, 5.0, TRUE)
SET_PED_DEFENSIVE_AREA_ATTACHED_TO_PED(PLAYER_PED(CHAR_MICHAEL), PLAYER_PED(CHAR_FRANKLIN), <<5.0, 0.0, 5.0>>, <<-5.0, 0.0, -5.0>>, 5.0, TRUE)
SET_RAGDOLL_BLOCKING_FLAGS(PLAYER_PED(CHAR_MICHAEL), RBF_BULLET_IMPACT | RBF_PLAYER_BUMP | RBF_PLAYER_RAGDOLL_BUMP)
SET_RAGDOLL_BLOCKING_FLAGS(PLAYER_PED(CHAR_FRANKLIN), RBF_BULLET_IMPACT)
SAFE_REMOVE_BLIP(blipMichael)
SAFE_REMOVE_BLIP(blipFranklin)
IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
SAFE_ADD_BLIP_PED(blipMichael, sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], FALSE)
SET_PED_COMBAT_ATTRIBUTES(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], CA_DISABLE_PIN_DOWN_OTHERS, TRUE)
IF IS_ENTITY_ATTACHED(PLAYER_PED(CHAR_MICHAEL))
TASK_PLAY_ANIM(PLAYER_PED(CHAR_MICHAEL), sAnimDictMic2Hook, "michael_meat_hook_react_c", INSTANT_BLEND_IN, REALLY_SLOW_BLEND_OUT, -1, AF_HOLD_LAST_FRAME | AF_NOT_INTERRUPTABLE) //TASK_PLAY_ANIM(PLAYER_PED(CHAR_MICHAEL), sAnimDictHang, "idle", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1, AF_LOOPING)
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED(CHAR_MICHAEL))
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
SAFE_ADD_BLIP_PED(blipFranklin, sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], FALSE)
SET_PED_COMBAT_ATTRIBUTES(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], CA_DISABLE_PIN_DOWN_OTHERS, TRUE)
ENDIF
SET_PED_CONFIG_FLAG(PLAYER_PED(CHAR_FRANKLIN), PCF_ForcedToStayInCover, FALSE)
SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), TRUE)
SET_PED_USING_ACTION_MODE(NOT_PLAYER_PED_ID(), TRUE, -1, "DEFAULT_ACTION")
IF GET_ENTITY_HEALTH(PLAYER_PED(CHAR_MICHAEL)) < GET_PED_MAX_HEALTH(PLAYER_PED(CHAR_MICHAEL)) / 2
SET_ENTITY_HEALTH(PLAYER_PED(CHAR_MICHAEL), GET_PED_MAX_HEALTH(PLAYER_PED(CHAR_MICHAEL)) / 2)
ENDIF
IF GET_ENTITY_HEALTH(PLAYER_PED(CHAR_FRANKLIN)) < GET_PED_MAX_HEALTH(PLAYER_PED(CHAR_FRANKLIN)) / 2
SET_ENTITY_HEALTH(PLAYER_PED(CHAR_FRANKLIN), GET_PED_MAX_HEALTH(PLAYER_PED(CHAR_FRANKLIN)) / 2)
ENDIF
IF iCutsceneStage > 0
iCutsceneStage-- PRINTLN("iCutsceneStage = ", iCutsceneStage) //Should re-assign the tasks
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("MCH2_ESCF1")
//First switch task for Michael
ATTACH_ENTITY_TO_ENTITY(PLAYER_PED(CHAR_MICHAEL), objHook, 0, <<0.0, -0.1, -1.68>> , <<0.0, 0.0, 0.0>>, TRUE, TRUE)
IF wtLastWeapon != WEAPONTYPE_UNARMED
IF NOT HAS_PED_GOT_WEAPON(PLAYER_PED(CHAR_FRANKLIN), wtLastWeapon)
GIVE_WEAPON_TO_PED(PLAYER_PED(CHAR_FRANKLIN), wtLastWeapon, 350, TRUE)
ENDIF
SET_CURRENT_PED_WEAPON(PLAYER_PED(CHAR_FRANKLIN), wtLastWeapon, TRUE)
ELSE
IF NOT HAS_PED_GOT_WEAPON(PLAYER_PED(CHAR_FRANKLIN), WEAPONTYPE_ASSAULTRIFLE)
GIVE_WEAPON_TO_PED(PLAYER_PED(CHAR_FRANKLIN), WEAPONTYPE_ASSAULTRIFLE, 350, TRUE)
ENDIF
SET_CURRENT_PED_WEAPON(PLAYER_PED(CHAR_FRANKLIN), WEAPONTYPE_ASSAULTRIFLE, TRUE)
ENDIF
//Audio
PLAY_AUDIO(MIC2_BACK_TO_FRANK)
LOAD_AUDIO(MIC3_FRANK_DOWN)
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
AND (NOT IS_MESSAGE_BEING_DISPLAYED() OR GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) = 0)
CREATE_CONVERSATION_ADV("MCH2_ESCF1")
ELSE
SET_LABEL_AS_TRIGGERED("MCH2_ESCF1", TRUE)
ENDIF
CREATE_PICKUP(PICKUP_WEAPON_SAWNOFFSHOTGUN, <<995.77649, -2126.69238, 29.47581>>)
SAFE_SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
ENDIF
sCamDetails.bPedSwitched = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT DOES_CAM_EXIST(sCamDetails.camID)
OR (DOES_CAM_EXIST(sCamDetails.camID)
AND NOT IS_CAM_ACTIVE(sCamDetails.camID))
// IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(NOT_PLAYER_PED_ID()), GET_ENTITY_COORDS(PLAYER_PED_ID())) > 25.0
// AND NOT IS_ENTITY_ON_SCREEN(NOT_PLAYER_PED_ID())
// IF iHealthStore = -1
// iHealthStore = GET_ENTITY_HEALTH(NOT_PLAYER_PED_ID())
// SET_ENTITY_HEALTH(NOT_PLAYER_PED_ID(), 101)
// ENDIF
// ELIF iHealthStore > -1
// SET_ENTITY_HEALTH(NOT_PLAYER_PED_ID(), iHealthStore)
// iHealthStore = -1
// ENDIF
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(NOT_PLAYER_PED_ID()), GET_ENTITY_COORDS(PLAYER_PED_ID())) > 60.0
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
eMissionFail = failFranklinAbandon
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN
eMissionFail = failMichaelAbandon
ENDIF
missionFailed()
ENDIF
ENDIF
IF HAS_LABEL_BEEN_TRIGGERED("MCH2_ESCF1")
AND NOT HAS_LABEL_BEEN_TRIGGERED("MCH2_ESCM")
AND NOT HAS_LABEL_BEEN_TRIGGERED("MCH2_ESCF2")
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
AND (NOT IS_MESSAGE_BEING_DISPLAYED() OR GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) = 0)
CREATE_CONVERSATION_ADV("MCH2_ESCM")
ENDIF
ENDIF
IF HAS_LABEL_BEEN_TRIGGERED("MCH2_ESCF1")
AND NOT HAS_LABEL_BEEN_TRIGGERED("MCH2_ESCF2")
IF IS_ENTITY_AT_COORD(PLAYER_PED(CHAR_FRANKLIN), <<996.047791, -2125.919189, 31.225800>>, <<5.0, 4.0, 3.0>>)
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
AND (NOT IS_MESSAGE_BEING_DISPLAYED() OR GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) = 0)
CREATE_CONVERSATION_ADV("MCH2_ESCF2")
ENDIF
ENDIF
ENDIF
IF (IS_PED_INJURED(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex)
AND iSetPiece[SET_PIECE_GRAPPLE] > 5)
IF NOT IS_ENTITY_PLAYING_ANIM(PLAYER_PED(CHAR_FRANKLIN), sAnimDictMic2IG11, "mic_2_ig_11_intro_p_one")
AND NOT IS_ENTITY_PLAYING_ANIM(PLAYER_PED(CHAR_FRANKLIN), sAnimDictMic2IG11, "mic_2_ig_11_winning_p_one")
AND NOT IS_ENTITY_PLAYING_ANIM(PLAYER_PED(CHAR_FRANKLIN), sAnimDictMic2IG11, "mic_2_ig_11_losing_p_one")
AND NOT IS_ENTITY_PLAYING_ANIM(PLAYER_PED(CHAR_FRANKLIN), sAnimDictMic2IG11, "mic_2_ig_11_a_p_one")
AND NOT IS_ENTITY_PLAYING_ANIM(PLAYER_PED(CHAR_FRANKLIN), sAnimDictMic2IG11, "mic_2_ig_11_b_p_one")
AND NOT IS_ENTITY_PLAYING_ANIM(PLAYER_PED(CHAR_MICHAEL), sAnimDictMic2Hook, "michael_meat_hook_fall")
AND NOT IS_SYNCHRONIZED_SCENE_RUNNING(sceneGrapple)
ADVANCE_STAGE()
ENDIF
ENDIF
//Grapple
SWITCH iSetPiece[SET_PIECE_GRAPPLE]
CASE 0
IF NOT IS_PED_INJURED(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex)
//IF GET_ENTITY_HEALTH(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex) < 400
//OR IS_EXPLOSION_IN_SPHERE(EXP_TAG_DONTCARE, GET_ENTITY_COORDS(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex), 5.0)
//OR IS_ENTITY_AT_COORD(PLAYER_PED(CHAR_FRANKLIN), <<997.968079, -2106.348145, 31.975391>>, <<8.0, 5.0, 2.5>>)
IF NOT HAS_LABEL_BEEN_TRIGGERED("AbandonGrapple")
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED(CHAR_FRANKLIN), <<984.412720, -2102.345703, 29.301226>>, <<981.532898, -2130.348389, 35.475380>>, 15.0)
PRINT_ADV("CMN_MLEAVE", DEFAULT_GOD_TEXT_TIME, FALSE)
IF NOT IS_PED_INJURED(sEnemyBackup[5].pedIndex)
CLEAR_PED_TASKS(sEnemyBackup[5].pedIndex)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sEnemyBackup[5].pedIndex, TRUE)
SET_PED_ACCURACY(sEnemyBackup[5].pedIndex, 80)
SET_PED_COMBAT_ATTRIBUTES(sEnemyBackup[5].pedIndex, CA_OPEN_COMBAT_WHEN_DEFENSIVE_AREA_IS_REACHED, FALSE)
SET_PED_COMBAT_MOVEMENT(sEnemyBackup[5].pedIndex, CM_DEFENSIVE)
SET_PED_DEFENSIVE_SPHERE_ATTACHED_TO_PED(sEnemyBackup[5].pedIndex, PLAYER_PED(CHAR_MICHAEL), VECTOR_ZERO, 10.0)
TASK_COMBAT_PED(sEnemyBackup[5].pedIndex, PLAYER_PED(CHAR_MICHAEL))
ENDIF
IF NOT IS_PED_INJURED(sEnemyBackup[6].pedIndex)
CLEAR_PED_TASKS(sEnemyBackup[6].pedIndex)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sEnemyBackup[6].pedIndex, TRUE)
SET_PED_ACCURACY(sEnemyBackup[6].pedIndex, 80)
SET_PED_COMBAT_ATTRIBUTES(sEnemyBackup[6].pedIndex, CA_OPEN_COMBAT_WHEN_DEFENSIVE_AREA_IS_REACHED, FALSE)
SET_PED_COMBAT_MOVEMENT(sEnemyBackup[6].pedIndex, CM_DEFENSIVE)
SET_PED_DEFENSIVE_SPHERE_ATTACHED_TO_PED(sEnemyBackup[6].pedIndex, PLAYER_PED(CHAR_MICHAEL), VECTOR_ZERO, 10.0)
TASK_COMBAT_PED(sEnemyBackup[6].pedIndex, PLAYER_PED(CHAR_MICHAEL))
ENDIF
SET_LABEL_AS_TRIGGERED("AbandonGrapple", TRUE)
ENDIF
ELSE
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED(CHAR_FRANKLIN), <<984.412720, -2102.345703, 29.301226>>, <<981.532898, -2130.348389, 35.475380>>, 15.0)
IF NOT IS_PED_INJURED(sEnemyBackup[5].pedIndex)
IF IS_ENTITY_AT_COORD(sEnemyBackup[5].pedIndex, <<995.896423, -2148.686768, 31.476355>>, <<10.0, 10.0, 3.0>>)
APPLY_DAMAGE_TO_PED(PLAYER_PED(CHAR_MICHAEL), 1000, TRUE)
SET_PED_TO_RAGDOLL(PLAYER_PED(CHAR_MICHAEL), 10000, 10000, TASK_RELAX, FALSE, FALSE)
//Pin the ankle to the bottom of the hook
VECTOR vRightFootAttach
vRightFootAttach = <<-0.075, -0.1, -0.85>>
ATTACH_ENTITY_TO_ENTITY_PHYSICALLY(PLAYER_PED(CHAR_MICHAEL), objHook, GET_PED_BONE_INDEX(PLAYER_PED(CHAR_MICHAEL), BONETAG_R_FOOT), -1, vRightFootAttach, VECTOR_ZERO, VECTOR_ZERO, -1.0, TRUE, FALSE, FALSE, FALSE)
ATTACH_ENTITY_TO_ENTITY_PHYSICALLY(PLAYER_PED(CHAR_MICHAEL), objHook, GET_PED_BONE_INDEX(PLAYER_PED(CHAR_MICHAEL), BONETAG_L_FOOT), -1, <<-vRightFootAttach.X, vRightFootAttach.Y, vRightFootAttach.Z>>, VECTOR_ZERO, VECTOR_ZERO, -1.0, TRUE, FALSE, FALSE, FALSE)
ENDIF
ENDIF
IF NOT IS_PED_INJURED(sEnemyBackup[6].pedIndex)
IF IS_ENTITY_AT_COORD(sEnemyBackup[6].pedIndex, <<995.896423, -2148.686768, 31.476355>>, <<10.0, 10.0, 3.0>>)
APPLY_DAMAGE_TO_PED(PLAYER_PED(CHAR_MICHAEL), 1000, TRUE)
SET_PED_TO_RAGDOLL(PLAYER_PED(CHAR_MICHAEL), 10000, 10000, TASK_RELAX, FALSE, FALSE)
//Pin the ankle to the bottom of the hook
VECTOR vRightFootAttach
vRightFootAttach = <<-0.075, -0.1, -0.85>>
ATTACH_ENTITY_TO_ENTITY_PHYSICALLY(PLAYER_PED(CHAR_MICHAEL), objHook, GET_PED_BONE_INDEX(PLAYER_PED(CHAR_MICHAEL), BONETAG_R_FOOT), -1, vRightFootAttach, VECTOR_ZERO, VECTOR_ZERO, -1.0, TRUE, FALSE, FALSE, FALSE)
ATTACH_ENTITY_TO_ENTITY_PHYSICALLY(PLAYER_PED(CHAR_MICHAEL), objHook, GET_PED_BONE_INDEX(PLAYER_PED(CHAR_MICHAEL), BONETAG_L_FOOT), -1, <<-vRightFootAttach.X, vRightFootAttach.Y, vRightFootAttach.Z>>, VECTOR_ZERO, VECTOR_ZERO, -1.0, TRUE, FALSE, FALSE, FALSE)
ENDIF
ENDIF
ENDIF
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED(CHAR_FRANKLIN), <<971.733765, -2122.363770, 29.477753>>, <<989.067078, -2124.301025, 34.475548>>, 5.0)
eMissionFail = failMichaelAbandon
missionFailed()
ENDIF
ENDIF
IF IS_PED_INJURED(sEnemyBackup[5].pedIndex)
AND IS_PED_INJURED(sEnemyBackup[6].pedIndex)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex, TRUE)
IF NOT HAS_PED_GOT_WEAPON(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex, WEAPONTYPE_KNIFE)
GIVE_WEAPON_TO_PED(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex, WEAPONTYPE_KNIFE, INFINITE_AMMO, TRUE)
ENDIF
SET_CURRENT_PED_WEAPON(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex, WEAPONTYPE_KNIFE, TRUE)
SETTIMERB(0)
iSetPiece[SET_PIECE_GRAPPLE]++
ENDIF
ENDIF
BREAK
CASE 1
IF NOT IS_PED_INJURED(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex)
// BOOL bClearOfEnemies
//
// bClearOfEnemies = TRUE
// REPEAT COUNT_OF(sEnemyBackup) i
// IF DOES_ENTITY_EXIST(sEnemyBackup[i].pedIndex)
// AND NOT IS_PED_INJURED(sEnemyBackup[i].pedIndex)
// IF IS_ENTITY_AT_COORD(sEnemyBackup[i].pedIndex, <<997.968079, -2106.348145, 31.975391>>, <<8.0, 5.0, 2.5>>)
// bClearOfEnemies = FALSE
// ENDIF
// ENDIF
// ENDREPEAT
// IF IS_PED_INJURED(sEnemyBackup[5].pedIndex)
// AND IS_PED_INJURED(sEnemyBackup[6].pedIndex)
//
// ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("AbandonGrapple")
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED(CHAR_FRANKLIN), <<984.412720, -2102.345703, 29.301226>>, <<981.532898, -2130.348389, 35.475380>>, 15.0)
PRINT_ADV("CMN_MLEAVE", DEFAULT_GOD_TEXT_TIME, FALSE)
SET_LABEL_AS_TRIGGERED("AbandonGrapple", TRUE)
ENDIF
ELSE
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED(CHAR_FRANKLIN), <<971.733765, -2122.363770, 29.477753>>, <<989.067078, -2124.301025, 34.475548>>, 5.0)
eMissionFail = failMichaelAbandon
missionFailed()
ENDIF
ENDIF
IF (IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED(CHAR_FRANKLIN), <<987.029297, -2105.918701, 29.391869>>, <<999.674927, -2104.281738, 34.211304>>, 7.0)
AND TIMERB() > 2000)
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED(CHAR_FRANKLIN), <<989.328735, -2108.531250, 29.475145>>, <<989.938782, -2102.828369, 34.225105>>, 3.75)
IF NOT IS_PED_RAGDOLL(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex)
SAFE_SET_PLAYER_CONTROL(PLAYER_ID(), FALSE) //, SPC_LEAVE_CAMERA_CONTROL_ON)
INT i
REPEAT COUNT_OF(sEnemyBackup) i
IF DOES_ENTITY_EXIST(sEnemyBackup[i].pedIndex)
IF NOT IS_PED_INJURED(sEnemyBackup[i].pedIndex)
SET_ENTITY_VISIBLE(sEnemyBackup[i].pedIndex, FALSE)
FREEZE_ENTITY_POSITION(sEnemyBackup[i].pedIndex, TRUE)
ELIF IS_ENTITY_IN_ANGLED_AREA(sEnemyBackup[i].pedIndex, <<991.811279, -2105.769775, 28.975157>>, <<999.906250, -2107.010254, 33.475464>>, 3.0)
SAFE_DELETE_PED(sEnemyBackup[i].pedIndex)
ENDIF
ENDIF
ENDREPEAT
IF NOT HAS_PED_GOT_WEAPON(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex, WEAPONTYPE_KNIFE)
GIVE_WEAPON_TO_PED(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex, WEAPONTYPE_KNIFE, INFINITE_AMMO, TRUE)
ENDIF
SET_CURRENT_PED_WEAPON(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex, WEAPONTYPE_KNIFE, TRUE)
GET_CURRENT_PED_WEAPON(PLAYER_PED(CHAR_FRANKLIN), wtLastWeapon)
SET_CURRENT_PED_WEAPON(PLAYER_PED(CHAR_FRANKLIN), WEAPONTYPE_UNARMED, TRUE)
SAFE_ADD_BLIP_PED(sEnemySetPiece[SET_PIECE_GRAPPLE].blipIndex, sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex, TRUE)
//Cam
IF NOT DOES_CAM_EXIST(camAnim)
camAnim = CREATE_CAMERA(CAMTYPE_ANIMATED, TRUE)
ENDIF
PLAY_CAM_ANIM(camAnim, "mic_2_ig_11_intro_cam", sAnimDictMic2IG11, <<997.380, -2103.649, 29.450 + 0.07>>, <<0.0, 0.0, -95.0>>)
SET_CAM_ACTIVE(camAnim, TRUE)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
HANG_UP_AND_PUT_AWAY_PHONE(TRUE)
HIDE_HUD_AND_RADAR_THIS_FRAME()
SET_ENTITY_VISIBLE(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex, TRUE)
CLEAR_AREA(<<997.0422, -2107.2380, 29.4754>>, 10.0, TRUE)
SET_ENTITY_NO_COLLISION_ENTITY(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex, PLAYER_PED(CHAR_FRANKLIN), FALSE)
SET_ENTITY_NO_COLLISION_ENTITY(PLAYER_PED(CHAR_FRANKLIN), sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex, FALSE)
// OPEN_SEQUENCE_TASK(seqMain)
// TASK_PLAY_ANIM_ADVANCED(NULL, sAnimDictMic2IG11, "mic_2_ig_11_intro_p_one", <<997.380, -2103.649, 29.450 + 0.07>>, <<0.0, 0.0, -95.0>>, INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1, AF_FORCE_START | AF_EXTRACT_INITIAL_OFFSET | AF_NOT_INTERRUPTABLE | AF_USE_KINEMATIC_PHYSICS | AF_USE_MOVER_EXTRACTION, 0.0, EULER_YXZ, AIK_DISABLE_LEG_IK) //, 0.373)
// TASK_PLAY_ANIM_ADVANCED(NULL, sAnimDictMic2IG11, "mic_2_ig_11_winning_p_one", <<997.380, -2103.649, 29.450 + 0.07>>, <<0.0, 0.0, -95.0>>, INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1, AF_FORCE_START | AF_EXTRACT_INITIAL_OFFSET | AF_NOT_INTERRUPTABLE | AF_USE_KINEMATIC_PHYSICS | AF_USE_MOVER_EXTRACTION, 0.0, EULER_YXZ, AIK_DISABLE_LEG_IK)
// TASK_PLAY_ANIM_ADVANCED(NULL, sAnimDictMic2IG11, "mic_2_ig_11_losing_p_one", <<997.380, -2103.649, 29.450 + 0.07>>, <<0.0, 0.0, -95.0>>, INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1, AF_FORCE_START | AF_EXTRACT_INITIAL_OFFSET | AF_NOT_INTERRUPTABLE | AF_USE_KINEMATIC_PHYSICS | AF_USE_MOVER_EXTRACTION, 0.0, EULER_YXZ, AIK_DISABLE_LEG_IK)
// TASK_PLAY_ANIM_ADVANCED(NULL, sAnimDictMic2IG11, "mic_2_ig_11_winning_p_one", <<997.380, -2103.649, 29.450 + 0.07>>, <<0.0, 0.0, -95.0>>, INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1, AF_FORCE_START | AF_EXTRACT_INITIAL_OFFSET | AF_NOT_INTERRUPTABLE | AF_USE_KINEMATIC_PHYSICS | AF_USE_MOVER_EXTRACTION, 0.0, EULER_YXZ, AIK_DISABLE_LEG_IK)
// TASK_PLAY_ANIM_ADVANCED(NULL, sAnimDictMic2IG11, "mic_2_ig_11_losing_p_one", <<997.380, -2103.649, 29.450 + 0.07>>, <<0.0, 0.0, -95.0>>, INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1, AF_FORCE_START | AF_EXTRACT_INITIAL_OFFSET | AF_NOT_INTERRUPTABLE | AF_USE_KINEMATIC_PHYSICS | AF_USE_MOVER_EXTRACTION, 0.0, EULER_YXZ, AIK_DISABLE_LEG_IK)
// TASK_PLAY_ANIM_ADVANCED(NULL, sAnimDictMic2IG11, "mic_2_ig_11_winning_p_one", <<997.380, -2103.649, 29.450 + 0.07>>, <<0.0, 0.0, -95.0>>, INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1, AF_FORCE_START | AF_EXTRACT_INITIAL_OFFSET | AF_NOT_INTERRUPTABLE | AF_USE_KINEMATIC_PHYSICS | AF_USE_MOVER_EXTRACTION, 0.0, EULER_YXZ, AIK_DISABLE_LEG_IK)
// TASK_PLAY_ANIM_ADVANCED(NULL, sAnimDictMic2IG11, "mic_2_ig_11_losing_p_one", <<997.380, -2103.649, 29.450 + 0.07>>, <<0.0, 0.0, -95.0>>, INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1, AF_FORCE_START | AF_EXTRACT_INITIAL_OFFSET | AF_NOT_INTERRUPTABLE | AF_USE_KINEMATIC_PHYSICS | AF_USE_MOVER_EXTRACTION, 0.0, EULER_YXZ, AIK_DISABLE_LEG_IK)
// TASK_PLAY_ANIM_ADVANCED(NULL, sAnimDictMic2IG11, "mic_2_ig_11_winning_p_one", <<997.380, -2103.649, 29.450 + 0.07>>, <<0.0, 0.0, -95.0>>, INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1, AF_FORCE_START | AF_EXTRACT_INITIAL_OFFSET | AF_NOT_INTERRUPTABLE | AF_USE_KINEMATIC_PHYSICS | AF_USE_MOVER_EXTRACTION, 0.0, EULER_YXZ, AIK_DISABLE_LEG_IK)
// TASK_PLAY_ANIM_ADVANCED(NULL, sAnimDictMic2IG11, "mic_2_ig_11_losing_p_one", <<997.380, -2103.649, 29.450 + 0.07>>, <<0.0, 0.0, -95.0>>, INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1, AF_FORCE_START | AF_EXTRACT_INITIAL_OFFSET | AF_NOT_INTERRUPTABLE | AF_USE_KINEMATIC_PHYSICS | AF_USE_MOVER_EXTRACTION, 0.0, EULER_YXZ, AIK_DISABLE_LEG_IK)
// TASK_PLAY_ANIM_ADVANCED(NULL, sAnimDictMic2IG11, "mic_2_ig_11_a_p_one", <<997.380, -2103.649, 29.450 + 0.07>>, <<0.0, 0.0, -95.0>>, INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1, AF_FORCE_START | AF_EXTRACT_INITIAL_OFFSET | AF_NOT_INTERRUPTABLE | AF_USE_KINEMATIC_PHYSICS | AF_USE_MOVER_EXTRACTION | AF_HOLD_LAST_FRAME, 0.0, EULER_YXZ, AIK_DISABLE_LEG_IK)
// CLOSE_SEQUENCE_TASK(seqMain)
// TASK_PERFORM_SEQUENCE(PLAYER_PED(CHAR_FRANKLIN), seqMain)
// CLEAR_SEQUENCE_TASK(seqMain)
//
// FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED(CHAR_FRANKLIN))
//
// OPEN_SEQUENCE_TASK(seqMain)
// TASK_PLAY_ANIM_ADVANCED(NULL, sAnimDictMic2IG11, "mic_2_ig_11_intro_goon", <<997.380, -2103.649, 29.450 + 0.07>>, <<0.0, 0.0, -95.0>>, INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1, AF_FORCE_START | AF_EXTRACT_INITIAL_OFFSET | AF_NOT_INTERRUPTABLE | AF_USE_KINEMATIC_PHYSICS | AF_USE_MOVER_EXTRACTION, 0.0, EULER_YXZ, AIK_DISABLE_LEG_IK) //, 0.373)
// TASK_PLAY_ANIM_ADVANCED(NULL, sAnimDictMic2IG11, "mic_2_ig_11_winning_goon", <<997.380, -2103.649, 29.450 + 0.07>>, <<0.0, 0.0, -95.0>>, INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1, AF_FORCE_START | AF_EXTRACT_INITIAL_OFFSET | AF_USE_KINEMATIC_PHYSICS | AF_USE_MOVER_EXTRACTION, 0.0, EULER_YXZ, AIK_DISABLE_LEG_IK)
// TASK_PLAY_ANIM_ADVANCED(NULL, sAnimDictMic2IG11, "mic_2_ig_11_losing_goon", <<997.380, -2103.649, 29.450 + 0.07>>, <<0.0, 0.0, -95.0>>, INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1, AF_FORCE_START | AF_EXTRACT_INITIAL_OFFSET | AF_USE_KINEMATIC_PHYSICS | AF_USE_MOVER_EXTRACTION, 0.0, EULER_YXZ, AIK_DISABLE_LEG_IK)
// TASK_PLAY_ANIM_ADVANCED(NULL, sAnimDictMic2IG11, "mic_2_ig_11_winning_goon", <<997.380, -2103.649, 29.450 + 0.07>>, <<0.0, 0.0, -95.0>>, INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1, AF_FORCE_START | AF_EXTRACT_INITIAL_OFFSET | AF_USE_KINEMATIC_PHYSICS | AF_USE_MOVER_EXTRACTION, 0.0, EULER_YXZ, AIK_DISABLE_LEG_IK)
// TASK_PLAY_ANIM_ADVANCED(NULL, sAnimDictMic2IG11, "mic_2_ig_11_losing_goon", <<997.380, -2103.649, 29.450 + 0.07>>, <<0.0, 0.0, -95.0>>, INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1, AF_FORCE_START | AF_EXTRACT_INITIAL_OFFSET | AF_USE_KINEMATIC_PHYSICS | AF_USE_MOVER_EXTRACTION, 0.0, EULER_YXZ, AIK_DISABLE_LEG_IK)
// TASK_PLAY_ANIM_ADVANCED(NULL, sAnimDictMic2IG11, "mic_2_ig_11_winning_goon", <<997.380, -2103.649, 29.450 + 0.07>>, <<0.0, 0.0, -95.0>>, INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1, AF_FORCE_START | AF_EXTRACT_INITIAL_OFFSET | AF_USE_KINEMATIC_PHYSICS | AF_USE_MOVER_EXTRACTION, 0.0, EULER_YXZ, AIK_DISABLE_LEG_IK)
// TASK_PLAY_ANIM_ADVANCED(NULL, sAnimDictMic2IG11, "mic_2_ig_11_losing_goon", <<997.380, -2103.649, 29.450 + 0.07>>, <<0.0, 0.0, -95.0>>, INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1, AF_FORCE_START | AF_EXTRACT_INITIAL_OFFSET | AF_USE_KINEMATIC_PHYSICS | AF_USE_MOVER_EXTRACTION, 0.0, EULER_YXZ, AIK_DISABLE_LEG_IK)
// TASK_PLAY_ANIM_ADVANCED(NULL, sAnimDictMic2IG11, "mic_2_ig_11_winning_goon", <<997.380, -2103.649, 29.450 + 0.07>>, <<0.0, 0.0, -95.0>>, INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1, AF_FORCE_START | AF_EXTRACT_INITIAL_OFFSET | AF_USE_KINEMATIC_PHYSICS | AF_USE_MOVER_EXTRACTION, 0.0, EULER_YXZ, AIK_DISABLE_LEG_IK)
// TASK_PLAY_ANIM_ADVANCED(NULL, sAnimDictMic2IG11, "mic_2_ig_11_losing_goon", <<997.380, -2103.649, 29.450 + 0.07>>, <<0.0, 0.0, -95.0>>, INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1, AF_FORCE_START | AF_EXTRACT_INITIAL_OFFSET | AF_USE_KINEMATIC_PHYSICS | AF_USE_MOVER_EXTRACTION, 0.0, EULER_YXZ, AIK_DISABLE_LEG_IK)
// TASK_PLAY_ANIM_ADVANCED(NULL, sAnimDictMic2IG11, "mic_2_ig_11_a_goon", <<997.380, -2103.649, 29.450 + 0.07>>, <<0.0, 0.0, -95.0>>, INSTANT_BLEND_IN, SLOW_BLEND_OUT, -1, AF_FORCE_START | AF_EXTRACT_INITIAL_OFFSET | AF_USE_KINEMATIC_PHYSICS | AF_USE_MOVER_EXTRACTION, 0.0, EULER_YXZ, AIK_DISABLE_LEG_IK)
// CLOSE_SEQUENCE_TASK(seqMain)
// TASK_PERFORM_SEQUENCE(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex, seqMain)
// CLEAR_SEQUENCE_TASK(seqMain)
//
// FORCE_PED_AI_AND_ANIMATION_UPDATE(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex)
iGrappleStage = 1
SET_PED_CONFIG_FLAG(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex, PCF_DontActivateRagdollFromBulletImpact, FALSE)
SET_PED_CONFIG_FLAG(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex, PCF_DontActivateRagdollFromExplosions, FALSE)
SET_PED_CONFIG_FLAG(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex, PCF_DontActivateRagdollFromElectrocution, FALSE)
SET_PED_CONFIG_FLAG(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex, PCF_DontActivateRagdollFromFire, FALSE)
CLEAR_RAGDOLL_BLOCKING_FLAGS(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex, RBF_BULLET_IMPACT | RBF_EXPLOSION | RBF_ELECTROCUTION | RBF_FIRE | RBF_RUBBER_BULLET)
SET_ENTITY_PROOFS(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex, FALSE, FALSE, FALSE, FALSE, FALSE)
SET_ENTITY_INVINCIBLE(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex, FALSE)
SET_ENTITY_HEALTH(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex, 105)
//Audio Scene
IF IS_AUDIO_SCENE_ACTIVE("MI_2_SHOOT_FROM_MEATHOOK")
STOP_AUDIO_SCENE("MI_2_SHOOT_FROM_MEATHOOK")
ENDIF
IF NOT IS_AUDIO_SCENE_ACTIVE("MI_2_FRANKLIN_KNIFE_ATTACK")
START_AUDIO_SCENE("MI_2_FRANKLIN_KNIFE_ATTACK")
ENDIF
//Audio
PLAY_AUDIO(MIC3_FRANK_DOWN)
SETTIMERB(0)
eSwitchCamState = SWITCH_CAM_REQUEST_ASSETS
HANDLE_SWITCH_CAM_FRANKLIN_GRAPPLE_TO_MICHAEL(scsSwitchCam_FranklinGrappleToMichael)
IF NOT bVideoRecording
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGH)
bVideoRecording = TRUE
ENDIF
iSetPiece[SET_PIECE_GRAPPLE]++
ENDIF
ENDIF
ENDIF
BREAK
CASE 2
HIDE_HUD_AND_RADAR_THIS_FRAME()
IF IS_SYNCHRONIZED_SCENE_RUNNING(sceneGrapple)
AND GET_SYNCHRONIZED_SCENE_PHASE(sceneGrapple) >= 0.350
//IF IS_ENTITY_PLAYING_ANIM(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex, sAnimDictMic2IG11, "mic_2_ig_11_intro_goon")
//AND GET_ENTITY_ANIM_CURRENT_TIME(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex, sAnimDictMic2IG11, "mic_2_ig_11_intro_goon") >= 0.350
//AND GET_ENTITY_ANIM_CURRENT_TIME(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex, sAnimDictMic2IG11, "mic_2_ig_11_intro_goon") > 0.650
IF bVideoRecording
REPLAY_STOP_EVENT()
bVideoRecording = FALSE
ENDIF
MAKE_SELECTOR_PED_SELECTION(sSelectorPeds, SELECTOR_PED_MICHAEL)
TAKE_CONTROL_OF_SELECTOR_PED(sSelectorPeds, TRUE, TRUE)
//Blocking
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(PLAYER_PED(CHAR_FRANKLIN), TRUE)
//Dialogue
REMOVE_PED_FOR_DIALOGUE(sPedsForConversation, 0)
REMOVE_PED_FOR_DIALOGUE(sPedsForConversation, 1)
ADD_PED_FOR_DIALOGUE(sPedsForConversation, 0, PLAYER_PED(CHAR_MICHAEL), "MICHAEL")
ADD_PED_FOR_DIALOGUE(sPedsForConversation, 1, PLAYER_PED(CHAR_FRANKLIN), "FRANKLIN")
//Update the relationship groups
IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[CHAR_MICHAEL])
SET_PED_RELATIONSHIP_GROUP_HASH(sSelectorPeds.pedID[CHAR_MICHAEL], relGroupBuddy)
ENDIF
IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[CHAR_FRANKLIN])
SET_PED_RELATIONSHIP_GROUP_HASH(sSelectorPeds.pedID[CHAR_FRANKLIN], relGroupBuddy)
ENDIF
SAFE_REMOVE_BLIP(blipMichael)
SAFE_REMOVE_BLIP(blipFranklin)
IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
SAFE_ADD_BLIP_PED(blipMichael, sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], FALSE)
ENDIF
IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
SAFE_ADD_BLIP_PED(blipFranklin, sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], FALSE)
ENDIF
SETTIMERB(0)
eSwitchCamState = SWITCH_CAM_SETUP_SPLINE
iSetPiece[SET_PIECE_GRAPPLE]++
ENDIF
BREAK
CASE 3
HIDE_HUD_AND_RADAR_THIS_FRAME()
INT i
// IF IS_ENTITY_PLAYING_ANIM(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex, sAnimDictMic2IG11, "mic_2_ig_11_intro_goon")
// AND GET_ENTITY_ANIM_CURRENT_TIME(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex, sAnimDictMic2IG11, "mic_2_ig_11_intro_goon") > 0.750 //0.650
REPEAT COUNT_OF(sEnemyBackup) i
IF DOES_ENTITY_EXIST(sEnemyBackup[i].pedIndex)
AND NOT IS_PED_INJURED(sEnemyBackup[i].pedIndex)
SET_ENTITY_VISIBLE(sEnemyBackup[i].pedIndex, TRUE)
FREEZE_ENTITY_POSITION(sEnemyBackup[i].pedIndex, FALSE)
ENDIF
ENDREPEAT
IF NOT IS_PED_INJURED(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex)
SET_ENTITY_HEALTH(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex, 600)
SET_PED_SUFFERS_CRITICAL_HITS(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex, FALSE)
ENDIF
TASK_AIM_GUN_SCRIPTED(PLAYER_PED(CHAR_MICHAEL), SCRIPTED_GUN_TASK_HANGING_UPSIDE_DOWN) PRINTLN("SHOOTING/HANGING UPSIDE DOWN!")
IF NOT HAS_PED_GOT_WEAPON(PLAYER_PED(CHAR_MICHAEL), WEAPONTYPE_COMBATPISTOL)
GIVE_WEAPON_TO_PED(PLAYER_PED(CHAR_MICHAEL), WEAPONTYPE_COMBATPISTOL, 350, TRUE)
ENDIF
IF GET_AMMO_IN_PED_WEAPON(PLAYER_PED(CHAR_MICHAEL), WEAPONTYPE_COMBATPISTOL) < (GET_WEAPON_CLIP_SIZE(WEAPONTYPE_COMBATPISTOL) * 2)
SET_PED_AMMO(PLAYER_PED(CHAR_MICHAEL), WEAPONTYPE_COMBATPISTOL, (GET_WEAPON_CLIP_SIZE(WEAPONTYPE_COMBATPISTOL) * 2))
ENDIF
SET_CURRENT_PED_WEAPON(PLAYER_PED(CHAR_MICHAEL), WEAPONTYPE_COMBATPISTOL, TRUE)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(-10.0)
//Cam
// IF NOT DOES_CAM_EXIST(camMain)
// camMain = CREATE_CAMERA(CAMTYPE_SCRIPTED, TRUE)
// ENDIF
//
// SET_CAM_PARAMS(camMain, GET_CAM_COORD(camAnim), GET_CAM_ROT(camAnim), GET_CAM_FOV(camAnim))
//
// SET_CAM_PARAMS(camMain,
// <<996.274475, -2126.295410, 30.160732>>,
// <<-2.658349, 0.699294, -10.082686>>,
// 44.001450,
// DEFAULT_INTERP_TO_FROM_GAME,
// GRAPH_TYPE_ACCEL,
// GRAPH_TYPE_ACCEL)
//
// SET_CAM_ACTIVE(camMain, TRUE)
//RENDER_SCRIPT_CAMS(FALSE, TRUE, DEFAULT_INTERP_TO_FROM_GAME * 2, FALSE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
INFORM_MISSION_STATS_SYSTEM_OF_TIME_WINDOW_OPEN(MIC2_TIME_TO_SAVE_FRANKLIN)
//Audio Scene
IF IS_AUDIO_SCENE_ACTIVE("MI_2_FRANKLIN_KNIFE_ATTACK")
STOP_AUDIO_SCENE("MI_2_FRANKLIN_KNIFE_ATTACK")
ENDIF
IF NOT IS_AUDIO_SCENE_ACTIVE("MI_2_SPLINE_2")
START_AUDIO_SCENE("MI_2_SPLINE_2")
ENDIF
SETTIMERB(0)
iSetPiece[SET_PIECE_GRAPPLE]++
// ENDIF
BREAK
CASE 4
IF wtLastWeapon != WEAPONTYPE_UNARMED
REQUEST_WEAPON_ASSET(wtLastWeapon)
ELSE
REQUEST_WEAPON_ASSET(WEAPONTYPE_ASSAULTRIFLE)
ENDIF
// IF IS_CAM_RENDERING(camMain)
// RENDER_SCRIPT_CAMS(FALSE, TRUE, DEFAULT_INTERP_TO_FROM_GAME * 2, FALSE)
// SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
//
//// SET_LABEL_AS_TRIGGERED("FranklinGrapple", TRUE)
//
// INFORM_MISSION_STATS_SYSTEM_OF_TIME_WINDOW_OPEN(MIC2_TIME_TO_SAVE_FRANKLIN)
// ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("SwitchBackToMichael")
IF HANDLE_SWITCH_CAM_FRANKLIN_GRAPPLE_TO_MICHAEL(scsSwitchCam_FranklinGrappleToMichael)
//IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED(CHAR_MICHAEL)), GET_FINAL_RENDERED_CAM_COORD()) < 2.0
//Audio Scene
IF IS_AUDIO_SCENE_ACTIVE("MI_2_SPLINE_2")
STOP_AUDIO_SCENE("MI_2_SPLINE_2")
ENDIF
IF NOT IS_AUDIO_SCENE_ACTIVE("MI_2_SAVE_FRANKLIN")
START_AUDIO_SCENE("MI_2_SAVE_FRANKLIN")
ENDIF
SET_LABEL_AS_TRIGGERED("SwitchBackToMichael", TRUE)
ENDIF
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SPECIAL_ABILITY)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SPECIAL_ABILITY_PC)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SPECIAL_ABILITY_SECONDARY)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ACCURATE_AIM)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SNIPER_ZOOM_IN)
ENDIF
//[MF] Stop gameplay cam shake for after we return to Mike
IF bFrankGrappleToMike_GameplayCamShakeActivated
IF TIMERB() > iFrankGrappleToMike_GameplayCamShakeDuration
STOP_GAMEPLAY_CAM_SHAKING(FALSE)
bFrankGrappleToMike_GameplayCamShakeActivated = FALSE
ENDIF
ENDIF
IF NOT SAFE_IS_PLAYER_CONTROL_ON()
IF eSwitchCamState != SWITCH_CAM_PLAYING_SPLINE
HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_RETICLE)
HIDE_HUD_AND_RADAR_THIS_FRAME()
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SPECIAL_ABILITY)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SPECIAL_ABILITY_PC)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SPECIAL_ABILITY_SECONDARY)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ACCURATE_AIM)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SNIPER_ZOOM_IN)
ENDIF
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED(CHAR_MICHAEL)), GET_FINAL_RENDERED_CAM_COORD()) < 2.0
SAFE_SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
ENDIF
ENDIF
IF IS_INTERPOLATING_FROM_SCRIPT_CAMS()
OR eSwitchCamState = SWITCH_CAM_PLAYING_SPLINE
HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_RETICLE)
HIDE_HUD_AND_RADAR_THIS_FRAME()
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SPECIAL_ABILITY)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SPECIAL_ABILITY_PC)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SPECIAL_ABILITY_SECONDARY)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ACCURATE_AIM)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SNIPER_ZOOM_IN)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_NEXT_CAMERA)
ENDIF
//Audio
IF NOT HAS_LABEL_BEEN_TRIGGERED("FranklinSaved")
IF NOT IS_MUSIC_ONESHOT_PLAYING()
LOAD_AUDIO(MIC2_FRANK_SAVED)
SET_LABEL_AS_TRIGGERED("FranklinSaved", TRUE)
ENDIF
ENDIF
// IF IS_PED_INJURED(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex)
IF GET_ENTITY_HEALTH(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex) < 600
TASK_PLAY_ANIM_ADVANCED(PLAYER_PED(CHAR_FRANKLIN), sAnimDictMic2IG11, "mic_2_ig_11_b_p_one", <<997.380, -2103.649, 29.450 + 0.07>>, <<0.0, 0.0, -95.0>>, INSTANT_BLEND_IN, SLOW_BLEND_OUT, -1, AF_FORCE_START | AF_EXTRACT_INITIAL_OFFSET | AF_NOT_INTERRUPTABLE | AF_USE_KINEMATIC_PHYSICS | AF_USE_MOVER_EXTRACTION | AF_IGNORE_GRAVITY, 0.0, EULER_YXZ, AIK_DISABLE_LEG_IK)
TASK_PLAY_ANIM_ADVANCED(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex, sAnimDictMic2IG11, "mic_2_ig_11_b_goon", <<997.380, -2103.649, 29.450 + 0.07>>, <<0.0, 0.0, -95.0>>, INSTANT_BLEND_IN, SLOW_BLEND_OUT, -1, AF_FORCE_START | AF_EXTRACT_INITIAL_OFFSET | AF_NOT_INTERRUPTABLE | AF_USE_KINEMATIC_PHYSICS | AF_USE_MOVER_EXTRACTION | AF_IGNORE_GRAVITY | AF_ENDS_IN_DEAD_POSE, 0.469, EULER_YXZ, AIK_DISABLE_LEG_IK)
SET_PED_DROPS_WEAPON(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex)
SET_PED_USING_ACTION_MODE(PLAYER_PED(CHAR_FRANKLIN), TRUE, -1, "DEFAULT_ACTION")
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
CREATE_CONVERSATION_ADV("MCH2_SAVE")
REPLAY_RECORD_BACK_FOR_TIME(4.0, 8.0, REPLAY_IMPORTANCE_HIGHEST)
SAFE_REMOVE_BLIP(sEnemySetPiece[SET_PIECE_GRAPPLE].blipIndex)
//Audio Scene
IF IS_AUDIO_SCENE_ACTIVE("MI_2_SAVE_FRANKLIN")
STOP_AUDIO_SCENE("MI_2_SAVE_FRANKLIN")
ENDIF
IF NOT IS_AUDIO_SCENE_ACTIVE("MI_2_ESCAPE_SHOOTOUT")
START_AUDIO_SCENE("MI_2_ESCAPE_SHOOTOUT")
ENDIF
//Audio
PLAY_AUDIO(MIC2_FRANK_SAVED)
INFORM_MISSION_STATS_SYSTEM_OF_TIME_WINDOW_CLOSED(FALSE, MIC2_TIME_TO_SAVE_FRANKLIN)
IF NOT DOES_CAM_EXIST(camMain)
camMain = CREATE_CAMERA(CAMTYPE_SCRIPTED, TRUE)
ENDIF
SET_CAM_PARAMS(camMain,
<<995.838806, -2109.341309, 30.128569>>,
<<6.531624, 0.0, -44.823853>>,
33.426998)
SET_CAM_PARAMS(camMain,
<<996.001099, -2109.178223, 30.154921>>,
<<6.531624, 0.0, -44.823853>>,
33.426998,
3000,
GRAPH_TYPE_SIN_ACCEL_DECEL,
GRAPH_TYPE_SIN_ACCEL_DECEL)
SET_CAM_ACTIVE(camMain, TRUE)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
SHAKE_CAM(camMain, "MEDIUM_EXPLOSION_SHAKE", 0.2)
SET_LABEL_AS_TRIGGERED("FranklinGrapple", TRUE)
//[MF] Safety stop gameplay cam shake for after we return to Mike
IF bFrankGrappleToMike_GameplayCamShakeActivated
STOP_GAMEPLAY_CAM_SHAKING(FALSE)
bFrankGrappleToMike_GameplayCamShakeActivated = FALSE
ENDIF
iSetPiece[SET_PIECE_GRAPPLE]++
ENDIF
// IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<997.893860, -2107.579834, 31.975397>>, <<8.0, 4.5, 2.5>>)
// SET_PED_CAPSULE(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex, 0.75)
//
// IF NOT IS_ENTITY_PLAYING_ANIM(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex, sAnimDictMic2IG11, "mic_2_ig_11_a_goon")
// AND NOT (iGrappleStage >= 10
// AND (IS_SYNCHRONIZED_SCENE_RUNNING(sceneGrapple) AND GET_SYNCHRONIZED_SCENE_PHASE(sceneGrapple) >= 0.373))
// TASK_PLAY_ANIM_ADVANCED(PLAYER_PED(CHAR_FRANKLIN), sAnimDictMic2IG11, "mic_2_ig_11_a_p_one", <<997.380, -2103.649, 29.450 + 0.07>>, <<0.0, 0.0, -95.0>>, SLOW_BLEND_IN, INSTANT_BLEND_OUT, -1, AF_FORCE_START | AF_EXTRACT_INITIAL_OFFSET | AF_NOT_INTERRUPTABLE | AF_USE_KINEMATIC_PHYSICS | AF_USE_MOVER_EXTRACTION | AF_HOLD_LAST_FRAME, 0.0, EULER_YXZ, AIK_DISABLE_LEG_IK)
//
// TASK_PLAY_ANIM_ADVANCED(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex, sAnimDictMic2IG11, "mic_2_ig_11_a_goon", <<997.380, -2103.649, 29.450 + 0.07>>, <<0.0, 0.0, -95.0>>, SLOW_BLEND_IN, SLOW_BLEND_OUT, -1, AF_FORCE_START | AF_EXTRACT_INITIAL_OFFSET | AF_USE_KINEMATIC_PHYSICS | AF_USE_MOVER_EXTRACTION, 0.0, EULER_YXZ, AIK_DISABLE_LEG_IK)
// ENDIF
// ENDIF
// IF IS_ENTITY_PLAYING_ANIM(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex, sAnimDictMic2IG11, "mic_2_ig_11_a_goon")
// AND GET_ENTITY_ANIM_CURRENT_TIME(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex, sAnimDictMic2IG11, "mic_2_ig_11_a_goon") >= 0.373
IF iGrappleStage >= 10
AND (IS_SYNCHRONIZED_SCENE_RUNNING(sceneGrapple) AND GET_SYNCHRONIZED_SCENE_PHASE(sceneGrapple) >= 0.373)
CLEAR_TEXT()
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("scr_mich2_blood_stab")
// IF IS_ENTITY_PLAYING_ANIM(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex, sAnimDictMic2IG11, "mic_2_ig_11_a_goon")
// AND GET_ENTITY_ANIM_CURRENT_TIME(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex, sAnimDictMic2IG11, "mic_2_ig_11_a_goon") >= 0.400
IF iGrappleStage >= 10
AND (IS_SYNCHRONIZED_SCENE_RUNNING(sceneGrapple) AND GET_SYNCHRONIZED_SCENE_PHASE(sceneGrapple) >= 0.400)
//START_PARTICLE_FX_NON_LOOPED_AT_COORD("scr_mich2_blood_stab", <<998.649719, -2107.086182, 29.821081>>, VECTOR_ZERO)
START_PARTICLE_FX_NON_LOOPED_ON_ENTITY("scr_mich2_blood_stab", sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex, VECTOR_ZERO, VECTOR_ZERO)
SET_LABEL_AS_TRIGGERED("scr_mich2_blood_stab", TRUE)
ENDIF
ENDIF
// IF IS_ENTITY_PLAYING_ANIM(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex, sAnimDictMic2IG11, "mic_2_ig_11_a_goon")
// AND GET_ENTITY_ANIM_CURRENT_TIME(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex, sAnimDictMic2IG11, "mic_2_ig_11_a_goon") >= 0.600
IF iGrappleStage >= 10
AND (IS_SYNCHRONIZED_SCENE_RUNNING(sceneGrapple) AND GET_SYNCHRONIZED_SCENE_PHASE(sceneGrapple) >= 0.600)
bRadar = FALSE
DISPLAY_RADAR(FALSE)
DISPLAY_HUD(FALSE)
eMissionFail = failFranklinDied
missionFailed()
ENDIF
BREAK
CASE 5
IF IS_CAM_SHAKING(camMain)
IF NOT IS_ENTITY_PLAYING_ANIM(PLAYER_PED(CHAR_FRANKLIN), sAnimDictMic2IG11, "mic_2_ig_11_b_p_one")
OR (IS_ENTITY_PLAYING_ANIM(PLAYER_PED(CHAR_FRANKLIN), sAnimDictMic2IG11, "mic_2_ig_11_b_p_one")
AND GET_ENTITY_ANIM_CURRENT_TIME(PLAYER_PED(CHAR_FRANKLIN), sAnimDictMic2IG11, "mic_2_ig_11_b_p_one") >= 0.15)
STOP_CAM_SHAKING(camMain)
ENDIF
ENDIF
IF NOT IS_ENTITY_PLAYING_ANIM(PLAYER_PED(CHAR_FRANKLIN), sAnimDictMic2IG11, "mic_2_ig_11_b_p_one")
OR (IS_ENTITY_PLAYING_ANIM(PLAYER_PED(CHAR_FRANKLIN), sAnimDictMic2IG11, "mic_2_ig_11_b_p_one")
AND GET_ENTITY_ANIM_CURRENT_TIME(PLAYER_PED(CHAR_FRANKLIN), sAnimDictMic2IG11, "mic_2_ig_11_b_p_one") >= 0.75)
REPLAY_RECORD_BACK_FOR_TIME(4.0)
RENDER_SCRIPT_CAMS(FALSE, FALSE)
SET_LABEL_AS_TRIGGERED("StartMichaelAnim", TRUE)
SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), TRUE)
SET_PED_USING_ACTION_MODE(NOT_PLAYER_PED_ID(), TRUE, -1, "DEFAULT_ACTION")
SET_PED_ACCURACY(NOT_PLAYER_PED_ID(), 20)
IF wtLastWeapon != WEAPONTYPE_UNARMED
SET_CURRENT_PED_WEAPON(PLAYER_PED(CHAR_FRANKLIN), wtLastWeapon, TRUE)
ELSE
IF NOT HAS_PED_GOT_WEAPON(PLAYER_PED(CHAR_FRANKLIN), WEAPONTYPE_ASSAULTRIFLE)
GIVE_WEAPON_TO_PED(PLAYER_PED(CHAR_FRANKLIN), WEAPONTYPE_ASSAULTRIFLE, 350, TRUE)
ENDIF
SET_CURRENT_PED_WEAPON(PLAYER_PED(CHAR_FRANKLIN), WEAPONTYPE_ASSAULTRIFLE, TRUE)
ENDIF
SET_ENTITY_HEALTH(PLAYER_PED(CHAR_FRANKLIN), GET_PED_MAX_HEALTH(PLAYER_PED(CHAR_FRANKLIN)))
//Blocking
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(PLAYER_PED(CHAR_FRANKLIN), TRUE)
IF iCutsceneStage > 0
iCutsceneStage-- PRINTLN("iCutsceneStage = ", iCutsceneStage) //Should re-assign the tasks
ENDIF
iSetPiece[SET_PIECE_GRAPPLE]++
ENDIF
BREAK
ENDSWITCH
IF iSetPiece[SET_PIECE_GRAPPLE] <= 4
SWITCH iGrappleStage
CASE 0
//Do nothing
BREAK
CASE 1
sceneGrapple = CREATE_SYNCHRONIZED_SCENE(vGrapplePos, vGrappleRot)
TASK_SYNCHRONIZED_SCENE(PLAYER_PED(CHAR_FRANKLIN), sceneGrapple, sAnimDictMic2IG11, "mic_2_ig_11_intro_p_one", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT, DEFAULT, DEFAULT, AIK_DISABLE_LEG_IK)
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED(CHAR_FRANKLIN))
TASK_SYNCHRONIZED_SCENE(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex, sceneGrapple, sAnimDictMic2IG11, "mic_2_ig_11_intro_goon", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT, DEFAULT, DEFAULT, AIK_DISABLE_LEG_IK)
FORCE_PED_AI_AND_ANIMATION_UPDATE(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex)
iGrappleStage++
BREAK
CASE 2
IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(sceneGrapple)
OR (IS_SYNCHRONIZED_SCENE_RUNNING(sceneGrapple)
AND GET_SYNCHRONIZED_SCENE_PHASE(sceneGrapple) >= 1.0)
sceneGrapple = CREATE_SYNCHRONIZED_SCENE(vGrapplePos, vGrappleRot)
TASK_SYNCHRONIZED_SCENE(PLAYER_PED(CHAR_FRANKLIN), sceneGrapple, sAnimDictMic2IG11, "mic_2_ig_11_winning_p_one", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT, DEFAULT, DEFAULT, AIK_DISABLE_LEG_IK)
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED(CHAR_FRANKLIN))
TASK_SYNCHRONIZED_SCENE(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex, sceneGrapple, sAnimDictMic2IG11, "mic_2_ig_11_winning_goon", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT, DEFAULT, DEFAULT, AIK_DISABLE_LEG_IK)
FORCE_PED_AI_AND_ANIMATION_UPDATE(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex)
iGrappleStage++
ENDIF
BREAK
CASE 3
IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(sceneGrapple)
OR (IS_SYNCHRONIZED_SCENE_RUNNING(sceneGrapple)
AND GET_SYNCHRONIZED_SCENE_PHASE(sceneGrapple) >= 1.0)
sceneGrapple = CREATE_SYNCHRONIZED_SCENE(vGrapplePos, vGrappleRot)
TASK_SYNCHRONIZED_SCENE(PLAYER_PED(CHAR_FRANKLIN), sceneGrapple, sAnimDictMic2IG11, "mic_2_ig_11_losing_p_one", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT, DEFAULT, DEFAULT, AIK_DISABLE_LEG_IK)
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED(CHAR_FRANKLIN))
TASK_SYNCHRONIZED_SCENE(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex, sceneGrapple, sAnimDictMic2IG11, "mic_2_ig_11_losing_goon", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT, DEFAULT, DEFAULT, AIK_DISABLE_LEG_IK)
FORCE_PED_AI_AND_ANIMATION_UPDATE(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex)
iGrappleStage++
ENDIF
BREAK
CASE 4
IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(sceneGrapple)
OR (IS_SYNCHRONIZED_SCENE_RUNNING(sceneGrapple)
AND GET_SYNCHRONIZED_SCENE_PHASE(sceneGrapple) >= 1.0)
sceneGrapple = CREATE_SYNCHRONIZED_SCENE(vGrapplePos, vGrappleRot)
TASK_SYNCHRONIZED_SCENE(PLAYER_PED(CHAR_FRANKLIN), sceneGrapple, sAnimDictMic2IG11, "mic_2_ig_11_winning_p_one", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT, DEFAULT, DEFAULT, AIK_DISABLE_LEG_IK)
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED(CHAR_FRANKLIN))
TASK_SYNCHRONIZED_SCENE(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex, sceneGrapple, sAnimDictMic2IG11, "mic_2_ig_11_winning_goon", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT, DEFAULT, DEFAULT, AIK_DISABLE_LEG_IK)
FORCE_PED_AI_AND_ANIMATION_UPDATE(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex)
iGrappleStage++
ENDIF
BREAK
CASE 5
IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(sceneGrapple)
OR (IS_SYNCHRONIZED_SCENE_RUNNING(sceneGrapple)
AND GET_SYNCHRONIZED_SCENE_PHASE(sceneGrapple) >= 1.0)
sceneGrapple = CREATE_SYNCHRONIZED_SCENE(vGrapplePos, vGrappleRot)
TASK_SYNCHRONIZED_SCENE(PLAYER_PED(CHAR_FRANKLIN), sceneGrapple, sAnimDictMic2IG11, "mic_2_ig_11_losing_p_one", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT, DEFAULT, DEFAULT, AIK_DISABLE_LEG_IK)
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED(CHAR_FRANKLIN))
TASK_SYNCHRONIZED_SCENE(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex, sceneGrapple, sAnimDictMic2IG11, "mic_2_ig_11_losing_goon", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT, DEFAULT, DEFAULT, AIK_DISABLE_LEG_IK)
FORCE_PED_AI_AND_ANIMATION_UPDATE(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex)
iGrappleStage++
ENDIF
BREAK
CASE 6
IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(sceneGrapple)
OR (IS_SYNCHRONIZED_SCENE_RUNNING(sceneGrapple)
AND GET_SYNCHRONIZED_SCENE_PHASE(sceneGrapple) >= 1.0)
sceneGrapple = CREATE_SYNCHRONIZED_SCENE(vGrapplePos, vGrappleRot)
TASK_SYNCHRONIZED_SCENE(PLAYER_PED(CHAR_FRANKLIN), sceneGrapple, sAnimDictMic2IG11, "mic_2_ig_11_winning_p_one", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT, DEFAULT, DEFAULT, AIK_DISABLE_LEG_IK)
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED(CHAR_FRANKLIN))
TASK_SYNCHRONIZED_SCENE(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex, sceneGrapple, sAnimDictMic2IG11, "mic_2_ig_11_winning_goon", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT, DEFAULT, DEFAULT, AIK_DISABLE_LEG_IK)
FORCE_PED_AI_AND_ANIMATION_UPDATE(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex)
iGrappleStage++
ENDIF
BREAK
CASE 7
IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(sceneGrapple)
OR (IS_SYNCHRONIZED_SCENE_RUNNING(sceneGrapple)
AND GET_SYNCHRONIZED_SCENE_PHASE(sceneGrapple) >= 1.0)
sceneGrapple = CREATE_SYNCHRONIZED_SCENE(vGrapplePos, vGrappleRot)
TASK_SYNCHRONIZED_SCENE(PLAYER_PED(CHAR_FRANKLIN), sceneGrapple, sAnimDictMic2IG11, "mic_2_ig_11_losing_p_one", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT, DEFAULT, DEFAULT, AIK_DISABLE_LEG_IK)
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED(CHAR_FRANKLIN))
TASK_SYNCHRONIZED_SCENE(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex, sceneGrapple, sAnimDictMic2IG11, "mic_2_ig_11_losing_goon", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT, DEFAULT, DEFAULT, AIK_DISABLE_LEG_IK)
FORCE_PED_AI_AND_ANIMATION_UPDATE(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex)
iGrappleStage++
ENDIF
BREAK
CASE 8
IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(sceneGrapple)
OR (IS_SYNCHRONIZED_SCENE_RUNNING(sceneGrapple)
AND GET_SYNCHRONIZED_SCENE_PHASE(sceneGrapple) >= 1.0)
sceneGrapple = CREATE_SYNCHRONIZED_SCENE(vGrapplePos, vGrappleRot)
TASK_SYNCHRONIZED_SCENE(PLAYER_PED(CHAR_FRANKLIN), sceneGrapple, sAnimDictMic2IG11, "mic_2_ig_11_winning_p_one", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT, DEFAULT, DEFAULT, AIK_DISABLE_LEG_IK)
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED(CHAR_FRANKLIN))
TASK_SYNCHRONIZED_SCENE(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex, sceneGrapple, sAnimDictMic2IG11, "mic_2_ig_11_winning_goon", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT, DEFAULT, DEFAULT, AIK_DISABLE_LEG_IK)
FORCE_PED_AI_AND_ANIMATION_UPDATE(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex)
iGrappleStage++
ENDIF
BREAK
CASE 9
IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(sceneGrapple)
OR (IS_SYNCHRONIZED_SCENE_RUNNING(sceneGrapple)
AND GET_SYNCHRONIZED_SCENE_PHASE(sceneGrapple) >= 1.0)
sceneGrapple = CREATE_SYNCHRONIZED_SCENE(vGrapplePos, vGrappleRot)
TASK_SYNCHRONIZED_SCENE(PLAYER_PED(CHAR_FRANKLIN), sceneGrapple, sAnimDictMic2IG11, "mic_2_ig_11_losing_p_one", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT, DEFAULT, DEFAULT, AIK_DISABLE_LEG_IK)
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED(CHAR_FRANKLIN))
TASK_SYNCHRONIZED_SCENE(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex, sceneGrapple, sAnimDictMic2IG11, "mic_2_ig_11_losing_goon", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT, DEFAULT, DEFAULT, AIK_DISABLE_LEG_IK)
FORCE_PED_AI_AND_ANIMATION_UPDATE(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex)
iGrappleStage++
ENDIF
BREAK
CASE 10
IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(sceneGrapple)
OR (IS_SYNCHRONIZED_SCENE_RUNNING(sceneGrapple)
AND GET_SYNCHRONIZED_SCENE_PHASE(sceneGrapple) >= 1.0)
sceneGrapple = CREATE_SYNCHRONIZED_SCENE(vGrapplePos, vGrappleRot)
TASK_SYNCHRONIZED_SCENE(PLAYER_PED(CHAR_FRANKLIN), sceneGrapple, sAnimDictMic2IG11, "mic_2_ig_11_a_p_one", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT, DEFAULT, DEFAULT, AIK_DISABLE_LEG_IK)
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED(CHAR_FRANKLIN))
TASK_SYNCHRONIZED_SCENE(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex, sceneGrapple, sAnimDictMic2IG11, "mic_2_ig_11_a_goon", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT, DEFAULT, DEFAULT, AIK_DISABLE_LEG_IK)
FORCE_PED_AI_AND_ANIMATION_UPDATE(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex)
iGrappleStage++
ENDIF
BREAK
ENDSWITCH
ENDIF
IF NOT IS_PED_INJURED(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex)
AND GET_ENTITY_HEALTH(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex) >= 600
AND iSetPiece[SET_PIECE_GRAPPLE] > 1
// AND NOT (IS_ENTITY_PLAYING_ANIM(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex, sAnimDictMic2IG11, "mic_2_ig_11_a_goon")
// AND GET_ENTITY_ANIM_CURRENT_TIME(sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex, sAnimDictMic2IG11, "mic_2_ig_11_a_goon") >= 0.373)
AND NOT (iGrappleStage >= 10
AND IS_SYNCHRONIZED_SCENE_RUNNING(sceneGrapple) AND GET_SYNCHRONIZED_SCENE_PHASE(sceneGrapple) >= 0.373)
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
AND (NOT IS_MESSAGE_BEING_DISPLAYED() OR GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) = 0)
//IF GET_GAME_TIMER() > iDialogueTimer[0]
IF NOT HAS_LABEL_BEEN_TRIGGERED("MCH2_KNIFE_1")
REPLAY_RECORD_BACK_FOR_TIME(5.0, 10.0, REPLAY_IMPORTANCE_HIGHEST)
ADD_PED_FOR_DIALOGUE(sPedsForConversation, 8, sEnemySetPiece[SET_PIECE_GRAPPLE].pedIndex, "MCH2GOON")
PLAY_SINGLE_LINE_FROM_CONVERSATION_ADV("MCH2_KNIFE", "MCH2_KNIFE_1")
ELIF NOT HAS_LABEL_BEEN_TRIGGERED("MCH2_KNIFE_2")
PLAY_SINGLE_LINE_FROM_CONVERSATION_ADV("MCH2_KNIFE", "MCH2_KNIFE_2")
ELIF NOT HAS_LABEL_BEEN_TRIGGERED("MCH2_KNIFE_3")
PLAY_SINGLE_LINE_FROM_CONVERSATION_ADV("MCH2_KNIFE", "MCH2_KNIFE_3")
ELIF NOT HAS_LABEL_BEEN_TRIGGERED("MCH2_KNIFE_4")
PLAY_SINGLE_LINE_FROM_CONVERSATION_ADV("MCH2_KNIFE", "MCH2_KNIFE_4")
ELIF NOT HAS_LABEL_BEEN_TRIGGERED("MCH2_KNIFE_5")
PLAY_SINGLE_LINE_FROM_CONVERSATION_ADV("MCH2_KNIFE", "MCH2_KNIFE_5")
ELIF NOT HAS_LABEL_BEEN_TRIGGERED("MCH2_KNIFE_6")
PLAY_SINGLE_LINE_FROM_CONVERSATION_ADV("MCH2_KNIFE", "MCH2_KNIFE_6")
ELIF NOT HAS_LABEL_BEEN_TRIGGERED("MCH2_TRAP_1")
PLAY_SINGLE_LINE_FROM_CONVERSATION_ADV("MCH2_TRAP", "MCH2_TRAP_1")
ELIF NOT HAS_LABEL_BEEN_TRIGGERED("MCH2_TRAP_2")
PLAY_SINGLE_LINE_FROM_CONVERSATION_ADV("MCH2_TRAP", "MCH2_TRAP_2")
ELIF NOT HAS_LABEL_BEEN_TRIGGERED("MCH2_TRAP_3")
PLAY_SINGLE_LINE_FROM_CONVERSATION_ADV("MCH2_TRAP", "MCH2_TRAP_3")
ELIF NOT HAS_LABEL_BEEN_TRIGGERED("MCH2_TRAP_4")
PLAY_SINGLE_LINE_FROM_CONVERSATION_ADV("MCH2_TRAP", "MCH2_TRAP_4")
ELIF NOT HAS_LABEL_BEEN_TRIGGERED("MCH2_TRAP_5")
PLAY_SINGLE_LINE_FROM_CONVERSATION_ADV("MCH2_TRAP", "MCH2_TRAP_5")
ELIF NOT HAS_LABEL_BEEN_TRIGGERED("MCH2_TRAP_6")
PLAY_SINGLE_LINE_FROM_CONVERSATION_ADV("MCH2_TRAP", "MCH2_TRAP_6")
ELIF NOT HAS_LABEL_BEEN_TRIGGERED("MCH2_TRAP_7")
PLAY_SINGLE_LINE_FROM_CONVERSATION_ADV("MCH2_TRAP", "MCH2_TRAP_7")
ELIF NOT HAS_LABEL_BEEN_TRIGGERED("MCH2_TRAP_8")
PLAY_SINGLE_LINE_FROM_CONVERSATION_ADV("MCH2_TRAP", "MCH2_TRAP_8")
ELIF NOT HAS_LABEL_BEEN_TRIGGERED("MCH2_TRAP_9")
PLAY_SINGLE_LINE_FROM_CONVERSATION_ADV("MCH2_TRAP", "MCH2_TRAP_9")
ELIF NOT HAS_LABEL_BEEN_TRIGGERED("MCH2_TRAP_10")
PLAY_SINGLE_LINE_FROM_CONVERSATION_ADV("MCH2_TRAP", "MCH2_TRAP_10")
ENDIF
// iDialogueTimer[0] = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(3000, 5000)
//ENDIF
ENDIF
ENDIF
//Kill enemies who ragdoll inside the navmesh blocking area
INT i
REPEAT COUNT_OF(sEnemyBackup) i
IF DOES_ENTITY_EXIST(sEnemyBackup[i].pedIndex)
AND NOT IS_PED_INJURED(sEnemyBackup[i].pedIndex)
// SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE)
// DRAW_DEBUG_POLY_ANGLED_AREA(<<991.279846, -2131.790283, 29.475735>>, <<993.158691, -2111.559814, 34.475296>>, 4.5)
// DRAW_DEBUG_POLY_ANGLED_AREA(<<1000.158203, -2132.114014, 29.476189>>, <<1001.959473, -2111.474365, 34.475670>>, 5.25)
IF IS_ENTITY_IN_ANGLED_AREA(sEnemyBackup[i].pedIndex, <<991.279846, -2131.790283, 29.475735>>, <<993.158691, -2111.559814, 34.475296>>, 4.5)
OR IS_ENTITY_IN_ANGLED_AREA(sEnemyBackup[i].pedIndex, <<1000.158203, -2132.114014, 29.476189>>, <<1001.959473, -2111.474365, 34.475670>>, 5.25)
IF IS_PED_RAGDOLL(sEnemyBackup[i].pedIndex)
SET_ENTITY_HEALTH(sEnemyBackup[i].pedIndex, 5)
APPLY_DAMAGE_TO_PED(sEnemyBackup[i].pedIndex, 500, FALSE)
PRINTLN("sEnemyBackup[", i, "].pedIndex ragdolled into a navmesh blocking area and had to be killed.")
ELSE
APPLY_DAMAGE_TO_PED(sEnemyBackup[i].pedIndex, 1, FALSE)
ENDIF
ENDIF
ENDIF
ENDREPEAT
//Update Players navmesh blocknig area so the buddy won't run into him...
IF iNavBlock[0] = 0
iNavBlock[0] = ADD_NAVMESH_BLOCKING_OBJECT(GET_ENTITY_COORDS(PLAYER_PED_ID()), <<0.75, 0.75, 1.0>>, (GET_ENTITY_HEADING(PLAYER_PED_ID()) / 360) * 6.28)
PRINTLN("ADD_NAVMESH_BLOCKING_OBJECT | iNavBlock[0] = ", iNavBlock[1])
ELSE
UPDATE_NAVMESH_BLOCKING_OBJECT(iNavBlock[0], GET_ENTITY_COORDS(PLAYER_PED_ID()), <<0.75, 0.75, 1.0>>, (GET_ENTITY_HEADING(PLAYER_PED_ID()) / 360) * 6.28)
ENDIF
ENDIF
IF CLEANUP_STAGE()
//Cleanup (Blips, peds, variables etc.)
//Audio Scene
IF IS_AUDIO_SCENE_ACTIVE("MI_2_SHOOT_FROM_MEATHOOK")
STOP_AUDIO_SCENE("MI_2_SHOOT_FROM_MEATHOOK")
ENDIF
//Cheat
DISABLE_CHEAT(CHEAT_TYPE_GIVE_WEAPONS, FALSE)
SET_SELECTOR_PED_HINT(sSelectorPeds, SELECTOR_PED_FRANKLIN, FALSE)
SET_SELECTOR_PED_HINT(sSelectorPeds, SELECTOR_PED_MICHAEL, FALSE)
INFORM_MISSION_STATS_SYSTEM_OF_TIME_WINDOW_CLOSED(FALSE, MIC2_TIME_TO_SAVE_FRANKLIN)
SAFE_REMOVE_BLIP(blipMichael)
SAFE_REMOVE_BLIP(blipFranklin)
SAFE_REMOVE_BLIP(blipDestination)
IF IS_ENTITY_ATTACHED(PLAYER_PED(CHAR_MICHAEL))
DETACH_ENTITY(PLAYER_PED(CHAR_MICHAEL))
SET_ENABLE_BOUND_ANKLES(PLAYER_PED(CHAR_MICHAEL), FALSE)
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
ENDIF
SET_PED_CONFIG_FLAG(PLAYER_PED(CHAR_FRANKLIN), PCF_ForcedToStayInCover, FALSE)
IF DOES_CAM_EXIST(camAnim)
DESTROY_CAM(camAnim)
ENDIF
INT i
REPEAT COUNT_OF(sEnemyBackup) i
IF DOES_ENTITY_EXIST(sEnemyBackup[i].pedIndex)
AND NOT IS_PED_INJURED(sEnemyBackup[i].pedIndex)
SET_ENTITY_VISIBLE(sEnemyBackup[i].pedIndex, TRUE)
FREEZE_ENTITY_POSITION(sEnemyBackup[i].pedIndex, FALSE)
ENDIF
ENDREPEAT
REPEAT iEnemyBackup i
SET_PED_AS_NO_LONGER_NEEDED(sEnemyBackup[i].pedIndex)
SAFE_REMOVE_BLIP(sEnemyBackup[i].blipIndex)
ENDREPEAT
REPEAT iEnemySetPiece i
SET_PED_AS_NO_LONGER_NEEDED(sEnemySetPiece[i].pedIndex)
SAFE_REMOVE_BLIP(sEnemySetPiece[i].blipIndex)
ENDREPEAT
RELEASE_NAMED_SCRIPT_AUDIO_BANK("Michael_2_Break_Free")
REMOVE_CLIP_SET(GET_CLIP_SET_FOR_SCRIPTED_GUN_TASK(SCRIPTED_GUN_TASK_HANGING_UPSIDE_DOWN))
CLEAR_MISSION_LOCATE_STUFF(sLocatesData, TRUE)
eMissionObjective = INT_TO_ENUM(MissionObjective, ENUM_TO_INT(eMissionObjective) + 1)
ENDIF
ENDPROC
PROC michaelFree()
IF INIT_STAGE()
//Replay
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(ENUM_TO_INT(replayMichaelFree), "stageMichaelFree")
//Uncapped
bSetUncapped = TRUE
//Wanted
SET_MAX_WANTED_LEVEL(0)
SET_WANTED_LEVEL_MULTIPLIER(0.0)
//Ambulances etc.
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)
ENABLE_DISPATCH_SERVICE(DT_GANGS, FALSE)
IF CAN_CREATE_RANDOM_COPS()
SET_CREATE_RANDOM_COPS(FALSE)
ENDIF
//Player
SAFE_SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
//Radar
bRadar = TRUE
//Vehicle
IF NOT DOES_ENTITY_EXIST(vehHachiRoku)
vehHachiRoku = CREATE_VEHICLE(COQUETTE, <<950.4739, -2104.9517, 29.6107>>, 106.1659)
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(vehHachiRoku, TRUE)
SET_VEHICLE_COLOURS(vehHachiRoku, 4, 0)
SET_VEHICLE_EXTRA_COLOURS(vehHachiRoku, 0, 0)
SET_VEHICLE_ON_GROUND_PROPERLY(vehHachiRoku)
SET_VEHICLE_TYRES_CAN_BURST(vehHachiRoku, FALSE)
SET_MODEL_AS_NO_LONGER_NEEDED(COQUETTE)
ENDIF
IF NOT DOES_ENTITY_EXIST(vehEscape)
vehEscape = CREATE_VEHICLE(FELTZER2, <<953.9548, -2113.3518, 29.5516>>, 88.1350)
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(vehEscape, TRUE)
SET_VEHICLE_COLOURS(vehEscape, 38, 0)
SET_VEHICLE_ON_GROUND_PROPERLY(vehEscape)
SET_VEHICLE_TYRES_CAN_BURST(vehEscape, FALSE)
SET_MODEL_AS_NO_LONGER_NEEDED(FELTZER2)
ENDIF
//Rail
bOkToMoveRail = FALSE
bOkToHangFromHook = FALSE
//Audio
PLAY_AUDIO(MIC2_FRANK_SAVED)
#IF IS_DEBUG_BUILD
IF bAutoSkipping = FALSE
#ENDIF
//Audio Scene
IF NOT IS_AUDIO_SCENE_ACTIVE("MI_2_ESCAPE_SHOOTOUT")
START_AUDIO_SCENE("MI_2_ESCAPE_SHOOTOUT")
ENDIF
SAFE_ADD_BLIP_PED(blipFranklin, sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], FALSE)
//Crates
IF NOT DOES_ENTITY_EXIST(objCrate[0])
objCrate[0] = CREATE_OBJECT_NO_OFFSET(PROP_WATERCRATE_01, <<985.1165, -2111.0317, 29.4751>>)
RETAIN_ENTITY_IN_INTERIOR(objCrate[0], intAbattoir)
ENDIF
IF NOT DOES_ENTITY_EXIST(objCrate[1])
objCrate[1] = CREATE_OBJECT_NO_OFFSET(PROP_WATERCRATE_01, <<977.4531, -2128.1602, 29.4753>>)
RETAIN_ENTITY_IN_INTERIOR(objCrate[1], intAbattoir)
ENDIF
IF NOT DOES_ENTITY_EXIST(objCrate[2])
objCrate[2] = CREATE_OBJECT_NO_OFFSET(PROP_WATERCRATE_01, <<987.7, -2125.6, 29.4753>>)
RETAIN_ENTITY_IN_INTERIOR(objCrate[2], intAbattoir)
ENDIF
//Cover
IF NOT DOES_SCRIPTED_COVER_POINT_EXIST_AT_COORDS(<<996.3627, -2142.4551, 28.4762>>)
covPoint[13] = ADD_COVER_POINT(<<996.3627, -2142.4551, 28.4762>>, 4.7376, COVUSE_WALLTORIGHT, COVHEIGHT_TOOHIGH, COVARC_120)
ENDIF
IF NOT DOES_SCRIPTED_COVER_POINT_EXIST_AT_COORDS(<<993.2383, -2131.0708, 29.4758>>)
covPoint[16] = ADD_COVER_POINT(<<993.2383, -2131.0708, 29.4758>>, 11.4085, COVUSE_WALLTOLEFT, COVHEIGHT_LOW, COVARC_120)
ENDIF
IF NOT DOES_SCRIPTED_COVER_POINT_EXIST_AT_COORDS(<<989.3762, -2108.0239, 29.4751>>)
covPoint[17] = ADD_COVER_POINT(<<989.3762, -2108.0239, 29.4751>>, 178.0079, COVUSE_WALLTOLEFT, COVHEIGHT_TOOHIGH, COVARC_120, TRUE)
ENDIF
ADD_COVER_BLOCKING_AREA(<<985.11951, -2110.06934, 29.47508>>, <<984.31635, -2110.86963, 29.47506>>, TRUE, TRUE, TRUE)
ADD_COVER_BLOCKING_AREA(<<990.234863, -2109.403076, 29.475147>>, <<991.734863, -2107.903076, 35.475147>>, TRUE, TRUE, TRUE)
ADD_COVER_BLOCKING_AREA(<<984.292725, -2125.887451, 29.475412>>, <<985.292725, -2124.887451, 33.475412>>, TRUE, TRUE, TRUE)
ADD_COVER_BLOCKING_AREA(<<971.352966, -2122.628662, 30.562727>> - <<0.25, 0.25, 1.25>>, <<971.352966, -2122.628662, 30.562727>> + <<0.25, 0.25, 1.25>>, TRUE, TRUE, TRUE)
ADD_COVER_BLOCKING_AREA(<<967.890320,-2120.730469,31.229494>> - <<0.75, 1.0, 1.0>>, <<967.890320,-2120.730469,31.229494>> + <<0.75, 1.0, 1.0>>, TRUE, TRUE, TRUE)
//Navmesh Blocking Areas
IF iNavBlock[1] = 0
iNavBlock[1] = ADD_NAVMESH_BLOCKING_OBJECT(<<992.0, -2121.8, 29.5>>, <<4.0, 20.0, 10.0>>, (-5.0 / 360) * 6.28)
PRINTLN("ADD_NAVMESH_BLOCKING_OBJECT | iNavBlock[1] = ", iNavBlock[1])
ENDIF
IF iNavBlock[2] = 0
iNavBlock[2] = ADD_NAVMESH_BLOCKING_OBJECT(<<1001.1, -2121.8, 29.5>>, <<4.6, 20.0, 10.0>>, (-5.0 / 360) * 6.28)
PRINTLN("ADD_NAVMESH_BLOCKING_OBJECT | iNavBlock[2] = ", iNavBlock[2])
ENDIF
IF iNavBlock[3] = 0
iNavBlock[3] = ADD_NAVMESH_BLOCKING_OBJECT(<<984.1, -2135.5, 29.0>>, <<8.3, 8.0, 10.0>>, (-5.250 / 360) * 6.28)
PRINTLN("ADD_NAVMESH_BLOCKING_OBJECT | iNavBlock[3] = ", iNavBlock[3])
ENDIF
IF iNavBlock[4] = 0
iNavBlock[4] = ADD_NAVMESH_BLOCKING_OBJECT(<<984.791199, -2115.926270, 31.313723>>, <<1.75, 3.75, 2.0>>, 0.0)
PRINTLN("ADD_NAVMESH_BLOCKING_OBJECT | iNavBlock[4] = ", iNavBlock[4])
ENDIF
//Enemies
//Set Piece
createEnemy(sEnemySetPiece[SET_PIECE_CONVEYOR], <<981.4547, -2120.6746, 29.4753>>, 333.5943, WEAPONTYPE_ASSAULTRIFLE) //Checkme
createEnemy(sEnemySetPiece[SET_PIECE_COW], <<967.1338, -2106.4326, 30.4775>>, 176.0, WEAPONTYPE_PISTOL)
IF DOES_ENTITY_EXIST(sEnemySetPiece[SET_PIECE_CONVEYOR].pedIndex)
//RETAIN_ENTITY_IN_INTERIOR(sEnemySetPiece[SET_PIECE_CONVEYOR].pedIndex, intAbattoir)
//SET_PED_CAN_RAGDOLL(sEnemySetPiece[SET_PIECE_CONVEYOR].pedIndex, FALSE)
SET_PED_CONFIG_FLAG(sEnemySetPiece[SET_PIECE_CONVEYOR].pedIndex, PCF_DontActivateRagdollFromBulletImpact, TRUE)
//SET_PED_CONFIG_FLAG(sEnemySetPiece[SET_PIECE_CONVEYOR].pedIndex, PCF_DontActivateRagdollFromExplosions, TRUE)
SET_PED_CONFIG_FLAG(sEnemySetPiece[SET_PIECE_CONVEYOR].pedIndex, PCF_DontActivateRagdollFromElectrocution, TRUE)
SET_PED_CONFIG_FLAG(sEnemySetPiece[SET_PIECE_CONVEYOR].pedIndex, PCF_DontActivateRagdollFromFire, TRUE)
SET_RAGDOLL_BLOCKING_FLAGS(sEnemySetPiece[SET_PIECE_CONVEYOR].pedIndex, RBF_BULLET_IMPACT | RBF_EXPLOSION | RBF_ELECTROCUTION | RBF_FIRE | RBF_RUBBER_BULLET)
//SET_ENTITY_PROOFS(sEnemySetPiece[SET_PIECE_CONVEYOR].pedIndex, FALSE, FALSE, TRUE, FALSE, FALSE)
SET_PED_COMBAT_MOVEMENT(sEnemySetPiece[SET_PIECE_CONVEYOR].pedIndex, CM_STATIONARY)
SET_PED_SUFFERS_CRITICAL_HITS(sEnemySetPiece[SET_PIECE_CONVEYOR].pedIndex, FALSE)
SET_PED_MAX_HEALTH(sEnemySetPiece[SET_PIECE_CONVEYOR].pedIndex, 1000)
SET_ENTITY_HEALTH(sEnemySetPiece[SET_PIECE_CONVEYOR].pedIndex, 1000)
ENDIF
IF DOES_ENTITY_EXIST(sEnemySetPiece[SET_PIECE_COW].pedIndex)
//RETAIN_ENTITY_IN_INTERIOR(sEnemySetPiece[SET_PIECE_COW].pedIndex, intAbattoir)
SET_PED_COMBAT_MOVEMENT(sEnemySetPiece[SET_PIECE_COW].pedIndex, CM_STATIONARY)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sEnemySetPiece[SET_PIECE_COW].pedIndex, TRUE)
ENDIF
//Escape
createEnemy(sEnemyEscape[0], <<985.5591, -2120.3320, 29.4990>>, 73.0589, WEAPONTYPE_SMG, G_M_M_CHIGOON_01)
SET_PED_COMBAT_MOVEMENT(sEnemyEscape[0].pedIndex, CM_DEFENSIVE)
createEnemy(sEnemyEscape[1], <<973.8496, -2126.1538, 29.4987>>, 341.4595, WEAPONTYPE_ASSAULTRIFLE)
sEnemyEscape[1].pedCheck[0] = sEnemyEscape[0].pedIndex sEnemyEscape[1].eAdvanceStyle[0] = GUN_TO_POINT sEnemyEscape[1].vPoint[0] = <<984.9330, -2126.6907, 29.4991>> sEnemyEscape[1].fSpeed[0] = PEDMOVE_WALK
//createEnemy(sEnemyEscape[2], <<977.23, -2116.37, 30.4615>>, -65.1603, WEAPONTYPE_SMG)
createEnemy(sEnemyEscape[3], <<965.7297, -2126.3198, 30.4936>>, 269.6515, WEAPONTYPE_PUMPSHOTGUN, G_M_M_CHIGOON_01)
sEnemyEscape[3].vLocate[0] = <<976.414978, -2125.813965, 31.498732>> sEnemyEscape[3].vLocSize[0] = <<15.0, 5.0, 2.0>> sEnemyEscape[3].eAdvanceStyle[0] = GUN_TO_POINT sEnemyEscape[3].vPoint[0] = <<959.6390, -2125.6313, 30.4828>> sEnemyEscape[3].fSpeed[0] = 0.5
createEnemy(sEnemyEscape[4], <<967.5165, -2121.6035, 30.4793>>, 175.4117, WEAPONTYPE_PISTOL, G_M_M_CHIGOON_01)
SET_PED_SPHERE_DEFENSIVE_AREA(sEnemyEscape[4].pedIndex, <<967.5165, -2121.6035, 30.4793>>, 1.5)
TASK_SEEK_COVER_TO_COORDS(sEnemyEscape[4].pedIndex, <<967.5165, -2121.6035, 30.4793>>, <<978.9468, -2125.8413, 29.4752>>, -1, TRUE)
createEnemy(sEnemyEscape[5], <<968.5446, -2105.6531, 30.4971>>, 93.5294, WEAPONTYPE_SMG)
createEnemy(sEnemyEscape[6], <<952.9742, -2124.7236, 30.4485>>, 266.8633, WEAPONTYPE_PISTOL)
createEnemy(sEnemyEscape[7], <<958.5165, -2123.0886, 30.4577>>, 263.1990, WEAPONTYPE_PISTOL)
INT i
REPEAT COUNT_OF(sEnemyEscape) i
IF DOES_ENTITY_EXIST(sEnemyEscape[i].pedIndex)
//RETAIN_ENTITY_IN_INTERIOR(sEnemyEscape[i].pedIndex, intAbattoir)
ENDIF
ENDREPEAT
#IF IS_DEBUG_BUILD
REPEAT COUNT_OF(sEnemyEscape) i
IF NOT IS_PED_INJURED(sEnemyEscape[i].pedIndex)
ASSIGN_DEBUG_NAMES(sEnemyEscape[i].pedIndex, "sEnemyEscape ", i)
sEnemyEscape[i].sDebugName = CONCATENATE_STRINGS("sEnemyEscape ", GET_STRING_FROM_INT(i))
ENDIF
ENDREPEAT
#ENDIF
//Michael
SET_PED_CONFIG_FLAG(PLAYER_PED(CHAR_MICHAEL), PCF_RunFromFiresAndExplosions, FALSE)
SET_PED_CONFIG_FLAG(PLAYER_PED(CHAR_MICHAEL), PCF_DisableExplosionReactions, TRUE)
SET_PED_COMBAT_ATTRIBUTES(PLAYER_PED(CHAR_MICHAEL), CA_DISABLE_BULLET_REACTIONS, TRUE)
SET_PED_COMBAT_ATTRIBUTES(PLAYER_PED(CHAR_MICHAEL), CA_SWITCH_TO_ADVANCE_IF_CANT_FIND_COVER, FALSE)
SET_PED_COMBAT_MOVEMENT(PLAYER_PED(CHAR_MICHAEL), CM_DEFENSIVE)
SET_PED_ACCURACY(PLAYER_PED(CHAR_MICHAEL), 20)
SET_RAGDOLL_BLOCKING_FLAGS(PLAYER_PED(CHAR_MICHAEL), RBF_BULLET_IMPACT | RBF_PLAYER_BUMP | RBF_PLAYER_RAGDOLL_BUMP)
SET_PED_USING_ACTION_MODE(PLAYER_PED(CHAR_MICHAEL), TRUE, -1, "DEFAULT_ACTION")
//Franklin Combat
SET_PED_CONFIG_FLAG(PLAYER_PED(CHAR_FRANKLIN), PCF_RunFromFiresAndExplosions, FALSE)
SET_PED_CONFIG_FLAG(PLAYER_PED(CHAR_FRANKLIN), PCF_DisableExplosionReactions, TRUE)
SET_PED_COMBAT_ATTRIBUTES(PLAYER_PED(CHAR_FRANKLIN), CA_DISABLE_BULLET_REACTIONS, TRUE)
SET_PED_COMBAT_ATTRIBUTES(PLAYER_PED(CHAR_FRANKLIN), CA_SWITCH_TO_ADVANCE_IF_CANT_FIND_COVER, FALSE)
SET_PED_COMBAT_ATTRIBUTES(PLAYER_PED(CHAR_FRANKLIN), CA_DISABLE_PINNED_DOWN, TRUE)
SET_PED_COMBAT_MOVEMENT(PLAYER_PED(CHAR_FRANKLIN), CM_DEFENSIVE)
SET_PED_ACCURACY(PLAYER_PED(CHAR_FRANKLIN), 20)
SET_RAGDOLL_BLOCKING_FLAGS(PLAYER_PED(CHAR_FRANKLIN), RBF_BULLET_IMPACT)
IF NOT HAS_PED_GOT_WEAPON(PLAYER_PED(CHAR_FRANKLIN), WEAPONTYPE_ASSAULTRIFLE)
GIVE_WEAPON_TO_PED(PLAYER_PED(CHAR_FRANKLIN), WEAPONTYPE_ASSAULTRIFLE, 350, TRUE)
ENDIF
SET_CURRENT_PED_WEAPON(PLAYER_PED(CHAR_FRANKLIN), WEAPONTYPE_ASSAULTRIFLE, TRUE)
SET_ENTITY_PROOFS(PLAYER_PED(CHAR_FRANKLIN), FALSE, FALSE, FALSE, FALSE, FALSE)
SET_PED_USING_ACTION_MODE(PLAYER_PED(CHAR_FRANKLIN), TRUE, -1, "DEFAULT_ACTION")
//Skip Michael Forwards!
iCurrentNode = 31
vRailCurrent = sRailNodes[31].vPos
SET_ENTITY_COORDS_NO_OFFSET(objHook, sRailNodes[31].vPos)
SET_ENTITY_ROTATION(objHook, <<0.0, 0.0, -6.6>>) //sRailNodes[31].vRot
FREEZE_ENTITY_POSITION(objHook, TRUE)
#IF IS_DEBUG_BUILD
ENDIF
#ENDIF
IF SKIPPED_STAGE()
SET_PED_POSITION(PLAYER_PED(CHAR_MICHAEL), <<993.9323, -2150.0239, 28.4763>>, 354.8923, FALSE)
SET_PED_POSITION(PLAYER_PED(CHAR_FRANKLIN), <<998.3578, -2106.8503, 29.4754>>, 84.7433, FALSE)
//Freeze
SAFE_FREEZE_ENTITY_POSITION(PLAYER_PED(CHAR_MICHAEL), TRUE)
SAFE_FREEZE_ENTITY_POSITION(PLAYER_PED(CHAR_FRANKLIN), TRUE)
//Pin Interior
IF intAbattoir = NULL
intAbattoir = GET_INTERIOR_AT_COORDS_WITH_TYPE(<<990.9518, -2178.6208, 29.0257>>, "v_abattoir")
ENDIF
PIN_INTERIOR_IN_MEMORY(intAbattoir)
WHILE NOT IS_INTERIOR_READY(intAbattoir)
PRINTLN("PINNING INTERIOR...")
WAIT_WITH_DEATH_CHECKS(0)
ENDWHILE
bPinnedAbattoir = TRUE
//Unfreeze
SAFE_FREEZE_ENTITY_POSITION(PLAYER_PED(CHAR_MICHAEL), FALSE)
SAFE_FREEZE_ENTITY_POSITION(PLAYER_PED(CHAR_FRANKLIN), FALSE)
IF NOT bReplaySkip
LOAD_SCENE_ADV(<<996.5976, -2148.9912, 29.0>>)
ENDIF
WAIT_WITH_DEATH_CHECKS(0)
MAKE_PICKUPS()
REQUEST_WEAPON_ASSET(WEAPONTYPE_COMBATPISTOL)
REQUEST_WEAPON_ASSET(WEAPONTYPE_ASSAULTRIFLE)
WHILE NOT HAS_WEAPON_ASSET_LOADED(WEAPONTYPE_COMBATPISTOL)
OR NOT HAS_WEAPON_ASSET_LOADED(WEAPONTYPE_ASSAULTRIFLE)
PRINTLN("LOADING WEAPON ASSETS (WEAPONTYPE_COMBATPISTOL)...")
PRINTLN("LOADING WEAPON ASSETS (WEAPONTYPE_ASSAULTRIFLE)...")
WAIT_WITH_DEATH_CHECKS(0)
ENDWHILE
REMOVE_ALL_PED_WEAPONS(PLAYER_PED(CHAR_MICHAEL))
GIVE_WEAPON_TO_PED(PLAYER_PED(CHAR_MICHAEL), WEAPONTYPE_COMBATPISTOL, 350, TRUE)
SET_PED_AMMO(PLAYER_PED(CHAR_MICHAEL), WEAPONTYPE_COMBATPISTOL, 350)
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED(CHAR_MICHAEL))
SAFE_SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
//Franklin
IF NOT HAS_PED_GOT_WEAPON(PLAYER_PED(CHAR_FRANKLIN), WEAPONTYPE_ASSAULTRIFLE)
GIVE_WEAPON_TO_PED(PLAYER_PED(CHAR_FRANKLIN), WEAPONTYPE_ASSAULTRIFLE, 350, TRUE)
ENDIF
enumCharacterList eCharFail = GET_CURRENT_PLAYER_PED_ENUM()
IF GET_FAIL_WEAPON(ENUM_TO_INT(eCharFail)) != WEAPONTYPE_UNARMED AND GET_FAIL_WEAPON(ENUM_TO_INT(eCharFail)) != WEAPONTYPE_INVALID AND HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), GET_FAIL_WEAPON(ENUM_TO_INT(eCharFail)))
SET_CURRENT_PED_WEAPON(PLAYER_PED(CHAR_FRANKLIN), GET_FAIL_WEAPON(ENUM_TO_INT(eCharFail)), TRUE)
ELSE
SET_CURRENT_PED_WEAPON(PLAYER_PED(CHAR_FRANKLIN), WEAPONTYPE_ASSAULTRIFLE, TRUE)
ENDIF
//Dialogue
REMOVE_PED_FOR_DIALOGUE(sPedsForConversation, 0)
REMOVE_PED_FOR_DIALOGUE(sPedsForConversation, 1)
ADD_PED_FOR_DIALOGUE(sPedsForConversation, 0, PLAYER_PED(CHAR_MICHAEL), "MICHAEL")
ADD_PED_FOR_DIALOGUE(sPedsForConversation, 1, PLAYER_PED(CHAR_FRANKLIN), "FRANKLIN")
//Audio
PLAY_AUDIO(MIC2_MICHAEL_ESCAPE_RT)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(-10)
IF IS_SCREEN_FADED_OUT()
DO_SCREEN_FADE_IN(500)
ENDIF
ENDIF
ELSE
SWITCH iCutsceneStage
CASE 0
IF NOT HAS_LABEL_BEEN_TRIGGERED("FreeMichaelProgress")
IF NOT IS_MESSAGE_BEING_DISPLAYED()
AND (NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() OR GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) = 0)
//Blip
SAFE_ADD_BLIP_LOCATION(blipDestination, <<960.7275, -2105.6614, 30.9001>>)
//Objective
PRINT_ADV("MCH2_ESCABA")
ADVANCE_CUTSCENE()
ENDIF
ELSE //The AI behaviour should always progress after the initial wait for player has been reached
ADVANCE_CUTSCENE()
ENDIF
BREAK
CASE 1
IF (IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<996.805237, -2107.241699, 34.475368>>, <<8.0, 5.0, 5.0>>)
AND (NOT IS_ENTITY_PLAYING_ANIM(NOT_PLAYER_PED_ID(), sAnimDictMic2FranklinBeckon, "beckon_a_player1")
AND NOT IS_ENTITY_PLAYING_ANIM(NOT_PLAYER_PED_ID(), sAnimDictMic2FranklinBeckon, "beckon_b_player1")))
OR HAS_LABEL_BEEN_TRIGGERED("FreeMichaelProgress")
IF NOT IS_PED_INJURED(sEnemyEscape[0].pedIndex)
OR NOT IS_PED_INJURED(sEnemyEscape[1].pedIndex)
SET_PED_SPHERE_DEFENSIVE_AREA(NOT_PLAYER_PED_ID(), <<985.3551, -2110.1902, 29.4751>>, 10.0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NOT_PLAYER_PED_ID(), FALSE)
SET_PED_COMBAT_ATTRIBUTES(NOT_PLAYER_PED_ID(), CA_CAN_IGNORE_BLOCKED_LOS_WEIGHTING, TRUE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NOT_PLAYER_PED_ID(), 100.0, COMBAT_PED_DISABLE_AIM_INTRO)
ENDIF
SET_LABEL_AS_TRIGGERED("FreeMichaelProgress", TRUE)
ADVANCE_CUTSCENE()
ELSE
IF IS_ENTITY_AT_COORD(NOT_PLAYER_PED_ID(), <<996.805237, -2107.241699, 34.475368>>, <<8.0, 5.0, 5.0>>)
IF NOT IS_PED_FACING_PED(NOT_PLAYER_PED_ID(), PLAYER_PED_ID(), 60.0)
IF GET_SCRIPT_TASK_STATUS(NOT_PLAYER_PED_ID(), SCRIPT_TASK_TURN_PED_TO_FACE_ENTITY) != PERFORMING_TASK
AND GET_SCRIPT_TASK_STATUS(NOT_PLAYER_PED_ID(), SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
TASK_TURN_PED_TO_FACE_COORD(NOT_PLAYER_PED_ID(), GET_ENTITY_COORDS(PLAYER_PED(CHAR_MICHAEL)))
ENDIF
ELSE
IF GET_GAME_TIMER() > iDialogueTimer[1]
IF NOT IS_ENTITY_PLAYING_ANIM(NOT_PLAYER_PED_ID(), sAnimDictMic2FranklinBeckon, "beckon_a_player1")
AND NOT IS_ENTITY_PLAYING_ANIM(NOT_PLAYER_PED_ID(), sAnimDictMic2FranklinBeckon, "beckon_b_player1")
INT iRandom
iRandom = GET_RANDOM_INT_IN_RANGE(0, 2)
IF iRandom = 0
TASK_PLAY_ANIM(NOT_PLAYER_PED_ID(), sAnimDictMic2FranklinBeckon, "beckon_a_player1", REALLY_SLOW_BLEND_IN, REALLY_SLOW_BLEND_OUT, -1, AF_UPPERBODY | AF_SECONDARY)
ELIF iRandom = 1
TASK_PLAY_ANIM(NOT_PLAYER_PED_ID(), sAnimDictMic2FranklinBeckon, "beckon_b_player1", REALLY_SLOW_BLEND_IN, REALLY_SLOW_BLEND_OUT, -1, AF_UPPERBODY | AF_SECONDARY)
ENDIF
IF (NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() OR GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) = 0)
IF iDialogueLineCount[4] = -1
iDialogueLineCount[4] = 4
ENDIF
IF iDialogueLineCount[4] > 0
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED(CHAR_FRANKLIN)), GET_ENTITY_COORDS(PLAYER_PED(CHAR_MICHAEL))) < 50.0
enumSubtitlesState eSubtitles
IF NOT IS_MESSAGE_BEING_DISPLAYED()
eSubtitles = DISPLAY_SUBTITLES
ELSE
eSubtitles = DO_NOT_DISPLAY_SUBTITLES
ENDIF
CREATE_CONVERSATION_ADV("MCH2_MWRONG", CONV_PRIORITY_MEDIUM, FALSE, eSubtitles)
iDialogueLineCount[4]--
ENDIF
ENDIF
ENDIF
iDialogueTimer[1] = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(5000, 7500)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE 2
IF IS_PED_INJURED(sEnemyEscape[0].pedIndex)
AND IS_PED_INJURED(sEnemyEscape[1].pedIndex)
//AND IS_PED_INJURED(sEnemyEscape[2].pedIndex)
AND IS_PED_INJURED(sEnemySetPiece[SET_PIECE_MINCER].pedIndex)
IF NOT IS_PED_INJURED(sEnemyEscape[3].pedIndex)
OR NOT IS_PED_INJURED(sEnemyEscape[4].pedIndex)
//Combat
CLEAR_PED_TASKS(NOT_PLAYER_PED_ID())
SET_PED_SPHERE_DEFENSIVE_AREA(NOT_PLAYER_PED_ID(), <<972.0844, -2122.0654, 29.4749>>, 2.0, TRUE)
SET_PED_SPHERE_DEFENSIVE_AREA(NOT_PLAYER_PED_ID(), <<978.3341, -2128.0117, 29.4753>>, 2.0, TRUE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(NOT_PLAYER_PED_ID(), CA_CAN_IGNORE_BLOCKED_LOS_WEIGHTING, FALSE)
IF NOT IS_ENTITY_AT_COORD(NOT_PLAYER_PED_ID(), <<972.0844, -2122.0654, 29.4749>>, <<4.0, 4.0, 3.0>>)
AND NOT IS_ENTITY_AT_COORD(NOT_PLAYER_PED_ID(), <<978.3341, -2128.0117, 29.4753>>, <<4.0, 4.0, 3.0>>)
OPEN_SEQUENCE_TASK(seqMain)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
TASK_GO_TO_COORD_AND_AIM_AT_HATED_ENTITIES_NEAR_COORD(NULL, <<985.8, -2126.6, 29.4753>>, <<963.8723, -2125.1963, 30.4913>>, PEDMOVE_RUN, TRUE, 2.0)
//TASK_SEEK_COVER_TO_COORDS(NULL, <<978.3341, -2128.0117, 29.4753>>, <<963.8723, -2125.1963, 30.4913>>, 1000, TRUE)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
CLOSE_SEQUENCE_TASK(seqMain)
TASK_PERFORM_SEQUENCE(NOT_PLAYER_PED_ID(), seqMain)
CLEAR_SEQUENCE_TASK(seqMain)
ENDIF
ENDIF
ADVANCE_CUTSCENE()
ENDIF
BREAK
CASE 3
IF IS_PED_INJURED(sEnemyEscape[3].pedIndex)
AND IS_PED_INJURED(sEnemyEscape[4].pedIndex)
AND IS_PED_INJURED(sEnemyEscape[6].pedIndex)
AND IS_PED_INJURED(sEnemyEscape[7].pedIndex)
IF NOT IS_PED_INJURED(sEnemyEscape[5].pedIndex)
//AND NOT IS_PED_INJURED(sEnemySetPiece[SET_PIECE_COW].pedIndex) //sEnemyEscape[6].pedIndex)
//Combat
CLEAR_PED_TASKS(NOT_PLAYER_PED_ID())
SET_PED_SPHERE_DEFENSIVE_AREA(NOT_PLAYER_PED_ID(), <<968.1083, -2122.2932, 30.4033>>, 2.0, TRUE)
SET_PED_SPHERE_DEFENSIVE_AREA(NOT_PLAYER_PED_ID(), <<962.6502, -2125.5088, 30.4637>>, 4.0, TRUE, TRUE)
IF NOT IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<968.1083, -2122.2932, 30.4033>>, <<2.0, 2.0, 2.0>>)
IF NOT IS_ENTITY_AT_COORD(NOT_PLAYER_PED_ID(), <<968.1083, -2122.2932, 30.4033>>, <<4.0, 4.0, 3.0>>)
AND NOT IS_ENTITY_AT_COORD(NOT_PLAYER_PED_ID(), <<962.6502, -2125.5088, 30.4637>>, <<4.0, 4.0, 3.0>>)
OPEN_SEQUENCE_TASK(seqMain)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
TASK_GO_TO_COORD_AND_AIM_AT_HATED_ENTITIES_NEAR_COORD(NULL, <<968.2432, -2122.7563, 30.3472>>, <<965.9512, -2111.9126, 30.4946>>, PEDMOVE_RUN, TRUE, 1.0, 4.0, TRUE, ENAV_NO_STOPPING, GO_TO_AIM_AT_GOTO_COORD_IF_TARGET_LOS_BLOCKED)
TASK_PUT_PED_DIRECTLY_INTO_COVER(NULL, <<968.0346, -2122.3384, 30.4009>>, -1, TRUE, 1.0, TRUE, TRUE, NULL, TRUE)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
CLOSE_SEQUENCE_TASK(seqMain)
TASK_PERFORM_SEQUENCE(NOT_PLAYER_PED_ID(), seqMain)
CLEAR_SEQUENCE_TASK(seqMain)
ENDIF
ENDIF
ENDIF
ADVANCE_CUTSCENE()
ENDIF
BREAK
CASE 4
IF GET_SCRIPT_TASK_STATUS(NOT_PLAYER_PED_ID(), SCRIPT_TASK_PERFORM_SEQUENCE) = PERFORMING_TASK
SET_PED_RESET_FLAG(NOT_PLAYER_PED_ID(), PRF_BlockCustomAIEntryAnims, TRUE)
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<968.0346, -2122.3384, 30.4009>>, <<2.0, 2.0, 2.0>>)
AND IS_PED_IN_COVER(PLAYER_PED_ID())
CLEAR_PED_TASKS(NOT_PLAYER_PED_ID())
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NOT_PLAYER_PED_ID(), FALSE)
ENDIF
ENDIF
IF NOT IS_PED_IN_COMBAT(NOT_PLAYER_PED_ID())
AND IS_PED_IN_COVER(NOT_PLAYER_PED_ID())
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NOT_PLAYER_PED_ID(), 50.0)
ENDIF
IF IS_PED_INJURED(sEnemyEscape[5].pedIndex)
AND IS_PED_INJURED(sEnemySetPiece[SET_PIECE_COW].pedIndex) //sEnemyEscape[6].pedIndex)
//Combat
CLEAR_PED_TASKS(NOT_PLAYER_PED_ID())
REMOVE_PED_DEFENSIVE_AREA(NOT_PLAYER_PED_ID())
REMOVE_PED_DEFENSIVE_AREA(NOT_PLAYER_PED_ID(), TRUE)
OPEN_SEQUENCE_TASK(seqMain)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<957.6793, -2107.4541, 29.5544>>, PEDMOVE_RUN, DEFAULT_TIME_NEVER_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_DEFAULT, 89.4953)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
CLOSE_SEQUENCE_TASK(seqMain)
TASK_PERFORM_SEQUENCE(NOT_PLAYER_PED_ID(), seqMain)
CLEAR_SEQUENCE_TASK(seqMain)
ADVANCE_CUTSCENE()
ENDIF
BREAK
ENDSWITCH
IF (NOT IS_MESSAGE_BEING_DISPLAYED() OR GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) = 0)
AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF HAS_LABEL_BEEN_TRIGGERED("FreeMichaelProgress")
IF GET_GAME_TIMER() > iDialogueTimer[0]
IF iDialogueStage = 0
IF iDialogueLineCount[iDialogueStage] = -1
iDialogueLineCount[iDialogueStage] = 4
ENDIF
ELIF iDialogueStage = 1
IF iDialogueLineCount[iDialogueStage] = -1
iDialogueLineCount[iDialogueStage] = 6
ENDIF
ELIF iDialogueStage = 2
IF iDialogueLineCount[iDialogueStage] = -1
iDialogueLineCount[iDialogueStage] = 4
ENDIF
ELIF iDialogueStage = 3
IF iDialogueLineCount[iDialogueStage] = -1
iDialogueLineCount[iDialogueStage] = 6
ENDIF
ENDIF
IF iDialogueLineCount[iDialogueStage] > 0
IF DOES_ENTITY_EXIST(pedClosestEnemy)
AND NOT IS_ENTITY_DEAD(pedClosestEnemy)
AND GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(pedClosestEnemy)) < 20.0
AND IS_ENTITY_ON_SCREEN(pedClosestEnemy)
IF iDialogueStage = 0
CREATE_CONVERSATION_ADV("MCH2_ESCRF", CONV_PRIORITY_MEDIUM, FALSE)
ELIF iDialogueStage = 1
ADD_PED_FOR_DIALOGUE(sPedsForConversation, 5, pedClosestEnemy, "MCH2CHIN3")
CREATE_CONVERSATION_ADV("MCH2_AFTER", CONV_PRIORITY_MEDIUM, FALSE)
ELIF iDialogueStage = 2
PLAY_SINGLE_LINE_FROM_CONVERSATION_ADV("MCH2_ESCRM", "MCH2_ESCRM_02") //CREATE_CONVERSATION_ADV("MCH2_ESCRM", CONV_PRIORITY_MEDIUM, FALSE)
ELIF iDialogueStage = 3
ADD_PED_FOR_DIALOGUE(sPedsForConversation, 6, pedClosestEnemy, "MCH2CHIN4")
CREATE_CONVERSATION_ADV("MCH2_AFTER4", CONV_PRIORITY_MEDIUM, FALSE)
ENDIF
iDialogueTimer[0] = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(4000, 7000)
iDialogueLineCount[iDialogueStage]--
ENDIF
ENDIF
IF iDialogueStage < 3
iDialogueStage++
ELSE
iDialogueStage = 0
ENDIF
ENDIF
ENDIF
ENDIF
//Open Combat
IF NOT HAS_LABEL_BEEN_TRIGGERED("OpenCombat11")
IF NOT IS_PED_INJURED(sEnemyEscape[0].pedIndex)
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<986.739502, -2109.038330, 31.225237>>, <<3.0, 4.0, 3.0>>)
OPEN_SEQUENCE_TASK(seqMain)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, TRUE)
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(NULL, <<987.7, -2110.5, 29.4990>>, PLAYER_PED_ID(), PEDMOVE_RUN, TRUE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
CLOSE_SEQUENCE_TASK(seqMain)
TASK_PERFORM_SEQUENCE(sEnemyEscape[0].pedIndex, seqMain)
CLEAR_SEQUENCE_TASK(seqMain)
SET_PED_DEFENSIVE_SPHERE_ATTACHED_TO_PED(sEnemyEscape[0].pedIndex, PLAYER_PED_ID(), VECTOR_ZERO, 3.0)
//REMOVE_PED_DEFENSIVE_AREA(sEnemyEscape[0].pedIndex)
//SET_PED_COMBAT_ATTRIBUTES(sEnemyEscape[0].pedIndex, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
//SET_PED_COMBAT_MOVEMENT(sEnemyEscape[0].pedIndex, CM_WILLADVANCE)
SET_PED_COMBAT_ATTRIBUTES(sEnemyEscape[0].pedIndex, CA_CAN_CHARGE, TRUE)
SET_PED_CONFIG_FLAG(sEnemyEscape[0].pedIndex, PCF_TreatAsPlayerDuringTargeting, TRUE)
SET_LABEL_AS_TRIGGERED("OpenCombat11", TRUE)
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("OpenCombat12")
IF NOT IS_PED_INJURED(sEnemyEscape[1].pedIndex)
IF IS_PED_INJURED(sEnemyEscape[0].pedIndex)
SET_PED_COMBAT_ATTRIBUTES(sEnemyEscape[1].pedIndex, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
SET_PED_COMBAT_MOVEMENT(sEnemyEscape[1].pedIndex, CM_WILLADVANCE)
SET_LABEL_AS_TRIGGERED("OpenCombat12", TRUE)
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("OpenCombat13")
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<976.414978, -2125.813965, 31.498732>>, <<15.0, 5.0, 2.0>>)
SET_PED_COMBAT_ATTRIBUTES(sEnemyEscape[3].pedIndex, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
SET_PED_COMBAT_MOVEMENT(sEnemyEscape[3].pedIndex, CM_WILLADVANCE)
REMOVE_PED_DEFENSIVE_AREA(sEnemyEscape[6].pedIndex)
SET_PED_COMBAT_ATTRIBUTES(sEnemyEscape[6].pedIndex, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
SET_PED_COMBAT_MOVEMENT(sEnemyEscape[6].pedIndex, CM_WILLADVANCE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sEnemyEscape[6].pedIndex, 500.0)
REMOVE_PED_DEFENSIVE_AREA(sEnemyEscape[7].pedIndex)
SET_PED_COMBAT_ATTRIBUTES(sEnemyEscape[7].pedIndex, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
SET_PED_COMBAT_MOVEMENT(sEnemyEscape[7].pedIndex, CM_WILLADVANCE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sEnemyEscape[7].pedIndex, 500.0)
SET_LABEL_AS_TRIGGERED("OpenCombat13", TRUE)
ENDIF
ENDIF
IF NOT sCamDetails.bRun
IF iCutsceneStage <= 4
IF UPDATE_SELECTOR_HUD(sSelectorPeds) // Returns TRUE when the player has made a selection
IF NOT HAS_SELECTOR_PED_BEEN_SELECTED(sSelectorPeds, SELECTOR_PED_MULTIPLAYER)
CLEAR_PRINTS()
//Stats
INFORM_MISSION_STATS_OF_INCREMENT(MIC2_TIMES_SWITCHED)
sCamDetails.pedTo = sSelectorPeds.pedID[sSelectorPeds.eNewSelectorPed]
sCamDetails.bRun = TRUE
ENDIF
ENDIF
ENDIF
ELSE
IF RUN_SWITCH_CAM_FROM_PLAYER_TO_PED_SHORT_RANGE(sCamDetails)
IF sCamDetails.bOKToSwitchPed
IF NOT sCamDetails.bPedSwitched
IF TAKE_CONTROL_OF_SELECTOR_PED(sSelectorPeds, TRUE, TRUE, TCF_NONE)
//Dialogue
REMOVE_PED_FOR_DIALOGUE(sPedsForConversation, 0)
REMOVE_PED_FOR_DIALOGUE(sPedsForConversation, 1)
ADD_PED_FOR_DIALOGUE(sPedsForConversation, 0, PLAYER_PED(CHAR_MICHAEL), "MICHAEL")
ADD_PED_FOR_DIALOGUE(sPedsForConversation, 1, PLAYER_PED(CHAR_FRANKLIN), "FRANKLIN")
//Update the relationship groups
IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[CHAR_MICHAEL])
SET_PED_RELATIONSHIP_GROUP_HASH(sSelectorPeds.pedID[CHAR_MICHAEL], relGroupBuddy)
ENDIF
IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[CHAR_FRANKLIN])
SET_PED_RELATIONSHIP_GROUP_HASH(sSelectorPeds.pedID[CHAR_FRANKLIN], relGroupBuddy)
ENDIF
SET_PED_DEFENSIVE_AREA_ATTACHED_TO_PED(PLAYER_PED(CHAR_FRANKLIN), PLAYER_PED(CHAR_MICHAEL), <<5.0, 0.0, 5.0>>, <<-5.0, 0.0, -5.0>>, 5.0, TRUE)
SET_PED_DEFENSIVE_AREA_ATTACHED_TO_PED(PLAYER_PED(CHAR_MICHAEL), PLAYER_PED(CHAR_FRANKLIN), <<5.0, 0.0, 5.0>>, <<-5.0, 0.0, -5.0>>, 5.0, TRUE)
SET_RAGDOLL_BLOCKING_FLAGS(PLAYER_PED(CHAR_MICHAEL), RBF_BULLET_IMPACT | RBF_PLAYER_BUMP | RBF_PLAYER_RAGDOLL_BUMP)
SET_RAGDOLL_BLOCKING_FLAGS(PLAYER_PED(CHAR_FRANKLIN), RBF_BULLET_IMPACT)
SAFE_REMOVE_BLIP(blipMichael)
SAFE_REMOVE_BLIP(blipFranklin)
IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
SAFE_ADD_BLIP_PED(blipMichael, sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], FALSE)
SET_PED_COMBAT_ATTRIBUTES(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], CA_DISABLE_PIN_DOWN_OTHERS, TRUE)
ENDIF
IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
SAFE_ADD_BLIP_PED(blipFranklin, sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], FALSE)
SET_PED_COMBAT_ATTRIBUTES(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], CA_DISABLE_PIN_DOWN_OTHERS, TRUE)
ENDIF
SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), TRUE)
SET_PED_USING_ACTION_MODE(NOT_PLAYER_PED_ID(), TRUE, -1, "DEFAULT_ACTION")
IF GET_ENTITY_HEALTH(PLAYER_PED(CHAR_MICHAEL)) < GET_PED_MAX_HEALTH(PLAYER_PED(CHAR_MICHAEL)) / 2
SET_ENTITY_HEALTH(PLAYER_PED(CHAR_MICHAEL), GET_PED_MAX_HEALTH(PLAYER_PED(CHAR_MICHAEL)) / 2)
ENDIF
IF GET_ENTITY_HEALTH(PLAYER_PED(CHAR_FRANKLIN)) < GET_PED_MAX_HEALTH(PLAYER_PED(CHAR_FRANKLIN)) / 2
SET_ENTITY_HEALTH(PLAYER_PED(CHAR_FRANKLIN), GET_PED_MAX_HEALTH(PLAYER_PED(CHAR_FRANKLIN)) / 2)
ENDIF
IF iCutsceneStage > 0
iCutsceneStage-- PRINTLN("iCutsceneStage = ", iCutsceneStage) //Should re-assign the tasks
ENDIF
IF GET_CURRENT_PLAYER_PED_ENUM() != CHAR_MICHAEL
IF NOT HAS_PED_GOT_WEAPON(NOT_PLAYER_PED_ID(), WEAPONTYPE_COMBATPISTOL)
GIVE_WEAPON_TO_PED(NOT_PLAYER_PED_ID(), WEAPONTYPE_COMBATPISTOL, (GET_WEAPON_CLIP_SIZE(WEAPONTYPE_COMBATPISTOL) * 2), TRUE)
ENDIF
IF GET_AMMO_IN_PED_WEAPON(NOT_PLAYER_PED_ID(), WEAPONTYPE_COMBATPISTOL) < (GET_WEAPON_CLIP_SIZE(WEAPONTYPE_COMBATPISTOL) * 2)
SET_PED_AMMO(NOT_PLAYER_PED_ID(), WEAPONTYPE_COMBATPISTOL, (GET_WEAPON_CLIP_SIZE(WEAPONTYPE_COMBATPISTOL) * 2))
ENDIF
SET_CURRENT_PED_WEAPON(NOT_PLAYER_PED_ID(), WEAPONTYPE_COMBATPISTOL, TRUE)
ENDIF
IF GET_CURRENT_PLAYER_PED_ENUM() != CHAR_FRANKLIN
IF NOT HAS_PED_GOT_WEAPON(NOT_PLAYER_PED_ID(), WEAPONTYPE_ASSAULTRIFLE)
GIVE_WEAPON_TO_PED(NOT_PLAYER_PED_ID(), WEAPONTYPE_ASSAULTRIFLE, (GET_WEAPON_CLIP_SIZE(WEAPONTYPE_ASSAULTRIFLE) * 2), TRUE)
ENDIF
IF GET_AMMO_IN_PED_WEAPON(NOT_PLAYER_PED_ID(), WEAPONTYPE_ASSAULTRIFLE) < (GET_WEAPON_CLIP_SIZE(WEAPONTYPE_ASSAULTRIFLE) * 2)
SET_PED_AMMO(NOT_PLAYER_PED_ID(), WEAPONTYPE_ASSAULTRIFLE, (GET_WEAPON_CLIP_SIZE(WEAPONTYPE_ASSAULTRIFLE) * 2))
ENDIF
SET_CURRENT_PED_WEAPON(NOT_PLAYER_PED_ID(), WEAPONTYPE_ASSAULTRIFLE, TRUE)
ENDIF
sCamDetails.bPedSwitched = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT DOES_CAM_EXIST(sCamDetails.camID)
OR (DOES_CAM_EXIST(sCamDetails.camID)
AND NOT IS_CAM_ACTIVE(sCamDetails.camID))
// IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(NOT_PLAYER_PED_ID()), GET_ENTITY_COORDS(PLAYER_PED_ID())) > 25.0
// AND NOT IS_ENTITY_ON_SCREEN(NOT_PLAYER_PED_ID())
// AND iHealthStore = -1
// iHealthStore = GET_ENTITY_HEALTH(NOT_PLAYER_PED_ID())
// SET_ENTITY_HEALTH(NOT_PLAYER_PED_ID(), 101)
// ELIF iHealthStore > -1
// SET_ENTITY_HEALTH(NOT_PLAYER_PED_ID(), iHealthStore)
// iHealthStore = -1
// ENDIF
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(NOT_PLAYER_PED_ID()), GET_ENTITY_COORDS(PLAYER_PED_ID())) > 60.0
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
eMissionFail = failFranklinAbandon
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN
eMissionFail = failMichaelAbandon
ENDIF
missionFailed()
ENDIF
ENDIF
BOOL bEnemiesDead = TRUE
INT i
REPEAT COUNT_OF(sEnemyEscape) i
IF DOES_ENTITY_EXIST(sEnemyEscape[i].pedIndex)
IF NOT IS_PED_INJURED(sEnemyEscape[i].pedIndex)
bEnemiesDead = FALSE
ENDIF
ENDIF
ENDREPEAT
REPEAT COUNT_OF(sEnemySetPiece) i
IF DOES_ENTITY_EXIST(sEnemySetPiece[i].pedIndex)
IF NOT IS_PED_INJURED(sEnemySetPiece[i].pedIndex)
bEnemiesDead = FALSE
ENDIF
ENDIF
ENDREPEAT
IF bEnemiesDead = TRUE
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
AND (NOT IS_MESSAGE_BEING_DISPLAYED() OR GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) = 0)
CREATE_CONVERSATION_ADV("MCH2_ESCF3")
ENDIF
ENDIF
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
AND (NOT IS_MESSAGE_BEING_DISPLAYED() OR GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) = 0)
IF NOT HAS_LABEL_BEEN_TRIGGERED("MCH2_WAYM")
AND NOT HAS_LABEL_BEEN_TRIGGERED("MCH2_WAYF")
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(NOT_PLAYER_PED_ID()), GET_ENTITY_COORDS(PLAYER_PED_ID())) < 15.0
IF IS_ENTITY_AT_COORD(PLAYER_PED(CHAR_MICHAEL), <<966.969360, -2115.812988, 32.474960>>, <<4.0, 13.0, 3.0>>)
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
CREATE_CONVERSATION_ADV("MCH2_WAYM")
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN
CREATE_CONVERSATION_ADV("MCH2_WAYF")
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("ProgressStage")
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<958.522461, -2105.835449, 33.043030>>, <<4.0, 4.0, 2.5>>)
AND NOT IS_PED_IN_COMBAT(NOT_PLAYER_PED_ID())
SET_LABEL_AS_TRIGGERED("ProgressStage", TRUE)
ENDIF
ELIF iCutsceneStage > 4
ADVANCE_STAGE()
ENDIF
//Enemies can charge
IF NOT HAS_LABEL_BEEN_TRIGGERED("EnemiesCanCharge1")
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<988.917908, -2108.542236, 29.475147>>, <<989.372009, -2102.780029, 33.475086>>, 4.5)
SET_PED_COMBAT_ATTRIBUTES(sEnemyEscape[0].pedIndex, CA_CAN_CHARGE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(sEnemyEscape[1].pedIndex, CA_CAN_CHARGE, TRUE)
SET_LABEL_AS_TRIGGERED("EnemiesCanCharge1", TRUE)
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("EnemiesCanCharge2")
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<988.862610, -2126.699219, 29.475573>>, <<967.577759, -2124.836182, 34.478863>>, 7.0)
REPEAT COUNT_OF(sEnemyEscape) i
IF i > 1 AND i != 5
IF DOES_ENTITY_EXIST(sEnemyEscape[i].pedIndex)
AND NOT IS_PED_INJURED(sEnemyEscape[i].pedIndex)
SET_PED_COMBAT_ATTRIBUTES(sEnemyEscape[i].pedIndex, CA_CAN_CHARGE, TRUE)
ENDIF
ENDIF
ENDREPEAT
SET_LABEL_AS_TRIGGERED("EnemiesCanCharge2", TRUE)
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("EnemiesCanCharge3")
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<960.695251, -2124.824463, 30.460133>>, <<967.684204, -2125.457520, 34.436863>>, 7.0)
SET_PED_COMBAT_ATTRIBUTES(sEnemyEscape[5].pedIndex, CA_CAN_CHARGE, TRUE)
SET_LABEL_AS_TRIGGERED("EnemiesCanCharge3", TRUE)
ENDIF
ENDIF
//Conveyor
SWITCH iSetPiece[SET_PIECE_CONVEYOR]
CASE 0
IF DOES_ENTITY_EXIST(sEnemySetPiece[SET_PIECE_CONVEYOR].pedIndex)
PED_BONETAG pbt
GET_PED_LAST_DAMAGE_BONE(sEnemySetPiece[SET_PIECE_CONVEYOR].pedIndex, pbt)
IF NOT IS_PED_IN_COMBAT(sEnemySetPiece[SET_PIECE_CONVEYOR].pedIndex)
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<987.460327, -2105.635498, 31.975031>>, <<4.0, 3.5, 2.5>>)
OR IS_ENTITY_AT_COORD(NOT_PLAYER_PED_ID(), <<987.460327, -2105.635498, 31.975031>>, <<4.0, 3.5, 2.5>>)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sEnemySetPiece[SET_PIECE_CONVEYOR].pedIndex, 500.0)
ENDIF
ENDIF
IF NOT IS_ENTITY_DEAD(sEnemySetPiece[SET_PIECE_CONVEYOR].pedIndex)
IF GET_ENTITY_HEALTH(sEnemySetPiece[SET_PIECE_CONVEYOR].pedIndex) < 925
OR pbt = BONETAG_HEAD
OR IS_EXPLOSION_IN_SPHERE(EXP_TAG_DONTCARE, GET_ENTITY_COORDS(sEnemySetPiece[SET_PIECE_CONVEYOR].pedIndex), 5.0)
IF NOT IS_PED_INJURED(sEnemySetPiece[SET_PIECE_CONVEYOR].pedIndex)
IF IS_ENTITY_AT_COORD(sEnemySetPiece[SET_PIECE_CONVEYOR].pedIndex, <<981.4547, -2120.6746, 29.4753>>, <<0.5, 0.5, 3.5>>)
AND IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<984.946350, -2110.417969, 31.975075>>, <<7.0, 7.5, 5.0>>)
INFORM_MISSION_STATS_OF_INCREMENT(MIC2_UNIQUE_TRIAD_DEATHS)
SET_PED_CAN_BE_TARGETTED(sEnemySetPiece[SET_PIECE_CONVEYOR].pedIndex, FALSE)
//TASK_PLAY_ANIM_ADVANCED(sEnemySetPiece[SET_PIECE_CONVEYOR].pedIndex, sAnimDictMic2SetPiece2, "goon_fall_onto_conveyor", <<980.074, -2121.410, 29.482>>, <<0.0, 0.0, 0.0>>, SLOW_BLEND_IN, INSTANT_BLEND_OUT, -1, AF_FORCE_START | AF_EXTRACT_INITIAL_OFFSET | AF_NOT_INTERRUPTABLE | AF_OVERRIDE_PHYSICS | AF_IGNORE_GRAVITY | AF_HOLD_LAST_FRAME, 0.0, EULER_YXZ, AIK_DISABLE_LEG_IK)
sceneConveyor = CREATE_SYNCHRONIZED_SCENE(<<980.074, -2121.410, 29.482>>, <<0.0, 0.0, 0.0>>)
TASK_SYNCHRONIZED_SCENE(sEnemySetPiece[SET_PIECE_CONVEYOR].pedIndex, sceneConveyor, sAnimDictMic2SetPiece2, "goon_fall_onto_conveyor", SLOW_BLEND_IN, SLOW_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT, RBF_NONE, SLOW_BLEND_IN, AIK_DISABLE_LEG_IK)
SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(sceneConveyor, TRUE)
FORCE_PED_AI_AND_ANIMATION_UPDATE(sEnemySetPiece[SET_PIECE_CONVEYOR].pedIndex)
SET_ENTITY_INVINCIBLE(sEnemySetPiece[SET_PIECE_CONVEYOR].pedIndex, TRUE)
SET_PED_CAN_BE_TARGETTED(sEnemySetPiece[SET_PIECE_CONVEYOR].pedIndex, FALSE)
PLAY_PAIN(sEnemySetPiece[SET_PIECE_CONVEYOR].pedIndex, AUD_DAMAGE_REASON_SCREAM_PANIC)
IF NOT bVideoRecording
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGH)
bVideoRecording = TRUE
ENDIF
SETTIMERB(0)
iSetPiece[SET_PIECE_CONVEYOR]++
ELSE
SET_ENTITY_HEALTH(sEnemySetPiece[SET_PIECE_CONVEYOR].pedIndex, 5)
APPLY_DAMAGE_TO_PED(sEnemySetPiece[SET_PIECE_CONVEYOR].pedIndex, 500, FALSE)
SAFE_REMOVE_BLIP(sEnemySetPiece[SET_PIECE_CONVEYOR].blipIndex)
iSetPiece[SET_PIECE_CONVEYOR] = 100
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE 1
IF IS_SYNCHRONIZED_SCENE_RUNNING(sceneConveyor) //IF IS_ENTITY_PLAYING_ANIM(sEnemySetPiece[SET_PIECE_CONVEYOR].pedIndex, sAnimDictMic2SetPiece2, "goon_fall_onto_conveyor")
AND GET_SYNCHRONIZED_SCENE_PHASE(sceneConveyor) >= 0.254 //AND GET_ENTITY_ANIM_CURRENT_TIME(sEnemySetPiece[SET_PIECE_CONVEYOR].pedIndex, sAnimDictMic2SetPiece2, "goon_fall_onto_conveyor") > 0.254
SETTIMERB(0)
iSetPiece[SET_PIECE_CONVEYOR]++
ENDIF
BREAK
CASE 2
IF IS_SYNCHRONIZED_SCENE_RUNNING(sceneConveyor) //IF IS_ENTITY_PLAYING_ANIM(sEnemySetPiece[SET_PIECE_CONVEYOR].pedIndex, sAnimDictMic2SetPiece2, "goon_fall_onto_conveyor")
AND GET_SYNCHRONIZED_SCENE_PHASE(sceneConveyor) >= 0.413 //AND GET_ENTITY_ANIM_CURRENT_TIME(sEnemySetPiece[SET_PIECE_CONVEYOR].pedIndex, sAnimDictMic2SetPiece2, "goon_fall_onto_conveyor") > 0.413
SHAKE_CAM(camMain, "ROAD_VIBRATION_SHAKE", 4.0)
SETTIMERB(0)
iSetPiece[SET_PIECE_CONVEYOR]++
ENDIF
BREAK
CASE 3
IF IS_SYNCHRONIZED_SCENE_RUNNING(sceneConveyor) //IF IS_ENTITY_PLAYING_ANIM(sEnemySetPiece[SET_PIECE_CONVEYOR].pedIndex, sAnimDictMic2SetPiece2, "goon_fall_onto_conveyor")
AND GET_SYNCHRONIZED_SCENE_PHASE(sceneConveyor) >= 0.525 //AND GET_ENTITY_ANIM_CURRENT_TIME(sEnemySetPiece[SET_PIECE_CONVEYOR].pedIndex, sAnimDictMic2SetPiece2, "goon_fall_onto_conveyor") > 0.525
//Audio Scene
IF NOT IS_AUDIO_SCENE_ACTIVE("MI_2_GRINDER_2")
START_AUDIO_SCENE("MI_2_GRINDER_2")
ENDIF
PLAY_PAIN(sEnemySetPiece[SET_PIECE_CONVEYOR].pedIndex, AUD_DAMAGE_REASON_ON_FIRE)
START_PARTICLE_FX_NON_LOOPED_AT_COORD("scr_abattoir_ped_minced", <<976.72, -2120.27, 31.5>>, VECTOR_ZERO)
PLAY_SOUND_FROM_COORD(-1, "MINCER_FALL", <<976.72, -2120.27, 31.5>>, "MICHAEL_2_SOUNDS")
IF NOT IS_MESSAGE_BEING_DISPLAYED()
AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF DOES_ENTITY_EXIST(pedClosestEnemy)
AND NOT IS_PED_INJURED(pedClosestEnemy)
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(pedClosestEnemy)) < 20.0
ADD_PED_FOR_DIALOGUE(sPedsForConversation, 7, pedClosestEnemy, "MCH2CHIN5")
CREATE_CONVERSATION_ADV("MCH2_EWW5")
ENDIF
ENDIF
ENDIF
SETTIMERB(0)
iSetPiece[SET_PIECE_CONVEYOR]++
ENDIF
BREAK
CASE 4
IF IS_SYNCHRONIZED_SCENE_RUNNING(sceneConveyor) //IF IS_ENTITY_PLAYING_ANIM(sEnemySetPiece[SET_PIECE_CONVEYOR].pedIndex, sAnimDictMic2SetPiece2, "goon_fall_onto_conveyor")
AND GET_SYNCHRONIZED_SCENE_PHASE(sceneConveyor) >= 1.000 //AND GET_ENTITY_ANIM_CURRENT_TIME(sEnemySetPiece[SET_PIECE_CONVEYOR].pedIndex, sAnimDictMic2SetPiece2, "goon_fall_onto_conveyor") >= 1.000
IF bVideoRecording
REPLAY_STOP_EVENT()
bVideoRecording = FALSE
ENDIF
//Audio Scene
IF IS_AUDIO_SCENE_ACTIVE("MI_2_GRINDER_2")
STOP_AUDIO_SCENE("MI_2_GRINDER_2")
ENDIF
SET_ENTITY_INVINCIBLE(sEnemySetPiece[SET_PIECE_CONVEYOR].pedIndex, FALSE)
IF NOT IS_PED_INJURED(sEnemySetPiece[SET_PIECE_CONVEYOR].pedIndex)
SET_ENTITY_HEALTH(sEnemySetPiece[SET_PIECE_CONVEYOR].pedIndex, 5)
APPLY_DAMAGE_TO_PED(sEnemySetPiece[SET_PIECE_CONVEYOR].pedIndex, 500, FALSE)
ENDIF
SAFE_REMOVE_BLIP(sEnemySetPiece[SET_PIECE_CONVEYOR].blipIndex)
SAFE_DELETE_PED(sEnemySetPiece[SET_PIECE_CONVEYOR].pedIndex)
// SAFE_SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
//
// STOP_CAM_SHAKING(camMain, TRUE)
// RENDER_SCRIPT_CAMS(FALSE, FALSE)
// SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
SETTIMERB(0)
iSetPiece[SET_PIECE_CONVEYOR]++
ENDIF
BREAK
// CASE 5
// IF TIMERB() > 1000
// SET_ENTITY_INVINCIBLE(PLAYER_PED_ID(), FALSE)
//
// SETTIMERB(0)
// iSetPiece[SET_PIECE_CONVEYOR]++
// ENDIF
// BREAK
ENDSWITCH
// IF NOT IS_GAMEPLAY_CAM_RENDERING()
// IF iSetPiece[SET_PIECE_CONVEYOR] > 2
// AND iSetPiece[SET_PIECE_CONVEYOR] < 100
// IF DOES_ENTITY_EXIST(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex)
// IF IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED_WITH_DELAY()
// IF IS_ENTITY_PLAYING_ANIM(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex, sAnimDictMic2SetPiece2, "goon_fall_onto_conveyor")
// SET_ENTITY_ANIM_CURRENT_TIME(sEnemySetPiece[SET_PIECE_CUTTER].pedIndex, sAnimDictMic2SetPiece2, "goon_fall_onto_conveyor", 1.000)
// ENDIF
//
// iSetPiece[SET_PIECE_CONVEYOR] = 4
// ENDIF
// ENDIF
// ENDIF
// ENDIF
//Cow
SWITCH iSetPiece[SET_PIECE_COW]
CASE 0
IF NOT IS_PED_INJURED(sEnemySetPiece[SET_PIECE_COW].pedIndex)
IF HAS_ANIM_DICT_LOADED_CHECK(sAnimDictMic2SetPiece2)
objCow = CREATE_OBJECT_NO_OFFSET(V_IND_COO_HALF, <<967.0997, -2108.2424, 34.3186>>)
iSetPiece[SET_PIECE_COW]++
ENDIF
ENDIF
BREAK
CASE 1
IF DOES_ENTITY_EXIST(objCow)
IF DOES_ENTITY_HAVE_DRAWABLE(objCow)
sceneCow = CREATE_SYNCHRONIZED_SCENE(sceneCowPos, sceneCowRot)
TASK_SYNCHRONIZED_SCENE(sEnemySetPiece[SET_PIECE_COW].pedIndex, sceneCow, sAnimDictMic2SetPiece2, "goon_pushcow_goon", INSTANT_BLEND_IN, WALK_BLEND_OUT)
FORCE_PED_AI_AND_ANIMATION_UPDATE(sEnemySetPiece[SET_PIECE_COW].pedIndex)
PLAY_SYNCHRONIZED_ENTITY_ANIM(objCow, sceneCow, "goon_pushcow_beef", sAnimDictMic2SetPiece2, INSTANT_BLEND_IN, WALK_BLEND_OUT)
SET_SYNCHRONIZED_SCENE_PHASE(sceneCow, 0.250)
SET_SYNCHRONIZED_SCENE_RATE(sceneCow, 0.0)
iSetPiece[SET_PIECE_COW]++
ENDIF
ENDIF
BREAK
CASE 2
IF NOT IS_PED_INJURED(sEnemySetPiece[SET_PIECE_COW].pedIndex)
IF IS_SYNCHRONIZED_SCENE_RUNNING(sceneCow)
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<967.617432, -2124.157959, 32.474319>>, <<1.5, 4.5, 2.5>>)
SET_SYNCHRONIZED_SCENE_RATE(sceneCow, 1.0)
IF NOT HAS_PED_GOT_WEAPON(sEnemySetPiece[SET_PIECE_COW].pedIndex, WEAPONTYPE_PISTOL)
GIVE_WEAPON_TO_PED(sEnemySetPiece[SET_PIECE_COW].pedIndex, WEAPONTYPE_PISTOL, INFINITE_AMMO, TRUE)
ENDIF
SET_CURRENT_PED_WEAPON(sEnemySetPiece[SET_PIECE_COW].pedIndex, WEAPONTYPE_PISTOL, TRUE)
PLAY_PED_AMBIENT_SPEECH(sEnemySetPiece[SET_PIECE_COW].pedIndex, "GENERIC_WAR_CRY", SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
IF sfxCow = -1
sfxCow = GET_SOUND_ID()
PLAY_SOUND_FROM_ENTITY(sfxCow, "MEAT_SLIDE", objCow, "MICHAEL_2_SOUNDS") //MIC_2_MEAT_SLIDE_ON_STOP_MASTER
ENDIF
iSetPiece[SET_PIECE_COW]++
ENDIF
ENDIF
ENDIF
BREAK
CASE 3
IF NOT IS_PED_INJURED(sEnemySetPiece[SET_PIECE_COW].pedIndex)
IF (IS_SYNCHRONIZED_SCENE_RUNNING(sceneCow)
AND GET_SYNCHRONIZED_SCENE_PHASE(sceneCow) >= 1.0)
OR NOT IS_SYNCHRONIZED_SCENE_RUNNING(sceneCow)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sEnemySetPiece[SET_PIECE_COW].pedIndex, FALSE)
REMOVE_PED_DEFENSIVE_AREA(sEnemySetPiece[SET_PIECE_COW].pedIndex)
SET_PED_COMBAT_ATTRIBUTES(sEnemySetPiece[SET_PIECE_COW].pedIndex, CA_REMOVE_AREA_SET_WILL_ADVANCE_WHEN_DEFENSIVE_AREA_REACHED, TRUE)
SET_PED_COMBAT_MOVEMENT(sEnemySetPiece[SET_PIECE_COW].pedIndex, CM_WILLADVANCE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sEnemySetPiece[SET_PIECE_COW].pedIndex, 500.0)
iSetPiece[SET_PIECE_COW]++
ELIF GET_GAME_TIMER() > iCowShootTimer
IF HAS_PED_GOT_WEAPON(sEnemySetPiece[SET_PIECE_COW].pedIndex, WEAPONTYPE_PISTOL)
SET_PED_SHOOTS_AT_COORD(sEnemySetPiece[SET_PIECE_COW].pedIndex, GET_PED_BONE_COORDS(PLAYER_PED_ID(), BONETAG_HEAD, VECTOR_ZERO))
ENDIF
iCowShootTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(200, 500)
ENDIF
ENDIF
IF (IS_SYNCHRONIZED_SCENE_RUNNING(sceneCow)
AND GET_SYNCHRONIZED_SCENE_PHASE(sceneCow) >= 1.0)
OR NOT IS_SYNCHRONIZED_SCENE_RUNNING(sceneCow)
IF sfxCow != -1
STOP_SOUND(sfxCow)
RELEASE_SOUND_ID(sfxCow)
sfxCow = -1
ENDIF
ENDIF
BREAK
ENDSWITCH
//Update Players navmesh blocknig area so the buddy won't run into him...
IF iNavBlock[0] = 0
iNavBlock[0] = ADD_NAVMESH_BLOCKING_OBJECT(GET_ENTITY_COORDS(PLAYER_PED_ID()), <<0.75, 0.75, 1.0>>, (GET_ENTITY_HEADING(PLAYER_PED_ID()) / 360) * 6.28)
PRINTLN("ADD_NAVMESH_BLOCKING_OBJECT | iNavBlock[0] = ", iNavBlock[1])
ELSE
UPDATE_NAVMESH_BLOCKING_OBJECT(iNavBlock[0], GET_ENTITY_COORDS(PLAYER_PED_ID()), <<0.75, 0.75, 1.0>>, (GET_ENTITY_HEADING(PLAYER_PED_ID()) / 360) * 6.28)
ENDIF
ENDIF
IF CLEANUP_STAGE()
//Cleanup (Blips, peds, variables etc.)
//Audio Scene
IF IS_AUDIO_SCENE_ACTIVE("MI_2_ESCAPE_SHOOTOUT")
STOP_AUDIO_SCENE("MI_2_ESCAPE_SHOOTOUT")
ENDIF
IF sfxCow != -1
STOP_SOUND(sfxCow)
RELEASE_SOUND_ID(sfxCow)
sfxCow = -1
ENDIF
// SAFE_REMOVE_BLIP(blipMichael)
// SAFE_REMOVE_BLIP(blipFranklin)
SAFE_REMOVE_BLIP(blipDestination)
IF DOES_CAM_EXIST(camAnim)
DESTROY_CAM(camAnim)
ENDIF
INT i
REPEAT COUNT_OF(covPoint) i
REMOVE_COVER_POINT(covPoint[i])
ENDREPEAT
REPEAT iEnemySetPiece i
SET_PED_AS_NO_LONGER_NEEDED(sEnemySetPiece[i].pedIndex)
SAFE_REMOVE_BLIP(sEnemySetPiece[i].blipIndex)
ENDREPEAT
REPEAT iEnemyEscape i
SET_PED_AS_NO_LONGER_NEEDED(sEnemyEscape[i].pedIndex)
SAFE_REMOVE_BLIP(sEnemyEscape[i].blipIndex)
ENDREPEAT
SAFE_DELETE_OBJECT(objHook)
SAFE_DELETE_OBJECT(objChain)
SAFE_DELETE_OBJECT(objPadlock)
REPEAT COUNT_OF(objCrate) i
SAFE_DELETE_OBJECT(objCrate[i])
ENDREPEAT
REPEAT COUNT_OF(objCigarette) i
IF DOES_PARTICLE_FX_LOOPED_EXIST(ptfxCigarette[i])
STOP_PARTICLE_FX_LOOPED(ptfxCigarette[i])
ENDIF
SAFE_DELETE_OBJECT(objCigarette[i])
ENDREPEAT
REPEAT COUNT_OF(vehEnemy) i
SAFE_DELETE_VEHICLE(vehEnemy[i])
ENDREPEAT
SET_MODEL_AS_NO_LONGER_NEEDED(PROP_LD_HOOK)
SET_MODEL_AS_NO_LONGER_NEEDED(PROP_CS_PADLOCK)
SET_MODEL_AS_NO_LONGER_NEEDED(PROP_CS_LEG_CHAIN_01)
SET_MODEL_AS_NO_LONGER_NEEDED(BISON)
SET_MODEL_AS_NO_LONGER_NEEDED(GET_WEAPONTYPE_MODEL(WEAPONTYPE_COMBATPISTOL))
SET_MODEL_AS_NO_LONGER_NEEDED(PROP_WATERCRATE_01)
SET_MODEL_AS_NO_LONGER_NEEDED(V_IND_COO_HALF)
REMOVE_PTFX_ASSET()
CLEAR_MISSION_LOCATE_STUFF(sLocatesData, TRUE)
eMissionObjective = INT_TO_ENUM(MissionObjective, ENUM_TO_INT(eMissionObjective) + 1)
ENDIF
ENDPROC
PROC triadsChase()
IF INIT_STAGE()
//Replay
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(ENUM_TO_INT(replayTriadsChase), "stageTriadsChase", TRUE)
SET_PED_USING_ACTION_MODE(PLAYER_PED(CHAR_MICHAEL), TRUE)
SET_PED_USING_ACTION_MODE(PLAYER_PED(CHAR_FRANKLIN), TRUE)
//Uncapped
bSetUncapped = TRUE
//Wanted
SET_MAX_WANTED_LEVEL(0)
SET_WANTED_LEVEL_MULTIPLIER(0.0)
//Ambulances etc.
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)
ENABLE_DISPATCH_SERVICE(DT_GANGS, FALSE)
IF CAN_CREATE_RANDOM_COPS()
SET_CREATE_RANDOM_COPS(FALSE)
ENDIF
SAFE_SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
// IF NOT IS_ENTITY_AT_COORD(PLAYER_PED(CHAR_FRANKLIN), <<962.994446, -2107.998047, 32.986130>>,<<10.0, 7.0, 2.5>>)
// SET_PED_POSITION(PLAYER_PED(CHAR_FRANKLIN), <<965.1993, -2108.8315, 30.4914>>, 63.8301)
// ENDIF
//Blocking of Temporary Events
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(PLAYER_PED(CHAR_FRANKLIN), FALSE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(PLAYER_PED(CHAR_MICHAEL), FALSE)
SET_PED_CONFIG_FLAG(PLAYER_PED(CHAR_FRANKLIN), PCF_GetOutUndriveableVehicle, FALSE)
SET_PED_CONFIG_FLAG(PLAYER_PED(CHAR_MICHAEL), PCF_GetOutUndriveableVehicle, FALSE)
//Objective
//PRINT_ADV("MCH2_GCLEAR")
//Audio
PLAY_AUDIO(MIC2_VEHICLE_READY)
LOAD_AUDIO(MIC2_LOSE_TRIADS)
// SET_INITIAL_PLAYER_STATION("RADIO_01_CLASS_ROCK")
//
// FREEZE_RADIO_STATION("RADIO_01_CLASS_ROCK")
//
// SET_RADIO_AUTO_UNFREEZE(FALSE)
//
// SET_RADIO_TRACK("RADIO_01_CLASS_ROCK", "MIC2_OVER_RADIO")
//Taxi
DISABLE_TAXI_HAILING(TRUE)
IF SKIPPED_STAGE()
SET_PED_POSITION(PLAYER_PED(CHAR_MICHAEL), <<961.6073, -2107.3604, 30.7408>>, 47.8221, FALSE)
SET_PED_POSITION(PLAYER_PED(CHAR_FRANKLIN), <<960.3185, -2105.0186, 30.9585>>, 99.0454)
SAFE_FREEZE_ENTITY_POSITION(PLAYER_PED(CHAR_MICHAEL), TRUE)
SAFE_FREEZE_ENTITY_POSITION(PLAYER_PED(CHAR_FRANKLIN), TRUE)
IF NOT bReplaySkip
LOAD_SCENE_ADV(<<961.2763, -2106.1240, 30.5098>>)
ENDIF
IF NOT HAS_PED_GOT_WEAPON(PLAYER_PED(CHAR_MICHAEL), WEAPONTYPE_COMBATPISTOL)
GIVE_WEAPON_TO_PED(PLAYER_PED(CHAR_MICHAEL), WEAPONTYPE_COMBATPISTOL, 350, TRUE)
ENDIF
SET_PED_AMMO(PLAYER_PED(CHAR_MICHAEL), WEAPONTYPE_COMBATPISTOL, 350)
SET_CURRENT_PED_WEAPON(PLAYER_PED(CHAR_MICHAEL), GET_BEST_PED_WEAPON(PLAYER_PED(CHAR_MICHAEL)), TRUE)
//Audio
PLAY_AUDIO(MIC2_TRIADS_CHASE_RT)
SAFE_FREEZE_ENTITY_POSITION(PLAYER_PED(CHAR_MICHAEL), FALSE)
SAFE_FREEZE_ENTITY_POSITION(PLAYER_PED(CHAR_FRANKLIN), FALSE)
FORCE_PED_MOTION_STATE(PLAYER_PED(CHAR_FRANKLIN), MS_ON_FOOT_IDLE)
IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
SAFE_ADD_BLIP_PED(blipMichael, sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], FALSE)
ELIF DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
SAFE_ADD_BLIP_PED(blipMichael, sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], FALSE)
ENDIF
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(-10)
IF IS_SCREEN_FADED_OUT()
DO_SCREEN_FADE_IN(500)
ENDIF
ENDIF
ELSE
REPLAY_DISABLE_CAMERA_MOVEMENT_THIS_FRAME() //Fix for bug 2175707
SWITCH iCutsceneStage
CASE 0
IF (NOT IS_MESSAGE_BEING_DISPLAYED() OR GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) = 0)
AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT HAS_LABEL_BEEN_TRIGGERED("MCH2_DRV1")
REPLAY_RECORD_BACK_FOR_TIME(4.0, 10.0, REPLAY_IMPORTANCE_HIGHEST)
CREATE_CONVERSATION_ADV("MCH2_DRV1")
ELIF NOT HAS_LABEL_BEEN_TRIGGERED("MCH2_SEECAR")
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED(CHAR_MICHAEL), <<942.229126, -2109.321777, 29.255819>>, <<962.332581, -2109.342529, 33.953644>>, 16.5)
CREATE_CONVERSATION_ADV("MCH2_SEECAR")
ENDIF
ELIF NOT HAS_LABEL_BEEN_TRIGGERED("MCH2_GETCAR")
AND NOT HAS_LABEL_BEEN_TRIGGERED("MCH2_MDRIVE")
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN
CREATE_CONVERSATION_ADV("MCH2_GETCAR")
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
CREATE_CONVERSATION_ADV("MCH2_MDRIVE")
ENDIF
ENDIF
ENDIF
IF (IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
OR NOT IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<946.914734, -2113.857910, 27.548405>>, <<972.384338, -2116.126465, 35.474815>>, 28.0))
AND (intAbattoir != NULL
AND GET_INTERIOR_FROM_ENTITY(PLAYER_PED_ID()) != intAbattoir
AND GET_INTERIOR_FROM_ENTITY(NOT_PLAYER_PED_ID()) != intAbattoir)
IF (DOES_ENTITY_EXIST(vehHachiRoku)
AND NOT IS_ENTITY_DEAD(vehHachiRoku))
AND NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehHachiRoku)
vehEnemyChase[0] = vehHachiRoku
ELIF (DOES_ENTITY_EXIST(vehEscape)
AND NOT IS_ENTITY_DEAD(vehEscape))
AND NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehEscape)
vehEnemyChase[0] = vehEscape
ENDIF
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
//Michael driveby weapon
IF NOT HAS_PED_GOT_WEAPON(PLAYER_PED(CHAR_MICHAEL), WEAPONTYPE_COMBATPISTOL)
GIVE_WEAPON_TO_PED(PLAYER_PED(CHAR_MICHAEL), WEAPONTYPE_COMBATPISTOL, GET_WEAPON_CLIP_SIZE(WEAPONTYPE_COMBATPISTOL) * 5, TRUE)
ENDIF
IF GET_AMMO_IN_PED_WEAPON(PLAYER_PED(CHAR_MICHAEL), WEAPONTYPE_COMBATPISTOL) < (GET_WEAPON_CLIP_SIZE(WEAPONTYPE_COMBATPISTOL) * 5)
SET_PED_AMMO(PLAYER_PED(CHAR_MICHAEL), WEAPONTYPE_COMBATPISTOL, (GET_WEAPON_CLIP_SIZE(WEAPONTYPE_COMBATPISTOL) * 5))
ENDIF
SET_CURRENT_PED_WEAPON(PLAYER_PED(CHAR_MICHAEL), WEAPONTYPE_COMBATPISTOL, TRUE)
//Franklin driveby weapon
IF NOT HAS_PED_GOT_WEAPON(PLAYER_PED(CHAR_FRANKLIN), WEAPONTYPE_PISTOL)
GIVE_WEAPON_TO_PED(PLAYER_PED(CHAR_FRANKLIN), WEAPONTYPE_PISTOL, 350, TRUE)
ENDIF
IF GET_AMMO_IN_PED_WEAPON(PLAYER_PED(CHAR_FRANKLIN), WEAPONTYPE_PISTOL) < (GET_WEAPON_CLIP_SIZE(WEAPONTYPE_PISTOL) * 5)
SET_PED_AMMO(PLAYER_PED(CHAR_FRANKLIN), WEAPONTYPE_PISTOL, (GET_WEAPON_CLIP_SIZE(WEAPONTYPE_PISTOL) * 5))
ENDIF
SET_CURRENT_PED_WEAPON(PLAYER_PED(CHAR_FRANKLIN), WEAPONTYPE_PISTOL, TRUE)
ENDIF
ADVANCE_CUTSCENE()
ENDIF
BREAK
CASE 1
IF NOT DOES_ENTITY_EXIST(sEnemyChase[0].pedIndex)
AND NOT DOES_ENTITY_EXIST(sEnemyChase[1].pedIndex)
createEnemy(sEnemyChase[0], <<965.9470, -2109.8545, 30.4696>>, 56.7835, WEAPONTYPE_PISTOL)
createEnemy(sEnemyChase[1], <<968.0931, -2110.3267, 30.4746>>, 56.7835, WEAPONTYPE_SMG, G_M_M_CHIGOON_01)
SET_PED_COMBAT_MOVEMENT(sEnemyChase[0].pedIndex, CM_WILLADVANCE)
SET_PED_COMBAT_MOVEMENT(sEnemyChase[1].pedIndex, CM_WILLADVANCE)
SET_PED_COMBAT_ATTRIBUTES(sEnemyChase[0].pedIndex, CA_AGGRESSIVE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(sEnemyChase[1].pedIndex, CA_AGGRESSIVE, TRUE)
REMOVE_PED_DEFENSIVE_AREA(sEnemyChase[0].pedIndex)
REMOVE_PED_DEFENSIVE_AREA(sEnemyChase[1].pedIndex)
GIVE_WEAPON_TO_PED(sEnemyChase[1].pedIndex, WEAPONTYPE_PISTOL, INFINITE_AMMO, FALSE, FALSE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sEnemyChase[0].pedIndex, TRUE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sEnemyChase[1].pedIndex, TRUE)
OPEN_SEQUENCE_TASK(seqMain)
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(NULL, <<960.2808, -2106.7200, 30.9505>>, PLAYER_PED_ID(), PEDMOVE_RUN, TRUE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
CLOSE_SEQUENCE_TASK(seqMain)
TASK_PERFORM_SEQUENCE(sEnemyChase[0].pedIndex, seqMain)
CLEAR_SEQUENCE_TASK(seqMain)
OPEN_SEQUENCE_TASK(seqMain)
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(NULL, <<960.2409, -2104.9978, 30.9505>>, PLAYER_PED_ID(), PEDMOVE_RUN, TRUE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NULL, 100.0)
CLOSE_SEQUENCE_TASK(seqMain)
TASK_PERFORM_SEQUENCE(sEnemyChase[1].pedIndex, seqMain)
CLEAR_SEQUENCE_TASK(seqMain)
INFORM_MISSION_STATS_SYSTEM_OF_TIME_WINDOW_OPEN(MIC2_TIME_TO_LOSE_TRIADS)
ENDIF
IF NOT IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<941.783325, -2112.604248, 27.505041>>, <<972.538818, -2114.131592, 35.474781>>, 25.0)
IF (DOES_ENTITY_EXIST(sEnemyChase[0].pedIndex) AND NOT IS_PED_INJURED(sEnemyChase[0].pedIndex))
OR (DOES_ENTITY_EXIST(sEnemyChase[1].pedIndex) AND NOT IS_PED_INJURED(sEnemyChase[1].pedIndex))
//Audio
PLAY_AUDIO(MIC2_LOSE_TRIADS)
ENDIF
ADVANCE_CUTSCENE()
ENDIF
BREAK
CASE 2
IF IS_PED_INJURED(sEnemyChase[0].pedIndex)
AND IS_PED_INJURED(sEnemyChase[1].pedIndex)
ADVANCE_CUTSCENE()
ELSE
IF ((NOT IS_PED_INJURED(sEnemyChase[0].pedIndex)
AND GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(sEnemyChase[0].pedIndex), GET_ENTITY_COORDS(PLAYER_PED_ID())) > 350.0)
OR IS_PED_INJURED(sEnemyChase[0].pedIndex))
AND ((NOT IS_PED_INJURED(sEnemyChase[1].pedIndex)
AND GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(sEnemyChase[1].pedIndex), GET_ENTITY_COORDS(PLAYER_PED_ID())) > 350.0)
OR IS_PED_INJURED(sEnemyChase[1].pedIndex))
OR GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), <<-858.0734, 157.1951, 63.7158>>) < 200.0
ADVANCE_CUTSCENE()
ENDIF
ENDIF
IF (NOT IS_MESSAGE_BEING_DISPLAYED() OR GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) = 0)
AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF TIMERA() > 1500
IF NOT HAS_LABEL_BEEN_TRIGGERED("MCH2_DRV2")
AND NOT HAS_LABEL_BEEN_TRIGGERED("MCH2_AFTERUS")
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED(CHAR_MICHAEL)), GET_ENTITY_COORDS(PLAYER_PED(CHAR_FRANKLIN))) < 25.0
AND ((DOES_ENTITY_EXIST(sEnemyChase[0].pedIndex)
AND NOT IS_PED_INJURED(sEnemyChase[0].pedIndex)
AND GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(sEnemyChase[0].pedIndex), GET_ENTITY_COORDS(PLAYER_PED_ID())) < 100.0)
OR (DOES_ENTITY_EXIST(sEnemyChase[1].pedIndex)
AND NOT IS_PED_INJURED(sEnemyChase[1].pedIndex)
AND GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(sEnemyChase[1].pedIndex), GET_ENTITY_COORDS(PLAYER_PED_ID())) < 100.0)
OR (DOES_ENTITY_EXIST(vehEnemyChase[0])
AND NOT IS_ENTITY_DEAD(vehEnemyChase[0])
AND GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(vehEnemyChase[0]), GET_ENTITY_COORDS(PLAYER_PED_ID())) < 150.0))
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN
CREATE_CONVERSATION_ADV("MCH2_DRV2")
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
CREATE_CONVERSATION_ADV("MCH2_AFTERUS")
ENDIF
ENDIF
ELIF NOT HAS_LABEL_BEEN_TRIGGERED("MCH2_LOSEM")
AND NOT HAS_LABEL_BEEN_TRIGGERED("MCH2_LOSE")
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
AND IS_PED_IN_VEHICLE(NOT_PLAYER_PED_ID(), GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID()))
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED(CHAR_MICHAEL)), GET_ENTITY_COORDS(PLAYER_PED(CHAR_FRANKLIN))) < 25.0
AND ((DOES_ENTITY_EXIST(sEnemyChase[0].pedIndex)
AND NOT IS_PED_INJURED(sEnemyChase[0].pedIndex)
AND GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(sEnemyChase[0].pedIndex), GET_ENTITY_COORDS(PLAYER_PED_ID())) < 100.0)
OR (DOES_ENTITY_EXIST(sEnemyChase[1].pedIndex)
AND NOT IS_PED_INJURED(sEnemyChase[1].pedIndex)
AND GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(sEnemyChase[1].pedIndex), GET_ENTITY_COORDS(PLAYER_PED_ID())) < 100.0)
OR (DOES_ENTITY_EXIST(vehEnemyChase[0])
AND NOT IS_ENTITY_DEAD(vehEnemyChase[0])
AND GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(vehEnemyChase[0]), GET_ENTITY_COORDS(PLAYER_PED_ID())) < 150.0))
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED(CHAR_MICHAEL))
AND GET_PED_IN_VEHICLE_SEAT(GET_VEHICLE_PED_IS_IN(PLAYER_PED(CHAR_MICHAEL)), VS_DRIVER) = PLAYER_PED(CHAR_MICHAEL)
CREATE_CONVERSATION_ADV("MCH2_LOSEM")
ELIF IS_PED_IN_ANY_VEHICLE(PLAYER_PED(CHAR_FRANKLIN))
AND GET_PED_IN_VEHICLE_SEAT(GET_VEHICLE_PED_IS_IN(PLAYER_PED(CHAR_FRANKLIN)), VS_DRIVER) = PLAYER_PED(CHAR_FRANKLIN)
CREATE_CONVERSATION_ADV("MCH2_LOSE")
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(vehEscape)
AND NOT IS_ENTITY_DEAD(vehEscape)
IF NOT GET_VEHICLE_TYRES_CAN_BURST(vehEscape)
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(vehEscape), <<965.9470, -2109.8545, 30.4696>>) > 50.0
SET_VEHICLE_TYRES_CAN_BURST(vehEscape, TRUE)
ENDIF
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(vehHachiRoku)
AND NOT IS_ENTITY_DEAD(vehHachiRoku)
IF NOT GET_VEHICLE_TYRES_CAN_BURST(vehHachiRoku)
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(vehHachiRoku), <<965.9470, -2109.8545, 30.4696>>) > 50.0
SET_VEHICLE_TYRES_CAN_BURST(vehHachiRoku, TRUE)
ENDIF
ENDIF
ENDIF
BOOL bCloseCombat
bCloseCombat = TRUE
IF NOT IS_PED_INJURED(sEnemyChase[0].pedIndex)
IF ((IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
AND GET_ENTITY_SPEED(GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID())) < 3.0)
OR NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()))
AND GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(sEnemyChase[0].pedIndex), GET_ENTITY_COORDS(PLAYER_PED_ID())) < 15.0
SET_PED_COMBAT_ATTRIBUTES(sEnemyChase[0].pedIndex, CA_LEAVE_VEHICLES, TRUE)
SET_PED_COMBAT_ATTRIBUTES(sEnemyChase[0].pedIndex, CA_USE_VEHICLE, FALSE)
ELIF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(sEnemyChase[0].pedIndex), GET_ENTITY_COORDS(PLAYER_PED_ID())) > 25.0
AND GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(vehEnemyChase[0]), GET_ENTITY_COORDS(PLAYER_PED_ID())) > 25.0
SET_PED_COMBAT_ATTRIBUTES(sEnemyChase[0].pedIndex, CA_LEAVE_VEHICLES, FALSE)
SET_PED_COMBAT_ATTRIBUTES(sEnemyChase[0].pedIndex, CA_USE_VEHICLE, TRUE)
bCloseCombat = FALSE
ENDIF
ENDIF
IF NOT IS_PED_INJURED(sEnemyChase[1].pedIndex)
IF ((IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
AND GET_ENTITY_SPEED(GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID())) < 3.0)
OR NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()))
AND GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(sEnemyChase[1].pedIndex), GET_ENTITY_COORDS(PLAYER_PED_ID())) < 15.0
SET_PED_COMBAT_ATTRIBUTES(sEnemyChase[1].pedIndex, CA_LEAVE_VEHICLES, TRUE)
SET_PED_COMBAT_ATTRIBUTES(sEnemyChase[1].pedIndex, CA_USE_VEHICLE, FALSE)
ELIF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(sEnemyChase[1].pedIndex), GET_ENTITY_COORDS(PLAYER_PED_ID())) > 25.0
AND GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(vehEnemyChase[0]), GET_ENTITY_COORDS(PLAYER_PED_ID())) > 25.0
SET_PED_COMBAT_ATTRIBUTES(sEnemyChase[1].pedIndex, CA_LEAVE_VEHICLES, FALSE)
SET_PED_COMBAT_ATTRIBUTES(sEnemyChase[1].pedIndex, CA_USE_VEHICLE, TRUE)
bCloseCombat = FALSE
ENDIF
ENDIF
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF NOT IS_PED_INJURED(sEnemyChase[0].pedIndex)
IF NOT IS_ENTITY_DEAD(vehEnemyChase[0])
IF IS_PED_IN_ANY_VEHICLE(sEnemyChase[0].pedIndex)
AND NOT IS_PED_GETTING_INTO_A_VEHICLE(sEnemyChase[0].pedIndex)
AND (IS_PED_INJURED(sEnemyChase[1].pedIndex)
OR (NOT IS_PED_INJURED(sEnemyChase[1].pedIndex)
AND IS_PED_IN_ANY_VEHICLE(sEnemyChase[1].pedIndex)
AND NOT IS_PED_GETTING_INTO_A_VEHICLE(sEnemyChase[1].pedIndex)))
VECTOR vClosestRoad
FLOAT fClosestRoad
INT iClosestRoad
GET_NTH_CLOSEST_VEHICLE_NODE_WITH_HEADING(GET_ENTITY_COORDS(PLAYER_PED_ID()), 1, vClosestRoad, fClosestRoad, iClosestRoad, NF_NONE)
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
AND IS_VEHICLE_ON_ALL_WHEELS(GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID()))
AND NOT IS_PED_IN_FLYING_VEHICLE(PLAYER_PED_ID())
AND NOT IS_PED_IN_ANY_BOAT(PLAYER_PED_ID())
AND NOT IS_ENTITY_IN_WATER(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()))
AND GET_ENTITY_SPEED(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())) > 5.0
AND GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), vCurrentPoint) > 30.0 - (GET_VEHICLE_ESTIMATED_MAX_SPEED(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())) / 5.0)
AND GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), vClosestRoad) < (5.0 + iClosestRoad)
vChasePoint = vCurrentPoint
fChasePoint = fCurrentPoint
vCurrentPoint = GET_ENTITY_COORDS(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()))
fCurrentPoint = GET_ENTITY_HEADING(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()))
ENDIF
IF IS_PED_IN_ANY_VEHICLE(sEnemyChase[0].pedIndex)
IF (IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
AND IS_ENTITY_IN_WATER(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())))
OR IS_ENTITY_IN_WATER(PLAYER_PED_ID())
IF GET_SCRIPT_TASK_STATUS(sEnemyChase[0].pedIndex, SCRIPT_TASK_COMBAT_HATED_TARGETS_AROUND_PED) != PERFORMING_TASK
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sEnemyChase[0].pedIndex, 500.0)
ENDIF
ELSE
IF GET_SCRIPT_TASK_STATUS(sEnemyChase[0].pedIndex, SCRIPT_TASK_VEHICLE_CHASE) != PERFORMING_TASK
TASK_VEHICLE_CHASE(sEnemyChase[0].pedIndex, PLAYER_PED_ID())
ENDIF
ENDIF
ENDIF
IF NOT IS_PED_INJURED(sEnemyChase[1].pedIndex)
IF GET_SCRIPT_TASK_STATUS(sEnemyChase[1].pedIndex, SCRIPT_TASK_COMBAT_HATED_TARGETS_AROUND_PED) != PERFORMING_TASK
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sEnemyChase[1].pedIndex, 500.0)
ENDIF
ENDIF
IF IS_ENTITY_ON_SCREEN(vehEnemyChase[0])
OR IS_SPHERE_VISIBLE(vChasePoint, 5.0)
iChaseTimer[CHASE_TIMER_CAR] = GET_GAME_TIMER() + 3000
ELIF GET_GAME_TIMER() > iChaseTimer[CHASE_TIMER_CAR]
AND GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(vehEnemyChase[0])) > 40.0 - (GET_VEHICLE_ESTIMATED_MAX_SPEED(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())) / 5.0)
AND GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), vChasePoint) > 20.0 - (GET_VEHICLE_ESTIMATED_MAX_SPEED(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())) / 5.0)
IF IS_VEHICLE_ON_ALL_WHEELS(GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID()))
AND NOT IS_PED_IN_FLYING_VEHICLE(PLAYER_PED_ID())
AND NOT IS_PED_IN_ANY_BOAT(PLAYER_PED_ID())
IF NOT IS_VECTOR_ZERO(vChasePoint)
CLEAR_AREA(vChasePoint, 3.0, TRUE)
SET_VEHICLE_POSITION(vehEnemyChase[0], vChasePoint, fChasePoint)
SET_VEHICLE_FORWARD_SPEED(vehEnemyChase[0], 10.0)
SET_VEHICLE_ENGINE_ON(vehEnemyChase[0], TRUE, TRUE)
iChaseTimer[CHASE_TIMER_CAR] = GET_GAME_TIMER() + (6000 - CLAMP_INT(ROUND(GET_VEHICLE_ESTIMATED_MAX_SPEED(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())) * GET_VEHICLE_ESTIMATED_MAX_SPEED(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()))), 0, 3000))
ENDIF
ENDIF
ENDIF
ELSE
IF NOT bCloseCombat
IF NOT IS_PED_IN_VEHICLE(sEnemyChase[0].pedIndex, vehEnemyChase[0])
AND NOT IS_PED_GETTING_INTO_A_VEHICLE(sEnemyChase[0].pedIndex)
AND IS_VEHICLE_SEAT_FREE(vehEnemyChase[0], VS_DRIVER)
IF (IS_ENTITY_ON_SCREEN(sEnemyChase[0].pedIndex)
AND NOT IS_ENTITY_OCCLUDED(sEnemyChase[0].pedIndex))
OR IS_SPHERE_VISIBLE(GET_ENTITY_COORDS(sEnemyChase[0].pedIndex), 1.0)
IF GET_SCRIPT_TASK_STATUS(sEnemyChase[0].pedIndex, SCRIPT_TASK_ENTER_VEHICLE) != PERFORMING_TASK
TASK_ENTER_VEHICLE(sEnemyChase[0].pedIndex, vehEnemyChase[0], DEFAULT_TIME_NEVER_WARP)
ENDIF
iChaseTimer[CHASE_TIMER_ENEMY_1] = GET_GAME_TIMER() + 5000
ELIF GET_GAME_TIMER() > iChaseTimer[CHASE_TIMER_ENEMY_1]
AND (NOT IS_ENTITY_ON_SCREEN(vehEnemyChase[0])
AND IS_ENTITY_OCCLUDED(vehEnemyChase[0])
AND NOT IS_SPHERE_VISIBLE(GET_ENTITY_COORDS(vehEnemyChase[0]), 2.0))
SET_PED_INTO_VEHICLE(sEnemyChase[0].pedIndex, vehEnemyChase[0])
ENDIF
ENDIF
IF NOT IS_PED_INJURED(sEnemyChase[1].pedIndex)
IF NOT IS_PED_IN_VEHICLE(sEnemyChase[1].pedIndex, vehEnemyChase[0])
AND NOT IS_PED_GETTING_INTO_A_VEHICLE(sEnemyChase[1].pedIndex)
AND IS_VEHICLE_SEAT_FREE(vehEnemyChase[0], VS_FRONT_RIGHT)
IF (IS_ENTITY_ON_SCREEN(sEnemyChase[1].pedIndex)
AND NOT IS_ENTITY_OCCLUDED(sEnemyChase[1].pedIndex))
OR IS_SPHERE_VISIBLE(GET_ENTITY_COORDS(sEnemyChase[1].pedIndex), 1.0)
IF GET_SCRIPT_TASK_STATUS(sEnemyChase[1].pedIndex, SCRIPT_TASK_ENTER_VEHICLE) != PERFORMING_TASK
TASK_ENTER_VEHICLE(sEnemyChase[1].pedIndex, vehEnemyChase[0], DEFAULT_TIME_NEVER_WARP, VS_FRONT_RIGHT)
ENDIF
iChaseTimer[CHASE_TIMER_ENEMY_2] = GET_GAME_TIMER() + 5000
ELIF GET_GAME_TIMER() > iChaseTimer[CHASE_TIMER_ENEMY_2]
AND (NOT IS_ENTITY_ON_SCREEN(vehEnemyChase[0])
AND IS_ENTITY_OCCLUDED(vehEnemyChase[0])
AND NOT IS_SPHERE_VISIBLE(GET_ENTITY_COORDS(vehEnemyChase[0]), 2.0))
SET_PED_INTO_VEHICLE(sEnemyChase[1].pedIndex, vehEnemyChase[0], VS_FRONT_RIGHT)
ENDIF
ENDIF
ENDIF
ELSE
IF GET_SCRIPT_TASK_STATUS(sEnemyChase[0].pedIndex, SCRIPT_TASK_COMBAT_HATED_TARGETS_AROUND_PED) != PERFORMING_TASK
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sEnemyChase[0].pedIndex, 500.0)
ENDIF
IF NOT IS_PED_INJURED(sEnemyChase[1].pedIndex)
IF GET_SCRIPT_TASK_STATUS(sEnemyChase[1].pedIndex, SCRIPT_TASK_COMBAT_HATED_TARGETS_AROUND_PED) != PERFORMING_TASK
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sEnemyChase[1].pedIndex, 500.0)
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
IF GET_SCRIPT_TASK_STATUS(sEnemyChase[0].pedIndex, SCRIPT_TASK_COMBAT_HATED_TARGETS_AROUND_PED) != PERFORMING_TASK
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sEnemyChase[0].pedIndex, 500.0)
ENDIF
IF NOT IS_PED_INJURED(sEnemyChase[1].pedIndex)
IF GET_SCRIPT_TASK_STATUS(sEnemyChase[1].pedIndex, SCRIPT_TASK_COMBAT_HATED_TARGETS_AROUND_PED) != PERFORMING_TASK
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sEnemyChase[1].pedIndex, 500.0)
ENDIF
ENDIF
ENDIF
ELSE
IF NOT IS_PED_INJURED(sEnemyChase[1].pedIndex)
IF GET_SCRIPT_TASK_STATUS(sEnemyChase[1].pedIndex, SCRIPT_TASK_COMBAT_HATED_TARGETS_AROUND_PED) != PERFORMING_TASK
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sEnemyChase[1].pedIndex, 500.0)
ENDIF
ENDIF
ENDIF
ELSE
IF NOT IS_PED_INJURED(sEnemyChase[0].pedIndex)
IF GET_SCRIPT_TASK_STATUS(sEnemyChase[0].pedIndex, SCRIPT_TASK_COMBAT_HATED_TARGETS_AROUND_PED) != PERFORMING_TASK
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sEnemyChase[0].pedIndex, 500.0)
ENDIF
ENDIF
IF NOT IS_PED_INJURED(sEnemyChase[1].pedIndex)
IF GET_SCRIPT_TASK_STATUS(sEnemyChase[1].pedIndex, SCRIPT_TASK_COMBAT_HATED_TARGETS_AROUND_PED) != PERFORMING_TASK
TASK_COMBAT_HATED_TARGETS_AROUND_PED(sEnemyChase[1].pedIndex, 500.0)
ENDIF
ENDIF
ENDIF
IF (NOT IS_MESSAGE_BEING_DISPLAYED() OR GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) = 0)
AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF HAS_LABEL_BEEN_TRIGGERED("MCH2_DRV2")
AND HAS_LABEL_BEEN_TRIGGERED("MCH2_LOSE")
IF GET_GAME_TIMER() > iDialogueTimer[0]
IF iDialogueLineCount[0] = -1
iDialogueLineCount[0] = 4
ELIF iDialogueLineCount[1] = -1
iDialogueLineCount[1] = 4
ELIF iDialogueLineCount[2] = -1
iDialogueLineCount[2] = 4
ELIF iDialogueLineCount[3] = -1
iDialogueLineCount[3] = 4
ELIF iDialogueLineCount[4] = -1
iDialogueLineCount[4] = 5
ENDIF
IF iDialogueLineCount[iDialogueStage] > 0
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED(CHAR_MICHAEL)), GET_ENTITY_COORDS(PLAYER_PED(CHAR_FRANKLIN))) < 25.0
AND ((DOES_ENTITY_EXIST(sEnemyChase[0].pedIndex)
AND NOT IS_PED_INJURED(sEnemyChase[0].pedIndex)
AND GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(sEnemyChase[0].pedIndex), GET_ENTITY_COORDS(PLAYER_PED_ID())) < 100.0)
OR (DOES_ENTITY_EXIST(sEnemyChase[1].pedIndex)
AND NOT IS_PED_INJURED(sEnemyChase[1].pedIndex)
AND GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(sEnemyChase[1].pedIndex), GET_ENTITY_COORDS(PLAYER_PED_ID())) < 100.0)
OR (DOES_ENTITY_EXIST(vehEnemyChase[0])
AND NOT IS_ENTITY_DEAD(vehEnemyChase[0])
AND GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(vehEnemyChase[0]), GET_ENTITY_COORDS(PLAYER_PED_ID())) < 150.0))
IF iDialogueStage = 0
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED(CHAR_MICHAEL))
IF GET_PED_IN_VEHICLE_SEAT(GET_VEHICLE_PED_IS_IN(PLAYER_PED(CHAR_MICHAEL)), VS_DRIVER) = PLAYER_PED(CHAR_MICHAEL)
CREATE_CONVERSATION_ADV("MCH2_TRY", CONV_PRIORITY_MEDIUM, FALSE)
ELSE
CREATE_CONVERSATION_ADV("MCH2_DRV2M", CONV_PRIORITY_MEDIUM, FALSE)
ENDIF
iDialogueTimer[0] = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(5000, 7500)
iDialogueLineCount[iDialogueStage]--
ENDIF
ELIF iDialogueStage = 1
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED(CHAR_FRANKLIN))
IF GET_PED_IN_VEHICLE_SEAT(GET_VEHICLE_PED_IS_IN(PLAYER_PED(CHAR_FRANKLIN)), VS_DRIVER) = PLAYER_PED(CHAR_FRANKLIN)
CREATE_CONVERSATION_ADV("MCH2_DRV2F", CONV_PRIORITY_MEDIUM, FALSE)
ELSE
CREATE_CONVERSATION_ADV("MCH2_GOGO", CONV_PRIORITY_MEDIUM, FALSE)
ENDIF
iDialogueTimer[0] = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(5000, 7500)
iDialogueLineCount[iDialogueStage]--
ENDIF
ELIF iDialogueStage = 2
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
AND DOES_ENTITY_EXIST(sEnemyChase[0].pedIndex)
AND NOT IS_PED_INJURED(sEnemyChase[0].pedIndex)
AND IS_PED_IN_ANY_VEHICLE(sEnemyChase[0].pedIndex)
ADD_PED_FOR_DIALOGUE(sPedsForConversation, 8, sEnemyChase[0].pedIndex, "MCH2CHIN6")
CREATE_CONVERSATION_ADV("MCH2_CHASE", CONV_PRIORITY_MEDIUM, FALSE)
iDialogueTimer[0] = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(5000, 7500)
iDialogueLineCount[iDialogueStage]--
ENDIF
ELIF iDialogueStage = 3
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
AND DOES_ENTITY_EXIST(sEnemyChase[1].pedIndex)
AND NOT IS_PED_INJURED(sEnemyChase[1].pedIndex)
AND IS_PED_IN_ANY_VEHICLE(sEnemyChase[1].pedIndex)
ADD_PED_FOR_DIALOGUE(sPedsForConversation, 8, sEnemyChase[1].pedIndex, "MCH2CHIN6")
CREATE_CONVERSATION_ADV("MCH2_CHASE2", CONV_PRIORITY_MEDIUM, FALSE)
iDialogueTimer[0] = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(5000, 7500)
iDialogueLineCount[iDialogueStage]--
ENDIF
ELIF iDialogueStage = 4
CREATE_CONVERSATION_ADV("MCH2_TRIADS", CONV_PRIORITY_MEDIUM, FALSE)
iDialogueTimer[0] = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(5000, 7500)
iDialogueLineCount[iDialogueStage]--
ENDIF
ENDIF
IF iDialogueStage < 4
iDialogueStage++
ELSE
iDialogueStage = 0
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
IF NOT IS_PED_INJURED(sEnemyChase[0].pedIndex)
AND NOT IS_PED_IN_ANY_VEHICLE(sEnemyChase[0].pedIndex)
SAFE_ADD_BLIP_PED(sEnemyChase[0].blipIndex, sEnemyChase[0].pedIndex)
ENDIF
IF NOT IS_PED_INJURED(sEnemyChase[1].pedIndex)
AND NOT IS_PED_IN_ANY_VEHICLE(sEnemyChase[1].pedIndex)
SAFE_ADD_BLIP_PED(sEnemyChase[1].blipIndex, sEnemyChase[1].pedIndex)
ENDIF
IF IS_PED_INJURED(sEnemyChase[0].pedIndex)
OR IS_PED_IN_ANY_VEHICLE(sEnemyChase[0].pedIndex)
SAFE_REMOVE_BLIP(sEnemyChase[0].blipIndex)
ENDIF
IF IS_PED_INJURED(sEnemyChase[1].pedIndex)
OR IS_PED_IN_ANY_VEHICLE(sEnemyChase[1].pedIndex)
SAFE_REMOVE_BLIP(sEnemyChase[1].blipIndex)
ENDIF
IF DOES_ENTITY_EXIST(vehEnemyChase[0])
AND NOT IS_ENTITY_DEAD(vehEnemyChase[0])
IF IS_PAUSE_MENU_ACTIVE()
IF DOES_BLIP_EXIST(blipEnemyVan[0])
SET_BLIP_COORDS(blipEnemyVan[0], GET_ENTITY_COORDS(vehEnemyChase[0]))
ENDIF
ENDIF
IF NOT IS_PED_INJURED(sEnemyChase[0].pedIndex)
AND IS_PED_IN_ANY_VEHICLE(sEnemyChase[0].pedIndex)
OR NOT IS_PED_INJURED(sEnemyChase[1].pedIndex)
AND IS_PED_IN_ANY_VEHICLE(sEnemyChase[1].pedIndex)
ADD_ENTITY_TO_AUDIO_MIX_GROUP(vehEnemyChase[0], "MI_2_ENEMY_CAR")
IF NOT DOES_BLIP_EXIST(blipEnemyVan[0])
blipEnemyVan[0] = ADD_BLIP_FOR_COORD(GET_ENTITY_COORDS(vehEnemyChase[0]))
SET_BLIP_COLOUR(blipEnemyVan[0], BLIP_COLOUR_RED)
SET_BLIP_PRIORITY(blipEnemyVan[0], BLIPPRIORITY_HIGHEST)
SET_BLIP_NAME_FROM_TEXT_FILE(blipEnemyVan[0], "MCH2_BLIPVEH")
ENDIF
VECTOR vEnemyChase = GET_ENTITY_COORDS(vehEnemyChase[0])
VECTOR vBlipChase = GET_BLIP_COORDS(blipEnemyVan[0])
FLOAT fModifier = 1.0 + CLAMP((GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(vehEnemyChase[0])) / 4), 0.0, 15.0)
vBlipChase.X = vBlipChase.X +@ (((vEnemyChase.X - vBlipChase.X) / fModifier) * 15)
vBlipChase.Y = vBlipChase.Y +@ (((vEnemyChase.Y - vBlipChase.Y) / fModifier) * 15)
vBlipChase.Z = vBlipChase.Z +@ (((vEnemyChase.Z - vBlipChase.Z) / fModifier) * 15)
SET_BLIP_COORDS(blipEnemyVan[0], vBlipChase)
ELSE
REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(vehEnemyChase[0])
ENDIF
ENDIF
IF (IS_PED_INJURED(sEnemyChase[0].pedIndex)
OR NOT IS_PED_IN_ANY_VEHICLE(sEnemyChase[0].pedIndex))
AND (IS_PED_INJURED(sEnemyChase[1].pedIndex)
OR NOT IS_PED_IN_ANY_VEHICLE(sEnemyChase[1].pedIndex))
SAFE_REMOVE_BLIP(blipEnemyVan[0])
ENDIF
//Fail
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED(CHAR_MICHAEL)), GET_ENTITY_COORDS(PLAYER_PED(CHAR_FRANKLIN))) > 250.0
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
eMissionFail = failFranklinAbandon
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN
eMissionFail = failMichaelAbandon
ENDIF
missionFailed()
ENDIF
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
//Audio Scene
IF NOT IS_AUDIO_SCENE_ACTIVE("MI_2_ESCAPE_IN_CAR")
START_AUDIO_SCENE("MI_2_ESCAPE_IN_CAR")
ENDIF
ENDIF
IF DOES_BLIP_EXIST(blipMichael)
OR DOES_BLIP_EXIST(blipFranklin)
VEHICLE_INDEX vehCurrent
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
vehCurrent = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
ENDIF
IF DOES_ENTITY_EXIST(vehCurrent)
AND NOT IS_ENTITY_DEAD(vehCurrent)
AND IS_PED_IN_VEHICLE(NOT_PLAYER_PED_ID(), vehCurrent)
SAFE_REMOVE_BLIP(blipMichael)
SAFE_REMOVE_BLIP(blipFranklin)
SET_PED_USING_ACTION_MODE(PLAYER_PED(CHAR_MICHAEL), FALSE)
SET_PED_USING_ACTION_MODE(PLAYER_PED(CHAR_FRANKLIN), FALSE)
ENDIF
ENDIF
IF iCutsceneStage > 0
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
IF (NOT IS_MESSAGE_BEING_DISPLAYED() OR GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) = 0)
AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
AND IS_PED_IN_VEHICLE(NOT_PLAYER_PED_ID(), GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID()))
IF IS_VEHICLE_STOPPED(GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID()))
CREATE_CONVERSATION_ADV("MCH2_WHY")
ENDIF
SET_LABEL_AS_TRIGGERED("InCarTogether", TRUE)
ELIF HAS_LABEL_BEEN_TRIGGERED("InCarTogether")
CREATE_CONVERSATION_ADV("MCH2_WHY2")
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT IS_PED_INJURED(PLAYER_PED(CHAR_MICHAEL))
SAFE_REMOVE_BLIP(blipMichael)
SAFE_REMOVE_BLIP(blipFranklin)
STRING sCommonLeave
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
sCommonLeave = "CMN_FLEAVE"
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN
sCommonLeave = "CMN_MLEAVE"
ENDIF
VECTOR vLocSize
vLocSize = <<LOCATE_SIZE_ANY_MEANS, LOCATE_SIZE_ANY_MEANS, LOCATE_SIZE_HEIGHT>>
#IF IS_DEBUG_BUILD DONT_DO_J_SKIP(sLocatesData) #ENDIF
IF IS_PLAYER_AT_LOCATION_WITH_BUDDY_ANY_MEANS(sLocatesData, <<-858.0734, 157.1951, 63.7158>>, vLocSize, TRUE, NOT_PLAYER_PED_ID(), "MCH2_GMCSH", sCommonLeave, FALSE, TRUE)
OR iCutsceneStage > 2
SET_LABEL_AS_TRIGGERED("MCH2_GMCSH", TRUE)
CLEAR_PED_TASKS(NOT_PLAYER_PED_ID())
//Audio
PLAY_AUDIO(MIC2_TRIADS_LOST)
ADVANCE_STAGE()
ENDIF
ENDIF
ENDIF
IF CLEANUP_STAGE()
//Cleanup (Blips, peds, variables etc.)
//Audio Scene
IF IS_AUDIO_SCENE_ACTIVE("MI_2_ESCAPE_IN_CAR")
STOP_AUDIO_SCENE("MI_2_ESCAPE_IN_CAR")
ENDIF
INFORM_MISSION_STATS_SYSTEM_OF_TIME_WINDOW_CLOSED(FALSE, MIC2_TIME_TO_LOSE_TRIADS)
SET_PED_USING_ACTION_MODE(PLAYER_PED(CHAR_MICHAEL), FALSE)
SET_PED_USING_ACTION_MODE(PLAYER_PED(CHAR_FRANKLIN), FALSE)
// IF GET_CURRENT_PLAYER_PED_ENUM() != CHAR_FRANKLIN
// MAKE_SELECTOR_PED_SELECTION(sSelectorPeds, SELECTOR_PED_FRANKLIN)
// TAKE_CONTROL_OF_SELECTOR_PED(sSelectorPeds)
//
// IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
// SET_PED_RELATIONSHIP_GROUP_HASH(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], relGroupBuddy)
// ENDIF
// ENDIF
INT i
REPEAT COUNT_OF(sEnemyChase) i
IF DOES_ENTITY_EXIST(sEnemyChase[i].pedIndex)
IF NOT IS_PED_INJURED(sEnemyChase[i].pedIndex)
AND GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(sEnemyChase[i].pedIndex), GET_ENTITY_COORDS(PLAYER_PED_ID())) > 250.0
SAFE_DELETE_PED(sEnemyChase[i].pedIndex)
ELSE
SET_PED_AS_NO_LONGER_NEEDED(sEnemyChase[i].pedIndex)
ENDIF
SAFE_REMOVE_BLIP(sEnemyChase[i].blipIndex)
ENDIF
ENDREPEAT
REPEAT COUNT_OF(vehEnemyChase) i
IF DOES_ENTITY_EXIST(vehEnemyChase[i])
IF NOT IS_ENTITY_DEAD(vehEnemyChase[i])
AND GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(vehEnemyChase[i]), GET_ENTITY_COORDS(PLAYER_PED_ID())) > 250.0
SAFE_DELETE_VEHICLE(vehEnemyChase[i])
ELSE
SET_VEHICLE_AS_NO_LONGER_NEEDED(vehEnemyChase[i])
ENDIF
SAFE_REMOVE_BLIP(blipEnemyVan[i])
ENDIF
ENDREPEAT
IF DOES_ENTITY_EXIST(objCow)
SET_OBJECT_AS_NO_LONGER_NEEDED(objCow)
ENDIF
SET_VEHICLE_AS_NO_LONGER_NEEDED(vehHachiRoku)
SET_VEHICLE_AS_NO_LONGER_NEEDED(vehEscape)
SET_MODEL_AS_NO_LONGER_NEEDED(G_M_M_CHIGOON_01)
SET_MODEL_AS_NO_LONGER_NEEDED(G_M_M_CHIGOON_02)
SET_MODEL_AS_NO_LONGER_NEEDED(BISON)
SET_MODEL_AS_NO_LONGER_NEEDED(FELTZER2)
SET_MODEL_AS_NO_LONGER_NEEDED(COQUETTE)
REMOVE_CLIP_SET("MOVE_STRAFE@COP")
REMOVE_CLIP_SET("move_ped_strafing")
//SET_ANIM_DICT_AS_LOADED(sAnimDictMic2, TRUE) //Odd fix - something to do with clipsets and anim dicts removing together?
SAFE_REMOVE_BLIP(blipMichael)
SAFE_REMOVE_BLIP(blipFranklin)
//Taxi
DISABLE_TAXI_HAILING(FALSE)
CLEAR_MISSION_LOCATE_STUFF(sLocatesData, TRUE)
eMissionObjective = INT_TO_ENUM(MissionObjective, ENUM_TO_INT(eMissionObjective) + 1)
ENDIF
ENDPROC
PROC backToMichaels()
IF INIT_STAGE()
//Wanted
SET_MAX_WANTED_LEVEL(6)
SET_WANTED_LEVEL_MULTIPLIER(1.0)
//Ambulances etc.
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)
ENABLE_DISPATCH_SERVICE(DT_GANGS, TRUE)
IF NOT CAN_CREATE_RANDOM_COPS()
SET_CREATE_RANDOM_COPS(TRUE)
ENDIF
//Audio Scene
IF NOT IS_AUDIO_SCENE_ACTIVE("MI_2_DRIVE_HOME")
START_AUDIO_SCENE("MI_2_DRIVE_HOME")
ENDIF
REPLAY_RECORD_BACK_FOR_TIME(3.0, 10.0, REPLAY_IMPORTANCE_HIGHEST)
//Audio
LOAD_AUDIO(MIC2_RADIO_SETUP)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(PLAYER_PED(CHAR_MICHAEL), FALSE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(PLAYER_PED(CHAR_FRANKLIN), FALSE)
IF SKIPPED_STAGE()
SET_PED_POSITION(PLAYER_PED(CHAR_MICHAEL), <<961.2763, -2106.1240, 30.5098>>, 89.0595, FALSE)
SET_PED_POSITION(PLAYER_PED(CHAR_FRANKLIN), <<961.0361, -2104.6360, 30.5076>>, 100.5089)
IF NOT bReplaySkip
LOAD_SCENE_ADV(<<961.2763, -2106.1240, 30.5098>>)
ENDIF
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(-10)
IF IS_SCREEN_FADED_OUT()
DO_SCREEN_FADE_IN(500)
ENDIF
ENDIF
ELSE
SWITCH iCutsceneStage
CASE 0
//Cutscene
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), <<-858.0734, 157.1951, 63.7158>>) < DEFAULT_CUTSCENE_LOAD_DIST / 4.0
REQUEST_CUTSCENE("mic_2_mcs_3_concat")
//Request Cutscene Variations - mic_2_mcs_3_concat
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Franklin", PLAYER_PED(CHAR_FRANKLIN))
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", PLAYER_PED(CHAR_MICHAEL))
ENDIF
ELIF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), <<-858.0734, 157.1951, 63.7158>>) > DEFAULT_CUTSCENE_UNLOAD_DIST / 4.0
IF HAS_CUTSCENE_LOADED()
REMOVE_CUTSCENE()
ENDIF
ENDIF
VECTOR vLocSize
vLocSize = <<LOCATE_SIZE_ANY_MEANS, LOCATE_SIZE_ANY_MEANS, LOCATE_SIZE_HEIGHT>>
STRING sCommonLeave
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
sCommonLeave = "CMN_FLEAVE"
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN
sCommonLeave = "CMN_MLEAVE"
ENDIF
VEHICLE_INDEX vehArrive
#IF IS_DEBUG_BUILD DONT_DO_J_SKIP(sLocatesData) #ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("OutroCutArrive")
SAFE_REMOVE_BLIP(blipMichael)
SAFE_REMOVE_BLIP(blipFranklin)
IF NOT HAS_LABEL_BEEN_TRIGGERED("MCH2_GMCSH")
IF IS_PLAYER_AT_LOCATION_WITH_BUDDY_ANY_MEANS(sLocatesData, <<-858.0734, 157.1951, 63.7158>>, vLocSize, TRUE, NOT_PLAYER_PED_ID(), "MCH2_GMCSH", sCommonLeave, FALSE, TRUE)
IF CAN_PLAYER_START_CUTSCENE()
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
vehArrive = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
ENDIF
IF DOES_ENTITY_EXIST(vehArrive)
AND NOT IS_ENTITY_DEAD(vehArrive)
SET_LABEL_AS_TRIGGERED("OutroCutArrive", TRUE)
ELSE
ADVANCE_STAGE()
ENDIF
ENDIF
ENDIF
ELSE
IF IS_PLAYER_AT_LOCATION_WITH_BUDDY_ANY_MEANS(sLocatesData, <<-858.0734, 157.1951, 63.7158>>, vLocSize, TRUE, NOT_PLAYER_PED_ID(), "", sCommonLeave, FALSE, TRUE)
IF CAN_PLAYER_START_CUTSCENE()
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
vehArrive = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
ENDIF
IF DOES_ENTITY_EXIST(vehArrive)
AND NOT IS_ENTITY_DEAD(vehArrive)
SET_LABEL_AS_TRIGGERED("OutroCutArrive", TRUE)
ELSE
ADVANCE_STAGE()
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF HAS_LABEL_BEEN_TRIGGERED("OutroCutArrive")
//B* 2135862: Force multihead blinders on early
SET_MULTIHEAD_SAFE(TRUE)
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
vehArrive = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
ENDIF
IF DOES_ENTITY_EXIST(vehArrive)
IF IS_VEHICLE_ON_ALL_WHEELS(vehArrive)
BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(vehArrive, DEFAULT, DEFAULT, DEFAULT, TRUE)
ENDIF
IF IS_VEHICLE_STOPPED(vehArrive)
IF GET_SCRIPT_TASK_STATUS(PLAYER_PED_ID(), SCRIPT_TASK_LEAVE_ANY_VEHICLE) <> PERFORMING_TASK
TASK_LEAVE_ANY_VEHICLE(PLAYER_PED_ID(), 400, ECF_DONT_DEFAULT_WARP_IF_DOOR_BLOCKED)
ENDIF
IF GET_SCRIPT_TASK_STATUS(NOT_PLAYER_PED_ID(), SCRIPT_TASK_LEAVE_ANY_VEHICLE) <> PERFORMING_TASK
TASK_LEAVE_ANY_VEHICLE(NOT_PLAYER_PED_ID(), 800, ECF_DONT_DEFAULT_WARP_IF_DOOR_BLOCKED)
ENDIF
ENDIF
ENDIF
IF (GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID()) = NULL
OR (IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) AND NOT IS_ENTRY_POINT_FOR_SEAT_CLEAR(PLAYER_PED_ID(), GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()), GET_SEAT_PED_IS_IN(PLAYER_PED_ID()))))
AND (GET_VEHICLE_PED_IS_USING(NOT_PLAYER_PED_ID()) = NULL
OR (IS_PED_IN_ANY_VEHICLE(NOT_PLAYER_PED_ID()) AND NOT IS_ENTRY_POINT_FOR_SEAT_CLEAR(NOT_PLAYER_PED_ID(), GET_VEHICLE_PED_IS_IN(NOT_PLAYER_PED_ID()), GET_SEAT_PED_IS_IN(NOT_PLAYER_PED_ID()))))
ADVANCE_STAGE()
ENDIF
ENDIF
IF NOT IS_MESSAGE_BEING_DISPLAYED()
AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), <<-858.0734, 157.1951, 63.7158>>) >= 200.0
IF GET_FAILS_COUNT_TOTAL_FOR_THIS_MISSION_SCRIPT() % 2 = 0
CREATE_CONVERSATION_ADV("MCH2_DRV3")
ELSE
CREATE_CONVERSATION_ADV("MCH2_BANTER")
ENDIF
ELSE
SET_LABEL_AS_TRIGGERED("MCH2_DRV3", TRUE)
SET_LABEL_AS_TRIGGERED("MCH2_BANTER", TRUE)
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("ItsOver")
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
PLAY_AUDIO(MIC2_RADIO_SETUP)
ELSE
PLAY_AUDIO(MIC2_OVER)
ENDIF
SET_LABEL_AS_TRIGGERED("ItsOver", TRUE)
ENDIF
ENDIF
IF HAS_LABEL_BEEN_TRIGGERED("MCH2_DRV3")
OR HAS_LABEL_BEEN_TRIGGERED("MCH2_BANTER")
IF IS_THIS_CONVERSATION_ONGOING_OR_QUEUED("MCH2_DRV3")
OR IS_THIS_CONVERSATION_ONGOING_OR_QUEUED("MCH2_BANTER")
IF NOT DOES_BLIP_EXIST(sLocatesData.LocationBlip)
//IF NOT IS_FACE_TO_FACE_CONVERSATION_PAUSED()
PAUSE_FACE_TO_FACE_CONVERSATION(TRUE)
//ENDIF
ELSE
//IF IS_FACE_TO_FACE_CONVERSATION_PAUSED()
PAUSE_FACE_TO_FACE_CONVERSATION(FALSE)
//ENDIF
ENDIF
ENDIF
ENDIF
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED(CHAR_MICHAEL)), GET_ENTITY_COORDS(PLAYER_PED(CHAR_FRANKLIN))) > 250.0
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
eMissionFail = failFranklinAbandon
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN
eMissionFail = failMichaelAbandon
ENDIF
missionFailed()
ENDIF
BREAK
ENDSWITCH
ENDIF
IF CLEANUP_STAGE()
//Cleanup (Blips, peds, variables etc.)
//Audio Scene
IF IS_AUDIO_SCENE_ACTIVE("MI_2_DRIVE_HOME")
STOP_AUDIO_SCENE("MI_2_DRIVE_HOME")
ENDIF
eMissionObjective = INT_TO_ENUM(MissionObjective, ENUM_TO_INT(eMissionObjective) + 1)
ENDIF
ENDPROC
PROC cutEnd()
IF INIT_STAGE()
SAFE_SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
bRadar = FALSE
#IF IS_DEBUG_BUILD
IF bAutoSkipping = FALSE
#ENDIF
//Roads
SET_ROADS_IN_AREA(<<-877.67, 224.67, 72.30>>, <<-853.08, 125.01, 56.63>>, FALSE)
//Cutscene
REQUEST_CUTSCENE("mic_2_mcs_3_concat")
//Interior
intMansion = GET_INTERIOR_AT_COORDS_WITH_TYPE(<<-812.1879, 179.9663, 71.1639>>, "V_Michael")
PIN_INTERIOR_IN_MEMORY(intMansion)
#IF IS_DEBUG_BUILD
ENDIF
#ENDIF
IF SKIPPED_STAGE()
SET_PED_POSITION(PLAYER_PED(CHAR_MICHAEL), <<-860.1198, 157.7610, 63.9212>>, 339.3617, FALSE)
SET_PED_POSITION(PLAYER_PED(CHAR_FRANKLIN), <<-859.0430, 160.0430, 64.3859>>, 156.8454, FALSE)
IF NOT bReplaySkip
LOAD_SCENE_ADV(<<-860.1198, 157.7610, 63.9212>>, 20.0)
ENDIF
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(-10)
ENDIF
ELSE
//Request Cutscene Variations - mic_2_mcs_3_concat
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Franklin", PLAYER_PED(CHAR_FRANKLIN))
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", PLAYER_PED(CHAR_MICHAEL))
ENDIF
SWITCH iCutsceneStage
CASE 0
IF (IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
AND IS_VEHICLE_STOPPED(GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID())))
OR NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF HAS_THIS_CUTSCENE_LOADED_WITH_FAILSAFE("mic_2_mcs_3_concat")
CLEAR_TEXT()
// IF GET_CURRENT_PLAYER_PED_ENUM() != CHAR_FRANKLIN
// MAKE_SELECTOR_PED_SELECTION(sSelectorPeds, SELECTOR_PED_FRANKLIN)
// TAKE_CONTROL_OF_SELECTOR_PED(sSelectorPeds, TRUE, TRUE, TCF_CLEAR_TASK_INTERRUPT_CHECKS)
//
// SET_GAMEPLAY_CAM_FOLLOW_PED_THIS_UPDATE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
// ENDIF
//
// IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
// REGISTER_ENTITY_FOR_CUTSCENE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], "Michael", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
// ENDIF
IF GET_CURRENT_PLAYER_PED_ENUM() != CHAR_MICHAEL
MAKE_SELECTOR_PED_SELECTION(sSelectorPeds, SELECTOR_PED_MICHAEL)
TAKE_CONTROL_OF_SELECTOR_PED(sSelectorPeds, TRUE, TRUE, TCF_CLEAR_TASK_INTERRUPT_CHECKS)
SET_GAMEPLAY_CAM_FOLLOW_PED_THIS_UPDATE(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
ENDIF
REGISTER_ENTITY_FOR_CUTSCENE(PLAYER_PED_ID(), "Michael", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, GET_PLAYER_PED_MODEL(CHAR_MICHAEL), CEO_PRESERVE_FACE_BLOOD_DAMAGE | CEO_PRESERVE_BODY_BLOOD_DAMAGE)
IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
REGISTER_ENTITY_FOR_CUTSCENE(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], "Franklin", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
// vehEnd = GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID())
//
// IF DOES_ENTITY_EXIST(vehEnd)
// AND NOT IS_ENTITY_DEAD(vehEnd)
// SET_ENTITY_AS_MISSION_ENTITY(vehEnd)
//
// SET_VEHICLE_ENGINE_ON(vehEnd, FALSE, TRUE)
// SET_VEHICLE_RADIO_ENABLED(vehEnd, FALSE)
//
// REGISTER_ENTITY_FOR_CUTSCENE(vehEnd, "MIC2_Car", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
// ENDIF
// REGISTER_ENTITY_FOR_CUTSCENE(NULL, "MIC2_Car", CU_DONT_ANIMATE_ENTITY, COQUETTE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
REPLAY_RECORD_BACK_FOR_TIME(5.0, 0.0, REPLAY_IMPORTANCE_HIGHEST)
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
START_CUTSCENE()
WAIT_WITH_DEATH_CHECKS(0)
CLEAR_PED_BLOOD_DAMAGE(PLAYER_PED(CHAR_MICHAEL))
APPLY_PED_DAMAGE_PACK(PLAYER_PED(CHAR_MICHAEL), "SCR_Torture", 0.0, 1.0)
CLEAR_AREA(<<-857.7942, 159.1706, 64.1449>>, 100.0, TRUE)
IF IS_SCREEN_FADED_OUT()
DO_SCREEN_FADE_IN(500)
ENDIF
ADVANCE_CUTSCENE()
ENDIF
ENDIF
BREAK
CASE 1
//Remove Peds and Cars from the cutscene
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
IF NOT HAS_LABEL_BEEN_TRIGGERED("MichaelInjuries")
ENTITY_INDEX entityMichael
entityMichael = GET_ENTITY_INDEX_OF_CUTSCENE_ENTITY("Michael", PLAYER_ZERO)
IF DOES_ENTITY_EXIST(entityMichael)
AND NOT IS_ENTITY_DEAD(entityMichael)
APPLY_PED_DAMAGE_PACK(PLAYER_PED(CHAR_MICHAEL), "SCR_Torture", 0.0, 1.0)
SET_LABEL_AS_TRIGGERED("MichaelInjuries", TRUE)
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("FadeOutEnd")
IF GET_CUTSCENE_TIME() > ROUND(116.000000 * 1000.0)
IF NOT IS_SCREEN_FADED_OUT()
DO_SCREEN_FADE_OUT(2000)
ENDIF
SET_LABEL_AS_TRIGGERED("FadeOutEnd", TRUE)
ENDIF
IF WAS_CUTSCENE_SKIPPED()
SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, TRUE, FALSE)
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("MIC2_Car")
IF DOES_ENTITY_EXIST(vehEnd)
AND NOT IS_ENTITY_DEAD(vehEnd)
SET_VEHICLE_POSITION(vehEnd, <<-858.4802, 154.9797, 63.5643>>, -5.3912)
SET_VEHICLE_ON_GROUND_PROPERLY(vehEnd)
ACTIVATE_PHYSICS(vehEnd)
SET_VEHICLE_RADIO_ENABLED(vehEnd, TRUE)
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_CAMERA()
IF NOT IS_SCREEN_FADED_OUT()
DO_SCREEN_FADE_OUT(0)
ENDIF
REPLAY_STOP_EVENT()
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0) //SET_GAMEPLAY_CAM_RELATIVE_HEADING(64.7 - GET_ENTITY_HEADING(PLAYER_PED_ID()))
SET_GAMEPLAY_CAM_RELATIVE_PITCH(-10.0)
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Franklin")
SAFE_DELETE_PED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
// IF DOES_ENTITY_EXIST(vehEnd)
// AND NOT IS_ENTITY_DEAD(vehEnd)
// SET_PED_POSITION(PLAYER_PED_ID(), <<-860.5838, 153.3469, 62.9417>>, 359.1850, FALSE)
// TASK_ENTER_VEHICLE(PLAYER_PED_ID(), vehEnd, DEFAULT_TIME_NEVER_WARP, VS_DRIVER, PEDMOVE_WALK)
// FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_ON_FOOT_WALK)
// ELSE
// SET_PED_POSITION(PLAYER_PED_ID(), <<-854.4845, 147.4481, 61.7792>>, 180.0839, FALSE)
// SIMULATE_PLAYER_INPUT_GAIT(PLAYER_ID(), PEDMOVE_WALK, 750, 177.1006, FALSE)
// FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_ON_FOOT_WALK)
// ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michael")
IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(sceneWashFace)
IF NOT DOES_CAM_EXIST(camAnim)
camAnim = CREATE_CAMERA(CAMTYPE_ANIMATED, TRUE)
ENDIF
sceneWashFace = CREATE_SYNCHRONIZED_SCENE(sceneWashFacePos, sceneWashFaceRot)
TASK_SYNCHRONIZED_SCENE(PLAYER_PED(CHAR_MICHAEL), sceneWashFace, sAnimDictMic2WashFace, "michael_washing_face", INSTANT_BLEND_IN, WALK_BLEND_OUT)
PLAY_SYNCHRONIZED_CAM_ANIM(camAnim, sceneWashFace, "michael_washing_face_cam", sAnimDictMic2WashFace)
SET_SYNCHRONIZED_SCENE_PHASE(sceneWashFace, 0.250)
SET_SYNCHRONIZED_SCENE_RATE(sceneWashFace, 0.0)
ENDIF
ENDIF
IF HAS_CUTSCENE_FINISHED()
LOAD_SCENE_ADV(<<-803.2339, 169.1168, 75.7405>>, 20.0)
IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(sceneWashFace)
IF NOT DOES_CAM_EXIST(camAnim)
camAnim = CREATE_CAMERA(CAMTYPE_ANIMATED, TRUE)
ENDIF
sceneWashFace = CREATE_SYNCHRONIZED_SCENE(sceneWashFacePos, sceneWashFaceRot)
TASK_SYNCHRONIZED_SCENE(PLAYER_PED(CHAR_MICHAEL), sceneWashFace, sAnimDictMic2WashFace, "michael_washing_face", INSTANT_BLEND_IN, WALK_BLEND_OUT)
PLAY_SYNCHRONIZED_CAM_ANIM(camAnim, sceneWashFace, "michael_washing_face_cam", sAnimDictMic2WashFace)
SET_SYNCHRONIZED_SCENE_PHASE(sceneWashFace, 0.250)
SET_SYNCHRONIZED_SCENE_RATE(sceneWashFace, 0.0)
ENDIF
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
//Clear Blood
CLEAR_PED_BLOOD_DAMAGE(PLAYER_PED(CHAR_MICHAEL))
//Restore previous clothes
//RESTORE_PLAYER_PED_VARIATIONS(PLAYER_PED(CHAR_MICHAEL))
WHILE NOT SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED(CHAR_MICHAEL), COMP_TYPE_OUTFIT, OUTFIT_P0_NAVY_SUIT, FALSE)
WAIT_WITH_DEATH_CHECKS(0)
ENDWHILE
TRIGGER_MISSION_STATS_UI(TRUE, TRUE)
HIDE_LOADING_ON_FADE_THIS_FRAME()
iAdvanceTimer = GET_GAME_TIMER() + 30000
ADVANCE_CUTSCENE()
ENDIF
BREAK
CASE 2
HIDE_LOADING_ON_FADE_THIS_FRAME()
REQUEST_SCRIPT_AUDIO_BANK("FAM5_WASH_FACE")
IF (IS_SYNCHRONIZED_SCENE_RUNNING(sceneWashFace)
AND HAVE_ALL_STREAMING_REQUESTS_COMPLETED(PLAYER_PED(CHAR_MICHAEL)))
OR GET_GAME_TIMER() > iAdvanceTimer
OR GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("mission_stat_watcher")) < 1
IF (g_bResultScreenDisplaying)
OR GET_GAME_TIMER() > iAdvanceTimer
OR GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("mission_stat_watcher")) < 1
ADVANCE_CUTSCENE()
ENDIF
ENDIF
BREAK
CASE 3
HIDE_LOADING_ON_FADE_THIS_FRAME()
IF (REQUEST_SCRIPT_AUDIO_BANK("FAM5_WASH_FACE")
AND IS_SYNCHRONIZED_SCENE_RUNNING(sceneWashFace)
AND HAVE_ALL_STREAMING_REQUESTS_COMPLETED(PLAYER_PED(CHAR_MICHAEL)))
OR GET_GAME_TIMER() > iAdvanceTimer
OR GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("mission_stat_watcher")) < 1
IF (NOT g_bResultScreenDisplaying)
OR GET_GAME_TIMER() > iAdvanceTimer
OR GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("mission_stat_watcher")) < 1
WAIT_WITH_DEATH_CHECKS(500)
SET_CLOCK_TIME(11, 0, 0)
// IF NOT DOES_CAM_EXIST(camMain)
// camMain = CREATE_CAM("DEFAULT_SCRIPTED_CAMERA", TRUE)
// ENDIF
//
// SET_CAM_PARAMS(camMain,
// <<-804.204712, 168.047638, 76.793808>>,
// <<5.523620, 0.0, -6.194664>>,
// 45.0)
//
// SET_CAM_PARAMS(camMain,
// <<-804.204712, 168.047638, 76.793808>>,
// <<6.774823, 0.0, -8.368400>>,
// 45.0,
// 5000)
//
// SET_CAM_ACTIVE(camMain, TRUE)
//
// STOP_CAM_SHAKING(camMain, TRUE)
REQUEST_PTFX_ASSET()
WHILE NOT HAS_PTFX_ASSET_LOADED()
WAIT(0)
PRINTSTRING("LOADING PARTICLES")
PRINTNL()
ENDWHILE
RENDER_SCRIPT_CAMS(TRUE, FALSE)
SET_SYNCHRONIZED_SCENE_PHASE(sceneWashFace, 0.250)
SET_SYNCHRONIZED_SCENE_RATE(sceneWashFace, 1.0)
START_PARTICLE_FX_NON_LOOPED_ON_PED_BONE("scr_pts_headsplash", PLAYER_PED_ID(), VECTOR_ZERO, VECTOR_ZERO, BONETAG_PH_L_HAND)
IF NOT IS_SCREEN_FADED_IN()
AND NOT IS_SCREEN_FADING_IN()
DO_SCREEN_FADE_IN(2000)
ENDIF
ADVANCE_CUTSCENE()
ENDIF
ENDIF
BREAK
CASE 4
IF (IS_SYNCHRONIZED_SCENE_RUNNING(sceneWashFace)
AND GET_SYNCHRONIZED_SCENE_PHASE(sceneWashFace) >= 0.875)
OR NOT IS_SYNCHRONIZED_SCENE_RUNNING(sceneWashFace)
RENDER_SCRIPT_CAMS(FALSE, TRUE, DEFAULT_INTERP_TO_FROM_GAME, FALSE)
SAFE_SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
CLEAR_PED_TASKS(PLAYER_PED_ID())
SIMULATE_PLAYER_INPUT_GAIT(PLAYER_ID(), PEDMOVE_WALK, 2000, 21.0, FALSE)
FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_ON_FOOT_WALK)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
ADVANCE_CUTSCENE()
ENDIF
BREAK
CASE 5
IF NOT IS_INTERPOLATING_FROM_SCRIPT_CAMS()
ADVANCE_STAGE()
ENDIF
BREAK
ENDSWITCH
ENDIF
IF CLEANUP_STAGE()
//Cleanup (Blips, peds, variables etc.)
IF DOES_CAM_EXIST(camAnim)
DESTROY_CAM(camAnim)
ENDIF
SAFE_DELETE_PED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
//SAFE_DELETE_PED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
SAFE_REMOVE_BLIP(blipDestination)
eMissionObjective = INT_TO_ENUM(MissionObjective, ENUM_TO_INT(eMissionObjective) + 1)
ENDIF
ENDPROC
// DEBUG
#IF IS_DEBUG_BUILD
PROC debugRoutine()
IF bAutoSkipping = TRUE
IF ENUM_TO_INT(eMissionObjective) >= ENUM_TO_INT(eMissionObjectiveAutoJSkip)
// IF IS_SCREEN_FADED_OUT()
// DO_SCREEN_FADE_IN(500)
//
// WHILE IS_SCREEN_FADING_IN()
// WAIT(0)
// ENDWHILE
// ENDIF
eMissionObjectiveAutoJSkip = initMission
bAutoSkipping = FALSE
bSkipped = TRUE
ENDIF
ENDIF
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_S)
CLEAR_TEXT()
//Cutscene
WHILE NOT HAS_CUTSCENE_FINISHED()
STOP_CUTSCENE(TRUE)
PRINTLN("STOPPING CUTSCENE...")
WAIT_WITH_DEATH_CHECKS(0)
ENDWHILE
REMOVE_CUTSCENE()
WHILE HAS_CUTSCENE_LOADED()
PRINTLN("REMOVING CUTSCENE...")
WAIT_WITH_DEATH_CHECKS(0)
ENDWHILE
missionPassed()
ELIF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_F)
CLEAR_TEXT()
//Cutscene
WHILE NOT HAS_CUTSCENE_FINISHED()
STOP_CUTSCENE(TRUE)
PRINTLN("STOPPING CUTSCENE...")
WAIT_WITH_DEATH_CHECKS(0)
ENDWHILE
REMOVE_CUTSCENE()
WHILE HAS_CUTSCENE_LOADED()
PRINTLN("REMOVING CUTSCENE...")
WAIT_WITH_DEATH_CHECKS(0)
ENDWHILE
missionFailed()
ELIF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_J)
OR ENUM_TO_INT(eMissionObjective) < ENUM_TO_INT(eMissionObjectiveAutoJSkip)
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_J)
bSkipped = TRUE
ENDIF
IF NOT IS_SCREEN_FADED_OUT()
AND NOT IS_SCREEN_FADING_OUT()
DO_SCREEN_FADE_OUT(500)
WHILE NOT IS_SCREEN_FADED_OUT()
WAIT_WITH_DEATH_CHECKS(0)
ENDWHILE
ENDIF
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
CLEAR_TEXT()
//Cutscene
WHILE NOT HAS_CUTSCENE_FINISHED()
STOP_CUTSCENE(TRUE)
PRINTLN("STOPPING CUTSCENE...")
WAIT_WITH_DEATH_CHECKS(0)
ENDWHILE
REMOVE_CUTSCENE()
WHILE HAS_CUTSCENE_LOADED()
PRINTLN("REMOVING CUTSCENE...")
WAIT_WITH_DEATH_CHECKS(0)
ENDWHILE
ADVANCE_STAGE()
TEXT_LABEL txtLabel
txtLabel = "Stage: "
txtLabel += ENUM_TO_INT(eMissionObjective)
PRINTSTRING(txtLabel)
PRINTNL()
ELIF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_P)
OR LAUNCH_MISSION_STAGE_MENU(SkipMenuStruct, iStageSkipMenu, ENUM_TO_INT(eMissionObjective))
IF bAutoSkipping = FALSE
bAutoSkipping = TRUE
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_P)
eMissionObjectiveAutoJSkip = INT_TO_ENUM(MissionObjective, ENUM_TO_INT(eMissionObjective) - 1)
ELSE
eMissionObjectiveAutoJSkip = INT_TO_ENUM(MissionObjective, iStageSkipMenu)
ENDIF
eMissionObjective = initMission
DO_SCREEN_FADE_OUT(500)
WHILE NOT IS_SCREEN_FADED_OUT()
WAIT(0)
ENDWHILE
//Cutscene
WHILE NOT HAS_CUTSCENE_FINISHED()
STOP_CUTSCENE(TRUE)
PRINTLN("STOPPING CUTSCENE...")
WAIT_WITH_DEATH_CHECKS(0)
ENDWHILE
REMOVE_CUTSCENE()
WHILE HAS_CUTSCENE_LOADED()
PRINTLN("REMOVING CUTSCENE...")
WAIT_WITH_DEATH_CHECKS(0)
ENDWHILE
MISSION_CLEANUP(TRUE)
CLEAR_AREA(GET_ENTITY_COORDS(PLAYER_PED_ID()), 10000.0, TRUE)
ENDIF
ENDIF
ENDPROC
#ENDIF
// MISSION SCRIPT
SCRIPT
IF HAS_FORCE_CLEANUP_OCCURRED()
IF DOES_ENTITY_EXIST(NOT_PLAYER_PED_ID())
AND NOT IS_PED_INJURED(NOT_PLAYER_PED_ID())
IF IS_ENTITY_ATTACHED(NOT_PLAYER_PED_ID())
g_bDontLetBuddiesReactToNextPlayerDeath = TRUE
ENDIF
SET_PED_KEEP_TASK(NOT_PLAYER_PED_ID(), TRUE)
ENDIF
IF DOES_ENTITY_EXIST(objHook)
IF DOES_ENTITY_EXIST(PLAYER_PED(CHAR_MICHAEL))
AND IS_PED_INJURED(PLAYER_PED(CHAR_MICHAEL))
AND GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED(CHAR_MICHAEL), FALSE), GET_ENTITY_COORDS(objHook)) < 5.0
AND ARE_COORDS_IN_3D_AREA(GET_ENTITY_COORDS(PLAYER_PED(CHAR_MICHAEL), FALSE), <<994.382935, -2150.192871, 31.976345>> - <<1.0, 1.0, 2.5>>, <<994.382935, -2150.192871, 31.976345>> + <<1.0, 1.0, 2.5>>)
//Pin the ankle to the bottom of the hook
VECTOR vRightFootAttach
vRightFootAttach = <<-0.075, -0.1, -0.85>>
ATTACH_ENTITY_TO_ENTITY_PHYSICALLY(PLAYER_PED(CHAR_MICHAEL), objHook, GET_PED_BONE_INDEX(PLAYER_PED(CHAR_MICHAEL), BONETAG_R_FOOT), -1, vRightFootAttach, VECTOR_ZERO, VECTOR_ZERO, -1.0, TRUE, FALSE, FALSE, FALSE)
ATTACH_ENTITY_TO_ENTITY_PHYSICALLY(PLAYER_PED(CHAR_MICHAEL), objHook, GET_PED_BONE_INDEX(PLAYER_PED(CHAR_MICHAEL), BONETAG_L_FOOT), -1, <<-vRightFootAttach.X, vRightFootAttach.Y, vRightFootAttach.Z>>, VECTOR_ZERO, VECTOR_ZERO, -1.0, TRUE, FALSE, FALSE, FALSE)
ENDIF
ENDIF
Mission_Flow_Mission_Force_Cleanup()
enumCharacterList eCharFail = GET_CURRENT_PLAYER_PED_ENUM()
STORE_FAIL_WEAPON(PLAYER_PED_ID(), ENUM_TO_INT(eCharFail))
//Because Michael is restricted you are switched to Franklin, so we need to check if he's in the building
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<967.567566, -2195.217529, 25.539518>>, <<972.950378, -2098.676270, 49.888527>>, 70.0)
MISSION_FLOW_SET_FAIL_WARP_LOCATION(<<933.0538, -2162.6216, 29.5012>>, 96.4993)
SET_REPLAY_DECLINED_VEHICLE_WARP_LOCATION(<<929.5760, -2162.3455, 29.3527>>, 175.2960)
ENDIF
SET_MICHAEL_UNAVAILABLE_ON_FAIL()
MISSION_CLEANUP(FALSE, TRUE)
ENDIF
SET_MISSION_FLAG(TRUE)
// MISSION LOOP
#IF IS_DEBUG_BUILD
MissionNames()
#ENDIF
IF GET_CURRENT_PLAYER_PED_ENUM() != CHAR_FRANKLIN
IF DOES_ENTITY_EXIST(g_sTriggerSceneAssets.ped[3]) //Franklin
IF NOT IS_PED_INJURED(g_sTriggerSceneAssets.ped[3])
//Transfer the global index to a local index and grab ownership of the entity.
sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN] = g_sTriggerSceneAssets.ped[3]
SET_ENTITY_AS_MISSION_ENTITY(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], TRUE, TRUE)
ENDIF
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(g_sTriggerSceneAssets.ped[0]) //Denise
IF NOT IS_PED_INJURED(g_sTriggerSceneAssets.ped[0])
//Transfer the global index to a local index and grab ownership of the entity.
pedDenise = g_sTriggerSceneAssets.ped[0]
SET_ENTITY_AS_MISSION_ENTITY(pedDenise, TRUE, TRUE)
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(g_sTriggerSceneAssets.ped[1]) //Friend 1
IF NOT IS_PED_INJURED(g_sTriggerSceneAssets.ped[1])
//Transfer the global index to a local index and grab ownership of the entity.
pedFriend1 = g_sTriggerSceneAssets.ped[1]
SET_ENTITY_AS_MISSION_ENTITY(pedFriend1, TRUE, TRUE)
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(g_sTriggerSceneAssets.ped[2]) //Friend 2
IF NOT IS_PED_INJURED(g_sTriggerSceneAssets.ped[2])
//Transfer the global index to a local index and grab ownership of the entity.
pedFriend2 = g_sTriggerSceneAssets.ped[2]
SET_ENTITY_AS_MISSION_ENTITY(pedFriend2, TRUE, TRUE)
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(g_sTriggerSceneAssets.object[0]) //Animated Door
//Transfer the global index to a local index and grab ownership of the entity.
objDoorAnim = g_sTriggerSceneAssets.object[0]
SET_ENTITY_AS_MISSION_ENTITY(objDoorAnim, TRUE, TRUE)
ENDIF
IF DOES_ENTITY_EXIST(g_sTriggerSceneAssets.object[1]) //Real Door
//Transfer the global index to a local index and grab ownership of the entity.
objDoorReal = g_sTriggerSceneAssets.object[1]
SET_ENTITY_AS_MISSION_ENTITY(objDoorReal, TRUE, TRUE)
ENDIF
IF NOT IS_REPLAY_IN_PROGRESS()
//Safely reposition players vehicle
IF GET_PLAYER_PED_ENUM(PLAYER_PED_ID()) != CHAR_TREVOR
IF DOES_ENTITY_EXIST(PLAYER_PED_ID())
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
IF GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID()) != NULL
vehFranklin = GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID()) PRINTLN("vehIndex = GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID())")
ELIF GET_PLAYERS_LAST_VEHICLE() != NULL
vehFranklin = GET_PLAYERS_LAST_VEHICLE() PRINTLN("vehIndex = GET_PLAYERS_LAST_VEHICLE()")
IF IS_ENTITY_DEAD(vehFranklin)
OR (NOT IS_ENTITY_DEAD(vehFranklin)
AND GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(vehFranklin)) > 50.0)
vehFranklin = NULL PRINTLN("vehIndex = NULL")
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(vehFranklin)
SET_ENTITY_AS_MISSION_ENTITY(vehFranklin, TRUE, TRUE) PRINTLN("SET_ENTITY_AS_MISSION_ENTITY(vehIndex)")
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(vehFranklin, TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
IF HAS_THIS_CUTSCENE_LOADED("MIC_2_INT")
PED_INDEX pedLastPlayer
pedLastPlayer = PLAYER_PED_ID()
IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
IF GET_CURRENT_PLAYER_PED_ENUM() != CHAR_FRANKLIN
MAKE_SELECTOR_PED_SELECTION(sSelectorPeds, SELECTOR_PED_FRANKLIN)
TAKE_CONTROL_OF_SELECTOR_PED(sSelectorPeds, TRUE, TRUE, TCF_CLEAR_TASK_INTERRUPT_CHECKS)
SET_GAMEPLAY_CAM_FOLLOW_PED_THIS_UPDATE(pedLastPlayer)
SET_LABEL_AS_TRIGGERED("SwitchFX[MIC_2_INT]", TRUE)
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(PLAYER_PED_ID())
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
ENDIF
ENDIF
REGISTER_ENTITY_FOR_CUTSCENE(pedIntro, "Knocked_Out_Ped", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, G_M_Y_FAMCA_01)
IF DOES_ENTITY_EXIST(pedDenise)
REGISTER_ENTITY_FOR_CUTSCENE(pedDenise, "DENISE", CU_ANIMATE_AND_DELETE_EXISTING_SCRIPT_ENTITY)
ENDIF
IF DOES_ENTITY_EXIST(pedFriend1)
REGISTER_ENTITY_FOR_CUTSCENE(pedFriend1, "Denises_Friend_1", CU_ANIMATE_AND_DELETE_EXISTING_SCRIPT_ENTITY)
ENDIF
IF DOES_ENTITY_EXIST(pedFriend2)
REGISTER_ENTITY_FOR_CUTSCENE(pedFriend2, "Denises_Friend_2", CU_ANIMATE_AND_DELETE_EXISTING_SCRIPT_ENTITY)
ENDIF
IF GET_CURRENT_PLAYER_PED_ENUM() != CHAR_FRANKLIN
IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])
REGISTER_ENTITY_FOR_CUTSCENE(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], "Franklin", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, GET_PLAYER_PED_MODEL(CHAR_FRANKLIN))
ELSE
REGISTER_ENTITY_FOR_CUTSCENE(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], "Franklin", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, GET_PLAYER_PED_MODEL(CHAR_FRANKLIN))
ENDIF
ENDIF
IF GET_CURRENT_PLAYER_PED_ENUM() != CHAR_TREVOR
IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
REGISTER_ENTITY_FOR_CUTSCENE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], "Trevor", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, GET_PLAYER_PED_MODEL(CHAR_TREVOR))
ELSE
REGISTER_ENTITY_FOR_CUTSCENE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], "Trevor", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, GET_PLAYER_PED_MODEL(CHAR_TREVOR))
ENDIF
ENDIF
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
START_CUTSCENE()
SET_EVERYONE_IGNORE_PLAYER(PLAYER_ID(), TRUE)
bPreloaded = TRUE
ENDIF
ENDIF
MISSION_FLOW_RELEASE_TRIGGER_SCENE_ASSETS(SP_MISSION_MICHAEL_2)
PRINTLN("Michael 2 - Mission Launch Check")
WHILE (TRUE)
//Video Recorder
REPLAY_CHECK_FOR_EVENT_THIS_FRAME("M_FreshMeat")
// #IF IS_DEBUG_BUILD
// SPLINE_CAM_EDITOR()
// #ENDIF
INT i
//Fail Checks
DEATH_CHECKS()
// Temp fix to force the interior to uncap when you're close to it.
IF bSetUncapped
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID(), FALSE), <<993.818237, -2180.848389, 31.164871>>) < 240.0
SET_INTERIOR_CAPPED(INTERIOR_V_ABATTOIR, FALSE)
bSetUncapped = FALSE
ENDIF
ENDIF
//Deadly deadly mincers
IF NOT IS_SCREEN_FADED_OUT()
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<975.882324, -2166.031006, 28.599106>>, <<973.063477, -2165.699951, 30.599342>>, 1.75)
OR (IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<993.639832, -2161.967773, 29.369600>>, <<991.663147, -2161.787354, 32.325283>>, 2.0)
AND NOT IS_PED_JUMPING(PLAYER_PED_ID()))
OR (IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<976.623962, -2119.597168, 30.455158>>, <<976.444641, -2121.593750, 33.455223>>, 2.0)
AND NOT IS_PED_JUMPING(PLAYER_PED_ID()))
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<998.518921, -2139.156494, 27.753616>>, <<998.213562, -2142.145020, 32.753616>>, 2.0)
IF NOT GET_PLAYER_INVINCIBLE(PLAYER_ID())
AND NOT IS_ENTITY_ATTACHED(PLAYER_PED_ID())
IF NOT IS_PED_RAGDOLL(PLAYER_PED_ID())
SET_HIGH_FALL_TASK(PLAYER_PED_ID(), 10000, 10000)
ENDIF
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<998.392700,-2140.970215,30.976324>>, <<10.0, 12.0, 2.5 >>)
REQUEST_SCRIPT_AUDIO_BANK("Michael_2_Chopped_Up")
ENDIF
IF (HAS_ANIM_DICT_LOADED_CHECK(sAnimDictMic2SetPiece1)
AND HAS_ANIM_DICT_LOADED_CHECK(sAnimDictMic2SetPiece2))
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<998.518921, -2139.156494, 27.753616>>, <<998.213562, -2142.145020, 32.753616>>, 2.0)
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<993.639832, -2161.967773, 29.369600>>, <<991.663147, -2161.787354, 32.325283>>, 2.0)
START_PARTICLE_FX_NON_LOOPED_AT_COORD("scr_abattoir_ped_minced", <<992.7037, -2161.9229, 31.8097 - 1.0>>, VECTOR_ZERO)
PLAY_SOUND_FROM_COORD(-1, "MINCER_FALL", <<992.7037, -2161.9229, 31.8097 - 1.0>>, "MICHAEL_2_SOUNDS")
SET_CONTROL_SHAKE(PLAYER_CONTROL, 100, 100)
//Cam
IF NOT DOES_CAM_EXIST(camMain)
camMain = CREATE_CAM("DEFAULT_SCRIPTED_CAMERA", TRUE)
ENDIF
SET_CAM_PARAMS(camMain,
<<990.255493, -2156.313232, 31.377579>>,
<<-1.060463, 0.0,-153.399750>>,
17.464592)
SET_CAM_ACTIVE(camMain, TRUE)
SHAKE_CAM(camMain, "ROAD_VIBRATION_SHAKE", 2.0)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
HANG_UP_AND_PUT_AWAY_PHONE(TRUE)
TASK_PLAY_ANIM_ADVANCED(PLAYER_PED_ID(), sAnimDictMic2SetPiece1, "goonfall_into_grinder", <<990.626, -2161.452, 31.691>>, <<0.0, 0.0, 90.0>>, INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1, AF_FORCE_START | AF_EXTRACT_INITIAL_OFFSET | AF_NOT_INTERRUPTABLE | AF_OVERRIDE_PHYSICS | AF_IGNORE_GRAVITY | AF_HOLD_LAST_FRAME, 0.215, EULER_YXZ, AIK_DISABLE_LEG_IK)
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID())
WAIT_WITH_DEATH_CHECKS(1000)
DO_SCREEN_FADE_OUT(DEFAULT_FADE_TIME)
WHILE NOT IS_SCREEN_FADED_OUT()
WAIT_WITH_DEATH_CHECKS(0)
ENDWHILE
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
SET_PED_POSITION(PLAYER_PED_ID(), <<990.255493, -2156.313232, 31.377579>>, 0.0, FALSE)
ELIF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<976.623962, -2119.597168, 30.455158>>, <<976.444641, -2121.593750, 33.455223>>, 2.0)
START_PARTICLE_FX_NON_LOOPED_AT_COORD("scr_abattoir_ped_minced", <<976.72, -2120.27, 31.5>>, VECTOR_ZERO)
PLAY_SOUND_FROM_COORD(-1, "MINCER_FALL", <<976.72, -2120.27, 31.5>>, "MICHAEL_2_SOUNDS")
SET_CONTROL_SHAKE(PLAYER_CONTROL, 100, 100)
//Cam
IF NOT DOES_CAM_EXIST(camMain)
camMain = CREATE_CAM("DEFAULT_SCRIPTED_CAMERA", TRUE)
ENDIF
SET_CAM_PARAMS(camMain,
<<974.021423, -2116.019531, 32.641281>>,
<<-3.792372, 0.0, -151.450134>>,
30.157396)
SET_CAM_ACTIVE(camMain, TRUE)
SHAKE_CAM(camMain, "ROAD_VIBRATION_SHAKE", 2.0)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
HANG_UP_AND_PUT_AWAY_PHONE(TRUE)
TASK_PLAY_ANIM_ADVANCED(PLAYER_PED_ID(), sAnimDictMic2SetPiece2, "goon_fall_onto_conveyor", <<980.074, -2121.410, 29.482>>, <<0.0, 0.0, 0.0>>, INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1, AF_FORCE_START | AF_EXTRACT_INITIAL_OFFSET | AF_NOT_INTERRUPTABLE | AF_OVERRIDE_PHYSICS | AF_IGNORE_GRAVITY | AF_HOLD_LAST_FRAME, 0.559, EULER_YXZ, AIK_DISABLE_LEG_IK)
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID())
WAIT_WITH_DEATH_CHECKS(1000)
DO_SCREEN_FADE_OUT(DEFAULT_FADE_TIME)
WHILE NOT IS_SCREEN_FADED_OUT()
WAIT_WITH_DEATH_CHECKS(0)
ENDWHILE
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
SET_PED_POSITION(PLAYER_PED_ID(), <<974.021423, -2116.019531, 32.641281>>, 0.0, FALSE)
ELIF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<998.518921, -2139.156494, 27.753616>>, <<998.213562, -2142.145020, 32.753616>>, 2.0)
//Cam
IF NOT DOES_CAM_EXIST(camMain)
camMain = CREATE_CAM("DEFAULT_SCRIPTED_CAMERA", TRUE)
ENDIF
SET_CAM_PARAMS(camMain,
<<989.861145, -2144.378174, 31.004501>>,
<<-3.873163, 0.0, -79.889450>>,
38.757084,
0)
SET_CAM_PARAMS(camMain,
<<989.861145, -2144.378174, 31.004501>>,
<<-3.873163, 0.0, -79.889450>>,
35.423241,
1000,
GRAPH_TYPE_DECEL,
GRAPH_TYPE_DECEL)
SHAKE_CAM(camMain, "ROAD_VIBRATION_SHAKE", 1.0)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
START_PARTICLE_FX_NON_LOOPED_ON_ENTITY("scr_abattoir_ped_sliced", PLAYER_PED_ID(), <<0.0, -0.1, -1.0>>, <<0.0, 0.0, 84.0>>, 0.8)
SET_CONTROL_SHAKE(PLAYER_CONTROL, 100, 100)
IF REQUEST_SCRIPT_AUDIO_BANK("Michael_2_Chopped_Up")
PLAY_SOUND_FROM_ENTITY(-1, "MIC_2_CHOPPED_UP_JUMPIN_MASTER", PLAYER_PED_ID())
ENDIF
WAIT_WITH_DEATH_CHECKS(1500)
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN
eMissionFail = failFranklinDied
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
eMissionFail = failMichaelDied
ENDIF
missionFailed()
ENDIF
ENDIF
SET_ENTITY_HEALTH(PLAYER_PED_ID(), 0)
ENDIF
ENDIF
ENDIF
//Interior Pinning - Abattoir
IF intAbattoir = NULL
intAbattoir = GET_INTERIOR_AT_COORDS_WITH_TYPE(<<990.9518, -2178.6208, 29.0257>>, "v_abattoir")
ENDIF
IF intAbattoir != NULL
IF GET_INTERIOR_FROM_ENTITY(PLAYER_PED_ID()) = intAbattoir
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF GET_SCRIPT_TASK_STATUS(PLAYER_PED_ID(), SCRIPT_TASK_LEAVE_ANY_VEHICLE) <> WAITING_TO_START_TASK
AND GET_SCRIPT_TASK_STATUS(PLAYER_PED_ID(), SCRIPT_TASK_LEAVE_ANY_VEHICLE) <> PERFORMING_TASK
AND GET_SCRIPT_TASK_STATUS(PLAYER_PED_ID(), SCRIPT_TASK_LEAVE_ANY_VEHICLE) <> DORMANT_TASK
TASK_LEAVE_ANY_VEHICLE(PLAYER_PED_ID())
ENDIF
ENDIF
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ENTER)
ENDIF
ENDIF
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<961.281494, -2217.055420, 24.568760>>, <<974.338867, -2067.088379, 79.930626>>, 120.0)
IF intAbattoir != NULL
IF bPinnedAbattoir = FALSE
PIN_INTERIOR_IN_MEMORY(intAbattoir)
IF NOT IS_INTERIOR_READY(intAbattoir)
PRINTLN("PINNING INTERIOR...")
ELSE
bPinnedAbattoir = TRUE
ENDIF
ENDIF
ENDIF
ELIF NOT IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<959.795593, -2254.591309, 24.537045>>, <<979.547913, -2022.923828, 87.146744>>, 150.0)
IF intAbattoir <> NULL
IF bPinnedAbattoir = TRUE
SAFE_DELETE_OBJECT(objCow) //Fix for bug 2022984
UNPIN_INTERIOR(intAbattoir)
bPinnedAbattoir = FALSE
ENDIF
ENDIF
ENDIF
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<976.138733, -2084.538330, 29.001110>>, <<966.163025, -2202.844727, 44.551697>>, 100.0)
IF NOT IS_DOOR_REGISTERED_WITH_SYSTEM(iEntranceDoor)
ADD_DOOR_TO_SYSTEM(iEntranceDoor, V_ILEV_ABBMAINDOOR, <<962.0958, -2183.8306, 31.0619>>)
ENDIF
IF IS_DOOR_REGISTERED_WITH_SYSTEM(iEntranceDoor)
IF DOOR_SYSTEM_GET_OPEN_RATIO(iEntranceDoor) <> 1.0
OR DOOR_SYSTEM_GET_DOOR_STATE(iEntranceDoor) != DOORSTATE_FORCE_LOCKED_THIS_FRAME
DOOR_SYSTEM_SET_OPEN_RATIO(iEntranceDoor, 1.0, FALSE, FALSE)
DOOR_SYSTEM_SET_DOOR_STATE(iEntranceDoor, DOORSTATE_FORCE_LOCKED_THIS_FRAME, FALSE, TRUE)
ENDIF
ENDIF
ENDIF
// IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
// IF DOES_ENTITY_EXIST(objHook)
// IF NOT (IS_ENTITY_ATTACHED_TO_ENTITY(PLAYER_PED(CHAR_MICHAEL), objHook)
// AND bReattach = FALSE)
// IF GET_INTERIOR_FROM_ENTITY(PLAYER_PED_ID()) = intAbattoir
// SET_PED_RESET_FLAG(PLAYER_PED_ID(), PRF_DisablePlayerAutoVaulting, TRUE)
// DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_JUMP)
// //DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_FRONTEND_X)
// ENDIF
// ENDIF
// ENDIF
// ENDIF
//Shutter Door
IF eMissionObjective >= stageMichaelEscape
AND eMissionObjective < stageCutEnd
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<962.529602, -2105.850342, 30.0>>, <<50.0, 40.0, 30.0>>)
IF NOT IS_DOOR_REGISTERED_WITH_SYSTEM(iExitDoor)
ADD_DOOR_TO_SYSTEM(iExitDoor, PROP_ABAT_SLIDE, <<962.9084, -2105.8137, 34.6432>>)
ENDIF
IF IS_DOOR_REGISTERED_WITH_SYSTEM(iExitDoor)
IF DOOR_SYSTEM_GET_OPEN_RATIO(iExitDoor) <> 1.0
OR DOOR_SYSTEM_GET_DOOR_STATE(iExitDoor) != DOORSTATE_FORCE_LOCKED_THIS_FRAME
DOOR_SYSTEM_SET_OPEN_RATIO(iExitDoor, 1.0, FALSE, FALSE)
DOOR_SYSTEM_SET_DOOR_STATE(iExitDoor, DOORSTATE_FORCE_LOCKED_THIS_FRAME, FALSE, TRUE)
ENDIF
ENDIF
ENDIF
ELSE
IF NOT IS_DOOR_REGISTERED_WITH_SYSTEM(iExitDoor)
ADD_DOOR_TO_SYSTEM(iExitDoor, PROP_ABAT_SLIDE, <<962.9084, -2105.8137, 34.6432>>)
ENDIF
IF IS_DOOR_REGISTERED_WITH_SYSTEM(iExitDoor)
IF DOOR_SYSTEM_GET_OPEN_RATIO(iExitDoor) <> 0.0
OR DOOR_SYSTEM_GET_DOOR_STATE(iExitDoor) != DOORSTATE_FORCE_LOCKED_THIS_FRAME
DOOR_SYSTEM_SET_OPEN_RATIO(iExitDoor, 0.0, FALSE, FALSE)
DOOR_SYSTEM_SET_DOOR_STATE(iExitDoor, DOORSTATE_FORCE_LOCKED_THIS_FRAME, FALSE, TRUE)
ENDIF
ENDIF
ENDIF
//Animated Machines
IF GET_INTERIOR_FROM_ENTITY(PLAYER_PED_ID()) = intAbattoir
IF NOT DOES_ENTITY_EXIST(objGrinder)
IF bGrabGrinder = FALSE
IF iDoesObjectOfTypeExistAtCoords = 0
IF DOES_OBJECT_OF_TYPE_EXIST_AT_COORDS(<<993.48, -2161.49, 29.96>>, 2.0, V_ILEV_ABMINCER)
objGrinder = GET_CLOSEST_OBJECT_OF_TYPE(<<993.48, -2161.49, 29.96>>, 2.0, V_ILEV_ABMINCER)
IF objGrinder != NULL
bGrabGrinder = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
IF HAS_ANIM_DICT_LOADED_CHECK(sAnimDictMachine)
IF NOT IS_ENTITY_PLAYING_ANIM(objGrinder, sAnimDictMachine, "beefsplitter_loop")
IF DOES_ENTITY_HAVE_DRAWABLE(objGrinder)
PLAY_ENTITY_ANIM(objGrinder, "beefsplitter_loop", sAnimDictMachine, INSTANT_BLEND_IN, TRUE, FALSE)
SET_CAN_CLIMB_ON_ENTITY(objGrinder, FALSE)
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT DOES_ENTITY_EXIST(objCutter)
IF bGrabCutter = FALSE
IF iDoesObjectOfTypeExistAtCoords = 1
IF DOES_OBJECT_OF_TYPE_EXIST_AT_COORDS(<<998.49, -2140.63, 28.47>>, 2.0, P_BEEFSPLITTER_S)
objCutter = GET_CLOSEST_OBJECT_OF_TYPE(<<998.49, -2140.63, 28.47>>, 2.0, P_BEEFSPLITTER_S) #IF IS_DEBUG_BUILD PRINTLN("objCutter = GET_CLOSEST_OBJECT_OF_TYPE(<<998.49, -2140.63, 28.47>>, 2.0, P_BEEFSPLITTER_S)") #ENDIF
IF objCutter != NULL
bGrabCutter = TRUE #IF IS_DEBUG_BUILD PRINTLN("bGrabCutter = TRUE") #ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
IF HAS_ANIM_DICT_LOADED_CHECK(sAnimDictMachine)
IF NOT IS_ENTITY_PLAYING_ANIM(objCutter, sAnimDictMachine, "beefsplitter_loop")
IF DOES_ENTITY_HAVE_DRAWABLE(objCutter)
PLAY_ENTITY_ANIM(objCutter, "beefsplitter_loop", sAnimDictMachine, INSTANT_BLEND_IN, TRUE, FALSE) #IF IS_DEBUG_BUILD PRINTLN("PLAY_ENTITY_ANIM(objCutter, 'beefsplitter_loop', sAnimDictMachine, INSTANT_BLEND_IN, TRUE, FALSE)") #ENDIF
SET_CAN_CLIMB_ON_ENTITY(objCutter, FALSE)
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT DOES_ENTITY_EXIST(objMincer)
IF bGrabMincer = FALSE
IF iDoesObjectOfTypeExistAtCoords = 2
IF DOES_OBJECT_OF_TYPE_EXIST_AT_COORDS(<<975.99, -2120.83, 30.94>>, 2.0, V_ILEV_ABMINCER)
objMincer = GET_CLOSEST_OBJECT_OF_TYPE(<<975.99, -2120.83, 30.94>>, 2.0, V_ILEV_ABMINCER)
IF objMincer != NULL
bGrabMincer = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
IF HAS_ANIM_DICT_LOADED_CHECK(sAnimDictMachine)
IF NOT IS_ENTITY_PLAYING_ANIM(objMincer, sAnimDictMachine, "beefsplitter_loop")
IF DOES_ENTITY_HAVE_DRAWABLE(objMincer)
PLAY_ENTITY_ANIM(objMincer, "beefsplitter_loop", sAnimDictMachine, INSTANT_BLEND_IN, TRUE, FALSE)
SET_CAN_CLIMB_ON_ENTITY(objMincer, FALSE)
ENDIF
ENDIF
ENDIF
ENDIF
iDoesObjectOfTypeExistAtCoords++
IF iDoesObjectOfTypeExistAtCoords > 2
iDoesObjectOfTypeExistAtCoords = 0
ENDIF
ELSE
IF DOES_ENTITY_EXIST(objGrinder)
SET_OBJECT_AS_NO_LONGER_NEEDED(objGrinder)
bGrabGrinder = FALSE
ENDIF
IF DOES_ENTITY_EXIST(objCutter)
SET_OBJECT_AS_NO_LONGER_NEEDED(objCutter)
bGrabCutter = FALSE
ENDIF
IF DOES_ENTITY_EXIST(objMincer)
SET_OBJECT_AS_NO_LONGER_NEEDED(objMincer)
bGrabMincer = FALSE
ENDIF
IF NOT IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<962.529602, -2105.850342, 30.0>>, <<50.0, 40.0, 30.0>>)
UNLOAD_ANIM_DICT(sAnimDictMachine)
ENDIF
ENDIF
//Blips
UPDATE_BLIP_FLASH_TIMERS()
//Switch
SWITCH_CONTROL()
//Rail
IF eMissionObjective > initMission
AND eMissionObjective <= stageMichaelEscape
AND NOT IS_CUTSCENE_PLAYING()
IF HAS_ANIM_DICT_LOADED_CHECK(sAnimDictMic2Hook)
UPDATE_RAIL_MOVE()
IF bOkToMoveRail
IF iTimerNode <> iCurrentNode
fDistFromFinalNode = 0
FOR i = iCurrentNode + 1 TO iRailNodeToStopAt
fDistFromFinalNode += GET_DISTANCE_BETWEEN_COORDS(sRailNodes[CLAMP_INT(i, 0, COUNT_OF(sRailNodes) - 1)].vPos, sRailNodes[CLAMP_INT(i + 1, 0, COUNT_OF(sRailNodes) - 1)].vPos)
ENDFOR
iTimerNode = iCurrentNode
ENDIF
fDistFromCurrentNode = GET_DISTANCE_BETWEEN_COORDS(vRailCurrent, sRailNodes[CLAMP_INT(iCurrentNode + 1, 0, COUNT_OF(sRailNodes) - 1)].vPos)
IF IS_SELECTOR_ONSCREEN(TRUE)
SET_SWITCH_WHEEL_AND_STATS_UNDER_HUD_THIS_FRAME()
ELIF IS_SELECTOR_ONSCREEN(FALSE)
SET_SWITCH_WHEEL_UNDER_HUD_THIS_FRAME()
ELIF (IS_PHONE_ONSCREEN(TRUE)
OR IS_CELLPHONE_TRACKIFY_IN_USE())
AND NOT (IS_PLAYER_IN_FIRST_PERSON_CAMERA())
SET_PHONE_UNDER_HUD_THIS_FRAME()
ENDIF
IF NOT IS_PLAYER_SWITCH_IN_PROGRESS()
AND eSwitchCamState = SWITCH_CAM_IDLE
IF GET_IS_HIDEF()
OR NOT IS_PHONE_ONSCREEN(TRUE)
IF NOT g_bCurrentlyUsingTelescope
DRAW_GENERIC_METER(ROUND(fDistFromFinalNode + fDistFromCurrentNode), ROUND(fDistTotalFirstFinalNode), "MCH2_TIMER", HUD_COLOUR_WHITE, -1, HUDORDER_TOP)
ENDIF
ENDIF
ENDIF
ENDIF
//PRINTLN("iTotalRailNodes - iCurrentNode / iTotalRailNodes = ", iTotalRailNodes - iCurrentNode, ", ", iTotalRailNodes)
ENDIF
ENDIF
IF bBlood = FALSE
OR pedBlood != GET_CURRENT_PLAYER_PED_ENUM()
IF DOES_ENTITY_EXIST(PLAYER_PED(CHAR_MICHAEL))
AND NOT IS_PED_INJURED(PLAYER_PED(CHAR_MICHAEL))
IF DOES_ENTITY_HAVE_DRAWABLE(PLAYER_PED(CHAR_MICHAEL))
AND DOES_ENTITY_HAVE_PHYSICS(PLAYER_PED(CHAR_MICHAEL))
IF IS_ENTITY_ON_SCREEN(PLAYER_PED(CHAR_MICHAEL))
AND NOT IS_SCREEN_FADED_OUT()
APPLY_PED_DAMAGE_PACK(PLAYER_PED(CHAR_MICHAEL), "SCR_Torture", 0.0, 1.0)
pedBlood = GET_CURRENT_PLAYER_PED_ENUM()
bBlood = TRUE #IF IS_DEBUG_BUILD PRINTLN("APPLY_PED_BLOOD_DAMAGE_BY_ZONE - bBlood = TRUE") #ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
//Combat
REPEAT COUNT_OF(sEnemyShootout) i
ADVANCE_COMBAT_UPDATE(sEnemyShootout[i])
ENDREPEAT
REPEAT COUNT_OF(sEnemyEscape) i
ADVANCE_COMBAT_UPDATE(sEnemyEscape[i])
ENDREPEAT
REPEAT COUNT_OF(sEnemyBackup) i
ADVANCE_COMBAT_UPDATE(sEnemyBackup[i])
ENDREPEAT
//Debug Routine
#IF IS_DEBUG_BUILD
debugRoutine()
#ENDIF
//Hide HUD/Radar
IF bRadar = FALSE
DISPLAY_RADAR(FALSE)
DISPLAY_HUD(FALSE)
ELSE
DISPLAY_RADAR(TRUE)
DISPLAY_HUD(TRUE)
ENDIF
//Phone
// IF NOT IS_GAMEPLAY_CAM_RENDERING()
// #IF IS_DEBUG_BUILD AND NOT IS_CAM_RENDERING(GET_DEBUG_CAM()) #ENDIF
// AND NOT IS_PED_GETTING_INTO_A_VEHICLE(PLAYER_PED_ID()) //Work around for bug 946097
// AND NOT GET_IS_TASK_ACTIVE(PLAYER_PED_ID(), CODE_TASK_EXIT_VEHICLE)
// AND IS_PLAYER_SWITCH_IN_PROGRESS()
// HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_WEAPON_ICON)
// HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_CASH)
// HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_CASH_CHANGE)
// HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_AREA_NAME)
// HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_DISTRICT_NAME)
// HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_STREET_NAME)
// HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_VEHICLE_NAME)
//
// IF NOT IS_CELLPHONE_DISABLED()
// DISABLE_CELLPHONE(TRUE) PRINTLN("DISABLE_CELLPHONE(TRUE) 1")
// ENDIF
// ENDIF
//Audio Scene
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
AND eMissionObjective < stageMichaelEscape
IF NOT IS_AUDIO_SCENE_ACTIVE("MI_2_MICHAEL_ON_MEATHOOK")
START_AUDIO_SCENE("MI_2_MICHAEL_ON_MEATHOOK")
ENDIF
ELSE
IF IS_AUDIO_SCENE_ACTIVE("MI_2_MICHAEL_ON_MEATHOOK")
STOP_AUDIO_SCENE("MI_2_MICHAEL_ON_MEATHOOK")
ENDIF
ENDIF
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN
AND eMissionObjective = stageFindMichael
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF IS_AUDIO_SCENE_ACTIVE("MI_2_DRIVE_TO_SLAUGHTERHOUSE")
STOP_AUDIO_SCENE("MI_2_DRIVE_TO_SLAUGHTERHOUSE")
ENDIF
ELSE
IF NOT IS_AUDIO_SCENE_ACTIVE("MI_2_DRIVE_TO_SLAUGHTERHOUSE")
START_AUDIO_SCENE("MI_2_DRIVE_TO_SLAUGHTERHOUSE")
ENDIF
ENDIF
ELSE
IF IS_AUDIO_SCENE_ACTIVE("MI_2_DRIVE_TO_SLAUGHTERHOUSE")
STOP_AUDIO_SCENE("MI_2_DRIVE_TO_SLAUGHTERHOUSE")
ENDIF
ENDIF
//Temporary Radar
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
AND eMissionObjective < stageMichaelEscape
AND NOT IS_PLAYER_SWITCH_IN_PROGRESS()
// IF NOT IS_CELLPHONE_DISABLED()
// DISABLE_CELLPHONE(TRUE) PRINTLN("DISABLE_CELLPHONE(TRUE) 2")
// ENDIF
DISPLAY_RADAR(FALSE)
ELSE
IF eMissionObjective <> stageCutIntro
AND NOT (eMissionObjective = stageFindMichael AND iCutsceneStage = 0)
IF IS_GAMEPLAY_CAM_RENDERING()
IF IS_CELLPHONE_DISABLED()
IF NOT IS_PLAYER_SWITCH_IN_PROGRESS()
DISABLE_CELLPHONE(FALSE) PRINTLN("DISABLE_CELLPHONE(FALSE) 1")
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
//Rolling Start
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
OR DOES_CAM_EXIST(scsSwitchCam_MichaelToFranklin.ciSpline)
IF DOES_ENTITY_EXIST(vehFranklin)
AND NOT IS_ENTITY_DEAD(vehFranklin)
AND IS_PED_IN_VEHICLE(PLAYER_PED(CHAR_FRANKLIN), vehFranklin)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehFranklin)
IF NOT HAS_LABEL_BEEN_TRIGGERED("RollingStartSkip")
SWITCH_STATE switchState
INT switchIndex
//[MF] Make sure we're not in a custom switch cam.
IF eSwitchCamState = SWITCH_CAM_IDLE
switchState = GET_PLAYER_SWITCH_STATE()
switchIndex = GET_PLAYER_SWITCH_JUMP_CUT_INDEX()
ENDIF
IF (switchState = SWITCH_STATE_JUMPCUT_DESCENT AND switchIndex = 0)
OR (DOES_CAM_EXIST(scsSwitchCam_MichaelToFranklin.ciSpline) AND GET_CAM_SPLINE_NODE_INDEX(scsSwitchCam_MichaelToFranklin.ciSpline) >= scsSwitchCam_MichaelToFranklin.iCamSwitchFocusNode)
PRINTLN("STARTING FRANKLIN'S CAR MOVING...")
SET_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehFranklin, GET_TOTAL_DURATION_OF_VEHICLE_RECORDING(001, "ALrollingstart") - 4000.0)
SET_PLAYBACK_SPEED(vehFranklin, 1.0)
FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(vehFranklin)
SET_PLAYBACK_TO_USE_AI(vehFranklin) //START_PLAYBACK_RECORDED_VEHICLE_USING_AI(vehFranklin, 001, "ALrollingstart", GET_VEHICLE_ESTIMATED_MAX_SPEED(vehFranklin) / 2.0)
SET_VEHICLE_FORWARD_SPEED(vehFranklin, GET_VEHICLE_ESTIMATED_MAX_SPEED(vehFranklin) / 2.0)
SET_VEHICLE_ENGINE_ON(vehFranklin, TRUE, TRUE)
CLEAR_AREA(GET_ENTITY_COORDS(vehFranklin, FALSE), 100.0, TRUE)
SET_LABEL_AS_TRIGGERED("RollingStartSkip", TRUE)
ENDIF
ELSE
IF NOT IS_PLAYER_SWITCH_IN_PROGRESS()
AND NOT IS_PLAYER_PED_SWITCH_IN_PROGRESS()
AND eSwitchCamState = SWITCH_CAM_IDLE
IF HAS_LABEL_BEEN_TRIGGERED("RollingStartSkip")
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)
//FLOAT fSpeed = GET_ENTITY_SPEED(vehFranklin)
STOP_PLAYBACK_RECORDED_VEHICLE(vehFranklin)
//SET_VEHICLE_FORWARD_SPEED(vehFranklin, fSpeed)
SET_LABEL_AS_TRIGGERED("RollingStartStop", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
//Bin Bag Items
// IF eMissionObjective >= stageAbattoirShootout AND eMissionObjective <= stageBackToMichaels
// IF NOT DOES_ENTITY_EXIST(objBinBag)
// IF NOT HAS_LABEL_BEEN_TRIGGERED("ReclaimedGuns")
// IF NOT HAS_LABEL_BEEN_TRIGGERED("MCH2_WEAPON_1")
// AND NOT HAS_LABEL_BEEN_TRIGGERED("MCH2_WEAPON_2")
// IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<968.464600, -2122.092773, 32.316872>>, <<21.0, 10.0, 3.0>>)
// IF HAS_MODEL_LOADED_CHECK(PROP_RUB_BINBAG_SD_02)
// objBinBag = CREATE_OBJECT(PROP_RUB_BINBAG_SD_02, <<948.190002, -2124.189941, 31.780001>>)
//
// SET_ENTITY_COORDS(objBinBag, <<948.190002, -2124.189941, 31.780001>>)
// SET_ENTITY_ROTATION(objBinBag, <<0.0, 0.0, 9.167327>>)
//
// FREEZE_ENTITY_POSITION(objBinBag, TRUE)
//
// SET_MODEL_AS_NO_LONGER_NEEDED(PROP_RUB_BINBAG_SD_02)
// ENDIF
// ENDIF
// ENDIF
// ENDIF
// ELSE
// IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<963.873108, -2124.677002, 33.467842>>, <<4.0, 4.0, 3.0>>)
// IF NOT HAS_LABEL_BEEN_TRIGGERED("ReclaimedGuns")
// IF NOT DOES_BLIP_EXIST(blipGuns)
// blipGuns = CREATE_BLIP_FOR_OBJECT(objBinBag)
//
// PRINT_HELP_ADV("MCH2_STASHHLP")
// ENDIF
// ENDIF
//
// IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
// AND (NOT IS_MESSAGE_BEING_DISPLAYED() OR GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) = 0)
// IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
// PLAY_SINGLE_LINE_FROM_CONVERSATION_ADV("MCH2_WEAPON", "MCH2_WEAPON_1")
// ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN
// PLAY_SINGLE_LINE_FROM_CONVERSATION_ADV("MCH2_WEAPON", "MCH2_WEAPON_2")
// ENDIF
// ENDIF
// ENDIF
//
// IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<948.621826, -2124.189697, 33.438431>>, <<1.75, 1.75, 3.0>>)
// OR NOT IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<948.621826, -2124.189697, 25.438431>>, <<50.0, 50.0, 50.0>>)
// IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<948.621826, -2124.189697, 33.438431>>, <<1.75, 1.75, 3.0>>)
// PLAY_SOUND_FROM_COORD(-1, "PICKUP_WEAPON_DEFAULT", GET_ENTITY_COORDS(objBinBag), "HUD_FRONTEND_WEAPONS_PICKUPS_SOUNDSET")
//
// IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
// RESTORE_PLAYER_PED_WEAPONS_IN_SNAPSHOT(PLAYER_PED(CHAR_MICHAEL), FALSE)
// ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN
// SET_LABEL_AS_TRIGGERED("RESTORE_PLAYER_PED_WEAPONS_IN_SNAPSHOT", TRUE)
// ENDIF
// ENDIF
//
// SAFE_DELETE_OBJECT(objBinBag)
// SAFE_REMOVE_BLIP(blipGuns)
//
// SET_LABEL_AS_TRIGGERED("ReclaimedGuns", TRUE)
// ENDIF
// ENDIF
//
// IF HAS_LABEL_BEEN_TRIGGERED("RESTORE_PLAYER_PED_WEAPONS_IN_SNAPSHOT")
// IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
// AND IS_PED_IN_VEHICLE(NOT_PLAYER_PED_ID(), GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()))
// IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
// AND (NOT IS_MESSAGE_BEING_DISPLAYED() OR GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) = 0)
// CREATE_CONVERSATION_ADV("MCH2_WEAPON2")
//
// RESTORE_PLAYER_PED_WEAPONS_IN_SNAPSHOT(PLAYER_PED(CHAR_MICHAEL), FALSE)
//
// SET_LABEL_AS_TRIGGERED("RESTORE_PLAYER_PED_WEAPONS_IN_SNAPSHOT", FALSE)
// ENDIF
// ENDIF
// ENDIF
// ENDIF
IF bPhoneSwitch
IF IS_PLAYER_SWITCH_IN_PROGRESS()
AND bFranklinToMichael = FALSE
AND GET_PLAYER_SWITCH_TYPE() != SWITCH_TYPE_SHORT
SWITCH_STATE switchState
IF IS_PLAYER_SWITCH_IN_PROGRESS()
switchState = GET_PLAYER_SWITCH_STATE()
ENDIF
PRINTLN("switchState = ", switchState)
IF (NOT IS_PLAYER_SWITCH_IN_PROGRESS()
AND IS_GAMEPLAY_CAM_RENDERING())
OR (IS_PLAYER_SWITCH_IN_PROGRESS()
AND switchState >= SWITCH_STATE_OUTRO_HOLD)
DISABLE_CELLPHONE(FALSE) PRINTLN("DISABLE_CELLPHONE(FALSE) 2")
LAUNCH_TRACKIFY_IMMEDIATELY(TRUE)
bPhoneSwitch = FALSE PRINTLN("bPhoneSwitch = FALSE LAUNCH_TRACKIFY_IMMEDIATELY()")
ENDIF
ENDIF
ENDIF
IF bHaltVehicle
VEHICLE_INDEX vehBringToHalt
vehBringToHalt = GET_VEHICLE_PED_IS_IN(PLAYER_PED(CHAR_FRANKLIN))
IF DOES_ENTITY_EXIST(vehBringToHalt)
AND NOT IS_ENTITY_DEAD(vehBringToHalt)
IF BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(vehBringToHalt, DEFAULT_VEH_STOPPING_DISTANCE * 2, 1, 0.5, TRUE)
SAFE_SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
bHaltVehicle = FALSE
ENDIF
ELSE
SAFE_SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
bHaltVehicle = FALSE
ENDIF
ENDIF
//Stats
INFORM_MISSION_STATS_OF_DAMAGE_WATCH_ENTITY(PLAYER_PED_ID(), MIC2_DAMAGE)
IF GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID()) != NULL
INFORM_MISSION_STATS_OF_SPEED_WATCH_ENTITY(GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID()), MIC2_MAX_SPEED)
INFORM_MISSION_STATS_OF_DAMAGE_WATCH_ENTITY(GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID()), MIC2_CAR_DAMAGE)
ELSE
INFORM_MISSION_STATS_OF_SPEED_WATCH_ENTITY(NULL, MIC2_MAX_SPEED)
INFORM_MISSION_STATS_OF_DAMAGE_WATCH_ENTITY(NULL, MIC2_CAR_DAMAGE)
ENDIF
//Kills a Ped
INT iEventCount = 0
STRUCT_ENTITY_ID sei = CONSTRUCT_ENTITY_ID()
EVENT_NAMES eventType
REPEAT GET_NUMBER_OF_EVENTS(SCRIPT_EVENT_QUEUE_AI) iEventCount
eventType = GET_EVENT_AT_INDEX(SCRIPT_EVENT_QUEUE_AI, iEventCount)
SWITCH (eventType)
CASE EVENT_ENTITY_DESTROYED
//Figure out what type of entity it is
GET_EVENT_DATA(SCRIPT_EVENT_QUEUE_AI, iEventCount, sei, SIZE_OF(STRUCT_ENTITY_ID))
IF DOES_ENTITY_EXIST(sei.EntityId)//sei.EntityId
IF IS_ENTITY_A_PED(sei.EntityId)
IF IS_ENTITY_A_MISSION_ENTITY(sei.EntityId)
INFORM_MISSION_STATS_OF_INCREMENT(MIC2_KILLS)
// ELSE
// INFORM_MISSION_STATS_OF_INCREMENT(MIC2_INNOCENTS_KILLED)
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDREPEAT
// WEAPON_TYPE wtCurrentUpdate = WEAPONTYPE_UNARMED
// GET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), wtCurrentUpdate)
//
// IF wtCurrent != wtCurrentUpdate
// OR iAmmo = -1
// wtCurrent = wtCurrentUpdate
// iAmmo = GET_AMMO_IN_PED_WEAPON(PLAYER_PED_ID(), wtCurrent)
// ENDIF
//
// IF GET_AMMO_IN_PED_WEAPON(PLAYER_PED_ID(), wtCurrent) < iAmmo
// INT iDifference = iAmmo - GET_AMMO_IN_PED_WEAPON(PLAYER_PED_ID(), wtCurrent)
//
// REPEAT iDifference i
// INFORM_MISSION_STATS_OF_INCREMENT(MIC2_BULLETS_FIRED)
// ENDREPEAT
//
// iAmmo = GET_AMMO_IN_PED_WEAPON(PLAYER_PED_ID(), wtCurrent)
// ENDIF
// IF IS_CELLPHONE_TRACKIFY_IN_USE()
// INFORM_MISSION_STATS_SYSTEM_OF_TIME_WINDOW_OPEN(MIC2_TRACKIFY_APP_USE)
// ELSE
// INFORM_MISSION_STATS_SYSTEM_OF_TIME_WINDOW_CLOSED(FALSE, MIC2_TRACKIFY_APP_USE)
// ENDIF
IF IS_WAYPOINT_ACTIVE()
INFORM_STAT_SYSTEM_OF_BOOL_STAT_HAPPENED(MIC2_WAYPOINT_USED)
ENDIF
// IF IS_SPECIAL_ABILITY_ACTIVE(PLAYER_ID())
// INFORM_MISSION_STATS_SYSTEM_OF_TIME_WINDOW_OPEN(MIC2_SPECIAL_ABILITY_TIME)
// ELSE
// INFORM_MISSION_STATS_SYSTEM_OF_TIME_WINDOW_CLOSED()
// ENDIF
//INFORM_MISSION_STATS_OF_INCREMENT(MIC2_)
//Stop peds attacking player
SET_ALL_RANDOM_PEDS_FLEE_THIS_FRAME(PLAYER_ID())
LOAD_UNLOAD_ASSETS()
AUDIO_CONTROLLER()
//Instance Priority
IF eMissionObjective >= stageAbattoirShootout AND eMissionObjective <= stageMichaelEscape
SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_SHOOTING)
ELIF eMissionObjective = stageTriadsChase
SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_DRIVING)
ELSE
SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_NONE)
ENDIF
//Replay Camera
SWITCH eMissionObjective
CASE stageAbattoirShootout
CASE stageSwitchToMichael
CASE stageMichaelEscape
CASE stageMichaelFree
REPLAY_DISABLE_CAMERA_MOVEMENT_THIS_FRAME() //Fix for bug 2220869
BREAK
ENDSWITCH
//Objective switch
SWITCH eMissionObjective
CASE initMission
initialiseMission()
BREAK
CASE stageCutIntro
IF HAS_MODEL_LOADED_CHECK(GET_PLAYER_PED_MODEL(CHAR_FRANKLIN))
AND HAS_ANIM_DICT_LOADED_CHECK(sAnimDictMic2LeadOut)
AND HAS_ANIM_DICT_LOADED_CHECK("cellphone@")
AND HAS_MODEL_LOADED_CHECK(Prop_phone_ING_03)
AND HAS_MODEL_LOADED_CHECK(mn_FrankPhoneDisplay)
cutIntro()
ENDIF
BREAK
CASE stageFindMichael
IF HAS_MODEL_LOADED_CHECK(GET_PLAYER_PED_MODEL(CHAR_MICHAEL))
AND HAS_MODEL_LOADED_CHECK(G_M_M_CHIGOON_01)
AND HAS_MODEL_LOADED_CHECK(G_M_M_CHIGOON_02)
AND HAS_MODEL_LOADED_CHECK(CSB_CHIN_GOON)
AND HAS_MODEL_LOADED_CHECK(PROP_LD_HOOK)
AND HAS_MODEL_LOADED_CHECK(PROP_CS_PADLOCK)
AND HAS_MODEL_LOADED_CHECK(PROP_CS_LEG_CHAIN_01)
AND HAS_MODEL_LOADED_CHECK(BISON)
AND HAS_MODEL_LOADED_CHECK(Prop_phone_ING_03)
AND HAS_MODEL_LOADED_CHECK(mn_FrankPhoneDisplay)
AND HAS_ANIM_DICT_LOADED_CHECK(sAnimDictMic2Hook)
AND HAS_ANIM_DICT_LOADED_CHECK(sAnimDictMic2Smoking)
AND HAS_ANIM_DICT_LOADED_CHECK(sAnimDictIdle1)
AND HAS_ANIM_DICT_LOADED_CHECK(sAnimDictIdle2)
AND HAS_ANIM_DICT_LOADED_CHECK(sAnimDictIdle3)
AND HAS_ANIM_DICT_LOADED_CHECK(sAnimDictIdle4)
AND HAS_ANIM_DICT_LOADED_CHECK("shake_cam_all@")
AND HAS_ANIM_DICT_LOADED_CHECK("cellphone@")
AND HAS_CLIP_SET_LOADED("MOVE_STRAFE@COP")
AND HAS_RECORDING_LOADED_CHECK(001, "ALrollingstart")
findMichael()
ENDIF
BREAK
CASE stageAbattoirShootout
IF HAS_MODEL_LOADED_CHECK(G_M_M_CHIGOON_01)
AND HAS_MODEL_LOADED_CHECK(G_M_M_CHIGOON_02)
AND HAS_MODEL_LOADED_CHECK(BISON)
AND HAS_ANIM_DICT_LOADED_CHECK(sAnimDictMic2Hook)
AND HAS_ANIM_DICT_LOADED_CHECK(sAnimDictMic2SetPiece1)
AND HAS_ANIM_DICT_LOADED_CHECK(sAnimDictMic2Smoking)
AND HAS_CLIP_SET_LOADED("move_ped_strafing")
AND HAS_CLIP_SET_LOADED("MOVE_STRAFE@COP")
abattoirShootout()
ENDIF
BREAK
CASE stageSwitchToMichael
IF HAS_MODEL_LOADED_CHECK(GET_WEAPONTYPE_MODEL(WEAPONTYPE_COMBATPISTOL))
AND HAS_ANIM_DICT_LOADED_CHECK(sAnimDictMic2Hook)
AND HAS_ANIM_DICT_LOADED_CHECK(sAnimDictMic2Switch)
AND HAS_CLIP_SET_LOADED(GET_CLIP_SET_FOR_SCRIPTED_GUN_TASK(SCRIPTED_GUN_TASK_HANGING_UPSIDE_DOWN))
AND HAS_CLIP_SET_LOADED("MOVE_STRAFE@COP")
switchToMichael()
ENDIF
BREAK
CASE stageMichaelEscape
IF HAS_MODEL_LOADED_CHECK(GET_WEAPONTYPE_MODEL(WEAPONTYPE_COMBATPISTOL))
AND HAS_MODEL_LOADED_CHECK(G_M_M_CHIGOON_01)
AND HAS_MODEL_LOADED_CHECK(G_M_M_CHIGOON_02)
AND HAS_MODEL_LOADED_CHECK(FELTZER2)
AND HAS_MODEL_LOADED_CHECK(COQUETTE)
AND HAS_MODEL_LOADED_CHECK(BISON)
AND HAS_MODEL_LOADED_CHECK(PROP_WATERCRATE_01)
AND HAS_MODEL_LOADED_CHECK(V_IND_COO_HALF)
AND HAS_ANIM_DICT_LOADED_CHECK(sAnimDictMic2Hook)
AND HAS_CLIP_SET_LOADED(GET_CLIP_SET_FOR_SCRIPTED_GUN_TASK(SCRIPTED_GUN_TASK_HANGING_UPSIDE_DOWN))
AND HAS_CLIP_SET_LOADED("MOVE_STRAFE@COP")
michaelEscape()
ENDIF
BREAK
CASE stageMichaelFree
IF HAS_MODEL_LOADED_CHECK(GET_WEAPONTYPE_MODEL(WEAPONTYPE_COMBATPISTOL))
AND HAS_MODEL_LOADED_CHECK(G_M_M_CHIGOON_01)
AND HAS_MODEL_LOADED_CHECK(G_M_M_CHIGOON_02)
AND HAS_MODEL_LOADED_CHECK(FELTZER2)
AND HAS_MODEL_LOADED_CHECK(COQUETTE)
AND HAS_MODEL_LOADED_CHECK(BISON)
AND HAS_MODEL_LOADED_CHECK(PROP_WATERCRATE_01)
AND HAS_MODEL_LOADED_CHECK(V_IND_COO_HALF)
AND HAS_ANIM_DICT_LOADED_CHECK(sAnimDictMic2Hook)
AND HAS_ANIM_DICT_LOADED_CHECK(sAnimDictMic2SetPiece2)
AND HAS_ANIM_DICT_LOADED_CHECK(sAnimDictMic2FranklinBeckon)
AND HAS_CLIP_SET_LOADED(GET_CLIP_SET_FOR_SCRIPTED_GUN_TASK(SCRIPTED_GUN_TASK_HANGING_UPSIDE_DOWN))
AND HAS_CLIP_SET_LOADED("MOVE_STRAFE@COP")
michaelFree()
ENDIF
BREAK
CASE stageTriadsChase
IF HAS_MODEL_LOADED_CHECK(BISON)
AND HAS_MODEL_LOADED_CHECK(FELTZER2)
AND HAS_MODEL_LOADED_CHECK(COQUETTE)
AND HAS_CLIP_SET_LOADED("MOVE_STRAFE@COP")
triadsChase()
ENDIF
BREAK
CASE stageBackToMichaels
backToMichaels()
BREAK
CASE stageCutEnd
IF HAS_ANIM_DICT_LOADED_CHECK(sAnimDictMic2WashFace)
cutEnd()
ENDIF
BREAK
CASE passMission
missionPassed()
BREAK
CASE failMission
missionFailed()
BREAK
ENDSWITCH
IF eMissionObjective >= stageSwitchToMichael AND eMissionObjective <= stageMichaelEscape
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
IF GET_FOLLOW_PED_CAM_VIEW_MODE() = CAM_VIEW_MODE_FIRST_PERSON
IF NOT IS_PLAYER_SWITCH_IN_PROGRESS()
AND NOT HAS_LABEL_BEEN_TRIGGERED("MichaelFallPushIn")
DISABLE_ON_FOOT_FIRST_PERSON_VIEW_THIS_UPDATE() PRINTLN("DISABLE_ON_FOOT_FIRST_PERSON_VIEW_THIS_UPDATE()")
ENDIF
ENDIF
ENDIF
ENDIF
#IF IS_DEBUG_BUILD
UPDATE_SPLINE_CAM_WIDGETS(scsSwitchCam_FranklinToMichael)
UPDATE_SPLINE_CAM_WIDGETS(scsSwitchCam_FranklinInCarToMichael)
UPDATE_SPLINE_CAM_WIDGETS(scsSwitchCam_MichaelToFranklin)
UPDATE_SPLINE_CAM_WIDGETS(scsSwitchCam_FranklinGrappleToMichael)
HANDLE_SWITCH_CAM_SCRIPT_SPECIFIC_WIDGETS()
#ENDIF
WAIT(0)
ENDWHILE
//Script should never reach here. Always terminate with cleanup function.
ENDSCRIPT