//|=======================================================================================| //| 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