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

6042 lines
198 KiB
Python
Executable File

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