14712 lines
492 KiB
Python
Executable File
14712 lines
492 KiB
Python
Executable File
//|=======================================================================================|
|
|
//| Author: Lukasz Bogaj / Brenda Carey Date: 25/02/2011 |
|
|
//|=======================================================================================|
|
|
//| FAMILY5.sc |
|
|
//| DID SOMEBODY SAY YOGA |
|
|
//| |
|
|
//|=======================================================================================|
|
|
|
|
//Compile out Title Update changes to header functions.
|
|
//Must be before includes.
|
|
//CONST_INT USE_TU_CHANGES 0 // Removed by Kenneth R.
|
|
|
|
//===================================== INCLUDE FILES ====================================|
|
|
|
|
USING "rage_builtins.sch"
|
|
USING "globals.sch"
|
|
|
|
//Commands headers
|
|
USING "commands_ped.sch"
|
|
USING "commands_script.sch"
|
|
USING "commands_pad.sch"
|
|
USING "commands_misc.sch"
|
|
USING "commands_player.sch"
|
|
USING "commands_camera.sch"
|
|
USING "commands_object.sch"
|
|
USING "commands_interiors.sch"
|
|
USING "commands_streaming.sch"
|
|
USING "commands_fire.sch"
|
|
USING "commands_graphics.sch"
|
|
USING "commands_path.sch"
|
|
USING "commands_audio.sch"
|
|
USING "commands_entity.sch"
|
|
USING "commands_recording.sch"
|
|
|
|
//Script headers
|
|
USING "script_player.sch"
|
|
USING "script_ped.sch"
|
|
USING "script_buttons.sch"
|
|
USING "script_maths.sch"
|
|
USING "script_blips.sch"
|
|
|
|
//Public files
|
|
USING "flow_public_core_override.sch"
|
|
USING "cellphone_public.sch"
|
|
USING "selector_public.sch"
|
|
USING "player_ped_public.sch"
|
|
USING "locates_public.sch"
|
|
USING "building_control_public.sch"
|
|
USING "dialogue_public.sch"
|
|
USING "vehicle_gen_public.sch"
|
|
USING "replay_public.sch"
|
|
USING "commands_cutscene.sch"
|
|
USING "cutscene_public.sch"
|
|
USING "tv_control_public.sch"
|
|
USING "context_control_public.sch"
|
|
USING "CompletionPercentage_public.sch"
|
|
USING "mission_stat_public.sch"
|
|
USING "taxi_functions.sch"
|
|
USING "drunk_public.sch"
|
|
USING "shop_public.sch"
|
|
USING "clearMissionArea.sch"
|
|
USING "Yoga.sch"
|
|
USING "timeLapse.sch"
|
|
USING "carsteal_public.sch"
|
|
USING "emergency_call.sch"
|
|
|
|
//Debug headers
|
|
#IF IS_DEBUG_BUILD
|
|
USING "script_debug.sch"
|
|
USING "select_mission_stage.sch"
|
|
#ENDIF
|
|
|
|
//===================================== ENUMS & STRUCTS ==================================|
|
|
|
|
/// PURPOSE: Specifies stages of the mission.
|
|
ENUM MISSION_STAGES
|
|
MISSION_STAGE_PRE_TIMELAPSE = 0,
|
|
MISSION_STAGE_TIMELAPSE = 1, //Timelapse
|
|
MISSION_STAGE_CUTSCENE_INTRO = 2, //Intro cutscene
|
|
MISSION_STAGE_YOGA_WARRIOR = 3, //Yoga minigame - player has to complete warrior pose
|
|
MISSION_STAGE_CUTSCENE_TRIANGLE = 4, //Yoga cutscene - Fabien shows how to do triangle pose
|
|
MISSION_STAGE_YOGA_TRIANGLE = 5, //Yoga minigame - player has to complete triangle pose
|
|
MISSION_STAGE_CUTSCENE_SUNSALUTATION = 6, //Yoga cutscene - Fabien shows how to do sunsalutation pose
|
|
MISSION_STAGE_YOGA_SUNSALUTATION = 7, //Yoga minigame - player has to complete sunsalutation pose
|
|
MISSION_STAGE_CUTSCENE_POOL = 8, //Pool cutscene - Michael attacks the yoga instructor and lands in the pool
|
|
MISSION_STAGE_GOTO_JIMMYS_ROOM = 9, //Go upstairs to Jimmy's room
|
|
MISSION_STAGE_CUTSCENE_JIMMYS_ROOM = 10, //Jimmy's room cutscene
|
|
MISSION_STAGE_GOTO_BURGER_SHOT = 11, //Go to Burger Shot
|
|
MISSION_STAGE_CUTSCENE_BURGER_SHOT = 12, //Burger Shot cutscene
|
|
MISSION_STAGE_DRIVE_HOME = 13, //Drive home with Jimmy and drink
|
|
MISSION_STAGE_CUTSCENE_BLACKOUT = 14, //Blackout cutscene - Michael wakes up and sees monkeys and aliens
|
|
MISSION_STAGE_FLIGHT = 15, //Michael wakes up flying in the sky
|
|
MISSION_STAGE_GO_HOME_WASTED = 16, //Get back to the house after blackout
|
|
MISSION_STAGE_CUTSCENE_END_1 = 17, //End cutscene part 1
|
|
MISSION_STAGE_CUTSCENE_END_2 = 18, //End cutscene part 2
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
MISSION_STAGE_TEST = 19, //Debug stage to test triggering the in car mocap cutscene
|
|
#ENDIF
|
|
|
|
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_YOGA_FAILED, //Player failed yoga minigame
|
|
MISSION_FAIL_MICHAELS_CAR_UNDRIVEABLE, //Michael's car undriveable
|
|
MISSION_FAIL_MICHAELS_CAR_DEAD, //Michael's car destroyed
|
|
MISSION_FAIL_MICHAELS_CAR_LEFT_BEHIND, //Micahel's car left behind
|
|
MISSION_FAIL_AMANDA_DEAD, //Amanda dead
|
|
MISSION_FAIL_FABIEN_DEAD, //Fabien dead
|
|
MISSION_FAIL_JIMMY_DEAD, //Jimmy dead
|
|
MISSION_FAIL_JIMMY_LEFT_BEHIND, //Jimmy left behind
|
|
MISSION_FAIL_DEALER_ATTACKED, //Dealer attacked
|
|
MISSION_FAIL_DEALER_SCARED, //Dealer scared
|
|
MISSION_FAIL_DEALER_DEAD, //Dealer killed
|
|
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_YOGA_WARRIOR = 0, //Checkpoint at MISSION_STAGE_YOGA_WARRIOR
|
|
MID_MISSION_STAGE_YOGA_TRIANGLE = 1, //Checkpoint at MISSION_STAGE_YOGA_TRIANGLE
|
|
MID_MISSION_STAGE_YOGA_SUNSALUTATION = 2, //Checkpoint at MISSION_STAGE_YOGA_SUNSALUTATION
|
|
MID_MISSION_STAGE_GOTO_JIMMYS_ROOM = 3, //Checkpoint at MISSION_STAGE_GOTO_JIMMYS_ROOM
|
|
MID_MISSION_STAGE_GOTO_BURGER_SHOT = 4, //Checkpoint at MISSION_STAGE_GOTO_BURGER_SHOT
|
|
MID_MISSION_STAGE_DRIVE_HOME = 5, //Checkpoint at MISSION_STAGE_DRIVE_HOME
|
|
MID_MISSION_STAGE_GO_HOME_WASTED = 6 //Checkpoint at MISSION_STAGE_GO_HOME_WASTED
|
|
ENDENUM
|
|
|
|
ENUM MISSION_SFX
|
|
MISSION_SFX_NONE = 0,
|
|
MISSION_SFX_ALIENS,
|
|
MISSION_SFX_CHIMPS,
|
|
MISSION_SFX_HEARTBEAT,
|
|
MISSION_SFX_DRINK,
|
|
MISSION_SFX_VOMIT,
|
|
MISSION_SFX_TAP
|
|
ENDENUM
|
|
|
|
/// PURPOSE:
|
|
ENUM MISSION_OUTFITS
|
|
MO_MISSION_START = 0,
|
|
MO_DEFAULT = 1,
|
|
MO_YOGA = 2,
|
|
MO_YOGA_FLIP_FLOPS = 3,
|
|
MO_UNDERWEAR = 4,
|
|
MO_MISSION_END = 5
|
|
ENDENUM
|
|
|
|
ENUM MANSION_DOORS
|
|
DOOR_PATIO_LEFT = 0,
|
|
DOOR_PATIO_RIGHT = 1,
|
|
DOOR_JIMMYS_ROOM = 2,
|
|
|
|
MAX_MANSION_DOORS
|
|
ENDENUM
|
|
|
|
/// PURPOSE: Specifies ped behaviour states.
|
|
ENUM PED_STATES
|
|
PED_STATE_IDLE = 0,
|
|
PED_STATE_MOVING_TO_LOCATION,
|
|
PED_STATE_PLAYING_LOOP_ANIMATION,
|
|
PED_STATE_PLAYING_ACTION_ANIMATION,
|
|
PED_STATE_COMBAT,
|
|
PED_STATE_FLEEING
|
|
ENDENUM
|
|
|
|
ENUM MISSION_TRIGGER_MEANS
|
|
MISSION_TRIGGER_ON_FOOT = 0,
|
|
MISSION_TRIGGER_IN_VEHICLE
|
|
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
|
|
INT iPedConversationTimer //Ped's conversation timer
|
|
INT iTimer //Ped's timer
|
|
INT iLookAtTimer
|
|
INT iLookAtTime
|
|
INT iIntervalTime
|
|
BOOL bLookingAtTarget
|
|
BOOL bHasTask
|
|
PED_STATES eState
|
|
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: Specifies details of mission conversation.
|
|
STRUCT CONV_STRUCT
|
|
STRING sBlock
|
|
STRING sRoot
|
|
BOOL bTriggered
|
|
BOOL bPaused
|
|
BOOL bFinished
|
|
ENDSTRUCT
|
|
|
|
/// PURPOSE: Specifies details of mission sound effects.
|
|
STRUCT SFX_STRUCT
|
|
STRING sSoundName
|
|
INT iSoundID
|
|
BOOL bTriggered
|
|
ENDSTRUCT
|
|
|
|
/// PURPOSE: Contains player postion, heading and destination.
|
|
STRUCT LOCATION_STRUCT
|
|
BLIP_INDEX DestinationBlip //Stage destination blip
|
|
VECTOR vStageStart //Stage start position
|
|
FLOAT fStartHeading //Stage start heading
|
|
ENDSTRUCT
|
|
|
|
/// PURPOSE: Specifies details of angled area and safe position to trigger in game cutscene showing Michael get kicked out of the car
|
|
STRUCT LOCATE_STRUCT
|
|
VECTOR vPosition1 //Position1
|
|
VECTOR vPosition2 //Position2
|
|
FLOAT fWidth //Width
|
|
VECTOR vCutscenePosition //Desired cutscene start position
|
|
FLOAT fCutsceneHeading //Desired cutscene start heading
|
|
ENDSTRUCT
|
|
|
|
/// PURPOSE: Used for getting input of the analogue sticks.
|
|
STRUCT STICKS_STRUCT
|
|
INT iLeftX
|
|
INT iLeftY
|
|
INT iRightX
|
|
INT iRightY
|
|
ENDSTRUCT
|
|
|
|
STRUCT DOOR_STRUCT
|
|
VECTOR vPosition //Gate/door position
|
|
MODEL_NAMES ModelName //Gate/door model
|
|
BOOL bLocked //Specifies if the gate/door is locked
|
|
BOOL bClosed //Specifies if the gate/door is closed (open ratio i 0.0)
|
|
ENDSTRUCT
|
|
|
|
//|======================================= CONSTANTS =====================================|
|
|
|
|
CONST_INT MAX_MODELS 10
|
|
CONST_INT MAX_ANIMATIONS 8
|
|
|
|
CONST_INT MAX_YOGA_FAILS 3
|
|
CONST_INT IDEAL_MISSION_START_TIME 9
|
|
|
|
TWEAK_INT FLIGHT_TIME_MAX 201000
|
|
|
|
TWEAK_INT iKickOutDelayTime 30000
|
|
TWEAK_FLOAT fShapeTestRadiusFront 0.5
|
|
TWEAK_FLOAT fShapeTestRadiusSide 0.5
|
|
TWEAK_FLOAT fKickOutCameraShake 1.75
|
|
TWEAK_FLOAT fKickOutCameraBlur 0.25
|
|
|
|
VECTOR vShapeTestCapsuleOffsetFront = << 0.0, 7.0, 0.30 >>
|
|
VECTOR vShapeTestCapsuleOffsetSide0 = << -3.0, 6.0, 0.20 >>
|
|
VECTOR vShapeTestCapsuleOffsetSide2 = << -3.0, 2.0, 0.20 >>
|
|
VECTOR vShapeTestCapsuleOffsetSide3 = << -3.0, -2.0, 0.20 >>
|
|
VECTOR vShapetestCapsuleOffsetAbove = << -1.27, 1.95, 4.9 >>
|
|
|
|
VECTOR vFabienWarriorPosition = << -789.529, 187.843, 72.835 >>
|
|
VECTOR vFabienWarriorRotation = << 0.000, 0.000, 130.0 >>
|
|
VECTOR vFabienTrianglePosition = << -789.529, 187.843, 72.840 >>
|
|
VECTOR vFabienTriangleRotation = << 0.000, 0.000, 145.000 >>
|
|
VECTOR vFabienSunsalutationPosition = << -789.229, 187.843, 72.850 >>
|
|
VECTOR vFabienSunsalutationRotation = << 0.000, 0.000, 123.120 >>
|
|
|
|
VECTOR vAmandaWarriorPosition = << -788.830, 185.793, 72.855 >>//72.875 >>
|
|
VECTOR vAmandaWarriorRotation = << -0.000, 0.000, 31.680 >>
|
|
VECTOR vAmandaTrianglePosition = << -788.830, 185.793, 72.840 >>//72.860 >>
|
|
VECTOR vAmandaTriangleRotation = << -0.000, 0.000, 31.680 >>
|
|
VECTOR vAmandaSunsalutationPosition = << -788.979, 185.743, 72.860 >>//72.880 >>
|
|
VECTOR vAmandaSunsalutationRotation = << -0.000, 0.000, 30.000 >>
|
|
|
|
VECTOR vWarriorStartCamPosition = << -782.802368, 187.4389, 73.326614>>
|
|
VECTOR vWarriorEndCamPosition = <<-786.706604,187.146271,72.723785>>
|
|
VECTOR vWarriorStartCamRotation = << -3.540541, 0.000000, 99.799942>>
|
|
VECTOR vWarriorEndCamRotation = <<1.793574,-0.025068,101.152802>>
|
|
FLOAT fWarriorStartCamFOV = 39.3555
|
|
FLOAT fWarriorEndCamFOV = 39.355499
|
|
|
|
VECTOR vTriangleStartCamPosition = <<-786.294434,187.576950,72.849815>>
|
|
VECTOR vTriangleEndCamPosition = <<-786.646545,187.717834,72.843674>>
|
|
VECTOR vTriangleStartCamRotation = <<-1.207426,0.002569,105.266243>>
|
|
VECTOR vTriangleEndCamRotation = <<-1.207426,0.002569,108.284561>>
|
|
FLOAT fTriangleStartCamFOV = 39.355499
|
|
FLOAT fTriangleEndCamFOV = 39.355499
|
|
|
|
VECTOR vSunSalutaionStartCamPosition = <<-786.237061,187.436996,73.012199>>
|
|
VECTOR vSunSalutaionEndCamPosition = <<-786.602051,187.224121,73.010460>>
|
|
VECTOR vSunSalutaionStartCamRotation = <<-0.244137,-0.022206,103.085312>>
|
|
VECTOR vSunSalutaionEndCamRotation = <<-0.244137,-0.022206,101.277870>>
|
|
FLOAT fSunSalutaionStartCamFOV = 39.355499
|
|
FLOAT fSunSalutaionEndCamFOV = 39.355499
|
|
|
|
TWEAK_FLOAT fAnimationForcePhase 0.778
|
|
TWEAK_FLOAT fChimpsCameraShake 1.0
|
|
TWEAK_FLOAT fChimpsCameraBlur 1.0
|
|
TWEAK_FLOAT fKickAnimationTriggerDistance 150.0
|
|
|
|
TWEAK_FLOAT BASE_Z_FORCE_VALUE 50.0
|
|
|
|
VECTOR vForceValue = << 0.0, 150.0, 50.0 >>//<< 0.0, 250.0, 50.0 >> //z = 2.5 - fast descent
|
|
VECTOR vForceOffset = << 0.0, 0.0, 0.0 >>
|
|
|
|
VECTOR vMichaelsHouseCoords = << -819.68, 175.87, 70.61 >>
|
|
VECTOR vJimmysRoomsCoords = << -806.04, 173.59, 75.74 >>
|
|
VECTOR vKitchenCoords = << -801.42, 182.86, 71.61 >>
|
|
|
|
TWEAK_INT iAnimatedCameraInterpTime 3450
|
|
TWEAK_FLOAT fAnimatedCameraStopPhase 0.723
|
|
TWEAK_FLOAT fFallAnimationStopPhase 1.000
|
|
|
|
TWEAK_FLOAT fRelativePitch 5.0 //20.0
|
|
|
|
TWEAK_FLOAT fFocusPushHintFOV 45.5
|
|
TWEAK_FLOAT fFocusPushSideOffset 1.600
|
|
TWEAK_FLOAT fFocusPushVerticalOffset -0.880
|
|
TWEAK_FLOAT fFocusPushFollowDistanceScalar 0.735
|
|
TWEAK_FLOAT fFocusPushBaseOrbitPitchOffset -1.200
|
|
VECTOR vFocusPushHintPosition = << -1175.32, -897.03, 14.05 >>
|
|
|
|
TWEAK_FLOAT iSTART_VOMITING_TIME 0.530
|
|
TWEAK_FLOAT iSTOP_VOMITING_TIME 0.635
|
|
TWEAK_FLOAT iSTART_FP_FLASH_TIME 0.925
|
|
|
|
TEXT_LABEL sLabelOBJ = "FAM5_GT4"
|
|
TEXT_LABEL sLabelMGETIN = "CMN_GENGETINY"
|
|
|
|
//======================================== VARIABLES =====================================|
|
|
|
|
MISSION_TRIGGER_MEANS eMissionTriggerMeans = MISSION_TRIGGER_ON_FOOT
|
|
MISSION_STAGES eMissionStage = MISSION_STAGE_PRE_TIMELAPSE
|
|
MISSION_FAILS eMissionFail = MISSION_FAIL_EMPTY
|
|
MISSION_SFX eMissionSfx = MISSION_SFX_NONE
|
|
|
|
//mission peds
|
|
PED_STRUCT psAmanda
|
|
PED_STRUCT psFabien
|
|
PED_STRUCT psJimmy
|
|
PED_STRUCT psDealer
|
|
|
|
//Michael's car
|
|
VEH_STRUCT vsMichaelsCar
|
|
|
|
//mission objects
|
|
OBJECT_STRUCT osCup
|
|
OBJECT_STRUCT osNote
|
|
OBJECT_STRUCT osCiggy
|
|
OBJECT_STRUCT osBSDoor
|
|
OBJECT_STRUCT osMethBag
|
|
OBJECT_STRUCT osGamepad
|
|
OBJECT_STRUCT osHeadset
|
|
OBJECT_STRUCT osNecklace
|
|
OBJECT_STRUCT osBSDoorDummy
|
|
OBJECT_STRUCT osLeftDoorDummy
|
|
OBJECT_STRUCT osRightDoorDummy
|
|
|
|
YOGASTRUCT sYogaPlayer
|
|
|
|
LOCATES_HEADER_DATA sLocatesData
|
|
CHASE_HINT_CAM_STRUCT sCinematicCamStruct
|
|
VEHICLE_GEN_DATA_STRUCT sVehicleGenDataStruct
|
|
|
|
//progress counters
|
|
INT iStageSetupProgress
|
|
INT iMissionStageProgress
|
|
BOOL bSkipFlag
|
|
BOOL bReplayFlag
|
|
BOOL bLoadingFlag
|
|
BOOL bStageReplayInProgress
|
|
|
|
BOOL bTimelapseTriggered
|
|
BOOL bTimelapseCutsceneSkipped
|
|
|
|
//asset request counters
|
|
INT iModelsRequested
|
|
INT iAnimationsRequested
|
|
|
|
//used for pinning/unpinning interior when stage loading
|
|
VECTOR vInteriorPosition
|
|
|
|
BOOL bJimmysOutfitSet
|
|
BOOL bBuddiesYogaOutfitsSet
|
|
BOOL bJimmyLeftBehindSprinting
|
|
BOOL bPlayerPedScriptTaskInterrupted
|
|
BOOL bDrinkAnimationFinished
|
|
BOOL bPreDrinkConversationFinished
|
|
BOOL bPostDrinkConversationFinished
|
|
BOOL bLookAtActive
|
|
|
|
//LOCATE_STRUCT sEnteredSafeLocate
|
|
|
|
FLOAT fDrunkCameraShake
|
|
FLOAT fDrunkCameraBlur
|
|
|
|
INT iYogaIdleTimer
|
|
INT iYogaPosesCounter
|
|
INT iYogaBreathsCounter
|
|
INT iYogaFailsCounter
|
|
|
|
BOOL bBreatheConversationTriggered
|
|
BOOL bBreatheCompletedConversationTriggered
|
|
BOOL bBreatheFailedConversationTriggered
|
|
BOOL bInhaleConversationTriggered
|
|
BOOL bExhaleConversationTriggered
|
|
BOOL bFailConversationTriggered
|
|
|
|
PTFX_ID ptfxPuke
|
|
|
|
structPedsForConversation Family5Conversation
|
|
INT iConversationProgress
|
|
BOOL bConversationsFinished
|
|
BOOL bInitialConversationFinished
|
|
BOOL bCurrentConversationInterrupted
|
|
TEXT_LABEL_23 CurrentConversationRoot
|
|
TEXT_LABEL_23 CurrentConversationLabel
|
|
|
|
BOOL bStreamTriggered
|
|
BOOL bFlightStreamTriggered
|
|
BOOL bCutsceneTriggeredOnBike
|
|
INT iAnimationProgress
|
|
|
|
//mission music flags
|
|
BOOL bYogaMusicPlaying
|
|
|
|
CAMERA_INDEX ScriptedCamera, UndergroundCamera, AnimatedCamera
|
|
BOOL bCutsceneSkipped
|
|
BOOL bCutsceneAssetsRequested
|
|
BOOL bIntroCutsceneAssetsRequested
|
|
|
|
//time of day variables used for timelapse
|
|
structTimelapse sTimelapse
|
|
|
|
SCENARIO_BLOCKING_INDEX ParkScenarioBlockingIndex
|
|
SCENARIO_BLOCKING_INDEX BurgerShotScenarioBlockingIndex
|
|
|
|
BOOL bAnimationForced
|
|
BOOL bAnimationsSwitched
|
|
BOOL bPlayerRagdolledEarly
|
|
BOOL bCleanupVehiclesForCamera
|
|
BOOL bCleanupVehiclesForCameraAgain
|
|
|
|
BOOL bAnimatedCameraStopped
|
|
|
|
INT iVomitSceneID = -1
|
|
INT iFlyingSceneID = -1
|
|
INT iKickOutSceneID = -1
|
|
////INT iKickOutSceneNewID = -1
|
|
INT iLeadOutSceneID = -1
|
|
INT iHouseEnterSceneID = -1
|
|
INT iLeadOutSceneJimmyID = -1
|
|
|
|
INT iSpeedZone
|
|
INT iKickOutDelayTimer
|
|
|
|
BOOL bCupPassed
|
|
BOOL bLeadInTriggered
|
|
BOOL bLeadInStartCutscene
|
|
BOOL bLeadOutCameraCancelled
|
|
BOOL bIgnoreLeadInFocusPush
|
|
|
|
INT iFailRootPlayerCounter
|
|
INT iFailConversationSpeaker
|
|
|
|
INT iJimmyRagdolledFromPlayerImpact
|
|
BOOL bJimmyRagdolledFromPlayerImpact
|
|
|
|
INT iAmbientSpeechTimer
|
|
|
|
BOOL bBlackoutStagesActive
|
|
|
|
INT iTODSkipHour
|
|
INT iStageTimeHours
|
|
INT iStageTimeMinutes
|
|
INT iStageTimeSeconds
|
|
|
|
INT iDriveReminders
|
|
|
|
BOOL bCollisionDetected
|
|
|
|
BOOL bDoorOpenRatioSwitched
|
|
|
|
INT iLoadSceneTimer
|
|
|
|
INT iJimmyDrunkConversationCounter
|
|
INT iMichaelDrunkConversationCounter
|
|
|
|
FLOAT fForceBaseModifier = 1.0
|
|
FLOAT fCurrentTimeScale = 1.0
|
|
FLOAT fDesiredTimeScale = 1.0
|
|
FLOAT fDesiredTimeScaleSpeed = 0.001
|
|
|
|
INT iBoostTime
|
|
INT iBoostTimer
|
|
INT iDiveTimer
|
|
INT iDiveStartTime
|
|
|
|
INT iVFXProgress
|
|
INT iStreamPlayTime
|
|
INT iTimeScaleChangeTimer
|
|
|
|
BOOL bFirstPersonFlashPlayed
|
|
|
|
//|========================================= ARRAYS ======================================|
|
|
|
|
//text printing
|
|
INT iTriggeredTextHashes[30]
|
|
INT iNumTextHashesStored
|
|
|
|
BOOL FailFlags[MAX_MISSION_FAILS]
|
|
|
|
//asset arrays
|
|
MODEL_NAMES MissionModels[MAX_MODELS]
|
|
STRING MissionAnimations[MAX_ANIMATIONS]
|
|
|
|
VEH_STRUCT vsParkedVehicles[1]
|
|
|
|
//Three yoga mats for yoga section and Burger Shot drink cup, broom
|
|
OBJECT_STRUCT osYogaMats[3]
|
|
|
|
//Sound effects
|
|
SFX_STRUCT ssSounds[6]
|
|
|
|
//safe car mocap cutscene locates
|
|
//LOCATE_STRUCT sSafeLocates[2]
|
|
|
|
LOCATION_STRUCT MissionPosition
|
|
|
|
//|========================= MISCELLANEOUS PROCEDURES & FUNCTIONS ========================|
|
|
|
|
PROC RESET_MISSION_FLAGS()
|
|
|
|
//reset setup progress to 1, so that iSetupProgress = 0 only runs once, on initial mission load.
|
|
iStageSetupProgress = 1
|
|
|
|
iMissionStageProgress = 0
|
|
|
|
iConversationProgress = 0
|
|
|
|
iYogaIdleTimer = 0
|
|
iYogaPosesCounter = 0
|
|
iYogaBreathsCounter = 0
|
|
iYogaFailsCounter = 0
|
|
|
|
psAmanda.iProgress = 0
|
|
psAmanda.iLookAtTime = 0
|
|
psAmanda.iIntervalTime = 0
|
|
psAmanda.bLookingAtTarget = FALSE
|
|
|
|
psFabien.iProgress = 0
|
|
psFabien.iLookAtTime = 0
|
|
psFabien.iIntervalTime = 0
|
|
psFabien.bLookingAtTarget = FALSE
|
|
|
|
psJimmy.iProgress = 0
|
|
psDealer.iProgress = 0
|
|
|
|
bConversationsFinished = FALSE
|
|
bInitialConversationFinished = FALSE
|
|
bCurrentConversationInterrupted = FALSE
|
|
|
|
bCutsceneSkipped = FALSE
|
|
bCutsceneAssetsRequested = FALSE
|
|
|
|
bBreatheConversationTriggered = FALSE
|
|
bBreatheCompletedConversationTriggered = FALSE
|
|
bBreatheFailedConversationTriggered = FALSE
|
|
bExhaleConversationTriggered = FALSE
|
|
bInhaleConversationTriggered = FALSE
|
|
bFailConversationTriggered = FALSE
|
|
|
|
bJimmyLeftBehindSprinting = FALSE
|
|
|
|
bPlayerPedScriptTaskInterrupted = FALSE
|
|
|
|
bCutsceneTriggeredOnBike = FALSE
|
|
|
|
bDrinkAnimationFinished = FALSE
|
|
bPreDrinkConversationFinished = FALSE
|
|
bPostDrinkConversationFinished = FALSE
|
|
|
|
bLookAtActive = FALSE
|
|
|
|
iAnimationProgress = 0
|
|
iKickOutDelayTimer = 0
|
|
|
|
bStageReplayInProgress = FALSE
|
|
|
|
iHouseEnterSceneID = -1
|
|
iKickOutSceneID = -1
|
|
iLeadOutSceneID = -1
|
|
bCupPassed = FALSE
|
|
bLeadInTriggered = FALSE
|
|
bLeadInStartCutscene = FALSE
|
|
bLeadOutCameraCancelled = FALSE
|
|
bIgnoreLeadInFocusPush = FALSE
|
|
|
|
iFailRootPlayerCounter = 0
|
|
iFailConversationSpeaker = 0
|
|
|
|
iJimmyRagdolledFromPlayerImpact = 0
|
|
bJimmyRagdolledFromPlayerImpact = FALSE
|
|
|
|
iAmbientSpeechTimer = 0
|
|
|
|
iDriveReminders = 0
|
|
|
|
sLabelMGETIN = "CMN_GENGETINY"
|
|
|
|
bCollisionDetected = FALSE
|
|
|
|
bDoorOpenRatioSwitched = FALSE
|
|
|
|
iLoadSceneTimer = 0
|
|
iJimmyDrunkConversationCounter = 0
|
|
iMichaelDrunkConversationCounter= 0
|
|
|
|
iVFXProgress = 0
|
|
iStreamPlayTime = 0
|
|
iTimeScaleChangeTimer = 0
|
|
bAnimatedCameraStopped = FALSE
|
|
bFlightStreamTriggered = FALSE
|
|
|
|
iBoostTime = 0
|
|
iBoostTimer = 0
|
|
iDiveTimer = 0
|
|
iDiveStartTime = 0
|
|
|
|
CurrentConversationRoot = ""
|
|
CurrentConversationLabel = ""
|
|
|
|
bFirstPersonFlashPlayed = FALSE
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Mission flags and progress counters are reset.")
|
|
#ENDIF
|
|
|
|
ENDPROC
|
|
|
|
FUNC MISSION_STAGES GET_NEXT_MISSION_STAGE_FOR_SHITSKIP(MISSION_STAGES eStage)
|
|
|
|
SWITCH eStage //handle special cases
|
|
|
|
CASE MISSION_STAGE_YOGA_WARRIOR
|
|
CASE MISSION_STAGE_YOGA_TRIANGLE
|
|
CASE MISSION_STAGE_YOGA_SUNSALUTATION
|
|
RETURN MISSION_STAGE_CUTSCENE_POOL //when shit skipping past any yoga stage, always go to end yoga cutscene
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_CUTSCENE_END_1
|
|
RETURN MISSION_STAGE_CUTSCENE_END_1 //return last stage for last mission stage
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
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 GO_TO_PED_STATE(PED_STRUCT &psPed, PED_STATES eNewPedState)
|
|
|
|
psPed.bHasTask = FALSE
|
|
psPed.eState = eNewPedState
|
|
|
|
ENDPROC
|
|
|
|
FUNC SCENARIO_BLOCKING_INDEX CREATE_SCENARIO_BLOCKING_AREA(VECTOR vPosition, VECTOR vSize)
|
|
RETURN ADD_SCENARIO_BLOCKING_AREA(<< vPosition.x - vSize.x, vPosition.y - vSize.y, vPosition.z - vSize.z >>,
|
|
<< vPosition.x + vSize.x, vPosition.y + vSize.y, vPosition.z + vSize.z >>)
|
|
ENDFUNC
|
|
|
|
//PROC INITIALISE_SAFE_LOCATES()
|
|
//
|
|
// sSafeLocates[0].vPosition1 = <<-857.708252,234.978500,71.601776>>
|
|
// sSafeLocates[0].vPosition2 = <<-862.866028,199.273117,78.389381>>
|
|
// sSafeLocates[0].fWidth = 32.0
|
|
// sSafeLocates[0].vCutscenePosition = <<-854.6779, 70.3448, 51.6033>>
|
|
// sSafeLocates[0].fCutsceneHeading = 8.4425
|
|
//
|
|
// sSafeLocates[1].vPosition1 = <<-877.420715,135.745331,55.439068>>
|
|
// sSafeLocates[1].vPosition2 = <<-848.451721,129.641541,65.575523>>
|
|
// sSafeLocates[1].fWidth = 16.0
|
|
// sSafeLocates[1].vCutscenePosition = <<-854.6779, 70.3448, 51.6033>>
|
|
// sSafeLocates[1].fCutsceneHeading = 8.4425
|
|
//
|
|
//ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Checks if Michael should have a vest on for the Monkey section of the mission
|
|
/// RETURNS:
|
|
/// TRUE if he should have a vest. FALSE otherwise
|
|
FUNC BOOL SHOULD_MICHAEL_HAVE_VEST()
|
|
PED_COMP_NAME_ENUM eTorso
|
|
eTorso = GET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_TORSO)
|
|
|
|
IF eTorso = TORSO_P0_BARE_CHEST
|
|
OR(eTorso >= TORSO_P0_OPEN_SHIRT AND eTorso <= TORSO_P0_OPEN_SHIRT_15)
|
|
RETURN FALSE
|
|
ENDIF
|
|
|
|
RETURN TRUE // michael should have vest
|
|
ENDFUNC
|
|
|
|
/// 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 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 IS_THIS_CONVERSATION_PLAYING(STRING sRoot)
|
|
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
TEXT_LABEL txtRoot = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_ROOT()
|
|
|
|
IF ARE_STRINGS_EQUAL(sRoot, txtRoot)
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
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
|
|
|
|
PROC PRINT_GOD_TEXT_ADVANCED(STRING sLabel, INT iDuration = DEFAULT_GOD_TEXT_TIME, BOOL bOnce = TRUE)
|
|
IF NOT HAS_LABEL_BEEN_TRIGGERED(sLabel)
|
|
PRINT(sLabel, iDuration, 1)
|
|
SET_LABEL_AS_TRIGGERED(sLabel, bOnce)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Printing god text advanced ", sLabel, ".")
|
|
#ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
FUNC BOOL HAS_TIME_PASSED(INT iTimeAmount, INT iTimer)
|
|
|
|
INT iCurrentTime
|
|
INT iTimeDifference
|
|
|
|
iCurrentTime = GET_GAME_TIMER()
|
|
|
|
iTimeDifference = iCurrentTime - iTimeAmount
|
|
|
|
IF iTimeDifference > iTimer
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
|
|
ENDFUNC
|
|
|
|
PROC CLEANUP_VEHICLE_WITH_PEDS_NEAR_POINT(VECTOR vPoint, FLOAT fRadius)
|
|
|
|
IF IS_ANY_VEHICLE_NEAR_POINT(vPoint, fRadius)
|
|
|
|
VEHICLE_INDEX ClosestVehicleIndex
|
|
|
|
ClosestVehicleIndex = GET_CLOSEST_VEHICLE(vPoint, fRadius, DUMMY_MODEL_FOR_SCRIPT,
|
|
VEHICLE_SEARCH_FLAG_ALLOW_VEHICLE_OCCUPANTS_TO_BE_PERFORMING_A_NON_DEFAULT_TASK |
|
|
VEHICLE_SEARCH_FLAG_ALLOW_LAW_ENFORCER_VEHICLES_WITH_WANTED_LEVEL |
|
|
VEHICLE_SEARCH_FLAG_RETURN_LAW_ENFORCER_VEHICLES |
|
|
VEHICLE_SEARCH_FLAG_RETURN_RANDOM_VEHICLES)
|
|
|
|
IF DOES_ENTITY_EXIST(ClosestVehicleIndex)
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Found vehicle with model ", GET_MODEL_NAME_FOR_DEBUG(GET_ENTITY_MODEL(ClosestVehicleIndex)), " near point ", vPoint, " and deleted it.")
|
|
#ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
CLEAR_AREA_OF_PEDS(vPoint, fRadius)
|
|
CLEAR_AREA_OF_VEHICLES(vPoint, fRadius)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
DRAW_DEBUG_SPHERE(vPoint, fRadius, 255, 0, 0, 128)
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Calling CLEAR_AREA_OF_PEDS() for point ", vPoint, ".")
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Calling CLEAR_AREA_OF_VEHICLES() for point ", vPoint, ".")
|
|
#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)
|
|
|
|
IF IS_ENTITY_DEAD(ped.PedIndex)
|
|
REMOVE_PED_DEFENSIVE_AREA(ped.PedIndex)
|
|
ENDIF
|
|
|
|
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 IS_PED_INJURED(ped.PedIndex)
|
|
OR NOT IS_PED_INJURED(ped.PedIndex)
|
|
|
|
IF IS_ENTITY_DEAD(ped.PedIndex)
|
|
OR NOT IS_ENTITY_DEAD(ped.PedIndex)
|
|
REMOVE_PED_DEFENSIVE_AREA(ped.PedIndex)
|
|
ENDIF
|
|
|
|
DELETE_PED(ped.PedIndex)
|
|
|
|
IF DOES_BLIP_EXIST(ped.BlipIndex)
|
|
REMOVE_BLIP(ped.BlipIndex)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ped.iTimer = 0
|
|
ped.iProgress = 0
|
|
ped.bHasTask = FALSE
|
|
ped.eState = PED_STATE_IDLE
|
|
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC CLEANUP_PED_GROUP(PED_STRUCT &array[], BOOL bDelete = FALSE, BOOL bDeathOnly = TRUE, BOOL bKeepTask = TRUE)
|
|
|
|
INT i = 0
|
|
|
|
FOR i = 0 TO ( COUNT_OF(array) - 1 )
|
|
CLEANUP_PED(array[i], bDelete, bDeathOnly, bKeepTask)
|
|
ENDFOR
|
|
|
|
ENDPROC
|
|
|
|
PROC CLEANUP_MISSION_OBJECT(OBJECT_STRUCT &osObject, BOOL bDelete = FALSE)
|
|
|
|
IF DOES_ENTITY_EXIST(osObject.ObjectIndex)
|
|
|
|
IF IS_ENTITY_ATTACHED(osObject.ObjectIndex)
|
|
DETACH_ENTITY(osObject.ObjectIndex)
|
|
ENDIF
|
|
|
|
IF ( bDelete = TRUE )
|
|
DELETE_OBJECT(osObject.ObjectIndex)
|
|
ELSE
|
|
SET_OBJECT_AS_NO_LONGER_NEEDED(osObject.ObjectIndex)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC CLEANUP_MISSION_OBJECT_GROUP(OBJECT_STRUCT &osArray[], BOOL bDelete = FALSE)
|
|
|
|
INT i = 0
|
|
|
|
FOR i = 0 TO ( COUNT_OF(osArray) - 1 )
|
|
|
|
CLEANUP_MISSION_OBJECT(osArray[i], bDelete)
|
|
|
|
ENDFOR
|
|
|
|
ENDPROC
|
|
|
|
PROC UPDATE_DRUGS_AUDIO_SCENE()
|
|
IF IS_AUDIO_SCENE_ACTIVE("FAMILY_5_YOGA_ON_DRUGS")
|
|
//REPLAY_PREVENT_RECORDING_THIS_FRAME() //fix for B*1845251 - don't allow recording any of the drug vfx scenes, which is when this scene is active
|
|
SET_AUDIO_SPECIAL_EFFECT_MODE(AUDIO_SPECIAL_EFFECT_MODE_STONED)
|
|
SET_AUDIO_SCENE_VARIABLE("FAMILY_5_YOGA_ON_DRUGS", "DrugsEffect", (SIN(((TO_FLOAT(GET_GAME_TIMER())/1000)*45)%360))*0.5+0.5)
|
|
SET_AUDIO_SCENE_VARIABLE("FAMILY_5_YOGA_ON_DRUGS", "DrugsEffectSpeech", 0.5 * (SIN(((TO_FLOAT(GET_GAME_TIMER())/1000)*45)%360))*0.5+0.5)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC RUN_MISSION_SFX_LOADING(MISSION_SFX &eSfx)
|
|
|
|
SWITCH eSfx
|
|
|
|
CASE MISSION_SFX_CHIMPS
|
|
IF REQUEST_SCRIPT_AUDIO_BANK("FAM5_YOGA_CHIMPS")
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Loaded audio bank FAM5_YOGA_CHIMPS")
|
|
#ENDIF
|
|
eSfx = MISSION_SFX_NONE
|
|
ELSE
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Loading audio bank FAM5_YOGA_CHIMPS")
|
|
#ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE MISSION_SFX_ALIENS
|
|
IF REQUEST_SCRIPT_AUDIO_BANK("FAM5_YOGA_ALIENS")
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Loaded audio bank FAM5_YOGA_ALIENS")
|
|
#ENDIF
|
|
eSfx = MISSION_SFX_NONE
|
|
ELSE
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Loading audio bank FAM5_YOGA_ALIENS")
|
|
#ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE MISSION_SFX_HEARTBEAT
|
|
CASE MISSION_SFX_DRINK
|
|
IF REQUEST_SCRIPT_AUDIO_BANK("FAM5_YOGA_DRUGS_01")
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Loaded audio bank FAM5_YOGA_DRUGS_01")
|
|
#ENDIF
|
|
eSfx = MISSION_SFX_NONE
|
|
ELSE
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Loading audio bank FAM5_YOGA_DRUGS_01")
|
|
#ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE MISSION_SFX_VOMIT
|
|
IF REQUEST_SCRIPT_AUDIO_BANK("TAXI_VOMIT")
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Loaded audio bank TAXI_VOMIT")
|
|
#ENDIF
|
|
eSfx = MISSION_SFX_NONE
|
|
ELSE
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Loading audio bank TAXI_VOMIT")
|
|
#ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE MISSION_SFX_TAP
|
|
IF REQUEST_SCRIPT_AUDIO_BANK("FAM5_WASH_FACE")
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Loaded audio bank FAM5_WASH_FACE")
|
|
#ENDIF
|
|
eSfx = MISSION_SFX_NONE
|
|
ELSE
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Loading audio bank FAM5_WASH_FACE")
|
|
#ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
ENDPROC
|
|
|
|
PROC LOAD_MISSION_SFX(MISSION_SFX eSfx)
|
|
|
|
eMissionSfx = eSfx
|
|
|
|
ENDPROC
|
|
|
|
PROC RELEASE_MISSION_SFX_AUDIO_BANK(MISSION_SFX eSfx)
|
|
|
|
SWITCH eSfx
|
|
|
|
CASE MISSION_SFX_ALIENS
|
|
RELEASE_NAMED_SCRIPT_AUDIO_BANK("FAM5_YOGA_ALIENS")
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Releasing audio bank FAM5_YOGA_ALIENS.")
|
|
#ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE MISSION_SFX_CHIMPS
|
|
RELEASE_NAMED_SCRIPT_AUDIO_BANK("FAM5_YOGA_CHIMPS")
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Releasing audio bank FAM5_YOGA_CHIMPS.")
|
|
#ENDIF
|
|
BREAK
|
|
|
|
CASE MISSION_SFX_DRINK
|
|
CASE MISSION_SFX_HEARTBEAT
|
|
RELEASE_NAMED_SCRIPT_AUDIO_BANK("FAM5_YOGA_DRUGS_01")
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Releasing audio bank FAM5_YOGA_DRUGS_01.")
|
|
#ENDIF
|
|
BREAK
|
|
|
|
CASE MISSION_SFX_VOMIT
|
|
RELEASE_NAMED_SCRIPT_AUDIO_BANK("TAXI_VOMIT")
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Releasing audio bank TAXI_VOMIT.")
|
|
#ENDIF
|
|
BREAK
|
|
|
|
CASE MISSION_SFX_TAP
|
|
RELEASE_NAMED_SCRIPT_AUDIO_BANK("FAM5_WASH_FACE")
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Releasing audio bank FAM5_WASH_FACE.")
|
|
#ENDIF
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
ENDPROC
|
|
|
|
PROC PLAY_MISSION_SFX(MISSION_SFX eSfx)
|
|
|
|
SWITCH eSfx
|
|
|
|
CASE MISSION_SFX_CHIMPS
|
|
|
|
IF ssSounds[1].bTriggered = FALSE
|
|
|
|
IF ssSounds[1].iSoundID = -1
|
|
ssSounds[1].iSoundID = GET_SOUND_ID()
|
|
ENDIF
|
|
|
|
PLAY_SOUND_FRONTEND(ssSounds[1].iSoundID, ssSounds[1].sSoundName, "FAMILY_5_SOUNDS")
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Playing sfx ", ssSounds[1].sSoundName, ".")
|
|
#ENDIF
|
|
|
|
ssSounds[1].bTriggered = TRUE
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE MISSION_SFX_ALIENS
|
|
IF ssSounds[0].bTriggered = FALSE
|
|
|
|
IF ssSounds[0].iSoundID = -1
|
|
ssSounds[0].iSoundID = GET_SOUND_ID()
|
|
ENDIF
|
|
|
|
PLAY_SOUND_FRONTEND(ssSounds[0].iSoundID, ssSounds[0].sSoundName, "FAMILY_5_SOUNDS")
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Playing sfx ", ssSounds[0].sSoundName, ".")
|
|
#ENDIF
|
|
|
|
ssSounds[0].bTriggered = TRUE
|
|
|
|
ENDIF
|
|
BREAK
|
|
|
|
|
|
CASE MISSION_SFX_HEARTBEAT
|
|
|
|
IF ssSounds[2].bTriggered = FALSE
|
|
|
|
IF ssSounds[2].iSoundID = -1
|
|
ssSounds[2].iSoundID = GET_SOUND_ID()
|
|
ENDIF
|
|
|
|
PLAY_SOUND_FRONTEND(ssSounds[2].iSoundID, ssSounds[2].sSoundName, "FAMILY_5_SOUNDS")
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Playing sfx ", ssSounds[2].sSoundName, ".")
|
|
#ENDIF
|
|
|
|
ssSounds[2].bTriggered = TRUE
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE MISSION_SFX_DRINK
|
|
|
|
IF ssSounds[3].bTriggered = FALSE
|
|
|
|
PLAY_SOUND_FROM_ENTITY(ssSounds[3].iSoundID, ssSounds[3].sSoundName, PLAYER_PED_ID(), "FAMILY_5_SOUNDS")
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Playing sfx ", ssSounds[3].sSoundName, ".")
|
|
#ENDIF
|
|
|
|
ssSounds[3].bTriggered = TRUE
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE MISSION_SFX_VOMIT
|
|
|
|
IF ssSounds[4].bTriggered = FALSE
|
|
|
|
IF ssSounds[4].iSoundID = -1
|
|
ssSounds[4].iSoundID = GET_SOUND_ID()
|
|
ENDIF
|
|
|
|
PLAY_SOUND_FROM_ENTITY(ssSounds[4].iSoundID, ssSounds[4].sSoundName, PLAYER_PED_ID(), "FAMILY_5_SOUNDS")
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Playing sfx ", ssSounds[4].sSoundName, ".")
|
|
#ENDIF
|
|
|
|
ssSounds[4].bTriggered = TRUE
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE MISSION_SFX_TAP
|
|
|
|
IF ssSounds[5].bTriggered = FALSE
|
|
|
|
IF ssSounds[5].iSoundID = -1
|
|
ssSounds[5].iSoundID = GET_SOUND_ID()
|
|
ENDIF
|
|
|
|
PLAY_SOUND_FROM_COORD(ssSounds[5].iSoundID, ssSounds[5].sSoundName, << -804.52, 169.05, 76.65 >>, "FAMILY_5_SOUNDS")
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Playing sfx ", ssSounds[5].sSoundName, ".")
|
|
#ENDIF
|
|
|
|
ssSounds[5].bTriggered = TRUE
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
ENDPROC
|
|
|
|
PROC STOP_MISSION_SFX(MISSION_SFX eSfx)
|
|
|
|
SWITCH eSfx
|
|
|
|
CASE MISSION_SFX_CHIMPS
|
|
|
|
IF (ssSounds[1].bTriggered = TRUE)
|
|
|
|
STOP_SOUND(ssSounds[1].iSoundID)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Stopping sfx ", ssSounds[1].sSoundName, ".")
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
|
|
CASE MISSION_SFX_ALIENS
|
|
|
|
IF (ssSounds[0].bTriggered = TRUE)
|
|
|
|
STOP_SOUND(ssSounds[0].iSoundID)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Stopping sfx ", ssSounds[0].sSoundName, ".")
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE MISSION_SFX_HEARTBEAT
|
|
|
|
IF (ssSounds[2].bTriggered = TRUE)
|
|
|
|
STOP_SOUND(ssSounds[2].iSoundID)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Stopping sfx ", ssSounds[2].sSoundName, ".")
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE MISSION_SFX_VOMIT
|
|
|
|
IF (ssSounds[4].bTriggered = TRUE)
|
|
|
|
STOP_SOUND(ssSounds[4].iSoundID)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Stopping sfx ", ssSounds[4].sSoundName, ".")
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE MISSION_SFX_TAP
|
|
|
|
IF (ssSounds[5].bTriggered = TRUE)
|
|
|
|
STOP_SOUND(ssSounds[5].iSoundID)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Stopping sfx ", ssSounds[5].sSoundName, ".")
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
ENDPROC
|
|
|
|
PROC RESET_ALL_SFX_FLAGS(SFX_STRUCT &ssSFXArray[])
|
|
|
|
INT i = 0
|
|
|
|
FOR i = 0 TO COUNT_OF(ssSFXArray) - 1
|
|
|
|
ssSFXArray[i].bTriggered = FALSE
|
|
|
|
ENDFOR
|
|
|
|
ENDPROC
|
|
|
|
PROC RELEASE_SFX_SOUND_IDS()
|
|
|
|
INT i = 0
|
|
|
|
FOR i = 0 TO COUNT_OF(ssSounds) - 1
|
|
IF (ssSounds[i].iSoundID <> -1)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Releasing sound id: ", ssSounds[i].iSoundID, " for sound index: ", i)
|
|
#ENDIF
|
|
|
|
RELEASE_SOUND_ID(ssSounds[i].iSoundID)
|
|
|
|
ENDIF
|
|
ENDFOR
|
|
|
|
ENDPROC
|
|
|
|
FUNC BOOL IS_SHAPE_TEST_CAPSULE_CLEAR(VECTOR vStartPosition, VECTOR vCapsulePosition, FLOAT fTestRadius #IF IS_DEBUG_BUILD, STRING sName #ENDIF)
|
|
|
|
INT iHitResults
|
|
VECTOR vReturnPosition
|
|
VECTOR vReturnNormal
|
|
ENTITY_INDEX hitEntity
|
|
|
|
SHAPETEST_INDEX ShapeTestCapsuleIndex = START_SHAPE_TEST_CAPSULE(vStartPosition, vCapsulePosition, fTestRadius, SCRIPT_INCLUDE_MOVER | SCRIPT_INCLUDE_OBJECT | SCRIPT_INCLUDE_VEHICLE, PLAYER_PED_ID())
|
|
|
|
IF GET_SHAPE_TEST_RESULT(ShapeTestCapsuleIndex, iHitResults, vReturnPosition, vReturnNormal, hitEntity) != SHAPETEST_STATUS_RESULTS_READY
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Shape test ", sName , " results not ready.")
|
|
#ENDIF
|
|
ENDIF
|
|
|
|
|
|
IF ( iHitResults != 0 )
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Shape test ", sName , " capsule hitting something.")
|
|
DRAW_DEBUG_SPHERE(vCapsulePosition, fTestRadius, 255, 0, 0, 64)
|
|
DRAW_DEBUG_TEXT_ABOVE_COORDS(vCapsulePosition, sName, 0.0)
|
|
#ENDIF
|
|
|
|
RETURN FALSE
|
|
|
|
ELSE
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
DRAW_DEBUG_SPHERE(vCapsulePosition, fTestRadius, 0, 255, 0, 64)
|
|
DRAW_DEBUG_TEXT_ABOVE_COORDS(vCapsulePosition, sName, 0.0)
|
|
#ENDIF
|
|
|
|
RETURN TRUE
|
|
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
|
|
ENDFUNC
|
|
|
|
FUNC BOOL IS_SHAPE_TEST_CAPSULE_CLEAR_FOR_ANIMATION(VEHICLE_INDEX VehicleIndex, VECTOR vRoadNodePosition, INT iRoadLanes, FLOAT fAnimationPhase, FLOAT fZOffset, FLOAT fZOffsetFromRoadNode)
|
|
|
|
|
|
IF DOES_ENTITY_EXIST(VehicleIndex)
|
|
IF IS_VEHICLE_DRIVEABLE(VehicleIndex)
|
|
|
|
IF HAS_ANIM_DICT_LOADED("missfam5mcs_6")
|
|
|
|
VECTOR vVehiclePosition, vVehicleRotation, vAnimInitialPosition, vShapeTestPosition
|
|
|
|
VECTOR vAnimInitialPositionFromRoadNode, vShapeTestPositionFromRoadNode
|
|
|
|
vVehiclePosition = GET_ENTITY_COORDS(VehicleIndex)
|
|
vVehicleRotation = GET_ENTITY_ROTATION(VehicleIndex)
|
|
|
|
vAnimInitialPosition = GET_ANIM_INITIAL_OFFSET_POSITION("missfam5mcs_6", "push_michael_out_player0",
|
|
vVehiclePosition, vVehicleRotation, fAnimationPhase)
|
|
|
|
vShapeTestPosition = << vAnimInitialPosition.x, vAnimInitialPosition.y, vAnimInitialPosition.z + fZOffset >>
|
|
|
|
|
|
vAnimInitialPositionFromRoadNode = GET_ANIM_INITIAL_OFFSET_POSITION("missfam5mcs_6", "push_michael_out_player0",
|
|
<< vRoadNodePosition.x, vRoadNodePosition.y, vVehiclePosition.z >>,
|
|
vVehicleRotation, fAnimationPhase)
|
|
|
|
vShapeTestPositionFromRoadNode = << vAnimInitialPositionFromRoadNode.x, vAnimInitialPositionFromRoadNode.y, vAnimInitialPositionFromRoadNode.z + fZOffsetFromRoadNode >>
|
|
|
|
IF ( iRoadLanes = 1 )
|
|
|
|
IF IS_SHAPE_TEST_CAPSULE_CLEAR(vAnimInitialPosition, vShapeTestPosition, 0.5 #IF IS_DEBUG_BUILD, "ANIM" #ENDIF)
|
|
AND IS_SHAPE_TEST_CAPSULE_CLEAR(vAnimInitialPositionFromRoadNode, vShapeTestPositionFromRoadNode, 0.65 #IF IS_DEBUG_BUILD, "ANIM FROM ROADNODE" #ENDIF)
|
|
|
|
RETURN TRUE
|
|
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
IF IS_SHAPE_TEST_CAPSULE_CLEAR(vAnimInitialPosition, vShapeTestPosition, 0.5 #IF IS_DEBUG_BUILD, "ANIM" #ENDIF)
|
|
|
|
RETURN TRUE
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
|
|
ENDFUNC
|
|
|
|
FUNC BOOL ARE_PEDS_IN_VEHICLE_AT_SAFE_POSITION_FOR_INGAME_CUTSCENE(PED_INDEX PedIndex1, PED_INDEX PedIndex2, VEHICLE_INDEX VehicleIndex)
|
|
|
|
IF DOES_ENTITY_EXIST(PedIndex1)
|
|
AND DOES_ENTITY_EXIST(PedIndex2)
|
|
AND DOES_ENTITY_EXIST(VehicleIndex)
|
|
IF NOT IS_ENTITY_DEAD(PedIndex1)
|
|
AND NOT IS_ENTITY_DEAD(PedIndex2)
|
|
AND IS_VEHICLE_DRIVEABLE(VehicleIndex)
|
|
IF IS_PED_SITTING_IN_VEHICLE(PedIndex1, VehicleIndex)
|
|
AND IS_PED_SITTING_IN_VEHICLE(PedIndex2, VehicleIndex)
|
|
|
|
IF IS_VEHICLE_ON_ALL_WHEELS(VehicleIndex)
|
|
AND NOT IS_ENTITY_ON_FIRE(VehicleIndex)
|
|
AND NOT IS_VEHICLE_STOPPED(VehicleIndex)
|
|
|
|
INT iTotalLanes
|
|
FLOAT fHeading
|
|
VECTOR vVehiclePosition
|
|
VECTOR vClosestNodeToVehicle
|
|
VECTOR vTestCoordsFront
|
|
VECTOR vTestCoordsSide0
|
|
VECTOR vTestCoordsSide2
|
|
VECTOR vTestCoordsSide3
|
|
VECTOR vTestCoordsAbove
|
|
|
|
vVehiclePosition = GET_ENTITY_COORDS(VehicleIndex)
|
|
|
|
IF GET_NTH_CLOSEST_VEHICLE_NODE_WITH_HEADING(vVehiclePosition, 1, vClosestNodeToVehicle, fHeading, iTotalLanes, NF_NONE)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
TEXT_LABEL_63 Label = "LANES: "
|
|
Label += iTotalLanes
|
|
DRAW_DEBUG_TEXT_ABOVE_ENTITY(VehicleIndex, Label, 1.25, 0, 255, 0)
|
|
DRAW_DEBUG_SPHERE(vClosestNodeToVehicle, 0.25, 0, 255, 255)
|
|
#ENDIF
|
|
|
|
IF ( GET_DISTANCE_BETWEEN_COORDS(vVehiclePosition, vClosestNodeToVehicle) < 4.5 * iTotalLanes )
|
|
|
|
vTestCoordsFront = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(VehicleIndex, vShapeTestCapsuleOffsetFront)
|
|
vTestCoordsSide0 = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(VehicleIndex, vShapeTestCapsuleOffsetSide0)
|
|
vTestCoordsSide2 = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(VehicleIndex, vShapeTestCapsuleOffsetSide2)
|
|
vTestCoordsSide3 = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(VehicleIndex, vShapeTestCapsuleOffsetSide3)
|
|
vTestCoordsAbove = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(VehicleIndex, vShapetestCapsuleOffsetAbove)
|
|
|
|
IF IS_SHAPE_TEST_CAPSULE_CLEAR(vVehiclePosition, vTestCoordsFront, fShapeTestRadiusFront #IF IS_DEBUG_BUILD, "FRONT" #ENDIF)
|
|
AND IS_SHAPE_TEST_CAPSULE_CLEAR(vVehiclePosition, vTestCoordsSide0, fShapeTestRadiusSide #IF IS_DEBUG_BUILD, "SIDE0" #ENDIF)
|
|
AND IS_SHAPE_TEST_CAPSULE_CLEAR(vVehiclePosition, vTestCoordsSide2, fShapeTestRadiusSide #IF IS_DEBUG_BUILD, "SIDE2" #ENDIF)
|
|
AND IS_SHAPE_TEST_CAPSULE_CLEAR(vVehiclePosition, vTestCoordsSide3, fShapeTestRadiusSide #IF IS_DEBUG_BUILD, "SIDE3" #ENDIF)
|
|
AND IS_SHAPE_TEST_CAPSULE_CLEAR(vVehiclePosition, vTestCoordsAbove, fShapeTestRadiusSide #IF IS_DEBUG_BUILD, "ABOVE" #ENDIF)
|
|
AND IS_SHAPE_TEST_CAPSULE_CLEAR_FOR_ANIMATION(VehicleIndex, vClosestNodeToVehicle, iTotalLanes, fAnimationForcePhase, -0.40, -0.50)
|
|
|
|
IF IS_ENTRY_POINT_FOR_SEAT_CLEAR(PedIndex1, VehicleIndex, VS_DRIVER, TRUE, TRUE)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
DRAW_DEBUG_TEXT_ABOVE_ENTITY(VehicleIndex, "SAFE TO PLAY", 2.0, 0, 255, 0)
|
|
#ENDIF
|
|
|
|
RETURN TRUE
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
|
|
ENDFUNC
|
|
|
|
//|======================= END MISCELLANEOUS PROCEDURES & FUNCTIONS ======================|
|
|
|
|
//|======================= DEBUG VARIABLES, PROCEDURES & FUNCTIONS =======================|
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
|
|
//mission skip menu variables
|
|
MissionStageMenuTextStruct SkipMenu[20]
|
|
INT iReturnStage
|
|
BOOL bStageResetFlag
|
|
|
|
//debug widgets variables
|
|
WIDGET_GROUP_ID Family5Widgets
|
|
BOOL bPositionMats
|
|
BOOL bPositionCup
|
|
BOOL bCutsceneToggle
|
|
BOOL bStartTimerToggle
|
|
BOOL bResetGameplayHint
|
|
BOOL bDrawDebugLinesAndSpheres
|
|
|
|
/// 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_TIMELAPSE
|
|
RETURN "MISSION_STAGE_PRE_TIMELAPSE"
|
|
BREAK
|
|
CASE MISSION_STAGE_TIMELAPSE
|
|
RETURN "MISSION_STAGE_TIMELAPSE"
|
|
BREAK
|
|
CASE MISSION_STAGE_CUTSCENE_INTRO
|
|
RETURN "MISSION_STAGE_CUTSCENE_INTRO"
|
|
BREAK
|
|
CASE MISSION_STAGE_YOGA_WARRIOR
|
|
RETURN "MISSION_STAGE_YOGA_WARRIOR"
|
|
BREAK
|
|
CASE MISSION_STAGE_CUTSCENE_TRIANGLE
|
|
RETURN "MISSION_STAGE_CUTSCENE_TRIANGLE"
|
|
BREAK
|
|
CASE MISSION_STAGE_YOGA_TRIANGLE
|
|
RETURN "MISSION_STAGE_YOGA_TRIANGLE"
|
|
BREAK
|
|
CASE MISSION_STAGE_CUTSCENE_SUNSALUTATION
|
|
RETURN "MISSION_STAGE_CUTSCENE_SUNSALUTATION"
|
|
BREAK
|
|
CASE MISSION_STAGE_YOGA_SUNSALUTATION
|
|
RETURN "MISSION_STAGE_YOGA_SUNSALUTATION"
|
|
BREAK
|
|
CASE MISSION_STAGE_CUTSCENE_POOL
|
|
RETURN "MISSION_STAGE_CUTSCENE_POOL"
|
|
BREAK
|
|
CASE MISSION_STAGE_GOTO_JIMMYS_ROOM
|
|
RETURN "MISSION_STAGE_GOTO_JIMMYS_ROOM"
|
|
BREAK
|
|
CASE MISSION_STAGE_CUTSCENE_JIMMYS_ROOM
|
|
RETURN "MISSION_STAGE_CUTSCENE_JIMMYS_ROOM"
|
|
BREAK
|
|
CASE MISSION_STAGE_GOTO_BURGER_SHOT
|
|
RETURN "MISSION_STAGE_GOTO_BURGER_SHOT"
|
|
BREAK
|
|
CASE MISSION_STAGE_CUTSCENE_BURGER_SHOT
|
|
RETURN "MISSION_STAGE_CUTSCENE_BURGER_SHOT"
|
|
BREAK
|
|
CASE MISSION_STAGE_DRIVE_HOME
|
|
RETURN "MISSION_STAGE_DRIVE_HOME"
|
|
BREAK
|
|
CASE MISSION_STAGE_CUTSCENE_BLACKOUT
|
|
RETURN "MISSION_STAGE_CUTSCENE_BLACKOUT"
|
|
BREAK
|
|
CASE MISSION_STAGE_FLIGHT
|
|
RETURN "MISSION_STAGE_FLIGHT"
|
|
BREAK
|
|
CASE MISSION_STAGE_GO_HOME_WASTED
|
|
RETURN "MISSION_STAGE_GO_HOME_WASTED"
|
|
BREAK
|
|
CASE MISSION_STAGE_CUTSCENE_END_1
|
|
RETURN "MISSION_STAGE_CUTSCENE_END_1"
|
|
BREAK
|
|
CASE MISSION_STAGE_CUTSCENE_END_2
|
|
RETURN "MISSION_STAGE_CUTSCENE_END_2"
|
|
BREAK
|
|
CASE MISSION_STAGE_TEST
|
|
RETURN "MISSION_STAGE_TEST"
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
RETURN "INCORRECT_MISSION_STAGE"
|
|
|
|
ENDFUNC
|
|
|
|
PROC CREATE_DEBUG_WIDGETS()
|
|
|
|
Family5Widgets = START_WIDGET_GROUP("Mission: Family5")
|
|
|
|
ADD_WIDGET_BOOL("Can fail yoga?", FailFlags[MISSION_FAIL_YOGA_FAILED])
|
|
ADD_WIDGET_FLOAT_READ_ONLY("fBlushDecalAlpha", sYogaPlayer.fBlushDecalAlpha)
|
|
|
|
ADD_WIDGET_FLOAT_SLIDER("fKickAnimationTriggerDistance", fKickAnimationTriggerDistance, 0.0, 500.0, 1.0)
|
|
|
|
START_WIDGET_GROUP("Yoga Buttons")
|
|
ADD_WIDGET_FLOAT_SLIDER("YOGA_BUTTONS_X", YOGA_BUTTONS_X, 0.0, 1.0, 0.001)
|
|
ADD_WIDGET_FLOAT_SLIDER("YOGA_BUTTONS_Y", YOGA_BUTTONS_Y, 0.0, 1.0, 0.001)
|
|
ADD_WIDGET_FLOAT_SLIDER("YOGA_BUTTONS_WIDTH", YOGA_BUTTONS_WIDTH, 0.0, 1.0, 0.001)
|
|
ADD_WIDGET_FLOAT_SLIDER("YOGA_BUTTONS_HEIGHT", YOGA_BUTTONS_HEIGHT, 0.0, 1.0, 0.001)
|
|
ADD_WIDGET_FLOAT_SLIDER("YOGA_BUTTONS_SCALE", YOGA_BUTTONS_SCALE, 0.0, 2.0, 0.001)
|
|
STOP_WIDGET_GROUP()
|
|
|
|
START_WIDGET_GROUP("Free Fall")
|
|
|
|
ADD_WIDGET_INT_READ_ONLY("Stream play time", iStreamPlayTime)
|
|
ADD_WIDGET_INT_SLIDER("FLIGHT_TIME_MAX", FLIGHT_TIME_MAX, 0, 300000, 1)
|
|
|
|
ADD_WIDGET_FLOAT_SLIDER("fFallAnimationStopPhase", fFallAnimationStopPhase, 0.0, 1.0, 0.01)
|
|
ADD_WIDGET_FLOAT_SLIDER("fAnimatedCameraStopPhase", fAnimatedCameraStopPhase, 0.0, 1.0, 0.01)
|
|
ADD_WIDGET_INT_SLIDER("iAnimatedCameraInterpTime", iAnimatedCameraInterpTime, 0, 10000, 100)
|
|
|
|
ADD_WIDGET_FLOAT_READ_ONLY("fCurrentTimeScale", fCurrentTimeScale)
|
|
ADD_WIDGET_FLOAT_SLIDER("fDesiredTimeScale", fDesiredTimeScale, 0.0, 1.0, 0.1)
|
|
ADD_WIDGET_FLOAT_SLIDER("fDesiredTimeScaleSpeed", fDesiredTimeScaleSpeed, 0.0, 1.0, 0.0001)
|
|
|
|
ADD_WIDGET_FLOAT_SLIDER("fRelativePitch", fRelativePitch, -90.0, 90.0, 1.0)
|
|
|
|
ADD_WIDGET_VECTOR_SLIDER("vForceValue", vForceValue, -500.0, 500.0, 1.0)
|
|
ADD_WIDGET_VECTOR_SLIDER("vForceOffset", vForceOffset, -500.0, 500.0, 1.0)
|
|
|
|
STOP_WIDGET_GROUP()
|
|
|
|
START_WIDGET_GROUP("Focus push")
|
|
ADD_WIDGET_BOOL("bResetGameplayHint", bResetGameplayHint)
|
|
ADD_WIDGET_FLOAT_SLIDER("fFocusPushHintFOV", fFocusPushHintFOV, 1.0, 60.0, 1.0)
|
|
ADD_WIDGET_FLOAT_SLIDER("fFocusPushSideOffset", fFocusPushSideOffset, -10.0, 10.0, 0.1)
|
|
ADD_WIDGET_FLOAT_SLIDER("fFocusPushVerticalOffset", fFocusPushVerticalOffset, -10.0, 10.0, 0.1)
|
|
ADD_WIDGET_FLOAT_SLIDER("fFocusPushFollowDistanceScalar", fFocusPushFollowDistanceScalar, -10.0, 10.0, 0.1)
|
|
ADD_WIDGET_VECTOR_SLIDER("vFocusPushHintPosition", vFocusPushHintPosition, -1500.0, 1500, 1.0)
|
|
STOP_WIDGET_GROUP()
|
|
|
|
START_WIDGET_GROUP("Yoga mats position")
|
|
|
|
ADD_WIDGET_BOOL("Enable positioning", bPositionMats)
|
|
ADD_WIDGET_STRING("Yoga Mat 01")
|
|
ADD_WIDGET_VECTOR_SLIDER("Position: ", osYogaMats[0].vPosition, -1000.0, 1000.0, 0.01)
|
|
ADD_WIDGET_VECTOR_SLIDER("Rotation: ", osYogaMats[0].vRotation, -1000.0, 1000.0, 0.01)
|
|
ADD_WIDGET_STRING("Yoga Mat 02")
|
|
ADD_WIDGET_VECTOR_SLIDER("Position: ", osYogaMats[1].vPosition, -1000.0, 1000.0, 0.01)
|
|
ADD_WIDGET_VECTOR_SLIDER("Rotation: ", osYogaMats[1].vRotation, -1000.0, 1000.0, 0.01)
|
|
ADD_WIDGET_STRING("Yoga Mat 03")
|
|
ADD_WIDGET_VECTOR_SLIDER("Position: ", osYogaMats[2].vPosition, -1000.0, 1000.0, 0.01)
|
|
ADD_WIDGET_VECTOR_SLIDER("Rotation: ", osYogaMats[2].vRotation, -1000.0, 1000.0, 0.01)
|
|
|
|
ADD_WIDGET_STRING("Gamepad")
|
|
ADD_WIDGET_VECTOR_SLIDER("Position: ", osGamepad.vPosition, -1000.0, 1000.0, 0.01)
|
|
ADD_WIDGET_VECTOR_SLIDER("Rotation: ", osGamepad.vRotation, -1000.0, 1000.0, 0.01)
|
|
|
|
STOP_WIDGET_GROUP()
|
|
|
|
START_WIDGET_GROUP("Burger Shot cup position")
|
|
|
|
ADD_WIDGET_BOOL("Enable positioning", bPositionCup)
|
|
ADD_WIDGET_STRING("Burger Shot Cup")
|
|
ADD_WIDGET_VECTOR_SLIDER("Position: ", osCup.vPosition, -1000.0, 1000.0, 0.01)
|
|
ADD_WIDGET_VECTOR_SLIDER("Rotation: ", osCup.vRotation, -1000.0, 1000.0, 0.01)
|
|
ADD_WIDGET_VECTOR_SLIDER("Offset: ", osCup.vOffset, -1000.0, 1000.0, 0.01)
|
|
|
|
STOP_WIDGET_GROUP()
|
|
|
|
START_WIDGET_GROUP("Car cutscene")
|
|
|
|
ADD_WIDGET_BOOL("Start cutscene", bCutsceneToggle)
|
|
ADD_WIDGET_BOOL("Start timer", bStartTimerToggle)
|
|
ADD_WIDGET_FLOAT_SLIDER("fAnimationForcePhase", fAnimationForcePhase, 0.0, 1.0, 0.01)
|
|
ADD_WIDGET_FLOAT_SLIDER("fKickOutCameraBlur", fKickOutCameraBlur, 0, 3.0, 0.1)
|
|
ADD_WIDGET_FLOAT_SLIDER("fKickOutCameraShake", fKickOutCameraShake, 0, 3.0, 0.1)
|
|
ADD_WIDGET_INT_SLIDER("iKickOutDelayTime", iKickOutDelayTime, 0, 60000, 500)
|
|
ADD_WIDGET_FLOAT_SLIDER("fShapeTestRadiusFront", fShapeTestRadiusFront, 0.1, 10.0, 0.1)
|
|
ADD_WIDGET_FLOAT_SLIDER("fShapeTestRadiusSide", fShapeTestRadiusSide, 0.1, 10.0, 0.1)
|
|
ADD_WIDGET_VECTOR_SLIDER("vShapeTestCapsuleOffsetFront", vShapeTestCapsuleOffsetFront, -10.0, 10.0, 0.1)
|
|
ADD_WIDGET_VECTOR_SLIDER("vShapeTestCapsuleOffsetSide2", vShapeTestCapsuleOffsetSide2, -10.0, 10.0, 0.1)
|
|
|
|
STOP_WIDGET_GROUP()
|
|
|
|
ADD_WIDGET_FLOAT_SLIDER("iSTART_VOMITING_TIME", iSTART_VOMITING_TIME, 0.0, 1.0, 0.01)
|
|
ADD_WIDGET_FLOAT_SLIDER("iSTOP_VOMITING_TIME", iSTOP_VOMITING_TIME, 0.0, 1.0, 0.01)
|
|
ADD_WIDGET_FLOAT_SLIDER("iSTART_FP_FLASH_TIME", iSTART_FP_FLASH_TIME, 0.0, 1.0, 0.01)
|
|
|
|
ADD_WIDGET_FLOAT_SLIDER("fChimpsCameraShake", fChimpsCameraShake, 0.0, 10.0, 0.1)
|
|
ADD_WIDGET_FLOAT_SLIDER("fChimpsCameraBlur", fChimpsCameraBlur, 0.0, 10.0, 0.1)
|
|
|
|
STOP_WIDGET_GROUP()
|
|
|
|
SET_LOCATES_HEADER_WIDGET_GROUP(Family5Widgets)
|
|
|
|
ENDPROC
|
|
|
|
PROC DELETE_DEBUG_WIDGETS()
|
|
IF DOES_WIDGET_GROUP_EXIST(Family5Widgets)
|
|
DELETE_WIDGET_GROUP(Family5Widgets)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC CREATE_DEBUG_MISSION_STAGE_MENU()
|
|
|
|
SkipMenu[0].sTxtLabel = "PRE TIMELAPSE"
|
|
SkipMenu[1].sTxtLabel = "TIMELAPSE"
|
|
SkipMenu[2].sTxtLabel = "CUT - INTRO - FAMILY_5_INT"
|
|
SkipMenu[3].sTxtLabel = "YOGA - WARRIOR"
|
|
SkipMenu[4].sTxtLabel = "CUT - TRIANGLE - FAMILY_5_MCS_1"
|
|
SkipMenu[5].sTxtLabel = "YOGA - TRIANGLE"
|
|
SkipMenu[6].sTxtLabel = "CUT - SUNSALUTATION - FAMILY_5_MCS_2"
|
|
SkipMenu[7].sTxtLabel = "YOGA - SUNSALUTATION"
|
|
SkipMenu[8].sTxtLabel = "CUT - POOL - FAMILY_5_MCS_3"
|
|
SkipMenu[9].sTxtLabel = "GO TO JIMMY'S ROOM"
|
|
SkipMenu[10].sTxtLabel = "CUT - JIMMY - FAMILY_5_MCS_4"
|
|
SkipMenu[11].sTxtLabel = "GO TO BURGER SHOT"
|
|
SkipMenu[12].sTxtLabel = "CUT - BURGER SHOT - FAMILY_5_MCS_5"
|
|
SkipMenu[13].sTxtLabel = "DRIVE HOME"
|
|
SkipMenu[14].sTxtLabel = "CUT - BLACKOUT - FAM_5_MCS_6"
|
|
SkipMenu[15].sTxtLabel = "BLACKOUT FLIGHT"
|
|
SkipMenu[16].sTxtLabel = "GO HOME WASTED"
|
|
SkipMenu[17].sTxtLabel = "CUT - END 1 - FAMILY_5_MCS_5_P4"
|
|
SkipMenu[18].sTxtLabel = "CUT - END 2 - FAMILY_5_MCS_5_P5"
|
|
SkipMenu[19].sTxtLabel = "DEBUG CAR KICK ANIM TEST"
|
|
|
|
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_SAFE_SCREEN_FADE_IN(INT iTime)
|
|
|
|
IF NOT IS_SCREEN_FADED_IN()
|
|
|
|
DO_SCREEN_FADE_IN(iTime)
|
|
|
|
WHILE NOT IS_SCREEN_FADED_IN()
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Performs a screen fade out with a wait for a specified time.
|
|
/// PARAMS:
|
|
/// iTime - Duration of the fade in miliseconds.
|
|
PROC DO_SAFE_SCREEN_FADE_OUT(INT iTime)
|
|
|
|
IF NOT IS_SCREEN_FADED_OUT()
|
|
|
|
DO_SCREEN_FADE_OUT(iTime)
|
|
|
|
WHILE NOT IS_SCREEN_FADED_OUT()
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Stops an active mocap cutscene and waits until it has finished.
|
|
PROC DO_SAFE_STOP_CUTSCENE()
|
|
|
|
IF IS_CUTSCENE_PLAYING()
|
|
SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, FALSE, FALSE)
|
|
STOP_CUTSCENE(TRUE)
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE) //needs to be called to make sure all scripted systems work correctly when cutscene is skipped
|
|
ENDIF
|
|
|
|
WHILE NOT HAS_CUTSCENE_FINISHED()
|
|
WAIT(0)
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Waiting for the cutscene to finish.")
|
|
#ENDIF
|
|
ENDWHILE
|
|
|
|
ENDPROC
|
|
|
|
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()
|
|
|
|
CLEANUP_PED(psAmanda, TRUE)
|
|
CLEANUP_PED(psFabien, TRUE)
|
|
CLEANUP_PED(psJimmy, TRUE)
|
|
CLEANUP_PED(psDealer, TRUE)
|
|
|
|
//reset buddy outfits flags
|
|
bJimmysOutfitSet = FALSE
|
|
bBuddiesYogaOutfitsSet = FALSE
|
|
|
|
IF DOES_ENTITY_EXIST(osBSDoorDummy.ObjectIndex)
|
|
REMOVE_MODEL_HIDE(osBSDoor.vPosition, 1.0, osBSDoor.ModelName)
|
|
ENDIF
|
|
|
|
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(osCup, TRUE)
|
|
CLEANUP_MISSION_OBJECT(osNote, TRUE)
|
|
CLEANUP_MISSION_OBJECT(osCiggy, TRUE)
|
|
CLEANUP_MISSION_OBJECT(osMethBag, TRUE)
|
|
CLEANUP_MISSION_OBJECT(osBSDoor, FALSE)
|
|
CLEANUP_MISSION_OBJECT(osGamepad, TRUE)
|
|
CLEANUP_MISSION_OBJECT(osHeadset, TRUE)
|
|
CLEANUP_MISSION_OBJECT(osNecklace, TRUE)
|
|
CLEANUP_MISSION_OBJECT(osBSDoorDummy, TRUE)
|
|
CLEANUP_MISSION_OBJECT(osLeftDoorDummy, TRUE)
|
|
CLEANUP_MISSION_OBJECT(osRightDoorDummy, TRUE)
|
|
CLEANUP_MISSION_OBJECT_GROUP(osYogaMats, TRUE)
|
|
|
|
IF DOES_ENTITY_EXIST(vsMichaelsCar.VehicleIndex)
|
|
DELETE_VEHICLE(vsMichaelsCar.VehicleIndex)
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(vsParkedVehicles[0].VehicleIndex)
|
|
DELETE_VEHICLE(vsParkedVehicles[0].VehicleIndex)
|
|
ENDIF
|
|
|
|
//remove blips
|
|
IF DOES_BLIP_EXIST(MissionPosition.DestinationBlip)
|
|
REMOVE_BLIP(MissionPosition.DestinationBlip)
|
|
ENDIF
|
|
|
|
REMOVE_ANIM_DICT("missfam5_yoga")
|
|
REMOVE_ANIM_DICT("missfam5mcs_6")
|
|
REMOVE_ANIM_DICT("missfam5_drink")
|
|
REMOVE_ANIM_DICT("missfam5_flying")
|
|
REMOVE_ANIM_DICT("missfam5mcs_6drag")
|
|
REMOVE_ANIM_DICT("missfam5_wet_walk")
|
|
REMOVE_ANIM_DICT("missfam5_blackout")
|
|
REMOVE_ANIM_DICT("missfam2mcs_intp1")
|
|
REMOVE_ANIM_DICT("missfam5mcs_4leadin")
|
|
REMOVE_ANIM_DICT("missfam5leadinoutmcs_5")
|
|
|
|
//disable cam shaking
|
|
Quit_Drunk_Camera_Immediately()
|
|
STOP_GAMEPLAY_CAM_SHAKING(TRUE)
|
|
STOP_CUTSCENE_CAM_SHAKING(TRUE)
|
|
|
|
//turn off ped config flags
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
SET_ENTITY_VISIBLE(PLAYER_PED_ID(), TRUE)
|
|
TASK_CLEAR_LOOK_AT(PLAYER_PED_ID())
|
|
MAKE_PED_SOBER(PLAYER_PED_ID())
|
|
CLEAR_PED_ALTERNATE_WALK_ANIM(PLAYER_PED_ID())
|
|
REMOVE_WEAPON_FROM_PED(PLAYER_PED_ID(), GADGETTYPE_PARACHUTE)
|
|
SET_FORCE_FOOTSTEP_UPDATE(PLAYER_PED_ID(), FALSE)
|
|
ENDIF
|
|
|
|
SET_VEHICLE_MODEL_IS_SUPPRESSED(POLICE, FALSE)
|
|
|
|
STOP_STREAM()
|
|
bStreamTriggered = FALSE
|
|
|
|
SET_TV_VOLUME(0)
|
|
|
|
STOP_AUDIO_SCENES()
|
|
RELEASE_NAMED_SCRIPT_AUDIO_BANK("FAM5_DRUG_FLIGHT_END")
|
|
RELEASE_NAMED_SCRIPT_AUDIO_BANK("FAM5_MICHAEL_LONG_SCREAM")
|
|
SET_AUDIO_SPECIAL_EFFECT_MODE(AUDIO_SPECIAL_EFFECT_MODE_NORMAL)
|
|
|
|
SET_TIME_SCALE(1.0)
|
|
CLEAR_TIMECYCLE_MODIFIER()
|
|
ANIMPOSTFX_STOP("DMT_flight")
|
|
ANIMPOSTFX_STOP("DrugsDrivingIn")
|
|
ANIMPOSTFX_STOP("DrugsDrivingOut")
|
|
|
|
STOP_MISSION_SFX(MISSION_SFX_TAP)
|
|
STOP_MISSION_SFX(MISSION_SFX_VOMIT)
|
|
STOP_MISSION_SFX(MISSION_SFX_DRINK)
|
|
STOP_MISSION_SFX(MISSION_SFX_CHIMPS)
|
|
STOP_MISSION_SFX(MISSION_SFX_ALIENS)
|
|
STOP_MISSION_SFX(MISSION_SFX_HEARTBEAT)
|
|
|
|
RELEASE_MISSION_SFX_AUDIO_BANK(MISSION_SFX_TAP)
|
|
RELEASE_MISSION_SFX_AUDIO_BANK(MISSION_SFX_VOMIT)
|
|
RELEASE_MISSION_SFX_AUDIO_BANK(MISSION_SFX_ALIENS)
|
|
RELEASE_MISSION_SFX_AUDIO_BANK(MISSION_SFX_CHIMPS)
|
|
RELEASE_MISSION_SFX_AUDIO_BANK(MISSION_SFX_HEARTBEAT)
|
|
|
|
RESET_ALL_SFX_FLAGS(ssSounds)
|
|
|
|
//stop all music
|
|
IF ( bYogaMusicPlaying = TRUE )
|
|
TRIGGER_MUSIC_EVENT("FAM5_YOGA_MUSIC_ENDS")
|
|
bYogaMusicPlaying = FALSE
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Triggering music event FAM5_YOGA_MUSIC_ENDS.")
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Stopping yoga music.")
|
|
#ENDIF
|
|
ENDIF
|
|
CANCEL_MUSIC_EVENT("FAM5_YOGA_MOVE_START")
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Cancelling music event FAM5_YOGA_MOVE_START.")
|
|
#ENDIF
|
|
|
|
IF DOES_CAM_EXIST(ScriptedCamera)
|
|
SET_CAM_ACTIVE(ScriptedCamera, FALSE)
|
|
DESTROY_CAM(ScriptedCamera)
|
|
ENDIF
|
|
|
|
IF DOES_CAM_EXIST(UndergroundCamera)
|
|
SET_CAM_ACTIVE(UndergroundCamera, FALSE)
|
|
DESTROY_CAM(UndergroundCamera)
|
|
ENDIF
|
|
|
|
IF DOES_CAM_EXIST(AnimatedCamera)
|
|
SET_CAM_ACTIVE(AnimatedCamera, FALSE)
|
|
DESTROY_CAM(AnimatedCamera)
|
|
ENDIF
|
|
|
|
DESTROY_ALL_CAMS()
|
|
RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
|
|
KILL_CHASE_HINT_CAM(sCinematicCamStruct)
|
|
|
|
DISPLAY_RADAR(TRUE)
|
|
DISPLAY_HUD(TRUE)
|
|
|
|
CLEAR_MISSION_LOCATION_TEXT_AND_BLIPS(sLocatesData)
|
|
|
|
CLEAR_TRIGGERED_LABELS()
|
|
|
|
ASSISTED_MOVEMENT_REMOVE_ROUTE("mansion_1")
|
|
ASSISTED_MOVEMENT_REMOVE_ROUTE("family5b")
|
|
ASSISTED_MOVEMENT_REMOVE_ROUTE("family5c")
|
|
ASSISTED_MOVEMENT_REMOVE_ROUTE("family5d")
|
|
ASSISTED_MOVEMENT_REMOVE_ROUTE("f5_jimmy1")
|
|
|
|
DISABLE_TAXI_HAILING(FALSE)
|
|
|
|
IF DOES_PARTICLE_FX_LOOPED_EXIST(ptfxPuke)
|
|
STOP_PARTICLE_FX_LOOPED(ptfxPuke)
|
|
ENDIF
|
|
|
|
REMOVE_ROAD_NODE_SPEED_ZONE(iSpeedZone)
|
|
|
|
RESET_YOGA_STRUCT(sYogaPlayer, TRUE, TRUE)
|
|
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(PROP_CS_BS_CUP)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(PROP_BS_MAP_DOOR_01)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(P_BS_MAP_DOOR_01_S)
|
|
|
|
REMOVE_VEHICLE_ASSET(GET_PLAYER_VEH_MODEL(CHAR_MICHAEL))
|
|
|
|
REMOVE_IPL("SpaceInterior")
|
|
|
|
STAT_ENABLE_STATS_TRACKING()
|
|
SET_AUDIO_FLAG("DisableReplayScriptStreamRecording", FALSE)
|
|
|
|
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 5")
|
|
|
|
DO_SAFE_SCREEN_FADE_OUT(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
|
|
|
|
bBlackoutStagesActive = FALSE
|
|
|
|
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_2
|
|
|
|
DO_SAFE_SCREEN_FADE_OUT(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
|
|
|
|
bBlackoutStagesActive = FALSE
|
|
|
|
RESET_MISSION_FLAGS()
|
|
|
|
ENDIF
|
|
|
|
ELIF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_P)
|
|
|
|
IF eStage <> MISSION_STAGE_CUTSCENE_INTRO
|
|
|
|
DO_SAFE_SCREEN_FADE_OUT(DEFAULT_FADE_TIME)
|
|
|
|
DO_SAFE_STOP_CUTSCENE()
|
|
|
|
CLEAR_PRINTS()
|
|
|
|
CLEAR_HELP()
|
|
|
|
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
|
|
|
|
bBlackoutStagesActive = FALSE
|
|
|
|
RESET_MISSION_FLAGS()
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC RUN_DEBUG_WIDGETS()
|
|
|
|
IF ( bPositionMats = TRUE )
|
|
|
|
IF DOES_ENTITY_EXIST(osYogaMats[0].ObjectIndex)
|
|
IF NOT IS_ENTITY_DEAD(osYogaMats[0].ObjectIndex)
|
|
SET_ENTITY_COORDS(osYogaMats[0].ObjectIndex, osYogaMats[0].vPosition)
|
|
SET_ENTITY_ROTATION(osYogaMats[0].ObjectIndex, osYogaMats[0].vRotation)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(osYogaMats[1].ObjectIndex)
|
|
IF NOT IS_ENTITY_DEAD(osYogaMats[1].ObjectIndex)
|
|
SET_ENTITY_COORDS(osYogaMats[1].ObjectIndex, osYogaMats[1].vPosition)
|
|
SET_ENTITY_ROTATION(osYogaMats[1].ObjectIndex, osYogaMats[1].vRotation)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// IF DOES_ENTITY_EXIST(osYogaMats[2].ObjectIndex)
|
|
// IF NOT IS_ENTITY_DEAD(osYogaMats[2].ObjectIndex)
|
|
// SET_ENTITY_COORDS(osYogaMats[2].ObjectIndex, osYogaMats[2].vPosition)
|
|
// SET_ENTITY_ROTATION(osYogaMats[2].ObjectIndex, osYogaMats[2].vRotation)
|
|
// ENDIF
|
|
// ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(osGamepad.ObjectIndex)
|
|
IF NOT IS_ENTITY_DEAD(osGamepad.ObjectIndex)
|
|
SET_ENTITY_COORDS(osGamepad.ObjectIndex, osGamepad.vPosition)
|
|
SET_ENTITY_ROTATION(osGamepad.ObjectIndex, osGamepad.vRotation)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(osHeadset.ObjectIndex)
|
|
IF NOT IS_ENTITY_DEAD(osHeadset.ObjectIndex)
|
|
SET_ENTITY_COORDS(osHeadset.ObjectIndex, osHeadset.vPosition)
|
|
SET_ENTITY_ROTATION(osHeadset.ObjectIndex, osHeadset.vRotation)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF ( bPositionCup = TRUE )
|
|
|
|
IF DOES_ENTITY_EXIST(osCup.ObjectIndex)
|
|
IF NOT IS_ENTITY_DEAD(osCup.ObjectIndex)
|
|
SET_ENTITY_COORDS(osCup.ObjectIndex, osCup.vPosition)
|
|
SET_ENTITY_ROTATION(osCup.ObjectIndex, osCup.vRotation)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(psJimmy.PedIndex)
|
|
|
|
ATTACH_ENTITY_TO_ENTITY(osCup.ObjectIndex, psJimmy.PedIndex, 53, << 0.0, 0.0, 0.0 >>, << 0.0, 0.0, 0.0 >>)
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF ( bStartTimerToggle = TRUE )
|
|
iKickOutDelayTimer = GET_GAME_TIMER()
|
|
bStartTimerToggle = FALSE
|
|
ENDIF
|
|
|
|
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_NUMPAD4)
|
|
IF ( bDrawDebugLinesAndSpheres = FALSE)
|
|
SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE)
|
|
bDrawDebugLinesAndSpheres = TRUE
|
|
ELSE
|
|
SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(FALSE)
|
|
bDrawDebugLinesAndSpheres = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
FUNC STRING GET_PED_STATE_NAME_FOR_DEBUG(PED_STATES eState)
|
|
|
|
SWITCH eState
|
|
|
|
CASE PED_STATE_IDLE
|
|
RETURN "PED_STATE_IDLE"
|
|
BREAK
|
|
CASE PED_STATE_MOVING_TO_LOCATION
|
|
RETURN "PED_STATE_MOVING_TO_LOCATION"
|
|
BREAK
|
|
CASE PED_STATE_PLAYING_LOOP_ANIMATION
|
|
RETURN "PED_STATE_PLAYING_LOOP_ANIMATION"
|
|
BREAK
|
|
CASE PED_STATE_PLAYING_ACTION_ANIMATION
|
|
RETURN "PED_STATE_PLAYING_ACTION_ANIMATION"
|
|
BREAK
|
|
CASE PED_STATE_COMBAT
|
|
RETURN "PED_STATE_COMBAT"
|
|
BREAK
|
|
CASE PED_STATE_FLEEING
|
|
RETURN "PED_STATE_FLEEING"
|
|
BREAK
|
|
DEFAULT
|
|
RETURN "INVALID_PED_STATE"
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
RETURN "INVALID_PED_STATE"
|
|
|
|
ENDFUNC
|
|
|
|
#ENDIF
|
|
|
|
//|===================== END DEBUG VARIABLES, PROCEDURES & FUNCTIONS =====================|
|
|
|
|
//|=============================== PROCEDURES AND FUNCTIONS ==============================|
|
|
|
|
|
|
PROC SETUP_MISSION_SFX()
|
|
|
|
ssSounds[0].sSoundName = "DRUGS_ALIENS"
|
|
ssSounds[1].sSoundName = "DRUGS_CHIMPS"
|
|
ssSounds[2].sSoundName = "DRUGS_HEARTBEAT"
|
|
ssSounds[3].sSoundName = "DRUGS_TAKE"
|
|
ssSounds[4].sSoundName = "DRUGS_VOMIT"
|
|
ssSounds[5].sSoundName = "TAP_LOOP"
|
|
|
|
INT i = 0
|
|
|
|
FOR i = 0 TO COUNT_OF(ssSounds) - 1
|
|
|
|
ssSounds[i].iSoundID = GET_SOUND_ID()
|
|
|
|
ENDFOR
|
|
|
|
ENDPROC
|
|
|
|
PROC INITIALISE_ARRAYS_FOR_YOGA_MATS(MISSION_STAGES eStage)
|
|
|
|
SWITCH eStage
|
|
|
|
CASE MISSION_STAGE_TIMELAPSE
|
|
CASE MISSION_STAGE_CUTSCENE_INTRO
|
|
CASE MISSION_STAGE_YOGA_WARRIOR
|
|
|
|
//Michael's yoga mat, blue
|
|
osYogaMats[0].vPosition = <<-791.1636, 186.4052, 71.8295>>
|
|
osYogaMats[0].vRotation = <<-0.0000, 0.0000, -85.0403>>
|
|
osYogaMats[0].ModelName = PROP_YOGA_MAT_01
|
|
|
|
//Fabien's yoga mat, black
|
|
osYogaMats[1].vPosition = <<-789.3542, 187.8925, 71.8295>>
|
|
osYogaMats[1].vRotation = <<-0.0000, 0.0000, -18.5437>>
|
|
osYogaMats[1].ModelName = PROP_YOGA_MAT_02
|
|
|
|
//Amanda's yoga mat, red
|
|
osYogaMats[2].vPosition = <<-789.0070, 185.9859, 71.8295>>
|
|
osYogaMats[2].vRotation = <<-0.0000, 0.0000, 31.6581>>
|
|
osYogaMats[2].ModelName = PROP_YOGA_MAT_03
|
|
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_CUTSCENE_TRIANGLE
|
|
CASE MISSION_STAGE_YOGA_TRIANGLE
|
|
|
|
//Michael's yoga mat, blue
|
|
osYogaMats[0].vPosition = <<-791.1520, 186.2719, 71.8295>>
|
|
osYogaMats[0].vRotation = <<-0.0000, -0.0000, -85.0403>>
|
|
osYogaMats[0].ModelName = PROP_YOGA_MAT_01
|
|
|
|
//Fabien's yoga mat, black
|
|
osYogaMats[1].vPosition = <<-789.3542, 187.8925, 71.8295>>
|
|
osYogaMats[1].vRotation = <<-0.0000, 0.0000, -18.5437>>
|
|
osYogaMats[1].ModelName = PROP_YOGA_MAT_02
|
|
|
|
//Amanda's yoga mat, red
|
|
osYogaMats[2].vPosition = <<-789.0070, 185.9859, 71.8295>>
|
|
osYogaMats[2].vRotation = <<-0.0000, 0.0000, 31.6581>>
|
|
osYogaMats[2].ModelName = PROP_YOGA_MAT_03
|
|
|
|
BREAK
|
|
|
|
DEFAULT
|
|
|
|
//Michael's yoga mat, blue
|
|
osYogaMats[0].vPosition = << -791.530, 186.375, 71.835 >>
|
|
osYogaMats[0].vRotation = << 0.0, 0.0, 0.0 >>
|
|
osYogaMats[0].ModelName = PROP_YOGA_MAT_01
|
|
|
|
//Fabien's yoga mat, black
|
|
osYogaMats[1].vPosition = << -789.164, 188.236, 71.835 >>
|
|
osYogaMats[1].vRotation = << 0.0, 0.0, -108.0 >>
|
|
osYogaMats[1].ModelName = PROP_YOGA_MAT_02
|
|
|
|
//Amanda's yoga mat, red
|
|
osYogaMats[2].vPosition = << -788.613, 185.352, 71.835 >>
|
|
osYogaMats[2].vRotation = << 0.0, 0.0, -238.91 >>
|
|
osYogaMats[2].ModelName = PROP_YOGA_MAT_03
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
ENDPROC
|
|
|
|
|
|
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
|
|
|
|
INITIALISE_ARRAYS_FOR_YOGA_MATS(eStage)
|
|
|
|
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
|
|
|
|
osBSDoor.vPosition = << -1179.2917, -891.4589, 13.8687 >>
|
|
osBSDoor.ModelName = PROP_BS_MAP_DOOR_01
|
|
|
|
osBSDoorDummy.vPosition = << -1179.29, -891.459, 13.8687 >>
|
|
osBSDoorDummy.vRotation = << 0.0, 0.0, 124.1 >>
|
|
osBSDoorDummy.ModelName = P_BS_MAP_DOOR_01_S
|
|
|
|
SWITCH eStage
|
|
|
|
CASE MISSION_STAGE_PRE_TIMELAPSE
|
|
|
|
MissionPosition.vStageStart = <<-823.9692, 179.8976, 70.5228>>
|
|
MissionPosition.fStartHeading = 260.0065
|
|
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_TIMELAPSE
|
|
CASE MISSION_STAGE_CUTSCENE_INTRO
|
|
|
|
MissionPosition.vStageStart = <<-805.9919, 170.9620, 71.8447>>
|
|
MissionPosition.fStartHeading = 293.2728
|
|
|
|
psAmanda.vPosition = << -789.032, 185.876, 71.8353 >>
|
|
psAmanda.fHeading = 26.707853
|
|
psAmanda.ModelName = GET_NPC_PED_MODEL(CHAR_AMANDA)
|
|
|
|
psFabien.vPosition = << -789.419, 187.649, 71.8353 >>
|
|
psFabien.fHeading = 141.305695
|
|
psFabien.ModelName = IG_FABIEN
|
|
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_YOGA_WARRIOR
|
|
CASE MISSION_STAGE_CUTSCENE_TRIANGLE
|
|
CASE MISSION_STAGE_YOGA_TRIANGLE
|
|
CASE MISSION_STAGE_CUTSCENE_SUNSALUTATION
|
|
CASE MISSION_STAGE_YOGA_SUNSALUTATION
|
|
CASE MISSION_STAGE_CUTSCENE_POOL
|
|
|
|
MissionPosition.vStageStart = << -790.906, 186.293, 71.8351 >>
|
|
MissionPosition.fStartHeading = 275.074219
|
|
|
|
psAmanda.vPosition = << -789.032, 185.876, 71.8353 >>
|
|
psAmanda.fHeading = 26.707853
|
|
psAmanda.ModelName = GET_NPC_PED_MODEL(CHAR_AMANDA)
|
|
|
|
psFabien.vPosition = << -789.419, 187.649, 71.8353 >>
|
|
psFabien.fHeading = 141.305695
|
|
psFabien.ModelName = IG_FABIEN
|
|
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_GOTO_JIMMYS_ROOM
|
|
|
|
MissionPosition.vStageStart = << -789.995, 181.611, 71.8350 >>
|
|
MissionPosition.fStartHeading = 92.551315
|
|
|
|
psJimmy.vPosition = << -805.7374, 168.7947, 75.7409 >>
|
|
psJimmy.fHeading = 132
|
|
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)
|
|
|
|
osGamepad.vPosition = << -808.22, 168.81, 75.75 >>
|
|
osGamepad.ModelName = PROP_CONTROLLER_01
|
|
|
|
osHeadset.vPosition = << -808.35, 169.36, 75.75 >>
|
|
osHeadset.ModelName = PROP_HEADSET_01
|
|
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_CUTSCENE_JIMMYS_ROOM
|
|
|
|
MissionPosition.vStageStart = << -804.9048, 179.4079, 75.7408 >>
|
|
MissionPosition.fStartHeading = 185.1595
|
|
|
|
psJimmy.vPosition = << -808.5767, 169.9767, 75.7406 >>
|
|
psJimmy.fHeading = 89.3525
|
|
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)
|
|
|
|
osGamepad.vPosition = <<-806.184, 170.435, 76.470>>
|
|
osGamepad.vRotation = <<-64.000, 50.000, -92.000>>
|
|
osGamepad.ModelName = PROP_CONTROLLER_01
|
|
|
|
osHeadset.vPosition = << -806.598, 170.280, 76.475 >>
|
|
osHeadset.vRotation = << -94.000, 0, 0.0>>
|
|
osHeadset.ModelName = PROP_HEADSET_01
|
|
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_GOTO_BURGER_SHOT
|
|
|
|
MissionPosition.vStageStart = <<-807.1270, 172.5753, 75.7407>> //<< -806.0112, 174.1656, 75.7408 >>
|
|
MissionPosition.fStartHeading = 324.5707 //321.7517
|
|
|
|
vsMichaelsCar.vPosition = << -824.3593, 179.5045, 70.4652 >>
|
|
vsMichaelsCar.fHeading = 137.1847
|
|
vsMichaelsCar.ModelName = GET_PLAYER_VEH_MODEL(CHAR_MICHAEL)
|
|
|
|
psJimmy.vPosition = <<-804.8173, 176.2879, 75.7408 >>
|
|
psJimmy.fHeading = 335.184906
|
|
psJimmy.ModelName = GET_NPC_PED_MODEL(CHAR_JIMMY)
|
|
|
|
psDealer.vPosition = << -1177.89, -892.36, 12.76 >>
|
|
psDealer.fHeading = 315.7144
|
|
psDealer.ModelName = U_M_Y_Burgerdrug_01
|
|
|
|
osGamepad.vPosition = <<-806.184, 170.435, 76.470>>
|
|
osGamepad.vRotation = <<-64.000, 50.000, -92.000>>
|
|
osGamepad.ModelName = PROP_CONTROLLER_01
|
|
|
|
osHeadset.vPosition = << -806.598, 170.280, 76.475 >>
|
|
osHeadset.vRotation = << -94.000, 0, 0.0>>
|
|
osHeadset.ModelName = PROP_HEADSET_01
|
|
|
|
osCiggy.vPosition = << -1176.78, -892.36, 12.93 >>
|
|
osCiggy.ModelName = PROP_CS_CIGGY_01
|
|
|
|
osMethBag.vPosition = << -1176.78, -892.36, 12.93 >>
|
|
osMethBag.ModelName = P_METH_BAG_01_S
|
|
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_CUTSCENE_BURGER_SHOT
|
|
|
|
MissionPosition.vStageStart = << -1175.5334, -886.3669, 12.9041 >>
|
|
MissionPosition.fStartHeading = 211.4735
|
|
|
|
vsMichaelsCar.vPosition = << -1176.40, -887.60, 12.864 >>
|
|
vsMichaelsCar.fHeading = 212.06
|
|
vsMichaelsCar.ModelName = GET_PLAYER_VEH_MODEL(CHAR_MICHAEL)
|
|
|
|
psJimmy.vPosition = << -1176.74, -887.948, 12.5514 >>
|
|
psJimmy.fHeading = 199.774918
|
|
psJimmy.ModelName = GET_NPC_PED_MODEL(CHAR_JIMMY)
|
|
|
|
psDealer.vPosition = << -1177.89, -892.36, 12.76 >>
|
|
psDealer.fHeading = 315.7144
|
|
psDealer.ModelName = U_M_Y_Burgerdrug_01
|
|
|
|
osCup.vPosition = << -1180.36, -892.87, 12.80 >>
|
|
osCup.vRotation = << 0.0, 0.0, 0.0 >>
|
|
osCup.vOffset = << 0.0, 0.0, 0.0 >>
|
|
osCup.ModelName = PROP_CS_BS_CUP
|
|
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_DRIVE_HOME
|
|
|
|
MissionPosition.vStageStart = << -1175.5334, -886.3669, 12.9041 >>
|
|
MissionPosition.fStartHeading = 211.4735
|
|
|
|
vsMichaelsCar.vPosition = << -1176.40, -887.60, 12.864 >>
|
|
vsMichaelsCar.fHeading = 212.06
|
|
vsMichaelsCar.ModelName = GET_PLAYER_VEH_MODEL(CHAR_MICHAEL)
|
|
|
|
psJimmy.vPosition = << -1176.74, -887.948, 12.5514 >>
|
|
psJimmy.fHeading = 199.774918
|
|
psJimmy.ModelName = GET_NPC_PED_MODEL(CHAR_JIMMY)
|
|
|
|
osCup.vPosition = << -1176.571, -888.149, 13.6039>>
|
|
osCup.vRotation = << 0.0, 0.0, 0.0 >>
|
|
osCup.vOffset = << 0.0, -0.06, 0.03 >>
|
|
osCup.ModelName = PROP_CS_BS_CUP
|
|
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_CUTSCENE_BLACKOUT
|
|
|
|
MissionPosition.vStageStart = << -20.2621, -219.8899, 45.1815 >>
|
|
MissionPosition.fStartHeading = 352.7035
|
|
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_FLIGHT
|
|
|
|
MissionPosition.vStageStart = << -20.2621, -219.8899, 45.1815 >>
|
|
MissionPosition.fStartHeading = 352.7035
|
|
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_GO_HOME_WASTED
|
|
|
|
MissionPosition.vStageStart = << -966.9352, 309.2517, 69.2397 >>
|
|
MissionPosition.fStartHeading = 252.8672
|
|
|
|
vsParkedVehicles[0].vPosition = << -946.8423, 313.0, 70.34 >>
|
|
vsParkedVehicles[0].fHeading = 269.0366
|
|
vsParkedVehicles[0].ModelName = SCORCHER
|
|
|
|
osNote.vPosition = <<-800.663, 184.017, 72.5250>>
|
|
osNote.vRotation = << 0.0, 0.0, 20.0 >>
|
|
osNote.ModelName = PROP_AMANDA_NOTE_01
|
|
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_CUTSCENE_END_1
|
|
|
|
MissionPosition.vStageStart = <<-802.3392, 182.5324, 71.6055>>
|
|
MissionPosition.fStartHeading = 293.7678
|
|
|
|
osNote.vPosition = <<-800.663, 184.017, 72.5250>>
|
|
osNote.vRotation = << 0.0, 0.0, 20.0 >>
|
|
osNote.ModelName = PROP_AMANDA_NOTE_01
|
|
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_CUTSCENE_END_2
|
|
|
|
MissionPosition.vStageStart = <<-820.5433, 176.9832, 70.6124>>
|
|
MissionPosition.fStartHeading = 44.9042
|
|
|
|
BREAK
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
CASE MISSION_STAGE_TEST
|
|
|
|
MissionPosition.vStageStart = << -1175.5334, -886.3669, 12.9041 >>
|
|
MissionPosition.fStartHeading = 211.4735
|
|
|
|
vsMichaelsCar.vPosition = << -1176.40, -887.60, 12.864 >>
|
|
vsMichaelsCar.fHeading = 212.06
|
|
vsMichaelsCar.ModelName = GET_PLAYER_VEH_MODEL(CHAR_MICHAEL)
|
|
|
|
psJimmy.vPosition = << -1176.74, -887.948, 12.5514 >>
|
|
psJimmy.fHeading = 199.774918
|
|
psJimmy.ModelName = GET_NPC_PED_MODEL(CHAR_JIMMY)
|
|
|
|
//INITIALISE_SAFE_LOCATES()
|
|
|
|
BREAK
|
|
#ENDIF
|
|
|
|
ENDSWITCH
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Finished initialising arrays for ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eStage), ".")
|
|
#ENDIF
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Adds a model to model request array.
|
|
/// PARAMS:
|
|
/// ModelName - Model name being requested.
|
|
/// array - MODEL_NAMES array to add the requested model name to.
|
|
/// iArrayLength - Maximum length of the array.
|
|
/// iModelsAlreadyRequested - Number of models already requested in this array.
|
|
PROC ADD_MODEL_REQUEST_TO_ARRAY(MODEL_NAMES ModelName, MODEL_NAMES &array[], INT iArrayLength, INT &iModelsAlreadyRequested)
|
|
|
|
INT i = 0
|
|
|
|
BOOL bModelAlreadyRequested = FALSE
|
|
|
|
IF ( iModelsAlreadyRequested >= 0 )
|
|
|
|
IF ( iModelsAlreadyRequested <= ( iArrayLength - 1 ) )
|
|
|
|
//loop through the array (from 0 to number of models already requested)
|
|
//to see if the array already contains the model name being requested
|
|
//modify the boolean flag if the model was found in array, otherwise leave the flag unchanged
|
|
FOR i = 0 TO ( iModelsAlreadyRequested )
|
|
|
|
IF ( array[i] = ModelName )
|
|
|
|
bModelAlreadyRequested = TRUE
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Requested model ", GET_MODEL_NAME_FOR_DEBUG(ModelName), " is already in model array.")
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDFOR
|
|
|
|
IF ( bModelAlreadyRequested = FALSE )
|
|
|
|
REQUEST_MODEL(ModelName)
|
|
|
|
//iModelsAlreadyRequested will be the model array index of the model being requested
|
|
array[iModelsAlreadyRequested] = ModelName
|
|
|
|
iModelsAlreadyRequested++
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Requested model ", GET_MODEL_NAME_FOR_DEBUG(ModelName), " and added to model array.")
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Number of models requested: ", iModelsAlreadyRequested, ".")
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
SCRIPT_ASSERT("Number of requested models is greater than the length of the model array.")
|
|
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
SCRIPT_ASSERT("Number of requested models is less than 0.")
|
|
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Checks if all requested models from model array are loaded into memory.
|
|
/// PARAMS:
|
|
/// array - MODEL_NAMES array holding the models.
|
|
/// iModelsAlreadyRequested - Number of already requested models. Should be greated than 0, since 0 means no models have been requested.
|
|
/// RETURNS:
|
|
/// TRUE if all models from model array are loaded into memory. FALSE if otherwise.
|
|
FUNC BOOL ARE_REQUESTED_MODELS_LOADED(MODEL_NAMES &array[], INT &iModelsAlreadyRequested)
|
|
|
|
INT i = 0
|
|
|
|
IF ( iModelsAlreadyRequested > 0 )
|
|
|
|
FOR i = 0 TO ( iModelsAlreadyRequested - 1 )
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Model in array[", i, "]: ", GET_MODEL_NAME_FOR_DEBUG(array[i]), ".")
|
|
#ENDIF
|
|
|
|
IF NOT HAS_MODEL_LOADED(array[i])
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Model ", GET_MODEL_NAME_FOR_DEBUG(array[i]), " is loading.")
|
|
#ENDIF
|
|
|
|
//if the model is not loaded keep requesting it
|
|
REQUEST_MODEL(array[i])
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Requesting model ", GET_MODEL_NAME_FOR_DEBUG(array[i]), ".")
|
|
#ENDIF
|
|
|
|
RETURN FALSE
|
|
|
|
ENDIF
|
|
|
|
ENDFOR
|
|
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Models from model array loaded. Number of models loaded: ", iModelsAlreadyRequested, ".")
|
|
#ENDIF
|
|
|
|
RETURN TRUE
|
|
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Cleans model array from requested models.
|
|
/// PARAMS:
|
|
/// array - MODEL_NAMES array.
|
|
/// iModelsAlreadyRequested - Number of already requested models. Should be greated than 0, since 0 means no models have been requested.
|
|
PROC CLEANUP_MODEL_ARRAY(MODEL_NAMES &array[], INT &iModelsAlreadyRequested)
|
|
|
|
INT i = 0
|
|
|
|
IF ( iModelsAlreadyRequested > 0 )
|
|
|
|
FOR i = 0 TO ( iModelsAlreadyRequested - 1 )
|
|
|
|
IF array[i] <> DUMMY_MODEL_FOR_SCRIPT
|
|
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(array[i])
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Model ", GET_MODEL_NAME_FOR_DEBUG(array[i]), " cleaned up from model array by setting it as no longer needed.")
|
|
#ENDIF
|
|
|
|
array[i] = DUMMY_MODEL_FOR_SCRIPT
|
|
ENDIF
|
|
|
|
ENDFOR
|
|
|
|
ENDIF
|
|
|
|
iModelsAlreadyRequested = 0
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Model array cleaned up. Number of requested models set to 0.")
|
|
#ENDIF
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// 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
|
|
|
|
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_TIMELAPSE
|
|
CASE MISSION_STAGE_TIMELAPSE
|
|
CASE MISSION_STAGE_CUTSCENE_INTRO
|
|
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_YOGA_WARRIOR
|
|
CASE MISSION_STAGE_CUTSCENE_TRIANGLE
|
|
CASE MISSION_STAGE_YOGA_TRIANGLE
|
|
CASE MISSION_STAGE_CUTSCENE_SUNSALUTATION
|
|
CASE MISSION_STAGE_YOGA_SUNSALUTATION
|
|
|
|
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(osYogaMats[0].ObjectIndex)
|
|
ADD_MODEL_REQUEST_TO_ARRAY(osYogaMats[0].ModelName, MissionModels, MAX_MODELS, iModelsRequested)
|
|
ENDIF
|
|
IF NOT DOES_ENTITY_EXIST(osYogaMats[1].ObjectIndex)
|
|
ADD_MODEL_REQUEST_TO_ARRAY(osYogaMats[1].ModelName, MissionModels, MAX_MODELS, iModelsRequested)
|
|
ENDIF
|
|
IF NOT DOES_ENTITY_EXIST(osYogaMats[2].ObjectIndex)
|
|
ADD_MODEL_REQUEST_TO_ARRAY(osYogaMats[2].ModelName, MissionModels, MAX_MODELS, iModelsRequested)
|
|
ENDIF
|
|
ADD_ANIMATION_REQUEST_TO_ARRAY("missfam5_yoga", MissionAnimations, MAX_ANIMATIONS, iAnimationsRequested)
|
|
BREAK
|
|
CASE MISSION_STAGE_CUTSCENE_POOL
|
|
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(osYogaMats[0].ObjectIndex)
|
|
ADD_MODEL_REQUEST_TO_ARRAY(osYogaMats[0].ModelName, MissionModels, MAX_MODELS, iModelsRequested)
|
|
ENDIF
|
|
IF NOT DOES_ENTITY_EXIST(osYogaMats[1].ObjectIndex)
|
|
ADD_MODEL_REQUEST_TO_ARRAY(osYogaMats[1].ModelName, MissionModels, MAX_MODELS, iModelsRequested)
|
|
ENDIF
|
|
IF NOT DOES_ENTITY_EXIST(osYogaMats[2].ObjectIndex)
|
|
ADD_MODEL_REQUEST_TO_ARRAY(osYogaMats[2].ModelName, MissionModels, MAX_MODELS, iModelsRequested)
|
|
ENDIF
|
|
ADD_ANIMATION_REQUEST_TO_ARRAY("missfam5_wet_walk", MissionAnimations, MAX_ANIMATIONS, iAnimationsRequested)
|
|
BREAK
|
|
|
|
|
|
CASE MISSION_STAGE_GOTO_JIMMYS_ROOM
|
|
IF NOT DOES_ENTITY_EXIST(psJimmy.PedIndex)
|
|
ADD_MODEL_REQUEST_TO_ARRAY(psJimmy.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
|
|
ENDIF
|
|
IF NOT DOES_ENTITY_EXIST(osYogaMats[0].ObjectIndex)
|
|
ADD_MODEL_REQUEST_TO_ARRAY(osYogaMats[0].ModelName, MissionModels, MAX_MODELS, iModelsRequested)
|
|
ENDIF
|
|
IF NOT DOES_ENTITY_EXIST(osYogaMats[1].ObjectIndex)
|
|
ADD_MODEL_REQUEST_TO_ARRAY(osYogaMats[1].ModelName, MissionModels, MAX_MODELS, iModelsRequested)
|
|
ENDIF
|
|
IF NOT DOES_ENTITY_EXIST(osYogaMats[2].ObjectIndex)
|
|
ADD_MODEL_REQUEST_TO_ARRAY(osYogaMats[2].ModelName, MissionModels, MAX_MODELS, iModelsRequested)
|
|
ENDIF
|
|
IF NOT DOES_ENTITY_EXIST(vsMichaelsCar.VehicleIndex)
|
|
ADD_MODEL_REQUEST_TO_ARRAY(vsMichaelsCar.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
|
|
ENDIF
|
|
ADD_ANIMATION_REQUEST_TO_ARRAY("missfam5_wet_walk", MissionAnimations, MAX_ANIMATIONS, iAnimationsRequested)
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_CUTSCENE_JIMMYS_ROOM
|
|
IF NOT DOES_ENTITY_EXIST(psJimmy.PedIndex)
|
|
ADD_MODEL_REQUEST_TO_ARRAY(psJimmy.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
|
|
ENDIF
|
|
IF NOT DOES_ENTITY_EXIST(osYogaMats[0].ObjectIndex)
|
|
ADD_MODEL_REQUEST_TO_ARRAY(osYogaMats[0].ModelName, MissionModels, MAX_MODELS, iModelsRequested)
|
|
ENDIF
|
|
IF NOT DOES_ENTITY_EXIST(osYogaMats[1].ObjectIndex)
|
|
ADD_MODEL_REQUEST_TO_ARRAY(osYogaMats[1].ModelName, MissionModels, MAX_MODELS, iModelsRequested)
|
|
ENDIF
|
|
IF NOT DOES_ENTITY_EXIST(osYogaMats[2].ObjectIndex)
|
|
ADD_MODEL_REQUEST_TO_ARRAY(osYogaMats[2].ModelName, MissionModels, MAX_MODELS, iModelsRequested)
|
|
ENDIF
|
|
IF NOT DOES_ENTITY_EXIST(vsMichaelsCar.VehicleIndex)
|
|
ADD_MODEL_REQUEST_TO_ARRAY(vsMichaelsCar.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
|
|
ENDIF
|
|
IF NOT DOES_ENTITY_EXIST(vsMichaelsCar.VehicleIndex)
|
|
ADD_MODEL_REQUEST_TO_ARRAY(vsMichaelsCar.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_GOTO_BURGER_SHOT
|
|
IF NOT DOES_ENTITY_EXIST(psJimmy.PedIndex)
|
|
ADD_MODEL_REQUEST_TO_ARRAY(psJimmy.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
|
|
ENDIF
|
|
IF NOT DOES_ENTITY_EXIST(osYogaMats[0].ObjectIndex)
|
|
ADD_MODEL_REQUEST_TO_ARRAY(osYogaMats[0].ModelName, MissionModels, MAX_MODELS, iModelsRequested)
|
|
ENDIF
|
|
IF NOT DOES_ENTITY_EXIST(osYogaMats[1].ObjectIndex)
|
|
ADD_MODEL_REQUEST_TO_ARRAY(osYogaMats[1].ModelName, MissionModels, MAX_MODELS, iModelsRequested)
|
|
ENDIF
|
|
IF NOT DOES_ENTITY_EXIST(osYogaMats[2].ObjectIndex)
|
|
ADD_MODEL_REQUEST_TO_ARRAY(osYogaMats[2].ModelName, MissionModels, MAX_MODELS, iModelsRequested)
|
|
ENDIF
|
|
IF NOT DOES_ENTITY_EXIST(vsMichaelsCar.VehicleIndex)
|
|
ADD_MODEL_REQUEST_TO_ARRAY(vsMichaelsCar.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_CUTSCENE_BURGER_SHOT
|
|
IF NOT DOES_ENTITY_EXIST(psJimmy.PedIndex)
|
|
ADD_MODEL_REQUEST_TO_ARRAY(psJimmy.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
|
|
ENDIF
|
|
IF NOT DOES_ENTITY_EXIST(psDealer.PedIndex)
|
|
ADD_MODEL_REQUEST_TO_ARRAY(psDealer.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
|
|
ENDIF
|
|
IF NOT DOES_ENTITY_EXIST(vsMichaelsCar.VehicleIndex)
|
|
ADD_MODEL_REQUEST_TO_ARRAY(vsMichaelsCar.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_DRIVE_HOME
|
|
IF NOT DOES_ENTITY_EXIST(psJimmy.PedIndex)
|
|
ADD_MODEL_REQUEST_TO_ARRAY(psJimmy.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
|
|
ENDIF
|
|
IF NOT DOES_ENTITY_EXIST(vsMichaelsCar.VehicleIndex)
|
|
ADD_MODEL_REQUEST_TO_ARRAY(vsMichaelsCar.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
|
|
ENDIF
|
|
IF NOT DOES_ENTITY_EXIST(osCup.ObjectIndex)
|
|
ADD_MODEL_REQUEST_TO_ARRAY(osCup.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
|
|
ENDIF
|
|
ADD_ANIMATION_REQUEST_TO_ARRAY("missfam5_drink", MissionAnimations, MAX_ANIMATIONS, iAnimationsRequested)
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_GO_HOME_WASTED
|
|
IF NOT DOES_ENTITY_EXIST(vsParkedVehicles[0].VehicleIndex)
|
|
ADD_MODEL_REQUEST_TO_ARRAY(vsParkedVehicles[0].ModelName, MissionModels, MAX_MODELS, iModelsRequested)
|
|
ENDIF
|
|
ADD_ANIMATION_REQUEST_TO_ARRAY("missfam5_blackout", MissionAnimations, MAX_ANIMATIONS, iAnimationsRequested)
|
|
BREAK
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
CASE MISSION_STAGE_TEST
|
|
IF NOT DOES_ENTITY_EXIST(psJimmy.PedIndex)
|
|
ADD_MODEL_REQUEST_TO_ARRAY(psJimmy.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
|
|
ENDIF
|
|
IF NOT DOES_ENTITY_EXIST(vsMichaelsCar.VehicleIndex)
|
|
ADD_MODEL_REQUEST_TO_ARRAY(vsMichaelsCar.ModelName, MissionModels, MAX_MODELS, iModelsRequested)
|
|
ENDIF
|
|
BREAK
|
|
#ENDIF
|
|
|
|
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:
|
|
/// 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
|
|
|
|
/// 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_YOGA_WARRIOR)
|
|
|
|
eStage = MISSION_STAGE_YOGA_WARRIOR
|
|
|
|
INT iStartTime, iEndTime //get TOD skip start and end time
|
|
|
|
GET_SP_MISSION_TOD_WINDOW_TIME(SP_MISSION_FAMILY_5, iStartTime, iEndTime) //these are times ranges for which TOD skip will trigger
|
|
|
|
IF NOT IS_TIME_BETWEEN_THESE_HOURS(iEndTime, iStartTime) //on a replay, check if time of day is between the allowed time ranges
|
|
SET_CLOCK_TIME(IDEAL_MISSION_START_TIME, 0, 0) //set the time to new mission time if needed
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting clock time for mission replay.")
|
|
#ENDIF
|
|
ENDIF
|
|
|
|
ELIF iValue = ENUM_TO_INT(MID_MISSION_STAGE_YOGA_TRIANGLE)
|
|
|
|
eStage = MISSION_STAGE_YOGA_TRIANGLE
|
|
|
|
ELIF iValue = ENUM_TO_INT(MID_MISSION_STAGE_YOGA_SUNSALUTATION)
|
|
|
|
eStage = MISSION_STAGE_YOGA_SUNSALUTATION
|
|
|
|
ELIF iValue = ENUM_TO_INT(MID_MISSION_STAGE_GOTO_JIMMYS_ROOM)
|
|
|
|
eStage = MISSION_STAGE_GOTO_JIMMYS_ROOM
|
|
|
|
ELIF iValue = ENUM_TO_INT(MID_MISSION_STAGE_GOTO_BURGER_SHOT)
|
|
|
|
eStage = MISSION_STAGE_GOTO_BURGER_SHOT
|
|
|
|
ELIF iValue = ENUM_TO_INT(MID_MISSION_STAGE_DRIVE_HOME)
|
|
|
|
eStage = MISSION_STAGE_DRIVE_HOME
|
|
|
|
ELIF iValue = ENUM_TO_INT(MID_MISSION_STAGE_GO_HOME_WASTED)
|
|
|
|
eStage = MISSION_STAGE_GO_HOME_WASTED
|
|
|
|
ENDIF
|
|
|
|
bStageReplayInProgress = TRUE
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Mission is being replayed at stage ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eStage), ".")
|
|
#ENDIF
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// 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 MAKE_PED_LOOK_AT_ENTITY_WITH_INTERVAL(PED_INDEX PedIndex, ENTITY_INDEX EntityIndex, BOOL &bLookAtFlag, INT &iLookAtTimer,
|
|
INT &iIntervalTimer, INT &iLookAtTime, INT &iIntervalTime,
|
|
INT iMinLookAtTime, INT iMaxLookAtTime, INT iMinIntervalTimer, INT iMaxIntervalTime)
|
|
|
|
IF DOES_ENTITY_EXIST(PedIndex)
|
|
|
|
IF NOT IS_ENTITY_DEAD(PedIndex)
|
|
|
|
IF ( bLookAtFlag = FALSE )
|
|
|
|
//reset interval time and interval timer
|
|
IF ( iIntervalTime = 0 )
|
|
|
|
iIntervalTime = GET_RANDOM_INT_IN_RANGE(iMinIntervalTimer, iMaxIntervalTime)
|
|
|
|
iIntervalTimer = GET_GAME_TIMER()
|
|
|
|
ENDIF
|
|
|
|
IF HAS_TIME_PASSED(iIntervalTime, iIntervalTimer)
|
|
|
|
IF DOES_ENTITY_EXIST(EntityIndex)
|
|
|
|
SWITCH GET_RANDOM_INT_IN_RANGE(0, 3)
|
|
|
|
CASE 0
|
|
TASK_LOOK_AT_ENTITY(PedIndex, EntityIndex, -1, SLF_DEFAULT)
|
|
BREAK
|
|
|
|
CASE 1
|
|
TASK_LOOK_AT_ENTITY(PedIndex, EntityIndex, -1, SLF_SLOW_TURN_RATE)
|
|
BREAK
|
|
|
|
CASE 2
|
|
TASK_LOOK_AT_ENTITY(PedIndex, EntityIndex, -1, SLF_FAST_TURN_RATE)
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
iLookAtTime = GET_RANDOM_INT_IN_RANGE(iMinLookAtTime, iMaxLookAtTime)
|
|
|
|
iLookAtTimer = GET_GAME_TIMER()
|
|
|
|
bLookAtFlag = TRUE
|
|
|
|
// #IF IS_DEBUG_BUILD
|
|
// PRINTLN(GET_THIS_SCRIPT_NAME(), ": Giving ped look at entity task with time ", iLookAtTime, ".")
|
|
// #ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ELIF ( bLookAtFlag = TRUE )
|
|
|
|
//reset look at time and look at timer
|
|
IF ( iLookAtTime = 0 )
|
|
|
|
iLookAtTime = GET_RANDOM_INT_IN_RANGE(iMinLookAtTime, iMaxLookAtTime)
|
|
|
|
iLookAtTimer = GET_GAME_TIMER()
|
|
|
|
ENDIF
|
|
|
|
IF HAS_TIME_PASSED(iLookAtTime, iLookAtTimer)
|
|
|
|
TASK_CLEAR_LOOK_AT(PedIndex)
|
|
|
|
iIntervalTime = GET_RANDOM_INT_IN_RANGE(iMinIntervalTimer, iMaxIntervalTime)
|
|
|
|
iIntervalTimer = GET_GAME_TIMER()
|
|
|
|
bLookAtFlag = FALSE
|
|
|
|
// #IF IS_DEBUG_BUILD
|
|
// PRINTLN(GET_THIS_SCRIPT_NAME(), ": Clearing ped look at entity task. Resetting interval time to ", iIntervalTime, ".")
|
|
// #ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC SET_MISSION_PED_PROPERTIES(PED_INDEX PedIndex, REL_GROUP_HASH relGroupHash, BOOL bCanFlyThroughWindscreen, BOOL bKeepRelGroupOnCleanup,
|
|
BOOL bCanBeTargetted, BOOL bIsEnemy)
|
|
|
|
IF DOES_ENTITY_EXIST(PedIndex)
|
|
IF NOT IS_PED_INJURED(PedIndex)
|
|
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(PedIndex, TRUE)
|
|
SET_PED_CONFIG_FLAG(PedIndex, PCF_WillFlyThroughWindscreen, bCanFlyThroughWindscreen)
|
|
SET_PED_CONFIG_FLAG(PedIndex, PCF_KeepRelationshipGroupAfterCleanUp, bKeepRelGroupOnCleanup)
|
|
SET_PED_CAN_BE_TARGETTED(PedIndex, bCanBeTargetted)
|
|
SET_PED_AS_ENEMY(PedIndex, bIsEnemy)
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(PedIndex, relGroupHash)
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Creates a ped or player ped to be used by player and returns TRUE if such pad was created successfully.
|
|
/// PARAMS:
|
|
/// psPed - PED_STRUCT containg ped details, like PED_INDEX, blip, coordinates, heading, model etc.
|
|
/// bPlayerPed - Boolean indicating if a player ped or NPC ped should be created.
|
|
/// relGroupHash - Relationship group hash for the created ped.
|
|
/// bCreateBlip - Boolean indicating if a blip for this ped should be created.
|
|
/// eCharacter - Enum specifying character from story characters list. Use NO_CHARACTER for characters not stored in that list and provide a MODEL_NAMES in PED_STRUCT.
|
|
/// bCanFlyThroughWindscreen - Sets if ped can fly through windscreen when car crashes.
|
|
/// bCanBeTargetted - Sets if ped can be targetted by player.
|
|
/// bIsEnemy - Sets if ped is considered an enemy.
|
|
/// VehicleIndex - Specify a vehicle index if ped should be created inside a vehicle. IF not use NULL.
|
|
/// eVehicleSeat - Vehicle seat enum for peds created in vehicles.
|
|
/// RETURNS:
|
|
/// TRUE if ped was created successfully, FALSE if otherwise.
|
|
FUNC BOOL HAS_MISSION_PED_BEEN_CREATED(PED_STRUCT &psPed, BOOL bPlayerPed, REL_GROUP_HASH relGroupHash, BOOL bCreateBlip, enumCharacterList eCharacter,
|
|
BOOL bCanFlyThroughWindscreen = FALSE, BOOL bCanBeTargetted = FALSE, BOOL bIsEnemy = FALSE, VEHICLE_INDEX VehicleIndex = NULL,
|
|
VEHICLE_SEAT eVehicleSeat = VS_DRIVER, BOOL bKeepRelGroupOnCleanup = TRUE #IF IS_DEBUG_BUILD, STRING sDebugName = NULL #ENDIF)
|
|
|
|
IF ( bPlayerPed = FALSE ) //create non player ped
|
|
|
|
IF NOT DOES_ENTITY_EXIST(psPed.PedIndex)
|
|
|
|
REQUEST_MODEL(psPed.ModelName)
|
|
|
|
IF HAS_MODEL_LOADED(psPed.ModelName)
|
|
|
|
IF ( VehicleIndex = NULL ) //create ped outside of vehicle
|
|
|
|
IF ( eCharacter = NO_CHARACTER ) //use MODEL_NAMES stored in the PED_STRUCT if no character was specified
|
|
|
|
psPed.PedIndex = CREATE_PED(PEDTYPE_MISSION, psPed.ModelName, psPed.vPosition, psPed.fHeading)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(psPed.ModelName)
|
|
|
|
ELSE //use character name to define the ped MODEL_NAMES
|
|
|
|
IF CREATE_NPC_PED_ON_FOOT(psPed.PedIndex, eCharacter, psPed.vPosition, psPed.fHeading)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(psPed.ModelName)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(psPed.PedIndex)
|
|
|
|
SET_MISSION_PED_PROPERTIES(psPed.PedIndex, relGroupHash, bCanFlyThroughWindscreen, bKeepRelGroupOnCleanup,
|
|
bCanBeTargetted, bIsEnemy)
|
|
|
|
IF ( bCreateBlip = TRUE )
|
|
psPed.BlipIndex = CREATE_BLIP_FOR_ENTITY(psPed.PedIndex, FALSE)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
IF NOT Is_String_Null_Or_Empty(sDebugName)
|
|
SET_PED_NAME_DEBUG(psPed.PedIndex, sDebugName)
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created mission ped ", sDebugName, " with model ", GET_MODEL_NAME_FOR_DEBUG(psPed.ModelName), " at coordinates ", psPed.vPosition, ".")
|
|
ELSE
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created mission ped with model ", GET_MODEL_NAME_FOR_DEBUG(psPed.ModelName), " at coordinates ", psPed.vPosition, ".")
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
ELIF ( VehicleIndex != NULL ) //create ped in a vehicle
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(VehicleIndex)
|
|
|
|
IF ( eCharacter = NO_CHARACTER ) //use MODEL_NAMES stored in the PED_STRUCT
|
|
|
|
psPed.PedIndex = CREATE_PED_INSIDE_VEHICLE(VehicleIndex, PEDTYPE_MISSION, psPed.ModelName, eVehicleSeat)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(psPed.ModelName)
|
|
|
|
ELSE //use character name to define the ped MODEL_NAMES
|
|
|
|
IF CREATE_NPC_PED_INSIDE_VEHICLE(psPed.PedIndex, eCharacter, VehicleIndex, eVehicleSeat)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(psPed.ModelName)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(psPed.PedIndex)
|
|
|
|
SET_MISSION_PED_PROPERTIES(psPed.PedIndex, relGroupHash, bCanFlyThroughWindscreen, bKeepRelGroupOnCleanup,
|
|
bCanBeTargetted, bIsEnemy)
|
|
|
|
IF ( bCreateBlip = TRUE )
|
|
psPed.BlipIndex = CREATE_BLIP_FOR_ENTITY(psPed.PedIndex, FALSE)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
IF NOT Is_String_Null_Or_Empty(sDebugName)
|
|
SET_PED_NAME_DEBUG(psPed.PedIndex, sDebugName)
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created mission ped ", sDebugName, " with model ", GET_MODEL_NAME_FOR_DEBUG(psPed.ModelName), " in vehicle.")
|
|
ELSE
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created mission ped with model ", GET_MODEL_NAME_FOR_DEBUG(psPed.ModelName), " in vehicle.")
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
//if the ped already exists return true
|
|
RETURN TRUE
|
|
|
|
ENDIF
|
|
|
|
|
|
ELIF ( bPlayerPed = TRUE ) //create player ped, for example a ped that player can hotswap to and take control of
|
|
|
|
IF NOT DOES_ENTITY_EXIST(psPed.PedIndex)
|
|
|
|
IF ( VehicleIndex = NULL ) //create player ped outside of vehicle
|
|
|
|
IF CREATE_PLAYER_PED_ON_FOOT(psPed.PedIndex, eCharacter, psPed.vPosition, psPed.fHeading, TRUE)
|
|
|
|
SET_MISSION_PED_PROPERTIES(psPed.PedIndex, relGroupHash, bCanFlyThroughWindscreen, bKeepRelGroupOnCleanup,
|
|
bCanBeTargetted, bIsEnemy)
|
|
|
|
IF ( bCreateBlip = TRUE )
|
|
psPed.BlipIndex = CREATE_BLIP_FOR_ENTITY(psPed.PedIndex, FALSE)
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
IF NOT Is_String_Null_Or_Empty(sDebugName)
|
|
SET_PED_NAME_DEBUG(psPed.PedIndex, sDebugName)
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created player ped ", sDebugName, " with model ", GET_MODEL_NAME_FOR_DEBUG(psPed.ModelName), " at coordinates ", psPed.vPosition, ".")
|
|
ELSE
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created player ped with model ", GET_MODEL_NAME_FOR_DEBUG(psPed.ModelName), " at coordinates ", psPed.vPosition, ".")
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
RETURN TRUE
|
|
|
|
ENDIF
|
|
|
|
ELIF ( VehicleIndex != NULL ) //create player ped in a vehicle
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(VehicleIndex)
|
|
|
|
IF CREATE_PLAYER_PED_INSIDE_VEHICLE(psPed.PedIndex, eCharacter, VehicleIndex, eVehicleSeat, TRUE)
|
|
|
|
SET_MISSION_PED_PROPERTIES(psPed.PedIndex, relGroupHash, bCanFlyThroughWindscreen, bKeepRelGroupOnCleanup,
|
|
bCanBeTargetted, bIsEnemy)
|
|
|
|
IF ( bCreateBlip = TRUE )
|
|
psPed.BlipIndex = CREATE_BLIP_FOR_ENTITY(psPed.PedIndex, FALSE)
|
|
ENDIF
|
|
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
IF NOT Is_String_Null_Or_Empty(sDebugName)
|
|
SET_PED_NAME_DEBUG(psPed.PedIndex, sDebugName)
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created player ped ", sDebugName, " in vehicle with model ", GET_MODEL_NAME_FOR_DEBUG(psPed.ModelName), ".")
|
|
ELSE
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created player ped in vehicle with model ", GET_MODEL_NAME_FOR_DEBUG(psPed.ModelName), ".")
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
RETURN TRUE
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
//if the ped already exists, return true
|
|
RETURN TRUE
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Creates vehicle to be used on a mission by player and returns TRUE if such vehicle was created successfully.
|
|
/// PARAMS:
|
|
/// vsVehicle - VEH_STRUCT containing model, position and heading of the vehicle.
|
|
/// bPlayerVehicle - If set to TRUE will create player specific vehicles using CREATE_PLAYER_VEHICLE()
|
|
/// bCarStealVehicle - If set to TRUE will create car steal strand vehicle with a specific command. Works when bPlayerVehicle is FALSE.
|
|
/// eCharacter - Character enum indicating which character specific vehicle to create.
|
|
/// bMissionCritical - Sets the vehicle to be unable to leak oil/petrol and break off doors. Set to TRUE to stop these damage types to vehicle.
|
|
/// iColourCombination - Colour combination of the vehicle.
|
|
/// iColour1 - Colour 1 of the vehicle.
|
|
/// iColour2 - Colour 2 of the vehicle.
|
|
/// RETURNS:
|
|
/// TRUE if vehicle was created, FALSE if otherwise.
|
|
FUNC BOOL HAS_MISSION_VEHICLE_BEEN_CREATED(VEH_STRUCT &vsVehicle, BOOL bPlayerVehicle = FALSE, BOOL bCarStealVehicle = FALSE, enumCharacterList eCharacter = CHAR_MICHAEL,
|
|
BOOL bMissionCritical = TRUE, INT iColourCombination = -1, INT iColour1 = -1, INT iColour2 = -1
|
|
#IF IS_DEBUG_BUILD, STRING sDebugName = NULL #ENDIF)
|
|
|
|
//create any vehicle that can be used on a mission by player
|
|
IF ( bPlayerVehicle = FALSE )
|
|
|
|
IF NOT DOES_ENTITY_EXIST(vsVehicle.VehicleIndex)
|
|
|
|
REQUEST_MODEL(vsVehicle.ModelName)
|
|
|
|
IF HAS_MODEL_LOADED(vsVehicle.ModelName)
|
|
|
|
IF( bCarStealVehicle = TRUE )
|
|
|
|
vsVehicle.VehicleIndex = CREATE_CAR_STEAL_STRAND_CAR(vsVehicle.ModelName, vsVehicle.vPosition, vsVehicle.fHeading)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(vsVehicle.ModelName)
|
|
|
|
ELSE
|
|
|
|
IF ( eCharacter = NO_CHARACTER )
|
|
|
|
vsVehicle.VehicleIndex = CREATE_VEHICLE(vsVehicle.ModelName, vsVehicle.vPosition, vsVehicle.fHeading)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(vsVehicle.ModelName)
|
|
|
|
ELSE //create npc vehicle based on the character enum specified
|
|
|
|
IF CREATE_NPC_VEHICLE(vsVehicle.VehicleIndex, eCharacter, vsVehicle.vPosition, vsVehicle.fHeading)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(vsVehicle.ModelName)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(vsVehicle.VehicleIndex)
|
|
|
|
//set vehicle colours, if they are provided
|
|
IF ( iColour1 != -1)
|
|
AND ( iColour2 != -1 )
|
|
SET_VEHICLE_COLOURS(vsVehicle.VehicleIndex, iColour1, iColour2)
|
|
ENDIF
|
|
|
|
//set vehicle colour combination, if it is provided
|
|
IF ( iColourCombination != -1 )
|
|
SET_VEHICLE_COLOUR_COMBINATION(vsVehicle.VehicleIndex, iColourCombination)
|
|
ENDIF
|
|
|
|
SET_VEHICLE_HAS_STRONG_AXLES(vsVehicle.VehicleIndex, bMissionCritical)
|
|
|
|
//limit damage that can be done to the vehicle
|
|
SET_VEHICLE_CAN_LEAK_OIL(vsVehicle.VehicleIndex, NOT bMissionCritical)
|
|
SET_VEHICLE_CAN_LEAK_PETROL(vsVehicle.VehicleIndex, NOT bMissionCritical)
|
|
|
|
//make the vehicle not attach to tow truck if mission critical
|
|
SET_VEHICLE_AUTOMATICALLY_ATTACHES(vsVehicle.VehicleIndex, NOT bMissionCritical)
|
|
|
|
IF IS_THIS_MODEL_A_CAR(vsVehicle.ModelName)
|
|
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(vsVehicle.VehicleIndex, SC_DOOR_FRONT_LEFT, NOT bMissionCritical)
|
|
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(vsVehicle.VehicleIndex, SC_DOOR_FRONT_RIGHT, NOT bMissionCritical)
|
|
ENDIF
|
|
|
|
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)
|
|
|
|
//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 SET_PLAYER_PED_OUTFIT(MISSION_OUTFITS eOutfit)
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
|
|
SWITCH eOutfit
|
|
|
|
CASE MO_MISSION_START
|
|
|
|
RESTORE_MISSION_START_OUTFIT()
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Restoring player ped mission start outfit.")
|
|
#ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE MO_DEFAULT
|
|
|
|
RESTORE_PLAYER_PED_VARIATIONS(PLAYER_PED_ID())
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Restoring default player ped variation.")
|
|
#ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE MO_YOGA
|
|
|
|
SET_PLAYER_PED_VARIATIONS_FOR_YOGA(PLAYER_PED_ID())
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting player ped variation to OUTFIT_P0_YOGA.")
|
|
#ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE MO_YOGA_FLIP_FLOPS
|
|
|
|
SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P0_YOGA_FLIP_FLOPS, FALSE)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting player ped variation to OUTFIT_P0_YOGA_FLIP_FLOPS.")
|
|
#ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE MO_UNDERWEAR
|
|
|
|
SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_PROPS, PROPS_HEAD_NONE, FALSE)
|
|
SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_PROPS, PROPS_EYES_NONE, FALSE)
|
|
SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P0_BARECHEST_BOXERS, FALSE)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting player ped variation to OUTFIT_P0_BARECHEST_BOXERS.")
|
|
#ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE MO_MISSION_END
|
|
|
|
SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P0_LEATHER_AND_JEANS, FALSE)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting player ped variation to OUTFIT_P0_LEATHER_AND_JEANS.")
|
|
#ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
STORE_PLAYER_PED_VARIATIONS(PLAYER_PED_ID(), TRUE)
|
|
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
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
|
|
|
|
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("FAM5", MISSION_TEXT_SLOT)
|
|
|
|
REQUEST_ADDITIONAL_TEXT("FAM5AUD", MISSION_DIALOGUE_TEXT_SLOT)
|
|
|
|
WHILE NOT HAS_ADDITIONAL_TEXT_LOADED(MISSION_TEXT_SLOT)
|
|
OR NOT HAS_ADDITIONAL_TEXT_LOADED(MISSION_DIALOGUE_TEXT_SLOT)
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
IF HAS_ADDITIONAL_TEXT_LOADED(MISSION_DIALOGUE_TEXT_SLOT)
|
|
ENDIF
|
|
|
|
REGISTER_SCRIPT_WITH_AUDIO(TRUE)
|
|
|
|
SETUP_MISSION_SFX()
|
|
|
|
//suppress player's car model
|
|
SET_VEHICLE_MODEL_IS_SUPPRESSED(GET_PLAYER_VEH_MODEL(CHAR_MICHAEL), TRUE)
|
|
|
|
//suppress burger shot drug dealer ped model
|
|
SET_PED_MODEL_IS_SUPPRESSED(U_M_Y_BURGERDRUG_01, TRUE)
|
|
|
|
DISABLE_VEHICLE_GEN_ON_MISSION(TRUE)
|
|
IF IS_SCREEN_FADED_OUT()
|
|
DELETE_VEHICLE_GEN_VEHICLE(VEHGEN_MICHAEL_SAVEHOUSE)
|
|
DELETE_ALL_SCRIPT_CREATED_PLAYER_VEHICLES(CHAR_MICHAEL)
|
|
ENDIF
|
|
|
|
SET_PLAYER_PED_DATA_IN_CUTSCENES(FALSE, TRUE)
|
|
INFORM_MISSION_STATS_OF_DAMAGE_WATCH_ENTITY(PLAYER_PED_ID(), FAM5_DAMAGE)
|
|
|
|
//get information about vehicle gen at Michael's house
|
|
GET_VEHICLE_GEN_DATA(sVehicleGenDataStruct, VEHGEN_MICHAEL_SAVEHOUSE)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": sVehicleGenDataStruct.coords: ", sVehicleGenDataStruct.coords, ".")
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": sVehicleGenDataStruct.heading: ", sVehicleGenDataStruct.heading, ".")
|
|
#ENDIF
|
|
|
|
SET_STATIC_EMITTER_ENABLED("SE_MICHAELS_HOUSE_RADIO", FALSE)
|
|
|
|
IF ( BurgerShotScenarioBlockingIndex = NULL )
|
|
BurgerShotScenarioBlockingIndex = CREATE_SCENARIO_BLOCKING_AREA(<< -1181.24, -884.43, 12.80 >>, << 2.0, 2.0, 2.0 >>)
|
|
CLEAR_AREA_OF_PEDS(<< -1181.24, -884.43, 12.80 >>, 2.0)
|
|
ENDIF
|
|
|
|
IF ( ParkScenarioBlockingIndex = NULL )
|
|
ParkScenarioBlockingIndex = CREATE_SCENARIO_BLOCKING_AREA(<< -964.29, 307.89, 70.39 >>, << 16.0, 6.0, 3.0 >>)
|
|
CLEAR_AREA_OF_PEDS(<< -964.29, 307.89, 70.39 >>, 10.0)
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(FALSE)
|
|
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.vStageStart, MissionPosition.fStartHeading, FALSE, TRUE, FALSE)
|
|
|
|
IF ( bStageSkippedTo = TRUE )
|
|
//pin the interior at player start position for stages starting in interiors or requiring interiors
|
|
IF ( eStage = MISSION_STAGE_CUTSCENE_INTRO )
|
|
OR ( eStage = MISSION_STAGE_GOTO_JIMMYS_ROOM )
|
|
OR ( eStage = MISSION_STAGE_CUTSCENE_JIMMYS_ROOM )
|
|
OR ( eStage = MISSION_STAGE_GOTO_BURGER_SHOT )
|
|
|
|
SWITCH eStage
|
|
|
|
CASE MISSION_STAGE_CUTSCENE_INTRO
|
|
CASE MISSION_STAGE_CUTSCENE_JIMMYS_ROOM
|
|
CASE MISSION_STAGE_GOTO_BURGER_SHOT
|
|
CASE MISSION_STAGE_CUTSCENE_END_1
|
|
vInteriorPosition = MissionPosition.vStageStart
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_GOTO_JIMMYS_ROOM
|
|
vInteriorPosition = psJimmy.vPosition
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
WHILE NOT IS_INTERIOR_READY(GET_INTERIOR_AT_COORDS(vInteriorPosition))
|
|
|
|
PIN_INTERIOR_IN_MEMORY(GET_INTERIOR_AT_COORDS(vInteriorPosition))
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Pinning interior at coordinates ", vInteriorPosition, " in memory.")
|
|
#ENDIF
|
|
|
|
WAIT(0)
|
|
|
|
ENDWHILE
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SWITCH eStage
|
|
CASE MISSION_STAGE_PRE_TIMELAPSE
|
|
CASE MISSION_STAGE_TIMELAPSE
|
|
CASE MISSION_STAGE_CUTSCENE_INTRO
|
|
CASE MISSION_STAGE_YOGA_WARRIOR
|
|
CASE MISSION_STAGE_CUTSCENE_TRIANGLE
|
|
CASE MISSION_STAGE_YOGA_TRIANGLE
|
|
CASE MISSION_STAGE_CUTSCENE_SUNSALUTATION
|
|
CASE MISSION_STAGE_YOGA_SUNSALUTATION
|
|
CASE MISSION_STAGE_CUTSCENE_POOL
|
|
CASE MISSION_STAGE_GOTO_JIMMYS_ROOM
|
|
CASE MISSION_STAGE_CUTSCENE_JIMMYS_ROOM
|
|
CASE MISSION_STAGE_GOTO_BURGER_SHOT
|
|
SET_BUILDING_STATE(BUILDINGNAME_IPL_YOGA_GAME, BUILDINGSTATE_NORMAL) //unhide yoga props
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
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
|
|
|
|
bTimelapseCutsceneSkipped = FALSE
|
|
bIntroCutsceneAssetsRequested = FALSE
|
|
|
|
ENDIF
|
|
|
|
IF ( bStageReplayed = TRUE )
|
|
START_REPLAY_SETUP( MissionPosition.vStageStart, MissionPosition.fStartHeading)
|
|
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_TIMELAPSE
|
|
CASE MISSION_STAGE_TIMELAPSE
|
|
CASE MISSION_STAGE_CUTSCENE_INTRO
|
|
|
|
IF IS_REPEAT_PLAY_ACTIVE() //on repeat play request the yoga outfit before intro cutscene and check if it is streamed in
|
|
|
|
IF NOT IS_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P0_YOGA)
|
|
SET_PLAYER_PED_OUTFIT(MO_YOGA)
|
|
ENDIF
|
|
IF IS_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P0_YOGA)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Waiting for all streaming requests to be completed for player ped OUTFIT_P0_YOGA.")
|
|
#ENDIF
|
|
|
|
IF HAVE_ALL_STREAMING_REQUESTS_COMPLETED(PLAYER_PED_ID())
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": All streaming requests completed for player ped OUTFIT_P0_YOGA.")
|
|
#ENDIF
|
|
|
|
iSetupProgress++
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
iSetupProgress++
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_YOGA_WARRIOR
|
|
CASE MISSION_STAGE_CUTSCENE_TRIANGLE
|
|
CASE MISSION_STAGE_YOGA_TRIANGLE
|
|
CASE MISSION_STAGE_CUTSCENE_SUNSALUTATION
|
|
CASE MISSION_STAGE_YOGA_SUNSALUTATION
|
|
CASE MISSION_STAGE_CUTSCENE_POOL
|
|
|
|
IF HAS_MISSION_PED_BEEN_CREATED(psAmanda, FALSE, RELGROUPHASH_PLAYER, FALSE, CHAR_AMANDA)
|
|
|
|
FailFlags[MISSION_FAIL_AMANDA_DEAD] = TRUE
|
|
|
|
IF HAS_MISSION_PED_BEEN_CREATED(psFabien, FALSE, RELGROUPHASH_PLAYER, FALSE, NO_CHARACTER)
|
|
|
|
FailFlags[MISSION_FAIL_FABIEN_DEAD] = TRUE
|
|
FailFlags[MISSION_FAIL_YOGA_FAILED] = TRUE
|
|
|
|
IF HAS_MISSION_OBJECT_BEEN_CREATED(osYogaMats[0])
|
|
AND HAS_MISSION_OBJECT_BEEN_CREATED(osYogaMats[1])
|
|
AND HAS_MISSION_OBJECT_BEEN_CREATED(osYogaMats[2])
|
|
|
|
IF ( bBuddiesYogaOutfitsSet = FALSE )
|
|
IF NOT IS_PED_INJURED(psAmanda.PedIndex)
|
|
SET_PED_COMPONENT_VARIATION(psAmanda.PedIndex, PED_COMP_HAIR, 4, 0, 0)
|
|
SET_PED_COMPONENT_VARIATION(psAmanda.PedIndex, PED_COMP_TORSO, 1, 0, 0)
|
|
SET_PED_COMPONENT_VARIATION(psAmanda.PedIndex, PED_COMP_LEG, 1, 0, 0)
|
|
SET_PED_COMPONENT_VARIATION(psAmanda.PedIndex, PED_COMP_DECL, 1, 0, 0)
|
|
ENDIF
|
|
IF NOT IS_PED_INJURED(psFabien.PedIndex)
|
|
SET_PED_COMPONENT_VARIATION(psFabien.PedIndex, PED_COMP_HEAD, 0, 0, 0)
|
|
SET_PED_COMPONENT_VARIATION(psFabien.PedIndex, PED_COMP_TORSO, 0, 0, 0)
|
|
SET_PED_COMPONENT_VARIATION(psFabien.PedIndex, PED_COMP_LEG, 0, 0, 0)
|
|
ENDIF
|
|
bBuddiesYogaOutfitsSet = TRUE
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
SET_FORCE_FOOTSTEP_UPDATE(PLAYER_PED_ID(), TRUE)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(psAmanda.PedIndex)
|
|
SET_FORCE_FOOTSTEP_UPDATE(psAmanda.PedIndex, TRUE)
|
|
SET_RAGDOLL_BLOCKING_FLAGS(psAmanda.PedIndex, RBF_PLAYER_BUMP)
|
|
SET_RAGDOLL_BLOCKING_FLAGS(psAmanda.PedIndex, RBF_PLAYER_IMPACT)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(psFabien.PedIndex)
|
|
SET_FORCE_FOOTSTEP_UPDATE(psFabien.PedIndex, TRUE)
|
|
SET_RAGDOLL_BLOCKING_FLAGS(psFabien.PedIndex, RBF_PLAYER_BUMP)
|
|
SET_RAGDOLL_BLOCKING_FLAGS(psFabien.PedIndex, RBF_PLAYER_IMPACT)
|
|
ENDIF
|
|
|
|
iSetupProgress++
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_GOTO_JIMMYS_ROOM
|
|
|
|
IF HAS_MISSION_PED_BEEN_CREATED(psJimmy, FALSE, RELGROUPHASH_PLAYER, FALSE, CHAR_JIMMY)
|
|
|
|
FailFlags[MISSION_FAIL_JIMMY_DEAD] = TRUE
|
|
FailFlags[MISSION_FAIL_JIMMY_LEFT_BEHIND] = TRUE
|
|
|
|
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsMichaelsCar, TRUE, FALSE, CHAR_MICHAEL)
|
|
|
|
FailFlags[MISSION_FAIL_MICHAELS_CAR_DEAD] = TRUE
|
|
FailFlags[MISSION_FAIL_MICHAELS_CAR_UNDRIVEABLE] = TRUE
|
|
|
|
IF HAS_MISSION_OBJECT_BEEN_CREATED(osYogaMats[0])
|
|
AND HAS_MISSION_OBJECT_BEEN_CREATED(osYogaMats[1])
|
|
AND HAS_MISSION_OBJECT_BEEN_CREATED(osYogaMats[2])
|
|
|
|
INFORM_MISSION_STATS_OF_SPEED_WATCH_ENTITY(vsMichaelsCar.VehicleIndex)
|
|
INFORM_MISSION_STATS_OF_DAMAGE_WATCH_ENTITY(vsMichaelsCar.VehicleIndex, FAM5_CAR_DAMAGE)
|
|
|
|
iSetupProgress++
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_CUTSCENE_JIMMYS_ROOM
|
|
|
|
IF HAS_MISSION_PED_BEEN_CREATED(psJimmy, FALSE, RELGROUPHASH_PLAYER, FALSE, CHAR_JIMMY)
|
|
|
|
FailFlags[MISSION_FAIL_JIMMY_DEAD] = TRUE
|
|
FailFlags[MISSION_FAIL_JIMMY_LEFT_BEHIND] = TRUE
|
|
|
|
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsMichaelsCar, TRUE, FALSE, CHAR_MICHAEL)
|
|
|
|
FailFlags[MISSION_FAIL_MICHAELS_CAR_DEAD] = TRUE
|
|
FailFlags[MISSION_FAIL_MICHAELS_CAR_UNDRIVEABLE] = TRUE
|
|
|
|
IF HAS_MISSION_OBJECT_BEEN_CREATED(osYogaMats[0])
|
|
AND HAS_MISSION_OBJECT_BEEN_CREATED(osYogaMats[1])
|
|
AND HAS_MISSION_OBJECT_BEEN_CREATED(osYogaMats[2])
|
|
AND HAS_MISSION_OBJECT_BEEN_CREATED(osGamepad)
|
|
AND HAS_MISSION_OBJECT_BEEN_CREATED(osHeadset)
|
|
|
|
INFORM_MISSION_STATS_OF_SPEED_WATCH_ENTITY(vsMichaelsCar.VehicleIndex)
|
|
INFORM_MISSION_STATS_OF_DAMAGE_WATCH_ENTITY(vsMichaelsCar.VehicleIndex, FAM5_CAR_DAMAGE)
|
|
|
|
iSetupProgress++
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_GOTO_BURGER_SHOT
|
|
|
|
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsMichaelsCar, TRUE, FALSE, CHAR_MICHAEL)
|
|
|
|
FailFlags[MISSION_FAIL_MICHAELS_CAR_DEAD] = TRUE
|
|
FailFlags[MISSION_FAIL_MICHAELS_CAR_UNDRIVEABLE] = TRUE
|
|
FailFlags[MISSION_FAIL_MICHAELS_CAR_LEFT_BEHIND] = TRUE
|
|
|
|
IF HAS_MISSION_PED_BEEN_CREATED(psJimmy, FALSE, RELGROUPHASH_PLAYER, FALSE, CHAR_JIMMY)
|
|
|
|
FailFlags[MISSION_FAIL_JIMMY_DEAD] = TRUE
|
|
FailFlags[MISSION_FAIL_JIMMY_LEFT_BEHIND] = TRUE
|
|
|
|
IF NOT IS_PED_INJURED(psJimmy.PedIndex)
|
|
SET_ENTITY_LOD_DIST(psJimmy.PedIndex, 150)
|
|
SET_PED_LOD_MULTIPLIER(psJimmy.PedIndex, 5.0)
|
|
ENDIF
|
|
|
|
IF HAS_MISSION_OBJECT_BEEN_CREATED(osYogaMats[0])
|
|
AND HAS_MISSION_OBJECT_BEEN_CREATED(osYogaMats[1])
|
|
AND HAS_MISSION_OBJECT_BEEN_CREATED(osYogaMats[2])
|
|
AND HAS_MISSION_OBJECT_BEEN_CREATED(osGamepad, TRUE)
|
|
AND HAS_MISSION_OBJECT_BEEN_CREATED(osHeadset, TRUE)
|
|
|
|
INFORM_MISSION_STATS_OF_SPEED_WATCH_ENTITY(vsMichaelsCar.VehicleIndex)
|
|
INFORM_MISSION_STATS_OF_DAMAGE_WATCH_ENTITY(vsMichaelsCar.VehicleIndex, FAM5_CAR_DAMAGE)
|
|
|
|
iSetupProgress++
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_CUTSCENE_BURGER_SHOT
|
|
|
|
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsMichaelsCar, TRUE, FALSE, CHAR_MICHAEL)
|
|
|
|
FailFlags[MISSION_FAIL_MICHAELS_CAR_DEAD] = TRUE
|
|
FailFlags[MISSION_FAIL_MICHAELS_CAR_UNDRIVEABLE] = TRUE
|
|
FailFlags[MISSION_FAIL_MICHAELS_CAR_LEFT_BEHIND] = TRUE
|
|
|
|
IF HAS_MISSION_PED_BEEN_CREATED(psJimmy, FALSE, RELGROUPHASH_PLAYER, FALSE, CHAR_JIMMY, FALSE, FALSE, FALSE, vsMichaelsCar.VehicleIndex, VS_FRONT_RIGHT)
|
|
|
|
FailFlags[MISSION_FAIL_JIMMY_DEAD] = TRUE
|
|
FailFlags[MISSION_FAIL_JIMMY_LEFT_BEHIND] = TRUE
|
|
|
|
IF NOT IS_PED_INJURED(psJimmy.PedIndex)
|
|
SET_ENTITY_LOD_DIST(psJimmy.PedIndex, 150)
|
|
SET_PED_LOD_MULTIPLIER(psJimmy.PedIndex, 5.0)
|
|
ENDIF
|
|
|
|
IF HAS_MISSION_PED_BEEN_CREATED(psDealer, FALSE, RELGROUPHASH_PLAYER, FALSE, NO_CHARACTER)
|
|
AND HAS_MISSION_OBJECT_BEEN_CREATED(osBSDoorDummy)
|
|
|
|
IF ( bStageSkippedTo = TRUE OR bStageReplayed = TRUE )
|
|
IF NOT IS_PED_INJURED(psDealer.PedIndex)
|
|
SET_PED_PROP_INDEX(psDealer.PedIndex, ANCHOR_HEAD, 0, 0)
|
|
SET_PED_PROP_INDEX(psDealer.PedIndex, ANCHOR_EYES, 0, 0)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
FailFlags[MISSION_FAIL_DEALER_DEAD] = TRUE
|
|
FailFlags[MISSION_FAIL_DEALER_SCARED] = TRUE
|
|
FailFlags[MISSION_FAIL_DEALER_ATTACKED] = TRUE
|
|
|
|
INFORM_MISSION_STATS_OF_SPEED_WATCH_ENTITY(vsMichaelsCar.VehicleIndex)
|
|
INFORM_MISSION_STATS_OF_DAMAGE_WATCH_ENTITY(vsMichaelsCar.VehicleIndex, FAM5_CAR_DAMAGE)
|
|
|
|
iSetupProgress++
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_DRIVE_HOME
|
|
|
|
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsMichaelsCar, TRUE, FALSE, CHAR_MICHAEL)
|
|
|
|
FailFlags[MISSION_FAIL_MICHAELS_CAR_DEAD] = TRUE
|
|
FailFlags[MISSION_FAIL_MICHAELS_CAR_UNDRIVEABLE] = TRUE
|
|
FailFlags[MISSION_FAIL_MICHAELS_CAR_LEFT_BEHIND] = TRUE
|
|
|
|
IF HAS_MISSION_PED_BEEN_CREATED(psJimmy, FALSE, RELGROUPHASH_PLAYER, FALSE, CHAR_JIMMY, FALSE, FALSE, FALSE, vsMichaelsCar.VehicleIndex, VS_FRONT_RIGHT)
|
|
|
|
FailFlags[MISSION_FAIL_JIMMY_DEAD] = TRUE
|
|
FailFlags[MISSION_FAIL_JIMMY_LEFT_BEHIND] = TRUE
|
|
|
|
IF NOT IS_PED_INJURED(psJimmy.PedIndex)
|
|
SET_ENTITY_LOD_DIST(psJimmy.PedIndex, 150)
|
|
SET_PED_LOD_MULTIPLIER(psJimmy.PedIndex, 5.0)
|
|
ENDIF
|
|
|
|
IF HAS_MISSION_OBJECT_BEEN_CREATED(osCup)
|
|
|
|
//attach the cup to Jimmy's hand
|
|
IF NOT IS_PED_INJURED(psJimmy.PedIndex)
|
|
ATTACH_ENTITY_TO_ENTITY(osCup.ObjectIndex, psJimmy.PedIndex, GET_PED_BONE_INDEX(psJimmy.PedIndex, BONETAG_PH_L_HAND), << 0.0, 0.0, 0.0 >>, << 0.0, 0.0, 0.0 >>)
|
|
ENDIF
|
|
|
|
INFORM_MISSION_STATS_OF_SPEED_WATCH_ENTITY(vsMichaelsCar.VehicleIndex)
|
|
INFORM_MISSION_STATS_OF_DAMAGE_WATCH_ENTITY(vsMichaelsCar.VehicleIndex, FAM5_CAR_DAMAGE)
|
|
|
|
iSetupProgress++
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_GO_HOME_WASTED
|
|
|
|
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsParkedVehicles[0], FALSE, FALSE, NO_CHARACTER)
|
|
iSetupProgress++
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
CASE MISSION_STAGE_TEST
|
|
|
|
IF HAS_MISSION_VEHICLE_BEEN_CREATED(vsMichaelsCar, TRUE, FALSE, CHAR_MICHAEL)
|
|
|
|
IF HAS_MISSION_PED_BEEN_CREATED(psJimmy, FALSE, RELGROUPHASH_PLAYER, FALSE, CHAR_JIMMY, FALSE, FALSE, FALSE, vsMichaelsCar.VehicleIndex, VS_FRONT_RIGHT)
|
|
|
|
iSetupProgress++
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
#ENDIF
|
|
|
|
DEFAULT
|
|
iSetupProgress++
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
IF ( bJimmysOutfitSet = 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, 0) //(head)
|
|
SET_PED_COMPONENT_VARIATION(psJimmy.PedIndex, PED_COMP_BERD, 3, 0, 0) //(berd)
|
|
SET_PED_COMPONENT_VARIATION(psJimmy.PedIndex, PED_COMP_HAIR, 0, 0, 0) //(hair)
|
|
SET_PED_COMPONENT_VARIATION(psJimmy.PedIndex, PED_COMP_TORSO, 6, 0, 0) //(uppr)
|
|
SET_PED_COMPONENT_VARIATION(psJimmy.PedIndex, PED_COMP_LEG, 0, 2, 0) //(lowr)
|
|
SET_PED_COMPONENT_VARIATION(psJimmy.PedIndex, PED_COMP_HAND, 0, 0, 0) //(hand)
|
|
SET_PED_COMPONENT_VARIATION(psJimmy.PedIndex, PED_COMP_FEET, 0, 2, 0) //(feet)
|
|
SET_PED_COMPONENT_VARIATION(psJimmy.PedIndex, PED_COMP_TEETH, 0, 0, 0) //(teef)
|
|
SET_PED_COMPONENT_VARIATION(psJimmy.PedIndex, PED_COMP_SPECIAL, 0, 0, 0) //(accs)
|
|
SET_PED_COMPONENT_VARIATION(psJimmy.PedIndex, PED_COMP_SPECIAL2, 0, 0, 0) //(task)
|
|
SET_PED_COMPONENT_VARIATION(psJimmy.PedIndex, PED_COMP_DECL, 3, 0, 0) //(decl)
|
|
bJimmysOutfitSet = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
|
|
//handle player ped component variations and setup player's outfit, also handle shops, also handle yoga props IPL
|
|
IF ( iSetupProgress = 5 )
|
|
|
|
SET_ALL_SHOPS_TEMPORARILY_UNAVAILABLE(FALSE) //unblock all shops on skips
|
|
|
|
SWITCH eStage
|
|
|
|
CASE MISSION_STAGE_PRE_TIMELAPSE
|
|
CASE MISSION_STAGE_TIMELAPSE
|
|
CASE MISSION_STAGE_CUTSCENE_INTRO
|
|
IF ( g_eCurrentBuildingState[BUILDINGNAME_IPL_YOGA_GAME] = BUILDINGSTATE_DESTROYED )
|
|
SET_BUILDING_STATE(BUILDINGNAME_IPL_YOGA_GAME, BUILDINGSTATE_NORMAL) //unhide yoga props
|
|
ENDIF
|
|
IF ( g_eCurrentBuildingState[BUILDINGNAME_ES_MIC_JIMMYS_STUFF] = BUILDINGSTATE_DESTROYED )
|
|
OR ( g_eCurrentBuildingState[BUILDINGNAME_ES_MIC_AMANDAS_STUFF] = BUILDINGSTATE_DESTROYED )
|
|
OR ( g_eCurrentBuildingState[BUILDINGNAME_ES_FAMILY5_KITCHEN_BURGERSHOT] = BUILDINGSTATE_DESTROYED )
|
|
SET_BUILDING_STATE(BUILDINGNAME_ES_MIC_JIMMYS_STUFF, BUILDINGSTATE_NORMAL) //unhide amanda's stuff
|
|
SET_BUILDING_STATE(BUILDINGNAME_ES_MIC_AMANDAS_STUFF, BUILDINGSTATE_NORMAL) //unhide jimmy's stuff
|
|
SET_BUILDING_STATE(BUILDINGNAME_ES_MIC_DINING_ROOM_DEAD_FLOWERS, BUILDINGSTATE_NORMAL) // Flowers are ok.
|
|
SET_BUILDING_STATE(BUILDINGNAME_ES_FAMILY5_KITCHEN_BURGERSHOT, BUILDINGSTATE_NORMAL)//hide burger shot stuff
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_YOGA_WARRIOR
|
|
CASE MISSION_STAGE_CUTSCENE_TRIANGLE
|
|
CASE MISSION_STAGE_YOGA_TRIANGLE
|
|
CASE MISSION_STAGE_CUTSCENE_SUNSALUTATION
|
|
CASE MISSION_STAGE_YOGA_SUNSALUTATION
|
|
CASE MISSION_STAGE_CUTSCENE_POOL
|
|
CASE MISSION_STAGE_GOTO_JIMMYS_ROOM
|
|
|
|
IF NOT IS_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P0_YOGA)
|
|
SET_PLAYER_PED_OUTFIT(MO_YOGA)
|
|
ENDIF
|
|
|
|
IF ( g_eCurrentBuildingState[BUILDINGNAME_IPL_YOGA_GAME] = BUILDINGSTATE_DESTROYED )
|
|
SET_BUILDING_STATE(BUILDINGNAME_IPL_YOGA_GAME, BUILDINGSTATE_NORMAL) //unhide yoga props
|
|
ENDIF
|
|
IF ( g_eCurrentBuildingState[BUILDINGNAME_ES_MIC_JIMMYS_STUFF] = BUILDINGSTATE_DESTROYED )
|
|
OR ( g_eCurrentBuildingState[BUILDINGNAME_ES_MIC_AMANDAS_STUFF] = BUILDINGSTATE_DESTROYED )
|
|
OR ( g_eCurrentBuildingState[BUILDINGNAME_ES_FAMILY5_KITCHEN_BURGERSHOT] = BUILDINGSTATE_DESTROYED )
|
|
SET_BUILDING_STATE(BUILDINGNAME_ES_MIC_JIMMYS_STUFF, BUILDINGSTATE_NORMAL) //unhide amanda's stuff
|
|
SET_BUILDING_STATE(BUILDINGNAME_ES_MIC_AMANDAS_STUFF, BUILDINGSTATE_NORMAL) //unhide jimmy's stuff
|
|
SET_BUILDING_STATE(BUILDINGNAME_ES_MIC_DINING_ROOM_DEAD_FLOWERS, BUILDINGSTATE_NORMAL) // Flowers are ok.
|
|
SET_BUILDING_STATE(BUILDINGNAME_ES_FAMILY5_KITCHEN_BURGERSHOT, BUILDINGSTATE_NORMAL) //hide burger shot stuff
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_CUTSCENE_JIMMYS_ROOM
|
|
CASE MISSION_STAGE_GOTO_BURGER_SHOT
|
|
IF ( g_eCurrentBuildingState[BUILDINGNAME_IPL_YOGA_GAME] = BUILDINGSTATE_DESTROYED )
|
|
SET_BUILDING_STATE(BUILDINGNAME_IPL_YOGA_GAME, BUILDINGSTATE_NORMAL) //unhide yoga props
|
|
ENDIF
|
|
IF ( g_eCurrentBuildingState[BUILDINGNAME_ES_MIC_JIMMYS_STUFF] = BUILDINGSTATE_DESTROYED )
|
|
OR ( g_eCurrentBuildingState[BUILDINGNAME_ES_MIC_AMANDAS_STUFF] = BUILDINGSTATE_DESTROYED )
|
|
OR ( g_eCurrentBuildingState[BUILDINGNAME_ES_FAMILY5_KITCHEN_BURGERSHOT] = BUILDINGSTATE_DESTROYED )
|
|
SET_BUILDING_STATE(BUILDINGNAME_ES_MIC_JIMMYS_STUFF, BUILDINGSTATE_NORMAL) //unhide amanda's stuff
|
|
SET_BUILDING_STATE(BUILDINGNAME_ES_MIC_AMANDAS_STUFF, BUILDINGSTATE_NORMAL) //unhide jimmy's stuff
|
|
SET_BUILDING_STATE(BUILDINGNAME_ES_MIC_DINING_ROOM_DEAD_FLOWERS, BUILDINGSTATE_NORMAL)// Flowers are ok.
|
|
SET_BUILDING_STATE(BUILDINGNAME_ES_FAMILY5_KITCHEN_BURGERSHOT, BUILDINGSTATE_NORMAL)//hide burger shot stuff
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_CUTSCENE_BURGER_SHOT
|
|
IF ( g_eCurrentBuildingState[BUILDINGNAME_IPL_YOGA_GAME] = BUILDINGSTATE_NORMAL )
|
|
SET_BUILDING_STATE(BUILDINGNAME_IPL_YOGA_GAME, BUILDINGSTATE_DESTROYED) //hide yoga props
|
|
ENDIF
|
|
IF ( g_eCurrentBuildingState[BUILDINGNAME_ES_MIC_JIMMYS_STUFF] = BUILDINGSTATE_NORMAL )
|
|
OR ( g_eCurrentBuildingState[BUILDINGNAME_ES_MIC_AMANDAS_STUFF] = BUILDINGSTATE_NORMAL )
|
|
OR ( g_eCurrentBuildingState[BUILDINGNAME_ES_FAMILY5_KITCHEN_BURGERSHOT] = BUILDINGSTATE_NORMAL )
|
|
SET_BUILDING_STATE(BUILDINGNAME_ES_MIC_JIMMYS_STUFF, BUILDINGSTATE_DESTROYED) //hide amanda's stuff
|
|
SET_BUILDING_STATE(BUILDINGNAME_ES_MIC_AMANDAS_STUFF, BUILDINGSTATE_DESTROYED) //hide jimmy's stuff
|
|
SET_BUILDING_STATE(BUILDINGNAME_ES_MIC_DINING_ROOM_DEAD_FLOWERS, BUILDINGSTATE_DESTROYED) // Flowers are dead.
|
|
SET_BUILDING_STATE(BUILDINGNAME_ES_FAMILY5_KITCHEN_BURGERSHOT, BUILDINGSTATE_DESTROYED)//unhide burger shot stuff
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_CUTSCENE_BLACKOUT
|
|
CASE MISSION_STAGE_FLIGHT
|
|
CASE MISSION_STAGE_GO_HOME_WASTED
|
|
|
|
SWITCH eStage
|
|
CASE MISSION_STAGE_FLIGHT
|
|
CASE MISSION_STAGE_GO_HOME_WASTED
|
|
//IF NOT IS_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P0_BED)
|
|
IF NOT IS_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P0_BARECHEST_BOXERS)
|
|
SET_PLAYER_PED_OUTFIT(MO_UNDERWEAR)
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF ( g_eCurrentBuildingState[BUILDINGNAME_IPL_YOGA_GAME] = BUILDINGSTATE_NORMAL )
|
|
SET_BUILDING_STATE(BUILDINGNAME_IPL_YOGA_GAME, BUILDINGSTATE_DESTROYED) //hide yoga props
|
|
ENDIF
|
|
IF ( g_eCurrentBuildingState[BUILDINGNAME_ES_MIC_JIMMYS_STUFF] = BUILDINGSTATE_NORMAL )
|
|
OR ( g_eCurrentBuildingState[BUILDINGNAME_ES_MIC_AMANDAS_STUFF] = BUILDINGSTATE_NORMAL )
|
|
OR ( g_eCurrentBuildingState[BUILDINGNAME_ES_FAMILY5_KITCHEN_BURGERSHOT] = BUILDINGSTATE_NORMAL )
|
|
SET_BUILDING_STATE(BUILDINGNAME_ES_MIC_JIMMYS_STUFF, BUILDINGSTATE_DESTROYED) //hide amanda's stuff
|
|
SET_BUILDING_STATE(BUILDINGNAME_ES_MIC_AMANDAS_STUFF, BUILDINGSTATE_DESTROYED) //hide jimmy's stuff
|
|
SET_BUILDING_STATE(BUILDINGNAME_ES_MIC_DINING_ROOM_DEAD_FLOWERS, BUILDINGSTATE_DESTROYED) // Flowers are dead
|
|
SET_BUILDING_STATE(BUILDINGNAME_ES_FAMILY5_KITCHEN_BURGERSHOT, BUILDINGSTATE_DESTROYED) //unhide burger shot stuff
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_CUTSCENE_END_1
|
|
CASE MISSION_STAGE_CUTSCENE_END_2
|
|
IF ( g_eCurrentBuildingState[BUILDINGNAME_IPL_YOGA_GAME] = BUILDINGSTATE_NORMAL )
|
|
SET_BUILDING_STATE(BUILDINGNAME_IPL_YOGA_GAME, BUILDINGSTATE_DESTROYED) //hide yoga props
|
|
ENDIF
|
|
IF ( g_eCurrentBuildingState[BUILDINGNAME_ES_MIC_JIMMYS_STUFF] = BUILDINGSTATE_NORMAL )
|
|
OR ( g_eCurrentBuildingState[BUILDINGNAME_ES_MIC_AMANDAS_STUFF] = BUILDINGSTATE_NORMAL )
|
|
OR ( g_eCurrentBuildingState[BUILDINGNAME_ES_FAMILY5_KITCHEN_BURGERSHOT] = BUILDINGSTATE_NORMAL )
|
|
SET_BUILDING_STATE(BUILDINGNAME_ES_MIC_JIMMYS_STUFF, BUILDINGSTATE_DESTROYED) //hide amanda's stuff
|
|
SET_BUILDING_STATE(BUILDINGNAME_ES_MIC_AMANDAS_STUFF, BUILDINGSTATE_DESTROYED) //hide jimmy's stuff
|
|
SET_BUILDING_STATE(BUILDINGNAME_ES_MIC_DINING_ROOM_DEAD_FLOWERS, BUILDINGSTATE_DESTROYED) // Flowers are dead.
|
|
SET_BUILDING_STATE(BUILDINGNAME_ES_FAMILY5_KITCHEN_BURGERSHOT, BUILDINGSTATE_DESTROYED)//unhide burger shot stuff
|
|
ENDIF
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
//cascade shadows setup
|
|
SWITCH eStage
|
|
CASE MISSION_STAGE_YOGA_WARRIOR
|
|
CASE MISSION_STAGE_YOGA_TRIANGLE
|
|
CASE MISSION_STAGE_YOGA_SUNSALUTATION
|
|
CASCADE_SHADOWS_ENABLE_ENTITY_TRACKER(TRUE)
|
|
CASCADE_SHADOWS_SET_CASCADE_BOUNDS_SCALE(0.35)
|
|
CASCADE_SHADOWS_SET_ENTITY_TRACKER_SCALE(0.65)
|
|
BREAK
|
|
DEFAULT
|
|
CASCADE_SHADOWS_INIT_SESSION()
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
SWITCH eStage
|
|
CASE MISSION_STAGE_CUTSCENE_INTRO
|
|
CASE MISSION_STAGE_YOGA_WARRIOR
|
|
CASE MISSION_STAGE_CUTSCENE_TRIANGLE
|
|
CASE MISSION_STAGE_YOGA_TRIANGLE
|
|
CASE MISSION_STAGE_CUTSCENE_SUNSALUTATION
|
|
CASE MISSION_STAGE_YOGA_SUNSALUTATION
|
|
CASE MISSION_STAGE_CUTSCENE_POOL
|
|
IF ( bStageSkippedTo = TRUE OR bStageReplayed = TRUE )
|
|
SET_WEATHER_TYPE_NOW_PERSIST("EXTRASUNNY")
|
|
ENDIF
|
|
BREAK
|
|
CASE MISSION_STAGE_CUTSCENE_BLACKOUT
|
|
CASE MISSION_STAGE_FLIGHT
|
|
IF ( bStageSkippedTo = TRUE OR bStageReplayed = TRUE )
|
|
SET_WEATHER_TYPE_NOW_PERSIST("CLOUDS")
|
|
ENDIF
|
|
BREAK
|
|
DEFAULT
|
|
CLEAR_WEATHER_TYPE_PERSIST()
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
//handle clothes loading
|
|
//stage was skipped to or is being replayed
|
|
IF ( bStageSkippedTo = TRUE OR bStageReplayed = TRUE )
|
|
|
|
IF ( eStage = MISSION_STAGE_GOTO_JIMMYS_ROOM )
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
SET_PED_WETNESS_HEIGHT(PLAYER_PED_ID(), 2.0)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF HAVE_ALL_STREAMING_REQUESTS_COMPLETED(PLAYER_PED_ID())
|
|
|
|
iSetupProgress++ //move on when all streaming requests have completed
|
|
|
|
ELSE
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Waiting for all streaming requests for player ped.")
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
iSetupProgress++
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
//handle adding mission peds for dialogue depending on mission stage
|
|
//handle cellphone enabling/disabling
|
|
IF ( iSetupProgress = 6 )
|
|
|
|
REMOVE_PED_FOR_DIALOGUE(Family5Conversation, 0)
|
|
REMOVE_PED_FOR_DIALOGUE(Family5Conversation, 1)
|
|
REMOVE_PED_FOR_DIALOGUE(Family5Conversation, 2)
|
|
REMOVE_PED_FOR_DIALOGUE(Family5Conversation, 3)
|
|
REMOVE_PED_FOR_DIALOGUE(Family5Conversation, 4)
|
|
REMOVE_PED_FOR_DIALOGUE(Family5Conversation, 5)
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
ADD_PED_FOR_DIALOGUE(Family5Conversation, 0, PLAYER_PED_ID(), "MICHAEL")
|
|
ENDIF
|
|
|
|
SET_AUDIO_FLAG("DisableAbortConversationForRagdoll", FALSE)
|
|
|
|
SWITCH eStage
|
|
|
|
CASE MISSION_STAGE_PRE_TIMELAPSE
|
|
DISABLE_CELLPHONE(FALSE)
|
|
DISPLAY_RADAR(TRUE)
|
|
DISPLAY_HUD(TRUE)
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_TIMELAPSE
|
|
CASE MISSION_STAGE_CUTSCENE_INTRO
|
|
DISABLE_CELLPHONE(TRUE)
|
|
DISPLAY_RADAR(FALSE)
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_YOGA_WARRIOR
|
|
CASE MISSION_STAGE_YOGA_TRIANGLE
|
|
CASE MISSION_STAGE_YOGA_SUNSALUTATION
|
|
|
|
DISABLE_CELLPHONE(TRUE)
|
|
|
|
IF NOT IS_PED_INJURED(psAmanda.PedIndex)
|
|
ADD_PED_FOR_DIALOGUE(Family5Conversation, 1, psAmanda.PedIndex, "AMANDA")
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(psFabien.PedIndex)
|
|
ADD_PED_FOR_DIALOGUE(Family5Conversation, 3, psFabien.PedIndex, "FABIAN")
|
|
ENDIF
|
|
|
|
DISPLAY_RADAR(FALSE)
|
|
|
|
SET_AUDIO_FLAG("DisableAbortConversationForRagdoll", TRUE)
|
|
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_CUTSCENE_TRIANGLE
|
|
CASE MISSION_STAGE_CUTSCENE_SUNSALUTATION
|
|
CASE MISSION_STAGE_CUTSCENE_POOL
|
|
DISABLE_CELLPHONE(TRUE)
|
|
DISPLAY_RADAR(FALSE)
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_GOTO_JIMMYS_ROOM
|
|
DISABLE_CELLPHONE(FALSE)
|
|
|
|
IF NOT IS_PED_INJURED(psJimmy.PedIndex)
|
|
ADD_PED_FOR_DIALOGUE(Family5Conversation, 2, psJimmy.PedIndex, "JIMMY", FALSE, FALSE)
|
|
ENDIF
|
|
|
|
DISPLAY_RADAR(TRUE)
|
|
DISPLAY_HUD(TRUE)
|
|
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_CUTSCENE_JIMMYS_ROOM
|
|
DISABLE_CELLPHONE(TRUE)
|
|
DISPLAY_RADAR(TRUE)
|
|
DISPLAY_HUD(TRUE)
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_GOTO_BURGER_SHOT
|
|
|
|
DISABLE_CELLPHONE(FALSE)
|
|
|
|
IF NOT IS_PED_INJURED(psJimmy.PedIndex)
|
|
ADD_PED_FOR_DIALOGUE(Family5Conversation, 2, psJimmy.PedIndex, "JIMMY", FALSE, TRUE)
|
|
ENDIF
|
|
|
|
DISPLAY_RADAR(TRUE)
|
|
DISPLAY_HUD(TRUE)
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_CUTSCENE_BURGER_SHOT
|
|
DISABLE_CELLPHONE(TRUE)
|
|
|
|
IF NOT IS_PED_INJURED(psJimmy.PedIndex)
|
|
ADD_PED_FOR_DIALOGUE(Family5Conversation, 2, psJimmy.PedIndex, "JIMMY")
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(psDealer.PedIndex)
|
|
ADD_PED_FOR_DIALOGUE(Family5Conversation, 5, psDealer.PedIndex, "FAM5DEALER")
|
|
ENDIF
|
|
|
|
|
|
DISPLAY_RADAR(TRUE)
|
|
DISPLAY_HUD(TRUE)
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_DRIVE_HOME
|
|
|
|
DISABLE_CELLPHONE(FALSE)
|
|
|
|
IF NOT IS_PED_INJURED(psJimmy.PedIndex)
|
|
ADD_PED_FOR_DIALOGUE(Family5Conversation, 2, psJimmy.PedIndex, "JIMMY")
|
|
ENDIF
|
|
|
|
DISPLAY_RADAR(TRUE)
|
|
DISPLAY_HUD(TRUE)
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_CUTSCENE_BLACKOUT
|
|
CASE MISSION_STAGE_FLIGHT
|
|
DISABLE_CELLPHONE(TRUE)
|
|
DISPLAY_RADAR(FALSE)
|
|
DISPLAY_HUD(FALSE)
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_GO_HOME_WASTED
|
|
DISABLE_CELLPHONE(TRUE)
|
|
DISPLAY_RADAR(FALSE) //initially disabled, will be turned on after waking up
|
|
DISPLAY_HUD(FALSE)
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_CUTSCENE_END_1
|
|
CASE MISSION_STAGE_CUTSCENE_END_2
|
|
DISABLE_CELLPHONE(TRUE)
|
|
DISPLAY_RADAR(TRUE)
|
|
DISPLAY_HUD(TRUE)
|
|
BREAK
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
CASE MISSION_STAGE_TEST
|
|
DISABLE_CELLPHONE(FALSE)
|
|
DISPLAY_RADAR(TRUE)
|
|
|
|
IF NOT IS_PED_INJURED(psJimmy.PedIndex)
|
|
ADD_PED_FOR_DIALOGUE(Family5Conversation, 2, psJimmy.PedIndex, "JIMMY")
|
|
ENDIF
|
|
BREAK
|
|
#ENDIF
|
|
|
|
ENDSWITCH
|
|
|
|
iSetupProgress++
|
|
|
|
ENDIF
|
|
|
|
IF ( iSetupProgress = 7 )
|
|
|
|
RELEASE_SUPPRESSED_EMERGENCY_CALLS() //by default allow emergency phone calls
|
|
SET_MISSION_FLOW_FLAG_STATE(FLOWFLAG_MOVIE_STUDIO_OPEN, FALSE) //by default allow player to be wanted for driving into the film studio
|
|
|
|
SET_MAX_WANTED_LEVEL(5)
|
|
SET_WANTED_LEVEL_MULTIPLIER(1.0)
|
|
SET_CREATE_RANDOM_COPS(TRUE)
|
|
|
|
RELEASE_SUPPRESSED_EMERGENCY_CALLS()
|
|
|
|
DISABLE_TV_CONTROLS(TV_LOC_JIMMY_BEDROOM, FALSE)
|
|
|
|
SET_PARTICLE_FX_CAM_INSIDE_VEHICLE(FALSE)
|
|
|
|
SWITCH eStage
|
|
|
|
CASE MISSION_STAGE_PRE_TIMELAPSE
|
|
CASE MISSION_STAGE_TIMELAPSE
|
|
CASE MISSION_STAGE_CUTSCENE_INTRO
|
|
|
|
CLEAR_TIMECYCLE_MODIFIER()
|
|
|
|
SET_PED_POPULATION_BUDGET(0)
|
|
SET_VEHICLE_POPULATION_BUDGET(0)
|
|
|
|
iSetupProgress++
|
|
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_YOGA_WARRIOR
|
|
CASE MISSION_STAGE_CUTSCENE_TRIANGLE
|
|
CASE MISSION_STAGE_YOGA_TRIANGLE
|
|
CASE MISSION_STAGE_CUTSCENE_SUNSALUTATION
|
|
CASE MISSION_STAGE_YOGA_SUNSALUTATION
|
|
CASE MISSION_STAGE_CUTSCENE_POOL
|
|
|
|
//CLEAR_TIMECYCLE_MODIFIER()
|
|
|
|
SUPPRESS_EMERGENCY_CALLS()
|
|
|
|
SET_PED_POPULATION_BUDGET(0)
|
|
SET_VEHICLE_POPULATION_BUDGET(0)
|
|
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("FAMILY_5_YOGA_TRANQUIL")
|
|
START_AUDIO_SCENE("FAMILY_5_YOGA_TRANQUIL")
|
|
ENDIF
|
|
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("FAMILY_5_YOGA_MG")
|
|
START_AUDIO_SCENE("FAMILY_5_YOGA_MG")
|
|
ENDIF
|
|
|
|
IF IS_DOOR_REGISTERED_WITH_SYSTEM(ENUM_TO_INT(DOORHASH_M_MANSION_R_L2))
|
|
DOOR_SYSTEM_SET_OPEN_RATIO(ENUM_TO_INT(DOORHASH_M_MANSION_R_L2), -1.0/*-1.2*/, FALSE, FALSE)
|
|
DOOR_SYSTEM_SET_DOOR_STATE(ENUM_TO_INT(DOORHASH_M_MANSION_R_L2), DOORSTATE_LOCKED, FALSE, TRUE)
|
|
ENDIF
|
|
|
|
IF IS_DOOR_REGISTERED_WITH_SYSTEM(ENUM_TO_INT(DOORHASH_M_MANSION_R_R2))
|
|
DOOR_SYSTEM_SET_OPEN_RATIO(ENUM_TO_INT(DOORHASH_M_MANSION_R_R2), 1.0/*1.2*/, FALSE, FALSE)
|
|
DOOR_SYSTEM_SET_DOOR_STATE(ENUM_TO_INT(DOORHASH_M_MANSION_R_R2), DOORSTATE_LOCKED, FALSE, TRUE)
|
|
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
|
|
|
|
iSetupProgress++
|
|
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_GOTO_JIMMYS_ROOM
|
|
|
|
CLEAR_TIMECYCLE_MODIFIER()
|
|
|
|
SUPPRESS_EMERGENCY_CALLS()
|
|
|
|
DISABLE_TV_CONTROLS(TV_LOC_JIMMY_BEDROOM, TRUE)
|
|
|
|
SET_MAX_WANTED_LEVEL(0)
|
|
SET_WANTED_LEVEL_MULTIPLIER(0.0)
|
|
SET_CREATE_RANDOM_COPS(FALSE)
|
|
|
|
SET_PED_POPULATION_BUDGET(3)
|
|
SET_VEHICLE_POPULATION_BUDGET(3)
|
|
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("FAMILY_5_GO_TO_JIMMY")
|
|
START_AUDIO_SCENE("FAMILY_5_GO_TO_JIMMY")
|
|
ENDIF
|
|
|
|
IF NOT IS_DOOR_REGISTERED_WITH_SYSTEM(ENUM_TO_INT(DOORHASH_M_MANSION_SON))
|
|
ADD_DOOR_TO_SYSTEM(ENUM_TO_INT(DOORHASH_M_MANSION_SON), V_ILEV_MM_DOORSON, <<-806.7716, 174.0236, 76.8903>>, FALSE, FALSE)
|
|
ENDIF
|
|
|
|
IF IS_DOOR_REGISTERED_WITH_SYSTEM(ENUM_TO_INT(DOORHASH_M_MANSION_SON))
|
|
DOOR_SYSTEM_SET_OPEN_RATIO(ENUM_TO_INT(DOORHASH_M_MANSION_SON), -1.0, FALSE, FALSE)
|
|
DOOR_SYSTEM_SET_DOOR_STATE(ENUM_TO_INT(DOORHASH_M_MANSION_SON), DOORSTATE_LOCKED, FALSE, TRUE)
|
|
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
|
|
|
|
iSetupProgress++
|
|
|
|
BREAK
|
|
|
|
|
|
CASE MISSION_STAGE_CUTSCENE_JIMMYS_ROOM
|
|
|
|
CLEAR_TIMECYCLE_MODIFIER()
|
|
|
|
SET_PED_POPULATION_BUDGET(3)
|
|
SET_VEHICLE_POPULATION_BUDGET(3)
|
|
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("FAMILY_5_GO_TO_JIMMY")
|
|
START_AUDIO_SCENE("FAMILY_5_GO_TO_JIMMY")
|
|
ENDIF
|
|
|
|
IF NOT IS_DOOR_REGISTERED_WITH_SYSTEM(ENUM_TO_INT(DOORHASH_M_MANSION_SON))
|
|
ADD_DOOR_TO_SYSTEM(ENUM_TO_INT(DOORHASH_M_MANSION_SON), V_ILEV_MM_DOORSON, <<-806.7716, 174.0236, 76.8903>>, FALSE, FALSE)
|
|
ENDIF
|
|
|
|
IF IS_DOOR_REGISTERED_WITH_SYSTEM(ENUM_TO_INT(DOORHASH_M_MANSION_SON))
|
|
DOOR_SYSTEM_SET_OPEN_RATIO(ENUM_TO_INT(DOORHASH_M_MANSION_SON), -1.0, FALSE, FALSE)
|
|
DOOR_SYSTEM_SET_DOOR_STATE(ENUM_TO_INT(DOORHASH_M_MANSION_SON), DOORSTATE_LOCKED, FALSE, TRUE)
|
|
ENDIF
|
|
|
|
IF IS_DOOR_REGISTERED_WITH_SYSTEM(ENUM_TO_INT(DOORHASH_M_MANSION_R_L2))
|
|
DOOR_SYSTEM_SET_OPEN_RATIO(ENUM_TO_INT(DOORHASH_M_MANSION_R_L2), 0.0, FALSE, FALSE)
|
|
DOOR_SYSTEM_SET_DOOR_STATE(ENUM_TO_INT(DOORHASH_M_MANSION_R_L2), DOORSTATE_UNLOCKED, FALSE, TRUE)
|
|
ENDIF
|
|
|
|
IF IS_DOOR_REGISTERED_WITH_SYSTEM(ENUM_TO_INT(DOORHASH_M_MANSION_R_R2))
|
|
DOOR_SYSTEM_SET_OPEN_RATIO(ENUM_TO_INT(DOORHASH_M_MANSION_R_R2), 0.0, FALSE, FALSE)
|
|
DOOR_SYSTEM_SET_DOOR_STATE(ENUM_TO_INT(DOORHASH_M_MANSION_R_R2), DOORSTATE_UNLOCKED, FALSE, TRUE)
|
|
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
|
|
|
|
iSetupProgress++
|
|
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_GOTO_BURGER_SHOT
|
|
|
|
CLEAR_TIMECYCLE_MODIFIER()
|
|
|
|
SET_PED_POPULATION_BUDGET(3)
|
|
SET_VEHICLE_POPULATION_BUDGET(3)
|
|
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("FAMILY_5_GO_TO_JIMMY")
|
|
START_AUDIO_SCENE("FAMILY_5_GO_TO_JIMMY")
|
|
ENDIF
|
|
|
|
SET_VEHICLE_MODEL_IS_SUPPRESSED(POLICE, TRUE)
|
|
|
|
//set vehicle generators to spawn ambient cars around the burger shot area
|
|
SET_VEHICLE_GENERATOR_AREA_OF_INTEREST(<< -1174.32, -887.45, 14.41 >>, 25.0)
|
|
|
|
IF IS_DOOR_REGISTERED_WITH_SYSTEM(ENUM_TO_INT(DOORHASH_M_MANSION_R_L2))
|
|
DOOR_SYSTEM_SET_OPEN_RATIO(ENUM_TO_INT(DOORHASH_M_MANSION_R_L2), 0.0, FALSE, FALSE)
|
|
DOOR_SYSTEM_SET_DOOR_STATE(ENUM_TO_INT(DOORHASH_M_MANSION_R_L2), DOORSTATE_UNLOCKED, FALSE, TRUE)
|
|
ENDIF
|
|
|
|
IF IS_DOOR_REGISTERED_WITH_SYSTEM(ENUM_TO_INT(DOORHASH_M_MANSION_R_R2))
|
|
DOOR_SYSTEM_SET_OPEN_RATIO(ENUM_TO_INT(DOORHASH_M_MANSION_R_R2), 0.0, FALSE, FALSE)
|
|
DOOR_SYSTEM_SET_DOOR_STATE(ENUM_TO_INT(DOORHASH_M_MANSION_R_R2), DOORSTATE_UNLOCKED, FALSE, TRUE)
|
|
ENDIF
|
|
|
|
IF NOT IS_DOOR_REGISTERED_WITH_SYSTEM(ENUM_TO_INT(DOORHASH_M_MANSION_SON))
|
|
ADD_DOOR_TO_SYSTEM(ENUM_TO_INT(DOORHASH_M_MANSION_SON), V_ILEV_MM_DOORSON, <<-806.7716, 174.0236, 76.8903>>, FALSE, FALSE)
|
|
ENDIF
|
|
|
|
IF IS_DOOR_REGISTERED_WITH_SYSTEM(ENUM_TO_INT(DOORHASH_M_MANSION_SON))
|
|
DOOR_SYSTEM_SET_OPEN_RATIO(ENUM_TO_INT(DOORHASH_M_MANSION_SON), -1.0, FALSE, FALSE)
|
|
DOOR_SYSTEM_SET_DOOR_STATE(ENUM_TO_INT(DOORHASH_M_MANSION_SON), DOORSTATE_LOCKED, FALSE, TRUE)
|
|
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
|
|
|
|
iSetupProgress++
|
|
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_CUTSCENE_BURGER_SHOT
|
|
|
|
CLEAR_TIMECYCLE_MODIFIER()
|
|
SET_PARTICLE_FX_CAM_INSIDE_VEHICLE(TRUE)
|
|
|
|
IF IS_PLAYER_PLAYING(PLAYER_ID())
|
|
IF IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
|
|
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
|
|
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SET_MAX_WANTED_LEVEL(0)
|
|
SET_WANTED_LEVEL_MULTIPLIER(0.0)
|
|
SET_CREATE_RANDOM_COPS(FALSE)
|
|
|
|
SET_PED_POPULATION_BUDGET(3)
|
|
SET_VEHICLE_POPULATION_BUDGET(3)
|
|
|
|
SET_VEHICLE_MODEL_IS_SUPPRESSED(POLICE, TRUE)
|
|
|
|
//set vehicle generators to spawn ambient cars around the burger shot area
|
|
SET_VEHICLE_GENERATOR_AREA_OF_INTEREST(<< -1174.32, -887.45, 14.41 >>, 25.0)
|
|
|
|
iSetupProgress++
|
|
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_DRIVE_HOME
|
|
#IF IS_DEBUG_BUILD
|
|
CASE MISSION_STAGE_TEST
|
|
#ENDIF
|
|
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("FAMILY_5_TAKE_JIMMY")
|
|
START_AUDIO_SCENE("FAMILY_5_TAKE_JIMMY")
|
|
ENDIF
|
|
|
|
CLEAR_TIMECYCLE_MODIFIER()
|
|
|
|
SET_MISSION_FLOW_FLAG_STATE(FLOWFLAG_MOVIE_STUDIO_OPEN, TRUE)
|
|
|
|
IF IS_PLAYER_PLAYING(PLAYER_ID())
|
|
IF IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
|
|
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
|
|
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SUPPRESS_EMERGENCY_CALLS()
|
|
|
|
SET_MAX_WANTED_LEVEL(0)
|
|
SET_WANTED_LEVEL_MULTIPLIER(0.0)
|
|
SET_CREATE_RANDOM_COPS(FALSE)
|
|
|
|
SET_PED_POPULATION_BUDGET(3)
|
|
SET_VEHICLE_POPULATION_BUDGET(3)
|
|
|
|
SET_VEHICLE_MODEL_IS_SUPPRESSED(POLICE, TRUE)
|
|
|
|
//set vehicle generators to spawn ambient cars around the burger shot area
|
|
SET_VEHICLE_GENERATOR_AREA_OF_INTEREST(<< -1174.32, -887.45, 14.41 >>, 25.0)
|
|
|
|
iSetupProgress++
|
|
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_CUTSCENE_BLACKOUT
|
|
CASE MISSION_STAGE_FLIGHT
|
|
|
|
IF IS_PLAYER_PLAYING(PLAYER_ID())
|
|
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
|
|
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
|
|
ENDIF
|
|
|
|
SET_PED_POPULATION_BUDGET(3)
|
|
SET_VEHICLE_POPULATION_BUDGET(3)
|
|
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("FAMILY_5_YOGA_ON_DRUGS")
|
|
START_AUDIO_SCENE("FAMILY_5_YOGA_ON_DRUGS")
|
|
ENDIF
|
|
|
|
DISABLE_TAXI_HAILING(TRUE)
|
|
|
|
iSetupProgress++
|
|
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_GO_HOME_WASTED
|
|
|
|
CLEAR_TIMECYCLE_MODIFIER()
|
|
|
|
IF IS_PLAYER_PLAYING(PLAYER_ID())
|
|
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
|
|
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
|
|
ENDIF
|
|
|
|
SET_PED_POPULATION_BUDGET(3)
|
|
SET_VEHICLE_POPULATION_BUDGET(3)
|
|
|
|
//set the time
|
|
ADVANCE_CLOCK_TIME_TO(6, 0, 0)
|
|
|
|
DISABLE_TAXI_HAILING(FALSE)
|
|
|
|
//set vehicle generators to spawn ambient cars in the park parking lot
|
|
SET_VEHICLE_GENERATOR_AREA_OF_INTEREST(<< -941.51, 308.92, 70.21 >>, 10.0)
|
|
|
|
IF IS_DOOR_REGISTERED_WITH_SYSTEM(ENUM_TO_INT(DOORHASH_M_MANSION_R_L2))
|
|
DOOR_SYSTEM_SET_OPEN_RATIO(ENUM_TO_INT(DOORHASH_M_MANSION_R_L2), 0.0, FALSE, FALSE)
|
|
DOOR_SYSTEM_SET_DOOR_STATE(ENUM_TO_INT(DOORHASH_M_MANSION_R_L2), DOORSTATE_UNLOCKED, FALSE, TRUE)
|
|
ENDIF
|
|
|
|
IF IS_DOOR_REGISTERED_WITH_SYSTEM(ENUM_TO_INT(DOORHASH_M_MANSION_R_R2))
|
|
DOOR_SYSTEM_SET_OPEN_RATIO(ENUM_TO_INT(DOORHASH_M_MANSION_R_R2), 0.0, FALSE, FALSE)
|
|
DOOR_SYSTEM_SET_DOOR_STATE(ENUM_TO_INT(DOORHASH_M_MANSION_R_R2), DOORSTATE_UNLOCKED, FALSE, TRUE)
|
|
ENDIF
|
|
|
|
IF NOT IS_DOOR_REGISTERED_WITH_SYSTEM(ENUM_TO_INT(DOORHASH_M_MANSION_SON))
|
|
ADD_DOOR_TO_SYSTEM(ENUM_TO_INT(DOORHASH_M_MANSION_SON), V_ILEV_MM_DOORSON, <<-806.7716, 174.0236, 76.8903>>, FALSE, FALSE)
|
|
ENDIF
|
|
|
|
IF IS_DOOR_REGISTERED_WITH_SYSTEM(ENUM_TO_INT(DOORHASH_M_MANSION_SON))
|
|
DOOR_SYSTEM_SET_OPEN_RATIO(ENUM_TO_INT(DOORHASH_M_MANSION_SON), -1.0, FALSE, FALSE)
|
|
DOOR_SYSTEM_SET_DOOR_STATE(ENUM_TO_INT(DOORHASH_M_MANSION_SON), DOORSTATE_LOCKED, FALSE, TRUE)
|
|
ENDIF
|
|
|
|
iSetupProgress++
|
|
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_CUTSCENE_END_1
|
|
CASE MISSION_STAGE_CUTSCENE_END_2
|
|
|
|
CLEAR_TIMECYCLE_MODIFIER()
|
|
|
|
SET_PED_POPULATION_BUDGET(3)
|
|
SET_VEHICLE_POPULATION_BUDGET(3)
|
|
|
|
IF IS_DOOR_REGISTERED_WITH_SYSTEM(ENUM_TO_INT(DOORHASH_M_MANSION_R_L2))
|
|
DOOR_SYSTEM_SET_OPEN_RATIO(ENUM_TO_INT(DOORHASH_M_MANSION_R_L2), 0.0, FALSE, FALSE)
|
|
DOOR_SYSTEM_SET_DOOR_STATE(ENUM_TO_INT(DOORHASH_M_MANSION_R_L2), DOORSTATE_UNLOCKED, FALSE, TRUE)
|
|
ENDIF
|
|
|
|
IF IS_DOOR_REGISTERED_WITH_SYSTEM(ENUM_TO_INT(DOORHASH_M_MANSION_R_R2))
|
|
DOOR_SYSTEM_SET_OPEN_RATIO(ENUM_TO_INT(DOORHASH_M_MANSION_R_R2), 0.0, FALSE, FALSE)
|
|
DOOR_SYSTEM_SET_DOOR_STATE(ENUM_TO_INT(DOORHASH_M_MANSION_R_R2), DOORSTATE_UNLOCKED, FALSE, TRUE)
|
|
ENDIF
|
|
|
|
IF NOT IS_DOOR_REGISTERED_WITH_SYSTEM(ENUM_TO_INT(DOORHASH_M_MANSION_SON))
|
|
ADD_DOOR_TO_SYSTEM(ENUM_TO_INT(DOORHASH_M_MANSION_SON), V_ILEV_MM_DOORSON, <<-806.7716, 174.0236, 76.8903>>, FALSE, FALSE)
|
|
ENDIF
|
|
|
|
IF IS_DOOR_REGISTERED_WITH_SYSTEM(ENUM_TO_INT(DOORHASH_M_MANSION_SON))
|
|
DOOR_SYSTEM_SET_OPEN_RATIO(ENUM_TO_INT(DOORHASH_M_MANSION_SON), -1.0, FALSE, FALSE)
|
|
DOOR_SYSTEM_SET_DOOR_STATE(ENUM_TO_INT(DOORHASH_M_MANSION_SON), DOORSTATE_LOCKED, FALSE, TRUE)
|
|
ENDIF
|
|
|
|
iSetupProgress++
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
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 = 8 )
|
|
|
|
//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
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Calling LOAD_SCENE() at coordinates ", MissionPosition.vStageStart, " for mission replay or stage skip. This might take a while to load.")
|
|
#ENDIF
|
|
|
|
LOAD_SCENE(MissionPosition.vStageStart)
|
|
|
|
WAIT(1000)
|
|
|
|
ENDIF
|
|
|
|
//put player in car when required during the skip
|
|
SWITCH eStage
|
|
|
|
CASE MISSION_STAGE_CUTSCENE_BURGER_SHOT
|
|
CASE MISSION_STAGE_DRIVE_HOME
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
CASE MISSION_STAGE_TEST
|
|
#ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(vsMichaelsCar.VehicleIndex)
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
|
|
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), vsMichaelsCar.VehicleIndex, VS_DRIVER)
|
|
SET_VEHICLE_ON_GROUND_PROPERLY(vsMichaelsCar.VehicleIndex)
|
|
SET_VEHICLE_ENGINE_ON(vsMichaelsCar.VehicleIndex, TRUE, TRUE)
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
SWITCH eStage
|
|
|
|
CASE MISSION_STAGE_YOGA_WARRIOR
|
|
CASE MISSION_STAGE_YOGA_TRIANGLE
|
|
CASE MISSION_STAGE_YOGA_SUNSALUTATION
|
|
|
|
IF ( bYogaMusicPlaying = FALSE )
|
|
IF TRIGGER_MUSIC_EVENT("FAM5_YOGA_MUSIC_RESTART")
|
|
bYogaMusicPlaying = TRUE
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Triggering music event FAM5_YOGA_MOVE_RESTART.")
|
|
#ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF PREPARE_MUSIC_EVENT("FAM5_YOGA_MOVE_START")
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Prepared music event FAM5_YOGA_MOVE_START.")
|
|
#ENDIF
|
|
ELSE
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Preparing music event FAM5_YOGA_MOVE_START.")
|
|
#ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_CUTSCENE_TRIANGLE
|
|
CASE MISSION_STAGE_CUTSCENE_SUNSALUTATION
|
|
CASE MISSION_STAGE_CUTSCENE_POOL
|
|
IF ( bYogaMusicPlaying = FALSE )
|
|
IF TRIGGER_MUSIC_EVENT("FAM5_YOGA_MUSIC_RESTART")
|
|
bYogaMusicPlaying = TRUE
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Triggering music event FAM5_YOGA_MOVE_RESTART.")
|
|
#ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
DEFAULT
|
|
IF ( bYogaMusicPlaying = TRUE )
|
|
IF TRIGGER_MUSIC_EVENT("FAM5_YOGA_MUSIC_ENDS")
|
|
bYogaMusicPlaying = FALSE
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Triggering music event FAM5_YOGA_MUSIC_ENDS.")
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Stopping yoga music.")
|
|
#ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
//handle fade in for each mission stage
|
|
//some stages start with or require a fade out
|
|
SWITCH eStage
|
|
|
|
CASE MISSION_STAGE_CUTSCENE_INTRO
|
|
CASE MISSION_STAGE_YOGA_WARRIOR
|
|
CASE MISSION_STAGE_CUTSCENE_TRIANGLE
|
|
CASE MISSION_STAGE_YOGA_TRIANGLE
|
|
CASE MISSION_STAGE_CUTSCENE_SUNSALUTATION
|
|
CASE MISSION_STAGE_YOGA_SUNSALUTATION
|
|
CASE MISSION_STAGE_CUTSCENE_POOL
|
|
CASE MISSION_STAGE_GOTO_JIMMYS_ROOM
|
|
CASE MISSION_STAGE_CUTSCENE_JIMMYS_ROOM
|
|
CASE MISSION_STAGE_GOTO_BURGER_SHOT
|
|
CASE MISSION_STAGE_CUTSCENE_BURGER_SHOT
|
|
CASE MISSION_STAGE_CUTSCENE_BLACKOUT
|
|
CASE MISSION_STAGE_FLIGHT
|
|
CASE MISSION_STAGE_GO_HOME_WASTED
|
|
CASE MISSION_STAGE_CUTSCENE_END_1
|
|
CASE MISSION_STAGE_CUTSCENE_END_2
|
|
|
|
//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
|
|
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
|
|
|
|
//fade in
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Calling a loading screen fade in.")
|
|
#ENDIF
|
|
IF IS_SCREEN_FADED_OUT()
|
|
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
ENDIF
|
|
|
|
iSetupProgress++
|
|
|
|
ENDIF
|
|
|
|
//handle skipping to or replaying stages that require peds to play animations or be in cover
|
|
IF ( iSetupProgress = 9 )
|
|
|
|
//stage was skipped to or is being replayed
|
|
IF ( bStageSkippedTo = TRUE OR bStageReplayed = TRUE )
|
|
|
|
SWITCH eStage
|
|
|
|
CASE MISSION_STAGE_YOGA_WARRIOR
|
|
CASE MISSION_STAGE_YOGA_TRIANGLE
|
|
CASE MISSION_STAGE_YOGA_SUNSALUTATION
|
|
|
|
STRING sPlayerAnimName
|
|
STRING sAmandaAnimName
|
|
STRING sFabienAnimName
|
|
|
|
VECTOR vAmandaPosition
|
|
VECTOR vAmandaRotation
|
|
VECTOR vFabienPosition
|
|
VECTOR vFabienRotation
|
|
|
|
|
|
SWITCH eStage
|
|
CASE MISSION_STAGE_YOGA_WARRIOR
|
|
sPlayerAnimName = "start_pose"
|
|
sAmandaAnimName = "f_yogapose_a"
|
|
sFabienAnimName = "i_yogapose_a"
|
|
|
|
vAmandaPosition = vAmandaWarriorPosition
|
|
vAmandaRotation = vAmandaWarriorRotation
|
|
vFabienPosition = vFabienWarriorPosition
|
|
vFabienRotation = vFabienWarriorRotation
|
|
BREAK
|
|
CASE MISSION_STAGE_YOGA_TRIANGLE
|
|
sPlayerAnimName = "start_pose"
|
|
sAmandaAnimName = "f_yogapose_b"
|
|
sFabienAnimName = "i_yogapose_b"
|
|
|
|
vAmandaPosition = vAmandaTrianglePosition
|
|
vAmandaRotation = vAmandaTriangleRotation
|
|
vFabienPosition = vFabienTrianglePosition
|
|
vFabienRotation = vFabienTriangleRotation
|
|
BREAK
|
|
CASE MISSION_STAGE_YOGA_SUNSALUTATION
|
|
sPlayerAnimName = "start_pose"
|
|
sAmandaAnimName = "f_yogapose_c"
|
|
sFabienAnimName = "i_yogapose_c"
|
|
|
|
vAmandaPosition = vAmandaSunsalutationPosition
|
|
vAmandaRotation = vAmandaSunsalutationRotation
|
|
vFabienPosition = vFabienSunsalutationPosition
|
|
vFabienRotation = vFabienSunsalutationRotation
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF DOES_ENTITY_EXIST(PLAYER_PED_ID())
|
|
AND DOES_ENTITY_EXIST(psAmanda.PedIndex)
|
|
AND DOES_ENTITY_EXIST(psFabien.PedIndex)
|
|
|
|
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
|
|
AND NOT IS_ENTITY_DEAD(psAmanda.PedIndex)
|
|
AND NOT IS_ENTITY_DEAD(psFabien.PedIndex)
|
|
AND HAVE_ALL_STREAMING_REQUESTS_COMPLETED(PLAYER_PED_ID())
|
|
AND HAVE_ALL_STREAMING_REQUESTS_COMPLETED(psAmanda.PedIndex)
|
|
AND HAVE_ALL_STREAMING_REQUESTS_COMPLETED(psFabien.PedIndex)
|
|
|
|
IF IS_ENTITY_PLAYING_ANIM(PLAYER_PED_ID(), "missfam5_yoga", sPlayerAnimName)
|
|
AND IS_ENTITY_PLAYING_ANIM(psAmanda.PedIndex, "missfam5_yoga", sAmandaAnimName)
|
|
AND IS_ENTITY_PLAYING_ANIM(psFabien.PedIndex, "missfam5_yoga", sFabienAnimName)
|
|
AND DOES_CAM_EXIST(ScriptedCamera)
|
|
AND IS_CAM_RENDERING(ScriptedCamera)
|
|
|
|
IF NOT IS_NEW_LOAD_SCENE_ACTIVE()
|
|
|
|
NEW_LOAD_SCENE_START(<< -782.81, 187.44, 73.33 >>, << -0.98, -0.17, -0.06 >>, 20.0)
|
|
|
|
iLoadSceneTimer = GET_GAME_TIMER()
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Calling NEW_LOAD_SCENE_START().")
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF IS_NEW_LOAD_SCENE_LOADED()
|
|
OR HAS_TIME_PASSED(10000, iLoadSceneTimer)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Calling NEW_LOAD_SCENE_STOP() due to IS_NEW_LOAD_SCENE_LOADED() returning TRUE.")
|
|
#ENDIF
|
|
|
|
NEW_LOAD_SCENE_STOP()
|
|
|
|
iSetupProgress++
|
|
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
IF HAS_ANIM_DICT_LOADED("missfam5_yoga")
|
|
|
|
IF NOT IS_ENTITY_PLAYING_ANIM(PLAYER_PED_ID(), "missfam5_yoga", sPlayerAnimName)
|
|
TASK_PLAY_ANIM(PLAYER_PED_ID(), "missfam5_yoga", sPlayerAnimName, INSTANT_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING, 0, FALSE, AIK_DISABLE_LEG_IK)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID())
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_PLAYING_ANIM(psAmanda.PedIndex, "missfam5_yoga", sAmandaAnimName)
|
|
TASK_PLAY_ANIM_ADVANCED(psAmanda.PedIndex, "missfam5_yoga", sAmandaAnimName,
|
|
vAmandaPosition, vAmandaRotation, INSTANT_BLEND_IN, NORMAL_BLEND_OUT, -1,
|
|
AF_LOOPING | AF_EXTRACT_INITIAL_OFFSET | AF_NOT_INTERRUPTABLE | AF_USE_KINEMATIC_PHYSICS | AF_OVERRIDE_PHYSICS,
|
|
0, EULER_YXZ, AIK_DISABLE_LEG_IK)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(psAmanda.PedIndex)
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_PLAYING_ANIM(psFabien.PedIndex, "missfam5_yoga", sFabienAnimName)
|
|
TASK_PLAY_ANIM_ADVANCED(psFabien.PedIndex, "missfam5_yoga", sFabienAnimName,
|
|
vFabienPosition, vFabienRotation, INSTANT_BLEND_IN, NORMAL_BLEND_OUT, -1,
|
|
AF_LOOPING | AF_EXTRACT_INITIAL_OFFSET | AF_NOT_INTERRUPTABLE | AF_USE_KINEMATIC_PHYSICS | AF_OVERRIDE_PHYSICS,
|
|
0, EULER_YXZ, AIK_DISABLE_LEG_IK)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(psFabien.PedIndex)
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
REQUEST_ANIM_DICT("missfam5_yoga")
|
|
|
|
ENDIF
|
|
|
|
IF NOT DOES_CAM_EXIST(ScriptedCamera)
|
|
|
|
ScriptedCamera = CREATE_CAMERA(CAMTYPE_SCRIPTED, TRUE)
|
|
|
|
SET_CAM_PARAMS(ScriptedCamera, << -782.802368, 187.4389, 73.326614>>, << -3.540541, 0.000000, 99.799942>>, 39.3555)
|
|
SHAKE_CAM(ScriptedCamera, "HAND_SHAKE", 0.125)
|
|
|
|
SET_CAM_FAR_CLIP(ScriptedCamera, 500)
|
|
SET_CAM_FAR_CLIP(ScriptedCamera, 500)
|
|
|
|
DISPLAY_RADAR(FALSE)
|
|
DISPLAY_HUD(FALSE)
|
|
|
|
RENDER_SCRIPT_CAMS(TRUE, FALSE)
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
DEFAULT
|
|
iSetupProgress++
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
ELSE
|
|
|
|
iSetupProgress++
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
|
|
//handle setting of mid-mission replay checkpoints
|
|
IF ( iSetupProgress = 10 )
|
|
|
|
SWITCH eStage
|
|
|
|
CASE MISSION_STAGE_YOGA_WARRIOR
|
|
|
|
iStageTimeHours = GET_CLOCK_HOURS()
|
|
iStageTimeMinutes = GET_CLOCK_MINUTES()
|
|
iStageTimeSeconds = GET_CLOCK_SECONDS()
|
|
|
|
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(ENUM_TO_INT(MID_MISSION_STAGE_YOGA_WARRIOR), "YOGA - WARRIOR", FALSE)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting replay mid-mission checkpoint to ", ENUM_TO_INT(MID_MISSION_STAGE_YOGA_WARRIOR), " for stage ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eStage), ".")
|
|
#ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_YOGA_TRIANGLE
|
|
|
|
iStageTimeHours = GET_CLOCK_HOURS()
|
|
iStageTimeMinutes = GET_CLOCK_MINUTES()
|
|
iStageTimeSeconds = GET_CLOCK_SECONDS()
|
|
|
|
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(ENUM_TO_INT(MID_MISSION_STAGE_YOGA_TRIANGLE), "YOGA - TRIANGLE", FALSE)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting replay mid-mission checkpoint to ", ENUM_TO_INT(MID_MISSION_STAGE_YOGA_TRIANGLE), " for stage ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eStage), ".")
|
|
#ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_YOGA_SUNSALUTATION
|
|
|
|
iStageTimeHours = GET_CLOCK_HOURS()
|
|
iStageTimeMinutes = GET_CLOCK_MINUTES()
|
|
iStageTimeSeconds = GET_CLOCK_SECONDS()
|
|
|
|
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(ENUM_TO_INT(MID_MISSION_STAGE_YOGA_SUNSALUTATION), "YOGA - SUNSALUTATION", FALSE)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting replay mid-mission checkpoint to ", ENUM_TO_INT(MID_MISSION_STAGE_YOGA_SUNSALUTATION), " for stage ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eStage), ".")
|
|
#ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_GOTO_JIMMYS_ROOM
|
|
|
|
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(ENUM_TO_INT(MID_MISSION_STAGE_GOTO_JIMMYS_ROOM), "GO TO JIMMY'S ROOM", FALSE)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting replay mid-mission checkpoint to ", ENUM_TO_INT(MID_MISSION_STAGE_GOTO_JIMMYS_ROOM), " for stage ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eStage), ".")
|
|
#ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_GOTO_BURGER_SHOT
|
|
|
|
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(ENUM_TO_INT(MID_MISSION_STAGE_GOTO_BURGER_SHOT), "GO TO BURGER SHOT", FALSE)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting replay mid-mission checkpoint to ", ENUM_TO_INT(MID_MISSION_STAGE_GOTO_BURGER_SHOT), " 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), "DRIVE HOME", FALSE)
|
|
|
|
#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
|
|
|
|
CASE MISSION_STAGE_GO_HOME_WASTED
|
|
|
|
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(ENUM_TO_INT(MID_MISSION_STAGE_GO_HOME_WASTED), "GO HOME WASTED", TRUE)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting replay mid-mission checkpoint to ", ENUM_TO_INT(MID_MISSION_STAGE_GO_HOME_WASTED), " for stage ", GET_MISSION_STAGE_NAME_FOR_DEBUG(eStage), ".")
|
|
#ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
iSetupProgress++
|
|
|
|
ENDIF
|
|
|
|
//print the message only once per mission stage
|
|
//handle fades
|
|
IF ( iSetupProgress = 11 )
|
|
|
|
#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
|
|
|
|
SWITCH eStage
|
|
CASE MISSION_STAGE_YOGA_WARRIOR
|
|
CASE MISSION_STAGE_YOGA_TRIANGLE
|
|
CASE MISSION_STAGE_YOGA_SUNSALUTATION
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
BREAK
|
|
DEFAULT
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
iSetupProgress++
|
|
|
|
ENDIF
|
|
|
|
IF ( iSetupProgress = 12 )
|
|
|
|
RETURN TRUE
|
|
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
|
|
ENDFUNC
|
|
|
|
FUNC BOOL IS_PED_SHOOTING_AT_AREA(PED_INDEX PedIndex, BOOL bIsPlayer, VECTOR vPosition, FLOAT fRadius #IF IS_DEBUG_BUILD, BOOL bDrawDebugSphere = TRUE,
|
|
INT iRed = 255, INT iGreen = 0, INT iBlue = 0, INT iAlpha = 128 #ENDIF)
|
|
|
|
IF NOT IS_PED_INJURED(PedIndex)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
IF ( bDrawDebugSphere = TRUE )
|
|
DRAW_DEBUG_SPHERE(vPosition, fRadius, iRed, iGreen, iBlue, iAlpha)
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
IF IS_PED_SHOOTING(PedIndex)
|
|
RETURN IS_BULLET_IN_AREA(vPosition, fRadius, bIsPlayer)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
|
|
ENDFUNC
|
|
|
|
FUNC BOOL IS_PED_SHOOTING_AT_ENTITY(PED_INDEX PedIndex, BOOL bIsPlayer, ENTITY_INDEX EntityIndex, BOOL bCheckArea = TRUE, FLOAT fRadius = 2.5
|
|
#IF IS_DEBUG_BUILD, BOOL bDrawDebugSphere = TRUE, INT iRed = 255, INT iGreen = 0, INT iBlue = 0,
|
|
INT iAlpha = 128 #ENDIF)
|
|
|
|
IF NOT IS_PED_INJURED(PedIndex)
|
|
|
|
IF DOES_ENTITY_EXIST(EntityIndex)
|
|
|
|
IF NOT IS_ENTITY_DEAD(EntityIndex)
|
|
|
|
IF ( bCheckArea = TRUE )
|
|
|
|
VECTOR vEntityPosition = GET_ENTITY_COORDS(EntityIndex)
|
|
|
|
FLOAT fGroundZ
|
|
|
|
IF GET_GROUND_Z_FOR_3D_COORD(vEntityPosition, fGroundZ)
|
|
vEntityPosition.Z = fGroundZ
|
|
ENDIF
|
|
|
|
IF IS_PED_SHOOTING_AT_AREA(PedIndex, bIsPlayer, vEntityPosition, fRadius #IF IS_DEBUG_BUILD, bDrawDebugSphere, iRed, iGreen, iBlue, iAlpha #ENDIF)
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(EntityIndex, PedIndex, FALSE)
|
|
|
|
IF HAS_ENTITY_BEEN_DAMAGED_BY_WEAPON(EntityIndex, WEAPONTYPE_INVALID, GENERALWEAPON_TYPE_ANYWEAPON)
|
|
|
|
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(EntityIndex)
|
|
CLEAR_ENTITY_LAST_WEAPON_DAMAGE(EntityIndex)
|
|
|
|
RETURN TRUE
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Checks if specified ped is using petrol can weapon to pour petrol at or around the specified entity.
|
|
/// PARAMS:
|
|
/// PedIndex - Ped to check for petrol can usage.
|
|
/// EntityIndex - Entity to check for petrol being used against.
|
|
/// fRadius - Radius to check around the specified entity.
|
|
/// RETURNS:
|
|
/// TRUE if specified ped is using petrol can to pour petrol around specified entity in the specified radius. FALSE if otherwise.
|
|
FUNC BOOL IS_PED_USING_PETROL_CAN_AT_ENTITY(PED_INDEX PedIndex, ENTITY_INDEX EntityIndex, FLOAT fRadius = 2.5
|
|
#IF IS_DEBUG_BUILD, BOOL bDrawDebugSphere = TRUE, INT iRed = 0, INT iGreen = 255, INT iBlue = 0,
|
|
INT iAlpha = 128 #ENDIF)
|
|
|
|
IF NOT IS_PED_INJURED(PedIndex)
|
|
|
|
IF DOES_ENTITY_EXIST(EntityIndex)
|
|
|
|
IF NOT IS_ENTITY_DEAD(EntityIndex)
|
|
|
|
WEAPON_TYPE PedCurrentWeaponType
|
|
|
|
IF GET_CURRENT_PED_WEAPON(PedIndex, PedCurrentWeaponType) //check if ped has petrol can equipped first
|
|
|
|
IF ( PedCurrentWeaponType = WEAPONTYPE_PETROLCAN )
|
|
|
|
VECTOR vEntityPosition = GET_ENTITY_COORDS(EntityIndex)
|
|
|
|
FLOAT fGroundZ
|
|
|
|
IF GET_GROUND_Z_FOR_3D_COORD(vEntityPosition, fGroundZ)
|
|
vEntityPosition.Z = fGroundZ
|
|
ENDIF
|
|
|
|
//draw debug sphere to visualise the check area, this will only draw when petrol can is equipped by ped
|
|
#IF IS_DEBUG_BUILD
|
|
IF ( bDrawDebugSphere = TRUE )
|
|
DRAW_DEBUG_SPHERE(vEntityPosition, fRadius, iRed, iGreen, iBlue, iAlpha)
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
//check if ped is using petrol can and if any petrol decals are the entity
|
|
IF IS_PED_SHOOTING(PedIndex)
|
|
AND GET_IS_PETROL_DECAL_IN_RANGE(vEntityPosition, fRadius)
|
|
|
|
RETURN TRUE
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
|
|
ENDFUNC
|
|
|
|
PROC MAKE_PED_FLEE_PED(PED_INDEX PedIndex, PED_INDEX PedIndexToFleeFrom, FLOAT fSafeDistance, INT iTime)
|
|
|
|
IF NOT IS_PED_INJURED(PedIndexToFleeFrom)
|
|
IF DOES_ENTITY_EXIST(PedIndex)
|
|
IF NOT IS_PED_INJURED(PedIndex)
|
|
CLEAR_PED_TASKS(PedIndex)
|
|
SET_PED_FLEE_ATTRIBUTES(PedIndex, FA_CAN_SCREAM, TRUE)
|
|
TASK_SMART_FLEE_PED(PedIndex, PedIndexToFleeFrom, fSafeDistance, iTime)
|
|
SET_PED_KEEP_TASK(PedIndex, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
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 ( eStage = MISSION_STAGE_YOGA_WARRIOR )
|
|
OR ( eStage = MISSION_STAGE_YOGA_TRIANGLE )
|
|
OR ( eStage = MISSION_STAGE_YOGA_SUNSALUTATION )
|
|
|
|
IF ( FailFlags[MISSION_FAIL_YOGA_FAILED] = TRUE )
|
|
IF ( sYogaPlayer.iFailCounter >= MAX_YOGA_FAILS )
|
|
eFail = MISSION_FAIL_YOGA_FAILED
|
|
eStage = MISSION_STAGE_FAILED
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(psAmanda.PedIndex)
|
|
IF ( FailFlags[MISSION_FAIL_AMANDA_DEAD] = TRUE )
|
|
IF IS_PED_INJURED(psAmanda.PedIndex)
|
|
eFail = MISSION_FAIL_AMANDA_DEAD
|
|
eStage = MISSION_STAGE_FAILED
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(psFabien.PedIndex)
|
|
IF ( FailFlags[MISSION_FAIL_FABIEN_DEAD] = TRUE )
|
|
IF IS_PED_INJURED(psFabien.PedIndex)
|
|
eFail = MISSION_FAIL_FABIEN_DEAD
|
|
eStage = MISSION_STAGE_FAILED
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(psJimmy.PedIndex)
|
|
IF ( FailFlags[MISSION_FAIL_JIMMY_DEAD] = TRUE )
|
|
IF IS_PED_INJURED(psJimmy.PedIndex)
|
|
eFail = MISSION_FAIL_JIMMY_DEAD
|
|
eStage = MISSION_STAGE_FAILED
|
|
ENDIF
|
|
ENDIF
|
|
IF ( FailFlags[MISSION_FAIL_JIMMY_LEFT_BEHIND] = TRUE )
|
|
IF DOES_BLIP_EXIST(sLocatesData.BuddyBlipID[0])
|
|
OR DOES_BLIP_EXIST(psJimmy.BlipIndex)
|
|
IF NOT IS_PED_INJURED(psJimmy.PedIndex)
|
|
IF GET_DISTANCE_BETWEEN_PEDS(PLAYER_PED_ID(), psJimmy.PedIndex) > ABANDON_BUDDY_FAIL_RANGE
|
|
OR ( bJimmyLeftBehindSprinting = TRUE )
|
|
eFail = MISSION_FAIL_JIMMY_LEFT_BEHIND
|
|
eStage = MISSION_STAGE_FAILED
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(vsMichaelsCar.VehicleIndex)
|
|
IF ( FailFlags[MISSION_FAIL_MICHAELS_CAR_UNDRIVEABLE] = TRUE )
|
|
IF IS_VEHICLE_PERMANENTLY_STUCK(vsMichaelsCar.VehicleIndex)
|
|
eFail = MISSION_FAIL_MICHAELS_CAR_UNDRIVEABLE
|
|
eStage = MISSION_STAGE_FAILED
|
|
ENDIF
|
|
ENDIF
|
|
IF ( FailFlags[MISSION_FAIL_MICHAELS_CAR_DEAD] = TRUE )
|
|
IF NOT IS_VEHICLE_DRIVEABLE(vsMichaelsCar.VehicleIndex, TRUE)
|
|
OR ( HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(vsMichaelsCar.VehicleIndex, PLAYER_PED_ID()) AND HAS_ENTITY_BEEN_DAMAGED_BY_WEAPON(vsMichaelsCar.VehicleIndex, WEAPONTYPE_MOLOTOV) )
|
|
eFail = MISSION_FAIL_MICHAELS_CAR_DEAD
|
|
eStage = MISSION_STAGE_FAILED
|
|
ENDIF
|
|
ENDIF
|
|
IF ( FailFlags[MISSION_FAIL_MICHAELS_CAR_LEFT_BEHIND] = TRUE )
|
|
IF DOES_BLIP_EXIST(sLocatesData.vehicleBlip)
|
|
OR DOES_BLIP_EXIST(vsMichaelsCar.BlipIndex)
|
|
IF IS_VEHICLE_DRIVEABLE(vsMichaelsCar.VehicleIndex)
|
|
IF GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), vsMichaelsCar.VehicleIndex) > ABANDON_BUDDY_FAIL_RANGE
|
|
eFail = MISSION_FAIL_MICHAELS_CAR_LEFT_BEHIND
|
|
eStage = MISSION_STAGE_FAILED
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(psDealer.PedIndex)
|
|
IF ( FailFlags[MISSION_FAIL_DEALER_DEAD] = TRUE )
|
|
IF IS_PED_INJURED(psDealer.PedIndex)
|
|
eFail = MISSION_FAIL_DEALER_DEAD
|
|
eStage = MISSION_STAGE_FAILED
|
|
ENDIF
|
|
ENDIF
|
|
IF ( FailFlags[MISSION_FAIL_DEALER_SCARED] = TRUE )
|
|
IF NOT IS_PED_INJURED(psDealer.PedIndex)
|
|
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(psDealer.PedIndex, PLAYER_PED_ID(), TRUE)
|
|
OR (IS_VEHICLE_DRIVEABLE(vsMichaelsCar.VehicleIndex) AND HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(psDealer.PedIndex, vsMichaelsCar.VehicleIndex))
|
|
OR IS_PED_SHOOTING_AT_ENTITY(PLAYER_PED_ID(), TRUE, psDealer.PedIndex, TRUE, 2.5)
|
|
OR IS_PED_USING_PETROL_CAN_AT_ENTITY(PLAYER_PED_ID(), psDealer.PedIndex, 3.0)
|
|
OR IS_ENTITY_TOUCHING_ENTITY(psDealer.PedIndex, PLAYER_PED_ID())
|
|
OR HAS_PED_RECEIVED_EVENT(psDealer.PedIndex, EVENT_PED_COLLISION_WITH_PLAYER)
|
|
OR HAS_PED_RECEIVED_EVENT(psDealer.PedIndex, EVENT_SWITCH_2_NM_TASK)
|
|
OR HAS_PED_RECEIVED_EVENT(psDealer.PedIndex, EVENT_EXPLOSION)
|
|
OR HAS_PED_RECEIVED_EVENT(psDealer.PedIndex, EVENT_SHOCKING_EXPLOSION)
|
|
OR HAS_PED_RECEIVED_EVENT(psDealer.PedIndex, EVENT_SHOT_FIRED)
|
|
OR HAS_PED_RECEIVED_EVENT(psDealer.PedIndex, EVENT_SHOT_FIRED_WHIZZED_BY)
|
|
OR HAS_PED_RECEIVED_EVENT(psDealer.PedIndex, EVENT_SHOT_FIRED_BULLET_IMPACT)
|
|
OR HAS_PED_RECEIVED_EVENT(psDealer.PedIndex, EVENT_POTENTIAL_BLAST)
|
|
OR HAS_PED_RECEIVED_EVENT(psDealer.PedIndex, EVENT_POTENTIAL_GET_RUN_OVER)
|
|
OR IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0) AND IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), << -1163.59, -901.60, 1.64 >>, << -1184.38, -870.28, 20.92 >>, 32.0)
|
|
OR IS_PED_FLEEING(psDealer.PedIndex)
|
|
PLAY_PAIN(psDealer.PedIndex, AUD_DAMAGE_REASON_SCREAM_SCARED)
|
|
IF NOT IS_PED_FLEEING(psDealer.PedIndex)
|
|
MAKE_PED_FLEE_PED(psDealer.PedIndex, PLAYER_PED_ID(), 300, -1)
|
|
ENDIF
|
|
eFail = MISSION_FAIL_DEALER_SCARED //MISSION_FAIL_DEALER_ATTACKED
|
|
eStage = MISSION_STAGE_FAILED
|
|
ENDIF
|
|
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
|
|
|
|
//Player failed yoga
|
|
CASE MISSION_FAIL_YOGA_FAILED
|
|
MISSION_FLOW_MISSION_FAILED_WITH_REASON("FAM5_F_Y1")
|
|
BREAK
|
|
//Michael's car is undriveable
|
|
CASE MISSION_FAIL_MICHAELS_CAR_UNDRIVEABLE
|
|
MISSION_FLOW_MISSION_FAILED_WITH_REASON("CMN_GENSTCK")
|
|
BREAK
|
|
//Michael's car is destroyed
|
|
CASE MISSION_FAIL_MICHAELS_CAR_DEAD
|
|
MISSION_FLOW_MISSION_FAILED_WITH_REASON("CMN_MDEST")
|
|
BREAK
|
|
CASE MISSION_FAIL_MICHAELS_CAR_LEFT_BEHIND
|
|
MISSION_FLOW_MISSION_FAILED_WITH_REASON("FAM5_F_CLB")
|
|
BREAK
|
|
//Wife is dead
|
|
CASE MISSION_FAIL_AMANDA_DEAD
|
|
MISSION_FLOW_MISSION_FAILED_WITH_REASON("CMN_ADIED")
|
|
BREAK
|
|
//Instructor is dead
|
|
CASE MISSION_FAIL_FABIEN_DEAD
|
|
MISSION_FLOW_MISSION_FAILED_WITH_REASON("FAM5_F_B1")
|
|
BREAK
|
|
//Son is dead
|
|
CASE MISSION_FAIL_JIMMY_DEAD
|
|
MISSION_FLOW_MISSION_FAILED_WITH_REASON("CMN_JDIED")
|
|
BREAK
|
|
//Son is left behind
|
|
CASE MISSION_FAIL_JIMMY_LEFT_BEHIND
|
|
MISSION_FLOW_MISSION_FAILED_WITH_REASON("CMN_JLEFT")
|
|
BREAK
|
|
//Dealer attacked
|
|
CASE MISSION_FAIL_DEALER_ATTACKED
|
|
MISSION_FLOW_MISSION_FAILED_WITH_REASON("FAM5_F_E0")
|
|
BREAK
|
|
//Dealer scared off
|
|
CASE MISSION_FAIL_DEALER_SCARED
|
|
MISSION_FLOW_MISSION_FAILED_WITH_REASON("FAM5_F_E1")
|
|
BREAK
|
|
//Dealer killed
|
|
CASE MISSION_FAIL_DEALER_DEAD
|
|
MISSION_FLOW_MISSION_FAILED_WITH_REASON("FAM5_F_E2")
|
|
BREAK
|
|
//Generic fail
|
|
//Debug forced fail
|
|
CASE MISSION_FAIL_EMPTY
|
|
CASE MISSION_FAIL_FORCE_FAIL
|
|
MISSION_FLOW_MISSION_FAILED_WITH_REASON("FAM5_FAIL")
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
ENDPROC
|
|
|
|
PROC MANAGE_YOGA_CONVERSATIONS(YOGASTRUCT Yoga, INT&iPosesCompleted, INT &iBreathsCompleted, INT &iIdleTimer, INT &iFails,
|
|
STRING sIdleRoot1, STRING sIdleRoot2, STRING sPraiseRoot1, STRING sPraiseRoot2, STRING sEncourageRoot,
|
|
BOOL &bBreatheStartConversationFlag, STRING sBreatheStartRoot,
|
|
BOOL &bBreatheCompletedConversationFlag, STRING sBreatheCompletedRoot,
|
|
BOOL &bBreatheFailedConversationFlag, STRING sBreatheFailedRoot,
|
|
BOOL &bInhaleConversationFlag, STRING sInhaleRoot,
|
|
BOOL &bExhaleConversationFlag, STRING sExhaleRoot,
|
|
BOOL &bFailConversationFlag, STRING sFailRoot1, STRING sFailRoot2, STRING sFailRootPlayer, INT iFailRootPlayerLines)
|
|
|
|
SWITCH Yoga.eYogaMinigameStage
|
|
|
|
CASE YOGAMINIGAMESTAGE_SETUP
|
|
iIdleTimer = GET_GAME_TIMER()
|
|
BREAK
|
|
|
|
CASE YOGAMINIGAMESTAGE_DOMOVE
|
|
|
|
bFailConversationFlag = FALSE
|
|
|
|
IF ( iPosesCompleted = Yoga.iPosesCompleted ) //pose counters are equal, no pose was completed, play idle dialogue
|
|
|
|
IF ( Yoga.eYogaMoveStage = YOGAMOVESTAGE_DOINGPOSES ) //only play the idle conversation when player is meant to do the pose
|
|
//which means player has to position sticks
|
|
|
|
bBreatheStartConversationFlag = FALSE
|
|
bBreatheCompletedConversationFlag = FALSE
|
|
bBreatheFailedConversationFlag = FALSE
|
|
|
|
//check if fail happened, if so play retry conversation
|
|
IF ( iFails <> Yoga.iFailCounter ) //fail counters are not equal, fail just happened
|
|
//play retry conversation and reset the idle timer
|
|
IF NOT HAS_LABEL_BEEN_TRIGGERED(sEncourageRoot)
|
|
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
IF CREATE_CONVERSATION(Family5Conversation, "FAM5AUD", sEncourageRoot, CONV_PRIORITY_MEDIUM)
|
|
SET_LABEL_AS_TRIGGERED(sEncourageRoot, TRUE)
|
|
ENDIF
|
|
ELSE
|
|
KILL_FACE_TO_FACE_CONVERSATION()
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
IF NOT IS_THIS_CONVERSATION_PLAYING(sEncourageRoot)
|
|
SET_LABEL_AS_TRIGGERED(sEncourageRoot, FALSE)
|
|
iFails = Yoga.iFailCounter
|
|
iIdleTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF NOT HAS_LABEL_BEEN_TRIGGERED(sIdleRoot1)
|
|
OR NOT HAS_LABEL_BEEN_TRIGGERED(sIdleRoot2)
|
|
|
|
IF HAS_TIME_PASSED(12500, iIdleTimer) //check idle timer
|
|
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
|
|
SWITCH GET_RANDOM_INT_IN_RANGE(0, 2) //select random idle root
|
|
|
|
CASE 0
|
|
IF CREATE_CONVERSATION(Family5Conversation, "FAM5AUD", sIdleRoot1, CONV_PRIORITY_MEDIUM) //play idle root 1
|
|
SET_LABEL_AS_TRIGGERED(sIdleRoot1, TRUE)
|
|
SET_LABEL_AS_TRIGGERED(sIdleRoot2, TRUE) //set both idle roots as triggered
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1
|
|
IF CREATE_CONVERSATION(Family5Conversation, "FAM5AUD", sIdleRoot2, CONV_PRIORITY_MEDIUM) //play idle root 2
|
|
SET_LABEL_AS_TRIGGERED(sIdleRoot1, TRUE)
|
|
SET_LABEL_AS_TRIGGERED(sIdleRoot2, TRUE) //set both idle roots as triggered
|
|
ENDIF
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
|
|
ELSE
|
|
KILL_FACE_TO_FACE_CONVERSATION()
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
IF NOT IS_THIS_CONVERSATION_PLAYING(sIdleRoot1)
|
|
AND NOT IS_THIS_CONVERSATION_PLAYING(sIdleRoot2)
|
|
SET_LABEL_AS_TRIGGERED(sIdleRoot1, FALSE)
|
|
SET_LABEL_AS_TRIGGERED(sIdleRoot2, FALSE)
|
|
iIdleTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
iIdleTimer = GET_GAME_TIMER() //reset the idle timer is player is in a different move stage than doing poses
|
|
|
|
ENDIF
|
|
|
|
ELSE //pose counters are not equal, pose was completed, play praise conversation and reset the idle timer
|
|
|
|
bBreatheStartConversationFlag = FALSE
|
|
|
|
iBreathsCompleted = Yoga.iBreathingCounter
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": iBreathsCompleted: ", iBreathsCompleted, " Yoga.iBreathingCounter: ", Yoga.iBreathingCounter, ".")
|
|
#ENDIF
|
|
|
|
IF NOT HAS_LABEL_BEEN_TRIGGERED(sPraiseRoot1)
|
|
OR NOT HAS_LABEL_BEEN_TRIGGERED(sPraiseRoot2)
|
|
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
|
|
SWITCH GET_RANDOM_INT_IN_RANGE(0, 2) //select random praise root
|
|
|
|
CASE 0
|
|
IF CREATE_CONVERSATION(Family5Conversation, "FAM5AUD", sPraiseRoot1, CONV_PRIORITY_MEDIUM) //play praise root 1
|
|
SET_LABEL_AS_TRIGGERED(sPraiseRoot1, TRUE)
|
|
SET_LABEL_AS_TRIGGERED(sPraiseRoot2, TRUE) //set both praise roots as triggered
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1
|
|
IF CREATE_CONVERSATION(Family5Conversation, "FAM5AUD", sPraiseRoot2, CONV_PRIORITY_MEDIUM) //play praise root 2
|
|
SET_LABEL_AS_TRIGGERED(sPraiseRoot1, TRUE)
|
|
SET_LABEL_AS_TRIGGERED(sPraiseRoot2, TRUE) //set both praise roots as triggered
|
|
ENDIF
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
ELSE
|
|
KILL_FACE_TO_FACE_CONVERSATION()
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
IF NOT IS_THIS_CONVERSATION_PLAYING(sPraiseRoot1)
|
|
AND NOT IS_THIS_CONVERSATION_PLAYING(sPraiseRoot1)
|
|
SET_LABEL_AS_TRIGGERED(sPraiseRoot1, FALSE)
|
|
SET_LABEL_AS_TRIGGERED(sPraiseRoot1, FALSE)
|
|
iPosesCompleted = Yoga.iPosesCompleted
|
|
iIdleTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
SWITCH Yoga.eYogaMoveStage
|
|
|
|
CASE YOGAMOVESTAGE_BREATHE
|
|
|
|
IF ( iBreathsCompleted <> Yoga.iBreathingCounter)
|
|
bBreatheCompletedConversationFlag = FALSE
|
|
bBreatheFailedConversationFlag = FALSE
|
|
iBreathsCompleted = Yoga.iBreathingCounter
|
|
ENDIF
|
|
|
|
IF ( bBreatheStartConversationFlag = FALSE )
|
|
|
|
IF NOT HAS_LABEL_BEEN_TRIGGERED(sBreatheStartRoot)
|
|
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
|
|
IF CREATE_CONVERSATION(Family5Conversation, "FAM5AUD", sBreatheStartRoot, CONV_PRIORITY_MEDIUM)
|
|
SET_LABEL_AS_TRIGGERED(sBreatheStartRoot, TRUE)
|
|
bBreatheStartConversationFlag = TRUE
|
|
ENDIF
|
|
ELSE
|
|
KILL_FACE_TO_FACE_CONVERSATION()
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
IF NOT IS_THIS_CONVERSATION_PLAYING(sBreatheStartRoot)
|
|
SET_LABEL_AS_TRIGGERED(sBreatheStartRoot, FALSE)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF ( bBreatheCompletedConversationFlag = FALSE )
|
|
|
|
IF ( Yoga.bInhaleCompleted = TRUE )
|
|
AND ( Yoga.bExhaleCompleted = TRUE )
|
|
|
|
IF NOT HAS_LABEL_BEEN_TRIGGERED(sBreatheCompletedRoot)
|
|
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
|
|
IF CREATE_CONVERSATION(Family5Conversation, "FAM5AUD", sBreatheCompletedRoot, CONV_PRIORITY_MEDIUM)
|
|
SET_LABEL_AS_TRIGGERED(sBreatheCompletedRoot, TRUE)
|
|
bBreatheCompletedConversationFlag = TRUE
|
|
ENDIF
|
|
ELSE
|
|
KILL_FACE_TO_FACE_CONVERSATION()
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
IF NOT IS_THIS_CONVERSATION_PLAYING(sBreatheCompletedRoot)
|
|
SET_LABEL_AS_TRIGGERED(sBreatheCompletedRoot, FALSE)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF ( bBreatheFailedConversationFlag = FALSE )
|
|
|
|
IF ( Yoga.bInhaleFailed = TRUE OR Yoga.bExhaleFailed = TRUE )
|
|
|
|
IF NOT HAS_LABEL_BEEN_TRIGGERED(sBreatheFailedRoot)
|
|
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
|
|
IF CREATE_CONVERSATION(Family5Conversation, "FAM5AUD", sBreatheFailedRoot, CONV_PRIORITY_MEDIUM)
|
|
SET_LABEL_AS_TRIGGERED(sBreatheFailedRoot, TRUE)
|
|
bBreatheFailedConversationFlag = TRUE
|
|
ENDIF
|
|
ELSE
|
|
KILL_FACE_TO_FACE_CONVERSATION()
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
IF NOT IS_THIS_CONVERSATION_PLAYING(sBreatheFailedRoot)
|
|
SET_LABEL_AS_TRIGGERED(sBreatheFailedRoot, FALSE)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
SWITCH Yoga.eYogaBreatheStage
|
|
|
|
CASE YOGABREATHESTAGES_INHALE
|
|
|
|
bExhaleConversationFlag = FALSE
|
|
|
|
IF Yoga.bInhaleInProgress = FALSE
|
|
|
|
IF ( bInhaleConversationFlag = FALSE )
|
|
|
|
IF NOT HAS_LABEL_BEEN_TRIGGERED(sInhaleRoot)
|
|
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
|
|
IF CREATE_CONVERSATION(Family5Conversation, "FAM5AUD", PICK_STRING(GET_RANDOM_BOOL(), sInhaleRoot, "FAM5_YOIA"), CONV_PRIORITY_MEDIUM)
|
|
SET_LABEL_AS_TRIGGERED(sInhaleRoot, TRUE)
|
|
bInhaleConversationFlag = TRUE
|
|
ENDIF
|
|
ELSE
|
|
KILL_FACE_TO_FACE_CONVERSATION()
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
IF NOT IS_THIS_CONVERSATION_PLAYING(sInhaleRoot)
|
|
SET_LABEL_AS_TRIGGERED(sInhaleRoot, FALSE)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
|
|
ELSE
|
|
|
|
bInhaleConversationFlag = TRUE
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE YOGABREATHESTAGES_EXHALE
|
|
|
|
bInhaleConversationFlag = FALSE
|
|
|
|
bBreatheCompletedConversationFlag = FALSE
|
|
|
|
IF Yoga.bExhaleInProgress = FALSE
|
|
|
|
IF ( bExhaleConversationFlag = FALSE )
|
|
|
|
IF NOT HAS_LABEL_BEEN_TRIGGERED(sExhaleRoot)
|
|
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
|
|
IF CREATE_CONVERSATION(Family5Conversation, "FAM5AUD", PICK_STRING(GET_RANDOM_BOOL(), sExhaleRoot, "FAM5_YOEA"), CONV_PRIORITY_MEDIUM)
|
|
SET_LABEL_AS_TRIGGERED(sExhaleRoot, TRUE)
|
|
bExhaleConversationFlag = TRUE
|
|
ENDIF
|
|
ELSE
|
|
KILL_FACE_TO_FACE_CONVERSATION()
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
IF NOT IS_THIS_CONVERSATION_PLAYING(sExhaleRoot)
|
|
SET_LABEL_AS_TRIGGERED(sExhaleRoot, FALSE)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
bExhaleConversationFlag = TRUE
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
BREAK
|
|
|
|
CASE YOGAMINIGAMESTAGE_DOFAIL
|
|
CASE YOGAMINIGAMESTAGE_WAITFAIL
|
|
|
|
bExhaleConversationFlag = FALSE
|
|
bInhaleConversationFlag = FALSE
|
|
bFailConversationFlag = FALSE
|
|
bBreatheStartConversationFlag = FALSE
|
|
bBreatheCompletedConversationFlag = FALSE
|
|
bBreatheFailedConversationFlag = FALSE
|
|
|
|
IF ( Yoga.bFailing = TRUE ) //fail conversation player
|
|
|
|
iIdleTimer = GET_GAME_TIMER() //reset idle timer
|
|
iPosesCompleted = Yoga.iPosesCompleted //this should be set to 0 during fail
|
|
iBreathsCompleted = Yoga.iBreathingCounter
|
|
|
|
SET_LABEL_AS_TRIGGERED(sFailRoot1, FALSE)
|
|
SET_LABEL_AS_TRIGGERED(sFailRoot2, FALSE)
|
|
|
|
IF NOT HAS_LABEL_BEEN_TRIGGERED(sFailRootPlayer)
|
|
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
IF ( iFailRootPlayerCounter >= iFailRootPlayerLines )
|
|
IF NOT IS_AMBIENT_SPEECH_PLAYING(Yoga.PedIndex)
|
|
IF HAS_SOUND_FINISHED(Yoga.iFailSoundID)
|
|
SWITCH GET_RANDOM_INT_IN_RANGE(0, 5)
|
|
CASE 0
|
|
PLAY_PED_AMBIENT_SPEECH(Yoga.PedIndex, "GENERIC_CURSE_MED", SPEECH_PARAMS_FORCE_NORMAL)
|
|
BREAK
|
|
ENDSWITCH
|
|
SET_LABEL_AS_TRIGGERED(sFailRootPlayer, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF CREATE_CONVERSATION(Family5Conversation, "FAM5AUD", sFailRootPlayer, CONV_PRIORITY_MEDIUM)
|
|
iFailRootPlayerCounter++
|
|
SET_LABEL_AS_TRIGGERED(sFailRootPlayer, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF IS_SCRIPTED_SPEECH_PLAYING(Yoga.PedIndex)
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
ELSE
|
|
KILL_FACE_TO_FACE_CONVERSATION()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
IF NOT IS_THIS_CONVERSATION_PLAYING(sFailRootPlayer)
|
|
SET_LABEL_AS_TRIGGERED(sFailRootPlayer, FALSE)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE YOGAMINIGAMESTAGE_FAILRESET
|
|
CASE YOGAMINIGAMESTAGE_RESTART
|
|
|
|
bExhaleConversationFlag = FALSE
|
|
bInhaleConversationFlag = FALSE
|
|
bBreatheStartConversationFlag = FALSE
|
|
bBreatheCompletedConversationFlag = FALSE
|
|
bBreatheFailedConversationFlag = FALSE
|
|
|
|
IF ( bFailConversationFlag = FALSE )
|
|
|
|
IF NOT HAS_LABEL_BEEN_TRIGGERED(sFailRoot1)
|
|
OR NOT HAS_LABEL_BEEN_TRIGGERED(sFailRoot2)
|
|
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
|
|
SWITCH iFailConversationSpeaker
|
|
|
|
CASE 0
|
|
IF CREATE_CONVERSATION(Family5Conversation, "FAM5AUD", sFailRoot1, CONV_PRIORITY_MEDIUM) //play fail root 1
|
|
SET_LABEL_AS_TRIGGERED(sFailRoot1, TRUE)
|
|
SET_LABEL_AS_TRIGGERED(sFailRoot2, TRUE) //set both fail roots as triggered
|
|
bFailConversationFlag = TRUE
|
|
iPosesCompleted = Yoga.iPosesCompleted //this should be set to 0 during fail
|
|
iBreathsCompleted = Yoga.iBreathingCounter
|
|
iIdleTimer = GET_GAME_TIMER() //reset idle timer
|
|
REPLAY_RECORD_BACK_FOR_TIME(5, 4, REPLAY_IMPORTANCE_HIGHEST)
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1
|
|
IF CREATE_CONVERSATION(Family5Conversation, "FAM5AUD", sFailRoot2, CONV_PRIORITY_MEDIUM) //play fail root 2
|
|
SET_LABEL_AS_TRIGGERED(sFailRoot1, TRUE)
|
|
SET_LABEL_AS_TRIGGERED(sFailRoot2, TRUE) //set both fail roots as triggered
|
|
bFailConversationFlag = TRUE
|
|
iPosesCompleted = Yoga.iPosesCompleted //this should be set to 0 during fail
|
|
iBreathsCompleted = Yoga.iBreathingCounter
|
|
iIdleTimer = GET_GAME_TIMER() //reset idle timer
|
|
REPLAY_RECORD_BACK_FOR_TIME(5, 4, REPLAY_IMPORTANCE_HIGHEST)
|
|
ENDIF
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
ELSE
|
|
KILL_FACE_TO_FACE_CONVERSATION()
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
// IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
// IF HAS_TIME_PASSED(7000, iAmbientSpeechtimer)
|
|
// IF NOT IS_AMBIENT_SPEECH_PLAYING(psAmanda.PedIndex)
|
|
// PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(psAmanda.PedIndex, "FAM5_FGAA", "AMANDA", SPEECH_PARAMS_FORCE)
|
|
// iAmbientSpeechtimer = GET_GAME_TIMER()
|
|
// ENDIF
|
|
// ENDIF
|
|
// ENDIF
|
|
|
|
ENDPROC
|
|
|
|
FUNC BOOL IS_MISSION_STAGE_PRE_TIMELAPSE_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())
|
|
|
|
eMissionTriggerMeans = MISSION_TRIGGER_IN_VEHICLE
|
|
|
|
iStageProgress++
|
|
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
eMissionTriggerMeans = MISSION_TRIGGER_ON_FOOT
|
|
|
|
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)
|
|
|
|
SWITCH eMissionTriggerMeans
|
|
CASE MISSION_TRIGGER_ON_FOOT
|
|
iStageProgress++
|
|
BREAK
|
|
CASE MISSION_TRIGGER_IN_VEHICLE
|
|
iStageProgress++
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
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")
|
|
|
|
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)
|
|
|
|
NEW_LOAD_SCENE_START(<< -839.51, 180.32, 71.61 >>, << 1.0, -0.2, 0.2 >>, 1500.0)
|
|
|
|
iLoadSceneTimer = GET_GAME_TIMER()
|
|
bIntroCutsceneAssetsRequested = FALSE
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Calling NEW_LOAD_SCENE_START().")
|
|
#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())
|
|
AND NOT IS_THIS_MODEL_A_HELI(GET_ENTITY_MODEL(GET_PLAYERS_LAST_VEHICLE()))
|
|
AND NOT IS_THIS_MODEL_A_PLANE(GET_ENTITY_MODEL(GET_PLAYERS_LAST_VEHICLE()))
|
|
|
|
IF 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(), << -867.9103, 158.2215, 63.9014 >>)
|
|
SET_ENTITY_HEADING(GET_PLAYERS_LAST_VEHICLE(), 174.2918)
|
|
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
|
|
|
|
OVERRIDE_LODSCALE_THIS_FRAME(1.0)
|
|
|
|
IF DOES_CAM_EXIST(ScriptedCamera)
|
|
|
|
IF ( bTimelapseCutsceneSkipped = FALSE )
|
|
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(iHouseEnterSceneID)
|
|
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(iHouseEnterSceneID) >= 0.99
|
|
|
|
IF bIntroCutsceneAssetsRequested = 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(), ": Pre timelapse cutscene skipped by the player.")
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
IF IS_SCREEN_FADED_OUT()
|
|
|
|
IF bIntroCutsceneAssetsRequested = TRUE
|
|
|
|
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
|
|
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(osLeftDoorDummy.ObjectIndex, 0, FALSE)
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(osRightDoorDummy.ObjectIndex, 0, FALSE)
|
|
|
|
RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
DESTROY_CAM(ScriptedCamera)
|
|
DESTROY_ALL_CAMS()
|
|
|
|
iStageProgress++
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
REQUEST_CUTSCENE("family_5_int") //request intro cutscene
|
|
|
|
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
|
|
SET_CUTSCENE_PED_OUTFIT("Michael", PLAYER_ZERO, OUTFIT_P0_YOGA) //Michael's variations
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Amanda", PED_COMP_HAIR, 4, 0) //Amanda's variations
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Amanda", PED_COMP_TORSO, 1, 0)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Amanda", PED_COMP_LEG, 1, 0)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Amanda", PED_COMP_DECL, 1, 0)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Fabien", PED_COMP_HEAD, 0, 0) //Fabien's variations
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Fabien", PED_COMP_TORSO, 0, 0)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Fabien", PED_COMP_LEG, 0, 0)
|
|
bIntroCutsceneAssetsRequested = 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 bIntroCutsceneAssetsRequested to ", bIntroCutsceneAssetsRequested, ".")
|
|
#ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 5
|
|
|
|
OVERRIDE_LODSCALE_THIS_FRAME(1.0)
|
|
|
|
IF ( bTimelapseCutsceneSkipped = FALSE )
|
|
|
|
IF DOES_CAM_EXIST(ScriptedCamera)
|
|
|
|
IF IS_NEW_LOAD_SCENE_LOADED()
|
|
OR HAS_TIME_PASSED(10000, iLoadSceneTimer)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
|
|
IF HAS_TIME_PASSED(10000, iLoadSceneTimer)
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Calling NEW_LOAD_SCENE_STOP() due to iLoadSceneTimer timeout.")
|
|
ELSE
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Calling NEW_LOAD_SCENE_STOP() due to IS_NEW_LOAD_SCENE_LOADED() returning TRUE.")
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
NEW_LOAD_SCENE_STOP()
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
SET_FORCE_FOOTSTEP_UPDATE(PLAYER_PED_ID(), FALSE)
|
|
ENDIF
|
|
|
|
RETURN TRUE
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
NEW_LOAD_SCENE_STOP()
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Calling NEW_LOAD_SCENE_STOP() due to pre timelapse cutscene being skipped.")
|
|
#ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
SET_FORCE_FOOTSTEP_UPDATE(PLAYER_PED_ID(), FALSE)
|
|
ENDIF
|
|
|
|
RETURN TRUE
|
|
|
|
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")
|
|
|
|
sTimelapse.splineCamera = CREATE_CAM("DEFAULT_SPLINE_CAMERA")
|
|
|
|
ADD_CAM_SPLINE_NODE(sTimelapse.splineCamera, <<-839.514160,180.320984,71.617966>>,<<10.805817,0.000000,-101.184196>>, 5000)
|
|
ADD_CAM_SPLINE_NODE(sTimelapse.splineCamera, <<-839.305664,180.279785,72.148422>>,<<10.330491,0.000000,-100.120872>>, 5000)
|
|
SET_CAM_FOV(sTimelapse.splineCamera, 40.633255)
|
|
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
|
|
|
|
iTODSkipHour = iCurrentHour + 2
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Current skip to time hour is ", iTODSkipHour, ".")
|
|
#ENDIF
|
|
|
|
GET_SP_MISSION_TOD_WINDOW_TIME(SP_MISSION_FAMILY_5, iStartTime, iEndTime)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": iStarttime is ", iStartTime, " and iEndTime is ", iEndTime, ".")
|
|
#ENDIF
|
|
|
|
IF iTODSkipHour > iStartTime
|
|
OR iTODSkipHour < iEndTime
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Current skip to time hour is not between start and end time.")
|
|
#ENDIF
|
|
iTODSkipHour = IDEAL_MISSION_START_TIME
|
|
ELSE
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Current skip to time hour is between start and end time.")
|
|
#ENDIF
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": TOD skip to time hour is ", iTODSkipHour, ".")
|
|
#ENDIF
|
|
|
|
WARP_PED(PLAYER_PED_ID(), MissionPosition.vStageStart, MissionPosition.fStartHeading, FALSE, FALSE, FALSE)
|
|
|
|
IF NOT IS_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P0_YOGA)
|
|
SET_PLAYER_PED_OUTFIT(MO_YOGA)
|
|
ENDIF
|
|
|
|
IF IS_THIS_TV_ON(TV_LOC_MICHAEL_PROJECTOR)
|
|
FORCE_STOP_TV(TV_LOC_MICHAEL_PROJECTOR)
|
|
ENDIF
|
|
|
|
bTimelapseTriggered = TRUE
|
|
|
|
iStageProgress++
|
|
|
|
BREAK
|
|
|
|
CASE 2
|
|
|
|
REQUEST_CUTSCENE("family_5_int") //request intro cutscene
|
|
|
|
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
|
|
SET_CUTSCENE_PED_OUTFIT("Michael", PLAYER_ZERO, OUTFIT_P0_YOGA) //Michael's variations
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Amanda", PED_COMP_HAIR, 4, 0) //Amanda's variations
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Amanda", PED_COMP_TORSO, 1, 0)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Amanda", PED_COMP_LEG, 1, 0)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Amanda", PED_COMP_DECL, 1, 0)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Fabien", PED_COMP_HEAD, 0, 0) //Fabien's variations
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Fabien", PED_COMP_TORSO, 0, 0)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Fabien", PED_COMP_LEG, 0, 0)
|
|
bIntroCutsceneAssetsRequested = 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 bIntroCutsceneAssetsRequested to ", bIntroCutsceneAssetsRequested, ".")
|
|
#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(iTODSkipHour, 0, "EXTRASUNNY", "cirrocumulus", sTimelapse, DEFAULT, 24)
|
|
|
|
RELEASE_NAMED_SCRIPT_AUDIO_BANK("TIME_LAPSE")
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
|
|
IF ( bIntroCutsceneAssetsRequested = 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 IS_AUDIO_SCENE_ACTIVE("TOD_SHIFT_SCENE") //fix for assert B*1737456, only check the sound id when timelapse audio scene is running
|
|
IF NOT HAS_SOUND_FINISHED(sTimelapse.iSplineStageSound)
|
|
STOP_SOUND(sTimelapse.iSplineStageSound)
|
|
RELEASE_NAMED_SCRIPT_AUDIO_BANK("TIME_LAPSE")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF ( bIntroCutsceneAssetsRequested = TRUE )
|
|
|
|
iStageProgress++
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 3
|
|
|
|
RETURN TRUE
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
RETURN FALSE
|
|
|
|
ENDFUNC
|
|
|
|
FUNC BOOL IS_MISSION_STAGE_CUTSCENE_INTRO_COMPLETED(INT &iStageProgress)
|
|
|
|
SWITCH iStageProgress
|
|
|
|
CASE 0
|
|
|
|
IF IS_THIS_TV_ON(TV_LOC_MICHAEL_PROJECTOR)
|
|
FORCE_STOP_TV(TV_LOC_MICHAEL_PROJECTOR)
|
|
ENDIF
|
|
|
|
IF HAS_REQUESTED_CUTSCENE_LOADED("family_5_int")
|
|
|
|
REGISTER_ENTITY_FOR_CUTSCENE(psAmanda.PedIndex, "Amanda", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, psAmanda.ModelName)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(psFabien.PedIndex, "Fabien", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, psFabien.ModelName)
|
|
|
|
//Michael's yoga mat, blue
|
|
REGISTER_ENTITY_FOR_CUTSCENE(osYogaMats[0].ObjectIndex, "Michaels_YogaMat", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, osYogaMats[0].ModelName)
|
|
|
|
//Fabien's yoga mat, black
|
|
REGISTER_ENTITY_FOR_CUTSCENE(osYogaMats[1].ObjectIndex, "Fabiens_YogaMat", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, osYogaMats[1].ModelName)
|
|
|
|
//Amanda's yoga mat, red
|
|
REGISTER_ENTITY_FOR_CUTSCENE(osYogaMats[2].ObjectIndex, "Amandas_yogamat", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, osYogaMats[2].ModelName)
|
|
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
|
|
|
|
START_CUTSCENE(CUTSCENE_SUPPRESS_FP_TRANSITION_FLASH)
|
|
|
|
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
iStageProgress++
|
|
|
|
ELSE
|
|
|
|
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
|
|
//Michael's variations
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", PLAYER_PED_ID(), PLAYER_ZERO)
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting variations for cutscene ped Michael for the intro cutscene.")
|
|
#ENDIF
|
|
//Amanda's variations
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Amanda", PED_COMP_HAIR, 4, 0)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Amanda", PED_COMP_TORSO, 1, 0)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Amanda", PED_COMP_LEG, 1, 0)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Amanda", PED_COMP_DECL, 1, 0)
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting variations for cutscene ped Amanda for the intro cutscene.")
|
|
#ENDIF
|
|
//Fabien's variations
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Fabien", PED_COMP_HEAD, 0, 0)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Fabien", PED_COMP_TORSO, 0, 0)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Fabien", PED_COMP_LEG, 0, 0)
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting variations for cutscene ped Fabien for the intro cutscene.")
|
|
#ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 1 //fade screen in if screen was faded out due to shit skip or debug skip
|
|
|
|
IF IS_CUTSCENE_PLAYING()
|
|
|
|
IF ( bTimelapseTriggered = TRUE )
|
|
SET_TODS_CUTSCENE_RUNNING(sTimelapse, FALSE)
|
|
SET_CLOCK_TIME(iTODSkipHour, 0, 0)
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting clock time after time lapse cutscene.")
|
|
#ENDIF
|
|
ENDIF
|
|
|
|
//force weather to extra sunny so that it does not rain during yoga
|
|
SET_WEATHER_TYPE_NOW_PERSIST("EXTRASUNNY")
|
|
|
|
DELETE_VEHICLE_GEN_VEHICLE(VEHGEN_MICHAEL_SAVEHOUSE)
|
|
DELETE_ALL_SCRIPT_CREATED_PLAYER_VEHICLES(CHAR_MICHAEL)
|
|
|
|
IF IS_REPLAY_START_VEHICLE_AVAILABLE()
|
|
AND DOES_ENTITY_EXIST(GET_PLAYERS_LAST_VEHICLE())
|
|
IF ( GET_MISSION_START_VEHICLE_INDEX() = GET_PLAYERS_LAST_VEHICLE() )
|
|
IF NOT IS_ENTITY_DEAD(GET_PLAYERS_LAST_VEHICLE())
|
|
AND IS_VEHICLE_DRIVEABLE(GET_PLAYERS_LAST_VEHICLE(), TRUE)
|
|
AND NOT IS_THIS_MODEL_A_HELI(GET_ENTITY_MODEL(GET_PLAYERS_LAST_VEHICLE()))
|
|
AND NOT IS_THIS_MODEL_A_PLANE(GET_ENTITY_MODEL(GET_PLAYERS_LAST_VEHICLE()))
|
|
|
|
STOP_VEHICLE_FIRE(GET_PLAYERS_LAST_VEHICLE())
|
|
|
|
SET_ENTITY_COORDS(GET_PLAYERS_LAST_VEHICLE(), << -867.9103, 158.2215, 63.9014 >>)
|
|
SET_ENTITY_HEADING(GET_PLAYERS_LAST_VEHICLE(), 174.2918)
|
|
|
|
SET_VEHICLE_DOORS_SHUT(GET_PLAYERS_LAST_VEHICLE())
|
|
SET_VEHICLE_ON_GROUND_PROPERLY(GET_PLAYERS_LAST_VEHICLE())
|
|
SET_VEHICLE_ENGINE_ON(GET_PLAYERS_LAST_VEHICLE(), FALSE, TRUE)
|
|
|
|
SET_MISSION_START_VEHICLE_AS_VEHICLE_GEN(<< -867.9103, 158.2215, 63.9014 >>, 174.2918)
|
|
CLEAR_MUST_LEAVE_AREA_VEHICLE_GEN_FLAG(VEHGEN_MISSION_VEH)
|
|
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
CLEAR_AREA(MissionPosition.vStageStart, 5000.0, TRUE)
|
|
|
|
CLEAR_PED_WETNESS(PLAYER_PED_ID()) //clear any visible damage player has before mission
|
|
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())
|
|
|
|
SET_ENTITY_HEALTH(PLAYER_PED_ID(), GET_PED_MAX_HEALTH(PLAYER_PED_ID())) //restore player health
|
|
|
|
IF NOT IS_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P0_YOGA)
|
|
SET_PLAYER_PED_OUTFIT(MO_YOGA)
|
|
ENDIF
|
|
|
|
IF IS_DOOR_REGISTERED_WITH_SYSTEM(ENUM_TO_INT(DOORHASH_M_MANSION_R_L2))
|
|
DOOR_SYSTEM_SET_OPEN_RATIO(ENUM_TO_INT(DOORHASH_M_MANSION_R_L2), -1.2, FALSE, FALSE)
|
|
DOOR_SYSTEM_SET_DOOR_STATE(ENUM_TO_INT(DOORHASH_M_MANSION_R_L2), DOORSTATE_LOCKED, FALSE, TRUE)
|
|
ENDIF
|
|
|
|
IF IS_DOOR_REGISTERED_WITH_SYSTEM(ENUM_TO_INT(DOORHASH_M_MANSION_R_R2))
|
|
DOOR_SYSTEM_SET_OPEN_RATIO(ENUM_TO_INT(DOORHASH_M_MANSION_R_R2), 1.2, FALSE, FALSE)
|
|
DOOR_SYSTEM_SET_DOOR_STATE(ENUM_TO_INT(DOORHASH_M_MANSION_R_R2), DOORSTATE_LOCKED, FALSE, TRUE)
|
|
ENDIF
|
|
|
|
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
|
|
|
|
DESTROY_ALL_CAMS()
|
|
RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
REMOVE_ANIM_DICT("missfam2mcs_intp1") //clear animation dictionary and camera from previous stages
|
|
|
|
bDoorOpenRatioSwitched = FALSE
|
|
|
|
IF IS_SCREEN_FADED_OUT()
|
|
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
|
|
ENDIF
|
|
|
|
iStageProgress++
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 2
|
|
|
|
IF ( bDoorOpenRatioSwitched = FALSE )
|
|
IF IS_CUTSCENE_PLAYING()
|
|
IF GET_CUTSCENE_TIME() > 80650
|
|
IF IS_DOOR_REGISTERED_WITH_SYSTEM(ENUM_TO_INT(DOORHASH_M_MANSION_R_L2))
|
|
DOOR_SYSTEM_SET_OPEN_RATIO(ENUM_TO_INT(DOORHASH_M_MANSION_R_L2), -1.0, FALSE, FALSE)
|
|
DOOR_SYSTEM_SET_DOOR_STATE(ENUM_TO_INT(DOORHASH_M_MANSION_R_L2), DOORSTATE_LOCKED, FALSE, TRUE)
|
|
ENDIF
|
|
|
|
IF IS_DOOR_REGISTERED_WITH_SYSTEM(ENUM_TO_INT(DOORHASH_M_MANSION_R_R2))
|
|
DOOR_SYSTEM_SET_OPEN_RATIO(ENUM_TO_INT(DOORHASH_M_MANSION_R_R2), 1.0, FALSE, FALSE)
|
|
DOOR_SYSTEM_SET_DOOR_STATE(ENUM_TO_INT(DOORHASH_M_MANSION_R_R2), DOORSTATE_LOCKED, FALSE, TRUE)
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Switching door open ratio.")
|
|
#ENDIF
|
|
|
|
bDoorOpenRatioSwitched = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//create Amanda's ped during the intro mocap cutscene
|
|
IF NOT DOES_ENTITY_EXIST(psAmanda.PedIndex)
|
|
IF DOES_CUTSCENE_ENTITY_EXIST("Amanda", psAmanda.ModelName)
|
|
IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Amanda"))
|
|
|
|
psAmanda.PedIndex = GET_PED_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Amanda"))
|
|
|
|
SET_MISSION_PED_PROPERTIES(psAmanda.PedIndex, RELGROUPHASH_PLAYER, FALSE, TRUE, FALSE, FALSE)
|
|
|
|
SET_FORCE_FOOTSTEP_UPDATE(psAmanda.PedIndex, TRUE)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Set up properites for mission player ped Amanda created in the intro cutscene.")
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
//create Fabien's ped during the intro mocap cutscene
|
|
IF NOT DOES_ENTITY_EXIST(psFabien.PedIndex)
|
|
IF DOES_CUTSCENE_ENTITY_EXIST("Fabien")
|
|
IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Fabien"))
|
|
|
|
psFabien.PedIndex = GET_PED_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Fabien"))
|
|
|
|
SET_MISSION_PED_PROPERTIES(psFabien.PedIndex, RELGROUPHASH_PLAYER, FALSE, TRUE, FALSE, FALSE)
|
|
|
|
SET_FORCE_FOOTSTEP_UPDATE(psFabien.PedIndex, TRUE)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Set up properites for mission player ped Fabien created in the intro cutscene.")
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
|
|
//create Michael's yoga mat
|
|
IF NOT DOES_ENTITY_EXIST(osYogaMats[0].ObjectIndex)
|
|
IF DOES_CUTSCENE_ENTITY_EXIST("Michaels_YogaMat")
|
|
IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Michaels_YogaMat"))
|
|
|
|
osYogaMats[0].ObjectIndex = GET_OBJECT_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Michaels_YogaMat"))
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created Michael's yoga mat object in the intro cutscene.")
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//create Fabien's yoga mat
|
|
IF NOT DOES_ENTITY_EXIST(osYogaMats[1].ObjectIndex)
|
|
IF DOES_CUTSCENE_ENTITY_EXIST("Fabiens_YogaMat")
|
|
IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Fabiens_YogaMat"))
|
|
|
|
osYogaMats[1].ObjectIndex = GET_OBJECT_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Fabiens_YogaMat"))
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created Fabien's yoga mat object in the intro cutscene.")
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//create Amanda's yoga mat
|
|
IF NOT DOES_ENTITY_EXIST(osYogaMats[2].ObjectIndex)
|
|
IF DOES_CUTSCENE_ENTITY_EXIST("Amandas_yogamat")
|
|
IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Amandas_yogamat"))
|
|
|
|
osYogaMats[2].ObjectIndex = GET_OBJECT_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Amandas_yogamat"))
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created Amanda's yoga mat object in the intro cutscene.")
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//keep requesting the animation dictionary containing yoga moves animations
|
|
REQUEST_ANIM_DICT("missfam5_yoga")
|
|
|
|
//create scripted camera for yoga warrior pose during family_5_int mocap cutscene
|
|
IF IS_CUTSCENE_PLAYING()
|
|
|
|
IF NOT DOES_CAM_EXIST(ScriptedCamera)
|
|
|
|
ScriptedCamera = CREATE_CAMERA(CAMTYPE_SCRIPTED, TRUE)
|
|
|
|
SET_CAM_PARAMS(ScriptedCamera, vWarriorStartCamPosition, vWarriorStartCamRotation, fWarriorStartCamFOV)
|
|
|
|
SHAKE_CAM(ScriptedCamera, "HAND_SHAKE", 0.125)
|
|
|
|
SET_CAM_FAR_CLIP(ScriptedCamera, 500)
|
|
SET_CAM_FAR_CLIP(ScriptedCamera, 500)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created scripted camera during family_5_int mocap cutscene.")
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michael")
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED, TRUE)
|
|
HIDE_PED_WEAPON_FOR_SCRIPTED_CUTSCENE(PLAYER_PED_ID(), TRUE)
|
|
IF HAS_ANIM_DICT_LOADED("missfam5_yoga")
|
|
WARP_PED(PLAYER_PED_ID(), << -790.906, 186.293, 71.8351 >>, 275.074219, FALSE, FALSE, FALSE)
|
|
TASK_PLAY_ANIM(PLAYER_PED_ID(), "missfam5_yoga", "start_pose", INSTANT_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING, 0, FALSE, AIK_DISABLE_LEG_IK)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID(), TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
CASCADE_SHADOWS_ENABLE_ENTITY_TRACKER(TRUE)
|
|
CASCADE_SHADOWS_SET_CASCADE_BOUNDS_SCALE(0.35)
|
|
CASCADE_SHADOWS_SET_ENTITY_TRACKER_SCALE(0.65)
|
|
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Amanda")
|
|
IF NOT IS_PED_INJURED(psAmanda.PedIndex)
|
|
IF HAS_ANIM_DICT_LOADED("missfam5_yoga")
|
|
WARP_PED(psAmanda.PedIndex, vAmandaWarriorPosition, vAmandaWarriorRotation.z, FALSE, FALSE, FALSE)
|
|
TASK_PLAY_ANIM_ADVANCED(psAmanda.PedIndex, "missfam5_yoga", "f_yogapose_a",
|
|
vAmandaWarriorPosition, vAmandaWarriorRotation, INSTANT_BLEND_IN, NORMAL_BLEND_OUT, -1,
|
|
AF_LOOPING | AF_EXTRACT_INITIAL_OFFSET | AF_NOT_INTERRUPTABLE | AF_USE_KINEMATIC_PHYSICS | AF_OVERRIDE_PHYSICS,
|
|
0, EULER_YXZ, AIK_DISABLE_LEG_IK)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(psAmanda.PedIndex)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Fabien")
|
|
IF NOT IS_PED_INJURED(psFabien.PedIndex)
|
|
IF HAS_ANIM_DICT_LOADED("missfam5_yoga")
|
|
WARP_PED(psFabien.PedIndex, vFabienWarriorPosition, vFabienWarriorRotation.z, FALSE, FALSE, FALSE)
|
|
TASK_PLAY_ANIM_ADVANCED(psFabien.PedIndex, "missfam5_yoga", "i_yogapose_a",
|
|
vFabienWarriorPosition, vFabienWarriorRotation, INSTANT_BLEND_IN, NORMAL_BLEND_OUT, -1,
|
|
AF_LOOPING | AF_EXTRACT_INITIAL_OFFSET | AF_NOT_INTERRUPTABLE | AF_USE_KINEMATIC_PHYSICS | AF_OVERRIDE_PHYSICS,
|
|
0, EULER_YXZ, AIK_DISABLE_LEG_IK)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(psFabien.PedIndex)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_CAMERA()
|
|
|
|
REPLAY_STOP_EVENT()
|
|
|
|
//start rendering from the scripted camera
|
|
IF DOES_CAM_EXIST(ScriptedCamera)
|
|
RENDER_SCRIPT_CAMS(TRUE, FALSE)
|
|
DISPLAY_RADAR(FALSE)
|
|
DISPLAY_HUD(FALSE)
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Starting rendering from scripted camera when CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY() returned true for Michael.")
|
|
#ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF HAS_CUTSCENE_FINISHED()
|
|
|
|
IF 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_OBJECT_BEEN_CREATED(osYogaMats[0])
|
|
AND HAS_MISSION_OBJECT_BEEN_CREATED(osYogaMats[1])
|
|
AND HAS_MISSION_OBJECT_BEEN_CREATED(osYogaMats[2])
|
|
AND HAS_ANIM_DICT_LOADED("missfam5_yoga")
|
|
AND PREPARE_MUSIC_EVENT("FAM5_YOGA_MOVE_START")
|
|
|
|
IF ( bCutsceneSkipped = TRUE ) //cutscene skipped
|
|
|
|
IF NOT IS_NEW_LOAD_SCENE_ACTIVE()
|
|
|
|
NEW_LOAD_SCENE_START(<< -782.81, 187.44, 73.33 >>, << -0.98, -0.17, -0.06 >>, 20.0) //this is the camera postion and camera direction on the first yoga move
|
|
|
|
iLoadSceneTimer = GET_GAME_TIMER()
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Calling NEW_LOAD_SCENE_START().")
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF IS_NEW_LOAD_SCENE_LOADED()
|
|
OR HAS_TIME_PASSED(10000, iLoadSceneTimer)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Calling NEW_LOAD_SCENE_STOP() due to IS_NEW_LOAD_SCENE_LOADED() returning TRUE.")
|
|
#ENDIF
|
|
|
|
NEW_LOAD_SCENE_STOP()
|
|
|
|
IF IS_SCREEN_FADED_OUT()
|
|
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
|
|
ENDIF
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE, FALSE)
|
|
|
|
RETURN TRUE
|
|
|
|
ENDIF
|
|
|
|
ELSE //cutscene not skipped
|
|
|
|
IF IS_SCREEN_FADED_OUT()
|
|
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
|
|
ENDIF
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE, FALSE)
|
|
|
|
RETURN TRUE
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
IF NOT REQUEST_SCRIPT_AUDIO_BANK("FAM5_YOGA_01")
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Loading audio bank FAM5_YOGA_01")
|
|
#ENDIF
|
|
ENDIF
|
|
|
|
IF NOT REQUEST_SCRIPT_AUDIO_BANK("FAM5_YOGA_02")
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Loading audio bank FAM5_YOGA_02")
|
|
#ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("FAMILY_5_YOGA_TRANQUIL")
|
|
IF ( GET_CUTSCENE_TIME() > 75500 )
|
|
START_AUDIO_SCENE("FAMILY_5_YOGA_TRANQUIL")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF ( bYogaMusicPlaying = FALSE )
|
|
IF GET_CUTSCENE_TIME() > 88000
|
|
IF TRIGGER_MUSIC_EVENT("FAM5_YOGA_MUSIC_START")
|
|
bYogaMusicPlaying = TRUE
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Triggering music event FAM5_YOGA_MUSIC_START.")
|
|
#ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
PREPARE_MUSIC_EVENT("FAM5_YOGA_MOVE_START")
|
|
|
|
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_YOGA_WARRIOR_COMPLETED(INT &iStageProgress)
|
|
|
|
INT i
|
|
|
|
SWITCH iStageProgress
|
|
|
|
CASE 0 //create scripted camera for yoga warrior pose during gameplay
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
|
|
IF NOT DOES_CAM_EXIST(ScriptedCamera)
|
|
|
|
ScriptedCamera = CREATE_CAMERA(CAMTYPE_SCRIPTED, TRUE)
|
|
|
|
SET_CAM_PARAMS(ScriptedCamera, vWarriorStartCamPosition, vWarriorStartCamRotation, fWarriorStartCamFOV)
|
|
SET_CAM_PARAMS(ScriptedCamera, vWarriorEndCamPosition, vWarriorEndCamRotation, fWarriorEndCamFOV, 25000,
|
|
GRAPH_TYPE_SIN_ACCEL_DECEL, GRAPH_TYPE_SIN_ACCEL_DECEL)
|
|
|
|
SHAKE_CAM(ScriptedCamera, "HAND_SHAKE", 0.125)
|
|
|
|
SET_CAM_FAR_CLIP(ScriptedCamera, 500)
|
|
SET_CAM_FAR_CLIP(ScriptedCamera, 500)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created scripted camera during yoga warrior pose gameplay.")
|
|
#ENDIF
|
|
|
|
DISPLAY_RADAR(FALSE)
|
|
DISPLAY_HUD(FALSE)
|
|
|
|
RENDER_SCRIPT_CAMS(TRUE, FALSE)
|
|
|
|
ENDIF
|
|
|
|
IF DOES_CAM_EXIST(ScriptedCamera)
|
|
|
|
IF NOT IS_CAM_RENDERING(ScriptedCamera)
|
|
|
|
RENDER_SCRIPT_CAMS(TRUE, FALSE)
|
|
DISPLAY_RADAR(FALSE)
|
|
DISPLAY_HUD(FALSE)
|
|
|
|
ENDIF
|
|
|
|
//if camera is rendering already for example from previous stage when it started rendering at the end of the mocap,
|
|
//then just change camera params
|
|
IF IS_CAM_RENDERING(ScriptedCamera)
|
|
|
|
SET_CAM_PARAMS(ScriptedCamera, vWarriorStartCamPosition, vWarriorStartCamRotation, fWarriorStartCamFOV)
|
|
SET_CAM_PARAMS(ScriptedCamera, vWarriorEndCamPosition, vWarriorEndCamRotation, fWarriorEndCamFOV, 25000,
|
|
GRAPH_TYPE_SIN_ACCEL_DECEL, GRAPH_TYPE_SIN_ACCEL_DECEL)
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
RESET_YOGA_STRUCT(sYogaPlayer, TRUE, TRUE)
|
|
|
|
IF NOT IS_PED_INJURED(psAmanda.PedIndex)
|
|
IF NOT IS_ENTITY_PLAYING_ANIM(psAmanda.PedIndex, "missfam5_yoga", "f_yogapose_a")
|
|
IF HAS_ANIM_DICT_LOADED("missfam5_yoga")
|
|
TASK_PLAY_ANIM_ADVANCED(psAmanda.PedIndex, "missfam5_yoga", "f_yogapose_a",
|
|
vAmandaWarriorPosition, vAmandaWarriorRotation, INSTANT_BLEND_IN, NORMAL_BLEND_OUT, -1,
|
|
AF_LOOPING | AF_EXTRACT_INITIAL_OFFSET | AF_NOT_INTERRUPTABLE | AF_USE_KINEMATIC_PHYSICS | AF_OVERRIDE_PHYSICS,
|
|
0, EULER_YXZ, AIK_DISABLE_LEG_IK)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(psAmanda.PedIndex)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(psFabien.PedIndex)
|
|
IF NOT IS_ENTITY_PLAYING_ANIM(psFabien.PedIndex, "missfam5_yoga", "i_yogapose_a")
|
|
IF HAS_ANIM_DICT_LOADED("missfam5_yoga")
|
|
TASK_PLAY_ANIM_ADVANCED(psFabien.PedIndex, "missfam5_yoga", "i_yogapose_a",
|
|
vFabienWarriorPosition, vFabienWarriorRotation, INSTANT_BLEND_IN, NORMAL_BLEND_OUT, -1,
|
|
AF_LOOPING | AF_EXTRACT_INITIAL_OFFSET | AF_NOT_INTERRUPTABLE | AF_USE_KINEMATIC_PHYSICS | AF_OVERRIDE_PHYSICS,
|
|
0, EULER_YXZ, AIK_DISABLE_LEG_IK)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(psFabien.PedIndex)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//freeze yoga mats in case they get pushed around
|
|
FOR i = 0 TO (COUNT_OF(osYogaMats) - 1 )
|
|
IF DOES_ENTITY_EXIST(osYogaMats[i].ObjectIndex)
|
|
IF NOT IS_ENTITY_DEAD(osYogaMats[i].ObjectIndex)
|
|
FREEZE_ENTITY_POSITION(osYogaMats[i].ObjectIndex, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDFOR
|
|
|
|
IF IS_SCREEN_FADED_OUT()
|
|
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
|
|
ENDIF
|
|
|
|
IF PREPARE_MUSIC_EVENT("FAM5_YOGA_MOVE_START")
|
|
TRIGGER_MUSIC_EVENT("FAM5_YOGA_MOVE_START")
|
|
ENDIF
|
|
|
|
iStageProgress++
|
|
|
|
BREAK
|
|
|
|
CASE 1
|
|
|
|
//play opening conversation
|
|
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM5_WARB")
|
|
AND NOT HAS_LABEL_BEEN_TRIGGERED("FAM5_WARBF")
|
|
|
|
IF ( bStageReplayInProgress = FALSE )
|
|
|
|
IF CREATE_CONVERSATION(Family5Conversation, "FAM5AUD", "FAM5_WARB", CONV_PRIORITY_MEDIUM)
|
|
SET_LABEL_AS_TRIGGERED("FAM5_WARB", TRUE)
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
IF PLAY_SINGLE_LINE_FROM_CONVERSATION(Family5Conversation, "FAM5AUD", "FAM5_WARBF", "FAM5_WARBF_1", CONV_PRIORITY_MEDIUM)
|
|
SET_LABEL_AS_TRIGGERED("FAM5_WARBF", TRUE)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
iStageProgress++
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 2
|
|
|
|
MAKE_PED_LOOK_AT_ENTITY_WITH_INTERVAL(psAmanda.PedIndex, PLAYER_PED_ID(), psAmanda.bLookingAtTarget, psAmanda.iLookAtTimer,
|
|
psAmanda.iTimer, psAmanda.iLookAtTime, psAmanda.iIntervalTime, 3000, 6000, 2000, 7500)
|
|
|
|
MAKE_PED_LOOK_AT_ENTITY_WITH_INTERVAL(psFabien.PedIndex, PLAYER_PED_ID(), psFabien.bLookingAtTarget, psFabien.iLookAtTimer,
|
|
psFabien.iTimer, psFabien.iLookAtTime, psFabien.iIntervalTime, 3750, 7500, 3000, 8000)
|
|
|
|
IF ( sYogaPlayer.eYogaMinigameStage = YOGAMINIGAMESTAGE_FAILRESET )
|
|
IF ( iFailConversationSpeaker = -1 )
|
|
iFailConversationSpeaker = GET_RANDOM_INT_IN_RANGE(0, 2)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": iFailConversationSpeaker is ", iFailConversationSpeaker, ".")
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
ELSE
|
|
iFailConversationSpeaker = -1
|
|
ENDIF
|
|
|
|
UPDATE_YOGA_TIMECYCLE_MODIFIER(sYogaPlayer, TRUE)
|
|
RUN_YOGA_FAIL_CAMERA(sYogaPlayer, iFailConversationSpeaker)
|
|
|
|
MANAGE_YOGA_CONVERSATIONS(sYogaPlayer, iYogaPosesCounter, iYogaBreathsCounter, iYogaIdleTimer, iYogaFailsCounter,
|
|
"FAM5_WARIA", "FAM5_WARIF", "FAM5_WARPA", "FAM5_WARPF", "FAM5_WARE",
|
|
bBreatheConversationTriggered, "FAM5_WARFB",
|
|
bBreatheCompletedConversationTriggered, "FAM5_WARBC",
|
|
bBreatheFailedConversationTriggered, "FAM5_WARBTF",
|
|
bInhaleConversationTriggered, "FAM5_WARIN",
|
|
bExhaleConversationTriggered, "FAM5_WAREX",
|
|
bFailConversationTriggered, "FAM5_WARDA", "FAM5_WARDF", "FAM5_WARF", 2)
|
|
|
|
IF HAS_PLAYER_COMPLETED_YOGA_MOVE(sYogaPlayer, YOGAMOVE_WARRIOR, FALSE, TRUE, TRUE)
|
|
|
|
//Play Michael's success conversation
|
|
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM5_WARS")
|
|
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
IF CREATE_CONVERSATION(Family5Conversation, "FAM5AUD", "FAM5_WARS", CONV_PRIORITY_MEDIUM)
|
|
SET_LABEL_AS_TRIGGERED("FAM5_WARS", TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
|
|
//if player didn't fail warrior even one time, set the warrior stat to completed
|
|
IF ( sYogaPlayer.iFailCounter = 0 )
|
|
INFORM_STAT_SYSTEM_OF_BOOL_STAT_HAPPENED(FAM5_WARRIOR_POSE)
|
|
ENDIF
|
|
|
|
RESET_YOGA_STRUCT(sYogaPlayer, FALSE, FALSE)
|
|
|
|
RESET_ALL_SFX_FLAGS(ssSounds)
|
|
|
|
IF NOT IS_PED_INJURED(psAmanda.PedIndex)
|
|
TASK_CLEAR_LOOK_AT(psAmanda.PedIndex)
|
|
psAmanda.bLookingAtTarget = FALSE
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(psFabien.PedIndex)
|
|
TASK_CLEAR_LOOK_AT(psFabien.PedIndex)
|
|
psFabien.bLookingAtTarget = FALSE
|
|
ENDIF
|
|
|
|
//unfreeze yoga mats in case they get pushed around
|
|
FOR i = 0 TO (COUNT_OF(osYogaMats) - 1 )
|
|
IF DOES_ENTITY_EXIST(osYogaMats[i].ObjectIndex)
|
|
IF NOT IS_ENTITY_DEAD(osYogaMats[i].ObjectIndex)
|
|
FREEZE_ENTITY_POSITION(osYogaMats[i].ObjectIndex, FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDFOR
|
|
|
|
REPLAY_RECORD_BACK_FOR_TIME(5, 3, REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
RETURN TRUE
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
//request subsequent mocap cutscene
|
|
REQUEST_CUTSCENE("family_5_mcs_1")
|
|
|
|
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", PLAYER_PED_ID())
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Amanda", psAmanda.PedIndex)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Fabien", psFabien.PedIndex)
|
|
ENDIF
|
|
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
RETURN FALSE
|
|
|
|
ENDFUNC
|
|
|
|
FUNC BOOL IS_MISSION_STAGE_CUTSCENE_TRIANGLE_COMPLETED(INT &iStageProgress)
|
|
|
|
SWITCH iStageProgress
|
|
|
|
CASE 0
|
|
|
|
IF HAS_REQUESTED_CUTSCENE_LOADED("family_5_mcs_1")
|
|
|
|
IF NOT IS_PED_INJURED(psAmanda.PedIndex)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(psAmanda.PedIndex, "Amanda", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(psFabien.PedIndex)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(psFabien.PedIndex, "Fabien", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
|
|
//Michael's yoga mat
|
|
IF DOES_ENTITY_EXIST(osYogaMats[0].ObjectIndex)
|
|
IF NOT IS_ENTITY_DEAD(osYogaMats[0].ObjectIndex)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(osYogaMats[0].ObjectIndex, "Michaels_YogaMat", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, osYogaMats[0].ModelName)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Fabien's yoga mat
|
|
IF DOES_ENTITY_EXIST(osYogaMats[1].ObjectIndex)
|
|
IF NOT IS_ENTITY_DEAD(osYogaMats[1].ObjectIndex)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(osYogaMats[1].ObjectIndex, "Fabiens_YogaMat", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, osYogaMats[1].ModelName)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Amanda's yoga mat
|
|
IF DOES_ENTITY_EXIST(osYogaMats[2].ObjectIndex)
|
|
IF NOT IS_ENTITY_DEAD(osYogaMats[2].ObjectIndex)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(osYogaMats[2].ObjectIndex, "Amandas_yogamat", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, osYogaMats[2].ModelName)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
|
|
|
|
TRIGGER_MUSIC_EVENT("FAM5_YOGA_MUSIC_CHANGE")
|
|
|
|
START_CUTSCENE(CUTSCENE_SUPPRESS_FP_TRANSITION_FLASH)
|
|
|
|
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
iStageProgress++
|
|
|
|
ELSE
|
|
|
|
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
|
|
//Michael's variations
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", PLAYER_PED_ID(), PLAYER_ZERO)
|
|
//Amanda's variations
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Amanda", PED_COMP_HAIR, 4, 0)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Amanda", PED_COMP_TORSO, 1, 0)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Amanda", PED_COMP_LEG, 1, 0)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Amanda", PED_COMP_DECL, 1, 0)
|
|
//Fabien's variations
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Fabien", PED_COMP_HEAD, 0, 0)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Fabien", PED_COMP_TORSO, 0, 0)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Fabien", PED_COMP_LEG, 0, 0)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 1 //fade screen in if screen was faded out due to shit skip or debug skip
|
|
|
|
IF IS_CUTSCENE_PLAYING()
|
|
|
|
IF IS_SCREEN_FADED_OUT()
|
|
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
|
|
ENDIF
|
|
|
|
iStageProgress++
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 2
|
|
|
|
//keep requesting the animation dictionary containing yoga moves animations
|
|
REQUEST_ANIM_DICT("missfam5_yoga")
|
|
|
|
//create scripted camera for yoga triangle pose during family_5_mcs_1 mocap cutscene
|
|
IF IS_CUTSCENE_PLAYING()
|
|
|
|
IF NOT DOES_CAM_EXIST(ScriptedCamera)
|
|
|
|
ScriptedCamera = CREATE_CAMERA(CAMTYPE_SCRIPTED, TRUE)
|
|
|
|
SET_CAM_PARAMS(ScriptedCamera, vTriangleStartCamPosition, vTriangleStartCamRotation, fTriangleStartCamFOV)
|
|
|
|
SHAKE_CAM(ScriptedCamera, "HAND_SHAKE", 0.125)
|
|
|
|
SET_CAM_FAR_CLIP(ScriptedCamera, 500)
|
|
SET_CAM_FAR_CLIP(ScriptedCamera, 500)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created scripted camera during family_5_mcs_1 mocap cutscene.")
|
|
#ENDIF
|
|
|
|
ELIF DOES_CAM_EXIST(ScriptedCamera)
|
|
|
|
SET_CAM_PARAMS(ScriptedCamera, vTriangleStartCamPosition, vTriangleStartCamRotation, fTriangleStartCamFOV)
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michael")
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED, TRUE)
|
|
HIDE_PED_WEAPON_FOR_SCRIPTED_CUTSCENE(PLAYER_PED_ID(), TRUE)
|
|
IF HAS_ANIM_DICT_LOADED("missfam5_yoga")
|
|
TASK_PLAY_ANIM(PLAYER_PED_ID(), "missfam5_yoga", "start_pose", INSTANT_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING, 0, FALSE, AIK_DISABLE_LEG_IK)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID(), TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
CASCADE_SHADOWS_ENABLE_ENTITY_TRACKER(TRUE)
|
|
CASCADE_SHADOWS_SET_CASCADE_BOUNDS_SCALE(0.35)
|
|
CASCADE_SHADOWS_SET_ENTITY_TRACKER_SCALE(0.65)
|
|
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Amanda")
|
|
IF NOT IS_PED_INJURED(psAmanda.PedIndex)
|
|
IF HAS_ANIM_DICT_LOADED("missfam5_yoga")
|
|
WARP_PED(psAmanda.PedIndex, vAmandaTrianglePosition, vAmandaTriangleRotation.z, FALSE, FALSE, FALSE)
|
|
TASK_PLAY_ANIM_ADVANCED(psAmanda.PedIndex, "missfam5_yoga", "f_yogapose_b",
|
|
vAmandaTrianglePosition, vAmandaTriangleRotation, INSTANT_BLEND_IN, NORMAL_BLEND_OUT, -1,
|
|
AF_LOOPING | AF_EXTRACT_INITIAL_OFFSET | AF_NOT_INTERRUPTABLE | AF_USE_KINEMATIC_PHYSICS | AF_OVERRIDE_PHYSICS,
|
|
0, EULER_YXZ, AIK_DISABLE_LEG_IK)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(psAmanda.PedIndex)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Fabien")
|
|
IF NOT IS_PED_INJURED(psFabien.PedIndex)
|
|
IF HAS_ANIM_DICT_LOADED("missfam5_yoga")
|
|
WARP_PED(psFabien.PedIndex, vFabienTrianglePosition, vFabienTriangleRotation.z, FALSE, FALSE, FALSE)
|
|
TASK_PLAY_ANIM_ADVANCED(psFabien.PedIndex, "missfam5_yoga", "i_yogapose_b",
|
|
vFabienTrianglePosition, vFabienTriangleRotation, INSTANT_BLEND_IN, NORMAL_BLEND_OUT, -1,
|
|
AF_LOOPING | AF_EXTRACT_INITIAL_OFFSET | AF_NOT_INTERRUPTABLE | AF_USE_KINEMATIC_PHYSICS | AF_OVERRIDE_PHYSICS,
|
|
0, EULER_YXZ, AIK_DISABLE_LEG_IK)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(psFabien.PedIndex)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_CAMERA()
|
|
//start rendering from the scripted camera
|
|
IF DOES_CAM_EXIST(ScriptedCamera)
|
|
SET_CAM_PARAMS(ScriptedCamera, vTriangleStartCamPosition, vTriangleStartCamRotation, fTriangleStartCamFOV)
|
|
RENDER_SCRIPT_CAMS(TRUE, FALSE)
|
|
DISPLAY_RADAR(FALSE)
|
|
DISPLAY_HUD(FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF HAS_CUTSCENE_FINISHED()
|
|
|
|
IF PREPARE_MUSIC_EVENT("FAM5_YOGA_MOVE_START")
|
|
|
|
IF IS_SCREEN_FADED_OUT()
|
|
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
|
|
ENDIF
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE, FALSE)
|
|
|
|
REPLAY_STOP_EVENT()
|
|
|
|
RETURN TRUE
|
|
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
PREPARE_MUSIC_EVENT("FAM5_YOGA_MOVE_START")
|
|
|
|
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_YOGA_TRIANGLE_COMPLETED(INT &iStageProgress)
|
|
|
|
INT i
|
|
|
|
SWITCH iStageProgress
|
|
|
|
CASE 0 //create scripted camera for yoga warrior pose during gameplay
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
|
|
IF NOT DOES_CAM_EXIST(ScriptedCamera)
|
|
|
|
ScriptedCamera = CREATE_CAMERA(CAMTYPE_SCRIPTED, TRUE)
|
|
|
|
SET_CAM_PARAMS(ScriptedCamera, vTriangleStartCamPosition, vTriangleStartCamRotation, fTriangleStartCamFOV)
|
|
SET_CAM_PARAMS(ScriptedCamera, vTriangleEndCamPosition, vTriangleEndCamRotation, fTriangleEndCamFOV, 25000,
|
|
GRAPH_TYPE_SIN_ACCEL_DECEL, GRAPH_TYPE_SIN_ACCEL_DECEL)
|
|
|
|
SHAKE_CAM(ScriptedCamera, "HAND_SHAKE", 0.125)
|
|
|
|
SET_CAM_FAR_CLIP(ScriptedCamera, 500)
|
|
SET_CAM_FAR_CLIP(ScriptedCamera, 500)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created scripted camera during yoga triangle pose gameplay.")
|
|
#ENDIF
|
|
|
|
DISPLAY_RADAR(FALSE)
|
|
DISPLAY_HUD(FALSE)
|
|
|
|
RENDER_SCRIPT_CAMS(TRUE, FALSE)
|
|
|
|
ENDIF
|
|
|
|
IF DOES_CAM_EXIST(ScriptedCamera)
|
|
|
|
IF NOT IS_CAM_RENDERING(ScriptedCamera)
|
|
|
|
RENDER_SCRIPT_CAMS(TRUE, FALSE)
|
|
DISPLAY_RADAR(FALSE)
|
|
DISPLAY_HUD(FALSE)
|
|
|
|
ENDIF
|
|
|
|
//if camera is rendering already for example from previous stage when it started rendering at the end of the mocap,
|
|
//then just change camera params
|
|
IF IS_CAM_RENDERING(ScriptedCamera)
|
|
|
|
SET_CAM_PARAMS(ScriptedCamera, vTriangleStartCamPosition, vTriangleStartCamRotation, fTriangleStartCamFOV)
|
|
SET_CAM_PARAMS(ScriptedCamera, vTriangleEndCamPosition, vTriangleEndCamRotation, fTriangleEndCamFOV, 25000,
|
|
GRAPH_TYPE_SIN_ACCEL_DECEL, GRAPH_TYPE_SIN_ACCEL_DECEL)
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
RESET_YOGA_STRUCT(sYogaPlayer, FALSE, FALSE)
|
|
|
|
IF NOT IS_PED_INJURED(psAmanda.PedIndex)
|
|
IF NOT IS_ENTITY_PLAYING_ANIM(psAmanda.PedIndex, "missfam5_yoga", "f_yogapose_b")
|
|
IF HAS_ANIM_DICT_LOADED("missfam5_yoga")
|
|
TASK_PLAY_ANIM_ADVANCED(psAmanda.PedIndex, "missfam5_yoga", "f_yogapose_b",
|
|
vAmandaTrianglePosition, vAmandaTriangleRotation, INSTANT_BLEND_IN, NORMAL_BLEND_OUT, -1,
|
|
AF_LOOPING | AF_EXTRACT_INITIAL_OFFSET | AF_NOT_INTERRUPTABLE | AF_USE_KINEMATIC_PHYSICS | AF_OVERRIDE_PHYSICS,
|
|
0, EULER_YXZ, AIK_DISABLE_LEG_IK)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(psAmanda.PedIndex)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(psFabien.PedIndex)
|
|
IF NOT IS_ENTITY_PLAYING_ANIM(psFabien.PedIndex, "missfam5_yoga", "i_yogapose_b")
|
|
IF HAS_ANIM_DICT_LOADED("missfam5_yoga")
|
|
TASK_PLAY_ANIM_ADVANCED(psFabien.PedIndex, "missfam5_yoga", "i_yogapose_b",
|
|
vFabienTrianglePosition, vFabienTriangleRotation, INSTANT_BLEND_IN, NORMAL_BLEND_OUT, -1,
|
|
AF_LOOPING | AF_EXTRACT_INITIAL_OFFSET | AF_NOT_INTERRUPTABLE | AF_USE_KINEMATIC_PHYSICS | AF_OVERRIDE_PHYSICS,
|
|
0, EULER_YXZ, AIK_DISABLE_LEG_IK)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(psFabien.PedIndex)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//freeze yoga mats in case they get pushed around
|
|
FOR i = 0 TO (COUNT_OF(osYogaMats) - 1 )
|
|
IF DOES_ENTITY_EXIST(osYogaMats[i].ObjectIndex)
|
|
IF NOT IS_ENTITY_DEAD(osYogaMats[i].ObjectIndex)
|
|
FREEZE_ENTITY_POSITION(osYogaMats[i].ObjectIndex, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDFOR
|
|
|
|
IF IS_SCREEN_FADED_OUT()
|
|
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
|
|
ENDIF
|
|
|
|
IF PREPARE_MUSIC_EVENT("FAM5_YOGA_MOVE_START")
|
|
TRIGGER_MUSIC_EVENT("FAM5_YOGA_MOVE_START")
|
|
ENDIF
|
|
|
|
iStageProgress++
|
|
|
|
BREAK
|
|
|
|
CASE 1
|
|
|
|
//play opening conversation
|
|
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM5_TRIB")
|
|
AND NOT HAS_LABEL_BEEN_TRIGGERED("FAM5_TRIBF")
|
|
|
|
IF ( bStageReplayInProgress = FALSE )
|
|
|
|
IF PLAY_SINGLE_LINE_FROM_CONVERSATION(Family5Conversation, "FAM5AUD", "FAM5_TRIB", "FAM5_TRIB_1", CONV_PRIORITY_MEDIUM)
|
|
SET_LABEL_AS_TRIGGERED("FAM5_TRIB", TRUE)
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
IF PLAY_SINGLE_LINE_FROM_CONVERSATION(Family5Conversation, "FAM5AUD", "FAM5_TRIBF", "FAM5_TRIBF_3", CONV_PRIORITY_MEDIUM)
|
|
SET_LABEL_AS_TRIGGERED("FAM5_TRIBF", TRUE)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ELSE
|
|
iStageProgress++
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 2
|
|
|
|
MAKE_PED_LOOK_AT_ENTITY_WITH_INTERVAL(psAmanda.PedIndex, PLAYER_PED_ID(), psAmanda.bLookingAtTarget, psAmanda.iLookAtTimer,
|
|
psAmanda.iTimer, psAmanda.iLookAtTime, psAmanda.iIntervalTime, 3000, 6000, 2000, 7500)
|
|
|
|
MAKE_PED_LOOK_AT_ENTITY_WITH_INTERVAL(psFabien.PedIndex, PLAYER_PED_ID(), psFabien.bLookingAtTarget, psFabien.iLookAtTimer,
|
|
psFabien.iTimer, psFabien.iLookAtTime, psFabien.iIntervalTime, 3750, 7500, 3000, 8000)
|
|
|
|
IF ( sYogaPlayer.eYogaMinigameStage = YOGAMINIGAMESTAGE_FAILRESET )
|
|
IF ( iFailConversationSpeaker = -1 )
|
|
iFailConversationSpeaker = GET_RANDOM_INT_IN_RANGE(0, 2)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": iFailConversationSpeaker is ", iFailConversationSpeaker, ".")
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
ELSE
|
|
iFailConversationSpeaker = -1
|
|
ENDIF
|
|
|
|
UPDATE_YOGA_TIMECYCLE_MODIFIER(sYogaPlayer, TRUE)
|
|
RUN_YOGA_FAIL_CAMERA(sYogaPlayer, iFailConversationSpeaker)
|
|
|
|
MANAGE_YOGA_CONVERSATIONS(sYogaPlayer, iYogaPosesCounter, iYogaBreathsCounter, iYogaIdleTimer, iYogaFailsCounter,
|
|
"FAM5_TRIIA", "FAM5_TRIIF", "FAM5_TRIPA", "FAM5_TRIPF", "FAM5_TRIE",
|
|
bBreatheConversationTriggered, "FAM5_TRIFB",
|
|
bBreatheCompletedConversationTriggered, "FAM5_TRIBC",
|
|
bBreatheFailedConversationTriggered, "FAM5_TRIBTF",
|
|
bInhaleConversationTriggered, "FAM5_WARIN",
|
|
bExhaleConversationTriggered, "FAM5_WAREX",
|
|
bFailConversationTriggered, "FAM5_TRIDA", "FAM5_TRIDF", "FAM5_TRIF", 4)
|
|
|
|
IF HAS_PLAYER_COMPLETED_YOGA_MOVE(sYogaPlayer, YOGAMOVE_TRIANGLE, FALSE, bStageReplayInProgress, FALSE)
|
|
|
|
//Play Michael's success conversation
|
|
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM5_TRIS")
|
|
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
IF CREATE_CONVERSATION(Family5Conversation, "FAM5AUD", "FAM5_TRIS", CONV_PRIORITY_MEDIUM)
|
|
SET_LABEL_AS_TRIGGERED("FAM5_TRIS", TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
|
|
//if player didn't fail traingle even one time set the traingle stat to completed
|
|
IF ( sYogaPlayer.iFailCounter = 0 )
|
|
INFORM_STAT_SYSTEM_OF_BOOL_STAT_HAPPENED(FAM5_TRIANGLE_POSE)
|
|
ENDIF
|
|
|
|
RESET_YOGA_STRUCT(sYogaPlayer, FALSE, FALSE)
|
|
|
|
RESET_ALL_SFX_FLAGS(ssSounds)
|
|
|
|
IF NOT IS_PED_INJURED(psAmanda.PedIndex)
|
|
TASK_CLEAR_LOOK_AT(psAmanda.PedIndex)
|
|
psAmanda.bLookingAtTarget = FALSE
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(psFabien.PedIndex)
|
|
TASK_CLEAR_LOOK_AT(psFabien.PedIndex)
|
|
psFabien.bLookingAtTarget = FALSE
|
|
ENDIF
|
|
|
|
//unfreeze yoga mats in case they get pushed around
|
|
FOR i = 0 TO (COUNT_OF(osYogaMats) - 1 )
|
|
IF DOES_ENTITY_EXIST(osYogaMats[i].ObjectIndex)
|
|
IF NOT IS_ENTITY_DEAD(osYogaMats[i].ObjectIndex)
|
|
FREEZE_ENTITY_POSITION(osYogaMats[i].ObjectIndex, FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDFOR
|
|
|
|
REPLAY_RECORD_BACK_FOR_TIME(5, 4, REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
RETURN TRUE
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
//request mocap cutscene
|
|
REQUEST_CUTSCENE("family_5_mcs_2")
|
|
|
|
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", PLAYER_PED_ID())
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Amanda", psAmanda.PedIndex)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Fabien", psFabien.PedIndex)
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
RETURN FALSE
|
|
|
|
ENDFUNC
|
|
|
|
FUNC BOOL IS_MISSION_STAGE_CUTSCENE_SUNSALUTATION_COMPLETED(INT &iStageProgress)
|
|
|
|
SWITCH iStageProgress
|
|
|
|
CASE 0
|
|
|
|
IF HAS_REQUESTED_CUTSCENE_LOADED("family_5_mcs_2")
|
|
|
|
IF NOT IS_PED_INJURED(psAmanda.PedIndex)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(psAmanda.PedIndex, "Amanda", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(psFabien.PedIndex)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(psFabien.PedIndex, "Fabien", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
|
|
//Michael's yoga mat
|
|
IF DOES_ENTITY_EXIST(osYogaMats[0].ObjectIndex)
|
|
IF NOT IS_ENTITY_DEAD(osYogaMats[0].ObjectIndex)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(osYogaMats[0].ObjectIndex, "Michaels_YogaMat", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, osYogaMats[0].ModelName)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Fabien's yoga mat
|
|
IF DOES_ENTITY_EXIST(osYogaMats[1].ObjectIndex)
|
|
IF NOT IS_ENTITY_DEAD(osYogaMats[1].ObjectIndex)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(osYogaMats[1].ObjectIndex, "Fabiens_YogaMat", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, osYogaMats[1].ModelName)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Amanda's yoga mat
|
|
IF DOES_ENTITY_EXIST(osYogaMats[2].ObjectIndex)
|
|
IF NOT IS_ENTITY_DEAD(osYogaMats[2].ObjectIndex)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(osYogaMats[2].ObjectIndex, "Amandas_yogamat", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, osYogaMats[2].ModelName)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
|
|
|
|
START_CUTSCENE(CUTSCENE_SUPPRESS_FP_TRANSITION_FLASH)
|
|
|
|
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
iStageProgress++
|
|
|
|
ELSE
|
|
|
|
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
|
|
//Michael's variations
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", PLAYER_PED_ID(), PLAYER_ZERO)
|
|
//Amanda's variations
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Amanda", PED_COMP_HAIR, 4, 0)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Amanda", PED_COMP_TORSO, 1, 0)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Amanda", PED_COMP_LEG, 1, 0)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Amanda", PED_COMP_DECL, 1, 0)
|
|
//Fabien's variations
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Fabien", PED_COMP_HEAD, 0, 0)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Fabien", PED_COMP_TORSO, 0, 0)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Fabien", PED_COMP_LEG, 0, 0)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 1 //fade screen in if screen was faded out due to shit skip or debug skip
|
|
|
|
IF IS_CUTSCENE_PLAYING()
|
|
|
|
IF IS_SCREEN_FADED_OUT()
|
|
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
|
|
ENDIF
|
|
|
|
iStageProgress++
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 2
|
|
|
|
//keep requesting the animation dictionary containing yoga moves animations
|
|
REQUEST_ANIM_DICT("missfam5_yoga")
|
|
|
|
//create scripted camera for yoga warrior pose during family_5_mcs_2 mocap cutscene
|
|
IF IS_CUTSCENE_PLAYING()
|
|
|
|
IF NOT DOES_CAM_EXIST(ScriptedCamera)
|
|
|
|
ScriptedCamera = CREATE_CAMERA(CAMTYPE_SCRIPTED, TRUE)
|
|
|
|
SET_CAM_PARAMS(ScriptedCamera, vSunSalutaionStartCamPosition, vSunSalutaionStartCamRotation, fSunSalutaionStartCamFOV)
|
|
|
|
SHAKE_CAM(ScriptedCamera, "HAND_SHAKE", 0.125)
|
|
|
|
SET_CAM_FAR_CLIP(ScriptedCamera, 500)
|
|
SET_CAM_FAR_CLIP(ScriptedCamera, 500)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created scripted camera during family_5_mcs_2 mocap cutscene.")
|
|
#ENDIF
|
|
|
|
ELIF DOES_CAM_EXIST(ScriptedCamera)
|
|
|
|
SET_CAM_PARAMS(ScriptedCamera, vSunSalutaionStartCamPosition, vSunSalutaionStartCamRotation, fSunSalutaionStartCamFOV)
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michael")
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED, TRUE)
|
|
HIDE_PED_WEAPON_FOR_SCRIPTED_CUTSCENE(PLAYER_PED_ID(), TRUE)
|
|
IF HAS_ANIM_DICT_LOADED("missfam5_yoga")
|
|
IF ( bCutsceneSkipped = TRUE )
|
|
WARP_PED(PLAYER_PED_ID(), << -790.906, 186.293, 71.8351 >>, 275.074219, FALSE, FALSE, FALSE)
|
|
ENDIF
|
|
TASK_PLAY_ANIM(PLAYER_PED_ID(), "missfam5_yoga", "start_pose", SLOW_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING, 0, FALSE, AIK_DISABLE_LEG_IK)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID(), TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
CASCADE_SHADOWS_ENABLE_ENTITY_TRACKER(TRUE)
|
|
CASCADE_SHADOWS_SET_CASCADE_BOUNDS_SCALE(0.35)
|
|
CASCADE_SHADOWS_SET_ENTITY_TRACKER_SCALE(0.65)
|
|
|
|
ENDIF
|
|
|
|
/* //this is a better yoga mat postion when doing seamless exit into gameplay, avoids michael's hands clipping into the mat
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michaels_YogaMat")
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ":CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY() returned true for Michaels_YogaMat.")
|
|
#ENDIF
|
|
IF ( bCutsceneSkipped = FALSE )
|
|
IF DOES_ENTITY_EXIST(osYogaMats[0].ObjectIndex)
|
|
IF NOT IS_ENTITY_DEAD(osYogaMats[0].ObjectIndex)
|
|
SET_ENTITY_COORDS_NO_OFFSET(osYogaMats[0].ObjectIndex, << -791.530, 186.375, 71.821 >>)
|
|
SET_ENTITY_ROTATION(osYogaMats[0].ObjectIndex, << 0.0, 0.0, 0.0 >>)
|
|
FREEZE_ENTITY_POSITION(osYogaMats[0].ObjectIndex, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
*/
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Amanda")
|
|
IF NOT IS_PED_INJURED(psAmanda.PedIndex)
|
|
IF HAS_ANIM_DICT_LOADED("missfam5_yoga")
|
|
WARP_PED(psAmanda.PedIndex, vAmandaSunsalutationPosition, vAmandaSunsalutationRotation.z, FALSE, FALSE, FALSE)
|
|
TASK_PLAY_ANIM_ADVANCED(psAmanda.PedIndex, "missfam5_yoga", "f_yogapose_c",
|
|
vAmandaSunsalutationPosition, vAmandaSunsalutationRotation, INSTANT_BLEND_IN, NORMAL_BLEND_OUT, -1,
|
|
AF_LOOPING | AF_EXTRACT_INITIAL_OFFSET | AF_NOT_INTERRUPTABLE | AF_USE_KINEMATIC_PHYSICS | AF_OVERRIDE_PHYSICS,
|
|
0, EULER_YXZ, AIK_DISABLE_LEG_IK)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(psAmanda.PedIndex)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Fabien")
|
|
IF NOT IS_PED_INJURED(psFabien.PedIndex)
|
|
IF HAS_ANIM_DICT_LOADED("missfam5_yoga")
|
|
WARP_PED(psFabien.PedIndex, vFabienSunsalutationPosition, vFabienSunsalutationRotation.z, FALSE, FALSE, FALSE)
|
|
TASK_PLAY_ANIM_ADVANCED(psFabien.PedIndex, "missfam5_yoga", "i_yogapose_c",
|
|
vFabienSunsalutationPosition, vFabienSunsalutationRotation, INSTANT_BLEND_IN, NORMAL_BLEND_OUT, -1,
|
|
AF_LOOPING | AF_EXTRACT_INITIAL_OFFSET | AF_NOT_INTERRUPTABLE | AF_USE_KINEMATIC_PHYSICS | AF_OVERRIDE_PHYSICS,
|
|
0, EULER_YXZ, AIK_DISABLE_LEG_IK)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(psFabien.PedIndex)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_CAMERA()
|
|
//start rendering from the scripted camera
|
|
IF DOES_CAM_EXIST(ScriptedCamera)
|
|
SET_CAM_PARAMS(ScriptedCamera, vSunSalutaionStartCamPosition, vSunSalutaionStartCamRotation, fSunSalutaionStartCamFOV)
|
|
RENDER_SCRIPT_CAMS(TRUE, FALSE)
|
|
DISPLAY_RADAR(FALSE)
|
|
DISPLAY_HUD(FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF HAS_CUTSCENE_FINISHED()
|
|
|
|
IF PREPARE_MUSIC_EVENT("FAM5_YOGA_MOVE_START")
|
|
|
|
IF IS_SCREEN_FADED_OUT()
|
|
IF ( bCutsceneSkipped = TRUE )
|
|
WAIT(500) //do a short wait before fading in, this hides a pop on michael on cutscene skip
|
|
ENDIF
|
|
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
|
|
ENDIF
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE, FALSE)
|
|
|
|
REPLAY_STOP_EVENT()
|
|
|
|
RETURN TRUE
|
|
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
PREPARE_MUSIC_EVENT("FAM5_YOGA_MOVE_START")
|
|
|
|
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_YOGA_SUNSALUTATION_COMPLETED(INT &iStageProgress)
|
|
|
|
INT i
|
|
|
|
SWITCH iStageProgress
|
|
|
|
CASE 0 //create scripted camera for yoga warrior pose during gameplay
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
|
|
IF NOT DOES_CAM_EXIST(ScriptedCamera)
|
|
|
|
ScriptedCamera = CREATE_CAMERA(CAMTYPE_SCRIPTED, TRUE)
|
|
|
|
SET_CAM_PARAMS(ScriptedCamera, vSunSalutaionStartCamPosition, vSunSalutaionStartCamRotation, fSunSalutaionStartCamFOV)
|
|
SET_CAM_PARAMS(ScriptedCamera, vSunSalutaionEndCamPosition, vSunSalutaionEndCamRotation, fSunSalutaionEndCamFOV, 25000,
|
|
GRAPH_TYPE_SIN_ACCEL_DECEL, GRAPH_TYPE_SIN_ACCEL_DECEL)
|
|
|
|
SHAKE_CAM(ScriptedCamera, "HAND_SHAKE", 0.125)
|
|
|
|
SET_CAM_FAR_CLIP(ScriptedCamera, 500)
|
|
SET_CAM_FAR_CLIP(ScriptedCamera, 500)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created scripted camera during yoga sun salutation pose gameplay.")
|
|
#ENDIF
|
|
|
|
DISPLAY_RADAR(FALSE)
|
|
DISPLAY_HUD(FALSE)
|
|
|
|
RENDER_SCRIPT_CAMS(TRUE, FALSE)
|
|
|
|
ENDIF
|
|
|
|
IF DOES_CAM_EXIST(ScriptedCamera)
|
|
|
|
IF NOT IS_CAM_RENDERING(ScriptedCamera)
|
|
|
|
RENDER_SCRIPT_CAMS(TRUE, FALSE)
|
|
DISPLAY_RADAR(FALSE)
|
|
DISPLAY_HUD(FALSE)
|
|
|
|
ENDIF
|
|
|
|
//if camera is rendering already for example from previous stage when it started rendering at the end of the mocap,
|
|
//then just change camera params
|
|
IF IS_CAM_RENDERING(ScriptedCamera)
|
|
|
|
SET_CAM_PARAMS(ScriptedCamera, vSunSalutaionStartCamPosition, vSunSalutaionStartCamRotation, fSunSalutaionStartCamFOV)
|
|
SET_CAM_PARAMS(ScriptedCamera, vSunSalutaionEndCamPosition, vSunSalutaionEndCamRotation, fSunSalutaionEndCamFOV, 25000,
|
|
GRAPH_TYPE_SIN_ACCEL_DECEL, GRAPH_TYPE_SIN_ACCEL_DECEL)
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
RESET_YOGA_STRUCT(sYogaPlayer, FALSE, FALSE)
|
|
|
|
IF NOT IS_PED_INJURED(psAmanda.PedIndex)
|
|
IF NOT IS_ENTITY_PLAYING_ANIM(psAmanda.PedIndex, "missfam5_yoga", "f_yogapose_c")
|
|
IF HAS_ANIM_DICT_LOADED("missfam5_yoga")
|
|
TASK_PLAY_ANIM_ADVANCED(psAmanda.PedIndex, "missfam5_yoga", "f_yogapose_c",
|
|
vAmandaSunsalutationPosition, vAmandaSunsalutationRotation, INSTANT_BLEND_IN, NORMAL_BLEND_OUT, -1,
|
|
AF_LOOPING | AF_EXTRACT_INITIAL_OFFSET | AF_NOT_INTERRUPTABLE | AF_USE_KINEMATIC_PHYSICS | AF_OVERRIDE_PHYSICS,
|
|
0, EULER_YXZ, AIK_DISABLE_LEG_IK)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(psAmanda.PedIndex)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(psFabien.PedIndex)
|
|
IF NOT IS_ENTITY_PLAYING_ANIM(psFabien.PedIndex, "missfam5_yoga", "i_yogapose_c")
|
|
IF HAS_ANIM_DICT_LOADED("missfam5_yoga")
|
|
TASK_PLAY_ANIM_ADVANCED(psFabien.PedIndex, "missfam5_yoga", "i_yogapose_c",
|
|
vFabienSunsalutationPosition, vFabienSunsalutationRotation, INSTANT_BLEND_IN, NORMAL_BLEND_OUT, -1,
|
|
AF_LOOPING | AF_EXTRACT_INITIAL_OFFSET | AF_NOT_INTERRUPTABLE | AF_USE_KINEMATIC_PHYSICS | AF_OVERRIDE_PHYSICS,
|
|
0, EULER_YXZ, AIK_DISABLE_LEG_IK)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(psFabien.PedIndex)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//freeze yoga mats in case they get pushed around
|
|
FOR i = 0 TO (COUNT_OF(osYogaMats) - 1 )
|
|
IF DOES_ENTITY_EXIST(osYogaMats[i].ObjectIndex)
|
|
IF NOT IS_ENTITY_DEAD(osYogaMats[i].ObjectIndex)
|
|
FREEZE_ENTITY_POSITION(osYogaMats[i].ObjectIndex, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDFOR
|
|
|
|
IF IS_SCREEN_FADED_OUT()
|
|
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
|
|
ENDIF
|
|
|
|
IF PREPARE_MUSIC_EVENT("FAM5_YOGA_MOVE_START")
|
|
TRIGGER_MUSIC_EVENT("FAM5_YOGA_MOVE_START")
|
|
ENDIF
|
|
|
|
iStageProgress++
|
|
|
|
BREAK
|
|
|
|
CASE 1
|
|
|
|
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM5_SUNBF")
|
|
|
|
IF ( bStageReplayInProgress = FALSE )
|
|
|
|
IF PLAY_SINGLE_LINE_FROM_CONVERSATION(Family5Conversation, "FAM5AUD", "FAM5_SUNBF", "FAM5_SUNBF_4", CONV_PRIORITY_VERY_HIGH)
|
|
SET_LABEL_AS_TRIGGERED("FAM5_SUNBF", TRUE)
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
IF PLAY_SINGLE_LINE_FROM_CONVERSATION(Family5Conversation, "FAM5AUD", "FAM5_SUNBF", "FAM5_SUNBF_3", CONV_PRIORITY_VERY_HIGH)
|
|
SET_LABEL_AS_TRIGGERED("FAM5_SUNBF", TRUE)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ELSE
|
|
iStageProgress++
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 2
|
|
|
|
MAKE_PED_LOOK_AT_ENTITY_WITH_INTERVAL(psAmanda.PedIndex, PLAYER_PED_ID(), psAmanda.bLookingAtTarget, psAmanda.iLookAtTimer,
|
|
psAmanda.iTimer, psAmanda.iLookAtTime, psAmanda.iIntervalTime, 3000, 6000, 2000, 7500)
|
|
|
|
MAKE_PED_LOOK_AT_ENTITY_WITH_INTERVAL(psFabien.PedIndex, PLAYER_PED_ID(), psFabien.bLookingAtTarget, psFabien.iLookAtTimer,
|
|
psFabien.iTimer, psFabien.iLookAtTime, psFabien.iIntervalTime, 3750, 7500, 3000, 8000)
|
|
|
|
IF ( sYogaPlayer.eYogaMinigameStage = YOGAMINIGAMESTAGE_FAILRESET )
|
|
IF ( iFailConversationSpeaker = -1 )
|
|
iFailConversationSpeaker = GET_RANDOM_INT_IN_RANGE(0, 2)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": iFailConversationSpeaker is ", iFailConversationSpeaker, ".")
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
ELSE
|
|
iFailConversationSpeaker = -1
|
|
ENDIF
|
|
|
|
UPDATE_YOGA_TIMECYCLE_MODIFIER(sYogaPlayer, TRUE)
|
|
RUN_YOGA_FAIL_CAMERA(sYogaPlayer, iFailConversationSpeaker)
|
|
|
|
MANAGE_YOGA_CONVERSATIONS(sYogaPlayer, iYogaPosesCounter, iYogaBreathsCounter, iYogaIdleTimer, iYogaFailsCounter,
|
|
"FAM5_SUNIA", "FAM5_SUNIF", "FAM5_SUNPA", "FAM5_SUNPF", "FAM5_SUNE",
|
|
bBreatheConversationTriggered, "FAM5_SUNFB",
|
|
bBreatheCompletedConversationTriggered, "FAM5_SUNBC",
|
|
bBreatheFailedConversationTriggered, "FAM5_SUNBTF",
|
|
bInhaleConversationTriggered, "FAM5_WARIN",
|
|
bExhaleConversationTriggered, "FAM5_WAREX",
|
|
bFailConversationTriggered, "FAM5_SUNDA", "FAM5_SUNDF", "FAM5_SUNF", 5)
|
|
|
|
IF HAS_PLAYER_COMPLETED_YOGA_MOVE(sYogaPlayer, YOGAMOVE_SUNSALUTATION, FALSE, bStageReplayInProgress, FALSE)
|
|
|
|
//Play Michael's success conversation
|
|
//IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM5_SUNS")
|
|
|
|
//IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
// IF CREATE_CONVERSATION(Family5Conversation, "FAM5AUD", "FAM5_SUNS", CONV_PRIORITY_MEDIUM)
|
|
// SET_LABEL_AS_TRIGGERED("FAM5_SUNS", TRUE)
|
|
// ENDIF
|
|
//ENDIF
|
|
|
|
//ELSE
|
|
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
|
|
//if player didn't fail sun salutation even one time set the sun salutation stat to completed
|
|
IF ( sYogaPlayer.iFailCounter = 0 )
|
|
INFORM_STAT_SYSTEM_OF_BOOL_STAT_HAPPENED(FAM5_SUN_SALUTATION_POSE)
|
|
ENDIF
|
|
|
|
RESET_YOGA_STRUCT(sYogaPlayer, FALSE, FALSE)
|
|
|
|
RESET_ALL_SFX_FLAGS(ssSounds)
|
|
|
|
IF NOT IS_PED_INJURED(psAmanda.PedIndex)
|
|
TASK_CLEAR_LOOK_AT(psAmanda.PedIndex)
|
|
psAmanda.bLookingAtTarget = FALSE
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(psFabien.PedIndex)
|
|
TASK_CLEAR_LOOK_AT(psFabien.PedIndex)
|
|
psFabien.bLookingAtTarget = FALSE
|
|
ENDIF
|
|
|
|
//freeze yoga mats in case they get pushed around
|
|
FOR i = 0 TO (COUNT_OF(osYogaMats) - 1 )
|
|
IF DOES_ENTITY_EXIST(osYogaMats[i].ObjectIndex)
|
|
IF NOT IS_ENTITY_DEAD(osYogaMats[i].ObjectIndex)
|
|
FREEZE_ENTITY_POSITION(osYogaMats[i].ObjectIndex, FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDFOR
|
|
|
|
REPLAY_RECORD_BACK_FOR_TIME(5, 4, REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
RETURN TRUE
|
|
|
|
ENDIF
|
|
|
|
//ENDIF
|
|
|
|
ENDIF
|
|
|
|
//request mocap cutscene
|
|
REQUEST_CUTSCENE("family_5_mcs_3")
|
|
|
|
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", PLAYER_PED_ID())
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Amanda", psAmanda.PedIndex)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Fabien", psFabien.PedIndex)
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
RETURN FALSE
|
|
|
|
ENDFUNC
|
|
|
|
FUNC BOOL IS_MISSION_STAGE_CUTSCENE_POOL_COMPLETED(INT &iStageProgress)
|
|
|
|
SWITCH iStageProgress
|
|
|
|
CASE 0
|
|
|
|
IF HAS_REQUESTED_CUTSCENE_LOADED("family_5_mcs_3")
|
|
|
|
IF NOT IS_PED_INJURED(psAmanda.PedIndex)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(psAmanda.PedIndex, "Amanda", CU_ANIMATE_AND_DELETE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(psFabien.PedIndex)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(psFabien.PedIndex, "Fabien", CU_ANIMATE_AND_DELETE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
|
|
//Michael's yoga mat
|
|
IF DOES_ENTITY_EXIST(osYogaMats[0].ObjectIndex)
|
|
IF NOT IS_ENTITY_DEAD(osYogaMats[0].ObjectIndex)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(osYogaMats[0].ObjectIndex, "Michaels_YogaMat", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, osYogaMats[0].ModelName)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Fabien's yoga mat
|
|
IF DOES_ENTITY_EXIST(osYogaMats[1].ObjectIndex)
|
|
IF NOT IS_ENTITY_DEAD(osYogaMats[1].ObjectIndex)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(osYogaMats[1].ObjectIndex, "Fabiens_YogaMat", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, osYogaMats[1].ModelName)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Amanda's yoga mat
|
|
IF DOES_ENTITY_EXIST(osYogaMats[2].ObjectIndex)
|
|
IF NOT IS_ENTITY_DEAD(osYogaMats[2].ObjectIndex)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(osYogaMats[2].ObjectIndex, "Amandas_yogamat", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, osYogaMats[2].ModelName)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
|
|
|
|
CLEAR_PRINTS()
|
|
|
|
CLEAR_HELP()
|
|
|
|
TRIGGER_MUSIC_EVENT("FAM5_YOGA_MUSIC_CHANGE_DOWN")
|
|
|
|
STOP_AUDIO_SCENE("FAMILY_5_YOGA_MG")
|
|
|
|
START_CUTSCENE()
|
|
|
|
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
iStageProgress++
|
|
|
|
ELSE
|
|
|
|
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
|
|
//Michael's variations
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", PLAYER_PED_ID(), PLAYER_ZERO)
|
|
//Amanda's variations
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Amanda", PED_COMP_HAIR, 4, 0)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Amanda", PED_COMP_TORSO, 1, 0)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Amanda", PED_COMP_LEG, 1, 0)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Amanda", PED_COMP_DECL, 1, 0)
|
|
//Fabien's variations
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Fabien", PED_COMP_HEAD, 0, 0)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Fabien", PED_COMP_TORSO, 0, 0)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Fabien", PED_COMP_LEG, 0, 0)
|
|
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("missfam5_yoga")
|
|
|
|
IF IS_SCREEN_FADED_OUT()
|
|
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
|
|
ENDIF
|
|
|
|
iStageProgress++
|
|
|
|
//destroy scripted camera after yoga section
|
|
IF DOES_CAM_EXIST(ScriptedCamera)
|
|
SET_CAM_ACTIVE(ScriptedCamera, FALSE)
|
|
DESTROY_CAM(ScriptedCamera)
|
|
RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Destroying scripted camera.")
|
|
#ENDIF
|
|
ENDIF
|
|
|
|
DESTROY_ALL_CAMS(TRUE)
|
|
RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
|
|
DISPLAY_RADAR(TRUE)
|
|
DISPLAY_HUD(TRUE)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Destroying all scripted cameras.")
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 2
|
|
|
|
IF IS_CUTSCENE_PLAYING()
|
|
IF ( GET_CUTSCENE_TIME() > 33000 ) //when player ped hits the water in the cutscene
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
SET_PED_WETNESS_HEIGHT(PLAYER_PED_ID(), 2.0) //keep setting the wetness every frame until cutscene is finished
|
|
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())
|
|
//play animation after exiting the mocap cutscene
|
|
IF HAS_ANIM_DICT_LOADED("missfam5_wet_walk")
|
|
TASK_PLAY_ANIM(PLAYER_PED_ID(), "missfam5_wet_walk", "wet_idle", WALK_BLEND_IN, WALK_BLEND_OUT, -1, AF_DEFAULT)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID())
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Giving player ped task to play animation 'wet_idle' when CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY() returned true for Michael.")
|
|
#ENDIF
|
|
ELSE
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Animation dictionary 'missfam5_wet_walk' is not loaded.")
|
|
#ENDIF
|
|
ENDIF
|
|
SET_FORCE_FOOTSTEP_UPDATE(PLAYER_PED_ID(), FALSE)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_CAMERA()
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0)
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_SET_EXIT_STATE_FOR_CAMERA() returned true.")
|
|
#ENDIF
|
|
ENDIF
|
|
|
|
IF ( bYogaMusicPlaying = TRUE )
|
|
IF ( GET_CUTSCENE_TIME() > 33000 )
|
|
IF TRIGGER_MUSIC_EVENT("FAM5_YOGA_MUSIC_ENDS")
|
|
bYogaMusicPlaying = FALSE
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Triggering music event FAM5_YOGA_MUSIC_ENDS.")
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Stopping yoga music.")
|
|
#ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_CUTSCENE_PLAYING()
|
|
IF ( GET_CUTSCENE_TIME() > 33000 )
|
|
|
|
UPDATE_YOGA_TIMECYCLE_MODIFIER(sYogaPlayer, FALSE)
|
|
|
|
IF ( sYogaPlayer.fBlushDecalAlpha != 0.0 )
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
CLEAR_PED_DAMAGE_DECAL_BY_ZONE(PLAYER_PED_ID(), PDZ_HEAD, "blushing") //clear blushing decal
|
|
sYogaPlayer.fBlushDecalAlpha = 0.0
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF HAS_CUTSCENE_FINISHED()
|
|
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
|
|
STOP_AUDIO_SCENE("FAMILY_5_YOGA_TRANQUIL")
|
|
|
|
START_AUDIO_SCENE("FAMILY_5_GO_TO_JIMMY")
|
|
|
|
CLEAR_TIMECYCLE_MODIFIER()
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
CLEAR_PED_DAMAGE_DECAL_BY_ZONE(PLAYER_PED_ID(), PDZ_HEAD, "blushing") //clear blushing decal
|
|
ENDIF
|
|
|
|
REPLAY_STOP_EVENT()
|
|
|
|
RETURN TRUE
|
|
|
|
ELSE
|
|
|
|
//keep requesting animation dictionary
|
|
REQUEST_ANIM_DICT("missfam5_wet_walk")
|
|
|
|
//keep requesting assisted movement routes needed after the cutscene
|
|
ASSISTED_MOVEMENT_REQUEST_ROUTE("family5b")
|
|
ASSISTED_MOVEMENT_REQUEST_ROUTE("mansion_1")
|
|
ASSISTED_MOVEMENT_REQUEST_ROUTE("family5c")
|
|
ASSISTED_MOVEMENT_REQUEST_ROUTE("f5_jimmy1")
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
RETURN FALSE
|
|
|
|
ENDFUNC
|
|
|
|
PROC MANAGE_CONVERSATIONS_DURING_GOTO_JIMMYS_ROOM()
|
|
|
|
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM5_SON1A")
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-799.520630,187.521057,71.105469>>, <<-795.681763,177.692230,74.834709>>, 6.0)
|
|
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-803.700134,185.895218,71.105469>>, <<-800.207031,176.436371,74.834709>>, 4.0)
|
|
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-801.559814,168.317978,71.334709>>, <<-805.525635,178.113297,74.834709>>, 8.0)
|
|
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-804.679260,183.043533,70.847778>>, <<-816.280396,178.596970,75.153091>>, 6.0)
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(Family5Conversation, "FAM5AUD", "FAM5_SON1A", CONV_PRIORITY_MEDIUM)
|
|
SET_LABEL_AS_TRIGGERED("FAM5_SON1A", TRUE)
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_AMBIENT_SPEECH_PLAYING(PLAYER_PED_ID())
|
|
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(PLAYER_PED_ID(), "FAM5_ATAA", "MICHAEL", SPEECH_PARAMS_FORCE)
|
|
SET_LABEL_AS_TRIGGERED("FAM5_SON1A", TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM5_SON1B")
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-804.679260,183.043533,70.847778>>, <<-816.280396,178.596970,75.153091>>, 6.0)
|
|
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-806.901978,185.396698,73.504105>>, <<-804.658386,179.531998,78.740730>>, 2.5)
|
|
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-811.660278,182.266098,70.653091>>, <<-805.412842,184.612473,76.002815>>, 2.5)
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(Family5Conversation, "FAM5AUD", "FAM5_SON1B", CONV_PRIORITY_MEDIUM)
|
|
SET_LABEL_AS_TRIGGERED("FAM5_SON1B", TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM5_SON1C")
|
|
// IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-806.901978,185.396698,73.504105>>, <<-804.658386,179.531998,78.740730>>, 2.5)
|
|
// OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-811.660278,182.266098,70.653091>>, <<-805.412842,184.612473,76.002815>>, 2.5)
|
|
// OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-813.023193,181.754562,70.653091>>, <<-810.363708,182.782074,74.807320>>, 2.5)
|
|
// IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
// IF CREATE_CONVERSATION(Family5Conversation, "FAM5AUD", "FAM5_SON1C", CONV_PRIORITY_MEDIUM)
|
|
// SET_LABEL_AS_TRIGGERED("FAM5_SON1C", TRUE)
|
|
// ENDIF
|
|
// ENDIF
|
|
// ENDIF
|
|
// ENDIF
|
|
|
|
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM5_SON1D")
|
|
IF HAS_LABEL_BEEN_TRIGGERED("FAM5_SON1B")
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(Family5Conversation, "FAM5AUD", "FAM5_SON1D", CONV_PRIORITY_MEDIUM)
|
|
SET_LABEL_AS_TRIGGERED("FAM5_SON1D", TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM5_JROOM1")
|
|
IF HAS_LABEL_BEEN_TRIGGERED("FAM5_SON1D")
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-806.901978,185.396698,73.504105>>, <<-804.658386,179.531998,78.740730>>, 2.5)
|
|
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-800.397156,179.202255,75.240730>>, <<-809.928223,175.562454,78.740730>>, 4.0)
|
|
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-806.150208,172.722031,75.740730>>, <<-806.707092,174.138565,78.740730>>, 2.0)
|
|
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-809.125183,173.548157,75.740074>>, <<-806.509033,166.364822,78.740730>>, 4.5)
|
|
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-811.660278,182.266098,70.653091>>, <<-805.412842,184.612473,76.002815>>, 2.5)
|
|
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-804.679260,183.043533,70.847778>>, <<-816.280396,178.596970,75.153091>>, 6.0)
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(Family5Conversation, "FAM5AUD", "FAM5_JROOM1", CONV_PRIORITY_MEDIUM)
|
|
SET_LABEL_AS_TRIGGERED("FAM5_JROOM1", TRUE)
|
|
SET_LABEL_AS_TRIGGERED("FAM5_SON1A", TRUE)
|
|
SET_LABEL_AS_TRIGGERED("FAM5_SON1B", TRUE)
|
|
SET_LABEL_AS_TRIGGERED("FAM5_SON1C", TRUE)
|
|
SET_LABEL_AS_TRIGGERED("FAM5_SON1D", TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF IS_THIS_CONVERSATION_PLAYING("FAM5_JROOM1")
|
|
IF NOT IS_FACE_TO_FACE_CONVERSATION_PAUSED()
|
|
|
|
IF NOT IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-806.901978,185.396698,73.504105>>, <<-804.658386,179.531998,78.740730>>, 2.5)
|
|
AND NOT IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-800.397156,179.202255,75.240730>>, <<-809.928223,175.562454,78.740730>>, 4.0)
|
|
AND NOT IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-806.150208,172.722031,75.740730>>, <<-806.707092,174.138565,78.740730>>, 2.0)
|
|
AND NOT IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-809.125183,173.548157,75.740074>>, <<-806.509033,166.364822,78.740730>>, 4.5)
|
|
AND NOT IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-811.660278,182.266098,70.653091>>, <<-805.412842,184.612473,76.002815>>, 2.5)
|
|
AND NOT IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-804.679260,183.043533,70.847778>>, <<-816.280396,178.596970,75.153091>>, 6.0)
|
|
AND NOT IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-799.520630,187.521057,71.105469>>, <<-795.681763,177.692230,74.834709>>, 6.0)
|
|
AND NOT IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-803.700134,185.895218,71.105469>>, <<-800.207031,176.436371,74.834709>>, 4.0)
|
|
AND NOT IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-801.559814,168.317978,71.334709>>, <<-805.525635,178.113297,74.834709>>, 8.0)
|
|
AND NOT IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-807.917725,176.369095,70.834709>>, <<-808.785706,178.632828,74.653091>>, 2.0)
|
|
AND NOT IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-802.726013,176.068436,75.240730>>, <<-799.839966,168.956497,78.740730>>, 3.5)
|
|
AND NOT IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-809.094360,180.614655,75.240730>>, <<-816.723267,177.806808,78.862457>>, 8.0)
|
|
AND NOT IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-810.866333,175.499969,75.240730>>, <<-814.803284,173.922989,78.740730>>, 3.6)
|
|
AND NOT IS_ENTITY_IN_ANGLED_AREA( PLAYER_PED_ID(), <<-802.712769,167.797989,75.240730>>, <<-805.571716,175.191330,78.740730>>, 3.0)
|
|
PAUSE_FACE_TO_FACE_CONVERSATION(TRUE)
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-806.901978,185.396698,73.504105>>, <<-804.658386,179.531998,78.740730>>, 2.5)
|
|
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-800.397156,179.202255,75.240730>>, <<-809.928223,175.562454,78.740730>>, 4.0)
|
|
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-806.150208,172.722031,75.740730>>, <<-806.707092,174.138565,78.740730>>, 2.0)
|
|
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-809.125183,173.548157,75.740074>>, <<-806.509033,166.364822,78.740730>>, 4.5)
|
|
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-811.660278,182.266098,70.653091>>, <<-805.412842,184.612473,76.002815>>, 2.5)
|
|
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-804.679260,183.043533,70.847778>>, <<-816.280396,178.596970,75.153091>>, 6.0)
|
|
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-799.520630,187.521057,71.105469>>, <<-795.681763,177.692230,74.834709>>, 6.0)
|
|
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-803.700134,185.895218,71.105469>>, <<-800.207031,176.436371,74.834709>>, 4.0)
|
|
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-801.559814,168.317978,71.334709>>, <<-805.525635,178.113297,74.834709>>, 8.0)
|
|
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-807.917725,176.369095,70.834709>>, <<-808.785706,178.632828,74.653091>>, 2.0)
|
|
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-802.726013,176.068436,75.240730>>, <<-799.839966,168.956497,78.740730>>, 3.5)
|
|
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-809.094360,180.614655,75.240730>>, <<-816.723267,177.806808,78.862457>>, 8.0)
|
|
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-810.866333,175.499969,75.240730>>, <<-814.803284,173.922989,78.740730>>, 3.6)
|
|
OR IS_ENTITY_IN_ANGLED_AREA( PLAYER_PED_ID(), <<-802.712769,167.797989,75.240730>>, <<-805.571716,175.191330,78.740730>>, 3.0)
|
|
PAUSE_FACE_TO_FACE_CONVERSATION(FALSE)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM5_JROOM2")
|
|
IF HAS_LABEL_BEEN_TRIGGERED("FAM5_JROOM1")
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-806.150208,172.722031,75.740730>>, <<-806.707092,174.138565,78.740730>>, 2.0)
|
|
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-809.125183,173.548157,75.740074>>, <<-806.509033,166.364822,78.740730>>, 4.5)
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(Family5Conversation, "FAM5AUD", "FAM5_JROOM2", CONV_PRIORITY_MEDIUM)
|
|
SET_LABEL_AS_TRIGGERED("FAM5_JROOM2", TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_THIS_CONVERSATION_PLAYING("FAM5_JROOM2")
|
|
bConversationsFinished = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC MANAGE_ANIMATIONS_DURING_GOTO_JIMMYS_ROOM(INT &iProgress)
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
|
|
IF ( bLookAtActive = FALSE )
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-809.125183,173.548157,75.740074>>, <<-806.509033,166.364822,78.740730>>, 4.5)
|
|
IF NOT IS_PED_INJURED(psJimmy.PedIndex)
|
|
TASK_LOOK_AT_ENTITY(PLAYER_PED_ID(), psJimmy.PedIndex, -1, SLF_DEFAULT)
|
|
bLookAtActive = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-809.125183,173.548157,75.740074>>, <<-806.509033,166.364822,78.740730>>, 4.5)
|
|
TASK_CLEAR_LOOK_AT(PLAYER_PED_ID())
|
|
bLookAtActive = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SWITCH iProgress
|
|
|
|
CASE 0
|
|
|
|
IF NOT IS_ENTITY_PLAYING_ANIM(PLAYER_PED_ID(), "missfam5_wet_walk", "wet_idle")
|
|
|
|
IF HAS_ANIM_DICT_LOADED("missfam5_wet_walk")
|
|
TASK_PLAY_ANIM(PLAYER_PED_ID(), "missfam5_wet_walk", "wet_idle", INSTANT_BLEND_IN, WALK_BLEND_OUT, -1, AF_DEFAULT)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID(), TRUE)
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Giving player ped task to play animation 'wet_idle'.")
|
|
#ENDIF
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
iProgress++
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 1
|
|
|
|
IF IS_ENTITY_PLAYING_ANIM(PLAYER_PED_ID(), "missfam5_wet_walk", "wet_idle")
|
|
|
|
IF ( bPlayerPedScriptTaskInterrupted = FALSE )
|
|
|
|
INT iXValue
|
|
INT iYValue
|
|
|
|
iXValue = ROUND(GET_CONTROL_NORMAL(PLAYER_CONTROL, INPUT_MOVE_LR) * 255.0)
|
|
iYValue = ROUND(GET_CONTROL_NORMAL(PLAYER_CONTROL, INPUT_MOVE_UD) * 255.0)
|
|
|
|
IF (iXValue < -50 OR iXValue > 50)
|
|
OR (iYValue < -50 OR iYValue > 50)
|
|
|
|
CLEAR_PED_TASKS(PLAYER_PED_ID())
|
|
|
|
bPlayerPedScriptTaskInterrupted = TRUE
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC MANAGE_JIMMY(PED_INDEX PedIndex, INT &iProgress)
|
|
|
|
IF DOES_ENTITY_EXIST(PedIndex)
|
|
IF NOT IS_ENTITY_DEAD(PedIndex)
|
|
|
|
SWITCH iProgress
|
|
|
|
CASE 0
|
|
|
|
iProgress++
|
|
|
|
BREAK
|
|
|
|
CASE 1 //create props for Jimmy and start playing animation
|
|
|
|
REQUEST_ANIM_DICT("missfam5mcs_4leadin")
|
|
|
|
IF HAS_ANIM_DICT_LOADED("missfam5mcs_4leadin")
|
|
AND HAS_MISSION_OBJECT_BEEN_CREATED(osGamepad, FALSE)
|
|
AND HAS_MISSION_OBJECT_BEEN_CREATED(osHeadset, FALSE)
|
|
|
|
CLEAR_PED_TASKS(PedIndex)
|
|
|
|
SET_RAGDOLL_BLOCKING_FLAGS(PedIndex, RBF_PLAYER_IMPACT)
|
|
|
|
TASK_PLAY_ANIM_ADVANCED(PedIndex, "missfam5mcs_4leadin", "family_5_mcs_4_loop_jimmy", << -806.260, 170.664, 77.520 >>,
|
|
<< 0.000, 0.000, 98.280 >>, INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1,
|
|
AF_LOOPING | AF_NOT_INTERRUPTABLE | AF_EXTRACT_INITIAL_OFFSET |
|
|
AF_USE_KINEMATIC_PHYSICS | AF_USE_MOVER_EXTRACTION | AF_ABORT_ON_WEAPON_DAMAGE,
|
|
0, EULER_YXZ, AIK_DISABLE_LEG_IK)
|
|
|
|
IF DOES_ENTITY_EXIST(osGamepad.ObjectIndex)
|
|
IF NOT IS_ENTITY_DEAD(osGamepad.ObjectIndex)
|
|
SET_ENTITY_COLLISION(osGamepad.ObjectIndex, FALSE)
|
|
ATTACH_ENTITY_TO_ENTITY(osGamepad.ObjectIndex, PedIndex, GET_PED_BONE_INDEX(PedIndex, BONETAG_PH_L_HAND),
|
|
<< 0.0, 0.0, 0.0 >>, << 0.0, 0.0, 0.0 >>)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(osHeadset.ObjectIndex)
|
|
IF NOT IS_ENTITY_DEAD(osHeadset.ObjectIndex)
|
|
SET_ENTITY_COLLISION(osHeadset.ObjectIndex, FALSE)
|
|
ATTACH_ENTITY_TO_ENTITY(osHeadset.ObjectIndex, PedIndex, GET_PED_BONE_INDEX(PedIndex, BONETAG_HEAD),
|
|
<< 0.02, 0.00, 0.00 >>, << -180.0, 90.0, 0.0 >>)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
REMOVE_ANIM_DICT("missfam5mcs_4leadin")
|
|
|
|
iProgress++
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 2
|
|
|
|
SET_PED_RESET_FLAG(PedIndex, PRF_SkipExplosionOcclusion, TRUE)
|
|
SET_PED_RESET_FLAG(PedIndex, PRF_ExpandPedCapsuleFromSkeleton, TRUE)
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
FUNC BOOL IS_MISSION_STAGE_GOTO_JIMMYS_ROOM_COMPLETED(INT &iStageProgress)
|
|
|
|
MANAGE_CONVERSATIONS_DURING_GOTO_JIMMYS_ROOM()
|
|
MANAGE_JIMMY(psJimmy.PedIndex, psJimmy.iProgress)
|
|
MANAGE_ANIMATIONS_DURING_GOTO_JIMMYS_ROOM(iAnimationProgress)
|
|
|
|
IF NOT ASSISTED_MOVEMENT_IS_ROUTE_LOADED("family5b")
|
|
AND NOT ASSISTED_MOVEMENT_IS_ROUTE_LOADED("mansion_1")
|
|
AND NOT ASSISTED_MOVEMENT_IS_ROUTE_LOADED("family5c")
|
|
AND NOT ASSISTED_MOVEMENT_IS_ROUTE_LOADED("f5_jimmy1")
|
|
|
|
ASSISTED_MOVEMENT_REQUEST_ROUTE("family5b")
|
|
ASSISTED_MOVEMENT_REQUEST_ROUTE("mansion_1")
|
|
ASSISTED_MOVEMENT_REQUEST_ROUTE("family5c")
|
|
ASSISTED_MOVEMENT_REQUEST_ROUTE("f5_jimmy1")
|
|
|
|
ENDIF
|
|
|
|
SWITCH iStageProgress
|
|
|
|
CASE 0
|
|
|
|
IF IS_DOOR_REGISTERED_WITH_SYSTEM(ENUM_TO_INT(DOORHASH_M_MANSION_R_L2))
|
|
DOOR_SYSTEM_SET_OPEN_RATIO(ENUM_TO_INT(DOORHASH_M_MANSION_R_L2), -1.0/*-1.2*/, FALSE, FALSE)
|
|
DOOR_SYSTEM_SET_DOOR_STATE(ENUM_TO_INT(DOORHASH_M_MANSION_R_L2), DOORSTATE_FORCE_UNLOCKED_THIS_FRAME, FALSE, TRUE)
|
|
ENDIF
|
|
|
|
IF IS_DOOR_REGISTERED_WITH_SYSTEM(ENUM_TO_INT(DOORHASH_M_MANSION_R_R2))
|
|
DOOR_SYSTEM_SET_OPEN_RATIO(ENUM_TO_INT(DOORHASH_M_MANSION_R_R2), 1.0/*1.2*/, FALSE, FALSE)
|
|
DOOR_SYSTEM_SET_DOOR_STATE(ENUM_TO_INT(DOORHASH_M_MANSION_R_R2), DOORSTATE_FORCE_UNLOCKED_THIS_FRAME, FALSE, TRUE)
|
|
ENDIF
|
|
|
|
IF IS_SCREEN_FADED_OUT()
|
|
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
|
|
ENDIF
|
|
|
|
iStageProgress++
|
|
|
|
BREAK
|
|
|
|
CASE 1
|
|
|
|
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM5_GT2")
|
|
IF NOT DOES_BLIP_EXIST(psJimmy.BlipIndex)
|
|
IF IS_SCREEN_FADED_IN() AND NOT IS_SCREEN_FADING_IN()
|
|
|
|
REPLAY_RECORD_BACK_FOR_TIME(0.0, 7.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
psJimmy.BlipIndex = CREATE_BLIP_FOR_COORD(vJimmysRoomsCoords)
|
|
PRINT_GOD_TEXT_ADVANCED("FAM5_GT2", DEFAULT_GOD_TEXT_TIME, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_BLIP_EXIST(psJimmy.BlipIndex)
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-809.125183,173.548157,75.740074>>, <<-806.509033,166.364822,78.740730>>, 4.5)
|
|
REMOVE_BLIP(psJimmy.BlipIndex)
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-806.150208,172.722031,75.740730>>, <<-806.707092,174.138565,78.740730>>, 2.0)
|
|
AND NOT IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-809.125183,173.548157,75.740074>>, <<-806.509033,166.364822,78.740730>>, 4.5)
|
|
IF HAS_LABEL_BEEN_TRIGGERED("FAM5_GT2")
|
|
psJimmy.BlipIndex = CREATE_BLIP_FOR_COORD(vJimmysRoomsCoords)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
|
|
IF ( bStreamTriggered = FALSE )
|
|
|
|
IF IS_TV_SCRIPT_AVAILABLE_FOR_USE(TV_LOC_JIMMY_BEDROOM)
|
|
DISABLE_TV_CONTROLS(TV_LOC_JIMMY_BEDROOM, TRUE)
|
|
START_AMBIENT_TV_PLAYBACK(TV_LOC_JIMMY_BEDROOM, TVCHANNELTYPE_CHANNEL_SPECIAL, TV_PLAYLIST_LO_RIGHTEOUS_SLAUGHTER_CUTSCENE, FALSE, TRUE)
|
|
SET_TV_VOLUME(-9)
|
|
|
|
bStreamTriggered = TRUE
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": TV script for TV_LOC_JIMMY_BEDROOM is available for use, starting TV playback.")
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
IF NOT IS_TV_SCRIPT_AVAILABLE_FOR_USE(TV_LOC_JIMMY_BEDROOM)
|
|
STOP_AMBIENT_TV_PLAYBACK(TV_LOC_JIMMY_BEDROOM)
|
|
|
|
bStreamTriggered = FALSE
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": TV script for TV_LOC_JIMMY_BEDROOM is not available for use, stopping TV playback.")
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
|
|
IF IS_PLAYER_BROWSING_ITEMS_IN_ANY_SHOP()
|
|
OR IS_PLAYER_CHANGING_CLOTHES()
|
|
|
|
IF HAS_THIS_CUTSCENE_LOADED("family_5_mcs_4")
|
|
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
|
|
|
|
REQUEST_CUTSCENE("family_5_mcs_4")
|
|
|
|
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", PLAYER_PED_ID()) //Michael's variations
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting cutscene ped components for cutscene ped Michael from player ped.")
|
|
#ENDIF
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Jimmy", psJimmy.PedIndex) //Jimmy's variations
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Jimmy", PED_COMP_BERD, 1, 0)
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting cutscene ped components for cutscene ped Jimmy from ped.")
|
|
#ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM5_GT4")
|
|
IF GET_DISTANCE_BETWEEN_PEDS(PLAYER_PED_ID(), psJimmy.PedIndex) > BUDDY_SEPARATION_DIST
|
|
PRINT_GOD_TEXT_ADVANCED("FAM5_GT4", DEFAULT_GOD_TEXT_TIME, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//once the player reaches upper hall, block certain actions for lead in to cutscene
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-806.150208,172.722031,75.740730>>, <<-806.707092,174.138565,78.740730>>, 2.0) //
|
|
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-809.125183,173.548157,75.740074>>, <<-806.509033,166.364822,78.740730>>, 4.5) //Jimmy's room
|
|
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-809.965271,175.489349,75.640732>>, <<-800.594666,179.089935,79.240730>>, 4.0) //upper hall
|
|
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-804.698608,172.015182,75.640366>>, <<-806.011292,175.406418,79.240730>>, 3.0) //upper hall small
|
|
|
|
SUPPRESS_CONTEXT_BUTTON_ACTIONS_THIS_FRAME()
|
|
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SPRINT)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_AIM)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ATTACK)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ATTACK2)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_HEAVY)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_LIGHT)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_JUMP)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_COVER)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ENTER)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_DETONATE)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_DUCK)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SELECT_WEAPON)
|
|
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_JUMP)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_BRAKE)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ACCELERATE)
|
|
|
|
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 ( bConversationsFinished = TRUE ) //if all leadin conversations have played, trigger the cutscene
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
CLEAR_PED_TASKS(PLAYER_PED_ID())
|
|
ENDIF
|
|
CLEAR_PED_ALTERNATE_WALK_ANIM(PLAYER_PED_ID())
|
|
ENDIF
|
|
|
|
REMOVE_BLIP(psJimmy.BlipIndex)
|
|
|
|
REMOVE_ANIM_DICT("missfam5_wet_walk")
|
|
REMOVE_ANIM_DICT("missfam5mcs_4leadin")
|
|
|
|
REPLAY_RECORD_BACK_FOR_TIME(5.0, 1.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
RETURN TRUE
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
RETURN FALSE
|
|
|
|
ENDFUNC
|
|
|
|
FUNC BOOL IS_MISSION_STAGE_CUTSCENE_JIMMYS_ROOM_COMPLETED(INT &iStageProgress)
|
|
|
|
SWITCH iStageProgress
|
|
|
|
CASE 0
|
|
|
|
IF ( bStreamTriggered = FALSE )
|
|
|
|
START_AMBIENT_TV_PLAYBACK(TV_LOC_JIMMY_BEDROOM, TVCHANNELTYPE_CHANNEL_SPECIAL, TV_PLAYLIST_LO_RIGHTEOUS_SLAUGHTER_CUTSCENE)
|
|
SET_TV_VOLUME(-9)
|
|
bStreamTriggered = TRUE
|
|
|
|
ENDIF
|
|
|
|
IF HAS_REQUESTED_CUTSCENE_LOADED("family_5_mcs_4")
|
|
|
|
IF ( bStreamTriggered = TRUE)
|
|
|
|
KILL_ANY_CONVERSATION()
|
|
|
|
CLEAR_PRINTS()
|
|
|
|
CLEAR_HELP()
|
|
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
TASK_CLEAR_LOOK_AT(PLAYER_PED_ID())
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(psJimmy.PedIndex)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(psJimmy.PedIndex, "Jimmy", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, psJimmy.ModelName)
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(osHeadset.ObjectIndex)
|
|
IF NOT IS_ENTITY_DEAD(osHeadset.ObjectIndex)
|
|
IF IS_ENTITY_ATTACHED(osHeadset.ObjectIndex)
|
|
DETACH_ENTITY(osHeadset.ObjectIndex, FALSE, TRUE)
|
|
ENDIF
|
|
REGISTER_ENTITY_FOR_CUTSCENE(osHeadset.ObjectIndex, "Headset_Jimmy", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, osHeadset.ModelName)
|
|
ENDIF
|
|
ELSE
|
|
REGISTER_ENTITY_FOR_CUTSCENE(osHeadset.ObjectIndex, "Headset_Jimmy", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, osHeadset.ModelName)
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(osGamepad.ObjectIndex)
|
|
IF NOT IS_ENTITY_DEAD(osGamepad.ObjectIndex)
|
|
IF IS_ENTITY_ATTACHED(osGamepad.ObjectIndex)
|
|
DETACH_ENTITY(osGamepad.ObjectIndex, FALSE, TRUE)
|
|
ENDIF
|
|
REGISTER_ENTITY_FOR_CUTSCENE(osGamepad.ObjectIndex, "Jimmy_Controller", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, osGamepad.ModelName)
|
|
ENDIF
|
|
ELSE
|
|
REGISTER_ENTITY_FOR_CUTSCENE(osGamepad.ObjectIndex, "Jimmy_Controller", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, osGamepad.ModelName)
|
|
ENDIF
|
|
|
|
START_CUTSCENE(CUTSCENE_DELAY_ENABLING_PLAYER_CONTROL_FOR_UP_TO_DATE_GAMEPLAY_CAMERA)
|
|
|
|
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
iStageProgress++
|
|
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", PLAYER_PED_ID())
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Jimmy", psJimmy.PedIndex)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Jimmy", PED_COMP_BERD, 1, 0)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 1 //fade screen in if screen was faded out due to shit skip or debug skip
|
|
|
|
IF IS_CUTSCENE_PLAYING()
|
|
|
|
//clear the area
|
|
CLEAR_AREA(MissionPosition.vStageStart, 50.0, TRUE)
|
|
CLEAR_AREA_OF_OBJECTS(MissionPosition.vStageStart, 50.0)
|
|
CLEAR_AREA_OF_VEHICLES(MissionPosition.vStageStart, 50.0)
|
|
CLEAR_AREA_OF_PROJECTILES(MissionPosition.vStageStart, 50.0)
|
|
REMOVE_PARTICLE_FX_IN_RANGE(MissionPosition.vStageStart, 50.0)
|
|
|
|
//reposition michael's car during cutscene, it might have been moved by the player before cutscene
|
|
IF IS_VEHICLE_DRIVEABLE(vsMichaelsCar.VehicleIndex)
|
|
SET_ENTITY_COORDS(vsMichaelsCar.VehicleIndex, vsMichaelsCar.vPosition)
|
|
SET_ENTITY_HEADING(vsMichaelsCar.VehicleIndex, vsMichaelsCar.fHeading)
|
|
SET_VEHICLE_ON_GROUND_PROPERLY(vsMichaelsCar.VehicleIndex)
|
|
ENDIF
|
|
|
|
IF IS_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P0_YOGA)
|
|
SET_PLAYER_PED_OUTFIT(MO_YOGA_FLIP_FLOPS)
|
|
ENDIF
|
|
|
|
IF IS_SCREEN_FADED_OUT()
|
|
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
|
|
ENDIF
|
|
|
|
iStageProgress++
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 2
|
|
|
|
IF NOT DOES_ENTITY_EXIST(osGamepad.ObjectIndex)
|
|
IF DOES_CUTSCENE_ENTITY_EXIST("Jimmy_Controller")
|
|
IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Jimmy_Controller"))
|
|
osGamepad.ObjectIndex = GET_OBJECT_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Jimmy_Controller"))
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created object Jimmy_Controller in the cutscene.")
|
|
#ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT DOES_ENTITY_EXIST(osHeadset.ObjectIndex)
|
|
IF DOES_CUTSCENE_ENTITY_EXIST("Headset_Jimmy")
|
|
IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Headset_Jimmy"))
|
|
osHeadset.ObjectIndex = GET_OBJECT_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Headset_Jimmy"))
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created object Headset_Jimmy in the cutscene.")
|
|
#ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Jimmy", psJimmy.ModelName)
|
|
#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)
|
|
CLEAR_PED_TASKS(psJimmy.PedIndex)
|
|
IF IS_VEHICLE_DRIVEABLE(vsMichaelsCar.VehicleIndex)
|
|
IF ( bCutsceneSkipped = TRUE )
|
|
WARP_PED(psJimmy.PedIndex, << -805.53, 175.98, 75.7407 >>, 350.0319, FALSE, FALSE, FALSE)
|
|
ENDIF
|
|
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 * 3, VS_FRONT_RIGHT, PEDMOVEBLENDRATIO_WALK)
|
|
ENDIF
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Ped Jimmy received task sequence to enter the vehicle when CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY() returned true for Jimmy.")
|
|
#ENDIF
|
|
SET_PED_COMPONENT_VARIATION(psJimmy.PedIndex, PED_COMP_BERD, 3, 0, 0) //(berd)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michael")
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY() returned true for Michael.")
|
|
#ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
|
|
SET_PED_STEALTH_MOVEMENT(PLAYER_PED_ID(), FALSE)
|
|
SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), FALSE)
|
|
|
|
SEQUENCE_INDEX SequenceIndex
|
|
CLEAR_SEQUENCE_TASK(SequenceIndex)
|
|
OPEN_SEQUENCE_TASK(SequenceIndex)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<-805.6359, 175.4280, 75.7407>>, 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, <<-804.6224, 179.1443, 75.7407>>, 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_CUTSCENE_EXIT)
|
|
|
|
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 CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Headset_Jimmy")
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY() returned true for Headset_Jimmy.")
|
|
#ENDIF
|
|
IF DOES_ENTITY_EXIST(osHeadset.ObjectIndex)
|
|
IF NOT IS_ENTITY_DEAD(osHeadset.ObjectIndex)
|
|
SET_ENTITY_COORDS_NO_OFFSET(osHeadset.ObjectIndex, << -806.598, 170.280, 76.475 >>)
|
|
SET_ENTITY_ROTATION(osHeadset.ObjectIndex, << -94.000, 0, 0.0>>)
|
|
FREEZE_ENTITY_POSITION(osHeadset.ObjectIndex, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Jimmy_Controller")
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY() returned true for Jimmy_Controller.")
|
|
#ENDIF
|
|
IF DOES_ENTITY_EXIST(osGamepad.ObjectIndex)
|
|
IF NOT IS_ENTITY_DEAD(osGamepad.ObjectIndex)
|
|
SET_ENTITY_COORDS_NO_OFFSET(osGamepad.ObjectIndex, osGamepad.vPosition)
|
|
SET_ENTITY_ROTATION(osGamepad.ObjectIndex, osGamepad.vRotation)
|
|
FREEZE_ENTITY_POSITION(osGamepad.ObjectIndex, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF HAS_CUTSCENE_FINISHED()
|
|
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
|
|
|
|
REPLAY_STOP_EVENT()
|
|
|
|
RETURN TRUE
|
|
|
|
ELSE
|
|
|
|
IF ( GET_CUTSCENE_TIME() > 12000 )
|
|
IF bStreamTriggered = TRUE
|
|
STOP_TV_PLAYBACK(TRUE, TV_LOC_JIMMY_BEDROOM)
|
|
bStreamTriggered = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF ( bCutsceneSkipped = FALSE )
|
|
IF WAS_CUTSCENE_SKIPPED()
|
|
bCutsceneSkipped = TRUE //if cutscene was skipped, set the cutscene skipped flag
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
//keep requesting assisted movement routes needed after the cutscene
|
|
ASSISTED_MOVEMENT_REQUEST_ROUTE("mansion_1")
|
|
ASSISTED_MOVEMENT_REQUEST_ROUTE("family5d")
|
|
ASSISTED_MOVEMENT_REQUEST_ROUTE("f5_jimmy1")
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
RETURN FALSE
|
|
|
|
ENDFUNC
|
|
|
|
PROC MANAGE_DEALER_PED(PED_STRUCT &ped, PED_INDEX TargetPedIndex)
|
|
|
|
VECTOR vScenePosition = << -1179.314, -891.318, 12.730 >>
|
|
VECTOR vSceneRoation = << 0.0, 0.0, -147.6 >>
|
|
|
|
IF DOES_ENTITY_EXIST(ped.PedIndex)
|
|
IF NOT IS_PED_INJURED(ped.PedIndex)
|
|
AND NOT IS_PED_INJURED(TargetPedIndex)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
DRAW_DEBUG_TEXT_ABOVE_ENTITY(ped.PedIndex, GET_PED_STATE_NAME_FOR_DEBUG(ped.eState), 1.25)
|
|
#ENDIF
|
|
|
|
FLOAT fDistanceToTargetPed = GET_DISTANCE_BETWEEN_ENTITIES(TargetPedIndex, ped.PedIndex)
|
|
|
|
IF ( ped.eState <> PED_STATE_FLEEING )
|
|
|
|
IF IS_PLAYER_TARGETTING_ENTITY(PLAYER_ID(), ped.PedIndex)
|
|
OR IS_PLAYER_FREE_AIMING_AT_ENTITY(PLAYER_ID(), ped.PedIndex)
|
|
|
|
IF IS_PED_IN_MELEE_COMBAT(TargetPedIndex)
|
|
|
|
IF ( fDistanceToTargetPed < 5.0 )
|
|
|
|
GO_TO_PED_STATE(ped, PED_STATE_FLEEING)
|
|
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
IF ( fDistanceToTargetPed < 20.0 )
|
|
|
|
WEAPON_TYPE eCurrentWeapon
|
|
|
|
IF GET_CURRENT_PED_WEAPON(TargetPedIndex, eCurrentWeapon)
|
|
|
|
IF GET_WEAPONTYPE_GROUP(eCurrentWeapon) != WEAPONGROUP_MELEE
|
|
AND GET_WEAPONTYPE_GROUP(eCurrentWeapon) != WEAPONGROUP_PETROLCAN
|
|
|
|
GO_TO_PED_STATE(ped, PED_STATE_FLEEING)
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF IS_PED_IN_COMBAT(ped.PedIndex, TargetPedIndex)
|
|
GO_TO_PED_STATE(ped, PED_STATE_FLEEING)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SWITCH ped.eState
|
|
|
|
CASE PED_STATE_IDLE
|
|
|
|
IF ( fDistanceToTargetPed < 200.0 )
|
|
GO_TO_PED_STATE(ped, PED_STATE_PLAYING_LOOP_ANIMATION)
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE PED_STATE_PLAYING_LOOP_ANIMATION
|
|
|
|
IF ( ped.bHasTask = FALSE )
|
|
|
|
IF NOT IS_ENTITY_PLAYING_ANIM(ped.PedIndex, "missfam5leadinoutmcs_5", "leadin_loop_alt_dealer")
|
|
|
|
REQUEST_ANIM_DICT("missfam5leadinoutmcs_5")
|
|
|
|
IF HAS_ANIM_DICT_LOADED("missfam5leadinoutmcs_5")
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ped.PedIndex, TRUE)
|
|
TASK_LOOK_AT_ENTITY(ped.PedIndex, TargetPedIndex, INFINITE_TASK_TIME, SLF_WHILE_NOT_IN_FOV)
|
|
TASK_PLAY_ANIM_ADVANCED(ped.PedIndex, "missfam5leadinoutmcs_5", "leadin_loop_alt_dealer",
|
|
vScenePosition, vSceneRoation, INSTANT_BLEND_IN, SLOW_BLEND_OUT, -1,
|
|
AF_LOOPING | AF_NOT_INTERRUPTABLE | AF_EXTRACT_INITIAL_OFFSET |
|
|
AF_USE_KINEMATIC_PHYSICS | AF_USE_MOVER_EXTRACTION)
|
|
ENDIF
|
|
|
|
|
|
ELSE
|
|
ped.bHasTask = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
|
|
IF IS_ENTITY_PLAYING_ANIM(ped.PedIndex, "missfam5leadinoutmcs_5", "leadin_loop_alt_dealer")
|
|
|
|
IF NOT DOES_ENTITY_EXIST(osCiggy.ObjectIndex)
|
|
IF HAS_MISSION_OBJECT_BEEN_CREATED(osCiggy)
|
|
ATTACH_ENTITY_TO_ENTITY(osCiggy.ObjectIndex, ped.PedIndex, GET_PED_BONE_INDEX(ped.PedIndex, BONETAG_PH_R_HAND),
|
|
<< 0.0, 0.0, 0.0 >>, << 0.0, 0.0, 0.0 >>)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF NOT DOES_ENTITY_EXIST(osMethBag.ObjectIndex)
|
|
IF HAS_MISSION_OBJECT_BEEN_CREATED(osMethBag)
|
|
ATTACH_ENTITY_TO_ENTITY(osMethBag.ObjectIndex, ped.PedIndex, GET_PED_BONE_INDEX(ped.PedIndex, BONETAG_PH_L_HAND),
|
|
<< 0.0, 0.0, 0.0 >>, << 0.0, 0.0, 0.0 >>)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF GET_ENTITY_ANIM_CURRENT_TIME(ped.PedIndex, "missfam5leadinoutmcs_5", "leadin_loop_alt_dealer") > 0.95
|
|
IF ( bLeadInTriggered = TRUE )
|
|
TASK_PLAY_ANIM_ADVANCED(ped.PedIndex, "missfam5leadinoutmcs_5", "leadin_action_dealer",
|
|
vScenePosition, vSceneRoation, SLOW_BLEND_IN, SLOW_BLEND_OUT, -1,
|
|
AF_HOLD_LAST_FRAME | AF_NOT_INTERRUPTABLE | AF_EXTRACT_INITIAL_OFFSET |
|
|
AF_USE_KINEMATIC_PHYSICS | AF_USE_MOVER_EXTRACTION)
|
|
GO_TO_PED_STATE(ped, PED_STATE_PLAYING_ACTION_ANIMATION)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE PED_STATE_PLAYING_ACTION_ANIMATION
|
|
|
|
IF ( ped.bHasTask = FALSE )
|
|
|
|
IF NOT IS_ENTITY_PLAYING_ANIM(ped.PedIndex, "missfam5leadinoutmcs_5", "leadin_action_dealer")
|
|
|
|
REQUEST_ANIM_DICT("missfam5leadinoutmcs_5")
|
|
|
|
IF HAS_ANIM_DICT_LOADED("missfam5leadinoutmcs_5")
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ped.PedIndex, TRUE)
|
|
TASK_PLAY_ANIM_ADVANCED(ped.PedIndex, "missfam5leadinoutmcs_5", "leadin_action_dealer",
|
|
vScenePosition, vSceneRoation, INSTANT_BLEND_IN, SLOW_BLEND_OUT, -1,
|
|
AF_HOLD_LAST_FRAME | AF_NOT_INTERRUPTABLE | AF_EXTRACT_INITIAL_OFFSET |
|
|
AF_USE_KINEMATIC_PHYSICS | AF_USE_MOVER_EXTRACTION)
|
|
ENDIF
|
|
|
|
|
|
ELSE
|
|
ped.bHasTask = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_ENTITY_PLAYING_ANIM(ped.PedIndex, "missfam5leadinoutmcs_5", "leadin_action_dealer")
|
|
SET_ENTITY_ANIM_SPEED(ped.PedIndex, "missfam5leadinoutmcs_5", "leadin_action_dealer", 0.85)
|
|
IF GET_ENTITY_ANIM_CURRENT_TIME(ped.PedIndex, "missfam5leadinoutmcs_5", "leadin_action_dealer") >= 0.98
|
|
bLeadInStartCutscene = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE PED_STATE_FLEEING
|
|
|
|
IF ( ped.bHasTask = FALSE )
|
|
MAKE_PED_FLEE_PED(ped.PedIndex, TargetPedIndex, 300, -1)
|
|
ped.bHasTask = TRUE
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC MANAGE_DEALER(INT &iProgress)
|
|
|
|
SWITCH iProgress
|
|
|
|
CASE 0
|
|
|
|
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), psDealer.vPosition) < 200.0
|
|
|
|
iProgress++
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 1 //create dealer ped and door object to animate
|
|
|
|
IF NOT DOES_ENTITY_EXIST(psDealer.PedIndex)
|
|
AND NOT DOES_ENTITY_EXIST(osBSDoorDummy.ObjectIndex)
|
|
|
|
REQUEST_MODEL(psDealer.ModelName)
|
|
REQUEST_MODEL(osBSDoorDummy.ModelName)
|
|
|
|
IF HAS_MODEL_LOADED(psDealer.ModelName)
|
|
AND HAS_MODEL_LOADED(osBSDoorDummy.ModelName)
|
|
|
|
psDealer.PedIndex = CREATE_PED(PEDTYPE_MISSION, psDealer.ModelName, psDealer.vPosition, psDealer.fHeading)
|
|
|
|
IF HAS_MISSION_OBJECT_BEEN_CREATED(osBSDoorDummy, TRUE)
|
|
|
|
SET_ENTITY_LOD_DIST(osBSDoorDummy.ObjectIndex, 150)
|
|
|
|
CREATE_MODEL_HIDE(osBSDoor.vPosition, 1.0, osBSDoor.ModelName, TRUE)
|
|
ENDIF
|
|
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(psDealer.ModelName)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(osBSDoorDummy.ModelName)
|
|
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
FailFlags[MISSION_FAIL_DEALER_DEAD] = TRUE
|
|
FailFlags[MISSION_FAIL_DEALER_SCARED] = TRUE
|
|
FailFlags[MISSION_FAIL_DEALER_ATTACKED] = TRUE
|
|
|
|
IF NOT IS_PED_INJURED(psDealer.PedIndex)
|
|
|
|
SET_PED_PROP_INDEX(psDealer.PedIndex, ANCHOR_HEAD, 0, 0)
|
|
SET_PED_PROP_INDEX(psDealer.PedIndex, ANCHOR_EYES, 0, 0)
|
|
|
|
SET_ENTITY_LOD_DIST(psDealer.PedIndex, 150)
|
|
SET_PED_LOD_MULTIPLIER(psDealer.PedIndex, 5.0)
|
|
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(psDealer.PedIndex, TRUE)
|
|
SET_PED_CONFIG_FLAG(psDealer.PedIndex, PCF_ForceStandardBumpReactionThresholds, TRUE)
|
|
SET_PED_FLEE_ATTRIBUTES(psDealer.PedIndex, FA_CAN_SCREAM | FA_DISABLE_HANDS_UP, TRUE)
|
|
|
|
ADD_PED_FOR_DIALOGUE(Family5Conversation, 5, psDealer.PedIndex, "FAM5DEALER")
|
|
ENDIF
|
|
|
|
GO_TO_PED_STATE(psDealer, PED_STATE_IDLE)
|
|
|
|
iProgress++
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 2 //update dealer ped
|
|
|
|
REQUEST_MODEL(osBSDoor.ModelName)
|
|
|
|
MANAGE_DEALER_PED(psDealer, PLAYER_PED_ID())
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
ENDPROC
|
|
|
|
PROC MANAGE_CONVERSATIONS_DURING_GOTO_BURGER_SHOT(INT &iProgress, STRING sRoot1, STRING sRoot2)
|
|
|
|
TEXT_LABEL txtRoot
|
|
|
|
txtRoot = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_ROOT()
|
|
|
|
//Pause the conversation when player gets too far away from Jimmy
|
|
IF NOT IS_PED_INJURED(psJimmy.PedIndex)
|
|
AND NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
|
|
IF ( bConversationsFinished = FALSE )
|
|
|
|
SWITCH iProgress
|
|
|
|
CASE 0
|
|
|
|
//pause the conversation with Jimmy when player gets too far away from Jimmy
|
|
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
IF NOT IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), psJimmy.PedIndex, << 8.0, 8.0, 4.0 >>)
|
|
//IF NOT IS_FACE_TO_FACE_CONVERSATION_PAUSED()
|
|
// PAUSE_FACE_TO_FACE_CONVERSATION(TRUE)
|
|
//ENDIF
|
|
KILL_FACE_TO_FACE_CONVERSATION()
|
|
//ELSE
|
|
//IF IS_FACE_TO_FACE_CONVERSATION_PAUSED()
|
|
// PAUSE_FACE_TO_FACE_CONVERSATION(FALSE) //resume the conversation when player gets close
|
|
//ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM5_PUSH") //handle conversation when Michael pushes Jimmy and makes him ragdoll
|
|
IF DOES_ENTITY_EXIST(psJimmy.PedIndex)
|
|
IF NOT IS_ENTITY_DEAD(psJimmy.PedIndex)
|
|
|
|
IF ( bJimmyRagdolledFromPlayerImpact = FALSE )
|
|
|
|
IF ( IS_PED_RAGDOLL(psJimmy.PedIndex) AND IS_ENTITY_TOUCHING_ENTITY(psJimmy.PedIndex, PLAYER_PED_ID()) )
|
|
OR HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(psJimmy.PedIndex, PLAYER_PED_ID())
|
|
|
|
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
KILL_FACE_TO_FACE_CONVERSATION()
|
|
ENDIF
|
|
|
|
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(psJimmy.PedIndex)
|
|
|
|
bJimmyRagdolledFromPlayerImpact = TRUE
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF ( bJimmyRagdolledFromPlayerImpact = TRUE )
|
|
IF NOT IS_PED_RAGDOLL(psJimmy.PedIndex)
|
|
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData)
|
|
|
|
IF CREATE_CONVERSATION(Family5Conversation, "FAM5AUD", "FAM5_PUSH", CONV_PRIORITY_MEDIUM)
|
|
|
|
bJimmyRagdolledFromPlayerImpact = FALSE
|
|
iJimmyRagdolledFromPlayerImpact++
|
|
|
|
IF ( iJimmyRagdolledFromPlayerImpact = 4 ) //only have 4 random variations
|
|
SET_LABEL_AS_TRIGGERED("FAM5_PUSH", TRUE)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_AMBIENT_SPEECH_PLAYING(psJimmy.PedIndex)
|
|
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(psJimmy.PedIndex, "FAM5_DXAA", "JIMMY", SPEECH_PARAMS_FORCE)
|
|
bJimmyRagdolledFromPlayerImpact = FALSE
|
|
iJimmyRagdolledFromPlayerImpact++
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF NOT HAS_LABEL_BEEN_TRIGGERED(sRoot1) //handle conversation when Michael and Jimmy walk down the stairs
|
|
IF DOES_BLIP_EXIST(sLocatesData.vehicleBlip) //wait for the objective and blip to get into the car first
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF NOT IS_PED_RAGDOLL(PLAYER_PED_ID()) AND NOT IS_PED_RAGDOLL(psJimmy.PedIndex)
|
|
IF CREATE_CONVERSATION(Family5Conversation, "FAM5AUD", sRoot1, CONV_PRIORITY_VERY_HIGH)
|
|
SET_LABEL_AS_TRIGGERED(sRoot1, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
|
|
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
AND ARE_STRINGS_EQUAL(txtRoot, sRoot1)
|
|
//IF IS_THIS_CONVERSATION_PLAYING(sRoot1)
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(vsMichaelsCar.VehicleIndex)
|
|
|
|
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vsMichaelsCar.VehicleIndex)
|
|
OR IS_PED_IN_VEHICLE(psJimmy.PedIndex, vsMichaelsCar.VehicleIndex)
|
|
OR IS_PED_GETTING_INTO_A_VEHICLE(psJimmy.PedIndex)
|
|
KILL_FACE_TO_FACE_CONVERSATION()
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
|
|
KILL_FACE_TO_FACE_CONVERSATION()
|
|
ENDIF
|
|
|
|
ELSE
|
|
bInitialConversationFinished = TRUE
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM5_SON3") //handle conversation when Michael and Jimmy get into the car
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(vsMichaelsCar.VehicleIndex)
|
|
|
|
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vsMichaelsCar.VehicleIndex)
|
|
AND IS_PED_IN_VEHICLE(psJimmy.PedIndex, vsMichaelsCar.VehicleIndex)
|
|
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF NOT IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
|
|
IF CREATE_CONVERSATION (Family5Conversation, "FAM5AUD", "FAM5_SON3", CONV_PRIORITY_MEDIUM)
|
|
SET_LABEL_AS_TRIGGERED("FAM5_SON3", TRUE)
|
|
iProgress++
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
|
|
//resume paused conversation if it was paused during walking to the car
|
|
IF IS_FACE_TO_FACE_CONVERSATION_PAUSED()
|
|
PAUSE_FACE_TO_FACE_CONVERSATION(FALSE)
|
|
ENDIF
|
|
|
|
IF IS_THIS_CONVERSATION_PLAYING(sRoot1)
|
|
KILL_FACE_TO_FACE_CONVERSATION()
|
|
ENDIF
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 1 //wait for the objective and blip to go to Burger Shot first
|
|
|
|
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
|
|
IF IS_THIS_PRINT_BEING_DISPLAYED("FAM5_GT3")//("FAM5_GT3")
|
|
|
|
CurrentConversationRoot = ""
|
|
CurrentConversationLabel = ""
|
|
|
|
iProgress++
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 2 //conversations on the way to Burger Shot
|
|
|
|
//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("FAM5_WNTD1")
|
|
|
|
IF HAS_LABEL_BEEN_TRIGGERED(sRoot2)
|
|
OR HAS_LABEL_BEEN_TRIGGERED("FAM5_SON5")
|
|
|
|
//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, sRoot2) //resume only the main conversations
|
|
OR ARE_STRINGS_EQUAL(CurrentConversationRoot, "FAM5_SON5")
|
|
IF CREATE_CONVERSATION_FROM_SPECIFIC_LINE(Family5Conversation, "FAM5AUD", CurrentConversationRoot, CurrentConversationLabel, CONV_PRIORITY_MEDIUM)
|
|
bCurrentConversationInterrupted = FALSE
|
|
SET_LABEL_AS_TRIGGERED("FAM5_WNTD1", FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//handle player getting out of the car and being wanted
|
|
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, player is out of the car or wanted
|
|
|
|
IF IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0) //when wanted, kill conversation, pause it and play wanted conversation
|
|
|
|
IF ( bCurrentConversationInterrupted = FALSE )
|
|
|
|
IF HAS_LABEL_BEEN_TRIGGERED(sRoot2)
|
|
OR HAS_LABEL_BEEN_TRIGGERED("FAM5_SON5")
|
|
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, sRoot2)
|
|
OR ARE_STRINGS_EQUAL(CurrentConversationRoot, "FAM5_SON5")
|
|
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("FAM5_WNTD1")
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(Family5Conversation, "FAM5AUD", "FAM5_WNTD1", CONV_PRIORITY_HIGH)
|
|
SET_LABEL_AS_TRIGGERED("FAM5_WNTD1", TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ELSE //player not wanted, pause face to face conversations
|
|
|
|
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
IF NOT IS_FACE_TO_FACE_CONVERSATION_PAUSED()
|
|
PAUSE_FACE_TO_FACE_CONVERSATION(TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
|
|
|
|
//play conversation when Michael and Jimmy drive to Burger Shot
|
|
IF NOT HAS_LABEL_BEEN_TRIGGERED(sRoot2)
|
|
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION (Family5Conversation, "FAM5AUD", sRoot2, CONV_PRIORITY_MEDIUM)
|
|
SET_LABEL_AS_TRIGGERED(sRoot2, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//handle conversation when Michael and Jimmy are close to Burger Shot
|
|
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM5_SON5")
|
|
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), psDealer.vPosition, <<130.0, 130.0, 100.0>>)
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(Family5Conversation, "FAM5AUD", "FAM5_SON5", CONV_PRIORITY_MEDIUM)
|
|
SET_LABEL_AS_TRIGGERED("FAM5_SON5", TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
KILL_ANY_CONVERSATION()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
|
|
//kill any conversation when they drive into burger shot parking lot, so that it stops before the lead in
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-1184.633423,-874.228088,17.855732>>, <<-1168.236450,-901.460083,7.064990>>, 35.0)
|
|
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
KILL_FACE_TO_FACE_CONVERSATION()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
ENDIF
|
|
|
|
IF ( bLeadInTriggered = TRUE )
|
|
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM5_PREBS")
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
//if dealer is playing loop anim only, otherwise it might be too late to play conversation
|
|
IF DOES_ENTITY_EXIST(psDealer.PedIndex)
|
|
IF NOT IS_ENTITY_DEAD(psDealer.PedIndex)
|
|
IF IS_ENTITY_PLAYING_ANIM(psDealer.PedIndex, "missfam5leadinoutmcs_5", "leadin_loop_alt_dealer")
|
|
IF CREATE_CONVERSATION(Family5Conversation, "FAM5AUD", "FAM5_PREBS", CONV_PRIORITY_MEDIUM)
|
|
SET_LABEL_AS_TRIGGERED("FAM5_PREBS", TRUE)
|
|
ENDIF
|
|
ELSE
|
|
SET_LABEL_AS_TRIGGERED("FAM5_PREBS", TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC MANAGE_JIMMY_DURING_GOTO_BURGER_SHOT(INT &iProgress)
|
|
|
|
IF NOT IS_PED_INJURED(psJimmy.PedIndex)
|
|
|
|
SWITCH iProgress
|
|
|
|
CASE 0 //make Jimmy enter Michael's car, if he is not doing that already after the cutscene
|
|
|
|
SET_PED_CONFIG_FLAG(psJimmy.PedIndex, PCF_OpenDoorArmIK, TRUE)
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(vsMichaelsCar.VehicleIndex)
|
|
|
|
IF ( GET_SCRIPT_TASK_STATUS(psJimmy.PedIndex, SCRIPT_TASK_ENTER_VEHICLE) != PERFORMING_TASK )
|
|
|
|
//this is a hacky way to stop jimmy from stopping when walking to the car on retry
|
|
//warp jimmy, task him to enter vehicle and wait for a second before fading in
|
|
//this should only be done on retry or debug skip
|
|
WARP_PED(psJimmy.PedIndex, <<-805.4584, 174.9825, 75.7407>>, 336.1902, FALSE, FALSE, FALSE)
|
|
TASK_ENTER_VEHICLE(psJimmy.PedIndex, vsMichaelsCar.VehicleIndex, DEFAULT_TIME_BEFORE_WARP * 3, VS_FRONT_RIGHT, PEDMOVEBLENDRATIO_WALK)
|
|
FORCE_PED_MOTION_STATE(psJimmy.PedIndex, MS_ON_FOOT_WALK)
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Ped Jimmy received task sequence to enter the vehicle.")
|
|
#ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
IF ( GET_SCRIPT_TASK_STATUS(PLAYER_PED_ID(), SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK )
|
|
|
|
SET_PED_STEALTH_MOVEMENT(PLAYER_PED_ID(), FALSE)
|
|
SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), FALSE)
|
|
|
|
SEQUENCE_INDEX SequenceIndex
|
|
CLEAR_SEQUENCE_TASK(SequenceIndex)
|
|
OPEN_SEQUENCE_TASK(SequenceIndex)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<-805.6359, 175.4280, 75.7407>>, 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, <<-804.6224, 179.1443, 75.7407>>, 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)
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
WAIT(1000)
|
|
|
|
IF IS_SCREEN_FADED_OUT()
|
|
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
iProgress++
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 1 //check if Jimmy got into Michael's car
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(vsMichaelsCar.VehicleIndex)
|
|
|
|
IF NOT IS_PED_IN_VEHICLE(psJimmy.PedIndex, vsMichaelsCar.VehicleIndex)
|
|
|
|
SET_PED_RESET_FLAG(psJimmy.PedIndex, PRF_SearchForClosestDoor, TRUE)
|
|
|
|
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vsMichaelsCar.VehicleIndex)
|
|
OR IS_PED_GETTING_INTO_A_VEHICLE(PLAYER_PED_ID())
|
|
|
|
//in case Jimmy stops getting into the car
|
|
//for example when he is ragdolling, doing a NM task or doing TASK_DO_NOTHING
|
|
IF GET_SCRIPT_TASK_STATUS(psJimmy.PedIndex, SCRIPT_TASK_ENTER_VEHICLE) != PERFORMING_TASK
|
|
//IF GET_SCRIPT_TASK_STATUS(psJimmy.PedIndex, SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
|
|
TASK_ENTER_VEHICLE(psJimmy.PedIndex, vsMichaelsCar.VehicleIndex, DEFAULT_TIME_BEFORE_WARP * 3, VS_FRONT_RIGHT, PEDMOVE_RUN)
|
|
ENDIF
|
|
|
|
//make Jimmy run to the car
|
|
SET_PED_DESIRED_MOVE_BLEND_RATIO(psJimmy.PedIndex, PEDMOVEBLENDRATIO_RUN)
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF IS_PED_IN_VEHICLE(psJimmy.PedIndex, vsMichaelsCar.VehicleIndex)
|
|
iProgress++
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC MANAGE_FOCUS_PUSH()
|
|
|
|
IF NOT IS_GAMEPLAY_HINT_ACTIVE()
|
|
SET_GAMEPLAY_HINT_FOV(fFocusPushHintFOV)
|
|
SET_GAMEPLAY_COORD_HINT(vFocusPushHintPosition, -1, 2500)
|
|
|
|
SET_GAMEPLAY_HINT_CAMERA_RELATIVE_SIDE_OFFSET(fFocusPushSideOffset)
|
|
SET_GAMEPLAY_HINT_CAMERA_RELATIVE_VERTICAL_OFFSET(fFocusPushVerticalOffset)
|
|
|
|
SET_GAMEPLAY_HINT_FOLLOW_DISTANCE_SCALAR(fFocusPushFollowDistanceScalar)
|
|
SET_GAMEPLAY_HINT_BASE_ORBIT_PITCH_OFFSET(fFocusPushBaseOrbitPitchOffset)
|
|
ELSE
|
|
#IF IS_DEBUG_BUILD
|
|
IF ( bResetGameplayHint = TRUE )
|
|
STOP_GAMEPLAY_HINT(TRUE)
|
|
bResetGameplayHint = FALSE
|
|
ENDIF
|
|
#ENDIF
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
FUNC BOOL IS_MISSION_STAGE_GOTO_BURGER_SHOT_COMPLETED(INT &iStageProgress)
|
|
|
|
SET_BIT(sLocatesData.iLocatesBitSet, BS_DONT_DO_J_SKIP)
|
|
DISABLE_LOCATES_WANTED_PRINTS_OUTSIDE_OF_VEHICLE(sLocatesData, TRUE)
|
|
|
|
MANAGE_DEALER(psDealer.iProgress)
|
|
MANAGE_JIMMY_DURING_GOTO_BURGER_SHOT(psJimmy.iProgress)
|
|
MANAGE_CONVERSATIONS_DURING_GOTO_BURGER_SHOT(iConversationProgress, PICK_STRING(bStageReplayInProgress, "FAM5_SON2b", "FAM5_SON2"),
|
|
PICK_STRING(bStageReplayInProgress, "FAM5_SON4b", "FAM5_SON4"))
|
|
|
|
UPDATE_TRIGGERED_LABEL(sLabelMGETIN)
|
|
|
|
//handle requestting mocap cutscene
|
|
IF IS_PLAYER_BROWSING_ITEMS_IN_ANY_SHOP()
|
|
OR IS_PLAYER_CHANGING_CLOTHES()
|
|
|
|
IF HAS_THIS_CUTSCENE_LOADED("family_5_mcs_5")
|
|
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()), << -1175.67, -888.60, 12.87 >>) < DEFAULT_CUTSCENE_LOAD_DIST
|
|
|
|
REQUEST_CUTSCENE("family_5_mcs_5")
|
|
|
|
IF IS_PLAYER_PLAYING(PLAYER_ID())
|
|
SET_ALL_RANDOM_PEDS_FLEE_THIS_FRAME(PLAYER_ID())
|
|
ENDIF
|
|
|
|
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", PLAYER_PED_ID()) //Michael's variations
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting cutscene ped components for cutscene ped Michael from player ped.")
|
|
#ENDIF
|
|
ENDIF
|
|
IF NOT IS_PED_INJURED(psJimmy.PedIndex)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Jimmy", psJimmy.PedIndex) //Jimmy's variations
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Jimmy", PED_COMP_BERD, 1, 0)
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting cutscene ped components for cutscene ped Jimmy from ped.")
|
|
#ENDIF
|
|
ENDIF
|
|
IF DOES_ENTITY_EXIST(psDealer.PedIndex)
|
|
IF NOT IS_ENTITY_DEAD(psDealer.PedIndex)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Burgershot_drugdealer", psDealer.PedIndex)
|
|
SET_CUTSCENE_PED_PROP_VARIATION("Burgershot_drugdealer", ANCHOR_HEAD, 0, 0)
|
|
SET_CUTSCENE_PED_PROP_VARIATION("Burgershot_drugdealer", ANCHOR_EYES, 0, 0)
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting cutscene ped components for cutscene ped Burgershot_drugdealer from ped.")
|
|
#ENDIF
|
|
ENDIF
|
|
ELSE
|
|
SET_CUTSCENE_PED_PROP_VARIATION("Burgershot_drugdealer", ANCHOR_HEAD, 0, 0)
|
|
SET_CUTSCENE_PED_PROP_VARIATION("Burgershot_drugdealer", ANCHOR_EYES, 0, 0)
|
|
ENDIF
|
|
bCutsceneAssetsRequested = TRUE
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
IF HAS_THIS_CUTSCENE_LOADED("family_5_mcs_5")
|
|
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 ASSISTED_MOVEMENT_IS_ROUTE_LOADED("family5d")
|
|
AND NOT ASSISTED_MOVEMENT_IS_ROUTE_LOADED("mansion_1")
|
|
AND NOT ASSISTED_MOVEMENT_IS_ROUTE_LOADED("f5_jimmy1")
|
|
ASSISTED_MOVEMENT_REQUEST_ROUTE("family5d")
|
|
ASSISTED_MOVEMENT_REQUEST_ROUTE("mansion_1")
|
|
ASSISTED_MOVEMENT_REQUEST_ROUTE("f5_jimmy1")
|
|
ENDIF
|
|
|
|
REQUEST_VEHICLE_ASSET(GET_PLAYER_VEH_MODEL(CHAR_MICHAEL))
|
|
|
|
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())
|
|
REPLAY_RECORD_BACK_FOR_TIME(0.0, 12.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
bPlayerPedScriptTaskInterrupted = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(vsMichaelsCar.VehicleIndex)
|
|
|
|
IF IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), vsMichaelsCar.VehicleIndex)
|
|
|
|
IF NOT IS_PED_INJURED(psJimmy.PedIndex)
|
|
|
|
IF NOT IS_PED_IN_VEHICLE(psJimmy.PedIndex, vsMichaelsCar.VehicleIndex)
|
|
|
|
//if player keeps driving away from stage start while Jimmy still runs behind the car
|
|
IF ( GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(vsMichaelsCar.VehicleIndex), vsMichaelsCar.vPosition) > ABANDON_BUDDY_FAIL_RANGE )
|
|
bJimmyLeftBehindSprinting = TRUE
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF IS_AUDIO_SCENE_ACTIVE("FAMILY_5_GO_TO_JIMMY")
|
|
STOP_AUDIO_SCENE("FAMILY_5_GO_TO_JIMMY")
|
|
ENDIF
|
|
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("FAMILY_5_GO_TO_BURGERSHOT")
|
|
START_AUDIO_SCENE("FAMILY_5_GO_TO_BURGERSHOT")
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
SET_PED_RESET_FLAG(PLAYER_PED_ID(), PRF_ForcePlayerToEnterVehicleThroughDirectDoorOnly, TRUE)
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_PLAYER_AT_LOCATION_WITH_BUDDY_IN_VEHICLE(sLocatesData, << -1175.67, -888.60, 12.87 >>, << 5.0, 3.5, LOCATE_SIZE_HEIGHT >>,
|
|
TRUE, psJimmy.PedIndex, vsMichaelsCar.VehicleIndex, "", "CMN_JLEAVE",
|
|
PICK_STRING(IS_SUBTITLE_PREFERENCE_SWITCHED_ON(), "", sLabelMGETIN),
|
|
"CMN_GENGETBCKY", FALSE, TRUE)
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(vsMichaelsCar.VehicleIndex)
|
|
IF IS_VEHICLE_ON_ALL_WHEELS(vsMichaelsCar.VehicleIndex)
|
|
|
|
bConversationsFinished = TRUE
|
|
|
|
KILL_ANY_CONVERSATION()
|
|
|
|
CLEANUP_MISSION_OBJECT_GROUP(osYogaMats, TRUE)
|
|
CLEANUP_MISSION_OBJECT(osGamepad, TRUE)
|
|
CLEANUP_MISSION_OBJECT(osHeadset, TRUE)
|
|
SET_BUILDING_STATE(BUILDINGNAME_IPL_YOGA_GAME, BUILDINGSTATE_DESTROYED)
|
|
|
|
REPLAY_RECORD_BACK_FOR_TIME(12.0, 1.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
bLeadInTriggered = TRUE
|
|
|
|
IF ( GET_FOLLOW_VEHICLE_CAM_VIEW_MODE() = CAM_VIEW_MODE_FIRST_PERSON )
|
|
bIgnoreLeadInFocusPush = TRUE
|
|
ENDIF
|
|
|
|
iStageProgress++
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF NOT HAS_LABEL_BEEN_TRIGGERED(sLabelMGETIN)
|
|
AND NOT IS_STRING_NULL_OR_EMPTY(sLabelMGETIN)
|
|
IF DOES_BLIP_EXIST(sLocatesData.vehicleBlip)
|
|
IF ( bInitialConversationFinished = TRUE )
|
|
PRINT_GOD_TEXT_ADVANCED(sLabelMGETIN)
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF IS_THIS_PRINT_BEING_DISPLAYED(sLabelMGETIN)
|
|
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vsMichaelsCar.VehicleIndex)
|
|
CLEAR_PRINTS()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM5_GT3")
|
|
|
|
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
|
|
IF HAS_LABEL_BEEN_TRIGGERED("FAM5_SON3")
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
PRINT_GOD_TEXT_ADVANCED("FAM5_GT3")
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
IF IS_THIS_PRINT_BEING_DISPLAYED("FAM5_GT3")
|
|
IF NOT DOES_BLIP_EXIST(sLocatesData.LocationBlip)
|
|
CLEAR_PRINTS()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
//handle removing prop objects from previous stage
|
|
IF DOES_ENTITY_EXIST(osYogaMats[0].ObjectIndex)
|
|
OR DOES_ENTITY_EXIST(osYogaMats[1].ObjectIndex)
|
|
OR DOES_ENTITY_EXIST(osYogaMats[2].ObjectIndex)
|
|
OR DOES_ENTITY_EXIST(osGamepad.ObjectIndex)
|
|
OR DOES_ENTITY_EXIST(osHeadset.ObjectIndex)
|
|
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), MissionPosition.vStageStart) > 75.0
|
|
CLEANUP_MISSION_OBJECT_GROUP(osYogaMats, TRUE)
|
|
CLEANUP_MISSION_OBJECT(osGamepad, TRUE)
|
|
CLEANUP_MISSION_OBJECT(osHeadset, TRUE)
|
|
SET_BUILDING_STATE(BUILDINGNAME_IPL_YOGA_GAME, BUILDINGSTATE_DESTROYED)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 1
|
|
|
|
IF ( bIgnoreLeadInFocusPush = FALSE )
|
|
MANAGE_FOCUS_PUSH()
|
|
ENDIF
|
|
|
|
IF BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(vsMichaelsCar.VehicleIndex, 2.5, 1, 0.75)
|
|
|
|
//IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
IF bLeadInStartCutscene = TRUE AND bCutsceneAssetsRequested = TRUE
|
|
RETURN TRUE
|
|
ENDIF
|
|
//ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
RETURN FALSE
|
|
|
|
ENDFUNC
|
|
|
|
FUNC BOOL IS_MISSION_STAGE_CUTSCENE_BURGER_SHOT_COMPLETED(INT &iStageProgress)
|
|
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(iLeadOutSceneID)
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(vsMichaelsCar.VehicleIndex)
|
|
IF IS_ENTITY_PLAYING_ANIM(vsMichaelsCar.VehicleIndex, "missfam5leadinoutmcs_5", "leadout_car_door")
|
|
DISABLE_PLAYER_VEHICLE_DRIVING_CONTROLS_THIS_FRAME()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
DISABLE_PLAYER_VEHICLE_MISC_CONTROLS_THIS_FRAME()
|
|
|
|
IF (bLeadOutCameraCancelled = FALSE)
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
IF IS_ENTITY_PLAYING_ANIM(PLAYER_PED_ID(), "missfam5leadinoutmcs_5", "leadout_mic") //when player is playing leadout anim
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_MOVE_LR) //disable vehicle turing controls
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_MOVE_UD) //to stop extra movement on secondary anim
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_CAM_EXIST(ScriptedCamera)
|
|
|
|
IF (bLeadOutCameraCancelled = FALSE)
|
|
|
|
IF SAFE_TO_PRINT_CHASE_HINT_CAM_HELP(DEFAULT, DEFAULT, TRUE) //display help text for cinematic camera
|
|
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM5_HCAM")
|
|
PRINT_HELP("FAM5_HCAM", DEFAULT_HELP_TEXT_TIME)
|
|
SET_LABEL_AS_TRIGGERED("FAM5_HCAM", TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF SHOULD_CONTROL_CHASE_HINT_CAM(sCinematicCamStruct, DEFAULT, DEFAULT, TRUE) //control cinematic camera toggle
|
|
IF NOT IS_CAM_RENDERING(ScriptedCamera)
|
|
DISPLAY_RADAR(FALSE)
|
|
RENDER_SCRIPT_CAMS(TRUE, FALSE)
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("FAMILY_5_TAKE_JIMMY_FOCUS_CAM")
|
|
STOP_AUDIO_SCENE("FAMILY_5_TAKE_JIMMY")
|
|
START_AUDIO_SCENE("FAMILY_5_TAKE_JIMMY_FOCUS_CAM")
|
|
ENDIF
|
|
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("FAM5_HCAM")
|
|
CLEAR_HELP()
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
|
|
IF IS_CAM_RENDERING(ScriptedCamera)
|
|
DISPLAY_RADAR(TRUE)
|
|
RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
IF IS_AUDIO_SCENE_ACTIVE("FAMILY_5_TAKE_JIMMY_FOCUS_CAM")
|
|
STOP_AUDIO_SCENE("FAMILY_5_TAKE_JIMMY_FOCUS_CAM")
|
|
START_AUDIO_SCENE("FAMILY_5_TAKE_JIMMY")
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF ( bLeadOutCameraCancelled = FALSE )
|
|
IF IS_VEHICLE_DRIVEABLE(vsMichaelsCar.VehicleIndex)
|
|
IF NOT IS_ENTITY_PLAYING_ANIM(vsMichaelsCar.VehicleIndex, "missfam5leadinoutmcs_5", "leadout_car_door")
|
|
IF NOT IS_VEHICLE_STOPPED(vsMichaelsCar.VehicleIndex)
|
|
IF DOES_CAM_EXIST(ScriptedCamera)
|
|
IF IS_CAM_RENDERING(ScriptedCamera)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
|
|
ENDIF
|
|
ENDIF
|
|
CLEAR_HELP(TRUE)
|
|
DISPLAY_RADAR(TRUE)
|
|
RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
CLEAR_PED_TASKS(PLAYER_PED_ID()) //clear ped tasks when quitting the scripted leadout, fix for B*2079938
|
|
ENDIF
|
|
KILL_CHASE_HINT_CAM(sCinematicCamStruct)
|
|
bLeadOutCameraCancelled = TRUE
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Cancelling animated leadout camera due to player driving the car.")
|
|
#ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
SWITCH iStageProgress
|
|
|
|
CASE 0
|
|
|
|
IF HAS_REQUESTED_CUTSCENE_LOADED("family_5_mcs_5")
|
|
|
|
KILL_ANY_CONVERSATION()
|
|
KILL_FACE_TO_FACE_CONVERSATION()
|
|
|
|
IF NOT IS_PED_INJURED(psJimmy.PedIndex)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(psJimmy.PedIndex, "Jimmy", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, psJimmy.ModelName)
|
|
ENDIF
|
|
|
|
REGISTER_ENTITY_FOR_CUTSCENE(osNecklace.ObjectIndex, "Jimmy_necklace", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, P_JIMMYNECK_03_S)
|
|
|
|
IF DOES_ENTITY_EXIST(osMethBag.ObjectIndex)
|
|
IF NOT IS_ENTITY_DEAD(osMethBag.ObjectIndex)
|
|
DETACH_ENTITY(osMethBag.ObjectIndex, FALSE, TRUE)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(osMethBag.ObjectIndex, "Meth_Bag", CU_ANIMATE_AND_DELETE_EXISTING_SCRIPT_ENTITY, osMethBag.ModelName)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(psDealer.PedIndex)
|
|
TASK_CLEAR_LOOK_AT(psDealer.PedIndex)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(psDealer.PedIndex, "Burgershot_drugdealer", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(vsMichaelsCar.VehicleIndex)
|
|
|
|
IF IS_VEHICLE_DOOR_DAMAGED(vsMichaelsCar.VehicleIndex, SC_DOOR_FRONT_LEFT)
|
|
SET_VEHICLE_DOOR_CONTROL(vsMichaelsCar.VehicleIndex, SC_DOOR_FRONT_LEFT, DT_DOOR_INTACT, 0.0)
|
|
ENDIF
|
|
IF IS_VEHICLE_DOOR_DAMAGED(vsMichaelsCar.VehicleIndex, SC_DOOR_FRONT_RIGHT)
|
|
SET_VEHICLE_DOOR_CONTROL(vsMichaelsCar.VehicleIndex, SC_DOOR_FRONT_RIGHT, DT_DOOR_INTACT, 0.0)
|
|
ENDIF
|
|
|
|
REGISTER_ENTITY_FOR_CUTSCENE(vsMichaelsCar.VehicleIndex, "Michaels_car", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
|
|
STOP_AUDIO_SCENE("FAMILY_5_GO_TO_BURGERSHOT")
|
|
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
|
|
|
|
START_CUTSCENE()
|
|
|
|
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
iStageProgress++
|
|
|
|
ELSE
|
|
|
|
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", PLAYER_PED_ID())
|
|
ENDIF
|
|
IF NOT IS_PED_INJURED(psJimmy.PedIndex)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Jimmy", psJimmy.PedIndex)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Jimmy", PED_COMP_BERD, 1, 0)
|
|
ENDIF
|
|
IF NOT IS_PED_INJURED(psDealer.PedIndex)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Burgershot_drugdealer", psDealer.PedIndex)
|
|
ENDIF
|
|
SET_CUTSCENE_PED_PROP_VARIATION("Burgershot_drugdealer", ANCHOR_HEAD, 0, 0)
|
|
SET_CUTSCENE_PED_PROP_VARIATION("Burgershot_drugdealer", ANCHOR_EYES, 0, 0)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 1 //fade screen in if screen was faded out due to shit skip or debug skip
|
|
|
|
IF IS_CUTSCENE_PLAYING()
|
|
|
|
STOP_GAMEPLAY_HINT(TRUE)
|
|
|
|
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(osCiggy.ObjectIndex)
|
|
IF NOT IS_ENTITY_DEAD(osCiggy.ObjectIndex)
|
|
IF IS_ENTITY_ATTACHED(osCiggy.ObjectIndex)
|
|
DETACH_ENTITY(osCiggy.ObjectIndex, FALSE)
|
|
ENDIF
|
|
DELETE_OBJECT(osCiggy.ObjectIndex)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(vsMichaelsCar.VehicleIndex)
|
|
SET_VEHICLE_DOOR_CONTROL(vsMichaelsCar.VehicleIndex, SC_DOOR_FRONT_RIGHT, DT_DOOR_INTACT, 0.0)
|
|
SET_VEHICLE_DOOR_SHUT(vsMichaelsCar.VehicleIndex, SC_DOOR_FRONT_RIGHT, TRUE)
|
|
ENDIF
|
|
|
|
CLEAR_AREA(<< -1176.3639, -887.5740, 12.8652 >>, 6.0, TRUE, TRUE)
|
|
CLEAR_AREA_OF_VEHICLES(<< -1176.3639, -887.5740, 12.8652 >>, 6.0, TRUE)
|
|
|
|
CREATE_MODEL_HIDE(osBSDoor.vPosition, 1.0, osBSDoor.ModelName, FALSE)
|
|
|
|
SET_SRL_POST_CUTSCENE_CAMERA(<< -1179.80, -882.04, 14.75 >>, << 0.53, -0.85, -0.04 >>) //gameplay cam position and direction after cutscene
|
|
|
|
IF IS_SCREEN_FADED_OUT()
|
|
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
|
|
ENDIF
|
|
|
|
SETTIMERA(0)
|
|
|
|
iStageProgress++
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 2
|
|
|
|
REQUEST_MODEL(osCup.ModelName)
|
|
REQUEST_MODEL(osBSDoorDummy.ModelName)
|
|
|
|
REQUEST_ANIM_DICT("missfam5_drink")
|
|
REQUEST_ANIM_DICT("missfam5leadinoutmcs_5")
|
|
|
|
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM5_MCS5LO_P")
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
PRELOAD_CONVERSATION(Family5Conversation, "FAM5AUD", "FAM5_MCS5LO", CONV_PRIORITY_MEDIUM)
|
|
SET_LABEL_AS_TRIGGERED("FAM5_MCS5LO_P", TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(vsMichaelsCar.VehicleIndex)
|
|
SET_VEHICLE_BRAKE_LIGHTS(vsMichaelsCar.VehicleIndex, FALSE)
|
|
ENDIF
|
|
|
|
IF NOT DOES_ENTITY_EXIST(osNecklace.ObjectIndex)
|
|
IF DOES_CUTSCENE_ENTITY_EXIST("Jimmy_necklace")
|
|
IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Jimmy_necklace"))
|
|
|
|
osNecklace.ObjectIndex = GET_OBJECT_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Jimmy_necklace"))
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Grabbed Jimmy_necklace object from the cutscene.")
|
|
#ENDIF
|
|
|
|
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 for camera.")
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": TIMERA(): ", TIMERA(), ".")
|
|
#ENDIF
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0)
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Jimmy", psJimmy.ModelName)
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY() returned true for Jimmy.")
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": TIMERA(): ", TIMERA(), ".")
|
|
#ENDIF
|
|
IF NOT IS_PED_INJURED(psJimmy.PedIndex)
|
|
SET_PED_COMPONENT_VARIATION(psJimmy.PedIndex, PED_COMP_BERD, 3, 0, 0) //(berd)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Jimmy_necklace")
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY() returned true for Jimmy_necklace.")
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": TIMERA(): ", TIMERA(), ".")
|
|
#ENDIF
|
|
IF DOES_ENTITY_EXIST(osNecklace.ObjectIndex)
|
|
IF NOT IS_ENTITY_DEAD(osNecklace.ObjectIndex)
|
|
DELETE_OBJECT(osNecklace.ObjectIndex)
|
|
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.")
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": TIMERA(): ", TIMERA(), ".")
|
|
#ENDIF
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), vsMichaelsCar.VehicleIndex, VS_DRIVER)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michaels_car")
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY() returned true for Michaels_car.")
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": TIMERA(): ", TIMERA(), ".")
|
|
#ENDIF
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Burgershot_drugdealer")
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY() returned true for Burgershot_drugdealer.")
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": TIMERA(): ", TIMERA(), ".")
|
|
#ENDIF
|
|
|
|
IF ( bCutsceneSkipped = FALSE )
|
|
|
|
IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iLeadOutSceneID) //set up synchronised scene for lead out
|
|
|
|
iLeadOutSceneID = CREATE_SYNCHRONIZED_SCENE(GET_ENTITY_COORDS(vsMichaelsCar.VehicleIndex), GET_ENTITY_ROTATION(vsMichaelsCar.VehicleIndex))
|
|
|
|
SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(iLeadOutSceneID, TRUE)
|
|
|
|
DESTROY_ALL_CAMS()
|
|
ScriptedCamera = CREATE_CAMERA(CAMTYPE_ANIMATED, TRUE)
|
|
PLAY_SYNCHRONIZED_CAM_ANIM(ScriptedCamera, iLeadOutSceneID, "leadout_cam", "missfam5leadinoutmcs_5")
|
|
|
|
SET_VEHICLE_DOOR_LATCHED(vsMichaelsCar.VehicleIndex, SC_DOOR_FRONT_RIGHT, TRUE, TRUE, FALSE)
|
|
PLAY_ENTITY_ANIM(vsMichaelsCar.VehicleIndex, "leadout_car_door", "missfam5leadinoutmcs_5", INSTANT_BLEND_IN, FALSE, FALSE, FALSE, 0, ENUM_TO_INT(AF_USE_KINEMATIC_PHYSICS))
|
|
|
|
IF HAS_MISSION_OBJECT_BEEN_CREATED(osBSDoorDummy)
|
|
FREEZE_ENTITY_POSITION(osBSDoorDummy.ObjectIndex, FALSE)
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(osBSDoorDummy.ObjectIndex, iLeadOutSceneID, "leadout_door", "missfam5leadinoutmcs_5", INSTANT_BLEND_IN, SLOW_BLEND_OUT)
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(psJimmy.PedIndex)
|
|
IF NOT IS_ENTITY_DEAD(psJimmy.PedIndex)
|
|
IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iLeadOutSceneJimmyID)
|
|
|
|
iLeadOutSceneJimmyID = CREATE_SYNCHRONIZED_SCENE(GET_WORLD_POSITION_OF_ENTITY_BONE(vsMichaelsCar.VehicleIndex,
|
|
GET_ENTITY_BONE_INDEX_BY_NAME(vsMichaelsCar.VehicleIndex, "seat_pside_f")),
|
|
GET_ENTITY_ROTATION(vsMichaelsCar.VehicleIndex))
|
|
|
|
CLEAR_PED_TASKS_IMMEDIATELY(psJimmy.PedIndex)
|
|
TASK_SYNCHRONIZED_SCENE(psJimmy.PedIndex, iLeadOutSceneJimmyID, "missfam5leadinoutmcs_5", "leadout_alt_jimmy",
|
|
INSTANT_BLEND_IN, SLOW_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(psJimmy.PedIndex, TRUE)
|
|
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(psDealer.PedIndex)
|
|
IF NOT IS_ENTITY_DEAD(psDealer.PedIndex)
|
|
CLEAR_PED_TASKS_IMMEDIATELY(psDealer.PedIndex)
|
|
TASK_SYNCHRONIZED_SCENE(psDealer.PedIndex, iLeadOutSceneID, "missfam5leadinoutmcs_5", "leadout_dealer", INSTANT_BLEND_IN, INSTANT_BLEND_OUT)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(psDealer.PedIndex)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(PLAYER_PED_ID())
|
|
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
|
|
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
|
|
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), vsMichaelsCar.VehicleIndex, VS_DRIVER)
|
|
TASK_PLAY_ANIM(PLAYER_PED_ID(), "missfam5leadinoutmcs_5", "leadout_mic", INSTANT_BLEND_IN, SLOW_BLEND_OUT, -1, AF_UPPERBODY | AF_SECONDARY)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID())
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF HAS_CUTSCENE_FINISHED()
|
|
|
|
START_AUDIO_SCENE("FAMILY_5_TAKE_JIMMY")
|
|
SET_PARTICLE_FX_CAM_INSIDE_VEHICLE(FALSE)
|
|
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
|
|
|
|
IF ( bCutsceneSkipped = TRUE ) //cutscene was skipped
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(vsMichaelsCar.VehicleIndex)
|
|
SET_VEHICLE_DOORS_SHUT(vsMichaelsCar.VehicleIndex, TRUE)
|
|
SET_VEHICLE_ON_GROUND_PROPERLY(vsMichaelsCar.VehicleIndex)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(psJimmy.PedIndex)
|
|
SET_PED_INTO_VEHICLE(psJimmy.PedIndex, vsMichaelsCar.VehicleIndex, VS_FRONT_RIGHT)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), vsMichaelsCar.VehicleIndex, VS_DRIVER)
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(psDealer.PedIndex)
|
|
DELETE_PED(psDealer.PedIndex)
|
|
ENDIF
|
|
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
|
|
|
|
|
|
iStageProgress = 4 //go to last stage
|
|
|
|
ELSE //cutscene not skipped
|
|
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(iLeadOutSceneID)
|
|
|
|
iStageProgress++
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
//if cutscene is skipped, fade out and remain cutscene on faded out screen
|
|
IF ( bCutsceneSkipped = FALSE )
|
|
IF WAS_CUTSCENE_SKIPPED()
|
|
SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, FALSE, FALSE)
|
|
bCutsceneSkipped = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 3
|
|
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(iLeadOutSceneID)
|
|
|
|
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM5_MCS5LO")
|
|
IF HAS_LABEL_BEEN_TRIGGERED("FAM5_MCS5LO_P")
|
|
//IF CREATE_CONVERSATION(Family5Conversation, "FAM5AUD", "FAM5_MCS5LO", CONV_PRIORITY_MEDIUM)
|
|
//IF PRELOAD_CONVERSATION(Family5Conversation, "FAM5AUD", "FAM5_MCS5LO", CONV_PRIORITY_MEDIUM)
|
|
BEGIN_PRELOADED_CONVERSATION()
|
|
SET_LABEL_AS_TRIGGERED("FAM5_MCS5LO", TRUE)
|
|
//ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT DOES_ENTITY_EXIST(osCup.ObjectIndex)
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(iLeadOutSceneID) > 0.09
|
|
IF HAS_MISSION_OBJECT_BEEN_CREATED(osCup)
|
|
IF DOES_ENTITY_EXIST(psDealer.PedIndex)
|
|
IF NOT IS_ENTITY_DEAD(psDealer.PedIndex)
|
|
ATTACH_ENTITY_TO_ENTITY(osCup.ObjectIndex, psDealer.PedIndex,
|
|
GET_PED_BONE_INDEX(psDealer.PedIndex, BONETAG_PH_R_HAND),
|
|
<< 0.0, 0.0, 0.0 >>, << 0.0, 0.0, 0.0 >>)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF ( bCupPassed = FALSE )
|
|
IF DOES_ENTITY_EXIST(osCup.ObjectIndex)
|
|
IF NOT IS_ENTITY_DEAD(osCup.ObjectIndex)
|
|
IF DOES_ENTITY_EXIST(psDealer.PedIndex)
|
|
IF NOT IS_ENTITY_DEAD(psDealer.PedIndex)
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(iLeadOutSceneID) > 0.285
|
|
DETACH_ENTITY(osCup.ObjectIndex, FALSE)
|
|
ATTACH_ENTITY_TO_ENTITY(osCup.ObjectIndex, psJimmy.PedIndex,
|
|
GET_PED_BONE_INDEX(psJimmy.PedIndex, BONETAG_PH_L_HAND),
|
|
<< 0.0, 0.0, 0.0 >>, << 0.0, 0.0, 0.0 >>)
|
|
bCupPassed = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(iLeadOutSceneID) > 0.575 //when Jimmy has entered the car, closed doors and is sitting in car
|
|
IF IS_VEHICLE_DRIVEABLE(vsMichaelsCar.VehicleIndex)
|
|
IF IS_ENTITY_PLAYING_ANIM(vsMichaelsCar.VehicleIndex, "missfam5leadinoutmcs_5", "leadout_car_door")
|
|
|
|
STOP_ENTITY_ANIM(vsMichaelsCar.VehicleIndex, "leadout_car_door", "missfam5leadinoutmcs_5", SLOW_BLEND_OUT)
|
|
SET_VEHICLE_DOORS_SHUT(vsMichaelsCar.VehicleIndex, TRUE)
|
|
|
|
CLEAR_PED_TASKS(psJimmy.PedIndex) //stop synched scene on Jimmy
|
|
SET_PED_INTO_VEHICLE(psJimmy.PedIndex, vsMichaelsCar.VehicleIndex, VS_FRONT_RIGHT) //play in car anim on Jimmy
|
|
TASK_PLAY_ANIM(psJimmy.PedIndex, "missfam5leadinoutmcs_5", "leadout_alt_jimmy", INSTANT_BLEND_IN, SLOW_BLEND_OUT, -1, AF_LOOPING | AF_HOLD_LAST_FRAME, GET_SYNCHRONIZED_SCENE_PHASE(iLeadOutSceneID))
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(psJimmy.PedIndex)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(iLeadOutSceneID) >= 1.0 //> 0.99
|
|
|
|
IF DOES_CAM_EXIST(ScriptedCamera)
|
|
IF IS_CAM_RENDERING(ScriptedCamera)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
DISPLAY_RADAR(TRUE)
|
|
RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
DESTROY_CAM(ScriptedCamera)
|
|
DESTROY_ALL_CAMS()
|
|
|
|
KILL_CHASE_HINT_CAM(sCinematicCamStruct)
|
|
|
|
IF DOES_ENTITY_EXIST(psDealer.PedIndex)
|
|
IF NOT IS_ENTITY_DEAD(psDealer.PedIndex)
|
|
SET_ENTITY_INVINCIBLE(psDealer.PedIndex, TRUE)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(psDealer.PedIndex, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(psJimmy.PedIndex)
|
|
IF NOT IS_ENTITY_DEAD(psJimmy.PedIndex)
|
|
CLEAR_PED_TASKS(PLAYER_PED_ID())
|
|
IF NOT IS_PED_IN_VEHICLE(psJimmy.PedIndex, vsMichaelsCar.VehicleIndex)
|
|
SET_PED_INTO_VEHICLE(psJimmy.PedIndex, vsMichaelsCar.VehicleIndex, VS_FRONT_RIGHT)
|
|
ENDIF
|
|
TASK_PLAY_ANIM(psJimmy.PedIndex, "missfam5_drink", "Drink_Michael&Jimmy_JimmyIdle", INSTANT_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(psJimmy.PedIndex)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
CLEAR_PED_TASKS(PLAYER_PED_ID())
|
|
ENDIF
|
|
|
|
iStageProgress++
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 4
|
|
|
|
IF IS_AUDIO_SCENE_ACTIVE("FAMILY_5_TAKE_JIMMY_FOCUS_CAM")
|
|
STOP_AUDIO_SCENE("FAMILY_5_TAKE_JIMMY_FOCUS_CAM")
|
|
ENDIF
|
|
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("FAMILY_5_TAKE_JIMMY")
|
|
START_AUDIO_SCENE("FAMILY_5_TAKE_JIMMY")
|
|
ENDIF
|
|
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(osCup.ModelName)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(osBSDoor.ModelName)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(osBSDoorDummy.ModelName)
|
|
|
|
REMOVE_ANIM_DICT("missfam5leadinoutmcs_5")
|
|
|
|
DISPLAY_RADAR(TRUE)
|
|
|
|
KILL_CHASE_HINT_CAM(sCinematicCamStruct)
|
|
|
|
IF IS_SCREEN_FADED_OUT()
|
|
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
|
|
ENDIF
|
|
|
|
iStageProgress++
|
|
|
|
BREAK
|
|
|
|
CASE 5
|
|
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
|
|
IF DOES_ENTITY_EXIST(psDealer.PedIndex)
|
|
DELETE_PED(psDealer.PedIndex)
|
|
ENDIF
|
|
|
|
REPLAY_STOP_EVENT()
|
|
|
|
RETURN TRUE
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
RETURN FALSE
|
|
|
|
ENDFUNC
|
|
|
|
PROC MANAGE_CONVERSATIONS_DURING_RIDE_HOME(INT &iProgress, INT &iTimer, STRING sRoot1, STRING sRoot2, STRING sRoot3)
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(vsMichaelsCar.VehicleIndex)
|
|
AND NOT IS_PED_INJURED(psJimmy.PedIndex)
|
|
AND NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
|
|
IF ( bConversationsFinished = FALSE ) //random conversations allowed
|
|
|
|
IF ( iProgress > 0 )
|
|
|
|
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, player is out of the car or wanted
|
|
|
|
|
|
IF IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
|
|
//don't pause the conversations when wanted
|
|
ELSE
|
|
//pause the conversations when not wanted
|
|
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
|
|
|
|
SWITCH iProgress
|
|
|
|
CASE 0
|
|
|
|
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vsMichaelsCar.VehicleIndex)
|
|
AND IS_PED_IN_VEHICLE(psJimmy.PedIndex, vsMichaelsCar.VehicleIndex)
|
|
|
|
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM5_SON6")
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
IF CREATE_CONVERSATION(Family5Conversation, "FAM5AUD", "FAM5_SON6", CONV_PRIORITY_MEDIUM)
|
|
SET_LABEL_AS_TRIGGERED("FAM5_SON6", TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
IF HAS_LABEL_BEEN_TRIGGERED(sLabelOBJ) //check if objective label has been printed or triggered
|
|
OR IS_STRING_NULL_OR_EMPTY(sLabelOBJ)
|
|
iTimer = GET_GAME_TIMER()
|
|
iProgress++
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 1
|
|
|
|
IF NOT IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-1184.633423,-874.228088,17.855732>>, <<-1168.236450,-901.460083,7.064990>>, 35.0)
|
|
|
|
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vsMichaelsCar.VehicleIndex)
|
|
AND IS_PED_IN_VEHICLE(psJimmy.PedIndex, vsMichaelsCar.VehicleIndex)
|
|
|
|
IF NOT HAS_LABEL_BEEN_TRIGGERED(sRoot1)
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
IF CREATE_CONVERSATION(Family5Conversation, "FAM5AUD", sRoot1, CONV_PRIORITY_MEDIUM)
|
|
SET_LABEL_AS_TRIGGERED(sRoot1, TRUE)
|
|
iProgress++
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM5_DRIVEJ")
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData)
|
|
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vsMichaelsCar.VehicleIndex)
|
|
AND IS_PED_IN_VEHICLE(psJimmy.PedIndex, vsMichaelsCar.VehicleIndex)
|
|
IF HAS_TIME_PASSED(15000, iTimer)
|
|
IF CREATE_CONVERSATION(Family5Conversation, "FAM5AUD", "FAM5_DRIVEJ", CONV_PRIORITY_MEDIUM)
|
|
iDriveReminders++
|
|
iTimer = GET_GAME_TIMER()
|
|
|
|
IF ( iDriveReminders = 2 )
|
|
SET_LABEL_AS_TRIGGERED("FAM5_DRIVEJ", TRUE)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 2
|
|
|
|
IF ( bPreDrinkConversationFinished = FALSE ) //check if a different conversation
|
|
IF HAS_LABEL_BEEN_TRIGGERED(sRoot1) //is ongoing or queued
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
bPreDrinkConversationFinished = TRUE
|
|
ENDIF
|
|
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() //after Root2 was triggered
|
|
TEXT_LABEL txtRoot
|
|
txtRoot = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_ROOT()
|
|
IF NOT ARE_STRINGS_EQUAL(sRoot1, txtRoot) //that means Root2 was finished
|
|
bPreDrinkConversationFinished = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
|
|
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vsMichaelsCar.VehicleIndex)
|
|
AND IS_PED_IN_VEHICLE(psJimmy.PedIndex, vsMichaelsCar.VehicleIndex)
|
|
|
|
IF ( bDrinkAnimationFinished = TRUE )
|
|
|
|
IF NOT HAS_LABEL_BEEN_TRIGGERED(sRoot2)
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
IF CREATE_CONVERSATION(Family5Conversation, "FAM5AUD", sRoot2, CONV_PRIORITY_MEDIUM)
|
|
SET_LABEL_AS_TRIGGERED(sRoot2, TRUE)
|
|
|
|
iTimer = GET_GAME_TIMER()
|
|
|
|
iProgress++
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 3
|
|
|
|
IF ( bPostDrinkConversationFinished = FALSE ) //check if a different conversation
|
|
IF HAS_LABEL_BEEN_TRIGGERED(sRoot2) //is ongoing or queued
|
|
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() //after Root2 was triggered
|
|
TEXT_LABEL txtRoot
|
|
txtRoot = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_ROOT()
|
|
IF NOT ARE_STRINGS_EQUAL(sRoot2, txtRoot) //that means Root2 was finished
|
|
bPostDrinkConversationFinished = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vsMichaelsCar.VehicleIndex)
|
|
AND IS_PED_IN_VEHICLE(psJimmy.PedIndex, vsMichaelsCar.VehicleIndex)
|
|
|
|
IF HAS_TIME_PASSED(6000, iTimer)
|
|
|
|
IF NOT HAS_LABEL_BEEN_TRIGGERED(sRoot3)
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
IF CREATE_CONVERSATION(Family5Conversation, "FAM5AUD", sRoot3, CONV_PRIORITY_MEDIUM)
|
|
SET_LABEL_AS_TRIGGERED(sRoot3, TRUE)
|
|
iTimer = 0
|
|
iProgress++
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 4 //random lines and kick out of car conversations
|
|
|
|
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vsMichaelsCar.VehicleIndex)
|
|
AND IS_PED_IN_VEHICLE(psJimmy.PedIndex, vsMichaelsCar.VehicleIndex)
|
|
|
|
IF GET_GAME_TIMER() - iTimer > 0
|
|
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
|
|
SWITCH GET_RANDOM_INT_IN_RANGE(0, 2)
|
|
|
|
CASE 0
|
|
|
|
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM5_DRUNKM")
|
|
IF CREATE_CONVERSATION(Family5Conversation, "FAM5AUD", "FAM5_DRUNKM", CONV_PRIORITY_MEDIUM)
|
|
|
|
iMichaelDrunkConversationCounter++
|
|
iTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(6000, 10000)
|
|
|
|
IF ( iMichaelDrunkConversationCounter >= 9 )
|
|
SET_LABEL_AS_TRIGGERED("FAM5_DRUNKM", TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 1
|
|
|
|
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM5_DRUNKJ")
|
|
IF CREATE_CONVERSATION(Family5Conversation, "FAM5AUD", "FAM5_DRUNKJ", CONV_PRIORITY_MEDIUM)
|
|
|
|
iJimmyDrunkConversationCounter++
|
|
iTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(6000, 10000)
|
|
|
|
IF ( iJimmyDrunkConversationCounter >= 3 )
|
|
SET_LABEL_AS_TRIGGERED("FAM5_DRUNKJ", TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
ELSE //random conversations not allowed, kick out of car scene has started
|
|
|
|
//play stop conversation
|
|
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM5_DSTOP")
|
|
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
IF IS_FACE_TO_FACE_CONVERSATION_PAUSED()
|
|
PAUSE_FACE_TO_FACE_CONVERSATION(FALSE)
|
|
ENDIF
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
ENDIF
|
|
IF CREATE_CONVERSATION(Family5Conversation, "FAM5AUD", "FAM5_DSTOP", CONV_PRIORITY_MEDIUM)
|
|
SET_LABEL_AS_TRIGGERED("FAM5_DSTOP", TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM5_CAR")
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(iKickOutSceneID)
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData)
|
|
IF CREATE_CONVERSATION(Family5Conversation, "FAM5AUD", "FAM5_CAR", CONV_PRIORITY_MEDIUM)
|
|
SET_LABEL_AS_TRIGGERED("FAM5_CAR", TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC MANAGE_ANIMATIONS_AND_SFX_DURING_RIDE_HOME(INT &iProgress, STRING sRoot1, STRING sRoot2)
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
IF IS_ENTITY_PLAYING_ANIM(PLAYER_PED_ID(), "missfam5_drink", "Drink_Michael&Jimmy_Plyer0")
|
|
DISABLE_CELLPHONE_THIS_FRAME_ONLY()
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_AIM)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_EXIT)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ATTACK)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ATTACK2)
|
|
IF NOT IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
CLEAR_PED_SECONDARY_TASK(PLAYER_PED_ID())
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SWITCH iProgress
|
|
|
|
CASE 0 //play Jimmy's idle in car animation
|
|
|
|
IF NOT IS_PED_INJURED(psJimmy.PedIndex)
|
|
IF NOT IS_ENTITY_PLAYING_ANIM(psJimmy.PedIndex, "missfam5_drink", "Drink_Michael&Jimmy_JimmyIdle")
|
|
TASK_PLAY_ANIM(psJimmy.PedIndex, "missfam5_drink", "Drink_Michael&Jimmy_JimmyIdle", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING)
|
|
ENDIF
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(psJimmy.PedIndex, TRUE)
|
|
ENDIF
|
|
|
|
//start loading the drink sfx
|
|
LOAD_MISSION_SFX(MISSION_SFX_DRINK)
|
|
|
|
iProgress++
|
|
|
|
BREAK
|
|
|
|
CASE 1 //play Jimmy's and Michael's in car drink pass animation
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(vsMichaelsCar.VehicleIndex)
|
|
AND NOT IS_PED_INJURED(psJimmy.PedIndex)
|
|
AND NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
|
|
//start the anim after "You want a drink?" conversation has been started
|
|
IF HAS_LABEL_BEEN_TRIGGERED(sRoot1)
|
|
|
|
IF ( IS_THIS_CONVERSATION_PLAYING(sRoot1) AND GET_CURRENT_SCRIPTED_CONVERSATION_LINE() >= 5 )
|
|
OR ( bPreDrinkConversationFinished = TRUE )
|
|
|
|
IF IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), vsMichaelsCar.VehicleIndex)
|
|
AND IS_PED_SITTING_IN_VEHICLE(psJimmy.PedIndex, vsMichaelsCar.VehicleIndex)
|
|
|
|
DISABLE_CELLPHONE_THIS_FRAME_ONLY()
|
|
|
|
SET_VEHICLE_DOORS_SHUT(vsMichaelsCar.VehicleIndex, FALSE)
|
|
SET_VEHICLE_DOORS_LOCKED(vsMichaelsCar.VehicleIndex, VEHICLELOCK_LOCKED_PLAYER_INSIDE)
|
|
|
|
TASK_PLAY_ANIM(psJimmy.PedIndex, "missfam5_drink", "Drink_Michael&Jimmy_Jimmy")
|
|
TASK_PLAY_ANIM(PLAYER_PED_ID(), "missfam5_drink", "Drink_Michael&Jimmy_Plyer0", NORMAL_BLEND_IN, SLOW_BLEND_OUT, -1, AF_SECONDARY | AF_UPPERBODY)
|
|
|
|
|
|
|
|
iProgress++
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 2
|
|
|
|
//Play drink sfx
|
|
|
|
IF IS_ENTITY_PLAYING_ANIM(PLAYER_PED_ID(), "missfam5_drink", "Drink_Michael&Jimmy_Plyer0")
|
|
IF GET_ENTITY_ANIM_CURRENT_TIME(PLAYER_PED_ID(), "missfam5_drink", "Drink_Michael&Jimmy_Plyer0") > 0.389
|
|
OR HAS_ANIM_EVENT_FIRED(PLAYER_PED_ID(), GET_HASH_KEY("Drink_Sfx"))
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Drink_Sfx animation event fired.")
|
|
#ENDIF
|
|
|
|
PLAY_MISSION_SFX(MISSION_SFX_DRINK)
|
|
ANIMPOSTFX_PLAY("DrugsDrivingIn", 0, FALSE)
|
|
|
|
iProgress++
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 3
|
|
|
|
IF IS_ENTITY_PLAYING_ANIM(PLAYER_PED_ID(), "missfam5_drink", "Drink_Michael&Jimmy_Plyer0")
|
|
|
|
IF GET_ENTITY_ANIM_CURRENT_TIME(PLAYER_PED_ID(), "missfam5_drink", "Drink_Michael&Jimmy_Plyer0") > 0.703
|
|
OR HAS_ANIM_EVENT_FIRED(PLAYER_PED_ID(), GET_HASH_KEY("Interrupt"))
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Interrupt animation event fired.")
|
|
#ENDIF
|
|
|
|
bDrinkAnimationFinished = TRUE
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(vsMichaelsCar.VehicleIndex)
|
|
AND NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
AND NOT IS_PED_INJURED(psJimmy.PedIndex)
|
|
AND IS_PED_IN_VEHICLE(psJimmy.PedIndex, vsMichaelsCar.VehicleIndex)
|
|
AND IS_PED_IN_VEHICLE(PLAYER_PED_ID(),vsMichaelsCar.VehicleIndex)
|
|
|
|
STOP_ANIM_PLAYBACK(PLAYER_PED_ID(), AF_PRIORITY_HIGH, TRUE)
|
|
CLEAR_PED_SECONDARY_TASK(PLAYER_PED_ID())
|
|
|
|
STOP_ANIM_PLAYBACK(psJimmy.PedIndex)
|
|
|
|
TASK_PLAY_ANIM(psJimmy.PedIndex, "missfam5_drink", "Drink_Michael&Jimmy_JimmyIdle", INSTANT_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING)
|
|
|
|
SET_VEHICLE_DOORS_LOCKED(vsMichaelsCar.VehicleIndex, VEHICLELOCK_UNLOCKED)
|
|
|
|
iProgress++
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 4
|
|
|
|
IF HAS_LABEL_BEEN_TRIGGERED(sRoot2)
|
|
|
|
IF ( IS_THIS_CONVERSATION_PLAYING(sRoot2) AND( GET_CURRENT_SCRIPTED_CONVERSATION_LINE() >= 4 ) )
|
|
OR ( bPostDrinkConversationFinished = TRUE )
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
MAKE_PED_DRUNK_CONSTANT(PLAYER_PED_ID())
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Making player ped drunk constant.")
|
|
#ENDIF
|
|
ENDIF
|
|
|
|
DISABLE_CELLPHONE(TRUE)
|
|
|
|
PLAY_MISSION_SFX(MISSION_SFX_HEARTBEAT)
|
|
|
|
STOP_AUDIO_SCENE("FAMILY_5_TAKE_JIMMY")
|
|
|
|
START_AUDIO_SCENE("FAMILY_5_YOGA_ON_DRUGS")
|
|
|
|
START_AUDIO_SCENE("FAMILY_5_DRUGS")
|
|
|
|
SET_ALL_SHOPS_TEMPORARILY_UNAVAILABLE(TRUE) //block all shops when drunk
|
|
|
|
SET_MISSION_FLOW_FLAG_STATE(FLOWFLAG_MOVIE_STUDIO_OPEN, FALSE)
|
|
|
|
iKickOutDelayTimer = GET_GAME_TIMER()
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Starting iKickOutDelayTimer.")
|
|
#ENDIF
|
|
|
|
REPLAY_RECORD_BACK_FOR_TIME(4.0, 12.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
iProgress++
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
ENDPROC
|
|
|
|
PROC UPDATE_DRUNK_CAMERA(FLOAT fStartShake = 0.0, FLOAT fStartBlur = 0.0, INT iTimeDelay = 3000, FLOAT fMaxShake = 3.0, FLOAT fMaxBlur = 3.0)
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
|
|
IF Is_Ped_Drunk(PLAYER_PED_ID())
|
|
|
|
IF NOT IS_GAMEPLAY_CAM_SHAKING()
|
|
|
|
fDrunkCameraShake = fStartShake
|
|
fDrunkCameraBlur = fStartBlur
|
|
|
|
Activate_Drunk_Camera_Constant(DRUNK_DEFAULT_TIMEOUT_msec, fDrunkCameraShake, fDrunkCameraBlur)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Activating drunk camera with amplitude equal ", fDrunkCameraShake, " and blur equal ", fDrunkCameraBlur, ".")
|
|
#ENDIF
|
|
|
|
SETTIMERA(0)
|
|
|
|
ELSE
|
|
|
|
fDrunkCameraShake = CLAMP(fDrunkCameraShake +@0.1, fStartShake, fMaxShake)
|
|
fDrunkCameraBlur = CLAMP(fDrunkCameraBlur +@0.12, fStartBlur, fMaxBlur)
|
|
|
|
IF (( fDrunkCameraShake < fMaxShake ) OR ( fDrunkCameraBlur < fMaxBlur))
|
|
AND ( TIMERA() > iTimeDelay )
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting drunk camera shake to ", fDrunkCameraShake, " and blur to ", fDrunkCameraBlur, ".")
|
|
#ENDIF
|
|
|
|
Update_Drunk_Camera_ParamDesiredAmplitude(fDrunkCameraShake)
|
|
Update_Drunk_Camera_ParamStrength(fDrunkCameraBlur)
|
|
|
|
SETTIMERA(0)
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC RUN_VEHICLE_AND_CAMERA_CHECK()
|
|
|
|
IF DOES_CAM_EXIST(ScriptedCamera)
|
|
IF IS_CAM_RENDERING(ScriptedCamera)
|
|
IF IS_VEHICLE_DRIVEABLE(vsMichaelsCar.VehicleIndex) AND NOT IS_PED_INJURED(psJimmy.PedIndex)
|
|
IF NOT IS_ENTITY_PLAYING_ANIM(psJimmy.PedIndex, "missfam5mcs_6", "push_michael_out_jimmy")
|
|
AND NOT IS_ENTITY_PLAYING_ANIM(vsMichaelsCar.VehicleIndex, "missfam5mcs_6", "Push_Michael_Out_Car")
|
|
|
|
IF IS_POINT_IN_ANGLED_AREA(GET_CAM_COORD(ScriptedCamera), GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(vsMichaelsCar.VehicleIndex, << 0.0, 2.65, -0.65>>),
|
|
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(vsMichaelsCar.VehicleIndex, << 0.0, -2.65, 1.0>>), 2.25)
|
|
|
|
IF IS_ENTITY_VISIBLE(vsMichaelsCar.VehicleIndex)
|
|
|
|
SET_ENTITY_VISIBLE(vsMichaelsCar.VehicleIndex, FALSE)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Scripted camera inside angled area around michael's car. Setting michael's car invisible")
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
IF NOT IS_ENTITY_VISIBLE(vsMichaelsCar.VehicleIndex)
|
|
|
|
SET_ENTITY_VISIBLE(vsMichaelsCar.VehicleIndex, TRUE)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Scripted camera inside angled area around michael's car. Setting michael's car visible")
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
FUNC BOOL IS_MISSION_STAGE_DRIVE_HOME_COMPLETED(INT &iStageProgress)
|
|
|
|
SET_BIT(sLocatesData.iLocatesBitSet, BS_DONT_DO_J_SKIP)
|
|
SET_BIT(sLocatesData.iLocatesBitSet, BS_HAS_BEEN_IN_VEHICLE)
|
|
SET_BIT(sLocatesData.iLocatesBitSet, BS_PRINTED_GET_IN_VEHICLE)
|
|
|
|
IF IS_PLAYER_PLAYING(PLAYER_ID())
|
|
SET_ALL_RANDOM_PEDS_FLEE_THIS_FRAME(PLAYER_ID())
|
|
ENDIF
|
|
|
|
MANAGE_ANIMATIONS_AND_SFX_DURING_RIDE_HOME(psJimmy.iProgress, PICK_STRING(bStageReplayInProgress, "FAM5_SON7b", "FAM5_SON7"),
|
|
PICK_STRING(bStageReplayInProgress, "FAM5_SON8b", "FAM5_SON8"))
|
|
MANAGE_CONVERSATIONS_DURING_RIDE_HOME(iConversationProgress, psJimmy.iPedConversationTimer,
|
|
PICK_STRING(bStageReplayInProgress, "FAM5_SON7b", "FAM5_SON7"),
|
|
PICK_STRING(bStageReplayInProgress, "FAM5_SON8b", "FAM5_SON8"),
|
|
PICK_STRING(bStageReplayInProgress, "FAM5_SON9b", "FAM5_SON9"))
|
|
|
|
UPDATE_DRUNK_CAMERA(0.5, 1.0, 2500, 2.0, 2.0)
|
|
UPDATE_TRIGGERED_LABEL(sLabelOBJ)
|
|
|
|
BOOL bTimePassed
|
|
|
|
IF DOES_ENTITY_EXIST(osBSDoorDummy.ObjectIndex)
|
|
IF NOT IS_ENTITY_DEAD(osBSDoorDummy.ObjectIndex)
|
|
IF GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), osBSDoorDummy.ObjectIndex) > 15.0
|
|
IF NOT IS_ENTITY_ON_SCREEN(osBSDoorDummy.ObjectIndex)
|
|
DELETE_OBJECT(osBSDoorDummy.ObjectIndex)
|
|
REMOVE_MODEL_HIDE(osBSDoor.vPosition, 1.0, osBSDoor.ModelName)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(vsMichaelsCar.VehicleIndex)
|
|
AND NOT IS_PED_INJURED(psJimmy.PedIndex)
|
|
AND NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
|
|
SWITCH iStageProgress
|
|
|
|
CASE 0
|
|
|
|
sLabelOBJ = "FAM5_GT4"
|
|
|
|
IF HAS_LABEL_BEEN_TRIGGERED("FAM5_SON6")
|
|
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
IF ( GET_CURRENT_SCRIPTED_CONVERSATION_LINE() >= 2 )
|
|
iStageProgress++
|
|
ENDIF
|
|
ELSE
|
|
iStageProgress++
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 1
|
|
|
|
REQUEST_ANIM_DICT("missfam5mcs_6")
|
|
|
|
//display the loctates header objective text and blip
|
|
IS_PLAYER_AT_LOCATION_WITH_BUDDY_IN_VEHICLE(sLocatesData, vMichaelsHouseCoords, g_vAnyMeansLocate , FALSE, psJimmy.PedIndex, vsMichaelsCar.VehicleIndex, sLabelOBJ, "CMN_JLEAVE", sLabelMGETIN, "CMN_GENGETBCKY", FALSE, TRUE)
|
|
|
|
IF ( iKickOutDelayTimer <> 0 )
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
DRAW_DEBUG_TEXT_ABOVE_ENTITY(vsMichaelsCar.VehicleIndex, GET_STRING_FROM_INT(CLAMP_INT(iKickOutDelayTime - ( GET_GAME_TIMER() - iKickOutDelayTimer ), 0, iKickOutDelayTime)), 2.25, 0, 255, 0)
|
|
#ENDIF
|
|
|
|
IF HAS_TIME_PASSED(iKickOutDelayTime, iKickOutDelayTimer)
|
|
bTimePassed = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF ARE_PEDS_IN_VEHICLE_AT_SAFE_POSITION_FOR_INGAME_CUTSCENE(PLAYER_PED_ID(), psJimmy.PedIndex, vsMichaelsCar.VehicleIndex)
|
|
IF ( GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), vMichaelsHouseCoords) < fKickAnimationTriggerDistance )
|
|
OR ( bTimePassed = TRUE )
|
|
|
|
bConversationsFinished = TRUE
|
|
|
|
IF IS_PLAYER_PLAYING(PLAYER_ID())
|
|
IF IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
|
|
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
|
|
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
|
|
ENDIF
|
|
ENDIF
|
|
|
|
CLEAR_MISSION_LOCATION_TEXT_AND_BLIPS(sLocatesData)
|
|
|
|
RELEASE_MISSION_SFX_AUDIO_BANK(MISSION_SFX_DRINK)
|
|
|
|
iStageProgress++
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 2
|
|
|
|
REQUEST_ANIM_DICT("missfam5mcs_6")
|
|
|
|
SET_IN_VEHICLE_CAM_STATE_THIS_UPDATE(vsMichaelsCar.VehicleIndex, CAM_INSIDE_VEHICLE)
|
|
|
|
IF HAS_ANIM_DICT_LOADED("missfam5mcs_6")
|
|
|
|
IF IS_VEHICLE_ON_ALL_WHEELS(vsMichaelsCar.VehicleIndex)
|
|
IF BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(vsMichaelsCar.VehicleIndex, 5.0)
|
|
|
|
IF IS_VEHICLE_ON_ALL_WHEELS(vsMichaelsCar.VehicleIndex)
|
|
AND NOT IS_ENTITY_ON_FIRE(vsMichaelsCar.VehicleIndex)
|
|
|
|
INT iTotalLanes
|
|
FLOAT fHeading
|
|
FLOAT fVehicleHeading
|
|
VECTOR vVehiclePosition
|
|
VECTOR vClosestNodeToVehicle
|
|
|
|
vVehiclePosition = GET_ENTITY_COORDS(vsMichaelsCar.VehicleIndex)
|
|
fVehicleHeading = GET_ENTITY_HEADING(vsMichaelsCar.VehicleIndex)
|
|
|
|
IF GET_NTH_CLOSEST_VEHICLE_NODE_WITH_HEADING(vVehiclePosition, 1, vClosestNodeToVehicle, fHeading, iTotalLanes, NF_NONE)
|
|
|
|
SET_ENTITY_COORDS(vsMichaelsCar.VehicleIndex, vClosestNodeToVehicle)
|
|
SET_ENTITY_HEADING(vsMichaelsCar.VehicleIndex, fVehicleHeading)
|
|
SET_VEHICLE_ON_GROUND_PROPERLY(vsMichaelsCar.VehicleIndex)
|
|
|
|
ENDIF
|
|
|
|
CLEAR_AREA_OF_OBJECTS(GET_ENTITY_COORDS(vsMichaelsCar.VehicleIndex), 2.0)
|
|
CLEAR_AREA_OF_VEHICLES(GET_ENTITY_COORDS(vsMichaelsCar.VehicleIndex), 4.0)
|
|
CLEAR_AREA_OF_PROJECTILES(GET_ENTITY_COORDS(vsMichaelsCar.VehicleIndex), 3.0)
|
|
|
|
//remove cars behind michael's car in case any cars don't manage to stop in time and drive into the scene
|
|
CLEAR_AREA_OF_VEHICLES(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(vsMichaelsCar.VehicleIndex, <<0.00000, -4.000, 0.1689>>), 3.5)
|
|
|
|
iSpeedZone = ADD_ROAD_NODE_SPEED_ZONE(GET_ENTITY_COORDS(vsMichaelsCar.VehicleIndex), 15.0, 0.0)
|
|
|
|
IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iKickOutSceneID)
|
|
|
|
iKickOutSceneID = CREATE_SYNCHRONIZED_SCENE(<< 0.0, 0.0,0.0>>, << 0.0, 0.0,0.0>>)
|
|
|
|
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(iKickOutSceneID, vsMichaelsCar.VehicleIndex, 0)
|
|
|
|
DESTROY_ALL_CAMS()
|
|
ScriptedCamera = CREATE_CAMERA(CAMTYPE_ANIMATED, TRUE)
|
|
PLAY_SYNCHRONIZED_CAM_ANIM(ScriptedCamera, iKickOutSceneID, "Push_Michael_Out_Cam", "missfam5mcs_6")
|
|
|
|
DISPLAY_HUD(FALSE)
|
|
DISPLAY_RADAR(FALSE)
|
|
RENDER_SCRIPT_CAMS(TRUE, FALSE)
|
|
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(vsMichaelsCar.VehicleIndex, iKickOutSceneID, "Push_Michael_Out_Car", "missfam5mcs_6", INSTANT_BLEND_IN, INSTANT_BLEND_OUT)
|
|
SET_ENTITY_COLLISION(vsMichaelsCar.VehicleIndex, FALSE)
|
|
|
|
CLEAR_PED_TASKS_IMMEDIATELY(psJimmy.PedIndex)
|
|
TASK_SYNCHRONIZED_SCENE(psJimmy.PedIndex, iKickOutSceneID, "missfam5mcs_6", "push_michael_out_jimmy", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT, RBF_EXPLOSION)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(psJimmy.PedIndex)
|
|
SET_RAGDOLL_BLOCKING_FLAGS(psJimmy.PedIndex, RBF_EXPLOSION)
|
|
|
|
IF DOES_ENTITY_EXIST(osCup.ObjectIndex)
|
|
IF NOT IS_ENTITY_DEAD(osCup.ObjectIndex)
|
|
IF IS_ENTITY_ATTACHED(osCup.ObjectIndex)
|
|
DETACH_ENTITY(osCup.ObjectIndex, FALSE, TRUE)
|
|
ENDIF
|
|
ATTACH_ENTITY_TO_ENTITY(osCup.ObjectIndex, psJimmy.PedIndex, GET_PED_BONE_INDEX(psJimmy.PedIndex, BONETAG_PH_R_HAND), << 0.0, 0.0, 0.0 >>, << 0.0, 0.0, 0.0 >>)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
MAKE_PED_SOBER(PLAYER_PED_ID())
|
|
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
|
|
TASK_SYNCHRONIZED_SCENE(PLAYER_PED_ID(), iKickOutSceneID, "missfam5mcs_6", "push_michael_out_player0",
|
|
INSTANT_BLEND_IN, INSTANT_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS | SYNCED_SCENE_DONT_INTERRUPT, RBF_EXPLOSION, INSTANT_BLEND_IN, AIK_DISABLE_LEG_IK)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID())
|
|
SET_RAGDOLL_BLOCKING_FLAGS(PLAYER_PED_ID(), RBF_EXPLOSION)
|
|
|
|
psJimmy.bHasTask = FALSE
|
|
bAnimationForced = FALSE
|
|
bAnimationsSwitched = FALSE
|
|
bPlayerRagdolledEarly = FALSE
|
|
bCleanupVehiclesForCamera = FALSE
|
|
bCleanupVehiclesForCameraAgain = FALSE
|
|
|
|
SET_AUDIO_FLAG("DisableAbortConversationForRagdoll", TRUE)
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_LEAVE_CAMERA_CONTROL_ON)
|
|
|
|
//Activate multihead blinders
|
|
SET_MULTIHEAD_SAFE(TRUE,FALSE)
|
|
|
|
iStageProgress++
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 3
|
|
|
|
RUN_VEHICLE_AND_CAMERA_CHECK()
|
|
|
|
REQUEST_ANIM_DICT("missfam5mcs_6drag")
|
|
|
|
IF NOT IS_PED_INJURED(psJimmy.PedIndex)
|
|
SET_PED_RESET_FLAG(psJimmy.PedIndex, PRF_ForceInstantSteeringWheelIkBlendIn, TRUE)
|
|
ENDIF
|
|
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(iKickOutSceneID)
|
|
|
|
DISABLE_CINEMATIC_BONNET_CAMERA_THIS_UPDATE()
|
|
DISABLE_CINEMATIC_VEHICLE_IDLE_MODE_THIS_UPDATE()
|
|
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(iKickOutSceneID) <= 0.630
|
|
SET_IN_VEHICLE_CAM_STATE_THIS_UPDATE(vsMichaelsCar.VehicleIndex, CAM_INSIDE_VEHICLE)
|
|
ENDIF
|
|
|
|
SET_VEHICLE_WILL_FORCE_OTHER_VEHICLES_TO_STOP(vsMichaelsCar.VehicleIndex, TRUE)
|
|
|
|
IF HAS_ANIM_EVENT_FIRED(psJimmy.PedIndex, GET_HASH_KEY("Detach"))
|
|
IF DOES_ENTITY_EXIST(osCup.ObjectIndex)
|
|
IF NOT IS_ENTITY_DEAD(osCup.ObjectIndex)
|
|
IF IS_ENTITY_ATTACHED(osCup.ObjectIndex)
|
|
DETACH_ENTITY(osCup.ObjectIndex, FALSE, TRUE)
|
|
ENDIF
|
|
DELETE_OBJECT(osCup.ObjectIndex)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_CAM_EXIST(ScriptedCamera)
|
|
|
|
IF NOT IS_CAM_RENDERING(ScriptedCamera)
|
|
DISPLAY_HUD(FALSE)
|
|
DISPLAY_RADAR(FALSE)
|
|
RENDER_SCRIPT_CAMS(TRUE, FALSE)
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("FAMILY_5_DRUGS_FOCUS_CAM")
|
|
STOP_AUDIO_SCENE("FAMILY_5_DRUGS")
|
|
START_AUDIO_SCENE("FAMILY_5_DRUGS_FOCUS_CAM")
|
|
ENDIF
|
|
ELSE
|
|
|
|
IF ( bCleanupVehiclesForCamera = FALSE )//cleanup vehicles near the camera and michael's animation positions
|
|
CLEANUP_VEHICLE_WITH_PEDS_NEAR_POINT(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(vsMichaelsCar.VehicleIndex, <<-0.7309, 2.7140, 0.4813>>), 3.0)
|
|
CLEANUP_VEHICLE_WITH_PEDS_NEAR_POINT(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(vsMichaelsCar.VehicleIndex, <<-3.6668, 0.1784, 0.4859>>), 3.0)
|
|
CLEANUP_VEHICLE_WITH_PEDS_NEAR_POINT(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(vsMichaelsCar.VehicleIndex, <<-2.1213, 0.5363, 0.4975>>), 3.0)
|
|
CLEANUP_VEHICLE_WITH_PEDS_NEAR_POINT(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(vsMichaelsCar.VehicleIndex, <<-1.4263, 1.9211, 4.8319>>), 3.0)
|
|
CLEANUP_VEHICLE_WITH_PEDS_NEAR_POINT(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(vsMichaelsCar.VehicleIndex, <<-3.342, -0.523, -0.1449>>), 3.0)
|
|
CLEANUP_VEHICLE_WITH_PEDS_NEAR_POINT(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(vsMichaelsCar.VehicleIndex, <<0.0000, 4.5000, 0.25000>>), 3.0)
|
|
CLEANUP_VEHICLE_WITH_PEDS_NEAR_POINT(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(vsMichaelsCar.VehicleIndex, <<-2.0859, 4.1187, 0.1689>>), 3.0)
|
|
CLEANUP_VEHICLE_WITH_PEDS_NEAR_POINT(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(vsMichaelsCar.VehicleIndex, <<0.00000, -4.250, 0.1689>>), 3.0)
|
|
bCleanupVehiclesForCamera = TRUE
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(iKickOutSceneID) > 0.75
|
|
|
|
IF ( psJimmy.bHasTask = FALSE )
|
|
|
|
KILL_CHASE_HINT_CAM(sCinematicCamStruct)
|
|
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(vsMichaelsCar.VehicleIndex, INSTANT_BLEND_OUT, TRUE)
|
|
SET_ENTITY_COLLISION(vsMichaelsCar.VehicleIndex, TRUE)
|
|
|
|
CLEAR_PED_TASKS(psJimmy.PedIndex)
|
|
SET_PED_INTO_VEHICLE(psJimmy.PedIndex, vsMichaelsCar.VehicleIndex, VS_DRIVER)
|
|
TASK_VEHICLE_MISSION_PED_TARGET(psJimmy.PedIndex, vsMichaelsCar.VehicleIndex, PLAYER_PED_ID(), MISSION_FLEE, 25.0, DRIVINGMODE_AVOIDCARS_RECKLESS | DF_SteerAroundPeds , 25.0, 2.0)
|
|
psJimmy.iTimer = GET_GAME_TIMER()
|
|
|
|
FailFlags[MISSION_FAIL_JIMMY_LEFT_BEHIND] = FALSE
|
|
FailFlags[MISSION_FAIL_MICHAELS_CAR_DEAD] = FALSE
|
|
FailFlags[MISSION_FAIL_MICHAELS_CAR_UNDRIVEABLE] = FALSE
|
|
|
|
psJimmy.bHasTask = TRUE
|
|
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
//trigger another vehicle cleanup around the car
|
|
IF bCleanupVehiclesForCameraAgain = FALSE
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(iKickOutSceneID) >= 0.350
|
|
bCleanupVehiclesForCamera = FALSE
|
|
bCleanupVehiclesForCameraAgain = TRUE
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting flag bCleanupVehiclesForCamera to FALSE for another vehicle cleanup to run.")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF ( bAnimationsSwitched = FALSE )
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(iKickOutSceneID)
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(iKickOutSceneID) > 0.6275
|
|
DETACH_SYNCHRONIZED_SCENE(iKickOutSceneID)
|
|
SET_SYNCHRONIZED_SCENE_ORIGIN(iKickOutSceneID, GET_ENTITY_COORDS(vsMichaelsCar.VehicleIndex), GET_ENTITY_ROTATION(vsMichaelsCar.VehicleIndex))
|
|
CLEAR_PED_TASKS(PLAYER_PED_ID())
|
|
TASK_PLAY_ANIM(PLAYER_PED_ID(), "missfam5mcs_6", "push_michael_out_player0", INSTANT_BLEND_IN, SLOW_BLEND_OUT, -1, AF_ACTIVATE_RAGDOLL_ON_COLLISION, GET_SYNCHRONIZED_SCENE_PHASE(iKickOutSceneID), FALSE, AIK_DISABLE_LEG_IK)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID())
|
|
REPLAY_RECORD_BACK_FOR_TIME(10.0, 5.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
bAnimationsSwitched = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF ( bAnimationForced = FALSE )
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(iKickOutSceneID)
|
|
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(iKickOutSceneID) >= fAnimationForcePhase
|
|
|
|
IF ( bPlayerRagdolledEarly = TRUE )
|
|
|
|
TASK_SYNCHRONIZED_SCENE(PLAYER_PED_ID(), iKickOutSceneID, "missfam5mcs_6", "push_michael_out_player0",
|
|
INSTANT_BLEND_IN, SLOW_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT, RBF_VEHICLE_IMPACT)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID())
|
|
|
|
CLEAR_AREA_OF_VEHICLES(GET_ENTITY_COORDS(PLAYER_PED_ID()), 1.0)
|
|
REPLAY_RECORD_BACK_FOR_TIME(10.0, 5.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
bAnimationForced = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF ( bPlayerRagdolledEarly = FALSE )
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(iKickOutSceneID)
|
|
IF IS_PED_RAGDOLL(PLAYER_PED_ID())
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Player ped is ragdolling out of the synched scene early.")
|
|
#ENDIF
|
|
SET_PED_TO_RAGDOLL(PLAYER_PED_ID(), 10000, 10000, TASK_RELAX)
|
|
bPlayerRagdolledEarly = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_PED_GETTING_UP(PLAYER_PED_ID())
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Making player ped ragdoll as player ped was getting up.")
|
|
#ENDIF
|
|
SET_PED_TO_RAGDOLL(PLAYER_PED_ID(), 20000, 20000, TASK_RELAX)
|
|
ENDIF
|
|
|
|
IF ( bPlayerRagdolledEarly = FALSE )
|
|
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(iKickOutSceneID)
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(iKickOutSceneID) > 0.99
|
|
IF IS_PED_RAGDOLL(PLAYER_PED_ID())
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Kick out of car scene finished, player ragdolling normally.")
|
|
#ENDIF
|
|
REPLAY_RECORD_BACK_FOR_TIME(10.0, 5.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
iStageProgress++
|
|
ELSE
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Kick out of car scene finished, player not ragdolling.")
|
|
#ENDIF
|
|
REPLAY_RECORD_BACK_FOR_TIME(10.0, 5.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
iStageProgress++
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ELIF ( bPlayerRagdolledEarly = TRUE )
|
|
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(iKickOutSceneID)
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(iKickOutSceneID) > 0.99
|
|
iStageProgress++
|
|
ENDIF
|
|
ELSE
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Kick out of car scene finished with player ragdolling early.")
|
|
#ENDIF
|
|
iStageProgress++
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 4
|
|
|
|
RUN_VEHICLE_AND_CAMERA_CHECK()
|
|
|
|
iKickOutSceneID = CREATE_SYNCHRONIZED_SCENE(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_ROTATION(PLAYER_PED_ID()))
|
|
|
|
SET_SYNCHRONIZED_SCENE_PHASE(iKickOutSceneID, 0.0)
|
|
SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(iKickOutSceneID, TRUE)
|
|
|
|
CLEAR_AREA_OF_OBJECTS(GET_ENTITY_COORDS(PLAYER_PED_ID()), 1.5)
|
|
CLEAR_AREA_OF_VEHICLES(GET_ENTITY_COORDS(PLAYER_PED_ID()), 1.5)
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
TASK_SYNCHRONIZED_SCENE(PLAYER_PED_ID(), iKickOutSceneID, "missfam5mcs_6drag", "fam_5_mcs_6_drag_michael",
|
|
INSTANT_BLEND_IN, INSTANT_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS | SYNCED_SCENE_DONT_INTERRUPT,
|
|
RBF_VEHICLE_IMPACT, INSTANT_BLEND_IN, AIK_DISABLE_LEG_IK)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID())
|
|
ENDIF
|
|
|
|
PLAY_SYNCHRONIZED_CAM_ANIM(ScriptedCamera, iKickOutSceneID, "fam_5_mcs_6_drag_cam", "missfam5mcs_6drag")
|
|
|
|
REPLAY_RECORD_BACK_FOR_TIME(10.0, 5.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
iStageProgress++
|
|
|
|
BREAK
|
|
|
|
CASE 5
|
|
|
|
RUN_VEHICLE_AND_CAMERA_CHECK()
|
|
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(iKickOutSceneID)
|
|
|
|
IF NOT DOES_CAM_EXIST(UndergroundCamera)
|
|
UndergroundCamera = CREATE_CAMERA(CAMTYPE_SCRIPTED, FALSE)
|
|
SET_CAM_PARAMS(UndergroundCamera, <<-20.194494,-219.796371,37.580395>>, <<-81.945038,-1.126925,-11.828329>>, 29.0)
|
|
ENDIF
|
|
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(iKickOutSceneID) >= 0.99
|
|
|
|
IF DOES_CAM_EXIST(UndergroundCamera)
|
|
SET_CAM_ACTIVE(UndergroundCamera, TRUE)
|
|
ENDIF
|
|
|
|
iStageProgress++
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 6
|
|
|
|
RUN_VEHICLE_AND_CAMERA_CHECK()
|
|
|
|
IF DOES_CAM_EXIST(UndergroundCamera) AND IS_CAM_RENDERING(UndergroundCamera)
|
|
|
|
iStageProgress++
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 7
|
|
|
|
RUN_VEHICLE_AND_CAMERA_CHECK()
|
|
|
|
IF DOES_CAM_EXIST(UndergroundCamera) AND IS_CAM_RENDERING(UndergroundCamera)
|
|
|
|
SET_CINEMATIC_MODE_ACTIVE(FALSE)
|
|
KILL_CHASE_HINT_CAM(sCinematicCamStruct)
|
|
|
|
REMOVE_ROAD_NODE_SPEED_ZONE(iSpeedZone)
|
|
|
|
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
|
|
CLEAR_PED_TASKS_IMMEDIATELY(psJimmy.PedIndex)
|
|
|
|
DELETE_PED(psJimmy.PedIndex)
|
|
DELETE_VEHICLE(vsMichaelsCar.VehicleIndex)
|
|
|
|
STOP_AUDIO_SCENE("FAMILY_5_DRUGS")
|
|
STOP_AUDIO_SCENE("FAMILY_5_DRUGS_FOCUS_CAM")
|
|
|
|
REMOVE_ANIM_DICT("missfam5mcs_6")
|
|
REMOVE_ANIM_DICT("missfam5_drink")
|
|
REMOVE_ANIM_DICT("missfam5mcs_6drag")
|
|
|
|
ANIMPOSTFX_STOP("DrugsDrivingIn")
|
|
ANIMPOSTFX_PLAY("DMT_flight", 0, TRUE)
|
|
|
|
QUIT_DRUNK_CAMERA_IMMEDIATELY()
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
|
|
SET_AUDIO_FLAG("DisableAbortConversationForRagdoll", FALSE)
|
|
|
|
RETURN TRUE
|
|
|
|
ENDIF
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
|
|
ENDFUNC
|
|
|
|
FUNC BOOL IS_MISSION_STAGE_CUTSCENE_BLACKOUT_COMPLETED(INT &iStageProgress)
|
|
|
|
SET_CLOCK_TIME(22, 0, 0)
|
|
REPLAY_PREVENT_RECORDING_AND_UI_THIS_FRAME()
|
|
SWITCH iStageProgress
|
|
|
|
CASE 0
|
|
|
|
MAKE_PED_SOBER(PLAYER_PED_ID())
|
|
QUIT_DRUNK_CAMERA_IMMEDIATELY()
|
|
|
|
WARP_PED(PLAYER_PED_ID(), MissionPosition.vStageStart, MissionPosition.fStartHeading, FALSE, TRUE, FALSE)
|
|
|
|
SET_WEATHER_TYPE_NOW_PERSIST("CLOUDS")
|
|
|
|
iStageProgress++
|
|
|
|
BREAK
|
|
|
|
CASE 1
|
|
|
|
IF NOT IS_NEW_LOAD_SCENE_ACTIVE()
|
|
|
|
NEW_LOAD_SCENE_START_SPHERE(GET_ENTITY_COORDS(PLAYER_PED_ID()), 20.0)
|
|
|
|
iLoadSceneTimer = GET_GAME_TIMER()
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Calling NEW_LOAD_SCENE_START().")
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Load scene timer: ", GET_GAME_TIMER() - iLoadSceneTimer, ".")
|
|
#ENDIF
|
|
|
|
IF IS_NEW_LOAD_SCENE_LOADED()
|
|
OR HAS_TIME_PASSED(10000, iLoadSceneTimer)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
IF HAS_TIME_PASSED(10000, iLoadSceneTimer)
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Calling NEW_LOAD_SCENE_STOP() due to iLoadSceneTimer timeout.")
|
|
ELSE
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Calling NEW_LOAD_SCENE_STOP() due to IS_NEW_LOAD_SCENE_LOADED() returning TRUE.")
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
NEW_LOAD_SCENE_STOP()
|
|
|
|
SET_CUTSCENE_AUDIO_OVERRIDE("_CUSTOM") //needed for B*1572859
|
|
|
|
iStageProgress++
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 2
|
|
|
|
REQUEST_IPL("SpaceInterior")
|
|
|
|
REQUEST_CUTSCENE("fam_5_mcs_6")
|
|
|
|
//IF HAS_REQUESTED_CUTSCENE_LOADED("fam_5_mcs_6") //don't want fade out here
|
|
IF HAS_THIS_CUTSCENE_LOADED("fam_5_mcs_6")
|
|
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE, DEFAULT,FALSE)
|
|
|
|
ANIMPOSTFX_STOP("DMT_flight")
|
|
SET_TIMECYCLE_MODIFIER("stoned_monkeys")
|
|
|
|
START_CUTSCENE(CUTSCENE_CREATE_OBJECTS_AT_SCENE_ORIGIN | CUTSCENE_SUPPRESS_FP_TRANSITION_FLASH)
|
|
|
|
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_CUTSCENE_PED_COMPONENT_VARIATION("Movie_Alien", PED_COMP_HEAD, 0, 0, S_M_M_MOVALIEN_01)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Movie_Alien", PED_COMP_TORSO, 0, 0, S_M_M_MOVALIEN_01)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Movie_Alien", PED_COMP_LEG, 0, 0, S_M_M_MOVALIEN_01)
|
|
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Movie_Alien^1", PED_COMP_HEAD, 0, 0, S_M_M_MOVALIEN_01)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Movie_Alien^1", PED_COMP_TORSO, 0, 0, S_M_M_MOVALIEN_01)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Movie_Alien^1", PED_COMP_LEG, 0, 0, S_M_M_MOVALIEN_01)
|
|
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Movie_Alien^2", PED_COMP_HEAD, 0, 0, S_M_M_MOVALIEN_01)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Movie_Alien^2", PED_COMP_TORSO, 0, 0, S_M_M_MOVALIEN_01)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Movie_Alien^2", PED_COMP_LEG, 0, 0, S_M_M_MOVALIEN_01)
|
|
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Movie_Alien^3", PED_COMP_HEAD, 0, 0, S_M_M_MOVALIEN_01)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Movie_Alien^3", PED_COMP_TORSO, 0, 0, S_M_M_MOVALIEN_01)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Movie_Alien^3", PED_COMP_LEG, 0, 0, S_M_M_MOVALIEN_01)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 3
|
|
|
|
IF IS_CUTSCENE_PLAYING()
|
|
|
|
DESTROY_ALL_CAMS()
|
|
RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
|
|
NEW_LOAD_SCENE_START_SPHERE(<< 41.1, -779.8, 837.0 >>, 20.0)
|
|
|
|
CLEAR_AREA(MissionPosition.vStageStart, 25.0, TRUE)
|
|
CLEAR_AREA_OF_PEDS(MissionPosition.vStageStart, 25.0)
|
|
CLEAR_AREA_OF_OBJECTS(MissionPosition.vStageStart, 25.0)
|
|
CLEAR_AREA_OF_VEHICLES(MissionPosition.vStageStart, 25.0)
|
|
CLEAR_AREA_OF_PROJECTILES(MissionPosition.vStageStart, 25.0)
|
|
REMOVE_PARTICLE_FX_IN_RANGE(MissionPosition.vStageStart, 25.0)
|
|
|
|
IF IS_SCREEN_FADED_OUT()
|
|
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
|
|
ENDIF
|
|
|
|
iStageProgress++
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 4
|
|
|
|
REQUEST_ANIM_DICT("missfam5_flying")
|
|
REQUEST_SCRIPT_AUDIO_BANK("FAM5_MICHAEL_LONG_SCREAM")
|
|
|
|
IF IS_CUTSCENE_PLAYING()
|
|
SWITCH iVFXProgress
|
|
CASE 0
|
|
IF GET_CUTSCENE_TIME() >= 30465
|
|
CLEAR_TIMECYCLE_MODIFIER()
|
|
SET_TIMECYCLE_MODIFIER("stoned_aliens")
|
|
iVFXProgress++
|
|
ENDIF
|
|
BREAK
|
|
CASE 1
|
|
IF GET_CUTSCENE_TIME() >= 48565
|
|
CLEAR_TIMECYCLE_MODIFIER()
|
|
ANIMPOSTFX_PLAY("DMT_flight_intro", 0, FALSE)
|
|
iVFXProgress++
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
|
|
IF IS_CUTSCENE_PLAYING()
|
|
IF GET_CUTSCENE_TIME() >= 28500
|
|
IF NOT IS_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P0_BARECHEST_BOXERS)
|
|
SET_PLAYER_PED_OUTFIT(MO_UNDERWEAR)
|
|
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())
|
|
|
|
GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), GADGETTYPE_PARACHUTE, 1, FALSE, FALSE)
|
|
SET_PED_COMPONENT_VARIATION(PLAYER_PED_ID(), PED_COMP_SPECIAL2, 0, 0, 0)
|
|
|
|
WARP_PED(PLAYER_PED_ID(), << -2100.000, 700.325, 1200.000 >>, 128.0, FALSE, FALSE, FALSE)
|
|
|
|
IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iFlyingSceneID)
|
|
|
|
iFlyingSceneID = CREATE_SYNCHRONIZED_SCENE(<< -900.000, 100.325, 800.000 >>, << 0.0, 0.0, -139.210 >>)
|
|
|
|
TASK_SYNCHRONIZED_SCENE(PLAYER_PED_ID(), iFlyingSceneID, "missfam5_flying", "falling_to_skydive", INSTANT_BLEND_IN, INSTANT_BLEND_OUT)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID())
|
|
|
|
DESTROY_ALL_CAMS()
|
|
AnimatedCamera = CREATE_CAMERA(CAMTYPE_ANIMATED, TRUE)
|
|
PLAY_SYNCHRONIZED_CAM_ANIM(AnimatedCamera, iFlyingSceneID, "falling_to_skydive_cam", "missfam5_flying")
|
|
|
|
RENDER_SCRIPT_CAMS(TRUE, FALSE)
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF HAS_CUTSCENE_FINISHED()
|
|
|
|
NEW_LOAD_SCENE_STOP()
|
|
REMOVE_IPL("SpaceInterior")
|
|
|
|
CLEAR_TIMECYCLE_MODIFIER()
|
|
|
|
IF ( bCutsceneSkipped = TRUE )
|
|
IF REQUEST_SCRIPT_AUDIO_BANK("FAM5_MICHAEL_LONG_SCREAM")
|
|
PLAY_SOUND_FRONTEND(-1, "MICHAEL_LONG_SCREAM", "FAMILY_5_SOUNDS")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_SCREEN_FADED_OUT()
|
|
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
|
|
ENDIF
|
|
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
|
|
|
|
REPLAY_STOP_EVENT()
|
|
|
|
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 CONVERGE_TIME_SCALE_VALUE(FLOAT &fCurrentValue, FLOAT fDesiredValue, FLOAT fAmountToConverge, BOOL bAdjustForFramerate = FALSE)
|
|
|
|
IF fCurrentValue != fDesiredValue
|
|
FLOAT fConvergeAmountThisFrame = fAmountToConverge
|
|
IF bAdjustForFramerate
|
|
fConvergeAmountThisFrame = 0.0 +@ (fAmountToConverge * 30.0)
|
|
ENDIF
|
|
|
|
IF fCurrentValue - fDesiredValue > fConvergeAmountThisFrame
|
|
fCurrentValue -= fConvergeAmountThisFrame
|
|
ELIF fCurrentValue - fDesiredValue < -fConvergeAmountThisFrame
|
|
fCurrentValue += fConvergeAmountThisFrame
|
|
ELSE
|
|
fCurrentValue = fDesiredValue
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC UPDATE_TIME_SCALE_VALUE()
|
|
|
|
CONVERGE_TIME_SCALE_VALUE(fCurrentTimeScale, fDesiredTimeScale, fDesiredTimeScaleSpeed, TRUE)
|
|
SET_TIME_SCALE(fCurrentTimeScale)
|
|
|
|
IF GET_GAME_TIMER() - iTimeScaleChangeTimer > 0
|
|
|
|
fDesiredTimeScale = GET_RANDOM_FLOAT_IN_RANGE(0.5, 0.75) //imran wanted 0.60 - 0.85
|
|
fDesiredTimeScaleSpeed = GET_RANDOM_FLOAT_IN_RANGE(0.01, 0.001)
|
|
iTimeScaleChangeTimer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(5000, 7500)
|
|
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC UPDATE_FLIGHT_CONTROLS()
|
|
|
|
FLOAT fPitchNormalValue = GET_CONTROL_NORMAL(PLAYER_CONTROL, INPUT_PARACHUTE_PITCH_UD)
|
|
VECTOR vPlayerPosition = GET_ENTITY_COORDS(PLAYER_PED_ID(), FALSE)
|
|
|
|
FLOAT fForceFrameModifier = 0.0 +@ (fForceBaseModifier * 30.0)
|
|
|
|
//add small boost upwards for holding stick down
|
|
IF ( fPitchNormalValue > 0.5 )
|
|
vForceValue.z = BASE_Z_FORCE_VALUE + 10
|
|
ELSE
|
|
vForceValue.z = BASE_Z_FORCE_VALUE
|
|
ENDIF
|
|
|
|
//get dive boost time
|
|
IF ( fPitchNormalValue < -0.5 )
|
|
|
|
IF ( iDiveStartTime = 0 )
|
|
iDiveStartTime = GET_GAME_TIMER()
|
|
ELSE
|
|
iDiveTimer = GET_GAME_TIMER() - iDiveStartTime
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
IF ( iBoostTime = 0 )
|
|
iBoostTime = iDiveTimer
|
|
iBoostTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
|
|
iDiveTimer = 0
|
|
iDiveStartTime = 0
|
|
|
|
ENDIF
|
|
|
|
//apply dive boost for specified time
|
|
IF ( iBoostTime != 0 )
|
|
IF NOT HAS_TIME_PASSED(iBoostTime, iBoostTimer)
|
|
IF ( fPitchNormalValue > 0.5 )
|
|
vForceValue.y = 25
|
|
vForceValue.z = 400
|
|
ENDIF
|
|
ELSE
|
|
iBoostTime = 0
|
|
iBoostTimer = 0
|
|
vForceValue.y = 150
|
|
vForceValue.z = 50
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//don't apply any force up when over 700 m
|
|
IF ( vPlayerPosition.z > 700.0 )
|
|
vForceValue.z = 0
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
IF bDrawDebugLinesAndSpheres = TRUE
|
|
DRAW_DEBUG_TEXT_2D("DISTANCE FROM ORIGIN:", << 0.1, 0.70, 0.0 >>) DRAW_DEBUG_TEXT_2D(GET_STRING_FROM_FLOAT(GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), << 0.0, 0.0, 0.0 >>)), << 0.2, 0.70, 0.0 >>)
|
|
DRAW_DEBUG_TEXT_2D("PITCH NORMAL VALUE:", << 0.1, 0.72, 0.0 >>) DRAW_DEBUG_TEXT_2D(GET_STRING_FROM_FLOAT(fPitchNormalValue), << 0.2, 0.72, 0.0 >>)
|
|
DRAW_DEBUG_TEXT_2D("HEIGHT:", << 0.1, 0.74, 0.0 >>) DRAW_DEBUG_TEXT_2D(GET_STRING_FROM_FLOAT(vPlayerPosition.z), << 0.2, 0.74, 0.0 >>)
|
|
DRAW_DEBUG_TEXT_2D("HEIGHT ABOVE GROUND:", << 0.1, 0.76, 0.0 >>) DRAW_DEBUG_TEXT_2D(GET_STRING_FROM_FLOAT(GET_ENTITY_HEIGHT_ABOVE_GROUND(PLAYER_PED_ID())), << 0.2, 0.76, 0.0 >>)
|
|
DRAW_DEBUG_TEXT_2D("DIVE TIMER:", << 0.1, 0.78, 0.0 >>) DRAW_DEBUG_TEXT_2D(GET_STRING_FROM_INT(iDiveTimer), << 0.2, 0.78, 0.0 >>)
|
|
DRAW_DEBUG_TEXT_2D("BOOST TIME:", << 0.1, 0.80, 0.0 >>) DRAW_DEBUG_TEXT_2D(GET_STRING_FROM_INT(iBoostTime), << 0.2, 0.80, 0.0 >>) IF ( iBoostTime != 0 ) DRAW_DEBUG_TEXT_2D(GET_STRING_FROM_INT(iBoostTime - (GET_GAME_TIMER() - iBoostTimer )), << 0.3, 0.80, 0.0 >>) ENDIF
|
|
DRAW_DEBUG_TEXT_2D("FORCE APPLIED:", << 0.1, 0.88, 0.0 >>) DRAW_DEBUG_TEXT_2D(GET_STRING_FROM_FLOAT(vForceValue.x), << 0.2, 0.88, 0.0 >>) DRAW_DEBUG_TEXT_2D(GET_STRING_FROM_FLOAT(vForceValue.y), << 0.3, 0.88, 0.0 >>) DRAW_DEBUG_TEXT_2D(GET_STRING_FROM_FLOAT(vForceValue.z), << 0.4, 0.88, 0.0 >>)
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
IF IS_PED_IN_PARACHUTE_FREE_FALL(PLAYER_PED_ID())
|
|
APPLY_FORCE_TO_ENTITY(PLAYER_PED_ID(), APPLY_TYPE_IMPULSE,
|
|
<< vForceValue.x * fForceFrameModifier, vForceValue.y * fForceFrameModifier, vForceValue.z * fForceFrameModifier >>,
|
|
vForceOffset, 0, TRUE, FALSE, FALSE)
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
FUNC BOOL IS_MISSION_STAGE_FLIGHT_COMPLETED(INT &iStageProgress)
|
|
|
|
SET_CLOCK_TIME(22, 0, 0)
|
|
|
|
DISABLE_ON_FOOT_FIRST_PERSON_VIEW_THIS_UPDATE() //fix for B*2008355
|
|
SET_FOLLOW_PED_CAM_THIS_UPDATE("FOLLOW_PED_SKY_DIVING_FAMILY5_CAMERA", 0)
|
|
|
|
SWITCH iStageProgress
|
|
|
|
CASE 0
|
|
|
|
STAT_DISABLE_STATS_TRACKING()
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
|
|
SET_ENTITY_INVINCIBLE(PLAYER_PED_ID(), TRUE)
|
|
SET_ENTITY_PROOFS(PLAYER_PED_ID(), FALSE, FALSE, FALSE, TRUE, FALSE)
|
|
|
|
//B* 2222737: Reduce exposure brightness on SLI rigs
|
|
IF IS_PC_VERSION()
|
|
FORCE_EXPOSURE_READBACK(TRUE)
|
|
ENDIF
|
|
|
|
CLEAR_TIMECYCLE_MODIFIER()
|
|
ANIMPOSTFX_STOP("DMT_flight_intro")
|
|
ANIMPOSTFX_PLAY("DMT_flight", 0, TRUE)
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
|
|
IF NOT IS_ENTITY_PLAYING_ANIM(PLAYER_PED_ID(), "missfam5_flying", "falling_to_skydive")
|
|
|
|
QUIT_DRUNK_CAMERA_IMMEDIATELY()
|
|
STOP_GAMEPLAY_CAM_SHAKING(TRUE)
|
|
MAKE_PED_SOBER(PLAYER_PED_ID())
|
|
|
|
WARP_PED(PLAYER_PED_ID(), << -2100.000, 700.325, 1200.000 >>, 128.0, FALSE, FALSE, FALSE)
|
|
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
|
|
|
|
iStageProgress++
|
|
|
|
ELSE
|
|
|
|
iStageProgress++
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 1
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iFlyingSceneID)
|
|
|
|
REQUEST_ANIM_DICT("missfam5_flying")
|
|
|
|
IF HAS_ANIM_DICT_LOADED("missfam5_flying")
|
|
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
|
|
GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), GADGETTYPE_PARACHUTE, 1, FALSE, FALSE)
|
|
SET_PED_COMPONENT_VARIATION(PLAYER_PED_ID(), PED_COMP_SPECIAL2, 0, 0, 0)
|
|
WARP_PED(PLAYER_PED_ID(), << -2100.000, 700.325, 1200.000 >>, 128.0, FALSE, FALSE, FALSE)
|
|
|
|
IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iFlyingSceneID)
|
|
|
|
iFlyingSceneID = CREATE_SYNCHRONIZED_SCENE(<< -900.000, 100.325, 800.000 >>, << 0.0, 0.0, -139.210 >>)
|
|
|
|
TASK_SYNCHRONIZED_SCENE(PLAYER_PED_ID(), iFlyingSceneID, "missfam5_flying", "falling_to_skydive", INSTANT_BLEND_IN, INSTANT_BLEND_OUT)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID(), TRUE)
|
|
|
|
DESTROY_ALL_CAMS()
|
|
AnimatedCamera = CREATE_CAMERA(CAMTYPE_ANIMATED, TRUE)
|
|
PLAY_SYNCHRONIZED_CAM_ANIM(AnimatedCamera, iFlyingSceneID, "falling_to_skydive_cam", "missfam5_flying")
|
|
|
|
RENDER_SCRIPT_CAMS(TRUE, FALSE)
|
|
|
|
ENDIF
|
|
|
|
iStageProgress++
|
|
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
iStageProgress++
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 2
|
|
|
|
IF IS_ENTITY_PLAYING_ANIM(PLAYER_PED_ID(), "missfam5_flying", "falling_to_skydive")
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(fRelativePitch)
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.35)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(iFlyingSceneID)
|
|
|
|
DISABLE_FIRST_PERSON_FLASH_EFFECT_THIS_UPDATE()
|
|
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("FAMILY_5_FLYING")
|
|
START_AUDIO_SCENE("FAMILY_5_FLYING")
|
|
ENDIF
|
|
|
|
IF IS_SCREEN_FADED_OUT()
|
|
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME_SHORT)
|
|
ENDIF
|
|
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(iFlyingSceneID) >= 0.715
|
|
IF bFlightStreamTriggered = FALSE
|
|
IF LOAD_STREAM("FLYING_STREAM", "FAMILY_5_SOUNDS")
|
|
SET_AUDIO_FLAG("DisableReplayScriptStreamRecording", TRUE)
|
|
PLAY_STREAM_FRONTEND()
|
|
iStreamPlayTime = 0
|
|
bFlightStreamTriggered = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF bAnimatedCameraStopped = FALSE
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(iFlyingSceneID) >= fAnimatedCameraStopPhase
|
|
|
|
STOP_GAMEPLAY_CAM_SHAKING(TRUE)
|
|
SHAKE_GAMEPLAY_CAM("FAMILY5_DRUG_TRIP_SHAKE", 1.0)
|
|
RENDER_SCRIPT_CAMS(FALSE, TRUE, iAnimatedCameraInterpTime, FALSE)
|
|
|
|
bAnimatedCameraStopped = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(iFlyingSceneID) >= fFallAnimationStopPhase
|
|
|
|
TASK_SKY_DIVE(PLAYER_PED_ID())
|
|
SET_PED_COMPONENT_VARIATION(PLAYER_PED_ID(), PED_COMP_SPECIAL2, 0, 0, 0)
|
|
FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_PARACHUTING, FALSE, FAUS_DEFAULT)
|
|
|
|
IF DOES_CAM_EXIST(UndergroundCamera)
|
|
DESTROY_CAM(UndergroundCamera)
|
|
ENDIF
|
|
|
|
fCurrentTimeScale = 1.0
|
|
fDesiredTimeScale = 1.0
|
|
fDesiredTimeScaleSpeed = 0.01
|
|
|
|
RELEASE_NAMED_SCRIPT_AUDIO_BANK("FAM5_MICHAEL_LONG_SCREAM")
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
|
|
iStageProgress++
|
|
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 3
|
|
|
|
IF IS_STREAM_PLAYING()
|
|
iStreamPlayTime = GET_STREAM_PLAY_TIME()
|
|
SET_AUDIO_FLAG("DisableReplayScriptStreamRecording", FALSE)
|
|
ENDIF
|
|
|
|
REQUEST_SCRIPT_AUDIO_BANK("FAM5_DRUG_FLIGHT_END")
|
|
|
|
UPDATE_FLIGHT_CONTROLS()
|
|
UPDATE_TIME_SCALE_VALUE()
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_PARACHUTE_DEPLOY)
|
|
SET_PED_COMPONENT_VARIATION(PLAYER_PED_ID(), PED_COMP_SPECIAL2, 0, 0, 0)
|
|
|
|
VECTOR vTestCoordsFront
|
|
VECTOR vTestCoordsDown
|
|
|
|
vTestCoordsFront = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(PLAYER_PED_ID(), << 0.0, 10.0, 0.0 >>)
|
|
vTestCoordsDown = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(PLAYER_PED_ID(), << 0.0, 5.0, -5.0 >>)
|
|
|
|
IF iStreamPlayTime >= FLIGHT_TIME_MAX OR NOT IS_STREAM_PLAYING()
|
|
OR HAS_ENTITY_COLLIDED_WITH_ANYTHING(PLAYER_PED_ID()) OR IS_ENTITY_IN_WATER(PLAYER_PED_ID())
|
|
OR GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), << 0.0, 0.0, 0.0 >>) > 8000.0
|
|
OR NOT IS_SHAPE_TEST_CAPSULE_CLEAR(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(PLAYER_PED_ID()), 3.0 #IF IS_DEBUG_BUILD, "PLAYER" #ENDIF)
|
|
OR NOT IS_SHAPE_TEST_CAPSULE_CLEAR(GET_ENTITY_COORDS(PLAYER_PED_ID()), vTestCoordsFront, 1.0 #IF IS_DEBUG_BUILD, "FRONT" #ENDIF)
|
|
OR NOT IS_SHAPE_TEST_CAPSULE_CLEAR(GET_ENTITY_COORDS(PLAYER_PED_ID()), vTestCoordsDown, 1.0 #IF IS_DEBUG_BUILD, "DOWN" #ENDIF)
|
|
|
|
PLAY_SOUND_FRONTEND(-1, "FLYING_STREAM_END_INSTANT", "FAMILY_5_SOUNDS")
|
|
|
|
bCollisionDetected = TRUE
|
|
|
|
ENDIF
|
|
|
|
IF ( bCollisionDetected = TRUE )
|
|
|
|
UndergroundCamera = CREATE_CAMERA(CAMTYPE_SCRIPTED, TRUE)
|
|
SET_CAM_PARAMS(UndergroundCamera, <<-967.576538,309.460022,65.552261>>,<<-89.499146,0.013776,37.204556>>,40.0)
|
|
RENDER_SCRIPT_CAMS(TRUE, FALSE)
|
|
|
|
iStageProgress++
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 4
|
|
|
|
IF DOES_CAM_EXIST(UndergroundCamera) AND IS_CAM_RENDERING(UndergroundCamera)
|
|
|
|
SET_TIME_SCALE(1.0)
|
|
|
|
STOP_STREAM()
|
|
STOP_AUDIO_SCENE("FAMILY_5_FLYING")
|
|
RELEASE_NAMED_SCRIPT_AUDIO_BANK("FAM5_DRUG_FLIGHT_END")
|
|
RELEASE_NAMED_SCRIPT_AUDIO_BANK("FAM5_MICHAEL_LONG_SCREAM")
|
|
|
|
REMOVE_ANIM_DICT("missfam5_flying")
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
REMOVE_WEAPON_FROM_PED(PLAYER_PED_ID(), GADGETTYPE_PARACHUTE)
|
|
ENDIF
|
|
|
|
STOP_GAMEPLAY_CAM_SHAKING(TRUE)
|
|
|
|
REPLAY_RECORD_BACK_FOR_TIME(15.0, 0.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
SET_AUDIO_FLAG("DisableReplayScriptStreamRecording", FALSE)
|
|
|
|
bBlackoutStagesActive = FALSE
|
|
|
|
//B* 2222737: Adjust exposure to work on SLI rigs
|
|
IF IS_PC_VERSION()
|
|
FORCE_EXPOSURE_READBACK(FALSE)
|
|
ENDIF
|
|
|
|
STAT_ENABLE_STATS_TRACKING()
|
|
|
|
RETURN TRUE
|
|
|
|
ENDIF
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
RETURN FALSE
|
|
|
|
ENDFUNC
|
|
|
|
PROC MANAGE_CONVERSATIONS_AT_HOME()
|
|
|
|
IF ( bLeadInTriggered = FALSE )
|
|
|
|
//Michael enters main hall of the house, says 'Hello?'
|
|
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM5_HOME1")
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-804.746826,183.296768,70.847786>>, <<-816.380859,178.671936,75.153091>>, 5.5)
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(Family5Conversation, "FAM5AUD", "FAM5_HOME1", CONV_PRIORITY_MEDIUM)
|
|
SET_LABEL_AS_TRIGGERED("FAM5_HOME1", TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Michael walks up the lower stairs, says 'Hey, I'm home.'
|
|
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM5_HOME2")
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-805.310608,184.709808,69.002808>>, <<-810.909058,182.608139,75.588348>>, 2.4)
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(Family5Conversation, "FAM5AUD", "FAM5_HOME2", CONV_PRIORITY_MEDIUM)
|
|
SET_LABEL_AS_TRIGGERED("FAM5_HOME2", TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Michael walks up the upper stairs, says 'Anyone here?'
|
|
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM5_HOME3")
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-805.989319,183.167130,73.502525>>, <<-804.606812,179.573715,78.740730>>, 2.35)
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(Family5Conversation, "FAM5AUD", "FAM5_HOME3", CONV_PRIORITY_MEDIUM)
|
|
SET_LABEL_AS_TRIGGERED("FAM5_HOME3", TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Michael enters living room area, says 'I'm back.'
|
|
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM5_HOME9")
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-806.945618,181.749252,66.152946>>, <<-801.842285,168.541428,75.334709>>, 7.6)
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(Family5Conversation, "FAM5AUD", "FAM5_HOME9", CONV_PRIORITY_MEDIUM)
|
|
SET_LABEL_AS_TRIGGERED("FAM5_HOME9", TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Michael enters kitchen and dining room, says 'Hello?'
|
|
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM5_HOME5")
|
|
//IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-800.412415,187.048843,71.605469>>, <<-796.639465,177.333191,75.334709>>, 8.0)
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-797.724304,183.222839,71.744682>>, <<-795.584778,177.697128,74.834709>>, 6.0) //dining room only
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(Family5Conversation, "FAM5AUD", "FAM5_HOME5", CONV_PRIORITY_MEDIUM)
|
|
SET_LABEL_AS_TRIGGERED("FAM5_HOME5", TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Michael enters upper hall, says 'Kids?'
|
|
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM5_HOME8")
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-800.397156,179.202255,75.240730>>, <<-809.928223,175.562454,78.740730>>, 4.0)
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(Family5Conversation, "FAM5AUD", "FAM5_HOME8", CONV_PRIORITY_MEDIUM)
|
|
SET_LABEL_AS_TRIGGERED("FAM5_HOME8", TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Michael enters his bedroom
|
|
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM5_HOME6") //says 'Amanda?'
|
|
AND NOT HAS_LABEL_BEEN_TRIGGERED("FAM5_HOME10") //says 'Honey?'
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-809.094360,180.614655,75.240730>>, <<-816.723267,177.806808,78.862457>>, 5.0)
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
SWITCH GET_RANDOM_INT_IN_RANGE(0, 2)
|
|
CASE 0
|
|
IF CREATE_CONVERSATION(Family5Conversation, "FAM5AUD", "FAM5_HOME6", CONV_PRIORITY_MEDIUM)
|
|
SET_LABEL_AS_TRIGGERED("FAM5_HOME6", TRUE)
|
|
ENDIF
|
|
BREAK
|
|
CASE 1
|
|
IF CREATE_CONVERSATION(Family5Conversation, "FAM5AUD", "FAM5_HOME10", CONV_PRIORITY_MEDIUM)
|
|
SET_LABEL_AS_TRIGGERED("FAM5_HOME10", TRUE)
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Michael enters Jimmy's room, says 'Ho Jimmy'
|
|
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM5_HOME4")
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-809.125183,173.548157,75.740074>>, <<-806.509033,166.364822,78.740730>>, 4.5) //Jimmy's room
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(Family5Conversation, "FAM5AUD", "FAM5_HOME4", CONV_PRIORITY_MEDIUM)
|
|
SET_LABEL_AS_TRIGGERED("FAM5_HOME4", TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Michael enters Tracy's room, says 'Tracey? Trace?'
|
|
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM5_HOME7")
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-802.726013,176.068436,75.240730>>, <<-799.839966,168.956497,78.740730>>, 3.5)
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(Family5Conversation, "FAM5AUD", "FAM5_HOME7", CONV_PRIORITY_MEDIUM)
|
|
SET_LABEL_AS_TRIGGERED("FAM5_HOME7", TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Michael enters the back garden, says 'Anyone out here?'
|
|
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM5_HOME11")
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-793.242004,180.620438,68.834671>>, <<-775.615662,187.148071,74.834671>>, 24.0)
|
|
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-795.846069,177.214935,74.835037>>, <<-792.377319,167.718445,69.388756>>, 8.0)
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(sLocatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
IF CREATE_CONVERSATION(Family5Conversation, "FAM5AUD", "FAM5_HOME11", CONV_PRIORITY_MEDIUM)
|
|
SET_LABEL_AS_TRIGGERED("FAM5_HOME11", TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC MANAGE_AMBIENT_PEDS_SPEAKING_TO_PED(PED_INDEX PedIndex, INT &iTimer)
|
|
|
|
PED_INDEX pedArray[16]
|
|
|
|
INT i = 0
|
|
|
|
IF ( iTimer = 0)
|
|
|
|
iTimer = GET_GAME_TIMER()
|
|
|
|
ELSE
|
|
|
|
IF HAS_TIME_PASSED(15000, iTimer)
|
|
|
|
IF NOT IS_PED_INJURED(PedIndex)
|
|
|
|
GET_PED_NEARBY_PEDS(PedIndex, pedArray, PEDTYPE_ANIMAL)
|
|
|
|
FOR i = 0 TO ( COUNT_OF(pedArray) - 1 )
|
|
|
|
IF DOES_ENTITY_EXIST(pedArray[i])
|
|
|
|
IF NOT IS_PED_INJURED(pedArray[i])
|
|
|
|
IF NOT IS_PED_IN_ANY_VEHICLE(pedArray[i])
|
|
|
|
IF GET_DISTANCE_BETWEEN_ENTITIES(pedArray[i], PedIndex) < 7.5
|
|
|
|
VECTOR vOffset = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(pedArray[i], GET_ENTITY_COORDS(PedIndex))
|
|
|
|
IF ( vOffset.y > 1.0 ) //if ped is in front of the ambient ped
|
|
|
|
IF NOT IS_AMBIENT_SPEECH_PLAYING(pedArray[i])
|
|
|
|
PLAY_PED_AMBIENT_SPEECH(pedArray[i], "SEE_WEIRDO", SPEECH_PARAMS_FORCE)
|
|
|
|
TASK_LOOK_AT_ENTITY(pedArray[i], PedIndex, 1000)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
DRAW_DEBUG_LINE(GET_ENTITY_COORDS(PedIndex), GET_ENTITY_COORDS(pedArray[i]), 255, 0, 255)
|
|
#ENDIF
|
|
|
|
iTimer = GET_GAME_TIMER()
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDFOR
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
FUNC BOOL IS_MISSION_STAGE_GO_HOME_WASTED_COMPLETED(INT &iStageProgress)
|
|
|
|
SET_BIT(sLocatesData.iLocatesBitSet, BS_DONT_DO_J_SKIP)
|
|
|
|
MANAGE_CONVERSATIONS_AT_HOME()
|
|
|
|
IF IS_PLAYER_PLAYING(PLAYER_ID())
|
|
SET_ALL_RANDOM_PEDS_FLEE_THIS_FRAME(PLAYER_ID())
|
|
ENDIF
|
|
|
|
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID(), TRUE) AND IS_VEHICLE_A_CYCLE(GET_ENTITY_MODEL(GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID())))
|
|
SET_PLAYER_SPRINT(PLAYER_ID(), FALSE)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_MOVE_UD)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_MOVE_DOWN)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_MOVE_DOWN_ONLY)
|
|
ELSE
|
|
SET_PLAYER_SPRINT(PLAYER_ID(), TRUE)
|
|
ENDIF
|
|
|
|
SWITCH iStageProgress
|
|
|
|
CASE 0 //create scripted camera for wake up wasted
|
|
|
|
WARP_PED(PLAYER_PED_ID(), MissionPosition.vStageStart, MissionPosition.fStartHeading, FALSE, TRUE, FALSE)
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
SET_ENTITY_HEALTH(PLAYER_PED_ID(), GET_PED_MAX_HEALTH(PLAYER_PED_ID()))
|
|
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED, TRUE)
|
|
SET_ENTITY_INVINCIBLE(PLAYER_PED_ID(), FALSE)
|
|
SET_ENTITY_PROOFS(PLAYER_PED_ID(), FALSE, FALSE, FALSE, FALSE, FALSE)
|
|
CLEAR_PED_WETNESS(PLAYER_PED_ID())
|
|
RESET_PED_VISIBLE_DAMAGE(PLAYER_PED_ID())
|
|
CLEAR_PED_BLOOD_DAMAGE(PLAYER_PED_ID())
|
|
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_PED_STEALTH_MOVEMENT(PLAYER_PED_ID(), FALSE)
|
|
SET_PED_USING_ACTION_MODE(PLAYER_PED_ID(), FALSE)
|
|
MAKE_PED_SOBER(PLAYER_PED_ID())
|
|
ENDIF
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
|
|
SET_ALL_SHOPS_TEMPORARILY_UNAVAILABLE(FALSE) //unblock all shops when drunk and blackout is over
|
|
|
|
INSTANTLY_FILL_VEHICLE_POPULATION()
|
|
|
|
REPLAY_RECORD_BACK_FOR_TIME(0.0, 10.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
iStageProgress++
|
|
|
|
BREAK
|
|
|
|
CASE 1
|
|
|
|
IF NOT IS_NEW_LOAD_SCENE_ACTIVE()
|
|
|
|
NEW_LOAD_SCENE_START_SPHERE(GET_ENTITY_COORDS(PLAYER_PED_ID()), 200.0)
|
|
|
|
iLoadSceneTimer = GET_GAME_TIMER()
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Calling NEW_LOAD_SCENE_START().")
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Load scene timer: ", GET_GAME_TIMER() - iLoadSceneTimer, ".")
|
|
#ENDIF
|
|
|
|
IF IS_NEW_LOAD_SCENE_LOADED()
|
|
OR HAS_TIME_PASSED(10000, iLoadSceneTimer)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
IF HAS_TIME_PASSED(10000, iLoadSceneTimer)
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Calling NEW_LOAD_SCENE_STOP() due to iLoadSceneTimer timeout.")
|
|
ELSE
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Calling NEW_LOAD_SCENE_STOP() due to IS_NEW_LOAD_SCENE_LOADED() returning TRUE.")
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
NEW_LOAD_SCENE_STOP()
|
|
|
|
iStageProgress++
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 2
|
|
|
|
REQUEST_PTFX_ASSET()
|
|
|
|
REQUEST_ANIM_DICT("missfam5_blackout")
|
|
|
|
REQUEST_ANIM_DICT("move_m@drunk@verydrunk")
|
|
|
|
LOAD_MISSION_SFX(MISSION_SFX_VOMIT)
|
|
|
|
IF HAS_PTFX_ASSET_LOADED()
|
|
AND HAS_ANIM_DICT_LOADED("missfam5_blackout")
|
|
AND HAS_ANIM_DICT_LOADED("move_m@drunk@verydrunk")
|
|
|
|
iStageProgress++
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 3
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
|
|
IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iVomitSceneID)
|
|
|
|
iVomitSceneID = CREATE_SYNCHRONIZED_SCENE(<< -966.935, 309.252, 69.350 >>, << 0.0, 0.0, -90.0 >>)
|
|
|
|
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(), iVomitSceneID, "missfam5_blackout", "vomit", INSTANT_BLEND_IN, -2)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID())
|
|
|
|
DESTROY_ALL_CAMS()
|
|
ScriptedCamera = CREATE_CAMERA(CAMTYPE_ANIMATED, TRUE)
|
|
PLAY_SYNCHRONIZED_CAM_ANIM(ScriptedCamera, iVomitSceneID, "vomit_cam", "missfam5_blackout")
|
|
|
|
DISPLAY_HUD(FALSE)
|
|
DISPLAY_RADAR(FALSE)
|
|
RENDER_SCRIPT_CAMS(TRUE, FALSE)
|
|
|
|
MAKE_PED_DRUNK(PLAYER_PED_ID(), 50000)
|
|
STOP_MISSION_SFX(MISSION_SFX_HEARTBEAT)
|
|
SET_AUDIO_SPECIAL_EFFECT_MODE(AUDIO_SPECIAL_EFFECT_MODE_NORMAL)
|
|
|
|
STOP_AUDIO_SCENE("FAMILY_5_YOGA_ON_DRUGS")
|
|
START_AUDIO_SCENE("FAMILY_5_WAKE_UP_VOMIT")
|
|
|
|
ANIMPOSTFX_STOP("DMT_flight")
|
|
ANIMPOSTFX_PLAY("DrugsDrivingOut", 0, FALSE)
|
|
|
|
REPLAY_RECORD_BACK_FOR_TIME(0.0, 10.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
iStageProgress++
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 4
|
|
|
|
IF IS_SCREEN_FADED_OUT()
|
|
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(iVomitSceneID)
|
|
|
|
IF DOES_CAM_EXIST(UndergroundCamera)
|
|
DESTROY_CAM(UndergroundCamera)
|
|
ENDIF
|
|
|
|
FLOAT fAnimTime
|
|
|
|
fAnimTime = GET_SYNCHRONIZED_SCENE_PHASE(iVomitSceneID)
|
|
|
|
IF ( fAnimTime < 0.95 )
|
|
|
|
|
|
IF (fAnimTime > iSTART_VOMITING_TIME)
|
|
AND (fAnimTime < iSTOP_VOMITING_TIME)
|
|
|
|
IF (ptfxPuke = NULL)
|
|
|
|
PLAY_MISSION_SFX(MISSION_SFX_VOMIT)
|
|
|
|
ptfxPuke = START_PARTICLE_FX_LOOPED_ON_PED_BONE("scr_trev_puke", PLAYER_PED_ID(),
|
|
<< 0.0, 0.0, 0.0 >>, << 0.0, 0.0, 0.0 >>, BONETAG_HEAD, 1)
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
IF DOES_PARTICLE_FX_LOOPED_EXIST(ptfxPuke)
|
|
|
|
STOP_PARTICLE_FX_LOOPED(ptfxPuke)
|
|
|
|
ptfxPuke = NULL
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF ( bFirstPersonFlashPlayed = FALSE )
|
|
IF ( fAnimTime > iSTART_FP_FLASH_TIME )
|
|
IF GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_ON_FOOT) = CAM_VIEW_MODE_FIRST_PERSON
|
|
ANIMPOSTFX_PLAY("CamPushInNeutral", 0, FALSE)
|
|
PLAY_SOUND_FRONTEND(-1, "1st_Person_Transition", "PLAYER_SWITCH_CUSTOM_SOUNDSET")
|
|
bFirstPersonFlashPlayed = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
CLEAR_PED_TASKS(PLAYER_PED_ID())
|
|
|
|
REMOVE_ANIM_DICT("missfam5_blackout")
|
|
|
|
iStageProgress++
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 5
|
|
|
|
IF ( bCutsceneSkipped = TRUE )
|
|
WAIT(500)
|
|
ENDIF
|
|
|
|
IF IS_SCREEN_FADED_OUT()
|
|
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
|
|
ENDIF
|
|
|
|
RELEASE_MISSION_SFX_AUDIO_BANK(MISSION_SFX_HEARTBEAT)
|
|
RELEASE_MISSION_SFX_AUDIO_BANK(MISSION_SFX_VOMIT)
|
|
|
|
REMOVE_PTFX_ASSET()
|
|
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
|
|
|
|
//destroy scripted camera
|
|
IF DOES_CAM_EXIST(ScriptedCamera)
|
|
SET_CAM_ACTIVE(ScriptedCamera, FALSE)
|
|
IF GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_ON_FOOT) = CAM_VIEW_MODE_FIRST_PERSON
|
|
RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
ELSE
|
|
STOP_RENDERING_SCRIPT_CAMS_USING_CATCH_UP()
|
|
ENDIF
|
|
DESTROY_CAM(ScriptedCamera)
|
|
DISPLAY_RADAR(TRUE)
|
|
DISPLAY_HUD(TRUE)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Destroying scripted camera.")
|
|
#ENDIF
|
|
ENDIF
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
|
|
INFORM_MISSION_STATS_SYSTEM_OF_TIME_WINDOW_OPEN(FAM5_HOME_TIME)
|
|
|
|
iStageProgress++
|
|
|
|
BREAK
|
|
|
|
CASE 6
|
|
|
|
IF NOT HAS_LABEL_BEEN_TRIGGERED("FAM5_PUKE")
|
|
IF CREATE_CONVERSATION(Family5Conversation, "FAM5AUD", "FAM5_PUKE", CONV_PRIORITY_MEDIUM)
|
|
SET_LABEL_AS_TRIGGERED("FAM5_PUKE", TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//disable player camera control when camera is interpolating from script camera to gameplay camera
|
|
IF IS_INTERPOLATING_FROM_SCRIPT_CAMS()
|
|
DISABLE_CONTROL_ACTION(CAMERA_CONTROL, INPUT_LOOK_BEHIND)
|
|
DISABLE_CONTROL_ACTION(CAMERA_CONTROL, INPUT_VEH_LOOK_BEHIND)
|
|
DISABLE_CONTROL_ACTION(CAMERA_CONTROL, INPUT_LOOK_LR)
|
|
DISABLE_CONTROL_ACTION(CAMERA_CONTROL, INPUT_LOOK_UD)
|
|
ENDIF
|
|
|
|
MANAGE_AMBIENT_PEDS_SPEAKING_TO_PED(PLAYER_PED_ID(), iAmbientSpeechTimer)
|
|
|
|
//display locates information, blip, god text etc, take care of cops
|
|
IS_PLAYER_AT_LOCATION_ANY_MEANS(sLocatesData, vKitchenCoords, << 0.25, 0.25, LOCATE_SIZE_HEIGHT >>, TRUE, sLabelOBJ, TRUE)
|
|
|
|
//handle requestting mocap cutscene
|
|
IF IS_PLAYER_BROWSING_ITEMS_IN_ANY_SHOP()
|
|
OR IS_PLAYER_CHANGING_CLOTHES()
|
|
|
|
IF HAS_THIS_CUTSCENE_LOADED("family_5_mcs_5_p4")
|
|
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()), vKitchenCoords) < DEFAULT_CUTSCENE_LOAD_DIST / 2
|
|
|
|
REQUEST_CUTSCENE("family_5_mcs_5_p4")
|
|
|
|
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", PLAYER_PED_ID()) //Michael's variations
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting cutscene ped components for cutscene ped Michael from player ped.")
|
|
#ENDIF
|
|
ENDIF
|
|
|
|
IF NOT DOES_ENTITY_EXIST(osNote.ObjectIndex)
|
|
IF HAS_MISSION_OBJECT_BEEN_CREATED(osNote, TRUE)
|
|
FREEZE_ENTITY_POSITION(osNote.ObjectIndex, TRUE)
|
|
SET_ENTITY_INVINCIBLE(osNote.ObjectIndex, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
IF HAS_THIS_CUTSCENE_LOADED("family_5_mcs_5_p4")
|
|
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 IS_AUDIO_SCENE_ACTIVE("FAMILY_5_WAKE_UP_VOMIT") //FAMILY_5_WAKE_UP_VOMIT
|
|
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) //starts as soon as vomit scene fades in
|
|
IF IS_PED_GETTING_INTO_A_VEHICLE(PLAYER_PED_ID()) //stops as soon as player stars to enter any vehicle
|
|
OR GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID()) <> NULL
|
|
STOP_AUDIO_SCENE("FAMILY_5_WAKE_UP_VOMIT")
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("FAMILY_5_GO_HOME") //FAMILY_5_GO_HOME
|
|
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) //starts when player gets into any vehicle
|
|
START_AUDIO_SCENE("FAMILY_5_GO_HOME") //stops when player exist vehicle after arriving at Michael's house
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_AUDIO_SCENE_ACTIVE("FAMILY_5_GO_HOME")
|
|
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
IF GET_DISTANCE_BETWEEN_COORDS(vKitchenCoords, GET_ENTITY_COORDS(PLAYER_PED_ID())) < 20.0
|
|
STOP_AUDIO_SCENE("FAMILY_5_WAKE_UP_VOMIT")
|
|
STOP_AUDIO_SCENE("FAMILY_5_GO_HOME")
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("FAMILY_5_GO_HOME_INT")
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-799.520630,187.521057,71.105469>>, <<-795.681763,177.692230,74.834709>>, 6.0)
|
|
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-804.679260,183.043533,70.847778>>, <<-816.280396,178.596970,75.153091>>, 6.0)
|
|
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-803.700134,185.895218,71.105469>>, <<-800.207031,176.436371,74.834709>>, 4.0)
|
|
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-801.559814,168.317978,71.334709>>, <<-805.525635,178.113297,74.834709>>, 8.0)
|
|
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-811.660278,182.266098,70.653091>>, <<-805.412842,184.612473,76.002815>>, 2.5)
|
|
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-806.901978,185.396698,73.504105>>, <<-804.658386,179.531998,78.740730>>, 2.5)
|
|
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-800.397156,179.202255,75.240730>>, <<-809.928223,175.562454,78.740730>>, 4.0)
|
|
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-807.917725,176.369095,70.834709>>, <<-808.785706,178.632828,74.653091>>, 2.0)
|
|
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-802.726013,176.068436,75.240730>>, <<-799.839966,168.956497,78.740730>>, 3.5)
|
|
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-809.094360,180.614655,75.240730>>, <<-816.723267,177.806808,78.862457>>, 8.0)
|
|
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-810.866333,175.499969,75.240730>>, <<-814.803284,173.922989,78.740730>>, 3.6)
|
|
OR IS_ENTITY_IN_ANGLED_AREA( PLAYER_PED_ID(), <<-802.712769,167.797989,75.240730>>, <<-805.571716,175.191330,78.740730>>, 3.0)
|
|
STOP_AUDIO_SCENE("FAMILY_5_WAKE_UP_VOMIT")
|
|
STOP_AUDIO_SCENE("FAMILY_5_GO_HOME")
|
|
START_AUDIO_SCENE("FAMILY_5_GO_HOME_INT")
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Starting audio scene FAMILY_5_GO_HOME_INT, player is in the house.")
|
|
#ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_AUDIO_SCENE_ACTIVE("FAMILY_5_GO_HOME_INT")
|
|
IF NOT IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-799.520630,187.521057,71.105469>>, <<-795.681763,177.692230,74.834709>>, 6.0)
|
|
AND NOT IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-804.679260,183.043533,70.847778>>, <<-816.280396,178.596970,75.153091>>, 6.0)
|
|
AND NOT IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-803.700134,185.895218,71.105469>>, <<-800.207031,176.436371,74.834709>>, 4.0)
|
|
AND NOT IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-801.559814,168.317978,71.334709>>, <<-805.525635,178.113297,74.834709>>, 8.0)
|
|
AND NOT IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-811.660278,182.266098,70.653091>>, <<-805.412842,184.612473,76.002815>>, 2.5)
|
|
AND NOT IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-806.901978,185.396698,73.504105>>, <<-804.658386,179.531998,78.740730>>, 2.5)
|
|
AND NOT IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-800.397156,179.202255,75.240730>>, <<-809.928223,175.562454,78.740730>>, 4.0)
|
|
AND NOT IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-807.917725,176.369095,70.834709>>, <<-808.785706,178.632828,74.653091>>, 2.0)
|
|
AND NOT IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-802.726013,176.068436,75.240730>>, <<-799.839966,168.956497,78.740730>>, 3.5)
|
|
AND NOT IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-809.094360,180.614655,75.240730>>, <<-816.723267,177.806808,78.862457>>, 8.0)
|
|
AND NOT IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-810.866333,175.499969,75.240730>>, <<-814.803284,173.922989,78.740730>>, 3.6)
|
|
AND NOT IS_ENTITY_IN_ANGLED_AREA( PLAYER_PED_ID(), <<-802.712769,167.797989,75.240730>>, <<-805.571716,175.191330,78.740730>>, 3.0)
|
|
STOP_AUDIO_SCENE("FAMILY_5_GO_HOME_INT")
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Stopping audio scene FAMILY_5_GO_HOME_INT, player is not in the house.")
|
|
#ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
|
|
|
|
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
OR IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
|
|
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), << -801.42, 182.86, 73.10 >>, << 2.25, 2.25, 2.25 >>)
|
|
|
|
KILL_ANY_CONVERSATION()
|
|
KILL_FACE_TO_FACE_CONVERSATION()
|
|
CLEAR_MISSION_LOCATION_TEXT_AND_BLIPS(sLocatesData)
|
|
|
|
INFORM_MISSION_STATS_SYSTEM_OF_TIME_WINDOW_CLOSED()
|
|
|
|
bLeadInTriggered = TRUE //cutscene is about to start
|
|
|
|
iStageProgress++
|
|
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), << -800.80, 183.71 ,73.50 >>, << 1.5, 1.25, 2.0 >>)
|
|
|
|
KILL_ANY_CONVERSATION()
|
|
KILL_FACE_TO_FACE_CONVERSATION()
|
|
CLEAR_MISSION_LOCATION_TEXT_AND_BLIPS(sLocatesData)
|
|
|
|
INFORM_MISSION_STATS_SYSTEM_OF_TIME_WINDOW_CLOSED()
|
|
|
|
bLeadInTriggered = TRUE //cutscene is about to start
|
|
|
|
iStageProgress++
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 7
|
|
|
|
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.0)
|
|
|
|
TASK_LEAVE_ANY_VEHICLE(PLAYER_PED_ID())
|
|
|
|
SETTIMERA(0)
|
|
|
|
iStageProgress++
|
|
|
|
ENDIF
|
|
ELSE
|
|
|
|
SETTIMERA(0)
|
|
|
|
iStageProgress++
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 8
|
|
|
|
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
AND NOT IS_PED_GETTING_UP(PLAYER_PED_ID())
|
|
AND NOT IS_PED_RAGDOLL(PLAYER_PED_ID())
|
|
|
|
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
KILL_ANY_CONVERSATION()
|
|
KILL_FACE_TO_FACE_CONVERSATION()
|
|
ENDIF
|
|
|
|
IF ( TIMERA() > 5000 )
|
|
OR NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
|
|
REPLAY_RECORD_BACK_FOR_TIME(10.0, 4.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
RETURN TRUE
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
RETURN FALSE
|
|
|
|
ENDFUNC
|
|
|
|
FUNC BOOL IS_MISSION_STAGE_CUTSCENE_END_1_COMPLETED(INT &iStageProgress)
|
|
|
|
SWITCH iStageProgress
|
|
|
|
CASE 0
|
|
|
|
IF HAS_REQUESTED_CUTSCENE_LOADED("family_5_mcs_5_p4")
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
IF DOES_ENTITY_EXIST(vsParkedVehicles[0].VehicleIndex)
|
|
IF NOT IS_ENTITY_DEAD(vsParkedVehicles[0].VehicleIndex)
|
|
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vsParkedVehicles[0].VehicleIndex)
|
|
bCutsceneTriggeredOnBike = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
MAKE_PED_SOBER(PLAYER_PED_ID())
|
|
REMOVE_PED_HELMET(PLAYER_PED_ID(), TRUE)
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(osNote.ObjectIndex)
|
|
IF NOT IS_ENTITY_DEAD(osNote.ObjectIndex)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(osNote.ObjectIndex, "Amanda_Note", CU_ANIMATE_AND_DELETE_EXISTING_SCRIPT_ENTITY, osNote.ModelName)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
STOP_AUDIO_SCENE("FAMILY_5_GO_HOME_INT")
|
|
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
|
|
|
|
START_CUTSCENE()
|
|
|
|
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, TRUE, FALSE)
|
|
|
|
iStageProgress++
|
|
|
|
ELSE
|
|
|
|
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
|
|
//Michael's variations
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", PLAYER_PED_ID())
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 1 //fade screen in if screen was faded out due to shit skip or debug skip
|
|
|
|
IF IS_CUTSCENE_PLAYING()
|
|
|
|
IF ( bCutsceneTriggeredOnBike = TRUE )
|
|
IF DOES_ENTITY_EXIST(vsParkedVehicles[0].VehicleIndex)
|
|
IF NOT IS_ENTITY_DEAD(vsParkedVehicles[0].VehicleIndex)
|
|
SET_ENTITY_COORDS(vsParkedVehicles[0].VehicleIndex, <<-824.9539, 174.8554, 69.8377>>)
|
|
SET_ENTITY_HEADING(vsParkedVehicles[0].VehicleIndex, 157.3586)
|
|
SET_VEHICLE_ON_GROUND_PROPERLY(vsParkedVehicles[0].VehicleIndex)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
VEHICLE_INDEX LastPlayerVehicleIndex
|
|
|
|
LastPlayerVehicleIndex = GET_PLAYERS_LAST_VEHICLE()
|
|
|
|
IF DOES_ENTITY_EXIST(LastPlayerVehicleIndex)
|
|
IF NOT IS_ENTITY_DEAD(LastPlayerVehicleIndex)
|
|
|
|
IF GET_DISTANCE_BETWEEN_COORDS(vKitchenCoords, GET_ENTITY_COORDS(LastPlayerVehicleIndex)) < 20.0
|
|
OR IS_ENTITY_AT_COORD(LastPlayerVehicleIndex, << -826.78, 177.64, 72.13 >>,<< 12.0, 12.0, 8.0>>) //try 16.0 for bigger area
|
|
|
|
IF NOT IS_VEHICLE_IN_PLAYERS_GARAGE(LastPlayerVehicleIndex, CHAR_MICHAEL, TRUE)
|
|
|
|
IF NOT IS_ENTITY_A_MISSION_ENTITY(LastPlayerVehicleIndex)
|
|
SET_ENTITY_AS_MISSION_ENTITY(LastPlayerVehicleIndex)
|
|
ENDIF
|
|
|
|
STOP_VEHICLE_FIRE(LastPlayerVehicleIndex)
|
|
|
|
SET_ENTITY_COORDS(LastPlayerVehicleIndex, << -825.8718, 157.3143, 69.4619 >>)
|
|
SET_ENTITY_HEADING(LastPlayerVehicleIndex, 90.0)
|
|
//SET_ENTITY_COORDS(LastPlayerVehicleIndex, sVehicleGenDataStruct.coords)
|
|
//SET_ENTITY_HEADING(LastPlayerVehicleIndex, sVehicleGenDataStruct.heading)
|
|
SET_VEHICLE_ON_GROUND_PROPERLY(LastPlayerVehicleIndex)
|
|
SET_VEHICLE_DOORS_SHUT(LastPlayerVehicleIndex, TRUE)
|
|
SET_VEHICLE_ENGINE_ON(LastPlayerVehicleIndex, FALSE, TRUE)
|
|
SET_MISSION_VEHICLE_GEN_VEHICLE(LastPlayerVehicleIndex, << -825.8718, 157.3143, 69.4619 >>, 90.0)
|
|
|
|
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//fix for B*1711336, comment out clear are and clear objects as it is causing
|
|
//props on the kitchen counter to clear and pop back into the world
|
|
//CLEAR_AREA(MissionPosition.vStageStart, 25.0, TRUE)
|
|
//CLEAR_AREA_OF_OBJECTS(MissionPosition.vStageStart, 25.0)
|
|
CLEAR_AREA_OF_PEDS(MissionPosition.vStageStart, 25.0)
|
|
STOP_FIRE_IN_RANGE(MissionPosition.vStageStart, 25.0)
|
|
CLEAR_AREA_OF_VEHICLES(MissionPosition.vStageStart, 25.0)
|
|
CLEAR_AREA_OF_PROJECTILES(MissionPosition.vStageStart, 25.0)
|
|
REMOVE_PARTICLE_FX_IN_RANGE(MissionPosition.vStageStart, 25.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()
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
|
|
ENDIF
|
|
|
|
IF HAS_CUTSCENE_FINISHED()
|
|
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
|
|
REPLAY_STOP_EVENT()
|
|
iStageProgress++
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 3
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
|
|
TRIGGER_MISSION_STATS_UI(TRUE, TRUE)
|
|
|
|
iStageProgress++
|
|
|
|
BREAK
|
|
|
|
CASE 4
|
|
|
|
IF ( g_bResultScreenDisplaying = TRUE )
|
|
|
|
iStageProgress++
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 5
|
|
|
|
IF NOT IS_REPEAT_PLAY_ACTIVE()
|
|
|
|
RETURN TRUE
|
|
|
|
ELSE
|
|
|
|
IF ( g_bResultScreenDisplaying = FALSE )
|
|
|
|
RETURN TRUE
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
RETURN FALSE
|
|
|
|
ENDFUNC
|
|
|
|
FUNC BOOL IS_MISSION_STAGE_CUTSCENE_END_2_COMPLETED(INT &iStageProgress)
|
|
|
|
SWITCH iStageProgress
|
|
|
|
CASE 0
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
|
|
SET_PLAYER_PED_OUTFIT(MO_MISSION_END)
|
|
|
|
CLEAR_PED_WETNESS(PLAYER_PED_ID())
|
|
CLEAR_PED_DECORATIONS(PLAYER_PED_ID())
|
|
CLEAR_PED_BLOOD_DAMAGE(PLAYER_PED_ID())
|
|
RESET_PED_VISIBLE_DAMAGE(PLAYER_PED_ID())
|
|
SET_ENTITY_VISIBLE(PLAYER_PED_ID(), TRUE)
|
|
RESTORE_PLAYER_PED_TATTOOS(PLAYER_PED_ID())
|
|
|
|
WARP_PED(PLAYER_PED_ID(), MissionPosition.vStageStart, MissionPosition.fStartHeading, FALSE, FALSE, FALSE)
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
|
|
ENDIF
|
|
|
|
iStageProgress++
|
|
|
|
BREAK
|
|
|
|
CASE 1
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
IF HAVE_ALL_STREAMING_REQUESTS_COMPLETED(PLAYER_PED_ID())
|
|
|
|
iStageProgress++
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 2
|
|
|
|
IF HAS_REQUESTED_CUTSCENE_LOADED("family_5_mcs_5_p5") AND g_bResultScreenDisplaying = FALSE
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
|
|
|
|
START_CUTSCENE()
|
|
|
|
iStageProgress++
|
|
|
|
ELSE
|
|
|
|
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
|
|
//Michael's variations
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE("Michael", PLAYER_PED_ID())
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 3 //fade screen in if screen was faded out due to shit skip or debug skip
|
|
|
|
IF IS_CUTSCENE_PLAYING()
|
|
|
|
CLEAR_AREA(MissionPosition.vStageStart, 25.0, TRUE)
|
|
CLEAR_AREA_OF_PEDS(MissionPosition.vStageStart, 25.0)
|
|
CLEAR_AREA_OF_OBJECTS(MissionPosition.vStageStart, 25.0)
|
|
CLEAR_AREA_OF_VEHICLES(MissionPosition.vStageStart, 25.0)
|
|
CLEAR_AREA_OF_PROJECTILES(MissionPosition.vStageStart, 25.0)
|
|
REMOVE_PARTICLE_FX_IN_RANGE(MissionPosition.vStageStart, 25.0)
|
|
|
|
IF IS_SCREEN_FADED_OUT()
|
|
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
|
|
ENDIF
|
|
|
|
iStageProgress++
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 4
|
|
|
|
VEHICLE_INDEX LastPlayerVehicleIndex
|
|
|
|
LastPlayerVehicleIndex = GET_PLAYERS_LAST_VEHICLE()
|
|
|
|
IF DOES_ENTITY_EXIST(LastPlayerVehicleIndex)
|
|
IF NOT IS_ENTITY_DEAD(LastPlayerVehicleIndex)
|
|
IF IS_ENTITY_A_MISSION_ENTITY(LastPlayerVehicleIndex)
|
|
IF DOES_ENTITY_BELONG_TO_THIS_SCRIPT(LastPlayerVehicleIndex)
|
|
SET_VEHICLE_AS_NO_LONGER_NEEDED(LastPlayerVehicleIndex)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
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()
|
|
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
|
|
|
|
RETURN TRUE
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
RETURN FALSE
|
|
|
|
ENDFUNC
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
|
|
FUNC BOOL IS_MISSION_STAGE_TEST_COMPLETED(INT &iStageProgress)
|
|
|
|
BOOL bTimePassed
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(vsMichaelsCar.VehicleIndex)
|
|
AND NOT IS_PED_INJURED(psJimmy.PedIndex)
|
|
AND NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
|
|
SWITCH iStageProgress
|
|
|
|
CASE 0
|
|
|
|
REQUEST_ANIM_DICT("missfam5mcs_6")
|
|
|
|
IS_PLAYER_AT_LOCATION_WITH_BUDDY_IN_VEHICLE(sLocatesData, vMichaelsHouseCoords, g_vAnyMeansLocate , FALSE, psJimmy.PedIndex, vsMichaelsCar.VehicleIndex, sLabelOBJ, "CMN_JLEAVE", sLabelMGETIN, "CMN_GENGETBCKY", FALSE, TRUE)
|
|
|
|
IF ( iKickOutDelayTimer <> 0 )
|
|
|
|
DRAW_DEBUG_TEXT_ABOVE_ENTITY(vsMichaelsCar.VehicleIndex, GET_STRING_FROM_INT(CLAMP_INT(iKickOutDelayTime - ( GET_GAME_TIMER() - iKickOutDelayTimer ), 0, iKickOutDelayTime)), 2.25, 0, 255, 0)
|
|
|
|
IF HAS_TIME_PASSED(iKickOutDelayTime, iKickOutDelayTimer)
|
|
bTimePassed = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF ARE_PEDS_IN_VEHICLE_AT_SAFE_POSITION_FOR_INGAME_CUTSCENE(PLAYER_PED_ID(), psJimmy.PedIndex, vsMichaelsCar.VehicleIndex)
|
|
OR ( bCutsceneToggle = TRUE )
|
|
IF ( GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), vMichaelsHouseCoords) < fKickAnimationTriggerDistance )
|
|
OR ( bTimePassed = TRUE )
|
|
OR ( bCutsceneToggle = TRUE )
|
|
|
|
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
ENDIF
|
|
IF CREATE_CONVERSATION(Family5Conversation, "FAM5AUD", "FAM5_DSTOP", CONV_PRIORITY_MEDIUM)
|
|
SET_LABEL_AS_TRIGGERED("FAM5_DSTOP", TRUE)
|
|
ENDIF
|
|
|
|
CLEAR_MISSION_LOCATION_TEXT_AND_BLIPS(sLocatesData)
|
|
|
|
bCutsceneToggle = FALSE
|
|
|
|
iStageProgress++
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 1
|
|
|
|
REQUEST_ANIM_DICT("missfam5mcs_6")
|
|
|
|
SET_IN_VEHICLE_CAM_STATE_THIS_UPDATE(vsMichaelsCar.VehicleIndex, CAM_INSIDE_VEHICLE)
|
|
|
|
IF HAS_ANIM_DICT_LOADED("missfam5mcs_6")
|
|
|
|
IF IS_VEHICLE_ON_ALL_WHEELS(vsMichaelsCar.VehicleIndex)
|
|
IF BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(vsMichaelsCar.VehicleIndex, 5.0)
|
|
|
|
IF IS_VEHICLE_ON_ALL_WHEELS(vsMichaelsCar.VehicleIndex)
|
|
AND NOT IS_ENTITY_ON_FIRE(vsMichaelsCar.VehicleIndex)
|
|
|
|
INT iTotalLanes
|
|
FLOAT fHeading
|
|
FLOAT fVehicleHeading
|
|
VECTOR vVehiclePosition
|
|
VECTOR vClosestNodeToVehicle
|
|
|
|
vVehiclePosition = GET_ENTITY_COORDS(vsMichaelsCar.VehicleIndex)
|
|
fVehicleHeading = GET_ENTITY_HEADING(vsMichaelsCar.VehicleIndex)
|
|
|
|
IF GET_NTH_CLOSEST_VEHICLE_NODE_WITH_HEADING(vVehiclePosition, 1, vClosestNodeToVehicle, fHeading, iTotalLanes, NF_NONE)
|
|
|
|
SET_ENTITY_COORDS(vsMichaelsCar.VehicleIndex, vClosestNodeToVehicle)
|
|
SET_ENTITY_HEADING(vsMichaelsCar.VehicleIndex, fVehicleHeading)
|
|
SET_VEHICLE_ON_GROUND_PROPERLY(vsMichaelsCar.VehicleIndex)
|
|
|
|
ENDIF
|
|
|
|
CLEAR_AREA_OF_VEHICLES(GET_ENTITY_COORDS(vsMichaelsCar.VehicleIndex), 3.5)
|
|
CLEAR_AREA_OF_PROJECTILES(GET_ENTITY_COORDS(vsMichaelsCar.VehicleIndex), 3.0)
|
|
|
|
iSpeedZone = ADD_ROAD_NODE_SPEED_ZONE(GET_ENTITY_COORDS(vsMichaelsCar.VehicleIndex), 15.0, 0.0)
|
|
|
|
IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iKickOutSceneID)
|
|
|
|
iKickOutSceneID = CREATE_SYNCHRONIZED_SCENE(<< 0.0, 0.0,0.0>>, << 0.0, 0.0,0.0>>)
|
|
|
|
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(iKickOutSceneID, vsMichaelsCar.VehicleIndex, 0)
|
|
|
|
DESTROY_ALL_CAMS()
|
|
ScriptedCamera = CREATE_CAMERA(CAMTYPE_ANIMATED, TRUE)
|
|
PLAY_SYNCHRONIZED_CAM_ANIM(ScriptedCamera, iKickOutSceneID, "Push_Michael_Out_Cam", "missfam5mcs_6")
|
|
|
|
DISPLAY_HUD(FALSE)
|
|
DISPLAY_RADAR(FALSE)
|
|
RENDER_SCRIPT_CAMS(TRUE, FALSE)
|
|
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(vsMichaelsCar.VehicleIndex, iKickOutSceneID, "Push_Michael_Out_Car", "missfam5mcs_6", INSTANT_BLEND_IN, INSTANT_BLEND_OUT)
|
|
SET_ENTITY_COLLISION(vsMichaelsCar.VehicleIndex, FALSE)
|
|
|
|
CLEAR_PED_TASKS_IMMEDIATELY(psJimmy.PedIndex)
|
|
TASK_SYNCHRONIZED_SCENE(psJimmy.PedIndex, iKickOutSceneID, "missfam5mcs_6", "push_michael_out_jimmy", INSTANT_BLEND_IN, INSTANT_BLEND_OUT)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(psJimmy.PedIndex)
|
|
|
|
IF DOES_ENTITY_EXIST(osCup.ObjectIndex)
|
|
IF NOT IS_ENTITY_DEAD(osCup.ObjectIndex)
|
|
IF IS_ENTITY_ATTACHED(osCup.ObjectIndex)
|
|
DETACH_ENTITY(osCup.ObjectIndex, FALSE, TRUE)
|
|
ENDIF
|
|
ATTACH_ENTITY_TO_ENTITY(osCup.ObjectIndex, psJimmy.PedIndex, GET_PED_BONE_INDEX(psJimmy.PedIndex, BONETAG_PH_R_HAND), << 0.0, 0.0, 0.0 >>, << 0.0, 0.0, 0.0 >>)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
MAKE_PED_SOBER(PLAYER_PED_ID())
|
|
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
|
|
TASK_SYNCHRONIZED_SCENE(PLAYER_PED_ID(), iKickOutSceneID, "missfam5mcs_6", "push_michael_out_player0",
|
|
INSTANT_BLEND_IN, INSTANT_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS, RBF_NONE, INSTANT_BLEND_IN, AIK_DISABLE_LEG_IK)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID())
|
|
|
|
psJimmy.bHasTask = FALSE
|
|
bAnimationForced = FALSE
|
|
bAnimationsSwitched = FALSE
|
|
bPlayerRagdolledEarly = FALSE
|
|
bCleanupVehiclesForCamera = FALSE
|
|
|
|
SET_AUDIO_FLAG("DisableAbortConversationForRagdoll", TRUE)
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_LEAVE_CAMERA_CONTROL_ON)
|
|
|
|
iStageProgress++
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 2
|
|
|
|
RUN_VEHICLE_AND_CAMERA_CHECK()
|
|
|
|
REQUEST_ANIM_DICT("missfam5mcs_6drag")
|
|
|
|
IF NOT IS_PED_INJURED(psJimmy.PedIndex)
|
|
SET_PED_RESET_FLAG(psJimmy.PedIndex, PRF_ForceInstantSteeringWheelIkBlendIn, TRUE)
|
|
ENDIF
|
|
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(iKickOutSceneID)
|
|
|
|
DISABLE_CINEMATIC_BONNET_CAMERA_THIS_UPDATE()
|
|
DISABLE_CINEMATIC_VEHICLE_IDLE_MODE_THIS_UPDATE()
|
|
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(iKickOutSceneID) <= 0.630
|
|
SET_IN_VEHICLE_CAM_STATE_THIS_UPDATE(vsMichaelsCar.VehicleIndex, CAM_INSIDE_VEHICLE)
|
|
ENDIF
|
|
|
|
SET_VEHICLE_WILL_FORCE_OTHER_VEHICLES_TO_STOP(vsMichaelsCar.VehicleIndex, TRUE)
|
|
|
|
IF HAS_ANIM_EVENT_FIRED(psJimmy.PedIndex, GET_HASH_KEY("Detach"))
|
|
IF DOES_ENTITY_EXIST(osCup.ObjectIndex)
|
|
IF NOT IS_ENTITY_DEAD(osCup.ObjectIndex)
|
|
IF IS_ENTITY_ATTACHED(osCup.ObjectIndex)
|
|
DETACH_ENTITY(osCup.ObjectIndex, FALSE, TRUE)
|
|
ENDIF
|
|
DELETE_OBJECT(osCup.ObjectIndex)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_CAM_EXIST(ScriptedCamera)
|
|
|
|
IF NOT IS_CAM_RENDERING(ScriptedCamera)
|
|
DISPLAY_HUD(FALSE)
|
|
DISPLAY_RADAR(FALSE)
|
|
RENDER_SCRIPT_CAMS(TRUE, FALSE)
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("FAMILY_5_DRUGS_FOCUS_CAM")
|
|
STOP_AUDIO_SCENE("FAMILY_5_DRUGS")
|
|
START_AUDIO_SCENE("FAMILY_5_DRUGS_FOCUS_CAM")
|
|
ENDIF
|
|
ELSE
|
|
|
|
IF ( bCleanupVehiclesForCamera = FALSE )//cleanup vehicles near the camera and michael's animation positions
|
|
CLEANUP_VEHICLE_WITH_PEDS_NEAR_POINT(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(vsMichaelsCar.VehicleIndex, <<-0.7309, 2.7140, 0.4813>>), 2.5)
|
|
CLEANUP_VEHICLE_WITH_PEDS_NEAR_POINT(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(vsMichaelsCar.VehicleIndex, <<-3.6668, 0.1784, 0.4859>>), 2.5)
|
|
CLEANUP_VEHICLE_WITH_PEDS_NEAR_POINT(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(vsMichaelsCar.VehicleIndex, <<-2.1213, 0.5363, 0.4975>>), 2.5)
|
|
CLEANUP_VEHICLE_WITH_PEDS_NEAR_POINT(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(vsMichaelsCar.VehicleIndex, <<-1.4263, 1.9211, 4.8319>>), 2.5)
|
|
CLEANUP_VEHICLE_WITH_PEDS_NEAR_POINT(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(vsMichaelsCar.VehicleIndex, <<-3.342, -0.523, -0.1449>>), 2.5)
|
|
CLEANUP_VEHICLE_WITH_PEDS_NEAR_POINT(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(vsMichaelsCar.VehicleIndex, <<0.0000, 4.5000, 0.25000>>), 2.5)
|
|
CLEANUP_VEHICLE_WITH_PEDS_NEAR_POINT(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(vsMichaelsCar.VehicleIndex, <<-2.0859, 4.1187, 0.1689>>), 2.5)
|
|
CLEANUP_VEHICLE_WITH_PEDS_NEAR_POINT(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(vsMichaelsCar.VehicleIndex, <<0.00000, -4.000, 0.1689>>), 3.0)
|
|
bCleanupVehiclesForCamera = TRUE
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(iKickOutSceneID) > 0.75
|
|
|
|
IF ( psJimmy.bHasTask = FALSE )
|
|
|
|
KILL_CHASE_HINT_CAM(sCinematicCamStruct)
|
|
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(vsMichaelsCar.VehicleIndex, INSTANT_BLEND_OUT, TRUE)
|
|
SET_ENTITY_COLLISION(vsMichaelsCar.VehicleIndex, TRUE)
|
|
|
|
CLEAR_PED_TASKS(psJimmy.PedIndex)
|
|
SET_PED_INTO_VEHICLE(psJimmy.PedIndex, vsMichaelsCar.VehicleIndex, VS_DRIVER)
|
|
TASK_VEHICLE_MISSION_PED_TARGET(psJimmy.PedIndex, vsMichaelsCar.VehicleIndex, PLAYER_PED_ID(), MISSION_FLEE, 25.0, DRIVINGMODE_AVOIDCARS_RECKLESS | DF_SteerAroundPeds , 25.0, 2.0)
|
|
psJimmy.iTimer = GET_GAME_TIMER()
|
|
|
|
FailFlags[MISSION_FAIL_JIMMY_LEFT_BEHIND] = FALSE
|
|
FailFlags[MISSION_FAIL_MICHAELS_CAR_DEAD] = FALSE
|
|
FailFlags[MISSION_FAIL_MICHAELS_CAR_UNDRIVEABLE] = FALSE
|
|
|
|
psJimmy.bHasTask = TRUE
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF ( bAnimationsSwitched = FALSE )
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(iKickOutSceneID)
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(iKickOutSceneID) > 0.6275
|
|
DETACH_SYNCHRONIZED_SCENE(iKickOutSceneID)
|
|
SET_SYNCHRONIZED_SCENE_ORIGIN(iKickOutSceneID, GET_ENTITY_COORDS(vsMichaelsCar.VehicleIndex), GET_ENTITY_ROTATION(vsMichaelsCar.VehicleIndex))
|
|
CLEAR_PED_TASKS(PLAYER_PED_ID())
|
|
TASK_PLAY_ANIM(PLAYER_PED_ID(), "missfam5mcs_6", "push_michael_out_player0", INSTANT_BLEND_IN, SLOW_BLEND_OUT, -1, AF_ACTIVATE_RAGDOLL_ON_COLLISION, GET_SYNCHRONIZED_SCENE_PHASE(iKickOutSceneID), FALSE, AIK_DISABLE_LEG_IK)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID())
|
|
bAnimationsSwitched = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF ( bAnimationForced = FALSE )
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(iKickOutSceneID)
|
|
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(iKickOutSceneID) >= fAnimationForcePhase //0.780
|
|
|
|
IF ( bPlayerRagdolledEarly = TRUE )
|
|
|
|
TASK_SYNCHRONIZED_SCENE(PLAYER_PED_ID(), iKickOutSceneID, "missfam5mcs_6", "push_michael_out_player0",
|
|
INSTANT_BLEND_IN, SLOW_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT, RBF_VEHICLE_IMPACT)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID())
|
|
|
|
CLEAR_AREA_OF_VEHICLES(GET_ENTITY_COORDS(PLAYER_PED_ID()), 1.0)
|
|
|
|
bAnimationForced = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF ( bPlayerRagdolledEarly = FALSE )
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(iKickOutSceneID)
|
|
IF IS_PED_RAGDOLL(PLAYER_PED_ID())
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Player ped is ragdolling out of the synched scene early.")
|
|
#ENDIF
|
|
SET_PED_TO_RAGDOLL(PLAYER_PED_ID(), 10000, 10000, TASK_RELAX)
|
|
bPlayerRagdolledEarly = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_PED_GETTING_UP(PLAYER_PED_ID())
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Making player ped ragdoll as player ped was getting up.")
|
|
#ENDIF
|
|
SET_PED_TO_RAGDOLL(PLAYER_PED_ID(), 20000, 20000, TASK_RELAX)
|
|
ENDIF
|
|
|
|
IF ( bPlayerRagdolledEarly = FALSE )
|
|
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(iKickOutSceneID)
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(iKickOutSceneID) > 0.99
|
|
IF IS_PED_RAGDOLL(PLAYER_PED_ID())
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Kick out of car scene finished, player ragdolling normally.")
|
|
#ENDIF
|
|
iStageProgress++
|
|
ELSE
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Kick out of car scene finished, player not ragdolling.")
|
|
#ENDIF
|
|
iStageProgress++
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ELIF ( bPlayerRagdolledEarly = TRUE )
|
|
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(iKickOutSceneID)
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(iKickOutSceneID) > 0.99
|
|
iStageProgress++
|
|
ENDIF
|
|
ELSE
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Kick out of car scene finished with player ragdolling early.")
|
|
#ENDIF
|
|
iStageProgress++
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 3
|
|
|
|
RUN_VEHICLE_AND_CAMERA_CHECK()
|
|
|
|
iKickOutSceneID = CREATE_SYNCHRONIZED_SCENE(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_ROTATION(PLAYER_PED_ID()))
|
|
|
|
SET_SYNCHRONIZED_SCENE_PHASE(iKickOutSceneID, 0.0)
|
|
SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(iKickOutSceneID, TRUE)
|
|
|
|
CLEAR_AREA_OF_VEHICLES(GET_ENTITY_COORDS(PLAYER_PED_ID()), 1.5)
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
TASK_SYNCHRONIZED_SCENE(PLAYER_PED_ID(), iKickOutSceneID, "missfam5mcs_6drag", "fam_5_mcs_6_drag_michael",
|
|
INSTANT_BLEND_IN, INSTANT_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS | SYNCED_SCENE_DONT_INTERRUPT,
|
|
RBF_VEHICLE_IMPACT, INSTANT_BLEND_IN, AIK_DISABLE_LEG_IK)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID())
|
|
ENDIF
|
|
|
|
PLAY_SYNCHRONIZED_CAM_ANIM(ScriptedCamera, iKickOutSceneID, "fam_5_mcs_6_drag_cam", "missfam5mcs_6drag")
|
|
|
|
iStageProgress++
|
|
|
|
BREAK
|
|
|
|
CASE 4
|
|
|
|
RUN_VEHICLE_AND_CAMERA_CHECK()
|
|
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(iKickOutSceneID)
|
|
|
|
IF NOT DOES_CAM_EXIST(UndergroundCamera)
|
|
UndergroundCamera = CREATE_CAMERA(CAMTYPE_SCRIPTED, FALSE)
|
|
SET_CAM_PARAMS(UndergroundCamera, <<-20.194494,-219.796371,37.580395>>, <<-81.945038,-1.126925,-11.828329>>, 29.0)
|
|
ENDIF
|
|
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(iKickOutSceneID) >= 0.99
|
|
|
|
IF DOES_CAM_EXIST(UndergroundCamera)
|
|
SET_CAM_ACTIVE(UndergroundCamera, TRUE)
|
|
ENDIF
|
|
|
|
iStageProgress++
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 5
|
|
|
|
RUN_VEHICLE_AND_CAMERA_CHECK()
|
|
|
|
IF DOES_CAM_EXIST(UndergroundCamera) AND IS_CAM_RENDERING(UndergroundCamera)
|
|
|
|
iStageProgress++
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 6
|
|
|
|
RUN_VEHICLE_AND_CAMERA_CHECK()
|
|
|
|
IF DOES_CAM_EXIST(UndergroundCamera) AND IS_CAM_RENDERING(UndergroundCamera)
|
|
|
|
SET_CINEMATIC_MODE_ACTIVE(FALSE)
|
|
KILL_CHASE_HINT_CAM(sCinematicCamStruct)
|
|
|
|
REMOVE_ROAD_NODE_SPEED_ZONE(iSpeedZone)
|
|
|
|
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
|
|
CLEAR_PED_TASKS_IMMEDIATELY(psJimmy.PedIndex)
|
|
|
|
DELETE_PED(psJimmy.PedIndex)
|
|
DELETE_VEHICLE(vsMichaelsCar.VehicleIndex)
|
|
|
|
STOP_AUDIO_SCENE("FAMILY_5_DRUGS")
|
|
STOP_AUDIO_SCENE("FAMILY_5_DRUGS_FOCUS_CAM")
|
|
|
|
REMOVE_ANIM_DICT("missfam5mcs_6")
|
|
REMOVE_ANIM_DICT("missfam5_drink")
|
|
REMOVE_ANIM_DICT("missfam5mcs_6drag")
|
|
|
|
ANIMPOSTFX_STOP("DrugsDrivingIn")
|
|
//ANIMPOSTFX_PLAY("DMT_flight", 0, TRUE)
|
|
|
|
QUIT_DRUNK_CAMERA_IMMEDIATELY()
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
|
|
SET_AUDIO_FLAG("DisableAbortConversationForRagdoll", FALSE)
|
|
|
|
DESTROY_ALL_CAMS()
|
|
RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
|
|
//RETURN TRUE
|
|
iStageProgress++
|
|
|
|
|
|
ENDIF
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
|
|
ENDFUNC
|
|
|
|
#ENDIF
|
|
|
|
PROC MISSION_CLEANUP()
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Starting mission cleanup.")
|
|
DELETE_DEBUG_WIDGETS()
|
|
#ENDIF
|
|
|
|
//remove vehicles and peds
|
|
IF DOES_ENTITY_EXIST(vsMichaelsCar.VehicleIndex)
|
|
IF IS_VEHICLE_DRIVEABLE(vsMichaelsCar.VehicleIndex)
|
|
SET_VEHICLE_AUTOMATICALLY_ATTACHES(vsMichaelsCar.VehicleIndex, TRUE)
|
|
SET_VEHICLE_DOORS_LOCKED(vsMichaelsCar.VehicleIndex, VEHICLELOCK_UNLOCKED)
|
|
ENDIF
|
|
IF NOT IS_ENTITY_DEAD(vsMichaelsCar.VehicleIndex)
|
|
IF IS_ENTITY_A_MISSION_ENTITY(vsMichaelsCar.VehicleIndex)
|
|
AND DOES_ENTITY_BELONG_TO_THIS_SCRIPT(vsMichaelsCar.VehicleIndex)
|
|
SET_VEHICLE_AS_NO_LONGER_NEEDED(vsMichaelsCar.VehicleIndex)
|
|
ENDIF
|
|
ELSE
|
|
SET_VEHICLE_AS_NO_LONGER_NEEDED(vsMichaelsCar.VehicleIndex)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
CLEANUP_PED(psAmanda, IS_SCREEN_FADED_OUT(), FALSE)
|
|
CLEANUP_PED(psFabien, IS_SCREEN_FADED_OUT(), FALSE)
|
|
CLEANUP_PED(psJimmy, IS_SCREEN_FADED_OUT(), FALSE)
|
|
CLEANUP_PED(psDealer, IS_SCREEN_FADED_OUT(), FALSE)
|
|
|
|
IF DOES_ENTITY_EXIST(vsParkedVehicles[0].VehicleIndex)
|
|
IF NOT IS_ENTITY_DEAD(vsParkedVehicles[0].VehicleIndex)
|
|
IF IS_ENTITY_A_MISSION_ENTITY(vsParkedVehicles[0].VehicleIndex)
|
|
AND DOES_ENTITY_BELONG_TO_THIS_SCRIPT(vsParkedVehicles[0].VehicleIndex)
|
|
SET_VEHICLE_AS_NO_LONGER_NEEDED(vsParkedVehicles[0].VehicleIndex)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//remove objects
|
|
IF DOES_ENTITY_EXIST(osBSDoorDummy.ObjectIndex)
|
|
REMOVE_MODEL_HIDE(osBSDoor.vPosition, 1.0, osBSDoor.ModelName, NOT IS_SCREEN_FADED_OUT())
|
|
ENDIF
|
|
|
|
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(osNecklace, IS_SCREEN_FADED_OUT())
|
|
CLEANUP_MISSION_OBJECT(osGamepad, IS_SCREEN_FADED_OUT())
|
|
CLEANUP_MISSION_OBJECT(osHeadset, IS_SCREEN_FADED_OUT())
|
|
CLEANUP_MISSION_OBJECT(osCup, IS_SCREEN_FADED_OUT())
|
|
CLEANUP_MISSION_OBJECT(osNote, IS_SCREEN_FADED_OUT())
|
|
CLEANUP_MISSION_OBJECT(osCiggy, IS_SCREEN_FADED_OUT())
|
|
CLEANUP_MISSION_OBJECT(osMethBag, IS_SCREEN_FADED_OUT())
|
|
CLEANUP_MISSION_OBJECT(osBSDoor, FALSE)
|
|
CLEANUP_MISSION_OBJECT(osBSDoorDummy, IS_SCREEN_FADED_OUT())
|
|
CLEANUP_MISSION_OBJECT(osLeftDoorDummy, IS_SCREEN_FADED_OUT())
|
|
CLEANUP_MISSION_OBJECT(osRightDoorDummy, IS_SCREEN_FADED_OUT())
|
|
CLEANUP_MISSION_OBJECT_GROUP(osYogaMats, IS_SCREEN_FADED_OUT())
|
|
|
|
REMOVE_ANIM_DICT("missfam5_yoga")
|
|
REMOVE_ANIM_DICT("missfam5mcs_6")
|
|
REMOVE_ANIM_DICT("missfam5_drink")
|
|
REMOVE_ANIM_DICT("missfam5_flying")
|
|
REMOVE_ANIM_DICT("missfam5mcs_6drag")
|
|
REMOVE_ANIM_DICT("missfam5_wet_walk")
|
|
REMOVE_ANIM_DICT("missfam5_blackout")
|
|
REMOVE_ANIM_DICT("missfam2mcs_intp1")
|
|
|
|
REMOVE_ANIM_DICT("missfam5mcs_4leadin")
|
|
REMOVE_ANIM_DICT("missfam5leadinoutmcs_5")
|
|
|
|
KillAllConversations()
|
|
|
|
SET_MAX_WANTED_LEVEL(5)
|
|
SET_WANTED_LEVEL_MULTIPLIER(1.0)
|
|
SET_CREATE_RANDOM_COPS(TRUE)
|
|
|
|
SET_PED_POPULATION_BUDGET(3)
|
|
SET_VEHICLE_POPULATION_BUDGET(3)
|
|
|
|
SET_PED_MODEL_IS_SUPPRESSED(U_M_Y_BURGERDRUG_01, FALSE)
|
|
SET_VEHICLE_MODEL_IS_SUPPRESSED(GET_PLAYER_VEH_MODEL(CHAR_MICHAEL), FALSE)
|
|
SET_VEHICLE_MODEL_IS_SUPPRESSED(POLICE, FALSE)
|
|
|
|
REMOVE_VEHICLE_ASSET(GET_PLAYER_VEH_MODEL(CHAR_MICHAEL))
|
|
|
|
//enable the phone
|
|
DISABLE_CELLPHONE(FALSE)
|
|
RELEASE_SUPPRESSED_EMERGENCY_CALLS()
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
|
|
DISPLAY_RADAR(TRUE)
|
|
|
|
QUIT_DRUNK_CAMERA_IMMEDIATELY()
|
|
STOP_GAMEPLAY_CAM_SHAKING(TRUE)
|
|
STOP_CUTSCENE_CAM_SHAKING(TRUE)
|
|
|
|
IF DOES_CAM_EXIST(ScriptedCamera)
|
|
SET_CAM_ACTIVE(ScriptedCamera, FALSE)
|
|
DESTROY_CAM(ScriptedCamera)
|
|
ENDIF
|
|
|
|
IF DOES_CAM_EXIST(UndergroundCamera)
|
|
SET_CAM_ACTIVE(UndergroundCamera, FALSE)
|
|
DESTROY_CAM(UndergroundCamera)
|
|
ENDIF
|
|
|
|
IF DOES_CAM_EXIST(AnimatedCamera)
|
|
SET_CAM_ACTIVE(AnimatedCamera, FALSE)
|
|
DESTROY_CAM(AnimatedCamera)
|
|
ENDIF
|
|
|
|
DESTROY_ALL_CAMS()
|
|
RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
|
|
DISPLAY_HUD(TRUE)
|
|
DISPLAY_RADAR(TRUE)
|
|
|
|
REMOVE_PTFX_ASSET()
|
|
|
|
//stop all audio sfx
|
|
STOP_STREAM()
|
|
|
|
STOP_MISSION_SFX(MISSION_SFX_TAP)
|
|
STOP_MISSION_SFX(MISSION_SFX_VOMIT)
|
|
STOP_MISSION_SFX(MISSION_SFX_DRINK)
|
|
STOP_MISSION_SFX(MISSION_SFX_CHIMPS)
|
|
STOP_MISSION_SFX(MISSION_SFX_ALIENS)
|
|
STOP_MISSION_SFX(MISSION_SFX_HEARTBEAT)
|
|
RELEASE_SFX_SOUND_IDS()
|
|
RELEASE_SCRIPT_AUDIO_BANK()
|
|
UNREGISTER_SCRIPT_WITH_AUDIO()
|
|
STOP_AUDIO_SCENES()
|
|
RELEASE_NAMED_SCRIPT_AUDIO_BANK("FAM5_DRUG_FLIGHT_END")
|
|
RELEASE_NAMED_SCRIPT_AUDIO_BANK("FAM5_MICHAEL_LONG_SCREAM")
|
|
SET_AUDIO_SPECIAL_EFFECT_MODE(AUDIO_SPECIAL_EFFECT_MODE_NORMAL)
|
|
|
|
SET_STATIC_EMITTER_ENABLED("SE_MICHAELS_HOUSE_RADIO", TRUE)
|
|
|
|
SET_TIME_SCALE(1.0)
|
|
CLEAR_TIMECYCLE_MODIFIER()
|
|
CLEAR_WEATHER_TYPE_PERSIST()
|
|
ANIMPOSTFX_STOP("DMT_flight")
|
|
ANIMPOSTFX_STOP("DrugsDrivingIn")
|
|
ANIMPOSTFX_STOP("DrugsDrivingOut")
|
|
SET_PARTICLE_FX_CAM_INSIDE_VEHICLE(FALSE)
|
|
|
|
//stop all music
|
|
IF ( bYogaMusicPlaying = TRUE )
|
|
TRIGGER_MUSIC_EVENT("FAM5_YOGA_MUSIC_ENDS")
|
|
bYogaMusicPlaying = FALSE
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Triggering music event FAM5_YOGA_MUSIC_ENDS.")
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Stopping yoga music.")
|
|
#ENDIF
|
|
ENDIF
|
|
CANCEL_MUSIC_EVENT("FAM5_YOGA_MOVE_START")
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Cancelling music event FAM5_YOGA_MOVE_START.")
|
|
#ENDIF
|
|
|
|
MAKE_PED_SOBER(PLAYER_PED_ID())
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Making player ped sober on mission cleanup.")
|
|
#ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
IF IS_SCREEN_FADED_OUT()
|
|
CLEAR_PED_TASKS(PLAYER_PED_ID())
|
|
IF IS_PED_RAGDOLL(PLAYER_PED_ID())
|
|
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
|
|
ENDIF
|
|
ENDIF
|
|
SET_ENTITY_PROOFS(PLAYER_PED_ID(),FALSE, FALSE, FALSE, FALSE, FALSE)
|
|
REMOVE_WEAPON_FROM_PED(PLAYER_PED_ID(), GADGETTYPE_PARACHUTE)
|
|
SET_ENTITY_INVINCIBLE(PLAYER_PED_ID(), FALSE)
|
|
SET_FORCE_FOOTSTEP_UPDATE(PLAYER_PED_ID(), FALSE)
|
|
ENDIF
|
|
|
|
IF IS_DOOR_REGISTERED_WITH_SYSTEM(ENUM_TO_INT(DOORHASH_M_MANSION_R_L2))
|
|
DOOR_SYSTEM_SET_DOOR_STATE(ENUM_TO_INT(DOORHASH_M_MANSION_R_L2), DOORSTATE_UNLOCKED, FALSE, TRUE)
|
|
ENDIF
|
|
|
|
IF IS_DOOR_REGISTERED_WITH_SYSTEM(ENUM_TO_INT(DOORHASH_M_MANSION_R_R2))
|
|
DOOR_SYSTEM_SET_DOOR_STATE(ENUM_TO_INT(DOORHASH_M_MANSION_R_R2), DOORSTATE_UNLOCKED, FALSE, TRUE)
|
|
ENDIF
|
|
|
|
IF IS_DOOR_REGISTERED_WITH_SYSTEM(ENUM_TO_INT(DOORHASH_M_MANSION_SON))
|
|
REMOVE_DOOR_FROM_SYSTEM(ENUM_TO_INT(DOORHASH_M_MANSION_SON))
|
|
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_UNLOCKED, 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_UNLOCKED, FALSE, TRUE)
|
|
ENDIF
|
|
|
|
//enable the car gen on mission cleanup
|
|
DISABLE_VEHICLE_GEN_ON_MISSION(FALSE)
|
|
|
|
DISABLE_TV_CONTROLS(TV_LOC_JIMMY_BEDROOM, FALSE)
|
|
|
|
DISABLE_TAXI_HAILING(FALSE)
|
|
|
|
SET_ALL_SHOPS_TEMPORARILY_UNAVAILABLE(FALSE)
|
|
|
|
SET_MISSION_FLOW_FLAG_STATE(FLOWFLAG_MOVIE_STUDIO_OPEN, FALSE)
|
|
|
|
REMOVE_SCENARIO_BLOCKING_AREAS()
|
|
|
|
REMOVE_ROAD_NODE_SPEED_ZONE(iSpeedZone)
|
|
|
|
SET_TV_VOLUME(0)
|
|
|
|
SET_AUDIO_FLAG("DisableAbortConversationForRagdoll", FALSE)
|
|
|
|
ASSISTED_MOVEMENT_REMOVE_ROUTE("mansion_1")
|
|
ASSISTED_MOVEMENT_REMOVE_ROUTE("family5b")
|
|
ASSISTED_MOVEMENT_REMOVE_ROUTE("family5c")
|
|
ASSISTED_MOVEMENT_REMOVE_ROUTE("family5d")
|
|
ASSISTED_MOVEMENT_REMOVE_ROUTE("f5_jimmy1")
|
|
|
|
IF DOES_PARTICLE_FX_LOOPED_EXIST(ptfxPuke)
|
|
STOP_PARTICLE_FX_LOOPED(ptfxPuke)
|
|
ENDIF
|
|
|
|
SET_PLAYER_PED_DATA_IN_CUTSCENES(TRUE, TRUE)
|
|
|
|
SHUTDOWN_PC_SCRIPTED_CONTROLS()
|
|
|
|
REMOVE_IPL("SpaceInterior")
|
|
|
|
STAT_ENABLE_STATS_TRACKING()
|
|
SET_AUDIO_FLAG("DisableReplayScriptStreamRecording", FALSE)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Finished mission cleanup.")
|
|
#ENDIF
|
|
|
|
ENDPROC
|
|
|
|
//|============================= 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()
|
|
|
|
STOP_MISSION_SFX(MISSION_SFX_HEARTBEAT) //stop heartbeat, takes a while to fade out
|
|
|
|
MISSION_CLEANUP()
|
|
|
|
SET_BUILDING_STATE(BUILDINGNAME_IPL_YOGA_GAME, BUILDINGSTATE_DESTROYED, TRUE) //hide yoga props
|
|
|
|
IF ( g_eCurrentBuildingState[BUILDINGNAME_ES_MIC_JIMMYS_STUFF] = BUILDINGSTATE_DESTROYED )
|
|
OR ( g_eCurrentBuildingState[BUILDINGNAME_ES_MIC_AMANDAS_STUFF] = BUILDINGSTATE_DESTROYED )
|
|
OR ( g_eCurrentBuildingState[BUILDINGNAME_ES_FAMILY5_KITCHEN_BURGERSHOT] = BUILDINGSTATE_DESTROYED )
|
|
SET_BUILDING_STATE(BUILDINGNAME_ES_MIC_JIMMYS_STUFF, BUILDINGSTATE_NORMAL, TRUE) //unhide amanda's stuff
|
|
SET_BUILDING_STATE(BUILDINGNAME_ES_MIC_AMANDAS_STUFF, BUILDINGSTATE_NORMAL, TRUE) //unhide jimmy's stuff
|
|
SET_BUILDING_STATE(BUILDINGNAME_ES_MIC_DINING_ROOM_DEAD_FLOWERS, BUILDINGSTATE_NORMAL, TRUE) // Flowers are ok.
|
|
SET_BUILDING_STATE(BUILDINGNAME_ES_FAMILY5_KITCHEN_BURGERSHOT, BUILDINGSTATE_NORMAL, TRUE)//hide burger shot stuff
|
|
ENDIF
|
|
|
|
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_YOGA_WARRIOR), "YOGA - WARRIOR", FALSE)
|
|
ENDIF
|
|
|
|
|
|
IF IS_REPEAT_PLAY_ACTIVE()
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Repeat play is active.")
|
|
#ENDIF
|
|
|
|
IF NOT IS_REPLAY_IN_PROGRESS()
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Repeat play is active and mission replay is not in progress.")
|
|
#ENDIF
|
|
|
|
eMissionStage = MISSION_STAGE_CUTSCENE_INTRO
|
|
|
|
bReplayFlag = TRUE
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting local replay flag to TRUE for stage loading.")
|
|
#ENDIF
|
|
|
|
SET_CLOCK_TIME(IDEAL_MISSION_START_TIME, 0, 0)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting clock time to ", IDEAL_MISSION_START_TIME, ".")
|
|
#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
|
|
|
|
INIT_PC_SCRIPTED_CONTROLS("Yoga")
|
|
bSouthpaw = FALSE
|
|
|
|
WHILE TRUE
|
|
|
|
//check each frame if mission is failed due to fail conditions
|
|
//check unpinning interiors when far away from them
|
|
//check only if mission stage loading has finished
|
|
IF ( bLoadingFlag = TRUE )
|
|
RUN_FAIL_CHECKS(eMissionStage, eMissionFail)
|
|
RUN_INTERIOR_UNPINNING_CHECK(vInteriorPosition, 50.0)
|
|
ENDIF
|
|
|
|
//handle loading of sfx
|
|
RUN_MISSION_SFX_LOADING(eMissionSfx)
|
|
|
|
UPDATE_DRUGS_AUDIO_SCENE()
|
|
|
|
IF ( bBlackoutStagesActive = TRUE )
|
|
HIDE_LOADING_ON_FADE_THIS_FRAME()
|
|
ENDIF
|
|
|
|
REPLAY_CHECK_FOR_EVENT_THIS_FRAME("M_DidSomebodySayYoga")
|
|
|
|
SWITCH eMissionStage
|
|
|
|
CASE MISSION_STAGE_PRE_TIMELAPSE
|
|
|
|
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_TIMELAPSE_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
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_CUTSCENE_INTRO
|
|
|
|
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_COMPLETED(iMissionStageProgress)
|
|
RESET_MISSION_FLAGS()
|
|
eMissionStage = MISSION_STAGE_YOGA_WARRIOR
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_YOGA_WARRIOR
|
|
|
|
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)
|
|
SET_CLOCK_TIME(iStageTimeHours, iStageTimeMinutes, iStageTimeSeconds)
|
|
IF IS_MISSION_STAGE_YOGA_WARRIOR_COMPLETED(iMissionStageProgress)
|
|
RESET_MISSION_FLAGS()
|
|
eMissionStage = MISSION_STAGE_CUTSCENE_TRIANGLE
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_CUTSCENE_TRIANGLE
|
|
|
|
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_TRIANGLE_COMPLETED(iMissionStageProgress)
|
|
RESET_MISSION_FLAGS()
|
|
eMissionStage = MISSION_STAGE_YOGA_TRIANGLE
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_YOGA_TRIANGLE
|
|
|
|
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)
|
|
SET_CLOCK_TIME(iStageTimeHours, iStageTimeMinutes, iStageTimeSeconds)
|
|
IF IS_MISSION_STAGE_YOGA_TRIANGLE_COMPLETED(iMissionStageProgress)
|
|
RESET_MISSION_FLAGS()
|
|
eMissionStage = MISSION_STAGE_CUTSCENE_SUNSALUTATION
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_CUTSCENE_SUNSALUTATION
|
|
|
|
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_SUNSALUTATION_COMPLETED(iMissionStageProgress)
|
|
RESET_MISSION_FLAGS()
|
|
eMissionStage = MISSION_STAGE_YOGA_SUNSALUTATION
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_YOGA_SUNSALUTATION
|
|
|
|
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)
|
|
SET_CLOCK_TIME(iStageTimeHours, iStageTimeMinutes, iStageTimeSeconds)
|
|
IF IS_MISSION_STAGE_YOGA_SUNSALUTATION_COMPLETED(iMissionStageProgress)
|
|
RESET_MISSION_FLAGS()
|
|
SHUTDOWN_PC_SCRIPTED_CONTROLS()
|
|
eMissionStage = MISSION_STAGE_CUTSCENE_POOL
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_CUTSCENE_POOL
|
|
|
|
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_POOL_COMPLETED(iMissionStageProgress)
|
|
RESET_MISSION_FLAGS()
|
|
eMissionStage = MISSION_STAGE_GOTO_JIMMYS_ROOM
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_GOTO_JIMMYS_ROOM
|
|
IF IS_MISSION_STAGE_LOADED(eMissionStage, iStageSetupProgress, bLoadingFlag, bSkipFlag, bReplayFlag)
|
|
IF IS_MISSION_STAGE_GOTO_JIMMYS_ROOM_COMPLETED(iMissionStageProgress)
|
|
RESET_MISSION_FLAGS()
|
|
eMissionStage = MISSION_STAGE_CUTSCENE_JIMMYS_ROOM
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_CUTSCENE_JIMMYS_ROOM
|
|
IF IS_MISSION_STAGE_LOADED(eMissionStage, iStageSetupProgress, bLoadingFlag, bSkipFlag, bReplayFlag)
|
|
IF IS_MISSION_STAGE_CUTSCENE_JIMMYS_ROOM_COMPLETED(iMissionStageProgress)
|
|
RESET_MISSION_FLAGS()
|
|
eMissionStage = MISSION_STAGE_GOTO_BURGER_SHOT
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_GOTO_BURGER_SHOT
|
|
IF IS_MISSION_STAGE_LOADED(eMissionStage, iStageSetupProgress, bLoadingFlag, bSkipFlag, bReplayFlag)
|
|
IF IS_MISSION_STAGE_GOTO_BURGER_SHOT_COMPLETED(iMissionStageProgress)
|
|
RESET_MISSION_FLAGS()
|
|
eMissionStage = MISSION_STAGE_CUTSCENE_BURGER_SHOT
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_CUTSCENE_BURGER_SHOT
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.75)
|
|
IF IS_MISSION_STAGE_LOADED(eMissionStage, iStageSetupProgress, bLoadingFlag, bSkipFlag, bReplayFlag)
|
|
IF IS_MISSION_STAGE_CUTSCENE_BURGER_SHOT_COMPLETED(iMissionStageProgress)
|
|
RESET_MISSION_FLAGS()
|
|
eMissionStage = MISSION_STAGE_DRIVE_HOME
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_DRIVE_HOME
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.75)
|
|
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_BLACKOUT
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_CUTSCENE_BLACKOUT
|
|
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_BLACKOUT_COMPLETED(iMissionStageProgress)
|
|
RESET_MISSION_FLAGS()
|
|
eMissionStage = MISSION_STAGE_FLIGHT
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_FLIGHT
|
|
SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
IF IS_MISSION_STAGE_LOADED(eMissionStage, iStageSetupProgress, bLoadingFlag, bSkipFlag, bReplayFlag)
|
|
IF IS_MISSION_STAGE_FLIGHT_COMPLETED(iMissionStageProgress)
|
|
RESET_MISSION_FLAGS()
|
|
eMissionStage = MISSION_STAGE_GO_HOME_WASTED
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_GO_HOME_WASTED
|
|
IF IS_MISSION_STAGE_LOADED(eMissionStage, iStageSetupProgress, bLoadingFlag, bSkipFlag, bReplayFlag)
|
|
IF IS_MISSION_STAGE_GO_HOME_WASTED_COMPLETED(iMissionStageProgress)
|
|
RESET_MISSION_FLAGS()
|
|
eMissionStage = MISSION_STAGE_CUTSCENE_END_1
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_CUTSCENE_END_1
|
|
IF IS_MISSION_STAGE_LOADED(eMissionStage, iStageSetupProgress, bLoadingFlag, bSkipFlag, bReplayFlag)
|
|
IF IS_MISSION_STAGE_CUTSCENE_END_1_COMPLETED(iMissionStageProgress)
|
|
RESET_MISSION_FLAGS()
|
|
IF NOT IS_REPEAT_PLAY_ACTIVE()
|
|
eMissionStage = MISSION_STAGE_CUTSCENE_END_2
|
|
ELSE
|
|
eMissionStage = MISSION_STAGE_PASSED
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_CUTSCENE_END_2
|
|
IF IS_MISSION_STAGE_LOADED(eMissionStage, iStageSetupProgress, bLoadingFlag, bSkipFlag, bReplayFlag)
|
|
IF IS_MISSION_STAGE_CUTSCENE_END_2_COMPLETED(iMissionStageProgress)
|
|
RESET_MISSION_FLAGS()
|
|
eMissionStage = MISSION_STAGE_PASSED
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
CASE MISSION_STAGE_TEST
|
|
IF IS_MISSION_STAGE_LOADED(eMissionStage, iStageSetupProgress, bLoadingFlag, bSkipFlag, bReplayFlag)
|
|
IF IS_MISSION_STAGE_TEST_COMPLETED(iMissionStageProgress)
|
|
RESET_MISSION_FLAGS()
|
|
eMissionStage = MISSION_STAGE_PASSED
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
#ENDIF
|
|
|
|
CASE MISSION_STAGE_PASSED
|
|
|
|
Mission_Flow_Mission_Passed()
|
|
|
|
MISSION_CLEANUP()
|
|
|
|
SET_BUILDING_STATE(BUILDINGNAME_IPL_YOGA_GAME, BUILDINGSTATE_DESTROYED) //hide yoga props
|
|
|
|
IF ( g_eCurrentBuildingState[BUILDINGNAME_ES_MIC_JIMMYS_STUFF] = BUILDINGSTATE_NORMAL )
|
|
OR ( g_eCurrentBuildingState[BUILDINGNAME_ES_MIC_AMANDAS_STUFF] = BUILDINGSTATE_NORMAL )
|
|
OR ( g_eCurrentBuildingState[BUILDINGNAME_ES_FAMILY5_KITCHEN_BURGERSHOT] = BUILDINGSTATE_NORMAL )
|
|
SET_BUILDING_STATE(BUILDINGNAME_ES_MIC_JIMMYS_STUFF, BUILDINGSTATE_DESTROYED) //hide amanda's stuff
|
|
SET_BUILDING_STATE(BUILDINGNAME_ES_MIC_AMANDAS_STUFF, BUILDINGSTATE_DESTROYED) //hide jimmy's stuff
|
|
SET_BUILDING_STATE(BUILDINGNAME_ES_MIC_DINING_ROOM_DEAD_FLOWERS, BUILDINGSTATE_DESTROYED) // Flowers are ok.
|
|
SET_BUILDING_STATE(BUILDINGNAME_ES_FAMILY5_KITCHEN_BURGERSHOT, BUILDINGSTATE_DESTROYED) //unhide burger shot stuff
|
|
ENDIF
|
|
|
|
TERMINATE_THIS_THREAD()
|
|
|
|
BREAK
|
|
|
|
CASE MISSION_STAGE_FAILED
|
|
|
|
SET_MISSION_FAILED_WITH_REASON(eMissionFail)
|
|
|
|
CLEAR_HELP()
|
|
CLEAR_PRINTS()
|
|
KILL_ANY_CONVERSATION()
|
|
|
|
STOP_MISSION_SFX(MISSION_SFX_HEARTBEAT) //stop heartbeat, takes a while to fade out
|
|
|
|
TRIGGER_MUSIC_EVENT("FAM5_YOGA_MUSIC_ENDS")
|
|
|
|
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
|
|
|
|
IF ( eMissionFail = MISSION_FAIL_YOGA_FAILED )
|
|
MISSION_FLOW_SET_FAIL_WARP_LOCATION(<<-791.1766, 185.8434, 71.8349>>, 188.7433) //on yoga fail position the player in the back garden
|
|
ENDIF
|
|
|
|
IF IS_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P0_YOGA)
|
|
SET_PLAYER_PED_OUTFIT(MO_YOGA_FLIP_FLOPS)
|
|
ENDIF
|
|
|
|
MISSION_CLEANUP()
|
|
|
|
SET_BUILDING_STATE(BUILDINGNAME_IPL_YOGA_GAME, BUILDINGSTATE_DESTROYED, NOT IS_SCREEN_FADED_OUT()) //hide yoga props
|
|
|
|
IF ( g_eCurrentBuildingState[BUILDINGNAME_ES_MIC_JIMMYS_STUFF] = BUILDINGSTATE_DESTROYED )
|
|
OR ( g_eCurrentBuildingState[BUILDINGNAME_ES_MIC_AMANDAS_STUFF] = BUILDINGSTATE_DESTROYED )
|
|
OR ( g_eCurrentBuildingState[BUILDINGNAME_ES_FAMILY5_KITCHEN_BURGERSHOT] = BUILDINGSTATE_DESTROYED )
|
|
SET_BUILDING_STATE(BUILDINGNAME_ES_MIC_JIMMYS_STUFF, BUILDINGSTATE_NORMAL, NOT IS_SCREEN_FADED_OUT()) //unhide amanda's stuff
|
|
SET_BUILDING_STATE(BUILDINGNAME_ES_MIC_AMANDAS_STUFF, BUILDINGSTATE_NORMAL, NOT IS_SCREEN_FADED_OUT()) //unhide jimmy's stuff
|
|
SET_BUILDING_STATE(BUILDINGNAME_ES_MIC_DINING_ROOM_DEAD_FLOWERS, BUILDINGSTATE_NORMAL, NOT IS_SCREEN_FADED_OUT()) // Flowers are ok.
|
|
SET_BUILDING_STATE(BUILDINGNAME_ES_FAMILY5_KITCHEN_BURGERSHOT, BUILDINGSTATE_NORMAL, NOT IS_SCREEN_FADED_OUT())//hide burger shot stuff
|
|
ENDIF
|
|
|
|
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
|
|
RUN_DEBUG_WIDGETS() //handle RAG widgets
|
|
#ENDIF
|
|
|
|
WAIT(0)
|
|
|
|
ENDWHILE
|
|
|
|
ENDSCRIPT
|