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

5072 lines
263 KiB
Python
Executable File

// ******************************************************************************************************************
// ******************************************************************************************************************
//
// MISSION NAME : BailBond1.sc
// AUTHOR : Ahron Mason / prev Ste Kerrigan
// DESCRIPTION : Trevor apprehends bail jumpers at the quarry (vehicle chase)
//
// ******************************************************************************************************************
// ******************************************************************************************************************
//Compile out Title Update changes to header functions.
//Must be before includes.
//CONST_INT USE_TU_CHANGES 0 // Removed by Kenneth R.
USING "rage_builtins.sch"
USING "globals.sch"
USING "ambience_run_checks.sch"
USING "BailBond_include.sch"
USING "chase_hint_cam.sch" CHASE_HINT_CAM_STRUCT localChaseHintCamStruct
USING "clearmissionarea.sch"
USING "commands_audio.sch"
USING "commands_camera.sch"
USING "commands_pad.sch"
USING "commands_vehicle.sch"
USING "commands_path.sch"
USING "commands_ped.sch"
USING "commands_physics.sch"
USING "commands_script.sch"
USING "commands_task.sch"
USING "CompletionPercentage_public.sch"
using "dialogue_public.sch"
USING "flow_public_core_override.sch"
USING "flow_special_event_checks.sch"
using "ped_component_public.sch"
USING "player_ped_public.sch"
USING "RC_Area_public.sch"
USING "RC_helper_functions.sch"
USING "RC_threat_public.sch"
USING "replay_public.sch"
USING "script_blips.sch"
USING "script_ped.sch"
#IF IS_DEBUG_BUILD
USING "select_mission_stage.sch"
USING "shared_debug.sch"
#ENDIF
//----------------------------------------------------------------------------------------------------------------
// ENUMS
//----------------------------------------------------------------------------------------------------------------
/// PURPOSE: the stages of the mission
ENUM MISSION_STAGE
MISSION_STAGE_PLAYER_LOCATE_BAIL_JUMPER,
MISSION_STAGE_TRIGGER_BAIL_JUMPER_REACTION,
MISSION_STAGE_CHASE,
MISSION_STAGE_TAKE_TARGET_TO_MAUDE,
MISSION_STAGE_CUTSCENE_MAUDE_TAKES_TARGET,
MISSION_STAGE_MISSION_PASSED,
//Additional stages
MISSION_STAGE_LOSE_THE_COPS,
MISSION_STAGE_TARGET_FLEES_AGAIN,
MISSION_STAGE_MISSION_OVER_BAIL_JUMPER_KILLED,
MISSION_STAGE_MISSION_FAILED_WAIT_FOR_FADE
ENDENUM
/// PURPOSE: each mission stage uses these substages
ENUM SUB_STAGE
SS_SETUP,
SS_UPDATE,
SS_CLEANUP
ENDENUM
/// PURPOSE: used to set the way the player first spots the bail jumper
ENUM BB_PLAYER_SPOTS_BAIL_JUMPER_TYPE_ENUM
BB_PSBJT_PLAYER_SPOTS_BAIL_JUMPER_CLOSE_DISTANCE = 0,
BB_PSBJT_BAIL_JUMPER_SPOTS_PLAYER,
BB_PSBJT_PLAYER_SPOTS_BAIL_JUMPER_LONG_DISTANCE,
BB_PSBJT_PLAYER_SPOTS_BAIL_JUMPER_INTIMIDATED,
BB_PSBJT_INVALID
ENDENUM
/// PURPOSE: assets requested during the mission
ENUM MISSION_REQ
RQ_TEXT,
RQ_ANIMS,
RQ_PHONE_MODEL,
RQ_MAUDE_ANIM
ENDENUM
/// PURPOSE: list different ways player can pass the mission
ENUM MISSION_PASSED_CONDITION
BB_PASSED_DEFAULT,
BB_PASSED_TARGET_CAPTURED,
BB_PASSED_TARGET_KILLED
ENDENUM
/// PURPOSE: fail conditions
ENUM BAIL_BOND_FAILED_REASON_ENUM
BB_FAILED_DEFAULT = 0,
BB_FAILED_DIST_CLEANUP_BEFORE_ENCOUNTER,
BB_FAILED_BAIL_JUMPER_ESCAPED,
BB_FAILED_MAUDE_DIED,
BB_FAILED_MAUDE_ATTACKED
ENDENUM
/// used to determine the specific scenario type the bail bond is
ENUM BAILBOND_TYPE
BBT_SURRENDER,
BBT_BRAWL,
BBT_ONFOOT_FLEE,
BBT_VEHICLE_FLEE,
BBT_SHOOTOUT,
BBT_BASE_JUMP
ENDENUM
/// PURPOSE: ai states for the buddy peds
ENUM BUDDY_STATE
BS_WAITING,
BS_WAIT_PICK_REACT,
BS_COMBAT,
BS_BREAKOUT_ANIM,
BS_FLEE,
BS_DEAD
ENDENUM
/// PURPOSE: used to update mission peds behaviour
ENUM BB_PED_AI
//BB_PED_AI_SETUP_RELAXED,
BB_PED_AI_STATE_RELAXED,
BB_PED_AI_SETUP_ROUTINE,
BB_PED_AI_STATE_ROUTINE,
BB_PED_AI_SETUP_AWARE_OF_PLAYER,
BB_PED_AI_STATE_AWARE_OF_PLAYER,
BB_PED_AI_SETUP_MOVE_TOWARDS_PLAYER,
BB_PED_AI_STATE_MOVE_TOWARDS_PLAYER,
BB_PED_AI_SETUP_MELEE_ATTACK,
BB_PED_AI_STATE_MELEE_ATTACK,
BB_PED_AI_SETUP_BEATEN_UP,
BB_PED_AI_STATE_BEATEN_UP,
BB_PED_AI_SETUP_PLAYER_OUT_OF_REACH,
BB_PED_AI_STATE_PLAYER_OUT_OF_REACH,
BB_PED_AI_SETUP_FLEE_ON_FOOT,
BB_PED_AI_STATE_FLEE_ON_FOOT,
BB_PED_AI_SETUP_FLEE_TO_VEHICLE,
BB_PED_AI_STATE_FLEE_TO_VEHICLE,
BB_PED_AI_SETUP_FLEE_IN_VEHICLE,
BB_PED_AI_STATE_FLEE_IN_VEHICLE,
BB_PED_AI_SETUP_FRIGHTENED,
BB_PED_AI_STATE_FRIGHTENED,
BB_PED_AI_SETUP_FOLLOW_PLAYER,
BB_PED_AI_STATE_FOLLOW_PLAYER,
BB_PED_AI_SETUP_SURRENDERED,
BB_PED_AI_STATE_SURRENDERED,
BB_PED_AI_SETUP_PLAYER_LEFT_BEHIND,
BB_PED_AI_STATE_PLAYER_LEFT_BEHIND,
BB_PED_AI_SETUP_WAITING_IN_VEHICLE,
BB_PED_AI_STATE_WAITING_IN_VEHICLE,
BB_PED_AI_SETUP_AIM_GUN_AND_ADVANCE,
BB_PED_AI_STATE_AIM_GUN_AND_ADVANCE,
BB_PED_AI_SETUP_GUN_COMBAT,
BB_PED_AI_STATE_GUN_COMBAT,
BB_PED_AI_SETUP_TEMP_OVERRIDE_AI_CONTROL, // used when we need to perform a task which has to be handled outside of BB_PED_AI
BB_PED_AI_STATE_TEMP_OVERRIDE_AI_CONTROL // used when we need to perform a task which has to be handled outside of BB_PED_AI
ENDENUM
/// PURPOSE: track which clipset bail jumper is playing
ENUM BB_JUMPER_MOVEMENT_CLIPSET_STATE
BB_JUMPER_MOVEMENT_CLIPSET_UNSET,
BB_JUMPER_MOVEMENT_CLIPSET_NORMAL,
BB_JUMPER_MOVEMENT_CLIPSET_TAZERED
ENDENUM
//----------------------------------------------------------------------------------------------------------------
// STRUCTS
//----------------------------------------------------------------------------------------------------------------
/// PURPOSE: used by scripted peds in the mission - bail jumper, buddies
/// AI uses BB_PED_AI to set behaviours
STRUCT STRUCT_MISSION_PED
AI_BLIP_STRUCT blipAIStruct
BLIP_INDEX blipIndex
PED_INDEX pedIndex
BB_PED_AI AI
MODEL_NAMES mnModel
WEAPON_TYPE wtWeapon = WEAPONTYPE_INVALID
VECTOR vPosition
FLOAT fHeading
INT iTimer
INT iAiDelayTimer
INT iFrameCountLastSeenPlayer
ENDSTRUCT
STRUCT BUDDY
PED_INDEX index
VECTOR vPos
FLOAT fDir
WEAPON_TYPE wtWeapon = WEAPONTYPE_INVALID
AI_BLIP_STRUCT blipAIStruct
BUDDY_STATE state
INT iThinkTime //= GET_RANDOM_INT_IN_RANGE( 500, 1000 )
INT iTimeActivated
BOOL bActivated = FALSE
MODEL_NAMES model = DUMMY_MODEL_FOR_SCRIPT
ENDSTRUCT
STRUCT BAILBOND_PED
PED_INDEX index
VECTOR vPos
FLOAT fDir
WEAPON_TYPE wtWeapon = WEAPONTYPE_INVALID
MODEL_NAMES model = DUMMY_MODEL_FOR_SCRIPT
INT iPedTimer
ENDSTRUCT
/// PURPOSE: used by scripted vehicles in the mission - musician's car
STRUCT STRUCT_MISSION_VEHICLE
VEHICLE_INDEX vehIndex
MODEL_NAMES mnModel
VECTOR vPosition
FLOAT fHeading
ENDSTRUCT
STRUCT BAILBOND_VEHICLE
VEHICLE_INDEX index
VECTOR vPos
FLOAT fDir
MODEL_NAMES model = DUMMY_MODEL_FOR_SCRIPT
ENDSTRUCT
STRUCT BAILBOND_OBJECT
OBJECT_INDEX index
VECTOR vPos
FLOAT fDir
MODEL_NAMES model = DUMMY_MODEL_FOR_SCRIPT
ENDSTRUCT
STRUCT BAILBOND_PROP
OBJECT_INDEX index
VECTOR vPos
VECTOR vRot
FLOAT fDir
MODEL_NAMES model = DUMMY_MODEL_FOR_SCRIPT
ENDSTRUCT
STRUCT BAILBOND_PICKUP
PICKUP_INDEX index
MODEL_NAMES model = DUMMY_MODEL_FOR_SCRIPT
VECTOR vPos
//VECTOR vRot
//FLOAT fDir
PICKUP_TYPE type = PICKUP_CUSTOM_SCRIPT
INT iPlacementFlags
ENDSTRUCT
//----------------------------------------------------------------------------------------------------------------
// CONSTANTS
//----------------------------------------------------------------------------------------------------------------
CONST_FLOAT BAIL_BONDS_RANGE_TO_TARGET_BLIP 35.0
CONST_FLOAT BAIL_BONDS_RANGE_TO_TARGET_ACTIVE 25.0 //22.0
CONST_FLOAT BAIL_BONDS_INTIMIDATING_DETECTION_RANGE 25.0
CONST_FLOAT BAIL_BONDS_ESCAPED_DISTANCE 150.0 // fail distance for target escaping during chase
CONST_FLOAT BAIL_BONDS_CLEANUP_NOT_ACTIVATED_DISTANCE 200.0 // fail distance for target escaping during chase
CONST_FLOAT BAIL_BONDS_CHASE_BLIP_FLASH_PERCENTAGE 0.65 // targets blip flashes when he gets further than this percentage away to BAIL_BONDS_ESCAPED_DISTANCE
CONST_INT BAIL_BONDS_CP_AFTER_MOCAP 0 // Checkpoint
CONST_INT BAIL_BONDS_MAX_OBJECTS 8
CONST_INT BAIL_BONDS_MAX_PROPS 4
CONST_INT BAIL_BONDS_MAX_PICKUPS 1
CONST_INT BAIL_BONDS_MAX_VEHICLES 6
CONST_INT BAIL_BONDS_MAX_CHASE_POINTS 10
CONST_INT BAIL_BONDS_MAX_COP_CONVS 3
CONST_INT BAIL_BONDS_MAX_DRIVE_CONVOS 3
CONST_INT BAIL_BONDS_MAX_BACKUP_PEDS 6
CONST_INT MAUDE_1_CAMERA_CUT_TREV 0
CONST_INT MAUDE_1_CAMERA_CUT_MAUDE 1
CONST_INT MAUDE_1_MAX_CAMERA_CUTS 2
CONST_INT TREVOR_SPEAKER_ID 2 // Conversation speaker ID
CONST_INT BAIL_JUMPER_SPEAKER_ID 3 // Conversation speaker ID
CONST_INT MAUDE_SPEAKER_ID 4 // Conversation speaker ID
CONST_INT CAN_PED_SEE_PED_FRAME_COUNT_GRACE_PERIOD 10 // grace period in frame count for can ped see ped tests
CONST_INT LEAVE_PLAYER_GROUP_DISTANCE 25
CONST_INT REJOIN_PLAYER_GROUP_DISTANCE 8
CONST_INT DIST_LIMIT_PLAYER_TO_PED_FOR_DIALOGUE 30
CONST_INT CP_BB1_TRIGGER_BAIL_JUMPER_REACTION 0 // Initial mission replay checkpoint Note: this doesn't get set by the mission, but is used to skip over the phonecall
CONST_INT CP_BB1_MISSION_PASSED 1 // 1st mission replay checkpoint - used by shitskip
CONST_INT Z_SKIP_LOCATE_BAIL_JUMPER 0 // z skip stage
CONST_INT Z_SKIP_TRIGGER_BAIL_JUMPER_REACTION 1 // z skip stage
CONST_INT Z_SKIP_CHASE_BAIL_JUMPER 2 // z skip stage
CONST_INT Z_SKIP_TAKE_JUMPER_TO_MAUDE 3 // z skip stage
CONST_INT Z_SKIP_OUTRO_CUTSCENE 4 // z skip stage
CONST_INT Z_SKIP_MISSION_PASSED 5 // z skip stage
//-------------------------------------------------------------------------------------------------------------------------------------------------
// VARIABLES
//-------------------------------------------------------------------------------------------------------------------------------------------------
#IF IS_DEBUG_BUILD // debug stage skipping
CONST_INT MAX_SKIP_MENU_LENGTH 6
MissionStageMenuTextStruct mSkipMenu[MAX_SKIP_MENU_LENGTH]
#ENDIF
MISSION_STAGE eMissionStage = MISSION_STAGE_PLAYER_LOCATE_BAIL_JUMPER //track what MISSION stage we are at
MISSION_STAGE eMissionSkipTargetStage //used in mission checkpoint setup and debug stage skipping
SUB_STAGE eSubStage = SS_SETUP //Internal state tracking for mission stages
BB_PLAYER_SPOTS_BAIL_JUMPER_TYPE_ENUM ePlayerSpotsBailJumperType
BAIL_BOND_FAILED_REASON_ENUM eBB_MissionFailedReason
BAIL_BOND_LAUNCH_DATA sBailBondLaunchData // information set by the launcher which gets passed into the mission script
BAILBOND_TYPE eBailBondType // used to pick specific mission behaviour
STRUCT_MISSION_PED sBailJumperPed // the bail jumper
BB_JUMPER_MOVEMENT_CLIPSET_STATE eBailJumperClipset // track which clipset jumper is using
BUDDY sBackupPed[BAIL_BONDS_MAX_BACKUP_PEDS] // the bail jumper's backup peds
BAILBOND_VEHICLE sMissionVehicle[BAIL_BONDS_MAX_VEHICLES] // vehicles positioned for the mission
BAILBOND_OBJECT sObjectBailJumperPhone //sMissionObject[BAIL_BONDS_MAX_OBJECTS] // objects positioned for the mission
BAILBOND_PROP sMissionProp[BAIL_BONDS_MAX_PROPS] // props used by the mission
BAILBOND_PICKUP sMissionPickup[BAIL_BONDS_MAX_PICKUPS] // pickups used by the mission
BAILBOND_PED sMaude
BAILBOND_OBJECT sObjMaudeChair
BAILBOND_OBJECT sObjMaudeLaptop
BAILBOND_OBJECT sObjMaudeTable
BAILBOND_OBJECT sObjMaudeRadio // needed to prevent bug 1712317
BOOL bDoneDialogue_BailJumperBeginsToFlee
BOOL bDoneDialogue_BailJumperSurrendered
BOOL bDoneDialogue_TrevorResponsesToBailJumperSurrendering
BOOL bDoneDialogue_BailJumperNoticesCops
BOOL bDoneDialogue_DriveToMaudes[BAIL_BONDS_MAX_DRIVE_CONVOS]
BOOL bDoneDialogue_PlayerSpotsBailJumperCloseDistance
BOOL bDoneDialogue_PlayerSpotsBailJumperFromDistance
bool bDoneDialogue_BailJumperRespondToPlayerOrders
BOOL bDoneDialogue_PlayerGetsInVehicle
BOOL bDoneDialogue_PlayerGetsOutVehicle
BOOL bDoneDialogue_BailJumperSpotsPlayerFirst
BOOL bDoneDialogue_PlayerJackingPed
BOOL bDoneDialogue_IdleInVehicle
BOOL bDoneDialogue_MissionFailed
BOOL bDoneDialogue_BailJumperKilled
BOOL bDoneObjective_TakeBailJumperToMaude
BOOL bDoneObjective_ApproachBailJumper
BOOL bDoneObjective_ApprehendBailJumper
BOOL bDoneObjective_LoseWantedLevel
BOOL bDoneObjective_ReturnToBailJumper
BOOL bDoneHelp_UnsuitableVehicle
BOOL bFinishedStageSkipping = TRUE //used to determine if we are mission replay checkpoint skipping or debug skipping
BOOL bLoadedWorldForStageSkipping = FALSE // flag to say if we haveloaded the world around the player when stage skipping
BOOL bSetMaudeFleeSyncSceneExit = FALSE
//BOOL bAppliedParachuteTask = FALSE
BOOL bCleanupBailJumperLocationDuringDropOff
BOOL bConvoCoolDownActive = FALSE
BOOL bHasBailJumperSurrendered
BOOL bHasPlayerLeftBailJumperBehind
BOOL bRequireMissionCleanup = FALSE // used in the Script_Cleanup to determine if the mission has done it's setup and therefore needs a full cleanup
BOOL bSetupMaude
BOOL bRequestedOutroMocap
BOOL bIsJumperRevertingBackToFlee
BOOL bHasJumperBeenTazered
BLIP_INDEX blipIndexMaudesPlace
FLOAT fHeading_PlayerMissionStart // heading player gets set to when skipping back to the start of the the mission
FLOAT fHeading_PlayerWarpGetNearTarget // heading player gets set to when skipping the mission stage - MISSION_STAGE_PLAYER_LOCATE_BAIL_JUMPER
FLOAT fHeading_PlayerWarpApproachTarget // heading player gets set to when skipping the mission stage - MISSION_STAGE_TRIGGER_BAIL_JUMPER_REACTION
INT iChaseIndex = 0
INT iConvoCoolDown = 0
INT iDialogueTimer = 0
INT iDialogueTimerHandsUpDuringDropOff = 0
INT iDialogueTimer_MaudeAmbient
INT iFlashBlipTimer = 0
INT iFlashBlipGodTextTimer = 0
INT iNumMissionProps // the total number of mission props
INT iNumMissionVehicles // the total number of mission vehicles
INT iNumMissionObjects // the total number of mission objects
INT iNumMissionPickups // the total number of mission pickups
INT iNumChaseRoutePositions // the total number of goto locations
INT iNumTargetBackupPeds // the total number of bail jumper backup peds
INT iFrameCountPlayerLastSeenBailJumper
INT iDelay_SurrenderForPlayerCloseToWhileFleeing
INT iTime_BailJumperStartedFleeingOnFoot
INT iTimer_BailJumperVehicleStopped
INT iTimer_DelayMissionOverBailJumperKilled // timer used to advance to mission over after killing bail jumper, if convo or post script isn't launched in time
INT iBailJumperHealthOnBeganFleeAgain
INT iDialogueTimer_IdleInVehicle
INT iSyncScene_MaudeReact
INT iTimerLowerHandsDelayForGetUp
SCENARIO_BLOCKING_INDEX scenarioBlockingArea_BailJumperLocation
SCENARIO_BLOCKING_INDEX ScenarioBlockArea_CutsceneMaude
SEQUENCE_INDEX sequenceAI
STRING sBailJumpers_VoiceID
STRING sDialogue_BailJumperBeginChase
STRING sDialogueRoot_BailJumperSurrenders
STRING sDialogueRoot_DriveToMaudesPlace[BAIL_BONDS_MAX_DRIVE_CONVOS]
STRING sMissionTextBlock = "BB1AUD"
STRING sCommonTextBlock = "BBCAUD"
STRING sSceneHandle_Trevor = "Trevor"
STRING sSceneHandle_Maude = "Maude"
STRING sSceneHandle_BailJumper = "maude_criminal_1"
STRING sSceneHandle_MaudeChair = "maude_chair"
STRING sSceneHandle_MaudeLaptop = "maude_laptop"
structPedsForConversation sDialogue
REL_GROUP_HASH HASH_BAILBOND_TARGET
TEXT_LABEL_23 tlDialogueRoot_MissionFailed = ""
TEXT_LABEL_23 tlOutroMocapName = "MAUDE_MCS_2"
VECTOR vMaudePlace
VECTOR vPlayerPos
VECTOR vChaseRoute[BAIL_BONDS_MAX_CHASE_POINTS]
VECTOR vTargetCover
VECTOR vPos_PlayerMissionStart // pos player gets warped to when skipping back to the start of the the mission
VECTOR vPos_PlayerWarpGetNearTarget // pos player gets warped to when skipping the mission stage - MISSION_STAGE_PLAYER_LOCATE_BAIL_JUMPER
VECTOR vPos_PlayerWarpApproachTarget // pos player gets warped to when skipping the mission stage - MISSION_STAGE_TRIGGER_BAIL_JUMPER_REACTION
VECTOR vPos_JumperBeganFleeAgain
VECTOR vPos_ProjectileFleeingFrom
VEHICLE_INDEX vehIndex_MissionReplayRestore
//-------------------------------------------------------------------------------------------------------------------------------------------------
// :DEBUG FUNCS / PROCS / WIDGETS
//-------------------------------------------------------------------------------------------------------------------------------------------------
#IF IS_DEBUG_BUILD
WIDGET_GROUP_ID widgetGroup
BOOL bDebug_ForceFail = FALSE
BOOL bDebug_ChangeTargetComponent = FALSE
INT bDebug_PedVar = 0
INT bDebug_PedComponent = 0
INT bDebug_PedTexture = 0
BOOL bDebug_DrawChaseRoutePositions = FALSE
BOOL bDebug_CallClearAreaOffObjects = FALSE
VECTOR vDebug_ClearAreaPos = << 2727, 4146.5, 44.3 >>
FLOAT fDebug_ClearAreaRadius = 15.0
INT iDebug_ClearAreaFlag = 0
/// PURPOSE:
/// My debug mission widget groups, which get created in RAG->SCRIPT
PROC SETUP_MISSION_WIDGET()
widgetGroup = START_WIDGET_GROUP("BAIL BOND 1 - MISSION WIDGET")
ADD_WIDGET_BOOL("TTY Toggle - Print Bail Bonds Debug Info", bDebug_PrintBailBondInfoToTTY)
ADD_WIDGET_BOOL("Draw Chase Route Positions", bDebug_DrawChaseRoutePositions)
ADD_WIDGET_BOOL("Force Fail", bDebug_ForceFail)
START_WIDGET_GROUP("Target Variations")
ADD_WIDGET_BOOL("Process Variation change", bDebug_ChangeTargetComponent)
ADD_WIDGET_INT_SLIDER("Var Number", bDebug_PedVar, 0, 5, 1)
ADD_WIDGET_INT_SLIDER("Texture Number", bDebug_PedTexture, 0, 5, 1)
ADD_WIDGET_INT_SLIDER("Component Number", bDebug_PedComponent, 0, 12, 1)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Maude's object clear area")
ADD_WIDGET_BOOL("TTY Toggle - bDebug_CallClearAreaOffObjects : ", bDebug_CallClearAreaOffObjects)
ADD_WIDGET_VECTOR_SLIDER("vDebug_ClearAreaPos", vDebug_ClearAreaPos, -9000.0, 9000.0, 0.1)
ADD_WIDGET_FLOAT_SLIDER("fDebug_ClearAreaRadius : ", fDebug_ClearAreaRadius, 0.0, 50.0, 0.01)
ADD_WIDGET_INT_SLIDER("iDebug_ClearAreaFlag : ", iDebug_ClearAreaFlag, 0, 10, 1)
STOP_WIDGET_GROUP()
STOP_WIDGET_GROUP()
ENDPROC
/// PURPOSE:
/// updates my mission widgets, based off RAG input
PROC MAINTAIN_MISSION_WIDGETS()
INT i
IF bDebug_CallClearAreaOffObjects
IF iDebug_ClearAreaFlag = 0
OR iDebug_ClearAreaFlag = 2
OR iDebug_ClearAreaFlag = 4
OR iDebug_ClearAreaFlag = 8
CLEAR_AREA_OF_OBJECTS(vDebug_ClearAreaPos, fDebug_ClearAreaRadius, INT_TO_ENUM(CLEAROBJECTS_FLAGS, iDebug_ClearAreaFlag))
CPRINTLN(DEBUG_MISSION, "bDebug_CallClearAreaOffObjects done : iDebug_ClearAreaFlag = ", iDebug_ClearAreaFlag, "fDebug_ClearAreaRadius : ", fDebug_ClearAreaRadius, " vDebug_ClearAreaPos : ", vDebug_ClearAreaPos)
ELSE
CPRINTLN(DEBUG_MISSION, "bDebug_CallClearAreaOffObjects failed iDebug_ClearAreaFlag not valid : ", iDebug_ClearAreaFlag)
ENDIF
bDebug_CallClearAreaOffObjects = FALSE
ENDIF
IF bDebug_ForceFail
eMissionStage = MISSION_STAGE_MISSION_FAILED_WAIT_FOR_FADE
eSubStage = SS_SETUP
bDebug_ForceFail = FALSE
ENDIF
IF bDebug_ChangeTargetComponent
IF IS_PED_UNINJURED(sBailJumperPed.pedIndex)
SET_PED_COMPONENT_VARIATION(sBailJumperPed.pedIndex, INT_TO_ENUM(PED_COMPONENT, bDebug_PedComponent), bDebug_PedVar, bDebug_PedTexture)
ENDIF
bDebug_ChangeTargetComponent = FALSE
ENDIF
IF bDebug_DrawChaseRoutePositions
IF iNumChaseRoutePositions > 0
SET_DEBUG_ACTIVE(TRUE)
SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE)
FOR i = 0 TO (iNumChaseRoutePositions - 1)
DRAW_DEBUG_SPHERE(vChaseRoute[i], 5.0, 255, 0, 0, 150)
DRAW_DEBUG_SPHERE(vChaseRoute[i], 1.0, 0, 225, 0, 150)
ENDFOR
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// removes my debug mission widget group
PROC CLEANUP_MISSION_WIDGETS()
IF DOES_WIDGET_GROUP_EXIST(widgetGroup)
DELETE_WIDGET_GROUP(widgetGroup)
ENDIF
SET_DEBUG_ACTIVE(FALSE)
SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(FALSE)
ENDPROC
#ENDIF
/// PURPOSE:
/// Performs the CAN_PED_SEE_PED check and sets the specified FrameCounter if it returned TRUE
/// counter is used as a grace period for checking the ped has seen the player, as CAN_PED_SEE_PED takes several frames to return
/// PARAMS:
/// pedIndex - the ped to test against the player
/// iFrameCountLastSeenPlayer - the ped's last seen player counter
/// fOverride_PedViewCone - the ped's viewing cone - 170 is the default value
/// eBodyPart - set specific body part to check can be seen, default picks part at random
PROC UPDATE_PEDS_CAN_SEE_PLAYER_FRAME_COUNTER(PED_INDEX pedIndex, INT &iFrameCountLastSeenPlayer, FLOAT fOverride_PedViewCone = 170.0, THREAT_TEST_BODY_PART_ENUM eBodyPart = TT_BODY_PART_RANDOM)
IF IS_ENTITY_ALIVE(pedIndex)
IF CAN_PED_SEE_PED(pedIndex, PLAYER_PED_ID(), fOverride_PedViewCone, TRUE, DEFAULT, eBodyPart)
iFrameCountLastSeenPlayer = GET_FRAME_COUNT()
//#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "UPDATE_PEDS_CAN_SEE_PLAYER_FRAME_COUNTER - CAN_PED_SEE_PED returned TRUE so set frame count to : ", iFrameCountLastSeenPlayer) ENDIF #ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Performs the CAN_PED_SEE_PED check and sets the specified FrameCounter if it returned TRUE
/// counter is used as a grace period for checking the ped has seen the player, as CAN_PED_SEE_PED takes several frames to return
/// PARAMS:
/// pedIndex - the ped to test against the player
/// iFrameCountLastSeenPlayer - the ped's last seen player counter
/// fOverride_PedViewCone - the ped's viewing cone - 170 is the default value
/// eBodyPart - set specific body part to check can be seen, default picks part at random
PROC UPDATE_PLAYER_CAN_SEE_PED_FRAME_COUNTER(PED_INDEX pedToSeeIndex, INT &iFrameCountLastSeenPed, FLOAT fOverride_PlayerViewCone = 170.0, THREAT_TEST_BODY_PART_ENUM eBodyPart = TT_BODY_PART_RANDOM)
IF IS_ENTITY_ALIVE(pedToSeeIndex)
IF CAN_PED_SEE_PED(PLAYER_PED_ID(), pedToSeeIndex, fOverride_PlayerViewCone, TRUE, DEFAULT, eBodyPart)
iFrameCountLastSeenPed = GET_FRAME_COUNT()
//#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "UPDATE_PLAYER_CAN_SEE_PED_FRAME_COUNTER - CAN_PED_SEE_PED returned TRUE so set frame count to : ", iFrameCountLastSeenPed) ENDIF #ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// check if a ped can see the player, based off their INT counter which records the last frame they
/// were classed as being able to see the player using - UPDATE_PEDS_CAN_SEE_PLAYER_FRAME_COUNTER
/// RETURNS:
/// TRUE if ped can see player this frame
FUNC BOOL BB_CAN_PED_SEE_PLAYER_THIS_FRAME(INT &iFrameCounter_PedLastSeePlayer)
IF NOT HAS_FRAME_COUNTER_PASSED(iFrameCounter_PedLastSeePlayer, CAN_PED_SEE_PED_FRAME_COUNT_GRACE_PERIOD) // test ped has seen the player in the last 10 frames
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// check if the player ped has a clear line of sight to a ped who is also visible on screen
/// PARAMS:
/// pedToSeeIndex - ped to check player can see
/// iFrameCounter_PlayerLastSeenPed - counter to track last frame player could see the ped
/// bDoRangeAndHeightChecks - if true results will return false if the player is out of range/height
/// fPlayerDetectionDist - max dist for seeing range
/// fHeightDiffTolerance - max height diff for seeing range
/// RETURNS:
/// TRUE if player has clear line of sight and ped is visible on screen
FUNC BOOL BB_CAN_PLAYER_SEE_PED_WHO_IS_VISIBLE_ON_SCREEN(PED_INDEX pedToSeeIndex, INT iFrameCounter_PlayerLastSeenPed, BOOL bDoRangeAndHeightChecks = TRUE, FLOAT fPlayerDetectionDist = BAIL_BONDS_RANGE_TO_TARGET_ACTIVE, FLOAT fHeightDiffTolerance = 6.0)
IF IS_ENTITY_ALIVE(pedToSeeIndex)
IF NOT HAS_FRAME_COUNTER_PASSED(iFrameCounter_PlayerLastSeenPed, CAN_PED_SEE_PED_FRAME_COUNT_GRACE_PERIOD) // test PLAYER has seen the ped in the last 10 frames
IF bDoRangeAndHeightChecks
IF NOT IS_ENTITY_IN_RANGE_COORDS(sBailJumperPed.pedIndex, vPlayerPos, fPlayerDetectionDist)
//#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "BB_CAN_PLAYER_SEE_PED_WHO_IS_VISIBLE_ON_SCREEN - return FALSE : out of detection range") ENDIF #ENDIF
RETURN FALSE
ENDIF
IF NOT IS_PLAYER_AT_SAME_HEIGHT_AS_PED(pedToSeeIndex, vPlayerPos, fHeightDiffTolerance)
//#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "BB_CAN_PLAYER_SEE_PED_WHO_IS_VISIBLE_ON_SCREEN - return FALSE : out of height diff tolerance") ENDIF #ENDIF
RETURN FALSE
ENDIF
ENDIF
IF IS_ENTITY_ON_SCREEN(pedToSeeIndex)
IF NOT IS_ENTITY_OCCLUDED(pedToSeeIndex)
//IS_SPHERE_VISIBLE(GET_ENTITY_COORDS(pedToSeeIndex, 5)
//#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "BB_CAN_PLAYER_SEE_PED_WHO_IS_VISIBLE_ON_SCREEN - return TRUE : framecount :", GET_FRAME_COUNT()) ENDIF #ENDIF
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Checks if the player is intimidating a ped enough that they should react
/// NOTE: doesn't take into account player weapon
/// PARAMS:
/// pedIndex - Ped who the player is intimidating
/// iFrameCounter_PedLastSeePlayer - the frame count for the last time the pedIndex could see the player
/// fPlayerDetectionDist - Player is automatically classed as intimidating when shooting or targetting within this range
/// bAimingCloseToPedCounts - if true player aiming close to the ped counts
/// fBulletRadiusCheck - Used for IS_BULLET_IN_AREA check around pedIndex
/// fProjectileRadiusCheck - Used for IS_PROJECTILE_IN_AREA check around pedIndex
/// bVisibleWeaponIsIntimidating - if true and player is seen with weapon drawn func will return true
/// RETURNS:
/// True if bullet is in area around ped, if player is shooting, if player is targetting or free aiming at ped in view or if damaged.
FUNC BOOL IS_PLAYER_INTIMIDATE_SPECIFIC_PED(PED_INDEX pedIndex, INT iFrameCounter_PedLastSeePlayer, FLOAT fPlayerDetectionDist = 20.0, BOOL bAimingCloseToPedCounts = FALSE, FLOAT fBulletRadiusCheck = 8.0, FLOAT fProjectileRadiusCheck = 15.0, BOOL bVisibleWeaponIsIntimidating = FALSE)
IF IS_PED_UNINJURED(pedIndex)
VECTOR vTemp_PedPos = GET_ENTITY_COORDS(pedIndex)
IF IS_BULLET_IN_AREA(vTemp_PedPos, fBulletRadiusCheck, TRUE)
//#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "IS_PLAYER_INTIMIDATE_SPECIFIC_PED - bullet in area around ped") ENDIF #ENDIF
RETURN TRUE
ENDIF
IF IS_ENTITY_IN_RANGE_COORDS(pedIndex, vPlayerPos, fPlayerDetectionDist) //and is with in the range
IF NOT HAS_FRAME_COUNTER_PASSED(iFrameCounter_PedLastSeePlayer, CAN_PED_SEE_PED_FRAME_COUNT_GRACE_PERIOD) // test ped has seen the player in the last 10 frames
IF bVisibleWeaponIsIntimidating
IF IS_PLAYER_CURRENT_WEAPON_LETHAL()
// B*1511108 - try to ensure weapon is visible
IF IS_PED_WEAPON_READY_TO_SHOOT(PLAYER_PED_ID())
OR IS_PED_RELOADING(PLAYER_PED_ID())
//#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "IS_PLAYER_INTIMIDATE_SPECIFIC_PED - playing has leathal weapon in view") ENDIF #ENDIF
RETURN TRUE
ENDIF
ENDIF
ENDIF
IF IS_PLAYER_TARGETTING_ENTITY(PLAYER_ID(), pedIndex)
//#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "IS_PLAYER_INTIMIDATE_SPECIFIC_PED - playing targeting ped") ENDIF #ENDIF
RETURN TRUE
ENDIF
IF IS_PLAYER_FREE_AIMING(PLAYER_ID())
IF IS_PLAYER_FREE_AIMING_AT_ENTITY(PLAYER_ID(), pedIndex)
//#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "IS_PLAYER_INTIMIDATE_SPECIFIC_PED - playing free aiming at ped") ENDIF #ENDIF
RETURN TRUE
ENDIF
IF bAimingCloseToPedCounts
IF IS_PLAYER_FREE_AIMING(PLAYER_ID())
IF IS_PED_FACING_PED(PLAYER_PED_ID(), pedIndex, 45.0)
//#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "IS_PLAYER_INTIMIDATE_SPECIFIC_PED - playing free aiming around ped") ENDIF #ENDIF
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDIF
IF IS_PED_SHOOTING(PLAYER_PED_ID())
//#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "IS_PLAYER_INTIMIDATE_SPECIFIC_PED - player shooting with weapon") ENDIF #ENDIF
RETURN TRUE
ENDIF
IF IS_PED_IN_COMBAT(PLAYER_PED_ID())
OR IS_PED_IN_MELEE_COMBAT(PLAYER_PED_ID())
//#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "IS_PLAYER_INTIMIDATE_SPECIFIC_PED - player seen in combat ") ENDIF #ENDIF
RETURN TRUE
ENDIF
IF IS_PED_PERFORMING_STEALTH_KILL(PLAYER_PED_ID())
//#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "IS_PLAYER_INTIMIDATE_SPECIFIC_PED - player seen performing stealth kill") ENDIF #ENDIF
RETURN TRUE
ENDIF
ENDIF
ENDIF
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(pedIndex, PLAYER_PED_ID())
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(pedIndex)
//#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "IS_PLAYER_INTIMIDATE_SPECIFIC_PED - ped damaged by player with weapon") ENDIF #ENDIF
RETURN TRUE
ENDIF
IF IS_ENTITY_TOUCHING_ENTITY(pedIndex, PLAYER_PED_ID())
OR HAS_PED_RECEIVED_EVENT(pedIndex, EVENT_PLAYER_COLLISION_WITH_PED)
IF IS_PED_RAGDOLL(pedIndex)
//#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "IS_PLAYER_INTIMIDATE_SPECIFIC_PED check - PLAYER touching PED and ped is ragdoll") ENDIF #ENDIF
RETURN TRUE
ENDIF
ENDIF
IF IS_EXPLOSION_IN_SPHERE(EXP_TAG_DONTCARE, vTemp_PedPos, fProjectileRadiusCheck)
//#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "IS_PLAYER_INTIMIDATE_SPECIFIC_PED - explosion in area around ped") ENDIF #ENDIF
RETURN TRUE
ENDIF
VECTOR vMin, vMax // is one of the player's projectiles nearby?
vMin = vTemp_PedPos
vMax = vMin
vMin.x= vMin.x - fProjectileRadiusCheck
vMin.y = vMin.y -fProjectileRadiusCheck
vMin.z = vMin.z - fProjectileRadiusCheck
vMax.x = vMax.x + fProjectileRadiusCheck
vMax.y = vMax.y + fProjectileRadiusCheck
vMax.z = vMax.z + fProjectileRadiusCheck
IF IS_PROJECTILE_IN_AREA(vMin, vMax, TRUE)
//#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "IS_PLAYER_INTIMIDATE_SPECIFIC_PED - projectile in area around ped : ", "return TRUE") ENDIF #ENDIF
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// checks to see if Maude should flee
/// PARAMS:
/// bCheckPlayerWanted - if TRUE checks the player's wanted level and returns TRUE if he has one
/// RETURNS:
/// TRUE if reason for Maude to flee
FUNC BOOL SHOULD_MAUDE_FLEE(BOOL bCheckPlayerWanted = FALSE)
IF IS_PED_UNINJURED(sMaude.index)
// Check for Maude taking damage
IF HAS_ENTITY_BEEN_DAMAGED_BY_ANY_PED(sMaude.index)
OR HAS_ENTITY_BEEN_DAMAGED_BY_ANY_VEHICLE(sMaude.index)
OR HAS_ENTITY_BEEN_DAMAGED_BY_ANY_OBJECT(sMaude.index)
CPRINTLN(DEBUG_BAIL_BOND, GET_THIS_SCRIPT_NAME(), " : SHOULD_MAUDE_FLEE() return TRUE : Maude took damage : FC = ", GET_FRAME_COUNT())
RETURN TRUE
ENDIF
// Check for player pushing them with their car
IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID()) // Ignore player knocking them with car door (in vehicle, but not sitting= must be exiting)
IF IS_ENTITY_TOUCHING_ENTITY(PLAYER_PED_ID(), sMaude.index)
//OR HAS_ENTITY_COLLIDED_WITH_ANYTHING(objMaudeTable)
CPRINTLN(DEBUG_BAIL_BOND, GET_THIS_SCRIPT_NAME(), " : SHOULD_MAUDE_FLEE() return TRUE : Maude pushed by player vehicle : FC = ", GET_FRAME_COUNT())
RETURN TRUE
ENDIF
IF DOES_ENTITY_EXIST(sObjMaudeChair.index)
IF IS_ENTITY_TOUCHING_ENTITY(PLAYER_PED_ID(), sObjMaudeChair.index)
CPRINTLN(DEBUG_BAIL_BOND, GET_THIS_SCRIPT_NAME(), " : SHOULD_MAUDE_FLEE() return TRUE : Maude's chair pushed by player vehicle : FC = ", GET_FRAME_COUNT())
RETURN TRUE
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(sObjMaudeTable.index)
IF IS_ENTITY_TOUCHING_ENTITY(PLAYER_PED_ID(), sObjMaudeTable.index)
CPRINTLN(DEBUG_BAIL_BOND, GET_THIS_SCRIPT_NAME(), " : SHOULD_MAUDE_FLEE() return TRUE : Maude's table pushed by player vehicle : FC = ", GET_FRAME_COUNT())
RETURN TRUE
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(sObjMaudeLaptop.index)
IF IS_ENTITY_TOUCHING_ENTITY(PLAYER_PED_ID(), sObjMaudeLaptop.index)
CPRINTLN(DEBUG_BAIL_BOND, GET_THIS_SCRIPT_NAME(), " : SHOULD_MAUDE_FLEE() return TRUE : Maude's laptop pushed by player vehicle : FC = ", GET_FRAME_COUNT())
RETURN TRUE
ENDIF
ENDIF
ENDIF
// code event check for EVENT_POTENTIAL_GET_RUN_OVER
IF HAS_PED_RECEIVED_EVENT(sMaude.index, EVENT_POTENTIAL_GET_RUN_OVER)
CPRINTLN(DEBUG_BAIL_BOND, GET_THIS_SCRIPT_NAME(), " : SHOULD_MAUDE_FLEE() return TRUE : Maude's received event EVENT_POTENTIAL_GET_RUN_OVER : FC = ", GET_FRAME_COUNT())
RETURN TRUE
ENDIF
// check for ragdoll
IF IS_PED_RAGDOLL(sMaude.index)
IF IS_ENTITY_AT_ENTITY(sMaude.index, PLAYER_PED_ID(), <<3.0, 3.0, 3.0>>) // Player close (so they bumped into them)
CPRINTLN(DEBUG_BAIL_BOND, GET_THIS_SCRIPT_NAME(), " : SHOULD_MAUDE_FLEE() return TRUE : Maude's ragdolled with player close by : FC = ", GET_FRAME_COUNT())
RETURN TRUE
ENDIF
ENDIF
// code event check for EVENT_PED_COLLISION_WITH_PLAYER
IF HAS_PED_RECEIVED_EVENT(sMaude.index, EVENT_PED_COLLISION_WITH_PLAYER)
CPRINTLN(DEBUG_BAIL_BOND, GET_THIS_SCRIPT_NAME(), " : SHOULD_MAUDE_FLEE() return TRUE : Maude's received event EVENT_PED_COLLISION_WITH_PLAYER : FC = ", GET_FRAME_COUNT())
RETURN TRUE
ENDIF
// check for player aiming at RC character
IF IS_PLAYER_VISIBLY_TARGETTING_PED(sMaude.index)
CPRINTLN(DEBUG_BAIL_BOND, GET_THIS_SCRIPT_NAME(), " : SHOULD_MAUDE_FLEE() return TRUE : Player visibly targetting Maude : FC = ", GET_FRAME_COUNT())
RETURN TRUE
ENDIF
// Check for player shooting nearby
IF IS_PLAYER_SHOOTING_NEAR_PED(sMaude.index)
CPRINTLN(DEBUG_BAIL_BOND, GET_THIS_SCRIPT_NAME(), " : SHOULD_MAUDE_FLEE() return TRUE : Player shooting near Maude : FC = ", GET_FRAME_COUNT())
RETURN TRUE
ENDIF
// Check for explosions nearby
IF IS_EXPLOSION_IN_SPHERE(EXP_TAG_DONTCARE, GET_ENTITY_COORDS(sMaude.index), 15)
CPRINTLN(DEBUG_BAIL_BOND, GET_THIS_SCRIPT_NAME(), " : SHOULD_MAUDE_FLEE() return TRUE : Explosion near Maude : FC = ", GET_FRAME_COUNT())
RETURN TRUE
ENDIF
// code event check for EVENT_RESPONDED_TO_THREAT
IF HAS_PED_RECEIVED_EVENT(sMaude.index, EVENT_RESPONDED_TO_THREAT)
CPRINTLN(DEBUG_BAIL_BOND, GET_THIS_SCRIPT_NAME(), " : SHOULD_MAUDE_FLEE() return TRUE : Maude's received event EVENT_RESPONDED_TO_THREAT : FC = ", GET_FRAME_COUNT())
RETURN TRUE
ENDIF
// flee if player is wanted
IF bCheckPlayerWanted
IF IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
CPRINTLN(DEBUG_BAIL_BOND, GET_THIS_SCRIPT_NAME(), " : SHOULD_MAUDE_FLEE() return TRUE : player has wanted level : FC = ", GET_FRAME_COUNT())
RETURN TRUE
ENDIF
ENDIF
ELSE
CPRINTLN(DEBUG_BAIL_BOND, GET_THIS_SCRIPT_NAME(), " : SHOULD_MAUDE_FLEE() return TRUE : Maude injured : FC = ", GET_FRAME_COUNT())
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// cleans up the bail jumper's buddy ped's combat blips
PROC CLEANUP_BUDDY_COMBAT_BLIPS(INT iNumBuddies)
INT i
FOR i = 0 TO (iNumBuddies - 1)
CLEANUP_AI_PED_BLIP(sBackupPed[i].blipAIStruct)
ENDFOR
ENDPROC
/// PURPOSE:
/// give a ped a flee from player task
/// PARAMS:
/// pedIndex - specific ped
/// bBlockTempEvents - if ped needs temp events blocking
PROC GIVE_PED_FLEE_ORDER(PED_INDEX pedIndex, BOOL bBlockTempEvents = TRUE)
IF IS_PED_UNINJURED(pedIndex)
SET_PED_COMBAT_ATTRIBUTES(pedIndex, CA_ALWAYS_FIGHT, FALSE)
SET_PED_COMBAT_ATTRIBUTES(pedIndex, CA_ALWAYS_FLEE, TRUE)
SET_PED_FLEE_ATTRIBUTES(pedIndex, FA_NEVER_FLEE, FALSE)
IF NOT IsPedPerformingTask(pedIndex, SCRIPT_TASK_SMART_FLEE_PED)
CLEAR_PED_TASKS(pedIndex)
CLEAR_PED_SECONDARY_TASK(pedIndex)
TASK_LOOK_AT_ENTITY(pedIndex, PLAYER_PED_ID(), 3000)
TASK_SMART_FLEE_PED(pedIndex, PLAYER_PED_ID(), 10000, -1)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "GIVE_PED_FLEE_ORDER - done, bBlockTempEvents = ", bBlockTempEvents) ENDIF #ENDIF
ENDIF
IF bBlockTempEvents
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedIndex, TRUE)
ENDIF
SET_PED_KEEP_TASK(pedIndex, TRUE)
ENDIF
ENDPROC
/// PURPOSE:
/// set all remaining buddy peds to flee
/// PARAMS:
/// iNumBuddies - the total number of buddy peds
PROC BUDDY_SURRENDER(INT iNumBuddies)
INT i
FOR i = 0 TO (iNumBuddies-1)
IF sBackupPed[i].state != BS_DEAD
GIVE_PED_FLEE_ORDER(sBackupPed[i].index)
sBackupPed[i].state = BS_FLEE
CLEANUP_AI_PED_BLIP(sBackupPed[i].blipAIStruct)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "BUDDY_SURRENDER set ID = ", i) ENDIF #ENDIF
ENDIF
ENDFOR
ENDPROC
PROC TELL_TARGET_AIM_STRAFE_COVER_SHOOT(PED_INDEX TargetPed, VECTOR vPos)
IF IS_PED_UNINJURED(TargetPed)
SET_PED_ACCURACY(TargetPed, 50)
OPEN_SEQUENCE_TASK(sequenceAI)
TASK_AIM_GUN_AT_ENTITY(NULL, PLAYER_PED_ID(), 3000)
TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(NULL, vPos, PLAYER_PED_ID(), PEDMOVEBLENDRATIO_WALK, TRUE)
TASK_SEEK_COVER_FROM_PED(NULL, PLAYER_PED_ID(), 1500, TRUE)
TASK_COMBAT_PED(NULL, PLAYER_PED_ID())
TASK_SET_SPHERE_DEFENSIVE_AREA(NULL, vPos, 50) // note: defensive area radius shouldn't be set less than 10m after initial get to area as per B*1173588
CLOSE_SEQUENCE_TASK(sequenceAI)
TASK_PERFORM_SEQUENCE(TargetPed, sequenceAI)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "TELL_TARGET_AIM_STRAFE_COVER_SHOOT - done, vPos : ", vPos) ENDIF #ENDIF
ENDIF
ENDPROC
PROC TELL_BUDDY_STAND_SHOOT_COVER(PED_INDEX TargetBuddy)
IF IS_PED_UNINJURED(TargetBuddy)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(TargetBuddy, FALSE)
OPEN_SEQUENCE_TASK(sequenceAI)
IF IS_PED_IN_ANY_VEHICLE(TargetBuddy)
TASK_LEAVE_ANY_VEHICLE(NULL)
ENDIF
TASK_AIM_GUN_AT_ENTITY(NULL, PLAYER_PED_ID(), GET_RANDOM_INT_IN_RANGE( 500, 3000 ))
TASK_SEEK_COVER_FROM_PED(NULL, PLAYER_PED_ID(), 3500, TRUE)
TASK_SET_SPHERE_DEFENSIVE_AREA(NULL, vTargetCover, 50) // note: defensive area radius shouldn't be set less than 10m after initial get to area as per B*1173588
TASK_COMBAT_PED(NULL, PLAYER_PED_ID())
CLOSE_SEQUENCE_TASK(sequenceAI)
TASK_PERFORM_SEQUENCE(TargetBuddy, sequenceAI)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "TELL_BUDDY_STAND_SHOOT_COVER - done") ENDIF #ENDIF
ENDIF
ENDPROC
PROC TELL_BUDDY_STAND_SHOOT(PED_INDEX TargetBuddy)
IF IS_PED_UNINJURED(TargetBuddy)
OPEN_SEQUENCE_TASK(sequenceAI)
IF IS_PED_IN_ANY_VEHICLE(TargetBuddy)
TASK_LEAVE_ANY_VEHICLE(NULL)
ENDIF
TASK_AIM_GUN_AT_ENTITY(NULL, PLAYER_PED_ID(), -1) //BS_STAND_SHOOT_INDEF
CLOSE_SEQUENCE_TASK(sequenceAI)
TASK_PERFORM_SEQUENCE(TargetBuddy, sequenceAI)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "TELL_BUDDY_STAND_SHOOT - done") ENDIF #ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// used to select to correct reaction the buddy ped should use
/// PARAMS:
/// TargetBuddy - the buddy ped's struct
PROC PICK_BUDDY_REACTION(INT iBuddyPedID)
IF IS_PED_UNINJURED(sBackupPed[iBuddyPedID].index)
CLEAR_PED_SECONDARY_TASK(sBackupPed[iBuddyPedID].index)
CLEAR_PED_TASKS(sBackupPed[iBuddyPedID].index)
TASK_CLEAR_LOOK_AT(sBackupPed[iBuddyPedID].index)
// don't have bums attack if player has a lethal weapon on show
IF IS_PLAYER_CURRENT_WEAPON_LETHAL()
GIVE_PED_FLEE_ORDER(sBackupPed[iBuddyPedID].index)
sBackupPed[iBuddyPedID].state = BS_FLEE
CLEANUP_AI_PED_BLIP(sBackupPed[iBuddyPedID].blipAIStruct)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "PICK_BUDDY_REACTION set RELEASE player lethal weapon : ID = ", iBuddyPedID) ENDIF #ENDIF
ELSE
// only bums setup to hate Trevor will attack
IF GET_PED_RELATIONSHIP_GROUP_HASH(sBackupPed[iBuddyPedID].index) = HASH_BAILBOND_TARGET
SET_PED_HEARING_RANGE(sBackupPed[iBuddyPedID].index, 30.0)
SET_PED_SEEING_RANGE(sBackupPed[iBuddyPedID].index, 30.0)
SET_PED_ID_RANGE(sBackupPed[iBuddyPedID].index, 30.0)
SET_PED_COMBAT_RANGE(sBackupPed[iBuddyPedID].index, CR_NEAR)
SET_PED_COMBAT_ATTRIBUTES(sBackupPed[iBuddyPedID].index, CA_USE_VEHICLE, FALSE)
SET_PED_COMBAT_ATTRIBUTES(sBackupPed[iBuddyPedID].index, CA_LEAVE_VEHICLES, TRUE)
SET_PED_COMBAT_ATTRIBUTES(sBackupPed[iBuddyPedID].index, CA_ALWAYS_FIGHT, TRUE) // attempt to stop security ped taking cover during brawl
SET_PED_COMBAT_ATTRIBUTES(sBackupPed[iBuddyPedID].index, CA_USE_COVER, FALSE) // attempt to stop security ped taking cover during brawl
SET_PED_FLEE_ATTRIBUTES(sBackupPed[iBuddyPedID].index, FA_NEVER_FLEE, TRUE)
TASK_LOOK_AT_ENTITY(sBackupPed[iBuddyPedID].index, PLAYER_PED_ID(), -1)
TASK_TURN_PED_TO_FACE_ENTITY(sBackupPed[iBuddyPedID].index, PLAYER_PED_ID(), -1)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sBackupPed[iBuddyPedID].index, TRUE)
sBackupPed[iBuddyPedID].state = BS_COMBAT
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "PICK_BUDDY_REACTION set FIGHT player non lethal weapon : ID = ", iBuddyPedID) ENDIF #ENDIF
ELSE
// peds to watch
SET_PED_COMBAT_ATTRIBUTES(sBackupPed[iBuddyPedID].index, CA_ALWAYS_FIGHT, FALSE)
TASK_LOOK_AT_ENTITY(sBackupPed[iBuddyPedID].index, PLAYER_PED_ID(), -1)
TASK_TURN_PED_TO_FACE_ENTITY(sBackupPed[iBuddyPedID].index, PLAYER_PED_ID(), -1)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sBackupPed[iBuddyPedID].index, FALSE)
sBackupPed[iBuddyPedID].state = BS_FLEE
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "PICK_BUDDY_REACTION set RELEASE player non lethal weapon : ID = ", iBuddyPedID) ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// set all the bail jumper's buddy to react
/// PARAMS:
/// iNumBuddies - the num of buddy peds
PROC ACTIVATE_ALL_BUDDIES(INT iNumBuddies)
INT i
FOR i=0 TO (iNumBuddies-1)
IF IS_PED_UNINJURED(sBackupPed[i].index)
sBackupPed[i].state = BS_WAIT_PICK_REACT
ENDIF
ENDFOR
ENDPROC
/// PURPOSE:
///
PROC SET_BAIL_JUMPER_SURRENDERED()
IF IS_PED_UNINJURED(sBailJumperPed.pedIndex)
IF sBailJumperPed.AI != BB_PED_AI_SETUP_SURRENDERED
AND sBailJumperPed.AI != BB_PED_AI_STATE_SURRENDERED
AND sBailJumperPed.AI != BB_PED_AI_SETUP_FOLLOW_PLAYER
AND sBailJumperPed.AI != BB_PED_AI_STATE_FOLLOW_PLAYER
CLEAR_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, RELGROUPHASH_PLAYER, HASH_BAILBOND_TARGET)
CLEAR_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, HASH_BAILBOND_TARGET, RELGROUPHASH_PLAYER)
IF IS_PED_IN_GROUP(sBailJumperPed.pedIndex)
REMOVE_PED_FROM_GROUP(sBailJumperPed.pedIndex)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "SET_BAIL_JUMPER_SURRENDERED - sBailJumperPed.pedIndex removed from group") ENDIF #ENDIF
ENDIF
CLEAR_PED_SECONDARY_TASK(sBailJumperPed.pedIndex)
CLEAR_PED_TASKS(sBailJumperPed.pedIndex)
SET_ENTITY_LOAD_COLLISION_FLAG(sBailJumperPed.pedIndex, FALSE) // shouldn't need this after this point - added to help with loading navmesh on change route
SET_PED_DROPS_WEAPON(sBailJumperPed.pedIndex)
REMOVE_ALL_PED_WEAPONS(sBailJumperPed.pedIndex)
SET_CURRENT_PED_WEAPON(sBailJumperPed.pedIndex, WEAPONTYPE_UNARMED, TRUE)
SET_PED_CAN_SWITCH_WEAPON(sBailJumperPed.pedIndex, FALSE)
SET_PED_ARMOUR(sBailJumperPed.pedIndex, 0) // clear any armour left when he's surrendered
// cover stuff added for B*1266421
SET_PED_FLEE_ATTRIBUTES(sBailJumperPed.pedIndex, FA_USE_COVER, FALSE)
SET_PED_COMBAT_ATTRIBUTES(sBailJumperPed.pedIndex, CA_ALWAYS_FLEE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(sBailJumperPed.pedIndex, CA_USE_COVER, FALSE)
SET_PED_COMBAT_ATTRIBUTES(sBailJumperPed.pedIndex, CA_ALWAYS_FIGHT, FALSE)
IF IS_PED_IN_ANY_VEHICLE(sBailJumperPed.pedIndex, TRUE)
TASK_LEAVE_ANY_VEHICLE(sBailJumperPed.pedIndex)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "SET_BAIL_JUMPER_SURRENDERED - tasked leave vehicle FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
iTimerLowerHandsDelayForGetUp = GET_GAME_TIMER()
sBailJumperPed.AI = BB_PED_AI_SETUP_SURRENDERED
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "SET_BAIL_JUMPER_SURRENDERED - done FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// check to see if the surrendered bailjumper should delay using follow behaviour
/// RETURNS:
/// TRUE if he hasn't announced he's surrendered yet
FUNC BOOL SHOULD_BAIL_JUMPER_DELAY_FOLLOW_BEHAVIOUR()
IF NOT bDoneDialogue_BailJumperSurrendered // wait for the initial dialogue from bail jumper saying he surrenders
RETURN TRUE
ENDIF
IF IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING(sDialogueRoot_BailJumperSurrenders, FALSE) // surrender dialogue on going?
RETURN TRUE
ENDIF
IF eMissionStage != MISSION_STAGE_TAKE_TARGET_TO_MAUDE
AND eMissionStage != MISSION_STAGE_LOSE_THE_COPS
RETURN TRUE
ENDIF
// B*1550554 - force the hands up if he's getting up from a fall
IF IS_PED_GETTING_UP(sBailJumperPed.pedIndex)
OR IS_PED_RAGDOLL(sBailJumperPed.pedIndex)
iTimerLowerHandsDelayForGetUp = GET_GAME_TIMER()
//#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "SHOULD_BAIL_JUMPER_DELAY_FOLLOW_BEHAVIOUR return TRUE ragdoll or getting up - done FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
RETURN TRUE
ENDIF
IF NOT HAS_TIME_PASSED(iTimerLowerHandsDelayForGetUp, 2000)
//#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "SHOULD_BAIL_JUMPER_DELAY_FOLLOW_BEHAVIOUR return TRUE iTimerLowerHandsDelayForGetUp - done FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// currently sets blocking of temp events, relationship group and stops player getting in their vehicle when jacking
/// PARAMS:
/// pedIndex - ped to allow changes to
PROC PED_COMMON_SETUP(PED_INDEX pedIndex)
SET_PED_RELATIONSHIP_GROUP_HASH(pedIndex, HASH_BAILBOND_TARGET)
SET_PED_CONFIG_FLAG(pedIndex, PCF_PedsJackingMeDontGetIn, TRUE)
SET_PED_CONFIG_FLAG(pedIndex, PCF_GetOutBurningVehicle, TRUE)
SET_PED_CONFIG_FLAG(pedIndex, PCF_DontInfluenceWantedLevel, TRUE)
SET_PED_CONFIG_FLAG(pedIndex, PCF_RunFromFiresAndExplosions, TRUE)
// request remove from Imran email 21/05/2013 - no explanation why. SET_PED_CONFIG_FLAG(pedIndex, PCF_DisableHurt, TRUE) // Fix B*1204129 - stunned peds are dying with SET_PED_DIES_WHEN_INJURED flag
//SET_PED_DIES_WHEN_INJURED(pedIndex, TRUE)
SET_PED_TO_INFORM_RESPECTED_FRIENDS(pedIndex, 10.0, 5)
SET_PED_AS_ENEMY(pedIndex, TRUE) // B*1535622 - makes sure HUD elements are set for enemy ped
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedIndex, TRUE)
ENDPROC
PROC DO_SPECIFIC_SCENARIO_SETUP()
IF IS_PED_UNINJURED(sBailJumperPed.pedIndex)
STOP_PED_SPEAKING(sBailJumperPed.pedIndex, TRUE)
SET_PED_PATH_PREFER_TO_AVOID_WATER(sBailJumperPed.pedIndex, TRUE)
SET_PED_ARMOUR(sBailJumperPed.pedIndex, 100)
SET_ENTITY_HEALTH(sBailJumperPed.pedIndex, 200) //Stops peds dying to easily when falling of bikes/quads
//SET_PED_SUFFERS_CRITICAL_HITS(sBailJumperPed.pedIndex, FALSE)
SET_PED_CAN_BE_SHOT_IN_VEHICLE(sBailJumperPed.pedIndex, TRUE)
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(sBailJumperPed.pedIndex, TRUE)
SET_PED_DIES_IN_WATER(sBailJumperPed.pedIndex, TRUE)
SET_PED_DIES_IN_SINKING_VEHICLE(sBailJumperPed.pedIndex, TRUE)
SET_PED_MAX_TIME_IN_WATER(sBailJumperPed.pedIndex, 2.0)
SET_PED_MAX_TIME_UNDERWATER(sBailJumperPed.pedIndex, 2.0)
SET_PED_PATH_PREFER_TO_AVOID_WATER(sBailJumperPed.pedIndex, TRUE)
SET_PED_PATH_MAY_ENTER_WATER(sBailJumperPed.pedIndex, FALSE)
SET_PED_CONFIG_FLAG(sBailJumperPed.pedIndex, PCF_RunFromFiresAndExplosions, TRUE)
SET_PED_CONFIG_FLAG(sBailJumperPed.pedIndex, PCF_RemoveDeadExtraFarAway, TRUE)
SET_PED_CONFIG_FLAG(sBailJumperPed.pedIndex, PCF_DisableGoToWritheWhenInjured, TRUE)
IF sBailJumperPed.wtWeapon != WEAPONTYPE_INVALID
GIVE_WEAPON_TO_PED(sBailJumperPed.pedIndex, sBailJumperPed.wtWeapon, INFINITE_AMMO, TRUE)
ENDIF
PED_COMMON_SETUP(sBailJumperPed.pedIndex)
SET_PED_DEBUG_NAME(sBailJumperPed.pedIndex, "TARGET_", 0)
sBailJumperPed.AI = BB_PED_AI_STATE_RELAXED
SET_PED_DEFAULT_COMPONENT_VARIATION(sBailJumperPed.pedIndex)
TASK_PLAY_ANIM(sBailJumperPed.pedIndex, "ODDJOBS@BAILBOND_QUARRY", "prem_producer_argue_a", NORMAL_BLEND_IN, REALLY_SLOW_BLEND_OUT, -1, AF_LOOPING)
IF NOT DOES_ENTITY_EXIST(sObjectBailJumperPhone.index)
sObjectBailJumperPhone.index = CREATE_OBJECT(PROP_PHONE_ING, GET_ENTITY_COORDS(sBailJumperPed.pedIndex, FALSE))
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "DO_SPECIFIC_SCENARIO_SETUP - bail jumper phone created") ENDIF #ENDIF
ENDIF
IF IS_ENTITY_ALIVE(sObjectBailJumperPhone.index)
ATTACH_ENTITY_TO_ENTITY(sObjectBailJumperPhone.index, sBailJumperPed.pedIndex, GET_PED_BONE_INDEX(sBailJumperPed.pedIndex, BONETAG_PH_R_HAND), <<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "DO_SPECIFIC_SCENARIO_SETUP - bail jumper phone attached") ENDIF #ENDIF
ENDIF
ENDIF
INT i
FOR i = 0 TO (BAIL_BONDS_MAX_BACKUP_PEDS - 1)
IF IS_PED_UNINJURED(sBackupPed[i].index)
PED_COMMON_SETUP(sBackupPed[i].index)
IF sBackupPed[i].wtWeapon != WEAPONTYPE_INVALID
GIVE_WEAPON_TO_PED(sBackupPed[i].index, sBackupPed[i].wtWeapon, INFINITE_AMMO, TRUE)
ENDIF
SET_PED_CONFIG_FLAG(sBackupPed[i].index, PCF_RemoveDeadExtraFarAway, TRUE) // Bug fix attempt for B*1300191 - peds visibly deleted when sniping from hill top
SET_PED_DEBUG_NAME(sBackupPed[i].index, "BACKUP_", i)
ENDIF
ENDFOR
FOR i = 0 TO (iNumMissionVehicles - 1)
IF IS_VEHICLE_OK(sMissionVehicle[i].index)
// B* 1514608 - bail jumper needs to drive off quicker
SET_VEHICLE_ENGINE_ON(sMissionVehicle[i].index, TRUE, TRUE)
ENDIF
ENDFOR
ENDPROC
/// PURPOSE:
/// creates all the entities at the bail jumper's location
/// RETURNS:
/// TRUE when all entities are created and setup
FUNC BOOL CREATE_BAIL_JUMPER_SCENE()
INT iSpawnedEntities = 0
INT iSpawnedBuddyPeds = 0
INT i
// spawn target ped
IF SPAWN_PED(sBailJumperPed.pedIndex, sBailJumperPed.mnModel, sBailJumperPed.vPosition, sBailJumperPed.fHeading)
IF IS_PED_UNINJURED(sBailJumperPed.pedIndex)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sBailJumperPed.pedIndex, TRUE)
//#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "CREATE_BAIL_JUMPER_SCENE - target ped spawned ") ENDIF #ENDIF
iSpawnedEntities++
ENDIF
ENDIF
// spawn backup peds
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "CREATE_BAIL_JUMPER_SCENE - num back up ped to spawn = ", iNumTargetBackupPeds) ENDIF #ENDIF
IF iNumTargetBackupPeds > 0
FOR i=0 TO (iNumTargetBackupPeds - 1)
IF SPAWN_PED(sBackupPed[i].index, sBackupPed[i].model, sBackupPed[i].vPos, sBackupPed[i].fDir, FALSE)
IF IS_PED_UNINJURED(sBackupPed[i].index)
//#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "CREATE_BAIL_JUMPER_SCENE - back up ped spawned ID = ", i) ENDIF #ENDIF
iSpawnedEntities++
iSpawnedBuddyPeds++
ENDIF
ENDIF
ENDFOR
ENDIF
// unload the buddy ped models afterwards
IF iSpawnedBuddyPeds = iNumTargetBackupPeds
FOR i=0 TO (iNumTargetBackupPeds - 1)
SET_MODEL_AS_NO_LONGER_NEEDED(sBackupPed[i].model)
//#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "CREATE_BAIL_JUMPER_SCENE - ALL buddy peds spawned so unloading models now - SET_MODEL_AS_NO_LONGER_NEEDED for ped ID = ", i) ENDIF #ENDIF
ENDFOR
ENDIF
// spawn mission vehicles
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "CREATE_BAIL_JUMPER_SCENE - num mission vehicles to spawn = ", iNumMissionVehicles) ENDIF #ENDIF
IF iNumMissionVehicles > 0
FOR i=0 TO (iNumMissionVehicles - 1)
IF SPAWN_VEHICLE(sMissionVehicle[i].index, sMissionVehicle[i].model, sMissionVehicle[i].vPos, sMissionVehicle[i].fDir)
//#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "CREATE_BAIL_JUMPER_SCENE - mission vehicle spawned ID = ", i) ENDIF #ENDIF
iSpawnedEntities++
ENDIF
ENDFOR
ENDIF
/*// spawn mission objects
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "SPAWN_SCENE - num mission objects to spawn = ", iNumMissionObjects) ENDIF #ENDIF
IF iNumMissionObjects > 0
FOR i=0 TO (iNumMissionObjects - 1)
IF SPAWN_OBJECT(sMissionObject[i].index, sMissionObject[i].model, sMissionObject[i].vPos, sMissionObject[i].fDir)
//#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "SPAWN_SCENE - mission object spawned ID = ", i) ENDIF #ENDIF
iSpawnedEntities++
ENDIF
ENDFOR
ENDIF */
// spawn mission props
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "SPAWN_SCENE - num mission props to spawn = ", iNumMissionProps) ENDIF #ENDIF
IF iNumMissionProps > 0
FOR i=0 TO (iNumMissionProps - 1)
IF SPAWN_OBJECT(sMissionProp[i].index, sMissionProp[i].model, sMissionProp[i].vPos, sMissionProp[i].fDir)
FREEZE_ENTITY_POSITION(sMissionProp[i].index, TRUE)
//#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "SPAWN_SCENE - mission prop spawned ID = ", i) ENDIF #ENDIF
iSpawnedEntities++
ENDIF
ENDFOR
ENDIF
// spawn mission pickups
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "SPAWN_SCENE - num mission pickups to spawn = ", iNumMissionPickups) ENDIF #ENDIF
IF iNumMissionPickups > 0
FOR i=0 TO (iNumMissionPickups - 1)
IF SPAWN_PICKUP( sMissionPickup[i].index, sMissionPickup[i].type, sMissionPickup[i].vPos, sMissionPickup[i].iPlacementFlags, sMissionPickup[i].model)
//#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "SPAWN_SCENE - mission pickup spawned ID = ", i) ENDIF #ENDIF
iSpawnedEntities++
ENDIF
ENDFOR
ENDIF
//#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "CREATE_BAIL_JUMPER_SCENE - iSpawnedEntities = ", iSpawnedEntities) ENDIF #ENDIF
//#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "CREATE_BAIL_JUMPER_SCENE - (iNumTargetBackupPeds + iNumMissionVehicles + iNumMissionObjects + iNumMissionProps + iNumMissionPickups + 1) = ",
//(iNumTargetBackupPeds + iNumMissionVehicles + iNumMissionObjects + iNumMissionProps + iNumMissionPickups + 1)) ENDIF #ENDIF
IF iSpawnedEntities = (iNumTargetBackupPeds + iNumMissionVehicles + iNumMissionObjects + iNumMissionProps + iNumMissionPickups + 1) // +1 for target ped
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "CREATE_BAIL_JUMPER_SCENE - scene loaded! frame count : ", GET_FRAME_COUNT()) ENDIF #ENDIF
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Sets up a stage requirment via a switch using an ENUM
/// Stage requirements include the hunter the saleform or the mission text etc.
/// PARAMS:
/// missionReq - The Enum of the required mission element e.g. RQ_TEXT
/// RETURNS:
/// TRUE when the thing required is created/loaded/setup or whatever.
FUNC BOOL SETUP_STAGE_REQUIREMENTS(MISSION_REQ missionReq)
SWITCH missionReq
CASE RQ_TEXT
REQUEST_ADDITIONAL_TEXT("BBONDS", MISSION_TEXT_SLOT)
IF HAS_ADDITIONAL_TEXT_LOADED(MISSION_TEXT_SLOT)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "SETUP_STAGE_REQUIREMENTS : ", "return TRUE - ", "mission text loaded") ENDIF #ENDIF
RETURN TRUE
ENDIF
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "SETUP_STAGE_REQUIREMENTS : ", "mission text loading...") ENDIF #ENDIF
BREAK
CASE RQ_MAUDE_ANIM
REQUEST_ANIM_DICT(GET_MAUDE_IDLE_ANIM_DICT())
IF HAS_ANIM_DICT_LOADED(GET_MAUDE_IDLE_ANIM_DICT())
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "SETUP_STAGE_REQUIREMENTS : ", "RQ_MAUDE_ANIM loaded") ENDIF #ENDIF
RETURN TRUE
ENDIF
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "SETUP_STAGE_REQUIREMENTS : ", "RQ_MAUDE_ANIM loading...") ENDIF #ENDIF
BREAK
CASE RQ_ANIMS
REQUEST_ANIM_DICT("ODDJOBS@BAILBOND_QUARRY")
IF HAS_ANIM_DICT_LOADED("ODDJOBS@BAILBOND_QUARRY")
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "SETUP_STAGE_REQUIREMENTS : ", "return TRUE - ", "RQ_ANIMS loaded") ENDIF #ENDIF
RETURN TRUE
ENDIF
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "SETUP_STAGE_REQUIREMENTS : ", "RQ_ANIMS loading...") ENDIF #ENDIF
BREAK
CASE RQ_PHONE_MODEL
REQUEST_MODEL(sObjectBailJumperPhone.model)
IF HAS_MODEL_LOADED(sObjectBailJumperPhone.model)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "SETUP_STAGE_REQUIREMENTS : ", "return TRUE - ", "RQ_PHONE_MODEL skipped no anims") ENDIF #ENDIF
RETURN TRUE
ENDIF
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// sets Maude and the chair into the sync scene
PROC SET_MAUDE_SYNC_SCENE()
IF IS_PED_UNINJURED(sMaude.index)
IF IS_ENTITY_ALIVE(sObjMaudeChair.index)
IF SETUP_STAGE_REQUIREMENTS(RQ_MAUDE_ANIM)
INT mSyncScene
mSyncScene = CREATE_SYNCHRONIZED_SCENE(GET_MAUDE_SYNC_SCENE_POSITION(), GET_MAUDE_SYNC_SCENE_ORIENTATION())
SET_SYNCHRONIZED_SCENE_LOOPED(mSyncScene, TRUE)
SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(mSyncScene, FALSE)
TASK_SYNCHRONIZED_SCENE(sMaude.index, mSyncScene, GET_MAUDE_IDLE_ANIM_DICT(), GET_MAUDE_IDLE_ANIM(), INSTANT_BLEND_IN, NORMAL_BLEND_OUT,
SYNCED_SCENE_ABORT_ON_WEAPON_DAMAGE | SYNCED_SCENE_LOOP_WITHIN_SCENE | SYNCED_SCENE_ACTIVATE_RAGDOLL_ON_COLLISION | SYNCED_SCENE_VEHICLE_ABORT_ON_LARGE_IMPACT)
INT iEntitySyncedSceneFlags = 0
iEntitySyncedSceneFlags += ENUM_TO_INT(SYNCED_SCENE_ABORT_ON_WEAPON_DAMAGE)
iEntitySyncedSceneFlags += ENUM_TO_INT(SYNCED_SCENE_LOOP_WITHIN_SCENE)
iEntitySyncedSceneFlags += ENUM_TO_INT(SYNCED_SCENE_ACTIVATE_RAGDOLL_ON_COLLISION)
iEntitySyncedSceneFlags += ENUM_TO_INT(SYNCED_SCENE_VEHICLE_ABORT_ON_LARGE_IMPACT)
PLAY_SYNCHRONIZED_ENTITY_ANIM(sObjMaudeChair.index, mSyncScene, GET_MAUDE_CHAIR_IDLE_ANIM(), GET_MAUDE_IDLE_ANIM_DICT(), INSTANT_BLEND_IN, NORMAL_BLEND_OUT, iEntitySyncedSceneFlags)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sMaude.index, TRUE)
SET_PED_MONEY(sMaude.index, 0)
SET_PED_CAN_BE_TARGETTED(sMaude.index, FALSE)
SET_PED_RELATIONSHIP_GROUP_HASH(sMaude.index, RELGROUPHASH_PLAYER)
SET_PED_PATH_CAN_USE_CLIMBOVERS(sMaude.index, FALSE) // Maude has serious timber, not realistic for her to vault
SET_PED_PATH_CAN_DROP_FROM_HEIGHT(sMaude.index, FALSE) // Maude has serious timber, not realistic for her to vault
SET_PED_KEEP_TASK(sMaude.index, TRUE)
SET_PED_CONFIG_FLAG(sMaude.index, PCF_RunFromFiresAndExplosions, FALSE) // B*1560870 - stop pop during exit anim
#IF IS_DEBUG_BUILD SET_PED_NAME_DEBUG(sMaude.index, "MISS_MAUDE") #ENDIF
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "SET_MAUDE_SYNC_SCENE : ", "done") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// creates and sets up Maude ready for the drop off
/// RETURNS:
/// TRUE is she is uninjured and setup
FUNC BOOL CREATE_AND_SETUP_MAUDE()
IF IS_COORD_IN_RANGE_OF_COORD(vPlayerPos, sMaude.vPos, 210.0)// 210.0 I think is the max dist for world brain stream dist
IF NOT bSetupMaude
IF SETUP_STAGE_REQUIREMENTS(RQ_MAUDE_ANIM)
AND SPAWN_OBJECT(sObjMaudeChair.index, sObjMaudeChair.model, sObjMaudeChair.vPos, sObjMaudeChair.fDir)
AND SPAWN_OBJECT(sObjMaudeLaptop.index, sObjMaudeLaptop.model, sObjMaudeLaptop.vPos, sObjMaudeLaptop.fDir)
// only spawn Maude once the chair and laptop has been setup
IF SPAWN_PED(sMaude.index, sMaude.model, sMaude.vPos, sMaude.fDir, TRUE, FALSE, TRUE)
SET_MAUDE_SYNC_SCENE()
bSetupMaude = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "CREATE_AND_SETUP_MAUDE : ", "done") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
// get handle to Maude's table (done set as mission entity since created by map instead uses para on DOES_OBJECT_OF_TYPE_EXIST_AT_COORDS)
IF NOT DOES_ENTITY_EXIST(sObjMaudeTable.index)
IF IS_COORD_IN_RANGE_OF_COORD(vPlayerPos, sObjMaudeTable.vPos, 150.0)
IF DOES_OBJECT_OF_TYPE_EXIST_AT_COORDS(sObjMaudeTable.vPos, 10.0, GET_MAUDE_TABLE_MODEL())
sObjMaudeTable.index = GET_CLOSEST_OBJECT_OF_TYPE(sObjMaudeTable.vPos, 10.0, GET_MAUDE_TABLE_MODEL(), TRUE)
IF IS_ENTITY_ALIVE(sObjMaudeTable.index)
SET_ENTITY_COORDS(sObjMaudeTable.index, GET_MAUDE_TABLE_POSITION())
SET_ENTITY_HEADING(sObjMaudeTable.index, GET_MAUDE_TABLE_HEADING())
FREEZE_ENTITY_POSITION(sObjMaudeTable.index, TRUE)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "CREATE_AND_SETUP_MAUDE : ", "grabbed handle to table") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
// get handle to Maude's Radio (done set as mission entity since created by map instead uses para on DOES_OBJECT_OF_TYPE_EXIST_AT_COORDS)
IF NOT DOES_ENTITY_EXIST(sObjMaudeRadio.index)
IF IS_COORD_IN_RANGE_OF_COORD(vPlayerPos, sObjMaudeRadio.vPos, 150.0)
IF DOES_OBJECT_OF_TYPE_EXIST_AT_COORDS(sObjMaudeRadio.vPos, 10.0, GET_MAUDE_RADIO_MODEL())
sObjMaudeRadio.index = GET_CLOSEST_OBJECT_OF_TYPE(sObjMaudeRadio.vPos, 10.0, GET_MAUDE_RADIO_MODEL(), TRUE)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "CREATE_AND_SETUP_MAUDE : ", "grabbed handle to radio") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ELSE
IF NOT IS_SPHERE_VISIBLE(sMaude.vPos, 2.5)
SAFE_REMOVE_PED(sMaude.index, TRUE)
REMOVE_ANIM_DICT(GET_MAUDE_IDLE_ANIM_DICT())
SAFE_REMOVE_OBJECT(sObjMaudeChair.index, TRUE)
SAFE_REMOVE_OBJECT(sObjMaudeLaptop.index, TRUE)
SAFE_REMOVE_OBJECT(sObjMaudeTable.index, FALSE)
SAFE_REMOVE_OBJECT(sObjMaudeRadio.index, FALSE)
bSetupMaude = FALSE
ENDIF
ENDIF
RETURN bSetupMaude
ENDFUNC
/// PURPOSE:
/// Updates the behaviour of the bail jumper ped
PROC UPDATE_BAIL_JUMPER_PED_AI()
WEAPON_TYPE wtTempCheckForUnarmed
VEHICLE_INDEX vehTempPlayer
VEHICLE_SEAT vehSeat
IF IS_PED_UNINJURED(sBailJumperPed.pedIndex)
// Update bail jumpers movement clipsets when surrendered
IF eBailJumperClipset = BB_JUMPER_MOVEMENT_CLIPSET_UNSET
UPDATE_PED_TAZERED_STATUS(sBailJumperPed.pedIndex, bHasJumperBeenTazered)
IF HAS_BAIL_JUMPER_SURRENDER_MOVEMENT_CLIPSETS_LOADED()
// only set once he's surrendered the first time
IF bHasBailJumperSurrendered
OR eMissionStage = MISSION_STAGE_TARGET_FLEES_AGAIN
IF bHasJumperBeenTazered
SET_PED_MOVEMENT_CLIPSET(sBailJumperPed.pedIndex, BAIL_JUMPER_MOVEMENT_CLIPSET_TAZERED())
eBailJumperClipset = BB_JUMPER_MOVEMENT_CLIPSET_TAZERED
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "UPDATE_BAIL_JUMPER_PED_AI ^^^ set tazered movement clipset from unset") ENDIF #ENDIF
ELSE
SET_PED_MOVEMENT_CLIPSET(sBailJumperPed.pedIndex, BAIL_JUMPER_MOVEMENT_CLIPSET_NORMAL())
eBailJumperClipset = BB_JUMPER_MOVEMENT_CLIPSET_NORMAL
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "UPDATE_BAIL_JUMPER_PED_AI ^^^ set normal movement clipset from unset") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ELIF eBailJumperClipset = BB_JUMPER_MOVEMENT_CLIPSET_NORMAL
// detect if he needs to switch to tazered version
UPDATE_PED_TAZERED_STATUS(sBailJumperPed.pedIndex, bHasJumperBeenTazered)
IF bHasJumperBeenTazered
IF HAS_BAIL_JUMPER_SURRENDER_MOVEMENT_CLIPSETS_LOADED()
SET_PED_MOVEMENT_CLIPSET(sBailJumperPed.pedIndex, BAIL_JUMPER_MOVEMENT_CLIPSET_TAZERED())
eBailJumperClipset = BB_JUMPER_MOVEMENT_CLIPSET_TAZERED
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "UPDATE_BAIL_JUMPER_PED_AI ^^^ set tazered movement clipset from normal clipset") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
IF NOT IS_PED_PERFORMING_STEALTH_KILL(PLAYER_PED_ID()) //having to test this because changes to tasks breaks the execution / takedown moves
SWITCH sBailJumperPed.AI
CASE BB_PED_AI_STATE_RELAXED
// should be playing the one phone anim
IF IS_ENTITY_IN_RANGE_COORDS(sBailJumperPed.pedIndex, vPlayerPos, 30.0)
IF IS_ENTITY_PLAYING_ANIM(sBailJumperPed.pedIndex, "ODDJOBS@BAILBOND_QUARRY", "prem_producer_argue_a")
STOP_ENTITY_ANIM(sBailJumperPed.pedIndex, "prem_producer_argue_a", "ODDJOBS@BAILBOND_QUARRY", REALLY_SLOW_BLEND_OUT)
ENDIF
sBailJumperPed.AI = BB_PED_AI_SETUP_ROUTINE
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "UPDATE_BAIL_JUMPER_PED_AI BB_PED_AI_STATE_RELAXED -> BB_PED_AI_SETUP_ROUTINE") ENDIF #ENDIF
ENDIF
BREAK
CASE BB_PED_AI_SETUP_ROUTINE
IF NOT IS_ENTITY_PLAYING_ANIM(sBailJumperPed.pedIndex, "ODDJOBS@BAILBOND_QUARRY", "prem_producer_argue_a")
SAFE_REMOVE_OBJECT(sObjectBailJumperPhone.index, TRUE)
IF NOT IS_PED_ACTIVE_IN_SCENARIO(sBailJumperPed.pedIndex)
TASK_START_SCENARIO_IN_PLACE(sBailJumperPed.pedIndex, "WORLD_HUMAN_SMOKING", 0, TRUE)
SET_PED_SHOULD_PLAY_IMMEDIATE_SCENARIO_EXIT(sBailJumperPed.pedIndex)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "UPDATE_BAIL_JUMPER_PED_AI - BB_PED_AI_SETUP_ROUTINE - bail jumper TASK_START_SCENARIO_AT_POSITION ") ENDIF #ENDIF
ENDIF
sBailJumperPed.AI = BB_PED_AI_STATE_ROUTINE
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "UPDATE_BAIL_JUMPER_PED_AI - BB_PED_AI_SETUP_ROUTINE -> bBB_PED_AI_STATE_ROUTINE") ENDIF #ENDIF
ENDIF
BREAK
CASE BB_PED_AI_STATE_ROUTINE
//currently an idle state - head track the player when he gets close
IF IS_ENTITY_IN_RANGE_COORDS(sBailJumperPed.pedIndex, vPlayerPos, 20.0) // Trevor approach comment dist
IF NOT IS_PED_HEADTRACKING_PED(sBailJumperPed.pedIndex, PLAYER_PED_ID())
TASK_LOOK_AT_ENTITY(sBailJumperPed.pedIndex, PLAYER_PED_ID(), -1)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "UPDATE_BAIL_JUMPER_PED_AI ~~~ set look at player - BB_PED_AI_STATE_RELAXED") ENDIF #ENDIF
ENDIF
ELSE
IF IS_PED_HEADTRACKING_PED(sBailJumperPed.pedIndex, PLAYER_PED_ID())
TASK_CLEAR_LOOK_AT(sBailJumperPed.pedIndex)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "UPDATE_BAIL_JUMPER_PED_AI ~~~ Clear look at player - BB_PED_AI_STATE_RELAXED") ENDIF #ENDIF
ENDIF
ENDIF
BREAK
CASE BB_PED_AI_SETUP_AWARE_OF_PLAYER
IF HAS_TIME_PASSED(sBailJumperPed.iAiDelayTimer, GET_RANDOM_INT_IN_RANGE(250, 500))
IF IS_PED_USING_ANY_SCENARIO(sBailJumperPed.pedIndex)
SET_PED_SHOULD_PLAY_IMMEDIATE_SCENARIO_EXIT(sBailJumperPed.pedIndex)
ENDIF
TASK_LOOK_AT_ENTITY(sBailJumperPed.pedIndex, PLAYER_PED_ID(), -1)
TASK_TURN_PED_TO_FACE_ENTITY(sBailJumperPed.pedIndex, PLAYER_PED_ID(), -1)
sBailJumperPed.AI = BB_PED_AI_STATE_AWARE_OF_PLAYER
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "UPDATE_BAIL_JUMPER_PED_AI - BB_PED_AI_SETUP_AWARE_OF_PLAYER - set") ENDIF #ENDIF
ENDIF
BREAK
CASE BB_PED_AI_STATE_AWARE_OF_PLAYER
IF NOT IsPedPerformingTask(sBailJumperPed.pedIndex, SCRIPT_TASK_TURN_PED_TO_FACE_ENTITY)
sBailJumperPed.iAiDelayTimer = (GET_GAME_TIMER() - 5000) // ensure a task reapply will go through first attempt
sBailJumperPed.AI = BB_PED_AI_SETUP_AWARE_OF_PLAYER
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "UPDATE_BAIL_JUMPER_PED_AI - BB_PED_AI_STATE_AWARE_OF_PLAYER - reapply") ENDIF #ENDIF
ENDIF
BREAK
CASE BB_PED_AI_SETUP_MOVE_TOWARDS_PLAYER
IF NOT IS_PED_HEADTRACKING_PED(sBailJumperPed.pedIndex, PLAYER_PED_ID())
TASK_LOOK_AT_ENTITY(sBailJumperPed.pedIndex, PLAYER_PED_ID(), -1)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "UPDATE_BAIL_JUMPER_PED_AI ~~~ set look at player - BB_PED_AI_SETUP_MOVE_TOWARDS_PLAYER") ENDIF #ENDIF
ENDIF
TASK_GO_TO_ENTITY(sBailJumperPed.pedIndex, PLAYER_PED_ID(), DEFAULT_TIME_BEFORE_WARP, 2.5, PEDMOVEBLENDRATIO_WALK)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sBailJumperPed.pedIndex, TRUE)
sBailJumperPed.AI = BB_PED_AI_STATE_MOVE_TOWARDS_PLAYER
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "UPDATE_BAIL_JUMPER_PED_AI ~~~ done - BB_PED_AI_SETUP_MOVE_TOWARDS_PLAYER") ENDIF #ENDIF
BREAK
CASE BB_PED_AI_STATE_MOVE_TOWARDS_PLAYER
IF NOT IS_ENTITY_IN_RANGE_COORDS(sBailJumperPed.pedIndex, vPlayerPos, 3.5)
IF NOT IsPedPerformingTask(sBailJumperPed.pedIndex, SCRIPT_TASK_GO_TO_ENTITY)
sBailJumperPed.AI = BB_PED_AI_SETUP_MOVE_TOWARDS_PLAYER
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "UPDATE_BAIL_JUMPER_PED_AI ~~~ reapply - BB_PED_AI_STATE_MOVE_TOWARDS_PLAYER") ENDIF #ENDIF
ELSE
SET_PED_MOVE_RATE_OVERRIDE(sBailJumperPed.pedIndex, 1.1) //1.15)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "UPDATE_BAIL_JUMPER_PED_AI ~~~ ovrride speed this frame - BB_PED_AI_STATE_MOVE_TOWARDS_PLAYER") ENDIF #ENDIF
ENDIF
ELSE
IF NOT IsPedPerformingTask(sBailJumperPed.pedIndex, SCRIPT_TASK_TURN_PED_TO_FACE_ENTITY)
TASK_TURN_PED_TO_FACE_ENTITY(sBailJumperPed.pedIndex, PLAYER_PED_ID(), -1)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "UPDATE_BAIL_JUMPER_PED_AI ~~~ applied turn to face task - BB_PED_AI_STATE_MOVE_TOWARDS_PLAYER") ENDIF #ENDIF
ENDIF
ENDIF
BREAK
CASE BB_PED_AI_SETUP_MELEE_ATTACK
IF HAS_TIME_PASSED(sBailJumperPed.iAiDelayTimer, GET_RANDOM_INT_IN_RANGE(250, 1000)) // small delay in his reaction
IF IS_PED_USING_ANY_SCENARIO(sBailJumperPed.pedIndex)
SET_PED_SHOULD_PLAY_IMMEDIATE_SCENARIO_EXIT(sBailJumperPed.pedIndex)
//TRIGGER_PED_SCENARIO_PANICEXITTOCOMBAT(sBailJumperPed.pedIndex, PLAYER_PED_ID())
//ELSE
// CLEAR_PED_TASKS(sBailJumperPed.pedIndex)
ENDIF
SET_PED_COMBAT_RANGE(sBailJumperPed.pedIndex, CR_NEAR)
SET_PED_COMBAT_ATTRIBUTES(sBailJumperPed.pedIndex, CA_ALWAYS_FIGHT, TRUE) // attempt to stop security ped taking cover during brawl
SET_PED_COMBAT_ATTRIBUTES(sBailJumperPed.pedIndex, CA_USE_COVER, FALSE) // attempt to stop security ped taking cover during brawl
TASK_COMBAT_PED(sBailJumperPed.pedIndex, PLAYER_PED_ID())
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sBailJumperPed.pedIndex, TRUE)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "UPDATE_BAIL_JUMPER_PED_AI ~~~ BB_PED_AI_SETUP_MELEE_ATTACK") ENDIF #ENDIF
sBailJumperPed.AI = BB_PED_AI_STATE_MELEE_ATTACK
ENDIF
BREAK
CASE BB_PED_AI_STATE_MELEE_ATTACK
IF NOT IsPedPerformingTask(sBailJumperPed.pedIndex, SCRIPT_TASK_COMBAT)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "UPDATE_BAIL_JUMPER_PED_AI ~~~ BB_PED_AI_STATE_MELEE_ATTACK - kicking back to BB_PED_AI_SETUP_MELEE_ATTACK") ENDIF #ENDIF
sBailJumperPed.iAiDelayTimer = (GET_GAME_TIMER() - 5000) // ensure the task reapply has no delay
sBailJumperPed.AI = BB_PED_AI_SETUP_MELEE_ATTACK
ENDIF
BREAK
CASE BB_PED_AI_SETUP_BEATEN_UP
SET_PED_COMBAT_ATTRIBUTES(sBailJumperPed.pedIndex, CA_ALWAYS_FIGHT, FALSE)
SET_PED_CAN_RAGDOLL(sBailJumperPed.pedIndex, TRUE)
IF NOT IS_PED_RAGDOLL(sBailJumperPed.pedIndex)
SET_PED_TO_RAGDOLL(sBailJumperPed.pedIndex, 1000, 1000, TASK_RELAX)
ENDIF
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "UPDATE_BAIL_JUMPER_PED_AI ~~~ BB_PED_AI_STATE_BEATEN_UP") ENDIF #ENDIF
sBailJumperPed.AI = BB_PED_AI_STATE_BEATEN_UP
BREAK
CASE BB_PED_AI_STATE_BEATEN_UP
IF NOT IS_PED_RAGDOLL(sBailJumperPed.pedIndex)
IF NOT IsPedPerformingTask(sBailJumperPed.pedIndex, SCRIPT_TASK_COWER)
AND NOT IsPedPerformingTask(sBailJumperPed.pedIndex, SCRIPT_TASK_HANDS_UP)
IF NOT IS_ENTITY_IN_WATER(sBailJumperPed.pedIndex)
SET_PED_COWER_HASH(sBailJumperPed.pedIndex, "CODE_HUMAN_STAND_COWER")
TASK_COWER(sBailJumperPed.pedIndex, -1)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sBailJumperPed.pedIndex, TRUE)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "UPDATE_BAIL_JUMPER_PED_AI ~~~ BB_PED_AI_STATE_BEATEN_UP - set up cower") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE BB_PED_AI_SETUP_AIM_GUN_AND_ADVANCE
GET_CURRENT_PED_WEAPON(sBailJumperPed.pedIndex, wtTempCheckForUnarmed)
IF wtTempCheckForUnarmed = WEAPONTYPE_UNARMED
GIVE_WEAPON_TO_PED(sBailJumperPed.pedIndex, WEAPONTYPE_PISTOL, -1, FALSE)
ENDIF
SET_PED_COMBAT_ATTRIBUTES(sBailJumperPed.pedIndex, CA_USE_COVER, FALSE)
SET_PED_COMBAT_RANGE(sBailJumperPed.pedIndex, CR_NEAR)
SET_PED_ACCURACY(sBailJumperPed.pedIndex, 15)
CLEAR_PED_TASKS(sBailJumperPed.pedIndex)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sBailJumperPed.pedIndex, TRUE)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "UPDATE_BAIL_JUMPER_PED_AI ~~~ BB_PED_AI_SETUP_AIM_GUN_AND_ADVANCE - going to BB_PED_AI_STATE_AIM_GUN_AND_ADVANCE") ENDIF #ENDIF
sBailJumperPed.AI = BB_PED_AI_STATE_AIM_GUN_AND_ADVANCE
BREAK
CASE BB_PED_AI_STATE_AIM_GUN_AND_ADVANCE
IF NOT IsPedPerformingTask(sBailJumperPed.pedIndex, SCRIPT_TASK_PERFORM_SEQUENCE)
FLOAT fRandomSeekRadius
fRandomSeekRadius = GET_RANDOM_FLOAT_IN_RANGE(5.0, 8.0)
OPEN_SEQUENCE_TASK(sequenceAI)
TASK_GOTO_ENTITY_AIMING(NULL, PLAYER_PED_ID(), fRandomSeekRadius, 30.0)
TASK_AIM_GUN_AT_ENTITY(NULL, PLAYER_PED_ID(), 2000, FALSE)
CLOSE_SEQUENCE_TASK(sequenceAI)
//CLEAR_PED_TASKS_IMMEDIATELY(sBailJumperPed.pedIndex) //we do this because CLEAR_PED_TASKS doesn't always switch the task straight away, e.g. when brawling
TASK_PERFORM_SEQUENCE(sBailJumperPed.pedIndex, sequenceAI)
CLEAR_SEQUENCE_TASK(sequenceAI)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sBailJumperPed.pedIndex, TRUE)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "UPDATE_BAIL_JUMPER_PED_AI ~~~ BB_PED_AI_STATE_AIM_GUN_AND_ADVANCE - reapplied tasks") ENDIF #ENDIF
ENDIF
BREAK
CASE BB_PED_AI_SETUP_GUN_COMBAT
IF HAS_TIME_PASSED(sBailJumperPed.iAiDelayTimer, GET_RANDOM_INT_IN_RANGE(250, 750)) // small delay in his reaction
SET_PED_COMBAT_ATTRIBUTES(sBailJumperPed.pedIndex, CA_USE_COVER, TRUE)
SET_PED_COMBAT_RANGE(sBailJumperPed.pedIndex, CR_NEAR)
SET_PED_ACCURACY(sBailJumperPed.pedIndex, GET_RANDOM_INT_IN_RANGE(10, 22))
SET_PED_SHOOT_RATE(sBailJumperPed.pedIndex, GET_RANDOM_INT_IN_RANGE(30, 60))
SET_PED_FIRING_PATTERN(sBailJumperPed.pedIndex, FIRING_PATTERN_DELAY_FIRE_BY_ONE_SEC)
GET_CURRENT_PED_WEAPON(sBailJumperPed.pedIndex, wtTempCheckForUnarmed)
IF wtTempCheckForUnarmed = WEAPONTYPE_UNARMED
GIVE_WEAPON_TO_PED(sBailJumperPed.pedIndex, WEAPONTYPE_PISTOL, -1, FALSE)
SET_CURRENT_PED_WEAPON(sBailJumperPed.pedIndex, WEAPONTYPE_PISTOL, FALSE)
ENDIF
TASK_COMBAT_PED(sBailJumperPed.pedIndex, PLAYER_PED_ID())
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sBailJumperPed.pedIndex, TRUE)
sBailJumperPed.AI = BB_PED_AI_STATE_GUN_COMBAT
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "UPDATE_BAIL_JUMPER_PED_AI ~~~ BB_PED_AI_SETUP_GUN_COMBAT - going to BB_PED_AI_STATE_GUN_COMBAT") ENDIF #ENDIF
ENDIF
BREAK
CASE BB_PED_AI_STATE_GUN_COMBAT
IF NOT IsPedPerformingTask(sBailJumperPed.pedIndex, SCRIPT_TASK_COMBAT)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "UPDATE_BAIL_JUMPER_PED_AI ~~~ BB_PED_AI_STATE_GUN_COMBAT - going back to BB_PED_AI_SETUP_GUN_COMBAT") ENDIF #ENDIF
sBailJumperPed.iAiDelayTimer = (GET_GAME_TIMER() - 5000) // ensure the task reapply has no delay
sBailJumperPed.AI = BB_PED_AI_SETUP_GUN_COMBAT
ENDIF
/*IF (VDIST(GET_ENTITY_COORDS(sBailJumperPed.pedIndex), sBailBondLaunchData.vStartPoint) >= BAIL_JUMPER_PERIMETER)
// SET_PED_COMBAT_MOVEMENT(sBailJumperPed.pedIndex, CM_STATIONARY)
//ELIF IS_ENTITY_INSIDE_MUSIC_CLUB_INTERIOR(PLAYER_PED_ID())
SET_PED_COMBAT_MOVEMENT(sBailJumperPed.pedIndex, CM_DEFENSIVE)
ELSE
SET_PED_COMBAT_MOVEMENT(sBailJumperPed.pedIndex, CM_WILLADVANCE)
ENDIF*/
BREAK
CASE BB_PED_AI_SETUP_FLEE_ON_FOOT
IF HAS_TIME_PASSED(sBailJumperPed.iAiDelayTimer, GET_RANDOM_INT_IN_RANGE(0, 500))
IF IS_PED_USING_ANY_SCENARIO(sBailJumperPed.pedIndex)
SET_PED_PANIC_EXIT_SCENARIO(sBailJumperPed.pedIndex, vPlayerPos)
ENDIF
GET_CURRENT_PED_WEAPON(sBailJumperPed.pedIndex, wtTempCheckForUnarmed)
IF wtTempCheckForUnarmed != WEAPONTYPE_UNARMED
SET_PED_DROPS_WEAPON(sBailJumperPed.pedIndex)
REMOVE_ALL_PED_WEAPONS(sBailJumperPed.pedIndex)
SET_CURRENT_PED_WEAPON(sBailJumperPed.pedIndex, WEAPONTYPE_UNARMED, TRUE)
SET_PED_CAN_SWITCH_WEAPON(sBailJumperPed.pedIndex, FALSE)
ENDIF
SET_PED_FLEE_ATTRIBUTES(sBailJumperPed.pedIndex, FA_USE_VEHICLE, FALSE)
SET_PED_FLEE_ATTRIBUTES(sBailJumperPed.pedIndex, FA_RETURN_TO_ORIGNAL_POSITION_AFTER_FLEE, FALSE)
SET_PED_FLEE_ATTRIBUTES(sBailJumperPed.pedIndex, FA_DISABLE_HANDS_UP, FALSE)
SET_PED_FLEE_ATTRIBUTES(sBailJumperPed.pedIndex, FA_PREFER_PAVEMENTS, FALSE)
SET_PED_FLEE_ATTRIBUTES(sBailJumperPed.pedIndex, FA_USE_COVER, FALSE)
SET_PED_FLEE_ATTRIBUTES(sBailJumperPed.pedIndex, FA_LOOK_FOR_CROWDS, FALSE)
SET_PED_COMBAT_ATTRIBUTES(sBailJumperPed.pedIndex, CA_ALWAYS_FIGHT, FALSE)
SET_PED_COMBAT_ATTRIBUTES(sBailJumperPed.pedIndex, CA_ALWAYS_FLEE, TRUE)
OPEN_SEQUENCE_TASK(sequenceAI)
IF IS_PED_IN_ANY_VEHICLE(sBailJumperPed.pedIndex)
TASK_LEAVE_ANY_VEHICLE(NULL, 0, ECF_DONT_WAIT_FOR_VEHICLE_TO_STOP)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "UPDATE_BAIL_JUMPER_PED_AI ~~~ ", "BB_PED_AI_SETUP_FLEE - ped told to exit vehicle") ENDIF #ENDIF
ENDIF
TASK_SMART_FLEE_PED(NULL, PLAYER_PED_ID(), 200.0, -1) //, TRUE)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "UPDATE_BAIL_JUMPER_PED_AI ~~~ ", "BB_PED_AI_SETUP_FLEE - ped setup to flee on foot") ENDIF #ENDIF
CLOSE_SEQUENCE_TASK(sequenceAI)
TASK_PERFORM_SEQUENCE(sBailJumperPed.pedIndex, sequenceAI)
CLEAR_SEQUENCE_TASK(sequenceAI)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sBailJumperPed.pedIndex, TRUE)
SET_PED_KEEP_TASK(sBailJumperPed.pedIndex, TRUE)
sBailJumperPed.AI = BB_PED_AI_STATE_FLEE_ON_FOOT
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "UPDATE_BAIL_JUMPER_PED_AI - BB_PED_AI_SETUP_FLEE_ON_FOOT - set") ENDIF #ENDIF
ELSE
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "UPDATE_BAIL_JUMPER_PED_AI - BB_PED_AI_SETUP_FLEE_ON_FOOT - unable to set this frame due to ai delay: iAiDelayTimer = ", sBailJumperPed.iAiDelayTimer, " game timer = ", GET_GAME_TIMER()) ENDIF #ENDIF
ENDIF
BREAK
CASE BB_PED_AI_STATE_FLEE_ON_FOOT
IF NOT IsPedPerformingTask(sBailJumperPed.pedIndex, SCRIPT_TASK_SMART_FLEE_PED)
//AND NOT IsPedPerformingTask(sBailJumperPed.pedIndex, SCRIPT_TASK_COWER)
//AND NOT IsPedPerformingTask(sBailJumperPed.pedIndex, SCRIPT_TASK_HANDS_UP)
AND NOT IS_PED_FLEEING(sBailJumperPed.pedIndex)
sBailJumperPed.iAiDelayTimer = (GET_GAME_TIMER() - 5000) // ensure a task reapply will go through first attempt
sBailJumperPed.AI = BB_PED_AI_SETUP_FLEE_ON_FOOT
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "UPDATE_BAIL_JUMPER_PED_AI - BB_PED_AI_STATE_FLEE_ON_FOOT - reapply") ENDIF #ENDIF
ENDIF
BREAK
CASE BB_PED_AI_SETUP_FLEE_TO_VEHICLE
SET_PED_FLEE_ATTRIBUTES(sBailJumperPed.pedIndex, FA_USE_VEHICLE, TRUE)
SET_PED_FLEE_ATTRIBUTES(sBailJumperPed.pedIndex, FA_RETURN_TO_ORIGNAL_POSITION_AFTER_FLEE, FALSE)
SET_PED_FLEE_ATTRIBUTES(sBailJumperPed.pedIndex, FA_DISABLE_HANDS_UP, FALSE)
SET_PED_FLEE_ATTRIBUTES(sBailJumperPed.pedIndex, FA_PREFER_PAVEMENTS, FALSE)
SET_PED_FLEE_ATTRIBUTES(sBailJumperPed.pedIndex, FA_USE_COVER, FALSE)
SET_PED_FLEE_ATTRIBUTES(sBailJumperPed.pedIndex, FA_LOOK_FOR_CROWDS, FALSE)
SET_PED_COMBAT_ATTRIBUTES(sBailJumperPed.pedIndex, CA_ALWAYS_FIGHT, FALSE)
SET_PED_COMBAT_ATTRIBUTES(sBailJumperPed.pedIndex, CA_ALWAYS_FLEE, TRUE)
SET_PED_RESET_FLAG(sBailJumperPed.pedIndex, PRF_UseFastEnterExitVehicleRates, TRUE)
// check ped should still try to reach his car
IF IS_VEHICLE_OK(sMissionVehicle[0].index) //if Musician vehicle is ok to use
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), sMissionVehicle[0].index)
AND IS_ENTITY_IN_RANGE_COORDS(sMissionVehicle[0].index, sMissionVehicle[0].vPos, 3.0) //if Musician vehicle pos hasn't changed much
AND IS_DIFFERENCE_IN_HEADINGS_LESS_THAN_OR_EQUAL_TO_THE_TOLERANCE(GET_ENTITY_HEADING(sMissionVehicle[0].index), sMissionVehicle[0].fDir, 20.0) //if Musician vehicle heading hasn't changed much //if Player isn't already in the vehicle
AND NOT ARE_VEHICLE_TYRES_BURST(sMissionVehicle[0].index, 2)
IF IS_PED_IN_VEHICLE(sBailJumperPed.pedIndex, sMissionVehicle[0].index) //if Musician isn't already in the vehicle
AND NOT IS_PED_BEING_JACKED(sBailJumperPed.pedIndex) //if Musician isn't being jacked.
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "UPDATE_BAIL_JUMPER_PED_AI ~~~ ", "BB_PED_AI_SETUP_FLEE_TO_VEHICLE going to BB_PED_AI_STATE_FLEE_TO_VEHICLE without task as in the vehicle") ENDIF #ENDIF
sBailJumperPed.AI = BB_PED_AI_STATE_FLEE_TO_VEHICLE
ELSE
IF HAS_TIME_PASSED(sBailJumperPed.iAiDelayTimer, GET_RANDOM_INT_IN_RANGE(250, 350)) //slight delay
SAFE_REMOVE_OBJECT(sObjectBailJumperPhone.index, FALSE) // just drop the phone if it's still in hand
IF IS_ENTITY_PLAYING_ANIM(sBailJumperPed.pedIndex, "ODDJOBS@BAILBOND_QUARRY", "prem_producer_argue_a")
STOP_ENTITY_ANIM(sBailJumperPed.pedIndex, "prem_producer_argue_a", "ODDJOBS@BAILBOND_QUARRY", SLOW_BLEND_OUT)
ELIF IS_PED_USING_ANY_SCENARIO(sBailJumperPed.pedIndex)
SET_PED_PANIC_EXIT_SCENARIO(sBailJumperPed.pedIndex, vPlayerPos)
ELSE
CLEAR_PED_TASKS(sBailJumperPed.pedIndex)
ENDIF
TASK_ENTER_VEHICLE(sBailJumperPed.pedIndex, sMissionVehicle[0].index, 25000, VS_DRIVER, PEDMOVEBLENDRATIO_SPRINT, ECF_DONT_JACK_ANYONE) // increased DEFAULT_TIME_BEFORE_WARP since he has a fair way to run
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sBailJumperPed.pedIndex, TRUE)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "UPDATE_BAIL_JUMPER_PED_AI ~~~ ", "BB_PED_AI_SETUP_FLEE_TO_VEHICLE going to BB_PED_AI_STATE_FLEE_TO_VEHICLE") ENDIF #ENDIF
sBailJumperPed.AI = BB_PED_AI_STATE_FLEE_TO_VEHICLE
ENDIF
ENDIF
ELSE
sBailJumperPed.iAiDelayTimer = GET_GAME_TIMER() - 5000
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "UPDATE_BAIL_JUMPER_PED_AI ~~~ ", "BB_PED_AI_SETUP_FLEE_TO_VEHICLE going to BB_PED_AI_SETUP_FLEE_ON_FOOT") ENDIF #ENDIF
sBailJumperPed.AI = BB_PED_AI_SETUP_FLEE_ON_FOOT
ENDIF
ELSE
sBailJumperPed.iAiDelayTimer = GET_GAME_TIMER() - 5000
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "UPDATE_BAIL_JUMPER_PED_AI ~~~ ", "BB_PED_AI_SETUP_FLEE_TO_VEHICLE going to BB_PED_AI_SETUP_FLEE_ON_FOOT") ENDIF #ENDIF
sBailJumperPed.AI = BB_PED_AI_SETUP_FLEE_ON_FOOT
ENDIF
BREAK
CASE BB_PED_AI_STATE_FLEE_TO_VEHICLE
SET_PED_RESET_FLAG(sBailJumperPed.pedIndex, PRF_UseFastEnterExitVehicleRates, TRUE)
IF NOT IS_VEHICLE_OK(sMissionVehicle[0].index)
sBailJumperPed.iAiDelayTimer = GET_GAME_TIMER() - 5000
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "UPDATE_BAIL_JUMPER_PED_AI ~~~ ", "BB_PED_AI_STATE_FLEE_TO_VEHICLE - going to BB_PED_AI_SETUP_FLEE_ON_FOOT - car not ok") ENDIF #ENDIF
sBailJumperPed.AI = BB_PED_AI_SETUP_FLEE_ON_FOOT
ELIF (IS_PED_IN_VEHICLE(PLAYER_PED_ID(), sMissionVehicle[0].index, TRUE)
OR IS_PED_BEING_JACKED(sBailJumperPed.pedIndex)
OR NOT IS_ENTITY_IN_RANGE_COORDS(sMissionVehicle[0].index, sMissionVehicle[0].vPos, 3.0)
OR NOT IS_DIFFERENCE_IN_HEADINGS_LESS_THAN_OR_EQUAL_TO_THE_TOLERANCE(GET_ENTITY_HEADING(sMissionVehicle[0].index), sMissionVehicle[0].fDir, 20.0))
OR ARE_VEHICLE_TYRES_BURST(sMissionVehicle[0].index, 2)
sBailJumperPed.iAiDelayTimer = GET_GAME_TIMER() - 5000
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "UPDATE_BAIL_JUMPER_PED_AI ~~~ ", "BB_PED_AI_STATE_FLEE_TO_VEHICLE - going to BB_PED_AI_SETUP_FLEE_ON_FOOT - reason to abort") ENDIF #ENDIF
sBailJumperPed.AI = BB_PED_AI_SETUP_FLEE_ON_FOOT
ELIF IS_PED_SITTING_IN_VEHICLE(sBailJumperPed.pedIndex, sMissionVehicle[0].index)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "UPDATE_BAIL_JUMPER_PED_AI ~~~ ", "BB_PED_AI_STATE_FLEE_TO_VEHICLE - going to BB_PED_AI_SETUP_TEMP_OVERRIDE_AI_CONTROL ") ENDIF #ENDIF
sBailJumperPed.AI = BB_PED_AI_SETUP_TEMP_OVERRIDE_AI_CONTROL
ELSE
IF NOT IsPedPerformingTask(sBailJumperPed.pedIndex, SCRIPT_TASK_ENTER_VEHICLE)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "UPDATE_BAIL_JUMPER_PED_AI ~~~ ", "BB_PED_AI_STATE_FLEE_TO_VEHICLE - going to BB_PED_AI_SETUP_FLEE_TO_VEHICLE") ENDIF #ENDIF
sBailJumperPed.AI = BB_PED_AI_SETUP_FLEE_TO_VEHICLE
ENDIF
ENDIF
BREAK
CASE BB_PED_AI_SETUP_FLEE_IN_VEHICLE
IF IS_VEHICLE_OK(sMissionVehicle[0].index) //if Musician vehicle is ok to use //if Player isn't already in the vehicle
AND IS_PED_SITTING_IN_VEHICLE(sBailJumperPed.pedIndex, sMissionVehicle[0].index) //if Musician isn't already in the vehicle
TASK_VEHICLE_MISSION_PED_TARGET(sBailJumperPed.pedIndex, sMissionVehicle[0].index, PLAYER_PED_ID(), MISSION_FLEE, 30.0, DRIVINGMODE_AVOIDCARS_RECKLESS, 350.0, 30)//-1.0)
SET_PED_CONFIG_FLAG(sBailJumperPed.pedIndex, PCF_AllowPlayerToInterruptVehicleEntryExit, FALSE) //reset this from getting in state
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sBailJumperPed.pedIndex, TRUE)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "UPDATE_BAIL_JUMPER_PED_AI ~~~ ", "BB_PED_AI_SETUP_FLEE_IN_VEHICLE going to BB_PED_AI_STATE_FLEE_IN_VEHICLE") ENDIF #ENDIF
sBailJumperPed.AI = BB_PED_AI_STATE_FLEE_IN_VEHICLE
ELSE
IF NOT IS_PED_GETTING_INTO_A_VEHICLE(sBailJumperPed.pedIndex)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "UPDATE_BAIL_JUMPER_PED_AI ~~~ ", "BB_PED_AI_SETUP_FLEE_IN_VEHICLE going to BB_PED_AI_SETUP_FLEE_ON_FOOT") ENDIF #ENDIF
sBailJumperPed.AI = BB_PED_AI_SETUP_FLEE_ON_FOOT
ENDIF
ENDIF
BREAK
CASE BB_PED_AI_STATE_FLEE_IN_VEHICLE
IF NOT IsPedPerformingTask(sBailJumperPed.pedIndex, SCRIPT_TASK_VEHICLE_MISSION)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "UPDATE_BAIL_JUMPER_PED_AI ~~~ ", "BB_PED_AI_STATE_FLEE_IN_VEHICLE - going to BB_PED_AI_SETUP_FLEE_IN_VEHICLE") ENDIF #ENDIF
sBailJumperPed.AI = BB_PED_AI_SETUP_FLEE_IN_VEHICLE
ENDIF
BREAK
CASE BB_PED_AI_SETUP_FRIGHTENED
CLEAR_PED_TASKS(sBailJumperPed.pedIndex)
SET_PED_COMBAT_ATTRIBUTES(sBailJumperPed.pedIndex, CA_ALWAYS_FIGHT, FALSE)
SET_PED_COWER_HASH(sBailJumperPed.pedIndex, "CODE_HUMAN_STAND_COWER")
TASK_COWER(sBailJumperPed.pedIndex, -1)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sBailJumperPed.pedIndex, TRUE)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "UPDATE_BAIL_JUMPER_PED_AI ~~~ ", "BB_PED_AI_SETUP_FRIGHTENED done") ENDIF #ENDIF
sBailJumperPed.AI = BB_PED_AI_STATE_FRIGHTENED
BREAK
CASE BB_PED_AI_STATE_FRIGHTENED
IF NOT IS_PED_RAGDOLL(sBailJumperPed.pedIndex)
IF NOT IsPedPerformingTask(sBailJumperPed.pedIndex, SCRIPT_TASK_COWER)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "UPDATE_BAIL_JUMPER_PED_AI ~~~ ", "BB_PED_AI_STATE_FRIGHTENED done") ENDIF #ENDIF
sBailJumperPed.AI = BB_PED_AI_SETUP_FRIGHTENED
ENDIF
ENDIF
BREAK
CASE BB_PED_AI_SETUP_FOLLOW_PLAYER
IF IS_PLAYER_INTIMIDATE_SPECIFIC_PED(sBailJumperPed.pedIndex, sBailJumperPed.iFrameCountLastSeenPlayer, 100, TRUE)
OR SHOULD_BAIL_JUMPER_DELAY_FOLLOW_BEHAVIOUR()
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "UPDATE_BAIL_JUMPER_PED_AI ~~~ ", "BB_PED_AI_SETUP_FOLLOW_PLAYER -> BB_PED_AI_SETUP_SURRENDERED") ENDIF #ENDIF
sBailJumperPed.AI = BB_PED_AI_SETUP_SURRENDERED
ELSE
IF DOES_GROUP_EXIST(PLAYER_GROUP_ID())
// B*1534772 - can only be applied is task is active (so exclude normal WAITING_TO_START_TASK check)
IF (GET_SCRIPT_TASK_STATUS(sBailJumperPed.pedIndex, SCRIPT_TASK_HANDS_UP) = PERFORMING_TASK)
UPDATE_TASK_HANDS_UP_DURATION(sBailJumperPed.pedIndex, 500)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "UPDATE_BAIL_JUMPER_PED_AI ~~~ ", " BB_PED_AI_SETUP_FOLLOW_PLAYER updated hands up durationto 500 ###") ENDIF #ENDIF
ELSE
CLEAR_PED_TASKS(sBailJumperPed.pedIndex)
CLEAR_PED_SECONDARY_TASK(sBailJumperPed.pedIndex)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "UPDATE_BAIL_JUMPER_PED_AI ~~~ ", " BB_PED_AI_SETUP_FOLLOW_PLAYER ped tasks cleared") ENDIF #ENDIF
ENDIF
IF NOT IS_PED_GROUP_MEMBER(sBailJumperPed.pedIndex, PLAYER_GROUP_ID())
SET_PED_AS_GROUP_MEMBER(sBailJumperPed.pedIndex, PLAYER_GROUP_ID())
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "UPDATE_BAIL_JUMPER_PED_AI ~~~ ", " BB_PED_AI_SETUP_FOLLOW_PLAYER already in group so removed to put back in") ENDIF #ENDIF
ELSE
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "UPDATE_BAIL_JUMPER_PED_AI ~~~ ", "BB_PED_AI_SETUP_FOLLOW_PLAYER already in group ****") ENDIF #ENDIF
ENDIF
SET_GROUP_FORMATION(PLAYER_GROUP_ID(), FORMATION_LOOSE)
SET_GROUP_FORMATION_SPACING(PLAYER_GROUP_ID(), 1.5, 3.5)
SET_PED_GROUP_MEMBER_PASSENGER_INDEX(sBailJumperPed.pedIndex, VS_FRONT_RIGHT)
SET_PED_PATH_CAN_USE_CLIMBOVERS(sBailJumperPed.pedIndex, TRUE)
SET_PED_PATH_CAN_USE_LADDERS(sBailJumperPed.pedIndex, TRUE)
SET_PED_PATH_MAY_ENTER_WATER(sBailJumperPed.pedIndex, TRUE)
SET_PED_PATH_PREFER_TO_AVOID_WATER(sBailJumperPed.pedIndex, TRUE)
SET_PED_PATH_CAN_DROP_FROM_HEIGHT(sBailJumperPed.pedIndex, FALSE)
SET_PED_PATH_AVOID_FIRE(sBailJumperPed.pedIndex, TRUE)
SET_PED_CONFIG_FLAG(sBailJumperPed.pedIndex, PCF_DontEnterVehiclesInPlayersGroup, TRUE) //used to control which vehicles the ped will get into
SET_PED_CONFIG_FLAG(sBailJumperPed.pedIndex, PCF_RunFromFiresAndExplosions, TRUE)
//SET_PED_NEVER_LEAVES_GROUP(ped, TRUE)
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(sBailJumperPed.pedIndex, TRUE) // whilst in the ped group
// group specific stuff -
SET_ENTITY_LOAD_COLLISION_FLAG(sBailJumperPed.pedIndex, TRUE)
SET_PED_CONFIG_FLAG(sBailJumperPed.pedIndex, PCF_DontInfluenceWantedLevel, TRUE)
SET_PED_DIES_IN_WATER(sBailJumperPed.pedIndex, TRUE)
SET_PED_DIES_IN_SINKING_VEHICLE(sBailJumperPed.pedIndex, TRUE)
SET_PED_MAX_TIME_IN_WATER(sBailJumperPed.pedIndex, 2.0)
SET_PED_MAX_TIME_UNDERWATER(sBailJumperPed.pedIndex, 2.0)
SET_PED_PATH_PREFER_TO_AVOID_WATER(sBailJumperPed.pedIndex, TRUE)
SET_PED_CONFIG_FLAG(sBailJumperPed.pedIndex, PCF_RunFromFiresAndExplosions, TRUE)
// cover stuff added for B*1266421
SET_PED_FLEE_ATTRIBUTES(sBailJumperPed.pedIndex, FA_USE_COVER, FALSE)
SET_PED_COMBAT_ATTRIBUTES(sBailJumperPed.pedIndex, CA_ALWAYS_FLEE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(sBailJumperPed.pedIndex, CA_USE_COVER, FALSE)
SET_PED_RESET_FLAG(sBailJumperPed.pedIndex, PRF_UseFastEnterExitVehicleRates, TRUE) // to improve slowness getting in vehicles
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sBailJumperPed.pedIndex, TRUE)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "UPDATE_BAIL_JUMPER_PED_AI : ", "BB_PED_AI_SETUP_FOLLOW_PLAYER done") ENDIF #ENDIF
sBailJumperPed.AI = BB_PED_AI_STATE_FOLLOW_PLAYER
ELSE
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "UPDATE_BAIL_JUMPER_PED_AI : ", "BB_PED_AI_SETUP_FOLLOW_PLAYER failed player group doesn't exist!") ENDIF #ENDIF
ENDIF
ENDIF
BREAK
CASE BB_PED_AI_STATE_FOLLOW_PLAYER
IF IS_PLAYER_INTIMIDATE_SPECIFIC_PED(sBailJumperPed.pedIndex, sBailJumperPed.iFrameCountLastSeenPlayer, 100, TRUE)
OR SHOULD_BAIL_JUMPER_DELAY_FOLLOW_BEHAVIOUR()
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "UPDATE_BAIL_JUMPER_PED_AI : ", "BB_PED_AI_STATE_FOLLOW_PLAYER -> BB_PED_AI_SETUP_SURRENDERED") ENDIF #ENDIF
sBailJumperPed.AI = BB_PED_AI_SETUP_SURRENDERED
ELSE
// player is in a vehicle
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF IS_PLAYER_VEHICLE_SUITABLE_TO_TRANSPORT_BAIL_JUMPER()
vehTempPlayer = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
IF NOT IS_PED_IN_VEHICLE(sBailJumperPed.pedIndex, vehTempPlayer)
FLOAT fVehSpeed
fVehSpeed = GET_ENTITY_SPEED(vehTempPlayer)
IF fVehSpeed < 1.75
AND IS_ENTITY_IN_RANGE_COORDS(sBailJumperPed.pedIndex, vPlayerPos, 8.0) // can use player pos since it uses veh pos if in one
IF NOT IsPedPerformingTask(sBailJumperPed.pedIndex, SCRIPT_TASK_ENTER_VEHICLE)
vehSeat = VS_DRIVER
IF ARE_ANY_VEHICLE_SEATS_FREE(vehTempPlayer)
IF IS_VEHICLE_SEAT_FREE(vehTempPlayer, VS_FRONT_RIGHT)
AND IS_ENTRY_POINT_FOR_SEAT_CLEAR(sBailJumperPed.pedIndex, vehTempPlayer, VS_FRONT_RIGHT, TRUE)
vehSeat = VS_FRONT_RIGHT
ELSE
vehSeat = VS_ANY_PASSENGER
ENDIF
ENDIF
IF vehSeat != VS_DRIVER
TASK_ENTER_VEHICLE(sBailJumperPed.pedIndex, vehTempPlayer, 25000, vehSeat, PEDMOVEBLENDRATIO_RUN, ECF_RESUME_IF_INTERRUPTED | ECF_BLOCK_SEAT_SHUFFLING)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "UPDATE_BAIL_JUMPER_PED_AI : ", "BB_PED_AI_STATE_FOLLOW_PLAYER : tasked to enter player's veh, seat : ", vehSeat) ENDIF #ENDIF
ELSE
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "UPDATE_BAIL_JUMPER_PED_AI : ", "BB_PED_AI_STATE_FOLLOW_PLAYER : unable to find passenger seat!") ENDIF #ENDIF
ENDIF
ELSE
IF IS_PED_GETTING_INTO_A_VEHICLE(sBailJumperPed.pedIndex)
IF (GET_VEHICLE_PED_IS_ENTERING(sBailJumperPed.pedIndex) != vehTempPlayer)
CLEAR_PED_TASKS(sBailJumperPed.pedIndex)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "UPDATE_BAIL_JUMPER_PED_AI : ", "BB_PED_AI_STATE_FOLLOW_PLAYER : cleared enter veh task - wrong veh") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ELSE
IF IsPedPerformingTask(sBailJumperPed.pedIndex, SCRIPT_TASK_ENTER_VEHICLE)
IF NOT IS_PED_GETTING_INTO_A_VEHICLE(sBailJumperPed.pedIndex)
CLEAR_PED_TASKS(sBailJumperPed.pedIndex)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "UPDATE_BAIL_JUMPER_PED_AI : ", "BB_PED_AI_STATE_FOLLOW_PLAYER : cleared enter vehicle task : veh speed was ", fVehSpeed) ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
IF IsPedPerformingTask(sBailJumperPed.pedIndex, SCRIPT_TASK_ENTER_VEHICLE)
CLEAR_PED_TASKS(sBailJumperPed.pedIndex)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "UPDATE_BAIL_JUMPER_PED_AI : ", "BB_PED_AI_STATE_FOLLOW_PLAYER : cleared enter veh task - unsuitable veh") ENDIF #ENDIF
ENDIF
ENDIF
ELSE
IF IsPedPerformingTask(sBailJumperPed.pedIndex, SCRIPT_TASK_ENTER_VEHICLE)
CLEAR_PED_TASKS(sBailJumperPed.pedIndex)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "UPDATE_BAIL_JUMPER_PED_AI : ", "BB_PED_AI_STATE_FOLLOW_PLAYER : cleared enter veh task - player out of veh") ENDIF #ENDIF
ENDIF
ENDIF
// B*1424207 - don't look at player when in a vehicle - interfers with Vehicle conversational head lookat IK
IF IS_PED_HEADTRACKING_PED(sBailJumperPed.pedIndex, PLAYER_PED_ID())
IF IS_PED_GETTING_INTO_A_VEHICLE(sBailJumperPed.pedIndex) // if you do this with in vehicle it will continuously clear the IK lookat
TASK_CLEAR_LOOK_AT(sBailJumperPed.pedIndex)
//#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, " * UPDATE_BAIL_JUMPER_PED_AI --- cleared look at player - BB_PED_AI_STATE_FOLLOW_PLAYER") ENDIF #ENDIF
ENDIF
ELSE
IF NOT IS_PED_IN_ANY_VEHICLE(sBailJumperPed.pedIndex, TRUE)
IF NOT IS_PED_GETTING_INTO_A_VEHICLE(sBailJumperPed.pedIndex)
TASK_LOOK_AT_ENTITY(sBailJumperPed.pedIndex, PLAYER_PED_ID(), -1)
//#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, " * UPDATE_BAIL_JUMPER_PED_AI --- set look at player - BB_PED_AI_STATE_FOLLOW_PLAYER") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
SET_PED_RESET_FLAG(sBailJumperPed.pedIndex, PRF_UseFastEnterExitVehicleRates, TRUE) // to improve slowness getting in vehicles
ENDIF
BREAK
CASE BB_PED_AI_SETUP_SURRENDERED
IF IS_PLAYER_INTIMIDATE_SPECIFIC_PED(sBailJumperPed.pedIndex, sBailJumperPed.iFrameCountLastSeenPlayer, 100, TRUE)
OR SHOULD_BAIL_JUMPER_DELAY_FOLLOW_BEHAVIOUR()
IF IS_PED_IN_GROUP(sBailJumperPed.pedIndex)
REMOVE_PED_FROM_GROUP(sBailJumperPed.pedIndex)
//CLEAR_PED_TASKS(sBailJumperPed.pedIndex)
// group specific stuff -
SET_ENTITY_LOAD_COLLISION_FLAG(sBailJumperPed.pedIndex, FALSE)
SET_PED_CONFIG_FLAG(sBailJumperPed.pedIndex, PCF_DontInfluenceWantedLevel, FALSE)
SET_PED_CONFIG_FLAG(sBailJumperPed.pedIndex, PCF_RunFromFiresAndExplosions, TRUE)
ENDIF
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(sBailJumperPed.pedIndex, FALSE) // allow any type of damage if the player is threatening
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF IsPedPerformingTask(sBailJumperPed.pedIndex, SCRIPT_TASK_ENTER_VEHICLE)
CLEAR_PED_TASKS(sBailJumperPed.pedIndex)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "UPDATE_BAIL_JUMPER_PED_AI : ", "BB_PED_AI_SETUP_SURRENDERED : cleared enter veh task - player not in veh") ENDIF #ENDIF
ENDIF
ENDIF
IF NOT IS_PED_RAGDOLL(sBailJumperPed.pedIndex)
//AND NOT IS_PED_GETTING_UP(sBailJumperPed.pedIndex) // B*1550554 - allow task hands up whilst getting up
AND NOT IS_PED_BEING_STUNNED(sBailJumperPed.pedIndex)
AND NOT IS_PED_BEING_JACKED(sBailJumperPed.pedIndex)
AND NOT IsPedPerformingTask(sBailJumperPed.pedIndex, SCRIPT_TASK_LEAVE_ANY_VEHICLE)
TASK_LOOK_AT_ENTITY(sBailJumperPed.pedIndex, PLAYER_PED_ID(), -1)
// test if the bail jumper can see the player
IF (NOT HAS_FRAME_COUNTER_PASSED(sBailJumperPed.iFrameCountLastSeenPlayer, CAN_PED_SEE_PED_FRAME_COUNT_GRACE_PERIOD)
AND IS_ENTITY_IN_RANGE_COORDS(sBailJumperPed.pedIndex, vPlayerPos, 50.0))
OR NOT HAS_TIME_PASSED(iTimerLowerHandsDelayForGetUp, 2000) // B*1550554 - force the hands up ifhe's getting up from a fall
IF IS_PED_IN_ANY_VEHICLE(sBailJumperPed.pedIndex)
TASK_LEAVE_ANY_VEHICLE(sBailJumperPed.pedIndex)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "UPDATE_BAIL_JUMPER_PED_AI ~~~ ", "BB_PED_AI_SETUP_SURRENDERED - bail out vehicle") ENDIF #ENDIF
ELSE
// don't put hands up if player is unarmed / or bail jumper is in water
IF NOT IS_PED_ARMED(PLAYER_PED_ID(), WF_INCLUDE_PROJECTILE | WF_INCLUDE_GUN)
AND NOT IS_PLAYER_TARGETTING_ENTITY(PLAYER_ID(), sBailJumperPed.pedIndex) // melee targeting
AND NOT SHOULD_BAIL_JUMPER_DELAY_FOLLOW_BEHAVIOUR() // ensure he keeps his hands up until Trevor says you are coming with me.
OR IS_ENTITY_IN_WATER(sBailJumperPed.pedIndex)
TASK_TURN_PED_TO_FACE_ENTITY(sBailJumperPed.pedIndex, PLAYER_PED_ID(), -1)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "UPDATE_BAIL_JUMPER_PED_AI ~~~ ", "BB_PED_AI_SETUP_SURRENDERED - just turn to face player") ENDIF #ENDIF
ELSE
// if he is already playing the hands up just reset the duration to -1 infinite
// B*1534772 - can only be applied is task is active (so exclude normal WAITING_TO_START_TASK check)
IF (GET_SCRIPT_TASK_STATUS(sBailJumperPed.pedIndex, SCRIPT_TASK_HANDS_UP) = PERFORMING_TASK)
UPDATE_TASK_HANDS_UP_DURATION(sBailJumperPed.pedIndex, -1)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "UPDATE_BAIL_JUMPER_PED_AI ~~~ ", " BB_PED_AI_SETUP_SURRENDERED updated hands up duration to -1 ###") ENDIF #ENDIF
ELSE
TASK_HANDS_UP(sBailJumperPed.pedIndex, -1, PLAYER_PED_ID(), -1)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "UPDATE_BAIL_JUMPER_PED_AI ~~~ ", "BB_PED_AI_SETUP_SURRENDERED - task hands up") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ELSE
// bail jumper can't see the player so just turn to face player direction if on foot
IF NOT IS_PED_IN_ANY_VEHICLE(sBailJumperPed.pedIndex)
TASK_TURN_PED_TO_FACE_ENTITY(sBailJumperPed.pedIndex, PLAYER_PED_ID(), -1)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "UPDATE_BAIL_JUMPER_PED_AI ~~~ ", "BB_PED_AI_SETUP_SURRENDERED - just turn to face player") ENDIF #ENDIF
ENDIF
ENDIF
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sBailJumperPed.pedIndex, TRUE)
sBailJumperPed.AI = BB_PED_AI_STATE_SURRENDERED
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "UPDATE_BAIL_JUMPER_PED_AI ~~~ ", "BB_PED_AI_SETUP_SURRENDERED -> BB_PED_AI_STATE_SURRENDERED: framecount = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
ELSE
// switch back to different state if he's currently classed as left behind
IF NOT bHasPlayerLeftBailJumperBehind
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "UPDATE_BAIL_JUMPER_PED_AI ~~~ ", "BB_PED_AI_SETUP_SURRENDERED -> BB_PED_AI_SETUP_FOLLOW_PLAYER") ENDIF #ENDIF
sBailJumperPed.AI = BB_PED_AI_SETUP_FOLLOW_PLAYER
ELSE
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "UPDATE_BAIL_JUMPER_PED_AI ~~~ ", "BB_PED_AI_SETUP_SURRENDERED -> BB_PED_AI_SETUP_PLAYER_LEFT_BEHIND") ENDIF #ENDIF
sBailJumperPed.AI = BB_PED_AI_SETUP_PLAYER_LEFT_BEHIND
ENDIF
ENDIF
BREAK
CASE BB_PED_AI_STATE_SURRENDERED
IF IS_PLAYER_INTIMIDATE_SPECIFIC_PED(sBailJumperPed.pedIndex, sBailJumperPed.iFrameCountLastSeenPlayer, 100, TRUE)
OR SHOULD_BAIL_JUMPER_DELAY_FOLLOW_BEHAVIOUR()
IF NOT IsPedPerformingTask(sBailJumperPed.pedIndex, SCRIPT_TASK_HANDS_UP)
IF NOT IsPedPerformingTask(sBailJumperPed.pedIndex, SCRIPT_TASK_TURN_PED_TO_FACE_ENTITY)
IF IS_PED_IN_ANY_VEHICLE(sBailJumperPed.pedIndex)
// test if the bail jumper can see the player
IF (NOT HAS_FRAME_COUNTER_PASSED(sBailJumperPed.iFrameCountLastSeenPlayer, CAN_PED_SEE_PED_FRAME_COUNT_GRACE_PERIOD)
AND IS_ENTITY_IN_RANGE_COORDS(sBailJumperPed.pedIndex, vPlayerPos, 50.0))
TASK_LEAVE_ANY_VEHICLE(sBailJumperPed.pedIndex)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "UPDATE_BAIL_JUMPER_PED_AI ~~~ ", "BB_PED_AI_STATE_SURRENDERED - bail out vehicle") ENDIF #ENDIF
sBailJumperPed.AI = BB_PED_AI_SETUP_SURRENDERED
ENDIF
ELSE
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "UPDATE_BAIL_JUMPER_PED_AI ~~~ ", "BB_PED_AI_STATE_SURRENDERED - done : framecount = ", GET_FRAME_COUNT()) ENDIF #ENDIF
sBailJumperPed.AI = BB_PED_AI_SETUP_SURRENDERED
ENDIF
ELSE
IF (NOT HAS_FRAME_COUNTER_PASSED(sBailJumperPed.iFrameCountLastSeenPlayer, CAN_PED_SEE_PED_FRAME_COUNT_GRACE_PERIOD)
AND IS_ENTITY_IN_RANGE_COORDS(sBailJumperPed.pedIndex, vPlayerPos, 50.0))
IF IS_PED_ARMED(PLAYER_PED_ID(), WF_INCLUDE_PROJECTILE | WF_INCLUDE_GUN)
OR IS_PLAYER_TARGETTING_ENTITY(PLAYER_ID(), sBailJumperPed.pedIndex) // melee targeting
OR SHOULD_BAIL_JUMPER_DELAY_FOLLOW_BEHAVIOUR() // ensure he keeps his hands up until Trevor says you are coming with me.
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "UPDATE_BAIL_JUMPER_PED_AI ~~~ ", "BB_PED_AI_STATE_SURRENDERED - player now armed so head back to setup : framecount = ", GET_FRAME_COUNT()) ENDIF #ENDIF
sBailJumperPed.AI = BB_PED_AI_SETUP_SURRENDERED
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
// switch back to different state if he's currently classed as left behind
IF NOT bHasPlayerLeftBailJumperBehind
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "UPDATE_BAIL_JUMPER_PED_AI ~~~ ", "BB_PED_AI_STATE_SURRENDERED -> BB_PED_AI_SETUP_FOLLOW_PLAYER") ENDIF #ENDIF
sBailJumperPed.AI = BB_PED_AI_SETUP_FOLLOW_PLAYER
ELSE
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "UPDATE_BAIL_JUMPER_PED_AI ~~~ ", "BB_PED_AI_STATE_SURRENDERED -> BB_PED_AI_SETUP_PLAYER_LEFT_BEHIND") ENDIF #ENDIF
sBailJumperPed.AI = BB_PED_AI_SETUP_PLAYER_LEFT_BEHIND
ENDIF
ENDIF
BREAK
CASE BB_PED_AI_SETUP_PLAYER_LEFT_BEHIND
IF IS_PLAYER_INTIMIDATE_SPECIFIC_PED(sBailJumperPed.pedIndex, sBailJumperPed.iFrameCountLastSeenPlayer, 100, TRUE)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "UPDATE_BAIL_JUMPER_PED_AI ~~~ ", "BB_PED_AI_SETUP_PLAYER_LEFT_BEHIND -> BB_PED_AI_SETUP_SURRENDERED") ENDIF #ENDIF
sBailJumperPed.AI = BB_PED_AI_SETUP_SURRENDERED
ELSE
IF IS_PED_IN_GROUP(sBailJumperPed.pedIndex)
REMOVE_PED_FROM_GROUP(sBailJumperPed.pedIndex)
// group specific stuff -
SET_ENTITY_LOAD_COLLISION_FLAG(sBailJumperPed.pedIndex, FALSE)
SET_PED_CONFIG_FLAG(sBailJumperPed.pedIndex, PCF_DontInfluenceWantedLevel, FALSE)
ENDIF
CLEAR_PED_TASKS(sBailJumperPed.pedIndex) // needed to stop enter veh task from follow behavioour
TASK_LOOK_AT_ENTITY(sBailJumperPed.pedIndex, PLAYER_PED_ID(), -1)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sBailJumperPed.pedIndex, TRUE)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "UPDATE_BAIL_JUMPER_PED_AI ~~~ ", "BB_PED_AI_SETUP_PLAYER_LEFT_BEHIND done") ENDIF #ENDIF
sBailJumperPed.AI = BB_PED_AI_STATE_PLAYER_LEFT_BEHIND
ENDIF
BREAK
CASE BB_PED_AI_STATE_PLAYER_LEFT_BEHIND
IF IS_PLAYER_INTIMIDATE_SPECIFIC_PED(sBailJumperPed.pedIndex, sBailJumperPed.iFrameCountLastSeenPlayer, 100, TRUE)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "UPDATE_BAIL_JUMPER_PED_AI ~~~ ", "BB_PED_AI_STATE_PLAYER_LEFT_BEHIND -> BB_PED_AI_SETUP_SURRENDERED") ENDIF #ENDIF
sBailJumperPed.AI = BB_PED_AI_SETUP_SURRENDERED
ELSE
IF IS_ENTITY_IN_WATER(sBailJumperPed.pedIndex)
SET_PED_PATH_PREFER_TO_AVOID_WATER(sBailJumperPed.pedIndex, TRUE)
SET_PED_PATH_MAY_ENTER_WATER(sBailJumperPed.pedIndex, FALSE)
ELIF NOT IS_PED_RAGDOLL(sBailJumperPed.pedIndex)
AND NOT IS_PED_GETTING_UP(sBailJumperPed.pedIndex)
AND IS_PED_ON_FOOT(sBailJumperPed.pedIndex)
IF NOT IS_PED_FACING_PED(sBailJumperPed.pedIndex, PLAYER_PED_ID(), 45.0)
IF NOT IsPedPerformingTask(sBailJumperPed.pedIndex, SCRIPT_TASK_TURN_PED_TO_FACE_ENTITY)
TASK_TURN_PED_TO_FACE_ENTITY(sBailJumperPed.pedIndex, PLAYER_PED_ID(), -1)
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE BB_PED_AI_SETUP_WAITING_IN_VEHICLE
BREAK
CASE BB_PED_AI_STATE_WAITING_IN_VEHICLE
BREAK
CASE BB_PED_AI_SETUP_TEMP_OVERRIDE_AI_CONTROL
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sBailJumperPed.pedIndex, TRUE)
iTimer_BailJumperVehicleStopped = GET_GAME_TIMER() // set used to check for bail jumper vehicle stopping in flee in veh state
SET_ENTITY_LOAD_COLLISION_FLAG(sBailJumperPed.pedIndex, TRUE) // help with loading navmesh on change route
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "UPDATE_BAIL_JUMPER_PED_AI ~~~ ", "BB_PED_AI_SETUP_TEMP_OVERRIDE_AI_CONTROL done") ENDIF #ENDIF
sBailJumperPed.AI = BB_PED_AI_STATE_TEMP_OVERRIDE_AI_CONTROL
BREAK
CASE BB_PED_AI_STATE_TEMP_OVERRIDE_AI_CONTROL
BREAK
ENDSWITCH
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Removes all the assets loaded by the mission, used in mission cleanup and reset mission functions.
/// PARAMS:
/// bClearTextSlots - if TRUE CLEAR_ADDITIONAL_TEXT on MISSION_TEXT_SLOT
PROC UNLOAD_ALL_MISSION_ASSETS(BOOL bClearTextSlots = TRUE)
IF bClearTextSlots
CLEAR_ADDITIONAL_TEXT(MISSION_TEXT_SLOT, TRUE)
ENDIF
REMOVE_ANIM_DICT(GET_MAUDE_REACT_ANIM_DICT())
REMOVE_ANIM_DICT("ODDJOBS@BAILBOND_QUARRY")
RELEASE_BAIL_JUMPER_SURRENDER_MOVEMENT_CLIPSETS()
SET_MODEL_AS_NO_LONGER_NEEDED(sObjectBailJumperPhone.model)
ENDPROC
/// PURPOSE:
/// Deletes any blips that are valid
PROC DELETE_ALL_MISSION_BLIPS()
CLEANUP_BUDDY_COMBAT_BLIPS(iNumTargetBackupPeds)
SAFE_REMOVE_BLIP(sBailJumperPed.blipIndex)
CLEANUP_AI_PED_BLIP(sBailJumperPed.blipAIStruct)
SAFE_REMOVE_BLIP(blipIndexMaudesPlace)
ENDPROC
/// PURPOSE:
/// handles releasing the objects at the bail jumper's location to be used during the drop off stage
/// PARAMS:
/// vPlayersCoords - player's position
/// vBailJumperLocation - the bail jumper scenario's position
/// fRangeBeforeCleanup - dist to reach before stuff gets released
/// RETURNS:
/// TRUE if cleanup occurs
FUNC BOOL CLEANUP_BAIL_JUMPER_LOCATION_DURING_DROPOFF(VECTOR vPlayersCoords, VECTOR vBailJumperLocation, FLOAT fRangeBeforeCleanup)
IF NOT IS_COORD_IN_RANGE_OF_COORD_2D(vPlayersCoords, vBailJumperLocation, fRangeBeforeCleanup)
INT i
ENABLE_DISPATCH_SERVICE(DT_FIRE_DEPARTMENT, TRUE)
ENABLE_DISPATCH_SERVICE(DT_AMBULANCE_DEPARTMENT, TRUE)
IF iNumTargetBackupPeds > 0
FOR i=0 TO (iNumTargetBackupPeds - 1) //Start at 1 as we dont want to delete the target
SAFE_RELEASE_PED(sBackupPed[i].index)
ENDFOR
ENDIF
IF iNumMissionVehicles > 0
FOR i=0 TO (iNumMissionVehicles - 1)
SAFE_RELEASE_VEHICLE(sMissionVehicle[i].index)
ENDFOR
ENDIF
/*IF iNumMissionObjects > 0
FOR i=0 TO (iNumMissionObjects - 1)
SAFE_RELEASE_OBJECT(sMissionObject[i].index)
ENDFOR
ENDIF*/
SAFE_RELEASE_OBJECT(sObjectBailJumperPhone.index)
IF iNumMissionProps > 0
FOR i=0 TO (iNumMissionProps - 1)
SAFE_RELEASE_OBJECT(sMissionProp[i].index)
ENDFOR
ENDIF
IF iNumMissionPickups > 0
FOR i=0 TO (iNumMissionPickups - 1)
SAFE_REMOVE_PICKUP(sMissionPickup[i].index)
ENDFOR
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Deletes all of the mission entities checking if they exist
/// Used in Mission Failed, when faded out.
/// PARAMS:
/// bDelete - if true all entities will be deleted, else released
PROC CLEANUP_ALL_MISSION_ENTITIES(BOOL bDelete = FALSE)
INT i
/*IF iNumMissionObjects > 0
FOR i=0 TO (iNumMissionObjects - 1)
SAFE_REMOVE_OBJECT(sMissionObject[i].index, bDelete)
ENDFOR
ENDIF*/
SAFE_REMOVE_OBJECT(sObjectBailJumperPhone.index)
IF iNumMissionProps > 0
FOR i=0 TO (iNumMissionProps - 1)
SAFE_REMOVE_OBJECT(sMissionProp[i].index, bDelete)
ENDFOR
ENDIF
IF iNumMissionPickups > 0
FOR i=0 TO (iNumMissionPickups - 1)
SAFE_REMOVE_PICKUP(sMissionPickup[i].index)
ENDFOR
ENDIF
SAFE_REMOVE_OBJECT(sObjMaudeChair.index, bDelete)
SAFE_REMOVE_OBJECT(sObjMaudeLaptop.index, bDelete)
SAFE_REMOVE_OBJECT(sObjMaudeTable.index, FALSE) // can't delete map objects
SAFE_REMOVE_OBJECT(sObjMaudeRadio.index, FALSE) // can't delete map objects
IF IS_PED_UNINJURED(sBailJumperPed.pedIndex)
IF IS_PED_IN_GROUP(sBailJumperPed.pedIndex)
IF IS_PED_GROUP_MEMBER(sBailJumperPed.pedIndex, GET_PLAYER_GROUP(PLAYER_ID()))
REMOVE_PED_FROM_GROUP(sBailJumperPed.pedIndex)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "UPDATE_BAIL_JUMPER_PED_AI ~~~ ", "CLEANUP_ALL_MISSION_ENTITIES() REMOVE_PED_FROM_GROUP(sBailJumperPed.pedIndex)") ENDIF #ENDIF
ENDIF
ENDIF
SET_ENTITY_LOAD_COLLISION_FLAG(sBailJumperPed.pedIndex, FALSE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sBailJumperPed.pedIndex, FALSE)
// B*1253394 - don't keep tasks if terminate reasion wasn't gameplay related
IF eBailBondMissionOverState = BBMOS_CLEANUP
SET_PED_KEEP_TASK(sBailJumperPed.pedIndex, FALSE)
ELSE
SET_PED_KEEP_TASK(sBailJumperPed.pedIndex, TRUE)
ENDIF
ENDIF
SAFE_REMOVE_PED(sBailJumperPed.pedIndex, bDelete)
IF IS_PED_UNINJURED(sMaude.index)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sMaude.index, FALSE)
SET_PED_KEEP_TASK(sMaude.index, TRUE)
ENDIF
SAFE_REMOVE_PED(sMaude.index, bDelete)
IF iNumTargetBackupPeds > 0
FOR i = 0 TO (iNumTargetBackupPeds - 1)
IF eBailBondType = BBT_SHOOTOUT
IF IS_PED_UNINJURED(sBackupPed[i].index)
SET_PED_RELATIONSHIP_GROUP_HASH(sBackupPed[i].index, RELGROUPHASH_HATES_PLAYER)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sBackupPed[i].index, FALSE)
// B*1253394 - don't keep tasks if terminate reasion wasn't gameplay related
IF eBailBondMissionOverState = BBMOS_CLEANUP
SET_PED_KEEP_TASK(sBackupPed[i].index, FALSE)
ELSE
SET_PED_KEEP_TASK(sBackupPed[i].index, TRUE)
ENDIF
ENDIF
ENDIF
SAFE_REMOVE_PED(sBackupPed[i].index, bDelete)
ENDFOR
ENDIF
IF iNumMissionVehicles > 0
FOR i=0 TO (iNumMissionVehicles - 1)
SAFE_REMOVE_VEHICLE(sMissionVehicle[i].index, bDelete)
ENDFOR
ENDIF
ENDPROC
/// PURPOSE:
/// Mission cleanup
/// PARAMS:
/// bDeleteAll - if TRUE all entities are deleted, else released
/// bClearTextSlots - if TRUE CLEAR_ADDITIONAL_TEXT on MISSION_TEXT_SLOT
PROC MISSION_CLEANUP(BOOL bDeleteAll = FALSE, BOOL bClearTextSlots = TRUE)
CLEAR_PRINTS()
IF IS_HELP_MESSAGE_BEING_DISPLAYED()
CLEAR_HELP(TRUE)
ENDIF
IF eBailBondMissionOverState = BBMOS_CLEANUP
KILL_ANY_CONVERSATION() // only do this if the script terminate reasion wasn't gameplay related
ENDIF
SET_WANTED_LEVEL_MULTIPLIER(1.0)
ENABLE_DISPATCH_SERVICE(DT_POLICE_HELICOPTER, TRUE)
ENABLE_DISPATCH_SERVICE(DT_FIRE_DEPARTMENT, TRUE)
ENABLE_DISPATCH_SERVICE(DT_SWAT_AUTOMOBILE, TRUE)
ENABLE_DISPATCH_SERVICE(DT_AMBULANCE_DEPARTMENT, TRUE)
SET_CREATE_RANDOM_COPS(TRUE)
DISABLE_CELLPHONE(FALSE)
HIDE_ACTIVE_PHONE(FALSE)
DISPLAY_HUD(TRUE)
DISPLAY_RADAR(TRUE)
DISABLE_GANGS(FALSE)
SET_AGGRESSIVE_HORNS(FALSE)
SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_NONE)
SET_PLAYER_CAN_CHANGE_CLOTHES_ON_MISSION(TRUE)
// proc from initial scene so they match up
IF eMissionStage > MISSION_STAGE_CHASE // only revert this if it was setup in the SS_CLEANUP for MISSION_STAGE_CHASE
SETUP_MAUDES_FOR_DROPOFF(FALSE, ScenarioBlockArea_CutsceneMaude)
ENDIF
REMOVE_SCENARIO_BLOCKING_AREA(scenarioBlockingArea_BailJumperLocation)
CLEAR_PED_NON_CREATION_AREA()
REMOVE_PED_FOR_DIALOGUE(sDialogue, TREVOR_SPEAKER_ID) // "TREVOR"
REMOVE_PED_FOR_DIALOGUE(sDialogue, BAIL_JUMPER_SPEAKER_ID) // bail jumper
REMOVE_PED_FOR_DIALOGUE(sDialogue, MAUDE_SPEAKER_ID) // "MAUDE"
KILL_CHASE_HINT_CAM(localChaseHintCamStruct)
RENDER_SCRIPT_CAMS(FALSE, FALSE)
SET_TIME_SCALE(1)
RC_END_CUTSCENE_MODE()
STOP_SCRIPT_GLOBAL_SHAKING()
WAIT_FOR_CUTSCENE_TO_STOP()
IF IS_PLAYER_PLAYING(PLAYER_ID())
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
ENDIF
//Reenable player flying through windscreens and taking crash damage.
IF IS_PED_UNINJURED(PLAYER_PED_ID())
SET_PED_CONFIG_FLAG(PLAYER_PED_ID(), PCF_WillFlyThroughWindscreen, TRUE)
SET_PED_CONFIG_FLAG(PLAYER_PED_ID(), PCF_WillTakeDamageWhenVehicleCrashes, TRUE)
TASK_CLEAR_LOOK_AT(PLAYER_PED_ID())
ENDIF
DELETE_ALL_MISSION_BLIPS()
CLEANUP_ALL_MISSION_ENTITIES(bDeleteAll)
//REMOVE_RELATIONSHIP_GROUP(HASH_BAILBOND_TARGET) // may not want to do this as target's buddies may stop fighting on mission passed
UNLOAD_ALL_MISSION_ASSETS(bClearTextSlots)
#IF IS_DEBUG_BUILD
CLEANUP_MISSION_WIDGETS()
SET_DEBUG_ACTIVE(FALSE)
SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(FALSE)
#ENDIF
CPRINTLN(DEBUG_BAIL_BOND, GET_THIS_SCRIPT_NAME(), " : MISSION_CLEANUP : done - bDeleteAll = ", bDeleteAll, " bClearTextSlots = ", bClearTextSlots)
ENDPROC
/// PURPOSE:
/// Handles call to MISSION_CLEANUP and terminates the thread
/// Only performs MISSION_CLEANUP if bRequireMissionCleanup has been set true, this is to stop mission specific cleanup occuring before the mission has even setup
PROC Script_Cleanup()
IF bRequireMissionCleanup
MISSION_CLEANUP(FALSE)
ENDIF
CPRINTLN(DEBUG_BAIL_BOND, GET_THIS_SCRIPT_NAME(), " : Script_Cleanup() : frame count : ", GET_FRAME_COUNT())
TERMINATE_THIS_THREAD()
ENDPROC
/// PURPOSE:
/// Mission Passed
/// Pass function calls cleanup and termination
PROC SCRIPT_PASSED(MISSION_PASSED_CONDITION eMissionPassType)
CPRINTLN(DEBUG_BAIL_BOND, GET_THIS_SCRIPT_NAME(), " : SCRIPT_PASSED - condition : ", eMissionPassType)
SAFE_FADE_SCREEN_IN_FROM_BLACK()
REGISTER_SCRIPT_IN_COMPLETION_PERCENTAGE_TOTAL(GET_SPECIFIC_BAIL_BOND_COMPLETION_PERCENTAGE_ENTRY(sBailBondLaunchData.eBailBondID))
// set the mission over state for the launcher to use
IF eMissionPassType = BB_PASSED_TARGET_KILLED
eBailBondMissionOverState = BBMOS_PASSED_KILLED
CPRINTLN(DEBUG_BAIL_BOND, "SCRIPT_PASSED - set eBailBondMissionOverState = BBMOS_PASSED_KILLED")
ELSE
eBailBondMissionOverState = BBMOS_PASSED_DELIVERED
CPRINTLN(DEBUG_BAIL_BOND, "SCRIPT_PASSED - set eBailBondMissionOverState = BBMOS_PASSED_DELIVERED")
ENDIF
Script_Cleanup()
ENDPROC
/// PURPOSE:
/// reset's the STRUCT_MISSION_PED's iTimer and iFrameCountLastSeenPlayer
PROC RESET_MISSION_PED_TIMERS_AND_THREAT_TESTS()
RESET_THREAT_SHAPETESTS()
sBailJumperPed.iTimer = 0
sBailJumperPed.iAiDelayTimer = 0
sBailJumperPed.iFrameCountLastSeenPlayer = 0
ENDPROC
/// PURPOSE:
/// sets the initial values for all the variables used on the mission
PROC SET_MISSION_VARIABLES()
INT i = 0
//bail bond scenario
eBailBondType = BBT_VEHICLE_FLEE
// ped info
sBailJumperPed.mnModel = S_M_M_Trucker_01
sBailJumperPed.vPosition = <<2945.0356, 2796.2544, 39.6930>> // <<2956.3489, 2795.9553, 39.9217>>
sBailJumperPed.fHeading = 38.6771 // 65.6672
sBailJumperPed.wtWeapon = WEAPONTYPE_UNARMED
sBailJumperPed.AI = BB_PED_AI_STATE_RELAXED
sBailJumperPed.iTimer = 0
sBailJumperPed.iAiDelayTimer = 0
sBailJumperPed.iFrameCountLastSeenPlayer = 0
RESET_THREAT_SHAPETESTS()
iNumTargetBackupPeds = 0
// vehicle info
sMissionVehicle[0].model = landstalker
sMissionVehicle[0].vPos = << 2950.07, 2796.39, 40.35 >> // <<2945.2556, 2801.2214, 40.1939>>
sMissionVehicle[0].fDir = 338.45 // 314.9999
sMissionVehicle[1].model = BjXl
sMissionVehicle[1].vPos = << 2945.97, 2790.77, 40.37 >> // <<2930.1162, 2800.5247, 40.2321>>
sMissionVehicle[1].fDir = 28.22 // 284.9999
sObjectBailJumperPhone.model = PROP_PHONE_ING
iNumMissionVehicles = 2
// object info
iNumMissionObjects = 0
// prop info
iNumMissionProps = 0
//pickup info
iNumMissionPickups = 0
// Chase Route info
vChaseRoute[0] = <<2962.58, 2817.19, 42.29>>
vChaseRoute[1] = <<2942.4817, 2841.7075, 46.4443>>
vChaseRoute[2] = <<2909.12, 2820.88, 52.90>>
vChaseRoute[3] = <<2860.14, 2816.90, 52.56>>
vChaseRoute[4] = <<2821.6384, 2893.2593, 45.5300>>
vChaseRoute[5] = <<2768.72, 2950.61, 39.78>>
vChaseRoute[6] = <<2712.31, 2963.74, 35.79>>
vChaseRoute[7] = <<2657.5732, 2981.7312, 38.9122>>
vChaseRoute[8] = <<2623.29492, 3077.35767, 46.24589>>
iNumChaseRoutePositions = 9
vPos_PlayerMissionStart = <<2883.0232, 2807.7195, 53.6941>>
fHeading_PlayerMissionStart = 256.3262
vPos_PlayerWarpGetNearTarget = <<2938.9597, 2783.2747, 38.5873>>
fHeading_PlayerWarpGetNearTarget = 355.8176
vPos_PlayerWarpApproachTarget = <<2947.2463, 2787.4058, 39.4516>>
fHeading_PlayerWarpApproachTarget = 306.6250
vPos_JumperBeganFleeAgain = << 0.0, 0.0, 0.0 >>
vPos_ProjectileFleeingFrom = << 0.0, 0.0, 0.0 >>
ePlayerSpotsBailJumperType = BB_PSBJT_INVALID
bDoneDialogue_BailJumperBeginsToFlee = FALSE
bDoneDialogue_BailJumperSurrendered = FALSE
bDoneDialogue_TrevorResponsesToBailJumperSurrendering = FALSE
bDoneDialogue_BailJumperRespondToPlayerOrders = TRUE // initialised to TRUE and only set to false when we wat him to say a reply
bDoneDialogue_BailJumperNoticesCops = TRUE // initialised to TRUE and only set to false when we wat him to say a reply
FOR i = 0 TO (BAIL_BONDS_MAX_DRIVE_CONVOS - 1)
bDoneDialogue_DriveToMaudes[i] = FALSE
ENDFOR
bDoneDialogue_PlayerSpotsBailJumperCloseDistance = FALSE
bDoneDialogue_PlayerSpotsBailJumperFromDistance = FALSE
bDoneDialogue_PlayerGetsInVehicle = FALSE
bDoneDialogue_PlayerGetsOutVehicle = FALSE
bDoneDialogue_BailJumperSpotsPlayerFirst = TRUE // only setup to false if needed
bDoneDialogue_PlayerJackingPed = FALSE
bDoneDialogue_IdleInVehicle = FALSE
bDoneObjective_TakeBailJumperToMaude = FALSE
bDoneObjective_ApproachBailJumper = FALSE
bDoneObjective_ApprehendBailJumper = FALSE
bDoneObjective_LoseWantedLevel = FALSE
bDoneObjective_ReturnToBailJumper = FALSE
bDoneHelp_UnsuitableVehicle = FALSE
bSetMaudeFleeSyncSceneExit = FALSE
bCleanupBailJumperLocationDuringDropOff = FALSE
bConvoCoolDownActive = FALSE
bHasBailJumperSurrendered = FALSE
bHasPlayerLeftBailJumperBehind = FALSE
bRequireMissionCleanup = TRUE // used in the Script_Cleanup to determine if the mission has done it's setup and therefore needs a full cleanup
bSetupMaude = FALSE
bRequestedOutroMocap = FALSE
bIsJumperRevertingBackToFlee = FALSE
bHasJumperBeenTazered = FALSE
bDoneDialogue_MissionFailed = TRUE //initialise to TRUE and only set to false when we have dialogue which will need to play
bDoneDialogue_BailJumperKilled = FALSE
eBB_MissionFailedReason = BB_FAILED_DEFAULT
//iDeadBuddies = 0
iConvoCoolDown = 0
iFlashBlipTimer = 0
iFlashBlipGodTextTimer = 0
iDialogueTimer = 0
iChaseIndex = 0
iDialogueTimer_IdleInVehicle = 0
iDialogueTimer_MaudeAmbient = 0
iFrameCountPlayerLastSeenBailJumper = 0 // set low so it won't trigger anything when we first start
iDelay_SurrenderForPlayerCloseToWhileFleeing = -1 // keep at -1 used to test initialised state - used to delay player proximity to fleeing ped reason to surrender check
iTime_BailJumperStartedFleeingOnFoot = -1 // keep at -1 used to test initialised state - used to modify the bail jumper flee speed over time
iTimer_BailJumperVehicleStopped = 0
iBailJumperHealthOnBeganFleeAgain = 0
iSyncScene_MaudeReact = -1
vMaudePlace = <<2722.6611, 4143.1055, 43.0617>>
tlDialogueRoot_MissionFailed = ""
sMaude.model = GET_NPC_PED_MODEL(CHAR_MAUDE)
sMaude.vPos = GET_MAUDE_SPAWN_POSITION()
sMaude.fDir = GET_MAUDE_SPAWN_HEADING()
sObjMaudeChair.model = GET_MAUDE_CHAIR_MODEL()
sObjMaudeChair.vPos = GET_MAUDE_CHAIR_POSITION()
sObjMaudeChair.fDir = GET_MAUDE_CHAIR_HEADING()
sObjMaudeLaptop.model = GET_MAUDE_LAPTOP_MODEL()
sObjMaudeLaptop.vPos = GET_MAUDE_LAPTOP_POSITION()
sObjMaudeLaptop.fDir = GET_MAUDE_LAPTOP_HEADING()
sObjMaudeTable.model = GET_MAUDE_TABLE_MODEL()
sObjMaudeTable.vPos = GET_MAUDE_TABLE_POSITION()
sObjMaudeTable.fDir = GET_MAUDE_TABLE_HEADING()
sObjMaudeRadio.model = GET_MAUDE_RADIO_MODEL()
sObjMaudeRadio.vPos = GET_MAUDE_RADIO_POSITION()
sObjMaudeRadio.fDir = GET_MAUDE_RADIO_HEADING()
// Dialogue
sBailJumpers_VoiceID = "BailBond1Jumper"
sDialogue_BailJumperBeginChase = "BB1_J1"
// No I don't think so, pal!
// No, no, stay away from me!
// Oh shit!
sDialogueRoot_BailJumperSurrenders = "BB1_J3"
// Okay, Goddamnit! I give up.
// I surrender, I surrender. Don't hurt me!
// Okay, okay. You got me.
sDialogueRoot_DriveToMaudesPlace[0] = "BB1_VC1"
sDialogueRoot_DriveToMaudesPlace[1] = "BB1_VC2"
sDialogueRoot_DriveToMaudesPlace[2] = "BB1_VC3"
FOR i=0 TO (BAIL_BONDS_MAX_DRIVE_CONVOS - 1)
bDoneDialogue_DriveToMaudes[i] = FALSE
ENDFOR
eBailJumperClipset = BB_JUMPER_MOVEMENT_CLIPSET_UNSET
ENDPROC
///PURPOSE:
/// Initiate the mission
/// set variables, load initial assets
/// spawn scene and setup the scenario
PROC INIT_MISSION()
// set the variables initial values
SET_MISSION_VARIABLES()
#IF IS_DEBUG_BUILD
SETUP_MISSION_WIDGET()
// stage skipping
mSkipMenu[Z_SKIP_LOCATE_BAIL_JUMPER].sTxtLabel = "Find the bail jumper."
mSkipMenu[Z_SKIP_TRIGGER_BAIL_JUMPER_REACTION].sTxtLabel = "Wait for bail jumper reaction"
mSkipMenu[Z_SKIP_CHASE_BAIL_JUMPER].sTxtLabel = "Chase the bail jumper"
mSkipMenu[Z_SKIP_TAKE_JUMPER_TO_MAUDE].sTxtLabel = "Take bail jumper to Maude"
mSkipMenu[Z_SKIP_OUTRO_CUTSCENE].sTxtLabel = "Mocap: MAUDE_MCS_2"
mSkipMenu[Z_SKIP_MISSION_PASSED].sTxtLabel = "Mission Passed"
//Used only for debug skipping should not be included when checking in mission
// SAFE_TELEPORT_PED(PLAYER_PED_ID(), sBailBondLaunchData.vStartPoint, 218.4714)//<< -2228.9470, 2731.5837, 1.8044 >>, 206.2414)
#ENDIF
// load the intial assets required
WHILE NOT SETUP_STAGE_REQUIREMENTS(RQ_TEXT)
OR NOT SETUP_STAGE_REQUIREMENTS(RQ_ANIMS)
OR NOT SETUP_STAGE_REQUIREMENTS(RQ_PHONE_MODEL)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "waiting for init specific mission assets and dialogue to load...") ENDIF #ENDIF
WAIT(0)
ENDWHILE
//Stop player fly through windscreens.
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
SET_PED_CONFIG_FLAG(PLAYER_PED_ID(), PCF_WillFlyThroughWindscreen, FALSE)
SET_PED_CONFIG_FLAG(PLAYER_PED_ID(), PCF_WillTakeDamageWhenVehicleCrashes, FALSE)
ENDIF
//setup the relationship groups
ADD_RELATIONSHIP_GROUP("ENEMIES", HASH_BAILBOND_TARGET)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, RELGROUPHASH_PLAYER, HASH_BAILBOND_TARGET)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, HASH_BAILBOND_TARGET, RELGROUPHASH_PLAYER)
// diable everything which might interfer with the bail bond
VECTOR vMin = GET_MISSION_CLEAR_AREA_MIN_VECTOR(sBailBondLaunchData)
VECTOR vMax = GET_MISSION_CLEAR_AREA_MAX_VECTOR(sBailBondLaunchData)
SET_PED_NON_CREATION_AREA(vMin, vMax)
scenarioBlockingArea_BailJumperLocation = ADD_SCENARIO_BLOCKING_AREA(vMin, vMax)
CLEAR_AREA(sBailBondLaunchData.vStartPoint, 30.0, FALSE) // may need to change the radius value depending on the mission.
ENABLE_DISPATCH_SERVICE(DT_POLICE_HELICOPTER, FALSE)
ENABLE_DISPATCH_SERVICE(DT_FIRE_DEPARTMENT, FALSE)
ENABLE_DISPATCH_SERVICE(DT_SWAT_AUTOMOBILE, FALSE)
ENABLE_DISPATCH_SERVICE(DT_AMBULANCE_DEPARTMENT, FALSE)
SET_CREATE_RANDOM_COPS(FALSE)
SET_WANTED_LEVEL_MULTIPLIER(0.2)
DISABLE_GANGS(TRUE)
// spawn the scene
WHILE NOT CREATE_BAIL_JUMPER_SCENE()
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "waiting for scene to load...") ENDIF #ENDIF
WAIT(0)
ENDWHILE
DO_SPECIFIC_SCENARIO_SETUP()
IF IS_PED_UNINJURED(PLAYER_PED_ID())
ADD_PED_FOR_DIALOGUE(sDialogue, TREVOR_SPEAKER_ID, PLAYER_PED_ID(), "TREVOR") //Its alway trevor
SET_PED_CAN_USE_AUTO_CONVERSATION_LOOKAT(PLAYER_PED_ID(), TRUE)
ENDIF
IF IS_PED_UNINJURED(sBailJumperPed.pedIndex)
ADD_PED_FOR_DIALOGUE(sDialogue, BAIL_JUMPER_SPEAKER_ID, sBailJumperPed.pedIndex, sBailJumpers_VoiceID)//Different ped voice for target ped
SET_PED_CAN_USE_AUTO_CONVERSATION_LOOKAT(sBailJumperPed.pedIndex, TRUE)
ENDIF
ENDPROC
/// PURPOSE:
/// handle triggering the specific driving converstation
/// PARAMS:
/// i -
PROC DO_DRIVE_CONV(INT i)
IF NOT bDoneDialogue_DriveToMaudes[i]
IF BB_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sMissionTextBlock, sDialogueRoot_DriveToMaudesPlace[i], CONV_PRIORITY_AMBIENT_HIGH)
bDoneDialogue_DriveToMaudes[i] = TRUE
bConvoCoolDownActive = FALSE
iConvoCoolDown = 0
bDoneDialogue_BailJumperRespondToPlayerOrders = TRUE // reset so Bail Jumper doesn't make response at inappropriate time
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// triggers all the relevant dialogue during the take bail jumper to Maude's state and lose wanted rating
PROC HANDLE_DIALOGUE_DURING_DROPOFF()
// occasional response from bail jumper
// player getting in an unsuitable vehicle
VEHICLE_INDEX vehTempPlayer
// some conversation shouldn't get delayed if an objective is currently being displayed
// in this case they will play out without subtitles
enumSubtitlesState eSubtitleState_ImportantDialogue = DISPLAY_SUBTITLES
IF IS_MESSAGE_BEING_DISPLAYED()
AND GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) <> 0
eSubtitleState_ImportantDialogue = DO_NOT_DISPLAY_SUBTITLES
ENDIF
IF IS_PED_UNINJURED(sBailJumperPed.pedIndex)
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
iDialogueTimer = GET_GAME_TIMER()
ENDIF
// bail jumper will occasionally respond to players order
IF NOT bDoneDialogue_BailJumperRespondToPlayerOrders
IF BB_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sMissionTextBlock, "BB1_J6", CONV_PRIORITY_AMBIENT_HIGH)
// Random selected dialogue lines -
// I'm doing my best.
// Cut me some slack here, will you?
// Jesus, give me a chance.
bDoneDialogue_BailJumperRespondToPlayerOrders = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "HANDLE_DIALOGUE_DURING_DROPOFF - trigger bDoneDialogue_BailJumperRespondToPlayerOrders - BB1_J6") ENDIF #ENDIF
ENDIF
ENDIF
// player is in a vehicle
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
vehTempPlayer = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
// check if bail jumper is in the vehicle too
IF IS_PED_IN_ANY_VEHICLE(sBailJumperPed.pedIndex)
AND (GET_VEHICLE_PED_IS_IN(sBailJumperPed.pedIndex) = vehTempPlayer)
IF NOT IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
IF NOT bConvoCoolDownActive
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
iConvoCoolDown = GET_GAME_TIMER()
bConvoCoolDownActive = TRUE
ENDIF
ELSE
IF NOT bDoneDialogue_DriveToMaudes[0]
IF (GET_GAME_TIMER() - iConvoCoolDown) > 7500
DO_DRIVE_CONV(0)
ENDIF
ELIF NOT bDoneDialogue_DriveToMaudes[1]
IF (GET_GAME_TIMER() - iConvoCoolDown) > 10000
DO_DRIVE_CONV(1)
ENDIF
ELIF NOT bDoneDialogue_DriveToMaudes[2]
IF (GET_GAME_TIMER() - iConvoCoolDown) > 10000
DO_DRIVE_CONV(2)
ENDIF
ENDIF
ENDIF
// comments if the player is idling in a vehicle
IF DOES_ENTITY_EXIST(vehTempPlayer)
IF (GET_ENTITY_SPEED(vehTempPlayer) < 0.5)
IF NOT bDoneDialogue_IdleInVehicle
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF HAS_TIME_PASSED(iDialogueTimer_IdleInVehicle, 3500)
IF BB_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sMissionTextBlock, "BB1_STOP", CONV_PRIORITY_AMBIENT_HIGH)
// Random selected dialogue lines -
// Why are we stopped?
// No rush. I can sit here all day.
// You're really dragging this out aren't you?
bDoneDialogue_IdleInVehicle = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "HANDLE_DIALOGUE_DURING_DROPOFF - triggered bDoneDialogue_IdleInVehicle", "BB1_STOP") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
IF bDoneDialogue_IdleInVehicle
IF NOT IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("BB1_STOP")
iDialogueTimer_IdleInVehicle = GET_GAME_TIMER()
ENDIF
ELSE
iDialogueTimer_IdleInVehicle = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
ELSE
IF NOT bDoneDialogue_BailJumperNoticesCops
IF BB_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sMissionTextBlock, "BB1_J9", CONV_PRIORITY_AMBIENT_HIGH)
// Random selected dialogue lines -
// Looks like we're both wanted men now.
// Are those guys after you or me?
bDoneDialogue_BailJumperNoticesCops = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "HANDLE_DIALOGUE_DURING_DROPOFF - trigger bDoneDialogue_BailJumperNoticesCops - BB1_J9") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ELSE
// help text for player using unsuitable vehicle to transport bail jumper e.g. bike
IF NOT bDoneHelp_UnsuitableVehicle
IF NOT IS_PLAYER_VEHICLE_SUITABLE_TO_TRANSPORT_BAIL_JUMPER()
PRINT_HELP("BBS_VH1") // ~w~This vehicle isn't suitable to transport the bail jumper.~s~
bDoneHelp_UnsuitableVehicle = TRUE
ENDIF
ENDIF
iDialogueTimer_IdleInVehicle = GET_GAME_TIMER()
ENDIF
// reset the get in and out dialogue if the player is in a vehicle
bDoneDialogue_PlayerGetsInVehicle = FALSE
bDoneDialogue_PlayerGetsOutVehicle = FALSE
ELSE
iDialogueTimer_IdleInVehicle = GET_GAME_TIMER()
bDoneDialogue_IdleInVehicle = FALSE // reset dialogue
// player getting into a vehicle
IF IS_PED_GETTING_INTO_A_VEHICLE(PLAYER_PED_ID())
vehTempPlayer = GET_VEHICLE_PED_IS_ENTERING(PLAYER_PED_ID())
IF NOT bDoneDialogue_PlayerGetsInVehicle
IF IS_PLAYER_VEHICLE_SUITABLE_TO_TRANSPORT_BAIL_JUMPER()
IF NOT IS_PED_IN_ANY_VEHICLE(sBailJumperPed.pedIndex)
// Trevor gets in a suitable vehicleBB1_JACK
IF NOT IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("BBC_T6")
IF BB_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sCommonTextBlock, "BBC_T6", CONV_PRIORITY_AMBIENT_HIGH, eSubtitleState_ImportantDialogue)
// Random selected dialogue lines -
// Get in.
// Sit your ass down in here.
// Get the fuck in.
// In, now.
bDoneDialogue_PlayerGetsInVehicle = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "HANDLE_DIALOGUE_DURING_DROPOFF - trigger bDoneDialogue_PlayerGetsInVehicle - BBC_T6") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
// clear the unsuitable vehicle help text
CLEAR_SPECIFIC_HELP_TEXT_FROM_DISPLAYING("BBS_VH1", TRUE) // ~w~This vehicle isn't suitable to transport the bail jumper.~s~
ELSE
// vehicle is unsuitable
IF NOT IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("BBC_T8")
AND NOT IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("BB1_WTF")
IF (GET_RANDOM_INT_IN_RANGE(0, 11) < 5)
IF BB_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sCommonTextBlock, "BBC_T8", CONV_PRIORITY_AMBIENT_HIGH, eSubtitleState_ImportantDialogue)
// Random selected dialogue lines -
// Stay there, I'm just taking a break.
// Don't move.
// I'm just testing this out.
bDoneDialogue_PlayerGetsInVehicle = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "HANDLE_DIALOGUE_DURING_DROPOFF - trigger bDoneDialogue_PlayerGetsInVehicle - BBC_T8") ENDIF #ENDIF
ENDIF
ELSE
IF BB_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sMissionTextBlock, "BB1_WTF", CONV_PRIORITY_AMBIENT_HIGH, eSubtitleState_ImportantDialogue)
// Good luck trying to take me in with that vehicle.
bDoneDialogue_PlayerGetsInVehicle = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "HANDLE_DIALOGUE_DURING_DROPOFF - trigger bDoneDialogue_PlayerGetsInVehicle - BB1_WTF") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
IF NOT bDoneDialogue_PlayerJackingPed
IF BB_IS_PLAYER_JACKING_DRIVER(vehTempPlayer)
IF NOT IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("BB1_JACK")
AND NOT IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("BBC_T6")
AND NOT IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("BBC_T8")
IF BB_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sMissionTextBlock, "BB1_JACK", CONV_PRIORITY_AMBIENT_HIGH, eSubtitleState_ImportantDialogue)
// Who's the criminal here again?
bDoneDialogue_PlayerJackingPed = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "HANDLE_DIALOGUE_DURING_DROPOFF - trigger bDoneDialogue_PlayerJackingPed - BB1_JACK") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
// reset the get in and out dialogue if the player is not in / getting in a vehicle
bDoneDialogue_PlayerGetsInVehicle = FALSE
// tell bail jumper to get out
IF IS_PED_IN_ANY_VEHICLE(sBailJumperPed.pedIndex)
IF NOT bDoneDialogue_PlayerGetsOutVehicle
IF NOT IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("BBC_T7")
AND NOT IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("BB1_OUT")
IF (GET_RANDOM_INT_IN_RANGE(0, 11) < 5)
IF BB_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sCommonTextBlock, "BBC_T7", CONV_PRIORITY_AMBIENT_HIGH, eSubtitleState_ImportantDialogue)
// Random selected dialogue lines -
// Get out.
// Come on out.
// Come on.
// Get the fuck out.
// Move it.
bDoneDialogue_PlayerGetsOutVehicle = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "HANDLE_DIALOGUE_DURING_DROPOFF - trigger bDoneDialogue_PlayerGetsOutVehicle - BBC_T7") ENDIF #ENDIF
ENDIF
ELSE
IF BB_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sMissionTextBlock, "BB1_OUT", CONV_PRIORITY_AMBIENT_HIGH, eSubtitleState_ImportantDialogue)
// Random selected dialogue lines -
// Where are you going now?
// What are you doing?
// Make up your mind!
bDoneDialogue_PlayerGetsOutVehicle = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "HANDLE_DIALOGUE_DURING_DROPOFF - trigger bDoneDialogue_PlayerGetsOutVehicle - BB1_OUT") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
// check for Trevo threatening Bail Jumper whilst in his command
IF sBailJumperPed.AI = BB_PED_AI_STATE_SURRENDERED
AND IsPedPerformingTask(sBailJumperPed.pedIndex, SCRIPT_TASK_HANDS_UP)
IF IS_ENTITY_IN_RANGE_COORDS(sBailJumperPed.pedIndex, vPlayerPos, LEAVE_PLAYER_GROUP_DISTANCE)
IF NOT IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("BB1_J10")
IF HAS_TIME_PASSED(iDialogueTimerHandsUpDuringDropOff, GET_RANDOM_INT_IN_RANGE(2500, 5000))
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDIF
IF BB_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sMissionTextBlock, "BB1_J10", CONV_PRIORITY_AMBIENT_HIGH)
// Random selected dialogue lines -
// Whoa, what are you doing?
// Look, I'm coming with you, okay?
// Please, I'll do exactly what you tell me to do.
// Don't do that. I won't run again, I promise.
// Come on, please put the gun down now.
iDialogueTimerHandsUpDuringDropOff = GET_GAME_TIMER()
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "HANDLE_DIALOGUE_DURING_DROPOFF - trigger aiming at jumper BB1_J10") ENDIF #ENDIF
ENDIF
ENDIF
ELSE
iDialogueTimerHandsUpDuringDropOff = GET_GAME_TIMER()
ENDIF
ENDIF
ELSE
iDialogueTimerHandsUpDuringDropOff = 0 //reset this timer to ensure it goes through straight away
// both on foot
IF NOT bDoneDialogue_BailJumperNoticesCops
IF BB_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sMissionTextBlock, "BB1_J9", CONV_PRIORITY_AMBIENT_HIGH)
// Random selected dialogue lines -
// Looks like we're both wanted men now.
// Are those guys after you or me?
iDialogueTimer = GET_GAME_TIMER()
bDoneDialogue_BailJumperNoticesCops = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "HANDLE_DIALOGUE_DURING_DROPOFF - trigger bDoneDialogue_BailJumperNoticesCops BB1_J9") ENDIF #ENDIF
ENDIF
ENDIF
// bail jumper is struggling to keep up
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF HAS_TIME_PASSED(iDialogueTimer, GET_RANDOM_INT_IN_RANGE(3000, 6000))
IF NOT IS_ENTITY_IN_RANGE_COORDS(sBailJumperPed.pedIndex, vPlayerPos, (LEAVE_PLAYER_GROUP_DISTANCE - 5))
IF BB_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sMissionTextBlock, "BB1_J4", CONV_PRIORITY_AMBIENT_HIGH)
// Random selected dialogue lines -
// Are you going to wait for me or not?
// I'm doing my best to keep up, okay?
// I'm a fifty-two year old man. You're going to have to slow it down.
// I can't go that fast. I'm real unfit.
iDialogueTimer = GET_GAME_TIMER()
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "HANDLE_DIALOGUE_DURING_DROPOFF - trigger struggle to keep up BB1_J4") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// rubberbanding for a fleeing ped in a vehicle for the chasing player
/// NOTE: doesn't test for the ped being alive, being in a vehicle or having a valid drive task
/// PARAMS:
/// pedIndex_Driver - the ped driving
/// vehIndex - the driver's vehicle
/// vPlayerPosition - the player's position
PROC UPDATE_VEHICLE_SPEED_FOR_CHASING_PLAYER(PED_INDEX pedIndex_Driver, VEHICLE_INDEX vehIndex, VECTOR vPlayerPosition)
FLOAT fSetSpeed
FLOAT fIncreaseSpeedRange = 64.0 // 8.0
FLOAT fDecreaseSpeedRange = 1600.0 // 40.0
FLOAT fUberDecreaseSpeedRange = 4900 // 70.0
FLOAT fCurrentChaseDistanceSquared = VDIST2(GET_ENTITY_COORDS(pedIndex_Driver), vPlayerPosition)
//IF NOT IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF fCurrentChaseDistanceSquared > fUberDecreaseSpeedRange
AND NOT IS_ENTITY_ON_SCREEN(vehIndex)
fSetSpeed = 12.0
ELIF fCurrentChaseDistanceSquared > fDecreaseSpeedRange
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
fSetSpeed = 10.0
ELSE
fSetSpeed = 18.0
ENDIF
ELIF fCurrentChaseDistanceSquared < fIncreaseSpeedRange
fSetSpeed = 28.0
ELSE
fSetSpeed = 22.0
ENDIF
IF (GET_PED_IN_VEHICLE_SEAT(vehIndex, VS_DRIVER) = pedIndex_Driver) // B*1909317 - assert fix for ped needing to be the driver
SET_DRIVE_TASK_CRUISE_SPEED(pedIndex_Driver, fSetSpeed)
//#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "UPDATE_VEHICLE_SPEED_FOR_CHASING_PLAYER - cruise speed set to - ", fSetSpeed) ENDIF #ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// handles ped driving along point route - uses TASK_VEHICLE_DRIVE_TO_COORD
/// PARAMS:
/// pedIndex_Driver - the ped driving
/// TargetVehicle - the vehicle they are using
/// TargetVehicleModel - the vehicle model
/// ChaseRoute -
/// ChaseIndex -
/// iTotalChasePoints -
/// RETURNS:
/// TRUE if ped has reached final point chase route point
FUNC BOOL PROGRESS_VEHICLE_ROUTE(PED_INDEX pedIndex_Driver, VEHICLE_INDEX TargetVehicle, MODEL_NAMES TargetVehicleModel, VECTOR &ChaseRoute[], INT &ChaseIndex, INT iTotalChasePoints)
IF iChaseIndex >= iTotalChasePoints
RETURN TRUE
ENDIF
// info from jMart - just use 0 for target dist if you don't want them to stop at all
IF NOT IS_ENTITY_IN_RANGE_COORDS(TargetVehicle, ChaseRoute[ChaseIndex], 15)
IF NOT IsPedPerformingTask(pedIndex_Driver, SCRIPT_TASK_VEHICLE_DRIVE_TO_COORD)
AND NOT IsPedPerformingTask(pedIndex_Driver, SCRIPT_TASK_VEHICLE_GOTO_NAVMESH)
IF iChaseIndex < 7 // point at which the chase leaves the road network
TASK_VEHICLE_DRIVE_TO_COORD(pedIndex_Driver, TargetVehicle, ChaseRoute[ChaseIndex], 35, DRIVINGSTYLE_NORMAL, TargetVehicleModel, DRIVINGMODE_AVOIDCARS_RECKLESS, 0.0, 2.0)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "PROGRESS_VEHICLE_ROUTE : ", "TASK_VEHICLE_DRIVE_TO_COORD failed so reapply - target coords : ", ChaseRoute[ChaseIndex]) ENDIF #ENDIF
ELSE
TASK_VEHICLE_GOTO_NAVMESH(pedIndex_Driver, TargetVehicle, ChaseRoute[ChaseIndex], 35, DRIVINGMODE_AVOIDCARS_RECKLESS|DF_PreferNavmeshRoute, 0.0)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "PROGRESS_VEHICLE_ROUTE : ", "New checkpoint :", ChaseIndex, "TASK_VEHICLE_GOTO_NAVMESH failed so reapply - target coords : ", ChaseRoute[ChaseIndex]) ENDIF #ENDIF
ENDIF
ENDIF
ELSE
ChaseIndex++
IF iChaseIndex >= iTotalChasePoints
RETURN TRUE
ELSE
IF iChaseIndex < 7 // point at which the chase leaves the road network
TASK_VEHICLE_DRIVE_TO_COORD(pedIndex_Driver, TargetVehicle, ChaseRoute[ChaseIndex], 35, DRIVINGSTYLE_NORMAL, TargetVehicleModel, DRIVINGMODE_AVOIDCARS_RECKLESS, 0.0, 2.0)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "PROGRESS_VEHICLE_ROUTE : ", "New checkpoint :", ChaseIndex, "TASK_VEHICLE_DRIVE_TO_COORD - target coords : ", ChaseRoute[ChaseIndex]) ENDIF #ENDIF
ELSE
TASK_VEHICLE_GOTO_NAVMESH(pedIndex_Driver, TargetVehicle, ChaseRoute[ChaseIndex], 35, DRIVINGMODE_AVOIDCARS_RECKLESS|DF_PreferNavmeshRoute, 0.0)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "PROGRESS_VEHICLE_ROUTE : ", "New checkpoint :", ChaseIndex, "TASK_VEHICLE_GOTO_NAVMESH - target coords : ", ChaseRoute[ChaseIndex]) ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Changes the mission's current stage
/// PARAMS:
/// msStage - Mission stage to switch to
PROC SET_STAGE(MISSION_STAGE msStage)
emissionStage = msStage
eSubStage = SS_SETUP
ENDPROC
/// PURPOSE:
/// requests the assets for the outro mocap cutscene entities so SET_CUTSCENE_PED_COMPONENT_VARIATION_... can be called
PROC SET_MISSION_ENTITIES_COMP_VARIATIONS_FOR_OUTRO_MOCAP()
IF IS_ENTITY_ALIVE(sBailJumperPed.pedIndex)
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED(sSceneHandle_BailJumper, sBailJumperPed.pedIndex)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, GET_THIS_SCRIPT_NAME(), " : SET_MISSION_ENTITIES_COMP_VARIATIONS_FOR_OUTRO_MOCAP - Bail Jumper - Frame Count : ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
ENDIF
IF IS_ENTITY_ALIVE(sMaude.index)
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED(sSceneHandle_Maude, sMaude.index)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, GET_THIS_SCRIPT_NAME(), " : SET_MISSION_ENTITIES_COMP_VARIATIONS_FOR_OUTRO_MOCAP - Maude - Frame Count : ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// handles requesting mocap on player approach and releasing outro mocap if player moves away
PROC MANAGE_OUTRO_MOCAP_LOADING()
IF IS_COORD_IN_RANGE_OF_COORD(GET_ENTITY_COORDS(PLAYER_PED_ID()), vMaudePlace, DEFAULT_CUTSCENE_LOAD_DIST)
IF NOT IS_PLAYER_CHANGING_CLOTHES()
REQUEST_CUTSCENE(tlOutroMocapName)
SET_MISSION_ENTITIES_COMP_VARIATIONS_FOR_OUTRO_MOCAP()
bRequestedOutroMocap = TRUE
ENDIF
ELSE
IF bRequestedOutroMocap
IF NOT IS_COORD_IN_RANGE_OF_COORD(GET_ENTITY_COORDS(PLAYER_PED_ID()), vMaudePlace, DEFAULT_CUTSCENE_UNLOAD_DIST)
IF HAS_CUTSCENE_LOADED()
REMOVE_CUTSCENE()
bRequestedOutroMocap = FALSE
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "MANAGE_OUTRO_MOCAP_LOADING - unloaded ", tlOutroMocapName, " Frame Count : ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
ELSE
SET_MISSION_ENTITIES_COMP_VARIATIONS_FOR_OUTRO_MOCAP()
ENDIF
ENDIF
ENDIF
// B*1579800 - have to bin off the mocap if player changes clothes
IF bRequestedOutroMocap
IF IS_PLAYER_CHANGING_CLOTHES()
REMOVE_CUTSCENE()
bRequestedOutroMocap = FALSE
CPRINTLN(DEBUG_MISSION, "MANAGE_OUTRO_MOCAP_LOADING - unloaded ", tlOutroMocapName, " player changing clothes! Frame Count : ", GET_FRAME_COUNT())
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// handles everything which needs to happen after END_REPLAY_SETUP() has been called
/// PARAMS:
/// eCurrentStage - which mission stage we are returning to
PROC REPLAY_SKIP_SETUP_UPON_RETURN_TO_GAMEPLAY(MISSION_STAGE eReturnToStage)
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
SWITCH eReturnToStage
CASE MISSION_STAGE_CUTSCENE_MAUDE_TAKES_TARGET
// preload the mocap do it kicks in straight away
RC_REQUEST_MID_MISSION_CUTSCENE(tlOutroMocapName) // can't use RC_REQUEST_CUTSCENE in this instance, as it causes bug 1000899
SET_MISSION_ENTITIES_COMP_VARIATIONS_FOR_OUTRO_MOCAP()
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "REPLAY_SKIP_SETUP_UPON_RETURN_TO_GAMEPLAY : ", "RC_REQUEST_MID_MISSION_CUTSCENE : MAUDE_MCS_2 ", " FC : ", GET_FRAME_COUNT()) ENDIF #ENDIF
WHILE NOT RC_IS_CUTSCENE_OK_TO_START(TRUE)
OR NOT CREATE_AND_SETUP_MAUDE()
RC_REQUEST_MID_MISSION_CUTSCENE(tlOutroMocapName) // can't use RC_REQUEST_CUTSCENE in this instance, as it causes bug 1000899
SET_MISSION_ENTITIES_COMP_VARIATIONS_FOR_OUTRO_MOCAP()
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "REPLAY_SKIP_SETUP_UPON_RETURN_TO_GAMEPLAY : ", "waiting on RC_IS_CUTSCENE_OK_TO_START & CREATE_AND_SETUP_MAUDE : MAUDE_MCS_2 ", " FC : ", GET_FRAME_COUNT()) ENDIF #ENDIF
WAIT(0)
ENDWHILE
BREAK
ENDSWITCH
ENDIF
ENDPROC
/// PURPOSE:
/// Handles setup game to fulfil mission stage criteria so it can advance to the next stage
PROC SKIP_MISSION_STAGE()
IF IS_PED_UNINJURED(PLAYER_PED_ID())
KILL_ANY_CONVERSATION()
CLEAR_PRINTS()
IF IS_HELP_MESSAGE_BEING_DISPLAYED()
CLEAR_HELP(TRUE)
ENDIF
SWITCH eMissionStage
// ------------------------------------------
CASE MISSION_STAGE_PLAYER_LOCATE_BAIL_JUMPER
IF eSubStage = SS_UPDATE //in script skips where we change the eSubStage, need to safe gaurd that the SS_SETUP has already had chance to run.
IF NOT IS_REPLAY_BEING_SET_UP()
//WARP_PLAYER_TO_RAMDOM_SAFE_POINT_IN_RANGE_PED(sBailJumperPed.pedIndex, BAIL_BONDS_RANGE_TO_TARGET_BLIP-1)
SAFE_TELEPORT_ENTITY(PLAYER_PED_ID(), vPos_PlayerWarpGetNearTarget, fHeading_PlayerWarpGetNearTarget)
IF IS_PED_UNINJURED(sBailJumperPed.pedIndex)
SET_ENTITY_FACING(PLAYER_PED_ID(), GET_ENTITY_COORDS(sBailJumperPed.pedIndex))
ENDIF
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0)
// load world if target stage is the next one
IF bLoadedWorldForStageSkipping = FALSE
IF eMissionSkipTargetStage = MISSION_STAGE_TRIGGER_BAIL_JUMPER_REACTION // if the target stage is the next stage load the scene otherwise don't bother
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
WAIT_FOR_WORLD_TO_LOAD(GET_ENTITY_COORDS(PLAYER_PED_ID()), 50.0, FLAG_COLLISIONS_MOVER | FLAG_MAPDATA)
bLoadedWorldForStageSkipping = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "SKIP_STAGE : ", "MISSION_STAGE_PLAYER_LOCATE_BAIL_JUMPER : ", "LOADED WORLD", " FC : ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
bDoneDialogue_PlayerSpotsBailJumperFromDistance = TRUE
ePlayerSpotsBailJumperType = BB_PSBJT_PLAYER_SPOTS_BAIL_JUMPER_LONG_DISTANCE
RESET_MISSION_PED_TIMERS_AND_THREAT_TESTS()
eSubStage = SS_CLEANUP
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "SKIP_STAGE : ", "MISSION_STAGE_PLAYER_LOCATE_BAIL_JUMPER : ", " FC : ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
BREAK
// ------------------------------------------
CASE MISSION_STAGE_TRIGGER_BAIL_JUMPER_REACTION
bDoneDialogue_PlayerSpotsBailJumperFromDistance = TRUE
bDoneDialogue_PlayerSpotsBailJumperCloseDistance = TRUE
IF eSubStage = SS_UPDATE //in script skips where we change the eSubStage, need to safe gaurd that the SS_SETUP has already had chance to run.
IF NOT IS_REPLAY_BEING_SET_UP()
//WARP_PLAYER_TO_RAMDOM_SAFE_POINT_IN_RANGE_PED(sBailJumperPed.pedIndex, BAIL_BONDS_RANGE_TO_TARGET_ACTIVE-1)
SAFE_TELEPORT_ENTITY(PLAYER_PED_ID(), vPos_PlayerWarpApproachTarget, fHeading_PlayerWarpApproachTarget)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0)
// load world if target stage is the next one
IF bLoadedWorldForStageSkipping = FALSE
IF eMissionSkipTargetStage = MISSION_STAGE_CHASE // if the target stage is the next stage load the scene otherwise don't bother
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
WAIT_FOR_WORLD_TO_LOAD(GET_ENTITY_COORDS(PLAYER_PED_ID()), 50.0, FLAG_COLLISIONS_MOVER | FLAG_MAPDATA)
bLoadedWorldForStageSkipping = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "SKIP_STAGE : ", "MISSION_STAGE_TRIGGER_BAIL_JUMPER_REACTION : ", "LOADED WORLD", " FC : ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
sBailJumperPed.iTimer = GET_GAME_TIMER() - 5000 // force wait to go ahead
RESET_MISSION_PED_TIMERS_AND_THREAT_TESTS()
eSubStage = SS_CLEANUP
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "SKIP_STAGE : ", "MISSION_STAGE_TRIGGER_BAIL_JUMPER_REACTION : ", " FC : ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
BREAK
// ------------------------------------------
CASE MISSION_STAGE_CHASE
bDoneDialogue_BailJumperBeginsToFlee = TRUE // set to skip over the convo's which loop in the SS_SETUP sub stage
IF eBailBondType = BBT_VEHICLE_FLEE
IF eSubStage = SS_SETUP
IF IS_PED_UNINJURED(sBailJumperPed.pedIndex)
AND IS_VEHICLE_OK(sMissionVehicle[0].index)
IF NOT IS_PED_IN_VEHICLE(sBailJumperPed.pedIndex, sMissionVehicle[0].index)
SET_PED_INTO_VEHICLE(sBailJumperPed.pedIndex, sMissionVehicle[0].index)
ENDIF
ENDIF
ENDIF
ENDIF
IF eSubStage = SS_UPDATE //in script skips where we change the eSubStage, need to safe gaurd that the SS_SETUP has already had chance to run.
bDoneDialogue_TrevorResponsesToBailJumperSurrendering = TRUE // skip the initial dialogue which triggers in MISSION_STAGE_TAKE_TARGET_TO_MAUDE
IF NOT IS_REPLAY_BEING_SET_UP()
WARP_PLAYER_TO_RAMDOM_SAFE_POINT_IN_RANGE_PED(sBailJumperPed.pedIndex, 2.5)
// load world if target stage is the next one
IF bLoadedWorldForStageSkipping = FALSE
IF eMissionSkipTargetStage = MISSION_STAGE_TAKE_TARGET_TO_MAUDE // if the target stage is the next stage load the scene otherwise don't bother
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
WAIT_FOR_WORLD_TO_LOAD(GET_ENTITY_COORDS(PLAYER_PED_ID()), 50.0, FLAG_COLLISIONS_MOVER | FLAG_MAPDATA)
bLoadedWorldForStageSkipping = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "SKIP_STAGE : ", "MISSION_STAGE_CHASE : ", "LOADED WORLD", " FC : ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
KILL_ANY_CONVERSATION()
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
RESET_MISSION_PED_TIMERS_AND_THREAT_TESTS()
eSubStage = SS_CLEANUP // B*1468078 - conditions aren't met on replay because player can't be warped
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "SKIP_STAGE : ", "MISSION_STAGE_CHASE : ", " FC : ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
BREAK
// ------------------------------------------
CASE MISSION_STAGE_TAKE_TARGET_TO_MAUDE
bDoneObjective_ApproachBailJumper = TRUE
IF eSubStage = SS_UPDATE //in script skips where we change the eSubStage, need to safe gaurd that the SS_SETUP has already had chance to run.
SAFE_TELEPORT_PED(sBailJumperPed.pedIndex, vMaudePlace, 0)
IF NOT IS_REPLAY_BEING_SET_UP()
SAFE_TELEPORT_PED(PLAYER_PED_ID(), vMaudePlace, 254.9762)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0)
// load world if target stage is the next one
IF bLoadedWorldForStageSkipping = FALSE
IF eMissionSkipTargetStage = MISSION_STAGE_CUTSCENE_MAUDE_TAKES_TARGET // if the target stage is the next stage load the scene otherwise don't bother
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
WAIT_FOR_WORLD_TO_LOAD(GET_ENTITY_COORDS(PLAYER_PED_ID()), 50.0, FLAG_COLLISIONS_MOVER | FLAG_MAPDATA)
bLoadedWorldForStageSkipping = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "SKIP_STAGE : ", "MISSION_STAGE_TAKE_TARGET_TO_MAUDE : ", "LOADED WORLD", " FC : ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
RESET_MISSION_PED_TIMERS_AND_THREAT_TESTS()
eSubStage = SS_CLEANUP
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "SKIP_STAGE : ", "MISSION_STAGE_TAKE_TARGET_TO_MAUDE : ", " FC : ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
BREAK
// ------------------------------------------
CASE MISSION_STAGE_CUTSCENE_MAUDE_TAKES_TARGET
IF eSubStage = SS_UPDATE //in script skips where we change the eSubStage, need to safe gaurd that the SS_SETUP has already had chance to run.
IF IS_CUTSCENE_PLAYING()
STOP_CUTSCENE()
ENDIF
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "SKIP_STAGE : ", "MISSION_STAGE_CUTSCENE_MAUDE_TAKES_TARGET : ", " FC : ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
BREAK
// ------------------------------------------
CASE MISSION_STAGE_LOSE_THE_COPS
IF eSubStage = SS_UPDATE //in script skips where we change the eSubStage, need to safe gaurd that the SS_SETUP has already had chance to run.
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
RESET_MISSION_PED_TIMERS_AND_THREAT_TESTS()
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "SKIP_STAGE : ", "MISSION_STAGE_LOSE_THE_COPS : ", " FC : ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
BREAK
// ------------------------------------------
CASE MISSION_STAGE_TARGET_FLEES_AGAIN
IF eSubStage = SS_UPDATE //in script skips where we change the eSubStage, need to safe gaurd that the SS_SETUP has already had chance to run.
bDoneDialogue_TrevorResponsesToBailJumperSurrendering = TRUE // skip the initial dialogue which triggers in MISSION_STAGE_TAKE_TARGET_TO_MAUDE
IF NOT IS_REPLAY_BEING_SET_UP()
WARP_PLAYER_TO_RAMDOM_SAFE_POINT_IN_RANGE_PED(sBailJumperPed.pedIndex, 2.5)
// load world if target stage is the next one
IF bLoadedWorldForStageSkipping = FALSE
IF eMissionSkipTargetStage = MISSION_STAGE_TAKE_TARGET_TO_MAUDE // if the target stage is the next stage load the scene otherwise don't bother
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
WAIT_FOR_WORLD_TO_LOAD(GET_ENTITY_COORDS(PLAYER_PED_ID()), 50.0, FLAG_COLLISIONS_MOVER | FLAG_MAPDATA)
bLoadedWorldForStageSkipping = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "SKIP_STAGE : ", "MISSION_STAGE_CHASE : ", "LOADED WORLD", " FC : ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
KILL_ANY_CONVERSATION()
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
RESET_MISSION_PED_TIMERS_AND_THREAT_TESTS()
eSubStage = SS_CLEANUP
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "SKIP_STAGE : ", "MISSION_STAGE_TARGET_FLEES_AGAIN : ", " FC : ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDPROC
/// PURPOSE:
/// Jumps to the stage selected
/// Also decides when we have finished skipping
/// PARAMS:
/// eNewStage - stage to jump to
PROC JUMP_TO_STAGE(MISSION_STAGE eNewStage)
IF eMissionStage = eNewStage // end skip stage
IF IS_REPLAY_BEING_SET_UP()
END_REPLAY_SETUP(DEFAULT, DEFAULT, FALSE) // don't return control before REPLAY_SKIP_SETUP_UPON_RETURN_TO_GAMEPLAY has finished RC_END_Z_SKIP to handle it
ENDIF
REPLAY_SKIP_SETUP_UPON_RETURN_TO_GAMEPLAY(eMissionStage) // specific setup which must come after END_REPLAY_SETUP
//B* 1468238 - don't fade back in here when skipping to mocap (let the mocap stage handle it)
IF eMissionStage = MISSION_STAGE_CUTSCENE_MAUDE_TAKES_TARGET
RC_END_Z_SKIP(DEFAULT, FALSE)
ELSE
RC_END_Z_SKIP()
ENDIF
bFinishedStageSkipping = TRUE
bLoadedWorldForStageSkipping = FALSE
// ensure we are fully faded in if we have skipped to the mission passed stage, since the mission passed GUI doesn't display if not (seems to need a frame wait too)
IF eMissionStage = MISSION_STAGE_MISSION_PASSED
SAFE_FADE_SCREEN_IN_FROM_BLACK()
ENDIF
ELSE
SKIP_MISSION_STAGE()
ENDIF
ENDPROC
/// PURPOSE:
/// Reset the mission, cleanups the current state and set's the mission up again
/// USED by the mission replay checkpoint setup and Debug skips
PROC RESET_MISSION()
MISSION_CLEANUP(TRUE, FALSE)
//teleport player back to start location, as he'll fall through the floor otherwise, because its not loaded.
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
IF NOT IS_REPLAY_BEING_SET_UP()
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
SAFE_TELEPORT_PED(PLAYER_PED_ID(), vPos_PlayerMissionStart, fHeading_PlayerMissionStart)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0)
ENDIF
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
ENDIF
KILL_ANY_CONVERSATION() // added here since i commented it out in mission_cleanup as fail dialogue can be playing when it's called
REMOVE_RELATIONSHIP_GROUP(HASH_BAILBOND_TARGET)
//re do mission initialization
INIT_MISSION()
SET_STAGE(MISSION_STAGE_PLAYER_LOCATE_BAIL_JUMPER)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "RESET_MISSION - done") ENDIF #ENDIF
ENDPROC
/// PURPOSE:
/// Perform a Z skip. Used by the mission checkpoints and the debug Z skip function
/// PARAMS:
/// iNewStage - Mission stage we want to skip to
/// bResetMission - used when we go backwards in mission flow. If false we also don't stop the active cutscene in RC_START_Z_SKIP, instead handled in SKIP_STAGE to fix bug 1006740
PROC DO_Z_SKIP(INT iNewStage, BOOL bResetMission = FALSE)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "DO_Z_SKIP with parameters - iNewStage = ", iNewStage, " bResetMission = ", bResetMission) ENDIF #ENDIF
RC_START_Z_SKIP(bResetMission)
IF bResetMission
RESET_MISSION()
ENDIF
eMissionSkipTargetStage = INT_TO_ENUM(MISSION_STAGE, iNewStage)
bFinishedStageSkipping = FALSE
IF IS_REPLAY_BEING_SET_UP()
bLoadedWorldForStageSkipping = TRUE
ELSE
bLoadedWorldForStageSkipping = FALSE
ENDIF
// load world for the mission start area if we are resetting the mission to the intro mocap. Moved here from script skip stage to fix bug 1006740 - mocap exit states not getting set as game is waiting on world to load before getting to check
// basically if you press CROSS to confirm which stage in the z menu, it skipped the mocap but couldn't sent exit states as it was waiting for world to load first.
IF NOT IS_REPLAY_BEING_SET_UP()
IF eMissionSkipTargetStage = MISSION_STAGE_PLAYER_LOCATE_BAIL_JUMPER
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
SAFE_TELEPORT_PED(PLAYER_PED_ID(), vPos_PlayerMissionStart, fHeading_PlayerMissionStart) //setup player in spot for mission start
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0)
WAIT_FOR_WORLD_TO_LOAD(GET_ENTITY_COORDS(PLAYER_PED_ID()), 50.0, FLAG_COLLISIONS_MOVER | FLAG_MAPDATA)
bLoadedWorldForStageSkipping = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "DO_Z_SKIP - LOADED WORLD ready at mission start area framecount : ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "DO_Z_SKIP : iNewStage = ", iNewStage, " bResetMission = ", bResetMission) ENDIF #ENDIF
JUMP_TO_STAGE(eMissionSkipTargetStage)
ENDPROC
//-------------------------------------------------------------------------------------------------------------------------------------------------
// DEBUG - J,P and Z skip stuff
//-------------------------------------------------------------------------------------------------------------------------------------------------
#IF IS_DEBUG_BUILD
/// PURPOSE:
/// check for debug S, F, P and J skips
PROC DEBUG_Check_Debug_Keys()
INT i
INT iNewStage
// Check for Pass
IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_S))
WAIT_FOR_CUTSCENE_TO_STOP()
KILL_ANY_CONVERSATION()
FOR i=0 TO (iNumTargetBackupPeds - 1)
IF IS_PED_UNINJURED(sBackupPed[i].index)
CLEAR_PED_TASKS(sBackupPed[i].index)
ENDIF
ENDFOR
IF IS_HELP_MESSAGE_BEING_DISPLAYED()
CLEAR_HELP(TRUE)
ENDIF
CLEAR_PRINTS()
IF IS_PED_UNINJURED(PLAYER_PED_ID())
CLEAR_PED_TASKS(PLAYER_PED_ID())
ENDIF
//make target and buddies unhostile? or done in cleanup?
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "S SKIP") ENDIF #ENDIF
SCRIPT_PASSED(BB_PASSED_TARGET_CAPTURED)
ENDIF
// Check for Fail
IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_F))
WAIT_FOR_CUTSCENE_TO_STOP()
KILL_ANY_CONVERSATION()
FOR i=0 TO (iNumTargetBackupPeds - 1)
IF IS_PED_UNINJURED(sBackupPed[i].index)
CLEAR_PED_TASKS(sBackupPed[i].index)
ENDIF
ENDFOR
IF IS_HELP_MESSAGE_BEING_DISPLAYED()
CLEAR_HELP(TRUE)
ENDIF
CLEAR_PRINTS()
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "F SKIP") ENDIF #ENDIF
SET_STAGE(MISSION_STAGE_MISSION_FAILED_WAIT_FOR_FADE)
ENDIF
// Check for Skip forward
IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_J))
SWITCH eMissionStage
CASE MISSION_STAGE_LOSE_THE_COPS
FALLTHRU
CASE MISSION_STAGE_TARGET_FLEES_AGAIN
iNewStage = ENUM_TO_INT(MISSION_STAGE_TAKE_TARGET_TO_MAUDE)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "J SKIP : ", "PRE STAGE, FROM LOSE COPS / FLEE AGAIN int now = ", iNewStage) ENDIF #ENDIF
BREAK
DEFAULT
iNewStage = ENUM_TO_INT(eMissionStage) + 1
BREAK
ENDSWITCH
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "J SKIP : ", "new stage = ", iNewStage) ENDIF #ENDIF
DO_Z_SKIP(iNewStage, FALSE) //perform a Z skip to the next stage, without the mission reset
ENDIF
// Check for Skip backwards
IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_P))
SWITCH eMissionStage
CASE MISSION_STAGE_LOSE_THE_COPS
FALLTHRU
CASE MISSION_STAGE_TARGET_FLEES_AGAIN
iNewStage = ENUM_TO_INT(MISSION_STAGE_TAKE_TARGET_TO_MAUDE)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "P SKIP : ", "PRE STAGE, FROM LOSE COPS / FLEE AGAIN int now = ", iNewStage) ENDIF #ENDIF
BREAK
DEFAULT
iNewStage = ENUM_TO_INT(eMissionStage)-1
BREAK
ENDSWITCH
IF iNewStage > -1
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "P SKIP : ", "new stage = ", iNewStage) ENDIF #ENDIF
DO_Z_SKIP(iNewStage, TRUE)
ENDIF
ENDIF
// z skip menu
IF LAUNCH_MISSION_STAGE_MENU(mSkipMenu, iNewStage)
// if we are skipping forward in the mission stages, just J skip rather than a full mission reset
// make sure additional stages are handled here! These sit at the end of the enum so need to be dealt with differently.
IF (eMissionStage = MISSION_STAGE_LOSE_THE_COPS) // additional stages dealt seperately since they sit at the end of the MISSION_STAGE enum
OR (eMissionStage = MISSION_STAGE_TARGET_FLEES_AGAIN) // additional stages dealt seperately since they sit at the end of the MISSION_STAGE enum
IF iNewStage = ENUM_TO_INT(MISSION_STAGE_CUTSCENE_MAUDE_TAKES_TARGET) // trying to z skip past lose cops so don't reset mission
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "Z SKIP : new stage = ", iNewStage, " ResetMission = ", FALSE) ENDIF #ENDIF
DO_Z_SKIP(iNewStage, FALSE)
ELSE
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "Z SKIP : new stage = ", iNewStage, " ResetMission = ", TRUE) ENDIF #ENDIF
DO_Z_SKIP(iNewStage, TRUE)
ENDIF
ELIF (iNewStage <= ENUM_TO_INT(eMissionStage))
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "Z SKIP : new stage = ", iNewStage, " ResetMission = ", TRUE) ENDIF #ENDIF
DO_Z_SKIP(iNewStage, TRUE)
ELSE
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "Z SKIP : new stage = ", iNewStage, " ResetMission = ", FALSE) ENDIF #ENDIF
DO_Z_SKIP(iNewStage, FALSE)
ENDIF
ENDIF
ENDPROC
#ENDIF
/// PURPOSE:
/// updates the reason for mission failed
/// in order of most important fail reason so if multiple fails conditions have been set, we use the most important
PROC UPDATE_FAIL_REASON()
// check for player attacking or killing Maude
IF DOES_ENTITY_EXIST(sMaude.index)
IF IS_ENTITY_DEAD(sMaude.index)
OR IS_PED_INJURED(sMaude.index)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "Mission Failed Checks - BB_FAILED_MAUDE_DIED") ENDIF #ENDIF
eBB_MissionFailedReason = BB_FAILED_MAUDE_DIED
EXIT
ENDIF
//if we have already failed for attacking Maude no need to recheck
IF eBB_MissionFailedReason = BB_FAILED_MAUDE_ATTACKED
EXIT
ENDIF
IF SHOULD_MAUDE_FLEE()
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "Mission Failed Checks - BB_FAILED_MAUDE_ATTACKED") ENDIF #ENDIF
eBB_MissionFailedReason = BB_FAILED_MAUDE_ATTACKED
EXIT
ENDIF
ENDIF
//if we have already failed for jumper escaping don't do the rest of the checks
IF eBB_MissionFailedReason = BB_FAILED_BAIL_JUMPER_ESCAPED
OR eBB_MissionFailedReason = BB_FAILED_DIST_CLEANUP_BEFORE_ENCOUNTER
EXIT
ENDIF
// check for player not activating the encounter
IF eMissionStage = MISSION_STAGE_PLAYER_LOCATE_BAIL_JUMPER
// dist check needs to exceed the mission launch distance so adding another 25 meters
IF NOT (VDIST2(vPlayerPos, sBailBondLaunchData.vStartPoint) <= ((sBailBondLaunchData.fStartRange + 25.0)* (sBailBondLaunchData.fStartRange + 25.0)))
IF IS_ENTITY_OCCLUDED(sBailJumperPed.pedIndex)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "Mission Failed Checks - BB_FAILED_DIST_CLEANUP_BEFORE_ENCOUNTER") ENDIF #ENDIF
eBB_MissionFailedReason = BB_FAILED_DIST_CLEANUP_BEFORE_ENCOUNTER
EXIT
ENDIF
ENDIF
ELSE
IF DOES_ENTITY_EXIST(sBailJumperPed.pedIndex)
IF NOT IS_ENTITY_DEAD(sBailJumperPed.pedIndex)
AND NOT IS_PED_INJURED(sBailJumperPed.pedIndex)
// Check for Bail jumper escaped
IF eMissionStage = MISSION_STAGE_CHASE
OR eMissionStage = MISSION_STAGE_TRIGGER_BAIL_JUMPER_REACTION
OR eMissionStage = MISSION_STAGE_TARGET_FLEES_AGAIN
IF NOT IS_ENTITY_IN_RANGE_COORDS(sBailJumperPed.pedIndex, vPlayerPos, BAIL_BONDS_ESCAPED_DISTANCE)
IF IS_ENTITY_OCCLUDED(sBailJumperPed.pedIndex)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "Mission Failed Checks - BB_FAILED_BAIL_JUMPER_ESCAPED") ENDIF #ENDIF
eBB_MissionFailedReason = BB_FAILED_BAIL_JUMPER_ESCAPED
EXIT
ENDIF
ENDIF
// Check for Player leaving surrendered bail jumper behind
ELIF eMissionStage = MISSION_STAGE_TAKE_TARGET_TO_MAUDE
OR eMissionStage = MISSION_STAGE_LOSE_THE_COPS
IF NOT IS_ENTITY_IN_RANGE_COORDS(sBailJumperPed.pedIndex, vPlayerPos, 80.0)
IF IS_ENTITY_OCCLUDED(sBailJumperPed.pedIndex)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "Mission Failed Checks - BB_FAILED_BAIL_JUMPER_ESCAPED - left behind") ENDIF #ENDIF
eBB_MissionFailedReason = BB_FAILED_BAIL_JUMPER_ESCAPED
EXIT
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// cycles through the conditions to see if the player has failed
PROC MISSION_FAILED_CHECKS()
// don't allow mission failed checks during stage skips
IF bFinishedStageSkipping
IF eMissionStage != MISSION_STAGE_MISSION_FAILED_WAIT_FOR_FADE // don't do the checks if we are already in the waiting for fade during fail stage
AND eMissionStage != MISSION_STAGE_CUTSCENE_MAUDE_TAKES_TARGET // B*1477983 - spook somehow occured during cutscene
AND eMissionStage != MISSION_STAGE_MISSION_PASSED // don't do the checks if we are already in mission passed
UPDATE_FAIL_REASON()
IF eBB_MissionFailedReason <> BB_FAILED_DEFAULT
IF eBB_MissionFailedReason = BB_FAILED_DIST_CLEANUP_BEFORE_ENCOUNTER
// set the mission over state for the launcher to use
eBailBondMissionOverState = BBMOS_CLEANUP
Script_Cleanup()
ELSE
SET_STAGE(MISSION_STAGE_MISSION_FAILED_WAIT_FOR_FADE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// cycles through the conditions to see if the player has passed the mission early
PROC CHECK_BAIL_JUMPER_KILLED()
// don't allow mission failed checks during stage skips
IF bFinishedStageSkipping
IF eMissionStage != MISSION_STAGE_MISSION_FAILED_WAIT_FOR_FADE // don't do the checks if we are already in the waiting for fade during fail stage
AND eMissionStage != MISSION_STAGE_CUTSCENE_MAUDE_TAKES_TARGET // B*1477983 - spook somehow occured during cutscene
AND eMissionStage != MISSION_STAGE_MISSION_PASSED // don't do the checks if we are already in mission passed
AND eMissionStage != MISSION_STAGE_MISSION_OVER_BAIL_JUMPER_KILLED // don't do the checks if we are already in mission over for killing bail jumper stage
IF DOES_ENTITY_EXIST(sBailJumperPed.pedIndex)
IF IS_ENTITY_DEAD(sBailJumperPed.pedIndex)
OR IS_PED_INJURED(sBailJumperPed.pedIndex)
SET_STAGE(MISSION_STAGE_MISSION_OVER_BAIL_JUMPER_KILLED)
CPRINTLN(DEBUG_BAIL_BOND, "CHECK_BAIL_JUMPER_KILLED -> MISSION_STAGE_MISSION_OVER_BAIL_JUMPER_KILLED set")
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
//-------------------------------------------------------------------------------------------------------------------------------------------------
// Mission Stages
//-------------------------------------------------------------------------------------------------------------------------------------------------
/// PURPOSE:
/// waiting for the player to get close enough to interact
/// Player might have triggered the mission script but not be aware of the bail jumper
/// So if we cleaned up at this state, it's as if the mission didn't get triggered
PROC STAGE_PLAYER_LOCATE_BAIL_JUMPER()
SWITCH eSubStage
CASE SS_SETUP
IF bFinishedStageSkipping
IF IS_REPEAT_PLAY_ACTIVE()
AND NOT g_bPlayerIsInTaxi // don't fade up whilst in a taxi
SAFE_FADE_SCREEN_IN_FROM_BLACK(DEFAULT_FADE_TIME, FALSE) // backup fade in, NEEDED for repeat play purposes.
CPRINTLN(DEBUG_BAIL_BOND, "STAGE_PLAYER_LOCATE_BAIL_JUMPER - SS_SETUP fade in for repeat play")
ENDIF
ENDIF
// B*1598235 - if the player has skipped a taxi ride to a bail bond - don't start the mission flow until he gets out the cab
IF NOT g_bPlayerIsInTaxi
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "STAGE_PLAYER_LOCATE_BAIL_JUMPER - SS_SETUP done") ENDIF #ENDIF
eSubStage = SS_UPDATE
ELSE
CPRINTLN(DEBUG_BAIL_BOND, "STAGE_PLAYER_LOCATE_BAIL_JUMPER - SS_SETUP waiting for player to leave the taxi")
ENDIF
BREAK
CASE SS_UPDATE
HANDLE_TREVOR_DIALOGUE_FOR_READING_TRIGGER_EMAIL(sBailBondLaunchData, sDialogue)
IF IS_PED_UNINJURED(sBailJumperPed.pedIndex)
UPDATE_PLAYER_CAN_SEE_PED_FRAME_COUNTER(sBailJumperPed.pedIndex, iFrameCountPlayerLastSeenBailJumper, DEFAULT, TT_BODY_PART_HEAD)
UPDATE_PEDS_CAN_SEE_PLAYER_FRAME_COUNTER(sBailJumperPed.pedIndex, sBailJumperPed.iFrameCountLastSeenPlayer)
UPDATE_BAIL_JUMPER_PED_AI()
// check to see when the player detects the bail jumper
IF IS_ENTITY_IN_RANGE_COORDS(sBailJumperPed.pedIndex, vPlayerPos, BAIL_BONDS_RANGE_TO_TARGET_ACTIVE)
AND IS_PLAYER_AT_SAME_HEIGHT_AS_PED(sBailJumperPed.pedIndex, vPlayerPos, 10.0)
// don't shout out to the bail jumper if in stealth mode
IF GET_PED_STEALTH_MOVEMENT(PLAYER_PED_ID())
OR IS_PED_IN_COVER(PLAYER_PED_ID())
// if bail jumper spots him first he shouts out
IF BB_CAN_PED_SEE_PLAYER_THIS_FRAME(sBailJumperPed.iFrameCountLastSeenPlayer)
ePlayerSpotsBailJumperType = BB_PSBJT_BAIL_JUMPER_SPOTS_PLAYER
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "STAGE_PLAYER_LOCATE_BAIL_JUMPER : SS_UPDATE done : player in stealth / cover - bail jumper spotted") ENDIF #ENDIF
eSubStage = SS_CLEANUP
// if he bumps into him spot him
ELIF NOT IS_PED_PERFORMING_STEALTH_KILL(PLAYER_PED_ID())
AND IS_ENTITY_TOUCHING_ENTITY(PLAYER_PED_ID(), sBailJumperPed.pedIndex)
ePlayerSpotsBailJumperType = BB_PSBJT_BAIL_JUMPER_SPOTS_PLAYER
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "STAGE_PLAYER_LOCATE_BAIL_JUMPER : SS_UPDATE done : player in stealth / cover - bail jumper bumped into") ENDIF #ENDIF
eSubStage = SS_CLEANUP
ENDIF
ELSE
// if player can see bail jumper shout out
IF BB_CAN_PLAYER_SEE_PED_WHO_IS_VISIBLE_ON_SCREEN(sBailJumperPed.pedIndex, iFrameCountPlayerLastSeenBailJumper, FALSE)
ePlayerSpotsBailJumperType = BB_PSBJT_PLAYER_SPOTS_BAIL_JUMPER_CLOSE_DISTANCE
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "STAGE_PLAYER_LOCATE_BAIL_JUMPER : SS_UPDATE done : player spotted the bail jumper on screen") ENDIF #ENDIF
eSubStage = SS_CLEANUP
// if player gets really close just shout anyway
ELIF IS_ENTITY_IN_RANGE_COORDS(sBailJumperPed.pedIndex, vPlayerPos, 5.0)
ePlayerSpotsBailJumperType = BB_PSBJT_PLAYER_SPOTS_BAIL_JUMPER_CLOSE_DISTANCE
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "STAGE_PLAYER_LOCATE_BAIL_JUMPER : SS_UPDATE done : player spotted the bail jumper close up") ENDIF #ENDIF
eSubStage = SS_CLEANUP
// if bail jumper spots him first he shouts out
ELIF BB_CAN_PED_SEE_PLAYER_THIS_FRAME(sBailJumperPed.iFrameCountLastSeenPlayer)
// Better chance for player comment to trigger first
IF IS_ENTITY_IN_RANGE_COORDS(sBailJumperPed.pedIndex, vPlayerPos, (BAIL_BONDS_RANGE_TO_TARGET_ACTIVE - 1.5))
ePlayerSpotsBailJumperType = BB_PSBJT_BAIL_JUMPER_SPOTS_PLAYER
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "STAGE_PLAYER_LOCATE_BAIL_JUMPER : SS_UPDATE done : bail jumper spotted player") ENDIF #ENDIF
eSubStage = SS_CLEANUP
ENDIF
ENDIF
ENDIF
ELSE
// targetting him from a distance trigger different dialogue
IF IS_PLAYER_FREE_AIMING_AT_ENTITY(PLAYER_ID(), sBailJumperPed.pedIndex)
OR IS_PLAYER_TARGETTING_ENTITY(PLAYER_ID(), sBailJumperPed.pedIndex)
ePlayerSpotsBailJumperType = BB_PSBJT_PLAYER_SPOTS_BAIL_JUMPER_LONG_DISTANCE
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "STAGE_PLAYER_LOCATE_BAIL_JUMPER : SS_UPDATE done : player spotted the bail jumper from distance") ENDIF #ENDIF
eSubStage = SS_CLEANUP
ENDIF
ENDIF
IF IS_PLAYER_INTIMIDATE_SPECIFIC_PED(sBailJumperPed.pedIndex, sBailJumperPed.iFrameCountLastSeenPlayer, BAIL_BONDS_RANGE_TO_TARGET_ACTIVE) // BAIL_BONDS_INTIMIDATING_DETECTION_RANGE)
ePlayerSpotsBailJumperType = BB_PSBJT_PLAYER_SPOTS_BAIL_JUMPER_INTIMIDATED
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "STAGE_PLAYER_LOCATE_BAIL_JUMPER : SS_UPDATE done : player spotted the bail jumper via intimidated checks") ENDIF #ENDIF
eSubStage = SS_CLEANUP
ENDIF
ENDIF
BREAK
CASE SS_CLEANUP
IF ePlayerSpotsBailJumperType = BB_PSBJT_PLAYER_SPOTS_BAIL_JUMPER_INTIMIDATED
INIT_FLASH_BLIP_AND_TEXT(sBailJumperPed.blipIndex, "", "", iFlashBlipTimer, iFlashBlipGodTextTimer, TRUE, FALSE) // skip over the bail jumper text in this instance (or maybe switch it out for some alternative)
SET_STAGE(MISSION_STAGE_CHASE)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "STAGE_PLAYER_LOCATE_BAIL_JUMPER - SS_CLEANUP done -> MISSION_STAGE_CHASE") ENDIF #ENDIF
ELSE
// if bail jumper spotted the player first kick off his dialogue before player response
IF ePlayerSpotsBailJumperType = BB_PSBJT_BAIL_JUMPER_SPOTS_PLAYER
bDoneDialogue_BailJumperSpotsPlayerFirst = FALSE
IF sBailJumperPed.AI != BB_PED_AI_SETUP_AWARE_OF_PLAYER
AND sBailJumperPed.AI != BB_PED_AI_STATE_AWARE_OF_PLAYER
sBailJumperPed.iAiDelayTimer = (GET_GAME_TIMER() - 50000) //set high to ensure it goes through straight away
sBailJumperPed.AI = BB_PED_AI_SETUP_AWARE_OF_PLAYER
ENDIF
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "STAGE_PLAYER_LOCATE_BAIL_JUMPER : ", "SS_CLEANUP - sBailJumperPed.AI = BB_PED_AI_SETUP_AWARE_OF_PLAYER") ENDIF #ENDIF
ENDIF
SET_STAGE(MISSION_STAGE_TRIGGER_BAIL_JUMPER_REACTION)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "STAGE_PLAYER_LOCATE_BAIL_JUMPER - SS_CLEANUP done -> MISSION_STAGE_TRIGGER_BAIL_JUMPER_REACTION") ENDIF #ENDIF
ENDIF
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE:
/// player closer to the target, waiting for him to interact
PROC STAGE_TRIGGER_BAIL_JUMPER_REACTION()
IF IS_PED_UNINJURED(sBailJumperPed.pedIndex)
UPDATE_PLAYER_CAN_SEE_PED_FRAME_COUNTER(sBailJumperPed.pedIndex, iFrameCountPlayerLastSeenBailJumper, DEFAULT, TT_BODY_PART_HEAD)
UPDATE_PEDS_CAN_SEE_PLAYER_FRAME_COUNTER(sBailJumperPed.pedIndex, sBailJumperPed.iFrameCountLastSeenPlayer)
UPDATE_BAIL_JUMPER_PED_AI()
SWITCH eSubStage
CASE SS_SETUP
IF NOT DOES_BLIP_EXIST(sBailJumperPed.blipIndex)
sBailJumperPed.blipIndex = CREATE_PED_BLIP(sBailJumperPed.pedIndex, TRUE, FALSE)
ENDIF
INIT_FLASH_BLIP_AND_TEXT(sBailJumperPed.blipIndex, "", "", iFlashBlipTimer, iFlashBlipGodTextTimer, TRUE, FALSE) // skip over the bail jumper text in this instance (or maybe switch it out for some alternative)
eSubStage = SS_UPDATE
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "STAGE_TRIGGER_BAIL_JUMPER_REACTION : ", "SS_SETUP - done") ENDIF #ENDIF
BREAK
CASE SS_UPDATE
SWITCH ePlayerSpotsBailJumperType
CASE BB_PSBJT_PLAYER_SPOTS_BAIL_JUMPER_LONG_DISTANCE
IF NOT bDoneDialogue_PlayerSpotsBailJumperFromDistance
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDIF
IF BB_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sCommonTextBlock, "BBC_T14", CONV_PRIORITY_AMBIENT_HIGH)
// RANDOM SELECTED LINE
// Well look who it is.
// There's the fucker.
// That looks like the bastard.
sBailJumperPed.iTimer = GET_GAME_TIMER()
bDoneDialogue_PlayerSpotsBailJumperFromDistance = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "STAGE_TRIGGER_BAIL_JUMPER_REACTION : ", "SS_UPDATE - bDoneDialogue_PlayerSpotsBailJumperFromDistance") ENDIF #ENDIF
ENDIF
FLASH_BLIP_AND_TEXT(sBailJumperPed.blipIndex, "", "", iFlashBlipTimer, iFlashBlipGodTextTimer, FALSE)
ELIF NOT bDoneObjective_ApprehendBailJumper
IF NOT IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("BBC_T14") // bDoneDialogue_PlayerSpotsBailJumperFromDistance
INIT_FLASH_BLIP_AND_TEXT(sBailJumperPed.blipIndex, "BBS_APHEND", "BBS_APHEND2", iFlashBlipTimer, iFlashBlipGodTextTimer, TRUE, TRUE) // Apprehend the ~r~bail jumper. // Apprehend the ~b~bail jumper.
bDoneObjective_ApprehendBailJumper = TRUE
ENDIF
ELSE
FLASH_BLIP_AND_TEXT(sBailJumperPed.blipIndex, "BBS_APHEND", "BBS_APHEND2", iFlashBlipTimer, iFlashBlipGodTextTimer)
// check to see when the player interacts with the bail jumper
IF IS_ENTITY_IN_RANGE_COORDS(sBailJumperPed.pedIndex, vPlayerPos, BAIL_BONDS_RANGE_TO_TARGET_ACTIVE)
AND IS_PLAYER_AT_SAME_HEIGHT_AS_PED(sBailJumperPed.pedIndex, vPlayerPos, 10.0)
// don't shout out to the bail jumper if in stealth mode
IF GET_PED_STEALTH_MOVEMENT(PLAYER_PED_ID())
OR IS_PED_IN_COVER(PLAYER_PED_ID())
// if bail jumper spots him first he shouts out
IF BB_CAN_PED_SEE_PLAYER_THIS_FRAME(sBailJumperPed.iFrameCountLastSeenPlayer)
ePlayerSpotsBailJumperType = BB_PSBJT_BAIL_JUMPER_SPOTS_PLAYER
bDoneDialogue_BailJumperSpotsPlayerFirst = FALSE
IF sBailJumperPed.AI != BB_PED_AI_SETUP_AWARE_OF_PLAYER
AND sBailJumperPed.AI != BB_PED_AI_STATE_AWARE_OF_PLAYER
sBailJumperPed.iAiDelayTimer = (GET_GAME_TIMER() - 50000) //set high to ensure it goes through straight away
sBailJumperPed.AI = BB_PED_AI_SETUP_AWARE_OF_PLAYER
ENDIF
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "STAGE_TRIGGER_BAIL_JUMPER_REACTION : SS_UPDATE done : player in stealth / cover - bail jumper spotted") ENDIF #ENDIF
// if he bumps into him spot him
ELIF NOT IS_PED_PERFORMING_STEALTH_KILL(PLAYER_PED_ID())
AND IS_ENTITY_TOUCHING_ENTITY(PLAYER_PED_ID(), sBailJumperPed.pedIndex)
ePlayerSpotsBailJumperType = BB_PSBJT_BAIL_JUMPER_SPOTS_PLAYER
bDoneDialogue_BailJumperSpotsPlayerFirst = FALSE
IF sBailJumperPed.AI != BB_PED_AI_SETUP_AWARE_OF_PLAYER
AND sBailJumperPed.AI != BB_PED_AI_STATE_AWARE_OF_PLAYER
sBailJumperPed.iAiDelayTimer = (GET_GAME_TIMER() - 50000) //set high to ensure it goes through straight away
sBailJumperPed.AI = BB_PED_AI_SETUP_AWARE_OF_PLAYER
ENDIF
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "STAGE_TRIGGER_BAIL_JUMPER_REACTION : SS_UPDATE done : player in stealth / cover - bail jumper bumped into") ENDIF #ENDIF
ENDIF
ELSE
// if player can see bail jumper shout out
IF BB_CAN_PLAYER_SEE_PED_WHO_IS_VISIBLE_ON_SCREEN(sBailJumperPed.pedIndex, iFrameCountPlayerLastSeenBailJumper, FALSE)
ePlayerSpotsBailJumperType = BB_PSBJT_PLAYER_SPOTS_BAIL_JUMPER_CLOSE_DISTANCE
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "STAGE_TRIGGER_BAIL_JUMPER_REACTION : SS_UPDATE done : player spotted the bail jumper on screen") ENDIF #ENDIF
// if player gets really close just shout anyway
ELIF IS_ENTITY_IN_RANGE_COORDS(sBailJumperPed.pedIndex, vPlayerPos, 5.0)
ePlayerSpotsBailJumperType = BB_PSBJT_PLAYER_SPOTS_BAIL_JUMPER_CLOSE_DISTANCE
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "STAGE_TRIGGER_BAIL_JUMPER_REACTION : SS_UPDATE done : player spotted the bail jumper close up") ENDIF #ENDIF
// if bail jumper spots him first he shouts out
ELIF BB_CAN_PED_SEE_PLAYER_THIS_FRAME(sBailJumperPed.iFrameCountLastSeenPlayer)
// Better chance for player comment to trigger first
IF IS_ENTITY_IN_RANGE_COORDS(sBailJumperPed.pedIndex, vPlayerPos, (BAIL_BONDS_RANGE_TO_TARGET_ACTIVE - 1.5))
ePlayerSpotsBailJumperType = BB_PSBJT_BAIL_JUMPER_SPOTS_PLAYER
bDoneDialogue_BailJumperSpotsPlayerFirst = FALSE
IF sBailJumperPed.AI != BB_PED_AI_SETUP_AWARE_OF_PLAYER
AND sBailJumperPed.AI != BB_PED_AI_STATE_AWARE_OF_PLAYER
sBailJumperPed.iAiDelayTimer = (GET_GAME_TIMER() - 50000) //set high to ensure it goes through straight away
sBailJumperPed.AI = BB_PED_AI_SETUP_AWARE_OF_PLAYER
ENDIF
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "STAGE_TRIGGER_BAIL_JUMPER_REACTION : SS_UPDATE done : bail jumper spotted player") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF IS_PLAYER_INTIMIDATE_SPECIFIC_PED(sBailJumperPed.pedIndex, sBailJumperPed.iFrameCountLastSeenPlayer, BAIL_BONDS_INTIMIDATING_DETECTION_RANGE)
eSubStage = SS_CLEANUP
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "STAGE_TRIGGER_BAIL_JUMPER_REACTION : SS_UPDATE ", "BB_PSBJT_PLAYER_SPOTS_BAIL_JUMPER_LONG_DISTANCE done") ENDIF #ENDIF
ENDIF
BREAK
CASE BB_PSBJT_PLAYER_SPOTS_BAIL_JUMPER_CLOSE_DISTANCE
FALLTHRU
CASE BB_PSBJT_BAIL_JUMPER_SPOTS_PLAYER
IF NOT bDoneDialogue_BailJumperSpotsPlayerFirst
// do dialogue then objective
IF IS_THIS_PRINT_BEING_DISPLAYED("BBS_APHEND") // Apprehend the ~r~bail jumper.
OR IS_THIS_PRINT_BEING_DISPLAYED("BBS_APHEND2") // Apprehend the ~b~bail jumper.
CLEAR_PRINTS()
ENDIF
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDIF
IF BB_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sMissionTextBlock, "BB1_J2", CONV_PRIORITY_AMBIENT_HIGH)
// RANDOM SELECTED LINE
// Who the hell are you?
// Can I help you?
// Do you work here?
// What are you doing here?
sBailJumperPed.iTimer = GET_GAME_TIMER()
iDialogueTimer = GET_GAME_TIMER()
bDoneDialogue_BailJumperSpotsPlayerFirst = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "STAGE_TRIGGER_BAIL_JUMPER_REACTION : ", "SS_UPDATE - bDoneDialogue_BailJumperSpotsPlayerFirst, FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
FLASH_BLIP_AND_TEXT(sBailJumperPed.blipIndex, "", "", iFlashBlipTimer, iFlashBlipGodTextTimer, FALSE)
ELIF NOT bDoneDialogue_PlayerSpotsBailJumperCloseDistance
IF NOT IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("BBC_T14") // bDoneDialogue_PlayerSpotsBailJumperFromDistance
AND NOT IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("BB1_J2") // bDoneDialogue_BailJumperSpotsPlayerFirst
// do dialogue then objective
IF IS_THIS_PRINT_BEING_DISPLAYED("BBS_APHEND") // Apprehend the ~r~bail jumper.
OR IS_THIS_PRINT_BEING_DISPLAYED("BBS_APHEND2") // Apprehend the ~b~bail jumper.
CLEAR_PRINTS()
ENDIF
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDIF
IF BB_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sCommonTextBlock, "BBC_T1", CONV_PRIORITY_AMBIENT_HIGH)
// RANDOM SELECTED LINE
// Hey punk, you're coming with me!
// There's a bounty on your head, and it's mine!
// Let's do this the easy way, the hard ends with you on my boot!
// Be a good little convict and come with me!
// Hands where I can see them!
// Dead or alive you're coming with me!
sBailJumperPed.iTimer = GET_GAME_TIMER()
bDoneDialogue_PlayerSpotsBailJumperCloseDistance = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "STAGE_TRIGGER_BAIL_JUMPER_REACTION : ", "SS_UPDATE - bDoneDialogue_PlayerSpotsBailJumperCloseDistance, FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ELSE
// B*1462370 - took Trevor ages to reply because his veh was flipped over
IF ePlayerSpotsBailJumperType = BB_PSBJT_BAIL_JUMPER_SPOTS_PLAYER // only do if bail jumper spoke first otherwise it could get skipped over!
IF HAS_TIME_PASSED(iDialogueTimer, 1250)
sBailJumperPed.iTimer = (GET_GAME_TIMER() - 3000) // ensure task goes straight through in this instance
bDoneDialogue_PlayerSpotsBailJumperCloseDistance = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "STAGE_TRIGGER_BAIL_JUMPER_REACTION : ", "SS_UPDATE - bDoneDialogue_PlayerSpotsBailJumperCloseDistance skipped time out, FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ELSE
iDialogueTimer = GET_GAME_TIMER()
ENDIF
FLASH_BLIP_AND_TEXT(sBailJumperPed.blipIndex, "", "", iFlashBlipTimer, iFlashBlipGodTextTimer, FALSE)
ELSE
IF sBailJumperPed.AI != BB_PED_AI_SETUP_AWARE_OF_PLAYER
AND sBailJumperPed.AI != BB_PED_AI_STATE_AWARE_OF_PLAYER
IF HAS_TIME_PASSED(sBailJumperPed.iTimer, 500)
sBailJumperPed.iAiDelayTimer = GET_GAME_TIMER()
sBailJumperPed.AI = BB_PED_AI_SETUP_AWARE_OF_PLAYER
eSubStage = SS_CLEANUP
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "STAGE_TRIGGER_BAIL_JUMPER_REACTION : ", "SS_UPDATE - sBailJumperPed.AI = BB_PED_AI_SETUP_AWARE_OF_PLAYER") ENDIF #ENDIF
ENDIF
ELSE
eSubStage = SS_CLEANUP
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "STAGE_TRIGGER_BAIL_JUMPER_REACTION : SS_UPDATE ", "BB_PSBJT_PLAYER_SPOTS_BAIL_JUMPER_CLOSE_DISTANCE done") ENDIF #ENDIF
ENDIF
ENDIF
IF IS_PLAYER_INTIMIDATE_SPECIFIC_PED(sBailJumperPed.pedIndex, sBailJumperPed.iFrameCountLastSeenPlayer, BAIL_BONDS_INTIMIDATING_DETECTION_RANGE)
eSubStage = SS_CLEANUP
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "STAGE_TRIGGER_BAIL_JUMPER_REACTION : ", "BAIL_JUMPER_SHOULD_REACT_EARLY returned true so heading the SS_CLEANUP") ENDIF #ENDIF
ENDIF
BREAK
CASE BB_PSBJT_PLAYER_SPOTS_BAIL_JUMPER_INTIMIDATED
FLASH_BLIP_AND_TEXT(sBailJumperPed.blipIndex, "", "", iFlashBlipTimer, iFlashBlipGodTextTimer, FALSE)
eSubStage = SS_CLEANUP
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "STAGE_TRIGGER_BAIL_JUMPER_REACTION : SS_UPDATE ", "BB_PSBJT_PLAYER_SPOTS_BAIL_JUMPER_INTIMIDATED done") ENDIF #ENDIF
BREAK
ENDSWITCH
BREAK
CASE SS_CLEANUP
IF sBailJumperPed.AI != BB_PED_AI_SETUP_AWARE_OF_PLAYER
AND sBailJumperPed.AI != BB_PED_AI_STATE_AWARE_OF_PLAYER
sBailJumperPed.iAiDelayTimer = (GET_GAME_TIMER() - 50000) //set high to ensure it goes through straight away
sBailJumperPed.AI = BB_PED_AI_SETUP_AWARE_OF_PLAYER
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "STAGE_TRIGGER_BAIL_JUMPER_REACTION : ", "SS_CLEANUP - sBailJumperPed.AI = BB_PED_AI_SETUP_AWARE_OF_PLAYER") ENDIF #ENDIF
ENDIF
sBailJumperPed.iTimer = GET_GAME_TIMER()
IF IS_THIS_PRINT_BEING_DISPLAYED("BBS_APHEND") // Apprehend the ~r~bail jumper. // Apprehend the ~b~bail jumper.
OR IS_THIS_PRINT_BEING_DISPLAYED("BBS_APHEND2") // Apprehend the ~b~bail jumper.
CLEAR_PRINTS()
ENDIF
FLASH_BLIP_AND_TEXT(sBailJumperPed.blipIndex, "", "", iFlashBlipTimer, iFlashBlipGodTextTimer, FALSE)
iFlashBlipTimer = GET_GAME_TIMER()
iFlashBlipGodTextTimer = GET_GAME_TIMER()
SET_STAGE(MISSION_STAGE_CHASE)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "STAGE_TRIGGER_BAIL_JUMPER_REACTION : ", "SS_CLEANUP - done") ENDIF #ENDIF
BREAK
ENDSWITCH
ENDIF
ENDPROC
PROC STAGE_CHASE()
BOOL bStopFleeingIfPlayerClose = FALSE
IF IS_PED_UNINJURED(sBailJumperPed.pedIndex)
UPDATE_PLAYER_CAN_SEE_PED_FRAME_COUNTER(sBailJumperPed.pedIndex, iFrameCountPlayerLastSeenBailJumper)
UPDATE_PEDS_CAN_SEE_PLAYER_FRAME_COUNTER(sBailJumperPed.pedIndex, sBailJumperPed.iFrameCountLastSeenPlayer)
UPDATE_BAIL_JUMPER_PED_AI()
SWITCH eSubStage
CASE SS_SETUP
IF sBailJumperPed.AI != BB_PED_AI_SETUP_FLEE_TO_VEHICLE
AND sBailJumperPed.AI != BB_PED_AI_STATE_FLEE_TO_VEHICLE
sBailJumperPed.iAiDelayTimer = GET_GAME_TIMER()
sBailJumperPed.AI = BB_PED_AI_SETUP_FLEE_TO_VEHICLE
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "STAGE_CHASE : ", "SS_SETUP - sBailJumperPed.AI = BB_PED_AI_SETUP_AWARE_OF_PLAYER") ENDIF #ENDIF
ENDIF
IF IS_PED_UNINJURED(sBailJumperPed.pedIndex)
IF NOT DOES_BLIP_EXIST(sBailJumperPed.blipIndex)
sBailJumperPed.blipIndex = CREATE_PED_BLIP(sBailJumperPed.pedIndex, TRUE, FALSE)
ENDIF
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(sBailJumperPed.pedIndex)
ENDIF
SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_DRIVING)
FLASH_BLIP_AND_TEXT(sBailJumperPed.blipIndex, "", "", iFlashBlipTimer, iFlashBlipGodTextTimer, FALSE)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "STAGE_CHASE : ", "SS_SETUP - done") ENDIF #ENDIF
eSubStage = SS_UPDATE
BREAK
CASE SS_UPDATE
IF NOT bHasBailJumperSurrendered
FLASH_BLIP_AND_TEXT(sBailJumperPed.blipIndex, "", "", iFlashBlipTimer, iFlashBlipGodTextTimer, FALSE)
CONTROL_PED_CHASE_HINT_CAM_IN_VEHICLE(localChaseHintCamStruct, sBailJumperPed.pedIndex)
// Flee on foot it the player gets in the escape vehicle or it gets wrecked
IF sBailJumperPed.AI = BB_PED_AI_SETUP_FLEE_ON_FOOT
OR sBailJumperPed.AI = BB_PED_AI_STATE_FLEE_ON_FOOT
IF iTime_BailJumperStartedFleeingOnFoot = -1 // if this hasn't been set yet, start the timer
iTime_BailJumperStartedFleeingOnFoot = GET_GAME_TIMER()
ENDIF
IF iDelay_SurrenderForPlayerCloseToWhileFleeing = -1 // if this hasn't been set yet, start the timer
iDelay_SurrenderForPlayerCloseToWhileFleeing = GET_GAME_TIMER()
ELIF HAS_TIME_PASSED(iDelay_SurrenderForPlayerCloseToWhileFleeing, 5000) // don't surrender if player is close by initially (give him chance to run)
bStopFleeingIfPlayerClose = TRUE
ENDIF
IF SHOULD_PED_SURENDER_ONFOOT(sBailJumperPed.pedIndex, vPlayerPos, bStopFleeingIfPlayerClose)
SET_BAIL_JUMPER_SURRENDERED()
sBailJumperPed.iTimer = GET_GAME_TIMER()
KILL_CHASE_HINT_CAM(localChaseHintCamStruct)
bHasBailJumperSurrendered = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "STAGE_CHASE : ", "SS_UPDATE - surrender on foot") ENDIF #ENDIF
ELSE
// additional dialogue during on foot chase
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF HAS_TIME_PASSED(iDialogueTimer, GET_RANDOM_INT_IN_RANGE(5000, 12000))
IF IS_ENTITY_IN_RANGE_COORDS(sBailJumperPed.pedIndex, vPlayerPos, DIST_LIMIT_PLAYER_TO_PED_FOR_DIALOGUE)
IF IS_PED_FLEEING(sBailJumperPed.pedIndex)
IF (GET_RANDOM_INT_IN_RANGE(0, 101) < 30)
IF BB_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sCommonTextBlock, "BBC_T13", CONV_PRIORITY_AMBIENT_HIGH)
// RANDOM SELECTED LINE
// I'm going to catch you, fucker!
// You can't out run a mad man!
// Trevor's going to hunt you down!
iDialogueTimer = GET_GAME_TIMER()
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "STAGE_CHASE : ", "SS_UPDATE - trigger on foot flee dialogue : BBC_T13") ENDIF #ENDIF
ENDIF
ELSE
IF BB_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sMissionTextBlock, "BB1_FLEE", CONV_PRIORITY_AMBIENT_HIGH)
// RANDOM SELECTED LINE
// I'm not going down!
// I'm innocent!
// You've got the wrong guy!
// Leave me alone!
// I want to see some credentials!
iDialogueTimer = GET_GAME_TIMER()
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "STAGE_CHASE : ", "SS_UPDATE - trigger on foot flee dialogue : BB1_FLEE") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
iDialogueTimer = GET_GAME_TIMER()
ENDIF
UPDATE_PED_ON_FOOT_SPEED_FOR_CHASING_PLAYER(sBailJumperPed.pedIndex, vPlayerPos, iTime_BailJumperStartedFleeingOnFoot)
ENDIF
ELSE
// heading to the vehicle
IF sBailJumperPed.AI = BB_PED_AI_SETUP_FLEE_TO_VEHICLE
OR sBailJumperPed.AI = BB_PED_AI_STATE_FLEE_TO_VEHICLE
IF NOT bDoneDialogue_BailJumperBeginsToFlee
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF IS_ENTITY_IN_RANGE_COORDS(sBailJumperPed.pedIndex, vPlayerPos, DIST_LIMIT_PLAYER_TO_PED_FOR_DIALOGUE)
IF BB_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sMissionTextBlock, sDialogue_BailJumperBeginChase, CONV_PRIORITY_AMBIENT_HIGH)
sBailJumperPed.iTimer = GET_GAME_TIMER()
iDialogueTimer = GET_GAME_TIMER()
bDoneDialogue_BailJumperBeginsToFlee = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "STAGE_CHASE : ", "bDoneDialogue_BailJumperBeginsToFlee") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
// B*1316512 - allow surrender on foot checks for running to the car
IF SHOULD_PED_SURENDER_ONFOOT(sBailJumperPed.pedIndex, vPlayerPos, bStopFleeingIfPlayerClose)
SET_BAIL_JUMPER_SURRENDERED()
sBailJumperPed.iTimer = GET_GAME_TIMER()
KILL_CHASE_HINT_CAM(localChaseHintCamStruct)
bHasBailJumperSurrendered = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "STAGE_CHASE : ", "SS_UPDATE - surrender on foot - whilst getting to his car") ENDIF #ENDIF
ENDIF
ENDIF
// fleeing in the vehicle
IF IS_VEHICLE_OK(sMissionVehicle[0].index)
IF sBailJumperPed.AI = BB_PED_AI_STATE_TEMP_OVERRIDE_AI_CONTROL
OR sBailJumperPed.AI = BB_PED_AI_SETUP_FLEE_IN_VEHICLE
OR sBailJumperPed.AI = BB_PED_AI_STATE_FLEE_IN_VEHICLE
IF SHOULD_PED_SURRENDER_VEHICLE(sBailJumperPed.pedIndex, sMissionVehicle[0].index, iTimer_BailJumperVehicleStopped)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "STAGE_CHASE : ", " ENEMY VEHICLE HEALTH = ", GET_ENTITY_HEALTH(sMissionVehicle[0].index)) ENDIF #ENDIF
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
SET_BAIL_JUMPER_SURRENDERED()
sBailJumperPed.iTimer = GET_GAME_TIMER()
KILL_CHASE_HINT_CAM(localChaseHintCamStruct)
bHasBailJumperSurrendered = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "STAGE_CHASE : ", "surrender in vehicle") ENDIF #ENDIF
ENDIF
ELSE
IF PROGRESS_VEHICLE_ROUTE(sBailJumperPed.pedIndex, sMissionVehicle[0].index, sMissionVehicle[0].model, vChaseRoute, iChaseIndex, iNumChaseRoutePositions)
IF sBailJumperPed.AI = BB_PED_AI_STATE_TEMP_OVERRIDE_AI_CONTROL
sBailJumperPed.AI = BB_PED_AI_SETUP_FLEE_IN_VEHICLE
ENDIF
ENDIF
UPDATE_CHASE_BLIP(sBailJumperPed.blipIndex, sBailJumperPed.pedIndex, BAIL_BONDS_ESCAPED_DISTANCE, BAIL_BONDS_CHASE_BLIP_FLASH_PERCENTAGE)
UPDATE_VEHICLE_SPEED_FOR_CHASING_PLAYER(sBailJumperPed.pedIndex, sMissionVehicle[0].index, vPlayerPos)
ENDIF
ENDIF
ELSE
SET_BAIL_JUMPER_SURRENDERED()
sBailJumperPed.iTimer = GET_GAME_TIMER()
KILL_CHASE_HINT_CAM(localChaseHintCamStruct)
bHasBailJumperSurrendered = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "STAGE_CHASE : ", "SS_UPDATE - early exit vehicle not ok") ENDIF #ENDIF
ENDIF
ENDIF
ELSE
SET_BAIL_JUMPER_SURRENDERED()
IF NOT IS_ENTITY_IN_RANGE_COORDS(sBailJumperPed.pedIndex, vPlayerPos, 10.0)
IF NOT bDoneObjective_ApproachBailJumper
IF NOT IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING(sDialogueRoot_BailJumperSurrenders)
INIT_FLASH_BLIP_AND_TEXT(sBailJumperPed.blipIndex, "BBS_APPSUS", "BBS_APPSUS2", iFlashBlipTimer, iFlashBlipGodTextTimer, TRUE, TRUE) // Approach the ~r~bail jumper. // Approach the ~b~bail jumper.
bDoneObjective_ApproachBailJumper = TRUE
ENDIF
ELSE
FLASH_BLIP_AND_TEXT(sBailJumperPed.blipIndex, "BBS_APPSUS", "BBS_APPSUS2", iFlashBlipTimer, iFlashBlipGodTextTimer) // Approach the ~r~bail jumper. // Approach the ~b~bail jumper.
ENDIF
ELSE
IF NOT bDoneDialogue_BailJumperSurrendered
IF NOT IS_PED_RAGDOLL(sBailJumperPed.pedIndex)
AND NOT IS_PED_IN_ANY_VEHICLE(sBailJumperPed.pedIndex)
IF IS_THIS_PRINT_BEING_DISPLAYED("BBS_APPSUS") // Approach the ~r~bail jumper.
OR IS_THIS_PRINT_BEING_DISPLAYED("BBS_APPSUS2") // Approach the ~b~bail jumper.
CLEAR_PRINTS()
ENDIF
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDIF
IF BB_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sMissionTextBlock, sDialogueRoot_BailJumperSurrenders, CONV_PRIORITY_AMBIENT_HIGH)
// God damn it!
// Don't shoot, am sorry for running!
// Oh for fuck sake!
bDoneDialogue_BailJumperSurrendered = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "STAGE_CHASE : ", "bDoneDialogue_BailJumperSurrendered - done") ENDIF #ENDIF
ENDIF
ENDIF
ELSE
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
eSubStage = SS_CLEANUP
ENDIF
ENDIF
FLASH_BLIP_AND_TEXT(sBailJumperPed.blipIndex, "", "", iFlashBlipTimer, iFlashBlipGodTextTimer, FALSE)
ENDIF
IF SHOULD_BAIL_JUMPER_REVERT_BACK_TO_FLEE(sBailJumperPed.pedIndex)
bIsJumperRevertingBackToFlee = TRUE
eSubStage = SS_CLEANUP
ENDIF
ENDIF
BREAK
CASE SS_CLEANUP
IF IS_THIS_PRINT_BEING_DISPLAYED("BBS_APPSUS") // Approach the ~r~bail jumper.
OR IS_THIS_PRINT_BEING_DISPLAYED("BBS_APPSUS2") // Approach the ~b~bail jumper.
CLEAR_PRINTS()
ENDIF
SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_NONE)
bDoneDialogue_BailJumperSurrendered = TRUE // mark this up as completed as it is used to stop Bail jumper switching to follow behaviour
CLEAR_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, RELGROUPHASH_PLAYER, HASH_BAILBOND_TARGET)
CLEAR_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, HASH_BAILBOND_TARGET, RELGROUPHASH_PLAYER)
SAFE_REMOVE_BLIP(sBailJumperPed.blipIndex)
SET_BAIL_JUMPER_SURRENDERED()
sBailJumperPed.iTimer = GET_GAME_TIMER()
KILL_CHASE_HINT_CAM(localChaseHintCamStruct)
// proc from initial scene so they match up
SETUP_MAUDES_FOR_DROPOFF(TRUE, ScenarioBlockArea_CutsceneMaude)
IF bIsJumperRevertingBackToFlee
SET_STAGE(MISSION_STAGE_TARGET_FLEES_AGAIN)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "STAGE_CHASE : ", "SS_CLEANUP -> MISSION_STAGE_TARGET_FLEES_AGAIN") ENDIF #ENDIF
ELSE
SET_STAGE(MISSION_STAGE_TAKE_TARGET_TO_MAUDE)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "STAGE_CHASE : ", "SS_CLEANUP - done") ENDIF #ENDIF
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDPROC
PROC STAGE_TAKE_TARGET_TO_MAUDE()
CREATE_AND_SETUP_MAUDE()
MANAGE_OUTRO_MOCAP_LOADING()
IF IS_PED_UNINJURED(sBailJumperPed.pedIndex)
UPDATE_PLAYER_CAN_SEE_PED_FRAME_COUNTER(sBailJumperPed.pedIndex, iFrameCountPlayerLastSeenBailJumper)
UPDATE_PEDS_CAN_SEE_PLAYER_FRAME_COUNTER(sBailJumperPed.pedIndex, sBailJumperPed.iFrameCountLastSeenPlayer)
UPDATE_BAIL_JUMPER_PED_AI()
SWITCH eSubStage
CASE SS_SETUP
eSubStage = SS_UPDATE
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "MISSION_STAGE_TAKE_TARGET_TO_MAUDE : ", "SS_SETUP - done") ENDIF #ENDIF
BREAK
CASE SS_UPDATE
IF NOT bHasPlayerLeftBailJumperBehind
IF IS_THIS_PRINT_BEING_DISPLAYED("BBS_05")
CLEAR_THIS_PRINT("BBS_05") // Return to the ~b~bail jumper.~s~
ENDIF
SAFE_REMOVE_BLIP(sBailJumperPed.blipIndex)
// check if the player has left the bail jumper behind
IF NOT IS_ENTITY_IN_RANGE_COORDS(sBailJumperPed.pedIndex, vPlayerPos, LEAVE_PLAYER_GROUP_DISTANCE)
// only switch states if he's following you at the time
IF sBailJumperPed.AI = BB_PED_AI_SETUP_FOLLOW_PLAYER
OR sBailJumperPed.AI = BB_PED_AI_STATE_FOLLOW_PLAYER
sBailJumperPed.iAiDelayTimer = GET_GAME_TIMER()
sBailJumperPed.AI = BB_PED_AI_SETUP_PLAYER_LEFT_BEHIND
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "MISSION_STAGE_TAKE_TARGET_TO_MAUDE : ", "SS_SETUP - sBailJumperPed.AI = BB_PED_AI_SETUP_PLAYER_LEFT_BEHIND") ENDIF #ENDIF
ENDIF
// Comment when the bail jumper is out of range of Trevor
IF HAS_FRAME_COUNTER_PASSED(iFrameCountPlayerLastSeenBailJumper, CAN_PED_SEE_PED_FRAME_COUNT_GRACE_PERIOD)
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT HAS_FRAME_COUNTER_PASSED(iFrameCountPlayerLastSeenBailJumper, CAN_PED_SEE_PED_FRAME_COUNT_GRACE_PERIOD) // only comment if Trev can't see him
IF BB_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sCommonTextBlock, "BBC_T9", CONV_PRIORITY_AMBIENT_HIGH)
// Shit, where did he go?
// What the fuck, where is he?
// Fuck, did I just lose him?
iDialogueTimer = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
ENDIF
bDoneDialogue_TrevorResponsesToBailJumperSurrendering = TRUE// skip this dialogue if we are going straight to left bail jumper behind state
bHasPlayerLeftBailJumperBehind = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "MISSION_STAGE_TAKE_TARGET_TO_MAUDE - Bail Jumper removed from Player group") ENDIF #ENDIF
ELSE
// player must lose their wanted level before handing bail jumper over to Maude
IF IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
//Don't allow the wanted level to drop this frame, as we need it to test in the cleanup
SUPPRESS_LOSING_WANTED_LEVEL_IF_HIDDEN_THIS_FRAME(PLAYER_ID())
bDoneDialogue_TrevorResponsesToBailJumperSurrendering = TRUE// skip this dialogue if we are going straight to left bail jumper behind state
eSubStage = SS_CLEANUP
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "STAGE_TAKE_TARGET_TO_MAUDE : ", "SS_UPDATE - player has a wanted level") ENDIF #ENDIF
ELSE
IF NOT DOES_BLIP_EXIST(blipIndexMaudesPlace)
IF bDoneObjective_TakeBailJumperToMaude
blipIndexMaudesPlace = CREATE_COORD_BLIP(vMaudePlace)
ENDIF
ENDIF
IF NOT bDoneDialogue_TrevorResponsesToBailJumperSurrendering
IF NOT IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING(sDialogueRoot_BailJumperSurrenders)
IF BB_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sCommonTextBlock, "BBC_T5", CONV_PRIORITY_AMBIENT_HIGH)
// Random dialogue line from -
// Correct decision, you're coming with me now.
// Damn right, come with me before I take your legs off.
// You're my bitch, now heel.
bDoneDialogue_TrevorResponsesToBailJumperSurrendering = TRUE
ENDIF
ENDIF
ELIF NOT bDoneObjective_TakeBailJumperToMaude
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
PRINT_NOW("BBS_DROP", DEFAULT_GOD_TEXT_TIME, 0) // Take the bail jumper to ~y~Maude's place.
iDialogueTimer = GET_GAME_TIMER()
bDoneObjective_TakeBailJumperToMaude = TRUE
ENDIF
ELSE
HANDLE_DIALOGUE_DURING_DROPOFF()
TRIGGER_AMBIENT_MAUDE_DIALOGUE_FOR_PLAYER_APPROACH_WITH_JUMPER(sMaude.index, vPlayerPos, iDialogueTimer_MaudeAmbient)
ENDIF
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), vMaudePlace, << 4.0, 4.0, LOCATE_SIZE_HEIGHT >>, TRUE) // used to display locate for dropoff - LOCATE_SIZE_ANY_MEANS for x and y but Les Bug * 1078339
ENDIF
// inner area covering the area where Maude is
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<2732.815186,4143.618164,42.028221>>, <<2724.603027,4144.802734,46.330837>>, 9.000000)
eSubStage = SS_CLEANUP
ENDIF
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF IS_ENTITY_IN_RANGE_COORDS(PLAYER_PED_ID(), vMaudePlace, 6.5) // Reduced activation range for B*1163584
eSubStage = SS_CLEANUP
ENDIF
ELSE
IF IS_ENTITY_IN_RANGE_COORDS(PLAYER_PED_ID(), vMaudePlace, 2.5)
eSubStage = SS_CLEANUP
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
SAFE_REMOVE_BLIP(blipIndexMaudesPlace)
IF IS_THIS_PRINT_BEING_DISPLAYED("BBS_DROP")
CLEAR_THIS_PRINT("BBS_DROP") // Take the bail jumper to ~y~Maude's place.
ENDIF
// check to see if the player has returned to the bail jumper
IF IS_ENTITY_IN_RANGE_COORDS(sBailJumperPed.pedIndex, vPlayerPos, REJOIN_PLAYER_GROUP_DISTANCE)
// only make him rejoin if he was in left behind state
IF sBailJumperPed.AI = BB_PED_AI_SETUP_PLAYER_LEFT_BEHIND
OR sBailJumperPed.AI = BB_PED_AI_STATE_PLAYER_LEFT_BEHIND
sBailJumperPed.iAiDelayTimer = GET_GAME_TIMER()
sBailJumperPed.AI = BB_PED_AI_SETUP_FOLLOW_PLAYER
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "MISSION_STAGE_TAKE_TARGET_TO_MAUDE : ", "SS_SETUP - sBailJumperPed.AI = BB_PED_AI_SETUP_FOLLOW_PLAYER") ENDIF #ENDIF
ENDIF
IF IS_THIS_PRINT_BEING_DISPLAYED("BBS_05")
CLEAR_THIS_PRINT("BBS_05") // Return to the ~b~bail jumper.~s~
ENDIF
// Comment when the bail jumper is back in range of Trevor and he's returning to follow behaviour
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF sBailJumperPed.AI = BB_PED_AI_SETUP_FOLLOW_PLAYER
OR sBailJumperPed.AI = BB_PED_AI_STATE_FOLLOW_PLAYER
IF GET_RANDOM_INT_IN_RANGE(0, 2) = 0
IF BB_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sCommonTextBlock, "BBC_T10", CONV_PRIORITY_AMBIENT_HIGH)
// Come back here bitch.
// You sneaky fuck, get back here.
// You trying to escape fucker?
iDialogueTimer = GET_GAME_TIMER()
ENDIF
ELSE
IF BB_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sMissionTextBlock, "BB1_J5", CONV_PRIORITY_AMBIENT_HIGH)
// I thought you'd had a change of heart?
// Are you serious? I'd assumed I was free to go.
// Oh crap, you're back. I thought you'd let me go.
iDialogueTimer = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
ENDIF
bHasPlayerLeftBailJumperBehind = FALSE
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "STAGE_TAKE_TARGET_TO_MAUDE - Bail Jumper added back into Player group") ENDIF #ENDIF
ELSE
IF NOT DOES_BLIP_EXIST(sBailJumperPed.blipIndex)
sBailJumperPed.blipIndex = CREATE_PED_BLIP(sBailJumperPed.pedIndex, TRUE, TRUE)
ENDIF
IF NOT bDoneObjective_ReturnToBailJumper
PRINT_NOW("BBS_05", DEFAULT_GOD_TEXT_TIME, 1) // Return to the ~b~bail jumper.~s~
bDoneObjective_ReturnToBailJumper = TRUE
ENDIF
// play any suitable dialogue here
ENDIF
ENDIF
IF NOT bCleanupBailJumperLocationDuringDropOff
bCleanupBailJumperLocationDuringDropOff = CLEANUP_BAIL_JUMPER_LOCATION_DURING_DROPOFF(vPlayerPos, sBailBondLaunchData.vStartPoint, 180.0)
ENDIF
IF SHOULD_BAIL_JUMPER_REVERT_BACK_TO_FLEE(sBailJumperPed.pedIndex)
bIsJumperRevertingBackToFlee = TRUE
eSubStage = SS_CLEANUP
ENDIF
BREAK
CASE SS_CLEANUP
SAFE_REMOVE_BLIP(blipIndexMaudesPlace)
IF IS_THIS_PRINT_BEING_DISPLAYED("BBS_DROP")
CLEAR_THIS_PRINT("BBS_DROP") // Take the bail jumper to ~y~Maude's place.
ENDIF
// jumper is fleeing again
IF bIsJumperRevertingBackToFlee
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "MISSION_STAGE_TAKE_TARGET_TO_MAUDE : ", "SS_CLEANUP -> MISSION_STAGE_TARGET_FLEES_AGAIN") ENDIF #ENDIF
SET_STAGE(MISSION_STAGE_TARGET_FLEES_AGAIN)
// player must lose their wanted level before handing bail jumper over to Maude
ELIF IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "MISSION_STAGE_TAKE_TARGET_TO_MAUDE : ", "SS_CLEANUP - player had wanted level") ENDIF #ENDIF
SET_STAGE(MISSION_STAGE_LOSE_THE_COPS)
ELSE
SAFE_REMOVE_BLIP(sBailJumperPed.blipIndex)
IF IS_THIS_PRINT_BEING_DISPLAYED("BBS_05")
CLEAR_THIS_PRINT("BBS_05") // Return to the ~b~bail jumper.~s~
ENDIF
IF NOT bCleanupBailJumperLocationDuringDropOff
bCleanupBailJumperLocationDuringDropOff = CLEANUP_BAIL_JUMPER_LOCATION_DURING_DROPOFF(vPlayerPos, sBailBondLaunchData.vStartPoint, 0.0)
ENDIF
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "MISSION_STAGE_TAKE_TARGET_TO_MAUDE : ", "SS_CLEANUP - done") ENDIF #ENDIF
SET_STAGE(MISSION_STAGE_CUTSCENE_MAUDE_TAKES_TARGET)
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDPROC
/// PURPOSE:
/// Additional stage which monitors the player losing his wanted level
PROC STAGE_LOSE_THE_COPS()
CREATE_AND_SETUP_MAUDE()
MANAGE_OUTRO_MOCAP_LOADING()
IF IS_PED_UNINJURED(sBailJumperPed.pedIndex)
UPDATE_PLAYER_CAN_SEE_PED_FRAME_COUNTER(sBailJumperPed.pedIndex, iFrameCountPlayerLastSeenBailJumper)
UPDATE_PEDS_CAN_SEE_PLAYER_FRAME_COUNTER(sBailJumperPed.pedIndex, sBailJumperPed.iFrameCountLastSeenPlayer)
UPDATE_BAIL_JUMPER_PED_AI()
SWITCH eSubStage
// ------------------------------------------
CASE SS_SETUP
KILL_ANY_CONVERSATION()
bDoneDialogue_BailJumperNoticesCops = FALSE
bDoneObjective_LoseWantedLevel = FALSE
eSubStage = SS_UPDATE
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "STAGE_LOSE_THE_COPS - SS_SETUP done") ENDIF #ENDIF
BREAK
// ------------------------------------------
CASE SS_UPDATE
IF NOT bHasPlayerLeftBailJumperBehind
IF IS_THIS_PRINT_BEING_DISPLAYED("BBS_05")
CLEAR_THIS_PRINT("BBS_05") // Return to the ~b~bail jumper.~s~
ENDIF
SAFE_REMOVE_BLIP(sBailJumperPed.blipIndex)
// check if the player has left the bail jumper behind
IF NOT IS_ENTITY_IN_RANGE_COORDS(sBailJumperPed.pedIndex, vPlayerPos, LEAVE_PLAYER_GROUP_DISTANCE)
// only switch states if he's following you at the time
IF sBailJumperPed.AI = BB_PED_AI_SETUP_FOLLOW_PLAYER
OR sBailJumperPed.AI = BB_PED_AI_STATE_FOLLOW_PLAYER
sBailJumperPed.iAiDelayTimer = GET_GAME_TIMER()
sBailJumperPed.AI = BB_PED_AI_SETUP_PLAYER_LEFT_BEHIND
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "STAGE_LOSE_THE_COPS : ", "SS_SETUP - sBailJumperPed.AI = BB_PED_AI_SETUP_PLAYER_LEFT_BEHIND") ENDIF #ENDIF
ENDIF
// Comment when the bail jumper is out of range of Trevor
IF HAS_FRAME_COUNTER_PASSED(iFrameCountPlayerLastSeenBailJumper, CAN_PED_SEE_PED_FRAME_COUNT_GRACE_PERIOD)
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT HAS_FRAME_COUNTER_PASSED(iFrameCountPlayerLastSeenBailJumper, CAN_PED_SEE_PED_FRAME_COUNT_GRACE_PERIOD) // only comment if Trev can't see him
IF BB_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sCommonTextBlock, "BBC_T9", CONV_PRIORITY_AMBIENT_HIGH)
// Shit, where did he go?
// What the fuck, where is he?
// Fuck, did I just lose him?
iDialogueTimer = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
ENDIF
bHasPlayerLeftBailJumperBehind = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "STAGE_LOSE_THE_COPS - Bail Jumper removed from Player group") ENDIF #ENDIF
ELSE
IF NOT IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
IF IS_THIS_PRINT_BEING_DISPLAYED("BBS_COPS")
CLEAR_THIS_PRINT("BBS_COPS") //Lose the cops.
ENDIF
bDoneDialogue_BailJumperNoticesCops = TRUE
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() // wait for current dialogue to finish first
eSubStage = SS_CLEANUP
ENDIF
ELSE
IF NOT bDoneDialogue_TrevorResponsesToBailJumperSurrendering
IF NOT IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING(sDialogueRoot_BailJumperSurrenders)
IF BB_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sCommonTextBlock, "BBC_T5", CONV_PRIORITY_AMBIENT_HIGH)
// Random dialogue line from -
// Correct decision, you're coming with me now.
// Damn right, come with me before I take your legs off.
// You're my bitch, now heel.
bDoneDialogue_TrevorResponsesToBailJumperSurrendering = TRUE
ENDIF
ENDIF
ELIF NOT bDoneObjective_LoseWantedLevel
IF NOT IS_THIS_PRINT_BEING_DISPLAYED("BBS_COPS")
PRINT_NOW("BBS_COPS", DEFAULT_GOD_TEXT_TIME, 0) // Lose the cops.
bDoneObjective_LoseWantedLevel = TRUE
ELSE
HANDLE_DIALOGUE_DURING_DROPOFF()
ENDIF
ELSE
HANDLE_DIALOGUE_DURING_DROPOFF()
ENDIF
ENDIF
ENDIF
ELSE
// check to see if the player has returned to the bail jumper
IF IS_ENTITY_IN_RANGE_COORDS(sBailJumperPed.pedIndex, vPlayerPos, REJOIN_PLAYER_GROUP_DISTANCE)
// only make him rejoin if he was in left behind state
IF sBailJumperPed.AI = BB_PED_AI_SETUP_PLAYER_LEFT_BEHIND
OR sBailJumperPed.AI = BB_PED_AI_STATE_PLAYER_LEFT_BEHIND
sBailJumperPed.iAiDelayTimer = GET_GAME_TIMER()
sBailJumperPed.AI = BB_PED_AI_SETUP_FOLLOW_PLAYER
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "STAGE_LOSE_THE_COPS : ", "SS_SETUP - sBailJumperPed.AI = BB_PED_AI_SETUP_FOLLOW_PLAYER") ENDIF #ENDIF
ENDIF
bDoneObjective_LoseWantedLevel = FALSE // reset the lose cops objective
IF IS_THIS_PRINT_BEING_DISPLAYED("BBS_05")
CLEAR_THIS_PRINT("BBS_05") // Return to the ~b~bail jumper.~s~
ENDIF
// Comment when the bail jumper is back in range of Trevor and he's returning to follow behaviour
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF sBailJumperPed.AI = BB_PED_AI_SETUP_FOLLOW_PLAYER
OR sBailJumperPed.AI = BB_PED_AI_STATE_FOLLOW_PLAYER
IF GET_RANDOM_INT_IN_RANGE(0, 2) = 0
IF BB_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sCommonTextBlock, "BBC_T10", CONV_PRIORITY_AMBIENT_HIGH)
// Come back here bitch.
// You sneaky fuck, get back here.
// You trying to escape fucker?
iDialogueTimer = GET_GAME_TIMER()
ENDIF
ELSE
IF BB_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sMissionTextBlock, "BB1_J5", CONV_PRIORITY_AMBIENT_HIGH)
// I thought you'd had a change of heart?
// Are you serious? I'd assumed I was free to go.
// Oh crap, you're back. I thought you'd let me go.
iDialogueTimer = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
ENDIF
bHasPlayerLeftBailJumperBehind = FALSE
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "STAGE_LOSE_THE_COPS - Bail Jumper added back into Player group") ENDIF #ENDIF
ELSE
IF IS_THIS_PRINT_BEING_DISPLAYED("BBS_COPS")
CLEAR_THIS_PRINT("BBS_COPS") //Lose the cops.
ENDIF
IF NOT DOES_BLIP_EXIST(sBailJumperPed.blipIndex)
sBailJumperPed.blipIndex = CREATE_PED_BLIP(sBailJumperPed.pedIndex, TRUE, TRUE)
ENDIF
IF NOT bDoneObjective_ReturnToBailJumper
PRINT_NOW("BBS_05", DEFAULT_GOD_TEXT_TIME, 1) // Return to the ~b~bail jumper.~s~
bDoneObjective_ReturnToBailJumper = TRUE
ENDIF
// play any suitable dialogue here
ENDIF
ENDIF
IF SHOULD_BAIL_JUMPER_REVERT_BACK_TO_FLEE(sBailJumperPed.pedIndex)
bIsJumperRevertingBackToFlee = TRUE
eSubStage = SS_CLEANUP
ENDIF
BREAK
// ------------------------------------------
CASE SS_CLEANUP
IF IS_THIS_PRINT_BEING_DISPLAYED("BBS_05")
CLEAR_THIS_PRINT("BBS_05") // Return to the ~b~bail jumper.~s~
ENDIF
bDoneDialogue_BailJumperNoticesCops = TRUE
SAFE_REMOVE_BLIP(sBailJumperPed.blipIndex)
// jumper is fleeing again
IF bIsJumperRevertingBackToFlee
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "STAGE_LOSE_THE_COPS : ", "SS_CLEANUP -> MISSION_STAGE_TARGET_FLEES_AGAIN") ENDIF #ENDIF
SET_STAGE(MISSION_STAGE_TARGET_FLEES_AGAIN)
ELSE
IF IS_THIS_PRINT_BEING_DISPLAYED("BBS_COPS")
CLEAR_THIS_PRINT("BBS_COPS") // Lose the cops.
ENDIF
SET_STAGE(MISSION_STAGE_TAKE_TARGET_TO_MAUDE)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "STAGE_LOSE_THE_COPS - SS_CLEANUP done") ENDIF #ENDIF
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDPROC
/// PURPOSE:
/// stage to handle target fleeing again (after he's already surrendered once)
PROC STAGE_TARGET_FLEES_AGAIN()
BOOL bStopFleeingIfPlayerClose = FALSE
CREATE_AND_SETUP_MAUDE()
MANAGE_OUTRO_MOCAP_LOADING()
IF IS_PED_UNINJURED(sBailJumperPed.pedIndex)
VECTOR vBailJumperPos = GET_ENTITY_COORDS(sBailJumperPed.pedIndex, FALSE)
UPDATE_PLAYER_CAN_SEE_PED_FRAME_COUNTER(sBailJumperPed.pedIndex, iFrameCountPlayerLastSeenBailJumper)
UPDATE_PEDS_CAN_SEE_PLAYER_FRAME_COUNTER(sBailJumperPed.pedIndex, sBailJumperPed.iFrameCountLastSeenPlayer)
UPDATE_BAIL_JUMPER_PED_AI()
SWITCH eSubStage
CASE SS_SETUP
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, RELGROUPHASH_PLAYER, HASH_BAILBOND_TARGET)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, HASH_BAILBOND_TARGET, RELGROUPHASH_PLAYER)
iBailJumperHealthOnBeganFleeAgain = GET_ENTITY_HEALTH(sBailJumperPed.pedIndex)
vPos_JumperBeganFleeAgain = GET_ENTITY_COORDS(sBailJumperPed.pedIndex, FALSE)
UPDATE_PROJECTICLE_FLEE_FROM_POSITION(vPos_ProjectileFleeingFrom, vPos_JumperBeganFleeAgain)
PED_COMMON_SETUP(sBailJumperPed.pedIndex) // set relationship group back up and other common stuff for flee
IF sBailJumperPed.AI != BB_PED_AI_SETUP_FLEE_ON_FOOT
AND sBailJumperPed.AI != BB_PED_AI_STATE_FLEE_ON_FOOT
CLEAR_PED_TASKS(sBailJumperPed.pedIndex)
sBailJumperPed.iAiDelayTimer = (GET_GAME_TIMER() - 3000)
sBailJumperPed.AI = BB_PED_AI_SETUP_FLEE_ON_FOOT
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "STAGE_TARGET_FLEES_AGAIN : ", "SS_SETUP - sBailJumperPed.AI = BB_PED_AI_SETUP_FLEE_ON_FOOT") ENDIF #ENDIF
ENDIF
IF IS_PED_UNINJURED(sBailJumperPed.pedIndex)
IF NOT DOES_BLIP_EXIST(sBailJumperPed.blipIndex)
sBailJumperPed.blipIndex = CREATE_PED_BLIP(sBailJumperPed.pedIndex, TRUE, FALSE)
ENDIF
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(sBailJumperPed.pedIndex)
ENDIF
iDelay_SurrenderForPlayerCloseToWhileFleeing = -1 // reset
iTime_BailJumperStartedFleeingOnFoot = -1 // reset
bHasBailJumperSurrendered = FALSE // reset since this is also used in CHASE_TARGET stage
bDoneDialogue_BailJumperSurrendered = FALSE // reset since this is also used in CHASE_TARGET stage
bDoneDialogue_BailJumperBeginsToFlee = FALSE // reset since this is also used in CHASE_TARGET stage
sDialogueRoot_BailJumperSurrenders = "BB1_J8" // different dialogue for surrendering a second time
iDialogueTimer = GET_GAME_TIMER()
//SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_DRIVING)
FLASH_BLIP_AND_TEXT(sBailJumperPed.blipIndex, "", "", iFlashBlipTimer, iFlashBlipGodTextTimer, FALSE)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "STAGE_TARGET_FLEES_AGAIN : ", "SS_SETUP - done") ENDIF #ENDIF
eSubStage = SS_UPDATE
BREAK
CASE SS_UPDATE
IF NOT bHasBailJumperSurrendered
FLASH_BLIP_AND_TEXT(sBailJumperPed.blipIndex, "", "", iFlashBlipTimer, iFlashBlipGodTextTimer, FALSE)
CONTROL_PED_CHASE_HINT_CAM_IN_VEHICLE(localChaseHintCamStruct, sBailJumperPed.pedIndex)
// Flee on foot it the player gets in the escape vehicle or it gets wrecked
IF sBailJumperPed.AI = BB_PED_AI_SETUP_FLEE_ON_FOOT
OR sBailJumperPed.AI = BB_PED_AI_STATE_FLEE_ON_FOOT
IF iTime_BailJumperStartedFleeingOnFoot = -1 // if this hasn't been set yet, start the timer
iTime_BailJumperStartedFleeingOnFoot = GET_GAME_TIMER()
ENDIF
IF iDelay_SurrenderForPlayerCloseToWhileFleeing = -1 // if this hasn't been set yet, start the timer
iDelay_SurrenderForPlayerCloseToWhileFleeing = GET_GAME_TIMER()
ELIF HAS_TIME_PASSED(iDelay_SurrenderForPlayerCloseToWhileFleeing, 8000) // don't surrender if player is close by initially (give him chance to run)
bStopFleeingIfPlayerClose = TRUE
ENDIF
IF SHOULD_PED_SURENDER_ONFOOT(sBailJumperPed.pedIndex, vPlayerPos, bStopFleeingIfPlayerClose, FALSE, TRUE, iBailJumperHealthOnBeganFleeAgain)
// make sure he's left the area he's fleeing from first to ensure he's clear of projectiles
IF HAS_TIME_PASSED(iTime_BailJumperStartedFleeingOnFoot, 5000)
OR ARE_VECTORS_EQUAL(vPos_ProjectileFleeingFrom, << 0.0, 0.0, 0.0 >>)
OR NOT IS_COORD_IN_RANGE_OF_COORD(vBailJumperPos, vPos_ProjectileFleeingFrom, 8.5)
AND NOT IS_COORD_IN_RANGE_OF_COORD(vBailJumperPos, vPos_JumperBeganFleeAgain, 8.5)
SET_BAIL_JUMPER_SURRENDERED()
sBailJumperPed.iTimer = GET_GAME_TIMER()
KILL_CHASE_HINT_CAM(localChaseHintCamStruct)
bHasBailJumperSurrendered = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "STAGE_TARGET_FLEES_AGAIN : ", "SS_UPDATE - surrender on foot") ENDIF #ENDIF
ELSE
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "STAGE_TARGET_FLEES_AGAIN : ", "SS_UPDATE - detected reason to surrender but failed projectile clearance checks") ENDIF #ENDIF
ENDIF
ELSE
IF NOT bDoneDialogue_BailJumperBeginsToFlee
IF NOT HAS_TIME_PASSED(iDialogueTimer, 2500)
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF IS_ENTITY_IN_RANGE_COORDS(sBailJumperPed.pedIndex, vPlayerPos, DIST_LIMIT_PLAYER_TO_PED_FOR_DIALOGUE)
IF BB_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sMissionTextBlock, "BB1_J7", CONV_PRIORITY_AMBIENT_HIGH)
// RANDOM SELECTED LINE
// Screw this, I'm out of here.
// That's me gone, asshole!
iDialogueTimer = GET_GAME_TIMER()
bDoneDialogue_BailJumperBeginsToFlee = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "STAGE_TARGET_FLEES_AGAIN : ", " trigger bDoneDialogue_BailJumperBeginsToFlee : BB1_J7") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ELSE
bDoneDialogue_BailJumperBeginsToFlee = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "STAGE_TARGET_FLEES_AGAIN : ", "bDoneDialogue_BailJumperBeginsToFlee skipped time out") ENDIF #ENDIF
ENDIF
ELSE
// additional dialogue during on foot chase
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF HAS_TIME_PASSED(iDialogueTimer, GET_RANDOM_INT_IN_RANGE(5000, 12000))
IF IS_ENTITY_IN_RANGE_COORDS(sBailJumperPed.pedIndex, vPlayerPos, DIST_LIMIT_PLAYER_TO_PED_FOR_DIALOGUE)
IF IS_PED_FLEEING(sBailJumperPed.pedIndex)
IF (GET_RANDOM_INT_IN_RANGE(0, 101) < 30)
IF BB_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sCommonTextBlock, "BBC_T13", CONV_PRIORITY_AMBIENT_HIGH)
// RANDOM SELECTED LINE
// I'm going to catch you, fucker!
// You can't out run a mad man!
// Trevor's going to hunt you down!
iDialogueTimer = GET_GAME_TIMER()
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "STAGE_TARGET_FLEES_AGAIN : ", "SS_UPDATE - trigger on foot flee dialogue : BBC_T13") ENDIF #ENDIF
ENDIF
ELSE
IF BB_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sMissionTextBlock, "BB1_FLEE", CONV_PRIORITY_AMBIENT_HIGH)
// RANDOM SELECTED LINE
// I'm not going down!
// I'm innocent!
// You've got the wrong guy!
// Leave me alone!
// I want to see some credentials!
iDialogueTimer = GET_GAME_TIMER()
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "STAGE_TARGET_FLEES_AGAIN : ", "SS_UPDATE - trigger on foot flee dialogue : BB1_FLEE") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
iDialogueTimer = GET_GAME_TIMER()
ENDIF
ENDIF
UPDATE_PED_ON_FOOT_SPEED_FOR_CHASING_PLAYER(sBailJumperPed.pedIndex, vPlayerPos, iTime_BailJumperStartedFleeingOnFoot)
ENDIF
ELSE
// no longer in flee behaviour
SET_BAIL_JUMPER_SURRENDERED()
sBailJumperPed.iTimer = GET_GAME_TIMER()
KILL_CHASE_HINT_CAM(localChaseHintCamStruct)
bHasBailJumperSurrendered = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "STAGE_TARGET_FLEES_AGAIN : ", "SS_UPDATE - switch to surrender for not being in flee on foot AI") ENDIF #ENDIF
ENDIF
ELSE
SET_BAIL_JUMPER_SURRENDERED()
IF NOT IS_ENTITY_IN_RANGE_COORDS(sBailJumperPed.pedIndex, vPlayerPos, 10.0)
IF NOT bDoneObjective_ApproachBailJumper
IF NOT IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING(sDialogueRoot_BailJumperSurrenders)
INIT_FLASH_BLIP_AND_TEXT(sBailJumperPed.blipIndex, "BBS_APPSUS", "BBS_APPSUS2", iFlashBlipTimer, iFlashBlipGodTextTimer, TRUE, TRUE) // Approach the ~r~bail jumper. // Approach the ~b~bail jumper.
bDoneObjective_ApproachBailJumper = TRUE
ENDIF
ELSE
FLASH_BLIP_AND_TEXT(sBailJumperPed.blipIndex, "BBS_APPSUS", "BBS_APPSUS2", iFlashBlipTimer, iFlashBlipGodTextTimer) // Approach the ~r~bail jumper. // Approach the ~b~bail jumper.
ENDIF
ELSE
IF NOT bDoneDialogue_BailJumperSurrendered
IF NOT IS_PED_RAGDOLL(sBailJumperPed.pedIndex)
AND NOT IS_PED_IN_ANY_VEHICLE(sBailJumperPed.pedIndex)
IF IS_THIS_PRINT_BEING_DISPLAYED("BBS_APPSUS") // Approach the ~r~bail jumper.
OR IS_THIS_PRINT_BEING_DISPLAYED("BBS_APPSUS2") // Approach the ~b~bail jumper.
CLEAR_PRINTS()
ENDIF
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDIF
IF BB_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sMissionTextBlock, sDialogueRoot_BailJumperSurrenders, CONV_PRIORITY_AMBIENT_HIGH)
// Okay, Okay I'm done.
// Fuck, you got me.
// Shit, I'm sorry that was stupid.
bDoneDialogue_BailJumperSurrendered = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "STAGE_TARGET_FLEES_AGAIN : ", "bDoneDialogue_BailJumperSurrendered - done") ENDIF #ENDIF
ENDIF
ENDIF
ELSE
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
eSubStage = SS_CLEANUP
ENDIF
ENDIF
FLASH_BLIP_AND_TEXT(sBailJumperPed.blipIndex, "", "", iFlashBlipTimer, iFlashBlipGodTextTimer, FALSE)
ENDIF
IF SHOULD_BAIL_JUMPER_REVERT_BACK_TO_FLEE(sBailJumperPed.pedIndex)
bIsJumperRevertingBackToFlee = TRUE
eSubStage = SS_SETUP
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "STAGE_TARGET_FLEES_AGAIN : ", " SS_UPDATE -> SS_SETUP reason to revert to flee yet again!") ENDIF #ENDIF
ENDIF
ENDIF
BREAK
CASE SS_CLEANUP
IF IS_THIS_PRINT_BEING_DISPLAYED("BBS_APPSUS") // Approach the ~r~bail jumper.
OR IS_THIS_PRINT_BEING_DISPLAYED("BBS_APPSUS2") // Approach the ~b~bail jumper.
CLEAR_PRINTS()
ENDIF
SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_NONE)
bDoneDialogue_BailJumperSurrendered = TRUE // mark this up as completed as it is used to stop Bail jumper switching to follow behaviour
SET_BAIL_JUMPER_SURRENDERED()
CLEAR_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, RELGROUPHASH_PLAYER, HASH_BAILBOND_TARGET)
CLEAR_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, HASH_BAILBOND_TARGET, RELGROUPHASH_PLAYER)
SAFE_REMOVE_BLIP(sBailJumperPed.blipIndex)
bDoneDialogue_BailJumperSurrendered = TRUE // mark this up as completed as it is used to stop Bail jumper switching to follow behaviour
sBailJumperPed.iTimer = GET_GAME_TIMER()
KILL_CHASE_HINT_CAM(localChaseHintCamStruct)
bHasPlayerLeftBailJumperBehind = FALSE // reset
bIsJumperRevertingBackToFlee = FALSE // reset
SET_STAGE(MISSION_STAGE_TAKE_TARGET_TO_MAUDE)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "STAGE_TARGET_FLEES_AGAIN : ", "SS_CLEANUP - done") ENDIF #ENDIF
BREAK
ENDSWITCH
ENDIF
ENDPROC
/// PURPOSE:
/// Trevor delivers the bail jumper to Maude
PROC STAGE_CUTSCENE_MAUDE_TAKES_TARGET()
SWITCH eSubStage
CASE SS_SETUP
RC_REQUEST_MID_MISSION_CUTSCENE(tlOutroMocapName) // can't use RC_REQUEST_CUTSCENE in this instance, as it causes bug 1000899
SET_MISSION_ENTITIES_COMP_VARIATIONS_FOR_OUTRO_MOCAP()
IF CREATE_AND_SETUP_MAUDE()
IF RC_IS_CUTSCENE_OK_TO_START(TRUE, DEFAULT_VEH_STOPPING_DISTANCE, TRUE)
REGISTER_ENTITY_FOR_CUTSCENE(PLAYER_PED_ID(), sSceneHandle_Trevor, CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
IF IS_ENTITY_ALIVE(sMaude.index)
REGISTER_ENTITY_FOR_CUTSCENE(sMaude.index, sSceneHandle_Maude, CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
IF IS_ENTITY_ALIVE(sBailJumperPed.pedIndex)
REGISTER_ENTITY_FOR_CUTSCENE(sBailJumperPed.pedIndex, sSceneHandle_BailJumper, CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
IF IS_ENTITY_ALIVE(sObjMaudeChair.index)
REGISTER_ENTITY_FOR_CUTSCENE(sObjMaudeChair.index, sSceneHandle_MaudeChair, CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
IF IS_ENTITY_ALIVE(sObjMaudeLaptop.index)
REGISTER_ENTITY_FOR_CUTSCENE(sObjMaudeLaptop.index, sSceneHandle_MaudeLaptop, CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
START_CUTSCENE()
WAIT(0) //needed because cutscene doesn't start straight away, causing player to see vehicles getting removed.
SAFE_FADE_SCREEN_IN_FROM_BLACK(DEFAULT_FADE_TIME, FALSE) // //B* 1468238 - when skipping to mocap (let the mocap stage handle fade in) tried just before START_CUTSCENE but issue still occured
RC_START_CUTSCENE_MODE(<< 2727.58, 4144.19, 43.95 >>, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE) //has to be after start_cutscene and wait(0)
VECTOR vResolveArea_Pos1, vResolveArea_Pos2, vVehRespotPosSizeLimit
FLOAT fResolveArea_Width
GET_RESOLVE_VEHICLES_AT_MAUDE_ANGLED_AREA_VALUES(vResolveArea_Pos1, vResolveArea_Pos2, fResolveArea_Width)
vVehRespotPosSizeLimit = GET_DEFAULT_VEHICLE_SIZE_LIMIT_AT_MAUDES() //GET_DEFAULT_ALLOWABLE_VEHICLE_SIZE_VECTOR()
// set the vehicle the player triggered the mission in to regenerate and clear the area - use alternative location for bigger vehicles
IF IS_REPLAY_START_VEHICLE_UNDER_SIZE_LIMIT(vVehRespotPosSizeLimit, FALSE)
RESOLVE_VEHICLES_INSIDE_ANGLED_AREA(vResolveArea_Pos1, vResolveArea_Pos2, fResolveArea_Width, << 2721.02, 4140.34, 43.66 >>, 257.67)
SET_MISSION_START_VEHICLE_AS_VEHICLE_GEN(<< 2721.02, 4140.34, 43.66 >>, 257.67, FALSE)
CPRINTLN(DEBUG_BAIL_BOND, GET_THIS_SCRIPT_NAME(), " : STAGE_CUTSCENE_MAUDE_TAKES_TARGET - resolved vehicles in area and setup standard vehicle gen - framecount : ", GET_FRAME_COUNT())
ELSE
RESOLVE_VEHICLES_INSIDE_ANGLED_AREA(vResolveArea_Pos1, vResolveArea_Pos2, fResolveArea_Width, <<2710.6646, 4149.0752, 42.7026>>, 180.9488)
SET_MISSION_START_VEHICLE_AS_VEHICLE_GEN(<<2710.6646, 4149.0752, 42.7026>>, 180.9488, FALSE)
CPRINTLN(DEBUG_BAIL_BOND, GET_THIS_SCRIPT_NAME(), " : STAGE_CUTSCENE_MAUDE_TAKES_TARGET - resolved vehicles in area and setup large vehicle gen - framecount : ", GET_FRAME_COUNT())
ENDIF
// temp until bail jumper is added to the cutscene
IF IS_PED_UNINJURED(sBailJumperPed.pedIndex)
IF IS_PED_IN_GROUP(sBailJumperPed.pedIndex)
REMOVE_PED_FROM_GROUP(sBailJumperPed.pedIndex)
ENDIF
CLEAR_PED_TASKS(sBailJumperPed.pedIndex)
SET_ENTITY_COORDS(sBailJumperPed.pedIndex, <<2724.02, 4145.08, 43.29>>)
SET_ENTITY_HEADING(sBailJumperPed.pedIndex, -84.20)
CLEAR_PED_TASKS(sBailJumperPed.pedIndex)
ENDIF
eSubStage = SS_UPDATE
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, GET_THIS_SCRIPT_NAME(), " : STAGE_CUTSCENE_MAUDE_TAKES_TARGET - CUTSCENE_STAGE_SETUP done framecount : ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
ENDIF
BREAK
CASE SS_UPDATE
// set exit state for Maude on her chair
IF IS_ENTITY_ALIVE(sObjMaudeChair.index)
IF IS_PED_UNINJURED(sMaude.index)
// Set exit state for Maude
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY(sSceneHandle_Maude)
AND CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY(sSceneHandle_MaudeChair)
SET_MAUDE_SYNC_SCENE()
CPRINTLN(DEBUG_MISSION, GET_THIS_SCRIPT_NAME(), " : STAGE_INTRO_MOCAP_SCENE - CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY - sMaude.index and sSceneHandle_MaudeChair - FC = ", GET_FRAME_COUNT())
ENDIF
ENDIF
ENDIF
// Set exit state for Trevor
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY(sSceneHandle_Trevor)
// B*1478470 - mocap got shortened caused blend out issue so respoting Trev to safe coords
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<2724.1929, 4145.3057, 42.8324>>)
SET_ENTITY_HEADING(PLAYER_PED_ID(), 76.4896)
//FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID())
FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_ON_FOOT_WALK, FALSE, FAUS_CUTSCENE_EXIT)
SIMULATE_PLAYER_INPUT_GAIT(PLAYER_ID(), PEDMOVEBLENDRATIO_WALK, 2000)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, GET_THIS_SCRIPT_NAME(), " : STAGE_CUTSCENE_MAUDE_TAKES_TARGET - SS_UPDATE done - set exit state for Trevor framecount = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_CAMERA()
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, GET_THIS_SCRIPT_NAME(), " : STAGE_CUTSCENE_MAUDE_TAKES_TARGET - SS_UPDATE - Camera - set camera exit state in mocap Frame Count : ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
IF NOT IS_CUTSCENE_PLAYING()
eSubStage = SS_CLEANUP
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, GET_THIS_SCRIPT_NAME(), " : STAGE_CUTSCENE_MAUDE_TAKES_TARGET - SS_UPDATE done framecount : ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
BREAK
CASE SS_CLEANUP
IF IS_CUTSCENE_PLAYING()
STOP_CUTSCENE()
ELSE
IF HAS_CUTSCENE_LOADED()
REMOVE_CUTSCENE()
ENDIF
IF bFinishedStageSkipping //only do this if we aren't stage skipping
RC_END_CUTSCENE_MODE()
ENDIF
IF IS_PED_UNINJURED(sBailJumperPed.pedIndex)
IF IS_PED_IN_GROUP(sBailJumperPed.pedIndex)
REMOVE_PED_FROM_GROUP(sBailJumperPed.pedIndex)
ENDIF
ENDIF
SAFE_REMOVE_PED(sBailJumperPed.pedIndex, TRUE)
IF IS_PED_UNINJURED(sMaude.index)
TASK_LOOK_AT_ENTITY(sMaude.index, PLAYER_PED_ID(), -1)
SET_PED_KEEP_TASK(sMaude.index, TRUE)
ENDIF
SAFE_RELEASE_PED(sMaude.index)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, GET_THIS_SCRIPT_NAME(), " : STAGE_CUTSCENE_MAUDE_TAKES_TARGET - SS_CLEANUP done framecount : ", GET_FRAME_COUNT()) ENDIF #ENDIF
SET_STAGE(MISSION_STAGE_MISSION_PASSED)
ENDIF
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE:
/// mini stage to handle player killing bail jumper, trigger dialogue and setting post mission script running
PROC STAGE_MISSION_OVER_BAIL_JUMPER_KILLED()
SWITCH eSubStage
CASE SS_SETUP
CLEAR_PRINTS()
CLEAR_HELP()
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
KILL_ANY_CONVERSATION()
ENDIF
DELETE_ALL_MISSION_BLIPS()
SAFE_REMOVE_PED(sMaude.index, TRUE) // ensure Maude isn't in the world if we are passing early (if she sees player kill jumper it will fail)
INT i
FOR i=0 TO (iNumTargetBackupPeds - 1)
//GIVE_PED_FLEE_ORDER(sBackupPed[i].index)
PICK_BUDDY_REACTION(i)
ENDFOR
iTimer_DelayMissionOverBailJumperKilled = GET_GAME_TIMER() //set timer to advance to mission over if dialogue doesn't trigger or post script doesn't launch quick enough
eSubStage = SS_UPDATE
CPRINTLN(DEBUG_BAIL_BOND, GET_THIS_SCRIPT_NAME(), " : STAGE_MISSION_OVER_BAIL_JUMPER_KILLED : SS_SETUP done framecount : ", GET_FRAME_COUNT())
BREAK
CASE SS_UPDATE
IF HAS_TIME_PASSED(iTimer_DelayMissionOverBailJumperKilled, 500)
// trigger bail jumper killed dialogue
IF NOT bDoneDialogue_BailJumperKilled
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
KILL_ANY_CONVERSATION()
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDIF
IF BB_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sCommonTextBlock, "BBC_PK1", CONV_PRIORITY_AMBIENT_HIGH)
// Fucker is down. Maude will understand.
// Man down! Maude won't be getting this guy.
// I don't think Maude would appreciate him in a body bag.
// That got the bastard. I won't be dropping him off at Maude's then.
bDoneDialogue_BailJumperKilled = TRUE
CPRINTLN(DEBUG_BAIL_BOND, "STAGE_MISSION_OVER_BAIL_JUMPER_KILLED - dialogue triggered BBC_PK1")
ELSE
CPRINTLN(DEBUG_BAIL_BOND, "STAGE_MISSION_OVER_BAIL_JUMPER_KILLED - dialogue failed to trigger BBC_PK1 framecount : ", GET_FRAME_COUNT())
ENDIF
ENDIF
// check to see if we can head to mission over
IF bDoneDialogue_BailJumperKilled
SCRIPT_PASSED(BB_PASSED_TARGET_KILLED)
CPRINTLN(DEBUG_BAIL_BOND, GET_THIS_SCRIPT_NAME(), " : STAGE_MISSION_OVER_BAIL_JUMPER_KILLED : SS_UPDATE done SCRIPT_PASSED called framecount : ", GET_FRAME_COUNT())
ENDIF
// fail safe if conversation or script launch takes too long
IF HAS_TIME_PASSED(iTimer_DelayMissionOverBailJumperKilled, 1500)
SCRIPT_PASSED(BB_PASSED_TARGET_KILLED)
CPRINTLN(DEBUG_BAIL_BOND, GET_THIS_SCRIPT_NAME(), " : STAGE_MISSION_OVER_BAIL_JUMPER_KILLED : SS_UPDATE done SCRIPT_PASSED called iTimer_DelayMissionOverBailJumperKilled timed out framecount : ", GET_FRAME_COUNT())
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE:
/// Waits for the screen to fade out then updates failed reason
PROC STAGE_FAILED_WAIT_FOR_FADE()
STRING sFailReason = NULL
INT i
SWITCH eSubStage
CASE SS_SETUP
CLEAR_PRINTS()
CLEAR_HELP()
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
KILL_ANY_CONVERSATION()
ENDIF
DELETE_ALL_MISSION_BLIPS()
eBailBondMissionOverState = BBMOS_FAILED
//setup mission failed dialogue if needed
IF eBB_MissionFailedReason = BB_FAILED_MAUDE_ATTACKED
// flee comment from Maude
IF IS_PED_UNINJURED(sMaude.index)
REMOVE_PED_FOR_DIALOGUE(sDialogue, MAUDE_SPEAKER_ID) // leave area comments - remove Maude
MAKE_PED_SCREAM(sMaude.index, FALSE)
IF NOT IS_AMBIENT_SPEECH_PLAYING(sMaude.index)
IF IS_ENTITY_IN_RANGE_COORDS(sMaude.index, GET_ENTITY_COORDS(PLAYER_PED_ID(), FALSE), 35.0)
STOP_PED_SPEAKING(sMaude.index, FALSE)
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(sMaude.index, "GENERIC_FRIGHTENED_HIGH", "MAUDE", SPEECH_PARAMS_FORCE) // GENERIC_SHOCKED_HIGH
CPRINTLN(DEBUG_BAIL_BOND, GET_THIS_SCRIPT_NAME(), " : TRIGGER_MAUDE_FLEE_DIALOGUE_LINE - requested to trigger ambient speech line GENERIC_FRIGHTENED_HIGH")
ENDIF
ELSE
CPRINTLN(DEBUG_BAIL_BOND, GET_THIS_SCRIPT_NAME(), " : TRIGGER_MAUDE_FLEE_DIALOGUE_LINE - failed already ambient Maude speech playing")
ENDIF
ENDIF
// ensure these aren't frozen for flee
IF DOES_ENTITY_EXIST(sObjMaudeLaptop.index)
FREEZE_ENTITY_POSITION(sObjMaudeLaptop.index, FALSE)
ENDIF
IF DOES_ENTITY_EXIST(sObjMaudeTable.index)
FREEZE_ENTITY_POSITION(sObjMaudeTable.index, FALSE)
ENDIF
REQUEST_ANIM_DICT(GET_MAUDE_REACT_ANIM_DICT()) // begin request for flee anim
IF SET_MAUDE_PLAY_FLEE_EXIT_ANIM(sMaude.index, sObjMaudeChair.index, iSyncScene_MaudeReact)
bSetMaudeFleeSyncSceneExit = TRUE
CPRINTLN(DEBUG_BAIL_BOND, GET_THIS_SCRIPT_NAME(), " : STAGE_FAILED_WAIT_FOR_FADE : maude exit sync scene done")
ENDIF
ELIF eBB_MissionFailedReason = BB_FAILED_BAIL_JUMPER_ESCAPED
bDoneDialogue_MissionFailed = FALSE
// Fuck, I lost him.
// Shit, I lost him.
tlDialogueRoot_MissionFailed = "BBC_T12"
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "STAGE_FAILED_WAIT_FOR_FADE - set fail dialogue for Maude attacked root: BBC_T12") ENDIF #ENDIF
ENDIF
IF IS_PED_UNINJURED(sBailJumperPed.pedIndex)
IF IS_PED_IN_GROUP(sBailJumperPed.pedIndex)
REMOVE_PED_FROM_GROUP(sBailJumperPed.pedIndex)
ENDIF
GIVE_PED_FLEE_ORDER(sBailJumperPed.pedIndex)
ENDIF
FOR i = 0 TO (iNumTargetBackupPeds - 1)
GIVE_PED_FLEE_ORDER(sBackupPed[i].index)
ENDFOR
// set the fail reason
SWITCH eBB_MissionFailedReason
// shouldn't come in here if this was the fail reason
CASE BB_FAILED_DIST_CLEANUP_BEFORE_ENCOUNTER
SCRIPT_ASSERT("BAILBOND1 : invalid fail reason BB_FAILED_DIST_CLEANUP_BEFORE_ENCOUNTER in STAGE_FAILED_WAIT_FOR_FADE")
BREAK
CASE BB_FAILED_BAIL_JUMPER_ESCAPED
sFailReason = "BBS_F1" // ~w~The bail jumper escaped.~s~
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "STAGE_FAILED_WAIT_FOR_FADE string set : BB_FAILED_BAIL_JUMPER_ESCAPED") ENDIF #ENDIF
BREAK
CASE BB_FAILED_MAUDE_DIED
sFailReason = "BBS_F3" // ~w~Maude died.~s~
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "STAGE_FAILED_WAIT_FOR_FADE string set : BB_FAILED_MAUDE_DIED") ENDIF #ENDIF
BREAK
CASE BB_FAILED_MAUDE_ATTACKED
sFailReason = "BBS_F2" // ~w~Maude was spooked.~s~
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "STAGE_FAILED_WAIT_FOR_FADE string set : BB_FAILED_MAUDE_ATTACKED") ENDIF #ENDIF
BREAK
CASE BB_FAILED_DEFAULT
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "STAGE_FAILED_WAIT_FOR_FADE string set : BB_FAILED_DEFAULT") ENDIF #ENDIF
BREAK
ENDSWITCH
//Check if fail reason needs to be displayed
IF eBB_MissionFailedReason != BB_FAILED_DEFAULT
MISSION_FLOW_SET_FAIL_REASON(sFailReason)
ENDIF
BAILBOND_FAILED(0)
eSubStage = SS_UPDATE
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "STAGE_FAILED_WAIT_FOR_FADE - SS_SETUP done") ENDIF #ENDIF
BREAK
CASE SS_UPDATE
IF GET_MISSION_FLOW_SAFE_TO_CLEANUP()
// Do a check here to see if we need to warp the player at all
// (only set the fail warp locations if we can't leave the player where he was)
//---- Do any specific cleanup here----
CLEANUP_ALL_MISSION_ENTITIES(TRUE)
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "STAGE_FAILED_WAIT_FOR_FADE - SS_UPDATE done") ENDIF #ENDIF
Script_Cleanup()
ELSE
// not finished fading out
// you may want to handle dialogue etc here.
IF NOT bDoneDialogue_MissionFailed
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDIF
IF eBB_MissionFailedReason = BB_FAILED_MAUDE_ATTACKED
IF IS_PED_UNINJURED(sMaude.index)
IF IS_ENTITY_IN_RANGE_COORDS(sMaude.index, vPlayerPos, 35.0)
ADD_PED_FOR_DIALOGUE(sDialogue, MAUDE_SPEAKER_ID, sMaude.index, "MAUDE")
IF BB_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sCommonTextBlock, tlDialogueRoot_MissionFailed, CONV_PRIORITY_AMBIENT_HIGH)
bDoneDialogue_MissionFailed = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "STAGE_FAILED_WAIT_FOR_FADE - bDoneDialogue_MissionFailed - true") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ELSE
IF BB_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sCommonTextBlock, tlDialogueRoot_MissionFailed, CONV_PRIORITY_AMBIENT_HIGH)
bDoneDialogue_MissionFailed = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintBailBondInfoToTTY CPRINTLN(DEBUG_BAIL_BOND, "STAGE_FAILED_WAIT_FOR_FADE - bDoneDialogue_MissionFailed - true") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
// Handle Maude's flee exit
IF eBB_MissionFailedReason = BB_FAILED_MAUDE_ATTACKED
IF NOT bSetMaudeFleeSyncSceneExit
REQUEST_ANIM_DICT(GET_MAUDE_REACT_ANIM_DICT()) // begin request for flee anim
IF SET_MAUDE_PLAY_FLEE_EXIT_ANIM(sMaude.index, sObjMaudeChair.index, iSyncScene_MaudeReact)
bSetMaudeFleeSyncSceneExit = TRUE
CPRINTLN(DEBUG_BAIL_BOND, GET_THIS_SCRIPT_NAME(), " : STAGE_FAILED_WAIT_FOR_FADE : maude exit sync scene done")
ENDIF
ELSE
IF IS_PED_UNINJURED(sMaude.index)
IF NOT IsPedPerformingTask(sMaude.index, SCRIPT_TASK_SMART_FLEE_PED)
IF NOT IS_PED_FLEEING(sMaude.index)
IF NOT IS_ENTITY_PLAYING_ANIM(sMaude.index, GET_MAUDE_REACT_ANIM_DICT(), GET_MAUDE_REACT_ANIM())
SET_MAUDE_FLEE_ATTRIBUTES(sMaude.index)
TASK_SMART_FLEE_PED(sMaude.index, PLAYER_PED_ID(), 50, -1) // keep small to inprove latency path finding issue (should be faded by dist reached)
SET_PED_KEEP_TASK(sMaude.index, TRUE) // Keep scripted task
CPRINTLN(DEBUG_BAIL_BOND, GET_THIS_SCRIPT_NAME(), " : STAGE_FAILED_WAIT_FOR_FADE : maude flee task applied")
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDPROC
SCRIPT(BAIL_BOND_LAUNCH_DATA launcherBailBondData)
//Grab handle to the mission data set by the launcher
sBailBondLaunchData = launcherBailBondData
// Setup callback when player is killed, arrested , goes to multiplayer or random events force cleanup
IF (HAS_FORCE_CLEANUP_OCCURRED(DEFAULT_FORCE_CLEANUP_FLAGS|FORCE_CLEANUP_FLAG_DEBUG_MENU|FORCE_CLEANUP_FLAG_REPEAT_PLAY))
// cleanup silently without fade if player was unaware of the bail jumper mission
IF eMissionStage = MISSION_STAGE_PLAYER_LOCATE_BAIL_JUMPER
CPRINTLN(DEBUG_BAIL_BOND, GET_THIS_SCRIPT_NAME(), " : FORCE CLEANUP : mission stage not detected bail jumpr. frame count : ", GET_FRAME_COUNT())
// set the mission over state for the launcher to use
eBailBondMissionOverState = BBMOS_CLEANUP
Script_Cleanup()
ELSE
CPRINTLN(DEBUG_BAIL_BOND, GET_THIS_SCRIPT_NAME(), " : FORCE CLEANUP : frame count : ", GET_FRAME_COUNT())
// set the mission over state for the launcher to use
eBailBondMissionOverState = BBMOS_FAILED
BAILBOND_FAILED(0)
Script_Cleanup()
ENDIF
ENDIF
// Check the random event is allowed to run?
IF NOT IS_BAIL_BOND_SAFE_TO_LAUNCH(TRUE)
CPRINTLN(DEBUG_BAIL_BOND, GET_THIS_SCRIPT_NAME(), " : CLEANUP - random event not allowed to run : frame count : ", GET_FRAME_COUNT())
// set the mission over state for the launcher to use
eBailBondMissionOverState = BBMOS_CLEANUP
Script_Cleanup()
ENDIF
SET_MISSION_FLAG(TRUE)
INIT_MISSION()
IF IS_REPLAY_IN_PROGRESS() // handle replay checkpoints
INT iReplayStage = GET_REPLAY_MID_MISSION_STAGE()
IF g_bShitskipAccepted = TRUE
iReplayStage++ // player is skipping this stage
ENDIF
SWITCH iReplayStage
CASE CP_BB1_TRIGGER_BAIL_JUMPER_REACTION
// B*1526934 - heli needs different pos plus allow heli flag
IF IS_THIS_MODEL_A_HELI(g_stageSnapshot.mVehicleStruct.mVehicle.eModel)
OR IS_THIS_MODEL_A_PLANE(g_stageSnapshot.mVehicleStruct.mVehicle.eModel)
CREATE_VEHICLE_FOR_REPLAY(vehIndex_MissionReplayRestore, <<2898.2944, 2796.3049, 53.8490>>, 162.6353, FALSE, FALSE, TRUE, FALSE, FALSE)
ELSE
CREATE_VEHICLE_FOR_REPLAY(vehIndex_MissionReplayRestore, <<2891.4587, 2798.1245, 53.7482>>, 206.3925, FALSE, FALSE, FALSE, FALSE, FALSE)
ENDIF
START_REPLAY_SETUP(vPos_PlayerMissionStart, fHeading_PlayerMissionStart) //setup player in spot for mission start
ePlayerSpotsBailJumperType = BB_PSBJT_PLAYER_SPOTS_BAIL_JUMPER_LONG_DISTANCE
DO_Z_SKIP(Z_SKIP_TRIGGER_BAIL_JUMPER_REACTION) // skip the mocap intro
CPRINTLN(DEBUG_MISSION, "* Replay checkpoint * - ", "start chase in progress")
BREAK
CASE CP_BB1_MISSION_PASSED
CREATE_VEHICLE_FOR_REPLAY(vehIndex_MissionReplayRestore, <<2704.0776, 4152.2397, 42.2514>>, 175.1930, FALSE, FALSE, FALSE, FALSE, FALSE) // Across from Maude's
START_REPLAY_SETUP(vMaudePlace, 254.9762, FALSE) // match position for kicking off outro mocap
DO_Z_SKIP(Z_SKIP_OUTRO_CUTSCENE)
CPRINTLN(DEBUG_MISSION, "* Replay checkpoint * - ", "mission passed in progress (play outro mocap first")
BREAK
DEFAULT
SCRIPT_ASSERT("BAILBOND1 : Replay checkpoint * - starting mission from invalid checkpoint")
BREAK
ENDSWITCH
ELIF IS_REPEAT_PLAY_ACTIVE()
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
SAFE_TELEPORT_PED(PLAYER_PED_ID(), vPos_PlayerMissionStart, fHeading_PlayerMissionStart) //setup player in spot which matches start of the mission
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0)
CPRINTLN(DEBUG_BAIL_BOND, "IS_REPEAT_PLAY_ACTIVE - set player coords for repeat play ", vPos_PlayerMissionStart, " framecount : ", GET_FRAME_COUNT())
ENDIF
ENDIF
// Loop within here until the mission passes or fails
WHILE(TRUE)
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
// Fix B*1121745 - swap over to call everyframe commands
SET_ALL_RANDOM_PEDS_FLEE_THIS_FRAME(PLAYER_ID())
SET_ALL_NEUTRAL_RANDOM_PEDS_FLEE_THIS_FRAME(PLAYER_ID())
vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
MISSION_FAILED_CHECKS()
CHECK_BAIL_JUMPER_KILLED()
SWITCH eMissionStage
CASE MISSION_STAGE_PLAYER_LOCATE_BAIL_JUMPER
STAGE_PLAYER_LOCATE_BAIL_JUMPER()
BREAK
CASE MISSION_STAGE_TRIGGER_BAIL_JUMPER_REACTION
STAGE_TRIGGER_BAIL_JUMPER_REACTION()
BREAK
CASE MISSION_STAGE_CHASE
STAGE_CHASE()
BREAK
CASE MISSION_STAGE_TAKE_TARGET_TO_MAUDE
STAGE_TAKE_TARGET_TO_MAUDE()
BREAK
CASE MISSION_STAGE_LOSE_THE_COPS
STAGE_LOSE_THE_COPS()
BREAK
CASE MISSION_STAGE_TARGET_FLEES_AGAIN
STAGE_TARGET_FLEES_AGAIN()
BREAK
CASE MISSION_STAGE_CUTSCENE_MAUDE_TAKES_TARGET
STAGE_CUTSCENE_MAUDE_TAKES_TARGET()
BREAK
CASE MISSION_STAGE_MISSION_PASSED
SCRIPT_PASSED(BB_PASSED_TARGET_CAPTURED)
BREAK
CASE MISSION_STAGE_MISSION_OVER_BAIL_JUMPER_KILLED
STAGE_MISSION_OVER_BAIL_JUMPER_KILLED()
BREAK
CASE MISSION_STAGE_MISSION_FAILED_WAIT_FOR_FADE
STAGE_FAILED_WAIT_FOR_FADE()
BREAK
ENDSWITCH
// if we are skipping through the mission stages, for a checkpoint / debug skip
IF bFinishedStageSkipping = FALSE
JUMP_TO_STAGE(eMissionSkipTargetStage)
ENDIF
#IF IS_DEBUG_BUILD
MAINTAIN_MISSION_WIDGETS()
IF bFinishedStageSkipping = TRUE // not skipping stages, check for debug keys as long as we aren't in fail state
IF eMissionStage <> MISSION_STAGE_MISSION_FAILED_WAIT_FOR_FADE
DEBUG_Check_Debug_Keys() // Check debug completion/failure
ENDIF
ENDIF
#ENDIF
ENDIF
WAIT(0)
ENDWHILE
// Script should never reach here. Always terminate with cleanup function.
ENDSCRIPT