//Compile out Title Update changes to header functions. //Must be before includes. //CONST_INT USE_TU_CHANGES 0 // Removed by Kenneth R. ////////////////////////////////////////////////////////////////////////////////////////// // // // MISSION NAME : taxiService.sc // // AUTHOR : Ahron Mason // // DESCRIPTION : Handles player inside a taxi as a passenger // // // ////////////////////////////////////////////////////////////////////////////////////////// USING "rage_builtins.sch" USING "globals.sch" USING "cellphone_public.sch" USING "dialogue_public.sch" USING "taxi_functions.sch" USING "randomChar_public.sch" USING "mission_stat_public.sch" USING "properties_public.sch" //USING "rgeneral_include.sch" USING "website_public.sch" USING "minigame_public.sch" USING "vehicle_gen_public.sch" USING "mp_scaleform_functions.sch" USING "rgeneral_include.sch" //------------------------------------------------------------------------------------------------------------------------------------------------- // :ENUMS //------------------------------------------------------------------------------------------------------------------------------------------------- /// PURPOSE: main states for the script ENUM TAXI_SERVICE_STATE TAXI_SERVICE_STATE_NONE = 0, TAXI_SERVICE_STATE_PLAYER_IN_TAXI, TAXI_SERVICE_END, TAXI_SERVICE_METER_ONLY ENDENUM /// PURPOSE: states whilst in the back of the taxi during TAXI_SERVICE_STATE_PLAYER_IN_TAXI ENUM TAXI_JOURNEY_STATE TAXI_JOURNEY_STATE_CREATE_TAXI_METER, TAXI_JOURNEY_STATE_CHOOSE_LOCATION, TAXI_JOURNEY_STATE_DRIVING_TO_DESTINATION, TAXI_JOURNEY_STATE_ORDERED_TO_PULLOVER, TAXI_JOURNEY_STATE_SKIP_JOURNEY, TAXI_JOURNEY_STATE_ARRIVED_AT_DESTINATION ENDENUM /// PURPOSE: states during the skip taxi journey ENUM SKIP_JOURNEY_STATE SKIP_JOURNEY_STATE_FADE_OUT, SKIP_JOURNEY_STATE_FADED_OUT, SKIP_JOURNEY_STATE_WAIT_GEN_DESTINATION_INFO, SKIP_JOURNEY_STATE_MOVE_TAXI_TO_DESTINATION, SKIP_JOURNEY_STATE_SETUP_LOAD_SCENE, SKIP_JOURNEY_STATE_LOAD_SCENE_THEN_REQUEST_LEADIN, SKIP_JOURNEY_STATE_REQUEST_ASSETS_AT_DESTINATION, SKIP_JOURNEY_STATE_LOADING_ASSETS_AT_DESTINATION, SKIP_JOURNEY_STATE_FADE_IN, SKIP_JOURNEY_STATE_FADED_IN, SKIP_JOURNEY_STATE_SKIP_FINISHED ENDENUM /*ENUM TAXI_CLOSEST_TRIGGER_TYPE TAXI_CTT_SP_MISSION_TRIGGER, TAXI_CTT_RC_MISSION_TRIGGER, TAXI_CTT_INVALID_TRIGGER ENDENUM TAXI_CLOSEST_TRIGGER_TYPE eClosestTriggerType = TAXI_CTT_INVALID_TRIGGER*/ /// PURPOSE: states for generating safe destination ENUM TAXI_GENERATE_SAFE_DESTINATION_STATE TAXI_GSDS_INITIAL_TRIGGER_AREAS_CHECK, TAXI_GSDS_INITIAL_SPECIAL_AREA_CHECK, TAXI_GSDS_GENERATE_COORDS, TAXI_GSDS_TRIGGER_AREAS_RECHECK, TAXI_GSDS_SAFE_DESTINATION_FOUND, TAXI_GSDS_SAFE_DESTINATION_NOT_FOUND ENDENUM //------------------------------------------------------------------------------------------------------------------------------------------------- // :CONSTANTS //------------------------------------------------------------------------------------------------------------------------------------------------- CONST_FLOAT TAXI_LANE_OFFSET 4.2 // 4.5 CONST_FLOAT TAXI_SPEED_NORMAL 12.0 CONST_FLOAT TAXI_SPEED_FAST 25.0 CONST_FLOAT TAXI_TARGET_REACHED_DIST 45.0 CONST_FLOAT FARE_DISTANCE 50.0 CONST_FLOAT FARE_RATE 0.22 CONST_FLOAT FARE_SKIP_MULTIPLIER 2.4 CONST_INT ENTER_CAR_AS_PASSENGER_TIME 375 CONST_INT START_POSITION 0 CONST_INT MAX_NUMBER_OF_TAXI_DESTINATIONS 40 CONST_INT INITIAL_PRICE 0 CONST_INT STICK_DEAD_ZONE 28 CONST_INT TAXI_SERVICE_CHANGE_DEST_CAM_TIMEOUT 3000 // amount of time (milliseconds) bcfore we class a change destination attempt as ended //------------------------------------------------------------------------------------------------------------------------------------------------- // :VARIABLES //------------------------------------------------------------------------------------------------------------------------------------------------- BOOL bTaxiHasHitDestinationLocate BOOL bSkipJourneyLoadSceneStarted = FALSE BOOL bUpdateTaxiControls BOOL bSelectingAnotherDestination BOOL bDestinationSelected BOOL bDropPointSelected BOOL bStickInUseUp BOOL bStickInUseDown BOOL bHurrying BOOL bMadeItToDestination BOOL bPlayerCanLeaveVehicle BOOL bUsedFloorZ = FALSE //Used to add the extra check against incorrect floor Z coords CAMERA_INDEX camMeter // diff between two modes - standard uses DF_StopAtLights, Hurry uses DF_UseShortCutLinks // B*1380004 - added DF_StopForCars to hurry mode to make them stop for Trains DRIVINGMODE taxiDrivingModeStandard = DF_SteerAroundStationaryCars|DF_StopForPeds|DF_StopAtLights|DF_ChangeLanesAroundObstructions|DF_StopForCars|DF_ForceJoinInRoadDirection|DF_SteerAroundObjects|DF_UseSwitchedOffNodes|DF_AvoidRestrictedAreas|DF_UseWanderFallbackInsteadOfStraightLine DRIVINGMODE taxiDrivingModeHurry = DF_SwerveAroundAllCars|DF_StopForPeds|DF_ChangeLanesAroundObstructions|DF_StopForCars|DF_ForceJoinInRoadDirection|DF_SteerAroundObjects|DF_UseSwitchedOffNodes|DF_UseShortCutLinks|DF_AvoidRestrictedAreas|DF_UseWanderFallbackInsteadOfStraightLine enumCharacterList charWhenTaxiLaunched FLOAT fDropOffDistFromBlip FLOAT fFareRate = FARE_RATE FLOAT camMeterFOV = 50 FLOAT fMinYChange = -4 FLOAT fMaxYChange = 4 FLOAT fMinXChange = -89 FLOAT fMaxXChange = 89 FLOAT fTaxiCamSpeed = 4.0 FLOAT fTaxiCamChangeY FLOAT fTaxiCamChangeX FLOAT fFare = INITIAL_PRICE FLOAT fDistanceToDestination // Taxi meter UI variables NOTE: these variables have changed since last gen! FLOAT fTaxiMenu_ScaleSizeX = 0.4 FLOAT fTaxiMenu_ScaleSizeY = 0.6 FLOAT fTaxiMenu_ScaleCentreX = 0.201 FLOAT fTaxiMenu_ScaleCentreY = 0.351 INT iDesinationNodeSearchNumber INT iSkipJourneyTimer = 0 INT iTimer_WaitForGroupMembers = -1 INT iTotalNumberOfTaxiDestinations = 0 INT iCurrentHighlightedPosition = START_POSITION INT iRenderTarget INT iStoredCountedMissionLocations INT iStoredNumberOfBlips INT iStoredNumberOfOccupants INT iStoredTaxiWaypointBlipDestinationIndex INT iCountBlipsAddedToDestinationListThisFrame INT iDialogueTimer_BanterDuringJourney = 0 INT iDialogueTimer_ChangeRadio = 0 INT currentJourneyPrice = INITIAL_PRICE INT lastJourneyPrice INT iFareTimer INT iTimer_SelectingAnotherDestinationTimeOut g_eRC_MissionIDs eClosestRCMission = NO_RC_MISSION g_eRC_MissionIDs eRCMissionDestination = NO_RC_MISSION STRING instructButtonStored_changeDest = GET_CONTROL_INSTRUCTIONAL_BUTTONS_STRING(FRONTEND_CONTROL, INPUT_FRONTEND_AXIS_X) MODEL_NAMES modelMeter = Prop_TAXI_METER_2 OBJECT_INDEX objMeter PARK_TYPE parkTypeTaxiAtDestination = PARK_TYPE_PULL_OVER SCALEFORM_INDEX scaleformTaxiMeter SCALEFORM_INDEX scaleformTaxiControls SCALEFORM_INSTRUCTIONAL_BUTTONS instructionalButtons SEQUENCE_INDEX seqTaxi SPRITE_PLACEMENT aSpriteTaxiControls SP_MISSIONS eMissionAtBlip SP_MISSIONS eStoryMissionDestination = SP_MISSION_NONE STATIC_BLIP_NAME_ENUM eMinigameDestination = STATIC_BLIP_NAME_DUMMY_FINAL TAXI_DIALOGUE eTaxiDialogue = TAXI_DIALOGUE_NOTHING TAXI_DEST AllTaxiDestinations[MAX_NUMBER_OF_TAXI_DESTINATIONS] TAXI_GENERATE_SAFE_DESTINATION_STATE eGenerateSafeDestinationState = TAXI_GSDS_INITIAL_TRIGGER_AREAS_CHECK TAXI_JOURNEY_STATE eTaxiJourneyState = TAXI_JOURNEY_STATE_CREATE_TAXI_METER TAXI_SERVICE_STATE eTaxiServiceStage = TAXI_SERVICE_STATE_NONE SKIP_JOURNEY_STATE eSkipJourneyState = SKIP_JOURNEY_STATE_FADE_OUT TEXT_LABEL_31 tlAnimDictTaxiDriver = "oddjobs@taxi@driver" VECTOR vDestinationLocate VECTOR vPathNodeRequestMin = << 0.0, 0.0, 0.0 >> VECTOR vPathNodeRequestMax = << 0.0, 0.0, 0.0 >> VECTOR vOriginal VECTOR vLastFarePoint VECTOR vStoredTaxiWaypointBlipDestinationCoords VECTOR vTaxiCamOffset = << 0.0, -0.25, 0.55 >> VECTOR vTaxiCamFixedRotation = << -0.3, 1.0, 0.35 >> VECTOR vMeterOffset = <<-0.0100, 0.6000, 0.2400>> VECTOR vMeterRotation = << -5, 0, 0 >> VEHICLE_SEAT eStoredPlayerSeat //------------------------------------------------------------------------------------------------------------------------------------------------- // :DEBUG VARIABLES / FUNCS / PROCS / WIDGETS //------------------------------------------------------------------------------------------------------------------------------------------------- #IF IS_DEBUG_BUILD // Debug variables BLIP_INDEX blipDebug BLIP_INDEX blipDebugOriginal BOOL bDebug_OutputInfo BOOL bDebugLaunchMeterOnly BOOL bCleanupScript BOOL bResetMeterOffset BOOL bDebug_DisplayTaxiToPlayerPullInSpot BOOL bDebug_DisplayTaxiDropOffPosition BOOL bDebugDisplayPathNodeLoadArea BOOL bDebugLoadAllPathNodes BOOL bDebug_TestIsPositionInSpecialArea BOOL bDebugUnLoadAllPathNodes BOOL bDebugDrawSphereAroundActiveTaxi BOOL bDebugSetBreakOnNodeCommandsUsage BOOL bDebugPerformGetTaxiPullInSpotTest BOOL bDebug_UpdateTaxiCamOffsetAndRot = FALSE BOOL bAddBlipForDestination BOOL bDebugDrawAllTaxiPickupPositionInfo BOOL bDebug_DrawGetPullOverResults VECTOR vDebug_TempPickupPos VECTOR vDebug_TempDropOffPos VECTOR vDebug_DriveToNodePos BOOL bDebug_LaunchMeter = FALSE PROC DEBUG_DRAW_TAXI_PULL_OVER_INFO(VECTOR vParkCoords, VECTOR vOppositeSideCoords, VECTOR vNodeCoords) IF bDebug_DrawGetPullOverResults INT iTempTime = GET_GAME_TIMER() WHILE (GET_GAME_TIMER() - iTempTime) < 3000 SET_DEBUG_ACTIVE(TRUE) SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE) DRAW_DEBUG_SPHERE(vParkCoords, 2.5, 128, 255, 0, 150) // green DRAW_DEBUG_SPHERE(vOppositeSideCoords, 2.5, 255, 0, 0, 150) // red DRAW_DEBUG_SPHERE(vNodeCoords, 1.5, 178, 0, 255, 150) // purple CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : GET_TAXI_PULL_OVER_INFO() : bDebug_DrawGetPullOverResults this frame green = park, purple = node, red = opposite side ") WAIT(0) ENDWHILE ENDIF ENDPROC // debug print blip type PROC DEBUG_PRINT_BLIP_TYPE_TO_TTY(BLIP_INDEX &blipIndex) IF DOES_BLIP_EXIST(blipIndex) SWITCH GET_BLIP_INFO_ID_TYPE(blipIndex) CASE BLIPTYPE_UNUSED CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : DEBUG_PRINT_BLIP_TYPE_TO_TTY : BLIPTYPE_UNUSED") BREAK CASE BLIPTYPE_VEHICLE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : DEBUG_PRINT_BLIP_TYPE_TO_TTY : BLIPTYPE_VEHICLE") BREAK CASE BLIPTYPE_CHAR CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : DEBUG_PRINT_BLIP_TYPE_TO_TTY : BLIPTYPE_CHAR") BREAK CASE BLIPTYPE_OBJECT CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : DEBUG_PRINT_BLIP_TYPE_TO_TTY : BLIPTYPE_OBJECT") BREAK CASE BLIPTYPE_COORDS CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : DEBUG_PRINT_BLIP_TYPE_TO_TTY : BLIPTYPE_COORDS") BREAK CASE BLIPTYPE_CONTACT CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : DEBUG_PRINT_BLIP_TYPE_TO_TTY : BLIPTYPE_CONTACT") BREAK CASE BLIPTYPE_PICKUP CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : DEBUG_PRINT_BLIP_TYPE_TO_TTY : BLIPTYPE_PICKUP") BREAK CASE BLIPTYPE_RADIUS CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : DEBUG_PRINT_BLIP_TYPE_TO_TTY : BLIPTYPE_RADIUS") BREAK CASE BLIPTYPE_WEAPON_PICKUP CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : DEBUG_PRINT_BLIP_TYPE_TO_TTY : BLIPTYPE_WEAPON_PICKUP") BREAK CASE BLIPTYPE_COP CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : DEBUG_PRINT_BLIP_TYPE_TO_TTY : BLIPTYPE_COP") BREAK CASE BLIPTYPE_STEALTH CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : DEBUG_PRINT_BLIP_TYPE_TO_TTY : BLIPTYPE_STEALTH") BREAK CASE BLIPTYPE_AREA CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : DEBUG_PRINT_BLIP_TYPE_TO_TTY : BLIPTYPE_AREA") BREAK ENDSWITCH ENDIF ENDPROC #ENDIF /// PURPOSE: /// Checks if the entity exists and is not dead. /// PARAMS: /// mEntity - the entity we are checking. /// RETURNS: /// True if the entity exists and is not dead. FUNC BOOL IS_ENTITY_ALIVE(ENTITY_INDEX mEntity) IF DOES_ENTITY_EXIST(mEntity) IF NOT IS_ENTITY_DEAD(mEntity) RETURN TRUE ENDIF ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// Checks that the ped exists, is alive and is not injured /// PARAMS: /// mPed - the ped we are checking /// RETURNS: /// True if the ped exists, is alive and is not injured. false otherwise. FUNC BOOL IS_PED_UNINJURED(PED_INDEX mPed) IF DOES_ENTITY_EXIST(mPed) IF NOT IS_ENTITY_DEAD(mPed) IF NOT IS_PED_INJURED(mPed) RETURN TRUE ENDIF ENDIF ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// Checks that the vehicle exists, is alive, driveable and not on fire /// PARAMS: /// mVehicle - the vehicle we are checking /// RETURNS: /// True if the vehicle exists, is alive, driveable and not on fire. false otherwise. FUNC BOOL IS_VEHICLE_OK(VEHICLE_INDEX mVehicle) IF IS_ENTITY_ALIVE(mVehicle) IF IS_VEHICLE_DRIVEABLE(mVehicle) IF NOT IS_ENTITY_ON_FIRE(mVehicle) RETURN TRUE ENDIF ENDIF ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// check if iTimeAmount has passed since iTimer was set /// PARAMS: /// iTimer - the timer /// iTimeAmount - the amount of time to check has passed /// RETURNS: /// True is the specified amount of time has passed for the specified timer. FUNC BOOL HAS_TIME_PASSED(INT iTimer, INT iTimeAmount) RETURN (GET_GAME_TIMER() - iTimer) > iTimeAmount ENDFUNC /// PURPOSE: /// cleanup for the script /// PARAMS: /// bFadeInForSkipJourney - B* 1456271 - back up fade in if script terminated during a taxi skip - but needs to not happen if cleanup was for repeat play PROC TAXI_SERVICE_SCRIPT_CLEANUP(BOOL bFadeInForSkipJourney = TRUE) SET_CINEMATIC_BUTTON_ACTIVE(TRUE) IF IS_NAMED_RENDERTARGET_REGISTERED("taxi") RELEASE_NAMED_RENDERTARGET("taxi") ENDIF IF DOES_CAM_EXIST(camMeter) IF IS_CAM_ACTIVE(camMeter) SET_PARTICLE_FX_CAM_INSIDE_VEHICLE(FALSE) // B*1549323 - stops rain inside taxi ENDIF SET_CAM_ACTIVE(camMeter, FALSE) DESTROY_CAM(camMeter) RENDER_SCRIPT_CAMS(FALSE, FALSE) UNLOCK_MINIMAP_POSITION() UNLOCK_MINIMAP_ANGLE() SET_RADAR_ZOOM(0) ENDIF g_bTaxiShouldForcePhoneDislayOnHud = FALSE // reset global used for B*2053172 - force phone display on HUD IF DOES_ENTITY_EXIST(objMeter) DELETE_OBJECT(objMeter) SET_MODEL_AS_NO_LONGER_NEEDED(modelMeter) ENDIF SET_SCALEFORM_MOVIE_AS_NO_LONGER_NEEDED(scaleformTaxiMeter) SET_SCALEFORM_MOVIE_AS_NO_LONGER_NEEDED(scaleformTaxiControls) IF IS_PED_UNINJURED(g_WaitingTaxiDriver) IF IS_ENTITY_PLAYING_ANIM(g_WaitingTaxiDriver, tlAnimDictTaxiDriver, "leanover_enter") STOP_ENTITY_ANIM(g_WaitingTaxiDriver, "leanover_enter", tlAnimDictTaxiDriver, REALLY_SLOW_BLEND_OUT) ELIF IS_ENTITY_PLAYING_ANIM(g_WaitingTaxiDriver, tlAnimDictTaxiDriver, "leanover_idle") STOP_ENTITY_ANIM(g_WaitingTaxiDriver, "leanover_idle", tlAnimDictTaxiDriver, REALLY_SLOW_BLEND_OUT) ELIF IS_ENTITY_PLAYING_ANIM(g_WaitingTaxiDriver, tlAnimDictTaxiDriver, "leanover_exit") STOP_ENTITY_ANIM(g_WaitingTaxiDriver, "leanover_exit", tlAnimDictTaxiDriver, REALLY_SLOW_BLEND_OUT) ENDIF IF IS_PED_HEADTRACKING_PED(g_WaitingTaxiDriver, PLAYER_PED_ID()) TASK_CLEAR_LOOK_AT(g_WaitingTaxiDriver) ENDIF ENDIF REMOVE_ANIM_DICT(tlAnimDictTaxiDriver) // cleanup for script ending earlier during Skip Journey state IF eTaxiJourneyState = TAXI_JOURNEY_STATE_SKIP_JOURNEY IF eSkipJourneyState != SKIP_JOURNEY_STATE_SKIP_FINISHED // B*1582742 - ensure now load scene is binned off in cleanup IF bSkipJourneyLoadSceneStarted IF IS_NEW_LOAD_SCENE_ACTIVE() NEW_LOAD_SCENE_STOP() CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " TAXI_SERVICE_SCRIPT_CLEANUP() : NEW_LOAD_SCENE_STOP() called for active load scene ") ENDIF bSkipJourneyLoadSceneStarted = FALSE ENDIF DISABLE_CELLPHONE(FALSE) IF IS_AUDIO_SCENE_ACTIVE("FADE_OUT_WORLD_250MS_SCENE") STOP_AUDIO_SCENE("FADE_OUT_WORLD_250MS_SCENE") CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " TAXI_SERVICE_SCRIPT_CLEANUP() : stopped audio scene FADE_OUT_WORLD_250MS_SCENE") ENDIF IF DOES_ENTITY_EXIST(g_WaitingTaxi) IF IS_VEHICLE_DRIVEABLE(g_WaitingTaxi) SET_VEHICLE_RADIO_ENABLED(g_WaitingTaxi, TRUE) FREEZE_ENTITY_POSITION(g_WaitingTaxi, FALSE) ENDIF ENDIF // B* 1456271 - back up fade in if script terminated during a taxi skip - but needs to not happen if cleanup was for repeat play IF bFadeInForSkipJourney IF IS_SCREEN_FADED_OUT() OR IS_SCREEN_FADING_OUT() IF NOT IS_SCREEN_FADING_IN() // B* 1684211 - Don't fade the screen in if a replay has started processing mid journey skip. We can assume // the replay system will fade it in when it needs to. IF NOT IS_REPLAY_BEING_SET_UP() AND NOT IS_REPLAY_BEING_PROCESSED() AND g_replay.replayStageID != RS_ACTIVE DO_SCREEN_FADE_IN(250) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " TAXI_SERVICE_SCRIPT_CLEANUP() : faded screen in as detcted script terminate in skip journey state") ENDIF ENDIF ELSE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " TAXI_SERVICE_SCRIPT_CLEANUP() : fade up NOT done as faded in already") ENDIF ELSE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " TAXI_SERVICE_SCRIPT_CLEANUP() : fade up NOT done bFadeInForSkipJourney = FALSE") ENDIF ELSE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " TAXI_SERVICE_SCRIPT_CLEANUP() : fade up NOT done eSkipJourneyState = SKIP_JOURNEY_STATE_SKIP_FINISHED") ENDIF ELSE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " TAXI_SERVICE_SCRIPT_CLEANUP() : fade up NOT done as eTaxiJourneyState != TAXI_JOURNEY_STATE_SKIP_JOURNEY") ENDIF // always make sure player gets out taxi on cleanup unless he's driving IF NOT IS_PED_INJURED(PLAYER_PED_ID()) IF IS_VEHICLE_OK(g_WaitingTaxi) IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), g_WaitingTaxi, TRUE) IF GET_PED_IN_VEHICLE_SEAT(g_WaitingTaxi, VS_DRIVER) != PLAYER_PED_ID() IF NOT TAXI_IS_PED_PERFORMING_TASK(PLAYER_PED_ID(), SCRIPT_TASK_LEAVE_ANY_VEHICLE) AND NOT TAXI_IS_PED_PERFORMING_TASK(PLAYER_PED_ID(), SCRIPT_TASK_LEAVE_VEHICLE) TASK_LEAVE_ANY_VEHICLE(PLAYER_PED_ID()) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " TAXI_SERVICE_SCRIPT_CLEANUP() -> player tasked to leave g_WaitingTaxi") ENDIF ENDIF ENDIF ENDIF ENDIF CANCEL_GROUP_GETTING_INTO_CAB() CLEANUP_WAITING_TAXI() // handles release of g_WaitingTaxi and g_WaitingTaxiDriver g_iTaxiHailedTime = -1 g_bPlayerIsInTaxi = FALSE // B*1401225 - ensure this global is always reset to false when the script ends since it's used in various scripts include IS_IT_SAFE_TO_TRIGGER_SCRIPT_TYPE g_bRequestTaxiServiceCleanup = FALSE #IF IS_DEBUG_BUILD SET_DEBUG_ACTIVE(FALSE) SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(FALSE) #ENDIF CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " TAXI_SERVICE_SCRIPT_CLEANUP() : done about to terminate thread") TERMINATE_THIS_THREAD() ENDPROC /// PURPOSE: /// Request model and creates the taxi meter /// Requests the scaleform "taxi_display" and sets the render target /// Requests the scaleform "instructional_buttons" and waits for it to load /// Requests taxi driver's anim dictionary /// RETURNS: /// TRUE once taxi meter has been setup and all FUNC BOOL REQUEST_AND_LOAD_TAXI_ASSETS() REQUEST_MODEL(modelMeter) scaleformTaxiMeter = REQUEST_SCALEFORM_MOVIE("taxi_display") scaleformTaxiControls = REQUEST_SCALEFORM_MOVIE("instructional_buttons") REQUEST_ANIM_DICT(tlAnimDictTaxiDriver) IF HAS_MODEL_LOADED(modelMeter) AND HAS_SCALEFORM_MOVIE_LOADED(scaleformTaxiMeter) AND HAS_SCALEFORM_MOVIE_LOADED(scaleformTaxiControls) AND HAS_ANIM_DICT_LOADED(tlAnimDictTaxiDriver) RETURN TRUE ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// creates the taxi meter and sets the render target /// RETURNS: /// TRUE true when object exists FUNC BOOL CREATE_TAXI_METER() IF DOES_ENTITY_EXIST(objMeter) RETURN TRUE ENDIF IF DOES_ENTITY_EXIST(g_WaitingTaxi) IF IS_VEHICLE_DRIVEABLE(g_WaitingTaxi) objMeter = CREATE_OBJECT(modelMeter, GET_ENTITY_COORDS(g_WaitingTaxi)) ATTACH_ENTITY_TO_ENTITY(objMeter, g_WaitingTaxi, GET_ENTITY_BONE_INDEX_BY_NAME(g_WaitingTaxi, "Chassis"), vMeterOffset, vMeterRotation) SET_TAXI_LIGHTS(g_WaitingTaxi, FALSE) IF NOT IS_NAMED_RENDERTARGET_REGISTERED("taxi") REGISTER_NAMED_RENDERTARGET("taxi") LINK_NAMED_RENDERTARGET(GET_ENTITY_MODEL(objMeter)) ENDIF iRenderTarget = GET_NAMED_RENDERTARGET_RENDER_ID("taxi") CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : CREATE_TAXI_METER() object created") ENDIF ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// updates fDropOffDistFromBlip used to check player leaving pulled up taxi /// PARAMS: /// vDestinationCoord - the place the taxi is supposed to reach /// vPullOverCoord - the actual position the taxi pulled up PROC UPDATE_STORED_PULL_OVER_DIST_FROM_DESTINATION(VECTOR vDestinationCoord, VECTOR vPullOverCoord) VECTOR vDiff_Destination_To_ReturnNode vDiff_Destination_To_ReturnNode = vDestinationCoord - vPullOverCoord vDiff_Destination_To_ReturnNode.z = 0.0 fDropOffDistFromBlip = VMAG(vDiff_Destination_To_ReturnNode) ENDPROC /// PURPOSE: /// Check if the blip passed in is the waypoint blip. FUNC BOOL IS_BLIP_WAYPOINT_BLIP(BLIP_INDEX &blip) IF DOES_BLIP_EXIST(blip) AND GET_SPRITE_FOR_BLIP(blip) = GET_WAYPOINT_BLIP_ENUM_ID() CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : IS_BLIP_WAYPOINT_BLIP() : TRUE!") RETURN TRUE ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// get a valid position for the taxi to drive to - handles requesting the path nodes needed to navigate to the position /// PARAMS: /// vehIndexTaxi - handle to the taxi, used in obsured check /// vOriginCoord - coords pathing from /// DestinationCoord - coords wanting to reach /// vReturnCoord - /// fReturnHeading - /// iReturnedNodeNumber - return the node number of the last test, used to setup repeat checks /// iExtraLoadPathDist - /// RETURNS: /// FUNC BOOL GET_TAXI_PULL_IN_SPOT_NEAR_COORDS(VEHICLE_INDEX &vehIndexTaxi, VECTOR vOriginCoord, VECTOR DestinationCoord, VECTOR &vReturnCoord, FLOAT &fReturnHeading, INT &iReturnedNodeNumber, BLIP_INDEX &blipDestination, INT iExtraLoadPathDist = 1000) FLOAT zMeasureMult = 3 FLOAT fZ_Tolerance = 2.5 // B*1430520 VECTOR vec1, vNorth, vSouth ENTITY_INDEX entityPointObsuredCheck = NULL INT iNoOfLanes, iLanesNorth, iLanesSouth FLOAT offsetToKerb, centralReservationWidth FLOAT fTempZDiff VEHICLE_NODE_ID tempVehNodeID BOOL bFoundSuitableCoords = FALSE // always search switched off nodes, but if we are in the city ensure they aren't dead ends (stop taxi using driveways). NODE_FLAGS nodeFlags = NF_INCLUDE_SWITCHED_OFF_NODES IF NOT IS_POSITION_IN_ZONE_SAFE_FOR_DEADEND_NODES(DestinationCoord) nodeFlags = NF_INCLUDE_SWITCHED_OFF_NODES | NF_IGNORE_SWITCHED_OFF_DEADENDS CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ** GET_TAXI_PULL_IN_SPOT_NEAR_COORDS() : using node flags NF_INCLUDE_SWITCHED_OFF_NODES | NF_IGNORE_SWITCHED_OFF_DEADENDS") ENDIF BOOL bUsingSwitchedOffNodes = TRUE BOOL bIsOneDirectional BOOL bNodeIsSouth INT iMaxNodeLoopChecksPerFrame = iReturnedNodeNumber + 2 // limit to checks per frame INT iMaxNodeLoopChecksInTotal = 50 INT iPropertyFlags INT iDensity REQUEST_PATH_NODES_IN_AREA_FOR_TAXI_THIS_FRAME(vOriginCoord, DestinationCoord, vPathNodeRequestMin, vPathNodeRequestMax, iExtraLoadPathDist) IF ARE_REQUEST_PATH_NODES_LOADED_FOR_TAXI(vPathNodeRequestMin, vPathNodeRequestMax) // 10 chances to get a valid node otherwise bail out WHILE (NOT bFoundSuitableCoords AND (iReturnedNodeNumber < iMaxNodeLoopChecksPerFrame)) IF DestinationCoord.z = 1 CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ** GET_TAXI_PULL_IN_SPOT_NEAR_COORDS() : zMeasureMult = 0") zMeasureMult = 0 ENDIF IF GET_NTH_CLOSEST_VEHICLE_NODE_WITH_HEADING(DestinationCoord, iReturnedNodeNumber, vReturnCoord, fReturnHeading, iNoOfLanes, nodeFlags, zMeasureMult, fZ_Tolerance) tempVehNodeID = GET_NTH_CLOSEST_VEHICLE_NODE_ID(vReturnCoord, 1, nodeFlags) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ** GET_NTH_CLOSEST_VEHICLE_NODE_WITH_HEADING() : DestinationCoord = ", DestinationCoord, " ReturnNodeCoord = ", vReturnCoord, " fReturnHeading = ", fReturnHeading, " iNoOfLanes = ", iNoOfLanes, " zMeasureMult = ", zMeasureMult, " fZ_Tolerance = ", fZ_Tolerance, " iCurrentNodeNumber = ", iReturnedNodeNumber) IF IS_VEHICLE_NODE_ID_VALID(tempVehNodeID) // grab road info needed to workout the curb offset IF GET_CLOSEST_ROAD(vReturnCoord, 1, 1, vSouth, vNorth, iLanesSouth, iLanesNorth, centralReservationWidth, bUsingSwitchedOffNodes) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ** GET_CLOSEST_ROAD : vSouth = ", vSouth, " vNorth = ", vNorth, " iLanesSouth = ", iLanesSouth, " iLanesNorth = ", iLanesNorth, " centralReservationWidth = ", centralReservationWidth) // taken from net nodes.sch apparently number of lanes south / north' they were opposite so results are flipped IF (fReturnHeading < 90.0) OR (fReturnHeading >= 270.0) bNodeIsSouth = TRUE //CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ** node heading facing North ...temp south") ELSE bNodeIsSouth = FALSE //CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ** node heading facing South ...temp North") ENDIF bIsOneDirectional = FALSE IF (bNodeIsSouth) IF (iNoOfLanes = iLanesSouth) bIsOneDirectional = TRUE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ** South road is one directional") ELSE //CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ** South road is NOT one directional") ENDIF ELSE IF (iNoOfLanes = iLanesNorth) bIsOneDirectional = TRUE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ** North road is NOT one directional") ELSE //CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ** North road is NOT one directional") ENDIF ENDIF IF centralReservationWidth < 0 offsetToKerb = 0 ELSE IF GET_VEHICLE_NODE_IS_SWITCHED_OFF(tempVehNodeID) OR NOT GET_VEHICLE_NODE_IS_GPS_ALLOWED(tempVehNodeID) offsetToKerb = 0 CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ** offsetToKerb set : ", offsetToKerb, " : for switched off node / no gps") ELSE IF (bNodeIsSouth) IF (bIsOneDirectional) offsetToKerb = (TAXI_LANE_OFFSET*(TO_FLOAT(iLanesSouth)*0.5)) ELSE offsetToKerb = (TAXI_LANE_OFFSET*(TO_FLOAT(iLanesSouth))) ENDIF // additional offset for more than 1 lane IF (bIsOneDirectional) IF (iLanesSouth > 2) offsetToKerb += ((iLanesSouth-2) * 1.0) ENDIF ELSE IF (iLanesSouth > 1) offsetToKerb += ((iLanesSouth-1) * 1.0) ENDIF ENDIF ELSE IF (bIsOneDirectional) offsetToKerb = (TAXI_LANE_OFFSET*(TO_FLOAT(iLanesNorth)*0.5)) ELSE offsetToKerb = (TAXI_LANE_OFFSET*(TO_FLOAT(iLanesNorth))) ENDIF // additional offset for more than 1 lane IF (bIsOneDirectional) IF (iLanesNorth > 2) offsetToKerb += ((iLanesNorth-2) * 1.0) ENDIF ELSE IF (iLanesNorth > 1) offsetToKerb += ((iLanesNorth-1) * 1.0) ENDIF ENDIF ENDIF // overrides IF GET_VEHICLE_NODE_PROPERTIES(vReturnCoord, iDensity, iPropertyFlags) // if it is a highway node apply the central reservation IF NOT ((iPropertyFlags & ENUM_TO_INT(VNP_HIGHWAY)) = 0) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ** GET_VEHICLE_NODE_PROPERTIES : VNP_HIGHWAY - applying central reservation") offsetToKerb += (0.9 * centralReservationWidth) ENDIF // if its on a non-big vehicle road reduce by 0.5 IF NOT ((iPropertyFlags & ENUM_TO_INT(VNP_NO_BIG_VEHICLES)) = 0) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ** GET_VEHICLE_NODE_PROPERTIES : VNP_NO_BIG_VEHICLES - offsetToKerb reduced by 0.7") offsetToKerb += -0.7 ENDIF ELSE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ** GET_VEHICLE_NODE_PROPERTIES failed!") ENDIF ENDIF ENDIF CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ** final offsetToKerb = ", offsetToKerb) /*IF (VDIST(GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(vReturnCoord, fReturnHeading, <> ), DestinationCoord) > VDIST(GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(vReturnCoord, fReturnHeading, <<-offsetToKerb,0,0>> ), DestinationCoord)) offsetToKerb = -offsetToKerb CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : reversed kerb offset! offsetToKerb = ", offsetToKerb) ENDIF*/ // map waypoints always set vector z value to 1 so in this instance ignore the height check //IF DestinationCoord.z = 1 // DestinationCoord.z = vReturnCoord.z // CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : GET_TAXI_PULL_IN_SPOT_NEAR_COORDS() : DestinationCoord.z = 1 so forced to use vReturnCoord.z = ", DestinationCoord.z) //ENDIF // Bug fix B*1245895 - check was returning FALSE for coords with same/similar Z value fTempZDiff = DestinationCoord.z - vReturnCoord.z IF fTempZDiff < 0.0 fTempZDiff *= -1.0 ENDIF IF IS_COORD_ON_SAME_LEVEL_AS_COORD(DestinationCoord, vReturnCoord) OR (fTempZDiff < 0.5) // Bug fix B*1245895 - check was returning FALSE for coords with same/similar Z value OR IS_BLIP_WAYPOINT_BLIP(blipDestination) // Bug fix url:bugstar:6541981 - [SP] Extreme 4 - Player was seen falling from the sky after travelling to Dom's blip at Land act Reservoir via cab. vReturnCoord = GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(vReturnCoord, fReturnHeading, <>) IF IS_VEHICLE_DRIVEABLE(vehIndexTaxi) entityPointObsuredCheck = vehIndexTaxi ENDIF //check the position isn't obsured IF NOT IS_POINT_OBSCURED_BY_A_MISSION_ENTITY(vReturnCoord, <<3,3,3>>, entityPointObsuredCheck) #IF IS_DEBUG_BUILD // Spoke with JMart the taxi pathfinding doesn't actually care about GPS being allowed so don't fail the search for GPS not be allowed IF NOT GET_VEHICLE_NODE_IS_GPS_ALLOWED(tempVehNodeID) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : GET_TAXI_PULL_IN_SPOT_NEAR_COORDS() : node GPS not allowed") ENDIF // Since we are now using switched off nodes in the searrch don't fail the search for the selected node being switched off IF NOT GET_VEHICLE_NODE_IS_SWITCHED_OFF(tempVehNodeID) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : GET_TAXI_PULL_IN_SPOT_NEAR_COORDS() : node is switched off") ENDIF #ENDIF // B*1383513 - need to test the generated spawn point isn't inside a special area IF ARE_COORDS_IN_SPECIAL_AREA(vReturnCoord, vReturnCoord, fReturnHeading) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : GET_TAXI_PULL_IN_SPOT_NEAR_COORDS() : secondary ARE_COORDS_IN_SPECIAL_AREA() check return TRUE, updated : ", " vReturnCoord = ", vReturnCoord, " fReturnHeading = ", fReturnHeading) ENDIF bFoundSuitableCoords = TRUE ELSE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : GET_TAXI_PULL_IN_SPOT_NEAR_COORDS() : IS_POINT_OBSCURED_BY_A_MISSION_ENTITY() return TRUE, bFoundSuitableNode = FALSE") ENDIF ELSE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : GET_TAXI_PULL_IN_SPOT_NEAR_COORDS() : IS_COORD_ON_SAME_LEVEL_AS_COORD return FALSE") ENDIF ELSE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : GET_TAXI_PULL_IN_SPOT_NEAR_COORDS() : GET_CLOSEST_ROAD return FALSE") ENDIF ELSE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : GET_TAXI_PULL_IN_SPOT_NEAR_COORDS() : IS_VEHICLE_NODE_ID_VALID return FALSE") ENDIF ELSE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : GET_TAXI_PULL_IN_SPOT_NEAR_COORDS() : GET_NTH_CLOSEST_VEHICLE_NODE_WITH_HEADING return FALSE so iDesinationNodeSearchNumber++") ENDIF iReturnedNodeNumber++ // fail safe, don't test past iMaxNodeLoopChecksInTotal IF (iReturnedNodeNumber >= iMaxNodeLoopChecksInTotal) // don't search past this amount) vReturnCoord = DestinationCoord CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " ****** : GET_TAXI_PULL_IN_SPOT_NEAR_COORDS() : iReturnedNodeNumber = ", iReturnedNodeNumber, " reached max check amount! bFoundSuitableCoords forced TRUE", " vReturnCoord = ", vReturnCoord, " just using DestinationCoord, FC = ", GET_FRAME_COUNT()) // B*2027407 - if node generating fails and we fall back to the blip's position ensure for custom waypoint blips we update the Z (since these are always 1.0 which is underground) IF vReturnCoord.z = 1.0 fTempZDiff = 1.0 fTempZDiff = GET_APPROX_FLOOR_FOR_AREA((vReturnCoord.x - 2.0), (vReturnCoord.y - 2.0), (vReturnCoord.x + 2.0), (vReturnCoord.y + 2.0)) // found valid Z height IF fTempZDiff > 1.0 bUsedFloorZ = TRUE vReturnCoord.z = fTempZDiff vReturnCoord.z += 0.5 // additional leeway - if we skip it will use SET_VEHICLE_ON_GROUND_PROPERLY() CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " ****** : GET_TAXI_PULL_IN_SPOT_NEAR_COORDS() : updated Z for custom waypoint position using approx floor check fTempZDiff : ", fTempZDiff, " vReturnCoord.z += 5.0 : ", vReturnCoord.z) ELSE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " ****** : GET_TAXI_PULL_IN_SPOT_NEAR_COORDS() : FAILED update Z for custom waypoint position using approx floor check") ENDIF ELSE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " ****** : GET_TAXI_PULL_IN_SPOT_NEAR_COORDS() : vReturnCoord.z != 1 so skipping Z value update") ENDIF bFoundSuitableCoords = TRUE ELSE // debug print to show reached frame loop limit #IF IS_DEBUG_BUILD IF (iReturnedNodeNumber >= iMaxNodeLoopChecksPerFrame) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " ****** : GET_TAXI_PULL_IN_SPOT_NEAR_COORDS() : iReturnedNodeNumber = ", iReturnedNodeNumber, " reached max loop check amount ", iMaxNodeLoopChecksPerFrame, " this frame FC = ", GET_FRAME_COUNT()) ENDIF #ENDIF ENDIF ENDWHILE IF bFoundSuitableCoords vec1 = DestinationCoord - vReturnCoord vec1.z = 0.0 fDropOffDistFromBlip = VMAG(vec1) IF fDropOffDistFromBlip <> 0 // For compiler ENDIF CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : GET_TAXI_PULL_IN_SPOT_NEAR_COORDS() : returning TRUE for vReturnCoord = ", vReturnCoord, " fReturnHeading = ", fReturnHeading, " fDropOffDistFromBlip = ", fDropOffDistFromBlip, " iReturnedNodeNumber = ", iReturnedNodeNumber) RETURN TRUE ELSE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : GET_TAXI_PULL_IN_SPOT_NEAR_COORDS() : returning FALSE") ENDIF ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// return the SP_MISSION for the specified blip if it's active /// NOTE: doesn't check the blip is valid /// RETURNS: /// TRUE if blip is active SP_MISSION #IF USE_CLF_DLC FUNC SP_MISSIONS GET_BLIPS_ACTIVE_STORY_MISSION_CLF(BLIP_INDEX &blipIndex) INT iTriggerIndex REPEAT MAX_MISSION_TRIGGERS_TU iTriggerIndex IF g_TriggerableMissionsTU[iTriggerIndex].bUsed // B*1538996 - array overrun safeguard - inactive blips are being set to STATIC_BLIP_NAME_DUMMY_FINAL which happens to be max array size IF g_TriggerableMissionsTU[iTriggerIndex].eBlip != STATIC_BLIP_NAME_DUMMY_FINAL IF DOES_BLIP_EXIST(g_GameBlips[g_TriggerableMissionsTU[iTriggerIndex].eBlip].biBlip) IF g_GameBlips[g_TriggerableMissionsTU[iTriggerIndex].eBlip].biBlip = blipIndex CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : GET_BLIPS_ACTIVE_STORY_MISSION_CLF return :", g_TriggerableMissionsTU[iTriggerIndex].eMissionID) RETURN g_TriggerableMissionsTU[iTriggerIndex].eMissionID ENDIF ENDIF ENDIF ENDIF ENDREPEAT RETURN SP_MISSION_NONE ENDFUNC #ENDIF #IF USE_NRM_DLC FUNC SP_MISSIONS GET_BLIPS_ACTIVE_STORY_MISSION_NRM(BLIP_INDEX &blipIndex) INT iTriggerIndex REPEAT MAX_MISSION_TRIGGERS_TU iTriggerIndex IF g_TriggerableMissionsTU[iTriggerIndex].bUsed // B*1538996 - array overrun safeguard - inactive blips are being set to STATIC_BLIP_NAME_DUMMY_FINAL which happens to be max array size IF g_TriggerableMissionsTU[iTriggerIndex].eBlip != STATIC_BLIP_NAME_DUMMY_FINAL IF DOES_BLIP_EXIST(g_GameBlips[g_TriggerableMissionsTU[iTriggerIndex].eBlip].biBlip) IF g_GameBlips[g_TriggerableMissionsTU[iTriggerIndex].eBlip].biBlip = blipIndex CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : GET_BLIPS_ACTIVE_STORY_MISSION_NRM return :", g_TriggerableMissionsTU[iTriggerIndex].eMissionID) RETURN g_TriggerableMissionsTU[iTriggerIndex].eMissionID ENDIF ENDIF ENDIF ENDIF ENDREPEAT RETURN SP_MISSION_NONE ENDFUNC #ENDIF FUNC SP_MISSIONS GET_BLIPS_ACTIVE_STORY_MISSION(BLIP_INDEX &blipIndex) #IF USE_CLF_DLC RETURN SP_MISSIONS GET_BLIPS_ACTIVE_STORY_MISSION_CLF(blipIndex) #ENDIF #IF USE_NRM_DLC RETURN SP_MISSIONS GET_BLIPS_ACTIVE_STORY_MISSION_CLF(blipIndex) #ENDIF #IF NOT USE_CLF_DLC #IF NOT USE_NRM_DLC INT iTriggerIndex REPEAT MAX_MISSION_TRIGGERS iTriggerIndex IF g_TriggerableMissions[iTriggerIndex].bUsed // B*1538996 - array overrun safeguard - inactive blips are being set to STATIC_BLIP_NAME_DUMMY_FINAL which happens to be max array size IF g_TriggerableMissions[iTriggerIndex].eBlip != STATIC_BLIP_NAME_DUMMY_FINAL IF DOES_BLIP_EXIST(g_GameBlips[g_TriggerableMissions[iTriggerIndex].eBlip].biBlip) IF g_GameBlips[g_TriggerableMissions[iTriggerIndex].eBlip].biBlip = blipIndex CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : GET_BLIPS_ACTIVE_STORY_MISSION return :", g_TriggerableMissions[iTriggerIndex].eMissionID) RETURN g_TriggerableMissions[iTriggerIndex].eMissionID ENDIF ENDIF ENDIF ENDIF ENDREPEAT RETURN SP_MISSION_NONE #ENDIF #ENDIF ENDFUNC /// PURPOSE: /// get the cloest active story mission to the vTestCoords /// PARAMS: /// vTestCoords - position to check from /// ReturnMission - the returned closest mission else SP_MISSION_NONE /// fReturnDistance - the returned distance of the closest active mission /// RETURNS: /// If unable to find mission SP_MISSION_NONE will return, else valid SP_MISSIONS #IF USE_CLF_DLC FUNC BOOL GET_CLOSEST_ACTIVE_STORY_MISSION_CLF(VECTOR &vTestCoords, SP_MISSIONS &eReturnMission, FLOAT &fReturnDistance) INT iClosestMission = -1 FLOAT fClosestDist = 999999 FLOAT fDist VECTOR vTemp INT iTriggerIndex REPEAT MAX_MISSION_TRIGGERS_TU iTriggerIndex IF g_TriggerableMissionsTU[iTriggerIndex].bUsed // B*1538996 - array overrun safeguard - inactive blips are being set to STATIC_BLIP_NAME_DUMMY_FINAL which happens to be max array size IF g_TriggerableMissionsTU[iTriggerIndex].eBlip != STATIC_BLIP_NAME_DUMMY_FINAL IF DOES_BLIP_EXIST(g_GameBlips[g_TriggerableMissionsTU[iTriggerIndex].eBlip].biBlip) // custom waypoints z height always gets set to 1.0 so make even playing field for these dist checks otherwise they won't work vTemp = GET_BLIP_COORDS(g_GameBlips[g_TriggerableMissionsTU[iTriggerIndex].eBlip].biBlip) IF vTestCoords.z = 1.0 vTemp.z = 1.0 CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : GET_CLOSEST_ACTIVE_STORY_MISSION_CLF updated mission coord Z for waypoint check : ", vTemp) ENDIF fDist = VDIST(vTestCoords, vTemp) IF fDist < fClosestDist IF fDist < g_TriggerableMissionsTU[iTriggerIndex].sScene.fLoadDistance fClosestDist = fDist iClosestMission = iTriggerIndex CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : GET_CLOSEST_ACTIVE_STORY_MISSION_CLF updated iClosestMission = ", iClosestMission) ENDIF ENDIF ENDIF ENDIF ENDIF ENDREPEAT IF iClosestMission != -1 fReturnDistance = fClosestDist eReturnMission = g_TriggerableMissionsTU[iClosestMission].eMissionID CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : GET_CLOSEST_ACTIVE_STORY_MISSION_CLF return TRUE valid mission found eReturnMission : ", eReturnMission) RETURN TRUE ENDIF eReturnMission = SP_MISSION_NONE fReturnDistance = 999999 CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : GET_CLOSEST_ACTIVE_STORY_MISSION_CLF return FALSE no valid mission found eReturnMission : ", eReturnMission) RETURN FALSE ENDFUNC #ENDIF #IF USE_NRM_DLC FUNC BOOL GET_CLOSEST_ACTIVE_STORY_MISSION_NRM(VECTOR &vTestCoords, SP_MISSIONS &eReturnMission, FLOAT &fReturnDistance) INT iClosestMission = -1 FLOAT fClosestDist = 999999 FLOAT fDist VECTOR vTemp INT iTriggerIndex REPEAT MAX_MISSION_TRIGGERS_TU iTriggerIndex IF g_TriggerableMissionsTU[iTriggerIndex].bUsed // B*1538996 - array overrun safeguard - inactive blips are being set to STATIC_BLIP_NAME_DUMMY_FINAL which happens to be max array size IF g_TriggerableMissionsTU[iTriggerIndex].eBlip != STATIC_BLIP_NAME_DUMMY_FINAL IF DOES_BLIP_EXIST(g_GameBlips[g_TriggerableMissionsTU[iTriggerIndex].eBlip].biBlip) // custom waypoints z height always gets set to 1.0 so make even playing field for these dist checks otherwise they won't work vTemp = GET_BLIP_COORDS(g_GameBlips[g_TriggerableMissionsTU[iTriggerIndex].eBlip].biBlip) IF vTestCoords.z = 1.0 vTemp.z = 1.0 CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : GET_CLOSEST_ACTIVE_STORY_MISSION_NRM updated mission coord Z for waypoint check : ", vTemp) ENDIF fDist = VDIST(vTestCoords, vTemp) IF fDist < fClosestDist IF fDist < g_TriggerableMissionsTU[iTriggerIndex].sScene.fLoadDistance fClosestDist = fDist iClosestMission = iTriggerIndex CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : GET_CLOSEST_ACTIVE_STORY_MISSION_NRM updated iClosestMission = ", iClosestMission) ENDIF ENDIF ENDIF ENDIF ENDIF ENDREPEAT IF iClosestMission != -1 fReturnDistance = fClosestDist eReturnMission = g_TriggerableMissionsTU[iClosestMission].eMissionID CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : GET_CLOSEST_ACTIVE_STORY_MISSION_NRM return TRUE valid mission found eReturnMission : ", eReturnMission) RETURN TRUE ENDIF eReturnMission = SP_MISSION_NONE fReturnDistance = 999999 CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : GET_CLOSEST_ACTIVE_STORY_MISSION_NRM return FALSE no valid mission found eReturnMission : ", eReturnMission) RETURN FALSE ENDFUNC #ENDIF FUNC BOOL GET_CLOSEST_ACTIVE_STORY_MISSION(VECTOR &vTestCoords, SP_MISSIONS &eReturnMission, FLOAT &fReturnDistance) #IF USE_CLF_DLC RETURN GET_CLOSEST_ACTIVE_STORY_MISSION_CLF(vTestCoords, eReturnMission, fReturnDistance) #ENDIF #IF USE_NRM_DLC RETURN GET_CLOSEST_ACTIVE_STORY_MISSION_NRM(vTestCoords, eReturnMission, fReturnDistance) #ENDIF #IF NOT USE_CLF_DLC #IF NOT USE_NRM_DLC INT iClosestMission = -1 FLOAT fClosestDist = 999999 FLOAT fDist VECTOR vTemp INT iTriggerIndex REPEAT MAX_MISSION_TRIGGERS iTriggerIndex IF g_TriggerableMissions[iTriggerIndex].bUsed // B*1538996 - array overrun safeguard - inactive blips are being set to STATIC_BLIP_NAME_DUMMY_FINAL which happens to be max array size IF g_TriggerableMissions[iTriggerIndex].eBlip != STATIC_BLIP_NAME_DUMMY_FINAL IF DOES_BLIP_EXIST(g_GameBlips[g_TriggerableMissions[iTriggerIndex].eBlip].biBlip) // custom waypoints z height always gets set to 1.0 so make even playing field for these dist checks otherwise they won't work vTemp = GET_BLIP_COORDS(g_GameBlips[g_TriggerableMissions[iTriggerIndex].eBlip].biBlip) IF vTestCoords.z = 1.0 vTemp.z = 1.0 CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : GET_CLOSEST_ACTIVE_STORY_MISSION updated mission coord Z for waypoint check : ", vTemp) ENDIF fDist = VDIST(vTestCoords, vTemp) IF fDist < fClosestDist IF fDist < g_TriggerableMissions[iTriggerIndex].sScene.fLoadDistance fClosestDist = fDist iClosestMission = iTriggerIndex CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : GET_CLOSEST_ACTIVE_STORY_MISSION updated iClosestMission = ", iClosestMission) ENDIF ENDIF ENDIF ENDIF ENDIF ENDREPEAT IF iClosestMission != -1 fReturnDistance = fClosestDist eReturnMission = g_TriggerableMissions[iClosestMission].eMissionID CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : GET_CLOSEST_ACTIVE_STORY_MISSION return TRUE valid mission found eReturnMission : ", eReturnMission) RETURN TRUE ENDIF eReturnMission = SP_MISSION_NONE fReturnDistance = 999999 CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : GET_CLOSEST_ACTIVE_STORY_MISSION return FALSE no valid mission found eReturnMission : ", eReturnMission) RETURN FALSE #ENDIF #ENDIF ENDFUNC FUNC EnumCharacterList Get_Player_Director_Mode_Compatible() IF IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_DIRECTOR) //the player enum isn't returned correctly in Director mode, so we go for an explicit model check. IF NOT IS_ENTITY_DEAD (PLAYER_PED_ID()) IF GET_ENTITY_MODEL(PLAYER_PED_ID()) = g_savedGlobals.sCharSheetData.g_CharacterSheet[CHAR_MICHAEL].game_model //Check the explicit model from the character sheet. RETURN CHAR_MICHAEL ELIF GET_ENTITY_MODEL(PLAYER_PED_ID()) = g_savedGlobals.sCharSheetData.g_CharacterSheet[CHAR_FRANKLIN].game_model RETURN CHAR_FRANKLIN ELIF GET_ENTITY_MODEL(PLAYER_PED_ID()) = g_savedGlobals.sCharSheetData.g_CharacterSheet[CHAR_TREVOR].game_model RETURN CHAR_TREVOR ELSE RETURN CHAR_MULTIPLAYER //Default to Multiplayer phone as a failsafe. PI_Menu doesn't look to be checking for anyone outwith the standard three SP playable flow characters. ENDIF ELSE RETURN CHAR_MULTIPLAYER ENDIF ELSE //Not in Director Mode, safe to just go ahead with the standard player enum retrieval process. RETURN GET_CURRENT_PLAYER_PED_ENUM() ENDIF ENDFUNC /// PURPOSE: /// get the cloest active story mission to the vTestCoords /// PARAMS: /// vTestCoords - position to check from /// eReturnRCM - the returned closest RCM else NO_RC_MISSION /// fReturnDistance - the returned distance of the closest active mission /// RETURNS: /// If unable to find mission SP_MISSION_NONE will return, else valid SP_MISSIONS FUNC BOOL GET_CLOSEST_ACTIVE_RC_MISSION(VECTOR &vTestCoords, g_eRC_MissionIDs &eReturnRCM, FLOAT &fReturnDistance) INT iClosestRCM = -1 FLOAT fClosestDist = 999999 FLOAT fDist VECTOR vTemp INT iIndex = 0 g_structRCMissionsStatic sRCMissionDetails REPEAT MAX_RC_MISSIONS iIndex eReturnRCM = INT_TO_ENUM(g_eRC_MissionIDs, iIndex) // RC mission is ready to activate IF (IS_BIT_SET(g_savedGlobals.sRandomChars.savedRC[ENUM_TO_INT(eReturnRCM)].rcFlags, ENUM_TO_INT(RC_FLAG_ACTIVATED))) AND NOT (IS_BIT_SET(g_savedGlobals.sRandomChars.savedRC[ENUM_TO_INT(eReturnRCM)].rcFlags, ENUM_TO_INT(RC_FLAG_COMPLETED))) // Get the RCM information Retrieve_Random_Character_Static_Mission_Details(eReturnRCM, sRCMissionDetails) // ensure the RCM is triggerable by the current player Char IF IS_BIT_SET(sRCMissionDetails.rcPlayableChars, ENUM_TO_INT(Get_Player_Director_Mode_Compatible())) // custom waypoints z height always gets set to 1.0 so make even playing field for these dist checks otherwise they won't work vTemp = sRCMissionDetails.rcCoords IF vTestCoords.z = 1.0 vTemp.z = 1.0 CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : GET_CLOSEST_ACTIVE_RC_MISSION updated mission coord Z for waypoint check : ", vTemp) ENDIF fDist = VDIST(vTestCoords, vTemp) IF fDist < fClosestDist IF fDist < RC_BRAIN_ACTIVATION_RANGE_EXTRA fClosestDist = fDist iClosestRCM = iIndex CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : GET_CLOSEST_ACTIVE_RC_MISSION updated iClosestRCM = ", iClosestRCM, " Name : ", sRCMissionDetails.tRCNameLabel) ENDIF ENDIF ELSE //CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : GET_CLOSEST_ACTIVE_RC_MISSION rcm not triggered by current player char iClosestRCM = ", iClosestRCM, " Name : ", sRCMissionDetails.tRCNameLabel) ENDIF ENDIF ENDREPEAT IF iClosestRCM != -1 fReturnDistance = fClosestDist eReturnRCM = INT_TO_ENUM(g_eRC_MissionIDs, iClosestRCM) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : GET_CLOSEST_ACTIVE_RC_MISSION return TRUE valid mission found eReturnRCM : ", eReturnRCM) RETURN TRUE ENDIF eReturnRCM = NO_RC_MISSION fReturnDistance = 999999 CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : GET_CLOSEST_ACTIVE_RC_MISSION return FALSE no valid mission found eReturnRCM : ", eReturnRCM) RETURN FALSE ENDFUNC /// PURPOSE: /// //block some minigames for now as not sure on knockons around mission blips /// PARAMS: /// eBlipReturnMinigame - minigame blip /// RETURNS: /// TRUE if allowed to grab as closest active FUNC BOOL IS_MINIGAME_BLIP_DROP_OFF_TYPE_SUPPORTED(STATIC_BLIP_NAME_ENUM &eBlipReturnMinigame) IF eBlipReturnMinigame = STATIC_BLIP_MINIGAME_OFFROAD_RACE5 OR eBlipReturnMinigame = STATIC_BLIP_MINIGAME_OFFROAD_RACE8 OR eBlipReturnMinigame = STATIC_BLIP_MINIGAME_OFFROAD_RACE9 OR eBlipReturnMinigame = STATIC_BLIP_MINIGAME_OFFROAD_RACE10 OR eBlipReturnMinigame = STATIC_BLIP_MINIGAME_OFFROAD_RACE11 OR eBlipReturnMinigame = STATIC_BLIP_MINIGAME_OFFROAD_RACE12 OR eBlipReturnMinigame = STATIC_BLIP_MINIGAME_PILOT_SCHOOL OR eBlipReturnMinigame = STATIC_BLIP_MINIGAME_TRAF_AIR OR eBlipReturnMinigame = STATIC_BLIP_MINIGAME_TRAF_GND OR eBlipReturnMinigame = STATIC_BLIP_AMBIENT_BASEJUMP_HARBOR OR eBlipReturnMinigame = STATIC_BLIP_AMBIENT_BASEJUMP_RACE_TRACK OR eBlipReturnMinigame = STATIC_BLIP_AMBIENT_BASEJUMP_WINDMILLS OR eBlipReturnMinigame = STATIC_BLIP_AMBIENT_BASEJUMP_NORTH_CLIFF OR eBlipReturnMinigame = STATIC_BLIP_AMBIENT_BASEJUMP_MAZE_BANK //OR eBlipReturnMinigame = STATIC_BLIP_AMBIENT_BASEJUMP_CRANE // not needed OR eBlipReturnMinigame = STATIC_BLIP_AMBIENT_BASEJUMP_RIVER_CLIFF OR eBlipReturnMinigame = STATIC_BLIP_AMBIENT_BASEJUMP_RUNAWAY_TRAIN //OR eBlipReturnMinigame = STATIC_BLIP_AMBIENT_BASEJUMP_GOLF_COURSE // not needed OR eBlipReturnMinigame = STATIC_BLIP_AMBIENT_BASEJUMP_1K OR eBlipReturnMinigame = STATIC_BLIP_AMBIENT_BASEJUMP_1_5K OR eBlipReturnMinigame = STATIC_BLIP_AMBIENT_BASEJUMP_CANAL //OR eBlipReturnMinigame = STATIC_BLIP_AMBIENT_BASEJUMP_ROCK_CLIFF // not needed OR eBlipReturnMinigame = STATIC_BLIP_MINIGAME_TRIATHLON1 // B*1861605 - triathlon vespucci OR eBlipReturnMinigame = STATIC_BLIP_MINIGAME_COUNTRY_RACE RETURN TRUE ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// get the cloest active minigame blip to the vTestCoords /// PARAMS: /// vTestCoords - position to check from /// eReturnRCM - the returned closest STATIC_BLIP_NAME_ENUM else STATIC_BLIP_NAME_DUMMY_FINAL /// fReturnDistance - the returned distance of the closest active mission /// RETURNS: /// If unable to find active minigame STATIC_BLIP_NAME_DUMMY_FINAL will return, else valid STATIC_BLIP_NAME_ENUM FUNC BOOL GET_CLOSEST_ACTIVE_MINIGAME_BLIP(VECTOR &vTestCoords, STATIC_BLIP_NAME_ENUM &eBlipReturnMinigame, FLOAT &fReturnDistance) STATIC_BLIP_NAME_ENUM eBlipClosestMinigame = STATIC_BLIP_NAME_DUMMY_FINAL FLOAT fClosestDist = 999999 FLOAT fDist INT iIndex VECTOR vTemp // minigames FOR iIndex = ENUM_TO_INT(STATIC_BLIP_MINIGAME_COUNTRY_RACE) TO ENUM_TO_INT(STATIC_BLIP_MINIGAME_YOGA2) // last minigame in the list eBlipReturnMinigame = INT_TO_ENUM(STATIC_BLIP_NAME_ENUM, iIndex) //block some minigames for now as not sure on knockons around mission blips IF IS_MINIGAME_BLIP_DROP_OFF_TYPE_SUPPORTED(eBlipReturnMinigame) // if the blip is on the map check it IF IS_STATIC_BLIP_CURRENTLY_VISIBLE(eBlipReturnMinigame) // custom waypoints z height always gets set to 1.0 so make even playing field for these dist checks otherwise they won't work vTemp = GET_STATIC_BLIP_POSITION(eBlipReturnMinigame) IF vTestCoords.z = 1.0 vTemp.z = 1.0 //CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : GET_CLOSEST_ACTIVE_MINIGAME_BLIP updated blip Z pos for waypoint check : ", vTemp) ENDIF fDist = VDIST(vTestCoords, vTemp) IF fDist < fClosestDist IF fDist < MINIGAME_LOAD_RANGE fClosestDist = fDist eBlipClosestMinigame = eBlipReturnMinigame CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : GET_CLOSEST_ACTIVE_MINIGAME_BLIP updated eBlipClosestMinigame = ", eBlipClosestMinigame, " DEBUG_GET_STRING_NAME_OF_STATIC_BLIP : ", DEBUG_GET_STRING_NAME_OF_STATIC_BLIP(iIndex)) ENDIF ENDIF ELSE //CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : GET_CLOSEST_ACTIVE_MINIGAME_BLIP blip not visible eBlipClosestMinigame = ", eBlipClosestMinigame, " DEBUG_GET_STRING_NAME_OF_STATIC_BLIP : ", DEBUG_GET_STRING_NAME_OF_STATIC_BLIP(iIndex)) ENDIF ELSE //CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : GET_CLOSEST_ACTIVE_MINIGAME_BLIP blip not currently supported eBlipClosestMinigame = ", eBlipClosestMinigame, " DEBUG_GET_STRING_NAME_OF_STATIC_BLIP : ", DEBUG_GET_STRING_NAME_OF_STATIC_BLIP(iIndex)) ENDIF ENDFOR // cycle through the basejumps (blips listed seperate from the rest of the minigames) FOR iIndex = ENUM_TO_INT(STATIC_BLIP_AMBIENT_BASEJUMP_HARBOR) TO ENUM_TO_INT(STATIC_BLIP_AMBIENT_BASEJUMP_ROCK_CLIFF) // last basejump in the list eBlipReturnMinigame = INT_TO_ENUM(STATIC_BLIP_NAME_ENUM, iIndex) //block some minigames for now as not sure on knockons around mission blips IF IS_MINIGAME_BLIP_DROP_OFF_TYPE_SUPPORTED(eBlipReturnMinigame) // if the blip is on the map check it IF IS_STATIC_BLIP_CURRENTLY_VISIBLE(eBlipReturnMinigame) // custom waypoints z height always gets set to 1.0 so make even playing field for these dist checks otherwise they won't work vTemp = GET_STATIC_BLIP_POSITION(eBlipReturnMinigame) IF vTestCoords.z = 1.0 vTemp.z = 1.0 //CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : GET_CLOSEST_ACTIVE_MINIGAME_BLIP updated blip Z pos for waypoint check : ", vTemp) ENDIF fDist = VDIST(vTestCoords, vTemp) IF fDist < fClosestDist IF fDist < MINIGAME_LOAD_RANGE fClosestDist = fDist eBlipClosestMinigame = eBlipReturnMinigame CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : GET_CLOSEST_ACTIVE_MINIGAME_BLIP updated eBlipClosestMinigame = ", eBlipClosestMinigame, " DEBUG_GET_STRING_NAME_OF_STATIC_BLIP : ", DEBUG_GET_STRING_NAME_OF_STATIC_BLIP(iIndex)) ENDIF ENDIF ELSE //CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : GET_CLOSEST_ACTIVE_MINIGAME_BLIP blip not visible eBlipClosestMinigame = ", eBlipClosestMinigame, " DEBUG_GET_STRING_NAME_OF_STATIC_BLIP : ", DEBUG_GET_STRING_NAME_OF_STATIC_BLIP(iIndex)) ENDIF ELSE //CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : GET_CLOSEST_ACTIVE_MINIGAME_BLIP blip not currently supported eBlipClosestMinigame = ", eBlipClosestMinigame, " DEBUG_GET_STRING_NAME_OF_STATIC_BLIP : ", DEBUG_GET_STRING_NAME_OF_STATIC_BLIP(iIndex)) ENDIF ENDFOR IF eBlipClosestMinigame != STATIC_BLIP_NAME_DUMMY_FINAL eBlipReturnMinigame = eBlipClosestMinigame fReturnDistance = fClosestDist CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : GET_CLOSEST_ACTIVE_MINIGAME_BLIP return TRUE valid minigame found eBlipReturnMinigame : ", eBlipReturnMinigame) RETURN TRUE ENDIF eBlipReturnMinigame = STATIC_BLIP_NAME_DUMMY_FINAL fReturnDistance = 999999 CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : GET_CLOSEST_ACTIVE_MINIGAME_BLIP return FALSE no valid minigame found at position : ", vTestCoords) RETURN FALSE ENDFUNC /// PURPOSE: /// check if the vTestCoords are within a specified mission's trigger area /// NOTE : custom waypoints placed on the map don't take Z value into account they always default to 1.0 so we need to make the value suitable for the check /// PARAMS: /// eSP_Mission - mission to test /// vTestCoords - coords to test /// RETURNS: /// TRUE if coords are inside mission trigger area FUNC BOOL ARE_COORDS_IN_SPECIFIC_SP_MISSION_TRIGGER_AREA(SP_MISSIONS eSP_Mission, VECTOR vTestCoords) SWITCH eSP_Mission CASE SP_MISSION_ASSASSIN_1 // Lester sat on park bench near beach front IF vTestCoords.Z = 1.0 vTestCoords.Z = 7.0 ENDIF IF IS_POINT_IN_ANGLED_AREA(vTestCoords, <<-1535.754028,-922.100952,4.122119>>, <<-1487.869507,-961.392883,26.719219>>, 50.000000) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIFIC_SP_MISSION_TRIGGER_AREA return TRUE for SP_MISSION_ASSASSIN_1") RETURN TRUE ENDIF BREAK CASE SP_MISSION_CARSTEAL_1 // Construction yard - covers nearly all of it with except of a strip near the South edge IF vTestCoords.Z = 1.0 vTestCoords.Z = 40.0 ENDIF IF IS_POINT_IN_ANGLED_AREA(vTestCoords, <<53.128983,-463.999908,36.920799>>, <<99.376099,-329.347626,118.045418>>, 125.000000) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIFIC_SP_MISSION_TRIGGER_AREA return TRUE for SP_MISSION_CARSTEAL_1") RETURN TRUE ENDIF BREAK CASE SP_MISSION_FBI_4_INTRO FALLTHRU CASE SP_MISSION_FBI_4 // FIB 4 - meet up in lot El Burro Heights - New Empire Way IF vTestCoords.Z = 1.0 vTestCoords.Z = 51.0214 ENDIF IF IS_POINT_IN_ANGLED_AREA(vTestCoords, <<1420.347290,-2036.557739,47.360718>>, <<1341.110474,-2103.843750,72.326508>>, 55.000000) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIFIC_SP_MISSION_TRIGGER_AREA return TRUE for SP_MISSION_FBI_4") RETURN TRUE ENDIF BREAK CASE SP_MISSION_FRANKLIN_1 FALLTHRU CASE SP_MISSION_MICHAEL_2 IF vTestCoords.Z = 1.0 vTestCoords.Z = 51.0214 ENDIF // at Franklin's house (default special area coords auto launch the mission) IF VDIST2(vTestCoords, << -13.89061, -1449.28967, 29.64636 >>) < (36.0 * 36.0) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIFIC_SP_MISSION_TRIGGER_AREA return TRUE for SP_MISSION_FRANKLIN_1 / SP_MISSION_MICHAEL_2") RETURN TRUE ENDIF BREAK CASE SP_MISSION_MICHAEL_3 IF vTestCoords.Z = 1.0 vTestCoords.Z = 173.47 ENDIF // at Kortz museum entrance IF IS_POINT_IN_ANGLED_AREA(vTestCoords, <<-2306.980225,435.303772,171.466568>>, <<-2303.291016,366.319946,179.601761>>, 65.5) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIFIC_SP_MISSION_TRIGGER_AREA return TRUE for SP_MISSION_MICHAEL_3") RETURN TRUE ENDIF BREAK CASE SP_MISSION_MARTIN_1 // Martin's ranch (also could be used off mission) IF vTestCoords.Z = 1.0 vTestCoords.Z = 114.0 ENDIF IF IS_POINT_IN_ANGLED_AREA(vTestCoords, <<1324.171509,1110.747925,99.654930>>, <<1523.096802,1110.473389,132.885864>>, 170.000000) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIFIC_SP_MISSION_TRIGGER_AREA return TRUE for SP_MISSION_MARTIN_1") RETURN TRUE ENDIF BREAK CASE SP_MISSION_FINALE_A IF vTestCoords.Z = 1.0 vTestCoords.Z = 46.0 ENDIF IF VDIST2(vTestCoords, <<1330.3890, -2553.7439, 45.9221>>) < (30.0 * 30.0) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIFIC_SP_MISSION_TRIGGER_AREA return TRUE for SP_MISSION_FINALE_A") RETURN TRUE ENDIF BREAK CASE SP_MISSION_SOLOMON_2 IF vTestCoords.Z = 1.0 vTestCoords.Z = 34.5 ENDIF IF IS_POINT_IN_ANGLED_AREA(vTestCoords, <<-995.977966,-517.432434,11.377625>>, <<-1060.725098,-547.558838,65.330429>>, 35.75) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIFIC_SP_MISSION_TRIGGER_AREA return TRUE for SP_MISSION_SOLOMON_2") RETURN TRUE ENDIF BREAK // Heists CASE SP_HEIST_JEWELRY_1 IF vTestCoords.Z = 1.0 vTestCoords.Z = 23.18 ENDIF IF IS_POINT_IN_ANGLED_AREA(vTestCoords, <<682.654419,-968.743896,19.975750>>, <<762.868408,-964.406433,43.037125>>, 53.0) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIFIC_SP_MISSION_TRIGGER_AREA return TRUE for SP_HEIST_JEWELRY_1") RETURN TRUE ENDIF BREAK CASE SP_HEIST_JEWELRY_PREP_1A IF vTestCoords.Z = 1.0 vTestCoords.Z = 5.0 ENDIF IF IS_POINT_IN_ANGLED_AREA(vTestCoords, <<148.836105,-3029.146484,4.277727>>, <<148.139572,-3342.343506,22.903791>>, 97.750000) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIFIC_SP_MISSION_TRIGGER_AREA return TRUE for SP_HEIST_JEWELRY_PREP_1A") RETURN TRUE ENDIF BREAK CASE SP_HEIST_FINALE_PREP_A IF vTestCoords.Z = 1.0 vTestCoords.Z = 28.1893 ENDIF IF IS_POINT_IN_ANGLED_AREA(vTestCoords, <<446.817413,-1691.708130,23.282328>>, <<288.556488,-1552.351807,108.311661>>, 155.000000) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIFIC_SP_MISSION_TRIGGER_AREA return TRUE for SP_HEIST_FINALE_PREP_A") RETURN TRUE ENDIF BREAK CASE SP_HEIST_FINALE_PREP_B IF vTestCoords.Z = 1.0 vTestCoords.Z = 28.1893 ENDIF // area covering whole block where the compound is IF IS_POINT_IN_ANGLED_AREA(vTestCoords, <<910.938171,-1749.909668,14.506144>>, <<921.741455,-1455.247925,99.671249>>, 210.000000) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIFIC_SP_MISSION_TRIGGER_AREA return TRUE for SP_HEIST_FINALE_PREP_B") RETURN TRUE ENDIF BREAK CASE SP_HEIST_FINALE_PREP_D IF vTestCoords.Z = 1.0 vTestCoords.Z = 37.0 ENDIF // area covering whole block where the compound is IF IS_POINT_IN_ANGLED_AREA(vTestCoords, <<2657.302490,2974.528564,34.534470>>, <<2591.656982,2880.223145,68.081558>>, 78.75) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIFIC_SP_MISSION_TRIGGER_AREA return TRUE for SP_HEIST_FINALE_PREP_D") RETURN TRUE ENDIF BREAK CASE SP_HEIST_FINALE_1 FALLTHRU CASE SP_HEIST_FINALE_2A IF vTestCoords.Z = 1.0 vTestCoords.Z = 28.0 ENDIF IF IS_POINT_IN_ANGLED_AREA(vTestCoords, <<83.323250,-1312.172241,23.336941>>, <<148.383026,-1273.553223,49.466507>>, 65.000000) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIFIC_SP_MISSION_TRIGGER_AREA return TRUE for SP_HEIST_FINALE_1 / SP_HEIST_FINALE_2A") RETURN TRUE ENDIF BREAK ENDSWITCH CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIFIC_SP_MISSION_TRIGGER_AREA return FALSE for SP_MISSIONS ", eSP_Mission, " vTestCoords = ", vTestCoords) RETURN FALSE ENDFUNC /// PURPOSE: /// get the custom drop off coords and heading for the specified SP mission /// PARAMS: /// eSP_Mission - mission to get custom drop off for /// vReturnCoord - the returned drop off coords /// fReturnHeading - the returned drop off heading /// RETURNS: /// TRUE if custom taxi drop off has been setup FUNC BOOL GET_CUSTOM_TAXI_DROP_OFF_FOR_SP_MISSION(SP_MISSIONS eSP_Mission, VECTOR &vReturnCoord, FLOAT &fReturnHeading) INT iVariation SWITCH eSP_Mission CASE SP_MISSION_ASSASSIN_1 vReturnCoord = <<-1456.3473, -962.5814, 6.3112>> fReturnHeading = 140.57 RETURN TRUE BREAK CASE SP_MISSION_CARSTEAL_1 vReturnCoord = <<147.6034, -404.7993, 40.0892>> // on main road just North of entrance to the construction yard fReturnHeading = 164.0206 RETURN TRUE BREAK CASE SP_MISSION_FBI_4_INTRO FALLTHRU CASE SP_MISSION_FBI_4 vReturnCoord = <<1361.6746, -2040.5747, 51.0214>> // on dust track just outside the lot (West of the entrance) facing East fReturnHeading = 281.5022 RETURN TRUE BREAK CASE SP_MISSION_FRANKLIN_1 // at Franklin's house (default special area coords auto launch the mission) FALLTHRU CASE SP_MISSION_MICHAEL_2 iVariation = 2 SWITCH GET_RANDOM_INT_IN_RANGE(0, iVariation) CASE 0 vReturnCoord = <<-43.9252, -1460.4318, 30.7052>> fReturnHeading = 104.5827 BREAK // West of the house heading West CASE 1 vReturnCoord = <<14.0313, -1460.4801, 29.4397>> fReturnHeading = 61.9499 BREAK // East of the house heading West ENDSWITCH RETURN TRUE BREAK CASE SP_MISSION_MICHAEL_3 vReturnCoord = <<-2313.90, 450.90, 173.47>> // outside Kortz museum roundabout fReturnHeading = 178.6132 RETURN TRUE BREAK CASE SP_MISSION_MARTIN_1 iVariation = 3 SWITCH GET_RANDOM_INT_IN_RANGE(0, iVariation) CASE 0 vReturnCoord = <<1369.2460, 1147.6527, 112.7592>> fReturnHeading = 182.0998 BREAK // front of the steps of the house CASE 1 vReturnCoord = <<1360.8483, 1139.1210, 112.7592>> fReturnHeading = 83.3356 BREAK // front of house offset to North CASE 2 vReturnCoord = <<1364.7513, 1154.3668, 112.7592>> fReturnHeading = 223.2795 BREAK // front of house offset to South ENDSWITCH RETURN TRUE BREAK CASE SP_MISSION_FINALE_A iVariation = 2 // SWITCH GET_RANDOM_INT_IN_RANGE(0, iVariation) // CASE 0 vReturnCoord = <<1324.6177, -2596.7603, 46.5998>> fReturnHeading = 285.1668 BREAK // Other side of the road in the layby vReturnCoord = <<1430.0966, -2588.0654, 47.0326>> fReturnHeading = 353.6747 // up road to east // ENDSWITCH RETURN TRUE BREAK CASE SP_MISSION_SOLOMON_2 vReturnCoord = <<-943.9154, -487.7569, 35.7331>> // Outside gate with most direct access to mission locate fReturnHeading = 27.40 RETURN TRUE BREAK // Heists CASE SP_HEIST_JEWELRY_1 vReturnCoord = <<764.6179, -972.5101, 24.9030>> // Just up the road from the warehouse fReturnHeading = 162.2939 RETURN TRUE BREAK CASE SP_HEIST_JEWELRY_PREP_1A vReturnCoord = <<185.1471, -3047.2285, 4.7824>> // Just up the road from the warehouse fReturnHeading = 163.8686 RETURN TRUE BREAK CASE SP_HEIST_FINALE_PREP_A iVariation = 2 SWITCH GET_RANDOM_INT_IN_RANGE(0, iVariation) CASE 0 vReturnCoord = <<504.1742, -1652.4719, 28.1893>> fReturnHeading = 52.3367 BREAK // Across the junction tothe South East CASE 1 vReturnCoord = <<275.9677, -1554.2201, 28.0311>> fReturnHeading = 303.3013 BREAK // Layby North West of the compound ENDSWITCH RETURN TRUE BREAK CASE SP_HEIST_FINALE_PREP_B iVariation = 2 SWITCH GET_RANDOM_INT_IN_RANGE(0, iVariation) CASE 0 vReturnCoord = <<853.9595, -1590.9219, 30.5996>> fReturnHeading = 7.1480 BREAK // South of the main entrance heading North CASE 1 vReturnCoord = <<847.5631, -1559.7194, 28.7923>> fReturnHeading = 20.9650 BREAK // North of the main entrance heading North ENDSWITCH RETURN TRUE BREAK CASE SP_HEIST_FINALE_PREP_D iVariation = 2 SWITCH GET_RANDOM_INT_IN_RANGE(0, iVariation) CASE 0 vReturnCoord = <<2602.4272, 2852.1726, 35.2800>> fReturnHeading = 19.36 BREAK // Just South of mission start, heading North CASE 1 vReturnCoord = <<2686.4038, 2957.3896, 35.4683>> fReturnHeading = 106.36 BREAK // East of mission start, heading West ENDSWITCH RETURN TRUE BREAK CASE SP_HEIST_FINALE_1 FALLTHRU CASE SP_HEIST_FINALE_2A vReturnCoord = <<135.4725, -1309.8962, 28.0485>> fReturnHeading = 301.12 // On alley at front of club RETURN TRUE BREAK ENDSWITCH RETURN FALSE ENDFUNC /// PURPOSE: /// check if the vTestCoords are within a specified mission's trigger area /// NOTE : custom waypoints placed on the map don't take Z value into account they always default to 1.0 so we need to make the value suitable for the check /// PARAMS: /// eRC_Mission - mission to test /// vTestCoords - coords to test /// RETURNS: /// TRUE if coords are inside mission trigger area FUNC BOOL ARE_COORDS_IN_SPECIFIC_RC_MISSION_TRIGGER_AREA(g_eRC_MissionIDs eRC_Mission, VECTOR vTestCoords) SWITCH eRC_Mission CASE RC_EPSILON_1 IF vTestCoords.Z = 1.0 vTestCoords.Z = 83.30 ENDIF // prox veh trigger parked in middle of the dirt track IF VDIST2(vTestCoords, << -1619.53, 4204.10, 83.30 >>) < (20.0 * 20.0) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIFIC_RC_MISSION_TRIGGER_AREA return TRUE for RC_EPSILON_1") RETURN TRUE ENDIF BREAK CASE RC_EPSILON_3 IF vTestCoords.Z = 1.0 vTestCoords.Z = 35.0 ENDIF IF IS_POINT_IN_ANGLED_AREA(vTestCoords, <<1882.789673,4725.034180,34.743729>>, <<1701.497192,4677.470215,47.892891>>, 159.50) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIFIC_RC_MISSION_TRIGGER_AREA return TRUE for RC_EPSILON_3") RETURN TRUE ENDIF BREAK CASE RC_EPSILON_4 IF vTestCoords.Z = 1.0 vTestCoords.Z = 35.0 ENDIF IF IS_POINT_IN_ANGLED_AREA(vTestCoords, <<1882.789673,4725.034180,34.743729>>, <<1701.497192,4677.470215,47.892891>>, 159.50) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIFIC_RC_MISSION_TRIGGER_AREA return TRUE for RC_EPSILON_4") RETURN TRUE ENDIF BREAK CASE RC_EPSILON_6 IF vTestCoords.Z = 1.0 vTestCoords.Z = 11.66 ENDIF // prox veh (plane) trigger parked in middle of the dirt track - big trigger area IF VDIST2(vTestCoords, <<-2892.93,3192.37,11.66>>) < (50.0 * 50.0) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIFIC_RC_MISSION_TRIGGER_AREA return TRUE for RC_EPSILON_6") RETURN TRUE ENDIF BREAK CASE RC_EXTREME_1 IF vTestCoords.Z = 1.0 vTestCoords.Z = 302.86 ENDIF IF VDIST2(vTestCoords, << -188.22, 1296.10, 302.86 >>) < (50.0 * 50.0) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIFIC_RC_MISSION_TRIGGER_AREA return TRUE for RC_EXTREME_1") RETURN TRUE ENDIF BREAK CASE RC_EXTREME_2 IF vTestCoords.Z = 1.0 vTestCoords.Z = 14.64 ENDIF IF VDIST2(vTestCoords, << -954.19, -2760.05, 14.64 >>) < (50.0 * 50.0) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIFIC_RC_MISSION_TRIGGER_AREA return TRUE for RC_EXTREME_2") RETURN TRUE ENDIF BREAK CASE RC_EXTREME_3 // RC - Extreme 3 - top of Maze tower - B*1408629 IF vTestCoords.Z = 1.0 vTestCoords.Z = 325.0 ENDIF IF VDIST2(vTestCoords, << -75.59782, -818.60815, 325.17450 >>) < (58.0 * 58.0) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIFIC_RC_MISSION_TRIGGER_AREA return TRUE for RC_EXTREME_3") RETURN TRUE ENDIF BREAK CASE RC_EXTREME_4 IF vTestCoords.Z = 1.0 vTestCoords.Z = 170.29 ENDIF IF VDIST2(vTestCoords, <<1732.27, 96.36, 170.29>>) < (50.0 * 50.0) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIFIC_RC_MISSION_TRIGGER_AREA return TRUE for RC_EXTREME_4") RETURN TRUE ENDIF BREAK CASE RC_FANATIC_1 IF vTestCoords.Z = 1.0 vTestCoords.Z = 44.9677 ENDIF IF IS_POINT_IN_ANGLED_AREA(vTestCoords, <<-1903.322266,-401.238403,19.234562>>, <<-1844.879150,-445.726105,73.561974>>, 115.000000) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIFIC_RC_MISSION_TRIGGER_AREA return TRUE for RC_FANATIC_1") RETURN TRUE ENDIF BREAK CASE RC_FANATIC_2 IF vTestCoords.Z = 1.0 vTestCoords.Z = 359.0 ENDIF IF IS_POINT_IN_ANGLED_AREA(vTestCoords, <<794.245300,1277.442505,-100>>, <<833.821533,1277.108398,400>>, 19.000000) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIFIC_RC_MISSION_TRIGGER_AREA return TRUE for RC_FANATIC_2") RETURN TRUE ENDIF BREAK CASE RC_FANATIC_3 IF vTestCoords.Z = 1.0 vTestCoords.Z = 5.0 ENDIF IF IS_POINT_IN_ANGLED_AREA(vTestCoords, <<-1015.525818,6287.513184,-10.944491>>, <<-761.310425,5895.013672,45.337265>>, 167.75) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIFIC_RC_MISSION_TRIGGER_AREA return TRUE for RC_FANATIC_3") RETURN TRUE ENDIF BREAK CASE RC_HAO_1 IF vTestCoords.Z = 1.0 vTestCoords.Z = 29.6 ENDIF // wider than the actual trigger area 25.0 (points span the alleyway IF IS_POINT_IN_ANGLED_AREA(vTestCoords, <<-72.134911,-1267.586792,27.683605>>, <<-72.180153,-1256.712158,31.0>>, 30.0) // currently a char trigger with range 4.0 CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIFIC_RC_MISSION_TRIGGER_AREA return TRUE for RC_HAO_1") RETURN TRUE ENDIF BREAK CASE RC_HUNTING_2 IF vTestCoords.Z = 1.0 vTestCoords.Z = 16.3 ENDIF // prox trigger to char using 10.0 radius currently IF VDIST2(vTestCoords, <<-683.41589, 5841.04346, 16.33060 >>) < (20.0 * 20.0) // 20.0 to cover the road since this hunting mission can trigger from the road CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIFIC_RC_MISSION_TRIGGER_AREA return TRUE for RC_HUNTING_2") RETURN TRUE ENDIF BREAK CASE RC_JOSH_2 FALLTHRU CASE RC_JOSH_3 IF vTestCoords.Z = 1.0 vTestCoords.Z = 29.0 ENDIF IF VDIST2(vTestCoords, <<566.1639, -1773.8171, 29.0>>) < (50.0 * 50.0) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIFIC_RC_MISSION_TRIGGER_AREA return TRUE for RC_JOSH_2/3") RETURN TRUE ENDIF BREAK CASE RC_JOSH_4 IF vTestCoords.Z = 1.0 vTestCoords.Z = 63.1146 ENDIF IF VDIST2(vTestCoords, <<-1103.6277, 288.1084, 63.1146>>) < (50.0 * 50.0) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIFIC_RC_MISSION_TRIGGER_AREA return TRUE for RC_JOSH_4") RETURN TRUE ENDIF BREAK CASE RC_MINUTE_2 IF vTestCoords.Z = 1.0 vTestCoords.Z = 100.0 ENDIF IF IS_POINT_IN_ANGLED_AREA(vTestCoords, <<-21.123615,4518.907227,119.783615>>, <<43.132828,4538.928711,72.589554>>, 48.000000) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIFIC_RC_MISSION_TRIGGER_AREA return TRUE for RC_MINUTE_2") RETURN TRUE ENDIF BREAK CASE RC_NIGEL_1 IF vTestCoords.Z = 1.0 vTestCoords.Z = 67.5 ENDIF IF VDIST2(vTestCoords, << -1099.50171, 790.26135, 163.39977 >>) < (30.0 * 30.0) // cover the road since this mission can trigger from the road CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIFIC_RC_MISSION_TRIGGER_AREA return TRUE for RC_NIGEL_1") RETURN TRUE ENDIF BREAK CASE RC_NIGEL_1B IF vTestCoords.Z = 1.0 vTestCoords.Z = 67.5 ENDIF // area covering house and surrounding roads covering IF IS_POINT_IN_ANGLED_AREA(vTestCoords, <<-1088.425293,372.072266,62.758965>>, <<-967.029968,363.597565,101.348320>>, 75.000000) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIFIC_RC_MISSION_TRIGGER_AREA return TRUE for RC_NIGEL_1B") RETURN TRUE ENDIF BREAK CASE RC_NIGEL_3 IF vTestCoords.Z = 1.0 vTestCoords.Z = 28.2 ENDIF // area covering all of the block where the alleyways leading to the mission are IF IS_POINT_IN_ANGLED_AREA(vTestCoords, <<-91.456764,-1296.975342,26.154373>>, <<40.672878,-1297.458618,58.293682>>, 110.000000) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIFIC_RC_MISSION_TRIGGER_AREA return TRUE for RC_NIGEL_3") RETURN TRUE ENDIF BREAK CASE RC_OMEGA_1 IF vTestCoords.Z = 1.0 vTestCoords.Z = 49.9 ENDIF // prox trigger to char middle of countryside so can afford generous radius IF VDIST2(vTestCoords, <<2468.51, 3437.39, 49.90>>) < (30.0 * 30.0) // covers road and building CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIFIC_RC_MISSION_TRIGGER_AREA return TRUE for RC_OMEGA_1") RETURN TRUE ENDIF BREAK CASE RC_PAPARAZZO_2 IF vTestCoords.Z = 1.0 vTestCoords.Z = 110.0 ENDIF // area covering all of the alleyway IF IS_POINT_IN_ANGLED_AREA(vTestCoords, <<-78.380287,285.525421,102.628593>>, <<-51.154598,357.521698,122.061691>>, 40.000000) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIFIC_RC_MISSION_TRIGGER_AREA return TRUE for RC_PAPARAZZO_2") RETURN TRUE ENDIF BREAK CASE RC_PAPARAZZO_3A IF vTestCoords.Z = 1.0 vTestCoords.Z = 100.0 ENDIF // area covering the large radius for starting the mission IF IS_POINT_IN_ANGLED_AREA(vTestCoords, <<420.519592,116.289169,77.575317>>, <<212.293747,193.679443,131.876694>>, 250.0) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIFIC_RC_MISSION_TRIGGER_AREA return TRUE for RC_PAPARAZZO_3A") RETURN TRUE ENDIF BREAK CASE RC_PAPARAZZO_3B IF vTestCoords.Z = 1.0 vTestCoords.Z = 64.0 ENDIF // area covering the large radius for starting the mission IF IS_POINT_IN_ANGLED_AREA(vTestCoords, <<1140.157959,-540.964417,49.999439>>, <<972.371643,-535.100220,85.643967>>, 168.25) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIFIC_RC_MISSION_TRIGGER_AREA return TRUE for RC_PAPARAZZO_3B") RETURN TRUE ENDIF BREAK CASE RC_TONYA_1 FALLTHRU CASE RC_TONYA_2 FALLTHRU CASE RC_TONYA_5 IF vTestCoords.Z = 1.0 vTestCoords.Z = 29.6 ENDIF IF VDIST2(vTestCoords, <<-16.5304, -1473.1208, 29.6110>>) < (8.0 * 8.0) // currently a char trigger with range 4.0 CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIFIC_RC_MISSION_TRIGGER_AREA return TRUE for RC_TONYA_1/2/5") RETURN TRUE ENDIF BREAK ENDSWITCH RETURN FALSE ENDFUNC /// PURPOSE: /// get the custom drop off coords and heading for the specified RC mission /// PARAMS: /// eRC_Mission - mission to get custom drop off for /// vReturnCoord - the returned drop off coords /// fReturnHeading - the returned drop off heading /// RETURNS: /// TRUE if custom taxi drop off has been setup FUNC BOOL GET_CUSTOM_TAXI_DROP_OFF_FOR_RC_MISSION(g_eRC_MissionIDs eRC_Mission, VECTOR &vReturnCoord, FLOAT &fReturnHeading) INT iVariation SWITCH eRC_Mission CASE RC_EPSILON_1 iVariation = 2 SWITCH GET_RANDOM_INT_IN_RANGE(0, iVariation) CASE 0 vReturnCoord = <<-1646.1178, 4206.7427, 82.9658>> fReturnHeading = 251.0217 BREAK // up the track to the West CASE 1 vReturnCoord = <<-1582.8895, 4201.4087, 79.5905>> fReturnHeading = 95.4232 BREAK // down the track to the East ENDSWITCH RETURN TRUE BREAK CASE RC_EPSILON_3 iVariation = 2 SWITCH GET_RANDOM_INT_IN_RANGE(0, iVariation) CASE 0 vReturnCoord = <<1885.4458, 4738.6123, 39.4154>> fReturnHeading = 43.9908 BREAK // On dirt road by farm CASE 1 vReturnCoord = <<1702.4242, 4687.6968, 41.9431>> fReturnHeading = 2.4487 BREAK // In town main road ENDSWITCH RETURN TRUE BREAK CASE RC_EPSILON_4 iVariation = 2 SWITCH GET_RANDOM_INT_IN_RANGE(0, iVariation) CASE 0 vReturnCoord = <<1885.4458, 4738.6123, 39.4154>> fReturnHeading = 43.9908 BREAK // On dirt road by farm CASE 1 vReturnCoord = <<1702.4242, 4687.6968, 41.9431>> fReturnHeading = 2.4487 BREAK // In town main road ENDSWITCH RETURN TRUE BREAK CASE RC_EPSILON_6 iVariation = 2 SWITCH GET_RANDOM_INT_IN_RANGE(0, iVariation) CASE 0 vReturnCoord = <<-2934.6604, 3238.4041, 9.4456>> fReturnHeading = 228.5574 BREAK // up the track to the North West CASE 1 vReturnCoord = <<-2842.0232, 3145.0862, 9.2400>> fReturnHeading = 45.7287 BREAK // down the track to the South East ENDSWITCH RETURN TRUE BREAK CASE RC_EXTREME_1 vReturnCoord = <<-204.0333, 1313.9728, 303.4189>> // across road from dog fReturnHeading = 126.7738 RETURN TRUE BREAK CASE RC_EXTREME_2 vReturnCoord = <<-906.4329, -2694.2803, 12.8182>> // main road nearby fReturnHeading = 329.3241 RETURN TRUE BREAK CASE RC_EXTREME_3 vReturnCoord = <<-142.3670, -895.0251, 28.1910>> // entrance to the tower fReturnHeading = 71.6555 RETURN TRUE BREAK CASE RC_EXTREME_4 vReturnCoord = <<1753.9014, 107.8206, 170.2481>> // down road from dog fReturnHeading = 288.8676 RETURN TRUE BREAK CASE RC_FANATIC_1 vReturnCoord = <<-1859.5427, -411.3196, 44.9677>> // next to path leading over to the bird fReturnHeading = 242.8712 RETURN TRUE BREAK CASE RC_FANATIC_2 vReturnCoord = << 827.0720, 1282.2883, 359.2872 >> fReturnHeading = 90.0 RETURN TRUE BREAK CASE RC_FANATIC_3 vReturnCoord = <<-640.2675, 6050.9805, 7.4082>> // On the road near the beach fReturnHeading = 138.3021 RETURN TRUE BREAK CASE RC_HAO_1 vReturnCoord = <<-92.2052, -1254.8276, 28.1682>> // on the main road just North of the alleyway fReturnHeading = 349.9590 RETURN TRUE BREAK CASE RC_HUNTING_2 vReturnCoord = <<-701.0541, 5819.1162, 16.1980>> // South along the road, more infront of the lodge (can't be too close since this can trigger on the road) fReturnHeading = 336.3649 RETURN TRUE BREAK CASE RC_JOSH_2 FALLTHRU CASE RC_JOSH_3 vReturnCoord = <<569.2760, -1730.9674, 28.1277>> // On main road to motel fReturnHeading = 246.5764 RETURN TRUE BREAK CASE RC_JOSH_4 vReturnCoord = <<-1110.0881, 253.6757, 63.5431>> // Across the road from Josh's house fReturnHeading = 279.1973 RETURN TRUE BREAK CASE RC_MINUTE_2 vReturnCoord = <<67.1562, 4560.1343, 97.8678>> fReturnHeading = 113.4120 RETURN TRUE BREAK CASE RC_NIGEL_1 vReturnCoord = <<-1069.0764, 789.2375, 164.9551>> // Up the road to the East just half way along walled property (has to be that high because the ai stops way off!) fReturnHeading = 98.4554 RETURN TRUE BREAK CASE RC_NIGEL_1B vReturnCoord = <<-1073.1289, 364.1223, 67.3617>> // Road to the West of the house fReturnHeading = 359.3075 RETURN TRUE BREAK CASE RC_NIGEL_3 vReturnCoord = <<-91.4237, -1305.5577, 28.1569>> // Main road West of Nigel in the alleyway fReturnHeading = 2.2198 RETURN TRUE BREAK CASE RC_OMEGA_1 vReturnCoord = <<2479.2490, 3401.2341, 48.9551>> // further down the road fReturnHeading = 35.1009 RETURN TRUE BREAK CASE RC_PAPARAZZO_2 vReturnCoord = <<-60.0571, 292.1416, 104.6818>> // on the main road just East of the alleyway fReturnHeading = 74.4771 RETURN TRUE BREAK CASE RC_PAPARAZZO_3A vReturnCoord = <<166.2055, 194.8600, 104.9587>> // Off to the side on Vinewood blvrd fReturnHeading = 247.5814 RETURN TRUE BREAK CASE RC_PAPARAZZO_3B vReturnCoord = <<1149.9778, -506.4045, 63.7076>> // Off to the side of the road outside the radius fReturnHeading = 97.5469 RETURN TRUE BREAK CASE RC_TONYA_1 FALLTHRU CASE RC_TONYA_2 FALLTHRU CASE RC_TONYA_5 vReturnCoord = <<-27.2198, -1467.9329, 29.8592>> // just West along the road from her position fReturnHeading = 273.1409 RETURN TRUE BREAK ENDSWITCH RETURN FALSE ENDFUNC /// PURPOSE: /// check if the vTestCoords are within a specified mission's trigger area /// NOTE : custom waypoints placed on the map don't take Z value into account they always default to 1.0 so we need to make the value suitable for the check /// PARAMS: /// eRC_Mission - mission to test /// vTestCoords - coords to test /// RETURNS: /// TRUE if coords are inside mission trigger area FUNC BOOL ARE_COORDS_IN_SPECIFIC_MINIGAME_TRIGGER_AREA(STATIC_BLIP_NAME_ENUM eMinigameBlip, VECTOR vTestCoords) SWITCH eMinigameBlip CASE STATIC_BLIP_MINIGAME_PILOT_SCHOOL // Flight school IF vTestCoords.Z = 1.0 vTestCoords.Z = 15.0 ENDIF IF IS_POINT_IN_ANGLED_AREA(vTestCoords, <<-1157.595093,-2726.635742,12.944641>>, <<-1110.793823,-2679.330078,22.944656>>, 26.000000) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIFIC_MINIGAME_TRIGGER_AREA return TRUE for STATIC_BLIP_MINIGAME_PILOT_SCHOOL") RETURN TRUE ENDIF BREAK CASE STATIC_BLIP_MINIGAME_OFFROAD_RACE5 // OFFROAD_RACE_CANYON_CLIFFS IF vTestCoords.Z = 1.0 vTestCoords.Z = 38.5 ENDIF IF IS_POINT_IN_ANGLED_AREA(vTestCoords, <<-1908.065308,4432.692871,51.384197>>, <<-1962.211914,4473.799805,22.939892>>, 70.000000) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIFIC_MINIGAME_TRIGGER_AREA return TRUE for STATIC_BLIP_MINIGAME_OFFROAD_RACE5") RETURN TRUE ENDIF BREAK CASE STATIC_BLIP_MINIGAME_OFFROAD_RACE8 // OFFROAD_RACE_RIDGE_RUN IF vTestCoords.Z = 1.0 vTestCoords.Z = 206.5 ENDIF IF IS_POINT_IN_ANGLED_AREA(vTestCoords, <<-541.831116,2050.598877,186.390442>>, <<-499.787018,1968.325317,228.018326>>, 70.000000) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIFIC_MINIGAME_TRIGGER_AREA return TRUE for STATIC_BLIP_MINIGAME_OFFROAD_RACE8") RETURN TRUE ENDIF BREAK CASE STATIC_BLIP_MINIGAME_OFFROAD_RACE9 // OFFROAD_RACE_VALLEY_TRAIL IF vTestCoords.Z = 1.0 vTestCoords.Z = 43.1 ENDIF IF IS_POINT_IN_ANGLED_AREA(vTestCoords, <<-179.858810,4216.166504,30.265049>>, <<-246.319962,4226.653320,53.778858>>, 70.000000) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIFIC_MINIGAME_TRIGGER_AREA return TRUE for STATIC_BLIP_MINIGAME_OFFROAD_RACE9") RETURN TRUE ENDIF BREAK CASE STATIC_BLIP_MINIGAME_OFFROAD_RACE10 // OFFROAD_RACE_LAKESIDE_SPLASH IF vTestCoords.Z = 1.0 vTestCoords.Z = 34.0 ENDIF IF IS_POINT_IN_ANGLED_AREA(vTestCoords, <<1634.122070,3858.049316,28.339115>>, <<1573.258667,3800.441650,48.354755>>, 70.000000) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIFIC_MINIGAME_TRIGGER_AREA return TRUE for STATIC_BLIP_MINIGAME_OFFROAD_RACE10") RETURN TRUE ENDIF BREAK CASE STATIC_BLIP_MINIGAME_OFFROAD_RACE11 // OFFROAD_RACE_ECO_FRIENDLY IF vTestCoords.Z = 1.0 vTestCoords.Z = 94.0 ENDIF IF IS_POINT_IN_ANGLED_AREA(vTestCoords, <<2057.873047,2059.197510,63.880737>>, <<1999.045410,2190.543701,122.264198>>, 110.000000) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIFIC_MINIGAME_TRIGGER_AREA return TRUE for STATIC_BLIP_MINIGAME_OFFROAD_RACE11") RETURN TRUE ENDIF BREAK CASE STATIC_BLIP_MINIGAME_OFFROAD_RACE12 // OFFROAD_RACE_MINEWARD_SPIRAL IF vTestCoords.Z = 1.0 vTestCoords.Z = 40.7 ENDIF IF IS_POINT_IN_ANGLED_AREA(vTestCoords, <<3028.084473,2768.166992,57.729843>>, <<2944.283936,2772.835938,30.230679>>, 85.000000) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIFIC_MINIGAME_TRIGGER_AREA return TRUE for STATIC_BLIP_MINIGAME_OFFROAD_RACE12") RETURN TRUE ENDIF BREAK CASE STATIC_BLIP_MINIGAME_TRAF_AIR // both at the airfield FALLTHRU CASE STATIC_BLIP_MINIGAME_TRAF_GND IF vTestCoords.Z = 1.0 vTestCoords.Z = 305.0 ENDIF IF IS_POINT_IN_ANGLED_AREA(vTestCoords, <<2097.950928,4820.308105,55.481686>>, <<2151.254150,4726.397949,31.073204>>, 120.000000) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIFIC_MINIGAME_TRIGGER_AREA return TRUE for STATIC_BLIP_MINIGAME_TRAF_AIR / GND") RETURN TRUE ENDIF BREAK // Base Jumps CASE STATIC_BLIP_AMBIENT_BASEJUMP_HARBOR IF vTestCoords.Z = 1.0 vTestCoords.Z = 4.7 ENDIF IF IS_POINT_IN_ANGLED_AREA(vTestCoords, <<-763.508606,-1297.979858,2.000373>>, <<-864.137207,-1278.007202,24.150381>>, 85.000000) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIFIC_MINIGAME_TRIGGER_AREA return TRUE for STATIC_BLIP_AMBIENT_BASEJUMP_HARBOR") RETURN TRUE ENDIF BREAK CASE STATIC_BLIP_AMBIENT_BASEJUMP_RACE_TRACK IF vTestCoords.Z = 1.0 vTestCoords.Z = 52.0 ENDIF IF IS_POINT_IN_ANGLED_AREA(vTestCoords, <<1137.022095,89.068535,74.890221>>, <<1267.820801,292.010620,102.990440>>, 195.000000) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIFIC_MINIGAME_TRIGGER_AREA return TRUE for STATIC_BLIP_AMBIENT_BASEJUMP_RACE_TRACK") RETURN TRUE ENDIF BREAK CASE STATIC_BLIP_AMBIENT_BASEJUMP_WINDMILLS IF vTestCoords.Z = 1.0 vTestCoords.Z = 35.6 ENDIF IF IS_POINT_IN_ANGLED_AREA(vTestCoords, <<2512.304688,1519.461548,28.555042>>, <<2380.373779,1521.587158,58.809845>>, 90.000000) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIFIC_MINIGAME_TRIGGER_AREA return TRUE for STATIC_BLIP_AMBIENT_BASEJUMP_WINDMILLS") RETURN TRUE ENDIF BREAK CASE STATIC_BLIP_AMBIENT_BASEJUMP_NORTH_CLIFF IF vTestCoords.Z = 1.0 vTestCoords.Z = 10.0979 ENDIF IF IS_POINT_IN_ANGLED_AREA(vTestCoords, <<-193.558304,6533.439453,-1.902109>>, <<-299.251190,6645.049316,20.459734>>, 120.000000) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIFIC_MINIGAME_TRIGGER_AREA return TRUE for STATIC_BLIP_AMBIENT_BASEJUMP_NORTH_CLIFF") RETURN TRUE ENDIF BREAK CASE STATIC_BLIP_AMBIENT_BASEJUMP_MAZE_BANK IF vTestCoords.Z = 1.0 vTestCoords.Z = 325.0 // note: higher for top of the building ENDIF IF VDIST2(vTestCoords, << -75.59782, -818.60815, 325.17450 >>) < (58.0 * 58.0) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIFIC_MINIGAME_TRIGGER_AREA return TRUE for STATIC_BLIP_AMBIENT_BASEJUMP_MAZE_BANK") RETURN TRUE ENDIF BREAK // not needed //CASE STATIC_BLIP_AMBIENT_BASEJUMP_CRANE //BREAK CASE STATIC_BLIP_AMBIENT_BASEJUMP_RIVER_CLIFF IF vTestCoords.Z = 1.0 vTestCoords.Z = 133.0 ENDIF IF IS_POINT_IN_ANGLED_AREA(vTestCoords, <<-1171.146729,4647.889648,203.793686>>, <<-1280.149292,4457.596680,5.653551>>, 120.000000) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIFIC_MINIGAME_TRIGGER_AREA return TRUE for STATIC_BLIP_AMBIENT_BASEJUMP_RIVER_CLIFF") RETURN TRUE ENDIF BREAK CASE STATIC_BLIP_AMBIENT_BASEJUMP_RUNAWAY_TRAIN IF vTestCoords.Z = 1.0 vTestCoords.Z = 91.6 ENDIF IF IS_POINT_IN_ANGLED_AREA(vTestCoords, <<-687.973999,4499.519531,114.781013>>, <<-826.008118,4496.863770,49.883595>>, 140.000000) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIFIC_MINIGAME_TRIGGER_AREA return TRUE for STATIC_BLIP_AMBIENT_BASEJUMP_RUNAWAY_TRAIN") RETURN TRUE ENDIF BREAK // not needed - pack against a post near the road //CASE STATIC_BLIP_AMBIENT_BASEJUMP_GOLF_COURSE //BREAK CASE STATIC_BLIP_AMBIENT_BASEJUMP_1K IF vTestCoords.Z = 1.0 vTestCoords.Z = 23.0 ENDIF IF IS_POINT_IN_ANGLED_AREA(vTestCoords, <<-1364.700928,4490.625977,49.524769>>, <<-1367.169312,4340.339844,-1.682158>>, 100.000000) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIFIC_MINIGAME_TRIGGER_AREA return TRUE for STATIC_BLIP_AMBIENT_BASEJUMP_1K") RETURN TRUE ENDIF BREAK CASE STATIC_BLIP_AMBIENT_BASEJUMP_1_5K IF vTestCoords.Z = 1.0 vTestCoords.Z = 44.0 ENDIF IF IS_POINT_IN_ANGLED_AREA(vTestCoords, <<2566.189453,5007.007324,97.368958>>, <<2491.713623,4923.261230,30.434944>>, 80.000000) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIFIC_MINIGAME_TRIGGER_AREA return TRUE for STATIC_BLIP_AMBIENT_BASEJUMP_1_5K") RETURN TRUE ENDIF BREAK CASE STATIC_BLIP_AMBIENT_BASEJUMP_CANAL IF vTestCoords.Z = 1.0 vTestCoords.Z = 69.0 ENDIF IF IS_POINT_IN_ANGLED_AREA(vTestCoords, <<1009.917053,-163.468353,102.102791>>, <<1113.474121,-221.329529,49.874504>>, 90.000000) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIFIC_MINIGAME_TRIGGER_AREA return TRUE for STATIC_BLIP_AMBIENT_BASEJUMP_CANAL") RETURN TRUE ENDIF BREAK // not needed - handled by taxi ARE_COORDS_IN_SPECIAL_AREA checks //CASE STATIC_BLIP_AMBIENT_BASEJUMP_ROCK_CLIFF //BREAK CASE STATIC_BLIP_MINIGAME_TRIATHLON1 // B*1861605 - triathlon vespucci IF vTestCoords.Z = 1.0 vTestCoords.Z = 12.0 // note: higher for top of the building ENDIF IF VDIST2(vTestCoords, <<-1230.6222, -2049.9700, 12.8882>>) < (75.0 * 75.0) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIFIC_MINIGAME_TRIGGER_AREA return TRUE for STATIC_BLIP_MINIGAME_TRIATHLON1") RETURN TRUE ENDIF BREAK CASE STATIC_BLIP_MINIGAME_COUNTRY_RACE IF vTestCoords.Z = 1.0 vTestCoords.Z = 47.0 ENDIF IF VDIST2(vTestCoords, <<-1968.1, 3116.7, 46.8882>>) < (30.0 * 30.0) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIFIC_MINIGAME_TRIGGER_AREA return TRUE for STATIC_BLIP_MINIGAME_COUNTRY_RACE") RETURN TRUE ENDIF BREAK ENDSWITCH RETURN FALSE ENDFUNC /// PURPOSE: /// get the custom drop off coords and heading for the specified RC mission /// PARAMS: /// eRC_Mission - mission to get custom drop off for /// vReturnCoord - the returned drop off coords /// fReturnHeading - the returned drop off heading /// RETURNS: /// TRUE if custom taxi drop off has been setup FUNC BOOL GET_CUSTOM_TAXI_DROP_OFF_FOR_MINIGAME(STATIC_BLIP_NAME_ENUM eMinigameBlip, VECTOR &vReturnCoord, FLOAT &fReturnHeading) SWITCH eMinigameBlip CASE STATIC_BLIP_MINIGAME_PILOT_SCHOOL // Flight school vReturnCoord = <<-1094.7108, -2641.9817, 12.7071>> // moved to main road drop off slip lane to prevent taxi heading into airport fReturnHeading = 188.2694 RETURN TRUE BREAK CASE STATIC_BLIP_MINIGAME_OFFROAD_RACE5 // OFFROAD_RACE_CANYON_CLIFFS vReturnCoord = <<-1917.7191, 4445.7495, 38.6592>> // on the road to the side fReturnHeading = 45.8220 RETURN TRUE BREAK CASE STATIC_BLIP_MINIGAME_OFFROAD_RACE8 // OFFROAD_RACE_RIDGE_RUN vReturnCoord = <<-482.5762, 1993.8499, 206.3482>> // on the main road to the East fReturnHeading = 263.9373 RETURN TRUE BREAK CASE STATIC_BLIP_MINIGAME_OFFROAD_RACE9 // OFFROAD_RACE_VALLEY_TRAIL vReturnCoord = <<-208.3305, 4195.3413, 43.1714>> // main road just before the left turn on to the trigger road fReturnHeading = 333.4403 RETURN TRUE BREAK CASE STATIC_BLIP_MINIGAME_OFFROAD_RACE10 // OFFROAD_RACE_LAKESIDE_SPLASH vReturnCoord = <<1619.4460, 3820.9602, 33.9381>> // on the main road near the minigame fReturnHeading = 129.6464 RETURN TRUE BREAK CASE STATIC_BLIP_MINIGAME_OFFROAD_RACE11 // OFFROAD_RACE_ECO_FRIENDLY vReturnCoord = <<2045.1687, 2155.8872, 94.3423>> // just past the start towards the dead end to stop it interfering with the race fReturnHeading = 347.9475 RETURN TRUE BREAK CASE STATIC_BLIP_MINIGAME_OFFROAD_RACE12 // OFFROAD_RACE_MINEWARD_SPIRAL vReturnCoord = <<2952.7668, 2807.0281, 40.7635>> // into the quarry basin to stop taxi waiting in front of the race fReturnHeading = 121.2574 RETURN TRUE BREAK CASE STATIC_BLIP_MINIGAME_TRAF_AIR FALLTHRU CASE STATIC_BLIP_MINIGAME_TRAF_GND vReturnCoord = <<2119.6763, 4747.1978, 40.1793>> // on main road behind hangar to give things a little time to load in fReturnHeading = 305.2213 RETURN TRUE BREAK //Base jumps CASE STATIC_BLIP_AMBIENT_BASEJUMP_HARBOR vReturnCoord = <<-817.3487, -1303.8899, 4.0005>> // near heli facing away - to give it time (if needed) to spawn on skip fReturnHeading = 253.9379 RETURN TRUE BREAK CASE STATIC_BLIP_AMBIENT_BASEJUMP_RACE_TRACK vReturnCoord = <<1118.7509, 262.0209, 79.8555>> // Horse race course (North East section) car park at side of the grand stand fReturnHeading = 52.3086 RETURN TRUE BREAK CASE STATIC_BLIP_AMBIENT_BASEJUMP_WINDMILLS vReturnCoord = <<2414.0632, 1503.7697, 35.6614>> // road leading to the loop facing away from heli so it will just drive off it warped to fReturnHeading = 124.0994 RETURN TRUE BREAK CASE STATIC_BLIP_AMBIENT_BASEJUMP_NORTH_CLIFF vReturnCoord = <<-203.2552, 6536.0894, 10.0979>> // carpark leading to jetty fReturnHeading = 311.0677 RETURN TRUE BREAK CASE STATIC_BLIP_AMBIENT_BASEJUMP_MAZE_BANK vReturnCoord = <<-142.3670, -895.0251, 28.1910>> // entrance to building fReturnHeading = 71.6555 RETURN TRUE BREAK // not needed //CASE STATIC_BLIP_AMBIENT_BASEJUMP_CRANE //BREAK CASE STATIC_BLIP_AMBIENT_BASEJUMP_RIVER_CLIFF vReturnCoord = <<-1214.2524, 4629.8872, 133.8730>> // North of the peak, height side fReturnHeading = 123.1562 RETURN TRUE BREAK CASE STATIC_BLIP_AMBIENT_BASEJUMP_RUNAWAY_TRAIN vReturnCoord = <<-767.9527, 4521.8818, 91.6871>> // road near the chopper (right side of the river) fReturnHeading = 85.6363 RETURN TRUE BREAK // not needed - pack against a post near the road //CASE STATIC_BLIP_AMBIENT_BASEJUMP_GOLF_COURSE //BREAK CASE STATIC_BLIP_AMBIENT_BASEJUMP_1K vReturnCoord = <<-1363.1832, 4468.6914, 23.1468>> // One the road near the chopper (right side of the river) fReturnHeading = 272.2546 RETURN TRUE BREAK CASE STATIC_BLIP_AMBIENT_BASEJUMP_1_5K vReturnCoord = <<2477.0884, 4948.6772, 44.0936>> // One the road near the barn entrance fReturnHeading = 49.3948 RETURN TRUE BREAK CASE STATIC_BLIP_AMBIENT_BASEJUMP_CANAL vReturnCoord = <<1047.9314, -203.8790, 69.0164>> // One the road side near the chopper fReturnHeading = 62.0197 RETURN TRUE BREAK // not needed - handled by taxi ARE_COORDS_IN_SPECIAL_AREA checks //CASE STATIC_BLIP_AMBIENT_BASEJUMP_ROCK_CLIFF //BREAK CASE STATIC_BLIP_MINIGAME_TRIATHLON1 // B*1861605 - triathlon vespucci vReturnCoord = <<-1200.8625, -2049.4602, 12.9248>> // dead end road behind sign up stand (facing back out to main road) fReturnHeading = 334.9650 RETURN TRUE BREAK CASE STATIC_BLIP_MINIGAME_COUNTRY_RACE vReturnCoord = <<1960.3881, 3124.7971, 46.8770>> fReturnHeading = 233.4840 RETURN TRUE BREAK ENDSWITCH RETURN FALSE ENDFUNC /// PURPOSE: /// checks through SP_MISSIONS, RCMs and Minigames to check if the vTestCoords is inside a trigger area /// If so it updates the destination to use a custom drop off position and heading /// PARAMS: /// vTestCoords - position to test /// vReturnCoord - the updated custom taxi drop off coords /// fReturnHeading - the updated custom taxi drop off heading /// RETURNS: /// TRUE if the taxi destination was updated to use a custom drop off FUNC BOOL UPDATE_TAXI_DESTINATION_IF_INSIDE_A_TRIGGER_AREA(VECTOR vTestCoords, VECTOR &vReturnCoord, FLOAT &fReturnHeading) FLOAT fClosestStoryMissionDist = 99999999 FLOAT fClosestRCMissionDist = 99999999 FLOAT fClosestMinigameDist = 99999999 GET_CLOSEST_ACTIVE_STORY_MISSION(vTestCoords, eStoryMissionDestination, fClosestStoryMissionDist) GET_CLOSEST_ACTIVE_RC_MISSION(vTestCoords, eRCMissionDestination, fClosestRCMissionDist) GET_CLOSEST_ACTIVE_MINIGAME_BLIP(vTestCoords, eMinigameDestination, fClosestMinigameDist) // closest blip is SP mission IF fClosestStoryMissionDist < fClosestRCMissionDist AND fClosestStoryMissionDist < fClosestMinigameDist // test if the current desination would auto trigger the mission IF ARE_COORDS_IN_SPECIFIC_SP_MISSION_TRIGGER_AREA(eStoryMissionDestination, vTestCoords) // retreve a custom drop off coord and heading for the SP mission IF GET_CUSTOM_TAXI_DROP_OFF_FOR_SP_MISSION(eStoryMissionDestination, vReturnCoord, fReturnHeading) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : UPDATE_TAXI_DESTINATION_IF_INSIDE_A_TRIGGER_AREA : RETURN TRUE Destination in SP mission trigger area : vTestCoords = ", vTestCoords, " vReturnCoord = ", vReturnCoord, " fReturnHeading = ", fReturnHeading) RETURN TRUE ELSE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : UPDATE_TAXI_DESTINATION_IF_INSIDE_A_TRIGGER_AREA : Destination detected inside trigger area but unable to retreive custom drop off") ENDIF ELSE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : UPDATE_TAXI_DESTINATION_IF_INSIDE_A_TRIGGER_AREA : Destination wasn't inside closest SP mission trigger area") ENDIF // closest blip is RCM ELIF fClosestRCMissionDist < fClosestStoryMissionDist AND fClosestRCMissionDist < fClosestMinigameDist // test if the current desination would auto trigger the mission IF ARE_COORDS_IN_SPECIFIC_RC_MISSION_TRIGGER_AREA(eRCMissionDestination, vTestCoords) // retreve a custom drop off coord and heading for the RC mission IF GET_CUSTOM_TAXI_DROP_OFF_FOR_RC_MISSION(eRCMissionDestination, vReturnCoord, fReturnHeading) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : UPDATE_TAXI_DESTINATION_IF_INSIDE_A_TRIGGER_AREA : RETURN TRUE Destination in RC mission trigger area : vTestCoords = ", vTestCoords, " vReturnCoord = ", vReturnCoord, " fReturnHeading = ", fReturnHeading) RETURN TRUE ELSE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : UPDATE_TAXI_DESTINATION_IF_INSIDE_A_TRIGGER_AREA : Destination detected inside RC mission trigger area but unable to retreive custom drop off") ENDIF ELSE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : UPDATE_TAXI_DESTINATION_IF_INSIDE_A_TRIGGER_AREA : Destination wasn't inside closest RC mission trigger area") ENDIF // closest minigame ELIF fClosestMinigameDist != 99999999 // test if the current desination would trigger the minigame IF ARE_COORDS_IN_SPECIFIC_MINIGAME_TRIGGER_AREA(eMinigameDestination, vTestCoords) // retreve a custom drop off coord and heading for the minigame IF GET_CUSTOM_TAXI_DROP_OFF_FOR_MINIGAME(eMinigameDestination, vReturnCoord, fReturnHeading) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : UPDATE_TAXI_DESTINATION_IF_INSIDE_A_TRIGGER_AREA : RETURN TRUE Destination in minigame trigger area : vTestCoords = ", vTestCoords, " vReturnCoord = ", vReturnCoord, " fReturnHeading = ", fReturnHeading) RETURN TRUE ELSE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : UPDATE_TAXI_DESTINATION_IF_INSIDE_A_TRIGGER_AREA : Destination detected inside minigame trigger area but unable to retreive custom drop off") ENDIF ELSE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : UPDATE_TAXI_DESTINATION_IF_INSIDE_A_TRIGGER_AREA : Destination wasn't inside closest minigame trigger area") ENDIF ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// generates the drop off destination position and heading the taxi should use for droppping the player off /// Handles checks for desination being inside a mission /rc trigger range or being inside a special area /// PARAMS: /// inBlip - the blip selected by the player to travel to /// vReturnCoord - the returned drop off position /// fReturnHeading - the returned drop off heading /// RETURNS: /// RETURN if a position as generated successfully FUNC BOOL GENERATE_TAXI_DROP_OFF_PLAYER_DESTINATION(BLIP_INDEX &inBlip, VECTOR &vReturnCoord, FLOAT &fReturnHeading) VECTOR vTempDist IF DOES_BLIP_EXIST(inBlip) // switch to stagger the blip checks over a few frames SWITCH eGenerateSafeDestinationState // initial checks to see if the destination is inside a mission / rc trigger area. Also checks if destination is the mission custom blip CASE TAXI_GSDS_INITIAL_TRIGGER_AREAS_CHECK parkTypeTaxiAtDestination = PARK_TYPE_PULL_OVER // standard behaviour if the destination is generated. If scripted use PARK_TYPE_PULL_OVER_IMMEDIATE vDestinationLocate = GET_RADAR_BLIP_COORDS(inBlip) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : GENERATE_TAXI_DROP_OFF_PLAYER_DESTINATION : vDestinationLocate = ", vDestinationLocate) // if this is a mission blip which has been setup to use the custom drop off we don't need to calculate drop off coords IF DOES_BLIP_EXIST(g_CustomDropOffBlip) AND (inBlip = g_CustomDropOffBlip) vReturnCoord = g_vCustomDropPosition fReturnHeading = g_fCustomDropHeading vTempDist = vDestinationLocate - vReturnCoord vTempDist.z = 0.0 fDropOffDistFromBlip = VMAG(vTempDist) parkTypeTaxiAtDestination = PARK_TYPE_PULL_OVER_IMMEDIATE // standard behaviour if the destination is generated. If scripted use PARK_TYPE_PULL_OVER_IMMEDIATE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : GENERATE_TAXI_DROP_OFF_PLAYER_DESTINATION : RETURN TRUE g_CustomDropOffBlip : vDestinationLocate = ", vDestinationLocate, " vReturnCoord = ", vReturnCoord, " fReturnHeading = ", fReturnHeading, " fDropOffDistFromBlip = ", fDropOffDistFromBlip) eGenerateSafeDestinationState = TAXI_GSDS_SAFE_DESTINATION_FOUND RETURN TRUE ELSE // check the location isn't inside a mission / rc trigger area. If it is a custom drop off coords and heading are given IF UPDATE_TAXI_DESTINATION_IF_INSIDE_A_TRIGGER_AREA(vDestinationLocate, vReturnCoord, fReturnHeading) vTempDist = vDestinationLocate - vReturnCoord vTempDist.z = 0.0 fDropOffDistFromBlip = VMAG(vTempDist) parkTypeTaxiAtDestination = PARK_TYPE_PULL_OVER_IMMEDIATE // standard behaviour if the destination is generated. If scripted use PARK_TYPE_PULL_OVER_IMMEDIATE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : GENERATE_TAXI_DROP_OFF_PLAYER_DESTINATION : RETURN TRUE taxi destination updated for trigger area ", " vDestinationLocate = ", vDestinationLocate, " fDropOffDistFromBlip = ", fDropOffDistFromBlip) eGenerateSafeDestinationState = TAXI_GSDS_SAFE_DESTINATION_FOUND RETURN TRUE ENDIF eGenerateSafeDestinationState = TAXI_GSDS_INITIAL_SPECIAL_AREA_CHECK RETURN FALSE ENDIF BREAK // check the location isn't in one of the speical areas. If it is a custom drop off coords and heading are given CASE TAXI_GSDS_INITIAL_SPECIAL_AREA_CHECK IF ARE_COORDS_IN_SPECIAL_AREA(vDestinationLocate, vReturnCoord, fReturnHeading) vTempDist = vDestinationLocate - vReturnCoord vTempDist.z = 0.0 fDropOffDistFromBlip = VMAG(vTempDist) parkTypeTaxiAtDestination = PARK_TYPE_PULL_OVER_IMMEDIATE // standard behaviour if the destination is generated. If scripted use PARK_TYPE_PULL_OVER_IMMEDIATE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : GENERATE_TAXI_DROP_OFF_PLAYER_DESTINATION : RETURN TRUE destination was in special area : vDestinationLocate = ", vDestinationLocate, " vReturnCoord = ", vReturnCoord, " fReturnHeading = ", fReturnHeading, " fDropOffDistFromBlip = ", fDropOffDistFromBlip) eGenerateSafeDestinationState = TAXI_GSDS_SAFE_DESTINATION_FOUND RETURN TRUE ELSE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : GENERATE_TAXI_DROP_OFF_PLAYER_DESTINATION : Destination isn't inside a special area") iDesinationNodeSearchNumber = 0 // reset readt for node checks eGenerateSafeDestinationState = TAXI_GSDS_GENERATE_COORDS RETURN FALSE ENDIF BREAK // generate the taxi's drop off destination CASE TAXI_GSDS_GENERATE_COORDS IF DOES_ENTITY_EXIST(g_WaitingTaxi) IF GET_TAXI_PULL_IN_SPOT_NEAR_COORDS(g_WaitingTaxi, GET_ENTITY_COORDS(g_WaitingTaxi, FALSE), vDestinationLocate, vReturnCoord, fReturnHeading, iDesinationNodeSearchNumber, inBlip) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : GENERATE_TAXI_DROP_OFF_PLAYER_DESTINATION : drop off coords generated : vDestinationLocate = ", vDestinationLocate, " vReturnCoord = ", vReturnCoord, " fReturnHeading = ", fReturnHeading, " fDropOffDistFromBlip = ", fDropOffDistFromBlip) eGenerateSafeDestinationState = TAXI_GSDS_TRIGGER_AREAS_RECHECK RETURN FALSE ELSE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : GENERATE_TAXI_DROP_OFF_PLAYER_DESTINATION : generating drop off destination...") //eGenerateSafeDestinationState = TAXI_GSDS_SAFE_DESTINATION_NOT_FOUND RETURN FALSE ENDIF ELSE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : GENERATE_TAXI_DROP_OFF_PLAYER_DESTINATION : return FALSE : taxi doesn't exist!") ENDIF BREAK // recheck the generated coords aren't now with in a trigger area. If it is a custom drop off coords and heading are given CASE TAXI_GSDS_TRIGGER_AREAS_RECHECK IF UPDATE_TAXI_DESTINATION_IF_INSIDE_A_TRIGGER_AREA(vReturnCoord, vReturnCoord, fReturnHeading) vTempDist = vDestinationLocate - vReturnCoord vTempDist.z = 0.0 fDropOffDistFromBlip = VMAG(vTempDist) parkTypeTaxiAtDestination = PARK_TYPE_PULL_OVER_IMMEDIATE // standard behaviour if the destination is generated. If scripted use PARK_TYPE_PULL_OVER_IMMEDIATE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : GENERATE_TAXI_DROP_OFF_PLAYER_DESTINATION : Generated taxi destination was inside a trigger area updated for trigger area ", " vDestinationLocate = ", vDestinationLocate, " fDropOffDistFromBlip = ", fDropOffDistFromBlip) ELSE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : GENERATE_TAXI_DROP_OFF_PLAYER_DESTINATION : Generated taxi destination was not inside a trigger area updated for trigger area ", " vDestinationLocate = ", vDestinationLocate, " fDropOffDistFromBlip = ", fDropOffDistFromBlip) ENDIF eGenerateSafeDestinationState = TAXI_GSDS_SAFE_DESTINATION_FOUND RETURN TRUE BREAK CASE TAXI_GSDS_SAFE_DESTINATION_FOUND RETURN TRUE BREAK CASE TAXI_GSDS_SAFE_DESTINATION_NOT_FOUND BREAK ENDSWITCH ELSE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : GENERATE_TAXI_DROP_OFF_PLAYER_DESTINATION : return FALSE : blip doesn't exist!") ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// check through the passenger seats using IS_VEHICLE_SEAT_FREE /// PARAMS: /// vehIndex - vehicle to test /// RETURNS: /// VS_ANY_PASSENGER if no valid free seat was found FUNC VEHICLE_SEAT GET_FIRST_FREE_PASSENGER_SEAT(VEHICLE_INDEX &vehIndex) IF DOES_ENTITY_EXIST(vehIndex) IF NOT IS_ENTITY_DEAD(vehIndex) IF IS_VEHICLE_SEAT_FREE(vehIndex, VS_FRONT_RIGHT) RETURN VS_FRONT_RIGHT ENDIF IF IS_VEHICLE_SEAT_FREE(vehIndex, VS_BACK_LEFT) RETURN VS_BACK_LEFT ENDIF IF IS_VEHICLE_SEAT_FREE(vehIndex, VS_BACK_RIGHT) RETURN VS_BACK_RIGHT ENDIF ENDIF ENDIF RETURN VS_ANY_PASSENGER ENDFUNC PROC SET_GROUP_INTO_CAB(VEHICLE_SEAT eReservedPlayerSeat) INT i, j PED_INDEX GroupPedID VEHICLE_SEAT eTargetSeat // if any group members they should also get in taxi IF DOES_GROUP_EXIST(PLAYER_GROUP_ID()) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " SET_GROUP_INTO_CAB : ", " DOES_GROUP_EXIST(PLAYER_GROUP_ID())") GET_GROUP_SIZE(PLAYER_GROUP_ID(), j, i) IF (i > 0) // ensure the second ped in the group has been placed in the front seat before setting the first ped in the group to the back IF (i > 1) GroupPedID = GET_PED_AS_GROUP_MEMBER(PLAYER_GROUP_ID(), 1) IF NOT IS_PED_INJURED(GroupPedID) IF NOT IS_PED_SITTING_IN_VEHICLE(GroupPedID, g_WaitingTaxi) eTargetSeat = VS_FRONT_RIGHT // if the seat is already occupied find another IF NOT IS_VEHICLE_SEAT_FREE(g_WaitingTaxi, eTargetSeat) eTargetSeat = GET_FIRST_FREE_PASSENGER_SEAT(g_WaitingTaxi) IF IS_VEHICLE_SEAT_FREE(g_WaitingTaxi, eTargetSeat) CLEAR_PED_TASKS(GroupPedID) SET_PED_INTO_VEHICLE(GroupPedID, g_WaitingTaxi, eTargetSeat) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " SET_GROUP_INTO_CAB : ", " 2nd buddy : set into taxi as passenger in backup seat = ", eTargetSeat) ENDIF ELSE CLEAR_PED_TASKS(GroupPedID) SET_PED_INTO_VEHICLE(GroupPedID, g_WaitingTaxi, eTargetSeat) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " SET_GROUP_INTO_CAB : ", " 2nd buddy : set into taxi as passenger in prefered seat = ", eTargetSeat) ENDIF ELSE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " SET_GROUP_INTO_CAB : ", " 2nd buddy : already in the taxi") ENDIF ENDIF ENDIF // set the first ped in the group into the taxi (prefered back seat with the player) GroupPedID = GET_PED_AS_GROUP_MEMBER(PLAYER_GROUP_ID(), 0) IF NOT IS_PED_INJURED(GroupPedID) IF NOT IS_PED_SITTING_IN_VEHICLE(GroupPedID, g_WaitingTaxi) CLEAR_PED_TASKS(GroupPedID) // set target seat (opposite to player's reserved seat) eTargetSeat = VS_BACK_LEFT IF eReservedPlayerSeat = VS_BACK_LEFT eTargetSeat = VS_BACK_RIGHT ENDIF // if the seat is already occupied find another IF NOT IS_VEHICLE_SEAT_FREE(g_WaitingTaxi, eTargetSeat) eTargetSeat = GET_FIRST_FREE_PASSENGER_SEAT(g_WaitingTaxi) IF IS_VEHICLE_SEAT_FREE(g_WaitingTaxi, eTargetSeat) CLEAR_PED_TASKS(GroupPedID) SET_PED_INTO_VEHICLE(GroupPedID, g_WaitingTaxi, eTargetSeat) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " SET_GROUP_INTO_CAB : ", " 1st buddy : set into taxi as passenger backup seat = ", eTargetSeat) ENDIF ELSE CLEAR_PED_TASKS(GroupPedID) SET_PED_INTO_VEHICLE(GroupPedID, g_WaitingTaxi, eTargetSeat) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " SET_GROUP_INTO_CAB : ", " 1st buddy : set into taxi as passenger prefered seat = ", eTargetSeat) ENDIF ELSE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " SET_GROUP_INTO_CAB : ", " 1st buddy : already in the taxi") ENDIF ENDIF ENDIF ENDIF ENDPROC PROC UPDATE_THE_FARE() iFareTimer += ROUND(GET_FRAME_TIME() * 1000.0) IF (iFareTimer > 5000) fFare += fFareRate iFareTimer = 0 ENDIF IF (GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID(), FALSE), vLastFarePoint, FALSE) > FARE_DISTANCE) fFare += fFareRate iFareTimer = 0 vLastFarePoint = GET_ENTITY_COORDS(PLAYER_PED_ID(), FALSE) ENDIF currentJourneyPrice = CEIL(fFare) IF currentJourneyPrice <> lastJourneyPrice BEGIN_SCALEFORM_MOVIE_METHOD(scaleformTaxiMeter,"SET_TAXI_PRICE") SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(currentJourneyPrice) END_SCALEFORM_MOVIE_METHOD() fDistanceToDestination = VDIST(GET_ENTITY_COORDS(PLAYER_PED_ID(), FALSE), g_vTaxiDropOffPosition) lastJourneyPrice = currentJourneyPrice CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), "UPDATE_THE_FARE() : currentJourneyPrice = ", currentJourneyPrice) ENDIF ENDPROC FUNC FLOAT GET_DISTANCE_OF_JOURNEY(VECTOR vStart, VECTOR vEnd) RETURN(VMAG(vEnd - vStart) * 1.3) ENDFUNC /// PURPOSE: /// B*1211249 - estimates the distance from thep player to the destination blip and increments PROC UPDATE_DIST_TRAVELED_IN_TAXI_STAT_FOR_SKIP() STATSENUM eDistAsTaxiPassengerStat SWITCH charWhenTaxiLaunched CASE CHAR_MICHAEL eDistAsTaxiPassengerStat = SP0_DIST_AS_PASSENGER_TAXI BREAK CASE CHAR_FRANKLIN eDistAsTaxiPassengerStat = SP1_DIST_AS_PASSENGER_TAXI BREAK CASE CHAR_TREVOR eDistAsTaxiPassengerStat = SP2_DIST_AS_PASSENGER_TAXI BREAK DEFAULT IF NOT IS_CURRENTLY_ON_MISSION_OF_TYPE (MISSION_TYPE_DIRECTOR) SCRIPT_ASSERT(" taxiService.sc : UPDATE_DIST_TRAVELED_IN_TAXI_STAT_FOR_SKIP() : invalid player char ID ") ENDIF BREAK ENDSWITCH IF NOT IS_CURRENTLY_ON_MISSION_OF_TYPE (MISSION_TYPE_DIRECTOR) FLOAT fEstimatedDistToAdd = CALCULATE_TRAVEL_DISTANCE_BETWEEN_POINTS(GET_ENTITY_COORDS(PLAYER_PED_ID()), g_vTaxiDropOffPosition) STAT_INCREMENT(eDistAsTaxiPassengerStat, fEstimatedDistToAdd) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : UPDATE_DIST_TRAVELED_IN_TAXI_STAT_FOR_SKIP() : fEstimatedDistToAdd = ", fEstimatedDistToAdd) ENDIF /*FLOAT fEstimatedDistToAdd = GET_GPS_DISTANCE(g_vTaxiDropOffPosition) FLOAT fTotal IF STAT_GET_FLOAT(eDistAsTaxiPassengerStat, fTotal) fTotal += fEstimatedDistToAdd STAT_SET_FLOAT(eDistAsTaxiPassengerStat, fTotal) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : UPDATE_DIST_TRAVELED_IN_TAXI_STAT_FOR_SKIP() : fEstimatedDistToAdd = ", fEstimatedDistToAdd, " new total = ", fTotal) ELSE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : UPDATE_DIST_TRAVELED_IN_TAXI_STAT_FOR_SKIP() : failed STAT_GET_FLOAT returned FALSE") ENDIF*/ ENDPROC PROC CALCULATE_SKIP_COST() FLOAT fTemp INT i fTemp = (GET_DISTANCE_OF_JOURNEY(GET_ENTITY_COORDS(PLAYER_PED_ID(), FALSE), g_vTaxiDropOffPosition) / 50.0) * fFareRate * FARE_SKIP_MULTIPLIER i = FLOOR(fFare) + ROUND(fTemp) // add on another third fTemp = TO_FLOAT(i) fTemp *= 1.33 i = ROUND(fTemp) currentJourneyPrice += i fFare += currentJourneyPrice UPDATE_THE_FARE() //CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " CALCULATE_SKIP_COST() : currentJourneyPrice = ", currentJourneyPrice, ", g_vTaxiDropOffPosition = ", g_vTaxiDropOffPosition) ENDPROC PROC CALCULATE_AND_APPLY_TIME_PASSED() FLOAT fTemp INT iHours = 0 INT iMinutes = 0 IF iHours = 0 IF iMinutes = 0 ENDIF ENDIF fTemp = GET_DISTANCE_OF_JOURNEY(GET_ENTITY_COORDS(PLAYER_PED_ID(), FALSE), g_vTaxiDropOffPosition) IF bHurrying iHours = FLOOR((fTemp / 200.0 ) / 60.0) iMinutes = ROUND((fTemp / 200.0 ) - (60.0 * TO_FLOAT(iHours))) ELSE iHours = FLOOR((fTemp / 100.0 ) / 60.0) iMinutes = ROUND((fTemp / 100.0 ) - (60.0 * TO_FLOAT(iHours))) ENDIF CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " CALCULATE_AND_APPLY_TIME_PASSED() : iHours = ", iHours, ", iMinutes = ", iMinutes) ADD_TO_CLOCK_TIME(iHours, iMinutes, 0) ADVANCE_FRIEND_TIMERS(TO_FLOAT((iHours*60)+iMinutes)/60.0) ENDPROC FUNC BOOL IS_TAXI_AT_DESTINATION() IF IS_ENTITY_AT_COORD(g_WaitingTaxi, g_vTaxiDropOffPosition, << TAXI_TARGET_REACHED_DIST, TAXI_TARGET_REACHED_DIST, 20 >>) // <<20, 20, 15>>) increased size for B*1379650 - jMart said services check for task finished and in range of 50m to destination OR bTaxiHasHitDestinationLocate OR (eTaxiJourneyState = TAXI_JOURNEY_STATE_SKIP_JOURNEY) bTaxiHasHitDestinationLocate = TRUE IF GET_SCRIPT_TASK_STATUS(g_WaitingTaxiDriver, SCRIPT_TASK_PERFORM_SEQUENCE) = FINISHED_TASK RETURN TRUE ENDIF ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// test if the current player ped owns the taxi lot property /// RETURNS: /// TRUE if they do FUNC BOOL IS_TAXI_LOT_OWNED_BY_CURRENT_PLAYER() IF GET_CURRENT_PROPERTY_OWNER(PROPERTY_TAXI_LOT) = GET_CURRENT_PLAYER_PED_ENUM() CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), "IS_TAXI_LOT_OWNED_BY_CURRENT_PLAYER retuirning TRUE") RETURN TRUE ENDIF RETURN FALSE ENDFUNC PROC ATTEMPT_PAYMENT() // B*1082174 - if the player owns the taxi lot, they don't get charged to ride a taxi IF IS_VEHICLE_DRIVEABLE(g_WaitingTaxi) IF NOT IS_PED_INJURED(g_WaitingTaxiDriver) IF IS_PED_SITTING_IN_VEHICLE(g_WaitingTaxiDriver, g_WaitingTaxi) IF NOT IS_TAXI_LOT_OWNED_BY_CURRENT_PLAYER() BOOL bNoMoney = TRUE IF GET_TOTAL_CASH(GET_CURRENT_PLAYER_PED_ENUM()) >= currentJourneyPrice IF bMadeItToDestination IF currentJourneyPrice > INITIAL_PRICE IF fDropOffDistFromBlip > 75.0 eTaxiDialogue = TAXI_DIALOGUE_CLOSE_AS_POSS // set dialogue to trigger in PLAY_TAXI_DIALOGUE() ELSE eTaxiDialogue = TAXI_DIALOGUE_ARRIVE // set dialogue to trigger in PLAY_TAXI_DIALOGUE() ENDIF PLAY_TAXI_DIALOGUE(g_WaitingTaxiDriver, eTaxiDialogue) DEBIT_BANK_ACCOUNT(GET_CURRENT_PLAYER_PED_ENUM(), BAAC_TAXI, currentJourneyPrice) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), "ATTEMPT_PAYMENT() TAXI_DIALOGUE_ARRIVE journey price paid.") bNoMoney = FALSE ENDIF ELIF bPlayerCanLeaveVehicle OR eTaxiJourneyState = TAXI_JOURNEY_STATE_ORDERED_TO_PULLOVER IF currentJourneyPrice > INITIAL_PRICE eTaxiDialogue = TAXI_DIALOGUE_OUT_EARLY // set dialogue to trigger in PLAY_TAXI_DIALOGUE() PLAY_TAXI_DIALOGUE(g_WaitingTaxiDriver, eTaxiDialogue) DEBIT_BANK_ACCOUNT(GET_CURRENT_PLAYER_PED_ENUM(), BAAC_TAXI, currentJourneyPrice) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), "ATTEMPT_PAYMENT() TAXI_DIALOGUE_OUT_EARLY journey price paid.") bNoMoney = FALSE ENDIF ELSE IF GET_ENTITY_SPEED(g_WaitingTaxi) > 5.0 // player bailed out without paying IF NOT IS_REPLAY_BEING_PROCESSED() //B* 1976297: Don't give wanted level if skipping journey when the replay screen appears eTaxiDialogue = TAXI_DIALOGUE_RUN_AWAY // set dialogue to trigger in PLAY_TAXI_DIALOGUE() PLAY_TAXI_DIALOGUE(g_WaitingTaxiDriver, eTaxiDialogue) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), "ATTEMPT_PAYMENT() journey price not paid. - player bailed out") SET_PLAYER_WANTED_LEVEL_NO_DROP(PLAYER_ID(), 1) SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID()) ENDIF ELSE eTaxiDialogue = TAXI_DIALOGUE_OUT_EARLY // set dialogue to trigger in PLAY_TAXI_DIALOGUE() PLAY_TAXI_DIALOGUE(g_WaitingTaxiDriver, eTaxiDialogue) IF currentJourneyPrice > INITIAL_PRICE DEBIT_BANK_ACCOUNT(GET_CURRENT_PLAYER_PED_ENUM(), BAAC_TAXI, currentJourneyPrice) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), "ATTEMPT_PAYMENT() TAXI_DIALOGUE_OUT_EARLY journey price paid.") ELSE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), "ATTEMPT_PAYMENT() AXI_DIALOGUE_OUT_EARLY nothing to pay.") ENDIF bNoMoney = FALSE ENDIF ENDIF ENDIF IF bNoMoney IF currentJourneyPrice > INITIAL_PRICE eTaxiDialogue = TAXI_DIALOGUE_NO_MONEY // set dialogue to trigger in PLAY_TAXI_DIALOGUE() PLAY_TAXI_DIALOGUE(g_WaitingTaxiDriver, eTaxiDialogue) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), "ATTEMPT_PAYMENT() journey price not paid. - no money") SET_PLAYER_WANTED_LEVEL_NO_DROP(PLAYER_ID(), 1) SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID()) ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDPROC FUNC BOOL IS_TAXI_WAITING_FOR_THIS_RC_MISSION(g_eRC_MissionIDs eRCMission) // An RCM is nearby and ready to play IF (eRCMission <> NO_RC_MISSION) // Initial scene hasn't yet been created IF NOT (g_RandomChars[ENUM_TO_INT(eRCMission)].rcIsAwaitingTrigger) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " IS_TAXI_WAITING_FOR_THIS_RC_MISSION() is waiting for RCM index = ", ENUM_TO_INT(eRCMission)) RETURN TRUE ENDIF ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// spliting up from SEND_TAXI_TO_DESTINATION - func needs alot more work when i have time /// RETURNS: /// TRUE if destination has been selected FUNC BOOL HAS_PLAYER_SELECTED_DESTINATION() IF bDestinationSelected IF bDropPointSelected RETURN TRUE ELSE IF GENERATE_TAXI_DROP_OFF_PLAYER_DESTINATION(currentTaxiDestination.BlipID, g_vTaxiDropOffPosition, g_fTaxiDropOffHeading) // reset the fare conditions ready for journey iFareTimer = 0 vLastFarePoint = GET_ENTITY_COORDS(PLAYER_PED_ID(), FALSE) fDistanceToDestination = VDIST(GET_ENTITY_COORDS(PLAYER_PED_ID(), FALSE), g_vTaxiDropOffPosition) // 1511984 - update ready for skip control check bDropPointSelected = TRUE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : HAS_PLAYER_SELECTED_DESTINATION() pull in spot near blip selected ", " g_vTaxiDropOffPosition = ", g_vTaxiDropOffPosition, " g_fTaxiDropOffHeading = ", g_fTaxiDropOffHeading) RETURN TRUE ENDIF ENDIF ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// set's the taxi driver playing the turn around animations ending in looped look at passenger /// RETURNS: /// TRUE if applied FUNC BOOL SET_DRIVER_PLAY_TURN_AROUND_ANIM() IF NOT IS_PED_INJURED(g_WaitingTaxiDriver) AND IS_VEHICLE_DRIVEABLE(g_WaitingTaxi) IF IS_PED_SITTING_IN_VEHICLE(g_WaitingTaxiDriver, g_WaitingTaxi) REQUEST_ANIM_DICT(tlAnimDictTaxiDriver) IF HAS_ANIM_DICT_LOADED(tlAnimDictTaxiDriver) // B*1563479 - ensure look at is cleared for these anims so he doesn't twist his neck too far IF IS_PED_HEADTRACKING_PED(g_WaitingTaxiDriver, PLAYER_PED_ID()) TASK_CLEAR_LOOK_AT(g_WaitingTaxiDriver) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : SET_DRIVER_PLAY_TURN_AROUND_ANIM cleared look at ready for anim") ENDIF OPEN_SEQUENCE_TASK(seqTaxi) TASK_PLAY_ANIM(NULL, tlAnimDictTaxiDriver, "leanover_enter", SLOW_BLEND_IN, NORMAL_BLEND_OUT, -1) TASK_PLAY_ANIM(NULL, tlAnimDictTaxiDriver, "leanover_idle", SLOW_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING) CLOSE_SEQUENCE_TASK(seqTaxi) TASK_PERFORM_SEQUENCE(g_WaitingTaxiDriver, seqTaxi) CLEAR_SEQUENCE_TASK(seqTaxi) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : SET_DRIVER_PLAY_TURN_AROUND_ANIM return TRUE") RETURN TRUE ENDIF ENDIF ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// determine if group members are still trying to enter the taxi /// and task them to get in. can time out if /// NOTE: doesn't safety check g_WaitingTaxi /// NOTE: setup mirrors parts of SET_PLAYER_GROUP_MEMBERS_INTO_TAXI used by taxi launcher /// PARAMS: /// iTimeOut - /// eReservedPlayerSeat - Seat which player will be using /// RETURNS: /// TRUE if taxi driver shouln't drive off yet FUNC BOOL SHOULD_TAXI_WAIT_FOR_PLAYER_GROUP_MEMBERS_TO_ENTER(INT &iTimeOut, VEHICLE_SEAT eReservedPlayerSeat) IF HAS_TIME_PASSED(iTimeOut, 2000) OR iTimeOut = -1 RETURN FALSE ENDIF // no group to wait for IF NOT DOES_GROUP_EXIST(PLAYER_GROUP_ID()) iTimeOut = -1 RETURN FALSE ENDIF INT i, j GET_GROUP_SIZE(PLAYER_GROUP_ID(), j, i) // no group members IF (i < 1) iTimeOut = -1 RETURN FALSE ENDIF PED_INDEX tempPed PED_INDEX GroupPedID BOOL bApplyEnterTask = TRUE BOOL bFoundReasonForTaxiToWait = FALSE VEHICLE_SEAT eTargetSeat // check first member GroupPedID = GET_PED_AS_GROUP_MEMBER(PLAYER_GROUP_ID(), 0) IF NOT IS_PED_INJURED(GroupPedID) // set target seat (opposite to player's reserved seat) eTargetSeat = VS_BACK_LEFT IF eReservedPlayerSeat = VS_BACK_LEFT eTargetSeat = VS_BACK_RIGHT ENDIF bApplyEnterTask = TRUE // don't allow task if needing to jack player, or if ped is already in the seat / entering tempPed = GET_PED_IN_VEHICLE_SEAT(g_WaitingTaxi, eTargetSeat) IF DOES_ENTITY_EXIST(tempPed) // player already sitting in the seat IF (tempPed = PLAYER_PED_ID()) bApplyEnterTask = FALSE CDEBUG2LN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : SHOULD_TAXI_WAIT_FOR_PLAYER_GROUP_MEMBERS_TO_ENTER : NOT tasked, player sat 1st group member eTargetSeat : ", eTargetSeat) // ped is already sitting in the seat ELIF (tempPed = GroupPedID) bApplyEnterTask = FALSE //CDEBUG1LN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : SHOULD_TAXI_WAIT_FOR_PLAYER_GROUP_MEMBERS_TO_ENTER : NOT tasked, 1st group member already sat in eTargetSeat : ", eTargetSeat) ENDIF ENDIF // don't apply task if config flag is set IF GET_PED_CONFIG_FLAG(GroupPedID, PCF_DontEnterVehiclesInPlayersGroup, FALSE) bApplyEnterTask = FALSE CDEBUG1LN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : SHOULD_TAXI_WAIT_FOR_PLAYER_GROUP_MEMBERS_TO_ENTER : NOT tasked, 1st group member PCF_DontEnterVehiclesInPlayersGroup is set eTargetSeat : ", eTargetSeat) ENDIF // don't apply task if he's already getting in the seat IF TAXI_IS_PED_PERFORMING_TASK(GroupPedID, SCRIPT_TASK_ENTER_VEHICLE) bApplyEnterTask = FALSE bFoundReasonForTaxiToWait = TRUE CDEBUG1LN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : SHOULD_TAXI_WAIT_FOR_PLAYER_GROUP_MEMBERS_TO_ENTER : will return TRUE, 1st group member running enter vehicle task") ENDIF IF bApplyEnterTask //CLEAR_PED_TASKS(GroupPedID) TASK_ENTER_VEHICLE(GroupPedID, g_WaitingTaxi, DEFAULT_TIME_BEFORE_WARP, eTargetSeat, PEDMOVEBLENDRATIO_RUN, ECF_RESUME_IF_INTERRUPTED | ECF_BLOCK_SEAT_SHUFFLING | ECF_DONT_JACK_ANYONE) bFoundReasonForTaxiToWait = TRUE CDEBUG1LN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : SHOULD_TAXI_WAIT_FOR_PLAYER_GROUP_MEMBERS_TO_ENTER : will return TRUE, 1st group member task applied eTargetSeat : ", eTargetSeat) ENDIF ENDIF // if group has two member set second member into front passenger seat IF (i > 1) GroupPedID = GET_PED_AS_GROUP_MEMBER(PLAYER_GROUP_ID(), 1) IF NOT IS_PED_INJURED(GroupPedID) bApplyEnterTask = TRUE eTargetSeat = VS_FRONT_RIGHT // don't allow task if needing to jack player, or if ped is already in the seat / entering tempPed = GET_PED_IN_VEHICLE_SEAT(g_WaitingTaxi, eTargetSeat) IF DOES_ENTITY_EXIST(tempPed) // player already sitting in the seat IF (tempPed = PLAYER_PED_ID()) bApplyEnterTask = FALSE CDEBUG1LN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : SHOULD_TAXI_WAIT_FOR_PLAYER_GROUP_MEMBERS_TO_ENTER : NOT tasked, player sat 2nd group member eTargetSeat : ", eTargetSeat) // ped is already sitting in the seat ELIF (tempPed = GroupPedID) bApplyEnterTask = FALSE //CDEBUG1LN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : SHOULD_TAXI_WAIT_FOR_PLAYER_GROUP_MEMBERS_TO_ENTER : NOT tasked, 2nd group member already sat in eTargetSeat : ", eTargetSeat) ENDIF ENDIF // don't apply task if config flag is set IF GET_PED_CONFIG_FLAG(GroupPedID, PCF_DontEnterVehiclesInPlayersGroup, FALSE) bApplyEnterTask = FALSE CDEBUG1LN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : SHOULD_TAXI_WAIT_FOR_PLAYER_GROUP_MEMBERS_TO_ENTER : NOT tasked, 2nd group member PCF_DontEnterVehiclesInPlayersGroup is set eTargetSeat : ", eTargetSeat) ENDIF // don't apply task if he's already getting in the seat IF TAXI_IS_PED_PERFORMING_TASK(GroupPedID, SCRIPT_TASK_ENTER_VEHICLE) bApplyEnterTask = FALSE bFoundReasonForTaxiToWait = TRUE CDEBUG1LN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : SHOULD_TAXI_WAIT_FOR_PLAYER_GROUP_MEMBERS_TO_ENTER : will return TRUE, 2nd group member running enter vehicle task") ENDIF IF bApplyEnterTask //CLEAR_PED_TASKS(GroupPedID) TASK_ENTER_VEHICLE(GroupPedID, g_WaitingTaxi, DEFAULT_TIME_BEFORE_WARP, eTargetSeat, PEDMOVEBLENDRATIO_RUN, ECF_RESUME_IF_INTERRUPTED | ECF_BLOCK_SEAT_SHUFFLING | ECF_DONT_JACK_ANYONE) bFoundReasonForTaxiToWait = TRUE CDEBUG1LN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : SHOULD_TAXI_WAIT_FOR_PLAYER_GROUP_MEMBERS_TO_ENTER : will return TRUE, 2nd group member task applied eTargetSeat : ", eTargetSeat) ENDIF ENDIF ENDIF IF bFoundReasonForTaxiToWait RETURN TRUE ENDIF RETURN FALSE ENDFUNC PROC SEND_TAXI_TO_DESTINATION() DRIVINGMODE tempTaxiDrivingMode FLOAT fDrivingSpeed IF bDestinationSelected IF bDropPointSelected UPDATE_THE_FARE() IF IS_VEHICLE_DRIVEABLE(g_WaitingTaxi) IF NOT IS_PED_INJURED(g_WaitingTaxiDriver) IF IS_TAXI_AT_DESTINATION() //IF IS_VEHICLE_STOPPED(g_WaitingTaxi) IF GET_ENTITY_SPEED(g_WaitingTaxi) < 2 IF NOT IS_PED_INJURED(PLAYER_PED_ID()) IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), g_WaitingTaxi, TRUE) TASK_LEAVE_ANY_VEHICLE(PLAYER_PED_ID()) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " SEND_TAXI_TO_DESTINATION -> player tasked to leave taxi reached destination") ENDIF ENDIF TASK_VEHICLE_TEMP_ACTION(g_WaitingTaxiDriver, g_WaitingTaxi, TEMPACT_BRAKE, 5000) SET_PED_KEEP_TASK(g_WaitingTaxiDriver, TRUE) bMadeItToDestination = TRUE eTaxiServiceStage = TAXI_SERVICE_END #IF IS_DEBUG_BUILD VECTOR vTempCoords = GET_ENTITY_COORDS(g_WaitingTaxi, FALSE) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : SEND_TAXI_TO_DESTINATION() taxi stopped at : ", vTempCoords, " : g_vTaxiDropOffPosition = ", g_vTaxiDropOffPosition) #ENDIF CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : SEND_TAXI_TO_DESTINATION() IS_TAXI_AT_DESTINATION() -> TAXI_SERVICE_END") ENDIF ELSE // play exit from lean first IF IS_ENTITY_PLAYING_ANIM(g_WaitingTaxiDriver, tlAnimDictTaxiDriver, "leanover_enter") OR IS_ENTITY_PLAYING_ANIM(g_WaitingTaxiDriver, tlAnimDictTaxiDriver, "leanover_idle") // B*1563479 - ensure look at is cleared for these anims so he doesn't twist his neck too far IF IS_PED_HEADTRACKING_PED(g_WaitingTaxiDriver, PLAYER_PED_ID()) TASK_CLEAR_LOOK_AT(g_WaitingTaxiDriver) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : SET_DRIVER_PLAY_TURN_AROUND_ANIM cleared look at ready for anim") ENDIF // wait to reach idle before reverting //IF IS_ENTITY_PLAYING_ANIM(g_WaitingTaxiDriver, tlAnimDictTaxiDriver, "leanover_idle") TASK_PLAY_ANIM(g_WaitingTaxiDriver, tlAnimDictTaxiDriver, "leanover_exit", SLOW_BLEND_IN, SLOW_BLEND_OUT) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : SEND_TAXI_TO_DESTINATION() applied leanover_exit anim on driver FC = ", GET_FRAME_COUNT()) //ENDIF ELIF IS_ENTITY_PLAYING_ANIM(g_WaitingTaxiDriver, tlAnimDictTaxiDriver, "leanover_exit") SET_ENTITY_ANIM_SPEED(g_WaitingTaxiDriver, tlAnimDictTaxiDriver, "leanover_exit", 1.2) // B* 1552508 - speed it up a little take ages to pull off iTimer_WaitForGroupMembers = GET_GAME_TIMER() SET_PLAYER_GROUP_MEMBERS_INTO_TAXI(g_WaitingTaxi, eStoredPlayerSeat) ELSE IF NOT TAXI_IS_PED_PERFORMING_TASK(g_WaitingTaxiDriver, SCRIPT_TASK_PERFORM_SEQUENCE) IF SHOULD_TAXI_WAIT_FOR_PLAYER_GROUP_MEMBERS_TO_ENTER(iTimer_WaitForGroupMembers, eStoredPlayerSeat) IF NOT TAXI_IS_PED_PERFORMING_TASK(g_WaitingTaxiDriver, SCRIPT_TASK_VEHICLE_TEMP_ACTION) TASK_VEHICLE_TEMP_ACTION(g_WaitingTaxiDriver, g_WaitingTaxi, TEMPACT_WAIT, 1000000) ENDIF ELSE bTaxiHasHitDestinationLocate = FALSE IF bHurrying fDrivingSpeed = TAXI_SPEED_FAST tempTaxiDrivingMode = taxiDrivingModeHurry CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : SEND_TAXI_TO_DESTINATION() using hurry setting") ELSE fDrivingSpeed = TAXI_SPEED_NORMAL tempTaxiDrivingMode = taxiDrivingModeStandard ENDIF CLEAR_PED_TASKS(g_WaitingTaxiDriver) TASK_CLEAR_LOOK_AT(g_WaitingTaxiDriver) // B*1282010 - driver always looking at player SET_DRIVER_ABILITY(g_WaitingTaxiDriver, 0.5) OPEN_SEQUENCE_TASK(seqTaxi) TASK_VEHICLE_DRIVE_TO_COORD_LONGRANGE(NULL, g_WaitingTaxi, g_vTaxiDropOffPosition, fDrivingSpeed, tempTaxiDrivingMode, TAXI_TARGET_REACHED_DIST) TASK_VEHICLE_PARK(NULL, g_WaitingTaxi, g_vTaxiDropOffPosition, g_fTaxiDropOffHeading, parkTypeTaxiAtDestination, 60, TRUE) CLOSE_SEQUENCE_TASK(seqTaxi) TASK_PERFORM_SEQUENCE(g_WaitingTaxiDriver, seqTaxi) CLEAR_SEQUENCE_TASK(seqTaxi) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : SEND_TAXI_TO_DESTINATION() drive to destination task drive longrange sequence set : g_vTaxiDropOffPosition = ", g_vTaxiDropOffPosition) ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDPROC FUNC BOOL Is_Any_Nearby_Vehicle_In_Prep_Mission_List(VEHICLE_INDEX &viReturnVeh, VECTOR vCoordsAt, float fRadius) CONST_INT iSearchVehicles 5 MODEL_NAMES vehList[iSearchVehicles] vehList[0]=CRUSADER vehList[1]=BARRACKS vehList[2]=TRASH vehList[3]=BOXVILLE3 vehList[4]=FBI2 INT i //Sequential check for get_nearest_vehicles REPEAT COUNT_OF(vehList) i viReturnVeh = GET_CLOSEST_VEHICLE(vCoordsAt, fRadius, vehList[i], VEHICLE_SEARCH_FLAG_ALLOW_VEHICLE_OCCUPANTS_TO_BE_PERFORMING_A_SCRIPTED_TASK|VEHICLE_SEARCH_FLAG_ALLOW_VEHICLE_OCCUPANTS_TO_BE_PERFORMING_A_NON_DEFAULT_TASK| VEHICLE_SEARCH_FLAG_RETURN_MISSION_VEHICLES|VEHICLE_SEARCH_FLAG_RETURN_RANDOM_VEHICLES) IF viReturnVeh<>NULL CDEBUG1LN(debug_taxi_service,"Found vehicle ",GET_MODEL_NAME_OF_VEHICLE_FOR_DEBUG_ONLY(viReturnVeh)," in range ",fRadius," at ",vCoordsAt) return TRUE ENDIF ENDREPEAT RETURN FALSE ENDFUNC /// PURPOSE: /// Moves taxi away from a moving mission blip PROC SEPARATE_FROM_MOVING_BLIP() VECTOR vTemp FLOAT fTemp SWITCH eStoryMissionDestination //B*-1965573 CASE SP_HEIST_RURAL_PREP_1 vTemp = GET_STATIC_BLIP_POSITION(STATIC_BLIP_MISSION_RURAL_P1) fTemp = GET_DISTANCE_BETWEEN_COORDS(g_vTaxiDropOffPosition,vTemp) IF fTemp < 100 vTemp = NORMALISE_VECTOR(g_vTaxiDropOffPosition-vTemp) vTemp = <> GET_CLOSEST_VEHICLE_NODE_WITH_HEADING(vTemp,g_vTaxiDropOffPosition,g_fTaxiDropOffHeading) SET_ENTITY_COORDS(g_WaitingTaxi, g_vTaxiDropOffPosition) SET_ENTITY_HEADING(g_WaitingTaxi, g_fTaxiDropOffHeading) ENDIF BREAK ENDSWITCH ENDPROC PROC Separate_From_Prep_Mission_Vehicles(FLOAT fRange = 15.0) //If it's not a prep mission, exit the check IF NOT (IS_MISSION_AVAILABLE(SP_HEIST_JEWELRY_PREP_1B) OR IS_MISSION_AVAILABLE(SP_HEIST_JEWELRY_PREP_2A) OR IS_MISSION_AVAILABLE(SP_HEIST_RURAL_PREP_1) OR IS_MISSION_AVAILABLE(SP_MISSION_FBI_4_PREP_1) OR MISSION_FLOW_GET_RUNNING_MISSION() = SP_HEIST_JEWELRY_PREP_1B OR MISSION_FLOW_GET_RUNNING_MISSION() = SP_HEIST_JEWELRY_PREP_2A OR MISSION_FLOW_GET_RUNNING_MISSION() = SP_HEIST_RURAL_PREP_1 OR MISSION_FLOW_GET_RUNNING_MISSION() = SP_MISSION_FBI_4_PREP_1) CPRINTLN(debug_taxi_service,"No prep mission running, exiting check") EXIT ENDIF VEHICLE_INDEX viClosest = NULL BOOL bAreaClearOfVehicles = FALSE int iNode = 1 VECTOR vNewPos = g_vTaxiDropOffPosition WHILE (NOT bAreaClearOfVehicles) AND iNode < 10 //Move taxi ahead bAreaClearOfVehicles = TRUE IF Is_Any_Nearby_Vehicle_In_Prep_Mission_List(viClosest,vNewPos,fRange) bAreaClearOfVehicles = FALSE CDEBUG1LN(debug_taxi_service,"Getting node #",iNode) IF GET_NTH_CLOSEST_VEHICLE_NODE(g_vTaxiDropOffPosition,iNode, vNewPos) CDEBUG1LN(debug_taxi_service,"Found one @ ",vNewPos) iNode+=1 ENDIF ENDIF ENDWHILE //Move taxi if there were vehicles to be cleared IF VDIST2(vNewPos,g_vTaxiDropOffPosition)>2 GET_SAFE_COORD_FOR_PED(vNewPos,FALSE,g_vTaxiDropOffPosition) CPRINTLN(debug_taxi_service,"New taxi dropoff: ",g_vTaxiDropOffPosition) ENDIF ENDPROC /// PURPOSE: /// handles the player choosing to skip to the destination PROC SKIP_JOURNEY_TO_DESTINATION() BOOL bHaveAssetsForTaxiSkipLoaded BOOL bSkipTime FLOAT fGroundZ = 1 // don't allow player controls to interfer during a skip DISABLE_ALL_CONTROL_ACTIONS(PLAYER_CONTROL) DISABLE_ALL_CONTROL_ACTIONS(CAMERA_CONTROL) DISABLE_ALL_CONTROL_ACTIONS(FRONTEND_CONTROL) SWITCH eSkipJourneyState CASE SKIP_JOURNEY_STATE_FADE_OUT DISABLE_CELLPHONE(TRUE) IF HAS_TIME_PASSED(iSkipJourneyTimer, 500) DO_SCREEN_FADE_OUT(250) START_AUDIO_SCENE("FADE_OUT_WORLD_250MS_SCENE") eSkipJourneyState = SKIP_JOURNEY_STATE_FADED_OUT CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " SKIP_JOURNEY_TO_DESTINATION() : eSkipJourneyState = SKIP_JOURNEY_STATE_FADED_OUT") ENDIF BREAK CASE SKIP_JOURNEY_STATE_FADED_OUT IF IS_SCREEN_FADED_OUT() AND IS_AUDIO_SCENE_ACTIVE("FADE_OUT_WORLD_250MS_SCENE") IF IS_VEHICLE_DRIVEABLE(g_WaitingTaxi) SET_VEHICLE_RADIO_ENABLED(g_WaitingTaxi, FALSE) // B*1183700 - radio heard at low level during skip ENDIF CLEAR_PRINTS() RENDER_SCRIPT_CAMS(FALSE,FALSE) // Cleanup the meter is it will no longer be used. IF IS_NAMED_RENDERTARGET_REGISTERED("taxi") RELEASE_NAMED_RENDERTARGET("taxi") ENDIF IF DOES_ENTITY_EXIST(objMeter) DELETE_OBJECT(objMeter) SET_MODEL_AS_NO_LONGER_NEEDED(modelMeter) ENDIF IF IS_CAM_ACTIVE(camMeter) SET_PARTICLE_FX_CAM_INSIDE_VEHICLE(FALSE) // B*1549323 - stops rain inside taxi g_bTaxiShouldForcePhoneDislayOnHud = FALSE // reset global used for B*2053172 - force phone display on HUD SET_CAM_ACTIVE(camMeter, FALSE) RENDER_SCRIPT_CAMS(FALSE, FALSE) UNLOCK_MINIMAP_POSITION() UNLOCK_MINIMAP_ANGLE() SET_RADAR_ZOOM(0) ENDIF SET_GROUP_INTO_CAB(eStoredPlayerSeat) iSkipJourneyTimer = GET_GAME_TIMER() // start the timer which monitors the total amount of time faded down - to ensure we always fade back up IF bSelectingAnotherDestination CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " SKIP_JOURNEY_TO_DESTINATION() : bSelectingAnotherDestination true ") bDropPointSelected = FALSE bSelectingAnotherDestination = FALSE currentTaxiDestination = AllTaxiDestinations[iCurrentHighlightedPosition] CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " SKIP_JOURNEY_TO_DESTINATION() : iCurrentHighlightedPosition = ", iCurrentHighlightedPosition) #IF IS_DEBUG_BUILD IF DOES_BLIP_EXIST(currentTaxiDestination.BlipID) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " SKIP_JOURNEY_TO_DESTINATION() : GET_BLIP_INFO :", GET_BLIP_NAME(currentTaxiDestination.BlipID)) ENDIF #ENDIF ENDIF // if we haven't yet calculated the drop off point do so now to get the warp to coords and heading IF NOT bDropPointSelected iDesinationNodeSearchNumber = 0 eGenerateSafeDestinationState = TAXI_GSDS_INITIAL_TRIGGER_AREAS_CHECK eSkipJourneyState = SKIP_JOURNEY_STATE_WAIT_GEN_DESTINATION_INFO CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " SKIP_JOURNEY_TO_DESTINATION() : eSkipJourneyState = SKIP_JOURNEY_STATE_WAIT_GEN_DESTINATION_INFO") ELSE // B*1392355 - ensure any prestreamed cutscenes at the pickup location are cleaned up before requesting the next or loading scene at a new position MISSION_FLOW_CLEANUP_MISSION_INTRO_CUTSCENE() eSkipJourneyState = SKIP_JOURNEY_STATE_MOVE_TAXI_TO_DESTINATION CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " SKIP_JOURNEY_TO_DESTINATION() : eSkipJourneyState = SKIP_JOURNEY_STATE_MOVE_TAXI_TO_DESTINATION") ENDIF ELSE START_AUDIO_SCENE("FADE_OUT_WORLD_250MS_SCENE") ENDIF BREAK CASE SKIP_JOURNEY_STATE_WAIT_GEN_DESTINATION_INFO IF GENERATE_TAXI_DROP_OFF_PLAYER_DESTINATION(currentTaxiDestination.BlipID, g_vTaxiDropOffPosition, g_fTaxiDropOffHeading) // B*1392355 - ensure any prestreamed cutscenes at the pickup location are cleaned up before requesting the next or loading scene at a new position MISSION_FLOW_CLEANUP_MISSION_INTRO_CUTSCENE() eSkipJourneyState = SKIP_JOURNEY_STATE_MOVE_TAXI_TO_DESTINATION CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " SKIP_JOURNEY_TO_DESTINATION() : eSkipJourneyState = SKIP_JOURNEY_STATE_MOVE_TAXI_TO_DESTINATION") ENDIF BREAK CASE SKIP_JOURNEY_STATE_MOVE_TAXI_TO_DESTINATION // ensure the status of g_iFlowIntroCutsceneRequestID = NULL_OFFMISSION_CUTSCENE_REQUEST before making another request IF g_iFlowIntroCutsceneRequestID = NULL_OFFMISSION_CUTSCENE_REQUEST // B*1703207 - ensure property streamvol are cancelled before playr warp (needs to come frame after MISSION_FLOW_CLEANUP_MISSION_INTRO_CUTSCENE() call for B*2061680) CANCEL_PROPERTY_MAP_LOADS() UPDATE_DIST_TRAVELED_IN_TAXI_STAT_FOR_SKIP() // B*1211249 CALCULATE_SKIP_COST() CALCULATE_AND_APPLY_TIME_PASSED() MISSION_STAT_SYSTEM_ALERT_TIME_WARP() CLEAR_AREA(g_vTaxiDropOffPosition, 5.0, TRUE) //Check if there's a prep mission vehicle nearby, wait for it to pass Separate_From_Prep_Mission_Vehicles() IF NOT IS_PED_INJURED(g_WaitingTaxiDriver) AND IS_VEHICLE_DRIVEABLE(g_WaitingTaxi) SET_ENTITY_COORDS(g_WaitingTaxi, g_vTaxiDropOffPosition) SET_ENTITY_HEADING(g_WaitingTaxi, g_fTaxiDropOffHeading) FREEZE_ENTITY_POSITION(g_WaitingTaxi, TRUE) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " SKIP_JOURNEY_TO_DESTINATION() : set taxi to location - coords (z+1) :", g_vTaxiDropOffPosition, " heading : ", g_fTaxiDropOffHeading) ENDIF SET_GAMEPLAY_CAM_RELATIVE_HEADING() SET_GAMEPLAY_CAM_RELATIVE_PITCH() NEW_LOAD_SCENE_STOP() // stop any ongoing load scene ready for new request // clear the area CLEAR_AREA(g_vTaxiDropOffPosition, 5000, TRUE, FALSE) CLEAR_AREA_OF_OBJECTS(g_vTaxiDropOffPosition, 5000) CLEAR_AREA_OF_PROJECTILES(g_vTaxiDropOffPosition, 30.0) REMOVE_PARTICLE_FX_IN_RANGE(g_vTaxiDropOffPosition, 5000) // Clear up any smoke / fire effects REMOVE_DECALS_IN_RANGE(g_vTaxiDropOffPosition, 5000) // Clear up blood decals in the area. // Make sure no mission triggers are loaded ahead of the new load scene. IF g_eMissionSceneToCleanup != SP_MISSION_NONE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " SKIP_JOURNEY_TO_DESTINATION() : Cleaning up any loaded mission triggers ahead of starting new load scene.") Set_Leave_Area_Flag_For_Mission(g_eMissionSceneToCleanup, TRUE) MISSION_FLOW_RELEASE_TRIGGER_SCENE_ASSETS(g_eMissionSceneToCleanup) ENDIF // If we are warping to a mission trigger with a trigger scene, block it from loading until after // the new load scene is done. eMissionAtBlip = MISSION_FLOW_GET_MISSION_AT_BLIP(currentTaxiDestination.BlipID) IF eMissionAtBlip != SP_MISSION_NONE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " SKIP_JOURNEY_TO_DESTINATION() : Found mission ", GET_SP_MISSION_DISPLAY_STRING_FROM_ID(eMissionAtBlip), " to preload a lead-in for.") CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " SKIP_JOURNEY_TO_DESTINATION() :Blocking loading of trigger until after new load scene.") Set_Leave_Area_Flag_For_Mission(eMissionAtBlip, TRUE) ENDIF bSkipJourneyLoadSceneStarted = FALSE eSkipJourneyState = SKIP_JOURNEY_STATE_SETUP_LOAD_SCENE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " SKIP_JOURNEY_TO_DESTINATION() : eSkipJourneyState = SKIP_JOURNEY_STATE_SETUP_LOAD_SCENE") ENDIF BREAK // Create load scene at the drop off position CASE SKIP_JOURNEY_STATE_SETUP_LOAD_SCENE IF NEW_LOAD_SCENE_START_SPHERE(g_vTaxiDropOffPosition, REPLAY_LOAD_SCENE_SIZE) // increased from 600 to match replay controller's setup bSkipJourneyLoadSceneStarted = TRUE eSkipJourneyState = SKIP_JOURNEY_STATE_LOAD_SCENE_THEN_REQUEST_LEADIN CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " SKIP_JOURNEY_TO_DESTINATION() : new load scene created at : ", g_vTaxiDropOffPosition, " framecount = ", GET_FRAME_COUNT()) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " SKIP_JOURNEY_TO_DESTINATION() : eSkipJourneyState = SKIP_JOURNEY_STATE_LOAD_SCENE_THEN_REQUEST_LEADIN") ELSE // skip new load scene if we were not able to set one up in time IF HAS_TIME_PASSED(iSkipJourneyTimer, 2500) eSkipJourneyState = SKIP_JOURNEY_STATE_LOAD_SCENE_THEN_REQUEST_LEADIN CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " SKIP_JOURNEY_TO_DESTINATION() : new load scene start timed out") CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " SKIP_JOURNEY_TO_DESTINATION() : eSkipJourneyState = SKIP_JOURNEY_STATE_LOAD_SCENE_THEN_REQUEST_LEADIN") ELSE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " SKIP_JOURNEY_TO_DESTINATION() : waiting on new load scene request...") ENDIF ENDIF BREAK CASE SKIP_JOURNEY_STATE_LOAD_SCENE_THEN_REQUEST_LEADIN //#1927212 - Wait for load scene to finish before requesting lead-in assets. IF IS_NEW_LOAD_SCENE_ACTIVE() IF IS_NEW_LOAD_SCENE_LOADED() CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " SKIP_JOURNEY_TO_DESTINATION() : New load scene finished...calling NEW_LOAD_SCENE_STOP()") // If we are warping to a mission trigger with a trigger scene, start preloading // the assets it will require now the load scene is done. IF eMissionAtBlip != SP_MISSION_NONE NEW_LOAD_SCENE_STOP() // we need to clear load scene for mission asset loading bSkipJourneyLoadSceneStarted = FALSE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " SKIP_JOURNEY_TO_DESTINATION() : Starting preloading of lead-in for ", GET_SP_MISSION_DISPLAY_STRING_FROM_ID(eMissionAtBlip), ".") MISSION_FLOW_PRELOAD_ASSETS_FOR_MISSION_TRIGGER(eMissionAtBlip) Set_Leave_Area_Flag_For_Mission(eMissionAtBlip, FALSE) ENDIF CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " SKIP_JOURNEY_TO_DESTINATION() : eSkipJourneyState = SKIP_JOURNEY_STATE_REQUEST_ASSETS_AT_DESTINATION") eSkipJourneyState = SKIP_JOURNEY_STATE_REQUEST_ASSETS_AT_DESTINATION // time out for new load scene taking too long ELIF HAS_TIME_PASSED(iSkipJourneyTimer, 20000) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " SKIP_JOURNEY_TO_DESTINATION() : New load scene timed out!") // If we are warping to a mission trigger with a trigger scene, start preloading // the assets it will require now the load scene is done. IF eMissionAtBlip != SP_MISSION_NONE NEW_LOAD_SCENE_STOP() // we need to clear load scene for mission asset loading bSkipJourneyLoadSceneStarted = FALSE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " SKIP_JOURNEY_TO_DESTINATION() : Starting preloading of lead-in for ", GET_SP_MISSION_DISPLAY_STRING_FROM_ID(eMissionAtBlip), ".") MISSION_FLOW_PRELOAD_ASSETS_FOR_MISSION_TRIGGER(eMissionAtBlip) Set_Leave_Area_Flag_For_Mission(eMissionAtBlip, FALSE) ENDIF CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " SKIP_JOURNEY_TO_DESTINATION() : eSkipJourneyState = SKIP_JOURNEY_STATE_REQUEST_ASSETS_AT_DESTINATION") eSkipJourneyState = SKIP_JOURNEY_STATE_REQUEST_ASSETS_AT_DESTINATION ELSE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " SKIP_JOURNEY_TO_DESTINATION() : Waiting for IS_NEW_LOAD_SCENE_LOADED() at destination") ENDIF ELSE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " SKIP_JOURNEY_TO_DESTINATION() : No load scene active!") // If we are warping to a mission trigger with a trigger scene, start preloading // the assets it will require now the load scene is done. IF eMissionAtBlip != SP_MISSION_NONE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " SKIP_JOURNEY_TO_DESTINATION() : Starting preloading of lead-in for ", GET_SP_MISSION_DISPLAY_STRING_FROM_ID(eMissionAtBlip), ".") MISSION_FLOW_PRELOAD_ASSETS_FOR_MISSION_TRIGGER(eMissionAtBlip) Set_Leave_Area_Flag_For_Mission(eMissionAtBlip, FALSE) ENDIF bSkipJourneyLoadSceneStarted = FALSE // we don't call NEW_LOAD_SCENE_STOP() in this instance because it's not active CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " SKIP_JOURNEY_TO_DESTINATION() : eSkipJourneyState = SKIP_JOURNEY_STATE_REQUEST_ASSETS_AT_DESTINATION") eSkipJourneyState = SKIP_JOURNEY_STATE_REQUEST_ASSETS_AT_DESTINATION ENDIF BREAK CASE SKIP_JOURNEY_STATE_REQUEST_ASSETS_AT_DESTINATION RESET_VEHICLE_GEN_LOADED_CHECKS() // B*1354066 - populate veh gens whilst faded down INSTANTLY_FILL_PED_POPULATION() INSTANTLY_FILL_VEHICLE_POPULATION() POPULATE_NOW() // Story missions IF eMissionAtBlip != SP_MISSION_NONE // wait for a trigger scene to load if we are warping to a mission trigger blip // If the mission we are warping to has a time of day restriction, ensure the time is set to bypass the TOD cutscene bSkipTime = TRUE IF (g_sMissionStaticData[eMissionAtBlip].startHour = NULL_HOUR AND g_sMissionStaticData[eMissionAtBlip].endHour = NULL_HOUR) bSkipTime = FALSE ENDIF IF bSkipTime IF (GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL AND NOT IS_BIT_SET(g_sMissionStaticData[eMissionAtBlip].settingsBitset, MF_INDEX_DO_TRIGGER_TOD_M)) OR (GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN AND NOT IS_BIT_SET(g_sMissionStaticData[eMissionAtBlip].settingsBitset, MF_INDEX_DO_TRIGGER_TOD_F)) OR (GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR AND NOT IS_BIT_SET(g_sMissionStaticData[eMissionAtBlip].settingsBitset, MF_INDEX_DO_TRIGGER_TOD_T)) bSkipTime = FALSE ENDIF ENDIF IF bSkipTime IF IS_TIME_BETWEEN_THESE_HOURS(g_sMissionStaticData[eMissionAtBlip].startHour, g_sMissionStaticData[eMissionAtBlip].endHour) bSkipTime = FALSE ENDIF ENDIF //Are we out of mission hours? IF bSkipTime // Out of hours, need to skip time to start hour. ADVANCE_CLOCK_TIME_TO(g_sMissionStaticData[eMissionAtBlip].startHour, 0, 0) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " SKIP_JOURNEY_TO_DESTINATION() : Game is faded out for taxi warp. mission warping to has TOD restriction, skipped time to advance, hr : ", g_sMissionStaticData[eMissionAtBlip].startHour) ENDIF ELSE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " SKIP_JOURNEY_TO_DESTINATION() : Game is faded out for taxi warp. blip not for mission so skipping g_bMissionTriggerLoading wait") ENDIF // Check nearest valid RCM #424931 & minigame B*1351272 (off road races only at moment) eClosestRCMission = GET_NEAREST_VALID_RC_MISSION() eSkipJourneyState = SKIP_JOURNEY_STATE_LOADING_ASSETS_AT_DESTINATION CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " SKIP_JOURNEY_TO_DESTINATION() : eSkipJourneyState = SKIP_JOURNEY_STATE_LOADING_ASSETS_AT_DESTINATION") BREAK // Wait for assets to load CASE SKIP_JOURNEY_STATE_LOADING_ASSETS_AT_DESTINATION bHaveAssetsForTaxiSkipLoaded= TRUE IF IS_TAXI_WAITING_FOR_THIS_RC_MISSION(eClosestRCMission) // RCs in ranges bHaveAssetsForTaxiSkipLoaded = FALSE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " SKIP_JOURNEY_TO_DESTINATION() : Waiting on assets at destination ... IS_TAXI_WAITING_FOR_THIS_RC_MISSION") ENDIF IF NOT ARE_MINIGAMES_IN_RANGE_LOADED(g_vTaxiDropOffPosition) // minigames bHaveAssetsForTaxiSkipLoaded = FALSE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " SKIP_JOURNEY_TO_DESTINATION() : Waiting on assets at destination ... ARE_MINIGAMES_IN_RANGE_LOADED") ENDIF IF NOT HAVE_ALL_VEHICLE_GENS_LOADED_NEAR_PLAYER() // scripted vehicle vens bHaveAssetsForTaxiSkipLoaded = FALSE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " SKIP_JOURNEY_TO_DESTINATION() : Waiting on assets at destination ... HAVE_ALL_VEHICLE_GENS_LOADED_NEAR_PLAYER") ENDIF IF NOT HAS_INSTANT_FILL_VEHICLE_POPULATION_FINISHED() // veh population bHaveAssetsForTaxiSkipLoaded = FALSE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " SKIP_JOURNEY_TO_DESTINATION() : Waiting on assets at destination ... HAS_INSTANT_FILL_VEHICLE_POPULATION_FINISHED") ENDIF IF bSkipJourneyLoadSceneStarted // new load scene IF IS_NEW_LOAD_SCENE_ACTIVE() IF NOT IS_NEW_LOAD_SCENE_LOADED() bHaveAssetsForTaxiSkipLoaded = FALSE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " SKIP_JOURNEY_TO_DESTINATION() : Waiting on assets at destination ... IS_NEW_LOAD_SCENE_LOADED()") ENDIF ENDIF ENDIF IF (eMissionAtBlip != SP_MISSION_NONE AND g_bMissionTriggerLoading) // Story missions - wait for any trigger scenes to be created. bHaveAssetsForTaxiSkipLoaded = FALSE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " SKIP_JOURNEY_TO_DESTINATION() : Waiting on assets at destination... g_bMissionTriggerLoading") ENDIF // fail safe time out if something is failing to load IF HAS_TIME_PASSED(iSkipJourneyTimer, 29500) // B*2044625 - upped max fade time to 20 secs (note 500 sec wait once everything is in place) knock off 2 sec for the streaming one framer bHaveAssetsForTaxiSkipLoaded = TRUE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " SKIP_JOURNEY_TO_DESTINATION() : Waiting on assets at destination timed out iSkipJourneyTimer = ", iSkipJourneyTimer) ENDIF // assets have loaded IF bHaveAssetsForTaxiSkipLoaded // get rid of the stream vol IF bSkipJourneyLoadSceneStarted IF IS_NEW_LOAD_SCENE_ACTIVE() NEW_LOAD_SCENE_STOP() ENDIF bSkipJourneyLoadSceneStarted = FALSE ENDIF //B* 2277341: Check if the current Z is below the ground Z IF bUsedFloorZ bUsedFloorZ = FALSE GET_GROUND_Z_FOR_3D_COORD(g_vTaxiDropOffPosition+<<0,0,100>>,fGroundZ) IF fGroundZ > g_vTaxiDropOffPosition.z CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " SKIP_JOURNEY_TO_DESTINATION() : Floor Z (",g_vTaxiDropOffPosition.z,") was below ground Z (",fGroundZ,"), correcting Z") g_vTaxiDropOffPosition.z = fGroundZ + 0.5 ENDIF ENDIF //Check if there's a prep mission vehicle nearby, wait for it to pass Separate_From_Prep_Mission_Vehicles(12) //B*-1965573 SEPARATE_FROM_MOVING_BLIP() IF NOT IS_PED_INJURED(g_WaitingTaxiDriver) AND IS_VEHICLE_DRIVEABLE(g_WaitingTaxi) FREEZE_ENTITY_POSITION(g_WaitingTaxi, FALSE) SET_ENTITY_HEADING(g_WaitingTaxi, g_fTaxiDropOffHeading) SET_ENTITY_COORDS(g_WaitingTaxi, g_vTaxiDropOffPosition) SET_VEHICLE_ON_GROUND_PROPERLY(g_WaitingTaxi) TASK_VEHICLE_TEMP_ACTION(g_WaitingTaxiDriver, g_WaitingTaxi, TEMPACT_BRAKE, 5000) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " SKIP_JOURNEY_TO_DESTINATION() : set taxi pos : ", g_vTaxiDropOffPosition, " heading : ", g_fTaxiDropOffHeading) ENDIF iSkipJourneyTimer = GET_GAME_TIMER() eSkipJourneyState = SKIP_JOURNEY_STATE_FADE_IN CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " SKIP_JOURNEY_TO_DESTINATION() : eSkipJourneyState = SKIP_JOURNEY_STATE_FADE_IN") ENDIF BREAK CASE SKIP_JOURNEY_STATE_FADE_IN IF HAS_TIME_PASSED(iSkipJourneyTimer, 500) IF IS_AUDIO_SCENE_ACTIVE("FADE_OUT_WORLD_250MS_SCENE") STOP_AUDIO_SCENE("FADE_OUT_WORLD_250MS_SCENE") CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " SKIP_JOURNEY_TO_DESTINATION() : stopped audio scene FADE_OUT_WORLD_250MS_SCENE") ENDIF IF IS_VEHICLE_DRIVEABLE(g_WaitingTaxi) SET_VEHICLE_RADIO_ENABLED(g_WaitingTaxi, TRUE) // B*1183700 - radio heard at low level during skip ENDIF IF NOT IS_REPLAY_BEING_SET_UP() DO_SCREEN_FADE_IN(250) ENDIF eSkipJourneyState = SKIP_JOURNEY_STATE_FADED_IN CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " SKIP_JOURNEY_TO_DESTINATION() : eSkipJourneyState = SKIP_JOURNEY_STATE_FADED_IN") ENDIF BREAK CASE SKIP_JOURNEY_STATE_FADED_IN IF IS_SCREEN_FADED_IN() OR IS_REPLAY_BEING_SET_UP() //If we have preloaded assets for a scene but have not warped into its activation range, unload them. IF NOT g_bTriggerSceneActive AND eMissionAtBlip != SP_MISSION_NONE AND eMissionAtBlip != SP_HEIST_DOCKS_PREP_1 //Complicated scene that deletes ropes when released. Shouldn't be unloaded in this case. AND eMissionAtBlip != SP_HEIST_JEWELRY_PREP_1A // 2146270 - don't release the assets as the mission will start right away after taxi warp MISSION_FLOW_RELEASE_TRIGGER_SCENE_ASSETS(eMissionAtBlip) ENDIF DISABLE_CELLPHONE(FALSE) //IF GET_ENTITY_SPEED(g_WaitingTaxi) < 2 IF NOT IS_PED_INJURED(PLAYER_PED_ID()) IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), g_WaitingTaxi, TRUE) TASK_LEAVE_ANY_VEHICLE(PLAYER_PED_ID()) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " SEND_TAXI_TO_DESTINATION -> player tasked to leave taxi reached destination") ENDIF ENDIF //ENDIF TASK_VEHICLE_TEMP_ACTION(g_WaitingTaxiDriver, g_WaitingTaxi, TEMPACT_BRAKE, 5000) SET_PED_KEEP_TASK(g_WaitingTaxiDriver, TRUE) bMadeItToDestination = TRUE #IF IS_DEBUG_BUILD VECTOR vTempCoords vTempCoords = GET_ENTITY_COORDS(g_WaitingTaxi, FALSE) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : SKIP_JOURNEY_TO_DESTINATION() : taxi stopped at : ", vTempCoords, " : g_vTaxiDropOffPosition = ", g_vTaxiDropOffPosition) #ENDIF eTaxiServiceStage = TAXI_SERVICE_END CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : SKIP_JOURNEY_TO_DESTINATION() : eTaxiServiceStage = TAXI_SERVICE_END") eSkipJourneyState = SKIP_JOURNEY_STATE_SKIP_FINISHED CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : SKIP_JOURNEY_TO_DESTINATION() : eSkipJourneyState = SKIP_JOURNEY_STATE_SKIP_FINISHED") ENDIF BREAK CASE SKIP_JOURNEY_STATE_SKIP_FINISHED BREAK ENDSWITCH ENDPROC FUNC BOOL IS_PLAYER_PASSENGER_IN_VALID_TAXI_CAB() IF g_WaitingTaxiDriver = NULL //CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " IS_PLAYER_PASSENGER_IN_VALID_TAXI_CAB() : return FALSE g_WaitingTaxiDriver = NULL") RETURN FALSE ENDIF IF NOT IS_PED_INJURED(g_WaitingTaxiDriver) IF IS_VEHICLE_DRIVEABLE(g_WaitingTaxi) IF NOT IS_PED_SITTING_IN_VEHICLE(g_WaitingTaxiDriver, g_WaitingTaxi) //CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " IS_PLAYER_PASSENGER_IN_VALID_TAXI_CAB() : return FALSE driver not sat in taxi") RETURN FALSE ENDIF ELSE RETURN FALSE ENDIF ELSE RETURN FALSE ENDIF IF IS_PLAYER_PLAYING(PLAYER_ID()) IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID()) IF IS_VEHICLE_DRIVEABLE(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())) IF IS_CAR_A_TAXI_MODEL(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())) PED_INDEX DriverID DriverID = GET_PED_IN_VEHICLE_SEAT(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())) IF NOT (DriverID = PLAYER_PED_ID()) IF NOT IS_PED_INJURED(DriverID) g_bPlayerIsInTaxi = TRUE // IF IS_PLAYER_CONTROL_ON(PLAYER_ID()) // SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_LEAVE_CAMERA_CONTROL_ON) // ENDIF SET_PLAYER_CAN_DO_DRIVE_BY(PLAYER_ID(), FALSE) HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_WEAPON_ICON) STOP_PED_SPEAKING(PLAYER_PED_ID(), TRUE) //CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " IS_PLAYER_PASSENGER_IN_VALID_TAXI_CAB() : return TRUE") RETURN TRUE ENDIF ENDIF ENDIF ENDIF ELSE //CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " IS_PLAYER_PASSENGER_IN_VALID_TAXI_CAB() : return FALSE player not sitting in vehicle") ENDIF ENDIF IF DOES_CAM_EXIST(camMeter) IF IS_CAM_ACTIVE(camMeter) SET_PARTICLE_FX_CAM_INSIDE_VEHICLE(FALSE) // B*1549323 - stops rain inside taxi g_bTaxiShouldForcePhoneDislayOnHud = FALSE // reset global used for B*2053172 - force phone display on HUD ENDIF SET_CAM_ACTIVE(camMeter, FALSE) DESTROY_CAM(camMeter) RENDER_SCRIPT_CAMS(FALSE, FALSE) UNLOCK_MINIMAP_POSITION() UNLOCK_MINIMAP_ANGLE() SET_RADAR_ZOOM(0) ENDIF //CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " IS_PLAYER_PASSENGER_IN_VALID_TAXI_CAB() : return FALSE") RETURN FALSE ENDFUNC /// PURPOSE: /// checks for script needing to cleanup /// PARAMS: /// eCurrentStage - the taxi service stage /// RETURNS: /// TRUE if the script should cleanup FUNC BOOL SHOULD_TAXI_SERVICE_END_EARLY(TAXI_SERVICE_STATE eCurrentStage) // cleanup if the player is injured / dead IF IS_PED_INJURED(PLAYER_PED_ID()) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), "SHOULD_TAXI_SERVICE_END_EARLY : return TRUE : player injured check") RETURN TRUE ENDIF // cleanup if player char has changed IF GET_PLAYER_PED_ENUM(PLAYER_PED_ID()) <> charWhenTaxiLaunched CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), "SHOULD_TAXI_SERVICE_END_EARLY : return TRUE : player char changed check") RETURN TRUE ENDIF // commented out for B*1518083 - now allow player to get in but just exit option if no taxi destinations available - this allows them to plot custom waypoint whilst sat in the back // check if no blips are available //IF iStoredNumberOfBlips = 0 // CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), "SHOULD_TAXI_SERVICE_END_EARLY : return TRUE : iStoredNumberOfBlips = 0") // RETURN TRUE //ENDIF // veh handle not valid IF NOT DOES_ENTITY_EXIST(g_WaitingTaxi) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), "SHOULD_TAXI_SERVICE_END_EARLY : return TRUE : DOES_ENTITY_EXIST(g_WaitingTaxi)") RETURN TRUE ENDIF // vehicle wrecked IF NOT IS_VEHICLE_DRIVEABLE(g_WaitingTaxi) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), "SHOULD_TAXI_SERVICE_END_EARLY : return TRUE : IS_VEHICLE_DRIVEABLE(g_WaitingTaxi)") RETURN TRUE ENDIF // driver handle not valid IF NOT DOES_ENTITY_EXIST(g_WaitingTaxiDriver) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), "SHOULD_TAXI_SERVICE_END_EARLY : return TRUE : DOES_ENTITY_EXIST(g_WaitingTaxiDriver)") RETURN TRUE ENDIF // ped hurt IF IS_PED_INJURED(g_WaitingTaxiDriver) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), "SHOULD_TAXI_SERVICE_END_EARLY : return TRUE : IS_PED_INJURED(g_WaitingTaxiDriver)") RETURN TRUE ENDIF // B*1561424 - don't fail if skipping taxi journey for these conditions IF eTaxiJourneyState != TAXI_JOURNEY_STATE_SKIP_JOURNEY // stage specific checks IF eCurrentStage = TAXI_SERVICE_STATE_PLAYER_IN_TAXI // cleanup if player has wanted level IF GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) > 0 CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), "SHOULD_TAXI_SERVICE_END_EARLY : return TRUE : player has wanted level check") RETURN TRUE ENDIF // timer for vehicle rolled / stuck IF IS_VEHICLE_STUCK_TIMER_UP(g_WaitingTaxi, VEH_STUCK_HUNG_UP, HUNG_UP_TIME) OR IS_VEHICLE_STUCK_TIMER_UP(g_WaitingTaxi, VEH_STUCK_JAMMED, JAMMED_TIME) OR IS_VEHICLE_STUCK_TIMER_UP(g_WaitingTaxi, VEH_STUCK_ON_ROOF, ROOF_TIME) OR IS_VEHICLE_STUCK_TIMER_UP(g_WaitingTaxi, VEH_STUCK_ON_SIDE, ROOF_TIME) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), "SHOULD_TAXI_SERVICE_END_EARLY : return TRUE : taxi stuck") RETURN TRUE ENDIF ENDIF VECTOR vTaxiCoords = GET_ENTITY_COORDS(g_WaitingTaxi, FALSE) // bullet fired near taxi IF IS_BULLET_IN_AREA(vTaxiCoords, 7.0, FALSE) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : SHOULD_TAXI_SERVICE_END_EARLY : return TRUE : bullet fired near taxi") RETURN TRUE ENDIF FLOAT fProjectileRadiusCheck = 15.0 VECTOR vMin, vMax // is one of the player's projectiles nearby? vMin = vTaxiCoords vMax = vMin vMin.x= vMin.x - fProjectileRadiusCheck vMin.y = vMin.y -fProjectileRadiusCheck vMin.z = vMin.z - fProjectileRadiusCheck vMax.x = vMax.x + fProjectileRadiusCheck vMax.y = vMax.y + fProjectileRadiusCheck vMax.z = vMax.z + fProjectileRadiusCheck IF IS_PROJECTILE_IN_AREA(vMin, vMax, TRUE) CPRINTLN(DEBUG_TAXI_SERVICE, " : SHOULD_TAXI_SERVICE_END_EARLY : return TRUE : projectile near taxi") RETURN TRUE ENDIF ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// handles the specific PLAYER_CONTROL which need to be blocked during the jourey /// Also calls ALLOW_ALTERNATIVE_SCRIPT_CONTROLS_LAYOUT PROC BLOCK_SPECIFIC_PLAYER_CONTROLS_FOR_TAXI_JOURNEY_THIS_FRAME() // B*1293059 ALLOW_ALTERNATIVE_SCRIPT_CONTROLS_LAYOUT(PLAYER_CONTROL) ALLOW_ALTERNATIVE_SCRIPT_CONTROLS_LAYOUT(CAMERA_CONTROL) ALLOW_ALTERNATIVE_SCRIPT_CONTROLS_LAYOUT(FRONTEND_CONTROL) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_SELECT_NEXT_WEAPON) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_SELECT_PREV_WEAPON) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SELECT_NEXT_WEAPON) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SELECT_PREV_WEAPON) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_DUCK) // B*1979327 - stop player char ducking when pressing X DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_AIM) // B*1460540 - block aim during taxi journey (note INPUT_VEH_AIM & INPUT_VEH_PASSENGER_AIM didn't fix this for some reason DISABLE_CELLPHONE_CAMERA_APP_THIS_FRAME_ONLY() // B* 1494563 - block cellphone camera DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_FRONTEND_PAUSE_ALTERNATE) // B* 2229157 - Disable alternate pause so Esc can go back instead of pausing on PC. // B*1425062 - player exits cab when pressing triangle whilst internet is on screen IF IS_BROWSER_OPEN() OR IS_PHONE_ONSCREEN() DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_EXIT) ENDIF ENDPROC /// PURPOSE: /// calls the relevant suppress procs needed during taxi journey PROC SUPPRESS_AMBIENT_REACTIONS_FOR_TAXI_JOURNEY_THIS_FRAME() IF IS_PLAYER_PLAYING(PLAYER_ID()) SET_ALL_RANDOM_PEDS_FLEE_THIS_FRAME(PLAYER_ID()) // B*1380049 - driving knocking ped over gave player a wanted level SUPPRESS_WITNESSES_CALLING_POLICE_THIS_FRAME(PLAYER_ID()) SUPPRESS_CRIME_THIS_FRAME(PLAYER_ID(), CRIME_RUN_REDLIGHT) SUPPRESS_CRIME_THIS_FRAME(PLAYER_ID(), CRIME_RECKLESS_DRIVING) SUPPRESS_CRIME_THIS_FRAME(PLAYER_ID(), CRIME_SPEEDING) SUPPRESS_CRIME_THIS_FRAME(PLAYER_ID(), CRIME_DRIVE_AGAINST_TRAFFIC) SUPPRESS_CRIME_THIS_FRAME(PLAYER_ID(), CRIME_RUNOVER_PED) //SUPPRESS_CRIME_THIS_FRAME(PLAYER_ID(), CRIME_RUNOVER_COP) ENDIF ENDPROC PROC SET_CAMERA_ROT_TO_SAME_AS_VEHICLE(VEHICLE_INDEX inCar, CAMERA_INDEX &inCam, VECTOR vAdditionalRot) VECTOR vCarRot FLOAT fPitch, fHeading, fRoll IF NOT IS_ENTITY_DEAD(inCar) IF DOES_CAM_EXIST(inCam) vCarRot = GET_ENTITY_ROTATION(inCar) fRoll = vCarRot.y // use the cars roll VECTOR vNorm = NORMALISE_VECTOR(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(g_WaitingTaxi, vAdditionalRot) - GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(g_WaitingTaxi, vTaxiCamOffset)) GET_PITCH_AND_HEADING_FROM_DIRECTION_VECTOR(vNorm, fPitch, fHeading) SET_CAM_ROT(inCam, <>) //POINT_CAM_AT_COORD(inCam, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(g_WaitingTaxi, vAdditionalRot)) //CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " SET_CAMERA_ROT_TO_SAME_AS_VEHICLE() @@@@@@@@: fPitch = ", fPitch, " fRoll = ", fRoll, " fHeading = ", fHeading) ENDIF ENDIF ENDPROC /// PURPOSE: /// updates the in taxi camera's position, rotation and fov PROC UPDATE_TAXI_CAM_POSITIONING() IF DOES_CAM_EXIST(camMeter) //UPDATE_IN_TAXI_ROT_BASED_OFF_PLAYER_CONTROLS() not currently in use MP had request to make camera static SET_CAMERA_ROT_TO_SAME_AS_VEHICLE(g_WaitingTaxi, camMeter, vTaxiCamFixedRotation) //SET_CAM_COORD(camMeter, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(g_WaitingTaxi, vTaxiCamOffset)) // cam is attached so pos doesn't need updating. SET_CAM_FOV(camMeter, camMeterFOV) SET_CAM_NEAR_CLIP(camMeter, 0.01) SET_CAM_IS_INSIDE_VEHICLE(camMeter, TRUE) SET_SCRIPTED_CAMERA_IS_FIRST_PERSON_THIS_FRAME() // B*2057207 - new command to make scripted shot seem like it's first person ENDIF ENDPROC /// PURPOSE: /// check to reason to block player using taxi controls /// RETURNS: /// TRUE if need to block control FUNC BOOL SHOULD_TAXI_CONTROLS_BE_BLOCKED_THIS_FRAME() // don't allow input whilst skipping the journey IF eTaxiJourneyState = TAXI_JOURNEY_STATE_SKIP_JOURNEY //CDEBUG2LN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " SHOULD_TAXI_CONTROLS_BE_BLOCKED_THIS_FRAME() : return TRUE : eTaxiJourneyState = TAXI_JOURNEY_STATE_SKIP_JOURNEY") RETURN TRUE ENDIF // B*1395644 - don't allow control whilst internet is on screen IF IS_BROWSER_OPEN() //CDEBUG2LN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " SHOULD_TAXI_CONTROLS_BE_BLOCKED_THIS_FRAME() : return TRUE : IS_BROWSER_OPEN") RETURN TRUE ENDIF IF IS_PAUSE_MENU_ACTIVE() //CDEBUG2LN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " SHOULD_TAXI_CONTROLS_BE_BLOCKED_THIS_FRAME() : return TRUE : IS_PAUSE_MENU_ACTIVE") RETURN TRUE ENDIF IF IS_CUSTOM_MENU_ON_SCREEN() //CDEBUG2LN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " SHOULD_TAXI_CONTROLS_BE_BLOCKED_THIS_FRAME() : return TRUE : IS_CUSTOM_MENU_ON_SCREEN") RETURN TRUE ENDIF IF IS_SCRIPT_HUD_DISPLAYING(HUDPART_TRANSITIONHUD) //CDEBUG2LN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " SHOULD_TAXI_CONTROLS_BE_BLOCKED_THIS_FRAME() : return TRUE : IS_SCRIPT_HUD_DISPLAYING(HUDPART_TRANSITIONHUD)") RETURN TRUE ENDIF IF IS_PHONE_ONSCREEN() //CDEBUG2LN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " SHOULD_TAXI_CONTROLS_BE_BLOCKED_THIS_FRAME() : return TRUE : IS_PHONE_ONSCREEN") RETURN TRUE ENDIF IF IS_SYSTEM_UI_BEING_DISPLAYED() //CDEBUG2LN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " SHOULD_TAXI_CONTROLS_BE_BLOCKED_THIS_FRAME() : return TRUE : IS_SYSTEM_UI_BEING_DISPLAYED") RETURN TRUE ENDIF IF IS_SELECTOR_CAM_ACTIVE() //CDEBUG2LN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " SHOULD_TAXI_CONTROLS_BE_BLOCKED_THIS_FRAME() : return TRUE : IS_SELECTOR_CAM_ACTIVE") RETURN TRUE ENDIF //B* 1913692: Disable while mission passed screen is up IF g_bResultScreenDisplaying OR g_bResultScreenPrepared //CDEBUG2LN(debug_taxi_service,"SHOULD_TAXI_CONTROLS_BE_BLOCKED_THIS_FRAME: YES because results screen is being displayed") RETURN TRUE ENDIF RETURN FALSE ENDFUNC PROC CLEAR_TAXI_DESTINATION_LIST() INT i REPEAT MAX_NUMBER_OF_TAXI_DESTINATIONS i AllTaxiDestinations[i].BlipID = NULL ENDREPEAT iTotalNumberOfTaxiDestinations = 0 iStoredTaxiWaypointBlipDestinationIndex = -1 vStoredTaxiWaypointBlipDestinationCoords = << 0.0, 0.0, 0.0 >> iCountBlipsAddedToDestinationListThisFrame = 0 ENDPROC PROC MOVE_TAXI_DESTINATION_UP_LIST(INT iListItemID) TAXI_DEST NextDest TAXI_DEST ThisDest IF (iListItemID > 0) ThisDest = AllTaxiDestinations[iListItemID] NextDest = AllTaxiDestinations[iListItemID - 1] AllTaxiDestinations[iListItemID - 1] = ThisDest AllTaxiDestinations[iListItemID] = NextDest ENDIF ENDPROC PROC MOVE_TAXI_DESTINATION_DOWN_LIST(INT iListItemID) TAXI_DEST NextDest TAXI_DEST ThisDest IF (iListItemID < (MAX_NUMBER_OF_TAXI_DESTINATIONS - 1)) ThisDest = AllTaxiDestinations[iListItemID] NextDest = AllTaxiDestinations[iListItemID + 1] AllTaxiDestinations[iListItemID + 1] = ThisDest AllTaxiDestinations[iListItemID] = NextDest ENDIF ENDPROC PROC MOVE_TAXI_DESTINATION_TO_BOTTOM_OF_LIST(INT iListItemID) IF (iListItemID < (MAX_NUMBER_OF_TAXI_DESTINATIONS - 1)) MOVE_TAXI_DESTINATION_DOWN_LIST(iListItemID) MOVE_TAXI_DESTINATION_TO_BOTTOM_OF_LIST(iListItemID + 1) ENDIF ENDPROC PROC SHIFT_LIST_DOWN_1_PLACE_FROM_POSITION(INT iPosition) INT i TAXI_DEST ValueAbove //CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " SHIFT_LIST_DOWN_1_PLACE_FROM_POSITION - start, position = ", iPosition) // start at the end of the list and work up i = MAX_NUMBER_OF_TAXI_DESTINATIONS - 1 // last item in list WHILE (i > iPosition) ValueAbove = AllTaxiDestinations[i - 1] AllTaxiDestinations[i] = ValueAbove // store waypoint blip destination index so we can test for it changing IF ((i - 1) = iStoredTaxiWaypointBlipDestinationIndex) iStoredTaxiWaypointBlipDestinationIndex = i CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " SHIFT_LIST_DOWN_1_PLACE_FROM_POSITION - waypoint blip index shifted i = ", i) ENDIF i-- ENDWHILE ENDPROC PROC INSERT_NEW_DESTINATION_TO_LIST(TAXI_DEST newDestination, INT iPosition) SHIFT_LIST_DOWN_1_PLACE_FROM_POSITION(iPosition) AllTaxiDestinations[iPosition] = newDestination // store waypoint blip destination index so we can test for it changing IF GET_SPRITE_FOR_BLIP(AllTaxiDestinations[iPosition].BlipID) = GET_WAYPOINT_BLIP_ENUM_ID() iStoredTaxiWaypointBlipDestinationIndex = iPosition vStoredTaxiWaypointBlipDestinationCoords = GET_BLIP_COORDS(AllTaxiDestinations[iPosition].BlipID) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " INSERT_NEW_DESTINATION_TO_LIST - waypoint blip index set iPosition = ", iPosition, " vStoredTaxiWaypointBlipDestinationCoords set : ", vStoredTaxiWaypointBlipDestinationCoords) ENDIF #IF IS_DEBUG_BUILD IF DOES_BLIP_EXIST(newDestination.BlipID) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " INSERT_NEW_DESTINATION_TO_LIST - set iPosition = ", iPosition, " BlipSprite is ", ENUM_TO_INT(GET_BLIP_SPRITE(AllTaxiDestinations[iPosition].BlipID)), " named ", GET_BLIP_NAME(AllTaxiDestinations[iPosition].BlipID)) ENDIF #ENDIF ENDPROC PROC REPLACE_LIST_DESTINATION_WITH_NEW_DESTINATION(TAXI_DEST newDestination, INT iPosition) AllTaxiDestinations[iPosition] = newDestination // store waypoint blip destination index so we can test for it changing IF GET_SPRITE_FOR_BLIP(AllTaxiDestinations[iPosition].BlipID) = GET_WAYPOINT_BLIP_ENUM_ID() iStoredTaxiWaypointBlipDestinationIndex = iPosition vStoredTaxiWaypointBlipDestinationCoords = GET_BLIP_COORDS(AllTaxiDestinations[iPosition].BlipID) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " REPLACE_LIST_DESTINATION_WITH_NEW_DESTINATION - waypoint blip index updated iPosition = ", iPosition, " vStoredTaxiWaypointBlipDestinationCoords set : ", vStoredTaxiWaypointBlipDestinationCoords) ENDIF #IF IS_DEBUG_BUILD IF DOES_BLIP_EXIST(newDestination.BlipID) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " INSERT_NEW_DESTINATION_TO_LIST - set iPosition = ", iPosition, " BlipSprite is ", ENUM_TO_INT(GET_BLIP_SPRITE(AllTaxiDestinations[iPosition].BlipID)), " named ", GET_BLIP_NAME(AllTaxiDestinations[iPosition].BlipID)) ENDIF #ENDIF ENDPROC PROC ADD_TAXI_DESTINATION_TO_LIST(TAXI_DEST inTaxiDestination, BOOL bListNearestOnly) INT i INT iFirstOfType i = 0 iFirstOfType = 0 IF GET_SPRITE_FOR_BLIP(inTaxiDestination.BlipID) = RADAR_TRACE_INVALID EXIT ENDIF // 2. find first item of this type in list REPEAT MAX_NUMBER_OF_TAXI_DESTINATIONS i IF (GET_SPRITE_FOR_BLIP(AllTaxiDestinations[i].BlipID) = GET_SPRITE_FOR_BLIP(inTaxiDestination.BlipID) ) iFirstOfType = i i = MAX_NUMBER_OF_TAXI_DESTINATIONS ELSE IF i = iTotalNumberOfTaxiDestinations iFirstOfType = i i = MAX_NUMBER_OF_TAXI_DESTINATIONS ENDIF ENDIF ENDREPEAT // 3. Insert into list, based on the distance from player and its blip type i = 0 REPEAT MAX_NUMBER_OF_TAXI_DESTINATIONS i //CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " ADD_TAXI_DESTINATION_TO_LIST - Start of Repeat - i = ", i) IF (i < iFirstOfType) i = iFirstOfType ENDIF IF (i < iTotalNumberOfTaxiDestinations) IF (GET_SPRITE_FOR_BLIP(AllTaxiDestinations[i].BlipID) = GET_SPRITE_FOR_BLIP(inTaxiDestination.BlipID)) IF IS_TAXI_DEST_NEARER_THAN_TAXI_DEST(inTaxiDestination, AllTaxiDestinations[i]) IF (bListNearestOnly) REPLACE_LIST_DESTINATION_WITH_NEW_DESTINATION(inTaxiDestination, i) i = MAX_NUMBER_OF_TAXI_DESTINATIONS EXIT ELSE INSERT_NEW_DESTINATION_TO_LIST(inTaxiDestination, i) iTotalNumberOfTaxiDestinations++ i = MAX_NUMBER_OF_TAXI_DESTINATIONS EXIT ENDIF ELSE //CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " ADD_TAXI_DESTINATION_TO_LIST - destination is not nearer than other of same type!") IF (bListNearestOnly) i = MAX_NUMBER_OF_TAXI_DESTINATIONS EXIT ENDIF ENDIF ELSE INSERT_NEW_DESTINATION_TO_LIST(inTaxiDestination, i) iTotalNumberOfTaxiDestinations++ i = MAX_NUMBER_OF_TAXI_DESTINATIONS EXIT ENDIF ELSE INSERT_NEW_DESTINATION_TO_LIST(inTaxiDestination, i) iTotalNumberOfTaxiDestinations++ i = MAX_NUMBER_OF_TAXI_DESTINATIONS EXIT ENDIF ENDREPEAT ENDPROC PROC GET_TAXI_DESTINATION_FROM_SPRITE_BLIP(BLIP_INDEX &RadarBlipID, TAXI_DEST &ReturnedTaxiDest) // store blip id ReturnedTaxiDest.BlipID = RadarBlipID // get street names IF NOT (ReturnedTaxiDest.BlipID = g_CustomDropOffBlip) VECTOR vCoords = GET_RADAR_BLIP_COORDS(ReturnedTaxiDest.BlipID) GET_STREET_NAME_AT_COORD(vCoords, ReturnedTaxiDest.iHashname1, ReturnedTaxiDest.iHashname2) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : GET_TAXI_DESTINATION_FROM_SPRITE_BLIP() : vCoords = ", vCoords, " ReturnedTaxiDest.iHashname1 = ", ReturnedTaxiDest.iHashname1, " ReturnedTaxiDest.iHashname2 = ", ReturnedTaxiDest.iHashname2) ELSE GET_STREET_NAME_AT_COORD(g_vTaxiDropOffPosition, ReturnedTaxiDest.iHashname1, ReturnedTaxiDest.iHashname2) ENDIF ENDPROC FUNC BOOL IS_DISTANCE_WITHIN_RANGE(BLIP_INDEX BlipID) // destintion must be at least the minimum distance away (unless its a mission blip) FLOAT fDistance IF NOT (GET_SPRITE_FOR_BLIP(BlipID) = taxiStandardBlipSprite) fDistance = GET_BLIP_DISTANCE(BlipID) IF (fDistance > 50.0) //AND (fDistance < 1200.0) RETURN(TRUE) ENDIF ELSE RETURN(TRUE) ENDIF RETURN(FALSE) ENDFUNC PROC ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(BLIP_SPRITE BlipSprite, BOOL bListNearestOnly) TAXI_DEST NewTaxiDest BOOL bFlag BLIP_INDEX RadarBlip RadarBlip = GET_FIRST_BLIP_INFO_ID(BlipSprite) INT iMaxBlipsAllowedProcessPerFrame = 20 eRADAR_BLIP_TYPE eTempBlipType SP_MISSIONS eSP_Mission WHILE DOES_BLIP_EXIST(RadarBlip) // allow more than one blip to process per frame - long run i think needs rewrite to remove wait call IF iCountBlipsAddedToDestinationListThisFrame >= iMaxBlipsAllowedProcessPerFrame CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS - WAIT iCountBlipsAddedToDestinationListThisFrame : ", iCountBlipsAddedToDestinationListThisFrame) WAIT(0) iCountBlipsAddedToDestinationListThisFrame = 0 IF NOT IS_TAXI_SERVICE_SAFE_TO_RUN() TAXI_SERVICE_SCRIPT_CLEANUP() ENDIF UPDATE_TAXI_CAM_POSITIONING() BLOCK_SPECIFIC_PLAYER_CONTROLS_FOR_TAXI_JOURNEY_THIS_FRAME() SUPPRESS_AMBIENT_REACTIONS_FOR_TAXI_JOURNEY_THIS_FRAME() ENDIF IF (iTotalNumberOfTaxiDestinations < MAX_NUMBER_OF_TAXI_DESTINATIONS) IF IS_BLIP_VISIBLE(RadarBlip) IF IS_DISTANCE_WITHIN_RANGE(RadarBlip) IF NOT SHOULD_WE_IGNORE_THIS_BLIP(RadarBlip)//, BlipSprite) // if this is a mission blip, is it higher or lower or normal bFlag = FALSE SWITCH BlipSprite CASE RADAR_TRACE_OBJECTIVE FALLTHRU CASE RADAR_TRACE_OBJECTIVE_BLUE FALLTHRU CASE RADAR_TRACE_OBJECTIVE_GREEN FALLTHRU CASE RADAR_TRACE_OBJECTIVE_RED FALLTHRU CASE RADAR_TRACE_OBJECTIVE_YELLOW FALLTHRU CASE RADAR_TRACE_MICHAEL_FAMILY FALLTHRU CASE RADAR_TRACE_TREVOR_FAMILY FALLTHRU CASE RADAR_TRACE_FRANKLIN_FAMILY FALLTHRU CASE RADAR_TRACE_MICHAEL_TREVOR_FAMILY FALLTHRU CASE RADAR_TRACE_MICHAEL_FAMILY_EXILE FALLTHRU CASE RADAR_TRACE_TREVOR_FAMILY_EXILE FALLTHRU CASE RADAR_TRACE_SIMEON_FAMILY FALLTHRU CASE RADAR_TRACE_LAMAR_FAMILY FALLTHRU CASE RADAR_TRACE_LESTER_FAMILY FALLTHRU CASE RADAR_TRACE_CHINESE_STRAND FALLTHRU CASE RADAR_TRACE_FBI_OFFICERS_STRAND FALLTHRU CASE RADAR_TRACE_FINANCIER_STRAND FALLTHRU CASE RADAR_TRACE_SOLOMON_STRAND FALLTHRU CASE RADAR_TRACE_MARTIN_MADRAZZO FALLTHRU CASE RADAR_TRACE_FINALE_BANK_HEIST FALLTHRU CASE RADAR_TRACE_BIOLAB_HEIST FALLTHRU CASE RADAR_TRACE_DOCKS_HEIST FALLTHRU CASE RADAR_TRACE_FBI_HEIST FALLTHRU CASE RADAR_TRACE_JEWELRY_HEIST FALLTHRU CASE RADAR_TRACE_NICE_HOUSE_HEIST FALLTHRU CASE RADAR_TRACE_RURAL_BANK_HEIST FALLTHRU CASE RADAR_TRACE_ASSASSINS_MARK FALLTHRU CASE RADAR_TRACE_ABIGAIL FALLTHRU CASE RADAR_TRACE_BARRY FALLTHRU CASE RADAR_TRACE_CLETUS FALLTHRU CASE RADAR_TRACE_DOM FALLTHRU CASE RADAR_TRACE_EPSILON FALLTHRU CASE RADAR_TRACE_FANATIC FALLTHRU CASE RADAR_TRACE_JOSH FALLTHRU CASE RADAR_TRACE_MARYANN FALLTHRU CASE RADAR_TRACE_MINUTE FALLTHRU CASE RADAR_TRACE_OMEGA FALLTHRU CASE RADAR_TRACE_PAPARAZZO FALLTHRU CASE RADAR_TRACE_TONYA FALLTHRU CASE RADAR_TRACE_CELEBRITY_THEFT FALLTHRU CASE RADAR_TRACE_RANDOM_CHARACTER FALLTHRU CASE RADAR_TRACE_RANDOM_MALE FALLTHRU CASE RADAR_TRACE_RANDOM_FEMALE FALLTHRU CASE RADAR_TRACE_PLANNING_LOCATIONS FALLTHRU CASE RADAR_TRACE_SAFEHOUSE FALLTHRU CASE RADAR_TRACE_GARAGE FALLTHRU CASE RADAR_TRACE_DOCK FALLTHRU CASE RADAR_TRACE_HANGAR FALLTHRU CASE RADAR_TRACE_GUN_SHOP FALLTHRU CASE RADAR_TRACE_POLICE_STATION FALLTHRU CASE RADAR_TRACE_POLICE FALLTHRU //CASE RADAR_TRACE_FIRE FALLTHRU CASE RADAR_TRACE_HOSPITAL FALLTHRU //CASE RADAR_TRACE_AIRPORT FALLTHRU CASE RADAR_TRACE_BUSINESS FALLTHRU CASE RADAR_TRACE_BUSINESS_FOR_SALE FALLTHRU CASE RADAR_TRACE_HELICOPTER FALLTHRU //CASE RADAR_TRACE_STATION FALLTHRU CASE RADAR_TRACE_ACTIVITIES FALLTHRU CASE RADAR_TRACE_ARMS_DEALING FALLTHRU CASE RADAR_TRACE_BASKETBALL FALLTHRU //CASE RADAR_TRACE_BOWLING FALLTHRU CASE RADAR_TRACE_CABERET_CLUB FALLTHRU CASE RADAR_TRACE_COMEDY_CLUB FALLTHRU CASE RADAR_TRACE_CINEMA FALLTHRU CASE RADAR_TRACE_DARTS FALLTHRU //CASE RADAR_TRACE_DRAG_RACE FALLTHRU CASE RADAR_TRACE_FLIGHT_SCHOOL FALLTHRU CASE RADAR_TRACE_GOLF FALLTHRU CASE RADAR_TRACE_HUNTING FALLTHRU CASE RADAR_TRACE_MUSIC_VENUE FALLTHRU CASE RADAR_TRACE_OFF_ROAD_RACING FALLTHRU CASE RADAR_TRACE_POOL FALLTHRU CASE RADAR_TRACE_RACEFLAG FALLTHRU CASE RADAR_TRACE_RAMPAGE FALLTHRU CASE RADAR_TRACE_SHOOTING_RANGE FALLTHRU CASE RADAR_TRACE_STRIP_CLUB FALLTHRU CASE RADAR_TRACE_TENNIS FALLTHRU CASE RADAR_TRACE_TOW_TRUCK FALLTHRU CASE RADAR_TRACE_TRIATHLON FALLTHRU CASE RADAR_TRACE_VINEWOOD_TOURS FALLTHRU CASE RADAR_TRACE_WEED_STASH FALLTHRU CASE RADAR_TRACE_BARBER FALLTHRU CASE RADAR_TRACE_CAR_MOD_SHOP FALLTHRU CASE RADAR_TRACE_BENNYS FALLTHRU CASE RADAR_TRACE_GANG_VEHICLE FALLTHRU // vehicle impound (trace might be placeholder) CASE RADAR_TRACE_CLOTHES_STORE FALLTHRU //CASE RADAR_TRACE_GYM FALLTHRU CASE RADAR_TRACE_INTERNET_CAFE FALLTHRU CASE RADAR_TRACE_TATTOO FALLTHRU CASE RADAR_TRACE_BAR FALLTHRU CASE RADAR_TRACE_BURGER_SHOT FALLTHRU //CASE RADAR_TRACE_CLUCKIN_BELL FALLTHRU //CASE RADAR_TRACE_DRIVE_THRU FALLTHRU CASE RADAR_TRACE_RESTAURANT FALLTHRU //CASE RADAR_TRACE_TACO_VAN FALLTHRU CASE RADAR_TRACE_RACE_LAND FALLTHRU // B*2045170 - Country Races CASE RADAR_TRACE_YOGA FALLTHRU CASE RADAR_TRACE_POI FALLTHRU CASE RADAR_TRACE_SHRINK FALLTHRU CASE RADAR_TRACE_FINANCIER_STRAND_GREY FALLTHRU CASE RADAR_TRACE_TREVOR_FAMILY_GREY FALLTHRU CASE RADAR_TRACE_TREVOR_FAMILY_RED FALLTHRU CASE RADAR_TRACE_FRANKLIN_FAMILY_GREY FALLTHRU CASE RADAR_TRACE_FRANKLIN_FAMILY_BLUE FALLTHRU CASE RADAR_TRACE_FRANKLIN_A FALLTHRU CASE RADAR_TRACE_FRANKLIN_B FALLTHRU CASE RADAR_TRACE_FRANKLIN_C FALLTHRU CASE RADAR_TRACE_FRIEND_FRANKLIN_P FALLTHRU CASE RADAR_TRACE_FRIEND_FRANKLIN_X FALLTHRU CASE RADAR_TRACE_FRIEND_MICHAEL_P FALLTHRU CASE RADAR_TRACE_FRIEND_MICHAEL_X FALLTHRU CASE RADAR_TRACE_FRIEND_TREVOR_P FALLTHRU CASE RADAR_TRACE_FRIEND_TREVOR_X FALLTHRU CASE RADAR_TRACE_FRIEND_LAMAR FALLTHRU CASE RADAR_TRACE_FRIEND FALLTHRU CASE RADAR_TRACE_DEVIN FALLTHRU CASE RADAR_TRACE_STINGER FALLTHRU CASE RADAR_TRACE_ZTYPE FALLTHRU CASE RADAR_TRACE_PROPERTY FALLTHRU CASE RADAR_TRACE_FAIRGROUND FALLTHRU CASE RADAR_TRACE_MONROE FALLTHRU CASE RADAR_TRACE_FIRETRUCK FALLTHRU CASE RADAR_TRACE_SPIKES FALLTHRU CASE RADAR_TRACE_DRILL FALLTHRU CASE RADAR_TRACE_MINIGUN2 FALLTHRU CASE RADAR_TRACE_CHINOOK FALLTHRU CASE RADAR_TRACE_SUBMARINE FALLTHRU CASE RADAR_TRACE_GAS_GRENADE FALLTHRU CASE RADAR_TRACE_BUGSTAR FALLTHRU CASE RADAR_TRACE_GETAWAY_CAR FALLTHRU CASE RADAR_TRACE_TOW FALLTHRU CASE RADAR_TRACE_GARBAGE bFlag = TRUE //CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS - BlipSprite = FOUND!") BREAK // B*1506184 - Radar traces where we need to filter out blips which aren't supported (moving mission blips) CASE RADAR_TRACE_HEIST_PREP eSP_Mission = GET_BLIPS_ACTIVE_STORY_MISSION(RadarBlip) IF eSP_Mission = SP_MISSION_FBI_4_PREP_1 // : STATIC_BLIP_MISSION_FBI_OFFICERS4_P1 : HEAT Prep 1 : Steal Garbage Truck OR eSP_Mission = SP_HEIST_RURAL_PREP_1 // : STATIC_BLIP_MISSION_RURAL_P1 : The Paleto Score Prep : Ambush military convoy to nick minigun and body armour OR eSP_Mission = SP_HEIST_JEWELRY_PREP_1B // : STATIC_BLIP_MISSION_JEWELRY_P1B : The Jewel Store Job Prep 1B : Steal LCPD tactical squad van to nick carbine rifles OR eSP_Mission = SP_HEIST_JEWELRY_PREP_2A // : STATIC_BLIP_MISSION_JEWELRY_P2A : The Jewel Store Job Prep 2A : Intercept delivery van containing BZ grenades bFlag = FALSE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS - BlipSprite blocked, detected moving prep blipSprite") ELSE bFlag = TRUE ENDIF BREAK DEFAULT //CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS - BlipSprite = SOMETHING ELSE") bFlag = FALSE // allow custom waypoint IF BlipSprite = taxiWaypointBlipSprite bFlag = TRUE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS - waypoint blip found") // only allow location mission blips ELIF BlipSprite = taxiStandardBlipSprite //eTempBlipType = GET_BLIP_INFO_ID_TYPE(RadarBlip) #IF IS_DEBUG_BUILD DEBUG_PRINT_BLIP_TYPE_TO_TTY(RadarBlip) #ENDIF // temp until GET_BLIP_INFO_ID_TYPE is fixed - only allow blue and yellow blips // allow might still want to check colour since script sometimes have to fudge the blip types IF IS_BLIP_COLOUR_ALLOWED_FOR_STANDARD_BLIP(RadarBlip) bFlag = TRUE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS - standard blip found ") ENDIF ENDIF BREAK ENDSWITCH // if this is a mission blip, check if its the only mission blip to display IF DOES_BLIP_EXIST(g_OnlyMissionBlipToDisplayOnTaxiMeter) IF (GET_SPRITE_FOR_BLIP(RadarBlip) = taxiStandardBlipSprite) IF NOT (g_OnlyMissionBlipToDisplayOnTaxiMeter = RadarBlip) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS - only a single mission blip has been authorized, and this aint it.") bFlag = FALSE ENDIF ENDIF ENDIF IF (bFlag) bFlag = FALSE IF IS_BLIP_VISIBLE(RadarBlip) eTempBlipType = GET_BLIP_INFO_ID_TYPE(RadarBlip) //#IF IS_DEBUG_BUILD DEBUG_PRINT_BLIP_TYPE_TO_TTY(RadarBlip) #ENDIF IF (eTempBlipType = BLIPTYPE_COORDS) OR (eTempBlipType = BLIPTYPE_CONTACT) OR (eTempBlipType = BLIPTYPE_CHAR) OR (eTempBlipType = BLIPTYPE_VEHICLE) bFlag = TRUE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS - blip type acceptable+") ENDIF ENDIF IF (bFlag) GET_TAXI_DESTINATION_FROM_SPRITE_BLIP(RadarBlip, NewTaxiDest) ADD_TAXI_DESTINATION_TO_LIST(NewTaxiDest, bListNearestOnly) //CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS - blip added to destinations BlipSprite = ", BlipSprite) ENDIF ENDIF ENDIF ENDIF ENDIF ELSE //CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS - (iTotalNumberOfTaxiDestinations = MAX_NUMBER_OF_TAXI_DESTINATIONS)") ENDIF iCountBlipsAddedToDestinationListThisFrame++ RadarBlip = GET_NEXT_BLIP_INFO_ID(BlipSprite) ENDWHILE ENDPROC PROC INIT_TAXI_DESTINATIONS() INT i iTotalNumberOfTaxiDestinations = 0 // 1. clear current list //CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " INIT_TAXI_DESTINATIONS - clearing destination list... ") CLEAR_TAXI_DESTINATION_LIST() // 2. Use Dereks commands to grab each radar blip and add it to the the list //CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " INIT_TAXI_DESTINATIONS - creating new destination list... ") // mission - top priority ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(taxiStandardBlipSprite , FALSE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(taxiWaypointBlipSprite , FALSE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_OBJECTIVE , FALSE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_OBJECTIVE_BLUE , FALSE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_OBJECTIVE_GREEN , FALSE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_OBJECTIVE_RED , FALSE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_OBJECTIVE_YELLOW , FALSE) // contacts - next priority ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_MICHAEL_FAMILY , FALSE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_TREVOR_FAMILY , FALSE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_FRANKLIN_FAMILY , FALSE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_MICHAEL_TREVOR_FAMILY, FALSE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_MICHAEL_FAMILY_EXILE , FALSE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_TREVOR_FAMILY_EXILE , FALSE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_SIMEON_FAMILY , FALSE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_LAMAR_FAMILY , FALSE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_LESTER_FAMILY , FALSE) // mission trigger blips ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_CHINESE_STRAND , FALSE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_FBI_OFFICERS_STRAND , FALSE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_FINANCIER_STRAND , FALSE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_SOLOMON_STRAND , FALSE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_MARTIN_MADRAZZO , FALSE) // Heist blips ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_FINALE_BANK_HEIST, FALSE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_BIOLAB_HEIST , FALSE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_DOCKS_HEIST , FALSE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_FBI_HEIST , FALSE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_JEWELRY_HEIST , FALSE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_NICE_HOUSE_HEIST , FALSE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_RURAL_BANK_HEIST , FALSE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_FINANCIER_STRAND_GREY, TRUE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_TREVOR_FAMILY_GREY , TRUE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_TREVOR_FAMILY_RED , TRUE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_FRANKLIN_FAMILY_GREY , TRUE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_FRANKLIN_FAMILY_BLUE , TRUE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_FRANKLIN_A , TRUE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_FRANKLIN_B , TRUE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_FRANKLIN_C , TRUE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_FIRETRUCK , TRUE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_SPIKES , TRUE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_DRILL , TRUE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_MINIGUN2 , TRUE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_CHINOOK , TRUE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_SUBMARINE , TRUE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_GAS_GRENADE , TRUE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_BUGSTAR , TRUE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_GETAWAY_CAR , TRUE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_TOW , TRUE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_GARBAGE , TRUE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_HEIST_PREP , FALSE) // Car Steal blips ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_DEVIN , FALSE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_STINGER , TRUE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_ZTYPE , TRUE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_PROPERTY , TRUE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_FAIRGROUND , TRUE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_MONROE , TRUE) // procedural missions. ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_ABIGAIL , FALSE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_BARRY , FALSE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_CLETUS , FALSE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_DOM , FALSE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_EPSILON , FALSE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_FANATIC , FALSE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_JOSH , FALSE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_MARYANN , FALSE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_MINUTE , FALSE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_OMEGA , FALSE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_PAPARAZZO , FALSE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_TONYA , FALSE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_CELEBRITY_THEFT , FALSE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_RANDOM_CHARACTER , FALSE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_RANDOM_MALE , FALSE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_RANDOM_FEMALE , FALSE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_SHRINK , TRUE) // safe house & services ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_PLANNING_LOCATIONS, FALSE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_SAFEHOUSE , TRUE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_GARAGE , TRUE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_DOCK , TRUE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_HANGAR , TRUE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_GUN_SHOP , TRUE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_POLICE_STATION , TRUE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_POLICE , TRUE) //ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_FIRE , TRUE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_HOSPITAL , TRUE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_BUSINESS , TRUE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_BUSINESS_FOR_SALE, TRUE) // transport //ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_AIRPORT , TRUE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_HELICOPTER , TRUE) // ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_STATION , TRUE) // Activities & Minigames ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_FRIEND_FRANKLIN_P, TRUE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_FRIEND_FRANKLIN_X, TRUE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_FRIEND_MICHAEL_P, TRUE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_FRIEND_MICHAEL_X, TRUE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_FRIEND_TREVOR_P, TRUE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_FRIEND_TREVOR_X, TRUE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_FRIEND_LAMAR, TRUE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_FRIEND, TRUE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_ACTIVITIES , TRUE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_ARMS_DEALING , TRUE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_ASSASSINS_MARK , FALSE) // B*1323779 - Lester and Assassination missions share same blip so have to list all ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_BASKETBALL , TRUE) //ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_BOWLING , TRUE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_CABERET_CLUB , TRUE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_COMEDY_CLUB , TRUE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_CINEMA , TRUE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_DARTS , TRUE) //ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_DRAG_RACE , TRUE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_FLIGHT_SCHOOL , TRUE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_GOLF , TRUE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_HUNTING , TRUE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_MUSIC_VENUE , TRUE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_OFF_ROAD_RACING , TRUE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_POOL , TRUE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_RACEFLAG , TRUE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_RAMPAGE , TRUE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_SHOOTING_RANGE , TRUE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_STRIP_CLUB , TRUE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_TENNIS , TRUE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_TOW_TRUCK , TRUE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_TRIATHLON , TRUE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_VINEWOOD_TOURS , TRUE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_WEED_STASH , TRUE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_YOGA , TRUE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_POI , TRUE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_RACE_LAND , TRUE) // B*2045170 - Country Races // shops ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_BARBER , TRUE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_CAR_MOD_SHOP , TRUE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_BENNYS , TRUE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_GANG_VEHICLE , TRUE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_CLOTHES_STORE , TRUE) //ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_GYM , TRUE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_INTERNET_CAFE , TRUE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_TATTOO , TRUE) // food & drink ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_BAR , TRUE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_BURGER_SHOT , TRUE) //ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_CLUCKIN_BELL , TRUE) //ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_DRIVE_THRU , TRUE) ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_RESTAURANT , TRUE) //ADD_RADAR_SPRITES_TO_TAXI_DESTINATIONS(RADAR_TRACE_TACO_VAN , TRUE) // other iStoredCountedMissionLocations = COUNT_MISSION_BLIPS_ON_RADAR() iStoredNumberOfBlips = GET_NUMBER_OF_ACTIVE_BLIPS() // set the current selected blip IF GET_MISSION_FLAG() IF iStoredCountedMissionLocations = 0 IF DOES_BLIP_EXIST(g_FirstBlipInTaxiMeter) REPEAT MAX_NUMBER_OF_TAXI_DESTINATIONS i IF DOES_BLIP_EXIST(AllTaxiDestinations[i].BlipID) IF (AllTaxiDestinations[i].BlipID = g_FirstBlipInTaxiMeter) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " First Blip in Taxi meter forced ") iCurrentHighlightedPosition = i i = MAX_NUMBER_OF_TAXI_DESTINATIONS ENDIF ENDIF ENDREPEAT ENDIF ENDIF ELSE IF NOT (g_FirstBlipInTaxiMeter = NULL) g_FirstBlipInTaxiMeter = NULL ENDIF ENDIF // set the current selected blip (based on blip sprite) IF GET_MISSION_FLAG() IF NOT (g_FirstBlipSpriteInTaxiMeter = RADAR_TRACE_INVALID) REPEAT MAX_NUMBER_OF_TAXI_DESTINATIONS i IF DOES_BLIP_EXIST(AllTaxiDestinations[i].BlipID) IF (GET_SPRITE_FOR_BLIP(AllTaxiDestinations[i].BlipID) = g_FirstBlipSpriteInTaxiMeter) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " First Blip Sprite in Taxi meter forced ") iCurrentHighlightedPosition = i i = MAX_NUMBER_OF_TAXI_DESTINATIONS ENDIF ENDIF ENDREPEAT ENDIF ELSE IF NOT (g_FirstBlipSpriteInTaxiMeter = RADAR_TRACE_INVALID) g_FirstBlipSpriteInTaxiMeter = RADAR_TRACE_INVALID ENDIF ENDIF ENDPROC PROC HIGHLIGHT_CHOSEN_DESTINATION() INT i = START_POSITION REPEAT iTotalNumberOfTaxiDestinations i // Grab the current destination index if the meter has been repopulated. IF bDestinationSelected IF currentTaxiDestination.BlipID = AllTaxiDestinations[i].BlipID iCurrentHighlightedPosition = i CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " HIGHLIGHT_CHOSEN_DESTINATION : iCurrentHighlightedPosition = ", i) #IF IS_DEBUG_BUILD IF DOES_BLIP_EXIST(AllTaxiDestinations[iCurrentHighlightedPosition].BlipID) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), "HIGHLIGHT_CHOSEN_DESTINATION : GET_BLIP_INFO :", GET_BLIP_NAME(AllTaxiDestinations[iCurrentHighlightedPosition].BlipID)) ENDIF #ENDIF ENDIF ENDIF ENDREPEAT /* // B*1415214 - removed this since it occasionally caused meter to default and show the first destination BEGIN_SCALEFORM_MOVIE_METHOD(scaleformTaxiMeter,"SHOW_TAXI_DESTINATION") END_SCALEFORM_MOVIE_METHOD()*/ BEGIN_SCALEFORM_MOVIE_METHOD(scaleformTaxiMeter, "HIGHLIGHT_DESTINATION") SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iCurrentHighlightedPosition) // 1. Position in list. CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), "HIGHLIGHT_CHOSEN_DESTINATION : set scaleform move method add para int :", iCurrentHighlightedPosition) END_SCALEFORM_MOVIE_METHOD() ENDPROC //PURPOSE: Sets the MiniMap locking to the destination PROC SET_MINIMAP_LOCKING() IF DOES_BLIP_EXIST(currentTaxiDestination.BlipID) VECTOR vBlipCoords = GET_BLIP_COORDS(currentTaxiDestination.BlipID) IF DOES_CAM_EXIST(camMeter) AND IS_CAM_ACTIVE(camMeter) LOCK_MINIMAP_POSITION(vBlipCoords.X, vBlipCoords.Y) LOCK_MINIMAP_ANGLE(0) SET_RADAR_ZOOM(1400) ENDIF ENDIF ENDPROC /// PURPOSE: /// update's the scripted in taxi camera's rotation besed of player input /// (simulates looking around) /// NOTE: not currently in use - MP had request to make cam static PROC UPDATE_IN_TAXI_ROT_BASED_OFF_PLAYER_CONTROLS() FLOAT fTemp INT right_stick_x, right_stick_y right_stick_x = GET_CONTROL_VALUE(FRONTEND_CONTROL,INPUT_SCALED_LOOK_LR) - 128 right_stick_y = GET_CONTROL_VALUE(FRONTEND_CONTROL,INPUT_SCALED_LOOK_UD) - 128 IF NOT IS_LOOK_INVERTED() right_stick_y *= -1 ENDIF // invert the vertical IF (right_stick_y > STICK_DEAD_ZONE) OR (right_stick_y < (STICK_DEAD_ZONE * -1)) OR IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL) fTemp = TO_FLOAT(right_stick_y) fTemp *= fTemp fTemp /= TO_FLOAT(128 - STICK_DEAD_ZONE) * TO_FLOAT(128 - STICK_DEAD_ZONE) fTemp *= fTaxiCamSpeed IF (right_stick_y < 0) fTemp *= -1.0 ENDIF fTaxiCamChangeY += fTemp IF (fTaxiCamChangeY < fMinYChange) fTaxiCamChangeY = fMinYChange ENDIF IF (fTaxiCamChangeY > fMaxYChange) fTaxiCamChangeY = fMaxYChange ENDIF ENDIF IF (right_stick_x > STICK_DEAD_ZONE) OR (right_stick_x < (STICK_DEAD_ZONE * -1)) OR IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL) fTemp = TO_FLOAT(right_stick_x) fTemp *= fTemp fTemp /= TO_FLOAT(128 - STICK_DEAD_ZONE) * TO_FLOAT(128 - STICK_DEAD_ZONE) fTemp *= fTaxiCamSpeed IF (right_stick_x > 0) fTemp *= -1.0 ENDIF fTaxiCamChangeX += fTemp IF (fTaxiCamChangeX < fMinXChange) fTaxiCamChangeX = fMinXChange ENDIF IF (fTaxiCamChangeX > fMaxXChange) fTaxiCamChangeX = fMaxXChange ENDIF ENDIF IF IS_CONTROL_JUST_PRESSED(CAMERA_CONTROL, INPUT_LOOK_BEHIND) fTaxiCamChangeX = 0 fTaxiCamChangeY = 0 ENDIF SET_CAMERA_ROT_TO_SAME_AS_VEHICLE(g_WaitingTaxi, camMeter, <>) ENDPROC /// PURPOSE: /// handles the in taxi camera PROC RUN_TAXI_INTERIOR_CAM() IF NOT IS_VEHICLE_DRIVEABLE(g_WaitingTaxi) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : RUN_TAXI_INTERIOR_CAM() - g_WaitingTaxi isn't driveable ") EXIT ENDIF // create the camera IF NOT DOES_CAM_EXIST(camMeter) IF NOT IS_SELECTOR_CAM_ACTIVE() AND NOT IS_SCRIPT_HUD_DISPLAYING(HUDPART_TRANSITIONHUD) camMeter = CREATE_CAM("DEFAULT_SCRIPTED_CAMERA", FALSE) ATTACH_CAM_TO_ENTITY(camMeter, g_WaitingTaxi, vTaxiCamOffset) // position every frame instead UPDATE_TAXI_CAM_POSITIONING() SET_CAM_CONTROLS_MINI_MAP_HEADING(camMeter, TRUE) CPRINTLN(DEBUG_TAXI_SERVICE, " RUN_TAXI_INTERIOR_CAM() - created camera") ENDIF ELSE // run destination selection camera IF NOT bDestinationSelected // if user hasn't selected the initial destination OR bSelectingAnotherDestination // or user is selecting a new destination // conditions where camera shouldn't update IF NOT IS_SELECTOR_CAM_ACTIVE() AND NOT IS_SCRIPT_HUD_DISPLAYING(HUDPART_TRANSITIONHUD) // setup destination selection camera IF NOT IS_CAM_ACTIVE(camMeter) DISABLE_SCRIPT_HUD(HUDPART_ALL_OVERHEADS, TRUE) SET_CAM_CONTROLS_MINI_MAP_HEADING(camMeter, TRUE) SET_MINIMAP_LOCKING() SET_CAM_ACTIVE(camMeter, TRUE) RENDER_SCRIPT_CAMS(TRUE, FALSE) g_bTaxiShouldForcePhoneDislayOnHud = TRUE // B*2053172 - set when phone needs to be forced to display on the hud if active when a passenger in a taxi SET_PARTICLE_FX_CAM_INSIDE_VEHICLE(TRUE) // B*1549323 - stops rain inside taxi UPDATE_TAXI_CAM_POSITIONING() bUpdateTaxiControls = TRUE // regen controls UI for selecting destination camera CPRINTLN(DEBUG_TAXI_SERVICE, " RUN_TAXI_INTERIOR_CAM() - activated camera") // cam is active so update it ELSE UPDATE_TAXI_CAM_POSITIONING() ENDIF // prevent player changing vehicle zoom level whils the destination selection camera is active DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_NEXT_CAMERA) ENDIF // cleanup the destination selection camera if it's active ELSE IF IS_CAM_ACTIVE(camMeter) SET_CAM_ACTIVE(camMeter, FALSE) SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0) SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0) RENDER_SCRIPT_CAMS(FALSE, FALSE) g_bTaxiShouldForcePhoneDislayOnHud = FALSE // B*2053172 - set when phone needs to be forced to display on the hud if active when a passenger in a taxi SET_PARTICLE_FX_CAM_INSIDE_VEHICLE(FALSE) // B*1549323 - stops rain inside taxi UNLOCK_MINIMAP_POSITION() UNLOCK_MINIMAP_ANGLE() SET_RADAR_ZOOM(0) bUpdateTaxiControls = TRUE HIGHLIGHT_CHOSEN_DESTINATION() CPRINTLN(DEBUG_TAXI_SERVICE, " RUN_TAXI_INTERIOR_CAM() - deactivated camera") ENDIF ENDIF ENDIF ENDPROC /// PURPOSE: /// check the interior meter camera exists and is active /// RETURNS: /// TRUE if active FUNC BOOL IS_PLAYER_TRYING_TO_CHANGE_TAXI_DESTINATION() IF DOES_CAM_EXIST(camMeter) IF IS_CAM_ACTIVE(camMeter) RETURN TRUE ENDIF ENDIF IF bSelectingAnotherDestination RETURN TRUE ENDIF RETURN FALSE ENDFUNC PROC POPULATE_TAXI_METER() INT i = START_POSITION, iR, iG, iB, iA VECTOR vTemp SHOP_NAME_ENUM eShop INIT_TAXI_DESTINATIONS() //CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : POPULATE_TAXI_METER() SCALEFORM - CLEAR_TAXI_DISPLAY called") BEGIN_SCALEFORM_MOVIE_METHOD(scaleformTaxiMeter,"CLEAR_TAXI_DISPLAY") END_SCALEFORM_MOVIE_METHOD() REPEAT iTotalNumberOfTaxiDestinations i // safe checks to decide if this entry shouldn't be added IF NOT DOES_BLIP_EXIST(AllTaxiDestinations[i].BlipID) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : POPULATE_TAXI_METER() SKIPPED! populate due to DOES_BLIP_EXIST(AllTaxiDestinations[", i, "].BlipID) = FALSE") ELIF GET_SPRITE_FOR_BLIP(AllTaxiDestinations[i].BlipID) = RADAR_TRACE_INVALID CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : POPULATE_TAXI_METER() SKIPPED! populate due to GET_SPRITE_FOR_BLIP(AllTaxiDestinations[", i, "].BlipID) = RADAR_TRACE_INVALID") ELIF ARE_VECTORS_ALMOST_EQUAL(GET_BLIP_COORDS(AllTaxiDestinations[i].BlipID), <<0,0,0>>) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : POPULATE_TAXI_METER() SKIPPED! populate due to ARE_VECTORS_ALMOST_EQUAL(GET_BLIP_COORDS(AllTaxiDestinations[", i, "].BlipID), <<0,0,0>>)") // safe to populate the meter with this entry ELSE BEGIN_SCALEFORM_MOVIE_METHOD(scaleformTaxiMeter,"ADD_TAXI_DESTINATION") SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(i) // 1. Position in list. SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(ENUM_TO_INT(GET_BLIP_SPRITE(AllTaxiDestinations[i].BlipID))) // 2. The sprite to be displayed. //Set the sprite colour GET_HUD_COLOUR(GET_BLIP_HUD_COLOUR(AllTaxiDestinations[i].BlipID), iR, iG, iB, iA) SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iR) SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iG) SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iB) //SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iA) // func doesn't take alpha value so don't try to pas it in. CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " POPULATE_TAXI_METER() : BlipSprite is ", ENUM_TO_INT(GET_BLIP_SPRITE(AllTaxiDestinations[i].BlipID)), " and i is ", i, " named ", GET_BLIP_NAME(AllTaxiDestinations[i].BlipID)) // Check if this is a shop eShop = GET_SHOP_FROM_MAP_BLIP(AllTaxiDestinations[i].BlipID) IF eShop = EMPTY_SHOP // not a shop, use blip name BEGIN_TEXT_COMMAND_SCALEFORM_STRING("STRING") ADD_TEXT_COMPONENT_SUBSTRING_BLIP_NAME(AllTaxiDestinations[i].BlipID) // 3. The name of the blip. END_TEXT_COMMAND_SCALEFORM_STRING() ELSE // this is a shop, get its name BEGIN_TEXT_COMMAND_SCALEFORM_STRING("STRING") ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL(GET_SHOP_BLIP_NAME(eShop)) END_TEXT_COMMAND_SCALEFORM_STRING() ENDIF IF (GET_BLIP_INFO_ID_TYPE(AllTaxiDestinations[i].BlipID) = BLIPTYPE_CHAR) IF NOT IS_PED_INJURED(GET_PED_INDEX_FROM_ENTITY_INDEX(GET_BLIP_INFO_ID_ENTITY_INDEX(AllTaxiDestinations[i].BlipID))) vTemp = GET_ENTITY_COORDS(GET_PED_INDEX_FROM_ENTITY_INDEX(GET_BLIP_INFO_ID_ENTITY_INDEX(AllTaxiDestinations[i].BlipID))) ENDIF ELIF (GET_BLIP_INFO_ID_TYPE(AllTaxiDestinations[i].BlipID) = BLIPTYPE_VEHICLE) IF IS_VEHICLE_DRIVEABLE(GET_BLIP_INFO_ID_ENTITY_INDEX(AllTaxiDestinations[i].BlipID)) vTemp = GET_ENTITY_COORDS(GET_BLIP_INFO_ID_ENTITY_INDEX(AllTaxiDestinations[i].BlipID)) ENDIF ELSE vTemp = GET_BLIP_COORDS(AllTaxiDestinations[i].BlipID) ENDIF SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(GET_NAME_OF_ZONE(vTemp)) // 4. Name of zone. //CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " POPULATE_TAXI_METER() : ADD_TAXI_DESTINATION destination blip coords ", vTemp) IF AllTaxiDestinations[i].iHashname2 = 0 // One street name IF AllTaxiDestinations[i].iHashname1 <> 0 // No Street Name BEGIN_TEXT_COMMAND_SCALEFORM_STRING("STRTNM1") // ~a~ ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL_HASH_KEY(AllTaxiDestinations[i].iHashname1) // 5a. Name of street. END_TEXT_COMMAND_SCALEFORM_STRING() ENDIF ELSE // Two street names // or BEGIN_TEXT_COMMAND_SCALEFORM_STRING("STRTNM2") // ~a~ and ~a~ ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL_HASH_KEY(AllTaxiDestinations[i].iHashname1) // 5b. Name of streets. ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL_HASH_KEY(AllTaxiDestinations[i].iHashname2) END_TEXT_COMMAND_SCALEFORM_STRING() ENDIF END_SCALEFORM_MOVIE_METHOD() // Grab the current destination index if the meter has been repopulated. IF bDestinationSelected IF currentTaxiDestination.BlipID = AllTaxiDestinations[i].BlipID iCurrentHighlightedPosition = i CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " POPULATE_TAXI_METER : iCurrentHighlightedPosition = ", i) #IF IS_DEBUG_BUILD IF DOES_BLIP_EXIST(currentTaxiDestination.BlipID) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), "POPULATE_TAXI_METER : GET_BLIP_INFO :", GET_BLIP_NAME(currentTaxiDestination.BlipID)) ENDIF #ENDIF ENDIF ENDIF ENDIF ENDREPEAT IF bDestinationSelected //CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : POPULATE_TAXI_METER() SCALEFORM - adding methods - SHOW_TAXI_DESTINATION & HIGHLIGHT_DESTINATION = ", iCurrentHighlightedPosition) BEGIN_SCALEFORM_MOVIE_METHOD(scaleformTaxiMeter,"SHOW_TAXI_DESTINATION") END_SCALEFORM_MOVIE_METHOD() BEGIN_SCALEFORM_MOVIE_METHOD(scaleformTaxiMeter, "HIGHLIGHT_DESTINATION") SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iCurrentHighlightedPosition) END_SCALEFORM_MOVIE_METHOD() ELSE //CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : POPULATE_TAXI_METER() SCALEFORM - adding methods - SET_TAXI_PRICE = ", currentJourneyPrice, " SHOW_TAXI_DESTINATION & HIGHLIGHT_DESTINATION = ", iCurrentHighlightedPosition) BEGIN_SCALEFORM_MOVIE_METHOD(scaleformTaxiMeter,"SET_TAXI_PRICE") SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(currentJourneyPrice) END_SCALEFORM_MOVIE_METHOD() BEGIN_SCALEFORM_MOVIE_METHOD(scaleformTaxiMeter,"SHOW_TAXI_DESTINATION") END_SCALEFORM_MOVIE_METHOD() BEGIN_SCALEFORM_MOVIE_METHOD(scaleformTaxiMeter, "HIGHLIGHT_DESTINATION") SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iCurrentHighlightedPosition) END_SCALEFORM_MOVIE_METHOD() ENDIF ENDPROC FUNC INT GET_NUMBER_OF_TAXI_OCCUPANTS() INT iOccupants = 0 IF IS_VEHICLE_OK(g_WaitingTaxi) IF NOT IS_VEHICLE_SEAT_FREE(g_WaitingTaxi, VS_DRIVER) iOccupants++ ENDIF IF NOT IS_VEHICLE_SEAT_FREE(g_WaitingTaxi, VS_FRONT_RIGHT) iOccupants++ ENDIF IF NOT IS_VEHICLE_SEAT_FREE(g_WaitingTaxi, VS_BACK_LEFT) iOccupants++ ENDIF IF NOT IS_VEHICLE_SEAT_FREE(g_WaitingTaxi, VS_BACK_RIGHT) iOccupants++ ENDIF ENDIF RETURN iOccupants ENDFUNC FUNC BOOL HAS_TAXI_DESTINATION_LIST_CHANGED() BOOL bRegenerateList = FALSE VECTOR vTempBlipCoords BLIP_INDEX blipWaypointCheck // B*1948209 - used to force through a destination list regen, set by the input controls when it detects an blip which doesn't exist // less expensive than cycling through all the blips below IF NOT DOES_BLIP_EXIST(AllTaxiDestinations[iCurrentHighlightedPosition].BlipID) // B*1948209 - if the current selected blip doesn't exist we need to regen the list IF iCurrentHighlightedPosition != iStoredTaxiWaypointBlipDestinationIndex // ignore waypoints since these always get deleted by code as you approach the blip CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " HAS_TAXI_DESTINATION_LIST_CHANGED() - return TRUE : detected current highlighted blip doesn't exist, iCurrentHighlightedPosition : ", iCurrentHighlightedPosition) RETURN TRUE ELSE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : HAS_TAXI_DESTINATION_LIST_CHANGED() : detected current highlighted blip doesn't exist, but it;s the iStoredTaxiWaypointBlipDestinationIndex : ", iStoredTaxiWaypointBlipDestinationIndex) ENDIF ENDIF // staggered checks IF TIMERB() > 250 IF NOT (bRegenerateList) IF iStoredNumberOfBlips <> GET_NUMBER_OF_ACTIVE_BLIPS() CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " HAS_TAXI_DESTINATION_LIST_CHANGED() - Blip count differs from stored count. Is now ", GET_NUMBER_OF_ACTIVE_BLIPS(), " was ", iStoredNumberOfBlips) bRegenerateList = TRUE ENDIF iStoredNumberOfBlips = GET_NUMBER_OF_ACTIVE_BLIPS() IF iStoredNumberOfOccupants <> GET_NUMBER_OF_TAXI_OCCUPANTS() CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " HAS_TAXI_DESTINATION_LIST_CHANGED() - Taxi occupant count differs from stored count. Is now ", GET_NUMBER_OF_TAXI_OCCUPANTS(), " was ", iStoredNumberOfOccupants) bRegenerateList = TRUE ENDIF iStoredNumberOfOccupants = GET_NUMBER_OF_TAXI_OCCUPANTS() ENDIF // B*1310466 - check for waypoint blup being updated. IF NOT (bRegenerateList) IF iStoredTaxiWaypointBlipDestinationIndex != -1 // don't test for the custom waypoint blip if it hasn't been set already IF DOES_BLIP_EXIST(AllTaxiDestinations[iStoredTaxiWaypointBlipDestinationIndex].BlipID) IF GET_SPRITE_FOR_BLIP(AllTaxiDestinations[iStoredTaxiWaypointBlipDestinationIndex].BlipID) = GET_WAYPOINT_BLIP_ENUM_ID() vTempBlipCoords = GET_BLIP_COORDS(AllTaxiDestinations[iStoredTaxiWaypointBlipDestinationIndex].BlipID) IF NOT ARE_VECTORS_ALMOST_EQUAL(vTempBlipCoords, vStoredTaxiWaypointBlipDestinationCoords) bRegenerateList = TRUE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " HAS_TAXI_DESTINATION_LIST_CHANGED - custom waypoint blip position changed! ", " stored = ", vStoredTaxiWaypointBlipDestinationCoords, " new = ", vTempBlipCoords) ENDIF ENDIF ELSE blipWaypointCheck = GET_FIRST_BLIP_INFO_ID(GET_WAYPOINT_BLIP_ENUM_ID()) IF DOES_BLIP_EXIST(blipWaypointCheck) vTempBlipCoords = GET_BLIP_COORDS(blipWaypointCheck) IF NOT ARE_VECTORS_ALMOST_EQUAL(vTempBlipCoords, vStoredTaxiWaypointBlipDestinationCoords) bRegenerateList = TRUE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " HAS_TAXI_DESTINATION_LIST_CHANGED - custom waypoint blip ID and position changed! ", " stored = ", vStoredTaxiWaypointBlipDestinationCoords, " new = ", vTempBlipCoords) ENDIF ELSE // this situation will be handled by above check of number stored blips mismatch CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " HAS_TAXI_DESTINATION_LIST_CHANGED - blipWaypointCheck doesn't exist ") ENDIF ENDIF ENDIF ENDIF SETTIMERB(0) ENDIF RETURN bRegenerateList ENDFUNC /// PURPOSE: /// check to see if skip option should be availabe to player /// RETURNS: /// TRUE if he can skip false if not FUNC BOOL IS_PLAYER_ALLOWED_TO_SKIP_TAXI_JOURNEY() // only allow skip during driving state IF eTaxiJourneyState != TAXI_JOURNEY_STATE_DRIVING_TO_DESTINATION //CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " IS_PLAYER_ALLOWED_TO_SKIP_TAXI_JOURNEY() : return FALSE : eTaxiJourneyState != TAXI_JOURNEY_STATE_DRIVING_TO_DESTINATION") RETURN FALSE ENDIF // don't allow skip whilst selecting a different destination IF bSelectingAnotherDestination //CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " IS_PLAYER_ALLOWED_TO_SKIP_TAXI_JOURNEY() : return FALSE : bSelectingAnotherDestination = TRUE") RETURN FALSE ENDIF // Taxi has to be min 50 m from destination IF fDistanceToDestination < 50 //CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " IS_PLAYER_ALLOWED_TO_SKIP_TAXI_JOURNEY() : return FALSE : fDistanceToDestination < 50") RETURN FALSE ENDIF // don't skip during interior cam as this is used to switch destinations IF DOES_CAM_EXIST(camMeter) IF IS_CAM_ACTIVE(camMeter) //CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " IS_PLAYER_ALLOWED_TO_SKIP_TAXI_JOURNEY() : return FALSE : IS_CAM_ACTIVE(camMeter)") RETURN FALSE ENDIF ENDIF RETURN TRUE ENDFUNC PROC NEXT_DESTINATION() BEGIN_SCALEFORM_MOVIE_METHOD(scaleformTaxiMeter, "SET_INPUT_EVENT") SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(ENUM_TO_INT(SCALEFORM_INPUT_EVENT_UP)) END_SCALEFORM_MOVIE_METHOD() iCurrentHighlightedPosition -- IF iCurrentHighlightedPosition < START_POSITION iCurrentHighlightedPosition = (iTotalNumberOfTaxiDestinations-1) ENDIF IF DOES_BLIP_EXIST(AllTaxiDestinations[iCurrentHighlightedPosition].BlipID) VECTOR vCoords = GET_BLIP_COORDS(AllTaxiDestinations[iCurrentHighlightedPosition].BlipID) IF NOT IS_VECTOR_ZERO(vCoords) LOCK_MINIMAP_POSITION(vCoords.x, vCoords.y) ENDIF CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " NEXT_DESTINATION() : set BlipSprite is ", ENUM_TO_INT(GET_BLIP_SPRITE(AllTaxiDestinations[iCurrentHighlightedPosition].BlipID)), " and iCurrentHighlightedPosition is ", iCurrentHighlightedPosition, " named ", GET_BLIP_NAME(AllTaxiDestinations[iCurrentHighlightedPosition].BlipID), " vCoords = ", vCoords) ELSE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " NEXT_DESTINATION() : blip doesn't exist! iCurrentHighlightedPosition = ", iCurrentHighlightedPosition) ENDIF ENDPROC PROC LAST_DESTINATION() BEGIN_SCALEFORM_MOVIE_METHOD(scaleformTaxiMeter, "SET_INPUT_EVENT") SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(ENUM_TO_INT(SCALEFORM_INPUT_EVENT_DOWN)) END_SCALEFORM_MOVIE_METHOD() iCurrentHighlightedPosition ++ IF iCurrentHighlightedPosition > (iTotalNumberOfTaxiDestinations-1) iCurrentHighlightedPosition = START_POSITION ENDIF IF DOES_BLIP_EXIST(AllTaxiDestinations[iCurrentHighlightedPosition].BlipID) VECTOR vCoords = GET_BLIP_COORDS(AllTaxiDestinations[iCurrentHighlightedPosition].BlipID) IF NOT IS_VECTOR_ZERO(vCoords) LOCK_MINIMAP_POSITION(vCoords.x, vCoords.y) ENDIF CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " LAST_DESTINATION() : set BlipSprite is ", ENUM_TO_INT(GET_BLIP_SPRITE(AllTaxiDestinations[iCurrentHighlightedPosition].BlipID)), " and iCurrentHighlightedPosition is ", iCurrentHighlightedPosition, " named ", GET_BLIP_NAME(AllTaxiDestinations[iCurrentHighlightedPosition].BlipID), " vCoords = ", vCoords) ELSE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " LAST_DESTINATION() : blip doesn't exist! iCurrentHighlightedPosition = ", iCurrentHighlightedPosition) ENDIF ENDPROC /// PURPOSE: /// detects player control inputs PROC PROCESS_PLAYER_CONTROL_INPUTS() // only allow normal exit controls during create taxi meter state IF eTaxiJourneyState != TAXI_JOURNEY_STATE_CREATE_TAXI_METER // only allow destination switching if there are enough destinations IF iTotalNumberOfTaxiDestinations > 1 INT leftX, leftY, rightX, rightY GET_CONTROL_VALUE_OF_ANALOGUE_STICKS(leftX, leftY, rightX, rightY) // Need this on PC to prevent conflict with radio controls IF IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL) SET_INPUT_EXCLUSIVE(FRONTEND_CONTROL, INPUT_CURSOR_SCROLL_UP) SET_INPUT_EXCLUSIVE(FRONTEND_CONTROL, INPUT_CURSOR_SCROLL_DOWN) SET_INPUT_EXCLUSIVE(FRONTEND_CONTROL, INPUT_CELLPHONE_SCROLL_FORWARD) SET_INPUT_EXCLUSIVE(FRONTEND_CONTROL, INPUT_CELLPHONE_SCROLL_BACKWARD) ENDIF IF leftX > STICK_DEAD_ZONE OR IS_DISABLED_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CELLPHONE_SCROLL_FORWARD) IF NOT bStickInUseUp IF bDestinationSelected IF bSelectingAnotherDestination LAST_DESTINATION() ELSE bUpdateTaxiControls = TRUE ENDIF bSelectingAnotherDestination = TRUE ELSE LAST_DESTINATION() ENDIF iTimer_SelectingAnotherDestinationTimeOut = GET_GAME_TIMER() bStickInUseUp = TRUE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " PROCESS_PLAYER_CONTROL_INPUTS : bStickInUseUp true ") ENDIF ELSE bStickInUseUp = FALSE ENDIF IF leftX < -STICK_DEAD_ZONE OR IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CELLPHONE_SCROLL_BACKWARD) IF NOT bStickInUseDown IF bDestinationSelected IF bSelectingAnotherDestination NEXT_DESTINATION() ELSE bUpdateTaxiControls = TRUE ENDIF bSelectingAnotherDestination = TRUE ELSE NEXT_DESTINATION() ENDIF iTimer_SelectingAnotherDestinationTimeOut = GET_GAME_TIMER() bStickInUseDown = TRUE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " PROCESS_PLAYER_CONTROL_INPUTS : bStickInUseDown true ") ENDIF ELSE bStickInUseDown = FALSE ENDIF ENDIF // Initial selection of destination IF NOT bDestinationSelected // only allow destination selection if there is a destination to select IF iTotalNumberOfTaxiDestinations > 0 SET_CINEMATIC_BUTTON_ACTIVE(FALSE) IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CELLPHONE_SELECT) IF DOES_BLIP_EXIST(AllTaxiDestinations[iCurrentHighlightedPosition].BlipID) eTaxiDialogue = TAXI_DIALOGUE_BEGIN_JOURNEY_1 // set dialogue to trigger in PLAY_TAXI_DIALOGUE() currentTaxiDestination = AllTaxiDestinations[iCurrentHighlightedPosition] bTaxiHasHitDestinationLocate = FALSE // reset ready iTimer_WaitForGroupMembers = GET_GAME_TIMER() // set ready for checks iDialogueTimer_BanterDuringJourney = GET_GAME_TIMER() // set ready for checks iDialogueTimer_ChangeRadio = GET_GAME_TIMER() // set iDesinationNodeSearchNumber = 0 // reset ready for grabbing destination node eGenerateSafeDestinationState = TAXI_GSDS_INITIAL_TRIGGER_AREAS_CHECK bDestinationSelected = TRUE bUpdateTaxiControls = TRUE bSelectingAnotherDestination = FALSE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : PROCESS_PLAYER_CONTROL_INPUTS() : initial selection done **** : ", " BlipSprite is ", ENUM_TO_INT(GET_BLIP_SPRITE(AllTaxiDestinations[iCurrentHighlightedPosition].BlipID)), " and iCurrentHighlightedPosition is ", iCurrentHighlightedPosition, " named ", GET_BLIP_NAME(AllTaxiDestinations[iCurrentHighlightedPosition].BlipID)) ELSE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : PROCESS_PLAYER_CONTROL_INPUTS() : blocked initial selection as destination blip doesn't exist! expect list to be regenerated.") ENDIF ENDIF ENDIF ELSE SET_CINEMATIC_BUTTON_ACTIVE(FALSE) // blocked for controls clash IF eTaxiJourneyState = TAXI_JOURNEY_STATE_DRIVING_TO_DESTINATION // Stop / Pullover IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CELLPHONE_CANCEL) eTaxiDialogue = TAXI_DIALOGUE_OUT_EARLY // set dialogue to trigger in PLAY_TAXI_DIALOGUE() bUpdateTaxiControls = TRUE IF NOT IS_PED_INJURED(g_WaitingTaxiDriver) CLEAR_PED_TASKS(g_WaitingTaxiDriver) ENDIF eTaxiJourneyState = TAXI_JOURNEY_STATE_ORDERED_TO_PULLOVER CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : PROCESS_PLAYER_CONTROL_INPUTS() : taxi ordered to pullover ***") ENDIF // Choosing to hurry to destination. IF NOT bHurrying IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CELLPHONE_EXTRA_OPTION) eTaxiDialogue = TAXI_DIALOGUE_STEP_ON_IT_1 // set dialogue to trigger in PLAY_TAXI_DIALOGUE() bHurrying = TRUE bUpdateTaxiControls = TRUE fFareRate = FARE_RATE * 2.0 // B*1552474 - don't clear anim tasks IF NOT IS_PED_INJURED(g_WaitingTaxiDriver) IF NOT IS_ENTITY_PLAYING_ANIM(g_WaitingTaxiDriver, tlAnimDictTaxiDriver, "leanover_enter") IF NOT IS_ENTITY_PLAYING_ANIM(g_WaitingTaxiDriver, tlAnimDictTaxiDriver, "leanover_idle") IF NOT IS_ENTITY_PLAYING_ANIM(g_WaitingTaxiDriver, tlAnimDictTaxiDriver, "leanover_exit") CLEAR_PED_TASKS(g_WaitingTaxiDriver) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : PROCESS_PLAYER_CONTROL_INPUTS() : bHurrying - taxi driver tasks cleared for new go to task") ELSE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : PROCESS_PLAYER_CONTROL_INPUTS() : bHurrying - taxi driver tasks not cleared - playing anim leanover_exit") ENDIF ELSE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : PROCESS_PLAYER_CONTROL_INPUTS() : bHurrying - taxi driver tasks not cleared - playing anim leanover_idle") ENDIF ELSE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : PROCESS_PLAYER_CONTROL_INPUTS() : bHurrying - taxi driver tasks not cleared - playing anim leanover_enter") ENDIF ENDIF CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : PROCESS_PLAYER_CONTROL_INPUTS() : bHurrying true ***") ENDIF ENDIF // don't skip during pick destination cam IF IS_PLAYER_ALLOWED_TO_SKIP_TAXI_JOURNEY() IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CELLPHONE_SELECT) IF bDropPointSelected bUpdateTaxiControls = TRUE iSkipJourneyTimer = GET_GAME_TIMER() eSkipJourneyState = SKIP_JOURNEY_STATE_FADE_OUT eTaxiJourneyState = TAXI_JOURNEY_STATE_SKIP_JOURNEY CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : PROCESS_PLAYER_CONTROL_INPUTS() : eTaxiJourneyState = TAXI_JOURNEY_STATE_SKIP_JOURNEY") ELSE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : PROCESS_PLAYER_CONTROL_INPUTS() : bSkipToDestination blocked as bDropPointSelected is still FALSE ! ") ENDIF ENDIF ENDIF // additional dialogue IF eTaxiDialogue = TAXI_DIALOGUE_NOTHING // set dialogue to trigger in PLAY_TAXI_DIALOGUE() IF iDialogueTimer_BanterDuringJourney != -1 IF HAS_TIME_PASSED(iDialogueTimer_BanterDuringJourney, 68000) //120000) eTaxiDialogue = TAXI_DIALOGUE_BANTER iDialogueTimer_BanterDuringJourney = -1 ENDIF ENDIF ENDIF IF eTaxiDialogue = TAXI_DIALOGUE_NOTHING // set dialogue to trigger in PLAY_TAXI_DIALOGUE() IF iDialogueTimer_ChangeRadio != -1 IF HAS_TIME_PASSED(iDialogueTimer_ChangeRadio, 5000) IF IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_VEH_NEXT_RADIO) OR IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_VEH_PREV_RADIO) OR IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_VEH_RADIO_WHEEL) eTaxiDialogue = TAXI_DIALOGUE_RADIO_1 iDialogueTimer_BanterDuringJourney = -1 ENDIF ENDIF ENDIF ENDIF ELIF eTaxiJourneyState = TAXI_JOURNEY_STATE_ORDERED_TO_PULLOVER // Start - get going to destination again IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CELLPHONE_CANCEL) eTaxiDialogue = TAXI_DIALOGUE_BEGIN_JOURNEY_2 // set dialogue to trigger in PLAY_TAXI_DIALOGUE() bUpdateTaxiControls = TRUE eTaxiJourneyState = TAXI_JOURNEY_STATE_DRIVING_TO_DESTINATION CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : PROCESS_PLAYER_CONTROL_INPUTS() : taxi ordered to start moving again") ENDIF ENDIF // Selecting a new destination while a journey is in progress IF bSelectingAnotherDestination IF IS_PLAYER_TRYING_TO_CHANGE_TAXI_DESTINATION() // only allow during pick destination cam IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CELLPHONE_SELECT) IF DOES_BLIP_EXIST(AllTaxiDestinations[iCurrentHighlightedPosition].BlipID) eTaxiDialogue = TAXI_DIALOGUE_CHANGE_DEST_1 // set dialogue to trigger in PLAY_TAXI_DIALOGUE() bDropPointSelected = FALSE IF eTaxiJourneyState = TAXI_JOURNEY_STATE_ORDERED_TO_PULLOVER // make sure we start moving again eTaxiJourneyState = TAXI_JOURNEY_STATE_DRIVING_TO_DESTINATION CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : PROCESS_PLAYER_CONTROL_INPUTS() : taxi set moving again from pullover (due to new destination seletection.") ENDIF bUpdateTaxiControls = TRUE currentTaxiDestination = AllTaxiDestinations[iCurrentHighlightedPosition] bTaxiHasHitDestinationLocate = FALSE // reset ready iTimer_WaitForGroupMembers = GET_GAME_TIMER() // set ready for checks iDesinationNodeSearchNumber = 0 // reset ready for grabbing destination node eGenerateSafeDestinationState = TAXI_GSDS_INITIAL_TRIGGER_AREAS_CHECK // B*1552474 - don't clear anim tasks IF NOT IS_PED_INJURED(g_WaitingTaxiDriver) IF NOT IS_ENTITY_PLAYING_ANIM(g_WaitingTaxiDriver, tlAnimDictTaxiDriver, "leanover_enter") IF NOT IS_ENTITY_PLAYING_ANIM(g_WaitingTaxiDriver, tlAnimDictTaxiDriver, "leanover_idle") IF NOT IS_ENTITY_PLAYING_ANIM(g_WaitingTaxiDriver, tlAnimDictTaxiDriver, "leanover_exit") CLEAR_PED_TASKS(g_WaitingTaxiDriver) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : PROCESS_PLAYER_CONTROL_INPUTS() : bSelectingAnotherDestination - taxi driver tasks cleared for new go to task") ELSE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : PROCESS_PLAYER_CONTROL_INPUTS() : bSelectingAnotherDestination -taxi driver tasks not cleared - playing anim leanover_exit") ENDIF ELSE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : PROCESS_PLAYER_CONTROL_INPUTS() : bSelectingAnotherDestination - axi driver tasks not cleared - playing anim leanover_idle") ENDIF ELSE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : PROCESS_PLAYER_CONTROL_INPUTS() : bSelectingAnotherDestination - taxi driver tasks not cleared - playing anim leanover_enter") ENDIF ENDIF iTimer_SelectingAnotherDestinationTimeOut = GET_GAME_TIMER() bSelectingAnotherDestination = FALSE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : PROCESS_PLAYER_CONTROL_INPUTS() : mid journey destination changed : ", " BlipSprite is ", ENUM_TO_INT(GET_BLIP_SPRITE(AllTaxiDestinations[iCurrentHighlightedPosition].BlipID)), " and iCurrentHighlightedPosition is ", iCurrentHighlightedPosition, " named ", GET_BLIP_NAME(AllTaxiDestinations[iCurrentHighlightedPosition].BlipID)) ELSE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : PROCESS_PLAYER_CONTROL_INPUTS() : blocked changing selection as destination blip doesn't exist! expect list to be regenerated.") ENDIF ENDIF IF HAS_TIME_PASSED(iTimer_SelectingAnotherDestinationTimeOut, TAXI_SERVICE_CHANGE_DEST_CAM_TIMEOUT) bSelectingAnotherDestination = FALSE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : PROCESS_PLAYER_CONTROL_INPUTS() : timedout change destination attempt") ENDIF ENDIF ENDIF ENDIF ENDIF ENDPROC /// PURPOSE: /// displays the taxi meter scaleform on the taxi meter PROC RENDER_TAXI_METER() // waut for the taxi meter to be displayed before allowing it to display IF eTaxiJourneyState != TAXI_JOURNEY_STATE_CREATE_TAXI_METER SET_TEXT_RENDER_ID(iRenderTarget) SET_SCRIPT_GFX_DRAW_ORDER(GFX_ORDER_AFTER_HUD) // B* 1543102 SET_SCRIPT_GFX_DRAW_BEHIND_PAUSEMENU(TRUE) IF IS_VEHICLE_DRIVEABLE(g_WaitingTaxi) DRAW_SCALEFORM_MOVIE(scaleformTaxiMeter, fTaxiMenu_ScaleCentreX, fTaxiMenu_ScaleCentreY, fTaxiMenu_ScaleSizeX, fTaxiMenu_ScaleSizeY, 0,0,0,255) //CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : RENDER_TAXI_METER() : DRAW_SCALEFORM_MOVIE this frame") #IF IS_DEBUG_BUILD ELSE IF bDebugLaunchMeterOnly DRAW_SCALEFORM_MOVIE(scaleformTaxiMeter, fTaxiMenu_ScaleCentreX, fTaxiMenu_ScaleCentreY, fTaxiMenu_ScaleSizeX, fTaxiMenu_ScaleSizeY, 0,0,0,255) ELSE SET_SCALEFORM_MOVIE_AS_NO_LONGER_NEEDED(scaleformTaxiMeter) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : RENDER_TAXI_METER() : IF IS_VEHICLE_DRIVEABLE(g_WaitingTaxi) SET_SCALEFORM_MOVIE_AS_NO_LONGER_NEEDED(scaleformTaxiMeter) ") ENDIF #ENDIF ENDIF ENDIF ENDPROC /// PURPOSE: /// handle displaying the taxi controls PROC UPDATE_TAXI_INSTRUCTIONAL_BUTTONS() IF NOT SHOULD_TAXI_CONTROLS_BE_BLOCKED_THIS_FRAME() IF HAS_SCALEFORM_MOVIE_LOADED(scaleformTaxiControls) // only allow exit during create taxi meter state IF eTaxiJourneyState != TAXI_JOURNEY_STATE_CREATE_TAXI_METER // Check if southpaw controls need an update STRING tempCurrentButton = GET_CONTROL_INSTRUCTIONAL_BUTTONS_STRING(FRONTEND_CONTROL, INPUT_SCRIPT_LEFT_AXIS_X) IF NOT ARE_STRINGS_EQUAL(instructButtonStored_changeDest, tempCurrentButton) instructButtonStored_changeDest = tempCurrentButton bUpdateTaxiControls = TRUE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : UPDATE_TAXI_INSTRUCTIONAL_BUTTONS() : update for Southpaw this frame") ENDIF // STRING tempCurrentButton = GET_CONTROL_GROUP_INSTRUCTIONAL_BUTTONS_STRING(FRONTEND_CONTROL, INPUTGROUP_SCRIPT_LSTICK_ALL) // IF NOT ARE_STRINGS_EQUAL(instructButtonStored_changeDest, tempCurrentButton) // instructButtonStored_changeDest = tempCurrentButton // bUpdateTaxiControls = TRUE // CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : UPDATE_TAXI_INSTRUCTIONAL_BUTTONS() : update for Southpaw this frame") // ENDIF IF bUpdateTaxiControls aSpriteTaxiControls = GET_SCALEFORM_INSTRUCTIONAL_BUTTON_POSITION() REFRESH_SCALEFORM_INSTRUCTIONAL_BUTTONS(instructionalButtons) ADD_SCALEFORM_INSTRUCTIONAL_INPUT(PLAYER_CONTROL, INPUT_VEH_EXIT, "TXM_EXIT", instructionalButtons) // Exit // only allow destination switching if there is more than 1 destination to select IF iTotalNumberOfTaxiDestinations > 1 ADD_SCALEFORM_INSTRUCTIONAL_INPUT(FRONTEND_CONTROL, INPUT_SCRIPT_LEFT_AXIS_X, "TXM_CDES", instructionalButtons) // Change Destination ENDIF IF NOT bDestinationSelected // only allow destination selection if there is a destination to select IF iTotalNumberOfTaxiDestinations > 0 ADD_SCALEFORM_INSTRUCTIONAL_INPUT(FRONTEND_CONTROL, INPUT_CELLPHONE_SELECT, "TXM_SLCT", instructionalButtons) // Choose Destination ENDIF ELSE IF eTaxiJourneyState = TAXI_JOURNEY_STATE_DRIVING_TO_DESTINATION ADD_SCALEFORM_INSTRUCTIONAL_INPUT(FRONTEND_CONTROL, INPUT_CELLPHONE_CANCEL, "TXM_STOP", instructionalButtons) // Stop IF bSelectingAnotherDestination ADD_SCALEFORM_INSTRUCTIONAL_INPUT(FRONTEND_CONTROL, INPUT_CELLPHONE_SELECT, "TXM_SLCT", instructionalButtons) // Choose Destination ENDIF IF IS_PLAYER_ALLOWED_TO_SKIP_TAXI_JOURNEY() ADD_SCALEFORM_INSTRUCTIONAL_INPUT(FRONTEND_CONTROL, INPUT_CELLPHONE_SELECT, "TXM_SKIP", instructionalButtons) // Skip (Extra Cost) ENDIF IF NOT bHurrying ADD_SCALEFORM_INSTRUCTIONAL_INPUT(FRONTEND_CONTROL, INPUT_CELLPHONE_EXTRA_OPTION, "TXM_HURY", instructionalButtons) // Hurry ENDIF ELIF eTaxiJourneyState = TAXI_JOURNEY_STATE_ORDERED_TO_PULLOVER ADD_SCALEFORM_INSTRUCTIONAL_INPUT(FRONTEND_CONTROL, INPUT_CELLPHONE_CANCEL, "TXM_STRT", instructionalButtons) // Start IF bSelectingAnotherDestination ADD_SCALEFORM_INSTRUCTIONAL_INPUT(FRONTEND_CONTROL, INPUT_CELLPHONE_SELECT, "TXM_SLCT", instructionalButtons) // Choose Destination ENDIF ENDIF ENDIF bUpdateTaxiControls = FALSE ENDIF SET_TEXT_RENDER_ID(GET_DEFAULT_SCRIPT_RENDERTARGET_RENDER_ID()) SET_SCRIPT_GFX_DRAW_BEHIND_PAUSEMENU(FALSE) SET_INSTRUCTIONAL_BUTTONS_UNDER_HUD_THIS_FRAME() SET_LOADING_ICON_SUBTITLES_OFFSET_SHIFT_THIS_FRAME() RUN_SCALEFORM_INSTRUCTIONAL_BUTTONS(scaleformTaxiControls, aSpriteTaxiControls, instructionalButtons, SHOULD_REFRESH_SCALEFORM_INSTRUCTIONAL_BUTTONS(instructionalButtons)) ENDIF ELSE scaleformTaxiControls = REQUEST_SCALEFORM_MOVIE("instructional_buttons") ENDIF ELSE SET_SCALEFORM_MOVIE_AS_NO_LONGER_NEEDED(scaleformTaxiControls) bUpdateTaxiControls = TRUE ENDIF ENDPROC #IF IS_DEBUG_BUILD PROC SETUP_DEBUG() START_WIDGET_GROUP("taxiService") ADD_WIDGET_BOOL("Add debug blips for destination", bAddBlipForDestination) ADD_WIDGET_BOOL("Cleanup This Script", bCleanupScript) ADD_WIDGET_BOOL("Is player in a taxi", g_bPlayerIsInTaxi) ADD_WIDGET_BOOL("Launch Meter Debug", bDebug_LaunchMeter) ADD_WIDGET_FLOAT_SLIDER("fTaxiMenu_ScaleCentreX", fTaxiMenu_ScaleCentreX, 0, 1, 0.001) ADD_WIDGET_FLOAT_SLIDER("fTaxiMenu_ScaleCentreY", fTaxiMenu_ScaleCentreY, 0, 1, 0.001) ADD_WIDGET_FLOAT_SLIDER("fTaxiMenu_ScaleSizeX", fTaxiMenu_ScaleSizeX, 0, 3, 0.001) ADD_WIDGET_FLOAT_SLIDER("fTaxiMenu_ScaleSizeY", fTaxiMenu_ScaleSizeY, 0, 3, 0.001) ADD_WIDGET_FLOAT_SLIDER("vMeterOffset.x", vMeterOffset.x, -3, 3, 0.001) ADD_WIDGET_FLOAT_SLIDER("vMeterOffset.y", vMeterOffset.y, 0, 3, 0.001) ADD_WIDGET_FLOAT_SLIDER("vMeterOffset.z", vMeterOffset.z, 0, 3, 0.001) ADD_WIDGET_FLOAT_SLIDER("vMeterRotation.x", vMeterRotation.x, -180, 180, 1) ADD_WIDGET_FLOAT_SLIDER("vMeterRotation.y", vMeterRotation.y, -180, 180, 1) ADD_WIDGET_FLOAT_SLIDER("vMeterRotation.z", vMeterRotation.z, -180, 180, 1) ADD_WIDGET_FLOAT_SLIDER("vTaxiCamOffset.x", vTaxiCamOffset.x, -3, 3, 0.001) ADD_WIDGET_FLOAT_SLIDER("vTaxiCamOffset.y", vTaxiCamOffset.y, -3, 3, 0.001) ADD_WIDGET_FLOAT_SLIDER("vTaxiCamOffset.z", vTaxiCamOffset.z, -3, 3, 0.001) ADD_WIDGET_FLOAT_SLIDER("vTaxiCamFixedRotation.x", vTaxiCamFixedRotation.x, -180, 180, 1) ADD_WIDGET_FLOAT_SLIDER("vTaxiCamFixedRotation.y", vTaxiCamFixedRotation.y, -180, 180, 1) ADD_WIDGET_FLOAT_SLIDER("vTaxiCamFixedRotation.z", vTaxiCamFixedRotation.z, -180, 180, 1) ADD_WIDGET_BOOL("Update taxi cam offset and rot :", bDebug_UpdateTaxiCamOffsetAndRot) ADD_WIDGET_FLOAT_SLIDER("camMeterFOV", camMeterFOV, 20, 70, 1) ADD_WIDGET_BOOL("Output to debug file", bDebug_OutputInfo) ADD_WIDGET_BOOL("display ALl taxi position info", bDebugDrawAllTaxiPickupPositionInfo) ADD_WIDGET_BOOL("display taxi pull over results", bDebug_DrawGetPullOverResults) ADD_WIDGET_BOOL("display taxi to player pull in spot", bDebug_DisplayTaxiToPlayerPullInSpot) ADD_WIDGET_BOOL("display taxi to destination pull in spot", bDebug_DisplayTaxiDropOffPosition) ADD_WIDGET_BOOL("display path load node area", bDebugDisplayPathNodeLoadArea) ADD_WIDGET_BOOL("display identify active taxi", bDebugDrawSphereAroundActiveTaxi) ADD_WIDGET_BOOL("Set break on node commands usage", bDebugSetBreakOnNodeCommandsUsage) ADD_WIDGET_BOOL("Debug load all path nodes : for debug only! ", bDebugLoadAllPathNodes) ADD_WIDGET_BOOL("Debug UNload all path nodes : for debug only! ", bDebugUnLoadAllPathNodes) ADD_WIDGET_BOOL("Debug perform GET_TAXI_PULL_OVER_INFO / test uses : ", bDebugPerformGetTaxiPullInSpotTest) ADD_WIDGET_VECTOR_SLIDER("vDebug_DriveToNodePos :", vDebug_DriveToNodePos, -10000.0, 10000.0, 0.0001) ADD_WIDGET_BOOL("Debug perform ARE_COORDS_IN_SPECIAL_AREA test uses vDebug_TempPickupPos : ", bDebug_TestIsPositionInSpecialArea) ADD_WIDGET_VECTOR_SLIDER("vDebug_TempPickupPos :", vDebug_TempPickupPos, -10000.0, 10000.0, 0.0001) ADD_WIDGET_VECTOR_SLIDER("vDebug_TempDropOffPos :", vDebug_TempDropOffPos, -10000.0, 10000.0, 0.0001) ADD_WIDGET_BOOL("Uncheck to Relaunch Meter", bDebugLaunchMeterOnly) ADD_WIDGET_BOOL("Reset meter offset", bResetMeterOffset) STOP_WIDGET_GROUP() ENDPROC #ENDIF #IF IS_DEBUG_BUILD PROC RUN_DEBUG() VECTOR vTempReturnCoords FLOAT fTempReturnHeading IF bDebug_UpdateTaxiCamOffsetAndRot IF IS_VEHICLE_DRIVEABLE(g_WaitingTaxi) IF DOES_CAM_EXIST(camMeter) DESTROY_CAM(camMeter) ENDIF IF NOT DOES_CAM_EXIST(camMeter) camMeter = CREATE_CAM_WITH_PARAMS("DEFAULT_SCRIPTED_CAMERA", GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(g_WaitingTaxi, vTaxiCamOffset), << 0.0, 0.0, 0.0>>, camMeterFOV, TRUE) ATTACH_CAM_TO_ENTITY(camMeter, g_WaitingTaxi, vTaxiCamOffset) UPDATE_TAXI_CAM_POSITIONING() SET_CAM_NEAR_CLIP(camMeter, 0.01) RENDER_SCRIPT_CAMS(TRUE, FALSE) bDebug_UpdateTaxiCamOffsetAndRot = FALSE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " RUN_DEBUG() -> ** updated taxi cam offset and rot FC = ", GET_FRAME_COUNT()) ENDIF ENDIF ENDIF IF bDebug_OutputInfo OPEN_DEBUG_FILE() SAVE_NEWLINE_TO_DEBUG_FILE() SAVE_STRING_TO_DEBUG_FILE("BOOL vMeterRotation = ") SAVE_VECTOR_TO_DEBUG_FILE(vMeterRotation) SAVE_NEWLINE_TO_DEBUG_FILE() SAVE_STRING_TO_DEBUG_FILE("BOOL vMeterOffset = ") SAVE_VECTOR_TO_DEBUG_FILE(vMeterOffset) SAVE_NEWLINE_TO_DEBUG_FILE() SAVE_STRING_TO_DEBUG_FILE("FLOAT fTaxiMenu_ScaleSizeX = ") SAVE_FLOAT_TO_DEBUG_FILE(fTaxiMenu_ScaleSizeX) SAVE_NEWLINE_TO_DEBUG_FILE() SAVE_STRING_TO_DEBUG_FILE("FLOAT fTaxiMenu_ScaleSizeY = ") SAVE_FLOAT_TO_DEBUG_FILE(fTaxiMenu_ScaleSizeY) SAVE_NEWLINE_TO_DEBUG_FILE() CLOSE_DEBUG_FILE() bDebug_OutputInfo = FALSE ENDIF IF bAddBlipForDestination IF NOT DOES_BLIP_EXIST(blipDebug) blipDebug = ADD_BLIP_FOR_COORD(g_vTaxiDropOffPosition) SET_BLIP_SCALE(blipDebug, 0.5) ENDIF IF NOT DOES_BLIP_EXIST(blipDebugOriginal) blipDebugOriginal = ADD_BLIP_FOR_COORD(vOriginal) SET_BLIP_SCALE(blipDebugOriginal, 0.5) SET_BLIP_COLOUR(blipDebugOriginal, BLIP_COLOUR_GREEN) ENDIF ELSE IF DOES_BLIP_EXIST(blipDebug) REMOVE_BLIP(blipDebug) ENDIF IF DOES_BLIP_EXIST(blipDebugOriginal) REMOVE_BLIP(blipDebugOriginal) ENDIF ENDIF IF bDebugDrawAllTaxiPickupPositionInfo SET_DEBUG_ACTIVE(TRUE) SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE) bDebug_DisplayTaxiToPlayerPullInSpot = TRUE //bDebug_DisplayTaxiDropOffPosition = TRUE bDebugDrawSphereAroundActiveTaxi = TRUE ENDIF IF bDebug_DisplayTaxiDropOffPosition SET_DEBUG_ACTIVE(TRUE) SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE) DRAW_DEBUG_SPHERE(g_vTaxiDropOffPosition, 2.0, 250, 140, 0, 125) ENDIF IF bResetMeterOffset IF IS_VEHICLE_DRIVEABLE(g_WaitingTaxi) IF DOES_ENTITY_EXIST(objMeter) DETACH_ENTITY(objMeter) ATTACH_ENTITY_TO_ENTITY(objMeter, g_WaitingTaxi, GET_ENTITY_BONE_INDEX_BY_NAME(g_WaitingTaxi, "Chassis"), vMeterOffset, vMeterRotation) ENDIF ENDIF bResetMeterOffset = FALSE ENDIF IF eTaxiServiceStage = TAXI_SERVICE_STATE_PLAYER_IN_TAXI IF NOT DOES_ENTITY_EXIST(objMeter) //CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " objMeter no longer exists, who removed it?") ENDIF ENDIF IF bDebugDrawSphereAroundActiveTaxi SET_DEBUG_ACTIVE(TRUE) SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE) IF IS_VEHICLE_DRIVEABLE(g_WaitingTaxi) VECTOR vTempDrawPos = GET_ENTITY_COORDS(g_WaitingTaxi) vTempDrawPos.Z += 14.0 DRAW_DEBUG_SPHERE(vTempDrawPos, 10.0, 0, 250, 0, 120) ENDIF ENDIF IF bDebugDisplayPathNodeLoadArea VECTOR vTempLoadAreaMin = vPathNodeRequestMin vTempLoadAreaMin.z -= 100.0 VECTOR vTempLoadAreaMax = vPathNodeRequestMax vTempLoadAreaMax.z += 150.0 DRAW_DEBUG_BOX(vTempLoadAreaMin, vTempLoadAreaMax, 0, 255, 0, 120) ENDIF IF bDebug_TestIsPositionInSpecialArea IF ARE_COORDS_IN_SPECIAL_AREA(vDebug_TempPickupPos, vTempReturnCoords, fTempReturnHeading) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " bDebug_TestIsPositionInSpecialArea - return TRUE for vDebug_TempPickupPos : ", vDebug_TempPickupPos, " vTempReturnCoords = ", vTempReturnCoords, " fTempReturnHeading = ", fTempReturnHeading) ELSE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " bDebug_TestIsPositionInSpecialArea - return FALSE for vDebug_TempPickupPos : ", vDebug_TempPickupPos) ENDIF SET_DEBUG_ACTIVE(TRUE) SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE) DRAW_DEBUG_SPHERE(vDebug_TempPickupPos, 2.5, 250, 150, 0, 200) DRAW_DEBUG_SPHERE(vTempReturnCoords, 5.0, 0, 150, 150, 200) ENDIF IF bDebugSetBreakOnNodeCommandsUsage BREAK_ON_NATIVE_COMMAND("LOAD_ALL_PATH_NODES", FALSE) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " DEBUG : BREAK_ON_NATIVE_COMMAND set for LOAD_ALL_PATH_NODES") bDebugSetBreakOnNodeCommandsUsage = FALSE ENDIF IF bDebugLoadAllPathNodes LOAD_ALL_PATH_NODES(TRUE) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " DEBUG : bDebugLoadAllPathNodes - LOAD_ALL_PATH_NODES(TRUE)") bDebugLoadAllPathNodes = FALSE ENDIF IF bDebugUnLoadAllPathNodes LOAD_ALL_PATH_NODES(FALSE) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " DEBUG : bDebugUnLoadAllPathNodes - LOAD_ALL_PATH_NODES(FALSE)") bDebugUnLoadAllPathNodes = FALSE ENDIF IF bDebug_LaunchMeter scaleformTaxiMeter = REQUEST_SCALEFORM_MOVIE("taxi_display") eTaxiServiceStage = TAXI_SERVICE_METER_ONLY bDebug_LaunchMeter = FALSE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : DEBUG_LAUNCH_TAXI_METER()") ENDIF IF bCleanupScript TAXI_SERVICE_SCRIPT_CLEANUP() ENDIF ENDPROC PROC DEBUG_RUN_METER_ONLY() #IF IS_DEBUG_BUILD IF bDebugLaunchMeterOnly PROCESS_PLAYER_CONTROL_INPUTS() SET_DEBUG_ACTIVE(TRUE) SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE) ELSE fTaxiMenu_ScaleSizeX = (3*0.3) fTaxiMenu_ScaleSizeY = (1.8*0.3) SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_LEAVE_CAMERA_CONTROL_ON) bDebugLaunchMeterOnly = TRUE WHILE NOT HAS_SCALEFORM_MOVIE_LOADED(scaleformTaxiMeter) IF NOT IS_TAXI_SERVICE_SAFE_TO_RUN() TAXI_SERVICE_SCRIPT_CLEANUP() ENDIF WAIT(0) ENDWHILE POPULATE_TAXI_METER() ENDIF #ENDIF ENDPROC #ENDIF /// PURPOSE: /// sets the taxi service data based off the launch method /// RETURNS: /// TRUE if script was setup successfully FUNC BOOL CAN_SETUP_TAXI_SERVICE() IF NOT IS_PED_INJURED(PLAYER_PED_ID()) VEHICLE_INDEX vehTaxi = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()) iStoredNumberOfBlips = GET_NUMBER_OF_ACTIVE_BLIPS() // commented out for B*1518083 - now allow player to get in but just exit option if no taxi destinations available - this allows them to plot custom waypoint whilst sat in the back // can't give taxi ride if there are no destinatios to choose from //IF iStoredNumberOfBlips != 0 // safe check player vehicle and it's driver IF IS_PLAYER_OK_TO_ENTER_VEHICLE_AS_PASSENGER(vehTaxi, GET_TAXI_MODEL(), GET_TAXI_DRIVER_MODEL()) PED_INDEX pedTaxiDriver = GET_PED_IN_VEHICLE_SEAT(vehTaxi, VS_DRIVER) #IF IS_DEBUG_BUILD SETUP_DEBUG() #ENDIF //#IF IS_DEBUG_BUILD bDebug_DrawGetPullOverResults = TRUE #ENDIF // bDebug_DrawGetPullOverResults // bDebugDrawAllTaxiPickupPositionInfo CLEAR_CUSTOM_DROP_OFF() // taken from old setup SET_PLAYER_CAN_DO_DRIVE_BY(PLAYER_ID(), FALSE) HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_WEAPON_ICON) STOP_PED_SPEAKING(PLAYER_PED_ID(), TRUE) // store seat player is using to aid tasking group members into the taxi (player only even enters rear seats) IF GET_PED_IN_VEHICLE_SEAT(vehTaxi, VS_BACK_LEFT) = PLAYER_PED_ID() eStoredPlayerSeat = VS_BACK_LEFT ELSE eStoredPlayerSeat = VS_BACK_RIGHT ENDIF // ensure the taxiService.sc script now takes full ownership of g_WaitingTaxi & g_WaitingTaxiDriver IF STORE_CAR_AS_TAXI_WAITING_FOR_PLAYER(vehTaxi, pedTaxiDriver, TRUE) vOriginal = GET_ENTITY_COORDS(g_WaitingTaxi) - GET_ENTITY_COORDS(PLAYER_PED_ID()) vOriginal.z = 0.0 fDropOffDistFromBlip = VMAG(vOriginal) charWhenTaxiLaunched = GET_PLAYER_PED_ENUM(PLAYER_PED_ID()) NON_GROUPED_PASSENGERS_SHOULD_FLEE() iStoredNumberOfOccupants = GET_NUMBER_OF_TAXI_OCCUPANTS() bUpdateTaxiControls = TRUE // B*1456818 - one frame disable to release player enter /exit vehicle request to // ensure he doesn't just get straight back out upon entering with button held down DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_EXIT) g_bPlayerIsInTaxi = TRUE eTaxiJourneyState = TAXI_JOURNEY_STATE_CREATE_TAXI_METER eTaxiServiceStage = TAXI_SERVICE_STATE_PLAYER_IN_TAXI CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : CAN_SETUP_TAXI_SERVICE() return TRUE") RETURN TRUE ELSE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : CAN_SETUP_TAXI_SERVICE() return FALSE - STORE_CAR_AS_TAXI_WAITING_FOR_PLAYER check") ENDIF ELSE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : CAN_SETUP_TAXI_SERVICE() return FALSE - IS_PLAYER_OK_TO_ENTER_VEHICLE_AS_PASSENGER check") ENDIF //ELSE // CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : CAN_SETUP_TAXI_SERVICE() return FALSE - iStoredNumberOfBlips = 0") //ENDIF ELSE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : CAN_SETUP_TAXI_SERVICE() return FALSE - IS_PED_INJURED(PLAYER_PED_ID()") ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// state during journey where player has asked for taxi to pull over early PROC JOURNEY_STATE_ORDERED_TO_PULLOVER() IF NOT IS_PED_INJURED(g_WaitingTaxiDriver) AND IS_VEHICLE_DRIVEABLE(g_WaitingTaxi) IF IS_PED_SITTING_IN_VEHICLE(g_WaitingTaxiDriver, g_WaitingTaxi) IF IS_VEHICLE_STOPPED(g_WaitingTaxi) IF NOT IS_ENTITY_PLAYING_ANIM(g_WaitingTaxiDriver, tlAnimDictTaxiDriver, "leanover_enter") AND NOT IS_ENTITY_PLAYING_ANIM(g_WaitingTaxiDriver, tlAnimDictTaxiDriver, "leanover_idle") IF NOT TAXI_IS_PED_PERFORMING_TASK(g_WaitingTaxiDriver, SCRIPT_TASK_VEHICLE_TEMP_ACTION) TASK_VEHICLE_TEMP_ACTION(g_WaitingTaxiDriver, g_WaitingTaxi, TEMPACT_WAIT, 1000000) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : JOURNEY_STATE_ORDERED_TO_PULLOVER set stop in place task") ELSE SET_DRIVER_PLAY_TURN_AROUND_ANIM() ENDIF ENDIF SET_PLAYER_GROUP_MEMBERS_INTO_TAXI(g_WaitingTaxi, eStoredPlayerSeat) ELSE IF NOT TAXI_IS_PED_PERFORMING_TASK(g_WaitingTaxiDriver, SCRIPT_TASK_VEHICLE_PARK) VECTOR vTemp = GET_ENTITY_COORDS(g_WaitingTaxi) FLOAT fTemp = GET_ENTITY_HEADING(g_WaitingTaxi) TASK_VEHICLE_PARK(g_WaitingTaxiDriver, g_WaitingTaxi, vTemp, fTemp, PARK_TYPE_PULL_OVER, 60) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : JOURNEY_STATE_ORDERED_TO_PULLOVER set pull over task") ENDIF ENDIF ENDIF ENDIF ENDPROC /// PURPOSE: /// Handles the player being in the taxi state PROC PLAYER_IN_TAXI_STATE() IF IS_PLAYER_PASSENGER_IN_VALID_TAXI_CAB() BLOCK_SPECIFIC_PLAYER_CONTROLS_FOR_TAXI_JOURNEY_THIS_FRAME() SUPPRESS_AMBIENT_REACTIONS_FOR_TAXI_JOURNEY_THIS_FRAME() CLEAR_CUSTOM_DROP_OFF() IF NOT SHOULD_TAXI_CONTROLS_BE_BLOCKED_THIS_FRAME() PROCESS_PLAYER_CONTROL_INPUTS() ENDIF RENDER_TAXI_METER() IF eTaxiJourneyState != TAXI_JOURNEY_STATE_SKIP_JOURNEY PLAY_TAXI_DIALOGUE(g_WaitingTaxiDriver, eTaxiDialogue) IF eTaxiJourneyState != TAXI_JOURNEY_STATE_CREATE_TAXI_METER // check the destinations are up to prior to allowing input to select a destination IF HAS_TAXI_DESTINATION_LIST_CHANGED() IF HAS_SCALEFORM_MOVIE_LOADED(scaleformTaxiMeter) POPULATE_TAXI_METER() bUpdateTaxiControls = TRUE // update after taxi list gets repopulated incase no blips left / blips added ENDIF ENDIF RUN_TAXI_INTERIOR_CAM() ENDIF ENDIF SWITCH eTaxiJourneyState // Create the taxi meter object and set up the scaleforms CASE TAXI_JOURNEY_STATE_CREATE_TAXI_METER IF NOT IS_PED_INJURED(g_WaitingTaxiDriver) AND IS_VEHICLE_DRIVEABLE(g_WaitingTaxi) IF IS_PED_SITTING_IN_VEHICLE(g_WaitingTaxiDriver, g_WaitingTaxi) IF NOT IS_ENTITY_PLAYING_ANIM(g_WaitingTaxiDriver, tlAnimDictTaxiDriver, "leanover_enter") AND NOT IS_ENTITY_PLAYING_ANIM(g_WaitingTaxiDriver, tlAnimDictTaxiDriver, "leanover_idle") IF NOT TAXI_IS_PED_PERFORMING_TASK(g_WaitingTaxiDriver, SCRIPT_TASK_VEHICLE_TEMP_ACTION) TASK_VEHICLE_TEMP_ACTION(g_WaitingTaxiDriver, g_WaitingTaxi, TEMPACT_WAIT, 1000000) ENDIF ENDIF ENDIF ENDIF IF REQUEST_AND_LOAD_TAXI_ASSETS() IF CREATE_TAXI_METER() AND NOT IS_PED_GETTING_INTO_A_VEHICLE(PLAYER_PED_ID()) POPULATE_TAXI_METER() eTaxiDialogue = TAXI_DIALOGUE_WHERE_TO // set dialogue to trigger in PLAY_TAXI_DIALOGUE() eGenerateSafeDestinationState = TAXI_GSDS_INITIAL_TRIGGER_AREAS_CHECK g_iTaxiHailedTime = 0 // reset the hail time out so the taxi won't instantly drive off it the player leaves the taxi iDesinationNodeSearchNumber = 0 // reset ready for getting taxi pull in spot bPlayerCanLeaveVehicle = FALSE // reset ready for control checks bTaxiHasHitDestinationLocate = FALSE // reset ready //iLastTimeExitWasAttempted = 0 // reset ready for control checks bUpdateTaxiControls = TRUE SET_DRIVER_PLAY_TURN_AROUND_ANIM() eTaxiJourneyState = TAXI_JOURNEY_STATE_CHOOSE_LOCATION CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : TAXI_JOURNEY_STATE_CREATE_TAXI_METER -> TAXI_JOURNEY_STATE_CHOOSE_LOCATION : fc = ", GET_FRAME_COUNT()) ELSE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : TAXI_JOURNEY_STATE_CREATE_TAXI_METER -> waiting on create taxi meter and player getting in veh : fc = ", GET_FRAME_COUNT()) ENDIF ENDIF BREAK // Player makes his initial destination selection CASE TAXI_JOURNEY_STATE_CHOOSE_LOCATION IF NOT IS_PED_INJURED(g_WaitingTaxiDriver) AND IS_VEHICLE_DRIVEABLE(g_WaitingTaxi) IF IS_PED_SITTING_IN_VEHICLE(g_WaitingTaxiDriver, g_WaitingTaxi) IF NOT IS_ENTITY_PLAYING_ANIM(g_WaitingTaxiDriver, tlAnimDictTaxiDriver, "leanover_enter") AND NOT IS_ENTITY_PLAYING_ANIM(g_WaitingTaxiDriver, tlAnimDictTaxiDriver, "leanover_idle") IF NOT TAXI_IS_PED_PERFORMING_TASK(g_WaitingTaxiDriver, SCRIPT_TASK_VEHICLE_TEMP_ACTION) TASK_VEHICLE_TEMP_ACTION(g_WaitingTaxiDriver, g_WaitingTaxi, TEMPACT_WAIT, 1000000) ENDIF ENDIF ENDIF ENDIF SET_PLAYER_GROUP_MEMBERS_INTO_TAXI(g_WaitingTaxi, eStoredPlayerSeat) IF HAS_PLAYER_SELECTED_DESTINATION() STAT_INCREMENT(SP_NUMBER_OF_TAXIS_USED, 1.0) // B*1545773 bUpdateTaxiControls = TRUE eTaxiJourneyState = TAXI_JOURNEY_STATE_DRIVING_TO_DESTINATION CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " eTaxiJourneyState = TAXI_JOURNEY_STATE_CHOOSE_LOCATION -> TAXI_JOURNEY_STATE_DRIVING_TO_DESTINATION : fc = ", GET_FRAME_COUNT()) ENDIF BREAK // Taxi is on route to the destination CASE TAXI_JOURNEY_STATE_DRIVING_TO_DESTINATION IF HAS_PLAYER_SELECTED_DESTINATION() SEND_TAXI_TO_DESTINATION() ENDIF BREAK // State where the player has asked the taxi to pull over during the journey CASE TAXI_JOURNEY_STATE_ORDERED_TO_PULLOVER JOURNEY_STATE_ORDERED_TO_PULLOVER() BREAK // Player has skipped the journey to the destination CASE TAXI_JOURNEY_STATE_SKIP_JOURNEY SKIP_JOURNEY_TO_DESTINATION() BREAK ENDSWITCH UPDATE_TAXI_INSTRUCTIONAL_BUTTONS() ELSE eTaxiServiceStage = TAXI_SERVICE_END CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " eTaxiJourneyState = TAXI_SERVICE_STATE_PLAYER_IN_TAXI -> TAXI_SERVICE_END : fc = ", GET_FRAME_COUNT()) ENDIF ENDPROC /// PURPOSE: /// Handles the player getting out of the taxi PROC TAXI_SERVICE_END_STATE() IF NOT IS_PED_INJURED(PLAYER_PED_ID()) IF g_bPlayerIsInTaxi g_bPlayerIsInTaxi = FALSE IF IS_PLAYER_PLAYING(PLAYER_ID()) SET_PLAYER_CONTROL(PLAYER_ID(), TRUE) SET_PLAYER_CAN_DO_DRIVE_BY(PLAYER_ID(), TRUE) ENDIF STOP_PED_SPEAKING(PLAYER_PED_ID(), FALSE) IF eTaxiJourneyState = TAXI_JOURNEY_STATE_DRIVING_TO_DESTINATION OR eTaxiJourneyState = TAXI_JOURNEY_STATE_ORDERED_TO_PULLOVER OR eTaxiJourneyState = TAXI_JOURNEY_STATE_SKIP_JOURNEY ATTEMPT_PAYMENT() ENDIF ENDIF ENDIF CANCEL_GROUP_GETTING_INTO_CAB() IF IS_VEHICLE_OK(g_WaitingTaxi) AND IS_PED_IN_VEHICLE(PLAYER_PED_ID(), g_WaitingTaxi, TRUE) IF NOT TAXI_IS_PED_PERFORMING_TASK(PLAYER_PED_ID(), SCRIPT_TASK_LEAVE_ANY_VEHICLE) AND NOT TAXI_IS_PED_PERFORMING_TASK(PLAYER_PED_ID(), SCRIPT_TASK_LEAVE_VEHICLE) TASK_LEAVE_ANY_VEHICLE(PLAYER_PED_ID(), 0) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " TAXI_SERVICE_END -> player tasked to leave task") ENDIF ELSE // speed off and cleanup if player has wanted level IF IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0) IF NOT IS_PED_INJURED(g_WaitingTaxiDriver) AND IS_VEHICLE_DRIVEABLE(g_WaitingTaxi) IF IS_PED_IN_VEHICLE(g_WaitingTaxiDriver, g_WaitingTaxi) IF NOT IS_PED_INJURED(PLAYER_PED_ID()) TASK_VEHICLE_MISSION_PED_TARGET(g_WaitingTaxiDriver, g_WaitingTaxi, PLAYER_PED_ID(), MISSION_FLEE, 25.0, DRIVINGMODE_AVOIDCARS_RECKLESS | DF_AvoidRestrictedAreas, 300.0, 15.0) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " TAXI_SERVICE_END -> drive tasked to flee player in car") ENDIF ELSE IF NOT IS_PED_FLEEING(g_WaitingTaxiDriver) IF NOT IS_PED_INJURED(PLAYER_PED_ID()) TASK_SMART_FLEE_PED(g_WaitingTaxiDriver, PLAYER_PED_ID(), 300.0, -1) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " TAXI_SERVICE_END -> drive tasked to flee player on foot") ENDIF ENDIF ENDIF SET_PED_KEEP_TASK(g_WaitingTaxiDriver, TRUE) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(g_WaitingTaxiDriver, FALSE) ENDIF CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " TAXI_SERVICE_END -> player wanted ending") ELSE IF NOT IS_PED_INJURED(g_WaitingTaxiDriver) AND IS_VEHICLE_DRIVEABLE(g_WaitingTaxi) IF IS_PED_IN_VEHICLE(g_WaitingTaxiDriver, g_WaitingTaxi) IF NOT TAXI_IS_PED_PERFORMING_TASK(g_WaitingTaxiDriver, SCRIPT_TASK_VEHICLE_DRIVE_WANDER) TASK_VEHICLE_DRIVE_WANDER(g_WaitingTaxiDriver, g_WaitingTaxi, TAXI_SPEED_NORMAL, DRIVINGMODE_STOPFORCARS | DF_AvoidRestrictedAreas) ENDIF ENDIF SET_PED_KEEP_TASK(g_WaitingTaxiDriver, TRUE) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(g_WaitingTaxiDriver, FALSE) ENDIF CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " TAXI_SERVICE_END -> normal ending") ENDIF TAXI_SERVICE_SCRIPT_CLEANUP() ENDIF ENDPROC SCRIPT IF HAS_FORCE_CLEANUP_OCCURRED(FORCE_CLEANUP_FLAG_SP_TO_MP | FORCE_CLEANUP_FLAG_REPEAT_PLAY) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : force cleanup occured, script set to terminate") IF GET_CAUSE_OF_MOST_RECENT_FORCE_CLEANUP() = FORCE_CLEANUP_FLAG_REPEAT_PLAY CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : force cleanup - repeat play cleanup") TAXI_SERVICE_SCRIPT_CLEANUP(FALSE) ELSE TAXI_SERVICE_SCRIPT_CLEANUP() ENDIF TERMINATE_THIS_THREAD() ENDIF IF NOT CAN_SETUP_TAXI_SERVICE() TAXI_SERVICE_SCRIPT_CLEANUP() ENDIF CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : initalised ^^^^^") WHILE(TRUE) // general checks if the script needs to terminate early IF NOT IS_TAXI_SERVICE_SAFE_TO_RUN() TAXI_SERVICE_SCRIPT_CLEANUP() ENDIF //IS_REPLAY_BEING_PROCESSED need to add to terminate straight away IF SHOULD_TAXI_SERVICE_END_EARLY(eTaxiServiceStage) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : SHOULD_TAXI_SERVICE_END_EARLY returned TRUE for stage : ", eTaxiServiceStage) TAXI_SERVICE_SCRIPT_CLEANUP() ENDIF SWITCH eTaxiServiceStage CASE TAXI_SERVICE_STATE_PLAYER_IN_TAXI PLAYER_IN_TAXI_STATE() BREAK CASE TAXI_SERVICE_END TAXI_SERVICE_END_STATE() BREAK CASE TAXI_SERVICE_METER_ONLY #IF IS_DEBUG_BUILD DEBUG_RUN_METER_ONLY() #ENDIF BREAK ENDSWITCH #IF IS_DEBUG_BUILD RUN_DEBUG() #ENDIF WAIT(0) ENDWHILE ENDSCRIPT