2238 lines
78 KiB
Python
Executable File
2238 lines
78 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 "script_ped.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 "chase_hint_cam.sch"
|
|
|
|
USING "RC_threat_public.sch"
|
|
|
|
USING "asset_management_public.sch"
|
|
USING "mission_event_manager.sch"
|
|
USING "cheat_controller_public.sch"
|
|
USING "commands_recording.sch"
|
|
|
|
// ENUMS
|
|
//-----------------------------------------------------------
|
|
|
|
ENUM MISSION_FAIL_FLAGS
|
|
mff_debug_forced,
|
|
mff_van_lost,
|
|
mff_van_left,
|
|
mff_cargo_left,
|
|
mff_van_in_water,
|
|
mff_default
|
|
ENDENUM
|
|
|
|
ENUM MISSION_STAGE_FLAGS
|
|
msf_gas_steal,
|
|
msf_mission_passed,
|
|
msf_num_mission_stages
|
|
ENDENUM
|
|
|
|
ENUM MISSION_EVENT_FLAGS
|
|
mef_driver_manager,
|
|
mef_cargo_manager,
|
|
mef_num_events
|
|
ENDENUM
|
|
|
|
ENUM DRIVER_AI_ENUM
|
|
DRIVERAI_INVALID = 0,
|
|
DRIVERAI_ONROUTE, // is on its normal route
|
|
DRIVERAI_ONROUTE_AIRPORT, // finished waypoint rec and is now driving into and around the airport
|
|
DRIVERAI_STOPPED_AIRPORT, // stopped inside the airport.
|
|
DRIVERAI_FLEEING, // is fleeing in the van
|
|
DRIVERAI_COMBATING // is attacking the player
|
|
ENDENUM
|
|
|
|
ENUM ENUM_VAN_STATE
|
|
VANSTATE_DRIVABLE_WITH_CARGO,
|
|
VANSTATE_NOT_DRIVABLE_WITH_CARGO,
|
|
VANSTATE_CARGO_LOOSE_INSIDE,
|
|
VANSTATE_CARGO_FALLEN_OUT
|
|
ENDENUM
|
|
|
|
// CONSTANTS
|
|
//---------------------------------------------------------------------
|
|
|
|
TEXT_LABEL_15 str_Dialogue = "JHP2ADS"
|
|
|
|
// Damage indicators for the van
|
|
CONST_FLOAT VAN_STOP_HEALTH_DAMAGE_LIMIT 0.0
|
|
CONST_FLOAT VAN_STOP_ENGINE_DAMAGE_LIMIT 250.0 // (engine smokes @ 400.0, leaks oil @ 200.0)
|
|
CONST_FLOAT VAN_STOP_PETROL_DAMAGE_LIMIT 400.0 // (petrol tank leaks @ 500.0)
|
|
|
|
//CONST_FLOAT VAN_WEAK_PETROL 550.0 // just before leaks petrol
|
|
|
|
CONST_FLOAT MIN_CLOSING_SPEED 4.0 // min speed for a ram to register
|
|
|
|
MODEL_NAMES mod_Driver = S_M_M_Armoured_01
|
|
MODEL_NAMES mod_Van = BOXVILLE3
|
|
MODEL_NAMES mod_Case = PROP_IDOL_CASE_02
|
|
MODEL_NAMES mod_DummyLock = PROP_YELL_PLASTIC_TARGET
|
|
|
|
VECTOR v_VanCargo1 = <<0,0.175,0.0>>
|
|
VECTOR v_VanCargo2 = <<0,-3.6,0.0>>
|
|
|
|
// STRUCTS
|
|
//--------------------------------------------------------------------
|
|
|
|
STRUCT PED_STRUCT
|
|
PED_INDEX id
|
|
INT iGeneric // generic int flag that can be sued for whatever
|
|
AI_BLIP_STRUCT aiBlip
|
|
ENDSTRUCT
|
|
|
|
STRUCT VEHICLE_STRUCT
|
|
VEHICLE_INDEX id
|
|
BLIP_INDEX blip
|
|
ENDSTRUCT
|
|
|
|
STRUCT OBJECT_STRUCT
|
|
OBJECT_INDEX id
|
|
BLIP_INDEX blip
|
|
ENDSTRUCT
|
|
|
|
// VARIABLES
|
|
//----------------------------------------------------------------------
|
|
|
|
// Integral script structure variables
|
|
INT i_missionStage = enum_to_int(msf_gas_steal)
|
|
INT i_missionSubstage = 0
|
|
BOOL b_StageSetup = FALSE
|
|
BOOL b_DoSkip = FALSE
|
|
INT i_SkipToStage = 0
|
|
BOOL b_MissionFailed = FALSE
|
|
ASSET_MANAGEMENT_DATA s_AssetData
|
|
MISSION_EVENT_LINK_STRUCT s_Events[mef_num_events]
|
|
LOCATES_HEADER_DATA s_LocatesData
|
|
structPedsForConversation s_Convo
|
|
CHASE_HINT_CAM_STRUCT localChaseHintCamStruct
|
|
ENUM_VAN_STATE eVanState
|
|
SEQUENCE_INDEX seq
|
|
REL_GROUP_HASH rel_Security
|
|
|
|
// Entities
|
|
PED_STRUCT s_PedDriver
|
|
VEHICLE_STRUCT s_VehPlayer
|
|
VEHICLE_STRUCT s_VehVan
|
|
VEHICLE_STRUCT s_VehTowTruck
|
|
OBJECT_STRUCT obj_Grenades[3]
|
|
OBJECT_INDEX obj_Lock
|
|
|
|
SCENARIO_BLOCKING_INDEX sbi_SweatshopBin
|
|
|
|
// Gas stealing vars
|
|
INT i_VanRammedCount = 0
|
|
BOOL b_VanRammedLastFrame = FALSE
|
|
FLOAT f_PlayerVsVanClosingSpeedLastFrame = 0
|
|
INT i_RamTimer = 0 // used in order to do a safe delay before checking for another ram
|
|
INT i_NumBulletHitsOnDoorLock = 0
|
|
INT i_BulletHitTimer = 0
|
|
INT i_VanDriverDialogue
|
|
INT i_VanDriverDiaTimer
|
|
TEXT_LABEL_23 str_VanDriverDiaRoot
|
|
|
|
BOOL bDisplayedStealBZCaseObjective
|
|
BOOL b_VehVanNoLongerNeeded
|
|
BOOL bDoorSwingingFreeL, bDoorSwingingFreeR
|
|
BOOL b_PlayerPoliceScannerLine
|
|
INT i_HornTimer = -1
|
|
|
|
// Debug
|
|
#IF IS_DEBUG_BUILD
|
|
|
|
WIDGET_GROUP_ID debug_widget
|
|
MissionStageMenuTextStruct s_ZMenuStruct[msf_num_mission_stages]
|
|
FLOAT debug_fClosingSpeed
|
|
TEXT_WIDGET_ID twi_vanState
|
|
BOOL b_DisplayDebug
|
|
|
|
#ENDIF
|
|
|
|
//PURPOSE: Performs a entity specific death check on an entity to determine if it is alive
|
|
FUNC BOOL IS_THIS_ENTITY_ALIVE(ENTITY_INDEX entity)
|
|
IF 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
|
|
|
|
//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
|
|
|
|
//PURPOSE: Creates the players vehicle using the stored data in the replay structs. If no data is found it will create the default vehicle for michael.
|
|
// Should be called until returns true. (May not create a vehicle if bIsVehicleNeeded = FALSE)
|
|
FUNC BOOL Create_Player_Mission_Vehicle(VEHICLE_INDEX &vehicle, VECTOR vCoord, FLOAT fHeading, BOOL bIsVehicleNeeded)
|
|
|
|
VEHICLE_SETUP_STRUCT s_vehicle_struct
|
|
|
|
// Populate the struct
|
|
IF IS_REPLAY_IN_PROGRESS()
|
|
IF IS_REPLAY_CHECKPOINT_VEHICLE_AVAILABLE()
|
|
CLONE_VEHICLE_SETUP_STRUCT(g_stageSnapshot.mVehicleStruct.mVehicle, s_vehicle_struct)
|
|
CPRINTLN(DEBUG_MISSION, "USING REPLAY SNAPSHOT START")
|
|
ENDIF
|
|
ELIF IS_REPLAY_START_VEHICLE_AVAILABLE()
|
|
CLONE_VEHICLE_SETUP_STRUCT(g_startSnapshot.mVehicleStruct.mVehicle, s_vehicle_struct)
|
|
CPRINTLN(DEBUG_MISSION, "USING REPLAY SNAPSHOT END")
|
|
ENDIF
|
|
|
|
// Vehicle model found....
|
|
IF s_vehicle_struct.eModel != DUMMY_MODEL_FOR_SCRIPT
|
|
// ... and does not match the players standard car, so player was driving something else (that was prob jacked)
|
|
IF NOT DOES_VEH_SETUP_STRUCT_MATCH_PLAYER_VEHICLE(CHAR_MICHAEL, s_vehicle_struct)
|
|
IF IS_THIS_MODEL_A_CAR(s_vehicle_struct.eModel)
|
|
OR IS_THIS_MODEL_A_BIKE(s_vehicle_struct.eModel)
|
|
REQUEST_MODEL(s_vehicle_struct.eModel)
|
|
IF HAS_MODEL_LOADED(s_vehicle_struct.eModel)
|
|
vehicle = CREATE_VEHICLE(s_vehicle_struct.eModel, vCoord, fHeading)
|
|
SET_VEHICLE_SETUP(vehicle, s_vehicle_struct)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(s_vehicle_struct.eModel)
|
|
SET_VEHICLE_ON_GROUND_PROPERLY(vehicle)
|
|
RETURN TRUE
|
|
ELSE
|
|
RETURN FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
bIsVehicleNeeded = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// No data found, if a vehicle is needed then create the player standard
|
|
IF bIsVehicleNeeded
|
|
IF NOT DOES_ENTITY_EXIST(vehicle)
|
|
IF CREATE_PLAYER_VEHICLE(vehicle, CHAR_MICHAEL, vCoord, fHeading)
|
|
SET_VEHICLE_MODEL_IS_SUPPRESSED(GET_PLAYER_VEH_MODEL(CHAR_MICHAEL), TRUE)
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ELSE
|
|
// RETURNS true to indicate that this procedure has finished, regardless of whether a vehicle was created
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDFUNC
|
|
|
|
// MISSION SPECIFIC PROCS/FUNCS
|
|
//-------------------------------------------------------------------------------------------------
|
|
|
|
PROC CREATE_LOCK_AND_CASES()
|
|
|
|
CONST_FLOAT F_CASE_MASS 3.5
|
|
|
|
IF DOES_ENTITY_EXIST(s_VehVan.id)
|
|
|
|
//create shootable lock
|
|
IF NOT IS_ENTITY_DEAD(s_VehVan.id)
|
|
AND NOT DOES_ENTITY_EXIST(obj_Lock)
|
|
obj_Lock = CREATE_OBJECT(mod_DummyLock, GET_ENTITY_COORDS(s_VehVan.id))
|
|
SET_OBJECT_PHYSICS_PARAMS(obj_Lock, 0.1, -1, <<-1.0, -1.0, -1.0>>, <<-1.0, -1.0, -1.0>>, -1, -1, -1)
|
|
ATTACH_ENTITY_TO_ENTITY_PHYSICALLY(obj_Lock, s_VehVan.id, -1, -1,
|
|
GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(s_VehVan.id, GET_WORLD_POSITION_OF_ENTITY_BONE(s_VehVan.id, 5))+<<0.02,0,0>> ,<<0,0,0>>, <<0,0,0>>, -1, TRUE)
|
|
SET_ENTITY_VISIBLE(obj_Lock, FALSE)
|
|
ENDIF
|
|
|
|
VECTOR vSpawnCaseCoord
|
|
//create grenade cases
|
|
IF NOT DOES_ENTITY_EXIST(obj_Grenades[0].id)
|
|
IF IS_ENTITY_DEAD(s_VehVan.id)
|
|
vSpawnCaseCoord = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_VehVan.id, <<GET_RANDOM_FLOAT_IN_RANGE(-2.5, 2.5),-5.0,0>>)
|
|
GET_GROUND_Z_FOR_3D_COORD(vSpawnCaseCoord, vSpawnCaseCoord.z)
|
|
obj_Grenades[0].id = CREATE_OBJECT(mod_Case, vSpawnCaseCoord)
|
|
ELSE
|
|
obj_Grenades[0].id = CREATE_OBJECT(mod_Case, GET_ENTITY_COORDS(s_VehVan.id))
|
|
SET_OBJECT_PHYSICS_PARAMS(obj_Grenades[0].id, F_CASE_MASS, -1, <<-1.0, -1.0, -1.0>>, <<-1.0, -1.0, -1.0>>, -1, -1, -1)
|
|
//ATTACH_ENTITY_TO_ENTITY_PHYSICALLY(obj_Grenades[0].id, s_VehVan.id, -1, -1, <<0.35, -2.775, -0.14>>, <<0,0,0>>, <<-27.3,0,-90>>, -1, TRUE, TRUE, TRUE, FALSE)
|
|
ATTACH_ENTITY_TO_ENTITY(obj_Grenades[0].id, s_VehVan.id, -1, <<-0.2,-2.675,0.05>>, <<-90.0,0,-90>>, FALSE, FALSE, FALSE)
|
|
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(obj_Grenades[0].id, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT DOES_ENTITY_EXIST(obj_Grenades[1].id)
|
|
IF IS_ENTITY_DEAD(s_VehVan.id)
|
|
vSpawnCaseCoord = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_VehVan.id, <<GET_RANDOM_FLOAT_IN_RANGE(-2.5, 2.5),-5.0,0>>)
|
|
GET_GROUND_Z_FOR_3D_COORD(vSpawnCaseCoord, vSpawnCaseCoord.z)
|
|
obj_Grenades[1].id = CREATE_OBJECT(mod_Case, vSpawnCaseCoord)
|
|
ELSE
|
|
obj_Grenades[1].id = CREATE_OBJECT(mod_Case, GET_ENTITY_COORDS(s_VehVan.id))
|
|
SET_OBJECT_PHYSICS_PARAMS(obj_Grenades[1].id, F_CASE_MASS, -1, <<-1.0, -1.0, -1.0>>, <<-1.0, -1.0, -1.0>>, -1, -1, -1)
|
|
//ATTACH_ENTITY_TO_ENTITY_PHYSICALLY(obj_Grenades[1].id, s_VehVan.id, -1, -1, <<0.17, -2.675, -0.14>>, <<0,0,0>>, <<-32.5, 0.0, -90.0>>, -1, TRUE, TRUE, TRUE, FALSE)
|
|
ATTACH_ENTITY_TO_ENTITY(obj_Grenades[1].id, s_VehVan.id, -1, <<0,-2.675,0.05>>, <<-90.0,0,-90>>, FALSE, FALSE, FALSE)
|
|
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(obj_Grenades[1].id, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT DOES_ENTITY_EXIST(obj_Grenades[2].id)
|
|
IF IS_ENTITY_DEAD(s_VehVan.id)
|
|
vSpawnCaseCoord = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_VehVan.id, <<GET_RANDOM_FLOAT_IN_RANGE(-2.5, 2.5),-5.0,0>>)
|
|
GET_GROUND_Z_FOR_3D_COORD(vSpawnCaseCoord, vSpawnCaseCoord.z)
|
|
obj_Grenades[2].id = CREATE_OBJECT(mod_Case, vSpawnCaseCoord)
|
|
ELSE
|
|
obj_Grenades[2].id = CREATE_OBJECT(mod_Case, GET_ENTITY_COORDS(s_VehVan.id))
|
|
SET_OBJECT_PHYSICS_PARAMS(obj_Grenades[2].id, F_CASE_MASS, -1, <<-1.0, -1.0, -1.0>>, <<-1.0, -1.0, -1.0>>, -1, -1, -1)
|
|
//ATTACH_ENTITY_TO_ENTITY_PHYSICALLY(obj_Grenades[2].id, s_VehVan.id, -1, -1, <<-0.175, -3.075, -0.230>>, <<0,0,0>>, <<90.0, 22.5, 0.0>>, -1, TRUE, TRUE, TRUE, FALSE)
|
|
ATTACH_ENTITY_TO_ENTITY(obj_Grenades[2].id, s_VehVan.id, -1, <<0.2,-2.675,0.05>>, <<-90.0,0,-90>>, FALSE, FALSE, FALSE)
|
|
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(obj_Grenades[2].id, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
//PURPOSE: Gets the entites from the trigger scene OR if they for some reason create them
|
|
FUNC BOOL PREPARE_INITIAL_SCENE(BOOL bGrabFromTriggerScene)
|
|
|
|
BOOL bAssetMissingEntities = FALSE
|
|
|
|
// this must be a retry warp
|
|
Load_Asset_Waypoint(s_AssetData, g_JHP2A_string_WayPoint)
|
|
Load_Asset_Model(s_AssetData, S_M_M_ARMOURED_01)
|
|
Load_Asset_Model(s_AssetData, mod_Case)
|
|
Load_Asset_Model(s_AssetData, mod_DummyLock)
|
|
|
|
IF HAS_MODEL_LOADED(S_M_M_ARMOURED_01)
|
|
AND HAS_MODEL_LOADED(mod_Case)
|
|
AND HAS_MODEL_LOADED(mod_DummyLock)
|
|
|
|
IF bGrabFromTriggerScene
|
|
|
|
// Grab the van
|
|
IF NOT DOES_ENTITY_EXIST(s_VehVan.id)
|
|
IF DOES_ENTITY_EXIST(g_sTriggerSceneAssets.veh[0])
|
|
SET_ENTITY_AS_MISSION_ENTITY(g_sTriggerSceneAssets.veh[0], TRUE, TRUE)
|
|
s_VehVan.id = g_sTriggerSceneAssets.veh[0]
|
|
ELSE
|
|
PRINT_DEBUG("g_sTriggerSceneAssets.veh[0] not found", 0)
|
|
bAssetMissingEntities = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// Grab the peds
|
|
IF NOT DOES_ENTITY_EXIST(s_PedDriver.id)
|
|
IF DOES_ENTITY_EXIST(g_sTriggerSceneAssets.ped[0])
|
|
SET_ENTITY_AS_MISSION_ENTITY(g_sTriggerSceneAssets.ped[0], TRUE, TRUE)
|
|
s_PedDriver.id = g_sTriggerSceneAssets.ped[0]
|
|
ELSE
|
|
PRINT_DEBUG("g_sTriggerSceneAssets.ped[0] not found", 0)
|
|
bAssetMissingEntities = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
// Create van
|
|
VECTOR vVanSpawnCoord
|
|
|
|
Load_Asset_Model(s_AssetData, mod_Van)
|
|
IF HAS_MODEL_LOADED(mod_Van)
|
|
AND GET_IS_WAYPOINT_RECORDING_LOADED(g_JHP2A_string_WayPoint)
|
|
|
|
IF ARE_STRINGS_EQUAL(g_JHP2A_string_WayPoint, "jhp2a_main")
|
|
WAYPOINT_RECORDING_GET_COORD(g_JHP2A_string_WayPoint, 23, vVanSpawnCoord)
|
|
CLEAR_AREA_OF_VEHICLES(vVanSpawnCoord, 20.0)
|
|
s_VehVan.id = CREATE_VEHICLE(mod_Van, vVanSpawnCoord, 119.4988)
|
|
s_PedDriver.id = CREATE_PED_INSIDE_VEHICLE(s_VehVan.id, PEDTYPE_MISSION, mod_Driver, VS_DRIVER)
|
|
SET_VEHICLE_ON_GROUND_PROPERLY(s_VehVan.id)
|
|
TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING(s_PedDriver.id,s_VehVan.id, g_JHP2A_string_WayPoint, DRIVINGMODE_STOPFORCARS_IGNORELIGHTS, 23, EWAYPOINT_VEHICLES_USE_AI_SLOWDOWN, -1, 12.0)
|
|
ELSE
|
|
WAYPOINT_RECORDING_GET_COORD(g_JHP2A_string_WayPoint, 29, vVanSpawnCoord)
|
|
CLEAR_AREA_OF_VEHICLES(vVanSpawnCoord, 20.0)
|
|
s_VehVan.id = CREATE_VEHICLE(mod_Van, vVanSpawnCoord, 134.0011)
|
|
s_PedDriver.id = CREATE_PED_INSIDE_VEHICLE(s_VehVan.id, PEDTYPE_MISSION, mod_Driver, VS_DRIVER)
|
|
SET_VEHICLE_ON_GROUND_PROPERLY(s_VehVan.id)
|
|
TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING(s_PedDriver.id,s_VehVan.id, g_JHP2A_string_WayPoint, DRIVINGMODE_STOPFORCARS_IGNORELIGHTS, 29, EWAYPOINT_VEHICLES_USE_AI_SLOWDOWN, -1, 12.0)
|
|
ENDIF
|
|
|
|
ELSE
|
|
PRINT_DEBUG("PREPARE_INITIAL_SCENE(): Van model not loaded yet.", 2)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
// Common enetity set up
|
|
//-----------------------------------------------------
|
|
|
|
IF DOES_ENTITY_EXIST(s_VehVan.id)
|
|
SET_VEHICLE_AS_RESTRICTED(s_VehVan.id, 0)
|
|
IF IS_VEHICLE_DRIVEABLE(s_VehVan.id)
|
|
SET_VEHICLE_HAS_STRONG_AXLES(s_VehVan.id, TRUE)
|
|
SET_ENTITY_LOAD_COLLISION_FLAG(s_VehVan.id, TRUE)
|
|
SET_VEHICLE_CAN_LEAK_PETROL(s_VehVan.id, TRUE)
|
|
//SET_VEHICLE_PETROL_TANK_HEALTH(s_VehVan.id, VAN_WEAK_PETROL)
|
|
SET_VEHICLE_DISABLE_TOWING(s_VehVan.id, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(s_PedDriver.id)
|
|
IF NOT IS_PED_INJURED(s_PedDriver.id)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(s_PedDriver.id, TRUE)
|
|
//SET_PED_RELATIONSHIP_GROUP_HASH(s_PedDriver.id, RELGROUPHASH_SECURITY_GUARD)
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(s_PedDriver.id, rel_Security)
|
|
SET_PED_ACCURACY(s_PedDriver.id, 5)
|
|
SET_PED_CAN_BE_TARGETTED(s_PedDriver.id, FALSE)
|
|
SET_PED_COMBAT_ATTRIBUTES(s_PedDriver.id, CA_USE_VEHICLE, FALSE)
|
|
GIVE_WEAPON_TO_PED(s_PedDriver.id, WEAPONTYPE_PISTOL, 15)
|
|
ADD_PED_FOR_DIALOGUE(s_Convo, 3, s_PedDriver.id, "JHP2A_Driver")
|
|
TRIGGER_MISSION_EVENT(s_Events[mef_driver_manager].sData)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(s_VehVan.id)
|
|
AND DOES_ENTITY_EXIST(s_PedDriver.id)
|
|
|
|
CREATE_LOCK_AND_CASES()
|
|
|
|
TRIGGER_MISSION_EVENT(s_Events[mef_cargo_manager].sData)
|
|
|
|
//MISSION_FLOW_RELEASE_TRIGGER_SCENE_ASSETS(SP_HEIST_JEWELRY_PREP_2A) // NOT CALLING TO KEEP THE TRIGGERSCENE RUNNING OTHERWISE THE WAYPOINT RECORDING CLEANS UP
|
|
Unload_Asset_Model(s_AssetData, BOXVILLE3)
|
|
Unload_Asset_Model(s_AssetData, S_M_M_Armoured_01)
|
|
Unload_Asset_Model(s_AssetData, mod_Case)
|
|
Unload_Asset_Model(s_AssetData, mod_DummyLock)
|
|
|
|
RETURN TRUE
|
|
ELSE
|
|
IF bAssetMissingEntities
|
|
SCRIPT_ASSERT("Unable to grab all trigger scene entities")
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
PRINT_DEBUG("PREPARE_INITIAL_SCENE(): Assets not loaded yet.", 0)
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
// Detaches the case from the van
|
|
PROC DETACH_CASE_FROM_VAN(OBJECT_INDEX object, BOOL bThrowFromVan)
|
|
|
|
IF DOES_ENTITY_EXIST(object)
|
|
|
|
IF IS_ENTITY_ATTACHED(object)
|
|
DETACH_ENTITY(object, TRUE, bThrowFromVan)
|
|
SET_ENTITY_COLLISION(object, TRUE)
|
|
ACTIVATE_PHYSICS(object)
|
|
ENDIF
|
|
|
|
IF bThrowFromVan
|
|
VECTOR vDir
|
|
vDir = NORMALISE_VECTOR( GET_ENTITY_COORDS(object) - GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_VehVan.id, <<GET_RANDOM_FLOAT_IN_RANGE(-0.15, 0.15), -GET_RANDOM_INT_IN_RANGE(3, 6), GET_RANDOM_FLOAT_IN_RANGE(-0.1, 0.1)>>) )
|
|
APPLY_FORCE_TO_ENTITY_CENTER_OF_MASS(object, APPLY_TYPE_IMPULSE, vDir * GET_RANDOM_FLOAT_IN_RANGE(0.25, 0.5), 0, TRUE, TRUE, FALSE)
|
|
APPLY_FORCE_TO_ENTITY_CENTER_OF_MASS(object, APPLY_TYPE_ANGULAR_IMPULSE, <<GET_RANDOM_INT_IN_RANGE(0, 10), GET_RANDOM_INT_IN_RANGE(0, 10), GET_RANDOM_INT_IN_RANGE(0, 10)>>, 0, TRUE, TRUE, FALSE)
|
|
SET_ENTITY_NO_COLLISION_ENTITY(object, s_VehVan.id, TRUE)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
FUNC BOOL IS_CASE_INSIDE_VAN(OBJECT_INDEX objCase)
|
|
|
|
IF IS_ENTITY_DEAD(s_VehVan.id)
|
|
RETURN FALSE
|
|
ENDIF
|
|
|
|
VECTOR vResult = GET_CLOSEST_POINT_ON_LINE(GET_ENTITY_COORDS(objCase), GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_VehVan.id, v_VanCargo1), GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_VehVan.id, v_VanCargo2), FALSE)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
IF g_bTriggerDebugOn
|
|
DRAW_DEBUG_LINE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_VehVan.id, v_VanCargo1), GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_VehVan.id, v_VanCargo2), 255, 0,0, 255)
|
|
DRAW_DEBUG_SPHERE(vResult, 0.025, 0, 255, 0, 100)
|
|
DRAW_DEBUG_LINE(vResult, GET_ENTITY_COORDS(objCase), 0,0,255, 255)
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
IF VDIST2(vResult, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_VehVan.id, v_VanCargo1)) <= VDIST2(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_VehVan.id, v_VanCargo2), GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_VehVan.id, v_VanCargo1))
|
|
RETURN TRUE
|
|
ELSE
|
|
RETURN FALSE
|
|
ENDIF
|
|
|
|
ENDFUNC
|
|
|
|
PROC UPDATE_VAN_STATE()
|
|
|
|
IF eVanState = VANSTATE_DRIVABLE_WITH_CARGO
|
|
OR eVanState = VANSTATE_NOT_DRIVABLE_WITH_CARGO
|
|
|
|
IF IS_ENTITY_DEAD(s_VehVan.id)
|
|
OR (DOES_ENTITY_EXIST(obj_Grenades[0].id) AND NOT IS_ENTITY_ATTACHED(obj_Grenades[0].id))
|
|
OR (DOES_ENTITY_EXIST(obj_Grenades[1].id) AND NOT IS_ENTITY_ATTACHED(obj_Grenades[1].id))
|
|
OR (DOES_ENTITY_EXIST(obj_Grenades[2].id) AND NOT IS_ENTITY_ATTACHED(obj_Grenades[2].id))
|
|
eVanState = VANSTATE_CARGO_LOOSE_INSIDE
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF eVanState = VANSTATE_CARGO_LOOSE_INSIDE
|
|
IF (NOT DOES_ENTITY_EXIST(s_VehVan.id) OR NOT IS_VEHICLE_DRIVEABLE(s_VehVan.id))
|
|
OR (DOES_ENTITY_EXIST(obj_Grenades[0].id) AND NOT IS_CASE_INSIDE_VAN(obj_Grenades[0].id))
|
|
OR (DOES_ENTITY_EXIST(obj_Grenades[1].id) AND NOT IS_CASE_INSIDE_VAN(obj_Grenades[1].id))
|
|
OR (DOES_ENTITY_EXIST(obj_Grenades[2].id) AND NOT IS_CASE_INSIDE_VAN(obj_Grenades[2].id))
|
|
eVanState = VANSTATE_CARGO_FALLEN_OUT
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF eVanState = VANSTATE_DRIVABLE_WITH_CARGO
|
|
|
|
// check if the player is 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 (GET_ENTITY_MODEL(vehTemp) = TOWTRUCK
|
|
OR GET_ENTITY_MODEL(vehTemp) = TOWTRUCK2)
|
|
IF IS_VEHICLE_DRIVEABLE(vehTemp)
|
|
IF IS_VEHICLE_ATTACHED_TO_TOW_TRUCK(vehTemp, s_VehVan.id)
|
|
s_VehTowTruck.id = vehTemp
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF eVanState = VANSTATE_DRIVABLE_WITH_CARGO
|
|
|
|
IF NOT IS_VEHICLE_DRIVEABLE(s_VehVan.id)
|
|
// OR GET_VEHICLE_ENGINE_HEALTH(s_VehVan.id) <= 0.0
|
|
// OR GET_VEHICLE_PETROL_TANK_HEALTH(s_VehVan.id) <= 0.0
|
|
eVanState = VANSTATE_NOT_DRIVABLE_WITH_CARGO
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF eVanState = VANSTATE_NOT_DRIVABLE_WITH_CARGO
|
|
AND IS_PED_IN_VEHICLE(PLAYER_PED_ID(), s_VehVan.id, TRUE)
|
|
DISABLE_CHEAT(CHEAT_TYPE_GIVE_HEALTH_ARMOR, TRUE)
|
|
ELSE
|
|
DISABLE_CHEAT(CHEAT_TYPE_GIVE_HEALTH_ARMOR, FALSE)
|
|
ENDIF
|
|
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
SWITCH eVanState
|
|
CASE VANSTATE_DRIVABLE_WITH_CARGO SET_CONTENTS_OF_TEXT_WIDGET(twi_vanState, "DRIVABLE WITH CARGO") BREAK
|
|
CASE VANSTATE_NOT_DRIVABLE_WITH_CARGO SET_CONTENTS_OF_TEXT_WIDGET(twi_vanState, "NOT DRIVABLE WITH CARGO") BREAK
|
|
CASE VANSTATE_CARGO_LOOSE_INSIDE SET_CONTENTS_OF_TEXT_WIDGET(twi_vanState, "CARGO LOOSE") BREAK
|
|
CASE VANSTATE_CARGO_FALLEN_OUT SET_CONTENTS_OF_TEXT_WIDGET(twi_vanState, "CARGO FALLEN OUT") BREAK
|
|
ENDSWITCH
|
|
#ENDIF
|
|
|
|
ENDPROC
|
|
|
|
// MISSION TEMPLATE STRUCTURE
|
|
//--------------------------------------------------------------------------------------------------
|
|
|
|
//PURPOSE: Cleans up the mission
|
|
PROC Mission_Cleanup(BOOL bImmediately)
|
|
|
|
SET_ALL_RANDOM_PEDS_FLEE(PLAYER_ID(), FALSE)
|
|
SET_VEHICLE_MODEL_IS_SUPPRESSED(BOXVILLE3, FALSE)
|
|
SET_PED_MODEL_IS_SUPPRESSED(S_M_M_Armoured_01, FALSE)
|
|
|
|
IF IS_CELLPHONE_DISABLED()
|
|
DISABLE_CELLPHONE(FALSE)
|
|
ENDIF
|
|
|
|
i_NumBulletHitsOnDoorLock = 0
|
|
g_bLaptopMissionSuppressed = FALSE
|
|
|
|
IF bImmediately
|
|
SET_WANTED_LEVEL_MULTIPLIER(1.0)
|
|
CLEAR_PLAYER_WANTED_LEVEL(PLAYER_ID())
|
|
|
|
g_bLaptopMissionSuppressed = FALSE
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(s_VehPlayer.id)
|
|
IF bImmediately
|
|
DELETE_VEHICLE(s_VehPlayer.id)
|
|
ELSE
|
|
SET_VEHICLE_AS_NO_LONGER_NEEDED(s_VehPlayer.id)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(s_PedDriver.id)
|
|
IF bImmediately
|
|
DELETE_PED(s_PedDriver.id)
|
|
ELSE
|
|
SET_PED_AS_NO_LONGER_NEEDED(s_PedDriver.id)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(s_VehVan.id)
|
|
IF bImmediately
|
|
AND NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
DELETE_VEHICLE(s_VehVan.id)
|
|
ELSE
|
|
SET_VEHICLE_AS_NO_LONGER_NEEDED(s_VehVan.id)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
INT i
|
|
REPEAT COUNT_OF(obj_Grenades) i
|
|
IF DOES_ENTITY_EXIST(obj_Grenades[i].id)
|
|
IF bImmediately
|
|
DELETE_OBJECT(obj_Grenades[i].id)
|
|
ELSE
|
|
IF IS_ENTITY_ATTACHED(obj_Grenades[i].id)
|
|
DETACH_ENTITY(obj_Grenades[i].id)
|
|
ENDIF
|
|
SET_OBJECT_AS_NO_LONGER_NEEDED(obj_Grenades[i].id)
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
if DOES_ENTITY_EXIST(obj_Lock)
|
|
IF bImmediately
|
|
DELETE_OBJECT(obj_Lock)
|
|
ELSE
|
|
IF IS_ENTITY_ATTACHED(obj_Lock)
|
|
DETACH_ENTITY(obj_Lock)
|
|
ENDIF
|
|
SET_OBJECT_AS_NO_LONGER_NEEDED(obj_Lock)
|
|
ENDIF
|
|
endif
|
|
|
|
IF sbi_SweatshopBin != NULL
|
|
REMOVE_SCENARIO_BLOCKING_AREA(sbi_SweatshopBin)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
IF HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_BRIEFCASE)
|
|
REMOVE_WEAPON_FROM_PED(PLAYER_PED_ID(), WEAPONTYPE_BRIEFCASE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
KILL_CHASE_HINT_CAM(localChaseHintCamStruct)
|
|
|
|
RESET_ALL_BATTLEBUDDY_BEHAVIOUR_REQUESTS()
|
|
|
|
IF HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_BRIEFCASE)
|
|
REMOVE_WEAPON_FROM_PED(PLAYER_PED_ID(), WEAPONTYPE_BRIEFCASE)
|
|
ENDIF
|
|
|
|
DISABLE_CHEAT(CHEAT_TYPE_GIVE_HEALTH_ARMOR, FALSE)
|
|
|
|
ENDPROC
|
|
|
|
//PURPOSE: Passed the mission
|
|
PROC Mission_Passed()
|
|
TRIGGER_MUSIC_EVENT("JHP2A_STOP")
|
|
CLEAR_PRINTS()
|
|
CLEAR_PLAYER_WANTED_LEVEL(PLAYER_ID())
|
|
Mission_Cleanup(FALSE)
|
|
IF GET_MISSION_COMPLETE_STATE(SP_HEIST_JEWELRY_PREP_1A)
|
|
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_debug_forced)
|
|
|
|
TRIGGER_MUSIC_EVENT("JHP2A_FAIL")
|
|
|
|
// Forced clean up fail!
|
|
IF fail_condition = mff_default
|
|
MISSION_FLOW_MISSION_FORCE_CLEANUP()
|
|
Mission_Cleanup(FALSE)
|
|
TERMINATE_THIS_THREAD()
|
|
|
|
// all other normal fails
|
|
ELIF NOT b_MissionFailed
|
|
|
|
TEXT_LABEL_15 strFailMsg, strSubstring
|
|
SWITCH fail_condition
|
|
|
|
CASE mff_van_lost strFailMsg = "JHP2A_FGOTAWAY" BREAK
|
|
CASE mff_van_left strFailMsg = "JHP2A_FGOTAWAY2" BREAK
|
|
CASE mff_van_in_water strFailMsg = "JHP2A_FCARGO" BREAK
|
|
CASE mff_cargo_left strFailMsg = "JHP2A_FCARGO2" BREAK
|
|
CASE mff_debug_forced
|
|
FALLTHRU
|
|
DEFAULT strFailMsg = "JHP2A_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
|
|
|
|
b_MissionFailed = TRUE
|
|
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
//PURPOSE: Called when the mission has failed and for what reason
|
|
PROC Mission_Fail_Update()
|
|
|
|
IF b_MissionFailed
|
|
AND (GET_MISSION_FLOW_SAFE_TO_CLEANUP() OR IS_SCREEN_FADED_OUT())
|
|
|
|
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()
|
|
|
|
IF DOES_ENTITY_EXIST(s_PedDriver.id)
|
|
IF NOT IS_PED_IN_ANY_VEHICLE(s_PedDriver.id)
|
|
UPDATE_AI_PED_BLIP(s_PedDriver.id, s_PedDriver.aiBlip)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(s_VehVan.id)
|
|
IF NOT IS_THIS_ENTITY_ALIVE(s_VehVan.id)
|
|
AND IS_ENTITY_DEAD(s_VehVan.id)
|
|
AND b_VehVanNoLongerNeeded
|
|
AND GET_DISTANCE_BETWEEN_ENTITIES(s_VehVan.id, PLAYER_PED_ID()) > 200.0
|
|
SET_VEHICLE_AS_NO_LONGER_NEEDED(s_VehVan.id)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
BOOL bGrabbedStatVehicle
|
|
|
|
//PURPOSE:
|
|
PROC Mission_Fail_Checks()
|
|
|
|
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
IF NOT bGrabbedStatVehicle
|
|
INFORM_MISSION_STATS_OF_DAMAGE_WATCH_ENTITY(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()))
|
|
INFORM_MISSION_STATS_OF_SPEED_WATCH_ENTITY(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()))
|
|
bGrabbedStatVehicle = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF bGrabbedStatVehicle
|
|
INFORM_MISSION_STATS_OF_SPEED_WATCH_ENTITY(NULL)
|
|
INFORM_MISSION_STATS_OF_DAMAGE_WATCH_ENTITY(NULL)
|
|
bGrabbedStatVehicle = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT b_PlayerPoliceScannerLine
|
|
IF IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
|
|
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), s_VehVan.id, TRUE)
|
|
PLAY_POLICE_REPORT("SCRIPTED_SCANNER_REPORT_JSH_PREP_2A_01", 0.0)
|
|
b_PlayerPoliceScannerLine = TRUE
|
|
ELIF HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_BRIEFCASE)
|
|
PLAY_POLICE_REPORT("SCRIPTED_SCANNER_REPORT_JSH_PREP_2A_02", 0.0)
|
|
b_PlayerPoliceScannerLine = TRUE
|
|
ENDIF
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// Do distance check on the van
|
|
IF i_missionStage = enum_to_int(msf_gas_steal)
|
|
|
|
SWITCH eVanState
|
|
// Van is drivable and contains the cargo
|
|
CASE VANSTATE_DRIVABLE_WITH_CARGO
|
|
|
|
// Van driver is alive
|
|
IF DOES_ENTITY_EXIST(s_PedDriver.id)
|
|
AND NOT IS_PED_INJURED(s_PedDriver.id)
|
|
AND IS_MISSION_EVENT_RUNNING(s_Events[mef_driver_manager].sData)
|
|
|
|
IF s_Events[mef_driver_manager].sData.iStage = enum_to_int(DRIVERAI_ONROUTE)
|
|
|
|
IF GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), s_VehVan.id) > 500
|
|
Mission_Failed(mff_van_lost)
|
|
ENDIF
|
|
|
|
ELIF s_Events[mef_driver_manager].sData.iStage = enum_to_int(DRIVERAI_FLEEING)
|
|
|
|
IF GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), s_VehVan.id) > 250
|
|
Mission_Failed(mff_van_lost)
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
IF GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), s_VehVan.id) > 250
|
|
Mission_Failed(mff_van_left)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
// driver is dead
|
|
ELSE
|
|
|
|
IF GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), s_VehVan.id) > 250
|
|
Mission_Failed(mff_van_left)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
BREAK
|
|
// Van is not drivable and is at the side of the road with the cargo in the back
|
|
CASE VANSTATE_NOT_DRIVABLE_WITH_CARGO
|
|
|
|
IF GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), s_VehVan.id) > 250
|
|
Mission_Failed(mff_van_left)
|
|
ENDIF
|
|
|
|
BREAK
|
|
//Cargo has fallen out of the van the fail case should now be when a distance check on the cargo
|
|
CASE VANSTATE_CARGO_FALLEN_OUT FALLTHRU
|
|
CASE VANSTATE_CARGO_LOOSE_INSIDE
|
|
|
|
IF NOT HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_BRIEFCASE)
|
|
IF DOES_ENTITY_EXIST(obj_Grenades[0].id) AND GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), obj_Grenades[0].id) > 250
|
|
AND DOES_ENTITY_EXIST(obj_Grenades[1].id) AND GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), obj_Grenades[1].id) > 250
|
|
AND DOES_ENTITY_EXIST(obj_Grenades[2].id) AND GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), obj_Grenades[2].id) > 250
|
|
Mission_Failed(mff_cargo_left)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(s_VehVan.id)
|
|
IF IS_ENTITY_IN_WATER(s_VehVan.id)
|
|
AND NOT IS_VEHICLE_DRIVEABLE(s_VehVan.id)
|
|
AND NOT HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_BRIEFCASE)
|
|
Mission_Failed(mff_van_in_water)
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
|
|
PROC EVENT_VAN_DRIVER_MANAGER(MISSION_EVENT_DATA &sData)
|
|
|
|
IF NOT IS_MISSION_EVENT_ENDED(sData)
|
|
// Driver is dead
|
|
IF NOT DOES_ENTITY_EXIST(s_PedDriver.id)
|
|
OR IS_PED_INJURED(s_PedDriver.id)
|
|
OR (DOES_ENTITY_EXIST(s_VehVan.id) AND GET_DISTANCE_BETWEEN_ENTITIES(s_VehVan.id, s_PedDriver.id) > 200.0)
|
|
OR (NOT IS_PED_IN_ANY_VEHICLE(s_PedDriver.id) AND GET_DISTANCE_BETWEEN_ENTITIES(s_VehVan.id, s_PedDriver.id) > 200.0)
|
|
|
|
IF DOES_ENTITY_EXIST(s_VehVan.id)
|
|
AND IS_VEHICLE_DRIVEABLE(s_VehVan.id)
|
|
SET_VEHICLE_DISABLE_TOWING(s_VehVan.id, FALSE)
|
|
ENDIF
|
|
|
|
SET_PED_AS_NO_LONGER_NEEDED(s_PedDriver.id)
|
|
END_MISSION_EVENT(sData)
|
|
|
|
// Driver is alive
|
|
ELSE
|
|
IF sData.iStage != ENUM_TO_INT(DRIVERAI_COMBATING)
|
|
AND sData.iStage != ENUM_TO_INT(DRIVERAI_STOPPED_AIRPORT)
|
|
AND (NOT DOES_ENTITY_EXIST(s_VehVan.id)
|
|
OR NOT IS_VEHICLE_DRIVEABLE(s_VehVan.id)
|
|
OR NOT IS_PED_IN_VEHICLE(s_PedDriver.id, s_VehVan.id))
|
|
|
|
i_VanDriverDialogue = 0
|
|
i_VanDriverDiaTimer = 0
|
|
str_VanDriverDiaRoot = ""
|
|
SET_MISSION_EVENT_STAGE(sData, enum_to_int(DRIVERAI_COMBATING))
|
|
CPRINTLN(DEBUG_MISSION, "GONE TO DRIVERAI_COMBATING: From GENERAL van fucked/driver not in van")
|
|
|
|
ELSE
|
|
|
|
// Update the number of times the van has been rammed
|
|
IF sData.iStage = enum_to_int(DRIVERAI_ONROUTE)
|
|
OR sData.iStage = enum_to_int(DRIVERAI_ONROUTE_AIRPORT)
|
|
OR sData.iStage = enum_to_int(DRIVERAI_FLEEING)
|
|
|
|
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
// Count number of times the van has been rammed with enough force
|
|
VEHICLE_INDEX vehPlayer = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
|
|
IF IS_ENTITY_TOUCHING_ENTITY(vehPlayer, s_VehVan.id)
|
|
IF NOT b_VanRammedLastFrame
|
|
AND GET_GAME_TIMER() - i_RamTimer > 500
|
|
AND f_PlayerVsVanClosingSpeedLastFrame >= MIN_CLOSING_SPEED // check the closing speed was high enough the prev frame to register a collision (using the last frame due to the velocities already having been resolved by the physics engine)
|
|
b_VanRammedLastFrame = TRUE
|
|
i_VanRammedCount++
|
|
ENDIF
|
|
ELSE
|
|
IF b_VanRammedLastFrame
|
|
i_RamTimer = GET_GAME_TIMER()
|
|
b_VanRammedLastFrame = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// Calculate closing velocity for this frame
|
|
VECTOR vContactNormal = NORMALISE_VECTOR(GET_ENTITY_COORDS(vehPlayer) - GET_ENTITY_COORDS(s_VehVan.id))
|
|
VECTOR vVelBMinusVelA = GET_ENTITY_VELOCITY(s_VehVan.id) - GET_ENTITY_VELOCITY(vehPlayer)
|
|
f_PlayerVsVanClosingSpeedLastFrame = DOT_PRODUCT(vVelBMinusVelA, vContactNormal)
|
|
#IF IS_DEBUG_BUILD
|
|
debug_fClosingSpeed = f_PlayerVsVanClosingSpeedLastFrame
|
|
#ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
|
|
SWITCH int_to_enum(DRIVER_AI_ENUM, sData.iStage)
|
|
CASE DRIVERAI_ONROUTE
|
|
// Van has been rammed or damaged by the player
|
|
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(s_VehVan.id, PLAYER_PED_ID())
|
|
OR HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(s_PedDriver.id, PLAYER_PED_ID())
|
|
OR HAS_PED_RECEIVED_EVENT(s_PedDriver.id, EVENT_SHOT_FIRED)
|
|
OR HAS_PED_RECEIVED_EVENT(s_PedDriver.id, EVENT_SHOT_FIRED_BULLET_IMPACT)
|
|
OR HAS_PED_RECEIVED_EVENT(s_PedDriver.id, EVENT_SHOT_FIRED_WHIZZED_BY)
|
|
OR HAS_PED_RECEIVED_EVENT(s_PedDriver.id, EVENT_GUN_AIMED_AT)
|
|
OR HAS_PED_RECEIVED_EVENT(s_PedDriver.id, EVENT_SHOCKING_SEEN_WEAPON_THREAT)
|
|
OR HAS_PED_RECEIVED_EVENT(s_PedDriver.id, EVENT_SHOCKING_VISIBLE_WEAPON)
|
|
OR HAS_PED_RECEIVED_EVENT(s_PedDriver.id, EVENT_EXPLOSION)
|
|
OR HAS_PED_RECEIVED_EVENT(s_PedDriver.id, EVENT_FIRE_NEARBY)
|
|
OR HAS_PED_RECEIVED_EVENT(s_PedDriver.id, EVENT_ON_FIRE)
|
|
OR HAS_PED_RECEIVED_EVENT(s_PedDriver.id, EVENT_POTENTIAL_WALK_INTO_FIRE)
|
|
OR HAS_PED_RECEIVED_EVENT(s_PedDriver.id, EVENT_POTENTIAL_WALK_INTO_FIRE)
|
|
OR HAS_PED_RECEIVED_EVENT(s_PedDriver.id, EVENT_VEHICLE_ON_FIRE)
|
|
OR HAS_PED_RECEIVED_EVENT(s_PedDriver.id, EVENT_SHOCKING_EXPLOSION)
|
|
OR HAS_PED_RECEIVED_EVENT(s_PedDriver.id, EVENT_SHOCKING_FIRE)
|
|
OR IS_PED_BEING_JACKED(s_PedDriver.id)
|
|
OR IS_ENTITY_ON_FIRE(s_VehVan.id)
|
|
OR i_VanRammedCount > 0
|
|
|
|
i_VanDriverDialogue = 0
|
|
i_VanDriverDiaTimer = 0
|
|
str_VanDriverDiaRoot = ""
|
|
SET_MISSION_EVENT_STAGE(sData, enum_to_int(DRIVERAI_FLEEING))
|
|
CPRINTLN(DEBUG_MISSION, "GONE TO DRIVERAI_FLEEING: From DRIVERAI_ONROUTE")
|
|
|
|
ELSE
|
|
|
|
// Manage horn
|
|
IF DOES_ENTITY_EXIST(s_VehVan.id) AND IS_VEHICLE_DRIVEABLE(s_VehVan.id)
|
|
IF (IS_ENTITY_STATIC(PLAYER_PED_ID()) OR f_PlayerVsVanClosingSpeedLastFrame > 0.5)
|
|
AND IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(),
|
|
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_VehVan.id, <<0,2.0,-0.5>>),
|
|
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_VehVan.id, <<0,10.0,2.0>>),
|
|
4.5, FALSE)
|
|
|
|
IF NOT IS_HORN_ACTIVE(s_VehVan.id)
|
|
IF i_HornTimer = -1
|
|
i_HornTimer = GET_GAME_TIMER()
|
|
ELIF GET_GAME_TIMER() - i_HornTimer > 5000
|
|
START_VEHICLE_HORN(s_VehVan.id, 2000, HASH("NORMAL"), FALSE)
|
|
ENDIF
|
|
ELSE
|
|
i_HornTimer = -1
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(s_VehVan.id, <<-993.7236, -2418.7566, 12.9447>>) < 20.0
|
|
Load_Asset_Waypoint(s_AssetData, "jhp2a_airport")
|
|
ENDIF
|
|
|
|
// Make sure is driving on route
|
|
IF NOT IS_SCRIPT_TASK_RUNNING_OR_STARTING(s_PedDriver.id, SCRIPT_TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING)
|
|
// Has reached the airport, change state
|
|
IF IS_ENTITY_IN_ANGLED_AREA(s_VehVan.id, <<-990.631165,-2413.213867,12.694712>>, <<-996.019409,-2422.607666,16.058456>>, 8.750000)
|
|
IF GET_IS_WAYPOINT_RECORDING_LOADED("jhp2a_airport")
|
|
i_VanDriverDialogue = 0
|
|
i_VanDriverDiaTimer = 0
|
|
str_VanDriverDiaRoot = ""
|
|
SET_MISSION_EVENT_STAGE(sData, enum_to_int(DRIVERAI_ONROUTE_AIRPORT))
|
|
CPRINTLN(DEBUG_MISSION, "GONE TO DRIVERAI_ONROUTE_AIRPORT: From DRIVERAI_ONROUTE")
|
|
ENDIF
|
|
|
|
// Has just lost the waypoint task, give it again
|
|
ELSE
|
|
TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING(s_PedDriver.id, s_VehVan.id, g_JHP2A_string_WayPoint, DRIVINGMODE_STOPFORCARS_IGNORELIGHTS, -1, EWAYPOINT_START_FROM_CLOSEST_POINT | EWAYPOINT_VEHICLES_USE_AI_SLOWDOWN, -1, 12.0)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
CASE DRIVERAI_ONROUTE_AIRPORT
|
|
// Van has been rammed or damaged by the player
|
|
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(s_VehVan.id, PLAYER_PED_ID())
|
|
OR HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(s_PedDriver.id, PLAYER_PED_ID())
|
|
OR HAS_PED_RECEIVED_EVENT(s_PedDriver.id, EVENT_SHOT_FIRED)
|
|
OR HAS_PED_RECEIVED_EVENT(s_PedDriver.id, EVENT_SHOT_FIRED_BULLET_IMPACT)
|
|
OR HAS_PED_RECEIVED_EVENT(s_PedDriver.id, EVENT_SHOT_FIRED_WHIZZED_BY)
|
|
OR HAS_PED_RECEIVED_EVENT(s_PedDriver.id, EVENT_GUN_AIMED_AT)
|
|
OR HAS_PED_RECEIVED_EVENT(s_PedDriver.id, EVENT_SHOCKING_SEEN_WEAPON_THREAT)
|
|
OR HAS_PED_RECEIVED_EVENT(s_PedDriver.id, EVENT_SHOCKING_VISIBLE_WEAPON)
|
|
OR HAS_PED_RECEIVED_EVENT(s_PedDriver.id, EVENT_EXPLOSION)
|
|
OR HAS_PED_RECEIVED_EVENT(s_PedDriver.id, EVENT_FIRE_NEARBY)
|
|
OR HAS_PED_RECEIVED_EVENT(s_PedDriver.id, EVENT_ON_FIRE)
|
|
OR HAS_PED_RECEIVED_EVENT(s_PedDriver.id, EVENT_POTENTIAL_WALK_INTO_FIRE)
|
|
OR HAS_PED_RECEIVED_EVENT(s_PedDriver.id, EVENT_POTENTIAL_WALK_INTO_FIRE)
|
|
OR HAS_PED_RECEIVED_EVENT(s_PedDriver.id, EVENT_VEHICLE_ON_FIRE)
|
|
OR HAS_PED_RECEIVED_EVENT(s_PedDriver.id, EVENT_SHOCKING_EXPLOSION)
|
|
OR HAS_PED_RECEIVED_EVENT(s_PedDriver.id, EVENT_SHOCKING_FIRE)
|
|
OR IS_PED_BEING_JACKED(s_PedDriver.id)
|
|
OR IS_ENTITY_ON_FIRE(s_VehVan.id)
|
|
OR i_VanRammedCount > 0
|
|
|
|
// Straight to combatting now as the player is
|
|
i_VanDriverDialogue = 0
|
|
i_VanDriverDiaTimer = 0
|
|
str_VanDriverDiaRoot = ""
|
|
SET_MISSION_EVENT_STAGE(sData, enum_to_int(DRIVERAI_COMBATING))
|
|
CPRINTLN(DEBUG_MISSION, "GONE TO DRIVERAI_COMBATING: From DRIVERAI_ONROUTE_AIRPORT")
|
|
|
|
ELSE
|
|
|
|
IF NOT IS_SCRIPT_TASK_RUNNING_OR_STARTING(s_PedDriver.id, SCRIPT_TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING)
|
|
// Has parked up go
|
|
IF IS_ENTITY_IN_ANGLED_AREA(s_VehVan.id, <<-1096.138672,-2467.116699,12.695615>>, <<-1101.641357,-2476.774658,15.630400>>, 7.812500)
|
|
i_VanDriverDialogue = 0
|
|
i_VanDriverDiaTimer = 0
|
|
str_VanDriverDiaRoot = ""
|
|
SET_MISSION_EVENT_STAGE(sData, enum_to_int(DRIVERAI_STOPPED_AIRPORT))
|
|
CPRINTLN(DEBUG_MISSION, "GONE TO DRIVERAI_STOPPED_AIRPORT: From DRIVERAI_ONROUTE_AIRPORT")
|
|
|
|
// lost waypoint task
|
|
ELSE
|
|
TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING(s_PedDriver.id, s_VehVan.id, "jhp2a_airport", DRIVINGMODE_STOPFORCARS_IGNORELIGHTS, -1, EWAYPOINT_START_FROM_CLOSEST_POINT | EWAYPOINT_VEHICLES_USE_AI_SLOWDOWN, -1, 12.0)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
BREAK
|
|
CASE DRIVERAI_STOPPED_AIRPORT
|
|
|
|
// Van has been rammed or damaged by the player
|
|
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(s_VehVan.id, PLAYER_PED_ID())
|
|
OR HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(s_PedDriver.id, PLAYER_PED_ID())
|
|
OR HAS_PED_RECEIVED_EVENT(s_PedDriver.id, EVENT_SHOT_FIRED)
|
|
OR HAS_PED_RECEIVED_EVENT(s_PedDriver.id, EVENT_SHOT_FIRED_BULLET_IMPACT)
|
|
OR HAS_PED_RECEIVED_EVENT(s_PedDriver.id, EVENT_SHOT_FIRED_WHIZZED_BY)
|
|
OR HAS_PED_RECEIVED_EVENT(s_PedDriver.id, EVENT_GUN_AIMED_AT)
|
|
OR HAS_PED_RECEIVED_EVENT(s_PedDriver.id, EVENT_SHOCKING_SEEN_WEAPON_THREAT)
|
|
OR HAS_PED_RECEIVED_EVENT(s_PedDriver.id, EVENT_SHOCKING_VISIBLE_WEAPON)
|
|
OR HAS_PED_RECEIVED_EVENT(s_PedDriver.id, EVENT_EXPLOSION)
|
|
OR HAS_PED_RECEIVED_EVENT(s_PedDriver.id, EVENT_FIRE_NEARBY)
|
|
OR HAS_PED_RECEIVED_EVENT(s_PedDriver.id, EVENT_ON_FIRE)
|
|
OR HAS_PED_RECEIVED_EVENT(s_PedDriver.id, EVENT_POTENTIAL_WALK_INTO_FIRE)
|
|
OR HAS_PED_RECEIVED_EVENT(s_PedDriver.id, EVENT_POTENTIAL_WALK_INTO_FIRE)
|
|
OR HAS_PED_RECEIVED_EVENT(s_PedDriver.id, EVENT_VEHICLE_ON_FIRE)
|
|
OR HAS_PED_RECEIVED_EVENT(s_PedDriver.id, EVENT_SHOCKING_EXPLOSION)
|
|
OR HAS_PED_RECEIVED_EVENT(s_PedDriver.id, EVENT_SHOCKING_FIRE)
|
|
OR IS_PED_BEING_JACKED(s_PedDriver.id)
|
|
OR IS_ENTITY_ON_FIRE(s_VehVan.id)
|
|
OR IS_PED_IN_VEHICLE(PLAYER_PED_ID(), s_VehVan.id, TRUE)
|
|
OR i_VanRammedCount > 0
|
|
|
|
// Straight to combatting now as the player is
|
|
i_VanDriverDialogue = 0
|
|
i_VanDriverDiaTimer = 0
|
|
str_VanDriverDiaRoot = ""
|
|
SET_MISSION_EVENT_STAGE(sData, enum_to_int(DRIVERAI_COMBATING))
|
|
CPRINTLN(DEBUG_MISSION, "GONE TO DRIVERAI_COMBATING: From DRIVERAI_STOPPED_AIRPORT")
|
|
|
|
ELSE
|
|
|
|
IF IS_PED_IN_VEHICLE(s_PedDriver.id, s_VehVan.id, TRUE)
|
|
IF NOT IS_SCRIPT_TASK_RUNNING_OR_STARTING(s_PedDriver.id, SCRIPT_TASK_LEAVE_VEHICLE)
|
|
TASK_LEAVE_VEHICLE(s_PedDriver.id, s_VehVan.id)
|
|
ENDIF
|
|
ELSE
|
|
SET_VEHICLE_DOORS_LOCKED(s_VehVan.id, VEHICLELOCK_LOCKED)
|
|
|
|
IF NOT IS_SCRIPT_TASK_RUNNING_OR_STARTING(s_PedDriver.id, SCRIPT_TASK_PERFORM_SEQUENCE)
|
|
OPEN_SEQUENCE_TASK(seq)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(null, <<-1093.4863, -2471.6694, 13.0716>>, PEDMOVE_WALK, DEFAULT_TIME_NEVER_WARP)
|
|
TASK_START_SCENARIO_IN_PLACE(null, "WORLD_HUMAN_SMOKING", -1, TRUE)
|
|
CLOSE_SEQUENCE_TASK(seq)
|
|
TASK_PERFORM_SEQUENCE(s_PedDriver.id, seq)
|
|
CLEAR_SEQUENCE_TASK(seq)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
CASE DRIVERAI_FLEEING
|
|
// Check the number of tyres that have burst
|
|
INT iNumTyresBurst
|
|
IF IS_VEHICLE_TYRE_BURST(s_VehVan.id, SC_WHEEL_CAR_FRONT_LEFT, TRUE) iNumTyresBurst++ ENDIF
|
|
IF IS_VEHICLE_TYRE_BURST(s_VehVan.id, SC_WHEEL_CAR_FRONT_RIGHT, TRUE) iNumTyresBurst++ ENDIF
|
|
IF IS_VEHICLE_TYRE_BURST(s_VehVan.id, SC_WHEEL_CAR_REAR_LEFT, TRUE) iNumTyresBurst++ ENDIF
|
|
IF IS_VEHICLE_TYRE_BURST(s_VehVan.id, SC_WHEEL_CAR_REAR_RIGHT, TRUE) iNumTyresBurst++ ENDIF
|
|
|
|
// Check the following coniditions for stopping the van
|
|
IF GET_ENTITY_HEALTH(s_VehVan.id) <= VAN_STOP_HEALTH_DAMAGE_LIMIT
|
|
OR GET_VEHICLE_ENGINE_HEALTH(s_VehVan.id) <= VAN_STOP_ENGINE_DAMAGE_LIMIT
|
|
OR GET_VEHICLE_PETROL_TANK_HEALTH(s_VehVan.id) <= VAN_STOP_PETROL_DAMAGE_LIMIT
|
|
OR IS_PED_INJURED(s_PedDriver.id)
|
|
OR iNumTyresBurst >= 2
|
|
OR i_VanRammedCount > 6
|
|
|
|
// Player can now steal the van by towing it, and the driver should just try to combat you.
|
|
IF DOES_ENTITY_EXIST(s_VehVan.id)
|
|
AND IS_VEHICLE_DRIVEABLE(s_VehVan.id)
|
|
SET_VEHICLE_DISABLE_TOWING(s_VehVan.id, FALSE)
|
|
ENDIF
|
|
|
|
i_VanDriverDialogue = 0
|
|
i_VanDriverDiaTimer = 0
|
|
str_VanDriverDiaRoot = ""
|
|
SET_MISSION_EVENT_STAGE(sData, enum_to_int(DRIVERAI_COMBATING))
|
|
CPRINTLN(DEBUG_MISSION, "GONE TO DRIVERAI_COMBATING: From DRIVERAI_FLEEING")
|
|
|
|
ELSE
|
|
IF NOT IS_SCRIPT_TASK_RUNNING_OR_STARTING(s_PedDriver.id, SCRIPT_TASK_VEHICLE_MISSION)
|
|
TASK_VEHICLE_MISSION_PED_TARGET(s_PedDriver.id, s_VehVan.id, PLAYER_PED_ID(), MISSION_FLEE, 90.0, DRIVINGMODE_AVOIDCARS_RECKLESS, 400, 10, FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
CASE DRIVERAI_COMBATING
|
|
|
|
IF DOES_ENTITY_EXIST(s_VehVan.id)
|
|
AND NOT IS_ENTITY_DEAD(s_VehVan.id)
|
|
IF IS_PED_IN_VEHICLE(s_PedDriver.id, s_VehVan.id)
|
|
IF NOT IS_VEHICLE_ALMOST_STOPPED(s_VehVan.id)
|
|
IF NOT IS_SCRIPT_TASK_RUNNING_OR_STARTING(s_PedDriver.id, SCRIPT_TASK_VEHICLE_TEMP_ACTION)
|
|
CLEAR_PED_TASKS(s_PedDriver.id)
|
|
TASK_VEHICLE_TEMP_ACTION(s_PedDriver.id, s_VehVan.id, TEMPACT_HANDBRAKETURNRIGHT, -1)
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_SCRIPT_TASK_RUNNING_OR_STARTING(s_PedDriver.id, SCRIPT_TASK_LEAVE_VEHICLE)
|
|
TASK_LEAVE_VEHICLE(s_PedDriver.id, s_VehVan.id, ECF_DONT_CLOSE_DOOR)
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_SCRIPT_TASK_RUNNING_OR_STARTING(s_PedDriver.id, SCRIPT_TASK_COMBAT)
|
|
SET_PED_CAN_BE_TARGETTED(s_PedDriver.id, TRUE)
|
|
TASK_COMBAT_PED(s_PedDriver.id, PLAYER_PED_ID())
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// Apply damage to the van
|
|
IF DOES_ENTITY_EXIST(s_VehVan.id)
|
|
AND NOT IS_ENTITY_DEAD(s_VehVan.id)
|
|
|
|
// Allow the doors to be broken
|
|
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(s_VehVan.id, SC_DOOR_REAR_LEFT, TRUE)
|
|
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(s_VehVan.id, SC_DOOR_REAR_RIGHT, TRUE)
|
|
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
ENDIF
|
|
|
|
// Dialogue
|
|
IF DOES_ENTITY_EXIST(s_PedDriver.id)
|
|
AND NOT IS_PED_INJURED(s_PedDriver.id)
|
|
AND NOT IS_CONVERSATION_PED_DEAD(s_PedDriver.id)
|
|
|
|
SWITCH int_to_enum(DRIVER_AI_ENUM, sData.iStage)
|
|
CASE DRIVERAI_FLEEING
|
|
|
|
SWITCH i_VanDriverDialogue
|
|
CASE 0
|
|
IF IS_SAFE_TO_START_CONVERSATION()
|
|
AND NOT IS_AMBIENT_SPEECH_PLAYING(s_PedDriver.id)
|
|
IF IS_PED_BEING_JACKED(s_PedDriver.id)
|
|
PLAY_PED_AMBIENT_SPEECH(s_PedDriver.id, "JACKED_GENERIC", SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
|
|
ELSE
|
|
PLAY_PED_AMBIENT_SPEECH(s_PedDriver.id, "GENERIC_SHOCKED_HIGH", SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
|
|
ENDIF
|
|
i_VanDriverDialogue++
|
|
ENDIF
|
|
BREAK
|
|
CASE 1
|
|
// cargo has fallen out or he is not in the vehicle skip the conversation
|
|
IF NOT IS_PED_IN_VEHICLE(s_PedDriver.id, s_VehVan.id)
|
|
OR eVanState = VANSTATE_CARGO_FALLEN_OUT
|
|
IF NOT IS_PED_IN_VEHICLE(s_PedDriver.id, s_VehVan.id)
|
|
i_VanDriverDialogue = 4 // stop playing dialogue as hes not in the vehicle
|
|
ELSE
|
|
i_VanDriverDialogue++
|
|
ENDIF
|
|
ELIF IS_SAFE_TO_START_CONVERSATION()
|
|
AND NOT IS_AMBIENT_SPEECH_PLAYING(s_PedDriver.id)
|
|
IF CREATE_CONVERSATION(s_Convo, str_Dialogue, "JS_INIT_M", CONV_PRIORITY_HIGH)
|
|
i_VanDriverDialogue++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
CASE 2
|
|
IF IS_SAFE_TO_START_CONVERSATION()
|
|
AND NOT IS_AMBIENT_SPEECH_PLAYING(s_PedDriver.id)
|
|
|
|
IF IS_STRING_NULL_OR_EMPTY(str_VanDriverDiaRoot)
|
|
|
|
FLOAT fDist
|
|
fDist = VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(s_PedDriver.id))
|
|
|
|
IF (b_VanRammedLastFrame
|
|
OR HAS_PED_RECEIVED_EVENT(s_PedDriver.id, EVENT_SHOT_FIRED)
|
|
OR HAS_PED_RECEIVED_EVENT(s_PedDriver.id, EVENT_SHOT_FIRED_BULLET_IMPACT)
|
|
OR HAS_PED_RECEIVED_EVENT(s_PedDriver.id, EVENT_SHOT_FIRED_WHIZZED_BY)
|
|
OR fDist < 49) // 7m^2
|
|
|
|
AND GET_GAME_TIMER() - i_VanDriverDiaTimer > 5000
|
|
AND fDist < 225 // 15m^2
|
|
|
|
IF GET_RANDOM_INT_IN_RANGE(0, 2) = 0
|
|
str_VanDriverDiaRoot = "GENERIC_CURSE_HIGH"
|
|
ELSE
|
|
str_VanDriverDiaRoot = "JS_ATT_M"
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF NOT IS_STRING_NULL_OR_EMPTY(str_VanDriverDiaRoot)
|
|
IF ARE_STRINGS_EQUAL(str_VanDriverDiaRoot, "GENERIC_CURSE_HIGH")
|
|
PLAY_PED_AMBIENT_SPEECH(s_PedDriver.id, "GENERIC_CURSE_HIGH", SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
|
|
i_VanDriverDialogue++
|
|
ELSE
|
|
IF CREATE_CONVERSATION(s_Convo, str_Dialogue, str_VanDriverDiaRoot, CONV_PRIORITY_HIGH)
|
|
i_VanDriverDialogue++
|
|
ENDIF
|
|
i_VanDriverDialogue++
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
BREAK
|
|
CASE 3
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
AND NOT IS_AMBIENT_SPEECH_PLAYING(s_PedDriver.id)
|
|
i_VanDriverDiaTimer = GET_GAME_TIMER()
|
|
str_VanDriverDiaRoot = ""
|
|
i_VanDriverDialogue--
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
BREAK
|
|
|
|
CASE DRIVERAI_COMBATING
|
|
SWITCH i_VanDriverDialogue
|
|
CASE 0
|
|
IF IS_SAFE_TO_START_CONVERSATION()
|
|
AND NOT IS_AMBIENT_SPEECH_PLAYING(s_PedDriver.id)
|
|
|
|
IF IS_STRING_NULL_OR_EMPTY(str_VanDriverDiaRoot)
|
|
|
|
IF GET_GAME_TIMER() - i_VanDriverDiaTimer > 5000
|
|
AND VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(s_PedDriver.id)) < 400 // 20m^2
|
|
|
|
IF GET_RANDOM_INT_IN_RANGE(0, 2) = 0
|
|
str_VanDriverDiaRoot = "GENERIC_INSULT_HIGH"
|
|
ELSE
|
|
str_VanDriverDiaRoot = "JS_COMB_M"
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF NOT IS_STRING_NULL_OR_EMPTY(str_VanDriverDiaRoot)
|
|
IF ARE_STRINGS_EQUAL(str_VanDriverDiaRoot, "GENERIC_INSULT_HIGH")
|
|
PLAY_PED_AMBIENT_SPEECH(s_PedDriver.id, "GENERIC_INSULT_HIGH", SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
|
|
i_VanDriverDialogue++
|
|
ELSE
|
|
IF CREATE_CONVERSATION(s_Convo, str_Dialogue, str_VanDriverDiaRoot, CONV_PRIORITY_HIGH)
|
|
i_VanDriverDialogue++
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
BREAK
|
|
CASE 1
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
AND NOT IS_AMBIENT_SPEECH_PLAYING(s_PedDriver.id)
|
|
i_VanDriverDiaTimer = GET_GAME_TIMER()
|
|
str_VanDriverDiaRoot = ""
|
|
i_VanDriverDialogue--
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
// Cleanup event
|
|
IF IS_MISSION_EVENT_ENDED(sData)
|
|
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC EVENT_CARGO_DROP_MANAGER(MISSION_EVENT_DATA &sData)
|
|
|
|
IF NOT IS_MISSION_EVENT_ENDED(sData)
|
|
|
|
IF IS_ENTITY_DEAD(s_VehVan.id)
|
|
|
|
DETACH_CASE_FROM_VAN(obj_Grenades[0].id, TRUE)
|
|
DETACH_CASE_FROM_VAN(obj_Grenades[1].id, TRUE)
|
|
DETACH_CASE_FROM_VAN(obj_Grenades[2].id, TRUE)
|
|
|
|
b_VehVanNoLongerNeeded = TRUE
|
|
END_MISSION_EVENT(sData)
|
|
|
|
ELSE
|
|
|
|
SWITCH sData.iStage
|
|
CASE MISSION_EVENT_STAGE_START
|
|
Load_Asset_Audiobank(s_AssetData, "JWL_HEIST_PREP_2A_SHOOTING_LOCK")
|
|
IF REQUEST_SCRIPT_AUDIO_BANK("JWL_HEIST_PREP_2A_SHOOTING_LOCK")
|
|
IF GET_GAME_TIMER() - i_BulletHitTimer > 150
|
|
|
|
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(obj_Lock, player_ped_id(),false)
|
|
|
|
IF HAS_ENTITY_BEEN_DAMAGED_BY_WEAPON(obj_Lock, WEAPONTYPE_MOLOTOV)
|
|
OR HAS_ENTITY_BEEN_DAMAGED_BY_WEAPON(obj_Lock, WEAPONTYPE_BZGAS)
|
|
OR HAS_ENTITY_BEEN_DAMAGED_BY_WEAPON(obj_Lock, WEAPONTYPE_KNIFE)
|
|
OR HAS_ENTITY_BEEN_DAMAGED_BY_WEAPON(obj_Lock, WEAPONTYPE_UNARMED)
|
|
OR HAS_ENTITY_BEEN_DAMAGED_BY_WEAPON(obj_Lock, WEAPONTYPE_WATER_CANNON)
|
|
CLEAR_ENTITY_LAST_WEAPON_DAMAGE(obj_Lock)
|
|
ELSE
|
|
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(obj_Lock)
|
|
i_BulletHitTimer = GET_GAME_TIMER()
|
|
i_NumBulletHitsOnDoorLock++
|
|
|
|
IF i_NumBulletHitsOnDoorLock >= 3
|
|
PLAY_SOUND_FROM_ENTITY(-1, "Lock_Destroyed", obj_Lock, "JWL_PREP_2A_SOUNDS")
|
|
ELSE
|
|
PLAY_SOUND_FROM_ENTITY(-1, "Lock_Damage", obj_Lock, "JWL_PREP_2A_SOUNDS")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ELSE
|
|
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(obj_Lock)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF i_NumBulletHitsOnDoorLock >= 3
|
|
OR IS_ENTITY_DEAD(obj_Lock)
|
|
OR IS_VEHICLE_DOOR_DAMAGED(s_VehVan.id, SC_DOOR_REAR_LEFT) OR IS_VEHICLE_DOOR_DAMAGED(s_VehVan.id, SC_DOOR_REAR_RIGHT)
|
|
OR GET_VEHICLE_DOOR_ANGLE_RATIO(s_VehVan.id, SC_DOOR_REAR_LEFT) > 0.0 OR GET_VEHICLE_DOOR_ANGLE_RATIO(s_VehVan.id, SC_DOOR_REAR_RIGHT) > 0.0
|
|
|
|
IF DOES_ENTITY_EXIST(obj_Lock)
|
|
DELETE_OBJECT(obj_Lock)
|
|
ENDIF
|
|
|
|
IF NOT IS_VEHICLE_DOOR_DAMAGED(s_VehVan.id, SC_DOOR_REAR_LEFT)
|
|
SET_VEHICLE_DOOR_OPEN(s_VehVan.id,SC_DOOR_REAR_LEFT, FALSE)
|
|
ENDIF
|
|
IF NOT IS_VEHICLE_DOOR_DAMAGED(s_VehVan.id, SC_DOOR_REAR_RIGHT)
|
|
SET_VEHICLE_DOOR_OPEN(s_VehVan.id,SC_DOOR_REAR_RIGHT, FALSE)
|
|
ENDIF
|
|
|
|
bDoorSwingingFreeL = FALSE
|
|
bDoorSwingingFreeR = FALSE
|
|
|
|
// detach the cargo so it falls out the back of the van.
|
|
DETACH_CASE_FROM_VAN(obj_Grenades[0].id, FALSE)
|
|
DETACH_CASE_FROM_VAN(obj_Grenades[1].id, FALSE)
|
|
DETACH_CASE_FROM_VAN(obj_Grenades[2].id, FALSE)
|
|
|
|
SET_MISSION_EVENT_STAGE(sData, 2)
|
|
|
|
ENDIF
|
|
BREAK
|
|
CASE 2
|
|
|
|
IF IS_ENTITY_ALIVE(s_VehVan.id)
|
|
|
|
IF ABSF(GET_VEHICLE_DOOR_ANGLE_RATIO(s_VehVan.id, SC_DOOR_REAR_LEFT)) > 0.5
|
|
AND ABSF(GET_VEHICLE_DOOR_ANGLE_RATIO(s_VehVan.id, SC_DOOR_REAR_RIGHT)) > 0.5
|
|
|
|
// // detach the cargo so it falls out the back of the van.
|
|
// DETACH_CASE_FROM_VAN(obj_Grenades[0].id, FALSE)
|
|
// DETACH_CASE_FROM_VAN(obj_Grenades[1].id, FALSE)
|
|
// DETACH_CASE_FROM_VAN(obj_Grenades[2].id, FALSE)
|
|
|
|
SET_MISSION_EVENT_STAGE(sData, 3)
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
CASE 3
|
|
|
|
IF IS_ENTITY_ALIVE(s_VehVan.id)
|
|
|
|
IF NOT IS_VEHICLE_DOOR_DAMAGED(s_VehVan.id, SC_DOOR_REAR_LEFT)
|
|
IF IS_VEHICLE_DOOR_FULLY_OPEN(s_VehVan.id, SC_DOOR_REAR_LEFT)
|
|
SET_VEHICLE_DOOR_OPEN(s_VehVan.id,SC_DOOR_REAR_LEFT, TRUE)
|
|
SET_VEHICLE_DOOR_LATCHED(s_VehVan.id, SC_DOOR_REAR_LEFT, FALSE, FALSE)
|
|
bDoorSwingingFreeL = TRUE
|
|
ENDIF
|
|
ELSE
|
|
bDoorSwingingFreeL = TRUE
|
|
ENDIF
|
|
|
|
IF NOT IS_VEHICLE_DOOR_DAMAGED(s_VehVan.id, SC_DOOR_REAR_RIGHT)
|
|
IF IS_VEHICLE_DOOR_FULLY_OPEN(s_VehVan.id, SC_DOOR_REAR_RIGHT)
|
|
SET_VEHICLE_DOOR_OPEN(s_VehVan.id,SC_DOOR_REAR_RIGHT, TRUE)
|
|
SET_VEHICLE_DOOR_LATCHED(s_VehVan.id, SC_DOOR_REAR_RIGHT, FALSE, FALSE)
|
|
bDoorSwingingFreeR = TRUE
|
|
ENDIF
|
|
ELSE
|
|
bDoorSwingingFreeR = TRUE
|
|
ENDIF
|
|
|
|
IF bDoorSwingingFreeL AND bDoorSwingingFreeR
|
|
b_VehVanNoLongerNeeded = TRUE
|
|
SET_MISSION_EVENT_STAGE(sData, 4)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
// Cleanup event
|
|
IF IS_MISSION_EVENT_ENDED(sData)
|
|
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC ADD_ALL_MISSION_EVENTS()
|
|
ADD_NEW_MISSION_EVENT(s_Events[mef_driver_manager], &EVENT_VAN_DRIVER_MANAGER, "Van Driver Manager")
|
|
ADD_NEW_MISSION_EVENT(s_Events[mef_cargo_manager], &EVENT_CARGO_DROP_MANAGER, "Cargo Manager")
|
|
ENDPROC
|
|
|
|
PROC GET_SKIP_STAGE_COORD_AND_HEADING(INT iStage, VECTOR &vCoord, FLOAT &fHeading)
|
|
|
|
SWITCH int_to_enum(MISSION_STAGE_FLAGS, iStage)
|
|
CASE msf_gas_steal vCoord = <<1256.9364, 556.8262, 79.7001>> fHeading = 134.0936 BREAK
|
|
CASE msf_mission_passed vCoord = <<692.2659, -1004.1848, 21.9451>> fHeading = 3.5976 BREAK
|
|
ENDSWITCH
|
|
|
|
ENDPROC
|
|
|
|
PROC Mission_Setup()
|
|
|
|
ADD_ALL_MISSION_EVENTS()
|
|
|
|
ADD_RELATIONSHIP_GROUP("SECDRIVER", rel_Security)
|
|
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, rel_Security, RELGROUPHASH_COP)
|
|
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, rel_Security, RELGROUPHASH_SECURITY_GUARD)
|
|
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, RELGROUPHASH_COP, rel_Security)
|
|
|
|
IF IS_REPEAT_PLAY_ACTIVE() // REPLAY VIA START MENU
|
|
OR IS_REPLAY_IN_PROGRESS() // Do not do on retries as player is put off mision to start with so we will need to grab trigger scene stuff
|
|
|
|
i_SkipToStage = enum_to_int(msf_gas_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)
|
|
|
|
// always use this route when doing a repeat play
|
|
g_JHP2A_string_WayPoint = "jhp2a_alt"
|
|
|
|
// 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, "JHP2A", MISSION_TEXT_SLOT)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
debug_widget = START_WIDGET_GROUP("Jewelry Store Job - Prep2A")
|
|
ADD_WIDGET_INT_READ_ONLY("Mission Stage", i_missionStage)
|
|
ADD_WIDGET_INT_READ_ONLY("Mission Substage", i_missionSubstage)
|
|
ADD_WIDGET_INT_READ_ONLY("RamCount", i_VanRammedCount)
|
|
ADD_WIDGET_FLOAT_READ_ONLY("ClosingSpeed", debug_fClosingSpeed)
|
|
START_WIDGET_GROUP("Cases")
|
|
twi_vanState = ADD_TEXT_WIDGET("VanState")
|
|
ADD_WIDGET_VECTOR_SLIDER("Van inside v1", v_VanCargo1, -20, 20, 0.1)
|
|
ADD_WIDGET_VECTOR_SLIDER("Van inside v2", v_VanCargo2, -20, 20, 0.1)
|
|
STOP_WIDGET_GROUP()
|
|
|
|
STOP_WIDGET_GROUP()
|
|
SET_LOCATES_HEADER_WIDGET_GROUP(debug_widget)
|
|
|
|
s_ZMenuStruct[0].sTxtLabel = "STEAL THE VAN"
|
|
s_ZMenuStruct[1].sTxtLabel = "MISSION PASSED"
|
|
#ENDIF
|
|
|
|
SET_WANTED_LEVEL_MULTIPLIER(0.1)
|
|
SET_ALL_RANDOM_PEDS_FLEE(PLAYER_ID(), TRUE)
|
|
|
|
INIT_BATTLEBUDDY_BEHAVIOUR_FOR_MISSION(SP_HEIST_JEWELRY_PREP_2A)
|
|
|
|
ADD_PED_FOR_DIALOGUE(s_Convo, 0, PLAYER_PED_ID(), "MICHAEL")
|
|
ADD_PED_FOR_DIALOGUE(s_Convo, 3, null, "Lester")
|
|
|
|
SET_VEHICLE_MODEL_IS_SUPPRESSED(BOXVILLE3, TRUE)
|
|
SET_PED_MODEL_IS_SUPPRESSED(S_M_M_Armoured_01, TRUE)
|
|
|
|
IF HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_BRIEFCASE)
|
|
REMOVE_WEAPON_FROM_PED(PLAYER_PED_ID(), WEAPONTYPE_BRIEFCASE)
|
|
ENDIF
|
|
|
|
SET_START_CHECKPOINT_AS_FINAL() // tells replay controller to display "skip mission" for shitskips
|
|
|
|
IF IS_STRING_NULL_OR_EMPTY(g_JHP2A_string_WayPoint)
|
|
SCRIPT_ASSERT("Route global not set")
|
|
ELSE
|
|
CPRINTLN(debug_mission, "Route received from trigger scene global: ", g_JHP2A_string_WayPoint)
|
|
ENDIF
|
|
|
|
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)
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
g_bLaptopMissionSuppressed = TRUE
|
|
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)
|
|
i_missionStage = i_SkipToStage
|
|
|
|
RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
CLEAR_PRINTS()
|
|
CLEAR_HELP()
|
|
|
|
Mission_Cleanup(TRUE)
|
|
IF IS_CUTSCENE_ACTIVE()
|
|
REMOVE_CUTSCENE()
|
|
ENDIF
|
|
|
|
// 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
|
|
// -----------------------------------------------
|
|
Start_Skip_Streaming(s_AssetData)
|
|
|
|
// Asset loading
|
|
SWITCH int_to_enum(MISSION_STAGE_FLAGS, i_missionStage)
|
|
CASE msf_gas_steal
|
|
Load_Asset_Model(s_AssetData, mod_Driver)
|
|
Load_Asset_Model(s_AssetData, mod_Van)
|
|
Load_Asset_Model(s_AssetData, mod_Case)
|
|
Load_Asset_Waypoint(s_AssetData, g_JHP2A_string_WayPoint)
|
|
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_gas_steal
|
|
|
|
WHILE NOT PREPARE_INITIAL_SCENE(FALSE)
|
|
wait(0)
|
|
ENDWHILE
|
|
|
|
// Create player vehicle
|
|
IF ARE_STRINGS_EQUAL(g_JHP2A_string_WayPoint, "jhp2a_main")
|
|
WHILE NOT Create_Player_Mission_Vehicle(s_VehPlayer.id, <<1395.8510, -1069.3057, 52.4779>>, 118.1591, TRUE)
|
|
WAIT(0)
|
|
CLEAR_AREA_OF_VEHICLES(<<1395.8510, -1069.3057, 52.4779>>, 20.0)
|
|
ENDWHILE
|
|
ELSE
|
|
WHILE NOT Create_Player_Mission_Vehicle(s_VehPlayer.id, <<1256.9131, 556.8416, 79.7013>>, 134.0793, TRUE)
|
|
WAIT(0)
|
|
CLEAR_AREA_OF_VEHICLES(<<1256.9131, 556.8416, 79.7013>>, 20.0)
|
|
ENDWHILE
|
|
ENDIF
|
|
|
|
SET_VEHICLE_COLOUR_COMBINATION(s_VehPlayer.id, 0)
|
|
SET_VEHICLE_EXTRA(s_VehPlayer.id, 1, FALSE)
|
|
SET_VEHICLE_EXTRA(s_VehPlayer.id, 2, TRUE)
|
|
SET_VEHICLE_ON_GROUND_PROPERLY(s_VehPlayer.id)
|
|
SET_VEHICLE_ENGINE_ON(s_VehPlayer.id, TRUE, TRUE)
|
|
//SET_ENTITY_HEALTH(s_VehPlayer.id, 3000)
|
|
|
|
IF IS_REPLAY_BEING_SET_UP()
|
|
END_REPLAY_SETUP(s_VehPlayer.id, VS_DRIVER)
|
|
ELSE
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
|
|
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), s_VehPlayer.id, VS_DRIVER)
|
|
ENDIF
|
|
|
|
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_1A)
|
|
|
|
s_VehVan.id = CREATE_VEHICLE(BOXVILLE3, <<693.7250, -1006.3015, 21.8355>>, 359.8840)
|
|
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(s_VehVan.id, FALSE)
|
|
SET_VEHICLE_ON_GROUND_PROPERLY(s_VehVan.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())
|
|
DO_SCREEN_FADE_IN(1000)
|
|
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 2a", 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
|
|
|
|
BOOL bWasInVehiclePrevFrame
|
|
|
|
//PURPOSE: STEAL THE VAN OR THE CARGO
|
|
FUNC BOOL STAGE_STEAL_GRENADES()
|
|
|
|
VECTOR vGarmentFactoryParkCoord = <<692.8256, -1012.5445, 21.7220>>
|
|
VECTOR vGarmentFactoryFootCoord = <<707.15, -959.66, 29.40>>
|
|
|
|
INT i
|
|
|
|
IF NOT b_StageSetup
|
|
|
|
IF IS_THIS_ENTITY_ALIVE(s_VehVan.id)
|
|
IF GET_BLIP_FROM_ENTITY(s_VehVan.id) != NULL
|
|
s_VehVan.blip = GET_BLIP_FROM_ENTITY(s_VehVan.id)
|
|
ELSE
|
|
s_VehVan.blip = CREATE_BLIP_FOR_VEHICLE(s_VehVan.id, FALSE)
|
|
ENDIF
|
|
PRINT_NOW("JHP2A_STEAL", DEFAULT_GOD_TEXT_TIME, 1)
|
|
PRINT_HELP("JHP2A_HLP2", 15000)
|
|
ELSE
|
|
IF GET_BLIP_FROM_ENTITY(s_VehVan.id) != NULL
|
|
SET_THIS_SCRIPT_CAN_REMOVE_BLIPS_CREATED_BY_ANY_SCRIPT(TRUE)
|
|
BLIP_INDEX blip = GET_BLIP_FROM_ENTITY(s_VehVan.id)
|
|
REMOVE_BLIP(blip)
|
|
SET_THIS_SCRIPT_CAN_REMOVE_BLIPS_CREATED_BY_ANY_SCRIPT(FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
TRIGGER_MUSIC_EVENT("JHP2A_START")
|
|
|
|
SET_MISSION_START_VEHICLE_AS_VEHICLE_GEN(<<0,0,0>>, 0, TRUE, GET_CURRENT_PLAYER_PED_ENUM())
|
|
|
|
REPLAY_RECORD_BACK_FOR_TIME(5.0, 5.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
bDisplayedStealBZCaseObjective = FALSE
|
|
b_StageSetup = TRUE
|
|
bWasInVehiclePrevFrame = TRUE
|
|
i_missionSubstage = 1
|
|
ENDIF
|
|
|
|
IF b_StageSetup
|
|
|
|
UPDATE_VAN_STATE()
|
|
|
|
SWITCH i_missionSubstage
|
|
CASE 1
|
|
|
|
// Manage hint cam
|
|
IF eVanState = VANSTATE_DRIVABLE_WITH_CARGO
|
|
AND DOES_ENTITY_EXIST(s_VehVan.id) AND IS_VEHICLE_DRIVEABLE(s_VehVan.id)
|
|
AND DOES_ENTITY_EXIST(s_PedDriver.id) AND NOT IS_PED_INJURED(s_PedDriver.id)
|
|
AND IS_PED_IN_VEHICLE(s_PedDriver.id, s_VehVan.id)
|
|
AND IS_MISSION_EVENT_RUNNING(s_Events[mef_driver_manager].sData)
|
|
CONTROL_VEHICLE_CHASE_HINT_CAM_IN_VEHICLE(localChaseHintCamStruct, s_VehVan.id)
|
|
ELSE
|
|
KILL_CHASE_HINT_CAM(localChaseHintCamStruct)
|
|
ENDIF
|
|
|
|
// Cargo has fallen out the back of the van
|
|
IF eVanState = VANSTATE_CARGO_FALLEN_OUT
|
|
OR eVanState = VANSTATE_CARGO_LOOSE_INSIDE
|
|
|
|
REPLAY_RECORD_BACK_FOR_TIME(5.0, 5.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
CLEAR_MISSION_LOCATE_STUFF(s_LocatesData)
|
|
IF IS_HELP_MESSAGE_BEING_DISPLAYED()
|
|
AND IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("JHP2A_HLP2")
|
|
CLEAR_HELP() // clear help text instructing player to blow up or damage doors
|
|
ENDIF
|
|
IF NOT bDisplayedStealBZCaseObjective
|
|
PRINT_NOW("JHP2A_TAKEBZ", DEFAULT_GOD_TEXT_TIME, 1)
|
|
ENDIF
|
|
i_missionSubstage = 2
|
|
|
|
ELSE
|
|
|
|
// Tow truck steal
|
|
IF DOES_ENTITY_EXIST(s_VehTowTruck.id)
|
|
AND IS_VEHICLE_DRIVEABLE(s_VehTowTruck.id)
|
|
AND IS_VEHICLE_ATTACHED_TO_TOW_TRUCK(s_VehTowTruck.id, s_VehVan.id)
|
|
|
|
IF DOES_BLIP_EXIST(s_VehVan.blip)
|
|
|
|
REPLAY_RECORD_BACK_FOR_TIME(5.0, 5.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
SET_THIS_SCRIPT_CAN_REMOVE_BLIPS_CREATED_BY_ANY_SCRIPT(TRUE)
|
|
REMOVE_BLIP(s_VehVan.blip)
|
|
SET_THIS_SCRIPT_CAN_REMOVE_BLIPS_CREATED_BY_ANY_SCRIPT(FALSE)
|
|
INFORM_MISSION_STATS_SYSTEM_OF_TIME_WINDOW_OPEN(JH2AP_FACTORY_TIME)
|
|
ENDIF
|
|
|
|
IS_PLAYER_AT_LOCATION_IN_VEHICLE(s_LocatesData, vGarmentFactoryParkCoord, <<0.1, 0.1, 0.1>>,
|
|
TRUE, s_VehTowTruck.id, "JHP2A_RTNVAN", "", "", TRUE)
|
|
|
|
IF IS_ENTITY_IN_ANGLED_AREA(s_VehVan.id, <<692.914307,-1003.555786,21.508389>>, <<692.651123,-1021.604126,26.206753>>, 9.750000)
|
|
BRING_VEHICLE_TO_HALT(s_VehTowTruck.id, 5, -1)
|
|
i_missionSubstage = 101
|
|
ENDIF
|
|
|
|
|
|
// Van is not drivable OR van doors are open, tell player to go to the back and reteive the cargo
|
|
ELIF eVanState = VANSTATE_NOT_DRIVABLE_WITH_CARGO
|
|
|
|
CLEAR_MISSION_LOCATE_STUFF(s_LocatesData)
|
|
|
|
IF NOT DOES_BLIP_EXIST(obj_Grenades[0].blip)
|
|
|
|
REPLAY_RECORD_BACK_FOR_TIME(5.0, 5.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
obj_Grenades[0].blip = CREATE_BLIP_FOR_OBJECT(obj_Grenades[0].id)
|
|
|
|
PRINT_NOW("JHP2A_TAKEBZ", DEFAULT_GOD_TEXT_TIME, 1)
|
|
bDisplayedStealBZCaseObjective = TRUE
|
|
|
|
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(s_VehVan.id, FALSE) // player can't get back (shouldn't be able to any way as the van is fucked at this point, just a precaution)
|
|
|
|
ENDIF
|
|
|
|
// Van is drivable with the cargo in the back
|
|
ELIF eVanState = VANSTATE_DRIVABLE_WITH_CARGO
|
|
|
|
IF DOES_BLIP_EXIST(s_VehVan.blip)
|
|
|
|
REPLAY_RECORD_BACK_FOR_TIME(5.0, 5.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
SET_THIS_SCRIPT_CAN_REMOVE_BLIPS_CREATED_BY_ANY_SCRIPT(TRUE)
|
|
REMOVE_BLIP(s_VehVan.blip)
|
|
SET_THIS_SCRIPT_CAN_REMOVE_BLIPS_CREATED_BY_ANY_SCRIPT(FALSE)
|
|
INFORM_MISSION_STATS_SYSTEM_OF_TIME_WINDOW_OPEN(JH2AP_FACTORY_TIME)
|
|
ENDIF
|
|
|
|
IF IS_PLAYER_AT_ANGLED_AREA_IN_VEHICLE(s_LocatesData, vGarmentFactoryParkCoord, <<692.914307,-1003.555786,21.508389>>, <<692.651123,-1021.604126,26.206753>>, 9.750000,
|
|
TRUE, s_VehVan.id, "JHP2A_RTNVAN", "", "", IS_PED_IN_VEHICLE(PLAYER_PED_ID(), s_VehVan.id))
|
|
i_missionSubstage = 101
|
|
ENDIF
|
|
|
|
IF DOES_BLIP_EXIST(s_LocatesData.vehicleBlip)
|
|
AND DOES_BLIP_HAVE_GPS_ROUTE(s_LocatesData.vehicleBlip)
|
|
SET_BLIP_ROUTE(s_LocatesData.vehicleBlip, FALSE)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
BREAK
|
|
CASE 101
|
|
|
|
VEHICLE_INDEX vehTemp
|
|
|
|
IF DOES_ENTITY_EXIST(s_VehVan.id) AND IS_PED_IN_VEHICLE(PLAYER_PED_ID(), s_VehVan.id)
|
|
vehTemp = s_VehVan.id
|
|
ELIF DOES_ENTITY_EXIST(s_VehTowTruck.id) AND IS_VEHICLE_ATTACHED_TO_TOW_TRUCK(s_VehTowTruck.id, s_VehVan.id)
|
|
vehTemp = s_VehTowTruck.id
|
|
ENDIF
|
|
|
|
IF BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(vehTemp)
|
|
IF GET_MISSION_COMPLETE_STATE(SP_HEIST_JEWELRY_PREP_1A)
|
|
REPLAY_RECORD_BACK_FOR_TIME(5.0, 5.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
i_missionSubstage = 1000
|
|
ELSE
|
|
REPLAY_RECORD_BACK_FOR_TIME(5.0, 5.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
TASK_LEAVE_ANY_VEHICLE(PLAYER_PED_ID())
|
|
i_missionSubstage++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
CASE 102
|
|
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID(), TRUE)
|
|
|
|
CLEAR_PRINTS()
|
|
|
|
// Player can no longer interact with the van.
|
|
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(s_VehVan.id, FALSE)
|
|
SET_VEHICLE_DISABLE_TOWING(s_VehVan.id, TRUE)
|
|
|
|
// Use this to reset the tow truck so it can move about
|
|
IF DOES_ENTITY_EXIST(s_VehTowTruck.id)
|
|
BRING_VEHICLE_TO_HALT(s_VehTowTruck.id, 5, 1)
|
|
ENDIF
|
|
|
|
INFORM_MISSION_STATS_SYSTEM_OF_TIME_WINDOW_CLOSED()
|
|
|
|
IF DOES_ENTITY_EXIST(obj_Grenades[0].id) DELETE_OBJECT(obj_Grenades[0].id) ENDIF
|
|
IF DOES_ENTITY_EXIST(obj_Grenades[1].id) DELETE_OBJECT(obj_Grenades[1].id) ENDIF
|
|
IF DOES_ENTITY_EXIST(obj_Grenades[2].id) DELETE_OBJECT(obj_Grenades[2].id) ENDIF
|
|
|
|
RETURN TRUE
|
|
|
|
ENDIF
|
|
BREAK
|
|
CASE 2
|
|
|
|
IF NOT HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_BRIEFCASE)
|
|
|
|
// Make sure the cases are blipped
|
|
REPEAT COUNT_OF(obj_Grenades) i
|
|
IF DOES_ENTITY_EXIST(obj_Grenades[i].id)
|
|
AND NOT IS_ENTITY_ATTACHED(obj_Grenades[i].id)
|
|
|
|
IF DOES_BLIP_EXIST(s_VehVan.blip)
|
|
SET_THIS_SCRIPT_CAN_REMOVE_BLIPS_CREATED_BY_ANY_SCRIPT(TRUE)
|
|
REMOVE_BLIP(s_VehVan.blip)
|
|
SET_THIS_SCRIPT_CAN_REMOVE_BLIPS_CREATED_BY_ANY_SCRIPT(FALSE)
|
|
ENDIF
|
|
|
|
IF NOT DOES_BLIP_EXIST(obj_Grenades[i].blip)
|
|
obj_Grenades[i].blip = CREATE_BLIP_FOR_OBJECT(obj_Grenades[i].id)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
REPEAT COUNT_OF(obj_Grenades) i
|
|
IF DOES_ENTITY_EXIST(obj_Grenades[i].id)
|
|
AND NOT IS_ENTITY_ATTACHED(obj_Grenades[i].id)
|
|
IF NOT HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_BRIEFCASE)
|
|
BOOL bIsInSideVan
|
|
bIsInSideVan = IS_CASE_INSIDE_VAN(obj_Grenades[i].id)
|
|
IF (bIsInSideVan AND IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(),
|
|
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_VehVan.id, <<0,-3.0,-0.5>>),
|
|
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(s_VehVan.id, <<0,-4.5,1.0>>), 1.68, FALSE, TRUE, TM_ON_FOOT))
|
|
OR (NOT bIsInSideVan AND IS_ENTITY_AT_COORD(PLAYER_PED_ID(), GET_ENTITY_COORDS(obj_Grenades[i].id), <<0.75,0.75,LOCATE_SIZE_ON_FOOT_ONLY>>, FALSE, FALSE, TM_ON_FOOT))
|
|
//place briefcase into hand
|
|
GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_BRIEFCASE, 1, FALSE, FALSE)
|
|
DELETE_OBJECT(obj_Grenades[i].id)
|
|
CLEAR_PRINTS()
|
|
|
|
// play pickup sfx
|
|
PLAY_SOUND_FRONTEND(-1, "PICKUP_WEAPON_SMOKEGRENADE","HUD_FRONTEND_WEAPONS_PICKUPS_SOUNDSET")
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
ELSE
|
|
|
|
INFORM_MISSION_STATS_SYSTEM_OF_TIME_WINDOW_OPEN(JH2AP_FACTORY_TIME)
|
|
|
|
// Remove any blips on the cases
|
|
REPEAT COUNT_OF(obj_Grenades) i
|
|
IF DOES_BLIP_EXIST(obj_Grenades[i].blip)
|
|
REMOVE_BLIP(obj_Grenades[i].blip)
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
IS_PLAYER_AT_LOCATION_ON_FOOT(s_LocatesData, vGarmentFactoryFootCoord, <<0.1, 0.1, 0.1>>, FALSE, "JHP2A_RTNBZ", TRUE)
|
|
|
|
WEAPON_TYPE weapPlayer
|
|
BOOL bInDropOffRoom, bNearWarehouse
|
|
|
|
GET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), weapPlayer)
|
|
|
|
// is near enough to the warehouse
|
|
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<722.984924,-965.747253,32.296906>>,<<50.000000,40.000000,11.437500>>)
|
|
bNearWarehouse = TRUE
|
|
ENDIF
|
|
|
|
// Check to see if the player is at the end with the case
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<709.743225,-960.336670,29.395329>>, <<703.647766,-960.329285,33.651192>>, 4.125000)
|
|
bInDropOffRoom = TRUE
|
|
ENDIF
|
|
|
|
IF bInDropOffRoom
|
|
OR (bNearWarehouse AND NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID(), TRUE) AND bWasInVehiclePrevFrame)
|
|
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SELECT_WEAPON)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_COVER)
|
|
|
|
IF NOT IS_CELLPHONE_DISABLED()
|
|
DISABLE_CELLPHONE(TRUE)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_RUNNING_RAGDOLL_TASK(PLAYER_PED_ID())
|
|
|
|
IF NOT IS_PED_IN_COVER(PLAYER_PED_ID())
|
|
AND NOT IS_PHONE_ONSCREEN()
|
|
IF weapPlayer != WEAPONTYPE_BRIEFCASE
|
|
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(),WEAPONTYPE_BRIEFCASE, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF bInDropOffRoom
|
|
|
|
IF weapPlayer = WEAPONTYPE_BRIEFCASE
|
|
IF NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("JHP2A_HLP1")
|
|
PRINT_HELP_FOREVER("JHP2A_HLP1")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_CONTROL_JUST_PRESSED(PLAYER_CONTROL, INPUT_CONTEXT)
|
|
AND weapPlayer = WEAPONTYPE_BRIEFCASE
|
|
|
|
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("JHP2A_HLP1")
|
|
CLEAR_HELP()
|
|
ENDIF
|
|
|
|
OBJECT_INDEX objCase
|
|
objCase = GET_WEAPON_OBJECT_FROM_PED(PLAYER_PED_ID())
|
|
ACTIVATE_PHYSICS(objCase)
|
|
|
|
REPLAY_RECORD_BACK_FOR_TIME(3.0, 5.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
|
|
PLAY_SOUND_FROM_ENTITY(-1, "Drop_Case", objCase, "JWL_PREP_2A_SOUNDS")
|
|
|
|
SET_OBJECT_AS_NO_LONGER_NEEDED(objCase)
|
|
|
|
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED, TRUE)
|
|
REMOVE_WEAPON_FROM_PED(PLAYER_PED_ID(), WEAPONTYPE_BRIEFCASE)
|
|
|
|
INFORM_MISSION_STATS_SYSTEM_OF_TIME_WINDOW_CLOSED()
|
|
INFORM_STAT_SYSTEM_OF_BOOL_STAT_HAPPENED(JHP2A_LOOSE_CARGO)
|
|
|
|
CLEAR_MISSION_LOCATE_STUFF(s_LocatesData)
|
|
|
|
IF GET_MISSION_COMPLETE_STATE(SP_HEIST_JEWELRY_PREP_1A)
|
|
IF IS_CELLPHONE_DISABLED()
|
|
DISABLE_CELLPHONE(FALSE)
|
|
ENDIF
|
|
i_missionSubstage = 2000
|
|
ELSE
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ELSE
|
|
IF IS_CELLPHONE_DISABLED()
|
|
DISABLE_CELLPHONE(FALSE)
|
|
ENDIF
|
|
|
|
IF IS_HELP_MESSAGE_BEING_DISPLAYED()
|
|
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("JHP2A_HLP1")
|
|
CLEAR_HELP()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
bWasInVehiclePrevFrame = IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID(), TRUE)
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
// Dropped off van and need to make the phone call
|
|
CASE 1000
|
|
TASK_LEAVE_ANY_VEHICLE(PLAYER_PED_ID())
|
|
SET_ENTITY_INVINCIBLE(PLAYER_PED_ID(), TRUE)
|
|
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(s_VehVan.id, FALSE)
|
|
SET_VEHICLE_DISABLE_TOWING(s_VehVan.id, TRUE)
|
|
|
|
BLOCK_PLAYER_FOR_LEAD_IN(TRUE)
|
|
UPDATE_BLOCKED_PLAYER_FOR_LEAD_IN(TRUE)
|
|
|
|
IF IS_SAFE_TO_START_CONVERSATION()
|
|
IF PLAYER_CALL_CHAR_CELLPHONE(s_Convo, CHAR_LESTER, "JHFAUD", "JHF_BZD2", CONV_PRIORITY_HIGH)
|
|
REPLAY_RECORD_BACK_FOR_TIME(5.0, 5.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
i_missionSubstage++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
CASE 1001
|
|
UPDATE_BLOCKED_PLAYER_FOR_LEAD_IN(TRUE)
|
|
IF IS_CALLING_ANY_CONTACT()
|
|
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
|
|
|
|
// Dropped off cases on foot and need to make the phone call
|
|
CASE 2000
|
|
REPLAY_RECORD_BACK_FOR_TIME(5.0, 5.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
SET_ENTITY_INVINCIBLE(PLAYER_PED_ID(), TRUE)
|
|
g_bLaptopMissionSuppressed = TRUE
|
|
BLOCK_PLAYER_FOR_LEAD_IN(TRUE)
|
|
UPDATE_BLOCKED_PLAYER_FOR_LEAD_IN(TRUE)
|
|
i_missionSubstage++
|
|
BREAK
|
|
CASE 2001
|
|
UPDATE_BLOCKED_PLAYER_FOR_LEAD_IN(TRUE)
|
|
IF IS_SAFE_TO_START_CONVERSATION()
|
|
IF PLAYER_CALL_CHAR_CELLPHONE(s_Convo, CHAR_LESTER, "JHFAUD", "JHF_BZD2", CONV_PRIORITY_HIGH)
|
|
i_missionSubstage++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
CASE 2002
|
|
UPDATE_BLOCKED_PLAYER_FOR_LEAD_IN(TRUE)
|
|
IF IS_CALLING_ANY_CONTACT()
|
|
i_missionSubstage++
|
|
ENDIF
|
|
BREAK
|
|
CASE 2003
|
|
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
|
|
|
|
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_HOME)
|
|
b_DisplayDebug = !b_DisplayDebug
|
|
SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(b_DisplayDebug)
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
SWITCH int_to_enum(MISSION_STAGE_FLAGS, i_missionStage)
|
|
|
|
CASE msf_gas_steal
|
|
IF STAGE_STEAL_GRENADES() Stage_Jump_To(msf_mission_passed) ENDIF
|
|
BREAK
|
|
|
|
CASE msf_mission_passed
|
|
Mission_Passed()
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
IF b_DisplayDebug
|
|
INT iDebugTextCounter
|
|
TEXT_LABEL_63 strDebug
|
|
strDebug = "i_NumBulletHitsOnDoorLock: "
|
|
strDebug += i_NumBulletHitsOnDoorLock
|
|
DRAW_DEBUG_TEXT_2D(strDebug, <<0.05, 0.3 + (iDebugTextCounter*0.02), 0.0>>, 0, 0, 0, 255)
|
|
iDebugTextCounter++
|
|
|
|
strDebug = "i_BulletHitTimer: "
|
|
strDebug += i_BulletHitTimer
|
|
DRAW_DEBUG_TEXT_2D(strDebug, <<0.05, 0.3 + (iDebugTextCounter*0.02), 0.0>>, 0, 0, 0, 255)
|
|
iDebugTextCounter++
|
|
|
|
IF DOES_ENTITY_EXIST(obj_Lock)
|
|
strDebug = "Lock Object Health: "
|
|
strDebug += GET_ENTITY_HEALTH(obj_Lock)
|
|
DRAW_DEBUG_TEXT_2D(strDebug, <<0.05, 0.3 + (iDebugTextCounter*0.02), 0.0>>, 0, 0, 0, 255)
|
|
iDebugTextCounter++
|
|
ENDIF
|
|
|
|
ENDIF
|
|
#ENDIF
|
|
ENDPROC
|
|
|
|
SCRIPT
|
|
|
|
IF HAS_FORCE_CLEANUP_OCCURRED()
|
|
Mission_Failed(mff_default)
|
|
ENDIF
|
|
|
|
SET_MISSION_FLAG(TRUE)
|
|
|
|
// Do everything to prepare the mission
|
|
Mission_Setup()
|
|
|
|
WHILE (TRUE)
|
|
|
|
REPLAY_CHECK_FOR_EVENT_THIS_FRAME("M_JewelStoreJobPrep2A")
|
|
|
|
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
|
|
Mission_Entity_Death_Checks() // Check if any of the mission critical entities (peds, vehicles, objects) are dead and fail accordingly
|
|
IF NOT b_DoSkip
|
|
Mission_Fail_Checks() // Mission scenario checks; fails, disables running at certain points, etc
|
|
UPDATE_MISSION_EVENTS(s_Events)
|
|
Stage_Flow() // process the mission flow
|
|
ENDIF
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.8)
|
|
|
|
WAIT(0)
|
|
|
|
ENDWHILE
|
|
|
|
ENDSCRIPT
|