//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_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_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_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, <>) ) 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, <>, 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