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