8338 lines
456 KiB
Python
Executable File
8338 lines
456 KiB
Python
Executable File
// *****************************************************************************************
|
|
// *****************************************************************************************
|
|
//
|
|
// MISSION NAME : Nigel1B.sc
|
|
// AUTHOR : Ahron Mason
|
|
// DESCRIPTION : Trevor steals clothes from celebrity for Nigel and Mrs Thornhill.
|
|
//
|
|
// *****************************************************************************************
|
|
// *****************************************************************************************
|
|
|
|
//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 "initial_scenes_Nigel.sch"
|
|
USING "RC_Area_public.sch"
|
|
USING "commands_event.sch"
|
|
USING "commands_recording.sch"
|
|
#IF IS_DEBUG_BUILD
|
|
USING "select_mission_stage.sch"
|
|
#ENDIF
|
|
|
|
//-------------------------------------------------------------------------------------------------------------------------------------------------
|
|
// :ENUMS
|
|
//-------------------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
/// PURPOSE: Mission stages
|
|
ENUM MISSION_STAGE
|
|
//Main Mission Stages
|
|
MISSION_STAGE_STEAL_CELEB_POSSESSIONS,
|
|
MISSION_STAGE_ITEMS_STOLEN_LEAVE_THE_AREA,
|
|
MISSION_STAGE_ITEMS_STOLEN_PLAYER_LEFT_THE_AREA,
|
|
MISSION_STAGE_OUTRO_PHONECALL,
|
|
MISSION_STAGE_MISSION_PASSED,
|
|
//Additional stages
|
|
MISSION_STAGE_LOSE_THE_COPS,
|
|
MISSION_STAGE_MISSION_FAILED_WAIT_FOR_FADE,
|
|
//Debug Stages
|
|
MISSION_STAGE_DEBUG_POOL_SETUP
|
|
ENDENUM
|
|
|
|
/// PURPOSE: each mission stage has uses these substages
|
|
ENUM SUB_STAGE
|
|
SS_SETUP,
|
|
SS_UPDATE,
|
|
SS_CLEANUP
|
|
ENDENUM
|
|
|
|
/// PURPOSE: fail conditions
|
|
ENUM FAILED_REASON_ENUM
|
|
FAILED_DEFAULT
|
|
ENDENUM
|
|
|
|
/// PURPOSE: used to update mission peds behaviour
|
|
ENUM N1B_PED_AI
|
|
N1B_PED_AI_STATE_RELAXED,
|
|
N1B_PED_AI_SETUP_ROUTINE,
|
|
N1B_PED_AI_STATE_ROUTINE,
|
|
N1B_PED_AI_SETUP_ROUTINE_SECONDARY,
|
|
N1B_PED_AI_STATE_ROUTINE_SECONDARY,
|
|
N1B_PED_AI_STATE_ROUTINE_COMPLETED,
|
|
N1B_PED_AI_CELEB_ONLY_SETUP_DO_FINAL_LENGTH,
|
|
N1B_PED_AI_CELEB_ONLY_STATE_DO_FINAL_LENGTH,
|
|
N1B_PED_AI_CELEB_ONLY_SETUP_LEAVE_POOL,
|
|
N1B_PED_AI_CELEB_ONLY_STATE_LEAVE_POOL,
|
|
N1B_PED_AI_CELEB_ONLY_STATE_LEFT_POOL_COMPLETED,
|
|
N1B_PED_AI_CELEB_ONLY_SETUP_POSE,
|
|
N1B_PED_AI_CELEB_ONLY_STATE_POSE,
|
|
N1B_PED_AI_CELEB_ONLY_STATE_POSE_COMPLETED,
|
|
N1B_PED_AI_CELEB_ONLY_SETUP_GOTO_HOT_TUB,
|
|
N1B_PED_AI_CELEB_ONLY_STATE_GOTO_HOT_TUB,
|
|
N1B_PED_AI_CELEB_ONLY_SETUP_ENTER_HOT_TUB_ANIM,
|
|
N1B_PED_AI_CELEB_ONLY_STATE_ENTER_HOT_TUB_ANIM,
|
|
N1B_PED_AI_CELEB_ONLY_SETUP_DANCE_IN_HOT_TUB,
|
|
N1B_PED_AI_CELEB_ONLY_STATE_DANCE_IN_HOT_TUB,
|
|
N1B_PED_AI_FEMALE_ONLY_SETUP_WATCH_DANCE_IN_HOT_TUB,
|
|
N1B_PED_AI_FEMALE_ONLY_STATE_WATCH_DANCE_IN_HOT_TUB,
|
|
N1B_PED_AI_CELEB_ONLY_SETUP_GET_OUT_POOL_FOR_CLOTHES, // left in for now may want to replace final length
|
|
N1B_PED_AI_CELEB_ONLY_STATE_GET_OUT_POOL_FOR_CLOTHES,
|
|
N1B_PED_AI_CELEB_ONLY_SETUP_SEARCH_FOR_CLOTHES,
|
|
N1B_PED_AI_CELEB_ONLY_STATE_SEARCH_FOR_CLOTHES,
|
|
N1B_PED_AI_CELEB_ONLY_SETUP_GET_TO_POS_FOR_CALL_THE_COPS,
|
|
N1B_PED_AI_CELEB_ONLY_STATE_GET_TO_POS_FOR_CALL_THE_COPS,
|
|
N1B_PED_AI_CELEB_ONLY_SETUP_CALL_THE_COPS,
|
|
N1B_PED_AI_CELEB_ONLY_STATE_CALL_THE_COPS,
|
|
N1B_PED_AI_CELEB_ONLY_SETUP_END_PHONECALL,
|
|
N1B_PED_AI_CELEB_ONLY_STATE_END_PHONECALL,
|
|
N1B_PED_AI_SETUP_AWARE_OF_PLAYER,
|
|
N1B_PED_AI_STATE_AWARE_OF_PLAYER,
|
|
N1B_PED_AI_SETUP_JUST_FACE_PLAYER,
|
|
N1B_PED_AI_STATE_JUST_FACE_PLAYER,
|
|
N1B_PED_AI_SETUP_AWARE_OF_GARDENER,
|
|
N1B_PED_AI_STATE_AWARE_OF_GARDENER,
|
|
N1B_PED_AI_SETUP_WARN_OTHER_PEDS,
|
|
N1B_PED_AI_STATE_WARN_OTHER_PEDS,
|
|
N1B_PED_AI_SETUP_WAIT_TO_ATTACK,
|
|
N1B_PED_AI_STATE_WAIT_TO_ATTACK,
|
|
N1B_PED_AI_SETUP_BEATEN_UP,
|
|
N1B_PED_AI_STATE_BEATEN_UP,
|
|
N1B_PED_AI_SETUP_SURRENDERED,
|
|
N1B_PED_AI_STATE_SURRENDERED,
|
|
N1B_PED_AI_SETUP_FRIGHTENED,
|
|
N1B_PED_AI_STATE_FRIGHTENED,
|
|
N1B_PED_AI_SETUP_FLEE_WITH_REACT,
|
|
N1B_PED_AI_SETUP_FLEE,
|
|
N1B_PED_AI_STATE_FLEE,
|
|
N1B_PED_AI_STATE_DEAD
|
|
ENDENUM
|
|
|
|
/// PURPOSE: used to keep track of the player's position
|
|
ENUM N1B_PLAYER_LOCATION
|
|
N1B_PLAYER_LOCATION_OUTSIDE_HOUSE_AREA,
|
|
N1B_PLAYER_LOCATION_INSIDE_HOUSE_AREA,
|
|
N1B_PLAYER_LOCATION_POOL_AREA,
|
|
N1B_PLAYER_LOCATION_GARDEN_AREA
|
|
ENDENUM
|
|
|
|
/// PURPOSE: used to maintain the pool area's state
|
|
ENUM N1B_POOL_AREA_STATE
|
|
N1B_POOL_AREA_STATE_UNDETECTED,
|
|
N1B_POOL_AREA_STATE_CELEB_LOOKING_FOR_CLOTHES,
|
|
N1B_POOL_AREA_STATE_GARDENER_INTERRUPTED,
|
|
N1B_POOL_AREA_STATE_SPOTTED,
|
|
N1B_POOL_AREA_STATE_CALL_COPS,
|
|
N1B_POOL_AREA_STATE_SURRENDERED,
|
|
N1B_POOL_AREA_STATE_FLEE
|
|
ENDENUM
|
|
|
|
/// PURPOSE: used to maintain the garden area's state
|
|
ENUM N1B_GARDEN_AREA_STATE
|
|
N1B_GARDEN_AREA_STATE_UNDETECTED,
|
|
N1B_GARDEN_AREA_STATE_SPOTTED,
|
|
N1B_GARDEN_AREA_STATE_INFORM_POOL_AREA,
|
|
N1B_GARDEN_AREA_STATE_SURRENDERED,
|
|
N1B_GARDEN_AREA_STATE_FLEE,
|
|
N1B_GARDEN_AREA_STATE_GARDENER_DEAD
|
|
ENDENUM
|
|
|
|
/// PURPOSE: used to update a ped's movement state - for use with detection system
|
|
ENUM N1B_PED_MOVEMENT_STATE
|
|
N1B_PEDMOVEMENTSTATE_COVER,
|
|
N1B_PEDMOVEMENTSTATE_STEALTH,
|
|
N1B_PEDMOVEMENTSTATE_RUNNING,
|
|
N1B_PEDMOVEMENTSTATE_SPRINTING,
|
|
N1B_PEDMOVEMENTSTATE_WALKING,
|
|
N1B_PEDMOVEMENTSTATE_IN_VEHICLE,
|
|
N1B_PEDMOVEMENTSTATE_DEFAULT
|
|
ENDENUM
|
|
|
|
/// PURPOSE: contains all of the door's which I need to control in script
|
|
ENUM N1B_MISSION_CONTROLLED_DOORS_ENUM
|
|
N1B_MCD_NORTH_GATE_01 = 0,
|
|
N1B_MCD_NORTH_GATE_02,
|
|
N1B_MCD_SOUTH_GATE_01,
|
|
N1B_MCD_SOUTH_GATE_02,
|
|
N1B_MCD_EAST_GATE_01,
|
|
N1B_MCD_WEST_GATE_01,
|
|
N1B_MAX_MISSION_CONTROLLED_DOORS
|
|
ENDENUM
|
|
|
|
// ENUM containing states for handling stopping & restarting conversation to avoid subtitles overwriting god text
|
|
// differs from RC version as this prevents god text getting override if already displaying when a conversation starts
|
|
ENUM N1B_CONV_RESTORE_STATE
|
|
N1B_CONV_IDLE,
|
|
N1B_CONV_STOP_CURRENT_CONV,
|
|
N1B_CONV_RESTART_WITHOUT_SUBS,
|
|
N1B_CONV_RESTORE_WAIT_FOR_NO_TEXT,
|
|
N1B_CONV_RESTART_WITH_SUBS
|
|
ENDENUM
|
|
|
|
/// PURPOSE: list of animations the club peds have
|
|
ENUM N1B_SYNCED_SCENE_ANIM_TYPE
|
|
N1B_SSAT_BASE_FEMALE_ONLY,
|
|
N1B_SSAT_ENTER_CELEB_ONLY,
|
|
N1B_SSAT_DANCE_INTRO,
|
|
N1B_SSAT_DANCE_LOOP,
|
|
N1B_SSAT_DANCE_OUTRO_CELEB_ONLY,
|
|
N1B_SSAT_DANCE_OUTRO_FEMALE_ONLY,
|
|
N1B_SSAT_STAND_UP_FEMALE_ONLY,
|
|
N1B_MAX_SYNCED_SCENE_ANIM_TYPE
|
|
ENDENUM
|
|
|
|
//-------------------------------------------------------------------------------------------------------------------------------------------------
|
|
// :STRUCTS
|
|
//-------------------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
/// PURPOSE: used by all scripted peds in the mission
|
|
/// AI uses N1B_PED_AI to set behaviours
|
|
STRUCT MISSION_PED
|
|
AI_BLIP_STRUCT blipAIStruct
|
|
PED_INDEX pedIndex
|
|
N1B_PED_AI AI
|
|
MODEL_NAMES model
|
|
INT iTimer
|
|
INT iAiDelayTimer
|
|
INT iFrameCountLastSeenPlayer
|
|
ENDSTRUCT
|
|
|
|
/// PURPOSE: used by all the basic objects/props in the mission
|
|
STRUCT MISSION_OBJECT
|
|
OBJECT_INDEX object
|
|
MODEL_NAMES model
|
|
VECTOR vPosition
|
|
VECTOR vRotation
|
|
FLOAT fHeading
|
|
ENDSTRUCT
|
|
|
|
/// PURPOSE: used by the pickups in the mission
|
|
/// currently using object whilst pickup type won't work see B*1516887
|
|
STRUCT STRUCT_MISSION_PICKUP
|
|
PICKUP_INDEX index
|
|
MODEL_NAMES mnModel
|
|
BLIP_INDEX blipIndex
|
|
VECTOR vPosition
|
|
PICKUP_TYPE type = PICKUP_CUSTOM_SCRIPT
|
|
INT iPlacementFlags
|
|
VECTOR vOrientation
|
|
ENDSTRUCT
|
|
|
|
//-------------------------------------------------------------------------------------------------------------------------------------------------
|
|
// :CONSTANTS
|
|
//-------------------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
CONST_FLOAT NIGEL1B_DIST_PLAYER_LEAVES_THE_HOUSE_AREA 70.0 // used to detect when the player has completed the objective to leave the area
|
|
CONST_FLOAT NIGEL1B_PLAYER_DIST_FROM_HOUSE_FOR_DIALOGUE 35.0 // dist player must be within for dialogue at house to play
|
|
CONST_FLOAT NIGEL1B_PED_SEEING_RANGE_STANDARD 18.0 // defined range for ped's seeing range - ped to see standard
|
|
CONST_FLOAT NIGEL1B_PED_SEEING_RANGE_PLAYER_STEALTH_MODE 15.0 // defined range for ped's seeing range - ped to see in stealth
|
|
CONST_FLOAT NIGEL1B_PED_SEEING_RANGE_PLAYER_RUNNING 22.0 // defined range for ped's seeing range - ped to see running
|
|
CONST_FLOAT NIGEL1B_PED_HEARING_RANGE_STANDARD 5.0 // defined range for ped's hearing range - ped to see running
|
|
CONST_FLOAT NIGEL1B_PED_HEARING_RANGE_PLAYER_STEALTH_MODE 0.0 // defined range for ped's hearing range - ped to see in stealth
|
|
CONST_FLOAT NIGEL1B_PED_HEARING_RANGE_PLAYER_RUNNING 10.0 // defined range for ped's hearing range - ped to see running
|
|
CONST_FLOAT NIGEL1B_RANGE_CELEB_PED_CLOSE_TO_CLOTHES_PICKUP 1.25 // dist from clothes pickup location celeb will try to get to
|
|
CONST_FLOAT NIGEL1B_POOL_AREA_NORTH_CIRCLE_RADIUS 5.93 // used in definition of pool area
|
|
CONST_FLOAT NIGEL1B_POOL_AREA_SOUTH_WALL_POS_AB_WIDTH 2.80 // used in definition of pool area
|
|
CONST_FLOAT NIGEL1B_POOL_AREA_SOUTH_WALL_POS_CD_WIDTH 12.50 // used in definition of pool area
|
|
CONST_FLOAT NIGEL1B_POOL_AREA_SOUTH_WALL_POS_EF_WIDTH 8.50 // used in definition of pool area
|
|
CONST_FLOAT NIGEL1B_POOL_AREA_SOUTH_WALL_POS_GH_WIDTH 4.0 // used in definition of pool area
|
|
CONST_FLOAT NIGEL1B_PED_DETECTED_CLOSEBY_WALKING_RANGE 3.5 // defined range for ped detection when ped is walking nearby
|
|
CONST_FLOAT NIGEL1B_PED_DETECTED_CLOSEBY_RUNNING_RANGE 7.0 // defined range for ped detection when ped is running nearby
|
|
CONST_FLOAT NIGEL1B_LOWEST_GROUND_Z_POSITION_AT_HOUSE 66.21 // used for the Z checks when updating the player's location
|
|
CONST_FLOAT NIGEL1B_GROUND_Z_TOLERANCE_AT_HOUSE 11.0 // used for the Z checks when updating the player's location
|
|
CONST_FLOAT NIGEL1B_DIST_LIMIT_PLAYER_TO_PED_OK_FOR_DIALOGUE 25.0
|
|
CONST_INT POOL_PED_CELEB 0 // celeb who owns the clothes
|
|
CONST_INT POOL_PED_FEMALE 1 // celeb's bird in the HOT_TUB
|
|
CONST_INT TOTAL_POOL_PEDS 2 // total number of peds in the pool area
|
|
CONST_INT TOTAL_POOL_AREA_PROPS 2 // number of scripted objects placed as dressing
|
|
CONST_INT NIGEL1B_BEATEN_UP_HEALTH_THRESHOLD 180 // health threshold for setting a ped as beaten up
|
|
CONST_INT NIGEL1B_TIMER_TILL_CELEB_LEAVES_POOL 150000000 // don't do this for now //10000
|
|
CONST_INT NIGEL1B_TIME_DELAY_FOR_POOL_PEDS_TO_CALL_COPS 10000 // timer till pool peds call the cops if the player isn't present to see it
|
|
CONST_INT NIGEL1B_TIME_DELAY_GARDENER_START_ROUTINE 12000 // gardener starts in relaxed ai state with head in back of truck, to allow player chance to sneak up on him
|
|
CONST_INT TIME_DELAY_FOR_OUTRO_PHONECALL 2500 // don't have the player call Nigel directly after losing cops
|
|
CONST_INT CAN_PED_SEE_PED_FRAME_COUNT_GRACE_PERIOD 10 // grace period in frame count for can ped see ped tests
|
|
CONST_INT CP_NIGEL1B_STEAL_ITEMS 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_NIGEL1B_ITEMS_STOLEN_LEAVE_THE_AREA 1 // 1st mission replay checkpoint : set by this script
|
|
CONST_INT CP_NIGEL1B_MISSION_PASSED 2 // 2nd mission replay checkpoint - used by shitskip
|
|
CONST_INT Z_SKIP_STEAL_CELEB_CLOTHES 0 // z skip stage
|
|
CONST_INT Z_SKIP_ITEMS_STOLEN_LEAVE_THE_AREA 1 // z skip stage
|
|
CONST_INT Z_SKIP_PLAYER_LEFT_THE_AREA 2 // z skip stage
|
|
CONST_INT Z_SKIP_OUTRO_PHONECALL 3 // z skip stage
|
|
CONST_INT Z_SKIP_MISSION_PASSED 4 // z skip stage
|
|
CONST_INT NIGEL1B_PLAYER_ON_GARDENERS_RIGHT_SIDE 1 // define to show side returned from GET_SIDE_POS_IS_TO_PED
|
|
CONST_INT NIGEL1B_REPLAY_POOL_PED_STATE 0 // index in the replay array
|
|
CONST_INT NIGEL1B_REPLAY_GARDENER_STATE 1 // index in the replay array
|
|
CONST_INT NIGEL1B_POOL_NORTH_SIDE 0 // index used in various vector arrays
|
|
CONST_INT NIGEL1B_POOL_SOUTH_SIDE 1 // index used in various vector arrays
|
|
CONST_INT NIGEL1B_TOTAL_POOL_SIDES 2 // max counter used in various vector arrays
|
|
CONST_INT NIGEL1B_MUSIC_EVENT_START 0
|
|
CONST_INT NIGEL1B_MUSIC_EVENT_WANTED 1
|
|
CONST_INT NIGEL1B_MUSIC_EVENT_COPS_LOST 2
|
|
CONST_INT NIGEL1B_MUSIC_EVENT_RESET_FLAG_ALLOW_SCORE_AND_RADIO 3
|
|
CONST_INT NIGEL1B_MUSIC_EVENT_MAX 4
|
|
CONST_INT NIGEL1B_TIME_DELAY_FOR_NEXT_RANDOM_DIALOGUE_LINE 3000
|
|
CONST_INT NUM_TREVOR_BARGE_GATE_COMMENTS 2
|
|
CONST_INT NIGEL1B_PROP_GARDENER_LEAF_BLOWER 0
|
|
CONST_INT NIGEL1B_PROP_GARDENER_TOOL_BOX 1
|
|
CONST_INT NIGEL1B_PROP_GARDENER_TOOL_RAKE 2
|
|
CONST_INT NIGEL1B_TOTAL_GARDENER_VAN_PROPS 3
|
|
//-------------------------------------------------------------------------------------------------------------------------------------------------
|
|
// :VARIABLES
|
|
//-------------------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
MISSION_STAGE eMissionStage = MISSION_STAGE_STEAL_CELEB_POSSESSIONS
|
|
MISSION_STAGE eMissionSkipTargetStage //used in mission checkpoint setup and debug stage skipping
|
|
SUB_STAGE eSubStage = SS_SETUP
|
|
g_structRCScriptArgs sRCLauncherDataLocal
|
|
structPedsForConversation sDialogue
|
|
#IF IS_DEBUG_BUILD // Mission skipping
|
|
CONST_INT MAX_SKIP_MENU_LENGTH 5
|
|
MissionStageMenuTextStruct mSkipMenu[MAX_SKIP_MENU_LENGTH]
|
|
#ENDIF
|
|
BOOL bApplyWantedLevelInScript
|
|
BOOL bCelebOkToStartPhoneConvo
|
|
BOOL bDetachedPropsInGardenVehicle
|
|
BOOL bDisplayedWantedRatingObjective
|
|
BOOL bDoneDialogueGardener_Flee
|
|
BOOL bDoneDialogueGardener_InformsPoolPeds
|
|
BOOL bDoneDialogueGardener_PlayerSaysGetLost
|
|
BOOL bDoneDialogueGardener_Spotted
|
|
BOOL bDoneDialogueGardener_Surrendered
|
|
BOOL bDoneDialogueGarden_TrevorKillsGardener
|
|
BOOL bDoneDialoguePool_CallCops
|
|
BOOL bDoneDialoguePool_CelebGetsOutPool
|
|
BOOL bDoneDialoguePool_CelebInTheHotTub
|
|
BOOL bDoneDialoguePool_CelebInTheHotTubRunOutOfLines
|
|
BOOL bDoneDialoguePool_CelebPoses
|
|
BOOL bDoneDialoguePool_CelebSeesClothesAreMissing
|
|
BOOL bDoneDialoguePool_InitialExchange
|
|
BOOL bDoneDialoguePool_InitiallySpotted
|
|
BOOL bDoneDialoguePool_Spotted
|
|
BOOL bDoneDialoguePool_Surrendered
|
|
BOOL bDoneDialogue_ItemsStolenPlayerLeftTheArea
|
|
BOOL bDoneDialogue_PlayerAcknowledgesCops
|
|
BOOL bDoneDialogue_PlayerGrabsClothes
|
|
BOOL bDoneDialogue_ShoutCallCopsWhenPlayerLeaves
|
|
BOOL bDoneDialogue_TrevorBargesLockedGate[NUM_TREVOR_BARGE_GATE_COMMENTS]
|
|
BOOL bDoneDialogue_PlayerMissedCelebCallingCops
|
|
BOOL bTrevorBargedWestGate
|
|
BOOL bTrevorBargedEastGate
|
|
BOOL bDoSwitch_PoolStateTo_CelebLookingForClothes
|
|
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 bForceHouseGatesOpenDuringGameplay
|
|
BOOL bHasCelebReachedClothesLocation
|
|
BOOL bHasCopBeenCreatedForScriptedWantedLevel
|
|
BOOL bHasOutroPhonecallSucceeded
|
|
BOOL bHaveNorthGatesBeenOpenedByPlayer
|
|
BOOL bHavePoolPedsCallTheCops
|
|
BOOL bHaveSouthGatesBeenOpenedByPlayer
|
|
BOOL bPauseDialoguePool_CelebInTheHotTub
|
|
BOOL bPlayerStoppedCelebCallingCops
|
|
BOOL bPlayerWasSpottedByGardener
|
|
BOOL bDoneDanceOutroSceneForPoolPeds[TOTAL_POOL_PEDS]
|
|
BOOL bDoneStandUpSceneForFemalePoolPed
|
|
BOOL bStoppedGardenerVanAnim
|
|
FAILED_REASON_ENUM eN1B_MissionFailedReason
|
|
FLOAT fCelebPoolSwimArrivalHeading[NIGEL1B_TOTAL_POOL_SIDES]
|
|
FLOAT fCelebPoolSwimInitialHeading[NIGEL1B_TOTAL_POOL_SIDES]
|
|
FLOAT fStepOutOfPoolHeading[NIGEL1B_TOTAL_POOL_SIDES]
|
|
//FLOAT fPedLeftPoolHeading[NIGEL1B_TOTAL_POOL_SIDES]
|
|
FLOAT fDistToPoolEdge
|
|
FLOAT fHotTubDimensionsWidth
|
|
FLOAT fPoolDimensionsWidth
|
|
INT iAdditionalSurrenderedDialoguePool_Counter
|
|
INT iCelebInPoolInitialPositionID
|
|
INT iMissionControlledDoors[N1B_MAX_MISSION_CONTROLLED_DOORS]
|
|
INT iPedID_PoolPedWhoDetectedPlayer
|
|
//INT iPoolPedId_ToUpdateInManager //ommented out for now as this is pretty slow at updating
|
|
INT iSoundID_WhistlingGardener
|
|
INT iTimer_DelayAdditionalSurrenderedDialogue
|
|
INT iTimer_DelayForPhoneTask
|
|
INT iTimer_DelayTrevorCopsDialogue
|
|
INT iTimer_PoolPedsTo_CallCops
|
|
INT iTimer_PoolStateTo_CelebLookingForClothes
|
|
INT iMissionMusicEventTriggerCounter
|
|
INT iTimer_DelayForOutroPhonecall
|
|
INT iTimer_DelayResetAudioFlag_AllowScoreAndRadio
|
|
INT iTimer_DelayGardenerSearchingVanDialogue
|
|
INT iDialogueTimer_PoolPedFlee
|
|
INT iDialogueTimer_PoolPedWaitingForCops
|
|
INT iTimer_DelayPoolPedsFleeWhenSurrendered
|
|
INT iTimer_TimeWindowForSpottedStealingClothesDialogue
|
|
INT iTimer_GardenAreaState
|
|
INT iSyncScenesID_PoolPeds[N1B_MAX_SYNCED_SCENE_ANIM_TYPE]
|
|
//INT iSyncSceneID_GardenerIdle
|
|
INT iPoolPedID_PlayerAttackedToFlee
|
|
FLOAT fHeading_PlayerMissionStart
|
|
MISSION_PED sGardenerPed
|
|
MISSION_PED sPoolPed[TOTAL_POOL_PEDS]
|
|
STRUCT_MISSION_PICKUP mpClothesPickup
|
|
MISSION_OBJECT moCelebPhone
|
|
MISSION_OBJECT moGardnerVanProps[NIGEL1B_TOTAL_GARDENER_VAN_PROPS]
|
|
MISSION_OBJECT moPoolAreaProps[TOTAL_POOL_AREA_PROPS]
|
|
MODEL_NAMES mnCelebVehicle
|
|
MODEL_NAMES mnCopCar
|
|
MODEL_NAMES mnCopPed
|
|
MODEL_NAMES mnGardenerVehicle
|
|
N1B_GARDEN_AREA_STATE eGardenAreaState
|
|
N1B_PED_MOVEMENT_STATE ePlayerMovementState
|
|
N1B_PLAYER_LOCATION ePlayerLocation
|
|
N1B_POOL_AREA_STATE ePoolAreaState
|
|
REL_GROUP_HASH relGroupPlayerEnemy
|
|
N1B_CONV_RESTORE_STATE eRestoreConversationState
|
|
SCENARIO_BLOCKING_INDEX scenarioBlockingHouse
|
|
SEQUENCE_INDEX sequenceAI
|
|
STRING sRoot_PlayerLeavesAreaDialogue //Alternative dialogue for player leaving area, based on if he was detected.
|
|
TEST_POLY tpCelebHouseArea
|
|
TEST_POLY tpGardenArea
|
|
TEXT_LABEL_23 tlPausedDialogue_CelebInTheHotTub = ""
|
|
TEXT_LABEL_63 tlAnimDict_PedAwareIdles = "rcmnigel1b@reactions"
|
|
TEXT_LABEL_63 tlAnimDict_MissionMocappedAnims = "rcmnigel1bnmt_1b"
|
|
TEXT_LABEL_23 tlDialogueRoot_PoolPedsSurrender = ""
|
|
TEXT_LABEL_23 tlDialogueRoot_PoolPedsCurrentReactionDialogue = ""
|
|
TEXT_LABEL_23 tSavedConversationRoot
|
|
TEXT_LABEL_23 tSavedConversationLabel
|
|
VECTOR vCelebGoToClothesPos
|
|
VECTOR vCelebPoolSwimGotos[NIGEL1B_TOTAL_POOL_SIDES]
|
|
VECTOR vCelebritiesHouse_CentralPoint
|
|
VECTOR vClearPedZone_HouseArea_Max
|
|
VECTOR vClearPedZone_HouseArea_Min
|
|
VECTOR vPlayerPos
|
|
VECTOR vStepOutOfPoolPos[NIGEL1B_TOTAL_POOL_SIDES]
|
|
VECTOR vPedLeftPoolPos[NIGEL1B_TOTAL_POOL_SIDES]
|
|
VECTOR vGotowardsHotTubInitialPos[NIGEL1B_TOTAL_POOL_SIDES]
|
|
VECTOR vHotTubDimensionsCentrePos
|
|
VECTOR vPoolDimensionsMinPos
|
|
VECTOR vPoolDimensionsMaxPos
|
|
//pool areas
|
|
VECTOR vPoolArea_NorthCircle_Pos
|
|
VECTOR vPoolArea_MajorityPosA
|
|
VECTOR vPoolArea_MajorityPosB
|
|
VECTOR vPoolArea_SouthWallPosA
|
|
VECTOR vPoolArea_SouthWallPosB
|
|
VECTOR vPoolArea_SouthWallPosC
|
|
VECTOR vPoolArea_SouthWallPosD
|
|
VECTOR vPoolArea_SouthWallPosE
|
|
VECTOR vPoolArea_SouthWallPosF
|
|
VECTOR vPoolArea_SouthWallPosG
|
|
VECTOR vPoolArea_SouthWallPosH
|
|
VECTOR vSyncScene_HotTub_Position
|
|
VECTOR vSyncScene_HotTub_Rotation
|
|
VECTOR vPos_PlayerMissionStart
|
|
VEHICLE_INDEX vehCelebsVehicle
|
|
VEHICLE_INDEX vehGardenerVehicle
|
|
VEHICLE_INDEX vehIndex_MissionReplayRestore
|
|
WEAPON_TYPE weaponTypeStoredCurrentEquipped = WEAPONTYPE_UNARMED
|
|
|
|
//-------------------------------------------------------------------------------------------------------------------------------------------------
|
|
// :DEBUG FUNCS / PROCS / WIDGETS
|
|
//-------------------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
WIDGET_GROUP_ID widgetGroup
|
|
BOOL bDebug_PrintMissionInfoToTTY = FALSE // needs to be false before submit!
|
|
BOOL bDebug_Display_PP_AI = FALSE // needs to be false before submit!
|
|
BOOL bDebug_DisplayPlayerLocation = FALSE
|
|
//BOOL bDebug_ActivateDebugLines = FALSE
|
|
BOOL bDebug_DoIsPlayerAtPoolChecks = FALSE
|
|
BOOL bDebug_DoIsPlayerUsingStealth = FALSE
|
|
BOOL bDebug_PrintSpottedBoolInfo = FALSE
|
|
BOOL bDebug_DoPlayerStealthModeCheck = FALSE
|
|
INT iDebug_PoolPedID_StealthCheck = 0
|
|
BOOL bDebug_DoIndividualStealthCheck = FALSE
|
|
FLOAT fDebug_DistCheckForStealth_PoolPedID[TOTAL_POOL_PEDS]
|
|
BOOL bDebug_DoIndividualDistanceCheck = FALSE
|
|
BOOL bDebug_DoGardenerStealthCheck = FALSE
|
|
FLOAT fDebug_DistCheckGardenerSpottedRange
|
|
BOOL bDebug_DoGardenerSeeHatedPedsCheck = FALSE
|
|
FLOAT fDebug_GardenerSeeingRange = 15.0
|
|
FLOAT fDebug_GardenerHearingRange = 0.0
|
|
BOOL bDebug_DoStealthCheckForAllPoolPeds = FALSE
|
|
BOOL bDebug_DoDistanceChecksForAllPoolPeds = FALSE
|
|
BOOL bDebug_PrintDistChecksForAllPoolPeds = FALSE
|
|
BOOL bDebug_UnPauseGame = FALSE
|
|
BOOL bDebug_ToggleDoSpottedPlayerChecksPause = FALSE
|
|
BOOL bDebug_TogglePRF_DisableSeeThroughChecksWhenTargeting_Gardener = FALSE
|
|
BOOL bDebug_SetupMissionToTest_Can_Ped_See_Hated_Ped = FALSE
|
|
BOOL bDebug_ToggleDoIsPlayerInWaterCheck = FALSE
|
|
BOOL bDebug_PrintCurrentPoolAreaState = FALSE
|
|
BOOL bDebug_PrintCurrentGardenAreaState = FALSE
|
|
BOOL bDebug_UpdateGardenerPropAttachmentPosAndRot = FALSE
|
|
BOOL bDebug_SetGardenerUsingPlantScenario = FALSE
|
|
BOOL bDebug_SetGardenerUsingLeafBlowerScenario = FALSE
|
|
BOOL bDebug_ClearGardenersTasks = FALSE
|
|
BOOL bDebug_AttachLeafBlowerToGardener = FALSE
|
|
BOOL bDebug_DrawSphereAroundLeafBlower = FALSE
|
|
BOOL bDebug_SetGardenerInIdleAnimAtCar = FALSE
|
|
BOOL bDebug_PrintGardenerAIState = FALSE
|
|
BOOL bDebug_SphereAroundGardener = FALSE
|
|
FLOAT fDebug_SphereAroundGardenerRadius = 1.0
|
|
BOOL bDebug_GivePlayerSilencedWeapon = FALSE
|
|
INT iDebug_GardenerVanPropIndex = 2
|
|
BOOL bDebug_SetGardenerSyncScenePosRot = FALSE
|
|
VECTOR vDebug_GardenerSyncScenePos = << -1010.89, 360.057, 70.6622 >> //= GET_ENTITY_COORDS(vehGardenerVehicle) + << 0.0, 0.0, 0.02 >>
|
|
VECTOR vDebug_GardenerSyncSceneRot = << 7.36256, -0.0311022, -28.5377 >> //= GET_ENTITY_ROTATION(vehGardenerVehicle))
|
|
|
|
/// PURPOSE:
|
|
/// My debug mission widget groups, which get created in RAG->SCRIPT
|
|
PROC SETUP_MISSION_WIDGET()
|
|
widgetGroup = START_WIDGET_GROUP("NIGEL 1B WIDGETS")
|
|
START_WIDGET_GROUP("General")
|
|
ADD_WIDGET_BOOL("TTY Toggle - Print Mission Debug Info", bDebug_PrintMissionInfoToTTY)
|
|
ADD_WIDGET_BOOL("Toggle - Print Pool Peds scripted AI TTY info into Script Mission windowg", bDebug_Display_PP_AI)
|
|
ADD_WIDGET_BOOL("bDebug_DisplayPlayerLocation", bDebug_DisplayPlayerLocation)
|
|
ADD_WIDGET_BOOL("Do is player at pool area check", bDebug_DoIsPlayerAtPoolChecks)
|
|
ADD_WIDGET_BOOL("Do is player using stealth checks", bDebug_DoIsPlayerUsingStealth)
|
|
ADD_WIDGET_BOOL("bDebug_PrintCurrentPoolAreaState", bDebug_PrintCurrentPoolAreaState)
|
|
ADD_WIDGET_BOOL("bDebug_PrintCurrentGardenAreaState", bDebug_PrintCurrentGardenAreaState)
|
|
// ADD_WIDGET_BOOL("Activate Debug Lines And Spheres", bDebug_ActivateDebugLines)
|
|
ADD_WIDGET_BOOL("Toggle printing to tty if player is classed as being in water or not", bDebug_ToggleDoIsPlayerInWaterCheck)
|
|
ADD_WIDGET_BOOL("Print Spotted Bool Info", bDebug_PrintSpottedBoolInfo)
|
|
ADD_WIDGET_BOOL("Print Gardener AI State", bDebug_PrintGardenerAIState)
|
|
ADD_WIDGET_BOOL("Give player a silenced weapon", bDebug_GivePlayerSilencedWeapon)
|
|
STOP_WIDGET_GROUP()
|
|
START_WIDGET_GROUP("Gardener setup")
|
|
ADD_WIDGET_VECTOR_SLIDER("Gardener van prop attach pos", moGardnerVanProps[iDebug_GardenerVanPropIndex].vPosition, -1000, 1000, 0.1)
|
|
ADD_WIDGET_VECTOR_SLIDER("Gardener van prop attach rot", moGardnerVanProps[iDebug_GardenerVanPropIndex].vRotation, -1000, 1000, 0.1)
|
|
ADD_WIDGET_INT_SLIDER("Set gardener van prop to update attachment", iDebug_GardenerVanPropIndex, 0, (NIGEL1B_TOTAL_GARDENER_VAN_PROPS - 1), 1)
|
|
ADD_WIDGET_BOOL("Update gardener van prop pos and rot ATTACHMENT TO van", bDebug_UpdateGardenerPropAttachmentPosAndRot)
|
|
ADD_WIDGET_BOOL("Update gardener sync scene position and rot ", bDebug_SetGardenerSyncScenePosRot)
|
|
ADD_WIDGET_VECTOR_SLIDER("Gardener sync scene pos ", vDebug_GardenerSyncScenePos, -1500, 1500, 0.1)
|
|
ADD_WIDGET_VECTOR_SLIDER("Gardener sync scene rot ", vDebug_GardenerSyncSceneRot, -1500, 1500, 0.1)
|
|
|
|
ADD_WIDGET_BOOL("Set Gardener Using Plant Scenario", bDebug_SetGardenerUsingPlantScenario)
|
|
ADD_WIDGET_BOOL("Set Gardener Using Leaf Blower Scenario", bDebug_SetGardenerUsingLeafBlowerScenario)
|
|
ADD_WIDGET_BOOL("Clear Gardeners Tasks", bDebug_ClearGardenersTasks)
|
|
ADD_WIDGET_BOOL("Attach gardener prop to van", bDebug_AttachLeafBlowerToGardener)
|
|
ADD_WIDGET_BOOL("Debug Draw Sphere Around Leaf Blower", bDebug_DrawSphereAroundLeafBlower)
|
|
ADD_WIDGET_BOOL("Set Gardener In Idle Anim At Car", bDebug_SetGardenerInIdleAnimAtCar)
|
|
ADD_WIDGET_BOOL("debug draw sphere around gardener", bDebug_SphereAroundGardener)
|
|
ADD_WIDGET_FLOAT_SLIDER("sphere around gardener radius", fDebug_SphereAroundGardenerRadius, 0, 50.0, 0.1)
|
|
STOP_WIDGET_GROUP()
|
|
START_WIDGET_GROUP("STEALTH CHECKS")
|
|
ADD_WIDGET_BOOL("bDebug_DoPlayerStealthModeCheck", bDebug_DoPlayerStealthModeCheck)
|
|
ADD_WIDGET_INT_SLIDER("POOL PED TO CHECK AGAINST - ", iDebug_PoolPedID_StealthCheck, 0, (TOTAL_POOL_PEDS - 1), 1)
|
|
ADD_WIDGET_BOOL("DO INDIVIDUAL STEALTH CHECK - ", bDebug_DoIndividualStealthCheck)
|
|
ADD_WIDGET_FLOAT_SLIDER("DISTANCE CHECK - ", fDebug_DistCheckForStealth_PoolPedID[iDebug_PoolPedID_StealthCheck], 0.0, 200.0, 0.01)
|
|
ADD_WIDGET_BOOL("DO INDIVIDUAL DISTANCE CHECK - ", bDebug_DoIndividualDistanceCheck)
|
|
ADD_WIDGET_BOOL("DO STEALTH CHECK FOR ALL - ", bDebug_DoStealthCheckForAllPoolPeds)
|
|
ADD_WIDGET_BOOL("DO DISTANCE CHECKS FOR ALL - ", bDebug_DoDistanceChecksForAllPoolPeds)
|
|
ADD_WIDGET_BOOL("PRINT DISTANCE CHECKS FOR ALL - ", bDebug_PrintDistChecksForAllPoolPeds)
|
|
ADD_WIDGET_BOOL("Do gardener stealth check", bDebug_DoGardenerStealthCheck)
|
|
ADD_WIDGET_FLOAT_SLIDER("Distance check for gardener range", fDebug_DistCheckGardenerSpottedRange, 0.0, 200.0, 0.01)
|
|
ADD_WIDGET_BOOL("Do can gardener see hated ped check", bDebug_DoGardenerSeeHatedPedsCheck)
|
|
ADD_WIDGET_FLOAT_SLIDER("Gardener seeing distance ", fDebug_GardenerSeeingRange, 0.0, 200.0, 0.01)
|
|
ADD_WIDGET_FLOAT_SLIDER("Gardener hearing distance", fDebug_GardenerHearingRange, 0.0, 200.0, 0.01)
|
|
STOP_WIDGET_GROUP()
|
|
START_WIDGET_GROUP("B*433149 - CAN_PED_SEE_HATED_PED issue")
|
|
ADD_WIDGET_BOOL("Setup Mission State to test this bug", bDebug_SetupMissionToTest_Can_Ped_See_Hated_Ped)
|
|
//Basically i use these in conjunction with the stage MISSION_STAGE_DEBUG_POOL_SETUP to test out stealth
|
|
//these appear in rag and work as followed
|
|
//toggle one of the spotted checks on
|
|
//once spotted the game will pause so you can fly the camera to that peds position to check the player was visible
|
|
//then press the uppause game tick box to get the game running again
|
|
//you'll have to set one of the these toggles back on in the widget to test again.
|
|
ADD_WIDGET_BOOL("Toggle gardener spotted player checks (will pause gameplay when CAN_PED_SEE_HATED_PED returns TRUE)", bDebug_ToggleDoSpottedPlayerChecksPause)
|
|
ADD_WIDGET_BOOL("Unpause game (use after game is paused by the gardener spotted player checks)", bDebug_UnPauseGame)
|
|
ADD_WIDGET_BOOL("Toggle PRF_DisableSeeThroughChecksWhenTargeting on the gardener", bDebug_TogglePRF_DisableSeeThroughChecksWhenTargeting_Gardener)
|
|
STOP_WIDGET_GROUP()
|
|
STOP_WIDGET_GROUP()
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// updates my mission widgets, based off RAG input
|
|
PROC MAINTAIN_MISSION_WIDGETS()
|
|
INT i
|
|
/*IF bDebug_ActivateDebugLines
|
|
SET_DEBUG_ACTIVE(TRUE)
|
|
SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE)
|
|
ELSE
|
|
SET_DEBUG_ACTIVE(FALSE)
|
|
SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(FALSE)
|
|
ENDIF*/
|
|
/*//debug teleport to pool area entrance
|
|
IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_0))
|
|
SAFE_TELEPORT_PED(PLAYER_PED_ID(), << -1038.3511, 347.9641, 69.8164 >>, 91.8594, TRUE)
|
|
#IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, " NIGEL 1B : ", "DEBUG TELEPORTED PLAYER") ENDIF #ENDIF
|
|
ENDIF*/
|
|
/*// debug fail
|
|
IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_0))
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "PRESSED KEY 0") ENDIF #ENDIF
|
|
IF IS_PED_UNINJURED(sPoolPed[0].pedIndex)
|
|
EXPLODE_PED_HEAD(sPoolPed[0].pedIndex)
|
|
SET_ENTITY_HEALTH(sPoolPed[0].pedIndex, 0)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "DEBUG - KILLED pool ped") ENDIF #ENDIF
|
|
ENDIF
|
|
ENDIF*/
|
|
IF bDebug_GivePlayerSilencedWeapon
|
|
IF IS_PED_UNINJURED(PLAYER_PED_ID())
|
|
GIVE_WEAPON_COMPONENT_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_PISTOL, WEAPONCOMPONENT_AT_PI_SUPP_02)
|
|
bDebug_GivePlayerSilencedWeapon = FALSE
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "DEBUG - given player a silenced weapon") ENDIF #ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
IF bDebug_PrintGardenerAIState
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "DEBUG - Gardener AI State = ", sGardenerPed.AI) ENDIF #ENDIF
|
|
ENDIF
|
|
IF IS_PED_UNINJURED(sGardenerPed.pedIndex)
|
|
IF bDebug_SetGardenerSyncScenePosRot
|
|
/*IF IS_VEHICLE_OK(vehGardenerVehicle)
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncSceneID_GardenerIdle)
|
|
SET_SYNCHRONIZED_SCENE_ORIGIN(iSyncSceneID_GardenerIdle, vDebug_GardenerSyncScenePos, vDebug_GardenerSyncSceneRot)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "DEBUG - bDebug_SetGardenerSyncScenePosRot updated Pos = ", vDebug_GardenerSyncScenePos, " Rot = ", vDebug_GardenerSyncSceneRot) ENDIF #ENDIF
|
|
ELIF IS_SYNCHRONIZED_SCENE_RUNNING(iNigel1B_Gardener_SyncSceneIndex)
|
|
SET_SYNCHRONIZED_SCENE_ORIGIN(iNigel1B_Gardener_SyncSceneIndex, vDebug_GardenerSyncScenePos, vDebug_GardenerSyncSceneRot)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "DEBUG - bDebug_SetGardenerSyncScenePosRot (iNigel1B_Gardener_SyncSceneIndex) updated Pos = ", vDebug_GardenerSyncScenePos, " Rot = ", vDebug_GardenerSyncSceneRot) ENDIF #ENDIF
|
|
ELSE
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "DEBUG - bDebug_SetGardenerSyncScenePosRot fail no sync scene active") ENDIF #ENDIF
|
|
ENDIF
|
|
ENDIF*/
|
|
bDebug_SetGardenerSyncScenePosRot = FALSE
|
|
ENDIF
|
|
IF bDebug_SetGardenerInIdleAnimAtCar
|
|
IF NOT IS_ENTITY_PLAYING_ANIM(sGardenerPed.pedIndex, "rcmnigel1b", "idle_gardener")
|
|
TASK_PLAY_ANIM(sGardenerPed.pedIndex, "rcmnigel1b", "idle_gardener", INSTANT_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING | AF_EXIT_AFTER_INTERRUPTED | AF_USE_KINEMATIC_PHYSICS) // B*1544302 - AF_USE_KINEMATIC_PHYSICS)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "bDebug_SetGardenerInIdleAnimAtCar anim applied") ENDIF #ENDIF
|
|
ELSE
|
|
CLEAR_PED_TASKS(sGardenerPed.pedIndex)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "bDebug_SetGardenerInIdleAnimAtCar already playing anim so cleared task instead this frame") ENDIF #ENDIF
|
|
ENDIF
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "bDebug_SetGardenerInIdleAnimAtCar done") ENDIF #ENDIF
|
|
bDebug_SetGardenerInIdleAnimAtCar = FALSE
|
|
ENDIF
|
|
IF bDebug_SetGardenerUsingPlantScenario
|
|
CLEAR_PED_TASKS(sGardenerPed.pedIndex)
|
|
IF NOT IS_PED_USING_SCENARIO(sGardenerPed.pedIndex, "WORLD_HUMAN_GARDENER_PLANT")
|
|
TASK_START_SCENARIO_IN_PLACE(sGardenerPed.pedIndex, "WORLD_HUMAN_GARDENER_PLANT", -1, TRUE)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "DEBUG - bDebug_SetGardenerUsingPlantScenario - WORLD_HUMAN_GARDENER_PLANT - set ") ENDIF #ENDIF
|
|
ENDIF
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "DEBUG - bDebug_SetGardenerUsingPlantScenario - done") ENDIF #ENDIF
|
|
bDebug_SetGardenerUsingPlantScenario = FALSE
|
|
ENDIF
|
|
IF bDebug_SetGardenerUsingLeafBlowerScenario
|
|
CLEAR_PED_TASKS(sGardenerPed.pedIndex)
|
|
IF NOT IS_PED_USING_SCENARIO(sGardenerPed.pedIndex, "WORLD_HUMAN_GARDENER_LEAF_BLOWER")
|
|
TASK_START_SCENARIO_IN_PLACE(sGardenerPed.pedIndex, "WORLD_HUMAN_GARDENER_LEAF_BLOWER", -1, TRUE)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "DEBUG - bDebug_SetGardenerUsingLeafBlowerScenario - WORLD_HUMAN_GARDENER_LEAF_BLOWER - set ") ENDIF #ENDIF
|
|
ENDIF
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "DEBUG - bDebug_SetGardenerUsingLeafBlowerScenario - done") ENDIF #ENDIF
|
|
bDebug_SetGardenerUsingLeafBlowerScenario = FALSE
|
|
ENDIF
|
|
IF bDebug_ClearGardenersTasks
|
|
CLEAR_PED_TASKS(sGardenerPed.pedIndex)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "DEBUG - bDebug_ClearGardenersTasks - done") ENDIF #ENDIF
|
|
bDebug_ClearGardenersTasks = FALSE
|
|
ENDIF
|
|
IF bDebug_SphereAroundGardener
|
|
DRAW_DEBUG_SPHERE(GET_ENTITY_COORDS(sGardenerPed.pedIndex), fDebug_SphereAroundGardenerRadius, 100, 100, 0, 100)
|
|
ENDIF
|
|
IF bDebug_AttachLeafBlowerToGardener
|
|
IF IS_ENTITY_ALIVE(moGardnerVanProps[NIGEL1B_PROP_GARDENER_LEAF_BLOWER].object)
|
|
FREEZE_ENTITY_POSITION(moGardnerVanProps[NIGEL1B_PROP_GARDENER_LEAF_BLOWER].object, FALSE)
|
|
IF IS_ENTITY_ATTACHED(moGardnerVanProps[NIGEL1B_PROP_GARDENER_LEAF_BLOWER].object)
|
|
DETACH_ENTITY(moGardnerVanProps[NIGEL1B_PROP_GARDENER_LEAF_BLOWER].object)
|
|
ENDIF
|
|
ATTACH_ENTITY_TO_ENTITY(moGardnerVanProps[NIGEL1B_PROP_GARDENER_LEAF_BLOWER].object, sGardenerPed.pedIndex, GET_PED_BONE_INDEX(sGardenerPed.pedIndex, BONETAG_PH_R_HAND),
|
|
moGardnerVanProps[NIGEL1B_PROP_GARDENER_LEAF_BLOWER].vPosition, moGardnerVanProps[NIGEL1B_PROP_GARDENER_LEAF_BLOWER].vRotation)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "DEBUG - bDebug_AttachLeafBlowerToGardener - done") ENDIF #ENDIF
|
|
bDebug_AttachLeafBlowerToGardener = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
IF bDebug_DrawSphereAroundLeafBlower
|
|
IF IS_ENTITY_ALIVE(moGardnerVanProps[NIGEL1B_PROP_GARDENER_LEAF_BLOWER].object)
|
|
DRAW_DEBUG_SPHERE(GET_ENTITY_COORDS(moGardnerVanProps[NIGEL1B_PROP_GARDENER_LEAF_BLOWER].object), 2.0, 10, 255, 0, 150)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
IF bDebug_UpdateGardenerPropAttachmentPosAndRot
|
|
IF IS_ENTITY_ALIVE(moGardnerVanProps[iDebug_GardenerVanPropIndex].object)
|
|
AND IS_ENTITY_ALIVE(vehGardenerVehicle)
|
|
FREEZE_ENTITY_POSITION(moGardnerVanProps[iDebug_GardenerVanPropIndex].object, FALSE)
|
|
IF IS_ENTITY_ATTACHED(moGardnerVanProps[iDebug_GardenerVanPropIndex].object)
|
|
DETACH_ENTITY(moGardnerVanProps[iDebug_GardenerVanPropIndex].object)
|
|
ENDIF
|
|
INT iVehicleBone = GET_ENTITY_BONE_INDEX_BY_NAME(vehGardenerVehicle, "chassis")
|
|
ATTACH_ENTITY_TO_ENTITY(moGardnerVanProps[iDebug_GardenerVanPropIndex].object, vehGardenerVehicle, iVehicleBone, moGardnerVanProps[iDebug_GardenerVanPropIndex].vPosition, moGardnerVanProps[iDebug_GardenerVanPropIndex].vRotation)
|
|
//SET_ENTITY_COORDS_NO_OFFSET(moGardnerVanProps[iDebug_GardenerVanPropIndex].vPosition)
|
|
//SET_ENTITY_ROTATION(moGardnerVanProps[iDebug_GardenerVanPropIndex].vRotation)
|
|
//FREEZE_ENTITY_POSITION(moGardnerVanProps[iDebug_GardenerVanPropIndex].object, TRUE)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "DEBUG - bDebug_UpdateGardenerPropAttachmentPosAndRot - done for iDebug_GardenerVanPropIndex =", iDebug_GardenerVanPropIndex) ENDIF #ENDIF
|
|
ENDIF
|
|
bDebug_UpdateGardenerPropAttachmentPosAndRot = FALSE
|
|
ENDIF
|
|
IF bDebug_DisplayPlayerLocation
|
|
SWITCH ePlayerLocation
|
|
CASE N1B_PLAYER_LOCATION_OUTSIDE_HOUSE_AREA
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "N1B_PLAYER_LOCATION_OUTSIDE_HOUSE_AREA") ENDIF #ENDIF
|
|
BREAK
|
|
CASE N1B_PLAYER_LOCATION_INSIDE_HOUSE_AREA
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "N1B_PLAYER_LOCATION_INSIDE_HOUSE_AREA") ENDIF #ENDIF
|
|
BREAK
|
|
CASE N1B_PLAYER_LOCATION_POOL_AREA
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "N1B_PLAYER_LOCATION_POOL_AREA") ENDIF #ENDIF
|
|
BREAK
|
|
CASE N1B_PLAYER_LOCATION_GARDEN_AREA
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "N1B_PLAYER_LOCATION_GARDEN_AREA") ENDIF #ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
IF bDebug_PrintCurrentPoolAreaState
|
|
SWITCH ePoolAreaState
|
|
CASE N1B_POOL_AREA_STATE_UNDETECTED
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "bDebug_PrintCurrentPoolAreaState - N1B_POOL_AREA_STATE_UNDETECTED") ENDIF #ENDIF
|
|
BREAK
|
|
CASE N1B_POOL_AREA_STATE_SPOTTED
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "bDebug_PrintCurrentPoolAreaState - N1B_POOL_AREA_STATE_SPOTTED") ENDIF #ENDIF
|
|
BREAK
|
|
CASE N1B_POOL_AREA_STATE_CELEB_LOOKING_FOR_CLOTHES
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "bDebug_PrintCurrentPoolAreaState - N1B_POOL_AREA_STATE_CELEB_LOOKING_FOR_CLOTHES") ENDIF #ENDIF
|
|
BREAK
|
|
CASE N1B_POOL_AREA_STATE_CALL_COPS
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "bDebug_PrintCurrentPoolAreaState - N1B_POOL_AREA_STATE_CALL_COPS") ENDIF #ENDIF
|
|
BREAK
|
|
CASE N1B_POOL_AREA_STATE_GARDENER_INTERRUPTED
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "bDebug_PrintCurrentPoolAreaState - N1B_POOL_AREA_STATE_GARDENER_INTERRUPTED") ENDIF #ENDIF
|
|
BREAK
|
|
CASE N1B_POOL_AREA_STATE_SURRENDERED
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "bDebug_PrintCurrentPoolAreaState - N1B_POOL_AREA_STATE_SURRENDERED") ENDIF #ENDIF
|
|
BREAK
|
|
CASE N1B_POOL_AREA_STATE_FLEE
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "bDebug_PrintCurrentPoolAreaState - N1B_POOL_AREA_STATE_FLEE") ENDIF #ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
IF bDebug_PrintCurrentGardenAreaState
|
|
SWITCH eGardenAreaState
|
|
CASE N1B_GARDEN_AREA_STATE_UNDETECTED
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "bDebug_PrintCurrentGardenAreaState - N1B_GARDEN_AREA_STATE_UNDETECTED") ENDIF #ENDIF
|
|
BREAK
|
|
CASE N1B_GARDEN_AREA_STATE_SPOTTED
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "bDebug_PrintCurrentGardenAreaState - N1B_GARDEN_AREA_STATE_SPOTTED") ENDIF #ENDIF
|
|
BREAK
|
|
CASE N1B_GARDEN_AREA_STATE_INFORM_POOL_AREA
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "bDebug_PrintCurrentGardenAreaState - N1B_GARDEN_AREA_STATE_INFORM_POOL_AREA") ENDIF #ENDIF
|
|
BREAK
|
|
CASE N1B_GARDEN_AREA_STATE_SURRENDERED
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "bDebug_PrintCurrentGardenAreaState - N1B_GARDEN_AREA_STATE_SURRENDERED") ENDIF #ENDIF
|
|
BREAK
|
|
CASE N1B_GARDEN_AREA_STATE_GARDENER_DEAD
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "bDebug_PrintCurrentGardenAreaState - N1B_GARDEN_AREA_STATE_GARDENER_DEAD") ENDIF #ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
IF bDebug_PrintSpottedBoolInfo
|
|
IF ePoolAreaState != N1B_POOL_AREA_STATE_UNDETECTED
|
|
AND ePoolAreaState != N1B_POOL_AREA_STATE_CELEB_LOOKING_FOR_CLOTHES
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, " TRUE - player has been spotted") ENDIF #ENDIF
|
|
ELSE
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, " FALSE - player has not been spotted") ENDIF #ENDIF
|
|
ENDIF
|
|
bDebug_PrintSpottedBoolInfo = FALSE
|
|
ENDIF
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
IF bDebug_DoStealthCheckForAllPoolPeds
|
|
FOR i = 0 TO (TOTAL_POOL_PEDS - 1)
|
|
IF IS_ENTITY_ALIVE(sPoolPed[i].pedIndex)
|
|
IF CAN_PED_SEE_HATED_PED(sPoolPed[i].pedIndex, PLAYER_PED_ID())
|
|
IF bDebug_DoDistanceChecksForAllPoolPeds
|
|
FLOAT fTempStealthDist
|
|
fTempStealthDist = VDIST(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sPoolPed[i].pedIndex))
|
|
IF (fTempStealthDist < fDebug_DistCheckForStealth_PoolPedID[i])
|
|
SWITCH i
|
|
CASE 0
|
|
DRAW_RECT(0.15, 0.1, 0.1, 0.1, 0, 0, 100, 100) //BLUE SWIM MALE
|
|
BREAK
|
|
CASE 1
|
|
DRAW_RECT(0.25, 0.1, 0.1, 0.1, 100, 0, 0, 100) //RED HOT_TUB FEMALE right as looking at them
|
|
BREAK
|
|
CASE 2
|
|
DRAW_RECT(0.35, 0.1, 0.1, 0.1, 255, 216, 0, 100) //YELLOW HOT_TUB FEMALE left as looking at them
|
|
BREAK
|
|
CASE 3
|
|
DRAW_RECT(0.45, 0.1, 0.1, 0.1, 0, 100, 0, 100) //GREEN HOT_TUB MALE
|
|
BREAK
|
|
DEFAULT
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "DEBUG STEALTH : INVALID PED ID") ENDIF #ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
IF bDebug_PrintDistChecksForAllPoolPeds
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STEALTH CHECKER - PED ID HAS CLEAR LOS TO PLAYER - ", i) ENDIF #ENDIF
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STEALTH CHECKER - AT DISTANCE OF - ", fTempStealthDist) ENDIF #ENDIF
|
|
bDebug_PrintDistChecksForAllPoolPeds = FALSE
|
|
ENDIF
|
|
ELSE
|
|
SWITCH i
|
|
CASE 0
|
|
DRAW_RECT(0.15, 0.1, 0.1, 0.1, 0, 0, 100, 100) //BLUE SWIM MALE
|
|
BREAK
|
|
CASE 1
|
|
DRAW_RECT(0.25, 0.1, 0.1, 0.1, 100, 0, 0, 100) //RED HOT_TUB FEMALE
|
|
BREAK
|
|
CASE 2
|
|
DRAW_RECT(0.35, 0.1, 0.1, 0.1, 255, 216, 0, 100) //YELLOW HOT_TUB FEMALE
|
|
BREAK
|
|
CASE 3
|
|
DRAW_RECT(0.45, 0.1, 0.1, 0.1, 0, 100, 0, 100) //GREEN HOT_TUB MALE
|
|
BREAK
|
|
DEFAULT
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "DEBUG STEALTH : INVALID PED ID") ENDIF #ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STEALTH CHECKER - PED ID HAS CLEAR LOS TO PLAYER no dist check - ", i) ENDIF #ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDFOR
|
|
ELSE
|
|
IF bDebug_DoIndividualStealthCheck
|
|
IF IS_ENTITY_ALIVE(sPoolPed[iDebug_PoolPedID_StealthCheck].pedIndex)
|
|
IF CAN_PED_SEE_HATED_PED(sPoolPed[iDebug_PoolPedID_StealthCheck].pedIndex, PLAYER_PED_ID())
|
|
IF bDebug_DoIndividualDistanceCheck
|
|
FLOAT fTempStealthDist
|
|
fTempStealthDist = VDIST(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sPoolPed[iDebug_PoolPedID_StealthCheck].pedIndex))
|
|
IF (fTempStealthDist < fDebug_DistCheckForStealth_PoolPedID[iDebug_PoolPedID_StealthCheck])
|
|
SWITCH iDebug_PoolPedID_StealthCheck
|
|
CASE 0
|
|
DRAW_RECT(0.15, 0.1, 0.1, 0.1, 0, 0, 100, 100) //BLUE SWIM MALE
|
|
BREAK
|
|
CASE 1
|
|
DRAW_RECT(0.25, 0.1, 0.1, 0.1, 100, 0, 0, 100) //RED HOT_TUB FEMALE
|
|
BREAK
|
|
CASE 2
|
|
DRAW_RECT(0.35, 0.1, 0.1, 0.1, 255, 216, 0, 100) //YELLOW HOT_TUB FEMALE
|
|
BREAK
|
|
CASE 3
|
|
DRAW_RECT(0.45, 0.1, 0.1, 0.1, 0, 100, 0, 100) //GREEN HOT_TUB MALE
|
|
BREAK
|
|
DEFAULT
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "DEBUG STEALTH : INVALID PED ID") ENDIF #ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
ELSE
|
|
SWITCH iDebug_PoolPedID_StealthCheck
|
|
CASE 0
|
|
DRAW_RECT(0.15, 0.1, 0.1, 0.1, 0, 0, 100, 100) //BLUE SWIM MALE
|
|
BREAK
|
|
CASE 1
|
|
DRAW_RECT(0.25, 0.1, 0.1, 0.1, 100, 0, 0, 100) //RED HOT_TUB FEMALE
|
|
BREAK
|
|
CASE 2
|
|
DRAW_RECT(0.35, 0.1, 0.1, 0.1, 255, 216, 0, 100) //YELLOW HOT_TUB FEMALE
|
|
BREAK
|
|
CASE 3
|
|
DRAW_RECT(0.45, 0.1, 0.1, 0.1, 0, 100, 0, 100) //GREEN HOT_TUB MALE
|
|
BREAK
|
|
DEFAULT
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "DEBUG STEALTH : INVALID PED ID") ENDIF #ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STEALTH CHECKER - PED ID HAS CLEAR LOS TO PLAYER no dist check - ", iDebug_PoolPedID_StealthCheck) ENDIF #ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
IF bDebug_DoGardenerStealthCheck
|
|
IF IS_ENTITY_ALIVE(sGardenerPed.pedIndex)
|
|
IF CAN_PED_SEE_HATED_PED(sGardenerPed.pedIndex, PLAYER_PED_ID())
|
|
FLOAT fTempStealthDist
|
|
fTempStealthDist = VDIST(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(sGardenerPed.pedIndex))
|
|
IF (fTempStealthDist < fDebug_DistCheckGardenerSpottedRange)
|
|
DRAW_RECT(0.55, 0.1, 0.1, 0.1, 178, 0, 255, 50) //PURPLE GARDENER SPOTTED
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
IF bDebug_DoGardenerSeeHatedPedsCheck
|
|
IF IS_ENTITY_ALIVE(sGardenerPed.pedIndex)
|
|
SET_PED_SEEING_RANGE(sGardenerPed.pedIndex, fDebug_GardenerSeeingRange)
|
|
SET_PED_HEARING_RANGE(sGardenerPed.pedIndex, fDebug_GardenerHearingRange)
|
|
|
|
IF CAN_PED_SEE_HATED_PED(sGardenerPed.pedIndex, PLAYER_PED_ID())
|
|
DRAW_RECT(0.65, 0.1, 0.1, 0.1, 178, 20, 200, 60)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF bDebug_ToggleDoIsPlayerInWaterCheck
|
|
IF IS_ENTITY_IN_WATER(PLAYER_PED_ID())
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "DEBUG - player is in water ++++++++++++++") ENDIF #ENDIF
|
|
ELSE
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "DEBUG - player is NOT!! in water ---------------") ENDIF #ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
IF bDebug_UnPauseGame
|
|
SET_GAME_PAUSED(FALSE)
|
|
bDebug_UnPauseGame = FALSE
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "GAME UNPAUSED") ENDIF #ENDIF
|
|
ENDIF
|
|
IF bDebug_DoPlayerStealthModeCheck
|
|
IF GET_PED_STEALTH_MOVEMENT(PLAYER_PED_ID())
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "^^^ player in stealth mode ^^^^^") ENDIF #ENDIF
|
|
ELSE
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "^^^ player NOT in stealth mode ^^^^^") ENDIF #ENDIF
|
|
ENDIF
|
|
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
|
|
ENDPROC
|
|
#ENDIF
|
|
|
|
//-------------------------------------------------------------------------------------------------------------------------------------------------
|
|
// :FUNCTIONS AND PROCEEDURES
|
|
//-------------------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
/// PURPOSE:
|
|
/// remove object from the game
|
|
/// PARAMS:
|
|
/// objectIndex - object to remove
|
|
/// bDelete - if true delete it, else set as no longer needed
|
|
PROC SAFE_REMOVE_OBJECT(OBJECT_INDEX &objectIndex, BOOL bDelete = FALSE)
|
|
IF bDelete
|
|
SAFE_DELETE_OBJECT(objectIndex)
|
|
ELSE
|
|
SAFE_RELEASE_OBJECT(objectIndex)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// removes vehicle from the world
|
|
/// PARAMS:
|
|
/// vehIndex - vehicle to be removed
|
|
/// bDelete - if true AND player isn't inside it delete it, else set as no longer needed
|
|
PROC SAFE_REMOVE_VEHICLE(VEHICLE_INDEX &vehIndex, BOOL bDelete = FALSE)
|
|
IF bDelete
|
|
SAFE_DELETE_VEHICLE(vehIndex)
|
|
ELSE
|
|
SAFE_RELEASE_VEHICLE(vehIndex)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// removes ped from the game
|
|
/// PARAMS:
|
|
/// ped - ped to be removed
|
|
/// bDelete - if true delete it, else set as no longer needed
|
|
/// bDetach - if true ped will be detached if attached, and no in a vehicle or getting into a vehicle
|
|
PROC SAFE_REMOVE_PED(PED_INDEX &ped, BOOL bDelete = FALSE)
|
|
IF bDelete
|
|
SAFE_DELETE_PED(ped)
|
|
ELSE
|
|
SAFE_RELEASE_PED(ped)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// teleport a ped to a new location
|
|
/// PARAMS:
|
|
/// pedIndex - ped to teleport
|
|
/// vPosition - position to teleport to
|
|
/// fHeading - heading to give the ped at the new location
|
|
/// bSnapToGround - if true ped will be positioned at ground level, else drops in a meter above
|
|
/// bForcePedAiAndAnimUpdate - if true FORCE_PED_AI_AND_ANIMATION_UPDATE is applied on the ped
|
|
PROC SAFE_TELEPORT_PED(PED_INDEX pedIndex, VECTOR vPosition, FLOAT fHeading = 0.0, BOOL bSnapToGround = FALSE, BOOL bForcePedAiAndAnimUpdate = FALSE)
|
|
IF IS_ENTITY_ALIVE(pedIndex)
|
|
IF bSnapToGround
|
|
vPosition.Z = INVALID_WORLD_Z
|
|
ENDIF
|
|
SET_ENTITY_COORDS(pedIndex, vPosition)
|
|
SET_ENTITY_HEADING(pedIndex, fHeading)
|
|
IF bForcePedAiAndAnimUpdate
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(pedIndex)
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// teleport a vehicle to a new location
|
|
/// PARAMS:
|
|
/// vehIndex - vehicle to teleport
|
|
/// vPosition - position to teleport to
|
|
/// fHeading - heading to give the vehicle at the new location
|
|
/// bSnapToGround - if true ped will be positioned at ground level, else drops in a meter above
|
|
PROC SAFE_TELEPORT_VEHICLE(VEHICLE_INDEX &vehIndex, VECTOR vPosition, FLOAT fHeading = 0.0, BOOL bSnapToGround = FALSE)
|
|
IF IS_ENTITY_ALIVE(vehIndex)
|
|
IF bSnapToGround
|
|
vPosition.Z = INVALID_WORLD_Z
|
|
ENDIF
|
|
SET_ENTITY_COORDS(vehIndex, vPosition)
|
|
SET_ENTITY_HEADING(vehIndex, fHeading)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Creates a blip of the correct size and colour for an object being used as a pickup
|
|
/// PARAMS:
|
|
/// vPos - where to create the blip
|
|
/// bBlipPriority - priority of the blip
|
|
/// bDisplayRoute - do we want to add a route for this blip?
|
|
/// RETURNS:
|
|
/// the blip index of the new blip (null if blip was not created
|
|
FUNC BLIP_INDEX CREATE_OBJECT_PICKUP_BLIP(ENTITY_INDEX EntityIndex, BLIP_PRIORITY bBlipPriority=BLIPPRIORITY_MED)
|
|
BLIP_INDEX bRetBlip = NULL
|
|
|
|
IF IS_ENTITY_ALIVE(EntityIndex)
|
|
bRetBlip = ADD_BLIP_FOR_ENTITY(EntityIndex)
|
|
IF DOES_BLIP_EXIST(bRetBlip)
|
|
SET_BLIP_PRIORITY(bRetBlip,bBlipPriority)
|
|
SET_BLIP_SCALE(bRetBlip, BLIP_SIZE_PICKUP)
|
|
ENDIF
|
|
ENDIF
|
|
RETURN bRetBlip
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// check if iTimeAmount has passed since iTimer was set
|
|
/// PARAMS:
|
|
/// iTimer - the timer
|
|
/// iTimeAmount - the amount of time to check has passed
|
|
/// RETURNS:
|
|
/// True is the specified amount of time has passed for the specified timer.
|
|
FUNC BOOL HAS_TIME_PASSED(INT iTimer, INT iTimeAmount)
|
|
RETURN (GET_GAME_TIMER() - iTimer) > iTimeAmount
|
|
ENDFUNC
|
|
|
|
/// Check is the specified frame count has passed using specified timer.
|
|
/// PARAMS:
|
|
/// iFrameCounterTimer - Frame Count to check.
|
|
/// iFrameAmount - Frame Count to check against.
|
|
/// RETURNS:
|
|
/// True is the specified amount of iFrameAmount has passed for the specified iFrameCounterTimer.
|
|
FUNC BOOL HAS_FRAME_COUNTER_PASSED(INT iFrameCounterTimer, INT iFrameAmount)
|
|
RETURN (GET_FRAME_COUNT() - iFrameCounterTimer) > iFrameAmount
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// simple Check to see if entity is on screen and not occluded
|
|
/// PARAMS:
|
|
/// entityIndex - entity to test
|
|
/// bCheckIsAlive - if TRUE func will test entity exists and is alive before proceeding
|
|
/// RETURNS:
|
|
/// True if entity is visible on screen
|
|
FUNC BOOL IS_ENTITY_VISIBLE_ON_SCREEN(ENTITY_INDEX entityIndex, BOOL bCheckIsAlive = TRUE)
|
|
IF bCheckIsAlive
|
|
IF NOT IS_ENTITY_ALIVE(entityIndex)
|
|
RETURN FALSE
|
|
ENDIF
|
|
ENDIF
|
|
IF IS_ENTITY_ON_SCREEN(entityIndex)
|
|
IF NOT IS_ENTITY_OCCLUDED(entityIndex)
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Test for if two coords are within fRange metres of each other
|
|
/// PARAMS:
|
|
/// v1 - first coord
|
|
/// v2 - second coord
|
|
/// fRange - distance
|
|
/// RETURNS:
|
|
/// TRUE if two coords are withing fRange of each other
|
|
FUNC BOOL IS_COORD_IN_RANGE_OF_COORD(VECTOR v1, VECTOR v2, FLOAT fRange)
|
|
RETURN VDIST2(v1, v2) <= (fRange*fRange)
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Test for if two coords 2D are within fRange metres of each other
|
|
/// PARAMS:
|
|
/// v1 - first coord
|
|
/// v2 - second coord
|
|
/// fRange - distance
|
|
/// RETURNS:
|
|
/// TRUE if two coords are withing fRange of each other in 2D
|
|
FUNC BOOL IS_COORD_IN_RANGE_OF_COORD_2D(VECTOR v1, VECTOR v2, FLOAT fRange)
|
|
VECTOR vDiff = v2 - v1
|
|
RETURN ((vDiff.x * vDiff.x) + (vDiff.y * vDiff.y)) <= (fRange * fRange)
|
|
ENDFUNC
|
|
|
|
/// 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
|
|
PROC UPDATE_PEDS_CAN_SEE_PLAYER_FRAME_COUNTER(PED_INDEX pedIndex, INT &iFrameCountLastSeenPlayer)
|
|
IF IS_ENTITY_ALIVE(pedIndex)
|
|
IF CAN_PED_SEE_PED(pedIndex, PLAYER_PED_ID())
|
|
iFrameCountLastSeenPlayer = GET_FRAME_COUNT()
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "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:
|
|
/// return a IndexID for a pool ped who is ok to speak
|
|
/// checks ped being alive and within range
|
|
/// PARAMS:
|
|
/// FLOAT fMaxDistForConvo - dist between player and ped for ped to be returned suitable, if -1.0 check is ignored
|
|
/// VECTOR vPlayerCoords - player's current position, ignored if fMaxDistForConvo test if not to be performed
|
|
/// RETURNS:
|
|
/// INT - indexID for the poolped array
|
|
FUNC INT GET_RANDOM_OK_POOL_PED_TO_SPEAK(VECTOR vPlayerCoords, FLOAT fMaxDistForConvo = -1.0)
|
|
INT i
|
|
// random pick a ped
|
|
i = GET_RANDOM_INT_IN_RANGE(0, TOTAL_POOL_PEDS)
|
|
IF IS_PED_UNINJURED(sPoolPed[i].pedIndex)
|
|
IF fMaxDistForConvo = -1.0
|
|
RETURN i
|
|
ELSE
|
|
IF IS_ENTITY_IN_RANGE_COORDS(sPoolPed[i].pedIndex, vPlayerCoords, fMaxDistForConvo)
|
|
RETURN i
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// if failed find the first avaliable ped which suits
|
|
FOR i = 0 TO (TOTAL_POOL_PEDS - 1)
|
|
IF IS_PED_UNINJURED(sPoolPed[i].pedIndex)
|
|
IF fMaxDistForConvo = -1.0
|
|
RETURN i
|
|
ELSE
|
|
IF IS_ENTITY_IN_RANGE_COORDS(sPoolPed[i].pedIndex, vPlayerCoords, fMaxDistForConvo)
|
|
RETURN i
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDFOR
|
|
RETURN -1
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// trigger a music event, whilst first checking it has been prepared (if required)
|
|
/// PARAMS:
|
|
/// sMusicEvent - the music event name
|
|
/// bRequiresPrepare - if TRUE PREPARE_MUSIC_EVENT is setup before the event can be trigger. Check the doc to see if an event needs preloading
|
|
/// RETURNS:
|
|
/// TRUE if the event is trigger successfully
|
|
FUNC BOOL SAFE_TRIGGER_MISSION_MUSIC_EVENT(STRING sMusicEvent, BOOL bRequiresPrepare = FALSE)
|
|
IF bRequiresPrepare
|
|
IF NOT PREPARE_MUSIC_EVENT(sMusicEvent)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SAFE_TRIGGER_MISSION_MUSIC_EVENT - returning FALSE, not yet prepared for = ", sMusicEvent) ENDIF #ENDIF
|
|
RETURN FALSE
|
|
ENDIF
|
|
ENDIF
|
|
IF TRIGGER_MUSIC_EVENT(sMusicEvent)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SAFE_TRIGGER_MISSION_MUSIC_EVENT - returning TRUE for = ", sMusicEvent) ENDIF #ENDIF
|
|
RETURN TRUE
|
|
ENDIF
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Register a new door with the door system
|
|
/// NOTE: code taken from Lester1A.sc
|
|
/// PARAMS:
|
|
/// eDoor - The specific door to register taken from N1B_MISSION_CONTROLLED_DOORS_ENUM
|
|
/// mnModel - the door's model name
|
|
/// vPos - the door's position
|
|
PROC REGISTER_NEW_MISSION_CONTROLLED_DOOR(N1B_MISSION_CONTROLLED_DOORS_ENUM eDoor, MODEL_NAMES mnModel, VECTOR vPos)
|
|
TEXT_LABEL_23 str_hash = "N1B_"
|
|
str_hash += ENUM_TO_INT(eDoor)
|
|
iMissionControlledDoors[eDoor] = GET_HASH_KEY(str_hash)
|
|
IF NOT IS_DOOR_REGISTERED_WITH_SYSTEM(iMissionControlledDoors[eDoor])
|
|
ADD_DOOR_TO_SYSTEM(iMissionControlledDoors[eDoor], mnModel, vPos, FALSE, TRUE) // note: useOldOverrides parameter must be set to FALSE! Default is TRUE
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "REGISTER_NEW_MISSION_CONTROLLED_DOOR - door added to the system : ", str_hash, " hash key : ", iMissionControlledDoors[eDoor], " at pos : ", vPos) ENDIF #ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Set the state of a mission controlled door which has been registered with the door system
|
|
/// PARAMS:
|
|
/// eDoor - specific door to set state taken from N1B_MISSION_CONTROLLED_DOORS_ENUM
|
|
/// eDoorState - the new door state
|
|
/// bFlushState - this should only be set true for the last command called on a door in the single frame, BUT also this should be the last call to update a door so set to TRUE by default
|
|
/// RETURNS:
|
|
/// True if door state was successfully set
|
|
FUNC BOOL SET_MISSION_CONTROLLED_DOOR_STATE(N1B_MISSION_CONTROLLED_DOORS_ENUM eDoor, DOOR_STATE_ENUM eDoorState, BOOL bFlushState = TRUE)
|
|
IF IS_DOOR_REGISTERED_WITH_SYSTEM(iMissionControlledDoors[eDoor])
|
|
DOOR_SYSTEM_SET_DOOR_STATE(iMissionControlledDoors[eDoor], eDoorState, FALSE, bFlushState)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_MISSION_CONTROLLED_DOOR_STATE - RETURN true for door :", eDoor, " set state : ", eDoorState) ENDIF #ENDIF
|
|
RETURN TRUE
|
|
ENDIF
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// get the door's state
|
|
/// RETURNS:
|
|
/// the doors state - DOOR_STATE_ENUM
|
|
FUNC DOOR_STATE_ENUM GET_DOOR_STATE(N1B_MISSION_CONTROLLED_DOORS_ENUM eDoor)
|
|
DOOR_STATE_ENUM eCurrentState
|
|
IF IS_DOOR_REGISTERED_WITH_SYSTEM(iMissionControlledDoors[eDoor])
|
|
eCurrentState = DOOR_SYSTEM_GET_DOOR_STATE(iMissionControlledDoors[eDoor])
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "GET_DOOR_STATE - for door :", eDoor, " state : ", eCurrentState) ENDIF #ENDIF
|
|
ENDIF
|
|
RETURN eCurrentState
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Set the open ratio and hold open flag on a mission controlled door which has been registered with the door system
|
|
/// PARAMS:
|
|
/// eDoor - specific door to set state taken from N1B_MISSION_CONTROLLED_DOORS_ENUM
|
|
/// fOpenRatio - 0.0 = shut, 1.0 = fully open
|
|
/// bSetHoldOpen - if the door is to hold it's open state
|
|
/// bFlushState - this should only be set true for the last command called on a door in the single frame.
|
|
/// RETURNS:
|
|
/// True if door open state was successfully set
|
|
FUNC BOOL SET_MISSION_CONTROLLED_DOOR_OPEN_RATIO(N1B_MISSION_CONTROLLED_DOORS_ENUM eDoor, FLOAT fOpenRatio = 0.0, BOOL bSetHoldOpen = FALSE, BOOL bFlushState = FALSE)
|
|
IF IS_DOOR_REGISTERED_WITH_SYSTEM(iMissionControlledDoors[eDoor])
|
|
DOOR_SYSTEM_SET_HOLD_OPEN(iMissionControlledDoors[eDoor], bSetHoldOpen)
|
|
DOOR_SYSTEM_SET_OPEN_RATIO(iMissionControlledDoors[eDoor], fOpenRatio, FALSE, bFlushState)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_MISSION_CONTROLLED_DOOR_OPEN_RATIO - RETURN true for door :", eDoor, " ratio : ", fOpenRatio, " bSetHoldOpen :", bSetHoldOpen) ENDIF #ENDIF
|
|
RETURN TRUE
|
|
ENDIF
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Check if the specific mission controlled door which has been registered with the door system is open
|
|
/// PARAMS:
|
|
/// eDoor - which specific door to test
|
|
/// RETURNS:
|
|
/// TRUE if the door's open
|
|
FUNC BOOL IS_DOOR_OPEN(N1B_MISSION_CONTROLLED_DOORS_ENUM eDoor) //, FLOAT fClosedThreshold = 0.1)
|
|
IF IS_DOOR_REGISTERED_WITH_SYSTEM(iMissionControlledDoors[eDoor])
|
|
/*// this doesn't currently work! DOOR_SYSTEM_GET_OPEN_RATIO will not update from the player pushing open the door. Added bug to get this sorted - B*
|
|
FLOAT fOpenRatio = DOOR_SYSTEM_GET_OPEN_RATIO(iMissionControlledDoors[eDoor])
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_DOOR_OPEN - for door :", eDoor, " ratio : ", fOpenRatio) ENDIF #ENDIF
|
|
IF fOpenRatio > fClosedThreshold
|
|
OR fOpenRatio < -fClosedThreshold
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_DOOR_OPEN - RETURN true for door :", eDoor, " ratio : ", fOpenRatio) ENDIF #ENDIF
|
|
RETURN TRUE
|
|
ENDIF */
|
|
IF NOT IS_DOOR_CLOSED(iMissionControlledDoors[eDoor])
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_DOOR_OPEN - RETURN true for door :", eDoor) ENDIF #ENDIF
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
/*
|
|
/// PURPOSE:
|
|
/// Check if the specific mission controlled door which has been registered with the door system is not streamed in, but it's state is pending
|
|
/// PARAMS:
|
|
/// eDoor - which specific door to test
|
|
/// RETURNS:
|
|
/// TRUE if the door's pending state is DOORSTATE_INVALID then it's not streamed in but a request to update its state when it does stream in has gone through
|
|
/// NOTE: initialised doors are set to DOORSTATE_INVALID so best to call set state first then check with this
|
|
FUNC BOOL IS_UNSTREAMED_DOOR_STATE_PENDING(N1B_MISSION_CONTROLLED_DOORS_ENUM eDoor)
|
|
IF IS_DOOR_REGISTERED_WITH_SYSTEM(iMissionControlledDoors[eDoor])
|
|
IF DOOR_SYSTEM_GET_DOOR_PENDING_STATE(iMissionControlledDoors[eDoor]) = DOORSTATE_INVALID // this means my call to set the state on an unstreamed door has gone through apparently.
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_DOOR_IN_LOCKED_STATE - RETURN true for door :", eDoor, " door not streamed in yet but pending state has been set") ENDIF #ENDIF
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
*/
|
|
/// PURPOSE:
|
|
/// Check if the specific mission controlled door which has been registered with the door system is in locked state
|
|
/// only returns correctly if the door is streamed in.
|
|
/// PARAMS:
|
|
/// eDoor - which specific door to test
|
|
/// RETURNS:
|
|
/// TRUE if the door's state is DOORSTATE_LOCKED or DOORSTATE_FORCE_LOCKED_THIS_FRAME
|
|
FUNC BOOL IS_DOOR_IN_LOCKED_STATE(N1B_MISSION_CONTROLLED_DOORS_ENUM eDoor)
|
|
DOOR_STATE_ENUM eTempState
|
|
eTempState = GET_DOOR_STATE(eDoor)
|
|
IF eTempState = DOORSTATE_LOCKED
|
|
OR eTempState = DOORSTATE_FORCE_LOCKED_THIS_FRAME // this is used to snap the door to the locked state
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_DOOR_IN_LOCKED_STATE - RETURN true for door :", eDoor, " streamed in and locked") ENDIF #ENDIF
|
|
RETURN TRUE
|
|
ENDIF
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// set the locked state of the double gates, if they haven't already been opened by the player once
|
|
/// PARAMS:
|
|
/// bSetLocked - if TRUE attempt to lock gates, else attempt to unlock gates
|
|
PROC SET_HOUSE_DOUBLE_GATES_LOCKED_STATE(BOOL bSetLocked = TRUE)
|
|
DOOR_STATE_ENUM eNewLockedState = DOORSTATE_UNLOCKED
|
|
IF bSetLocked
|
|
eNewLockedState = DOORSTATE_LOCKED
|
|
ENDIF
|
|
//unlock the gates up if they haven't been opened by the player
|
|
IF NOT bHaveNorthGatesBeenOpenedByPlayer
|
|
SET_MISSION_CONTROLLED_DOOR_OPEN_RATIO(N1B_MCD_NORTH_GATE_01, DOOR_SYSTEM_GET_OPEN_RATIO(iMissionControlledDoors[N1B_MCD_NORTH_GATE_01]), FALSE, FALSE)
|
|
SET_MISSION_CONTROLLED_DOOR_STATE(N1B_MCD_NORTH_GATE_01, eNewLockedState)
|
|
SET_MISSION_CONTROLLED_DOOR_OPEN_RATIO(N1B_MCD_NORTH_GATE_02, DOOR_SYSTEM_GET_OPEN_RATIO(iMissionControlledDoors[N1B_MCD_NORTH_GATE_02]), FALSE, FALSE)
|
|
SET_MISSION_CONTROLLED_DOOR_STATE(N1B_MCD_NORTH_GATE_02, eNewLockedState)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_LOCKED_STATE_ON_THE_HOUSE_DOUBLE_GATES north gates set : ", eNewLockedState) ENDIF #ENDIF
|
|
ENDIF
|
|
IF NOT bHaveSouthGatesBeenOpenedByPlayer
|
|
SET_MISSION_CONTROLLED_DOOR_OPEN_RATIO(N1B_MCD_SOUTH_GATE_01, DOOR_SYSTEM_GET_OPEN_RATIO(iMissionControlledDoors[N1B_MCD_SOUTH_GATE_01]), FALSE, FALSE)
|
|
SET_MISSION_CONTROLLED_DOOR_STATE(N1B_MCD_SOUTH_GATE_01, eNewLockedState)
|
|
SET_MISSION_CONTROLLED_DOOR_OPEN_RATIO(N1B_MCD_SOUTH_GATE_02, DOOR_SYSTEM_GET_OPEN_RATIO(iMissionControlledDoors[N1B_MCD_SOUTH_GATE_02]), FALSE, FALSE)
|
|
SET_MISSION_CONTROLLED_DOOR_STATE(N1B_MCD_SOUTH_GATE_02, eNewLockedState)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_LOCKED_STATE_ON_THE_HOUSE_DOUBLE_GATES south gates set : ", eNewLockedState) ENDIF #ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// monitors the north and south double gates open ratio, if one becomes open set the ajacent one to tbe open
|
|
PROC CHECK_FOR_HOUSE_DOUBLE_GATES_BEING_OPENED()
|
|
//lock the gates up if they haven't been opened when the player leaves the garden
|
|
IF NOT bHaveNorthGatesBeenOpenedByPlayer
|
|
IF IS_DOOR_OPEN(N1B_MCD_NORTH_GATE_01)
|
|
OR IS_DOOR_OPEN(N1B_MCD_NORTH_GATE_02)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CHECK_FOR_HOUSE_DOUBLE_GATES_BEING_OPENED north gates opened ") ENDIF #ENDIF
|
|
bHaveNorthGatesBeenOpenedByPlayer = TRUE
|
|
ELSE
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CHECK_FOR_HOUSE_DOUBLE_GATES_BEING_OPENED north gates not opened ") ENDIF #ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
IF NOT bHaveSouthGatesBeenOpenedByPlayer
|
|
IF IS_DOOR_OPEN(N1B_MCD_SOUTH_GATE_01)
|
|
OR IS_DOOR_OPEN(N1B_MCD_SOUTH_GATE_02)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CHECK_FOR_HOUSE_DOUBLE_GATES_BEING_OPENED south gates opened ") ENDIF #ENDIF
|
|
bHaveSouthGatesBeenOpenedByPlayer = TRUE
|
|
ELSE
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CHECK_FOR_HOUSE_DOUBLE_GATES_BEING_OPENED south gates not opened ") ENDIF #ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Check if all the house peds are dead or injured
|
|
/// RETURNS:
|
|
/// true if pool peds and gardener are
|
|
FUNC BOOL ARE_ALL_POOL_PEDS_AND_GARDENER_DEAD_OR_INJURED()
|
|
INT i
|
|
FOR i = 0 TO (TOTAL_POOL_PEDS - 1)
|
|
IF IS_PED_UNINJURED(sPoolPed[i].pedIndex)
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "ARE_ALL_POOL_PEDS_AND_GARDENER_DEAD_OR_INJURED - returned FALSE pool ped uninjured TD : ", i) ENDIF #ENDIF
|
|
RETURN FALSE
|
|
ENDIF
|
|
ENDFOR
|
|
IF IS_PED_UNINJURED(sGardenerPed.pedIndex)
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "ARE_ALL_POOL_PEDS_AND_GARDENER_DEAD_OR_INJURED - returned FALSE gardener ped uninjured TD") ENDIF #ENDIF
|
|
RETURN FALSE
|
|
ENDIF
|
|
RETURN TRUE
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Check if any of the pool peds have been killed or are classed as injured
|
|
/// RETURNS:
|
|
/// true id a pool ped has been killed / injured
|
|
FUNC BOOL HAVE_ANY_POOL_PEDS_DIED_OR_INJURED_STATE()
|
|
INT i
|
|
FOR i = 0 TO (TOTAL_POOL_PEDS - 1)
|
|
IF DOES_ENTITY_EXIST(sPoolPed[i].pedIndex)
|
|
IF IS_ENTITY_DEAD(sPoolPed[i].pedIndex)
|
|
OR IS_PED_INJURED(sPoolPed[i].pedIndex)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "HAVE_ANY_POOL_PEDS_DIED_OR_INJURED_STATE - returned TRUE") ENDIF #ENDIF
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDFOR
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// reset's the STRUCT_MISSION_PED's iTimer and iFrameCountLastSeenPlayer
|
|
PROC RESET_MISSION_PED_TIMERS()
|
|
INT i
|
|
FOR i = 0 TO (TOTAL_POOL_PEDS - 1)
|
|
sPoolPed[i].iTimer = 0
|
|
sPoolPed[i].iAiDelayTimer = 0
|
|
sPoolPed[i].iFrameCountLastSeenPlayer = 0
|
|
ENDFOR
|
|
sGardenerPed.iTimer = 0
|
|
sGardenerPed.iAiDelayTimer = 0
|
|
sGardenerPed.iFrameCountLastSeenPlayer = 0
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// check the state of the restore conversation manager
|
|
/// PARAMS:
|
|
/// tl23SpecificRootLabel - specific root to check, pass "NULL" or "" if it doesn't matter which root
|
|
/// RETURNS:
|
|
/// TRUE if convo is waiting to restore
|
|
FUNC BOOL IS_CONVERSATION_TRYING_TO_BE_RESTORED(STRING sSpecificRootLabel)
|
|
IF eRestoreConversationState = N1B_CONV_RESTART_WITHOUT_SUBS
|
|
OR eRestoreConversationState = N1B_CONV_RESTART_WITH_SUBS
|
|
IF ARE_STRINGS_EQUAL(sSpecificRootLabel, "NULL")
|
|
OR ARE_STRINGS_EQUAL(sSpecificRootLabel, "")
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_CONVERSATION_TRYING_TO_BE_RESTORED return TRUE standard check : FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
|
|
RETURN TRUE
|
|
ELSE
|
|
IF ARE_STRINGS_EQUAL(sSpecificRootLabel, tSavedConversationRoot)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_CONVERSATION_TRYING_TO_BE_RESTORED return TRUE specific root check = ", sSpecificRootLabel, " : FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_CONVERSATION_TRYING_TO_BE_RESTORED return FALSE : FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// check the state of the restore conversation manager for a specific label
|
|
/// PARAMS:
|
|
/// tl23SpecificLabel - specific label to check
|
|
/// RETURNS:
|
|
/// TRUE if convo is waiting to restore
|
|
FUNC BOOL IS_CONVERSATION_LABEL_TRYING_TO_BE_RESTORED(STRING sSpecificLabel)
|
|
IF eRestoreConversationState = N1B_CONV_RESTART_WITHOUT_SUBS
|
|
OR eRestoreConversationState = N1B_CONV_RESTART_WITH_SUBS
|
|
IF ARE_STRINGS_EQUAL(sSpecificLabel, tSavedConversationRoot)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_CONVERSATION_LABEL_TRYING_TO_BE_RESTORED return TRUE specific label check = ", sSpecificLabel, " : FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_CONVERSATION_LABEL_TRYING_TO_BE_RESTORED return FALSE : FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Checks if a specific conversation root is currently playing
|
|
/// also checks against the issue where GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_ROOT
|
|
/// can return "NULL" the first few frames after NIG1B_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK has returned true
|
|
/// PARAMS:
|
|
/// tl23ConversationRoot - the conversation root to test
|
|
/// bTestRestoreConversations - if TRUE test to see if sConversationRoot is waiting to be restored, if so return TRUE
|
|
/// RETURNS:
|
|
/// TRUE - if there is an ongoing or queued conversation with a root matching the passed in string or "NULL"
|
|
FUNC BOOL IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING(STRING sConversationRoot, BOOL bTestRestoreConversations = TRUE)
|
|
TEXT_LABEL_23 tlTempRoot
|
|
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
tlTempRoot = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_ROOT()
|
|
//if current root matches passed in string return true
|
|
IF ARE_STRINGS_EQUAL(tlTempRoot, sConversationRoot)
|
|
RETURN TRUE
|
|
ENDIF
|
|
//if current root matches null, return true
|
|
//because if the correct root isn't returned the first frame or so after NIG1B_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK has return true.
|
|
IF ARE_STRINGS_EQUAL(tlTempRoot, "NULL")
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
IF bTestRestoreConversations
|
|
IF IS_CONVERSATION_TRYING_TO_BE_RESTORED(sConversationRoot)
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Checks if a specific conversation root is currently playing
|
|
/// also checks against the issue where GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_LABEL
|
|
/// can return "NULL" the first few frames after NIG1B_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK has returned true
|
|
/// PARAMS:
|
|
/// sConversationLabel - the conversation label to test
|
|
/// bTestRestoreConversations - if TRUE test to see if sConversationLabel is waiting to be restored, if so return TRUE
|
|
/// RETURNS:
|
|
/// TRUE - if there is an ongoing or queued conversation with a label matching the passed in string or "NULL"
|
|
FUNC BOOL IS_SPECIFIC_CONVERSATION_LABEL_CURRENTLY_PLAYING(STRING sConversationLabel, BOOL bTestRestoreConversations = TRUE)
|
|
TEXT_LABEL_23 tlTempLabel
|
|
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
tlTempLabel = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_LABEL()
|
|
//if current label matches passed in string return true
|
|
IF ARE_STRINGS_EQUAL(tlTempLabel, sConversationLabel)
|
|
RETURN TRUE
|
|
ENDIF
|
|
//if current label matches null, return true
|
|
//because if the correct root isn't returned the first frame or so after NIG1B_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK has return true.
|
|
IF ARE_STRINGS_EQUAL(tlTempLabel, "NULL")
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
IF bTestRestoreConversations
|
|
IF IS_CONVERSATION_LABEL_TRYING_TO_BE_RESTORED(sConversationLabel)
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// If a scripted conversation is in progress and god text is printed, this will stop the check to avoid the dialogue subtitles overwriting the god text
|
|
PROC NIG1B_STOP_CHECKING_CONVERSATION_AND_OBJECTIVE_TEXT_CONFLICT(TEXT_LABEL_23&tConversationRoot, TEXT_LABEL_23 &tConversationLabel)
|
|
|
|
IF eRestoreConversationState != N1B_CONV_IDLE
|
|
CPRINTLN(DEBUG_MISSION, "N1B CONV CONFLICTS: Stopping check for conversation and objective text conflicts : FC = ", GET_FRAME_COUNT())
|
|
tConversationRoot = "NULL"
|
|
tConversationLabel = "NULL"
|
|
eRestoreConversationState = N1B_CONV_IDLE
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// If a scripted conversation is in progress and god text is printed, this will begin the check to avoid the dialogue subtitles overwriting the god text
|
|
PROC NIG1B_CHECK_OBJECTIVE_TEXT_OVERWRITE_ONGOING_CONVERSATION_CONFLICT_NOW()
|
|
|
|
IF GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) <> 0 // Don't do any checking if the user isn't displaying conversation subtitles anyway
|
|
AND eRestoreConversationState != N1B_CONV_STOP_CURRENT_CONV
|
|
AND IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() // IS_SCRIPTED_CONVERSATION_ONGOING()
|
|
CPRINTLN(DEBUG_MISSION, "N1B CONV CONFLICTS: NIG1B_CHECK_OBJECTIVE_TEXT_OVERWRITE_ONGOING_CONVERSATION_CONFLICT_NOW - Starting check for conversation and objective text conflicts : FC = ", GET_FRAME_COUNT())
|
|
eRestoreConversationState = N1B_CONV_STOP_CURRENT_CONV
|
|
ELSE
|
|
CPRINTLN(DEBUG_MISSION, "N1B CONV CONFLICTS: NIG1B_CHECK_OBJECTIVE_TEXT_OVERWRITE_ONGOING_CONVERSATION_CONFLICT_NOW - no conflicts found : FC = ", GET_FRAME_COUNT())
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Attempts to start dialogue using NIG1B_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK, checks that the subtitles are off in the profile settings and starts the convo without subtitles if objective text is currently being displayed
|
|
/// PARAMS:
|
|
/// YourPedStruct - the mission's conversation struct
|
|
/// WhichBlockOfTextToLoad - Thr text block the convo lives in
|
|
/// WhichRootLabel - The text root the convo lives in
|
|
/// PassedConversationPriority - the priority level of the convo
|
|
/// ShouldDisplaySubtitles - if subtitles should be displayed NOTE: if set to FALSE we don't check for a message being displayed
|
|
/// ShouldAddToBriefScreen - if the convo should print to the brief screen
|
|
/// cloneConversation - ?
|
|
/// RETURNS:
|
|
/// TRUE if the convo was created successfully
|
|
FUNC BOOL NIG1B_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(structPedsForConversation &YourPedStruct, STRING WhichBlockOfTextToLoad, STRING WhichRootLabel, enumConversationPriority PassedConversationPriority,
|
|
enumSubtitlesState ShouldDisplaySubtitles = DISPLAY_SUBTITLES, enumBriefScreenState ShouldAddToBriefScreen = DO_ADD_TO_BRIEF_SCREEN, BOOL cloneConversation = FALSE)
|
|
|
|
BOOL bSwitchedSubtitlesOffForObjective = FALSE
|
|
|
|
// if we are supposed to display subtitles, check for objective text currently being displayed, if so start the convo without subtitles
|
|
IF ShouldDisplaySubtitles = DISPLAY_SUBTITLES
|
|
IF GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) <> 0 // Don't check if the user isn't displaying conversation subtitles anyway
|
|
IF IS_MESSAGE_BEING_DISPLAYED()
|
|
bSwitchedSubtitlesOffForObjective = TRUE
|
|
ShouldDisplaySubtitles = DO_NOT_DISPLAY_SUBTITLES
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF CREATE_CONVERSATION(YourPedStruct, WhichBlockOfTextToLoad, WhichRootLabel, PassedConversationPriority, ShouldDisplaySubtitles, ShouldAddToBriefScreen, cloneConversation)
|
|
// set the convo and objective text conflict manager's state
|
|
IF bSwitchedSubtitlesOffForObjective
|
|
eRestoreConversationState = N1B_CONV_RESTORE_WAIT_FOR_NO_TEXT
|
|
CPRINTLN(DEBUG_MISSION, "NIG1B_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK: convo created : eRestoreConversationState = N1B_CONV_RESTORE_WAIT_FOR_NO_TEXT : FC = ", GET_FRAME_COUNT())
|
|
ELSE
|
|
NIG1B_STOP_CHECKING_CONVERSATION_AND_OBJECTIVE_TEXT_CONFLICT(tSavedConversationRoot, tSavedConversationLabel)
|
|
CPRINTLN(DEBUG_MISSION, "NIG1B_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK: convo created : eRestoreConversationState = ", tSavedConversationRoot, " tSavedConversationLabel = ", tSavedConversationLabel, " : FC = ", GET_FRAME_COUNT())
|
|
ENDIF
|
|
CPRINTLN(DEBUG_MISSION, "NIG1B_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK: Return TRUE : rootLabel = ", WhichRootLabel, " : FC = ", GET_FRAME_COUNT())
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Attempts to start dialogue using NIG1B_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK, checks that the subtitles are off in the profile settings and starts the convo without subtitles if objective text is currently being displayed
|
|
/// PARAMS:
|
|
/// YourPedStruct - the mission's conversation struct
|
|
/// WhichBlockOfTextToLoad - Thr text block the convo lives in
|
|
/// WhichRootLabel - The text root the convo lives in
|
|
/// WhichSpecificLabel - Which line of dialogue to start from
|
|
/// PassedConversationPriority - the priority level of the convo
|
|
/// ShouldDisplaySubtitles - if subtitles should be displayed NOTE: if set to FALSE we don't check for a message being displayed
|
|
/// ShouldAddToBriefScreen - if the convo should print to the brief screen
|
|
/// RETURNS:
|
|
/// TRUE if the convo was created successfully
|
|
FUNC BOOL NIG1B_CREATE_CONVERSATION_FROM_SPECIFIC_LINE_WITH_MESSAGE_DISPLAYED_CHECK(structPedsForConversation &YourPedStruct, STRING WhichBlockOfTextToLoad, STRING WhichRootLabel, STRING WhichSpecificLabel, enumConversationPriority PassedConversationPriority,
|
|
enumSubtitlesState ShouldDisplaySubtitles = DISPLAY_SUBTITLES, enumBriefScreenState ShouldAddToBriefScreen = DO_ADD_TO_BRIEF_SCREEN)
|
|
|
|
BOOL bSwitchedSubtitlesOffForObjective = FALSE
|
|
|
|
// if we are supposed to display subtitles, check for objective text currently being displayed, if so start the convo without subtitles
|
|
IF ShouldDisplaySubtitles = DISPLAY_SUBTITLES
|
|
IF GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) <> 0 // Don't check if the user isn't displaying conversation subtitles anyway
|
|
IF IS_MESSAGE_BEING_DISPLAYED()
|
|
bSwitchedSubtitlesOffForObjective = TRUE
|
|
ShouldDisplaySubtitles = DO_NOT_DISPLAY_SUBTITLES
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF CREATE_CONVERSATION_FROM_SPECIFIC_LINE(YourPedStruct, WhichBlockOfTextToLoad, WhichRootLabel, WhichSpecificLabel, PassedConversationPriority, ShouldDisplaySubtitles, ShouldAddToBriefScreen)
|
|
// set the convo and objective text conflict manager's state
|
|
IF bSwitchedSubtitlesOffForObjective
|
|
eRestoreConversationState = N1B_CONV_RESTORE_WAIT_FOR_NO_TEXT
|
|
CPRINTLN(DEBUG_MISSION, "NIG1B_CREATE_CONVERSATION_FROM_SPECIFIC_LINE_WITH_MESSAGE_DISPLAYED_CHECK: convo created : eRestoreConversationState = N1B_CONV_RESTORE_WAIT_FOR_NO_TEXT : FC = ", GET_FRAME_COUNT())
|
|
ELSE
|
|
NIG1B_STOP_CHECKING_CONVERSATION_AND_OBJECTIVE_TEXT_CONFLICT(tSavedConversationRoot, tSavedConversationLabel)
|
|
CPRINTLN(DEBUG_MISSION, "NIG1B_CREATE_CONVERSATION_FROM_SPECIFIC_LINE_WITH_MESSAGE_DISPLAYED_CHECK: convo created : eRestoreConversationState = N1B_CONV_IDLE : FC = ", GET_FRAME_COUNT())
|
|
ENDIF
|
|
CPRINTLN(DEBUG_MISSION, "NIG1B_CREATE_CONVERSATION_FROM_SPECIFIC_LINE_WITH_MESSAGE_DISPLAYED_CHECK: Return TRUE : rootLabel = ", WhichRootLabel,
|
|
" : WhichSpecificLabel = ", WhichSpecificLabel, " : FC = ", GET_FRAME_COUNT())
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Attempts to start dialogue using NIG1B_PLAY_SINGLE_LINE_FROM_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK, checks that the subtitles are off in the profile settings and starts the convo without subtitles if objective text is currently being displayed
|
|
/// PARAMS:
|
|
/// YourPedStruct - the mission's conversation struct
|
|
/// WhichBlockOfTextToLoad - Thr text block the convo lives in
|
|
/// WhichRootLabel - The text root the convo lives in
|
|
/// WhichSpecificLabel - the specific line we want to play
|
|
/// PassedConversationPriority - the priority level of the convo
|
|
/// ShouldDisplaySubtitles - if subtitles should be displayed NOTE: if set to FALSE we don't check for a message being displayed
|
|
/// ShouldAddToBriefScreen - if the convo should print to the brief screen
|
|
/// RETURNS:
|
|
/// TRUE if the convo was created successfully
|
|
FUNC BOOL NIG1B_PLAY_SINGLE_LINE_FROM_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(structPedsForConversation &YourPedStruct, STRING WhichBlockOfTextToLoad, STRING WhichRootLabel, STRING WhichSpecificLabel, enumConversationPriority PassedConversationPriority,
|
|
enumSubtitlesState ShouldDisplaySubtitles = DISPLAY_SUBTITLES, enumBriefScreenState ShouldAddToBriefScreen = DO_ADD_TO_BRIEF_SCREEN)
|
|
|
|
BOOL bSwitchedSubtitlesOffForObjective = FALSE
|
|
|
|
// if we are supposed to display subtitles, check for objective text currently being displayed, if so start the convo without subtitles
|
|
IF ShouldDisplaySubtitles = DISPLAY_SUBTITLES
|
|
IF GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) <> 0 // Don't check if the user isn't displaying conversation subtitles anyway
|
|
IF IS_MESSAGE_BEING_DISPLAYED()
|
|
bSwitchedSubtitlesOffForObjective = TRUE
|
|
ShouldDisplaySubtitles = DO_NOT_DISPLAY_SUBTITLES
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF PLAY_SINGLE_LINE_FROM_CONVERSATION(YourPedStruct, WhichBlockOfTextToLoad, WhichRootLabel, WhichSpecificLabel, PassedConversationPriority, ShouldDisplaySubtitles, ShouldAddToBriefScreen)
|
|
// set the convo and objective text conflict manager's state
|
|
IF bSwitchedSubtitlesOffForObjective
|
|
eRestoreConversationState = N1B_CONV_RESTORE_WAIT_FOR_NO_TEXT
|
|
CPRINTLN(DEBUG_MISSION, "NIG1B_PLAY_SINGLE_LINE_FROM_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK: convo created : eRestoreConversationState = N1B_CONV_RESTORE_WAIT_FOR_NO_TEXT : FC = ", GET_FRAME_COUNT())
|
|
ELSE
|
|
NIG1B_STOP_CHECKING_CONVERSATION_AND_OBJECTIVE_TEXT_CONFLICT(tSavedConversationRoot, tSavedConversationLabel)
|
|
CPRINTLN(DEBUG_MISSION, "NIG1B_PLAY_SINGLE_LINE_FROM_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK: convo created : eRestoreConversationState = N1B_CONV_IDLE : FC = ", GET_FRAME_COUNT())
|
|
ENDIF
|
|
CPRINTLN(DEBUG_MISSION, "NIG1B_PLAY_SINGLE_LINE_FROM_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK: Return TRUE : rootLabel = ", WhichRootLabel,
|
|
" : WhichSpecificLabel = ", WhichSpecificLabel, " : FC = ", GET_FRAME_COUNT())
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// If a scripted conversation is in progress and god text is printed, this will handle stopping & restarting the conversation without subtitles to prevent overwriting the god text, then stopping & restarting with subtitles after the text has cleared.
|
|
PROC NIG1B_HANDLE_CONVERSATION_AND_OBJECTIVE_TEXT_CONFLICT(structPedsForConversation &sConversationToUse, STRING sTextBlockToUse, TEXT_LABEL_23&tConversationRoot, TEXT_LABEL_23 &tConversationLabel)
|
|
|
|
SWITCH eRestoreConversationState
|
|
CASE N1B_CONV_IDLE
|
|
BREAK
|
|
CASE N1B_CONV_STOP_CURRENT_CONV
|
|
IF IS_SCRIPTED_CONVERSATION_ONGOING()
|
|
tConversationRoot = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_ROOT()
|
|
tConversationLabel = GET_STANDARD_CONVERSATION_LABEL_FOR_FUTURE_RESUMPTION()
|
|
IF ARE_STRINGS_EQUAL(tConversationLabel, "")
|
|
OR ARE_STRINGS_EQUAL(tConversationLabel, "NULL")
|
|
//#IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "N1B CONV CONFLICTS: N1B_CONV_STOP_CURRENT_CONV - Already last line of the conversation so not stopping it : FC = ", GET_FRAME_COUNT()) #ENDIF
|
|
//eRestoreConversationState = N1B_CONV_IDLE
|
|
ELSE
|
|
#IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "N1B CONV CONFLICTS: N1B_CONV_STOP_CURRENT_CONV - Stopping and storing conversation ", tConversationRoot, " : FC = ", GET_FRAME_COUNT()) #ENDIF
|
|
KILL_ANY_CONVERSATION()
|
|
eRestoreConversationState = N1B_CONV_RESTART_WITHOUT_SUBS
|
|
ENDIF
|
|
ELSE
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "N1B CONV CONFLICTS: N1B_CONV_STOP_CURRENT_CONV - no scripted convo ongoing : FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
|
|
ENDIF
|
|
BREAK
|
|
CASE N1B_CONV_RESTART_WITHOUT_SUBS
|
|
IF NOT IS_SCRIPTED_CONVERSATION_ONGOING()
|
|
IF IS_MESSAGE_BEING_DISPLAYED() // Re-check to see if the god text has since gone offscreen
|
|
IF NIG1B_CREATE_CONVERSATION_FROM_SPECIFIC_LINE_WITH_MESSAGE_DISPLAYED_CHECK(sConversationToUse, sTextBlockToUse, tConversationRoot, tConversationLabel, CONV_PRIORITY_HIGH, DO_NOT_DISPLAY_SUBTITLES)
|
|
#IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "N1B CONV CONFLICTS: N1B_CONV_RESTART_WITHOUT_SUBS - Restoring conversation ", tConversationRoot, " from label ", tConversationLabel, " without subtitles : FC = ", GET_FRAME_COUNT()) #ENDIF
|
|
eRestoreConversationState = N1B_CONV_RESTORE_WAIT_FOR_NO_TEXT
|
|
ENDIF
|
|
ELSE
|
|
#IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "N1B CONV CONFLICTS: N1B_CONV_RESTART_WITHOUT_SUBS - God text removed before last line of dialogue was finished, so just restart with subtitles : FC = ", GET_FRAME_COUNT()) #ENDIF
|
|
eRestoreConversationState = N1B_CONV_RESTART_WITH_SUBS
|
|
ENDIF
|
|
ELSE
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "N1B CONV CONFLICTS: N1B_CONV_RESTART_WITHOUT_SUBS - no convo ongoing or queued : FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
|
|
ENDIF
|
|
BREAK
|
|
CASE N1B_CONV_RESTORE_WAIT_FOR_NO_TEXT
|
|
IF NOT IS_MESSAGE_BEING_DISPLAYED()
|
|
AND IS_SCRIPTED_CONVERSATION_ONGOING()
|
|
tConversationRoot = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_ROOT()
|
|
tConversationLabel = GET_STANDARD_CONVERSATION_LABEL_FOR_FUTURE_RESUMPTION()
|
|
IF ARE_STRINGS_EQUAL(tConversationLabel, "")
|
|
OR ARE_STRINGS_EQUAL(tConversationLabel, "NULL")
|
|
#IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "N1B CONV CONFLICTS: N1B_CONV_RESTART_WITHOUT_SUBS - Already last line of the conversation so not stopping it") #ENDIF
|
|
ELSE
|
|
#IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "N1B CONV CONFLICTS: N1B_CONV_RESTART_WITHOUT_SUBS - Stopping and storing conversation ", tConversationRoot) #ENDIF
|
|
KILL_ANY_CONVERSATION()
|
|
eRestoreConversationState = N1B_CONV_RESTART_WITH_SUBS
|
|
ENDIF
|
|
ELSE
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "N1B CONV CONFLICTS: N1B_CONV_RESTORE_WAIT_FOR_NO_TEXT - mesaage being displayed or no convo ongoing this frame FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
|
|
ENDIF
|
|
BREAK
|
|
CASE N1B_CONV_RESTART_WITH_SUBS
|
|
IF NOT IS_SCRIPTED_CONVERSATION_ONGOING()
|
|
AND NIG1B_CREATE_CONVERSATION_FROM_SPECIFIC_LINE_WITH_MESSAGE_DISPLAYED_CHECK(sConversationToUse, sTextBlockToUse, tConversationRoot, tConversationLabel, CONV_PRIORITY_HIGH, DISPLAY_SUBTITLES)
|
|
#IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "N1B CONV CONFLICTS: N1B_CONV_RESTART_WITHOUT_SUBS - Restoring conversation ", tConversationRoot, " from label ", tConversationLabel, " with subtitles : FC = ", GET_FRAME_COUNT()) #ENDIF
|
|
eRestoreConversationState = N1B_CONV_IDLE
|
|
ELSE
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "N1B CONV CONFLICTS: N1B_CONV_RESTART_WITH_SUBS - crete convo failed this frame or convo still ongoing or queued : FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// makes call to kill the current conversation and reset the convo/objective text conflict state
|
|
/// PARAMS:
|
|
/// bFinishCurrentLine - if true current dialogue line will be allowed to play out
|
|
/// bKillPhoneConversation - if true KILL_PHONE_CONVERSATION() is called
|
|
PROC N1B_KILL_CURRENT_CONVERSATION(BOOL bFinishCurrentLine = TRUE, BOOL bKillPhoneConversation = FALSE)
|
|
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
IF bFinishCurrentLine
|
|
KILL_ANY_CONVERSATION()
|
|
ELSE
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
ENDIF
|
|
ENDIF
|
|
IF bKillPhoneConversation
|
|
KILL_PHONE_CONVERSATION()
|
|
ENDIF
|
|
NIG1B_STOP_CHECKING_CONVERSATION_AND_OBJECTIVE_TEXT_CONFLICT(tSavedConversationRoot, tSavedConversationLabel)
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Test the float values are similar with in the specified threshold
|
|
/// PARAMS:
|
|
/// v1 -
|
|
/// v2 -
|
|
/// fTolerance -
|
|
/// RETURNS:
|
|
/// TRUE if the difference in the float values is less than or equal to fTolerance
|
|
FUNC BOOL ARE_FLOAT_VALUES_SIMILAR(FLOAT f1, FLOAT f2, FLOAT fTolerance)
|
|
FLOAT fDiff = ABSF(f1 - f2)
|
|
IF fDiff <= fTolerance
|
|
RETURN TRUE
|
|
ENDIF
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// takes care of detaching the props I spawn in the back of the gardener's van
|
|
/// for example if the player starts driving the vehicle away
|
|
PROC DETACH_PROPS_INSIDE_GARDENER_VEHICLE()
|
|
IF NOT bDetachedPropsInGardenVehicle
|
|
IF IS_ENTITY_ALIVE(moGardnerVanProps[NIGEL1B_PROP_GARDENER_LEAF_BLOWER].object)
|
|
IF IS_ENTITY_ATTACHED(moGardnerVanProps[NIGEL1B_PROP_GARDENER_LEAF_BLOWER].object)
|
|
IF NOT IS_ENTITY_ALIVE(vehGardenerVehicle)
|
|
DETACH_ENTITY(moGardnerVanProps[NIGEL1B_PROP_GARDENER_LEAF_BLOWER].object)
|
|
SET_ENTITY_DYNAMIC(moGardnerVanProps[NIGEL1B_PROP_GARDENER_LEAF_BLOWER].object, TRUE)
|
|
SET_ENTITY_CAN_BE_DAMAGED(moGardnerVanProps[NIGEL1B_PROP_GARDENER_LEAF_BLOWER].object, TRUE)
|
|
//APPLY_FORCE_TO_ENTITY(moGardnerVanProps[NIGEL1B_PROP_GARDENER_LEAF_BLOWER].object, APPLY_TYPE_EXTERNAL_IMPULSE, << 0.0, 0.0, -1.0 >>, << 0.0, 0.0, 0.0 >>, 0, TRUE, TRUE, TRUE)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "DETACH_PROPS_INSIDE_GARDENER_VEHICLE - bDetachedPropsInGardenVehicle true - vehicles is no good") ENDIF #ENDIF
|
|
ELSE
|
|
IF NOT ARE_VECTORS_ALMOST_EQUAL(GET_ENTITY_VELOCITY(vehGardenerVehicle), << 0.0, 0.0, 0.0 >>, 5.0)
|
|
DETACH_ENTITY(moGardnerVanProps[NIGEL1B_PROP_GARDENER_LEAF_BLOWER].object)
|
|
SET_ENTITY_DYNAMIC(moGardnerVanProps[NIGEL1B_PROP_GARDENER_LEAF_BLOWER].object, TRUE)
|
|
SET_ENTITY_CAN_BE_DAMAGED(moGardnerVanProps[NIGEL1B_PROP_GARDENER_LEAF_BLOWER].object, TRUE)
|
|
APPLY_FORCE_TO_ENTITY(moGardnerVanProps[NIGEL1B_PROP_GARDENER_LEAF_BLOWER].object, APPLY_TYPE_EXTERNAL_IMPULSE, << 0.0, 1.5, 0.2 >>, << 0.0, 0.0, 0.0 >>, 0, TRUE, TRUE, TRUE)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "DETACH_PROPS_INSIDE_GARDENER_VEHICLE - bDetachedPropsInGardenVehicle true - vehicle moved") ENDIF #ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
//SET_ENTITY_CAN_BE_DAMAGED(moGardnerVanProps[NIGEL1B_PROP_GARDENER_LEAF_BLOWER].object, TRUE)
|
|
//SET_ENTITY_DYNAMIC(moGardnerVanProps[NIGEL1B_PROP_GARDENER_LEAF_BLOWER].object, TRUE)
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "DETACH_PROPS_INSIDE_GARDENER_VEHICLE - bDetachedPropsInGardenVehicle true - entity already detached") ENDIF #ENDIF
|
|
//bDetachedPropsInGardenVehicle = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// used to check which side of a position is a ped
|
|
/// NOTE: doesn't check ped is alive / valid
|
|
/// PARAMS:
|
|
/// pedIndex - ped to test
|
|
/// vPos - position to test
|
|
/// RETURNS:
|
|
/// Int depicting the side of the ped the pos is. -1 = Left side, 1 = Right side, 0 = directly in line
|
|
FUNC INT GET_SIDE_POS_IS_TO_PED(PED_INDEX pedIndex, VECTOR vPos)
|
|
VECTOR vRightOffset
|
|
vRightOffset = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(pedIndex, << 3.0, 0.0, 0.0 >>)
|
|
VECTOR vPedCoords = GET_ENTITY_COORDS(pedIndex)
|
|
vRightOffset -= vPedCoords
|
|
NORMALISE_VECTOR(vRightOffset)
|
|
FLOAT fSide = DOT_PRODUCT(vPos - vPedCoords, vRightOffset)
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, DEBUG_MISSION, "GET_SIDE_POS_IS_TO_PED returning - ", fSide) ENDIF #ENDIF
|
|
IF (fSide < 0)
|
|
RETURN 0 //left side
|
|
ELIF (fSide > 0)
|
|
RETURN 1 //right side
|
|
ENDIF
|
|
RETURN -1 // directly in line
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// convert a TEXT_LABEL into type STRING
|
|
/// PARAMS:
|
|
/// tlTextLabel - the text label to convert
|
|
/// RETURNS:
|
|
/// STRING
|
|
FUNC STRING N1B_CONVERT_TEXT_LABEL_TO_STRING_FORMAT(STRING tlTextLabel)
|
|
RETURN(tlTextLabel)
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// get the anim string for the specified ped's anim type
|
|
/// PARAMS:
|
|
/// iPoolPedIndex - the specific ped
|
|
/// eWhichAnim - the anim type
|
|
/// RETURNS:
|
|
/// TEXT_LABEL_23 name of the anim
|
|
FUNC TEXT_LABEL_23 GET_POOL_SYNC_ANIM_NAME(INT iPoolPedIndex, N1B_SYNCED_SCENE_ANIM_TYPE eWhichAnim)
|
|
|
|
TEXT_LABEL_23 tlAnimName = ""
|
|
|
|
SWITCH eWhichAnim
|
|
CASE N1B_SSAT_BASE_FEMALE_ONLY
|
|
tlAnimName = "BASE_"
|
|
BREAK
|
|
CASE N1B_SSAT_ENTER_CELEB_ONLY
|
|
tlAnimName = "ENTER"
|
|
BREAK
|
|
CASE N1B_SSAT_DANCE_INTRO
|
|
tlAnimName = "DANCE_INTRO_"
|
|
BREAK
|
|
CASE N1B_SSAT_DANCE_LOOP
|
|
tlAnimName = "DANCE_LOOP_"
|
|
BREAK
|
|
CASE N1B_SSAT_DANCE_OUTRO_CELEB_ONLY
|
|
FALLTHRU
|
|
CASE N1B_SSAT_DANCE_OUTRO_FEMALE_ONLY
|
|
tlAnimName = "REACT_"
|
|
BREAK
|
|
CASE N1B_SSAT_STAND_UP_FEMALE_ONLY
|
|
tlAnimName = "OUTRO_"
|
|
BREAK
|
|
DEFAULT
|
|
SCRIPT_ASSERT("Nigel1B.sc : GET_POOL_SYNC_ANIM_NAME invalid parameter eWhichAnim")
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
TEXT_LABEL_23 tlPedExtention = ""
|
|
|
|
SWITCH iPoolPedIndex
|
|
CASE POOL_PED_CELEB
|
|
tlPedExtention = "TYLER"
|
|
BREAK
|
|
CASE POOL_PED_FEMALE
|
|
tlPedExtention = "GIRL"
|
|
BREAK
|
|
DEFAULT
|
|
SCRIPT_ASSERT("Nigel1B.sc : GET_POOL_SYNC_ANIM_NAME invalid parameter iPoolPedIndex")
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
tlAnimName += tlPedExtention
|
|
|
|
// celeb enter anim is the only one to not following the naming convention so override
|
|
IF eWhichAnim = N1B_SSAT_ENTER_CELEB_ONLY
|
|
tlAnimName = "ENTER"
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "GET_POOL_SYNC_ANIM_NAME - RETURN TEXT_LABEL_23 ", tlAnimName, " for ped ID : ", iPoolPedIndex) ENDIF #ENDIF
|
|
|
|
RETURN tlAnimName
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// task the pool peds to use the specific anim
|
|
/// PARAMS:
|
|
/// iPoolPedIndex - the specific ped
|
|
/// eWhichAnim - which animation they should be using
|
|
PROC SET_SPECIFIC_POOL_PED_SYNCED_ANIM(INT iPoolPedIndex, INT iSyncedSceneID, N1B_SYNCED_SCENE_ANIM_TYPE eWhichAnim, FLOAT fBlendInDelta = NORMAL_BLEND_IN)
|
|
|
|
IF IS_PED_UNINJURED(sPoolPed[iPoolPedIndex].pedIndex)
|
|
TEXT_LABEL_23 tlSyncedAnimName = GET_POOL_SYNC_ANIM_NAME(iPoolPedIndex, eWhichAnim)
|
|
STRING sSyncedAnimName = N1B_CONVERT_TEXT_LABEL_TO_STRING_FORMAT(tlSyncedAnimName)
|
|
|
|
IF IS_ENTITY_PLAYING_ANIM(sPoolPed[iPoolPedIndex].pedIndex, tlAnimDict_MissionMocappedAnims, sSyncedAnimName)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_SPECIFIC_PED_SYNCED_ANIM - already playing anim : ", sSyncedAnimName, " for ped ID :", iPoolPedIndex) ENDIF #ENDIF
|
|
ELSE
|
|
IF IsPedPerformingTask(sPoolPed[iPoolPedIndex].pedIndex, SCRIPT_TASK_SYNCHRONIZED_SCENE)
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(sPoolPed[iPoolPedIndex].pedIndex, NORMAL_BLEND_OUT, FALSE)
|
|
ENDIF
|
|
TASK_SYNCHRONIZED_SCENE(sPoolPed[iPoolPedIndex].pedIndex, iSyncedSceneID, tlAnimDict_MissionMocappedAnims, sSyncedAnimName, fBlendInDelta, NORMAL_BLEND_OUT,
|
|
SYNCED_SCENE_ABORT_ON_WEAPON_DAMAGE | SYNCED_SCENE_USE_PHYSICS) // SYNCED_SCENE_ACTIVATE_RAGDOLL_ON_COLLISION
|
|
// B*1380462 only allow force ped update if we aren't stage skipping as it can get called on subsequent frames which fires assert
|
|
IF bFinishedStageSkipping
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(sPoolPed[iPoolPedIndex].pedIndex)
|
|
ENDIF
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_SPECIFIC_PED_SYNCED_ANIM - set anim : ", sSyncedAnimName, " for ped ID :", iPoolPedIndex) ENDIF #ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// task the pool peds to use the specific anim
|
|
/// PARAMS:
|
|
/// eWhichAnim - which animation they should be using
|
|
PROC SET_POOL_PEDS_SYNCED_ANIM(N1B_SYNCED_SCENE_ANIM_TYPE eWhichAnim)
|
|
|
|
// don't allow the synched scene to go through if its already running
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncScenesID_PoolPeds[eWhichAnim])
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_POOL_PEDS_SYNCED_ANIM - requested sync scene already running : ", eWhichAnim) ENDIF #ENDIF
|
|
EXIT
|
|
ENDIF
|
|
|
|
INT i
|
|
BOOL bLoopedScene = FALSE
|
|
BOOL bHoldLastFrameScene = FALSE
|
|
FLOAT fBlendInDelta = NORMAL_BLEND_IN
|
|
|
|
SWITCH eWhichAnim
|
|
CASE N1B_SSAT_BASE_FEMALE_ONLY
|
|
bLoopedScene = TRUE
|
|
bHoldLastFrameScene = FALSE
|
|
BREAK
|
|
CASE N1B_SSAT_ENTER_CELEB_ONLY
|
|
bLoopedScene = FALSE
|
|
bHoldLastFrameScene = FALSE
|
|
fBlendInDelta = SLOW_BLEND_IN
|
|
BREAK
|
|
CASE N1B_SSAT_DANCE_INTRO
|
|
bLoopedScene = FALSE
|
|
bHoldLastFrameScene = FALSE
|
|
fBlendInDelta = SLOW_BLEND_IN
|
|
BREAK
|
|
CASE N1B_SSAT_DANCE_LOOP
|
|
bLoopedScene = TRUE
|
|
bHoldLastFrameScene = FALSE
|
|
BREAK
|
|
CASE N1B_SSAT_DANCE_OUTRO_CELEB_ONLY
|
|
bLoopedScene = FALSE
|
|
bHoldLastFrameScene = FALSE
|
|
fBlendInDelta = SLOW_BLEND_IN
|
|
BREAK
|
|
CASE N1B_SSAT_DANCE_OUTRO_FEMALE_ONLY
|
|
bLoopedScene = FALSE
|
|
bHoldLastFrameScene = FALSE
|
|
fBlendInDelta = SLOW_BLEND_IN
|
|
BREAK
|
|
CASE N1B_SSAT_STAND_UP_FEMALE_ONLY
|
|
bLoopedScene = FALSE
|
|
bHoldLastFrameScene = FALSE
|
|
fBlendInDelta = SLOW_BLEND_IN
|
|
BREAK
|
|
DEFAULT
|
|
SCRIPT_ASSERT("Nigel1B.sc : SET_POOL_PEDS_SYNCED_ANIM invalid parameter eWhichAnim")
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
iSyncScenesID_PoolPeds[eWhichAnim] = CREATE_SYNCHRONIZED_SCENE(vSyncScene_HotTub_Position, vSyncScene_HotTub_Rotation)
|
|
SET_SYNCHRONIZED_SCENE_LOOPED(iSyncScenesID_PoolPeds[eWhichAnim], bLoopedScene)
|
|
SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(iSyncScenesID_PoolPeds[eWhichAnim], bHoldLastFrameScene)
|
|
|
|
FOR i = 0 TO (TOTAL_POOL_PEDS - 1)
|
|
// only female these scenes
|
|
IF eWhichAnim = N1B_SSAT_BASE_FEMALE_ONLY
|
|
OR eWhichAnim = N1B_SSAT_DANCE_OUTRO_FEMALE_ONLY
|
|
OR eWhichAnim = N1B_SSAT_STAND_UP_FEMALE_ONLY
|
|
IF i = POOL_PED_FEMALE
|
|
SET_SPECIFIC_POOL_PED_SYNCED_ANIM(i, iSyncScenesID_PoolPeds[eWhichAnim], eWhichAnim, fBlendInDelta)
|
|
ENDIF
|
|
ELIF eWhichAnim = N1B_SSAT_ENTER_CELEB_ONLY
|
|
OR eWhichAnim = N1B_SSAT_DANCE_OUTRO_CELEB_ONLY
|
|
IF i = POOL_PED_CELEB
|
|
SET_SPECIFIC_POOL_PED_SYNCED_ANIM(i, iSyncScenesID_PoolPeds[eWhichAnim], eWhichAnim, fBlendInDelta)
|
|
ENDIF
|
|
ELSE
|
|
SET_SPECIFIC_POOL_PED_SYNCED_ANIM(i, iSyncScenesID_PoolPeds[eWhichAnim], eWhichAnim, fBlendInDelta)
|
|
ENDIF
|
|
ENDFOR
|
|
ENDPROC
|
|
|
|
/// 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:
|
|
/// Ensures all the gates at the house are shut and locked for the start of the mission
|
|
/// RETURNS:
|
|
/// TRUE when all doors are in closed state
|
|
FUNC BOOL ARE_ALL_GATES_SHUT_FOR_START_OF_THE_MISSION()
|
|
BOOL bAllGatesLocked = TRUE
|
|
//IF NOT IS_UNSTREAMED_DOOR_STATE_PENDING(N1B_MCD_NORTH_GATE_01)
|
|
IF IS_DOOR_OPEN(N1B_MCD_NORTH_GATE_01)
|
|
OR NOT IS_DOOR_IN_LOCKED_STATE(N1B_MCD_NORTH_GATE_01)
|
|
SET_MISSION_CONTROLLED_DOOR_OPEN_RATIO(N1B_MCD_NORTH_GATE_01, 0.0, FALSE, FALSE)
|
|
SET_MISSION_CONTROLLED_DOOR_STATE(N1B_MCD_NORTH_GATE_01, DOORSTATE_FORCE_LOCKED_THIS_FRAME)
|
|
bAllGatesLocked = FALSE
|
|
ENDIF
|
|
//ENDIF
|
|
//IF NOT IS_UNSTREAMED_DOOR_STATE_PENDING(N1B_MCD_NORTH_GATE_02)
|
|
IF IS_DOOR_OPEN(N1B_MCD_NORTH_GATE_02)
|
|
OR NOT IS_DOOR_IN_LOCKED_STATE(N1B_MCD_NORTH_GATE_02)
|
|
SET_MISSION_CONTROLLED_DOOR_OPEN_RATIO(N1B_MCD_NORTH_GATE_02, 0.0, FALSE, FALSE)
|
|
SET_MISSION_CONTROLLED_DOOR_STATE(N1B_MCD_NORTH_GATE_02, DOORSTATE_FORCE_LOCKED_THIS_FRAME)
|
|
bAllGatesLocked = FALSE
|
|
ENDIF
|
|
//ENDIF
|
|
//IF NOT IS_UNSTREAMED_DOOR_STATE_PENDING(N1B_MCD_SOUTH_GATE_01)
|
|
IF IS_DOOR_OPEN(N1B_MCD_SOUTH_GATE_01)
|
|
OR NOT IS_DOOR_IN_LOCKED_STATE(N1B_MCD_SOUTH_GATE_01)
|
|
SET_MISSION_CONTROLLED_DOOR_OPEN_RATIO(N1B_MCD_SOUTH_GATE_01, 0.0, FALSE, FALSE)
|
|
SET_MISSION_CONTROLLED_DOOR_STATE(N1B_MCD_SOUTH_GATE_01, DOORSTATE_FORCE_LOCKED_THIS_FRAME)
|
|
bAllGatesLocked = FALSE
|
|
ENDIF
|
|
//ENDIF
|
|
//IF NOT IS_UNSTREAMED_DOOR_STATE_PENDING(N1B_MCD_SOUTH_GATE_02)
|
|
IF IS_DOOR_OPEN(N1B_MCD_SOUTH_GATE_02)
|
|
OR NOT IS_DOOR_IN_LOCKED_STATE(N1B_MCD_SOUTH_GATE_02)
|
|
SET_MISSION_CONTROLLED_DOOR_OPEN_RATIO(N1B_MCD_SOUTH_GATE_02, 0.0, FALSE, FALSE)
|
|
SET_MISSION_CONTROLLED_DOOR_STATE(N1B_MCD_SOUTH_GATE_02, DOORSTATE_FORCE_LOCKED_THIS_FRAME)
|
|
bAllGatesLocked = FALSE
|
|
ENDIF
|
|
//ENDIF
|
|
//IF NOT IS_UNSTREAMED_DOOR_STATE_PENDING(N1B_MCD_EAST_GATE_01)
|
|
IF IS_DOOR_OPEN(N1B_MCD_EAST_GATE_01)
|
|
OR NOT IS_DOOR_IN_LOCKED_STATE(N1B_MCD_EAST_GATE_01)
|
|
SET_MISSION_CONTROLLED_DOOR_OPEN_RATIO(N1B_MCD_EAST_GATE_01, 0.0, FALSE, FALSE)
|
|
SET_MISSION_CONTROLLED_DOOR_STATE(N1B_MCD_EAST_GATE_01, DOORSTATE_FORCE_LOCKED_THIS_FRAME)
|
|
bAllGatesLocked = FALSE
|
|
ENDIF
|
|
//ENDIF
|
|
//IF NOT IS_UNSTREAMED_DOOR_STATE_PENDING(N1B_MCD_WEST_GATE_01)
|
|
IF IS_DOOR_OPEN(N1B_MCD_WEST_GATE_01)
|
|
OR NOT IS_DOOR_IN_LOCKED_STATE(N1B_MCD_WEST_GATE_01)
|
|
SET_MISSION_CONTROLLED_DOOR_OPEN_RATIO(N1B_MCD_WEST_GATE_01, 0.0, FALSE, FALSE)
|
|
SET_MISSION_CONTROLLED_DOOR_STATE(N1B_MCD_WEST_GATE_01, DOORSTATE_FORCE_LOCKED_THIS_FRAME)
|
|
bAllGatesLocked = FALSE
|
|
ENDIF
|
|
//ENDIF
|
|
IF bAllGatesLocked
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "ARE_ALL_GATES_SHUT_FOR_START_OF_THE_MISSION() return TRUE") ENDIF #ENDIF
|
|
RETURN TRUE
|
|
ENDIF
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// general mission setup which affects the world, such as clear areas
|
|
PROC SETUP_WORLD_STATE_FOR_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)
|
|
|
|
//remove stuff we don't want around the pool - vehicles, peds, objects, blood decals
|
|
SET_PED_NON_CREATION_AREA(vClearPedZone_HouseArea_Min, vClearPedZone_HouseArea_Max) // make sure any value changes are reflected in the initial scene setup!
|
|
scenarioBlockingHouse = ADD_SCENARIO_BLOCKING_AREA(vClearPedZone_HouseArea_Min, vClearPedZone_HouseArea_Max) // make sure any value changes are reflected in the initial scene setup!
|
|
|
|
SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(vClearPedZone_HouseArea_Min, vClearPedZone_HouseArea_Max, FALSE)
|
|
|
|
// only do it here for replays / z skips
|
|
// clear areas which would normally get missed since they occur in the launcher's SETUP_AREA_FOR_MISSION
|
|
IF IS_REPLAY_IN_PROGRESS()
|
|
OR IS_REPEAT_PLAY_ACTIVE()
|
|
OR IS_REPLAY_BEING_SET_UP()
|
|
OR NOT bFinishedStageSkipping
|
|
REMOVE_VEHICLES_FROM_GENERATORS_IN_AREA(vClearPedZone_HouseArea_Min, vClearPedZone_HouseArea_Max)
|
|
CLEAR_AREA(vCelebritiesHouse_CentralPoint, 35.0, TRUE) // extended to fix bug 1042629 - Blood stain persisted after retry
|
|
CLEAR_AREA_OF_VEHICLES(vCelebritiesHouse_CentralPoint, 27.0, FALSE)
|
|
CLEAR_AREA_OF_PEDS(vCelebritiesHouse_CentralPoint, 27.0)
|
|
CPRINTLN(DEBUG_MISSION, "SETUP_WORLD_STATE_FOR_MISSION - simulated SETUP_AREA_FOR_MISSION for replay / skip")
|
|
ENDIF
|
|
|
|
// for bug 922367 having to call set state on these doors first then check their state and reapply if not set up right
|
|
// apparently when a door is initialised its pending state is set to invalid so thats the issue here
|
|
SET_MISSION_CONTROLLED_DOOR_OPEN_RATIO(N1B_MCD_NORTH_GATE_01, 0.0, FALSE, FALSE)
|
|
SET_MISSION_CONTROLLED_DOOR_STATE(N1B_MCD_NORTH_GATE_01, DOORSTATE_FORCE_LOCKED_THIS_FRAME)
|
|
SET_MISSION_CONTROLLED_DOOR_OPEN_RATIO(N1B_MCD_NORTH_GATE_02, 0.0, FALSE, FALSE)
|
|
SET_MISSION_CONTROLLED_DOOR_STATE(N1B_MCD_NORTH_GATE_02, DOORSTATE_FORCE_LOCKED_THIS_FRAME)
|
|
SET_MISSION_CONTROLLED_DOOR_OPEN_RATIO(N1B_MCD_SOUTH_GATE_01, 0.0, FALSE, FALSE)
|
|
SET_MISSION_CONTROLLED_DOOR_STATE(N1B_MCD_SOUTH_GATE_01, DOORSTATE_FORCE_LOCKED_THIS_FRAME)
|
|
SET_MISSION_CONTROLLED_DOOR_OPEN_RATIO(N1B_MCD_SOUTH_GATE_02, 0.0, FALSE, FALSE)
|
|
SET_MISSION_CONTROLLED_DOOR_STATE(N1B_MCD_SOUTH_GATE_02, DOORSTATE_FORCE_LOCKED_THIS_FRAME)
|
|
SET_MISSION_CONTROLLED_DOOR_OPEN_RATIO(N1B_MCD_EAST_GATE_01, 0.0, FALSE, FALSE)
|
|
SET_MISSION_CONTROLLED_DOOR_STATE(N1B_MCD_EAST_GATE_01, DOORSTATE_FORCE_LOCKED_THIS_FRAME)
|
|
SET_MISSION_CONTROLLED_DOOR_OPEN_RATIO(N1B_MCD_WEST_GATE_01, 0.0, FALSE, FALSE)
|
|
SET_MISSION_CONTROLLED_DOOR_STATE(N1B_MCD_WEST_GATE_01, DOORSTATE_FORCE_LOCKED_THIS_FRAME)
|
|
/*
|
|
WHILE NOT ARE_ALL_GATES_SHUT_FOR_START_OF_THE_MISSION()
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SETUP_WORLD_STATE_FOR_MISSION - ARE_ALL_GATES_SHUT_FOR_START_OF_THE_MISSION() returning FALSE") ENDIF #ENDIF
|
|
WAIT(0)
|
|
ENDWHILE
|
|
*/
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// requests and checks the pool area props' models have loaded
|
|
/// RETURNS:
|
|
/// true if all prop models have loaded
|
|
FUNC BOOL HAVE_POOL_AREA_PROP_MODELS_LOADED()
|
|
INT i
|
|
FOR i = 0 TO (TOTAL_POOL_AREA_PROPS - 1)
|
|
REQUEST_MODEL(moPoolAreaProps[i].model)
|
|
ENDFOR
|
|
FOR i = 0 TO (TOTAL_POOL_AREA_PROPS - 1)
|
|
IF NOT HAS_MODEL_LOADED(moPoolAreaProps[i].model)
|
|
RETURN FALSE
|
|
ENDIF
|
|
ENDFOR
|
|
RETURN TRUE
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// requests and checks the gardener's van props' models have loaded
|
|
/// RETURNS:
|
|
/// true if all prop models have loaded
|
|
FUNC BOOL HAVE_GARDENER_VAN_PROP_MODELS_LOADED()
|
|
INT i
|
|
FOR i = 0 TO (NIGEL1B_TOTAL_GARDENER_VAN_PROPS - 1)
|
|
REQUEST_MODEL(moGardnerVanProps[i].model)
|
|
ENDFOR
|
|
FOR i = 0 TO (NIGEL1B_TOTAL_GARDENER_VAN_PROPS - 1)
|
|
IF NOT HAS_MODEL_LOADED(moGardnerVanProps[i].model)
|
|
RETURN FALSE
|
|
ENDIF
|
|
ENDFOR
|
|
RETURN TRUE
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Requests and waits for the mission assets to load
|
|
PROC LOAD_MISSION_ASSETS()
|
|
REQUEST_MODEL(mpClothesPickup.mnModel)
|
|
REQUEST_MODEL(sPoolPed[POOL_PED_CELEB].model)
|
|
REQUEST_MODEL(sPoolPed[POOL_PED_FEMALE].model)
|
|
REQUEST_MODEL(sGardenerPed.model)
|
|
REQUEST_MODEL(mnCelebVehicle)
|
|
REQUEST_MODEL(mnGardenerVehicle)
|
|
REQUEST_ANIM_DICT("rcmnigel1b")
|
|
REQUEST_ANIM_DICT(tlAnimDict_MissionMocappedAnims)
|
|
REQUEST_SCRIPT_AUDIO_BANK("NIGEL_1B_WHISTLES")
|
|
REQUEST_ADDITIONAL_TEXT("NIGEL1B", MISSION_TEXT_SLOT)
|
|
WHILE NOT HAVE_POOL_AREA_PROP_MODELS_LOADED()
|
|
OR NOT HAVE_GARDENER_VAN_PROP_MODELS_LOADED()
|
|
OR NOT HAS_MODEL_LOADED(mpClothesPickup.mnModel)
|
|
OR NOT HAS_MODEL_LOADED(sPoolPed[POOL_PED_CELEB].model)
|
|
OR NOT HAS_MODEL_LOADED(sPoolPed[POOL_PED_FEMALE].model)
|
|
OR NOT HAS_MODEL_LOADED(sGardenerPed.model)
|
|
OR NOT HAS_MODEL_LOADED(mnCelebVehicle)
|
|
OR NOT HAS_MODEL_LOADED(mnGardenerVehicle)
|
|
OR NOT HAS_ANIM_DICT_LOADED("rcmnigel1b")
|
|
OR NOT HAS_ANIM_DICT_LOADED(tlAnimDict_MissionMocappedAnims)
|
|
OR NOT REQUEST_SCRIPT_AUDIO_BANK("NIGEL_1B_WHISTLES")
|
|
OR NOT HAS_ADDITIONAL_TEXT_LOADED(MISSION_TEXT_SLOT)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "loading mission assets") ENDIF #ENDIF
|
|
WAIT(0)
|
|
ENDWHILE
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// initial values for all the mission variables
|
|
PROC SET_MISSION_VARIABLES()
|
|
INT i = 0
|
|
bApplyWantedLevelInScript = FALSE
|
|
bDisplayedWantedRatingObjective = FALSE
|
|
bDoneDialogue_ItemsStolenPlayerLeftTheArea = FALSE
|
|
bDoneDialogue_PlayerGrabsClothes = FALSE
|
|
bDoneDialoguePool_Spotted = FALSE
|
|
bDoneDialoguePool_InitiallySpotted = FALSE
|
|
bDoneDialoguePool_CallCops = FALSE
|
|
bDoneDialoguePool_Surrendered = FALSE
|
|
bDoneDialoguePool_InitialExchange = FALSE
|
|
bDoneDialogue_PlayerAcknowledgesCops = FALSE
|
|
bHasCopBeenCreatedForScriptedWantedLevel = FALSE
|
|
bHasOutroPhonecallSucceeded = FALSE
|
|
bHaveNorthGatesBeenOpenedByPlayer = FALSE
|
|
bHaveSouthGatesBeenOpenedByPlayer = FALSE
|
|
bDetachedPropsInGardenVehicle = FALSE
|
|
bDoneDialogueGardener_Spotted = FALSE
|
|
bDoneDialogueGardener_PlayerSaysGetLost = FALSE
|
|
bDoneDialogueGardener_Surrendered = FALSE
|
|
bDoneDialogueGardener_InformsPoolPeds = FALSE
|
|
bDoneDialogueGarden_TrevorKillsGardener = FALSE
|
|
bDoneDialoguePool_CelebGetsOutPool = FALSE
|
|
bDoneDialoguePool_CelebSeesClothesAreMissing = FALSE
|
|
bDoneDialoguePool_CelebInTheHotTub = FALSE
|
|
bDoneDialoguePool_CelebInTheHotTubRunOutOfLines = FALSE
|
|
bDoneDialoguePool_CelebPoses = FALSE
|
|
bDoneDialogueGardener_Flee = FALSE
|
|
bDoneDialogue_ShoutCallCopsWhenPlayerLeaves = FALSE
|
|
FOR i = 0 TO (NUM_TREVOR_BARGE_GATE_COMMENTS - 1)
|
|
bDoneDialogue_TrevorBargesLockedGate[i] = FALSE
|
|
ENDFOR
|
|
bDoneDialogue_PlayerMissedCelebCallingCops = TRUE // only swapped to false if it's needed
|
|
bTrevorBargedWestGate = FALSE
|
|
bTrevorBargedEastGate = FALSE
|
|
bDoSwitch_PoolStateTo_CelebLookingForClothes = FALSE
|
|
bForceHouseGatesOpenDuringGameplay = FALSE
|
|
bHasCelebReachedClothesLocation = FALSE
|
|
bHavePoolPedsCallTheCops = FALSE
|
|
bCelebOkToStartPhoneConvo = FALSE
|
|
bPlayerStoppedCelebCallingCops = FALSE
|
|
bPlayerWasSpottedByGardener = FALSE
|
|
FOR i = 0 TO (TOTAL_POOL_PEDS - 1)
|
|
bDoneDanceOutroSceneForPoolPeds[i] = FALSE
|
|
ENDFOR
|
|
bDoneStandUpSceneForFemalePoolPed = FALSE
|
|
bStoppedGardenerVanAnim = FALSE
|
|
bPauseDialoguePool_CelebInTheHotTub = FALSE
|
|
eN1B_MissionFailedReason = FAILED_DEFAULT
|
|
ePlayerLocation = N1B_PLAYER_LOCATION_OUTSIDE_HOUSE_AREA
|
|
eGardenAreaState = N1B_GARDEN_AREA_STATE_UNDETECTED
|
|
ePlayerMovementState = N1B_PEDMOVEMENTSTATE_DEFAULT
|
|
ePoolAreaState = N1B_POOL_AREA_STATE_UNDETECTED
|
|
fCelebPoolSwimInitialHeading[NIGEL1B_POOL_NORTH_SIDE] = 148.84
|
|
fCelebPoolSwimInitialHeading[NIGEL1B_POOL_SOUTH_SIDE] = 23.67
|
|
fCelebPoolSwimArrivalHeading[NIGEL1B_POOL_NORTH_SIDE] = 6.24
|
|
fCelebPoolSwimArrivalHeading[NIGEL1B_POOL_SOUTH_SIDE] = 165.10
|
|
fStepOutOfPoolHeading[NIGEL1B_POOL_NORTH_SIDE] = -4.80
|
|
fStepOutOfPoolHeading[NIGEL1B_POOL_SOUTH_SIDE] = -170.96
|
|
//fPedLeftPoolHeading[NIGEL1B_POOL_NORTH_SIDE] =
|
|
//fPedLeftPoolHeading[NIGEL1B_POOL_SOUTH_SIDE] =
|
|
fHotTubDimensionsWidth = 2.0
|
|
fPoolDimensionsWidth = 5.5
|
|
fDistToPoolEdge = 2.4 // 2.3
|
|
iAdditionalSurrenderedDialoguePool_Counter = 0
|
|
iCelebInPoolInitialPositionID = NIGEL1B_POOL_SOUTH_SIDE
|
|
//iPoolPedId_ToUpdateInManager = 0 //ommented out for now as this is pretty slow at updating
|
|
iTimer_PoolStateTo_CelebLookingForClothes = 0
|
|
iTimer_PoolPedsTo_CallCops = -1
|
|
iMissionMusicEventTriggerCounter = 0
|
|
iTimer_DelayResetAudioFlag_AllowScoreAndRadio = 0
|
|
iTimer_DelayForOutroPhonecall = 0
|
|
iTimer_DelayGardenerSearchingVanDialogue = 0
|
|
iDialogueTimer_PoolPedFlee = 0
|
|
iDialogueTimer_PoolPedWaitingForCops = 0
|
|
iTimer_DelayPoolPedsFleeWhenSurrendered = 0
|
|
iTimer_TimeWindowForSpottedStealingClothesDialogue = 0
|
|
iTimer_GardenAreaState = 0
|
|
FOR i = 0 TO (ENUM_TO_INT(N1B_MAX_SYNCED_SCENE_ANIM_TYPE) - 1)
|
|
iSyncScenesID_PoolPeds[i] = -1
|
|
ENDFOR
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(sRCLauncherDataLocal.iSyncSceneIndex)
|
|
iSyncScenesID_PoolPeds[N1B_SSAT_BASE_FEMALE_ONLY] = sRCLauncherDataLocal.iSyncSceneIndex
|
|
CPRINTLN(DEBUG_MISSION, " Update sync scene handle from TAKE_OWNERSHIP_OF_SYNCHRONIZED_SCENE : sRCLauncherDataLocal.iSyncSceneIndex = ", sRCLauncherDataLocal.iSyncSceneIndex,
|
|
" iSyncScenesID_PoolPeds[N1B_SSAT_BASE_FEMALE_ONLY] = ", iSyncScenesID_PoolPeds[N1B_SSAT_BASE_FEMALE_ONLY])
|
|
ENDIF
|
|
//iSyncSceneID_GardenerIdle = -1
|
|
iPoolPedID_PlayerAttackedToFlee = -1
|
|
iPedID_PoolPedWhoDetectedPlayer = POOL_PED_CELEB //default to the main ped at the pool
|
|
iSoundID_WhistlingGardener = GET_SOUND_ID()
|
|
iTimer_DelayForPhoneTask = 0
|
|
iTimer_DelayTrevorCopsDialogue = 0
|
|
iTimer_DelayAdditionalSurrenderedDialogue = 0
|
|
fHeading_PlayerMissionStart = 40.9431
|
|
sRoot_PlayerLeavesAreaDialogue = "NULL"
|
|
vCelebritiesHouse_CentralPoint = << -1035.73, 365.44, 68.91 >> // << -1041.35, 362.76, 68.91 >>
|
|
vCelebGoToClothesPos = <<-1051.5638, 369.6159, 68.9137>>
|
|
vClearPedZone_HouseArea_Min = << -1073.19, 342.05, 63.328316 >>
|
|
vClearPedZone_HouseArea_Max = << -966.24, 411.05, 84.820435 >>
|
|
vPoolArea_NorthCircle_Pos = << -1058.74, 378.36, 68.97 >>
|
|
vPoolArea_MajorityPosA = << -1064.68, 378.42, 67.0 >>
|
|
vPoolArea_MajorityPosB = << -1039.15, 351.76, 75.0 >>
|
|
vPoolArea_SouthWallPosA = <<-1041.712402,348.062195,66.916428>>
|
|
vPoolArea_SouthWallPosB = <<-1036.664429,347.773102,75.363640>>
|
|
vPoolArea_SouthWallPosC = <<-1047.452026,347.567963,66.914040>>
|
|
vPoolArea_SouthWallPosD = <<-1046.709595,353.177917,73.917915>>
|
|
vPoolArea_SouthWallPosE = <<-1057.541626,348.667389,66.914093>>
|
|
vPoolArea_SouthWallPosF = <<-1057.282471,352.616150,73.913872>>
|
|
vPoolArea_SouthWallPosG = <<-1063.374146,350.395935,66.913910>>
|
|
vPoolArea_SouthWallPosH = <<-1061.651123,352.834503,73.815926>>
|
|
vCelebPoolSwimGotos[NIGEL1B_POOL_NORTH_SIDE] = << -1054.42, 368.18, 68.35 >>
|
|
vCelebPoolSwimGotos[NIGEL1B_POOL_SOUTH_SIDE] = << -1054.70, 355.94, 68.35 >>
|
|
vStepOutOfPoolPos[NIGEL1B_POOL_NORTH_SIDE] = << -1053.9471, 370.4447, 68.6948 >>
|
|
vStepOutOfPoolPos[NIGEL1B_POOL_SOUTH_SIDE] = << -1054.2603, 353.4767, 68.6948 >>
|
|
vPedLeftPoolPos[NIGEL1B_POOL_NORTH_SIDE] = << -1054.0918, 373.4720, 68.9138 >>
|
|
vPedLeftPoolPos[NIGEL1B_POOL_SOUTH_SIDE] = << -1054.130, 350.572, 68.913 >>
|
|
vHotTubDimensionsCentrePos = <<-1059.450684,361.982147,69.786629>>
|
|
vPoolDimensionsMinPos = <<-1054.633423,353.726318,67.444794>>
|
|
vPoolDimensionsMaxPos = <<-1054.807007,370.001160,69.429314>>
|
|
vGotowardsHotTubInitialPos[NIGEL1B_POOL_NORTH_SIDE] = << -1059.84460, 366.60718, 69.75161 >>
|
|
vGotowardsHotTubInitialPos[NIGEL1B_POOL_SOUTH_SIDE] = << -1059.64185, 357.37802, 69.75161 >>
|
|
vSyncScene_HotTub_Position = << -1059.000, 360.976, 69.0 >>
|
|
vSyncScene_HotTub_Rotation = << -0.000, 0.000, -1.080 >>
|
|
vPos_PlayerMissionStart = <<-1011.8854, 346.9502, 69.2904>>
|
|
|
|
// ensure any values changes are updated in the mission script to keep in sync
|
|
sPoolPed[POOL_PED_CELEB].model = IG_TYLERDIX
|
|
sPoolPed[POOL_PED_FEMALE].model = A_F_Y_BEACH_01
|
|
sGardenerPed.model = S_M_M_GARDENER_01
|
|
mpClothesPickup.vPosition = << -1050.03, 368.95, 69.29 >> // original << -1045.2437, 367.4617, 68.9128 >>
|
|
mpClothesPickup.vOrientation = << 0.0, 0.0, -11.27 >>
|
|
mpClothesPickup.mnModel = Prop_nigel_bag_pickup //PROP_BEACH_BAG_01B
|
|
// only needed if we switch over to pickup_index, currently object_index
|
|
mpClothesPickup.type = PICKUP_CUSTOM_SCRIPT
|
|
mpClothesPickup.iPlacementFlags = 0
|
|
SET_BIT(mpClothesPickup.iPlacementFlags, ENUM_TO_INT(PLACEMENT_FLAG_SNAP_TO_GROUND))
|
|
SET_BIT(mpClothesPickup.iPlacementFlags, ENUM_TO_INT(PLACEMENT_FLAG_ORIENT_TO_GROUND))
|
|
SET_BIT(mpClothesPickup.iPlacementFlags, ENUM_TO_INT(PLACEMENT_FLAG_FIXED))
|
|
SET_BIT(mpClothesPickup.iPlacementFlags, ENUM_TO_INT(PLACEMENT_FLAG_UPRIGHT))
|
|
|
|
mnCelebVehicle = COMET2
|
|
mnGardenerVehicle = SPEEDO
|
|
moPoolAreaProps[0].model = PROP_BEACH_RING_01
|
|
moPoolAreaProps[0].vPosition = << -1047.42, 370.22, 69.09 >>
|
|
moPoolAreaProps[0].fHeading = 38.2398
|
|
moPoolAreaProps[0].vRotation = << -0.57, -0.15, 92.03 >>
|
|
moPoolAreaProps[1].model = PROP_BEACHBALL_01
|
|
moPoolAreaProps[1].vPosition = << -1051.1575, 368.6751, 68.9139 >>
|
|
moPoolAreaProps[1].vRotation = << 0.0, 0.0, 90.0 >>
|
|
moPoolAreaProps[1].fHeading = 53.2741
|
|
//moPoolAreaProps[2].model = PROP_BBQ_1
|
|
//moPoolAreaProps[2].vPosition = <<-1046.099976,360.130005,68.910004>>
|
|
//moPoolAreaProps[2].vRotation = <<0.000000,0.000000,-135.000000>>
|
|
//moPoolAreaProps[2].fHeading = -135.000000
|
|
moGardnerVanProps[NIGEL1B_PROP_GARDENER_LEAF_BLOWER].model = PROP_LEAF_BLOWER_01
|
|
moGardnerVanProps[NIGEL1B_PROP_GARDENER_LEAF_BLOWER].vPosition = << -0.3, -2.4, 0.16 >>
|
|
moGardnerVanProps[NIGEL1B_PROP_GARDENER_LEAF_BLOWER].vRotation = << 0.0, 0.0, 75.0 >>
|
|
moGardnerVanProps[NIGEL1B_PROP_GARDENER_TOOL_BOX].model = PROP_TOOL_BOX_01
|
|
moGardnerVanProps[NIGEL1B_PROP_GARDENER_TOOL_BOX].vPosition = << 0.3, -0.8, -0.15 >>
|
|
moGardnerVanProps[NIGEL1B_PROP_GARDENER_TOOL_BOX].vRotation = << 0.0, 0.0, 325.0 >>
|
|
moGardnerVanProps[NIGEL1B_PROP_GARDENER_TOOL_RAKE].model = PROP_TOOL_RAKE
|
|
moGardnerVanProps[NIGEL1B_PROP_GARDENER_TOOL_RAKE].vPosition = << -0.2, -0.9, -0.1 >>
|
|
moGardnerVanProps[NIGEL1B_PROP_GARDENER_TOOL_RAKE].vRotation = << 270.0, 180.0, 20.0 >>
|
|
moCelebPhone.model = P_AMB_PHONE_01
|
|
moCelebPhone.vPosition = << 0.0, 0.0, 0.0 >>
|
|
moCelebPhone.vRotation = << 0.0, 0.0, 0.0 >>
|
|
mnCopCar = POLICE
|
|
mnCopPed = S_M_Y_COP_01
|
|
tlPausedDialogue_CelebInTheHotTub = ""
|
|
tlAnimDict_PedAwareIdles = "rcmnigel1b@reactions"
|
|
tlAnimDict_MissionMocappedAnims = "rcmnigel1bnmt_1b"
|
|
weaponTypeStoredCurrentEquipped = WEAPONTYPE_UNARMED
|
|
// Setup mission controlled doors
|
|
REGISTER_NEW_MISSION_CONTROLLED_DOOR(N1B_MCD_NORTH_GATE_01, PROP_LRGGATE_01_L, << -1011.63, 367.21, 72.24 >>)
|
|
REGISTER_NEW_MISSION_CONTROLLED_DOOR(N1B_MCD_NORTH_GATE_02, PROP_LRGGATE_01_R, << -1006.89, 364.48, 72.24 >>)
|
|
REGISTER_NEW_MISSION_CONTROLLED_DOOR(N1B_MCD_SOUTH_GATE_01, PROP_LRGGATE_01_L, << -1017.81, 351.32, 70.66 >>)
|
|
REGISTER_NEW_MISSION_CONTROLLED_DOOR(N1B_MCD_SOUTH_GATE_02, PROP_LRGGATE_01_R, << -1012.49, 352.58, 70.66 >>)
|
|
REGISTER_NEW_MISSION_CONTROLLED_DOOR(N1B_MCD_EAST_GATE_01, PROP_LRGGATE_03B_LD, << -1040.49, 384.38, 69.92 >>)
|
|
REGISTER_NEW_MISSION_CONTROLLED_DOOR(N1B_MCD_WEST_GATE_01, PROP_LRGGATE_03B_LD, << -1056.19, 382.26, 69.72 >>)
|
|
//HouseArea Poly Check - used by IS_PED_IN_HOUSE_AREA()
|
|
OPEN_TEST_POLY(tpCelebHouseArea) //from most north east point, running clockwise
|
|
ADD_TEST_POLY_VERT(tpCelebHouseArea, << -987.81, 363.85, 71.32 >>)
|
|
ADD_TEST_POLY_VERT(tpCelebHouseArea, << -988.15, 352.77, 71.03 >>)
|
|
ADD_TEST_POLY_VERT(tpCelebHouseArea, << -1030.05, 342.06, 67.88 >>)
|
|
ADD_TEST_POLY_VERT(tpCelebHouseArea, << -1071.70, 346.33, 66.21 >>) // this is the lower z position for the garden area, if changed update NIGEL1B_LOWEST_GROUND_Z_POSITION_AT_HOUSE
|
|
ADD_TEST_POLY_VERT(tpCelebHouseArea, << -1070.97, 379.39, 67.96 >>)
|
|
ADD_TEST_POLY_VERT(tpCelebHouseArea, << -1067.30, 387.20, 67.82 >>)
|
|
ADD_TEST_POLY_VERT(tpCelebHouseArea, << -1059.75, 390.57, 67.96 >>)
|
|
ADD_TEST_POLY_VERT(tpCelebHouseArea, << -1030.35, 392.35, 69.34 >>)
|
|
ADD_TEST_POLY_VERT(tpCelebHouseArea, << -1016.20, 378.02, 70.67 >>)
|
|
ADD_TEST_POLY_VERT(tpCelebHouseArea, << -1006.00, 370.87, 71.04 >>)
|
|
CLOSE_TEST_POLY(tpCelebHouseArea) //must be called once verts have been added.
|
|
//Garden Area Poly Check - used by IS_PED_IN_GARDEN_AREA()
|
|
OPEN_TEST_POLY(tpGardenArea) //from most north point, running clockwise
|
|
ADD_TEST_POLY_VERT(tpGardenArea, << -1025.32, 380.54, 70.79 >>)
|
|
ADD_TEST_POLY_VERT(tpGardenArea, << -1020.40, 375.87, 70.38 >>)
|
|
ADD_TEST_POLY_VERT(tpGardenArea, << -1012.08, 369.80, 71.10 >>)
|
|
ADD_TEST_POLY_VERT(tpGardenArea, << -1011.78, 367.31, 71.12 >>)
|
|
ADD_TEST_POLY_VERT(tpGardenArea, << -1006.72, 364.41, 71.28 >>)
|
|
ADD_TEST_POLY_VERT(tpGardenArea, << -1004.07, 365.51, 71.78 >>)
|
|
ADD_TEST_POLY_VERT(tpGardenArea, << -993.65, 360.78, 71.51 >>)
|
|
ADD_TEST_POLY_VERT(tpGardenArea, << -993.68, 355.40, 71.02 >>)
|
|
ADD_TEST_POLY_VERT(tpGardenArea, << -1008.25, 350.70, 70.00 >>)
|
|
ADD_TEST_POLY_VERT(tpGardenArea, << -1010.90, 352.95, 69.54 >>)
|
|
ADD_TEST_POLY_VERT(tpGardenArea, << -1018.94, 351.08, 69.90 >>)
|
|
ADD_TEST_POLY_VERT(tpGardenArea, << -1020.24, 349.86, 69.67 >>)
|
|
ADD_TEST_POLY_VERT(tpGardenArea, << -1020.85, 347.65, 68.93 >>)
|
|
ADD_TEST_POLY_VERT(tpGardenArea, << -1030.98, 346.06, 70.4 >>)
|
|
ADD_TEST_POLY_VERT(tpGardenArea, << -1036.05, 346.14, 70.45 >>)
|
|
CLOSE_TEST_POLY(tpGardenArea) //must be called once verts have been added.
|
|
RESET_THREAT_SHAPETESTS()
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Initialise the peds and the clothes object
|
|
PROC SPAWN_PEDS_AND_PICKUP_OBJ()
|
|
INT i
|
|
|
|
// Gardner's vehicle
|
|
// Assign Gardner's vehicle over from initial scene
|
|
IF DOES_ENTITY_EXIST(sRCLauncherDataLocal.vehID[0])
|
|
vehGardenerVehicle = sRCLauncherDataLocal.vehID[0]
|
|
CPRINTLN(DEBUG_MISSION, "SPAWN_PEDS_AND_PICKUP_OBJ - gardener's vehicle passed over from launcher")
|
|
ELSE
|
|
IF NOT DOES_ENTITY_EXIST(vehGardenerVehicle)
|
|
vehGardenerVehicle = CREATE_VEHICLE(mnGardenerVehicle, << -1010.97, 359.91, 70.65 >>, 331.46)
|
|
CPRINTLN(DEBUG_MISSION, "SPAWN_PEDS_AND_PICKUP_OBJ - gardener's vehicle created in mission script")
|
|
ENDIF
|
|
IF IS_ENTITY_ALIVE(vehGardenerVehicle)
|
|
SET_VEHICLE_ON_GROUND_PROPERLY(vehGardenerVehicle)
|
|
SET_VEHICLE_COLOURS(vehGardenerVehicle, 97, 97)
|
|
SET_VEHICLE_DIRT_LEVEL(vehGardenerVehicle, 13.5)
|
|
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(vehGardenerVehicle, SC_DOOR_REAR_LEFT, FALSE)
|
|
SET_VEHICLE_DOOR_OPEN(vehGardenerVehicle, SC_DOOR_REAR_LEFT, FALSE, TRUE) // Ste says door needs to be open before setting ratio
|
|
SET_VEHICLE_DOOR_CONTROL(vehGardenerVehicle, SC_DOOR_REAR_LEFT, DT_DOOR_INTACT, 1.0) // can take these out with anim setup otherwise door has no collision
|
|
FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(vehGardenerVehicle)
|
|
IF NOT IS_ENTITY_PLAYING_ANIM(vehGardenerVehicle, "rcmnigel1b", "idle_speedo")
|
|
REQUEST_ANIM_DICT("rcmnigel1b")
|
|
IF HAS_ANIM_DICT_LOADED("rcmnigel1b")
|
|
TASK_VEHICLE_PLAY_ANIM(vehGardenerVehicle, "rcmnigel1b", "idle_speedo")
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SPAWN_PEDS_AND_PICKUP_OBJ - gardener's vehicle anim applied idle_speedo") ENDIF #ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
/*// have to wait on the door opening as it pushed the gardener away from his position otherwise
|
|
BOOL bIsDoorOpen = FALSE
|
|
WHILE NOT bIsDoorOpen
|
|
IF IS_ENTITY_ALIVE(vehGardenerVehicle)
|
|
FLOAT fOpenRatio = GET_VEHICLE_DOOR_ANGLE_RATIO(vehGardenerVehicle, SC_DOOR_REAR_LEFT)
|
|
IF NOT IS_VEHICLE_DOOR_FULLY_OPEN(vehGardenerVehicle, SC_DOOR_REAR_LEFT)
|
|
AND (fOpenRatio < 0.8) //secondary check to see if door is open
|
|
//SET_VEHICLE_DOOR_OPEN(vehGardenerVehicle, SC_DOOR_REAR_LEFT) // swapped for below command due to bug*896419 - Mission doesn't progress to initial phone call
|
|
SET_VEHICLE_DOOR_CONTROL(vehGardenerVehicle, SC_DOOR_REAR_LEFT, DT_DOOR_INTACT, 1.0)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SPAWN_PEDS_AND_PICKUP_OBJ waiting for gardener's van door to set open, current ratio is : ", fOpenRatio) ENDIF #ENDIF
|
|
ELSE
|
|
bIsDoorOpen = TRUE
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SPAWN_PEDS_AND_PICKUP_OBJ gardener's van door is open") ENDIF #ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
WAIT(0)
|
|
ENDWHILE*/
|
|
ENDIF
|
|
ENDIF
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(mnGardenerVehicle)
|
|
|
|
// Pickup_Index Setup
|
|
SAFE_DELETE_OBJECT(sRCLauncherDataLocal.objID[0])
|
|
IF NOT DOES_PICKUP_EXIST(mpClothesPickup.index)
|
|
mpClothesPickup.index = CREATE_PICKUP_ROTATE(mpClothesPickup.type, mpClothesPickup.vPosition, mpClothesPickup.vOrientation, mpClothesPickup.iPlacementFlags, -1, EULER_XYZ, TRUE, mpClothesPickup.mnModel)
|
|
CPRINTLN(DEBUG_MISSION, "SPAWN_PEDS_AND_PICKUP_OBJ - pickup created in mission script")
|
|
ENDIF
|
|
IF DOES_PICKUP_EXIST(mpClothesPickup.index)
|
|
IF DOES_PICKUP_OBJECT_EXIST(mpClothesPickup.index)
|
|
CPRINTLN(DEBUG_MISSION, "SPAWN_PEDS_AND_PICKUP_OBJ : DOES_PICKUP_OBJECT_EXIST return TRUE : after creating clothes pickup")
|
|
ELSE
|
|
CPRINTLN(DEBUG_MISSION, "SPAWN_PEDS_AND_PICKUP_OBJ : DOES_PICKUP_OBJECT_EXIST return FALSE! : after creating clothes pickup")
|
|
ENDIF
|
|
ELSE
|
|
CPRINTLN(DEBUG_MISSION, "SPAWN_PEDS_AND_PICKUP_OBJ : DOES_PICKUP_EXIST return FALSE! : after creating clothes pickup")
|
|
ENDIF
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(mpClothesPickup.mnModel)
|
|
|
|
// Create Tyler Dixon
|
|
// Assign celeb ped over from initial scene
|
|
IF DOES_ENTITY_EXIST(sRCLauncherDataLocal.pedID[0])
|
|
sPoolPed[POOL_PED_CELEB].pedIndex = sRCLauncherDataLocal.pedID[0]
|
|
CPRINTLN(DEBUG_MISSION, "SPAWN_PEDS_AND_PICKUP_OBJ - celeb ped passed over from launcher")
|
|
ELSE
|
|
IF NOT DOES_ENTITY_EXIST(sPoolPed[POOL_PED_CELEB].pedIndex)
|
|
iCelebInPoolInitialPositionID = NIGEL1B_POOL_SOUTH_SIDE
|
|
sPoolPed[POOL_PED_CELEB].pedIndex = CREATE_PED(PEDTYPE_MISSION, sPoolPed[POOL_PED_CELEB].model, vCelebPoolSwimGotos[iCelebInPoolInitialPositionID], fCelebPoolSwimInitialHeading[iCelebInPoolInitialPositionID])
|
|
CPRINTLN(DEBUG_MISSION, "SPAWN_PEDS_AND_PICKUP_OBJ - celeb ped created in mission script")
|
|
ENDIF
|
|
// only do this created in this script (since initial scene ped slready exists player could be interacting
|
|
IF IS_PED_UNINJURED(sPoolPed[POOL_PED_CELEB].pedIndex)
|
|
SET_ENTITY_COORDS_NO_OFFSET(sPoolPed[POOL_PED_CELEB].pedIndex, vCelebPoolSwimGotos[iCelebInPoolInitialPositionID])
|
|
SET_ENTITY_HEADING(sPoolPed[POOL_PED_CELEB].pedIndex, fCelebPoolSwimInitialHeading[iCelebInPoolInitialPositionID])
|
|
TASK_PLAY_ANIM(sPoolPed[POOL_PED_CELEB].pedIndex, "rcmnigel1b", "Swimming_Idle", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_DEFAULT)
|
|
#IF IS_DEBUG_BUILD IF bDebug_Display_PP_AI CPRINTLN(DEBUG_MISSION, "SPAWN_PEDS_AND_PICKUP_OBJ -> set Tyler alt walk anims") ENDIF #ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
// want this to be applied if created by initial scene or misison script -
|
|
IF IS_PED_UNINJURED(sPoolPed[POOL_PED_CELEB].pedIndex)
|
|
SET_PED_DIES_IN_WATER(sPoolPed[POOL_PED_CELEB].pedIndex, FALSE)
|
|
SET_PED_LEG_IK_MODE(sPoolPed[POOL_PED_CELEB].pedIndex, LEG_IK_FULL)
|
|
SET_PED_ALTERNATE_WALK_ANIM(sPoolPed[POOL_PED_CELEB].pedIndex, tlAnimDict_MissionMocappedAnims, "walk_tyler")
|
|
TASK_PLAY_ANIM(sPoolPed[POOL_PED_CELEB].pedIndex, "rcmnigel1b", "Swimming_Idle", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_DEFAULT)
|
|
#IF IS_DEBUG_BUILD IF bDebug_Display_PP_AI CPRINTLN(DEBUG_MISSION, "SPAWN_PEDS_AND_PICKUP_OBJ -> set Tyler alt walk anims") ENDIF #ENDIF
|
|
ENDIF
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(sPoolPed[POOL_PED_CELEB].model)
|
|
|
|
//female in HOT_TUB
|
|
// Assign female ped over from initial scene
|
|
IF DOES_ENTITY_EXIST(sRCLauncherDataLocal.pedID[1])
|
|
sPoolPed[POOL_PED_FEMALE].pedIndex = sRCLauncherDataLocal.pedID[1]
|
|
CPRINTLN(DEBUG_MISSION, "SPAWN_PEDS_AND_PICKUP_OBJ - female ped passed over from launcher")
|
|
ELSE
|
|
IF NOT DOES_ENTITY_EXIST(sPoolPed[POOL_PED_FEMALE].pedIndex)
|
|
sPoolPed[POOL_PED_FEMALE].pedIndex = CREATE_PED(PEDTYPE_MISSION, sPoolPed[POOL_PED_FEMALE].model, << -1058.43, 362.78, 69.86 >>, 130.45)
|
|
CPRINTLN(DEBUG_MISSION, "SPAWN_PEDS_AND_PICKUP_OBJ - female ped created in mission script")
|
|
ENDIF
|
|
IF IS_PED_UNINJURED(sPoolPed[POOL_PED_FEMALE].pedIndex)
|
|
SET_PED_COMPONENT_VARIATION(sPoolPed[POOL_PED_FEMALE].pedIndex, INT_TO_ENUM(PED_COMPONENT,0), 0, 0, 0) //(head)
|
|
SET_PED_COMPONENT_VARIATION(sPoolPed[POOL_PED_FEMALE].pedIndex, INT_TO_ENUM(PED_COMPONENT,2), 0, 0, 0) //(hair)
|
|
SET_PED_COMPONENT_VARIATION(sPoolPed[POOL_PED_FEMALE].pedIndex, INT_TO_ENUM(PED_COMPONENT,3), 0, 2, 0) //(uppr)
|
|
SET_PED_COMPONENT_VARIATION(sPoolPed[POOL_PED_FEMALE].pedIndex, INT_TO_ENUM(PED_COMPONENT,4), 0, 0, 0) //(lowr)
|
|
SET_PED_COMPONENT_VARIATION(sPoolPed[POOL_PED_FEMALE].pedIndex, INT_TO_ENUM(PED_COMPONENT,8), 0, 1, 0) //(accs)
|
|
|
|
SET_POOL_PEDS_SYNCED_ANIM(N1B_SSAT_BASE_FEMALE_ONLY)
|
|
ENDIF
|
|
ENDIF
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(sPoolPed[POOL_PED_FEMALE].model)
|
|
|
|
// common setup needs on the pool peds
|
|
FOR i = 0 TO (TOTAL_POOL_PEDS - 1)
|
|
IF IS_PED_UNINJURED(sPoolPed[i].pedIndex)
|
|
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(sPoolPed[i].pedIndex, TRUE) //using this causes bug 453584, waiting to find out if it's intended behaviour
|
|
SET_PED_CAN_BE_TARGETTED(sPoolPed[i].pedIndex, TRUE)
|
|
SET_PED_DIES_WHEN_INJURED(sPoolPed[i].pedIndex, TRUE)
|
|
SET_PED_DIES_IN_WATER(sPoolPed[i].pedIndex, FALSE)
|
|
SET_PED_MAX_TIME_UNDERWATER(sPoolPed[i].pedIndex, 60.0)
|
|
SET_PED_PATH_PREFER_TO_AVOID_WATER(sPoolPed[i].pedIndex, FALSE) //Possibly switch this once they notice the player
|
|
SET_ENTITY_LOAD_COLLISION_FLAG(sPoolPed[i].pedIndex, TRUE)
|
|
SET_PED_CAN_USE_AUTO_CONVERSATION_LOOKAT(sPoolPed[i].pedIndex, TRUE)
|
|
STOP_PED_SPEAKING(sPoolPed[i].pedIndex, TRUE)
|
|
IF IS_PED_IN_GROUP(sPoolPed[i].pedIndex)
|
|
REMOVE_PED_FROM_GROUP(sPoolPed[i].pedIndex)
|
|
ENDIF
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(sPoolPed[i].pedIndex, relGroupPlayerEnemy)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sPoolPed[i].pedIndex, TRUE)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "N1B_PED_AI_STATE_RELAXED initially set for id = ", i) ENDIF #ENDIF
|
|
sPoolPed[i].AI = N1B_PED_AI_STATE_RELAXED
|
|
sPoolPed[i].iFrameCountLastSeenPlayer = 0
|
|
sPoolPed[i].iAiDelayTimer = 0
|
|
sPoolPed[i].iTimer = 0
|
|
#IF IS_DEBUG_BUILD
|
|
TEXT_LABEL tDebugName = "PoolPedID: "
|
|
tDebugName += i
|
|
SET_PED_NAME_DEBUG(sPoolPed[i].pedIndex, tDebugName)
|
|
#ENDIF
|
|
ENDIF
|
|
ENDFOR
|
|
|
|
// props - current not created in the initial scene
|
|
FOR i = 0 TO (TOTAL_POOL_AREA_PROPS - 1)
|
|
IF NOT DOES_ENTITY_EXIST(moPoolAreaProps[i].object)
|
|
moPoolAreaProps[i].object = CREATE_OBJECT(moPoolAreaProps[i].model, moPoolAreaProps[i].vPosition)
|
|
ENDIF
|
|
IF IS_ENTITY_ALIVE(moPoolAreaProps[i].object)
|
|
IF i = 0
|
|
OR i = 1
|
|
SET_ENTITY_ROTATION(moPoolAreaProps[i].object, moPoolAreaProps[i].vRotation)
|
|
SET_ENTITY_COORDS_NO_OFFSET(moPoolAreaProps[i].object, moPoolAreaProps[i].vPosition)
|
|
//ELSE
|
|
// SET_ENTITY_HEADING(moPoolAreaProps[i].object, moPoolAreaProps[i].fHeading)
|
|
ENDIF
|
|
ACTIVATE_PHYSICS(moPoolAreaProps[i].object)
|
|
ENDIF
|
|
ENDFOR
|
|
//release all prop models after created, as some share same MODEL_NAMES
|
|
FOR i = 0 TO (TOTAL_POOL_AREA_PROPS - 1)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(moPoolAreaProps[i].model)
|
|
ENDFOR
|
|
|
|
// props - inside gardener's van - having to attach as vehicle interiors have no collision! not ideal
|
|
IF IS_ENTITY_ALIVE(vehGardenerVehicle)
|
|
INT iVehicleBone = GET_ENTITY_BONE_INDEX_BY_NAME(vehGardenerVehicle, "chassis")
|
|
FOR i = 0 TO (NIGEL1B_TOTAL_GARDENER_VAN_PROPS - 1)
|
|
IF NOT DOES_ENTITY_EXIST(moGardnerVanProps[i].object)
|
|
moGardnerVanProps[i].object = CREATE_OBJECT(moGardnerVanProps[i].model, moGardnerVanProps[i].vPosition)
|
|
ENDIF
|
|
IF IS_ENTITY_ALIVE(moGardnerVanProps[i].object)
|
|
ATTACH_ENTITY_TO_ENTITY(moGardnerVanProps[i].object, vehGardenerVehicle, iVehicleBone, moGardnerVanProps[i].vPosition, moGardnerVanProps[i].vRotation, TRUE, TRUE)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SPAWN_PEDS_AND_PICKUP_OBJ - gardener prop attached to van Id =", i) ENDIF #ENDIF
|
|
//SET_ENTITY_COLLISION(moGardnerVanProps[i].object, FALSE)
|
|
SET_ENTITY_CAN_BE_DAMAGED(moGardnerVanProps[i].object, FALSE)
|
|
SET_ENTITY_DYNAMIC(moGardnerVanProps[i].object, FALSE)
|
|
//FREEZE_ENTITY_POSITION(moGardnerVanProps[i].object, TRUE)
|
|
SET_CAN_AUTO_VAULT_ON_ENTITY(moGardnerVanProps[i].object, FALSE)
|
|
SET_CAN_CLIMB_ON_ENTITY(moGardnerVanProps[i].object, FALSE)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(moGardnerVanProps[i].model)
|
|
ENDIF
|
|
ENDFOR
|
|
ENDIF
|
|
|
|
//Celeb's super car
|
|
// Assign celeb's vehicle over from initial scene
|
|
IF DOES_ENTITY_EXIST(sRCLauncherDataLocal.vehID[1])
|
|
vehCelebsVehicle = sRCLauncherDataLocal.vehID[1]
|
|
CPRINTLN(DEBUG_MISSION, "SPAWN_PEDS_AND_PICKUP_OBJ - celeb's vehicle passed over from launcher")
|
|
ELSE
|
|
IF NOT DOES_ENTITY_EXIST(vehCelebsVehicle)
|
|
vehCelebsVehicle = CREATE_VEHICLE(mnCelebVehicle, << -1018.26, 357.76, 70.20 >>, 339.52)
|
|
CPRINTLN(DEBUG_MISSION, "SPAWN_PEDS_AND_PICKUP_OBJ - celeb's vehicle created in mission script")
|
|
ENDIF
|
|
IF IS_ENTITY_ALIVE(vehCelebsVehicle)
|
|
SET_VEHICLE_ON_GROUND_PROPERLY(vehCelebsVehicle)
|
|
SET_VEHICLE_COLOURS(vehCelebsVehicle, 27, 27) //red
|
|
ENDIF
|
|
ENDIF
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(mnCelebVehicle)
|
|
|
|
//Gardener
|
|
// Assign gardener ped over from initial scene
|
|
IF DOES_ENTITY_EXIST(sRCLauncherDataLocal.pedID[2])
|
|
sGardenerPed.pedIndex = sRCLauncherDataLocal.pedID[2]
|
|
CPRINTLN(DEBUG_MISSION, "SPAWN_PEDS_AND_PICKUP_OBJ - gardener ped passed over from launcher")
|
|
ELSE
|
|
IF NOT DOES_ENTITY_EXIST(sGardenerPed.pedIndex)
|
|
sGardenerPed.pedIndex = CREATE_PED(PEDTYPE_MISSION, sGardenerPed.model, << -1012.57, 357.48, 70.62 >>, -28.55)
|
|
CPRINTLN(DEBUG_MISSION, "SPAWN_PEDS_AND_PICKUP_OBJ - gardener ped created in mission script")
|
|
ENDIF
|
|
IF IS_PED_UNINJURED(sGardenerPed.pedIndex)
|
|
SET_PED_DEFAULT_COMPONENT_VARIATION(sGardenerPed.pedIndex)
|
|
SET_ENTITY_HEALTH(sGardenerPed.pedIndex, 160)
|
|
SET_ENTITY_COORDS_NO_OFFSET(sGardenerPed.pedIndex, << -1012.57, 357.48, 70.62 >>)
|
|
SET_PED_DIES_WHEN_INJURED(sGardenerPed.pedIndex, TRUE)
|
|
|
|
REQUEST_ANIM_DICT("rcmnigel1b")
|
|
IF HAS_ANIM_DICT_LOADED("rcmnigel1b")
|
|
TASK_PLAY_ANIM(sGardenerPed.pedIndex, "rcmnigel1b", "idle_gardener", INSTANT_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING | AF_EXIT_AFTER_INTERRUPTED | AF_USE_KINEMATIC_PHYSICS) // B*1544302 - AF_USE_KINEMATIC_PHYSICS)
|
|
ENDIF
|
|
/*IF IS_VEHICLE_OK(vehGardenerVehicle)
|
|
//iSyncSceneID_GardenerIdle = CREATE_SYNCHRONIZED_SCENE(<<-1010.970 , 359.960, 70.665 >>, << 6.500, 0.000, -28.000 >>)
|
|
//iSyncSceneID_GardenerIdle = CREATE_SYNCHRONIZED_SCENE((GET_ENTITY_COORDS(vehGardenerVehicle) + << 0.0, 0.0, 0.05 >>), GET_ENTITY_ROTATION(vehGardenerVehicle))
|
|
iSyncSceneID_GardenerIdle = CREATE_SYNCHRONIZED_SCENE(<< 0.0, 0.0, 0.0 >>, << 0.0, 0.0, 0.0 >>)
|
|
ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(iSyncSceneID_GardenerIdle, vehGardenerVehicle, 0)
|
|
|
|
SET_SYNCHRONIZED_SCENE_LOOPED(iSyncSceneID_GardenerIdle, TRUE)
|
|
SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(iSyncSceneID_GardenerIdle, FALSE)
|
|
|
|
INT iEntitySyncedSceneFlags = 0
|
|
iEntitySyncedSceneFlags = ENUM_TO_INT(SYNCED_SCENE_ABORT_ON_WEAPON_DAMAGE)
|
|
iEntitySyncedSceneFlags = ENUM_TO_INT(SYNCED_SCENE_VEHICLE_ABORT_ON_LARGE_IMPACT)
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(vehGardenerVehicle, iSyncSceneID_GardenerIdle, "idle_speedo", "rcmnigel1b", INSTANT_BLEND_IN, NORMAL_BLEND_OUT, iEntitySyncedSceneFlags)
|
|
|
|
// this makes door have no collision and van doesn't come out of the anim ever
|
|
//PLAY_ENTITY_ANIM(vehGardenerVehicle, "idle_speedo", "rcmnigel1b", INSTANT_BLEND_IN, TRUE, FALSE, FALSE, 0, ENUM_TO_INT(AF_ABORT_ON_WEAPON_DAMAGE))
|
|
|
|
TASK_SYNCHRONIZED_SCENE(sGardenerPed.pedIndex, iSyncSceneID_GardenerIdle, "rcmnigel1b", "idle_gardener", INSTANT_BLEND_IN, NORMAL_BLEND_OUT,
|
|
SYNCED_SCENE_ABORT_ON_WEAPON_DAMAGE | SYNCED_SCENE_ACTIVATE_RAGDOLL_ON_COLLISION)
|
|
CPRINTLN(DEBUG_MISSION, "SPAWN_PEDS_AND_PICKUP_OBJ - gardener and van sync scene applied iSyncSceneID_GardenerIdle = ", iSyncSceneID_GardenerIdle)
|
|
ENDIF*/
|
|
ENDIF
|
|
ENDIF
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(sGardenerPed.model)
|
|
|
|
// common gardener setup
|
|
IF IS_PED_UNINJURED(sGardenerPed.pedIndex)
|
|
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(sGardenerPed.pedIndex, TRUE)
|
|
SET_PED_CAN_BE_TARGETTED(sGardenerPed.pedIndex, TRUE)
|
|
SET_PED_DIES_IN_WATER(sGardenerPed.pedIndex, FALSE)
|
|
SET_ENTITY_LOAD_COLLISION_FLAG(sGardenerPed.pedIndex, TRUE)
|
|
SET_PED_CAN_USE_AUTO_CONVERSATION_LOOKAT(sGardenerPed.pedIndex, TRUE)
|
|
STOP_PED_SPEAKING(sGardenerPed.pedIndex, TRUE)
|
|
SET_PED_SUFFERS_CRITICAL_HITS(sGardenerPed.pedIndex, TRUE)
|
|
BLOCK_PED_FROM_GENERATING_DEAD_BODY_EVENTS_WHEN_DEAD(sGardenerPed.pedIndex, TRUE) // B*1537381 - peds outside house area going nuts
|
|
//GIVE_PED_HELMET(sGardenerPed.pedIndex, TRUE, PV_FLAG_JOB)
|
|
//SET_PED_PATH_CAN_USE_CLIMBOVERS(sGardenerPed.pedIndex, TRUE)
|
|
IF IS_PED_IN_GROUP(sGardenerPed.pedIndex)
|
|
REMOVE_PED_FROM_GROUP(sGardenerPed.pedIndex)
|
|
ENDIF
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(sGardenerPed.pedIndex, relGroupPlayerEnemy)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sGardenerPed.pedIndex, TRUE)
|
|
#IF IS_DEBUG_BUILD
|
|
TEXT_LABEL tDebugNameGardener = "GardenerN1B"
|
|
SET_PED_NAME_DEBUG(sGardenerPed.pedIndex, tDebugNameGardener)
|
|
#ENDIF
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "N1B_PED_AI_STATE_RELAXED initially set for sGardenerPed") ENDIF #ENDIF
|
|
sGardenerPed.AI = N1B_PED_AI_STATE_RELAXED
|
|
sGardenerPed.iFrameCountLastSeenPlayer = 0
|
|
sGardenerPed.iAiDelayTimer = 0
|
|
sGardenerPed.iTimer = 0
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Initialisation of the mission
|
|
PROC INIT_MISSION()
|
|
|
|
SET_MISSION_VARIABLES()
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
SETUP_MISSION_WIDGET() //this needs setting up first to ensure debug print can be displayed when loading assets
|
|
// stage skipping
|
|
mSkipMenu[Z_SKIP_STEAL_CELEB_CLOTHES].sTxtLabel = "STEAL CELEB'S CLOTHES"
|
|
mSkipMenu[Z_SKIP_ITEMS_STOLEN_LEAVE_THE_AREA].sTxtLabel = "LEAVE THE AREA"
|
|
mSkipMenu[Z_SKIP_PLAYER_LEFT_THE_AREA].sTxtLabel = "PLAYER LEFT THE AREA"
|
|
mSkipMenu[Z_SKIP_OUTRO_PHONECALL].sTxtLabel = "OUTRO_PHONECALL"
|
|
mSkipMenu[Z_SKIP_MISSION_PASSED].sTxtLabel = "Mission Passed"
|
|
#ENDIF
|
|
|
|
RC_CLEANUP_LAUNCHER()
|
|
SETUP_WORLD_STATE_FOR_MISSION() // needs to be no wait between mission trigger and resetup of scenario blocking area and ped non creation zone
|
|
|
|
//INFORM_MISSION_STATS_OF_MISSION_START_NIGEL_1_B()
|
|
|
|
LOAD_MISSION_ASSETS()
|
|
|
|
ADD_RELATIONSHIP_GROUP("N1B_PLAYER_HATE_GROUP", relGroupPlayerEnemy)
|
|
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, relGroupPlayerEnemy, RELGROUPHASH_PLAYER)
|
|
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, RELGROUPHASH_PLAYER, relGroupPlayerEnemy)
|
|
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, relGroupPlayerEnemy, RELGROUPHASH_COP) // make the cops work with the celebs instead of fight them
|
|
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, RELGROUPHASH_COP, relGroupPlayerEnemy)
|
|
REGISTER_SCRIPT_WITH_AUDIO()
|
|
ADD_CONTACT_TO_PHONEBOOK(CHAR_NIGEL, TREVOR_BOOK, FALSE)
|
|
|
|
CLEAR_BIT(g_savedGlobals.sRandomChars.g_iWebsiteQueryBit, ENUM_TO_INT(RC_NWS_NGLB_KILLED_TYLER)) // ensure this bit is initially clear when starting the mission
|
|
|
|
SPAWN_PEDS_AND_PICKUP_OBJ()
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Removes all the assets loaded by the mission, used in mission cleanup and reset mission functions.
|
|
/// PARAMS:
|
|
/// bClearTextSlots - if TRUE we clear the additional text slots - MISSION_TEXT_SLOT
|
|
PROC UNLOAD_ALL_MISSION_ASSETS(BOOL bClearTextSlots = TRUE)
|
|
INT i
|
|
REMOVE_ANIM_DICT("rcmnigel1b")
|
|
REMOVE_ANIM_DICT(tlAnimDict_PedAwareIdles)
|
|
REMOVE_ANIM_DICT(tlAnimDict_MissionMocappedAnims)
|
|
IF NOT HAS_SOUND_FINISHED(iSoundID_WhistlingGardener)
|
|
STOP_SOUND(iSoundID_WhistlingGardener)
|
|
ENDIF
|
|
RELEASE_SOUND_ID(iSoundID_WhistlingGardener)
|
|
RELEASE_SCRIPT_AUDIO_BANK()
|
|
UNREGISTER_SCRIPT_WITH_AUDIO()
|
|
i = 0
|
|
REPEAT TOTAL_POOL_AREA_PROPS i
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(moPoolAreaProps[i].model)
|
|
ENDREPEAT
|
|
i = 0
|
|
REPEAT NIGEL1B_TOTAL_GARDENER_VAN_PROPS i
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(moGardnerVanProps[i].model)
|
|
ENDREPEAT
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(mpClothesPickup.mnModel)
|
|
i = 0
|
|
REPEAT TOTAL_POOL_PEDS i
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(sPoolPed[i].model)
|
|
ENDREPEAT
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(mnCelebVehicle)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(mnGardenerVehicle)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(mnCopCar)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(mnCopPed)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(sGardenerPed.model)
|
|
IF bClearTextSlots
|
|
CLEAR_ADDITIONAL_TEXT(MISSION_TEXT_SLOT, TRUE)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Deletes all of the blips used in the mission, checking if they exist.
|
|
PROC DELETE_ALL_MISSION_BLIPS()
|
|
INT i
|
|
SAFE_REMOVE_BLIP(mpClothesPickup.blipIndex)
|
|
FOR i = 0 TO (TOTAL_POOL_PEDS-1)
|
|
CLEANUP_AI_PED_BLIP(sPoolPed[i].blipAIStruct)
|
|
ENDFOR
|
|
CLEANUP_AI_PED_BLIP(sGardenerPed.blipAIStruct)
|
|
ENDPROC
|
|
|
|
/// 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
|
|
FOR i = 0 TO (TOTAL_POOL_PEDS-1)
|
|
IF IS_PED_UNINJURED(sPoolPed[i].pedIndex)
|
|
SET_PED_KEEP_TASK(sPoolPed[i].pedIndex, TRUE)
|
|
SET_ENTITY_LOAD_COLLISION_FLAG(sPoolPed[i].pedIndex, FALSE)
|
|
IF i = POOL_PED_CELEB
|
|
SET_PED_LEG_IK_MODE(sPoolPed[i].pedIndex, LEG_IK_PARTIAL)
|
|
ENDIF
|
|
ENDIF
|
|
SAFE_REMOVE_PED(sPoolPed[i].pedIndex, bDelete)
|
|
ENDFOR
|
|
IF IS_PED_UNINJURED(sGardenerPed.pedIndex)
|
|
SET_PED_KEEP_TASK(sGardenerPed.pedIndex, TRUE)
|
|
SET_ENTITY_LOAD_COLLISION_FLAG(sGardenerPed.pedIndex, FALSE)
|
|
ENDIF
|
|
SAFE_REMOVE_PED(sGardenerPed.pedIndex, bDelete)
|
|
SAFE_REMOVE_PICKUP(mpClothesPickup.index)
|
|
i = 0
|
|
REPEAT TOTAL_POOL_AREA_PROPS i
|
|
SAFE_REMOVE_OBJECT(moPoolAreaProps[i].object, bDelete)
|
|
ENDREPEAT
|
|
i = 0
|
|
REPEAT NIGEL1B_TOTAL_GARDENER_VAN_PROPS i
|
|
SAFE_REMOVE_OBJECT(moGardnerVanProps[i].object, bDelete)
|
|
ENDREPEAT
|
|
SAFE_REMOVE_VEHICLE(vehCelebsVehicle, bDelete)
|
|
IF IS_VEHICLE_OK(vehGardenerVehicle)
|
|
IF IS_ENTITY_PLAYING_ANIM(vehGardenerVehicle, "rcmnigel1b", "idle_speedo")
|
|
STOP_ENTITY_ANIM(vehGardenerVehicle, "idle_speedo", "rcmnigel1b", SLOW_BLEND_OUT)
|
|
CPRINTLN(DEBUG_MISSION, GET_THIS_SCRIPT_NAME(), " : CLEANUP_ALL_MISSION_ENTITIES() : stopped van sync anim")
|
|
ENDIF
|
|
REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(vehGardenerVehicle)
|
|
ENDIF
|
|
SAFE_REMOVE_VEHICLE(vehGardenerVehicle, bDelete)
|
|
SAFE_REMOVE_VEHICLE(vehIndex_MissionReplayRestore, bDelete)
|
|
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)
|
|
INT i
|
|
CLEAR_PRINTS()
|
|
IF IS_HELP_MESSAGE_BEING_DISPLAYED()
|
|
CLEAR_HELP(TRUE)
|
|
ENDIF
|
|
N1B_KILL_CURRENT_CONVERSATION(TRUE, TRUE)
|
|
SET_WANTED_LEVEL_MULTIPLIER(1.0)
|
|
DISABLE_CELLPHONE(FALSE)
|
|
HIDE_ACTIVE_PHONE(FALSE)
|
|
ALLOW_DIALOGUE_IN_WATER(FALSE)
|
|
DISPLAY_HUD(TRUE)
|
|
DISPLAY_RADAR(TRUE)
|
|
SET_WIDESCREEN_BORDERS(FALSE, 0)
|
|
RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
RC_END_CUTSCENE_MODE()
|
|
SET_TIME_SCALE(1)
|
|
|
|
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)
|
|
CLEAR_PED_NON_CREATION_AREA()
|
|
REMOVE_SCENARIO_BLOCKING_AREA(scenarioBlockingHouse)
|
|
SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(vClearPedZone_HouseArea_Min, vClearPedZone_HouseArea_Max, TRUE)
|
|
|
|
// only do it here for replays / z skips
|
|
// clear areas which would normally get missed since they occur in the launcher's SETUP_AREA_FOR_MISSION
|
|
IF IS_REPLAY_IN_PROGRESS()
|
|
OR NOT bFinishedStageSkipping
|
|
REMOVE_VEHICLES_FROM_GENERATORS_IN_AREA(vClearPedZone_HouseArea_Min, vClearPedZone_HouseArea_Max)
|
|
CLEAR_AREA(vCelebritiesHouse_CentralPoint, 35.0, TRUE) // extended to fix bug 1042629 - Blood stain persisted after retry
|
|
CLEAR_AREA_OF_VEHICLES(vCelebritiesHouse_CentralPoint, 27.0, FALSE)
|
|
CLEAR_AREA_OF_PEDS(vCelebritiesHouse_CentralPoint, 27.0)
|
|
CPRINTLN(DEBUG_MISSION, "SETUP_WORLD_STATE_FOR_MISSION - simulated SETUP_AREA_FOR_MISSION for replay / skip")
|
|
ENDIF
|
|
|
|
FOR i = 0 TO (ENUM_TO_INT(N1B_MAX_MISSION_CONTROLLED_DOORS) - 1)
|
|
IF IS_DOOR_REGISTERED_WITH_SYSTEM(iMissionControlledDoors[i])
|
|
REMOVE_DOOR_FROM_SYSTEM(iMissionControlledDoors[i])
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, " MISSION_CLEANUP - ", " REMOVE_DOOR_FROM_SYSTEM : ", iMissionControlledDoors[i]) ENDIF #ENDIF
|
|
ENDIF
|
|
ENDFOR
|
|
REMOVE_PED_FOR_DIALOGUE(sDialogue, 2) // "TREVOR"
|
|
REMOVE_PED_FOR_DIALOGUE(sDialogue, 3) // "NIGEL"
|
|
REMOVE_PED_FOR_DIALOGUE(sDialogue, 4) // "MRSTHORNHILL" / "GARDENER"
|
|
REMOVE_PED_FOR_DIALOGUE(sDialogue, 5) // "CELEBRITYMALE" sPoolPed[POOL_PED_CELEB].pedIndex
|
|
REMOVE_PED_FOR_DIALOGUE(sDialogue, 6) // "CELEBRITYFEMALE" sPoolPed[POOL_PED_FEMALE].pedIndex
|
|
IF IS_PLAYER_PLAYING(PLAYER_ID())
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
ENDIF
|
|
IF IS_CUTSCENE_ACTIVE()
|
|
STOP_CUTSCENE()
|
|
ENDIF
|
|
IF IS_AUDIO_SCENE_ACTIVE("NIGEL_1B_MAIN_MIX")
|
|
STOP_AUDIO_SCENE("NIGEL_1B_MAIN_MIX")
|
|
ENDIF
|
|
SAFE_TRIGGER_MISSION_MUSIC_EVENT("NIGEL1B_MISSION_FAIL")
|
|
SET_AUDIO_FLAG("AllowScoreAndRadio", FALSE) // reset to default value
|
|
WAIT_FOR_CUTSCENE_TO_STOP()
|
|
REMOVE_RELATIONSHIP_GROUP(relGroupPlayerEnemy)
|
|
RESET_THREAT_SHAPETESTS()
|
|
DELETE_ALL_MISSION_BLIPS()
|
|
CLEANUP_ALL_MISSION_ENTITIES(bDeleteAll)
|
|
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_MISSION, "MISSION_CLEANUP - done")
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// checks if the player's current weapon is lethal
|
|
/// PARAMS:
|
|
/// bIncludeProjectilesCheck - if true, checks for grenades,stickybombs etc
|
|
/// bIncludeLeathalMeleeWeapons - if true check includes knife, hammer, crowbar etc
|
|
/// bIncludeStunGunAsLethal - added parameter as we now want pool peds to surrender to stun gun attack
|
|
/// RETURNS:
|
|
/// true - if lethal
|
|
FUNC BOOL IS_PLAYER_CURRENT_WEAPON_LETHAL(BOOL bIncludeProjectilesCheck = TRUE, BOOL bIncludeLeathalMeleeWeapons = FALSE, BOOL bIncludeStunGunAsLethal = FALSE)
|
|
//different dialogue based on player weapon
|
|
WEAPON_TYPE currentPlayerWeapon
|
|
GET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), currentPlayerWeapon)
|
|
|
|
SWITCH currentPlayerWeapon
|
|
CASE WEAPONTYPE_PISTOL
|
|
FALLTHRU
|
|
CASE WEAPONTYPE_COMBATPISTOL
|
|
FALLTHRU
|
|
CASE WEAPONTYPE_APPISTOL
|
|
FALLTHRU
|
|
CASE WEAPONTYPE_MICROSMG
|
|
FALLTHRU
|
|
CASE WEAPONTYPE_SMG
|
|
FALLTHRU
|
|
CASE WEAPONTYPE_DLC_SNSPISTOL
|
|
FALLTHRU
|
|
CASE WEAPONTYPE_ASSAULTRIFLE
|
|
FALLTHRU
|
|
CASE WEAPONTYPE_CARBINERIFLE
|
|
FALLTHRU
|
|
CASE WEAPONTYPE_DLC_SPECIALCARBINE
|
|
FALLTHRU
|
|
CASE WEAPONTYPE_ADVANCEDRIFLE
|
|
FALLTHRU
|
|
CASE WEAPONTYPE_MG
|
|
FALLTHRU
|
|
CASE WEAPONTYPE_COMBATMG
|
|
FALLTHRU
|
|
CASE WEAPONTYPE_PUMPSHOTGUN
|
|
FALLTHRU
|
|
CASE WEAPONTYPE_SAWNOFFSHOTGUN
|
|
FALLTHRU
|
|
CASE WEAPONTYPE_ASSAULTSHOTGUN
|
|
FALLTHRU
|
|
CASE WEAPONTYPE_SNIPERRIFLE
|
|
FALLTHRU
|
|
CASE WEAPONTYPE_HEAVYSNIPER
|
|
FALLTHRU
|
|
CASE WEAPONTYPE_REMOTESNIPER
|
|
FALLTHRU
|
|
CASE WEAPONTYPE_GRENADELAUNCHER
|
|
FALLTHRU
|
|
CASE WEAPONTYPE_RPG
|
|
FALLTHRU
|
|
CASE WEAPONTYPE_MINIGUN
|
|
RETURN TRUE
|
|
ENDSWITCH
|
|
IF bIncludeProjectilesCheck
|
|
SWITCH currentPlayerWeapon
|
|
CASE WEAPONTYPE_GRENADE
|
|
FALLTHRU
|
|
CASE WEAPONTYPE_STICKYBOMB
|
|
FALLTHRU
|
|
CASE WEAPONTYPE_MOLOTOV
|
|
RETURN TRUE
|
|
ENDSWITCH
|
|
ENDIF
|
|
IF bIncludeLeathalMeleeWeapons
|
|
SWITCH currentPlayerWeapon
|
|
CASE WEAPONTYPE_KNIFE
|
|
FALLTHRU
|
|
CASE WEAPONTYPE_HAMMER
|
|
FALLTHRU
|
|
CASE WEAPONTYPE_CROWBAR
|
|
FALLTHRU
|
|
CASE WEAPONTYPE_DLC_BOTTLE
|
|
FALLTHRU
|
|
ENDSWITCH
|
|
ENDIF
|
|
IF bIncludeStunGunAsLethal
|
|
IF currentPlayerWeapon = WEAPONTYPE_STUNGUN
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Check to see if the player is making the ped frightened.
|
|
/// PARAMS:
|
|
/// pedIndex - ped to test
|
|
/// RETURNS:
|
|
/// true if the player is shooting and either bullets are in the area around the ped, player is free aiming at or targetting the ped
|
|
FUNC BOOL IS_PLAYER_MAKING_PED_FRIGHTENED(PED_INDEX pedIndex, BOOL bDoDeadCheck = TRUE)
|
|
IF bDoDeadCheck
|
|
IF NOT IS_ENTITY_ALIVE(pedIndex)
|
|
RETURN FALSE
|
|
ENDIF
|
|
ENDIF
|
|
IF IS_PLAYER_FREE_AIMING_AT_ENTITY(PLAYER_ID(), pedIndex)
|
|
OR IS_PLAYER_TARGETTING_ENTITY(PLAYER_ID(), pedIndex)
|
|
FLOAT fTargettingDist
|
|
// player is targetting ped, set targetting dist based on whether he is using melee or ranged attack
|
|
//IF IS_PED_ARMED(PLAYER_PED_ID(), WF_INCLUDE_GUN|WF_INCLUDE_PROJECTILE)
|
|
IF IS_PLAYER_CURRENT_WEAPON_LETHAL(TRUE, FALSE, TRUE)
|
|
fTargettingDist = 40.0 // ranged distance
|
|
IF IS_ENTITY_IN_RANGE_COORDS(pedIndex, vPlayerPos, fTargettingDist)
|
|
IF IS_PED_SHOOTING(PLAYER_PED_ID())
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_PLAYER_MAKING_PED_FRIGHTENED return true Player in range aim and shooting at ped with weapon : FRAME_COUNT = ", GET_FRAME_COUNT()) ENDIF #ENDIF
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_PLAYER_MAKING_PED_FRIGHTENED gun / projectile dist set : ", fTargettingDist, " : FRAME_COUNT = ", GET_FRAME_COUNT()) ENDIF #ENDIF
|
|
ELSE
|
|
// commented out as this goes through too easy...ideally i need is_ped_shooting equivalent for melee
|
|
/*fTargettingDist = 3.0 // melee distance
|
|
IF IS_ENTITY_IN_RANGE_COORDS(pedIndex, vPlayerPos, fTargettingDist) // melee distance
|
|
IF IS_PED_IN_MELEE_COMBAT(PLAYER_PED_ID())
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_PLAYER_MAKING_PED_FRIGHTENED return true Player in range aim and melee at ped : FRAME_COUNT = ", GET_FRAME_COUNT()) ENDIF #ENDIF
|
|
RETURN TRUE
|
|
ENDIF
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_PLAYER_MAKING_PED_FRIGHTENED melee dist set : ", fTargettingDist, " : FRAME_COUNT = ", GET_FRAME_COUNT()) ENDIF #ENDIF
|
|
ENDIF*/
|
|
ENDIF
|
|
ENDIF
|
|
IF IS_BULLET_IN_AREA(GET_ENTITY_COORDS(pedIndex), 4.0, TRUE)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_PLAYER_MAKING_PED_FRIGHTENED return true is Bullet in area : FRAME_COUNT = ", GET_FRAME_COUNT()) ENDIF #ENDIF
|
|
RETURN TRUE
|
|
ENDIF
|
|
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(pedIndex, PLAYER_PED_ID())
|
|
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(pedIndex)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_PLAYER_MAKING_PED_FRIGHTENED return true - Combat and damaged : FRAME_COUNT = ", GET_FRAME_COUNT()) ENDIF #ENDIF
|
|
RETURN TRUE
|
|
ENDIF
|
|
FLOAT fProjectileRadiusCheck = 15.0
|
|
VECTOR vMin, vMax // is one of the player's projectiles nearby?
|
|
vMin = GET_ENTITY_COORDS(pedIndex)
|
|
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_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_PLAYER_MAKING_PED_FRIGHTENED return true - projectile in area around ped : FRAME_COUNT = ", GET_FRAME_COUNT()) ENDIF #ENDIF
|
|
RETURN TRUE
|
|
ENDIF
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// switch the celeb's initial position based of the entrance to the pool the player uses, this is to stop him spotting the player
|
|
/// straight away. He will always be facing away from him.
|
|
PROC UPDATE_CELEB_IN_POOL_INITIAL_POSITION_BASED_OF_PLAYERS_APPROACH()
|
|
IF sPoolPed[POOL_PED_CELEB].AI = N1B_PED_AI_STATE_RELAXED
|
|
IF IS_PED_UNINJURED(sPoolPed[POOL_PED_CELEB].pedIndex)
|
|
IF IS_ENTITY_VISIBLE_ON_SCREEN(sPoolPed[POOL_PED_CELEB].pedIndex, FALSE) // as soon as the player spots the celeb in the pool, start him doing his swimming routine
|
|
AND ePlayerLocation = N1B_PLAYER_LOCATION_POOL_AREA //had to add this test as IS_ENTITY_VISIBLE_ON_SCREEN was returning true when it shouldn't do!
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_CELEB_IN_POOL_INITIAL_POSITION_BASED_OF_PLAYERS_APPROACH - set celeb in pool to N1B_PED_AI_SETUP_ROUTINE") ENDIF #ENDIF
|
|
sPoolPed[POOL_PED_CELEB].AI = N1B_PED_AI_SETUP_ROUTINE
|
|
ELSE
|
|
VECTOR vPoolAreaEntranceCentrePoint
|
|
FLOAT fCheckDist
|
|
IF iCelebInPoolInitialPositionID = NIGEL1B_POOL_SOUTH_SIDE
|
|
// if the celeb is at the south side, detect player entering from the north
|
|
vPoolAreaEntranceCentrePoint = << -1056.29443, 383.01282, 68.68782 >>
|
|
fCheckDist = 3.0
|
|
IF IS_COORD_IN_RANGE_OF_COORD_2D(vPlayerPos, vPoolAreaEntranceCentrePoint, fCheckDist)
|
|
iCelebInPoolInitialPositionID = NIGEL1B_POOL_NORTH_SIDE
|
|
REPLAY_DISABLE_CAMERA_MOVEMENT_THIS_FRAME()
|
|
SET_ENTITY_COORDS_NO_OFFSET(sPoolPed[POOL_PED_CELEB].pedIndex, vCelebPoolSwimGotos[iCelebInPoolInitialPositionID])
|
|
SET_ENTITY_HEADING(sPoolPed[POOL_PED_CELEB].pedIndex, fCelebPoolSwimInitialHeading[iCelebInPoolInitialPositionID])
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_CELEB_IN_POOL_INITIAL_POSITION_BASED_OF_PLAYERS_APPROACH - set celeb to NIGEL1B_POOL_NORTH_SIDE") ENDIF #ENDIF
|
|
ENDIF
|
|
ELIF iCelebInPoolInitialPositionID = NIGEL1B_POOL_NORTH_SIDE
|
|
// if the celeb is at the north side, detect player entering from the south
|
|
vPoolAreaEntranceCentrePoint = << -1035.07849, 347.51779, 70.36205 >>
|
|
fCheckDist = 4.0
|
|
IF IS_COORD_IN_RANGE_OF_COORD_2D(vPlayerPos, vPoolAreaEntranceCentrePoint, fCheckDist)
|
|
iCelebInPoolInitialPositionID = NIGEL1B_POOL_SOUTH_SIDE
|
|
REPLAY_DISABLE_CAMERA_MOVEMENT_THIS_FRAME()
|
|
SET_ENTITY_COORDS_NO_OFFSET(sPoolPed[POOL_PED_CELEB].pedIndex, vCelebPoolSwimGotos[iCelebInPoolInitialPositionID])
|
|
SET_ENTITY_HEADING(sPoolPed[POOL_PED_CELEB].pedIndex, fCelebPoolSwimInitialHeading[iCelebInPoolInitialPositionID])
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_CELEB_IN_POOL_INITIAL_POSITION_BASED_OF_PLAYERS_APPROACH - set celeb to NIGEL1B_POOL_SOUTH_SIDE") ENDIF #ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Check the specific ped is playing on of the aware of player anims
|
|
/// PARAMS:
|
|
/// pedIndex - specific ped to check
|
|
/// RETURNS:
|
|
/// TRUE if ped is playing one of the anims
|
|
FUNC BOOL IS_PED_PLAYING_AWARE_OF_PLAYER_ANIM(PED_INDEX &pedIndex)
|
|
IF IS_PED_UNINJURED(pedIndex)
|
|
IF IS_ENTITY_PLAYING_ANIM(pedIndex, tlAnimDict_PedAwareIdles, "react_small_variations_k")
|
|
OR IS_ENTITY_PLAYING_ANIM(pedIndex, tlAnimDict_PedAwareIdles, "react_small_variations_m")
|
|
OR IS_ENTITY_PLAYING_ANIM(pedIndex, tlAnimDict_PedAwareIdles, "react_small_variations_n")
|
|
OR IS_ENTITY_PLAYING_ANIM(pedIndex, tlAnimDict_PedAwareIdles, "react_small_variations_o")
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Handles ped's playing anims when they are stood around looking at the player
|
|
/// PARAMS:
|
|
/// pedIndex - the specific ped to apply the anim to
|
|
/// sSpecificAnim - specify an anim to play, otherwise pass NULL or empty for random selected
|
|
/// fBlendInDelta - speed to blend the anim in
|
|
/// fBlendOutDelta - speed to blend the anim out
|
|
/// nTimeToPlay - the time the animation has to play
|
|
/// AnimFlags -
|
|
/// startPhase - which phase in the anim to start from
|
|
/// phaseControlled -
|
|
/// ikFlags -
|
|
/// RETURNS:
|
|
/// TRUE if the anim was tasked successfully
|
|
FUNC BOOL SET_PED_PLAY_AWARE_OF_PLAYER_ANIM(PED_INDEX &pedIndex, STRING sSpecificAnim = NULL, FLOAT fBlendInDelta = NORMAL_BLEND_IN, FLOAT fBlendOutDelta = NORMAL_BLEND_OUT, INT nTimeToPlay =-1, ANIMATION_FLAGS AnimFlags = AF_DEFAULT, FLOAT startPhase = 0.0, BOOL phaseControlled = FALSE, IK_CONTROL_FLAGS ikFlags = AIK_NONE)
|
|
IF IS_PED_UNINJURED(pedIndex)
|
|
REQUEST_ANIM_DICT(tlAnimDict_PedAwareIdles)
|
|
IF HAS_ANIM_DICT_LOADED(tlAnimDict_PedAwareIdles)
|
|
IF IS_STRING_NULL_OR_EMPTY(sSpecificAnim)
|
|
// pick a random anim to play
|
|
INT iRand = GET_RANDOM_INT_IN_RANGE(0, 4)
|
|
SWITCH iRand
|
|
CASE 0
|
|
sSpecificAnim = "react_small_variations_k"
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_PED_PLAY_AWARE_OF_PLAYER_ANIM - set random anim : ", sSpecificAnim, " iRand : ", iRand) ENDIF #ENDIF
|
|
BREAK
|
|
CASE 1
|
|
sSpecificAnim = "react_small_variations_m"
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_PED_PLAY_AWARE_OF_PLAYER_ANIM - set random anim : ", sSpecificAnim, " iRand : ", iRand) ENDIF #ENDIF
|
|
BREAK
|
|
CASE 2
|
|
sSpecificAnim = "react_small_variations_n"
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_PED_PLAY_AWARE_OF_PLAYER_ANIM - set random anim : ", sSpecificAnim, " iRand : ", iRand) ENDIF #ENDIF
|
|
BREAK
|
|
CASE 3
|
|
sSpecificAnim = "react_small_variations_o"
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_PED_PLAY_AWARE_OF_PLAYER_ANIM - set random anim : ", sSpecificAnim, " iRand : ", iRand) ENDIF #ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
//CLEAR_PED_TASKS(pedIndex)
|
|
TASK_PLAY_ANIM(pedIndex, tlAnimDict_PedAwareIdles, sSpecificAnim, fBlendInDelta, fBlendOutDelta, nTimeToPlay, AnimFlags, startPhase, phaseControlled, ikFlags)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_PED_PLAY_AWARE_OF_PLAYER_ANIM - anim applied : ", sSpecificAnim, " : RETURN TRUE") ENDIF #ENDIF
|
|
RETURN TRUE
|
|
ELSE
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_PED_PLAY_AWARE_OF_PLAYER_ANIM - waiting on anim request to load : ", tlAnimDict_PedAwareIdles) ENDIF #ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_PED_PLAY_AWARE_OF_PLAYER_ANIM - RETURN FALSE") ENDIF #ENDIF
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// gets the celeb to blend out of the dancy scene to head over the clothes
|
|
/// and sets the women back into her idle anim
|
|
/// they'll only be using the dance sync scene at this point
|
|
/// RETURNS:
|
|
/// TRUE if sync was ended successfully
|
|
FUNC BOOL SET_CELEB_TO_STOP_DANCING_FOR_CLOTHES_SEARCH()
|
|
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncScenesID_PoolPeds[N1B_SSAT_DANCE_LOOP])
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncScenesID_PoolPeds[N1B_SSAT_DANCE_LOOP]) > 0.2554
|
|
AND GET_SYNCHRONIZED_SCENE_PHASE(iSyncScenesID_PoolPeds[N1B_SSAT_DANCE_LOOP]) < 0.295
|
|
|
|
SET_SYNCHRONIZED_SCENE_LOOPED(iSyncScenesID_PoolPeds[N1B_SSAT_DANCE_LOOP], FALSE)
|
|
//SET_SYNCHRONIZED_SCENE_PHASE(iSyncScenesID_PoolPeds[N1B_SSAT_DANCE_LOOP], 1.0) // have to do this to end it I believe
|
|
DETACH_SYNCHRONIZED_SCENE(iSyncScenesID_PoolPeds[N1B_SSAT_DANCE_LOOP])
|
|
|
|
SET_POOL_PEDS_SYNCED_ANIM(N1B_SSAT_BASE_FEMALE_ONLY)
|
|
sPoolPed[POOL_PED_FEMALE].AI = N1B_PED_AI_STATE_RELAXED
|
|
|
|
IF IS_PED_UNINJURED(sPoolPed[POOL_PED_CELEB].pedIndex)
|
|
IF IsPedPerformingTask(sPoolPed[POOL_PED_CELEB].pedIndex, SCRIPT_TASK_SYNCHRONIZED_SCENE)
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(sPoolPed[POOL_PED_CELEB].pedIndex, REALLY_SLOW_BLEND_OUT, TRUE)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_CELEB_TO_STOP_DANCING_FOR_CLOTHES_SEARCH - * set blend out task for CELEB FC : ", GET_FRAME_COUNT()) ENDIF #ENDIF
|
|
ENDIF
|
|
sPoolPed[POOL_PED_CELEB].AI = N1B_PED_AI_CELEB_ONLY_SETUP_GET_OUT_POOL_FOR_CLOTHES
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_CELEB_TO_STOP_DANCING_FOR_CLOTHES_SEARCH - * set loop false and scene to phase 1.0 to stop FC : ", GET_FRAME_COUNT()) ENDIF #ENDIF
|
|
ENDIF
|
|
ELSE
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// check the female has finished her stand up sync anim. Handles triggering and checking it's finished
|
|
/// RETURNS:
|
|
/// TRUE if the female ped has finished her stand up anim
|
|
FUNC BOOL HAS_FEMALE_POOL_PED_FINISHED_STAND_UP_ANIM()
|
|
|
|
IF IS_PED_UNINJURED(sPoolPed[POOL_PED_FEMALE].pedIndex)
|
|
IF NOT bDoneStandUpSceneForFemalePoolPed
|
|
IF IsPedPerformingTask(sPoolPed[POOL_PED_FEMALE].pedIndex, SCRIPT_TASK_SYNCHRONIZED_SCENE)
|
|
// if this dance outro is running wait for it to end other wise apply straight away
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncScenesID_PoolPeds[N1B_SSAT_DANCE_OUTRO_FEMALE_ONLY])
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncScenesID_PoolPeds[N1B_SSAT_DANCE_OUTRO_FEMALE_ONLY]) > 0.98
|
|
SET_POOL_PEDS_SYNCED_ANIM(N1B_SSAT_STAND_UP_FEMALE_ONLY)
|
|
bDoneStandUpSceneForFemalePoolPed = TRUE
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "HAS_FEMALE_POOL_PED_FINISHED_STAND_UP_ANIM - set N1B_SSAT_STAND_UP_FEMALE_ONLY for task ss and active dance outro scene exit scene FC : ", GET_FRAME_COUNT()) ENDIF #ENDIF
|
|
ENDIF
|
|
ELSE
|
|
SET_POOL_PEDS_SYNCED_ANIM(N1B_SSAT_STAND_UP_FEMALE_ONLY)
|
|
bDoneStandUpSceneForFemalePoolPed = TRUE
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "HAS_FEMALE_POOL_PED_FINISHED_STAND_UP_ANIM - set N1B_SSAT_STAND_UP_FEMALE_ONLY for task ss but not active dance outro scene exit scene FC : ", GET_FRAME_COUNT()) ENDIF #ENDIF
|
|
ENDIF
|
|
ELSE
|
|
bDoneStandUpSceneForFemalePoolPed = TRUE
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "HAS_FEMALE_POOL_PED_FINISHED_STAND_UP_ANIM - set N1B_SSAT_STAND_UP_FEMALE_ONLY scene skipped for ped not having task ss scene FC : ", GET_FRAME_COUNT()) ENDIF #ENDIF
|
|
ENDIF
|
|
ELSE
|
|
// if scenes aren't running check ped has finished sync scene task
|
|
IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iSyncScenesID_PoolPeds[N1B_SSAT_STAND_UP_FEMALE_ONLY])
|
|
IF NOT IsPedPerformingTask(sPoolPed[POOL_PED_FEMALE].pedIndex, SCRIPT_TASK_SYNCHRONIZED_SCENE)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "HAS_FEMALE_POOL_PED_FINISHED_STAND_UP_ANIM - return TRUE FC : ", GET_FRAME_COUNT()) ENDIF #ENDIF
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// if the specific ped has finished their surrender reaction animation. Handles triggering and checking it's finished
|
|
/// PARAMS:
|
|
/// iPoolPedIndex - specific ped to check
|
|
/// RETURNS:
|
|
/// TRUE if the specfic ped has finished their surrender reaction anim
|
|
FUNC BOOL HAS_POOL_PED_FINISHED_SURRENDER_REACTION_ANIM(INT iPoolPedIndex)
|
|
|
|
// decide which exit scene to play - if celeb is in synced scene both will need exit
|
|
IF iPoolPedIndex = POOL_PED_CELEB
|
|
IF IS_PED_UNINJURED(sPoolPed[POOL_PED_CELEB].pedIndex)
|
|
IF NOT bDoneDanceOutroSceneForPoolPeds[POOL_PED_CELEB]
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncScenesID_PoolPeds[N1B_SSAT_ENTER_CELEB_ONLY])
|
|
// only use his dance outro anim if he's in the tub
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncScenesID_PoolPeds[N1B_SSAT_ENTER_CELEB_ONLY]) > 0.55
|
|
SET_POOL_PEDS_SYNCED_ANIM(N1B_SSAT_DANCE_OUTRO_CELEB_ONLY)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "HAS_POOL_PED_FINISHED_SURRENDER_REACTION_ANIM - set N1B_SSAT_DANCE_OUTRO_CELEB_ONLY exit scene from N1B_SSAT_ENTER_CELEB_ONLY FC : ", GET_FRAME_COUNT()) ENDIF #ENDIF
|
|
ELSE
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(sPoolPed[POOL_PED_CELEB].pedIndex, SLOW_BLEND_OUT, TRUE)
|
|
SET_SYNCHRONIZED_SCENE_PHASE(iSyncScenesID_PoolPeds[N1B_SSAT_ENTER_CELEB_ONLY], 1.0)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "HAS_POOL_PED_FINISHED_SURRENDER_REACTION_ANIM - set blend out of N1B_SSAT_ENTER_CELEB_ONLY scene FC : ", GET_FRAME_COUNT()) ENDIF #ENDIF
|
|
ENDIF
|
|
ELIF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncScenesID_PoolPeds[N1B_SSAT_DANCE_LOOP])
|
|
OR IS_SYNCHRONIZED_SCENE_RUNNING(iSyncScenesID_PoolPeds[N1B_SSAT_DANCE_INTRO])
|
|
SET_POOL_PEDS_SYNCED_ANIM(N1B_SSAT_DANCE_OUTRO_CELEB_ONLY)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "HAS_POOL_PED_FINISHED_SURRENDER_REACTION_ANIM - set N1B_SSAT_DANCE_OUTRO_CELEB_ONLY exit scene FC : ", GET_FRAME_COUNT()) ENDIF #ENDIF
|
|
ENDIF
|
|
bDoneDanceOutroSceneForPoolPeds[POOL_PED_CELEB] = TRUE
|
|
ELSE
|
|
// if scene isn't running check ped has finished sync scene task
|
|
IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iSyncScenesID_PoolPeds[N1B_SSAT_DANCE_OUTRO_CELEB_ONLY])
|
|
IF NOT IsPedPerformingTask(sPoolPed[iPoolPedIndex].pedIndex, SCRIPT_TASK_SYNCHRONIZED_SCENE)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "HAS_POOL_PED_FINISHED_SURRENDER_REACTION_ANIM - return TRUE for iPoolPedIndex :", iPoolPedIndex) ENDIF #ENDIF
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELIF iPoolPedIndex = POOL_PED_FEMALE
|
|
IF IS_PED_UNINJURED(sPoolPed[POOL_PED_FEMALE].pedIndex)
|
|
IF NOT bDoneDanceOutroSceneForPoolPeds[POOL_PED_FEMALE]
|
|
IF IsPedPerformingTask(sPoolPed[POOL_PED_FEMALE].pedIndex, SCRIPT_TASK_SYNCHRONIZED_SCENE)
|
|
SET_POOL_PEDS_SYNCED_ANIM(N1B_SSAT_DANCE_OUTRO_FEMALE_ONLY)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "HAS_POOL_PED_FINISHED_SURRENDER_REACTION_ANIM - set N1B_SSAT_DANCE_OUTRO_FEMALE_ONLY exit scene FC : ", GET_FRAME_COUNT()) ENDIF #ENDIF
|
|
ENDIF
|
|
bDoneDanceOutroSceneForPoolPeds[POOL_PED_FEMALE] = TRUE
|
|
ELIF HAS_FEMALE_POOL_PED_FINISHED_STAND_UP_ANIM()
|
|
// if scenes aren't running check ped has finished sync scene task
|
|
IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iSyncScenesID_PoolPeds[N1B_SSAT_DANCE_OUTRO_CELEB_ONLY])
|
|
AND NOT IS_SYNCHRONIZED_SCENE_RUNNING(iSyncScenesID_PoolPeds[N1B_SSAT_STAND_UP_FEMALE_ONLY])
|
|
IF NOT IsPedPerformingTask(sPoolPed[iPoolPedIndex].pedIndex, SCRIPT_TASK_SYNCHRONIZED_SCENE)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "HAS_POOL_PED_FINISHED_SURRENDER_REACTION_ANIM - return TRUE for iPoolPedIndex :", iPoolPedIndex) ENDIF #ENDIF
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
/*IF IS_PED_UNINJURED(sPoolPed[iPoolPedIndex].pedIndex)
|
|
IF iPoolPedIndex = POOL_PED_CELEB
|
|
// apply the reaction animation
|
|
//IF IS_ENTITY_PLAYING_ANIM(sPoolPed[iPoolPedIndex].pedIndex, tlAnimDict_MissionMocappedAnims, "dance_intro_tyler")
|
|
//OR IS_ENTITY_PLAYING_ANIM(sPoolPed[iPoolPedIndex].pedIndex, tlAnimDict_MissionMocappedAnims, "dance_loop_tyler")
|
|
IF IsPedPerformingTask(sPoolPed[iPoolPedIndex].pedIndex, SCRIPT_TASK_SYNCHRONIZED_SCENE)
|
|
|
|
VECTOR vPos, vRot
|
|
//vPos = GET_ANIM_INITIAL_OFFSET_POSITION(tlAnimDict_MissionMocappedAnims, "react_tyler", vSyncScene_HotTub_Rotation, vSyncScene_HotTub_Rotation)
|
|
//vRot = GET_ANIM_INITIAL_OFFSET_ROTATION(tlAnimDict_MissionMocappedAnims, "react_tyler", vSyncScene_HotTub_Rotation, vSyncScene_HotTub_Rotation)
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(sPoolPed[iPoolPedIndex].pedIndex, NORMAL_BLEND_OUT, FALSE)
|
|
TASK_PLAY_ANIM_ADVANCED(sPoolPed[iPoolPedIndex].pedIndex, tlAnimDict_MissionMocappedAnims, "react_tyler", vPos, vRot, NORMAL_BLEND_IN, SLOW_BLEND_OUT, -1, AF_EXTRACT_INITIAL_OFFSET)
|
|
//TASK_PLAY_ANIM(sPoolPed[iPoolPedIndex].pedIndex, tlAnimDict_MissionMocappedAnims, "react_tyler", NORMAL_BLEND_IN, SLOW_BLEND_OUT, -1)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(sPoolPed[iPoolPedIndex].pedIndex)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "HAS_POOL_PED_FINISHED_SURRENDER_REACTION_ANIM - set exit anim from anim task iPoolPedIndex :", iPoolPedIndex) ENDIF #ENDIF
|
|
|
|
// test for the celeb finishing her reaction animation
|
|
ELIF NOT IS_ENTITY_PLAYING_ANIM(sPoolPed[iPoolPedIndex].pedIndex, tlAnimDict_MissionMocappedAnims, "react_tyler")
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "HAS_POOL_PED_FINISHED_SURRENDER_REACTION_ANIM - return TRUE for iPoolPedIndex :", iPoolPedIndex) ENDIF #ENDIF
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
ELIF iPoolPedIndex = POOL_PED_FEMALE
|
|
|
|
// apply the reaction animation
|
|
IF IS_ENTITY_PLAYING_ANIM(sPoolPed[iPoolPedIndex].pedIndex, tlAnimDict_MissionMocappedAnims, "dance_intro_girl")
|
|
OR IS_ENTITY_PLAYING_ANIM(sPoolPed[iPoolPedIndex].pedIndex, tlAnimDict_MissionMocappedAnims, "dance_loop_girl")
|
|
|
|
TASK_PLAY_ANIM(sPoolPed[iPoolPedIndex].pedIndex, tlAnimDict_MissionMocappedAnims, "react_girl", NORMAL_BLEND_IN, SLOW_BLEND_OUT, -1)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(sPoolPed[iPoolPedIndex].pedIndex)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "HAS_POOL_PED_FINISHED_SURRENDER_REACTION_ANIM - set exit anim from anim task iPoolPedIndex :", iPoolPedIndex) ENDIF #ENDIF
|
|
|
|
// apply the reaction animation
|
|
ELIF IsPedPerformingTask(sPoolPed[iPoolPedIndex].pedIndex, SCRIPT_TASK_SYNCHRONIZED_SCENE)
|
|
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(sPoolPed[iPoolPedIndex].pedIndex, NORMAL_BLEND_OUT, FALSE)
|
|
TASK_PLAY_ANIM(sPoolPed[iPoolPedIndex].pedIndex, tlAnimDict_MissionMocappedAnims, "react_girl", NORMAL_BLEND_IN, SLOW_BLEND_OUT, -1)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(sPoolPed[iPoolPedIndex].pedIndex)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "HAS_POOL_PED_FINISHED_SURRENDER_REACTION_ANIM - set exit anim from sync scene task iPoolPedIndex :", iPoolPedIndex) ENDIF #ENDIF
|
|
|
|
// test for the female finishing her reaction animation
|
|
ELIF NOT IS_ENTITY_PLAYING_ANIM(sPoolPed[iPoolPedIndex].pedIndex, tlAnimDict_MissionMocappedAnims, "react_girl")
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "HAS_POOL_PED_FINISHED_SURRENDER_REACTION_ANIM - return TRUE for iPoolPedIndex :", iPoolPedIndex) ENDIF #ENDIF
|
|
RETURN TRUE
|
|
ELSE
|
|
SET_ENTITY_ANIM_SPEED(sPoolPed[iPoolPedIndex].pedIndex, tlAnimDict_MissionMocappedAnims, "react_girl", 1.2)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF*/
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Controls pool peds behaviour.
|
|
/// PARAMS:
|
|
/// i - array index of the pool ped we are going to update
|
|
PROC CONTROL_POOL_PEDS_AI(INT i)
|
|
IF IS_PED_UNINJURED(sPoolPed[i].pedIndex)
|
|
SET_PED_RESET_FLAG(sPoolPed[i].pedIndex, PRF_PreventAllMeleeTakedowns, TRUE) // must be called everyframe to prevent takedown and takedown failed
|
|
IF NOT IS_PED_PERFORMING_STEALTH_KILL(PLAYER_PED_ID()) //having to test this because changes to tasks breaks the execution/takedown moves
|
|
SWITCH (sPoolPed[i].AI)
|
|
// ------------------------------------------
|
|
CASE N1B_PED_AI_STATE_RELAXED
|
|
//currently an idle state
|
|
IF i = POOL_PED_CELEB
|
|
IF NOT IsPedPerformingTask(sPoolPed[i].pedIndex, SCRIPT_TASK_STAND_STILL)
|
|
TASK_STAND_STILL(sPoolPed[i].pedIndex, -1)
|
|
#IF IS_DEBUG_BUILD IF bDebug_Display_PP_AI CPRINTLN(DEBUG_MISSION, "CONTROL_POOL_PEDS_AI - N1B_PED_AI_STATE_RELAXED set for celeb ID = ", i) ENDIF #ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
// ------------------------------------------
|
|
CASE N1B_PED_AI_SETUP_ROUTINE //only used by celeb in pool for now - swim the first length
|
|
IF i = POOL_PED_CELEB
|
|
// swim over to opposite side of the pool
|
|
INT iGotoPos
|
|
IF iCelebInPoolInitialPositionID = NIGEL1B_POOL_SOUTH_SIDE
|
|
iGotoPos = NIGEL1B_POOL_NORTH_SIDE
|
|
ELIF iCelebInPoolInitialPositionID = NIGEL1B_POOL_NORTH_SIDE
|
|
iGotoPos = NIGEL1B_POOL_SOUTH_SIDE
|
|
ENDIF
|
|
OPEN_SEQUENCE_TASK(sequenceAI)
|
|
TASK_GO_STRAIGHT_TO_COORD(NULL, vCelebPoolSwimGotos[iGotoPos], PEDMOVEBLENDRATIO_RUN, DEFAULT_TIME_BEFORE_WARP, fCelebPoolSwimArrivalHeading[iGotoPos])
|
|
//TASK_ACHIEVE_HEADING(NULL, fCelebPoolSwimInitialHeading[iGotoPos], 500)
|
|
CLOSE_SEQUENCE_TASK(sequenceAI)
|
|
CLEAR_PED_TASKS(sPoolPed[i].pedIndex)
|
|
TASK_PERFORM_SEQUENCE(sPoolPed[i].pedIndex, sequenceAI)
|
|
CLEAR_SEQUENCE_TASK(sequenceAI)
|
|
//SET_PED_RESET_FLAG(sPoolPed[i].pedIndex, PRF_AllowTasksIncompatibleWithMotion, TRUE) // added to make the ped swim again...seen from bug 1019576
|
|
sPoolPed[i].AI = N1B_PED_AI_STATE_ROUTINE
|
|
#IF IS_DEBUG_BUILD IF bDebug_Display_PP_AI CPRINTLN(DEBUG_MISSION, "N1B_PED_AI_SETUP_ROUTINE -> N1B_PED_AI_STATE_ROUTINE", " id = ", i) ENDIF #ENDIF
|
|
ENDIF
|
|
BREAK
|
|
// ------------------------------------------
|
|
CASE N1B_PED_AI_STATE_ROUTINE //only used by celeb in pool for now - swim the first length
|
|
IF i = POOL_PED_CELEB
|
|
IF NOT IsPedPerformingTask(sPoolPed[i].pedIndex, SCRIPT_TASK_PERFORM_SEQUENCE)
|
|
//IF IS_COORD_IN_RANGE_OF_COORD_2D(GET_ENTITY_COORDS(sPoolPed[i].pedIndex), vCelebPoolSwimGotos[iGotoPos], 5.0)
|
|
//TASK_STAND_STILL(sPoolPed[i].pedIndex, 500)
|
|
sPoolPed[i].AI = N1B_PED_AI_SETUP_ROUTINE_SECONDARY
|
|
#IF IS_DEBUG_BUILD IF bDebug_Display_PP_AI CPRINTLN(DEBUG_MISSION, "N1B_PED_AI_STATE_ROUTINE -> N1B_PED_AI_SETUP_ROUTINE_SECONDARY", " id = ", i) ENDIF #ENDIF
|
|
ELSE
|
|
//SET_PED_RESET_FLAG(sPoolPed[i].pedIndex, PRF_AllowTasksIncompatibleWithMotion, TRUE) // added to make the ped swim again...seen from bug 1019576
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
// ------------------------------------------
|
|
CASE N1B_PED_AI_SETUP_ROUTINE_SECONDARY //only used by celeb in pool for now - swim the second length - done like this to fix bug 1023500
|
|
IF i = POOL_PED_CELEB
|
|
// swim back to side of the pool he started at
|
|
INT iGotoPos
|
|
IF iCelebInPoolInitialPositionID = NIGEL1B_POOL_SOUTH_SIDE
|
|
iGotoPos = NIGEL1B_POOL_SOUTH_SIDE
|
|
ELIF iCelebInPoolInitialPositionID = NIGEL1B_POOL_NORTH_SIDE
|
|
iGotoPos = NIGEL1B_POOL_NORTH_SIDE
|
|
ENDIF
|
|
OPEN_SEQUENCE_TASK(sequenceAI)
|
|
TASK_GO_STRAIGHT_TO_COORD(NULL, vCelebPoolSwimGotos[iGotoPos], PEDMOVEBLENDRATIO_RUN, DEFAULT_TIME_BEFORE_WARP, fCelebPoolSwimArrivalHeading[iGotoPos])
|
|
//TASK_ACHIEVE_HEADING(NULL, fCelebPoolSwimInitialHeading[iGotoPos], 500)
|
|
CLOSE_SEQUENCE_TASK(sequenceAI)
|
|
CLEAR_PED_TASKS(sPoolPed[i].pedIndex)
|
|
TASK_PERFORM_SEQUENCE(sPoolPed[i].pedIndex, sequenceAI)
|
|
CLEAR_SEQUENCE_TASK(sequenceAI)
|
|
//SET_PED_RESET_FLAG(sPoolPed[i].pedIndex, PRF_AllowTasksIncompatibleWithMotion, TRUE) // added to make the ped swim again...seen from bug 1019576
|
|
sPoolPed[i].AI = N1B_PED_AI_STATE_ROUTINE_SECONDARY
|
|
#IF IS_DEBUG_BUILD IF bDebug_Display_PP_AI CPRINTLN(DEBUG_MISSION, "N1B_PED_AI_SETUP_ROUTINE_SECONDARY -> N1B_PED_AI_STATE_ROUTINE_SECONDARY", " id = ", i) ENDIF #ENDIF
|
|
ENDIF
|
|
BREAK
|
|
// ------------------------------------------
|
|
CASE N1B_PED_AI_STATE_ROUTINE_SECONDARY //only used by celeb in pool for now - swim the second length - done like this to fix bug 1023500
|
|
IF i = POOL_PED_CELEB
|
|
IF NOT IsPedPerformingTask(sPoolPed[i].pedIndex, SCRIPT_TASK_PERFORM_SEQUENCE)
|
|
//IF IS_COORD_IN_RANGE_OF_COORD_2D(GET_ENTITY_COORDS(sPoolPed[i].pedIndex), vCelebPoolSwimGotos[iGotoPos], 5.0)
|
|
//TASK_STAND_STILL(sPoolPed[i].pedIndex, 500)
|
|
sPoolPed[i].AI = N1B_PED_AI_STATE_ROUTINE_COMPLETED
|
|
#IF IS_DEBUG_BUILD IF bDebug_Display_PP_AI CPRINTLN(DEBUG_MISSION, "N1B_PED_AI_STATE_ROUTINE_SECONDARY -> N1B_PED_AI_STATE_ROUTINE_COMPLETED", " id = ", i) ENDIF #ENDIF
|
|
ELSE
|
|
//SET_PED_RESET_FLAG(sPoolPed[i].pedIndex, PRF_AllowTasksIncompatibleWithMotion, TRUE) // added to make the ped swim again...seen from bug 1019576
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
// ------------------------------------------
|
|
CASE N1B_PED_AI_STATE_ROUTINE_COMPLETED //only used by celeb in pool for now
|
|
IF i = POOL_PED_CELEB
|
|
ENDIF
|
|
BREAK
|
|
// ------------------------------------------
|
|
CASE N1B_PED_AI_CELEB_ONLY_SETUP_DO_FINAL_LENGTH //only used by celeb in pool for now
|
|
IF i = POOL_PED_CELEB
|
|
IF IS_ENTITY_ALIVE(sPoolPed[POOL_PED_FEMALE].pedIndex) // also requires female ped to be alive for tasks
|
|
INT iFinalSwimLengthPos
|
|
IF iCelebInPoolInitialPositionID = NIGEL1B_POOL_SOUTH_SIDE
|
|
iFinalSwimLengthPos = NIGEL1B_POOL_NORTH_SIDE
|
|
ELIF iCelebInPoolInitialPositionID = NIGEL1B_POOL_NORTH_SIDE
|
|
iFinalSwimLengthPos = NIGEL1B_POOL_SOUTH_SIDE
|
|
ENDIF
|
|
OPEN_SEQUENCE_TASK(sequenceAI)
|
|
TASK_GO_STRAIGHT_TO_COORD(NULL, vCelebPoolSwimGotos[iFinalSwimLengthPos], PEDMOVEBLENDRATIO_RUN, DEFAULT_TIME_BEFORE_WARP) //, fCelebPoolSwimArrivalHeading[iFinalSwimLengthPos])
|
|
//TASK_TURN_PED_TO_FACE_ENTITY(NULL, sPoolPed[POOL_PED_FEMALE].pedIndex), -1)
|
|
CLOSE_SEQUENCE_TASK(sequenceAI)
|
|
CLEAR_PED_TASKS(sPoolPed[i].pedIndex)
|
|
TASK_PERFORM_SEQUENCE(sPoolPed[i].pedIndex, sequenceAI)
|
|
CLEAR_SEQUENCE_TASK(sequenceAI)
|
|
//SET_PED_RESET_FLAG(sPoolPed[i].pedIndex, PRF_AllowTasksIncompatibleWithMotion, TRUE) // added to make the ped swim again...seen from bug 1019576
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sPoolPed[i].pedIndex, TRUE)
|
|
sPoolPed[i].AI = N1B_PED_AI_CELEB_ONLY_STATE_DO_FINAL_LENGTH
|
|
#IF IS_DEBUG_BUILD IF bDebug_Display_PP_AI CPRINTLN(DEBUG_MISSION, "N1B_PED_AI_CELEB_ONLY_SETUP_DO_FINAL_LENGTH -> N1B_PED_AI_CELEB_ONLY_STATE_DO_FINAL_LENGTH", " id = ", i) ENDIF #ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
// ------------------------------------------
|
|
CASE N1B_PED_AI_CELEB_ONLY_STATE_DO_FINAL_LENGTH //only used by celeb in pool for now
|
|
IF i = POOL_PED_CELEB
|
|
INT iFinalSwimLengthPos
|
|
IF iCelebInPoolInitialPositionID = NIGEL1B_POOL_SOUTH_SIDE
|
|
iFinalSwimLengthPos = NIGEL1B_POOL_NORTH_SIDE
|
|
ELIF iCelebInPoolInitialPositionID = NIGEL1B_POOL_NORTH_SIDE
|
|
iFinalSwimLengthPos = NIGEL1B_POOL_SOUTH_SIDE
|
|
ENDIF
|
|
IF IS_ENTITY_ALIVE(sPoolPed[POOL_PED_FEMALE].pedIndex) // also requires female ped to be alive for tasks
|
|
IF NOT IsPedPerformingTask(sPoolPed[i].pedIndex, SCRIPT_TASK_PERFORM_SEQUENCE)
|
|
IF IS_ENTITY_IN_RANGE_COORDS(sPoolPed[i].pedIndex, vCelebPoolSwimGotos[iFinalSwimLengthPos], 2.5)
|
|
#IF IS_DEBUG_BUILD IF bDebug_Display_PP_AI CPRINTLN(DEBUG_MISSION, "N1B_PED_AI_CELEB_ONLY_STATE_DO_FINAL_LENGTH -> N1B_PED_AI_CELEB_ONLY_SETUP_LEAVE_POOL done task", " id = ", i) ENDIF #ENDIF
|
|
sPoolPed[i].AI = N1B_PED_AI_CELEB_ONLY_SETUP_LEAVE_POOL
|
|
ELSE
|
|
#IF IS_DEBUG_BUILD IF bDebug_Display_PP_AI CPRINTLN(DEBUG_MISSION, "N1B_PED_AI_CELEB_ONLY_STATE_DO_FINAL_LENGTH -> N1B_PED_AI_CELEB_ONLY_SETUP_DO_FINAL_LENGTH reapply", " id = ", i) ENDIF #ENDIF
|
|
sPoolPed[i].AI = N1B_PED_AI_CELEB_ONLY_SETUP_DO_FINAL_LENGTH
|
|
ENDIF
|
|
ELSE
|
|
//SET_PED_RESET_FLAG(sPoolPed[i].pedIndex, PRF_AllowTasksIncompatibleWithMotion, TRUE) // added to make the ped swim again...seen from bug 1019576
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
// ------------------------------------------
|
|
CASE N1B_PED_AI_CELEB_ONLY_SETUP_LEAVE_POOL //only used by celeb in pool for now
|
|
IF i = POOL_PED_CELEB
|
|
INT iLeavePoolSide
|
|
// get out the opposite side to where he started, as this will be where the player is
|
|
IF iCelebInPoolInitialPositionID = NIGEL1B_POOL_SOUTH_SIDE
|
|
iLeavePoolSide = NIGEL1B_POOL_NORTH_SIDE
|
|
ELIF iCelebInPoolInitialPositionID = NIGEL1B_POOL_NORTH_SIDE
|
|
iLeavePoolSide = NIGEL1B_POOL_SOUTH_SIDE
|
|
ENDIF
|
|
OPEN_SEQUENCE_TASK(sequenceAI)
|
|
TASK_GO_STRAIGHT_TO_COORD(NULL, vStepOutOfPoolPos[iLeavePoolSide], PEDMOVEBLENDRATIO_WALK, DEFAULT_TIME_BEFORE_WARP, fStepOutOfPoolHeading[iLeavePoolSide]) //TASK_GO_STRAIGHT_TO_COORD gets stuck on lip
|
|
TASK_CLIMB(NULL, FALSE)
|
|
CLOSE_SEQUENCE_TASK(sequenceAI)
|
|
CLEAR_PED_TASKS(sPoolPed[i].pedIndex)
|
|
TASK_PERFORM_SEQUENCE(sPoolPed[i].pedIndex, sequenceAI)
|
|
CLEAR_SEQUENCE_TASK(sequenceAI)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sPoolPed[i].pedIndex, TRUE)
|
|
sPoolPed[i].AI = N1B_PED_AI_CELEB_ONLY_STATE_LEAVE_POOL
|
|
#IF IS_DEBUG_BUILD IF bDebug_Display_PP_AI CPRINTLN(DEBUG_MISSION, "N1B_PED_AI_CELEB_ONLY_SETUP_LEAVE_POOL -> N1B_PED_AI_CELEB_ONLY_STATE_LEAVE_POOL", " id = ", i) ENDIF #ENDIF
|
|
ENDIF
|
|
BREAK
|
|
// ------------------------------------------
|
|
CASE N1B_PED_AI_CELEB_ONLY_STATE_LEAVE_POOL //only used by celeb in pool for now
|
|
IF i = POOL_PED_CELEB
|
|
INT iLeavePoolSide
|
|
// get out the opposite side to where he started, as this will be where the player is
|
|
IF iCelebInPoolInitialPositionID = NIGEL1B_POOL_SOUTH_SIDE
|
|
iLeavePoolSide = NIGEL1B_POOL_NORTH_SIDE
|
|
ELIF iCelebInPoolInitialPositionID = NIGEL1B_POOL_NORTH_SIDE
|
|
iLeavePoolSide = NIGEL1B_POOL_SOUTH_SIDE
|
|
ENDIF
|
|
IF IS_ENTITY_IN_RANGE_COORDS(sPoolPed[i].pedIndex, vPedLeftPoolPos[iLeavePoolSide], fDistToPoolEdge)
|
|
IF IsPedPerformingTask(sPoolPed[i].pedIndex, SCRIPT_TASK_PERFORM_SEQUENCE)
|
|
CLEAR_PED_TASKS_IMMEDIATELY(sPoolPed[i].pedIndex) //having to do this as TASK_CLIMB makes him walk for too long after the climb
|
|
#IF IS_DEBUG_BUILD IF bDebug_Display_PP_AI CPRINTLN(DEBUG_MISSION, "N1B_PED_AI_CELEB_ONLY_STATE_LEAVE_POOL -> N1B_PED_AI_CELEB_ONLY_SETUP_POSE done, task cleared as out water", " id = ", i) ENDIF #ENDIF
|
|
sPoolPed[i].AI = N1B_PED_AI_CELEB_ONLY_STATE_LEFT_POOL_COMPLETED
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IsPedPerformingTask(sPoolPed[i].pedIndex, SCRIPT_TASK_PERFORM_SEQUENCE)
|
|
IF NOT IS_ENTITY_IN_WATER(sPoolPed[i].pedIndex)
|
|
AND NOT IS_ENTITY_IN_RANGE_COORDS(sPoolPed[i].pedIndex, vHotTubDimensionsCentrePos, fHotTubDimensionsWidth) //inside the HOT_TUB
|
|
AND NOT IS_ENTITY_IN_ANGLED_AREA(sPoolPed[i].pedIndex, vPoolDimensionsMinPos, vPoolDimensionsMaxPos, fPoolDimensionsWidth) //inside the pool
|
|
AND NOT IS_PED_CLIMBING(sPoolPed[i].pedIndex) // added for bug 970159
|
|
CLEAR_PED_TASKS_IMMEDIATELY(sPoolPed[i].pedIndex) //having to do this as TASK_CLIMB makes him walk for too long after the climb
|
|
#IF IS_DEBUG_BUILD IF bDebug_Display_PP_AI CPRINTLN(DEBUG_MISSION, "N1B_PED_AI_CELEB_ONLY_STATE_LEAVE_POOL -> N1B_PED_AI_CELEB_ONLY_SETUP_POSE done, task ended unexpected but already out of water", " id = ", i) ENDIF #ENDIF
|
|
sPoolPed[i].AI = N1B_PED_AI_CELEB_ONLY_STATE_LEFT_POOL_COMPLETED
|
|
ELSE
|
|
#IF IS_DEBUG_BUILD IF bDebug_Display_PP_AI CPRINTLN(DEBUG_MISSION, "N1B_PED_AI_CELEB_ONLY_STATE_LEAVE_POOL -> N1B_PED_AI_CELEB_ONLY_SETUP_LEAVE_POOL reapply task", " id = ", i) ENDIF #ENDIF
|
|
sPoolPed[i].AI = N1B_PED_AI_CELEB_ONLY_SETUP_LEAVE_POOL
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
// ------------------------------------------
|
|
CASE N1B_PED_AI_CELEB_ONLY_STATE_LEFT_POOL_COMPLETED //only used by celeb in pool for now
|
|
BREAK
|
|
// ------------------------------------------
|
|
CASE N1B_PED_AI_CELEB_ONLY_SETUP_POSE //only used by celeb in pool for now
|
|
IF i = POOL_PED_CELEB
|
|
OPEN_SEQUENCE_TASK(sequenceAI)
|
|
TASK_PLAY_ANIM(NULL, tlAnimDict_MissionMocappedAnims, "that_had_to_be_tyler", SLOW_BLEND_IN, SLOW_BLEND_OUT, -1, AF_DEFAULT)
|
|
CLOSE_SEQUENCE_TASK(sequenceAI)
|
|
CLEAR_PED_TASKS(sPoolPed[i].pedIndex)
|
|
TASK_PERFORM_SEQUENCE(sPoolPed[i].pedIndex, sequenceAI)
|
|
CLEAR_SEQUENCE_TASK(sequenceAI)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sPoolPed[i].pedIndex, TRUE)
|
|
SET_PED_RESET_FLAG(sPoolPed[i].pedIndex, PRF_UseHeadOrientationForPerception, TRUE) // B*1537407 - makes sure CAN_PED_SEE_HATED_PED check accoun the ped's head rotation
|
|
sPoolPed[i].AI = N1B_PED_AI_CELEB_ONLY_STATE_POSE
|
|
#IF IS_DEBUG_BUILD IF bDebug_Display_PP_AI CPRINTLN(DEBUG_MISSION, "N1B_PED_AI_CELEB_ONLY_SETUP_POSE -> N1B_PED_AI_CELEB_ONLY_STATE_POSE", " id = ", i) ENDIF #ENDIF
|
|
ENDIF
|
|
BREAK
|
|
// ------------------------------------------
|
|
CASE N1B_PED_AI_CELEB_ONLY_STATE_POSE //only used by celeb in pool for now
|
|
IF i = POOL_PED_CELEB
|
|
IF NOT IsPedPerformingTask(sPoolPed[i].pedIndex, SCRIPT_TASK_PERFORM_SEQUENCE)
|
|
#IF IS_DEBUG_BUILD IF bDebug_Display_PP_AI CPRINTLN(DEBUG_MISSION, "N1B_PED_AI_CELEB_ONLY_STATE_POSE -> N1B_PED_AI_CELEB_ONLY_STATE_POSE_COMPLETED done task ", " id = ", i) ENDIF #ENDIF
|
|
sPoolPed[i].AI = N1B_PED_AI_CELEB_ONLY_STATE_POSE_COMPLETED
|
|
ELSE
|
|
SET_PED_RESET_FLAG(sPoolPed[i].pedIndex, PRF_UseHeadOrientationForPerception, TRUE) // B*1537407 - makes sure CAN_PED_SEE_HATED_PED check accoun the ped's head rotation
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
// ------------------------------------------
|
|
CASE N1B_PED_AI_CELEB_ONLY_STATE_POSE_COMPLETED //only used by celeb in pool for now
|
|
BREAK
|
|
|
|
// ------------------------------------------
|
|
CASE N1B_PED_AI_CELEB_ONLY_SETUP_GOTO_HOT_TUB //only used by celeb in pool for now
|
|
IF i = POOL_PED_CELEB
|
|
INT iLeavePoolSide
|
|
IF iCelebInPoolInitialPositionID = NIGEL1B_POOL_SOUTH_SIDE
|
|
iLeavePoolSide = NIGEL1B_POOL_NORTH_SIDE // , 158.0680 this is North pos, as we end up this side
|
|
ELIF iCelebInPoolInitialPositionID = NIGEL1B_POOL_NORTH_SIDE
|
|
iLeavePoolSide = NIGEL1B_POOL_SOUTH_SIDE // , 16.5588 this is South pos, as we end up this side
|
|
ENDIF
|
|
|
|
VECTOR vEnterTubPosition, vEnterTubOrientation
|
|
//vEnterTubPosition = << -1061.36, 363.19, 70.84 >> hard coded
|
|
//vEnterTubOrientation = << 0.0, 0.0, -119.30 >> hard coded
|
|
vEnterTubPosition = GET_ANIM_INITIAL_OFFSET_POSITION(tlAnimDict_MissionMocappedAnims, "ENTER", vSyncScene_HotTub_Position, vSyncScene_HotTub_Rotation)
|
|
vEnterTubOrientation = GET_ANIM_INITIAL_OFFSET_ROTATION(tlAnimDict_MissionMocappedAnims, "ENTER", vSyncScene_HotTub_Position, vSyncScene_HotTub_Rotation)
|
|
CPRINTLN(DEBUG_MISSION, "GENERATED pos and rot for ENTER anim - pos = ", vEnterTubPosition, " rot = ", vEnterTubOrientation)
|
|
|
|
SET_PED_PATH_PREFER_TO_AVOID_WATER(sPoolPed[i].pedIndex, TRUE)
|
|
SET_PED_PATH_MAY_ENTER_WATER(sPoolPed[i].pedIndex, FALSE)
|
|
SET_PED_ALTERNATE_WALK_ANIM(sPoolPed[i].pedIndex, tlAnimDict_MissionMocappedAnims, "walk_tyler")
|
|
#IF IS_DEBUG_BUILD IF bDebug_Display_PP_AI CPRINTLN(DEBUG_MISSION, "N1B_PED_AI_CELEB_ONLY_SETUP_GOTO_HOT_TUB -> set Tyler alt walk anims", " id = ", i) ENDIF #ENDIF
|
|
|
|
OPEN_SEQUENCE_TASK(sequenceAI)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, vGotowardsHotTubInitialPos[iLeavePoolSide], PEDMOVEBLENDRATIO_WALK,
|
|
DEFAULT_TIME_BEFORE_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_NO_STOPPING) // ENAV_NO_STOPPING added to make not between gotos
|
|
//TASK_GO_STRAIGHT_TO_COORD(NULL, vEnterTubPosition, PEDMOVEBLENDRATIO_WALK, DEFAULT_TIME_BEFORE_WARP, vEnterTubOrientation.z)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, vEnterTubPosition, PEDMOVEBLENDRATIO_WALK, DEFAULT_TIME_BEFORE_WARP,
|
|
DEFAULT_NAVMESH_RADIUS, ENAV_STOP_EXACTLY, vEnterTubOrientation.z)
|
|
CLOSE_SEQUENCE_TASK(sequenceAI)
|
|
//CLEAR_PED_TASKS(sPoolPed[i].pedIndex)
|
|
TASK_PERFORM_SEQUENCE(sPoolPed[i].pedIndex, sequenceAI)
|
|
CLEAR_SEQUENCE_TASK(sequenceAI)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sPoolPed[i].pedIndex, TRUE)
|
|
sPoolPed[i].AI = N1B_PED_AI_CELEB_ONLY_STATE_GOTO_HOT_TUB
|
|
#IF IS_DEBUG_BUILD IF bDebug_Display_PP_AI CPRINTLN(DEBUG_MISSION, "N1B_PED_AI_CELEB_ONLY_SETUP_GOTO_HOT_TUB -> N1B_PED_AI_CELEB_ONLY_STATE_GOTO_HOT_TUB", " id = ", i) ENDIF #ENDIF
|
|
ENDIF
|
|
BREAK
|
|
// ------------------------------------------
|
|
CASE N1B_PED_AI_CELEB_ONLY_STATE_GOTO_HOT_TUB //only used by celeb in pool for now
|
|
IF i = POOL_PED_CELEB
|
|
IF NOT IsPedPerformingTask(sPoolPed[i].pedIndex, SCRIPT_TASK_PERFORM_SEQUENCE)
|
|
VECTOR vEnterTubPosition
|
|
//vEnterTubPosition = << -1061.36, 363.19, 70.84 >> hard coded
|
|
vEnterTubPosition = GET_ANIM_INITIAL_OFFSET_POSITION(tlAnimDict_MissionMocappedAnims, "ENTER", vSyncScene_HotTub_Position, vSyncScene_HotTub_Rotation)
|
|
|
|
IF IS_ENTITY_IN_RANGE_COORDS(sPoolPed[i].pedIndex, vEnterTubPosition, 1.0)
|
|
CLEAR_PED_ALTERNATE_WALK_ANIM(sPoolPed[i].pedIndex)
|
|
sPoolPed[i].AI = N1B_PED_AI_CELEB_ONLY_SETUP_ENTER_HOT_TUB_ANIM
|
|
#IF IS_DEBUG_BUILD IF bDebug_Display_PP_AI CPRINTLN(DEBUG_MISSION, "N1B_PED_AI_CELEB_ONLY_STATE_GOTO_HOT_TUB -> N1B_PED_AI_CELEB_ONLY_SETUP_ENTER_HOT_TUB_ANIM", " id = ", i) ENDIF #ENDIF
|
|
ELSE
|
|
#IF IS_DEBUG_BUILD IF bDebug_Display_PP_AI CPRINTLN(DEBUG_MISSION, "N1B_PED_AI_CELEB_ONLY_STATE_GOTO_HOT_TUB -> N1B_PED_AI_CELEB_ONLY_SETUP_GOTO_HOT_TUB", " id = ", i) ENDIF #ENDIF
|
|
sPoolPed[i].AI = N1B_PED_AI_CELEB_ONLY_SETUP_GOTO_HOT_TUB
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
// ------------------------------------------
|
|
CASE N1B_PED_AI_CELEB_ONLY_SETUP_ENTER_HOT_TUB_ANIM //only used by celeb in pool for now
|
|
IF i = POOL_PED_CELEB
|
|
/*REQUEST_ANIM_DICT(tlAnimDict_MissionMocappedAnims)
|
|
IF HAS_ANIM_DICT_LOADED(tlAnimDict_MissionMocappedAnims)
|
|
VECTOR vEnterTubPosition, vEnterTubOrientation
|
|
vEnterTubPosition = << -1061.36, 363.19, 70.84 >> // << -1061.618, 362.785, 70.72 >> // 70.911 >>
|
|
vEnterTubOrientation = << 0.0, 0.0, -119.30 >> // << 0.000, 0.000, -107.0 >> // 105.120 >>
|
|
TASK_PLAY_ANIM_ADVANCED(sPoolPed[i].pedIndex, tlAnimDict_MissionMocappedAnims, "ENTER", vEnterTubPosition, vEnterTubOrientation,
|
|
SLOW_BLEND_IN, SLOW_BLEND_OUT, -1) // AF_EXTRACT_INITIAL_OFFSET | AF_IGNORE_GRAVITY | AF_OVERRIDE_PHYSICS | AF_TURN_OFF_COLLISION)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(sPoolPed[i].pedIndex)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sPoolPed[i].pedIndex, TRUE)
|
|
sPoolPed[i].AI = N1B_PED_AI_CELEB_ONLY_SETUP_DANCE_IN_HOT_TUB
|
|
#IF IS_DEBUG_BUILD IF bDebug_Display_PP_AI CPRINTLN(DEBUG_MISSION, "N1B_PED_AI_CELEB_ONLY_SETUP_ENTER_HOT_TUB_ANIM -> N1B_PED_AI_CELEB_ONLY_SETUP_DANCE_IN_HOT_TUB", " id = ", i) ENDIF #ENDIF
|
|
ENDIF*/
|
|
SET_POOL_PEDS_SYNCED_ANIM(N1B_SSAT_ENTER_CELEB_ONLY)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sPoolPed[i].pedIndex, TRUE)
|
|
sPoolPed[i].AI = N1B_PED_AI_CELEB_ONLY_SETUP_DANCE_IN_HOT_TUB
|
|
#IF IS_DEBUG_BUILD IF bDebug_Display_PP_AI CPRINTLN(DEBUG_MISSION, "N1B_PED_AI_CELEB_ONLY_SETUP_ENTER_HOT_TUB_ANIM -> N1B_PED_AI_CELEB_ONLY_SETUP_DANCE_IN_HOT_TUB", " id = ", i) ENDIF #ENDIF
|
|
ENDIF
|
|
BREAK
|
|
// ------------------------------------------
|
|
CASE N1B_PED_AI_CELEB_ONLY_STATE_ENTER_HOT_TUB_ANIM //only used by celeb in pool for now
|
|
IF i = POOL_PED_CELEB
|
|
IF IsPedPerformingTask(sPoolPed[i].pedIndex, SCRIPT_TASK_PLAY_ANIM)
|
|
sPoolPed[i].AI = N1B_PED_AI_CELEB_ONLY_SETUP_DANCE_IN_HOT_TUB
|
|
#IF IS_DEBUG_BUILD IF bDebug_Display_PP_AI CPRINTLN(DEBUG_MISSION, "N1B_PED_AI_CELEB_ONLY_STATE_ENTER_HOT_TUB_ANIM -> N1B_PED_AI_CELEB_ONLY_SETUP_DANCE_IN_HOT_TUB", " id = ", i) ENDIF #ENDIF
|
|
ELSE
|
|
sPoolPed[i].AI = N1B_PED_AI_CELEB_ONLY_SETUP_ENTER_HOT_TUB_ANIM
|
|
#IF IS_DEBUG_BUILD IF bDebug_Display_PP_AI CPRINTLN(DEBUG_MISSION, "N1B_PED_AI_CELEB_ONLY_STATE_ENTER_HOT_TUB_ANIM -> N1B_PED_AI_CELEB_ONLY_SETUP_ENTER_HOT_TUB_ANIM", " id = ", i) ENDIF #ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
// ------------------------------------------
|
|
CASE N1B_PED_AI_CELEB_ONLY_SETUP_DANCE_IN_HOT_TUB //only used by celeb in pool for now
|
|
IF i = POOL_PED_CELEB
|
|
/*IF NOT IS_ENTITY_PLAYING_ANIM(sPoolPed[i].pedIndex, tlAnimDict_MissionMocappedAnims, "ENTER")
|
|
SET_POOL_PEDS_SYNCED_ANIM(N1B_SSAT_DANCE_INTRO)
|
|
sPoolPed[i].AI = N1B_PED_AI_CELEB_ONLY_STATE_DANCE_IN_HOT_TUB
|
|
#IF IS_DEBUG_BUILD IF bDebug_Display_PP_AI CPRINTLN(DEBUG_MISSION, "N1B_PED_AI_CELEB_ONLY_SETUP_DANCE_IN_HOT_TUB -> N1B_PED_AI_CELEB_ONLY_STATE_DANCE_IN_HOT_TUB", " id = ", i) ENDIF #ENDIF
|
|
sPoolPed[POOL_PED_FEMALE].AI = N1B_PED_AI_FEMALE_ONLY_SETUP_WATCH_DANCE_IN_HOT_TUB
|
|
#IF IS_DEBUG_BUILD IF bDebug_Display_PP_AI CPRINTLN(DEBUG_MISSION, "Female AI Updated to Match dance anim started -> N1B_PED_AI_FEMALE_ONLY_SETUP_WATCH_DANCE_IN_HOT_TUB") ENDIF #ENDIF
|
|
ENDIF*/
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncScenesID_PoolPeds[N1B_SSAT_ENTER_CELEB_ONLY])
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncScenesID_PoolPeds[N1B_SSAT_ENTER_CELEB_ONLY]) > 0.999
|
|
SET_POOL_PEDS_SYNCED_ANIM(N1B_SSAT_DANCE_INTRO)
|
|
sPoolPed[i].AI = N1B_PED_AI_CELEB_ONLY_STATE_DANCE_IN_HOT_TUB
|
|
#IF IS_DEBUG_BUILD IF bDebug_Display_PP_AI CPRINTLN(DEBUG_MISSION, "N1B_PED_AI_CELEB_ONLY_SETUP_DANCE_IN_HOT_TUB -> N1B_PED_AI_CELEB_ONLY_STATE_DANCE_IN_HOT_TUB", " id = ", i) ENDIF #ENDIF
|
|
sPoolPed[POOL_PED_FEMALE].AI = N1B_PED_AI_FEMALE_ONLY_SETUP_WATCH_DANCE_IN_HOT_TUB
|
|
#IF IS_DEBUG_BUILD IF bDebug_Display_PP_AI CPRINTLN(DEBUG_MISSION, "Female AI Updated to Match dance anim started -> N1B_PED_AI_FEMALE_ONLY_SETUP_WATCH_DANCE_IN_HOT_TUB") ENDIF #ENDIF
|
|
ENDIF
|
|
ELSE
|
|
SET_POOL_PEDS_SYNCED_ANIM(N1B_SSAT_DANCE_INTRO)
|
|
sPoolPed[i].AI = N1B_PED_AI_CELEB_ONLY_STATE_DANCE_IN_HOT_TUB
|
|
#IF IS_DEBUG_BUILD IF bDebug_Display_PP_AI CPRINTLN(DEBUG_MISSION, "N1B_PED_AI_CELEB_ONLY_SETUP_DANCE_IN_HOT_TUB -> N1B_PED_AI_CELEB_ONLY_STATE_DANCE_IN_HOT_TUB", " id = ", i) ENDIF #ENDIF
|
|
sPoolPed[POOL_PED_FEMALE].AI = N1B_PED_AI_FEMALE_ONLY_SETUP_WATCH_DANCE_IN_HOT_TUB
|
|
#IF IS_DEBUG_BUILD IF bDebug_Display_PP_AI CPRINTLN(DEBUG_MISSION, "Female AI Updated to Match dance anim started -> N1B_PED_AI_FEMALE_ONLY_SETUP_WATCH_DANCE_IN_HOT_TUB") ENDIF #ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
// ------------------------------------------
|
|
CASE N1B_PED_AI_CELEB_ONLY_STATE_DANCE_IN_HOT_TUB //only used by celeb in pool for now
|
|
IF i = POOL_PED_CELEB
|
|
IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iSyncScenesID_PoolPeds[N1B_SSAT_DANCE_LOOP])
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncScenesID_PoolPeds[N1B_SSAT_DANCE_INTRO])
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncScenesID_PoolPeds[N1B_SSAT_DANCE_INTRO]) > 0.999
|
|
SET_POOL_PEDS_SYNCED_ANIM(N1B_SSAT_DANCE_LOOP)
|
|
#IF IS_DEBUG_BUILD IF bDebug_Display_PP_AI CPRINTLN(DEBUG_MISSION, "N1B_PED_AI_CELEB_ONLY_STATE_DANCE_IN_HOT_TUB -> N1B_SSAT_DANCE_LOOP set interupted end of N1B_SSAT_DANCE_INTRO", " id = ", i) ENDIF #ENDIF
|
|
ENDIF
|
|
ELSE
|
|
SET_POOL_PEDS_SYNCED_ANIM(N1B_SSAT_DANCE_LOOP)
|
|
#IF IS_DEBUG_BUILD IF bDebug_Display_PP_AI CPRINTLN(DEBUG_MISSION, "N1B_PED_AI_CELEB_ONLY_STATE_DANCE_IN_HOT_TUB -> N1B_SSAT_DANCE_LOOP set N1B_SSAT_DANCE_INTRO had finished", " id = ", i) ENDIF #ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
/*IF i = POOL_PED_CELEB
|
|
IF NOT IS_ENTITY_PLAYING_ANIM(sPoolPed[i].pedIndex, tlAnimDict_MissionMocappedAnims, "dance_intro_tyler")
|
|
AND NOT IS_ENTITY_PLAYING_ANIM(sPoolPed[i].pedIndex, tlAnimDict_MissionMocappedAnims, "dance_loop_tyler")
|
|
sPoolPed[i].AI = N1B_PED_AI_CELEB_ONLY_SETUP_DANCE_IN_HOT_TUB
|
|
#IF IS_DEBUG_BUILD IF bDebug_Display_PP_AI CPRINTLN(DEBUG_MISSION, "N1B_PED_AI_CELEB_ONLY_STATE_DANCE_IN_HOT_TUB -> N1B_PED_AI_CELEB_ONLY_SETUP_DANCE_IN_HOT_TUB", " id = ", i) ENDIF #ENDIF
|
|
ENDIF
|
|
ENDIF*/
|
|
BREAK
|
|
// ------------------------------------------
|
|
CASE N1B_PED_AI_FEMALE_ONLY_SETUP_WATCH_DANCE_IN_HOT_TUB //only used by female in hot tub
|
|
/*IF i = POOL_PED_FEMALE
|
|
REQUEST_ANIM_DICT(tlAnimDict_MissionMocappedAnims)
|
|
IF HAS_ANIM_DICT_LOADED(tlAnimDict_MissionMocappedAnims)
|
|
IF IsPedPerformingTask(sPoolPed[i].pedIndex, SCRIPT_TASK_SYNCHRONIZED_SCENE)
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(sPoolPed[i].pedIndex, SLOW_BLEND_OUT, FALSE)
|
|
ENDIF
|
|
OPEN_SEQUENCE_TASK(sequenceAI)
|
|
TASK_PLAY_ANIM(NULL, tlAnimDict_MissionMocappedAnims, "dance_intro_girl", NORMAL_BLEND_IN, SLOW_BLEND_OUT, -1, AF_TURN_OFF_COLLISION)
|
|
TASK_PLAY_ANIM(NULL, tlAnimDict_MissionMocappedAnims, "dance_loop_girl", SLOW_BLEND_IN, SLOW_BLEND_OUT, -1, AF_LOOPING | AF_TURN_OFF_COLLISION)
|
|
CLOSE_SEQUENCE_TASK(sequenceAI)
|
|
CLEAR_PED_TASKS(sPoolPed[i].pedIndex)
|
|
TASK_PERFORM_SEQUENCE(sPoolPed[i].pedIndex, sequenceAI)
|
|
CLEAR_SEQUENCE_TASK(sequenceAI)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(sPoolPed[i].pedIndex) // fixes pop issue when ped changes to new anims
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sPoolPed[i].pedIndex, TRUE)
|
|
sPoolPed[i].AI = N1B_PED_AI_FEMALE_ONLY_STATE_WATCH_DANCE_IN_HOT_TUB
|
|
#IF IS_DEBUG_BUILD IF bDebug_Display_PP_AI CPRINTLN(DEBUG_MISSION, "N1B_PED_AI_FEMALE_ONLY_SETUP_WATCH_DANCE_IN_HOT_TUB -> N1B_PED_AI_FEMALE_ONLY_STATE_WATCH_DANCE_IN_HOT_TUB", " id = ", i) ENDIF #ENDIF
|
|
ENDIF
|
|
ENDIF*/
|
|
BREAK
|
|
// ------------------------------------------
|
|
CASE N1B_PED_AI_FEMALE_ONLY_STATE_WATCH_DANCE_IN_HOT_TUB //only used by female in hot tub
|
|
/*IF i = POOL_PED_FEMALE
|
|
IF NOT IS_ENTITY_PLAYING_ANIM(sPoolPed[i].pedIndex, tlAnimDict_MissionMocappedAnims, "dance_intro_girl")
|
|
AND NOT IS_ENTITY_PLAYING_ANIM(sPoolPed[i].pedIndex, tlAnimDict_MissionMocappedAnims, "dance_loop_girl")
|
|
sPoolPed[i].AI = N1B_PED_AI_FEMALE_ONLY_SETUP_WATCH_DANCE_IN_HOT_TUB
|
|
#IF IS_DEBUG_BUILD IF bDebug_Display_PP_AI CPRINTLN(DEBUG_MISSION, "N1B_PED_AI_FEMALE_ONLY_STATE_WATCH_DANCE_IN_HOT_TUB -> N1B_PED_AI_FEMALE_ONLY_SETUP_WATCH_DANCE_IN_HOT_TUB", " id = ", i) ENDIF #ENDIF
|
|
ENDIF
|
|
ENDIF*/
|
|
BREAK
|
|
// ------------------------------------------
|
|
CASE N1B_PED_AI_CELEB_ONLY_SETUP_GET_OUT_POOL_FOR_CLOTHES
|
|
IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iSyncScenesID_PoolPeds[N1B_SSAT_DANCE_LOOP])
|
|
AND NOT IsPedPerformingTask(sPoolPed[i].pedIndex, SCRIPT_TASK_SYNCHRONIZED_SCENE)
|
|
OPEN_SEQUENCE_TASK(sequenceAI)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, vGotowardsHotTubInitialPos[NIGEL1B_POOL_NORTH_SIDE], PEDMOVEBLENDRATIO_WALK, DEFAULT_TIME_BEFORE_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_NO_STOPPING)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, vCelebGoToClothesPos, PEDMOVEBLENDRATIO_WALK,
|
|
DEFAULT_TIME_BEFORE_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_DEFAULT, 223.4962)
|
|
TASK_PLAY_ANIM(NULL, "rcmnigel1b", "wipehead", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_DEFAULT)
|
|
TASK_STAND_STILL(NULL, -1)
|
|
CLOSE_SEQUENCE_TASK(sequenceAI)
|
|
CLEAR_PED_TASKS(sPoolPed[i].pedIndex)
|
|
TASK_PERFORM_SEQUENCE(sPoolPed[i].pedIndex, sequenceAI)
|
|
CLEAR_SEQUENCE_TASK(sequenceAI)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sPoolPed[i].pedIndex, TRUE)
|
|
#IF IS_DEBUG_BUILD IF bDebug_Display_PP_AI CPRINTLN(DEBUG_MISSION, "NIGEL 1B: ", "N1B_PED_AI_CELEB_ONLY_SETUP_GET_OUT_POOL_FOR_CLOTHES", " id = ", i) ENDIF #ENDIF
|
|
sPoolPed[i].AI = N1B_PED_AI_CELEB_ONLY_STATE_GET_OUT_POOL_FOR_CLOTHES
|
|
ENDIF
|
|
BREAK
|
|
// ------------------------------------------
|
|
CASE N1B_PED_AI_CELEB_ONLY_STATE_GET_OUT_POOL_FOR_CLOTHES
|
|
IF IS_ENTITY_IN_RANGE_COORDS(sPoolPed[i].pedIndex, vCelebGoToClothesPos, NIGEL1B_RANGE_CELEB_PED_CLOSE_TO_CLOTHES_PICKUP)
|
|
bHasCelebReachedClothesLocation = TRUE
|
|
#IF IS_DEBUG_BUILD IF bDebug_Display_PP_AI CPRINTLN(DEBUG_MISSION, "NIGEL 1B: ", "N1B_PED_AI_CELEB_ONLY_STATE_GET_OUT_POOL_FOR_CLOTHES done, set bHasCelebReachedClothesLocation TRUE ", " id = ", i) ENDIF #ENDIF
|
|
ELSE
|
|
IF NOT IsPedPerformingTask(sPoolPed[i].pedIndex, SCRIPT_TASK_PERFORM_SEQUENCE)
|
|
#IF IS_DEBUG_BUILD IF bDebug_Display_PP_AI CPRINTLN(DEBUG_MISSION, "NIGEL 1B: ", "N1B_PED_AI_CELEB_ONLY_STATE_GET_OUT_POOL_FOR_CLOTHES -> N1B_PED_AI_CELEB_ONLY_SETUP_GET_OUT_POOL_FOR_CLOTHES no task", " id = ", i) ENDIF #ENDIF
|
|
sPoolPed[i].AI = N1B_PED_AI_CELEB_ONLY_SETUP_GET_OUT_POOL_FOR_CLOTHES
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
// ------------------------------------------
|
|
CASE N1B_PED_AI_CELEB_ONLY_SETUP_SEARCH_FOR_CLOTHES
|
|
OPEN_SEQUENCE_TASK(sequenceAI)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, << -1049.9147, 357.2381, 68.9132 >>, PEDMOVEBLENDRATIO_WALK,
|
|
DEFAULT_TIME_BEFORE_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_DEFAULT, 71.1227)
|
|
TASK_STAND_STILL(NULL, 1000) //look for a scratch head anim instead
|
|
//play a searching anim here
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, << -1048.4167, 364.7032, 68.9129 >>, PEDMOVEBLENDRATIO_WALK,
|
|
DEFAULT_TIME_BEFORE_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_DEFAULT, 6.9753)
|
|
TASK_STAND_STILL(NULL, 2000) //look for a scratch head anim instead
|
|
//play a searching anim here
|
|
SET_SEQUENCE_TO_REPEAT(sequenceAI, REPEAT_FOREVER)
|
|
CLOSE_SEQUENCE_TASK(sequenceAI)
|
|
CLEAR_PED_TASKS(sPoolPed[i].pedIndex)
|
|
TASK_PERFORM_SEQUENCE(sPoolPed[i].pedIndex, sequenceAI)
|
|
CLEAR_SEQUENCE_TASK(sequenceAI)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sPoolPed[i].pedIndex, TRUE)
|
|
#IF IS_DEBUG_BUILD IF bDebug_Display_PP_AI CPRINTLN(DEBUG_MISSION, "NIGEL 1B: ", "N1B_PED_AI_CELEB_ONLY_SETUP_SEARCH_FOR_CLOTHES -> N1B_PED_AI_CELEB_ONLY_STATE_SEARCH_FOR_CLOTHES", " id = ", i) ENDIF #ENDIF
|
|
sPoolPed[i].AI = N1B_PED_AI_CELEB_ONLY_STATE_SEARCH_FOR_CLOTHES
|
|
BREAK
|
|
// ------------------------------------------
|
|
CASE N1B_PED_AI_CELEB_ONLY_STATE_SEARCH_FOR_CLOTHES
|
|
IF NOT IsPedPerformingTask(sPoolPed[i].pedIndex, SCRIPT_TASK_PERFORM_SEQUENCE)
|
|
// PED HAS LOST HIS TASK, RESET IT
|
|
sPoolPed[i].AI = N1B_PED_AI_CELEB_ONLY_SETUP_SEARCH_FOR_CLOTHES
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CONTROL_POOL_PEDS_AI - N1B_PED_AI_CELEB_ONLY_STATE_SEARCH_FOR_CLOTHES - PED ID = ", i) ENDIF #ENDIF
|
|
#IF IS_DEBUG_BUILD IF bDebug_Display_PP_AI CPRINTLN(DEBUG_MISSION, "NIGEL 1B: ", "N1B_PED_AI_CELEB_ONLY_STATE_SEARCH_FOR_CLOTHES -> N1B_PED_AI_CELEB_ONLY_SETUP_SEARCH_FOR_CLOTHES no task", " id = ", i) ENDIF #ENDIF
|
|
ENDIF
|
|
BREAK
|
|
// ------------------------------------------
|
|
CASE N1B_PED_AI_CELEB_ONLY_SETUP_GET_TO_POS_FOR_CALL_THE_COPS
|
|
//check if we need to get the celeb into a suitable pos for the phonecall
|
|
IF IS_ENTITY_IN_WATER(sPoolPed[i].pedIndex)
|
|
OR IS_ENTITY_IN_RANGE_COORDS(sPoolPed[i].pedIndex, vHotTubDimensionsCentrePos, fHotTubDimensionsWidth) //inside the HOT_TUB
|
|
OR IS_ENTITY_IN_ANGLED_AREA(sPoolPed[i].pedIndex, vPoolDimensionsMinPos, vPoolDimensionsMaxPos, fPoolDimensionsWidth) //inside the pool
|
|
CLEAR_PED_TASKS(sPoolPed[i].pedIndex)
|
|
VECTOR vGotoPos
|
|
FLOAT fGoToHeading
|
|
vGotoPos = vGotowardsHotTubInitialPos[NIGEL1B_POOL_NORTH_SIDE] // north side of the HOT_TUB
|
|
fGoToHeading = 201.7237
|
|
//IF VDIST2(vPlayerPos, vGotoPos) >
|
|
IF IS_COORD_IN_RANGE_OF_COORD(vPlayerPos, vGotoPos, 2.5) // if player is at that spot go for the opposite sid
|
|
vGotoPos = vGotowardsHotTubInitialPos[NIGEL1B_POOL_SOUTH_SIDE] // south side of the HOT_TUB
|
|
fGoToHeading = 325.0476
|
|
ENDIF
|
|
TASK_LOOK_AT_ENTITY(sPoolPed[i].pedIndex, PLAYER_PED_ID(), -1)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(sPoolPed[i].pedIndex, vGotoPos, PEDMOVEBLENDRATIO_WALK, DEFAULT_TIME_BEFORE_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_DEFAULT, fGoToHeading)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sPoolPed[i].pedIndex, TRUE)
|
|
#IF IS_DEBUG_BUILD IF bDebug_Display_PP_AI CPRINTLN(DEBUG_MISSION, "NIGEL 1B: ", "N1B_PED_AI_CELEB_ONLY_SETUP_GET_TO_POS_FOR_CALL_THE_COPS -> N1B_PED_AI_CELEB_ONLY_STATE_GET_TO_POS_FOR_CALL_THE_COPS", " id = ", i) ENDIF #ENDIF
|
|
sPoolPed[i].AI = N1B_PED_AI_CELEB_ONLY_STATE_GET_TO_POS_FOR_CALL_THE_COPS
|
|
ELSE
|
|
#IF IS_DEBUG_BUILD IF bDebug_Display_PP_AI CPRINTLN(DEBUG_MISSION, "NIGEL 1B: ", "N1B_PED_AI_CELEB_ONLY_SETUP_GET_TO_POS_FOR_CALL_THE_COPS -> N1B_PED_AI_CELEB_ONLY_SETUP_CALL_THE_COPS", " id = ", i) ENDIF #ENDIF
|
|
sPoolPed[i].AI = N1B_PED_AI_CELEB_ONLY_SETUP_CALL_THE_COPS
|
|
ENDIF
|
|
BREAK
|
|
// ------------------------------------------
|
|
CASE N1B_PED_AI_CELEB_ONLY_STATE_GET_TO_POS_FOR_CALL_THE_COPS
|
|
IF NOT IsPedPerformingTask(sPoolPed[i].pedIndex, SCRIPT_TASK_FOLLOW_NAV_MESH_TO_COORD)
|
|
#IF IS_DEBUG_BUILD IF bDebug_Display_PP_AI CPRINTLN(DEBUG_MISSION, "NIGEL 1B: ", "N1B_PED_AI_CELEB_ONLY_STATE_GET_TO_POS_FOR_CALL_THE_COPS -> N1B_PED_AI_CELEB_ONLY_SETUP_GET_TO_POS_FOR_CALL_THE_COPS task finished", " id = ", i) ENDIF #ENDIF
|
|
sPoolPed[i].AI = N1B_PED_AI_CELEB_ONLY_SETUP_GET_TO_POS_FOR_CALL_THE_COPS
|
|
ELSE
|
|
IF NOT IS_ENTITY_IN_WATER(sPoolPed[i].pedIndex)
|
|
IF NOT IS_ENTITY_IN_RANGE_COORDS(sPoolPed[i].pedIndex, vHotTubDimensionsCentrePos, fHotTubDimensionsWidth) //inside the HOT_TUB
|
|
IF NOT IS_ENTITY_IN_ANGLED_AREA(sPoolPed[i].pedIndex, vPoolDimensionsMinPos, vPoolDimensionsMaxPos, fPoolDimensionsWidth) //inside the pool
|
|
IF NOT IS_PED_CLIMBING(sPoolPed[i].pedIndex) // added for bug 970159
|
|
IF NOT IS_ENTITY_IN_RANGE_COORDS(sPoolPed[i].pedIndex, << -1057.13635, 369.17224, 69.18319 >>, 1.25) // B*1218631 - block stopping on North corner of pool where feet clip through the wall
|
|
IF NOT IS_ENTITY_IN_RANGE_COORDS(sPoolPed[i].pedIndex, << -1057.10815, 354.76880, 69.19383 >>, 1.25) // B*1218631 - block stopping on South corner of pool where feet clip through the wall
|
|
IF NOT IS_ENTITY_IN_ANGLED_AREA(sPoolPed[i].pedIndex, <<-1051.339722,358.404541,66.914551>>, <<-1051.361816,365.510620,71.914162>>, 2.250000) // B*1327618 - block stopping in shrubs next to pool
|
|
//AND NOT GET_IS_TASK_ACTIVE(sPoolPed[i].pedIndex, CODE_TASK_CLIMB_LADDER)
|
|
CLEAR_PED_TASKS(sPoolPed[i].pedIndex)
|
|
#IF IS_DEBUG_BUILD IF bDebug_Display_PP_AI CPRINTLN(DEBUG_MISSION, "NIGEL 1B: ", "N1B_PED_AI_CELEB_ONLY_STATE_GET_TO_POS_FOR_CALL_THE_COPS -> N1B_PED_AI_CELEB_ONLY_SETUP_CALL_THE_COPS", " id = ", i) ENDIF #ENDIF
|
|
sPoolPed[i].AI = N1B_PED_AI_CELEB_ONLY_SETUP_CALL_THE_COPS
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
// ------------------------------------------
|
|
CASE N1B_PED_AI_CELEB_ONLY_SETUP_CALL_THE_COPS
|
|
IF NOT IS_ENTITY_ALIVE(moCelebPhone.object)
|
|
IF DOES_ENTITY_EXIST(moCelebPhone.object) // if the phone already exists but is dead, delete it and create a new one
|
|
DELETE_OBJECT(moCelebPhone.object)
|
|
#IF IS_DEBUG_BUILD IF bDebug_Display_PP_AI CPRINTLN(DEBUG_MISSION, "NIGEL 1B: ", "N1B_PED_AI_CELEB_ONLY_SETUP_CALL_THE_COPS -> moCelebPhone existed but dead so deleted") ENDIF #ENDIF
|
|
ENDIF
|
|
REQUEST_MODEL(moCelebPhone.model)
|
|
IF HAS_MODEL_LOADED(moCelebPhone.model)
|
|
moCelebPhone.object = CREATE_OBJECT(moCelebPhone.model, (GET_ENTITY_COORDS(sPoolPed[i].pedIndex) + << 0.0, 0.0, -10.0 >>)) //spawn under ground
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(moCelebPhone.model)
|
|
#IF IS_DEBUG_BUILD IF bDebug_Display_PP_AI CPRINTLN(DEBUG_MISSION, "NIGEL 1B: ", "N1B_PED_AI_CELEB_ONLY_SETUP_CALL_THE_COPS -> moCelebPhone.object created!") ENDIF #ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_ENTITY_ATTACHED_TO_ENTITY(moCelebPhone.object, sPoolPed[i].pedIndex)
|
|
ATTACH_ENTITY_TO_ENTITY(moCelebPhone.object, sPoolPed[i].pedIndex, GET_PED_BONE_INDEX(sPoolPed[i].pedIndex, BONETAG_PH_R_HAND),
|
|
moCelebPhone.vPosition, moCelebPhone.vRotation, TRUE, TRUE)
|
|
#IF IS_DEBUG_BUILD IF bDebug_Display_PP_AI CPRINTLN(DEBUG_MISSION, "NIGEL 1B: ", "N1B_PED_AI_CELEB_ONLY_SETUP_CALL_THE_COPS -> moCelebPhone.object attached to ped", " id = ", i) ENDIF #ENDIF
|
|
ENDIF
|
|
CLEAR_PED_TASKS(sPoolPed[i].pedIndex)
|
|
TASK_LOOK_AT_ENTITY(sPoolPed[i].pedIndex, PLAYER_PED_ID(), -1, SLF_NARROWEST_PITCH_LIMIT | SLF_NARROWEST_YAW_LIMIT)
|
|
TASK_USE_MOBILE_PHONE(sPoolPed[i].pedIndex, TRUE)
|
|
/*
|
|
OPEN_SEQUENCE_TASK(sequenceAI)
|
|
//IF IS_ENTITY_IN_WATER(sPoolPed[i].pedIndex)
|
|
VECTOR vTempGotoNorthSide
|
|
VECTOR vTempGotoSouthSide
|
|
VECTOR vCurrentCoords
|
|
vCurrentCoords = GET_ENTITY_COORDS(sPoolPed[i].pedIndex)
|
|
IF IS_COORD_IN_RANGE_OF_COORD(vCurrentCoords, vHotTubDimensionsCentrePos, fHotTubDimensionsWidth) //inside the HOT_TUB
|
|
vTempGotoNorthSide = << -1059.4672, 364.6955, 69.7516 >>
|
|
vTempGotoSouthSide = << -1059.9067, 359.1591, 69.7516 >>
|
|
IF (VDIST2(vTempGotoNorthSide, vCurrentCoords)
|
|
< VDIST2(vTempGotoSouthSide, vCurrentCoords)) // if player is closer to north side point, go there
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, vTempGotoNorthSide, PEDMOVEBLENDRATIO_WALK)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CONTROL_POOL_PEDS_AI - N1B_PED_AI_CELEB_ONLY_SETUP_CALL_THE_COPS - GET OUT OF HOT_TUB COORD NORTH SIDE = ", vTempGotoNorthSide, " GIVEN PED ID = ", i) ENDIF #ENDIF
|
|
ELSE // else go to the south point
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, vTempGotoSouthSide, PEDMOVEBLENDRATIO_WALK)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CONTROL_POOL_PEDS_AI - N1B_PED_AI_CELEB_ONLY_SETUP_CALL_THE_COPS - GET OUT OF HOT_TUB COORD NORTH SIDE = ", vTempGotoSouthSide, " GIVEN PED ID = ", i) ENDIF #ENDIF
|
|
ENDIF
|
|
ELIF IS_ENTITY_IN_ANGLED_AREA(sPoolPed[i].pedIndex, vPoolDimensionsMinPos, vPoolDimensionsMaxPos, fPoolDimensionsWidth) //inside the pool
|
|
vTempGotoNorthSide = << -1054.5756, 371.9297, 68.9139 >>
|
|
vTempGotoSouthSide = << -1054.2416, 352.0960, 68.9139 >>
|
|
IF (VDIST2(vTempGotoNorthSide, vCurrentCoords)
|
|
< VDIST2(vTempGotoSouthSide, vCurrentCoords)) // if player is closer to north side point, go there
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, vTempGotoNorthSide, PEDMOVEBLENDRATIO_WALK)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CONTROL_POOL_PEDS_AI - N1B_PED_AI_CELEB_ONLY_SETUP_CALL_THE_COPS - GET OUT OF POOL COORD NORTH SIDE = ", vTempGotoNorthSide, " GIVEN PED ID = ", i) ENDIF #ENDIF
|
|
ELSE // else go to the south point
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, vTempGotoSouthSide, PEDMOVEBLENDRATIO_WALK)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CONTROL_POOL_PEDS_AI - N1B_PED_AI_CELEB_ONLY_SETUP_CALL_THE_COPS - GET OUT OF POOL COORD NORTH SIDE = ", vTempGotoSouthSide, " GIVEN PED ID = ", i) ENDIF #ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
TASK_USE_MOBILE_PHONE(NULL, TRUE)
|
|
TASK_TURN_PED_TO_FACE_ENTITY(NULL, PLAYER_PED_ID(), -1)
|
|
CLOSE_SEQUENCE_TASK(sequenceAI)
|
|
*/
|
|
//TASK_PERFORM_SEQUENCE(sPoolPed[i].pedIndex, sequenceAI)
|
|
//CLEAR_SEQUENCE_TASK(sequenceAI)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sPoolPed[i].pedIndex, TRUE)
|
|
iTimer_DelayForPhoneTask = GET_GAME_TIMER()
|
|
#IF IS_DEBUG_BUILD IF bDebug_Display_PP_AI CPRINTLN(DEBUG_MISSION, "NIGEL 1B: ", "N1B_PED_AI_CELEB_ONLY_SETUP_CALL_THE_COPS -> N1B_PED_AI_CELEB_ONLY_STATE_CALL_THE_COPS", " id = ", i) ENDIF #ENDIF
|
|
sPoolPed[i].AI = N1B_PED_AI_CELEB_ONLY_STATE_CALL_THE_COPS
|
|
ENDIF
|
|
BREAK
|
|
// ------------------------------------------
|
|
CASE N1B_PED_AI_CELEB_ONLY_STATE_CALL_THE_COPS
|
|
IF IS_PED_RUNNING_MOBILE_PHONE_TASK(sPoolPed[i].pedIndex)
|
|
IF NOT IS_PED_HEADTRACKING_PED(sPoolPed[i].pedIndex, PLAYER_PED_ID())
|
|
TASK_LOOK_AT_ENTITY(sPoolPed[i].pedIndex, PLAYER_PED_ID(), -1, SLF_NARROWEST_PITCH_LIMIT | SLF_NARROWEST_YAW_LIMIT)
|
|
ENDIF
|
|
IF (GET_GAME_TIMER() - iTimer_DelayForPhoneTask > 1500) //delay for phone actually making it up to the ear
|
|
#IF IS_DEBUG_BUILD IF bDebug_Display_PP_AI CPRINTLN(DEBUG_MISSION, "NIGEL 1B: ", "N1B_PED_AI_CELEB_ONLY_STATE_CALL_THE_COPS detected ped using mobile phone task", " id = ", i) ENDIF #ENDIF
|
|
bCelebOkToStartPhoneConvo = TRUE
|
|
ENDIF
|
|
ELSE
|
|
bCelebOkToStartPhoneConvo = FALSE
|
|
sPoolPed[i].AI = N1B_PED_AI_CELEB_ONLY_SETUP_CALL_THE_COPS
|
|
#IF IS_DEBUG_BUILD IF bDebug_Display_PP_AI CPRINTLN(DEBUG_MISSION, "NIGEL 1B: ", "N1B_PED_AI_CELEB_ONLY_STATE_CALL_THE_COPS -> N1B_PED_AI_CELEB_ONLY_SETUP_CALL_THE_COPS reapply task", " id = ", i) ENDIF #ENDIF
|
|
ENDIF
|
|
BREAK
|
|
// ------------------------------------------
|
|
CASE N1B_PED_AI_CELEB_ONLY_SETUP_END_PHONECALL
|
|
IF IS_PED_RUNNING_MOBILE_PHONE_TASK(sPoolPed[i].pedIndex)
|
|
TASK_USE_MOBILE_PHONE(sPoolPed[i].pedIndex, FALSE)
|
|
TASK_LOOK_AT_ENTITY(sPoolPed[i].pedIndex, PLAYER_PED_ID(), -1)
|
|
//CLEAR_PED_TASKS(sPoolPed[i].pedIndex)
|
|
//CLEAR_PED_SECONDARY_TASK(sPoolPed[i].pedIndex) // mobile phone task is now classed as secondary but this won't show him put the phone back down
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sPoolPed[i].pedIndex, TRUE)
|
|
#IF IS_DEBUG_BUILD IF bDebug_Display_PP_AI CPRINTLN(DEBUG_MISSION, "NIGEL 1B: ", "N1B_PED_AI_CELEB_ONLY_SETUP_END_PHONECALL -> IS_PED_RUNNING_MOBILE_PHONE_TASK - TASK_USE_MOBILE_PHONE(sPoolPed[i].pedIndex, FALSE) ", " id = ", i) ENDIF #ENDIF
|
|
ELSE
|
|
SAFE_REMOVE_OBJECT(moCelebPhone.object, TRUE)
|
|
TASK_LOOK_AT_ENTITY(sPoolPed[i].pedIndex, PLAYER_PED_ID(), -1)
|
|
#IF IS_DEBUG_BUILD IF bDebug_Display_PP_AI CPRINTLN(DEBUG_MISSION, "NIGEL 1B: ", "N1B_PED_AI_CELEB_ONLY_SETUP_END_PHONECALL -> N1B_PED_AI_CELEB_ONLY_STATE_END_PHONECALL", " id = ", i) ENDIF #ENDIF
|
|
sPoolPed[i].AI = N1B_PED_AI_CELEB_ONLY_STATE_END_PHONECALL
|
|
ENDIF
|
|
BREAK
|
|
// ------------------------------------------
|
|
CASE N1B_PED_AI_CELEB_ONLY_STATE_END_PHONECALL
|
|
BREAK
|
|
// ------------------------------------------
|
|
CASE N1B_PED_AI_SETUP_AWARE_OF_PLAYER
|
|
IF IS_ENTITY_PLAYING_ANIM(sPoolPed[i].pedIndex, "rcmnigel1b", "wipehead")
|
|
STOP_ANIM_TASK(sPoolPed[i].pedIndex, "rcmnigel1b", "wipehead", SLOW_BLEND_OUT)
|
|
ENDIF
|
|
IF i = POOL_PED_CELEB
|
|
CLEAR_PED_ALTERNATE_WALK_ANIM(sPoolPed[i].pedIndex)
|
|
//#IF IS_DEBUG_BUILD IF bDebug_Display_PP_AI CPRINTLN(DEBUG_MISSION, "NIGEL 1B: ", "N1B_PED_AI_SETUP_AWARE_OF_PLAYER - alt walk anim cleared", " id = ", i) ENDIF #ENDIF
|
|
CLEAR_PED_TASKS(sPoolPed[i].pedIndex) //B*1051019 - Tyler didn't turn to face ped
|
|
TASK_LOOK_AT_ENTITY(sPoolPed[i].pedIndex, PLAYER_PED_ID(), -1)
|
|
TASK_TURN_PED_TO_FACE_ENTITY(sPoolPed[i].pedIndex, PLAYER_PED_ID(), -1)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sPoolPed[i].pedIndex, TRUE)
|
|
sPoolPed[i].iTimer = GET_GAME_TIMER()
|
|
#IF IS_DEBUG_BUILD IF bDebug_Display_PP_AI CPRINTLN(DEBUG_MISSION, "NIGEL 1B: ", "N1B_PED_AI_SETUP_AWARE_OF_PLAYER", " id = ", i) ENDIF #ENDIF
|
|
sPoolPed[i].AI = N1B_PED_AI_STATE_AWARE_OF_PLAYER
|
|
ELIF i = POOL_PED_FEMALE
|
|
IF HAS_FEMALE_POOL_PED_FINISHED_STAND_UP_ANIM()
|
|
TASK_LOOK_AT_ENTITY(sPoolPed[i].pedIndex, PLAYER_PED_ID(), -1)
|
|
TASK_TURN_PED_TO_FACE_ENTITY(sPoolPed[i].pedIndex, PLAYER_PED_ID(), -1)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sPoolPed[i].pedIndex, TRUE)
|
|
sPoolPed[i].iTimer = GET_GAME_TIMER()
|
|
#IF IS_DEBUG_BUILD IF bDebug_Display_PP_AI CPRINTLN(DEBUG_MISSION, "NIGEL 1B: ", "N1B_PED_AI_SETUP_AWARE_OF_PLAYER", " id = ", i) ENDIF #ENDIF
|
|
sPoolPed[i].AI = N1B_PED_AI_STATE_AWARE_OF_PLAYER
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
// ------------------------------------------
|
|
CASE N1B_PED_AI_STATE_AWARE_OF_PLAYER
|
|
// allow idle anims
|
|
IF NOT IsPedPerformingTask(sPoolPed[i].pedIndex, SCRIPT_TASK_PLAY_ANIM)
|
|
IF NOT IS_PED_FACING_PED(sPoolPed[i].pedIndex, PLAYER_PED_ID(), 45.0)
|
|
IF NOT IsPedPerformingTask(sPoolPed[i].pedIndex, SCRIPT_TASK_TURN_PED_TO_FACE_ENTITY)
|
|
#IF IS_DEBUG_BUILD IF bDebug_Display_PP_AI CPRINTLN(DEBUG_MISSION, "CONTROL_POOL_PEDS_AI - N1B_PED_AI_STATE_AWARE_OF_PLAYER -> N1B_PED_AI_SETUP_AWARE_OF_PLAYER ID = ", i) ENDIF #ENDIF
|
|
sPoolPed[i].AI = N1B_PED_AI_SETUP_AWARE_OF_PLAYER
|
|
ENDIF
|
|
ELSE
|
|
IF HAS_TIME_PASSED(sPoolPed[i].iTimer, GET_RANDOM_INT_IN_RANGE(750, 3000))
|
|
AND NOT IS_ENTITY_IN_WATER(sPoolPed[i].pedIndex)
|
|
AND NOT IS_ENTITY_IN_ANGLED_AREA(sPoolPed[i].pedIndex, vPoolDimensionsMinPos, vPoolDimensionsMaxPos, fPoolDimensionsWidth) //inside the pool
|
|
STRING sTempAnimName
|
|
IF i = POOL_PED_FEMALE
|
|
sTempAnimName = "react_small_variations_k"
|
|
ELSE
|
|
IF GET_RANDOM_INT_IN_RANGE(0, 10) > 5
|
|
sTempAnimName = "react_small_variations_m"
|
|
ELSE
|
|
sTempAnimName = "react_small_variations_n"
|
|
ENDIF
|
|
ENDIF
|
|
IF SET_PED_PLAY_AWARE_OF_PLAYER_ANIM(sPoolPed[i].pedIndex, sTempAnimName, SLOW_BLEND_IN, SLOW_BLEND_OUT)
|
|
sPoolPed[i].iTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_PED_FACING_PED(sPoolPed[i].pedIndex, PLAYER_PED_ID(), 170.0) // stop the anim early if the player goes behind them
|
|
CLEAR_PED_TASKS(sPoolPed[i].pedIndex)
|
|
#IF IS_DEBUG_BUILD IF bDebug_Display_PP_AI CPRINTLN(DEBUG_MISSION, "CONTROL_POOL_PEDS_AI - N1B_PED_AI_STATE_AWARE_OF_PLAYER stopped idle anim early for player behind ped ID = ", i) ENDIF #ENDIF
|
|
ENDIF
|
|
sPoolPed[i].iTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
IF i = POOL_PED_FEMALE
|
|
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(sPoolPed[i].pedIndex, PLAYER_PED_ID())
|
|
#IF IS_DEBUG_BUILD IF bDebug_Display_PP_AI CPRINTLN(DEBUG_MISSION, "CONTROL_POOL_PEDS_AI - N1B_PED_AI_STATE_AWARE_OF_PLAYER -> N1B_PED_AI_SETUP_BEATEN_UP female ped attacked by the player ID = ", i) ENDIF #ENDIF
|
|
sPoolPed[i].AI = N1B_PED_AI_SETUP_BEATEN_UP
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
// ------------------------------------------
|
|
CASE N1B_PED_AI_SETUP_AWARE_OF_GARDENER
|
|
IF IS_ENTITY_ALIVE(sGardenerPed.pedIndex)
|
|
AND ePoolAreaState = N1B_POOL_AREA_STATE_GARDENER_INTERRUPTED
|
|
IF IS_ENTITY_PLAYING_ANIM(sPoolPed[i].pedIndex, "rcmnigel1b", "wipehead")
|
|
STOP_ANIM_TASK(sPoolPed[i].pedIndex, "rcmnigel1b", "wipehead", SLOW_BLEND_OUT)
|
|
ENDIF
|
|
IF i = POOL_PED_CELEB
|
|
CLEAR_PED_ALTERNATE_WALK_ANIM(sPoolPed[i].pedIndex)
|
|
//#IF IS_DEBUG_BUILD IF bDebug_Display_PP_AI CPRINTLN(DEBUG_MISSION, "NIGEL 1B: ", "N1B_PED_AI_SETUP_AWARE_OF_GARDENER - alt walk anim cleared", " id = ", i) ENDIF #ENDIF
|
|
ENDIF
|
|
CLEAR_PED_TASKS(sPoolPed[i].pedIndex) //B*1051019 - Tyler didn't turn to face ped
|
|
TASK_LOOK_AT_ENTITY(sPoolPed[i].pedIndex, sGardenerPed.pedIndex, -1)
|
|
TASK_TURN_PED_TO_FACE_ENTITY(sPoolPed[i].pedIndex, sGardenerPed.pedIndex, -1)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sPoolPed[i].pedIndex, TRUE)
|
|
#IF IS_DEBUG_BUILD IF bDebug_Display_PP_AI CPRINTLN(DEBUG_MISSION, "NIGEL 1B: ", "N1B_PED_AI_SETUP_AWARE_OF_GARDENER", " id = ", i) ENDIF #ENDIF
|
|
sPoolPed[i].AI = N1B_PED_AI_STATE_AWARE_OF_GARDENER
|
|
ELSE
|
|
#IF IS_DEBUG_BUILD IF bDebug_Display_PP_AI CPRINTLN(DEBUG_MISSION, "NIGEL 1B: ", "N1B_PED_AI_SETUP_AWARE_OF_GARDENER -> N1B_PED_AI_SETUP_AWARE_OF_PLAYER", " id = ", i) ENDIF #ENDIF
|
|
sPoolPed[i].AI = N1B_PED_AI_SETUP_AWARE_OF_PLAYER
|
|
ENDIF
|
|
BREAK
|
|
// ------------------------------------------
|
|
CASE N1B_PED_AI_STATE_AWARE_OF_GARDENER
|
|
IF NOT IsPedPerformingTask(sPoolPed[i].pedIndex, SCRIPT_TASK_TURN_PED_TO_FACE_ENTITY)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CONTROL_POOL_PEDS_AI - N1B_PED_AI_STATE_AWARE_OF_GARDENER -> N1B_PED_AI_SETUP_AWARE_OF_GARDENER ID = ", i) ENDIF #ENDIF
|
|
sPoolPed[i].AI = N1B_PED_AI_SETUP_AWARE_OF_GARDENER
|
|
ENDIF
|
|
// switch to tracking player if gardener is dead / finish intrupt state
|
|
IF NOT IS_ENTITY_ALIVE(sGardenerPed.pedIndex)
|
|
OR ePoolAreaState != N1B_POOL_AREA_STATE_GARDENER_INTERRUPTED
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CONTROL_POOL_PEDS_AI - N1B_PED_AI_STATE_AWARE_OF_GARDENER -> N1B_PED_AI_SETUP_AWARE_OF_PLAYER ID = ", i) ENDIF #ENDIF
|
|
sPoolPed[i].AI = N1B_PED_AI_SETUP_AWARE_OF_PLAYER
|
|
ENDIF
|
|
IF i = POOL_PED_FEMALE
|
|
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(sPoolPed[i].pedIndex, PLAYER_PED_ID())
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CONTROL_POOL_PEDS_AI - N1B_PED_AI_STATE_AWARE_OF_GARDENER -> N1B_PED_AI_SETUP_BEATEN_UP female ped attacked by the player ID = ", i) ENDIF #ENDIF
|
|
sPoolPed[i].AI = N1B_PED_AI_SETUP_BEATEN_UP
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
// ------------------------------------------
|
|
CASE N1B_PED_AI_SETUP_WAIT_TO_ATTACK
|
|
OPEN_SEQUENCE_TASK(sequenceAI)
|
|
IF IS_ENTITY_IN_WATER(sPoolPed[i].pedIndex)
|
|
//TASK_GET OUT POOL
|
|
VECTOR vTempGotoPos
|
|
vTempGotoPos = GET_ENTITY_COORDS(sPoolPed[i].pedIndex)
|
|
IF GET_SAFE_COORD_FOR_PED(vTempGotoPos, TRUE, vTempGotoPos)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, vTempGotoPos, PEDMOVEBLENDRATIO_RUN)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CONTROL_POOL_PEDS_AI - N1B_PED_AI_SETUP_WAIT_TO_ATTACK - GET OUT OF POOL COORD GIVEN PED ID = ", i) ENDIF #ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
TASK_TURN_PED_TO_FACE_ENTITY(NULL, PLAYER_PED_ID(), -1)
|
|
CLOSE_SEQUENCE_TASK(sequenceAI)
|
|
CLEAR_PED_TASKS_IMMEDIATELY(sPoolPed[i].pedIndex)
|
|
TASK_PERFORM_SEQUENCE(sPoolPed[i].pedIndex, sequenceAI)
|
|
CLEAR_SEQUENCE_TASK(sequenceAI)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sPoolPed[i].pedIndex, TRUE)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CONTROL_POOL_PEDS_AI - N1B_PED_AI_SETUP_WAIT_TO_ATTACK - PED ID = ", i) ENDIF #ENDIF
|
|
sPoolPed[i].AI = N1B_PED_AI_STATE_WAIT_TO_ATTACK
|
|
BREAK
|
|
// ------------------------------------------
|
|
CASE N1B_PED_AI_STATE_WAIT_TO_ATTACK
|
|
//Check for getting beaten up
|
|
IF GET_ENTITY_HEALTH(sPoolPed[i].pedIndex) < NIGEL1B_BEATEN_UP_HEALTH_THRESHOLD
|
|
sPoolPed[i].AI = N1B_PED_AI_SETUP_BEATEN_UP
|
|
ELIF NOT IS_ENTITY_IN_WATER(PLAYER_PED_ID())
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CONTROL_POOL_PEDS_AI - N1B_PED_AI_STATE_WAIT_TO_ATTACK -> N1B_PED_AI_SETUP_ATTACK - PED ID = player out water ", i) ENDIF #ENDIF
|
|
//sPoolPed[i].AI = N1B_PED_AI_SETUP_ATTACK
|
|
ELSE
|
|
IF NOT IsPedPerformingTask(sPoolPed[i].pedIndex, SCRIPT_TASK_PERFORM_SEQUENCE)
|
|
// PED HAS LOST HIS TASK, RESET IT
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CONTROL_POOL_PEDS_AI - N1B_PED_AI_STATE_WAIT_TO_ATTACK -> N1B_PED_AI_SETUP_WAIT_TO_ATTACK task no running - PED ID = ", i) ENDIF #ENDIF
|
|
sPoolPed[i].AI = N1B_PED_AI_SETUP_WAIT_TO_ATTACK
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
// ------------------------------------------
|
|
CASE N1B_PED_AI_SETUP_BEATEN_UP
|
|
IF i = POOL_PED_CELEB
|
|
IF IS_ENTITY_ALIVE(moCelebPhone.object)
|
|
IF IS_ENTITY_ATTACHED_TO_ENTITY(moCelebPhone.object, sPoolPed[i].pedIndex)
|
|
DETACH_ENTITY(moCelebPhone.object)
|
|
ENDIF
|
|
SAFE_REMOVE_OBJECT(moCelebPhone.object, FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
//SET_PED_ALTERNATE_WALK_ANIM(sPoolPed[i].pedIndex, "move_injured_generic", "walk")
|
|
SET_PED_CAN_RAGDOLL(sPoolPed[i].pedIndex, TRUE)
|
|
IF NOT IS_PED_RAGDOLL(sPoolPed[i].pedIndex)
|
|
CLEAR_PED_TASKS(sPoolPed[i].pedIndex)
|
|
SET_PED_TO_RAGDOLL(sPoolPed[i].pedIndex, 1000, 1000, TASK_RELAX)
|
|
ENDIF
|
|
//doesn't work how i wanted, because the ped health drains to zero and he dies failing the mission.
|
|
/*
|
|
IF (GET_ENTITY_HEALTH(sPoolPed[i].pedIndex) > 100)
|
|
SET_ENTITY_HEALTH(sPoolPed[i].pedIndex, 100)
|
|
ENDIF
|
|
SET_PED_INJURED_ON_GROUND_BEHAVIOUR(sPoolPed[i].pedIndex, -1.0)
|
|
*/
|
|
sPoolPed[i].AI = N1B_PED_AI_STATE_BEATEN_UP
|
|
BREAK
|
|
// ------------------------------------------
|
|
CASE N1B_PED_AI_STATE_BEATEN_UP
|
|
IF NOT IS_PED_RAGDOLL(sPoolPed[i].pedIndex)
|
|
IF NOT IsPedPerformingTask(sPoolPed[i].pedIndex, SCRIPT_TASK_COWER)
|
|
AND NOT IsPedPerformingTask(sPoolPed[i].pedIndex, SCRIPT_TASK_HANDS_UP)
|
|
//Additional checks to stop peds cowering under water
|
|
IF IS_ENTITY_IN_WATER(sPoolPed[i].pedIndex)
|
|
OR IS_ENTITY_IN_RANGE_COORDS(sPoolPed[i].pedIndex, vHotTubDimensionsCentrePos, fHotTubDimensionsWidth) //inside the HOT_TUB
|
|
OR IS_ENTITY_IN_ANGLED_AREA(sPoolPed[i].pedIndex, vPoolDimensionsMinPos, vPoolDimensionsMaxPos, fPoolDimensionsWidth) //inside the pool
|
|
IF NOT IsPedPerformingTask(sPoolPed[i].pedIndex, SCRIPT_TASK_FOLLOW_NAV_MESH_TO_COORD)
|
|
CLEAR_PED_TASKS(sPoolPed[i].pedIndex)
|
|
VECTOR vGotoPos
|
|
FLOAT fGoToHeading
|
|
vGotoPos = vGotowardsHotTubInitialPos[NIGEL1B_POOL_NORTH_SIDE] // north side of the HOT_TUB
|
|
fGoToHeading = 201.7237
|
|
IF IS_COORD_IN_RANGE_OF_COORD(vPlayerPos, vGotoPos, 1.5) // if player is at that spot go for the opposite side
|
|
vGotoPos = vGotowardsHotTubInitialPos[NIGEL1B_POOL_SOUTH_SIDE] // south side of the HOT_TUB
|
|
fGoToHeading = 325.0476
|
|
ENDIF
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(sPoolPed[i].pedIndex, vGotoPos, PEDMOVEBLENDRATIO_WALK, DEFAULT_TIME_BEFORE_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_DEFAULT, fGoToHeading)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sPoolPed[i].pedIndex, TRUE)
|
|
#IF IS_DEBUG_BUILD IF bDebug_Display_PP_AI CPRINTLN(DEBUG_MISSION, "NIGEL 1B: ", "N1B_PED_AI_SETUP_SURRENDERED -> get out water first", " id = ", i) ENDIF #ENDIF
|
|
ENDIF
|
|
//TASK_HANDS_UP(sPoolPed[i].pedIndex, -1, PLAYER_PED_ID(), -1)
|
|
ELSE
|
|
SET_PED_COWER_HASH(sPoolPed[i].pedIndex, "CODE_HUMAN_STAND_COWER")
|
|
TASK_COWER(sPoolPed[i].pedIndex, -1)
|
|
ENDIF
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sPoolPed[i].pedIndex, TRUE)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CONTROL_POOL_PEDS_AI - N1B_PED_AI_STATE_BEATEN_UP - PED ID = ", i) ENDIF #ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
// ------------------------------------------
|
|
CASE N1B_PED_AI_SETUP_SURRENDERED
|
|
STOP_PED_SPEAKING(sPoolPed[i].pedIndex, FALSE) //added to make them scream // hopefully?
|
|
|
|
IF i = POOL_PED_CELEB
|
|
IF IS_ENTITY_ALIVE(moCelebPhone.object)
|
|
IF IS_ENTITY_ATTACHED_TO_ENTITY(moCelebPhone.object, sPoolPed[i].pedIndex)
|
|
DETACH_ENTITY(moCelebPhone.object)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CONTROL_POOL_PEDS_AI - N1B_PED_AI_SETUP_SURRENDERED - detached phone : PED ID = ", i) ENDIF #ENDIF
|
|
ENDIF
|
|
SAFE_REMOVE_OBJECT(moCelebPhone.object, FALSE)
|
|
ENDIF
|
|
CLEAR_PED_ALTERNATE_WALK_ANIM(sPoolPed[i].pedIndex)
|
|
//#IF IS_DEBUG_BUILD IF bDebug_Display_PP_AI CPRINTLN(DEBUG_MISSION, "NIGEL 1B: ", "N1B_PED_AI_SETUP_SURRENDERED - alt walk anim cleared", " id = ", i) ENDIF #ENDIF
|
|
ENDIF
|
|
|
|
IF HAS_POOL_PED_FINISHED_SURRENDER_REACTION_ANIM(i)
|
|
IF NOT IS_PED_RAGDOLL(sPoolPed[i].pedIndex)
|
|
AND NOT IS_PED_GETTING_UP(sPoolPed[i].pedIndex)
|
|
AND NOT IS_PED_CLIMBING(sPoolPed[i].pedIndex) // added for bug 970159
|
|
IF IS_ENTITY_IN_WATER(sPoolPed[i].pedIndex)
|
|
AND IS_ENTITY_IN_ANGLED_AREA(sPoolPed[i].pedIndex, vPoolDimensionsMinPos, vPoolDimensionsMaxPos, fPoolDimensionsWidth) //inside the pool
|
|
OR IS_ENTITY_IN_RANGE_COORDS(sPoolPed[i].pedIndex, << -1057.13635, 369.17224, 69.18319 >>, 1.25) // B*1218631 - block stopping on North corner of pool where feet clip through the wall
|
|
OR IS_ENTITY_IN_RANGE_COORDS(sPoolPed[i].pedIndex, << -1057.10815, 354.76880, 69.19383 >>, 1.25) // B*1218631 - block stopping on South corner of pool where feet clip through the wall
|
|
OR IS_ENTITY_IN_ANGLED_AREA(sPoolPed[i].pedIndex, <<-1051.339722,358.404541,66.914551>>, <<-1051.361816,365.510620,71.914162>>, 2.250000) // B*1327618 - block stopping in shrubs next to pool
|
|
IF NOT IsPedPerformingTask(sPoolPed[i].pedIndex, SCRIPT_TASK_FOLLOW_NAV_MESH_TO_COORD)
|
|
CLEAR_PED_TASKS(sPoolPed[i].pedIndex)
|
|
VECTOR vGotoPos
|
|
FLOAT fGoToHeading
|
|
vGotoPos = vGotowardsHotTubInitialPos[NIGEL1B_POOL_NORTH_SIDE] // north side of the HOT_TUB
|
|
fGoToHeading = 201.7237
|
|
IF IS_COORD_IN_RANGE_OF_COORD(vPlayerPos, vGotoPos, 1.5) // if player is at that spot go for the opposite side
|
|
vGotoPos = vGotowardsHotTubInitialPos[NIGEL1B_POOL_SOUTH_SIDE] // south side of the HOT_TUB
|
|
fGoToHeading = 325.0476
|
|
ENDIF
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(sPoolPed[i].pedIndex, vGotoPos, PEDMOVEBLENDRATIO_WALK, DEFAULT_TIME_BEFORE_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_DEFAULT, fGoToHeading)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sPoolPed[i].pedIndex, TRUE)
|
|
#IF IS_DEBUG_BUILD IF bDebug_Display_PP_AI CPRINTLN(DEBUG_MISSION, "NIGEL 1B: ", "N1B_PED_AI_SETUP_SURRENDERED -> get out water first", " id = ", i) ENDIF #ENDIF
|
|
ENDIF
|
|
ELSE
|
|
CLEAR_PED_TASKS(sPoolPed[i].pedIndex)
|
|
TASK_LOOK_AT_ENTITY(sPoolPed[i].pedIndex, PLAYER_PED_ID(), -1)
|
|
TASK_HANDS_UP(sPoolPed[i].pedIndex, -1, PLAYER_PED_ID(), -1)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sPoolPed[i].pedIndex, TRUE)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CONTROL_POOL_PEDS_AI - N1B_PED_AI_SETUP_SURRENDERED - PED ID = ", i) ENDIF #ENDIF
|
|
sPoolPed[i].AI = N1B_PED_AI_STATE_SURRENDERED
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CONTROL_POOL_PEDS_AI - waiting for reaction anim - N1B_PED_AI_SETUP_SURRENDERED - PED ID = ", i) ENDIF #ENDIF
|
|
ENDIF
|
|
BREAK
|
|
// ------------------------------------------
|
|
CASE N1B_PED_AI_STATE_SURRENDERED
|
|
IF NOT IsPedPerformingTask(sPoolPed[i].pedIndex, SCRIPT_TASK_FOLLOW_NAV_MESH_TO_COORD)
|
|
IF NOT IsPedPerformingTask(sPoolPed[i].pedIndex, SCRIPT_TASK_HANDS_UP)
|
|
// PED HAS LOST HIS TASK, RESET IT
|
|
sPoolPed[i].AI = N1B_PED_AI_SETUP_SURRENDERED
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CONTROL_POOL_PEDS_AI - N1B_PED_AI_STATE_SURRENDERED - lost task - PED ID = ", i) ENDIF #ENDIF
|
|
ELSE
|
|
// reapply get out water if fell back in
|
|
IF IS_ENTITY_IN_WATER(sPoolPed[i].pedIndex)
|
|
AND IS_ENTITY_IN_ANGLED_AREA(sPoolPed[i].pedIndex, vPoolDimensionsMinPos, vPoolDimensionsMaxPos, fPoolDimensionsWidth) //inside the pool)
|
|
sPoolPed[i].AI = N1B_PED_AI_SETUP_SURRENDERED
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CONTROL_POOL_PEDS_AI - N1B_PED_AI_STATE_SURRENDERED - back in water - PED ID = ", i) ENDIF #ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_ENTITY_IN_WATER(sPoolPed[i].pedIndex)
|
|
AND NOT IS_ENTITY_IN_ANGLED_AREA(sPoolPed[i].pedIndex, vPoolDimensionsMinPos, vPoolDimensionsMaxPos, fPoolDimensionsWidth) //inside the pool
|
|
IF NOT IS_ENTITY_IN_RANGE_COORDS(sPoolPed[i].pedIndex, << -1057.13635, 369.17224, 69.18319 >>, 1.25) // B*1218631 - block stopping on North corner of pool where feet clip through the wall
|
|
IF NOT IS_ENTITY_IN_RANGE_COORDS(sPoolPed[i].pedIndex, << -1057.10815, 354.76880, 69.19383 >>, 1.25) // B*1218631 - block stopping on South corner of pool where feet clip through the wall
|
|
IF NOT IS_ENTITY_IN_ANGLED_AREA(sPoolPed[i].pedIndex, <<-1051.339722,358.404541,66.914551>>, <<-1051.361816,365.510620,71.914162>>, 2.250000) // B*1327618 - block stopping in shrubs next to pool
|
|
sPoolPed[i].AI = N1B_PED_AI_SETUP_SURRENDERED
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CONTROL_POOL_PEDS_AI -> N1B_PED_AI_STATE_SURRENDERED - navigated to safe spot for surrender behaviour - PED ID = ", i) ENDIF #ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
// ------------------------------------------
|
|
CASE N1B_PED_AI_SETUP_FRIGHTENED
|
|
//Additional checks to stop peds cowering under water
|
|
IF IS_ENTITY_IN_WATER(sPoolPed[i].pedIndex)
|
|
OR IS_ENTITY_IN_RANGE_COORDS(sPoolPed[i].pedIndex, vHotTubDimensionsCentrePos, fHotTubDimensionsWidth) //inside the HOT_TUB
|
|
OR IS_ENTITY_IN_ANGLED_AREA(sPoolPed[i].pedIndex, vPoolDimensionsMinPos, vPoolDimensionsMaxPos, fPoolDimensionsWidth) //inside the pool
|
|
OR IS_PED_CLIMBING(sPoolPed[i].pedIndex) // added for bug 970159
|
|
OR IS_PED_RAGDOLL(sPoolPed[i].pedIndex)
|
|
sPoolPed[i].AI = N1B_PED_AI_SETUP_SURRENDERED
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CONTROL_POOL_PEDS_AI - N1B_PED_AI_SETUP_FRIGHTENED going to N1B_PED_AI_SETUP_SURRENDERED - PED ID = ", i) ENDIF #ENDIF
|
|
ELSE
|
|
CLEAR_PED_TASKS(sPoolPed[i].pedIndex)
|
|
SET_PED_COWER_HASH(sPoolPed[i].pedIndex, "CODE_HUMAN_STAND_COWER")
|
|
TASK_COWER(sPoolPed[i].pedIndex, -1)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sPoolPed[i].pedIndex, TRUE)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CONTROL_POOL_PEDS_AI - N1B_PED_AI_SETUP_FRIGHTENED - PED ID = ", i) ENDIF #ENDIF
|
|
sPoolPed[i].AI = N1B_PED_AI_STATE_FRIGHTENED
|
|
ENDIF
|
|
BREAK
|
|
// ------------------------------------------
|
|
CASE N1B_PED_AI_STATE_FRIGHTENED
|
|
IF NOT IS_PED_RAGDOLL(sPoolPed[i].pedIndex)
|
|
IF NOT IsPedPerformingTask(sPoolPed[i].pedIndex, SCRIPT_TASK_COWER)
|
|
// PED HAS LOST HIS TASK, RESET IT
|
|
sPoolPed[i].AI = N1B_PED_AI_SETUP_FRIGHTENED
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CONTROL_POOL_PEDS_AI - N1B_PED_AI_STATE_FRIGHTENED - PED ID = ", i) ENDIF #ENDIF
|
|
ELSE
|
|
IF IS_ENTITY_IN_WATER(sPoolPed[i].pedIndex)
|
|
sPoolPed[i].AI = N1B_PED_AI_SETUP_SURRENDERED
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CONTROL_POOL_PEDS_AI - N1B_PED_AI_STATE_FRIGHTENED going to N1B_PED_AI_SETUP_SURRENDERED - PED ID = ", i) ENDIF #ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
// ------------------------------------------
|
|
CASE N1B_PED_AI_SETUP_FLEE_WITH_REACT
|
|
// if ped is playing exit sync scene anim then just switch to normal flee
|
|
IF HAS_POOL_PED_FINISHED_SURRENDER_REACTION_ANIM(i)
|
|
IF NOT IS_PED_RAGDOLL(sPoolPed[i].pedIndex)
|
|
AND NOT IS_PED_SWIMMING(sPoolPed[i].pedIndex)
|
|
AND NOT IS_PED_CLIMBING(sPoolPed[i].pedIndex)
|
|
STOP_PED_SPEAKING(sPoolPed[i].pedIndex, FALSE) //added to make them scream // hopefully?
|
|
IF i = POOL_PED_CELEB
|
|
CLEAR_PED_ALTERNATE_WALK_ANIM(sPoolPed[i].pedIndex)
|
|
//#IF IS_DEBUG_BUILD IF bDebug_Display_PP_AI CPRINTLN(DEBUG_MISSION, "NIGEL 1B: ", "N1B_PED_AI_SETUP_FLEE_WITH_REACT - alt walk anim cleared", " id = ", i) ENDIF #ENDIF
|
|
ENDIF
|
|
SET_PED_FLEE_ATTRIBUTES(sPoolPed[i].pedIndex, FA_RETURN_TO_ORIGNAL_POSITION_AFTER_FLEE, FALSE)
|
|
SET_PED_FLEE_ATTRIBUTES(sPoolPed[i].pedIndex, FA_DISABLE_HANDS_UP, FALSE)
|
|
SET_PED_FLEE_ATTRIBUTES(sPoolPed[i].pedIndex, FA_USE_VEHICLE, FALSE)
|
|
SET_PED_FLEE_ATTRIBUTES(sPoolPed[i].pedIndex, FA_PREFER_PAVEMENTS, TRUE)
|
|
SET_PED_FLEE_ATTRIBUTES(sPoolPed[i].pedIndex, FA_USE_COVER, FALSE)
|
|
SET_PED_FLEE_ATTRIBUTES(sPoolPed[i].pedIndex, FA_LOOK_FOR_CROWDS, FALSE)
|
|
SET_PED_FLEE_ATTRIBUTES(sPoolPed[i].pedIndex, FA_CAN_SCREAM, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sPoolPed[i].pedIndex, CA_ALWAYS_FIGHT, FALSE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sPoolPed[i].pedIndex, CA_ALWAYS_FLEE, TRUE)
|
|
|
|
//CLEAR_PED_TASKS(sPoolPed[i].pedIndex)
|
|
TASK_REACT_AND_FLEE_PED(sPoolPed[i].pedIndex, PLAYER_PED_ID())
|
|
sPoolPed[i].AI = N1B_PED_AI_STATE_FLEE
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CONTROL_POOL_PEDS_AI - set - N1B_PED_AI_SETUP_FLEE_WITH_REACT - PED ID = ", i) ENDIF #ENDIF
|
|
ELSE
|
|
sPoolPed[i].AI = N1B_PED_AI_SETUP_FLEE
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CONTROL_POOL_PEDS_AI - was in ragdoll so switch to normal flee N1B_PED_AI_SETUP_FLEE - PED ID = ", i) ENDIF #ENDIF
|
|
ENDIF
|
|
ELSE
|
|
sPoolPed[i].AI = N1B_PED_AI_SETUP_FLEE
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CONTROL_POOL_PEDS_AI - waiting for reaction anim - N1B_PED_AI_SETUP_FLEE_WITH_REACT switch to N1B_PED_AI_SETUP_FLEE - PED ID = ", i) ENDIF #ENDIF
|
|
ENDIF
|
|
BREAK
|
|
// ------------------------------------------
|
|
CASE N1B_PED_AI_SETUP_FLEE
|
|
STOP_PED_SPEAKING(sPoolPed[i].pedIndex, FALSE) //added to make them scream // hopefully?
|
|
IF i = POOL_PED_CELEB
|
|
CLEAR_PED_ALTERNATE_WALK_ANIM(sPoolPed[i].pedIndex)
|
|
//#IF IS_DEBUG_BUILD IF bDebug_Display_PP_AI CPRINTLN(DEBUG_MISSION, "NIGEL 1B: ", "N1B_PED_AI_SETUP_FLEE - alt walk anim cleared", " id = ", i) ENDIF #ENDIF
|
|
ENDIF
|
|
SET_PED_FLEE_ATTRIBUTES(sPoolPed[i].pedIndex, FA_RETURN_TO_ORIGNAL_POSITION_AFTER_FLEE, FALSE)
|
|
SET_PED_FLEE_ATTRIBUTES(sPoolPed[i].pedIndex, FA_DISABLE_HANDS_UP, FALSE)
|
|
SET_PED_FLEE_ATTRIBUTES(sPoolPed[i].pedIndex, FA_USE_VEHICLE, FALSE)
|
|
SET_PED_FLEE_ATTRIBUTES(sPoolPed[i].pedIndex, FA_PREFER_PAVEMENTS, TRUE)
|
|
SET_PED_FLEE_ATTRIBUTES(sPoolPed[i].pedIndex, FA_USE_COVER, FALSE)
|
|
SET_PED_FLEE_ATTRIBUTES(sPoolPed[i].pedIndex, FA_LOOK_FOR_CROWDS, FALSE)
|
|
SET_PED_FLEE_ATTRIBUTES(sPoolPed[i].pedIndex, FA_CAN_SCREAM, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sPoolPed[i].pedIndex, CA_ALWAYS_FIGHT, FALSE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sPoolPed[i].pedIndex, CA_ALWAYS_FLEE, TRUE)
|
|
|
|
IF HAS_POOL_PED_FINISHED_SURRENDER_REACTION_ANIM(i)
|
|
//CLEAR_PED_TASKS(sPoolPed[i].pedIndex)
|
|
TASK_SMART_FLEE_PED(sPoolPed[i].pedIndex, PLAYER_PED_ID(), 150.0, -1, TRUE)
|
|
sPoolPed[i].AI = N1B_PED_AI_STATE_FLEE
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CONTROL_POOL_PEDS_AI - set - N1B_PED_AI_SETUP_FLEE - PED ID = ", i) ENDIF #ENDIF
|
|
ELSE
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CONTROL_POOL_PEDS_AI - waiting for reaction anim - N1B_PED_AI_SETUP_FLEE - PED ID = ", i) ENDIF #ENDIF
|
|
ENDIF
|
|
BREAK
|
|
// ------------------------------------------
|
|
CASE N1B_PED_AI_STATE_FLEE
|
|
IF NOT IsPedPerformingTask(sPoolPed[i].pedIndex, SCRIPT_TASK_SMART_FLEE_PED)
|
|
AND NOT IsPedPerformingTask(sPoolPed[i].pedIndex, SCRIPT_TASK_REACT_AND_FLEE_PED)
|
|
sPoolPed[i].AI = N1B_PED_AI_SETUP_FLEE
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CONTROL_POOL_PEDS_AI - reapply - N1B_PED_AI_STATE_FLEE - PED ID = ", i) ENDIF #ENDIF
|
|
ENDIF
|
|
BREAK
|
|
// ------------------------------------------
|
|
DEFAULT
|
|
SCRIPT_ASSERT("NIGEL1B - invalid N1B_PED_AI in CONTROL_POOL_PEDS_AI")
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
|
|
// Handle ped's blips
|
|
IF sPoolPed[i].AI = N1B_PED_AI_SETUP_FLEE
|
|
OR sPoolPed[i].AI = N1B_PED_AI_SETUP_FLEE_WITH_REACT
|
|
OR sPoolPed[i].AI = N1B_PED_AI_STATE_FLEE
|
|
CLEANUP_AI_PED_BLIP(sPoolPed[i].blipAIStruct)
|
|
ELSE
|
|
// once clothes have been stolen, unblip the peds when the player moves away if he was undetected
|
|
IF eMissionStage = MISSION_STAGE_STEAL_CELEB_POSSESSIONS
|
|
UPDATE_AI_PED_BLIP(sPoolPed[i].pedIndex, sPoolPed[i].blipAIStruct)
|
|
ELSE
|
|
IF ePoolAreaState = N1B_POOL_AREA_STATE_UNDETECTED
|
|
OR ePoolAreaState = N1B_POOL_AREA_STATE_CELEB_LOOKING_FOR_CLOTHES
|
|
IF ePlayerLocation = N1B_PLAYER_LOCATION_OUTSIDE_HOUSE_AREA
|
|
AND NOT IS_ENTITY_IN_RANGE_COORDS(sPoolPed[i].pedIndex, vPlayerPos, 35.0)
|
|
CLEANUP_AI_PED_BLIP(sPoolPed[i].blipAIStruct)
|
|
ELSE
|
|
UPDATE_AI_PED_BLIP(sPoolPed[i].pedIndex, sPoolPed[i].blipAIStruct)
|
|
ENDIF
|
|
ELSE
|
|
UPDATE_AI_PED_BLIP(sPoolPed[i].pedIndex, sPoolPed[i].blipAIStruct)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF sPoolPed[i].AI != N1B_PED_AI_STATE_DEAD
|
|
IF i = POOL_PED_CELEB
|
|
IF NOT IS_BIT_SET(g_savedGlobals.sRandomChars.g_iWebsiteQueryBit, ENUM_TO_INT(RC_NWS_NGLB_KILLED_TYLER))
|
|
SET_BIT(g_savedGlobals.sRandomChars.g_iWebsiteQueryBit, ENUM_TO_INT(RC_NWS_NGLB_KILLED_TYLER))
|
|
CPRINTLN(DEBUG_INTERNET, GET_THIS_SCRIPT_NAME(), " g_savedGlobals.sRandomChars.g_iWebsiteQueryBit, ENUM_TO_INT(RC_NWS_NGLB_KILLED_TYLER) set")
|
|
ENDIF
|
|
REPLAY_RECORD_BACK_FOR_TIME(2.5, 2.0, REPLAY_IMPORTANCE_LOWEST) // B*1880376 - record killing Tyler Dixon
|
|
ENDIF
|
|
sPoolPed[i].AI = N1B_PED_AI_STATE_DEAD
|
|
ENDIF
|
|
CLEANUP_AI_PED_BLIP(sPoolPed[i].blipAIStruct)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Controls Gardeners AI.
|
|
PROC CONTROL_GARDENERS_AI()
|
|
IF IS_PED_UNINJURED(sGardenerPed.pedIndex)
|
|
IF NOT IS_PED_PERFORMING_STEALTH_KILL(PLAYER_PED_ID()) //having to test this because changes to tasks breaks the execution/takedown moves
|
|
SWITCH (sGardenerPed.AI)
|
|
// ------------------------------------------
|
|
CASE N1B_PED_AI_STATE_RELAXED
|
|
IF NOT IS_ENTITY_PLAYING_ANIM(sGardenerPed.pedIndex, "rcmnigel1b", "idle_gardener")
|
|
TASK_PLAY_ANIM(sGardenerPed.pedIndex, "rcmnigel1b", "idle_gardener", SLOW_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING | AF_EXIT_AFTER_INTERRUPTED | AF_USE_KINEMATIC_PHYSICS) // B*1544302 - AF_USE_KINEMATIC_PHYSICS)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "GARDENER AI - N1B_PED_AI_STATE_RELAXED reapplied anim ") ENDIF #ENDIF
|
|
ENDIF
|
|
BREAK
|
|
// ------------------------------------------
|
|
CASE N1B_PED_AI_SETUP_AWARE_OF_PLAYER
|
|
IF IS_ENTITY_ALIVE(moGardnerVanProps[NIGEL1B_PROP_GARDENER_LEAF_BLOWER].object)
|
|
AND IS_ENTITY_ATTACHED_TO_ENTITY(moGardnerVanProps[NIGEL1B_PROP_GARDENER_LEAF_BLOWER].object, sGardenerPed.pedIndex)
|
|
DETACH_ENTITY(moGardnerVanProps[NIGEL1B_PROP_GARDENER_LEAF_BLOWER].object)
|
|
ENDIF
|
|
CLEAR_PED_SECONDARY_TASK(sGardenerPed.pedIndex)
|
|
IF NOT IS_PED_HEADTRACKING_PED(sGardenerPed.pedIndex, PLAYER_PED_ID())
|
|
TASK_LOOK_AT_ENTITY(sGardenerPed.pedIndex, PLAYER_PED_ID(), -1)
|
|
ENDIF
|
|
// play his exit anim
|
|
IF IS_ENTITY_PLAYING_ANIM(sGardenerPed.pedIndex, "rcmnigel1b", "idle_gardener")
|
|
IF NOT IS_PED_RAGDOLL(sGardenerPed.pedIndex)
|
|
AND NOT IS_PED_GETTING_UP(sGardenerPed.pedIndex)
|
|
TASK_PLAY_ANIM(sGardenerPed.pedIndex, "rcmnigel1b", "exit_gardener", NORMAL_BLEND_IN, SLOW_BLEND_OUT, -1, AF_DEFAULT | AF_EXIT_AFTER_INTERRUPTED)
|
|
ELSE
|
|
IF IsPedPerformingTask(sGardenerPed.pedIndex, SCRIPT_TASK_SYNCHRONIZED_SCENE)
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(sGardenerPed.pedIndex, FAST_BLEND_OUT, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sGardenerPed.pedIndex, TRUE)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "GARDENER AI - N1B_PED_AI_SETUP_AWARE_OF_PLAYER going to N1B_PED_AI_STATE_AWARE_OF_PLAYER") ENDIF #ENDIF
|
|
sGardenerPed.AI = N1B_PED_AI_STATE_AWARE_OF_PLAYER
|
|
BREAK
|
|
// ------------------------------------------
|
|
CASE N1B_PED_AI_STATE_AWARE_OF_PLAYER
|
|
IF NOT IS_ENTITY_PLAYING_ANIM(sGardenerPed.pedIndex, "rcmnigel1b", "exit_gardener")
|
|
IF NOT IS_PED_FACING_PED(sGardenerPed.pedIndex, PLAYER_PED_ID(), 45)
|
|
IF NOT IsPedPerformingTask(sGardenerPed.pedIndex, SCRIPT_TASK_TURN_PED_TO_FACE_ENTITY)
|
|
TASK_TURN_PED_TO_FACE_ENTITY(sGardenerPed.pedIndex, PLAYER_PED_ID(), 0)
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
SET_ENTITY_ANIM_SPEED(sGardenerPed.pedIndex, "rcmnigel1b", "exit_gardener", 1.2)
|
|
ENDIF
|
|
BREAK
|
|
// ------------------------------------------
|
|
CASE N1B_PED_AI_SETUP_JUST_FACE_PLAYER
|
|
CLEAR_PED_TASKS(sGardenerPed.pedIndex)
|
|
IF NOT IS_PED_HEADTRACKING_PED(sGardenerPed.pedIndex, PLAYER_PED_ID())
|
|
TASK_LOOK_AT_ENTITY(sGardenerPed.pedIndex, PLAYER_PED_ID(), -1)
|
|
ENDIF
|
|
IF NOT IS_PED_FACING_PED(sGardenerPed.pedIndex, PLAYER_PED_ID(), 45)
|
|
TASK_TURN_PED_TO_FACE_ENTITY(sGardenerPed.pedIndex, PLAYER_PED_ID(), 0)
|
|
ENDIF
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sGardenerPed.pedIndex, TRUE)
|
|
sGardenerPed.iTimer = GET_GAME_TIMER()
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "GARDENER AI - N1B_PED_AI_SETUP_JUST_FACE_PLAYER going to N1B_PED_AI_STATE_JUST_FACE_PLAYER") ENDIF #ENDIF
|
|
sGardenerPed.AI = N1B_PED_AI_STATE_JUST_FACE_PLAYER
|
|
BREAK
|
|
// ------------------------------------------
|
|
CASE N1B_PED_AI_STATE_JUST_FACE_PLAYER
|
|
// allow idle anims
|
|
IF NOT IsPedPerformingTask(sGardenerPed.pedIndex, SCRIPT_TASK_PLAY_ANIM)
|
|
IF NOT IS_PED_FACING_PED(sGardenerPed.pedIndex, PLAYER_PED_ID(), 45.0)
|
|
IF NOT IsPedPerformingTask(sGardenerPed.pedIndex, SCRIPT_TASK_TURN_PED_TO_FACE_ENTITY)
|
|
#IF IS_DEBUG_BUILD IF bDebug_Display_PP_AI CPRINTLN(DEBUG_MISSION, "GARDENER AI - N1B_PED_AI_STATE_JUST_FACE_PLAYER -> N1B_PED_AI_SETUP_JUST_FACE_PLAYER") ENDIF #ENDIF
|
|
sGardenerPed.AI = N1B_PED_AI_SETUP_JUST_FACE_PLAYER
|
|
ENDIF
|
|
ELSE
|
|
IF HAS_TIME_PASSED(sGardenerPed.iTimer, GET_RANDOM_INT_IN_RANGE(2000, 4000))
|
|
IF SET_PED_PLAY_AWARE_OF_PLAYER_ANIM(sGardenerPed.pedIndex, "react_small_variations_o", SLOW_BLEND_IN, SLOW_BLEND_OUT)
|
|
sGardenerPed.iTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_PED_FACING_PED(sGardenerPed.pedIndex, PLAYER_PED_ID(), 170.0) // stop the anim early if the player goes behind them
|
|
CLEAR_PED_TASKS(sGardenerPed.pedIndex)
|
|
#IF IS_DEBUG_BUILD IF bDebug_Display_PP_AI CPRINTLN(DEBUG_MISSION, "GARDENER AI - N1B_PED_AI_STATE_JUST_FACE_PLAYER stopped idle anim early for player behind ped") ENDIF #ENDIF
|
|
ENDIF
|
|
sGardenerPed.iTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
BREAK
|
|
// ------------------------------------------
|
|
CASE N1B_PED_AI_SETUP_WARN_OTHER_PEDS
|
|
// wait for his exit anim first
|
|
IF NOT IS_ENTITY_PLAYING_ANIM(sGardenerPed.pedIndex, "rcmnigel1b", "exit_gardener")
|
|
OPEN_SEQUENCE_TASK(sequenceAI)
|
|
//TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, << -1032.2950, 347.6416, 70.3615 >>, PEDMOVEBLENDRATIO_RUN, DEFAULT_TIME_BEFORE_WARP, 2.0) //south side of house
|
|
IF NOT IS_ENTITY_IN_RANGE_COORDS(sGardenerPed.pedIndex, << -1050.3589, 354.0594, 68.9132 >>, 3.0)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, << -1050.3589, 354.0594, 68.9132 >>, PEDMOVEBLENDRATIO_RUN, DEFAULT_TIME_BEFORE_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_DEFAULT, 38.0338) //pool area
|
|
ENDIF
|
|
IF IS_ENTITY_ALIVE(sPoolPed[POOL_PED_CELEB].pedIndex)
|
|
TASK_TURN_PED_TO_FACE_ENTITY(NULL, sPoolPed[POOL_PED_CELEB].pedIndex, -1)
|
|
ENDIF
|
|
CLOSE_SEQUENCE_TASK(sequenceAI)
|
|
TASK_PERFORM_SEQUENCE(sGardenerPed.pedIndex, sequenceAI)
|
|
CLEAR_SEQUENCE_TASK(sequenceAI)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sGardenerPed.pedIndex, TRUE)
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "GARDENER AI - N1B_PED_AI_SETUP_WARN_OTHER_PEDS going to N1B_PED_AI_STATE_WARN_OTHER_PEDS") ENDIF #ENDIF
|
|
sGardenerPed.AI = N1B_PED_AI_STATE_WARN_OTHER_PEDS
|
|
ELSE
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "GARDENER AI - waiting on exit anim to finish - N1B_PED_AI_SETUP_WARN_OTHER_PEDS ") ENDIF #ENDIF
|
|
ENDIF
|
|
BREAK
|
|
// ------------------------------------------
|
|
CASE N1B_PED_AI_STATE_WARN_OTHER_PEDS
|
|
IF NOT IsPedPerformingTask(sGardenerPed.pedIndex, SCRIPT_TASK_PERFORM_SEQUENCE)
|
|
// PED HAS LOST HIS TASK, RESET IT
|
|
sGardenerPed.AI = N1B_PED_AI_SETUP_WARN_OTHER_PEDS
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "GARDENER AI - N1B_PED_AI_STATE_WARN_OTHER_PEDS going BACK to N1B_PED_AI_SETUP_WARN_OTHER_PEDS") ENDIF #ENDIF
|
|
ELSE
|
|
IF IS_ENTITY_ALIVE(sPoolPed[POOL_PED_CELEB].pedIndex)
|
|
IF NOT IsPedPerformingTask(sGardenerPed.pedIndex, SCRIPT_TASK_LOOK_AT_ENTITY)
|
|
TASK_LOOK_AT_ENTITY(sGardenerPed.pedIndex, sPoolPed[POOL_PED_CELEB].pedIndex, -1)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
// ------------------------------------------
|
|
CASE N1B_PED_AI_SETUP_BEATEN_UP
|
|
IF IS_ENTITY_ALIVE(moGardnerVanProps[NIGEL1B_PROP_GARDENER_LEAF_BLOWER].object)
|
|
AND IS_ENTITY_ATTACHED_TO_ENTITY(moGardnerVanProps[NIGEL1B_PROP_GARDENER_LEAF_BLOWER].object, sGardenerPed.pedIndex)
|
|
DETACH_ENTITY(moGardnerVanProps[NIGEL1B_PROP_GARDENER_LEAF_BLOWER].object)
|
|
ENDIF
|
|
CLEAR_PED_SECONDARY_TASK(sGardenerPed.pedIndex)
|
|
CLEAR_PED_TASKS(sGardenerPed.pedIndex)
|
|
//SET_PED_ALTERNATE_WALK_ANIM(sGardenerPed.pedIndex, "move_injured_generic", "walk")
|
|
SET_PED_CAN_RAGDOLL(sGardenerPed.pedIndex, TRUE)
|
|
IF NOT IS_PED_RAGDOLL(sGardenerPed.pedIndex)
|
|
SET_PED_TO_RAGDOLL(sGardenerPed.pedIndex, 1000, 1000, TASK_RELAX)
|
|
ENDIF
|
|
//does work how i wanted, because the ped health drains to zero and he dies failing the mission.
|
|
/*
|
|
IF (GET_ENTITY_HEALTH(sGardenerPed.pedIndex) > 100)
|
|
SET_ENTITY_HEALTH(sGardenerPed.pedIndex, 100)
|
|
ENDIF
|
|
SET_PED_INJURED_ON_GROUND_BEHAVIOUR(sGardenerPed.pedIndex, -1.0)
|
|
*/
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "GARDENER AI - N1B_PED_AI_SETUP_BEATEN_UP going to N1B_PED_AI_STATE_BEATEN_UP") ENDIF #ENDIF
|
|
sGardenerPed.AI = N1B_PED_AI_STATE_BEATEN_UP
|
|
BREAK
|
|
// ------------------------------------------
|
|
CASE N1B_PED_AI_STATE_BEATEN_UP
|
|
IF NOT IS_PED_RAGDOLL(sGardenerPed.pedIndex)
|
|
IF NOT IsPedPerformingTask(sGardenerPed.pedIndex, SCRIPT_TASK_COWER)
|
|
AND NOT IsPedPerformingTask(sGardenerPed.pedIndex, SCRIPT_TASK_HANDS_UP)
|
|
//Additional checks to stop peds cowering under water
|
|
IF NOT IS_ENTITY_IN_WATER(sGardenerPed.pedIndex)
|
|
AND NOT IS_ENTITY_IN_RANGE_COORDS(sGardenerPed.pedIndex, vHotTubDimensionsCentrePos, fHotTubDimensionsWidth) //inside the HOT_TUB
|
|
AND NOT IS_ENTITY_IN_ANGLED_AREA(sGardenerPed.pedIndex, vPoolDimensionsMinPos, vPoolDimensionsMaxPos, fPoolDimensionsWidth) //inside the pool
|
|
AND NOT IS_PED_CLIMBING(sGardenerPed.pedIndex) // added for bug 970159
|
|
SET_PED_COWER_HASH(sGardenerPed.pedIndex, "CODE_HUMAN_STAND_COWER")
|
|
TASK_COWER(sGardenerPed.pedIndex, -1)
|
|
ELSE
|
|
IF NOT IsPedPerformingTask(sGardenerPed.pedIndex, SCRIPT_TASK_FOLLOW_NAV_MESH_TO_COORD)
|
|
CLEAR_PED_TASKS(sGardenerPed.pedIndex)
|
|
VECTOR vGotoPos
|
|
FLOAT fGoToHeading
|
|
vGotoPos = vGotowardsHotTubInitialPos[NIGEL1B_POOL_NORTH_SIDE] // north side of the HOT_TUB
|
|
fGoToHeading = 201.7237
|
|
IF IS_COORD_IN_RANGE_OF_COORD(vPlayerPos, vGotoPos, 1.5) // if player is at that spot go for the opposite side
|
|
vGotoPos = vGotowardsHotTubInitialPos[NIGEL1B_POOL_SOUTH_SIDE] // south side of the HOT_TUB
|
|
fGoToHeading = 325.0476
|
|
ENDIF
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(sGardenerPed.pedIndex, vGotoPos, PEDMOVEBLENDRATIO_WALK, DEFAULT_TIME_BEFORE_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_DEFAULT, fGoToHeading)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sGardenerPed.pedIndex, TRUE)
|
|
#IF IS_DEBUG_BUILD IF bDebug_Display_PP_AI CPRINTLN(DEBUG_MISSION, "NIGEL 1B: ", "GARDENER AI -> get out water first", " id = ") ENDIF #ENDIF
|
|
ENDIF
|
|
//TASK_HANDS_UP(sGardenerPed.pedIndex, -1, PLAYER_PED_ID(), -1)
|
|
ENDIF
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sGardenerPed.pedIndex, TRUE)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "GARDENER AI - N1B_PED_AI_STATE_BEATEN_UP - PED ID = ") ENDIF #ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
// ------------------------------------------
|
|
CASE N1B_PED_AI_SETUP_SURRENDERED
|
|
IF IS_ENTITY_ALIVE(moGardnerVanProps[NIGEL1B_PROP_GARDENER_LEAF_BLOWER].object)
|
|
IF IS_ENTITY_ATTACHED_TO_ENTITY(moGardnerVanProps[NIGEL1B_PROP_GARDENER_LEAF_BLOWER].object, sGardenerPed.pedIndex)
|
|
DETACH_ENTITY(moGardnerVanProps[NIGEL1B_PROP_GARDENER_LEAF_BLOWER].object)
|
|
ENDIF
|
|
SAFE_REMOVE_OBJECT(moGardnerVanProps[NIGEL1B_PROP_GARDENER_LEAF_BLOWER].object, FALSE)
|
|
ENDIF
|
|
IF IS_PED_USING_ANY_SCENARIO(sGardenerPed.pedIndex)
|
|
//CLEAR_PED_TASKS(sGardenerPed.pedIndex)
|
|
SET_PED_PANIC_EXIT_SCENARIO(sGardenerPed.pedIndex, vPlayerPos)
|
|
ENDIF
|
|
IF IS_ENTITY_IN_WATER(sGardenerPed.pedIndex)
|
|
AND IS_ENTITY_IN_ANGLED_AREA(sGardenerPed.pedIndex, vPoolDimensionsMinPos, vPoolDimensionsMaxPos, fPoolDimensionsWidth) //inside the pool
|
|
IF NOT IsPedPerformingTask(sGardenerPed.pedIndex, SCRIPT_TASK_FOLLOW_NAV_MESH_TO_COORD)
|
|
IF NOT IS_PED_RAGDOLL(sGardenerPed.pedIndex)
|
|
AND NOT IS_PED_GETTING_UP(sGardenerPed.pedIndex)
|
|
AND NOT IS_PED_CLIMBING(sGardenerPed.pedIndex) // added for bug 970159
|
|
VECTOR vGotoPos
|
|
FLOAT fGoToHeading
|
|
vGotoPos = vGotowardsHotTubInitialPos[NIGEL1B_POOL_NORTH_SIDE] // north side of the HOT_TUB
|
|
fGoToHeading = 201.7237
|
|
IF IS_COORD_IN_RANGE_OF_COORD(vPlayerPos, vGotoPos, 1.5) // if player is at that spot go for the opposite side
|
|
vGotoPos = vGotowardsHotTubInitialPos[NIGEL1B_POOL_SOUTH_SIDE] // south side of the HOT_TUB
|
|
fGoToHeading = 325.0476
|
|
ENDIF
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(sGardenerPed.pedIndex, vGotoPos, PEDMOVEBLENDRATIO_WALK, DEFAULT_TIME_BEFORE_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_DEFAULT, fGoToHeading)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sGardenerPed.pedIndex, TRUE)
|
|
#IF IS_DEBUG_BUILD IF bDebug_Display_PP_AI CPRINTLN(DEBUG_MISSION, "GARDENER AI - N1B_PED_AI_SETUP_SURRENDERED -> get out water first", " id = ") ENDIF #ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_PED_HEADTRACKING_PED(sGardenerPed.pedIndex, PLAYER_PED_ID())
|
|
TASK_LOOK_AT_ENTITY(sGardenerPed.pedIndex, PLAYER_PED_ID(), -1)
|
|
ENDIF
|
|
// play his exit anim
|
|
IF IS_ENTITY_PLAYING_ANIM(sGardenerPed.pedIndex, "rcmnigel1b", "idle_gardener")
|
|
IF NOT IS_PED_RAGDOLL(sGardenerPed.pedIndex)
|
|
AND NOT IS_PED_GETTING_UP(sGardenerPed.pedIndex)
|
|
AND NOT IS_PED_CLIMBING(sGardenerPed.pedIndex) // added for bug 970159
|
|
AND NOT IS_PED_BEING_STUNNED(sGardenerPed.pedIndex)
|
|
TASK_PLAY_ANIM(sGardenerPed.pedIndex, "rcmnigel1b", "exit_panic_gardener", NORMAL_BLEND_IN, SLOW_BLEND_OUT, -1, AF_DEFAULT | AF_EXIT_AFTER_INTERRUPTED)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sGardenerPed.pedIndex, TRUE)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "GARDENER AI - N1B_PED_AI_SETUP_SURRENDERED set exit anim going to N1B_PED_AI_STATE_SURRENDERED") ENDIF #ENDIF
|
|
ELSE
|
|
IF IsPedPerformingTask(sGardenerPed.pedIndex, SCRIPT_TASK_SYNCHRONIZED_SCENE)
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(sGardenerPed.pedIndex, FAST_BLEND_OUT, TRUE)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "GARDENER AI - N1B_PED_AI_SETUP_SURRENDERED STOP_SYNCHRONIZED_ENTITY_ANIM(sGardenerPed.pedIndex, FAST_BLEND_OUT, TRUE)") ENDIF #ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
TASK_HANDS_UP(sGardenerPed.pedIndex, -1, PLAYER_PED_ID(), -1)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sGardenerPed.pedIndex, TRUE)
|
|
ENDIF
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "GARDENER AI - N1B_PED_AI_SETUP_SURRENDERED set exit anim going to N1B_PED_AI_STATE_SURRENDERED") ENDIF #ENDIF
|
|
sGardenerPed.AI = N1B_PED_AI_STATE_SURRENDERED
|
|
ENDIF
|
|
BREAK
|
|
// ------------------------------------------
|
|
CASE N1B_PED_AI_STATE_SURRENDERED
|
|
IF IS_ENTITY_IN_WATER(sGardenerPed.pedIndex)
|
|
AND IS_ENTITY_IN_ANGLED_AREA(sGardenerPed.pedIndex, vPoolDimensionsMinPos, vPoolDimensionsMaxPos, fPoolDimensionsWidth) //inside the pool
|
|
sGardenerPed.AI = N1B_PED_AI_SETUP_SURRENDERED
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "GARDENER AI - N1B_PED_AI_STATE_SURRENDERED - fell back in water - PED ID = ") ENDIF #ENDIF
|
|
ELSE
|
|
IF NOT IS_PED_HEADTRACKING_PED(sGardenerPed.pedIndex, PLAYER_PED_ID())
|
|
TASK_LOOK_AT_ENTITY(sGardenerPed.pedIndex, PLAYER_PED_ID(), -1)
|
|
ENDIF
|
|
IF NOT IS_ENTITY_PLAYING_ANIM(sGardenerPed.pedIndex, "rcmnigel1b", "exit_panic_gardener")
|
|
IF NOT IsPedPerformingTask(sGardenerPed.pedIndex, SCRIPT_TASK_HANDS_UP)
|
|
TASK_HANDS_UP(sGardenerPed.pedIndex, -1, PLAYER_PED_ID(), -1)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sGardenerPed.pedIndex, TRUE)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "GARDENER AI - N1B_PED_AI_STATE_SURRENDERED set hands up task") ENDIF #ENDIF
|
|
ENDIF
|
|
IF IS_PLAYER_MAKING_PED_FRIGHTENED(sGardenerPed.pedIndex, FALSE)
|
|
sGardenerPed.AI = N1B_PED_AI_SETUP_FRIGHTENED
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "GARDENER AI - N1B_PED_AI_STATE_SURRENDERED going to N1B_PED_AI_SETUP_FRIGHTENED") ENDIF #ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
endif
|
|
BREAK
|
|
// ------------------------------------------
|
|
CASE N1B_PED_AI_SETUP_FRIGHTENED
|
|
//Additional checks to stop peds cowering under water
|
|
IF IS_ENTITY_IN_WATER(sGardenerPed.pedIndex)
|
|
OR IS_ENTITY_IN_RANGE_COORDS(sGardenerPed.pedIndex, vHotTubDimensionsCentrePos, fHotTubDimensionsWidth) //inside the HOT_TUB
|
|
OR IS_ENTITY_IN_ANGLED_AREA(sGardenerPed.pedIndex, vPoolDimensionsMinPos, vPoolDimensionsMaxPos, fPoolDimensionsWidth) //inside the pool
|
|
OR IS_PED_CLIMBING(sGardenerPed.pedIndex) // added for bug 970159
|
|
OR IS_PED_RAGDOLL(sGardenerPed.pedIndex)
|
|
sGardenerPed.AI = N1B_PED_AI_SETUP_SURRENDERED
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "GARDENER - N1B_PED_AI_SETUP_FRIGHTENED going to N1B_PED_AI_SETUP_SURRENDERED") ENDIF #ENDIF
|
|
ELSE
|
|
IF IS_ENTITY_ALIVE(moGardnerVanProps[NIGEL1B_PROP_GARDENER_LEAF_BLOWER].object)
|
|
IF IS_ENTITY_ATTACHED_TO_ENTITY(moGardnerVanProps[NIGEL1B_PROP_GARDENER_LEAF_BLOWER].object, sGardenerPed.pedIndex)
|
|
DETACH_ENTITY(moGardnerVanProps[NIGEL1B_PROP_GARDENER_LEAF_BLOWER].object)
|
|
ENDIF
|
|
SAFE_REMOVE_OBJECT(moGardnerVanProps[NIGEL1B_PROP_GARDENER_LEAF_BLOWER].object, FALSE)
|
|
ENDIF
|
|
IF IS_PED_USING_ANY_SCENARIO(sGardenerPed.pedIndex)
|
|
//CLEAR_PED_TASKS(sGardenerPed.pedIndex)
|
|
SET_PED_PANIC_EXIT_SCENARIO(sGardenerPed.pedIndex, vPlayerPos)
|
|
ENDIF
|
|
CLEAR_PED_SECONDARY_TASK(sGardenerPed.pedIndex)
|
|
SET_PED_COWER_HASH(sGardenerPed.pedIndex, "CODE_HUMAN_STAND_COWER")
|
|
TASK_COWER(sGardenerPed.pedIndex, -1)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sGardenerPed.pedIndex, TRUE)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "GARDENER AI - N1B_PED_AI_SETUP_FRIGHTENED going to N1B_PED_AI_STATE_FRIGHTENED") ENDIF #ENDIF
|
|
sGardenerPed.AI = N1B_PED_AI_STATE_FRIGHTENED
|
|
ENDIF
|
|
BREAK
|
|
// ------------------------------------------
|
|
CASE N1B_PED_AI_STATE_FRIGHTENED
|
|
IF NOT IS_PED_RAGDOLL(sGardenerPed.pedIndex)
|
|
IF NOT IsPedPerformingTask(sGardenerPed.pedIndex, SCRIPT_TASK_COWER)
|
|
sGardenerPed.AI = N1B_PED_AI_SETUP_FRIGHTENED
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "GARDENER AI - N1B_PED_AI_STATE_FRIGHTENED going to N1B_PED_AI_SETUP_FRIGHTENED") ENDIF #ENDIF
|
|
ELSE
|
|
IF IS_ENTITY_IN_WATER(sGardenerPed.pedIndex)
|
|
sGardenerPed.AI = N1B_PED_AI_SETUP_SURRENDERED
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "GARDENER - N1B_PED_AI_STATE_FRIGHTENED going to N1B_PED_AI_SETUP_SURRENDERED") ENDIF #ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
// ------------------------------------------
|
|
CASE N1B_PED_AI_SETUP_FLEE
|
|
IF NOT IS_ENTITY_PLAYING_ANIM(sGardenerPed.pedIndex, "rcmnigel1b", "exit_panic_gardener")
|
|
AND NOT IS_ENTITY_PLAYING_ANIM(sGardenerPed.pedIndex, "rcmnigel1b", "exit_gardener")
|
|
SET_PED_FLEE_ATTRIBUTES(sGardenerPed.pedIndex, FA_RETURN_TO_ORIGNAL_POSITION_AFTER_FLEE, FALSE)
|
|
SET_PED_FLEE_ATTRIBUTES(sGardenerPed.pedIndex, FA_DISABLE_HANDS_UP, FALSE)
|
|
SET_PED_FLEE_ATTRIBUTES(sGardenerPed.pedIndex, FA_USE_VEHICLE, FALSE)
|
|
SET_PED_FLEE_ATTRIBUTES(sGardenerPed.pedIndex, FA_PREFER_PAVEMENTS, TRUE)
|
|
SET_PED_FLEE_ATTRIBUTES(sGardenerPed.pedIndex, FA_USE_COVER, FALSE)
|
|
SET_PED_FLEE_ATTRIBUTES(sGardenerPed.pedIndex, FA_LOOK_FOR_CROWDS, FALSE)
|
|
SET_PED_FLEE_ATTRIBUTES(sGardenerPed.pedIndex, FA_CAN_SCREAM, TRUE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sGardenerPed.pedIndex, CA_ALWAYS_FIGHT, FALSE)
|
|
SET_PED_COMBAT_ATTRIBUTES(sGardenerPed.pedIndex, CA_ALWAYS_FLEE, TRUE)
|
|
IF IS_ENTITY_ALIVE(moGardnerVanProps[NIGEL1B_PROP_GARDENER_LEAF_BLOWER].object)
|
|
IF IS_ENTITY_ATTACHED_TO_ENTITY(moGardnerVanProps[NIGEL1B_PROP_GARDENER_LEAF_BLOWER].object, sGardenerPed.pedIndex)
|
|
DETACH_ENTITY(moGardnerVanProps[NIGEL1B_PROP_GARDENER_LEAF_BLOWER].object)
|
|
ENDIF
|
|
SAFE_REMOVE_OBJECT(moGardnerVanProps[NIGEL1B_PROP_GARDENER_LEAF_BLOWER].object, FALSE)
|
|
ENDIF
|
|
CLEAR_PED_SECONDARY_TASK(sGardenerPed.pedIndex)
|
|
IF IS_PED_USING_ANY_SCENARIO(sGardenerPed.pedIndex)
|
|
//CLEAR_PED_TASKS(sGardenerPed.pedIndex)
|
|
SET_PED_PANIC_EXIT_SCENARIO(sGardenerPed.pedIndex, vPlayerPos)
|
|
ENDIF
|
|
// play his exit anim
|
|
IF IS_ENTITY_PLAYING_ANIM(sGardenerPed.pedIndex, "rcmnigel1b", "idle_gardener")
|
|
TASK_PLAY_ANIM(sGardenerPed.pedIndex, "rcmnigel1b", "exit_panic_gardener", NORMAL_BLEND_IN, SLOW_BLEND_OUT, -1, AF_DEFAULT | AF_EXIT_AFTER_INTERRUPTED)
|
|
ELSE
|
|
IF NOT IS_PED_RAGDOLL(sGardenerPed.pedIndex)
|
|
AND NOT IS_PED_SWIMMING(sGardenerPed.pedIndex)
|
|
AND NOT IS_PED_CLIMBING(sGardenerPed.pedIndex)
|
|
TASK_REACT_AND_FLEE_PED(sGardenerPed.pedIndex, PLAYER_PED_ID())
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "GARDENER AI - TASK_REACT_AND_FLEE_PED applied ") ENDIF #ENDIF
|
|
ELSE
|
|
TASK_SMART_FLEE_PED(sGardenerPed.pedIndex, PLAYER_PED_ID(), 150.0, -1, TRUE)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "GARDENER AI - TASK_SMART_FLEE_PED applied ") ENDIF #ENDIF
|
|
ENDIF
|
|
sGardenerPed.AI = N1B_PED_AI_STATE_FLEE
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "GARDENER AI - set - N1B_PED_AI_SETUP_FLEE ") ENDIF #ENDIF
|
|
ENDIF
|
|
ELSE
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "GARDENER AI - waiting on exit anim to finish - N1B_PED_AI_SETUP_FLEE ") ENDIF #ENDIF
|
|
ENDIF
|
|
BREAK
|
|
// ------------------------------------------
|
|
CASE N1B_PED_AI_STATE_FLEE
|
|
IF NOT IsPedPerformingTask(sGardenerPed.pedIndex, SCRIPT_TASK_SMART_FLEE_PED)
|
|
AND NOT IsPedPerformingTask(sGardenerPed.pedIndex, SCRIPT_TASK_REACT_AND_FLEE_PED)
|
|
sGardenerPed.AI = N1B_PED_AI_SETUP_FLEE
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "GARDENER AI - reapply - N1B_PED_AI_STATE_FLEE ") ENDIF #ENDIF
|
|
ENDIF
|
|
BREAK
|
|
// ------------------------------------------
|
|
DEFAULT
|
|
SCRIPT_ASSERT("NIGEL1B - invalid N1B_PED_AI in Gardener AI")
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/*
|
|
/// PURPOSE:
|
|
/// Handles the updating of the pools peds and gardener's ai, only updates one ped a frame
|
|
/// //ommented out for now as this is pretty slow at updating
|
|
PROC MANAGE_UPDATING_POOL_PEDS_AND_GARDENER_AI()
|
|
//IF (GET_GAME_TIMER() - iUpdatePoolPedAI_ThisFrameCounter > 5)
|
|
//reached end so undate gardener instead this frame
|
|
IF (iPoolPedId_ToUpdateInManager >= TOTAL_POOL_PEDS)
|
|
CONTROL_GARDENERS_AI()
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_UPDATING_POOL_PEDS_AND_GARDENER_AI - GARDENER UPDATED THIS FRAME") ENDIF #ENDIF
|
|
iPoolPedId_ToUpdateInManager = 0
|
|
ELSE
|
|
CONTROL_POOL_PEDS_AI(iPoolPedId_ToUpdateInManager)
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_UPDATING_POOL_PEDS_AND_GARDENER_AI - POOL PED UPDATED THIS FRAME ID = ", iPoolPedId_ToUpdateInManager) ENDIF #ENDIF
|
|
iPoolPedId_ToUpdateInManager++
|
|
ENDIF
|
|
// iUpdatePoolPedAI_ThisFrameCounter = GET_GAME_TIMER()
|
|
//ENDIF
|
|
ENDPROC
|
|
*/
|
|
|
|
/// PURPOSE:
|
|
/// Check to see if the ped is in the house area
|
|
/// PARAMS:
|
|
/// pedIndex - ped to test
|
|
/// bDoDeadCheck - do IS_ENTITY_ALIVE check first
|
|
/// RETURNS:
|
|
/// FALSE if the player is dead, or outside the area TRUE, if the ped is inside the area.
|
|
FUNC BOOL IS_PED_IN_HOUSE_AREA(PED_INDEX pedIndex, BOOL bDoDeadCheck = TRUE)
|
|
IF bDoDeadCheck
|
|
IF NOT IS_ENTITY_ALIVE(pedIndex)
|
|
RETURN FALSE
|
|
ENDIF
|
|
ENDIF
|
|
VECTOR vPos = GET_ENTITY_COORDS(pedIndex)
|
|
IF IS_POINT_IN_POLY_2D(tpCelebHouseArea, vPos)
|
|
IF ARE_FLOAT_VALUES_SIMILAR(vPos.Z, NIGEL1B_LOWEST_GROUND_Z_POSITION_AT_HOUSE, NIGEL1B_GROUND_Z_TOLERANCE_AT_HOUSE)
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Check to see if the ped is in the pool area
|
|
/// PARAMS:
|
|
/// pedIndex - Ped to test
|
|
/// bDoDeadCheck - do IS_ENTITY_ALIVE check first
|
|
/// RETURNS:
|
|
/// FALSE if the player is dead, or outside the area TRUE, if the ped is inside the area.
|
|
FUNC BOOL IS_PED_IN_POOL_AREA(PED_INDEX pedIndex, BOOL bDoDeadCheck = TRUE)
|
|
IF bDoDeadCheck
|
|
IF NOT IS_ENTITY_ALIVE(pedIndex)
|
|
RETURN FALSE
|
|
ENDIF
|
|
ENDIF
|
|
VECTOR vPos = GET_ENTITY_COORDS(pedIndex)
|
|
IF IS_ENTITY_IN_RANGE_COORDS(pedIndex, vPoolArea_NorthCircle_Pos, NIGEL1B_POOL_AREA_NORTH_CIRCLE_RADIUS)
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_PED_IN_POOL_AREA - inside north radius") ENDIF #ENDIF
|
|
// exclusion area to fix bug 980603
|
|
IF NOT IS_ENTITY_AT_COORD(PedIndex, <<-1055.184448,382.732361,70.688316>>,<<1.000000,2.000000,2.750000>>)
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_PED_IN_POOL_AREA - also not in the exlusion area so return true!") ENDIF #ENDIF
|
|
IF ARE_FLOAT_VALUES_SIMILAR(vPos.Z, NIGEL1B_LOWEST_GROUND_Z_POSITION_AT_HOUSE, NIGEL1B_GROUND_Z_TOLERANCE_AT_HOUSE)
|
|
RETURN TRUE
|
|
ENDIF
|
|
ELSE
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_PED_IN_POOL_AREA - but inside exclusion area###") ENDIF #ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
IF IS_ENTITY_IN_AREA(pedIndex, vPoolArea_MajorityPosA, vPoolArea_MajorityPosB)
|
|
OR IS_ENTITY_IN_ANGLED_AREA(pedIndex, vPoolArea_SouthWallPosA, vPoolArea_SouthWallPosB, NIGEL1B_POOL_AREA_SOUTH_WALL_POS_AB_WIDTH)
|
|
OR IS_ENTITY_IN_ANGLED_AREA(pedIndex, vPoolArea_SouthWallPosC, vPoolArea_SouthWallPosD, NIGEL1B_POOL_AREA_SOUTH_WALL_POS_CD_WIDTH)
|
|
OR IS_ENTITY_IN_ANGLED_AREA(pedIndex, vPoolArea_SouthWallPosE, vPoolArea_SouthWallPosF, NIGEL1B_POOL_AREA_SOUTH_WALL_POS_EF_WIDTH)
|
|
OR IS_ENTITY_IN_ANGLED_AREA(pedIndex, vPoolArea_SouthWallPosG, vPoolArea_SouthWallPosH, NIGEL1B_POOL_AREA_SOUTH_WALL_POS_GH_WIDTH)
|
|
IF ARE_FLOAT_VALUES_SIMILAR(vPos.Z, NIGEL1B_LOWEST_GROUND_Z_POSITION_AT_HOUSE, NIGEL1B_GROUND_Z_TOLERANCE_AT_HOUSE)
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Check to see if the ped is in the garden area
|
|
/// PARAMS:
|
|
/// pedIndex - Ped to test
|
|
/// bDoDeadCheck - do IS_ENTITY_ALIVE check first
|
|
/// RETURNS:
|
|
/// FALSE if the player is dead, or outside the area TRUE, if the ped is inside the area.
|
|
FUNC BOOL IS_PED_IN_GARDEN_AREA(PED_INDEX pedIndex, BOOL bDoDeadCheck = TRUE)
|
|
IF bDoDeadCheck
|
|
IF NOT IS_ENTITY_ALIVE(pedIndex)
|
|
RETURN FALSE
|
|
ENDIF
|
|
ENDIF
|
|
VECTOR vPos = GET_ENTITY_COORDS(pedIndex)
|
|
IF IS_POINT_IN_POLY_2D(tpGardenArea, vPos)
|
|
IF ARE_FLOAT_VALUES_SIMILAR(vPos.Z, NIGEL1B_LOWEST_GROUND_Z_POSITION_AT_HOUSE, NIGEL1B_GROUND_Z_TOLERANCE_AT_HOUSE)
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Checks the player's location and updates N1B_PLAYER_LOCATION
|
|
/// also modifies the wanted level multiplier
|
|
/// and controls the gates' state switching
|
|
PROC CHECK_AND_UPDATE_PLAYER_LOCATION()
|
|
|
|
IF ePlayerLocation = N1B_PLAYER_LOCATION_OUTSIDE_HOUSE_AREA
|
|
IF IS_PED_IN_HOUSE_AREA(PLAYER_PED_ID(), FALSE)
|
|
SET_WANTED_LEVEL_MULTIPLIER(0.2)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CHECK_AND_UPDATE_PLAYER_LOCATION - SET_WANTED_LEVEL_MULTIPLIER(0.2)") ENDIF #ENDIF
|
|
ePlayerLocation = N1B_PLAYER_LOCATION_INSIDE_HOUSE_AREA
|
|
EXIT
|
|
ENDIF
|
|
|
|
ELIF ePlayerLocation = N1B_PLAYER_LOCATION_INSIDE_HOUSE_AREA
|
|
IF IS_PED_IN_POOL_AREA(PLAYER_PED_ID(), FALSE)
|
|
SET_HOUSE_DOUBLE_GATES_LOCKED_STATE(FALSE)
|
|
ALLOW_DIALOGUE_IN_WATER(TRUE)
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("NIGEL_1B_MAIN_MIX")
|
|
START_AUDIO_SCENE("NIGEL_1B_MAIN_MIX")
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CHECK_AND_UPDATE_PLAYER_LOCATION - set audio scene active - ", "NIGEL_1B_MAIN_MIX") ENDIF #ENDIF
|
|
ENDIF
|
|
ePlayerLocation = N1B_PLAYER_LOCATION_POOL_AREA
|
|
EXIT
|
|
ELIF IS_PED_IN_GARDEN_AREA(PLAYER_PED_ID(), FALSE)
|
|
SET_HOUSE_DOUBLE_GATES_LOCKED_STATE(FALSE)
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("NIGEL_1B_MAIN_MIX")
|
|
START_AUDIO_SCENE("NIGEL_1B_MAIN_MIX")
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CHECK_AND_UPDATE_PLAYER_LOCATION - set audio scene active - ", "NIGEL_1B_MAIN_MIX") ENDIF #ENDIF
|
|
ENDIF
|
|
ePlayerLocation = N1B_PLAYER_LOCATION_GARDEN_AREA
|
|
EXIT
|
|
ELIF NOT IS_PED_IN_HOUSE_AREA(PLAYER_PED_ID(), FALSE)
|
|
SET_WANTED_LEVEL_MULTIPLIER(0.8)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CHECK_AND_UPDATE_PLAYER_LOCATION - SET_WANTED_LEVEL_MULTIPLIER(0.8)") ENDIF #ENDIF
|
|
ePlayerLocation = N1B_PLAYER_LOCATION_OUTSIDE_HOUSE_AREA
|
|
EXIT
|
|
ENDIF
|
|
|
|
ELIF ePlayerLocation = N1B_PLAYER_LOCATION_POOL_AREA
|
|
IF IS_PED_IN_POOL_AREA(PLAYER_PED_ID(), FALSE)
|
|
// B*1537381 - Random peds screaming in the background when performing a stealth takedown on the gardener.
|
|
IF IS_PED_PERFORMING_STEALTH_KILL(PLAYER_PED_ID())
|
|
SUPPRESS_SHOCKING_EVENTS_NEXT_FRAME()
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CHECK_AND_UPDATE_PLAYER_LOCATION : N1B_PLAYER_LOCATION_GARDEN_AREA", " SUPPRESS_SHOCKING_EVENTS_NEXT_FRAME() for player stealth kill") ENDIF #ENDIF
|
|
ENDIF
|
|
CHECK_FOR_HOUSE_DOUBLE_GATES_BEING_OPENED()
|
|
ELSE
|
|
SET_HOUSE_DOUBLE_GATES_LOCKED_STATE(TRUE)
|
|
ALLOW_DIALOGUE_IN_WATER(FALSE)
|
|
ePlayerLocation = N1B_PLAYER_LOCATION_INSIDE_HOUSE_AREA
|
|
EXIT
|
|
ENDIF
|
|
|
|
ELIF ePlayerLocation = N1B_PLAYER_LOCATION_GARDEN_AREA
|
|
IF IS_PED_IN_GARDEN_AREA(PLAYER_PED_ID(), FALSE)
|
|
// B*1537381 - Random peds screaming in the background when performing a stealth takedown on the gardener.
|
|
IF IS_PED_PERFORMING_STEALTH_KILL(PLAYER_PED_ID())
|
|
SUPPRESS_SHOCKING_EVENTS_NEXT_FRAME()
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CHECK_AND_UPDATE_PLAYER_LOCATION : N1B_PLAYER_LOCATION_GARDEN_AREA", " SUPPRESS_SHOCKING_EVENTS_NEXT_FRAME() for player stealth kill") ENDIF #ENDIF
|
|
ENDIF
|
|
CHECK_FOR_HOUSE_DOUBLE_GATES_BEING_OPENED()
|
|
ELSE
|
|
SET_HOUSE_DOUBLE_GATES_LOCKED_STATE(TRUE)
|
|
ePlayerLocation = N1B_PLAYER_LOCATION_INSIDE_HOUSE_AREA
|
|
EXIT
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// handles triggering the requested mission music events
|
|
/// Since these cues need to be sequental, request event will only trigger if the previous event has triggered
|
|
/// PARAMS:
|
|
/// iMusicEvent - the event we want to trigger
|
|
PROC REQUEST_TRIGGER_MISSION_MUSIC_EVENT(INT iMusicEvent)
|
|
IF iMusicEvent = iMissionMusicEventTriggerCounter
|
|
SWITCH iMissionMusicEventTriggerCounter
|
|
CASE NIGEL1B_MUSIC_EVENT_START
|
|
IF SAFE_TRIGGER_MISSION_MUSIC_EVENT("NIGEL1B_START")
|
|
iMissionMusicEventTriggerCounter++
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "REQUEST_TRIGGER_MISSION_MUSIC_EVENT : ", "NIGEL1B_MUSIC_EVENT_START") ENDIF #ENDIF
|
|
ENDIF
|
|
BREAK
|
|
CASE NIGEL1B_MUSIC_EVENT_WANTED
|
|
IF SAFE_TRIGGER_MISSION_MUSIC_EVENT("NIGEL1B_WANTED")
|
|
SET_AUDIO_FLAG("AllowScoreAndRadio", FALSE)
|
|
iMissionMusicEventTriggerCounter++
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "REQUEST_TRIGGER_MISSION_MUSIC_EVENT : ", "NIGEL1B_MUSIC_EVENT_WANTED") ENDIF #ENDIF
|
|
ENDIF
|
|
BREAK
|
|
CASE NIGEL1B_MUSIC_EVENT_COPS_LOST
|
|
IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
IF SAFE_TRIGGER_MISSION_MUSIC_EVENT("NIGEL1B_COPS_LOST")
|
|
SET_AUDIO_FLAG("AllowScoreAndRadio", TRUE)
|
|
iTimer_DelayResetAudioFlag_AllowScoreAndRadio = GET_GAME_TIMER()
|
|
iMissionMusicEventTriggerCounter = NIGEL1B_MUSIC_EVENT_RESET_FLAG_ALLOW_SCORE_AND_RADIO
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "REQUEST_TRIGGER_MISSION_MUSIC_EVENT : ", "NIGEL1B_MUSIC_EVENT_COPS_LOST") ENDIF #ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF SAFE_TRIGGER_MISSION_MUSIC_EVENT("NIGEL1B_MISSION_FAIL")
|
|
iMissionMusicEventTriggerCounter = NIGEL1B_MUSIC_EVENT_MAX
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "REQUEST_TRIGGER_MISSION_MUSIC_EVENT : ", "NIGEL1B_MISSION_FAIL") ENDIF #ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
DEFAULT
|
|
BREAK
|
|
ENDSWITCH
|
|
ELSE
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "REQUEST_TRIGGER_MISSION_MUSIC_EVENT : ERROR - iMusicEvent = ", iMusicEvent, " but iMissionMusicEventTriggerCounter = ", iMissionMusicEventTriggerCounter) ENDIF #ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// handles requesting to trigger music events 2 and 3
|
|
PROC MONITOR_TRIGGER_MISSION_MUSIC_EVENTS()
|
|
/// This should only get called after the clothes have been stolen
|
|
IF eMissionStage >= MISSION_STAGE_ITEMS_STOLEN_LEAVE_THE_AREA
|
|
// we'll only do the rest if the initial music event has been triggered, since they run in sequences
|
|
IF iMissionMusicEventTriggerCounter > NIGEL1B_MUSIC_EVENT_START
|
|
AND iMissionMusicEventTriggerCounter < NIGEL1B_MUSIC_EVENT_MAX
|
|
IF iMissionMusicEventTriggerCounter <> NIGEL1B_MUSIC_EVENT_RESET_FLAG_ALLOW_SCORE_AND_RADIO
|
|
IF iMissionMusicEventTriggerCounter = NIGEL1B_MUSIC_EVENT_WANTED
|
|
IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
REQUEST_TRIGGER_MISSION_MUSIC_EVENT(NIGEL1B_MUSIC_EVENT_WANTED)
|
|
ENDIF
|
|
ENDIF
|
|
// if player manages to lose the cops early need to clear the music
|
|
IF eMissionStage = MISSION_STAGE_ITEMS_STOLEN_LEAVE_THE_AREA
|
|
IF NOT IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
|
|
IF bHavePoolPedsCallTheCops
|
|
iMissionMusicEventTriggerCounter = NIGEL1B_MUSIC_EVENT_COPS_LOST
|
|
REQUEST_TRIGGER_MISSION_MUSIC_EVENT(NIGEL1B_MUSIC_EVENT_COPS_LOST)
|
|
ENDIF
|
|
ENDIF
|
|
// if player has reached the outro phonecall music needs to cleared since the wanted level will have been cleared
|
|
ELIF eMissionStage = MISSION_STAGE_OUTRO_PHONECALL
|
|
iMissionMusicEventTriggerCounter = NIGEL1B_MUSIC_EVENT_COPS_LOST
|
|
REQUEST_TRIGGER_MISSION_MUSIC_EVENT(NIGEL1B_MUSIC_EVENT_COPS_LOST)
|
|
ENDIF
|
|
ELSE
|
|
// reset the audio flag after the delay
|
|
IF HAS_TIME_PASSED(iTimer_DelayResetAudioFlag_AllowScoreAndRadio, 5000) // time delay suggested by Rebecca J
|
|
SET_AUDIO_FLAG("AllowScoreAndRadio", FALSE)
|
|
iMissionMusicEventTriggerCounter = NIGEL1B_MUSIC_EVENT_MAX
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MONITOR_TRIGGER_MISSION_MUSIC_EVENTS : ", "reset audio flag AllowScoreAndRadio to FALSE") ENDIF #ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// handles the player using try to barge door animations
|
|
/// when approaching the gates at the side of the house
|
|
/// Setup taken from Armenian 3 - Alan's
|
|
PROC MONITOR_PLAYER_BARGE_DOOR_AT_HOUSE()
|
|
|
|
IF NOT IS_PHONE_ONSCREEN()
|
|
AND NOT IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0) // skip playing anims and taking away player control if he's wanted
|
|
VECTOR vRotation
|
|
//West gate
|
|
IF NOT bTrevorBargedWestGate
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-1056.142578,382.923309,67.745857>>, <<-1054.965088,382.899017,70.988388>>, 1.200000)
|
|
IF IS_PED_ON_FOOT(PLAYER_PED_ID())
|
|
IF IS_DOOR_IN_LOCKED_STATE(N1B_MCD_WEST_GATE_01) // only play the anim if the door is locked
|
|
IF NOT IS_PED_CLIMBING(PLAYER_PED_ID())
|
|
AND NOT IS_PED_JUMPING(PLAYER_PED_ID())
|
|
AND NOT IS_PED_RAGDOLL(PLAYER_PED_ID())
|
|
// make sure player is facing towards the door
|
|
IF IS_PED_CLOSE_TO_IDEAL_HEADING(PLAYER_PED_ID(), 87.9952, 90.0)
|
|
IF NOT IS_AREA_OCCUPIED(<< -1056.17236, 382.19086, 68.08848 >>, << -1054.68164, 383.83936, 70.96900 >>, FALSE, TRUE, FALSE, FALSE, FALSE) // B*1165823
|
|
REQUEST_ANIM_DICT("rcmnigel1b")
|
|
vRotation = GET_ANIM_INITIAL_OFFSET_ROTATION("rcmnigel1b", "lockeddoor_tryopen", << -1056.171, 383.577, 68.688 >>, << -0.000, 0.000, 97.793 >>)
|
|
IF HAS_ANIM_DICT_LOADED("rcmnigel1b")
|
|
IF NOT IsPedPerformingTask(PLAYER_PED_ID(), SCRIPT_TASK_PERFORM_SEQUENCE)
|
|
OPEN_SEQUENCE_TASK(sequenceAI)
|
|
TASK_GO_STRAIGHT_TO_COORD(NULL, GET_ANIM_INITIAL_OFFSET_POSITION("rcmnigel1b", "lockeddoor_tryopen", << -1056.171, 383.577, 68.688 >>,
|
|
<< -0.000, 0.000, 97.793 >>),PEDMOVEBLENDRATIO_WALK, DEFAULT_TIME_BEFORE_WARP, vRotation.z)
|
|
TASK_PLAY_ANIM_ADVANCED(NULL, "rcmnigel1b", "lockeddoor_tryopen", << -1056.171, 383.577, 68.688 >>, << -0.000, 0.000, 97.793 >>,
|
|
SLOW_BLEND_IN, SLOW_BLEND_OUT, -1, AF_EXTRACT_INITIAL_OFFSET | AF_IGNORE_GRAVITY | AF_OVERRIDE_PHYSICS | AF_TURN_OFF_COLLISION)
|
|
CLOSE_SEQUENCE_TASK(sequenceAI)
|
|
TASK_PERFORM_SEQUENCE(PLAYER_PED_ID(), sequenceAI)
|
|
CLEAR_SEQUENCE_TASK(sequenceAI)
|
|
//B*1988897 - force player weapon away for anim
|
|
GET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), weaponTypeStoredCurrentEquipped)
|
|
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED, TRUE)
|
|
|
|
REPLAY_RECORD_BACK_FOR_TIME(2.0, 3.0, REPLAY_IMPORTANCE_LOWEST)
|
|
|
|
bTrevorBargedWestGate = TRUE
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MONITOR_PLAYER_BARGE_DOOR_AT_HOUSE - triggered west gate anim, frame count : ", GET_FRAME_COUNT()) ENDIF #ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MONITOR_PLAYER_BARGE_DOOR_AT_HOUSE - triggered west gate anim, failed area occupied, frame count : ", GET_FRAME_COUNT()) ENDIF #ENDIF
|
|
ENDIF
|
|
ELSE
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MONITOR_PLAYER_BARGE_DOOR_AT_HOUSE - triggered west gate anim, failed for player heading out of range, frame count : ", GET_FRAME_COUNT()) ENDIF #ENDIF
|
|
ENDIF
|
|
ELSE
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MONITOR_PLAYER_BARGE_DOOR_AT_HOUSE - triggered west gate anim, failed for player climbing / jumping, frame count : ", GET_FRAME_COUNT()) ENDIF #ENDIF
|
|
ENDIF
|
|
ELSE
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MONITOR_PLAYER_BARGE_DOOR_AT_HOUSE - triggered west gate anim, failed for door being open, frame count : ", GET_FRAME_COUNT()) ENDIF #ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
// East gate
|
|
IF NOT bTrevorBargedEastGate
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-1040.536987,383.536926,67.963135>>, <<-1041.791748,383.561371,70.993462>>, 1.200000)
|
|
IF IS_PED_ON_FOOT(PLAYER_PED_ID())
|
|
IF IS_DOOR_IN_LOCKED_STATE(N1B_MCD_EAST_GATE_01) // only play the anim if the door is locked
|
|
IF NOT IS_PED_CLIMBING(PLAYER_PED_ID())
|
|
AND NOT IS_PED_JUMPING(PLAYER_PED_ID())
|
|
AND NOT IS_PED_RAGDOLL(PLAYER_PED_ID())
|
|
// make sure player is facing towards the door
|
|
IF IS_PED_CLOSE_TO_IDEAL_HEADING(PLAYER_PED_ID(), 277.6446, 90.0)
|
|
IF NOT IS_AREA_OCCUPIED(<< -1042.09949, 382.67090, 68.07068 >>, << -1040.59473, 384.26083, 71.07093 >>, FALSE, TRUE, FALSE, FALSE, FALSE) // B*1165823
|
|
REQUEST_ANIM_DICT("rcmnigel1b")
|
|
vRotation = GET_ANIM_INITIAL_OFFSET_ROTATION("rcmnigel1b", "lockeddoor_tryopen", << -1040.550, 382.850, 68.850 >>, << 0.000, 0.000, -90.000 >>)
|
|
IF HAS_ANIM_DICT_LOADED("rcmnigel1b")
|
|
IF NOT IsPedPerformingTask(PLAYER_PED_ID(), SCRIPT_TASK_PERFORM_SEQUENCE)
|
|
OPEN_SEQUENCE_TASK(sequenceAI)
|
|
TASK_GO_STRAIGHT_TO_COORD(NULL, GET_ANIM_INITIAL_OFFSET_POSITION("rcmnigel1b", "lockeddoor_tryopen", << -1040.550, 382.850, 68.850 >>,
|
|
<< 0.000, 0.000, -90.000 >>),PEDMOVEBLENDRATIO_WALK, DEFAULT_TIME_BEFORE_WARP, vRotation.z)
|
|
TASK_PLAY_ANIM_ADVANCED(NULL, "rcmnigel1b", "lockeddoor_tryopen", << -1040.550, 382.850, 68.850 >>, << 0.000, 0.000, -90.000 >>,
|
|
SLOW_BLEND_IN, SLOW_BLEND_OUT, -1, AF_EXTRACT_INITIAL_OFFSET | AF_IGNORE_GRAVITY | AF_OVERRIDE_PHYSICS | AF_TURN_OFF_COLLISION)
|
|
CLOSE_SEQUENCE_TASK(sequenceAI)
|
|
TASK_PERFORM_SEQUENCE(PLAYER_PED_ID(), sequenceAI)
|
|
CLEAR_SEQUENCE_TASK(sequenceAI)
|
|
//B*1988897 - force player weapon away for anim
|
|
GET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), weaponTypeStoredCurrentEquipped)
|
|
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED, TRUE)
|
|
REPLAY_RECORD_BACK_FOR_TIME(2.0, 3.0, REPLAY_IMPORTANCE_LOWEST)
|
|
bTrevorBargedEastGate = TRUE
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MONITOR_PLAYER_BARGE_DOOR_AT_HOUSE - triggered east gate anim, frame count : ", GET_FRAME_COUNT()) ENDIF #ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MONITOR_PLAYER_BARGE_DOOR_AT_HOUSE - triggered east gate anim, failed area occupied, frame count : ", GET_FRAME_COUNT()) ENDIF #ENDIF
|
|
ENDIF
|
|
ELSE
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MONITOR_PLAYER_BARGE_DOOR_AT_HOUSE - triggered east gate anim, failed for player heading out of range, frame count : ", GET_FRAME_COUNT()) ENDIF #ENDIF
|
|
ENDIF
|
|
ELSE
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MONITOR_PLAYER_BARGE_DOOR_AT_HOUSE - triggered east gate anim, failed for player climbing / jumping, frame count : ", GET_FRAME_COUNT()) ENDIF #ENDIF
|
|
ENDIF
|
|
ELSE
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MONITOR_PLAYER_BARGE_DOOR_AT_HOUSE - triggered east gate anim, failed for door being open, frame count : ", GET_FRAME_COUNT()) ENDIF #ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// comments from Trevor when barging the gates
|
|
IF bDoneDialogue_TrevorBargesLockedGate[0]
|
|
AND bDoneDialogue_TrevorBargesLockedGate[1]
|
|
//both comments done so don't recheck
|
|
ELSE
|
|
IF IS_ENTITY_PLAYING_ANIM(PLAYER_PED_ID(), "rcmnigel1b", "lockeddoor_tryopen")
|
|
IF (GET_ENTITY_ANIM_CURRENT_TIME(PLAYER_PED_ID(), "rcmnigel1b", "lockeddoor_tryopen") > 0.568)
|
|
IF NOT bDoneDialogue_TrevorBargesLockedGate[0]
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
AND NOT IS_CONVERSATION_TRYING_TO_BE_RESTORED("NULL")
|
|
IF NIG1B_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG1BAU", "NIG1B_PTLG1", CONV_PRIORITY_MEDIUM)
|
|
// Nope, locked.
|
|
bDoneDialogue_TrevorBargesLockedGate[0] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELIF NOT bDoneDialogue_TrevorBargesLockedGate[1]
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
AND NOT IS_CONVERSATION_TRYING_TO_BE_RESTORED("NULL")
|
|
IF NIG1B_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG1BAU", "NIG1B_PTLG2", CONV_PRIORITY_MEDIUM)
|
|
// I could just climb over.
|
|
bDoneDialogue_TrevorBargesLockedGate[1] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF HAS_ANIM_EVENT_FIRED(PLAYER_PED_ID(), HASH("Interrupt"))
|
|
CLEAR_PED_TASKS(PLAYER_PED_ID())
|
|
//B*1988897 - re-equip player weapon
|
|
IF weaponTypeStoredCurrentEquipped != WEAPONTYPE_UNARMED
|
|
AND weaponTypeStoredCurrentEquipped != WEAPONTYPE_INVALID
|
|
IF HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), weaponTypeStoredCurrentEquipped)
|
|
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), weaponTypeStoredCurrentEquipped, TRUE)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MONITOR_PLAYER_BARGE_DOOR_AT_HOUSE - * triggered anim interrupt event so reset player current weapon , frame count : ", GET_FRAME_COUNT()) ENDIF #ENDIF
|
|
ENDIF
|
|
weaponTypeStoredCurrentEquipped = WEAPONTYPE_UNARMED // stop this getting re-equiped again
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// handles the player not losing his wanted level inside the house area
|
|
/// also triggers the music event for the player getting a wanted level early on
|
|
PROC CHECK_AND_UPDATE_PLAYER_WANTED_LEVEL()
|
|
IF IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
|
|
//don't let the wanted level clear if the player is inside the house area
|
|
IF ePlayerLocation <> N1B_PLAYER_LOCATION_OUTSIDE_HOUSE_AREA
|
|
SUPPRESS_LOSING_WANTED_LEVEL_IF_HIDDEN_THIS_FRAME(PLAYER_ID())
|
|
// If player is in the house with wanted level, force the big gates open, bug fix B*1050905 - cops don't seem able to enter house unless a gate is open
|
|
// also done if player has made the pool peds flee, so they can use alternative flee routes bug fix B*1129401
|
|
IF NOT bForceHouseGatesOpenDuringGameplay
|
|
SET_HOUSE_DOUBLE_GATES_LOCKED_STATE(FALSE)
|
|
// open the side gate too
|
|
SET_MISSION_CONTROLLED_DOOR_OPEN_RATIO(N1B_MCD_WEST_GATE_01, DOOR_SYSTEM_GET_OPEN_RATIO(iMissionControlledDoors[N1B_MCD_WEST_GATE_01]), FALSE, FALSE)
|
|
SET_MISSION_CONTROLLED_DOOR_STATE(N1B_MCD_WEST_GATE_01, DOORSTATE_UNLOCKED)
|
|
bHaveNorthGatesBeenOpenedByPlayer = TRUE
|
|
bHaveSouthGatesBeenOpenedByPlayer = TRUE
|
|
bForceHouseGatesOpenDuringGameplay = TRUE
|
|
CPRINTLN(DEBUG_MISSION, "CHECK_AND_UPDATE_PLAYER_WANTED_LEVEL - bForceHouseGatesOpenDuringGameplay set TRUE")
|
|
ENDIF
|
|
ENDIF
|
|
REQUEST_TRIGGER_MISSION_MUSIC_EVENT(NIGEL1B_MUSIC_EVENT_START)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// get the given ped's current movement state
|
|
/// NOTE: for use with the ped detection system
|
|
/// PARAMS:
|
|
/// pedIndex - ped to get update for
|
|
/// bDoDeadCheck - check ped is alive first
|
|
/// RETURNS:
|
|
/// N1B_PED_MOVEMENT_STATE for the ped
|
|
FUNC N1B_PED_MOVEMENT_STATE GET_UPDATED_PED_MOVEMENT_STATE(PED_INDEX pedIndex, BOOL bDoDeadCheck = TRUE)
|
|
N1B_PED_MOVEMENT_STATE eCurrent_PedMovementState
|
|
IF bDoDeadCheck
|
|
IF NOT IS_ENTITY_ALIVE(pedIndex)
|
|
eCurrent_PedMovementState = N1B_PEDMOVEMENTSTATE_DEFAULT
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "GET_UPDATED_PED_MOVEMENT_STATE() return N1B_PEDMOVEMENTSTATE_DEFAULT ped not alive") ENDIF #ENDIF
|
|
RETURN eCurrent_PedMovementState
|
|
ENDIF
|
|
ENDIF
|
|
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
eCurrent_PedMovementState = N1B_PEDMOVEMENTSTATE_IN_VEHICLE
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "GET_UPDATED_PED_MOVEMENT_STATE() -> N1B_PEDMOVEMENTSTATE_IN_VEHICLE") ENDIF #ENDIF
|
|
ELIF GET_PED_STEALTH_MOVEMENT(pedIndex)
|
|
eCurrent_PedMovementState = N1B_PEDMOVEMENTSTATE_STEALTH
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "GET_UPDATED_PED_MOVEMENT_STATE() -> N1B_PEDMOVEMENTSTATE_STEALTH") ENDIF #ENDIF
|
|
ELIF IS_PED_IN_COVER(pedIndex)
|
|
eCurrent_PedMovementState = N1B_PEDMOVEMENTSTATE_COVER
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "GET_UPDATED_PED_MOVEMENT_STATE() -> N1B_PEDMOVEMENTSTATE_COVER") ENDIF #ENDIF
|
|
ELIF IS_PED_WALKING(pedIndex)
|
|
eCurrent_PedMovementState = N1B_PEDMOVEMENTSTATE_WALKING
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "GET_UPDATED_PED_MOVEMENT_STATE() -> N1B_PEDMOVEMENTSTATE_WALKING") ENDIF #ENDIF
|
|
ELIF IS_PED_RUNNING(PLAYER_PED_ID())
|
|
eCurrent_PedMovementState = N1B_PEDMOVEMENTSTATE_RUNNING
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "GET_UPDATED_PED_MOVEMENT_STATE() -> N1B_PEDMOVEMENTSTATE_RUNNING") ENDIF #ENDIF
|
|
ELIF IS_PED_SPRINTING(PLAYER_PED_ID())
|
|
eCurrent_PedMovementState = N1B_PEDMOVEMENTSTATE_SPRINTING
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "GET_UPDATED_PED_MOVEMENT_STATE() -> N1B_PEDMOVEMENTSTATE_SPRINTING") ENDIF #ENDIF
|
|
ELSE
|
|
eCurrent_PedMovementState = N1B_PEDMOVEMENTSTATE_DEFAULT
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "GET_UPDATED_PED_MOVEMENT_STATE() -> N1B_PEDMOVEMENTSTATE_DEFAULT") ENDIF #ENDIF
|
|
ENDIF
|
|
RETURN eCurrent_PedMovementState
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// update the player's movement state, for use with ped detection
|
|
/// PARAMS:
|
|
/// bDoDeadCheck - check player is alive first
|
|
PROC UPDATE_PLAYER_MOVEMENT_STATE(BOOL bDoDeadCheck = TRUE)
|
|
ePlayerMovementState = GET_UPDATED_PED_MOVEMENT_STATE(PLAYER_PED_ID(), bDoDeadCheck)
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// get the player's updated movement state
|
|
/// RETURNS:
|
|
/// ePlayerMovementState
|
|
FUNC N1B_PED_MOVEMENT_STATE GET_UPDATED_PLAYER_MOVEMENT_STATE()
|
|
RETURN ePlayerMovementState
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Set the specified ped's seeing and hearing range based on the player's movements. Small and standar range can be overriden
|
|
/// PARAMS:
|
|
/// pedIndex - ped to set seeing and hearing range for
|
|
/// bDoDeadCheck - check ped is alive first
|
|
/// RETURNS:
|
|
/// TRUE if the ranges where set successfully
|
|
FUNC BOOl SET_PED_SEEING_AND_HEARING_RANGE_BASED_ON_PLAYER_MOVEMENT(PED_INDEX pedIndex, BOOL bDoDeadCheck = TRUE)
|
|
IF bDoDeadCheck
|
|
IF NOT IS_ENTITY_ALIVE(pedIndex)
|
|
RETURN FALSE
|
|
ENDIF
|
|
ENDIF
|
|
// ePlayerMovementState is set each frame in the main mission stage loop, cuts out calling the functions multiple times a frame
|
|
IF ePlayerMovementState = N1B_PEDMOVEMENTSTATE_COVER
|
|
OR ePlayerMovementState = N1B_PEDMOVEMENTSTATE_STEALTH
|
|
SET_PED_SEEING_RANGE(pedIndex, NIGEL1B_PED_SEEING_RANGE_PLAYER_STEALTH_MODE)
|
|
SET_PED_HEARING_RANGE(pedIndex, NIGEL1B_PED_HEARING_RANGE_PLAYER_STEALTH_MODE)
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_PED_SEEING_AND_HEARING_RANGE - Stealth / Cover settings") ENDIF #ENDIF
|
|
ELIF ePlayerMovementState = N1B_PEDMOVEMENTSTATE_RUNNING
|
|
OR ePlayerMovementState = N1B_PEDMOVEMENTSTATE_SPRINTING
|
|
SET_PED_SEEING_RANGE(pedIndex, NIGEL1B_PED_SEEING_RANGE_PLAYER_RUNNING)
|
|
SET_PED_HEARING_RANGE(pedIndex, NIGEL1B_PED_HEARING_RANGE_PLAYER_RUNNING)
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_PED_SEEING_AND_HEARING_RANGE - RUNNING / SPRINTING SETTINGS") ENDIF #ENDIF
|
|
ELSE
|
|
//default seeing and hearing range for player walking around
|
|
SET_PED_SEEING_RANGE(pedIndex, NIGEL1B_PED_SEEING_RANGE_STANDARD)
|
|
SET_PED_HEARING_RANGE(pedIndex, NIGEL1B_PED_HEARING_RANGE_STANDARD)
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_PED_SEEING_AND_HEARING_RANGE - NIGEL1B_PED_HEARING_RANGE_STANDARD SETTINGS") ENDIF #ENDIF
|
|
ENDIF
|
|
RETURN TRUE
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Checks to see if the player has beaten up one of the pool peds
|
|
/// RETURNS:
|
|
/// TRUE if a the MISSION_PED's AI is N1B_PED_AI_SETUP_BEATEN_UP or N1B_PED_AI_STATE_BEATEN_UP
|
|
FUNC BOOL HAS_PLAYER_BEATEN_UP_A_POOL_PED(INT &iReturnPedIndex)
|
|
INT i = 0
|
|
REPEAT TOTAL_POOL_PEDS i
|
|
IF IS_ENTITY_ALIVE(sPoolPed[i].pedIndex)
|
|
IF sPoolPed[i].AI = N1B_PED_AI_SETUP_BEATEN_UP
|
|
OR sPoolPed[i].AI = N1B_PED_AI_STATE_BEATEN_UP
|
|
iReturnPedIndex = i
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Checks if the player has a weapon and is intimidating a ped enough that they should react
|
|
/// PARAMS:
|
|
/// pedIndex - Ped who the player is intimidating
|
|
/// fPlayerDetectionDist - Player is automatically classed as intimidating when shooting or targetting within this range
|
|
/// fBulletRadiusCheck - Used for IS_BULLET_IN_AREA check around pedIndex
|
|
/// fProjectileRadiusCheck - Used for IS_PROJECTILE_IN_AREA check around pedIndex
|
|
/// 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_USING_WEAPON_TO_INTIMIDATE_SPECIFIC_PED(PED_INDEX pedIndex, FLOAT fPlayerDetectionDist = 20.0, FLOAT fBulletRadiusCheck = 5.0, FLOAT fProjectileRadiusCheck = 15.0)
|
|
IF IS_PED_UNINJURED(pedIndex)
|
|
IF IS_PLAYER_CURRENT_WEAPON_LETHAL(TRUE, TRUE, TRUE)
|
|
VECTOR vTemp_PedPos = GET_ENTITY_COORDS(pedIndex)
|
|
IF IS_BULLET_IN_AREA(vTemp_PedPos, fBulletRadiusCheck, TRUE)
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "intimidating checks - bullet in area around ped") ENDIF #ENDIF
|
|
RETURN TRUE
|
|
ENDIF
|
|
IF IS_ENTITY_IN_RANGE_ENTITY(PLAYER_PED_ID(), pedIndex, fPlayerDetectionDist) //and is with in the range
|
|
IF SET_PED_SEEING_AND_HEARING_RANGE_BASED_ON_PLAYER_MOVEMENT(pedIndex, FALSE)
|
|
//IF CAN_PED_SEE_PLAYER(pedIndex)
|
|
IF CAN_PED_SEE_HATED_PED(pedIndex, PLAYER_PED_ID())
|
|
IF IS_PLAYER_FREE_AIMING_AT_ENTITY(PLAYER_ID(), pedIndex)
|
|
OR IS_PLAYER_TARGETTING_ENTITY(PLAYER_ID(), pedIndex)
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "intimidating checks - playing free aiming or targeting ped") ENDIF #ENDIF
|
|
RETURN TRUE
|
|
ENDIF
|
|
IF IS_PED_SHOOTING(PLAYER_PED_ID())
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "intimidating checks - player shooting with weapon") ENDIF #ENDIF
|
|
RETURN TRUE
|
|
ENDIF
|
|
ELSE
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "intimidating checks - ped can't see player") ENDIF #ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "intimidating checks - player not in range of ped") ENDIF #ENDIF
|
|
ENDIF
|
|
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(pedIndex, PLAYER_PED_ID())
|
|
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(pedIndex)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "intimidating checks - ped damaged by player with weapon") ENDIF #ENDIF
|
|
RETURN TRUE
|
|
ENDIF
|
|
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_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "intimidating checks - projectile in area around ped") ENDIF #ENDIF
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Checks if player has intimidated a pool ped, uses IS_PLAYER_USING_WEAPON_TO_INTIMIDATE_SPECIFIC_PED()
|
|
/// RETURNS:
|
|
/// true if player has intimidated a pool ped
|
|
FUNC BOOL IS_PLAYER_INTIMIDATING_POOL_PEDS()
|
|
INT i
|
|
FOR i = 0 TO (TOTAL_POOL_PEDS - 1)
|
|
IF IS_PLAYER_USING_WEAPON_TO_INTIMIDATE_SPECIFIC_PED(sPoolPed[i].pedIndex)
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDFOR
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Check to see if the player has started fighting the ped
|
|
/// PARAMS:
|
|
/// pedIndex - Ped who player is starting fight with
|
|
/// RETURNS:
|
|
/// True if the player is targetting the ped, or has damaged the ped
|
|
FUNC BOOL HAS_PLAYER_STARTED_FIGHT_WITH_SPECIFIC_PED(PED_INDEX pedIndex, FLOAT fPlayerDetectionDist = 4.0)
|
|
IF IS_PED_UNINJURED(pedIndex)
|
|
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(pedIndex, PLAYER_PED_ID())
|
|
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(pedIndex)
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "HAS_PLAYER_STARTED_FIGHT_WITH_SPECIFIC_PED() check - PLAYER DAMAGED PED") ENDIF #ENDIF
|
|
RETURN TRUE
|
|
ENDIF
|
|
IF IS_ENTITY_IN_RANGE_ENTITY(PLAYER_PED_ID(), pedIndex, fPlayerDetectionDist) //and is with in the range
|
|
IF CAN_PED_SEE_PLAYER(pedIndex) // player can be seen by other ped
|
|
IF IS_PED_PERFORMING_STEALTH_KILL(PLAYER_PED_ID())
|
|
OR IS_PLAYER_TARGETTING_ENTITY(PLAYER_ID(), pedIndex)
|
|
OR IS_PED_IN_COMBAT(PLAYER_PED_ID())
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "HAS_PLAYER_STARTED_FIGHT_WITH_SPECIFIC_PED() check - PLAYER TARGETTED PED") ENDIF #ENDIF
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Checks if player has started fight with pool peds, uses HAS_PLAYER_STARTED_FIGHT_WITH_SPECIFIC_PED()
|
|
/// RETURNS:
|
|
/// true if player has started fight
|
|
FUNC BOOL HAS_PLAYER_STARTED_FIGHT_WITH_POOL_PEDS()
|
|
INT i = 0
|
|
REPEAT TOTAL_POOL_PEDS i
|
|
IF HAS_PLAYER_STARTED_FIGHT_WITH_SPECIFIC_PED(sPoolPed[i].pedIndex)
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDREPEAT
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Check if the player is firing a lethal weapon on the property
|
|
/// RETURNS:
|
|
/// TRUE if the player is with in the grounds and firing
|
|
FUNC BOOL IS_PLAYER_FIRING_LETHAL_WEAPON_ON_PROPERTY()
|
|
IF IS_PED_SHOOTING(PLAYER_PED_ID())
|
|
IF ePlayerLocation = N1B_PLAYER_LOCATION_GARDEN_AREA
|
|
OR ePlayerLocation = N1B_PLAYER_LOCATION_POOL_AREA
|
|
OR ePlayerLocation = N1B_PLAYER_LOCATION_INSIDE_HOUSE_AREA
|
|
IF NOT IS_PED_CURRENT_WEAPON_SILENCED(PLAYER_PED_ID()) // added as per B*1079200 firing silence weapon alerts everyone
|
|
WEAPON_TYPE currentPlayerWeapon
|
|
GET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), currentPlayerWeapon)
|
|
IF currentPlayerWeapon != WEAPONTYPE_STICKYBOMB // B*1890698 - ignore sticky bombs here, covered by intimidate checks
|
|
IF IS_PLAYER_CURRENT_WEAPON_LETHAL()
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_PLAYER_FIRING_LETHAL_WEAPON_ON_PROPERTY - return TRUE") ENDIF #ENDIF
|
|
RETURN TRUE
|
|
ENDIF
|
|
ELSE
|
|
CPRINTLN(DEBUG_MISSION, "IS_PLAYER_FIRING_LETHAL_WEAPON_ON_PROPERTY - return FALSE : failed sticky bomb check")
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Check if the player is firing a lethal weapon on the property
|
|
/// RETURNS:
|
|
/// TRUE if the player is with in the grounds and firing
|
|
FUNC BOOL IS_PLAYER_DRIVING_VEHICLE_IN_AREA_OF_PROPERTY(N1B_PLAYER_LOCATION eLocationToTest)
|
|
IF ePlayerLocation = eLocationToTest
|
|
IF (GET_UPDATED_PLAYER_MOVEMENT_STATE() = N1B_PEDMOVEMENTSTATE_IN_VEHICLE)
|
|
VEHICLE_INDEX vehicleTempPlayer
|
|
vehicleTempPlayer = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID(), FALSE)
|
|
IF IS_VEHICLE_OK(vehicleTempPlayer)
|
|
IF GET_IS_VEHICLE_ENGINE_RUNNING(vehicleTempPlayer)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_PLAYER_DRIVING_VEHICLE_IN_AREA_OF_PROPERTY - RETURN TRUE - for area - ", eLocationToTest) ENDIF #ENDIF
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// check for B*1544327 & B*1544302 - pushing door pushes gardener who doesn't react
|
|
/// RETURNS:
|
|
/// TRUE if player is probably pushing the van door into the gardener
|
|
FUNC BOOL HAS_PLAYER_POTENTIALLY_KNOCKED_VAN_DOOR_INTO_GARDENER()
|
|
|
|
IF ePlayerLocation = N1B_PLAYER_LOCATION_GARDEN_AREA
|
|
IF IS_VEHICLE_OK(vehGardenerVehicle)
|
|
FLOAT fGardenerVanDoorRatio = GET_VEHICLE_DOOR_ANGLE_RATIO(vehGardenerVehicle, SC_DOOR_REAR_LEFT)
|
|
IF fGardenerVanDoorRatio < 0.49
|
|
CPRINTLN(DEBUG_MISSION, "HAS_PLAYER_POTENTIALLY_KNOCKED_VAN_DOOR_INTO_GARDENER return TRUE ratio : ", fGardenerVanDoorRatio)
|
|
RETURN TRUE
|
|
ENDIF
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "HAS_PLAYER_POTENTIALLY_KNOCKED_VAN_DOOR_INTO_GARDENER ratio : ", fGardenerVanDoorRatio) ENDIF #ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Checks if a ped should detect the player - using IS_ENTITY_TOUCHING_ENTITY, CAN_PED_SEE_HATED_PED and distance checks between the peds
|
|
/// PARAMS:
|
|
/// pedIndex - the ped to test
|
|
/// bDoDeadCheck - do dead check on ped first
|
|
/// bDoCanPedSeePedCheck - if false CAN_PED_SEE_HATED_PED isn't done.
|
|
/// bDoDistanceDetectionTestPlayerWalk - do ped distance check for player walking closeby
|
|
/// bDoDistanceDetectionTestPlayerRun - do ped distance check for player walking closeby
|
|
/// fSeeingRangeSmall - ped's small seeing range (for when player is in cover / using stealth)
|
|
/// fSeeingRangeStandard - ped's standard seeing range
|
|
/// bExitEarlyIfPlayerIsPerformingStealthKillOnPed - if TRUE, when the player is performing a stealth kill on pedIndex, the function will return FALSE regardless
|
|
/// RETURNS:
|
|
/// True if pedIndex can see the player
|
|
FUNC BOOL HAS_SPECIFIC_PED_DETECTED_THE_PLAYER(PED_INDEX pedIndex, BOOL bDoDeadCheck = TRUE, BOOL bDoCanPedSeePedCheck = TRUE, BOOL bDoDistanceDetectionTestPlayerWalk = TRUE, BOOL bDoDistanceDetectionTestPlayerRun = TRUE, BOOL bExitEarlyIfPlayerIsPerformingStealthKillOnPed = TRUE)
|
|
IF bDoDeadCheck
|
|
IF NOT IS_ENTITY_ALIVE(pedIndex)
|
|
RETURN FALSE
|
|
ENDIF
|
|
ENDIF
|
|
IF bExitEarlyIfPlayerIsPerformingStealthKillOnPed
|
|
IF IS_PED_BEING_STEALTH_KILLED(pedIndex)
|
|
IF IS_PED_PERFORMING_STEALTH_KILL(PLAYER_PED_ID())
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "HAS_SPECIFIC_PED_DETECTED_THE_PLAYER - RETURN FALSE - exit early as player is performing stealth kill") ENDIF #ENDIF
|
|
RETURN FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
//Check to see if the ped can see the player based off the set seeing and hearing ranges
|
|
IF bDoCanPedSeePedCheck
|
|
IF SET_PED_SEEING_AND_HEARING_RANGE_BASED_ON_PLAYER_MOVEMENT(pedIndex, FALSE) // update the ped's seeing and hearing range based off the players movement state
|
|
IF CAN_PED_SEE_HATED_PED(pedIndex, PLAYER_PED_ID())
|
|
//#IF IS_DEBUG_BUILD DRAW_DEBUG_LINE(GET_ENTITY_COORDS(PedIndex), GET_ENTITY_COORDS(PLAYER_PED_ID()), 255, 0, 0) #ENDIF
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "HAS_SPECIFIC_PED_DETECTED_THE_PLAYER - RETURN TRUE - PED SEES HATED PLAYER ") ENDIF #ENDIF
|
|
#IF IS_DEBUG_BUILD IF bDebug_ToggleDoSpottedPlayerChecksPause SET_GAME_PAUSED(TRUE) ENDIF #ENDIF
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
IF bDoDistanceDetectionTestPlayerRun
|
|
IF ePlayerMovementState = N1B_PEDMOVEMENTSTATE_RUNNING
|
|
OR ePlayerMovementState = N1B_PEDMOVEMENTSTATE_SPRINTING
|
|
//detect the player regardless of seeing range if he's running close to the ped
|
|
IF IS_ENTITY_IN_RANGE_COORDS(pedIndex, vPlayerPos, NIGEL1B_PED_DETECTED_CLOSEBY_RUNNING_RANGE)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "HAS_SPECIFIC_PED_DETECTED_THE_PLAYER - RETURN TRUE - PLAYER CLOSE TO PED running / sprinting") ENDIF #ENDIF
|
|
#IF IS_DEBUG_BUILD IF bDebug_ToggleDoSpottedPlayerChecksPause SET_GAME_PAUSED(TRUE) ENDIF #ENDIF
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
IF bDoDistanceDetectionTestPlayerWalk
|
|
IF ePlayerMovementState = N1B_PEDMOVEMENTSTATE_WALKING
|
|
IF IS_ENTITY_IN_RANGE_COORDS(pedIndex, vPlayerPos, NIGEL1B_PED_DETECTED_CLOSEBY_WALKING_RANGE)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "HAS_SPECIFIC_PED_DETECTED_THE_PLAYER - RETURN TRUE - PLAYER CLOSE TO PED walking") ENDIF #ENDIF
|
|
#IF IS_DEBUG_BUILD IF bDebug_ToggleDoSpottedPlayerChecksPause SET_GAME_PAUSED(TRUE) ENDIF #ENDIF
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
IF IS_PED_BEING_STUNNED(pedIndex)
|
|
WEAPON_TYPE currentPlayerWeapon
|
|
GET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), currentPlayerWeapon)
|
|
IF currentPlayerWeapon = WEAPONTYPE_STUNGUN
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "HAS_SPECIFIC_PED_DETECTED_THE_PLAYER - RETURN TRUE - ped getting stunned by player") ENDIF #ENDIF
|
|
#IF IS_DEBUG_BUILD IF bDebug_ToggleDoSpottedPlayerChecksPause SET_GAME_PAUSED(TRUE) ENDIF #ENDIF
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
//automatically detect the player if he's touching the ped
|
|
IF IS_ENTITY_TOUCHING_ENTITY(pedIndex, PLAYER_PED_ID())
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "HAS_SPECIFIC_PED_DETECTED_THE_PLAYER - RETURN TRUE - Player touching PED") ENDIF #ENDIF
|
|
#IF IS_DEBUG_BUILD IF bDebug_ToggleDoSpottedPlayerChecksPause SET_GAME_PAUSED(TRUE) ENDIF #ENDIF
|
|
RETURN TRUE
|
|
ENDIF
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Checks if the gardener ped should detect the player - using IS_ENTITY_TOUCHING_ENTITY, CAN_PED_SEE_HATED_PED (with extra test to fix B*415016) and distance checks between the peds
|
|
/// PARAMS:
|
|
/// bDoCanPedSeePedCheck - if false CAN_PED_SEE_HATED_PED isn't done.
|
|
/// iFrameCounter_PedLastSeePlayer - the frame CAN_PED_SEE_PED last returned true for the pedIndex
|
|
/// bDoDistanceDetectionTestPlayerWalk - do ped distance check for player walking closeby
|
|
/// bDoDistanceDetectionTestPlayerRun - do ped distance check for player walking closeby
|
|
/// fSeeingRangeSmall - ped's small seeing range (for when player is in cover / using stealth)
|
|
/// fSeeingRangeStandard - ped's standard seeing range
|
|
/// bExitEarlyIfPlayerIsPerformingStealthKillOnPed - if TRUE, when the player is performing a stealth kill on sGardenerPed.pedIndex, the function will return FALSE regardless
|
|
/// RETURNS:
|
|
/// True if sGardenerPed.pedIndex can see the player
|
|
FUNC BOOL HAS_GARDENER_PED_DETECTED_THE_PLAYER(BOOL bDoCanPedSeePedCheck = TRUE, INT iFrameCounter_PedLastSeePlayer = 0, BOOL bDoDistanceDetectionTestPlayerWalk = TRUE, BOOL bDoDistanceDetectionTestPlayerRun = TRUE, BOOL bExitEarlyIfPlayerIsPerformingStealthKillOnPed = TRUE)
|
|
IF NOT IS_ENTITY_ALIVE(sGardenerPed.pedIndex)
|
|
RETURN FALSE
|
|
ENDIF
|
|
IF bExitEarlyIfPlayerIsPerformingStealthKillOnPed
|
|
IF IS_PED_BEING_STEALTH_KILLED(sGardenerPed.pedIndex)
|
|
IF IS_PED_PERFORMING_STEALTH_KILL(PLAYER_PED_ID())
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "HAS_GARDENER_PED_DETECTED_THE_PLAYER - RETURN FALSE - exit early as player is performing stealth kill") ENDIF #ENDIF
|
|
RETURN FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
//Check to see if the ped can see the player based off the set seeing and hearing ranges
|
|
IF bDoCanPedSeePedCheck
|
|
IF SET_PED_SEEING_AND_HEARING_RANGE_BASED_ON_PLAYER_MOVEMENT(sGardenerPed.pedIndex, FALSE) // update the ped's seeing and hearing range based off the players movement state
|
|
IF CAN_PED_SEE_HATED_PED(sGardenerPed.pedIndex, PLAYER_PED_ID())
|
|
#IF IS_DEBUG_BUILD DRAW_DEBUG_LINE(GET_ENTITY_COORDS(sGardenerPed.pedIndex), GET_ENTITY_COORDS(PLAYER_PED_ID()), 255, 0, 0) #ENDIF
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "HAS_GARDENER_PED_DETECTED_THE_PLAYER - PED SEES HATED PLAYER = TRUE at GET_GAME_TIMER() ", GET_GAME_TIMER()) ENDIF #ENDIF
|
|
// if the ped has seen the player with the last x amount of frames
|
|
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 IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "HAS_GARDENER_PED_DETECTED_THE_PLAYER - RETURN TRUE - PED SEES HATED PLAYER with iFrameCounter_PedLastSeePlayer at GET_FRAME_COUNT() ", GET_FRAME_COUNT()) ENDIF #ENDIF
|
|
//#IF IS_DEBUG_BUILD DRAW_RECT(0.3, 0.5, 0.2, 0.4, 0, 255, 0, 150) #ENDIF
|
|
#IF IS_DEBUG_BUILD IF bDebug_ToggleDoSpottedPlayerChecksPause SET_GAME_PAUSED(TRUE) ENDIF #ENDIF
|
|
RETURN TRUE
|
|
ELSE
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "HAS_GARDENER_PED_DETECTED_THE_PLAYER - RETURN FALSE - extra player clear sight check is FALSE : GAME TIME = ", GET_GAME_TIMER()) ENDIF #ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
IF bDoDistanceDetectionTestPlayerRun
|
|
IF ePlayerMovementState = N1B_PEDMOVEMENTSTATE_RUNNING
|
|
OR ePlayerMovementState = N1B_PEDMOVEMENTSTATE_SPRINTING
|
|
//detect the player regardless of seeing range if he's running close to the ped
|
|
IF IS_ENTITY_IN_RANGE_COORDS(sGardenerPed.pedIndex, vPlayerPos, NIGEL1B_PED_DETECTED_CLOSEBY_RUNNING_RANGE)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "HAS_GARDENER_PED_DETECTED_THE_PLAYER - RETURN TRUE - PLAYER CLOSE TO PED running / sprinting") ENDIF #ENDIF
|
|
#IF IS_DEBUG_BUILD IF bDebug_ToggleDoSpottedPlayerChecksPause SET_GAME_PAUSED(TRUE) ENDIF #ENDIF
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
IF bDoDistanceDetectionTestPlayerWalk
|
|
IF ePlayerMovementState = N1B_PEDMOVEMENTSTATE_WALKING
|
|
IF IS_ENTITY_IN_RANGE_COORDS(sGardenerPed.pedIndex, vPlayerPos, NIGEL1B_PED_DETECTED_CLOSEBY_WALKING_RANGE)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "HAS_GARDENER_PED_DETECTED_THE_PLAYER - RETURN TRUE - PLAYER CLOSE TO PED walking") ENDIF #ENDIF
|
|
#IF IS_DEBUG_BUILD IF bDebug_ToggleDoSpottedPlayerChecksPause SET_GAME_PAUSED(TRUE) ENDIF #ENDIF
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
IF IS_PED_BEING_STUNNED(sGardenerPed.pedIndex)
|
|
WEAPON_TYPE currentPlayerWeapon
|
|
GET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), currentPlayerWeapon)
|
|
IF currentPlayerWeapon = WEAPONTYPE_STUNGUN
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "HAS_GARDENER_PED_DETECTED_THE_PLAYER - RETURN TRUE - ped getting stunned by player") ENDIF #ENDIF
|
|
#IF IS_DEBUG_BUILD IF bDebug_ToggleDoSpottedPlayerChecksPause SET_GAME_PAUSED(TRUE) ENDIF #ENDIF
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
//automatically detect the player if he's touching the ped
|
|
IF IS_ENTITY_TOUCHING_ENTITY(sGardenerPed.pedIndex, PLAYER_PED_ID())
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "HAS_GARDENER_PED_DETECTED_THE_PLAYER - RETURN TRUE - Player touching PED") ENDIF #ENDIF
|
|
#IF IS_DEBUG_BUILD IF bDebug_ToggleDoSpottedPlayerChecksPause SET_GAME_PAUSED(TRUE) ENDIF #ENDIF
|
|
RETURN TRUE
|
|
ENDIF
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Check if the player is using stealth in the pool area, area checks
|
|
/// RETURNS:
|
|
/// True if the player isn't deemed as in stealth mode
|
|
FUNC BOOL IS_PLAYER_USING_STEALTH_IN_POOL_AREA()
|
|
IF IS_PLAYER_DRIVING_VEHICLE_IN_AREA_OF_PROPERTY(N1B_PLAYER_LOCATION_POOL_AREA)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_PLAYER_USING_STEALTH_IN_POOL_AREA - Player in a vehicle, in the pool area") ENDIF #ENDIF
|
|
RETURN FALSE
|
|
ENDIF
|
|
IF ePlayerLocation = N1B_PLAYER_LOCATION_POOL_AREA // ideally this will be outside of the player location check, but left here for now as you can be detected through the house bug
|
|
//Can set this up so it only checks one ped per frame
|
|
INT i
|
|
FOR i = 0 TO (TOTAL_POOL_PEDS - 1)
|
|
IF i = POOL_PED_FEMALE
|
|
//change the seeing distance for the girls in the HOT_TUB so the player can sneak around the back still
|
|
IF HAS_SPECIFIC_PED_DETECTED_THE_PLAYER(sPoolPed[POOL_PED_FEMALE].pedIndex, TRUE, TRUE, TRUE, TRUE) // 9.0, 10.0)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "PLAYER DETECTED, USING HAS_SPECIFIC_PED_DETECTED_THE_PLAYER id = ", i) ENDIF #ENDIF
|
|
iPedID_PoolPedWhoDetectedPlayer = POOL_PED_FEMALE //store ped ID who spotted the player, to play alternative dialogue.
|
|
RETURN FALSE
|
|
ENDIF
|
|
ELSE
|
|
IF HAS_SPECIFIC_PED_DETECTED_THE_PLAYER(sPoolPed[i].pedIndex, FALSE)
|
|
//ignore the detecting if the celeb is swimming with his head underwater
|
|
IF sPoolPed[i].AI = N1B_PED_AI_STATE_ROUTINE //only used by celeb in pool for now
|
|
OR sPoolPed[i].AI = N1B_PED_AI_CELEB_ONLY_SETUP_DO_FINAL_LENGTH //only used by celeb in pool for now
|
|
OR sPoolPed[i].AI = N1B_PED_AI_CELEB_ONLY_STATE_DO_FINAL_LENGTH //only used by celeb in pool for now
|
|
// if the player has jumped in the pool, we don't want to override the ped not spotting him
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), vPoolDimensionsMinPos, vPoolDimensionsMaxPos, fPoolDimensionsWidth) //inside the pool
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "PLAYER DETECTED, player is in the pool id = ", i) ENDIF #ENDIF
|
|
iPedID_PoolPedWhoDetectedPlayer = POOL_PED_CELEB //store ped ID who spotted the player, to play alternative dialogue.
|
|
RETURN FALSE
|
|
ENDIF
|
|
FLOAT fPedMovementRatio
|
|
fPedMovementRatio = GET_PED_DESIRED_MOVE_BLEND_RATIO(sPoolPed[i].pedIndex)
|
|
/*IF IS_PED_SWIMMING(sPoolPed[i].pedIndex)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "PLAYER DETECTED, ped swimming # 1 ") ENDIF #ENDIF
|
|
ENDIF
|
|
IF IS_ENTITY_IN_ANGLED_AREA(sPoolPed[i].pedIndex, <<-1054.633423,353.726318,67.444794>>, <<-1054.807007,370.001160,70.5>>, 5.500000) //inside the pool
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "PLAYER DETECTED, ped in pool # 2 ") ENDIF #ENDIF
|
|
ENDIF
|
|
IF IS_MOVE_BLEND_RATIO_SPRINTING(fPedMovementRatio)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "PLAYER DETECTED, ped is sprinting # 3 ") ENDIF #ENDIF
|
|
ENDIF
|
|
IF IS_MOVE_BLEND_RATIO_RUNNING(fPedMovementRatio)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "PLAYER DETECTED, ped is running # 3 ") ENDIF #ENDIF
|
|
ENDIF*/
|
|
IF IS_MOVE_BLEND_RATIO_SPRINTING(fPedMovementRatio)
|
|
OR IS_MOVE_BLEND_RATIO_RUNNING(fPedMovementRatio)
|
|
AND IS_PED_SWIMMING(sPoolPed[i].pedIndex)
|
|
AND IS_ENTITY_IN_ANGLED_AREA(sPoolPed[i].pedIndex, vPoolDimensionsMinPos, vPoolDimensionsMaxPos, fPoolDimensionsWidth) //inside the pool
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "PLAYER DETECTED, USING HAS_SPECIFIC_PED_DETECTED_THE_PLAYER id = ", i, "but ped was swimming head down") ENDIF #ENDIF
|
|
ELSE
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "PLAYER DETECTED, USING HAS_SPECIFIC_PED_DETECTED_THE_PLAYER id = ", i) ENDIF #ENDIF
|
|
iPedID_PoolPedWhoDetectedPlayer = POOL_PED_CELEB //store ped ID who spotted the player, to play alternative dialogue.
|
|
RETURN FALSE
|
|
ENDIF
|
|
ELSE
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "PLAYER DETECTED, USING HAS_SPECIFIC_PED_DETECTED_THE_PLAYER id = ", i) ENDIF #ENDIF
|
|
iPedID_PoolPedWhoDetectedPlayer = POOL_PED_CELEB //store ped ID who spotted the player, to play alternative dialogue.
|
|
RETURN FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDFOR
|
|
ENDIF
|
|
RETURN TRUE
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Requests the standard cop ped model and cop car model
|
|
PROC REQUEST_COP_ASSETS_FOR_APPLYING_WANTED_LEVEL()
|
|
REQUEST_MODEL(mnCopCar)
|
|
REQUEST_MODEL(mnCopPed)
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// checks if the standard cop ped model and cop car model have loaded
|
|
/// RETURNS:
|
|
/// TRUE if they have loaded
|
|
FUNC BOOL HAS_COP_ASSETS_LOADED_FOR_APPLYING_WANTED_LEVEL()
|
|
REQUEST_MODEL(mnCopCar)
|
|
REQUEST_MODEL(mnCopPed)
|
|
IF HAS_MODEL_LOADED(mnCopCar)
|
|
AND HAS_MODEL_LOADED(mnCopPed)
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "cop models - LOADED ") ENDIF #ENDIF
|
|
RETURN TRUE
|
|
ENDIF
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "waiting for asset to load - cop models ") ENDIF #ENDIF
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// creates a cop and cop car close to the player, First attempt spawn pos from behind, fall back attempt is spawn point in front
|
|
/// PARAMS:
|
|
/// vTempPlayerPos - the player's current position
|
|
/// fTempRangeBehindPlayer - spawn cops from behind this distance away
|
|
/// fTempRangeInFrontPlayer - spawn cops in front this distance away
|
|
/// RETURNS:
|
|
/// TRUE if cop was successful created in range of the player
|
|
FUNC BOOL CREATE_COP_IN_RANGE_OF_PLAYER(VECTOR vTempPlayerPos, FLOAT fTempRangeBehindPlayer = -40.00, FLOAT fTempRangeInFrontPlayer = 40.0)
|
|
BOOL bOkToSpawn
|
|
VECTOR vTempPlayerOffset
|
|
VECTOR vTempSpawnPoint
|
|
FLOAT fTempSpawnHeading
|
|
//attempt to spawn the cop car BEHIND the player
|
|
vTempPlayerOffset = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(PLAYER_PED_ID(), <<0.0, fTempRangeBehindPlayer, 0.0>>)
|
|
IF GET_NTH_CLOSEST_VEHICLE_NODE_FAVOUR_DIRECTION(vTempPlayerOffset, vTempPlayerPos, 0, vTempSpawnPoint, fTempSpawnHeading)
|
|
IF NOT IS_POINT_OBSCURED_BY_A_MISSION_ENTITY(vTempSpawnPoint, <<7.0, 7.0, 7.0>>)
|
|
IF WOULD_ENTITY_BE_OCCLUDED(mnCopCar, vTempSpawnPoint)
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CREATE COP: SUCCESSFUL SPAWN NODE FOUND BEHIND") ENDIF #ENDIF
|
|
bOkToSpawn = TRUE
|
|
ELSE
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CREATE COP: FAILED ENTITY WOULD BE OCCLUDED USING THE CURRENT NODE BEHIND") ENDIF #ENDIF
|
|
bOkToSpawn = FALSE
|
|
ENDIF
|
|
ELSE
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CREATE COP: FAILED DUE TO NODE POS OBSCURED BY MISSION ENTITY BEHIND" )#ENDIF
|
|
bOkToSpawn = FALSE
|
|
ENDIF
|
|
ELSE
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CREATE COP: FAILED TO FIND SUITABLE NODE BEHIND") ENDIF #ENDIF
|
|
bOkToSpawn = FALSE
|
|
ENDIF
|
|
IF NOT bOkToSpawn
|
|
//second attempt to spawn the cop car, this time IN FRONT of the player
|
|
vTempPlayerOffset = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(PLAYER_PED_ID(), <<0.0, fTempRangeInFrontPlayer, 0.0>>)
|
|
IF GET_NTH_CLOSEST_VEHICLE_NODE_FAVOUR_DIRECTION(vTempPlayerOffset, vTempPlayerPos, 0, vTempSpawnPoint, fTempSpawnHeading)
|
|
IF NOT IS_POINT_OBSCURED_BY_A_MISSION_ENTITY(vTempSpawnPoint, <<7.0, 7.0, 7.0>>)
|
|
IF WOULD_ENTITY_BE_OCCLUDED(mnCopCar, vTempSpawnPoint)
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CREATE COP: SUCCESSFUL SPAWN NODE FOUND IN FRONT") ENDIF #ENDIF
|
|
bOkToSpawn = TRUE
|
|
ELSE
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CREATE COP: FAILED ENTITY WOULD BE OCCLUDED USING THE CURRENT NODE IN FRONT") ENDIF #ENDIF
|
|
bOkToSpawn = FALSE
|
|
ENDIF
|
|
ELSE
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CREATE COP: FAILED DUE TO NODE POS OBSCURED BY MISSION ENTITY IN FRONT") ENDIF #ENDIF
|
|
bOkToSpawn = FALSE
|
|
ENDIF
|
|
ELSE
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CREATE COP: FAILED TO FIND SUITABLE NODE IN FRONT") ENDIF #ENDIF
|
|
bOkToSpawn = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
IF bOkToSpawn
|
|
VEHICLE_INDEX vehIndex
|
|
IF NOT DOES_ENTITY_EXIST(vehIndex)
|
|
vehIndex = CREATE_VEHICLE(mnCopCar, vTempSpawnPoint, fTempSpawnHeading)
|
|
ENDIF
|
|
IF IS_ENTITY_ALIVE(vehIndex)
|
|
PED_INDEX pedIndex1
|
|
IF NOT DOES_ENTITY_EXIST(pedIndex1)
|
|
pedIndex1 = CREATE_PED_INSIDE_VEHICLE(vehIndex, PEDTYPE_COP, mnCopPed, VS_DRIVER)
|
|
ENDIF
|
|
SET_SIREN_WITH_NO_DRIVER(vehIndex, TRUE)
|
|
SET_VEHICLE_SIREN(vehIndex, TRUE)
|
|
//match player's speed
|
|
FLOAT fTempSpeed = GET_ENTITY_SPEED(PLAYER_PED_ID())
|
|
IF fTempSpeed > 40.0
|
|
fTempSpeed = 40.0
|
|
ENDIF
|
|
SET_VEHICLE_FORWARD_SPEED(vehIndex, fTempSpeed)
|
|
IF IS_ENTITY_ALIVE(pedIndex1)
|
|
SET_PED_RANDOM_COMPONENT_VARIATION(pedIndex1)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedIndex1, FALSE)
|
|
GIVE_WEAPON_TO_PED(pedIndex1, WEAPONTYPE_PISTOL, INFINITE_AMMO, TRUE)
|
|
SET_CURRENT_PED_WEAPON(pedIndex1, WEAPONTYPE_PISTOL, TRUE)
|
|
SET_PED_AS_NO_LONGER_NEEDED(pedIndex1)
|
|
ENDIF
|
|
SET_VEHICLE_AS_NO_LONGER_NEEDED(vehIndex)
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CREATE COP: COPS CREATED ******** _______ ------ ******") ENDIF #ENDIF
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Creates celeb possession blips, sets blip colours and set's blip names for Map pause menu
|
|
PROC CREATE_CELEB_POSSESSION_BLIPS()
|
|
//Pickup_index setup
|
|
IF NOT DOES_BLIP_EXIST(mpClothesPickup.blipIndex)
|
|
IF DOES_PICKUP_EXIST(mpClothesPickup.index)
|
|
mpClothesPickup.blipIndex = CREATE_BLIP_FOR_PICKUP(mpClothesPickup.index)
|
|
ENDIF
|
|
ENDIF
|
|
IF DOES_BLIP_EXIST(mpClothesPickup.blipIndex)
|
|
//SET_BLIP_COLOUR(mpClothesPickup.blipIndex, BLIP_COLOUR_GREEN)
|
|
SET_BLIP_NAME_FROM_TEXT_FILE(mpClothesPickup.blipIndex, "NIG1B_CP_BLIP") // Clothes
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// trigger additional dialogue from the celeb and the female pool ped when player is hanging around
|
|
/// and has been noticed
|
|
/// RETURNS:
|
|
/// TRUE if dialogue was triggered
|
|
FUNC BOOL TRIGGER_ADDITIONAL_AMBIENT_LINES_FOR_TREVOR_HANGING_AROUND()
|
|
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
AND NOT IS_CONVERSATION_TRYING_TO_BE_RESTORED("NULL")
|
|
INT iRand = GET_RANDOM_INT_IN_RANGE(0, 2)
|
|
IF iRand = POOL_PED_CELEB
|
|
IF bDoneDialogue_PlayerGrabsClothes // different dialogue depending if player has been seen nicking the clothes or not
|
|
IF NIG1B_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG1BAU", "NIG1B_TAMB", CONV_PRIORITY_MEDIUM)
|
|
// Random selected lines -
|
|
// You're like the creepiest stalker ever.
|
|
// This is so unpleasant, man. Just give me my stuff back.
|
|
// Are you going to sell my underwear to a Japanese businessman?
|
|
// I hope you've got a really good lawyer.
|
|
// Two words for you - restraining order.
|
|
RETURN TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF NIG1B_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG1BAU", "NIG1B_TAMB2", CONV_PRIORITY_MEDIUM)
|
|
// Random selected lines -
|
|
// What are you doing in here, man?
|
|
// You're being a major buzzkill.
|
|
// Are you one of those dudes with a kid's brain?
|
|
// Who gave you this address?
|
|
// I've had obsessed fans before, but you're the weirdest.
|
|
// Did Cloe put you up to this?
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE // POOL_PED_FEMALE
|
|
IF bDoneDialogue_PlayerGrabsClothes // different dialogue depending if player has been seen nicking the clothes or not
|
|
IF NIG1B_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG1BAU", "NIG1B_GAMB", CONV_PRIORITY_MEDIUM)
|
|
// Random selected lines -
|
|
// Just take the clothes and go, please.
|
|
// What else do you want from us?
|
|
// I think I saw him sniff your boxers.
|
|
RETURN TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF NIG1B_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG1BAU", "NIG1B_GAMB2", CONV_PRIORITY_MEDIUM)
|
|
// Random selected lines -
|
|
// He looks like a crackhead.
|
|
// Is this a reality TV stunt? Am I on camera here?
|
|
// Tyler deserves privacy, just like everyone else!?
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// pool peds dialogue only
|
|
PROC MANAGE_ADDITIONAL_SURRENDERED_DIALOGUE()
|
|
|
|
IF IS_PED_UNINJURED(sPoolPed[POOL_PED_CELEB].pedIndex)
|
|
AND IS_PED_UNINJURED(sPoolPed[POOL_PED_FEMALE].pedIndex)
|
|
IF NOT IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING(tlDialogueRoot_PoolPedsCurrentReactionDialogue)
|
|
// player firing weapon dialogue
|
|
IF IS_PED_SHOOTING(PLAYER_PED_ID())
|
|
IF IS_BULLET_IN_AREA(GET_ENTITY_COORDS(sPoolPed[POOL_PED_CELEB].pedIndex), 3.0)
|
|
IF IS_PLAYER_CURRENT_WEAPON_LETHAL(FALSE, FALSE, TRUE)
|
|
// B*1511108 - try to ensure weapon is visible
|
|
AND (IS_PED_WEAPON_READY_TO_SHOOT(PLAYER_PED_ID())
|
|
OR IS_PED_RELOADING(PLAYER_PED_ID()))
|
|
IF NIG1B_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG1BAU", "NIG1B_TREACT", CONV_PRIORITY_MEDIUM)
|
|
// Random selected lines -
|
|
// Okay, okay, put the gun down.
|
|
// Okay, I get the message. You're a fucking lunatic.
|
|
// What are you even shooting at, you maniac?
|
|
tlDialogueRoot_PoolPedsCurrentReactionDialogue = "NIG1B_TREACT"
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_ADDITIONAL_SURRENDERED_DIALOGUE - triggered NIG1B_TREACT") ENDIF #ENDIF
|
|
EXIT
|
|
ENDIF
|
|
ELSE
|
|
IF NIG1B_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG1BAU", "NIG1B_TSHOCK", CONV_PRIORITY_MEDIUM)
|
|
// Random selected lines -
|
|
// Fuck me!
|
|
// This is insane!
|
|
// Oh, shit!
|
|
tlDialogueRoot_PoolPedsCurrentReactionDialogue = "NIG1B_TSHOCK"
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_ADDITIONAL_SURRENDERED_DIALOGUE - triggered NIG1B_TSHOCK") ENDIF #ENDIF
|
|
EXIT
|
|
ENDIF
|
|
ENDIF
|
|
ELIF IS_BULLET_IN_AREA(GET_ENTITY_COORDS(sPoolPed[POOL_PED_FEMALE].pedIndex), 3.0)
|
|
IF IS_PLAYER_CURRENT_WEAPON_LETHAL(FALSE, FALSE, TRUE)
|
|
// B*1511108 - try to ensure weapon is visible
|
|
OR (IS_PED_WEAPON_READY_TO_SHOOT(PLAYER_PED_ID())
|
|
AND IS_PED_RELOADING(PLAYER_PED_ID()))
|
|
IF NIG1B_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG1BAU", "NIG1B_GREACT", CONV_PRIORITY_MEDIUM)
|
|
// Random selected lines -
|
|
// Oh my God, he's going to kill us!
|
|
// He's shooting! Why aren't you protecting me?
|
|
// Oh shit, see now we've pissed him off!
|
|
tlDialogueRoot_PoolPedsCurrentReactionDialogue = "NIG1B_GREACT"
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_ADDITIONAL_SURRENDERED_DIALOGUE - triggered NIG1B_GREACT") ENDIF #ENDIF
|
|
EXIT
|
|
ENDIF
|
|
ELSE
|
|
IF NIG1B_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG1BAU", "NIG1B_GSHOCK", CONV_PRIORITY_MEDIUM)
|
|
// Random selected lines -
|
|
// Jesus Christ!
|
|
// No way!
|
|
// I can't handle this!
|
|
tlDialogueRoot_PoolPedsCurrentReactionDialogue = "NIG1B_GSHOCK"
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_ADDITIONAL_SURRENDERED_DIALOGUE - triggered NIG1B_GSHOCK") ENDIF #ENDIF
|
|
EXIT
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
// shooting whilst on in the pool area but not close to one of the pool peds
|
|
IF CAN_PED_SEE_HATED_PED(sPoolPed[POOL_PED_CELEB].pedIndex, PLAYER_PED_ID())
|
|
IF NIG1B_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG1BAU", "NIG1B_TSHOCK", CONV_PRIORITY_MEDIUM)
|
|
// Random selected lines -
|
|
// Fuck me!
|
|
// This is insane!
|
|
// Oh, shit!
|
|
tlDialogueRoot_PoolPedsCurrentReactionDialogue = "NIG1B_TSHOCK"
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_ADDITIONAL_SURRENDERED_DIALOGUE - triggered NIG1B_TSHOCK for seeing player in pool area") ENDIF #ENDIF
|
|
EXIT
|
|
ENDIF
|
|
ELIF CAN_PED_SEE_HATED_PED(sPoolPed[POOL_PED_FEMALE].pedIndex, PLAYER_PED_ID())
|
|
IF NIG1B_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG1BAU", "NIG1B_GSHOCK", CONV_PRIORITY_MEDIUM)
|
|
// Random selected lines -
|
|
// Jesus Christ!
|
|
// No way!
|
|
// I can't handle this!
|
|
tlDialogueRoot_PoolPedsCurrentReactionDialogue = "NIG1B_GSHOCK"
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_ADDITIONAL_SURRENDERED_DIALOGUE - triggered NIG1B_GSHOCK for seeing player in pool area") ENDIF #ENDIF
|
|
EXIT
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
// player targetting peds dialogue
|
|
ELIF IS_PLAYER_FREE_AIMING(PLAYER_ID())
|
|
OR IS_PLAYER_TARGETTING_ANYTHING(PLAYER_ID())
|
|
|
|
IF IS_PLAYER_FREE_AIMING_AT_ENTITY(PLAYER_ID(), sPoolPed[POOL_PED_CELEB].pedIndex)
|
|
OR IS_PLAYER_TARGETTING_ENTITY(PLAYER_ID(), sPoolPed[POOL_PED_CELEB].pedIndex)
|
|
IF CAN_PED_SEE_HATED_PED(sPoolPed[POOL_PED_CELEB].pedIndex, PLAYER_PED_ID())
|
|
IF NIG1B_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG1BAU", "NIG1B_TTARG", CONV_PRIORITY_MEDIUM)
|
|
// Random selected lines -
|
|
// Take what you want, man, it's not even my house.
|
|
// If you're going to violate me, just make it quick.
|
|
// Is this chick your daughter or something?
|
|
// I'm a good guy, don't believe all that stuff they write about me.
|
|
tlDialogueRoot_PoolPedsCurrentReactionDialogue = "NIG1B_TTARG"
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_ADDITIONAL_SURRENDERED_DIALOGUE - triggered NIG1B_TTARG") ENDIF #ENDIF
|
|
EXIT
|
|
ENDIF
|
|
ENDIF
|
|
ELIF IS_PLAYER_FREE_AIMING_AT_ENTITY(PLAYER_ID(), sPoolPed[POOL_PED_FEMALE].pedIndex)
|
|
OR IS_PLAYER_TARGETTING_ENTITY(PLAYER_ID(), sPoolPed[POOL_PED_FEMALE].pedIndex)
|
|
IF CAN_PED_SEE_HATED_PED(sPoolPed[POOL_PED_FEMALE].pedIndex, PLAYER_PED_ID())
|
|
IF NIG1B_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG1BAU", "NIG1B_GTARG", CONV_PRIORITY_MEDIUM)
|
|
// Random selected lines -
|
|
// Oh my God, please, I'm not even famous.
|
|
// He picked me up in a bar, I swear I don't even know him.
|
|
// No, what are you going to do to us?
|
|
tlDialogueRoot_PoolPedsCurrentReactionDialogue = "NIG1B_GTARG"
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_ADDITIONAL_SURRENDERED_DIALOGUE - triggered NIG1B_GTARG") ENDIF #ENDIF
|
|
EXIT
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF IS_ENTITY_TOUCHING_ENTITY(sPoolPed[POOL_PED_CELEB].pedIndex, PLAYER_PED_ID())
|
|
AND IS_PED_RAGDOLL(sPoolPed[POOL_PED_CELEB].pedIndex)
|
|
IF NIG1B_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG1BAU", "NIG1B_TBUMP", CONV_PRIORITY_MEDIUM)
|
|
// Random selected lines -
|
|
// Don't be a dick.
|
|
// This isn't funny.
|
|
// Don't touch me, man.
|
|
tlDialogueRoot_PoolPedsCurrentReactionDialogue = "NIG1B_TBUMP"
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_ADDITIONAL_SURRENDERED_DIALOGUE - triggered NIG1B_TBUMP") ENDIF #ENDIF
|
|
EXIT
|
|
ENDIF
|
|
ELIF IS_ENTITY_TOUCHING_ENTITY(sPoolPed[POOL_PED_FEMALE].pedIndex, PLAYER_PED_ID())
|
|
AND IS_PED_RAGDOLL(sPoolPed[POOL_PED_FEMALE].pedIndex)
|
|
IF NIG1B_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG1BAU", "NIG1B_GBUMP", CONV_PRIORITY_MEDIUM)
|
|
// Random selected lines -
|
|
// Ow, that hurt.
|
|
// Ty-Di, the hobo pushed me!
|
|
// He tried to feel my tits!
|
|
tlDialogueRoot_PoolPedsCurrentReactionDialogue = "NIG1B_GBUMP"
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_ADDITIONAL_SURRENDERED_DIALOGUE - triggered NIG1B_GBUMP") ENDIF #ENDIF
|
|
EXIT
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
AND NOT IS_CONVERSATION_TRYING_TO_BE_RESTORED("NULL")
|
|
iTimer_DelayAdditionalSurrenderedDialogue = GET_GAME_TIMER()
|
|
ELSE
|
|
IF HAS_TIME_PASSED(iTimer_DelayAdditionalSurrenderedDialogue, GET_RANDOM_INT_IN_RANGE(2000, 4000))
|
|
//IF NOT IS_THIS_PRINT_BEING_DISPLAYED("NIG1B_OBJ_03") // Leave the area.~s~ //*commented out for new display message check with subtitle profile settings
|
|
//AND NOT IS_THIS_PRINT_BEING_DISPLAYED("NIG1B_OBJ_04") // Lose the cops. //*commented out for new display message check with subtitle profile settings
|
|
IF ePlayerLocation = N1B_PLAYER_LOCATION_POOL_AREA
|
|
SWITCH iAdditionalSurrenderedDialoguePool_Counter
|
|
CASE 0
|
|
IF IS_PLAYER_CURRENT_WEAPON_LETHAL(FALSE, FALSE, TRUE)
|
|
AND NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
IF NIG1B_PLAY_SINGLE_LINE_FROM_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG1BAU", "NIG1B_SU1", "NIG1B_SU1_1", CONV_PRIORITY_MEDIUM) //, DO_NOT_DISPLAY_SUBTITLES)
|
|
//Come on man, just put the gun down.
|
|
iTimer_DelayAdditionalSurrenderedDialogue = GET_GAME_TIMER()
|
|
iAdditionalSurrenderedDialoguePool_Counter++
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "INSIDE ADDITIONAL SURRENDER DIALOGUE- ", iAdditionalBrawlingDialoguePool_Counter) ENDIF #ENDIF
|
|
ENDIF
|
|
ELSE
|
|
iAdditionalSurrenderedDialoguePool_Counter++
|
|
ENDIF
|
|
BREAK
|
|
CASE 1
|
|
IF NIG1B_PLAY_SINGLE_LINE_FROM_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG1BAU", "NIG1B_SU1", "NIG1B_SU1_2", CONV_PRIORITY_MEDIUM) //, DO_NOT_DISPLAY_SUBTITLES)
|
|
// Am I getting punked here? Don't screw with me.
|
|
iTimer_DelayAdditionalSurrenderedDialogue = GET_GAME_TIMER()
|
|
iAdditionalSurrenderedDialoguePool_Counter++
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "INSIDE ADDITIONAL SURRENDER DIALOGUE- ", iAdditionalBrawlingDialoguePool_Counter) ENDIF #ENDIF
|
|
ENDIF
|
|
BREAK
|
|
CASE 2
|
|
IF NIG1B_PLAY_SINGLE_LINE_FROM_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG1BAU", "NIG1B_SU1", "NIG1B_SU1_3", CONV_PRIORITY_MEDIUM) //, DO_NOT_DISPLAY_SUBTITLES)
|
|
// Tyler, he's scaring me!
|
|
iTimer_DelayAdditionalSurrenderedDialogue = GET_GAME_TIMER()
|
|
iAdditionalSurrenderedDialoguePool_Counter++
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "INSIDE ADDITIONAL SURRENDER DIALOGUE- ", iAdditionalBrawlingDialoguePool_Counter) ENDIF #ENDIF
|
|
ENDIF
|
|
BREAK
|
|
DEFAULT
|
|
IF TRIGGER_ADDITIONAL_AMBIENT_LINES_FOR_TREVOR_HANGING_AROUND()
|
|
iTimer_DelayAdditionalSurrenderedDialogue = GET_GAME_TIMER()
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "INSIDE ADDITIONAL SURRENDER DIALOGUE- TRIGGER_ADDITIONAL_AMBIENT_LINES_FOR_TREVOR_HANGING_AROUND done : timer = ", iTimer_DelayAdditionalSurrenderedDialogue) ENDIF #ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
//ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Set the current pool area's state, along with the pool ped's relevant AI state.
|
|
/// PARAMS:
|
|
/// eNewState - The new state
|
|
/// bSetRelevantAIState_ForPoolPeds - If TRUE the ped's AI will be updated to the relevant state
|
|
PROC SET_POOL_AREA_STATE(N1B_POOL_AREA_STATE eNewState, BOOL bSetRelevantAIState_ForPoolPeds = TRUE)
|
|
ePoolAreaState = eNewState
|
|
IF bSetRelevantAIState_ForPoolPeds
|
|
INT i
|
|
FOR i = 0 TO (TOTAL_POOL_PEDS - 1)
|
|
SWITCH ePoolAreaState
|
|
CASE N1B_POOL_AREA_STATE_UNDETECTED
|
|
sPoolPed[i].AI = N1B_PED_AI_STATE_RELAXED
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_POOL_AREA_STATE - set ped AI (ID = ", i, ") for N1B_POOL_AREA_STATE_UNDETECTED") ENDIF #ENDIF
|
|
BREAK
|
|
CASE N1B_POOL_AREA_STATE_CELEB_LOOKING_FOR_CLOTHES
|
|
//IF i = POOL_PED_CELEB
|
|
// sPoolPed[POOL_PED_CELEB].AI = N1B_PED_AI_CELEB_ONLY_SETUP_GET_OUT_POOL_FOR_CLOTHES
|
|
//ELSE
|
|
// sPoolPed[i].AI = N1B_PED_AI_STATE_RELAXED
|
|
//ENDIF
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_POOL_AREA_STATE - set ped AI (ID = ", i, ") for N1B_POOL_AREA_STATE_CELEB_LOOKING_FOR_CLOTHES") ENDIF #ENDIF
|
|
BREAK
|
|
CASE N1B_POOL_AREA_STATE_GARDENER_INTERRUPTED
|
|
sPoolPed[i].AI = N1B_PED_AI_SETUP_AWARE_OF_GARDENER
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_POOL_AREA_STATE - set ped AI (ID = ", i, ") for N1B_POOL_AREA_STATE_GARDENER_INTERRUPTED") ENDIF #ENDIF
|
|
BREAK
|
|
CASE N1B_POOL_AREA_STATE_SPOTTED
|
|
sPoolPed[i].AI = N1B_PED_AI_SETUP_AWARE_OF_PLAYER
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_POOL_AREA_STATE - set ped AI (ID = ", i, ") for N1B_POOL_AREA_STATE_SPOTTED") ENDIF #ENDIF
|
|
BREAK
|
|
CASE N1B_POOL_AREA_STATE_CALL_COPS
|
|
IF i = POOL_PED_CELEB
|
|
sPoolPed[i].AI = N1B_PED_AI_CELEB_ONLY_SETUP_GET_TO_POS_FOR_CALL_THE_COPS
|
|
ELSE
|
|
sPoolPed[i].AI = N1B_PED_AI_SETUP_AWARE_OF_PLAYER
|
|
ENDIF
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_POOL_AREA_STATE - set ped AI (ID = ", i, ") for N1B_POOL_AREA_STATE_CALL_COPS") ENDIF #ENDIF
|
|
BREAK
|
|
CASE N1B_POOL_AREA_STATE_SURRENDERED
|
|
IF sPoolPed[i].AI <> N1B_PED_AI_SETUP_BEATEN_UP
|
|
OR sPoolPed[i].AI <> N1B_PED_AI_STATE_BEATEN_UP
|
|
sPoolPed[i].AI = N1B_PED_AI_SETUP_SURRENDERED
|
|
// reset the last damaged entity so we can test for the player hurting them whilst they are surrendered.
|
|
IF IS_ENTITY_ALIVE(sPoolPed[i].pedIndex)
|
|
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(sPoolPed[i].pedIndex)
|
|
ENDIF
|
|
ENDIF
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_POOL_AREA_STATE - set ped AI (ID = ", i, ") for N1B_POOL_AREA_STATE_SURRENDERED") ENDIF #ENDIF
|
|
BREAK
|
|
CASE N1B_POOL_AREA_STATE_FLEE
|
|
sPoolPed[i].AI = N1B_PED_AI_SETUP_FLEE_WITH_REACT
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_POOL_AREA_STATE - set ped AI (ID = ", i, ") for N1B_POOL_AREA_STATE_FLEE") ENDIF #ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDFOR
|
|
ENDIF
|
|
IF ePoolAreaState = N1B_POOL_AREA_STATE_SURRENDERED
|
|
iTimer_DelayPoolPedsFleeWhenSurrendered = GET_GAME_TIMER() // Set timer ready for peds to flee when the player leaves the area
|
|
ELIF ePoolAreaState = N1B_POOL_AREA_STATE_GARDENER_INTERRUPTED
|
|
OR ePoolAreaState = N1B_POOL_AREA_STATE_CALL_COPS
|
|
iTimer_PoolPedsTo_CallCops = GET_GAME_TIMER() //used in these state to countdown till cops should be called.
|
|
ELIF ePoolAreaState = N1B_POOL_AREA_STATE_FLEE
|
|
// If player has made the pool peds flee, force the big gates open and the side gate, so they can use alternative flee routes bug fix B*1129401, also done if player is wanted on property
|
|
IF NOT bForceHouseGatesOpenDuringGameplay
|
|
SET_HOUSE_DOUBLE_GATES_LOCKED_STATE(FALSE)
|
|
// open the side gate too
|
|
SET_MISSION_CONTROLLED_DOOR_OPEN_RATIO(N1B_MCD_WEST_GATE_01, DOOR_SYSTEM_GET_OPEN_RATIO(iMissionControlledDoors[N1B_MCD_WEST_GATE_01]), FALSE, FALSE)
|
|
SET_MISSION_CONTROLLED_DOOR_STATE(N1B_MCD_WEST_GATE_01, DOORSTATE_UNLOCKED)
|
|
bHaveNorthGatesBeenOpenedByPlayer = TRUE
|
|
bHaveSouthGatesBeenOpenedByPlayer = TRUE
|
|
bForceHouseGatesOpenDuringGameplay = TRUE
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CHECK_AND_UPDATE_PLAYER_WANTED_LEVEL - bForceHouseGatesOpenDuringGameplay set TRUE") ENDIF #ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Manages the players actions around the pool area
|
|
PROC MANAGE_POOL_AREA_STATE()
|
|
INT i
|
|
TEXT_LABEL_23 tlTempRoot
|
|
FOR i = 0 TO (TOTAL_POOL_PEDS - 1)
|
|
UPDATE_PEDS_CAN_SEE_PLAYER_FRAME_COUNTER(sPoolPed[i].pedIndex, sPoolPed[i].iFrameCountLastSeenPlayer)
|
|
ENDFOR
|
|
IF ePoolAreaState <> N1B_POOL_AREA_STATE_FLEE
|
|
IF HAVE_ANY_POOL_PEDS_DIED_OR_INJURED_STATE()
|
|
SET_POOL_AREA_STATE(N1B_POOL_AREA_STATE_FLEE, TRUE)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_POOL_AREA_STATE - going to N1B_POOL_AREA_STATE_FLEE") ENDIF #ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
SWITCH ePoolAreaState
|
|
// ------------------------------------------
|
|
CASE N1B_POOL_AREA_STATE_UNDETECTED
|
|
//jump to gardener interrupted if he's made it into the pool area alive
|
|
IF eGardenAreaState = N1B_GARDEN_AREA_STATE_INFORM_POOL_AREA
|
|
AND IS_PED_UNINJURED(sGardenerPed.pedIndex)
|
|
AND IS_PED_IN_POOL_AREA(sGardenerPed.pedIndex, TRUE)
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_POOL_AREA_STATE - N1B_POOL_AREA_STATE_CELEB_LOOKING_FOR_CLOTHES from N1B_POOL_AREA_STATE_GARDENER_INTERRUPTED") ENDIF #ENDIF
|
|
iTimer_PoolPedsTo_CallCops = GET_GAME_TIMER() //used in next state to countdown till cops should be called.
|
|
SET_POOL_AREA_STATE(N1B_POOL_AREA_STATE_GARDENER_INTERRUPTED)
|
|
ELSE
|
|
UPDATE_CELEB_IN_POOL_INITIAL_POSITION_BASED_OF_PLAYERS_APPROACH()
|
|
IF ePlayerLocation = N1B_PLAYER_LOCATION_POOL_AREA
|
|
IF NOT bDoneDialoguePool_InitialExchange
|
|
IF sPoolPed[POOL_PED_CELEB].AI <> N1B_PED_AI_STATE_RELAXED // wait untill the celeb in the pool has started swimming lengths
|
|
IF NIG1B_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG1BAU", "NIG1B_P0", CONV_PRIORITY_MEDIUM)
|
|
// Come on, get in the hot tub with me!
|
|
// I'm bored, I think that pill you gave me is wearing off.
|
|
// I've been watching you do laps for like two hours now.
|
|
// Okay, baby, just one more.
|
|
REPLAY_RECORD_BACK_FOR_TIME(4.0, 4.0, REPLAY_IMPORTANCE_LOWEST)
|
|
bDoneDialoguePool_InitialExchange = TRUE
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_POOL_AREA_STATE - bDoneDialoguePool_InitialExchange done") ENDIF #ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELIF sPoolPed[POOL_PED_CELEB].AI = N1B_PED_AI_STATE_ROUTINE_COMPLETED
|
|
IF NOT IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("NIG1B_P0") //initial dialogue
|
|
sPoolPed[POOL_PED_CELEB].AI = N1B_PED_AI_CELEB_ONLY_SETUP_DO_FINAL_LENGTH
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_POOL_AREA_STATE - set sPoolPed[POOL_PED_CELEB].AI = N1B_PED_AI_CELEB_ONLY_SETUP_DO_FINAL_LENGTH") ENDIF #ENDIF
|
|
ENDIF
|
|
ELIF sPoolPed[POOL_PED_CELEB].AI = N1B_PED_AI_CELEB_ONLY_STATE_LEFT_POOL_COMPLETED
|
|
IF NIG1B_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG1BAU", "NIG1B_P1", CONV_PRIORITY_MEDIUM)
|
|
// That had to be a four-digit calorie burn.
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_POOL_AREA_STATE - set sPoolPed[POOL_PED_CELEB].AI = N1B_PED_AI_CELEB_ONLY_SETUP_POSE") ENDIF #ENDIF
|
|
sPoolPed[POOL_PED_CELEB].AI = N1B_PED_AI_CELEB_ONLY_SETUP_POSE
|
|
ENDIF
|
|
ELIF NOT bDoneDialoguePool_CelebPoses
|
|
IF sPoolPed[POOL_PED_CELEB].AI = N1B_PED_AI_CELEB_ONLY_STATE_POSE
|
|
IF NOT IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("NIG1B_P1") //go out pool dialogue
|
|
IF NIG1B_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG1BAU", "NIG1B_P2", CONV_PRIORITY_MEDIUM)
|
|
// Really even definition.
|
|
// It's like I'm airbrushed but I'm not.
|
|
// How do you like me now, Cloe?
|
|
// I'm not kidding, this might be the best I've ever looked.
|
|
// Hurry up, Ty-Di, I'm lonely in here.
|
|
// Okay, I'm coming. Poppa needs some sugar after all that cardio.
|
|
bDoneDialoguePool_CelebPoses = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELIF sPoolPed[POOL_PED_CELEB].AI = N1B_PED_AI_CELEB_ONLY_STATE_POSE_COMPLETED
|
|
OR sPoolPed[POOL_PED_CELEB].AI = N1B_PED_AI_CELEB_ONLY_STATE_POSE
|
|
IF NOT IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("NIG1B_P2") //pose dialogue
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_POOL_AREA_STATE - set sPoolPed[POOL_PED_CELEB].AI = N1B_PED_AI_CELEB_ONLY_SETUP_GOTO_HOT_TUB") ENDIF #ENDIF
|
|
sPoolPed[POOL_PED_CELEB].AI = N1B_PED_AI_CELEB_ONLY_SETUP_GOTO_HOT_TUB
|
|
ENDIF
|
|
ELIF NOT bDoneDialoguePool_CelebInTheHotTub
|
|
IF sPoolPed[POOL_PED_CELEB].AI = N1B_PED_AI_CELEB_ONLY_STATE_ENTER_HOT_TUB_ANIM
|
|
OR sPoolPed[POOL_PED_CELEB].AI = N1B_PED_AI_CELEB_ONLY_SETUP_DANCE_IN_HOT_TUB
|
|
OR sPoolPed[POOL_PED_CELEB].AI = N1B_PED_AI_CELEB_ONLY_STATE_DANCE_IN_HOT_TUB
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
AND NOT IS_CONVERSATION_TRYING_TO_BE_RESTORED("NULL")
|
|
IF bPauseDialoguePool_CelebInTheHotTub // restart convo from last line
|
|
IF NIG1B_CREATE_CONVERSATION_FROM_SPECIFIC_LINE_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG1BAU", "NIG1B_P3", tlPausedDialogue_CelebInTheHotTub, CONV_PRIORITY_MEDIUM, DO_NOT_DISPLAY_SUBTITLES)
|
|
bPauseDialoguePool_CelebInTheHotTub = FALSE
|
|
bDoneDialoguePool_CelebInTheHotTub = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF NIG1B_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG1BAU", "NIG1B_P3", CONV_PRIORITY_MEDIUM)
|
|
// Do you want me to dance for you, baby?
|
|
// Ooh yeah, show me some of those backing dancer moves.
|
|
// I can back it up all day.
|
|
// My glutes feel like granite.
|
|
// I can't believe how fat I got for a while.
|
|
// Check it out! I call this one the bikini dropper.
|
|
// You likey, girl whose name I don't remember?
|
|
// You're terrible! It's Kathi.
|
|
// With an I or Y?
|
|
// An I.
|
|
// Trashy, I love it
|
|
// This house is amazing.
|
|
// Divorce, best thing that ever happened to me.
|
|
// The rhythm, baby, you gotta tame it.
|
|
// Are you still dancing professionally?
|
|
// I'm focusing more on my reality work at the moment.
|
|
// Ooh, there it is, spank it, bank it.
|
|
// Woo, yeah, it's getting hot in here!
|
|
// You want me to tell you a secret, baby?
|
|
// That last jet... wasn't from the hot tub.
|
|
// Ew, that's gross!
|
|
// You can't stop the funk. For real.
|
|
bDoneDialoguePool_CelebInTheHotTub = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELIF NOT bDoneDialoguePool_CelebInTheHotTubRunOutOfLines
|
|
IF NOT IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("NIG1B_P3") // N1B_PED_AI_CELEB_ONLY_STATE_DANCE_IN_HOT_TUB dialogue
|
|
IF NIG1B_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG1BAU", "NIG1B_IDLE", CONV_PRIORITY_MEDIUM)
|
|
// I can't believe I'm in a hot tub with Cloe Parker's ex!
|
|
// Ssh. Just enjoy me. Feel the chemistry. Save the talk for the cocaine later.
|
|
iTimer_PoolStateTo_CelebLookingForClothes = GET_GAME_TIMER()
|
|
bDoneDialoguePool_CelebInTheHotTubRunOutOfLines = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("NIG1B_IDLE")
|
|
//switch pool state to N1B_POOL_AREA_STATE_CELEB_LOOKING_FOR_CLOTHES after period of time, if the player is hanging around after getting the clothes
|
|
//bDoSwitch_PoolStateTo_CelebLookingForClothes and iTimer_PoolStateTo_CelebLookingForClothes are set in STAGE_STEAL_CELEB_POSSESSIONS
|
|
//when the player gets the clothes
|
|
IF bDoSwitch_PoolStateTo_CelebLookingForClothes
|
|
IF HAS_TIME_PASSED(iTimer_PoolStateTo_CelebLookingForClothes, NIGEL1B_TIMER_TILL_CELEB_LEAVES_POOL)
|
|
//IF SET_CELEB_TO_STOP_DANCING_FOR_CLOTHES_SEARCH()
|
|
// SET_POOL_AREA_STATE(N1B_POOL_AREA_STATE_CELEB_LOOKING_FOR_CLOTHES, FALSE)
|
|
// #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_POOL_AREA_STATE - going to N1B_POOL_AREA_STATE_CELEB_LOOKING_FOR_CLOTHES") ENDIF #ENDIF
|
|
// EXIT
|
|
//ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
iTimer_PoolStateTo_CelebLookingForClothes = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
// stop the pool area dialogue if the player leaves
|
|
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
AND NOT IS_CONVERSATION_TRYING_TO_BE_RESTORED("NULL")
|
|
tlTempRoot = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_ROOT()
|
|
IF ARE_STRINGS_EQUAL(tlTempRoot, "NIG1B_P0") // bDoneDialoguePool_InitialExchange
|
|
OR ARE_STRINGS_EQUAL(tlTempRoot, "NIG1B_P1") // N1B_PED_AI_CELEB_ONLY_STATE_LEFT_POOL_COMPLETED
|
|
OR ARE_STRINGS_EQUAL(tlTempRoot, "NIG1B_P2") // N1B_PED_AI_CELEB_ONLY_STATE_POSE
|
|
OR ARE_STRINGS_EQUAL(tlTempRoot, "NIG1B_P3") // N1B_PED_AI_CELEB_ONLY_STATE_DANCE_IN_HOT_TUB
|
|
OR ARE_STRINGS_EQUAL(tlTempRoot, "NIG1B_IDLE") // They run out of lines for the dancing idle
|
|
N1B_KILL_CURRENT_CONVERSATION(TRUE)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_POOL_AREA_STATE - killed pool convo as player left area") ENDIF #ENDIF
|
|
ELIF ARE_STRINGS_EQUAL(tlTempRoot, "NIG1B_P3") // bDoneDialoguePool_CelebInTheHotTub
|
|
// Bug fix - could return dialogue as playing in first frame even though the line is invalid, so wait for line to be valid
|
|
TEXT_LABEL_23 tl23CurrentDialogueLine
|
|
tl23CurrentDialogueLine = GET_STANDARD_CONVERSATION_LABEL_FOR_FUTURE_RESUMPTION()
|
|
IF NOT IS_STRING_NULL_OR_EMPTY(tl23CurrentDialogueLine)
|
|
bPauseDialoguePool_CelebInTheHotTub = TRUE
|
|
bDoneDialoguePool_CelebInTheHotTub = FALSE
|
|
tlPausedDialogue_CelebInTheHotTub = tl23CurrentDialogueLine
|
|
N1B_KILL_CURRENT_CONVERSATION(TRUE)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_POOL_AREA_STATE - paused hot tub convo as player left area") ENDIF #ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
IF NOT IS_PLAYER_USING_STEALTH_IN_POOL_AREA()
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_POOL_AREA_STATE - POOL PEDS DETECTED THE PLAYER") ENDIF #ENDIF
|
|
SET_POOL_AREA_STATE(N1B_POOL_AREA_STATE_SPOTTED)
|
|
ENDIF
|
|
ENDIF
|
|
//Go straight to surrendered state if the player has intimidated a pool ped
|
|
IF IS_PLAYER_FIRING_LETHAL_WEAPON_ON_PROPERTY()
|
|
OR IS_PLAYER_INTIMIDATING_POOL_PEDS()
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_POOL_AREA_STATE - POOL PEDS TO SURRENDERED FROM N1B_POOL_AREA_STATE_SPOTTED") ENDIF #ENDIF
|
|
SET_POOL_AREA_STATE(N1B_POOL_AREA_STATE_SURRENDERED)
|
|
ENDIF
|
|
BREAK
|
|
// ------------------------------------------
|
|
CASE N1B_POOL_AREA_STATE_CELEB_LOOKING_FOR_CLOTHES
|
|
//jump to gardener interrupted if he's made it into the pool area alive
|
|
IF eGardenAreaState = N1B_GARDEN_AREA_STATE_INFORM_POOL_AREA
|
|
AND IS_PED_UNINJURED(sGardenerPed.pedIndex)
|
|
AND IS_PED_IN_POOL_AREA(sGardenerPed.pedIndex, TRUE)
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_POOL_AREA_STATE - N1B_POOL_AREA_STATE_CELEB_LOOKING_FOR_CLOTHES from N1B_POOL_AREA_STATE_GARDENER_INTERRUPTED") ENDIF #ENDIF
|
|
SET_POOL_AREA_STATE(N1B_POOL_AREA_STATE_GARDENER_INTERRUPTED)
|
|
ELSE
|
|
IF ePlayerLocation = N1B_PLAYER_LOCATION_POOL_AREA
|
|
//setup celeb leave pool dialogue to trigger
|
|
IF NOT bDoneDialoguePool_CelebGetsOutPool
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "Not done get out pool dialogue yet") ENDIF #ENDIF
|
|
N1B_KILL_CURRENT_CONVERSATION(TRUE)
|
|
NIG1B_STOP_CHECKING_CONVERSATION_AND_OBJECTIVE_TEXT_CONFLICT(tSavedConversationRoot, tSavedConversationLabel)
|
|
IF NIG1B_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG1BAU", "NIG1B_CPT", CONV_PRIORITY_MEDIUM) //, DO_NOT_DISPLAY_SUBTITLES)
|
|
// Hey, where are you going?
|
|
// I need a cigarette.
|
|
bDoneDialoguePool_CelebGetsOutPool = TRUE
|
|
ENDIF
|
|
ELSE
|
|
//bHasCelebReachedClothesLocation gets set in CONTROL_POOL_PEDS_AI() for the celeb, when he's reached the clothes
|
|
IF bHasCelebReachedClothesLocation
|
|
IF NOT bDoneDialoguePool_CelebSeesClothesAreMissing
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "Not done clothes are missing dialogue yet") ENDIF #ENDIF
|
|
N1B_KILL_CURRENT_CONVERSATION(FALSE)
|
|
IF NIG1B_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG1BAU", "NIG1B_CSC", CONV_PRIORITY_MEDIUM) //, DO_NOT_DISPLAY_SUBTITLES)
|
|
// Hey, where the fuck did my clothes go?
|
|
// Weird, they must be around here somewhere.
|
|
bDoneDialoguePool_CelebSeesClothesAreMissing = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
AND NOT IS_CONVERSATION_TRYING_TO_BE_RESTORED("NULL")
|
|
IF sPoolPed[POOL_PED_CELEB].AI = N1B_PED_AI_CELEB_ONLY_SETUP_GET_OUT_POOL_FOR_CLOTHES
|
|
OR sPoolPed[POOL_PED_CELEB].AI = N1B_PED_AI_CELEB_ONLY_STATE_GET_OUT_POOL_FOR_CLOTHES
|
|
sPoolPed[POOL_PED_CELEB].AI = N1B_PED_AI_CELEB_ONLY_SETUP_SEARCH_FOR_CLOTHES
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_POOL_AREA_STATE - Finished WHERE are clothes dialogue going to N1B_PED_AI_CELEB_ONLY_SETUP_SEARCH_FOR_CLOTHES ID =", i) ENDIF #ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
IF NOT IS_PLAYER_USING_STEALTH_IN_POOL_AREA()
|
|
SET_POOL_AREA_STATE(N1B_POOL_AREA_STATE_SPOTTED)
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_POOL_AREA_STATE - POOL PEDS DETECTED THE PLAYER") ENDIF #ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
//Go straight to surrendered state if the player has intimidated a pool ped
|
|
IF IS_PLAYER_FIRING_LETHAL_WEAPON_ON_PROPERTY()
|
|
OR IS_PLAYER_INTIMIDATING_POOL_PEDS()
|
|
SET_POOL_AREA_STATE(N1B_POOL_AREA_STATE_SURRENDERED)
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_POOL_AREA_STATE - POOL PEDS TO SURRENDERED FROM N1B_POOL_AREA_STATE_SPOTTED") ENDIF #ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
// ------------------------------------------
|
|
CASE N1B_POOL_AREA_STATE_GARDENER_INTERRUPTED
|
|
//to get here eGardenAreaState = N1B_GARDEN_AREA_STATE_INFORM_POOL_AREA and
|
|
//the gardener had to be in the pool area.
|
|
IF ePlayerLocation = N1B_PLAYER_LOCATION_POOL_AREA
|
|
IF NOT bDoneDialogue_PlayerGrabsClothes //don't do any of this dialogue if the player has just been seen stealing the clothes
|
|
//Play the player seen stealing the clothes dialogue (if seen doing so at this point)
|
|
//this can override the gardener informing the pool peds dialogue
|
|
IF NOT HAS_TIME_PASSED(iTimer_TimeWindowForSpottedStealingClothesDialogue, 2000) //this gets set when the clothes pickup has been collected
|
|
IF HAS_TIME_PASSED(iTimer_TimeWindowForSpottedStealingClothesDialogue, 500) //half second delay so it's not instant also doesn't conflict with restore convo
|
|
N1B_KILL_CURRENT_CONVERSATION(FALSE)
|
|
//IF NOT IS_THIS_PRINT_BEING_DISPLAYED("NIG1B_OBJ_03") // Leave the area.~s~ //*commented out for new display message check with subtitle profile settings
|
|
IF NIG1B_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG1BAU", "NIG1B_PUP", CONV_PRIORITY_MEDIUM) //, DO_NOT_DISPLAY_SUBTITLES)
|
|
// Hey, he just took my clothes!
|
|
bDoneDialogue_PlayerGrabsClothes = TRUE
|
|
iTimer_TimeWindowForSpottedStealingClothesDialogue = 0
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_POOL_AREA_STATE - N1B_POOL_AREA_STATE_GARDENER_INTERRUPTED - player seen stealing clothes dialogue") ENDIF #ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
//Dialogue exchange where gardener informs pool peds that player is on property
|
|
IF eGardenAreaState = N1B_GARDEN_AREA_STATE_INFORM_POOL_AREA
|
|
AND IS_PED_UNINJURED(sGardenerPed.pedIndex)
|
|
AND IS_PED_IN_POOL_AREA(sGardenerPed.pedIndex, TRUE)
|
|
IF NOT bDoneDialogueGardener_InformsPoolPeds
|
|
N1B_KILL_CURRENT_CONVERSATION(FALSE)
|
|
IF NIG1B_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG1BAU", "NIG1B_GIC", CONV_PRIORITY_MEDIUM) //, DO_NOT_DISPLAY_SUBTITLES)
|
|
// Senor Dixon! Senor Dixon!
|
|
// We have intruder!
|
|
iTimer_PoolPedsTo_CallCops = GET_GAME_TIMER() //Reset this time used in next state to countdown till cops should be called.
|
|
bDoneDialogueGardener_InformsPoolPeds = TRUE
|
|
ENDIF
|
|
ELIF NOT bDoneDialoguePool_Spotted
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
AND NOT IS_CONVERSATION_TRYING_TO_BE_RESTORED("NULL")
|
|
bDoneDialoguePool_Spotted = NIG1B_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG1BAU", "NIG1B_SPO", CONV_PRIORITY_MEDIUM) //, DO_NOT_DISPLAY_SUBTITLES)
|
|
//What the fuck are you doing here?
|
|
bDoneDialoguePool_Spotted = TRUE
|
|
ENDIF
|
|
ELIF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
AND NOT IS_CONVERSATION_TRYING_TO_BE_RESTORED("NULL")
|
|
SET_POOL_AREA_STATE(N1B_POOL_AREA_STATE_CALL_COPS)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_POOL_AREA_STATE - POOL PEDS TO CALL COPS, from N1B_PLAYER_LOCATION_POOL_AREA finished gardener telling them") ENDIF #ENDIF
|
|
EXIT
|
|
ENDIF
|
|
ELSE
|
|
//Something else went wrong..gardener is no longer in the pool area?
|
|
SET_POOL_AREA_STATE(N1B_POOL_AREA_STATE_SPOTTED, FALSE)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_POOL_AREA_STATE - N1B_POOL_AREA_STATE_GARDENER_INTERRUPTED going to N1B_POOL_AREA_STATE_SPOTTED gardener no longer in the pool area") ENDIF #ENDIF
|
|
EXIT
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
//don't attack until the spotted stealing clothes dialgoue has ended
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
AND NOT IS_CONVERSATION_TRYING_TO_BE_RESTORED("NULL")
|
|
SET_POOL_AREA_STATE(N1B_POOL_AREA_STATE_CALL_COPS)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_POOL_AREA_STATE - POOL PEDS TO CALL COPS, from N1B_PLAYER_LOCATION_POOL_AREA finished spotted stealing clothes whilst gardener was deliverying his lines to them") ENDIF #ENDIF
|
|
EXIT
|
|
ENDIF
|
|
ENDIF
|
|
ELSE //if player isn't in the pool area
|
|
IF (GET_GAME_TIMER() - iTimer_PoolPedsTo_CallCops > NIGEL1B_TIME_DELAY_FOR_POOL_PEDS_TO_CALL_COPS) //Count doen until call the cops
|
|
SET_POOL_AREA_STATE(N1B_POOL_AREA_STATE_CALL_COPS)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_POOL_AREA_STATE - POOL PEDS TO CALL COPS, from NOT N1B_PLAYER_LOCATION_POOL_AREA faked gardener telling them") ENDIF #ENDIF
|
|
bDoneDialogueGardener_InformsPoolPeds = TRUE //stop this dialogue from triggering
|
|
EXIT
|
|
ENDIF
|
|
ENDIF
|
|
//Go straight to surrendered state if the player has intimidated a pool ped
|
|
IF IS_PLAYER_FIRING_LETHAL_WEAPON_ON_PROPERTY()
|
|
OR IS_PLAYER_INTIMIDATING_POOL_PEDS()
|
|
OR HAS_PLAYER_STARTED_FIGHT_WITH_POOL_PEDS()
|
|
SET_POOL_AREA_STATE(N1B_POOL_AREA_STATE_SURRENDERED)
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_POOL_AREA_STATE - POOL PEDS TO SURRENDERED FROM N1B_POOL_AREA_STATE_SPOTTED") ENDIF #ENDIF
|
|
EXIT
|
|
ENDIF
|
|
BREAK
|
|
// ------------------------------------------
|
|
CASE N1B_POOL_AREA_STATE_SPOTTED
|
|
//Play the initially spotted the player dialogue, changes depending who spotted the player
|
|
IF NOT bDoneDialoguePool_InitiallySpotted
|
|
IF bDoneDialoguePool_Spotted // possible for gardener being in pool area already triggering this
|
|
bDoneDialoguePool_InitiallySpotted = TRUE
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_POOL_AREA_STATE - N1B_POOL_AREA_STATE_SPOTTED skipped already done bDoneDialoguePool_Spotted dialogue from gardener") ENDIF #ENDIF
|
|
ELSE
|
|
IF ePlayerLocation = N1B_PLAYER_LOCATION_POOL_AREA
|
|
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
N1B_KILL_CURRENT_CONVERSATION(FALSE)
|
|
ELSE
|
|
STRING sIndividualDialogueLineToPlay
|
|
IF iPedID_PoolPedWhoDetectedPlayer = POOL_PED_FEMALE
|
|
sIndividualDialogueLineToPlay = "NIG1B_SPI_2"
|
|
// Do you know that guy?
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_POOL_AREA_STATE - N1B_POOL_AREA_STATE_SPOTTED, POOL_PED_FEMALE to say initial dialogue line ") ENDIF #ENDIF
|
|
ELSE
|
|
sIndividualDialogueLineToPlay = "NIG1B_SPI_1"
|
|
// Hey, who the fuck are you?
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_POOL_AREA_STATE - N1B_POOL_AREA_STATE_SPOTTED, POOL_PED_CELEB to say initial dialogue line ") ENDIF #ENDIF
|
|
ENDIF
|
|
IF NIG1B_PLAY_SINGLE_LINE_FROM_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG1BAU", "NIG1B_SPI", sIndividualDialogueLineToPlay, CONV_PRIORITY_MEDIUM) //, DO_NOT_DISPLAY_SUBTITLES)
|
|
bDoneDialoguePool_InitiallySpotted = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
REQUEST_TRIGGER_MISSION_MUSIC_EVENT(NIGEL1B_MUSIC_EVENT_START)
|
|
IF ePlayerLocation = N1B_PLAYER_LOCATION_POOL_AREA
|
|
//Play the player seen stealing the clothes dialogue (if seen doing so)
|
|
IF NOT HAS_TIME_PASSED(iTimer_TimeWindowForSpottedStealingClothesDialogue, 2000)
|
|
IF NOT bDoneDialogue_PlayerGrabsClothes
|
|
IF HAS_TIME_PASSED(iTimer_TimeWindowForSpottedStealingClothesDialogue, 500) //half second delay so it's not instant also doesn't conflict with restore convo
|
|
N1B_KILL_CURRENT_CONVERSATION(FALSE)
|
|
//IF NOT IS_THIS_PRINT_BEING_DISPLAYED("NIG1B_OBJ_03") // Leave the area.~s~ //*commented out for new display message check with subtitle profile settings
|
|
IF NIG1B_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG1BAU", "NIG1B_PUP", CONV_PRIORITY_MEDIUM) //, DO_NOT_DISPLAY_SUBTITLES)
|
|
// Hey, he just took my clothes!
|
|
bDoneDialogue_PlayerGrabsClothes = TRUE
|
|
iTimer_TimeWindowForSpottedStealingClothesDialogue = 0
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SHOULD OF DONE THE SPOTTED STEALING CLOTHES DIALOGUE") ENDIF #ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT bDoneDialoguePool_Spotted
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
AND NOT IS_CONVERSATION_TRYING_TO_BE_RESTORED("NULL")
|
|
bDoneDialoguePool_Spotted = NIG1B_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG1BAU", "NIG1B_SPO", CONV_PRIORITY_MEDIUM) //, DO_NOT_DISPLAY_SUBTITLES)
|
|
// What do you think you're doing? This is private property.
|
|
// Just pretend I'm not here, kids.
|
|
// He's crazy. I'm calling the cops.
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_POOL_AREA_STATE - N1B_POOL_AREA_STATE_SPOTTED, done spotted dialogue") ENDIF #ENDIF
|
|
ENDIF
|
|
ELSE
|
|
//start call cops, warning dialogue / seen stealing clothes dialogue has finished
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
AND NOT IS_CONVERSATION_TRYING_TO_BE_RESTORED("NULL")
|
|
iTimer_PoolPedsTo_CallCops = GET_GAME_TIMER()
|
|
SET_POOL_AREA_STATE(N1B_POOL_AREA_STATE_CALL_COPS)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_POOL_AREA_STATE - POOL PEDS TO N1B_POOL_AREA_STATE_CALL_COPS, FINISHED SPOTTED DIALOGUE") ENDIF #ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
iTimer_PoolPedsTo_CallCops = GET_GAME_TIMER()
|
|
SET_POOL_AREA_STATE(N1B_POOL_AREA_STATE_CALL_COPS)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_POOL_AREA_STATE - POOL PEDS TO N1B_POOL_AREA_STATE_CALL_COPS, player left pool area so going straight to call cops") ENDIF #ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
//Go straight to surrendered state if the player has intimidated a pool ped
|
|
IF IS_PLAYER_FIRING_LETHAL_WEAPON_ON_PROPERTY()
|
|
OR IS_PLAYER_INTIMIDATING_POOL_PEDS()
|
|
SET_POOL_AREA_STATE(N1B_POOL_AREA_STATE_SURRENDERED)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_POOL_AREA_STATE - POOL PEDS TO SURRENDERED FROM N1B_POOL_AREA_STATE_SPOTTED") ENDIF #ENDIF
|
|
EXIT
|
|
ENDIF
|
|
BREAK
|
|
// ------------------------------------------
|
|
CASE N1B_POOL_AREA_STATE_CALL_COPS
|
|
IF NOT bDoneDialoguePool_CallCops
|
|
IF bCelebOkToStartPhoneConvo
|
|
IF ePlayerLocation = N1B_PLAYER_LOCATION_POOL_AREA
|
|
N1B_KILL_CURRENT_CONVERSATION(FALSE)
|
|
IF NIG1B_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG1BAU", "NIG1B_CC", CONV_PRIORITY_MEDIUM) //, DO_NOT_DISPLAY_SUBTITLES)
|
|
// Hello, police?
|
|
// There's a vagrant on my property who won't leave.
|
|
// That's it, Rockford Hills. Please hurry, I think he's mentally defective.
|
|
iTimer_PoolPedsTo_CallCops = GET_GAME_TIMER()
|
|
bDoneDialoguePool_CallCops = TRUE
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_POOL_AREA_STATE - N1B_POOL_AREA_STATE_CALL_COPS , bDoneDialoguePool_CallCops done") ENDIF #ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF (GET_GAME_TIMER() - iTimer_PoolPedsTo_CallCops > 4000) //Count doen until call the cops
|
|
iTimer_PoolPedsTo_CallCops = GET_GAME_TIMER()
|
|
bDoneDialoguePool_CallCops = TRUE //add timer here instead
|
|
bDoneDialogue_PlayerMissedCelebCallingCops = FALSE // player will need another chance to hear that cops have been called
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_POOL_AREA_STATE - N1B_POOL_AREA_STATE_CALL_COPS , bDoneDialoguePool_CallCops done Player not in area") ENDIF #ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT bHavePoolPedsCallTheCops
|
|
IF NOT IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("NIG1B_CC") //call cops convo
|
|
IF sPoolPed[POOL_PED_CELEB].AI = N1B_PED_AI_CELEB_ONLY_SETUP_CALL_THE_COPS
|
|
OR sPoolPed[POOL_PED_CELEB].AI = N1B_PED_AI_CELEB_ONLY_STATE_CALL_THE_COPS
|
|
sPoolPed[POOL_PED_CELEB].AI = N1B_PED_AI_CELEB_ONLY_SETUP_END_PHONECALL
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_POOL_AREA_STATE - N1B_POOL_AREA_STATE_CALL_COPS set sPoolPed[POOL_PED_CELEB].AI = N1B_PED_AI_CELEB_ONLY_SETUP_END_PHONECALL") ENDIF #ENDIF
|
|
ENDIF
|
|
IF eMissionStage = MISSION_STAGE_STEAL_CELEB_POSSESSIONS // To fix B*922388 if the player has reached the stage in the mission where he's left the area don't apply the wanted level in this way
|
|
OR eMissionStage = MISSION_STAGE_ITEMS_STOLEN_LEAVE_THE_AREA
|
|
IF (GET_GAME_TIMER() - iTimer_PoolPedsTo_CallCops > 500) //slight delay after phone call
|
|
IF IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
|
|
bHavePoolPedsCallTheCops = TRUE
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_POOL_AREA_STATE - N1B_POOL_AREA_STATE_CALL_COPS player already had a wanted rating so not reapplied") ENDIF #ENDIF
|
|
ELSE
|
|
IF NOT HAS_COP_ASSETS_LOADED_FOR_APPLYING_WANTED_LEVEL()
|
|
REQUEST_COP_ASSETS_FOR_APPLYING_WANTED_LEVEL()
|
|
ENDIF
|
|
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 2)
|
|
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
|
|
iDialogueTimer_PoolPedWaitingForCops = GET_GAME_TIMER()
|
|
bHavePoolPedsCallTheCops = TRUE
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_POOL_AREA_STATE - N1B_POOL_AREA_STATE_CALL_COPS player given a wanted rating") ENDIF #ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
iTimer_PoolPedsTo_CallCops = GET_GAME_TIMER()
|
|
ENDIF
|
|
ELSE
|
|
// initial comment towards the player if he had missed celeb calling the cops
|
|
IF NOT bDoneDialogue_PlayerMissedCelebCallingCops
|
|
IF ePlayerLocation = N1B_PLAYER_LOCATION_POOL_AREA
|
|
IF NIG1B_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG1BAU", "NIG1B_CC3", CONV_PRIORITY_MEDIUM) //, DO_NOT_DISPLAY_SUBTITLES)
|
|
// I've called the cops, they're on their way!
|
|
iTimer_PoolPedsTo_CallCops = GET_GAME_TIMER()
|
|
bDoneDialogue_PlayerMissedCelebCallingCops = TRUE
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_POOL_AREA_STATE - N1B_POOL_AREA_STATE_CALL_COPS , bDoneDialogue_PlayerMissedCelebCallingCops done") ENDIF #ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
// player knocking into the peds
|
|
IF NOT IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING(tlDialogueRoot_PoolPedsCurrentReactionDialogue)
|
|
IF IS_ENTITY_TOUCHING_ENTITY(sPoolPed[POOL_PED_CELEB].pedIndex, PLAYER_PED_ID())
|
|
AND IS_PED_RAGDOLL(sPoolPed[POOL_PED_CELEB].pedIndex)
|
|
IF NIG1B_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG1BAU", "NIG1B_TBUMP", CONV_PRIORITY_MEDIUM)
|
|
// Random selected lines -
|
|
// Don't be a dick.
|
|
// This isn't funny.
|
|
// Don't touch me, man.
|
|
tlDialogueRoot_PoolPedsCurrentReactionDialogue = "NIG1B_TBUMP"
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_POOL_AREA_STATE - N1B_POOL_AREA_STATE_CALL_COPS - triggered NIG1B_TBUMP") ENDIF #ENDIF
|
|
ENDIF
|
|
ELIF IS_ENTITY_TOUCHING_ENTITY(sPoolPed[POOL_PED_FEMALE].pedIndex, PLAYER_PED_ID())
|
|
AND IS_PED_RAGDOLL(sPoolPed[POOL_PED_FEMALE].pedIndex)
|
|
IF NIG1B_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG1BAU", "NIG1B_GBUMP", CONV_PRIORITY_MEDIUM)
|
|
// Random selected lines -
|
|
// Ow, that hurt.
|
|
// Ty-Di, the hobo pushed me!
|
|
// He tried to feel my tits!
|
|
tlDialogueRoot_PoolPedsCurrentReactionDialogue = "NIG1B_GBUMP"
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_POOL_AREA_STATE - N1B_POOL_AREA_STATE_CALL_COPS - triggered NIG1B_GBUMP") ENDIF #ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
// dialogue - additional comments from pool ped if cops are on route
|
|
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
iDialogueTimer_PoolPedWaitingForCops = GET_GAME_TIMER()
|
|
ELSE
|
|
IF ePlayerLocation = N1B_PLAYER_LOCATION_POOL_AREA
|
|
IF HAS_TIME_PASSED(iDialogueTimer_PoolPedWaitingForCops, NIGEL1B_TIME_DELAY_FOR_NEXT_RANDOM_DIALOGUE_LINE)
|
|
IF GET_RANDOM_INT_IN_RANGE(0, 10) < 5
|
|
IF IS_PED_UNINJURED(sPoolPed[POOL_PED_CELEB].pedIndex)
|
|
IF NIG1B_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG1BAU", "NIG1B_CC2", CONV_PRIORITY_MEDIUM) //, DO_NOT_DISPLAY_SUBTITLES)
|
|
// Cops'll be here any minute, dude.
|
|
// You stay cool, maybe I won't press charges.
|
|
// Is that sirens I hear? Yep, definitely police sirens. Lots of them.
|
|
// It's not too late to run, man. Let's just end this shit.
|
|
// The cops will take you back to the asylum, man, is that what you want?
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_POOL_AREA_STATE - N1B_POOL_AREA_STATE_CALL_COPS - random waiting for cops dialogue trigger for ID :", POOL_PED_CELEB) ENDIF #ENDIF
|
|
iDialogueTimer_PoolPedWaitingForCops = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF TRIGGER_ADDITIONAL_AMBIENT_LINES_FOR_TREVOR_HANGING_AROUND()
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_POOL_AREA_STATE - N1B_POOL_AREA_STATE_CALL_COPS -TRIGGER_ADDITIONAL_AMBIENT_LINES_FOR_TREVOR_HANGING_AROUND") ENDIF #ENDIF
|
|
iDialogueTimer_PoolPedWaitingForCops = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
IF sPoolPed[POOL_PED_CELEB].AI = N1B_PED_AI_CELEB_ONLY_STATE_END_PHONECALL
|
|
sPoolPed[POOL_PED_CELEB].AI = N1B_PED_AI_SETUP_AWARE_OF_PLAYER
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_POOL_AREA_STATE - N1B_POOL_AREA_STATE_CALL_COPS set sPoolPed[POOL_PED_CELEB].AI = N1B_PED_AI_SETUP_AWARE_OF_PLAYER") ENDIF #ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
//Go straight to surrendered state if the player has intimidated a pool ped
|
|
IF IS_PLAYER_FIRING_LETHAL_WEAPON_ON_PROPERTY()
|
|
OR IS_PLAYER_INTIMIDATING_POOL_PEDS()
|
|
OR HAS_PLAYER_STARTED_FIGHT_WITH_POOL_PEDS()
|
|
IF bDoneDialoguePool_CallCops
|
|
AND NOT IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("NIG1B_CC") //call cops convo
|
|
bPlayerStoppedCelebCallingCops = FALSE
|
|
ELSE
|
|
bPlayerStoppedCelebCallingCops = TRUE // setup alternative dialogue if player interrupts celeb calling the cops
|
|
ENDIF
|
|
SET_POOL_AREA_STATE(N1B_POOL_AREA_STATE_SURRENDERED)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_POOL_AREA_STATE - N1B_POOL_AREA_STATE_CALL_COPS -POOL PEDS TO SURRENDERED") ENDIF #ENDIF
|
|
EXIT
|
|
ENDIF
|
|
BREAK
|
|
// ------------------------------------------
|
|
CASE N1B_POOL_AREA_STATE_SURRENDERED
|
|
REQUEST_TRIGGER_MISSION_MUSIC_EVENT(NIGEL1B_MUSIC_EVENT_START)
|
|
IF ePlayerLocation = N1B_PLAYER_LOCATION_POOL_AREA
|
|
IF NOT bDoneDialoguePool_Surrendered
|
|
N1B_KILL_CURRENT_CONVERSATION(FALSE)
|
|
IF bPlayerStoppedCelebCallingCops // different dialogue if player has interrupted celeb calling the cops
|
|
tlDialogueRoot_PoolPedsSurrender = "NIG1B_SCC"
|
|
IF NIG1B_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG1BAU", tlDialogueRoot_PoolPedsSurrender, CONV_PRIORITY_MEDIUM) //, DO_NOT_DISPLAY_SUBTITLES)
|
|
// I wouldn't do that if I were you.
|
|
// Fuck, what is it you want? Just leave us alone, man.
|
|
bDoneDialoguePool_Surrendered = TRUE
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_POOL_AREA_STATE - N1B_POOL_AREA_STATE_SURRENDERED - done dialogue - interupted call to cops") ENDIF #ENDIF
|
|
ENDIF
|
|
ELSE
|
|
//different dialogue based on player weapon
|
|
IF IS_PLAYER_CURRENT_WEAPON_LETHAL() //player has lethal weapon which isn't a melee
|
|
tlDialogueRoot_PoolPedsSurrender = "NIG1B_SUR"
|
|
IF NIG1B_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG1BAU", tlDialogueRoot_PoolPedsSurrender, CONV_PRIORITY_MEDIUM) //, DO_NOT_DISPLAY_SUBTITLES)
|
|
// Don't get any more stupid, or I will blow your botoxed brains out.
|
|
// Shit, man, just take whatever you want.
|
|
bDoneDialoguePool_Surrendered = TRUE
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_POOL_AREA_STATE - N1B_POOL_AREA_STATE_SURRENDERED - done dialogue - lethal weapon") ENDIF #ENDIF
|
|
ENDIF
|
|
ELSE //player has non lethal weapon
|
|
tlDialogueRoot_PoolPedsSurrender = "NIG1B_SNL"
|
|
IF NIG1B_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG1BAU", tlDialogueRoot_PoolPedsSurrender, CONV_PRIORITY_MEDIUM) //, DO_NOT_DISPLAY_SUBTITLES)
|
|
// Any dumb moves, lovebirds, you'll need a lot more cosmetic surgery.
|
|
// Shit, man, just take whatever you want.
|
|
bDoneDialoguePool_Surrendered = TRUE
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_POOL_AREA_STATE - N1B_POOL_AREA_STATE_SURRENDERED - done dialogue - none leathal weapon") ENDIF #ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
iTimer_DelayAdditionalSurrenderedDialogue = GET_GAME_TIMER() //used for additional surrender dialogue timer
|
|
ELSE
|
|
IF NOT IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING(tlDialogueRoot_PoolPedsSurrender)
|
|
// another opportunity for clothes stolen dialogue
|
|
IF NOT bDoneDialogue_PlayerGrabsClothes
|
|
//Play the player seen stealing the clothes dialogue (if seen doing so at this point)
|
|
//this can override the gardener informing the pool peds dialogue
|
|
IF NOT HAS_TIME_PASSED(iTimer_TimeWindowForSpottedStealingClothesDialogue, 2000)
|
|
IF HAS_TIME_PASSED(iTimer_TimeWindowForSpottedStealingClothesDialogue, 500) //half second delay so it's not instant also doesn't conflict with restore convo
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
AND NOT IS_CONVERSATION_TRYING_TO_BE_RESTORED("NULL")
|
|
//IF NOT IS_THIS_PRINT_BEING_DISPLAYED("NIG1B_OBJ_03") // Leave the area.~s~ //*commented out for new display message check with subtitle profile settings
|
|
IF NIG1B_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG1BAU", "NIG1B_PUP", CONV_PRIORITY_MEDIUM) //, DO_NOT_DISPLAY_SUBTITLES)
|
|
// Hey, he just took my clothes!
|
|
iTimer_TimeWindowForSpottedStealingClothesDialogue = 0
|
|
bDoneDialogue_PlayerGrabsClothes = TRUE
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_POOL_AREA_STATE - N1B_POOL_AREA_STATE_SURRENDERED - player seen stealing clothes dialogue") ENDIF #ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
MANAGE_ADDITIONAL_SURRENDERED_DIALOGUE()
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
// only do this if the pool peds haven't already called the cops
|
|
IF NOT bHavePoolPedsCallTheCops
|
|
//IF ePlayerLocation = N1B_PLAYER_LOCATION_OUTSIDE_HOUSE_AREA
|
|
// pool peds to shout "Call the police." if player leaves area when they are surrendered
|
|
IF NOT bDoneDialogue_ShoutCallCopsWhenPlayerLeaves
|
|
IF IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
|
|
bHavePoolPedsCallTheCops = TRUE
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_POOL_AREA_STATE - N1B_POOL_AREA_STATE_SURRENDERED already had a wanted rating so not reapplied") ENDIF #ENDIF
|
|
ELSE
|
|
IF IS_PED_UNINJURED(sPoolPed[POOL_PED_FEMALE].pedIndex)
|
|
AND IS_ENTITY_IN_RANGE_COORDS(sPoolPed[POOL_PED_FEMALE].pedIndex, vPlayerPos, 50) // only do the dialogue if player is in ear shot
|
|
IF NIG1B_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG1BAU", "NIG1B_C1", CONV_PRIORITY_MEDIUM) //, DO_NOT_DISPLAY_SUBTITLES)
|
|
// Now call the police!
|
|
iTimer_PoolPedsTo_CallCops = GET_GAME_TIMER()
|
|
bDoneDialogue_ShoutCallCopsWhenPlayerLeaves = TRUE
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_POOL_AREA_STATE - N1B_POOL_AREA_STATE_SURRENDERED , bDoneDialogue_ShoutCallCopsWhenPlayerLeaves done") ENDIF #ENDIF
|
|
ENDIF
|
|
ELSE
|
|
iTimer_PoolPedsTo_CallCops = GET_GAME_TIMER()
|
|
bDoneDialogue_ShoutCallCopsWhenPlayerLeaves = TRUE
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_POOL_AREA_STATE - N1B_POOL_AREA_STATE_SURRENDERED , bDoneDialogue_ShoutCallCopsWhenPlayerLeaves skipped as player out of range or ped dead") ENDIF #ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("NIG1B_C1") //Call the police
|
|
IF eMissionStage = MISSION_STAGE_STEAL_CELEB_POSSESSIONS // To fix B*922388 if the player has reached the stage in the mission where he's left the area don't apply the wanted level in this way
|
|
OR eMissionStage = MISSION_STAGE_ITEMS_STOLEN_LEAVE_THE_AREA
|
|
IF (GET_GAME_TIMER() - iTimer_PoolPedsTo_CallCops > 2000) //slight delay after phone call
|
|
IF IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
|
|
bHavePoolPedsCallTheCops = TRUE
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_POOL_AREA_STATE - N1B_POOL_AREA_STATE_SURRENDERED player already had a wanted rating so not reapplied") ENDIF #ENDIF
|
|
ELSE
|
|
IF NOT HAS_COP_ASSETS_LOADED_FOR_APPLYING_WANTED_LEVEL()
|
|
REQUEST_COP_ASSETS_FOR_APPLYING_WANTED_LEVEL()
|
|
ENDIF
|
|
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 2)
|
|
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
|
|
bHavePoolPedsCallTheCops = TRUE
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_POOL_AREA_STATE - N1B_POOL_AREA_STATE_SURRENDERED player given a wanted rating") ENDIF #ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
iTimer_PoolPedsTo_CallCops = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
//ENDIF
|
|
ENDIF
|
|
// setup the peds to flee if the player leaves them surrendered
|
|
IF ePlayerLocation = N1B_PLAYER_LOCATION_OUTSIDE_HOUSE_AREA
|
|
IF HAS_TIME_PASSED(iTimer_DelayPoolPedsFleeWhenSurrendered, 5000)
|
|
SET_POOL_AREA_STATE(N1B_POOL_AREA_STATE_FLEE, TRUE)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_POOL_AREA_STATE - N1B_POOL_AREA_STATE_SURRENDERED going to N1B_POOL_AREA_STATE_FLEE player left area so flee pedID : ", i) ENDIF #ENDIF
|
|
ENDIF
|
|
ELSE
|
|
iTimer_DelayPoolPedsFleeWhenSurrendered = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
// make the peds flee if the player has attacked them whilst they are surrendered
|
|
FOR i = 0 TO (TOTAL_POOL_PEDS - 1)
|
|
//IF IS_PLAYER_MAKING_PED_FRIGHTENED(sPoolPed[i].pedIndex)
|
|
IF IS_ENTITY_ALIVE(sPoolPed[i].pedIndex)
|
|
//IF sPoolPed[i].AI = N1B_PED_AI_STATE_SURRENDERED // potentially needed incase this triggers before they can get up to surrender whilst in N1B_PED_AI_SETUP_SURRENDERED
|
|
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(sPoolPed[i].pedIndex, PLAYER_PED_ID())
|
|
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(sPoolPed[i].pedIndex)
|
|
|
|
N1B_KILL_CURRENT_CONVERSATION(FALSE)
|
|
IF i = POOL_PED_CELEB
|
|
IF NIG1B_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG1BAU", "NIG1B_THIT", CONV_PRIORITY_MEDIUM) //, DO_NOT_DISPLAY_SUBTITLES)
|
|
// You crazy bastard!
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_POOL_AREA_STATE - done dialogue NIG1B_THIT") ENDIF #ENDIF
|
|
ENDIF
|
|
iPoolPedID_PlayerAttackedToFlee = POOL_PED_CELEB
|
|
ELIF i = POOL_PED_FEMALE
|
|
IF NIG1B_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG1BAU", "NIG1B_GHIT", CONV_PRIORITY_MEDIUM) //, DO_NOT_DISPLAY_SUBTITLES)
|
|
// Aagh, Tyler! Do something!
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_POOL_AREA_STATE - done dialogue NIG1B_GHIT") ENDIF #ENDIF
|
|
ENDIF
|
|
iPoolPedID_PlayerAttackedToFlee = POOL_PED_FEMALE
|
|
ENDIF
|
|
SET_POOL_AREA_STATE(N1B_POOL_AREA_STATE_FLEE, TRUE)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_POOL_AREA_STATE - N1B_POOL_AREA_STATE_SURRENDERED going to N1B_POOL_AREA_STATE_FLEE player damaged pedID : ", i) ENDIF #ENDIF
|
|
EXIT
|
|
ENDIF
|
|
//ENDIF
|
|
ENDIF
|
|
ENDFOR
|
|
BREAK
|
|
// ------------------------------------------
|
|
CASE N1B_POOL_AREA_STATE_FLEE
|
|
// dialogue - peds are fleeing as a pool ped was killed
|
|
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
iDialogueTimer_PoolPedFlee = GET_GAME_TIMER()
|
|
ELSE
|
|
// say response from Trevor for hitting ped when they were surrendered
|
|
IF iPoolPedID_PlayerAttackedToFlee != -1
|
|
IF iPoolPedID_PlayerAttackedToFlee = POOL_PED_CELEB
|
|
IF VDIST2(GET_ENTITY_COORDS(sPoolPed[POOL_PED_CELEB].pedIndex, FALSE), vPlayerPos) < (20.0 * 20.0)
|
|
IF NIG1B_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG1BAU", "NIG1B_PBU", CONV_PRIORITY_MEDIUM) //, DO_NOT_DISPLAY_SUBTITLES)
|
|
// Come on, we're both white trash!
|
|
// Don't pretend you don't need the publicity!
|
|
iPoolPedID_PlayerAttackedToFlee = -1
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_POOL_AREA_STATE - N1B_POOL_AREA_STATE_FLEE - done dialogue - NIG1B_PBU") ENDIF #ENDIF
|
|
ENDIF
|
|
ELSE
|
|
iPoolPedID_PlayerAttackedToFlee = -1
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_POOL_AREA_STATE - N1B_POOL_AREA_STATE_FLEE - skipped dialogue out of range - NIG1B_PBU") ENDIF #ENDIF
|
|
ENDIF
|
|
ELIF iPoolPedID_PlayerAttackedToFlee = POOL_PED_FEMALE
|
|
IF VDIST2(GET_ENTITY_COORDS(sPoolPed[POOL_PED_FEMALE].pedIndex, FALSE), vPlayerPos) < (20.0 * 20.0)
|
|
IF NIG1B_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG1BAU", "NIG1B_BEAT", CONV_PRIORITY_MEDIUM) //, DO_NOT_DISPLAY_SUBTITLES)
|
|
// Sorry, blame it on the mommy issues.
|
|
iPoolPedID_PlayerAttackedToFlee = -1
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_POOL_AREA_STATE - N1B_POOL_AREA_STATE_FLEE - done dialogue - NIG1B_BEAT") ENDIF #ENDIF
|
|
ENDIF
|
|
ELSE
|
|
iPoolPedID_PlayerAttackedToFlee = -1
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_POOL_AREA_STATE - N1B_POOL_AREA_STATE_FLEE - skipped dialogue out of range - NIG1B_PBU") ENDIF #ENDIF
|
|
ENDIF
|
|
ELSE
|
|
iPoolPedID_PlayerAttackedToFlee = -1
|
|
ENDIF
|
|
ELIF HAS_TIME_PASSED(iDialogueTimer_PoolPedFlee, NIGEL1B_TIME_DELAY_FOR_NEXT_RANDOM_DIALOGUE_LINE)
|
|
INT iSpeakerID
|
|
iSpeakerID = GET_RANDOM_OK_POOL_PED_TO_SPEAK(vPlayerPos, 20.0)
|
|
IF iSpeakerID != -1 // if able to find a suitable speaker (-1 if none was found
|
|
|
|
TEXT_LABEL_23 tl23Root
|
|
IF iSpeakerID = POOL_PED_CELEB
|
|
tl23Root = "NIG1B_CF1"
|
|
// Fuck this, I'm out of here!
|
|
// Not cool, dude!
|
|
// What's your problem, man?
|
|
// Why do I always get the psychos?
|
|
ELIF iSpeakerID = POOL_PED_FEMALE
|
|
tl23Root = "NIG1B_CF2"
|
|
// He's a lunatic!
|
|
// Stay away from me!
|
|
// I just want to go home!
|
|
// Leave me alone, you freak!
|
|
ENDIF
|
|
IF NIG1B_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG1BAU", tl23Root, CONV_PRIORITY_MEDIUM) //, DO_NOT_DISPLAY_SUBTITLES)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_POOL_AREA_STATE - N1B_POOL_AREA_STATE_FLEE - random flee dialogue trigger for ID :", iSpeakerID) ENDIF #ENDIF
|
|
iDialogueTimer_PoolPedFlee = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// only do this if the pool peds haven't already called the cops
|
|
IF NOT bHavePoolPedsCallTheCops
|
|
IF IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
|
|
bHavePoolPedsCallTheCops = TRUE
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_POOL_AREA_STATE - N1B_POOL_AREA_STATE_FLEE already had a wanted rating so not reapplied") ENDIF #ENDIF
|
|
ELSE
|
|
// skip the dialogue to call the cops, just apply with a bigger wait time
|
|
IF NOT bDoneDialogue_ShoutCallCopsWhenPlayerLeaves
|
|
iTimer_PoolPedsTo_CallCops = GET_GAME_TIMER()
|
|
bDoneDialogue_ShoutCallCopsWhenPlayerLeaves = TRUE
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_POOL_AREA_STATE - N1B_POOL_AREA_STATE_FLEE , bDoneDialogue_ShoutCallCopsWhenPlayerLeaves done") ENDIF #ENDIF
|
|
ELSE
|
|
IF eMissionStage = MISSION_STAGE_STEAL_CELEB_POSSESSIONS // To fix B*922388 if the player has reached the stage in the mission where he's left the area don't apply the wanted level in this way
|
|
OR eMissionStage = MISSION_STAGE_ITEMS_STOLEN_LEAVE_THE_AREA
|
|
IF HAS_TIME_PASSED(iTimer_PoolPedsTo_CallCops, 8000)
|
|
IF IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
|
|
bHavePoolPedsCallTheCops = TRUE
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_POOL_AREA_STATE - N1B_POOL_AREA_STATE_FLEE player already had a wanted rating so not reapplied") ENDIF #ENDIF
|
|
ELSE
|
|
IF NOT HAS_COP_ASSETS_LOADED_FOR_APPLYING_WANTED_LEVEL()
|
|
REQUEST_COP_ASSETS_FOR_APPLYING_WANTED_LEVEL()
|
|
ENDIF
|
|
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 2)
|
|
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
|
|
bHavePoolPedsCallTheCops = TRUE
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_POOL_AREA_STATE - N1B_POOL_AREA_STATE_FLEE player given a wanted rating") ENDIF #ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
FOR i = 0 TO (TOTAL_POOL_PEDS - 1)
|
|
CONTROL_POOL_PEDS_AI(i)
|
|
ENDFOR
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Set the current garden area's state, along with the garden ped's relevant AI state.
|
|
/// PARAMS:
|
|
/// eNewState - The new state
|
|
/// bSetRelevantAIState_ForGardenPed - If TRUE the ped's AI will be updated to the relevant state
|
|
PROC SET_GARDEN_AREA_STATE(N1B_GARDEN_AREA_STATE eNewState, BOOL bSetRelevantAIState_ForGardenPed = TRUE)
|
|
eGardenAreaState = eNewState
|
|
IF bSetRelevantAIState_ForGardenPed
|
|
SWITCH eGardenAreaState
|
|
CASE N1B_GARDEN_AREA_STATE_UNDETECTED
|
|
sGardenerPed.AI = N1B_PED_AI_STATE_RELAXED
|
|
BREAK
|
|
CASE N1B_GARDEN_AREA_STATE_SPOTTED
|
|
sGardenerPed.AI = N1B_PED_AI_SETUP_AWARE_OF_PLAYER
|
|
BREAK
|
|
CASE N1B_GARDEN_AREA_STATE_INFORM_POOL_AREA
|
|
sGardenerPed.AI = N1B_PED_AI_SETUP_WARN_OTHER_PEDS
|
|
BREAK
|
|
CASE N1B_GARDEN_AREA_STATE_SURRENDERED
|
|
sGardenerPed.AI = N1B_PED_AI_SETUP_SURRENDERED
|
|
// reset the last damaged entity so we can test for the player hurting him whilst they are surrendered.
|
|
IF IS_ENTITY_ALIVE(sGardenerPed.pedIndex)
|
|
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(sGardenerPed.pedIndex)
|
|
ENDIF
|
|
BREAK
|
|
CASE N1B_GARDEN_AREA_STATE_FLEE
|
|
sGardenerPed.AI = N1B_PED_AI_SETUP_FLEE
|
|
BREAK
|
|
CASE N1B_GARDEN_AREA_STATE_GARDENER_DEAD
|
|
sGardenerPed.AI = N1B_PED_AI_STATE_DEAD
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_GARDEN_AREA_STATE - done") ENDIF #ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Manages the players actions around the garden area
|
|
PROC MANAGE_GARDEN_AREA_STATE()
|
|
IF IS_PED_UNINJURED(sGardenerPed.pedIndex)
|
|
UPDATE_PEDS_CAN_SEE_PLAYER_FRAME_COUNTER(sGardenerPed.pedIndex, sGardenerPed.iFrameCountLastSeenPlayer)
|
|
SWITCH eGardenAreaState
|
|
// ------------------------------------------
|
|
CASE N1B_GARDEN_AREA_STATE_UNDETECTED
|
|
//play the gardener's whistling audio
|
|
IF HAS_SOUND_FINISHED(iSoundID_WhistlingGardener)
|
|
IF NOT IS_PED_BEING_STEALTH_KILLED(sGardenerPed.pedIndex)
|
|
AND NOT IS_PED_RAGDOLL(sGardenerPed.pedIndex)
|
|
AND NOT IS_PED_IN_CURRENT_CONVERSATION(sGardenerPed.pedIndex) // stop him whilsting whilst he talks
|
|
PLAY_SOUND_FROM_ENTITY(iSoundID_WhistlingGardener, "WHISTLING", sGardenerPed.pedIndex, "NIGEL_1B_SOUNDSET")
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "GARDEN AREA STATE - set whistling gardener audio active ^^^^^^") ENDIF #ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF IS_PED_BEING_STEALTH_KILLED(sGardenerPed.pedIndex)
|
|
OR IS_PED_RAGDOLL(sGardenerPed.pedIndex)
|
|
OR IS_PED_IN_CURRENT_CONVERSATION(sGardenerPed.pedIndex) // stop him whilsting whilst he talks
|
|
IF NOT HAS_SOUND_FINISHED(iSoundID_WhistlingGardener)
|
|
STOP_SOUND(iSoundID_WhistlingGardener)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "GARDEN AREA STATE - set whistling gardener audio STOPPED ped being stealth killed ^^^^^^") ENDIF #ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
//check for player intimidating first, as detected would go here eventually anyway
|
|
IF IS_PLAYER_FIRING_LETHAL_WEAPON_ON_PROPERTY()
|
|
OR IS_PLAYER_USING_WEAPON_TO_INTIMIDATE_SPECIFIC_PED(sGardenerPed.pedIndex)
|
|
IF NOT HAS_SOUND_FINISHED(iSoundID_WhistlingGardener)
|
|
STOP_SOUND(iSoundID_WhistlingGardener)
|
|
ENDIF
|
|
// skipped over surrender dialogue if the player has already damaged the gardener to fix B*1094304
|
|
IF IS_ENTITY_ALIVE(sGardenerPed.pedIndex)
|
|
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(sGardenerPed.pedIndex, PLAYER_PED_ID())
|
|
bDoneDialogueGardener_Surrendered = TRUE
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_GARDEN_AREA_STATE - player damaged gardener so skipping bDoneDialogueGardener_Surrendered") ENDIF #ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
SET_GARDEN_AREA_STATE(N1B_GARDEN_AREA_STATE_SURRENDERED)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_GARDEN_AREA_STATE - GARDENER SURRENDERED") ENDIF #ENDIF
|
|
ELSE
|
|
//don't do the ped seeing checks if he's at the start where he's looking in the back of the truck, also override range for on foot approach
|
|
IF sGardenerPed.AI = N1B_PED_AI_STATE_RELAXED
|
|
IF IS_PLAYER_DRIVING_VEHICLE_IN_AREA_OF_PROPERTY(N1B_PLAYER_LOCATION_GARDEN_AREA)
|
|
OR HAS_GARDENER_PED_DETECTED_THE_PLAYER(FALSE, sGardenerPed.iFrameCountLastSeenPlayer, FALSE, FALSE) //stop gardener detecting player running close / walking whilst he has his head in the van.
|
|
AND ePlayerLocation = N1B_PLAYER_LOCATION_GARDEN_AREA
|
|
OR HAS_PLAYER_POTENTIALLY_KNOCKED_VAN_DOOR_INTO_GARDENER()
|
|
IF NOT HAS_SOUND_FINISHED(iSoundID_WhistlingGardener)
|
|
STOP_SOUND(iSoundID_WhistlingGardener)
|
|
ENDIF
|
|
SET_GARDEN_AREA_STATE(N1B_GARDEN_AREA_STATE_SPOTTED)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_GARDEN_AREA_STATE - GARDENER DETECTED THE PLAYER whilst N1B_PED_AI_STATE_RELAXED") ENDIF #ENDIF
|
|
// these checks are normall done as part of HAS_GARDENER_PED_DETECTED_THE_PLAYER, however they need to be custom for this intial setup to allow the player to get into the property
|
|
ELIF ePlayerMovementState = N1B_PEDMOVEMENTSTATE_RUNNING OR ePlayerMovementState = N1B_PEDMOVEMENTSTATE_SPRINTING
|
|
IF IS_ENTITY_IN_RANGE_COORDS(sGardenerPed.pedIndex, vPlayerPos, 4.0)
|
|
IF NOT HAS_SOUND_FINISHED(iSoundID_WhistlingGardener)
|
|
STOP_SOUND(iSoundID_WhistlingGardener)
|
|
ENDIF
|
|
SET_GARDEN_AREA_STATE(N1B_GARDEN_AREA_STATE_SPOTTED)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_GARDEN_AREA_STATE - GARDENER DETECTED THE PLAYER whilst N1B_PED_AI_STATE_RELAXED ran or sprint closeby") ENDIF #ENDIF
|
|
ENDIF
|
|
ELIF ePlayerMovementState = N1B_PEDMOVEMENTSTATE_WALKING
|
|
IF IS_ENTITY_IN_RANGE_COORDS(sGardenerPed.pedIndex, vPlayerPos, 2.5)
|
|
IF NOT HAS_SOUND_FINISHED(iSoundID_WhistlingGardener)
|
|
STOP_SOUND(iSoundID_WhistlingGardener)
|
|
ENDIF
|
|
SET_GARDEN_AREA_STATE(N1B_GARDEN_AREA_STATE_SPOTTED)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_GARDEN_AREA_STATE - GARDENER DETECTED THE PLAYER whilst N1B_PED_AI_STATE_RELAXED walked closeby") ENDIF #ENDIF
|
|
ENDIF
|
|
// B*1489377
|
|
ELIF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(sGardenerPed.pedIndex, PLAYER_PED_ID())
|
|
IF NOT HAS_SOUND_FINISHED(iSoundID_WhistlingGardener)
|
|
STOP_SOUND(iSoundID_WhistlingGardener)
|
|
ENDIF
|
|
SET_GARDEN_AREA_STATE(N1B_GARDEN_AREA_STATE_SPOTTED)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_GARDEN_AREA_STATE - player damaged gardener whilst N1B_PED_AI_STATE_RELAXED") ENDIF #ENDIF
|
|
ELSE
|
|
//gardener in back of the van dialogue
|
|
IF ePlayerLocation = N1B_PLAYER_LOCATION_GARDEN_AREA
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
AND NOT IS_CONVERSATION_TRYING_TO_BE_RESTORED("NULL")
|
|
IF HAS_TIME_PASSED(iTimer_DelayGardenerSearchingVanDialogue, GET_RANDOM_INT_IN_RANGE(5000, 12000))
|
|
IF NIG1B_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG1BAU", "NIG1B_GBV", CONV_PRIORITY_MEDIUM)
|
|
// Donde esta?
|
|
// Se que esta por aqui.
|
|
// No puede ser.
|
|
// El jefe me va a matar
|
|
IF NOT HAS_SOUND_FINISHED(iSoundID_WhistlingGardener)
|
|
STOP_SOUND(iSoundID_WhistlingGardener)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "GARDEN AREA STATE - stopped whistling sound for dialogue") ENDIF #ENDIF
|
|
ENDIF
|
|
iTimer_DelayGardenerSearchingVanDialogue = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
iTimer_DelayGardenerSearchingVanDialogue = GET_GAME_TIMER()
|
|
ENDIF
|
|
ELSE
|
|
iTimer_DelayGardenerSearchingVanDialogue = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
// to be removed since, gardener is now to stay still at the van
|
|
IF HAS_GARDENER_PED_DETECTED_THE_PLAYER(TRUE, sGardenerPed.iFrameCountLastSeenPlayer, TRUE, TRUE)
|
|
OR IS_PLAYER_DRIVING_VEHICLE_IN_AREA_OF_PROPERTY(N1B_PLAYER_LOCATION_GARDEN_AREA)
|
|
IF NOT HAS_SOUND_FINISHED(iSoundID_WhistlingGardener)
|
|
STOP_SOUND(iSoundID_WhistlingGardener)
|
|
ENDIF
|
|
SET_GARDEN_AREA_STATE(N1B_GARDEN_AREA_STATE_SPOTTED)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_GARDEN_AREA_STATE - GARDENER DETECTED THE PLAYER") ENDIF #ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
// ------------------------------------------
|
|
CASE N1B_GARDEN_AREA_STATE_SPOTTED
|
|
IF NOT bDoneDialogueGardener_Spotted
|
|
N1B_KILL_CURRENT_CONVERSATION(FALSE)
|
|
IF ePlayerLocation = N1B_PLAYER_LOCATION_GARDEN_AREA
|
|
IF NIG1B_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG1BAU", "NIG1B_GSP", CONV_PRIORITY_MEDIUM) //, DO_NOT_DISPLAY_SUBTITLES)
|
|
// Hey, you cannot be here!
|
|
// I go tell the boss, he won't be happy!
|
|
iTimer_GardenAreaState = GET_GAME_TIMER()
|
|
bDoneDialogueGardener_Spotted = TRUE
|
|
ENDIF
|
|
ELSE
|
|
bDoneDialogueGardener_Spotted = TRUE
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_GARDEN_AREA_STATE - bDoneDialogueGardener_Spotted - skipped as player was out of range") ENDIF #ENDIF
|
|
ENDIF
|
|
ELSE
|
|
REQUEST_TRIGGER_MISSION_MUSIC_EVENT(NIGEL1B_MUSIC_EVENT_START)
|
|
IF ePoolAreaState = N1B_POOL_AREA_STATE_UNDETECTED // let gardener start going around to tell the celeb, if we are NOT plannning on using the alternative dialogue
|
|
OR ePoolAreaState = N1B_POOL_AREA_STATE_CELEB_LOOKING_FOR_CLOTHES
|
|
IF NOT IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("NIG1B_GSP")
|
|
OR HAS_PLAYER_STARTED_FIGHT_WITH_SPECIFIC_PED(sGardenerPed.pedIndex)
|
|
OR HAS_TIME_PASSED(iTimer_GardenAreaState, 1250)
|
|
SET_GARDEN_AREA_STATE(N1B_GARDEN_AREA_STATE_INFORM_POOL_AREA)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_GARDEN_AREA_STATE - GARDEN STATE SWITCHED TO N1B_GARDEN_AREA_STATE_INFORM_POOL_AREA") ENDIF #ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT bDoneDialogueGardener_PlayerSaysGetLost
|
|
IF NOT IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("NIG1B_GSP")
|
|
IF ePlayerLocation = N1B_PLAYER_LOCATION_GARDEN_AREA
|
|
IF NIG1B_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG1BAU", "NIG1B_GSP2", CONV_PRIORITY_MEDIUM) //, DO_NOT_DISPLAY_SUBTITLES)
|
|
// I've already introduced myself.
|
|
// He's over by the pool, shitting himself.
|
|
// So I guess you could either go join him or fuck off.
|
|
bDoneDialogueGardener_PlayerSaysGetLost = TRUE
|
|
ENDIF
|
|
ELSE
|
|
bDoneDialogueGardener_PlayerSaysGetLost = TRUE
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_GARDEN_AREA_STATE - bDoneDialogueGardener_PlayerSaysGetLost - skipped as player was out of range") ENDIF #ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF ePlayerLocation != N1B_PLAYER_LOCATION_GARDEN_AREA
|
|
N1B_KILL_CURRENT_CONVERSATION(TRUE)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_GARDEN_AREA_STATE - bDoneDialogueGardener_Spotted - dialogue killed early for player leaving area") ENDIF #ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("NIG1B_GSP2") // bDoneDialogueGardener_PlayerSaysGetLost
|
|
SET_GARDEN_AREA_STATE(N1B_GARDEN_AREA_STATE_FLEE)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_GARDEN_AREA_STATE - GARDEN STATE SWITCHED TO N1B_GARDEN_AREA_STATE_FLEE") ENDIF #ENDIF
|
|
ELSE
|
|
IF ePlayerLocation != N1B_PLAYER_LOCATION_GARDEN_AREA
|
|
N1B_KILL_CURRENT_CONVERSATION(TRUE)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_GARDEN_AREA_STATE - bDoneDialogueGardener_PlayerSaysGetLost - dialogue killed early for player leaving area") ENDIF #ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
IF IS_PLAYER_FIRING_LETHAL_WEAPON_ON_PROPERTY()
|
|
OR IS_PLAYER_USING_WEAPON_TO_INTIMIDATE_SPECIFIC_PED(sGardenerPed.pedIndex)
|
|
SET_GARDEN_AREA_STATE(N1B_GARDEN_AREA_STATE_SURRENDERED)
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_GARDEN_AREA_STATE - GARDENER SURRENDERED") ENDIF #ENDIF
|
|
ENDIF
|
|
BREAK
|
|
// ------------------------------------------
|
|
CASE N1B_GARDEN_AREA_STATE_INFORM_POOL_AREA
|
|
// switch to watching the player when celeb goes to ring the cops
|
|
IF sGardenerPed.AI = N1B_PED_AI_SETUP_WARN_OTHER_PEDS
|
|
OR sGardenerPed.AI = N1B_PED_AI_STATE_WARN_OTHER_PEDS
|
|
IF bHavePoolPedsCallTheCops
|
|
OR ePoolAreaState = N1B_POOL_AREA_STATE_CALL_COPS
|
|
sGardenerPed.AI = N1B_PED_AI_SETUP_JUST_FACE_PLAYER
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_GARDEN_AREA_STATE - GARDENER switched to N1B_PED_AI_SETUP_JUST_FACE_PLAYER state after pool peds called the cops") ENDIF #ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
IF ePoolAreaState = N1B_POOL_AREA_STATE_SURRENDERED
|
|
OR ePoolAreaState = N1B_POOL_AREA_STATE_FLEE
|
|
IF IS_PED_IN_POOL_AREA(sGardenerPed.pedIndex, FALSE)
|
|
SET_GARDEN_AREA_STATE(N1B_GARDEN_AREA_STATE_SURRENDERED)
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_GARDEN_AREA_STATE - GARDENER SURRENDERED") ENDIF #ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
IF HAS_PLAYER_STARTED_FIGHT_WITH_SPECIFIC_PED(sGardenerPed.pedIndex)
|
|
IF bDoneDialogueGardener_InformsPoolPeds // only make him flee once he's informed the pool peds
|
|
IF NOT IS_SPECIFIC_CONVERSATION_LABEL_CURRENTLY_PLAYING("NIG1B_GIC") // bDoneDialogueGardener_InformsPoolPeds
|
|
SET_GARDEN_AREA_STATE(N1B_GARDEN_AREA_STATE_FLEE)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_GARDEN_AREA_STATE - N1B_GARDEN_AREA_STATE_INFORM_POOL_AREA -> N1B_GARDEN_AREA_STATE_FLEE") ENDIF #ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
IF IS_PLAYER_FIRING_LETHAL_WEAPON_ON_PROPERTY()
|
|
OR IS_PLAYER_USING_WEAPON_TO_INTIMIDATE_SPECIFIC_PED(sGardenerPed.pedIndex)
|
|
SET_GARDEN_AREA_STATE(N1B_GARDEN_AREA_STATE_SURRENDERED)
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_GARDEN_AREA_STATE - GARDENER SURRENDERED") ENDIF #ENDIF
|
|
ENDIF
|
|
BREAK
|
|
// ------------------------------------------
|
|
CASE N1B_GARDEN_AREA_STATE_SURRENDERED
|
|
REQUEST_TRIGGER_MISSION_MUSIC_EVENT(NIGEL1B_MUSIC_EVENT_START)
|
|
IF NOT bDoneDialogueGardener_Surrendered
|
|
//don't play his surrender dialogue if, he's in the pool area and the pool peds are surrendered because there dialogue will play instead
|
|
IF IS_PED_IN_POOL_AREA(sGardenerPed.pedIndex, FALSE)
|
|
AND ePoolAreaState = N1B_POOL_AREA_STATE_SURRENDERED
|
|
OR ePoolAreaState = N1B_POOL_AREA_STATE_FLEE
|
|
// also skipped over if the player has already damaged the gardener to fix B*1094304
|
|
bDoneDialogueGardener_Surrendered = TRUE
|
|
ELSE
|
|
IF ePlayerLocation = N1B_PLAYER_LOCATION_GARDEN_AREA
|
|
OR IS_ENTITY_IN_RANGE_COORDS(sGardenerPed.pedIndex, vPlayerPos, 5.0)
|
|
N1B_KILL_CURRENT_CONVERSATION(FALSE)
|
|
IF NIG1B_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG1BAU", "NIG1B_GSU", CONV_PRIORITY_MEDIUM) //, DO_NOT_DISPLAY_SUBTITLES)
|
|
// I hope you're not going to ruin this surprise visit.
|
|
// No dispare! Por favor! No dispare!
|
|
iTimer_DelayAdditionalSurrenderedDialogue = GET_GAME_TIMER() //used for additional surrender dialogue timer
|
|
bDoneDialogueGardener_Surrendered = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
|
|
ENDIF
|
|
// make the ped flee if the player has attacked them whilst they are surrendered
|
|
//IF IS_PLAYER_MAKING_PED_FRIGHTENED(sGardenerPed.pedIndex)
|
|
IF IS_ENTITY_ALIVE(sGardenerPed.pedIndex)
|
|
//IF sGardenerPed.AI = N1B_PED_AI_STATE_SURRENDERED // potentially needed incase this triggers before they can get up to surrender whilst in N1B_PED_AI_SETUP_SURRENDERED
|
|
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(sGardenerPed.pedIndex, PLAYER_PED_ID())
|
|
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(sGardenerPed.pedIndex)
|
|
SET_GARDEN_AREA_STATE(N1B_GARDEN_AREA_STATE_FLEE, TRUE)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_GARDEN_AREA_STATE - N1B_GARDEN_AREA_STATE_SURRENDERED going to N1B_GARDEN_AREA_STATE_FLEE player damaged gardener ") ENDIF #ENDIF
|
|
ENDIF
|
|
//ENDIF
|
|
ENDIF
|
|
BREAK
|
|
// ------------------------------------------
|
|
CASE N1B_GARDEN_AREA_STATE_FLEE
|
|
IF NOT bDoneDialogueGardener_Flee
|
|
IF IS_PED_IN_HOUSE_AREA(sGardenerPed.pedIndex, FALSE)
|
|
IF ePlayerLocation = N1B_PLAYER_LOCATION_GARDEN_AREA
|
|
OR CAN_PED_SEE_PED(sGardenerPed.pedIndex, PLAYER_PED_ID())
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
AND NOT IS_CONVERSATION_TRYING_TO_BE_RESTORED("NULL")
|
|
IF NIG1B_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG1BAU", "NIG1B_GF", CONV_PRIORITY_MEDIUM) //, DO_NOT_DISPLAY_SUBTITLES)
|
|
// Este gringo esta loco!
|
|
bDoneDialogueGardener_Flee = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
CONTROL_GARDENERS_AI()
|
|
IF sGardenerPed.AI = N1B_PED_AI_SETUP_FLEE
|
|
OR sGardenerPed.AI = N1B_PED_AI_STATE_FLEE
|
|
CLEANUP_AI_PED_BLIP(sGardenerPed.blipAIStruct)
|
|
ELSE
|
|
// once clothes have been stolen, unblip the peds when the player moves away if he was undetected
|
|
IF eMissionStage = MISSION_STAGE_STEAL_CELEB_POSSESSIONS
|
|
UPDATE_AI_PED_BLIP(sGardenerPed.pedIndex, sGardenerPed.blipAIStruct)
|
|
ELSE
|
|
IF NOT bPlayerWasSpottedByGardener
|
|
IF ePlayerLocation = N1B_PLAYER_LOCATION_OUTSIDE_HOUSE_AREA
|
|
AND NOT IS_ENTITY_IN_RANGE_COORDS(sGardenerPed.pedIndex, vPlayerPos, 35.0)
|
|
// cleanup the blips if the player is a distance away AND wasn't detected by the gardener
|
|
CLEANUP_AI_PED_BLIP(sGardenerPed.blipAIStruct)
|
|
ELSE
|
|
UPDATE_AI_PED_BLIP(sGardenerPed.pedIndex, sGardenerPed.blipAIStruct)
|
|
ENDIF
|
|
ELSE
|
|
UPDATE_AI_PED_BLIP(sGardenerPed.pedIndex, sGardenerPed.blipAIStruct)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF IS_ENTITY_ALIVE(moGardnerVanProps[NIGEL1B_PROP_GARDENER_LEAF_BLOWER].object)
|
|
AND IS_ENTITY_ATTACHED_TO_ANY_PED(moGardnerVanProps[NIGEL1B_PROP_GARDENER_LEAF_BLOWER].object)
|
|
DETACH_ENTITY(moGardnerVanProps[NIGEL1B_PROP_GARDENER_LEAF_BLOWER].object)
|
|
ENDIF
|
|
IF NOT HAS_SOUND_FINISHED(iSoundID_WhistlingGardener)
|
|
STOP_SOUND(iSoundID_WhistlingGardener)
|
|
ENDIF
|
|
IF NOT bDoneDialogueGarden_TrevorKillsGardener
|
|
IF ePlayerLocation = N1B_PLAYER_LOCATION_GARDEN_AREA
|
|
AND NOT GET_PED_STEALTH_MOVEMENT(PLAYER_PED_ID()) // fix bug 1050318 - player shouldn't talk when in stealth
|
|
IF eGardenAreaState = N1B_GARDEN_AREA_STATE_INFORM_POOL_AREA //Only play this dialogue if the gardener had spotted the player dialogue has played and he's off to tell the pool peds
|
|
OR bDoneDialogueGardener_Spotted //or gardener had said he would tell the celeb
|
|
IF NIG1B_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG1BAU", "NIG1B_GK", CONV_PRIORITY_MEDIUM) //, DO_NOT_DISPLAY_SUBTITLES)
|
|
// Nobody likes a tell-tale.
|
|
bDoneDialogueGarden_TrevorKillsGardener = TRUE
|
|
ENDIF
|
|
ELSE
|
|
bDoneDialogueGarden_TrevorKillsGardener = TRUE
|
|
ENDIF
|
|
ELSE
|
|
bDoneDialogueGarden_TrevorKillsGardener = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
IF eGardenAreaState != N1B_GARDEN_AREA_STATE_GARDENER_DEAD
|
|
IF DOES_ENTITY_EXIST(sGardenerPed.pedIndex)
|
|
IF WAS_PED_KILLED_BY_STEALTH(sGardenerPed.pedIndex) // some reason stealth kills fail the following two checks
|
|
INFORM_STAT_SYSTEM_OF_BOOL_STAT_HAPPENED(NI1B_GARDENER_TAKEN_OUT)
|
|
REPLAY_RECORD_BACK_FOR_TIME(2.5, 2.0, REPLAY_IMPORTANCE_LOWEST) // B*1880376 - record gardener knockout
|
|
CPRINTLN(DEBUG_MISSION, "MANAGE_GARDEN_AREA_STATE - set stealth kill check - INFORM_STAT_SYSTEM_OF_BOOL_STAT_HAPPENED(NI1B_GARDENER_TAKEN_OUT)")
|
|
ELIF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(sGardenerPed.pedIndex, PLAYER_PED_ID(), TRUE)
|
|
INFORM_STAT_SYSTEM_OF_BOOL_STAT_HAPPENED(NI1B_GARDENER_TAKEN_OUT)
|
|
REPLAY_RECORD_BACK_FOR_TIME(2.5, 2.0, REPLAY_IMPORTANCE_LOWEST) // B*1880376 - record gardener knockout
|
|
CPRINTLN(DEBUG_MISSION, "MANAGE_GARDEN_AREA_STATE - set entity damaged by entity - INFORM_STAT_SYSTEM_OF_BOOL_STAT_HAPPENED(NI1B_GARDENER_TAKEN_OUT)")
|
|
ELSE
|
|
// second chance test source of death (this doesn't work if you cause van to explode which causes ped to die
|
|
ENTITY_INDEX entityDeathSource = GET_PED_SOURCE_OF_DEATH(sGardenerPed.pedIndex)
|
|
IF DOES_ENTITY_EXIST(entityDeathSource)
|
|
IF IS_ENTITY_A_PED(entityDeathSource)
|
|
IF GET_PED_INDEX_FROM_ENTITY_INDEX(entityDeathSource) = PLAYER_PED_ID()
|
|
INFORM_STAT_SYSTEM_OF_BOOL_STAT_HAPPENED(NI1B_GARDENER_TAKEN_OUT)
|
|
REPLAY_RECORD_BACK_FOR_TIME(2.5, 2.0, REPLAY_IMPORTANCE_LOWEST) // B*1880376 - record gardener knockout
|
|
CPRINTLN(DEBUG_MISSION, "MANAGE_GARDEN_AREA_STATE - set source of death - INFORM_STAT_SYSTEM_OF_BOOL_STAT_HAPPENED(NI1B_GARDENER_TAKEN_OUT)")
|
|
ELSE
|
|
CPRINTLN(DEBUG_MISSION, "MANAGE_GARDEN_AREA_STATE - dead! source of death a ped but not player")
|
|
ENDIF
|
|
ELSE
|
|
CPRINTLN(DEBUG_MISSION, "MANAGE_GARDEN_AREA_STATE - dead! source of death not a ped")
|
|
ENDIF
|
|
ELSE
|
|
CPRINTLN(DEBUG_MISSION, "MANAGE_GARDEN_AREA_STATE - dead! source of death doesn't exist")
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
IF eGardenAreaState != N1B_GARDEN_AREA_STATE_UNDETECTED // set flag for player having been spotted
|
|
bPlayerWasSpottedByGardener = TRUE
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_GARDEN_AREA_STATE - bPlayerWasSpottedByGardener = TRUE") ENDIF #ENDIF
|
|
ENDIF
|
|
sGardenerPed.AI = N1B_PED_AI_STATE_DEAD
|
|
CLEANUP_AI_PED_BLIP(sGardenerPed.blipAIStruct)
|
|
eGardenAreaState = N1B_GARDEN_AREA_STATE_GARDENER_DEAD
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_GARDEN_AREA_STATE - eGardenAreaState set N1B_GARDEN_AREA_STATE_GARDENER_DEAD") ENDIF #ENDIF
|
|
ENDIF
|
|
//remove gardener from dialogue if he's dead / injured
|
|
//REMOVE_PED_FOR_DIALOGUE(sDialogue, 4) // "GARDENER"
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Handles call to MISSION_CLEANUP and terminates the thread
|
|
PROC Script_Cleanup()
|
|
// If the mission was triggered then additional mission cleanup will be required.
|
|
IF (Random_Character_Cleanup_If_Triggered())
|
|
PRINTSTRING("...Random Character Script was triggered so additional cleanup required") PRINTNL()
|
|
MISSION_CLEANUP()
|
|
ENDIF
|
|
//Cleanup the scene created by the launcher
|
|
RC_CleanupSceneEntities(sRCLauncherDataLocal)
|
|
TERMINATE_THIS_THREAD()
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Mission Passed
|
|
PROC Script_Passed()
|
|
CPRINTLN(DEBUG_MISSION, "Script_Passed")
|
|
SAFE_FADE_SCREEN_IN_FROM_BLACK()
|
|
Random_Character_Passed(CP_RAND_C_NIG1B)
|
|
Script_Cleanup()
|
|
ENDPROC
|
|
|
|
/// 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()
|
|
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_MISSION_PASSED
|
|
UPDATE_FAIL_REASON()
|
|
IF eN1B_MissionFailedReason <> FAILED_DEFAULT
|
|
SET_STAGE(MISSION_STAGE_MISSION_FAILED_WAIT_FOR_FADE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Jumps the mission to the next stage in the script
|
|
PROC SKIP_STAGE()
|
|
IF IS_PED_UNINJURED(PLAYER_PED_ID())
|
|
//implement switch statement based of eMissionStage
|
|
//which takes care of cleanup and setup for next stage.
|
|
N1B_KILL_CURRENT_CONVERSATION(TRUE)
|
|
CLEAR_PRINTS()
|
|
SWITCH eMissionStage
|
|
// ------------------------------------------
|
|
CASE MISSION_STAGE_STEAL_CELEB_POSSESSIONS
|
|
IF eSubStage = SS_UPDATE //in script skips where we change the eSubStage, need to safe guard that the SS_SETUP has already had chance to run.
|
|
SAFE_REMOVE_BLIP(mpClothesPickup.blipIndex)
|
|
SAFE_REMOVE_PICKUP(mpClothesPickup.index)
|
|
IF Is_Replay_In_Progress() // setup if it's a replay with next stage beign the checkpoint
|
|
AND GET_REPLAY_MID_MISSION_STAGE() = CP_NIGEL1B_ITEMS_STOLEN_LEAVE_THE_AREA
|
|
SET_GARDEN_AREA_STATE(INT_TO_ENUM(N1B_GARDEN_AREA_STATE, g_replay.iReplayInt[NIGEL1B_REPLAY_GARDENER_STATE]))
|
|
SET_POOL_AREA_STATE(INT_TO_ENUM(N1B_POOL_AREA_STATE, g_replay.iReplayInt[NIGEL1B_REPLAY_POOL_PED_STATE]))
|
|
IF eGardenAreaState = N1B_GARDEN_AREA_STATE_INFORM_POOL_AREA
|
|
AND ePoolAreaState = N1B_POOL_AREA_STATE_GARDENER_INTERRUPTED
|
|
//teleport gardener to the pool area as he must of reached it in the previous playthrough
|
|
SAFE_TELEPORT_PED(sGardenerPed.pedIndex, << -1050.3589, 354.0594, 68.9132 >>, 38.0338)
|
|
sGardenerPed.AI = N1B_PED_AI_SETUP_WARN_OTHER_PEDS
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SKIP_STAGE : ", "MISSION_STAGE_STEAL_CELEB_POSSESSIONS : ", "* Replay checkpoint * - ",
|
|
"set gardener in pool area informing peds", " FC : ", GET_FRAME_COUNT()) ENDIF #ENDIF
|
|
ELIF eGardenAreaState = N1B_GARDEN_AREA_STATE_GARDENER_DEAD
|
|
sGardenerPed.AI = N1B_PED_AI_STATE_DEAD
|
|
SAFE_REMOVE_PED(sGardenerPed.pedIndex, TRUE) // don't respawn dead gardener, just delete gardener if he was killed on previous playthrough
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SKIP_STAGE : ", "MISSION_STAGE_STEAL_CELEB_POSSESSIONS : ", "* Replay checkpoint * - ",
|
|
"gardener set dead", " FC : ", GET_FRAME_COUNT()) ENDIF #ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
IF NOT IS_REPLAY_BEING_SET_UP()
|
|
SAFE_TELEPORT_PED(PLAYER_PED_ID(), << -1045.0170, 367.3012, 68.9128 >>, 103.7010)
|
|
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_ITEMS_STOLEN_LEAVE_THE_AREA
|
|
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_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SKIP_STAGE : ", "MISSION_STAGE_STEAL_CELEB_POSSESSIONS : ", "LOADED WORLD", " FC : ", GET_FRAME_COUNT()) ENDIF #ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
IF ePoolAreaState = N1B_POOL_AREA_STATE_UNDETECTED // setup the timer till we switch pool states to N1B_POOL_AREA_STATE_CELEB_LOOKING_FOR_CLOTHES
|
|
bDoSwitch_PoolStateTo_CelebLookingForClothes = TRUE
|
|
iTimer_PoolStateTo_CelebLookingForClothes = GET_GAME_TIMER()
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SKIP_STAGE : ", "MISSION_STAGE_STEAL_CELEB_POSSESSIONS : ", "setup timer till celeb looks for clothes", " FC : ", GET_FRAME_COUNT()) ENDIF #ENDIF
|
|
ENDIF
|
|
RESET_MISSION_PED_TIMERS()
|
|
eSubStage = SS_CLEANUP
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SKIP_STAGE : ", "MISSION_STAGE_STEAL_CELEB_POSSESSIONS : ", " FC : ", GET_FRAME_COUNT()) ENDIF #ENDIF
|
|
ENDIF
|
|
BREAK
|
|
// ------------------------------------------
|
|
CASE MISSION_STAGE_ITEMS_STOLEN_LEAVE_THE_AREA
|
|
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.
|
|
RESET_MISSION_PED_TIMERS()
|
|
IF NOT IS_REPLAY_BEING_SET_UP()
|
|
SAFE_TELEPORT_PED(PLAYER_PED_ID(), << -462.2575, -156.7884, 37.0458 >>, 112.5754, FALSE, FALSE)
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0)
|
|
WAIT(0)
|
|
// load world if target stage is the next one
|
|
IF bLoadedWorldForStageSkipping = FALSE
|
|
IF eMissionSkipTargetStage = MISSION_STAGE_ITEMS_STOLEN_PLAYER_LEFT_THE_AREA
|
|
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_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SKIP_STAGE : ", "MISSION_STAGE_ITEMS_STOLEN_LEAVE_THE_AREA : ", "LOADED WORLD", " FC : ", GET_FRAME_COUNT()) ENDIF #ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SKIP_STAGE : ", "MISSION_STAGE_ITEMS_STOLEN_LEAVE_THE_AREA : ", " FC : ", GET_FRAME_COUNT()) ENDIF #ENDIF
|
|
ENDIF
|
|
BREAK
|
|
// ------------------------------------------
|
|
CASE MISSION_STAGE_ITEMS_STOLEN_PLAYER_LEFT_THE_AREA
|
|
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.
|
|
RESET_MISSION_PED_TIMERS()
|
|
N1B_KILL_CURRENT_CONVERSATION(FALSE)
|
|
bDoneDialogue_ItemsStolenPlayerLeftTheArea = TRUE
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SKIP_STAGE : ", "MISSION_STAGE_ITEMS_STOLEN_PLAYER_LEFT_THE_AREA : ", " FC : ", GET_FRAME_COUNT()) ENDIF #ENDIF
|
|
ENDIF
|
|
BREAK
|
|
// ------------------------------------------
|
|
CASE MISSION_STAGE_OUTRO_PHONECALL
|
|
IF IS_PHONE_ONSCREEN(FALSE)
|
|
HANG_UP_AND_PUT_AWAY_PHONE(FALSE)
|
|
ENDIF
|
|
IF NOT bHasOutroPhonecallSucceeded
|
|
eSubStage = SS_CLEANUP
|
|
ELSE
|
|
//needed to stop the outgoing phonecalls!!!
|
|
WHILE IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
N1B_KILL_CURRENT_CONVERSATION(FALSE, TRUE)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SKIP_STAGE : ", "MISSION_STAGE_OUTRO_PHONECALL : ", " killing ongoing convo", " FC : ", GET_FRAME_COUNT()) ENDIF #ENDIF
|
|
WAIT(0)
|
|
ENDWHILE
|
|
ENDIF
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SKIP_STAGE : ", "MISSION_STAGE_OUTRO_PHONECALL : ", " FC : ", GET_FRAME_COUNT()) 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())
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SKIP_STAGE : ", "MISSION_STAGE_LOSE_THE_COPS : ", " FC : ", GET_FRAME_COUNT()) ENDIF #ENDIF
|
|
ENDIF
|
|
BREAK
|
|
DEFAULT
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Jumps to the stage selected
|
|
/// PARAMS:
|
|
/// eNewStage - stage to skip to
|
|
PROC JUMP_TO_STAGE(MISSION_STAGE eNewStage)
|
|
// skip current stage
|
|
IF eMissionStage = eNewStage
|
|
IF IS_REPLAY_BEING_SET_UP()
|
|
END_REPLAY_SETUP(NULL, DEFAULT, FALSE)
|
|
ENDIF
|
|
RC_END_Z_SKIP()
|
|
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_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)
|
|
WHILE NOT SAFE_TRIGGER_MISSION_MUSIC_EVENT("NIGEL1B_MISSION_FAIL")
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "RESET_MISSION - killing music cues") ENDIF #ENDIF
|
|
WAIT(0)
|
|
ENDWHILE
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
|
|
IF NOT IS_REPLAY_BEING_SET_UP()
|
|
SAFE_TELEPORT_PED(PLAYER_PED_ID(), vPos_PlayerMissionStart, fHeading_PlayerMissionStart, TRUE, TRUE) //setup player position for restart mission
|
|
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
|
|
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
|
|
ENDIF
|
|
ENDIF
|
|
SET_AUDIO_FLAG("AllowScoreAndRadio", TRUE)
|
|
SAFE_TRIGGER_MISSION_MUSIC_EVENT("NIGEL1B_MISSION_FAIL")
|
|
WHILE IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
N1B_KILL_CURRENT_CONVERSATION(FALSE, TRUE)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "RESET_MISSION - ATTEMPTTING TO KILL OUTRO PHONECALL FOR SKIP") ENDIF #ENDIF
|
|
WAIT(0)
|
|
ENDWHILE
|
|
NIG1B_STOP_CHECKING_CONVERSATION_AND_OBJECTIVE_TEXT_CONFLICT(tSavedConversationRoot, tSavedConversationLabel)
|
|
WAIT(0) // added one frame wait so doors being registered in INIT_MISSION() aren't the same frame as MISSION_CLEANUP()
|
|
|
|
/*//set the initial scene back up
|
|
eInitialSceneStage = IS_REQUEST_SCENE
|
|
WHILE NOT SetupScene_NIGEL_1B(sRCLauncherDataLocal)
|
|
CPRINTLN(DEBUG_MISSION, " RESET_MISSION - waiting on SetupScene_NIGEL_1B")
|
|
WAIT(0)
|
|
ENDWHILE
|
|
RC_SET_ENTITY_PROOFS_FOR_CUTSCENE(sRCLauncherDataLocal, FALSE)
|
|
RC_TakeEntityOwnership(sRCLauncherDataLocal)
|
|
SETUP_AREA_FOR_MISSION(RC_NIGEL_1B, FALSE) // need to turn this off in this instance since launcher cleanup won't get called to do it
|
|
*/
|
|
//re do mission initialization
|
|
INIT_MISSION()
|
|
SET_STAGE(MISSION_STAGE_STEAL_CELEB_POSSESSIONS)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "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_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "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_STEAL_CELEB_POSSESSIONS
|
|
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
|
|
SAFE_TELEPORT_PED(PLAYER_PED_ID(), vPos_PlayerMissionStart, fHeading_PlayerMissionStart, TRUE, TRUE) //setup player position for restart mission
|
|
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_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "DO_Z_SKIP - LOADED WORLD ready at mission start area framecount : ", GET_FRAME_COUNT()) ENDIF #ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
JUMP_TO_STAGE(eMissionSkipTargetStage)
|
|
ENDPROC
|
|
|
|
//-------------------------------------------------------------------------------------------------------------------------------------------------
|
|
// DEBUG - J,P and Z skip stuff
|
|
//-------------------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
|
|
// PURPOSE: Check for Forced Pass or Fail
|
|
PROC DEBUG_Check_Debug_Keys()
|
|
|
|
INT iNewStage
|
|
IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_S)) // Check for Pass
|
|
WAIT_FOR_CUTSCENE_TO_STOP()
|
|
IF IS_PED_UNINJURED(sGardenerPed.pedIndex)
|
|
IF IS_PED_IN_MELEE_COMBAT(sGardenerPed.pedIndex) // clear ped tasks doesn't work ons a ped in combat :(
|
|
CLEAR_PED_TASKS_IMMEDIATELY(sGardenerPed.pedIndex)
|
|
ELSE
|
|
CLEAR_PED_TASKS(sGardenerPed.pedIndex)
|
|
ENDIF
|
|
SET_PED_KEEP_TASK(sGardenerPed.pedIndex, FALSE)
|
|
sGardenerPed.AI = N1B_PED_AI_STATE_RELAXED
|
|
ENDIF
|
|
INT i
|
|
FOR i = 0 TO (TOTAL_POOL_PEDS - 1)
|
|
IF IS_PED_UNINJURED(sPoolPed[i].pedIndex)
|
|
IF IS_PED_IN_MELEE_COMBAT(sPoolPed[i].pedIndex) // clear ped tasks doesn't work on a ped in combat :(
|
|
CLEAR_PED_TASKS_IMMEDIATELY(sPoolPed[i].pedIndex)
|
|
ELSE
|
|
CLEAR_PED_TASKS(sPoolPed[i].pedIndex)
|
|
ENDIF
|
|
SET_PED_KEEP_TASK(sPoolPed[i].pedIndex, FALSE)
|
|
sPoolPed[i].AI = N1B_PED_AI_STATE_RELAXED
|
|
ENDIF
|
|
ENDFOR
|
|
IF IS_PED_UNINJURED(PLAYER_PED_ID())
|
|
CLEAR_PED_TASKS(PLAYER_PED_ID())
|
|
ENDIF
|
|
iMissionMusicEventTriggerCounter = NIGEL1B_MUSIC_EVENT_COPS_LOST
|
|
SET_AUDIO_FLAG("AllowScoreAndRadio", TRUE)
|
|
SAFE_TRIGGER_MISSION_MUSIC_EVENT("NIGEL1B_MISSION_FAIL")
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "S SKIP") ENDIF #ENDIF
|
|
Script_Passed()
|
|
ENDIF
|
|
IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_F)) // Check for Fail
|
|
WAIT_FOR_CUTSCENE_TO_STOP()
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "F SKIP") ENDIF #ENDIF
|
|
SET_STAGE(MISSION_STAGE_MISSION_FAILED_WAIT_FOR_FADE)
|
|
ENDIF
|
|
IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_J)) // Check for Skip forward
|
|
SWITCH eMissionStage
|
|
CASE MISSION_STAGE_LOSE_THE_COPS
|
|
iNewStage = ENUM_TO_INT(MISSION_STAGE_OUTRO_PHONECALL)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "PRE STAGE, FROM LOSE COPS int = ", iNewStage) ENDIF #ENDIF
|
|
BREAK
|
|
DEFAULT
|
|
iNewStage = ENUM_TO_INT(eMissionStage) + 1
|
|
BREAK
|
|
ENDSWITCH
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "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
|
|
IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_P)) // Check for Skip backwards
|
|
SWITCH eMissionStage
|
|
CASE MISSION_STAGE_LOSE_THE_COPS
|
|
iNewStage = ENUM_TO_INT(MISSION_STAGE_ITEMS_STOLEN_PLAYER_LEFT_THE_AREA)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "PRE STAGE, FROM LOSE COPS int = ", iNewStage) ENDIF #ENDIF
|
|
BREAK
|
|
DEFAULT
|
|
iNewStage = ENUM_TO_INT(eMissionStage)-1
|
|
BREAK
|
|
ENDSWITCH
|
|
IF iNewStage > -1
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "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
|
|
IF eMissionStage = MISSION_STAGE_LOSE_THE_COPS // additional stages dealt seperately since they sit at the end of the MISSION_STAGE enum
|
|
IF (iNewStage = ENUM_TO_INT(MISSION_STAGE_OUTRO_PHONECALL)) // trying to z skip past lose cops so don't reset mission
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "Z SKIP : new stage = ", iNewStage, " ResetMission = ", FALSE) ENDIF #ENDIF
|
|
DO_Z_SKIP(iNewStage, FALSE)
|
|
ELSE
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "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_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "Z SKIP : new stage = ", iNewStage, " ResetMission = ", TRUE) ENDIF #ENDIF
|
|
DO_Z_SKIP(iNewStage, TRUE)
|
|
ELSE
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "Z SKIP : new stage = ", iNewStage, " ResetMission = ", FALSE) ENDIF #ENDIF
|
|
DO_Z_SKIP(iNewStage, FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
#ENDIF
|
|
|
|
//-------------------------------------------------------------------------------------------------------------------------------------------------
|
|
// :MISSION STAGES
|
|
//-------------------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
/*PURPOSE: When Player has celeb's clothes, go onto next stage.
|
|
If Player gets in a vehicle again, they can't get the diary, tell them to get out*/
|
|
PROC STAGE_STEAL_CELEB_POSSESSIONS()
|
|
|
|
vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
|
|
CHECK_AND_UPDATE_PLAYER_LOCATION()
|
|
CHECK_AND_UPDATE_PLAYER_WANTED_LEVEL()
|
|
UPDATE_PLAYER_MOVEMENT_STATE(FALSE) // used in the ped detection system. updated each frame
|
|
MANAGE_POOL_AREA_STATE()
|
|
MANAGE_GARDEN_AREA_STATE()
|
|
DETACH_PROPS_INSIDE_GARDENER_VEHICLE()
|
|
MONITOR_PLAYER_BARGE_DOOR_AT_HOUSE()
|
|
|
|
SWITCH eSubStage
|
|
// ------------------------------------------
|
|
CASE SS_SETUP
|
|
CREATE_CELEB_POSSESSION_BLIPS()
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
ADD_PED_FOR_DIALOGUE(sDialogue, 2, PLAYER_PED_ID(), "TREVOR")
|
|
//SET_PED_RESET_FLAG(PLAYER_PED_ID(), PRF_SuppressLethalMeleeActions)
|
|
ENDIF
|
|
IF IS_ENTITY_ALIVE(sGardenerPed.pedIndex)
|
|
ADD_PED_FOR_DIALOGUE(sDialogue, 4, sGardenerPed.pedIndex, "Nigel1BGardener01")
|
|
ENDIF
|
|
IF IS_ENTITY_ALIVE(sPoolPed[POOL_PED_CELEB].pedIndex)
|
|
ADD_PED_FOR_DIALOGUE(sDialogue, 5, sPoolPed[POOL_PED_CELEB].pedIndex, "Nigel1BCelebMale01")
|
|
ENDIF
|
|
IF IS_ENTITY_ALIVE(sPoolPed[POOL_PED_FEMALE].pedIndex)
|
|
ADD_PED_FOR_DIALOGUE(sDialogue, 6, sPoolPed[POOL_PED_FEMALE].pedIndex, "Nigel1BCelebFemale01")
|
|
ENDIF
|
|
|
|
REPLAY_RECORD_BACK_FOR_TIME(3.0, 10.0, REPLAY_IMPORTANCE_LOW)
|
|
|
|
PRINT_NOW("NIG1B_OBJ_01", DEFAULT_GOD_TEXT_TIME, 0) // Steal Tyler Dixon's ~g~clothes.~s~
|
|
NIG1B_CHECK_OBJECTIVE_TEXT_OVERWRITE_ONGOING_CONVERSATION_CONFLICT_NOW()
|
|
//clothes sound sfx PUT A REQUEST TO LOAD BANK
|
|
REQUEST_SCRIPT_AUDIO_BANK("NIGEL_1B_CLOTHES")
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET STEALTH MOVEMENTS ON PLAYER") //DONT SEEM TO DO ANYTHING? #ENDIF
|
|
//SET_PED_STEALTH_MOVEMENT(PLAYER_PED_ID(), TRUE)
|
|
IF bFinishedStageSkipping
|
|
SAFE_FADE_SCREEN_IN_FROM_BLACK(DEFAULT_FADE_TIME, FALSE) // backup fade in, NEEDED for repeat play purposes.
|
|
ENDIF
|
|
eSubStage = SS_UPDATE
|
|
CPRINTLN(DEBUG_MISSION, "STAGE_STEAL_CELEB_POSSESSIONS - SS_SETUP done")
|
|
BREAK
|
|
// ------------------------------------------
|
|
CASE SS_UPDATE
|
|
// stop the anim task on the van (gets applied in the initial scene / init mission
|
|
IF NOT bStoppedGardenerVanAnim
|
|
IF IS_ENTITY_ALIVE(vehGardenerVehicle)
|
|
IF IS_ENTITY_PLAYING_ANIM(vehGardenerVehicle, "rcmnigel1b", "idle_speedo")
|
|
STOP_ENTITY_ANIM(vehGardenerVehicle, "idle_speedo", "rcmnigel1b", REALLY_SLOW_BLEND_OUT)
|
|
bStoppedGardenerVanAnim = TRUE
|
|
CPRINTLN(DEBUG_MISSION, GET_THIS_SCRIPT_NAME(), " : STAGE_STEAL_CELEB_POSSESSIONS() : stopped van sync anim")
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
//Check for player collecting celeb possession
|
|
IF HAS_PICKUP_BEEN_COLLECTED(mpClothesPickup.index) // pickup_Index setup - don't check pickup exists though
|
|
|
|
REPLAY_RECORD_BACK_FOR_TIME(10.0, 10.0, REPLAY_IMPORTANCE_LOW)
|
|
|
|
IF ePoolAreaState <> N1B_POOL_AREA_STATE_UNDETECTED
|
|
AND ePoolAreaState <> N1B_POOL_AREA_STATE_CELEB_LOOKING_FOR_CLOTHES
|
|
iTimer_TimeWindowForSpottedStealingClothesDialogue = GET_GAME_TIMER() // limited window to say the spotted stealing clothes dialogue
|
|
ENDIF
|
|
// setup the timer till we switch pool states to N1B_POOL_AREA_STATE_CELEB_LOOKING_FOR_CLOTHES
|
|
IF ePoolAreaState = N1B_POOL_AREA_STATE_UNDETECTED
|
|
bDoSwitch_PoolStateTo_CelebLookingForClothes = TRUE
|
|
iTimer_PoolStateTo_CelebLookingForClothes = GET_GAME_TIMER()
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "setup timer till celeb looks for clothes ") ENDIF #ENDIF
|
|
ENDIF
|
|
SAFE_REMOVE_BLIP(mpClothesPickup.blipIndex)
|
|
SAFE_REMOVE_PICKUP(mpClothesPickup.index)
|
|
REPLAY_RECORD_BACK_FOR_TIME(3.0, 2.0, REPLAY_IMPORTANCE_LOWEST) // B*1880376 - record collecting the clothes
|
|
CPRINTLN(DEBUG_MISSION, " : STAGE_STEAL_CELEB_POSSESSIONS : clothes pickup Collected , heading to SS_CLEANUP ")
|
|
eSubStage = SS_CLEANUP
|
|
ENDIF
|
|
BREAK
|
|
// ------------------------------------------
|
|
CASE SS_CLEANUP
|
|
SAFE_REMOVE_BLIP(mpClothesPickup.blipIndex)
|
|
SAFE_REMOVE_PICKUP(mpClothesPickup.index)
|
|
IF IS_THIS_PRINT_BEING_DISPLAYED("NIG1B_OBJ_01")
|
|
CLEAR_THIS_PRINT("NIG1B_OBJ_01") // Steal Tyler Dixon's ~g~clothes.~s~
|
|
ENDIF
|
|
|
|
// stop the anim task on the van (gets applied in the initial scene / init mission
|
|
IF NOT bStoppedGardenerVanAnim
|
|
IF IS_ENTITY_ALIVE(vehGardenerVehicle)
|
|
IF IS_ENTITY_PLAYING_ANIM(vehGardenerVehicle, "rcmnigel1b", "idle_speedo")
|
|
STOP_ENTITY_ANIM(vehGardenerVehicle, "idle_speedo", "rcmnigel1b", REALLY_SLOW_BLEND_OUT)
|
|
bStoppedGardenerVanAnim = TRUE
|
|
CPRINTLN(DEBUG_MISSION, GET_THIS_SCRIPT_NAME(), " : STAGE_STEAL_CELEB_POSSESSIONS() : stopped van sync anim")
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// moved here to ensure they still get set if we are heading to lose cops state instead
|
|
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CP_NIGEL1B_ITEMS_STOLEN_LEAVE_THE_AREA, "Leave the area", TRUE) // 1st Mission replay checkpoint
|
|
g_replay.iReplayInt[NIGEL1B_REPLAY_GARDENER_STATE] = ENUM_TO_INT(eGardenAreaState)
|
|
g_replay.iReplayInt[NIGEL1B_REPLAY_POOL_PED_STATE] = ENUM_TO_INT(ePoolAreaState)
|
|
|
|
// Bug fix 1050386 - if player already has wanted level just say lose cops instead of leave area, since wanted level won't drop in the area
|
|
IF IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
|
|
bDoneDialogue_PlayerAcknowledgesCops = TRUE //don't make the cop comment if player already has the wanted level
|
|
//Player already wanted so go to lose the cops stage
|
|
CPRINTLN(DEBUG_MISSION, "STAGE_STEAL_CELEB_POSSESSIONS - SS_CLEANUP player already has a wanted level")
|
|
SET_STAGE(MISSION_STAGE_LOSE_THE_COPS)
|
|
ELSE
|
|
SET_STAGE(MISSION_STAGE_ITEMS_STOLEN_LEAVE_THE_AREA)
|
|
CPRINTLN(DEBUG_MISSION, "STAGE_STEAL_CELEB_POSSESSIONS - SS_CLEANUP done")
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
NIG1B_HANDLE_CONVERSATION_AND_OBJECTIVE_TEXT_CONFLICT(sDialogue, "NIG1BAU", tSavedConversationRoot, tSavedConversationLabel)
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Player has to leave the pool area before the mission can be passed
|
|
PROC STAGE_ITEMS_STOLEN_LEAVE_THE_AREA()
|
|
|
|
vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
|
|
CHECK_AND_UPDATE_PLAYER_LOCATION()
|
|
CHECK_AND_UPDATE_PLAYER_WANTED_LEVEL()
|
|
MONITOR_TRIGGER_MISSION_MUSIC_EVENTS()
|
|
UPDATE_PLAYER_MOVEMENT_STATE(FALSE) // used in the ped detection system. updated each frame
|
|
MANAGE_POOL_AREA_STATE()
|
|
MANAGE_GARDEN_AREA_STATE()
|
|
DETACH_PROPS_INSIDE_GARDENER_VEHICLE()
|
|
|
|
SWITCH eSubStage
|
|
// ------------------------------------------
|
|
CASE SS_SETUP
|
|
// Bug fix 1050386 - if player already has wanted level just say lose cops instead of leave area
|
|
IF IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
|
|
eSubStage = SS_CLEANUP
|
|
CPRINTLN(DEBUG_MISSION, "STAGE_ITEMS_STOLEN_LEAVE_THE_AREA - SS_SETUP player already has a wanted level > SS_CLEANUP")
|
|
ELSE
|
|
PRINT_NOW("NIG1B_OBJ_03", 10000, 0) // Leave the area.~s~ B*1583984 increase display time from DEFAULT_GOD_TEXT_TIME (7500)
|
|
NIG1B_CHECK_OBJECTIVE_TEXT_OVERWRITE_ONGOING_CONVERSATION_CONFLICT_NOW()
|
|
eSubStage = SS_UPDATE
|
|
CPRINTLN(DEBUG_MISSION, "STAGE_ITEMS_STOLEN_LEAVE_THE_AREA - SS_SETUP done")
|
|
ENDIF
|
|
BREAK
|
|
// ------------------------------------------
|
|
CASE SS_UPDATE
|
|
//Check for player leaving area
|
|
IF NOT IS_COORD_IN_RANGE_OF_COORD(vPlayerPos, vCelebritiesHouse_CentralPoint, NIGEL1B_DIST_PLAYER_LEAVES_THE_HOUSE_AREA)
|
|
OR IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0) // Bug fix 1050386 - if player already has wanted level just say lose cops instead of leave area
|
|
eSubStage = SS_CLEANUP
|
|
ENDIF
|
|
BREAK
|
|
// ------------------------------------------
|
|
CASE SS_CLEANUP
|
|
IF IS_THIS_PRINT_BEING_DISPLAYED("NIG1B_OBJ_03")
|
|
CLEAR_THIS_PRINT("NIG1B_OBJ_03") //leave the area
|
|
ENDIF
|
|
// Bug fix 1050386 - if player already has wanted level just say lose cops instead of leave area, since wanted level won't drop in the area
|
|
IF IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
|
|
//Player already wanted so go to lose the cops stage
|
|
CPRINTLN(DEBUG_MISSION, "STAGE_ITEMS_STOLEN_LEAVE_THE_AREA - SS_CLEANUP player already has a wanted level")
|
|
SET_STAGE(MISSION_STAGE_LOSE_THE_COPS)
|
|
ELSE
|
|
SET_STAGE(MISSION_STAGE_ITEMS_STOLEN_PLAYER_LEFT_THE_AREA)
|
|
CPRINTLN(DEBUG_MISSION, "STAGE_ITEMS_STOLEN_LEAVE_THE_AREA - SS_CLEANUP done")
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
NIG1B_HANDLE_CONVERSATION_AND_OBJECTIVE_TEXT_CONFLICT(sDialogue, "NIG1BAU", tSavedConversationRoot, tSavedConversationLabel)
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Player has left the pool area, triggers dialogue for Trevor
|
|
/// and detects if he needs to lose a wanted level bef
|
|
/// ore Mission Passed
|
|
PROC STAGE_ITEMS_STOLEN_PLAYER_LEFT_THE_AREA()
|
|
|
|
vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
|
|
CHECK_AND_UPDATE_PLAYER_LOCATION()
|
|
CHECK_AND_UPDATE_PLAYER_WANTED_LEVEL()
|
|
MONITOR_TRIGGER_MISSION_MUSIC_EVENTS()
|
|
UPDATE_PLAYER_MOVEMENT_STATE(FALSE) // used in the ped detection system. updated each frame
|
|
MANAGE_POOL_AREA_STATE()
|
|
MANAGE_GARDEN_AREA_STATE()
|
|
DETACH_PROPS_INSIDE_GARDENER_VEHICLE()
|
|
// clean up the audio scene when the player leaves the area after collecting the pickup
|
|
IF IS_AUDIO_SCENE_ACTIVE("NIGEL_1B_MAIN_MIX")
|
|
IF ePlayerLocation != N1B_PLAYER_LOCATION_POOL_AREA
|
|
AND ePlayerLocation != N1B_PLAYER_LOCATION_GARDEN_AREA
|
|
STOP_AUDIO_SCENE("NIGEL_1B_MAIN_MIX")
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STAGE_ITEMS_STOLEN_PLAYER_LEFT_THE_AREA - stop active audio scene - ", "NIGEL_1B_MAIN_MIX") ENDIF #ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SWITCH eSubStage
|
|
// ------------------------------------------
|
|
CASE SS_SETUP
|
|
//Setup which dialogue we want to play for the player leaving the area
|
|
IF ePoolAreaState <> N1B_POOL_AREA_STATE_UNDETECTED
|
|
AND ePoolAreaState <> N1B_POOL_AREA_STATE_CELEB_LOOKING_FOR_CLOTHES
|
|
sRoot_PlayerLeavesAreaDialogue = "NIG1B_DD"
|
|
// Why do these celebrities make such a drama about everything?
|
|
ELIF bPlayerWasSpottedByGardener
|
|
sRoot_PlayerLeavesAreaDialogue = "NIG1B_DDG"
|
|
// Almost stalking perfection. That gardener had to go and ruin it.
|
|
ELSE
|
|
sRoot_PlayerLeavesAreaDialogue = "NIG1B_DS"
|
|
// Who'd have thought it? Turns out I am a weapons-grade celebrity stalker.
|
|
INFORM_STAT_SYSTEM_OF_BOOL_STAT_HAPPENED(NI1B_CLOTHES_TAKEN_NO_ALERTS)
|
|
ENDIF
|
|
eSubStage = SS_UPDATE
|
|
CPRINTLN(DEBUG_MISSION, "STAGE_ITEMS_STOLEN_PLAYER_LEFT_THE_AREA - SS_SETUP done")
|
|
BREAK
|
|
// ------------------------------------------
|
|
CASE SS_UPDATE
|
|
//load assets used to create a cop car when applying the wanted level
|
|
IF NOT ARE_STRINGS_EQUAL(sRoot_PlayerLeavesAreaDialogue, "NIG1B_DS") //check we will be spawning cops
|
|
IF NOT (ARE_STRINGS_EQUAL(sRoot_PlayerLeavesAreaDialogue, "NIG1B_DDG") AND NOT IS_PED_UNINJURED(sGardenerPed.pedIndex)) //don't spawn cops if only gardener was alerted but killed
|
|
IF NOT HAS_COP_ASSETS_LOADED_FOR_APPLYING_WANTED_LEVEL()
|
|
REQUEST_COP_ASSETS_FOR_APPLYING_WANTED_LEVEL()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
IF bDoneDialogue_ItemsStolenPlayerLeftTheArea
|
|
IF NOT IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING(sRoot_PlayerLeavesAreaDialogue)
|
|
eSubStage = SS_CLEANUP
|
|
ENDIF
|
|
ELSE
|
|
N1B_KILL_CURRENT_CONVERSATION(FALSE)
|
|
IF NIG1B_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG1BAU", sRoot_PlayerLeavesAreaDialogue, CONV_PRIORITY_MEDIUM)
|
|
// sRoot_PlayerLeavesAreaDialogue is set in SS_SETUP
|
|
bDoneDialogue_ItemsStolenPlayerLeftTheArea = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
// ------------------------------------------
|
|
CASE SS_CLEANUP
|
|
IF IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0) //dplayer already has wanted level
|
|
bDoneDialogue_PlayerAcknowledgesCops = TRUE //don't make the cop comment if player already has the wanted level
|
|
//Player already wanted so go to lose the cops stage
|
|
CPRINTLN(DEBUG_MISSION, "STAGE_ITEMS_STOLEN_PLAYER_LEFT_THE_AREA - SS_CLEANUP player already has a wanted level")
|
|
SET_STAGE(MISSION_STAGE_LOSE_THE_COPS)
|
|
ELIF bHavePoolPedsCallTheCops //if pool peds already called the cops and player lost them earlier, don't reapply the cops
|
|
REMOVE_PED_FOR_DIALOGUE(sDialogue, 4) // Gardener
|
|
CPRINTLN(DEBUG_MISSION, "STAGE_ITEMS_STOLEN_PLAYER_LEFT_THE_AREA - SS_CLEANUP pool peds had already called cops and player lsot cops")
|
|
SET_STAGE(MISSION_STAGE_OUTRO_PHONECALL)
|
|
ELSE
|
|
//if player wasn't detected, and he doesn't currently have a wanted level. Go straight to mission passed
|
|
IF ARE_STRINGS_EQUAL(sRoot_PlayerLeavesAreaDialogue, "NIG1B_DS")
|
|
OR (ARE_STRINGS_EQUAL(sRoot_PlayerLeavesAreaDialogue, "NIG1B_DDG") AND NOT IS_PED_UNINJURED(sGardenerPed.pedIndex)) //don't do cops if only gardener was alerted but killed
|
|
REMOVE_PED_FOR_DIALOGUE(sDialogue, 4) // Gardener
|
|
CPRINTLN(DEBUG_MISSION, "STAGE_ITEMS_STOLEN_PLAYER_LEFT_THE_AREA - SS_CLEANUP player wasn't detected so going to outro phonecall")
|
|
SET_STAGE(MISSION_STAGE_OUTRO_PHONECALL)
|
|
ELSE // need to give player a wanted level in script
|
|
IF NOT HAS_COP_ASSETS_LOADED_FOR_APPLYING_WANTED_LEVEL()
|
|
REQUEST_COP_ASSETS_FOR_APPLYING_WANTED_LEVEL()
|
|
ENDIF
|
|
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 2)
|
|
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
|
|
bApplyWantedLevelInScript = TRUE
|
|
//Given player wanted level in script so, go to lose the cops stage
|
|
CPRINTLN(DEBUG_MISSION, "STAGE_ITEMS_STOLEN_PLAYER_LEFT_THE_AREA - SS_CLEANUP player wanted level set in script")
|
|
SET_STAGE(MISSION_STAGE_LOSE_THE_COPS)
|
|
ENDIF
|
|
ENDIF
|
|
CPRINTLN(DEBUG_MISSION, "STAGE_ITEMS_STOLEN_PLAYER_LEFT_THE_AREA - SS_CLEANUP done")
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
NIG1B_HANDLE_CONVERSATION_AND_OBJECTIVE_TEXT_CONFLICT(sDialogue, "NIG1BAU", tSavedConversationRoot, tSavedConversationLabel)
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Player has to lose the cops before the mission can pass
|
|
PROC STAGE_LOSE_THE_COPS()
|
|
|
|
vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
|
|
CHECK_AND_UPDATE_PLAYER_LOCATION()
|
|
CHECK_AND_UPDATE_PLAYER_WANTED_LEVEL()
|
|
MONITOR_TRIGGER_MISSION_MUSIC_EVENTS()
|
|
UPDATE_PLAYER_MOVEMENT_STATE(FALSE) // used in the ped detection system. updated each frame
|
|
MANAGE_POOL_AREA_STATE()
|
|
MANAGE_GARDEN_AREA_STATE()
|
|
DETACH_PROPS_INSIDE_GARDENER_VEHICLE()
|
|
// clean up the audio scene when the player leaves the area after collecting the pickup
|
|
IF IS_AUDIO_SCENE_ACTIVE("NIGEL_1B_MAIN_MIX")
|
|
IF ePlayerLocation != N1B_PLAYER_LOCATION_POOL_AREA
|
|
AND ePlayerLocation != N1B_PLAYER_LOCATION_GARDEN_AREA
|
|
STOP_AUDIO_SCENE("NIGEL_1B_MAIN_MIX")
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STAGE_ITEMS_STOLEN_PLAYER_LEFT_THE_AREA - stop active audio scene - ", "NIGEL_1B_MAIN_MIX") ENDIF #ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SWITCH eSubStage
|
|
// ------------------------------------------
|
|
CASE SS_SETUP
|
|
eSubStage = SS_UPDATE
|
|
bDisplayedWantedRatingObjective = FALSE // lose cops objective should display everytime
|
|
iTimer_DelayTrevorCopsDialogue = GET_GAME_TIMER()
|
|
CPRINTLN(DEBUG_MISSION, "STAGE_LOSE_THE_COPS - SS_SETUP done")
|
|
BREAK
|
|
// ------------------------------------------
|
|
CASE SS_UPDATE
|
|
IF NOT IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "PLAYER LOST HIS WANTED LEVEL") ENDIF #ENDIF
|
|
bDoneDialogue_PlayerAcknowledgesCops = TRUE //don't make the cop comment if player has lost the wanted level already
|
|
eSubStage = SS_CLEANUP
|
|
ELSE
|
|
IF bApplyWantedLevelInScript
|
|
IF NOT bDoneDialogue_PlayerAcknowledgesCops
|
|
IF HAS_TIME_PASSED(iTimer_DelayTrevorCopsDialogue, 1000)
|
|
VECTOR vTemp1, vTemp2//, vTemp3, vTemp4
|
|
vTemp1 = vPlayerPos + << -60.0, -60.0, -60.0 >>
|
|
vTemp2 = vPlayerPos + << 60.0, 60.0, 60.0 >>
|
|
IF IS_COP_VEHICLE_IN_AREA_3D(vTemp1, vTemp2)
|
|
IF ARE_ALL_POOL_PEDS_AND_GARDENER_DEAD_OR_INJURED()
|
|
bDoneDialogue_PlayerAcknowledgesCops = TRUE
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "Trevor spots cops dialogue akipped since everyone is dead /injured") ENDIF #ENDIF
|
|
ELIF NIG1B_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, "NIG1BAU", "NIG1B_DC", CONV_PRIORITY_MEDIUM)
|
|
// The cops. Really? Now that's not nice.
|
|
bDoneDialogue_PlayerAcknowledgesCops = TRUE
|
|
ENDIF
|
|
ELSE
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "TRYING TO TRIGGER TREV COP DIALOGUE BUT NO COP NEARBY - SO TRYING TO CREATE ONE") ENDIF #ENDIF
|
|
IF NOT bHasCopBeenCreatedForScriptedWantedLevel
|
|
IF HAS_COP_ASSETS_LOADED_FOR_APPLYING_WANTED_LEVEL()
|
|
bHasCopBeenCreatedForScriptedWantedLevel = CREATE_COP_IN_RANGE_OF_PLAYER(vPlayerPos)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT bDisplayedWantedRatingObjective
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
AND NOT IS_CONVERSATION_TRYING_TO_BE_RESTORED("NULL")
|
|
IF NOT IS_THIS_PRINT_BEING_DISPLAYED("NIG1B_OBJ_04")
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "lose cops objective displayed ^^^^^^ +++++ ^^^^^") ENDIF #ENDIF
|
|
PRINT_NOW("NIG1B_OBJ_04", DEFAULT_GOD_TEXT_TIME, 0) // Lose the cops.
|
|
NIG1B_CHECK_OBJECTIVE_TEXT_OVERWRITE_ONGOING_CONVERSATION_CONFLICT_NOW()
|
|
bDisplayedWantedRatingObjective = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT bDisplayedWantedRatingObjective
|
|
IF NOT IS_THIS_PRINT_BEING_DISPLAYED("NIG1B_OBJ_04")
|
|
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "lose cops objective displayed ^^^^^^ +++++ ^^^^^") ENDIF #ENDIF
|
|
PRINT_NOW("NIG1B_OBJ_04", DEFAULT_GOD_TEXT_TIME, 0) // Lose the cops.
|
|
NIG1B_CHECK_OBJECTIVE_TEXT_OVERWRITE_ONGOING_CONVERSATION_CONFLICT_NOW()
|
|
bDisplayedWantedRatingObjective = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
// ------------------------------------------
|
|
CASE SS_CLEANUP
|
|
IF IS_THIS_PRINT_BEING_DISPLAYED("NIG1B_OBJ_04")
|
|
CLEAR_THIS_PRINT("NIG1B_OBJ_04") //Lose the cops.
|
|
ENDIF
|
|
REMOVE_PED_FOR_DIALOGUE(sDialogue, 4) // Gardener
|
|
SET_STAGE(MISSION_STAGE_OUTRO_PHONECALL)
|
|
CPRINTLN(DEBUG_MISSION, "STAGE_LOSE_THE_COPS - SS_CLEANUP done")
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
NIG1B_HANDLE_CONVERSATION_AND_OBJECTIVE_TEXT_CONFLICT(sDialogue, "NIG1BAU", tSavedConversationRoot, tSavedConversationLabel)
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Trveor calls Nigel, to inform him of the successful mission
|
|
PROC STAGE_OUTRO_PHONECALL()
|
|
|
|
MONITOR_TRIGGER_MISSION_MUSIC_EVENTS()
|
|
MANAGE_POOL_AREA_STATE()
|
|
MANAGE_GARDEN_AREA_STATE()
|
|
|
|
SWITCH eSubStage
|
|
// ------------------------------------------
|
|
CASE SS_SETUP
|
|
N1B_KILL_CURRENT_CONVERSATION(FALSE, TRUE)
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
ADD_PED_FOR_DIALOGUE(sDialogue, 2, PLAYER_PED_ID(), "TREVOR")
|
|
ENDIF
|
|
ADD_PED_FOR_DIALOGUE(sDialogue, 3, NULL, "NIGEL")
|
|
ADD_PED_FOR_DIALOGUE(sDialogue, 4, NULL, "MRSTHORNHILL")
|
|
iTimer_DelayForOutroPhonecall = GET_GAME_TIMER()
|
|
eSubStage = SS_UPDATE
|
|
CPRINTLN(DEBUG_MISSION, "STAGE_OUTRO_PHONECALL - SS_SETUP done")
|
|
BREAK
|
|
// ------------------------------------------
|
|
CASE SS_UPDATE
|
|
IF NOT bHasOutroPhonecallSucceeded
|
|
IF HAS_TIME_PASSED(iTimer_DelayForOutroPhonecall, TIME_DELAY_FOR_OUTRO_PHONECALL)
|
|
IF PLAYER_CALL_CHAR_CELLPHONE(sDialogue, CHAR_NIGEL, "NIG1BAU", "NIG1B_OP", CONV_PRIORITY_CELLPHONE)
|
|
REPLAY_RECORD_BACK_FOR_TIME(3.0, 12.0, REPLAY_IMPORTANCE_LOW)
|
|
// Hello, this is Nigel. Please be quick, I am roaming in the United States of America.
|
|
// It's me, you nutcase. I picked up some clothes from your friend Tyler Dixon. There's even a skid mark.
|
|
// What fantastic news! Wait till Mrs. Thornhill hears about this, oh she will just be pleased as punch!
|
|
bHasOutroPhonecallSucceeded = TRUE
|
|
ENDIF
|
|
ELSE
|
|
// player gets wanted before phonecall triggers
|
|
IF IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0) // player gets wanted rating
|
|
//Player already wanted so go to lose the cops stage
|
|
CPRINTLN(DEBUG_MISSION, "STAGE_OUTRO_PHONECALL - SS_UPDATE player has a wanted level revert back to MISSION_STAGE_LOSE_THE_COPS")
|
|
SET_STAGE(MISSION_STAGE_LOSE_THE_COPS)
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
AND NOT IS_CONVERSATION_TRYING_TO_BE_RESTORED("NULL")
|
|
IF HAS_CELLPHONE_CALL_FINISHED()
|
|
IF HAS_CELLPHONE_JUST_BEEN_FORCED_AWAY() // If the cellphone was in use and the player receives an injury or starts ragdolling then,
|
|
bHasOutroPhonecallSucceeded = FALSE
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STAGE_OUTRO_PHONECALL - cellphone convo was interrupted so bHasOutroPhonecallSucceeded * set FALSE") ENDIF #ENDIF
|
|
ELSE
|
|
eSubStage = SS_CLEANUP
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
// ------------------------------------------
|
|
CASE SS_CLEANUP
|
|
N1B_KILL_CURRENT_CONVERSATION(FALSE, TRUE)
|
|
SET_STAGE(MISSION_STAGE_MISSION_PASSED)
|
|
CPRINTLN(DEBUG_MISSION, "STAGE_OUTRO_PHONECALL - SS_CLEANUP done")
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Mission has already failed at this point, but this handles
|
|
/// having to update the fail reason if the player does something more
|
|
/// serious during the fade.
|
|
PROC MISSION_FAILED_WAIT_FOR_FADE()
|
|
|
|
STRING sFailReason = NULL
|
|
vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
|
|
CHECK_AND_UPDATE_PLAYER_LOCATION()
|
|
CHECK_AND_UPDATE_PLAYER_WANTED_LEVEL()
|
|
|
|
SWITCH eSubStage
|
|
// ------------------------------------------
|
|
CASE SS_SETUP
|
|
IF SAFE_TRIGGER_MISSION_MUSIC_EVENT("NIGEL1B_MISSION_FAIL")
|
|
CLEAR_PRINTS()
|
|
CLEAR_HELP()
|
|
N1B_KILL_CURRENT_CONVERSATION(TRUE, TRUE)
|
|
DELETE_ALL_MISSION_BLIPS()
|
|
//Check if fail reason needs to be displayed
|
|
IF eN1B_MissionFailedReason = FAILED_DEFAULT
|
|
RANDOM_CHARACTER_FAILED()
|
|
ELSE
|
|
RANDOM_CHARACTER_FAILED_WITH_REASON(sFailReason)
|
|
ENDIF
|
|
iMissionMusicEventTriggerCounter = NIGEL1B_MUSIC_EVENT_COPS_LOST
|
|
SET_AUDIO_FLAG("AllowScoreAndRadio", TRUE)
|
|
SAFE_TRIGGER_MISSION_MUSIC_EVENT("NIGEL1B_MISSION_FAIL")
|
|
eSubStage = SS_UPDATE
|
|
CPRINTLN(DEBUG_MISSION, "MISSION_FAILED_WAIT_FOR_FADE - SS_SETUP done")
|
|
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)
|
|
CLEAR_AREA(vCelebritiesHouse_CentralPoint, 35.0, TRUE)
|
|
CLEAR_AREA_OF_PEDS(vCelebritiesHouse_CentralPoint, 35.0)
|
|
CLEAR_AREA_OF_VEHICLES(vCelebritiesHouse_CentralPoint, 35.0)
|
|
CLEAR_AREA_OF_OBJECTS(vCelebritiesHouse_CentralPoint, 35.0)
|
|
CPRINTLN(DEBUG_MISSION, "MISSION_FAILED_WAIT_FOR_FADE - cleanup done")
|
|
Script_Cleanup()
|
|
ELSE
|
|
// not finished fading out
|
|
// you may want to handle dialogue etc here.
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDPROC
|
|
|
|
//-------------------------------------------------------------------------------------------------------------------------------------------------
|
|
// DEBUG STAGES
|
|
//-------------------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
|
|
PROC DEBUG_POOL_SETUP()
|
|
|
|
vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
|
|
CHECK_AND_UPDATE_PLAYER_LOCATION()
|
|
CHECK_AND_UPDATE_PLAYER_WANTED_LEVEL()
|
|
CONTROL_GARDENERS_AI()
|
|
SWITCH eSubStage
|
|
CASE SS_SETUP
|
|
#IF IS_DEBUG_BUILD
|
|
SET_DEBUG_ACTIVE(TRUE)
|
|
SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE)
|
|
#ENDIF
|
|
sGardenerPed.AI = N1B_PED_AI_SETUP_ROUTINE
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "DEBUG_POOL_SETUP - GARDENER AI SET TO N1B_PED_AI_SETUP_ROUTINE") ENDIF #ENDIF
|
|
eSubStage = SS_UPDATE
|
|
BREAK
|
|
CASE SS_UPDATE
|
|
/*
|
|
IF GET_PED_STEALTH_MOVEMENT(PLAYER_PED_ID())
|
|
#IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "NIGEL 1B :", "PLAYER STEALTH ++++++++++++") ENDIF #ENDIF
|
|
ELSE
|
|
#IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "NIGEL 1B :", "PLAYER NOT IN STEALTH --------") ENDIF #ENDIF
|
|
ENDIF
|
|
*/
|
|
IF bDebug_ToggleDoSpottedPlayerChecksPause
|
|
//Basically i use these in conjunction with some widget i have setup in SCRIPT -> AZ WIDGETS -> STEALTH CHECKS
|
|
//toggle one of the spotted checks on
|
|
//once spotted the game will pause so you can fly the camera to that peds position to check the player was visible
|
|
//then press the uppause game tick box to get the game running again
|
|
//you'll have to set one of the these toggles back on in the widget to test again.
|
|
IF IS_PED_UNINJURED(sGardenerPed.pedIndex)
|
|
IF bDebug_TogglePRF_DisableSeeThroughChecksWhenTargeting_Gardener
|
|
SET_PED_RESET_FLAG(sGardenerPed.pedIndex, PRF_DisableSeeThroughChecksWhenTargeting, TRUE)
|
|
ENDIF
|
|
/*
|
|
IF HAS_SPECIFIC_PED_DETECTED_THE_PLAYER(sGardenerPed.pedIndex)
|
|
bDebug_ToggleDoSpottedPlayerChecksPause = FALSE
|
|
ENDIF
|
|
*/
|
|
//Basically same as what above but stripped down version
|
|
//alternative to using HAS_SPECIFIC_PED_DETECTED_THE_PLAYER as this is stripped right back to basics
|
|
SET_PED_SEEING_RANGE(sGardenerPed.pedIndex, fDebug_GardenerSeeingRange)
|
|
SET_PED_HEARING_RANGE(sGardenerPed.pedIndex, fDebug_GardenerHearingRange)
|
|
|
|
//IF CAN_PED_SEE_HATED_PED(sGardenerPed.pedIndex, PLAYER_PED_ID())
|
|
// #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "DEBUG B*433149 - CAN_PED_SEE_HATED_PED - RETURN TRUE - GARDENER SEES PLAYER") ENDIF #ENDIF
|
|
// SET_GAME_PAUSED(TRUE)
|
|
// bDebug_ToggleDoSpottedPlayerChecksPause = FALSE
|
|
//ENDIF
|
|
ENDIF
|
|
IF NOT IS_PLAYER_USING_STEALTH_IN_POOL_AREA()
|
|
bDebug_ToggleDoSpottedPlayerChecksPause = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
CASE SS_CLEANUP
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDPROC
|
|
#ENDIF
|
|
|
|
SCRIPT(g_structRCScriptArgs sRCLauncherDataIn)
|
|
|
|
sRCLauncherDataLocal = sRCLauncherDataIn
|
|
RC_TakeEntityOwnership(sRCLauncherDataLocal)
|
|
// take ownership from the initial scene (needs to happen before launcher terminates) must check is running, could get here from replay and not be setup
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(sRCLauncherDataLocal.iSyncSceneIndex)
|
|
TAKE_OWNERSHIP_OF_SYNCHRONIZED_SCENE(sRCLauncherDataLocal.iSyncSceneIndex)
|
|
ENDIF
|
|
|
|
SET_MISSION_FLAG(TRUE)
|
|
|
|
// Setup callback when player is killed, arrested or goes to multiplayer
|
|
IF (HAS_FORCE_CLEANUP_OCCURRED(DEFAULT_FORCE_CLEANUP_FLAGS|FORCE_CLEANUP_FLAG_DEBUG_MENU))
|
|
PRINT_LAUNCHER_DEBUG("Force cleanup [TERMINATING]")
|
|
Random_Character_Failed()
|
|
Script_Cleanup()
|
|
ENDIF
|
|
|
|
/*IF IS_REPLAY_IN_PROGRESS() // Set up the initial scene for replays
|
|
g_bSceneAutoTrigger = TRUE
|
|
//set the initial scene back up
|
|
eInitialSceneStage = IS_REQUEST_SCENE
|
|
WHILE NOT SetupScene_NIGEL_1B(sRCLauncherDataLocal)
|
|
CPRINTLN(DEBUG_MISSION, " IS_REPLAY_IN_PROGRESS - waiting on SetupScene_NIGEL_1B")
|
|
WAIT(0)
|
|
ENDWHILE
|
|
RC_SET_ENTITY_PROOFS_FOR_CUTSCENE(sRCLauncherDataLocal, FALSE)
|
|
RC_TakeEntityOwnership(sRCLauncherDataLocal)
|
|
SETUP_AREA_FOR_MISSION(RC_NIGEL_1B, FALSE) // need to turn this off in this instance since launcher cleanup won't get called to do it
|
|
g_bSceneAutoTrigger = FALSE
|
|
ENDIF*/
|
|
|
|
INIT_MISSION()
|
|
|
|
// handle replay checkpoints
|
|
IF IS_REPLAY_IN_PROGRESS()
|
|
|
|
CREATE_VEHICLE_FOR_REPLAY(vehIndex_MissionReplayRestore, << -990.5321, 342.9136, 70.4615 >>, 111.0291, FALSE, FALSE, FALSE, FALSE, FALSE)
|
|
|
|
INT iReplayStage = GET_REPLAY_MID_MISSION_STAGE()
|
|
IF g_bShitskipAccepted = TRUE
|
|
iReplayStage++ // player is skipping this stage
|
|
ENDIF
|
|
|
|
SWITCH iReplayStage
|
|
CASE CP_NIGEL1B_STEAL_ITEMS
|
|
START_REPLAY_SETUP(vPos_PlayerMissionStart, fHeading_PlayerMissionStart)
|
|
DO_Z_SKIP(Z_SKIP_STEAL_CELEB_CLOTHES)
|
|
CPRINTLN(DEBUG_MISSION, "* Replay checkpoint * - ", "steal items in progress")
|
|
BREAK
|
|
CASE CP_NIGEL1B_ITEMS_STOLEN_LEAVE_THE_AREA
|
|
START_REPLAY_SETUP(<< -1045.0170, 367.3012, 68.9128 >>, 103.7010)
|
|
DO_Z_SKIP(Z_SKIP_ITEMS_STOLEN_LEAVE_THE_AREA)
|
|
CPRINTLN(DEBUG_MISSION, "* Replay checkpoint * - ", "leave the area in progress")
|
|
BREAK
|
|
CASE CP_NIGEL1B_MISSION_PASSED
|
|
START_REPLAY_SETUP(<< -462.2575, -156.7884, 37.0458 >>, 112.5754)
|
|
DO_Z_SKIP(Z_SKIP_MISSION_PASSED)
|
|
CPRINTLN(DEBUG_MISSION, "* Replay checkpoint * - ", "mission passed in progress")
|
|
BREAK
|
|
DEFAULT
|
|
CPRINTLN(DEBUG_MISSION, "* Replay checkpoint * - ", "starting mission from invalid checkpoint, so possibly very start of the mission")
|
|
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_MISSION, "IS_REPEAT_PLAY_ACTIVE - set player coords for repeat play ", vPos_PlayerMissionStart, " framecount : ", GET_FRAME_COUNT())
|
|
ENDIF
|
|
ENDIF
|
|
|
|
WHILE(TRUE)
|
|
|
|
REPLAY_CHECK_FOR_EVENT_THIS_FRAME("SF_VST")
|
|
|
|
UPDATE_MISSION_NAME_DISPLAYING(sRCLauncherDataLocal.sIntroCutscene)
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
|
|
MISSION_FAILED_CHECKS()
|
|
|
|
// 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())
|
|
|
|
SWITCH eMissionStage
|
|
CASE MISSION_STAGE_STEAL_CELEB_POSSESSIONS
|
|
STAGE_STEAL_CELEB_POSSESSIONS()
|
|
BREAK
|
|
CASE MISSION_STAGE_ITEMS_STOLEN_LEAVE_THE_AREA
|
|
STAGE_ITEMS_STOLEN_LEAVE_THE_AREA()
|
|
BREAK
|
|
CASE MISSION_STAGE_ITEMS_STOLEN_PLAYER_LEFT_THE_AREA
|
|
STAGE_ITEMS_STOLEN_PLAYER_LEFT_THE_AREA()
|
|
BREAK
|
|
CASE MISSION_STAGE_LOSE_THE_COPS
|
|
STAGE_LOSE_THE_COPS()
|
|
BREAK
|
|
CASE MISSION_STAGE_OUTRO_PHONECALL
|
|
STAGE_OUTRO_PHONECALL()
|
|
BREAK
|
|
CASE MISSION_STAGE_MISSION_PASSED
|
|
Script_Passed()
|
|
BREAK
|
|
CASE MISSION_STAGE_MISSION_FAILED_WAIT_FOR_FADE
|
|
MISSION_FAILED_WAIT_FOR_FADE()
|
|
BREAK
|
|
CASE MISSION_STAGE_DEBUG_POOL_SETUP // debug stage
|
|
#IF IS_DEBUG_BUILD
|
|
DEBUG_POOL_SETUP()
|
|
#ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
|
|
// 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()
|
|
//This is here so it can use the debug skipping functions
|
|
IF bDebug_SetupMissionToTest_Can_Ped_See_Hated_Ped
|
|
RC_START_Z_SKIP()
|
|
RESET_MISSION()
|
|
SET_STAGE(MISSION_STAGE_DEBUG_POOL_SETUP)
|
|
RC_END_Z_SKIP()
|
|
SAFE_TELEPORT_PED(PLAYER_PED_ID(), << -1009.2120, 355.0336, 69.9676 >>, 27.9385)
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0)
|
|
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "Mission setup to test B*433149 - CAN_PED_SEE_HATED_PED returning true when ped is out of sight.") ENDIF #ENDIF
|
|
bDebug_SetupMissionToTest_Can_Ped_See_Hated_Ped = FALSE
|
|
ENDIF
|
|
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()
|
|
ENDIF
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
WAIT(0)
|
|
ENDWHILE
|
|
ENDSCRIPT
|