//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 "flow_public_core_override.sch" USING "select_mission_stage.sch" USING "replay_public.sch" USING "CompletionPercentage_public.sch" USING "locates_public.sch" USING "comms_control_public.sch" USING "script_ped.sch" USING "asset_management_public.sch" USING "mission_event_manager.sch" USING "commands_physics.sch" USING "commands_recording.sch" // ENTITIES //----------------------------------------------------------- // Entity lists ENUM MISSION_PED_FLAGS mpf_invalid = -1, mpf_bugstar_foreman_front, mpf_bugstar_foreman_rear, mpf_bugstar_front_1, mpf_bugstar_front_2, mpf_num_peds ENDENUM ENUM MISSION_VEHICLE_FLAGS mvf_invalid = -1, mvf_bugstar_van_1, mvf_bugstar_van_2, mvf_bugstar_van_3, mvf_security, mvf_replay, mvf_num_vehicles ENDENUM ENUM MISSION_OBJECT_FLAGS mof_blank, mof_num_objects ENDENUM ENUM PED_AI_STATES PEDAI_NONE = -1, PEDAI_WORKING, PEDAI_INVESTIGATE, PEDAI_CONFRONTING_PLAYER, PEDAI_COMBAT_PLAYER, PEDAI_HANDSUP, PEDAI_FLEEING, PEDAI_NUM_STATES ENDENUM ENUM PLAYER_STATUS PLAYERSTATUS_NONE = -1, PLAYERSTATUS_BLOCKING_ENTRANCE_ON_FOOT, PLAYERSTATUS_BLOCKING_ENTRANCE_WITH_VEHICLE, PLAYERSTATUS_WAREHOUSE_ON_FOOT, PLAYERSTATUS_WAREHOUSE_IN_VEHICLE, PLAYERSTATUS_ENTRANCE_DITCH_VEH, PLAYERSTATUS_WAREHOUSE_DITCH_VEH, PLAYERSTATUS_VAN_ENTERING, PLAYERSTATUS_VAN_EXITING, PLAYERSTATUS_VAN_DAMAGE, PLAYERSTATUS_VAN_STEALING, PLAYERSTATUS_VAN_STEALING_TOW, PLAYERSTATUS_SEC_CAR_STEALING ENDENUM STRUCT SCRIPT_AI_EVENT MISSION_PED_FLAGS ePedTransmitter TEXT_LABEL_63 strEventName TEXT_LABEL_23 strConvo VECTOR vEventCoord FLOAT fEventRadius INT iTimeOfEvent INT iEventLife INT iEventDelay BOOL bRaiseAlarm BOOL bCalledSecurity ENDSTRUCT // Entity structs STRUCT PED_STRUCT PED_INDEX id TEXT_LABEL_15 strDebugName PED_AI_STATES eAI = PEDAI_WORKING PED_AI_STATES eAIPrev = PEDAI_NONE PED_AI_STATES eAIPrevFrame = PEDAI_NONE BOOL bAIStateChangedLastFrame TEXT_LABEL_31 strAIEvent TEXT_LABEL_31 strAIEventPrev TEXT_LABEL_31 strAIEventPrevFrame BOOL bAIEventChangedLastFrame INT iReceivedEvent = -1 BOOL bDirectEvent = FALSE BOOL bAlarmEvent = FALSE INT iTimeOfEnteringState = -1 INT iTimeOfStateLastSet = -1 BOOL bCanSeePlayer = FALSE INT iCanSeeTimer = 0 BOOL bCanHearPlayer = FALSE FLOAT fEventNoticeRange = 0.0 VECTOR vLastPosPlayerHeardAt INT iFlagTask = 0 INT iFlagState = 0 INT iDiaFlag = 0 BOOL bPlayedConvoStart = FALSE SCRIPT_AI_EVENT sQueuedBroadcastEvent BOOL bAcquaintedPlayer BOOL bThinksPlayerIsPolice BOOL bHasFoughtWithPlayer BOOL bObservedBeingKOd BOOL bReactsToEntrance = FALSE BOOL bReactsToIntrusion = FALSE VECTOR vInvestigationCoord ENTITY_INDEX entityInvestigating = NULL INT iInvestigateTimer = -1 BOOL bDisplayAIBlip = TRUE AI_BLIP_STRUCT sAIBlip BOOL b_BlipsEnemy = FALSE INT iTimeKilled = -1 INT iWarningsToLeaveWarehouse = 0 // Prop spwaning, for scenario mimicing stuff OBJECT_INDEX objProp = NULL PED_BONETAG pedPropHand = BONETAG_NULL MODEL_NAMES propName = DUMMY_MODEL_FOR_SCRIPT BOOL bDropWhenNotInWorkingState = FALSE BOOL bSafeToCreateProp = FALSE ENDSTRUCT STRUCT VEHICLE_STRUCT VEHICLE_INDEX id BLIP_INDEX blip PED_INDEX peds[4] BOOL bAutoCleanup = TRUE ENDSTRUCT // Entity Arrays PED_STRUCT peds[mpf_num_peds] PED_STRUCT pedSecurity VEHICLE_STRUCT vehs[mvf_num_vehicles] OBJECT_INDEX objs[mof_num_objects] // MISSION STAGE ENUMS //------------------------------------------------------------------ ENUM MISSION_FAIL_FLAGS mff_debug_forced, mff_van_dead, mff_vans_dead, mff_van_stuck, mff_van_abandoned, mff_mission_abandoned, mff_default ENDENUM ENUM MISSION_STAGE_FLAGS msf_bugstar_steal, msf_mission_passed, msf_num_mission_stages ENDENUM ENUM MISSION_EVENTS_LIST mef_dialogue, mef_bugstar_staff, mef_security, mef_alarms, mef_music_manager, mef_num_events ENDENUM ENUM PED_INJURED_TYPE INJUREDTYPE_UNARMED = 1, // fist fight INJUREDTYPE_MELEWEAPON = 2, // bats, golf clubs, etc INJUREDTYPE_GUN = 4 // all other weapons ENDENUM // CONSTANTS //--------------------------------------------------------------------- TEXT_LABEL_15 str_Dialogue = "JHP1ADS" TEXT_LABEL_63 str_Alarm = "JEWEL_STORE_HEIST_SETUP_BUGSTAR_ALARMS" VECTOR v_WarehouseCoord = <<154.947784,-3092.523438,4.911984>> CONST_FLOAT ALERT_PED_NEAR_VAN_DIST 5.0 CONST_INT WARNING_LIMIT_STAFF_LEAVE_AREA 5 CONST_INT WARNING_LIMIT_STAFF_LEAVE_VAN 3 CONST_INT WARNING_LIMIT_SEC_LEAVE_AREA 5 CONST_INT WARNING_LIMIT_SEC_LEAVE_VAN 3 CONST_FLOAT VAN_USABLE_RANGE_VAN_FROM_PLAYER 300.0 CONST_FLOAT VAN_USABLE_RANGE_WAREHOUSE_FROM_PLAYER 500.0 CONST_FLOAT PED_CLEANUP_RANGE_PED_FROM_PLAYER 300.0 CONST_FLOAT PED_CLEANUP_RANGE_PED_FROM_WAREHOUSE 300.0 CONST_FLOAT F_CONVO_PLAY_DISTANCE 25.0 TEXT_LABEL_23 str_wpSecurityArrive = "jhp1a_sec_arrive" #IF IS_DEBUG_BUILD CONST_INT I_SPACING 10 #ENDIF // VARIABLES //---------------------------------------------------------------------- // Integral script structure variables INT i_missionStage = enum_to_int(msf_bugstar_steal) INT i_missionSubstage = 0 BOOL b_StageSetup = FALSE BOOL b_DoSkip = FALSE INT i_SkipToStage = 0 BOOL b_MissionFailed = FALSE MISSION_FAIL_FLAGS e_FailReason = mff_default ASSET_MANAGEMENT_DATA s_AssetData LOCATES_HEADER_DATA s_LocatesData MISSION_EVENT_LINK_STRUCT s_Events[mef_num_events] SCRIPT_AI_EVENT s_BroadcastEvent[20] TEXT_LABEL_31 str_AlarmAIEvent structPedsForConversation s_Convo BOOL b_ConvoWasPlayingLastFrame = FALSE INT i_TimeOfLastConvo = -1 REL_GROUP_HASH rel_bugstar SEQUENCE_INDEX seq_main INTERIOR_INSTANCE_INDEX interior_warehouse // Conversation vars MISSION_PED_FLAGS eQueuedConvoSpeaker = mpf_invalid PED_AI_STATES eQueuedConvoPriority = PEDAI_NONE TEXT_LABEL_15 strQueuedConvoRoot = "" TEXT_LABEL_15 strQueuedConvoLine = "" INT iQueuedConvoDelay = 0 FLOAT fQueuedConvoDist = 99999999 BOOL bQueuedConvoInterrupt = FALSE BOOL bQueuedConvoDoNotFinish = FALSE BOOL bQueuedConvoCanBeInterrupted = TRUE BOOL bQueuedConvoKillAtDistance = FALSE BOOL bQueuedConvoStoreForFutureResumption = FALSE MISSION_PED_FLAGS eCurrentConvoSpeaker = mpf_invalid TEXT_LABEL_15 strCurrentConvoRoot = "" PED_AI_STATES eCurrentConvoPriority = PEDAI_NONE BOOL bCurrentConvoCanBeInterruped = TRUE BOOL bCurrentConvoStoreForFutureResumption = FALSE BOOL bCurrentConvoKillAtDistance = FALSE INT iStockCheckListProg MISSION_PED_FLAGS eInterruptedConvoSpeaker = mpf_invalid PED_AI_STATES eInterruptedConvoPriority = PEDAI_NONE TEXT_LABEL_15 strInterruptedConvoRoot = "" TEXT_LABEL_15 strInterruptedConvoLine = "" BOOL bInterruptedConvoCanBeInterrupted = TRUE BOOL bInterruptedConvoKillAtDistance = FALSE // Misison specific vars BOOL bPromptGetBackInVan = TRUE BOOL b_HasPlayerDamagedAVan = FALSE BOOL b_WantedLevelGiven = FALSE BOOL bIsPlayerStillStealth = FALSE INT i_VanDamageTimer = -1 BOOL b_GotWantedAfterStealingVan = FALSE PLAYER_STATUS e_PlayerStatus = PLAYERSTATUS_NONE MISSION_VEHICLE_FLAGS e_PlayersLastVan = mvf_invalid VEHICLE_INDEX veh_TowTruckAttached VEHICLE_INDEX veh_DumpedAtEntrance BOOL bUsingNightScenario SCENARIO_BLOCKING_INDEX sbi_SweatshopBin // Debug #IF IS_DEBUG_BUILD BOOL bDisplayDebug INT iDebugRenderedThisFrame MissionStageMenuTextStruct s_ZMenuStruct[msf_num_mission_stages] WIDGET_GROUP_ID debug_widget #ENDIF //PURPOSE: Performs a entity specific death check on an entity to determine if it is alive FUNC BOOL IS_ENTITY_ALIVE(ENTITY_INDEX entity) IF entity != null AND DOES_ENTITY_EXIST(entity) SWITCH GET_ENTITY_TYPE(entity) CASE ET_PED IF NOT IS_PED_INJURED(GET_PED_INDEX_FROM_ENTITY_INDEX(entity)) RETURN TRUE ENDIF BREAK CASE ET_VEHICLE IF IS_VEHICLE_DRIVEABLE(GET_VEHICLE_INDEX_FROM_ENTITY_INDEX(entity)) RETURN TRUE ENDIF BREAK DEFAULT IF NOT IS_ENTITY_DEAD(entity) RETURN TRUE ENDIF BREAK ENDSWITCH ENDIF RETURN FALSE ENDFUNC FUNC BOOL CAN_PED_SPEAK(PED_INDEX ped) IF NOT IS_ENTITY_ALIVE(ped) OR IS_PED_BEING_STUNNED(ped) OR IS_PED_BEING_STEALTH_KILLED(ped) OR IS_PED_RUNNING_RAGDOLL_TASK(ped) RETURN FALSE ENDIF RETURN TRUE ENDFUNC //PURPOSE: Prints debug output at the specified level within the mision DEBUGONLY PROC PRINT_DEBUG(STRING strMsg, INT debugLevel = 0) IF NOT IS_STRING_NULL_OR_EMPTY(strMsg) AND debugLevel >= 0 AND debugLevel <= 3 #IF IS_DEBUG_BUILD SWITCH debugLevel CASE 0 FALLTHRU DEFAULT CPRINTLN(DEBUG_MISSION, "[***", GET_THIS_SCRIPT_NAME(), "***] ", strMsg) BREAK CASE 1 CDEBUG1LN(DEBUG_MISSION, "[***", GET_THIS_SCRIPT_NAME(), "***] ", strMsg) BREAK CASE 2 CDEBUG2LN(DEBUG_MISSION, "[***", GET_THIS_SCRIPT_NAME(), "***] ", strMsg) BREAK CASE 3 CDEBUG3LN(DEBUG_MISSION, "[***", GET_THIS_SCRIPT_NAME(), "***] ", strMsg) BREAK ENDSWITCH #ENDIF ENDIF ENDPROC #IF IS_DEBUG_BUILD CONST_FLOAT F_DEBUG_SPACING 0.025 PROC DRAW_DEBUG_TEXT_2D_WRAPPED(STRING strDebug, INT iR, INT iG, INT iB, INT iA) DRAW_DEBUG_TEXT_2D(strDebug, <<0.025,0.25+(F_DEBUG_SPACING*iDebugRenderedThisFrame),0>>, iR,iG,iB,iA) iDebugRenderedThisFrame++ ENDPROC PROC RENDER_PED_DEBUG(PED_STRUCT sPed) TEXT_LABEL_63 strDebugText INT i, j // info counter IF DOES_ENTITY_EXIST(sPed.id) //AND NOT IS_PED_INJURED(peds[ePed].id) IF sPed.eAI = PEDAI_INVESTIGATE IF NOT IS_VECTOR_ZERO(sPed.vInvestigationCoord) DRAW_DEBUG_SPHERE(sPed.vInvestigationCoord, 0.2, 0, 255, 0, 255) DRAW_DEBUG_LINE(GET_ENTITY_COORDS(sPed.id, FALSE), sPed.vInvestigationCoord, 0, 0, 255, 255) ENDIF IF DOES_ENTITY_EXIST(sPed.entityInvestigating) DRAW_DEBUG_LINE(GET_ENTITY_COORDS(sPed.id, FALSE), GET_ENTITY_COORDS(sPed.entityInvestigating, FALSE), 0, 255, 0, 255) ENDIF ENDIF // Ped debug name strDebugText = "DebugName: " strDebugText += sPed.strDebugName DRAW_DEBUG_TEXT_WITH_OFFSET(strDebugText, GET_ENTITY_COORDS(sPed.id, FALSE)-<<0,0,1.0>>, 0, j*10, 0,0,0,255) j++ // Render AI state info REPEAT 3 i PED_AI_STATES e_AI SWITCH i CASE 0 strDebugText = "AI(Current): " e_AI = sPed.eAI BREAK CASE 1 strDebugText = "AI(Previous): " e_AI = sPed.eAIPrev BREAK CASE 2 strDebugText = "AI(LastFrame): " e_AI = sPed.eAIPrevFrame BREAK ENDSWITCH SWITCH e_AI CASE PEDAI_NONE strDebugText += "NONE" BREAK CASE PEDAI_WORKING strDebugText += "WORKING" BREAK CASE PEDAI_INVESTIGATE strDebugText += "INVESTIGATE" BREAK CASE PEDAI_CONFRONTING_PLAYER strDebugText += "CONF_PLAYER" BREAK CASE PEDAI_COMBAT_PLAYER strDebugText += "COMBAT" BREAK CASE PEDAI_FLEEING strDebugText += "FLEEING" BREAK CASE PEDAI_HANDSUP strDebugText += "HANDS UP" BREAK ENDSWITCH DRAW_DEBUG_TEXT_WITH_OFFSET(strDebugText, GET_ENTITY_COORDS(sPed.id, FALSE)-<<0,0,1.0>>, 0, j*I_SPACING, 255,0,0,255) j++ ENDREPEAT // AIEvent strDebugText = "AIEvent(Current): " IF NOT IS_STRING_NULL_OR_EMPTY(sPed.strAIEvent) strDebugText += sPed.strAIEvent ENDIF DRAW_DEBUG_TEXT_WITH_OFFSET(strDebugText, GET_ENTITY_COORDS(sPed.id, FALSE)-<<0,0,1.0>>, 0, j*I_SPACING, 255,0,0,255) j++ // AIEvent Prev strDebugText = "AIEvent(Previous): " IF NOT IS_STRING_NULL_OR_EMPTY(sPed.strAIEvent) strDebugText += sPed.strAIEventPrev ENDIF DRAW_DEBUG_TEXT_WITH_OFFSET(strDebugText, GET_ENTITY_COORDS(sPed.id, FALSE)-<<0,0,1.0>>, 0, j*I_SPACING, 255,0,0,255) j++ // AIEvent last frame strDebugText = "AIEvent(LastFrame): " IF NOT IS_STRING_NULL_OR_EMPTY(sPed.strAIEvent) strDebugText += sPed.strAIEventPrevFrame ENDIF DRAW_DEBUG_TEXT_WITH_OFFSET(strDebugText, GET_ENTITY_COORDS(sPed.id, FALSE)-<<0,0,1.0>>, 0, j*I_SPACING, 255,0,0,255) j++ // bDirectEvent strDebugText = "bDirectEvent: " IF sPed.bDirectEvent strDebugText += "TRUE" ELSE strDebugText += "FALSE" ENDIF DRAW_DEBUG_TEXT_WITH_OFFSET(strDebugText, GET_ENTITY_COORDS(sPed.id, FALSE)-<<0,0,1.0>>, 0, j*I_SPACING, 255,0,0,255) j++ // bAlarmEvent strDebugText = "bAlarmEvent: " IF sPed.bAlarmEvent strDebugText += "TRUE" ELSE strDebugText += "FALSE" ENDIF DRAW_DEBUG_TEXT_WITH_OFFSET(strDebugText, GET_ENTITY_COORDS(sPed.id, FALSE)-<<0,0,1.0>>, 0, j*I_SPACING, 255,0,0,255) j++ // Time in state strDebugText = "TimeInState: " strDebugText += GET_STRING_FROM_INT(GET_GAME_TIMER() - sPed.iTimeOfEnteringState) DRAW_DEBUG_TEXT_WITH_OFFSET(strDebugText, GET_ENTITY_COORDS(sPed.id, FALSE)-<<0,0,1.0>>, 0, j*I_SPACING, 0,255,255,255) j++ // Time in state strDebugText = "TimeSinceStateLastSet: " strDebugText += GET_STRING_FROM_INT(GET_GAME_TIMER() - sPed.iTimeOfStateLastSet) DRAW_DEBUG_TEXT_WITH_OFFSET(strDebugText, GET_ENTITY_COORDS(sPed.id, FALSE)-<<0,0,1.0>>, 0, j*I_SPACING, 0,255,255,255) j++ // Reacts to seeing the player hanging around the entrance strDebugText = "Reacts(entrance): " IF sPed.bReactsToEntrance strDebugText += "TRUE" ELSE strDebugText += "FALSE" ENDIF DRAW_DEBUG_TEXT_WITH_OFFSET(strDebugText, GET_ENTITY_COORDS(sPed.id, FALSE)-<<0,0,1.0>>, 0, j*I_SPACING, 0,0,255,255) j++ // Reacts to seeing the player intrude the area strDebugText = "Reacts(intrusion): " IF sPed.bReactsToIntrusion strDebugText += "TRUE" ELSE strDebugText += "FALSE" ENDIF DRAW_DEBUG_TEXT_WITH_OFFSET(strDebugText, GET_ENTITY_COORDS(sPed.id, FALSE)-<<0,0,1.0>>, 0, j*I_SPACING, 0,0,255,255) j++ FLOAT fDot, fAngle VECTOR v1, v2 v1 = NORMALISE_VECTOR( GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(PLAYER_PED_ID(), <<0,1,0>>) - GET_ENTITY_COORDS(PLAYER_PED_ID())) v2 = NORMALISE_VECTOR( GET_ENTITY_COORDS(sPed.id, FALSE) - GET_ENTITY_COORDS(PLAYER_PED_ID())) fDot = DOT_PRODUCT( v1, v2) fAngle = ACOS(fDot) // Angle between ped and player strDebugText = "Angle to player: " strDebugText += GET_STRING_FROM_FLOAT(fAngle) DRAW_DEBUG_TEXT_WITH_OFFSET(strDebugText, GET_ENTITY_COORDS(sPed.id, FALSE)-<<0,0,1.0>>, 0, j*I_SPACING, 0,0,0,255) j++ // Dot product between ped and player strDebugText = "Dot to player: " strDebugText += GET_STRING_FROM_FLOAT(fDot) DRAW_DEBUG_TEXT_WITH_OFFSET(strDebugText, GET_ENTITY_COORDS(sPed.id, FALSE)-<<0,0,1.0>>, 0, j*I_SPACING, 0,0,0,255) j++ // Reacts to seeing the player intrude the area strDebugText = "bObservedBeingKOd: " IF sPed.bObservedBeingKOd strDebugText += "TRUE" ELSE strDebugText += "FALSE" ENDIF DRAW_DEBUG_TEXT_WITH_OFFSET(strDebugText, GET_ENTITY_COORDS(sPed.id, FALSE)-<<0,0,1.0>>, 0, j*I_SPACING, 0,0,0,255) j++ // Peds's state flag strDebugText = "iFlagState: " strDebugText += sPed.iFlagState DRAW_DEBUG_TEXT_WITH_OFFSET(strDebugText, GET_ENTITY_COORDS(sPed.id, FALSE)-<<0,0,1.0>>, 0, j*I_SPACING, 0,0,0,255) j++ // Peds's task flag strDebugText = "iFlagTask: " strDebugText += sPed.iFlagTask DRAW_DEBUG_TEXT_WITH_OFFSET(strDebugText, GET_ENTITY_COORDS(sPed.id, FALSE)-<<0,0,1.0>>, 0, j*I_SPACING, 0,0,0,255) j++ // Peds's dialogue flag strDebugText = "iDiaFlag: " strDebugText += sPed.iDiaFlag DRAW_DEBUG_TEXT_WITH_OFFSET(strDebugText, GET_ENTITY_COORDS(sPed.id, FALSE)-<<0,0,1.0>>, 0, j*I_SPACING, 0,0,0,255) j++ // Wanrings to leave warehouse strDebugText = "iWarningsToLeaveWarehouse: " strDebugText += sPed.iWarningsToLeaveWarehouse DRAW_DEBUG_TEXT_WITH_OFFSET(strDebugText, GET_ENTITY_COORDS(sPed.id, FALSE)-<<0,0,1.0>>, 0, j*I_SPACING, 0,0,0,255) j++ ENDIF ENDPROC #ENDIF FUNC BOOL CAN_PED_SEE_THIS_PED_IS_DEAD(PED_STRUCT sObserver, PED_STRUCT sVictim, BOOL &bKilledInFrontOfObserver, BOOL &bSawPlayerDoIt, BOOL &bNonLethal) CONST_FLOAT F_BODY_NOTICE_DIST 10.0 IF DOES_ENTITY_EXIST(sVictim.id) AND IS_PED_INJURED(sVictim.id) // Can the ped see this dead body VECTOR vDeadBody = GET_ENTITY_COORDS(sVictim.id, FALSE) IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(sObserver.id), vDeadBody) < F_BODY_NOTICE_DIST IF HAS_ENTITY_CLEAR_LOS_TO_ENTITY_IN_FRONT(sObserver.id, sVictim.id) // Look at how longer ago the ped was killed to decide if the observer saw the incident happen IF GET_GAME_TIMER() - sVictim.iTimeKilled < 3000 // Saw it happen! bKilledInFrontOfObserver = TRUE ELSE // Came across body bKilledInFrontOfObserver = FALSE ENDIF // If the ped was killed infront of the observer check if it was the player who killed the ped // and that they can see the player IF bKilledInFrontOfObserver ENTITY_INDEX tempEntity = GET_PED_SOURCE_OF_DEATH(sVictim.id) IF IS_ENTITY_A_PED(tempEntity) PED_INDEX pedAttacker = GET_PED_INDEX_FROM_ENTITY_INDEX(tempEntity) IF pedAttacker = PLAYER_PED_ID() AND NOT IS_PED_INJURED(pedAttacker) AND sObserver.bCanSeePlayer bSawPlayerDoIt = TRUE ELSE bSawPlayerDoIt = FALSE ENDIF ELSE bSawPlayerDoIt = FALSE ENDIF ELSE bSawPlayerDoIt = FALSE ENDIF // Check to see if the ped was taken down none lethally WEAPON_TYPE eWeaponType = GET_PED_CAUSE_OF_DEATH(sVictim.id) IF eWeaponType = WEAPONTYPE_UNARMED OR (eWeaponType != WEAPONTYPE_UNARMED AND GET_WEAPON_DAMAGE_TYPE(eWeaponType) = DAMAGE_TYPE_MELEE) bNonLethal = TRUE ENDIF RETURN TRUE ENDIF ENDIF ENDIF RETURN FALSE ENDFUNC FUNC BOOL CAN_PED_SEE_DEAD_BODY(PED_STRUCT observer, BOOL &bKilledInfrontOfObserver, BOOL &bSawPlayerDoIt, BOOL &bNonLethal) MISSION_PED_FLAGS ePed BOOL bHasSeenABody BOOL bKIFOO BOOL bSPDI BOOL bNL REPEAT COUNT_OF(peds) ePed IF CAN_PED_SEE_THIS_PED_IS_DEAD(observer, peds[ePed], bKIFOO, bSPDI, bNL) // knocked out infront of an observer, flag being seen KOd so not to generate "dead_body" event IF bKIFOO AND bNL peds[ePed].bObservedBeingKOd = TRUE ENDIF IF NOT bHasSeenABody bHasSeenABody = TRUE bKilledInfrontOfObserver = bKIFOO bSawPlayerDoIt = bSPDI bNonLethal = bNL ELSE IF bKIFOO bKilledInfrontOfObserver = TRUE ENDIF IF bSPDI bSawPlayerDoIt = TRUE ENDIF IF bNL bNonLethal = TRUE ENDIF ENDIF // Not seen killed by this observer, but has been by another before, then force it to be non leathal // as not to generate "dead_body" found event IF peds[ePed].bObservedBeingKOd bSawPlayerDoIt = TRUE ENDIF ENDIF ENDREPEAT IF bHasSeenABody RETURN TRUE ELSE bKilledInfrontOfObserver = FALSE bSawPlayerDoIt = FALSE bNonLethal = FALSE RETURN FALSE ENDIF ENDFUNC FUNC BOOL CAN_PED_SEE_THIS_PED_BEING_ATTACKED(PED_STRUCT sObserver, PED_STRUCT sVictim, BOOL bIncludeVehicle) CONST_FLOAT F_ATTACK_NOTICE_DIST 15.0 // url:bugstar:2109487 IF DOES_ENTITY_EXIST(sVictim.id) AND HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(sVictim.id, PLAYER_PED_ID(), bIncludeVehicle) IF GET_DISTANCE_BETWEEN_ENTITIES(sObserver.id, sVictim.id) < F_ATTACK_NOTICE_DIST IF HAS_ENTITY_CLEAR_LOS_TO_ENTITY_IN_FRONT(sObserver.id, sVictim.id) RETURN TRUE ENDIF ENDIF ENDIF RETURN FALSE ENDFUNC FUNC BOOL CAN_PED_SEE_A_PED_BEING_ATTACKED(PED_STRUCT sObserve, BOOL bIncludeVehicle) MISSION_PED_FLAGS ePed REPEAT COUNT_OF(peds) ePed IF CAN_PED_SEE_THIS_PED_BEING_ATTACKED(sObserve, peds[ePed], bIncludeVehicle) RETURN TRUE ENDIF ENDREPEAT RETURN FALSE ENDFUNC FUNC BOOL IS_PLAYER_AIMING(INT iWeaponFlags) IF IS_PED_ARMED(PLAYER_PED_ID(), iWeaponFlags) AND (IS_PLAYER_FREE_AIMING(PLAYER_ID()) OR IS_PLAYER_TARGETTING_ANYTHING(PLAYER_ID())) RETURN TRUE ENDIF RETURN FALSE ENDFUNC FUNC BOOL IS_PLAYER_AIMING_AT_PED(PED_STRUCT sPed, INT iWeaponFlags) IF sPed.id != null AND DOES_ENTITY_EXIST(sPed.id) AND NOT IS_PED_INJURED(sPed.id) IF IS_PED_ARMED(PLAYER_PED_ID(), iWeaponFlags) AND (IS_PLAYER_FREE_AIMING_AT_ENTITY(PLAYER_ID(), sPed.id) OR IS_PLAYER_TARGETTING_ENTITY(PLAYER_ID(), sPed.id)) RETURN TRUE ENDIF ENDIF RETURN FALSE ENDFUNC FUNC BOOL PREPARE_INITIAL_SCENE(BOOL bGrabFromTriggerScene) BOOL bAssetMissingEntities = FALSE BOOL bReady = TRUE IF bGrabFromTriggerScene //>>>>>>>> VANS <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< // Van inside left of the front entrance IF DOES_ENTITY_EXIST(g_sTriggerSceneAssets.veh[0]) vehs[mvf_bugstar_van_1].id = g_sTriggerSceneAssets.veh[0] SET_ENTITY_AS_MISSION_ENTITY(vehs[mvf_bugstar_van_1].id, TRUE, TRUE) ELSE PRINT_DEBUG("[ERROR] g_sTriggerSceneAssets.veh[0] not found", 1) bAssetMissingEntities = TRUE ENDIF // Van inside right of the entrance IF DOES_ENTITY_EXIST(g_sTriggerSceneAssets.veh[1]) vehs[mvf_bugstar_van_2].id = g_sTriggerSceneAssets.veh[1] SET_ENTITY_AS_MISSION_ENTITY(vehs[mvf_bugstar_van_2].id, TRUE, TRUE) ELSE PRINT_DEBUG("[ERROR] g_sTriggerSceneAssets.veh[1] not found", 0) bAssetMissingEntities = TRUE ENDIF //Van inside middle with ped around the back IF DOES_ENTITY_EXIST(g_sTriggerSceneAssets.veh[2]) vehs[mvf_bugstar_van_3].id = g_sTriggerSceneAssets.veh[2] SET_ENTITY_AS_MISSION_ENTITY(vehs[mvf_bugstar_van_3].id, TRUE, TRUE) ELSE PRINT_DEBUG("[ERROR] g_sTriggerSceneAssets.veh[2] not found", 0) bAssetMissingEntities = TRUE ENDIF //>>>>> BUGSTAR STAFF <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< // Ped standing the back of the van IF DOES_ENTITY_EXIST(g_sTriggerSceneAssets.ped[0]) peds[mpf_bugstar_foreman_rear].id = g_sTriggerSceneAssets.ped[0] IF NOT IS_PED_INJURED( peds[mpf_bugstar_foreman_rear].id ) SET_ENTITY_LOAD_COLLISION_FLAG(peds[mpf_bugstar_foreman_rear].id, FALSE) ENDIF SET_ENTITY_AS_MISSION_ENTITY(peds[mpf_bugstar_foreman_rear].id, TRUE, TRUE) ELSE PRINT_DEBUG("[ERROR] g_sTriggerSceneAssets.ped[0] not found", 0) bAssetMissingEntities = TRUE ENDIF IF DOES_ENTITY_EXIST(g_sTriggerSceneAssets.object[0]) peds[mpf_bugstar_foreman_rear].objProp = g_sTriggerSceneAssets.object[0] SET_ENTITY_AS_MISSION_ENTITY(peds[mpf_bugstar_foreman_rear].objProp, TRUE, TRUE) ELSE PRINT_DEBUG("[ERROR] g_sTriggerSceneAssets.object[0] not found", 0) bAssetMissingEntities = TRUE ENDIF // Ped standing at the front entrance acting as site manager IF DOES_ENTITY_EXIST(g_sTriggerSceneAssets.ped[2]) peds[mpf_bugstar_foreman_front].id = g_sTriggerSceneAssets.ped[2] IF NOT IS_PED_INJURED( peds[mpf_bugstar_foreman_front].id ) SET_ENTITY_LOAD_COLLISION_FLAG(peds[mpf_bugstar_foreman_front].id, FALSE) ENDIF SET_ENTITY_AS_MISSION_ENTITY(peds[mpf_bugstar_foreman_front].id, TRUE, TRUE) ELSE PRINT_DEBUG("g_sTriggerSceneAssets.ped[2] not found", 0) bAssetMissingEntities = TRUE ENDIF // 1st ped at the front to the right of the entrance IF DOES_ENTITY_EXIST(g_sTriggerSceneAssets.ped[3]) peds[mpf_bugstar_front_1].id = g_sTriggerSceneAssets.ped[3] IF NOT IS_PED_INJURED( peds[mpf_bugstar_front_2].id ) SET_ENTITY_LOAD_COLLISION_FLAG(peds[mpf_bugstar_front_1].id, FALSE) ENDIF SET_ENTITY_AS_MISSION_ENTITY(peds[mpf_bugstar_front_1].id, TRUE, TRUE) ELSE PRINT_DEBUG("g_sTriggerSceneAssets.ped[3] not found", 0) bAssetMissingEntities = TRUE ENDIF // 2nd ped at the front to the right of the entrance IF DOES_ENTITY_EXIST(g_sTriggerSceneAssets.ped[4]) peds[mpf_bugstar_front_2].id = g_sTriggerSceneAssets.ped[4] IF NOT IS_PED_INJURED( peds[mpf_bugstar_front_2].id ) SET_ENTITY_LOAD_COLLISION_FLAG(peds[mpf_bugstar_front_2].id, FALSE) ENDIF SET_ENTITY_AS_MISSION_ENTITY(peds[mpf_bugstar_front_2].id, TRUE, TRUE) ELSE PRINT_DEBUG("g_sTriggerSceneAssets.ped[4] not found", 0) bAssetMissingEntities = TRUE ENDIF //>>>>> SECURITY GUARD & VEHICLE <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< IF DOES_ENTITY_EXIST(g_sTriggerSceneAssets.ped[5]) pedSecurity.id = g_sTriggerSceneAssets.ped[5] IF NOT IS_PED_INJURED( pedSecurity.id ) SET_ENTITY_LOAD_COLLISION_FLAG(pedSecurity.id, FALSE) ENDIF SET_ENTITY_AS_MISSION_ENTITY(pedSecurity.id, TRUE, TRUE) ELSE PRINT_DEBUG("g_sTriggerSceneAssets.ped[5] not found", 0) bAssetMissingEntities = TRUE ENDIF IF DOES_ENTITY_EXIST(g_sTriggerSceneAssets.veh[3]) vehs[mvf_security].id = g_sTriggerSceneAssets.veh[3] SET_ENTITY_AS_MISSION_ENTITY(vehs[mvf_security].id, TRUE, TRUE) ELSE PRINT_DEBUG("g_sTriggerSceneAssets.veh[3] not found", 0) bAssetMissingEntities = TRUE ENDIF ELSE // Manually create the entities IF NOT DOES_ENTITY_EXIST(vehs[mvf_bugstar_van_1].id) vehs[mvf_bugstar_van_1].id = CREATE_VEHICLE(BURRITO2, <<148.7243, -3104.6189, 4.8962>>, 179.6158) ENDIF IF NOT DOES_ENTITY_EXIST(vehs[mvf_bugstar_van_2].id) vehs[mvf_bugstar_van_2].id = CREATE_VEHICLE(BURRITO2, <<145.9856, -3080.0000, 4.8962>>, 269.0827) ENDIF IF NOT DOES_ENTITY_EXIST(vehs[mvf_bugstar_van_3].id) vehs[mvf_bugstar_van_3].id = CREATE_VEHICLE(BURRITO2, <<129.9696, -3089.3313, 4.8796>>, 269.9255) ENDIF IF NOT DOES_ENTITY_EXIST(peds[mpf_bugstar_foreman_rear].id) peds[mpf_bugstar_foreman_rear].id = CREATE_PED(PEDTYPE_MISSION, S_M_Y_PESTCONT_01, <<126.2174, -3089.3833, 4.9199>>, 275.4068) SET_ENTITY_HEALTH(peds[mpf_bugstar_foreman_rear].id, 150) SET_PED_COMPONENT_VARIATION(peds[mpf_bugstar_foreman_rear].id, PED_COMP_SPECIAL, 1, 0) SET_PED_COMPONENT_VARIATION(peds[mpf_bugstar_foreman_rear].id, PED_COMP_HEAD, 0, 2) SET_PED_COMPONENT_VARIATION(peds[mpf_bugstar_foreman_rear].id, PED_COMP_TORSO, 0, 1) SET_PED_COMPONENT_VARIATION(peds[mpf_bugstar_foreman_rear].id, PED_COMP_LEG, 0, 1) SET_PED_COMPONENT_VARIATION(peds[mpf_bugstar_foreman_rear].id, PED_COMP_SPECIAL, 0, 0) SET_PED_COMPONENT_VARIATION(peds[mpf_bugstar_foreman_rear].id, PED_COMP_DECL, 1, 0) SET_PED_PROP_INDEX(peds[mpf_bugstar_foreman_rear].id, ANCHOR_HEAD, 1) SET_PED_PROP_INDEX(peds[mpf_bugstar_foreman_rear].id, ANCHOR_EYES, 0) SET_PED_LOD_MULTIPLIER(peds[mpf_bugstar_foreman_rear].id, 2.0) ENDIF IF NOT DOES_ENTITY_EXIST(peds[mpf_bugstar_foreman_rear].objProp) peds[mpf_bugstar_foreman_rear].objProp = CREATE_OBJECT(P_AMB_CLIPBOARD_01, GET_PED_BONE_COORDS(peds[mpf_bugstar_foreman_rear].id, BONETAG_PH_L_HAND, <<0,0,0>>)) ATTACH_ENTITY_TO_ENTITY(peds[mpf_bugstar_foreman_rear].objProp, peds[mpf_bugstar_foreman_rear].id, GET_PED_BONE_INDEX(peds[mpf_bugstar_foreman_rear].id, BONETAG_PH_L_HAND), <<0,0,0>>, <<0,0,0>>, TRUE, TRUE, TRUE) ENDIF IF NOT DOES_ENTITY_EXIST(peds[mpf_bugstar_foreman_front].id) peds[mpf_bugstar_foreman_front].id = CREATE_PED(PEDTYPE_MISSION, S_M_Y_PESTCONT_01, <<155.74, -3098.89, 5.93>>) SET_PED_COMPONENT_VARIATION(peds[mpf_bugstar_foreman_front].id, PED_COMP_HEAD, 0, 0) SET_PED_COMPONENT_VARIATION(peds[mpf_bugstar_foreman_front].id, PED_COMP_TORSO, 0, 0) SET_PED_COMPONENT_VARIATION(peds[mpf_bugstar_foreman_front].id, PED_COMP_LEG, 0, 0) SET_PED_COMPONENT_VARIATION(peds[mpf_bugstar_foreman_front].id, PED_COMP_SPECIAL, 1, 0) SET_PED_COMPONENT_VARIATION(peds[mpf_bugstar_foreman_front].id, PED_COMP_DECL, 0, 0) SET_PED_PROP_INDEX(peds[mpf_bugstar_foreman_front].id, ANCHOR_HEAD, 0) SET_PED_LOD_MULTIPLIER(peds[mpf_bugstar_foreman_front].id, 2.0) ENDIF IF NOT DOES_ENTITY_EXIST(peds[mpf_bugstar_front_1].id) peds[mpf_bugstar_front_1].id = CREATE_PED(PEDTYPE_MISSION, S_M_Y_PESTCONT_01, <<159.80, -3085.96, 6.00>>) SET_PED_COMPONENT_VARIATION(peds[mpf_bugstar_front_1].id, PED_COMP_HEAD, 0, 1) SET_PED_COMPONENT_VARIATION(peds[mpf_bugstar_front_1].id, PED_COMP_TORSO, 0, 2) SET_PED_COMPONENT_VARIATION(peds[mpf_bugstar_front_1].id, PED_COMP_LEG, 0, 2) SET_PED_COMPONENT_VARIATION(peds[mpf_bugstar_front_1].id, PED_COMP_SPECIAL, 1, 0) SET_PED_COMPONENT_VARIATION(peds[mpf_bugstar_front_1].id, PED_COMP_DECL, 1, 0) SET_PED_PROP_INDEX(peds[mpf_bugstar_front_1].id, ANCHOR_EYES, 0) SET_PED_LOD_MULTIPLIER(peds[mpf_bugstar_front_1].id, 2.0) ENDIF IF NOT DOES_ENTITY_EXIST(peds[mpf_bugstar_front_2].id) peds[mpf_bugstar_front_2].id = CREATE_PED(PEDTYPE_MISSION, S_M_Y_PESTCONT_01, <<159.06, -3085.00, 6.01>>) SET_PED_COMPONENT_VARIATION(peds[mpf_bugstar_front_2].id, PED_COMP_HEAD, 1, 1) SET_PED_COMPONENT_VARIATION(peds[mpf_bugstar_front_2].id, PED_COMP_TORSO, 0, 3) SET_PED_COMPONENT_VARIATION(peds[mpf_bugstar_front_2].id, PED_COMP_LEG, 0, 3) SET_PED_COMPONENT_VARIATION(peds[mpf_bugstar_front_2].id, PED_COMP_SPECIAL, 1, 0) SET_PED_COMPONENT_VARIATION(peds[mpf_bugstar_front_2].id, PED_COMP_DECL, 0, 0) SET_PED_PROP_INDEX(peds[mpf_bugstar_front_2].id, ANCHOR_HEAD, 0) SET_PED_LOD_MULTIPLIER(peds[mpf_bugstar_front_2].id, 2.0) ENDIF IF NOT DOES_ENTITY_EXIST(pedSecurity.id) AND NOT DOES_ENTITY_EXIST(vehs[mvf_security].id) IF GET_CLOCK_HOURS() >= 5 AND GET_CLOCK_HOURS() < 21 vehs[mvf_security].id = CREATE_VEHICLE(DILETTANTE2, <<144.84, -2982.75, 5.32>>, 266.5972) pedSecurity.id = CREATE_PED_INSIDE_VEHICLE(vehs[mvf_security].id, PEDTYPE_MISSION, S_M_M_SECURITY_01, VS_DRIVER) ELSE vehs[mvf_security].id = CREATE_VEHICLE(DILETTANTE2, <<169.3554, -3110.0254, 4.8228>>, 88.4411) pedSecurity.id = CREATE_PED(PEDTYPE_MISSION, S_M_M_SECURITY_01, <<161.7414, -3117.0742, 4.9643>>, 333.7041) //<<162.69, -3115.67, 4.95>>, 3.5948) ENDIF ENDIF ENDIF // Van inside left of the front entrance IF DOES_ENTITY_EXIST(vehs[mvf_bugstar_van_1].id) SET_VEHICLE_AS_RESTRICTED(vehs[mvf_bugstar_van_1].id, 0) SET_VEHICLE_DOORS_LOCKED(vehs[mvf_bugstar_van_1].id, VEHICLELOCK_LOCKED_BUT_CAN_BE_DAMAGED) SET_VEHICLE_ALARM(vehs[mvf_bugstar_van_1].id, TRUE) SET_VEHICLE_HAS_STRONG_AXLES(vehs[mvf_bugstar_van_1].id, TRUE) vehs[mvf_bugstar_van_1].bAutoCleanup = FALSE // SET_VEHICLE_DISABLE_TOWING(vehs[mvf_bugstar_van_1].id, TRUE) ENDIF // Van inside right of the front entrance IF DOES_ENTITY_EXIST(vehs[mvf_bugstar_van_2].id) SET_VEHICLE_AS_RESTRICTED(vehs[mvf_bugstar_van_2].id, 1) SET_VEHICLE_ENGINE_ON(vehs[mvf_bugstar_van_2].id, TRUE, TRUE) SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(vehs[mvf_bugstar_van_2].id, SC_DOOR_BONNET, FALSE) SET_VEHICLE_DOOR_OPEN(vehs[mvf_bugstar_van_2].id, SC_DOOR_FRONT_LEFT, TRUE, FALSE) SET_VEHICLE_DOOR_OPEN(vehs[mvf_bugstar_van_2].id, SC_DOOR_BONNET, FALSE, TRUE) SET_VEHICLE_HAS_STRONG_AXLES(vehs[mvf_bugstar_van_2].id, TRUE) vehs[mvf_bugstar_van_2].bAutoCleanup = FALSE // SET_VEHICLE_DISABLE_TOWING(vehs[mvf_bugstar_van_2].id, TRUE) ENDIF // Van in the middle with ped around the back IF DOES_ENTITY_EXIST(vehs[mvf_bugstar_van_3].id) SET_VEHICLE_AS_RESTRICTED(vehs[mvf_bugstar_van_3].id, 2) SET_VEHICLE_DOOR_OPEN(vehs[mvf_bugstar_van_3].id, SC_DOOR_REAR_LEFT, TRUE, FALSE) SET_VEHICLE_DOOR_OPEN(vehs[mvf_bugstar_van_3].id, SC_DOOR_REAR_RIGHT, TRUE, FALSE) SET_VEHICLE_HAS_STRONG_AXLES(vehs[mvf_bugstar_van_3].id, TRUE) vehs[mvf_bugstar_van_3].bAutoCleanup = FALSE // SET_VEHICLE_DISABLE_TOWING(vehs[mvf_bugstar_van_3].id, TRUE) ENDIF // Ped at the back of the van IF DOES_ENTITY_EXIST(peds[mpf_bugstar_foreman_rear].id) SET_PED_NAME_DEBUG(peds[mpf_bugstar_foreman_rear].id, peds[mpf_bugstar_foreman_rear].strDebugName) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(peds[mpf_bugstar_foreman_rear].id, TRUE) SET_PED_RELATIONSHIP_GROUP_HASH(peds[mpf_bugstar_foreman_rear].id, rel_bugstar) STOP_PED_SPEAKING(peds[mpf_bugstar_foreman_rear].id, TRUE) SET_PED_VISUAL_FIELD_PROPERTIES(peds[mpf_bugstar_foreman_rear].id, 20, 5, 90, -90, 90) SET_PED_HEARING_RANGE(peds[mpf_bugstar_foreman_rear].id, 50.0) peds[mpf_bugstar_foreman_rear].strDebugName = "foreman2(rear)" peds[mpf_bugstar_foreman_rear].fEventNoticeRange = 20.0 peds[mpf_bugstar_foreman_rear].bReactsToEntrance = TRUE peds[mpf_bugstar_foreman_rear].bReactsToIntrusion = TRUE peds[mpf_bugstar_foreman_rear].propName = P_AMB_CLIPBOARD_01 peds[mpf_bugstar_foreman_rear].pedPropHand = BONETAG_PH_L_HAND peds[mpf_bugstar_foreman_rear].bDropWhenNotInWorkingState = FALSE ENDIF // foreman IF DOES_ENTITY_EXIST(peds[mpf_bugstar_foreman_front].id) SET_PED_NAME_DEBUG(peds[mpf_bugstar_foreman_front].id, peds[mpf_bugstar_foreman_front].strDebugName) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(peds[mpf_bugstar_foreman_front].id, TRUE) SET_PED_RELATIONSHIP_GROUP_HASH(peds[mpf_bugstar_foreman_front].id, rel_bugstar) STOP_PED_SPEAKING(peds[mpf_bugstar_foreman_front].id, TRUE) SET_PED_VISUAL_FIELD_PROPERTIES(peds[mpf_bugstar_foreman_front].id, 17.5, 10.0, 120, -90, 90) SET_PED_HEARING_RANGE(peds[mpf_bugstar_foreman_front].id, 50.0) peds[mpf_bugstar_foreman_front].strDebugName = "foreman1(front)" peds[mpf_bugstar_foreman_front].bReactsToEntrance = TRUE peds[mpf_bugstar_foreman_front].bReactsToIntrusion = TRUE peds[mpf_bugstar_foreman_front].fEventNoticeRange = 17.5 ENDIF // 1st ped at the front to the right of the entrance IF DOES_ENTITY_EXIST(peds[mpf_bugstar_front_1].id) SET_PED_NAME_DEBUG(peds[mpf_bugstar_front_1].id, peds[mpf_bugstar_front_1].strDebugName) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(peds[mpf_bugstar_front_1].id, TRUE) SET_PED_RELATIONSHIP_GROUP_HASH(peds[mpf_bugstar_front_1].id, rel_bugstar) SET_PED_VISUAL_FIELD_PROPERTIES(peds[mpf_bugstar_front_1].id, 20, 5, 90, -90, 90) STOP_PED_SPEAKING(peds[mpf_bugstar_front_1].id, TRUE) SET_PED_HEARING_RANGE(peds[mpf_bugstar_front_1].id, 50.0) peds[mpf_bugstar_front_1].strDebugName = "front 1" peds[mpf_bugstar_front_1].bReactsToEntrance = FALSE peds[mpf_bugstar_front_1].bReactsToIntrusion = FALSE peds[mpf_bugstar_front_1].fEventNoticeRange = 17.5 ENDIF // 2nd ped at the front to the right of the entrance IF DOES_ENTITY_EXIST(peds[mpf_bugstar_front_2].id) SET_PED_NAME_DEBUG(peds[mpf_bugstar_front_2].id, peds[mpf_bugstar_front_2].strDebugName) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(peds[mpf_bugstar_front_2].id, TRUE) SET_PED_RELATIONSHIP_GROUP_HASH(peds[mpf_bugstar_front_2].id, rel_bugstar) SET_PED_HEARING_RANGE(peds[mpf_bugstar_front_2].id, 50.0) SET_PED_VISUAL_FIELD_PROPERTIES(peds[mpf_bugstar_front_2].id, 20, 5, 90, -90, 90) STOP_PED_SPEAKING(peds[mpf_bugstar_front_2].id, TRUE) peds[mpf_bugstar_front_2].strDebugName = "front 2" peds[mpf_bugstar_front_2].bReactsToEntrance = FALSE peds[mpf_bugstar_front_2].bReactsToIntrusion = FALSE peds[mpf_bugstar_front_2].fEventNoticeRange = 17.5 ENDIF // Security ped and his vehicle IF DOES_ENTITY_EXIST(pedSecurity.id) AND DOES_ENTITY_EXIST(vehs[mvf_security].id) SET_PED_NAME_DEBUG(pedSecurity.id, pedSecurity.strDebugName) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedSecurity.id, TRUE) // SET_PED_RELATIONSHIP_GROUP_HASH(pedSecurity.id, RELGROUPHASH_SECURITY_GUARD) SET_PED_RELATIONSHIP_GROUP_HASH(pedSecurity.id, rel_bugstar) // SET_PED_AS_COP(pedSecurity.id) SET_PED_TARGET_LOSS_RESPONSE(pedSecurity.id, TLR_SEARCH_FOR_TARGET) SET_PED_COMBAT_ATTRIBUTES(pedSecurity.id, CA_DO_DRIVEBYS, FALSE) GIVE_WEAPON_TO_PED(pedSecurity.id, WEAPONTYPE_NIGHTSTICK, INFINITE_AMMO, FALSE, TRUE) SET_PED_ACCURACY(pedSecurity.id, 5) SET_PED_VISUAL_FIELD_PROPERTIES(pedSecurity.id, 40, 5, 90, -90, 90) // STOP_PED_SPEAKING(pedSecurity.id, TRUE) pedSecurity.strDebugName = "sec" pedSecurity.bReactsToEntrance = TRUE pedSecurity.bReactsToIntrusion = TRUE pedSecurity.bDisplayAIBlip = FALSE IF g_sTriggerSceneAssets.flag = TRUE IF NOT IS_SCRIPT_TASK_RUNNING_OR_STARTING(pedSecurity.id, SCRIPT_TASK_PERFORM_SEQUENCE) IF DOES_SCENARIO_OF_TYPE_EXIST_IN_AREA(<<203.68, -3132.46, 4.79>>, "WORLD_HUMAN_SMOKING", 1.0, TRUE) bUsingNightScenario = FALSE SEQUENCE_INDEX seq OPEN_SEQUENCE_TASK(seq) TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING(null, vehs[mvf_security].id, str_wpSecurityArrive, DRIVINGMODE_AVOIDCARS_STOPFORPEDS_OBEYLIGHTS) TASK_LEAVE_VEHICLE(null, vehs[mvf_security].id) TASK_USE_NEAREST_SCENARIO_TO_COORD(null, <<203.68, -3132.46, 4.79>>, 1.0) CLOSE_SEQUENCE_TASK(seq) TASK_PERFORM_SEQUENCE(pedSecurity.id, seq) CLEAR_SEQUENCE_TASK(seq) ELSE CDEBUG1LN(DEBUG_MIKE, "SCENARIO: WORLD_HUMAN_SMOKING not ready") bReady = FALSE ENDIF ENDIF ELSE IF NOT IS_SCRIPT_TASK_RUNNING_OR_STARTING(pedSecurity.id, SCRIPT_TASK_USE_NEAREST_SCENARIO_CHAIN_TO_POS) IF DOES_SCENARIO_OF_TYPE_EXIST_IN_AREA(<<162.69, -3115.67, 4.95>>, "WORLD_HUMAN_SECURITY_SHINE_TORCH", 1.0, TRUE) bUsingNightScenario = TRUE TASK_USE_NEAREST_SCENARIO_CHAIN_TO_COORD_WARP(pedSecurity.id, <<162.69, -3115.67, 4.95>>, 1.0) ELSE CDEBUG1LN(DEBUG_MIKE, "SCENARIO: WORLD_HUMAN_SECURITY_SHINE_TORCH not ready") bReady = FALSE ENDIF ENDIF ENDIF ENDIF IF DOES_ENTITY_EXIST(vehs[mvf_bugstar_van_1].id) AND DOES_ENTITY_EXIST(vehs[mvf_bugstar_van_2].id) AND DOES_ENTITY_EXIST(vehs[mvf_bugstar_van_3].id) AND DOES_ENTITY_EXIST(vehs[mvf_security].id) AND DOES_ENTITY_EXIST(peds[mpf_bugstar_foreman_rear].id) AND DOES_ENTITY_EXIST(peds[mpf_bugstar_foreman_front].id) AND DOES_ENTITY_EXIST(peds[mpf_bugstar_front_1].id) AND DOES_ENTITY_EXIST(peds[mpf_bugstar_front_2].id) AND DOES_ENTITY_EXIST(pedSecurity.id) AND bReady // Grabbed everything //MISSION_FLOW_RELEASE_TRIGGER_SCENE_ASSETS(SP_HEIST_JEWELRY_PREP_1A) RETURN TRUE ELIF bAssetMissingEntities SCRIPT_ASSERT("Unable to grab all trigger scene entities") RETURN FALSE ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// Checks if the player has gotten into one of the bugstar vans. /// RETURNS: /// Returns TRUE if the player has gotten into one of the bugstar vans FUNC BOOL IS_PLAYER_IN_VAN() IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID(), FALSE) MISSION_VEHICLE_FLAGS eVan FOR eVan = mvf_bugstar_van_1 TO mvf_bugstar_van_3 IF DOES_ENTITY_EXIST(vehs[eVan].id) AND IS_VEHICLE_DRIVEABLE(vehs[eVan].id) // otherwise check if they are in that van IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehs[eVan].id, FALSE) RETURN TRUE ENDIF ENDIF ENDFOR ENDIF RETURN FALSE ENDFUNC FUNC BOOL IS_PLAYER_ENTERING_VAN() IF IS_PED_GETTING_INTO_A_VEHICLE(PLAYER_PED_ID()) MISSION_VEHICLE_FLAGS eVan FOR eVan = mvf_bugstar_van_1 TO mvf_bugstar_van_3 IF DOES_ENTITY_EXIST(vehs[eVan].id) AND IS_VEHICLE_DRIVEABLE(vehs[eVan].id) AND GET_VEHICLE_PED_IS_ENTERING(PLAYER_PED_ID()) = vehs[eVan].id RETURN TRUE ENDIF ENDFOR ENDIF RETURN FALSE ENDFUNC FUNC BOOL IS_PLAYER_EXITING_VAN() //IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID(), TRUE) IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID(), TRUE) AND NOT IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID()) AND NOT IS_PED_GETTING_INTO_A_VEHICLE(PLAYER_PED_ID()) //AND GET_IS_TASK_ACTIVE(PLAYER_PED_ID(), CODE_TASK_EXIT_VEHICLE) MISSION_VEHICLE_FLAGS eVan FOR eVan = mvf_bugstar_van_1 TO mvf_bugstar_van_3 IF DOES_ENTITY_EXIST(vehs[eVan].id) AND IS_VEHICLE_DRIVEABLE(vehs[eVan].id) IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehs[eVan].id, TRUE) RETURN TRUE ENDIF ENDIF ENDFOR ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// Determines if the player is in a tow truck /// RETURNS: /// Returns TRUE if so FUNC BOOL IS_PLAYER_IN_A_TOW_TRUCK() IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) VEHICLE_INDEX vehTemp vehTemp = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()) IF IS_VEHICLE_DRIVEABLE(vehTemp) AND (GET_ENTITY_MODEL(vehTemp) = TOWTRUCK OR GET_ENTITY_MODEL(vehTemp) = TOWTRUCK2) RETURN TRUE ENDIF ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// Determines if one of the vans is attached to a tow truck. /// RETURNS: /// Returns TRUE if so. FUNC BOOL IS_A_VAN_ATTACHED_TO_A_TOW_TRUCK() IF DOES_ENTITY_EXIST(veh_TowTruckAttached) AND IS_VEHICLE_DRIVEABLE(veh_TowTruckAttached) RETURN TRUE ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// Obtains the MISSION_VEHICLE_FLAG of the van being towed /// RETURNS: /// Returns the MISSION_VEHICLE_FLAG of the van being towed, mvf_invalid will return if no van is being towed. FUNC MISSION_VEHICLE_FLAGS GET_VAN_PLAYER_IS_TOWING() IF IS_A_VAN_ATTACHED_TO_A_TOW_TRUCK() MISSION_VEHICLE_FLAGS eVeh FOR eVeh = mvf_bugstar_van_1 TO mvf_bugstar_van_3 IF DOES_ENTITY_EXIST(vehs[eVeh].id) AND IS_VEHICLE_DRIVEABLE(vehs[eVeh].id) IF IS_VEHICLE_ATTACHED_TO_TOW_TRUCK(veh_TowTruckAttached, vehs[eVeh].id) RETURN eVeh ENDIF ENDIF ENDFOR ENDIF RETURN mvf_invalid ENDFUNC /// PURPOSE: /// Checks to see if the player has just damaged one of the vans /// RETURNS: /// Returns TRUE if the player has damaged a van FUNC BOOL HAS_PLAYER_DAMAGED_A_VAN() MISSION_VEHICLE_FLAGS eVeh FOR eVeh = mvf_bugstar_van_1 TO mvf_bugstar_van_3 IF DOES_ENTITY_EXIST(vehs[eVeh].id) AND HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(vehs[eVeh].id, PLAYER_PED_ID(), TRUE ) RETURN TRUE ENDIF ENDFOR RETURN FALSE ENDFUNC /// PURPOSE: /// Resets the damage tracking on all the vans PROC CLEAR_VAN_DAMAGE_DETECTION() MISSION_VEHICLE_FLAGS eVeh FOR eVeh = mvf_bugstar_van_1 TO mvf_bugstar_van_3 IF IS_ENTITY_ALIVE(vehs[eVeh].id) CLEAR_ENTITY_LAST_DAMAGE_ENTITY(vehs[eVeh].id) ENDIF ENDFOR ENDPROC FUNC BOOL IS_VAN_WINDOW_SMASHED(MISSION_VEHICLE_FLAGS eVeh) IF eVeh != mvf_invalid AND DOES_ENTITY_EXIST(vehs[eVeh].id) AND IS_VEHICLE_DRIVEABLE(vehs[eVeh].id) SC_WINDOW_LIST eWindow REPEAT COUNT_OF(SC_WINDOW_LIST) eWindow IF NOT IS_VEHICLE_WINDOW_INTACT(vehs[eVeh].id, eWindow) RETURN TRUE ENDIF ENDREPEAT ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// Finds which vehicle the player has stolen /// RETURNS: /// Returns the mission vehicle flag of the vehicle that has been stolen, returns mpf_invalid if none is stolen FUNC MISSION_VEHICLE_FLAGS GET_VAN_PLAYER_IS_IN() IF IS_PLAYER_IN_VAN() MISSION_VEHICLE_FLAGS eVan FOR eVan = mvf_bugstar_van_1 TO mvf_bugstar_van_3 IF DOES_ENTITY_EXIST(vehs[eVan].id) AND IS_VEHICLE_DRIVEABLE(vehs[eVan].id) IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID(), TRUE) AND IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehs[eVan].id, TRUE) RETURN eVan ENDIF ENDIF ENDFOR ENDIF RETURN mvf_invalid ENDFUNC FUNC BOOL IS_VEHICLE_STUCK(VEHICLE_INDEX veh) IF IS_VEHICLE_DRIVEABLE(veh) IF IS_VEHICLE_STUCK_TIMER_UP(veh, VEH_STUCK_ON_ROOF, 7000) OR IS_VEHICLE_STUCK_TIMER_UP(veh, VEH_STUCK_ON_SIDE, 7000) OR IS_VEHICLE_STUCK_TIMER_UP(veh, VEH_STUCK_HUNG_UP, 7000) RETURN TRUE ENDIF ENDIF RETURN FALSE ENDFUNC FUNC BOOL IS_LAST_VEHICLE_A_VAN() MISSION_VEHICLE_FLAGS eVan FOR eVan = mvf_bugstar_van_1 TO mvf_bugstar_van_3 IF DOES_ENTITY_EXIST(vehs[eVan].id) AND IS_VEHICLE_DRIVEABLE(vehs[eVan].id) IF GET_PLAYERS_LAST_VEHICLE() = vehs[eVan].id RETURN TRUE ENDIF ENDIF ENDFOR RETURN FALSE ENDFUNC FUNC BOOL IS_VEHICLE_IN_USEABLE_RANGE(VEHICLE_INDEX veh) // If the van is in the warehouse give it a range boost IF GET_INTERIOR_FROM_ENTITY(veh) = interior_warehouse IF GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(), v_WarehouseCoord) < VAN_USABLE_RANGE_WAREHOUSE_FROM_PLAYER RETURN TRUE ENDIF ELSE IF GET_DISTANCE_BETWEEN_ENTITIES(veh, PLAYER_PED_ID()) < VAN_USABLE_RANGE_VAN_FROM_PLAYER RETURN TRUE ENDIF ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// Gets the number of bugstar vans available. /// RETURNS: /// returns an integer count of the remaining number of vans. FUNC INT GET_NUM_OF_VANS_LEFT(BOOL bWithinUsableRange) INT iResult MISSION_VEHICLE_FLAGS eVeh FOR eVeh = mvf_bugstar_van_1 TO mvf_bugstar_van_3 IF DOES_ENTITY_EXIST(vehs[eVeh].id) AND IS_VEHICLE_DRIVEABLE(vehs[eVeh].id) AND NOT IS_VEHICLE_STUCK(vehs[eVeh].id) AND (NOT bWithinUsableRange OR IS_VEHICLE_IN_USEABLE_RANGE(vehs[eVeh].id)) iResult++ ENDIF ENDFOR RETURN iResult ENDFUNC /// PURPOSE: /// Checks if one of the bugstars van's alarams are going off /// RETURNS: /// Returns TRUE if one of the alarms is going off FUNC BOOL GET_IS_A_VAN_ALARM_GOING_OFF() MISSION_VEHICLE_FLAGS eVeh FOR eVeh = mvf_bugstar_van_1 TO mvf_bugstar_van_3 IF DOES_ENTITY_EXIST(vehs[eVeh].id) AND IS_VEHICLE_DRIVEABLE(vehs[eVeh].id) IF IS_VEHICLE_ALARM_ACTIVATED(vehs[eVeh].id) RETURN TRUE ENDIF ENDIF ENDFOR RETURN FALSE ENDFUNC FUNC MISSION_VEHICLE_FLAGS GET_VAN_ALARM_IS_GOING_OFF_ON() MISSION_VEHICLE_FLAGS eVeh IF GET_IS_A_VAN_ALARM_GOING_OFF() FOR eVeh = mvf_bugstar_van_1 TO mvf_bugstar_van_3 IF DOES_ENTITY_EXIST(vehs[eVeh].id) AND IS_VEHICLE_DRIVEABLE(vehs[eVeh].id) IF IS_VEHICLE_ALARM_ACTIVATED(vehs[eVeh].id) RETURN eVeh ENDIF ENDIF ENDFOR ENDIF RETURN mvf_invalid ENDFUNC FUNC BOOL IS_PED_A_FOREMAN(MISSION_PED_FLAGS ePed) IF ePed = mpf_bugstar_foreman_front OR ePed = mpf_bugstar_foreman_rear RETURN TRUE ENDIF RETURN FALSE ENDFUNC FUNC BOOL PLAY_CONVERSATION(MISSION_PED_FLAGS ePed, STRING strRoot, PED_AI_STATES eConvoPriority, BOOL bInterrupt = FALSE, BOOL bDontFinish = FALSE, BOOL bCanThisBeInterrupted = TRUE, INT iDelay = 0, BOOL bStoreWhenInterruptedForFutureResumption = FALSE, STRING strLine = null, BOOL bConvoKillAtDistance = FALSE ) FLOAT fTempDist = GET_DISTANCE_BETWEEN_ENTITIES(peds[ePed].id, PLAYER_PED_ID()) IF eConvoPriority > eQueuedConvoPriority OR eConvoPriority = PEDAI_HANDSUP OR (eConvoPriority = eQueuedConvoPriority AND (fTempDist < fQueuedConvoDist OR (IS_PED_A_FOREMAN(ePed) AND NOT IS_PED_A_FOREMAN(eQueuedConvoSpeaker))) AND eConvoPriority != PEDAI_FLEEING) BOOL bQueueConvo // Use priority to decide at what distance a conversation should be culled. SWITCH eConvoPriority CASE PEDAI_WORKING IF fTempDist < 20.0 bQueueConvo = TRUE ENDIF BREAK DEFAULT IF fTempDist < 40.0 bQueueConvo = TRUE ENDIF BREAK ENDSWITCH IF bQueueConvo eQueuedConvoSpeaker = ePed eQueuedConvoPriority = eConvoPriority strQueuedConvoRoot = strRoot strQueuedConvoLine = strLine fQueuedConvoDist = fTempDist bQueuedConvoInterrupt = bInterrupt bQueuedConvoDoNotFinish = bDontFinish iQueuedConvoDelay = iDelay bQueuedConvoCanBeInterrupted = bCanThisBeInterrupted bQueuedConvoStoreForFutureResumption = bStoreWhenInterruptedForFutureResumption bQueuedConvoKillAtDistance = bConvoKillAtDistance RETURN TRUE ENDIF ENDIF RETURN FALSE ENDFUNC FUNC TEXT_LABEL_23 MODIFY_CONVO_ROOT_FOR_FOREMAN(MISSION_PED_FLAGS ePed, STRING rootLabel) TEXT_LABEL_23 strResult = rootLabel IF ePed = mpf_bugstar_foreman_rear strResult += "b" ENDIF RETURN strResult ENDFUNC FUNC BOOL HAS_PED_AI_JUST_ENTERED_STATE(PED_STRUCT sPed) IF sPed.bAIStateChangedLastFrame OR sPed.bAIEventChangedLastFrame RETURN TRUE ENDIF RETURN FALSE ENDFUNC FUNC BOOL HAS_PED_AI_JUST_CHANGED_STATE(PED_STRUCT sPed) IF sPed.eAI != sPed.eAIPrevFrame OR NOT ARE_STRINGS_EQUAL(sPed.strAIEvent, sPed.strAIEventPrevFrame) RETURN TRUE ENDIF RETURN FALSE ENDFUNC FUNC BOOL Private_SET_PED_AI_STATE(PED_STRUCT &sPed, PED_AI_STATES newState, STRING strEventName, VECTOR vCoords, ENTITY_INDEX entity = NULL, BOOL bCheckAgainstCurrentState = TRUE, BOOL bDirectEvent = TRUE, BOOL bAlarmEvent = FALSE) IF IS_ENTITY_ALIVE(sPed.id) IF (NOT bCheckAgainstCurrentState OR newState >= sPed.eAI) sPed.iTimeOfStateLastSet = GET_GAME_TIMER() IF newState != sPed.eAI OR NOT ARE_STRINGS_EQUAL(sPed.strAIEvent,strEventName) sPed.eAIPrev = sPed.eAI sPed.eAI = newState sPed.strAIEventPrev = sPed.strAIEvent sPed.strAIEvent = strEventName IF bAlarmEvent sPed.bAlarmEvent = TRUE sPed.bDirectEvent = FALSE ELSE sPed.bAlarmEvent = FALSE sPed.bDirectEvent = bDirectEvent ENDIF sPed.iFlagState = 0 sPed.iFlagTask = 0 sPed.iDiaFlag = 0 sPed.iTimeOfEnteringState = GET_GAME_TIMER() // Extra data IF NOT IS_VECTOR_ZERO(vCoords) sPed.vInvestigationCoord = vCoords ENDIF IF entity != null AND DOES_ENTITY_EXIST(entity) sPed.entityInvestigating = entity ENDIF RETURN TRUE ENDIF ENDIF ENDIF RETURN FALSE ENDFUNC FUNC BOOL SET_PED_AI_STATE(PED_STRUCT &sPed, PED_AI_STATES newState, BOOL bCheckAgainstCurrentState, STRING strEventName, BOOL bDirectEvent = TRUE, BOOL bAlarmEvent = FALSE) RETURN Private_SET_PED_AI_STATE(sPed, newState, strEventName, <<0,0,0>>, NULL, bCheckAgainstCurrentState, bDirectEvent, bAlarmEvent) ENDFUNC FUNC BOOL SET_PED_AI_STATE_WITH_COORDS(PED_STRUCT &sPed, PED_AI_STATES newState, STRING strEventName, VECTOR vCoord, BOOL bCheckAgainstCurrentState, BOOL bDirectEvent = TRUE, BOOL bAlarmEvent = FALSE) RETURN Private_SET_PED_AI_STATE(sPed, newState, strEventName, vCoord, NULL, bCheckAgainstCurrentState, bDirectEvent, bAlarmEvent) ENDFUNC FUNC BOOL SET_PED_AI_STATE_WITH_ENTITY(PED_STRUCT &sPed, PED_AI_STATES newState, STRING strEventName, ENTITY_INDEX entity, BOOL bCheckAgainstCurrentState, BOOL bDirectEvent = TRUE, BOOL bAlarmEvent = FALSE) RETURN Private_SET_PED_AI_STATE(sPed, newState, strEventName, <<0,0,0>>, entity, bCheckAgainstCurrentState, bDirectEvent, bAlarmEvent) ENDFUNC FUNC BOOL BROADCAST_DISPATCH_SCRIPT_AI_EVENT(SCRIPT_AI_EVENT &sAIEvent, STRING strConv = NULL) IF IS_STRING_NULL_OR_EMPTY(sAIEvent.strEventName) AND sAIEvent.ePedTransmitter != mpf_invalid AND (NOT DOES_ENTITY_EXIST(peds[sAIEvent.ePedTransmitter].id) OR IS_PED_INJURED(peds[sAIEvent.ePedTransmitter].id)) RETURN FALSE ENDIF INT i WHILE i != -1 AND NOT IS_STRING_NULL_OR_EMPTY(s_BroadcastEvent[i].strEventName) i++ IF i > COUNT_OF(s_BroadcastEvent)-1 i = -1 ENDIF ENDWHILE // Gap in the queue found IF i != -1 BOOL bWasDispatched IF sAIEvent.ePedTransmitter = mpf_invalid OR (IS_STRING_NULL_OR_EMPTY(strConv) OR ARE_STRINGS_EQUAL(strConv, sAIEvent.strConvo)) // Add to broadcast queue s_BroadcastEvent[i].ePedTransmitter = sAIEvent.ePedTransmitter s_BroadcastEvent[i].strEventName = sAIEvent.strEventName IF sAIEvent.ePedTransmitter != mpf_invalid s_BroadcastEvent[i].vEventCoord = GET_ENTITY_COORDS(peds[sAIEvent.ePedTransmitter].id) ELSE s_BroadcastEvent[i].vEventCoord = sAIEvent.vEventCoord ENDIF s_BroadcastEvent[i].fEventRadius = sAIEvent.fEventRadius s_BroadcastEvent[i].iEventLife = sAIEvent.iEventLife s_BroadcastEvent[i].iEventDelay = sAIEvent.iEventDelay s_BroadcastEvent[i].iTimeOfEvent = GET_GAME_TIMER() s_BroadcastEvent[i].bRaiseAlarm = sAIEvent.bRaiseAlarm s_BroadcastEvent[i].bCalledSecurity = sAIEvent.bCalledSecurity bWasDispatched = TRUE ELSE bWasDispatched = FALSE ENDIF // Clear out ped's queued event sAIEvent.ePedTransmitter = mpf_invalid sAIEvent.strEventName = "" sAIEvent.vEventCoord = <<0,0,0>> sAIEvent.fEventRadius = 0.0 sAIEvent.iEventLife = 0 sAIEvent.iEventDelay = 0 sAIEvent.iTimeOfEvent = 0 sAIEvent.bRaiseAlarm = FALSE sAIEvent.bCalledSecurity = FALSE RETURN bWasDispatched ENDIF RETURN FALSE ENDFUNC PROC BROADCAST_QUEUE_SCRIPT_AI_EVENT(STRING strEventName, VECTOR vCoord, FLOAT fEventRadius, INT iEventLife, INT iEventDelay = -1, BOOL bRaiseAlarm = FALSE, BOOL bCalledSecurity = FALSE) SCRIPT_AI_EVENT sAIEvent sAIEvent.ePedTransmitter = mpf_invalid sAIEvent.strEventName = strEventName sAIEvent.strConvo = "" sAIEvent.iEventLife = iEventLife sAIEvent.fEventRadius = fEventRadius sAIEvent.iEventDelay = iEventDelay sAIEvent.bRaiseAlarm = bRaiseAlarm sAIEvent.bCalledSecurity = bCalledSecurity sAIEvent.vEventCoord = vCoord BROADCAST_DISPATCH_SCRIPT_AI_EVENT(sAIEvent) ENDPROC PROC BROADCAST_QUEUE_SCRIPT_AI_EVENT_PED(PED_STRUCT &sPed, STRING strEventName, STRING strConvoTiedTo, FLOAT fEventRadius, INT iEventLife, INT iEventDelay = -1, BOOL bInstantDispatch = FALSE, BOOL bRaiseAlarm = FALSE, BOOL bCalledSecurity = FALSE) MISSION_PED_FLAGS i, ePed REPEAT COUNT_OF(peds) i IF peds[i].id = sPed.id ePed = i ENDIF ENDREPEAT sPed.sQueuedBroadcastEvent.ePedTransmitter = ePed sPed.sQueuedBroadcastEvent.strEventName = strEventName sPed.sQueuedBroadcastEvent.strConvo = strConvoTiedTo sPed.sQueuedBroadcastEvent.iEventLife = iEventLife sPed.sQueuedBroadcastEvent.fEventRadius = fEventRadius sPed.sQueuedBroadcastEvent.iEventDelay = iEventDelay sPed.sQueuedBroadcastEvent.bRaiseAlarm = bRaiseAlarm sPed.sQueuedBroadcastEvent.bCalledSecurity = bCalledSecurity IF bInstantDispatch BROADCAST_DISPATCH_SCRIPT_AI_EVENT(sPed.sQueuedBroadcastEvent) ENDIF ENDPROC /// PURPOSE: /// Keeps track of the players status PROC UPDATE_PLAYER_STATUS() IF NOT IS_PED_INJURED(PLAYER_PED_ID()) // player is in the security guard's vehicle IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehs[mvf_security].id, TRUE) e_PlayerStatus = PLAYERSTATUS_SEC_CAR_STEALING // in player is getting out of one of the vans ELIF IS_PLAYER_EXITING_VAN() e_PlayerStatus = PLAYERSTATUS_VAN_EXITING // in player is getting into one of the vans ELIF IS_PLAYER_ENTERING_VAN() e_PlayerStatus = PLAYERSTATUS_VAN_ENTERING // is driving or towing one of the vans ELIF IS_PLAYER_IN_VAN() e_PlayerStatus = PLAYERSTATUS_VAN_STEALING bPromptGetBackInVan = FALSE ELIF IS_A_VAN_ATTACHED_TO_A_TOW_TRUCK() e_PlayerStatus = PLAYERSTATUS_VAN_STEALING_TOW // player has just damaged one of the vans ELIF HAS_PLAYER_DAMAGED_A_VAN() e_PlayerStatus = PLAYERSTATUS_VAN_DAMAGE // Player's vehicle is still ditched in warehouse ELIF DOES_ENTITY_EXIST(veh_DumpedAtEntrance) AND IS_VEHICLE_DRIVEABLE(veh_DumpedAtEntrance) AND NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), veh_DumpedAtEntrance, TRUE) AND IS_ENTITY_IN_ANGLED_AREA(veh_DumpedAtEntrance, v_WarehouseCoord, <<119.722847,-3092.472412,13.461255>>, 44.000000) e_PlayerStatus = PLAYERSTATUS_WAREHOUSE_DITCH_VEH // Player first ditches a vehicle in the warehouse ELIF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID(), TRUE) AND DOES_ENTITY_EXIST( GET_PLAYERS_LAST_VEHICLE() ) AND NOT IS_LAST_VEHICLE_A_VAN() AND IS_ENTITY_IN_ANGLED_AREA(GET_PLAYERS_LAST_VEHICLE(), v_WarehouseCoord, <<119.722847,-3092.472412,13.461255>>, 44.000000) veh_DumpedAtEntrance = GET_PLAYERS_LAST_VEHICLE() e_PlayerStatus = PLAYERSTATUS_WAREHOUSE_DITCH_VEH // In the warehouse on foot ELIF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID(), TRUE) AND IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), v_WarehouseCoord, <<119.722847,-3092.472412,13.461255>>, 44.000000) e_PlayerStatus = PLAYERSTATUS_WAREHOUSE_ON_FOOT // Player's vehicle is still ditched ELIF DOES_ENTITY_EXIST(veh_DumpedAtEntrance) AND IS_VEHICLE_DRIVEABLE(veh_DumpedAtEntrance) AND NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), veh_DumpedAtEntrance, TRUE) //AND (IS_ENTITY_AT_COORD(veh_DumpedAtEntrance, <<166.306366,-3091.712402,7.326923>>,<<11.062500,19.250000,2.687500>>) AND (IS_ENTITY_IN_ANGLED_AREA(veh_DumpedAtEntrance, <<170.823593,-3092.405762,4.849259>>, <<154.329956,-3092.450195,9.783653>>, 14.062500) OR IS_ENTITY_AT_COORD(veh_DumpedAtEntrance, <<115.755623,-3092.294434,7.576007>>,<<4.375000,10.187500,2.562500>>)) e_PlayerStatus = PLAYERSTATUS_ENTRANCE_DITCH_VEH // player first ditches a vehicle at the entrance ELIF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID(), TRUE) AND DOES_ENTITY_EXIST( GET_PLAYERS_LAST_VEHICLE() ) AND NOT IS_LAST_VEHICLE_A_VAN() //AND (IS_ENTITY_AT_COORD(GET_PLAYERS_LAST_VEHICLE(), <<166.306366,-3091.712402,7.326923>>,<<11.062500,19.250000,2.687500>>) AND (IS_ENTITY_IN_ANGLED_AREA(GET_PLAYERS_LAST_VEHICLE(), <<170.823593,-3092.405762,4.849259>>, <<154.329956,-3092.450195,9.783653>>, 14.062500) OR IS_ENTITY_AT_COORD(GET_PLAYERS_LAST_VEHICLE(), <<115.755623,-3092.294434,7.576007>>,<<4.375000,10.187500,2.562500>>)) veh_DumpedAtEntrance = GET_PLAYERS_LAST_VEHICLE() e_PlayerStatus = PLAYERSTATUS_ENTRANCE_DITCH_VEH // In the warehouse in a vehicle ELIF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID(), TRUE) AND NOT IS_LAST_VEHICLE_A_VAN() AND IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), v_WarehouseCoord, <<119.722847,-3092.472412,13.461255>>, 44.000000) veh_DumpedAtEntrance = GET_PLAYERS_LAST_VEHICLE() e_PlayerStatus = PLAYERSTATUS_WAREHOUSE_IN_VEHICLE // at the front entrance in a vehicle ELIF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID(), TRUE) AND NOT IS_LAST_VEHICLE_A_VAN() //AND IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<166.306366,-3091.712402,7.326923>>,<<11.062500,19.250000,2.687500>>) AND IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<170.823593,-3092.405762,4.849259>>, <<154.329956,-3092.450195,9.783653>>, 14.062500) veh_DumpedAtEntrance = GET_PLAYERS_LAST_VEHICLE() e_PlayerStatus = PLAYERSTATUS_BLOCKING_ENTRANCE_WITH_VEHICLE // at the rear entrance in a vehicle ELIF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID(), TRUE) AND IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<115.755623,-3092.294434,7.576007>>,<<4.375000,10.187500,2.562500>>) e_PlayerStatus = PLAYERSTATUS_BLOCKING_ENTRANCE_WITH_VEHICLE ELSE veh_DumpedAtEntrance = NULL // at the front entrance on foot IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID(), TRUE) AND IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<159.688004,-3092.446045,7.314032>>,<<4.937500,7.312500,2.312500>>) e_PlayerStatus = PLAYERSTATUS_BLOCKING_ENTRANCE_ON_FOOT // at rear entrance ELIF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID(), TRUE) AND IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<115.755623,-3092.294434,7.576007>>,<<4.375000,10.187500,2.562500>>) e_PlayerStatus = PLAYERSTATUS_BLOCKING_ENTRANCE_ON_FOOT // not doing anything notible ELSE e_PlayerStatus = PLAYERSTATUS_NONE ENDIF ENDIF // Scale foremans perception when the player is in the locate at the front entrance IF e_PlayerStatus = PLAYERSTATUS_BLOCKING_ENTRANCE_WITH_VEHICLE IF IS_ENTITY_ALIVE(peds[mpf_bugstar_foreman_front].id) SET_PED_VISUAL_FIELD_PROPERTIES(peds[mpf_bugstar_foreman_front].id, 120, 20.0, 120, -90, 90) ENDIF ELSE IF IS_ENTITY_ALIVE(peds[mpf_bugstar_foreman_front].id) SET_PED_VISUAL_FIELD_PROPERTIES(peds[mpf_bugstar_foreman_front].id, 17.5, 10.0, 120, -90, 90) ENDIF ENDIF // Disable the players lethal stealth kills, use knock outs until all kicks off. IF bIsPlayerStillStealth SET_PED_RESET_FLAG(PLAYER_PED_ID(), PRF_SuppressLethalMeleeActions, TRUE) ENDIF // Player arrives with a wanted level, set the staff to be alerted IF e_PlayerStatus != PLAYERSTATUS_NONE AND IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0) AND IS_COP_PED_IN_AREA_3D(<<182.953690,-3119.883789,101.922592>>-<<94.250000,239.750000,108.062500>>, <<182.953690,-3119.883789,101.922592>>+<<94.250000,239.750000,108.062500>>) ENDIF #IF IS_DEBUG_BUILD IF bDisplayDebug TEXT_LABEL_63 strDebugText strDebugText = "Player Status: " SWITCH e_PlayerStatus DEFAULT strDebugText += "DEBUG_MISSING" BREAK CASE PLAYERSTATUS_NONE strDebugText += "NONE" BREAK CASE PLAYERSTATUS_BLOCKING_ENTRANCE_ON_FOOT strDebugText += "BLOCK_ENT_FOOT" BREAK CASE PLAYERSTATUS_BLOCKING_ENTRANCE_WITH_VEHICLE strDebugText += "BLOCK_ENT_VEH" BREAK CASE PLAYERSTATUS_WAREHOUSE_ON_FOOT strDebugText += "WH_FOOT" BREAK CASE PLAYERSTATUS_WAREHOUSE_IN_VEHICLE strDebugText += "WH_VEH" BREAK CASE PLAYERSTATUS_WAREHOUSE_DITCH_VEH strDebugText += "WH_DITCHED_VEH" BREAK CASE PLAYERSTATUS_ENTRANCE_DITCH_VEH strDebugText += "ENT_DITCHED_VEH" BREAK CASE PLAYERSTATUS_VAN_DAMAGE strDebugText += "VAN_DMG" BREAK CASE PLAYERSTATUS_VAN_ENTERING strDebugText += "VAN_ENTER" BREAK CASE PLAYERSTATUS_VAN_EXITING strDebugText += "VAN_EXIT" BREAK CASE PLAYERSTATUS_VAN_STEALING strDebugText += "VAN_STEALING" BREAK CASE PLAYERSTATUS_VAN_STEALING_TOW strDebugText += "VAN_STEALING_TOW" BREAK CASE PLAYERSTATUS_SEC_CAR_STEALING strDebugText += "SEC_CAR_STEALING" BREAK ENDSWITCH DRAW_DEBUG_TEXT_2D_WRAPPED(strDebugText, 0,0,0,255) strDebugText = "veh_DumpedAtEntrance: " IF DOES_ENTITY_EXIST(veh_DumpedAtEntrance) strDebugText += "STORED" ELSE strDebugText += "EMPTY" ENDIF DRAW_DEBUG_TEXT_2D_WRAPPED(strDebugText, 0,0,0,255) ENDIF #ENDIF ENDIF ENDPROC PROC BUGSTAR_STAFF_AI_STATE(PED_STRUCT &sPed) CONST_FLOAT NOTICE_WEAPON_DIST 8.0 //------------------------------------------------------------------------------------- // AI pre-update //------------------------------------------------------------------------------------- WEAPON_TYPE eWeapPlayer GET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), eWeapPlayer) FLOAT fDistPlayer = GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), sPed.id) BOOL bPunchedPed, bHitWithVehicle IF HAS_ENTITY_BEEN_DAMAGED_BY_ANY_VEHICLE(sPed.id) bHitWithVehicle = TRUE ENDIF IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(sPed.id, PLAYER_PED_ID(), TRUE) IF HAS_ENTITY_BEEN_DAMAGED_BY_WEAPON(sPed.id, WEAPONTYPE_UNARMED) bPunchedPed = TRUE ENDIF ENDIF //------------------------------------------------------------------------------------- // AI Event update //------------------------------------------------------------------------------------- TEXT_LABEL_63 strEventName BOOL bCanSeeBody, bKilledInFrontOfObserver, bSawPlayerDoIt, bNonLethal bCanSeeBody = CAN_PED_SEE_DEAD_BODY(sPed, bKilledInFrontOfObserver, bSawPlayerDoIt, bNonLethal) // Saw a ped get killed infront of them IF sPed.eAI != PEDAI_FLEEING AND bCanSeeBody AND bKilledInFrontOfObserver AND NOT bNonLethal IF bSawPlayerDoIt SET_PED_AI_STATE(sPed, PEDAI_FLEEING, TRUE, "PLAYER_KILLED") ELSE SET_PED_AI_STATE(sPed, PEDAI_FLEEING, TRUE, "KILLED") ENDIF // Ped heard gun fire ELIF HAS_PED_RECEIVED_EVENT(sPed.id, EVENT_SHOT_FIRED) //OR IS_BULLET_IN_AREA(GET_ENTITY_COORDS(sPed.id), 10.0, TRUE) OR HAS_PED_RECEIVED_EVENT(sPed.id, EVENT_SHOT_FIRED_BULLET_IMPACT) OR HAS_PED_RECEIVED_EVENT(sPed.id, EVENT_SHOT_FIRED_WHIZZED_BY) OR HAS_PED_RECEIVED_EVENT(sPed.id, EVENT_EXPLOSION) OR HAS_PED_RECEIVED_EVENT(sPed.id, EVENT_EXPLOSION_HEARD) OR HAS_PED_RECEIVED_EVENT(sPed.id, EVENT_SHOCKING_EXPLOSION) SET_PED_AI_STATE(sPed, PEDAI_FLEEING, TRUE, "GUNSHOT") // Aiming gun around ELIF sPed.bCanSeePlayer AND sPed.eAI != PEDAI_HANDSUP AND IS_PLAYER_AIMING(WF_INCLUDE_GUN) SET_PED_AI_STATE(sPed, PEDAI_HANDSUP, TRUE, "GUN_AIMED") // Aiming projectile at ped ELIF sPed.bCanSeePlayer AND IS_PLAYER_AIMING_AT_PED(sPed, WF_INCLUDE_PROJECTILE) SET_PED_AI_STATE(sPed, PEDAI_FLEEING, TRUE, "PROJ_AIMED") // Can see player with a gun ELIF sPed.bCanSeePlayer AND fDistPlayer < NOTICE_WEAPON_DIST AND sPed.eAI != PEDAI_HANDSUP AND NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID(), TRUE) AND IS_PED_ARMED(PLAYER_PED_ID(), WF_INCLUDE_MELEE | WF_INCLUDE_GUN) SET_PED_AI_STATE(sPed, PEDAI_FLEEING, TRUE, "SEEN_WEAPON") // Player is seen getting out of a van ELIF (sPed.bCanSeePlayer OR sPed.bCanHearPlayer) AND e_PlayerStatus = PLAYERSTATUS_VAN_EXITING IF sPed.bCanSeePlayer SET_PED_AI_STATE(sPed, PEDAI_COMBAT_PLAYER, TRUE, "EXIT_VAN") ELIF sPed.bCanHearPlayer SET_PED_AI_STATE_WITH_COORDS(sPed, PEDAI_INVESTIGATE, "HEARD_PLAYER", GET_ENTITY_COORDS(PLAYER_PED_ID()), TRUE) ENDIF // Player is seen getting into a van ELIF (sPed.bCanSeePlayer OR sPed.bCanHearPlayer) AND e_PlayerStatus = PLAYERSTATUS_VAN_ENTERING IF sPed.bCanSeePlayer SET_PED_AI_STATE(sPed, PEDAI_COMBAT_PLAYER, TRUE, "GET_IN_VAN") ELIF sPed.bCanHearPlayer SET_PED_AI_STATE_WITH_COORDS(sPed, PEDAI_INVESTIGATE, "HEARD_PLAYER", GET_ENTITY_COORDS(PLAYER_PED_ID()), TRUE) ENDIF // player is seen towing a van away ELIF (sPed.bCanSeePlayer OR sPed.bCanHearPlayer) AND e_PlayerStatus = PLAYERSTATUS_VAN_STEALING_TOW IF sPed.bCanSeePlayer SET_PED_AI_STATE_WITH_ENTITY(sPed, PEDAI_COMBAT_PLAYER, "STEALING_VAN", vehs[GET_VAN_PLAYER_IS_TOWING()].id, TRUE) ELIF sPed.bCanHearPlayer SET_PED_AI_STATE_WITH_ENTITY(sPed, PEDAI_INVESTIGATE, "HEARD_VAN", vehs[GET_VAN_PLAYER_IS_TOWING()].id, TRUE) ENDIF // Starting a fight with a ped ELIF bPunchedPed OR HAS_PED_RECEIVED_EVENT(sPed.id, EVENT_MELEE_ACTION) OR HAS_PED_RECEIVED_EVENT(sPed.id, EVENT_SHOCKING_SEEN_MELEE_ACTION) OR CAN_PED_SEE_A_PED_BEING_ATTACKED(sPed, FALSE) SET_PED_AI_STATE(sPed, PEDAI_COMBAT_PLAYER, TRUE, "FIGHT") // Ran over ELIF bHitWithVehicle OR HAS_PED_RECEIVED_EVENT(sPed.id, EVENT_SHOCKING_PED_RUN_OVER) OR CAN_PED_SEE_A_PED_BEING_ATTACKED(sPed, TRUE) SET_PED_AI_STATE(sPed, PEDAI_COMBAT_PLAYER, TRUE, "RAN_OVER") // After having a scrap with the player spots him again near the warehouse or near the ped ELIF sPed.eAI != PEDAI_COMBAT_PLAYER AND sPed.bHasFoughtWithPlayer AND (sPed.bCanSeePlayer OR sPed.bCanHearPlayer) AND (fDistPlayer < 8.0 OR GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(), v_WarehouseCoord) < 40.0) IF sPed.bCanSeePlayer SET_PED_AI_STATE(sPed, PEDAI_COMBAT_PLAYER, TRUE, "FIGHT_RETURN") ELIF sPed.bCanHearPlayer SET_PED_AI_STATE_WITH_COORDS(sPed, PEDAI_INVESTIGATE, "HEARD_PLAYER", GET_ENTITY_COORDS(PLAYER_PED_ID()), TRUE) ENDIF // Seed another ped knocked out ELIF sPed.eAI != PEDAI_FLEEING AND bCanSeeBody // KO's infront of ped by player IF bKilledInFrontOfObserver AND bSawPlayerDoIt AND bNonLethal SET_PED_AI_STATE(sPed, PEDAI_COMBAT_PLAYER, TRUE, "PLAYER_KO") // otherwise count as found dead body (bSawPlayerDoIt will be forced to true if the player was observed doing it before) ELIF NOT bSawPlayerDoIt SET_PED_AI_STATE(sPed, PEDAI_FLEEING, TRUE, "DEAD_BODY") ENDIF // Noticed 1 of the vans leaving the warehouse ELIF (sPed.bCanSeePlayer OR sPed.bCanHearPlayer) AND (sPed.bReactsToEntrance OR sPed.bReactsToIntrusion) AND e_PlayerStatus = PLAYERSTATUS_VAN_STEALING AND NOT ARE_STRINGS_EQUAL(sPed.strAIEvent, "SEE_VAN_LEAVING") AND NOT ARE_STRINGS_EQUAL(sPed.strAIEvent, "SEE_VAN_LEAVING_1") AND NOT ARE_STRINGS_EQUAL(sPed.strAIEvent, "CHECK_DRIVER") AND GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(), v_WarehouseCoord) < 15.0 IF sPed.bCanSeePlayer SET_PED_AI_STATE_WITH_ENTITY(sPed, PEDAI_INVESTIGATE, "SEE_VAN_LEAVING", vehs[GET_VAN_PLAYER_IS_IN()].id, TRUE) ELIF sPed.bCanHearPlayer SET_PED_AI_STATE_WITH_ENTITY(sPed, PEDAI_INVESTIGATE, "HEARD_VAN", vehs[GET_VAN_PLAYER_IS_IN()].id, TRUE) ENDIF // Intrusion of private property ELIF e_PlayerStatus != PLAYERSTATUS_VAN_STEALING IF (sPed.bReactsToEntrance AND (e_PlayerStatus = PLAYERSTATUS_BLOCKING_ENTRANCE_ON_FOOT OR e_PlayerStatus = PLAYERSTATUS_BLOCKING_ENTRANCE_WITH_VEHICLE OR e_PlayerStatus = PLAYERSTATUS_ENTRANCE_DITCH_VEH OR sPed.eAI = PEDAI_INVESTIGATE) OR (sPed.bReactsToInTrusion AND (e_PlayerStatus = PLAYERSTATUS_WAREHOUSE_IN_VEHICLE OR e_PlayerStatus = PLAYERSTATUS_WAREHOUSE_ON_FOOT OR e_PlayerStatus = PLAYERSTATUS_WAREHOUSE_DITCH_VEH))) /* Don't need to see or hear the player to complain about the ditched vehicle, this is so if the player walks off the AI continue to complain about it */ IF (e_PlayerStatus = PLAYERSTATUS_WAREHOUSE_DITCH_VEH OR e_PlayerStatus = PLAYERSTATUS_ENTRANCE_DITCH_VEH) //AND HAS_ENTITY_CLEAR_LOS_TO_ENTITY_IN_FRONT(sPed.id, veh_DumpedAtEntrance) AND HAS_ENTITY_CLEAR_LOS_TO_ENTITY(sPed.id, veh_DumpedAtEntrance, SCRIPT_INCLUDE_MOVER | SCRIPT_INCLUDE_OBJECT | SCRIPT_INCLUDE_VEHICLE) SWITCH e_PlayerStatus CASE PLAYERSTATUS_WAREHOUSE_DITCH_VEH strEventName = "WH_DITCH_VEH" BREAK CASE PLAYERSTATUS_ENTRANCE_DITCH_VEH strEventName = "ENT_DITCH_VEH" BREAK ENDSWITCH SET_PED_AI_STATE(sPed, PEDAI_CONFRONTING_PLAYER, TRUE, strEventName) ELIF sPed.bCanSeePlayer // Confront the player SWITCH e_PlayerStatus CASE PLAYERSTATUS_BLOCKING_ENTRANCE_ON_FOOT strEventName = "ENT_FOOT" BREAK CASE PLAYERSTATUS_BLOCKING_ENTRANCE_WITH_VEHICLE strEventName = "ENT_VEH" BREAK CASE PLAYERSTATUS_WAREHOUSE_ON_FOOT strEventName = "WH_FOOT" BREAK CASE PLAYERSTATUS_WAREHOUSE_IN_VEHICLE strEventName = "WH_VEH" BREAK CASE PLAYERSTATUS_WAREHOUSE_DITCH_VEH strEventName = "WH_DITCH_VEH" BREAK CASE PLAYERSTATUS_ENTRANCE_DITCH_VEH strEventName = "ENT_DITCH_VEH" BREAK CASE PLAYERSTATUS_NONE IF sPed.eAI = PEDAI_INVESTIGATE strEventName = "ENT_FOOT" ENDIF BREAK ENDSWITCH SET_PED_AI_STATE(sPed, PEDAI_CONFRONTING_PLAYER, TRUE, strEventName) ELIF sPed.bCanHearPlayer // Investigate sound SET_PED_AI_STATE_WITH_COORDS(sPed, PEDAI_INVESTIGATE, "HEARD_PLAYER", GET_ENTITY_COORDS(PLAYER_PED_ID()), TRUE) ENDIF ENDIF ENDIF //------------------------------------------------------------------------------------- // CHECK FOR BROADCAST EVENT //------------------------------------------------------------------------------------- IF sPed.iReceivedEvent > -1 AND sPed.iReceivedEvent < COUNT_OF(s_BroadcastEvent)-1 BOOL bCameFromAlarm = s_BroadcastEvent[sPed.iReceivedEvent].bRaiseAlarm SWITCH GET_HASH_KEY(s_BroadcastEvent[sPed.iReceivedEvent].strEventName) CASE HASH("KILLED") CASE HASH("PLAYER_KILLED") CASE HASH("DEAD_BODY") IF sPed.eAI != PEDAI_HANDSUP SET_PED_AI_STATE(sPed, PEDAI_FLEEING, TRUE, s_BroadcastEvent[sPed.iReceivedEvent].strEventName, FALSE, bCameFromAlarm) ENDIF BREAK CASE HASH("PLAYER_KO") IF sPed.eAI != PEDAI_HANDSUP SET_PED_AI_STATE(sPed, PEDAI_COMBAT_PLAYER, TRUE, s_BroadcastEvent[sPed.iReceivedEvent].strEventName, FALSE, bCameFromAlarm) ENDIF BREAK CASE HASH("GUN_AIMED_AT") IF sPed.eAI != PEDAI_HANDSUP IF GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(sPed.id, s_BroadcastEvent[sPed.iReceivedEvent].vEventCoord) < 5.0 SET_PED_AI_STATE(sPed, PEDAI_HANDSUP, TRUE, "GUN_AIMED_AT", FALSE, bCameFromAlarm) ELSE SET_PED_AI_STATE(sPed, PEDAI_FLEEING, TRUE, "SEEN_WEAPON", FALSE, bCameFromAlarm) ENDIF ENDIF BREAK CASE HASH("PROJ_AIMED") IF sPed.eAI != PEDAI_HANDSUP SET_PED_AI_STATE(sPed, PEDAI_FLEEING, TRUE, s_BroadcastEvent[sPed.iReceivedEvent].strEventName, FALSE, bCameFromAlarm) ENDIF BREAK CASE HASH("SEEN_WEAPON") IF sPed.eAI != PEDAI_HANDSUP SET_PED_AI_STATE(sPed, PEDAI_FLEEING, TRUE, s_BroadcastEvent[sPed.iReceivedEvent].strEventName, FALSE, bCameFromAlarm) ENDIF BREAK CASE HASH("FIGHT") CASE HASH("FIGHT_RETURN") CASE HASH("RAN_OVER") CASE HASH("VEH_FAILED_LEAVE") IF sPed.eAI != PEDAI_HANDSUP SET_PED_AI_STATE(sPed, PEDAI_COMBAT_PLAYER, TRUE, s_BroadcastEvent[sPed.iReceivedEvent].strEventName, FALSE, bCameFromAlarm) ENDIF BREAK CASE HASH("STEALING_VAN") CASE HASH("GET_IN_VAN") CASE HASH("EXIT_VAN") IF sPed.eAI != PEDAI_HANDSUP AND NOT ARE_STRINGS_EQUAL(sPed.strAIEvent, "STEALING_VAN") AND NOT ARE_STRINGS_EQUAL(sPed.strAIEvent, "GET_IN_VAN") AND NOT ARE_STRINGS_EQUAL(sPed.strAIEvent, "EXIT_VAN") SET_PED_AI_STATE(sPed, PEDAI_COMBAT_PLAYER, TRUE, s_BroadcastEvent[sPed.iReceivedEvent].strEventName, FALSE, bCameFromAlarm) ENDIF BREAK CASE HASH("GUNSHOT") IF sPed.eAI != PEDAI_HANDSUP SET_PED_AI_STATE(sPed, PEDAI_FLEEING, TRUE, s_BroadcastEvent[sPed.iReceivedEvent].strEventName, FALSE, bCameFromAlarm) ENDIF BREAK CASE HASH("ENT_FOOT") IF sPed.bReactsToEntrance SET_PED_AI_STATE(sPed, PEDAI_CONFRONTING_PLAYER, TRUE, s_BroadcastEvent[sPed.iReceivedEvent].strEventName, FALSE, bCameFromAlarm) ENDIF BREAK CASE HASH("ENT_VEH") IF sPed.bReactsToEntrance SET_PED_AI_STATE(sPed, PEDAI_CONFRONTING_PLAYER, TRUE, s_BroadcastEvent[sPed.iReceivedEvent].strEventName, FALSE, bCameFromAlarm) ENDIF BREAK CASE HASH("WH_FOOT") IF sPed.bReactsToInTrusion SET_PED_AI_STATE(sPed, PEDAI_CONFRONTING_PLAYER, TRUE, s_BroadcastEvent[sPed.iReceivedEvent].strEventName, FALSE, bCameFromAlarm) ENDIF BREAK CASE HASH("WH_VEH") IF sPed.bReactsToInTrusion SET_PED_AI_STATE(sPed, PEDAI_CONFRONTING_PLAYER, TRUE, s_BroadcastEvent[sPed.iReceivedEvent].strEventName, FALSE, bCameFromAlarm) ENDIF BREAK CASE HASH("WH_DITCHED_VEH") IF sPed.bReactsToInTrusion SET_PED_AI_STATE(sPed, PEDAI_CONFRONTING_PLAYER, TRUE, s_BroadcastEvent[sPed.iReceivedEvent].strEventName, FALSE, bCameFromAlarm) ENDIF BREAK CASE HASH("HEARD_PLAYER") IF sPed.bReactsToInTrusion SET_PED_AI_STATE_WITH_COORDS(sPed, PEDAI_INVESTIGATE, s_BroadcastEvent[sPed.iReceivedEvent].strEventName, GET_ENTITY_COORDS(PLAYER_PED_ID()), TRUE, FALSE, bCameFromAlarm) ENDIF BREAK CASE HASH("HEARD_VAN") IF sPed.bReactsToInTrusion SET_PED_AI_STATE_WITH_ENTITY(sPed, PEDAI_INVESTIGATE, s_BroadcastEvent[sPed.iReceivedEvent].strEventName, vehs[GET_VAN_PLAYER_IS_IN()].id, TRUE, FALSE, bCameFromAlarm) ENDIF BREAK ENDSWITCH ENDIF sPed.iReceivedEvent = -1 //------------------------------------------------------------------------------------- // MANAGE STATES //------------------------------------------------------------------------------------- // Check for state update again IF sPed.eAIPrevFrame != sPed.eAI sPed.bAIStateChangedLastFrame = TRUE ELSE sPed.bAIStateChangedLastFrame = FALSE ENDIF sPed.eAIPrevFrame = sPed.eAI IF NOT ARE_STRINGS_EQUAL(sPed.strAIEventPrevFrame, sPed.strAIEvent) sPed.bAIEventChangedLastFrame = TRUE ELSE sPed.bAIEventChangedLastFrame = FALSE ENDIF sPed.strAIEventPrevFrame = sPed.strAIEvent MISSION_PED_FLAGS i, ePed REPEAT COUNT_OF(peds) i IF peds[i].id = sPed.id ePed = i ENDIF ENDREPEAT TEXT_LABEL_23 strRoot SWITCH sPed.eAI CASE PEDAI_FLEEING SWITCH GET_HASH_KEY(sPed.strAIEvent) CASE HASH("GUNSHOT") CASE HASH("SEEN_WEAPON") CASE HASH("PROJ_AIMED") CASE HASH("KILLED") CASE HASH("PLAYER_KILLED") CASE HASH("DEAD_BODY") // play panic responce IF HAS_PED_AI_JUST_ENTERED_STATE(sPed) // Either the AI has just jumped here OR sPed.iDiaFlag % 2 = 0 // every other convo should play this OR NOT IS_ENTITY_ALIVE(pedSecurity.id) // or the security guard is dead IF GET_HASH_KEY(sPed.strAIEvent) = HASH("GUNSHOT") OR GET_HASH_KEY(sPed.strAIEvent) = HASH("SEEN_WEAPON") OR GET_HASH_KEY(sPed.strAIEvent) = HASH("PROJ_AIMED") IF IS_PED_A_FOREMAN(ePed) strRoot = MODIFY_CONVO_ROOT_FOR_FOREMAN(ePed, "JS_GUN1") IF PLAY_CONVERSATION(ePed, strRoot, sPed.eAI, TRUE, TRUE, FALSE, 1000) BROADCAST_QUEUE_SCRIPT_AI_EVENT_PED(sPed, sPed.strAIEvent, strRoot, 15.0, 3000, 250, FALSE, TRUE) ELSE IF sPed.iDiaFlag = 0 BROADCAST_QUEUE_SCRIPT_AI_EVENT_PED(sPed, sPed.strAIEvent, "", 15.0, 3000, 250, TRUE, TRUE) ENDIF ENDIF ELSE SWITCH ePed CASE mpf_bugstar_front_1 strRoot = "SOL1_ARM1" BREAK CASE mpf_bugstar_front_2 strRoot = "SOL1_ARM2" BREAK ENDSWITCH IF PLAY_CONVERSATION(ePed, strRoot, sPed.eAI, TRUE, TRUE, FALSE, 1000) BROADCAST_QUEUE_SCRIPT_AI_EVENT_PED(sPed, sPed.strAIEvent, strRoot, 15.0, 3000, 250, FALSE, TRUE) ELSE IF sPed.iDiaFlag = 0 BROADCAST_QUEUE_SCRIPT_AI_EVENT_PED(sPed, sPed.strAIEvent, "", 15.0, 3000, 250, TRUE, TRUE) ENDIF ENDIF ENDIF ELIF GET_HASH_KEY(sPed.strAIEvent) = HASH("KILLED") OR GET_HASH_KEY(sPed.strAIEvent) = HASH("PLAYER_KILLED") OR GET_HASH_KEY(sPed.strAIEvent) = HASH("DEAD_BODY") IF IS_PED_A_FOREMAN(ePed) strRoot = MODIFY_CONVO_ROOT_FOR_FOREMAN(ePed, "JS_KILL") IF PLAY_CONVERSATION(ePed, strRoot, sPed.eAI, TRUE, TRUE, FALSE, 2000) BROADCAST_QUEUE_SCRIPT_AI_EVENT_PED(sPed, sPed.strAIEvent, strRoot, 15.0, 3000, 250, FALSE, TRUE) ELSE IF sPed.iDiaFlag = 0 BROADCAST_QUEUE_SCRIPT_AI_EVENT_PED(sPed, sPed.strAIEvent, "", 15.0, 3000, 250, TRUE, TRUE) ENDIF ENDIF ELSE IF sPed.iDiaFlag = 0 BROADCAST_QUEUE_SCRIPT_AI_EVENT_PED(sPed, sPed.strAIEvent, "", 15.0, 3000, 250, TRUE, TRUE) ENDIF ENDIF ENDIF sPed.iDiaFlag++ // Otherwise call for security ELSE IF IS_PED_A_FOREMAN(ePed) strRoot = MODIFY_CONVO_ROOT_FOR_FOREMAN(ePed, "JS_GETSEC") IF PLAY_CONVERSATION(ePed, strRoot, sPed.eAI, TRUE, TRUE, FALSE, 2000) BROADCAST_QUEUE_SCRIPT_AI_EVENT_PED(sPed, sPed.strAIEvent, strRoot, 15.0, 3000, 250, FALSE, TRUE, TRUE) ELSE IF sPed.iDiaFlag = 0 BROADCAST_QUEUE_SCRIPT_AI_EVENT_PED(sPed, sPed.strAIEvent, "", 15.0, 3000, 250, TRUE, TRUE, TRUE) ENDIF ENDIF ELSE SWITCH ePed CASE mpf_bugstar_front_1 strRoot = "SOL1_SECIN1" BREAK CASE mpf_bugstar_front_2 strRoot = "SOL1_SECIN2" BREAK ENDSWITCH IF PLAY_CONVERSATION(ePed, strRoot, sPed.eAI, TRUE, TRUE, FALSE, 2000) BROADCAST_QUEUE_SCRIPT_AI_EVENT_PED(sPed, sPed.strAIEvent, strRoot, 15.0, 3000, 250, FALSE, TRUE, TRUE) ELSE IF sPed.iDiaFlag = 0 BROADCAST_QUEUE_SCRIPT_AI_EVENT_PED(sPed, sPed.strAIEvent, "", 15.0, 3000, 250, TRUE, TRUE, TRUE) ENDIF ENDIF ENDIF sPed.iDiaFlag++ ENDIF BREAK ENDSWITCH BREAK CASE PEDAI_HANDSUP SWITCH GET_HASH_KEY(sPed.strAIEvent) CASE HASH("GUN_AIMED") IF IS_PLAYER_AIMING_AT_PED(sPed, WF_INCLUDE_GUN) SET_PED_AI_STATE(sPed, PEDAI_HANDSUP, FALSE, "GUN_AIMED_AT") ELIF GET_GAME_TIMER() - sPed.iTimeOfEnteringState > 1000 SET_PED_AI_STATE(sPed, PEDAI_FLEEING, TRUE, "SEEN_WEAPON") ENDIF BREAK CASE HASH("GUN_AIMED_AT") // Keep setting the state as long as the player is aiming at the ped IF IS_PLAYER_AIMING_AT_PED(sPed, WF_INCLUDE_GUN) SET_PED_AI_STATE(sPed, PEDAI_HANDSUP, TRUE, "GUN_AIMED_AT") ENDIF IF (GET_GAME_TIMER() - sPed.iTimeOfEnteringState > 15000 // flee after 15 seconds of being aimed at OR GET_GAME_TIMER() - sPed.iTimeOfStateLastSet > 3000) // flee after 3 seconds of NOT being aimed at AND NOT IS_PED_IN_CURRENT_CONVERSATION(sPed.id) SET_PED_AI_STATE(sPed, PEDAI_FLEEING, TRUE, "SEEN_WEAPON") ELSE // Play hands up pleading covnersations, first 1 interrupts and plays immediately IF HAS_PED_AI_JUST_ENTERED_STATE(sPed) OR sPed.iDiaFlag = 0 IF IS_PED_A_FOREMAN(ePed) strRoot = MODIFY_CONVO_ROOT_FOR_FOREMAN(ePed, "JS_HND1") IF PLAY_CONVERSATION(ePed, strRoot, sPed.eAI, TRUE, TRUE, FALSE, 500) BROADCAST_QUEUE_SCRIPT_AI_EVENT_PED(sPed, sPed.strAIEvent, strRoot, 5.0, 3000, 500, FALSE, TRUE) ELSE IF sPed.iDiaFlag = 0 BROADCAST_QUEUE_SCRIPT_AI_EVENT_PED(sPed, sPed.strAIEvent, "", 5.0, 3000, 500, TRUE, TRUE) ENDIF ENDIF ELSE SWITCH ePed CASE mpf_bugstar_front_1 strRoot = "SOL1_SCAR1" BREAK CASE mpf_bugstar_front_2 strRoot = "SOL1_SCAR2" BREAK ENDSWITCH IF PLAY_CONVERSATION(ePed, strRoot, sPed.eAI, TRUE, TRUE, FALSE, 500) BROADCAST_QUEUE_SCRIPT_AI_EVENT_PED(sPed, sPed.strAIEvent, strRoot, 5.0, 3000, 500, FALSE, TRUE) ELSE IF sPed.iDiaFlag = 0 BROADCAST_QUEUE_SCRIPT_AI_EVENT_PED(sPed, sPed.strAIEvent, "", 5.0, 3000, 500, TRUE, TRUE) ENDIF ENDIF ENDIF sPed.iDiaFlag++ // after that we don't interrupt and play every 2 seconds ELSE IF IS_PED_A_FOREMAN(ePed) strRoot = MODIFY_CONVO_ROOT_FOR_FOREMAN(ePed, "JS_HND1") IF PLAY_CONVERSATION(ePed, strRoot, sPed.eAI, FALSE, FALSE, TRUE, 2000) BROADCAST_QUEUE_SCRIPT_AI_EVENT_PED(sPed, sPed.strAIEvent, strRoot, 5.0, 3000, 500, FALSE, TRUE) ELSE IF sPed.iDiaFlag = 0 BROADCAST_QUEUE_SCRIPT_AI_EVENT_PED(sPed, sPed.strAIEvent, "", 5.0, 3000, 500, TRUE, TRUE) ENDIF ENDIF ELSE SWITCH ePed CASE mpf_bugstar_front_1 strRoot = "SOL1_SCAR1" BREAK CASE mpf_bugstar_front_2 strRoot = "SOL1_SCAR2" BREAK ENDSWITCH IF PLAY_CONVERSATION(ePed, strRoot, sPed.eAI, FALSE, FALSE, TRUE, 2000) BROADCAST_QUEUE_SCRIPT_AI_EVENT_PED(sPed, sPed.strAIEvent, strRoot, 5.0, 3000, 500, FALSE, TRUE) ELSE IF sPed.iDiaFlag = 0 BROADCAST_QUEUE_SCRIPT_AI_EVENT_PED(sPed, sPed.strAIEvent, "", 5.0, 3000, 500, TRUE, TRUE) ENDIF ENDIF ENDIF sPed.iDiaFlag++ ENDIF ENDIF BREAK ENDSWITCH BREAK CASE PEDAI_WORKING SWITCH ePed CASE mpf_bugstar_foreman_rear IF IS_SAFE_TO_START_CONVERSATION() AND GET_GAME_TIMER() - i_TimeOfLastConvo > 5000 SWITCH iStockCheckListProg CASE 0 PLAY_CONVERSATION(ePed, "JS_STOCK", sPed.eAI) iStockCheckListProg++ BREAK CASE 1 PLAY_CONVERSATION(ePed, "JS_STOCKb", sPed.eAI) iStockCheckListProg++ BREAK CASE 2 PLAY_CONVERSATION(ePed, "JS_STOCKc", sPed.eAI) iStockCheckListProg++ BREAK CASE 3 PLAY_CONVERSATION(ePed, "JS_STOCKd", sPed.eAI) iStockCheckListProg++ BREAK CASE 4 PLAY_CONVERSATION(ePed, "JS_STOCKe", sPed.eAI) iStockCheckListProg++ BREAK CASE 5 PLAY_CONVERSATION(ePed, "JS_STOCKf", sPed.eAI) iStockCheckListProg++ BREAK CASE 6 PLAY_CONVERSATION(ePed, "JS_STOCKg", sPed.eAI) iStockCheckListProg++ BREAK CASE 7 PLAY_CONVERSATION(ePed, "JS_STOCKh", sPed.eAI) iStockCheckListProg++ BREAK CASE 8 PLAY_CONVERSATION(ePed, "JS_STOCKi", sPed.eAI) iStockCheckListProg++ BREAK CASE 9 PLAY_CONVERSATION(ePed, "JS_STOCKj", sPed.eAI) iStockCheckListProg++ BREAK CASE 10 PLAY_CONVERSATION(ePed, "JS_STOCKk", sPed.eAI) iStockCheckListProg = 0 BREAK ENDSWITCH ENDIF BREAK CASE mpf_bugstar_front_1 IF NOT sPed.bPlayedConvoStart IF PLAY_CONVERSATION(ePed, "SOL1_AMB1", sPed.eAI, DEFAULT, DEFAULT, DEFAULT, DEFAULT, TRUE, DEFAULT, TRUE) ADD_PED_FOR_DIALOGUE(s_Convo, 4, peds[mpf_bugstar_front_1].id, "CONSTRUCTION1") ADD_PED_FOR_DIALOGUE(s_Convo, 3, peds[mpf_bugstar_front_2].id, "CONSTRUCTION2") sPed.bPlayedConvoStart = TRUE ENDIF ENDIF BREAK ENDSWITCH BREAK CASE PEDAI_INVESTIGATE BOOL bCanSeeDriver IF ARE_STRINGS_EQUAL(sPed.strAIEvent, "SEE_VAN_LEAVING") OR ARE_STRINGS_EQUAL(sPed.strAIEvent, "CHECK_DRIVER") FLOAT fDot, fAngle VECTOR v1, v2 v1 = NORMALISE_VECTOR( GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(PLAYER_PED_ID(), <<0,1,0>>) - GET_ENTITY_COORDS(PLAYER_PED_ID())) v2 = NORMALISE_VECTOR( GET_ENTITY_COORDS(peds[ePed].id) - GET_ENTITY_COORDS(PLAYER_PED_ID())) fDot = DOT_PRODUCT( v1, v2) fAngle = ACOS(fDot) IF fAngle < 90.0 AND fDistPlayer < 8.0 AND GET_ENTITY_SPEED(PLAYER_PED_ID()) < 1.0 bCanSeeDriver = TRUE ENDIF ENDIF SWITCH GET_HASH_KEY(sPed.strAIEvent) CASE HASH("SEE_VAN_LEAVING") CASE HASH("SEE_VAN_LEAVING_1") // Initial leaving convo IF HAS_PED_AI_JUST_ENTERED_STATE(sPed) AND ARE_STRINGS_EQUAL(sPed.strAIEvent, "SEE_VAN_LEAVING") IF IS_PED_A_FOREMAN(ePed) strRoot = MODIFY_CONVO_ROOT_FOR_FOREMAN(ePed, "JS_VAN_LVE1") PLAY_CONVERSATION(ePed, strRoot, sPed.eAI, TRUE, FALSE, TRUE, 1000) ENDIF // Can see the driver, check his ID ELIF bCanSeeDriver SET_PED_AI_STATE_WITH_ENTITY(sPed, PEDAI_INVESTIGATE, "CHECK_DRIVER", vehs[GET_VAN_PLAYER_IS_IN()].id, FALSE) ELIF GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(), v_WarehouseCoord) >= 20.0 // Van has left area, do not go over to investigate IF fDistPlayer > 5.0 SET_PED_AI_STATE(sPed, PEDAI_INVESTIGATE, FALSE, "VAN_LOST") ENDIF ENDIF BREAK CASE HASH("VAN_LOST") IF HAS_PED_AI_JUST_ENTERED_STATE(sPed) strRoot = MODIFY_CONVO_ROOT_FOR_FOREMAN(ePed, "JS_VAN_LVE2") PLAY_CONVERSATION(ePed, strRoot, sPed.eAI, TRUE, FALSE) ELSE // Go back to work after 3 seconds IF GET_GAME_TIMER() - sPed.iTimeOfEnteringState > 3000 SET_PED_AI_STATE(sPed, PEDAI_WORKING, FALSE, "BACK_TO_WORK") ENDIF ENDIF BREAK CASE HASH("CHECK_DRIVER") IF bCanSeeDriver // Has looked at driver for a short while, go to stealing state IF GET_GAME_TIMER() - sPed.iTimeOfEnteringState > 2000 AND NOT IS_PED_IN_CURRENT_CONVERSATION(sPed.id) SET_PED_AI_STATE(sPed, PEDAI_COMBAT_PLAYER, TRUE, "STEALING_VAN") ENDIF ELSE SET_PED_AI_STATE_WITH_ENTITY(sPed, PEDAI_INVESTIGATE, "SEE_VAN_LEAVING_1", vehs[GET_VAN_PLAYER_IS_IN()].id, FALSE) ENDIF BREAK CASE HASH("HEARD_PLAYER") // Has reached investigation coord IF GET_GAME_TIMER() - sPed.iTimeOfEnteringState > 4000 // give the ped chance to turn and look, safety for if the coord is very close to the ped AND GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(sPed.id, sPed.vInvestigationCoord) < 3.0 AND IS_PED_STILL(sPed.id) SET_PED_AI_STATE(sPed, PEDAI_INVESTIGATE, FALSE, "SOUND_LOST") ELIF HAS_PED_AI_JUST_ENTERED_STATE(sPed) IF IS_PED_A_FOREMAN(ePed) strRoot = MODIFY_CONVO_ROOT_FOR_FOREMAN(ePed, "JS_SND_INV") IF PLAY_CONVERSATION(ePed, strRoot, sPed.eAI, TRUE, TRUE, TRUE, 0) BROADCAST_QUEUE_SCRIPT_AI_EVENT_PED(sPed, sPed.strAIEvent, strRoot, 3.0, 3000, 500, FALSE) ENDIF ENDIF ENDIF BREAK CASE HASH("SOUND_LOST") IF GET_GAME_TIMER() - sPed.iTimeOfEnteringState > 4000 AND NOT IS_PED_IN_CURRENT_CONVERSATION(sPed.id) IF IS_PED_A_FOREMAN(ePed) strRoot = MODIFY_CONVO_ROOT_FOR_FOREMAN(ePed, "JS_SNDLOST2") PLAY_CONVERSATION(ePed, strRoot, sPed.eAI, FALSE, FALSE, TRUE, 1000) ENDIF SET_PED_AI_STATE(sPed, PEDAI_WORKING, FALSE, "BACK_TO_WORK") ELIF HAS_PED_AI_JUST_ENTERED_STATE(sPed) IF IS_PED_A_FOREMAN(ePed) strRoot = MODIFY_CONVO_ROOT_FOR_FOREMAN(ePed, "JS_SNDLOST1") PLAY_CONVERSATION(ePed, strRoot, sPed.eAI, FALSE, FALSE, TRUE, 1000) ENDIF ENDIF BREAK ENDSWITCH BREAK CASE PEDAI_COMBAT_PLAYER SWITCH GET_HASH_KEY(sPed.strAIEvent) CASE HASH("FIGHT") CASE HASH("FIGHT_RETURN") CASE HASH("RAN_OVER") CASE HASH("VEH_FAILED_LEAVE") // Player has ran out and the delay has passed IF GET_GAME_TIMER() - sPed.iTimeOfStateLastSet > 8000 AND GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(), v_WarehouseCoord) > 65 AND (GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), sPed.id) > 10.0 OR GET_GAME_TIMER() - sPed.iTimeOfStateLastSet > 16000) AND NOT IS_PED_IN_CURRENT_CONVERSATION(sPed.id) SET_PED_AI_STATE(sPed, PEDAI_COMBAT_PLAYER, FALSE, "FIGHT_ESC") ELIF HAS_PED_AI_JUST_ENTERED_STATE(sPed) AND sPed.bDirectEvent // only do for the ped who got started on, the other's don't need to call for help // Starts fighting with the bugstar staff IF NOT sPed.bHasFoughtWithPlayer IF IS_PED_A_FOREMAN(ePed) strRoot = MODIFY_CONVO_ROOT_FOR_FOREMAN(ePed, "JS_MELE_1") IF PLAY_CONVERSATION(ePed, strRoot, sPed.eAI, TRUE, TRUE, FALSE, 500) BROADCAST_QUEUE_SCRIPT_AI_EVENT_PED(sPed, sPed.strAIEvent, strRoot, 25.0, 3000, 1000) ENDIF ELSE SWITCH ePed CASE mpf_bugstar_front_1 strRoot = "SOL1_FIGHT1" BREAK CASE mpf_bugstar_front_2 strRoot = "SOL1_FIGHT2" BREAK ENDSWITCH IF PLAY_CONVERSATION(ePed, strRoot, sPed.eAI, TRUE, TRUE, FALSE, 500) BROADCAST_QUEUE_SCRIPT_AI_EVENT_PED(sPed, sPed.strAIEvent, strRoot, 25.0, 3000, 1000) ENDIF ENDIF sPed.bHasFoughtWithPlayer = TRUE // Player returns after being chased off ELSE IF IS_PED_A_FOREMAN(ePed) strRoot = MODIFY_CONVO_ROOT_FOR_FOREMAN(ePed, "JS_MELE_2") IF PLAY_CONVERSATION(ePed, strRoot, sPed.eAI, TRUE, TRUE, FALSE, 500) BROADCAST_QUEUE_SCRIPT_AI_EVENT_PED(sPed, sPed.strAIEvent, strRoot, 25.0, 3000, 1000) ENDIF ELSE SWITCH ePed CASE mpf_bugstar_front_1 strRoot = "SOL1_FIGHT1" BREAK CASE mpf_bugstar_front_2 strRoot = "SOL1_FIGHT2" BREAK ENDSWITCH IF PLAY_CONVERSATION(ePed, strRoot, sPed.eAI, TRUE, TRUE, FALSE, 500) BROADCAST_QUEUE_SCRIPT_AI_EVENT_PED(sPed, sPed.strAIEvent, strRoot, 25.0, 3000, 1000) ENDIF ENDIF ENDIF ENDIF BREAK CASE HASH("FIGHT_ESC") // Jump back to working state IF GET_GAME_TIMER() - sPed.iTimeOfEnteringState > 4000 SET_PED_AI_STATE(sPed, PEDAI_WORKING, FALSE, "BACK_TO_WORK") ENDIF IF HAS_PED_AI_JUST_ENTERED_STATE(sPed) IF IS_PED_A_FOREMAN(ePed) strRoot = MODIFY_CONVO_ROOT_FOR_FOREMAN(ePed, "JS_MELE_ESC") PLAY_CONVERSATION(ePed, strRoot, sPed.eAI, TRUE, TRUE, FALSE, 500) ENDIF ENDIF BREAK CASE HASH("STEALING_VAN") IF GET_GAME_TIMER() - sPed.iTimeOfEnteringState > 2000 AND sPed.bCanSeePlayer AND NOT IS_PED_IN_CURRENT_CONVERSATION(sPed.id) AND e_PlayerStatus != PLAYERSTATUS_VAN_STEALING AND e_PlayerStatus != PLAYERSTATUS_VAN_STEALING_TOW SET_PED_AI_STATE(sPed, PEDAI_COMBAT_PLAYER, FALSE, "EXIT_VAN", TRUE, FALSE) ENDIF // Ped first realises the van is being stolen IF HAS_PED_AI_JUST_ENTERED_STATE(sPed) IF IS_PED_A_FOREMAN(ePed) strRoot = MODIFY_CONVO_ROOT_FOR_FOREMAN(ePed, "JS_VAN_IN2") IF PLAY_CONVERSATION(ePed, strRoot, sPed.eAI, TRUE, TRUE, FALSE) BROADCAST_QUEUE_SCRIPT_AI_EVENT_PED(sPed, sPed.strAIEvent, strRoot, 25.0, 3000, 1000, FALSE, TRUE) ELSE BROADCAST_QUEUE_SCRIPT_AI_EVENT_PED(sPed, sPed.strAIEvent, strRoot, 25.0, 3000, 1000, TRUE, TRUE) ENDIF ELSE SWITCH ePed CASE mpf_bugstar_front_1 strRoot = "SOL1_VAN1" BREAK CASE mpf_bugstar_front_2 strRoot = "SOL1_VAN2" BREAK ENDSWITCH IF PLAY_CONVERSATION(ePed, strRoot, sPed.eAI, TRUE, TRUE, FALSE) BROADCAST_QUEUE_SCRIPT_AI_EVENT_PED(sPed, sPed.strAIEvent, strRoot, 25.0, 3000, 1000, FALSE, TRUE) ELSE BROADCAST_QUEUE_SCRIPT_AI_EVENT_PED(sPed, sPed.strAIEvent, strRoot, 25.0, 3000, 1000, TRUE, TRUE) ENDIF ENDIF ELSE IF IS_SAFE_TO_START_CONVERSATION() AND GET_GAME_TIMER() - i_TimeOfLastConvo > 2000 IF IS_PED_A_FOREMAN(ePed) strRoot = MODIFY_CONVO_ROOT_FOR_FOREMAN(ePed, "JS_VAN_TK") IF PLAY_CONVERSATION(ePed, strRoot, sPed.eAI, TRUE, TRUE, FALSE) BROADCAST_QUEUE_SCRIPT_AI_EVENT_PED(sPed, sPed.strAIEvent, strRoot, 25.0, 3000, 1000, FALSE, TRUE) ENDIF ENDIF ENDIF ENDIF BREAK CASE HASH("GET_IN_VAN") IF HAS_PED_AI_JUST_ENTERED_STATE(sPed) IF IS_PED_A_FOREMAN(ePed) strRoot = MODIFY_CONVO_ROOT_FOR_FOREMAN(ePed, "JS_VAN_IN1") IF PLAY_CONVERSATION(ePed, strRoot, sPed.eAI, TRUE, TRUE, FALSE) BROADCAST_QUEUE_SCRIPT_AI_EVENT_PED(sPed, sPed.strAIEvent, strRoot, 25.0, 3000, 1000, FALSE, TRUE) ELSE BROADCAST_QUEUE_SCRIPT_AI_EVENT_PED(sPed, sPed.strAIEvent, strRoot, 25.0, 3000, 1000, TRUE, TRUE) ENDIF ELSE SWITCH ePed CASE mpf_bugstar_front_1 strRoot = "SOL1_VAN1" BREAK CASE mpf_bugstar_front_2 strRoot = "SOL1_VAN2" BREAK ENDSWITCH IF PLAY_CONVERSATION(ePed, strRoot, sPed.eAI, TRUE, TRUE, FALSE) BROADCAST_QUEUE_SCRIPT_AI_EVENT_PED(sPed, sPed.strAIEvent, strRoot, 25.0, 3000, 1000, FALSE, TRUE) ELSE BROADCAST_QUEUE_SCRIPT_AI_EVENT_PED(sPed, sPed.strAIEvent, strRoot, 25.0, 3000, 1000, TRUE, TRUE) ENDIF ENDIF ELSE IF IS_SAFE_TO_START_CONVERSATION() AND GET_GAME_TIMER() - i_TimeOfLastConvo > 2000 IF IS_PED_A_FOREMAN(ePed) strRoot = MODIFY_CONVO_ROOT_FOR_FOREMAN(ePed, "JS_VAN_TK") IF PLAY_CONVERSATION(ePed, strRoot, sPed.eAI, TRUE, TRUE, FALSE) BROADCAST_QUEUE_SCRIPT_AI_EVENT_PED(sPed, sPed.strAIEvent, strRoot, 25.0, 3000, 1000, FALSE, TRUE) ELSE BROADCAST_QUEUE_SCRIPT_AI_EVENT_PED(sPed, sPed.strAIEvent, strRoot, 25.0, 3000, 1000, TRUE, TRUE) ENDIF ENDIF ENDIF ENDIF BREAK CASE HASH("EXIT_VAN") IF HAS_PED_AI_JUST_ENTERED_STATE(sPed) IF IS_PED_A_FOREMAN(ePed) strRoot = MODIFY_CONVO_ROOT_FOR_FOREMAN(ePed, "JS_VAN_IN2") IF PLAY_CONVERSATION(ePed, strRoot, sPed.eAI, TRUE, TRUE, FALSE) BROADCAST_QUEUE_SCRIPT_AI_EVENT_PED(sPed, sPed.strAIEvent, strRoot, 25.0, 3000, 1000, FALSE, TRUE) ELSE BROADCAST_QUEUE_SCRIPT_AI_EVENT_PED(sPed, sPed.strAIEvent, strRoot, 25.0, 3000, 1000, TRUE, TRUE) ENDIF ELSE SWITCH ePed CASE mpf_bugstar_front_1 strRoot = "SOL1_VAN1" BREAK CASE mpf_bugstar_front_2 strRoot = "SOL1_VAN2" BREAK ENDSWITCH IF PLAY_CONVERSATION(ePed, strRoot, sPed.eAI, TRUE, TRUE, FALSE) BROADCAST_QUEUE_SCRIPT_AI_EVENT_PED(sPed, sPed.strAIEvent, strRoot, 25.0, 3000, 1000, FALSE, TRUE) ELSE BROADCAST_QUEUE_SCRIPT_AI_EVENT_PED(sPed, sPed.strAIEvent, strRoot, 25.0, 3000, 1000, TRUE, TRUE) ENDIF ENDIF ENDIF BREAK ENDSWITCH BREAK CASE PEDAI_CONFRONTING_PLAYER IF GET_GAME_TIMER() - sPed.iTimeOfStateLastSet > 5000 AND NOT IS_PED_IN_CURRENT_CONVERSATION(sPed.id) // Go back to work IF ePed = mpf_bugstar_foreman_rear PLAY_CONVERSATION(ePed, "JS_STOCK2", PEDAI_WORKING, FALSE, FALSE, TRUE, 1000) iStockCheckListProg = 0 ENDIF SET_PED_AI_STATE(sPed, PEDAI_WORKING, FALSE, "BACK_TO_WORK") ELSE IF sPed.bCanSeePlayer // Hasn't set this state for at least a second so player is assumed to have left, change AI event to leave version IF GET_GAME_TIMER() - sPed.iTimeOfStateLastSet > 1000 AND NOT IS_PED_IN_CURRENT_CONVERSATION(sPed.id) IF ARE_STRINGS_EQUAL(sPed.strAIEvent, "ENT_FOOT") OR ARE_STRINGS_EQUAL(sPed.strAIEvent, "ENT_VEH") OR ARE_STRINGS_EQUAL(sPed.strAIEvent, "WH_FOOT") OR ARE_STRINGS_EQUAL(sPed.strAIEvent, "WH_VEH") TEXT_LABEL_31 strTemp strTemp = sPed.strAIEvent strTemp += "_LEAVE" SET_PED_AI_STATE(sPed, PEDAI_CONFRONTING_PLAYER, FALSE, strTemp) ENDIF ENDIF // Player still hasn't left the warehouse after all the warnings IF ARE_STRINGS_EQUAL(sPed.strAIEvent, "WH_FOOT") OR ARE_STRINGS_EQUAL(sPed.strAIEvent, "WH_VEH") OR ARE_STRINGS_EQUAL(sPed.strAIEvent, "WH_DITCH_VEH") AND NOT IS_PED_IN_CURRENT_CONVERSATION(sPed.id) IF sPed.iWarningsToLeaveWarehouse >= 6 AND i_TimeOfLastConvo != -1 AND GET_GAME_TIMER() - i_TimeOfLastConvo > 7000 // GIVE THE PLAYER 7 seconds AND GET_GAME_TIMER() - sPed.iTimeOfStateLastSet = 0 SET_PED_AI_STATE(sPed, PEDAI_COMBAT_PLAYER, FALSE, "WH_FAILED_LEAVE") ENDIF ENDIF ENDIF SWITCH GET_HASH_KEY(sPed.strAIEvent) CASE HASH("ENT_FOOT") // Has just jumpeped into the confrontation state IF HAS_PED_AI_JUST_ENTERED_STATE(sPed) // First geets player at the entrance IF NOT sPed.bAcquaintedPlayer IF IS_PED_A_FOREMAN(ePed) IF NOT sPed.bThinksPlayerIsPolice strRoot = MODIFY_CONVO_ROOT_FOR_FOREMAN(ePed, "JS_ENT_F1") PLAY_CONVERSATION(ePed, strRoot, sPed.eAI, TRUE, FALSE, FALSE, 500) ELSE strRoot = MODIFY_CONVO_ROOT_FOR_FOREMAN(ePed, "JS_ENT_F1_P") PLAY_CONVERSATION(ePed, strRoot, sPed.eAI, TRUE, FALSE, FALSE, 500) ENDIF ENDIF // Talk to the player upon returning to the site ELSE IF IS_PED_A_FOREMAN(ePed) IF NOT sPed.bThinksPlayerIsPolice strRoot = MODIFY_CONVO_ROOT_FOR_FOREMAN(ePed, "JS_ENT_F2") PLAY_CONVERSATION(ePed, strRoot, sPed.eAI, TRUE, TRUE, FALSE, 500) ELSE strRoot = MODIFY_CONVO_ROOT_FOR_FOREMAN(ePed, "JS_ENT_F2_P") PLAY_CONVERSATION(ePed, strRoot, sPed.eAI, TRUE, TRUE, FALSE, 500) ENDIF ENDIF ENDIF sPed.bAcquaintedPlayer = TRUE // Warns the player to leave the area ELSE IF IS_SAFE_TO_START_CONVERSATION() AND GET_GAME_TIMER() - i_TimeOfLastConvo > 5000 IF IS_PED_A_FOREMAN(ePed) IF NOT sPed.bThinksPlayerIsPolice strRoot = MODIFY_CONVO_ROOT_FOR_FOREMAN(ePed, "JS_ENT_F") PLAY_CONVERSATION(ePed, strRoot, sPed.eAI) ELSE strRoot = MODIFY_CONVO_ROOT_FOR_FOREMAN(ePed, "JS_ENT_F_P") PLAY_CONVERSATION(ePed, strRoot, sPed.eAI) ENDIF ENDIF ENDIF ENDIF BREAK CASE HASH("ENT_VEH") // Has just jumped into the confrontation state IF HAS_PED_AI_JUST_ENTERED_STATE(sPed) OR sPed.iDiaFlag = 0 // First geets player at the entrance IF NOT sPed.bAcquaintedPlayer IF IS_PED_A_FOREMAN(ePed) strRoot = MODIFY_CONVO_ROOT_FOR_FOREMAN(ePed, "JS_ENT_V1") IF PLAY_CONVERSATION(ePed, strRoot, sPed.eAI, TRUE, TRUE, FALSE, 500) sPed.iDiaFlag++ ENDIF ENDIF sPed.bAcquaintedPlayer = TRUE ELSE IF ARE_STRINGS_EQUAL(sPed.strAIEventPrev, "WH_VEH") IF IS_PED_A_FOREMAN(ePed) strRoot = MODIFY_CONVO_ROOT_FOR_FOREMAN(ePed, "JS_ENT_V") IF PLAY_CONVERSATION(ePed, strRoot, sPed.eAI, TRUE, TRUE, FALSE, 1000) sPed.iDiaFlag++ ENDIF ENDIF ELSE IF IS_PED_A_FOREMAN(ePed) strRoot = MODIFY_CONVO_ROOT_FOR_FOREMAN(ePed, "JS_ENT_V3") IF PLAY_CONVERSATION(ePed, strRoot, sPed.eAI, TRUE, TRUE, FALSE, 1000) sPed.iDiaFlag++ ENDIF ENDIF ENDIF ENDIF // Warns the player to leave the area ELSE IF IS_SAFE_TO_START_CONVERSATION() AND GET_GAME_TIMER() - i_TimeOfLastConvo > 5000 IF IS_PED_A_FOREMAN(ePed) strRoot = MODIFY_CONVO_ROOT_FOR_FOREMAN(ePed, "JS_ENT_V3") PLAY_CONVERSATION(ePed, strRoot, sPed.eAI) ENDIF ENDIF ENDIF BREAK CASE HASH("WH_FOOT") // Has just jumpeped into the confrontation state IF HAS_PED_AI_JUST_ENTERED_STATE(sPed) // First warns the player about being inside the warehouse IF sPed.iWarningsToLeaveWarehouse = 0 IF IS_PED_A_FOREMAN(ePed) strRoot = MODIFY_CONVO_ROOT_FOR_FOREMAN(ePed, "JS_WH1") IF PLAY_CONVERSATION(ePed, strRoot, sPed.eAI, TRUE, TRUE) BROADCAST_QUEUE_SCRIPT_AI_EVENT_PED(sPed, sPed.strAIEvent, strRoot, 5.0, 3000, 500) ELSE BROADCAST_QUEUE_SCRIPT_AI_EVENT_PED(sPed, sPed.strAIEvent, "", 5.0, 3000, 500, TRUE) ENDIF sPed.iWarningsToLeaveWarehouse++ ENDIF // player has already been warned before upon returning ELIF sPed.iWarningsToLeaveWarehouse > 0 IF IS_PED_A_FOREMAN(ePed) strRoot = MODIFY_CONVO_ROOT_FOR_FOREMAN(ePed, "JS_WH2") IF PLAY_CONVERSATION(ePed, strRoot, sPed.eAI, TRUE, TRUE) BROADCAST_QUEUE_SCRIPT_AI_EVENT_PED(sPed, sPed.strAIEvent, strRoot, 5.0, 3000, 500) ELSE BROADCAST_QUEUE_SCRIPT_AI_EVENT_PED(sPed, sPed.strAIEvent, "", 5.0, 3000, 500, TRUE) ENDIF sPed.iWarningsToLeaveWarehouse++ ENDIF ENDIF sPed.bAcquaintedPlayer = TRUE // Warns the player to leave the warehouse ELSE IF sPed.iWarningsToLeaveWarehouse < 6 IF IS_SAFE_TO_START_CONVERSATION() AND GET_GAME_TIMER() - i_TimeOfLastConvo > 5000 IF IS_PED_A_FOREMAN(ePed) // normal warning IF sPed.iWarningsToLeaveWarehouse < 5 strRoot = MODIFY_CONVO_ROOT_FOR_FOREMAN(ePed, "JS_WH") // issue final warning ELSE strRoot = MODIFY_CONVO_ROOT_FOR_FOREMAN(ePed, "JS_WH_F") ENDIF IF PLAY_CONVERSATION(ePed, strRoot, sPed.eAI, TRUE, TRUE) BROADCAST_QUEUE_SCRIPT_AI_EVENT_PED(sPed, sPed.strAIEvent, strRoot, 10.0, 3000, 500) ELSE BROADCAST_QUEUE_SCRIPT_AI_EVENT_PED(sPed, sPed.strAIEvent, "", 10.0, 3000, 500, TRUE) ENDIF sPed.iWarningsToLeaveWarehouse++ ENDIF ENDIF ENDIF ENDIF BREAK CASE HASH("WH_DITCH_VEH") // Has just jumpeped into the confrontation state IF HAS_PED_AI_JUST_ENTERED_STATE(sPed) // First warns the player about being inside the warehouse IF sPed.iWarningsToLeaveWarehouse = 0 IF IS_PED_A_FOREMAN(ePed) strRoot = MODIFY_CONVO_ROOT_FOR_FOREMAN(ePed, "JS_WH1") IF PLAY_CONVERSATION(ePed, strRoot, sPed.eAI, TRUE, TRUE) BROADCAST_QUEUE_SCRIPT_AI_EVENT_PED(sPed, sPed.strAIEvent, strRoot, 5.0, 3000, 500) ELSE BROADCAST_QUEUE_SCRIPT_AI_EVENT_PED(sPed, sPed.strAIEvent, "", 5.0, 3000, 500, TRUE) ENDIF sPed.iWarningsToLeaveWarehouse++ ENDIF // player has already been warned before upon returning ELIF sPed.iWarningsToLeaveWarehouse > 0 IF IS_PED_A_FOREMAN(ePed) strRoot = MODIFY_CONVO_ROOT_FOR_FOREMAN(ePed, "JS_WH2") IF PLAY_CONVERSATION(ePed, strRoot, sPed.eAI, TRUE, TRUE) BROADCAST_QUEUE_SCRIPT_AI_EVENT_PED(sPed, sPed.strAIEvent, strRoot, 5.0, 3000, 500) ELSE BROADCAST_QUEUE_SCRIPT_AI_EVENT_PED(sPed, sPed.strAIEvent, "", 5.0, 3000, 500, TRUE) ENDIF sPed.iWarningsToLeaveWarehouse++ ENDIF ENDIF sPed.bAcquaintedPlayer = TRUE // Warns the player to leave the warehouse ELSE IF sPed.iWarningsToLeaveWarehouse < 6 IF IS_SAFE_TO_START_CONVERSATION() AND GET_GAME_TIMER() - i_TimeOfLastConvo > 5000 IF IS_PED_A_FOREMAN(ePed) // normal warning IF sPed.iWarningsToLeaveWarehouse < 5 IF (sPed.iWarningsToLeaveWarehouse-1) % 2 = 0 strRoot = MODIFY_CONVO_ROOT_FOR_FOREMAN(ePed, "JS_ENT_V4") ELSE strRoot = MODIFY_CONVO_ROOT_FOR_FOREMAN(ePed, "JS_ENT_V3") ENDIF // issue final warning ELSE strRoot = MODIFY_CONVO_ROOT_FOR_FOREMAN(ePed, "JS_WH_F") ENDIF IF PLAY_CONVERSATION(ePed, strRoot, sPed.eAI, TRUE, TRUE) BROADCAST_QUEUE_SCRIPT_AI_EVENT_PED(sPed, sPed.strAIEvent, strRoot, 10.0, 3000, 500) ELSE BROADCAST_QUEUE_SCRIPT_AI_EVENT_PED(sPed, sPed.strAIEvent, "", 10.0, 3000, 500, TRUE) ENDIF sPed.iWarningsToLeaveWarehouse++ ENDIF ENDIF ENDIF ENDIF BREAK CASE HASH("WH_VEH") // Has just jumpeped into the confrontation state IF HAS_PED_AI_JUST_ENTERED_STATE(sPed) // First warns the player about being inside the warehouse IF sPed.iWarningsToLeaveWarehouse = 0 IF IS_PED_A_FOREMAN(ePed) strRoot = MODIFY_CONVO_ROOT_FOR_FOREMAN(ePed, "JS_WH1") IF PLAY_CONVERSATION(ePed, strRoot, sPed.eAI, TRUE, TRUE) BROADCAST_QUEUE_SCRIPT_AI_EVENT_PED(sPed, sPed.strAIEvent, strRoot, 5.0, 3000, 500) ELSE BROADCAST_QUEUE_SCRIPT_AI_EVENT_PED(sPed, sPed.strAIEvent, "", 5.0, 3000, 500, TRUE) ENDIF sPed.iWarningsToLeaveWarehouse++ ENDIF // player has already been warned before upon returning ELIF sPed.iWarningsToLeaveWarehouse > 0 IF IS_PED_A_FOREMAN(ePed) strRoot = MODIFY_CONVO_ROOT_FOR_FOREMAN(ePed, "JS_WH2") IF PLAY_CONVERSATION(ePed, strRoot, sPed.eAI, TRUE, TRUE) BROADCAST_QUEUE_SCRIPT_AI_EVENT_PED(sPed, sPed.strAIEvent, strRoot, 5.0, 3000, 500) ELSE BROADCAST_QUEUE_SCRIPT_AI_EVENT_PED(sPed, sPed.strAIEvent, "", 5.0, 3000, 500, TRUE) ENDIF sPed.iWarningsToLeaveWarehouse++ ENDIF ENDIF sPed.bAcquaintedPlayer = TRUE // Warns the player to leave the warehouse ELSE IF sPed.iWarningsToLeaveWarehouse < 6 IF IS_SAFE_TO_START_CONVERSATION() AND GET_GAME_TIMER() - i_TimeOfLastConvo > 5000 IF IS_PED_A_FOREMAN(ePed) // normal warning IF sPed.iWarningsToLeaveWarehouse < 5 IF (sPed.iWarningsToLeaveWarehouse-1) % 2 = 0 strRoot = MODIFY_CONVO_ROOT_FOR_FOREMAN(ePed, "JS_ENT_V3") ELSE strRoot = MODIFY_CONVO_ROOT_FOR_FOREMAN(ePed, "JS_WH") ENDIF // issue final warning ELSE strRoot = MODIFY_CONVO_ROOT_FOR_FOREMAN(ePed, "JS_WH_F") ENDIF IF PLAY_CONVERSATION(ePed, strRoot, sPed.eAI, TRUE, TRUE) BROADCAST_QUEUE_SCRIPT_AI_EVENT_PED(sPed, sPed.strAIEvent, strRoot, 10.0, 3000, 500) ELSE BROADCAST_QUEUE_SCRIPT_AI_EVENT_PED(sPed, sPed.strAIEvent, "", 10.0, 3000, 500, TRUE) ENDIF sPed.iWarningsToLeaveWarehouse++ ENDIF ENDIF ENDIF ENDIF BREAK CASE HASH("ENT_DITCH_VEH") // No broadcast events for ditching at the entrance IF sPed.iDiaFlag = 0 IF IS_SAFE_TO_START_CONVERSATION() AND GET_GAME_TIMER() - i_TimeOfLastConvo > 1000 IF IS_PED_A_FOREMAN(ePed) strRoot = MODIFY_CONVO_ROOT_FOR_FOREMAN(ePed, "JS_ENT_V4") PLAY_CONVERSATION(ePed, strRoot, sPed.eAI) ENDIF sPed.iDiaFlag++ ENDIF ELSE IF IS_SAFE_TO_START_CONVERSATION() AND GET_GAME_TIMER() - i_TimeOfLastConvo > 5000 IF (sPed.iDiaFlag-1) % 3 = 0 strRoot = MODIFY_CONVO_ROOT_FOR_FOREMAN(ePed, "JS_ENT_V4") ELSE strRoot = MODIFY_CONVO_ROOT_FOR_FOREMAN(ePed, "JS_ENT_V3") ENDIF PLAY_CONVERSATION(ePed, strRoot, sPed.eAI) sPed.iDiaFlag++ ENDIF ENDIF BREAK CASE HASH("ENT_FOOT_LEAVE") IF sPed.iDiaFlag = 0 // Player has left the area IF IS_SAFE_TO_START_CONVERSATION() AND GET_GAME_TIMER() - i_TimeOfLastConvo > 1000 IF IS_PED_A_FOREMAN(ePed) IF NOT sPed.bThinksPlayerIsPolice strRoot = MODIFY_CONVO_ROOT_FOR_FOREMAN(ePed, "JS_ENT_F3") PLAY_CONVERSATION(ePed, strRoot, sPed.eAI, FALSE, FALSE) ELSE strRoot = MODIFY_CONVO_ROOT_FOR_FOREMAN(ePed, "JS_ENT_F3_P") PLAY_CONVERSATION(ePed, strRoot, sPed.eAI, FALSE, FALSE) ENDIF ENDIF sPed.iDiaFlag++ ENDIF ENDIF BREAK CASE HASH("ENT_VEH_LEAVE") CASE HASH("WH_FOOT_LEAVE") CASE HASH("WH_VEH_LEAVE") IF sPed.iDiaFlag = 0 // Player has left the area IF IS_SAFE_TO_START_CONVERSATION() AND GET_GAME_TIMER() - i_TimeOfLastConvo > 1000 IF IS_PED_A_FOREMAN(ePed) strRoot = MODIFY_CONVO_ROOT_FOR_FOREMAN(ePed, "JS_ENT_V5") PLAY_CONVERSATION(ePed, strRoot, sPed.eAI, FALSE, FALSE) ENDIF sPed.iDiaFlag++ ENDIF ENDIF BREAK ENDSWITCH ENDIF BREAK ENDSWITCH ENDPROC PROC BUGSTAR_STAFF_AI_TASKS(PED_STRUCT &sPed) SET_PED_SHOULD_PLAY_IMMEDIATE_SCENARIO_EXIT(sPed.id) IF HAS_PED_AI_JUST_CHANGED_STATE(sPed) sPed.iFlagTask = 0 ENDIF SWITCH sPed.eAI CASE PEDAI_WORKING MISSION_PED_FLAGS ePedFlag, ePed REPEAT COUNT_OF(peds) ePed IF peds[ePed].id = sPed.id ePedFlag = ePed ENDIF ENDREPEAT IF ePedFlag != mpf_invalid SWITCH ePedFlag CASE mpf_bugstar_foreman_front IF NOT IS_SCRIPT_TASK_RUNNING_OR_STARTING(sPed.id, SCRIPT_TASK_USE_NEAREST_SCENARIO_TO_POS) IF DOES_SCENARIO_EXIST_IN_AREA(<<155.74, -3098.89, 4.93>>, 0.5, TRUE) // go back to the mobile phone scenario TASK_USE_NEAREST_SCENARIO_TO_COORD(sPed.id, <<155.74, -3098.89, 4.93>>, 0.5, -1) ENDIF ENDIF BREAK CASE mpf_bugstar_foreman_rear IF (NOT IS_SCRIPT_TASK_RUNNING_OR_STARTING(sPed.id, SCRIPT_TASK_PERFORM_SEQUENCE) OR HAS_PED_AI_JUST_CHANGED_STATE(sPed)) AND HAS_ANIM_DICT_LOADED("misslsdhsclipboard@base") IF NOT IS_ENTITY_PLAYING_ANIM(sPed.id, "misslsdhsclipboard@base", "base") // ped goes to the back of the van OPEN_SEQUENCE_TASK(seq_main) IF NOT ARE_VECTORS_ALMOST_EQUAL(GET_ENTITY_COORDS(sPed.id), <<126.8496, -3089.2493, 4.9141>>, 0.75) TASK_FOLLOW_NAV_MESH_TO_COORD(null, <<126.8496, -3089.2493, 4.9141>>, PEDMOVE_WALK, DEFAULT_TIME_NEVER_WARP, 0.5, ENAV_DEFAULT, 264.2812) ENDIF TASK_ACHIEVE_HEADING(null, 264.2812) TASK_PLAY_ANIM(null, "misslsdhsclipboard@base", "base", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING) CLOSE_SEQUENCE_TASK(seq_main) TASK_PERFORM_SEQUENCE(sPed.id, seq_main) CLEAR_SEQUENCE_TASK(seq_main) ENDIF IF DOES_ENTITY_EXIST(vehs[mvf_bugstar_van_3].id) TASK_LOOK_AT_COORD(sPed.id, GET_WORLD_POSITION_OF_ENTITY_BONE(vehs[mvf_bugstar_van_3].id, GET_ENTITY_BONE_INDEX_BY_NAME(vehs[mvf_bugstar_van_3].id, "engine")), -1, SLF_DEFAULT, SLF_LOOKAT_MEDIUM) ENDIF sPed.iFlagTask = 0 ELIF HAS_ANIM_DICT_LOADED("misslsdhsclipboard@idle_a") SWITCH sPed.iFlagTask CASE 0 FALLTHRU CASE 2 // Mark the clipboard prop ready for recreation IF sPed.iFlagTask = 0 AND GET_SEQUENCE_PROGRESS(sPed.id) = 2 sPed.bSafeToCreateProp = TRUE ENDIF IF ((sPed.iFlagTask = 0 AND GET_SEQUENCE_PROGRESS(sPed.id) = 2) OR sPed.iFlagTask = 2) AND GET_GAME_TIMER() > sPed.iTimeOfEnteringState OPEN_SEQUENCE_TASK(seq_main) TEXT_LABEL_23 strAnim SWITCH GET_RANDOM_INT_IN_RANGE(0, 3) CASE 0 strAnim = "idle_a" BREAK CASE 1 strAnim = "idle_b" BREAK CASE 2 strAnim = "idle_c" BREAK ENDSWITCH TASK_PLAY_ANIM(null, "misslsdhsclipboard@idle_a", strAnim, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1) TASK_PLAY_ANIM(null, "misslsdhsclipboard@base", "base", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING) CLOSE_SEQUENCE_TASK(seq_main) TASK_PERFORM_SEQUENCE(sPed.id, seq_main) CLEAR_SEQUENCE_TASK(seq_main) sPed.iFlagTask = 1 ENDIF BREAK CASE 1 IF GET_SEQUENCE_PROGRESS(sPed.id) = 1 sPed.iFlagTask++ ENDIF BREAK ENDSWITCH ENDIF BREAK CASE mpf_bugstar_front_1 FALLTHRU CASE mpf_bugstar_front_2 IF NOT IS_SCRIPT_TASK_RUNNING_OR_STARTING(sPed.id, SCRIPT_TASK_USE_NEAREST_SCENARIO_TO_POS) IF DOES_SCENARIO_EXIST_IN_AREA(<<159.82, -3085.93, 5.00>>, 0.1, TRUE) TASK_USE_NEAREST_SCENARIO_TO_COORD(sPed.id, <<159.82, -3085.93, 5.00>>, 0.1, -1) ELIF DOES_SCENARIO_EXIST_IN_AREA(<<160.15, -3084.79, 4.99>>, 0.1, TRUE) TASK_USE_NEAREST_SCENARIO_TO_COORD(sPed.id, <<160.15, -3084.79, 4.99>>, 0.1, -1) ELIF DOES_SCENARIO_EXIST_IN_AREA(<<159.09, -3085.02, 5.01>>, 0.1, TRUE) TASK_USE_NEAREST_SCENARIO_TO_COORD(sPed.id, <<159.09, -3085.02, 5.01>>, 0.1, -1) ENDIF ENDIF BREAK ENDSWITCH ENDIF BREAK CASE PEDAI_INVESTIGATE SWITCH GET_HASH_KEY(sPed.strAIEvent) CASE HASH("HEARD_VAN") CASE HASH("CHECK_DRIVER") CASE HASH("SEE_VAN_LEAVING") CASE HASH("SEE_VAN_LEAVING_1") IF DOES_ENTITY_EXIST(sPed.entityInvestigating) IF NOT IS_PED_HEADING_TOWARDS_POSITION(sPed.id, GET_ENTITY_COORDS(sPed.entityInvestigating), 180) AND GET_GAME_TIMER() - sPed.iTimeOfEnteringState < 5000 // not faced it after 5 seconds just walk to target IF NOT IS_SCRIPT_TASK_RUNNING_OR_STARTING(sPed.id, SCRIPT_TASK_TURN_PED_TO_FACE_ENTITY) OR HAS_PED_AI_JUST_CHANGED_STATE(sPed) TASK_TURN_PED_TO_FACE_ENTITY(sPed.id, sPed.entityInvestigating, -1) TASK_LOOK_AT_ENTITY(sPed.id, sPed.entityInvestigating, -1, SLF_WHILE_NOT_IN_FOV) ENDIF // begin walk over to the entity once facing it ELSE IF NOT IS_SCRIPT_TASK_RUNNING_OR_STARTING(sPed.id, SCRIPT_TASK_GOTO_ENTITY_OFFSET) OR HAS_PED_AI_JUST_CHANGED_STATE(sPed) TASK_GOTO_ENTITY_OFFSET_XY(sPed.id, sPed.entityInvestigating, DEFAULT_TIME_NEVER_WARP, 2.0, -1.0, 2.5, PEDMOVE_WALK, ESEEK_OFFSET_ORIENTATES_WITH_ENTITY) ENDIF ENDIF ENDIF BREAK CASE HASH("HEARD_PLAYER") BOOL bRetask // Update last heard at coord IF sPed.bCanHearPlayer AND NOT ARE_VECTORS_ALMOST_EQUAL(sPed.vInvestigationCoord, sPed.vLastPosPlayerHeardAt, 1.0) // only update last heard coord every 1m sPed.vInvestigationCoord = sPed.vLastPosPlayerHeardAt bRetask = TRUE // coord updated so retask the ped with the new coord CPRINTLN(DEBUG_MISSION, "INVESTIGATION COORD UPDATE vInvestigationCoord:", sPed.vInvestigationCoord, " vLastPosPlayerHeardAt:", sPed.vLastPosPlayerHeardAt) ENDIF IF NOT IS_VECTOR_ZERO(sPed.vInvestigationCoord) // turn the ped around IF NOT IS_PED_HEADING_TOWARDS_POSITION(sPed.id, sPed.vInvestigationCoord, 90) AND GET_GAME_TIMER() - sPed.iTimeOfEnteringState < 5000 IF NOT IS_SCRIPT_TASK_RUNNING_OR_STARTING(sPed.id, SCRIPT_TASK_TURN_PED_TO_FACE_COORD) OR HAS_PED_AI_JUST_CHANGED_STATE(sPed) OR bRetask TASK_TURN_PED_TO_FACE_COORD(sPed.id, sPed.vInvestigationCoord) TASK_LOOK_AT_COORD(sPed.id, sPed.vInvestigationCoord, -1, SLF_WHILE_NOT_IN_FOV) ENDIF // begin walk over to the sound ELSE IF NOT IS_SCRIPT_TASK_RUNNING_OR_STARTING(sPed.id, SCRIPT_TASK_FOLLOW_NAV_MESH_TO_COORD) OR HAS_PED_AI_JUST_CHANGED_STATE(sPed) OR bRetask TASK_FOLLOW_NAV_MESH_TO_COORD(sPed.id, sPed.vLastPosPlayerHeardAt, PEDMOVE_WALK, DEFAULT_TIME_NEVER_WARP, 3.0) ENDIF ENDIF ENDIF BREAK CASE HASH("HEARD_ALARM") BREAK CASE HASH("SOUND_LOST") // Stand and look at the van driving off IF NOT IS_VECTOR_ZERO(sPed.vInvestigationCoord) IF NOT IS_SCRIPT_TASK_RUNNING_OR_STARTING(sPed.id, SCRIPT_TASK_TURN_PED_TO_FACE_COORD) OR HAS_PED_AI_JUST_CHANGED_STATE(sPed) TASK_TURN_PED_TO_FACE_COORD(sPed.id, sPed.vInvestigationCoord, -1) TASK_LOOK_AT_COORD(sPed.id, sPed.vInvestigationCoord, -1, SLF_WHILE_NOT_IN_FOV) ENDIF // no van stored, just stand still ELSE TASK_STAND_STILL(sPed.id, -1) ENDIF BREAK CASE HASH("VAN_LOST") // Stand and look at the van driving off IF DOES_ENTITY_EXIST(sPed.entityInvestigating) IF NOT IS_SCRIPT_TASK_RUNNING_OR_STARTING(sPed.id, SCRIPT_TASK_TURN_PED_TO_FACE_ENTITY) OR HAS_PED_AI_JUST_CHANGED_STATE(sPed) TASK_TURN_PED_TO_FACE_ENTITY(sPed.id, sPed.entityInvestigating, -1) TASK_LOOK_AT_ENTITY(sPed.id, sPed.entityInvestigating, -1, SLF_WHILE_NOT_IN_FOV) ENDIF // no van stored, just stand still ELSE TASK_STAND_STILL(sPed.id, -1) ENDIF BREAK ENDSWITCH BREAK CASE PEDAI_CONFRONTING_PLAYER IF ARE_STRINGS_EQUAL(sPed.strAIEvent, "ENT_FOOT_LEAVE") OR ARE_STRINGS_EQUAL(sPed.strAIEvent, "ENT_VEH_LEAVE") OR ARE_STRINGS_EQUAL(sPed.strAIEvent, "WH_FOOT_LEAVE") OR ARE_STRINGS_EQUAL(sPed.strAIEvent, "WH_VEH_LEAVE") // Stop following and stand and watch player IF NOT IS_SCRIPT_TASK_RUNNING_OR_STARTING(sPed.id, SCRIPT_TASK_PERFORM_SEQUENCE) OR NOT IS_PED_FACING_PED(sPed.id, PLAYER_PED_ID(), 90) OR HAS_PED_AI_JUST_CHANGED_STATE(sPed) OPEN_SEQUENCE_TASK(seq_main) TASK_TURN_PED_TO_FACE_ENTITY(null, PLAYER_PED_ID()) TASK_STAND_STILL(null, 2000) SET_SEQUENCE_TO_REPEAT(seq_main, REPEAT_FOREVER) CLOSE_SEQUENCE_TASK(seq_main) TASK_PERFORM_SEQUENCE(sPed.id, seq_main) CLEAR_SEQUENCE_TASK(seq_main) TASK_LOOK_AT_ENTITY(sPed.id, PLAYER_PED_ID(), -1, SLF_WHILE_NOT_IN_FOV) ENDIF ELSE ENTITY_INDEX entityTarget FLOAT fDistFromTarget FLOAT fPlayerDistFromVehicle FLOAT fMoveBlendRatio IF DOES_ENTITY_EXIST(veh_DumpedAtEntrance) AND IS_VEHICLE_DRIVEABLE(veh_DumpedAtEntrance) fPlayerDistFromVehicle = GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), veh_DumpedAtEntrance) ENDIF IF e_PlayerStatus = PLAYERSTATUS_WAREHOUSE_IN_VEHICLE OR e_PlayerStatus = PLAYERSTATUS_WAREHOUSE_ON_FOOT OR e_PlayerStatus = PLAYERSTATUS_VAN_DAMAGE entityTarget = PLAYER_PED_ID() fMoveBlendRatio = PEDMOVE_RUN ELIF e_PlayerStatus = PLAYERSTATUS_BLOCKING_ENTRANCE_ON_FOOT OR e_PlayerStatus = PLAYERSTATUS_BLOCKING_ENTRANCE_WITH_VEHICLE entityTarget = PLAYER_PED_ID() fMoveBlendRatio = PEDMOVE_WALK ELIF e_PlayerStatus = PLAYERSTATUS_WAREHOUSE_DITCH_VEH AND DOES_ENTITY_EXIST(veh_DumpedAtEntrance) IF fPlayerDistFromVehicle > 10.0 entityTarget = PLAYER_PED_ID() fMoveBlendRatio = PEDMOVE_RUN ELSE entityTarget = veh_DumpedAtEntrance fMoveBlendRatio = PEDMOVE_RUN ENDIF ELIF e_PlayerStatus = PLAYERSTATUS_ENTRANCE_DITCH_VEH AND DOES_ENTITY_EXIST(veh_DumpedAtEntrance) entityTarget = veh_DumpedAtEntrance fMoveBlendRatio = PEDMOVE_WALK ENDIF IF DOES_ENTITY_EXIST(entityTarget) fDistFromTarget = GET_DISTANCE_BETWEEN_ENTITIES(sPed.id, entityTarget) ENDIF // Track the player while close IF fDistFromTarget <= 7.5 IF (NOT IS_SCRIPT_TASK_RUNNING_OR_STARTING(sPed.id, SCRIPT_TASK_PERFORM_SEQUENCE) AND NOT IS_SCRIPT_TASK_RUNNING_OR_STARTING(sPed.id, SCRIPT_TASK_GO_TO_ENTITY)) OR NOT IS_PED_FACING_PED(sPed.id, PLAYER_PED_ID(), 90) OR HAS_PED_AI_JUST_CHANGED_STATE(sPed) OPEN_SEQUENCE_TASK(seq_main) TASK_TURN_PED_TO_FACE_ENTITY(null, PLAYER_PED_ID()) TASK_STAND_STILL(null, 2000) SET_SEQUENCE_TO_REPEAT(seq_main, REPEAT_FOREVER) CLOSE_SEQUENCE_TASK(seq_main) TASK_PERFORM_SEQUENCE(sPed.id, seq_main) CLEAR_SEQUENCE_TASK(seq_main) TASK_LOOK_AT_ENTITY(sPed.id, PLAYER_PED_ID(), -1, SLF_WHILE_NOT_IN_FOV) ENDIF // Follow the player around ELSE IF NOT IS_SCRIPT_TASK_RUNNING_OR_STARTING(sPed.id, SCRIPT_TASK_GO_TO_ENTITY) OR HAS_PED_AI_JUST_CHANGED_STATE(sPed) FLOAT fRadius IF fMoveBlendRatio > PEDMOVE_WALK fRadius = 6.0 ELSE fRadius = 3.0 ENDIF TASK_GO_TO_ENTITY(sPed.id, entityTarget, DEFAULT_TIME_NEVER_WARP, fRadius, fMoveBlendRatio) TASK_LOOK_AT_ENTITY(sPed.id, PLAYER_PED_ID(), -1, SLF_WHILE_NOT_IN_FOV) ENDIF ENDIF ENDIF BREAK CASE PEDAI_COMBAT_PLAYER SWITCH GET_HASH_KEY(sPed.strAIEvent) CASE HASH("FIGHT") CASE HASH("FIGHT_RETURN") CASE HASH("RAN_OVER") CASE HASH("WH_FAILED_LEAVE") CASE HASH("STEALING_VAN") CASE HASH("GET_IN_VAN") CASE HASH("EXIT_VAN") CASE HASH("PLAYER_KO") WEAPON_TYPE weapTemp IF GET_CURRENT_PED_WEAPON(sPed.id, weapTemp) IF weapTemp != WEAPONTYPE_UNARMED SET_CURRENT_PED_WEAPON(sPed.id, WEAPONTYPE_UNARMED) ENDIF ENDIF IF NOT IS_SCRIPT_TASK_RUNNING_OR_STARTING(sPed.id, SCRIPT_TASK_COMBAT) TASK_COMBAT_PED(sPed.id, PLAYER_PED_ID()) ENDIF BREAK CASE HASH("FIGHT_ESC") // Stop following and stand and watch player IF NOT IS_SCRIPT_TASK_RUNNING_OR_STARTING(sPed.id, SCRIPT_TASK_PERFORM_SEQUENCE) OR NOT IS_PED_FACING_PED(sPed.id, PLAYER_PED_ID(), 90) OR HAS_PED_AI_JUST_CHANGED_STATE(sPed) OPEN_SEQUENCE_TASK(seq_main) TASK_TURN_PED_TO_FACE_ENTITY(null, PLAYER_PED_ID()) TASK_STAND_STILL(null, 2000) SET_SEQUENCE_TO_REPEAT(seq_main, REPEAT_FOREVER) CLOSE_SEQUENCE_TASK(seq_main) TASK_PERFORM_SEQUENCE(sPed.id, seq_main) CLEAR_SEQUENCE_TASK(seq_main) TASK_LOOK_AT_ENTITY(sPed.id, PLAYER_PED_ID(), -1, SLF_WHILE_NOT_IN_FOV) ENDIF BREAK ENDSWITCH BREAK CASE PEDAI_FLEEING IF GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(sPed.id, <<177.7484, -3240.8967, 4.6079>>) < 15.0 IF NOT IS_SCRIPT_TASK_RUNNING_OR_STARTING(sPed.id, SCRIPT_TASK_SMART_FLEE_PED) TASK_SMART_FLEE_PED(sPed.id, PLAYER_PED_ID(), 1000.0, -1) ENDIF ELSE //IF NOT IS_SCRIPT_TASK_RUNNING_OR_STARTING(sPed.id, SCRIPT_TASK_REACT_AND_FLEE_PED) IF (NOT IS_SCRIPT_TASK_RUNNING_OR_STARTING(sPed.id, SCRIPT_TASK_SMART_FLEE_PED) AND NOT IS_SCRIPT_TASK_RUNNING_OR_STARTING(sPed.id, SCRIPT_TASK_FOLLOW_NAV_MESH_TO_COORD)) OR HAS_PED_AI_JUST_CHANGED_STATE(sPed) //TASK_SMART_FLEE_PED(sPed.id, PLAYER_PED_ID(), 1000.0, -1) //TASK_REACT_AND_FLEE_PED(sPed.id, PLAYER_PED_ID()) TASK_FOLLOW_NAV_MESH_TO_COORD(sPEd.id, <<177.7484, -3240.8967, 4.6079>>, PEDMOVE_SPRINT, DEFAULT_TIME_NEVER_WARP, DEFAULT, ENAV_NO_STOPPING) ENDIF ENDIF BREAK CASE PEDAI_HANDSUP SWITCH GET_HASH_KEY(sPed.strAIEvent) CASE HASH("GUN_AIMED_AT") IF NOT IS_SCRIPT_TASK_RUNNING_OR_STARTING(sPed.id, SCRIPT_TASK_HANDS_UP) OR HAS_PED_AI_JUST_CHANGED_STATE(sPed) TASK_HANDS_UP(sPed.id, -1, PLAYER_PED_ID(), 0, HANDS_UP_STRAIGHT_TO_LOOP) ENDIF BREAK ENDSWITCH BREAK ENDSWITCH ENDPROC PROC SECURITY_AI_STATE(PED_STRUCT &sPed) CONST_FLOAT NOTICE_WEAPON_DIST 8.0 //------------------------------------------------------------------------------------- // AI pre-update //------------------------------------------------------------------------------------- WEAPON_TYPE eWeapPlayer GET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), eWeapPlayer) FLOAT fDistPlayer = GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), sPed.id) BOOL bPunchedPed, bHitWithVehicle IF HAS_ENTITY_BEEN_DAMAGED_BY_ANY_VEHICLE(sPed.id) bHitWithVehicle = TRUE ENDIF IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(sPed.id, PLAYER_PED_ID(), TRUE) IF HAS_ENTITY_BEEN_DAMAGED_BY_WEAPON(sPed.id, WEAPONTYPE_UNARMED) bPunchedPed = TRUE ENDIF ENDIF //------------------------------------------------------------------------------------- // AI Event update //------------------------------------------------------------------------------------- BOOL bCanSeeBody, bKilledInFrontOfObserver, bSawPlayerDoIt, bNonLethal bCanSeeBody = CAN_PED_SEE_DEAD_BODY(sPed, bKilledInFrontOfObserver, bSawPlayerDoIt, bNonLethal) // Saw a ped get killed infront of them IF bCanSeeBody AND bKilledInFrontOfObserver AND NOT bNonLethal IF bSawPlayerDoIt SET_PED_AI_STATE(sPed, PEDAI_COMBAT_PLAYER, TRUE, "PLAYER_KILLED") ELSE SET_PED_AI_STATE(sPed, PEDAI_COMBAT_PLAYER, TRUE, "KILLED") ENDIF // Ped heard gun fire ELIF HAS_PED_RECEIVED_EVENT(sPed.id, EVENT_SHOT_FIRED) OR HAS_PED_RECEIVED_EVENT(sPed.id, EVENT_SHOT_FIRED_BULLET_IMPACT) OR HAS_PED_RECEIVED_EVENT(sPed.id, EVENT_SHOT_FIRED_WHIZZED_BY) OR HAS_PED_RECEIVED_EVENT(sPed.id, EVENT_EXPLOSION) OR HAS_PED_RECEIVED_EVENT(sPed.id, EVENT_EXPLOSION_HEARD) OR HAS_PED_RECEIVED_EVENT(sPed.id, EVENT_SHOCKING_EXPLOSION) SET_PED_AI_STATE(sPed, PEDAI_COMBAT_PLAYER, TRUE, "GUNSHOT") // Aiming gun around ELIF sPed.bCanSeePlayer AND IS_PLAYER_AIMING(WF_INCLUDE_GUN) SET_PED_AI_STATE(sPed, PEDAI_COMBAT_PLAYER, TRUE, "GUN_AIMED") // Aiming projectile at ped ELIF sPed.bCanSeePlayer AND IS_PLAYER_AIMING_AT_PED(sPed, WF_INCLUDE_PROJECTILE) SET_PED_AI_STATE(sPed, PEDAI_COMBAT_PLAYER, TRUE, "PROJ_AIMED") // Can see player with a gun ELIF sPed.bCanSeePlayer AND fDistPlayer < NOTICE_WEAPON_DIST AND NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID(), TRUE) AND IS_PED_ARMED(PLAYER_PED_ID(), WF_INCLUDE_MELEE | WF_INCLUDE_GUN) SET_PED_AI_STATE(sPed, PEDAI_COMBAT_PLAYER, TRUE, "SEEN_WEAPON") // Player is stealing the security guard's veh ELIF (sPed.bCanSeePlayer OR sPed.bCanHearPlayer) AND e_PlayerStatus = PLAYERSTATUS_SEC_CAR_STEALING IF sPed.bCanSeePlayer SET_PED_AI_STATE(sPed, PEDAI_COMBAT_PLAYER, TRUE, "STEALING_SEC_CAR") ELIF sPed.bCanHearPlayer SET_PED_AI_STATE_WITH_ENTITY(sPed, PEDAI_INVESTIGATE, "HEARD_SEC_CAR", vehs[mvf_security].id, TRUE) ENDIF // Player is seen getting into a van ELIF (sPed.bCanSeePlayer OR sPed.bCanHearPlayer) AND e_PlayerStatus = PLAYERSTATUS_VAN_ENTERING IF sPed.bCanSeePlayer SET_PED_AI_STATE(sPed, PEDAI_COMBAT_PLAYER, TRUE, "GET_IN_VAN") ELIF sPed.bCanHearPlayer SET_PED_AI_STATE_WITH_ENTITY(sPed, PEDAI_INVESTIGATE, "HEARD_VAN", vehs[GET_VAN_PLAYER_IS_IN()].id, TRUE) ENDIF // player is seen towing a van away ELIF (sPed.bCanSeePlayer OR sPed.bCanHearPlayer) AND e_PlayerStatus = PLAYERSTATUS_VAN_STEALING_TOW IF sPed.bCanSeePlayer SET_PED_AI_STATE_WITH_ENTITY(sPed, PEDAI_COMBAT_PLAYER, "STEALING_VAN", vehs[GET_VAN_PLAYER_IS_TOWING()].id, TRUE) ELIF sPed.bCanHearPlayer SET_PED_AI_STATE_WITH_ENTITY(sPed, PEDAI_INVESTIGATE, "HEARD_VAN", vehs[GET_VAN_PLAYER_IS_TOWING()].id, TRUE) ENDIF // Starting a fight with a ped ELIF bPunchedPed OR HAS_PED_RECEIVED_EVENT(sPed.id, EVENT_MELEE_ACTION) OR HAS_PED_RECEIVED_EVENT(sPed.id, EVENT_SHOCKING_SEEN_MELEE_ACTION) OR CAN_PED_SEE_A_PED_BEING_ATTACKED(sPed, FALSE) SET_PED_AI_STATE(sPed, PEDAI_COMBAT_PLAYER, TRUE, "FIGHT") // Ran over ELIF bHitWithVehicle OR HAS_PED_RECEIVED_EVENT(sPed.id, EVENT_SHOCKING_PED_RUN_OVER) OR CAN_PED_SEE_A_PED_BEING_ATTACKED(sPed, TRUE) SET_PED_AI_STATE(sPed, PEDAI_COMBAT_PLAYER, TRUE, "RAN_OVER") // After having a scrap with the player spots him again near the warehouse or near the ped ELIF sPed.eAI != PEDAI_COMBAT_PLAYER AND sPed.bHasFoughtWithPlayer AND (sPed.bCanSeePlayer OR sPed.bCanHearPlayer) AND (fDistPlayer < 8.0 OR GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(), v_WarehouseCoord) < 40.0) IF sPed.bCanSeePlayer SET_PED_AI_STATE(sPed, PEDAI_COMBAT_PLAYER, TRUE, "FIGHT_RETURN") ELIF sPed.bCanHearPlayer SET_PED_AI_STATE_WITH_COORDS(sPed, PEDAI_INVESTIGATE, "HEARD_PLAYER", GET_ENTITY_COORDS(PLAYER_PED_ID()), TRUE) ENDIF // Seed another ped knocked out ELIF sPed.eAI != PEDAI_FLEEING AND bCanSeeBody // KO's infront of ped by player IF bKilledInFrontOfObserver AND bSawPlayerDoIt AND bNonLethal SET_PED_AI_STATE(sPed, PEDAI_COMBAT_PLAYER, TRUE, "PLAYER_KO") // otherwise count as found dead body (bSawPlayerDoIt will be forced to true if the player was observed doing it before) ELIF NOT bSawPlayerDoIt SET_PED_AI_STATE(sPed, PEDAI_COMBAT_PLAYER, TRUE, "DEAD_BODY") ENDIF ENDIF //------------------------------------------------------------------------------------- // CHECK FOR BROADCAST EVENT //------------------------------------------------------------------------------------- IF sPed.iReceivedEvent > -1 AND sPed.iReceivedEvent < COUNT_OF(s_BroadcastEvent)-1 BOOL bCameFromAlarm = s_BroadcastEvent[sPed.iReceivedEvent].bRaiseAlarm SWITCH GET_HASH_KEY(s_BroadcastEvent[sPed.iReceivedEvent].strEventName) CASE HASH("KILLED") CASE HASH("PLAYER_KILLED") CASE HASH("DEAD_BODY") CASE HASH("PLAYER_KO") CASE HASH("GUN_AIMED_AT") CASE HASH("PROJ_AIMED") CASE HASH("SEEN_WEAPON") CASE HASH("FIGHT") CASE HASH("FIGHT_RETURN") CASE HASH("RAN_OVER") CASE HASH("STEALING_VAN") CASE HASH("GET_IN_VAN") CASE HASH("GUNSHOT") CASE HASH("STEALING_SEC_CAR") SET_PED_AI_STATE(sPed, PEDAI_COMBAT_PLAYER, TRUE, s_BroadcastEvent[sPed.iReceivedEvent].strEventName, FALSE, bCameFromAlarm) BREAK CASE HASH("HEARD_PLAYER") SET_PED_AI_STATE_WITH_COORDS(sPed, PEDAI_INVESTIGATE, s_BroadcastEvent[sPed.iReceivedEvent].strEventName, GET_ENTITY_COORDS(PLAYER_PED_ID()), TRUE, FALSE, bCameFromAlarm) BREAK CASE HASH("HEARD_VAN") CASE HASH("HEARD_SEC_CAR") SET_PED_AI_STATE_WITH_ENTITY(sPed, PEDAI_INVESTIGATE, s_BroadcastEvent[sPed.iReceivedEvent].strEventName, vehs[GET_VAN_PLAYER_IS_IN()].id, TRUE, FALSE, bCameFromAlarm) BREAK ENDSWITCH ENDIF sPed.iReceivedEvent = -1 //------------------------------------------------------------------------------------- // MANAGE STATES //------------------------------------------------------------------------------------- // Check for state update again IF sPed.eAIPrevFrame != sPed.eAI sPed.bAIStateChangedLastFrame = TRUE ELSE sPed.bAIStateChangedLastFrame = FALSE ENDIF sPed.eAIPrevFrame = sPed.eAI IF NOT ARE_STRINGS_EQUAL(sPed.strAIEventPrevFrame, sPed.strAIEvent) sPed.bAIEventChangedLastFrame = TRUE ELSE sPed.bAIEventChangedLastFrame = FALSE ENDIF sPed.strAIEventPrevFrame = sPed.strAIEvent SWITCH sPed.eAI CASE PEDAI_WORKING BREAK CASE PEDAI_INVESTIGATE SWITCH GET_HASH_KEY(sPed.strAIEvent) CASE HASH("VAN_LOST") // Go back to work after 3 seconds IF GET_GAME_TIMER() - sPed.iTimeOfEnteringState > 3000 SET_PED_AI_STATE(sPed, PEDAI_WORKING, FALSE, "BACK_TO_WORK") ENDIF BREAK CASE HASH("HEARD_PLAYER") // Has reached investigation coord IF GET_GAME_TIMER() - sPed.iTimeOfEnteringState > 4000 // give the ped chance to turn and look, safety for if the coord is very close to the ped AND GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(sPed.id, sPed.vInvestigationCoord) < 3.0 AND IS_PED_STILL(sPed.id) SET_PED_AI_STATE(sPed, PEDAI_INVESTIGATE, FALSE, "SOUND_LOST") ENDIF BREAK CASE HASH("SOUND_LOST") IF GET_GAME_TIMER() - sPed.iTimeOfEnteringState > 4000 AND NOT IS_PED_IN_CURRENT_CONVERSATION(sPed.id) SET_PED_AI_STATE(sPed, PEDAI_WORKING, FALSE, "BACK_TO_WORK") ENDIF BREAK ENDSWITCH BREAK CASE PEDAI_COMBAT_PLAYER SWITCH GET_HASH_KEY(sPed.strAIEvent) CASE HASH("FIGHT") CASE HASH("FIGHT_RETURN") CASE HASH("RAN_OVER") // Player has ran out and the delay has passed IF GET_GAME_TIMER() - sPed.iTimeOfStateLastSet > 8000 AND GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(), v_WarehouseCoord) > 65 AND (GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), sPed.id) > 10.0 OR GET_GAME_TIMER() - sPed.iTimeOfStateLastSet > 16000) AND NOT IS_PED_IN_CURRENT_CONVERSATION(sPed.id) SET_PED_AI_STATE(sPed, PEDAI_COMBAT_PLAYER, FALSE, "FIGHT_ESC") ENDIF BREAK CASE HASH("KILLED") CASE HASH("PLAYER_KILLED") CASE HASH("DEAD_BODY") CASE HASH("PLAYER_KO") CASE HASH("GUN_AIMED_AT") CASE HASH("PROJ_AIMED") CASE HASH("GUNSHOT") CASE HASH("SEEN_WEAPON") CASE HASH("STEALING_VAN") CASE HASH("GET_IN_VAN") CASE HASH("STEALING_SEC_CAR") IF GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(), v_WarehouseCoord) > 300 AND GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), sPed.id) > 150.0 SET_PED_AI_STATE(sPed, PEDAI_COMBAT_PLAYER, FALSE, "FIGHT_ESC") ENDIF BREAK ENDSWITCH BREAK ENDSWITCH ENDPROC /// PURPOSE: /// Updates the security peds tasks based of their current state. PROC SECURITY_AI_TASKS(PED_STRUCT &sPed) SET_PED_SHOULD_PLAY_IMMEDIATE_SCENARIO_EXIT(sPed.id) IF HAS_PED_AI_JUST_CHANGED_STATE(sPed) pedSecurity.iFlagTask = 0 ENDIF WEAPON_TYPE weapTemp SWITCH sPed.eAI CASE PEDAI_WORKING IF GET_CLOCK_HOURS() >= 5 AND GET_CLOCK_HOURS() < 21 // Stand at security shack IF (NOT IS_SCRIPT_TASK_RUNNING_OR_STARTING(sPed.id, SCRIPT_TASK_USE_NEAREST_SCENARIO_TO_POS) AND NOT IS_SCRIPT_TASK_RUNNING_OR_STARTING(sPed.id, SCRIPT_TASK_PERFORM_SEQUENCE)) OR bUsingNightScenario IF DOES_SCENARIO_EXIST_IN_AREA(<<203.68, -3132.46, 4.79>>, 1.0, TRUE) TASK_USE_NEAREST_SCENARIO_TO_COORD(sPed.id, <<203.68, -3132.46, 4.79>>, 1.0) bUsingNightScenario = FALSE ENDIF ENDIF ELSE // use torch IF NOT IS_SCRIPT_TASK_RUNNING_OR_STARTING(sPed.id, SCRIPT_TASK_USE_NEAREST_SCENARIO_CHAIN_TO_POS) OR NOT bUsingNightScenario IF DOES_SCENARIO_EXIST_IN_AREA(<<162.69, -3115.67, 4.95>>, 1.0, TRUE) TASK_USE_NEAREST_SCENARIO_CHAIN_TO_COORD(sPed.id, <<162.69, -3115.67, 4.95>>, 1.0) bUsingNightScenario = TRUE ENDIF ENDIF ENDIF BREAK CASE PEDAI_COMBAT_PLAYER SET_PED_USING_ACTION_MODE(sPed.id, TRUE, -1, "DEFAULT_ACTION") SWITCH GET_HASH_KEY(sPed.strAIEvent) CASE HASH("FIGHT") CASE HASH("FIGHT_RETURN") CASE HASH("RAN_OVER") // attack the player with the night stick IF HAS_PED_GOT_WEAPON(sPed.id, WEAPONTYPE_PISTOL) REMOVE_WEAPON_FROM_PED(sPed.id, WEAPONTYPE_PISTOL) ENDIF IF NOT HAS_PED_GOT_WEAPON(sPed.id, WEAPONTYPE_NIGHTSTICK) GIVE_WEAPON_TO_PED(sPed.id, WEAPONTYPE_NIGHTSTICK, INFINITE_AMMO, TRUE, TRUE) ENDIF IF GET_CURRENT_PED_WEAPON(sPed.id, weapTemp) IF weapTemp != WEAPONTYPE_NIGHTSTICK SET_CURRENT_PED_WEAPON(sPed.id, WEAPONTYPE_NIGHTSTICK) ENDIF ENDIF BREAK CASE HASH("KILLED") CASE HASH("PLAYER_KILLED") CASE HASH("DEAD_BODY") CASE HASH("PLAYER_KO") CASE HASH("GUN_AIMED_AT") CASE HASH("PROJ_AIMED") CASE HASH("GUNSHOT") CASE HASH("SEEN_WEAPON") CASE HASH("STEALING_VAN") CASE HASH("GET_IN_VAN") CASE HASH("STEALING_SEC_CAR") // attack the player with the pistol IF HAS_PED_GOT_WEAPON(sPed.id, WEAPONTYPE_NIGHTSTICK) REMOVE_WEAPON_FROM_PED(sPed.id, WEAPONTYPE_NIGHTSTICK) ENDIF IF NOT HAS_PED_GOT_WEAPON(sPed.id, WEAPONTYPE_PISTOL) GIVE_WEAPON_TO_PED(sPed.id, WEAPONTYPE_PISTOL, INFINITE_AMMO, TRUE, TRUE) ENDIF IF GET_CURRENT_PED_WEAPON(sPed.id, weapTemp) IF weapTemp != WEAPONTYPE_PISTOL SET_CURRENT_PED_WEAPON(sPed.id, WEAPONTYPE_PISTOL) ENDIF ENDIF BREAK ENDSWITCH // Combat task IF NOT IS_SCRIPT_TASK_RUNNING_OR_STARTING(sPed.id, SCRIPT_TASK_COMBAT) OR HAS_PED_AI_JUST_CHANGED_STATE(sPed) TASK_COMBAT_PED(sPed.id, PLAYER_PED_ID()) TASK_LOOK_AT_ENTITY(sPed.id, PLAYER_PED_ID(), -1, SLF_WHILE_NOT_IN_FOV) ENDIF BREAK CASE PEDAI_INVESTIGATE SWITCH GET_HASH_KEY(sPed.strAIEvent) CASE HASH("HEARD_SEC_CAR") IF DOES_ENTITY_EXIST(sPed.entityInvestigating) IF NOT IS_PED_HEADING_TOWARDS_POSITION(sPed.id, GET_ENTITY_COORDS(sPed.entityInvestigating), 180) AND GET_GAME_TIMER() - sPed.iTimeOfEnteringState < 5000 // not faced it after 5 seconds just walk to target IF NOT IS_SCRIPT_TASK_RUNNING_OR_STARTING(sPed.id, SCRIPT_TASK_TURN_PED_TO_FACE_ENTITY) OR HAS_PED_AI_JUST_CHANGED_STATE(sPed) TASK_TURN_PED_TO_FACE_ENTITY(sPed.id, sPed.entityInvestigating, -1) TASK_LOOK_AT_ENTITY(sPed.id, sPed.entityInvestigating, -1, SLF_WHILE_NOT_IN_FOV) ENDIF // begin walk over to the entity once facing it ELSE IF NOT IS_SCRIPT_TASK_RUNNING_OR_STARTING(sPed.id, SCRIPT_TASK_GOTO_ENTITY_OFFSET) OR HAS_PED_AI_JUST_CHANGED_STATE(sPed) TASK_GOTO_ENTITY_OFFSET_XY(sPed.id, sPed.entityInvestigating, DEFAULT_TIME_NEVER_WARP, 2.0, -1.0, 2.5, PEDMOVE_WALK, ESEEK_OFFSET_ORIENTATES_WITH_ENTITY) ENDIF ENDIF ENDIF BREAK CASE HASH("HEARD_PLAYER") BOOL bRetask // Update last heard at coord IF sPed.bCanHearPlayer AND NOT ARE_VECTORS_ALMOST_EQUAL(sPed.vInvestigationCoord, sPed.vLastPosPlayerHeardAt, 1.0) // only update last heard coord every 1m sPed.vInvestigationCoord = sPed.vLastPosPlayerHeardAt bRetask = TRUE // coord updated so retask the ped with the new coord CPRINTLN(DEBUG_MISSION, "INVESTIGATION COORD UPDATE vInvestigationCoord:", sPed.vInvestigationCoord, " vLastPosPlayerHeardAt:", sPed.vLastPosPlayerHeardAt) ENDIF IF NOT IS_VECTOR_ZERO(sPed.vInvestigationCoord) // turn the ped around IF NOT IS_PED_HEADING_TOWARDS_POSITION(sPed.id, sPed.vInvestigationCoord, 90) AND GET_GAME_TIMER() - sPed.iTimeOfEnteringState < 5000 IF NOT IS_SCRIPT_TASK_RUNNING_OR_STARTING(sPed.id, SCRIPT_TASK_TURN_PED_TO_FACE_COORD) OR HAS_PED_AI_JUST_CHANGED_STATE(sPed) OR bRetask TASK_TURN_PED_TO_FACE_COORD(sPed.id, sPed.vInvestigationCoord) TASK_LOOK_AT_COORD(sPed.id, sPed.vInvestigationCoord, -1, SLF_WHILE_NOT_IN_FOV) ENDIF // begin walk over to the sound ELSE IF NOT IS_SCRIPT_TASK_RUNNING_OR_STARTING(sPed.id, SCRIPT_TASK_FOLLOW_NAV_MESH_TO_COORD) OR HAS_PED_AI_JUST_CHANGED_STATE(sPed) OR bRetask TASK_FOLLOW_NAV_MESH_TO_COORD(sPed.id, sPed.vLastPosPlayerHeardAt, PEDMOVE_WALK, DEFAULT_TIME_NEVER_WARP, 3.0) ENDIF ENDIF ENDIF BREAK CASE HASH("HEARD_ALARM") BREAK CASE HASH("SOUND_LOST") // Stand and look at the van driving off IF NOT IS_VECTOR_ZERO(sPed.vInvestigationCoord) IF NOT IS_SCRIPT_TASK_RUNNING_OR_STARTING(sPed.id, SCRIPT_TASK_TURN_PED_TO_FACE_COORD) OR HAS_PED_AI_JUST_CHANGED_STATE(sPed) TASK_TURN_PED_TO_FACE_COORD(sPed.id, sPed.vInvestigationCoord, -1) TASK_LOOK_AT_COORD(sPed.id, sPed.vInvestigationCoord, -1, SLF_WHILE_NOT_IN_FOV) ENDIF // no van stored, just stand still ELSE TASK_STAND_STILL(sPed.id, -1) ENDIF BREAK CASE HASH("VAN_LOST") // Stand and look at the van driving off IF DOES_ENTITY_EXIST(sPed.entityInvestigating) IF NOT IS_SCRIPT_TASK_RUNNING_OR_STARTING(sPed.id, SCRIPT_TASK_TURN_PED_TO_FACE_ENTITY) OR HAS_PED_AI_JUST_CHANGED_STATE(sPed) TASK_TURN_PED_TO_FACE_ENTITY(sPed.id, sPed.entityInvestigating, -1) TASK_LOOK_AT_ENTITY(sPed.id, sPed.entityInvestigating, -1, SLF_WHILE_NOT_IN_FOV) ENDIF // no van stored, just stand still ELSE TASK_STAND_STILL(sPed.id, -1) ENDIF BREAK ENDSWITCH BREAK ENDSWITCH ENDPROC PROC GET_SKIP_STAGE_COORD_AND_HEADING(INT iStage, VECTOR &vCoord, FLOAT &fHeading) SWITCH int_to_enum(MISSION_STAGE_FLAGS, iStage) CASE msf_bugstar_steal vCoord = <<183.5330, -2946.1990, 5.5113>> fHeading = 177.8164 BREAK CASE msf_mission_passed vCoord = <<692.0670, -1004.8117, 21.9059>> fHeading = 359.5735 BREAK ENDSWITCH ENDPROC PROC CLEANUP_PED(PED_STRUCT &sPed, BOOL bImmediately) IF DOES_ENTITY_EXIST(sPed.id) IF bImmediately DELETE_PED(sPed.id) ELSE SET_PED_AS_NO_LONGER_NEEDED(sPed.id) ENDIF ENDIF // Reset ped structs sPed.eAI = PEDAI_WORKING sPed.eAIPrev = PEDAI_NONE sPed.eAIPrevFrame = PEDAI_NONE sPed.bCanSeePlayer = FALSE sPed.bCanHearPlayer = FALSE sPed.bDisplayAIBlip = TRUE sPed.b_BlipsEnemy = FALSE sPed.iFlagState = 0 sPed.iFlagTask = 0 sPed.iDiaFlag = 0 sPed.iTimeOfEnteringState = -1 sPed.iTimeKilled = -1 sPed.iCanSeeTimer = 0 sPed.iInvestigateTimer = -1 sPed.vLastPosPlayerHeardAt = <<0,0,0>> sPed.vInvestigationCoord = <<0,0,0>> sPed.entityInvestigating = null IF DOES_ENTITY_EXIST(sPed.objProp) IF IS_ENTITY_ATTACHED(sPed.objProp) DETACH_ENTITY(sPed.objProp) ENDIF IF bImmediately DELETE_OBJECT(sPed.objProp) ELSE SET_OBJECT_AS_NO_LONGER_NEEDED(sPed.objProp) ENDIF ENDIF sPed.pedPropHand = BONETAG_NULL sPed.propName = DUMMY_MODEL_FOR_SCRIPT sPed.bSafeToCreateProp = FALSE sPed.iWarningsToLeaveWarehouse = 0 ENDPROC //PURPOSE: Cleans up the mission PROC Mission_Cleanup(BOOL bImmediately) INT i,j CLEAR_PRINTS() CLEAR_HELP() IF bImmediately CLEAR_PLAYER_WANTED_LEVEL(PLAYER_ID()) TRIGGER_MUSIC_EVENT("JHP1A_FAIL") ELSE SET_WANTED_LEVEL_MULTIPLIER(1.0) SET_PLAYER_NOISE_MULTIPLIER(PLAYER_ID(), 1.0) ENDIF SET_MAX_WANTED_LEVEL(5) SET_DISPATCH_COPS_FOR_PLAYER(PLAYER_ID(), TRUE) SET_CREATE_RANDOM_COPS(TRUE) RESET_ALL_MISSION_EVENTS(s_Events) CLEAR_MISSION_LOCATE_STUFF(s_LocatesData) // Reset flags b_ConvoWasPlayingLastFrame = FALSE i_TimeOfLastConvo = -1 b_HasPlayerDamagedAVan = FALSE b_WantedLevelGiven = FALSE bIsPlayerStillStealth = FALSE i_VanDamageTimer = -1 e_PlayerStatus = PLAYERSTATUS_NONE e_PlayersLastVan = mvf_invalid veh_TowTruckAttached = NULL veh_DumpedAtEntrance = NULL b_GotWantedAfterStealingVan = FALSE IF bImmediately KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID()) CLEAR_PLAYER_WANTED_LEVEL(PLAYER_ID()) CLEAR_AREA_OF_PEDS(<<158.78, -3100.44, 6.0019>>, 100.0) CLEAR_AREA_OF_COPS(<<158.78, -3100.44, 6.0019>>, 100.0) CLEAR_AREA_OF_OBJECTS(<<158.78, -3100.44, 6.0019>>, 100.0) CLEAR_AREA_OF_VEHICLES(<<158.78, -3100.44, 6.0019>>, 100.0) CLEAR_AREA_OF_PROJECTILES(<<158.78, -3100.44, 6.0019>>, 100.0) REMOVE_DECALS_IN_RANGE(<<158.78, -3100.44, 6.0019>>, 100.0) ELSE ENDIF REPEAT COUNT_OF(objs) i IF DOES_ENTITY_EXIST(objs[i]) IF bImmediately DELETE_OBJECT(objs[i]) ELSE SET_OBJECT_AS_NO_LONGER_NEEDED(objs[i]) ENDIF ENDIF ENDREPEAT REPEAT COUNT_OF(peds) i CLEANUP_PED(peds[i], bImmediately) ENDREPEAT CLEANUP_PED(pedSecurity, bImmediately) REPEAT COUNT_OF(vehs) i REPEAT 4 j IF DOES_ENTITY_EXIST(vehs[i].peds[j]) IF bImmediately DELETE_PED(vehs[i].peds[j]) ELSE SET_PED_AS_NO_LONGER_NEEDED(vehs[i].peds[j]) ENDIF ENDIF ENDREPEAT IF DOES_ENTITY_EXIST(vehs[i].id) IF bImmediately DELETE_VEHICLE(vehs[i].id) ELSE SET_VEHICLE_AS_NO_LONGER_NEEDED(vehs[i].id) ENDIF ENDIF ENDREPEAT IF IS_ALARM_PLAYING(str_Alarm) STOP_ALARM(str_Alarm, bImmediately) ENDIF IF sbi_SweatshopBin != NULL REMOVE_SCENARIO_BLOCKING_AREA(sbi_SweatshopBin) ENDIF RESET_ALL_BATTLEBUDDY_BEHAVIOUR_REQUESTS() ENDPROC //PURPOSE: Passed the mission PROC Mission_Passed() INT iTempHealth IF e_PlayersLastVan != mvf_invalid AND DOES_ENTITY_EXIST(vehs[e_PlayersLastVan].id) AND IS_VEHICLE_DRIVEABLE(vehs[e_PlayersLastVan].id) iTempHealth = GET_ENTITY_HEALTH(vehs[e_PlayersLastVan].id) INFORM_MISSION_STATS_OF_DAMAGE_WATCH_ENTITY(vehs[e_PlayersLastVan].id) ENDIF IF iTempHealth >= 750 OR iTempHealth <= 0 g_iJewelPrep1AVanHealth = 1000 ELSE g_iJewelPrep1AVanHealth = iTempHealth ENDIF IF NOT IS_MISSION_EVENT_TRIGGERED(s_Events[mef_alarms].sData) INFORM_STAT_SYSTEM_OF_BOOL_STAT_HAPPENED(JHP1A_SNEAKY_PEST) ENDIF Mission_Cleanup(FALSE) IF GET_MISSION_COMPLETE_STATE(SP_HEIST_JEWELRY_PREP_2A) MISSION_FLOW_MISSION_PASSED(FALSE, TRUE) ELSE MISSION_FLOW_MISSION_PASSED(FALSE, FALSE) ENDIF TERMINATE_THIS_THREAD() ENDPROC //PURPOSE: Starts a mission fail PROC Mission_Failed(MISSION_FAIL_FLAGS fail_condition = mff_default) IF fail_condition = mff_default MISSION_FLOW_MISSION_FORCE_CLEANUP() Mission_Cleanup(FALSE) TRIGGER_MUSIC_EVENT("JHP1A_FAIL") TERMINATE_THIS_THREAD() ELIF NOT b_MissionFailed b_MissionFailed = TRUE e_FailReason = fail_condition TEXT_LABEL_23 strFailMsg, strSubstring SWITCH e_FailReason CASE mff_van_dead strFailMsg = "JHP1A_VAN_DEAD" BREAK CASE mff_van_stuck strFailMsg = "JHP1A_VAN_STUCK" BREAK CASE mff_vans_dead strFailMsg = "JHP1A_VANS_DEAD" BREAK CASE mff_van_abandoned strFailMsg = "JHP1A_VAN_ABAN" BREAK CASE mff_mission_abandoned strFailMsg = "JHP1A_ABAN" BREAK CASE mff_debug_forced FALLTHRU DEFAULT strFailMsg = "JHP1A_FF" BREAK ENDSWITCH IF IS_STRING_NULL_OR_EMPTY(strSubstring) MISSION_FLOW_MISSION_FAILED_WITH_REASON(strFailMsg) ELSE MISSION_FLOW_MISSION_FAILED_WITH_REASON_CONTAINING_TEXT(strFailMsg, strSubstring) ENDIF TRIGGER_MUSIC_EVENT("JHP1A_FAIL") ENDIF ENDPROC //PURPOSE: Called when the mission has failed and for what reason PROC Mission_Fail_Update() IF GET_MISSION_FLOW_SAFE_TO_CLEANUP() //Maintain anything that could look weird during fade out (e.g. enemies walking off). // check if we need to respawn the player in a different position, // if so call MISSION_FLOW_SET_FAIL_WARP_LOCATION() + SET_REPLAY_DECLINED_VEHICLE_WARP_LOCATION here Mission_Cleanup(TRUE) TERMINATE_THIS_THREAD() ENDIF ENDPROC //PURPOSE: Checks key mission entities each frame to see if they are dead PROC Mission_Entity_Death_Checks() INT i IF IS_PED_INJURED(PLAYER_PED_ID()) Mission_Failed(mff_default) ENDIF REPEAT COUNT_OF(peds) i IF DOES_ENTITY_EXIST(peds[i].id) IF peds[i].bDisplayAIBlip IF peds[i].b_BlipsEnemy UPDATE_AI_PED_BLIP(peds[i].id, peds[i].sAIBlip, BLIP_GANG_ENEMY) ELSE UPDATE_AI_PED_BLIP(peds[i].id, peds[i].sAIBlip, BLIP_GANG_FRIENDLY) ENDIF ENDIF IF NOT IS_ENTITY_ALIVE(peds[i].id) IF peds[i].iTimeKilled = -1 peds[i].iTimeKilled = GET_GAME_TIMER() ELIF GET_GAME_TIMER() - peds[i].iTimeKilled >= 5000 // do not clean up will need for peds finding dead bodies ENDIF ENDIF ENDIF ENDREPEAT REPEAT COUNT_OF(vehs) i IF DOES_ENTITY_EXIST(vehs[i].id) AND vehs[i].bAutoCleanup IF NOT IS_ENTITY_ALIVE(vehs[i].id) IF DOES_BLIP_EXIST(vehs[i].blip) REMOVE_BLIP(vehs[i].blip) ENDIF SET_VEHICLE_AS_NO_LONGER_NEEDED(vehs[i].id) ENDIF ENDIF ENDREPEAT ENDPROC /// PURPOSE: /// Performs checks every frames for fails and general stuff that needs to be looked after constantly throughout the mission PROC Mission_Checks() MISSION_VEHICLE_FLAGS eVeh MISSION_PED_FLAGS ePed BOOL bStillAttached = FALSE IF GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(), v_WarehouseCoord) < 70 FORCE_SONAR_BLIPS_THIS_FRAME() ENDIF // Player has left the scene with a van, cleanup the warehouse IF e_PlayerStatus = PLAYERSTATUS_VAN_STEALING IF NOT b_GotWantedAfterStealingVan IF IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0) PLAY_POLICE_REPORT("SCRIPTED_SCANNER_REPORT_JSH_PREP_1A_01", 0.0) b_GotWantedAfterStealingVan = TRUE ENDIF ENDIF IF DOES_ENTITY_EXIST(pedSecurity.id) IF GET_DISTANCE_BETWEEN_ENTITIES(pedSecurity.id, PLAYER_PED_ID()) > 300 SET_PED_AS_NO_LONGER_NEEDED(pedSecurity.id) ENDIF ENDIF ENDIF // Check if stored tow truck is still attached to 1 of the vans IF DOES_ENTITY_EXIST(veh_TowTruckAttached) AND IS_VEHICLE_DRIVEABLE(veh_TowTruckAttached) FOR eVeh = mvf_bugstar_van_1 TO mvf_bugstar_van_3 IF DOES_ENTITY_EXIST(vehs[eVeh].id) AND IS_VEHICLE_DRIVEABLE(vehs[eVeh].id) IF IS_VEHICLE_ATTACHED_TO_TOW_TRUCK(veh_TowTruckAttached, vehs[eVeh].id) bStillAttached = TRUE ENDIF ENDIF ENDFOR // not still attached, get rid of the tow truck index stored IF NOT bStillAttached veh_TowTruckAttached = NULL ENDIF ENDIF // Overrite with truck player is currently in if any at all IF IS_PLAYER_IN_A_TOW_TRUCK() FOR eVeh = mvf_bugstar_van_1 TO mvf_bugstar_van_3 IF DOES_ENTITY_EXIST(vehs[eVeh].id) AND IS_VEHICLE_DRIVEABLE(vehs[eVeh].id) IF IS_VEHICLE_ATTACHED_TO_TOW_TRUCK(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()), vehs[eVeh].id) veh_TowTruckAttached = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()) ENDIF ENDIF ENDFOR ENDIF UPDATE_PLAYER_STATUS() // STEAL BUGSTAR VAN STAGE CHECKS //----------------------------------------------------------------- IF i_missionStage = enum_to_int(msf_bugstar_steal) BOOL bPlayerAwayFromWarehouse IF NOT IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<182.953690,-3119.883789,101.922592>>,<<115.0,260.0,120.0>>) bPlayerAwayFromWarehouse = TRUE ENDIF // PROCESS PEDS REPEAT COUNT_OF(peds) ePed IF DOES_ENTITY_EXIST(peds[ePed].id) IF peds[ePed].eAI = PEDAI_FLEEING AND GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), peds[ePed].id) > PED_CLEANUP_RANGE_PED_FROM_PLAYER AND GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(), v_WarehouseCoord) > PED_CLEANUP_RANGE_PED_FROM_WAREHOUSE DELETE_PED(peds[ePed].id) ENDIF ENDIF ENDREPEAT MISSION_FAIL_FLAGS eFailReason = mff_default // Clean up vans when the player is away from the warehouse FOR eVeh = mvf_bugstar_van_1 TO mvf_bugstar_van_3 IF DOES_ENTITY_EXIST(vehs[eVeh].id) // Van destroyed IF NOT IS_VEHICLE_DRIVEABLE(vehs[eVeh].id) SET_VEHICLE_AS_NO_LONGER_NEEDED(vehs[eVeh].id) IF DOES_BLIP_EXIST(vehs[eVeh].blip) REMOVE_BLIP(vehs[eVeh].blip) ENDIF IF bPlayerAwayFromWarehouse eFailReason = mff_van_dead ELSE eFailReason = mff_vans_dead ENDIF // Stuck ELIF IS_VEHICLE_STUCK(vehs[eVeh].id) IF DOES_BLIP_EXIST(vehs[eVeh].blip) REMOVE_BLIP(vehs[eVeh].blip) ENDIF eFailReason = mff_van_stuck // Abandoned ELSE IF NOT IS_VEHICLE_IN_USEABLE_RANGE(vehs[eVeh].id) IF GET_INTERIOR_FROM_ENTITY(vehs[eVeh].id) = interior_warehouse IF eFailReason != mff_van_abandoned eFailReason = mff_mission_abandoned ENDIF ELSE eFailReason = mff_van_abandoned ENDIF ENDIF ENDIF ENDIF // Sort the blips out // Player is already in a van and stealing it, // the van is drivable and not stuck // remove all van blips IF (e_PlayerStatus = PLAYERSTATUS_VAN_STEALING AND GET_VAN_PLAYER_IS_IN() != mvf_invalid AND DOES_ENTITY_EXIST(vehs[GET_VAN_PLAYER_IS_IN()].id) AND IS_VEHICLE_DRIVEABLE(vehs[GET_VAN_PLAYER_IS_IN()].id) AND NOT IS_VEHICLE_STUCK(vehs[GET_VAN_PLAYER_IS_IN()].id)) OR (e_PlayerStatus = PLAYERSTATUS_VAN_STEALING_TOW AND GET_VAN_PLAYER_IS_TOWING() != mvf_invalid AND DOES_ENTITY_EXIST(vehs[GET_VAN_PLAYER_IS_TOWING()].id) AND IS_VEHICLE_DRIVEABLE(vehs[GET_VAN_PLAYER_IS_TOWING()].id)) IF DOES_BLIP_EXIST(vehs[eVeh].blip) REMOVE_BLIP(vehs[eVeh].blip) ENDIF // player not in a van, or van is fucked blip other vans that are still useable // ELIF DOES_ENTITY_EXIST(vehs[eVeh].id) AND IS_VEHICLE_DRIVEABLE(vehs[eVeh].id) AND NOT IS_VEHICLE_STUCK(vehs[eVeh].id) AND IS_VEHICLE_IN_USEABLE_RANGE(vehs[eVeh].id) AND i_missionSubstage = 0 IF NOT DOES_BLIP_EXIST(vehs[eVeh].blip) vehs[eVeh].blip = CREATE_BLIP_FOR_VEHICLE(vehs[eVeh].id) SET_BLIP_PRIORITY(vehs[eVeh].blip, BLIPPRIORITY_LOWEST) ENDIF ENDIF ENDFOR IF e_PlayerStatus = PLAYERSTATUS_VAN_STEALING OR e_PlayerStatus = PLAYERSTATUS_VAN_STEALING_TOW IF IS_THIS_PRINT_BEING_DISPLAYED("JHP1A_BKIN") OR IS_THIS_PRINT_BEING_DISPLAYED("JHP1A_BKINANY") CLEAR_PRINTS() ENDIF ELSE IF i_missionSubstage = 0 IF NOT bPromptGetBackInVan IF GET_NUM_OF_VANS_LEFT(TRUE) = 1 PRINT_NOW("JHP1A_BKIN", DEFAULT_GOD_TEXT_TIME, 1) ELSE //PRINT_NOW("JHP1A_BKINANY", DEFAULT_GOD_TEXT_TIME, 1) ENDIF bPromptGetBackInVan = TRUE ENDIF ENDIF ENDIF // Process fail // No vans left so either van was destroyed or cleaned up due to being abandoned IF GET_NUM_OF_VANS_LEFT(TRUE) = 0 IF eFailReason != mff_default Mission_Failed(eFailReason) ENDIF ENDIF ENDIF ENDPROC //PURPOSE: PROC Mission_Setup() ADD_RELATIONSHIP_GROUP("BUGSTAR", rel_bugstar) SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_DISLIKE, RELGROUPHASH_PLAYER, rel_bugstar) SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, rel_bugstar, RELGROUPHASH_PLAYER) SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, RELGROUPHASH_COP, rel_bugstar) SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, rel_bugstar, RELGROUPHASH_COP) SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA( <<139.579529,-3092.962402,8.646310>> - <<33.312500,24.000000,4.187500>>, <<139.579529,-3092.962402,8.646310>> + <<33.312500,24.000000,4.187500>>, FALSE) REMOVE_VEHICLES_FROM_GENERATORS_IN_AREA( <<138.426773,-3092.467041,7.271310>> - <<19.437500,22.750000,2.375000>>, <<138.426773,-3092.467041,7.271310>> + <<19.437500,22.750000,2.375000>>) CLEAR_AREA(<<138.43, -3092.47, 4.90>>, 28.375, TRUE) IF IS_REPLAY_IN_PROGRESS() // RETRIES OR IS_REPEAT_PLAY_ACTIVE() // REPLAY VIA START MENU i_SkipToStage = enum_to_int(msf_bugstar_steal) IF IS_REPLAY_IN_PROGRESS() IF g_bShitskipAccepted i_SkipToStage += 1 CPRINTLN(DEBUG_MISSION, "JHP1A: g_bShitskipAccepted = TRUE") ENDIF ENDIF CPRINTLN(DEBUG_MISSION, "JHP1A: stage skipping to ", i_SkipToStage) // New replay streaming IF IS_REPLAY_IN_PROGRESS() VECTOR vSkipToCoord FLOAT fSkipToHeading GET_SKIP_STAGE_COORD_AND_HEADING(i_SkipToStage, vSkipToCoord, fSkipToHeading) START_REPLAY_SETUP(vSkipToCoord, fSkipToHeading) CPRINTLN(DEBUG_MISSION, "JHP1A: Using replay warp system - Warp Coord ", vSkipToCoord, " Warp Heading ", fSkipToHeading) ENDIF b_DoSkip = TRUE ELSE WHILE NOT PREPARE_INITIAL_SCENE(TRUE) wait(0) Update_Asset_Management_System(s_AssetData) ENDWHILE ENDIF Load_Asset_Additional_Text(s_AssetData, "JHP1A", MISSION_TEXT_SLOT) Load_Asset_AnimDict(s_AssetData, "misslsdhsclipboard@base") Load_Asset_AnimDict(s_AssetData, "misslsdhsclipboard@idle_a") Load_Asset_AnimDict(s_AssetData, "misstrevor3") Load_Asset_Model(s_AssetData, P_AMB_CLIPBOARD_01) Load_Asset_Interior(s_AssetData, interior_warehouse) Load_Asset_Waypoint(s_AssetData, str_wpSecurityArrive) SET_PLAYER_NOISE_MULTIPLIER(PLAYER_ID(), 0.15) INIT_BATTLEBUDDY_BEHAVIOUR_FOR_MISSION(SP_HEIST_JEWELRY_PREP_1A) ADD_PED_FOR_DIALOGUE(s_Convo, 0, PLAYER_PED_ID(), "MICHAEL") ADD_PED_FOR_DIALOGUE(s_Convo, 3, null, "LESTER") // Temp compile fix DUMMY_REFERENCE_BOOL(b_ConvoWasPlayingLastFrame) #IF IS_DEBUG_BUILD debug_widget = START_WIDGET_GROUP("The Jewelry Store Job - Prep A") START_WIDGET_GROUP("Mission info") ADD_WIDGET_INT_READ_ONLY("Mission Stage", i_missionStage) ADD_WIDGET_INT_READ_ONLY("Mission Substage", i_missionSubstage) STOP_WIDGET_GROUP() STOP_WIDGET_GROUP() SET_LOCATES_HEADER_WIDGET_GROUP(debug_widget) s_ZMenuStruct[0].sTxtLabel = "STEAL BUGSTAR VAN" s_ZMenuStruct[1].sTxtLabel = "MISSION PASSED" #ENDIF SET_START_CHECKPOINT_AS_FINAL() // tells replay controller to display "skip mission" for shitskips interior_warehouse = GET_INTERIOR_AT_COORDS_WITH_TYPE(v_WarehouseCoord, "po1_08_warehouseint1") PREPARE_ALARM(str_Alarm) sbi_SweatshopBin = ADD_SCENARIO_BLOCKING_AREA(<<713.7754, -996.4443, 22.3085>>, <<715.7624, -991.7067, 25.6214>>) WHILE NOT HAS_ADDITIONAL_TEXT_LOADED(MISSION_TEXT_SLOT) //OR NOT HAS_ADDITIONAL_TEXT_LOADED(MISSION_DIALOGUE_TEXT_SLOT) PRINT_DEBUG("WAITING ON MISSION TEXT") WAIT(0) ENDWHILE ENDPROC PROC AI_CONTROLLER_PRE_UPDATE(PED_STRUCT &sPed) IF CAN_PED_SEE_HATED_PED(sPed.id, PLAYER_PED_ID()) sPed.iCanSeeTimer = GET_GAME_TIMER() sPed.bCanSeePlayer = TRUE ELSE IF GET_GAME_TIMER() - sPed.iCanSeeTimer > 2000 OR NOT IS_PED_FACING_PED(sPed.id, PLAYER_PED_ID(), 90) sPed.iCanSeeTimer = GET_GAME_TIMER() sPed.bCanSeePlayer = FALSE ENDIF ENDIF IF sPed.bCanSeePlayer bIsPlayerStillStealth = FALSE ENDIF IF bIsPlayerStillStealth SET_PED_RESET_FLAG(sPed.id, PRF_PreventFailedMeleeTakedowns, TRUE) ENDIF IF NOT GET_IS_A_VAN_ALARM_GOING_OFF() sPed.bCanHearPlayer = CAN_PED_HEAR_PLAYER(PLAYER_ID(), sPed.id) IF sPed.bCanHearPlayer sPed.vLastPosPlayerHeardAt = GET_ENTITY_COORDS(PLAYER_PED_ID()) ENDIF ELSE // Can't hear the player while the van alarm is going off. sPed.bCanHearPlayer = FALSE ENDIF SWITCH sPed.eAI CASE PEDAI_FLEEING FALLTHRU CASE PEDAI_HANDSUP FALLTHRU CASE PEDAI_COMBAT_PLAYER sPed.b_BlipsEnemy = TRUE BREAK DEFAULT sPed.b_BlipsEnemy = FALSE BREAK ENDSWITCH ENDPROC PROC EVENT_AI_CONTROLLER(MISSION_EVENT_DATA &sData) IF NOT IS_MISSION_EVENT_ENDED(sData) MISSION_PED_FLAGS ePed bIsPlayerStillStealth = TRUE IF NOT b_HasPlayerDamagedAVan IF HAS_PLAYER_DAMAGED_A_VAN() b_HasPlayerDamagedAVan = TRUE i_VanDamageTimer = GET_GAME_TIMER() ENDIF ELIF GET_GAME_TIMER() - i_VanDamageTimer > 3000 b_HasPlayerDamagedAVan = FALSE i_VanDamageTimer = -1 ENDIF // >>>>>> PRE-STATE UPDATE PASS <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< REPEAT COUNT_OF(peds) ePed IF IS_ENTITY_ALIVE(peds[ePed].id) AI_CONTROLLER_PRE_UPDATE(peds[ePed]) ENDIF ENDREPEAT IF IS_ENTITY_ALIVE(pedSecurity.id) AI_CONTROLLER_PRE_UPDATE(pedSecurity) ENDIF // >>>>>> BROADCAST EVENTS UPDATE <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< INT i REPEAT COUNT_OF(s_BroadcastEvent) i IF NOT IS_STRING_NULL_OR_EMPTY(s_BroadcastEvent[i].strEventName) AND s_BroadcastEvent[i].iTimeOfEvent != -1 // Check that the event is still valid IF s_BroadcastEvent[i].iEventLife = -1 OR GET_GAME_TIMER() - s_BroadcastEvent[i].iTimeOfEvent < s_BroadcastEvent[i].iEventLife // and that enough time had passed for it to become active IF s_BroadcastEvent[i].iEventDelay <= 0 OR GET_GAME_TIMER() - s_BroadcastEvent[i].iTimeOfEvent > s_BroadcastEvent[i].iEventDelay // Find the event location VECTOR vEventCoord IF s_BroadcastEvent[i].ePedTransmitter != mpf_invalid AND IS_ENTITY_ALIVE(peds[s_BroadcastEvent[i].ePedTransmitter].id) vEventCoord = GET_ENTITY_COORDS(peds[s_BroadcastEvent[i].ePedTransmitter].id) s_BroadcastEvent[i].vEventCoord = vEventCoord ELSE vEventCoord = s_BroadcastEvent[i].vEventCoord ENDIF // Raise alarm if the event wants it is within range of the warehouse IF NOT IS_MISSION_EVENT_TRIGGERED(s_Events[mef_alarms].sData) IF s_BroadcastEvent[i].bCalledSecurity AND GET_DISTANCE_BETWEEN_COORDS(vEventCoord, v_WarehouseCoord) < 35.0 TRIGGER_MISSION_EVENT(s_Events[mef_alarms].sData) ENDIF ENDIF // Dispatch even to peds in range REPEAT COUNT_OF(peds) ePed // do not let receive it receive its own even or a none event IF s_BroadcastEvent[i].ePedTransmitter = mpf_invalid OR (ePed != s_BroadcastEvent[i].ePedTransmitter AND peds[s_BroadcastEvent[i].ePedTransmitter].eAI >= peds[ePed].eAI) IF DOES_ENTITY_EXIST(peds[ePed].id) AND NOT IS_PED_INJURED(peds[ePed].id) // Check that its within hearing range of the event // and dispatch event to the ped IF GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(peds[ePed].id, vEventCoord) < s_BroadcastEvent[i].fEventRadius + peds[ePed].fEventNoticeRange peds[ePed].iReceivedEvent = i // If the event causes the alarm to be raised trigger it IF s_BroadcastEvent[i].bRaiseAlarm IF NOT IS_MISSION_EVENT_TRIGGERED(s_Events[mef_alarms].sData) TRIGGER_MISSION_EVENT(s_Events[mef_alarms].sData) str_AlarmAIEvent = s_BroadcastEvent[i].strEventName ENDIF ENDIF ENDIF ENDIF ENDIF ENDREPEAT ENDIF // clean up dead event after 2 seconds ELIF GET_GAME_TIMER() - s_BroadcastEvent[i].iTimeOfEvent > s_BroadcastEvent[i].iEventLife + 2000 s_BroadcastEvent[i].strEventName = "" s_BroadcastEvent[i].ePedTransmitter = mpf_invalid s_BroadcastEvent[i].vEventCoord = <<0,0,0>> s_BroadcastEvent[i].fEventRadius = 0.0 s_BroadcastEvent[i].iTimeOfEvent = -1 s_BroadcastEvent[i].iEventLife = -1 s_BroadcastEvent[i].iEventDelay = -1 ENDIF ENDIF ENDREPEAT // >>>>>> STATE UPDATE <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< // Bugstar staff REPEAT COUNT_OF(peds) ePed IF IS_ENTITY_ALIVE(peds[ePed].id) BUGSTAR_STAFF_AI_STATE(peds[ePed]) ENDIF ENDREPEAT // Security IF IS_ENTITY_ALIVE(pedSecurity.id) SECURITY_AI_STATE(pedSecurity) ENDIF // >>>>>> TASK UPDATE <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< // Bugstar staff REPEAT COUNT_OF(peds) ePed IF IS_ENTITY_ALIVE(peds[ePed].id) BUGSTAR_STAFF_AI_TASKS(peds[ePed]) ENDIF ENDREPEAT // Security IF IS_ENTITY_ALIVE(pedSecurity.id) SECURITY_AI_TASKS(pedSecurity) ENDIF // >>>>>> Prop spawning system <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< REPEAT COUNT_OF(peds) ePed IF DOES_ENTITY_EXIST(peds[ePed].objProp) BOOL bDetachObject, bDeleteObject IF NOT DOES_ENTITY_EXIST(peds[ePed].id) OR IS_PED_INJURED(peds[ePed].id) OR IS_PED_RUNNING_RAGDOLL_TASK(peds[ePed].id) OR (peds[ePed].bDropWhenNotInWorkingState AND peds[ePed].eAI != PEDAI_WORKING) bDetachObject = TRUE ELIF peds[ePed].eAI != PEDAI_WORKING bDeleteObject = TRUE ENDIF IF bDetachObject OR bDeleteObject IF IS_ENTITY_ATTACHED_TO_ENTITY(peds[ePed].objProp, peds[ePed].id) DETACH_ENTITY(peds[ePed].objProp) ENDIF // Drop and clean up prop IF bDetachObject SET_OBJECT_AS_NO_LONGER_NEEDED(peds[ePed].objProp) // delete instantly ELIF bDeleteObject DELETE_OBJECT(peds[ePed].objProp) ENDIF peds[ePed].bSafeToCreateProp = FALSE ENDIF ELSE // recreate prop if there is one to recreate IF peds[ePed].propName != DUMMY_MODEL_FOR_SCRIPT AND peds[ePed].pedPropHand != BONETAG_NULL IF peds[ePed].bSafeToCreateProp AND HAS_MODEL_LOADED(peds[ePed].propName) peds[ePed].objProp = CREATE_OBJECT(peds[ePed].propName, GET_PED_BONE_COORDS(peds[ePed].id, peds[ePed].pedPropHand, <<0,0,0>>)) ATTACH_ENTITY_TO_ENTITY(peds[ePed].objProp, peds[ePed].id, GET_PED_BONE_INDEX(peds[ePed].id, peds[ePed].pedPropHand), <<0,0,0>>, <<0,0,0>>, TRUE, TRUE, TRUE) peds[ePed].bSafeToCreateProp = FALSE ENDIF ENDIF ENDIF ENDREPEAT #IF IS_DEBUG_BUILD IF bDisplayDebug REPEAT COUNT_OF(peds) ePed RENDER_PED_DEBUG(peds[ePed]) ENDREPEAT RENDER_PED_DEBUG(pedSecurity) TEXT_LABEL_63 strDebugText INT j // info counter REPEAT COUNT_OF(s_BroadcastEvent) i strDebugText = "" j = 0 IF NOT IS_STRING_NULL_OR_EMPTY(s_BroadcastEvent[i].strEventName) INT iR, iG, iB, iA // Waiting to start IF s_BroadcastEvent[i].iEventDelay > 0 AND GET_GAME_TIMER() - s_BroadcastEvent[i].iTimeOfEvent < s_BroadcastEvent[i].iEventDelay iR = 0 iG = 100 iB = 255 iA = 100 // Expired ELIF s_BroadcastEvent[i].iEventLife != -1 AND GET_GAME_TIMER() - s_BroadcastEvent[i].iTimeOfEvent > s_BroadcastEvent[i].iEventLife iR = 255 iG = 0 iB = 0 iA = 100 // Active ELSE iR = 0 iG = 255 iB = 0 iA = 200 ENDIF DRAW_DEBUG_SPHERE(s_BroadcastEvent[i].vEventCoord, 0.05, iR, iG, iB, iA) DRAW_DEBUG_SPHERE(s_BroadcastEvent[i].vEventCoord, s_BroadcastEvent[i].fEventRadius, iR, iG, iB, 50) IF s_BroadcastEvent[i].ePedTransmitter != mpf_invalid DRAW_DEBUG_LINE(s_BroadcastEvent[i].vEventCoord, GET_ENTITY_COORDS(peds[s_BroadcastEvent[i].ePedTransmitter].id), iR, iG, iB, iA) ENDIF strDebugText = "EventName: " strDebugText += s_BroadcastEvent[i].strEventName DRAW_DEBUG_TEXT_WITH_OFFSET(strDebugText, s_BroadcastEvent[i].vEventCoord, 0, j*I_SPACING, 0,0,0,iA) j++ IF s_BroadcastEvent[i].ePedTransmitter != mpf_invalid strDebugText = "ePed: " strDebugText += peds[s_BroadcastEvent[i].ePedTransmitter].strDebugName DRAW_DEBUG_TEXT_WITH_OFFSET(strDebugText, s_BroadcastEvent[i].vEventCoord, 0, j*I_SPACING, 0,0,0,iA) j++ ENDIF strDebugText = "Coord: " strDebugText += GET_STRING_FROM_VECTOR(s_BroadcastEvent[i].vEventCoord) DRAW_DEBUG_TEXT_WITH_OFFSET(strDebugText, s_BroadcastEvent[i].vEventCoord, 0, j*I_SPACING, 0,0,0,iA) j++ strDebugText = "Radius: " strDebugText += GET_STRING_FROM_FLOAT(s_BroadcastEvent[i].fEventRadius) DRAW_DEBUG_TEXT_WITH_OFFSET(strDebugText, s_BroadcastEvent[i].vEventCoord, 0, j*I_SPACING, 0,0,0,iA) j++ strDebugText = "TimeActive: " INT iTime = GET_GAME_TIMER() - s_BroadcastEvent[i].iTimeOfEvent IF s_BroadcastEvent[i].iEventDelay > 0 iTime -= s_BroadcastEvent[i].iEventDelay ENDIF strDebugText += GET_STRING_FROM_INT(iTime) DRAW_DEBUG_TEXT_WITH_OFFSET(strDebugText, s_BroadcastEvent[i].vEventCoord, 0, j*I_SPACING, 0,0,0,iA) j++ strDebugText = "Life: " strDebugText += s_BroadcastEvent[i].iEventLife DRAW_DEBUG_TEXT_WITH_OFFSET(strDebugText, s_BroadcastEvent[i].vEventCoord, 0, j*I_SPACING, 0,0,0,iA) j++ strDebugText = "RaiseAlarm: " IF s_BroadcastEvent[i].bRaiseAlarm strDebugText += "TRUE" ELSE strDebugText += "FALSE" ENDIF DRAW_DEBUG_TEXT_WITH_OFFSET(strDebugText, s_BroadcastEvent[i].vEventCoord, 0, j*I_SPACING, 0,0,0,iA) j++ ENDIF ENDREPEAT ENDIF #ENDIF REPEAT COUNT_OF(peds) i IF DOES_ENTITY_EXIST(peds[i].id) AND NOT IS_PED_INJURED(peds[i].id) CLEAR_ENTITY_LAST_DAMAGE_ENTITY(peds[i].id) CLEAR_ENTITY_LAST_WEAPON_DAMAGE(peds[i].id) ENDIF ENDREPEAT CLEAR_VAN_DAMAGE_DETECTION() ENDIF IF IS_MISSION_EVENT_ENDED(sData) ENDIF ENDPROC PROC EVENT_ALARMS(MISSION_EVENT_DATA &sData) IF NOT IS_MISSION_EVENT_ENDED(sData) SWITCH sData.iStage CASE MISSION_EVENT_STAGE_START SET_MISSION_EVENT_STAGE(sData, 2, 2000) BREAK CASE 2 IF PREPARE_ALARM(str_Alarm) START_ALARM(str_Alarm, FALSE) BROADCAST_QUEUE_SCRIPT_AI_EVENT(str_AlarmAIEvent, v_WarehouseCoord, 30.0, -1, 500, TRUE) str_AlarmAIEvent = "" SET_MISSION_EVENT_STAGE(sData, 3, 5000) ENDIF BREAK CASE 3 SET_PED_AI_STATE(pedSecurity, PEDAI_COMBAT_PLAYER, TRUE, "ALARM EVENT SET IT") SET_PLAYER_WANTED_LEVEL_NO_DROP(PLAYER_ID(), 2) SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID()) SET_MAX_WANTED_LEVEL(2) SET_DISPATCH_COPS_FOR_PLAYER(PLAYER_ID(), FALSE) SET_CREATE_RANDOM_COPS(FALSE) UPDATE_WANTED_POSITION_THIS_FRAME(PLAYER_ID()) REPORT_POLICE_SPOTTED_PLAYER(PLAYER_ID()) sData.iGenericFlag = GET_GAME_TIMER() + 15000 SET_MISSION_EVENT_STAGE(sData, 4) BREAK CASE 4 IF GET_GAME_TIMER() > sData.iGenericFlag SET_DISPATCH_COPS_FOR_PLAYER(PLAYER_ID(), TRUE) SET_CREATE_RANDOM_COPS(TRUE) SET_MAX_WANTED_LEVEL(5) b_WantedLevelGiven = TRUE END_MISSION_EVENT(sData) ENDIF UPDATE_WANTED_POSITION_THIS_FRAME(PLAYER_ID()) REPORT_POLICE_SPOTTED_PLAYER(PLAYER_ID()) BREAK ENDSWITCH ENDIF ENDPROC PROC EVENT_DIALOGUE(MISSION_EVENT_DATA &sData) IF NOT IS_MISSION_EVENT_ENDED(sData) IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() i_TimeOfLastConvo = -1 ELSE IF i_TimeOfLastConvo = -1 i_TimeOfLastConvo = GET_GAME_TIMER() // Reset current conversation vars #IF IS_DEBUG_BUILD eCurrentConvoSpeaker = mpf_invalid strCurrentConvoRoot = "" #ENDIF eCurrentConvoPriority = PEDAI_NONE bCurrentConvoCanBeInterruped = TRUE ENDIF ENDIF // >>>>>> PROCESS QUEUED DIALOGUE <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< IF eQueuedConvoSpeaker != mpf_invalid AND NOT IS_STRING_NULL_OR_EMPTY(strQueuedConvoRoot) IF peds[eQueuedConvoSpeaker].id != null AND DOES_ENTITY_EXIST(peds[eQueuedConvoSpeaker].id) AND NOT IS_PED_INJURED(peds[eQueuedConvoSpeaker].id) AND NOT IS_CONVERSATION_PED_DEAD(peds[eQueuedConvoSpeaker].id) IF NOT IS_PED_RAGDOLL(peds[eQueuedConvoSpeaker].id) IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() IF bQueuedConvoInterrupt AND (bCurrentConvoCanBeInterruped OR eQueuedConvoPriority > eCurrentConvoPriority) IF bCurrentConvoStoreForFutureResumption eInterruptedConvoSpeaker = eCurrentConvoSpeaker eInterruptedConvoPriority = eCurrentConvoPriority strInterruptedConvoRoot = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_ROOT() strInterruptedConvoLine = GET_STANDARD_CONVERSATION_LABEL_FOR_FUTURE_RESUMPTION() bInterruptedConvoCanBeInterrupted = bCurrentConvoCanBeInterruped bInterruptedConvoKillAtDistance = bCurrentConvoKillAtDistance ENDIF IF bQueuedConvoDoNotFinish KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() ELSE KILL_FACE_TO_FACE_CONVERSATION() ENDIF ENDIF ENDIF IF IS_SAFE_TO_START_CONVERSATION() IF GET_GAME_TIMER() - i_TimeOfLastConvo > iQueuedConvoDelay TEXT_LABEL_23 strTextBlock IF IS_PED_A_FOREMAN(eQueuedConvoSpeaker) strTextBlock = str_Dialogue ELSE strTextBlock = "SOL1AUD" ENDIF SWITCH eQueuedConvoSpeaker CASE mpf_bugstar_foreman_front ADD_PED_FOR_DIALOGUE(s_Convo, 4, peds[mpf_bugstar_foreman_front].id, "JHP1A_FOREMAN") BREAK CASE mpf_bugstar_foreman_rear ADD_PED_FOR_DIALOGUE(s_Convo, 5, peds[mpf_bugstar_foreman_rear].id, "JHP1A_FOREMAN2") BREAK CASE mpf_bugstar_front_1 ADD_PED_FOR_DIALOGUE(s_Convo, 4, peds[mpf_bugstar_front_1].id, "CONSTRUCTION1") BREAK CASE mpf_bugstar_front_2 ADD_PED_FOR_DIALOGUE(s_Convo, 3, peds[mpf_bugstar_front_2].id, "CONSTRUCTION2") BREAK ENDSWITCH BOOL bConvoStarted IF IS_STRING_NULL_OR_EMPTY(strQueuedConvoLine) IF CREATE_CONVERSATION(s_Convo, strTextBlock, strQueuedConvoRoot, CONV_PRIORITY_HIGH) bConvoStarted = TRUE ENDIF ELSE IF CREATE_CONVERSATION_FROM_SPECIFIC_LINE(s_Convo, strTextBlock, strQueuedConvoRoot, strQueuedConvoLine, CONV_PRIORITY_HIGH) bConvoStarted = TRUE ENDIF ENDIF IF bConvoStarted BROADCAST_DISPATCH_SCRIPT_AI_EVENT(peds[eQueuedConvoSpeaker].sQueuedBroadcastEvent, strQueuedConvoRoot) // Store current convo information #IF IS_DEBUG_BUILD eCurrentConvoSpeaker = eQueuedConvoSpeaker strCurrentConvoRoot = strQueuedConvoRoot #ENDIF eCurrentConvoPriority = eQueuedConvoPriority bCurrentConvoCanBeInterruped = bQueuedConvoCanBeInterrupted bCurrentConvoStoreForFutureResumption = bQueuedConvoStoreForFutureResumption bCurrentConvoKillAtDistance = bQueuedConvoKillAtDistance // Reset queued convo eQueuedConvoSpeaker = mpf_invalid eQueuedConvoPriority = PEDAI_NONE strQueuedConvoRoot = "" iQueuedConvoDelay = 0 fQueuedConvoDist = 9999999 bQueuedConvoInterrupt = FALSE bQueuedConvoDoNotFinish = FALSE bQueuedConvoCanBeInterrupted = TRUE bQueuedConvoStoreForFutureResumption = FALSE bQueuedConvoKillAtDistance = FALSE ENDIF ENDIF ENDIF ENDIF // Ped queued to speak is dead, remove from queue ELSE eQueuedConvoSpeaker = mpf_invalid eQueuedConvoPriority = PEDAI_NONE strQueuedConvoRoot = "" iQueuedConvoDelay = 0 fQueuedConvoDist = 9999999 bQueuedConvoInterrupt = FALSE bQueuedConvoDoNotFinish = FALSE bQueuedConvoCanBeInterrupted = TRUE bQueuedConvoKillAtDistance = FALSE ENDIF ELSE // IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() // IF peds[eCurrentConvoSpeaker].eAI > eCurrentConvoPriority // IF peds[eCurrentConvoSpeaker].eAI >= PEDAI_COMBAT_PLAYER // KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() // ELSE // KILL_FACE_TO_FACE_CONVERSATION() // ENDIF // ENDIF // ENDIF ENDIF // >>>>>> PROCESS INTERRUPTED DIALOGUE <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< // Stop playing conversation if the player is out of range IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND eCurrentConvoSpeaker != mpf_invalid AND bCurrentConvoKillAtDistance AND NOT IS_STRING_NULL_OR_EMPTY(strCurrentConvoRoot) VECTOR vCoord = GET_ENTITY_COORDS( peds[eCurrentConvoSpeaker].id ) IF GET_DISTANCE_BETWEEN_ENTITY_AND_COORD( PLAYER_PED_ID(), vCoord ) >= F_CONVO_PLAY_DISTANCE eInterruptedConvoSpeaker = eCurrentConvoSpeaker eInterruptedConvoPriority = eCurrentConvoPriority strInterruptedConvoRoot = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_ROOT() strInterruptedConvoLine = GET_STANDARD_CONVERSATION_LABEL_FOR_FUTURE_RESUMPTION() bInterruptedConvoCanBeInterrupted = bCurrentConvoCanBeInterruped bInterruptedConvoKillAtDistance = bCurrentConvoKillAtDistance KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() eCurrentConvoSpeaker = mpf_invalid eCurrentConvoPriority = PEDAI_NONE strCurrentConvoRoot = "" bCurrentConvoCanBeInterruped = FALSE bCurrentConvoKillAtDistance = FALSE ENDIF ENDIF // !!! WIPE OUT STORED CONVO IF THE PEDS AI IS NOW IN A HIGHER STATE THAN THE STORED PRIORITY IF eInterruptedConvoSpeaker != mpf_invalid AND NOT IS_STRING_NULL_OR_EMPTY(strInterruptedConvoRoot) IF peds[eInterruptedConvoSpeaker].eAI > eInterruptedConvoPriority eInterruptedConvoSpeaker = mpf_invalid eInterruptedConvoPriority = PEDAI_NONE strInterruptedConvoRoot = "" strInterruptedConvoLine = "" bInterruptedConvoCanBeInterrupted = TRUE ENDIF ENDIF IF eQueuedConvoSpeaker = mpf_invalid AND IS_STRING_NULL_OR_EMPTY(strQueuedConvoRoot) IF IS_SAFE_TO_START_CONVERSATION() AND GET_GAME_TIMER() - i_TimeOfLastConvo > 10000 IF eInterruptedConvoSpeaker != mpf_invalid AND NOT IS_STRING_NULL_OR_EMPTY(strInterruptedConvoRoot) PLAY_CONVERSATION(eInterruptedConvoSpeaker, strInterruptedConvoRoot, eInterruptedConvoPriority, FALSE, FALSE, bInterruptedConvoCanBeInterrupted, 0, TRUE, strInterruptedConvoLine, bInterruptedConvoKillAtDistance) eInterruptedConvoSpeaker = mpf_invalid eInterruptedConvoPriority = PEDAI_NONE strInterruptedConvoRoot = "" strInterruptedConvoLine = "" bInterruptedConvoCanBeInterrupted = TRUE ENDIF ENDIF ENDIF #IF IS_DEBUG_BUILD IF bDisplayDebug TEXT_LABEL_63 strDebug iDebugRenderedThisFrame++ // QUEUED CONVERSATION DEBUG strDebug = "eQueuedConvoSpeaker: " IF eQueuedConvoSpeaker != mpf_invalid strDebug += peds[eQueuedConvoSpeaker].strDebugName ENDIF DRAW_DEBUG_TEXT_2D_WRAPPED(strDebug, 0,0,0,255) strDebug = "eQueuedConvoPriority: " strDebug += enum_to_int(eQueuedConvoPriority) DRAW_DEBUG_TEXT_2D_WRAPPED(strDebug, 0,0,0,255) strDebug = "strQueuedConvoRoot: " strDebug += strQueuedConvoRoot DRAW_DEBUG_TEXT_2D_WRAPPED(strDebug, 0,0,0,255) strDebug = "iQueuedConvoDelay: " strDebug += iQueuedConvoDelay DRAW_DEBUG_TEXT_2D_WRAPPED(strDebug, 0,0,0,255) strDebug = "fQueuedConvoDist: " strDebug += GET_STRING_FROM_FLOAT(fQueuedConvoDist) DRAW_DEBUG_TEXT_2D_WRAPPED(strDebug, 0,0,0,255) strDebug = "bQueuedConvoInterrupt: " IF bQueuedConvoInterrupt strDebug += "TRUE" ELSE strDebug += "FALSE" ENDIF DRAW_DEBUG_TEXT_2D_WRAPPED(strDebug, 0,0,0,255) strDebug = "bQueuedConvoDoNotFinish: " IF bQueuedConvoDoNotFinish strDebug += "TRUE" ELSE strDebug += "FALSE" ENDIF DRAW_DEBUG_TEXT_2D_WRAPPED(strDebug, 0,0,0,255) strDebug = "bQueuedConvoCanBeInterrupted: " IF bQueuedConvoCanBeInterrupted strDebug += "TRUE" ELSE strDebug += "FALSE" ENDIF DRAW_DEBUG_TEXT_2D_WRAPPED(strDebug, 0,0,0,255) iDebugRenderedThisFrame++ // CURRENT CONVERSATION DEBUG strDebug = "eCurrentConvoSpeaker: " IF eCurrentConvoSpeaker != mpf_invalid strDebug += peds[eCurrentConvoSpeaker].strDebugName ENDIF DRAW_DEBUG_TEXT_2D_WRAPPED(strDebug, 0,0,0,255) strDebug = "eCurrentConvoPriority: " strDebug += enum_to_int(eCurrentConvoPriority) DRAW_DEBUG_TEXT_2D_WRAPPED(strDebug, 0,0,0,255) strDebug = "strCurrentConvoRoot: " strDebug += strCurrentConvoRoot DRAW_DEBUG_TEXT_2D_WRAPPED(strDebug, 0,0,0,255) strDebug = "bCurrentConvoCanBeInterruped: " IF bCurrentConvoCanBeInterruped strDebug += "TRUE" ELSE strDebug += "FALSE" ENDIF DRAW_DEBUG_TEXT_2D_WRAPPED(strDebug, 0,0,0,255) // INTERRUPTED CONVERSATION DEBUG strDebug = "eInterruptedConvoSpeaker: " IF eInterruptedConvoSpeaker != mpf_invalid strDebug += peds[eInterruptedConvoSpeaker].strDebugName ENDIF DRAW_DEBUG_TEXT_2D_WRAPPED(strDebug, 255,255,255,255) strDebug = "eInterruptedConvoPriority: " strDebug += enum_to_int(eInterruptedConvoPriority) DRAW_DEBUG_TEXT_2D_WRAPPED(strDebug, 255,255,255,255) strDebug = "strInterruptedConvoRoot: " strDebug += strInterruptedConvoRoot DRAW_DEBUG_TEXT_2D_WRAPPED(strDebug, 255,255,255,255) strDebug = "strInterruptedConvoLine: " strDebug += strInterruptedConvoLine DRAW_DEBUG_TEXT_2D_WRAPPED(strDebug, 255,255,255,255) strDebug = "bInterruptedConvoCanBeInterrupted: " IF bInterruptedConvoCanBeInterrupted strDebug += "TRUE" ELSE strDebug += "FALSE" ENDIF DRAW_DEBUG_TEXT_2D_WRAPPED(strDebug, 255,255,255,255) ENDIF #ENDIF ENDIF DUMMY_REFERENCE_BOOL( bInterruptedConvoKillAtDistance ) ENDPROC PROC EVENT_MUSIC_MANAGER(MISSION_EVENT_DATA &sData) IF NOT IS_MISSION_EVENT_ENDED(sData) IF sData.iStage <= 4 IF IS_ALARM_PLAYING(str_Alarm) OR IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0) OR IS_MISSION_EVENT_TRIGGERED(s_Events[mef_alarms].sData) TRIGGER_MUSIC_EVENT("JHP1A_ATTACK") SET_MISSION_EVENT_STAGE(sData, 5) ENDIF ENDIF SWITCH sData.iStage CASE MISSION_EVENT_STAGE_START IF GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(), <<137.70, -3092.81, 4.90>>) < 60.0 TRIGGER_MUSIC_EVENT("JHP1A_START") SET_MISSION_EVENT_STAGE(sData, 2) ENDIF BREAK CASE 2 IF e_PlayerStatus = PLAYERSTATUS_WAREHOUSE_IN_VEHICLE OR e_PlayerStatus = PLAYERSTATUS_WAREHOUSE_ON_FOOT TRIGGER_MUSIC_EVENT("JHP1A_WAREHOUSE") SET_MISSION_EVENT_STAGE(sData, 3) ENDIF BREAK CASE 3 IF e_PlayerStatus = PLAYERSTATUS_VAN_ENTERING OR e_PlayerStatus = PLAYERSTATUS_VAN_STEALING TRIGGER_MUSIC_EVENT("JHP1A_VAN") SET_MISSION_EVENT_STAGE(sData, 4) ENDIF BREAK CASE 4 IF NOT IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0) IF e_PlayerStatus = PLAYERSTATUS_VAN_STEALING AND GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(), <<137.70, -3092.81, 4.90>>) >= 500 IF PREPARE_MUSIC_EVENT("JHP1A_RADIO_1") TRIGGER_MUSIC_EVENT("JHP1A_RADIO_1") END_MISSION_EVENT(sData) ENDIF ENDIF ENDIF BREAK CASE 5 IF IS_ALARM_PLAYING(str_Alarm) AND IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0) AND b_WantedLevelGiven SET_MISSION_EVENT_STAGE(sData, 6) ENDIF BREAK CASE 6 IF NOT IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0) IF PREPARE_MUSIC_EVENT("JHP1A_RADIO_2") TRIGGER_MUSIC_EVENT("JHP1A_RADIO_2") SET_MISSION_EVENT_STAGE(sData, 6) END_MISSION_EVENT(sData) ENDIF ENDIF BREAK ENDSWITCH ENDIF // Cleanup IF IS_MISSION_EVENT_ENDED(sData) SET_WANTED_LEVEL_MULTIPLIER(1.0) ENDIF ENDPROC /// PURPOSE: /// Adds all the events for this mission PROC ADD_ALL_MISSION_EVENTS() ADD_NEW_MISSION_EVENT( s_Events[mef_bugstar_staff], &EVENT_AI_CONTROLLER, "AI Controller") ADD_NEW_MISSION_EVENT( s_Events[mef_dialogue], &EVENT_DIALOGUE, "Dialogue") ADD_NEW_MISSION_EVENT( s_Events[mef_alarms], &EVENT_ALARMS, "Alarms & Wanted Level") ADD_NEW_MISSION_EVENT( s_Events[mef_music_manager], &EVENT_MUSIC_MANAGER, "Music Manager") ENDPROC //PURPOSE: Progresses to the specified stage and carries out and resets PROC Stage_Jump_To(MISSION_STAGE_FLAGS eNewStage) IF eNewStage = msf_num_mission_stages SCRIPT_ASSERT("MSF_NUM_MISSION_STAGES is NOT a stage, used only to monitor the number of stages") ELSE i_missionSubstage = 0 b_StageSetup = FALSE i_missionStage = enum_to_int(eNewStage) ENDIF ENDPROC //PURPOSE: Processes any change from one stage to another that is not part of the mission flow. PROC Stage_Skip_Update() // a skip has been made IF b_DoSkip = TRUE IF NOT IS_SCREEN_FADED_OUT() IF NOT IS_SCREEN_FADING_OUT() DO_SCREEN_FADE_OUT(1000) ENDIF ELSE IF IS_CUTSCENE_ACTIVE() STOP_CUTSCENE() REMOVE_CUTSCENE() ENDIF PRINT_DEBUG("[STAGE SKIP]: Starting Skip", 1) Stage_Jump_To(int_to_enum(MISSION_STAGE_FLAGS, i_SkipToStage)) RENDER_SCRIPT_CAMS(FALSE, FALSE) CLEAR_PRINTS() CLEAR_HELP() Mission_Cleanup(TRUE) // Warping // ----------------------------------------------- IF NOT IS_REPLAY_BEING_SET_UP() CPRINTLN(DEBUG_MISSION, "MISSION_STAGE_SKIP() Performing NON-REPLAY skip warping") VECTOR vWarpCoord FLOAT fWarpHeading GET_SKIP_STAGE_COORD_AND_HEADING(i_missionStage, vWarpCoord, fWarpHeading) SET_ENTITY_COORDS(PLAYER_PED_ID(), vWarpCoord) SET_ENTITY_HEADING(PLAYER_PED_ID(), fWarpHeading) FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE) Load_Asset_NewLoadScene_Sphere(s_AssetData, vWarpCoord, 50.0) CPRINTLN(DEBUG_MISSION, "MISSION_STAGE_SKIP() NON-REPLAY skip warp coord ", vWarpCoord, " warp heading ", fWarpHeading) ENDIF // Asset loading // ----------------------------------------------- CPRINTLN(DEBUG_MISSION, "MISSION_STAGE_SKIP() Requesting assets") Start_Skip_Streaming(s_AssetData) // Asset loading SWITCH int_to_enum(MISSION_STAGE_FLAGS, i_missionStage) CASE msf_bugstar_steal Load_Asset_Model(s_AssetData, BURRITO2) Load_Asset_Model(s_AssetData, S_M_Y_PESTCONT_01) Load_Asset_Model(s_AssetData, S_M_M_SECURITY_01) Load_Asset_Model(s_AssetData, DILETTANTE2) Load_Asset_Model(s_AssetData, P_AMB_CLIPBOARD_01) Load_Asset_Waypoint(s_AssetData, str_wpSecurityArrive) Load_Asset_AnimDict(s_AssetData, "misslsdhsclipboard@base") Load_Asset_AnimDict(s_AssetData, "misslsdhsclipboard@idle_a") Load_Asset_AnimDict(s_AssetData, "misstrevor3") Load_Asset_Interior(s_AssetData, interior_warehouse) IF IS_REPLAY_CHECKPOINT_VEHICLE_AVAILABLE() AND NOT IS_THIS_MODEL_A_BOAT( GET_REPLAY_CHECKPOINT_VEHICLE_MODEL() ) AND NOT IS_THIS_MODEL_A_PLANE( GET_REPLAY_CHECKPOINT_VEHICLE_MODEL() ) AND NOT IS_THIS_MODEL_A_HELI( GET_REPLAY_CHECKPOINT_VEHICLE_MODEL() ) Load_Asset_Model(s_AssetData, GET_REPLAY_CHECKPOINT_VEHICLE_MODEL()) ENDIF BREAK CASE msf_mission_passed Load_Asset_Model(s_AssetData, BURRITO2) BREAK ENDSWITCH WHILE NOT Update_Skip_Streaming(s_AssetData) WAIT(0) Mission_Entity_Death_Checks() ENDWHILE // Set up the mission for that current stage SWITCH int_to_enum(MISSION_STAGE_FLAGS, i_missionStage) CASE msf_bugstar_steal IF IS_REPLAY_CHECKPOINT_VEHICLE_AVAILABLE() AND NOT IS_THIS_MODEL_A_BOAT( GET_REPLAY_CHECKPOINT_VEHICLE_MODEL() ) AND NOT IS_THIS_MODEL_A_PLANE( GET_REPLAY_CHECKPOINT_VEHICLE_MODEL() ) AND NOT IS_THIS_MODEL_A_HELI( GET_REPLAY_CHECKPOINT_VEHICLE_MODEL() ) WHILE NOT HAS_REPLAY_CHECKPOINT_VEHICLE_LOADED() WAIT(0) ENDWHILE vehs[mvf_replay].id = CREATE_REPLAY_CHECKPOINT_VEHICLE(<<189.3979, -2932.7214, 5.6127>>, 180.5455) ENDIF IF IS_REPLAY_BEING_SET_UP() IF DOES_ENTITY_EXIST(vehs[mvf_replay].id) END_REPLAY_SETUP(vehs[mvf_replay].id, VS_DRIVER) ELSE END_REPLAY_SETUP() ENDIF ELSE FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE) IF DOES_ENTITY_EXIST(vehs[mvf_replay].id) SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), vehs[mvf_replay].id, VS_DRIVER) ENDIF ENDIF WHILE NOT PREPARE_INITIAL_SCENE(FALSE) WAIT(0) ENDWHILE SET_GAMEPLAY_CAM_RELATIVE_HEADING() SET_GAMEPLAY_CAM_RELATIVE_PITCH() BREAK CASE msf_mission_passed IF NOT GET_MISSION_COMPLETE_STATE(SP_HEIST_JEWELRY_PREP_2A) vehs[mvf_bugstar_van_1].id = CREATE_VEHICLE(BURRITO2, <<693.7250, -1006.3015, 21.8355>>, 359.8840) SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(vehs[mvf_bugstar_van_1].id, FALSE) SET_VEHICLE_ON_GROUND_PROPERLY(vehs[mvf_bugstar_van_1].id) ENDIF IF IS_REPLAY_BEING_SET_UP() END_REPLAY_SETUP() ELSE FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE) ENDIF SET_ENTITY_COORDS(PLAYER_PED_ID(), <<692.0670, -1004.8117, 21.9059>>) SET_ENTITY_HEADING(PLAYER_PED_ID(), 359.5735) SET_GAMEPLAY_CAM_RELATIVE_HEADING() SET_GAMEPLAY_CAM_RELATIVE_PITCH() BREAK ENDSWITCH IF IS_SCREEN_FADED_OUT() OR (NOT IS_SCREEN_FADING_IN()) IF NOT GET_MISSION_COMPLETE_STATE(SP_HEIST_JEWELRY_PREP_2A) OR i_missionStage != enum_to_int(msf_mission_passed) DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME) ENDIF ENDIF b_DoSkip = FALSE PRINT_DEBUG("[STAGE SKIP]: Skip complete", 1) ENDIF #IF IS_DEBUG_BUILD // Check is a skip is being asked for, and dont allow skip during setup stage ELIF IS_SCREEN_FADED_IN() INT i_currently_selected DONT_DO_J_SKIP(s_LocatesData) IF LAUNCH_MISSION_STAGE_MENU(s_ZMenuStruct, i_SkipToStage, i_currently_selected, FALSE, "Jewelry Heist Prep 1A", TRUE, TRUE) b_DoSkip = TRUE ELSE IF IS_KEYBOARD_KEY_PRESSED(KEY_S) Mission_Passed() ENDIF IF IS_KEYBOARD_KEY_PRESSED(KEY_F) Mission_Failed(mff_debug_forced) ENDIF ENDIF #ENDIF ENDIF ENDPROC //PURPOSE: STEAL A BUGSTAR VAN FUNC BOOL STAGE_BUGSTAR_VAN_STEAL() IF NOT b_StageSetup Load_Asset_Audiobank(s_AssetData, "SCRIPT\\JWL_HA_RAID_STORE") Load_Asset_Model(s_AssetData, S_M_M_SECURITY_01) TRIGGER_MISSION_EVENT(s_Events[mef_bugstar_staff].sData) TRIGGER_MISSION_EVENT(s_Events[mef_dialogue].sData) TRIGGER_MISSION_EVENT(s_Events[mef_music_manager].sData) SET_MISSION_START_VEHICLE_AS_VEHICLE_GEN(<<0,0,0>>, 0, TRUE, GET_CURRENT_PLAYER_PED_ENUM()) g_iJewelPrep1AVanHealth = 1000 SET_WANTED_LEVEL_MULTIPLIER(0.1) PRINT_NOW("JHP1A_STEAL_BSV", DEFAULT_GOD_TEXT_TIME, 1) b_StageSetup = TRUE ENDIF IF b_StageSetup SWITCH i_missionSubstage CASE 0 // No vans left, mission will fail IF GET_NUM_OF_VANS_LEFT(TRUE) = 0 CLEAR_MISSION_LOCATE_STUFF(s_LocatesData) INFORM_MISSION_STATS_OF_DAMAGE_WATCH_ENTITY(null) INFORM_MISSION_STATS_OF_SPEED_WATCH_ENTITY(null) // Vans are available to steal ELSE // Stealing normally by being in the van IF IS_PLAYER_IN_VAN() AND DOES_ENTITY_EXIST(vehs[GET_VAN_PLAYER_IS_IN()].id) AND IS_VEHICLE_DRIVEABLE(vehs[GET_VAN_PLAYER_IS_IN()].id) //AND NOT IS_VEHICLE_STUCK(vehs[GET_VAN_PLAYER_IS_IN()].id) SET_RANDOM_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.5) IF e_PlayersLastVan != GET_VAN_PLAYER_IS_IN() REPLAY_RECORD_BACK_FOR_TIME(5.0, 10.0, REPLAY_IMPORTANCE_HIGHEST) INFORM_MISSION_STATS_OF_DAMAGE_WATCH_ENTITY(vehs[GET_VAN_PLAYER_IS_IN()].id) INFORM_MISSION_STATS_OF_SPEED_WATCH_ENTITY(vehs[GET_VAN_PLAYER_IS_IN()].id) e_PlayersLastVan = GET_VAN_PLAYER_IS_IN() ENDIF IF IS_PLAYER_AT_ANGLED_AREA_IN_VEHICLE(s_LocatesData, <<692.8256, -1012.5445, 21.7220>>, <<692.914307,-1003.555786,21.508389>>, <<692.651123,-1021.604126,26.206753>>, 9.750000, TRUE, vehs[GET_VAN_PLAYER_IS_IN()].id, "", "", "", TRUE) i_missionSubstage++ ENDIF // Tow truck steal ELIF IS_A_VAN_ATTACHED_TO_A_TOW_TRUCK() SET_RANDOM_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.5) IS_PLAYER_AT_LOCATION_IN_VEHICLE(s_LocatesData, <<692.8256, -1012.5445, 21.7220>>, <<0.1, 0.1, 0.1>>, TRUE, veh_TowTruckAttached, "", "", "", TRUE) IF IS_ENTITY_IN_ANGLED_AREA(vehs[GET_VAN_PLAYER_IS_TOWING()].id, <<692.914307,-1003.555786,21.508389>>, <<692.651123,-1021.604126,26.206753>>, 9.750000) i_missionSubstage++ ENDIF // Is not stealing a van ELSE CLEAR_MISSION_LOCATION_BLIP(s_LocatesData) INFORM_MISSION_STATS_OF_DAMAGE_WATCH_ENTITY(null) INFORM_MISSION_STATS_OF_SPEED_WATCH_ENTITY(null) ENDIF ENDIF BREAK CASE 1 BOOL bHalted IF IS_PLAYER_IN_VAN() IF BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()), 5.0, 1) bHalted = TRUE ENDIF ELIF IS_A_VAN_ATTACHED_TO_A_TOW_TRUCK() IF BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(veh_TowTruckAttached, 5.0, 1) bHalted = TRUE ENDIF ENDIF IF bHalted IF GET_MISSION_COMPLETE_STATE(SP_HEIST_JEWELRY_PREP_2A) REPLAY_RECORD_BACK_FOR_TIME(5.0, 10.0, REPLAY_IMPORTANCE_HIGHEST) SET_ENTITY_INVINCIBLE(PLAYER_PED_ID(), TRUE) BLOCK_PLAYER_FOR_LEAD_IN(TRUE) UPDATE_BLOCKED_PLAYER_FOR_LEAD_IN(TRUE) i_missionSubstage = 1000 ELSE REPLAY_RECORD_BACK_FOR_TIME(5.0, 10.0, REPLAY_IMPORTANCE_HIGHEST) i_missionSubstage++ ENDIF IF IS_PLAYER_IN_VAN() SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(vehs[e_PlayersLastVan].id, FALSE) ELIF IS_A_VAN_ATTACHED_TO_A_TOW_TRUCK() SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(vehs[GET_VAN_PLAYER_IS_TOWING()].id, FALSE) SET_VEHICLE_DISABLE_TOWING(vehs[GET_VAN_PLAYER_IS_TOWING()].id, TRUE) DETACH_VEHICLE_FROM_ANY_TOW_TRUCK(vehs[GET_VAN_PLAYER_IS_TOWING()].id) ENDIF TASK_LEAVE_ANY_VEHICLE(PLAYER_PED_ID()) ENDIF BREAK CASE 2 IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID(), TRUE) RETURN TRUE ENDIF BREAK CASE 1000 UPDATE_BLOCKED_PLAYER_FOR_LEAD_IN(TRUE) IF NOT IS_SAFE_TO_START_CONVERSATION() KILL_FACE_TO_FACE_CONVERSATION() ELSE ADD_PED_FOR_DIALOGUE(s_Convo, 3, null, "LESTER") IF PLAYER_CALL_CHAR_CELLPHONE(s_Convo, CHAR_LESTER, "JHFAUD", "JHF_P10c", CONV_PRIORITY_HIGH) i_missionSubstage++ ENDIF ENDIF BREAK CASE 1001 UPDATE_BLOCKED_PLAYER_FOR_LEAD_IN(TRUE) IF IS_CALLING_ANY_CONTACT() REPLAY_RECORD_BACK_FOR_TIME(5.0, 10.0, REPLAY_IMPORTANCE_HIGHEST) i_missionSubstage++ ENDIF BREAK CASE 1002 UPDATE_BLOCKED_PLAYER_FOR_LEAD_IN(TRUE) IF NOT IS_CALLING_ANY_CONTACT() CLEAR_BLOCKED_PLAYER_FOR_LEAD_IN() RETURN TRUE ENDIF BREAK ENDSWITCH ENDIF RETURN FALSE ENDFUNC //PURPOSE: Processes the mission flow PROC Stage_Flow() #IF IS_DEBUG_BUILD IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_S) Mission_Passed() ELIF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_F) Mission_Failed(mff_debug_forced) ENDIF #ENDIF SWITCH int_to_enum(MISSION_STAGE_FLAGS, i_missionStage) CASE msf_bugstar_steal IF STAGE_BUGSTAR_VAN_STEAL() Stage_Jump_To(msf_mission_passed) ENDIF BREAK CASE msf_mission_passed Mission_Passed() BREAK ENDSWITCH ENDPROC SCRIPT IF HAS_FORCE_CLEANUP_OCCURRED() Mission_Failed(mff_default) ENDIF SET_MISSION_FLAG(TRUE) // Do everything to prepare the mission Mission_Setup() ADD_ALL_MISSION_EVENTS() WHILE (TRUE) REPLAY_CHECK_FOR_EVENT_THIS_FRAME("M_JewelStoreJobPrep1A") #IF IS_DEBUG_BUILD iDebugRenderedThisFrame = 0 IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_HOME) bDisplayDebug = NOT bDisplayDebug IF bDisplayDebug SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE) ELSE SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(FALSE) ENDIF ENDIF #ENDIF IF b_MissionFailed Mission_Fail_Update() ENDIF Process_Streaming(s_AssetData) // Deals with loading any assets and keeps track of what has been loaded Stage_Skip_Update() // processes any stage skipping that is required IF NOT b_DoSkip Mission_Entity_Death_Checks() // Check if any of the mission critical entities (peds, vehicles, objects) are dead and fail accordingly Mission_Checks() // Mission checks UPDATE_MISSION_EVENTS(s_Events) // Manages the events ENDIF Stage_Flow() // process the mission flow WAIT(0) ENDWHILE ENDSCRIPT