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

6093 lines
322 KiB
Python
Executable File

// *****************************************************************************************
// *****************************************************************************************
//
// MISSION NAME : Nigel1A.sc
// AUTHOR : Ahron Mason
// DESCRIPTION : Trevor steals gold tooth from musician 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 "chase_hint_cam.sch" CHASE_HINT_CAM_STRUCT localChaseHintCamStruct
USING "event_public.sch"
USING "initial_scenes_Nigel.sch"
USING "rgeneral_include.sch"
USING "commands_recording.sch"
#IF IS_DEBUG_BUILD
USING "select_mission_stage.sch"
#ENDIF
//-------------------------------------------------------------------------------------------------------------------------------------------------
// :ENUMS:
//-------------------------------------------------------------------------------------------------------------------------------------------------
// Mission stages
ENUM MISSION_STAGE
MISSION_STAGE_ENTER_THE_MUSIC_CLUB,
MISSION_STAGE_FIND_CELEB,
MISSION_STAGE_KNOCK_OUT_TOOTH,
MISSION_STAGE_COLLECT_TOOTH,
MISSION_STAGE_LEAVE_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_SETUP
ENDENUM
/// each mission stage has uses these substages
ENUM SUB_STAGE
SS_SETUP,
SS_UPDATE,
SS_CLEANUP
ENDENUM
//fail conditions
ENUM FAILED_REASON_ENUM
FAILED_DEFAULT,
FAILED_MUSICIAN_KILLED
ENDENUM
//used to update mission peds behaviour
ENUM N1A_PED_AI
N1A_PED_AI_SETUP_RELAXED,
N1A_PED_AI_STATE_RELAXED,
N1A_PED_AI_STATE_UNDER_SYNCED_SCENE_CONTROL,
N1A_PED_AI_SETUP_ROUTINE,
N1A_PED_AI_STATE_ROUTINE,
N1A_PED_AI_SETUP_AWARE_OF_PLAYER,
N1A_PED_AI_STATE_AWARE_OF_PLAYER,
N1A_PED_AI_SETUP_MOVE_TOWARDS_PLAYER,
N1A_PED_AI_STATE_MOVE_TOWARDS_PLAYER,
N1A_PED_AI_SETUP_MELEE_ATTACK,
N1A_PED_AI_STATE_MELEE_ATTACK,
N1A_PED_AI_SETUP_MUSICIAN_BEATEN_UP,
N1A_PED_AI_STATE_MUSICIAN_BEATEN_UP,
N1A_PED_AI_SETUP_MUSICIAN_TOOTH_KNOCKED_OUT_ANIMS,
N1A_PED_AI_STATE_MUSICIAN_TOOTH_KNOCKED_OUT_ANIMS,
N1A_PED_AI_STATE_MUSICIAN_FINISHED_TOOTH_OUT_ANIMS,
N1A_PED_AI_SETUP_REACHED_PERIMETER,
N1A_PED_AI_STATE_REACHED_PERIMETER,
N1A_PED_AI_SETUP_OUT_OF_REACH,
N1A_PED_AI_STATE_OUT_OF_REACH,
N1A_PED_AI_SETUP_FLEE,
N1A_PED_AI_STATE_FLEE,
N1A_PED_AI_SETUP_FLEE_TO_VEHICLE,
N1A_PED_AI_STATE_FLEE_TO_VEHICLE,
N1A_PED_AI_SETUP_FLEE_IN_VEHICLE,
N1A_PED_AI_STATE_FLEE_IN_VEHICLE,
N1A_PED_AI_SETUP_SURRENDERED,
N1A_PED_AI_STATE_SURRENDERED,
N1A_PED_AI_SETUP_FRIGHTENED,
N1A_PED_AI_STATE_FRIGHTENED,
N1A_PED_AI_SETUP_AIM_GUN_AND_ADVANCE,
N1A_PED_AI_STATE_AIM_GUN_AND_ADVANCE,
N1A_PED_AI_SETUP_GUN_COMBAT,
N1A_PED_AI_STATE_GUN_COMBAT
ENDENUM
//used to update the state of the musician
ENUM N1A_MUSICIAN_STATE
N1A_MUSICIAN_STATE_RELAXED,
N1A_MUSICIAN_STATE_BRAWLING,
N1A_MUSICIAN_STATE_SURRENDERED,
N1A_MUSICIAN_STATE_KNOCKED_DOWN,
N1A_MUSICIAN_STATE_TOOTH_KNOCKED_OUT,
N1A_MUSICIAN_STATE_FLEE,
N1A_MUSICIAN_STATE_DEAD
ENDENUM
/// PURPOSE: the different rooms within the rock club interior
ENUM N1A_ROCK_CLUB_INTERIOR_ROOM_ENUM
N1A_RCR_MAIN_ROOM = 0,
N1A_RCR_MAIN_ENTRANCE,
N1A_RCR_MAIN_ENTRANCE_TO_MAIN_ROOM,
N1A_RCR_BACK_ROOM_CORRIDOR_TO_BASEMENT,
N1A_RCR_LANDING_OUTSIDE_BASEMENT,
N1A_RCR_BASEMENT,
N1A_RCR_CLOAK_ROOM,
N1A_RCR_CORRIDOR_TO_UPSTAIRS,
N1A_RCR_LANDING_UPSTAIRS,
N1A_RCR_ROOM_UPSTAIRS,
N1A_RCR_REAR_ENTRANCE_BOTTOM_STAIRS,
N1A_RCR_REAR_ENTRANCE_TOP_STAIRS,
N1A_RCR_INVALID,
N1A_MAX_NUM_ROCK_CLUB_ROOMS
ENDENUM
/// PURPOSE: used to update a ped's movement state - for use with detection system
ENUM N1A_PED_MOVEMENT_STATE
N1A_PEDMOVEMENTSTATE_COVER,
N1A_PEDMOVEMENTSTATE_STEALTH,
N1A_PEDMOVEMENTSTATE_RUNNING,
N1A_PEDMOVEMENTSTATE_SPRINTING,
N1A_PEDMOVEMENTSTATE_WALKING,
N1A_PEDMOVEMENTSTATE_IN_VEHICLE,
N1A_PEDMOVEMENTSTATE_DEFAULT
ENDENUM
/// PURPOSE: contains all of the door's which I need to control in script
ENUM N1A_MISSION_CONTROLLED_DOORS_ENUM
N1A_MCD_INT_DD_TO_MAIN_ROOM_01 = 0,
N1A_MCD_INT_DD_TO_MAIN_ROOM_02,
N1A_MCD_INT_ENTRANCE_STAFF_AREA_01,
N1A_MCD_INT_TO_REAR_ENTRANCE_01,
N1A_MCD_INT_TO_BASEMENT_01,
N1A_MCD_INT_BASEMENT_01,
N1A_MAX_MISSION_CONTROLLED_DOORS
ENDENUM
/// PURPOSE: list of animations the club peds have
ENUM N1A_CLUB_PED_ANIM_TYPE
N1A_CPAT_BASE_ANIM,
N1A_CPAT_IDLE_A_ANIM,
N1A_CPAT_IDLE_B_ANIM,
N1A_CPAT_BUMP_ANIM,
N1A_CPAT_OUTRO_ANIM,
N1A_MAX_CLUB_PED_ANIM_TYPE
ENDENUM
/// PURPOSE: list of animations Willy and the groupie
ENUM N1A_Willy_GROUPIE_ANIM_TYPE
N1A_WGAT_BASE_ANIM,
N1A_WGAT_BASE_2_ANIM,
N1A_WGAT_THIS_IS_AWKWARD,
N1A_WGAT_YOU_KNOW,
N1A_WGAT_EXIT,
N1A_MAX_Willy_GROUPIE_ANIM_TYPE
ENDENUM
//-------------------------------------------------------------------------------------------------------------------------------------------------
// :STRUCTS
//-------------------------------------------------------------------------------------------------------------------------------------------------
/// PURPOSE: used by scripted peds in the mission - musician
/// AI uses N1A_PED_AI to set behaviours
STRUCT STRUCT_MISSION_PED
AI_BLIP_STRUCT blipAIStruct
BLIP_INDEX blipIndex
PED_INDEX pedIndex
N1A_PED_AI AI
MODEL_NAMES mnModel
VECTOR vPosition
FLOAT fHeading
INT iTimer
INT iAiDelayTimer
INT iFrameCountLastSeenPlayer
ENDSTRUCT
/// PURPOSE: used by scripted peds
STRUCT STRUCT_SIMPLE_MISSION_PED
PED_INDEX pedIndex
MODEL_NAMES mnModel
VECTOR vPosition
FLOAT fHeading
ENDSTRUCT
/// PURPOSE: used by the pickups in the mission
STRUCT STRUCT_MISSION_PICKUP
PICKUP_INDEX index
MODEL_NAMES mnModel
BLIP_INDEX blipIndex
VECTOR vPosition
PICKUP_TYPE type = PICKUP_CUSTOM_SCRIPT
INT iPlacementFlags
//VECTOR vRotation //not currently in use
//FLOAT fHeading
ENDSTRUCT
/// PURPOSE: used by scripted vehicles in the mission - musician's car
STRUCT STRUCT_MISSION_VEHICLE
VEHICLE_INDEX vehIndex
MODEL_NAMES mnModel
VECTOR vPosition
FLOAT fHeading
ENDSTRUCT
//-------------------------------------------------------------------------------------------------------------------------------------------------
// :CONSTANTS
//-------------------------------------------------------------------------------------------------------------------------------------------------
CONST_FLOAT FLEE_PED_MOVE_RATE_OVERRIDE_SPEED_UP 1.15 // musician flee speed, faster than player so he has more chance of escape
CONST_FLOAT DIST_PLAYER_CLASSED_AS_COLLECTED_TOOTH_PICKUP 0.75 // used to fake the tooth object acting like a pickup
CONST_FLOAT Z_DIFFERENCE_COMBAT_TASK_STOPS_WORKING 0.25 // height diff that combat breaks - detect for this and change the peds AI
CONST_INT DELAY_FOR_MISSION_PASSED 2500 // don't pass the mission straight after the outro phonecall
CONST_INT TIME_DELAY_FOR_OUTRO_PHONECALL 2500 // don't have the player call Nigel straight away
CONST_INT TIME_DELAY_FOR_NEXT_RANDOM_DIALOGUE_LINE 2500 // dialogue delay time
CONST_INT CP_NIGEL1A_ENTER_THE_MUSIC_CLUB 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_NIGEL1A_LEAVE_THE_AREA 1 // 1st mission replay checkpoint
CONST_INT CP_NIGEL1A_MISSION_PASSED 2 // 2nd mission replay checkpoint - used by shitskip
CONST_INT Z_SKIP_ENTER_THE_MUSIC_CLUB 0 // z skip stage
CONST_INT Z_SKIP_FIND_CELEB 1 // z skip stage
CONST_INT Z_SKIP_KNOCK_OUT_TOOTH 2 // z skip stage
CONST_INT Z_SKIP_COLLECT_TOOTH 3 // z skip stage
CONST_INT Z_SKIP_LEAVE_THE_AREA 4 // z skip stage
CONST_INT Z_SKIP_OUTRO_PHONECALL 5 // z skip stage
CONST_INT Z_SKIP_MISSION_PASSED 6
CONST_INT TOTAL_PLAYER_LEFT_MUSICIAN_BRAWL_DIALOGUE 3 // defines max convos/lines for specified dialogue
CONST_INT TOTAL_PLAYER_RETURNED_MUSICIAN_BRAWL_DIALOGUE 3 // defines max convos/lines for specified dialogue
CONST_INT TOTAL_PLAYER_OUT_OF_REACH_MUSICIAN_BRAWL_DIALOGUE 3 // defines max convos/lines for specified dialogue
CONST_INT CLUB_PED_GROUPIE_UPSTAIRS_01 0 // array index ID for groupie upstairs 2
CONST_INT CLUB_PED_GROUPIE_UPSTAIRS_02 1 // array index ID for groupie upstairs 1
CONST_INT CLUB_PED_ROADIE 2 // array index ID for roadie 1
CONST_INT CLUB_PED_BAND_MANAGER 3 // array index ID for manager
CONST_INT GROUPIE_WILLYS_PIECE 4 // array index ID for Willy's bird
CONST_INT MAX_NUM_CLUB_PEDS 5 // defines max number of club peds in array
CONST_INT CAN_PED_SEE_PED_FRAME_COUNT_GRACE_PERIOD 10 // grace period in frame count for can ped see ped tests
CONST_INT NIG1A_PLAYER_LEFT_THE_CLUB_DIST 60 // dist player has to reach from the club to be classed as left the area
CONST_INT NIG1A_PLAYER_CLASSED_AS_PURSUING_Willy_DIST 50 // if player is with in this dist from Willy, he's classed as pursuing him in the scripted wanted level checks
CONST_INT NIG1A_TIME_DELAY_WANTED_FOR_WEAPON_IN_CLUB 10000 // if player spotted with weapon in the club - gets scripte wanted level after this delay
CONST_INT NIG1A_TIME_DELAY_WANTED_FOR_WILLY_ASSAULT 5000 // if player assault's Willy - gets scripte wanted level after this delay
//-------------------------------------------------------------------------------------------------------------------------------------------------
// :VARIABLES
//-------------------------------------------------------------------------------------------------------------------------------------------------
MISSION_STAGE eMissionStage = MISSION_STAGE_ENTER_THE_MUSIC_CLUB // MISSION_STAGE_DEBUG_SETUP // MISSION_STAGE_ENTER_THE_MUSIC_CLUB //SHOULD THESE GET INITIALISED IN INIT_VARIABLES INSTEAD, SO THEY GET REST WHEN Z SKIPPING ETC?
MISSION_STAGE eMissionSkipTargetStage // Used in mission checkpoint setup and debug stage skipping
SUB_STAGE eSubStage = SS_SETUP // SHOULD THESE GET INITIALISED IN INIT_VARIABLES INSTEAD, SO THEY GET REST WHEN Z SKIPPING ETC?
g_structRCScriptArgs sRCLauncherDataLocal
#IF IS_DEBUG_BUILD // stage skipping
CONST_INT MAX_SKIP_MENU_LENGTH 7
MissionStageMenuTextStruct mSkipMenu[MAX_SKIP_MENU_LENGTH]
#ENDIF
BLIP_INDEX blipMusicClub
BOOL bDoneObjective_LoseWantedLevel
BOOL bDoneDialogue_BandSayWhereWillyIs
BOOL bDoneDialogue_MusicianBeginFlee
BOOL bDoneDialogue_MusicianKnockedDown
BOOL bDoneDialogue_MusicianLosesTooth
BOOL bDoneDialogue_MusicianSpottedPlayer
BOOL bDoneDialogue_MusicianStartBrawl
BOOL bDoneDialogue_MusicianSurrendered
BOOL bDoneDialogue_MusicianShotAtByPlayer
BOOL bDoneDialogue_PlayerReturnsTofightMusician
BOOL bDoneDialogue_TrevorCommentSneakingInBackdoor
BOOL bDoneDialogue_TrevorKilledWilly
BOOL bDoneDialogue_TrevorLeaveTheAreaComment
BOOL bDoneDialogue_MusicianShoutSecurity
BOOL bDonedialogue_ClubPedsReactThreatened
BOOL bDoneObjective_BeatUpMusician
BOOL bDoneObjective_CollectTooth
BOOL bDoneObjective_LeaveTheArea
BOOL bDoneObjective_EnterClub
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 bHasPlayerDamagedMusician
BOOL bHasPlayerScarredClubPedsUpstairs
BOOL bHasOutroPhonecallSucceeded
BOOL bHasWillySeenPlayerAttackHisGroupie
BOOL bPausedDialogue_MusicianSpottedPlayer
BOOL bPausedDialogue_AmbientUpstairs
BOOL bPausedDialogue_AmbientWillyGroupie
BOOL bPlayerUsedWeaponToDamageWilly
BOOL bHasPlayerReceivedScriptedWantedLevel
BOOL bShouldPlayerGetWantedLevelForWeaponInClub
BOOL bShouldPlayerGetWantedLevelAfterAttackingWilly
BOOL bSetMissionControlledDoorsInitialStates[N1A_MAX_MISSION_CONTROLLED_DOORS]
BOOL bSetExitSceneForWillyAndGroupie
FAILED_REASON_ENUM eN1A_MissionFailedReason
INT iClubPedID_ToUpdateThisFrameCounter
INT iDialogueCounter_PlayerLeftMusicianInBrawl
INT iDialogueCounter_PlayerOutOfReachMusicianInBrawl
INT iDialogueCounter_PlayerReturnedMusicianInBrawl
INT iMissionControlledDoors[N1A_MAX_MISSION_CONTROLLED_DOORS]
INT iRockClubRoom[N1A_MAX_NUM_ROCK_CLUB_ROOMS]
INT iTimer_DelayForOutroPhonecall
INT iTimer_BackupKnockOutToothTrigger
INT iTimer_PlayerReceivesScriptedWantedLevel
INT iCounter_AmbientDialogueUpstairs
INT iCounter_AmbientDialogueWillyGroupie
INT iSyncedSceneID_ClubPedUpstairsScenes[N1A_MAX_CLUB_PED_ANIM_TYPE]
INT iSyncedSceneID_WillyGroupieScenes[N1A_MAX_Willy_GROUPIE_ANIM_TYPE]
//INT iUpdateClubPeds_ThisFrameCounter
INTERIOR_INSTANCE_INDEX RockClubInteriorIndex
FLOAT fHeading_PlayerMissionStart // heading player gets set to when skipping back to the start of the the mission
N1A_MUSICIAN_STATE eMusicianState
N1A_ROCK_CLUB_INTERIOR_ROOM_ENUM ePlayerInsideClubStatus
REL_GROUP_HASH relGroupPlayerEnemy //for hate relationship
REL_GROUP_HASH relGroupUnagressive
SCENARIO_BLOCKING_INDEX scenarioBlockingAreaRockClub
SEQUENCE_INDEX sequenceAI
STRING sNigel1A_DialogueRoot_MusicianSpotsTrevor = "NULL"
STRING sNigel1A_Dialogue_TextBlockName = "NIG1AAU"
structPedsForConversation sDialogue
STRUCT_MISSION_PED sClubPed[MAX_NUM_CLUB_PEDS]
STRUCT_MISSION_PED sWillyPed
STRUCT_MISSION_PICKUP mpToothPickup
STRUCT_MISSION_VEHICLE sMusicianVehicle
TEXT_LABEL_23 tlPausedDialogue_MusicianSpottedPlayer = ""
TEXT_LABEL_23 tlDialogueLinePaused_UpstairsAmbient = ""
TEXT_LABEL_23 tlDialogueLinePaused_WillyGroupieAmbient = ""
TEXT_LABEL_31 tlAnimDict_ClubPedsUpstairs = "rcmnigel1a_band_groupies"
TEXT_LABEL_31 tlAnimDict_WillyMocappedAnims = "rcmnigel1aig_1"
TEXT_LABEL_31 tlAnimDict_WillyMocappedHurtAnims = "rcmnigel1aig_3"
VECTOR vClearZone_RockClub_Max
VECTOR vClearZone_RockClub_Min
VECTOR vMusicClub_CentrePos
VECTOR vPlayerPos
VECTOR vSyncedScenePosition_ClubPedsUpstairs
VECTOR vSyncedSceneRotation_ClubPedsUpstairs
VECTOR vSyncedScenePosition_WillyGroupie
VECTOR vSyncedSceneRotation_WillyGroupie
VECTOR vPos_PlayerMissionStart // pos player gets warped to when skipping back to the start of the the mission
VEHICLE_INDEX vehIndex_MissionReplayRestore
//-------------------------------------------------------------------------------------------------------------------------------------------------
// :DEBUG FUNCS / PROCS / WIDGETS
//-------------------------------------------------------------------------------------------------------------------------------------------------
#IF IS_DEBUG_BUILD
WIDGET_GROUP_ID widgetGroup
BOOL bDebug_PrintMissionInfoToTTY = TRUE // needs to be FALSE for submit!!
BOOL bDebug_PrintPlayerRoomKey = FALSE
BOOL bDebug_PrintPlayerExclusionAreacheckMainRoom = FALSE
BOOL bDebug_DoPlayerStartedBrawlChecks = FALSE
BOOL bDebug_DoShapeTestPlayertoMusician = FALSE
BOOL bDebug_PrintCurrentMusicianState = FALSE
/// PURPOSE:
/// My debug mission widget groups, which get created in RAG->SCRIPT
PROC SETUP_MISSION_WIDGET()
widgetGroup = START_WIDGET_GROUP("NIGEL 1A WIDGETS")
ADD_WIDGET_BOOL("TTY Toggle - Print Mission Debug Info", bDebug_PrintMissionInfoToTTY)
ADD_WIDGET_BOOL("bDebug_PrintPlayerRoomKey", bDebug_PrintPlayerRoomKey)
ADD_WIDGET_BOOL("bDebug_PrintPlayerExclusionAreacheckMainRoom", bDebug_PrintPlayerExclusionAreacheckMainRoom)
ADD_WIDGET_BOOL("Do Start Brawling with Musician checks", bDebug_DoPlayerStartedBrawlChecks)
ADD_WIDGET_BOOL("bDebug_DoShapeTestPlayertoMusician", bDebug_DoShapeTestPlayertoMusician)
ADD_WIDGET_BOOL("bDebug_PrintCurrentMusicianState : ", bDebug_PrintCurrentMusicianState)
STOP_WIDGET_GROUP()
ENDPROC
/// PURPOSE:
/// updates my mission widgets, based off RAG input
PROC MAINTAIN_MISSION_WIDGETS()
IF bDebug_PrintPlayerRoomKey
INT iRoomKey
iRoomKey = GET_KEY_FOR_ENTITY_IN_ROOM(PLAYER_PED_ID())
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "DEBUG ** ", " bDebug_PrintPlayerRoomKey = ", iRoomKey, " ePlayerInsideClubStatus = ", ePlayerInsideClubStatus, " frame count :", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
IF bDebug_PrintPlayerExclusionAreacheckMainRoom
IF NOT IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-559.14031, 279.951287, 79.676308>>, <<-567.432556,280.602701,84.226013>>, 6.60000) //exclusion zone near the main entrance door
VECTOR vTempPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "DEBUG ** ", " bDebug_PrintPlayerExclusionAreacheckMainRoom = return FALSE", " ePlayerInsideClubStatus = ", ePlayerInsideClubStatus, "vPlayerPos = ", vTempPos, " frame count :", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
ENDIF
IF bDebug_DoPlayerStartedBrawlChecks
IF IS_PED_UNINJURED(sWillyPed.pedIndex)
IF IS_PLAYER_TARGETTING_ENTITY(PLAYER_ID(), sWillyPed.pedIndex)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "DEBUG CHECK HAS_PLAYER_STARTED_FIGHT_WITH_SPECIFIC_PED() check - PLAYER TARGETTED PED") ENDIF #ENDIF
DRAW_RECT(0.15, 0.1, 0.1, 0.1, 0, 0, 100, 100) //BLUE
ELIF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(sWillyPed.pedIndex, PLAYER_PED_ID())
//CLEAR_ENTITY_LAST_DAMAGE_ENTITY(sWillyPed.pedIndex)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "DEBUG CHECK HAS_PLAYER_STARTED_FIGHT_WITH_SPECIFIC_PED() check - PLAYER DAMAGED PED") ENDIF #ENDIF
DRAW_RECT(0.25, 0.1, 0.1, 0.1, 100, 0, 0, 100) //RED
ELIF IS_ENTITY_TOUCHING_ENTITY(sWillyPed.pedIndex, PLAYER_PED_ID())
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "DEBUG CHECK HAS_PLAYER_STARTED_FIGHT_WITH_SPECIFIC_PED() check - PLAYER touching PED") ENDIF #ENDIF
DRAW_RECT(0.35, 0.1, 0.1, 0.1, 255, 216, 0, 100) //YELLOW
ENDIF
ENDIF
ENDIF
IF bDebug_DoShapeTestPlayertoMusician
IF IS_PED_UNINJURED(sWillyPed.pedIndex)
IF CAN_PED_SEE_PED(sWillyPed.pedIndex, PLAYER_PED_ID())
DRAW_RECT(0.90, 0.85, 0.05, 0.05, 0, 255, 0, 150)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, " bDebug_DoShapeTestPlayertoMusician - CAN_PED_SEE_PED - TRUE") ENDIF #ENDIF
ELSE
DRAW_RECT(0.90, 0.85, 0.05, 0.05, 255, 0, 0, 150)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, " bDebug_DoShapeTestPlayertoMusician - CAN_PED_SEE_PED - FALSE") ENDIF #ENDIF
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(sWillyPed.pedIndex)
SET_ENTITY_HEALTH(sWillyPed.pedIndex, 0)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "DEBUG - KILLED sWillyPed ") ENDIF #ENDIF
ENDIF
ENDIF */
IF bDebug_PrintCurrentMusicianState
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, " bDebug_PrintCurrentMusicianState = ", eMusicianState) 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
/// 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)
SAFE_TELEPORT_ENTITY(pedIndex, vPosition, fHeading, bSnapToGround)
IF bForcePedAiAndAnimUpdate
IF IS_ENTITY_ALIVE(pedIndex)
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, BOOL bKeepTasks = FALSE)
IF IS_ENTITY_ALIVE(vehIndex)
IF bSnapToGround = TRUE
BOOL groundCheckOk = FALSE
FLOAT fNewZ = 0.0
groundCheckOk = GET_GROUND_Z_FOR_3D_COORD(vPosition, fNewZ)
IF (groundCheckOk)
vPosition.z = fNewZ
ENDIF
ENDIF
SET_ENTITY_COORDS(vehIndex, vPosition, FALSE, bKeepTasks)
SET_ENTITY_HEADING(vehIndex, fHeading)
IF bSnapToGround
SET_VEHICLE_ON_GROUND_PROPERLY(vehIndex)
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// teleports a ped out of their vehicle.
/// NOTE: proc waits until GET_SAFE_COORD_FOR_PED returns true
/// PARAMS:
/// pedIndex - ped to Teleport
PROC SAFE_TELEPORT_PED_OUT_OF_THEIR_VEHICLE(PED_INDEX pedIndex)
VECTOR vRespotCoords = << 0.0, 0.0, 0.0 >>
FLOAT fRespotHeading = 0.0
IF IS_ENTITY_ALIVE(pedIndex)
IF IS_PED_IN_ANY_VEHICLE(pedIndex)
vRespotCoords = GET_ENTITY_COORDS(pedIndex)
WHILE NOT GET_SAFE_COORD_FOR_PED(vRespotCoords, FALSE, vRespotCoords)
WAIT(0)
vRespotCoords.x += 2.0
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SAFE_TELEPORT_PED_OUT_OF_THEIR_VEHICLE - looking for safe coords") ENDIF #ENDIF
ENDWHILE
fRespotHeading = GET_ENTITY_HEADING(pedIndex)
SAFE_TELEPORT_PED(pedIndex, vRespotCoords, fRespotHeading, TRUE, TRUE)
ENDIF
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:
/// Sets entity to face an entity using SET_ENTITY_HEADING_FACE_ENTITY
/// but also performs alive checks on the entities
/// PARAMS:
/// ent - entity to turn
/// targent - entity to face
PROC SAFE_SET_ENTITY_HEADING_FACE_ENTITY(ENTITY_INDEX ent, ENTITY_INDEX targent)
IF IS_ENTITY_ALIVE(ent)
AND IS_ENTITY_ALIVE(targent)
SET_ENTITY_HEADING_FACE_ENTITY(ent, targent)
ENDIF
ENDPROC
/// PURPOSE:
/// Compares two headings
/// PARAMS:
/// f1 - first heading
/// f2 - second heading
/// fTolerance - max difference allowed in the headings
/// RETURNS:
/// TRUE if the difference between the headings is less than or equal to the tolerance
FUNC BOOL IS_DIFFERENCE_IN_HEADINGS_LESS_THAN_OR_EQUAL_TO_THE_TOLERANCE(FLOAT f1, FLOAT f2, FLOAT fTolerance)
IF (ABSF(f1 - f2) <= fTolerance)
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_DIFFERENCE_IN_HEADINGS_LESS_THAN_OR_EQUAL_TO_THE_TOLERANCE - test returned true") ENDIF #ENDIF
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Test for if two coords 2D are within fRange metres of each other
/// and are within the z threshold
/// PARAMS:
/// v1 - first coord
/// v2 - second coord
/// fRange - distance
/// fThresholdZ - max z different between the two positions
/// RETURNS:
/// TRUE if two coords are withing fRange of each other in 2D
FUNC BOOL IS_COORD_IN_RANGE_OF_COORD_2D_WITH_DIFFERENT_Z_THRESHOLD(VECTOR v1, VECTOR v2, FLOAT fRange, FLOAT fThresholdZ)
VECTOR vDiff = v2 - v1
IF ((vDiff.z * vDiff.z) <= (fThresholdZ * fThresholdZ))
IF ((vDiff.x * vDiff.x) + (vDiff.y * vDiff.y)) <= (fRange * fRange)
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Check is the specified time has passed using specified timer.
/// PARAMS:
/// iTimeAmount - Time to check.
/// iTimer - Timer to use.
/// 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
/// PURPOSE:
/// 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:
/// check if the player in a vehicle has potentially just ran over the specified ped
/// PARAMS:
/// ped - ped to check
/// vPlayerPosition - player coords
/// RETURNS:
/// TRUE if he's may have ran over him recently
FUNC BOOL HAS_PLAYER_IN_VEHICLE_POTENTIALLY_JUST_RUN_OVER_PED(PED_INDEX pedIndex, VECTOR vPlayerPosition)
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF (GET_TIME_SINCE_PLAYER_HIT_PED(PLAYER_ID()) >= 0) // looks to be initially set to -1 so need to check from 0
AND (GET_TIME_SINCE_PLAYER_HIT_PED(PLAYER_ID()) < 500)
IF IS_PED_RAGDOLL(pedIndex)
IF IS_ENTITY_IN_RANGE_COORDS(pedIndex, vPlayerPosition, 3.5)
OR IS_ENTITY_TOUCHING_ENTITY(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()), pedIndex)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "HAS_PLAYER_IN_VEHICLE_POTENTIALLY_JUST_RUN_OVER_PED - returning true") ENDIF #ENDIF
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// convert a TEXT_LABEL into type STRING
/// PARAMS:
/// tlTextLabel - the text label to convert
/// RETURNS:
/// STRING
FUNC STRING N1A_CONVERT_TEXT_LABEL_TO_STRING_FORMAT(STRING tlTextLabel)
RETURN(tlTextLabel)
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 N1A_MISSION_CONTROLLED_DOORS_ENUM
/// mnModel - the door's model name
/// vPos - the door's position
PROC REGISTER_NEW_MISSION_CONTROLLED_DOOR(N1A_MISSION_CONTROLLED_DOORS_ENUM eDoor, MODEL_NAMES mnModel, VECTOR vPos)
TEXT_LABEL_23 str_hash = "N1A_"
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 N1A_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(N1A_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, " bFlushState = ", bFlushState) ENDIF #ENDIF
RETURN TRUE
ENDIF
RETURN FALSE
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 N1A_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(N1A_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, " bFlushState = ", bFlushState) ENDIF #ENDIF
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// check if the door returns DOOR_SYSTEM_GET_IS_PHYSICS_LOADED true
/// PARAMS:
/// eDoor - specific door to check
/// RETURNS:
/// TRUE if DOOR_SYSTEM_GET_IS_PHYSICS_LOADED returns true and door is registered with the system
FUNC BOOL IS_MISSION_CONTROLLED_DOOR_PHYSICS_LOADED(N1A_MISSION_CONTROLLED_DOORS_ENUM eDoor)
IF IS_DOOR_REGISTERED_WITH_SYSTEM(iMissionControlledDoors[eDoor])
//IF DOOR_SYSTEM_GET_IS_PHYSICS_LOADED(iMissionControlledDoors[eDoor])
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_MISSION_CONTROLLED_DOOR_PHYSICS_LOADED - RETURN true for door : ", eDoor) ENDIF #ENDIF
RETURN TRUE
//ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// trigger ambient speech using PLAY_PED_AMBIENT_SPEECH_WITH_VOICE
/// handles toggling STOP_PED_SPEAKING
/// PARAMS:
/// pedIndex -
/// Context -
/// VoiceName -
/// Params -
PROC NIG1A_PLAY_TRIGGER_AMBIENT_SPEECH(PED_INDEX pedIndex ,STRING Context, STRING VoiceName, SPEECH_PARAMS Params = SPEECH_PARAMS_ADD_BLIP)
IF IS_PED_UNINJURED(pedIndex)
BOOL bTemp = IS_AMBIENT_SPEECH_DISABLED(pedIndex)
IF bTemp
STOP_PED_SPEAKING(pedIndex, FALSE)
ENDIF
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(pedIndex, Context, VoiceName, Params)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "NIG1A_PLAY_TRIGGER_AMBIENT_SPEECH - Context : ", Context, " VoiceName : ", VoiceName) ENDIF #ENDIF
IF bTemp
STOP_PED_SPEAKING(pedIndex, TRUE)
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// task Willy and his groupie to use a specific sync scene anim
/// PARAMS:
/// eWhichAnim - which animation they should be using
PROC SET_WILLY_GROUPIE_SYNCED_ANIM(N1A_Willy_GROUPIE_ANIM_TYPE eWhichAnim)
INT i
BOOL bLoopedScene = FALSE
BOOL bHoldLastFrameScene = FALSE
BOOL bCanInterruptBaseScene = FALSE
BOOL bForceSceneStart = FALSE
FLOAT fBlendInDelta = NORMAL_BLEND_IN
TEXT_LABEL_23 tlAnimNameWilly, tlAnimNameGroupie
SWITCH eWhichAnim
CASE N1A_WGAT_BASE_ANIM
bLoopedScene = TRUE
bHoldLastFrameScene = FALSE
bCanInterruptBaseScene = FALSE
tlAnimNameWilly = "BASE_Willie"
tlAnimNameGroupie = "BASE_GIRL"
BREAK
CASE N1A_WGAT_BASE_2_ANIM
bLoopedScene = TRUE
bHoldLastFrameScene = FALSE
bCanInterruptBaseScene = FALSE
tlAnimNameWilly = "BASE_02_Willie"
tlAnimNameGroupie = "BASE_02_GIRL"
BREAK
CASE N1A_WGAT_THIS_IS_AWKWARD
bLoopedScene = FALSE
bHoldLastFrameScene = TRUE
bCanInterruptBaseScene = TRUE
fBlendInDelta = SLOW_BLEND_IN
tlAnimNameWilly = "THIS_IS_AWKWARD_Willie"
tlAnimNameGroupie = "THIS_IS_AWKWARD_GIRL"
BREAK
CASE N1A_WGAT_YOU_KNOW
bLoopedScene = FALSE
bHoldLastFrameScene = TRUE
bCanInterruptBaseScene = TRUE
fBlendInDelta = SLOW_BLEND_IN
tlAnimNameWilly = "YOU_KNOW_Willie"
tlAnimNameGroupie = "YOU_KNOW_GIRL"
BREAK
CASE N1A_WGAT_EXIT
bLoopedScene = FALSE
bHoldLastFrameScene = FALSE
bCanInterruptBaseScene = TRUE
bForceSceneStart = TRUE
fBlendInDelta = SLOW_BLEND_IN
tlAnimNameWilly = "EXIT_Willie"
tlAnimNameGroupie = "EXIT_GIRL"
BREAK
DEFAULT
SCRIPT_ASSERT("Nigel1A.sc : SET_WILLY_GROUPIE_SYNCED_ANIM invalid parameter eWhichAnim")
BREAK
ENDSWITCH
// if the synched scene isn't allowed to interupt the base anim, exit early if the base anim scene is running
IF NOT bCanInterruptBaseScene
IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncedSceneID_WillyGroupieScenes[N1A_WGAT_BASE_ANIM])
OR IS_SYNCHRONIZED_SCENE_RUNNING(iSyncedSceneID_WillyGroupieScenes[N1A_WGAT_BASE_2_ANIM])
EXIT
ELSE
CPRINTLN(DEBUG_MISSION, "SET_WILLY_GROUPIE_SYNCED_ANIM - claims sync scenes aren't running to exit early : tlAnimNameWilly = ", tlAnimNameWilly)
ENDIF
ENDIF
// don't allow the synched scene to stomp on other scenes (excluding base)
IF NOT bForceSceneStart
FOR i = 0 TO (ENUM_TO_INT(N1A_MAX_Willy_GROUPIE_ANIM_TYPE) - 1)
IF i != ENUM_TO_INT(N1A_WGAT_BASE_ANIM)
AND i != ENUM_TO_INT(N1A_WGAT_BASE_2_ANIM)
IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncedSceneID_WillyGroupieScenes[i])
// allow interupt if scene is about to finish
IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncedSceneID_WillyGroupieScenes[i]) < 0.95
EXIT
ENDIF
ENDIF
ENDIF
ENDFOR
ENDIF
IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iSyncedSceneID_WillyGroupieScenes[eWhichAnim])
iSyncedSceneID_WillyGroupieScenes[eWhichAnim] = CREATE_SYNCHRONIZED_SCENE(vSyncedScenePosition_WillyGroupie, vSyncedSceneRotation_WillyGroupie)
SET_SYNCHRONIZED_SCENE_LOOPED(iSyncedSceneID_WillyGroupieScenes[eWhichAnim], bLoopedScene)
SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(iSyncedSceneID_WillyGroupieScenes[eWhichAnim], bHoldLastFrameScene)
// task the peds
IF IS_PED_UNINJURED(sWillyPed.pedIndex)
IF IS_ENTITY_PLAYING_ANIM(sWillyPed.pedIndex, tlAnimDict_WillyMocappedAnims, tlAnimNameWilly)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_WILLY_GROUPIE_SYNCED_ANIM - Willy already playing anim : ", tlAnimNameWilly) ENDIF #ENDIF
ELSE
IF IsPedPerformingTask(sWillyPed.pedIndex, SCRIPT_TASK_SYNCHRONIZED_SCENE)
STOP_SYNCHRONIZED_ENTITY_ANIM(sWillyPed.pedIndex, NORMAL_BLEND_OUT, FALSE)
ENDIF
TASK_SYNCHRONIZED_SCENE(sWillyPed.pedIndex, iSyncedSceneID_WillyGroupieScenes[eWhichAnim], tlAnimDict_WillyMocappedAnims, tlAnimNameWilly, fBlendInDelta, NORMAL_BLEND_OUT,
SYNCED_SCENE_ABORT_ON_WEAPON_DAMAGE | SYNCED_SCENE_USE_PHYSICS) // can use SYNCED_SCENE_ACTIVATE_RAGDOLL_ON_COLLISION since he ragdoll continuously
// 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(sWillyPed.pedIndex)
ENDIF
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_WILLY_GROUPIE_SYNCED_ANIM - Willy's set anim : ", tlAnimNameWilly, " FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
ENDIF
IF IS_PED_UNINJURED(sClubPed[GROUPIE_WILLYS_PIECE].pedIndex)
IF IS_ENTITY_PLAYING_ANIM(sClubPed[GROUPIE_WILLYS_PIECE].pedIndex, tlAnimDict_WillyMocappedAnims, tlAnimNameGroupie)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_WILLY_GROUPIE_SYNCED_ANIM - groupie already playing anim : ", tlAnimNameGroupie) ENDIF #ENDIF
ELSE
IF IsPedPerformingTask(sClubPed[GROUPIE_WILLYS_PIECE].pedIndex, SCRIPT_TASK_SYNCHRONIZED_SCENE)
STOP_SYNCHRONIZED_ENTITY_ANIM(sClubPed[GROUPIE_WILLYS_PIECE].pedIndex, NORMAL_BLEND_OUT, FALSE)
ENDIF
TASK_SYNCHRONIZED_SCENE(sClubPed[GROUPIE_WILLYS_PIECE].pedIndex, iSyncedSceneID_WillyGroupieScenes[eWhichAnim], tlAnimDict_WillyMocappedAnims, tlAnimNameGroupie, fBlendInDelta, NORMAL_BLEND_OUT,
SYNCED_SCENE_ABORT_ON_WEAPON_DAMAGE | SYNCED_SCENE_USE_PHYSICS) // can use SYNCED_SCENE_ACTIVATE_RAGDOLL_ON_COLLISION since he ragdoll continuously
// 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(sClubPed[GROUPIE_WILLYS_PIECE].pedIndex)
ENDIF
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_WILLY_GROUPIE_SYNCED_ANIM - groupie set anim : ", tlAnimNameGroupie, " FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
ENDIF
ELSE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_WILLY_GROUPIE_SYNCED_ANIM - skipped, scene in question already running ", eWhichAnim) ENDIF #ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// if Willy / groupie has finished their exit animation reaction animation. Handles triggering and checking it's finished
/// PARAMS:
/// bCheckWillyStatus - if TRUE returns Willy's status, if FALSE returns Groupies status
/// RETURNS:
/// TRUE if the specfic ped has finished their surrender reaction anim
FUNC BOOL HAS_Willy_AND_GROUPIE_FINISHED_EXIT_SYNCED_ANIM(BOOL bCheckWillyStatus)
// decide which exit scene to play - if celeb is in synced scene both will need exit
IF NOT bSetExitSceneForWillyAndGroupie
SET_WILLY_GROUPIE_SYNCED_ANIM(N1A_WGAT_EXIT)
bSetExitSceneForWillyAndGroupie = TRUE
ELSE
// if both scenes aren't running check ped has finished sync scene task
PED_INDEX pedToTest = sClubPed[GROUPIE_WILLYS_PIECE].pedIndex
IF bCheckWillyStatus
pedToTest = sWillyPed.pedIndex
ENDIF
IF IS_PED_UNINJURED(pedToTest)
IF NOT IsPedPerformingTask(pedToTest, SCRIPT_TASK_SYNCHRONIZED_SCENE)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "HAS_Willy_AND_GROUPIE_FINISHED_EXIT_SYNCED_ANIM - return TRUE not got active task with para bCheckWillyStatus : ", bCheckWillyStatus) ENDIF #ENDIF
RETURN TRUE
ELIF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iSyncedSceneID_WillyGroupieScenes[N1A_WGAT_EXIT])
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "HAS_Willy_AND_GROUPIE_FINISHED_EXIT_SYNCED_ANIM - return TRUE sync scene not running with para bCheckWillyStatus : ", bCheckWillyStatus) ENDIF #ENDIF
RETURN TRUE
ELSE
// B*1516076 - Allow Willy to break out ealier
IF bCheckWillyStatus
IF (GET_SYNCHRONIZED_SCENE_PHASE(iSyncedSceneID_WillyGroupieScenes[N1A_WGAT_EXIT]) > 0.85)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "HAS_Willy_AND_GROUPIE_FINISHED_EXIT_SYNCED_ANIM - return TRUE early exit in anim bCheckWillyStatus : ", bCheckWillyStatus) ENDIF #ENDIF
RETURN TRUE
ENDIF
ENDIF
// speed up the scene's rate
IF (GET_SYNCHRONIZED_SCENE_RATE(iSyncedSceneID_WillyGroupieScenes[N1A_WGAT_EXIT]) < 1.25)
SET_SYNCHRONIZED_SCENE_RATE(iSyncedSceneID_WillyGroupieScenes[N1A_WGAT_EXIT], 1.25)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "HAS_Willy_AND_GROUPIE_FINISHED_EXIT_SYNCED_ANIM - updating scene rate 1.25 this frame") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// get the anim string for the specified ped's anim type
/// PARAMS:
/// iClubPedIndex - the specific ped
/// eWhichAnim - the anim type
/// RETURNS:
/// TEXT_LABEL_23 name of the anim
FUNC TEXT_LABEL_23 GET_CLUB_PED_ANIM_NAME(INT iClubPedIndex, N1A_CLUB_PED_ANIM_TYPE eWhichAnim)
TEXT_LABEL_23 tlAnimName = ""
SWITCH eWhichAnim
CASE N1A_CPAT_BASE_ANIM
tlAnimName = "BASE_"
BREAK
CASE N1A_CPAT_BUMP_ANIM
// these two peds only have a valid bump anim
IF iClubPedIndex != CLUB_PED_BAND_MANAGER
AND iClubPedIndex != CLUB_PED_GROUPIE_UPSTAIRS_02
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "GET_CLUB_PED_ANIM_NAME - RETURN TEXT_LABEL_23 ", tlAnimName, " early no valid anim for ped ID : ", iClubPedIndex) ENDIF #ENDIF
RETURN tlAnimName
ELSE
tlAnimName = "BUMP_"
ENDIF
BREAK
CASE N1A_CPAT_IDLE_A_ANIM
tlAnimName = "IDLE_A_"
BREAK
CASE N1A_CPAT_IDLE_B_ANIM
tlAnimName = "IDLE_B_"
BREAK
CASE N1A_CPAT_OUTRO_ANIM
tlAnimName = "OUTRO_"
BREAK
DEFAULT
SCRIPT_ASSERT("Nigel1A.sc : GET_CLUB_PED_ANIM_NAME invalid parameter eWhichAnim")
BREAK
ENDSWITCH
TEXT_LABEL_23 tlPedExtention = ""
SWITCH iClubPedIndex
CASE CLUB_PED_BAND_MANAGER
tlPedExtention = "M1"
BREAK
CASE CLUB_PED_ROADIE
tlPedExtention = "M2"
BREAK
CASE CLUB_PED_GROUPIE_UPSTAIRS_01
tlPedExtention = "F2"
BREAK
CASE CLUB_PED_GROUPIE_UPSTAIRS_02
tlPedExtention = "F1"
BREAK
DEFAULT
SCRIPT_ASSERT("Nigel1A.sc : GET_CLUB_PED_ANIM_NAME invalid parameter iClubPedIndex")
BREAK
ENDSWITCH
tlAnimName += tlPedExtention
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "GET_CLUB_PED_ANIM_NAME - RETURN TEXT_LABEL_23 ", tlAnimName, " for ped ID : ", iClubPedIndex) ENDIF #ENDIF
RETURN tlAnimName
ENDFUNC
/// PURPOSE:
/// task the club peds upstairs to use the specific anim
/// PARAMS:
/// iClubPedIndex - the specific ped
/// eWhichAnim - which animation they should be using
PROC SET_SPECIFIC_CLUB_PED_UPSTAIRS_SYNCED_ANIM(INT iClubPedIndex, INT iSyncedSceneID, N1A_CLUB_PED_ANIM_TYPE eWhichAnim, FLOAT fBlendInDelta = NORMAL_BLEND_IN)
// These two don't use the synced anims
IF iClubPedIndex != GROUPIE_WILLYS_PIECE
IF IS_PED_UNINJURED(sClubPed[iClubPedIndex].pedIndex)
TEXT_LABEL_23 tlSyncedAnimName = GET_CLUB_PED_ANIM_NAME(iClubPedIndex, eWhichAnim)
STRING sSyncedAnimName = N1A_CONVERT_TEXT_LABEL_TO_STRING_FORMAT(tlSyncedAnimName)
IF IS_ENTITY_PLAYING_ANIM(sClubPed[iClubPedIndex].pedIndex, tlAnimDict_ClubPedsUpstairs, sSyncedAnimName)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_CLUB_PEDS_UPSTAIRS_SYNCED_ANIM - already playing anim : ", sSyncedAnimName, " for ped ID :", iClubPedIndex) ENDIF #ENDIF
ELSE
IF IsPedPerformingTask(sClubPed[iClubPedIndex].pedIndex, SCRIPT_TASK_SYNCHRONIZED_SCENE)
STOP_SYNCHRONIZED_ENTITY_ANIM(sClubPed[iClubPedIndex].pedIndex, NORMAL_BLEND_OUT, FALSE)
ENDIF
TASK_SYNCHRONIZED_SCENE(sClubPed[iClubPedIndex].pedIndex, iSyncedSceneID, tlAnimDict_ClubPedsUpstairs, sSyncedAnimName, fBlendInDelta, NORMAL_BLEND_OUT,
SYNCED_SCENE_ABORT_ON_WEAPON_DAMAGE | SYNCED_SCENE_USE_PHYSICS)
// 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(sClubPed[iClubPedIndex].pedIndex)
ENDIF
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_CLUB_PEDS_UPSTAIRS_SYNCED_ANIM - set anim : ", sSyncedAnimName, " for ped ID :", iClubPedIndex) ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// task the club peds upstairs to use the specific anim
/// PARAMS:
/// eWhichAnim - which animation they should be using
PROC SET_CLUB_PEDS_UPSTAIRS_SYNCED_ANIM(N1A_CLUB_PED_ANIM_TYPE eWhichAnim)
INT i
BOOL bLoopedScene = FALSE
BOOL bHoldLastFrameScene = FALSE
BOOL bCanInterruptBaseScene = FALSE
BOOL bForceSceneStart = FALSE
FLOAT fBlendInDelta = NORMAL_BLEND_IN
SWITCH eWhichAnim
CASE N1A_CPAT_BASE_ANIM
bLoopedScene = TRUE
bHoldLastFrameScene = FALSE
bCanInterruptBaseScene = FALSE
BREAK
CASE N1A_CPAT_BUMP_ANIM
bLoopedScene = FALSE
bHoldLastFrameScene = FALSE
bCanInterruptBaseScene = TRUE
BREAK
CASE N1A_CPAT_IDLE_A_ANIM
bLoopedScene = FALSE
bHoldLastFrameScene = FALSE
bCanInterruptBaseScene = TRUE
BREAK
CASE N1A_CPAT_IDLE_B_ANIM
bLoopedScene = FALSE
bHoldLastFrameScene = FALSE
bCanInterruptBaseScene = TRUE
bForceSceneStart = TRUE
fBlendInDelta = SLOW_BLEND_IN
BREAK
CASE N1A_CPAT_OUTRO_ANIM
bLoopedScene = FALSE
bHoldLastFrameScene = FALSE
bCanInterruptBaseScene = TRUE
bForceSceneStart = TRUE
fBlendInDelta = SLOW_BLEND_IN
BREAK
DEFAULT
SCRIPT_ASSERT("Nigel1A.sc : GET_CLUB_PED_ANIM_NAME invalid parameter eWhichAnim")
BREAK
ENDSWITCH
// if the synched scene isn't allowd to interupt the base anim, exit early if the base anim scene is running
IF NOT bCanInterruptBaseScene
IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncedSceneID_ClubPedUpstairsScenes[N1A_CPAT_BASE_ANIM])
EXIT
ENDIF
ENDIF
// don't allow the synched scene to stomp one other scenes (excluding base)
IF NOT bForceSceneStart
FOR i = 0 TO (ENUM_TO_INT(N1A_MAX_CLUB_PED_ANIM_TYPE) - 1)
IF i != ENUM_TO_INT(N1A_CPAT_BASE_ANIM)
IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncedSceneID_ClubPedUpstairsScenes[i])
// allow interupt if scene is about to finish
IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncedSceneID_ClubPedUpstairsScenes[i]) < 0.95
EXIT
ENDIF
ENDIF
ENDIF
ENDFOR
ENDIF
IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iSyncedSceneID_WillyGroupieScenes[eWhichAnim])
iSyncedSceneID_ClubPedUpstairsScenes[eWhichAnim] = CREATE_SYNCHRONIZED_SCENE(vSyncedScenePosition_ClubPedsUpstairs, vSyncedSceneRotation_ClubPedsUpstairs)
SET_SYNCHRONIZED_SCENE_LOOPED(iSyncedSceneID_ClubPedUpstairsScenes[eWhichAnim], bLoopedScene)
SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(iSyncedSceneID_ClubPedUpstairsScenes[eWhichAnim], bHoldLastFrameScene)
FOR i = 0 TO (MAX_NUM_CLUB_PEDS - 1)
IF i != GROUPIE_WILLYS_PIECE
SET_SPECIFIC_CLUB_PED_UPSTAIRS_SYNCED_ANIM(i, iSyncedSceneID_ClubPedUpstairsScenes[eWhichAnim], eWhichAnim, fBlendInDelta)
ENDIF
ENDFOR
ELSE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_CLUB_PEDS_UPSTAIRS_SYNCED_ANIM - skipped as sync in question already running: ", eWhichAnim) ENDIF #ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// task the club peds upstairs to use their bumped anim
/// PARAMS:
/// iClubPedIndex - the specific ped
PROC SET_SPECIFIC_CLUB_PED_UPSTAIRS_BUMPED_ANIM(INT iClubPedIndex)
// Only these two peds have bumped anims
IF iClubPedIndex = CLUB_PED_BAND_MANAGER
OR iClubPedIndex = CLUB_PED_GROUPIE_UPSTAIRS_02
IF IS_PED_UNINJURED(sClubPed[iClubPedIndex].pedIndex)
TEXT_LABEL_23 tlBumpedAnimName = GET_CLUB_PED_ANIM_NAME(iClubPedIndex, N1A_CPAT_BUMP_ANIM)
STRING sBumpedAnimName = N1A_CONVERT_TEXT_LABEL_TO_STRING_FORMAT(tlBumpedAnimName)
IF NOT IS_ENTITY_PLAYING_ANIM(sClubPed[iClubPedIndex].pedIndex, tlAnimDict_ClubPedsUpstairs, sBumpedAnimName)
IF IsPedPerformingTask(sClubPed[iClubPedIndex].pedIndex, SCRIPT_TASK_SYNCHRONIZED_SCENE)
STOP_SYNCHRONIZED_ENTITY_ANIM(sClubPed[iClubPedIndex].pedIndex, NORMAL_BLEND_OUT, FALSE)
ENDIF
TASK_PLAY_ANIM(sClubPed[iClubPedIndex].pedIndex, tlAnimDict_ClubPedsUpstairs, sBumpedAnimName, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1)
// 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(sClubPed[iClubPedIndex].pedIndex)
ENDIF
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SET_SPECIFIC_CLUB_PED_UPSTAIRS_BUMPED_ANIM - set anim ", sBumpedAnimName, " for ped ID :", iClubPedIndex) ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// if the specific ped has finished their synced scene break out animation. Handles triggering and checking it's finished
/// PARAMS:
/// iClubPedIndex - specific ped to check
/// RETURNS:
/// TRUE if the specfic ped has finished their synced scene break out animation
FUNC BOOL HAS_CLUB_PED_FINISHED_SYNCED_SCENE_BREAK_OUT_ANIM(INT iClubPedIndex)
IF IS_PED_UNINJURED(sClubPed[iClubPedIndex].pedIndex)
// these pair don't have exit anims
IF iClubPedIndex = GROUPIE_WILLYS_PIECE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "HAS_CLUB_PED_FINISHED_SYNCED_SCENE_BREAK_OUT_ANIM - return TRUE skipped for iClubPedIndex :", iClubPedIndex) ENDIF #ENDIF
RETURN TRUE
ENDIF
TEXT_LABEL_23 tlBreakOutAnimName = GET_CLUB_PED_ANIM_NAME(iClubPedIndex, N1A_CPAT_OUTRO_ANIM)
STRING sBreakOutAnimName = N1A_CONVERT_TEXT_LABEL_TO_STRING_FORMAT(tlBreakOutAnimName)
IF IsPedPerformingTask(sClubPed[iClubPedIndex].pedIndex, SCRIPT_TASK_SYNCHRONIZED_SCENE)
STOP_SYNCHRONIZED_ENTITY_ANIM(sClubPed[iClubPedIndex].pedIndex, NORMAL_BLEND_OUT, FALSE)
TASK_PLAY_ANIM(sClubPed[iClubPedIndex].pedIndex, tlAnimDict_ClubPedsUpstairs, sBreakOutAnimName, NORMAL_BLEND_IN, SLOW_BLEND_OUT, -1)
// 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(sClubPed[iClubPedIndex].pedIndex)
ENDIF
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "HAS_CLUB_PED_FINISHED_SYNCED_SCENE_BREAK_OUT_ANIM - set exit anim : ", sBreakOutAnimName, " from sync scene task iClubPedIndex :", iClubPedIndex) ENDIF #ENDIF
// test for the female finishing her reaction animation
ELIF NOT IS_ENTITY_PLAYING_ANIM(sClubPed[iClubPedIndex].pedIndex, tlAnimDict_ClubPedsUpstairs, sBreakOutAnimName)
//check these pair aren't playing their bumped anim
IF iClubPedIndex = CLUB_PED_BAND_MANAGER
OR iClubPedIndex = CLUB_PED_GROUPIE_UPSTAIRS_02
TEXT_LABEL_23 tlBumpAnimName = GET_CLUB_PED_ANIM_NAME(iClubPedIndex, N1A_CPAT_OUTRO_ANIM)
STRING sBumpAnimName = N1A_CONVERT_TEXT_LABEL_TO_STRING_FORMAT(tlBumpAnimName)
IF IS_ENTITY_PLAYING_ANIM(sClubPed[iClubPedIndex].pedIndex, tlAnimDict_ClubPedsUpstairs, sBumpAnimName)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "HAS_CLUB_PED_FINISHED_SYNCED_SCENE_BREAK_OUT_ANIM - waiting for bump anim to finish anim : ", sBumpAnimName, " iClubPedIndex :", iClubPedIndex) ENDIF #ENDIF
RETURN FALSE
ENDIF
ENDIF
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "HAS_CLUB_PED_FINISHED_SYNCED_SCENE_BREAK_OUT_ANIM - return TRUE for iClubPedIndex :", iClubPedIndex) ENDIF #ENDIF
RETURN TRUE
ELSE
//SET_ENTITY_ANIM_SPEED(sClubPed[iClubPedIndex].pedIndex, tlAnimDict_ClubPedsUpstairs, GET_CLUB_PED_ANIM_NAME(iClubPedIndex, N1A_CPAT_OUTRO_ANIM), 1.2)
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// handles setting the club doors' initial states using the DOOR_SYSTEM_GET_IS_PHYSICS_LOADED check
PROC MANAGE_SET_CLUB_DOORS_INITIAL_STATES()
INT i
FOR i = 0 TO (ENUM_TO_INT(N1A_MAX_MISSION_CONTROLLED_DOORS) - 1)
IF bSetMissionControlledDoorsInitialStates[i] = FALSE
IF IS_MISSION_CONTROLLED_DOOR_PHYSICS_LOADED(INT_TO_ENUM(N1A_MISSION_CONTROLLED_DOORS_ENUM, i))
SWITCH INT_TO_ENUM(N1A_MISSION_CONTROLLED_DOORS_ENUM, i)
CASE N1A_MCD_INT_DD_TO_MAIN_ROOM_01
// double doors leading from the main entrance corridor into the main room
SET_MISSION_CONTROLLED_DOOR_OPEN_RATIO(N1A_MCD_INT_DD_TO_MAIN_ROOM_01, 1.0, TRUE, FALSE)
//SET_MISSION_CONTROLLED_DOOR_STATE(N1A_MCD_INT_DD_TO_MAIN_ROOM_01, DOORSTATE_FORCE_UNLOCKED_THIS_FRAME)
SET_MISSION_CONTROLLED_DOOR_STATE(N1A_MCD_INT_DD_TO_MAIN_ROOM_01, DOORSTATE_FORCE_OPEN_THIS_FRAME, TRUE)
BREAK
CASE N1A_MCD_INT_DD_TO_MAIN_ROOM_02
// double doors leading from the main entrance corridor into the main room
SET_MISSION_CONTROLLED_DOOR_OPEN_RATIO(N1A_MCD_INT_DD_TO_MAIN_ROOM_02, 1.0, TRUE, FALSE)
//SET_MISSION_CONTROLLED_DOOR_STATE(N1A_MCD_INT_DD_TO_MAIN_ROOM_02, DOORSTATE_FORCE_UNLOCKED_THIS_FRAME)
SET_MISSION_CONTROLLED_DOOR_STATE(N1A_MCD_INT_DD_TO_MAIN_ROOM_02, DOORSTATE_FORCE_OPEN_THIS_FRAME, TRUE)
BREAK
CASE N1A_MCD_INT_ENTRANCE_STAFF_AREA_01
// the door leads to the staff area at the main entrance where they'd take tickets / cash
SET_MISSION_CONTROLLED_DOOR_OPEN_RATIO(N1A_MCD_INT_ENTRANCE_STAFF_AREA_01, 0.0, FALSE, FALSE)
//SET_MISSION_CONTROLLED_DOOR_STATE(N1A_MCD_INT_ENTRANCE_STAFF_AREA_01, DOORSTATE_FORCE_UNLOCKED_THIS_FRAME)
SET_MISSION_CONTROLLED_DOOR_STATE(N1A_MCD_INT_ENTRANCE_STAFF_AREA_01, DOORSTATE_FORCE_CLOSED_THIS_FRAME, TRUE)
SET_MISSION_CONTROLLED_DOOR_STATE(N1A_MCD_INT_ENTRANCE_STAFF_AREA_01, DOORSTATE_FORCE_OPEN_THIS_FRAME, TRUE)
BREAK
CASE N1A_MCD_INT_TO_REAR_ENTRANCE_01
// the door which leads up the stairs to the rear entrance
SET_MISSION_CONTROLLED_DOOR_OPEN_RATIO(N1A_MCD_INT_TO_REAR_ENTRANCE_01, 0.0, FALSE, FALSE)
//SET_MISSION_CONTROLLED_DOOR_STATE(N1A_MCD_INT_TO_REAR_ENTRANCE_01, DOORSTATE_FORCE_UNLOCKED_THIS_FRAME)
SET_MISSION_CONTROLLED_DOOR_STATE(N1A_MCD_INT_TO_REAR_ENTRANCE_01, DOORSTATE_FORCE_CLOSED_THIS_FRAME, TRUE)
SET_MISSION_CONTROLLED_DOOR_STATE(N1A_MCD_INT_TO_REAR_ENTRANCE_01, DOORSTATE_FORCE_OPEN_THIS_FRAME, TRUE)
BREAK
CASE N1A_MCD_INT_TO_BASEMENT_01
// the door which leads down to the basement area
SET_MISSION_CONTROLLED_DOOR_OPEN_RATIO(N1A_MCD_INT_TO_BASEMENT_01, 0.0, FALSE, FALSE)
//SET_MISSION_CONTROLLED_DOOR_STATE(N1A_MCD_INT_TO_BASEMENT_01, DOORSTATE_FORCE_UNLOCKED_THIS_FRAME)
SET_MISSION_CONTROLLED_DOOR_STATE(N1A_MCD_INT_TO_BASEMENT_01, DOORSTATE_FORCE_CLOSED_THIS_FRAME, TRUE)
SET_MISSION_CONTROLLED_DOOR_STATE(N1A_MCD_INT_TO_BASEMENT_01, DOORSTATE_FORCE_OPEN_THIS_FRAME, TRUE)
BREAK
CASE N1A_MCD_INT_BASEMENT_01
// the door for the basement room
SET_MISSION_CONTROLLED_DOOR_OPEN_RATIO(N1A_MCD_INT_BASEMENT_01, 0.0, FALSE, FALSE)
//SET_MISSION_CONTROLLED_DOOR_STATE(N1A_MCD_INT_BASEMENT_01, DOORSTATE_FORCE_UNLOCKED_THIS_FRAME)
SET_MISSION_CONTROLLED_DOOR_STATE(N1A_MCD_INT_BASEMENT_01, DOORSTATE_FORCE_CLOSED_THIS_FRAME, TRUE)
SET_MISSION_CONTROLLED_DOOR_STATE(N1A_MCD_INT_BASEMENT_01, DOORSTATE_FORCE_OPEN_THIS_FRAME, TRUE)
BREAK
DEFAULT
SCRIPT_ASSERT("NIGEL 1A : MANAGE_SET_CLUB_DOORS_INITIAL_STATES - invalid door value detected for N1A_MISSION_CONTROLLED_DOORS_ENUM")
BREAK
ENDSWITCH
bSetMissionControlledDoorsInitialStates[i] = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_SET_CLUB_DOORS_INITIAL_STATES - set this frame : ", GET_FRAME_COUNT(), " for door : ", i) ENDIF #ENDIF
ENDIF
ENDIF
ENDFOR
/*
// NOTE: two doors for the room upstairs aren't currently tagged up as doors.
///Some info from David to try out -
// Set Ratios first with no flush then call set state with DOORSTATE_FORCE_CLOSED_THIS_FRAME and flush state to true
// then immediately calling set state with DOORSTATE_FORCE_OPEN_THIS_FRAME
// also setting flush state to true this should first snap the door into position then immediately open it.
SET_MISSION_CONTROLLED_DOOR_OPEN_RATIO(N1A_MCD_INT_DD_TO_MAIN_ROOM_01, 1.0, TRUE, FALSE)
SET_MISSION_CONTROLLED_DOOR_OPEN_RATIO(N1A_MCD_INT_DD_TO_MAIN_ROOM_02, 1.0, TRUE, FALSE)
SET_MISSION_CONTROLLED_DOOR_OPEN_RATIO(N1A_MCD_INT_ENTRANCE_STAFF_AREA_01, 0.0, FALSE, FALSE)
SET_MISSION_CONTROLLED_DOOR_OPEN_RATIO(N1A_MCD_INT_TO_REAR_ENTRANCE_01, 0.0, FALSE, FALSE)
SET_MISSION_CONTROLLED_DOOR_OPEN_RATIO(N1A_MCD_INT_TO_BASEMENT_01, 0.0, FALSE, FALSE)
SET_MISSION_CONTROLLED_DOOR_OPEN_RATIO(N1A_MCD_INT_BASEMENT_01, 0.0, FALSE, FALSE)
SET_MISSION_CONTROLLED_DOOR_STATE(N1A_MCD_INT_ENTRANCE_STAFF_AREA_01, DOORSTATE_FORCE_CLOSED_THIS_FRAME, TRUE)
SET_MISSION_CONTROLLED_DOOR_STATE(N1A_MCD_INT_TO_REAR_ENTRANCE_01, DOORSTATE_FORCE_CLOSED_THIS_FRAME, TRUE)
SET_MISSION_CONTROLLED_DOOR_STATE(N1A_MCD_INT_TO_BASEMENT_01, DOORSTATE_FORCE_CLOSED_THIS_FRAME, TRUE)
SET_MISSION_CONTROLLED_DOOR_STATE(N1A_MCD_INT_BASEMENT_01, DOORSTATE_FORCE_CLOSED_THIS_FRAME, TRUE)
WAIT(0)
SET_MISSION_CONTROLLED_DOOR_STATE(N1A_MCD_INT_DD_TO_MAIN_ROOM_01, DOORSTATE_FORCE_OPEN_THIS_FRAME, TRUE)
SET_MISSION_CONTROLLED_DOOR_STATE(N1A_MCD_INT_DD_TO_MAIN_ROOM_02, DOORSTATE_FORCE_OPEN_THIS_FRAME, TRUE)
SET_MISSION_CONTROLLED_DOOR_STATE(N1A_MCD_INT_ENTRANCE_STAFF_AREA_01, DOORSTATE_FORCE_OPEN_THIS_FRAME, TRUE)
SET_MISSION_CONTROLLED_DOOR_STATE(N1A_MCD_INT_TO_REAR_ENTRANCE_01, DOORSTATE_FORCE_OPEN_THIS_FRAME, TRUE)
SET_MISSION_CONTROLLED_DOOR_STATE(N1A_MCD_INT_TO_BASEMENT_01, DOORSTATE_FORCE_OPEN_THIS_FRAME, TRUE)
SET_MISSION_CONTROLLED_DOOR_STATE(N1A_MCD_INT_BASEMENT_01, DOORSTATE_FORCE_OPEN_THIS_FRAME, TRUE) */
/*
// double doors leading from the main entrance corridor into the main room
//SET_MISSION_CONTROLLED_DOOR_OPEN_RATIO(N1A_MCD_INT_DD_TO_MAIN_ROOM_01, 1.0, TRUE, FALSE)
//SET_MISSION_CONTROLLED_DOOR_STATE(N1A_MCD_INT_DD_TO_MAIN_ROOM_01, DOORSTATE_FORCE_UNLOCKED_THIS_FRAME)
SET_MISSION_CONTROLLED_DOOR_STATE(N1A_MCD_INT_DD_TO_MAIN_ROOM_01, DOORSTATE_FORCE_OPEN_THIS_FRAME, TRUE)
//SET_MISSION_CONTROLLED_DOOR_OPEN_RATIO(N1A_MCD_INT_DD_TO_MAIN_ROOM_02, 1.0, TRUE, FALSE)
//SET_MISSION_CONTROLLED_DOOR_STATE(N1A_MCD_INT_DD_TO_MAIN_ROOM_02, DOORSTATE_FORCE_UNLOCKED_THIS_FRAME)
SET_MISSION_CONTROLLED_DOOR_STATE(N1A_MCD_INT_DD_TO_MAIN_ROOM_02, DOORSTATE_FORCE_OPEN_THIS_FRAME, TRUE)
// the door leads to the staff area at the main entrance where they'd take tickets / cash
//SET_MISSION_CONTROLLED_DOOR_OPEN_RATIO(N1A_MCD_INT_ENTRANCE_STAFF_AREA_01, 0.0, FALSE, FALSE)
//SET_MISSION_CONTROLLED_DOOR_STATE(N1A_MCD_INT_ENTRANCE_STAFF_AREA_01, DOORSTATE_FORCE_UNLOCKED_THIS_FRAME)
SET_MISSION_CONTROLLED_DOOR_STATE(N1A_MCD_INT_ENTRANCE_STAFF_AREA_01, DOORSTATE_FORCE_CLOSED_THIS_FRAME, TRUE)
SET_MISSION_CONTROLLED_DOOR_STATE(N1A_MCD_INT_ENTRANCE_STAFF_AREA_01, DOORSTATE_FORCE_OPEN_THIS_FRAME, TRUE)
// the door which leads up the stairs to the rear entrance
//SET_MISSION_CONTROLLED_DOOR_OPEN_RATIO(N1A_MCD_INT_TO_REAR_ENTRANCE_01, 0.0, FALSE, FALSE)
//SET_MISSION_CONTROLLED_DOOR_STATE(N1A_MCD_INT_TO_REAR_ENTRANCE_01, DOORSTATE_FORCE_UNLOCKED_THIS_FRAME)
SET_MISSION_CONTROLLED_DOOR_STATE(N1A_MCD_INT_TO_REAR_ENTRANCE_01, DOORSTATE_FORCE_CLOSED_THIS_FRAME, TRUE)
SET_MISSION_CONTROLLED_DOOR_STATE(N1A_MCD_INT_TO_REAR_ENTRANCE_01, DOORSTATE_FORCE_OPEN_THIS_FRAME, TRUE)
// NOTE: two doors for the room upstairs aren't currently tagged up as doors.
// the door which leads down to the basement area
//SET_MISSION_CONTROLLED_DOOR_OPEN_RATIO(N1A_MCD_INT_TO_BASEMENT_01, 0.0, FALSE, FALSE)
//SET_MISSION_CONTROLLED_DOOR_STATE(N1A_MCD_INT_TO_BASEMENT_01, DOORSTATE_FORCE_UNLOCKED_THIS_FRAME)
SET_MISSION_CONTROLLED_DOOR_STATE(N1A_MCD_INT_TO_BASEMENT_01, DOORSTATE_FORCE_CLOSED_THIS_FRAME, TRUE)
SET_MISSION_CONTROLLED_DOOR_STATE(N1A_MCD_INT_TO_BASEMENT_01, DOORSTATE_FORCE_OPEN_THIS_FRAME, TRUE)
// the door for the basement room
//SET_MISSION_CONTROLLED_DOOR_OPEN_RATIO(N1A_MCD_INT_BASEMENT_01, 0.0, FALSE, FALSE)
//SET_MISSION_CONTROLLED_DOOR_STATE(N1A_MCD_INT_BASEMENT_01, DOORSTATE_FORCE_UNLOCKED_THIS_FRAME)
SET_MISSION_CONTROLLED_DOOR_STATE(N1A_MCD_INT_BASEMENT_01, DOORSTATE_FORCE_CLOSED_THIS_FRAME, TRUE)
SET_MISSION_CONTROLLED_DOOR_STATE(N1A_MCD_INT_BASEMENT_01, DOORSTATE_FORCE_OPEN_THIS_FRAME, TRUE) */
ENDPROC
/// PURPOSE:
/// deals with pinningthe hospital interior to memory and setting the interior active
/// PARAMS:
/// bDoHasAssetsLoadedCheck - if true game waits on IS_INTERIOR_READY check
FUNC BOOL IS_MUSIC_CLUB_INTERIOR_LOADED(BOOL bRequestInterior = TRUE)
// distance from venue check?
IF NOT IS_INTERIOR_READY(RockClubInteriorIndex)
IF bRequestInterior
PIN_INTERIOR_IN_MEMORY(RockClubInteriorIndex)
ENDIF
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_MUSIC_CLUB_INTERIOR_LOADED - returning FALSE") ENDIF #ENDIF
RETURN FALSE
ELSE
SET_INTERIOR_ACTIVE(RockClubInteriorIndex, TRUE)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_MUSIC_CLUB_INTERIOR_LOADED - returning TRUE") ENDIF #ENDIF
//bDone_rock_clubInterior_PinnedInMemory = TRUE
RETURN TRUE
ENDIF
ENDFUNC
/// PURPOSE:
/// check if the specified position is inside the club using
/// IS_COLLISION_MARKED_OUTSIDE check
/// PARAMS:
/// vPos - the position to test
/// RETURNS:
/// TRUE if the position is inside the music club interior
FUNC BOOL IS_POSITION_INSIDE_MUSIC_CLUB_INTERIOR(VECTOR vPos)
IF NOT IS_COLLISION_MARKED_OUTSIDE(vPos)
INTERIOR_INSTANCE_INDEX interiorInstanceIndex = GET_INTERIOR_FROM_COLLISION(vPos)
IF interiorInstanceIndex = RockClubInteriorIndex
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_POSITION_INSIDE_MUSIC_CLUB_INTERIOR - return TRUE - for pos : ", vPos) ENDIF #ENDIF
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// check if an entity is inside the rock club interior
/// PARAMS:
/// entityIndex - entity to test
/// eRoomToCheck - the specific room to test
/// bCheckEntityIsAlive - check the entity is alive first
/// RETURNS:
/// true if the entity is inside the rock club interior
FUNC BOOL IS_ENTITY_IN_SPECIFIC_ROOM_INSIDE_MUSIC_CLUB_INTERIOR(ENTITY_INDEX entityIndex, N1A_ROCK_CLUB_INTERIOR_ROOM_ENUM eRoomToCheck, BOOL bCheckEntityIsAlive = TRUE)
IF bCheckEntityIsAlive
IF NOT IS_ENTITY_ALIVE(entityIndex)
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_ENTITY_IN_SPECIFIC_ROOM_INSIDE_MUSIC_CLUB_INTERIOR - return FALSE entityIndex is not alive") ENDIF #ENDIF
RETURN FALSE
ENDIF
ENDIF
VECTOR vPos = GET_ENTITY_COORDS(entityIndex)
IF (GET_INTERIOR_AT_COORDS(vPos) = RockClubInteriorIndex) //unfortunately this check on its own can return true if stood outside interior closeby
INT iHaskKey_PedCurrentRoom
iHaskKey_PedCurrentRoom = GET_KEY_FOR_ENTITY_IN_ROOM(entityIndex)
IF iHaskKey_PedCurrentRoom = iRockClubRoom[eRoomToCheck]
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_PED_IN_SPECIFIC_ROOM_INSIDE_MUSIC_CLUB_INTERIOR - return TRUE - entityIndex in room ID : ", eRoomToCheck) ENDIF #ENDIF
RETURN TRUE
ENDIF
ENDIF
IF eRoomToCheck = N1A_RCR_INVALID
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_PED_IN_SPECIFIC_ROOM_INSIDE_MUSIC_CLUB_INTERIOR - return TRUE - entityIndex status is N1A_RCR_INVALID ID : ", eRoomToCheck) ENDIF #ENDIF
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// check if an entity is inside the rock club interior
/// PARAMS:
/// entityIndex - entity to test
/// bCheckEntityIsAlive - check the ped isn't dead before proceeding NOTE: GET_KEY_FOR_ENTITY_IN_ROOM(pedIndex) requires entity alive check!
/// RETURNS:
/// true if the entity is inside the rock club interior
FUNC BOOL IS_ENTITY_INSIDE_MUSIC_CLUB_INTERIOR(ENTITY_INDEX entityIndex, BOOL bCheckEntityIsAlive = TRUE)
//GET_KEY_FOR_ENTITY_IN_ROOM(pedIndex) requires entity alive check
IF bCheckEntityIsAlive
IF IS_ENTITY_ALIVE(entityIndex)
N1A_ROCK_CLUB_INTERIOR_ROOM_ENUM eRoomToCheck
INT i, iHaskKey_PedCurrentRoom
iHaskKey_PedCurrentRoom = GET_KEY_FOR_ENTITY_IN_ROOM(entityIndex)
FOR i = 0 TO (ENUM_TO_INT(N1A_MAX_NUM_ROCK_CLUB_ROOMS) - 1)
eRoomToCheck = INT_TO_ENUM(N1A_ROCK_CLUB_INTERIOR_ROOM_ENUM, i)
IF eRoomToCheck <> N1A_RCR_INVALID // don't perform the check if it's got to the invalid room
IF iHaskKey_PedCurrentRoom = iRockClubRoom[eRoomToCheck]
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_ENTITY_INSIDE_MUSIC_CLUB_INTERIOR - return TRUE - entityIndex in room ID : ", i) ENDIF #ENDIF
RETURN TRUE
ENDIF
ENDIF
ENDFOR
ENDIF
ELSE
// check is returning inaccurate results, not as reliable as the GET_KEY_FOR_ENTITY_IN_ROOM
VECTOR vPos = GET_ENTITY_COORDS(entityIndex, FALSE)
IF (GET_INTERIOR_AT_COORDS(vPos) = RockClubInteriorIndex) //unfortunately this check on its own can return true if stood outside interior closeby
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_ENTITY_INSIDE_MUSIC_CLUB_INTERIOR - inside interior but room ID doesn't match") ENDIF #ENDIF
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// check if an entity is inside the rock club interior
/// PARAMS:
/// entityIndex - entity to test
/// bCheckEntityIsAlive - check the entity is alive first
/// RETURNS:
/// true if the entity is inside the rock club interior
FUNC N1A_ROCK_CLUB_INTERIOR_ROOM_ENUM GET_PED_INSIDE_MUSIC_CLUB_STATUS(ENTITY_INDEX entityIndex, BOOL bCheckEntityIsAlive = TRUE)
IF bCheckEntityIsAlive
IF NOT IS_ENTITY_ALIVE(entityIndex)
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "N1A_ROCK_CLUB_INTERIOR_ROOM_ENUM - return N1A_RCR_INVALID entityIndex is not alive") ENDIF #ENDIF
RETURN N1A_RCR_INVALID
ENDIF
ENDIF
VECTOR vPos = GET_ENTITY_COORDS(entityIndex)
IF (GET_INTERIOR_AT_COORDS(vPos) = RockClubInteriorIndex) //unfortunately this check on its own can return true if stood outside interior closeby
INT iHaskKey_PedCurrentRoom
iHaskKey_PedCurrentRoom = GET_KEY_FOR_ENTITY_IN_ROOM(entityIndex)
N1A_ROCK_CLUB_INTERIOR_ROOM_ENUM eRoomToCheck
INT i
FOR i = 0 TO (ENUM_TO_INT(N1A_MAX_NUM_ROCK_CLUB_ROOMS) - 1)
eRoomToCheck = INT_TO_ENUM(N1A_ROCK_CLUB_INTERIOR_ROOM_ENUM, i)
IF eRoomToCheck <> N1A_RCR_INVALID // don't perform the check if it's got to the invalid room
IF iHaskKey_PedCurrentRoom = iRockClubRoom[eRoomToCheck]
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "N1A_ROCK_CLUB_INTERIOR_ROOM_ENUM - return room ID : ", i) ENDIF #ENDIF
RETURN eRoomToCheck
ENDIF
ENDIF
ENDFOR
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "N1A_ROCK_CLUB_INTERIOR_ROOM_ENUM - inside interior but room ID doesn't match") ENDIF #ENDIF
ENDIF
RETURN N1A_RCR_INVALID
ENDFUNC
/// PURPOSE:
/// B*1544838 - need to toggle audio scene on and off when yoou enter / leave the club
/// also needs to not be active whilst in a vehicle in the club (rare but possible)
/// PARAMS:
/// ePlayerInsideClubStatus - eLocal_PlayerInsideClubStatus
PROC UPDATE_AUDIO_SCENE(N1A_ROCK_CLUB_INTERIOR_ROOM_ENUM eLocal_PlayerInsideClubStatus)
// Outside the club
IF eLocal_PlayerInsideClubStatus = N1A_RCR_INVALID // player still in the club
OR eLocal_PlayerInsideClubStatus = N1A_MAX_NUM_ROCK_CLUB_ROOMS
IF IS_AUDIO_SCENE_ACTIVE("NIGEL_1A_SCENE")
STOP_AUDIO_SCENE("NIGEL_1A_SCENE")
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_AUDIO_SCENE - STOP_AUDIO_SCENE - NIGEL_1A_SCENE outside club") ENDIF #ENDIF
ENDIF
//inside the club
ELSE
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID(), FALSE)
IF NOT IS_AUDIO_SCENE_ACTIVE("NIGEL_1A_SCENE")
START_AUDIO_SCENE("NIGEL_1A_SCENE")
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_AUDIO_SCENE - START_AUDIO_SCENE - NIGEL_1A_SCENE - in club") ENDIF #ENDIF
ENDIF
ELSE
IF IS_AUDIO_SCENE_ACTIVE("NIGEL_1A_SCENE")
STOP_AUDIO_SCENE("NIGEL_1A_SCENE")
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_AUDIO_SCENE - STOP_AUDIO_SCENE - NIGEL_1A_SCENE in club in veh") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Checks if a specific conversation root is currently playing
/// PARAMS:
/// sConversationRoot - the conversation root to test
/// bReturnTrueIfStringIsNull - checks against the issue where GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_ROOT can return "NULL" the first few frames after CREATE_CONVERSATION has returned true
/// RETURNS:
/// TRUE - if there is an ongoing or queued conversation with a root matching the passed in string or "NULL" if bReturnTrueIfNULL
FUNC BOOL IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING(STRING sConversationRoot, BOOL bReturnTrueIfStringIsNull = 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 bReturnTrueIfStringIsNull
//if current root matches null, return true
//because if the correct root isn't returned the first frame or so after CREATE_CONVERSATION has return true.
IF ARE_STRINGS_EQUAL(tlTempRoot, "NULL")
RETURN TRUE
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Attempts to start dialogue using CREATE_CONVERSATION, but first checks that no message is being displayed or that the subtitles are off in the profile settings
/// 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 NIG1A_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)
IF ShouldDisplaySubtitles = DISPLAY_SUBTITLES
IF IS_MESSAGE_BEING_DISPLAYED()
IF GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) != 0
RETURN FALSE
ENDIF
ENDIF
ENDIF
IF IS_SCREEN_FADED_IN() // problems with convo's starting during fade out
IF CREATE_CONVERSATION(YourPedStruct, WhichBlockOfTextToLoad, WhichRootLabel, PassedConversationPriority, ShouldDisplaySubtitles, ShouldAddToBriefScreen, cloneConversation)
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Attempts to start dialogue using CREATE_CONVERSATION, but first checks that no message is being displayed or that the subtitles are off in the profile settings
/// 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 NIG1A_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)
IF ShouldDisplaySubtitles = DISPLAY_SUBTITLES
IF IS_MESSAGE_BEING_DISPLAYED()
IF GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) != 0
RETURN FALSE
ENDIF
ENDIF
ENDIF
IF IS_SCREEN_FADED_IN() // problems with convo's starting during fade out
IF CREATE_CONVERSATION_FROM_SPECIFIC_LINE(YourPedStruct, WhichBlockOfTextToLoad, WhichRootLabel, WhichSpecificLabel, PassedConversationPriority, ShouldDisplaySubtitles, ShouldAddToBriefScreen)
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Attempts to start dialogue using PLAY_SINGLE_LINE_FROM_CONVERSATION, but first checks that no message is being displayed or that the subtitles are off in the profile settings
/// 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 NIG1A_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)
IF ShouldDisplaySubtitles = DISPLAY_SUBTITLES
IF IS_MESSAGE_BEING_DISPLAYED()
IF GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) != 0
RETURN FALSE
ENDIF
ENDIF
ENDIF
IF IS_SCREEN_FADED_IN() // problems with convo's starting during fade out
IF PLAY_SINGLE_LINE_FROM_CONVERSATION(YourPedStruct, WhichBlockOfTextToLoad, WhichRootLabel, WhichSpecificLabel, PassedConversationPriority, ShouldDisplaySubtitles, ShouldAddToBriefScreen)
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// will return the enumSubtitlesState needed to allow a dialogue line to play
/// without subtitles if a message is being displayed
/// RETURNS:
/// enumSubtitlesState
FUNC enumSubtitlesState GET_SUBTITLES_STATE_FOR_NON_CLASH_WITH_MESSAGES()
IF IS_MESSAGE_BEING_DISPLAYED()
RETURN DO_NOT_DISPLAY_SUBTITLES
ENDIF
RETURN DISPLAY_SUBTITLES
ENDFUNC
/// PURPOSE:
/// Check the specified ped is in the current conversation
/// PARAMS:
/// pedIndex - ped to test
/// RETURNS:
/// True if ped is alive and IS_PED_IN_CURRENT_CONVERSATION
FUNC BOOL NIG1A_IS_PED_INVOLVED_IN_CURRENT_CONVERSATION(PED_INDEX pedIndex)
IF IS_ENTITY_ALIVE(pedIndex)
IF IS_PED_IN_CURRENT_CONVERSATION(pedIndex)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "NIG1A_IS_PED_INVOLVED_IN_CURRENT_CONVERSATION - return true, frame count : ", GET_FRAME_COUNT()) ENDIF #ENDIF
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// kill's any ongoing ambient dialogue between Willy and groupie and stores the conversation progress so it can be retriggered
/// PARAMS:
/// bFinishCurrentLine - if we shoud use KILL_FACE_TO_FACE_CONVERSATION() or KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
/// RETURNS:
/// true if the convo was killed and stored
FUNC BOOL KILL_AND_STORE_CURRENT_Willy_AND_GROUPIE_AMBIENT_DIALOGUE(BOOL bFinishCurrentLine = TRUE)
IF NOT bPausedDialogue_AmbientWillyGroupie
IF IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("NIG1A_WILL1", FALSE) //only the ambient between Willy and groupie
OR IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("NIG1A_WILL2", FALSE) //only the ambient between Willy and groupie
OR IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("NIG1A_WILL3", FALSE) //only the ambient between Willy and groupie
// 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 = GET_STANDARD_CONVERSATION_LABEL_FOR_FUTURE_RESUMPTION()
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "KILL_AND_STORE_CURRENT_Willy_AND_GROUPIE_AMBIENT_DIALOGUE - line : ", tl23CurrentDialogueLine) ENDIF #ENDIF
IF NOT IS_STRING_NULL_OR_EMPTY(tl23CurrentDialogueLine)
bPausedDialogue_AmbientWillyGroupie = TRUE
IF iCounter_AmbientDialogueWillyGroupie > 0
iCounter_AmbientDialogueWillyGroupie-- // ready to retrigger last dialogue
ENDIF
tlDialogueLinePaused_WillyGroupieAmbient = tl23CurrentDialogueLine
IF bFinishCurrentLine
KILL_FACE_TO_FACE_CONVERSATION()
ELSE
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDIF
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "KILL_AND_STORE_CURRENT_Willy_AND_GROUPIE_AMBIENT_DIALOGUE - return TRUE, finish current line : ",
bFinishCurrentLine, " line : ", tlDialogueLinePaused_WillyGroupieAmbient) ENDIF #ENDIF
RETURN TRUE
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Changes the mission's current stage
/// PARAMS:
/// msStage - Mission stage to switch to
PROC SET_STAGE(MISSION_STAGE msStage)
emissionStage = msStage
eSubStage = SS_SETUP
ENDPROC
//-------------------------------------------------------------------------------------------------------------------------------------------------
// :MISSION INIT STUFF
//-------------------------------------------------------------------------------------------------------------------------------------------------
/// PURPOSE:
/// General setup for the mission which effects the world
PROC SETUP_WORLD_STATE_FOR_MISSION()
// Enabled by the initial scene in normal flow to prevent player seeing a odd door flash as it regens
// only do it here for replays / z skips
IF IS_REPLAY_IN_PROGRESS()
OR NOT bFinishedStageSkipping
SET_INTERIOR_CAPPED(INTERIOR_V_ROCKCLUB, FALSE)
CPRINTLN(DEBUG_MISSION, "SETUP_WORLD_STATE_FOR_MISSION - SET_INTERIOR_CAPPED(INTERIOR_V_ROCKCLUB, FALSE)")
ENDIF
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 carpark - vehicles, peds, objects, blood decals
SET_PED_NON_CREATION_AREA(vClearZone_RockClub_Min, vClearZone_RockClub_Max)
scenarioBlockingAreaRockClub = ADD_SCENARIO_BLOCKING_AREA(vClearZone_RockClub_Min, vClearZone_RockClub_Max)
SET_SCENARIO_TYPE_ENABLED("WORLD_HUMAN_GUARD_STAND", FALSE) // Stop ambient security spawning
SET_SCENARIO_TYPE_ENABLED("WORLD_HUMAN_CLIPBOARD", FALSE)
SET_SCENARIO_TYPE_ENABLED("WORLD_VEHICLE_DRIVE_SOLO", FALSE) // Stop truck pulling out in the car park
SET_PED_MODEL_IS_SUPPRESSED(S_M_Y_DOORMAN_01, TRUE)
SET_PED_MODEL_IS_SUPPRESSED(S_M_M_BOUNCER_01, TRUE)
SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(vClearZone_RockClub_Min, vClearZone_RockClub_Max, FALSE)
SET_VEHICLE_MODEL_IS_SUPPRESSED(sMusicianVehicle.mnModel, 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 IS_REPEAT_PLAY_ACTIVE()
OR IS_REPLAY_BEING_SET_UP()
OR NOT bFinishedStageSkipping
REMOVE_VEHICLES_FROM_GENERATORS_IN_AREA(vClearZone_RockClub_Min, vClearZone_RockClub_Max)
CLEAR_AREA(vMusicClub_CentrePos, 15.0, TRUE)
CLEAR_AREA(<< -573.39404, 289.36960, 79.06918 >>, 15.0, TRUE) // extra clear area for bottom room in the club
CLEAR_AREA(<< -554.17, 307.68, 82.84 >>, 2.0, TRUE)
CPRINTLN(DEBUG_MISSION, "SETUP_WORLD_STATE_FOR_MISSION - simulated SETUP_AREA_FOR_MISSION for replay / skip")
ENDIF
// exterior doors to the club are handed by Kenneth's building controller
SET_DOOR_STATE(DOORNAME_TEQUILA_CLUB_DOOR_R, DOORSTATE_UNLOCKED) //DOORSTATE_FORCE_UNLOCKED_THIS_FRAME)
SET_DOOR_STATE(DOORNAME_TEQUILA_CLUB_DOOR_F, DOORSTATE_UNLOCKED) //DOORSTATE_FORCE_UNLOCKED_THIS_FRAME)
CPRINTLN(DEBUG_MISSION, "SETUP_WORLD_STATE_FOR_MISSION - set club exteior doors state - DOORSTATE_FORCE_UNLOCKED_THIS_FRAME")
///Some info from David to try out -
// Set Ratios first with no flush then call set state with DOORSTATE_FORCE_CLOSED_THIS_FRAME and flush state to true
// then immediately calling set state with DOORSTATE_FORCE_OPEN_THIS_FRAME
// also setting flush state to true this should first snap the door into position then immediately open it.
INT i
FOR i = 0 TO (ENUM_TO_INT(N1A_MAX_MISSION_CONTROLLED_DOORS) - 1)
bSetMissionControlledDoorsInitialStates[i] = TRUE
ENDFOR
SET_MISSION_CONTROLLED_DOOR_OPEN_RATIO(N1A_MCD_INT_DD_TO_MAIN_ROOM_01, 1.0, TRUE, FALSE)
SET_MISSION_CONTROLLED_DOOR_OPEN_RATIO(N1A_MCD_INT_DD_TO_MAIN_ROOM_02, 1.0, TRUE, FALSE)
SET_MISSION_CONTROLLED_DOOR_OPEN_RATIO(N1A_MCD_INT_ENTRANCE_STAFF_AREA_01, 0.0, FALSE, FALSE)
SET_MISSION_CONTROLLED_DOOR_OPEN_RATIO(N1A_MCD_INT_TO_REAR_ENTRANCE_01, 0.0, FALSE, FALSE)
SET_MISSION_CONTROLLED_DOOR_OPEN_RATIO(N1A_MCD_INT_TO_BASEMENT_01, 0.0, FALSE, FALSE)
SET_MISSION_CONTROLLED_DOOR_OPEN_RATIO(N1A_MCD_INT_BASEMENT_01, 0.0, FALSE, FALSE)
SET_MISSION_CONTROLLED_DOOR_STATE(N1A_MCD_INT_ENTRANCE_STAFF_AREA_01, DOORSTATE_FORCE_CLOSED_THIS_FRAME, TRUE)
SET_MISSION_CONTROLLED_DOOR_STATE(N1A_MCD_INT_TO_REAR_ENTRANCE_01, DOORSTATE_FORCE_CLOSED_THIS_FRAME, TRUE)
SET_MISSION_CONTROLLED_DOOR_STATE(N1A_MCD_INT_TO_BASEMENT_01, DOORSTATE_FORCE_CLOSED_THIS_FRAME, TRUE)
SET_MISSION_CONTROLLED_DOOR_STATE(N1A_MCD_INT_BASEMENT_01, DOORSTATE_FORCE_CLOSED_THIS_FRAME, TRUE)
WAIT(0)
SET_MISSION_CONTROLLED_DOOR_STATE(N1A_MCD_INT_DD_TO_MAIN_ROOM_01, DOORSTATE_FORCE_OPEN_THIS_FRAME, TRUE)
SET_MISSION_CONTROLLED_DOOR_STATE(N1A_MCD_INT_DD_TO_MAIN_ROOM_02, DOORSTATE_FORCE_OPEN_THIS_FRAME, TRUE)
SET_MISSION_CONTROLLED_DOOR_STATE(N1A_MCD_INT_ENTRANCE_STAFF_AREA_01, DOORSTATE_FORCE_OPEN_THIS_FRAME, TRUE)
SET_MISSION_CONTROLLED_DOOR_STATE(N1A_MCD_INT_TO_REAR_ENTRANCE_01, DOORSTATE_FORCE_OPEN_THIS_FRAME, TRUE)
SET_MISSION_CONTROLLED_DOOR_STATE(N1A_MCD_INT_TO_BASEMENT_01, DOORSTATE_FORCE_OPEN_THIS_FRAME, TRUE)
SET_MISSION_CONTROLLED_DOOR_STATE(N1A_MCD_INT_BASEMENT_01, DOORSTATE_FORCE_OPEN_THIS_FRAME, TRUE)
ENDPROC
/// PURPOSE:
/// requests and checks if the groupies' models are loaded
/// RETURNS:
/// TRUE if all of the groupies' models loaded
FUNC BOOL HAVE_CLUB_PED_MODELS_LOADED()
INT i
FOR i = 0 TO (MAX_NUM_CLUB_PEDS - 1)
REQUEST_MODEL(sClubPed[i].mnModel)
ENDFOR
FOR i = 0 TO (MAX_NUM_CLUB_PEDS - 1)
IF NOT HAS_MODEL_LOADED(sClubPed[i].mnModel)
RETURN FALSE
ENDIF
ENDFOR
RETURN TRUE
ENDFUNC
/// PURPOSE:
/// Requests and checks to see if the assets are loaded for the start of the mission
/// RETURNS:
/// TRUE if all the assets have loaded
FUNC BOOL HAVE_ASSETS_FOR_MISSION_INIT_LOADED()
REQUEST_MODEL(mpToothPickup.mnModel)
REQUEST_MODEL(sWillyPed.mnModel)
REQUEST_MODEL(sMusicianVehicle.mnModel)
REQUEST_ANIM_DICT("rcmnigel1a")
REQUEST_ANIM_DICT(tlAnimDict_ClubPedsUpstairs)
REQUEST_ANIM_DICT(tlAnimDict_WillyMocappedAnims)
REQUEST_ADDITIONAL_TEXT("NIGEL1A", MISSION_TEXT_SLOT)
IF HAS_MODEL_LOADED(sWillyPed.mnModel)
AND HAS_MODEL_LOADED(sMusicianVehicle.mnModel)
AND HAS_ANIM_DICT_LOADED("rcmnigel1a")
AND HAS_ANIM_DICT_LOADED(tlAnimDict_ClubPedsUpstairs)
AND HAS_ANIM_DICT_LOADED(tlAnimDict_WillyMocappedAnims)
AND HAVE_CLUB_PED_MODELS_LOADED()
AND IS_MUSIC_CLUB_INTERIOR_LOADED()
AND HAS_ADDITIONAL_TEXT_LOADED(MISSION_TEXT_SLOT)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "HAVE_ASSETS_FOR_MISSION_INIT_LOADED - return TRUE") ENDIF #ENDIF
RETURN TRUE
ENDIF
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "HAVE_ASSETS_FOR_MISSION_INIT_LOADED - return FALSE") ENDIF #ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Requests and checks to see if the assets are loaded for the collext tooth stage
/// RETURNS:
/// TRUE if all the assets have loaded
FUNC BOOL HAVE_ASSETS_LOADED_FOR_COLLECT_TOOTH_STAGE()
REQUEST_MODEL(mpToothPickup.mnModel)
REQUEST_SCRIPT_AUDIO_BANK("NIGEL_1A_TOOTH")
//REQUEST_ANIM_DICT("pickup_object") // B*1533138 - tooth pickup anim
IF HAS_MODEL_LOADED(mpToothPickup.mnModel)
AND REQUEST_SCRIPT_AUDIO_BANK("NIGEL_1A_TOOTH")
//AND HAS_ANIM_DICT_LOADED("pickup_object") // B*1533138 - tooth pickup anim
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "HAVE_ASSETS_LOADED_FOR_COLLECT_TOOTH_STAGE - return TRUE") ENDIF #ENDIF
RETURN TRUE
ENDIF
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "HAVE_ASSETS_LOADED_FOR_COLLECT_TOOTH_STAGE - return FALSE") ENDIF #ENDIF
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 (MAX_NUM_CLUB_PEDS - 1)
sClubPed[i].iTimer = 0
sClubPed[i].iAiDelayTimer = 0
sClubPed[i].iFrameCountLastSeenPlayer = 0
RESET_THREAT_SLOT_FOR_ENTITIES(PLAYER_PED_ID(), sClubPed[i].pedIndex)
ENDFOR
sWillyPed.iTimer = 0
sWillyPed.iAiDelayTimer = 0
sWillyPed.iFrameCountLastSeenPlayer = 0
RESET_THREAT_SLOT_FOR_ENTITIES(PLAYER_PED_ID(), sWillyPed.pedIndex)
ENDPROC
/// PURPOSE:
/// initialises all the mission variables
PROC SET_MISSION_VARIABLES()
INT i
bDoneObjective_LoseWantedLevel = FALSE
bDoneDialogue_BandSayWhereWillyIs = FALSE
bDoneDialogue_MusicianBeginFlee = FALSE
bDoneDialogue_MusicianKnockedDown = FALSE
bDoneDialogue_MusicianLosesTooth = FALSE
bDoneDialogue_MusicianSpottedPlayer = FALSE
bDoneDialogue_MusicianStartBrawl = FALSE
bDoneDialogue_MusicianSurrendered = FALSE
bDoneDialogue_MusicianShotAtByPlayer = FALSE
bDoneDialogue_PlayerReturnsTofightMusician = TRUE
bDoneDialogue_TrevorCommentSneakingInBackdoor = FALSE
bDoneDialogue_TrevorKilledWilly = FALSE
bDoneDialogue_TrevorLeaveTheAreaComment = FALSE
bDoneDialogue_MusicianShoutSecurity = FALSE
bDonedialogue_ClubPedsReactThreatened = FALSE
bDoneObjective_BeatUpMusician = FALSE
bDoneObjective_CollectTooth = FALSE
bDoneObjective_LeaveTheArea = FALSE
bDoneObjective_EnterClub = FALSE
bHasPlayerDamagedMusician = FALSE
bHasPlayerScarredClubPedsUpstairs = FALSE
bHasOutroPhonecallSucceeded = FALSE
bHasWillySeenPlayerAttackHisGroupie = FALSE
bPausedDialogue_MusicianSpottedPlayer = FALSE
bPausedDialogue_AmbientUpstairs = FALSE
bPausedDialogue_AmbientWillyGroupie = FALSE
bPlayerUsedWeaponToDamageWilly = FALSE
bHasPlayerReceivedScriptedWantedLevel = FALSE
bShouldPlayerGetWantedLevelForWeaponInClub = FALSE
bShouldPlayerGetWantedLevelAfterAttackingWilly = FALSE
FOR i = 0 TO (ENUM_TO_INT(N1A_MAX_MISSION_CONTROLLED_DOORS) - 1)
bSetMissionControlledDoorsInitialStates[i] = FALSE
ENDFOR
bSetExitSceneForWillyAndGroupie = FALSE
iClubPedID_ToUpdateThisFrameCounter = 0
iDialogueCounter_PlayerLeftMusicianInBrawl = 0
iDialogueCounter_PlayerOutOfReachMusicianInBrawl = 0
iDialogueCounter_PlayerReturnedMusicianInBrawl = 0
iTimer_BackupKnockOutToothTrigger = 0
iTimer_DelayForOutroPhonecall = 0
iTimer_PlayerReceivesScriptedWantedLevel = 0
iCounter_AmbientDialogueUpstairs = 0
iCounter_AmbientDialogueWillyGroupie = 0
FOR i = 0 TO (ENUM_TO_INT(N1A_MAX_CLUB_PED_ANIM_TYPE) - 1)
iSyncedSceneID_ClubPedUpstairsScenes[i] = -1
ENDFOR
FOR i = 0 TO (ENUM_TO_INT(N1A_MAX_Willy_GROUPIE_ANIM_TYPE) - 1)
iSyncedSceneID_WillyGroupieScenes[i] = -1
ENDFOR
IF IS_SYNCHRONIZED_SCENE_RUNNING(sRCLauncherDataLocal.iSyncSceneIndex)
iSyncedSceneID_WillyGroupieScenes[N1A_WGAT_BASE_2_ANIM] = sRCLauncherDataLocal.iSyncSceneIndex
CPRINTLN(DEBUG_MISSION, " Update sync scene handle from TAKE_OWNERSHIP_OF_SYNCHRONIZED_SCENE : sRCLauncherDataLocal.iSyncSceneIndex = ", sRCLauncherDataLocal.iSyncSceneIndex,
" iSyncedSceneID_WillyGroupieScenes[N1A_WGAT_BASE_2_ANIM] = ", iSyncedSceneID_WillyGroupieScenes[N1A_WGAT_BASE_2_ANIM])
ENDIF
FOR i = 0 TO (ENUM_TO_INT(N1A_MAX_MISSION_CONTROLLED_DOORS) - 1)
iMissionControlledDoors[i] = 0
ENDFOR
//setup the hash keys for the rock club interior's rooms
iRockClubRoom[N1A_RCR_MAIN_ROOM] = GET_HASH_KEY("V_64_Dance") // main room
iRockClubRoom[N1A_RCR_MAIN_ENTRANCE] = GET_HASH_KEY("V_64_Entry_Trans") // main entrance
iRockClubRoom[N1A_RCR_MAIN_ENTRANCE_TO_MAIN_ROOM] = GET_HASH_KEY("V_64_Entry") // main entrance leading to main room
iRockClubRoom[N1A_RCR_BACK_ROOM_CORRIDOR_TO_BASEMENT] = GET_HASH_KEY("V_64_Back") // upper corridor and stairs leading to basement?
iRockClubRoom[N1A_RCR_LANDING_OUTSIDE_BASEMENT] = GET_HASH_KEY("V_64_Back_Lower") // landing area outside basement room
iRockClubRoom[N1A_RCR_BASEMENT] = GET_HASH_KEY("V_64_Base2") // basement
iRockClubRoom[N1A_RCR_CLOAK_ROOM] = GET_HASH_KEY("V_64_Cloak") // cloak room front entrance
iRockClubRoom[N1A_RCR_CORRIDOR_TO_UPSTAIRS] = GET_HASH_KEY("V_64_Side") // corridor leading upstairs?
iRockClubRoom[N1A_RCR_LANDING_UPSTAIRS] = GET_HASH_KEY("V_64_Side_Upper") // landing area upstairs
iRockClubRoom[N1A_RCR_ROOM_UPSTAIRS] = GET_HASH_KEY("V_64_Upper") // upstairs room
iRockClubRoom[N1A_RCR_REAR_ENTRANCE_BOTTOM_STAIRS] = GET_HASH_KEY("V_64_Rear") // rear entrance (bottom of stairs)
iRockClubRoom[N1A_RCR_REAR_ENTRANCE_TOP_STAIRS] = GET_HASH_KEY("V_64_Rear_Trans") // rear entrance (up stairs)
iDialogueCounter_PlayerLeftMusicianInBrawl = 0
iDialogueCounter_PlayerReturnedMusicianInBrawl = 0
iDialogueCounter_PlayerOutOfReachMusicianInBrawl = 0
fHeading_PlayerMissionStart = 341.4680
eN1A_MissionFailedReason = FAILED_DEFAULT
tlPausedDialogue_MusicianSpottedPlayer = ""
//vCarPark_CentrePos = << -554.90, 303.18, 82.24 >>
vMusicClub_CentrePos = << -558.2858, 284.4073, 81.1764 >>
vClearZone_RockClub_Min = << -577.27405, 270.65054, 77.0 >>
vClearZone_RockClub_Max = << -543.17926, 315.29727, 94.0 >>
vSyncedScenePosition_ClubPedsUpstairs = << -559.9, 289.366, 84.376 >>
vSyncedSceneRotation_ClubPedsUpstairs = << 0.0, 0.0, -6.0 >>
vSyncedScenePosition_WillyGroupie = << -552.180, 285.476, 81.976 >> //remember update initial scene if changed! // original prop pos << -552.126, 285.476, 81.976 >>
vSyncedSceneRotation_WillyGroupie = << 0.0, 0.0, 79.5 >> //remember update initial scene if changed! // original prop rot << 0.0, 0.0, 80.5 >>
vPos_PlayerMissionStart = <<-573.0122, 244.7840, 81.9076>>
//the band
sWillyPed.mnModel = U_M_M_WILLYFIST // needs to swtich over to U_M_M_WillyFist once it makes it into model_names enum
sWillyPed.vPosition = << -552.66, 287.75, 82.18 >>
sWillyPed.fHeading = 123.75
// groupie in main room with Willy
sClubPed[GROUPIE_WILLYS_PIECE].mnModel = A_F_Y_BEVHILLS_03
sClubPed[GROUPIE_WILLYS_PIECE].vPosition = << -553.46, 287.34, 82.18 >>
sClubPed[GROUPIE_WILLYS_PIECE].fHeading = -65.86
// groupie upstairs stood against pillar
sClubPed[CLUB_PED_GROUPIE_UPSTAIRS_01].mnModel = A_F_Y_BEVHILLS_03
sClubPed[CLUB_PED_GROUPIE_UPSTAIRS_01].vPosition = << -559.94, 285.99, 85.38 >>
sClubPed[CLUB_PED_GROUPIE_UPSTAIRS_01].fHeading = -59.06
// groupie upstairs stood chatting to band member
sClubPed[CLUB_PED_GROUPIE_UPSTAIRS_02].mnModel = A_F_Y_BEVHILLS_03
sClubPed[CLUB_PED_GROUPIE_UPSTAIRS_02].vPosition = << -558.87, 289.79, 85.38 >>
sClubPed[CLUB_PED_GROUPIE_UPSTAIRS_02].fHeading = 162.44
sClubPed[CLUB_PED_BAND_MANAGER].mnModel = A_M_Y_VINEWOOD_04
sClubPed[CLUB_PED_BAND_MANAGER].vPosition = << -559.00, 286.09, 85.38 >>
sClubPed[CLUB_PED_BAND_MANAGER].fHeading = 65.92
sClubPed[CLUB_PED_ROADIE].mnModel = A_M_Y_GAY_01
sClubPed[CLUB_PED_ROADIE].vPosition = << -558.84, 288.97, 85.38 >>
sClubPed[CLUB_PED_ROADIE].fHeading = -7.72
RESET_MISSION_PED_TIMERS()
RESET_THREAT_SHAPETESTS()
// Willy's car
sMusicianVehicle.mnModel = GAUNTLET
sMusicianVehicle.vPosition = << -553.55, 308.61, 82.81 >>
sMusicianVehicle.fHeading = 202.78
mpToothPickup.mnModel = PROP_LD_GOLD_TOOTH
mpToothPickup.type = PICKUP_CUSTOM_SCRIPT
mpToothPickup.vPosition = << -554.23, 300.55, 82.19 >> //set an initial pos
//mpToothPickup.fHeading = 0.0
mpToothPickup.iPlacementFlags = 0
SET_BIT(mpToothPickup.iPlacementFlags, enum_to_int(PLACEMENT_FLAG_SNAP_TO_GROUND))
SET_BIT(mpToothPickup.iPlacementFlags, enum_to_int(PLACEMENT_FLAG_ORIENT_TO_GROUND))
SET_BIT(mpToothPickup.iPlacementFlags, enum_to_int(PLACEMENT_FLAG_FIXED))
eMusicianState = N1A_MUSICIAN_STATE_RELAXED
ePlayerInsideClubStatus = N1A_RCR_INVALID
ADD_RELATIONSHIP_GROUP("N1A_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)
ADD_RELATIONSHIP_GROUP("N1A_UNAGRESSIVE", relGroupUnagressive)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, relGroupUnagressive, relGroupPlayerEnemy)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, relGroupPlayerEnemy, relGroupUnagressive)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, relGroupUnagressive, RELGROUPHASH_COP) // make the cops work with the celebs instead of fight them
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, RELGROUPHASH_COP, relGroupUnagressive)
RockClubInteriorIndex = GET_INTERIOR_AT_COORDS(<< -555.5934, 285.7738, 81.1763 >>) // middle of main room
// register all the doors here to allow at least a frames wait until i try to control them (wait for assets to load acheives this)
REGISTER_NEW_MISSION_CONTROLLED_DOOR(N1A_MCD_INT_DD_TO_MAIN_ROOM_01, V_ILEV_ROC_DOOR1_L, << -561.35, 278.58, 83.13 >>)
REGISTER_NEW_MISSION_CONTROLLED_DOOR(N1A_MCD_INT_DD_TO_MAIN_ROOM_02, V_ILEV_ROC_DOOR1_R, << -559.55, 278.42, 83.13 >>)
REGISTER_NEW_MISSION_CONTROLLED_DOOR(N1A_MCD_INT_ENTRANCE_STAFF_AREA_01, V_ILEV_ROC_DOOR3, << -568.88, 281.11, 83.13 >>)
REGISTER_NEW_MISSION_CONTROLLED_DOOR(N1A_MCD_INT_TO_REAR_ENTRANCE_01, V_ILEV_SS_DOOR5_R, << -567.94, 291.93, 85.52 >>)
REGISTER_NEW_MISSION_CONTROLLED_DOOR(N1A_MCD_INT_TO_BASEMENT_01, V_ILEV_ROC_DOOR2, << -560.24, 293.01, 82.33 >>)
REGISTER_NEW_MISSION_CONTROLLED_DOOR(N1A_MCD_INT_BASEMENT_01, V_ILEV_ROC_DOOR2, << -569.80, 293.77, 79.33 >>)
ENDPROC
/// PURPOSE:
/// Creates Willy's vehicle. Always use this Function when creating it so it remains consistent.
/// PARAMS:
/// mVehicle - vehicle index to use
/// vPos - where to create it
/// fHeading - heading to use
/// bWaitForLoad - wait for the model to load?
/// RETURNS:
/// TRUE if vehicle created, FALSE otherwise
FUNC BOOL CREATE_MUSICIAN_VEHICLE(VEHICLE_INDEX &mVehicle, MODEL_NAMES mnModel, VECTOR vPos, FLOAT fHeading, BOOL bWaitForLoad = TRUE)
REQUEST_MODEL(mnModel)
IF bWaitForLoad = TRUE
WHILE NOT HAS_MODEL_LOADED(mnModel)
WAIT(0)
ENDWHILE
ELSE
IF NOT HAS_MODEL_LOADED(mnModel)
RETURN FALSE // model not loaded, can't create vehicle
ENDIF
ENDIF
CREATE_SCENE_VEHICLE(mVehicle, mnModel, vPos, fHeading)
IF IS_ENTITY_ALIVE(mVehicle)
SET_VEHICLE_COLOUR_COMBINATION(mVehicle, 1)
SET_VEHICLE_DOORS_LOCKED(mVehicle, VEHICLELOCK_UNLOCKED)
SET_CAN_AUTO_VAULT_ON_ENTITY(mVehicle, FALSE)
ENDIF
SET_MODEL_AS_NO_LONGER_NEEDED(mnModel)
RETURN TRUE
ENDFUNC
//PURPOSE: Creates and sets up all the entities needed at the start of the mission
PROC SETUP_SCENE_FOR_START_OF_MISSION()
INT i
// Musician's vehicle
// Assign musican's vehicle over from initial scene
IF DOES_ENTITY_EXIST(sRCLauncherDataLocal.vehID[0])
sMusicianVehicle.vehIndex = sRCLauncherDataLocal.vehID[0]
CPRINTLN(DEBUG_MISSION, "SETUP_SCENE_FOR_START_OF_MISSION - musician vehicle passed over from launcher")
ELSE
CREATE_MUSICIAN_VEHICLE(sMusicianVehicle.vehIndex, sMusicianVehicle.mnModel, sMusicianVehicle.vPosition, sMusicianVehicle.fHeading)
CPRINTLN(DEBUG_MISSION, "SETUP_SCENE_FOR_START_OF_MISSION - musician vehicle created in script, not from launcher")
ENDIF
SET_MODEL_AS_NO_LONGER_NEEDED(sMusicianVehicle.mnModel)
// Setup Willy
// Assign Willy over from initial scene
IF DOES_ENTITY_EXIST(sRCLauncherDataLocal.pedID[0])
sWillyPed.pedIndex = sRCLauncherDataLocal.pedID[0]
CPRINTLN(DEBUG_MISSION, "SETUP_SCENE_FOR_START_OF_MISSION - Willy ped passed over from launcher")
ELSE
IF NOT DOES_ENTITY_EXIST(sWillyPed.pedIndex)
sWillyPed.pedIndex = CREATE_PED(PEDTYPE_MISSION, sWillyPed.mnModel, sWillyPed.vPosition, sWillyPed.fHeading)
CPRINTLN(DEBUG_MISSION, "SETUP_SCENE_FOR_START_OF_MISSION - Willy ped created in script")
ENDIF
ENDIF
IF IS_PED_UNINJURED(sWillyPed.pedIndex)
SET_PED_CAN_BE_TARGETTED(sWillyPed.pedIndex, TRUE)
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(sWillyPed.pedIndex, TRUE)
SET_PED_DIES_WHEN_INJURED(sWillyPed.pedIndex, TRUE)
SET_PED_CAN_USE_AUTO_CONVERSATION_LOOKAT(sWillyPed.pedIndex, TRUE)
SET_PED_CONFIG_FLAG(sWillyPed.pedIndex, PCF_DontInfluenceWantedLevel, TRUE)
SET_PED_CONFIG_FLAG(sWillyPed.pedIndex, PCF_AllowMissionPedToUseInjuredMovement, TRUE) // make Willy use the injuted animations when TASK_SMART_FLEE_PED is applied
STOP_PED_SPEAKING(sWillyPed.pedIndex, TRUE)
SET_PED_LOD_MULTIPLIER(sWillyPed.pedIndex, 4.0) // B*1529730 - stop Willy big hair
//RETAIN_ENTITY_IN_INTERIOR(sWillyPed.pedIndex, RockClubInteriorIndex) // don't do this for now as it's making the peds invisible inside the interior!!!
IF IS_PED_IN_GROUP(sWillyPed.pedIndex)
REMOVE_PED_FROM_GROUP(sWillyPed.pedIndex)
ENDIF
SET_PED_RELATIONSHIP_GROUP_HASH(sWillyPed.pedIndex, relGroupPlayerEnemy)
SET_PED_TO_INFORM_RESPECTED_FRIENDS(sWillyPed.pedIndex, 10.0, 5)
SET_PED_DEFAULT_COMPONENT_VARIATION(sWillyPed.pedIndex)
SET_ENTITY_HEALTH(sWillyPed.pedIndex, 250) //set higher to stop issue of Musician dying from ragdoll on beaten up
SET_PED_COMBAT_MOVEMENT(sWillyPed.pedIndex, CM_DEFENSIVE)
SET_ENTITY_LOAD_COLLISION_FLAG(sWillyPed.pedIndex, TRUE)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sWillyPed.pedIndex, TRUE)
REQUEST_ANIM_DICT(tlAnimDict_WillyMocappedAnims)
IF HAS_ANIM_DICT_LOADED(tlAnimDict_WillyMocappedAnims)
SET_PED_ALTERNATE_MOVEMENT_ANIM(sWillyPed.pedIndex, AAT_IDLE, tlAnimDict_WillyMocappedAnims, "base")
SET_PED_ALTERNATE_MOVEMENT_ANIM(sWillyPed.pedIndex, AAT_WALK, tlAnimDict_WillyMocappedAnims, "walk")
SET_PED_ALTERNATE_MOVEMENT_ANIM(sWillyPed.pedIndex, AAT_RUN, tlAnimDict_WillyMocappedAnims, "run")
ENDIF
sWillyPed.AI = N1A_PED_AI_STATE_UNDER_SYNCED_SCENE_CONTROL
sWillyPed.iTimer = 0
sWillyPed.iAiDelayTimer = 0
sWillyPed.iFrameCountLastSeenPlayer = 0
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sWillyPed.pedIndex, TRUE)
#IF IS_DEBUG_BUILD
TEXT_LABEL tDebugName = "Willy:"
SET_PED_NAME_DEBUG(sWillyPed.pedIndex, tDebugName)
#ENDIF
ENDIF
SET_MODEL_AS_NO_LONGER_NEEDED(sWillyPed.mnModel)
// Assign Willy Groupie over from initial scene
IF DOES_ENTITY_EXIST(sRCLauncherDataLocal.pedID[1])
sClubPed[GROUPIE_WILLYS_PIECE].pedIndex = sRCLauncherDataLocal.pedID[1]
CPRINTLN(DEBUG_MISSION, "SETUP_SCENE_FOR_START_OF_MISSION - Willy's groupie ped passed over from launcher")
ENDIF
// Assign Groupie's upstairs over from initial scene
IF DOES_ENTITY_EXIST(sRCLauncherDataLocal.pedID[2])
sClubPed[CLUB_PED_GROUPIE_UPSTAIRS_01].pedIndex = sRCLauncherDataLocal.pedID[2]
CPRINTLN(DEBUG_MISSION, "SETUP_SCENE_FOR_START_OF_MISSION - CLUB_PED_GROUPIE_UPSTAIRS_01 ped passed over from launcher")
ENDIF
// Assign Groupie's upstairs over from initial scene
IF DOES_ENTITY_EXIST(sRCLauncherDataLocal.pedID[3])
sClubPed[CLUB_PED_GROUPIE_UPSTAIRS_02].pedIndex = sRCLauncherDataLocal.pedID[3]
CPRINTLN(DEBUG_MISSION, "SETUP_SCENE_FOR_START_OF_MISSION - CLUB_PED_GROUPIE_UPSTAIRS_02 ped passed over from launcher")
ENDIF
// Assign Band Manage upstairs over from initial scene
IF DOES_ENTITY_EXIST(sRCLauncherDataLocal.pedID[4])
sClubPed[CLUB_PED_BAND_MANAGER].pedIndex = sRCLauncherDataLocal.pedID[4]
CPRINTLN(DEBUG_MISSION, "SETUP_SCENE_FOR_START_OF_MISSION - CLUB_PED_BAND_MANAGER ped passed over from launcher")
ENDIF
// Assign Roadie upstairs over from initial scene
IF DOES_ENTITY_EXIST(sRCLauncherDataLocal.pedID[5])
sClubPed[CLUB_PED_ROADIE].pedIndex = sRCLauncherDataLocal.pedID[5]
CPRINTLN(DEBUG_MISSION, "SETUP_SCENE_FOR_START_OF_MISSION - CLUB_PED_ROADIE ped passed over from launcher")
ENDIF
// Create the club peds - groupies, rest of band if they don't already exist
FOR i = 0 TO (MAX_NUM_CLUB_PEDS - 1)
IF NOT DOES_ENTITY_EXIST(sClubPed[i].pedIndex)
sClubPed[i].pedIndex = CREATE_PED(PEDTYPE_MISSION, sClubPed[i].mnModel, sClubPed[i].vPosition, sClubPed[i].fHeading)
CPRINTLN(DEBUG_MISSION, "SETUP_SCENE_FOR_START_OF_MISSION - sClubPed[", i, "].pedIndex created in script")
ENDIF
ENDFOR
// create the synced scene the club peds will use
iSyncedSceneID_ClubPedUpstairsScenes[N1A_CPAT_BASE_ANIM] = CREATE_SYNCHRONIZED_SCENE(vSyncedScenePosition_ClubPedsUpstairs, vSyncedSceneRotation_ClubPedsUpstairs)
SET_SYNCHRONIZED_SCENE_LOOPED(iSyncedSceneID_ClubPedUpstairsScenes[N1A_CPAT_BASE_ANIM], TRUE)
SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(iSyncedSceneID_ClubPedUpstairsScenes[N1A_CPAT_BASE_ANIM], FALSE)
STRING sSyncedSceneAnimName = ""
TEXT_LABEL_23 tlSyncedSceneAnimName = ""
FOR i = 0 TO (MAX_NUM_CLUB_PEDS - 1)
IF IS_PED_UNINJURED(sClubPed[i].pedIndex)
SET_PED_DIES_WHEN_INJURED(sClubPed[i].pedIndex, TRUE)
SET_PED_CONFIG_FLAG(sClubPed[i].pedIndex, PCF_DontInfluenceWantedLevel, TRUE)
SET_PED_CAN_USE_AUTO_CONVERSATION_LOOKAT(sClubPed[i].pedIndex, TRUE)
//RETAIN_ENTITY_IN_INTERIOR(sClubPed[i].pedIndex, RockClubInteriorIndex) // don't do this for now as it's making the peds invisible inside the interior!!!
IF IS_PED_IN_GROUP(sClubPed[i].pedIndex)
REMOVE_PED_FROM_GROUP(sClubPed[i].pedIndex)
ENDIF
SET_PED_RELATIONSHIP_GROUP_HASH(sClubPed[i].pedIndex, relGroupUnagressive)
SET_PED_TO_INFORM_RESPECTED_FRIENDS(sClubPed[i].pedIndex, 10.0, 5)
SET_PED_FLEE_ATTRIBUTES(sClubPed[i].pedIndex, FA_RETURN_TO_ORIGNAL_POSITION_AFTER_FLEE, FALSE)
SET_PED_FLEE_ATTRIBUTES(sClubPed[i].pedIndex, FA_DISABLE_HANDS_UP, FALSE)
SET_PED_FLEE_ATTRIBUTES(sClubPed[i].pedIndex, FA_USE_VEHICLE, FALSE)
//SET_PED_FLEE_ATTRIBUTES(sClubPed[i].pedIndex, FA_PREFER_PAVEMENTS, TRUE)
SET_PED_FLEE_ATTRIBUTES(sClubPed[i].pedIndex, FA_USE_COVER, FALSE)
SET_PED_FLEE_ATTRIBUTES(sClubPed[i].pedIndex, FA_LOOK_FOR_CROWDS, FALSE)
SET_PED_FLEE_ATTRIBUTES(sClubPed[i].pedIndex, FA_CAN_SCREAM, TRUE)
SET_PED_COMBAT_ATTRIBUTES(sClubPed[i].pedIndex, CA_ALWAYS_FIGHT, FALSE)
SET_PED_COMBAT_ATTRIBUTES(sClubPed[i].pedIndex, CA_ALWAYS_FLEE, TRUE)
SET_PED_COMBAT_MOVEMENT(sClubPed[i].pedIndex, CM_DEFENSIVE)
SWITCH i
CASE CLUB_PED_BAND_MANAGER
SET_PED_CAN_BE_TARGETTED(sClubPed[i].pedIndex, TRUE)
SET_PED_COMPONENT_VARIATION(sClubPed[i].pedIndex, INT_TO_ENUM(PED_COMPONENT,0), 0, 0, 0) //(head)
SET_PED_COMPONENT_VARIATION(sClubPed[i].pedIndex, INT_TO_ENUM(PED_COMPONENT,2), 0, 2, 0) //(hair)
SET_PED_COMPONENT_VARIATION(sClubPed[i].pedIndex, INT_TO_ENUM(PED_COMPONENT,3), 0, 0, 0) //(uppr)
SET_PED_COMPONENT_VARIATION(sClubPed[i].pedIndex, INT_TO_ENUM(PED_COMPONENT,4), 0, 1, 0) //(lowr)
SET_PED_COMPONENT_VARIATION(sClubPed[i].pedIndex, INT_TO_ENUM(PED_COMPONENT,8), 0, 0, 0) //(accs)
tlSyncedSceneAnimName = GET_CLUB_PED_ANIM_NAME(i, N1A_CPAT_BASE_ANIM)
sSyncedSceneAnimName = N1A_CONVERT_TEXT_LABEL_TO_STRING_FORMAT(tlSyncedSceneAnimName)
CPRINTLN(DEBUG_MISSION, "SETUP_SCENE_FOR_START_OF_MISSION - task sync scene : ", sSyncedSceneAnimName, " for ped ID : ", i)
TASK_SYNCHRONIZED_SCENE(sClubPed[i].pedIndex, iSyncedSceneID_ClubPedUpstairsScenes[N1A_CPAT_BASE_ANIM], tlAnimDict_ClubPedsUpstairs, sSyncedSceneAnimName, INSTANT_BLEND_IN, NORMAL_BLEND_OUT,
SYNCED_SCENE_ABORT_ON_WEAPON_DAMAGE | SYNCED_SCENE_USE_PHYSICS)
sClubPed[i].AI = N1A_PED_AI_STATE_UNDER_SYNCED_SCENE_CONTROL
BREAK
CASE CLUB_PED_ROADIE
SET_PED_CAN_BE_TARGETTED(sClubPed[i].pedIndex, TRUE)
SET_PED_COMPONENT_VARIATION(sClubPed[i].pedIndex, INT_TO_ENUM(PED_COMPONENT,0), 1, 0, 0) //(head)
SET_PED_COMPONENT_VARIATION(sClubPed[i].pedIndex, INT_TO_ENUM(PED_COMPONENT,2), 2, 0, 0) //(hair)
SET_PED_COMPONENT_VARIATION(sClubPed[i].pedIndex, INT_TO_ENUM(PED_COMPONENT,3), 0, 3, 0) //(uppr)
SET_PED_COMPONENT_VARIATION(sClubPed[i].pedIndex, INT_TO_ENUM(PED_COMPONENT,4), 1, 0, 0) //(lowr)
SET_PED_COMPONENT_VARIATION(sClubPed[i].pedIndex, INT_TO_ENUM(PED_COMPONENT,8), 0, 2, 0) //(accs)
tlSyncedSceneAnimName = GET_CLUB_PED_ANIM_NAME(i, N1A_CPAT_BASE_ANIM)
sSyncedSceneAnimName = N1A_CONVERT_TEXT_LABEL_TO_STRING_FORMAT(tlSyncedSceneAnimName)
CPRINTLN(DEBUG_MISSION, "SETUP_SCENE_FOR_START_OF_MISSION - task sync scene : ", sSyncedSceneAnimName, " for ped ID : ", i)
TASK_SYNCHRONIZED_SCENE(sClubPed[i].pedIndex, iSyncedSceneID_ClubPedUpstairsScenes[N1A_CPAT_BASE_ANIM], tlAnimDict_ClubPedsUpstairs, sSyncedSceneAnimName, INSTANT_BLEND_IN, NORMAL_BLEND_OUT,
SYNCED_SCENE_ABORT_ON_WEAPON_DAMAGE | SYNCED_SCENE_USE_PHYSICS, RBF_PLAYER_IMPACT)
sClubPed[i].AI = N1A_PED_AI_STATE_UNDER_SYNCED_SCENE_CONTROL
BREAK
CASE GROUPIE_WILLYS_PIECE
SET_PED_CAN_BE_TARGETTED(sClubPed[i].pedIndex, FALSE)
SET_PED_COMPONENT_VARIATION(sClubPed[i].pedIndex, INT_TO_ENUM(PED_COMPONENT,0), 1, 0, 0) //(head)
SET_PED_COMPONENT_VARIATION(sClubPed[i].pedIndex, INT_TO_ENUM(PED_COMPONENT,2), 0, 2, 0) //(hair)
SET_PED_COMPONENT_VARIATION(sClubPed[i].pedIndex, INT_TO_ENUM(PED_COMPONENT,3), 1, 2, 0) //(uppr)
SET_PED_COMPONENT_VARIATION(sClubPed[i].pedIndex, INT_TO_ENUM(PED_COMPONENT,4), 0, 1, 0) //(lowr)
SET_PED_COMPONENT_VARIATION(sClubPed[i].pedIndex, INT_TO_ENUM(PED_COMPONENT,7), 0, 1, 0) //(teef)
SET_PED_COMPONENT_VARIATION(sClubPed[i].pedIndex, INT_TO_ENUM(PED_COMPONENT,8), 1, 0, 0) //(accs)
sClubPed[i].AI = N1A_PED_AI_STATE_UNDER_SYNCED_SCENE_CONTROL
// set the base by default if it's not runnings
SET_WILLY_GROUPIE_SYNCED_ANIM(N1A_WGAT_BASE_2_ANIM)
BREAK
CASE CLUB_PED_GROUPIE_UPSTAIRS_01
SET_PED_CAN_BE_TARGETTED(sClubPed[i].pedIndex, FALSE)
SET_PED_COMPONENT_VARIATION(sClubPed[i].pedIndex, INT_TO_ENUM(PED_COMPONENT,0), 0, 1, 0) //(head)
SET_PED_COMPONENT_VARIATION(sClubPed[i].pedIndex, INT_TO_ENUM(PED_COMPONENT,2), 1, 2, 0) //(hair)
SET_PED_COMPONENT_VARIATION(sClubPed[i].pedIndex, INT_TO_ENUM(PED_COMPONENT,3), 1, 1, 0) //(uppr)
SET_PED_COMPONENT_VARIATION(sClubPed[i].pedIndex, INT_TO_ENUM(PED_COMPONENT,4), 1, 0, 0) //(lowr)
SET_PED_COMPONENT_VARIATION(sClubPed[i].pedIndex, INT_TO_ENUM(PED_COMPONENT,7), 1, 0, 0) //(teef)
SET_PED_COMPONENT_VARIATION(sClubPed[i].pedIndex, INT_TO_ENUM(PED_COMPONENT,8), 1, 0, 0) //(accs)
tlSyncedSceneAnimName = GET_CLUB_PED_ANIM_NAME(i, N1A_CPAT_BASE_ANIM)
sSyncedSceneAnimName = N1A_CONVERT_TEXT_LABEL_TO_STRING_FORMAT(tlSyncedSceneAnimName)
CPRINTLN(DEBUG_MISSION, "SETUP_SCENE_FOR_START_OF_MISSION - task sync scene : ", sSyncedSceneAnimName, " for ped ID : ", i)
TASK_SYNCHRONIZED_SCENE(sClubPed[i].pedIndex, iSyncedSceneID_ClubPedUpstairsScenes[N1A_CPAT_BASE_ANIM], tlAnimDict_ClubPedsUpstairs, sSyncedSceneAnimName, INSTANT_BLEND_IN, NORMAL_BLEND_OUT,
SYNCED_SCENE_ABORT_ON_WEAPON_DAMAGE | SYNCED_SCENE_USE_PHYSICS, RBF_PLAYER_IMPACT)
sClubPed[i].AI = N1A_PED_AI_STATE_UNDER_SYNCED_SCENE_CONTROL
BREAK
CASE CLUB_PED_GROUPIE_UPSTAIRS_02
SET_PED_CAN_BE_TARGETTED(sClubPed[i].pedIndex, FALSE)
SET_PED_COMPONENT_VARIATION(sClubPed[i].pedIndex, INT_TO_ENUM(PED_COMPONENT,0), 1, 1, 0) //(head)
SET_PED_COMPONENT_VARIATION(sClubPed[i].pedIndex, INT_TO_ENUM(PED_COMPONENT,2), 1, 0, 0) //(hair)
SET_PED_COMPONENT_VARIATION(sClubPed[i].pedIndex, INT_TO_ENUM(PED_COMPONENT,3), 1, 0, 0) //(uppr)
SET_PED_COMPONENT_VARIATION(sClubPed[i].pedIndex, INT_TO_ENUM(PED_COMPONENT,4), 1, 1, 0) //(lowr)
SET_PED_COMPONENT_VARIATION(sClubPed[i].pedIndex, INT_TO_ENUM(PED_COMPONENT,7), 1, 0, 0) //(teef)
SET_PED_COMPONENT_VARIATION(sClubPed[i].pedIndex, INT_TO_ENUM(PED_COMPONENT,8), 1, 0, 0) //(accs)
tlSyncedSceneAnimName = GET_CLUB_PED_ANIM_NAME(i, N1A_CPAT_BASE_ANIM)
sSyncedSceneAnimName = N1A_CONVERT_TEXT_LABEL_TO_STRING_FORMAT(tlSyncedSceneAnimName)
CPRINTLN(DEBUG_MISSION, "SETUP_SCENE_FOR_START_OF_MISSION - task sync scene : ", sSyncedSceneAnimName, " for ped ID : ", i)
TASK_SYNCHRONIZED_SCENE(sClubPed[i].pedIndex, iSyncedSceneID_ClubPedUpstairsScenes[N1A_CPAT_BASE_ANIM], tlAnimDict_ClubPedsUpstairs, sSyncedSceneAnimName, INSTANT_BLEND_IN, NORMAL_BLEND_OUT,
SYNCED_SCENE_ABORT_ON_WEAPON_DAMAGE | SYNCED_SCENE_USE_PHYSICS, RBF_PLAYER_IMPACT)
sClubPed[i].AI = N1A_PED_AI_STATE_UNDER_SYNCED_SCENE_CONTROL
BREAK
ENDSWITCH
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sClubPed[i].pedIndex, TRUE)
sClubPed[i].iTimer = 0
sClubPed[i].iAiDelayTimer = 0
sClubPed[i].iFrameCountLastSeenPlayer = 0
#IF IS_DEBUG_BUILD
TEXT_LABEL tDebugName = "ClubPed: "
tDebugName += i
SET_PED_NAME_DEBUG(sClubPed[i].pedIndex, tDebugName)
#ENDIF
ENDIF
SET_MODEL_AS_NO_LONGER_NEEDED(sClubPed[i].mnModel)
ENDFOR
ENDPROC
//PURPOSE: Initialization of the mission
PROC INIT_MISSION()
SET_MISSION_VARIABLES()
//INFORM_MISSION_STATS_OF_MISSION_START_NIGEL_1_A()
#IF IS_DEBUG_BUILD
// This needs setting up first to ensure debug print can be displayed when loading assets
SETUP_MISSION_WIDGET()
// Stage skipping
mSkipMenu[Z_SKIP_ENTER_THE_MUSIC_CLUB].sTxtLabel = "Enter the club"
mSkipMenu[Z_SKIP_FIND_CELEB].sTxtLabel = "Find Willy"
mSkipMenu[Z_SKIP_KNOCK_OUT_TOOTH].sTxtLabel = "Beat up Willy"
mSkipMenu[Z_SKIP_COLLECT_TOOTH].sTxtLabel = "Collect Willy's tooth"
mSkipMenu[Z_SKIP_LEAVE_THE_AREA].sTxtLabel = "Leave the area"
mSkipMenu[Z_SKIP_OUTRO_PHONECALL].sTxtLabel = "Outro Phonecall"
mSkipMenu[Z_SKIP_MISSION_PASSED].sTxtLabel = "Mission Passed"
#ENDIF
RC_CLEANUP_LAUNCHER() // clean's up the launcher's version of SETUP_AREA_FOR_MISSION - blocking areas
SETUP_WORLD_STATE_FOR_MISSION() // needs to be no wait between mission trigger and resetup of scenario blocking area and ped non creation zone
WHILE NOT HAVE_ASSETS_FOR_MISSION_INIT_LOADED()
WAIT(0)
ENDWHILE
REGISTER_SCRIPT_WITH_AUDIO()
ADD_CONTACT_TO_PHONEBOOK(CHAR_NIGEL, TREVOR_BOOK, FALSE)
IF IS_PED_UNINJURED(PLAYER_PED_ID())
ADD_PED_FOR_DIALOGUE(sDialogue, 2, PLAYER_PED_ID(), "TREVOR")
SET_PED_CAN_USE_AUTO_CONVERSATION_LOOKAT(PLAYER_PED_ID(), TRUE)
ENDIF
CLEAR_BIT(g_savedGlobals.sRandomChars.g_iWebsiteQueryBit, ENUM_TO_INT(RC_NWS_NGLA_KILLED_WILLIE)) // ensure this bit is initially clear when starting the mission
SETUP_SCENE_FOR_START_OF_MISSION()
ENDPROC
/// PURPOSE:
/// Removes all the assets loaded by the mission, used in mission cleanup and reset mission functions.
/// PARAMS:
/// bClearTextSlots - if TRUE, the MISSION_TEXT_SLOT will be cleared
PROC UNLOAD_ALL_MISSION_ASSETS(BOOL bClearTextSlots = TRUE)
INT i
REMOVE_ANIM_DICT("rcmnigel1a")
REMOVE_ANIM_DICT(tlAnimDict_ClubPedsUpstairs)
REMOVE_ANIM_DICT(tlAnimDict_WillyMocappedAnims)
REMOVE_ANIM_DICT(tlAnimDict_WillyMocappedHurtAnims)
//REMOVE_ANIM_DICT("pickup_object") // B*1533138 - tooth pickup anim
RELEASE_SCRIPT_AUDIO_BANK()
UNREGISTER_SCRIPT_WITH_AUDIO()
SET_MODEL_AS_NO_LONGER_NEEDED(sMusicianVehicle.mnModel)
SET_MODEL_AS_NO_LONGER_NEEDED(mpToothPickup.mnModel)
SET_MODEL_AS_NO_LONGER_NEEDED(sWillyPed.mnModel)
FOR i = 0 TO (MAX_NUM_CLUB_PEDS - 1)
SET_MODEL_AS_NO_LONGER_NEEDED(sClubPed[i].mnModel)
ENDFOR
IF IS_INTERIOR_READY(RockClubInteriorIndex)
SET_INTERIOR_ACTIVE(RockClubInteriorIndex, FALSE)
UNPIN_INTERIOR(RockClubInteriorIndex)
ENDIF
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()
SAFE_REMOVE_BLIP(blipMusicClub)
SAFE_REMOVE_BLIP(sWillyPed.blipIndex)
SAFE_REMOVE_BLIP(mpToothPickup.blipIndex)
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
SAFE_REMOVE_PICKUP(mpToothPickup.index)
IF IS_PED_UNINJURED(sWillyPed.pedIndex)
SET_PED_KEEP_TASK(sWillyPed.pedIndex, TRUE)
SET_ENTITY_LOAD_COLLISION_FLAG(sWillyPed.pedIndex, FALSE)
STOP_PED_SPEAKING(sWillyPed.pedIndex, FALSE)
ENDIF
SAFE_REMOVE_PED(sWillyPed.pedIndex, bDelete)
FOR i = 0 TO (MAX_NUM_CLUB_PEDS - 1)
IF IS_PED_UNINJURED(sClubPed[i].pedIndex)
SET_PED_KEEP_TASK(sClubPed[i].pedIndex, TRUE)
ENDIF
SAFE_REMOVE_PED(sClubPed[i].pedIndex, bDelete)
ENDFOR
IF IS_VEHICLE_OK(sMusicianVehicle.vehIndex)
SET_CAN_AUTO_VAULT_ON_ENTITY(sMusicianVehicle.vehIndex, TRUE)
SET_CAN_CLIMB_ON_ENTITY(sMusicianVehicle.vehIndex, TRUE)
ENDIF
SAFE_REMOVE_VEHICLE(sMusicianVehicle.vehIndex, 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
KILL_ANY_CONVERSATION()
SET_WANTED_LEVEL_MULTIPLIER(1.0)
DISABLE_CELLPHONE(FALSE)
DISPLAY_HUD(TRUE)
DISPLAY_RADAR(TRUE)
SET_WIDESCREEN_BORDERS(FALSE, 0)
//RENDER_SCRIPT_CAMS(FALSE, FALSE) causes camera to snap on mission passed
SET_TIME_SCALE(1)
HIDE_ACTIVE_PHONE(FALSE)
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(scenarioBlockingAreaRockClub)
SET_SCENARIO_TYPE_ENABLED("WORLD_HUMAN_GUARD_STAND", TRUE) // Stop ambient security spawning
SET_SCENARIO_TYPE_ENABLED("WORLD_HUMAN_CLIPBOARD", TRUE)
SET_SCENARIO_TYPE_ENABLED("WORLD_VEHICLE_DRIVE_SOLO", TRUE) // Stop truck pulling out in the car park
SET_PED_MODEL_IS_SUPPRESSED(S_M_Y_DOORMAN_01, FALSE)
SET_PED_MODEL_IS_SUPPRESSED(S_M_M_BOUNCER_01, FALSE)
SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(vClearZone_RockClub_Min, vClearZone_RockClub_Max, TRUE)
SET_VEHICLE_MODEL_IS_SUPPRESSED(sMusicianVehicle.mnModel, FALSE)
REMOVE_PED_FOR_DIALOGUE(sDialogue, 2) // "TREVOR"
REMOVE_PED_FOR_DIALOGUE(sDialogue, 3) // "NIGEL" / "GROUPIE1"
REMOVE_PED_FOR_DIALOGUE(sDialogue, 4) // "MRSTHORNHILL" / "GROUPIE2"
REMOVE_PED_FOR_DIALOGUE(sDialogue, 5) // "BANDLEADER"
KILL_CHASE_HINT_CAM(localChaseHintCamStruct)
WAIT_FOR_CUTSCENE_TO_STOP()
// Reset the exterior doors to locked to the club are handed by Kenneth's building controller
//SET_DOOR_STATE(DOORNAME_TEQUILA_CLUB_DOOR_R, DOORSTATE_FORCE_CLOSED_THIS_FRAME)
//SET_DOOR_STATE(DOORNAME_TEQUILA_CLUB_DOOR_F, DOORSTATE_FORCE_CLOSED_THIS_FRAME)
// clear anything blocking the exterior doors
RESOLVE_VEHICLES_INSIDE_ANGLED_AREA(<<-564.67102, 275.48468, 82.01414>>, <<-564.32562, 278.74033, 84.25044>>, 2.1, <<-564.61438, 274.18298, 82.01967>>, 86)
RESOLVE_VEHICLES_INSIDE_ANGLED_AREA(<<-561.86169, 294.47070, 86.49855>>, <<-562.15326, 291.70157, 88.57632>>, 1.5, <<-554.92700, 294.07227, 84.36716>>, -95)
SET_DOOR_STATE(DOORNAME_TEQUILA_CLUB_DOOR_R, DOORSTATE_LOCKED) // DOORSTATE_LOCKED
SET_DOOR_STATE(DOORNAME_TEQUILA_CLUB_DOOR_F, DOORSTATE_LOCKED) // DOORSTATE_LOCKED
CPRINTLN(DEBUG_MISSION, "MISSION_CLEANUP - set club exteior doors state - DOORSTATE_FORCE_LOCKED_THIS_FRAME")
//Enable the interior needs to be disabled in mission_cleanup
SET_INTERIOR_CAPPED_ON_EXIT(INTERIOR_V_ROCKCLUB, TRUE)
CPRINTLN(DEBUG_MISSION, "SETUP_WORLD_STATE_FOR_MISSION - SET_INTERIOR_CAPPED(INTERIOR_V_ROCKCLUB, TRUE)")
// remove mission controlled doors from system
FOR i = 0 TO (ENUM_TO_INT(N1A_MAX_MISSION_CONTROLLED_DOORS) - 1)
IF IS_DOOR_REGISTERED_WITH_SYSTEM(iMissionControlledDoors[i])
REMOVE_DOOR_FROM_SYSTEM(iMissionControlledDoors[i])
CPRINTLN(DEBUG_MISSION, " MISSION_CLEANUP - ", " REMOVE_DOOR_FROM_SYSTEM : ", iMissionControlledDoors[i])
ENDIF
ENDFOR
IF IS_PLAYER_PLAYING(PLAYER_ID())
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
ENDIF
REMOVE_RELATIONSHIP_GROUP(relGroupPlayerEnemy)
REMOVE_RELATIONSHIP_GROUP(relGroupUnagressive)
IF IS_AUDIO_SCENE_ACTIVE("NIGEL_1A_SCENE")
STOP_AUDIO_SCENE("NIGEL_1A_SCENE")
ENDIF
SET_AUDIO_FLAG("DisableAbortConversationForRagdoll", FALSE) // B*1516072 - allow convo during ragdoll
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:
/// 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_NIG1A)
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()
// allow player to kill Willy once his tooth has been knocked out.
IF eMissionStage < MISSION_STAGE_COLLECT_TOOTH
IF DOES_ENTITY_EXIST(sWillyPed.pedIndex)
IF IS_ENTITY_DEAD(sWillyPed.pedIndex)
OR IS_PED_INJURED(sWillyPed.pedIndex)
eN1A_MissionFailedReason = FAILED_MUSICIAN_KILLED
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_FAIL_REASON - MUSICIAN KILLED") ENDIF #ENDIF
EXIT
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// cycles through the conditions to see if the player has failed
PROC MISSION_FAILED_CHECKS()
// don't allow mission failed checks during stage skips
IF bFinishedStageSkipping
IF eMissionStage != MISSION_STAGE_MISSION_FAILED_WAIT_FOR_FADE // don't do the checks if we are already in the waiting for fade during fail stage
AND eMissionStage != MISSION_STAGE_MISSION_PASSED
UPDATE_FAIL_REASON()
IF eN1A_MissionFailedReason <> FAILED_DEFAULT
SET_STAGE(MISSION_STAGE_MISSION_FAILED_WAIT_FOR_FADE)
ENDIF
ENDIF
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:
/// N1A_PED_MOVEMENT_STATE for the ped
FUNC N1A_PED_MOVEMENT_STATE GET_UPDATED_PED_MOVEMENT_STATE(PED_INDEX pedIndex, BOOL bDoDeadCheck = TRUE)
N1A_PED_MOVEMENT_STATE eCurrent_PedMovementState
IF bDoDeadCheck
IF NOT IS_ENTITY_ALIVE(pedIndex)
eCurrent_PedMovementState = N1A_PEDMOVEMENTSTATE_DEFAULT
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "GET_UPDATED_PED_MOVEMENT_STATE() return N1A_PEDMOVEMENTSTATE_DEFAULT ped not alive") ENDIF #ENDIF
RETURN eCurrent_PedMovementState
ENDIF
ENDIF
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
eCurrent_PedMovementState = N1A_PEDMOVEMENTSTATE_IN_VEHICLE
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "GET_UPDATED_PED_MOVEMENT_STATE() -> N1A_PEDMOVEMENTSTATE_IN_VEHICLE") ENDIF #ENDIF
ELIF GET_PED_STEALTH_MOVEMENT(pedIndex)
eCurrent_PedMovementState = N1A_PEDMOVEMENTSTATE_STEALTH
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "GET_UPDATED_PED_MOVEMENT_STATE() -> N1A_PEDMOVEMENTSTATE_STEALTH") ENDIF #ENDIF
ELIF IS_PED_IN_COVER(pedIndex)
eCurrent_PedMovementState = N1A_PEDMOVEMENTSTATE_COVER
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "GET_UPDATED_PED_MOVEMENT_STATE() -> N1A_PEDMOVEMENTSTATE_COVER") ENDIF #ENDIF
ELIF IS_PED_WALKING(pedIndex)
eCurrent_PedMovementState = N1A_PEDMOVEMENTSTATE_WALKING
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "GET_UPDATED_PED_MOVEMENT_STATE() -> N1A_PEDMOVEMENTSTATE_WALKING") ENDIF #ENDIF
ELIF IS_PED_RUNNING(PLAYER_PED_ID())
eCurrent_PedMovementState = N1A_PEDMOVEMENTSTATE_RUNNING
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "GET_UPDATED_PED_MOVEMENT_STATE() -> N1A_PEDMOVEMENTSTATE_RUNNING") ENDIF #ENDIF
ELIF IS_PED_SPRINTING(PLAYER_PED_ID())
eCurrent_PedMovementState = N1A_PEDMOVEMENTSTATE_SPRINTING
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "GET_UPDATED_PED_MOVEMENT_STATE() -> N1A_PEDMOVEMENTSTATE_SPRINTING") ENDIF #ENDIF
ELSE
eCurrent_PedMovementState = N1A_PEDMOVEMENTSTATE_DEFAULT
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "GET_UPDATED_PED_MOVEMENT_STATE() -> N1A_PEDMOVEMENTSTATE_DEFAULT") ENDIF #ENDIF
ENDIF
RETURN eCurrent_PedMovementState
ENDFUNC
/// PURPOSE:
/// make sure the generated spawn pos for the tooth pickup isn't in an unaccessible area
/// if it is update the spawn pos to a safe hard coded position
/// PARAMS:
/// vCoords - the position to check
/// fDistPlayerClearOfPickupCoord - added to the constant DIST_PLAYER_CLASSED_AS_COLLECTED_TOOTH_PICKUP to check that the spawn point is not within this range from the player
/// RETURNS:
/// TRUE if original position doesn't need updating or unsafe position was successfully updated
FUNC BOOL UPDATE_GENERATED_TOOTH_SPAWN_POS_IF_IN_UNSAFE_AREA(VECTOR &vCoords, FLOAT fDistPlayerClearOfPickupCoord = 0.25)
VECTOR vTempCoords
INT i, iVariations
BOOL bCoordsNeedUpdating = FALSE
// north side of the stage encasing the speakers to the front and rear
IF IS_POINT_IN_ANGLED_AREA(vCoords, <<-552.339050,288.716888,79.176384>>, <<-549.225220,288.553375,86.378616>>, 5.500000)
bCoordsNeedUpdating = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_GENERATED_TOOTH_SPAWN_POS_IF_IN_UNSAFE_AREA - coords in area 1 : vCoords = ", vCoords, " FrameCount : ", GET_FRAME_COUNT()) ENDIF #ENDIF
// south side of the stage encasing the speakers to the front and rear
ELIF IS_POINT_IN_ANGLED_AREA(vCoords, <<-552.902100,281.694794,79.976616>>, <<-549.659912,281.181702,89.677162>>, 4.000000)
bCoordsNeedUpdating = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_GENERATED_TOOTH_SPAWN_POS_IF_IN_UNSAFE_AREA - coords in area 2 : vCoords = ", vCoords, " FrameCount : ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
// get a hard corded spawn pos if coords need updating
IF bCoordsNeedUpdating
i = 0
iVariations = 12
REPEAT iVariations i
SWITCH i
CASE 0 vTempCoords = << -552.70709, 290.01120, 81.2 >> BREAK // north corner near stage
CASE 1 vTempCoords = << -552.81635, 287.68204, 81.2 >> BREAK // running South from corner near stage
CASE 2 vTempCoords = << -553.06049, 285.44385, 81.2 >> BREAK // running South from corner near stage
CASE 3 vTempCoords = << -553.43890, 282.57767, 81.2 >> BREAK // running South from corner near stage
CASE 4 vTempCoords = << -553.91620, 279.92017, 81.2 >> BREAK // running South from corner near stage
CASE 5 vTempCoords = << -555.19159, 290.48895, 81.2 >> BREAK // North middle of the room
CASE 6 vTempCoords = << -555.47510, 287.19907, 81.2 >> BREAK // running south middle of the room
CASE 7 vTempCoords = << -555.20837, 284.90021, 81.2 >> BREAK // running south middle of the room
CASE 8 vTempCoords = << -555.44061, 282.68533, 81.2 >> BREAK // running south middle of the room
CASE 9 vTempCoords = << -555.85413, 280.33383, 81.2 >> BREAK // running south middle of the room
// two back up points quiet far from the stage
CASE 10 vTempCoords = << -557.79437, 289.95535, 81.2 >> BREAK // way from stage north point
CASE 11 vTempCoords = << -558.29779, 284.79138, 81.2 >> BREAK // way from stage south point
ENDSWITCH
IF (VDIST(vPlayerPos, vCoords) > (DIST_PLAYER_CLASSED_AS_COLLECTED_TOOTH_PICKUP + fDistPlayerClearOfPickupCoord))
vCoords = vTempCoords
CPRINTLN(DEBUG_MISSION, "UPDATE_GENERATED_TOOTH_SPAWN_POS_IF_IN_UNSAFE_AREA - updated vCoords = ", vCoords, " FrameCount : ", GET_FRAME_COUNT())
RETURN TRUE
ENDIF
ENDREPEAT
ELSE
CPRINTLN(DEBUG_MISSION, "UPDATE_GENERATED_TOOTH_SPAWN_POS_IF_IN_UNSAFE_AREA - return TRUE update not needed, original coords were safe vCoords = ", vCoords, " FrameCount : ", GET_FRAME_COUNT())
RETURN TRUE
ENDIF
CPRINTLN(DEBUG_MISSION, "UPDATE_GENERATED_TOOTH_SPAWN_POS_IF_IN_UNSAFE_AREA - return FALSE failed to gen new coords. FrameCount : ", GET_FRAME_COUNT())
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Retrieve a suitable place to spawn the tooth pickup.
/// should be close to the musician
/// but not under the player as we don't want him instantly collecting it
/// PARAMS:
/// vCoords - the vector which will be used for the pickup placement
/// fDistPlayerClearOfPickupCoord - added to the constant DIST_PLAYER_CLASSED_AS_COLLECTED_TOOTH_PICKUP to check that the spawn point is not within this range from the player
/// RETURNS:
/// the Position to spawn the pickup
FUNC BOOL GET_TOOTH_PICKUP_COORDS(VECTOR &vCoords, FLOAT fDistPlayerClearOfPickupCoord = 1.00) // B*1533138 - pushed out range for tooth spawn
vCoords = << 0.0, 0.0, 0.0 >> //reset the passed in vector
IF DOES_ENTITY_EXIST(sWillyPed.pedIndex)
vCoords = GET_SAFE_PICKUP_COORDS(GET_ENTITY_COORDS(sWillyPed.pedIndex, FALSE), 1.5, 4.0)
//check to see that a valid coord was returned by GET_SAFE_PICKUP_COORDS
IF NOT ARE_VECTORS_EQUAL(vCoords, << 0.0, 0.0, 0.0 >>)
// make sure the tooth is somewhere accessible if not values are updated to a hard coded safe position
IF UPDATE_GENERATED_TOOTH_SPAWN_POS_IF_IN_UNSAFE_AREA(vCoords, fDistPlayerClearOfPickupCoord)
//Check the player isn't on top off the Position
IF (VDIST(vPlayerPos, vCoords) > (DIST_PLAYER_CLASSED_AS_COLLECTED_TOOTH_PICKUP + fDistPlayerClearOfPickupCoord))
CPRINTLN(DEBUG_MISSION, "GET_TOOTH_PICKUP_COORDS - RETURN TRUE - coords = ", vCoords, " FrameCount : ", GET_FRAME_COUNT())
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDIF
vCoords = << 0.0, 0.0, 0.0 >>
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "GET_TOOTH_PICKUP_COORDS - RETURN FALSE - unable to find suitable coord FrameCount : ", GET_FRAME_COUNT()) ENDIF #ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Check the difference between two coord's Z to see if they are more than the Threshold
/// To be used when deciding when to stop the combat task, as combat doesn't handle player standing slightly higher ground, e.g. on prop / vehicle
/// PARAMS:
/// v1 - first entity coords
/// v2 - second entity coords
/// fThreshold - the difference the Z coords has to be greater than
/// RETURNS:
/// TRUE if z difference is greater than fThreshold
FUNC BOOL IS_DIFFERENCE_IN_Z_COORDS_MORE_THAN_THRESHOLD(VECTOR v1, VECTOR v2, FLOAT fThreshold = Z_DIFFERENCE_COMBAT_TASK_STOPS_WORKING)
FLOAT fDiff_Zcoords
fDiff_Zcoords = v1.Z
fDiff_Zcoords -= v2.Z
fDiff_Zcoords = ABSF(fDiff_Zcoords)
IF fDiff_Zcoords > fThreshold
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// if the player hangs around the club or is pursuing Willy, give player a wanted level after period of time
PROC MONITOR_PLAYER_SCRIPTED_WANTED_LEVEL()
IF bShouldPlayerGetWantedLevelForWeaponInClub
OR bShouldPlayerGetWantedLevelAfterAttackingWilly
IF NOT bHasPlayerReceivedScriptedWantedLevel
INT iTimeTillScriptedWantedLevel = 0
IF bShouldPlayerGetWantedLevelAfterAttackingWilly
iTimeTillScriptedWantedLevel = NIG1A_TIME_DELAY_WANTED_FOR_WILLY_ASSAULT // 5 sec delay for
ELIF bShouldPlayerGetWantedLevelForWeaponInClub
iTimeTillScriptedWantedLevel = NIG1A_TIME_DELAY_WANTED_FOR_WEAPON_IN_CLUB // 10 sec delay for
ENDIF
IF iTimeTillScriptedWantedLevel != 0 // check we do want a wanted level to be applied
IF HAS_TIME_PASSED(iTimer_PlayerReceivesScriptedWantedLevel, iTimeTillScriptedWantedLevel)
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 2)
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
SUPPRESS_LOSING_WANTED_LEVEL_IF_HIDDEN_THIS_FRAME(PLAYER_ID())
IF bShouldPlayerGetWantedLevelAfterAttackingWilly
IF IS_ENTITY_IN_RANGE_COORDS(PLAYER_PED_ID(), vMusicClub_CentrePos, NIG1A_PLAYER_LEFT_THE_CLUB_DIST) // says club name so only do this if he's within range
PLAY_POLICE_REPORT("SCRIPTED_SCANNER_REPORT_NIGEL_1A_01", 0.0) // B*1551720 - Willy assault mentioned
ENDIF
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MONITOR_PLAYER_SCRIPTED_WANTED_LEVEL - PLAY_POLICE_REPORT(SCRIPTED_SCANNER_REPORT_NIGEL_1A_01, 0.0)") ENDIF #ENDIF
ENDIF
bHasPlayerReceivedScriptedWantedLevel = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MONITOR_PLAYER_SCRIPTED_WANTED_LEVEL - bHasPlayerReceivedScriptedWantedLevel set TRUE") ENDIF #ENDIF
ENDIF
ENDIF
ELSE
IF IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
// don't drop wanted level if inside the club or with in the leave area dist
IF ePlayerInsideClubStatus <> N1A_RCR_INVALID
AND ePlayerInsideClubStatus <> N1A_MAX_NUM_ROCK_CLUB_ROOMS
SUPPRESS_LOSING_WANTED_LEVEL_IF_HIDDEN_THIS_FRAME(PLAYER_ID())
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MONITOR_PLAYER_SCRIPTED_WANTED_LEVEL - player still in the club - wanted level kept on") ENDIF #ENDIF
ELIF IS_ENTITY_IN_RANGE_COORDS(PLAYER_PED_ID(), vMusicClub_CentrePos, NIG1A_PLAYER_LEFT_THE_CLUB_DIST)
SUPPRESS_LOSING_WANTED_LEVEL_IF_HIDDEN_THIS_FRAME(PLAYER_ID())
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MONITOR_PLAYER_SCRIPTED_WANTED_LEVEL - player still in vicinity of the club - wanted level kept on") ENDIF #ENDIF
//ELIF IS_ENTITY_IN_RANGE_COORDS(sWillyPed.pedIndex, vPlayerPos, NIG1A_PLAYER_CLASSED_AS_PURSUING_Willy_DIST)
// bSetWantedLevel = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Performs the CAN_PED_SEE_PED check and sets the specified FrameCounter if it returned TRUE
/// counter is used as a grace period for checking the ped has seen the player, as CAN_PED_SEE_PED takes several frames to return
/// PARAMS:
/// pedIndex - the ped to test against the player
/// iFrameCountLastSeenPlayer - the ped's last seen player counter
/// fOverride_PedViewCone - the ped's viewing cone - 170 is the default value
PROC UPDATE_PEDS_CAN_SEE_PLAYER_FRAME_COUNTER(PED_INDEX pedIndex, INT &iFrameCountLastSeenPlayer, FLOAT fOverride_PedViewCone = 170.0)
IF IS_ENTITY_ALIVE(pedIndex)
IF CAN_PED_SEE_PED(pedIndex, PLAYER_PED_ID(), fOverride_PedViewCone)
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:
/// 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 = TRUE)
//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_DLC_SNSPISTOL
FALLTHRU
CASE WEAPONTYPE_SMG
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 has started fighting the ped
/// PARAMS:
/// pedIndex - Ped who player is starting fight with
/// iFrameCounter_PedLastSeePlayer - the frame CAN_PED_SEE_PED last returned true for the pedIndex
/// bTestPlayerInMeleeCombat if TRUE IS_PED_IN_MELEE_COMBAT check is performed along with dist and see check
/// fPlayerDetectionDist - additional dist cap
/// 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, INT iFrameCounter_PedLastSeePlayer, BOOL bTestPlayerInMeleeCombat = TRUE, FLOAT fPlayerDetectionDist = 10.0)
IF IS_PED_UNINJURED(pedIndex)
IF IS_PLAYER_TARGETTING_ENTITY(PLAYER_ID(), pedIndex)
OR (bTestPlayerInMeleeCombat AND IS_PED_IN_MELEE_COMBAT(PLAYER_PED_ID()))
IF IS_ENTITY_IN_RANGE_COORDS(pedIndex, vPlayerPos, fPlayerDetectionDist) //and is with in the range
IF NOT HAS_FRAME_COUNTER_PASSED(iFrameCounter_PedLastSeePlayer, CAN_PED_SEE_PED_FRAME_COUNT_GRACE_PERIOD) // test ped has seen the player in the last 10 frames
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "HAS_PLAYER_STARTED_FIGHT_WITH_SPECIFIC_PED() check - PLAYER TARGETTED PED return TRUE : iFrameCounter_PedLastSeePlayer = ", iFrameCounter_PedLastSeePlayer, " Frame Count = ", GET_FRAME_COUNT()) ENDIF #ENDIF
RETURN TRUE
ELSE
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "HAS_PLAYER_STARTED_FIGHT_WITH_SPECIFIC_PED - HAS_FRAME_COUNTER_PASSED return FALSE - iFrameCounter_PedLastSeePlayer = ", iFrameCounter_PedLastSeePlayer, " Frame Count = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(pedIndex, PLAYER_PED_ID())
//CLEAR_ENTITY_LAST_DAMAGE_ENTITY(pedIndex)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "HAS_PLAYER_STARTED_FIGHT_WITH_SPECIFIC_PED() check - PLAYER DAMAGED PED") ENDIF #ENDIF
RETURN TRUE
ENDIF
IF IS_ENTITY_TOUCHING_ENTITY(pedIndex, PLAYER_PED_ID())
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "HAS_PLAYER_STARTED_FIGHT_WITH_SPECIFIC_PED() check - PLAYER touching PED") ENDIF #ENDIF
RETURN TRUE
ENDIF
ENDIF
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
/// iFrameCounter_PedLastSeePlayer - the frame count for the last time the pedIndex could see the player
/// bWeaponDrawInClubClassedAsIntimidating - player seen in club with weapon draw will return true
/// 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, INT iFrameCounter_PedLastSeePlayer, BOOL bWeaponDrawInClubClassedAsIntimidating = FALSE, FLOAT fPlayerDetectionDist = 50.0, FLOAT fBulletRadiusCheck = 8.0, FLOAT fProjectileRadiusCheck = 15.0)
IF IS_PED_UNINJURED(pedIndex)
IF IS_PLAYER_CURRENT_WEAPON_LETHAL()
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, "IS_PLAYER_USING_WEAPON_TO_INTIMIDATE_SPECIFIC_PED - bullet in area around ped : ", "return TRUE") ENDIF #ENDIF
RETURN TRUE
ENDIF
IF IS_ENTITY_IN_RANGE_COORDS(pedIndex, vPlayerPos, fPlayerDetectionDist) //and is with in the range
IF NOT HAS_FRAME_COUNTER_PASSED(iFrameCounter_PedLastSeePlayer, CAN_PED_SEE_PED_FRAME_COUNT_GRACE_PERIOD) // test ped has seen the player in the last 10 frames
IF bWeaponDrawInClubClassedAsIntimidating
IF ePlayerInsideClubStatus <> N1A_RCR_INVALID // make sure player is in the club first
AND ePlayerInsideClubStatus <> N1A_MAX_NUM_ROCK_CLUB_ROOMS
// B*1511108 - try to ensure weapon is visible
IF IS_PED_WEAPON_READY_TO_SHOOT(PLAYER_PED_ID())
OR IS_PED_RELOADING(PLAYER_PED_ID())
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_PLAYER_USING_WEAPON_TO_INTIMIDATE_SPECIFIC_PED - player weapon seen in club : ", "return TRUE") ENDIF #ENDIF
RETURN TRUE
ENDIF
ENDIF
ENDIF
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, "IS_PLAYER_USING_WEAPON_TO_INTIMIDATE_SPECIFIC_PED - playing free aiming or targeting ped : ", "return TRUE") ENDIF #ENDIF
RETURN TRUE
ENDIF
IF IS_PED_SHOOTING(PLAYER_PED_ID())
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_PLAYER_USING_WEAPON_TO_INTIMIDATE_SPECIFIC_PED - player shooting with weapon : ", "return TRUE") ENDIF #ENDIF
RETURN TRUE
ENDIF
IF IS_ENTITY_TOUCHING_ENTITY(PLAYER_PED_ID(), pedIndex)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_PLAYER_USING_WEAPON_TO_INTIMIDATE_SPECIFIC_PED - player touching ped with weapon drawn : ", "return TRUE") ENDIF #ENDIF
RETURN TRUE
ENDIF
ELSE
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_PLAYER_USING_WEAPON_TO_INTIMIDATE_SPECIFIC_PED - ped can't see player : ", "return FALSE") ENDIF #ENDIF
ENDIF
ELSE
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_PLAYER_USING_WEAPON_TO_INTIMIDATE_SPECIFIC_PED - player not in range of ped : ", "return FALSE") 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, "IS_PLAYER_USING_WEAPON_TO_INTIMIDATE_SPECIFIC_PED - ped damaged by player with weapon : ", "return TRUE") 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 the ped is in the club, only check for projectiles in the club
IF IS_ENTITY_INSIDE_MUSIC_CLUB_INTERIOR(pedIndex)
VECTOR vProjectilePos
IF GET_COORDS_OF_PROJECTILE_TYPE_IN_AREA(vMin, vMax, WEAPONTYPE_GRENADE, vProjectilePos)
ELIF GET_COORDS_OF_PROJECTILE_TYPE_IN_AREA(vMin, vMax, WEAPONTYPE_SMOKEGRENADE, vProjectilePos)
ELIF GET_COORDS_OF_PROJECTILE_TYPE_IN_AREA(vMin, vMax, WEAPONTYPE_STICKYBOMB, vProjectilePos)
ELIF GET_COORDS_OF_PROJECTILE_TYPE_IN_AREA(vMin, vMax, WEAPONTYPE_MOLOTOV, vProjectilePos)
// check the projectile is inside the club
IF IS_POSITION_INSIDE_MUSIC_CLUB_INTERIOR(vProjectilePos)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_PLAYER_USING_WEAPON_TO_INTIMIDATE_SPECIFIC_PED - projectile in area around ped IN CLUB : ", "return TRUE") ENDIF #ENDIF
RETURN TRUE
ENDIF
ENDIF
ELSE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_PLAYER_USING_WEAPON_TO_INTIMIDATE_SPECIFIC_PED - projectile in area around ped : ", "return TRUE") ENDIF #ENDIF
RETURN TRUE
ENDIF
ENDIF
ENDIF
ELSE
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_PLAYER_USING_WEAPON_TO_INTIMIDATE_SPECIFIC_PED - player current weapon not leathal : ", "return FALSE") ENDIF #ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Checks if the player is intimidating a ped enough that they should react
/// NOTE: doesn't take into account player weapon
/// PARAMS:
/// pedIndex - Ped who the player is intimidating
/// iFrameCounter_PedLastSeePlayer - the frame count for the last time the pedIndex could see the player
/// bIncludeBumpedCheck - if true func will return TRUE for player bumping into the ped
/// 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_INTIMIDATE_SPECIFIC_PED(PED_INDEX pedIndex, INT iFrameCounter_PedLastSeePlayer, BOOL bIncludeBumpedCheck = TRUE, FLOAT fPlayerDetectionDist = 20.0, FLOAT fBulletRadiusCheck = 8.0, FLOAT fProjectileRadiusCheck = 15.0)
IF IS_PED_UNINJURED(pedIndex)
VECTOR vTemp_PedPos = GET_ENTITY_COORDS(pedIndex)
IF IS_BULLET_IN_AREA(vTemp_PedPos, fBulletRadiusCheck, TRUE)
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_PLAYER_INTIMIDATE_SPECIFIC_PED - bullet in area around ped") ENDIF #ENDIF
RETURN TRUE
ENDIF
IF IS_ENTITY_IN_RANGE_COORDS(pedIndex, vPlayerPos, fPlayerDetectionDist) //and is with in the range
IF NOT HAS_FRAME_COUNTER_PASSED(iFrameCounter_PedLastSeePlayer, CAN_PED_SEE_PED_FRAME_COUNT_GRACE_PERIOD) // test ped has seen the player in the last 10 frames
IF IS_PLAYER_CURRENT_WEAPON_LETHAL()
// B*1511108 - try to ensure weapon is visible
IF IS_PED_WEAPON_READY_TO_SHOOT(PLAYER_PED_ID())
OR IS_PED_RELOADING(PLAYER_PED_ID())
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_PLAYER_INTIMIDATE_SPECIFIC_PED - playing has leathal weapon in view") ENDIF #ENDIF
RETURN TRUE
ENDIF
ENDIF
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, "IS_PLAYER_INTIMIDATE_SPECIFIC_PED - 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, "IS_PLAYER_INTIMIDATE_SPECIFIC_PED - player shooting with weapon") ENDIF #ENDIF
RETURN TRUE
ENDIF
IF IS_PED_IN_COMBAT(PLAYER_PED_ID())
OR IS_PED_PERFORMING_STEALTH_KILL(PLAYER_PED_ID())
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_PLAYER_INTIMIDATE_SPECIFIC_PED - player seen in combat or performing stealth kill") ENDIF #ENDIF
RETURN TRUE
ENDIF
ENDIF
ENDIF
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(pedIndex, PLAYER_PED_ID())
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(pedIndex)
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_PLAYER_INTIMIDATE_SPECIFIC_PED - ped damaged by player with weapon") ENDIF #ENDIF
RETURN TRUE
ENDIF
IF bIncludeBumpedCheck
IF IS_ENTITY_TOUCHING_ENTITY(pedIndex, PLAYER_PED_ID())
IF IS_PED_RAGDOLL(pedIndex)
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_PLAYER_INTIMIDATE_SPECIFIC_PED check - PLAYER touching PED and ped is ragdoll") ENDIF #ENDIF
RETURN TRUE
ENDIF
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 the ped is in the club, only check for projectiles in the club
IF IS_ENTITY_INSIDE_MUSIC_CLUB_INTERIOR(pedIndex)
VECTOR vProjectilePos
IF GET_COORDS_OF_PROJECTILE_TYPE_IN_AREA(vMin, vMax, WEAPONTYPE_GRENADE, vProjectilePos)
ELIF GET_COORDS_OF_PROJECTILE_TYPE_IN_AREA(vMin, vMax, WEAPONTYPE_SMOKEGRENADE, vProjectilePos)
ELIF GET_COORDS_OF_PROJECTILE_TYPE_IN_AREA(vMin, vMax, WEAPONTYPE_STICKYBOMB, vProjectilePos)
ELIF GET_COORDS_OF_PROJECTILE_TYPE_IN_AREA(vMin, vMax, WEAPONTYPE_MOLOTOV, vProjectilePos)
// check the projectile is inside the club
IF IS_POSITION_INSIDE_MUSIC_CLUB_INTERIOR(vProjectilePos)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_PLAYER_INTIMIDATE_SPECIFIC_PED - projectile in area around ped IN CLUB : ", "return TRUE") ENDIF #ENDIF
RETURN TRUE
ENDIF
ENDIF
ELSE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_PLAYER_INTIMIDATE_SPECIFIC_PED - projectile in area around ped : ", "return TRUE") ENDIF #ENDIF
RETURN TRUE
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// check for player bumping into a ped
/// PARAMS:
/// pedIndex - specific ped
/// RETURNS:
/// if player is touching ped and ped is ragdoll
FUNC BOOL IS_PLAYER_BUMPING_INTO_PED(PED_INDEX pedIndex)
IF IS_PED_UNINJURED(pedIndex)
IF IS_ENTITY_TOUCHING_ENTITY(pedIndex, PLAYER_PED_ID())
IF IS_PED_RAGDOLL(pedIndex)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_PLAYER_BUMPING_INTO_PED check - return TRUE ragdoll and touching this frame : ", GET_FRAME_COUNT()) ENDIF #ENDIF
RETURN TRUE
ENDIF
ENDIF
IF HAS_PED_RECEIVED_EVENT(pedIndex, EVENT_PED_COLLISION_WITH_PLAYER)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_PLAYER_BUMPING_INTO_PED check - return TRUE collision event this frame : ", GET_FRAME_COUNT()) ENDIF #ENDIF
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// check for player bumping into one of the club peds
/// different check for sync scene peds who need to play an anim
/// PARAMS:
/// pedIndex - specific ped
/// RETURNS:
/// TRUE if bumped
FUNC BOOL IS_PLAYER_BUMPING_INTO_CLUB_PED(INT iClubPedIndex)
IF iClubPedIndex = CLUB_PED_BAND_MANAGER
OR iClubPedIndex = CLUB_PED_GROUPIE_UPSTAIRS_02
IF IS_PED_UNINJURED(sClubPed[iClubPedIndex].pedIndex)
IF IS_ENTITY_TOUCHING_ENTITY(sClubPed[iClubPedIndex].pedIndex, PLAYER_PED_ID())
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_PLAYER_BUMPING_INTO_CLUB_PED check - return TRUE for ped using sync scene ID : ", iClubPedIndex, " this frame : ", GET_FRAME_COUNT()) ENDIF #ENDIF
RETURN TRUE
ENDIF
ENDIF
ELSE
IF IS_PLAYER_BUMPING_INTO_PED(sClubPed[iClubPedIndex].pedIndex)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "IS_PLAYER_BUMPING_INTO_CLUB_PED check - return TRUE for ped ID : ", iClubPedIndex, " this frame : ", GET_FRAME_COUNT()) ENDIF #ENDIF
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// check if the pedIndex's health is equal to or below the threshold
/// PARAMS:
/// pedIndex - the ped to test
/// bLastHitMustBeMelee - only returns TRUE if the last register damage was melee
/// iHealthThreshold - the health threshold
/// RETURNS:
/// true if the ped's health is less than or equal to the threshold, and bLastDamageMustBeMelee if TRUE
FUNC BOOL HAS_PLAYER_BEATEN_UP_SPECIFIC_PED(PED_INDEX pedIndex, BOOL bLastDamageMustBeMelee = FALSE, INT iHealthThreshold = 180)
IF IS_PED_UNINJURED(pedIndex)
IF (GET_ENTITY_HEALTH(pedIndex) <= iHealthThreshold)
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(sWillyPed.pedIndex, PLAYER_PED_ID())
IF bLastDamageMustBeMelee
IF HAS_PED_BEEN_DAMAGED_BY_WEAPON(sWillyPed.pedIndex, WEAPONTYPE_INVALID, GENERALWEAPON_TYPE_ANYMELEE)
OR HAS_PED_BEEN_DAMAGED_BY_WEAPON(sWillyPed.pedIndex, WEAPONTYPE_UNARMED) // may not need this test
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(pedIndex)
CLEAR_PED_LAST_WEAPON_DAMAGE(pedIndex)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "HAS_PLAYER_BEATEN_UP_SPECIFIC_PED : return TRUE - bLastDamageMustBeMelee = ", bLastDamageMustBeMelee) ENDIF #ENDIF
RETURN TRUE
ENDIF
ELSE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "HAS_PLAYER_BEATEN_UP_SPECIFIC_PED : return TRUE - bLastDamageMustBeMelee = ", bLastDamageMustBeMelee) ENDIF #ENDIF
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDIF
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(pedIndex)
CLEAR_PED_LAST_WEAPON_DAMAGE(pedIndex)
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Check if Willy has called for Security or said this surrender dialogue
/// RETURNS:
/// TRUE if Willy has shouted for security
FUNC BOOL HAS_Willy_CALLED_FOR_SECURITY()
IF bDoneDialogue_MusicianShoutSecurity
OR bDoneDialogue_MusicianSurrendered
IF NOT IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("NIG1A_M1") // Security! Where's security!?
AND NOT IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("NIG1A_MSU2") // Oh no don't hurt me, don't hurt me! What do you want?
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "HAS_Willy_CALLED_FOR_SECURITY or said surrender dialogue - return TRUE") ENDIF #ENDIF
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// make player head track Willy prior to it all kicking off when he's in the same room as Willy
/// for B*1519694
PROC HANDLE_PLAYER_HEADTRACKING_WILLY_PRE_BRAWL()
IF eMusicianState = N1A_MUSICIAN_STATE_RELAXED
IF IS_ENTITY_ALIVE(sWillyPed.pedIndex)
IF ePlayerInsideClubStatus = N1A_RCR_MAIN_ROOM
IF NOT IS_PED_HEADTRACKING_PED(PLAYER_PED_ID(), sWillyPed.pedIndex)
TASK_LOOK_AT_ENTITY(PLAYER_PED_ID(), sWillyPed.pedIndex, -1)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "HANDLE_PLAYER_HEADTRACKING_WILLY_PRE_BRAWL - task applied") ENDIF #ENDIF
ENDIF
ELSE
IF IS_PED_HEADTRACKING_PED(PLAYER_PED_ID(), sWillyPed.pedIndex)
TASK_CLEAR_LOOK_AT(PLAYER_PED_ID())
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "HANDLE_PLAYER_HEADTRACKING_WILLY_PRE_BRAWL - task cleared") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// had to move this here since skip has to call it earlier
PROC SET_WILLY_AI_SETUP_FLEE_TASK()
IF IS_PED_UNINJURED(sWillyPed.pedIndex)
CLEAR_PED_TASKS(sWillyPed.pedIndex)
SET_PED_CAN_RAGDOLL_FROM_PLAYER_IMPACT(sWillyPed.pedIndex, TRUE) // B*1543302 - ensure this is renabled
SET_PED_COMBAT_ATTRIBUTES(sWillyPed.pedIndex, CA_ALWAYS_FIGHT, FALSE)
SET_PED_FLEE_ATTRIBUTES(sWillyPed.pedIndex, FA_RETURN_TO_ORIGNAL_POSITION_AFTER_FLEE, FALSE)
SET_PED_FLEE_ATTRIBUTES(sWillyPed.pedIndex, FA_DISABLE_HANDS_UP, FALSE)
SET_PED_FLEE_ATTRIBUTES(sWillyPed.pedIndex, FA_USE_VEHICLE, FALSE)
SET_PED_FLEE_ATTRIBUTES(sWillyPed.pedIndex, FA_PREFER_PAVEMENTS, TRUE)
SET_PED_FLEE_ATTRIBUTES(sWillyPed.pedIndex, FA_USE_COVER, FALSE)
SET_PED_FLEE_ATTRIBUTES(sWillyPed.pedIndex, FA_LOOK_FOR_CROWDS, FALSE)
SET_PED_MAX_MOVE_BLEND_RATIO(sWillyPed.pedIndex, PEDMOVEBLENDRATIO_RUN)
IF IsPedPerformingTask(sWillyPed.pedIndex, SCRIPT_TASK_SYNCHRONIZED_SCENE)
STOP_SYNCHRONIZED_ENTITY_ANIM(sWillyPed.pedIndex, FAST_BLEND_OUT, TRUE)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_MUSICIAN_PED_AI ~~~ ", "N1A_PED_AI_SETUP_FLEE - Musician sync scene stopped") ENDIF #ENDIF
ENDIF
OPEN_SEQUENCE_TASK(sequenceAI)
IF IS_PED_IN_ANY_VEHICLE(sWillyPed.pedIndex)
TASK_LEAVE_ANY_VEHICLE(NULL, 0, ECF_DONT_WAIT_FOR_VEHICLE_TO_STOP)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_MUSICIAN_PED_AI ~~~ ", "N1A_PED_AI_SETUP_FLEE - Musician told to exit vehicle") ENDIF #ENDIF
ENDIF
TASK_SMART_FLEE_PED(NULL, PLAYER_PED_ID(), 150.0, -1, TRUE)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_MUSICIAN_PED_AI ~~~ ", "N1A_PED_AI_SETUP_FLEE - Musician setup to flee on foot") ENDIF #ENDIF
CLOSE_SEQUENCE_TASK(sequenceAI)
TASK_PERFORM_SEQUENCE(sWillyPed.pedIndex, sequenceAI)
CLEAR_SEQUENCE_TASK(sequenceAI)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sWillyPed.pedIndex, TRUE)
ENDIF
ENDPROC
/// PURPOSE:
/// Updates the behaviour of the musician ped
PROC UPDATE_MUSICIAN_PED_AI()
IF IS_PED_UNINJURED(sWillyPed.pedIndex)
SET_PED_RESET_FLAG(sWillyPed.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 (sWillyPed.AI)
CASE N1A_PED_AI_SETUP_RELAXED
sWillyPed.AI = N1A_PED_AI_STATE_RELAXED
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_MUSICIAN_PED_AI ~~~ set - ", "N1A_PED_AI_SETUP_RELAXED") ENDIF #ENDIF
BREAK
CASE N1A_PED_AI_STATE_RELAXED
//currently an idle state
IF IS_ENTITY_IN_RANGE_COORDS(sWillyPed.pedIndex, vPlayerPos, 8.0) // rougly width of the pavement
//IF NOT IsPedPerformingTask(sWillyPed.pedIndex, SCRIPT_TASK_LOOK_AT_ENTITY) // this doesn't work as it's a secondary task
IF NOT IS_PED_HEADTRACKING_PED(sWillyPed.pedIndex, PLAYER_PED_ID())
TASK_LOOK_AT_ENTITY(sWillyPed.pedIndex, PLAYER_PED_ID(), -1)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_MUSICIAN_PED_AI ~~~ set look at player - N1A_PED_AI_STATE_RELAXED") ENDIF #ENDIF
ENDIF
ELSE
//IF IsPedPerformingTask(sWillyPed.pedIndex, SCRIPT_TASK_LOOK_AT_ENTITY) // this doesn't work as it's a secondary task
IF IS_PED_HEADTRACKING_PED(sWillyPed.pedIndex, PLAYER_PED_ID())
TASK_CLEAR_LOOK_AT(sWillyPed.pedIndex)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_MUSICIAN_PED_AI ~~~ Clear look at player - N1A_PED_AI_STATE_RELAXED") ENDIF #ENDIF
ENDIF
ENDIF
BREAK
CASE N1A_PED_AI_STATE_UNDER_SYNCED_SCENE_CONTROL
BREAK
CASE N1A_PED_AI_SETUP_MELEE_ATTACK
IF HAS_Willy_AND_GROUPIE_FINISHED_EXIT_SYNCED_ANIM(TRUE)
//IF HAS_TIME_PASSED(sWillyPed.iAiDelayTimer, GET_RANDOM_INT_IN_RANGE(250, 500)) // small delay in his reaction
IF IsPedPerformingTask(sWillyPed.pedIndex, SCRIPT_TASK_SYNCHRONIZED_SCENE)
STOP_SYNCHRONIZED_ENTITY_ANIM(sWillyPed.pedIndex, FAST_BLEND_OUT, TRUE)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_MUSICIAN_PED_AI ~~~ ", "N1A_PED_AI_SETUP_SURRENDERED - Musician sync scene stopped") ENDIF #ENDIF
ENDIF
//CLEAR_PED_TASKS(sWillyPed.pedIndex)
SET_PED_COMBAT_ATTRIBUTES(sWillyPed.pedIndex, CA_ALWAYS_FIGHT, TRUE)
TASK_COMBAT_PED(sWillyPed.pedIndex, PLAYER_PED_ID())
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sWillyPed.pedIndex, TRUE)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_MUSICIAN_PED_AI ~~~ ", "N1A_PED_AI_SETUP_MELEE_ATTACK") ENDIF #ENDIF
sWillyPed.AI = N1A_PED_AI_STATE_MELEE_ATTACK
//ENDIF
ELSE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_MUSICIAN_PED_AI ~~~ ", "N1A_PED_AI_SETUP_MELEE_ATTACK - waiting on exit sync scene") ENDIF #ENDIF
ENDIF
BREAK
CASE N1A_PED_AI_STATE_MELEE_ATTACK
/*IF NOT IS_ENTITY_IN_SPECIFIC_ROOM_INSIDE_MUSIC_CLUB_INTERIOR(sWillyPed.pedIndex, N1A_RCR_MAIN_ROOM, FALSE)
//if the Musician isn't inside the area - seen when trying to navigate to player who was on higher ground
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_MUSICIAN_PED_AI ~~~ ", "N1A_PED_AI_SETUP_MELEE_ATTACK - done - musician left area") ENDIF #ENDIF
sWillyPed.iAiDelayTimer = (GET_GAME_TIMER() - 9000) // ensure the task reapply has no delay
sWillyPed.AI = N1A_PED_AI_SETUP_REACHED_PERIMETER
ELIF IS_DIFFERENCE_IN_Z_COORDS_MORE_THAN_THRESHOLD(GET_ENTITY_COORDS(sWillyPed.pedIndex), vPlayerPos, Z_DIFFERENCE_COMBAT_TASK_STOPS_WORKING)
//if the Musician isn't inside the area - seen when trying to navigate to player who was on higher ground
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_MUSICIAN_PED_AI ~~~ ", "N1A_PED_AI_SETUP_MELEE_ATTACK done - Player to high to reach") ENDIF #ENDIF
sWillyPed.AI = N1A_PED_AI_SETUP_OUT_OF_REACH
ELSE*/
IF NOT IsPedPerformingTask(sWillyPed.pedIndex, SCRIPT_TASK_COMBAT)
// PED HAS LOST HIS TASK, RESET IT
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_MUSICIAN_PED_AI ~~~ ", "N1A_PED_AI_STATE_MELEE_ATTACK - done") ENDIF #ENDIF
sWillyPed.AI = N1A_PED_AI_SETUP_MELEE_ATTACK
ENDIF
//ENDIF
BREAK
CASE N1A_PED_AI_SETUP_MUSICIAN_BEATEN_UP
// B*1340051 - went from flee to fall over back to flee before hand to mouth anim
IF IS_PED_FLEEING(sWillyPed.pedIndex)
OR IsPedPerformingTask(sWillyPed.pedIndex, SCRIPT_TASK_SMART_FLEE_PED)
CLEAR_PED_TASKS(sWillyPed.pedIndex)
ENDIF
REQUEST_ANIM_DICT(tlAnimDict_WillyMocappedHurtAnims) // early request for knocked out anims - N1A_PED_AI_SETUP_MUSICIAN_TOOTH_KNOCKED_OUT_ANIMS
//CLEAR_PED_TASKS_IMMEDIATELY(sWillyPed.pedIndex) //we do this because CLEAR_PED_TASKS doesn't always switch the task straight away, e.g. when brawling
SET_PED_COMBAT_ATTRIBUTES(sWillyPed.pedIndex, CA_ALWAYS_FIGHT, FALSE)
SET_PED_CAN_RAGDOLL(sWillyPed.pedIndex, TRUE)
IF NOT IS_PED_RAGDOLL(sWillyPed.pedIndex)
SET_PED_TO_RAGDOLL(sWillyPed.pedIndex, 1000, 1000, TASK_RELAX)
//VECTOR vTempPos
//vTempPos = GET_ENTITY_COORDS(sWillyPed.pedIndex)
//SET_PED_TO_RAGDOLL_WITH_FALL(sWillyPed.pedIndex, 5000, 8000, TYPE_DOWN_STAIRS, GET_ENTITY_FORWARD_VECTOR(PLAYER_PED_ID()), vTempPos.Z, << 0.0, 0.0, 0.0 >>, << 0.0, 0.0, 0.0 >>)
ENDIF
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_MUSICIAN_PED_AI ~~~ ", "N1A_PED_AI_SETUP_MUSICIAN_BEATEN_UP - done") ENDIF #ENDIF
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sWillyPed.pedIndex, TRUE)
sWillyPed.AI = N1A_PED_AI_STATE_MUSICIAN_BEATEN_UP
BREAK
CASE N1A_PED_AI_STATE_MUSICIAN_BEATEN_UP
IF NOT IS_PED_RAGDOLL(sWillyPed.pedIndex)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_MUSICIAN_PED_AI ~~~ N1A_PED_AI_STATE_MUSICIAN_BEATEN_UP - done") ENDIF #ENDIF
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sWillyPed.pedIndex, TRUE)
sWillyPed.AI = N1A_PED_AI_SETUP_MUSICIAN_TOOTH_KNOCKED_OUT_ANIMS
ENDIF
//now switching him to flee behaviour instead
/*
IF NOT IS_PED_RAGDOLL(sWillyPed.pedIndex)
sWillyPed.AI = N1A_PED_AI_STATE_MUSICIAN_BEATEN_UP
IF GET_SCRIPT_TASK_STATUS(sWillyPed.pedIndex, SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
AND GET_SCRIPT_TASK_STATUS(sWillyPed.pedIndex, SCRIPT_TASK_PERFORM_SEQUENCE) != WAITING_TO_START_TASK
OPEN_SEQUENCE_TASK(sequenceAI)
TASK_COWER(NULL, -1)
CLOSE_SEQUENCE_TASK(sequenceAI)
TASK_PERFORM_SEQUENCE(sWillyPed.pedIndex, sequenceAI)
CLEAR_SEQUENCE_TASK(sequenceAI)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sWillyPed.pedIndex, TRUE)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_MUSICIAN_PED_AI ~~~ ", "N1A_PED_AI_STATE_MUSICIAN_BEATEN_UP - done") ENDIF #ENDIF
ENDIF
ENDIF
*/
BREAK
CASE N1A_PED_AI_SETUP_MUSICIAN_TOOTH_KNOCKED_OUT_ANIMS
REQUEST_ANIM_DICT(tlAnimDict_WillyMocappedHurtAnims)
IF HAS_ANIM_DICT_LOADED(tlAnimDict_WillyMocappedHurtAnims)
IF NOT IS_PED_GETTING_UP(sWillyPed.pedIndex)
AND NOT IS_PED_RAGDOLL(sWillyPed.pedIndex)
AND NOT IS_PED_BEING_STUNNED(sWillyPed.pedIndex)
SET_PED_CAN_RAGDOLL_FROM_PLAYER_IMPACT(sWillyPed.pedIndex, TRUE) // B*1543302 - renable this once he's up
TASK_CLEAR_LOOK_AT(sWillyPed.pedIndex)
SET_PED_CAN_USE_AUTO_CONVERSATION_LOOKAT(sWillyPed.pedIndex, FALSE) // B* 1492058 look at makes anim clip
OPEN_SEQUENCE_TASK(sequenceAI)
/*IF NOT IS_PED_FACING_PED(sWillyPed.pedIndex, PLAYER_PED_ID(), 120)
TASK_TURN_PED_TO_FACE_ENTITY(NULL, PLAYER_PED_ID(), 2000)
ENDIF*/ // just play the anim once stood up
TASK_PLAY_ANIM(NULL, tlAnimDict_WillyMocappedHurtAnims, "enter_willie", SLOW_BLEND_IN, NORMAL_BLEND_OUT, -1)//, AF_UPPERBODY | AF_SECONDARY)
TASK_PLAY_ANIM(NULL, tlAnimDict_WillyMocappedHurtAnims, "base_willie", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, 2000) //, AF_UPPERBODY | AF_SECONDARY)
TASK_PLAY_ANIM(NULL, tlAnimDict_WillyMocappedHurtAnims, "exit_willie", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1) //, AF_UPPERBODY | AF_SECONDARY)
CLOSE_SEQUENCE_TASK(sequenceAI)
TASK_PERFORM_SEQUENCE(sWillyPed.pedIndex, sequenceAI)
CLEAR_SEQUENCE_TASK(sequenceAI)
REMOVE_ANIM_DICT(tlAnimDict_WillyMocappedHurtAnims)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sWillyPed.pedIndex, TRUE)
sWillyPed.iTimer = GET_GAME_TIMER()
sWillyPed.iAiDelayTimer = GET_GAME_TIMER()
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_MUSICIAN_PED_AI ~~~ ", "N1A_PED_AI_SETUP_MUSICIAN_TOOTH_KNOCKED_OUT_ANIMS - done") ENDIF #ENDIF
sWillyPed.AI = N1A_PED_AI_STATE_MUSICIAN_TOOTH_KNOCKED_OUT_ANIMS
ENDIF
ENDIF
BREAK
CASE N1A_PED_AI_STATE_MUSICIAN_TOOTH_KNOCKED_OUT_ANIMS
IF NOT IsPedPerformingTask(sWillyPed.pedIndex, SCRIPT_TASK_PERFORM_SEQUENCE)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_MUSICIAN_PED_AI ~~~ ", "N1A_PED_AI_STATE_MUSICIAN_TOOTH_KNOCKED_OUT_ANIMS -> N1A_PED_AI_STATE_MUSICIAN_FINISHED_TOOTH_OUT_ANIMS") ENDIF #ENDIF
sWillyPed.AI = N1A_PED_AI_STATE_MUSICIAN_FINISHED_TOOTH_OUT_ANIMS
ELSE
IF IS_ENTITY_PLAYING_ANIM(sWillyPed.pedIndex, tlAnimDict_WillyMocappedHurtAnims, "enter_willie")
SET_ENTITY_ANIM_SPEED(sWillyPed.pedIndex, tlAnimDict_WillyMocappedHurtAnims, "enter_willie", 1.4)
ELIF IS_ENTITY_PLAYING_ANIM(sWillyPed.pedIndex, tlAnimDict_WillyMocappedHurtAnims, "exit_willie")
SET_ENTITY_ANIM_SPEED(sWillyPed.pedIndex, tlAnimDict_WillyMocappedHurtAnims, "exit_willie", 1.2)
ENDIF
ENDIF
BREAK
CASE N1A_PED_AI_STATE_MUSICIAN_FINISHED_TOOTH_OUT_ANIMS
IF NOT IS_PED_HEADTRACKING_PED(sWillyPed.pedIndex, PLAYER_PED_ID())
TASK_LOOK_AT_ENTITY(sWillyPed.pedIndex, PLAYER_PED_ID(), -1)
SET_PED_CAN_USE_AUTO_CONVERSATION_LOOKAT(sWillyPed.pedIndex, TRUE) // turn back on B* 1492058 look at makes anim clip
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_MUSICIAN_PED_AI ~~~ set look at player - N1A_PED_AI_STATE_MUSICIAN_FINISHED_TOOTH_OUT_ANIMS") ENDIF #ENDIF
ENDIF
IF NOT IS_PED_FACING_PED(sWillyPed.pedIndex, PLAYER_PED_ID(), 90)
IF NOT IsPedPerformingTask(PLAYER_PED_ID(), SCRIPT_TASK_TURN_PED_TO_FACE_ENTITY)
TASK_TURN_PED_TO_FACE_ENTITY(sWillyPed.pedIndex, PLAYER_PED_ID(), -1)
ENDIF
ENDIF
BREAK
CASE N1A_PED_AI_SETUP_REACHED_PERIMETER
OPEN_SEQUENCE_TASK(sequenceAI)
IF (VDIST(GET_ENTITY_COORDS(sWillyPed.pedIndex), vMusicClub_CentrePos) >= 10.0)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, vMusicClub_CentrePos, PEDMOVEBLENDRATIO_WALK, DEFAULT_TIME_BEFORE_WARP, 2.0)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_MUSICIAN_PED_AI ~~~ ", "N1A_PED_AI_SETUP_REACHED_PERIMETER - return to area then anims") ENDIF #ENDIF
ELSE
TASK_TURN_PED_TO_FACE_ENTITY(NULL, PLAYER_PED_ID(), 1) //done to balance the amount of tasks in the sequence as i test that to see when we reach the last turn task
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_MUSICIAN_PED_AI ~~~ ", "N1A_PED_AI_SETUP_REACHED_PERIMETER - just play anims") ENDIF #ENDIF
ENDIF
TASK_TURN_PED_TO_FACE_ENTITY(NULL, PLAYER_PED_ID(), 0)
TASK_LOOK_AT_ENTITY(NULL, PLAYER_PED_ID(), GET_RANDOM_INT_IN_RANGE(1000, 2000))
TASK_TURN_PED_TO_FACE_ENTITY(NULL, PLAYER_PED_ID(), -1)
CLOSE_SEQUENCE_TASK(sequenceAI)
TASK_PERFORM_SEQUENCE(sWillyPed.pedIndex, sequenceAI)
CLEAR_SEQUENCE_TASK(sequenceAI)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sWillyPed.pedIndex, TRUE)
sWillyPed.iAiDelayTimer = GET_GAME_TIMER()
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_MUSICIAN_PED_AI ~~~ ", "N1A_PED_AI_SETUP_REACHED_PERIMETER - done") ENDIF #ENDIF
sWillyPed.AI = N1A_PED_AI_STATE_REACHED_PERIMETER
BREAK
CASE N1A_PED_AI_STATE_REACHED_PERIMETER
IF ePlayerInsideClubStatus = N1A_RCR_MAIN_ROOM
IF IS_ENTITY_IN_SPECIFIC_ROOM_INSIDE_MUSIC_CLUB_INTERIOR(sWillyPed.pedIndex, N1A_RCR_MAIN_ROOM, FALSE)
IF sWillyPed.iFrameCountLastSeenPlayer = GET_FRAME_COUNT()
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_MUSICIAN_PED_AI ~~~ ", "N1A_PED_AI_STATE_REACHED_PERIMETER - done") ENDIF #ENDIF
sWillyPed.AI = N1A_PED_AI_SETUP_MELEE_ATTACK
EXIT
ENDIF
ENDIF
ENDIF
IF NOT IsPedPerformingTask(sWillyPed.pedIndex, SCRIPT_TASK_PERFORM_SEQUENCE)
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_MUSICIAN_PED_AI ~~~ ", "N1A_PED_AI_STATE_REACHED_PERIMETER - reapply") ENDIF #ENDIF
sWillyPed.AI = N1A_PED_AI_SETUP_REACHED_PERIMETER
ELIF GET_SEQUENCE_PROGRESS(sWillyPed.pedIndex) >= 4 // final turn to task
IF HAS_TIME_PASSED(sWillyPed.iAiDelayTimer, GET_RANDOM_INT_IN_RANGE(4000, 8000))
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_MUSICIAN_PED_AI ~~~ ", "N1A_PED_AI_STATE_REACHED_PERIMETER - reapply") ENDIF #ENDIF
sWillyPed.AI = N1A_PED_AI_SETUP_REACHED_PERIMETER
ENDIF
ELSE
sWillyPed.iAiDelayTimer = GET_GAME_TIMER()
ENDIF
BREAK
CASE N1A_PED_AI_SETUP_OUT_OF_REACH
OPEN_SEQUENCE_TASK(sequenceAI)
INT iRandomAnimSelector
iRandomAnimSelector = GET_RANDOM_INT_IN_RANGE(0, 3)
TASK_TURN_PED_TO_FACE_ENTITY(NULL, PLAYER_PED_ID(), 0)
SWITCH iRandomAnimSelector
CASE 0
TASK_PLAY_ANIM(NULL, "rcmnigel1a", "threaten", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_UPPERBODY)
BREAK
CASE 1
TASK_PLAY_ANIM(NULL, "rcmnigel1a", "anger_a", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_UPPERBODY)
BREAK
CASE 2
TASK_PLAY_ANIM(NULL, "rcmnigel1a", "screw_you", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_UPPERBODY)
BREAK
ENDSWITCH
TASK_LOOK_AT_ENTITY(NULL, PLAYER_PED_ID(), GET_RANDOM_INT_IN_RANGE(1000, 2000))
TASK_TURN_PED_TO_FACE_ENTITY(NULL, PLAYER_PED_ID(), -1)
CLOSE_SEQUENCE_TASK(sequenceAI)
//this needs to go here other wise I recieve (i think)
//Error: [script] Verifyf(iSequenceTaskID==CTaskSequences::ms_iActiveSequence
//FAILED: SCRIPT: Script Name = Nigel1A : Program Counter = 19467: SET_SEQUENCE_TO_REPEAT - Using wrong sequence ID (from Updating script nigel1a)
// CLEAR_PED_TASKS_IMMEDIATELY(sWillyPed.pedIndex) //we do this because CLEAR_PED_TASKS doesn't always switch the task straight away, e.g. when brawling
TASK_PERFORM_SEQUENCE(sWillyPed.pedIndex, sequenceAI)
CLEAR_SEQUENCE_TASK(sequenceAI)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sWillyPed.pedIndex, TRUE)
sWillyPed.iAiDelayTimer = GET_GAME_TIMER()
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_MUSICIAN_PED_AI ~~~ ", "N1A_PED_AI_SETUP_OUT_OF_REACH - done") ENDIF #ENDIF
sWillyPed.AI = N1A_PED_AI_STATE_OUT_OF_REACH
BREAK
CASE N1A_PED_AI_STATE_OUT_OF_REACH
IF NOT IS_DIFFERENCE_IN_Z_COORDS_MORE_THAN_THRESHOLD(GET_ENTITY_COORDS(sWillyPed.pedIndex), vPlayerPos, Z_DIFFERENCE_COMBAT_TASK_STOPS_WORKING)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_MUSICIAN_PED_AI ~~~ ", "N1A_PED_AI_STATE_OUT_OF_REACH - done") ENDIF #ENDIF
sWillyPed.AI = N1A_PED_AI_SETUP_MELEE_ATTACK
ELSE
IF NOT IsPedPerformingTask(sWillyPed.pedIndex, SCRIPT_TASK_PERFORM_SEQUENCE)
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_MUSICIAN_PED_AI ~~~ ", "N1A_PED_AI_STATE_OUT_OF_REACH - reapply") ENDIF #ENDIF
sWillyPed.AI = N1A_PED_AI_SETUP_OUT_OF_REACH
ELIF GET_SEQUENCE_PROGRESS(sWillyPed.pedIndex) >= 3 // final turn to task
IF HAS_TIME_PASSED(sWillyPed.iAiDelayTimer, GET_RANDOM_INT_IN_RANGE(4000, 8000))
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_MUSICIAN_PED_AI ~~~ ", "N1A_PED_AI_STATE_OUT_OF_REACH - reapply") ENDIF #ENDIF
sWillyPed.AI = N1A_PED_AI_SETUP_OUT_OF_REACH
ENDIF
ELSE
sWillyPed.iAiDelayTimer = GET_GAME_TIMER()
ENDIF
ENDIF
BREAK
CASE N1A_PED_AI_SETUP_FLEE
IF HAS_Willy_AND_GROUPIE_FINISHED_EXIT_SYNCED_ANIM(TRUE)
SET_WILLY_AI_SETUP_FLEE_TASK() // had to put in proc so skip can call it too
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_MUSICIAN_PED_AI ~~~ ", "N1A_PED_AI_SETUP_FLEE") ENDIF #ENDIF
sWillyPed.AI = N1A_PED_AI_STATE_FLEE
ELSE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_MUSICIAN_PED_AI ~~~ ", "N1A_PED_AI_SETUP_FLEE waiting on exit sync anim") ENDIF #ENDIF
ENDIF
BREAK
CASE N1A_PED_AI_STATE_FLEE
SET_PED_MAX_MOVE_BLEND_RATIO(sWillyPed.pedIndex, PEDMOVEBLENDRATIO_RUN) // see B*1071719 - need to be called each frame otherwise it resets.
IF NOT IsPedPerformingTask(sWillyPed.pedIndex, SCRIPT_TASK_PERFORM_SEQUENCE)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_MUSICIAN_PED_AI ~~~ ", "N1A_PED_Ai_STATE_FLEE - going to N1A_PED_AI_SETUP_FLEE") ENDIF #ENDIF
sWillyPed.AI = N1A_PED_AI_SETUP_FLEE
ENDIF
BREAK
CASE N1A_PED_AI_SETUP_FLEE_TO_VEHICLE
SET_PED_FLEE_ATTRIBUTES(sWillyPed.pedIndex, FA_RETURN_TO_ORIGNAL_POSITION_AFTER_FLEE, FALSE)
SET_PED_FLEE_ATTRIBUTES(sWillyPed.pedIndex, FA_DISABLE_HANDS_UP, FALSE)
SET_PED_COMBAT_ATTRIBUTES(sWillyPed.pedIndex, CA_ALWAYS_FIGHT, FALSE)
SET_PED_FLEE_ATTRIBUTES(sWillyPed.pedIndex, FA_USE_VEHICLE, TRUE)
SET_PED_FLEE_ATTRIBUTES(sWillyPed.pedIndex, FA_PREFER_PAVEMENTS, FALSE)
SET_PED_FLEE_ATTRIBUTES(sWillyPed.pedIndex, FA_USE_COVER, FALSE)
SET_PED_FLEE_ATTRIBUTES(sWillyPed.pedIndex, FA_LOOK_FOR_CROWDS, FALSE)
// check Willy should still try to reach his car
IF IS_VEHICLE_OK(sMusicianVehicle.vehIndex) //if Musician vehicle is ok to use
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), sMusicianVehicle.vehIndex)
AND IS_ENTITY_IN_RANGE_COORDS(sMusicianVehicle.vehIndex, sMusicianVehicle.vPosition, 3.0) //if Musician vehicle pos hasn't changed much
AND IS_DIFFERENCE_IN_HEADINGS_LESS_THAN_OR_EQUAL_TO_THE_TOLERANCE(GET_ENTITY_HEADING(sMusicianVehicle.vehIndex), sMusicianVehicle.fHeading, 20.0) //if Musician vehicle heading hasn't changed much //if Player isn't already in the vehicle
IF IS_PED_IN_VEHICLE(sWillyPed.pedIndex, sMusicianVehicle.vehIndex) //if Musician isn't already in the vehicle
AND NOT IS_PED_BEING_JACKED(sWillyPed.pedIndex) //if Musician isn't being jacked.
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_MUSICIAN_PED_AI ~~~ ", "N1A_PED_AI_SETUP_TO_VEHICLE going to N1A_PED_AI_STATE_FLEE_TO_VEHICLE task skipped as in the vehicle") ENDIF #ENDIF
sWillyPed.AI = N1A_PED_AI_STATE_FLEE_TO_VEHICLE
ELSE
CLEAR_PED_TASKS(sWillyPed.pedIndex)
TASK_ENTER_VEHICLE(sWillyPed.pedIndex, sMusicianVehicle.vehIndex, 25000, VS_DRIVER, PEDMOVEBLENDRATIO_RUN) // increased DEFAULT_TIME_BEFORE_WARP since he has a fair way to run
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sWillyPed.pedIndex, TRUE)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_MUSICIAN_PED_AI ~~~ ", "N1A_PED_AI_SETUP_TO_VEHICLE going to N1A_PED_AI_STATE_FLEE_TO_VEHICLE") ENDIF #ENDIF
sWillyPed.AI = N1A_PED_AI_STATE_FLEE_TO_VEHICLE
ENDIF
ELSE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_MUSICIAN_PED_AI ~~~ ", "N1A_PED_AI_SETUP_TO_VEHICLE going to N1A_PED_AI_SETUP_FLEE") ENDIF #ENDIF
sWillyPed.AI = N1A_PED_AI_SETUP_FLEE
ENDIF
ELSE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_MUSICIAN_PED_AI ~~~ ", "N1A_PED_AI_SETUP_TO_VEHICLE going to N1A_PED_AI_SETUP_FLEE") ENDIF #ENDIF
sWillyPed.AI = N1A_PED_AI_SETUP_FLEE
ENDIF
BREAK
CASE N1A_PED_AI_STATE_FLEE_TO_VEHICLE
IF NOT IS_VEHICLE_OK(sMusicianVehicle.vehIndex)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_MUSICIAN_PED_AI ~~~ ", "N1A_PED_AI_STATE_TO_VEHICLE - going to N1A_PED_AI_SETUP_FLEE - car not ok") ENDIF #ENDIF
sWillyPed.AI = N1A_PED_AI_SETUP_FLEE
ELIF (IS_PED_IN_VEHICLE(PLAYER_PED_ID(), sMusicianVehicle.vehIndex)
OR IS_PED_BEING_JACKED(sWillyPed.pedIndex)
OR NOT IS_ENTITY_IN_RANGE_COORDS(sMusicianVehicle.vehIndex, sMusicianVehicle.vPosition, 3.0)
OR NOT IS_DIFFERENCE_IN_HEADINGS_LESS_THAN_OR_EQUAL_TO_THE_TOLERANCE(GET_ENTITY_HEADING(sMusicianVehicle.vehIndex), sMusicianVehicle.fHeading, 20.0))
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_MUSICIAN_PED_AI ~~~ ", "N1A_PED_AI_STATE_TO_VEHICLE - going to N1A_PED_AI_SETUP_FLEE - reason to abort") ENDIF #ENDIF
sWillyPed.AI = N1A_PED_AI_SETUP_FLEE
ELIF IS_PED_SITTING_IN_VEHICLE(sWillyPed.pedIndex, sMusicianVehicle.vehIndex)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_MUSICIAN_PED_AI ~~~ ", "N1A_PED_AI_STATE_TO_VEHICLE - going to N1A_PED_AI_SETUP_FLEE_IN_VEHICLE - reason to abort") ENDIF #ENDIF
sWillyPed.AI = N1A_PED_AI_SETUP_FLEE_IN_VEHICLE
ELSE
IF NOT IsPedPerformingTask(sWillyPed.pedIndex, SCRIPT_TASK_ENTER_VEHICLE)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_MUSICIAN_PED_AI ~~~ ", "N1A_PED_AI_STATE_TO_VEHICLE - going to N1A_PED_AI_SETUP_FLEE_TO_VEHICLE") ENDIF #ENDIF
sWillyPed.AI = N1A_PED_AI_SETUP_FLEE_TO_VEHICLE
ENDIF
ENDIF
BREAK
CASE N1A_PED_AI_SETUP_FLEE_IN_VEHICLE
IF IS_VEHICLE_OK(sMusicianVehicle.vehIndex) //if Musician vehicle is ok to use //if Player isn't already in the vehicle
AND IS_PED_SITTING_IN_VEHICLE(sWillyPed.pedIndex, sMusicianVehicle.vehIndex) //if Musician isn't already in the vehicle
CLEAR_PED_TASKS(sWillyPed.pedIndex)
OPEN_SEQUENCE_TASK(sequenceAI)
TASK_VEHICLE_DRIVE_TO_COORD(NULL, sMusicianVehicle.vehIndex, << -533.7831, 317.3689, 82.0616 >>, 60.0, DRIVINGSTYLE_ACCURATE, sMusicianVehicle.mnModel, DRIVINGMODE_AVOIDCARS_RECKLESS, 8.0, -1.0)
TASK_VEHICLE_MISSION_PED_TARGET(NULL, sMusicianVehicle.vehIndex, PLAYER_PED_ID(), MISSION_FLEE, 80.0, DRIVINGMODE_AVOIDCARS_RECKLESS, 500.0, -1.0)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_MUSICIAN_PED_AI ~~~ ", "N1A_PED_AI_SETUP_FLEE_IN_VEHICLE - Musician setup to flee in his car") ENDIF #ENDIF
CLOSE_SEQUENCE_TASK(sequenceAI)
TASK_PERFORM_SEQUENCE(sWillyPed.pedIndex, sequenceAI)
CLEAR_SEQUENCE_TASK(sequenceAI)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sWillyPed.pedIndex, TRUE)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_MUSICIAN_PED_AI ~~~ ", "N1A_PED_AI_SETUP_FLEE_IN_VEHICLE going to N1A_PED_AI_STATE_FLEE_IN_VEHICLE") ENDIF #ENDIF
sWillyPed.AI = N1A_PED_AI_STATE_FLEE_IN_VEHICLE
ELSE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_MUSICIAN_PED_AI ~~~ ", "N1A_PED_AI_SETUP_FLEE_IN_VEHICLE going to N1A_PED_AI_SETUP_FLEE") ENDIF #ENDIF
sWillyPed.AI = N1A_PED_AI_SETUP_FLEE
ENDIF
BREAK
CASE N1A_PED_AI_STATE_FLEE_IN_VEHICLE
IF NOT IsPedPerformingTask(sWillyPed.pedIndex, SCRIPT_TASK_PERFORM_SEQUENCE)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_MUSICIAN_PED_AI ~~~ ", "N1A_PED_AI_STATE_FLEE_IN_VEHICLE - going to N1A_PED_AI_SETUP_FLEE_IN_VEHICLE") ENDIF #ENDIF
sWillyPed.AI = N1A_PED_AI_SETUP_FLEE_IN_VEHICLE
ENDIF
BREAK
CASE N1A_PED_AI_SETUP_SURRENDERED
IF HAS_Willy_AND_GROUPIE_FINISHED_EXIT_SYNCED_ANIM(TRUE)
IF NOT IS_PED_RAGDOLL(sWillyPed.pedIndex)
AND NOT IS_PED_GETTING_UP(sWillyPed.pedIndex)
AND NOT IS_PED_BEING_STUNNED(sWillyPed.pedIndex)
IF IsPedPerformingTask(sWillyPed.pedIndex, SCRIPT_TASK_SYNCHRONIZED_SCENE)
STOP_SYNCHRONIZED_ENTITY_ANIM(sWillyPed.pedIndex, FAST_BLEND_OUT, TRUE)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_MUSICIAN_PED_AI ~~~ ", "N1A_PED_AI_SETUP_SURRENDERED - Musician sync scene stopped") ENDIF #ENDIF
ENDIF
SET_PED_COMBAT_ATTRIBUTES(sWillyPed.pedIndex, CA_ALWAYS_FIGHT, FALSE)
TASK_LOOK_AT_ENTITY(sWillyPed.pedIndex, PLAYER_PED_ID(), -1)
TASK_HANDS_UP(sWillyPed.pedIndex, -1, PLAYER_PED_ID(), -1)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sWillyPed.pedIndex, TRUE)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_MUSICIAN_PED_AI ~~~ ", "N1A_PED_AI_SETUP_SURRENDERED - done: framecount = ", GET_FRAME_COUNT()) ENDIF #ENDIF
IF IS_PED_IN_COMBAT(sWillyPed.pedIndex)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_MUSICIAN_PED_AI ~~~ ", "N1A_PED_AI_SETUP_SURRENDERED - musician in combat **: framecount = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
sWillyPed.AI = N1A_PED_AI_STATE_SURRENDERED
ENDIF
ELSE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_MUSICIAN_PED_AI ~~~ ", "N1A_PED_AI_SETUP_SURRENDERED - waiting on exit anim sync anim : framecount = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
BREAK
CASE N1A_PED_AI_STATE_SURRENDERED
IF NOT IsPedPerformingTask(sWillyPed.pedIndex, SCRIPT_TASK_HANDS_UP)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_MUSICIAN_PED_AI ~~~ ", "N1A_PED_AI_STATE_SURRENDERED - done : framecount = ", GET_FRAME_COUNT()) ENDIF #ENDIF
sWillyPed.AI = N1A_PED_AI_SETUP_SURRENDERED
ENDIF
IF IS_PED_IN_COMBAT(sWillyPed.pedIndex)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_MUSICIAN_PED_AI ~~~ ", "N1A_PED_AI_STATE_SURRENDERED - musician in combat **: framecount = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
BREAK
CASE N1A_PED_AI_SETUP_FRIGHTENED
CLEAR_PED_TASKS(sWillyPed.pedIndex)
SET_PED_COMBAT_ATTRIBUTES(sWillyPed.pedIndex, CA_ALWAYS_FIGHT, FALSE)
TASK_COWER(sWillyPed.pedIndex, -1)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sWillyPed.pedIndex, TRUE)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_MUSICIAN_PED_AI ~~~ ", "N1A_PED_AI_SETUP_FRIGHTENED done") ENDIF #ENDIF
sWillyPed.AI = N1A_PED_AI_STATE_FRIGHTENED
BREAK
CASE N1A_PED_AI_STATE_FRIGHTENED
IF NOT IS_PED_RAGDOLL(sWillyPed.pedIndex)
IF NOT IsPedPerformingTask(sWillyPed.pedIndex, SCRIPT_TASK_COWER)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_MUSICIAN_PED_AI ~~~ ", "N1A_PED_AI_STATE_FRIGHTENED done") ENDIF #ENDIF
sWillyPed.AI = N1A_PED_AI_SETUP_FRIGHTENED
ENDIF
ENDIF
BREAK
DEFAULT
SCRIPT_ASSERT("NIGEL1A - invalid N1A_PED_AI")
BREAK
ENDSWITCH
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Check if the specified peds is a club ped
/// PARAMS:
/// pedIndex - ped to test
/// RETURNS:
/// TRUE if pedIndex is a club ped - groupie or band
FUNC BOOL IS_PED_A_CLUB_PED(PED_INDEX &pedIndex)
INT i
FOR i = 0 TO (MAX_NUM_CLUB_PEDS - 1)
IF pedIndex = sClubPed[i].pedIndex
RETURN TRUE
ENDIF
ENDFOR
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Check the musician has seen the player attack a specific ped
/// PARAMS:
/// pedIndexVictim - ped to check for attacked
/// RETURNS:
/// true if musician saw player attack pedIndexVictim
FUNC BOOL HAS_MUSICIAN_SEEN_PLAYER_ATTACKED_SPECIFIC_PED(PED_INDEX pedIndexVictim)
IF HAS_PLAYER_DAMAGED_AT_LEAST_ONE_PED(PLAYER_ID())
INT i = 0
PED_INDEX mPed
IF Has_Ped_Been_Killed()
BOOL bMusicianSeenPlayerKillPed = FALSE
i = 0
REPEAT Get_Number_Of_Ped_Killed_Events() i
IF DOES_ENTITY_EXIST(Get_Index_Of_Killed_Ped(i))
mPed = GET_PED_INDEX_FROM_ENTITY_INDEX(Get_Index_Of_Killed_Ped(i))
IF mPed = pedIndexVictim
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, " HAS_MUSICIAN_SEEN_PLAYER_ATTACKED_SPECIFIC_PED - 0 : pedvictim is one of Get_Number_Of_Ped_Killed_Events") ENDIF #ENDIF
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(mPed, PLAYER_PED_ID())
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, " HAS_MUSICIAN_SEEN_PLAYER_ATTACKED_SPECIFIC_PED - 1 : pedvictim has been damaged by player") ENDIF #ENDIF
IF ePlayerInsideClubStatus = N1A_RCR_MAIN_ROOM
OR sWillyPed.iFrameCountLastSeenPlayer = GET_FRAME_COUNT()
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, " HAS_MUSICIAN_SEEN_PLAYER_ATTACKED_SPECIFIC_PED - 2 : ", "musician can see ped or player in main room ") ENDIF #ENDIF
bMusicianSeenPlayerKillPed = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDREPEAT
IF bMusicianSeenPlayerKillPed
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, " HAS_MUSICIAN_SEEN_PLAYER_ATTACKED_SPECIFIC_PED - 4 : killed ", " returning TRUE") ENDIF #ENDIF
CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_PED(PLAYER_ID())
RETURN TRUE
ENDIF
ENDIF
IF Has_Ped_Been_Injured()
BOOL bMusicianSeenPlayerInjurePed = FALSE
i = 0
REPEAT Get_Number_Of_Ped_Injured_Events() i
IF DOES_ENTITY_EXIST(Get_Index_Of_Injured_Ped(i))
mPed = GET_PED_INDEX_FROM_ENTITY_INDEX(Get_Index_Of_Injured_Ped(i))
IF mPed = pedIndexVictim
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, " HAS_MUSICIAN_SEEN_PLAYER_ATTACKED_SPECIFIC_PED - 5 : pedvictim is one of Has_Ped_Been_Injured - ") ENDIF #ENDIF
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(mPed, PLAYER_PED_ID())
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, " HAS_MUSICIAN_SEEN_PLAYER_ATTACKED_SPECIFIC_PED - 6 :, pedvictim has been damaged by player") ENDIF #ENDIF
IF ePlayerInsideClubStatus = N1A_RCR_MAIN_ROOM
OR sWillyPed.iFrameCountLastSeenPlayer = GET_FRAME_COUNT()
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, " HAS_MUSICIAN_SEEN_PLAYER_ATTACKED_SPECIFIC_PED - 7 : ", "musician can see ped or player in main room ") ENDIF #ENDIF
bMusicianSeenPlayerInjurePed = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDREPEAT
IF bMusicianSeenPlayerInjurePed
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, " HAS_MUSICIAN_SEEN_PLAYER_ATTACKED_SPECIFIC_PED - 8 : injured ", " returning TRUE") ENDIF #ENDIF
CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_PED(PLAYER_ID())
RETURN TRUE
ENDIF
ENDIF
CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_PED(PLAYER_ID())
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// update the ai of the specified club ped
/// PARAMS:
/// iClubPedID - the array index of the ped to update
PROC UPDATE_STANDARD_CLUB_PED_AI(INT iClubPedID)
IF IS_PED_UNINJURED(sClubPed[iClubPedID].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 (sClubPed[iClubPedID].AI)
CASE N1A_PED_AI_SETUP_RELAXED
BREAK
CASE N1A_PED_AI_STATE_RELAXED
IF HAS_TIME_PASSED(sClubPed[iClubPedID].iAiDelayTimer, GET_RANDOM_INT_IN_RANGE(0, 2500))
IF NOT IS_PED_CLOSE_TO_IDEAL_HEADING(sClubPed[iClubPedID].pedIndex, sClubPed[iClubPedID].fHeading, 30)
IF NOT IsPedPerformingTask(sClubPed[iClubPedID].pedIndex, SCRIPT_TASK_ACHIEVE_HEADING)
TASK_ACHIEVE_HEADING(sClubPed[iClubPedID].pedIndex, sClubPed[iClubPedID].fHeading)
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, " UPDATE_STANDARD_CLUB_PED_AI - N1A_PED_AI_STATE_RELAXED - ", " set TASK_ACHIEVE_HEADING ", " PED ID:", iClubPedID) ENDIF #ENDIF
ENDIF
ELSE
SWITCH iClubPedID
CASE CLUB_PED_GROUPIE_UPSTAIRS_02
IF NOT IS_PED_USING_SCENARIO(sClubPed[iClubPedID].pedIndex, "WORLD_HUMAN_STAND_IMPATIENT")
TASK_START_SCENARIO_IN_PLACE(sClubPed[iClubPedID].pedIndex, "WORLD_HUMAN_STAND_IMPATIENT", -1, FALSE)
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, " UPDATE_STANDARD_CLUB_PED_AI - N1A_PED_AI_STATE_RELAXED - ", " set use scenario WORLD_HUMAN_STAND_IMPATIENT", " PED ID:", iClubPedID) ENDIF #ENDIF
ENDIF
BREAK
CASE GROUPIE_WILLYS_PIECE
FALLTHRU
CASE CLUB_PED_ROADIE
FALLTHRU
CASE CLUB_PED_GROUPIE_UPSTAIRS_01
IF NOT IS_PED_USING_SCENARIO(sClubPed[iClubPedID].pedIndex, "WORLD_HUMAN_HANG_OUT_STREET")
TASK_START_SCENARIO_IN_PLACE(sClubPed[iClubPedID].pedIndex, "WORLD_HUMAN_HANG_OUT_STREET", -1, FALSE)
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, " UPDATE_STANDARD_CLUB_PED_AI - N1A_PED_AI_STATE_RELAXED - ", " set use scenario WORLD_HUMAN_HANG_OUT_STREET", " PED ID:", iClubPedID) ENDIF #ENDIF
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
IF IS_ENTITY_IN_RANGE_COORDS(sClubPed[iClubPedID].pedIndex, vPlayerPos, 7.0) // rougly width of the pavement
OR (GET_PED_INSIDE_MUSIC_CLUB_STATUS(sClubPed[iClubPedID].pedIndex, FALSE) = ePlayerInsideClubStatus) // if player is in the same room
//IF NOT IsPedPerformingTask(sClubPed[iClubPedID].pedIndex, SCRIPT_TASK_LOOK_AT_ENTITY) // this doesn't work as it's a secondary task
IF NOT IS_PED_HEADTRACKING_PED(sClubPed[iClubPedID].pedIndex, PLAYER_PED_ID())
TASK_LOOK_AT_ENTITY(sClubPed[iClubPedID].pedIndex, PLAYER_PED_ID(), -1)
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_STANDARD_CLUB_PED_AI - N1A_PED_AI_STATE_RELAXED - set look at player", " PED ID:", iClubPedID) ENDIF #ENDIF
ENDIF
ELSE
//IF IsPedPerformingTask(sClubPed[iClubPedID].pedIndex, SCRIPT_TASK_LOOK_AT_ENTITY) // this doesn't work as it's a secondary task
IF IS_PED_HEADTRACKING_PED(sClubPed[iClubPedID].pedIndex, PLAYER_PED_ID())
TASK_CLEAR_LOOK_AT(sClubPed[iClubPedID].pedIndex)
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_STANDARD_CLUB_PED_AI - N1A_PED_AI_STATE_RELAXED - Clear look at player", " PED ID:", iClubPedID) ENDIF #ENDIF
ENDIF
ENDIF
BREAK
CASE N1A_PED_AI_STATE_UNDER_SYNCED_SCENE_CONTROL
BREAK
CASE N1A_PED_AI_SETUP_AWARE_OF_PLAYER
IF HAS_TIME_PASSED(sClubPed[iClubPedID].iAiDelayTimer, GET_RANDOM_INT_IN_RANGE(0, 2000))
IF IS_PED_USING_ANY_SCENARIO(sClubPed[iClubPedID].pedIndex)
//CLEAR_PED_TASKS(sClubPed[iClubPedID].pedIndex)
SET_PED_SHOULD_PLAY_IMMEDIATE_SCENARIO_EXIT(sClubPed[iClubPedID].pedIndex)
ENDIF
// don't make all peds turn to the player - bug fix 1042210
SWITCH iClubPedID
CASE CLUB_PED_BAND_MANAGER
FALLTHRU
CASE CLUB_PED_GROUPIE_UPSTAIRS_02
TASK_LOOK_AT_ENTITY(sClubPed[iClubPedID].pedIndex, PLAYER_PED_ID(), -1)
BREAK
DEFAULT
TASK_LOOK_AT_ENTITY(sClubPed[iClubPedID].pedIndex, PLAYER_PED_ID(), -1)
TASK_TURN_PED_TO_FACE_ENTITY(sClubPed[iClubPedID].pedIndex, PLAYER_PED_ID(), -1)
BREAK
ENDSWITCH
sClubPed[iClubPedID].AI = N1A_PED_AI_STATE_AWARE_OF_PLAYER
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_STANDARD_CLUB_PED_AI - N1A_PED_AI_SETUP_AWARE_OF_PLAYER - set", " PED ID:", iClubPedID) ENDIF #ENDIF
ENDIF
BREAK
CASE N1A_PED_AI_STATE_AWARE_OF_PLAYER
// don't make all peds turn to the player - bug fix 1042210
SWITCH iClubPedID
CASE CLUB_PED_BAND_MANAGER
FALLTHRU
CASE CLUB_PED_GROUPIE_UPSTAIRS_02
IF NOT IsPedPerformingTask(sClubPed[iClubPedID].pedIndex, SCRIPT_TASK_LOOK_AT_ENTITY)
sClubPed[iClubPedID].iAiDelayTimer = (GET_GAME_TIMER() - 5000) // ensure a task reapply will go through first attempt
sClubPed[iClubPedID].AI = N1A_PED_AI_SETUP_AWARE_OF_PLAYER
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_STANDARD_CLUB_PED_AI - N1A_PED_AI_STATE_AWARE_OF_PLAYER - reapply", " PED ID:", iClubPedID) ENDIF #ENDIF
ENDIF
BREAK
DEFAULT
IF NOT IsPedPerformingTask(sClubPed[iClubPedID].pedIndex, SCRIPT_TASK_TURN_PED_TO_FACE_ENTITY)
sClubPed[iClubPedID].iAiDelayTimer = (GET_GAME_TIMER() - 5000) // ensure a task reapply will go through first attempt
sClubPed[iClubPedID].AI = N1A_PED_AI_SETUP_AWARE_OF_PLAYER
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_STANDARD_CLUB_PED_AI - N1A_PED_AI_STATE_AWARE_OF_PLAYER - reapply", " PED ID:", iClubPedID) ENDIF #ENDIF
ENDIF
BREAK
ENDSWITCH
BREAK
CASE N1A_PED_AI_SETUP_FLEE
INT IMinDelayTime, iMaxDelayTime
IMinDelayTime = 0
iMaxDelayTime = 1200
IF iClubPedID = GROUPIE_WILLYS_PIECE // make Willy's bird react quicker than the other groupies
// delay groupie fleeing whilst she plays here
IF NOT HAS_Willy_AND_GROUPIE_FINISHED_EXIT_SYNCED_ANIM(FALSE)
IMinDelayTime = 50000
iMaxDelayTime = 90000
sClubPed[iClubPedID].iAiDelayTimer = GET_GAME_TIMER()
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_STANDARD_CLUB_PED_AI - N1A_PED_AI_SETUP_FLEE - delay for sync anim Willy's piece ", " PED ID:", iClubPedID, " FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ELSE
iMaxDelayTime = 0
ENDIF
ENDIF
IF HAS_TIME_PASSED(sClubPed[iClubPedID].iAiDelayTimer, GET_RANDOM_INT_IN_RANGE(IMinDelayTime, iMaxDelayTime))
SET_PED_FLEE_ATTRIBUTES(sClubPed[iClubPedID].pedIndex, FA_RETURN_TO_ORIGNAL_POSITION_AFTER_FLEE, FALSE)
SET_PED_FLEE_ATTRIBUTES(sClubPed[iClubPedID].pedIndex, FA_DISABLE_HANDS_UP, FALSE)
SET_PED_FLEE_ATTRIBUTES(sClubPed[iClubPedID].pedIndex, FA_USE_VEHICLE, FALSE)
SET_PED_FLEE_ATTRIBUTES(sClubPed[iClubPedID].pedIndex, FA_PREFER_PAVEMENTS, TRUE)
SET_PED_FLEE_ATTRIBUTES(sClubPed[iClubPedID].pedIndex, FA_USE_COVER, FALSE)
SET_PED_FLEE_ATTRIBUTES(sClubPed[iClubPedID].pedIndex, FA_LOOK_FOR_CROWDS, FALSE)
SET_PED_FLEE_ATTRIBUTES(sClubPed[iClubPedID].pedIndex, FA_CAN_SCREAM, TRUE)
SET_PED_COMBAT_ATTRIBUTES(sClubPed[iClubPedID].pedIndex, CA_ALWAYS_FIGHT, FALSE)
SET_PED_COMBAT_ATTRIBUTES(sClubPed[iClubPedID].pedIndex, CA_ALWAYS_FLEE, TRUE)
IF iClubPedID != CLUB_PED_BAND_MANAGER // this guy has react dialogue so don't interrupt
STOP_PED_SPEAKING(sClubPed[iClubPedID].pedIndex, FALSE) //added to make them scream // hopefully?
ENDIF
IF HAS_CLUB_PED_FINISHED_SYNCED_SCENE_BREAK_OUT_ANIM(iClubPedID)
IF IS_PED_USING_ANY_SCENARIO(sClubPed[iClubPedID].pedIndex)
//CLEAR_PED_TASKS(sClubPed[iClubPedID].pedIndex)
SET_PED_PANIC_EXIT_SCENARIO(sClubPed[iClubPedID].pedIndex, vPlayerPos)
ENDIF
SWITCH iClubPedID
CASE CLUB_PED_BAND_MANAGER
//TASK_HANDS_UP(sClubPed[iClubPedID].pedIndex, -1, PLAYER_PED_ID(), -1)
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_STANDARD_CLUB_PED_AI - hands up - set", " PED ID:", iClubPedID) ENDIF #ENDIF
BREAK
CASE CLUB_PED_GROUPIE_UPSTAIRS_01
FALLTHRU
CASE CLUB_PED_GROUPIE_UPSTAIRS_02
//TASK_COWER(sClubPed[iClubPedID].pedIndex, -1)
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_STANDARD_CLUB_PED_AI - cower - set", " PED ID:", iClubPedID) ENDIF #ENDIF
BREAK
DEFAULT
//TASK_SMART_FLEE_PED(sClubPed[iClubPedID].pedIndex, PLAYER_PED_ID(), 150, -1)
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_STANDARD_CLUB_PED_AI - flee - set", " PED ID:", iClubPedID) ENDIF #ENDIF
BREAK
ENDSWITCH
TASK_SMART_FLEE_PED(sClubPed[iClubPedID].pedIndex, PLAYER_PED_ID(), 150, -1)
SET_PED_KEEP_TASK(sClubPed[iClubPedID].pedIndex, TRUE)
sClubPed[iClubPedID].AI = N1A_PED_AI_STATE_FLEE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_STANDARD_CLUB_PED_AI - N1A_PED_AI_SETUP_FLEE - set", " PED ID:", iClubPedID, " FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ELSE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_STANDARD_CLUB_PED_AI - N1A_PED_AI_SETUP_FLEE - waiting for reaction anim", " PED ID:", iClubPedID) ENDIF #ENDIF
ENDIF
ELSE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_STANDARD_CLUB_PED_AI - N1A_PED_AI_SETUP_FLEE - delaying flee this frame : ", GET_FRAME_COUNT(), " PED ID:", iClubPedID) ENDIF #ENDIF
ENDIF
BREAK
CASE N1A_PED_AI_STATE_FLEE
IF IS_PED_ACTIVE_IN_SCENARIO(sClubPed[iClubPedID].pedIndex)
OR NOT IsPedPerformingTask(sClubPed[iClubPedID].pedIndex, SCRIPT_TASK_SMART_FLEE_PED)
AND NOT IsPedPerformingTask(sClubPed[iClubPedID].pedIndex, SCRIPT_TASK_COWER)
AND NOT IsPedPerformingTask(sClubPed[iClubPedID].pedIndex, SCRIPT_TASK_HANDS_UP)
AND NOT IS_PED_FLEEING(sClubPed[iClubPedID].pedIndex)
sClubPed[iClubPedID].iAiDelayTimer = (GET_GAME_TIMER() - 5000) // ensure a task reapply will go through first attempt
sClubPed[iClubPedID].AI = N1A_PED_AI_SETUP_FLEE
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_STANDARD_CLUB_PED_AI - N1A_PED_AI_STATE_FLEE - reapply", " PED ID:", iClubPedID) ENDIF #ENDIF
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// kill's any ongoing ambient dialogue upstairs and stores the conversation progress so it can be retriggered
FUNC BOOL KILL_AND_STORE_CURRENT_AMBIENT_DIALOGUE_UPSTAIRS(BOOL bFinishCurrentLine = TRUE)
IF NOT bPausedDialogue_AmbientUpstairs
IF IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("NIG1A_BAN1", FALSE) //only the ambient upstairs dialogue
OR IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("NIG1A_BAN2", FALSE) //only the ambient upstairs dialogue
OR IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("NIG1A_BAN3", FALSE) //only the ambient upstairs dialogue
// 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 = GET_STANDARD_CONVERSATION_LABEL_FOR_FUTURE_RESUMPTION()
IF NOT IS_STRING_NULL_OR_EMPTY(tl23CurrentDialogueLine)
bPausedDialogue_AmbientUpstairs = TRUE
IF iCounter_AmbientDialogueUpstairs > 0
iCounter_AmbientDialogueUpstairs-- // ready to retrigger last dialogue
ENDIF
tlDialogueLinePaused_UpstairsAmbient = tl23CurrentDialogueLine
IF bFinishCurrentLine
KILL_FACE_TO_FACE_CONVERSATION()
ELSE
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDIF
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_CLUB_PEDS - Return TRUE killed ambient upstairs dialogue, finish current line : ",
bFinishCurrentLine, " line : ", tlDialogueLinePaused_UpstairsAmbient) ENDIF #ENDIF
RETURN TRUE
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// kill's any ongoing ambient dialogue upstairs
FUNC BOOL KILL_ANY_ONGOING_CURRENT_AMBIENT_DIALOGUE_UPSTAIRS(BOOL bFinishCurrentLine = TRUE)
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("NIG1A_BAN1", FALSE) //only the ambient upstairs dialogue
OR IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("NIG1A_BAN2", FALSE) //only the ambient upstairs dialogue
OR IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("NIG1A_BAN3", FALSE) //only the ambient upstairs dialogue
OR IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("NIG1A_IDLE1", FALSE) //only the ambient upstairs dialogue
IF bFinishCurrentLine
KILL_FACE_TO_FACE_CONVERSATION()
ELSE
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDIF
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "KILL_ANY_ONGOING_CURRENT_AMBIENT_DIALOGUE_UPSTAIRS - Return TRUE killed ambient upstairs dialogue") ENDIF #ENDIF
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// handles triggering ambient dialogue upstairs in the club between the band manager, roadie and groupies
/// PARAMS:
/// iTimer_DialogueTriggerDelay - timer used to delay the dialogue triggering
/// RETURNS:
/// TRUE if a dialogue exchange is triggered
FUNC BOOL TRIGGER_AMBIENT_DIALOGUE_UPSTAIRS(INT &iTimer_DialogueTriggerDelay)
N1A_CLUB_PED_ANIM_TYPE eClubPedAnims = N1A_CPAT_BASE_ANIM
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT bPausedDialogue_AmbientUpstairs // restart paused dialogue straight away
iTimer_DialogueTriggerDelay = GET_GAME_TIMER()
ENDIF
ELSE
INT iLocal_TotaldialogueEzchanges = 4
TEXT_LABEL_23 tlCurrentDialogueRoot = ""
IF iCounter_AmbientDialogueUpstairs < iLocal_TotaldialogueEzchanges
INT iTimeDelay_DialogueTrigger = GET_RANDOM_INT_IN_RANGE(1000, 2000)
// no delay for first dialogue exchange or if we are restarting an existing exchange
IF iCounter_AmbientDialogueUpstairs = 0
OR bPausedDialogue_AmbientUpstairs
iTimeDelay_DialogueTrigger = 100 // Bug fix - straight away causes isssues with security triggering it's dialogue since it gets called after this each from, so setup cancel occurs over and over
ENDIF
IF HAS_TIME_PASSED(iTimer_DialogueTriggerDelay, iTimeDelay_DialogueTrigger)
SWITCH iCounter_AmbientDialogueUpstairs
CASE 0
tlCurrentDialogueRoot = "NIG1A_BAN1" // Manager, roadie and groupies banter upstairs - 1
// I can't believe we're partying with Love Fist's manager. That's so cool.
// Some of the shit I've seen, love, it's unimaginable.
// If the Jezz and the guys weren't so into yoga and probiotics, we'd all be dead.
// I burned through the last of my dopamine in '08. The doctors say I'll probably never laugh again.
// That's so awesome.
eClubPedAnims = N1A_CPAT_IDLE_A_ANIM
BREAK
CASE 1
tlCurrentDialogueRoot = "NIG1A_BAN2" // Manager, roadie and groupies banter upstairs - 2
// I've been on the road with the Fist since 2003. I'm heavily involved in the creative.
// So they are working on new material?
// No, still doing covers of the eighties stuff.
// Clear The Custard is, like, my favorite album ever. When I tell my friends I'm hot for Love Fist they're all like ew,
// that's like making out with your grandfather, and I'm like yeah, if my grandfather, like, totally grew his hair and wore leather pants.
// I don't care what people say. Willy is still hot, even after the hip replacement.
eClubPedAnims = N1A_CPAT_IDLE_A_ANIM
BREAK
CASE 2
tlCurrentDialogueRoot = "NIG1A_BAN3" // Manager, roadie and groupies banter upstairs - 3
// Is it true that Willy wears women's knickers? Are they really all bisexual?
// We're British, love, we make up sexuality as we go along.
// Woah, I am majorly stoned. Like, seriously.
// You want level that out with some H? Or a line of K? Get you nice and fluffy.
// Until you've been in the K-hole, taking in the A-hole, you haven't lived.
// You guys are so funny!
eClubPedAnims = N1A_CPAT_IDLE_A_ANIM
BREAK
CASE 3
tlCurrentDialogueRoot = "NIG1A_IDLE1" // They run out of idle banter
// Everyone went so quiet!
// Just enjoy the high.
eClubPedAnims = N1A_CPAT_IDLE_B_ANIM
BREAK
ENDSWITCH
IF bPausedDialogue_AmbientUpstairs
IF NIG1A_CREATE_CONVERSATION_FROM_SPECIFIC_LINE_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sNigel1A_Dialogue_TextBlockName, tlCurrentDialogueRoot, tlDialogueLinePaused_UpstairsAmbient, CONV_PRIORITY_MEDIUM)
bPausedDialogue_AmbientUpstairs = FALSE
iTimer_DialogueTriggerDelay = GET_GAME_TIMER()
iCounter_AmbientDialogueUpstairs++
SET_CLUB_PEDS_UPSTAIRS_SYNCED_ANIM(eClubPedAnims)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "TRIGGER_AMBIENT_DIALOGUE_UPSTAIRS - restarted paused dialogue root : ", tlCurrentDialogueRoot, " : line : ", tlDialogueLinePaused_UpstairsAmbient) ENDIF #ENDIF
RETURN TRUE
ENDIF
ELSE
IF NIG1A_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sNigel1A_Dialogue_TextBlockName, tlCurrentDialogueRoot, CONV_PRIORITY_MEDIUM)
bPausedDialogue_AmbientUpstairs = FALSE
iTimer_DialogueTriggerDelay = GET_GAME_TIMER()
iCounter_AmbientDialogueUpstairs++
SET_CLUB_PEDS_UPSTAIRS_SYNCED_ANIM(eClubPedAnims)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "TRIGGER_AMBIENT_DIALOGUE_UPSTAIRS - triggered dialogue root : ", tlCurrentDialogueRoot) ENDIF #ENDIF
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
// set the base by default if it's not runnings
SET_CLUB_PEDS_UPSTAIRS_SYNCED_ANIM(N1A_CPAT_BASE_ANIM)
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// attempt to trigger a dialogue line for player bumping into a club peds
/// PARAMS:
/// iClubPedIndex - specific club ped
/// RETURNS:
/// TRUE if convo was successfully triggered
FUNC BOOL TRIGGER_PLAYER_BUMPED_DIALOGUE_FOR_CLUB_PEDS(INT iClubPedIndex)
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
STRING sNigel1a_Dialogue_BumpedRoot = "NULL"
SWITCH iClubPedIndex
CASE CLUB_PED_BAND_MANAGER
sNigel1a_Dialogue_BumpedRoot = "NIG1A_BUMPM"
// Hey, don't be a twat.
// Hey, no need, dude.
BREAK
CASE CLUB_PED_ROADIE
sNigel1a_Dialogue_BumpedRoot = "NIG1A_BUMPR"
// That's not cool.
// You're ruining the vibe, man.
BREAK
CASE CLUB_PED_GROUPIE_UPSTAIRS_01
sNigel1a_Dialogue_BumpedRoot = "NIG1A_BUMPG1"
// Trippy.
// You're weird.
BREAK
CASE CLUB_PED_GROUPIE_UPSTAIRS_02
sNigel1a_Dialogue_BumpedRoot = "NIG1A_BUMPG2"
// Personal space, man.
// Woah, take it easy.
BREAK
ENDSWITCH
IF NOT IS_STRING_NULL_OR_EMPTY(sNigel1a_Dialogue_BumpedRoot)
IF NIG1A_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sNigel1A_Dialogue_TextBlockName, sNigel1a_Dialogue_BumpedRoot, CONV_PRIORITY_MEDIUM, GET_SUBTITLES_STATE_FOR_NON_CLASH_WITH_MESSAGES())
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "TRIGGER_PLAYER_BUMPED_DIALOGUE_FOR_CLUB_PEDS - return TRUE : iClubPedIndex = ", iClubPedIndex) ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// controls club peds behaviour
PROC MANAGE_CLUB_PEDS()
INT i
FOR i = 0 TO (MAX_NUM_CLUB_PEDS - 1)
UPDATE_PEDS_CAN_SEE_PLAYER_FRAME_COUNTER(sClubPed[i].pedIndex, sClubPed[i].iFrameCountLastSeenPlayer)
ENDFOR
// Willy's bird only
IF sClubPed[GROUPIE_WILLYS_PIECE].AI < N1A_PED_AI_SETUP_FLEE
IF eMusicianState <> N1A_MUSICIAN_STATE_RELAXED
OR IS_PLAYER_INTIMIDATE_SPECIFIC_PED(sClubPed[GROUPIE_WILLYS_PIECE].pedIndex, sClubPed[GROUPIE_WILLYS_PIECE].iFrameCountLastSeenPlayer)
OR (ePlayerInsideClubStatus = N1A_RCR_MAIN_ROOM AND IS_PED_IN_COMBAT(PLAYER_PED_ID())) // additional checks to make her flee as soon as the player is fighting in the room
sClubPed[GROUPIE_WILLYS_PIECE].AI = N1A_PED_AI_SETUP_FLEE
MAKE_PED_SCREAM(sClubPed[GROUPIE_WILLYS_PIECE].pedIndex) // B*1516087 - make some peds scream
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_CLUB_PEDS - ped AI set to N1A_PED_AI_SETUP_FLEE : ", " PED ID:", GROUPIE_WILLYS_PIECE) ENDIF #ENDIF
ELIF bDoneDialogue_MusicianSpottedPlayer
// needs revising for sync scene stuff
//IF sClubPed[GROUPIE_WILLYS_PIECE].AI = N1A_PED_AI_STATE_RELAXED
// sClubPed[GROUPIE_WILLYS_PIECE].AI = N1A_PED_AI_SETUP_AWARE_OF_PLAYER
// #IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_CLUB_PEDS - ped AI set to N1A_PED_AI_SETUP_AWARE_OF_PLAYER : ", " PED ID:", GROUPIE_WILLYS_PIECE) ENDIF #ENDIF
//ENDIF
ENDIF
ENDIF
// reset of club peds who are in the room upstairs
IF NOT bHasPlayerScarredClubPedsUpstairs
IF ePlayerInsideClubStatus = N1A_RCR_ROOM_UPSTAIRS // if the player enters the room the peds are in.
FOR i = 0 TO (MAX_NUM_CLUB_PEDS - 1)
IF i <> GROUPIE_WILLYS_PIECE // don't do this for Willy's birb
IF IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("NIG1A_B1") //bDoneDialogue_BandSayWhereWillyIs
IF sClubPed[i].AI = N1A_PED_AI_STATE_RELAXED
sClubPed[i].iAiDelayTimer = GET_GAME_TIMER()
sClubPed[i].AI = N1A_PED_AI_SETUP_AWARE_OF_PLAYER
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_CLUB_PEDS - ped AI set to N1A_PED_AI_SETUP_AWARE_OF_PLAYER : ", " PED ID:", i) ENDIF #ENDIF
ENDIF
sClubPed[CLUB_PED_BAND_MANAGER].iTimer = GET_GAME_TIMER() // used to trigger ambient dialogue
ELSE
IF sClubPed[i].AI = N1A_PED_AI_SETUP_AWARE_OF_PLAYER
OR sClubPed[i].AI = N1A_PED_AI_STATE_AWARE_OF_PLAYER
sClubPed[i].iAiDelayTimer = GET_GAME_TIMER()
sClubPed[i].AI = N1A_PED_AI_STATE_RELAXED
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_CLUB_PEDS - ped AI set to N1A_MUSICIAN_STATE_RELAXED : ", " PED ID:", i) ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ENDFOR
IF NOT IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("NIG1A_B1") //bDoneDialogue_BandSayWhereWillyIs
TRIGGER_AMBIENT_DIALOGUE_UPSTAIRS(sClubPed[CLUB_PED_BAND_MANAGER].iTimer) // timer used to delay dialogue
ELSE
SET_CLUB_PEDS_UPSTAIRS_SYNCED_ANIM(N1A_CPAT_BASE_ANIM)
ENDIF
ELIF ePlayerInsideClubStatus = N1A_RCR_LANDING_UPSTAIRS // if the player is stood upstairs on the landing area
TRIGGER_AMBIENT_DIALOGUE_UPSTAIRS(sClubPed[CLUB_PED_BAND_MANAGER].iTimer) // timer used to delay dialogue
ELSE
KILL_AND_STORE_CURRENT_AMBIENT_DIALOGUE_UPSTAIRS()
ENDIF
/*IF ePlayerInsideClubStatus = N1A_RCR_ROOM_UPSTAIRS // added to the IS_PLAYER_INTIMIDATE_SPECIFIC_PED checks
IF IS_PED_PERFORMING_STEALTH_KILL(PLAYER_PED_ID())
OR IS_PED_IN_COMBAT(PLAYER_PED_ID()) // is player scrapping in the room)
bHasPlayerScarredClubPedsUpstairs = TRUE
KILL_ANY_ONGOING_CURRENT_AMBIENT_DIALOGUE_UPSTAIRS(FALSE)
sClubPed[i].iAiDelayTimer = 0 // ensure the ai will trigger straight away
sClubPed[i].AI = N1A_PED_AI_SETUP_FLEE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_CLUB_PEDS - combat or stealth kill - ped AI set to N1A_PED_AI_SETUP_FLEE : ", " PED ID:", i) ENDIF #ENDIF
ENDIF
ENDIF*/
FOR i = 0 TO (MAX_NUM_CLUB_PEDS - 1)
IF i <> GROUPIE_WILLYS_PIECE
IF sClubPed[i].AI <> N1A_PED_AI_SETUP_FLEE
AND sClubPed[i].AI <> N1A_PED_AI_STATE_FLEE
IF eMusicianState != N1A_MUSICIAN_STATE_RELAXED
bHasPlayerScarredClubPedsUpstairs = TRUE
KILL_ANY_ONGOING_CURRENT_AMBIENT_DIALOGUE_UPSTAIRS(FALSE)
sClubPed[i].iAiDelayTimer = GET_GAME_TIMER()
sClubPed[i].AI = N1A_PED_AI_SETUP_FLEE
MAKE_PED_SCREAM(sClubPed[i].pedIndex) // B*1516087 - make some peds scream
FORCE_PED_PANIC_WALLA() // B*1516087 - make some peds scream
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_CLUB_PEDS - Willy has kicked off - ped AI set to N1A_PED_AI_SETUP_FLEE : ", " PED ID:", i) ENDIF #ENDIF
ELIF IS_PLAYER_INTIMIDATE_SPECIFIC_PED(sClubPed[i].pedIndex, sClubPed[i].iFrameCountLastSeenPlayer, FALSE)
bHasPlayerScarredClubPedsUpstairs = TRUE
KILL_ANY_ONGOING_CURRENT_AMBIENT_DIALOGUE_UPSTAIRS(FALSE)
sClubPed[i].iAiDelayTimer = 0 // ensure the ai will trigger straight away
sClubPed[i].AI = N1A_PED_AI_SETUP_FLEE
MAKE_PED_SCREAM(sClubPed[i].pedIndex) // B*1516087 - make some peds scream
FORCE_PED_PANIC_WALLA() // B*1516087 - make some peds scream
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_CLUB_PEDS - intimidated - ped AI set to N1A_PED_AI_SETUP_FLEE : ", " PED ID:", i) ENDIF #ENDIF
ELIF ePlayerInsideClubStatus <> N1A_RCR_INVALID // need this check as player could probably shoot from outside the club and pass the bullet in area test
AND IS_ANYONE_SHOOTING_NEAR_PED(sClubPed[i].pedIndex)
KILL_ANY_ONGOING_CURRENT_AMBIENT_DIALOGUE_UPSTAIRS(FALSE)
bHasPlayerScarredClubPedsUpstairs = TRUE
sClubPed[i].iAiDelayTimer = 0 // ensure the ai will trigger straight away
sClubPed[i].AI = N1A_PED_AI_SETUP_FLEE
MAKE_PED_SCREAM(sClubPed[i].pedIndex) // B*1516087 - make some peds scream
FORCE_PED_PANIC_WALLA() // B*1516087 - make some peds scream
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_CLUB_PEDS - shot near - ped AI set to N1A_PED_AI_SETUP_FLEE : ", " PED ID:", i) ENDIF #ENDIF
ELIF (ePlayerInsideClubStatus = N1A_RCR_ROOM_UPSTAIRS AND IS_PED_IN_COMBAT(PLAYER_PED_ID())) // additional checks to make her flee as soon as the player is fighting in the room
OR IS_ENTITY_IN_SPECIFIC_ROOM_INSIDE_MUSIC_CLUB_INTERIOR(sWillyPed.pedIndex, N1A_RCR_ROOM_UPSTAIRS)
KILL_ANY_ONGOING_CURRENT_AMBIENT_DIALOGUE_UPSTAIRS(FALSE)
bHasPlayerScarredClubPedsUpstairs = TRUE
sClubPed[i].iAiDelayTimer = GET_GAME_TIMER()
sClubPed[i].AI = N1A_PED_AI_SETUP_FLEE
MAKE_PED_SCREAM(sClubPed[i].pedIndex) // B*1516087 - make some peds scream
FORCE_PED_PANIC_WALLA() // B*1516087 - make some peds scream
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_CLUB_PEDS - Willy, guard, or player fighting in room - ped AI set to N1A_PED_AI_SETUP_FLEE : ", " PED ID:", i) ENDIF #ENDIF
ENDIF
// trigger bumped dialogue if possible
IF IS_PLAYER_BUMPING_INTO_CLUB_PED(i)
KILL_ANY_ONGOING_CURRENT_AMBIENT_DIALOGUE_UPSTAIRS(FALSE)
TRIGGER_PLAYER_BUMPED_DIALOGUE_FOR_CLUB_PEDS(i)
SET_SPECIFIC_CLUB_PED_UPSTAIRS_BUMPED_ANIM(i)
bHasPlayerScarredClubPedsUpstairs = TRUE
sClubPed[i].iAiDelayTimer = 0 // ensure the ai will trigger straight away
sClubPed[i].AI = N1A_PED_AI_SETUP_FLEE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_CLUB_PEDS - intimidated - ped AI set to N1A_PED_AI_SETUP_FLEE : ", " PED ID:", i) ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ENDFOR
ELSE
// if the player has scarred the club peds upstairs make them all flee
FOR i = 0 TO (MAX_NUM_CLUB_PEDS - 1)
IF i != GROUPIE_WILLYS_PIECE
IF sClubPed[i].AI != N1A_PED_AI_SETUP_FLEE
AND sClubPed[i].AI != N1A_PED_AI_STATE_FLEE
sClubPed[i].iAiDelayTimer = GET_GAME_TIMER()
sClubPed[i].AI = N1A_PED_AI_SETUP_FLEE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_CLUB_PEDS - bHasPlayerScarredClubPedsUpstairs - ped FORCED AI set to N1A_PED_AI_SETUP_FLEE : ", " PED ID:", i) ENDIF #ENDIF
ENDIF
ENDIF
ENDFOR
// reaction dialogue from band manager - only play if player is in the room
IF NOT bDonedialogue_ClubPedsReactThreatened
KILL_ANY_ONGOING_CURRENT_AMBIENT_DIALOGUE_UPSTAIRS(FALSE)
IF IS_PED_UNINJURED(sClubPed[CLUB_PED_BAND_MANAGER].pedIndex)
IF IS_ENTITY_IN_RANGE_COORDS(sClubPed[CLUB_PED_BAND_MANAGER].pedIndex, vPlayerPos, 20.0)
TEXT_LABEL_23 tlTempReactDialogueRoot
IF IS_PLAYER_CURRENT_WEAPON_LETHAL()
// 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()))
// He's tooled up, look out!
tlTempReactDialogueRoot = "NIG1A_B2"
ELSE
// Shit! Security!
tlTempReactDialogueRoot = "NIG1A_B3"
ENDIF
IF ePlayerInsideClubStatus = N1A_RCR_ROOM_UPSTAIRS
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDIF
IF NIG1A_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sNigel1A_Dialogue_TextBlockName, tlTempReactDialogueRoot, CONV_PRIORITY_MEDIUM, GET_SUBTITLES_STATE_FOR_NON_CLASH_WITH_MESSAGES())
SET_AUDIO_FLAG("DisableAbortConversationForRagdoll", TRUE) // B*1516072 - allow convo during ragdoll
bDonedialogue_ClubPedsReactThreatened = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_CLUB_PEDS - done - bDonedialogue_ClubPedsReactThreatened root", tlTempReactDialogueRoot) ENDIF #ENDIF
ENDIF
ELIF ePlayerInsideClubStatus = N1A_RCR_LANDING_UPSTAIRS
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NIG1A_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sNigel1A_Dialogue_TextBlockName, tlTempReactDialogueRoot, CONV_PRIORITY_MEDIUM, GET_SUBTITLES_STATE_FOR_NON_CLASH_WITH_MESSAGES())
SET_AUDIO_FLAG("DisableAbortConversationForRagdoll", TRUE) // B*1516072 - allow convo during ragdoll
bDonedialogue_ClubPedsReactThreatened = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_CLUB_PEDS - done - bDonedialogue_ClubPedsReactThreatened root", tlTempReactDialogueRoot) ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
bDonedialogue_ClubPedsReactThreatened = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_CLUB_PEDS - bDonedialogue_ClubPedsReactThreatened skipped ped dead") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
//IF (GET_GAME_TIMER() - iUpdateClubPeds_ThisFrameCounter > 6)
UPDATE_STANDARD_CLUB_PED_AI(iClubPedID_ToUpdateThisFrameCounter)
//iUpdateClubPeds_ThisFrameCounter = GET_GAME_TIMER()
IF (iClubPedID_ToUpdateThisFrameCounter >= (MAX_NUM_CLUB_PEDS- 1))
iClubPedID_ToUpdateThisFrameCounter = 0
ELSE
iClubPedID_ToUpdateThisFrameCounter++
ENDIF
//ENDIF
ENDPROC
/// PURPOSE:
/// kill's any ongoing ambient dialogue upstairs
FUNC BOOL KILL_ANY_ONGOING_CURRENT_AMBIENT_DIALOGUE_WILLY(BOOL bFinishCurrentLine = TRUE)
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("NIG1A_WILL1", FALSE) //only the ambient dialogue between Willy and the groupie
OR IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("NIG1A_WILL2", FALSE) //only the ambient dialogue between Willy and the groupie
OR IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("NIG1A_WILL3", FALSE) //only the ambient dialogue between Willy and the groupie
OR IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("NIG1A_IDLE2", FALSE) //only the ambient dialogue between Willy and the groupie
IF bFinishCurrentLine
KILL_FACE_TO_FACE_CONVERSATION()
ELSE
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDIF
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "KILL_ANY_ONGOING_CURRENT_AMBIENT_DIALOGUE_Willy - Return TRUE killed ambient ialogue") ENDIF #ENDIF
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// handles triggering ambient dialogue between Willy and groupie in the main room
/// 4 different conversations to trigger...the can be restarted too
/// PARAMS:
/// iTimer_DialogueTriggerDelay - timer used to delay the dialogue triggering
/// RETURNS:
/// TRUE if a dialogue exchange is triggered
FUNC BOOL TRIGGER_WILLY_AND_GROUPIE_AMBIENT_DIALOGUE(INT &iTimer_DialogueTriggerDelay)
// B*1516098 - for some reason this dialogue is stubborn and doesn't stop when skipping, so making sure if won't trigger if skipping
IF bFinishedStageSkipping
N1A_Willy_GROUPIE_ANIM_TYPE eWillyGroupieSyncAnims = N1A_WGAT_BASE_2_ANIM // groupie has arms up
// B*1991867 - if we are leaving scene 3 need to use different base anim
IF iCounter_AmbientDialogueWillyGroupie = 3
eWillyGroupieSyncAnims = N1A_WGAT_BASE_ANIM // groupie has arms down
CPRINTLN(DEBUG_MISSION, "TRIGGER_WILLY_AND_GROUPIE_AMBIENT_DIALOGUE : set eWillyGroupieSyncAnims = N1A_WGAT_BASE_ANIM")
ENDIF
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT bPausedDialogue_AmbientWillyGroupie // restart paused dialogue straight away
iTimer_DialogueTriggerDelay = GET_GAME_TIMER()
// check for reason to pause the dialogue if the player leaves the area - could also be paused by other triggered dialogue
IF ePlayerInsideClubStatus != N1A_RCR_MAIN_ROOM
AND IS_ENTITY_OCCLUDED(sWillyPed.pedIndex)
IF KILL_AND_STORE_CURRENT_Willy_AND_GROUPIE_AMBIENT_DIALOGUE()
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "TRIGGER_WILLY_AND_GROUPIE_AMBIENT_DIALOGUE - killed dialogue as player not in room and Willy isn't on screen") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ELSE
IF ePlayerInsideClubStatus = N1A_RCR_MAIN_ROOM
INT iLocal_TotalDialogueExchanges = 4
TEXT_LABEL_23 tlCurrentDialogueRoot = ""
IF iCounter_AmbientDialogueWillyGroupie < iLocal_TotalDialogueExchanges
INT iTimeDelay_DialogueTrigger = GET_RANDOM_INT_IN_RANGE(1000, 2000)
// B*1991867 - bigger delay time needed between these convo blends
IF iCounter_AmbientDialogueWillyGroupie = 3
iTimeDelay_DialogueTrigger = 2500
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "TRIGGER_WILLY_AND_GROUPIE_AMBIENT_DIALOGUE - &&&&&&") ENDIF #ENDIF
ENDIF
// no delay for first dialogue exchange or if we are restarting an existing exchange
IF bPausedDialogue_AmbientWillyGroupie
iTimeDelay_DialogueTrigger = 100 // Bug fix - straight away causes isssues with security triggering it's dialogue since it gets called after this each from, so setup cancel occurs over and over
ENDIF
IF HAS_TIME_PASSED(iTimer_DialogueTriggerDelay, iTimeDelay_DialogueTrigger)
SWITCH iCounter_AmbientDialogueWillyGroupie
CASE 0
tlCurrentDialogueRoot = "NIG1A_WILL1" // Willy banters with a young groupie in the main room - v1
// I bet I could hit your G sharp every time.
// You guys were amazing tonight.
// Aye, I know.
// Chin Stainer is like my ultimate break-up song.
// Oh my God, that track is so layered.
// It's like a Renaissance painting... It's like underneath those knobs and titties it's real art, you know what I mean?
BREAK
CASE 1
tlCurrentDialogueRoot = "NIG1A_WILL2" // Willy banters with a young groupie in the main room - v2
// Have you got some any chewing gum or benzos?
// Oh, no I don't, I'm sorry. Have the others left already?
// Aye, they went back to hotel. Percy forgot to take his statins,
// and Jezz's prostate is giving him jip.
// Is it true that you guys trashed the suite?
// Nah, that's just a PR thing. I mean I still get wrecked every night, but it doesn't define me.
BREAK
CASE 2
tlCurrentDialogueRoot = "NIG1A_WILL3" // Willy banters with a young groupie in the main room - v3
// You know if these pants could talk, I'd have to kill them.
// I know every word to Dangerous Bastard.
// We did this one gig we did here in the eighties, so manycunts OD'd, they had to officially call it genocide.
// I wish I'd been born to see that.
// Wait. How old are you, sweetheart?
// I'm twenty. I mean, like, twenty two.
// Can't be too careful. So many celebs in Britain have been done for jailbait these days.
eWillyGroupieSyncAnims = N1A_WGAT_YOU_KNOW
BREAK
CASE 3
tlCurrentDialogueRoot = "NIG1A_IDLE2" // They run out of idle banter
// This is pure awkward. I've run out of things to say,
// normally the ladies are like gobbling by now.
// That's fine, I don't mind just watching you.
eWillyGroupieSyncAnims = N1A_WGAT_THIS_IS_AWKWARD
BREAK
ENDSWITCH
IF IS_PED_UNINJURED(sClubPed[GROUPIE_WILLYS_PIECE].pedIndex)
IF bPausedDialogue_AmbientWillyGroupie
IF NIG1A_CREATE_CONVERSATION_FROM_SPECIFIC_LINE_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sNigel1A_Dialogue_TextBlockName, tlCurrentDialogueRoot, tlDialogueLinePaused_WillyGroupieAmbient, CONV_PRIORITY_MEDIUM)
bPausedDialogue_AmbientWillyGroupie = FALSE
iTimer_DialogueTriggerDelay = GET_GAME_TIMER()
iCounter_AmbientDialogueWillyGroupie++
// trigger the sync anim to match
SET_WILLY_GROUPIE_SYNCED_ANIM(eWillyGroupieSyncAnims)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "TRIGGER_WILLY_AND_GROUPIE_AMBIENT_DIALOGUE - restarted paused dialogue root : ", tlCurrentDialogueRoot, " : line : ", tlDialogueLinePaused_WillyGroupieAmbient) ENDIF #ENDIF
RETURN TRUE
ENDIF
ELSE
IF NIG1A_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sNigel1A_Dialogue_TextBlockName, tlCurrentDialogueRoot, CONV_PRIORITY_MEDIUM)
bPausedDialogue_AmbientWillyGroupie = FALSE
iTimer_DialogueTriggerDelay = GET_GAME_TIMER()
SET_WILLY_GROUPIE_SYNCED_ANIM(eWillyGroupieSyncAnims)
iCounter_AmbientDialogueWillyGroupie++
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "TRIGGER_WILLY_AND_GROUPIE_AMBIENT_DIALOGUE - triggered dialogue root : ", tlCurrentDialogueRoot) ENDIF #ENDIF
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
// set the base by default if it's not runnings
SET_WILLY_GROUPIE_SYNCED_ANIM(eWillyGroupieSyncAnims)
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Manages the interaction with the musician
PROC MANAGE_WILLY()
IF IS_PED_UNINJURED(sWillyPed.pedIndex)
UPDATE_PEDS_CAN_SEE_PLAYER_FRAME_COUNTER(sWillyPed.pedIndex, sWillyPed.iFrameCountLastSeenPlayer)
SWITCH eMusicianState
CASE N1A_MUSICIAN_STATE_RELAXED
IF NOT bDoneDialogue_MusicianSpottedPlayer
TRIGGER_WILLY_AND_GROUPIE_AMBIENT_DIALOGUE(sWillyPed.iTimer)
IF ePlayerInsideClubStatus = N1A_RCR_MAIN_ROOM
IF IS_PED_UNINJURED(sWillyPed.pedIndex)
AND (VDIST(vPlayerPos, GET_ENTITY_COORDS(sWillyPed.pedIndex)) <= 5.5)
KILL_AND_STORE_CURRENT_Willy_AND_GROUPIE_AMBIENT_DIALOGUE(FALSE)
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDIF
//Restart the spotted on foot convo, if it was paused
IF bPausedDialogue_MusicianSpottedPlayer
IF IS_PLAYER_CURRENT_WEAPON_LETHAL() //when restarting the convo, if Trevor now has a leathal weapon and kick back out so the leathal weapon dialogue plays instead
AND NOT ARE_STRINGS_EQUAL(sNigel1A_DialogueRoot_MusicianSpotsTrevor, "NIG1A_MSP3") // trevor had leathal weapon when musician spotted him so don't start brawling whilst weapon out
bPausedDialogue_MusicianSpottedPlayer = FALSE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "RESTARTED ON FOOT DIALOGUE cancelled as player now has leathal weapon out **********") ENDIF #ENDIF
ELSE
IF NIG1A_CREATE_CONVERSATION_FROM_SPECIFIC_LINE_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sNigel1A_Dialogue_TextBlockName, sNigel1A_DialogueRoot_MusicianSpotsTrevor, tlPausedDialogue_MusicianSpottedPlayer, CONV_PRIORITY_MEDIUM)
bPausedDialogue_MusicianSpottedPlayer = FALSE
bDoneDialogue_MusicianSpottedPlayer = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "RESTARTED ON FOOT DIALOGUE **********") ENDIF #ENDIF
ENDIF
ENDIF
ELSE
IF IS_PLAYER_CURRENT_WEAPON_LETHAL()
IF NIG1A_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sNigel1A_Dialogue_TextBlockName, "NIG1A_MSP3", CONV_PRIORITY_MEDIUM) //)
// Don't come near me with that, you prick!
// Is that any way to speak to your biggest fan? Smile, Willy.
sNigel1A_DialogueRoot_MusicianSpotsTrevor = "NIG1A_MSP3" // used when choosing which dialogue to restart
bDoneDialogue_MusicianSpottedPlayer = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CREATED ON FOOT DIALOGUE - TREVOR WITH LEATHAL WEAPON **********") ENDIF #ENDIF
ENDIF
ELSE
IF NIG1A_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sNigel1A_Dialogue_TextBlockName, "NIG1A_MSP1", CONV_PRIORITY_MEDIUM)
// Hey, no photographs mate, alright.
// That's okay, I want something more personal.
// Piss off, you twat, before I boot your balls.
REPLAY_RECORD_BACK_FOR_TIME(2.0, 4.5, REPLAY_IMPORTANCE_LOWEST)
sNigel1A_DialogueRoot_MusicianSpotsTrevor = "NIG1A_MSP1" // used when choosing which dialogue to restart
bDoneDialogue_MusicianSpottedPlayer = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "CREATED ON FOOT DIALOGUE -TREVOR WITH NON LEATHAL WEAPON **********") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
//pause the conversation if the player leaves the area so we can resume when he returns
IF IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING(sNigel1A_DialogueRoot_MusicianSpotsTrevor) //only restart on foot dialogue
IF ePlayerInsideClubStatus != N1A_RCR_MAIN_ROOM
// 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)
bPausedDialogue_MusicianSpottedPlayer = TRUE
bDoneDialogue_MusicianSpottedPlayer = FALSE
tlPausedDialogue_MusicianSpottedPlayer = tl23CurrentDialogueLine
KILL_FACE_TO_FACE_CONVERSATION()
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STORED ON FOOT DIALOGUE FOR RESUME **********") ENDIF #ENDIF
ENDIF
ENDIF
ELSE
// resume if player leaves the area
//IF ePlayerInsideClubStatus != N1A_RCR_MAIN_ROOM
// TRIGGER_WILLY_AND_GROUPIE_AMBIENT_DIALOGUE(sWillyPed.iTimer)
//ENDIF
ENDIF
ENDIF
// delay Willy attacking if cause for reaction isn't directly attacking him (B*1072081 - delay Willy till groupie is clear)
bHasWillySeenPlayerAttackHisGroupie = HAS_MUSICIAN_SEEN_PLAYER_ATTACKED_SPECIFIC_PED(sClubPed[GROUPIE_WILLYS_PIECE].pedIndex)
IF bHasWillySeenPlayerAttackHisGroupie
OR HAS_PLAYER_STARTED_FIGHT_WITH_SPECIFIC_PED(sWillyPed.pedIndex, sWillyPed.iFrameCountLastSeenPlayer)
OR (ePlayerInsideClubStatus = N1A_RCR_MAIN_ROOM AND IS_PED_IN_COMBAT(PLAYER_PED_ID())) // additional checks to make her fight if player is scrapping close by
sWillyPed.iAiDelayTimer = GET_GAME_TIMER()
sWillyPed.AI = N1A_PED_AI_SETUP_MELEE_ATTACK
sWillyPed.iTimer = GET_GAME_TIMER()
IF NOT bHasPlayerDamagedMusician // used to trigger specific dialogue were Willy calls out to security
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(sWillyPed.pedIndex, PLAYER_PED_ID())
bHasPlayerDamagedMusician = TRUE
bDoneDialogue_MusicianStartBrawl = TRUE // if player has damaged Willy skip over the initial dialogue exchange, so he call for security straight away
sWillyPed.iAiDelayTimer = (GET_GAME_TIMER() - 1000) // no delay if attack Willy directly
sWillyPed.iTimer = (GET_GAME_TIMER() - 1000) // no delay if attack Willy directly
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "bHasPlayerDamagedMusician set TRUE") ENDIF #ENDIF
ENDIF
ENDIF
KILL_ANY_ONGOING_CURRENT_AMBIENT_DIALOGUE_Willy(FALSE)
IF IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING(sNigel1A_DialogueRoot_MusicianSpotsTrevor) //only restart on foot dialogue
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDIF
INFORM_MISSION_STATS_OF_DAMAGE_WATCH_ENTITY(PLAYER_PED_ID()) // begin tracking the player's damage during the brawl with Willy
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE MUSICIAN - INFORM_MISSION_STATS_OF_DAMAGE_WATCH_ENTITY(PLAYER_PED_ID())") ENDIF #ENDIF
eMusicianState = N1A_MUSICIAN_STATE_BRAWLING
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "N1A_MUSICIAN_STATE_BRAWLING from N1A_MUSICIAN_STATE_RELAXED because player threaten Willy, attakced bird, is in combat in the room or the guard in the room has kicked off") ENDIF #ENDIF
ENDIF
IF IS_PLAYER_USING_WEAPON_TO_INTIMIDATE_SPECIFIC_PED(sWillyPed.pedIndex, sWillyPed.iFrameCountLastSeenPlayer, TRUE, 10.0) // overriding the dection dist so he doesn't spot player on the stairs with a gun
OR ePlayerInsideClubStatus <> N1A_RCR_INVALID // need this check as player could probably shoot from outside the club and pass the bullet in area test
AND IS_ANYONE_SHOOTING_NEAR_PED(sWillyPed.pedIndex)
sWillyPed.AI = N1A_PED_AI_SETUP_SURRENDERED
sWillyPed.iAiDelayTimer = GET_GAME_TIMER()
sWillyPed.iTimer = GET_GAME_TIMER()
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "Player Intimidated Musician, IS_PLAYER_INTIMIDATING_SPECIFIC_PED() returned true") ENDIF #ENDIF
//Used to detect player hurting him at this point
IF IS_PED_UNINJURED(sWillyPed.pedIndex)
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(sWillyPed.pedIndex)
CLEAR_PED_LAST_WEAPON_DAMAGE(sWillyPed.pedIndex)
CLEAR_PED_LAST_DAMAGE_BONE(sWillyPed.pedIndex)
ENDIF
KILL_ANY_ONGOING_CURRENT_AMBIENT_DIALOGUE_Willy(FALSE)
IF IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING(sNigel1A_DialogueRoot_MusicianSpotsTrevor) //only restart on foot dialogue
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDIF
eMusicianState = N1A_MUSICIAN_STATE_SURRENDERED
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE MUSICIAN - N1A_MUSICIAN_STATE_SURRENDERED from N1A_MUSICIAN_STATE_BRAWLING because player intimidated ped") ENDIF #ENDIF
ENDIF
BREAK
CASE N1A_MUSICIAN_STATE_BRAWLING
IF NOT bHasPlayerDamagedMusician // used to trigger specific dialogue were Willy calls out to security
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(sWillyPed.pedIndex, PLAYER_PED_ID())
bHasPlayerDamagedMusician = TRUE
bDoneDialogue_MusicianStartBrawl = TRUE // if player has damaged Willy skip over the initial dialogue exchange, so he call for security straight away
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "bHasPlayerDamagedMusician set TRUE") ENDIF #ENDIF
ENDIF
ENDIF
IF NOT bDoneDialogue_MusicianStartBrawl
//IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
// KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
//ENDIF
KILL_ANY_ONGOING_CURRENT_AMBIENT_DIALOGUE_Willy(FALSE)
IF NOT IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("NIG1A_SD3") // You fucking prick. Come here.
AND NOT IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("NIG1A_SD5") // Hey, hey! Intruder!
IF HAS_TIME_PASSED(sWillyPed.iTimer, 500)
AND sWillyPed.AI = N1A_PED_AI_STATE_MELEE_ATTACK
// only say it when he can see the player
IF NOT HAS_FRAME_COUNTER_PASSED(sWillyPed.iFrameCountLastSeenPlayer, CAN_PED_SEE_PED_FRAME_COUNT_GRACE_PERIOD) // test ped has seen the player in the last 10 frames
IF NIG1A_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sNigel1A_Dialogue_TextBlockName, "NIG1A_MSP4", CONV_PRIORITY_MEDIUM, GET_SUBTITLES_STATE_FOR_NON_CLASH_WITH_MESSAGES())
// You want a go, do you?!
SET_AUDIO_FLAG("DisableAbortConversationForRagdoll", TRUE) // B*1516072 - allow convo during ragdoll
bDoneDialogue_MusicianStartBrawl = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "N1A_MUSICIAN_STATE_BRAWLING done bDoneDialogue_MusicianStartBrawl trevor brawl dialogue") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
IF NOT bDoneDialogue_MusicianShoutSecurity
IF bHasPlayerDamagedMusician
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDIF
KILL_ANY_ONGOING_CURRENT_AMBIENT_DIALOGUE_Willy(FALSE)
IF NIG1A_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sNigel1A_Dialogue_TextBlockName, "NIG1A_M1", CONV_PRIORITY_MEDIUM, GET_SUBTITLES_STATE_FOR_NON_CLASH_WITH_MESSAGES())
// Security! Where's security!?
SET_AUDIO_FLAG("DisableAbortConversationForRagdoll", TRUE) // B*1516072 - allow convo during ragdoll
bDoneDialogue_MusicianShoutSecurity = TRUE
ENDIF
ENDIF
ENDIF
// Additional dialogue during the brawl
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
sWillyPed.iTimer = GET_GAME_TIMER()
ELSE
IF HAS_TIME_PASSED(sWillyPed.iTimer, (TIME_DELAY_FOR_NEXT_RANDOM_DIALOGUE_LINE + GET_RANDOM_INT_IN_RANGE(0, 1000)))
IF sWillyPed.AI = N1A_PED_AI_SETUP_MELEE_ATTACK
OR sWillyPed.AI = N1A_PED_AI_STATE_MELEE_ATTACK
IF IS_ENTITY_IN_RANGE_COORDS(sWillyPed.pedIndex, vPlayerPos, 8.0)
IF NOT bDoneDialogue_PlayerReturnsTofightMusician
IF iDialogueCounter_PlayerReturnedMusicianInBrawl < TOTAL_PLAYER_RETURNED_MUSICIAN_BRAWL_DIALOGUE
IF NIG1A_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sNigel1A_Dialogue_TextBlockName, "NIG1A_MP3", CONV_PRIORITY_MEDIUM, GET_SUBTITLES_STATE_FOR_NON_CLASH_WITH_MESSAGES()) // )
// Are you back for your Glasgow kiss?
// I've about enough of you.
// You must be a glutton for punishment.
iDialogueCounter_PlayerReturnedMusicianInBrawl++
sWillyPed.iTimer = GET_GAME_TIMER()
bDoneDialogue_PlayerReturnsTofightMusician = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "N1A_MUSICIAN_STATE_BRAWLING done dialogue - player returns to brawl") ENDIF #ENDIF
ENDIF
ELSE
bDoneDialogue_PlayerReturnsTofightMusician = TRUE
ENDIF
ELSE
// longer wait time for the random brawl lines
IF HAS_TIME_PASSED(sWillyPed.iTimer, (TIME_DELAY_FOR_NEXT_RANDOM_DIALOGUE_LINE + GET_RANDOM_INT_IN_RANGE(15000, 5000)))
IF NIG1A_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sNigel1A_Dialogue_TextBlockName, "NIG1A_BRAWL", CONV_PRIORITY_MEDIUM, GET_SUBTITLES_STATE_FOR_NON_CLASH_WITH_MESSAGES()) // )
// You think you're hard, do you?
// Come on, then!
// Have a go!
// I'll do you in!
// You fucking prick!
// You look like you escaped from the loony bin!
// You don't know the half of me!
// I grew up on a council estate!
// I'll cave your heed in!
sWillyPed.iTimer = GET_GAME_TIMER()
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "N1A_MUSICIAN_STATE_BRAWLING done dialogue - brawling") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF sWillyPed.AI = N1A_PED_AI_SETUP_REACHED_PERIMETER
OR sWillyPed.AI = N1A_PED_AI_STATE_REACHED_PERIMETER
OR (ePlayerInsideClubStatus = N1A_RCR_INVALID
AND NOT IS_ENTITY_IN_RANGE_COORDS(sWillyPed.pedIndex, vPlayerPos, 12.0)) // if player is running away
IF iDialogueCounter_PlayerLeftMusicianInBrawl < TOTAL_PLAYER_LEFT_MUSICIAN_BRAWL_DIALOGUE
IF IS_ENTITY_IN_RANGE_COORDS(sWillyPed.pedIndex, vPlayerPos, 50.0) //don't do the dialogue if Trevor is far away.
IF NIG1A_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sNigel1A_Dialogue_TextBlockName, "NIG1A_MP1", CONV_PRIORITY_MEDIUM, GET_SUBTITLES_STATE_FOR_NON_CLASH_WITH_MESSAGES()) //)
// That's right, run away, you pussy!
// See if you can find your bollocks on the way out!
// See, you mess with Willie, you get fucked!
iDialogueCounter_PlayerLeftMusicianInBrawl++
sWillyPed.iTimer = GET_GAME_TIMER()
bDoneDialogue_PlayerReturnsTofightMusician = FALSE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "N1A_MUSICIAN_STATE_BRAWLING done dialogue - player left area") ENDIF #ENDIF
ENDIF
ENDIF
ELSE
bDoneDialogue_PlayerReturnsTofightMusician = FALSE
ENDIF
ELIF sWillyPed.AI = N1A_PED_AI_SETUP_OUT_OF_REACH
OR sWillyPed.AI = N1A_PED_AI_STATE_OUT_OF_REACH
IF iDialogueCounter_PlayerOutOfReachMusicianInBrawl < TOTAL_PLAYER_OUT_OF_REACH_MUSICIAN_BRAWL_DIALOGUE
IF NIG1A_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sNigel1A_Dialogue_TextBlockName, "NIG1A_MP2", CONV_PRIORITY_MEDIUM, GET_SUBTITLES_STATE_FOR_NON_CLASH_WITH_MESSAGES()) //)
// Come here and fight like a man.
// What are you hiding over there for?
// Let's go, you pansy! I'm right here!
iDialogueCounter_PlayerOutOfReachMusicianInBrawl++
sWillyPed.iTimer = GET_GAME_TIMER()
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "N1A_MUSICIAN_STATE_BRAWLING done dialogue - player out of reach") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF HAS_PLAYER_BEATEN_UP_SPECIFIC_PED(sWillyPed.pedIndex, TRUE)
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "TOOTH IS TO BE KNOCKED OUT - PLAYER BEAT UP THE MUSICIAN") ENDIF #ENDIF
sWillyPed.AI = N1A_PED_AI_SETUP_MUSICIAN_BEATEN_UP
// temp health boost until his tooth gets knocked out
IF (GET_ENTITY_HEALTH(sWillyPed.pedIndex) < 180.0)
SET_ENTITY_HEALTH(sWillyPed.pedIndex, 180)
CPRINTLN(DEBUG_MISSION, "MANAGE MUSICIAN: player beat up Willy - give temp health boost to 180 for ragdoll and tooth knockout +-+-")
ENDIF
iTimer_BackupKnockOutToothTrigger = GET_GAME_TIMER() //used for knock out tooth backup if IS_PED_RAGOLL keeps returning true for too long
sWillyPed.iTimer = GET_GAME_TIMER()
INFORM_MISSION_STATS_OF_DAMAGE_WATCH_ENTITY(NULL) // end tracking the player's damage
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE MUSICIAN - INFORM_MISSION_STATS_OF_DAMAGE_WATCH_ENTITY(NULL)") ENDIF #ENDIF
eMusicianState = N1A_MUSICIAN_STATE_KNOCKED_DOWN
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE MUSICIAN - N1A_MUSICIAN_STATE_KNOCKED_DOWN from N1A_MUSICIAN_STATE_BRAWLING because player BEAT UP MUSICIAN") ENDIF #ENDIF
ENDIF
ENDIF
IF IS_PLAYER_USING_WEAPON_TO_INTIMIDATE_SPECIFIC_PED(sWillyPed.pedIndex, sWillyPed.iFrameCountLastSeenPlayer, TRUE)
OR ePlayerInsideClubStatus <> N1A_RCR_INVALID // need this check as player could probably shoot from outside the club and pass the bullet in area test
AND IS_ANYONE_SHOOTING_NEAR_PED(sWillyPed.pedIndex)
sWillyPed.AI = N1A_PED_AI_SETUP_SURRENDERED
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "Player Intimidated Musician, IS_PLAYER_INTIMIDATING_SPECIFIC_PED() returned true") ENDIF #ENDIF
//Used to detect player hurting him at this point
IF IS_PED_UNINJURED(sWillyPed.pedIndex)
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(sWillyPed.pedIndex)
CLEAR_PED_LAST_WEAPON_DAMAGE(sWillyPed.pedIndex)
CLEAR_PED_LAST_DAMAGE_BONE(sWillyPed.pedIndex)
ENDIF
INFORM_MISSION_STATS_OF_DAMAGE_WATCH_ENTITY(NULL) // end tracking the player's damage
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE MUSICIAN - INFORM_MISSION_STATS_OF_DAMAGE_WATCH_ENTITY(NULL)") ENDIF #ENDIF
eMusicianState = N1A_MUSICIAN_STATE_SURRENDERED
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE MUSICIAN - N1A_MUSICIAN_STATE_SURRENDERED from N1A_MUSICIAN_STATE_BRAWLING because player intimidated ped") ENDIF #ENDIF
ENDIF
BREAK
CASE N1A_MUSICIAN_STATE_SURRENDERED
IF NOT bDoneDialogue_MusicianSurrendered
IF IS_ENTITY_IN_RANGE_COORDS(sWillyPed.pedIndex, vPlayerPos, 15.0)
IF NOT IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("NIG1A_SD7") // "Fuck, it's not worth this. Call the Police."
AND NOT IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("NIG1A_MSP3") // Willy spot player with weapon dialogue
// wait until he can see the player
IF NOT HAS_FRAME_COUNTER_PASSED(sWillyPed.iFrameCountLastSeenPlayer, CAN_PED_SEE_PED_FRAME_COUNT_GRACE_PERIOD) // test ped has seen the player in the last 10 frames
IF NIG1A_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sNigel1A_Dialogue_TextBlockName, "NIG1A_MSU2", CONV_PRIORITY_MEDIUM, GET_SUBTITLES_STATE_FOR_NON_CLASH_WITH_MESSAGES())
// Okay, okay, calm the fuck down! Just tell me what you want.
SET_AUDIO_FLAG("DisableAbortConversationForRagdoll", TRUE) // B*1516072 - allow convo during ragdoll
sWillyPed.iTimer = GET_GAME_TIMER()
bDoneDialogue_MusicianSurrendered = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE MUSICIAN - bDoneDialogue_MusicianSurrendered - done") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
// make Willy flee as part of bug 1050128 - imran request, not hooked up yet as its hard to hit him if he's fleeing
IF sWillyPed.AI = N1A_PED_AI_SETUP_SURRENDERED
OR sWillyPed.AI = N1A_PED_AI_STATE_SURRENDERED
IF IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("NIG1A_MSU2") // // Oh no don't hurt me, don't hurt me! What do you want?
sWillyPed.iTimer = GET_GAME_TIMER()
ELIF HAS_TIME_PASSED(sWillyPed.iTimer, 3500)
IF sWillyPed.AI = N1A_PED_AI_STATE_SURRENDERED // ensures exit sync anim can playout
sWillyPed.AI = N1A_PED_AI_SETUP_FLEE // new make him flee shortly after surrender
ENDIF
ENDIF
ELIF sWillyPed.AI = N1A_PED_AI_SETUP_FLEE
OR sWillyPed.AI = N1A_PED_AI_STATE_FLEE
//additional flee dialogue
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
sWillyPed.iTimer = GET_GAME_TIMER()
ELSE
IF HAS_TIME_PASSED(sWillyPed.iTimer, (TIME_DELAY_FOR_NEXT_RANDOM_DIALOGUE_LINE + GET_RANDOM_INT_IN_RANGE(0, 2500)))
IF IS_ENTITY_IN_RANGE_COORDS(sWillyPed.pedIndex, vPlayerPos, 25.0)
// B*1354912 - Willy shouted from outside interior - allow dialogue if both are outside interior or both in the same room in the interior
IF NOT IS_ENTITY_INSIDE_MUSIC_CLUB_INTERIOR(sWillyPed.pedIndex)
AND ePlayerInsideClubStatus = N1A_RCR_INVALID
OR IS_ENTITY_IN_SPECIFIC_ROOM_INSIDE_MUSIC_CLUB_INTERIOR(sWillyPed.pedIndex, ePlayerInsideClubStatus)
IF NIG1A_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sNigel1A_Dialogue_TextBlockName, "NIG1A_FLEE", CONV_PRIORITY_MEDIUM)
// You stay the hell away from me!
// Somebody stop that nutter!
// He's trying to kill me! I'm a musical icon!
// I bet Crow doesn't have to deal with this shit!
sWillyPed.iTimer = GET_GAME_TIMER()
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE MUSICIAN - N1A_MUSICIAN_STATE_SURRENDERED - done random flee dialogue : NIG1A_FLEE") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
//MANAGE_ADDITIONAL_SURRENDERED_DIALOGUE()
ENDIF
IF bPlayerUsedWeaponToDamageWilly
IF NOT bDoneDialogue_MusicianShotAtByPlayer
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NIG1A_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sNigel1A_Dialogue_TextBlockName, "NIG1A_MCSG", CONV_PRIORITY_MEDIUM, GET_SUBTITLES_STATE_FOR_NON_CLASH_WITH_MESSAGES())
// Argh! Fuck me, that hurts!
SET_AUDIO_FLAG("DisableAbortConversationForRagdoll", TRUE) // B*1516072 - allow convo during ragdoll
bDoneDialogue_MusicianShotAtByPlayer = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE MUSICIAN - bDoneDialogue_MusicianShotAtByPlayer - done") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF IS_PED_UNINJURED(sWillyPed.pedIndex)
AND HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(sWillyPed.pedIndex, PLAYER_PED_ID())
IF HAS_PED_BEEN_DAMAGED_BY_WEAPON(sWillyPed.pedIndex, WEAPONTYPE_INVALID, GENERALWEAPON_TYPE_ANYWEAPON)
IF HAS_PED_BEEN_DAMAGED_BY_WEAPON(sWillyPed.pedIndex, WEAPONTYPE_UNARMED)
OR HAS_PED_BEEN_DAMAGED_BY_WEAPON(sWillyPed.pedIndex, WEAPONTYPE_INVALID, GENERALWEAPON_TYPE_ANYMELEE)
OR HAS_PED_BEEN_DAMAGED_BY_WEAPON(sWillyPed.pedIndex, WEAPONTYPE_STUNGUN)
sWillyPed.AI = N1A_PED_AI_SETUP_MUSICIAN_BEATEN_UP
iTimer_BackupKnockOutToothTrigger = GET_GAME_TIMER() //used for knock out tooth backup if IS_PED_RAGOLL keeps returning true for too long
eMusicianState = N1A_MUSICIAN_STATE_KNOCKED_DOWN
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE MUSICIAN - N1A_MUSICIAN_STATE_KNOCKED_DOWN from N1A_MUSICIAN_STATE_SURRENDERED because player standard damaged musician") ENDIF #ENDIF
ELSE
IF NOT IS_PED_BEING_STUNNED(sWillyPed.pedIndex) // don't do this whilst he's currently taking damage from being stunned.
// if the player shoots Willy with a leath weapon in a critical area, kill him
IF IS_PLAYER_CURRENT_WEAPON_LETHAL(TRUE, FALSE, FALSE)
PED_BONETAG tempBoneTag
IF GET_PED_LAST_DAMAGE_BONE(sWillyPed.pedIndex, tempBoneTag)
SWITCH tempBoneTag
CASE BONETAG_PELVIS
FALLTHRU
CASE BONETAG_SPINE
FALLTHRU
CASE BONETAG_SPINE1
FALLTHRU
CASE BONETAG_SPINE2
FALLTHRU
CASE BONETAG_SPINE3
FALLTHRU
CASE BONETAG_NECK
FALLTHRU
CASE BONETAG_HEAD
SET_ENTITY_HEALTH(sWillyPed.pedIndex, 0)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MUSICIAN KILLED - player shot vital area") ENDIF #ENDIF
BREAK
DEFAULT
BREAK
ENDSWITCH
ENDIF
ENDIF
ENDIF
bPlayerUsedWeaponToDamageWilly = TRUE // used to trigger additional dialogue
sWillyPed.AI = N1A_PED_AI_SETUP_MUSICIAN_BEATEN_UP
iTimer_BackupKnockOutToothTrigger = GET_GAME_TIMER() //used for knock out tooth backup if IS_PED_RAGOLL keeps returning true for too long
eMusicianState = N1A_MUSICIAN_STATE_KNOCKED_DOWN
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE MUSICIAN - N1A_MUSICIAN_STATE_KNOCKED_DOWN from N1A_MUSICIAN_STATE_SURRENDERED because player weapon damaged musician") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
// if he ragdolls from player running him over trigger the tooth knockout
IF HAS_PLAYER_IN_VEHICLE_POTENTIALLY_JUST_RUN_OVER_PED(sWillyPed.pedIndex, vPlayerPos)
sWillyPed.AI = N1A_PED_AI_SETUP_MUSICIAN_BEATEN_UP
iTimer_BackupKnockOutToothTrigger = GET_GAME_TIMER() //used for knock out tooth backup if IS_PED_RAGOLL keeps returning true for too long
eMusicianState = N1A_MUSICIAN_STATE_KNOCKED_DOWN
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE MUSICIAN - N1A_MUSICIAN_STATE_KNOCKED_DOWN from N1A_MUSICIAN_STATE_SURRENDERED because player ran over musician") ENDIF #ENDIF
ENDIF
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(sWillyPed.pedIndex)
CLEAR_PED_LAST_WEAPON_DAMAGE(sWillyPed.pedIndex)
IF NOT bShouldPlayerGetWantedLevelForWeaponInClub
// player should only get a wanted level if he was inside the club
IF ePlayerInsideClubStatus != N1A_RCR_INVALID
IF iTimer_PlayerReceivesScriptedWantedLevel = 0
iTimer_PlayerReceivesScriptedWantedLevel = GET_GAME_TIMER() // used to give the player a scripted wanted level if is using a weapon in the club
ENDIF
bShouldPlayerGetWantedLevelForWeaponInClub = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE MUSICIAN bShouldPlayerGetWantedLevelForWeaponInClub = TRUE") ENDIF #ENDIF
ENDIF
ENDIF
BREAK
CASE N1A_MUSICIAN_STATE_KNOCKED_DOWN
IF NOT bDoneDialogue_MusicianKnockedDown
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDIF
KILL_ANY_ONGOING_CURRENT_AMBIENT_DIALOGUE_WILLY(FALSE)
IF bPlayerUsedWeaponToDamageWilly
IF NIG1A_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sNigel1A_Dialogue_TextBlockName, "NIG1A_MCSG", CONV_PRIORITY_MEDIUM, GET_SUBTITLES_STATE_FOR_NON_CLASH_WITH_MESSAGES())
// Argh! Fuck me, that hurts!
SET_AUDIO_FLAG("DisableAbortConversationForRagdoll", TRUE) // B*1516072 - allow convo during ragdoll
bDoneDialogue_MusicianKnockedDown = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE MUSICIAN - bDoneDialogue_MusicianKnockedDown - done weapon damaged line NIG1A_MCSG") ENDIF #ENDIF
ENDIF
ELSE
IF NIG1A_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sNigel1A_Dialogue_TextBlockName, "NIG1A_MKD", CONV_PRIORITY_MEDIUM, GET_SUBTITLES_STATE_FOR_NON_CLASH_WITH_MESSAGES())
// Argh!
SET_AUDIO_FLAG("DisableAbortConversationForRagdoll", TRUE) // B*1516072 - allow convo during ragdoll
bDoneDialogue_MusicianKnockedDown = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE MUSICIAN - bDoneDialogue_MusicianKnockedDown - done standard damaged line NIG1A_MCSG") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
//wait for Musician to stop falling before delay for the tooth getting knocked out
IF NOT IS_PED_RAGDOLL(sWillyPed.pedIndex)
OR HAS_TIME_PASSED(iTimer_BackupKnockOutToothTrigger, 2000) //backup timer to knock the tooth out if ragdoll isn't ending quick enough
SET_PED_CAN_RAGDOLL_FROM_PLAYER_IMPACT(sWillyPed.pedIndex, FALSE)
eMusicianState = N1A_MUSICIAN_STATE_TOOTH_KNOCKED_OUT
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE MUSICIAN - N1A_MUSICIAN_STATE_TOOTH_KNOCKED_OUT from N1A_MUSICIAN_STATE_KNOCKED_DOWN because ragdoll ended or times out") ENDIF #ENDIF
ENDIF
BREAK
CASE N1A_MUSICIAN_STATE_TOOTH_KNOCKED_OUT
BREAK
CASE N1A_MUSICIAN_STATE_FLEE
//additional flee dialogue
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
sWillyPed.iTimer = GET_GAME_TIMER()
ELSE
IF HAS_TIME_PASSED(sWillyPed.iTimer, (TIME_DELAY_FOR_NEXT_RANDOM_DIALOGUE_LINE + GET_RANDOM_INT_IN_RANGE(0, 2500)))
IF IS_ENTITY_IN_RANGE_COORDS(sWillyPed.pedIndex, vPlayerPos, 25.0)
// B*1354912 - Willy shouted from outside interior - allow dialogue if both are outside interior or both in the same room in the interior
IF NOT IS_ENTITY_INSIDE_MUSIC_CLUB_INTERIOR(sWillyPed.pedIndex)
AND ePlayerInsideClubStatus = N1A_RCR_INVALID
OR IS_ENTITY_IN_SPECIFIC_ROOM_INSIDE_MUSIC_CLUB_INTERIOR(sWillyPed.pedIndex, ePlayerInsideClubStatus)
IF NIG1A_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sNigel1A_Dialogue_TextBlockName, "NIG1A_FLEE", CONV_PRIORITY_MEDIUM, GET_SUBTITLES_STATE_FOR_NON_CLASH_WITH_MESSAGES())
// You stay the hell away from me!
// Somebody stop that nutter!
// He's trying to kill me! I'm a musical icon!
// I bet Crow doesn't have to deal with this shit!
sWillyPed.iTimer = GET_GAME_TIMER()
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE MUSICIAN - N1A_MUSICIAN_STATE_FLEE - done random flee dialogue : NIG1A_FLEE") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
UPDATE_MUSICIAN_PED_AI()
ELSE
IF eMusicianState <> N1A_MUSICIAN_STATE_DEAD
IF NOT IS_BIT_SET(g_savedGlobals.sRandomChars.g_iWebsiteQueryBit, ENUM_TO_INT(RC_NWS_NGLA_KILLED_WILLIE))
SET_BIT(g_savedGlobals.sRandomChars.g_iWebsiteQueryBit, ENUM_TO_INT(RC_NWS_NGLA_KILLED_WILLIE))
CPRINTLN(DEBUG_INTERNET, GET_THIS_SCRIPT_NAME(), " g_savedGlobals.sRandomChars.g_iWebsiteQueryBit, ENUM_TO_INT(RC_NWS_NGLA_KILLED_WILLIE) set")
ENDIF
eMusicianState = N1A_MUSICIAN_STATE_DEAD
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE MUSICIAN - eMusicianState = N1A_MUSICIAN_STATE_DEAD") ENDIF #ENDIF
ENDIF
IF NOT bDoneDialogue_TrevorKilledWilly
IF DOES_ENTITY_EXIST(sWillyPed.pedIndex)
VECTOR vDeadPos = GET_ENTITY_COORDS(sWillyPed.pedIndex, FALSE)
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF IS_ENTITY_IN_RANGE_COORDS(PLAYER_PED_ID(), vDeadPos, 15.0) // only play if player was close to the body
IF NIG1A_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sNigel1A_Dialogue_TextBlockName, "NIG1A_TC3", CONV_PRIORITY_MEDIUM, GET_SUBTITLES_STATE_FOR_NON_CLASH_WITH_MESSAGES()) //)
// Oops, sorry Love Fist fans.
bDoneDialogue_TrevorKilledWilly = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE MUSICIAN - bDoneDialogue_TrevorKilledWilly - TRUE", "***") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Used by checkpoints, Z skip, P skip and J skip to setup a skip to a certain stage in the mission.
PROC SKIP_STAGE()
IF IS_PED_UNINJURED(PLAYER_PED_ID())
KILL_ANY_CONVERSATION()
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDIF
CLEAR_PRINTS()
SWITCH eMissionStage
CASE MISSION_STAGE_ENTER_THE_MUSIC_CLUB
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.
IF NOT IS_REPLAY_BEING_SET_UP()
SAFE_TELEPORT_PED(PLAYER_PED_ID(), <<-563.0730, 292.5788, 86.5763>>, 79.2186)
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_FIND_CELEB
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
WAIT_FOR_WORLD_TO_LOAD(GET_ENTITY_COORDS(PLAYER_PED_ID()), 25.0, FLAG_COLLISIONS_MOVER | FLAG_MAPDATA)
bLoadedWorldForStageSkipping = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SKIP_STAGE : ", "MISSION_STAGE_ENTER_THE_MUSIC_CLUB : ", "LOADED WORLD", " FC : ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
eSubStage = SS_CLEANUP
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SKIP_STAGE : ", "MISSION_STAGE_ENTER_THE_MUSIC_CLUB : ", " FC : ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_FIND_CELEB
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.
IF NOT IS_REPLAY_BEING_SET_UP()
SAFE_TELEPORT_PED(PLAYER_PED_ID(), <<-556.3416, 283.2208, 81.1763>>, 328.4892, FALSE, TRUE)
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_KNOCK_OUT_TOOTH
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
WAIT_FOR_WORLD_TO_LOAD(GET_ENTITY_COORDS(PLAYER_PED_ID()), 25.0, FLAG_COLLISIONS_MOVER | FLAG_MAPDATA)
bLoadedWorldForStageSkipping = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SKIP_STAGE : ", "MISSION_STAGE_FIND_CELEB : ", "LOADED WORLD", " FC : ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
RESET_MISSION_PED_TIMERS()
eSubStage = SS_CLEANUP
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SKIP_STAGE : ", "MISSION_STAGE_FIND_CELEB : ", " FC : ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_KNOCK_OUT_TOOTH
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.
// stay where they were if he wasn't beaten up already
IF NOT IS_REPLAY_BEING_SET_UP()
IF sWillyPed.AI < N1A_PED_AI_STATE_MUSICIAN_BEATEN_UP
SAFE_TELEPORT_PED(PLAYER_PED_ID(), <<-554.1479, 287.9976, 81.1763>>, 152.3380, FALSE, TRUE)
ENDIF
// load world if target stage is the next one
IF bLoadedWorldForStageSkipping = FALSE
IF eMissionSkipTargetStage = MISSION_STAGE_COLLECT_TOOTH
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_FIND_CELEB : ", "LOADED WORLD", " FC : ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
bSetExitSceneForWillyAndGroupie = TRUE // B*1516098 skip the sync scene exit anim!
IF IS_PED_UNINJURED(sClubPed[GROUPIE_WILLYS_PIECE].pedIndex)
// having issues with it not stopping instantly, so added this extra clear
IF IsPedPerformingTask(sClubPed[GROUPIE_WILLYS_PIECE].pedIndex, SCRIPT_TASK_SYNCHRONIZED_SCENE)
STOP_SYNCHRONIZED_ENTITY_ANIM(sClubPed[GROUPIE_WILLYS_PIECE].pedIndex, INSTANT_BLEND_OUT, TRUE)
ENDIF
FREEZE_ENTITY_POSITION(sClubPed[GROUPIE_WILLYS_PIECE].pedIndex, FALSE)
CLEAR_PED_TASKS_IMMEDIATELY(sClubPed[GROUPIE_WILLYS_PIECE].pedIndex)
SAFE_SET_ENTITY_HEADING_FACE_ENTITY(sClubPed[GROUPIE_WILLYS_PIECE].pedIndex, PLAYER_PED_ID())
sClubPed[GROUPIE_WILLYS_PIECE].AI = N1A_PED_AI_SETUP_FLEE
ENDIF
IF IS_PED_UNINJURED(sWillyPed.pedIndex)
FREEZE_ENTITY_POSITION(sWillyPed.pedIndex, FALSE)
// having issues with it not stopping instantly, so added this extra clear
IF IsPedPerformingTask(sWillyPed.pedIndex, SCRIPT_TASK_SYNCHRONIZED_SCENE)
STOP_SYNCHRONIZED_ENTITY_ANIM(sWillyPed.pedIndex, INSTANT_BLEND_OUT, TRUE)
ENDIF
CLEAR_PED_TASKS_IMMEDIATELY(sWillyPed.pedIndex)
SAFE_TELEPORT_PED(sWillyPed.pedIndex, <<-554.01, 286.01, 81.1762>>, 27.18, FALSE, FALSE)
SAFE_SET_ENTITY_HEADING_FACE_ENTITY(sWillyPed.pedIndex, PLAYER_PED_ID())
SET_PED_CAN_RAGDOLL(sWillyPed.pedIndex, TRUE)
IF (GET_ENTITY_HEALTH(sWillyPed.pedIndex) >= 137.5) // fatigued threshold used to be 165
SET_ENTITY_HEALTH(sWillyPed.pedIndex, 135)
CPRINTLN(DEBUG_MISSION, "SKIP_STAGE : ", " set Willy health 135 +-+-")
ENDIF
ENDIF
IF NOT IS_REPLAY_BEING_SET_UP()
SAFE_SET_ENTITY_HEADING_FACE_ENTITY(PLAYER_PED_ID(), sWillyPed.pedIndex)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0)
ENDIF
bDoneDialogue_MusicianStartBrawl = TRUE
sWillyPed.AI = N1A_PED_AI_SETUP_MUSICIAN_TOOTH_KNOCKED_OUT_ANIMS
eMusicianState = N1A_MUSICIAN_STATE_TOOTH_KNOCKED_OUT
RESET_MISSION_PED_TIMERS()
eSubStage = SS_CLEANUP
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SKIP_STAGE : ", "MISSION_STAGE_KNOCK_OUT_TOOTH : ", " FC : ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_COLLECT_TOOTH
IF eSubStage = SS_UPDATE //in script skips where we change the eSubStage, need to safe gaurd that the SS_SETUP has already had chance to run.
IF NOT IS_REPLAY_BEING_SET_UP()
IF DOES_PICKUP_EXIST(mpToothPickup.index)
IF DOES_PICKUP_OBJECT_EXIST(mpToothPickup.index)
VECTOR vTempWarpPos
FLOAT fTempHeading
vTempWarpPos = GET_PICKUP_COORDS(mpToothPickup.index)
vTempWarpPos.z += 1.5 // add leeway on this Z, since GET_GROUND_Z_FOR_3D_COORD get's the lowest ground point below the value.
IF GET_GROUND_Z_FOR_3D_COORD(vTempWarpPos, vTempWarpPos.z)
vTempWarpPos.z += 0.25 // add a bit extra to help to the player falling through the floor
//IF eMissionSkipTargetStage = MISSION_STAGE_LEAVE_THE_AREA // if the target stage is the next stage load the scene otherwise don't bother
// WAIT_FOR_WORLD_TO_LOAD(vTempWarpPos, 25.0)
//ENDIF
//SET_ENTITY_LOAD_COLLISION_FLAG(PLAYER_PED_ID(), TRUE)
//SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(PLAYER_PED_ID(), TRUE)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SKIP_STAGE : ", "MISSION_STAGE_COLLECT_TOOTH : ", " player warp pos set to : ", vTempWarpPos, " FC : ", GET_FRAME_COUNT()) ENDIF #ENDIF
fTempHeading = GET_ENTITY_HEADING(PLAYER_PED_ID())
SAFE_TELEPORT_PED(PLAYER_PED_ID(), vTempWarpPos, fTempHeading, FALSE, FALSE)
SAFE_SET_ENTITY_HEADING_FACE_ENTITY(PLAYER_PED_ID(), sWillyPed.pedIndex)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0)
WAIT(0) //used to stop player seeing stuff snap into position
ELSE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SKIP_STAGE : ", "MISSION_STAGE_COLLECT_TOOTH : ", "aiting for ground z for warp pos", " FC : ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
SAFE_REMOVE_PICKUP(mpToothPickup.index)
IF NOT IS_REPLAY_BEING_SET_UP()
// load world if target stage is the next one
IF bLoadedWorldForStageSkipping = FALSE
IF eMissionSkipTargetStage = MISSION_STAGE_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_COLLECT_TOOTH : ", "LOADED WORLD", " FC : ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
INT i
FOR i = 0 TO MAX_NUM_CLUB_PEDS - 1
SAFE_REMOVE_PED(sClubPed[i].pedIndex, TRUE) // get rid of peds to help Willy pathing out club quickly
ENDFOR
IF sWillyPed.AI != N1A_PED_AI_STATE_FLEE
SET_WILLY_AI_SETUP_FLEE_TASK() // had to put in proc so skip can call it too
sWillyPed.AI = N1A_PED_AI_STATE_FLEE // just flee straight away: sWillyPed.AI = N1A_PED_AI_STATE_MUSICIAN_FINISHED_TOOTH_OUT_ANIMS
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "UPDATE_MUSICIAN_PED_AI ~~~ ", "N1A_PED_AI_SETUP_FLEE by skip stage") ENDIF #ENDIF
ENDIF
eMusicianState = N1A_MUSICIAN_STATE_FLEE // just flee straight away: eMusicianState = N1A_MUSICIAN_STATE_TOOTH_KNOCKED_OUT
RESET_MISSION_PED_TIMERS()
eSubStage = SS_CLEANUP // jump straight to clean up from here, since the position i teleport the player at the tooth could be too far away to register after I've updated the x to ensure the player doesn't drop through the floor
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SKIP_STAGE : ", "MISSION_STAGE_COLLECT_TOOTH : ", " FC : ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
BREAK
CASE MISSION_STAGE_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.
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)
// load world if target stage is the next one
IF bLoadedWorldForStageSkipping = FALSE
IF eMissionSkipTargetStage = MISSION_STAGE_OUTRO_PHONECALL
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_LEAVE_THE_AREA : ", "LOADED WORLD", " FC : ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
RESET_MISSION_PED_TIMERS()
WAIT(0)
eSubStage = SS_CLEANUP
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "SKIP_STAGE : ", "MISSION_STAGE_LEAVE_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()
KILL_PHONE_CONVERSATION()
KILL_ANY_CONVERSATION()
#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 jump to
PROC JUMP_TO_STAGE(MISSION_STAGE eNewStage)
IF eMissionStage = eNewStage // end skip stage
IF IS_REPLAY_BEING_SET_UP()
END_REPLAY_SETUP(NULL, VS_DRIVER, FALSE)
ENDIF
IF eMissionStage = MISSION_STAGE_LEAVE_THE_AREA // additional setup which must come after END_REPLAY_SETUP()
WAIT(500) // B*1544280 - delay for Willy slow flee task start
RESET_MISSION_PED_TIMERS()
iTimer_PlayerReceivesScriptedWantedLevel = (GET_GAME_TIMER() - (NIG1A_TIME_DELAY_WANTED_FOR_WILLY_ASSAULT - 1000)) // B*1553964 - ensure player gets wanted rating straight away
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)
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) //put player near start location facing towards club
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0)
ENDIF
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
ENDIF
/*//set the initial scene back up
eInitialSceneStage = IS_REQUEST_SCENE
WHILE NOT SetupScene_NIGEL_1A(sRCLauncherDataLocal)
CPRINTLN(DEBUG_MISSION, " RESET_MISSION - waiting on SetupScene_NIGEL_1A")
WAIT(0)
ENDWHILE
RC_SET_ENTITY_PROOFS_FOR_CUTSCENE(sRCLauncherDataLocal, FALSE)
RC_TakeEntityOwnership(sRCLauncherDataLocal)
SETUP_AREA_FOR_MISSION(RC_NIGEL_1A, 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_ENTER_THE_MUSIC_CLUB)
#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_ENTER_THE_MUSIC_CLUB
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
SAFE_TELEPORT_PED(PLAYER_PED_ID(), vPos_PlayerMissionStart, fHeading_PlayerMissionStart) //put player near start location facing towards club
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
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "DO_Z_SKIP : iNewStage = ", iNewStage, " bResetMission = ", bResetMission) ENDIF #ENDIF
JUMP_TO_STAGE(eMissionSkipTargetStage)
ENDPROC
//-------------------------------------------------------------------------------------------------------------------------------------------------
// DEBUG - J,P and Z skip stuff
//-------------------------------------------------------------------------------------------------------------------------------------------------
#IF IS_DEBUG_BUILD
/// PURPOSE:
/// Check for S, F, J and P skips
PROC DEBUG_Check_Debug_Keys()
INT iNewStage
// Check for Pass
IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_S))
WAIT_FOR_CUTSCENE_TO_STOP()
IF IS_PED_UNINJURED(sWillyPed.pedIndex)
IF IS_PED_IN_MELEE_COMBAT(sWillyPed.pedIndex) // clear ped tasks doesn't work on a ped in combat :(
CLEAR_PED_TASKS_IMMEDIATELY(sWillyPed.pedIndex)
ELSE
CLEAR_PED_TASKS(sWillyPed.pedIndex)
ENDIF
SET_PED_KEEP_TASK(sWillyPed.pedIndex, FALSE)
sWillyPed.AI = N1A_PED_AI_SETUP_RELAXED
ENDIF
// respot player outside club so doors can get locked
IF ePlayerInsideClubStatus != N1A_RCR_INVALID
AND ePlayerInsideClubStatus != N1A_MAX_NUM_ROCK_CLUB_ROOMS
SAFE_TELEPORT_PED(PLAYER_PED_ID(), <<-571.1343, 271.7024, 81.9336>>, 132.6751)
SET_GAMEPLAY_CAM_RELATIVE_PITCH()
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
CPRINTLN(DEBUG_MISSION, "SKIP - player in club interior, warp outside setup")
ENDIF
IF IS_PED_UNINJURED(PLAYER_PED_ID())
CLEAR_PED_TASKS(PLAYER_PED_ID())
ENDIF
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "S SKIP") ENDIF #ENDIF
Script_Passed()
ENDIF
// Check for Fail
IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_F))
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
// Check for Skip forward
IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_J))
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
// Check for Skip backwards
IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_P))
SWITCH eMissionStage
CASE MISSION_STAGE_LOSE_THE_COPS
iNewStage = ENUM_TO_INT(MISSION_STAGE_LEAVE_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 dealth 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:
/// Trevor has to get into the music club
PROC ENTER_THE_MUSIC_CLUB()
vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
ePlayerInsideClubStatus = GET_PED_INSIDE_MUSIC_CLUB_STATUS(PLAYER_PED_ID(), FALSE)
UPDATE_AUDIO_SCENE(ePlayerInsideClubStatus)
SWITCH eSubStage
// ------------------------------------------
CASE SS_SETUP
IF IS_PED_UNINJURED(sClubPed[CLUB_PED_GROUPIE_UPSTAIRS_01].pedIndex)
ADD_PED_FOR_DIALOGUE(sDialogue, 4, sClubPed[CLUB_PED_GROUPIE_UPSTAIRS_01].pedIndex, "Nigel1AGroupie01")
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "ADD_PED_FOR_DIALOGUE : ", "speakerId = ", 4, " Voice ID = Nigel1AGroupie01 ", "ped ID = ", CLUB_PED_GROUPIE_UPSTAIRS_01) ENDIF #ENDIF
ENDIF
IF IS_PED_UNINJURED(sClubPed[CLUB_PED_BAND_MANAGER].pedIndex)
ADD_PED_FOR_DIALOGUE(sDialogue, 5, sClubPed[CLUB_PED_BAND_MANAGER].pedIndex, "Nigel1AManager")
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "ADD_PED_FOR_DIALOGUE : ", "speakerId = ", 5, " Voice ID = Nigel1AManager ", "ped ID = ", CLUB_PED_BAND_MANAGER) ENDIF #ENDIF
ENDIF
IF IS_PED_UNINJURED(sWillyPed.pedIndex)
ADD_PED_FOR_DIALOGUE(sDialogue, 8, sWillyPed.pedIndex, "Willy")
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "ADD_PED_FOR_DIALOGUE : ", "speakerId = ", 8, " Voice ID = Willy ") ENDIF #ENDIF
ENDIF
IF IS_PED_UNINJURED(sClubPed[CLUB_PED_GROUPIE_UPSTAIRS_02].pedIndex)
ADD_PED_FOR_DIALOGUE(sDialogue, ConvertSingleCharacter("A"), sClubPed[CLUB_PED_GROUPIE_UPSTAIRS_02].pedIndex, "Nigel1AGroupie02")
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "ADD_PED_FOR_DIALOGUE : ", "speakerId = ", "A", " Voice ID = Nigel1AGroupie02 ", "ped ID = ", CLUB_PED_GROUPIE_UPSTAIRS_02) ENDIF #ENDIF
ENDIF
IF IS_PED_UNINJURED(sClubPed[CLUB_PED_ROADIE].pedIndex)
ADD_PED_FOR_DIALOGUE(sDialogue, ConvertSingleCharacter("B"), sClubPed[CLUB_PED_ROADIE].pedIndex, "Nigel1ARoadie")
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "ADD_PED_FOR_DIALOGUE : ", "speakerId = ", "B", " Voice ID = Nigel1ARoadie ", "ped ID = ", CLUB_PED_ROADIE) ENDIF #ENDIF
ENDIF
IF IS_PED_UNINJURED(sClubPed[GROUPIE_WILLYS_PIECE].pedIndex)
ADD_PED_FOR_DIALOGUE(sDialogue, ConvertSingleCharacter("C"), sClubPed[GROUPIE_WILLYS_PIECE].pedIndex, "Nigel1AGroupie03")
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "ADD_PED_FOR_DIALOGUE : ", "speakerId = ", "C", " Voice ID = Nigel1AGroupie03 ", "ped ID = ", GROUPIE_WILLYS_PIECE) ENDIF #ENDIF
ENDIF
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, "ENTER_THE_MUSIC_CLUB - SS_SETUP done")
BREAK
// ------------------------------------------
CASE SS_UPDATE
MANAGE_WILLY()
MANAGE_CLUB_PEDS()
IF ePlayerInsideClubStatus <> N1A_RCR_INVALID //IS_ENTITY_INSIDE_MUSIC_CLUB_INTERIOR(PLAYER_PED_ID())
AND ePlayerInsideClubStatus <> N1A_MAX_NUM_ROCK_CLUB_ROOMS
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "ENTER_THE_MUSIC_CLUB - player inside club - eSubStage = SS_CLEANUP") ENDIF #ENDIF
eSubStage = SS_CLEANUP
ELSE
IF NOT bDoneObjective_EnterClub
REPLAY_RECORD_BACK_FOR_TIME(4.0, 8.0, REPLAY_IMPORTANCE_LOW)
PRINT_NOW("NIG1A_OBJ_01", DEFAULT_GOD_TEXT_TIME, 0) // Enter the ~y~club~s~ and find Willy.~s~
IF NOT DOES_BLIP_EXIST(blipMusicClub)
blipMusicClub = CREATE_COORD_BLIP(vMusicClub_CentrePos)
ENDIF
bDoneObjective_EnterClub = TRUE
ENDIF
ENDIF
BREAK
// ------------------------------------------
CASE SS_CLEANUP
MANAGE_WILLY()
MANAGE_CLUB_PEDS()
SAFE_REMOVE_BLIP(blipMusicClub)
IF IS_THIS_PRINT_BEING_DISPLAYED("NIG1A_OBJ_01")
CLEAR_THIS_PRINT("NIG1A_OBJ_01") // Enter the ~y~club~s~ and find Willy.~s~
ENDIF
SET_STAGE(MISSION_STAGE_FIND_CELEB)
CPRINTLN(DEBUG_MISSION, "ENTER_THE_MUSIC_CLUB - SS_CLEANUP done")
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE:
/// Trevor has to go to the parking lot, around the back of the rock club
PROC STAGE_FIND_CELEB()
vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
ePlayerInsideClubStatus = GET_PED_INSIDE_MUSIC_CLUB_STATUS(PLAYER_PED_ID(), FALSE)
UPDATE_AUDIO_SCENE(ePlayerInsideClubStatus)
MONITOR_PLAYER_SCRIPTED_WANTED_LEVEL()
MANAGE_WILLY()
MANAGE_CLUB_PEDS()
SWITCH eSubStage
// ------------------------------------------
CASE SS_SETUP
eSubStage = SS_UPDATE
CPRINTLN(DEBUG_MISSION, "STAGE_FIND_CELEB - SS_SETUP done")
BREAK
// ------------------------------------------
CASE SS_UPDATE
IF ePlayerInsideClubStatus != N1A_RCR_INVALID // IS_ENTITY_INSIDE_MUSIC_CLUB_INTERIOR(PLAYER_PED_ID(), FALSE)
AND ePlayerInsideClubStatus != N1A_MAX_NUM_ROCK_CLUB_ROOMS
SAFE_REMOVE_BLIP(blipMusicClub)
ELSE
IF NOT DOES_BLIP_EXIST(blipMusicClub) // re-blip the club if the player isn't inside it.
blipMusicClub = CREATE_COORD_BLIP(vMusicClub_CentrePos)
ENDIF
ENDIF
HANDLE_PLAYER_HEADTRACKING_WILLY_PRE_BRAWL()
// Trevor learns of Willy' location from the rest of the band
IF NOT bDoneDialogue_BandSayWhereWillyIs
IF NOT bHasPlayerScarredClubPedsUpstairs
IF ePlayerInsideClubStatus = N1A_RCR_ROOM_UPSTAIRS
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
KILL_AND_STORE_CURRENT_AMBIENT_DIALOGUE_UPSTAIRS(FALSE)
ENDIF
IF NIG1A_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sNigel1A_Dialogue_TextBlockName, "NIG1A_B1", CONV_PRIORITY_MEDIUM)
REPLAY_RECORD_BACK_FOR_TIME(4.0, 8.0, REPLAY_IMPORTANCE_LOW)
// Okay, which one of you cupcakes is Willy?
// Hey, who the fuck are you?
// His dentist.
// Willy's still downstairs chatting up some bird, man.
// His dentist comes to him, that is so cool.
SET_CLUB_PEDS_UPSTAIRS_SYNCED_ANIM(N1A_CPAT_IDLE_B_ANIM)
bDoneDialogue_BandSayWhereWillyIs = TRUE
ENDIF
ENDIF
ENDIF
ELSE
IF bHasPlayerScarredClubPedsUpstairs
IF IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("NIG1A_B1") //bDoneDialogue_BandSayWhereWillyIs
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STAGE_FIND_CELEB - player scarred them whilst they were saying where Willy is. So cancelled blipping him") ENDIF #ENDIF
ENDIF
ELSE
IF NOT IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("NIG1A_B1") //bDoneDialogue_BandSayWhereWillyIs
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STAGE_FIND_CELEB - eSubStage = SS_CLEANUP - peds upstairs told Trevor where Willy is") ENDIF #ENDIF
INFORM_STAT_SYSTEM_OF_BOOL_STAT_HAPPENED(NI1A_ENTOURAGE)
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STAGE_FIND_CELEB - INFORM_STAT_SYSTEM_OF_BOOL_STAT_HAPPENED(NI1A_ENTOURAGE)") ENDIF #ENDIF
eSubStage = SS_CLEANUP
ENDIF
ENDIF
ENDIF
// if Trevor has spotted Willy
IF bDoneDialogue_MusicianSpottedPlayer
IF NOT IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING(sNigel1A_DialogueRoot_MusicianSpotsTrevor) //bDoneDialogue_BandSayWhereWillyIs
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STAGE_FIND_CELEB - eSubStage = SS_CLEANUP - Trevor spoke to Willy") ENDIF #ENDIF
eSubStage = SS_CLEANUP
ENDIF
ENDIF
// sneaking in back door dialogue
IF NOT bDoneDialogue_TrevorCommentSneakingInBackdoor
IF ePlayerInsideClubStatus = N1A_RCR_REAR_ENTRANCE_TOP_STAIRS
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF GET_UPDATED_PED_MOVEMENT_STATE(PLAYER_PED_ID()) != N1A_PEDMOVEMENTSTATE_STEALTH
IF NIG1A_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sNigel1A_Dialogue_TextBlockName, "NIG1A_TBE1", CONV_PRIORITY_MEDIUM) //)
// Tradesmen's entrance, don't mind if I do.
bDoneDialogue_TrevorCommentSneakingInBackdoor = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "bDoneDialogue_TrevorCommentSneakingInBackdoor - TRUE", "***") ENDIF #ENDIF
ENDIF
ELSE
bDoneDialogue_TrevorCommentSneakingInBackdoor = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "bDoneDialogue_TrevorCommentSneakingInBackdoor - TRUE skipped over, player in stealth", "***") ENDIF #ENDIF
ENDIF
ENDIF
ELSE
bDoneDialogue_TrevorCommentSneakingInBackdoor = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "bDoneDialogue_TrevorCommentSneakingInBackdoor - TRUE skipped over, player in wrong area", "***") ENDIF #ENDIF
ENDIF
ENDIF
// has Willy kicked off with the player
IF eMusicianState != N1A_MUSICIAN_STATE_RELAXED // bug fix B*1060738
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STAGE_FIND_CELEB - eSubStage = SS_CLEANUP - Willy not in relaxed state") ENDIF #ENDIF
eSubStage = SS_CLEANUP
ENDIF
BREAK
// ------------------------------------------
CASE SS_CLEANUP
IF IS_THIS_PRINT_BEING_DISPLAYED("NIG1A_OBJ_01")
CLEAR_THIS_PRINT("NIG1A_OBJ_01") // Enter the ~y~club~s~ and find Willy.~s~
ENDIF
bDoneDialogue_TrevorCommentSneakingInBackdoor = TRUE // Set this dialogue to true as we don't want it playing out after this point
SAFE_REMOVE_BLIP(blipMusicClub)
SET_STAGE(MISSION_STAGE_KNOCK_OUT_TOOTH)
CPRINTLN(DEBUG_MISSION, "STAGE_FIND_CELEB - SS_CLEANUP done")
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE:
/// Trevor is told to Beat up Willy
PROC STAGE_KNOCK_OUT_TOOTH()
vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
ePlayerInsideClubStatus = GET_PED_INSIDE_MUSIC_CLUB_STATUS(PLAYER_PED_ID(), FALSE)
UPDATE_AUDIO_SCENE(ePlayerInsideClubStatus)
MONITOR_PLAYER_SCRIPTED_WANTED_LEVEL()
MANAGE_WILLY()
MANAGE_CLUB_PEDS()
SWITCH eSubStage
// ------------------------------------------
CASE SS_SETUP
IF IS_PED_UNINJURED(sWillyPed.pedIndex)
IF NOT DOES_BLIP_EXIST(sWillyPed.blipIndex)
sWillyPed.blipIndex = CREATE_PED_BLIP(sWillyPed.pedIndex, TRUE, FALSE)
ENDIF
ENDIF
HAVE_ASSETS_LOADED_FOR_COLLECT_TOOTH_STAGE() // start requesting these ready
iTimer_BackupKnockOutToothTrigger = GET_GAME_TIMER()
eSubStage = SS_UPDATE
CPRINTLN(DEBUG_MISSION, "STAGE_KNOCK_OUT_TOOTH - SS_SETUP done")
BREAK
// ------------------------------------------
CASE SS_UPDATE
//knock out the tooth when the musician state reaches
IF eMusicianState = N1A_MUSICIAN_STATE_TOOTH_KNOCKED_OUT
REPLAY_RECORD_BACK_FOR_TIME(4.0, 8.0, REPLAY_IMPORTANCE_LOW)
eSubStage = SS_CLEANUP
CPRINTLN(DEBUG_MISSION, "STAGE_KNOCK_OUT_TOOTH - SS_UPDATE - Willy i knocked down state")
ELSE
IF NOT bDoneObjective_BeatUpMusician
IF bDoneDialogue_MusicianSpottedPlayer
AND NOT IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING(sNigel1A_DialogueRoot_MusicianSpotsTrevor)
OR eMusicianState != N1A_MUSICIAN_STATE_RELAXED // bug fix B*1060738
// B*1386580 - Beat up Willy objective overridden by dialogue. (delay if a convo is being built)
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
PRINT_NOW("NIG1A_OBJ_02", DEFAULT_GOD_TEXT_TIME, 1) // Beat up ~r~Willy.~s~
bDoneObjective_BeatUpMusician = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STAGE_KNOCK_OUT_TOOTH - objective displayed (no convo ongoing or queued), frame count = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ELSE
IF IS_SCRIPTED_CONVERSATION_ONGOING()
IF NOT IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("NIG1A_MSP4") // Right, I'll take you on!
AND NOT IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("NIG1A_MSU2") // Oh no don't hurt me, don't hurt me! What do you want?
PRINT_NOW("NIG1A_OBJ_02", DEFAULT_GOD_TEXT_TIME, 1) // Beat up ~r~Willy.~s~
bDoneObjective_BeatUpMusician = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STAGE_KNOCK_OUT_TOOTH - objective displayed (interupt ongoing convo) frame count = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
ELSE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STAGE_KNOCK_OUT_TOOTH - objective DELAYED for building / queues convo frame count = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
HANDLE_PLAYER_HEADTRACKING_WILLY_PRE_BRAWL()
IF IS_PED_UNINJURED(sWillyPed.pedIndex)
CONTROL_PED_CHASE_HINT_CAM_IN_VEHICLE(localChaseHintCamStruct, sWillyPed.pedIndex)
ENDIF
ENDIF
BREAK
// ------------------------------------------
CASE SS_CLEANUP
SAFE_REMOVE_BLIP(sWillyPed.blipIndex)
KILL_CHASE_HINT_CAM(localChaseHintCamStruct)
IF IS_THIS_PRINT_BEING_DISPLAYED("NIG1A_OBJ_02")
CLEAR_THIS_PRINT("NIG1A_OBJ_02") // Beat up ~r~Willy.~s~
ENDIF
// B*1563437 - don't lower his health until it doesn't matter if he dies
IF IS_PED_UNINJURED(sWillyPed.pedIndex)
IF (GET_ENTITY_HEALTH(sWillyPed.pedIndex) >= 137.5) // fatigued threshold used to be 135
SET_ENTITY_HEALTH(sWillyPed.pedIndex, 135)
CPRINTLN(DEBUG_MISSION, "STAGE_KNOCK_OUT_TOOTH - SS_CLEANUP : lower Willy health 135 for flee +-+-")
ENDIF
ENDIF
SET_STAGE(MISSION_STAGE_COLLECT_TOOTH)
CPRINTLN(DEBUG_MISSION, "STAGE_KNOCK_OUT_TOOTH - SS_CLEANUP done")
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE:
/// Willy's tooth falls out and the player must collect it
PROC STAGE_COLLECT_TOOTH()
VECTOR vTempSoundPos
vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
ePlayerInsideClubStatus = GET_PED_INSIDE_MUSIC_CLUB_STATUS(PLAYER_PED_ID(), FALSE)
UPDATE_AUDIO_SCENE(ePlayerInsideClubStatus)
// if the player hangs around the club or is pursuing Willy, give player a wanted level after period of time
MONITOR_PLAYER_SCRIPTED_WANTED_LEVEL()
MANAGE_WILLY()
MANAGE_CLUB_PEDS()
SWITCH eSubStage
// ------------------------------------------
CASE SS_SETUP
IF HAVE_ASSETS_LOADED_FOR_COLLECT_TOOTH_STAGE()
IF NOT DOES_PICKUP_EXIST(mpToothPickup.index)
IF GET_TOOTH_PICKUP_COORDS(mpToothPickup.vPosition)
mpToothPickup.index = CREATE_PICKUP(mpToothPickup.type, mpToothPickup.vPosition, mpToothPickup.iPlacementFlags, -1, TRUE, mpToothPickup.mnModel)
CPRINTLN(DEBUG_MISSION, "STAGE_COLLECT_TOOTH - tooth pickup created")
IF DOES_PICKUP_EXIST(mpToothPickup.index)
IF DOES_PICKUP_OBJECT_EXIST(mpToothPickup.index)
//tooth sound sfx
IF REQUEST_SCRIPT_AUDIO_BANK("NIGEL_1A_TOOTH")
vTempSoundPos = GET_PICKUP_COORDS(mpToothPickup.index)
vTempSoundPos.z += 0.35 // make this a little higher to ensure the pos is above ground level
PLAY_SOUND_FROM_COORD(-1, "TOOTH_PING", vTempSoundPos, "NIGEL_1A_SOUNDSET")
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "sfx for knocked out tooth played ~~~~~~~") ENDIF #ENDIF
ELSE
CPRINTLN(DEBUG_MISSION, "sfx for knocked out tooth NOT loaded in time ~~~~~~~")
ENDIF
//setup tooth pickup blip
IF NOT DOES_BLIP_EXIST(mpToothPickup.blipIndex)
mpToothPickup.blipIndex = CREATE_BLIP_FOR_PICKUP(mpToothPickup.index)
ENDIF
IF DOES_BLIP_EXIST(mpToothPickup.blipIndex)
//SET_BLIP_COLOUR(mpToothPickup.blipIndex, BLIP_COLOUR_GREEN)
SET_BLIP_NAME_FROM_TEXT_FILE(mpToothPickup.blipIndex, "NIG1A_TP_BLIP") //Tooth
ENDIF
ELSE
CPRINTLN(DEBUG_MISSION, " : STAGE_COLLECT_TOOTH : DOES_PICKUP_OBJECT_EXIST return false after CREATE_PICKUP!")
ENDIF
ELSE
CPRINTLN(DEBUG_MISSION, " : STAGE_COLLECT_TOOTH : DOES_PICKUP_OBJECT_EXIST return false after CREATE_PICKUP!")
ENDIF
SET_MODEL_AS_NO_LONGER_NEEDED(mpToothPickup.mnModel)
IF NOT bShouldPlayerGetWantedLevelAfterAttackingWilly
// check the scripted wanted level timer hasn't already been set for other reasons
IF iTimer_PlayerReceivesScriptedWantedLevel = 0
iTimer_PlayerReceivesScriptedWantedLevel = GET_GAME_TIMER() // used to give the player a scripted wanted level if is using a weapon in the club
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STAGE_COLLECT_TOOTH - done - setup wanted level delay for staying in club") ENDIF #ENDIF
ENDIF
bShouldPlayerGetWantedLevelAfterAttackingWilly = TRUE
ENDIF
REPLAY_RECORD_BACK_FOR_TIME(4.0, 0, REPLAY_IMPORTANCE_LOWEST) // B*1841676 - record knockout blow to Willy
eSubStage = SS_UPDATE
CPRINTLN(DEBUG_MISSION, "STAGE_COLLECT_TOOTH - SS_SETUP done")
ENDIF
ENDIF
ENDIF
BREAK
// ------------------------------------------
CASE SS_UPDATE
IF NOT bDoneDialogue_MusicianLosesTooth
IF IS_PED_UNINJURED(sWillyPed.pedIndex)
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDIF
IF NIG1A_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sNigel1A_Dialogue_TextBlockName, "NIG1A_MCS", CONV_PRIORITY_MEDIUM, GET_SUBTITLES_STATE_FOR_NON_CLASH_WITH_MESSAGES())
SET_AUDIO_FLAG("DisableAbortConversationForRagdoll", TRUE) // B*1516072 - allow convo during ragdoll
// Aagh, my tooth. You bastard!
bDoneDialogue_MusicianLosesTooth = TRUE
ENDIF
ELSE
bDoneDialogue_MusicianLosesTooth = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STAGE_COLLECT_TOOTH - skipped over bDoneDialogue_MusicianLosesTooth as Willy is Dead") ENDIF #ENDIF
ENDIF
ELIF NOT bDoneObjective_CollectTooth
IF NOT IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("NIG1A_MCS") // bDoneDialogue_MusicianLosesTooth
PRINT_NOW("NIG1A_OBJ_03", DEFAULT_GOD_TEXT_TIME, 1) // Collect Willy's ~g~gold tooth.~s~
bDoneObjective_CollectTooth = TRUE
ENDIF
ELIF NOT bDoneDialogue_MusicianBeginFlee
IF IS_PED_UNINJURED(sWillyPed.pedIndex)
IF sWillyPed.AI = N1A_PED_AI_STATE_MUSICIAN_FINISHED_TOOTH_OUT_ANIMS
IF NOT IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("NIG1A_MCS") // bDoneDialogue_MusicianLosesTooth
IF NIG1A_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sNigel1A_Dialogue_TextBlockName, "NIG1A_ML", CONV_PRIORITY_MEDIUM, GET_SUBTITLES_STATE_FOR_NON_CLASH_WITH_MESSAGES()) // no subtitles for bug fix 1042232
// You are out of your fucking mind!
SET_AUDIO_FLAG("DisableAbortConversationForRagdoll", TRUE) // B*1516072 - allow convo during ragdoll
IF eMusicianState = N1A_MUSICIAN_STATE_TOOTH_KNOCKED_OUT
sWillyPed.AI = N1A_PED_AI_SETUP_FLEE
eMusicianState = N1A_MUSICIAN_STATE_FLEE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STAGE_COLLECT_TOOTH : ", "N1A_MUSICIAN_STATE_TOOTH_KNOCKED_OUT - eMusicianState = N1A_MUSICIAN_STATE_FLEE") ENDIF #ENDIF
ENDIF
bDoneDialogue_MusicianBeginFlee = TRUE
ENDIF
ENDIF
ENDIF
ELSE
bDoneDialogue_MusicianBeginFlee = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STAGE_COLLECT_TOOTH - skipped over bDoneDialogue_MusicianBeginFlee as Willy is Dead") ENDIF #ENDIF
ENDIF
ENDIF
//Check for player collecting the tooth
IF HAS_PICKUP_BEEN_COLLECTED(mpToothPickup.index)
REPLAY_RECORD_BACK_FOR_TIME(4.0, 8.0, REPLAY_IMPORTANCE_LOW)
//SET_CONTROL_SHAKE(PLAYER_CONTROL, 200, 250)
//vTempSoundPos = GET_ENTITY_COORDS(mpToothPickup.index)
//vTempSoundPos.z += 0.35 // make this a little higher to ensure the pos is above ground level
//PLAY_SOUND_FROM_COORD(-1, "PICK_UP_DEFAULT", vTempSoundPos, "HUD_FRONTEND_CUSTOM_SOUNDSET")
/*// B*1533138 - tooth pickup anim
IF IS_PLAYER_FREE_FOR_AMBIENT_TASK(PLAYER_ID())
AND NOT IS_PED_RAGDOLL(PLAYER_PED_ID())
AND NOT IS_PED_IN_COMBAT(PLAYER_PED_ID())
AND NOT IS_PLAYER_FREE_AIMING(PLAYER_ID())
AND NOT IS_PLAYER_TARGETTING_ANYTHING(PLAYER_ID())
TASK_PLAY_ANIM(PLAYER_PED_ID(), "pickup_object", "pickup_low", SLOW_BLEND_IN, REALLY_SLOW_BLEND_OUT, -1, AF_DEFAULT | AF_ABORT_ON_WEAPON_DAMAGE | AF_EXIT_AFTER_INTERRUPTED)
ELSE
CPRINTLN(DEBUG_MISSION, "STAGE_COLLECT_TOOTH - SS_UPDATE - anim skipped")
ENDIF*/
CPRINTLN(DEBUG_MISSION, "STAGE_COLLECT_TOOTH - SS_UPDATE - tooth collected ~~~~*****+++++----$$$~~~")
eSubStage = SS_CLEANUP
ENDIF
BREAK
// ------------------------------------------
CASE SS_CLEANUP
IF IS_THIS_PRINT_BEING_DISPLAYED("NIG1A_OBJ_03")
CLEAR_THIS_PRINT("NIG1A_OBJ_03") // Collect Willy's ~g~gold tooth.~s~
ENDIF
bDoneObjective_CollectTooth = TRUE
SAFE_REMOVE_BLIP(mpToothPickup.blipIndex)
SET_MODEL_AS_NO_LONGER_NEEDED(mpToothPickup.mnModel)
//REMOVE_ANIM_DICT("pickup_object") // B*1533138 - tooth pickup anim
SAFE_REMOVE_PICKUP(mpToothPickup.index)
SET_STAGE(MISSION_STAGE_LEAVE_THE_AREA)
CPRINTLN(DEBUG_MISSION, "STAGE_COLLECT_TOOTH - SS_CLEANUP done")
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE:
/// Player must leave the area
PROC STAGE_LEAVE_THE_AREA()
vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
ePlayerInsideClubStatus = GET_PED_INSIDE_MUSIC_CLUB_STATUS(PLAYER_PED_ID(), FALSE)
UPDATE_AUDIO_SCENE(ePlayerInsideClubStatus)
// if the player hangs around the club or is pursuing Willy, give player a wanted level after period of time
MONITOR_PLAYER_SCRIPTED_WANTED_LEVEL()
MANAGE_WILLY()
MANAGE_CLUB_PEDS()
INT i = 0
SWITCH eSubStage
// ------------------------------------------
CASE SS_SETUP
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CP_NIGEL1A_LEAVE_THE_AREA, "Leave the area.", TRUE) // 2nd Mission replay checkpoint
eSubStage = SS_UPDATE
CPRINTLN(DEBUG_MISSION, "STAGE_LEAVE_THE_AREA - SS_SETUP done")
BREAK
// ------------------------------------------
CASE SS_UPDATE
IF NOT bDoneDialogue_MusicianLosesTooth
IF IS_PED_UNINJURED(sWillyPed.pedIndex)
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDIF
IF NIG1A_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sNigel1A_Dialogue_TextBlockName, "NIG1A_MCS", CONV_PRIORITY_MEDIUM, GET_SUBTITLES_STATE_FOR_NON_CLASH_WITH_MESSAGES())
//Fuck, I've lost a tooth. You bastard.
bDoneDialogue_MusicianLosesTooth = TRUE
ENDIF
ELSE
bDoneDialogue_MusicianLosesTooth = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STAGE_LEAVE_THE_AREA - skipped over bDoneDialogue_MusicianLosesTooth as Willy is Dead") ENDIF #ENDIF
ENDIF
ELIF NOT bDoneDialogue_MusicianBeginFlee
IF IS_PED_UNINJURED(sWillyPed.pedIndex)
IF sWillyPed.AI = N1A_PED_AI_STATE_MUSICIAN_FINISHED_TOOTH_OUT_ANIMS
IF NOT IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("NIG1A_MCS") // bDoneDialogue_MusicianLosesTooth
IF NIG1A_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sNigel1A_Dialogue_TextBlockName, "NIG1A_ML", CONV_PRIORITY_MEDIUM, GET_SUBTITLES_STATE_FOR_NON_CLASH_WITH_MESSAGES()) // no subtitles for bug fix 1042232
// You are out of your fucking mind!
SET_AUDIO_FLAG("DisableAbortConversationForRagdoll", TRUE) // B*1516072 - allow convo during ragdoll
IF eMusicianState = N1A_MUSICIAN_STATE_TOOTH_KNOCKED_OUT
sWillyPed.AI = N1A_PED_AI_SETUP_FLEE
eMusicianState = N1A_MUSICIAN_STATE_FLEE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STAGE_LEAVE_THE_AREA : ", "N1A_MUSICIAN_STATE_TOOTH_KNOCKED_OUT - eMusicianState = N1A_MUSICIAN_STATE_FLEE") ENDIF #ENDIF
ENDIF
bDoneDialogue_MusicianBeginFlee = TRUE
ENDIF
ENDIF
ENDIF
ELSE
bDoneDialogue_MusicianBeginFlee = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STAGE_LEAVE_THE_AREA - skipped over bDoneDialogue_MusicianBeginFlee as Willy is Dead") ENDIF #ENDIF
ENDIF
ELSE
IF IS_ENTITY_IN_RANGE_COORDS(PLAYER_PED_ID(), vMusicClub_CentrePos, NIG1A_PLAYER_LEFT_THE_CLUB_DIST)
IF NOT bDoneObjective_LeaveTheArea
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
PRINT_NOW("NIG1A_OBJ_04", 10000, 0) // Leave the area.~s~ B*1583984 increase display time from DEFAULT_GOD_TEXT_TIME (7500)
bDoneObjective_LeaveTheArea = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STAGE_LEAVE_THE_AREA - objective displayed (no convo ongoing or queued), frame count = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ELSE
IF IS_SCRIPTED_CONVERSATION_ONGOING()
// B*1772114 - this convo can stomp on the objective so wait for it to finish if playing
IF NOT IS_SPECIFIC_CONVERSATION_ROOT_CURRENTLY_PLAYING("NIG1A_ML") // bDoneDialogue_MusicianBeginFlee
PRINT_NOW("NIG1A_OBJ_04", 10000, 0) // Leave the area.~s~ B*1583984 increase display time from DEFAULT_GOD_TEXT_TIME (7500)
bDoneObjective_LeaveTheArea = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STAGE_LEAVE_THE_AREA - objective displayed (interupt ongoing convo) frame count = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ELSE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STAGE_LEAVE_THE_AREA - objective DELAYED for ongoing convo NIG1A_ML frame count = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
ELSE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "STAGE_LEAVE_THE_AREA - objective DELAYED for building / queues convo frame count = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
ENDIF
ELSE
IF NOT bDoneDialogue_TrevorLeaveTheAreaComment
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_ENTITY_INSIDE_MUSIC_CLUB_INTERIOR(PLAYER_PED_ID(), FALSE)
IF NIG1A_CREATE_CONVERSATION_WITH_MESSAGE_DISPLAYED_CHECK(sDialogue, sNigel1A_Dialogue_TextBlockName, "NIG1A_TLA", CONV_PRIORITY_MEDIUM, GET_SUBTITLES_STATE_FOR_NON_CLASH_WITH_MESSAGES()) //)
REPLAY_RECORD_BACK_FOR_TIME(2.0, 3.0, REPLAY_IMPORTANCE_LOWEST)
// I'd say my work is done here.
bDoneDialogue_TrevorLeaveTheAreaComment = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "TREVOR LEAVE THE AREA DIALOGUE", "***") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() // wait for current dialogue to finish first
CPRINTLN(DEBUG_MISSION, "STAGE_LEAVE_THE_AREA - player left the area")
eSubStage = SS_CLEANUP
ENDIF
ENDIF
ENDIF
BREAK
// ------------------------------------------
CASE SS_CLEANUP
IF IS_THIS_PRINT_BEING_DISPLAYED("NIG1A_OBJ_04")
CLEAR_THIS_PRINT("NIG1A_OBJ_04") // Leave the area.~s~
ENDIF
FOR i = 0 TO (MAX_NUM_CLUB_PEDS - 1)
SAFE_REMOVE_PED(sClubPed[i].pedIndex)
ENDFOR
SET_AUDIO_FLAG("DisableAbortConversationForRagdoll", FALSE) // B*1516072 - allow convo during ragdoll
//Player has to lose the cops if he has a wanted level
IF IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
SET_STAGE(MISSION_STAGE_LOSE_THE_COPS)
ELSE
SET_STAGE(MISSION_STAGE_OUTRO_PHONECALL)
ENDIF
CPRINTLN(DEBUG_MISSION, "STAGE_LEAVE_THE_AREA - SS_CLEANUP done")
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE:
/// Additional stage which monitors the player losing his wanted level
PROC STAGE_LOSE_THE_COPS()
vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
ePlayerInsideClubStatus = GET_PED_INSIDE_MUSIC_CLUB_STATUS(PLAYER_PED_ID(), FALSE)
UPDATE_AUDIO_SCENE(ePlayerInsideClubStatus)
MANAGE_WILLY()
MANAGE_CLUB_PEDS()
SWITCH eSubStage
// ------------------------------------------
CASE SS_SETUP
MONITOR_PLAYER_SCRIPTED_WANTED_LEVEL()
bDoneObjective_LoseWantedLevel = FALSE // lose cops objective should display everytime
eSubStage = SS_UPDATE
CPRINTLN(DEBUG_MISSION, "STAGE_LOSE_THE_COPS - SS_SETUP done")
BREAK
// ------------------------------------------
CASE SS_UPDATE
// if the player hangs around the club or is pursuing Willy, give player a wanted level after period of time
MONITOR_PLAYER_SCRIPTED_WANTED_LEVEL()
IF NOT IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
IF IS_THIS_PRINT_BEING_DISPLAYED("NIG1A_OBJ_05")
CLEAR_THIS_PRINT("NIG1A_OBJ_05") //Lose the cops.
ENDIF
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() // wait for current dialogue to finish first
eSubStage = SS_CLEANUP
ENDIF
ELSE
IF NOT bDoneObjective_LoseWantedLevel
IF NOT IS_THIS_PRINT_BEING_DISPLAYED("NIG1A_OBJ_05")
//#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "lose cops objective displayed ^^^^^^ +++++ ^^^^^") ENDIF #ENDIF
PRINT_NOW("NIG1A_OBJ_05", DEFAULT_GOD_TEXT_TIME, 0) // Lose the cops.
bDoneObjective_LoseWantedLevel = TRUE
ENDIF
ENDIF
ENDIF
BREAK
// ------------------------------------------
CASE SS_CLEANUP
IF IS_THIS_PRINT_BEING_DISPLAYED("NIG1A_OBJ_05")
CLEAR_THIS_PRINT("NIG1A_OBJ_05") //Lose the cops.
ENDIF
SET_STAGE(MISSION_STAGE_OUTRO_PHONECALL)
CPRINTLN(DEBUG_MISSION, "STAGE_LOSE_THE_COPS - SS_CLEANUP done")
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE:
/// Trveor calls Nigel, to inform him of the successful mission
PROC STAGE_OUTRO_PHONECALL()
vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
ePlayerInsideClubStatus = GET_PED_INSIDE_MUSIC_CLUB_STATUS(PLAYER_PED_ID(), FALSE)
UPDATE_AUDIO_SCENE(ePlayerInsideClubStatus)
MANAGE_WILLY()
MANAGE_CLUB_PEDS()
SWITCH eSubStage
// ------------------------------------------
CASE SS_SETUP
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
KILL_PHONE_CONVERSATION()
ENDIF
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
// Delay the phonecall for polish purposes
IF HAS_TIME_PASSED(iTimer_DelayForOutroPhonecall, TIME_DELAY_FOR_OUTRO_PHONECALL)
IF PLAYER_CALL_CHAR_CELLPHONE(sDialogue, CHAR_NIGEL, sNigel1A_Dialogue_TextBlockName, "NIG1A_CP2", CONV_PRIORITY_CELLPHONE)
REPLAY_RECORD_BACK_FOR_TIME(2.0, 4.0, REPLAY_IMPORTANCE_LOW)
// Guess what, you crazy English fruitcake.
// Oh, I'm dreadful at guessing, aren't I Mrs Thornhill?
// No, she can't hear me, she's washing out a nappy from Samantha Muldoon's dustbin.
// One gold tooth, courtesy of Love Fist, complete with complimentary DNA.
// Marvelous, marvelous! Jock, I knew you wouldn't let us down!
// Too-da-loo.
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()
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
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
KILL_PHONE_CONVERSATION()
ENDIF
KILL_ANY_CONVERSATION()
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())
ePlayerInsideClubStatus = GET_PED_INSIDE_MUSIC_CLUB_STATUS(PLAYER_PED_ID(), FALSE)
UPDATE_AUDIO_SCENE(ePlayerInsideClubStatus)
SWITCH eSubStage
// ------------------------------------------
CASE SS_SETUP
CLEAR_PRINTS()
CLEAR_HELP()
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
KILL_ANY_CONVERSATION()
ENDIF
DELETE_ALL_MISSION_BLIPS()
SWITCH eN1A_MissionFailedReason //Set the fail reason string
CASE FAILED_MUSICIAN_KILLED
sFailReason = "NIG1A_F_01" // ~r~Willy died.~s~
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "Mission Failed: MUSICIAN KILLED") ENDIF #ENDIF
BREAK
CASE FAILED_DEFAULT
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "Mission Failed: Generic") ENDIF #ENDIF
BREAK
ENDSWITCH
//Check if fail reason needs to be displayed
IF eN1A_MissionFailedReason = FAILED_DEFAULT
RANDOM_CHARACTER_FAILED()
ELSE
RANDOM_CHARACTER_FAILED_WITH_REASON(sFailReason)
ENDIF
eSubStage = SS_UPDATE
CPRINTLN(DEBUG_MISSION, "MISSION_FAILED_WAIT_FOR_FADE - SS_SETUP done")
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)
// get the player out of the club
IF ePlayerInsideClubStatus != N1A_RCR_INVALID
AND ePlayerInsideClubStatus != N1A_MAX_NUM_ROCK_CLUB_ROOMS
CPRINTLN(DEBUG_MISSION, "MISSION_FAILED_WAIT_FOR_FADE - player in club interior, warp setup")
MISSION_FLOW_SET_FAIL_WARP_LOCATION(<<-571.1343, 271.7024, 81.9336>>, 132.6751)
SET_REPLAY_DECLINED_VEHICLE_WARP_LOCATION(<<-575.5230, 269.2646, 81.6734>>, 83.1558)
ENDIF
CLEANUP_ALL_MISSION_ENTITIES(TRUE)
CLEAR_AREA(vMusicClub_CentrePos, 45.0, TRUE)
CPRINTLN(DEBUG_MISSION, "MISSION_FAILED_WAIT_FOR_FADE - SS_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_SETUP()
vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
INT i
SWITCH eSubStage
CASE SS_SETUP
bDebug_PrintMissionInfoToTTY = TRUE // turn on mission tty
eSubStage = SS_UPDATE
BREAK
CASE SS_UPDATE
i = 1
IF IS_ENTITY_ALIVE(sClubPed[i].pedIndex)
IF CAN_PED_SEE_PED(sClubPed[i].pedIndex, PLAYER_PED_ID(), 170)
sClubPed[i].iFrameCountLastSeenPlayer = GET_FRAME_COUNT()
#IF IS_DEBUG_BUILD IF bDebug_PrintMissionInfoToTTY CPRINTLN(DEBUG_MISSION, "MANAGE_CLUB_PEDS - CAN_PED_SEE_PED returned TRUE for ped ID = ", i, " at frame count = ", GET_FRAME_COUNT()) ENDIF #ENDIF
ENDIF
ENDIF
UPDATE_STANDARD_CLUB_PED_AI(i)
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_1A(sRCLauncherDataLocal)
CPRINTLN(DEBUG_MISSION, " IS_REPLAY_IN_PROGRESS - waiting on SetupScene_NIGEL_1A")
WAIT(0)
ENDWHILE
RC_SET_ENTITY_PROOFS_FOR_CUTSCENE(sRCLauncherDataLocal, FALSE)
RC_TakeEntityOwnership(sRCLauncherDataLocal)
SETUP_AREA_FOR_MISSION(RC_NIGEL_1A, 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()
IF IS_REPLAY_IN_PROGRESS() // handle replay checkpoints
INT iReplayStage = GET_REPLAY_MID_MISSION_STAGE()
IF g_bShitskipAccepted = TRUE
iReplayStage++ // player is skipping this stage
ENDIF
SWITCH iReplayStage
CASE CP_NIGEL1A_ENTER_THE_MUSIC_CLUB
START_REPLAY_SETUP(vPos_PlayerMissionStart, fHeading_PlayerMissionStart)
CREATE_VEHICLE_FOR_REPLAY(vehIndex_MissionReplayRestore, << -590.5827, 250.1880, 81.2377 >>, 266.6357, FALSE, FALSE, FALSE, FALSE, FALSE)
CPRINTLN(DEBUG_MISSION, "* Replay checkpoint * - ", "locate musician in progress")
DO_Z_SKIP(Z_SKIP_ENTER_THE_MUSIC_CLUB)
BREAK
CASE CP_NIGEL1A_LEAVE_THE_AREA
START_REPLAY_SETUP(<<-554.1479, 287.9976, 81.1763>>, 152.3380)
CREATE_VEHICLE_FOR_REPLAY(vehIndex_MissionReplayRestore, << -590.5827, 250.1880, 81.2377 >>, 266.6357, FALSE, FALSE, FALSE, FALSE, FALSE) // set this to the parking lot once possible
bDoneDialogue_MusicianLosesTooth = TRUE //set this dialogue to have already played, because they want the skip to be at the objective instead
bDoneDialogue_MusicianBeginFlee = TRUE // skip this just flee
CPRINTLN(DEBUG_MISSION, "* Replay checkpoint * - ", "leave the area in progress")
DO_Z_SKIP(Z_SKIP_LEAVE_THE_AREA)
BREAK
CASE CP_NIGEL1A_MISSION_PASSED
START_REPLAY_SETUP(<<-462.2627, -156.7760, 37.0557>>, 112.4431)
DO_Z_SKIP(Z_SKIP_MISSION_PASSED)
CPRINTLN(DEBUG_MISSION, "* Replay checkpoint * - ", "mission passed in progress")
BREAK
DEFAULT
SCRIPT_ASSERT("RC - Nigel 1A - replay checkpoint - invalid")
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_VSW")
UPDATE_MISSION_NAME_DISPLAYING(sRCLauncherDataLocal.sIntroCutscene)
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
MISSION_FAILED_CHECKS()
MANAGE_SET_CLUB_DOORS_INITIAL_STATES()
// 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_ENTER_THE_MUSIC_CLUB
ENTER_THE_MUSIC_CLUB()
BREAK
CASE MISSION_STAGE_FIND_CELEB
STAGE_FIND_CELEB()
BREAK
CASE MISSION_STAGE_KNOCK_OUT_TOOTH
STAGE_KNOCK_OUT_TOOTH()
BREAK
CASE MISSION_STAGE_COLLECT_TOOTH
STAGE_COLLECT_TOOTH()
BREAK
CASE MISSION_STAGE_LEAVE_THE_AREA
STAGE_LEAVE_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_SETUP // debug stage
#IF IS_DEBUG_BUILD
DEBUG_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()
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