Files
gtav-src/script/dev_ng/singleplayer/scripts/missions/Family/Family6.sc
T
2025-09-29 00:52:08 +02:00

12116 lines
418 KiB
Python
Executable File

//|=======================================================================================|
//| Author: Craig Vincent / Lukasz Bogaj Date: 08/06/2013 |
//|=======================================================================================|
//| FAMILY6.sc |
//| REUNITE FAMILY |
//| |
//|=======================================================================================|
//Compile out Title Update changes to header functions.
//Must be before includes.
//CONST_INT USE_TU_CHANGES 0 // Removed by Kenneth R.
//===================================== INCLUDE FILES ====================================|
USING "rage_builtins.sch"
USING "globals.sch"
//Commands headers
USING "commands_streaming.sch"
USING "commands_interiors.sch"
USING "commands_graphics.sch"
USING "commands_itemsets.sch"
USING "commands_vehicle.sch"
USING "commands_player.sch"
USING "commands_script.sch"
USING "commands_object.sch"
USING "commands_camera.sch"
USING "commands_audio.sch"
USING "commands_clock.sch"
USING "commands_debug.sch"
USING "commands_task.sch"
USING "commands_fire.sch"
USING "commands_hud.sch"
USING "commands_pad.sch"
USING "commands_ped.sch"
USING "commands_recording.sch"
//Script headers
USING "script_blips.sch"
USING "select_mission_stage.sch"
USING "model_enums.sch"
USING "script_player.sch"
USING "script_misc.sch"
USING "taxi_functions.sch"
USING "taxi_functions.sch"
USING "timeLapse.sch"
USING "RC_helper_functions.sch"
//Public headers
USING "CompletionPercentage_public.sch"
USING "mission_stat_public.sch"
USING "player_ped_scenes.sch"
USING "cutscene_public.sch"
USING "carsteal_public.sch"
USING "locates_public.sch"
USING "replay_public.sch"
USING "family_public.sch"
USING "shop_public.sch"
USING "yoga.sch"
//Debug headers
#IF IS_DEBUG_BUILD
USING "shared_debug.sch"
USING "script_debug.sch"
#ENDIF
//===================================== ENUMS & STRUCTS ==================================|
/// PURPOSE: Specifies stages of the mission.
ENUM MISSION_STAGES
MISSION_STAGE_PRE_INTRO = 0, //Pre into scripted cutscene showing player enter the house
MISSION_STAGE_CUTSCENE_INTRO_P1 = 1, //Intro cutscene part 1 - fam_6_int
MISSION_STAGE_TIMELAPSE = 2, //Timelapse
MISSION_STAGE_CUTSCENE_INTRO_P2 = 3, //Intro cutscene part 2 - fam_6_int_p3_t7
MISSION_STAGE_DRIVE_TO_BEAN_MACHINE = 4, //Go to Bean Machine with Jimmy
MISSION_STAGE_CUTSCENE_BEAN_MACHINE = 5, //Bean Machine cutscene -
MISSION_STAGE_DRIVE_TO_TRACEY = 6, //Go to tatto parlor with Jimmy
MISSION_STAGE_CUTSCENE_SHOP_1 = 7, //
MISSION_STAGE_PIERCE_LAZLOW = 8,
MISSION_STAGE_CUTSCENE_SHOP_2 = 9,
MISSION_STAGE_TATTOO_LAZLOW = 10,
MISSION_STAGE_CUTSCENE_SHOP_3 = 11,
MISSION_STAGE_CUT_LAZLOW_HAIR = 12,
MISSION_STAGE_CUTSCENE_SHOP_4 = 13,
MISSION_STAGE_DRIVE_TO_SHRINK = 14,
MISSION_STAGE_CUTSCENE_SHRINK = 15,
MISSION_STAGE_DRIVE_HOME = 16,
MISSION_STAGE_CUTSCENE_END = 17,
MISSION_STAGE_PASSED, //Mission passed
MISSION_STAGE_FAILED //Mission failed
ENDENUM
/// PURPOSE: Specifies mission fail reasons.
ENUM MISSION_FAILS
MISSION_FAIL_EMPTY = 0, //Generic fail
MISSION_FAIL_AMANDA_DEAD, //Amanda dead
MISSION_FAIL_FABIEN_DEAD, //Fabien dead
MISSION_FAIL_JIMMY_DEAD, //Jimmy dead
MISSION_FAIL_TRACEY_DEAD, //Tracey dead
MISSION_FAIL_LAZLOW_DEAD, //Lazlow dead
MISSION_FAIL_AMANDAS_CAR_DEAD, //Amanda's car destroyed
MISSION_FAIL_AMANDA_SCARED_OFF, //Amanda scared off by player behaviour
MISSION_FAIL_AMANDA_LEFT_BEHIND, //Amanda left behind
MISSION_FAIL_JIMMY_LEFT_BEHIND, //Jimmy left behind
MISSION_FAIL_TRACEY_LEFT_BEHIND, //Tracey left behind
MISSION_FAIL_FAMILY_LEFT_BEHIND, //Family left behind
MISSION_FAIL_BEAN_MACHINE_SMASHED, //Bean machine smashed by player vehicle
MISSION_FAIL_FORCE_FAIL, //Debug forced fail
MAX_MISSION_FAILS
ENDENUM
/// PURPOSE: Specifies mid-mission checkpoints for mission retry.
ENUM MID_MISSION_STAGES
MID_MISSION_STAGE_DRIVE_TO_BEAN_MACHINE = 0, //Checkpoint at MISSION_STAGE_DRIVE_TO_BEAN_MACHINE
MID_MISSION_STAGE_CUTSCENE_BEAN_MACHINE = 1, //Checkpoint at MISSION_STAGE_CUTSCENE_BEAN_MACHINE
MID_MISSION_STAGE_DRIVE_TO_TRACEY = 2, //Checkpoint at MISSION_STAGE_DRIVE_TO_TRACEY
MID_MISSION_STAGE_PIERCE_LAZLOW = 3, //Checkpoint at MISSION_STAGE_PIERCE_LAZLOW
MID_MISSION_STAGE_DRIVE_TO_SHRINK = 4, //Checkpoint at MISSION_STAGE_DRIVE_TO_SHRINK
MID_MISSION_STAGE_DRIVE_HOME = 5 //Checkpoint at MISSION_STAGE_DRIVE_HOME
ENDENUM
ENUM PIERCING_STAGES
PIERCING_IDLE = 0,
PIERCING_BROW = 1,
PIERCING_EAR = 2,
PIERCING_NOSE = 3
ENDENUM
ENUM TATTOOING_STAGES
TATTOOING_IDLE = 0,
TATTOOING_CHEST = 1,
TATTOOING_BACK = 2
ENDENUM
ENUM TATTOO_BUTTONS
STYLE_ONE_UP = 0,
STYLE_ONE_DIAGONAL_UP_RIGHT,
STYLE_ONE_RIGHT,
STYLE_ONE_DIAGONAL_DOWN_RIGHT,
STYLE_ONE_DOWN,
STYLE_ONE_DIAGONAL_DOWN_LEFT,
STYLE_ONE_LEFT,
STYLE_ONE_DIAGONAL_UP_LEFT,
RIGHT_STICK_UP,
RIGHT_STICK_DIAGONAL_UP_RIGHT,
RIGHT_STICK_RIGHT,
RIGHT_STICK_DIAGONAL_DOWN_RIGHT,
RIGHT_STICK_DOWN,
RIGHT_STICK_DIAGONAL_DOWN_LEFT,
RIGHT_STICK_LEFT,
RIGHT_STICK_DIAGONAL_UP_LEFT,
SPACER
ENDENUM
/// PURPOSE: Specifies details of mission peds.
STRUCT PED_STRUCT
PED_INDEX PedIndex //Ped Index
BLIP_INDEX BlipIndex //Ped's Blip Index
VECTOR vPosition //Ped's start location
FLOAT fHeading //Ped's start heading
MODEL_NAMES ModelName //Ped's model
INT iProgress //Ped's progress
INT iPedConversationTimer //Ped's conversation timer
INT iTimer //Ped's timer
BOOL bComponentVariationsSet
ENDSTRUCT
/// PURPOSE: Specifies details of mission vehicles.
STRUCT VEH_STRUCT
VEHICLE_INDEX VehicleIndex //Vehicle index
BLIP_INDEX BlipIndex //Vehicle blip
VECTOR vPosition //Vehicle postion
FLOAT fHeading //Vehicle heading
MODEL_NAMES ModelName //Vehicle model
ENDSTRUCT
/// PURPOSE: Specifies details of mission specific objects.
STRUCT OBJECT_STRUCT
OBJECT_INDEX ObjectIndex //Object index
MODEL_NAMES ModelName //Object model
VECTOR vPosition //Object postion
VECTOR vRotation //Object rotation
VECTOR vOffset //Object offset
ENDSTRUCT
/// PURPOSE: Stores player postion and heading.
STRUCT LOCATION_STRUCT
VECTOR vPosition //Player position
FLOAT fHeading //Player heading
ENDSTRUCT
//|======================================= CONSTANTS =====================================|
CONST_INT MAX_MODELS 10
CONST_INT MAX_ANIMATIONS 8
CONST_INT IDEAL_MISSION_START_TIME 7
FLOAT TATTOO_BUTTONS_X = 0.6
FLOAT TATTOO_BUTTONS_Y = 0.795
TWEAK_FLOAT TATTOO_BUTTONS_WIDTH 0.390
TWEAK_FLOAT TATTOO_BUTTONS_HEIGHT 0.10425 //0.139 * 0.75
TWEAK_FLOAT TATTOO_BUTTONS_SCALE 1.2
VECTOR vMichaelsHousePosition = << -824.89, 180.72, 70.57 >>
VECTOR vBeanMachinePosition = << -632.30, 255.25, 80.46 >>
VECTOR vTattooShopPosition = << 299.31, 174.02, 102.98 >>
VECTOR vTattooShopDoorPosition = << 320.84, 177.82, 102.56 >>
VECTOR vShrinkOfficePosition = << -1899.75, -561.64, 10.78 >>
VECTOR vShrinkInteriorPosition = << -1903.60, -573.20, 19.10 >>
VECTOR vBeanMachineScenePosition = << -626.917, 244.277, 80.9 >>
VECTOR vBeanMachineSceneRotation = << 0.0, 0.0, -6.530 >>
VECTOR vTattooShopScenePosition = << 320.57, 181.39, 103.79 >>
VECTOR vTattooShopSceneRotation = << 0.0, 0.0, -111.08>>
VECTOR vScissorsScenePosition = << 322.200, 180.990, 102.600 >>
VECTOR vScissorsSceneRotation = << 0.0, 0.0, 80.0 >>
VECTOR vLazlowLeadoutPosition = << 323.225, 179.725, 103.600 >>
VECTOR vLazlowLeadoutRotation = << 0.000, 0.000, 113.400 >>
VECTOR vTatguyLeadoutPosition = << 321.525, 182.075, 103.570 >>
VECTOR vTatguyLeadoutRotation = << 0.000, 0.000, -162.720 >>
//======================================== VARIABLES =====================================|
MISSION_STAGES eMissionStage = MISSION_STAGE_PRE_INTRO
MISSION_FAILS eMissionFail = MISSION_FAIL_EMPTY
PIERCING_STAGES ePiercingStage = PIERCING_IDLE
TATTOOING_STAGES eTattooingStage = TATTOOING_IDLE
TATTOO_BUTTONS eTattooDirection
//mission peds
PED_STRUCT psJimmy
PED_STRUCT psAmanda
PED_STRUCT psFabien
PED_STRUCT psTracey
PED_STRUCT psLazlow
PED_STRUCT psTatguy
PED_STRUCT psHipster
//mission vehicles
VEH_STRUCT vsAmandasCar
VEH_STRUCT vsMichaelsCar
//mission objects
OBJECT_STRUCT osMug
OBJECT_STRUCT osShirt
OBJECT_STRUCT osLaptop
OBJECT_STRUCT osScissors
OBJECT_STRUCT osPonyTail
OBJECT_STRUCT osPiercingGun
OBJECT_STRUCT osTattooNeedle
OBJECT_STRUCT osLeftDoorDummy
OBJECT_STRUCT osRightDoorDummy
LOCATES_HEADER_DATA sLocatesData
LOCATION_STRUCT MissionPosition
structTimelapse sTimelapse
structPedsForConversation FAM6Conversation
//progress counters
INT iStageSetupProgress
INT iMissionStageProgress
INT iAmandaProgress
INT iLazlowLeadoutProgress
INT iBeanMachineSceneProgress
INT iTattooParlorSceneProgress
BOOL bSkipFlag
BOOL bReplayFlag
BOOL bLoadingFlag
BOOL bStageReplayInProgress
//asset request counters
INT iModelsRequested
INT iAnimationsRequested
BOOL bEar
BOOL bNose
BOOL bBrow
BOOL bChestTattoo
BOOL bCutsceneSkipped
BOOL bTimelapseTriggered
BOOL bTimelapseCutsceneSkipped
BOOL bCutsceneAssetsRequested
BOOL bHouseEntryCutsceneSkipped
BOOL bDestinationReached
BOOL bLeadInTriggered
BOOL bVehicleReversed
BOOL bSetSRLForcePrestream
BOOL bLookAtAmandaActive
BOOL bPCControlsSetup = FALSE
INT iTODAdditionalHours
INT iSpeedZone
INT iHouseEnterSceneID = -1
INT iTattooShopSceneID = -1
INT iPierceSceneID = -1
INT iScissorsSceneID = -1
INT iScaleformProgressPad
INT iScaleformProgressKBM
FLOAT fTattooSpeed
FLOAT fTattooPosition
BOOL bTattooInputReady
BOOL bScaleformDrawing
BOOL bCustomRouteActive
BOOL bStopUsingDefaultRoute
BOOL bPlayerPedScriptTaskInterrupted
INT iTattooSoundID
INT iTattooCameraProgress
INT iIdle1ConversationCounter
INT iIdle2ConversationCounter
INT iIdle3ConversationCounter
INT iIdleConversationcounter
INT iAwayConversationTimer
INT iAwayConversationCounter
INT iStruggleConversationTimer
BOOL bPlayerHitPed
BOOL bPlayerActingBad
BOOL bFamilyArrivedAtHouse
INT iLoseCopsReminderCount
INT iLoseCopsReminderTimer
INT iPlayerOffenceTimer
INT iPlayerOffencesCount
INT iBadConversationCount
INT iHitPedConversationCount
INT iCopsLostConversationCount
BOOL bRunConversationPausingCheck
BOOL bCurrentConversationInterrupted
INT iConversationTimer, iConversationCounter
TEXT_LABEL_23 CurrentConversationRoot, CurrentConversationLabel
PTFX_ID ptfxHair
CAMERA_INDEX ScriptedCamera, AnimatedCamera
SCENARIO_BLOCKING_INDEX BeanMachineScenarioBlockingIndex
SCENARIO_BLOCKING_INDEX TattooParlorScenarioBlockingIndex
SCALEFORM_INDEX mov
SCALEFORM_INDEX mov_kb
TEXT_LABEL LabelFAM6SHRINK = "FAM6_SHRINK"
BOOL bReplayStopEventTriggered, bReplayStartEventTriggered
//|========================================= ARRAYS ======================================|
//text printing
INT iTriggeredTextHashes[30]
INT iNumTextHashesStored
BOOL FailFlags[MAX_MISSION_FAILS]
//asset arrays
MODEL_NAMES MissionModels[MAX_MODELS]
STRING MissionAnimations[MAX_ANIMATIONS]
//|========================= MISCELLANEOUS PROCEDURES & FUNCTIONS ========================|
// Initialise PC controls for peircing and tatooing minigames
PROC SETUP_PC_CONTROLS()
IF IS_PC_VERSION()
IF NOT bPCControlsSetup
INIT_PC_SCRIPTED_CONTROLS( "FAMILY6")
bPCControlsSetup = TRUE
ENDIF
ENDIF
ENDPROC
PROC CLEANUP_PC_CONTROLS()
IF IS_PC_VERSION()
IF bPCControlsSetup
SHUTDOWN_PC_SCRIPTED_CONTROLS()
bPCControlsSetup = FALSE
ENDIF
ENDIF
ENDPROC
FUNC BOOL HAS_SCALEFORM_LOADED()
IF IS_PC_VERSION()
IF HAS_SCALEFORM_MOVIE_LOADED(mov)
AND HAS_SCALEFORM_MOVIE_LOADED(mov_kb)
RETURN TRUE
ENDIF
ELSE
IF HAS_SCALEFORM_MOVIE_LOADED(mov)
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
PROC RESET_MISSION_FLAGS()
//reset setup progress to 1, so that iSetupProgress = 0 only runs once, on initial mission load.
iStageSetupProgress = 1
iMissionStageProgress = 0
iAmandaProgress = 0
iLazlowLeadoutProgress = 0
iBeanMachineSceneProgress = 0
iTattooParlorSceneProgress = 0
bStageReplayInProgress = FALSE
bDestinationReached = FALSE
bLeadInTriggered = FALSE
bCutsceneSkipped = FALSE
bTimelapseCutsceneSkipped = FALSE
bCutsceneAssetsRequested = FALSE
bScaleformDrawing = FALSE
bLookAtAmandaActive = FALSE
bCustomRouteActive = FALSE
bStopUsingDefaultRoute = FALSE
bPlayerPedScriptTaskInterrupted = FALSE
bPlayerHitPed = FALSE
bPlayerActingBad = FALSE
bFamilyArrivedAtHouse = FALSE
iLoseCopsReminderCount = 0
iLoseCopsReminderTimer = 0
iPlayerOffenceTimer = 0
iPlayerOffencesCount = 0
iBadConversationCount = 0
iHitPedConversationCount = 0
iCopsLostConversationCount = 0
iConversationTimer = 0
iConversationCounter = 0
CurrentConversationRoot = ""
CurrentConversationLabel = ""
bRunConversationPausingCheck = FALSE
bCurrentConversationInterrupted = FALSE
iIdleConversationcounter = 0
iIdle1Conversationcounter = 0
iIdle2Conversationcounter = 0
iIdle3ConversationCounter = 0
iStruggleConversationTimer = 0
iAwayConversationTimer = 0
iAwayConversationCounter = 0
LabelFAM6SHRINK = "FAM6_SHRINK"
bSetSRLForcePrestream = FALSE
bReplayStopEventTriggered = FALSE
bReplayStartEventTriggered = FALSE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Mission flags and progress counters are reset.")
#ENDIF
ENDPROC
PROC REMOVE_LABEL_ARRAY_SPACES()
INT iArrayLength = COUNT_OF(iTriggeredTextHashes)
INT i = 0
REPEAT (iArrayLength - 1) i
IF iTriggeredTextHashes[i] = 0
IF iTriggeredTextHashes[i+1] != 0
iTriggeredTextHashes[i] = iTriggeredTextHashes[i+1]
iTriggeredTextHashes[i+1] = 0
ENDIF
ENDIF
ENDREPEAT
ENDPROC
FUNC INT GET_LABEL_INDEX(INT iLabelHash)
INT i = 0
REPEAT iNumTextHashesStored i
IF iTriggeredTextHashes[i] = iLabelHash
RETURN i
ENDIF
ENDREPEAT
RETURN -1
ENDFUNC
FUNC BOOL HAS_LABEL_BEEN_TRIGGERED(STRING strLabel)
INT iHash = GET_HASH_KEY(strLabel)
IF GET_LABEL_INDEX(iHash) != -1
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
PROC SET_LABEL_AS_TRIGGERED(STRING strLabel, BOOL bTrigger)
INT iHash = GET_HASH_KEY(strLabel)
IF bTrigger
IF NOT HAS_LABEL_BEEN_TRIGGERED(strLabel)
INT iArraySize = COUNT_OF(iTriggeredTextHashes)
IF iNumTextHashesStored < iArraySize
iTriggeredTextHashes[iNumTextHashesStored] = iHash
iNumTextHashesStored++
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": SET_LABEL_AS_TRIGGERED(): ", strLabel, " TRUE.")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": SET_LABEL_AS_TRIGGERED(): ", iNumTextHashesStored, "/", COUNT_OF(iTriggeredTextHashes), ".")
#ENDIF
ELSE
#IF IS_DEBUG_BUILD
SCRIPT_ASSERT("SET_LABEL_AS_TRIGGERED: Label array is full.")
#ENDIF
ENDIF
ENDIF
ELSE
INT iIndex = GET_LABEL_INDEX(iHash)
IF iIndex != -1
iTriggeredTextHashes[iIndex] = 0
REMOVE_LABEL_ARRAY_SPACES()
iNumTextHashesStored--
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": SET_LABEL_AS_TRIGGERED(): ", strLabel, " FALSE.")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": SET_LABEL_AS_TRIGGERED(): ", iNumTextHashesStored, "/", COUNT_OF(iTriggeredTextHashes), ".")
#ENDIF
ENDIF
ENDIF
ENDPROC
PROC CLEAR_TRIGGERED_LABELS()
INT iArraySize = COUNT_OF(iTriggeredTextHashes)
INT i = 0
REPEAT iArraySize i
iTriggeredTextHashes[i] = 0
ENDREPEAT
iNumTextHashesStored = 0
ENDPROC
PROC UPDATE_TRIGGERED_LABEL(TEXT_LABEL &sLabel)
IF NOT IS_STRING_NULL_OR_EMPTY(sLabel) //if the label is not empty, which means not yet printed by locates header
IF NOT HAS_LABEL_BEEN_TRIGGERED(sLabel) //if it was not set as triggered by script
IF IS_THIS_PRINT_BEING_DISPLAYED(sLabel) //if the label was displayed on screen
SET_LABEL_AS_TRIGGERED(sLabel, TRUE) //mark it as triggered
ENDIF
ELSE //if the label was set as triggered by script,
//which means it was printed by locates header
IF NOT IS_THIS_PRINT_BEING_DISPLAYED(sLabel) //but is not currently being printed, cleared off screen or timed out
sLabel = "" //mark is as empty
ENDIF
ENDIF
ENDIF
ENDPROC
FUNC SCENARIO_BLOCKING_INDEX CREATE_SCENARIO_BLOCKING_AREA(VECTOR vPosition, VECTOR vSize)
RETURN ADD_SCENARIO_BLOCKING_AREA(<< vPosition.x - vSize.x, vPosition.y - vSize.y, vPosition.z - vSize.z >>,
<< vPosition.x + vSize.x, vPosition.y + vSize.y, vPosition.z + vSize.z >>)
ENDFUNC
/// PURPOSE:
/// Sets all fail flags to specified boolean value.
/// PARAMS:
/// bNewBool - Boolean value to set all flags to TRUE or FALSE.
PROC SET_FAIL_FLAGS(BOOL bNewBool)
INT i = 0
FOR i = 0 TO ( COUNT_OF(FailFlags) - 1 )
FailFlags[i] = bNewBool
ENDFOR
ENDPROC
PROC SET_JIMMY_PED_COMPONENT_VARIATIONS(BOOL &bComponentVariationsSet)
IF ( bComponentVariationsSet = FALSE )
IF DOES_ENTITY_EXIST(psJimmy.PedIndex)
IF NOT IS_ENTITY_DEAD(psJimmy.PedIndex)
SET_PED_COMPONENT_VARIATION(psJimmy.PedIndex, PED_COMP_HEAD, 0, 0) //(head)
SET_PED_COMPONENT_VARIATION(psJimmy.PedIndex, PED_COMP_BERD, 0, 0) //(berd) //berd 1 for cutscenes
SET_PED_COMPONENT_VARIATION(psJimmy.PedIndex, PED_COMP_HAIR, 0, 0) //(hair)
SET_PED_COMPONENT_VARIATION(psJimmy.PedIndex, PED_COMP_TORSO, 4, 0) //(uppr)
SET_PED_COMPONENT_VARIATION(psJimmy.PedIndex, PED_COMP_LEG, 0, 0) //(lowr)
SET_PED_COMPONENT_VARIATION(psJimmy.PedIndex, PED_COMP_HAND, 0, 0) //(hand)
SET_PED_COMPONENT_VARIATION(psJimmy.PedIndex, PED_COMP_FEET, 0, 0) //(feet)
SET_PED_COMPONENT_VARIATION(psJimmy.PedIndex, PED_COMP_TEETH, 0, 0) //(teef)
SET_PED_COMPONENT_VARIATION(psJimmy.PedIndex, PED_COMP_SPECIAL, 3, 0) //(accs)
SET_PED_COMPONENT_VARIATION(psJimmy.PedIndex, PED_COMP_SPECIAL2, 0, 0) //(task)
SET_PED_COMPONENT_VARIATION(psJimmy.PedIndex, PED_COMP_DECL, 2, 0) //(decl)
bComponentVariationsSet = TRUE
ENDIF
ENDIF
ENDIF
ENDPROC
PROC SET_JIMMY_CUTSCENE_COMPONENT_VARIATIONS()
SET_CUTSCENE_PED_COMPONENT_VARIATION("Jimmy", PED_COMP_HEAD, 0, 0) //(head)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Jimmy", PED_COMP_BERD, 1, 0) //(berd)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Jimmy", PED_COMP_HAIR, 0, 0) //(hair)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Jimmy", PED_COMP_TORSO, 4, 0) //(uppr)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Jimmy", PED_COMP_LEG, 0, 0) //(lowr)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Jimmy", PED_COMP_HAND, 0, 0) //(hand)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Jimmy", PED_COMP_FEET, 0, 0) //(feet)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Jimmy", PED_COMP_TEETH, 0, 0) //(teef)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Jimmy", PED_COMP_SPECIAL, 3, 0) //(accs)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Jimmy", PED_COMP_SPECIAL2, 0, 0) //(task)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Jimmy", PED_COMP_DECL, 2, 0) //(decl)
ENDPROC
PROC SET_TRACEY_PED_COMPONENT_VARIATIONS(BOOL &bComponentVariationsSet)
IF ( bComponentVariationsSet = FALSE )
IF DOES_ENTITY_EXIST(psTracey.PedIndex)
IF NOT IS_ENTITY_DEAD(psTracey.PedIndex)
SET_PED_PROP_INDEX(psTracey.PedIndex, ANCHOR_HEAD, 0, 0)
SET_PED_COMPONENT_VARIATION(psTracey.PedIndex, PED_COMP_HEAD, 0, 0) //(head)
SET_PED_COMPONENT_VARIATION(psTracey.PedIndex, PED_COMP_HAIR, 3, 0) //(hair)
SET_PED_COMPONENT_VARIATION(psTracey.PedIndex, PED_COMP_TORSO, 4, 0) //(uppr)
SET_PED_COMPONENT_VARIATION(psTracey.PedIndex, PED_COMP_LEG, 4, 0) //(lowr)
SET_PED_COMPONENT_VARIATION(psTracey.PedIndex, PED_COMP_HAND, 0, 0) //(hand)
SET_PED_COMPONENT_VARIATION(psTracey.PedIndex, PED_COMP_FEET, 2, 0) //(feet)
SET_PED_COMPONENT_VARIATION(psTracey.PedIndex, PED_COMP_TEETH, 0, 0) //(teef)
SET_PED_COMPONENT_VARIATION(psTracey.PedIndex, PED_COMP_SPECIAL, 3, 0) //(accs)
bComponentVariationsSet = TRUE
ENDIF
ENDIF
ENDIF
ENDPROC
PROC SET_TRACEY_CUTSCENE_COMPONENT_VARIATIONS()
SET_CUTSCENE_PED_PROP_VARIATION("Tracy", ANCHOR_HEAD, 0, 0)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Tracy", PED_COMP_HEAD, 0, 0) //(head)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Tracy", PED_COMP_HAIR, 3, 0) //(hair)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Tracy", PED_COMP_TORSO, 4, 0) //(uppr)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Tracy", PED_COMP_LEG, 4, 0) //(lowr)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Tracy", PED_COMP_HAND, 0, 0) //(hand)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Tracy", PED_COMP_FEET, 2, 0) //(feet)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Tracy", PED_COMP_TEETH, 0, 0) //(teef)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Tracy", PED_COMP_SPECIAL, 3, 0) //(accs)
ENDPROC
PROC SET_AMANDA_PED_COMPONENT_VARIATIONS(BOOL &bComponentVariationsSet)
IF ( bComponentVariationsSet = FALSE )
IF DOES_ENTITY_EXIST(psAmanda.PedIndex)
IF NOT IS_ENTITY_DEAD(psAmanda.PedIndex)
SET_PED_COMPONENT_VARIATION(psAmanda.PedIndex, PED_COMP_HEAD, 0, 0) //(head)
SET_PED_COMPONENT_VARIATION(psAmanda.PedIndex, PED_COMP_BERD, 0, 0) //(berd)
SET_PED_COMPONENT_VARIATION(psAmanda.PedIndex, PED_COMP_HAIR, 4, 0) //(hair)
SET_PED_COMPONENT_VARIATION(psAmanda.PedIndex, PED_COMP_TORSO, 5, 0) //(uppr)
SET_PED_COMPONENT_VARIATION(psAmanda.PedIndex, PED_COMP_LEG, 5, 0) //(lowr)
SET_PED_COMPONENT_VARIATION(psAmanda.PedIndex, PED_COMP_HAND, 0, 0) //(hand)
SET_PED_COMPONENT_VARIATION(psAmanda.PedIndex, PED_COMP_TEETH, 0, 0) //(teef)
SET_PED_COMPONENT_VARIATION(psAmanda.PedIndex, PED_COMP_SPECIAL, 0, 0) //(accs)
SET_PED_COMPONENT_VARIATION(psAmanda.PedIndex, PED_COMP_DECL, 1, 0) //(decl)
bComponentVariationsSet = TRUE
ENDIF
ENDIF
ENDIF
ENDPROC
PROC SET_AMANDA_CUTSCENE_COMPONENT_VARIATIONS()
SET_CUTSCENE_PED_COMPONENT_VARIATION("Amanda", PED_COMP_HEAD, 0, 0) //(head)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Amanda", PED_COMP_BERD, 0, 0) //(berd)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Amanda", PED_COMP_HAIR, 4, 0) //(hair)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Amanda", PED_COMP_TORSO, 5, 0) //(uppr)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Amanda", PED_COMP_LEG, 5, 0) //(lowr)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Amanda", PED_COMP_HAND, 0, 0) //(hand)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Amanda", PED_COMP_TEETH, 0, 0) //(teef)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Amanda", PED_COMP_SPECIAL, 0, 0) //(accs)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Amanda", PED_COMP_DECL, 1, 0) //(decl)
ENDPROC
PROC SET_FABIEN_PED_COMPONENT_VARIATIONS(BOOL &bComponentVariationsSet)
IF ( bComponentVariationsSet = FALSE )
IF DOES_ENTITY_EXIST(psFabien.PedIndex)
IF NOT IS_ENTITY_DEAD(psFabien.PedIndex)
SET_PED_COMPONENT_VARIATION(psFabien.PedIndex, PED_COMP_HEAD, 0, 0) //(head)
SET_PED_COMPONENT_VARIATION(psFabien.PedIndex, PED_COMP_HAIR, 0, 0) //(hair)
SET_PED_COMPONENT_VARIATION(psFabien.PedIndex, PED_COMP_TORSO, 1, 0) //(uppr)
SET_PED_COMPONENT_VARIATION(psFabien.PedIndex, PED_COMP_LEG, 1, 0) //(lowr)
SET_PED_COMPONENT_VARIATION(psFabien.PedIndex, PED_COMP_HAND, 0, 0) //(hand)
SET_PED_COMPONENT_VARIATION(psFabien.PedIndex, PED_COMP_TEETH, 0, 0) //(teef)
SET_PED_COMPONENT_VARIATION(psFabien.PedIndex, PED_COMP_SPECIAL, 1, 0) //(accs)
bComponentVariationsSet = TRUE
ENDIF
ENDIF
ENDIF
ENDPROC
PROC SET_FABIEN_CUTSCENE_COMPONENT_VARIATIONS()
SET_CUTSCENE_PED_COMPONENT_VARIATION("Fabien", PED_COMP_HEAD, 0, 0) //(head)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Fabien", PED_COMP_HAIR, 0, 0) //(hair)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Fabien", PED_COMP_TORSO, 1, 0) //(uppr)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Fabien", PED_COMP_LEG, 1, 0) //(lowr)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Fabien", PED_COMP_HAND, 0, 0) //(hand)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Fabien", PED_COMP_TEETH, 0, 0) //(teef)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Fabien", PED_COMP_SPECIAL, 1, 0) //(accs)
ENDPROC
PROC SET_LAZLOW_PED_COMPONENT_VARIATIONS(BOOL &bComponentVariationsSet, BOOL bShirtOff, BOOL bPierced, BOOL bHairCut, BOOL bTattooed, BOOL bChestTattooed)
IF ( bComponentVariationsSet = FALSE )
IF DOES_ENTITY_EXIST(psLazlow.PedIndex)
IF NOT IS_ENTITY_DEAD(psLazlow.PedIndex)
SET_PED_COMPONENT_VARIATION(psLazlow.PedIndex, PED_COMP_HEAD, 0, 0) //(head)
SET_PED_COMPONENT_VARIATION(psLazlow.PedIndex, PED_COMP_LEG, 0, 0) //(lowr)
SET_PED_COMPONENT_VARIATION(psLazlow.PedIndex, PED_COMP_HAND, 0, 0) //(hand)
SET_PED_COMPONENT_VARIATION(psLazlow.PedIndex, PED_COMP_FEET, 1, 0) //(feet)
SET_PED_COMPONENT_VARIATION(psLazlow.PedIndex, PED_COMP_TEETH, 0, 0) //(teef)
SET_PED_COMPONENT_VARIATION(psLazlow.PedIndex, PED_COMP_SPECIAL, 0, 0) //(accs)
SET_PED_COMPONENT_VARIATION(psLazlow.PedIndex, PED_COMP_DECL, 0, 0) //(decl)
IF bHairCut = FALSE
SET_PED_COMPONENT_VARIATION(psLazlow.PedIndex, PED_COMP_HAIR, 0, 0) //(hair)
ELSE
SET_PED_COMPONENT_VARIATION(psLazlow.PedIndex, PED_COMP_HAIR, 1, 0) //(hair)
ENDIF
IF bShirtOff = FALSE
SET_PED_COMPONENT_VARIATION(psLazlow.PedIndex, PED_COMP_TORSO, 2, 0) //(uppr)
ELSE
SET_PED_COMPONENT_VARIATION(psLazlow.PedIndex, PED_COMP_TORSO, 1, 0) //uppr
ENDIF
IF bPierced = FALSE
SET_PED_COMPONENT_VARIATION(psLazlow.PedIndex, PED_COMP_SPECIAL2, 0, 0) //(task)
ELSE
SET_PED_COMPONENT_VARIATION(psLazlow.PedIndex, PED_COMP_SPECIAL2, 0, 7) //task
ENDIF
IF bTattooed
IF bChestTattooed
SET_PED_COMPONENT_VARIATION(psLazlow.PedIndex, PED_COMP_DECL, 0, 5) //decl
ELSE
SET_PED_COMPONENT_VARIATION(psLazlow.PedIndex, PED_COMP_DECL, 1, 5) //decl
ENDIF
ELSE
SET_PED_COMPONENT_VARIATION(psLazlow.PedIndex, PED_COMP_DECL, 0, 0) //decl
ENDIF
bComponentVariationsSet = TRUE
ENDIF
ENDIF
ENDIF
ENDPROC
PROC SET_LAZLOW_CUTSCENE_COMPONENT_VARIATIONS(BOOL bShirtOff, BOOL bPierced, BOOL bHairCut, BOOL bTattooed, BOOL bChestTattooed)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Lazlow", PED_COMP_HEAD, 0, 0) //(head)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Lazlow", PED_COMP_LEG, 0, 0) //(lowr)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Lazlow", PED_COMP_HAND, 0, 0) //(hand)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Lazlow", PED_COMP_FEET, 1, 0) //(feet)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Lazlow", PED_COMP_TEETH, 0, 0) //(teef)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Lazlow", PED_COMP_SPECIAL, 0, 0) //(accs)
SET_CUTSCENE_PED_COMPONENT_VARIATION("Lazlow", PED_COMP_DECL, 0, 0) //(decl)
IF bHairCut = FALSE
SET_CUTSCENE_PED_COMPONENT_VARIATION("Lazlow", PED_COMP_HAIR, 0, 0) //(hair)
ELSE
SET_CUTSCENE_PED_COMPONENT_VARIATION("Lazlow", PED_COMP_HAIR, 1, 0) //(hair)
ENDIF
IF bShirtOff = FALSE
SET_CUTSCENE_PED_COMPONENT_VARIATION("Lazlow", PED_COMP_TORSO, 2, 0) //(uppr)
ELSE
SET_CUTSCENE_PED_COMPONENT_VARIATION("Lazlow", PED_COMP_TORSO, 1, 0) //uppr
ENDIF
IF bPierced = FALSE
SET_CUTSCENE_PED_COMPONENT_VARIATION("Lazlow", PED_COMP_SPECIAL2, 0, 0) //(task)
ELSE
SET_CUTSCENE_PED_COMPONENT_VARIATION("Lazlow", PED_COMP_SPECIAL2, 0, 7) //task
ENDIF
IF bTattooed
IF bChestTattooed
SET_CUTSCENE_PED_COMPONENT_VARIATION("Lazlow", PED_COMP_DECL, 0, 5) //decl
ELSE
SET_CUTSCENE_PED_COMPONENT_VARIATION("Lazlow", PED_COMP_DECL, 1, 5) //decl
ENDIF
ELSE
SET_CUTSCENE_PED_COMPONENT_VARIATION("Lazlow", PED_COMP_DECL, 0, 0) //decl
ENDIF
ENDPROC
PROC SET_TATGUY_PED_COMPONENT_VARIATIONS(BOOL &bComponentVariationsSet)
IF ( bComponentVariationsSet = FALSE )
IF DOES_ENTITY_EXIST(psTatguy.PedIndex)
IF NOT IS_ENTITY_DEAD(psTatguy.PedIndex)
SET_PED_COMPONENT_VARIATION(psTatguy.PedIndex, PED_COMP_HEAD, 0, 0) //(head)
SET_PED_COMPONENT_VARIATION(psTatguy.PedIndex, PED_COMP_HAIR, 0, 0) //(hair)
SET_PED_COMPONENT_VARIATION(psTatguy.PedIndex, PED_COMP_TORSO, 0, 0) //(uppr)
SET_PED_COMPONENT_VARIATION(psTatguy.PedIndex, PED_COMP_LEG, 0, 0) //(lowr)
SET_PED_COMPONENT_VARIATION(psTatguy.PedIndex, PED_COMP_FEET, 0, 0) //(feet)
SET_PED_COMPONENT_VARIATION(psTatguy.PedIndex, PED_COMP_DECL, 0, 0) //(decl)
ENDIF
ENDIF
ENDIF
ENDPROC
FUNC BOOL IS_VEHICLE_REVERSING(VEHICLE_INDEX VehicleIndex)
IF DOES_ENTITY_EXIST(VehicleIndex)
IF IS_VEHICLE_DRIVEABLE(VehicleIndex)
VECTOR vVelocity = GET_ENTITY_SPEED_VECTOR(VehicleIndex, TRUE)
IF ( vVelocity.y < -1.0 )
RETURN TRUE
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
PROC RUN_INTERIOR_UNPINNING_CHECK(VECTOR vInteriorCoords, FLOAT fRadius)
IF NOT ARE_VECTORS_EQUAL(vInteriorCoords, << 0.0, 0.0, 0.0 >>) //don't check the interior if the coordinates are not valid
IF IS_INTERIOR_READY(GET_INTERIOR_AT_COORDS(vInteriorCoords)) //unpin the interior if it is pinned and player is away from it
IF ( GET_DISTANCE_BETWEEN_COORDS(vInteriorCoords, GET_ENTITY_COORDS(PLAYER_PED_ID()), TRUE) > fRadius )
UNPIN_INTERIOR(GET_INTERIOR_AT_COORDS(vInteriorCoords))
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Unpinning interior at coordinates ", vInteriorCoords, " in memory.")
#ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Warps specified ped to new coordinates and sets specified ped's new heading.
/// PARAMS:
/// ped - PED_INDEX to warp.
/// vNewPosition - VECTOR coordinates specifying new ped's position.
/// fNewHeading - FLOAT specifying new ped's heading.
/// bKeepVehicle - Specifies if ped should keep vehicle they are currently in.
/// bResetGameplayCamera - Specifies if gameplay camera should be positioned behind player's back. Works only for PLAYER_PED_ID().
/// bLoadScene - Specifies if scene at new provided coordinates should be loaded. Works only for PLAYER_PED_ID().
PROC WARP_PED(PED_INDEX ped, VECTOR vNewPosition, FLOAT fNewHeading, BOOL bKeepVehicle, BOOL bResetGameplayCamera, BOOL bLoadScene)
IF NOT IS_PED_INJURED(ped)
IF ( bKeepVehicle = TRUE )
SET_PED_COORDS_KEEP_VEHICLE(ped, vNewPosition)
ELIF ( bKeepVehicle = FALSE )
SET_ENTITY_COORDS(ped, vNewPosition)
ENDIF
SET_ENTITY_HEADING(ped, fNewHeading)
IF ( ped = PLAYER_PED_ID())
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Warping player ped to coordinates ", vNewPosition, " and heading ", fNewHeading, ".")
#ENDIF
IF IS_PLAYER_PLAYING(PLAYER_ID())
SET_PLAYER_CLOTH_PIN_FRAMES(PLAYER_ID(), 1)
ENDIF
IF ( bResetGameplayCamera = TRUE)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0)
ENDIF
IF ( bLoadScene = TRUE )
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Calling LOAD_SCENE() at coordinates ", vNewPosition, ". This might take a while to load.")
#ENDIF
LOAD_SCENE(vNewPosition)
ENDIF
ELSE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Warping ped to coordinates ", vNewPosition, " and heading ", fNewHeading, ".")
#ENDIF
ENDIF
ENDIF
ENDPROC
PROC CLEANUP_PED(PED_STRUCT &ped, BOOL bDelete = FALSE, BOOL bDeathOnly = TRUE, BOOL bKeepTask = TRUE)
IF ( bDelete = FALSE )
IF DOES_ENTITY_EXIST(ped.PedIndex)
IF ( bDeathOnly = TRUE )
IF IS_PED_INJURED(ped.PedIndex)
SET_PED_AS_NO_LONGER_NEEDED(ped.PedIndex)
IF DOES_BLIP_EXIST(ped.BlipIndex)
REMOVE_BLIP(ped.BlipIndex)
ENDIF
ENDIF
ELIF ( bDeathOnly = FALSE )
IF NOT IS_PED_INJURED(ped.PedIndex)
IF IS_PED_GROUP_MEMBER(ped.PedIndex, PLAYER_GROUP_ID())
REMOVE_PED_FROM_GROUP(ped.PedIndex)
ENDIF
SET_PED_KEEP_TASK(ped.PedIndex, bKeepTask)
SET_PED_AS_NO_LONGER_NEEDED(ped.PedIndex)
IF DOES_BLIP_EXIST(ped.BlipIndex)
REMOVE_BLIP(ped.BlipIndex)
ENDIF
ENDIF
ENDIF
ENDIF
ELIF ( bDelete = TRUE )
IF DOES_ENTITY_EXIST(ped.PedIndex)
IF NOT IS_PED_INJURED(ped.PedIndex)
IF IS_PED_GROUP_MEMBER(ped.PedIndex, PLAYER_GROUP_ID())
REMOVE_PED_FROM_GROUP(ped.PedIndex)
ENDIF
ENDIF
DELETE_PED(ped.PedIndex)
IF DOES_BLIP_EXIST(ped.BlipIndex)
REMOVE_BLIP(ped.BlipIndex)
ENDIF
ENDIF
ped.iTimer = 0
ped.iProgress = 0
ped.bComponentVariationsSet = FALSE
ENDIF
ENDPROC
PROC CLEANUP_MISSION_OBJECT(OBJECT_STRUCT &osObject, BOOL bDelete = FALSE)
IF DOES_ENTITY_EXIST(osObject.ObjectIndex)
IF IS_ENTITY_ATTACHED(osObject.ObjectIndex)
DETACH_ENTITY(osObject.ObjectIndex)
ENDIF
IF ( bDelete = TRUE )
DELETE_OBJECT(osObject.ObjectIndex)
ELSE
SET_OBJECT_AS_NO_LONGER_NEEDED(osObject.ObjectIndex)
ENDIF
ENDIF
ENDPROC
FUNC INT GET_VEHICLE_EXIT_DELAY(PED_INDEX PedIndex, VEHICLE_INDEX VehicleIndex)
IF IS_PED_SITTING_IN_THIS_VEHICLE(PedIndex, VehicleIndex)
SWITCH GET_PED_VEHICLE_SEAT(PedIndex, VehicleIndex)
CASE VS_DRIVER
RETURN 1250
BREAK
CASE VS_FRONT_RIGHT
RETURN 1500
BREAK
CASE VS_BACK_LEFT
RETURN 250
BREAK
CASE VS_BACK_RIGHT
RETURN 50
BREAK
DEFAULT
RETURN 0
BREAK
ENDSWITCH
ENDIF
RETURN 0
ENDFUNC
//|======================= DEBUG VARIABLES, PROCEDURES & FUNCTIONS =======================|
#IF IS_DEBUG_BUILD
//mission skip menu variables
MissionStageMenuTextStruct SkipMenu[18]
INT iReturnStage
BOOL bStageResetFlag
WIDGET_GROUP_ID Family6Widgets
/// PURPOSE:
/// Returns string name of the specified mission stage.
/// PARAMS:
/// eStage - Mission stage to get string name for.
/// RETURNS:
/// String name of the specified mission stage.
FUNC STRING GET_MISSION_STAGE_NAME_FOR_DEBUG(MISSION_STAGES eStage)
SWITCH eStage
CASE MISSION_STAGE_PRE_INTRO
RETURN "MISSION_STAGE_PRE_INTRO"
BREAK
CASE MISSION_STAGE_CUTSCENE_INTRO_P1
RETURN "MISSION_STAGE_CUTSCENE_INTRO_P1"
BREAK
CASE MISSION_STAGE_TIMELAPSE
RETURN "MISSION_STAGE_TIMELAPSE"
BREAK
CASE MISSION_STAGE_CUTSCENE_INTRO_P2
RETURN "MISSION_STAGE_CUTSCENE_INTRO_P2"
BREAK
CASE MISSION_STAGE_DRIVE_TO_BEAN_MACHINE
RETURN "MISSION_STAGE_DRIVE_TO_BEAN_MACHINE"
BREAK
CASE MISSION_STAGE_CUTSCENE_BEAN_MACHINE
RETURN "MISSION_STAGE_CUTSCENE_BEAN_MACHINE"
BREAK
CASE MISSION_STAGE_DRIVE_TO_TRACEY
RETURN "MISSION_STAGE_DRIVE_TO_TRACEY"
BREAK
CASE MISSION_STAGE_CUTSCENE_SHOP_1
RETURN "MISSION_STAGE_CUTSCENE_SHOP_1"
BREAK
CASE MISSION_STAGE_PIERCE_LAZLOW
RETURN "MISSION_STAGE_PIERCE_LAZLOW"
BREAK
CASE MISSION_STAGE_CUTSCENE_SHOP_2
RETURN "MISSION_STAGE_CUTSCENE_SHOP_2"
BREAK
CASE MISSION_STAGE_TATTOO_LAZLOW
RETURN "MISSION_STAGE_TATTOO_LAZLOW"
BREAK
CASE MISSION_STAGE_CUTSCENE_SHOP_3
RETURN "MISSION_STAGE_CUTSCENE_SHOP_3"
BREAK
CASE MISSION_STAGE_CUT_LAZLOW_HAIR
RETURN "MISSION_STAGE_CUT_LAZLOW_HAIR"
BREAK
CASE MISSION_STAGE_CUTSCENE_SHOP_4
RETURN "MISSION_STAGE_CUTSCENE_SHOP_4"
BREAK
CASE MISSION_STAGE_DRIVE_TO_SHRINK
RETURN "MISSION_STAGE_DRIVE_TO_SHRINK"
BREAK
CASE MISSION_STAGE_CUTSCENE_SHRINK
RETURN "MISSION_STAGE_CUTSCENE_SHRINK"
BREAK
CASE MISSION_STAGE_DRIVE_HOME
RETURN "MISSION_STAGE_DRIVE_HOME"
BREAK
CASE MISSION_STAGE_CUTSCENE_END
RETURN "MISSION_STAGE_CUTSCENE_END"
BREAK
ENDSWITCH
RETURN "INCORRECT_MISSION_STAGE"
ENDFUNC
PROC CREATE_DEBUG_WIDGETS()
Family6Widgets = START_WIDGET_GROUP("Mission: Family6")
START_WIDGET_GROUP("Tattoo Buttons")
ADD_WIDGET_FLOAT_SLIDER("TATTOO_BUTTONS_X", TATTOO_BUTTONS_X, 0.0, 1.0, 0.001)
ADD_WIDGET_FLOAT_SLIDER("TATTOO_BUTTONS_Y", TATTOO_BUTTONS_Y, 0.0, 1.0, 0.001)
ADD_WIDGET_FLOAT_SLIDER("TATTOO_BUTTONS_WIDTH", TATTOO_BUTTONS_WIDTH, 0.0, 1.0, 0.001)
ADD_WIDGET_FLOAT_SLIDER("TATTOO_BUTTONS_HEIGHT", TATTOO_BUTTONS_HEIGHT, 0.0, 1.0, 0.001)
ADD_WIDGET_FLOAT_SLIDER("TATTOO_BUTTONS_SCALE", TATTOO_BUTTONS_SCALE, 0.0, 2.0, 0.001)
STOP_WIDGET_GROUP()
STOP_WIDGET_GROUP()
SET_LOCATES_HEADER_WIDGET_GROUP(Family6Widgets)
ENDPROC
PROC DELETE_DEBUG_WIDGETS()
IF DOES_WIDGET_GROUP_EXIST(Family6Widgets)
DELETE_WIDGET_GROUP(Family6Widgets)
ENDIF
ENDPROC
PROC CREATE_DEBUG_MISSION_STAGE_MENU()
SkipMenu[0].sTxtLabel = "PRE INTRO"
SkipMenu[1].sTxtLabel = "CUT - INTRO P1 - FAM_6_INT"
SkipMenu[2].sTxtLabel = "TIMELAPSE"
SkipMenu[3].sTxtLabel = "CUT - INTRO P2 - FAM_6_INT_P3_T7"
SkipMenu[4].sTxtLabel = "DRIVE TO BEAN MACHINE"
SkipMenu[5].sTxtLabel = "CUT - BEAN MACHINE - FAM_6_MCS_1"
SkipMenu[6].sTxtLabel = "DRIVE TO TRACEY"
SkipMenu[7].sTxtLabel = "CUT - SHOP 1 - FAM_6_MCS_2_CONCAT"
SkipMenu[8].sTxtLabel = "PIERCE LAZLOW"
SkipMenu[9].sTxtLabel = "CUT - SHOP 2 - FAM_6_MCS_3"
SkipMenu[10].sTxtLabel = "TATTOO LAZLOW"
SkipMenu[11].sTxtLabel = "CUT - SHOP 3 - FAM_6_MCS_4"
SkipMenu[12].sTxtLabel = "CUT LAZLOW HAIR"
SkipMenu[13].sTxtLabel = "CUT - SHOP 4 - FAM_6_MCS_5"
SkipMenu[14].sTxtLabel = "DRIVE TO SHRINK"
SkipMenu[15].sTxtLabel = "CUT - SHRINK - FAM_6_MCS_6"
SkipMenu[16].sTxtLabel = "DRIVE HOME"
SkipMenu[17].sTxtLabel = "CUT - END - FAM_6_MCS_6_P4_B"
ENDPROC
PROC RUN_DEBUG_PASS_AND_FAIL_CHECK(MISSION_STAGES &eStage, MISSION_FAILS &eFailReason)
IF IS_KEYBOARD_KEY_PRESSED (KEY_S)
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
CLEAR_PED_TASKS(PLAYER_PED_ID())
ENDIF
eStage = MISSION_STAGE_PASSED
ENDIF
IF IS_KEYBOARD_KEY_PRESSED (KEY_F)
eStage = MISSION_STAGE_FAILED
eFailReason = MISSION_FAIL_FORCE_FAIL
ENDIF
ENDPROC
/// PURPOSE:
/// Performs a screen fade in with a wait for a specified time.
/// PARAMS:
/// iTime - Duration of the fade in miliseconds.
PROC DO_SCREEN_FADE_IN_FOR_DEBUG(INT iTime)
IF NOT IS_SCREEN_FADED_IN()
DO_SCREEN_FADE_IN(iTime)
WHILE NOT IS_SCREEN_FADED_IN()
WAIT(0)
ENDWHILE
ENDIF
ENDPROC
/// PURPOSE:
/// Performs a screen fade out with a wait for a specified time.
/// PARAMS:
/// iTime - Duration of the fade in miliseconds.
PROC DO_SCREEN_FADE_OUT_FOR_DEBUG(INT iTime)
IF NOT IS_SCREEN_FADED_OUT()
DO_SCREEN_FADE_OUT(iTime)
WHILE NOT IS_SCREEN_FADED_OUT()
WAIT(0)
ENDWHILE
ENDIF
ENDPROC
/// PURPOSE:
/// Stops an active mocap cutscene and waits until it has finished.
PROC DO_SAFE_STOP_CUTSCENE()
IF IS_CUTSCENE_PLAYING()
SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, FALSE, FALSE)
STOP_CUTSCENE(TRUE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE) //needs to be called to make sure all scripted systems work correctly when cutscene is skipped
ENDIF
WHILE NOT HAS_CUTSCENE_FINISHED()
WAIT(0)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Waiting for the cutscene to finish.")
#ENDIF
ENDWHILE
ENDPROC
PROC RUN_MISSION_STAGE_CLEANUP_FOR_DEBUG()
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Starting mission stage cleanup.")
KILL_PHONE_CONVERSATION()
HANG_UP_AND_PUT_AWAY_PHONE(TRUE)
KILL_ANY_CONVERSATION()
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
REMOVE_CUTSCENE()
IF ( bReplayStartEventTriggered = TRUE )
REPLAY_STOP_EVENT()
ENDIF
CLEANUP_PED(psJimmy, TRUE)
CLEANUP_PED(psAmanda, TRUE)
CLEANUP_PED(psFabien, TRUE)
CLEANUP_PED(psTracey, TRUE)
CLEANUP_PED(psLazlow, TRUE)
CLEANUP_PED(psHipster, TRUE)
CLEANUP_PED(psTatguy, TRUE)
IF DOES_ENTITY_EXIST(osLeftDoorDummy.ObjectIndex)
REMOVE_MODEL_HIDE(osLeftDoorDummy.vPosition, 1.0, osLeftDoorDummy.ModelName)
ENDIF
IF DOES_ENTITY_EXIST(osRightDoorDummy.ObjectIndex)
REMOVE_MODEL_HIDE(osRightDoorDummy.vPosition, 1.0, osRightDoorDummy.ModelName)
ENDIF
CLEANUP_MISSION_OBJECT(osMug, TRUE)
CLEANUP_MISSION_OBJECT(osShirt, TRUE)
CLEANUP_MISSION_OBJECT(osLaptop, TRUE)
CLEANUP_MISSION_OBJECT(osScissors, TRUE)
CLEANUP_MISSION_OBJECT(osPonyTail, TRUE)
CLEANUP_MISSION_OBJECT(osPiercingGun, TRUE)
CLEANUP_MISSION_OBJECT(osTattooNeedle, TRUE)
CLEANUP_MISSION_OBJECT(osLeftDoorDummy, TRUE)
CLEANUP_MISSION_OBJECT(osRightDoorDummy, TRUE)
IF DOES_ENTITY_EXIST(vsMichaelsCar.VehicleIndex)
DELETE_VEHICLE(vsMichaelsCar.VehicleIndex)
ENDIF
IF DOES_ENTITY_EXIST(vsAmandasCar.VehicleIndex)
DELETE_VEHICLE(vsAmandasCar.VehicleIndex)
ENDIF
IF DOES_PARTICLE_FX_LOOPED_EXIST(ptfxHair)
STOP_PARTICLE_FX_LOOPED(ptfxHair)
ENDIF
IF NOT HAS_SOUND_FINISHED(iTattooSoundID)
STOP_SOUND(iTattooSoundID)
ENDIF
STOP_AUDIO_SCENES()
REMOVE_PTFX_ASSET()
RELEASE_SCRIPT_AUDIO_BANK()
SET_SCALEFORM_MOVIE_AS_NO_LONGER_NEEDED(mov)
IF IS_PC_VERSION()
SET_SCALEFORM_MOVIE_AS_NO_LONGER_NEEDED(mov_kb)
ENDIF
//remove anim dictionaries
REMOVE_ANIM_DICT("missfam2mcs_intp1")
REMOVE_ANIM_DICT("missfam6ig_1_pierce")
REMOVE_ANIM_DICT("missfam6ig_7_tattoo")
REMOVE_ANIM_DICT("missfam6ig_8_ponytail")
REMOVE_ANIM_DICT("missfam6leadinoutfam_6_mcs_1")
REMOVE_ANIM_DICT("missfam6leadinoutfam_6_mcs_2")
REMOVE_ANIM_DICT("missfam6leadinoutfam_6_mcs_5")
REMOVE_ANIM_DICT("amb@world_human_stand_impatient@female@no_sign@idle_a")
IF NOT HAS_SOUND_FINISHED(iTattooSoundID)
STOP_SOUND(iTattooSoundID)
ENDIF
DESTROY_ALL_CAMS()
RENDER_SCRIPT_CAMS(FALSE, FALSE)
DISPLAY_HUD(TRUE)
DISPLAY_RADAR(TRUE)
CLEAR_MISSION_LOCATION_TEXT_AND_BLIPS(sLocatesData)
CLEAR_TRIGGERED_LABELS()
//DISABLE_TAXI_HAILING(FALSE)
REMOVE_ROAD_NODE_SPEED_ZONE(iSpeedZone)
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Finished mission stage cleanup.")
ENDPROC
PROC RUN_DEBUG_MISSION_STAGE_MENU(INT &iSelectedStage, MISSION_STAGES &eStage, BOOL &bSkipActive, BOOL &bResetStage)
IF LAUNCH_MISSION_STAGE_MENU(SkipMenu, iSelectedStage, ENUM_TO_INT(eStage), FALSE, "FAMILY 6")
DO_SCREEN_FADE_OUT_FOR_DEBUG(DEFAULT_FADE_TIME)
DO_SAFE_STOP_CUTSCENE()
CLEAR_PRINTS()
CLEAR_HELP()
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
ENDIF
RUN_MISSION_STAGE_CLEANUP_FOR_DEBUG()
eStage = INT_TO_ENUM(MISSION_STAGES, iSelectedStage)
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Current mission stage changed to ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eStage), " via mission stage menu.")
//reset the debug stage reset flag
bResetStage = FALSE
bSkipActive = TRUE
RESET_MISSION_FLAGS()
ENDIF
ENDPROC
PROC RUN_DEBUG_SKIPS(MISSION_STAGES &eStage, BOOL &bSkipActive, BOOL &bResetStage)
INT iCurrentStage = ENUM_TO_INT(eStage)
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_J)
IF eStage <> MISSION_STAGE_CUTSCENE_END
DO_SCREEN_FADE_OUT_FOR_DEBUG(DEFAULT_FADE_TIME)
DO_SAFE_STOP_CUTSCENE()
CLEAR_PRINTS()
CLEAR_HELP()
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
RUN_MISSION_STAGE_CLEANUP_FOR_DEBUG()
iCurrentStage++
eStage = INT_TO_ENUM(MISSION_STAGES, iCurrentStage)
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Current mission stage changed to ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eStage), " via J skip.")
//reset the debug stage reset flag
bResetStage = FALSE
bSkipActive = TRUE
RESET_MISSION_FLAGS()
ENDIF
ELIF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_P)
IF eStage <> MISSION_STAGE_PRE_INTRO
DO_SCREEN_FADE_OUT_FOR_DEBUG(DEFAULT_FADE_TIME)
DO_SAFE_STOP_CUTSCENE()
CLEAR_PRINTS()
CLEAR_HELP()
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
RUN_MISSION_STAGE_CLEANUP_FOR_DEBUG()
IF ( bResetStage = FALSE )
iCurrentStage--
eStage = INT_TO_ENUM(MISSION_STAGES, iCurrentStage)
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Current mission stage changed to ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eStage), " via P skip.")
ELIF ( bResetStage = TRUE )
eStage = INT_TO_ENUM(MISSION_STAGES, iCurrentStage)
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Current mission stage ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eStage), " reset via P skip.")
ENDIF
//reset the debug stage reset flag
bResetStage = FALSE
bSkipActive = TRUE
RESET_MISSION_FLAGS()
ENDIF
ENDIF
ENDPROC
#ENDIF
//|===================== END DEBUG VARIABLES, PROCEDURES & FUNCTIONS =====================|
/// PURPOSE:
/// Adds a model to model request array.
/// PARAMS:
/// ModelName - Model name being requested.
/// array - MODEL_NAMES array to add the requested model name to.
/// iArrayLength - Maximum length of the array.
/// iModelsAlreadyRequested - Number of models already requested in this array.
PROC ADD_MODEL_REQUEST_TO_ARRAY(MODEL_NAMES ModelName, MODEL_NAMES &array[], INT iArrayLength, INT &iModelsAlreadyRequested)
INT i = 0
BOOL bModelAlreadyRequested = FALSE
IF ( iModelsAlreadyRequested >= 0 )
IF ( iModelsAlreadyRequested <= ( iArrayLength - 1 ) )
//loop through the array (from 0 to number of models already requested)
//to see if the array already contains the model name being requested
//modify the boolean flag if the model was found in array, otherwise leave the flag unchanged
FOR i = 0 TO ( iModelsAlreadyRequested )
IF ( array[i] = ModelName )
bModelAlreadyRequested = TRUE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Requested model ", GET_MODEL_NAME_FOR_DEBUG(ModelName), " is already in model array.")
#ENDIF
ENDIF
ENDFOR
IF ( bModelAlreadyRequested = FALSE )
REQUEST_MODEL(ModelName)
//iModelsAlreadyRequested will be the model array index of the model being requested
array[iModelsAlreadyRequested] = ModelName
iModelsAlreadyRequested++
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Requested model ", GET_MODEL_NAME_FOR_DEBUG(ModelName), " and added to model array.")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Number of models requested: ", iModelsAlreadyRequested, ".")
#ENDIF
ENDIF
ELSE
SCRIPT_ASSERT("Number of requested models is greater than the length of the model array.")
ENDIF
ELSE
SCRIPT_ASSERT("Number of requested models is less than 0.")
ENDIF
ENDPROC
/// PURPOSE:
/// Checks if all requested models from model array are loaded into memory.
/// PARAMS:
/// array - MODEL_NAMES array holding the models.
/// iModelsAlreadyRequested - Number of already requested models. Should be greated than 0, since 0 means no models have been requested.
/// RETURNS:
/// TRUE if all models from model array are loaded into memory. FALSE if otherwise.
FUNC BOOL ARE_REQUESTED_MODELS_LOADED(MODEL_NAMES &array[], INT &iModelsAlreadyRequested)
INT i = 0
IF ( iModelsAlreadyRequested > 0 )
FOR i = 0 TO ( iModelsAlreadyRequested - 1 )
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Model in array[", i, "]: ", GET_MODEL_NAME_FOR_DEBUG(array[i]), ".")
#ENDIF
IF NOT HAS_MODEL_LOADED(array[i])
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Model ", GET_MODEL_NAME_FOR_DEBUG(array[i]), " is loading.")
#ENDIF
//if the model is not loaded keep requesting it
REQUEST_MODEL(array[i])
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Requesting model ", GET_MODEL_NAME_FOR_DEBUG(array[i]), ".")
#ENDIF
RETURN FALSE
ENDIF
ENDFOR
ENDIF
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Models from model array loaded. Number of models loaded: ", iModelsAlreadyRequested, ".")
#ENDIF
RETURN TRUE
ENDFUNC
/// PURPOSE:
/// Cleans model array from requested models.
/// PARAMS:
/// array - MODEL_NAMES array.
/// iModelsAlreadyRequested - Number of already requested models. Should be greated than 0, since 0 means no models have been requested.
PROC CLEANUP_MODEL_ARRAY(MODEL_NAMES &array[], INT &iModelsAlreadyRequested)
INT i = 0
IF ( iModelsAlreadyRequested > 0 )
FOR i = 0 TO ( iModelsAlreadyRequested - 1 )
IF array[i] <> DUMMY_MODEL_FOR_SCRIPT
SET_MODEL_AS_NO_LONGER_NEEDED(array[i])
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Model ", GET_MODEL_NAME_FOR_DEBUG(array[i]), " cleaned up from model array by setting it as no longer needed.")
#ENDIF
array[i] = DUMMY_MODEL_FOR_SCRIPT
ENDIF
ENDFOR
ENDIF
iModelsAlreadyRequested = 0
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Model array cleaned up. Number of requested models set to 0.")
#ENDIF
ENDPROC
/// PURPOSE:
/// Checks if two strings are equal.
/// PARAMS:
/// sString1 - First string.
/// sString2 - Second string.
/// RETURNS:
/// TRUE if strings are equal, FALSE if otherwise or if any of the strings is empty or NULL.
FUNC BOOL IS_STRING_EQUAL_TO_STRING(STRING sString1, STRING sString2)
IF NOT Is_String_Null_Or_Empty(sString1)
AND NOT Is_String_Null_Or_Empty(sString2)
RETURN ARE_STRINGS_EQUAL(sString1, sString2)
ELSE
RETURN FALSE
ENDIF
ENDFUNC
/// PURPOSE:
/// Adds animation dictionary to animation request array.
/// PARAMS:
/// sAnimName - Name of the animation dictionary to request.
/// array - STRING array containing requested animations.
/// iArrayLength - Maximum length of the array
/// iAnimationsAlreadyRequested - Number of animations already requested in this array.
PROC ADD_ANIMATION_REQUEST_TO_ARRAY(STRING sAnimName, STRING &array[], INT iArrayLength, INT &iAnimationsAlreadyRequested)
INT i = 0
BOOL bAnimationRequested
IF ( iAnimationsAlreadyRequested >= 0 )
IF ( iAnimationsAlreadyRequested <= (iArrayLength - 1 ) )
FOR i = 0 TO ( iAnimationsAlreadyRequested )
IF IS_STRING_EQUAL_TO_STRING(sAnimName, array[i])
bAnimationRequested = TRUE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Requested animation ", sAnimName, " is already in animation array.")
#ENDIF
ENDIF
ENDFOR
IF ( bAnimationRequested = FALSE )
REQUEST_ANIM_DICT(sAnimName)
array[iAnimationsAlreadyRequested] = sAnimName
iAnimationsAlreadyRequested++
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Requested animation ", sAnimName, " and added to animation array.")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Number of animations requested: ", iAnimationsAlreadyRequested, ".")
#ENDIF
ENDIF
ELSE
SCRIPT_ASSERT("Number of requested animations is greater than the length of the animation array.")
ENDIF
ELSE
SCRIPT_ASSERT("Number of requested animations is less than 0.")
ENDIF
ENDPROC
/// PURPOSE:
/// Checks if all requested animations are loaded into memory.
/// PARAMS:
/// array - STRING array containing requested animations.
/// iAnimationsAlreadyRequested - Number of animations already requested in this array.
/// RETURNS:
/// TRUE if all requested animations from animation array are loaded into memory. FALSE if otherwise.
FUNC BOOL ARE_REQUESTED_ANIMATIONS_LOADED(STRING &array[], INT &iAnimationsAlreadyRequested)
INT i = 0
IF ( iAnimationsAlreadyRequested > 0 )
FOR i = 0 TO ( iAnimationsAlreadyRequested - 1 )
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Animation dictionary in array[", i, "]: ", array[i], ".")
#ENDIF
IF NOT HAS_ANIM_DICT_LOADED(array[i])
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Animation dictionary ", array[i], " is loading.")
#ENDIF
//if the animation dictionary is not loaded keep requesting it
REQUEST_ANIM_DICT(array[i])
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Requesting animation dictionary ", array[i], ".")
#ENDIF
RETURN FALSE
ENDIF
ENDFOR
ENDIF
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Animations from animation array loaded. Number of animations loaded: ", iAnimationsAlreadyRequested, ".")
#ENDIF
RETURN TRUE
ENDFUNC
/// PURPOSE:
/// Cleans animation array from requested animations.
/// PARAMS:
/// array - STRING array of animations to clean.
/// iAnimationsAlreadyRequested - Number of animations already requested in this array.
PROC CLEANUP_ANIMATION_ARRAY(STRING &array[], INT &iAnimationsAlreadyRequested)
INT i = 0
STRING sNull = NULL
IF ( iAnimationsAlreadyRequested > 0 )
FOR i = 0 TO ( iAnimationsAlreadyRequested - 1 )
//brute force remove animation dictionary from memory
REMOVE_ANIM_DICT(array[i])
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Animation dictionary ", array[i], " removed from memory and cleaned up from animation array.")
#ENDIF
array[i] = sNull
ENDFOR
ENDIF
iAnimationsAlreadyRequested = 0
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Animation array cleaned up. Number of requested animations set to 0.")
#ENDIF
ENDPROC
/// PURPOSE:
/// Checks if the specified mocap cutscene has loaded.
/// Removes any other loaded mocap cutscene and requests the specified cutscene until it is loaded.
/// PARAMS:
/// sSceneName - Mocap cutscene name to check for being loaded.
/// CutsceneSection - Cutscene section specifying at what section to start the cutscene. Use CS_SECTION_1 to play from start.
/// RETURNS:
/// TRUE if the specified cutscene has loaded, FALSE if otherwise.
FUNC BOOL HAS_REQUESTED_CUTSCENE_LOADED(STRING sSceneName, CUTSCENE_SECTION CutsceneSection = CS_SECTION_1)
//check if the specified cutscene has loaded first
IF HAS_THIS_CUTSCENE_LOADED_WITH_FAILSAFE(sSceneName)
RETURN TRUE
ELSE
//if the expected reuqested cutscene has not loaded, but there already is a loaded cutscene
//then remove it and keep requesting specified mocap cutscene
IF HAS_CUTSCENE_LOADED_WITH_FAILSAFE()
REMOVE_CUTSCENE()
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": HAS_REQUESTED_CUTSCENE_LOADED() Removing cutscene from memory, because cutscene ", sSceneName, " was expected to be loaded.")
#ENDIF
ENDIF
IF ( CutsceneSection = CS_SECTION_1)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Cutscene ", sSceneName, " is loading.")
#ENDIF
//if the cutscene is not loaded, keep requesting it
REQUEST_CUTSCENE(sSceneName)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Requesting ", sSceneName, ".")
#ENDIF
ELSE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Cutscene ", sSceneName, " is loading with playback list.")
#ENDIF
//if the cutscene is not loaded, keep requesting it
REQUEST_CUTSCENE_WITH_PLAYBACK_LIST(sSceneName, CutsceneSection)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Requesting ", sSceneName, " cutscene with playback list.")
#ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
PROC SET_MISSION_PED_PROPERTIES(PED_INDEX PedIndex, REL_GROUP_HASH relGroupHash, BOOL bCanFlyThroughWindscreen, BOOL bKeepRelGroupOnCleanup,
BOOL bCanBeTargetted, BOOL bIsEnemy)
IF DOES_ENTITY_EXIST(PedIndex)
IF NOT IS_PED_INJURED(PedIndex)
SET_PED_CONFIG_FLAG(PedIndex, PCF_OpenDoorArmIK, TRUE)
SET_PED_CONFIG_FLAG(PedIndex, PCF_RunFromFiresAndExplosions, FALSE)
SET_PED_CONFIG_FLAG(PedIndex, PCF_WillFlyThroughWindscreen, bCanFlyThroughWindscreen)
SET_PED_CONFIG_FLAG(PedIndex, PCF_KeepRelationshipGroupAfterCleanUp, bKeepRelGroupOnCleanup)
SET_PED_CAN_BE_TARGETTED(PedIndex, bCanBeTargetted)
SET_PED_AS_ENEMY(PedIndex, bIsEnemy)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(PedIndex, TRUE)
SET_PED_CAN_USE_AUTO_CONVERSATION_LOOKAT(PedIndex, TRUE)
SET_PED_LOD_MULTIPLIER(PedIndex, 5.0)
IF ( relGroupHash != RELGROUPHASH_NO_RELATIONSHIP )
SET_PED_RELATIONSHIP_GROUP_HASH(PedIndex, relGroupHash)
ENDIF
ENDIF
ENDIF
ENDPROC
PROC SET_VEHICLE_AS_MISSION_CRITICAL(VEH_STRUCT &vehicle, BOOL bMissionCritical)
SET_VEHICLE_HAS_STRONG_AXLES(vehicle.VehicleIndex, bMissionCritical)
//limit damage that can be done to the vehicle
SET_VEHICLE_CAN_LEAK_OIL(vehicle.VehicleIndex, NOT bMissionCritical)
SET_VEHICLE_CAN_LEAK_PETROL(vehicle.VehicleIndex, NOT bMissionCritical)
//make the vehicle not attach to tow truck if mission critical
SET_VEHICLE_AUTOMATICALLY_ATTACHES(vehicle.VehicleIndex, NOT bMissionCritical)
IF IS_THIS_MODEL_A_CAR(vehicle.ModelName)
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(vehicle.VehicleIndex, SC_DOOR_FRONT_LEFT, NOT bMissionCritical)
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(vehicle.VehicleIndex, SC_DOOR_FRONT_RIGHT, NOT bMissionCritical)
ENDIF
ENDPROC
/// PURPOSE:
/// Creates a ped or player ped to be used by player and returns TRUE if such pad was created successfully.
/// PARAMS:
/// psPed - PED_STRUCT containg ped details, like PED_INDEX, blip, coordinates, heading, model etc.
/// bPlayerPed - Boolean indicating if a player ped or NPC ped should be created.
/// relGroupHash - Relationship group hash for the created ped.
/// bCreateBlip - Boolean indicating if a blip for this ped should be created.
/// eCharacter - Enum specifying character from story characters list. Use NO_CHARACTER for characters not stored in that list and provide a MODEL_NAMES in PED_STRUCT.
/// bCanFlyThroughWindscreen - Sets if ped can fly through windscreen when car crashes.
/// bCanBeTargetted - Sets if ped can be targetted by player.
/// bIsEnemy - Sets if ped is considered an enemy.
/// VehicleIndex - Specify a vehicle index if ped should be created inside a vehicle. IF not use NULL.
/// eVehicleSeat - Vehicle seat enum for peds created in vehicles.
/// RETURNS:
/// TRUE if ped was created successfully, FALSE if otherwise.
FUNC BOOL HAS_MISSION_PED_BEEN_CREATED(PED_STRUCT &psPed, BOOL bPlayerPed, REL_GROUP_HASH relGroupHash, BOOL bCreateBlip, enumCharacterList eCharacter,
BOOL bCanFlyThroughWindscreen = FALSE, BOOL bCanBeTargetted = FALSE, BOOL bIsEnemy = FALSE, VEHICLE_INDEX VehicleIndex = NULL,
VEHICLE_SEAT eVehicleSeat = VS_DRIVER, BOOL bKeepRelGroupOnCleanup = TRUE #IF IS_DEBUG_BUILD, STRING sDebugName = NULL #ENDIF)
IF ( bPlayerPed = FALSE ) //create non player ped
IF NOT DOES_ENTITY_EXIST(psPed.PedIndex)
REQUEST_MODEL(psPed.ModelName)
IF HAS_MODEL_LOADED(psPed.ModelName)
IF ( VehicleIndex = NULL ) //create ped outside of vehicle
IF ( eCharacter = NO_CHARACTER ) //use MODEL_NAMES stored in the PED_STRUCT if no character was specified
psPed.PedIndex = CREATE_PED(PEDTYPE_MISSION, psPed.ModelName, psPed.vPosition, psPed.fHeading)
SET_MODEL_AS_NO_LONGER_NEEDED(psPed.ModelName)
ELSE //use character name to define the ped MODEL_NAMES
IF CREATE_NPC_PED_ON_FOOT(psPed.PedIndex, eCharacter, psPed.vPosition, psPed.fHeading)
SET_MODEL_AS_NO_LONGER_NEEDED(psPed.ModelName)
ENDIF
ENDIF
IF NOT IS_PED_INJURED(psPed.PedIndex)
SET_MISSION_PED_PROPERTIES(psPed.PedIndex, relGroupHash, bCanFlyThroughWindscreen, bKeepRelGroupOnCleanup,
bCanBeTargetted, bIsEnemy)
IF ( bCreateBlip = TRUE )
psPed.BlipIndex = CREATE_BLIP_FOR_ENTITY(psPed.PedIndex, FALSE)
ENDIF
ENDIF
#IF IS_DEBUG_BUILD
IF NOT Is_String_Null_Or_Empty(sDebugName)
SET_PED_NAME_DEBUG(psPed.PedIndex, sDebugName)
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created mission ped ", sDebugName, " with model ", GET_MODEL_NAME_FOR_DEBUG(psPed.ModelName), " at coordinates ", psPed.vPosition, ".")
ELSE
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created mission ped with model ", GET_MODEL_NAME_FOR_DEBUG(psPed.ModelName), " at coordinates ", psPed.vPosition, ".")
ENDIF
#ENDIF
ELIF ( VehicleIndex != NULL ) //create ped in a vehicle
IF IS_VEHICLE_DRIVEABLE(VehicleIndex)
IF ( eCharacter = NO_CHARACTER ) //use MODEL_NAMES stored in the PED_STRUCT
psPed.PedIndex = CREATE_PED_INSIDE_VEHICLE(VehicleIndex, PEDTYPE_MISSION, psPed.ModelName, eVehicleSeat)
SET_MODEL_AS_NO_LONGER_NEEDED(psPed.ModelName)
ELSE //use character name to define the ped MODEL_NAMES
IF CREATE_NPC_PED_INSIDE_VEHICLE(psPed.PedIndex, eCharacter, VehicleIndex, eVehicleSeat)
SET_MODEL_AS_NO_LONGER_NEEDED(psPed.ModelName)
ENDIF
ENDIF
IF NOT IS_PED_INJURED(psPed.PedIndex)
SET_MISSION_PED_PROPERTIES(psPed.PedIndex, relGroupHash, bCanFlyThroughWindscreen, bKeepRelGroupOnCleanup,
bCanBeTargetted, bIsEnemy)
IF ( bCreateBlip = TRUE )
psPed.BlipIndex = CREATE_BLIP_FOR_ENTITY(psPed.PedIndex, FALSE)
ENDIF
ENDIF
#IF IS_DEBUG_BUILD
IF NOT Is_String_Null_Or_Empty(sDebugName)
SET_PED_NAME_DEBUG(psPed.PedIndex, sDebugName)
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created mission ped ", sDebugName, " with model ", GET_MODEL_NAME_FOR_DEBUG(psPed.ModelName), " in vehicle.")
ELSE
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created mission ped with model ", GET_MODEL_NAME_FOR_DEBUG(psPed.ModelName), " in vehicle.")
ENDIF
#ENDIF
ENDIF
ENDIF
ENDIF
ELSE
//if the ped already exists return true
RETURN TRUE
ENDIF
ELIF ( bPlayerPed = TRUE ) //create player ped, for example a ped that player can hotswap to and take control of
IF NOT DOES_ENTITY_EXIST(psPed.PedIndex)
IF ( VehicleIndex = NULL ) //create player ped outside of vehicle
IF CREATE_PLAYER_PED_ON_FOOT(psPed.PedIndex, eCharacter, psPed.vPosition, psPed.fHeading, TRUE)
SET_MISSION_PED_PROPERTIES(psPed.PedIndex, relGroupHash, bCanFlyThroughWindscreen, bKeepRelGroupOnCleanup,
bCanBeTargetted, bIsEnemy)
IF ( bCreateBlip = TRUE )
psPed.BlipIndex = CREATE_BLIP_FOR_ENTITY(psPed.PedIndex, FALSE)
ENDIF
#IF IS_DEBUG_BUILD
IF NOT Is_String_Null_Or_Empty(sDebugName)
SET_PED_NAME_DEBUG(psPed.PedIndex, sDebugName)
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created player ped ", sDebugName, " with model ", GET_MODEL_NAME_FOR_DEBUG(psPed.ModelName), " at coordinates ", psPed.vPosition, ".")
ELSE
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created player ped with model ", GET_MODEL_NAME_FOR_DEBUG(psPed.ModelName), " at coordinates ", psPed.vPosition, ".")
ENDIF
#ENDIF
RETURN TRUE
ENDIF
ELIF ( VehicleIndex != NULL ) //create player ped in a vehicle
IF IS_VEHICLE_DRIVEABLE(VehicleIndex)
IF CREATE_PLAYER_PED_INSIDE_VEHICLE(psPed.PedIndex, eCharacter, VehicleIndex, eVehicleSeat, TRUE)
SET_MISSION_PED_PROPERTIES(psPed.PedIndex, relGroupHash, bCanFlyThroughWindscreen, bKeepRelGroupOnCleanup,
bCanBeTargetted, bIsEnemy)
IF ( bCreateBlip = TRUE )
psPed.BlipIndex = CREATE_BLIP_FOR_ENTITY(psPed.PedIndex, FALSE)
ENDIF
#IF IS_DEBUG_BUILD
IF NOT Is_String_Null_Or_Empty(sDebugName)
SET_PED_NAME_DEBUG(psPed.PedIndex, sDebugName)
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created player ped ", sDebugName, " in vehicle with model ", GET_MODEL_NAME_FOR_DEBUG(psPed.ModelName), ".")
ELSE
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created player ped in vehicle with model ", GET_MODEL_NAME_FOR_DEBUG(psPed.ModelName), ".")
ENDIF
#ENDIF
RETURN TRUE
ENDIF
ENDIF
ENDIF
ELSE
//if the ped already exists, return true
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Creates vehicle to be used on a mission by player and returns TRUE if such vehicle was created successfully.
/// PARAMS:
/// vsVehicle - VEH_STRUCT containing model, position and heading of the vehicle.
/// bPlayerVehicle - If set to TRUE will create player specific vehicles using CREATE_PLAYER_VEHICLE()
/// bCarStealVehicle - If set to TRUE will create car steal strand vehicle with a specific command. Works when bPlayerVehicle is FALSE.
/// eCharacter - Character enum indicating which character specific vehicle to create.
/// bMissionCritical - Sets the vehicle to be unable to leak oil/petrol and break off doors. Set to TRUE to stop these damage types to vehicle.
/// iColourCombination - Colour combination of the vehicle.
/// iColour1 - Colour 1 of the vehicle.
/// iColour2 - Colour 2 of the vehicle.
/// RETURNS:
/// TRUE if vehicle was created, FALSE if otherwise.
FUNC BOOL HAS_MISSION_VEHICLE_BEEN_CREATED(VEH_STRUCT &vsVehicle, BOOL bPlayerVehicle = FALSE, BOOL bCarStealVehicle = FALSE, enumCharacterList eCharacter = CHAR_MICHAEL,
BOOL bMissionCritical = TRUE, INT iColourCombination = -1, INT iColour1 = -1, INT iColour2 = -1
#IF IS_DEBUG_BUILD, STRING sDebugName = NULL #ENDIF)
//create any vehicle that can be used on a mission by player
IF ( bPlayerVehicle = FALSE )
IF NOT DOES_ENTITY_EXIST(vsVehicle.VehicleIndex)
REQUEST_MODEL(vsVehicle.ModelName)
IF HAS_MODEL_LOADED(vsVehicle.ModelName)
IF( bCarStealVehicle = TRUE )
vsVehicle.VehicleIndex = CREATE_CAR_STEAL_STRAND_CAR(vsVehicle.ModelName, vsVehicle.vPosition, vsVehicle.fHeading)
SET_MODEL_AS_NO_LONGER_NEEDED(vsVehicle.ModelName)
ELSE
IF ( eCharacter = NO_CHARACTER )
vsVehicle.VehicleIndex = CREATE_VEHICLE(vsVehicle.ModelName, vsVehicle.vPosition, vsVehicle.fHeading)
SET_MODEL_AS_NO_LONGER_NEEDED(vsVehicle.ModelName)
ELSE //create npc vehicle based on the character enum specified
IF CREATE_NPC_VEHICLE(vsVehicle.VehicleIndex, eCharacter, vsVehicle.vPosition, vsVehicle.fHeading)
SET_MODEL_AS_NO_LONGER_NEEDED(vsVehicle.ModelName)
ENDIF
ENDIF
ENDIF
IF IS_VEHICLE_DRIVEABLE(vsVehicle.VehicleIndex)
//set vehicle colours, if they are provided
IF ( iColour1 != -1)
AND ( iColour2 != -1 )
SET_VEHICLE_COLOURS(vsVehicle.VehicleIndex, iColour1, iColour2)
ENDIF
//set vehicle colour combination, if it is provided
IF ( iColourCombination != -1 )
SET_VEHICLE_COLOUR_COMBINATION(vsVehicle.VehicleIndex, iColourCombination)
ENDIF
SET_VEHICLE_HAS_STRONG_AXLES(vsVehicle.VehicleIndex, bMissionCritical)
//limit damage that can be done to the vehicle
SET_VEHICLE_CAN_LEAK_OIL(vsVehicle.VehicleIndex, NOT bMissionCritical)
SET_VEHICLE_CAN_LEAK_PETROL(vsVehicle.VehicleIndex, NOT bMissionCritical)
//make the vehicle not attach to tow truck if mission critical
SET_VEHICLE_AUTOMATICALLY_ATTACHES(vsVehicle.VehicleIndex, NOT bMissionCritical)
IF IS_THIS_MODEL_A_CAR(vsVehicle.ModelName)
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(vsVehicle.VehicleIndex, SC_DOOR_FRONT_LEFT, NOT bMissionCritical)
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(vsVehicle.VehicleIndex, SC_DOOR_FRONT_RIGHT, NOT bMissionCritical)
ENDIF
SET_VEHICLE_ON_GROUND_PROPERLY(vsVehicle.VehicleIndex)
ENDIF
#IF IS_DEBUG_BUILD
IF NOT Is_String_Null_Or_Empty(sDebugName)
SET_VEHICLE_NAME_DEBUG(vsVehicle.VehicleIndex, sDebugName)
IF ( bCarStealVehicle = TRUE )
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created car steal strand vehicle ", sDebugName, " with model ", GET_MODEL_NAME_FOR_DEBUG(vsVehicle.ModelName), " at coordinates ", vsVehicle.vPosition, ".")
ELSE
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created vehicle ", sDebugName, " with model ", GET_MODEL_NAME_FOR_DEBUG(vsVehicle.ModelName), " at coordinates ", vsVehicle.vPosition, ".")
ENDIF
ELSE
IF ( bCarStealVehicle = TRUE )
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created car steal strand vehicle with model ", GET_MODEL_NAME_FOR_DEBUG(vsVehicle.ModelName), " at coordinates ", vsVehicle.vPosition, ".")
ELSE
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created vehicle with model ", GET_MODEL_NAME_FOR_DEBUG(vsVehicle.ModelName), " at coordinates ", vsVehicle.vPosition, ".")
ENDIF
ENDIF
#ENDIF
RETURN TRUE
ENDIF
ELSE //if the vehicle exists, return true
RETURN TRUE
ENDIF
//create player specific vehicle
ELIF ( bPlayerVehicle = TRUE )
IF NOT DOES_ENTITY_EXIST(vsVehicle.VehicleIndex)
//delete all previous instances of player ped vehicle in the world
DELETE_ALL_SCRIPT_CREATED_PLAYER_VEHICLES(eCharacter)
//call the player vehicle creation until it returns true
IF CREATE_PLAYER_VEHICLE(vsVehicle.VehicleIndex, eCharacter, vsVehicle.vPosition, vsVehicle.fHeading, TRUE)
SET_VEHICLE_HAS_STRONG_AXLES(vsVehicle.VehicleIndex, bMissionCritical)
//limit damage that can be done to the vehicle
SET_VEHICLE_CAN_LEAK_OIL(vsVehicle.VehicleIndex, NOT bMissionCritical)
SET_VEHICLE_CAN_LEAK_PETROL(vsVehicle.VehicleIndex, NOT bMissionCritical)
//make the vehicle not attach to tow truck if mission critical
SET_VEHICLE_AUTOMATICALLY_ATTACHES(vsVehicle.VehicleIndex, NOT bMissionCritical)
IF IS_THIS_MODEL_A_CAR(vsVehicle.ModelName)
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(vsVehicle.VehicleIndex, SC_DOOR_FRONT_LEFT, NOT bMissionCritical)
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(vsVehicle.VehicleIndex, SC_DOOR_FRONT_RIGHT, NOT bMissionCritical)
ENDIF
#IF IS_DEBUG_BUILD
IF NOT Is_String_Null_Or_Empty(sDebugName)
SET_VEHICLE_NAME_DEBUG(vsVehicle.VehicleIndex, sDebugName)
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created player vehicle ", sDebugName, " with model ", GET_MODEL_NAME_FOR_DEBUG(vsVehicle.ModelName), " at coordinates ", vsVehicle.vPosition, ".")
ELSE
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created player vehicle with model ", GET_MODEL_NAME_FOR_DEBUG(vsVehicle.ModelName), " at coordinates ", vsVehicle.vPosition, ".")
ENDIF
#ENDIF
RETURN TRUE
ENDIF
ELSE //if the vehicle exists, return true
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Creates an object and returns TRUE if such object was created successfully.
/// PARAMS:
/// osObject - OBJECT_STRUCT containing model, position and rotation of the object.
/// bFreezeObject - Specify if this object's position should be frozen.
/// RETURNS:
/// TRUE if object was created, FALSE if otherwise.
FUNC BOOL HAS_MISSION_OBJECT_BEEN_CREATED(OBJECT_STRUCT &osObject, BOOL bFreezeObject = FALSE)
IF NOT DOES_ENTITY_EXIST(osObject.ObjectIndex)
REQUEST_MODEL(osObject.ModelName)
IF HAS_MODEL_LOADED(osObject.ModelName)
osObject.ObjectIndex = CREATE_OBJECT(osObject.ModelName, osObject.vPosition)
SET_ENTITY_COORDS_NO_OFFSET(osObject.ObjectIndex, osObject.vPosition)
SET_ENTITY_ROTATION(osObject.ObjectIndex, osObject.vRotation)
SET_ENTITY_INVINCIBLE(osObject.ObjectIndex, TRUE)
FREEZE_ENTITY_POSITION(osObject.ObjectIndex, bFreezeObject)
SET_MODEL_AS_NO_LONGER_NEEDED(osObject.ModelName)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created object with model ", GET_MODEL_NAME_FOR_DEBUG(osObject.ModelName), " at coordinates ", osObject.vPosition, ".")
#ENDIF
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(osObject.ObjectIndex)
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
PROC BUILD_REQUEST_BANK_FOR_MISSION_STAGE(MISSION_STAGES eStage)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Building request bank for ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eStage), ".")
#ENDIF
SWITCH eStage
CASE MISSION_STAGE_PRE_INTRO
CASE MISSION_STAGE_CUTSCENE_INTRO_P1
CASE MISSION_STAGE_TIMELAPSE
CASE MISSION_STAGE_CUTSCENE_INTRO_P2
//request nothing here
BREAK
CASE MISSION_STAGE_DRIVE_TO_BEAN_MACHINE
IF NOT DOES_ENTITY_EXIST(psJimmy.PedIndex)
ADD_MODEL_REQUEST_TO_ARRAY(psJimmy.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
ENDIF
BREAK
CASE MISSION_STAGE_CUTSCENE_BEAN_MACHINE
IF NOT DOES_ENTITY_EXIST(psJimmy.PedIndex)
ADD_MODEL_REQUEST_TO_ARRAY(psJimmy.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
ENDIF
IF NOT DOES_ENTITY_EXIST(psAmanda.PedIndex)
ADD_MODEL_REQUEST_TO_ARRAY(psAmanda.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
ENDIF
IF NOT DOES_ENTITY_EXIST(psFabien.PedIndex)
ADD_MODEL_REQUEST_TO_ARRAY(psFabien.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
ENDIF
IF NOT DOES_ENTITY_EXIST(vsAmandasCar.VehicleIndex)
ADD_MODEL_REQUEST_TO_ARRAY(vsAmandasCar.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
ENDIF
BREAK
CASE MISSION_STAGE_DRIVE_TO_TRACEY
IF NOT DOES_ENTITY_EXIST(psJimmy.PedIndex)
ADD_MODEL_REQUEST_TO_ARRAY(psJimmy.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
ENDIF
BREAK
CASE MISSION_STAGE_CUTSCENE_SHOP_1
IF NOT DOES_ENTITY_EXIST(psJimmy.PedIndex)
ADD_MODEL_REQUEST_TO_ARRAY(psJimmy.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
ENDIF
IF NOT DOES_ENTITY_EXIST(psTracey.PedIndex)
ADD_MODEL_REQUEST_TO_ARRAY(psTracey.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
ENDIF
IF NOT DOES_ENTITY_EXIST(psLazlow.PedIndex)
ADD_MODEL_REQUEST_TO_ARRAY(psLazlow.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
ENDIF
BREAK
CASE MISSION_STAGE_DRIVE_TO_SHRINK
IF NOT DOES_ENTITY_EXIST(psJimmy.PedIndex)
ADD_MODEL_REQUEST_TO_ARRAY(psJimmy.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
ENDIF
IF NOT DOES_ENTITY_EXIST(psTracey.PedIndex)
ADD_MODEL_REQUEST_TO_ARRAY(psTracey.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
ENDIF
IF NOT DOES_ENTITY_EXIST(psLazlow.PedIndex)
ADD_MODEL_REQUEST_TO_ARRAY(psLazlow.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
ENDIF
IF NOT DOES_ENTITY_EXIST(psTatguy.PedIndex)
ADD_MODEL_REQUEST_TO_ARRAY(psTatguy.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
ENDIF
ADD_ANIMATION_REQUEST_TO_ARRAY("missfam6leadinoutfam_6_mcs_5", MissionAnimations, MAX_ANIMATIONS, iAnimationsRequested)
BREAK
CASE MISSION_STAGE_CUTSCENE_SHRINK
CASE MISSION_STAGE_DRIVE_HOME
CASE MISSION_STAGE_CUTSCENE_END
IF NOT DOES_ENTITY_EXIST(psJimmy.PedIndex)
ADD_MODEL_REQUEST_TO_ARRAY(psJimmy.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
ENDIF
IF NOT DOES_ENTITY_EXIST(psTracey.PedIndex)
ADD_MODEL_REQUEST_TO_ARRAY(psTracey.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
ENDIF
IF NOT DOES_ENTITY_EXIST(psAmanda.PedIndex)
ADD_MODEL_REQUEST_TO_ARRAY(psAmanda.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
ENDIF
BREAK
DEFAULT
BREAK
ENDSWITCH
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Finished building request bank for ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eStage), ".")
#ENDIF
ENDPROC
/// PURPOSE:
/// Checks for various mission fail conditions. Redirects mission flow to MISSION_STAGE_FAILED when one of fail conditions is true.
/// PARAMS:
/// eStage - Current mission stage.
/// eFail - Mission fail reason.
PROC RUN_FAIL_CHECKS(MISSION_STAGES &eStage, MISSION_FAILS &eFail)
IF eStage <> MISSION_STAGE_PASSED
AND eStage <> MISSION_STAGE_FAILED
IF NOT IS_CUTSCENE_PLAYING()
IF DOES_ENTITY_EXIST(psJimmy.PedIndex)
IF ( FailFlags[MISSION_FAIL_JIMMY_DEAD] = TRUE )
IF IS_PED_INJURED(psJimmy.PedIndex)
OR IS_ENTITY_DEAD(psJimmy.PedIndex)
eFail = MISSION_FAIL_JIMMY_DEAD
eStage = MISSION_STAGE_FAILED
ENDIF
ENDIF
IF ( FailFlags[MISSION_FAIL_JIMMY_LEFT_BEHIND] = TRUE )
OR ( FailFlags[MISSION_FAIL_FAMILY_LEFT_BEHIND] = TRUE )
IF NOT IS_PED_INJURED(psJimmy.PedIndex)
IF GET_DISTANCE_BETWEEN_PEDS(PLAYER_PED_ID(), psJimmy.PedIndex) > ABANDON_BUDDY_FAIL_RANGE
IF ( FailFlags[MISSION_FAIL_TRACEY_LEFT_BEHIND] = TRUE )
IF NOT IS_PED_INJURED(psTracey.PedIndex)
IF GET_DISTANCE_BETWEEN_PEDS(PLAYER_PED_ID(), psTracey.PedIndex) > ABANDON_BUDDY_FAIL_RANGE / 2
eFail = MISSION_FAIL_FAMILY_LEFT_BEHIND
eStage = MISSION_STAGE_FAILED
ENDIF
ENDIF
ENDIF
IF ( FailFlags[MISSION_FAIL_AMANDA_LEFT_BEHIND] = TRUE )
IF NOT IS_PED_INJURED(psAmanda.PedIndex)
IF GET_DISTANCE_BETWEEN_PEDS(PLAYER_PED_ID(), psAmanda.PedIndex) > ABANDON_BUDDY_FAIL_RANGE / 2
eFail = MISSION_FAIL_FAMILY_LEFT_BEHIND
eStage = MISSION_STAGE_FAILED
ENDIF
ENDIF
ENDIF
IF ( eFail = MISSION_FAIL_EMPTY )
eFail = MISSION_FAIL_JIMMY_LEFT_BEHIND
eStage = MISSION_STAGE_FAILED
ENDIF
ENDIF
IF ( eStage = MISSION_STAGE_DRIVE_TO_BEAN_MACHINE )
IF DOES_BLIP_EXIST(sLocatesData.BuddyBlipID[0]) OR NOT IS_PED_IN_GROUP(psJimmy.PedIndex)
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-641.87726, 247.57806, 80.30839>>, <<-607.46051, 244.61778, 87.00999>>, 22.0)
eFail = MISSION_FAIL_JIMMY_LEFT_BEHIND
eStage = MISSION_STAGE_FAILED
ENDIF
ENDIF
ENDIF
IF ( eStage = MISSION_STAGE_DRIVE_TO_SHRINK )
IF DOES_BLIP_EXIST(sLocatesData.BuddyBlipID[1]) OR NOT IS_PED_IN_GROUP(psJimmy.PedIndex)
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-1894.675781,-567.717773,10.614735>>, <<-1906.339966,-557.923096,13.812391>>, 16.0)
IF NOT IS_PED_INJURED(psTracey.PedIndex)
IF DOES_BLIP_EXIST(sLocatesData.BuddyBlipID[0]) OR NOT IS_PED_IN_GROUP(psTracey.PedIndex)
eFail = MISSION_FAIL_FAMILY_LEFT_BEHIND
eStage = MISSION_STAGE_FAILED
ENDIF
ENDIF
IF ( eFail = MISSION_FAIL_EMPTY )
eFail = MISSION_FAIL_JIMMY_LEFT_BEHIND
eStage = MISSION_STAGE_FAILED
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(psTracey.PedIndex)
IF ( FailFlags[MISSION_FAIL_TRACEY_DEAD] = TRUE )
IF IS_PED_INJURED(psTracey.PedIndex)
OR IS_ENTITY_DEAD(psTracey.PedIndex)
eFail = MISSION_FAIL_TRACEY_DEAD
eStage = MISSION_STAGE_FAILED
ENDIF
ENDIF
IF ( FailFlags[MISSION_FAIL_TRACEY_LEFT_BEHIND] = TRUE )
OR ( FailFlags[MISSION_FAIL_FAMILY_LEFT_BEHIND] = TRUE )
IF NOT IS_PED_INJURED(psTracey.PedIndex)
IF GET_DISTANCE_BETWEEN_PEDS(PLAYER_PED_ID(), psTracey.PedIndex) > ABANDON_BUDDY_FAIL_RANGE
IF ( FailFlags[MISSION_FAIL_JIMMY_LEFT_BEHIND] = TRUE )
IF NOT IS_PED_INJURED(psJimmy.PedIndex)
IF GET_DISTANCE_BETWEEN_PEDS(PLAYER_PED_ID(), psJimmy.PedIndex) > ABANDON_BUDDY_FAIL_RANGE / 2
eFail = MISSION_FAIL_FAMILY_LEFT_BEHIND
eStage = MISSION_STAGE_FAILED
ENDIF
ENDIF
ENDIF
IF ( FailFlags[MISSION_FAIL_AMANDA_LEFT_BEHIND] = TRUE )
IF NOT IS_PED_INJURED(psAmanda.PedIndex)
IF GET_DISTANCE_BETWEEN_PEDS(PLAYER_PED_ID(), psAmanda.PedIndex) > ABANDON_BUDDY_FAIL_RANGE / 2
eFail = MISSION_FAIL_FAMILY_LEFT_BEHIND
eStage = MISSION_STAGE_FAILED
ENDIF
ENDIF
ENDIF
IF ( eFail = MISSION_FAIL_EMPTY )
eFail = MISSION_FAIL_TRACEY_LEFT_BEHIND
eStage = MISSION_STAGE_FAILED
ENDIF
ENDIF
IF ( eStage = MISSION_STAGE_DRIVE_TO_SHRINK )
IF DOES_BLIP_EXIST(sLocatesData.BuddyBlipID[0]) OR NOT IS_PED_IN_GROUP(psTracey.PedIndex)
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-1894.675781,-567.717773,10.614735>>, <<-1906.339966,-557.923096,13.812391>>, 16.0)
IF NOT IS_PED_INJURED(psJimmy.PedIndex)
IF DOES_BLIP_EXIST(sLocatesData.BuddyBlipID[1]) OR NOT IS_PED_IN_GROUP(psJimmy.PedIndex)
eFail = MISSION_FAIL_FAMILY_LEFT_BEHIND
eStage = MISSION_STAGE_FAILED
ENDIF
ENDIF
IF ( eFail = MISSION_FAIL_EMPTY )
eFail = MISSION_FAIL_TRACEY_LEFT_BEHIND
eStage = MISSION_STAGE_FAILED
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(psAmanda.PedIndex)
IF ( FailFlags[MISSION_FAIL_AMANDA_DEAD] = TRUE )
IF IS_PED_INJURED(psAmanda.PedIndex)
OR IS_ENTITY_DEAD(psAmanda.PedIndex)
eFail = MISSION_FAIL_AMANDA_DEAD
eStage = MISSION_STAGE_FAILED
ENDIF
ENDIF
IF ( FailFlags[MISSION_FAIL_AMANDA_LEFT_BEHIND] = TRUE )
IF NOT IS_PED_INJURED(psAmanda.PedIndex)
IF GET_DISTANCE_BETWEEN_PEDS(PLAYER_PED_ID(), psAmanda.PedIndex) > ABANDON_BUDDY_FAIL_RANGE
IF ( FailFlags[MISSION_FAIL_JIMMY_LEFT_BEHIND] = TRUE )
IF NOT IS_PED_INJURED(psJimmy.PedIndex)
IF GET_DISTANCE_BETWEEN_PEDS(PLAYER_PED_ID(), psJimmy.PedIndex) > ABANDON_BUDDY_FAIL_RANGE / 2
eFail = MISSION_FAIL_FAMILY_LEFT_BEHIND
eStage = MISSION_STAGE_FAILED
ENDIF
ENDIF
ENDIF
IF ( FailFlags[MISSION_FAIL_TRACEY_LEFT_BEHIND] = TRUE )
IF NOT IS_PED_INJURED(psTracey.PedIndex)
IF GET_DISTANCE_BETWEEN_PEDS(PLAYER_PED_ID(), psTracey.PedIndex) > ABANDON_BUDDY_FAIL_RANGE / 2
eFail = MISSION_FAIL_FAMILY_LEFT_BEHIND
eStage = MISSION_STAGE_FAILED
ENDIF
ENDIF
ENDIF
IF ( eFail = MISSION_FAIL_EMPTY )
eFail = MISSION_FAIL_AMANDA_LEFT_BEHIND
eStage = MISSION_STAGE_FAILED
ENDIF
ENDIF
ENDIF
ENDIF
IF ( FailFlags[MISSION_FAIL_AMANDA_SCARED_OFF] = TRUE )
IF NOT IS_PED_INJURED(psAmanda.PedIndex)
IF HAS_PED_RECEIVED_EVENT(psAmanda.PedIndex, EVENT_EXPLOSION)
OR HAS_PED_RECEIVED_EVENT(psAmanda.PedIndex, EVENT_SHOCKING_EXPLOSION)
OR HAS_PED_RECEIVED_EVENT(psAmanda.PedIndex, EVENT_SHOT_FIRED)
OR HAS_PED_RECEIVED_EVENT(psAmanda.PedIndex, EVENT_SHOT_FIRED_WHIZZED_BY)
OR HAS_PED_RECEIVED_EVENT(psAmanda.PedIndex, EVENT_SHOT_FIRED_BULLET_IMPACT)
OR HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(psAmanda.PedIndex, PLAYER_PED_ID())
eFail = MISSION_FAIL_AMANDA_SCARED_OFF
eStage = MISSION_STAGE_FAILED
ENDIF
IF eStage = MISSION_STAGE_DRIVE_TO_BEAN_MACHINE
IF IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
IF IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-641.87726, 247.57806, 80.30839>>, <<-607.46051, 244.61778, 87.00999>>, 22.0)
eFail = MISSION_FAIL_AMANDA_SCARED_OFF
eStage = MISSION_STAGE_FAILED
ENDIF
ENDIF
ENDIF
ENDIF
IF eStage = MISSION_STAGE_DRIVE_TO_SHRINK
IF IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-1894.675781,-567.717773,10.614735>>, <<-1906.339966,-557.923096,13.812391>>, 16.0)
eFail = MISSION_FAIL_AMANDA_SCARED_OFF
eStage = MISSION_STAGE_FAILED
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF ( FailFlags[MISSION_FAIL_BEAN_MACHINE_SMASHED] = TRUE )
IF eStage = MISSION_STAGE_DRIVE_TO_BEAN_MACHINE
IF DOES_ENTITY_EXIST(GET_PLAYERS_LAST_VEHICLE()) AND NOT IS_ENTITY_DEAD(GET_PLAYERS_LAST_VEHICLE())
IF IS_ENTITY_IN_ANGLED_AREA(GET_PLAYERS_LAST_VEHICLE(), <<-615.175964,241.813858,80.011978>>, <<-638.159058,239.557037,85.011978>>, 8.0)
OR IS_ENTITY_IN_ANGLED_AREA(GET_PLAYERS_LAST_VEHICLE(), <<-615.159668,243.767014,80.011978>>, <<-638.516357,246.040314,84.995193>>, 4.0)
IF HAS_ENTITY_COLLIDED_WITH_ANYTHING(GET_PLAYERS_LAST_VEHICLE())
eFail = MISSION_FAIL_BEAN_MACHINE_SMASHED
eStage = MISSION_STAGE_FAILED
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(psFabien.PedIndex)
IF ( FailFlags[MISSION_FAIL_FABIEN_DEAD] = TRUE )
IF IS_PED_INJURED(psFabien.PedIndex)
OR IS_ENTITY_DEAD(psFabien.PedIndex)
eFail = MISSION_FAIL_FABIEN_DEAD
eStage = MISSION_STAGE_FAILED
ENDIF
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(psLazlow.PedIndex)
IF ( FailFlags[MISSION_FAIL_LAZLOW_DEAD] = TRUE )
IF IS_PED_INJURED(psLazlow.PedIndex)
OR IS_ENTITY_DEAD(psLazlow.PedIndex)
eFail = MISSION_FAIL_LAZLOW_DEAD
eStage = MISSION_STAGE_FAILED
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Sets mission as failed and provides mission flow with reason to print on screen.
/// PARAMS:
/// eFailReason - One of MISSION_FAILS values.
PROC SET_MISSION_FAILED_WITH_REASON(MISSION_FAILS &eFailReason)
SWITCH eFailReason
CASE MISSION_FAIL_JIMMY_DEAD
MISSION_FLOW_MISSION_FAILED_WITH_REASON("CMN_JDIED")
BREAK
CASE MISSION_FAIL_TRACEY_DEAD
MISSION_FLOW_MISSION_FAILED_WITH_REASON("CMN_TCDIED")
BREAK
CASE MISSION_FAIL_AMANDA_DEAD
MISSION_FLOW_MISSION_FAILED_WITH_REASON("CMN_ADIED")
BREAK
CASE MISSION_FAIL_FABIEN_DEAD
MISSION_FLOW_MISSION_FAILED_WITH_REASON("FAM6_FAILFD")
BREAK
CASE MISSION_FAIL_LAZLOW_DEAD
MISSION_FLOW_MISSION_FAILED_WITH_REASON("FAM6_FAILLAZ")
BREAK
CASE MISSION_FAIL_AMANDA_SCARED_OFF
MISSION_FLOW_MISSION_FAILED_WITH_REASON("FAM6_FAILBMA")
BREAK
CASE MISSION_FAIL_AMANDAS_CAR_DEAD
MISSION_FLOW_MISSION_FAILED_WITH_REASON("FAM6_FAILACD")
BREAK
CASE MISSION_FAIL_FAMILY_LEFT_BEHIND
MISSION_FLOW_MISSION_FAILED_WITH_REASON("FAM6_FFAMILY")
BREAK
CASE MISSION_FAIL_JIMMY_LEFT_BEHIND
MISSION_FLOW_MISSION_FAILED_WITH_REASON("CMN_JLEFT")
BREAK
CASE MISSION_FAIL_TRACEY_LEFT_BEHIND
MISSION_FLOW_MISSION_FAILED_WITH_REASON("CMN_TCLEFT")
BREAK
CASE MISSION_FAIL_AMANDA_LEFT_BEHIND
MISSION_FLOW_MISSION_FAILED_WITH_REASON("CMN_ALEFT")
BREAK
CASE MISSION_FAIL_BEAN_MACHINE_SMASHED
MISSION_FLOW_MISSION_FAILED_WITH_REASON("FAM6_FBMSMASH")
BREAK
CASE MISSION_FAIL_EMPTY
CASE MISSION_FAIL_FORCE_FAIL
MISSION_FLOW_MISSION_FAILED_WITH_REASON("FAM6_FAILDB")
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE:
/// Sets mission stage enum for replay.
/// PARAMS:
/// eStage - Mission stage enum variable.
/// iValue - Mid-mission replay value returned by the script when replaying the mission.
PROC SET_MISSION_STAGE_FOR_REPLAY(MISSION_STAGES &eStage, INT iValue)
IF iValue = ENUM_TO_INT(MID_MISSION_STAGE_DRIVE_TO_BEAN_MACHINE)
eStage = MISSION_STAGE_DRIVE_TO_BEAN_MACHINE
ELIF iValue = ENUM_TO_INT(MID_MISSION_STAGE_CUTSCENE_BEAN_MACHINE)
eStage = MISSION_STAGE_CUTSCENE_BEAN_MACHINE
ELIF iValue = ENUM_TO_INT(MID_MISSION_STAGE_DRIVE_TO_TRACEY)
eStage = MISSION_STAGE_DRIVE_TO_TRACEY
ELIF iValue = ENUM_TO_INT(MID_MISSION_STAGE_PIERCE_LAZLOW)
eStage = MISSION_STAGE_PIERCE_LAZLOW
ELIF iValue = ENUM_TO_INT(MID_MISSION_STAGE_DRIVE_TO_SHRINK)
eStage = MISSION_STAGE_DRIVE_TO_SHRINK
ELIF iValue = ENUM_TO_INT(MID_MISSION_STAGE_DRIVE_HOME)
eStage = MISSION_STAGE_DRIVE_HOME
ENDIF
bStageReplayInProgress = TRUE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Mission is being replayed at stage ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eStage), ".")
#ENDIF
ENDPROC
FUNC MISSION_STAGES GET_NEXT_MISSION_STAGE_FOR_SHITSKIP(MISSION_STAGES eStage)
INT iNextStage //get next mission stage in mission flow, if this is not a special case stage
MISSION_STAGES eNextStage
iNextStage = ENUM_TO_INT(eStage) + 1
eNextStage = INT_TO_ENUM(MISSION_STAGES, iNextStage)
RETURN eNextStage
ENDFUNC
PROC INITIALISE_ARRAYS_FOR_MISSION_STAGE(MISSION_STAGES eStage)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Initialising arrays for ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eStage), ".")
#ENDIF
osLeftDoorDummy.vPosition = <<-816.7160, 179.0980, 72.8274>>
osLeftDoorDummy.ModelName = V_ILEV_MM_DOORM_L
osRightDoorDummy.vPosition = <<-816.1068, 177.5108, 72.8274>>
osRightDoorDummy.ModelName = V_ILEV_MM_DOORM_R
SWITCH eStage
CASE MISSION_STAGE_PRE_INTRO
MissionPosition.vPosition = <<-822.7947, 176.4619, 70.2210>>
MissionPosition.fHeading = 292.6546
BREAK
CASE MISSION_STAGE_CUTSCENE_INTRO_P1
CASE MISSION_STAGE_TIMELAPSE
CASE MISSION_STAGE_CUTSCENE_INTRO_P2
CASE MISSION_STAGE_DRIVE_TO_BEAN_MACHINE
MissionPosition.vPosition = <<-807.5781, 176.1437, 71.8347>>
MissionPosition.fHeading = 17.2773
psJimmy.vPosition = <<-808.7352, 178.4024, 71.1531>>
psJimmy.fHeading = 44.4325
psJimmy.ModelName = GET_NPC_PED_MODEL(CHAR_JIMMY)
vsMichaelsCar.vPosition = << -824.3593, 179.5045, 70.4652 >>
vsMichaelsCar.fHeading = 137.1847
vsMichaelsCar.ModelName = GET_PLAYER_VEH_MODEL(CHAR_MICHAEL)
vsAmandasCar.vPosition = <<-622.3307, 253.6852, 80.5665>>
vsAmandasCar.fHeading = 263.3081
vsAmandasCar.ModelName = GET_NPC_VEH_MODEL(CHAR_AMANDA)
psAmanda.vPosition = <<-626.1675, 244.5767, 80.8952>>
psAmanda.fHeading = 265.6175
psAmanda.ModelName = GET_NPC_PED_MODEL(CHAR_AMANDA)
psFabien.vPosition = <<-623.6904, 244.6078, 80.8952>>
psFabien.fHeading = 85.7330
psFabien.ModelName = IG_FABIEN
psHipster.vPosition = <<-622.4567, 243.7266, 80.8952>>
psHipster.fHeading = 274.1241
psHipster.ModelName = CSB_SCREEN_WRITER
osLaptop.vPosition = <<-621.67029, 244.90756, 81.69887>>
osLaptop.vRotation = << 0.0, 0.0, 0.0 >>
osLaptop.ModelName = P_LAPTOP_02_S
osMug.vPosition = << -625.02, 245.39, 81.69 >>
osMug.vRotation = << 0.0, 0.0, 0.0 >>
osMug.ModelName = PROP_MUG_04
BREAK
CASE MISSION_STAGE_CUTSCENE_BEAN_MACHINE
MissionPosition.vPosition = <<-628.1871, 246.2558, 80.6955>>
MissionPosition.fHeading = 358.2773
psJimmy.vPosition = <<-629.4871, 248.0318, 80.5708>>
psJimmy.fHeading = 1.8819
psJimmy.ModelName = GET_NPC_PED_MODEL(CHAR_JIMMY)
vsMichaelsCar.vPosition = <<-630.5650, 255.2820, 80.5020>>
vsMichaelsCar.fHeading = 265.1243
vsMichaelsCar.ModelName = GET_PLAYER_VEH_MODEL(CHAR_MICHAEL)
vsAmandasCar.vPosition = <<-622.3307, 253.6852, 80.5665>>
vsAmandasCar.fHeading = 263.3081
vsAmandasCar.ModelName = GET_NPC_VEH_MODEL(CHAR_AMANDA)
psAmanda.vPosition = <<-626.1675, 244.5767, 80.8952>>
psAmanda.fHeading = 265.6175
psAmanda.ModelName = GET_NPC_PED_MODEL(CHAR_AMANDA)
psFabien.vPosition = <<-623.6904, 244.6078, 80.8952>>
psFabien.fHeading = 85.7330
psFabien.ModelName = IG_FABIEN
BREAK
CASE MISSION_STAGE_DRIVE_TO_TRACEY
MissionPosition.vPosition = <<-628.1871, 246.2558, 80.6955>>
MissionPosition.fHeading = 358.2910
psJimmy.vPosition = <<-629.4871, 248.0318, 80.5708>>
psJimmy.fHeading = 1.8819
psJimmy.ModelName = GET_NPC_PED_MODEL(CHAR_JIMMY)
vsMichaelsCar.vPosition = <<-630.5650, 255.2820, 80.5020>>
vsMichaelsCar.fHeading = 265.1243
vsMichaelsCar.ModelName = GET_PLAYER_VEH_MODEL(CHAR_MICHAEL)
psTracey.vPosition = <<321.6396, 181.2119, 102.5865>>
psTracey.fHeading = 196.2891
psTracey.ModelName = GET_NPC_PED_MODEL(CHAR_TRACEY)
psLazlow.vPosition = <<321.0728, 180.1358, 102.5865>>
psLazlow.fHeading = 349.9787
psLazlow.ModelName = CS_LAZLOW
BREAK
CASE MISSION_STAGE_CUTSCENE_SHOP_1
CASE MISSION_STAGE_PIERCE_LAZLOW
CASE MISSION_STAGE_CUTSCENE_SHOP_2
CASE MISSION_STAGE_TATTOO_LAZLOW
CASE MISSION_STAGE_CUTSCENE_SHOP_3
CASE MISSION_STAGE_CUT_LAZLOW_HAIR
CASE MISSION_STAGE_CUTSCENE_SHOP_4
MissionPosition.vPosition = <<323.8220, 179.8134, 102.5865>>
MissionPosition.fHeading = 62.0417
vsMichaelsCar.vPosition = <<300.6550, 173.2841, 102.9553>>
vsMichaelsCar.fHeading = 69.9177
vsMichaelsCar.ModelName = GET_PLAYER_VEH_MODEL(CHAR_MICHAEL)
psJimmy.vPosition = <<321.65167, 182.52638, 102.58653>>
psJimmy.fHeading = -115.96
psJimmy.ModelName = GET_NPC_PED_MODEL(CHAR_JIMMY)
psTracey.vPosition = <<321.58789, 181.57816, 102.58653>>
psTracey.fHeading = -100.54
psTracey.ModelName = GET_NPC_PED_MODEL(CHAR_TRACEY)
psLazlow.vPosition = <<321.8900, 182.1672, 102.5865>>
psLazlow.fHeading = 214.4331
psLazlow.ModelName = CS_LAZLOW
psTatguy.vPosition = <<322.07504, 182.24998, 102.58653>>
psTatguy.fHeading = -153.83
psTatguy.ModelName = U_M_Y_TATTOO_01
osShirt.vPosition = << 0.0, 0.0, 0.0 >>
osShirt.vRotation = << 0.0, 0.0, 0.0 >>
osShirt.ModelName = P_LAZLOW_SHIRT_S
osPonyTail.vPosition = << 322.68, 179.47, 102.59 >>
osPonyTail.vRotation = << 0.0, 0.0, 0.0 >>
osPonyTail.ModelName = P_CS_LAZ_PTAIL_S
osPiercingGun.vPosition = << 322.28, 183.48, 102.59 >>
osPiercingGun.vRotation = << 0.0, 0.0, 0.0 >>
osPiercingGun.ModelName = PROP_PIERCING_GUN
osTattooNeedle.vPosition = << 322.28, 183.48, 102.59 >>
osTattooNeedle.vRotation = << 0.0, 0.0, 0.0 >>
osTattooNeedle.ModelName = V_ILEV_TA_TATGUN
osScissors.vPosition = << 322.28, 183.48, 102.59 >>
osScissors.vRotation = << 0.0, 0.0, 0.0 >>
osScissors.ModelName = PROP_CS_SCISSORS
BREAK
CASE MISSION_STAGE_DRIVE_TO_SHRINK
MissionPosition.vPosition = <<315.4439, 175.3920, 102.8468>>//<<315.4439, 175.3920, 102.8468>>
MissionPosition.fHeading = 106.3951//92.4830
vsMichaelsCar.vPosition = <<300.6550, 173.2841, 102.9553>>
vsMichaelsCar.fHeading = 69.9177
vsMichaelsCar.ModelName = GET_PLAYER_VEH_MODEL(CHAR_MICHAEL)
psJimmy.vPosition = <<313.6881, 174.4399, 102.8722>>
psJimmy.fHeading = 101.0260
psJimmy.ModelName = GET_NPC_PED_MODEL(CHAR_JIMMY)
psTracey.vPosition = <<313.3786, 176.4375, 102.8908>>
psTracey.fHeading = 95.2572
psTracey.ModelName = GET_NPC_PED_MODEL(CHAR_TRACEY)
psLazlow.vPosition = <<321.8900, 182.1672, 102.5865>>
psLazlow.fHeading = 214.4331
psLazlow.ModelName = CS_LAZLOW
psTatguy.vPosition = <<322.07504, 182.24998, 102.58653>>
psTatguy.fHeading = -153.83
psTatguy.ModelName = U_M_Y_TATTOO_01
psAmanda.vPosition = <<-1906.76477, -559.85950, 10.79799>>
psAmanda.fHeading = -88.88
psAmanda.ModelName = GET_NPC_PED_MODEL(CHAR_AMANDA)
BREAK
CASE MISSION_STAGE_CUTSCENE_SHRINK
CASE MISSION_STAGE_DRIVE_HOME
MissionPosition.vPosition = <<-1902.8654, -558.0767, 10.7794>>
MissionPosition.fHeading = 225.8389
vsMichaelsCar.vPosition = <<-1898.9677, -561.0737, 10.7827>>
vsMichaelsCar.fHeading = 321.4044
vsMichaelsCar.ModelName = GET_PLAYER_VEH_MODEL(CHAR_MICHAEL)
psJimmy.vPosition = <<-1904.7207, -560.4189, 10.7980>>
psJimmy.fHeading = 238.9373
psJimmy.ModelName = GET_NPC_PED_MODEL(CHAR_JIMMY)
psTracey.vPosition = <<-1903.3005, -560.9316, 10.7980>>
psTracey.fHeading = 224.1973
psTracey.ModelName = GET_NPC_PED_MODEL(CHAR_TRACEY)
psAmanda.vPosition = <<-1899.4695, -557.8484, 10.7553>>
psAmanda.fHeading = 227.6959
psAmanda.ModelName = GET_NPC_PED_MODEL(CHAR_AMANDA)
BREAK
CASE MISSION_STAGE_CUTSCENE_END
MissionPosition.vPosition = <<-823.1286, 176.7446, 70.2141>>
MissionPosition.fHeading = 292.7178
vsMichaelsCar.vPosition = <<-825.6646, 180.1217, 70.4785>>
vsMichaelsCar.fHeading = 316.5125
vsMichaelsCar.ModelName = GET_PLAYER_VEH_MODEL(CHAR_MICHAEL)
psJimmy.vPosition = <<-822.4412, 175.9556, 70.3352>>
psJimmy.fHeading = 293.9573
psJimmy.ModelName = GET_NPC_PED_MODEL(CHAR_JIMMY)
psTracey.vPosition = <<-821.4911, 175.1127, 70.5573>>
psTracey.fHeading = 284.8115
psTracey.ModelName = GET_NPC_PED_MODEL(CHAR_TRACEY)
psAmanda.vPosition = <<-820.2170, 175.4369, 70.6240>>
psAmanda.fHeading = 284.8128
psAmanda.ModelName = GET_NPC_PED_MODEL(CHAR_AMANDA)
BREAK
ENDSWITCH
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Finished initialising arrays for ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eStage), ".")
#ENDIF
ENDPROC
FUNC BOOL IS_MISSION_STAGE_LOADED(MISSION_STAGES eStage, INT &iSetupProgress, BOOL &bStageLoaded, BOOL &bStageSkippedTo, BOOL &bStageReplayed)
//handle initial mission setup
IF ( iSetupProgress = 0 )
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Starting initial mission loading.")
#ENDIF
//clear the screen of any text displayed before mission started
CLEAR_PRINTS()
//load the mission text
REQUEST_ADDITIONAL_TEXT("FAM6", MISSION_TEXT_SLOT)
WHILE NOT HAS_ADDITIONAL_TEXT_LOADED(MISSION_TEXT_SLOT)
WAIT(0)
ENDWHILE
//suppress player's car model
SET_VEHICLE_MODEL_IS_SUPPRESSED(GET_NPC_VEH_MODEL(CHAR_AMANDA), TRUE)
SET_VEHICLE_MODEL_IS_SUPPRESSED(GET_PLAYER_VEH_MODEL(CHAR_MICHAEL), TRUE)
//DISABLE_TAXI_HAILING(TRUE)
IF IS_SCREEN_FADED_OUT()
DISABLE_VEHICLE_GEN_ON_MISSION(TRUE)
DELETE_VEHICLE_GEN_VEHICLE(VEHGEN_MICHAEL_SAVEHOUSE)
DELETE_ALL_SCRIPT_CREATED_PLAYER_VEHICLES(CHAR_MICHAEL)
ENDIF
LOCK_SHOP_DOORS(TATTOO_PARLOUR_01_HW, TRUE)
SET_SHOP_LOCATES_ARE_BLOCKED(TATTOO_PARLOUR_01_HW, TRUE)
SET_SHOP_DIALOGUE_IS_BLOCKED(TATTOO_PARLOUR_01_HW, TRUE)
SET_SHOP_IS_OPEN_FOR_BUSINESS(TATTOO_PARLOUR_01_HW, FALSE)
SET_SHOP_HAS_RUN_ENTRY_INTRO(TATTOO_PARLOUR_01_HW, TRUE)
SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(TATTOO_PARLOUR_01_HW, TRUE)
FORCE_SHOP_CLEANUP(TATTOO_PARLOUR_01_HW)
SET_INTERIOR_DISABLED(INTERIOR_V_PSYCHEOFFICE, FALSE)
//bean machine
SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(<< -614.28 - 10.0, 252.81 - 4.0, 81.66 - 2.0 >>, << -614.28 + 10.0, 252.81 + 4.0, 81.66 + 2.0 >>, FALSE)
REMOVE_VEHICLES_FROM_GENERATORS_IN_AREA(<< -614.28 - 10.0, 252.81 - 4.0, 81.66 - 2.0 >>, << -614.28 + 10.0, 252.81 + 4.0, 81.66 + 2.0 >>)
//tattoo parlor
SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(<< 295.26 - 8.0, 175.57 - 4.0, 104.06 - 2.0>>, << 295.26 + 8.0, 175.57 + 4.0, 104.06 + 2.0>>, FALSE)
REMOVE_VEHICLES_FROM_GENERATORS_IN_AREA(<< 295.26 - 8.0, 175.57 - 4.0, 104.06 - 2.0>>, << 295.26 + 8.0, 175.57 + 4.0, 104.06 + 2.0>>)
//shrink office
SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(<< -1894.98 - 4.0, -565.30 - 4.0, 12.68 - 2.0 >>, << -1894.98 + 4.0, -565.30 + 4.0, 12.68 + 2.0 >>, FALSE)
REMOVE_VEHICLES_FROM_GENERATORS_IN_AREA(<< -1894.98 - 4.0, -565.30 - 4.0, 12.68 - 2.0 >>, << -1894.98 + 4.0, -565.30 + 4.0, 12.68 + 2.0 >>)
BeanMachineScenarioBlockingIndex = CREATE_SCENARIO_BLOCKING_AREA(<< -627.05, 243.58, 82.89 >>, << 16.0, 12.0, 4.0 >>)
TattooParlorScenarioBlockingIndex = CREATE_SCENARIO_BLOCKING_AREA(<< 295.59, 174.36, 104.05 >>, << 6.0, 3.0, 2.0 >>)
iTattooSoundID = GET_SOUND_ID()
IF DOES_GROUP_EXIST(PLAYER_GROUP_ID())
SET_GROUP_FORMATION_SPACING(PLAYER_GROUP_ID(), 3.5)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Calling SET_GROUP_FORMATION_SPACING() for PLAYER_GROUP_ID().")
#ENDIF
ENDIF
IF IS_REPLAY_IN_PROGRESS()
SET_WEATHER_TYPE_NOW_PERSIST("EXTRASUNNY")
ENDIF
IF NOT IS_REPLAY_IN_PROGRESS()
g_replay.iReplayInt[0] = ENUM_TO_INT(TATTOOING_IDLE) //reset the global variable when not a retry, used for Lazlow's tattoo info
ELSE
//do nothing, read this global variable later when creating Lazlow's tattoo
ENDIF
CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_PED(PLAYER_ID())
CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_NON_ANIMAL_PED(PLAYER_ID())
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Finished initial mission loading.")
#ENDIF
iSetupProgress++
ENDIF
//run this each time new mission stage needs to be loaded
IF ( iSetupProgress = 1 )
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Started mission stage loading for ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eStage), ".")
#ENDIF
bStageLoaded = FALSE
//initialise arrays for peds, vehicles and objects
INITIALISE_ARRAYS_FOR_MISSION_STAGE(eStage)
//cleanup the asset arrays so that they are ready to be populated with assets needed for the stage being loaded
CLEANUP_MODEL_ARRAY(MissionModels, iModelsRequested)
CLEANUP_ANIMATION_ARRAY(MissionAnimations, iAnimationsRequested)
//clear triggered text labels
CLEAR_TRIGGERED_LABELS()
iSetupProgress++
ENDIF
//handle player positioning when current stage is being skipped to or played normally
//fade in the screen if it was faded out due to skipping
IF ( iSetupProgress = 2 )
//stage was skipped to or is being replayed
IF ( bStageSkippedTo = TRUE OR bStageReplayed = TRUE )
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Warping player ped to new position for mission stage being loaded due to skipping or replay.")
#ENDIF
WARP_PED(PLAYER_PED_ID(), MissionPosition.vPosition, MissionPosition.fHeading, FALSE, TRUE, FALSE)
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
CLEAR_PED_WETNESS(PLAYER_PED_ID())
SET_ENTITY_VISIBLE(PLAYER_PED_ID(), TRUE)
CLEAR_PED_DECORATIONS(PLAYER_PED_ID())
CLEAR_PED_BLOOD_DAMAGE(PLAYER_PED_ID())
RESET_PED_VISIBLE_DAMAGE(PLAYER_PED_ID())
RESTORE_PLAYER_PED_TATTOOS(PLAYER_PED_ID())
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
SET_PED_STEALTH_MOVEMENT(PLAYER_PED_ID(), FALSE)
SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), FALSE)
SET_FORCE_FOOTSTEP_UPDATE(PLAYER_PED_ID(), FALSE)
STOP_FIRE_IN_RANGE(GET_ENTITY_COORDS(PLAYER_PED_ID()), 1000.0)
REMOVE_DECALS_IN_RANGE(GET_ENTITY_COORDS(PLAYER_PED_ID()), 1000.0)
REMOVE_PARTICLE_FX_IN_RANGE(GET_ENTITY_COORDS(PLAYER_PED_ID()), 1000.0)
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED, TRUE)
SET_ENTITY_HEALTH(PLAYER_PED_ID(), GET_PED_MAX_HEALTH(PLAYER_PED_ID()))
ENDIF
IF IS_PLAYER_PLAYING(PLAYER_ID())
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
ENDIF
bVehicleReversed = FALSE
ENDIF
IF ( bStageReplayed = TRUE )
START_REPLAY_SETUP( MissionPosition.vPosition, MissionPosition.fHeading)
ENDIF
//request assets needed for current stage
BUILD_REQUEST_BANK_FOR_MISSION_STAGE(eStage)
iSetupProgress++
ENDIF
//handle loading of mission models that have been requested in the previous stage in BUILD_REQUEST_BANK_FOR_MISSION_STAGE()
//handle loading of mission animations that been requested in the previous stage in BUILD_REQUEST_BANK_FOR_MISSION_STAGE()
IF ( iSetupProgress = 3 )
IF ARE_REQUESTED_MODELS_LOADED(MissionModels, iModelsRequested)
IF ARE_REQUESTED_ANIMATIONS_LOADED(MissionAnimations, iAnimationsRequested)
iSetupProgress++
ENDIF
ENDIF
ENDIF
//handle creating vehicles/peds and setting up fail flags
//run this each time new mission stage needs to be loaded
//THIS SETUP SECTION ASSUMES THAT ALL REQUIRED ASSETS HAVE BEEN ALREADY LOADED TO MEMORY IN PREVIOUS SETUP SECTIONS
IF ( iSetupProgress = 4 )
SET_FAIL_FLAGS(FALSE)
SWITCH eStage
CASE MISSION_STAGE_PRE_INTRO
CASE MISSION_STAGE_CUTSCENE_INTRO_P1
CASE MISSION_STAGE_TIMELAPSE
CASE MISSION_STAGE_CUTSCENE_INTRO_P2
IF IS_REPEAT_PLAY_ACTIVE() //create mission vehicle on mission repeat play only
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsMichaelsCar, TRUE, FALSE, CHAR_MICHAEL)
OVERRIDE_REPLAY_CHECKPOINT_VEHICLE(vsMichaelsCar.VehicleIndex)
iSetupProgress++
ENDIF
ELSE //move on if not repeat play
iSetupProgress++
ENDIF
BREAK
CASE MISSION_STAGE_DRIVE_TO_BEAN_MACHINE
FailFlags[MISSION_FAIL_JIMMY_DEAD] = TRUE
FailFlags[MISSION_FAIL_JIMMY_LEFT_BEHIND] = TRUE
FailFlags[MISSION_FAIL_AMANDA_DEAD] = TRUE
FailFlags[MISSION_FAIL_FABIEN_DEAD] = TRUE
FailFlags[MISSION_FAIL_AMANDA_SCARED_OFF] = TRUE
FailFlags[MISSION_FAIL_BEAN_MACHINE_SMASHED]= TRUE
IF HAS_MISSION_PED_BEEN_CREATED(psJimmy, FALSE, RELGROUPHASH_PLAYER, FALSE, CHAR_JIMMY)
IF NOT DOES_ENTITY_EXIST(vsMichaelsCar.VehicleIndex)
IF IS_REPLAY_CHECKPOINT_VEHICLE_AVAILABLE() //and snapshot vehicle data exists
REQUEST_REPLAY_CHECKPOINT_VEHICLE_MODEL()
IF HAS_REPLAY_CHECKPOINT_VEHICLE_LOADED()
vsMichaelsCar.VehicleIndex = CREATE_REPLAY_CHECKPOINT_VEHICLE(vsMichaelsCar.vPosition, vsMichaelsCar.fHeading)
SET_VEHICLE_DOORS_SHUT(vsMichaelsCar.VehicleIndex, TRUE)
SET_VEHICLE_ON_GROUND_PROPERLY(vsMichaelsCar.VehicleIndex)
SET_MODEL_AS_NO_LONGER_NEEDED(GET_REPLAY_CHECKPOINT_VEHICLE_MODEL())
#IF IS_DEBUG_BUILD
SET_VEHICLE_NAME_DEBUG(vsMichaelsCar.VehicleIndex, "RC_Michaels_Car")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Creating replay checkpoint vehicle with model ", GET_MODEL_NAME_FOR_DEBUG(GET_REPLAY_CHECKPOINT_VEHICLE_MODEL()), ".")
#ENDIF
ENDIF
ELSE
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsMichaelsCar, TRUE, FALSE, CHAR_MICHAEL)
iSetupProgress++
ENDIF
ENDIF
ELSE
iSetupProgress++
ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_CUTSCENE_BEAN_MACHINE
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsAmandasCar, FALSE, FALSE, CHAR_AMANDA)
AND HAS_MISSION_PED_BEEN_CREATED(psJimmy, FALSE, RELGROUPHASH_PLAYER, FALSE, CHAR_JIMMY)
AND HAS_MISSION_PED_BEEN_CREATED(psAmanda, FALSE, RELGROUPHASH_PLAYER, FALSE, CHAR_AMANDA)
AND HAS_MISSION_PED_BEEN_CREATED(psFabien, FALSE, RELGROUPHASH_PLAYER, FALSE, NO_CHARACTER)
IF IS_VEHICLE_DRIVEABLE(vsAmandasCar.VehicleIndex)
LOWER_CONVERTIBLE_ROOF(vsAmandasCar.VehicleIndex, TRUE)
ENDIF
IF NOT DOES_ENTITY_EXIST(vsMichaelsCar.VehicleIndex)
IF IS_REPLAY_CHECKPOINT_VEHICLE_AVAILABLE() //and snapshot vehicle data exists
REQUEST_REPLAY_CHECKPOINT_VEHICLE_MODEL()
IF HAS_REPLAY_CHECKPOINT_VEHICLE_LOADED()
vsMichaelsCar.VehicleIndex = CREATE_REPLAY_CHECKPOINT_VEHICLE(vsMichaelsCar.vPosition, vsMichaelsCar.fHeading)
SET_VEHICLE_DOORS_SHUT(vsMichaelsCar.VehicleIndex, TRUE)
SET_VEHICLE_ON_GROUND_PROPERLY(vsMichaelsCar.VehicleIndex)
SET_MODEL_AS_NO_LONGER_NEEDED(GET_REPLAY_CHECKPOINT_VEHICLE_MODEL())
#IF IS_DEBUG_BUILD
SET_VEHICLE_NAME_DEBUG(vsMichaelsCar.VehicleIndex, "RC_Michaels_Car")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Creating replay checkpoint vehicle with model ", GET_MODEL_NAME_FOR_DEBUG(GET_REPLAY_CHECKPOINT_VEHICLE_MODEL()), ".")
#ENDIF
ENDIF
ELSE
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsMichaelsCar, TRUE, FALSE, CHAR_MICHAEL)
iSetupProgress++
ENDIF
ENDIF
ELSE
iSetupProgress++
ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_DRIVE_TO_TRACEY
FailFlags[MISSION_FAIL_JIMMY_DEAD] = TRUE
FailFlags[MISSION_FAIL_JIMMY_LEFT_BEHIND] = TRUE
FailFlags[MISSION_FAIL_AMANDA_DEAD] = TRUE
FailFlags[MISSION_FAIL_FABIEN_DEAD] = TRUE
FailFlags[MISSION_FAIL_TRACEY_DEAD] = TRUE
FailFlags[MISSION_FAIL_LAZLOW_DEAD] = TRUE
IF HAS_MISSION_PED_BEEN_CREATED(psJimmy, FALSE, RELGROUPHASH_PLAYER, FALSE, CHAR_JIMMY)
IF NOT DOES_ENTITY_EXIST(vsMichaelsCar.VehicleIndex)
IF IS_REPLAY_CHECKPOINT_VEHICLE_AVAILABLE() //and snapshot vehicle data exists
REQUEST_REPLAY_CHECKPOINT_VEHICLE_MODEL()
IF HAS_REPLAY_CHECKPOINT_VEHICLE_LOADED()
vsMichaelsCar.VehicleIndex = CREATE_REPLAY_CHECKPOINT_VEHICLE(vsMichaelsCar.vPosition, vsMichaelsCar.fHeading)
SET_VEHICLE_DOORS_SHUT(vsMichaelsCar.VehicleIndex, TRUE)
SET_VEHICLE_ON_GROUND_PROPERLY(vsMichaelsCar.VehicleIndex)
SET_MODEL_AS_NO_LONGER_NEEDED(GET_REPLAY_CHECKPOINT_VEHICLE_MODEL())
#IF IS_DEBUG_BUILD
SET_VEHICLE_NAME_DEBUG(vsMichaelsCar.VehicleIndex, "RC_Michaels_Car")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Creating replay checkpoint vehicle with model ", GET_MODEL_NAME_FOR_DEBUG(GET_REPLAY_CHECKPOINT_VEHICLE_MODEL()), ".")
#ENDIF
ENDIF
ELSE
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsMichaelsCar, TRUE, FALSE, CHAR_MICHAEL)
iSetupProgress++
ENDIF
ENDIF
ELSE
iSetupProgress++
ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_CUTSCENE_SHOP_1
CASE MISSION_STAGE_PIERCE_LAZLOW
CASE MISSION_STAGE_CUTSCENE_SHOP_2
CASE MISSION_STAGE_TATTOO_LAZLOW
CASE MISSION_STAGE_CUTSCENE_SHOP_3
CASE MISSION_STAGE_CUT_LAZLOW_HAIR
CASE MISSION_STAGE_CUTSCENE_SHOP_4
FailFlags[MISSION_FAIL_JIMMY_DEAD] = TRUE
FailFlags[MISSION_FAIL_TRACEY_DEAD] = TRUE
FailFlags[MISSION_FAIL_LAZLOW_DEAD] = TRUE
IF HAS_MISSION_PED_BEEN_CREATED(psJimmy, FALSE, RELGROUPHASH_PLAYER, FALSE, CHAR_JIMMY)
AND HAS_MISSION_PED_BEEN_CREATED(psTracey, FALSE, RELGROUPHASH_PLAYER, FALSE, CHAR_TRACEY)
AND HAS_MISSION_PED_BEEN_CREATED(psLazlow, FALSE, RELGROUPHASH_PLAYER, FALSE, NO_CHARACTER)
IF NOT DOES_ENTITY_EXIST(vsMichaelsCar.VehicleIndex)
IF IS_REPLAY_CHECKPOINT_VEHICLE_AVAILABLE() //and snapshot vehicle data exists
REQUEST_REPLAY_CHECKPOINT_VEHICLE_MODEL()
IF HAS_REPLAY_CHECKPOINT_VEHICLE_LOADED()
vsMichaelsCar.VehicleIndex = CREATE_REPLAY_CHECKPOINT_VEHICLE(vsMichaelsCar.vPosition, vsMichaelsCar.fHeading)
SET_VEHICLE_DOORS_SHUT(vsMichaelsCar.VehicleIndex, TRUE)
SET_VEHICLE_ON_GROUND_PROPERLY(vsMichaelsCar.VehicleIndex)
SET_MODEL_AS_NO_LONGER_NEEDED(GET_REPLAY_CHECKPOINT_VEHICLE_MODEL())
#IF IS_DEBUG_BUILD
SET_VEHICLE_NAME_DEBUG(vsMichaelsCar.VehicleIndex, "RC_Michaels_Car")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Creating replay checkpoint vehicle with model ", GET_MODEL_NAME_FOR_DEBUG(GET_REPLAY_CHECKPOINT_VEHICLE_MODEL()), ".")
#ENDIF
ENDIF
ELSE
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsMichaelsCar, TRUE, FALSE, CHAR_MICHAEL)
iSetupProgress++
ENDIF
ENDIF
ELSE
iSetupProgress++
ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_DRIVE_TO_SHRINK
FailFlags[MISSION_FAIL_JIMMY_DEAD] = TRUE
FailFlags[MISSION_FAIL_JIMMY_LEFT_BEHIND] = TRUE
FailFlags[MISSION_FAIL_TRACEY_DEAD] = TRUE
FailFlags[MISSION_FAIL_TRACEY_LEFT_BEHIND] = TRUE
FailFlags[MISSION_FAIL_FAMILY_LEFT_BEHIND] = TRUE
FailFlags[MISSION_FAIL_LAZLOW_DEAD] = TRUE
FailFlags[MISSION_FAIL_AMANDA_DEAD] = TRUE
FailFlags[MISSION_FAIL_AMANDA_SCARED_OFF] = TRUE
IF HAS_MISSION_PED_BEEN_CREATED(psJimmy, FALSE, RELGROUPHASH_PLAYER, FALSE, CHAR_JIMMY)
AND HAS_MISSION_PED_BEEN_CREATED(psTracey, FALSE, RELGROUPHASH_PLAYER, FALSE, CHAR_TRACEY)
AND HAS_MISSION_PED_BEEN_CREATED(psLazlow, FALSE, RELGROUPHASH_PLAYER, FALSE, NO_CHARACTER)
AND HAS_MISSION_PED_BEEN_CREATED(psTatguy, FALSE, RELGROUPHASH_PLAYER, FALSE, NO_CHARACTER)
IF NOT DOES_ENTITY_EXIST(vsMichaelsCar.VehicleIndex)
IF IS_REPLAY_CHECKPOINT_VEHICLE_AVAILABLE() //and snapshot vehicle data exists
REQUEST_REPLAY_CHECKPOINT_VEHICLE_MODEL()
IF HAS_REPLAY_CHECKPOINT_VEHICLE_LOADED()
vsMichaelsCar.VehicleIndex = CREATE_REPLAY_CHECKPOINT_VEHICLE(vsMichaelsCar.vPosition, vsMichaelsCar.fHeading)
SET_VEHICLE_DOORS_SHUT(vsMichaelsCar.VehicleIndex, TRUE)
SET_VEHICLE_ON_GROUND_PROPERLY(vsMichaelsCar.VehicleIndex)
SET_MODEL_AS_NO_LONGER_NEEDED(GET_REPLAY_CHECKPOINT_VEHICLE_MODEL())
#IF IS_DEBUG_BUILD
SET_VEHICLE_NAME_DEBUG(vsMichaelsCar.VehicleIndex, "RC_Michaels_Car")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Creating replay checkpoint vehicle with model ", GET_MODEL_NAME_FOR_DEBUG(GET_REPLAY_CHECKPOINT_VEHICLE_MODEL()), ".")
#ENDIF
ENDIF
ELSE
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsMichaelsCar, TRUE, FALSE, CHAR_MICHAEL)
iSetupProgress++
ENDIF
ENDIF
ELSE
iSetupProgress++
ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_CUTSCENE_SHRINK
IF HAS_MISSION_PED_BEEN_CREATED(psJimmy, FALSE, RELGROUPHASH_PLAYER, FALSE, CHAR_JIMMY)
AND HAS_MISSION_PED_BEEN_CREATED(psTracey, FALSE, RELGROUPHASH_PLAYER, FALSE, CHAR_TRACEY)
AND HAS_MISSION_PED_BEEN_CREATED(psAmanda, FALSE, RELGROUPHASH_PLAYER, FALSE, CHAR_AMANDA)
IF NOT DOES_ENTITY_EXIST(vsMichaelsCar.VehicleIndex)
IF IS_REPLAY_CHECKPOINT_VEHICLE_AVAILABLE() //and snapshot vehicle data exists
REQUEST_REPLAY_CHECKPOINT_VEHICLE_MODEL()
IF HAS_REPLAY_CHECKPOINT_VEHICLE_LOADED()
vsMichaelsCar.VehicleIndex = CREATE_REPLAY_CHECKPOINT_VEHICLE(vsMichaelsCar.vPosition, vsMichaelsCar.fHeading)
SET_VEHICLE_DOORS_SHUT(vsMichaelsCar.VehicleIndex, TRUE)
SET_VEHICLE_ON_GROUND_PROPERLY(vsMichaelsCar.VehicleIndex)
SET_MODEL_AS_NO_LONGER_NEEDED(GET_REPLAY_CHECKPOINT_VEHICLE_MODEL())
#IF IS_DEBUG_BUILD
SET_VEHICLE_NAME_DEBUG(vsMichaelsCar.VehicleIndex, "RC_Michaels_Car")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Creating replay checkpoint vehicle with model ", GET_MODEL_NAME_FOR_DEBUG(GET_REPLAY_CHECKPOINT_VEHICLE_MODEL()), ".")
#ENDIF
ENDIF
ELSE
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsMichaelsCar, TRUE, FALSE, CHAR_MICHAEL)
iSetupProgress++
ENDIF
ENDIF
ELSE
iSetupProgress++
ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_DRIVE_HOME
FailFlags[MISSION_FAIL_JIMMY_DEAD] = TRUE
FailFlags[MISSION_FAIL_JIMMY_LEFT_BEHIND] = TRUE
FailFlags[MISSION_FAIL_TRACEY_DEAD] = TRUE
FailFlags[MISSION_FAIL_TRACEY_LEFT_BEHIND] = TRUE
FailFlags[MISSION_FAIL_AMANDA_DEAD] = TRUE
FailFlags[MISSION_FAIL_AMANDA_LEFT_BEHIND] = TRUE
FailFlags[MISSION_FAIL_FAMILY_LEFT_BEHIND] = TRUE
IF HAS_MISSION_PED_BEEN_CREATED(psJimmy, FALSE, RELGROUPHASH_PLAYER, FALSE, CHAR_JIMMY)
AND HAS_MISSION_PED_BEEN_CREATED(psTracey, FALSE, RELGROUPHASH_PLAYER, FALSE, CHAR_TRACEY)
AND HAS_MISSION_PED_BEEN_CREATED(psAmanda, FALSE, RELGROUPHASH_PLAYER, FALSE, CHAR_AMANDA)
IF NOT DOES_ENTITY_EXIST(vsMichaelsCar.VehicleIndex)
IF IS_REPLAY_CHECKPOINT_VEHICLE_AVAILABLE() //and snapshot vehicle data exists
REQUEST_REPLAY_CHECKPOINT_VEHICLE_MODEL()
IF HAS_REPLAY_CHECKPOINT_VEHICLE_LOADED()
vsMichaelsCar.VehicleIndex = CREATE_REPLAY_CHECKPOINT_VEHICLE(vsMichaelsCar.vPosition, vsMichaelsCar.fHeading)
SET_VEHICLE_DOORS_SHUT(vsMichaelsCar.VehicleIndex, TRUE)
SET_VEHICLE_ON_GROUND_PROPERLY(vsMichaelsCar.VehicleIndex)
SET_MODEL_AS_NO_LONGER_NEEDED(GET_REPLAY_CHECKPOINT_VEHICLE_MODEL())
#IF IS_DEBUG_BUILD
SET_VEHICLE_NAME_DEBUG(vsMichaelsCar.VehicleIndex, "RC_Michaels_Car")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Creating replay checkpoint vehicle with model ", GET_MODEL_NAME_FOR_DEBUG(GET_REPLAY_CHECKPOINT_VEHICLE_MODEL()), ".")
#ENDIF
ENDIF
ELSE
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsMichaelsCar, TRUE, FALSE, CHAR_MICHAEL)
iSetupProgress++
ENDIF
ENDIF
ELSE
iSetupProgress++
ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_CUTSCENE_END
IF HAS_MISSION_PED_BEEN_CREATED(psJimmy, FALSE, RELGROUPHASH_PLAYER, FALSE, CHAR_JIMMY)
AND HAS_MISSION_PED_BEEN_CREATED(psTracey, FALSE, RELGROUPHASH_PLAYER, FALSE, CHAR_TRACEY)
AND HAS_MISSION_PED_BEEN_CREATED(psAmanda, FALSE, RELGROUPHASH_PLAYER, FALSE, CHAR_AMANDA)
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsMichaelsCar, TRUE, FALSE, CHAR_MICHAEL)
iSetupProgress++
ENDIF
ENDIF
BREAK
DEFAULT
iSetupProgress++
BREAK
ENDSWITCH
SET_JIMMY_PED_COMPONENT_VARIATIONS(psJimmy.bComponentVariationsSet)
SET_TRACEY_PED_COMPONENT_VARIATIONS(psTracey.bComponentVariationsSet)
SET_AMANDA_PED_COMPONENT_VARIATIONS(psAmanda.bComponentVariationsSet)
SET_FABIEN_PED_COMPONENT_VARIATIONS(psFabien.bComponentVariationsSet)
SET_TATGUY_PED_COMPONENT_VARIATIONS(psTatguy.bComponentVariationsSet)
SWITCH eMissionStage
CASE MISSION_STAGE_CUTSCENE_SHOP_1
CASE MISSION_STAGE_PIERCE_LAZLOW
SET_LAZLOW_PED_COMPONENT_VARIATIONS(psLazlow.bComponentVariationsSet, FALSE, FALSE, FALSE, FALSE, FALSE)
BREAK
CASE MISSION_STAGE_CUTSCENE_SHOP_2
CASE MISSION_STAGE_TATTOO_LAZLOW
SET_LAZLOW_PED_COMPONENT_VARIATIONS(psLazlow.bComponentVariationsSet, TRUE, TRUE, FALSE, FALSE, FALSE)
BREAK
CASE MISSION_STAGE_CUTSCENE_SHOP_3
CASE MISSION_STAGE_CUT_LAZLOW_HAIR
SET_LAZLOW_PED_COMPONENT_VARIATIONS(psLazlow.bComponentVariationsSet, TRUE, TRUE, FALSE, TRUE, bChestTattoo)
BREAK
CASE MISSION_STAGE_CUTSCENE_SHOP_4
BREAK
CASE MISSION_STAGE_DRIVE_TO_SHRINK
//fix for B*1918478, read Lazlow's tattoo info from a global int when retrying this stage
IF ( bStageReplayed = TRUE )
IF ( g_replay.iReplayInt[0] = ENUM_TO_INT(TATTOOING_CHEST) )
bChestTattoo = TRUE
ELIF ( g_replay.iReplayInt[0] = ENUM_TO_INT(TATTOOING_BACK) )
bChestTattoo = FALSE
ENDIF
ENDIF
SET_LAZLOW_PED_COMPONENT_VARIATIONS(psLazlow.bComponentVariationsSet, TRUE, TRUE, TRUE, TRUE, bChestTattoo)
BREAK
ENDSWITCH
ENDIF
IF ( iSetupProgress = 5 )
DISABLE_CELLPHONE(FALSE)
REMOVE_PED_FOR_DIALOGUE(FAM6Conversation, 0) //Michael
REMOVE_PED_FOR_DIALOGUE(FAM6Conversation, 1) //Jimmy
REMOVE_PED_FOR_DIALOGUE(FAM6Conversation, 2) //Tracey/Lazlow
REMOVE_PED_FOR_DIALOGUE(FAM6Conversation, 4) //Amanda
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
ADD_PED_FOR_DIALOGUE(FAM6Conversation, 0, PLAYER_PED_ID(), "MICHAEL")
ENDIF
SWITCH eStage
CASE MISSION_STAGE_DRIVE_TO_BEAN_MACHINE
CASE MISSION_STAGE_DRIVE_TO_TRACEY
CASE MISSION_STAGE_DRIVE_TO_SHRINK
CASE MISSION_STAGE_DRIVE_HOME
IF NOT IS_PED_INJURED(psJimmy.PedIndex)
ADD_PED_FOR_DIALOGUE(FAM6Conversation, 1, psJimmy.PedIndex, "JIMMY")
ENDIF
IF NOT IS_PED_INJURED(psTracey.PedIndex)
ADD_PED_FOR_DIALOGUE(FAM6Conversation, 2, psTracey.PedIndex, "TRACEY")
ENDIF
IF NOT IS_PED_INJURED(psAmanda.PedIndex)
ADD_PED_FOR_DIALOGUE(FAM6Conversation, 4, psAmanda.PedIndex, "AMANDA")
ENDIF
//add peds here
BREAK
CASE MISSION_STAGE_PIERCE_LAZLOW
CASE MISSION_STAGE_TATTOO_LAZLOW
CASE MISSION_STAGE_CUT_LAZLOW_HAIR
DISABLE_CELLPHONE(TRUE)
IF NOT IS_PED_INJURED(psLazlow.PedIndex)
ADD_PED_FOR_DIALOGUE(FAM6Conversation, 2, psLazlow.PedIndex, "LAZLOW")
ENDIF
BREAK
DEFAULT
BREAK
ENDSWITCH
SWITCH eStage
CASE MISSION_STAGE_PRE_INTRO
CASE MISSION_STAGE_CUTSCENE_INTRO_P1
CASE MISSION_STAGE_TIMELAPSE
CASE MISSION_STAGE_CUTSCENE_INTRO_P2
CASE MISSION_STAGE_CUTSCENE_BEAN_MACHINE
CASE MISSION_STAGE_CUTSCENE_SHOP_1
CASE MISSION_STAGE_PIERCE_LAZLOW
CASE MISSION_STAGE_CUTSCENE_SHOP_2
CASE MISSION_STAGE_TATTOO_LAZLOW
CASE MISSION_STAGE_CUTSCENE_SHOP_3
CASE MISSION_STAGE_CUT_LAZLOW_HAIR
CASE MISSION_STAGE_CUTSCENE_SHOP_4
CASE MISSION_STAGE_CUTSCENE_SHRINK
CASE MISSION_STAGE_CUTSCENE_END
DISPLAY_HUD(FALSE)
DISPLAY_RADAR(FALSE)
BREAK
DEFAULT
DISPLAY_HUD(TRUE)
DISPLAY_RADAR(TRUE)
BREAK
ENDSWITCH
SWITCH eStage
CASE MISSION_STAGE_CUTSCENE_SHOP_1
CASE MISSION_STAGE_PIERCE_LAZLOW
CASE MISSION_STAGE_CUTSCENE_SHOP_2
CASE MISSION_STAGE_TATTOO_LAZLOW
CASE MISSION_STAGE_CUTSCENE_SHOP_3
CASE MISSION_STAGE_CUT_LAZLOW_HAIR
CASE MISSION_STAGE_CUTSCENE_SHOP_4
SET_MAX_WANTED_LEVEL(0)
SET_CREATE_RANDOM_COPS(FALSE)
SET_WANTED_LEVEL_MULTIPLIER(0.0)
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
BREAK
DEFAULT
SET_MAX_WANTED_LEVEL(5)
SET_CREATE_RANDOM_COPS(TRUE)
SET_WANTED_LEVEL_MULTIPLIER(1.0)
BREAK
ENDSWITCH
DISABLE_TAXI_HAILING(FALSE) //enable taxi hailing for every stage by default
SWITCH eStage
CASE MISSION_STAGE_DRIVE_HOME
DISABLE_TAXI_HAILING(TRUE) //disable taxi hailing for drive home stage, see B*1715392
BREAK
ENDSWITCH
iSetupProgress++
ENDIF
IF ( iSetupProgress = 6 )
//stage was skipped to or is being replayed
IF ( bStageSkippedTo = TRUE OR bStageReplayed = TRUE )
IF ( bStageReplayed = TRUE )
END_REPLAY_SETUP(NULL, DEFAULT, FALSE)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Calling END_REPLAY_SETUP().")
#ENDIF
ELSE
NEW_LOAD_SCENE_START_SPHERE(GET_ENTITY_COORDS(PLAYER_PED_ID()), 20.0)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Calling NEW_LOAD_SCENE_START_SPHERE() at coordinates ", MissionPosition.vPosition, " for mission replay or stage skip. This might take a while to load.")
#ENDIF
INT iLoadSceneTimer = GET_GAME_TIMER() + 15000
WHILE IS_NEW_LOAD_SCENE_ACTIVE()
AND NOT IS_NEW_LOAD_SCENE_LOADED()
AND GET_GAME_TIMER() < iLoadSceneTimer
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Load scene timer: ", iLoadSceneTimer - GET_GAME_TIMER(), ".")
#ENDIF
WAIT(0)
ENDWHILE
NEW_LOAD_SCENE_STOP()
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Calling NEW_LOAD_SCENE_STOP().")
#ENDIF
ENDIF
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
//handle fade in for each mission stage
//some stages start with or require a fade out
SWITCH eStage
CASE MISSION_STAGE_PRE_INTRO
CASE MISSION_STAGE_CUTSCENE_INTRO_P1
CASE MISSION_STAGE_CUTSCENE_INTRO_P2
CASE MISSION_STAGE_DRIVE_TO_BEAN_MACHINE
CASE MISSION_STAGE_CUTSCENE_BEAN_MACHINE
CASE MISSION_STAGE_DRIVE_TO_TRACEY
CASE MISSION_STAGE_CUTSCENE_SHOP_1
CASE MISSION_STAGE_PIERCE_LAZLOW
CASE MISSION_STAGE_CUTSCENE_SHOP_2
CASE MISSION_STAGE_TATTOO_LAZLOW
CASE MISSION_STAGE_CUTSCENE_SHOP_3
CASE MISSION_STAGE_CUT_LAZLOW_HAIR
CASE MISSION_STAGE_CUTSCENE_SHOP_4
CASE MISSION_STAGE_DRIVE_TO_SHRINK
CASE MISSION_STAGE_CUTSCENE_SHRINK
CASE MISSION_STAGE_CUTSCENE_END
CASE MISSION_STAGE_DRIVE_HOME
//do not fade in, mission stage will handle a fade in from fade out
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Halting loading screen fade in for skip to a mission stage that will fade the screen in.")
#ENDIF
BREAK
DEFAULT
//fade in
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Calling a loading screen fade in.")
#ENDIF
IF IS_SCREEN_FADED_OUT()
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
ENDIF
BREAK
ENDSWITCH
ENDIF
iSetupProgress++
ENDIF
IF ( iSetupProgress = 7 )
SWITCH eStage
CASE MISSION_STAGE_DRIVE_TO_BEAN_MACHINE
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(ENUM_TO_INT(MID_MISSION_STAGE_DRIVE_TO_BEAN_MACHINE), "STAGE 0: DRIVE TO BEAN", FALSE)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting replay mid-mission checkpoint to ", ENUM_TO_INT(MID_MISSION_STAGE_DRIVE_TO_BEAN_MACHINE), " for stage ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eStage), ".")
#ENDIF
BREAK
CASE MISSION_STAGE_CUTSCENE_BEAN_MACHINE
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(ENUM_TO_INT(MID_MISSION_STAGE_CUTSCENE_BEAN_MACHINE), "STAGE 1: BEAN CUTSCENE", FALSE)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting replay mid-mission checkpoint to ", ENUM_TO_INT(MID_MISSION_STAGE_CUTSCENE_BEAN_MACHINE), " for stage ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eStage), ".")
#ENDIF
BREAK
CASE MISSION_STAGE_DRIVE_TO_TRACEY
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(ENUM_TO_INT(MID_MISSION_STAGE_DRIVE_TO_TRACEY), "STAGE 2: DRIVE TO TRACEY", FALSE)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting replay mid-mission checkpoint to ", ENUM_TO_INT(MID_MISSION_STAGE_DRIVE_TO_TRACEY), " for stage ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eStage), ".")
#ENDIF
BREAK
CASE MISSION_STAGE_PIERCE_LAZLOW
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(ENUM_TO_INT(MID_MISSION_STAGE_PIERCE_LAZLOW), "STAGE 3: DADDY ISSUES", FALSE)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting replay mid-mission checkpoint to ", ENUM_TO_INT(MID_MISSION_STAGE_PIERCE_LAZLOW), " for stage ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eStage), ".")
#ENDIF
BREAK
CASE MISSION_STAGE_DRIVE_TO_SHRINK
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(ENUM_TO_INT(MID_MISSION_STAGE_DRIVE_TO_SHRINK), "STAGE 4: DRIVE TO SHRINK", FALSE)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting replay mid-mission checkpoint to ", ENUM_TO_INT(MID_MISSION_STAGE_DRIVE_TO_SHRINK), " for stage ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eStage), ".")
#ENDIF
BREAK
CASE MISSION_STAGE_DRIVE_HOME
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(ENUM_TO_INT(MID_MISSION_STAGE_DRIVE_HOME), "STAGE 5: SHRINK CUTSCENE", TRUE)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting replay mid-mission checkpoint to ", ENUM_TO_INT(MID_MISSION_STAGE_DRIVE_HOME), " for stage ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eStage), ".")
#ENDIF
BREAK
ENDSWITCH
iSetupProgress++
ENDIF
IF ( iSetupProgress = 8 )
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Finished mission stage loading for ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eStage), ".")
#ENDIF
bStageLoaded = TRUE
bStageReplayed = FALSE
bStageSkippedTo = FALSE
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
iSetupProgress++
ENDIF
IF ( iSetupProgress = 9 )
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
PROC MISSION_CLEANUP()
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Starting mission cleanup.")
DELETE_DEBUG_WIDGETS()
#ENDIF
IF ( bReplayStartEventTriggered = TRUE )
REPLAY_STOP_EVENT()
ENDIF
CLEANUP_PED(psJimmy, IS_SCREEN_FADED_OUT(), FALSE)
CLEANUP_PED(psTracey, IS_SCREEN_FADED_OUT(), FALSE)
CLEANUP_PED(psAmanda, IS_SCREEN_FADED_OUT(), FALSE)
CLEANUP_PED(psFabien, IS_SCREEN_FADED_OUT(), FALSE)
CLEANUP_PED(psLazlow, IS_SCREEN_FADED_OUT(), FALSE)
CLEANUP_PED(psHipster, IS_SCREEN_FADED_OUT(), FALSE)
CLEANUP_PED(psTatguy, IS_SCREEN_FADED_OUT(), FALSE)
IF DOES_ENTITY_EXIST(osLeftDoorDummy.ObjectIndex)
REMOVE_MODEL_HIDE(osLeftDoorDummy.vPosition, 1.0, osLeftDoorDummy.ModelName)
ENDIF
IF DOES_ENTITY_EXIST(osRightDoorDummy.ObjectIndex)
REMOVE_MODEL_HIDE(osRightDoorDummy.vPosition, 1.0, osRightDoorDummy.ModelName)
ENDIF
CLEANUP_MISSION_OBJECT(osMug, IS_SCREEN_FADED_OUT())
CLEANUP_MISSION_OBJECT(osShirt, IS_SCREEN_FADED_OUT())
CLEANUP_MISSION_OBJECT(osLaptop, IS_SCREEN_FADED_OUT())
CLEANUP_MISSION_OBJECT(osScissors, IS_SCREEN_FADED_OUT())
CLEANUP_MISSION_OBJECT(osPonyTail, IS_SCREEN_FADED_OUT())
CLEANUP_MISSION_OBJECT(osPiercingGun, IS_SCREEN_FADED_OUT())
CLEANUP_MISSION_OBJECT(osTattooNeedle, IS_SCREEN_FADED_OUT())
CLEANUP_MISSION_OBJECT(osLeftDoorDummy, IS_SCREEN_FADED_OUT())
CLEANUP_MISSION_OBJECT(osRightDoorDummy, IS_SCREEN_FADED_OUT())
IF DOES_PARTICLE_FX_LOOPED_EXIST(ptfxHair)
STOP_PARTICLE_FX_LOOPED(ptfxHair)
ENDIF
IF NOT HAS_SOUND_FINISHED(iTattooSoundID)
STOP_SOUND(iTattooSoundID)
ENDIF
STOP_AUDIO_SCENES()
REMOVE_PTFX_ASSET()
RELEASE_SCRIPT_AUDIO_BANK()
SET_SCALEFORM_MOVIE_AS_NO_LONGER_NEEDED(mov)
IF IS_PC_VERSION()
SET_SCALEFORM_MOVIE_AS_NO_LONGER_NEEDED(mov_kb)
ENDIF
KillAllConversations()
SET_VEHICLE_MODEL_IS_SUPPRESSED(GET_NPC_VEH_MODEL(CHAR_AMANDA), FALSE)
SET_VEHICLE_MODEL_IS_SUPPRESSED(GET_PLAYER_VEH_MODEL(CHAR_MICHAEL), FALSE)
IF DOES_CAM_EXIST(AnimatedCamera)
DESTROY_CAM(AnimatedCamera)
ENDIF
IF DOES_CAM_EXIST(ScriptedCamera)
DESTROY_CAM(ScriptedCamera)
ENDIF
DESTROY_ALL_CAMS()
RENDER_SCRIPT_CAMS(FALSE, FALSE)
DISPLAY_HUD(TRUE)
DISPLAY_RADAR(TRUE)
DISABLE_CELLPHONE(FALSE)
DISABLE_TAXI_HAILING(FALSE)
DISABLE_VEHICLE_GEN_ON_MISSION(FALSE)
LOCK_SHOP_DOORS(TATTOO_PARLOUR_01_HW, FALSE)
SET_SHOP_LOCATES_ARE_BLOCKED(TATTOO_PARLOUR_01_HW, FALSE)
SET_SHOP_DIALOGUE_IS_BLOCKED(TATTOO_PARLOUR_01_HW, FALSE)
SET_SHOP_IS_OPEN_FOR_BUSINESS(TATTOO_PARLOUR_01_HW, TRUE)
SET_SHOP_HAS_RUN_ENTRY_INTRO(TATTOO_PARLOUR_01_HW, FALSE)
SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(TATTOO_PARLOUR_01_HW, FALSE)
FORCE_SHOP_CLEANUP(TATTOO_PARLOUR_01_HW)
SET_INTERIOR_DISABLED(INTERIOR_V_PSYCHEOFFICE, TRUE)
SET_MAX_WANTED_LEVEL(5)
SET_CREATE_RANDOM_COPS(TRUE)
SET_WANTED_LEVEL_MULTIPLIER(1.0)
CLEAR_WEATHER_TYPE_PERSIST()
SET_ALL_VEHICLE_GENERATORS_ACTIVE()
REMOVE_ROAD_NODE_SPEED_ZONE(iSpeedZone)
REMOVE_SCENARIO_BLOCKING_AREA(BeanMachineScenarioBlockingIndex)
REMOVE_SCENARIO_BLOCKING_AREA(TattooParlorScenarioBlockingIndex)
CLEANUP_PC_CONTROLS()
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Finished mission cleanup.")
#ENDIF
ENDPROC
//|=============================== MISSION STAGES FUNCTIONS ==============================|
FUNC BOOL IS_MISSION_STAGE_PRE_INTRO_COMPLETED(INT &iStageProgress)
SWITCH iStageProgress
CASE 0
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
IF GET_IS_TASK_ACTIVE(PLAYER_PED_ID(), CODE_TASK_EXIT_VEHICLE)
OR GET_SCRIPT_TASK_STATUS(PLAYER_PED_ID(), SCRIPT_TASK_LEAVE_VEHICLE) = PERFORMING_TASK
OR GET_SCRIPT_TASK_STATUS(PLAYER_PED_ID(), SCRIPT_TASK_LEAVE_ANY_VEHICLE) = PERFORMING_TASK
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
iStageProgress++
ENDIF
ELSE
iStageProgress++
ENDIF
ENDIF
BREAK
CASE 1
REQUEST_ANIM_DICT("missfam2mcs_intp1")
REQUEST_MODEL(osLeftDoorDummy.ModelName)
REQUEST_MODEL(osRightDoorDummy.ModelName)
IF HAS_ANIM_DICT_LOADED("missfam2mcs_intp1")
AND HAS_MODEL_LOADED(osLeftDoorDummy.ModelName)
AND HAS_MODEL_LOADED(osRightDoorDummy.ModelName)
iStageProgress++
ENDIF
BREAK
CASE 2
IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iHouseEnterSceneID)
STOP_FIRE_IN_RANGE(<< -817.305, 179.330, 71.241 >>, 20.0)
REMOVE_DECALS_IN_RANGE(<< -817.305, 179.330, 71.241 >>, 20.0)
CLEAR_AREA_OF_PROJECTILES(<< -817.305, 179.330, 71.241 >>, 20.0)
REMOVE_PARTICLE_FX_IN_RANGE(<< -817.305, 179.330, 71.241 >>, 20.0)
iHouseEnterSceneID = CREATE_SYNCHRONIZED_SCENE(<< -817.305, 179.330, 71.225 >>, << 0.0, 0.0, -113.0 >>)
SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(iHouseEnterSceneID, TRUE)
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED)
HIDE_PED_WEAPON_FOR_SCRIPTED_CUTSCENE(PLAYER_PED_ID(), TRUE)
SET_FORCE_FOOTSTEP_UPDATE(PLAYER_PED_ID(), TRUE)
TASK_SYNCHRONIZED_SCENE(PLAYER_PED_ID(), iHouseEnterSceneID, "missfam2mcs_intp1", "fam_2_int_p1_michael",
INSTANT_BLEND_IN, INSTANT_BLEND_OUT)
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID())
IF IS_DOOR_REGISTERED_WITH_SYSTEM(ENUM_TO_INT(DOORHASH_M_MANSION_F_L))
DOOR_SYSTEM_SET_OPEN_RATIO(ENUM_TO_INT(DOORHASH_M_MANSION_F_L), 1.0, FALSE, FALSE)
DOOR_SYSTEM_SET_DOOR_STATE(ENUM_TO_INT(DOORHASH_M_MANSION_F_L), DOORSTATE_LOCKED, FALSE, TRUE)
ENDIF
IF IS_DOOR_REGISTERED_WITH_SYSTEM(ENUM_TO_INT(DOORHASH_M_MANSION_F_R))
DOOR_SYSTEM_SET_OPEN_RATIO(ENUM_TO_INT(DOORHASH_M_MANSION_F_R), -1.0, FALSE, FALSE)
DOOR_SYSTEM_SET_DOOR_STATE(ENUM_TO_INT(DOORHASH_M_MANSION_F_R), DOORSTATE_LOCKED, FALSE, TRUE)
ENDIF
CREATE_MODEL_HIDE(osLeftDoorDummy.vPosition, 1.0, osLeftDoorDummy.ModelName, FALSE)
CREATE_MODEL_HIDE(osRightDoorDummy.vPosition, 1.0, osRightDoorDummy.ModelName, FALSE)
osLeftDoorDummy.ObjectIndex = CREATE_OBJECT(osLeftDoorDummy.ModelName, <<-816.72, 179.10, 72.83>>)
osRightDoorDummy.ObjectIndex = CREATE_OBJECT(osRightDoorDummy.ModelName, <<-816.11, 177.51, 72.83>>)
PLAY_SYNCHRONIZED_ENTITY_ANIM(osLeftDoorDummy.ObjectIndex, iHouseEnterSceneID, "fam_2_int_p1_doorl", "missfam2mcs_intp1", INSTANT_BLEND_IN, INSTANT_BLEND_OUT)
PLAY_SYNCHRONIZED_ENTITY_ANIM(osRightDoorDummy.ObjectIndex, iHouseEnterSceneID, "fam_2_int_p1_doorr", "missfam2mcs_intp1", INSTANT_BLEND_IN, INSTANT_BLEND_OUT)
FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(osLeftDoorDummy.ObjectIndex)
FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(osRightDoorDummy.ObjectIndex)
DESTROY_ALL_CAMS()
ScriptedCamera = CREATE_CAMERA(CAMTYPE_ANIMATED, TRUE)
PLAY_SYNCHRONIZED_CAM_ANIM(ScriptedCamera, iHouseEnterSceneID, "fam5_intro_cam", "missfam2mcs_intp1")
CLEAR_HELP(TRUE)
DISPLAY_HUD(FALSE)
DISPLAY_RADAR(FALSE)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
SET_MODEL_AS_NO_LONGER_NEEDED(osLeftDoorDummy.ModelName)
SET_MODEL_AS_NO_LONGER_NEEDED(osRightDoorDummy.ModelName)
IF IS_SCREEN_FADED_OUT()
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
ENDIF
iStageProgress++
ENDIF
BREAK
CASE 3
IF DOES_CAM_EXIST(ScriptedCamera)
IF IS_REPLAY_START_VEHICLE_AVAILABLE()
IF DOES_ENTITY_EXIST(GET_PLAYERS_LAST_VEHICLE())
AND IS_VEHICLE_DRIVEABLE(GET_PLAYERS_LAST_VEHICLE(), TRUE) AND NOT IS_ENTITY_ON_FIRE(GET_PLAYERS_LAST_VEHICLE())
IF NOT IS_ENTITY_A_MISSION_ENTITY(GET_PLAYERS_LAST_VEHICLE())
SET_ENTITY_AS_MISSION_ENTITY(GET_PLAYERS_LAST_VEHICLE())
ENDIF
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting last player vehicle with model ", GET_MODEL_NAME_FOR_DEBUG(GET_ENTITY_MODEL(GET_PLAYERS_LAST_VEHICLE())), " as mission entity.")
#ENDIF
DELETE_VEHICLE_GEN_VEHICLE(VEHGEN_MISSION_VEH)
SET_VEHICLE_DOORS_SHUT(GET_PLAYERS_LAST_VEHICLE())
SET_VEHICLE_ENGINE_ON(GET_PLAYERS_LAST_VEHICLE(), FALSE, TRUE)
SET_ENTITY_COORDS(GET_PLAYERS_LAST_VEHICLE(), << -825.8718, 157.3143, 69.4619 >>)
SET_ENTITY_HEADING(GET_PLAYERS_LAST_VEHICLE(), 90.0)
SET_VEHICLE_ON_GROUND_PROPERLY(GET_PLAYERS_LAST_VEHICLE())
ENDIF
ENDIF
CLEAR_AREA(<< -817.305, 179.330, 71.241 >>, 500.0, TRUE)
CLEAR_AREA_OF_PEDS(<< -817.305, 179.330, 71.241 >>, 500.0)
CLEAR_AREA_OF_COPS(<< -817.305, 179.330, 71.241 >>, 500.0)
CLEAR_AREA_OF_VEHICLES(<< -817.305, 179.330, 71.241 >>, 500.0)
iStageProgress++
ENDIF
BREAK
CASE 4
REQUEST_CUTSCENE("fam_6_int")
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", PLAYER_PED_ID(), PLAYER_ZERO)
bCutsceneAssetsRequested = TRUE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting cutscene ped components for intro cutscene peds during stage ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eMissionStage), ".")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting bCutsceneAssetsRequested to ", bCutsceneAssetsRequested, ".")
#ENDIF
ENDIF
IF DOES_CAM_EXIST(ScriptedCamera)
IF ( bHouseEntryCutsceneSkipped = FALSE )
IF IS_SYNCHRONIZED_SCENE_RUNNING(iHouseEnterSceneID)
IF GET_SYNCHRONIZED_SCENE_PHASE(iHouseEnterSceneID) >= 0.99
IF ( bCutsceneAssetsRequested = TRUE )
iStageProgress++
ENDIF
ENDIF
IF IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED_WITH_DELAY()
DO_SCREEN_FADE_OUT(DEFAULT_FADE_TIME)
bHouseEntryCutsceneSkipped = TRUE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Pre intro cutscene skipped by the player.")
#ENDIF
ENDIF
ENDIF
ELSE
IF IS_SCREEN_FADED_OUT()
IF ( bCutsceneAssetsRequested = TRUE )
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
SET_FORCE_FOOTSTEP_UPDATE(PLAYER_PED_ID(), FALSE)
ENDIF
STOP_SYNCHRONIZED_ENTITY_ANIM(osLeftDoorDummy.ObjectIndex, 0, FALSE)
STOP_SYNCHRONIZED_ENTITY_ANIM(osRightDoorDummy.ObjectIndex, 0, FALSE)
IF DOES_ENTITY_EXIST(osLeftDoorDummy.ObjectIndex)
DELETE_OBJECT(osLeftDoorDummy.ObjectIndex)
REMOVE_MODEL_HIDE(osLeftDoorDummy.vPosition, 1.0, osLeftDoorDummy.ModelName)
ENDIF
IF DOES_ENTITY_EXIST(osRightDoorDummy.ObjectIndex)
DELETE_OBJECT(osRightDoorDummy.ObjectIndex)
REMOVE_MODEL_HIDE(osRightDoorDummy.vPosition, 1.0, osRightDoorDummy.ModelName)
ENDIF
IF IS_DOOR_REGISTERED_WITH_SYSTEM(ENUM_TO_INT(DOORHASH_M_MANSION_F_L))
DOOR_SYSTEM_SET_OPEN_RATIO(ENUM_TO_INT(DOORHASH_M_MANSION_F_L), 0.0, FALSE, FALSE)
DOOR_SYSTEM_SET_DOOR_STATE(ENUM_TO_INT(DOORHASH_M_MANSION_F_L), DOORSTATE_FORCE_UNLOCKED_THIS_FRAME, FALSE, TRUE)
ENDIF
IF IS_DOOR_REGISTERED_WITH_SYSTEM(ENUM_TO_INT(DOORHASH_M_MANSION_F_R))
DOOR_SYSTEM_SET_OPEN_RATIO(ENUM_TO_INT(DOORHASH_M_MANSION_F_R), 0.0, FALSE, FALSE)
DOOR_SYSTEM_SET_DOOR_STATE(ENUM_TO_INT(DOORHASH_M_MANSION_F_R), DOORSTATE_FORCE_UNLOCKED_THIS_FRAME, FALSE, TRUE)
ENDIF
REMOVE_ANIM_DICT("missfam2mcs_intp1")
RENDER_SCRIPT_CAMS(FALSE, FALSE)
DESTROY_CAM(ScriptedCamera)
DESTROY_ALL_CAMS()
iStageProgress++
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE 5
IF ( bHouseEntryCutsceneSkipped = FALSE )
IF DOES_CAM_EXIST(ScriptedCamera)
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
SET_FORCE_FOOTSTEP_UPDATE(PLAYER_PED_ID(), FALSE)
ENDIF
RETURN TRUE
ENDIF
ELSE
RETURN TRUE
ENDIF
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
FUNC BOOL IS_MISSION_STAGE_CUTSCENE_INTRO_P1_COMPLETED(INT &iStageProgress)
SWITCH iStageProgress
CASE 0
IF HAS_REQUESTED_CUTSCENE_LOADED("fam_6_int")
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
START_CUTSCENE()
//REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
iStageProgress++
ELSE
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", PLAYER_PED_ID(), PLAYER_ZERO)
ENDIF
ENDIF
BREAK
CASE 1 //fade screen in if screen was faded out due to shit skip or debug skip
IF IS_CUTSCENE_PLAYING()
IF DOES_CAM_EXIST(ScriptedCamera)
DESTROY_CAM(ScriptedCamera)
ENDIF
DESTROY_ALL_CAMS()
IF IS_VEHICLE_GEN_AVAILABLE(VEHGEN_MICHAEL_SAVEHOUSE)
AND DOES_ENTITY_EXIST(GET_VEHICLE_GEN_VEHICLE_INDEX(VEHGEN_MICHAEL_SAVEHOUSE))
AND IS_VEHICLE_DRIVEABLE(GET_VEHICLE_GEN_VEHICLE_INDEX(VEHGEN_MICHAEL_SAVEHOUSE), TRUE)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Vehicle gen vehicle VEHGEN_MICHAEL_SAVEHOUSE is available for mission use.")
#ENDIF
IF NOT DOES_ENTITY_BELONG_TO_THIS_SCRIPT(GET_VEHICLE_GEN_VEHICLE_INDEX(VEHGEN_MICHAEL_SAVEHOUSE))
SET_ENTITY_AS_MISSION_ENTITY(GET_VEHICLE_GEN_VEHICLE_INDEX(VEHGEN_MICHAEL_SAVEHOUSE), TRUE, TRUE)
vsMichaelsCar.VehicleIndex = GET_VEHICLE_GEN_VEHICLE_INDEX(VEHGEN_MICHAEL_SAVEHOUSE)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting vehicle gen vehicle VEHGEN_MICHAEL_SAVEHOUSE as mission entity.")
#ENDIF
ENDIF
IF DOES_ENTITY_EXIST(vsMichaelsCar.VehicleIndex)
STOP_FIRE_IN_RANGE(GET_ENTITY_COORDS(vsMichaelsCar.VehicleIndex), 2.5)
SET_ENTITY_HEALTH(vsMichaelsCar.VehicleIndex, GET_ENTITY_HEALTH(vsMichaelsCar.VehicleIndex) + 500)
SET_VEHICLE_ENGINE_HEALTH(vsMichaelsCar.VehicleIndex, GET_VEHICLE_ENGINE_HEALTH(vsMichaelsCar.VehicleIndex) + 500)
SET_VEHICLE_PETROL_TANK_HEALTH(vsMichaelsCar.VehicleIndex, GET_VEHICLE_PETROL_TANK_HEALTH(vsMichaelsCar.VehicleIndex) + 500)
SET_VEHICLE_AS_MISSION_CRITICAL(vsMichaelsCar, TRUE)
SET_VEHICLE_ENGINE_ON(vsMichaelsCar.VehicleIndex, FALSE, TRUE)
SET_ENTITY_COORDS(vsMichaelsCar.VehicleIndex, vsMichaelsCar.vPosition)
SET_ENTITY_HEADING(vsMichaelsCar.VehicleIndex, vsMichaelsCar.fHeading)
SET_VEHICLE_ON_GROUND_PROPERLY(vsMichaelsCar.VehicleIndex)
ENDIF
ENDIF
IF IS_REPLAY_START_VEHICLE_AVAILABLE()
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Replay start vehicle with model ", GET_MODEL_NAME_FOR_DEBUG(GET_REPLAY_START_VEHICLE_MODEL()), " is available.")
#ENDIF
IF DOES_ENTITY_EXIST(GET_PLAYERS_LAST_VEHICLE())
AND IS_VEHICLE_DRIVEABLE(GET_PLAYERS_LAST_VEHICLE(), TRUE) AND NOT IS_ENTITY_ON_FIRE(GET_PLAYERS_LAST_VEHICLE())
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Last player vehicle is model ", GET_MODEL_NAME_FOR_DEBUG(GET_ENTITY_MODEL(GET_PLAYERS_LAST_VEHICLE())), " which is allowed for mission.")
#ENDIF
IF NOT DOES_ENTITY_EXIST(vsMichaelsCar.VehicleIndex)
IF NOT IS_ENTITY_A_MISSION_ENTITY(GET_PLAYERS_LAST_VEHICLE())
SET_ENTITY_AS_MISSION_ENTITY(GET_PLAYERS_LAST_VEHICLE())
ENDIF
vsMichaelsCar.VehicleIndex = GET_PLAYERS_LAST_VEHICLE()
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting last player vehicle with model ", GET_MODEL_NAME_FOR_DEBUG(GET_ENTITY_MODEL(GET_PLAYERS_LAST_VEHICLE())), " as mission entity.")
#ENDIF
SET_VEHICLE_AS_MISSION_CRITICAL(vsMichaelsCar, TRUE)
SET_ENTITY_HEALTH(vsMichaelsCar.VehicleIndex, GET_ENTITY_HEALTH(vsMichaelsCar.VehicleIndex) + 500)
SET_VEHICLE_ENGINE_HEALTH(vsMichaelsCar.VehicleIndex, GET_VEHICLE_ENGINE_HEALTH(vsMichaelsCar.VehicleIndex) + 500)
SET_VEHICLE_PETROL_TANK_HEALTH(vsMichaelsCar.VehicleIndex, GET_VEHICLE_PETROL_TANK_HEALTH(vsMichaelsCar.VehicleIndex) + 500)
STOP_FIRE_IN_RANGE(GET_ENTITY_COORDS(vsMichaelsCar.VehicleIndex), 2.5)
SET_VEHICLE_DOORS_SHUT(vsMichaelsCar.VehicleIndex, TRUE)
SET_VEHICLE_ENGINE_ON(vsMichaelsCar.VehicleIndex, FALSE, TRUE)
SET_ENTITY_COORDS(vsMichaelsCar.VehicleIndex, vsMichaelsCar.vPosition)
SET_ENTITY_HEADING(vsMichaelsCar.VehicleIndex, vsMichaelsCar.fHeading)
SET_VEHICLE_ON_GROUND_PROPERLY(vsMichaelsCar.VehicleIndex)
ELSE
DELETE_VEHICLE_GEN_VEHICLE(VEHGEN_MISSION_VEH)
SET_VEHICLE_DOORS_SHUT(GET_PLAYERS_LAST_VEHICLE(), TRUE)
SET_VEHICLE_ENGINE_ON(GET_PLAYERS_LAST_VEHICLE(), FALSE, TRUE)
SET_MISSION_VEHICLE_GEN_VEHICLE(GET_PLAYERS_LAST_VEHICLE(), << -825.8718, 157.3143, 69.4619 >>, 90.0)
CLEAR_MUST_LEAVE_AREA_VEHICLE_GEN_FLAG(VEHGEN_MISSION_VEH)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting last player vehicle with model ", GET_MODEL_NAME_FOR_DEBUG(GET_ENTITY_MODEL(GET_PLAYERS_LAST_VEHICLE())), " as mission vehicle gen vehicle.")
#ENDIF
ENDIF
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(vsMichaelsCar.VehicleIndex)
OVERRIDE_REPLAY_CHECKPOINT_VEHICLE(vsMichaelsCar.VehicleIndex)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Overriding replay checkpoint vehicle with vehicle with model ", GET_MODEL_NAME_FOR_DEBUG(GET_ENTITY_MODEL(vsMichaelsCar.VehicleIndex)), ".")
#ENDIF
ENDIF
DISABLE_VEHICLE_GEN_ON_MISSION(TRUE)
//DELETE_VEHICLE_GEN_VEHICLE(VEHGEN_MICHAEL_SAVEHOUSE)
//DELETE_ALL_SCRIPT_CREATED_PLAYER_VEHICLES(CHAR_MICHAEL)
CLEAR_AREA(MissionPosition.vPosition, 500.0, TRUE)
CLEAR_AREA_OF_PEDS(MissionPosition.vPosition, 500.0)
CLEAR_AREA_OF_COPS(MissionPosition.vPosition, 500.0)
CLEAR_AREA_OF_VEHICLES(MissionPosition.vPosition, 500.0)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE,DEFAULT,FALSE) //Don't disable multihead fade after intro_P1
IF IS_SCREEN_FADED_OUT()
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
ENDIF
iStageProgress++
ENDIF
BREAK
CASE 2
IF NOT DOES_CAM_EXIST(ScriptedCamera)
ScriptedCamera = CREATE_CAMERA(CAMTYPE_SCRIPTED, TRUE)
SET_CAM_PARAMS(ScriptedCamera, <<-776.580688,181.103302,72.205902>>,<<11.813498,0.000000,95.727486>>,46.725498)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
ENDIF
IF CAN_SET_EXIT_STATE_FOR_CAMERA()
// REPLAY_STOP_EVENT()
ENDIF
IF HAS_CUTSCENE_FINISHED()
IF IS_SCREEN_FADED_OUT()
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
ENDIF
RETURN TRUE
ELSE
IF ( bCutsceneSkipped = FALSE )
IF WAS_CUTSCENE_SKIPPED()
SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, FALSE, FALSE) //if cutscene was skipped, fade out and don't fade in
bCutsceneSkipped = TRUE
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
FUNC BOOL IS_MISSION_STAGE_TIMELAPSE_COMPLETED(INT &iStageProgress)
SWITCH iStageProgress
CASE 0
IF ( bTimelapseCutsceneSkipped = FALSE )
IF REQUEST_SCRIPT_AUDIO_BANK("TIME_LAPSE")
STRUCTTIMELAPSE sLocalTimelapse
sTimelapse = sLocalTimelapse //reset timelapse struct
sTimelapse.splineCamera = CREATE_CAM("DEFAULT_SPLINE_CAMERA") //create timelapse camera
ADD_CAM_SPLINE_NODE(sTimelapse.splineCamera, <<-776.5807, 181.1033, 72.2059>>,<<11.8135, -0.0000, 95.7275>>, 5500)
ADD_CAM_SPLINE_NODE(sTimelapse.splineCamera, <<-776.8288, 181.0926, 72.2551>>,<<11.8134, -0.0000, 95.7284>>, 5500)
SET_CAM_FOV(sTimelapse.splineCamera, 46.7255)
SET_CAM_ACTIVE(sTimelapse.splineCamera, TRUE)
SET_TODS_CUTSCENE_RUNNING(sTimelapse, TRUE)
iStageProgress++
ENDIF
ELSE
IF IS_SCREEN_FADED_OUT()
iStageProgress++
ENDIF
ENDIF
BREAK
CASE 1
INT iCurrentHour, iStartTime, iEndTime
iCurrentHour = GET_CLOCK_HOURS()
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Current time hour is ", iCurrentHour, ".")
#ENDIF
iTODAdditionalHours = 0
GET_SP_MISSION_TOD_WINDOW_TIME(SP_MISSION_FAMILY_6, iStartTime, iEndTime)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": iStarttime is ", iStartTime, " and iEndTime is ", iEndTime, ".")
#ENDIF
IF iCurrentHour < iEndTime AND iCurrentHour >= iEndTime - 2
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Current time hour needs additional hours added for the skip.")
#ENDIF
iTODAdditionalHours = 24
ELSE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Current time hour does not need additional hours added for the skip.")
#ENDIF
iTODAdditionalHours = 0
ENDIF
WARP_PED(PLAYER_PED_ID(), MissionPosition.vPosition, MissionPosition.fHeading, FALSE, FALSE, FALSE)
bTimelapseTriggered = TRUE
iStageProgress++
BREAK
CASE 2
REQUEST_CUTSCENE("fam_6_int_p3_t7")
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", PLAYER_PED_ID(), PLAYER_ZERO)
SET_JIMMY_CUTSCENE_COMPONENT_VARIATIONS()
bCutsceneAssetsRequested = TRUE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting cutscene ped components for intro cutscene peds during stage ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eMissionStage), ".")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting bCutsceneAssetsRequested to ", bCutsceneAssetsRequested, ".")
#ENDIF
ENDIF
IF ( bTimelapseCutsceneSkipped = FALSE )
IF DOES_CAM_EXIST(sTimelapse.splineCamera)
IF DOES_CAM_EXIST(ScriptedCamera)
DESTROY_CAM(ScriptedCamera)
ENDIF
ENDIF
IF SKIP_TO_TIME_DURING_SPLINE_CAMERA(IDEAL_MISSION_START_TIME, 0, "EXTRASUNNY", "cirrocumulus", sTimelapse, DEFAULT, iTODAdditionalHours)
RELEASE_NAMED_SCRIPT_AUDIO_BANK("TIME_LAPSE")
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
IF ( bCutsceneAssetsRequested = TRUE )
iStageProgress++
ENDIF
ENDIF
IF IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED_WITH_DELAY()
DO_SCREEN_FADE_OUT(DEFAULT_FADE_TIME)
bTimelapseCutsceneSkipped = TRUE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Timelapse cutscene skipped by the player.")
#ENDIF
ENDIF
ELSE
IF IS_SCREEN_FADED_OUT()
IF NOT HAS_SOUND_FINISHED(sTimelapse.iSplineStageSound)
STOP_SOUND(sTimelapse.iSplineStageSound)
RELEASE_NAMED_SCRIPT_AUDIO_BANK("TIME_LAPSE")
ENDIF
IF ( bCutsceneAssetsRequested = TRUE )
iStageProgress++
ENDIF
ENDIF
ENDIF
BREAK
CASE 3
RETURN TRUE
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
FUNC BOOL IS_MISSION_STAGE_CUTSCENE_INTRO_P2_COMPLETED(INT &iStageProgress)
SWITCH iStageProgress
CASE 0
IF HAS_REQUESTED_CUTSCENE_LOADED("fam_6_int_p3_t7")
REGISTER_ENTITY_FOR_CUTSCENE(psJimmy.PedIndex, "Jimmy", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, psJimmy.ModelName)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
START_CUTSCENE()
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
iStageProgress++
ELSE
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", PLAYER_PED_ID(), PLAYER_ZERO)
SET_JIMMY_CUTSCENE_COMPONENT_VARIATIONS()
ENDIF
ENDIF
BREAK
CASE 1 //fade screen in if screen was faded out due to shit skip or debug skip
IF IS_CUTSCENE_PLAYING()
IF ( bTimelapseTriggered = TRUE )
SET_TODS_CUTSCENE_RUNNING(sTimelapse, FALSE)
SET_CLOCK_TIME(IDEAL_MISSION_START_TIME, 0, 0)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting clock time after time lapse cutscene.")
#ENDIF
ENDIF
SET_WEATHER_TYPE_NOW_PERSIST("EXTRASUNNY")
IF NOT HAS_SOUND_FINISHED(sTimelapse.iSplineStageSound)
STOP_SOUND(sTimelapse.iSplineStageSound)
RELEASE_NAMED_SCRIPT_AUDIO_BANK("TIME_LAPSE")
ENDIF
IF DOES_CAM_EXIST(ScriptedCamera)
DESTROY_CAM(ScriptedCamera)
ENDIF
DESTROY_ALL_CAMS()
IF DOES_ENTITY_EXIST(osLeftDoorDummy.ObjectIndex)
DELETE_OBJECT(osLeftDoorDummy.ObjectIndex)
REMOVE_MODEL_HIDE(osLeftDoorDummy.vPosition, 1.0, osLeftDoorDummy.ModelName)
ENDIF
IF DOES_ENTITY_EXIST(osRightDoorDummy.ObjectIndex)
DELETE_OBJECT(osRightDoorDummy.ObjectIndex)
REMOVE_MODEL_HIDE(osRightDoorDummy.vPosition, 1.0, osRightDoorDummy.ModelName)
ENDIF
IF IS_DOOR_REGISTERED_WITH_SYSTEM(ENUM_TO_INT(DOORHASH_M_MANSION_F_L))
DOOR_SYSTEM_SET_OPEN_RATIO(ENUM_TO_INT(DOORHASH_M_MANSION_F_L), 0.0, FALSE, FALSE)
DOOR_SYSTEM_SET_DOOR_STATE(ENUM_TO_INT(DOORHASH_M_MANSION_F_L), DOORSTATE_FORCE_UNLOCKED_THIS_FRAME, FALSE, TRUE)
ENDIF
IF IS_DOOR_REGISTERED_WITH_SYSTEM(ENUM_TO_INT(DOORHASH_M_MANSION_F_R))
DOOR_SYSTEM_SET_OPEN_RATIO(ENUM_TO_INT(DOORHASH_M_MANSION_F_R), 0.0, FALSE, FALSE)
DOOR_SYSTEM_SET_DOOR_STATE(ENUM_TO_INT(DOORHASH_M_MANSION_F_R), DOORSTATE_FORCE_UNLOCKED_THIS_FRAME, FALSE, TRUE)
ENDIF
REMOVE_ANIM_DICT("missfam2mcs_intp1") //remove anim dictionary from previous scripted cutscene
REQUEST_MODEL(osLaptop.ModelName)
REQUEST_MODEL(psAmanda.ModelName)
REQUEST_MODEL(psFabien.ModelName)
REQUEST_MODEL(psHipster.ModelName)
REQUEST_MODEL(vsAmandasCar.ModelName)
REQUEST_ANIM_DICT("missfam6leadinoutfam_6_mcs_1") //request assets for Bean Machine scene after the intro cutscene
IF IS_SCREEN_FADED_OUT()
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
ENDIF
iStageProgress++
ENDIF
BREAK
CASE 2
//create Jimmy's ped during the intro mocap cutscene
IF NOT DOES_ENTITY_EXIST(psJimmy.PedIndex)
IF DOES_CUTSCENE_ENTITY_EXIST("Jimmy")
IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Jimmy"))
psJimmy.PedIndex = GET_PED_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Jimmy"))
SET_MISSION_PED_PROPERTIES(psJimmy.PedIndex, RELGROUPHASH_PLAYER, FALSE, TRUE, FALSE, FALSE)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Set up properites for mission player ped Jimmy created in the intro cutscene.")
#ENDIF
ENDIF
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_CAMERA()
REPLAY_STOP_EVENT()
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(17.2773 - GET_ENTITY_HEADING(PLAYER_PED_ID()))
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michael")
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY() returned true for Michael.")
#ENDIF
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
IF ( bCutsceneSkipped = FALSE )
SEQUENCE_INDEX SequenceIndex
CLEAR_SEQUENCE_TASK(SequenceIndex)
OPEN_SEQUENCE_TASK(SequenceIndex)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, << -809.27, 179.55, 71.15 >>, PEDMOVE_WALK, DEFAULT_TIME_BEFORE_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_NO_STOPPING)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, << -811.32, 180.11, 71.15 >>, PEDMOVE_WALK, DEFAULT_TIME_BEFORE_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_NO_STOPPING)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, << -813.17, 179.48, 71.16 >>, PEDMOVE_WALK, DEFAULT_TIME_BEFORE_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_NO_STOPPING)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, << -813.92, 179.22, 71.16 >>, PEDMOVE_WALK, DEFAULT_TIME_BEFORE_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_SUPPRESS_EXACT_STOP)
CLOSE_SEQUENCE_TASK(SequenceIndex)
TASK_PERFORM_SEQUENCE(PLAYER_PED_ID(), SequenceIndex)
CLEAR_SEQUENCE_TASK(SequenceIndex)
FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_ON_FOOT_WALK, FALSE, FAUS_CUTSCENE_EXIT)
ENDIF
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Jimmy")
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY() returned true for Jimmy.")
#ENDIF
IF NOT IS_PED_INJURED(psJimmy.PedIndex)
IF ( bCutsceneSkipped = FALSE )
TASK_FOLLOW_NAV_MESH_TO_COORD(psJimmy.PedIndex, << -819.95709, 177.42998, 70.60026 >>, PEDMOVE_WALK)
FORCE_PED_MOTION_STATE(psJimmy.PedIndex, MS_ON_FOOT_WALK, FALSE, FAUS_CUTSCENE_EXIT)
ENDIF
SET_PED_COMPONENT_VARIATION(psJimmy.PedIndex, PED_COMP_BERD, 0, 0)
ENDIF
ENDIF
IF HAS_CUTSCENE_FINISHED()
IF ( bCutsceneSkipped = TRUE )
IF NOT IS_PED_INJURED(psJimmy.PedIndex)
WARP_PED(psJimmy.PedIndex, psJimmy.vPosition, psJimmy.fHeading, FALSE, FALSE, FALSE)
TASK_FOLLOW_NAV_MESH_TO_COORD(psJimmy.PedIndex, << -819.95709, 177.42998, 70.60026 >>, PEDMOVE_WALK)
FORCE_PED_MOTION_STATE(psJimmy.PedIndex, MS_ON_FOOT_WALK, FALSE, FAUS_CUTSCENE_EXIT)
ENDIF
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
WARP_PED(PLAYER_PED_ID(), MissionPosition.vPosition, MissionPosition.fHeading, FALSE, TRUE, FALSE)
SEQUENCE_INDEX SequenceIndex
CLEAR_SEQUENCE_TASK(SequenceIndex)
OPEN_SEQUENCE_TASK(SequenceIndex)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, << -809.27, 179.55, 71.15 >>, PEDMOVE_WALK, DEFAULT_TIME_BEFORE_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_NO_STOPPING)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, << -811.32, 180.11, 71.15 >>, PEDMOVE_WALK, DEFAULT_TIME_BEFORE_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_NO_STOPPING)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, << -813.17, 179.48, 71.16 >>, PEDMOVE_WALK, DEFAULT_TIME_BEFORE_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_NO_STOPPING)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, << -813.92, 179.22, 71.16 >>, PEDMOVE_WALK, DEFAULT_TIME_BEFORE_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_SUPPRESS_EXACT_STOP)
CLOSE_SEQUENCE_TASK(SequenceIndex)
TASK_PERFORM_SEQUENCE(PLAYER_PED_ID(), SequenceIndex)
CLEAR_SEQUENCE_TASK(SequenceIndex)
FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_ON_FOOT_WALK, FALSE, FAUS_CUTSCENE_EXIT)
ENDIF
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
WAIT(250)
ENDIF
IF IS_SCREEN_FADED_OUT()
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
ENDIF
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
RETURN TRUE
ELSE
IF ( bCutsceneSkipped = FALSE )
IF WAS_CUTSCENE_SKIPPED()
SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, FALSE, FALSE) //if cutscene was skipped, fade out and don't fade in
bCutsceneSkipped = TRUE
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
PROC MANAGE_CONVERSATIONS_DURING_GO_TO_BEAN_MACHINE()
IF NOT IS_PED_INJURED(psJimmy.PedIndex)
AND NOT IS_PED_INJURED(PLAYER_PED_ID())
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM6_TOGO")
IF IS_SCREEN_FADED_IN() AND NOT IS_SCREEN_FADING_IN()
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF CREATE_CONVERSATION(FAM6Conversation, "FAM6AUD", "FAM6_TOGO", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("FAM6_TOGO", TRUE)
CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_PED(PLAYER_ID())
CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_NON_ANIMAL_PED(PLAYER_ID())
ENDIF
ENDIF
ENDIF
ELSE
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM6_BEAN")
AND NOT HAS_LABEL_BEEN_TRIGGERED("FAM6_BEAN2")
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF ARE_PEDS_IN_THE_SAME_VEHICLE(PLAYER_PED_ID(), psJimmy.PedIndex)
IF CREATE_CONVERSATION(FAM6Conversation, "FAM6AUD", PICK_STRING(bStageReplayInProgress, "FAM6_BEAN2", "FAM6_BEAN"), CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED(PICK_STRING(bStageReplayInProgress, "FAM6_BEAN2", "FAM6_BEAN"), TRUE)
bRunConversationPausingCheck = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
//if main conversation was interrupted, resume it from the next label
IF ( bCurrentConversationInterrupted = TRUE )
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
IF HAS_LABEL_BEEN_TRIGGERED("FAM6_JBAD")
OR HAS_LABEL_BEEN_TRIGGERED("FAM6_JWARN")
OR HAS_LABEL_BEEN_TRIGGERED("FAM6_JWANT")
IF HAS_LABEL_BEEN_TRIGGERED("FAM6_BEAN")
OR HAS_LABEL_BEEN_TRIGGERED("FAM6_BEAN2")
//play conversation for Jimmy saying cops were lost and it's safe to go to shrink
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM6_JLOST_3")
IF HAS_LABEL_BEEN_TRIGGERED("FAM6_JWANT") //this will only play if conversation to lose cops was triggered
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM6_JLOST")
IF CREATE_CONVERSATION(FAM6Conversation, "FAM6AUD", "FAM6_JLOST", CONV_PRIORITY_MEDIUM)
iCopsLostConversationCount++
SET_LABEL_AS_TRIGGERED("FAM6_JLOST", TRUE)
IF ( iCopsLostConversationCount >= 3)
SET_LABEL_AS_TRIGGERED("FAM6_JLOST_3", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
//resume the interrupted coversation
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF NOT IS_STRING_NULL_OR_EMPTY(CurrentConversationRoot)
AND NOT IS_STRING_NULL_OR_EMPTY(CurrentConversationLabel)
IF ARE_STRINGS_EQUAL(CurrentConversationRoot, "FAM6_BEAN") //resume only the main conversations
OR ARE_STRINGS_EQUAL(CurrentConversationRoot, "FAM6_BEAN2")
IF CREATE_CONVERSATION_FROM_SPECIFIC_LINE(FAM6Conversation, "FAM6AUD", CurrentConversationRoot, CurrentConversationLabel, CONV_PRIORITY_MEDIUM)
bCurrentConversationInterrupted = FALSE
SET_LABEL_AS_TRIGGERED("FAM6_JBAD", FALSE) //mark all the interrupt conversations as not triggered
SET_LABEL_AS_TRIGGERED("FAM6_JLOST", FALSE)
SET_LABEL_AS_TRIGGERED("FAM6_JWANT", FALSE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
//resume paused conversations when player gets back in the car
//IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
//IF IS_FACE_TO_FACE_CONVERSATION_PAUSED()
//PAUSE_FACE_TO_FACE_CONVERSATION(FALSE)
//ENDIF
//ENDIF
ELSE //locates header blip does not exist
//play interrupt conversation when player becomes wanted
IF IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
IF ( bCurrentConversationInterrupted = FALSE )
IF HAS_LABEL_BEEN_TRIGGERED("FAM6_BEAN")
OR HAS_LABEL_BEEN_TRIGGERED("FAM6_BEAN2")
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
CurrentConversationRoot = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_ROOT()
IF NOT IS_STRING_NULL_OR_EMPTY(CurrentConversationRoot)
IF ARE_STRINGS_EQUAL(CurrentConversationRoot, "FAM6_BEAN")
OR ARE_STRINGS_EQUAL(CurrentConversationRoot, "FAM6_BEAN2")
bCurrentConversationInterrupted = TRUE
CurrentConversationRoot = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_ROOT()
CurrentConversationLabel = GET_STANDARD_CONVERSATION_LABEL_FOR_FUTURE_RESUMPTION()
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF ( bCurrentConversationInterrupted = TRUE )
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM6_JWANT")
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(FAM6Conversation, "FAM6AUD", "FAM6_JWANT", CONV_PRIORITY_HIGH)
iPlayerOffencesCount++
iLoseCopsReminderTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(10000, 12500)
SET_LABEL_AS_TRIGGERED("FAM6_JWANT", TRUE)
CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_PED(PLAYER_ID())
CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_NON_ANIMAL_PED(PLAYER_ID())
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": iPlayerOffencesCount: ", iPlayerOffencesCount, ".")
#ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM6_JLOSE_5")
IF HAS_LABEL_BEEN_TRIGGERED("FAM6_JWANT")
IF GET_GAME_TIMER() - iLoseCopsReminderTimer > 0
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(FAM6Conversation, "FAM6AUD", "FAM6_JLOSE", CONV_PRIORITY_MEDIUM)
iLoseCopsReminderCount++
iLoseCopsReminderTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(12500, 15000)
IF ( iLoseCopsReminderCount >= 5 )
SET_LABEL_AS_TRIGGERED("FAM6_JLOSE_5", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
//keep reseting those flags during wanted level as the player might be driving recklessly
CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_PED(PLAYER_ID())
CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_NON_ANIMAL_PED(PLAYER_ID())
ELSE
//IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
// IF NOT IS_FACE_TO_FACE_CONVERSATION_PAUSED()
// PAUSE_FACE_TO_FACE_CONVERSATION(TRUE)
// ENDIF
//ENDIF
ENDIF
ENDIF
//play interrupt conversations for player offences
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
IF ( GET_GAME_TIMER() - iPlayerOffenceTimer > 5000 )
//play conversation for player running over peds
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM6_JBAD_5")
AND NOT HAS_LABEL_BEEN_TRIGGERED("FAM6_JWARN_6")
IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF HAS_PLAYER_DAMAGED_AT_LEAST_ONE_NON_ANIMAL_PED(PLAYER_ID())
AND HAS_ENTITY_COLLIDED_WITH_ANYTHING(GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID()))
bPlayerHitPed = TRUE
ENDIF
ENDIF
IF IS_PED_SHOOTING(PLAYER_PED_ID()) //add more conditions here if needed
bPlayerActingBad = TRUE
ENDIF
IF ( bPlayerHitPed = TRUE OR bPlayerActingBad = TRUE )
IF HAS_LABEL_BEEN_TRIGGERED("FAM6_BEAN")
OR HAS_LABEL_BEEN_TRIGGERED("FAM6_BEAN2")
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
CurrentConversationRoot = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_ROOT()
IF NOT IS_STRING_NULL_OR_EMPTY(CurrentConversationRoot)
IF ARE_STRINGS_EQUAL(CurrentConversationRoot, "FAM6_BEAN")
OR ARE_STRINGS_EQUAL(CurrentConversationRoot, "FAM6_BEAN2")
CurrentConversationRoot = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_ROOT()
CurrentConversationLabel = GET_STANDARD_CONVERSATION_LABEL_FOR_FUTURE_RESUMPTION()
bCurrentConversationInterrupted = TRUE
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDIF
ENDIF
ENDIF
ENDIF
IF CREATE_CONVERSATION(FAM6Conversation, "FAM6AUD", "FAM6_JBAD", CONV_PRIORITY_MEDIUM)
iPlayerOffencesCount++
iBadConversationCount++
bPlayerHitPed = FALSE
bPlayerActingBad = FALSE
iPlayerOffenceTimer = GET_GAME_TIMER()
SET_LABEL_AS_TRIGGERED("FAM6_JBAD", TRUE)
IF ( iBadConversationCount >= 5 )
SET_LABEL_AS_TRIGGERED("FAM6_JBAD_5", TRUE)
ENDIF
CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_PED(PLAYER_ID())
CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_NON_ANIMAL_PED(PLAYER_ID())
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": iPlayerOffencesCount: ", iPlayerOffencesCount, ".")
#ENDIF
ENDIF
ENDIF
ENDIF
ELSE
CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_PED(PLAYER_ID())
CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_NON_ANIMAL_PED(PLAYER_ID())
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM6_STEAL")
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF IS_PED_JACKING(PLAYER_PED_ID())
IF HAS_ENTITY_CLEAR_LOS_TO_ENTITY(psJimmy.PedIndex, PLAYER_PED_ID())
OR HAS_ENTITY_CLEAR_LOS_TO_ENTITY_IN_FRONT(psJimmy.PedIndex, PLAYER_PED_ID())
IF CREATE_CONVERSATION(FAM6Conversation, "FAM6AUD", "FAM6_STEAL", CONV_PRIORITY_MEDIUM)
//
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM6_MCS1LI")
IF NOT IS_PED_INJURED(psAmanda.PedIndex)
AND NOT IS_PED_INJURED(psFabien.PedIndex)
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF ( bLeadInTriggered = TRUE )
IF IS_ENTITY_PLAYING_ANIM(psAmanda.PedIndex, "missfam6leadinoutfam_6_mcs_1", "leadin_action_amanda")
OR IS_ENTITY_PLAYING_ANIM(psFabien.PedIndex, "missfam6leadinoutfam_6_mcs_1", "leadin_action_fabien")
IF CREATE_CONVERSATION(FAM6Conversation, "FAM6AUD", "FAM6_MCS1LI", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("FAM6_MCS1LI", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM6_MOM")
IF ( bDestinationReached = TRUE AND bLeadInTriggered = FALSE )
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF GET_DISTANCE_BETWEEN_PEDS(PLAYER_PED_ID(), psJimmy.PedIndex) < 10.0
IF CREATE_CONVERSATION(FAM6Conversation, "FAM6AUD", "FAM6_MOM", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("FAM6_MOM", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM6_COME")
IF ( bDestinationReached = TRUE AND bLeadInTriggered = FALSE )
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF GET_DISTANCE_BETWEEN_PEDS(PLAYER_PED_ID(), psJimmy.PedIndex) < 10.0
IF CREATE_CONVERSATION(FAM6Conversation, "FAM6AUD", "FAM6_COME", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("FAM6_COME", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM6_MOM2")
IF ( bDestinationReached = TRUE AND bLeadInTriggered = FALSE )
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF GET_DISTANCE_BETWEEN_PEDS(PLAYER_PED_ID(), psJimmy.PedIndex) < 10.0
IF CREATE_CONVERSATION(FAM6Conversation, "FAM6AUD", "FAM6_MOM2", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("FAM6_MOM2", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF ( bRunConversationPausingCheck = TRUE )
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF IS_PED_IN_VEHICLE(psJimmy.PedIndex, GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()))
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF IS_FACE_TO_FACE_CONVERSATION_PAUSED()
PAUSE_FACE_TO_FACE_CONVERSATION(FALSE)
ENDIF
ENDIF
ELSE
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_FACE_TO_FACE_CONVERSATION_PAUSED()
PAUSE_FACE_TO_FACE_CONVERSATION(TRUE)
ENDIF
ENDIF
ENDIF
ELIF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
AND NOT IS_PED_IN_ANY_VEHICLE(psJimmy.PedIndex)
IF GET_DISTANCE_BETWEEN_ENTITIES(psJimmy.PedIndex, PLAYER_PED_ID()) < 10
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF IS_FACE_TO_FACE_CONVERSATION_PAUSED()
PAUSE_FACE_TO_FACE_CONVERSATION(FALSE)
ENDIF
ENDIF
ELSE
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_FACE_TO_FACE_CONVERSATION_PAUSED()
PAUSE_FACE_TO_FACE_CONVERSATION(TRUE)
ENDIF
ENDIF
ENDIF
ELSE
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_FACE_TO_FACE_CONVERSATION_PAUSED()
PAUSE_FACE_TO_FACE_CONVERSATION(TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
PROC MANAGE_BEAN_MACHINE_SCENE(INT &iProgress)
SWITCH iProgress
CASE 0
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), vBeanMachineScenePosition) < 225.0
iProgress++
ENDIF
BREAK
CASE 1 //create dealer ped and door object to animate
REQUEST_MODEL(osLaptop.ModelName)
REQUEST_MODEL(psAmanda.ModelName)
REQUEST_MODEL(psFabien.ModelName)
REQUEST_MODEL(psHipster.ModelName)
REQUEST_MODEL(vsAmandasCar.ModelName)
REQUEST_ANIM_DICT("missfam6leadinoutfam_6_mcs_1")
IF HAS_MODEL_LOADED(osLaptop.ModelName)
AND HAS_MODEL_LOADED(psAmanda.ModelName)
AND HAS_MODEL_LOADED(psFabien.ModelName)
AND HAS_MODEL_LOADED(psHipster.ModelName)
AND HAS_MODEL_LOADED(vsAmandasCar.ModelName)
AND HAS_ANIM_DICT_LOADED("missfam6leadinoutfam_6_mcs_1")
//CLEAR_AREA()
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsAmandasCar, FALSE, FALSE, CHAR_AMANDA)
AND HAS_MISSION_PED_BEEN_CREATED(psAmanda, FALSE, RELGROUPHASH_PLAYER, FALSE, CHAR_AMANDA)
AND HAS_MISSION_PED_BEEN_CREATED(psFabien, FALSE, RELGROUPHASH_PLAYER, FALSE, NO_CHARACTER)
AND HAS_MISSION_PED_BEEN_CREATED(psHipster, FALSE, RELGROUPHASH_NO_RELATIONSHIP, FALSE, NO_CHARACTER)
AND HAS_MISSION_OBJECT_BEEN_CREATED(osLaptop) AND HAS_MISSION_OBJECT_BEEN_CREATED(osMug)
IF IS_VEHICLE_DRIVEABLE(vsAmandasCar.VehicleIndex)
SET_VEHICLE_AS_MISSION_CRITICAL(vsAmandasCar, TRUE)
LOWER_CONVERTIBLE_ROOF(vsAmandasCar.VehicleIndex, TRUE)
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(vsAmandasCar.VehicleIndex, FALSE)
ENDIF
SET_FABIEN_PED_COMPONENT_VARIATIONS(psFabien.bComponentVariationsSet)
ADD_PED_FOR_DIALOGUE(FAM6Conversation, 4, psFabien.PedIndex, "FABIAN")
SET_AMANDA_PED_COMPONENT_VARIATIONS(psAmanda.bComponentVariationsSet)
ADD_PED_FOR_DIALOGUE(FAM6Conversation, 5, psAmanda.PedIndex, "AMANDA")
IF NOT IS_PED_INJURED(psAmanda.PedIndex)
TASK_PLAY_ANIM_ADVANCED(psAmanda.PedIndex, "missfam6leadinoutfam_6_mcs_1", "leadin_loop_a_amanda",
vBeanMachineScenePosition, vBeanMachineSceneRotation, INSTANT_BLEND_IN, NORMAL_BLEND_OUT,
-1, AF_EXTRACT_INITIAL_OFFSET | AF_NOT_INTERRUPTABLE | AF_LOOPING)
FORCE_PED_AI_AND_ANIMATION_UPDATE(psAmanda.PedIndex)
SET_ENTITY_LOAD_COLLISION_FLAG(psAmanda.PedIndex, TRUE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(psAmanda.PedIndex, TRUE)
ENDIF
IF NOT IS_PED_INJURED(psFabien.PedIndex)
TASK_PLAY_ANIM_ADVANCED(psFabien.PedIndex, "missfam6leadinoutfam_6_mcs_1", "leadin_loop_b_fabien",
vBeanMachineScenePosition, vBeanMachineSceneRotation, INSTANT_BLEND_IN, NORMAL_BLEND_OUT,
-1, AF_EXTRACT_INITIAL_OFFSET | AF_NOT_INTERRUPTABLE | AF_LOOPING)
FORCE_PED_AI_AND_ANIMATION_UPDATE(psFabien.PedIndex)
SET_ENTITY_LOAD_COLLISION_FLAG(psFabien.PedIndex, TRUE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(psFabien.PedIndex, TRUE)
ENDIF
IF NOT IS_PED_INJURED(psHipster.PedIndex)
TASK_PLAY_ANIM_ADVANCED(psHipster.PedIndex, "missfam6leadinoutfam_6_mcs_1", "leadin_loop_c_laptop_girl",
vBeanMachineScenePosition, vBeanMachineSceneRotation, INSTANT_BLEND_IN, NORMAL_BLEND_OUT,
-1, AF_EXTRACT_INITIAL_OFFSET | AF_NOT_INTERRUPTABLE | AF_LOOPING)
FORCE_PED_AI_AND_ANIMATION_UPDATE(psHipster.PedIndex)
SET_ENTITY_LOAD_COLLISION_FLAG(psHipster.PedIndex, TRUE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(psHipster.PedIndex, TRUE)
ENDIF
IF DOES_ENTITY_EXIST(osLaptop.ObjectIndex)
IF NOT IS_ENTITY_DEAD(osLaptop.ObjectIndex)
IF NOT IS_PED_INJURED(psHipster.PedIndex)
ATTACH_ENTITY_TO_ENTITY(osLaptop.ObjectIndex, psHipster.PedIndex, GET_PED_BONE_INDEX(psHipster.PedIndex,BONETAG_PH_R_HAND), << 0.0, 0.0, 0.0 >>, << 0.0, 0.0, 0.0 >>)
ENDIF
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(osMug.ObjectIndex)
IF NOT IS_ENTITY_DEAD(osMug.ObjectIndex)
IF NOT IS_PED_INJURED(psFabien.PedIndex)
ATTACH_ENTITY_TO_ENTITY(osMug.ObjectIndex, psFabien.PedIndex, GET_PED_BONE_INDEX(psFabien.PedIndex, BONETAG_PH_R_HAND), << 0.0, 0.0, 0.0 >>, << 0.0, 0.0, 0.0 >>)
ENDIF
ENDIF
ENDIF
SET_MODEL_AS_NO_LONGER_NEEDED(osLaptop.ModelName)
SET_MODEL_AS_NO_LONGER_NEEDED(psAmanda.ModelName)
SET_MODEL_AS_NO_LONGER_NEEDED(psFabien.ModelName)
SET_MODEL_AS_NO_LONGER_NEEDED(psHipster.ModelName)
SET_MODEL_AS_NO_LONGER_NEEDED(vsAmandasCar.ModelName)
iProgress++
ENDIF
ENDIF
BREAK
CASE 2
IF ( bLeadInTriggered = TRUE )
IF NOT IS_PED_INJURED(psAmanda.PedIndex)
TASK_PLAY_ANIM_ADVANCED(psAmanda.PedIndex, "missfam6leadinoutfam_6_mcs_1", "leadin_action_amanda",
vBeanMachineScenePosition, vBeanMachineSceneRotation, NORMAL_BLEND_IN, NORMAL_BLEND_OUT,
-1, AF_EXTRACT_INITIAL_OFFSET | AF_NOT_INTERRUPTABLE | AF_HOLD_LAST_FRAME)
FORCE_PED_AI_AND_ANIMATION_UPDATE(psAmanda.PedIndex)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(psAmanda.PedIndex, TRUE)
ENDIF
IF NOT IS_PED_INJURED(psFabien.PedIndex)
TASK_PLAY_ANIM_ADVANCED(psFabien.PedIndex, "missfam6leadinoutfam_6_mcs_1", "leadin_action_fabien",
vBeanMachineScenePosition, vBeanMachineSceneRotation, NORMAL_BLEND_IN, NORMAL_BLEND_OUT,
-1, AF_EXTRACT_INITIAL_OFFSET | AF_NOT_INTERRUPTABLE | AF_HOLD_LAST_FRAME)
FORCE_PED_AI_AND_ANIMATION_UPDATE(psFabien.PedIndex)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(psFabien.PedIndex, TRUE)
ENDIF
IF NOT IS_PED_INJURED(psHipster.PedIndex)
TASK_PLAY_ANIM_ADVANCED(psHipster.PedIndex, "missfam6leadinoutfam_6_mcs_1", "leadin_action_laptop_girl",
vBeanMachineScenePosition, vBeanMachineSceneRotation, NORMAL_BLEND_IN, NORMAL_BLEND_OUT,
-1, AF_EXTRACT_INITIAL_OFFSET | AF_NOT_INTERRUPTABLE | AF_HOLD_LAST_FRAME)
FORCE_PED_AI_AND_ANIMATION_UPDATE(psHipster.PedIndex)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(psHipster.PedIndex, TRUE)
ENDIF
iProgress++
ENDIF
BREAK
CASE 3
IF NOT IS_PED_INJURED(psAmanda.PedIndex)
IF IS_ENTITY_PLAYING_ANIM(psAmanda.PedIndex, "missfam6leadinoutfam_6_mcs_1", "leadin_action_amanda")
SET_ENTITY_ANIM_SPEED(psAmanda.PedIndex, "missfam6leadinoutfam_6_mcs_1", "leadin_action_amanda", 0.9)
ENDIF
ENDIF
IF NOT IS_PED_INJURED(psFabien.PedIndex)
IF IS_ENTITY_PLAYING_ANIM(psFabien.PedIndex, "missfam6leadinoutfam_6_mcs_1", "leadin_action_fabien")
SET_ENTITY_ANIM_SPEED(psFabien.PedIndex, "missfam6leadinoutfam_6_mcs_1", "leadin_action_fabien", 0.9)
ENDIF
ENDIF
IF NOT IS_PED_INJURED(psHipster.PedIndex)
IF IS_ENTITY_PLAYING_ANIM(psHipster.PedIndex, "missfam6leadinoutfam_6_mcs_1", "leadin_action_laptop_girl")
SET_ENTITY_ANIM_SPEED(psHipster.PedIndex, "missfam6leadinoutfam_6_mcs_1", "leadin_action_laptop_girl", 0.9)
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDPROC
FUNC BOOL IS_MISSION_STAGE_DRIVE_TO_BEAN_MACHINE_COMPLETED(INT &iStageProgress)
SET_BIT(sLocatesData.iLocatesBitSet, BS_DONT_DO_J_SKIP)
SET_ALL_RANDOM_PEDS_FLEE_THIS_FRAME(PLAYER_ID())
MANAGE_CONVERSATIONS_DURING_GO_TO_BEAN_MACHINE()
MANAGE_BEAN_MACHINE_SCENE(iBeanMachineSceneProgress)
IF NOT IS_PED_INJURED(psJimmy.PedIndex)
SET_PED_RESET_FLAG(psJimmy.PedIndex,PRF_SearchForClosestDoor, TRUE)
ENDIF
IF DOES_ENTITY_EXIST(sLocatesData.vehStartCar)
AND NOT IS_ENTITY_DEAD(sLocatesData.vehStartCar)
AND IS_PED_IN_VEHICLE(PLAYER_PED_ID(), sLocatesData.vehStartCar, TRUE)
IF NOT IS_PED_IN_VEHICLE(psJimmy.PedIndex, sLocatesData.vehStartCar, TRUE)
DISABLE_LOCATES_CLEAR_BUDDY_TASKS_IF_ENTERING_NEAREST_VEHICLE(sLocatesData, TRUE)
ENDIF
ELSE
DISABLE_LOCATES_CLEAR_BUDDY_TASKS_IF_ENTERING_NEAREST_VEHICLE(sLocatesData, FALSE)
ENDIF
//handle requestting mocap cutscene
IF IS_PLAYER_BROWSING_ITEMS_IN_ANY_SHOP()
OR IS_PLAYER_CHANGING_CLOTHES()
IF HAS_THIS_CUTSCENE_LOADED("fam_6_mcs_1")
OR HAS_CUTSCENE_LOADED()
OR IS_CUTSCENE_ACTIVE()
REMOVE_CUTSCENE()
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Player browsing items in a shop or changing clothes. Removing cutscene.")
#ENDIF
ENDIF
ELSE
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), vBeanMachinePosition) < DEFAULT_CUTSCENE_LOAD_DIST
REQUEST_CUTSCENE("fam_6_mcs_1")
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", PLAYER_PED_ID()) //Michael's variations
SET_JIMMY_CUTSCENE_COMPONENT_VARIATIONS()
SET_AMANDA_CUTSCENE_COMPONENT_VARIATIONS()
SET_FABIEN_CUTSCENE_COMPONENT_VARIATIONS()
ENDIF
ELSE
IF HAS_THIS_CUTSCENE_LOADED("fam_6_mcs_1")
OR HAS_CUTSCENE_LOADED()
OR IS_CUTSCENE_ACTIVE()
REMOVE_CUTSCENE()
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Player too far away from destination to keep cutscene in memory. Removing cutscene.")
#ENDIF
ENDIF
ENDIF
ENDIF
IF GET_SCRIPT_TASK_STATUS(PLAYER_PED_ID(), SCRIPT_TASK_PERFORM_SEQUENCE) = PERFORMING_TASK
IF ( bPlayerPedScriptTaskInterrupted = FALSE )
IF IS_SCREEN_FADED_IN() AND NOT IS_SCREEN_FADING_IN()
IF IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_JUMP)
OR IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_SPRINT)
OR (ROUND(GET_CONTROL_NORMAL(PLAYER_CONTROL, INPUT_MOVE_LR) * 255.0) < -20 OR ROUND(GET_CONTROL_NORMAL(PLAYER_CONTROL, INPUT_MOVE_LR) * 255.0) > 20)
OR (ROUND(GET_CONTROL_NORMAL(PLAYER_CONTROL, INPUT_MOVE_UD) * 255.0) < -20 OR ROUND(GET_CONTROL_NORMAL(PLAYER_CONTROL, INPUT_MOVE_UD) * 255.0) > 20)
CLEAR_PED_TASKS(PLAYER_PED_ID())
bPlayerPedScriptTaskInterrupted = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
SWITCH iStageProgress
CASE 0
IF NOT IS_PED_INJURED(psJimmy.PedIndex)
IF ( GET_SCRIPT_TASK_STATUS(psJimmy.PedIndex, SCRIPT_TASK_ENTER_VEHICLE) != PERFORMING_TASK )
TASK_FOLLOW_NAV_MESH_TO_COORD(psJimmy.PedIndex, << -819.95709, 177.42998, 70.60026 >>, PEDMOVE_WALK, DEFAULT_TIME_BEFORE_WARP * 3, DEFAULT_NAVMESH_RADIUS, ENAV_NO_STOPPING | ENAV_GO_FAR_AS_POSSIBLE_IF_TARGET_NAVMESH_NOT_LOADED)
FORCE_PED_MOTION_STATE(psJimmy.PedIndex, MS_ON_FOOT_WALK, FALSE, FAUS_DEFAULT, TRUE)
ENDIF
ENDIF
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
IF ( GET_SCRIPT_TASK_STATUS(PLAYER_PED_ID(), SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK )
SEQUENCE_INDEX SequenceIndex
CLEAR_SEQUENCE_TASK(SequenceIndex)
OPEN_SEQUENCE_TASK(SequenceIndex)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, << -809.27, 179.55, 71.15 >>, PEDMOVE_WALK, DEFAULT_TIME_BEFORE_WARP * 3, DEFAULT_NAVMESH_RADIUS, ENAV_NO_STOPPING | ENAV_GO_FAR_AS_POSSIBLE_IF_TARGET_NAVMESH_NOT_LOADED)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, << -811.32, 180.11, 71.15 >>, PEDMOVE_WALK, DEFAULT_TIME_BEFORE_WARP * 3, DEFAULT_NAVMESH_RADIUS, ENAV_NO_STOPPING | ENAV_GO_FAR_AS_POSSIBLE_IF_TARGET_NAVMESH_NOT_LOADED)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, << -813.17, 179.48, 71.16 >>, PEDMOVE_WALK, DEFAULT_TIME_BEFORE_WARP * 3, DEFAULT_NAVMESH_RADIUS, ENAV_NO_STOPPING | ENAV_GO_FAR_AS_POSSIBLE_IF_TARGET_NAVMESH_NOT_LOADED)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, << -813.92, 179.22, 71.16 >>, PEDMOVE_WALK, DEFAULT_TIME_BEFORE_WARP * 3, DEFAULT_NAVMESH_RADIUS, ENAV_SUPPRESS_EXACT_STOP)
CLOSE_SEQUENCE_TASK(SequenceIndex)
TASK_PERFORM_SEQUENCE(PLAYER_PED_ID(), SequenceIndex)
CLEAR_SEQUENCE_TASK(SequenceIndex)
FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_ON_FOOT_WALK, FALSE, FAUS_DEFAULT, TRUE)
ENDIF
ENDIF
IF IS_SCREEN_FADED_OUT()
WAIT(2)
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
ENDIF
IF HAS_LABEL_BEEN_TRIGGERED("FAM6_TOGO")
REPLAY_RECORD_BACK_FOR_TIME(0.0, 5.0, REPLAY_IMPORTANCE_HIGHEST)
SET_LOCATES_BUDDIES_TO_GET_INTO_NEAREST_CAR(sLocatesData, vsMichaelsCar.VehicleIndex)
START_AUDIO_SCENE("FAMILY_6_DRIVE_TO_AMANDA")
iStageProgress++
ENDIF
BREAK
CASE 1
IS_PLAYER_AT_LOCATION_WITH_BUDDY_ANY_MEANS(sLocatesData, vBeanMachinePosition, DEFAULT_LOCATES_SIZE_VECTOR(), TRUE, psJimmy.PedIndex, "FAM6_YOGA", "CMN_JLEAVE", FALSE, TRUE)
//do the check to progress the stage here
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
IF ARE_PEDS_IN_THE_SAME_VEHICLE(PLAYER_PED_ID(), psJimmy.PedIndex)
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<-630.973633,255.312454,82.295090>>, <<6.000000,4.000000,2.000000>>)
AND IS_ENTITY_AT_COORD(psJimmy.PedIndex, <<-630.973633,255.312454,82.295090>>, <<6.000000,4.000000,2.000000>>)
IF IS_VEHICLE_ON_ALL_WHEELS(GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID()))
CLEAR_MISSION_LOCATION_TEXT_AND_BLIPS(sLocatesData)
KILL_ANY_CONVERSATION()
KILL_FACE_TO_FACE_CONVERSATION() //kill conversations and let last line play out
bDestinationReached = TRUE
REPLAY_RECORD_BACK_FOR_TIME(6.0, 4.0, REPLAY_IMPORTANCE_HIGHEST)
iStageProgress++
ENDIF
ENDIF
ELSE
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-641.87726, 247.57806, 80.30839>>, <<-607.46051, 244.61778, 87.00999>>, 22.0)
AND IS_ENTITY_IN_ANGLED_AREA(psJimmy.PedIndex, <<-641.87726, 247.57806, 80.30839>>, <<-607.46051, 244.61778, 87.00999>>, 22.0)
IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF IS_VEHICLE_ON_ALL_WHEELS(GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID()))
CLEAR_MISSION_LOCATION_TEXT_AND_BLIPS(sLocatesData)
KILL_ANY_CONVERSATION()
KILL_FACE_TO_FACE_CONVERSATION() //kill conversations and let last line play out
bDestinationReached = TRUE
iStageProgress++
ENDIF
ELSE
CLEAR_MISSION_LOCATION_TEXT_AND_BLIPS(sLocatesData)
KILL_ANY_CONVERSATION()
KILL_FACE_TO_FACE_CONVERSATION() //kill conversations and let last line play out
bDestinationReached = TRUE
iStageProgress++
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE 2
IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID()), 5.0)
IF NOT IS_SCRIPTED_CONVERSATION_ONGOING() //check if scripted conversations are not ongoing using native command
OR NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() //check if any conversations are not ongoing using script command
iStageProgress++
ENDIF
ENDIF
ELSE
IF NOT IS_SCRIPTED_CONVERSATION_ONGOING() //check if scripted conversations are not ongoing using native command
OR NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() //check if any conversations are not ongoing using script command
iStageProgress++
ENDIF
ENDIF
BREAK
CASE 3
IS_PLAYER_AT_LOCATION_WITH_BUDDY_ANY_MEANS(sLocatesData, <<-628.04919, 242.85347, 80.89529>>, DEFAULT_LOCATES_SIZE_VECTOR(), TRUE, psJimmy.PedIndex, "", "", FALSE, TRUE)
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-641.87726, 247.57806, 80.30839>>, <<-607.46051, 244.61778, 87.00999>>, 22.0)
UPDATE_BLOCKED_PLAYER_FOR_LEAD_IN(TRUE)
SUPPRESS_CONTEXT_BUTTON_ACTIONS_THIS_FRAME()
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED)
HIDE_PED_WEAPON_FOR_SCRIPTED_CUTSCENE(PLAYER_PED_ID(), TRUE)
SET_PED_MAX_MOVE_BLEND_RATIO(PLAYER_PED_ID(), PEDMOVE_WALK)
IF ( bLookAtAmandaActive = FALSE )
IF NOT IS_PED_INJURED(psAmanda.PedIndex)
TASK_LOOK_AT_ENTITY(PLAYER_PED_ID(), psAmanda.PedIndex, INFINITE_TASK_TIME, SLF_WHILE_NOT_IN_FOV)
bLookAtAmandaActive = TRUE
ENDIF
ENDIF
ELSE
IF ( bLookAtAmandaActive = TRUE )
TASK_CLEAR_LOOK_AT(PLAYER_PED_ID())
bLookAtAmandaActive = FALSE
ENDIF
ENDIF
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) AND IS_PED_GROUP_MEMBER(psJimmy.PedIndex, PLAYER_GROUP_ID())
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-641.87726, 247.57806, 80.30839>>, <<-607.46051, 244.61778, 87.00999>>, 22.0)
//AND IS_ENTITY_IN_ANGLED_AREA(psJimmy.PedIndex, <<-641.87726, 247.57806, 80.30839>>, <<-607.46051, 244.61778, 87.00999>>, 22.0)
bLeadInTriggered = TRUE
ENDIF
ENDIF
IF ( bLeadInTriggered = TRUE )
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-629.12653, 242.94969, 80.89502>>, <<-621.01813, 242.78120, 83>>, 3.5)
OR IS_ENTITY_IN_ANGLED_AREA(psJimmy.PedIndex, <<-629.12653, 242.94969, 80.89502>>, <<-621.01813, 242.78120, 83>>, 3.5)
OR ( IS_ENTITY_PLAYING_ANIM(psAmanda.PedIndex, "missfam6leadinoutfam_6_mcs_1", "leadin_action_amanda") AND GET_ENTITY_ANIM_CURRENT_TIME(psAmanda.PedIndex, "missfam6leadinoutfam_6_mcs_1", "leadin_action_amanda") >= 0.99 )
OR ( IS_ENTITY_PLAYING_ANIM(psFabien.PedIndex, "missfam6leadinoutfam_6_mcs_1", "leadin_action_fabien") AND GET_ENTITY_ANIM_CURRENT_TIME(psFabien.PedIndex, "missfam6leadinoutfam_6_mcs_1", "leadin_action_fabien") >= 0.99 )
KILL_ANY_CONVERSATION()
KILL_FACE_TO_FACE_CONVERSATION()
CLEAR_MISSION_LOCATION_TEXT_AND_BLIPS(sLocatesData)
RETURN TRUE
ENDIF
ENDIF
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
FUNC BOOL IS_MISSION_STAGE_CUTSCENE_BEAN_MACHINE_COMPLETED(INT &iStageProgress)
SWITCH iStageProgress
CASE 0
IF HAS_REQUESTED_CUTSCENE_LOADED("fam_6_mcs_1")
IF NOT IS_PED_INJURED(psJimmy.PedIndex)
REGISTER_ENTITY_FOR_CUTSCENE(psJimmy.PedIndex, "Jimmy", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, psJimmy.ModelName)
ENDIF
IF NOT IS_PED_INJURED(psAmanda.PedIndex)
REGISTER_ENTITY_FOR_CUTSCENE(psAmanda.PedIndex, "Amanda", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, psAmanda.ModelName)
ENDIF
IF NOT IS_PED_INJURED(psFabien.PedIndex)
REGISTER_ENTITY_FOR_CUTSCENE(psFabien.PedIndex, "Fabien", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, psFabien.ModelName)
ENDIF
IF IS_VEHICLE_DRIVEABLE(vsAmandasCar.VehicleIndex)
SET_VEHICLE_LOD_MULTIPLIER(vsAmandasCar.VehicleIndex, 2.0)
REGISTER_ENTITY_FOR_CUTSCENE(vsAmandasCar.VehicleIndex, "Amandas_Car", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
IF NOT IS_PED_INJURED(psHipster.PedIndex)
REGISTER_ENTITY_FOR_CUTSCENE(psHipster.PedIndex, "Laptop_Girl", CU_ANIMATE_AND_DELETE_EXISTING_SCRIPT_ENTITY)
ENDIF
IF DOES_ENTITY_EXIST(osLaptop.ObjectIndex)
IF NOT IS_ENTITY_DEAD(osLaptop.ObjectIndex)
IF IS_ENTITY_ATTACHED(osLaptop.ObjectIndex)
DETACH_ENTITY(osLaptop.ObjectIndex, FALSE, TRUE)
ENDIF
REGISTER_ENTITY_FOR_CUTSCENE(osLaptop.ObjectIndex, "Fam_Laptop", CU_ANIMATE_AND_DELETE_EXISTING_SCRIPT_ENTITY)
ENDIF
ENDIF
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDIF
STOP_AUDIO_SCENES()
START_CUTSCENE()
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
iStageProgress++
ELSE
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", PLAYER_PED_ID(), PLAYER_ZERO)
SET_JIMMY_CUTSCENE_COMPONENT_VARIATIONS()
SET_AMANDA_CUTSCENE_COMPONENT_VARIATIONS()
SET_FABIEN_CUTSCENE_COMPONENT_VARIATIONS()
ENDIF
ENDIF
BREAK
CASE 1 //fade screen in if screen was faded out due to shit skip or debug skip
IF IS_CUTSCENE_PLAYING()
VEHICLE_INDEX LastPlayerVehicleIndex
LastPlayerVehicleIndex = GET_PLAYERS_LAST_VEHICLE()
IF DOES_ENTITY_EXIST(LastPlayerVehicleIndex)
IF NOT IS_ENTITY_DEAD(LastPlayerVehicleIndex)
IF IS_VEHICLE_AVAILABLE_TO_SNAPSHOT(PLAYER_PED_ID(), LastPlayerVehicleIndex, TRUE)
IF NOT IS_ENTITY_A_MISSION_ENTITY(LastPlayerVehicleIndex)
SET_ENTITY_AS_MISSION_ENTITY(LastPlayerVehicleIndex)
SET_VEHICLE_AS_NO_LONGER_NEEDED(vsMichaelsCar.VehicleIndex)
vsMichaelsCar.VehicleIndex = LastPlayerVehicleIndex
ENDIF
STOP_VEHICLE_FIRE(LastPlayerVehicleIndex)
SET_VEHICLE_DOORS_SHUT(LastPlayerVehicleIndex, TRUE)
SET_VEHICLE_ENGINE_ON(LastPlayerVehicleIndex, FALSE, TRUE)
SET_ENTITY_COORDS(LastPlayerVehicleIndex, vsMichaelsCar.vPosition)
SET_ENTITY_HEADING(LastPlayerVehicleIndex, vsMichaelsCar.fHeading)
SET_VEHICLE_ON_GROUND_PROPERLY(LastPlayerVehicleIndex)
SET_VEHICLE_LOD_MULTIPLIER(LastPlayerVehicleIndex, 2.0)
OVERRIDE_REPLAY_CHECKPOINT_VEHICLE(LastPlayerVehicleIndex)
ENDIF
ENDIF
ENDIF
DESTROY_ALL_CAMS()
RENDER_SCRIPT_CAMS(FALSE, FALSE)
CLEANUP_MISSION_OBJECT(osMug, TRUE)
REMOVE_ANIM_DICT("missfam6leadinoutfam_6_mcs_1")
CLEAR_AREA_OF_PEDS(MissionPosition.vPosition, 10.0)
CLEAR_AREA_OF_OBJECTS(MissionPosition.vPosition, 10.0)
CLEAR_AREA_OF_VEHICLES(MissionPosition.vPosition, 10.0)
CLEAR_AREA_OF_PROJECTILES(MissionPosition.vPosition, 10.0)
REMOVE_PARTICLE_FX_IN_RANGE(MissionPosition.vPosition, 10.0)
iSpeedZone = ADD_ROAD_NODE_SPEED_ZONE(<< -643.08, 249.90, 80.27 >>, 15.0, 5.0)
IF IS_SCREEN_FADED_OUT()
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
ENDIF
iStageProgress++
ENDIF
BREAK
CASE 2
IF CAN_SET_EXIT_STATE_FOR_CAMERA()
REPLAY_STOP_EVENT()
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
ENDIF
IF DOES_ENTITY_EXIST(vsAmandasCar.VehicleIndex) AND NOT IS_ENTITY_DEAD(vsAmandasCar.VehicleIndex)
SET_FORCE_HD_VEHICLE(vsAmandasCar.VehicleIndex, TRUE)
SET_VEHICLE_WILL_FORCE_OTHER_VEHICLES_TO_STOP(vsAmandasCar.VehicleIndex, TRUE)
ENDIF
IF DOES_ENTITY_EXIST(vsMichaelsCar.VehicleIndex) AND NOT IS_ENTITY_DEAD(vsMichaelsCar.VehicleIndex)
SET_FORCE_HD_VEHICLE(vsMichaelsCar.VehicleIndex, TRUE)
SET_VEHICLE_WILL_FORCE_OTHER_VEHICLES_TO_STOP(vsMichaelsCar.VehicleIndex, TRUE)
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michael")
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY() returned true for Michael.")
#ENDIF
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
IF ( bCutsceneSkipped = TRUE )
WARP_PED(PLAYER_PED_ID(), MissionPosition.vPosition, MissionPosition.fHeading, FALSE, FALSE, FALSE)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
ENDIF
FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_ON_FOOT_WALK, FALSE, FAUS_CUTSCENE_EXIT)
SIMULATE_PLAYER_INPUT_GAIT(PLAYER_ID(), PEDMOVE_WALK, 2000)
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Jimmy")
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY() returned true for Jimmy.")
#ENDIF
IF NOT IS_PED_INJURED(psJimmy.PedIndex)
SET_PED_COMPONENT_VARIATION(psJimmy.PedIndex, PED_COMP_BERD, 0, 0)
IF ( bCutsceneSkipped = TRUE )
WARP_PED(psJimmy.PedIndex, psJimmy.vPosition, psJimmy.fHeading, FALSE, FALSE, FALSE)
ENDIF
TASK_FOLLOW_NAV_MESH_TO_COORD(psJimmy.PedIndex, <<-629.51685, 248.82660, 80.57744>>, PEDMOVE_WALK, DEFAULT_TIME_NEVER_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_SUPPRESS_EXACT_STOP)
FORCE_PED_MOTION_STATE(psJimmy.PedIndex, MS_ON_FOOT_WALK, FALSE, FAUS_CUTSCENE_EXIT)
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Amanda")
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY() returned true for Amanda.")
#ENDIF
IF NOT IS_PED_INJURED(psAmanda.PedIndex) AND IS_VEHICLE_DRIVEABLE(vsAmandasCar.VehicleIndex)
SET_VEHICLE_DOORS_SHUT(vsAmandasCar.VehicleIndex, TRUE)
SET_PED_INTO_VEHICLE(psAmanda.PedIndex, vsAmandasCar.VehicleIndex, VS_DRIVER)
TASK_VEHICLE_DRIVE_WANDER(psAmanda.PedIndex, vsAmandasCar.VehicleIndex, 30, DRIVINGMODE_AVOIDCARS)
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Fabien")
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY() returned true for Fabien.")
#ENDIF
IF NOT IS_PED_INJURED(psFabien.PedIndex) AND IS_VEHICLE_DRIVEABLE(vsAmandasCar.VehicleIndex)
SET_PED_INTO_VEHICLE(psFabien.PedIndex, vsAmandasCar.VehicleIndex, VS_FRONT_RIGHT)
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Amandas_car")
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY() returned true for Amandas_car.")
#ENDIF
IF IS_VEHICLE_DRIVEABLE(vsAmandasCar.VehicleIndex)
SET_VEHICLE_DOORS_SHUT(vsAmandasCar.VehicleIndex, TRUE)
FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(vsAmandasCar.VehicleIndex) //fix for B*1808939
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Calling FORCE_ENTITY_AI_AND_ANIMATION_UPDATE() for Amandas_car.")
#ENDIF
SET_VEHICLE_ON_GROUND_PROPERLY(vsAmandasCar.VehicleIndex)
SET_VEHICLE_ENGINE_ON(vsAmandasCar.VehicleIndex, TRUE, TRUE)
SET_VEHICLE_FORWARD_SPEED(vsAmandasCar.VehicleIndex, 5)
PLAY_SOUND_FROM_ENTITY(-1, "Amanda_Pulls_Away", vsAmandasCar.VehicleIndex, "FAMILY_6_SOUNDS")
START_AUDIO_SCENE("FAMILY_6_AMANDA_PULLS_AWAY")
ADD_ENTITY_TO_AUDIO_MIX_GROUP(vsAmandasCar.VehicleIndex, "FAMILY_6_AMANDA_PULLS_AWAY_GROUP")
SET_AUDIO_VEHICLE_PRIORITY(vsAmandasCar.VehicleIndex, AUDIO_VEHICLE_PRIORITY_MAX)
ENDIF
ENDIF
IF HAS_CUTSCENE_FINISHED()
IF ( bCutsceneSkipped = TRUE )
CLEANUP_PED(psAmanda, TRUE)
CLEANUP_PED(psFabien, TRUE)
IF DOES_ENTITY_EXIST(vsAmandasCar.VehicleIndex)
DELETE_VEHICLE(vsAmandasCar.VehicleIndex)
ENDIF
ENDIF
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
REMOVE_ROAD_NODE_SPEED_ZONE(iSpeedZone)
IF IS_SCREEN_FADED_OUT()
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
ENDIF
RETURN TRUE
ELSE
IF ( bCutsceneSkipped = FALSE )
IF WAS_CUTSCENE_SKIPPED()
SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, FALSE, FALSE) //if cutscene was skipped, fade out and don't fade in
bCutsceneSkipped = TRUE
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
PROC MANAGE_CONVERSATIONS_DURING_GO_TO_TRACEY()
IF NOT IS_PED_INJURED(psJimmy.PedIndex)
AND NOT IS_PED_INJURED(PLAYER_PED_ID())
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM6_JIM")
IF IS_SCREEN_FADED_IN() AND NOT IS_SCREEN_FADING_IN()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(FAM6Conversation, "FAM6AUD", "FAM6_JIM", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("FAM6_JIM", TRUE)
CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_PED(PLAYER_ID())
CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_NON_ANIMAL_PED(PLAYER_ID())
ENDIF
ENDIF
ENDIF
ELSE
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM6_TATT2")
AND NOT HAS_LABEL_BEEN_TRIGGERED("FAM6_TATTOO")
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF ARE_PEDS_IN_THE_SAME_VEHICLE(PLAYER_PED_ID(), psJimmy.PedIndex)
IF CREATE_CONVERSATION(FAM6Conversation, "FAM6AUD", PICK_STRING(bStageReplayInProgress, "FAM6_TATT2", "FAM6_TATTOO"), CONV_PRIORITY_MEDIUM)
CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_PED(PLAYER_ID())
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()))
SET_LABEL_AS_TRIGGERED(PICK_STRING(bStageReplayInProgress, "FAM6_TATT2", "FAM6_TATTOO"), TRUE)
bRunConversationPausingCheck = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
//if main conversation was interrupted, resume it from the next label
IF ( bCurrentConversationInterrupted = TRUE )
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
IF HAS_LABEL_BEEN_TRIGGERED("FAM6_JBAD")
OR HAS_LABEL_BEEN_TRIGGERED("FAM6_JWARN")
OR HAS_LABEL_BEEN_TRIGGERED("FAM6_JWANT")
IF HAS_LABEL_BEEN_TRIGGERED("FAM6_TATT2")
OR HAS_LABEL_BEEN_TRIGGERED("FAM6_TATTOO")
OR HAS_LABEL_BEEN_TRIGGERED("FAM6_JTALK")
//play conversation for Jimmy saying cops were lost and it's safe to go to shrink
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM6_JLOST_3")
IF HAS_LABEL_BEEN_TRIGGERED("FAM6_JWANT") //this will only play if conversation to lose cops was triggered
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM6_JLOST")
IF CREATE_CONVERSATION(FAM6Conversation, "FAM6AUD", "FAM6_JLOST", CONV_PRIORITY_MEDIUM)
iCopsLostConversationCount++
SET_LABEL_AS_TRIGGERED("FAM6_JLOST", TRUE)
IF ( iCopsLostConversationCount >= 3)
SET_LABEL_AS_TRIGGERED("FAM6_JLOST_3", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
//resume the interrupted coversation
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF NOT IS_STRING_NULL_OR_EMPTY(CurrentConversationRoot)
AND NOT IS_STRING_NULL_OR_EMPTY(CurrentConversationLabel)
IF ARE_STRINGS_EQUAL(CurrentConversationRoot, "FAM6_TATT2") //resume only the main conversations
OR ARE_STRINGS_EQUAL(CurrentConversationRoot, "FAM6_TATTOO")
OR ARE_STRINGS_EQUAL(CurrentConversationRoot, "FAM6_JTALK")
IF ( iPlayerOffencesCount >= 3 )
AND NOT HAS_LABEL_BEEN_TRIGGERED("FAM6_JTALK")
//if player commited more than 3 offences and the weird conversation did not trigger
//let the weird conversations trigger first before it can be resumed
ELSE
//resume conversation from specific root and line label
IF CREATE_CONVERSATION_FROM_SPECIFIC_LINE(FAM6Conversation, "FAM6AUD", CurrentConversationRoot, CurrentConversationLabel, CONV_PRIORITY_MEDIUM)
bCurrentConversationInterrupted = FALSE
SET_LABEL_AS_TRIGGERED("FAM6_JBAD", FALSE) //mark all the interrupt conversations as not triggered
SET_LABEL_AS_TRIGGERED("FAM6_JLOST", FALSE)
SET_LABEL_AS_TRIGGERED("FAM6_JWANT", FALSE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
//resume paused conversations when player gets back in the car
//IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
//IF IS_FACE_TO_FACE_CONVERSATION_PAUSED()
//PAUSE_FACE_TO_FACE_CONVERSATION(FALSE)
//ENDIF
//ENDIF
ELSE //locates header blip does not exist
//play interrupt conversation when player becomes wanted
IF IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
IF ( bCurrentConversationInterrupted = FALSE )
IF HAS_LABEL_BEEN_TRIGGERED("FAM6_TATT2")
OR HAS_LABEL_BEEN_TRIGGERED("FAM6_TATTOO")
OR HAS_LABEL_BEEN_TRIGGERED("FAM6_JTALK")
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
CurrentConversationRoot = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_ROOT()
IF NOT IS_STRING_NULL_OR_EMPTY(CurrentConversationRoot)
IF ARE_STRINGS_EQUAL(CurrentConversationRoot, "FAM6_TATT2")
OR ARE_STRINGS_EQUAL(CurrentConversationRoot, "FAM6_TATTOO")
OR ARE_STRINGS_EQUAL(CurrentConversationRoot, "FAM6_JTALK")
bCurrentConversationInterrupted = TRUE
CurrentConversationRoot = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_ROOT()
CurrentConversationLabel = GET_STANDARD_CONVERSATION_LABEL_FOR_FUTURE_RESUMPTION()
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF ( bCurrentConversationInterrupted = TRUE )
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM6_JWANT")
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(FAM6Conversation, "FAM6AUD", "FAM6_JWANT", CONV_PRIORITY_HIGH)
iPlayerOffencesCount++
iLoseCopsReminderTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(10000, 12500)
SET_LABEL_AS_TRIGGERED("FAM6_JWANT", TRUE)
CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_PED(PLAYER_ID())
CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_NON_ANIMAL_PED(PLAYER_ID())
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": iPlayerOffencesCount: ", iPlayerOffencesCount, ".")
#ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM6_JLOSE_5")
IF HAS_LABEL_BEEN_TRIGGERED("FAM6_JWANT")
IF GET_GAME_TIMER() - iLoseCopsReminderTimer > 0
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(FAM6Conversation, "FAM6AUD", "FAM6_JLOSE", CONV_PRIORITY_MEDIUM)
iLoseCopsReminderCount++
iLoseCopsReminderTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(12500, 15000)
IF ( iLoseCopsReminderCount >= 5 )
SET_LABEL_AS_TRIGGERED("FAM6_JLOSE_5", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
//keep reseting those flags during wanted level as the player might be driving recklessly
CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_PED(PLAYER_ID())
CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_NON_ANIMAL_PED(PLAYER_ID())
ELSE
//IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
// IF NOT IS_FACE_TO_FACE_CONVERSATION_PAUSED()
// PAUSE_FACE_TO_FACE_CONVERSATION(TRUE)
// ENDIF
//ENDIF
ENDIF
ENDIF
//play interrupt conversations for player offences
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
IF ( GET_GAME_TIMER() - iPlayerOffenceTimer > 5000 )
//play conversation for player running over peds
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM6_JBAD_5")
AND NOT HAS_LABEL_BEEN_TRIGGERED("FAM6_JWARN_6")
IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF HAS_PLAYER_DAMAGED_AT_LEAST_ONE_NON_ANIMAL_PED(PLAYER_ID())
AND HAS_ENTITY_COLLIDED_WITH_ANYTHING(GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID()))
bPlayerHitPed = TRUE
ENDIF
ENDIF
IF IS_PED_SHOOTING(PLAYER_PED_ID()) //add more conditions here if needed
bPlayerActingBad = TRUE
ENDIF
IF ( bPlayerHitPed = TRUE OR bPlayerActingBad = TRUE )
IF HAS_LABEL_BEEN_TRIGGERED("FAM6_TATT2")
OR HAS_LABEL_BEEN_TRIGGERED("FAM6_TATTOO")
OR HAS_LABEL_BEEN_TRIGGERED("FAM6_JTALK")
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
CurrentConversationRoot = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_ROOT()
IF NOT IS_STRING_NULL_OR_EMPTY(CurrentConversationRoot)
IF ARE_STRINGS_EQUAL(CurrentConversationRoot, "FAM6_TATT2")
OR ARE_STRINGS_EQUAL(CurrentConversationRoot, "FAM6_TATTOO")
OR ARE_STRINGS_EQUAL(CurrentConversationRoot, "FAM6_JTALK")
CurrentConversationRoot = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_ROOT()
CurrentConversationLabel = GET_STANDARD_CONVERSATION_LABEL_FOR_FUTURE_RESUMPTION()
bCurrentConversationInterrupted = TRUE
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM6_JTALK") //if jimmy did no start his talk for player messing around
IF CREATE_CONVERSATION(FAM6Conversation, "FAM6AUD", "FAM6_JBAD", CONV_PRIORITY_MEDIUM)
iPlayerOffencesCount++
iBadConversationCount++
bPlayerHitPed = FALSE
bPlayerActingBad = FALSE
iPlayerOffenceTimer = GET_GAME_TIMER()
SET_LABEL_AS_TRIGGERED("FAM6_JBAD", TRUE)
IF ( iBadConversationCount >= 5 )
SET_LABEL_AS_TRIGGERED("FAM6_JBAD_5", TRUE)
ENDIF
CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_PED(PLAYER_ID())
CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_NON_ANIMAL_PED(PLAYER_ID())
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": iPlayerOffencesCount: ", iPlayerOffencesCount, ".")
#ENDIF
ENDIF
ELSE //if jimmy started his talk for player messing around
IF CREATE_CONVERSATION(FAM6Conversation, "FAM6AUD", "FAM6_JWARN", CONV_PRIORITY_MEDIUM)
iPlayerOffencesCount++
iBadConversationCount++
bPlayerHitPed = FALSE
bPlayerActingBad = FALSE
iPlayerOffenceTimer = GET_GAME_TIMER()
SET_LABEL_AS_TRIGGERED("FAM6_JWARN", TRUE)
IF ( iBadConversationCount >= 6 )
SET_LABEL_AS_TRIGGERED("FAM6_JWARN_6", TRUE)
ENDIF
CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_PED(PLAYER_ID())
CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_NON_ANIMAL_PED(PLAYER_ID())
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": iPlayerOffencesCount: ", iPlayerOffencesCount, ".")
#ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_PED(PLAYER_ID())
CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_NON_ANIMAL_PED(PLAYER_ID())
ENDIF
ENDIF
//play conversation when more than 3 offences have been commited
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM6_JTALK")
IF ( iPlayerOffencesCount >= 3 )
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF IS_PED_IN_VEHICLE(psJimmy.PedIndex, GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()))
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(FAM6Conversation, "FAM6AUD", "FAM6_JTALK", CONV_PRIORITY_MEDIUM)
bCurrentConversationInterrupted = FALSE
SET_LABEL_AS_TRIGGERED("FAM6_JTALK", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM6_ARRIVE")
IF ( bDestinationReached = TRUE )
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(FAM6Conversation, "FAM6AUD", "FAM6_ARRIVE", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("FAM6_ARRIVE", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF ( bRunConversationPausingCheck = TRUE )
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF IS_PED_IN_VEHICLE(psJimmy.PedIndex, GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()))
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF IS_FACE_TO_FACE_CONVERSATION_PAUSED()
PAUSE_FACE_TO_FACE_CONVERSATION(FALSE)
ENDIF
ENDIF
ELSE
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_FACE_TO_FACE_CONVERSATION_PAUSED()
PAUSE_FACE_TO_FACE_CONVERSATION(TRUE)
ENDIF
ENDIF
ENDIF
ELIF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
AND NOT IS_PED_IN_ANY_VEHICLE(psJimmy.PedIndex)
IF GET_DISTANCE_BETWEEN_ENTITIES(psJimmy.PedIndex, PLAYER_PED_ID()) < 10
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF IS_FACE_TO_FACE_CONVERSATION_PAUSED()
PAUSE_FACE_TO_FACE_CONVERSATION(FALSE)
ENDIF
ENDIF
ELSE
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_FACE_TO_FACE_CONVERSATION_PAUSED()
PAUSE_FACE_TO_FACE_CONVERSATION(TRUE)
ENDIF
ENDIF
ENDIF
ELSE
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_FACE_TO_FACE_CONVERSATION_PAUSED()
PAUSE_FACE_TO_FACE_CONVERSATION(TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
PROC MANAGE_TATTOO_PARLOR_SCENE(INT &iProgress)
SWITCH iProgress
CASE 0
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), vTattooShopScenePosition) < 150.0
iProgress++
ENDIF
BREAK
CASE 1
REQUEST_MODEL(psTracey.ModelName)
REQUEST_MODEL(psLazlow.ModelName)
REQUEST_ANIM_DICT("missfam6leadinoutfam_6_mcs_2")
IF HAS_MODEL_LOADED(psTracey.ModelName)
AND HAS_MODEL_LOADED(psLazlow.ModelName)
AND HAS_ANIM_DICT_LOADED("missfam6leadinoutfam_6_mcs_2")
IF HAS_MISSION_PED_BEEN_CREATED(psTracey, FALSE, RELGROUPHASH_PLAYER, FALSE, CHAR_TRACEY)
AND HAS_MISSION_PED_BEEN_CREATED(psLazlow, FALSE, RELGROUPHASH_PLAYER, FALSE, NO_CHARACTER)
SET_TRACEY_PED_COMPONENT_VARIATIONS(psTracey.bComponentVariationsSet)
SET_LAZLOW_PED_COMPONENT_VARIATIONS(psLazlow.bComponentVariationsSet, FALSE, FALSE, FALSE, FALSE, FALSE)
IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iTattooShopSceneID)
iTattooShopSceneID = CREATE_SYNCHRONIZED_SCENE(vTattooShopScenePosition, vTattooShopSceneRotation)
SET_SYNCHRONIZED_SCENE_LOOPED(iTattooShopSceneID, TRUE)
TASK_SYNCHRONIZED_SCENE(psTracey.PedIndex, iTattooShopSceneID, "missfam6leadinoutfam_6_mcs_2", "_leadin_loop_tracy", INSTANT_BLEND_IN, NORMAL_BLEND_OUT)
FORCE_PED_AI_AND_ANIMATION_UPDATE(psTracey.PedIndex)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(psTracey.PedIndex, TRUE)
TASK_SYNCHRONIZED_SCENE(psLazlow.PedIndex, iTattooShopSceneID, "missfam6leadinoutfam_6_mcs_2", "_leadin_loop_lazlow", INSTANT_BLEND_IN, NORMAL_BLEND_OUT)
FORCE_PED_AI_AND_ANIMATION_UPDATE(psLazlow.PedIndex)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(psLazlow.PedIndex, TRUE)
SET_MODEL_AS_NO_LONGER_NEEDED(psTracey.ModelName)
SET_MODEL_AS_NO_LONGER_NEEDED(psLazlow.ModelName)
iProgress++
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDPROC
PROC MANAGE_AMANDA_AND_FABIEN_DURING_GO_TO_TRACEY()
IF DOES_ENTITY_EXIST(psFabien.PedIndex)
AND DOES_ENTITY_EXIST(psAmanda.PedIndex)
AND DOES_ENTITY_EXIST(vsAmandasCar.VehicleIndex)
IF NOT IS_ENTITY_DEAD(psFabien.PedIndex)
AND NOT IS_ENTITY_DEAD(psAmanda.PedIndex)
AND NOT IS_ENTITY_DEAD(vsAmandasCar.VehicleIndex)
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(vsAmandasCar.VehicleIndex)) > 125.0
SET_PED_KEEP_TASK(psAmanda.PedIndex, TRUE)
SET_PED_AS_NO_LONGER_NEEDED(psAmanda.PedIndex)
SET_PED_KEEP_TASK(psFabien.PedIndex, TRUE)
SET_PED_AS_NO_LONGER_NEEDED(psFabien.PedIndex)
SET_VEHICLE_AS_NO_LONGER_NEEDED(vsAmandasCar.VehicleIndex)
ENDIF
ENDIF
ENDIF
ENDPROC
FUNC BOOL IS_MISSION_STAGE_DRIVE_TO_TRACEY_COMPLETED(INT &iStageProgress)
SET_BIT(sLocatesData.iLocatesBitSet, BS_DONT_DO_J_SKIP)
MANAGE_CONVERSATIONS_DURING_GO_TO_TRACEY()
MANAGE_AMANDA_AND_FABIEN_DURING_GO_TO_TRACEY()
MANAGE_TATTOO_PARLOR_SCENE(iTattooParlorSceneProgress)
//handle requestting mocap cutscene
IF IS_PLAYER_BROWSING_ITEMS_IN_ANY_SHOP()
OR IS_PLAYER_CHANGING_CLOTHES()
IF HAS_THIS_CUTSCENE_LOADED("fam_6_mcs_2_concat")
OR HAS_CUTSCENE_LOADED()
OR IS_CUTSCENE_ACTIVE()
REMOVE_CUTSCENE()
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Player browsing items in a shop or changing clothes. Removing cutscene.")
#ENDIF
ENDIF
ELSE
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), vTattooShopPosition) < DEFAULT_CUTSCENE_LOAD_DIST / 2
REQUEST_CUTSCENE("fam_6_mcs_2_concat")
IF NOT IS_INTERIOR_READY(GET_INTERIOR_AT_COORDS(vTattooShopScenePosition))
PIN_INTERIOR_IN_MEMORY(GET_INTERIOR_AT_COORDS(vTattooShopScenePosition))
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Pinning interior at coordinates ", vTattooShopScenePosition, " in memory.")
#ENDIF
ENDIF
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", PLAYER_PED_ID())
SET_JIMMY_CUTSCENE_COMPONENT_VARIATIONS()
SET_TRACEY_CUTSCENE_COMPONENT_VARIATIONS()
SET_LAZLOW_CUTSCENE_COMPONENT_VARIATIONS(FALSE, FALSE, FALSE, FALSE, FALSE)
ENDIF
ELSE
IF IS_INTERIOR_READY(GET_INTERIOR_AT_COORDS(vTattooShopScenePosition))
UNPIN_INTERIOR(GET_INTERIOR_AT_COORDS(vTattooShopScenePosition))
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Unpinning interior at coordinates ", vTattooShopScenePosition, ".")
#ENDIF
ENDIF
IF HAS_THIS_CUTSCENE_LOADED("fam_6_mcs_2_concat")
OR HAS_CUTSCENE_LOADED()
OR IS_CUTSCENE_ACTIVE()
REMOVE_CUTSCENE()
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Player too far away from destination to keep cutscene in memory. Removing cutscene.")
#ENDIF
ENDIF
ENDIF
ENDIF
SWITCH iStageProgress
CASE 0
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
IF IS_SCREEN_FADED_OUT()
FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_ON_FOOT_WALK, FALSE, FAUS_DEFAULT, TRUE)
SIMULATE_PLAYER_INPUT_GAIT(PLAYER_ID(), PEDMOVE_WALK, 2000)
ENDIF
ENDIF
IF NOT IS_PED_INJURED(psJimmy.PedIndex)
IF ( GET_SCRIPT_TASK_STATUS(psJimmy.PedIndex, SCRIPT_TASK_ENTER_VEHICLE) != PERFORMING_TASK )
IF DOES_ENTITY_EXIST(vsMichaelsCar.VehicleIndex) AND NOT IS_ENTITY_DEAD(vsMichaelsCar.VehicleIndex)
TASK_ENTER_VEHICLE(psJimmy.PedIndex, vsMichaelsCar.VehicleIndex, DEFAULT_TIME_BEFORE_WARP * 3, VS_FRONT_RIGHT, PEDMOVE_WALK)
FORCE_PED_MOTION_STATE(psJimmy.PedIndex, MS_ON_FOOT_WALK, FALSE, FAUS_DEFAULT, TRUE)
ENDIF
ENDIF
ENDIF
IF IS_SCREEN_FADED_OUT()
WAIT(2)
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
ENDIF
IF HAS_LABEL_BEEN_TRIGGERED("FAM6_JIM")
REPLAY_RECORD_BACK_FOR_TIME(0.0, 6.0, REPLAY_IMPORTANCE_HIGHEST)
SET_LOCATES_BUDDIES_TO_GET_INTO_NEAREST_CAR(sLocatesData, vsMichaelsCar.VehicleIndex)
START_AUDIO_SCENE("FAMILY_6_DRIVE_TO_TATTOO")
iStageProgress++
ENDIF
BREAK
CASE 1
IS_PLAYER_AT_LOCATION_WITH_BUDDY_ANY_MEANS(sLocatesData, vTattooShopPosition, DEFAULT_LOCATES_SIZE_VECTOR(), TRUE, psJimmy.PedIndex, "FAM6_TATTOO", "CMN_JLEAVE", FALSE, TRUE)
//do the check to progress the stage here
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
IF ARE_PEDS_IN_THE_SAME_VEHICLE(PLAYER_PED_ID(), psJimmy.PedIndex)
//locate to park the car
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<302.371002,172.648605,102.820877>>, <<294.813934,175.443298,106.071678>>, 5.0)
AND IS_ENTITY_IN_ANGLED_AREA(psJimmy.PedIndex, <<302.371002,172.648605,102.820877>>, <<294.813934,175.443298,106.071678>>, 5.0)
IF IS_VEHICLE_ON_ALL_WHEELS(GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID()))
CLEAR_MISSION_LOCATION_TEXT_AND_BLIPS(sLocatesData)
KILL_ANY_CONVERSATION()
KILL_FACE_TO_FACE_CONVERSATION() //kill conversations and let last line play out
bDestinationReached = TRUE
iStageProgress++
ENDIF
ENDIF
//bigger locate around the tattoo parlor entrance
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<320.562500,178.723297,102.389084>>, <<317.622711,170.784821,106.276665>>, 12.5)
AND IS_ENTITY_IN_ANGLED_AREA(psJimmy.PedIndex, <<320.562500,178.723297,102.389084>>, <<317.622711,170.784821,106.276665>>, 12.5)
IF IS_VEHICLE_ON_ALL_WHEELS(GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID()))
CLEAR_MISSION_LOCATION_TEXT_AND_BLIPS(sLocatesData)
KILL_ANY_CONVERSATION()
KILL_FACE_TO_FACE_CONVERSATION() //kill conversations and let last line play out
bDestinationReached = TRUE
iStageProgress++
ENDIF
ENDIF
ELSE
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<314.117126,180.860062,102.418434>>, <<309.434204,168.080780,106.292229>>, 28.0)
AND IS_ENTITY_IN_ANGLED_AREA(psJimmy.PedIndex, <<314.117126,180.860062,102.418434>>, <<309.434204,168.080780,106.292229>>, 28.0)
IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF IS_VEHICLE_ON_ALL_WHEELS(GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID()))
CLEAR_MISSION_LOCATION_TEXT_AND_BLIPS(sLocatesData)
KILL_ANY_CONVERSATION()
KILL_FACE_TO_FACE_CONVERSATION() //kill conversations and let last line play out
bDestinationReached = TRUE
iStageProgress++
ENDIF
ELSE
CLEAR_MISSION_LOCATION_TEXT_AND_BLIPS(sLocatesData)
KILL_ANY_CONVERSATION()
KILL_FACE_TO_FACE_CONVERSATION() //kill conversations and let last line play out
bDestinationReached = TRUE
iStageProgress++
ENDIF
ELSE
//player is on foot in the locate, jimmy is in player group but not in locate but still nearby, fix for B*1982582
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<314.117126,180.860062,102.418434>>, <<309.434204,168.080780,106.292229>>, 28.0)
IF NOT IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF NOT IS_PED_INJURED(psJimmy.PedIndex) AND IS_PED_IN_GROUP(psJimmy.PedIndex)
CLEAR_MISSION_LOCATION_TEXT_AND_BLIPS(sLocatesData)
KILL_ANY_CONVERSATION()
KILL_FACE_TO_FACE_CONVERSATION() //kill conversations and let last line play out
bDestinationReached = TRUE
iStageProgress++
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE 2
IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID()), DEFAULT_VEH_STOPPING_DISTANCE)
IF NOT IS_SCRIPTED_CONVERSATION_ONGOING() //check if scripted conversations are not ongoing using native command
OR NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() //check if any conversations are not ongoing using script command
iStageProgress++
ENDIF
ENDIF
ELSE
IF NOT IS_SCRIPTED_CONVERSATION_ONGOING() //check if scripted conversations are not ongoing using native command
OR NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() //check if any conversations are not ongoing using script command
iStageProgress++
ENDIF
ENDIF
BREAK
CASE 3
IS_PLAYER_AT_LOCATION_WITH_BUDDY_ANY_MEANS(sLocatesData, vTattooShopDoorPosition, DEFAULT_LOCATES_SIZE_VECTOR(), TRUE, psJimmy.PedIndex, "", "", FALSE, TRUE)
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<309.861786,176.901199,101.957222>>, <<324.602966,171.513519,106.653946>>, 15.0)
DISABLE_CELLPHONE_THIS_FRAME_ONLY()
UPDATE_BLOCKED_PLAYER_FOR_LEAD_IN(TRUE)
SUPPRESS_CONTEXT_BUTTON_ACTIONS_THIS_FRAME()
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED)
HIDE_PED_WEAPON_FOR_SCRIPTED_CUTSCENE(PLAYER_PED_ID(), TRUE)
SET_PED_MAX_MOVE_BLEND_RATIO(PLAYER_PED_ID(), PEDMOVE_WALK)
ENDIF
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<321.037598,178.496094,102.441963>>, <<319.134644,173.429993,106.266571>>, 6.0)
CLEAR_MISSION_LOCATION_TEXT_AND_BLIPS(sLocatesData)
iStageProgress++
ENDIF
BREAK
CASE 4
IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID()), 3.0)
TASK_LEAVE_ANY_VEHICLE(PLAYER_PED_ID())
REPLAY_RECORD_BACK_FOR_TIME(4.0, 6.0, REPLAY_IMPORTANCE_HIGHEST)
iStageProgress++
ENDIF
ELSE
REPLAY_RECORD_BACK_FOR_TIME(4.0, 6.0, REPLAY_IMPORTANCE_HIGHEST)
iStageProgress++
ENDIF
BREAK
CASE 5
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
CLEANUP_PED(psAmanda, TRUE)
CLEANUP_PED(psFabien, TRUE)
IF DOES_ENTITY_EXIST(vsAmandasCar.VehicleIndex)
DELETE_VEHICLE(vsAmandasCar.VehicleIndex)
ENDIF
RETURN TRUE
ENDIF
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
FUNC BOOL IS_MISSION_STAGE_CUTSCENE_SHOP_1_COMPLETED(INT &iStageProgress)
SWITCH iStageProgress
CASE 0
IF HAS_REQUESTED_CUTSCENE_LOADED("fam_6_mcs_2_concat")
IF NOT IS_PED_INJURED(psJimmy.PedIndex)
IF IS_PED_GROUP_MEMBER(psJimmy.PedIndex, PLAYER_GROUP_ID())
REMOVE_PED_FROM_GROUP(psJimmy.PedIndex)
ENDIF
REGISTER_ENTITY_FOR_CUTSCENE(psJimmy.PedIndex, "Jimmy", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, psJimmy.ModelName)
ENDIF
IF NOT IS_PED_INJURED(psTracey.PedIndex)
REGISTER_ENTITY_FOR_CUTSCENE(psTracey.PedIndex, "Tracy", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, psTracey.ModelName)
ENDIF
IF NOT IS_PED_INJURED(psLazlow.PedIndex)
REGISTER_ENTITY_FOR_CUTSCENE(psLazlow.PedIndex, "Lazlow", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, psLazlow.ModelName)
ENDIF
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
STOP_AUDIO_SCENES()
START_CUTSCENE()
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
iStageProgress++
ELSE
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", PLAYER_PED_ID(), PLAYER_ZERO)
SET_JIMMY_CUTSCENE_COMPONENT_VARIATIONS()
SET_TRACEY_CUTSCENE_COMPONENT_VARIATIONS()
SET_LAZLOW_CUTSCENE_COMPONENT_VARIATIONS(FALSE, FALSE, FALSE, FALSE, FALSE)
ENDIF
ENDIF
BREAK
CASE 1 //fade screen in if screen was faded out due to shit skip or debug skip
IF IS_CUTSCENE_PLAYING()
VEHICLE_INDEX LastPlayerVehicleIndex
LastPlayerVehicleIndex = GET_PLAYERS_LAST_VEHICLE()
IF DOES_ENTITY_EXIST(LastPlayerVehicleIndex)
IF NOT IS_ENTITY_DEAD(LastPlayerVehicleIndex)
IF IS_VEHICLE_AVAILABLE_TO_SNAPSHOT(PLAYER_PED_ID(), LastPlayerVehicleIndex, TRUE)
IF NOT IS_ENTITY_A_MISSION_ENTITY(LastPlayerVehicleIndex)
SET_ENTITY_AS_MISSION_ENTITY(LastPlayerVehicleIndex)
SET_VEHICLE_AS_NO_LONGER_NEEDED(vsMichaelsCar.VehicleIndex)
vsMichaelsCar.VehicleIndex = LastPlayerVehicleIndex
ENDIF
STOP_VEHICLE_FIRE(LastPlayerVehicleIndex)
SET_ENTITY_COORDS(LastPlayerVehicleIndex, vsMichaelsCar.vPosition)
SET_ENTITY_HEADING(LastPlayerVehicleIndex, vsMichaelsCar.fHeading)
SET_VEHICLE_ON_GROUND_PROPERLY(LastPlayerVehicleIndex)
SET_VEHICLE_DOORS_SHUT(LastPlayerVehicleIndex, TRUE)
SET_VEHICLE_ENGINE_ON(LastPlayerVehicleIndex, FALSE, TRUE)
OVERRIDE_REPLAY_CHECKPOINT_VEHICLE(LastPlayerVehicleIndex)
ENDIF
ENDIF
ENDIF
DESTROY_ALL_CAMS()
RENDER_SCRIPT_CAMS(FALSE, FALSE)
REMOVE_ANIM_DICT("missfam6leadinoutfam_6_mcs_2")
CLEAR_AREA_OF_COPS(MissionPosition.vPosition, 100.0)
CLEAR_AREA_OF_PEDS(MissionPosition.vPosition, 100.0)
CLEAR_AREA_OF_OBJECTS(MissionPosition.vPosition, 100.0)
CLEAR_AREA_OF_VEHICLES(MissionPosition.vPosition, 100.0)
CLEAR_AREA_OF_PROJECTILES(MissionPosition.vPosition, 100.0)
REMOVE_PARTICLE_FX_IN_RANGE(MissionPosition.vPosition, 100.0)
IF IS_SCREEN_FADED_OUT()
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
ENDIF
iStageProgress++
ENDIF
BREAK
CASE 2
REQUEST_MODEL(osPiercingGun.ModelName)
REQUEST_ANIM_DICT("missfam6ig_1_pierce")
REQUEST_ANIM_DICT("missfam6ig_7_tattoo")
REQUEST_SCRIPT_AUDIO_BANK("FAM6_PIERCING_GUN")
IF NOT DOES_CAM_EXIST(ScriptedCamera)
ScriptedCamera = CREATE_CAMERA(CAMTYPE_SCRIPTED, TRUE)
SET_CAM_PARAMS(ScriptedCamera, << 323.4799, 178.8823, 104.7932 >>, << -23.9135, 13.3903, -17.3261 >>, 25.0)
SHAKE_CAM(ScriptedCamera,"HAND_SHAKE",0.5)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
ENDIF
IF NOT DOES_CAM_EXIST(AnimatedCamera)
AnimatedCamera = CREATE_CAMERA(CAMTYPE_ANIMATED, FALSE)
ENDIF
IF CAN_SET_EXIT_STATE_FOR_CAMERA()
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_SET_EXIT_STATE_FOR_CAMERA() returned true for camera.")
#ENDIF
REPLAY_STOP_EVENT()
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Jimmy")
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY() returned true for Jimmy.")
#ENDIF
IF NOT IS_PED_INJURED(psJimmy.PedIndex)
SET_PED_COMPONENT_VARIATION(psJimmy.PedIndex, PED_COMP_BERD, 0, 0)
IF ( bCutsceneSkipped = FALSE )
WARP_PED(psJimmy.PedIndex, psJimmy.vPosition, psJimmy.fHeading, FALSE, FALSE, FALSE)
TASK_PLAY_ANIM(psJimmy.PedIndex, "missfam6ig_7_tattoo", "ig_7_idle_01_jimmy", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1, AF_LOOPING | AF_NOT_INTERRUPTABLE)
FORCE_PED_AI_AND_ANIMATION_UPDATE(psJimmy.PedIndex)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(psJimmy.PedIndex, TRUE)
ENDIF
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Tracy")
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY() returned true for Tracy.")
#ENDIF
IF NOT IS_PED_INJURED(psTracey.PedIndex)
IF ( bCutsceneSkipped = FALSE )
WARP_PED(psTracey.PedIndex, psTracey.vPosition, psTracey.fHeading, FALSE, FALSE, FALSE)
TASK_PLAY_ANIM(psTracey.PedIndex, "missfam6ig_7_tattoo", "ig_7_idle_02_tracey", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1, AF_LOOPING | AF_NOT_INTERRUPTABLE)
FORCE_PED_AI_AND_ANIMATION_UPDATE(psTracey.PedIndex)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(psTracey.PedIndex, TRUE)
ENDIF
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Lazlow")
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY() returned true for Lazlow.")
#ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michael")
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY() returned true for Michael.")
#ENDIF
IF ( bCutsceneSkipped = FALSE )
IF HAS_MODEL_LOADED(osPiercingGun.ModelName)
AND HAS_ANIM_DICT_LOADED("missfam6ig_1_pierce")
AND HAS_ANIM_DICT_LOADED("missfam6ig_7_tattoo")
AND REQUEST_SCRIPT_AUDIO_BANK("FAM6_PIERCING_GUN")
IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iPierceSceneID)
iPierceSceneID = CREATE_SYNCHRONIZED_SCENE(<< 324.130, 181.290, 102.600 >>,<< 0, 0, -22.320 >>)
IF HAS_MISSION_OBJECT_BEEN_CREATED(osPiercingGun)
IF DOES_ENTITY_EXIST(osPiercingGun.ObjectIndex) AND NOT IS_ENTITY_DEAD(osPiercingGun.ObjectIndex)
ATTACH_ENTITY_TO_ENTITY(osPiercingGun.ObjectIndex, 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>>)
ENDIF
ENDIF
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
TASK_SYNCHRONIZED_SCENE(PLAYER_PED_ID(), iPierceSceneID, "missfam6ig_1_pierce", "ig_1_loop_michael", INSTANT_BLEND_IN, SLOW_BLEND_OUT )
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID())
ENDIF
IF NOT IS_PED_INJURED(psLazlow.PedIndex)
TASK_SYNCHRONIZED_SCENE(psLazlow.PedIndex, iPierceSceneID, "missfam6ig_1_pierce", "ig_1_loop_lazlow", INSTANT_BLEND_IN, SLOW_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT )
FORCE_PED_AI_AND_ANIMATION_UPDATE(psLazlow.PedIndex)
ENDIF
iStageProgress++
ENDIF
ENDIF
ENDIF
ENDIF
IF HAS_CUTSCENE_FINISHED()
IF ( bCutsceneSkipped = TRUE )
IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iPierceSceneID)
IF HAS_MODEL_LOADED(osPiercingGun.ModelName)
AND HAS_ANIM_DICT_LOADED("missfam6ig_1_pierce")
AND HAS_ANIM_DICT_LOADED("missfam6ig_7_tattoo")
AND REQUEST_SCRIPT_AUDIO_BANK("FAM6_PIERCING_GUN")
iPierceSceneID = CREATE_SYNCHRONIZED_SCENE(<< 324.130, 181.290, 102.600 >>,<< 0, 0, -22.320 >>)
IF HAS_MISSION_OBJECT_BEEN_CREATED(osPiercingGun)
IF DOES_ENTITY_EXIST(osPiercingGun.ObjectIndex) AND NOT IS_ENTITY_DEAD(osPiercingGun.ObjectIndex)
ATTACH_ENTITY_TO_ENTITY(osPiercingGun.ObjectIndex, 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>>)
ENDIF
ENDIF
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
TASK_SYNCHRONIZED_SCENE(PLAYER_PED_ID(), iPierceSceneID, "missfam6ig_1_pierce", "ig_1_loop_michael", INSTANT_BLEND_IN, SLOW_BLEND_OUT )
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID())
ENDIF
IF NOT IS_PED_INJURED(psLazlow.PedIndex)
TASK_SYNCHRONIZED_SCENE(psLazlow.PedIndex, iPierceSceneID, "missfam6ig_1_pierce", "ig_1_loop_lazlow", INSTANT_BLEND_IN, SLOW_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT )
FORCE_PED_AI_AND_ANIMATION_UPDATE(psLazlow.PedIndex)
ENDIF
IF NOT IS_PED_INJURED(psJimmy.PedIndex)
WARP_PED(psJimmy.PedIndex, psJimmy.vPosition, psJimmy.fHeading, FALSE, FALSE, FALSE)
TASK_PLAY_ANIM(psJimmy.PedIndex, "missfam6ig_7_tattoo", "ig_7_idle_01_jimmy", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1, AF_LOOPING | AF_NOT_INTERRUPTABLE)
FORCE_PED_AI_AND_ANIMATION_UPDATE(psJimmy.PedIndex)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(psJimmy.PedIndex, TRUE)
ENDIF
IF NOT IS_PED_INJURED(psTracey.PedIndex)
WARP_PED(psTracey.PedIndex, psTracey.vPosition, psTracey.fHeading, FALSE, FALSE, FALSE)
TASK_PLAY_ANIM(psTracey.PedIndex, "missfam6ig_7_tattoo", "ig_7_idle_02_tracey", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1, AF_LOOPING | AF_NOT_INTERRUPTABLE)
FORCE_PED_AI_AND_ANIMATION_UPDATE(psTracey.PedIndex)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(psTracey.PedIndex, TRUE)
ENDIF
iStageProgress++
ENDIF
ENDIF
ELSE
IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iPierceSceneID)
iStageProgress++
ENDIF
ENDIF
ELSE
IF ( bCutsceneSkipped = FALSE )
IF WAS_CUTSCENE_SKIPPED()
SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, FALSE, FALSE) //if cutscene was skipped, fade out and don't fade in
bCutsceneSkipped = TRUE
ENDIF
ENDIF
ENDIF
BREAK
CASE 3
SET_MODEL_AS_NO_LONGER_NEEDED(osPiercingGun.ModelName)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
IF IS_SCREEN_FADED_OUT()
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
ENDIF
RETURN TRUE
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
PROC MANAGE_PIERCING_HELP_TEXT()
IF DOES_CAM_EXIST(ScriptedCamera)
AND DOES_CAM_EXIST(AnimatedCamera)
IF IS_CAM_ACTIVE(ScriptedCamera)
AND NOT IS_CAM_ACTIVE(AnimatedCamera)
IF IS_SCREEN_FADED_IN()
AND NOT IS_SCREEN_FADING_IN()
IF NOT bBrow AND NOT bNose AND NOT bEar
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM6_PIERC0")
PRINT_HELP_FOREVER("FAM6_PIERC0")
SET_LABEL_AS_TRIGGERED("FAM6_PIERC0", TRUE)
ENDIF
ELIF NOT bBrow AND NOT bNose AND bEar
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM6_PIERC1")
PRINT_HELP_FOREVER("FAM6_PIERC1")
SET_LABEL_AS_TRIGGERED("FAM6_PIERC1", TRUE)
ENDIF
ELIF NOT bBrow AND bNose AND NOT bEar
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM6_PIERC2")
PRINT_HELP_FOREVER("FAM6_PIERC2")
SET_LABEL_AS_TRIGGERED("FAM6_PIERC2", TRUE)
ENDIF
ELIF bBrow AND NOT bNose AND NOT bEar
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM6_PIERC3")
PRINT_HELP_FOREVER("FAM6_PIERC3")
SET_LABEL_AS_TRIGGERED("FAM6_PIERC3", TRUE)
ENDIF
ELIF NOT bBrow AND bNose AND bEar
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM6_PIERC4")
PRINT_HELP_FOREVER("FAM6_PIERC4")
SET_LABEL_AS_TRIGGERED("FAM6_PIERC4", TRUE)
ENDIF
ELIF bBrow AND NOT bNose AND bEar
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM6_PIERC5")
PRINT_HELP_FOREVER("FAM6_PIERC5")
SET_LABEL_AS_TRIGGERED("FAM6_PIERC5", TRUE)
ENDIF
ELIF bBrow AND bNose AND NOT bEar
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM6_PIERC6")
PRINT_HELP_FOREVER("FAM6_PIERC6")
SET_LABEL_AS_TRIGGERED("FAM6_PIERC6", TRUE)
ENDIF
ENDIF
ENDIF
ELSE
IF IS_HELP_MESSAGE_BEING_DISPLAYED()
CLEAR_HELP()
ENDIF
ENDIF
ENDIF
ENDPROC
PROC MANAGE_PIERCING_STAGES()
SWITCH ePiercingStage
CASE PIERCING_IDLE
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF IS_SYNCHRONIZED_SCENE_RUNNING(iPierceSceneID)
IF ( iConversationTimer != 0 )
IF GET_GAME_TIMER() - iConversationTimer > 0
IF NOT bBrow AND NOT bNose AND NOT bEar
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM6_IDLEP_5")
IF CREATE_CONVERSATION(FAM6Conversation, "FAM6AUD", "FAM6_IDLEP", CONV_PRIORITY_MEDIUM)
iIdleConversationcounter++
iConversationTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(7500, 12500)
IF ( iIdleConversationcounter >= 5 )
SET_LABEL_AS_TRIGGERED("FAM6_IDLEP_5", TRUE)
ENDIF
ENDIF
ENDIF
ELSE
SWITCH GET_RANDOM_INT_IN_RANGE(0, 3)
CASE 0
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM6_IDLEP_5")
IF CREATE_CONVERSATION(FAM6Conversation, "FAM6AUD", "FAM6_IDLEP", CONV_PRIORITY_MEDIUM)
iIdleConversationcounter++
iConversationTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(7500, 12500)
IF ( iIdleConversationcounter >= 5 )
SET_LABEL_AS_TRIGGERED("FAM6_IDLEP_5", TRUE)
ENDIF
ENDIF
ENDIF
BREAK
CASE 1
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM6_P1_3")
IF CREATE_CONVERSATION(FAM6Conversation, "FAM6AUD", "FAM6_P1", CONV_PRIORITY_MEDIUM)
iIdle1Conversationcounter++
iConversationTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(7500, 12500)
IF ( iIdle1Conversationcounter >= 3 )
SET_LABEL_AS_TRIGGERED("FAM6_P1_3", TRUE)
ENDIF
ENDIF
ENDIF
BREAK
CASE 2
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM6_P2_2")
IF CREATE_CONVERSATION(FAM6Conversation, "FAM6AUD", "FAM6_P2", CONV_PRIORITY_MEDIUM)
iIdle2Conversationcounter++
iConversationTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(7500, 12500)
IF ( iIdle2Conversationcounter >= 2 )
SET_LABEL_AS_TRIGGERED("FAM6_P2_2", TRUE)
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
ENDIF
IF ( iStruggleConversationTimer != 0 )
IF GET_GAME_TIMER() - iStruggleConversationTimer > 0
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(FAM6Conversation, "FAM6AUD", "FAM6_STRUG", CONV_PRIORITY_MEDIUM, DO_NOT_DISPLAY_SUBTITLES)
iStruggleConversationTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(3500, 6000)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE PIERCING_BROW
IF IS_SYNCHRONIZED_SCENE_RUNNING(iPierceSceneID) AND GET_SYNCHRONIZED_SCENE_PHASE(iPierceSceneID) >= 0.068
SET_CONTROL_SHAKE(PLAYER_CONTROL, 200, 256)
PLAY_SOUND_FROM_ENTITY(-1, "Pierce", osPiercingGun.ObjectIndex, "FAMILY_6_SOUNDS")
IF ( iConversationCounter < 2 )
IF CREATE_CONVERSATION(FAM6Conversation, "FAM6AUD", "FAM6_BROW", CONV_PRIORITY_MEDIUM)
iConversationCounter++
ENDIF
ENDIF
IF NOT bEar AND NOT bNose
SET_PED_COMPONENT_VARIATION(psLazlow.PedIndex, PED_COMP_SPECIAL2, 0, 2)
ELIF bEar AND NOT bNose
SET_PED_COMPONENT_VARIATION(psLazlow.PedIndex, PED_COMP_SPECIAL2, 0, 5)
ELIF NOT bEar AND bNose
SET_PED_COMPONENT_VARIATION(psLazlow.PedIndex, PED_COMP_SPECIAL2, 0, 6)
ELIF bEar AND bNose
SET_PED_COMPONENT_VARIATION(psLazlow.PedIndex, PED_COMP_SPECIAL2, 0, 7)
ENDIF
ePiercingStage = PIERCING_IDLE
iConversationTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(1000, 2000)
ELSE
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDIF
ENDIF
BREAK
CASE PIERCING_NOSE
IF IS_SYNCHRONIZED_SCENE_RUNNING(iPierceSceneID) AND GET_SYNCHRONIZED_SCENE_PHASE(iPierceSceneID) >= 0.075
SET_CONTROL_SHAKE(PLAYER_CONTROL, 200, 256)
PLAY_SOUND_FROM_ENTITY(-1, "Pierce", osPiercingGun.ObjectIndex, "FAMILY_6_SOUNDS")
IF ( iConversationCounter < 2 )
IF CREATE_CONVERSATION(FAM6Conversation, "FAM6AUD", "FAM6_NOSE", CONV_PRIORITY_MEDIUM)
iConversationCounter++
ENDIF
ENDIF
IF NOT bEar AND NOT bBrow
SET_PED_COMPONENT_VARIATION(psLazlow.PedIndex, PED_COMP_SPECIAL2, 0, 3)
ELIF bEar AND NOT bBrow
SET_PED_COMPONENT_VARIATION(psLazlow.PedIndex, PED_COMP_SPECIAL2, 0, 4)
ELIF NOT bEar AND bBrow
SET_PED_COMPONENT_VARIATION(psLazlow.PedIndex, PED_COMP_SPECIAL2, 0, 6)
ELIF bEar AND bBrow
SET_PED_COMPONENT_VARIATION(psLazlow.PedIndex, PED_COMP_SPECIAL2, 0, 7)
ENDIF
ePiercingStage = PIERCING_IDLE
iConversationTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(1000, 2000)
ELSE
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDIF
ENDIF
BREAK
CASE PIERCING_EAR
IF IS_SYNCHRONIZED_SCENE_RUNNING(iPierceSceneID) AND GET_SYNCHRONIZED_SCENE_PHASE(iPierceSceneID) >= 0.07
SET_CONTROL_SHAKE(PLAYER_CONTROL, 200, 256)
PLAY_SOUND_FROM_ENTITY(-1, "Pierce", osPiercingGun.ObjectIndex, "FAMILY_6_SOUNDS")
IF ( iConversationCounter < 2 )
IF CREATE_CONVERSATION(FAM6Conversation, "FAM6AUD", "FAM6_EAR", CONV_PRIORITY_MEDIUM)
iConversationCounter++
ENDIF
ENDIF
IF NOT bNose AND NOT bBrow
SET_PED_COMPONENT_VARIATION(psLazlow.PedIndex,PED_COMP_SPECIAL2,0,1)
ELIF bNose AND NOT bBrow
SET_PED_COMPONENT_VARIATION(psLazlow.PedIndex,PED_COMP_SPECIAL2,0,4)
ELIF NOT bNose AND bBrow
SET_PED_COMPONENT_VARIATION(psLazlow.PedIndex,PED_COMP_SPECIAL2,0,5)
ELIF bNose AND bBrow
SET_PED_COMPONENT_VARIATION(psLazlow.PedIndex,PED_COMP_SPECIAL2,0,7)
ENDIF
ePiercingStage = PIERCING_IDLE
iConversationTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(1000, 2000)
ELSE
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDPROC
FUNC BOOL IS_MISSION_STAGE_PIERCE_LAZLOW_COMPLETED(INT &iStageProgress)
MANAGE_PIERCING_STAGES()
MANAGE_PIERCING_HELP_TEXT()
SWITCH iStageProgress
CASE 0
IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iPierceSceneID)
REQUEST_MODEL(osPiercingGun.ModelName)
REQUEST_ANIM_DICT("missfam6ig_1_pierce")
REQUEST_ANIM_DICT("missfam6ig_7_tattoo")
REQUEST_SCRIPT_AUDIO_BANK("FAM6_PIERCING_GUN")
IF HAS_MODEL_LOADED(osPiercingGun.ModelName)
AND HAS_ANIM_DICT_LOADED("missfam6ig_1_pierce")
AND HAS_ANIM_DICT_LOADED("missfam6ig_7_tattoo")
AND REQUEST_SCRIPT_AUDIO_BANK("FAM6_PIERCING_GUN")
iPierceSceneID = CREATE_SYNCHRONIZED_SCENE(<< 324.130, 181.290, 102.600 >>, << 0, 0, -22.320 >>)
IF HAS_MISSION_OBJECT_BEEN_CREATED(osPiercingGun)
IF DOES_ENTITY_EXIST(osPiercingGun.ObjectIndex) AND NOT IS_ENTITY_DEAD(osPiercingGun.ObjectIndex)
ATTACH_ENTITY_TO_ENTITY(osPiercingGun.ObjectIndex, 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>>)
ENDIF
ENDIF
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
TASK_SYNCHRONIZED_SCENE(PLAYER_PED_ID(), iPierceSceneID, "missfam6ig_1_pierce", "ig_1_loop_michael", INSTANT_BLEND_IN, SLOW_BLEND_OUT )
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID())
ENDIF
IF NOT IS_PED_INJURED(psLazlow.PedIndex)
TASK_SYNCHRONIZED_SCENE(psLazlow.PedIndex, iPierceSceneID, "missfam6ig_1_pierce", "ig_1_loop_lazlow", INSTANT_BLEND_IN, SLOW_BLEND_OUT )
FORCE_PED_AI_AND_ANIMATION_UPDATE(psLazlow.PedIndex)
ENDIF
IF NOT DOES_CAM_EXIST(ScriptedCamera)
ScriptedCamera = CREATE_CAMERA(CAMTYPE_SCRIPTED, TRUE)
SET_CAM_PARAMS(ScriptedCamera, << 323.4799, 178.8823, 104.7932 >>, << -23.9135, 13.3903, -17.3261 >>, 25.0)
SHAKE_CAM(ScriptedCamera,"HAND_SHAKE",0.5)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
ENDIF
IF NOT DOES_CAM_EXIST(AnimatedCamera)
AnimatedCamera = CREATE_CAMERA(CAMTYPE_ANIMATED, FALSE)
ENDIF
IF NOT IS_PED_INJURED(psJimmy.PedIndex)
WARP_PED(psJimmy.PedIndex, psJimmy.vPosition, psJimmy.fHeading, FALSE, FALSE, FALSE)
TASK_PLAY_ANIM(psJimmy.PedIndex, "missfam6ig_7_tattoo", "ig_7_idle_01_jimmy", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1, AF_LOOPING | AF_NOT_INTERRUPTABLE)
FORCE_PED_AI_AND_ANIMATION_UPDATE(psJimmy.PedIndex)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(psJimmy.PedIndex, TRUE)
ENDIF
IF NOT IS_PED_INJURED(psTracey.PedIndex)
WARP_PED(psTracey.PedIndex, psTracey.vPosition, psTracey.fHeading, FALSE, FALSE, FALSE)
TASK_PLAY_ANIM(psTracey.PedIndex, "missfam6ig_7_tattoo", "ig_7_idle_02_tracey", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1, AF_LOOPING | AF_NOT_INTERRUPTABLE)
FORCE_PED_AI_AND_ANIMATION_UPDATE(psTracey.PedIndex)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(psTracey.PedIndex, TRUE)
ENDIF
SET_MODEL_AS_NO_LONGER_NEEDED(osPiercingGun.ModelName)
ENDIF
ELSE
bEar = FALSE
bNose = FALSE
bBrow = FALSE
iStruggleConversationTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(1000, 1500)
iConversationTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(250, 1000)
iConversationCounter = 0
iIdle1Conversationcounter = 0
iIdle2Conversationcounter = 0
iIdleConversationcounter = 0
ePiercingStage = PIERCING_IDLE
INFORM_MISSION_STATS_SYSTEM_OF_TIME_WINDOW_OPEN(FAM6_PIERCING_TIME)
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
START_AUDIO_SCENE("FAMILY_6_PIERCE_LAZLOW_MG")
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGH)
bReplayStartEventTriggered = TRUE
IF IS_SCREEN_FADED_OUT()
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
ENDIF
SETUP_PC_CONTROLS()
iStageProgress++
ENDIF
BREAK
CASE 101
IF IS_SYNCHRONIZED_SCENE_RUNNING(iPierceSceneID) AND GET_SYNCHRONIZED_SCENE_PHASE(iPierceSceneID) >= 1
SET_CAM_ACTIVE(AnimatedCamera, FALSE)
SET_CAM_ACTIVE(ScriptedCamera, TRUE)
iPierceSceneID = CREATE_SYNCHRONIZED_SCENE(<< 324.130, 181.290, 102.600 >>, << 0, 0, -22.320 >>)
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
TASK_SYNCHRONIZED_SCENE(PLAYER_PED_ID(), iPierceSceneID, "missfam6ig_1_pierce", "ig_1_loop_michael", SLOW_BLEND_IN, SLOW_BLEND_OUT )
ENDIF
IF NOT IS_PED_INJURED(psLazlow.PedIndex)
TASK_SYNCHRONIZED_SCENE(psLazlow.PedIndex, iPierceSceneID, "missfam6ig_1_pierce", "ig_1_loop_lazlow",SLOW_BLEND_IN, SLOW_BLEND_OUT )
ENDIF
iStageProgress = 1
ENDIF
BREAK
CASE 1
IF IS_SYNCHRONIZED_SCENE_RUNNING(iPierceSceneID)
AND GET_SYNCHRONIZED_SCENE_PHASE(iPierceSceneID) >= 1
iPierceSceneID = CREATE_SYNCHRONIZED_SCENE(<< 324.130, 181.290, 102.600 >>, << 0, 0, -22.320 >>)
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
TASK_SYNCHRONIZED_SCENE(PLAYER_PED_ID(), iPierceSceneID, "missfam6ig_1_pierce", "ig_1_loop_michael", SLOW_BLEND_IN, SLOW_BLEND_OUT )
ENDIF
IF NOT IS_PED_INJURED(psLazlow.PedIndex)
TASK_SYNCHRONIZED_SCENE(psLazlow.PedIndex, iPierceSceneID, "missfam6ig_1_pierce", "ig_1_loop_lazlow",SLOW_BLEND_IN, SLOW_BLEND_OUT )
ENDIF
ENDIF
IF IS_SYNCHRONIZED_SCENE_RUNNING(iPierceSceneID)
IF (IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL,INPUT_SCRIPT_RDOWN) AND NOT bEar)
iPierceSceneID = CREATE_SYNCHRONIZED_SCENE(<< 324.130, 181.290, 102.600 >>, << 0.0, 0.0, -22.320 >>)
SET_CAM_ACTIVE(AnimatedCamera, TRUE)
PLAY_CAM_ANIM(AnimatedCamera,"ig_1_ear_cam","missfam6ig_1_pierce",<< 324.130, 181.290, 102.600 >>,<< 0, 0, -22.320 >>,CAF_LOOPING)
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
TASK_SYNCHRONIZED_SCENE(PLAYER_PED_ID(), iPierceSceneID, "missfam6ig_1_pierce", "ig_1_ear_michael", SLOW_BLEND_IN, SLOW_BLEND_OUT )
ENDIF
IF NOT IS_PED_INJURED(psLazlow.PedIndex)
TASK_SYNCHRONIZED_SCENE(psLazlow.PedIndex, iPierceSceneID, "missfam6ig_1_pierce", "ig_1_ear_lazlow", SLOW_BLEND_IN, SLOW_BLEND_OUT )
ENDIF
IF NOT IS_PED_INJURED(psJimmy.PedIndex)
TASK_PLAY_ANIM(psJimmy.PedIndex,"missfam6ig_7_tattoo", "ig_7_idle_01_jimmy", INSTANT_BLEND_IN, INSTANT_BLEND_OUT,-1,AF_LOOPING)
ENDIF
IF NOT IS_PED_INJURED(psTracey.PedIndex)
TASK_PLAY_ANIM(psTracey.PedIndex,"missfam6ig_7_tattoo", "ig_7_idle_03_tracey", INSTANT_BLEND_IN, INSTANT_BLEND_OUT,-1,AF_LOOPING)
ENDIF
bEar = TRUE
ePiercingStage = PIERCING_EAR
IF bNose AND bBrow
iStageProgress++
ELSE
iStageProgress = 101
ENDIF
ELIF (IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL,INPUT_SCRIPT_RRIGHT) AND NOT bNose)
iPierceSceneID = CREATE_SYNCHRONIZED_SCENE(<< 324.130, 181.290, 102.600 >>,<< 0, 0, -22.320 >>)
SET_CAM_ACTIVE(AnimatedCamera, TRUE)
PLAY_CAM_ANIM(AnimatedCamera, "ig_1_nose_cam", "missfam6ig_1_pierce", << 324.130, 181.290, 102.600 >>, << 0.0, 0.0, -22.320 >>, CAF_LOOPING)
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
TASK_SYNCHRONIZED_SCENE(PLAYER_PED_ID(), iPierceSceneID, "missfam6ig_1_pierce", "ig_1_nose_michael", SLOW_BLEND_IN, SLOW_BLEND_OUT )
ENDIF
IF NOT IS_PED_INJURED(psLazlow.PedIndex)
TASK_SYNCHRONIZED_SCENE(psLazlow.PedIndex, iPierceSceneID, "missfam6ig_1_pierce", "ig_1_nose_lazlow", SLOW_BLEND_IN, SLOW_BLEND_OUT )
ENDIF
bNose = TRUE
ePiercingStage = PIERCING_NOSE
IF bEar AND bBrow
iStageProgress++
ELSE
iStageProgress = 101
ENDIF
ELIF (IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL,INPUT_SCRIPT_RLEFT) AND NOT bBrow)
iPierceSceneID = CREATE_SYNCHRONIZED_SCENE(<< 324.130, 181.290, 102.600 >>,<< 0, 0, -22.320 >>)
SET_CAM_ACTIVE(AnimatedCamera, TRUE)
PLAY_CAM_ANIM(AnimatedCamera,"ig_1_brow_cam","missfam6ig_1_pierce",<< 324.130, 181.290, 102.600 >>,<< 0, 0, -22.320 >>,CAF_LOOPING)
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
TASK_SYNCHRONIZED_SCENE(PLAYER_PED_ID(), iPierceSceneID, "missfam6ig_1_pierce", "ig_1_brow_michael", SLOW_BLEND_IN, SLOW_BLEND_OUT )
ENDIF
IF NOT IS_PED_INJURED(psLazlow.PedIndex)
TASK_SYNCHRONIZED_SCENE(psLazlow.PedIndex, iPierceSceneID, "missfam6ig_1_pierce", "ig_1_brow_lazlow", SLOW_BLEND_IN, SLOW_BLEND_OUT )
ENDIF
bBrow = TRUE
ePiercingStage = PIERCING_BROW
IF bEar AND bNose
iStageProgress++
ELSE
iStageProgress = 101
ENDIF
ENDIF
ENDIF
BREAK
CASE 2
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
IF HAS_ANIM_EVENT_FIRED(PLAYER_PED_ID(), GET_HASH_KEY("last_piercing"))
IF ( bCutsceneAssetsRequested = TRUE )
INFORM_MISSION_STATS_SYSTEM_OF_TIME_WINDOW_CLOSED()
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
IF ( bReplayStartEventTriggered = TRUE )
IF ( bReplayStopEventTriggered = FALSE )
REPLAY_STOP_EVENT()
bReplayStopEventTriggered = TRUE
ENDIF
ENDIF
CLEANUP_PC_CONTROLS()
RETURN TRUE
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
IF ( iConversationCounter >= 2 )
REQUEST_CUTSCENE("fam_6_mcs_3") //request the cutscene after two piercings have been done
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", PLAYER_PED_ID(), PLAYER_ZERO)
SET_JIMMY_CUTSCENE_COMPONENT_VARIATIONS()
SET_TRACEY_CUTSCENE_COMPONENT_VARIATIONS()
SET_LAZLOW_CUTSCENE_COMPONENT_VARIATIONS(FALSE, TRUE, FALSE, FALSE, FALSE)
bCutsceneAssetsRequested = TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL IS_MISSION_STAGE_CUTSCENE_SHOP_2_COMPLETED(INT &iStageProgress)
SWITCH iStageProgress
CASE 0
IF HAS_REQUESTED_CUTSCENE_LOADED("fam_6_mcs_3")
IF NOT IS_PED_INJURED(psJimmy.PedIndex)
IF IS_PED_GROUP_MEMBER(psJimmy.PedIndex, PLAYER_GROUP_ID())
REMOVE_PED_FROM_GROUP(psJimmy.PedIndex)
ENDIF
REGISTER_ENTITY_FOR_CUTSCENE(psJimmy.PedIndex, "Jimmy", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, psJimmy.ModelName)
ENDIF
IF NOT IS_PED_INJURED(psTracey.PedIndex)
REGISTER_ENTITY_FOR_CUTSCENE(psTracey.PedIndex, "Tracy", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, psTracey.ModelName)
ENDIF
IF NOT IS_PED_INJURED(psLazlow.PedIndex)
REGISTER_ENTITY_FOR_CUTSCENE(psLazlow.PedIndex, "Lazlow", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, psLazlow.ModelName)
ENDIF
REGISTER_ENTITY_FOR_CUTSCENE(osShirt.ObjectIndex, "Lazlow_Shirt", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, osShirt.ModelName)
REGISTER_ENTITY_FOR_CUTSCENE(osTattooNeedle.ObjectIndex, "Tattoo_Gun", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, osTattooNeedle.ModelName)
IF DOES_ENTITY_EXIST(osPiercingGun.ObjectIndex)
IF NOT IS_ENTITY_DEAD(osPiercingGun.ObjectIndex)
IF IS_ENTITY_ATTACHED(osPiercingGun.ObjectIndex)
DETACH_ENTITY(osPiercingGun.ObjectIndex, FALSE, TRUE)
ENDIF
REGISTER_ENTITY_FOR_CUTSCENE(osPiercingGun.ObjectIndex, "Piercing_Gun", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, osPiercingGun.ModelName)
ENDIF
ENDIF
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
STOP_AUDIO_SCENES()
START_CUTSCENE()
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
iStageProgress++
ELSE
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", PLAYER_PED_ID(), PLAYER_ZERO)
SET_JIMMY_CUTSCENE_COMPONENT_VARIATIONS()
SET_TRACEY_CUTSCENE_COMPONENT_VARIATIONS()
SET_LAZLOW_CUTSCENE_COMPONENT_VARIATIONS(FALSE, TRUE, FALSE, FALSE, FALSE)
ENDIF
ENDIF
BREAK
CASE 1 //fade screen in if screen was faded out due to shit skip or debug skip
IF IS_CUTSCENE_PLAYING()
REMOVE_ANIM_DICT("missfam6ig_1_pierce")
IF DOES_CAM_EXIST(ScriptedCamera)
DESTROY_CAM(ScriptedCamera)
ENDIF
IF DOES_CAM_EXIST(AnimatedCamera)
DESTROY_CAM(AnimatedCamera)
ENDIF
DESTROY_ALL_CAMS()
RENDER_SCRIPT_CAMS(FALSE, FALSE)
IF IS_SCREEN_FADED_OUT()
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
ENDIF
iStageProgress++
ENDIF
BREAK
CASE 2
REQUEST_MODEL(osTattooNeedle.ModelName)
REQUEST_ANIM_DICT("missfam6ig_7_tattoo")
mov = REQUEST_SCALEFORM_MOVIE("tattoo_buttons")
IF IS_PC_VERSION()
mov_kb = REQUEST_SCALEFORM_MOVIE("tattoo_keys")
ENDIF
IF NOT DOES_CAM_EXIST(ScriptedCamera)
ScriptedCamera = CREATE_CAMERA(CAMTYPE_SCRIPTED, TRUE)
SET_CAM_PARAMS(ScriptedCamera, << 326.1551, 179.2442, 104.5627 >>, << -36.8795, 13.4340, 33.8400 >>, 52.0, 0)
SHAKE_CAM(ScriptedCamera,"HAND_SHAKE",0.5)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
ENDIF
IF NOT DOES_CAM_EXIST(AnimatedCamera)
AnimatedCamera = CREATE_CAMERA(CAMTYPE_ANIMATED, FALSE)
ENDIF
IF NOT DOES_ENTITY_EXIST(osShirt.ObjectIndex)
IF DOES_CUTSCENE_ENTITY_EXIST("Lazlow_Shirt")
IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Lazlow_Shirt"))
osShirt.ObjectIndex = GET_OBJECT_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Lazlow_Shirt"))
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created object Lazlow_Shirt in the cutscene.")
#ENDIF
ENDIF
ENDIF
ENDIF
IF NOT DOES_ENTITY_EXIST(osTattooNeedle.ObjectIndex)
IF DOES_CUTSCENE_ENTITY_EXIST("Tattoo_Gun")
IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Tattoo_Gun"))
osTattooNeedle.ObjectIndex = GET_OBJECT_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Tattoo_Gun"))
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created object Tattoo_Gun in the cutscene.")
#ENDIF
ENDIF
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_CAMERA()
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
REPLAY_STOP_EVENT()
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Lazlow_Shirt")
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY() returned true for Lazlow_Shirt.")
#ENDIF
IF DOES_ENTITY_EXIST(osShirt.ObjectIndex)
IF NOT IS_ENTITY_DEAD(osShirt.ObjectIndex)
SET_ENTITY_INVINCIBLE(osShirt.ObjectIndex, TRUE)
FREEZE_ENTITY_POSITION(osShirt.ObjectIndex, TRUE)
SET_ENTITY_COLLISION(osShirt.ObjectIndex, FALSE)
ENDIF
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Piercing_Gun")
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY() returned true for Piercing_Gun.")
#ENDIF
IF DOES_ENTITY_EXIST(osPiercingGun.ObjectIndex)
IF NOT IS_ENTITY_DEAD(osPiercingGun.ObjectIndex)
SET_ENTITY_INVINCIBLE(osPiercingGun.ObjectIndex, TRUE)
FREEZE_ENTITY_POSITION(osPiercingGun.ObjectIndex, TRUE)
SET_ENTITY_COLLISION(osPiercingGun.ObjectIndex, FALSE)
ENDIF
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Tattoo_Gun")
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY() returned true for Tattoo_Gun.")
#ENDIF
IF DOES_ENTITY_EXIST(osTattooNeedle.ObjectIndex)
IF NOT IS_ENTITY_DEAD(osTattooNeedle.ObjectIndex)
IF NOT IS_ENTITY_ATTACHED(osTattooNeedle.ObjectIndex)
ATTACH_ENTITY_TO_ENTITY(osTattooNeedle.ObjectIndex, 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 >>)
ENDIF
ENDIF
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Jimmy")
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY() returned true for Jimmy.")
#ENDIF
IF NOT IS_PED_INJURED(psJimmy.PedIndex)
SET_PED_COMPONENT_VARIATION(psJimmy.PedIndex, PED_COMP_BERD, 0, 0)
IF ( bCutsceneSkipped = FALSE )
SEQUENCE_INDEX JimmySequenceIndex
CLEAR_SEQUENCE_TASK(JimmySequenceIndex)
OPEN_SEQUENCE_TASK(JimmySequenceIndex)
TASK_TURN_PED_TO_FACE_ENTITY(NULL, psLazlow.PedIndex)
TASK_PLAY_ANIM(NULL, "missfam6ig_7_tattoo", "ig_7_idle_02_jimmy", WALK_BLEND_IN, WALK_BLEND_OUT, -1, AF_LOOPING | AF_NOT_INTERRUPTABLE)
CLOSE_SEQUENCE_TASK(JimmySequenceIndex)
TASK_PERFORM_SEQUENCE(psJimmy.PedIndex, JimmySequenceIndex)
CLEAR_SEQUENCE_TASK(JimmySequenceIndex)
FORCE_PED_AI_AND_ANIMATION_UPDATE(psJimmy.PedIndex)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(psJimmy.PedIndex, TRUE)
ENDIF
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Tracy")
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY() returned true for Tracy.")
#ENDIF
IF NOT IS_PED_INJURED(psTracey.PedIndex)
IF ( bCutsceneSkipped = FALSE )
TASK_PLAY_ANIM(psTracey.PedIndex, "missfam6ig_7_tattoo", "ig_7_idle_01_tracey", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1, AF_LOOPING | AF_NOT_INTERRUPTABLE)
FORCE_PED_AI_AND_ANIMATION_UPDATE(psTracey.PedIndex)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(psTracey.PedIndex, TRUE)
ENDIF
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michael")
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY() returned true for Michael.")
#ENDIF
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
VECTOR vMichaelPosition, vMichaelRotation
vMichaelPosition = GET_ANIM_INITIAL_OFFSET_POSITION("missfam6ig_7_tattoo","ig_7_loop_michael",<< 324.130, 181.290, 102.600 >>,<< 0, 0, -22.320 >>)
vMichaelRotation = GET_ANIM_INITIAL_OFFSET_ROTATION("missfam6ig_7_tattoo","ig_7_loop_michael",<< 324.130, 181.290, 102.600 >>,<< 0, 0, -22.320 >>)
SET_ENTITY_ROTATION(PLAYER_PED_ID(), vMichaelRotation)
SET_ENTITY_COORDS_NO_OFFSET(PLAYER_PED_ID(), vMichaelPosition)
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Lazlow")
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY() returned true for Lazlow.")
#ENDIF
IF NOT IS_PED_INJURED(psLazlow.PedIndex)
VECTOR vLazlowPosition, vLazlowRotation
vLazlowPosition = GET_ANIM_INITIAL_OFFSET_POSITION("missfam6ig_7_tattoo","ig_7_loop_lazlow",<< 324.130, 181.290, 102.600 >>,<< 0, 0, -22.320 >>)
vLazlowRotation = GET_ANIM_INITIAL_OFFSET_ROTATION("missfam6ig_7_tattoo","ig_7_loop_lazlow",<< 324.130, 181.290, 102.600 >>,<< 0, 0, -22.320 >>)
SET_ENTITY_ROTATION(psLazlow.PedIndex, vLazlowRotation)
SET_ENTITY_COORDS_NO_OFFSET(psLazlow.PedIndex, vLazlowPosition)
SET_PED_COMPONENT_VARIATION(psLazlow.PedIndex, PED_COMP_TORSO, 1, 0)
ENDIF
IF ( bCutsceneSkipped = FALSE )
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
AND NOT IS_PED_INJURED(psLazlow.PedIndex)
IF NOT IS_TASK_MOVE_NETWORK_ACTIVE(PLAYER_PED_ID())
AND NOT IS_TASK_MOVE_NETWORK_ACTIVE(psLazlow.PedIndex)
IF HAS_SCALEFORM_LOADED()
AND HAS_MODEL_LOADED(osTattooNeedle.ModelName)
AND HAS_ANIM_DICT_LOADED("missfam6ig_7_tattoo")
IF HAS_MISSION_OBJECT_BEEN_CREATED(osTattooNeedle)
IF NOT IS_ENTITY_ATTACHED(osTattooNeedle.ObjectIndex)
ATTACH_ENTITY_TO_ENTITY(osTattooNeedle.ObjectIndex, 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 >>)
ENDIF
ENDIF
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
TASK_MOVE_NETWORK_ADVANCED_BY_NAME(PLAYER_PED_ID(), "minigame_tattoo_michael_parts", << 324.130, 181.290, 102.600 >>, << 0.0, 0.0, -22.320 >>)
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID())
ENDIF
IF NOT IS_PED_INJURED(psLazlow.PedIndex)
TASK_MOVE_NETWORK_ADVANCED_BY_NAME(psLazlow.PedIndex, "minigame_tattoo_lazlow_parts",<< 324.130, 181.290, 102.600 >>,<< 0, 0, -22.320 >>)
FORCE_PED_AI_AND_ANIMATION_UPDATE(psLazlow.PedIndex, FALSE, TRUE) //fix for B*1567738, CS_LAZLOW not being in synch
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF HAS_CUTSCENE_FINISHED()
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
IF ( bCutsceneSkipped = TRUE )
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
AND NOT IS_PED_INJURED(psLazlow.PedIndex)
IF NOT IS_TASK_MOVE_NETWORK_ACTIVE(PLAYER_PED_ID())
AND NOT IS_TASK_MOVE_NETWORK_ACTIVE(psLazlow.PedIndex)
IF HAS_SCALEFORM_LOADED()
AND HAS_MODEL_LOADED(osTattooNeedle.ModelName)
AND HAS_ANIM_DICT_LOADED("missfam6ig_7_tattoo")
IF HAS_MISSION_OBJECT_BEEN_CREATED(osTattooNeedle)
ATTACH_ENTITY_TO_ENTITY(osTattooNeedle.ObjectIndex, 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 >>)
ENDIF
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
TASK_MOVE_NETWORK_ADVANCED_BY_NAME(PLAYER_PED_ID(), "minigame_tattoo_michael_parts", << 324.130, 181.290, 102.600 >>, << 0.0, 0.0, -22.320 >>)
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID())
ENDIF
IF NOT IS_PED_INJURED(psLazlow.PedIndex)
TASK_MOVE_NETWORK_ADVANCED_BY_NAME(psLazlow.PedIndex, "minigame_tattoo_lazlow_parts",<< 324.130, 181.290, 102.600 >>,<< 0, 0, -22.320 >>)
FORCE_PED_AI_AND_ANIMATION_UPDATE(psLazlow.PedIndex)
ENDIF
IF NOT IS_PED_INJURED(psJimmy.PedIndex)
SEQUENCE_INDEX JimmySequenceIndex
CLEAR_SEQUENCE_TASK(JimmySequenceIndex)
OPEN_SEQUENCE_TASK(JimmySequenceIndex)
TASK_TURN_PED_TO_FACE_ENTITY(NULL, psLazlow.PedIndex)
TASK_PLAY_ANIM(NULL, "missfam6ig_7_tattoo", "ig_7_idle_02_jimmy", WALK_BLEND_IN, WALK_BLEND_OUT, -1, AF_LOOPING | AF_NOT_INTERRUPTABLE)
CLOSE_SEQUENCE_TASK(JimmySequenceIndex)
TASK_PERFORM_SEQUENCE(psJimmy.PedIndex, JimmySequenceIndex)
CLEAR_SEQUENCE_TASK(JimmySequenceIndex)
FORCE_PED_AI_AND_ANIMATION_UPDATE(psJimmy.PedIndex)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(psJimmy.PedIndex, TRUE)
ENDIF
IF NOT IS_PED_INJURED(psTracey.PedIndex)
TASK_PLAY_ANIM(psTracey.PedIndex, "missfam6ig_7_tattoo", "ig_7_idle_01_tracey", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1, AF_LOOPING | AF_NOT_INTERRUPTABLE)
FORCE_PED_AI_AND_ANIMATION_UPDATE(psTracey.PedIndex)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(psTracey.PedIndex, TRUE)
ENDIF
iStageProgress++
ENDIF
ENDIF
ENDIF
ELSE
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
AND NOT IS_PED_INJURED(psLazlow.PedIndex)
IF IS_TASK_MOVE_NETWORK_ACTIVE(PLAYER_PED_ID())
AND IS_TASK_MOVE_NETWORK_ACTIVE(psLazlow.PedIndex)
iStageProgress++
ENDIF
ENDIF
ENDIF
ELSE
IF ( bCutsceneSkipped = FALSE )
IF WAS_CUTSCENE_SKIPPED()
SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, FALSE, FALSE) //if cutscene was skipped, fade out and don't fade in
bCutsceneSkipped = TRUE
ENDIF
ENDIF
ENDIF
BREAK
CASE 3
SET_MODEL_AS_NO_LONGER_NEEDED(osTattooNeedle.ModelName)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
//don't fade in here, wait with fade in the next stage
//this should fix issues like B*2079140 where move task was given but peds don't perform it just yet
//IF IS_SCREEN_FADED_OUT()
// DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
//ENDIF
RETURN TRUE
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
PROC MANAGE_TATTOO_STAGES()
IF HAS_SOUND_FINISHED(iTattooSoundID)
PLAY_SOUND_FROM_ENTITY(iTattooSoundID, "Tattoo", osTattooNeedle.ObjectIndex, "FAMILY_6_SOUNDS")
ENDIF
SWITCH eTattooingStage
CASE TATTOOING_IDLE
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF ( iConversationTimer != 0 )
IF GET_GAME_TIMER() - iConversationTimer > 0
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM6_IDLET_3")
IF CREATE_CONVERSATION(FAM6Conversation, "FAM6AUD", "FAM6_IDLET", CONV_PRIORITY_MEDIUM)
iConversationCounter++
iConversationTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(9000, 12000)
IF ( iConversationCounter >= 3 )
SET_LABEL_AS_TRIGGERED("FAM6_IDLET_3", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF ( iStruggleConversationTimer != 0 )
IF GET_GAME_TIMER() - iStruggleConversationTimer > 0
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(FAM6Conversation, "FAM6AUD", "FAM6_STRUG", CONV_PRIORITY_MEDIUM, DO_NOT_DISPLAY_SUBTITLES)
iStruggleConversationTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(3500, 6000)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE TATTOOING_CHEST
IF fTattooPosition < 0.95
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF ( iConversationTimer != 0 )
IF GET_GAME_TIMER() - iConversationTimer > 0
SWITCH GET_RANDOM_INT_IN_RANGE(0, 4)
CASE 0
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM6_TATC_3")
IF CREATE_CONVERSATION(FAM6Conversation, "FAM6AUD", "FAM6_TATC", CONV_PRIORITY_MEDIUM)
iConversationTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(6000, 9000)
iIdleConversationcounter++
IF ( iIdleConversationcounter >= 3 )
SET_LABEL_AS_TRIGGERED("FAM6_TATC_3", TRUE)
ENDIF
ENDIF
ENDIF
BREAK
CASE 1
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM6_TATA_14")
IF CREATE_CONVERSATION(FAM6Conversation, "FAM6AUD", "FAM6_TATA", CONV_PRIORITY_MEDIUM)
iConversationTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(6000, 9000)
iIdle1Conversationcounter++
IF ( iIdle1Conversationcounter >= 14 )
SET_LABEL_AS_TRIGGERED("FAM6_TATA_14", TRUE)
ENDIF
ENDIF
ENDIF
BREAK
CASE 2
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM6_TATM_8")
IF CREATE_CONVERSATION(FAM6Conversation, "FAM6AUD", "FAM6_TATM", CONV_PRIORITY_MEDIUM)
iConversationTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(6000, 9000)
iIdle2Conversationcounter++
IF ( iIdle2Conversationcounter >= 8 )
SET_LABEL_AS_TRIGGERED("FAM6_TATM_8", TRUE)
ENDIF
ENDIF
ENDIF
BREAK
CASE 3
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM6_REACT_3")
IF CREATE_CONVERSATION(FAM6Conversation, "FAM6AUD", "FAM6_REACT", CONV_PRIORITY_MEDIUM)
iConversationTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(6000, 9000)
iIdle3Conversationcounter++
IF ( iIdle3Conversationcounter >= 3 )
SET_LABEL_AS_TRIGGERED("FAM6_REACT_3", TRUE)
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
IF ( iStruggleConversationTimer != 0 )
IF GET_GAME_TIMER() - iStruggleConversationTimer > 0
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(FAM6Conversation, "FAM6AUD", "FAM6_STRUG", CONV_PRIORITY_MEDIUM, DO_NOT_DISPLAY_SUBTITLES)
iStruggleConversationTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(3500, 6000)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
SWITCH iTattooCameraProgress
CASE 0
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
IF IS_TASK_MOVE_NETWORK_READY_FOR_TRANSITION(PLAYER_PED_ID())
bScaleformDrawing = TRUE
PLAY_CAM_ANIM(AnimatedCamera, "front_cam", "missfam6ig_7_tattoo", << 324.130, 181.290, 102.600 >>, << 0, 0, -22.320 >>, CAF_LOOPING)
iTattooCameraProgress++
ENDIF
ENDIF
BREAK
CASE 1
IF fTattooPosition > 0.96
//IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
// KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
//ENDIF
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF CREATE_CONVERSATION(FAM6Conversation, "FAM6AUD", "FAM6_TATFIN", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("FAM6_TATFIN", TRUE)
iTattooCameraProgress++
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
BREAK
CASE TATTOOING_BACK
IF fTattooPosition < 0.95
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF ( iConversationTimer != 0 )
IF GET_GAME_TIMER() - iConversationTimer > 0
SWITCH GET_RANDOM_INT_IN_RANGE(0, 3)
CASE 0
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM6_TATB_4")
IF CREATE_CONVERSATION(FAM6Conversation, "FAM6AUD", "FAM6_TATB", CONV_PRIORITY_MEDIUM)
iConversationTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(6000, 9000)
iIdleConversationcounter++
IF ( iIdleConversationcounter >= 4 )
SET_LABEL_AS_TRIGGERED("FAM6_TATB_4", TRUE)
ENDIF
ENDIF
ENDIF
BREAK
CASE 1
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM6_TATA_14")
IF CREATE_CONVERSATION(FAM6Conversation, "FAM6AUD", "FAM6_TATA", CONV_PRIORITY_MEDIUM)
iConversationTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(6000, 9000)
iIdle1Conversationcounter++
IF ( iIdle1Conversationcounter >= 14 )
SET_LABEL_AS_TRIGGERED("FAM6_TATA_14", TRUE)
ENDIF
ENDIF
ENDIF
BREAK
CASE 2
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM6_TATM_8")
IF CREATE_CONVERSATION(FAM6Conversation, "FAM6AUD", "FAM6_TATM", CONV_PRIORITY_MEDIUM)
iConversationTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(6000, 9000)
iIdle2Conversationcounter++
IF ( iIdle2Conversationcounter >= 8 )
SET_LABEL_AS_TRIGGERED("FAM6_TATM_8", TRUE)
ENDIF
ENDIF
ENDIF
BREAK
CASE 3
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM6_REACT_3")
IF CREATE_CONVERSATION(FAM6Conversation, "FAM6AUD", "FAM6_REACT", CONV_PRIORITY_MEDIUM)
iConversationTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(6000, 9000)
iIdle3Conversationcounter++
IF ( iIdle3Conversationcounter >= 3 )
SET_LABEL_AS_TRIGGERED("FAM6_REACT_3", TRUE)
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
IF ( iStruggleConversationTimer != 0 )
IF GET_GAME_TIMER() - iStruggleConversationTimer > 0
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(FAM6Conversation, "FAM6AUD", "FAM6_STRUG", CONV_PRIORITY_MEDIUM, DO_NOT_DISPLAY_SUBTITLES)
iStruggleConversationTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(3500, 6000)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
SWITCH iTattooCameraProgress
CASE 0
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
IF IS_TASK_MOVE_NETWORK_READY_FOR_TRANSITION(PLAYER_PED_ID())
bScaleformDrawing = TRUE
PLAY_CAM_ANIM(AnimatedCamera, "back_cam", "missfam6ig_7_tattoo", << 324.130, 181.290, 102.600 >>, << 0.0, 0.0, -22.320 >>, CAF_LOOPING)
iTattooCameraProgress++
ENDIF
ENDIF
BREAK
CASE 1
IF fTattooPosition > 0.96
//IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
// KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
//ENDIF
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF CREATE_CONVERSATION(FAM6Conversation, "FAM6AUD", "FAM6_TATFIN", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("FAM6_TATFIN", TRUE)
iTattooCameraProgress++
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
BREAK
ENDSWITCH
ENDPROC
PROC CHEST_DRAWING(SCALEFORM_INDEX &localMov, INT &iScaleformProgress)
switch iScaleformProgress
case 0
bTattooInputReady = false
if BEGIN_SCALEFORM_MOVIE_METHOD(localMov,"ADD_BUTTON")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(enum_to_int(SPACER))
END_SCALEFORM_MOVIE_METHOD()
iScaleformProgress++
endif
break
case 1
BEGIN_SCALEFORM_MOVIE_METHOD(localMov,"ADD_BUTTON")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(enum_to_int(RIGHT_STICK_DIAGONAL_DOWN_LEFT))
END_SCALEFORM_MOVIE_METHOD()
BEGIN_SCALEFORM_MOVIE_METHOD(localMov,"ADD_BUTTON")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(enum_to_int(RIGHT_STICK_DOWN))
END_SCALEFORM_MOVIE_METHOD()
BEGIN_SCALEFORM_MOVIE_METHOD(localMov,"ADD_BUTTON")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(enum_to_int(RIGHT_STICK_DIAGONAL_DOWN_RIGHT))
END_SCALEFORM_MOVIE_METHOD()
iScaleformProgress++
break
case 2
iScaleformProgress++
break
case 3
eTattooDirection = RIGHT_STICK_DIAGONAL_DOWN_LEFT
bTattooInputReady = true
iScaleformProgress++
break
case 4
if fTattooPosition >= 0.066
IF IS_TASK_MOVE_NETWORK_ACTIVE(PLAYER_PED_ID())
AND IS_TASK_MOVE_NETWORK_ACTIVE(psLazlow.PedIndex)
IF IS_TASK_MOVE_NETWORK_READY_FOR_TRANSITION(PLAYER_PED_ID())
AND IS_TASK_MOVE_NETWORK_READY_FOR_TRANSITION(psLazlow.PedIndex)
REQUEST_TASK_MOVE_NETWORK_STATE_TRANSITION(PLAYER_PED_ID(), "PartOne")
REQUEST_TASK_MOVE_NETWORK_STATE_TRANSITION(psLazlow.PedIndex, "PartOne")
IF BEGIN_SCALEFORM_MOVIE_METHOD(localMov, "ADD_BUTTON")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(enum_to_int(RIGHT_STICK_UP))
END_SCALEFORM_MOVIE_METHOD()
eTattooDirection = RIGHT_STICK_DOWN
fTattooSpeed = 0.005
fTattooPosition = 0.066
bTattooInputReady = TRUE
iScaleformProgress++
ELSE
bTattooInputReady = FALSE
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
case 5
if fTattooPosition >= 0.133
if BEGIN_SCALEFORM_MOVIE_METHOD(localMov,"ADD_BUTTON")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(enum_to_int(RIGHT_STICK_DIAGONAL_UP_RIGHT))
END_SCALEFORM_MOVIE_METHOD()
eTattooDirection = RIGHT_STICK_DIAGONAL_DOWN_RIGHT
fTattooSpeed = 0.005
fTattooPosition = 0.133
bTattooInputReady = true
iScaleformProgress++
else
bTattooInputReady = false
endif
endif
break
case 6
if fTattooPosition >= 0.2
bTattooInputReady = false
fTattooPosition = 0.2
IF IS_TASK_MOVE_NETWORK_ACTIVE(PLAYER_PED_ID())
and IS_TASK_MOVE_NETWORK_ACTIVE(psLazlow.PedIndex)
IF IS_TASK_MOVE_NETWORK_READY_FOR_TRANSITION(PLAYER_PED_ID())
and IS_TASK_MOVE_NETWORK_READY_FOR_TRANSITION(psLazlow.PedIndex)
REQUEST_TASK_MOVE_NETWORK_STATE_TRANSITION(PLAYER_PED_ID(), "PartTwo")
REQUEST_TASK_MOVE_NETWORK_STATE_TRANSITION(psLazlow.PedIndex, "PartTwo")
if BEGIN_SCALEFORM_MOVIE_METHOD(localMov,"ADD_BUTTON")
SET_PED_COMPONENT_VARIATION(psLazlow.PedIndex,PED_COMP_DECL,0,1)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(enum_to_int(RIGHT_STICK_RIGHT))
END_SCALEFORM_MOVIE_METHOD()
eTattooDirection = RIGHT_STICK_UP
fTattooSpeed = 0.005
fTattooPosition = 0.2
bTattooInputReady = true
iScaleformProgress++
else
bTattooInputReady = false
endif
endif
endif
endif
break
case 7
if fTattooPosition >= 0.4
bTattooInputReady = false
fTattooPosition = 0.4
IF IS_TASK_MOVE_NETWORK_ACTIVE(PLAYER_PED_ID())
and IS_TASK_MOVE_NETWORK_ACTIVE(psLazlow.PedIndex)
IF IS_TASK_MOVE_NETWORK_READY_FOR_TRANSITION(PLAYER_PED_ID())
and IS_TASK_MOVE_NETWORK_READY_FOR_TRANSITION(psLazlow.PedIndex)
REQUEST_TASK_MOVE_NETWORK_STATE_TRANSITION(PLAYER_PED_ID(), "PartThree")
REQUEST_TASK_MOVE_NETWORK_STATE_TRANSITION(psLazlow.PedIndex, "PartThree")
if BEGIN_SCALEFORM_MOVIE_METHOD(localMov,"ADD_BUTTON")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(enum_to_int(RIGHT_STICK_DIAGONAL_DOWN_RIGHT))
END_SCALEFORM_MOVIE_METHOD()
fTattooSpeed = 0.005
fTattooPosition = 0.4
iScaleformProgress++
eTattooDirection = RIGHT_STICK_DIAGONAL_UP_RIGHT
SET_PED_COMPONENT_VARIATION(psLazlow.PedIndex,PED_COMP_DECL,0,2)
bTattooInputReady = true
else
bTattooInputReady = false
endif
endif
endif
endif
break
case 8
if fTattooPosition >= 0.466
if BEGIN_SCALEFORM_MOVIE_METHOD(localMov,"ADD_BUTTON")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(enum_to_int(RIGHT_STICK_DOWN))
END_SCALEFORM_MOVIE_METHOD()
fTattooSpeed = 0.005
fTattooPosition = 0.466
eTattooDirection = RIGHT_STICK_RIGHT
bTattooInputReady = true
iScaleformProgress++
else
bTattooInputReady = false
endif
endif
break
case 9
if fTattooPosition >= 0.533
if BEGIN_SCALEFORM_MOVIE_METHOD(localMov,"ADD_BUTTON")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(enum_to_int(RIGHT_STICK_DIAGONAL_DOWN_RIGHT))
END_SCALEFORM_MOVIE_METHOD()
eTattooDirection = RIGHT_STICK_DIAGONAL_DOWN_RIGHT
fTattooSpeed = 0.005
fTattooPosition = 0.533
bTattooInputReady = true
iScaleformProgress++
else
bTattooInputReady = false
endif
endif
break
case 10
if fTattooPosition >= 0.6
fTattooPosition = 0.6
bTattooInputReady = false
IF IS_TASK_MOVE_NETWORK_ACTIVE(PLAYER_PED_ID())
and IS_TASK_MOVE_NETWORK_ACTIVE(psLazlow.PedIndex)
IF IS_TASK_MOVE_NETWORK_READY_FOR_TRANSITION(PLAYER_PED_ID())
and IS_TASK_MOVE_NETWORK_READY_FOR_TRANSITION(psLazlow.PedIndex)
REQUEST_TASK_MOVE_NETWORK_STATE_TRANSITION(PLAYER_PED_ID(), "PartFour")
REQUEST_TASK_MOVE_NETWORK_STATE_TRANSITION(psLazlow.PedIndex, "PartFour")
if BEGIN_SCALEFORM_MOVIE_METHOD(localMov,"ADD_BUTTON")
SET_PED_COMPONENT_VARIATION(psLazlow.PedIndex,PED_COMP_DECL,0,3)
eTattooDirection = RIGHT_STICK_DOWN
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(enum_to_int(RIGHT_STICK_DOWN))
END_SCALEFORM_MOVIE_METHOD()
fTattooSpeed = 0.005
fTattooPosition = 0.6
bTattooInputReady = true
iScaleformProgress++
else
bTattooInputReady = false
endif
endif
endif
endif
break
case 11
if fTattooPosition >= 0.8
fTattooPosition = 0.8
bTattooInputReady = false
IF IS_TASK_MOVE_NETWORK_ACTIVE(PLAYER_PED_ID())
and IS_TASK_MOVE_NETWORK_ACTIVE(psLazlow.PedIndex)
IF IS_TASK_MOVE_NETWORK_READY_FOR_TRANSITION(PLAYER_PED_ID())
and IS_TASK_MOVE_NETWORK_READY_FOR_TRANSITION(psLazlow.PedIndex)
REQUEST_TASK_MOVE_NETWORK_STATE_TRANSITION(PLAYER_PED_ID(), "PartFive")
REQUEST_TASK_MOVE_NETWORK_STATE_TRANSITION(psLazlow.PedIndex, "PartFive")
if BEGIN_SCALEFORM_MOVIE_METHOD(localMov,"ADD_BUTTON")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(enum_to_int(RIGHT_STICK_DIAGONAL_DOWN_LEFT))
END_SCALEFORM_MOVIE_METHOD()
SET_PED_COMPONENT_VARIATION(psLazlow.PedIndex,PED_COMP_DECL,0,4)
eTattooDirection = RIGHT_STICK_DIAGONAL_DOWN_RIGHT
fTattooSpeed = 0.005
fTattooPosition = 0.8
iScaleformProgress++
bTattooInputReady = true
else
bTattooInputReady = false
endif
endif
endif
endif
break
case 12
if fTattooPosition >= 0.866
if BEGIN_SCALEFORM_MOVIE_METHOD(localMov,"ADD_BUTTON")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(enum_to_int(SPACER))
END_SCALEFORM_MOVIE_METHOD()
eTattooDirection = RIGHT_STICK_DOWN
fTattooSpeed = 0.005
fTattooPosition = 0.866
iScaleformProgress++
bTattooInputReady = true
else
bTattooInputReady = false
endif
endif
break
case 13
if fTattooPosition >= 0.933
if BEGIN_SCALEFORM_MOVIE_METHOD(localMov,"ADD_BUTTON")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(enum_to_int(SPACER))
END_SCALEFORM_MOVIE_METHOD()
eTattooDirection = RIGHT_STICK_DIAGONAL_DOWN_LEFT
bTattooInputReady = true
fTattooSpeed = 0.005
fTattooPosition = 0.933
iScaleformProgress++
else
bTattooInputReady = false
ENDIF
ENDIF
BREAK
CASE 14
IF fTattooPosition >= 0.99
if BEGIN_SCALEFORM_MOVIE_METHOD(localMov,"ADD_BUTTON")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(ENUM_TO_INT(SPACER))
END_SCALEFORM_MOVIE_METHOD()
fTattooSpeed = 0.005
fTattooPosition = 1
iScaleformProgress = 0
SET_PED_COMPONENT_VARIATION(psLazlow.PedIndex,PED_COMP_DECL,0,5)
eTattooDirection = RIGHT_STICK_DIAGONAL_DOWN_LEFT
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDPROC
PROC BACK_DRAWING(SCALEFORM_INDEX &localMov, INT &iScaleformProgress)
switch iScaleformProgress
case 0
//scale form
bTattooInputReady = false
if BEGIN_SCALEFORM_MOVIE_METHOD(localMov,"ADD_BUTTON")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(enum_to_int(SPACER))
END_SCALEFORM_MOVIE_METHOD()
iScaleformProgress++
endif
break
case 1
BEGIN_SCALEFORM_MOVIE_METHOD(localMov,"ADD_BUTTON")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(enum_to_int(RIGHT_STICK_DIAGONAL_DOWN_LEFT))
END_SCALEFORM_MOVIE_METHOD()
BEGIN_SCALEFORM_MOVIE_METHOD(localMov,"ADD_BUTTON")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(enum_to_int(RIGHT_STICK_DOWN))
END_SCALEFORM_MOVIE_METHOD()
BEGIN_SCALEFORM_MOVIE_METHOD(localMov,"ADD_BUTTON")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(enum_to_int(RIGHT_STICK_DIAGONAL_DOWN_RIGHT))
END_SCALEFORM_MOVIE_METHOD()
iScaleformProgress++
break
case 2
iScaleformProgress++
break
case 3
eTattooDirection = RIGHT_STICK_DIAGONAL_DOWN_LEFT
bTattooInputReady = true
iScaleformProgress++
break
case 4
if fTattooPosition >= 0.066
IF IS_TASK_MOVE_NETWORK_ACTIVE(PLAYER_PED_ID())
and IS_TASK_MOVE_NETWORK_ACTIVE(psLazlow.PedIndex)
IF IS_TASK_MOVE_NETWORK_READY_FOR_TRANSITION(PLAYER_PED_ID())
and IS_TASK_MOVE_NETWORK_READY_FOR_TRANSITION(psLazlow.PedIndex)
REQUEST_TASK_MOVE_NETWORK_STATE_TRANSITION(PLAYER_PED_ID(), "BackPartOne")
REQUEST_TASK_MOVE_NETWORK_STATE_TRANSITION(psLazlow.PedIndex, "BackPartOne")
if BEGIN_SCALEFORM_MOVIE_METHOD(localMov,"ADD_BUTTON")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(enum_to_int(RIGHT_STICK_UP))
END_SCALEFORM_MOVIE_METHOD()
eTattooDirection = RIGHT_STICK_DOWN
fTattooSpeed = 0.005
fTattooPosition = 0.066
bTattooInputReady = true
iScaleformProgress++
else
bTattooInputReady = false
endif
endif
endif
endif
break
case 5
if fTattooPosition >= 0.133
if BEGIN_SCALEFORM_MOVIE_METHOD(localMov,"ADD_BUTTON")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(enum_to_int(RIGHT_STICK_DIAGONAL_UP_RIGHT))
END_SCALEFORM_MOVIE_METHOD()
eTattooDirection = RIGHT_STICK_DIAGONAL_DOWN_RIGHT
fTattooSpeed = 0.005
fTattooPosition = 0.133
bTattooInputReady = true
iScaleformProgress++
else
bTattooInputReady = false
endif
endif
break
case 6
if fTattooPosition >= 0.2
bTattooInputReady = false
fTattooPosition = 0.2
IF IS_TASK_MOVE_NETWORK_ACTIVE(PLAYER_PED_ID())
and IS_TASK_MOVE_NETWORK_ACTIVE(psLazlow.PedIndex)
IF IS_TASK_MOVE_NETWORK_READY_FOR_TRANSITION(PLAYER_PED_ID())
and IS_TASK_MOVE_NETWORK_READY_FOR_TRANSITION(psLazlow.PedIndex)
REQUEST_TASK_MOVE_NETWORK_STATE_TRANSITION(PLAYER_PED_ID(), "BackPartTwo")
REQUEST_TASK_MOVE_NETWORK_STATE_TRANSITION(psLazlow.PedIndex, "BackPartTwo")
if BEGIN_SCALEFORM_MOVIE_METHOD(localMov,"ADD_BUTTON")
SET_PED_COMPONENT_VARIATION(psLazlow.PedIndex,PED_COMP_DECL,1,1)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(enum_to_int(RIGHT_STICK_RIGHT))
END_SCALEFORM_MOVIE_METHOD()
eTattooDirection = RIGHT_STICK_UP
fTattooSpeed = 0.005
fTattooPosition = 0.2
bTattooInputReady = true
iScaleformProgress++
else
bTattooInputReady = false
endif
endif
endif
endif
break
case 7
if fTattooPosition >= 0.4
bTattooInputReady = false
fTattooPosition = 0.4
IF IS_TASK_MOVE_NETWORK_ACTIVE(PLAYER_PED_ID())
and IS_TASK_MOVE_NETWORK_ACTIVE(psLazlow.PedIndex)
IF IS_TASK_MOVE_NETWORK_READY_FOR_TRANSITION(PLAYER_PED_ID())
and IS_TASK_MOVE_NETWORK_READY_FOR_TRANSITION(psLazlow.PedIndex)
REQUEST_TASK_MOVE_NETWORK_STATE_TRANSITION(PLAYER_PED_ID(), "BackPartThree")
REQUEST_TASK_MOVE_NETWORK_STATE_TRANSITION(psLazlow.PedIndex, "BackPartThree")
if BEGIN_SCALEFORM_MOVIE_METHOD(localMov,"ADD_BUTTON")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(enum_to_int(RIGHT_STICK_DIAGONAL_DOWN_RIGHT))
END_SCALEFORM_MOVIE_METHOD()
fTattooSpeed = 0.005
fTattooPosition = 0.4
iScaleformProgress++
eTattooDirection = RIGHT_STICK_DIAGONAL_UP_RIGHT
SET_PED_COMPONENT_VARIATION(psLazlow.PedIndex,PED_COMP_DECL,1,2)
bTattooInputReady = true
else
bTattooInputReady = false
endif
endif
endif
endif
break
case 8
if fTattooPosition >= 0.466
if BEGIN_SCALEFORM_MOVIE_METHOD(localMov,"ADD_BUTTON")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(enum_to_int(RIGHT_STICK_DOWN))
END_SCALEFORM_MOVIE_METHOD()
fTattooSpeed = 0.005
fTattooPosition = 0.466
eTattooDirection = RIGHT_STICK_RIGHT
bTattooInputReady = true
iScaleformProgress++
else
bTattooInputReady = false
endif
endif
break
case 9
if fTattooPosition >= 0.533
if BEGIN_SCALEFORM_MOVIE_METHOD(localMov,"ADD_BUTTON")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(enum_to_int(RIGHT_STICK_DIAGONAL_DOWN_RIGHT))
END_SCALEFORM_MOVIE_METHOD()
eTattooDirection = RIGHT_STICK_DIAGONAL_DOWN_RIGHT
fTattooSpeed = 0.005
fTattooPosition = 0.533
bTattooInputReady = true
iScaleformProgress++
else
bTattooInputReady = false
endif
endif
break
case 10
if fTattooPosition >= 0.6
fTattooPosition = 0.6
bTattooInputReady = false
IF IS_TASK_MOVE_NETWORK_ACTIVE(PLAYER_PED_ID())
and IS_TASK_MOVE_NETWORK_ACTIVE(psLazlow.PedIndex)
IF IS_TASK_MOVE_NETWORK_READY_FOR_TRANSITION(PLAYER_PED_ID())
and IS_TASK_MOVE_NETWORK_READY_FOR_TRANSITION(psLazlow.PedIndex)
REQUEST_TASK_MOVE_NETWORK_STATE_TRANSITION(PLAYER_PED_ID(), "BackPartFour")
REQUEST_TASK_MOVE_NETWORK_STATE_TRANSITION(psLazlow.PedIndex, "BackPartFour")
if BEGIN_SCALEFORM_MOVIE_METHOD(localMov,"ADD_BUTTON")
SET_PED_COMPONENT_VARIATION(psLazlow.PedIndex,PED_COMP_DECL,1,3)
eTattooDirection = RIGHT_STICK_DOWN
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(enum_to_int(RIGHT_STICK_DOWN))
END_SCALEFORM_MOVIE_METHOD()
fTattooSpeed = 0.005
fTattooPosition = 0.6
bTattooInputReady = true
iScaleformProgress++
else
bTattooInputReady = false
endif
endif
endif
endif
break
case 11
if fTattooPosition >= 0.8
fTattooPosition = 0.8
bTattooInputReady = false
IF IS_TASK_MOVE_NETWORK_ACTIVE(PLAYER_PED_ID())
and IS_TASK_MOVE_NETWORK_ACTIVE(psLazlow.PedIndex)
IF IS_TASK_MOVE_NETWORK_READY_FOR_TRANSITION(PLAYER_PED_ID())
and IS_TASK_MOVE_NETWORK_READY_FOR_TRANSITION(psLazlow.PedIndex)
REQUEST_TASK_MOVE_NETWORK_STATE_TRANSITION(PLAYER_PED_ID(), "BackPartFive")
REQUEST_TASK_MOVE_NETWORK_STATE_TRANSITION(psLazlow.PedIndex, "BackPartFive")
if BEGIN_SCALEFORM_MOVIE_METHOD(localMov,"ADD_BUTTON")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(enum_to_int(RIGHT_STICK_DIAGONAL_DOWN_LEFT))
END_SCALEFORM_MOVIE_METHOD()
SET_PED_COMPONENT_VARIATION(psLazlow.PedIndex,PED_COMP_DECL,1,4)
eTattooDirection = RIGHT_STICK_DIAGONAL_DOWN_RIGHT
fTattooSpeed = 0.005
fTattooPosition = 0.8
iScaleformProgress++
bTattooInputReady = true
else
bTattooInputReady = false
endif
endif
endif
endif
break
case 12
if fTattooPosition >= 0.866
if BEGIN_SCALEFORM_MOVIE_METHOD(localMov,"ADD_BUTTON")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(enum_to_int(SPACER))
END_SCALEFORM_MOVIE_METHOD()
eTattooDirection = RIGHT_STICK_DOWN
fTattooSpeed = 0.005
fTattooPosition = 0.866
iScaleformProgress++
bTattooInputReady = true
else
bTattooInputReady = false
endif
endif
break
case 13
if fTattooPosition >= 0.933
if BEGIN_SCALEFORM_MOVIE_METHOD(localMov,"ADD_BUTTON")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(enum_to_int(SPACER))
END_SCALEFORM_MOVIE_METHOD()
eTattooDirection = RIGHT_STICK_DIAGONAL_DOWN_LEFT
bTattooInputReady = true
fTattooSpeed = 0.005
fTattooPosition = 0.933
iScaleformProgress++
else
bTattooInputReady = false
endif
endif
break
case 14
if fTattooPosition >= 0.99
if BEGIN_SCALEFORM_MOVIE_METHOD(localMov,"ADD_BUTTON")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(enum_to_int(SPACER))
END_SCALEFORM_MOVIE_METHOD()
fTattooSpeed = 0.005
fTattooPosition = 1
iScaleformProgress = 0
SET_PED_COMPONENT_VARIATION(psLazlow.PedIndex,PED_COMP_DECL,1,5)
eTattooDirection = RIGHT_STICK_DIAGONAL_DOWN_LEFT
endif
endif
break
endswitch
endproc
PROC MANAGE_TATTOO_MOVE()
SCALEFORM_INDEX mov_local
IF IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL)
mov_local = mov_kb
ELSE
mov_local = mov
ENDIF
IF bScaleformDrawing
INT i_right_stick_x, i_right_stick_y, angle
FLOAT increase_val, Max_val
angle = GET_STICK_ROTATION_ANGLE(STICK_RIGHT)
i_right_stick_x = FLOOR(GET_CONTROL_NORMAL(FRONTEND_CONTROL, INPUT_SCRIPT_RIGHT_AXIS_X) * 127)
i_right_stick_y = FLOOR(GET_CONTROL_NORMAL(FRONTEND_CONTROL, INPUT_SCRIPT_RIGHT_AXIS_Y) * 127)
IF IS_USING_KEYBOARD_AND_MOUSE(PLAYER_CONTROL)
//DISPLAY_TEXT_WITH_NUMBER( 0.6, 0.1, "NUMBER", iRightX )
//DISPLAY_TEXT_WITH_NUMBER( 0.6, 0.2, "NUMBER", iRightY )
// Make input 'sticky' so it doesn't auto-centre.
IF ( i_right_stick_x = 0 AND i_right_stick_y = 0 )
i_right_stick_x = iStickXPrev
i_right_stick_y = iStickYPrev
ENDIF
iStickXPrev = i_right_stick_x
iStickYPrev = i_right_stick_y
ENDIF
IF HAS_SCALEFORM_LOADED()
SET_SCRIPT_GFX_DRAW_BEHIND_PAUSEMENU(FALSE)
SET_WIDESCREEN_FORMAT(WIDESCREEN_FORMAT_CENTRE)
IF ( GET_IS_WIDESCREEN() = FALSE )
OR ( GET_PROFILE_SETTING(PROFILE_DISPLAY_LANGUAGE) = ENUM_TO_INT(LANGUAGE_KOREAN) )
OR ( GET_PROFILE_SETTING(PROFILE_DISPLAY_LANGUAGE) = ENUM_TO_INT(LANGUAGE_CHINESE) )
OR ( GET_PROFILE_SETTING(PROFILE_DISPLAY_LANGUAGE) = ENUM_TO_INT(LANGUAGE_JAPANESE) )
OR ( GET_PROFILE_SETTING(PROFILE_DISPLAY_LANGUAGE) = ENUM_TO_INT(LANGUAGE_CHINESE_SIMPLIFIED) )
TATTOO_BUTTONS_Y = 0.745
ENDIF
IF NOT IS_PAUSE_MENU_ACTIVE()
DRAW_SCALEFORM_MOVIE(mov_local, TATTOO_BUTTONS_X, TATTOO_BUTTONS_Y,
TATTOO_BUTTONS_WIDTH * TATTOO_BUTTONS_SCALE, TATTOO_BUTTONS_HEIGHT * TATTOO_BUTTONS_SCALE, 100, 100, 100, 255)
ENDIF
IF eTattooingStage = TATTOOING_CHEST
fTattooSpeed = 0.005
CHEST_DRAWING(mov, iScaleformProgressPad)
IF IS_PC_VERSION()
CHEST_DRAWING(mov_kb, iScaleformProgressKBM)
ENDIF
ELIF eTattooingStage = TATTOOING_BACK
fTattooSpeed = 0.005
BACK_DRAWING(mov, iScaleformProgressPad)
IF IS_PC_VERSION()
BACK_DRAWING(mov_kb, iScaleformProgressKBM)
ENDIF
ENDIF
IF bTattooInputReady
IF NOT IS_STICK_IN_DEAD_ZONE(STICK_RIGHT)
switch eTattooDirection
case RIGHT_STICK_UP
if i_right_stick_x >= -40
and i_right_stick_x <= 40
max_val = -127
increase_val = clamp(TO_FLOAT(i_right_stick_y),max_val,0)
endif
break
case RIGHT_STICK_DIAGONAL_UP_RIGHT
if i_right_stick_x >= 45
and i_right_stick_y <= -45
max_val = 192
increase_val = clamp(TO_FLOAT((i_right_stick_x + -i_right_stick_y)),0,max_val)
endif
break
case RIGHT_STICK_RIGHT
if i_right_stick_y >= -40
and i_right_stick_y <= 40
max_val = 127
increase_val = clamp(TO_FLOAT(i_right_stick_x),0,max_val)
endif
break
case RIGHT_STICK_DIAGONAL_DOWN_RIGHT
if i_right_stick_x >= 45
and i_right_stick_y >= 45
max_val = 192
increase_val = clamp(TO_FLOAT((i_right_stick_x + i_right_stick_y)),0,max_val)
endif
break
case RIGHT_STICK_DOWN
if i_right_stick_x >= -40
and i_right_stick_x <= 40
max_val = 127
increase_val = clamp(TO_FLOAT(i_right_stick_y),0,max_val)
endif
break
case RIGHT_STICK_DIAGONAL_DOWN_LEFT
if i_right_stick_x <= -45
and i_right_stick_y >= 45
max_val = 192
increase_val = clamp(TO_FLOAT((-i_right_stick_x + i_right_stick_y)),0,max_val)
endif
break
case RIGHT_STICK_LEFT
if i_right_stick_y >= -40
and i_right_stick_y <= 40
max_val = -127
increase_val = clamp(TO_FLOAT(i_right_stick_x),max_val,0)
endif
break
case RIGHT_STICK_DIAGONAL_UP_LEFT
if i_right_stick_x <= -45
and i_right_stick_y <= -45
max_val = 192
increase_val = clamp(TO_FLOAT((-i_right_stick_x + -i_right_stick_y)),0,max_val)
endif
break
endswitch
ENDIF
#IF IS_DEBUG_BUILD
DRAW_DEBUG_TEXT_2D(GET_STRING_FROM_FLOAT(increase_val), << 0.5, 0.5, 0.0 >>)
#ENDIF
IF NOT IS_STICK_IN_DEAD_ZONE(STICK_RIGHT)
BEGIN_SCALEFORM_MOVIE_METHOD(mov_local, "SET_STICK_POINTER_ANGLE")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(angle) //pass in the current stick angle
IF ABSF(increase_val) > 0.0
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(ENUM_TO_INT(HUD_COLOUR_YOGA)) //pass in the colour when stick is in position
ELSE
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(ENUM_TO_INT(HUD_COLOUR_WHITE)) //reset the color when stick is not in position
ENDIF
END_SCALEFORM_MOVIE_METHOD()
ELSE
BEGIN_SCALEFORM_MOVIE_METHOD(mov_local, "SET_STICK_POINTER_ANGLE")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(-1) //reset the stick and set default color
END_SCALEFORM_MOVIE_METHOD()
ENDIF
//work out percentage * speed
float increasePercentage = (increase_val / max_val)
FLOAT f_vel_y = increasePercentage * fTattooSpeed
IF NOT HAS_SOUND_FINISHED(iTattooSoundID)
SET_VARIABLE_ON_SOUND(iTattooSoundID,"DoTattoo",increasePercentage)
ENDIF
IF increasePercentage <= 0
SET_CONTROL_SHAKE(PLAYER_CONTROL,100,50)
ELSE
SET_CONTROL_SHAKE(PLAYER_CONTROL,250,ROUND(256*increasePercentage))
ENDIF
fTattooPosition = clamp((fTattooPosition + f_vel_y),0,1)
ELSE
SET_CONTROL_SHAKE(PLAYER_CONTROL, 100, 50)
IF NOT HAS_SOUND_FINISHED(iTattooSoundID)
SET_VARIABLE_ON_SOUND(iTattooSoundID, "DoTattoo", 0)
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
FUNC BOOL IS_MISSION_STAGE_TATTOO_LAZLOW_COMPLETED(INT &iStageProgress)
MANAGE_TATTOO_STAGES()
SWITCH iStageProgress
CASE 0
bChestTattoo = FALSE
eTattooingStage = TATTOOING_IDLE
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
AND NOT IS_PED_INJURED(psLazlow.PedIndex)
IF NOT IS_TASK_MOVE_NETWORK_ACTIVE(PLAYER_PED_ID())
AND NOT IS_TASK_MOVE_NETWORK_ACTIVE(psLazlow.PedIndex)
REQUEST_MODEL(osTattooNeedle.ModelName)
REQUEST_ANIM_DICT("missfam6ig_7_tattoo")
mov = REQUEST_SCALEFORM_MOVIE("tattoo_buttons")
IF IS_PC_VERSION()
mov_kb = REQUEST_SCALEFORM_MOVIE("tattoo_keys")
ENDIF
IF HAS_SCALEFORM_LOADED()
AND HAS_MODEL_LOADED(osTattooNeedle.ModelName)
AND HAS_ANIM_DICT_LOADED("missfam6ig_7_tattoo")
IF HAS_MISSION_OBJECT_BEEN_CREATED(osTattooNeedle)
ATTACH_ENTITY_TO_ENTITY(osTattooNeedle.ObjectIndex, 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 >>)
ENDIF
TASK_MOVE_NETWORK_ADVANCED_BY_NAME(PLAYER_PED_ID(), "minigame_tattoo_michael_parts", << 324.130, 181.290, 102.600 >>, << 0.0, 0.0, -22.320 >>)
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID())
TASK_MOVE_NETWORK_ADVANCED_BY_NAME(psLazlow.PedIndex, "minigame_tattoo_lazlow_parts",<< 324.130, 181.290, 102.600 >>,<< 0, 0, -22.320 >>)
FORCE_PED_AI_AND_ANIMATION_UPDATE(psLazlow.PedIndex)
IF NOT DOES_CAM_EXIST(ScriptedCamera)
ScriptedCamera = CREATE_CAMERA(CAMTYPE_SCRIPTED, TRUE)
SET_CAM_PARAMS(ScriptedCamera, << 326.1551, 179.2442, 104.5627 >>, << -36.8795, 13.4340, 33.8400 >>, 52.0)
SHAKE_CAM(ScriptedCamera,"HAND_SHAKE",0.5)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
ENDIF
IF NOT DOES_CAM_EXIST(AnimatedCamera)
AnimatedCamera = CREATE_CAMERA(CAMTYPE_ANIMATED, FALSE)
ENDIF
IF NOT IS_PED_INJURED(psJimmy.PedIndex)
SEQUENCE_INDEX JimmySequenceIndex
CLEAR_SEQUENCE_TASK(JimmySequenceIndex)
OPEN_SEQUENCE_TASK(JimmySequenceIndex)
TASK_TURN_PED_TO_FACE_ENTITY(NULL, psLazlow.PedIndex)
TASK_PLAY_ANIM(NULL, "missfam6ig_7_tattoo", "ig_7_idle_02_jimmy", WALK_BLEND_IN, WALK_BLEND_OUT, -1, AF_LOOPING | AF_NOT_INTERRUPTABLE)
CLOSE_SEQUENCE_TASK(JimmySequenceIndex)
TASK_PERFORM_SEQUENCE(psJimmy.PedIndex, JimmySequenceIndex)
CLEAR_SEQUENCE_TASK(JimmySequenceIndex)
FORCE_PED_AI_AND_ANIMATION_UPDATE(psJimmy.PedIndex)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(psJimmy.PedIndex, TRUE)
ENDIF
IF NOT IS_PED_INJURED(psTracey.PedIndex)
TASK_PLAY_ANIM(psTracey.PedIndex, "missfam6ig_7_tattoo", "ig_7_idle_01_tracey", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1, AF_LOOPING | AF_NOT_INTERRUPTABLE)
FORCE_PED_AI_AND_ANIMATION_UPDATE(psTracey.PedIndex)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(psTracey.PedIndex, TRUE)
ENDIF
SET_MODEL_AS_NO_LONGER_NEEDED(osTattooNeedle.ModelName)
ENDIF
ELSE
iConversationCounter = 0
iIdleConversationcounter = 0
iIdle1Conversationcounter = 0
iIdle2Conversationcounter = 0
iStruggleConversationTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(1000, 1500)
iConversationTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(250, 1000)
iScaleformProgressPad = 0
iScaleformProgressKBM = 0
iTattooCameraProgress = 0
fTattooPosition = 0.0
bChestTattoo = FALSE
bTattooInputReady = FALSE
eTattooingStage = TATTOOING_IDLE
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
START_AUDIO_SCENE("FAMILY_6_TATTOO_LAZLOW_MG")
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
bReplayStartEventTriggered = TRUE
IF IS_SCREEN_FADED_OUT()
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
ENDIF
SETUP_PC_CONTROLS()
iStickXPrev = 0
iStickYPrev = 0
iStageProgress++
ENDIF
ENDIF
BREAK
CASE 1
IF IS_SCREEN_FADED_IN()
AND NOT IS_SCREEN_FADING_IN()
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM6_TATCH")
PRINT_HELP_FOREVER("FAM6_TATCH")
SET_LABEL_AS_TRIGGERED("FAM6_TATCH", TRUE)
ENDIF
ENDIF
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
AND NOT IS_PED_INJURED(psLazlow.PedIndex)
IF IS_TASK_MOVE_NETWORK_ACTIVE(PLAYER_PED_ID())
AND IS_TASK_MOVE_NETWORK_ACTIVE(psLazlow.PedIndex)
IF IS_TASK_MOVE_NETWORK_READY_FOR_TRANSITION(PLAYER_PED_ID())
AND IS_TASK_MOVE_NETWORK_READY_FOR_TRANSITION(psLazlow.PedIndex)
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_RRIGHT)
REQUEST_TASK_MOVE_NETWORK_STATE_TRANSITION(PLAYER_PED_ID(), "back")
REQUEST_TASK_MOVE_NETWORK_STATE_TRANSITION(psLazlow.PedIndex, "back")
SET_CAM_ACTIVE(AnimatedCamera, TRUE)
PLAY_CAM_ANIM(AnimatedCamera, "ig_7_back_intro_cam", "missfam6ig_7_tattoo", << 324.130, 181.290, 102.600 >>, << 0.0, 0.0, -22.320 >>)
bChestTattoo = FALSE
eTattooingStage = TATTOOING_BACK
g_replay.iReplayInt[0] = ENUM_TO_INT(TATTOOING_BACK) //fix for B*1918478, store Lazlow's tattoo info in a global int for next stage retry
INFORM_STAT_SYSTEM_OF_BOOL_STAT_HAPPENED(FAM6_FRONT_OR_BACK)
INFORM_MISSION_STATS_SYSTEM_OF_TIME_WINDOW_OPEN(FAM6_TATTOO_TIME)
iStageProgress++
ELIF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_RLEFT)
REQUEST_TASK_MOVE_NETWORK_STATE_TRANSITION(PLAYER_PED_ID(), "front")
REQUEST_TASK_MOVE_NETWORK_STATE_TRANSITION(psLazlow.PedIndex, "front")
SET_CAM_ACTIVE(AnimatedCamera, TRUE)
PLAY_CAM_ANIM(AnimatedCamera, "ig_7_front_intro_cam", "missfam6ig_7_tattoo", << 324.130, 181.290, 102.600 >>, << 0.0, 0.0, -22.320 >>)
bChestTattoo = TRUE
eTattooingStage = TATTOOING_CHEST
g_replay.iReplayInt[0] = ENUM_TO_INT(TATTOOING_CHEST) //fix for B*1918478, store Lazlow's tattoo info in a global int for next stage retry
INFORM_MISSION_STATS_SYSTEM_OF_TIME_WINDOW_OPEN(FAM6_TATTOO_TIME)
iStageProgress++
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE 2
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
AND NOT IS_PED_INJURED(psLazlow.PedIndex)
IF IS_TASK_MOVE_NETWORK_ACTIVE(PLAYER_PED_ID())
AND IS_TASK_MOVE_NETWORK_ACTIVE(psLazlow.PedIndex)
IF IS_TASK_MOVE_NETWORK_READY_FOR_TRANSITION(PLAYER_PED_ID())
AND IS_TASK_MOVE_NETWORK_READY_FOR_TRANSITION(psLazlow.PedIndex)
iConversationTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(500, 1500)
iStageProgress++
ENDIF
ENDIF
ENDIF
BREAK
CASE 3
IF IS_SCREEN_FADED_IN()
AND NOT IS_SCREEN_FADING_IN()
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM6_TAT")
PRINT_HELP_FOREVER("FAM6_TAT")
SET_LABEL_AS_TRIGGERED("FAM6_TAT", TRUE)
ENDIF
ENDIF
MANAGE_TATTOO_MOVE()
MANAGE_TATTOO_STAGES()
IF fTattooPosition >= 1.0
IF IS_HELP_MESSAGE_BEING_DISPLAYED()
CLEAR_HELP(TRUE)
ENDIF
iStageProgress++
ENDIF
BREAK
CASE 4
IF HAS_LABEL_BEEN_TRIGGERED("FAM6_TATFIN")
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
AND NOT IS_PED_INJURED(psLazlow.PedIndex)
IF IS_TASK_MOVE_NETWORK_ACTIVE(PLAYER_PED_ID())
AND IS_TASK_MOVE_NETWORK_ACTIVE(psLazlow.PedIndex)
IF IS_TASK_MOVE_NETWORK_READY_FOR_TRANSITION(PLAYER_PED_ID())
AND IS_TASK_MOVE_NETWORK_READY_FOR_TRANSITION(psLazlow.PedIndex)
IF fTattooPosition >= 1.0
REQUEST_TASK_MOVE_NETWORK_STATE_TRANSITION(PLAYER_PED_ID(), "success")
REQUEST_TASK_MOVE_NETWORK_STATE_TRANSITION(psLazlow.PedIndex, "success")
INFORM_MISSION_STATS_SYSTEM_OF_TIME_WINDOW_CLOSED()
iStageProgress++
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE 5
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
AND NOT IS_PED_INJURED(psLazlow.PedIndex)
IF IS_TASK_MOVE_NETWORK_ACTIVE(PLAYER_PED_ID())
AND IS_TASK_MOVE_NETWORK_ACTIVE(psLazlow.PedIndex)
IF IS_TASK_MOVE_NETWORK_READY_FOR_TRANSITION(PLAYER_PED_ID())
AND IS_TASK_MOVE_NETWORK_READY_FOR_TRANSITION(psLazlow.PedIndex)
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
IF ( bReplayStartEventTriggered = TRUE )
IF ( bReplayStopEventTriggered = FALSE )
REPLAY_STOP_EVENT()
bReplayStopEventTriggered = TRUE
ENDIF
ENDIF
CLEANUP_PC_CONTROLS()
RETURN TRUE
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
SWITCH eTattooingStage
CASE TATTOOING_BACK
REQUEST_CUTSCENE_WITH_PLAYBACK_LIST("fam_6_mcs_4", CS_SECTION_1 | CS_SECTION_2 | CS_SECTION_5)
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", PLAYER_PED_ID(), PLAYER_ZERO)
SET_JIMMY_CUTSCENE_COMPONENT_VARIATIONS()
SET_TRACEY_CUTSCENE_COMPONENT_VARIATIONS()
SET_LAZLOW_CUTSCENE_COMPONENT_VARIATIONS(TRUE, TRUE, FALSE, TRUE, bChestTattoo)
bCutsceneAssetsRequested = TRUE
ENDIF
BREAK
CASE TATTOOING_CHEST
REQUEST_CUTSCENE_WITH_PLAYBACK_LIST("fam_6_mcs_4", CS_SECTION_3 | CS_SECTION_4 | CS_SECTION_5)
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", PLAYER_PED_ID(), PLAYER_ZERO)
SET_JIMMY_CUTSCENE_COMPONENT_VARIATIONS()
SET_TRACEY_CUTSCENE_COMPONENT_VARIATIONS()
SET_LAZLOW_CUTSCENE_COMPONENT_VARIATIONS(TRUE, TRUE, FALSE, TRUE, bChestTattoo)
bCutsceneAssetsRequested = TRUE
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
FUNC BOOL IS_MISSION_STAGE_CUTSCENE_SHOP_3_COMPLETED(INT &iStageProgress)
SWITCH iStageProgress
CASE 0
REQUEST_ANIM_DICT("missfam6ig_7_tattoo")
SWITCH eTattooingStage
CASE TATTOOING_IDLE
CASE TATTOOING_BACK
bChestTattoo = FALSE
IF HAS_REQUESTED_CUTSCENE_LOADED("fam_6_mcs_4", CS_SECTION_1 | CS_SECTION_2 | CS_SECTION_5) AND HAS_ANIM_DICT_LOADED("missfam6ig_7_tattoo")
IF NOT IS_PED_INJURED(psLazlow.PedIndex)
REGISTER_ENTITY_FOR_CUTSCENE(psLazlow.PedIndex, "Lazlow", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, psLazlow.ModelName)
ENDIF
IF DOES_ENTITY_EXIST(osTattooNeedle.ObjectIndex)
IF NOT HAS_SOUND_FINISHED(iTattooSoundID)
STOP_SOUND(iTattooSoundID)
ENDIF
IF NOT IS_ENTITY_DEAD(osTattooNeedle.ObjectIndex)
IF IS_ENTITY_ATTACHED(osTattooNeedle.ObjectIndex)
DETACH_ENTITY(osTattooNeedle.ObjectIndex, FALSE, TRUE)
ENDIF
REGISTER_ENTITY_FOR_CUTSCENE(osTattooNeedle.ObjectIndex, "Tattoo_Gun", CU_ANIMATE_AND_DELETE_EXISTING_SCRIPT_ENTITY, osTattooNeedle.ModelName)
ENDIF
ENDIF
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
STOP_AUDIO_SCENES()
START_CUTSCENE()
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
iStageProgress++
ELSE
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", PLAYER_PED_ID(), PLAYER_ZERO)
SET_JIMMY_CUTSCENE_COMPONENT_VARIATIONS()
SET_TRACEY_CUTSCENE_COMPONENT_VARIATIONS()
SET_LAZLOW_CUTSCENE_COMPONENT_VARIATIONS(TRUE, TRUE, FALSE, TRUE, bChestTattoo)
ENDIF
ENDIF
BREAK
CASE TATTOOING_CHEST
bChestTattoo = TRUE
IF HAS_REQUESTED_CUTSCENE_LOADED("fam_6_mcs_4", CS_SECTION_3 | CS_SECTION_4 | CS_SECTION_5) AND HAS_ANIM_DICT_LOADED("missfam6ig_7_tattoo")
IF NOT IS_PED_INJURED(psLazlow.PedIndex)
REGISTER_ENTITY_FOR_CUTSCENE(psLazlow.PedIndex, "Lazlow", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, psLazlow.ModelName)
ENDIF
IF DOES_ENTITY_EXIST(osTattooNeedle.ObjectIndex)
IF NOT HAS_SOUND_FINISHED(iTattooSoundID)
STOP_SOUND(iTattooSoundID)
ENDIF
IF NOT IS_ENTITY_DEAD(osTattooNeedle.ObjectIndex)
IF IS_ENTITY_ATTACHED(osTattooNeedle.ObjectIndex)
DETACH_ENTITY(osTattooNeedle.ObjectIndex, FALSE, TRUE)
ENDIF
REGISTER_ENTITY_FOR_CUTSCENE(osTattooNeedle.ObjectIndex, "Tattoo_Gun", CU_ANIMATE_AND_DELETE_EXISTING_SCRIPT_ENTITY, osTattooNeedle.ModelName)
ENDIF
ENDIF
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
STOP_AUDIO_SCENES()
START_CUTSCENE()
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
iStageProgress++
ELSE
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", PLAYER_PED_ID(), PLAYER_ZERO)
SET_JIMMY_CUTSCENE_COMPONENT_VARIATIONS()
SET_TRACEY_CUTSCENE_COMPONENT_VARIATIONS()
SET_LAZLOW_CUTSCENE_COMPONENT_VARIATIONS(TRUE, TRUE, FALSE, TRUE, bChestTattoo)
ENDIF
ENDIF
BREAK
ENDSWITCH
BREAK
CASE 1
IF IS_CUTSCENE_PLAYING()
CLEANUP_MISSION_OBJECT(osShirt, TRUE)
CLEANUP_MISSION_OBJECT(osPiercingGun, TRUE)
IF DOES_CAM_EXIST(ScriptedCamera)
DESTROY_CAM(ScriptedCamera)
ENDIF
IF DOES_CAM_EXIST(AnimatedCamera)
DESTROY_CAM(AnimatedCamera)
ENDIF
//give tasks to jimmy and tracey as they are not part of this cutscene
IF NOT IS_PED_INJURED(psTracey.PedIndex)
WARP_PED(psTracey.PedIndex, <<321.58142, 181.34822, 102.58653>>, -125.61, FALSE, FALSE, FALSE)
TASK_PLAY_ANIM(psTracey.PedIndex, "missfam6ig_7_tattoo", "ig_7_idle_01_tracey", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1, AF_LOOPING | AF_NOT_INTERRUPTABLE)
TASK_LOOK_AT_ENTITY(psTracey.PedIndex, psLazlow.PedIndex, INFINITE_TASK_TIME, SLF_WHILE_NOT_IN_FOV)
FORCE_PED_AI_AND_ANIMATION_UPDATE(psTracey.PedIndex)
ENDIF
IF NOT IS_PED_INJURED(psJimmy.PedIndex)
WARP_PED(psJimmy.PedIndex, <<321.65167, 182.52638, 102.58653>>, -115.96, FALSE, FALSE, FALSE)
SEQUENCE_INDEX JimmySequenceIndex
CLEAR_SEQUENCE_TASK(JimmySequenceIndex)
OPEN_SEQUENCE_TASK(JimmySequenceIndex)
TASK_TURN_PED_TO_FACE_ENTITY(NULL, psLazlow.PedIndex)
TASK_PLAY_ANIM(NULL, "missfam6ig_7_tattoo", "ig_7_idle_02_jimmy", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1, AF_LOOPING | AF_NOT_INTERRUPTABLE)
CLOSE_SEQUENCE_TASK(JimmySequenceIndex)
TASK_PERFORM_SEQUENCE(psJimmy.PedIndex, JimmySequenceIndex)
CLEAR_SEQUENCE_TASK(JimmySequenceIndex)
TASK_LOOK_AT_COORD(psJimmy.PedIndex, <<324.57983, 178.60126, 102.59248>>, INFINITE_TASK_TIME, SLF_WHILE_NOT_IN_FOV | SLF_WIDEST_PITCH_LIMIT | SLF_WIDEST_YAW_LIMIT)
FORCE_PED_AI_AND_ANIMATION_UPDATE(psJimmy.PedIndex)
ENDIF
IF IS_SCREEN_FADED_OUT()
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
ENDIF
iStageProgress++
ENDIF
BREAK
CASE 2
REQUEST_PTFX_ASSET()
REQUEST_MODEL(osScissors.ModelName)
REQUEST_MODEL(osPonyTail.ModelName)
REQUEST_ANIM_DICT("missfam6ig_8_ponytail")
REQUEST_SCRIPT_AUDIO_BANK("FAM6_PONYTAIL")
IF NOT DOES_CAM_EXIST(ScriptedCamera)
ScriptedCamera = CREATE_CAMERA(CAMTYPE_SCRIPTED, TRUE)
SET_CAM_PARAMS(ScriptedCamera, <<323.9763, 177.9908, 102.7844>>, <<23.5296, 13.8430, -15.5478>>, 45.0)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michael")
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY() returned true for Michael.")
#ENDIF
REPLAY_STOP_EVENT()
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Lazlow")
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY() returned true for Lazlow.")
#ENDIF
ENDIF
IF HAS_CUTSCENE_FINISHED() OR CAN_SET_EXIT_STATE_FOR_CAMERA() //fix for lighting pop when cutscene ends
IF HAS_PTFX_ASSET_LOADED()
AND HAS_MODEL_LOADED(osScissors.ModelName)
AND REQUEST_SCRIPT_AUDIO_BANK("FAM6_PONYTAIL")
AND HAS_ANIM_DICT_LOADED("missfam6ig_8_ponytail")
IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iScissorsSceneID)
iScissorsSceneID = CREATE_SYNCHRONIZED_SCENE(vScissorsScenePosition, vScissorsSceneRotation)
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
TASK_SYNCHRONIZED_SCENE(PLAYER_PED_ID(), iScissorsSceneID, "missfam6ig_8_ponytail", "ig_7_loop_michael", INSTANT_BLEND_IN, SLOW_BLEND_OUT)
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID())
ENDIF
IF NOT IS_PED_INJURED(psLazlow.PedIndex)
TASK_SYNCHRONIZED_SCENE(psLazlow.PedIndex, iScissorsSceneID, "missfam6ig_8_ponytail", "ig_7_loop_lazlow", INSTANT_BLEND_IN, SLOW_BLEND_OUT)
FORCE_PED_AI_AND_ANIMATION_UPDATE(psLazlow.PedIndex)
ENDIF
IF HAS_MISSION_OBJECT_BEEN_CREATED(osScissors)
IF DOES_ENTITY_EXIST(osScissors.ObjectIndex) AND NOT IS_ENTITY_DEAD(osScissors.ObjectIndex)
PLAY_SYNCHRONIZED_ENTITY_ANIM(osScissors.ObjectIndex, iScissorsSceneID, "ig_7_loop_scissors", "missfam6ig_8_ponytail", INSTANT_BLEND_IN, SLOW_BLEND_OUT)
ENDIF
ENDIF
IF NOT DOES_CAM_EXIST(AnimatedCamera)
AnimatedCamera = CREATE_CAMERA(CAMTYPE_ANIMATED, TRUE)
PLAY_CAM_ANIM(AnimatedCamera, "ig_7_Loop_cam", "missfam6ig_8_ponytail", vScissorsScenePosition, vScissorsSceneRotation, CAF_LOOPING)
ENDIF
ELSE
SET_MODEL_AS_NO_LONGER_NEEDED(osScissors.ModelName)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
IF IS_SCREEN_FADED_OUT()
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
ENDIF
RETURN TRUE
ENDIF
ENDIF
ELSE
IF ( bCutsceneSkipped = FALSE )
IF WAS_CUTSCENE_SKIPPED()
SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, FALSE, FALSE) //if cutscene was skipped, fade out and don't fade in
bCutsceneSkipped = TRUE
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
FUNC BOOL IS_MISSION_STAGE_CUT_LAZLOW_HAIR_COMPLETED(INT &iStageProgress)
SWITCH iStageProgress
CASE 0
IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iScissorsSceneID)
REQUEST_PTFX_ASSET()
REQUEST_MODEL(osScissors.ModelName)
REQUEST_MODEL(osPonyTail.ModelName)
REQUEST_ANIM_DICT("missfam6ig_8_ponytail")
REQUEST_SCRIPT_AUDIO_BANK("FAM6_PONYTAIL")
IF HAS_PTFX_ASSET_LOADED()
AND HAS_MODEL_LOADED(osScissors.ModelName)
AND HAS_MODEL_LOADED(osPonyTail.ModelName)
AND REQUEST_SCRIPT_AUDIO_BANK("FAM6_PONYTAIL")
AND HAS_ANIM_DICT_LOADED("missfam6ig_8_ponytail")
iScissorsSceneID = CREATE_SYNCHRONIZED_SCENE(vScissorsScenePosition, vScissorsSceneRotation)
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
TASK_SYNCHRONIZED_SCENE(PLAYER_PED_ID(), iScissorsSceneID, "missfam6ig_8_ponytail", "ig_7_loop_michael", INSTANT_BLEND_IN, SLOW_BLEND_OUT)
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID())
ENDIF
IF NOT IS_PED_INJURED(psLazlow.PedIndex)
TASK_SYNCHRONIZED_SCENE(psLazlow.PedIndex, iScissorsSceneID, "missfam6ig_8_ponytail", "ig_7_loop_lazlow", INSTANT_BLEND_IN, SLOW_BLEND_OUT)
FORCE_PED_AI_AND_ANIMATION_UPDATE(psLazlow.PedIndex)
ENDIF
IF HAS_MISSION_OBJECT_BEEN_CREATED(osScissors)
IF DOES_ENTITY_EXIST(osScissors.ObjectIndex) AND NOT IS_ENTITY_DEAD(osScissors.ObjectIndex)
PLAY_SYNCHRONIZED_ENTITY_ANIM(osScissors.ObjectIndex, iScissorsSceneID, "ig_7_loop_scissors", "missfam6ig_8_ponytail", INSTANT_BLEND_IN, SLOW_BLEND_OUT)
ENDIF
ENDIF
IF NOT DOES_CAM_EXIST(AnimatedCamera)
AnimatedCamera = CREATE_CAMERA(CAMTYPE_ANIMATED, TRUE)
PLAY_CAM_ANIM(AnimatedCamera, "ig_7_Loop_cam", "missfam6ig_8_ponytail", vScissorsScenePosition, vScissorsSceneRotation, CAF_LOOPING)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
ENDIF
SET_MODEL_AS_NO_LONGER_NEEDED(osScissors.ModelName)
ENDIF
ELSE
iConversationTimer = 0
iConversationCounter = 0
iStruggleConversationTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(1000, 1500)
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
START_AUDIO_SCENE("FAMILY_6_HAIRCUT_LAZLOW_MG")
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGH)
bReplayStartEventTriggered = TRUE
IF IS_SCREEN_FADED_OUT()
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
ENDIF
iStageProgress++
ENDIF
BREAK
CASE 1
IF IS_SCREEN_FADED_IN()
AND NOT IS_SCREEN_FADING_IN()
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM6_SCIS")
PRINT_HELP_FOREVER("FAM6_SCIS")
SET_LABEL_AS_TRIGGERED("FAM6_SCIS", TRUE)
ENDIF
ENDIF
IF IS_SYNCHRONIZED_SCENE_RUNNING(iScissorsSceneID)
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM6_IDLES_4")
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF GET_GAME_TIMER() - iConversationTimer > 0
IF CREATE_CONVERSATION(FAM6Conversation, "FAM6AUD", "FAM6_IDLES", CONV_PRIORITY_MEDIUM)
iConversationCounter++
iConversationTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(9000, 12000)
IF ( iConversationCounter >= 4 )
SET_LABEL_AS_TRIGGERED("FAM6_IDLES_4", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF ( iStruggleConversationTimer != 0 )
IF GET_GAME_TIMER() - iStruggleConversationTimer > 0
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(FAM6Conversation, "FAM6AUD", "FAM6_STRUG", CONV_PRIORITY_MEDIUM, DO_NOT_DISPLAY_SUBTITLES)
iStruggleConversationTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(3500, 6000)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iScissorsSceneID)
OR ( IS_SYNCHRONIZED_SCENE_RUNNING(iScissorsSceneID) AND GET_SYNCHRONIZED_SCENE_PHASE(iScissorsSceneID) >= 1.0 )
iScissorsSceneID = CREATE_SYNCHRONIZED_SCENE(vScissorsScenePosition, vScissorsSceneRotation)
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
TASK_SYNCHRONIZED_SCENE(PLAYER_PED_ID(), iScissorsSceneID, "missfam6ig_8_ponytail", "ig_7_loop_michael", SLOW_BLEND_IN, SLOW_BLEND_OUT)
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID())
ENDIF
IF NOT IS_PED_INJURED(psLazlow.PedIndex)
TASK_SYNCHRONIZED_SCENE(psLazlow.PedIndex, iScissorsSceneID, "missfam6ig_8_ponytail", "ig_7_loop_lazlow", SLOW_BLEND_IN, SLOW_BLEND_OUT)
FORCE_PED_AI_AND_ANIMATION_UPDATE(psLazlow.PedIndex)
ENDIF
IF DOES_ENTITY_EXIST(osScissors.ObjectIndex) AND NOT IS_ENTITY_DEAD(osScissors.ObjectIndex)
PLAY_SYNCHRONIZED_ENTITY_ANIM(osScissors.ObjectIndex, iScissorsSceneID, "ig_7_loop_scissors", "missfam6ig_8_ponytail", SLOW_BLEND_IN, SLOW_BLEND_OUT)
ENDIF
ENDIF
IF IS_SYNCHRONIZED_SCENE_RUNNING(iScissorsSceneID) AND IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_RDOWN)
iScissorsSceneID = CREATE_SYNCHRONIZED_SCENE(vScissorsScenePosition, vScissorsSceneRotation)
IF HAS_MISSION_OBJECT_BEEN_CREATED(osPonyTail, FALSE)
IF DOES_ENTITY_EXIST(osPonyTail.ObjectIndex) AND NOT IS_ENTITY_DEAD(osPonyTail.ObjectIndex)
ATTACH_ENTITY_TO_ENTITY(osPonyTail.ObjectIndex, PLAYER_PED_ID(), GET_PED_BONE_INDEX(PLAYER_PED_ID(), BONETAG_PH_L_HAND), << 0.0, 0.0, 0.0 >>, << 0.0, 0.0, 0.0 >>)
ENDIF
ENDIF
PLAY_CAM_ANIM(AnimatedCamera, "ig_7_Outro_Cam","missfam6ig_8_ponytail", vScissorsScenePosition, vScissorsSceneRotation)
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
TASK_SYNCHRONIZED_SCENE(PLAYER_PED_ID(), iScissorsSceneID, "missfam6ig_8_ponytail", "ig_7_outro_michael", SLOW_BLEND_IN, SLOW_BLEND_OUT)
ENDIF
IF NOT IS_PED_INJURED(psLazlow.PedIndex)
TASK_SYNCHRONIZED_SCENE(psLazlow.PedIndex, iScissorsSceneID, "missfam6ig_8_ponytail", "ig_7_outro_lazlow", SLOW_BLEND_IN, SLOW_BLEND_OUT)
ENDIF
IF DOES_ENTITY_EXIST(osScissors.ObjectIndex) AND NOT IS_ENTITY_DEAD(osScissors.ObjectIndex)
PLAY_SYNCHRONIZED_ENTITY_ANIM(osScissors.ObjectIndex,iScissorsSceneID, "ig_7_outro_scissors", "missfam6ig_8_ponytail", SLOW_BLEND_IN, SLOW_BLEND_OUT)
ENDIF
CLEAR_HELP()
iStageProgress++
ENDIF
BREAK
CASE 2
IF IS_SYNCHRONIZED_SCENE_RUNNING(iScissorsSceneID) AND GET_SYNCHRONIZED_SCENE_PHASE(iScissorsSceneID) >= 0.05
SET_CONTROL_SHAKE(PLAYER_CONTROL, 150, 120)
STOP_CURRENT_PLAYING_AMBIENT_SPEECH(psLazlow.PedIndex)
PLAY_SOUND_FROM_ENTITY(-1, "Snip_Ponytail",osScissors.ObjectIndex, "FAMILY_6_SOUNDS")
SET_PED_COMPONENT_VARIATION(psLazlow.PedIndex, PED_COMP_HAIR, 1, 0)
ptfxHair = START_PARTICLE_FX_LOOPED_ON_PED_BONE("cs_fam6_hair_snip", PLAYER_PED_ID(), << 0.0, 0.0, 0.0 >>, << 0.0, 0.0, 0.0 >>, BONETAG_PH_L_HAND)
REPLAY_RECORD_BACK_FOR_TIME(3.0, 4.0, REPLAY_IMPORTANCE_HIGHEST)
iStageProgress++
ENDIF
BREAK
CASE 3
IF IS_SYNCHRONIZED_SCENE_RUNNING(iScissorsSceneID)
IF GET_SYNCHRONIZED_SCENE_PHASE(iScissorsSceneID) >= 0.85
OR ( GET_SYNCHRONIZED_SCENE_PHASE(iScissorsSceneID) >= 0.45 AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() )
IF ( bCutsceneAssetsRequested = TRUE )
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
IF ( bReplayStartEventTriggered = TRUE )
IF ( bReplayStopEventTriggered = FALSE )
REPLAY_STOP_EVENT()
bReplayStopEventTriggered = TRUE
ENDIF
ENDIF
RETURN TRUE
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
REQUEST_CUTSCENE("fam_6_mcs_5")
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", PLAYER_PED_ID(), PLAYER_ZERO)
SET_JIMMY_CUTSCENE_COMPONENT_VARIATIONS()
SET_TRACEY_CUTSCENE_COMPONENT_VARIATIONS()
SET_LAZLOW_CUTSCENE_COMPONENT_VARIATIONS(TRUE, TRUE, TRUE, TRUE, bChestTattoo)
bCutsceneAssetsRequested = TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL IS_MISSION_STAGE_CUTSCENE_SHOP_4_COMPLETED(INT &iStageProgress)
SWITCH iStageProgress
CASE 0
IF HAS_REQUESTED_CUTSCENE_LOADED("fam_6_mcs_5")
IF NOT IS_PED_INJURED(psJimmy.PedIndex)
REGISTER_ENTITY_FOR_CUTSCENE(psJimmy.PedIndex, "Jimmy", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, psJimmy.ModelName)
ENDIF
IF NOT IS_PED_INJURED(psTracey.PedIndex)
REGISTER_ENTITY_FOR_CUTSCENE(psTracey.PedIndex, "Tracy", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, psTracey.ModelName)
ENDIF
IF NOT IS_PED_INJURED(psLazlow.PedIndex)
REGISTER_ENTITY_FOR_CUTSCENE(psLazlow.PedIndex, "Lazlow", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, psLazlow.ModelName)
ENDIF
IF NOT IS_PED_INJURED(psTatguy.PedIndex)
REGISTER_ENTITY_FOR_CUTSCENE(psTatguy.PedIndex, "Tattooist", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, psTatguy.ModelName)
ENDIF
IF DOES_ENTITY_EXIST(osScissors.ObjectIndex)
IF NOT IS_ENTITY_DEAD(osScissors.ObjectIndex)
REGISTER_ENTITY_FOR_CUTSCENE(osScissors.ObjectIndex, "Tattoo_Scissors", CU_ANIMATE_AND_DELETE_EXISTING_SCRIPT_ENTITY, osScissors.ModelName)
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(osPonyTail.ObjectIndex)
IF NOT IS_ENTITY_DEAD(osPonyTail.ObjectIndex)
IF IS_ENTITY_ATTACHED(osPonyTail.ObjectIndex)
DETACH_ENTITY(osPonyTail.ObjectIndex, FALSE, TRUE)
ENDIF
REGISTER_ENTITY_FOR_CUTSCENE(osPonyTail.ObjectIndex, "Lazlow_Pony", CU_ANIMATE_AND_DELETE_EXISTING_SCRIPT_ENTITY, osPonyTail.ModelName)
ENDIF
ENDIF
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
STOP_AUDIO_SCENES()
START_CUTSCENE()
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
iStageProgress++
ELSE
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", PLAYER_PED_ID())
SET_JIMMY_CUTSCENE_COMPONENT_VARIATIONS()
SET_TRACEY_CUTSCENE_COMPONENT_VARIATIONS()
SET_LAZLOW_CUTSCENE_COMPONENT_VARIATIONS(TRUE, TRUE, TRUE, TRUE, bChestTattoo)
ENDIF
ENDIF
BREAK
CASE 1
IF IS_CUTSCENE_PLAYING()
IF DOES_CAM_EXIST(ScriptedCamera)
DESTROY_CAM(ScriptedCamera)
ENDIF
IF DOES_CAM_EXIST(AnimatedCamera)
DESTROY_CAM(AnimatedCamera)
ENDIF
DESTROY_ALL_CAMS()
RENDER_SCRIPT_CAMS(FALSE, FALSE)
IF DOES_PARTICLE_FX_LOOPED_EXIST(ptfxHair)
STOP_PARTICLE_FX_LOOPED(ptfxHair)
ENDIF
REMOVE_PTFX_ASSET()
RELEASE_SCRIPT_AUDIO_BANK()
REMOVE_ANIM_DICT("missfam6ig_1_pierce")
REMOVE_ANIM_DICT("missfam6ig_7_tattoo")
REMOVE_ANIM_DICT("missfam6ig_8_ponytail")
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
IF IS_SCREEN_FADED_OUT()
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
ENDIF
iStageProgress++
ENDIF
BREAK
CASE 2
REQUEST_ANIM_DICT("missfam6leadinoutfam_6_mcs_5")
IF NOT DOES_ENTITY_EXIST(psTatguy.PedIndex)
IF DOES_CUTSCENE_ENTITY_EXIST("Tattooist")
IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Tattooist"))
psTatguy.PedIndex = GET_PED_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Tattooist"))
SET_MISSION_PED_PROPERTIES(psTatguy.PedIndex, RELGROUPHASH_PLAYER, FALSE, TRUE, FALSE, FALSE)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Set up properites for mission player ped Tattooist created in the intro cutscene.")
#ENDIF
ENDIF
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_CAMERA()
REPLAY_STOP_EVENT()
SET_GAMEPLAY_CAM_RELATIVE_PITCH()
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michael")
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY() returned true for Michael.")
#ENDIF
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
WARP_PED(PLAYER_PED_ID(), <<315.4439, 175.3920, 102.8468>>, 106.3951, FALSE, FALSE, FALSE)
FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_ON_FOOT_WALK, FALSE, FAUS_CUTSCENE_EXIT, TRUE)
SIMULATE_PLAYER_INPUT_GAIT(PLAYER_ID(), PEDMOVE_WALK, 2500)
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Jimmy")
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY() returned true for Jimmy.")
#ENDIF
IF NOT IS_PED_INJURED(psJimmy.PedIndex)
SET_PED_COMPONENT_VARIATION(psJimmy.PedIndex, PED_COMP_BERD, 0, 0)
WARP_PED(psJimmy.PedIndex, <<313.6881, 174.4399, 102.8722>>, 101.0260, FALSE, FALSE, FALSE)
TASK_FOLLOW_NAV_MESH_TO_COORD(psJimmy.PedIndex, <<306.69650, 171.19496, 102.97732>>, PEDMOVE_WALK, DEFAULT_TIME_BEFORE_WARP * 3, DEFAULT_NAVMESH_RADIUS, ENAV_NO_STOPPING | ENAV_GO_FAR_AS_POSSIBLE_IF_TARGET_NAVMESH_NOT_LOADED)
FORCE_PED_MOTION_STATE(psJimmy.PedIndex, MS_ON_FOOT_WALK, FALSE, FAUS_CUTSCENE_EXIT, TRUE)
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Tracy")
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY() returned true for Tracy.")
#ENDIF
IF NOT IS_PED_INJURED(psTracey.PedIndex)
WARP_PED(psTracey.PedIndex, <<313.3786, 176.4375, 102.8908>>, 95.2572, FALSE, FALSE, FALSE)
TASK_FOLLOW_NAV_MESH_TO_COORD(psTracey.PedIndex, <<306.20856, 174.41803, 103.00662>>, PEDMOVE_WALK, DEFAULT_TIME_BEFORE_WARP * 3, DEFAULT_NAVMESH_RADIUS, ENAV_NO_STOPPING | ENAV_GO_FAR_AS_POSSIBLE_IF_TARGET_NAVMESH_NOT_LOADED)
FORCE_PED_MOTION_STATE(psTracey.PedIndex, MS_ON_FOOT_WALK, FALSE, FAUS_CUTSCENE_EXIT, TRUE)
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Lazlow")
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY() returned true for Lazlow.")
#ENDIF
IF NOT IS_PED_INJURED(psLazlow.PedIndex)
IF HAS_ANIM_DICT_LOADED("missfam6leadinoutfam_6_mcs_5")
IF NOT IS_ENTITY_PLAYING_ANIM(psLazlow.PedIndex, "missfam6leadinoutfam_6_mcs_5","_leadout_loop_lazlow")
TASK_PLAY_ANIM_ADVANCED(psLazlow.PedIndex, "missfam6leadinoutfam_6_mcs_5","_leadout_loop_lazlow",
vLazlowLeadoutPosition, vLazlowLeadoutRotation, INSTANT_BLEND_IN, NORMAL_BLEND_OUT,
-1, AF_EXTRACT_INITIAL_OFFSET | AF_LOOPING | AF_NOT_INTERRUPTABLE)
FORCE_PED_AI_AND_ANIMATION_UPDATE(psLazlow.PedIndex)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(psLazlow.PedIndex, TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Tattooist")
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY() returned true for Tattooist.")
#ENDIF
IF NOT IS_PED_INJURED(psTatguy.PedIndex)
IF HAS_ANIM_DICT_LOADED("missfam6leadinoutfam_6_mcs_5")
IF NOT IS_ENTITY_PLAYING_ANIM(psTatguy.PedIndex, "missfam6leadinoutfam_6_mcs_5","_leadout_loop_tattoo_guy")
TASK_PLAY_ANIM_ADVANCED(psTatguy.PedIndex, "missfam6leadinoutfam_6_mcs_5","_leadout_loop_tattoo_guy",
vTatguyLeadoutPosition, vTatguyLeadoutRotation, INSTANT_BLEND_IN, NORMAL_BLEND_OUT,
-1, AF_EXTRACT_INITIAL_OFFSET | AF_LOOPING | AF_NOT_INTERRUPTABLE)
FORCE_PED_AI_AND_ANIMATION_UPDATE(psTatguy.PedIndex)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(psTatguy.PedIndex, TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
IF HAS_CUTSCENE_FINISHED()
IF IS_SCREEN_FADED_OUT()
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
ENDIF
RETURN TRUE
ELSE
IF ( bCutsceneSkipped = FALSE )
IF WAS_CUTSCENE_SKIPPED()
SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, FALSE, FALSE) //if cutscene was skipped, fade out and don't fade in
bCutsceneSkipped = TRUE
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
PROC MANAGE_CONVERSATIONS_DURING_GO_TO_SHRINK()
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM6_DRF0")
IF IS_SCREEN_FADED_IN() AND NOT IS_SCREEN_FADING_IN()
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF CREATE_CONVERSATION(FAM6Conversation, "FAM6AUD", "FAM6_DRF0", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("FAM6_DRF0", TRUE)
CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_PED(PLAYER_ID())
CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_NON_ANIMAL_PED(PLAYER_ID())
ENDIF
ENDIF
ENDIF
ELSE
//kill the first conversation if player is away from buddies
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
TEXT_LABEL_23 LocalCurrentConversationLabel = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_ROOT()
IF NOT IS_STRING_NULL_OR_EMPTY(LocalCurrentConversationLabel)
IF ARE_STRINGS_EQUAL(LocalCurrentConversationLabel, "FAM6_DRF0")
IF GET_DISTANCE_BETWEEN_ENTITIES(psJimmy.PedIndex, PLAYER_PED_ID()) > 10
AND GET_DISTANCE_BETWEEN_ENTITIES(psTracey.PedIndex, PLAYER_PED_ID()) > 10
KILL_FACE_TO_FACE_CONVERSATION()
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM6_DRF1")
AND NOT HAS_LABEL_BEEN_TRIGGERED("FAM6_DRF2")
IF HAS_LABEL_BEEN_TRIGGERED(LabelFAM6SHRINK) OR IS_STRING_NULL_OR_EMPTY(LabelFAM6SHRINK)
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF IS_PED_IN_VEHICLE(psJimmy.PedIndex, GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()))
AND IS_PED_IN_VEHICLE(psTracey.PedIndex, GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()))
IF CREATE_CONVERSATION(FAM6Conversation, "FAM6AUD", PICK_STRING(bStageReplayInProgress, "FAM6_DRF1", "FAM6_DRF2"), CONV_PRIORITY_MEDIUM)
CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_PED(PLAYER_ID())
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()))
SET_LABEL_AS_TRIGGERED(PICK_STRING(bStageReplayInProgress, "FAM6_DRF1", "FAM6_DRF2"), TRUE)
bRunConversationPausingCheck = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
//if main conversation was interrupted, resume it from the next label
IF ( bCurrentConversationInterrupted = TRUE )
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
IF HAS_LABEL_BEEN_TRIGGERED("FAM6_JBAD")
OR HAS_LABEL_BEEN_TRIGGERED("FAM6_JWARN")
OR HAS_LABEL_BEEN_TRIGGERED("FAM6_JWANT")
IF HAS_LABEL_BEEN_TRIGGERED("FAM6_DRF1")
OR HAS_LABEL_BEEN_TRIGGERED("FAM6_DRF2")
OR HAS_LABEL_BEEN_TRIGGERED("FAM6_JTALK2")
//play conversation for Jimmy saying cops were lost and it's safe to go to shrink
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM6_JLOST_3")
IF HAS_LABEL_BEEN_TRIGGERED("FAM6_JWANT") //this will only play if conversation to lose cops was triggered
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM6_JLOST")
IF CREATE_CONVERSATION(FAM6Conversation, "FAM6AUD", "FAM6_JLOST", CONV_PRIORITY_MEDIUM)
iCopsLostConversationCount++
SET_LABEL_AS_TRIGGERED("FAM6_JLOST", TRUE)
IF ( iCopsLostConversationCount >= 3)
SET_LABEL_AS_TRIGGERED("FAM6_JLOST_3", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
//resume the interrupted coversation
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF NOT IS_STRING_NULL_OR_EMPTY(CurrentConversationRoot)
AND NOT IS_STRING_NULL_OR_EMPTY(CurrentConversationLabel)
IF ARE_STRINGS_EQUAL(CurrentConversationRoot, "FAM6_DRF1") //resume only the main conversations
OR ARE_STRINGS_EQUAL(CurrentConversationRoot, "FAM6_DRF2")
OR ARE_STRINGS_EQUAL(CurrentConversationRoot, "FAM6_JTALK2")
IF ( iPlayerOffencesCount >= 3 )
AND NOT HAS_LABEL_BEEN_TRIGGERED("FAM6_JTALK2")
//if player commited more than 3 offences and the weird conversation did not trigger
//let the weird conversations trigger first before it can be resumed
ELSE
//resume conversation from specific root and line label
IF CREATE_CONVERSATION_FROM_SPECIFIC_LINE(FAM6Conversation, "FAM6AUD", CurrentConversationRoot, CurrentConversationLabel, CONV_PRIORITY_MEDIUM)
bCurrentConversationInterrupted = FALSE
SET_LABEL_AS_TRIGGERED("FAM6_JBAD", FALSE) //mark all the interrupt conversations as not triggered
SET_LABEL_AS_TRIGGERED("FAM6_JLOST", FALSE)
SET_LABEL_AS_TRIGGERED("FAM6_JWANT", FALSE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
//resume paused conversations when player gets back in the car
//IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
//IF IS_FACE_TO_FACE_CONVERSATION_PAUSED()
//PAUSE_FACE_TO_FACE_CONVERSATION(FALSE)
//ENDIF
//ENDIF
ELSE //locates header blip does not exist
//play interrupt conversation when player becomes wanted
IF IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
IF ( bCurrentConversationInterrupted = FALSE )
IF HAS_LABEL_BEEN_TRIGGERED("FAM6_DRF1")
OR HAS_LABEL_BEEN_TRIGGERED("FAM6_DRF2")
OR HAS_LABEL_BEEN_TRIGGERED("FAM6_JTALK2")
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
CurrentConversationRoot = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_ROOT()
IF NOT IS_STRING_NULL_OR_EMPTY(CurrentConversationRoot)
IF ARE_STRINGS_EQUAL(CurrentConversationRoot, "FAM6_DRF1")
OR ARE_STRINGS_EQUAL(CurrentConversationRoot, "FAM6_DRF2")
OR ARE_STRINGS_EQUAL(CurrentConversationRoot, "FAM6_JTALK2")
bCurrentConversationInterrupted = TRUE
CurrentConversationRoot = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_ROOT()
CurrentConversationLabel = GET_STANDARD_CONVERSATION_LABEL_FOR_FUTURE_RESUMPTION()
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF ( bCurrentConversationInterrupted = TRUE )
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM6_JWANT")
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(FAM6Conversation, "FAM6AUD", "FAM6_JWANT", CONV_PRIORITY_HIGH)
iPlayerOffencesCount++
iLoseCopsReminderTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(10000, 12500)
SET_LABEL_AS_TRIGGERED("FAM6_JWANT", TRUE)
CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_PED(PLAYER_ID())
CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_NON_ANIMAL_PED(PLAYER_ID())
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": iPlayerOffencesCount: ", iPlayerOffencesCount, ".")
#ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM6_JLOSE_5")
IF HAS_LABEL_BEEN_TRIGGERED("FAM6_JWANT")
IF GET_GAME_TIMER() - iLoseCopsReminderTimer > 0
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(FAM6Conversation, "FAM6AUD", "FAM6_JLOSE", CONV_PRIORITY_MEDIUM)
iLoseCopsReminderCount++
iLoseCopsReminderTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(12500, 15000)
IF ( iLoseCopsReminderCount >= 5 )
SET_LABEL_AS_TRIGGERED("FAM6_JLOSE_5", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
//keep reseting those flags during wanted level as the player might be driving recklessly
CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_PED(PLAYER_ID())
CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_NON_ANIMAL_PED(PLAYER_ID())
ELSE
//IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
// IF NOT IS_FACE_TO_FACE_CONVERSATION_PAUSED()
// PAUSE_FACE_TO_FACE_CONVERSATION(TRUE)
// ENDIF
//ENDIF
ENDIF
ENDIF
//play interrupt conversations for player offences
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
IF ( GET_GAME_TIMER() - iPlayerOffenceTimer > 5000 )
//play conversation for player running over peds
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM6_JBAD_5")
AND NOT HAS_LABEL_BEEN_TRIGGERED("FAM6_JWARN_6")
IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF HAS_PLAYER_DAMAGED_AT_LEAST_ONE_NON_ANIMAL_PED(PLAYER_ID())
AND HAS_ENTITY_COLLIDED_WITH_ANYTHING(GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID()))
bPlayerHitPed = TRUE
ENDIF
ENDIF
IF IS_PED_SHOOTING(PLAYER_PED_ID()) //add more conditions here if needed
bPlayerActingBad = TRUE
ENDIF
IF ( bPlayerHitPed = TRUE OR bPlayerActingBad = TRUE )
IF HAS_LABEL_BEEN_TRIGGERED("FAM6_DRF1")
OR HAS_LABEL_BEEN_TRIGGERED("FAM6_DRF2")
OR HAS_LABEL_BEEN_TRIGGERED("FAM6_JTALK2")
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
CurrentConversationRoot = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_ROOT()
IF NOT IS_STRING_NULL_OR_EMPTY(CurrentConversationRoot)
IF ARE_STRINGS_EQUAL(CurrentConversationRoot, "FAM6_DRF1")
OR ARE_STRINGS_EQUAL(CurrentConversationRoot, "FAM6_DRF2")
OR ARE_STRINGS_EQUAL(CurrentConversationRoot, "FAM6_JTALK2")
CurrentConversationRoot = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_ROOT()
CurrentConversationLabel = GET_STANDARD_CONVERSATION_LABEL_FOR_FUTURE_RESUMPTION()
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CurrentConversationRoot = ", CurrentConversationRoot, ".")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CurrentConversationLabel = ", CurrentConversationLabel, ".")
#ENDIF
bCurrentConversationInterrupted = TRUE
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM6_JTALK2") //if jimmy did no start his talk for player messing around
IF CREATE_CONVERSATION(FAM6Conversation, "FAM6AUD", "FAM6_JBAD", CONV_PRIORITY_MEDIUM)
iPlayerOffencesCount++
iBadConversationCount++
bPlayerHitPed = FALSE
bPlayerActingBad = FALSE
iPlayerOffenceTimer = GET_GAME_TIMER()
SET_LABEL_AS_TRIGGERED("FAM6_JBAD", TRUE)
IF ( iBadConversationCount >= 5 )
SET_LABEL_AS_TRIGGERED("FAM6_JBAD_5", TRUE)
ENDIF
CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_PED(PLAYER_ID())
CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_NON_ANIMAL_PED(PLAYER_ID())
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": iPlayerOffencesCount: ", iPlayerOffencesCount, ".")
#ENDIF
ENDIF
ELSE //if jimmy started his talk for player messing around
IF CREATE_CONVERSATION(FAM6Conversation, "FAM6AUD", "FAM6_JWARN", CONV_PRIORITY_MEDIUM)
iPlayerOffencesCount++
iBadConversationCount++
bPlayerHitPed = FALSE
bPlayerActingBad = FALSE
iPlayerOffenceTimer = GET_GAME_TIMER()
SET_LABEL_AS_TRIGGERED("FAM6_JWARN", TRUE)
IF ( iBadConversationCount >= 6 )
SET_LABEL_AS_TRIGGERED("FAM6_JWARN_6", TRUE)
ENDIF
CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_PED(PLAYER_ID())
CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_NON_ANIMAL_PED(PLAYER_ID())
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": iPlayerOffencesCount: ", iPlayerOffencesCount, ".")
#ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_PED(PLAYER_ID())
CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_NON_ANIMAL_PED(PLAYER_ID())
ENDIF
ENDIF
//play conversation when more than 3 offences have been commited
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM6_JTALK2")
IF ( iPlayerOffencesCount >= 3 )
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF IS_PED_IN_VEHICLE(psJimmy.PedIndex, GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()))
AND IS_PED_IN_VEHICLE(psTracey.PedIndex, GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()))
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(FAM6Conversation, "FAM6AUD", "FAM6_JTALK2", CONV_PRIORITY_MEDIUM)
bCurrentConversationInterrupted = FALSE
SET_LABEL_AS_TRIGGERED("FAM6_JTALK2", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM6_GREET")
IF ( bDestinationReached = TRUE )
bRunConversationPausingCheck = FALSE
IF IS_FACE_TO_FACE_CONVERSATION_PAUSED()
PAUSE_FACE_TO_FACE_CONVERSATION(FALSE)
ENDIF
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(FAM6Conversation, "FAM6AUD", "FAM6_GREET", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("FAM6_GREET", TRUE)
IF NOT IS_PED_INJURED(psAmanda.PedIndex)
TASK_LOOK_AT_ENTITY(psAmanda.PedIndex, PLAYER_PED_ID(), INFINITE_TASK_TIME,
SLF_WHILE_NOT_IN_FOV | SLF_FAST_TURN_RATE | SLF_USE_TORSO, SLF_LOOKAT_VERY_HIGH)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF ( bRunConversationPausingCheck = TRUE )
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF IS_PED_IN_VEHICLE(psJimmy.PedIndex, GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()))
AND IS_PED_IN_VEHICLE(psTracey.PedIndex, GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()))
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF IS_FACE_TO_FACE_CONVERSATION_PAUSED()
PAUSE_FACE_TO_FACE_CONVERSATION(FALSE)
ENDIF
ENDIF
ELSE
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_FACE_TO_FACE_CONVERSATION_PAUSED()
PAUSE_FACE_TO_FACE_CONVERSATION(TRUE)
ENDIF
ENDIF
ENDIF
ELIF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
AND NOT IS_PED_IN_ANY_VEHICLE(psJimmy.PedIndex)
AND NOT IS_PED_IN_ANY_VEHICLE(psTracey.PedIndex)
IF GET_DISTANCE_BETWEEN_ENTITIES(psJimmy.PedIndex, PLAYER_PED_ID()) < 10
AND GET_DISTANCE_BETWEEN_ENTITIES(psTracey.PedIndex, PLAYER_PED_ID()) < 10
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF IS_FACE_TO_FACE_CONVERSATION_PAUSED()
PAUSE_FACE_TO_FACE_CONVERSATION(FALSE)
ENDIF
ENDIF
ELSE
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_FACE_TO_FACE_CONVERSATION_PAUSED()
PAUSE_FACE_TO_FACE_CONVERSATION(TRUE)
ENDIF
ENDIF
ENDIF
ELSE
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_FACE_TO_FACE_CONVERSATION_PAUSED()
PAUSE_FACE_TO_FACE_CONVERSATION(TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
PROC MANAGE_LAZLOW_LEADOUT_DURING_GO_TO_SHRINK(INT &iProgress)
SWITCH iProgress
CASE 0
REQUEST_ANIM_DICT("missfam6leadinoutfam_6_mcs_5")
IF HAS_ANIM_DICT_LOADED("missfam6leadinoutfam_6_mcs_5")
IF NOT IS_PED_INJURED(psLazlow.PedIndex)
IF NOT IS_ENTITY_PLAYING_ANIM(psLazlow.PedIndex, "missfam6leadinoutfam_6_mcs_5","_leadout_loop_lazlow")
TASK_PLAY_ANIM_ADVANCED(psLazlow.PedIndex, "missfam6leadinoutfam_6_mcs_5","_leadout_loop_lazlow",
vLazlowLeadoutPosition, vLazlowLeadoutRotation, INSTANT_BLEND_IN, NORMAL_BLEND_OUT,
-1, AF_EXTRACT_INITIAL_OFFSET | AF_LOOPING | AF_NOT_INTERRUPTABLE)
FORCE_PED_AI_AND_ANIMATION_UPDATE(psLazlow.PedIndex)
ENDIF
ENDIF
IF NOT IS_PED_INJURED(psTatguy.PedIndex)
IF NOT IS_ENTITY_PLAYING_ANIM(psTatguy.PedIndex, "missfam6leadinoutfam_6_mcs_5","_leadout_loop_tattoo_guy")
TASK_PLAY_ANIM_ADVANCED(psTatguy.PedIndex, "missfam6leadinoutfam_6_mcs_5","_leadout_loop_tattoo_guy",
vTatguyLeadoutPosition, vTatguyLeadoutRotation, INSTANT_BLEND_IN, NORMAL_BLEND_OUT,
-1, AF_EXTRACT_INITIAL_OFFSET | AF_LOOPING | AF_NOT_INTERRUPTABLE)
FORCE_PED_AI_AND_ANIMATION_UPDATE(psTatguy.PedIndex)
ENDIF
ENDIF
iAwayConversationCounter = 0
iAwayConversationTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(3000, 5000)
iProgress++
ENDIF
BREAK
CASE 1
IF DOES_ENTITY_EXIST(psLazlow.PedIndex)
IF NOT IS_ENTITY_DEAD(psLazlow.PedIndex)
IF IS_ENTITY_PLAYING_ANIM(psLazlow.PedIndex, "missfam6leadinoutfam_6_mcs_5","_leadout_loop_lazlow")
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM6_AWAY_3")
IF GET_GAME_TIMER() - iAwayConversationTimer > 0
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<320.446808,178.033951,104.459259>>, << 1.5, 1.5, 2.0 >>)
ADD_PED_FOR_DIALOGUE(FAM6Conversation, 3, psLazlow.PedIndex, "LAZLOW")
IF CREATE_CONVERSATION(FAM6Conversation, "FAM6AUD", "FAM6_AWAY", CONV_PRIORITY_MEDIUM)
TASK_LOOK_AT_ENTITY(psLazlow.PedIndex, PLAYER_PED_ID(), 3000, SLF_WHILE_NOT_IN_FOV)
iAwayConversationCounter++
iAwayConversationTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(5000, 10000)
IF ( iAwayConversationCounter >= 3)
SET_LABEL_AS_TRIGGERED("FAM6_AWAY_3", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), vLazlowLeadoutPosition) > 150.0
CLEANUP_PED(psLazlow, TRUE)
CLEANUP_PED(psTatguy, TRUE)
REMOVE_ANIM_DICT("missfam6leadinoutfam_6_mcs_5")
iProgress++
ENDIF
BREAK
ENDSWITCH
ENDPROC
PROC MANAGE_AMANDA_DURING_GO_TO_SHRINK(INT &iProgress)
SWITCH iProgress
CASE 0
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), vShrinkOfficePosition) < DEFAULT_CUTSCENE_LOAD_DIST * 2
iProgress++
ENDIF
BREAK
CASE 1
REQUEST_MODEL(psAmanda.ModelName)
REQUEST_ANIM_DICT("amb@world_human_stand_impatient@female@no_sign@idle_a")
IF HAS_MODEL_LOADED(psAmanda.ModelName)
AND HAS_ANIM_DICT_LOADED("amb@world_human_stand_impatient@female@no_sign@idle_a")
CLEAR_AREA(psAmanda.vPosition, 3.0, TRUE)
IF HAS_MISSION_PED_BEEN_CREATED(psAmanda, FALSE, RELGROUPHASH_PLAYER, FALSE, CHAR_AMANDA)
ADD_PED_FOR_DIALOGUE(FAM6Conversation, 4, psAmanda.PedIndex, "AMANDA")
SET_AMANDA_PED_COMPONENT_VARIATIONS(psAmanda.bComponentVariationsSet)
TASK_LOOK_AT_ENTITY(psAmanda.PedIndex, PLAYER_PED_ID(), INFINITE_TASK_TIME, SLF_WHILE_NOT_IN_FOV)
TASK_PLAY_ANIM(psAmanda.PedIndex, "amb@world_human_stand_impatient@female@no_sign@idle_a", "idle_c",
NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING | AF_NOT_INTERRUPTABLE |
AF_USE_KINEMATIC_PHYSICS | AF_USE_MOVER_EXTRACTION)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(psAmanda.PedIndex, TRUE)
SET_RAGDOLL_BLOCKING_FLAGS(psAmanda.PedIndex, RBF_MELEE)
SET_RAGDOLL_BLOCKING_FLAGS(psAmanda.PedIndex, RBF_PLAYER_BUMP)
SET_RAGDOLL_BLOCKING_FLAGS(psAmanda.PedIndex, RBF_PLAYER_IMPACT)
SET_MODEL_AS_NO_LONGER_NEEDED(psAmanda.ModelName)
iProgress++
ENDIF
ENDIF
BREAK
CASE 2
IF NOT IS_PED_INJURED(psAmanda.PedIndex)
IF IS_ENTITY_PLAYING_ANIM(psAmanda.PedIndex, "amb@world_human_stand_impatient@female@no_sign@idle_a", "idle_c")
SET_PED_CAPSULE(psAmanda.PedIndex, 0.25)
SET_PED_RESET_FLAG(psAmanda.PedIndex, PRF_ExpandPedCapsuleFromSkeleton, TRUE)
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDPROC
FUNC BOOL IS_MISSION_STAGE_DRIVE_TO_SHRINK_COMPLETED(INT &iStageProgress)
//don't use locates header J skip
SET_BIT(sLocatesData.iLocatesBitSet, BS_DONT_DO_J_SKIP)
UPDATE_TRIGGERED_LABEL(LabelFAM6SHRINK)
MANAGE_CONVERSATIONS_DURING_GO_TO_SHRINK()
MANAGE_AMANDA_DURING_GO_TO_SHRINK(iAmandaProgress)
RUN_INTERIOR_UNPINNING_CHECK(vTattooShopScenePosition, 100.0)
MANAGE_LAZLOW_LEADOUT_DURING_GO_TO_SHRINK(iLazlowLeadoutProgress)
IF DOES_ENTITY_EXIST(sLocatesData.vehStartCar)
AND NOT IS_ENTITY_DEAD(sLocatesData.vehStartCar)
AND IS_PED_IN_VEHICLE(PLAYER_PED_ID(), sLocatesData.vehStartCar, TRUE)
IF NOT IS_PED_IN_VEHICLE(psJimmy.PedIndex, sLocatesData.vehStartCar, TRUE)
OR NOT IS_PED_IN_VEHICLE(psTracey.PedIndex, sLocatesData.vehStartCar, TRUE)
DISABLE_LOCATES_CLEAR_BUDDY_TASKS_IF_ENTERING_NEAREST_VEHICLE(sLocatesData, TRUE)
ENDIF
ELSE
DISABLE_LOCATES_CLEAR_BUDDY_TASKS_IF_ENTERING_NEAREST_VEHICLE(sLocatesData, FALSE)
ENDIF
IF IS_PLAYER_BROWSING_ITEMS_IN_ANY_SHOP()
OR IS_PLAYER_CHANGING_CLOTHES()
IF HAS_THIS_CUTSCENE_LOADED("fam_6_mcs_6")
OR HAS_CUTSCENE_LOADED()
OR IS_CUTSCENE_ACTIVE()
REMOVE_CUTSCENE()
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Player browsing items in a shop or changing clothes. Removing cutscene.")
#ENDIF
ENDIF
ELSE
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), vShrinkOfficePosition) < DEFAULT_CUTSCENE_LOAD_DIST
REQUEST_CUTSCENE("fam_6_mcs_6")
IF NOT IS_INTERIOR_READY(GET_INTERIOR_AT_COORDS(vShrinkInteriorPosition))
PIN_INTERIOR_IN_MEMORY(GET_INTERIOR_AT_COORDS(vShrinkInteriorPosition))
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Pinning interior at coordinates ", vShrinkInteriorPosition, " in memory.")
#ENDIF
ENDIF
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", PLAYER_PED_ID())
SET_JIMMY_CUTSCENE_COMPONENT_VARIATIONS()
SET_TRACEY_CUTSCENE_COMPONENT_VARIATIONS()
SET_AMANDA_CUTSCENE_COMPONENT_VARIATIONS()
bCutsceneAssetsRequested = TRUE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting cutscene ped components for cutscene peds from peds during stage ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eMissionStage), ".")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting bCutsceneAssetsRequested to ", bCutsceneAssetsRequested, ".")
#ENDIF
ENDIF
ELSE
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), vShrinkOfficePosition) > DEFAULT_CUTSCENE_UNLOAD_DIST * 2
IF IS_INTERIOR_READY(GET_INTERIOR_AT_COORDS(vShrinkInteriorPosition))
UNPIN_INTERIOR(GET_INTERIOR_AT_COORDS(vShrinkInteriorPosition))
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Unpinning interior at coordinates ", vShrinkInteriorPosition, ".")
#ENDIF
ENDIF
IF HAS_THIS_CUTSCENE_LOADED("fam_6_mcs_6")
OR HAS_CUTSCENE_LOADED()
OR IS_CUTSCENE_ACTIVE()
REMOVE_CUTSCENE()
SET_MODEL_AS_NO_LONGER_NEEDED(BALLER)
bCutsceneAssetsRequested = FALSE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Player too far away from destination to keep cutscene in memory. Removing cutscene.")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting bCutsceneAssetsRequested to ", bCutsceneAssetsRequested, ".")
#ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
SWITCH iStageProgress
CASE 0
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
IF IS_SCREEN_FADED_OUT()
FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_ON_FOOT_WALK, FALSE, FAUS_DEFAULT, TRUE)
SIMULATE_PLAYER_INPUT_GAIT(PLAYER_ID(), PEDMOVE_WALK, 2500)
ENDIF
ENDIF
IF NOT IS_PED_INJURED(psJimmy.PedIndex)
IF ( GET_SCRIPT_TASK_STATUS(psJimmy.PedIndex, SCRIPT_TASK_FOLLOW_NAV_MESH_TO_COORD) != PERFORMING_TASK )
TASK_FOLLOW_NAV_MESH_TO_COORD(psJimmy.PedIndex, <<306.69650, 171.19496, 102.97732>>, PEDMOVE_WALK, DEFAULT_TIME_BEFORE_WARP * 3, DEFAULT_NAVMESH_RADIUS, ENAV_NO_STOPPING | ENAV_GO_FAR_AS_POSSIBLE_IF_TARGET_NAVMESH_NOT_LOADED)
FORCE_PED_MOTION_STATE(psJimmy.PedIndex, MS_ON_FOOT_WALK, FALSE, FAUS_DEFAULT, TRUE)
ENDIF
ENDIF
IF NOT IS_PED_INJURED(psTracey.PedIndex)
IF ( GET_SCRIPT_TASK_STATUS(psTracey.PedIndex, SCRIPT_TASK_FOLLOW_NAV_MESH_TO_COORD) != PERFORMING_TASK )
TASK_FOLLOW_NAV_MESH_TO_COORD(psTracey.PedIndex, <<306.20856, 174.41803, 103.00662>>, PEDMOVE_WALK, DEFAULT_TIME_BEFORE_WARP * 3, DEFAULT_NAVMESH_RADIUS, ENAV_NO_STOPPING | ENAV_GO_FAR_AS_POSSIBLE_IF_TARGET_NAVMESH_NOT_LOADED)
FORCE_PED_MOTION_STATE(psTracey.PedIndex, MS_ON_FOOT_WALK, FALSE, FAUS_DEFAULT, TRUE)
ENDIF
ENDIF
IF IS_SCREEN_FADED_OUT()
WAIT(2)
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
ENDIF
IF HAS_LABEL_BEEN_TRIGGERED("FAM6_DRF0")
REPLAY_RECORD_BACK_FOR_TIME(0.0, 15.0, REPLAY_IMPORTANCE_HIGHEST)
SET_LOCATES_BUDDIES_TO_GET_INTO_NEAREST_CAR(sLocatesData, vsMichaelsCar.VehicleIndex)
START_AUDIO_SCENE("FAMILY_6_DRIVE_TO_THERAPIST")
iStageProgress++
ENDIF
BREAK
CASE 1
IS_PLAYER_AT_LOCATION_WITH_BUDDIES_ANY_MEANS(sLocatesData, vShrinkOfficePosition, DEFAULT_LOCATES_SIZE_VECTOR(), TRUE,
psTracey.PedIndex, psJimmy.PedIndex, NULL, LabelFAM6SHRINK, "CMN_TCLEAVE", "CMN_JLEAVE", "", "FAM6_FAM", FALSE, TRUE)
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
IF ARE_PEDS_IN_THE_SAME_VEHICLE(PLAYER_PED_ID(), psJimmy.PedIndex)
AND ARE_PEDS_IN_THE_SAME_VEHICLE(PLAYER_PED_ID(), psTracey.PedIndex)
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-1894.675781,-567.717773,10.614735>>, <<-1906.339966,-557.923096,13.812391>>, 8.0)
IF IS_VEHICLE_ON_ALL_WHEELS(GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID()))
CLEAR_MISSION_LOCATION_TEXT_AND_BLIPS(sLocatesData)
KILL_ANY_CONVERSATION()
KILL_FACE_TO_FACE_CONVERSATION()
bDestinationReached = TRUE
iStageProgress++
ENDIF
ENDIF
ELSE
IF IS_PED_GROUP_MEMBER(psJimmy.PedIndex, PLAYER_GROUP_ID())
AND IS_PED_GROUP_MEMBER(psTracey.PedIndex, PLAYER_GROUP_ID())
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-1894.675781,-567.717773,10.614735>>, <<-1906.339966,-557.923096,13.812391>>, 8.0)
IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF IS_VEHICLE_ON_ALL_WHEELS(GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID()))
CLEAR_MISSION_LOCATION_TEXT_AND_BLIPS(sLocatesData)
KILL_ANY_CONVERSATION()
KILL_FACE_TO_FACE_CONVERSATION()
bDestinationReached = TRUE
iStageProgress++
ENDIF
ELSE
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
AND NOT IS_PED_IN_ANY_VEHICLE(psJimmy.PedIndex)
AND NOT IS_PED_IN_ANY_VEHICLE(psTracey.PedIndex)
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-1894.675781,-567.717773,10.614735>>, <<-1906.339966,-557.923096,13.812391>>, 16.0)
AND IS_ENTITY_IN_ANGLED_AREA(psJimmy.PedIndex, <<-1894.675781,-567.717773,10.614735>>, <<-1906.339966,-557.923096,13.812391>>, 16.0)
AND IS_ENTITY_IN_ANGLED_AREA(psTracey.PedIndex, <<-1894.675781,-567.717773,10.614735>>, <<-1906.339966,-557.923096,13.812391>>, 16.0)
CLEAR_MISSION_LOCATION_TEXT_AND_BLIPS(sLocatesData)
KILL_ANY_CONVERSATION()
KILL_FACE_TO_FACE_CONVERSATION()
bDestinationReached = TRUE
iStageProgress++
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE 2
IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID()), 2.5)
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
iStageProgress++
ENDIF
ENDIF
ELSE
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
iStageProgress++
ENDIF
ENDIF
BREAK
CASE 3
bLeadInTriggered = TRUE
IF NOT IS_PED_INJURED(psJimmy.PedIndex)
SEQUENCE_INDEX JimmySequenceIndex
CLEAR_SEQUENCE_TASK(JimmySequenceIndex)
OPEN_SEQUENCE_TASK(JimmySequenceIndex)
IF IS_PED_IN_ANY_VEHICLE(psJimmy.PedIndex)
TASK_LEAVE_ANY_VEHICLE(NULL, GET_VEHICLE_EXIT_DELAY(psJimmy.PedIndex, GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID())))
ENDIF
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<-1913.51172, -568.23083, 10.82617>>, PEDMOVE_WALK, DEFAULT_TIME_BEFORE_WARP * 3)
CLOSE_SEQUENCE_TASK(JimmySequenceIndex)
TASK_PERFORM_SEQUENCE(psJimmy.PedIndex, JimmySequenceIndex)
CLEAR_SEQUENCE_TASK(JimmySequenceIndex)
ENDIF
IF NOT IS_PED_INJURED(psTracey.PedIndex)
SEQUENCE_INDEX TraceySequenceIndex
CLEAR_SEQUENCE_TASK(TraceySequenceIndex)
OPEN_SEQUENCE_TASK(TraceySequenceIndex)
IF IS_PED_IN_ANY_VEHICLE(psTracey.PedIndex)
TASK_LEAVE_ANY_VEHICLE(NULL, GET_VEHICLE_EXIT_DELAY(psTracey.PedIndex, GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID())))
ENDIF
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<-1913.51172, -568.23083, 10.82617>>, PEDMOVE_WALK, DEFAULT_TIME_BEFORE_WARP * 3)
CLOSE_SEQUENCE_TASK(TraceySequenceIndex)
TASK_PERFORM_SEQUENCE(psTracey.PedIndex, TraceySequenceIndex)
CLEAR_SEQUENCE_TASK(TraceySequenceIndex)
ENDIF
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
SEQUENCE_INDEX PlayerSequenceIndex
CLEAR_SEQUENCE_TASK(PlayerSequenceIndex)
OPEN_SEQUENCE_TASK(PlayerSequenceIndex)
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
TASK_LEAVE_ANY_VEHICLE(NULL, GET_VEHICLE_EXIT_DELAY(PLAYER_PED_ID(), GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID())))
ENDIF
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<-1913.51172, -568.23083, 10.82617>>, PEDMOVE_WALK, DEFAULT_TIME_BEFORE_WARP * 3)
CLOSE_SEQUENCE_TASK(PlayerSequenceIndex)
TASK_PERFORM_SEQUENCE(PLAYER_PED_ID(), PlayerSequenceIndex)
CLEAR_SEQUENCE_TASK(PlayerSequenceIndex)
ENDIF
iStageProgress++
BREAK
CASE 4
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
AND NOT IS_PED_IN_ANY_VEHICLE(psJimmy.PedIndex)
AND NOT IS_PED_IN_ANY_VEHICLE(psTracey.PedIndex)
IF NOT IS_PED_INJURED(psAmanda.PedIndex)
CLEAR_RAGDOLL_BLOCKING_FLAGS(psAmanda.PedIndex, RBF_MELEE)
CLEAR_RAGDOLL_BLOCKING_FLAGS(psAmanda.PedIndex, RBF_PLAYER_BUMP)
CLEAR_RAGDOLL_BLOCKING_FLAGS(psAmanda.PedIndex, RBF_PLAYER_IMPACT)
TASK_FOLLOW_NAV_MESH_TO_COORD(psAmanda.PedIndex, <<-1913.51172, -568.23083, 10.82617>>, PEDMOVE_WALK, DEFAULT_TIME_BEFORE_WARP * 3)
ENDIF
DESTROY_ALL_CAMS()
ScriptedCamera = CREATE_CAMERA(CAMTYPE_SCRIPTED, TRUE)
SET_CAM_PARAMS(ScriptedCamera, <<-1887.2565, -532.6524, 21.8295>>, <<-8.7969, 1.7310, 154.3490>>, 36.7)
SET_CAM_PARAMS(ScriptedCamera, <<-1887.3967, -532.7990, 23.3122>>, <<-9.4823, 1.7310, 154.3490>>, 36.7,
15000, GRAPH_TYPE_LINEAR, GRAPH_TYPE_LINEAR)
SHAKE_CAM(ScriptedCamera,"HAND_SHAKE",0.1)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
REPLAY_RECORD_BACK_FOR_TIME(16.0, 0.0, REPLAY_IMPORTANCE_HIGHEST)
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
DISPLAY_HUD(FALSE)
DISPLAY_RADAR(FALSE)
psAmanda.iTimer = GET_GAME_TIMER()
iStageProgress++
ENDIF
BREAK
CASE 5
IF GET_GAME_TIMER() - psAmanda.iTimer > 3000
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF ( bCutsceneAssetsRequested = TRUE )
CLEANUP_PED(psLazlow, TRUE)
CLEANUP_PED(psTatguy, TRUE)
REMOVE_ANIM_DICT("missfam6leadinoutfam_6_mcs_5")
REMOVE_ANIM_DICT("amb@world_human_stand_impatient@female@no_sign@idle_a")
IF NOT IS_PED_INJURED(psAmanda.PedIndex)
TASK_CLEAR_LOOK_AT(psAmanda.PedIndex)
ENDIF
REPLAY_STOP_EVENT()
RETURN TRUE
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
FUNC BOOL IS_MISSION_STAGE_CUTSCENE_SHRINK_COMPLETED(INT &iStageProgress)
SWITCH iStageProgress
CASE 0
IF HAS_REQUESTED_CUTSCENE_LOADED("fam_6_mcs_6")
IF NOT IS_PED_INJURED(psJimmy.PedIndex)
IF IS_PED_GROUP_MEMBER(psJimmy.PedIndex, PLAYER_GROUP_ID())
REMOVE_PED_FROM_GROUP(psJimmy.PedIndex)
ENDIF
REGISTER_ENTITY_FOR_CUTSCENE(psJimmy.PedIndex, "Jimmy", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, psJimmy.ModelName)
ENDIF
IF NOT IS_PED_INJURED(psTracey.PedIndex)
IF IS_PED_GROUP_MEMBER(psTracey.PedIndex, PLAYER_GROUP_ID())
REMOVE_PED_FROM_GROUP(psTracey.PedIndex)
ENDIF
REGISTER_ENTITY_FOR_CUTSCENE(psTracey.PedIndex, "Tracy", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, psTracey.ModelName)
ENDIF
IF NOT IS_PED_INJURED(psAmanda.PedIndex)
REGISTER_ENTITY_FOR_CUTSCENE(psAmanda.PedIndex, "Amanda", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, psAmanda.ModelName)
ENDIF
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
STOP_AUDIO_SCENES()
START_CUTSCENE(CUTSCENE_DELAY_ENABLING_PLAYER_CONTROL_FOR_UP_TO_DATE_GAMEPLAY_CAMERA)
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
iStageProgress++
ELSE
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", PLAYER_PED_ID(), PLAYER_ZERO)
SET_JIMMY_CUTSCENE_COMPONENT_VARIATIONS()
SET_TRACEY_CUTSCENE_COMPONENT_VARIATIONS()
SET_AMANDA_CUTSCENE_COMPONENT_VARIATIONS()
ENDIF
ENDIF
BREAK
CASE 1
IF IS_CUTSCENE_PLAYING()
VEHICLE_INDEX LastPlayerVehicleIndex
LastPlayerVehicleIndex = GET_PLAYERS_LAST_VEHICLE()
IF DOES_ENTITY_EXIST(LastPlayerVehicleIndex)
IF NOT IS_ENTITY_DEAD(LastPlayerVehicleIndex)
IF IS_VEHICLE_AVAILABLE_TO_SNAPSHOT(PLAYER_PED_ID(), LastPlayerVehicleIndex, TRUE)
IF NOT IS_THIS_MODEL_A_HELI(GET_ENTITY_MODEL(LastPlayerVehicleIndex))
AND NOT IS_THIS_MODEL_A_PLANE(GET_ENTITY_MODEL(LastPlayerVehicleIndex))
IF NOT IS_ENTITY_A_MISSION_ENTITY(LastPlayerVehicleIndex)
SET_ENTITY_AS_MISSION_ENTITY(LastPlayerVehicleIndex)
SET_VEHICLE_AS_NO_LONGER_NEEDED(vsMichaelsCar.VehicleIndex)
vsMichaelsCar.VehicleIndex = LastPlayerVehicleIndex
ENDIF
STOP_VEHICLE_FIRE(LastPlayerVehicleIndex)
SET_ENTITY_COORDS(LastPlayerVehicleIndex, vsMichaelsCar.vPosition)
SET_ENTITY_HEADING(LastPlayerVehicleIndex, vsMichaelsCar.fHeading)
SET_VEHICLE_ON_GROUND_PROPERLY(LastPlayerVehicleIndex)
SET_VEHICLE_DOORS_SHUT(LastPlayerVehicleIndex, TRUE)
SET_VEHICLE_ENGINE_ON(LastPlayerVehicleIndex, FALSE, TRUE)
SET_VEHICLE_LOD_MULTIPLIER(LastPlayerVehicleIndex, 2.0)
REQUEST_VEHICLE_HIGH_DETAIL_MODEL(LastPlayerVehicleIndex)
OVERRIDE_REPLAY_CHECKPOINT_VEHICLE(LastPlayerVehicleIndex)
ENDIF
ENDIF
ENDIF
ENDIF
DESTROY_ALL_CAMS()
RENDER_SCRIPT_CAMS(FALSE, FALSE)
CLEAR_AREA_OF_PEDS(MissionPosition.vPosition, 100.0)
CLEAR_AREA_OF_OBJECTS(MissionPosition.vPosition, 100.0)
CLEAR_AREA_OF_VEHICLES(MissionPosition.vPosition, 100.0)
CLEAR_AREA_OF_PROJECTILES(MissionPosition.vPosition, 100.0)
REMOVE_PARTICLE_FX_IN_RANGE(MissionPosition.vPosition, 100.0)
IF IS_SCREEN_FADED_OUT()
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
ENDIF
iStageProgress++
ENDIF
BREAK
CASE 2
IF DOES_ENTITY_EXIST(vsMichaelsCar.VehicleIndex) AND NOT IS_ENTITY_DEAD(vsMichaelsCar.VehicleIndex)
SET_FORCE_HD_VEHICLE(vsMichaelsCar.VehicleIndex, TRUE)
SET_VEHICLE_WILL_FORCE_OTHER_VEHICLES_TO_STOP(vsMichaelsCar.VehicleIndex, TRUE)
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michael")
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY() returned true for Michael.")
#ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Amanda")
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY() returned true for Amanda.")
#ENDIF
IF NOT IS_PED_INJURED(psAmanda.PedIndex)
IF IS_VEHICLE_DRIVEABLE(vsMichaelsCar.VehicleIndex)
FORCE_PED_MOTION_STATE(psAmanda.PedIndex, MS_ON_FOOT_WALK, FALSE, FAUS_CUTSCENE_EXIT)
TASK_ENTER_VEHICLE(psAmanda.PedIndex, vsMichaelsCar.VehicleIndex, DEFAULT_TIME_BEFORE_WARP ,VS_FRONT_RIGHT, PEDMOVE_WALK)
ENDIF
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Tracy")
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY() returned true for Tracy.")
#ENDIF
IF NOT IS_PED_INJURED(psTracey.PedIndex)
IF IS_VEHICLE_DRIVEABLE(vsMichaelsCar.VehicleIndex)
FORCE_PED_MOTION_STATE(psTracey.PedIndex, MS_ON_FOOT_WALK, FALSE, FAUS_CUTSCENE_EXIT)
TASK_ENTER_VEHICLE(psTracey.PedIndex, vsMichaelsCar.VehicleIndex, DEFAULT_TIME_BEFORE_WARP ,VS_BACK_RIGHT, PEDMOVE_WALK)
ENDIF
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Jimmy")
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY() returned true for Jimmy.")
#ENDIF
IF NOT IS_PED_INJURED(psJimmy.PedIndex)
SET_PED_COMPONENT_VARIATION(psJimmy.PedIndex, PED_COMP_BERD, 0, 0)
IF IS_VEHICLE_DRIVEABLE(vsMichaelsCar.VehicleIndex)
FORCE_PED_MOTION_STATE(psJimmy.PedIndex, MS_ON_FOOT_WALK, FALSE, FAUS_CUTSCENE_EXIT)
TASK_ENTER_VEHICLE(psJimmy.PedIndex, vsMichaelsCar.VehicleIndex, DEFAULT_TIME_BEFORE_WARP ,VS_BACK_LEFT, PEDMOVE_WALK)
ENDIF
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_CAMERA()
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_SET_EXIT_STATE_FOR_CAMERA() returned true.")
#ENDIF
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
ENDIF
IF HAS_CUTSCENE_FINISHED()
REPLAY_STOP_EVENT()
IF ( bCutsceneSkipped = TRUE )
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
WARP_PED(PLAYER_PED_ID(), MissionPosition.vPosition, MissionPosition.fHeading, FALSE, FALSE, FALSE)
CLEAR_PED_TASKS(PLAYER_PED_ID())
ENDIF
ENDIF
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
DEBIT_BANK_ACCOUNT(CHAR_MICHAEL, BAAC_SHRINK, 4000)
IF IS_SCREEN_FADED_OUT()
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
ENDIF
RETURN TRUE
ELSE
IF ( bCutsceneSkipped = FALSE )
IF WAS_CUTSCENE_SKIPPED()
SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, FALSE, FALSE) //if cutscene was skipped, fade out and don't fade in
bCutsceneSkipped = TRUE
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
PROC MANAGE_CONVERSATIONS_DURING_GO_HOME()
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM6_HOME")
IF IS_SCREEN_FADED_IN() AND NOT IS_SCREEN_FADING_IN()
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(FAM6Conversation, "FAM6AUD", "FAM6_HOME", CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("FAM6_HOME", TRUE)
CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_PED(PLAYER_ID())
CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_NON_ANIMAL_PED(PLAYER_ID())
ENDIF
ENDIF
ENDIF
ELSE
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM6_CHAT1")
AND NOT HAS_LABEL_BEEN_TRIGGERED("FAM6_CHAT2")
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF IS_PED_IN_VEHICLE(psJimmy.PedIndex, GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()))
AND IS_PED_IN_VEHICLE(psTracey.PedIndex, GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()))
AND IS_PED_IN_VEHICLE(psAmanda.PedIndex, GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()))
IF CREATE_CONVERSATION(FAM6Conversation, "FAM6AUD", PICK_STRING(bStageReplayInProgress, "FAM6_CHAT2", "FAM6_CHAT1"), CONV_PRIORITY_MEDIUM)
CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_PED(PLAYER_ID())
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()))
SET_LABEL_AS_TRIGGERED(PICK_STRING(bStageReplayInProgress, "FAM6_CHAT2", "FAM6_CHAT1"), TRUE)
bRunConversationPausingCheck = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
//if main conversation was interrupted, resume it from the next label
IF ( bCurrentConversationInterrupted = TRUE )
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
IF HAS_LABEL_BEEN_TRIGGERED("FAM6_BAD")
OR HAS_LABEL_BEEN_TRIGGERED("FAM6_HITPED")
OR HAS_LABEL_BEEN_TRIGGERED("FAM6_WANTED")
IF HAS_LABEL_BEEN_TRIGGERED("FAM6_CHAT1")
OR HAS_LABEL_BEEN_TRIGGERED("FAM6_CHAT2")
OR HAS_LABEL_BEEN_TRIGGERED("FAM6_WEIRD")
//play conversation for Amanda saying cops were lost and it's safe to go back to house (3 random variations)
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM6_LOSE_3")
IF HAS_LABEL_BEEN_TRIGGERED("FAM6_WANTED") //this will only play if conversation to lose cops was triggered
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM6_LOSE")
IF CREATE_CONVERSATION(FAM6Conversation, "FAM6AUD", "FAM6_LOSE", CONV_PRIORITY_MEDIUM)
iCopsLostConversationCount++
SET_LABEL_AS_TRIGGERED("FAM6_LOSE", TRUE)
IF ( iCopsLostConversationCount >= 3)
SET_LABEL_AS_TRIGGERED("FAM6_LOSE_3", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
//resume the interrupted coversation
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF NOT IS_STRING_NULL_OR_EMPTY(CurrentConversationRoot)
AND NOT IS_STRING_NULL_OR_EMPTY(CurrentConversationLabel)
IF ARE_STRINGS_EQUAL(CurrentConversationRoot, "FAM6_CHAT1") //resume only the main conversations
OR ARE_STRINGS_EQUAL(CurrentConversationRoot, "FAM6_CHAT2")
OR ARE_STRINGS_EQUAL(CurrentConversationRoot, "FAM6_WEIRD")
IF ( iPlayerOffencesCount >= 3 )
AND NOT HAS_LABEL_BEEN_TRIGGERED("FAM6_WEIRD")
//if player commited more than 3 offences and the weird conversation did not trigger
//let the weird conversations trigger first before it can be resumed
ELSE
//resume conversation from specific root and line label
IF CREATE_CONVERSATION_FROM_SPECIFIC_LINE(FAM6Conversation, "FAM6AUD", CurrentConversationRoot, CurrentConversationLabel, CONV_PRIORITY_MEDIUM)
bCurrentConversationInterrupted = FALSE
SET_LABEL_AS_TRIGGERED("FAM6_BAD", FALSE) //mark all the interrupt conversations as not triggered
SET_LABEL_AS_TRIGGERED("FAM6_LOSE", FALSE)
SET_LABEL_AS_TRIGGERED("FAM6_HITPED", FALSE)
SET_LABEL_AS_TRIGGERED("FAM6_WANTED", FALSE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
//resume paused conversations when player gets back in the car
//IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
//IF IS_FACE_TO_FACE_CONVERSATION_PAUSED()
//PAUSE_FACE_TO_FACE_CONVERSATION(FALSE)
//ENDIF
//ENDIF
ELSE //locates header blip does not exist
//play interrupt conversation when player becomes wanted
IF IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
IF ( bCurrentConversationInterrupted = FALSE )
IF HAS_LABEL_BEEN_TRIGGERED("FAM6_CHAT1")
OR HAS_LABEL_BEEN_TRIGGERED("FAM6_CHAT2")
OR HAS_LABEL_BEEN_TRIGGERED("FAM6_WEIRD")
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
CurrentConversationRoot = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_ROOT()
IF NOT IS_STRING_NULL_OR_EMPTY(CurrentConversationRoot)
IF ARE_STRINGS_EQUAL(CurrentConversationRoot, "FAM6_CHAT1")
OR ARE_STRINGS_EQUAL(CurrentConversationRoot, "FAM6_CHAT2")
OR ARE_STRINGS_EQUAL(CurrentConversationRoot, "FAM6_WEIRD")
bCurrentConversationInterrupted = TRUE
CurrentConversationRoot = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_ROOT()
CurrentConversationLabel = GET_STANDARD_CONVERSATION_LABEL_FOR_FUTURE_RESUMPTION()
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF ( bCurrentConversationInterrupted = TRUE )
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM6_WANTED")
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(FAM6Conversation, "FAM6AUD", "FAM6_WANTED", CONV_PRIORITY_HIGH)
iPlayerOffencesCount++
SET_LABEL_AS_TRIGGERED("FAM6_WANTED", TRUE)
CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_PED(PLAYER_ID())
CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_NON_ANIMAL_PED(PLAYER_ID())
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": iPlayerOffencesCount: ", iPlayerOffencesCount, ".")
#ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
//keep reseting those flags during wanted level as the player might be driving recklessly
CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_PED(PLAYER_ID())
CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_NON_ANIMAL_PED(PLAYER_ID())
ELSE
//IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
// IF NOT IS_FACE_TO_FACE_CONVERSATION_PAUSED()
// PAUSE_FACE_TO_FACE_CONVERSATION(TRUE)
// ENDIF
//ENDIF
ENDIF
ENDIF
//play interrupt conversations for player offences
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
IF ( GET_GAME_TIMER() - iPlayerOffenceTimer > 5000 )
//play conversation for player running over peds
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM6_HITPED_5")
IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF HAS_PLAYER_DAMAGED_AT_LEAST_ONE_NON_ANIMAL_PED(PLAYER_ID())
AND HAS_ENTITY_COLLIDED_WITH_ANYTHING(GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID()))
bPlayerHitPed = TRUE
ENDIF
ENDIF
IF ( bPlayerHitPed = TRUE )
IF HAS_LABEL_BEEN_TRIGGERED("FAM6_CHAT1")
OR HAS_LABEL_BEEN_TRIGGERED("FAM6_CHAT2")
OR HAS_LABEL_BEEN_TRIGGERED("FAM6_WEIRD")
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
CurrentConversationRoot = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_ROOT()
IF NOT IS_STRING_NULL_OR_EMPTY(CurrentConversationRoot)
IF ARE_STRINGS_EQUAL(CurrentConversationRoot, "FAM6_CHAT1")
OR ARE_STRINGS_EQUAL(CurrentConversationRoot, "FAM6_CHAT2")
OR ARE_STRINGS_EQUAL(CurrentConversationRoot, "FAM6_WEIRD")
CurrentConversationRoot = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_ROOT()
CurrentConversationLabel = GET_STANDARD_CONVERSATION_LABEL_FOR_FUTURE_RESUMPTION()
bCurrentConversationInterrupted = TRUE
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDIF
ENDIF
ENDIF
ENDIF
IF CREATE_CONVERSATION(FAM6Conversation, "FAM6AUD", "FAM6_HITPED", CONV_PRIORITY_MEDIUM)
iPlayerOffencesCount++
iHitPedConversationCount++
bPlayerHitPed = FALSE
iPlayerOffenceTimer = GET_GAME_TIMER()
SET_LABEL_AS_TRIGGERED("FAM6_HITPED", TRUE)
IF ( iHitPedConversationCount >= 5 )
SET_LABEL_AS_TRIGGERED("FAM6_HITPED_5", TRUE)
ENDIF
CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_PED(PLAYER_ID())
CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_NON_ANIMAL_PED(PLAYER_ID())
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": iPlayerOffencesCount: ", iPlayerOffencesCount, ".")
#ENDIF
ENDIF
ENDIF
ENDIF
//play conversation for player shooting, acting bad etc
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM6_BAD_3")
IF IS_PED_SHOOTING(PLAYER_PED_ID()) //add more conditions here if needed
bPlayerActingBad = TRUE
ENDIF
IF ( bPlayerActingBad = TRUE)
IF HAS_LABEL_BEEN_TRIGGERED("FAM6_CHAT1")
OR HAS_LABEL_BEEN_TRIGGERED("FAM6_CHAT2")
OR HAS_LABEL_BEEN_TRIGGERED("FAM6_WEIRD")
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
CurrentConversationRoot = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_ROOT()
IF NOT IS_STRING_NULL_OR_EMPTY(CurrentConversationRoot)
IF ARE_STRINGS_EQUAL(CurrentConversationRoot, "FAM6_CHAT1")
OR ARE_STRINGS_EQUAL(CurrentConversationRoot, "FAM6_CHAT2")
OR ARE_STRINGS_EQUAL(CurrentConversationRoot, "FAM6_WEIRD")
CurrentConversationRoot = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_ROOT()
CurrentConversationLabel = GET_STANDARD_CONVERSATION_LABEL_FOR_FUTURE_RESUMPTION()
bCurrentConversationInterrupted = TRUE
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDIF
ENDIF
ENDIF
ENDIF
IF CREATE_CONVERSATION(FAM6Conversation, "FAM6AUD", "FAM6_BAD", CONV_PRIORITY_MEDIUM)
iPlayerOffencesCount++
iBadConversationCount++
bPlayerActingBad = FALSE
iPlayerOffenceTimer = GET_GAME_TIMER()
SET_LABEL_AS_TRIGGERED("FAM6_BAD", TRUE)
IF ( iBadConversationCount >= 3 )
SET_LABEL_AS_TRIGGERED("FAM6_BAD_3", TRUE)
ENDIF
CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_PED(PLAYER_ID())
CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_NON_ANIMAL_PED(PLAYER_ID())
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": iPlayerOffencesCount: ", iPlayerOffencesCount, ".")
#ENDIF
ENDIF
ENDIF
ENDIF
ELSE
CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_PED(PLAYER_ID())
CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_NON_ANIMAL_PED(PLAYER_ID())
ENDIF
ENDIF
//play conversation for player being weird when more than 3 offences have been commited
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM6_WEIRD")
IF ( iPlayerOffencesCount >= 3 )
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF IS_PED_IN_VEHICLE(psJimmy.PedIndex, GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()))
AND IS_PED_IN_VEHICLE(psTracey.PedIndex, GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()))
AND IS_PED_IN_VEHICLE(psAmanda.PedIndex, GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()))
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(FAM6Conversation, "FAM6AUD", "FAM6_WEIRD", CONV_PRIORITY_MEDIUM)
bCurrentConversationInterrupted = FALSE
SET_LABEL_AS_TRIGGERED("FAM6_WEIRD", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM6_HOUSE")
IF ( bFamilyArrivedAtHouse = FALSE )
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
IF GET_DISTANCE_BETWEEN_COORDS(vMichaelsHousePosition, GET_ENTITY_COORDS(PLAYER_PED_ID())) < 50
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
IF CREATE_CONVERSATION(FAM6Conversation,"FAM6AUD","FAM6_HOUSE",CONV_PRIORITY_MEDIUM)
SET_LABEL_AS_TRIGGERED("FAM6_HOUSE", TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF ( bRunConversationPausingCheck = TRUE )
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF IS_PED_IN_VEHICLE(psJimmy.PedIndex, GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()))
AND IS_PED_IN_VEHICLE(psTracey.PedIndex, GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()))
AND IS_PED_IN_VEHICLE(psAmanda.PedIndex, GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()))
//AND DOES_BLIP_EXIST(sLocatesData.LocationBlip)
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF IS_FACE_TO_FACE_CONVERSATION_PAUSED()
PAUSE_FACE_TO_FACE_CONVERSATION(FALSE)
ENDIF
ENDIF
ELSE
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_FACE_TO_FACE_CONVERSATION_PAUSED()
PAUSE_FACE_TO_FACE_CONVERSATION(TRUE)
ENDIF
ENDIF
ENDIF
ELIF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
AND NOT IS_PED_IN_ANY_VEHICLE(psJimmy.PedIndex)
AND NOT IS_PED_IN_ANY_VEHICLE(psTracey.PedIndex)
AND NOT IS_PED_IN_ANY_VEHICLE(psAmanda.PedIndex)
IF GET_DISTANCE_BETWEEN_ENTITIES(psJimmy.PedIndex, PLAYER_PED_ID()) < 10
AND GET_DISTANCE_BETWEEN_ENTITIES(psTracey.PedIndex, PLAYER_PED_ID()) < 10
AND GET_DISTANCE_BETWEEN_ENTITIES(psAmanda.PedIndex, PLAYER_PED_ID()) < 10
//AND DOES_BLIP_EXIST(sLocatesData.LocationBlip)
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF IS_FACE_TO_FACE_CONVERSATION_PAUSED()
PAUSE_FACE_TO_FACE_CONVERSATION(FALSE)
ENDIF
ENDIF
ELSE
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_FACE_TO_FACE_CONVERSATION_PAUSED()
PAUSE_FACE_TO_FACE_CONVERSATION(TRUE)
ENDIF
ENDIF
ENDIF
ELSE
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_FACE_TO_FACE_CONVERSATION_PAUSED()
PAUSE_FACE_TO_FACE_CONVERSATION(TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
FUNC BOOL IS_MISSION_STAGE_DRIVE_HOME_COMPLETED(INT &iStageProgress)
//don't use locates header J skip
SET_BIT(sLocatesData.iLocatesBitSet, BS_DONT_DO_J_SKIP)
MANAGE_CONVERSATIONS_DURING_GO_HOME()
RUN_INTERIOR_UNPINNING_CHECK(vShrinkInteriorPosition, 30.0)
IF IS_PLAYER_BROWSING_ITEMS_IN_ANY_SHOP()
OR IS_PLAYER_CHANGING_CLOTHES()
IF HAS_THIS_CUTSCENE_LOADED("fam_6_mcs_6_p4_b")
OR HAS_CUTSCENE_LOADED()
OR IS_CUTSCENE_ACTIVE()
REMOVE_CUTSCENE()
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Player browsing items in a shop or changing clothes. Removing cutscene.")
#ENDIF
ENDIF
ELSE
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), vMichaelsHousePosition) < DEFAULT_CUTSCENE_LOAD_DIST
REQUEST_CUTSCENE("fam_6_mcs_6_p4_b")
IF ( bSetSRLForcePrestream = FALSE )
SET_SRL_FORCE_PRESTREAM(SRL_PRESTREAM_FORCE_OFF)
bSetSRLForcePrestream = TRUE
ENDIF
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", PLAYER_PED_ID())
SET_JIMMY_CUTSCENE_COMPONENT_VARIATIONS()
SET_TRACEY_CUTSCENE_COMPONENT_VARIATIONS()
SET_AMANDA_CUTSCENE_COMPONENT_VARIATIONS()
bCutsceneAssetsRequested = TRUE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting cutscene ped components for cutscene peds from peds during stage ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eMissionStage), ".")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting bCutsceneAssetsRequested to ", bCutsceneAssetsRequested, ".")
#ENDIF
ENDIF
ELSE
IF HAS_THIS_CUTSCENE_LOADED("fam_6_mcs_6_p4_b")
OR HAS_CUTSCENE_LOADED()
OR IS_CUTSCENE_ACTIVE()
REMOVE_CUTSCENE()
SET_MODEL_AS_NO_LONGER_NEEDED(BALLER)
bCutsceneAssetsRequested = FALSE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Player too far away from destination to keep cutscene in memory. Removing cutscene.")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting bCutsceneAssetsRequested to ", bCutsceneAssetsRequested, ".")
#ENDIF
ENDIF
ENDIF
ENDIF
SWITCH iStageProgress
CASE 0
IF NOT IS_PED_INJURED(psJimmy.PedIndex) AND IS_VEHICLE_DRIVEABLE(vsMichaelsCar.VehicleIndex)
IF ( GET_SCRIPT_TASK_STATUS(psJimmy.PedIndex, SCRIPT_TASK_ENTER_VEHICLE) != PERFORMING_TASK )
TASK_ENTER_VEHICLE(psJimmy.PedIndex, vsMichaelsCar.VehicleIndex, DEFAULT_TIME_BEFORE_WARP * 3, VS_BACK_LEFT, PEDMOVE_WALK)
FORCE_PED_MOTION_STATE(psJimmy.PedIndex, MS_ON_FOOT_WALK, FALSE, FAUS_DEFAULT, TRUE)
ENDIF
ENDIF
IF NOT IS_PED_INJURED(psTracey.PedIndex) AND IS_VEHICLE_DRIVEABLE(vsMichaelsCar.VehicleIndex)
IF ( GET_SCRIPT_TASK_STATUS(psTracey.PedIndex, SCRIPT_TASK_ENTER_VEHICLE) != PERFORMING_TASK )
TASK_ENTER_VEHICLE(psTracey.PedIndex, vsMichaelsCar.VehicleIndex, DEFAULT_TIME_BEFORE_WARP * 3, VS_BACK_RIGHT, PEDMOVE_WALK)
FORCE_PED_MOTION_STATE(psTracey.PedIndex, MS_ON_FOOT_WALK, FALSE, FAUS_DEFAULT, TRUE)
ENDIF
ENDIF
IF NOT IS_PED_INJURED(psAmanda.PedIndex) AND IS_VEHICLE_DRIVEABLE(vsMichaelsCar.VehicleIndex)
IF ( GET_SCRIPT_TASK_STATUS(psAmanda.PedIndex, SCRIPT_TASK_ENTER_VEHICLE) != PERFORMING_TASK )
TASK_ENTER_VEHICLE(psAmanda.PedIndex, vsMichaelsCar.VehicleIndex, DEFAULT_TIME_BEFORE_WARP * 3, VS_FRONT_RIGHT, PEDMOVE_WALK)
FORCE_PED_MOTION_STATE(psAmanda.PedIndex, MS_ON_FOOT_WALK, FALSE, FAUS_DEFAULT, TRUE)
ENDIF
ENDIF
IF IS_SCREEN_FADED_OUT()
WAIT(2)
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
ENDIF
IF HAS_LABEL_BEEN_TRIGGERED("FAM6_HOME")
SET_LOCATES_BUDDIES_TO_GET_INTO_NEAREST_CAR(sLocatesData, vsMichaelsCar.VehicleIndex)
START_AUDIO_SCENE("FAMILY_6_DRIVE_HOME")
bVehicleReversed = FALSE
iStageProgress++
ENDIF
BREAK
CASE 1
IF ( bStopUsingDefaultRoute = FALSE )
IF ( bCustomRouteActive = FALSE )
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
SET_GPS_DISABLED_ZONE(<< -1908.517456 - 24.0, -518.293640 - 24.0, 17.816877 - 8.0 >>,
<< -1908.517456 + 24.0, -518.293640 + 24.0, 17.816877 + 8.0 >>)
bCustomRouteActive = TRUE
ENDIF
ELSE
IF NOT DOES_BLIP_EXIST(sLocatesData.LocationBlip)
SET_GPS_DISABLED_ZONE(<< 0.0, 0.0, 0.0 >>, << 0.0, 0.0, 0.0 >>)
bCustomRouteActive = FALSE
ENDIF
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), << -1908.517456, -518.293640, 17.816877 >>, << 24.0, 24.0, 8.0 >>)
OR NOT IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<-1901.539307,-537.078613,17.767612>>, <<36.000000,32.000000,8.000000>>)
SET_GPS_DISABLED_ZONE(<< 0.0, 0.0, 0.0 >>, << 0.0, 0.0, 0.0 >>)
bStopUsingDefaultRoute = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
IS_PLAYER_AT_LOCATION_WITH_BUDDIES_ANY_MEANS(sLocatesData, vMichaelsHousePosition, DEFAULT_LOCATES_SIZE_VECTOR(),
TRUE, psAmanda.PedIndex, psJimmy.PedIndex, psTracey.PedIndex, "FAM6_DHOUSE",
"CMN_ALEAVE", "CMN_JLEAVE", "CMN_TCLEAVE", "FAM6_FAM", FALSE, TRUE)
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
IF ARE_PEDS_IN_THE_SAME_VEHICLE(PLAYER_PED_ID(), psJimmy.PedIndex)
AND ARE_PEDS_IN_THE_SAME_VEHICLE(PLAYER_PED_ID(), psAmanda.PedIndex)
AND ARE_PEDS_IN_THE_SAME_VEHICLE(PLAYER_PED_ID(), psTracey.PedIndex)
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-826.59497, 177.70781, 68.15234>>, <<-823.29541, 183.13243, 75.85941>>, 5.54)
IF IS_VEHICLE_ON_ALL_WHEELS(GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID()))
CLEAR_MISSION_LOCATION_TEXT_AND_BLIPS(sLocatesData)
KILL_ANY_CONVERSATION()
KILL_FACE_TO_FACE_CONVERSATION()
iStageProgress++
ENDIF
ENDIF
ELSE
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<-825.972961,179.888916,72.441452>>, << 10.0, 10.0, 4.0 >>)
AND IS_ENTITY_AT_COORD(psJimmy.PedIndex, <<-825.972961,179.888916,72.441452>>, << 10.0, 10.0, 4.0 >>)
AND IS_ENTITY_AT_COORD(psAmanda.PedIndex, <<-825.972961,179.888916,72.441452>>, << 10.0, 10.0, 4.0 >>)
AND IS_ENTITY_AT_COORD(psTracey.PedIndex, <<-825.972961,179.888916,72.441452>>, << 10.0, 10.0, 4.0 >>)
IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF IS_VEHICLE_ON_ALL_WHEELS(GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID()))
CLEAR_MISSION_LOCATION_TEXT_AND_BLIPS(sLocatesData)
KILL_ANY_CONVERSATION()
KILL_FACE_TO_FACE_CONVERSATION()
iStageProgress++
ENDIF
ELSE
CLEAR_MISSION_LOCATION_TEXT_AND_BLIPS(sLocatesData)
KILL_ANY_CONVERSATION()
KILL_FACE_TO_FACE_CONVERSATION()
iStageProgress++
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE 2
IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF ( bVehicleReversed = FALSE )
IF IS_VEHICLE_REVERSING(GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID()))
bVehicleReversed = TRUE
ENDIF
ENDIF
IF BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID()), 5.0)
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
iStageProgress++
ENDIF
ENDIF
ELSE
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
iStageProgress++
ENDIF
ENDIF
BREAK
CASE 3
IF NOT IS_PED_INJURED(psJimmy.PedIndex)
SEQUENCE_INDEX JimmySequenceIndex
CLEAR_SEQUENCE_TASK(JimmySequenceIndex)
OPEN_SEQUENCE_TASK(JimmySequenceIndex)
IF IS_PED_IN_ANY_VEHICLE(psJimmy.PedIndex)
TASK_LEAVE_ANY_VEHICLE(NULL, GET_VEHICLE_EXIT_DELAY(psJimmy.PedIndex, GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID())))
ENDIF
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, << -817.9304, 177.7482, 71.2278 >>, PEDMOVE_WALK, DEFAULT_TIME_BEFORE_WARP * 3)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, << -808.3328, 171.4540, 75.7457 >>, PEDMOVE_WALK, DEFAULT_TIME_BEFORE_WARP * 3)
CLOSE_SEQUENCE_TASK(JimmySequenceIndex)
TASK_PERFORM_SEQUENCE(psJimmy.PedIndex, JimmySequenceIndex)
CLEAR_SEQUENCE_TASK(JimmySequenceIndex)
ENDIF
IF NOT IS_PED_INJURED(psTracey.PedIndex)
SEQUENCE_INDEX TraceySequenceIndex
CLEAR_SEQUENCE_TASK(TraceySequenceIndex)
OPEN_SEQUENCE_TASK(TraceySequenceIndex)
IF IS_PED_IN_ANY_VEHICLE(psTracey.PedIndex)
TASK_LEAVE_ANY_VEHICLE(NULL, GET_VEHICLE_EXIT_DELAY(psTracey.PedIndex, GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID())))
ENDIF
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, << -817.9304, 177.7482, 71.2278 >>, PEDMOVE_WALK, DEFAULT_TIME_BEFORE_WARP * 3)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, << -803.5399, 177.6053, 75.7483 >>, PEDMOVE_WALK, DEFAULT_TIME_BEFORE_WARP * 3)
CLOSE_SEQUENCE_TASK(TraceySequenceIndex)
TASK_PERFORM_SEQUENCE(psTracey.PedIndex, TraceySequenceIndex)
CLEAR_SEQUENCE_TASK(TraceySequenceIndex)
ENDIF
IF NOT IS_PED_INJURED(psAmanda.PedIndex)
SEQUENCE_INDEX AmandaSequenceIndex
CLEAR_SEQUENCE_TASK(AmandaSequenceIndex)
OPEN_SEQUENCE_TASK(AmandaSequenceIndex)
IF IS_PED_IN_ANY_VEHICLE(psAmanda.PedIndex)
TASK_LEAVE_ANY_VEHICLE(NULL, GET_VEHICLE_EXIT_DELAY(psAmanda.PedIndex, GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID())))
ENDIF
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<-817.93042, 177.74828, 71.22781>>, PEDMOVE_WALK, DEFAULT_TIME_BEFORE_WARP * 3)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<-798.39508, 183.62172, 71.60547>>, PEDMOVE_WALK, DEFAULT_TIME_BEFORE_WARP * 3)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<-775.53857, 183.19688, 71.83523>>, PEDMOVE_WALK, DEFAULT_TIME_BEFORE_WARP * 3)
CLOSE_SEQUENCE_TASK(AmandaSequenceIndex)
TASK_PERFORM_SEQUENCE(psAmanda.PedIndex, AmandaSequenceIndex)
CLEAR_SEQUENCE_TASK(AmandaSequenceIndex)
ENDIF
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
SEQUENCE_INDEX PlayerSequenceIndex
CLEAR_SEQUENCE_TASK(PlayerSequenceIndex)
OPEN_SEQUENCE_TASK(PlayerSequenceIndex)
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
TASK_LEAVE_ANY_VEHICLE(NULL, GET_VEHICLE_EXIT_DELAY(PLAYER_PED_ID(), GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID())))
ENDIF
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, << -819.05, 177.24, 70.83 >>, PEDMOVE_WALK, DEFAULT_TIME_BEFORE_WARP * 3)
CLOSE_SEQUENCE_TASK(PlayerSequenceIndex)
TASK_PERFORM_SEQUENCE(PLAYER_PED_ID(), PlayerSequenceIndex)
CLEAR_SEQUENCE_TASK(PlayerSequenceIndex)
ENDIF
iStageProgress++
BREAK
CASE 4
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
AND NOT IS_PED_IN_ANY_VEHICLE(psJimmy.PedIndex)
AND NOT IS_PED_IN_ANY_VEHICLE(psTracey.PedIndex)
AND NOT IS_PED_IN_ANY_VEHICLE(psAmanda.PedIndex)
IF ( bCutsceneAssetsRequested = TRUE ) //progress if cutscene ped variations were requested
//otherwise cutscene might play with default ped variations
RETURN TRUE
ENDIF
ENDIF
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
FUNC BOOL IS_MISSION_STAGE_CUTSCENE_END_COMPLETED(INT &iStageProgress)
IF DOES_CAM_EXIST(ScriptedCamera)
SET_USE_HI_DOF()
ENDIF
SWITCH iStageProgress
CASE 0
IF HAS_REQUESTED_CUTSCENE_LOADED("fam_6_mcs_6_p4_b")
IF NOT IS_PED_INJURED(psJimmy.PedIndex)
REGISTER_ENTITY_FOR_CUTSCENE(psJimmy.PedIndex, "Jimmy", CU_ANIMATE_AND_DELETE_EXISTING_SCRIPT_ENTITY, psJimmy.ModelName)
ENDIF
IF NOT IS_PED_INJURED(psTracey.PedIndex)
REGISTER_ENTITY_FOR_CUTSCENE(psTracey.PedIndex, "Tracy", CU_ANIMATE_AND_DELETE_EXISTING_SCRIPT_ENTITY, psTracey.ModelName)
ENDIF
IF NOT IS_PED_INJURED(psAmanda.PedIndex)
REGISTER_ENTITY_FOR_CUTSCENE(psAmanda.PedIndex, "Amanda", CU_ANIMATE_AND_DELETE_EXISTING_SCRIPT_ENTITY, psAmanda.ModelName)
ENDIF
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
REPLAY_RECORD_BACK_FOR_TIME(10.0, 0.0)
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
STOP_AUDIO_SCENES()
START_CUTSCENE(CUTSCENE_CREATE_OBJECTS_AT_SCENE_ORIGIN)
iStageProgress++
ELSE
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", PLAYER_PED_ID(), PLAYER_ZERO)
SET_JIMMY_CUTSCENE_COMPONENT_VARIATIONS()
SET_TRACEY_CUTSCENE_COMPONENT_VARIATIONS()
SET_AMANDA_CUTSCENE_COMPONENT_VARIATIONS()
ENDIF
ENDIF
BREAK
CASE 1
IF IS_CUTSCENE_PLAYING()
VEHICLE_INDEX LastPlayerVehicleIndex
LastPlayerVehicleIndex = GET_PLAYERS_LAST_VEHICLE()
IF DOES_ENTITY_EXIST(LastPlayerVehicleIndex)
IF NOT IS_ENTITY_DEAD(LastPlayerVehicleIndex)
//if last player vehicle is in the cutscene area and would interfere with cutscene entities
IF IS_ENTITY_IN_ANGLED_AREA(LastPlayerVehicleIndex, <<-822.864136,175.135193,69.303169>>, <<-815.251099,178.129684,76.153091>>, 8.0)
IF NOT IS_ENTITY_A_MISSION_ENTITY(LastPlayerVehicleIndex)
SET_ENTITY_AS_MISSION_ENTITY(LastPlayerVehicleIndex)
ENDIF
STOP_VEHICLE_FIRE(LastPlayerVehicleIndex)
SET_ENTITY_COORDS(LastPlayerVehicleIndex, vsMichaelsCar.vPosition)
SET_ENTITY_HEADING(LastPlayerVehicleIndex, vsMichaelsCar.fHeading)
SET_VEHICLE_DOORS_SHUT(LastPlayerVehicleIndex, TRUE)
SET_VEHICLE_ON_GROUND_PROPERLY(LastPlayerVehicleIndex)
SET_VEHICLE_ENGINE_ON(LastPlayerVehicleIndex, FALSE, TRUE)
ENDIF
IF GET_DISTANCE_BETWEEN_COORDS(vMichaelsHousePosition, GET_ENTITY_COORDS(LastPlayerVehicleIndex)) < 15.0
IF NOT IS_ENTITY_A_MISSION_ENTITY(LastPlayerVehicleIndex)
SET_ENTITY_AS_MISSION_ENTITY(LastPlayerVehicleIndex)
ENDIF
STOP_VEHICLE_FIRE(LastPlayerVehicleIndex)
SET_ENTITY_COORDS(LastPlayerVehicleIndex, vsMichaelsCar.vPosition)
SET_ENTITY_HEADING(LastPlayerVehicleIndex, PICK_FLOAT(bVehicleReversed, 136.4846, vsMichaelsCar.fHeading))
SET_VEHICLE_ON_GROUND_PROPERLY(LastPlayerVehicleIndex)
SET_VEHICLE_DOORS_SHUT(LastPlayerVehicleIndex, TRUE)
SET_VEHICLE_ENGINE_ON(LastPlayerVehicleIndex, FALSE, TRUE)
SET_VEHICLE_LOD_MULTIPLIER(LastPlayerVehicleIndex, 2.0)
REQUEST_VEHICLE_HIGH_DETAIL_MODEL(LastPlayerVehicleIndex)
IF DOES_VEHICLE_OVERLAP_ANGLED_AREA(LastPlayerVehicleIndex, <<-828.601990,176.916138,67.952744>>,
<<-822.840515,183.031448,74.878098>>, 4.0)
//reposition last player vehicle across the street
SET_ENTITY_COORDS(LastPlayerVehicleIndex, << -867.9103, 158.2215, 63.9014 >>)
SET_ENTITY_HEADING(LastPlayerVehicleIndex, 174.2918)
SET_VEHICLE_DOORS_SHUT(LastPlayerVehicleIndex, TRUE)
SET_VEHICLE_ON_GROUND_PROPERLY(LastPlayerVehicleIndex)
SET_VEHICLE_ENGINE_ON(LastPlayerVehicleIndex, FALSE, TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
DESTROY_ALL_CAMS()
RENDER_SCRIPT_CAMS(FALSE, FALSE)
CLEAR_AREA_OF_PEDS(MissionPosition.vPosition, 100.0)
CLEAR_AREA_OF_OBJECTS(MissionPosition.vPosition, 100.0)
CLEAR_AREA_OF_VEHICLES(MissionPosition.vPosition, 100.0)
CLEAR_AREA_OF_PROJECTILES(MissionPosition.vPosition, 100.0)
REMOVE_PARTICLE_FX_IN_RANGE(MissionPosition.vPosition, 100.0)
IF IS_SCREEN_FADED_OUT()
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
ENDIF
iStageProgress++
ENDIF
BREAK
CASE 2
IF DOES_ENTITY_EXIST(vsMichaelsCar.VehicleIndex) AND NOT IS_ENTITY_DEAD(vsMichaelsCar.VehicleIndex)
SET_FORCE_HD_VEHICLE(vsMichaelsCar.VehicleIndex, TRUE)
SET_VEHICLE_WILL_FORCE_OTHER_VEHICLES_TO_STOP(vsMichaelsCar.VehicleIndex, TRUE)
ENDIF
IF NOT DOES_CAM_EXIST(ScriptedCamera)
ScriptedCamera = CREATE_CAMERA(CAMTYPE_SCRIPTED, TRUE)
SET_CAM_PARAMS(ScriptedCamera, <<-844.676208,180.998871,73.017410>>,<<5.071437,-0.000056,-101.571411>>,33.000000)
SET_CAM_DOF_PLANES(ScriptedCamera, 4.3662, 8.608, 1000.913, 10069.130)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
ENDIF
IF CAN_SET_EXIT_STATE_FOR_CAMERA()
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
ENDIF
IF HAS_CUTSCENE_FINISHED()
REPLAY_STOP_EVENT()
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
IF IS_SCREEN_FADED_OUT()
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
ENDIF
iStageProgress++
ENDIF
BREAK
CASE 3
IF DOES_CAM_EXIST(ScriptedCamera)
IF IS_CAM_RENDERING(ScriptedCamera)
TRIGGER_MISSION_STATS_UI(TRUE, TRUE)
iStageProgress++
ENDIF
ENDIF
BREAK
CASE 4
IF DOES_CAM_EXIST(ScriptedCamera)
IF IS_CAM_RENDERING(ScriptedCamera)
IF ( g_bResultScreenDisplaying = TRUE )
iStageProgress++
ENDIF
ENDIF
ENDIF
BREAK
CASE 5
IF DOES_CAM_EXIST(ScriptedCamera)
IF IS_CAM_RENDERING(ScriptedCamera)
IF ( g_bResultScreenDisplaying = FALSE )
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
iStageProgress++
ENDIF
ENDIF
ENDIF
BREAK
CASE 6
IF NOT IS_REPEAT_PLAY_ACTIVE()
RETURN TRUE
ELSE
IF IS_SCREEN_FADED_IN()
DO_SCREEN_FADE_OUT(DEFAULT_FADE_TIME)
ENDIF
IF IS_SCREEN_FADED_OUT() AND NOT IS_SCREEN_FADING_OUT()
RETURN TRUE
ENDIF
ENDIF
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
//|============================= END MISSION STAGES FUNCTIONS ============================|
//|=================================== MAIN SCRIPT LOOP ==================================|
SCRIPT
SET_MISSION_FLAG (TRUE)
//check for death or arrest
IF HAS_FORCE_CLEANUP_OCCURRED()
MISSION_FLOW_MISSION_FORCE_CLEANUP()
MISSION_CLEANUP()
TERMINATE_THIS_THREAD()
ENDIF
#IF IS_DEBUG_BUILD
CREATE_DEBUG_MISSION_STAGE_MENU()
CREATE_DEBUG_WIDGETS()
#ENDIF
IF IS_REPLAY_IN_PROGRESS()
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Mission replay is in progress.")
#ENDIF
SET_MISSION_STAGE_FOR_REPLAY(eMissionStage, GET_REPLAY_MID_MISSION_STAGE())
bReplayFlag = TRUE
//handle shitskip message
IF ( g_bShitSkipAccepted = TRUE )
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Shitskip accepted by the player.")
#ENDIF
eMissionStage = GET_NEXT_MISSION_STAGE_FOR_SHITSKIP(eMissionStage)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Shitskip changed mission stage to ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eMissionStage), ".")
#ENDIF
ELSE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Shitskip not triggered.")
#ENDIF
ENDIF
ELSE
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(ENUM_TO_INT(MID_MISSION_STAGE_DRIVE_TO_BEAN_MACHINE), "STAGE 0: DRIVE TO BEAN", FALSE)
ENDIF
IF IS_REPEAT_PLAY_ACTIVE()
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Repeat play is active.")
#ENDIF
IF NOT IS_REPLAY_IN_PROGRESS()
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Repeat play is active and mission replay is not in progress.")
#ENDIF
eMissionStage = MISSION_STAGE_CUTSCENE_INTRO_P1
bReplayFlag = TRUE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting local replay flag to TRUE for stage loading.")
#ENDIF
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Mission stage is ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eMissionStage), " for repeat play and no mission replay.")
#ENDIF
ELSE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Repeat play is active and mission replay is in progress.")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Mission stage is ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eMissionStage), " for repeat play and mission replay.")
#ENDIF
ENDIF
ENDIF
// PC custom keyboard and mouse control scheme
bPCControlsSetup = FALSE
WHILE TRUE
//check each frame if mission is failed due to fail conditions
//check only if mission stage loading has finished
//check mission stats for vehicle damage and vehicle speed
IF ( bLoadingFlag = TRUE )
RUN_FAIL_CHECKS(eMissionStage, eMissionFail)
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
INFORM_MISSION_STATS_OF_SPEED_WATCH_ENTITY(GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID()))
INFORM_MISSION_STATS_OF_DAMAGE_WATCH_ENTITY(GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID()))
ELSE
INFORM_MISSION_STATS_OF_SPEED_WATCH_ENTITY(NULL)
INFORM_MISSION_STATS_OF_DAMAGE_WATCH_ENTITY(NULL)
ENDIF
ENDIF
ENDIF
REPLAY_CHECK_FOR_EVENT_THIS_FRAME("M_ReuniteFamily")
SWITCH eMissionStage
CASE MISSION_STAGE_PRE_INTRO
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
REPLAY_DISABLE_CAMERA_MOVEMENT_THIS_FRAME()
IF IS_MISSION_STAGE_LOADED(eMissionStage, iStageSetupProgress, bLoadingFlag, bSkipFlag, bReplayFlag)
IF IS_MISSION_STAGE_PRE_INTRO_COMPLETED(iMissionStageProgress)
RESET_MISSION_FLAGS()
eMissionStage = MISSION_STAGE_CUTSCENE_INTRO_P1
ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_CUTSCENE_INTRO_P1
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
IF IS_MISSION_STAGE_LOADED(eMissionStage, iStageSetupProgress, bLoadingFlag, bSkipFlag, bReplayFlag)
IF IS_MISSION_STAGE_CUTSCENE_INTRO_P1_COMPLETED(iMissionStageProgress)
RESET_MISSION_FLAGS()
eMissionStage = MISSION_STAGE_TIMELAPSE
ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_TIMELAPSE
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
IF IS_MISSION_STAGE_LOADED(eMissionStage, iStageSetupProgress, bLoadingFlag, bSkipFlag, bReplayFlag)
IF IS_MISSION_STAGE_TIMELAPSE_COMPLETED(iMissionStageProgress)
RESET_MISSION_FLAGS()
eMissionStage = MISSION_STAGE_CUTSCENE_INTRO_P2
ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_CUTSCENE_INTRO_P2
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
IF IS_MISSION_STAGE_LOADED(eMissionStage, iStageSetupProgress, bLoadingFlag, bSkipFlag, bReplayFlag)
IF IS_MISSION_STAGE_CUTSCENE_INTRO_P2_COMPLETED(iMissionStageProgress)
RESET_MISSION_FLAGS()
eMissionStage = MISSION_STAGE_DRIVE_TO_BEAN_MACHINE
ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_DRIVE_TO_BEAN_MACHINE
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), vBeanMachinePosition) < 150
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.5)
ENDIF
IF IS_MISSION_STAGE_LOADED(eMissionStage, iStageSetupProgress, bLoadingFlag, bSkipFlag, bReplayFlag)
IF IS_MISSION_STAGE_DRIVE_TO_BEAN_MACHINE_COMPLETED(iMissionStageProgress)
RESET_MISSION_FLAGS()
eMissionStage = MISSION_STAGE_CUTSCENE_BEAN_MACHINE
ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_CUTSCENE_BEAN_MACHINE
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.5)
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.5)
IF IS_MISSION_STAGE_LOADED(eMissionStage, iStageSetupProgress, bLoadingFlag, bSkipFlag, bReplayFlag)
IF IS_MISSION_STAGE_CUTSCENE_BEAN_MACHINE_COMPLETED(iMissionStageProgress)
RESET_MISSION_FLAGS()
eMissionStage = MISSION_STAGE_DRIVE_TO_TRACEY
ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_DRIVE_TO_TRACEY
IF IS_MISSION_STAGE_LOADED(eMissionStage, iStageSetupProgress, bLoadingFlag, bSkipFlag, bReplayFlag)
IF IS_MISSION_STAGE_DRIVE_TO_TRACEY_COMPLETED(iMissionStageProgress)
RESET_MISSION_FLAGS()
eMissionStage = MISSION_STAGE_CUTSCENE_SHOP_1
ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_CUTSCENE_SHOP_1
IF IS_MISSION_STAGE_LOADED(eMissionStage, iStageSetupProgress, bLoadingFlag, bSkipFlag, bReplayFlag)
IF IS_MISSION_STAGE_CUTSCENE_SHOP_1_COMPLETED(iMissionStageProgress)
RESET_MISSION_FLAGS()
eMissionStage = MISSION_STAGE_PIERCE_LAZLOW
ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_PIERCE_LAZLOW
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
IF IS_MISSION_STAGE_LOADED(eMissionStage, iStageSetupProgress, bLoadingFlag, bSkipFlag, bReplayFlag)
IF IS_MISSION_STAGE_PIERCE_LAZLOW_COMPLETED(iMissionStageProgress)
RESET_MISSION_FLAGS()
eMissionStage = MISSION_STAGE_CUTSCENE_SHOP_2
ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_CUTSCENE_SHOP_2
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
IF IS_MISSION_STAGE_LOADED(eMissionStage, iStageSetupProgress, bLoadingFlag, bSkipFlag, bReplayFlag)
IF IS_MISSION_STAGE_CUTSCENE_SHOP_2_COMPLETED(iMissionStageProgress)
RESET_MISSION_FLAGS()
eMissionStage = MISSION_STAGE_TATTOO_LAZLOW
ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_TATTOO_LAZLOW
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
IF IS_MISSION_STAGE_LOADED(eMissionStage, iStageSetupProgress, bLoadingFlag, bSkipFlag, bReplayFlag)
IF IS_MISSION_STAGE_TATTOO_LAZLOW_COMPLETED(iMissionStageProgress)
RESET_MISSION_FLAGS()
eMissionStage = MISSION_STAGE_CUTSCENE_SHOP_3
ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_CUTSCENE_SHOP_3
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
IF IS_MISSION_STAGE_LOADED(eMissionStage, iStageSetupProgress, bLoadingFlag, bSkipFlag, bReplayFlag)
IF IS_MISSION_STAGE_CUTSCENE_SHOP_3_COMPLETED(iMissionStageProgress)
RESET_MISSION_FLAGS()
eMissionStage = MISSION_STAGE_CUT_LAZLOW_HAIR
ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_CUT_LAZLOW_HAIR
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
IF IS_MISSION_STAGE_LOADED(eMissionStage, iStageSetupProgress, bLoadingFlag, bSkipFlag, bReplayFlag)
IF IS_MISSION_STAGE_CUT_LAZLOW_HAIR_COMPLETED(iMissionStageProgress)
RESET_MISSION_FLAGS()
eMissionStage = MISSION_STAGE_CUTSCENE_SHOP_4
ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_CUTSCENE_SHOP_4
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.75)
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.50)
IF IS_MISSION_STAGE_LOADED(eMissionStage, iStageSetupProgress, bLoadingFlag, bSkipFlag, bReplayFlag)
IF IS_MISSION_STAGE_CUTSCENE_SHOP_4_COMPLETED(iMissionStageProgress)
RESET_MISSION_FLAGS()
eMissionStage = MISSION_STAGE_DRIVE_TO_SHRINK
ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_DRIVE_TO_SHRINK
IF IS_MISSION_STAGE_LOADED(eMissionStage, iStageSetupProgress, bLoadingFlag, bSkipFlag, bReplayFlag)
IF IS_MISSION_STAGE_DRIVE_TO_SHRINK_COMPLETED(iMissionStageProgress)
RESET_MISSION_FLAGS()
eMissionStage = MISSION_STAGE_CUTSCENE_SHRINK
ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_CUTSCENE_SHRINK
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.75)
IF IS_MISSION_STAGE_LOADED(eMissionStage, iStageSetupProgress, bLoadingFlag, bSkipFlag, bReplayFlag)
IF IS_MISSION_STAGE_CUTSCENE_SHRINK_COMPLETED(iMissionStageProgress)
RESET_MISSION_FLAGS()
eMissionStage = MISSION_STAGE_DRIVE_HOME
ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_DRIVE_HOME
IF IS_MISSION_STAGE_LOADED(eMissionStage, iStageSetupProgress, bLoadingFlag, bSkipFlag, bReplayFlag)
IF IS_MISSION_STAGE_DRIVE_HOME_COMPLETED(iMissionStageProgress)
RESET_MISSION_FLAGS()
eMissionStage = MISSION_STAGE_CUTSCENE_END
ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_CUTSCENE_END
IF IS_MISSION_STAGE_LOADED(eMissionStage, iStageSetupProgress, bLoadingFlag, bSkipFlag, bReplayFlag)
IF IS_MISSION_STAGE_CUTSCENE_END_COMPLETED(iMissionStageProgress)
RESET_MISSION_FLAGS()
eMissionStage = MISSION_STAGE_PASSED
ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_PASSED
CLEAR_HELP()
CLEAR_PRINTS()
KILL_ANY_CONVERSATION()
MISSION_FLOW_MISSION_PASSED()
IF NOT IS_REPEAT_PLAY_ACTIVE()
TRIGGER_SPECIFIC_SWITCH_AND_WAIT(PR_SCENE_T_NAKED_ISLAND , ENUM_TO_INT(SWITCH_FLAG_SKIP_INTRO))
UpdatePostMissionInfo(g_savedGlobals.sPlayerData.sInfo, CHAR_MICHAEL, PR_SCENE_Ma_FAMILY6) //#1570801
ENDIF
MISSION_CLEANUP()
TERMINATE_THIS_THREAD()
BREAK
CASE MISSION_STAGE_FAILED
SET_MISSION_FAILED_WITH_REASON(eMissionFail)
CLEAR_HELP()
CLEAR_PRINTS()
KILL_ANY_CONVERSATION()
WHILE NOT GET_MISSION_FLOW_SAFE_TO_CLEANUP()
WAIT(0)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Waiting for GET_MISSION_FLOW_SAFE_TO_CLEANUP() to return TRUE.")
#ENDIF
ENDWHILE
MISSION_CLEANUP()
TERMINATE_THIS_THREAD()
BREAK
ENDSWITCH
#IF IS_DEBUG_BUILD //handle debug functionality
RUN_DEBUG_PASS_AND_FAIL_CHECK(eMissionStage, eMissionFail) //handle key_f and key_s presses
RUN_DEBUG_MISSION_STAGE_MENU(iReturnStage, eMissionStage, bSkipFlag, bStageResetFlag) //handle z-skip menu
RUN_DEBUG_SKIPS(eMissionStage, bSkipFlag, bStageResetFlag) //handle j-skip and p-skip
#ENDIF
WAIT(0)
ENDWHILE
ENDSCRIPT