// Functions only used when setting up an RC mission USING "rage_builtins.sch" USING "globals.sch" USING "RC_Helper_Functions.sch" USING "taxi_functions.sch" /// PURPOSE: /// Ends the cutscene request for this RC mission PROC END_RC_CUTSCENE_REQUEST(INT &iCutsceneRequestID) STOP_CUTSCENE() REMOVE_CUTSCENE() END_OFFMISSION_CUTSCENE_REQUEST(iCutsceneRequestID) ENDPROC /// PURPOSE: /// Used by the launcher to register a request to preload a cutscene and /// load/unload it when told to do so by the off-mission cutscene controller. /// PARAMS: /// iCutsceneRequestID - And INT to be used to store the cutscene request ID assigned by the cutscene controller. /// sCutsceneName - Name of RC intro cutscene. PROC MANAGE_PRELOADING_RC_CUTSCENE(INT &iCutsceneRequestID, STRING sCutsceneName, VECTOR vMissionCoords) IF IS_PLAYER_PLAYING(PLAYER_ID()) IF NOT IS_STRING_NULL_OR_EMPTY(sCutsceneName) // Clear cutscenes for switches IF g_OnMissionState = MISSION_TYPE_SWITCH // Clear any cutscene requests with controller. IF iCutsceneRequestID != NULL_OFFMISSION_CUTSCENE_REQUEST END_RC_CUTSCENE_REQUEST(iCutsceneRequestID) CPRINTLN(DEBUG_RANDOM_CHAR, GET_THIS_SCRIPT_NAME(), ": Cleaned up cutscene for character switch :", sCutsceneName) ENDIF // If the player has changed his component variations we have to request the cutscene again ELIF IS_PLAYER_CHANGING_CLOTHES() // Clear any cutscene requests with controller. IF iCutsceneRequestID != NULL_OFFMISSION_CUTSCENE_REQUEST END_RC_CUTSCENE_REQUEST(iCutsceneRequestID) CPRINTLN(DEBUG_RANDOM_CHAR, GET_THIS_SCRIPT_NAME(), ": Cleaned up cutscene early for player changing clothes :", sCutsceneName) ENDIF ELSE // No cutscenes have yet been requested IF iCutsceneRequestID = NULL_OFFMISSION_CUTSCENE_REQUEST // Player has entered cutscene streaming range for this RC mission IF GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(), vMissionCoords) <= DEFAULT_CUTSCENE_LOAD_DIST CPRINTLN(DEBUG_RANDOM_CHAR, GET_THIS_SCRIPT_NAME(), ": Requesting permission to preload intro cutscene :", sCutsceneName) REGISTER_OFFMISSION_CUTSCENE_REQUEST(iCutsceneRequestID, OCT_RC_MISSION) ENDIF ELSE // Handle cutscene actions SWITCH GET_OFFMISSION_CUTSCENE_REQURIED_ACTION(iCutsceneRequestID) CASE OCA_LOAD CPRINTLN(DEBUG_RANDOM_CHAR, GET_THIS_SCRIPT_NAME(), ": Started loading intro cutscene : ", sCutsceneName) IF ARE_STRINGS_EQUAL(sCutsceneName,"JOSH_1_INT_CONCAT") REQUEST_CUTSCENE_WITH_PLAYBACK_LIST(sCutsceneName, CS_SECTION_2|CS_SECTION_3|CS_SECTION_4) ELSE REQUEST_CUTSCENE(sCutsceneName) ENDIF // Disable SRL map pre-streaming for off-mission prestreamed cutscenes. Stops the world streaming // from being choked and allows us to run switch cams with the cutscenes in memory. CPRINTLN(DEBUG_RANDOM_CHAR, GET_THIS_SCRIPT_NAME(), ": Disabling SRL map pre-streaming for cutscene.") SET_SRL_FORCE_PRESTREAM(SRL_PRESTREAM_FORCE_OFF) SET_OFFMISSION_CUTSCENE_ACTIVE(iCutsceneRequestID, TRUE) BREAK CASE OCA_UNLOAD CPRINTLN(DEBUG_RANDOM_CHAR, GET_THIS_SCRIPT_NAME(), ": Asked to unload intro cutscene : ", sCutsceneName) STOP_CUTSCENE() REMOVE_CUTSCENE() CPRINTLN(DEBUG_RANDOM_CHAR, GET_THIS_SCRIPT_NAME(), ": Re-enabling SRL map pre-streaming for cutscenes as cutscene unloads.") SET_SRL_FORCE_PRESTREAM(SRL_PRESTREAM_DEFAULT) SET_OFFMISSION_CUTSCENE_ACTIVE(iCutsceneRequestID, FALSE) BREAK ENDSWITCH // Player has gone out of cutscene streaming range IF GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(), vMissionCoords) > DEFAULT_CUTSCENE_UNLOAD_DIST END_RC_CUTSCENE_REQUEST(iCutsceneRequestID) CPRINTLN(DEBUG_RANDOM_CHAR, GET_THIS_SCRIPT_NAME(), ": Cleaned up cutscene as out of range : ", sCutsceneName) ENDIF ENDIF ENDIF ENDIF ENDIF ENDPROC ENUM eCUTSCENE_SECTION_LOADING CSL_NULL, CSL_SECTION_ONE, CSL_SECTION_TWO ENDENUM /// PURPOSE: /// Used by the launcher to register a request to preload a multi scene cutscene and /// load/unload it when told to do so by the off-mission cutscene controller. /// This is designed for cutscenes with alternate starts, it loads the start for the side the player is closest to /// PARAMS: /// iCutsceneRequestID - An INT to be used to store the cutscene request ID assigned by the cutscene controller. /// eCutscenePartLoading - An enum that tracks what stages are currently loaded /// sCutsceneName - Name of RC intro cutscene. /// vSectionOne - A locate that is pretty much where the player starts for section one /// vSectionTwo - A locate that is pretty much where the player starts for section two PROC MANAGE_PRELOADING_RC_CONCAT_CUTSCENE(INT &iCutsceneRequestID, eCUTSCENE_SECTION_LOADING &eCutscenePartLoading, STRING sCutsceneName, VECTOR vMissionCoords, VECTOR vSectionOne, VECTOR vSectionTwo) IF IS_PLAYER_PLAYING(PLAYER_ID()) IF NOT IS_STRING_NULL_OR_EMPTY(sCutsceneName) // If the player has changed his component variations we have to request the cutscene again IF IS_PLAYER_CHANGING_CLOTHES() // Clear any cutscene requests with controller. IF iCutsceneRequestID != NULL_OFFMISSION_CUTSCENE_REQUEST END_RC_CUTSCENE_REQUEST(iCutsceneRequestID) CPRINTLN(DEBUG_RANDOM_CHAR, GET_THIS_SCRIPT_NAME(), ": Cleaned up cutscene early for player changing clothes :", sCutsceneName) ENDIF ELSE // No cutscenes have yet been requested IF iCutsceneRequestID = NULL_OFFMISSION_CUTSCENE_REQUEST // Player has entered cutscene streaming range for this RC mission IF GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(), vMissionCoords) <= DEFAULT_CUTSCENE_LOAD_DIST CPRINTLN(DEBUG_RANDOM_CHAR, GET_THIS_SCRIPT_NAME(), ": Requesting permission to preload intro cutscene :", sCutsceneName) REGISTER_OFFMISSION_CUTSCENE_REQUEST(iCutsceneRequestID, OCT_RC_MISSION) ENDIF ELSE IF GET_OFFMISSION_CUTSCENE_REQURIED_ACTION(iCutsceneRequestID) = OCA_UNLOAD CPRINTLN(DEBUG_RANDOM_CHAR, GET_THIS_SCRIPT_NAME(), ": Asked to unload intro cutscene ", sCutsceneName) STOP_CUTSCENE() REMOVE_CUTSCENE() SET_OFFMISSION_CUTSCENE_ACTIVE(iCutsceneRequestID, FALSE) ELSE FLOAT fDistPlayerSectionOne = GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(), vSectionOne) FLOAT fDistPlayerSectionTwo = GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(), vSectionTwo) FLOAT fDifference = fDistPlayerSectionOne - fDistPlayerSectionTwo IF fDifference < 0 fDifference *= -1 ENDIF // Don't load new cutscenes if the player is in the middle of the two locates IF fDifference > 0.5 IF fDistPlayerSectionOne < fDistPlayerSectionTwo IF eCutscenePartLoading <> CSL_SECTION_ONE CPRINTLN(DEBUG_MISSION, GET_THIS_SCRIPT_NAME(), ": Requesting permission to preload intro cutscene ", sCutsceneName, " parts one and three") REMOVE_CUTSCENE() REQUEST_CUTSCENE_WITH_PLAYBACK_LIST(sCutsceneName, CS_SECTION_1 | CS_SECTION_3) SET_OFFMISSION_CUTSCENE_ACTIVE(iCutsceneRequestID, TRUE) eCutscenePartLoading = CSL_SECTION_ONE ENDIF ELSE IF eCutscenePartLoading <> CSL_SECTION_TWO CPRINTLN(DEBUG_MISSION, GET_THIS_SCRIPT_NAME(), ": Requesting permission to preload intro cutscene ", sCutsceneName, " parts two and three") REMOVE_CUTSCENE() REQUEST_CUTSCENE_WITH_PLAYBACK_LIST(sCutsceneName, CS_SECTION_2 | CS_SECTION_3) SET_OFFMISSION_CUTSCENE_ACTIVE(iCutsceneRequestID, TRUE) eCutscenePartLoading = CSL_SECTION_TWO ENDIF ENDIF ENDIF ENDIF // Player has gone out of cutscene streaming range IF GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(), vMissionCoords) > DEFAULT_CUTSCENE_UNLOAD_DIST END_RC_CUTSCENE_REQUEST(iCutsceneRequestID) CPRINTLN(DEBUG_RANDOM_CHAR, GET_THIS_SCRIPT_NAME(), ": Cleaned up cutscene as out of range : ", sCutsceneName) ENDIF ENDIF ENDIF ENDIF ENDIF ENDPROC /// PURPOSE: /// Puts the player into an outift that they can use the trigger the mission specified /// PARAMS: /// RcMission - which mission the player is trying to launch PROC RC_UPDATE_PLAYER_OUTFIT(g_eRC_MissionIDs RcMission) IF IS_ENTITY_ALIVE(PLAYER_PED_ID()) SWITCH RcMission CASE RC_EPSILON_7 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P0_EPSILON, FALSE) BREAK CASE RC_EPSILON_8 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P0_EPSILON_WITH_MEDAL, FALSE) BREAK DEFAULT // other RCs don't need specific outfit BREAK ENDSWITCH ENDIF ENDPROC /// PURPOSE: /// Checks if the player is wearing the outfit required for this mission /// PARAMS: /// RcMission - which RC mission is the player doing? /// RETURNS: /// TRUE if the player is in the correct outfit, FALSE otherwise FUNC BOOL IS_PLAYER_IN_CORRECT_OUTFIT(g_eRC_MissionIDs RcMission) IF IS_ENTITY_ALIVE(PLAYER_PED_ID()) SWITCH RcMission CASE RC_EPSILON_7 IF IS_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P0_EPSILON) // Michael RETURN TRUE ENDIF BREAK CASE RC_EPSILON_8 IF IS_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P0_EPSILON) // Michael OR IS_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P0_EPSILON_WITH_MEDAL) // Michael RETURN TRUE ENDIF BREAK DEFAULT RETURN TRUE // no outfit required BREAK ENDSWITCH ENDIF RETURN FALSE // not wearing the correct outfit ENDFUNC /// PURPOSE: /// Checks individual component types to see if they are suitable for the activities in the specified /// Fanatic mission. /// NOTE: These component types are ignored /// COMP_TYPE_HAND, COMP_TYPE_HEAD, COMP_TYPE_DECL, COMP_TYPE_BERD, COMP_TYPE_TEETH /// COMP_TYPE_JBIB, COMP_TYPE_HAIR, COMP_TYPE_PROPGROUP (we do check individual props though) /// PARAMS: /// iFanaticMission - 1, or 2 (3 only uses the triathlon outfit currently) /// eComponent - the component type we are checking (COMP_TYPE_TORSO, COMP_TYPE_LEGS etc) /// RETURNS: /// TRUE if this component is suitable for the activity in this mission FUNC BOOL IS_COMPONENT_SUITABLE_FOR_FANATIC_MISSION(INT iFanaticMission, PED_COMP_TYPE_ENUM eComponentType) PED_COMP_NAME_ENUM eItem if eComponentType != COMP_TYPE_PROPS eItem = GET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), eComponentType) endif SWITCH iFanaticMission CASE 1 // Fanatic 1 = Michael running SWITCH eComponentType CASE COMP_TYPE_TORSO IF eItem = TORSO_P0_TRIATHLON OR (eItem >= TORSO_P0_V_NECK_0 AND eItem <= TORSO_P0_V_NECK_15) OR eItem = TORSO_P0_TRIATHLON OR (eItem >= TORSO_P0_GOLF AND eItem <= TORSO_P0_POLO_SHIRT_7) OR (eItem >= TORSO_P0_YOGA_0 AND eItem <= TORSO_P0_YOGA_5) OR (eItem >= TORSO_P0_HOODIE_0 AND eItem <= TORSO_P0_HOODIE_15) OR (eItem >= TORSO_P0_TENNIS AND eItem <= TORSO_P0_TENNIS_2) RETURN TRUE ENDIF BREAK CASE COMP_TYPE_LEGS IF eItem = LEGS_P0_TRIATHLON OR (eItem >= LEGS_P0_CARGO_SHORTS_0 AND eItem <= LEGS_P0_CARGO_SHORTS_4) OR (eItem >= LEGS_P0_TENNIS AND eItem <= LEGS_P0_TENNIS_2) OR (eItem >= LEGS_P0_LONG_SHORTS_0 AND eItem <= LEGS_P0_LONG_SHORTS_15) RETURN TRUE ENDIF BREAK CASE COMP_TYPE_FEET IF eItem = FEET_P0_1 OR eItem = FEET_P0_TRIATHLON OR eItem = FEET_P0_BED OR (eItem >= FEET_P0_SKATE_SHOES AND eItem <= FEET_P0_SKATE_SHOES_9) RETURN TRUE ENDIF BREAK CASE COMP_TYPE_SPECIAL IF eItem = SPECIAL_P0_NONE OR eItem = SPECIAL_P0_WATCH_AND_BRACELET OR eItem = SPECIAL_P0_STAR_TATTOOS OR eItem = SPECIAL_P0_WATCH_LEATHER_STRAP RETURN TRUE ENDIF BREAK CASE COMP_TYPE_SPECIAL2 IF eItem = SPECIAL2_P0_NONE RETURN TRUE ENDIF BREAK CASE COMP_TYPE_OUTFIT IF eItem = OUTFIT_P0_TRIATHLON OR eItem = OUTFIT_P0_TENNIS RETURN TRUE ENDIF BREAK CASE COMP_TYPE_PROPS eItem = GET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), eComponentType, ENUM_TO_INT(ANCHOR_EYES)) IF eItem = PROPS_P0_GLASSES OR (eItem >= PROPS_P0_GLASSES_DARK AND eItem <= PROPS_P0_GLASSES_DARK_9) OR eItem = PROPS_P0_SHADES_REFLECTIVE OR (eItem >= PROPS_P0_PROGRAMMER_GLASSES AND eItem <= PROPS_P0_PROGRAMMER_GLASSES_7) OR (eItem >= PROPS_P0_SHADES AND eItem <= PROPS_P0_SHADES_9) OR (eItem >= PROPS_P0_AVIATORS_0 AND eItem <= PROPS_P0_AVIATORS_11) OR (eItem >= PROPS_P0_GLASSES_THICK_RIM_0 AND eItem <= PROPS_P0_GLASSES_THICK_RIM_7) RETURN TRUE ENDIF // also return true if the player has no props equipped IF NOT DOES_PED_HAVE_ANY_PROPS_EQUIPPED(PLAYER_PED_ID()) RETURN TRUE ENDIF BREAK DEFAULT // other types are ignored, so return true RETURN TRUE BREAK ENDSWITCH BREAK CASE 2 // Fanatic 2 = Trevor cycling SWITCH eComponentType CASE COMP_TYPE_TORSO IF (eItem >= TORSO_P2_WHITE_TSHIRT AND eItem <= TORSO_P2_VNECK_15) OR (eItem >= TORSO_P2_TANK_TOP_0 AND eItem <= TORSO_P2_TANK_TOP_8) OR eItem = TORSO_P2_TRIATHLON OR (eItem >= TORSO_P2_GOLF AND eItem <= TORSO_P2_TSHIRT_15) OR (eItem >= TORSO_P2_STEALTH AND eItem <= TORSO_P2_HOODIE_15) OR eItem = TORSO_P2_TENNIS OR (eItem >= TORSO_P2_BOWLING_SHIRT AND eItem <= TORSO_P2_BOWLING_SHIRT_15) OR (eItem >= TORSO_P2_YELLOW_VEST AND eItem <= TORSO_P2_YELLOW_VEST_15) RETURN TRUE ENDIF BREAK CASE COMP_TYPE_LEGS IF eItem = LEGS_P2_TRIATHLON OR eItem = LEGS_P2_TENNIS OR (eItem >= LEGS_P2_BEACH AND eItem <= LEGS_P2_BEACH_7) OR eItem = LEGS_P2_SWEAT_PANTS RETURN TRUE ENDIF BREAK CASE COMP_TYPE_FEET IF eItem = FEET_P2_DUMMY OR eItem = FEET_P2_TRIATHLON OR eItem = FEET_P2_DUMMY_2 RETURN TRUE ENDIF BREAK CASE COMP_TYPE_SPECIAL IF eItem = SPECIAL_P2_WATCH OR eItem = SPECIAL_P2_WATCH_1 OR eItem = SPECIAL_P2_STAR_TATTOOS OR eItem = SPECIAL_P2_DUMMY RETURN TRUE ENDIF BREAK CASE COMP_TYPE_SPECIAL2 IF eItem = SPECIAL2_P2_NONE OR eItem = SPECIAL2_P2_DUMMY RETURN TRUE ENDIF BREAK CASE COMP_TYPE_OUTFIT IF eItem = OUTFIT_P2_TENNIS OR eItem = OUTFIT_P2_TRIATHLON RETURN TRUE ENDIF BREAK CASE COMP_TYPE_PROPS eItem = GET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), eComponentType, ENUM_TO_INT(ANCHOR_EYES)) IF eItem = PROPS_P2_SUNGLASSES OR (eItem >= PROPS_P2_SHADES_A_0 AND eItem <= PROPS_P2_SHADES_A_9) OR eItem = PROPS_P2_BIKE_GOGGLES OR (eItem >= PROPS_P2_SHADES_B_0 AND eItem <= PROPS_P2_SHADES_B_9) OR (eItem >= PROPS_P2_SUNGLASSES_B_0 AND eItem <= PROPS_P2_SUNGLASSES_B_9) OR (eItem >= PROPS_P2_SUNGLASSES_C_0 AND eItem <= PROPS_P2_SUNGLASSES_C_9) OR (eItem >= PROPS_P2_GLASSES AND eItem <= PROPS_P2_GLASSES_9) OR (eItem >= PROPS_P2_SQUARE_GLASSES_0 AND eItem <= PROPS_P2_SQUARE_GLASSES_9) RETURN TRUE ENDIF // also return true if the player has no props equipped IF NOT DOES_PED_HAVE_ANY_PROPS_EQUIPPED(PLAYER_PED_ID()) RETURN TRUE ENDIF BREAK DEFAULT // other types are ignored, so return true RETURN TRUE BREAK ENDSWITCH BREAK DEFAULT //shouldn't get here BREAK ENDSWITCH RETURN FALSE ENDFUNC /// PURPOSE: /// Checks if the player is wearing clothes suitable for the events in the Fanatic missions /// (Running, cycling + swimming) /// (assumes you have checked the ped is alive) /// PARAMS: /// iFanaticMission - 1, 2 or 3 /// RETURNS: /// TRUE if the player's outfit is suitable for the activities used in this mission FUNC BOOL IS_OUTFIT_SUITABLE_FOR_FANATIC_MISSION(INT iFanaticMission) INT iCompType SWITCH iFanaticMission CASE 1 // Fanatic 1 = Michael running CASE 2 // Fanatic 2 = Trevor cycling // check outfit 1st, if the outfit passes we don't need to check individual components IF IS_COMPONENT_SUITABLE_FOR_FANATIC_MISSION(iFanaticMission, COMP_TYPE_OUTFIT) RETURN TRUE ENDIF FOR iCompType = 0 TO NUMBER_OF_PED_COMP_TYPES IF iCompType <> ENUM_TO_INT(COMP_TYPE_OUTFIT) // outfits checked 1st (above) // check other items IF NOT IS_COMPONENT_SUITABLE_FOR_FANATIC_MISSION(iFanaticMission, INT_TO_ENUM(PED_COMP_TYPE_ENUM, iCompType)) CPRINTLN(DEBUG_MISSION, "IS_OUTFIT_SUITABLE_FOR_FANATIC_MISSION: Failed for compType: ", iCompType) RETURN FALSE ENDIF ENDIF ENDFOR // If we reach here, the player isn't wearing a suitable "outfit" // but all of the component items they are wearing are suitable RETURN TRUE BREAK CASE 3 // Fanatic 3 = Franklin doing a triathlon IF IS_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P1_TRIATHLON) RETURN TRUE // only the triathlon outfit is suitable for swimming, cycling and running combined ENDIF BREAK DEFAULT // shouldn't reach here BREAK ENDSWITCH RETURN FALSE ENDFUNC