USING "globals.sch" USING "commands_audio.sch" USING "commands_camera.sch" USING "commands_entity.sch" USING "commands_interiors.sch" USING "commands_path.sch" USING "commands_ped.sch" USING "commands_player.sch" USING "commands_script.sch" USING "commands_streaming.sch" USING "commands_vehicle.sch" USING "commands_zone.sch" USING "commands_replay.sch" USING "script_player.sch" USING "waiting_taxi.sch" USING "dialogue_public.sch" //Network Headers USING "net_taxi.sch" ENUM TAXI_DIALOGUE TAXI_DIALOGUE_NOTHING = 0, TAXI_DIALOGUE_WHERE_TO, TAXI_DIALOGUE_BEGIN_JOURNEY_1, TAXI_DIALOGUE_BEGIN_JOURNEY_2, TAXI_DIALOGUE_BANTER, TAXI_DIALOGUE_ARRIVE, TAXI_DIALOGUE_CLOSE_AS_POSS, TAXI_DIALOGUE_NO_MONEY, TAXI_DIALOGUE_TUTORIAL_LETS_GO, TAXI_DIALOGUE_CHANGE_DEST_1, TAXI_DIALOGUE_CHANGE_DEST_2, TAXI_DIALOGUE_CHANGE_DEST_3, TAXI_DIALOGUE_RUN_AWAY, TAXI_DIALOGUE_OUT_EARLY, TAXI_DIALOGUE_TRASHED, TAXI_DIALOGUE_PART_JOURNEY, TAXI_DIALOGUE_FIRST_CAB, TAXI_DIALOGUE_RADIO_1, TAXI_DIALOGUE_RADIO_2, TAXI_DIALOGUE_RADIO_3, TAXI_DIALOGUE_STEP_ON_IT_1, TAXI_DIALOGUE_STEP_ON_IT_2, TAXI_DIALOGUE_WAIT_TO_FINISH, TAXI_DIALOGUE_THANKS, TAXI_DIALOGUE_STOP_REQUEST, TAXI_DIALOGUE_START_REQUEST, TAXI_DIALOGUE_DRIVE_BY_REACTION, TAXI_DIALOGUE_UNSAFE_DESTINATION, TAXI_DIALOGUE_END_OF_LIST ENDENUM /// PURPOSE: areas around the map which will require special taxi setup ENUM TAXI_SPECIAL_AREAS_ENUM TAXI_SPECIAL_AREAS_MICHAEL_HOUSE = 0, TAXI_SPECIAL_AREAS_DEL_PERRO_PIER, TAXI_SPECIAL_AREAS_ARMENIAN_2_ALLEYWAY, // Melanoma St. Vespucci Beach TAXI_SPECIAL_AREA_MILITARY_BASE, TAXI_SPECIAL_AREA_MARTIN_RANCH, TAXI_SPECIAL_AREA_FLOYD_APARTMENT, TAXI_SPECIAL_AREAS_INVALID ENDENUM STRUCT TAXI_DEST BLIP_INDEX BlipID INT iHashname1 INT iHashname2 ENDSTRUCT TAXI_DEST currentTaxiDestination CONST_FLOAT MINIMUM_DROP_OFF_DISTANCE_TO_COORD_WARPING 5.0 //10.0 CONST_FLOAT MINIMUM_DROP_OFF_DISTANCE_TO_COORD_DRIVING 25.0 CONST_FLOAT MINIMUM_DROP_OFF_DISTANCE_TO_COORD_DRIVING_FAST 50.0 BLIP_SPRITE taxiStandardBlipSprite = GET_STANDARD_BLIP_ENUM_ID(), taxiWaypointBlipSprite = GET_WAYPOINT_BLIP_ENUM_ID() /// PURPOSE: /// get the taxi vehicle's model /// RETURNS: /// MODEL_NAMES FUNC MODEL_NAMES GET_TAXI_MODEL() RETURN TAXI ENDFUNC /// PURPOSE: /// get the taxi driver's model /// RETURNS: /// MODEL_NAMES FUNC MODEL_NAMES GET_TAXI_DRIVER_MODEL() RETURN A_M_Y_STLAT_01 // new agree taxi driver ped model - see B*1424685 ENDFUNC /// PURPOSE: /// check the specified vehicle is a taxi /// PARAMS: /// vehicleIndex - vehicle to check /// RETURNS: /// TRUE if vehicleIndex is a taxi model FUNC BOOL IS_VEHICLE_A_TAXI_MODEL(VEHICLE_INDEX vehicleIndex) IF IS_VEHICLE_MODEL(vehicleIndex, GET_TAXI_MODEL()) RETURN TRUE ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// Test for if two coords are within fRange metres of each other /// PARAMS: /// v1 - first coord /// v2 - second coord /// fRange - distance /// RETURNS: /// TRUE if two coords are withing fRange of each other FUNC BOOL TAXI_IS_COORD_IN_RANGE_OF_COORD(VECTOR v1, VECTOR v2, FLOAT fRange) RETURN VDIST2(v1, v2) <= (fRange*fRange) ENDFUNC /// PURPOSE: /// Test for if two coords 2D are within fRange metres of each other /// PARAMS: /// v1 - first coord /// v2 - second coord /// fRange - distance /// RETURNS: /// TRUE if two coords are withing fRange of each other in 2D FUNC BOOL IS_COORD_IN_RANGE_OF_COORD_2D(VECTOR v1, VECTOR v2, FLOAT fRange) VECTOR vDiff = v2 - v1 RETURN ((vDiff.x * vDiff.x) + (vDiff.y * vDiff.y)) <= (fRange * fRange) ENDFUNC /// PURPOSE: /// Very efficient test for if two entities are with fRange metres of each other /// Will be more efficient than doing IS_ENTITY_AT_ENTITY() /// NOTE: This function doesn't do dead checks to keep it fast, make sure you do them yourself! /// PARAMS: /// e1 - First entity /// e2 - Second entity /// fRange - Test if the entities are this close to each other FUNC BOOL TAXI_IS_ENTITY_IN_RANGE_ENTITY(ENTITY_INDEX e1, ENTITY_INDEX e2, FLOAT fRange) RETURN ( VDIST2(GET_ENTITY_COORDS(e1), GET_ENTITY_COORDS(e2)) <= fRange*fRange ) ENDFUNC /// PURPOSE: /// Very efficient test for if two entities are with fRange metres of each other /// Will be more efficient than doing IS_ENTITY_AT_ENTITY() /// NOTE: This function doesn't do dead checks to keep it fast, make sure you do them yourself! /// PARAMS: /// e1 - First entity /// e2 - Second entity /// fRange - Test if the entities are this close to each other FUNC BOOL TAXI_IS_ENTITY_IN_RANGE_COORDS(ENTITY_INDEX e1, VECTOR vCoord, FLOAT fRange) RETURN ( VDIST2(GET_ENTITY_COORDS(e1), vCoord) <= fRange*fRange ) ENDFUNC /// PURPOSE: /// Tests if a ped is either performing a script task or is waiting to start it /// PARAMS: /// testPed - the ped to test /// testTask - the script task to check for /// RETURNS: /// TRUE if the ped is performing the task or waiting to start it, FALSE otherwise FUNC BOOL TAXI_IS_PED_PERFORMING_TASK(PED_INDEX testPed, SCRIPT_TASK_NAME testTask) IF DOES_ENTITY_EXIST(testPed) IF NOT IS_ENTITY_DEAD(testPed) IF NOT IS_PED_INJURED(testPed) IF (GET_SCRIPT_TASK_STATUS(testPed, testTask) = PERFORMING_TASK) OR (GET_SCRIPT_TASK_STATUS(testPed, testTask) = WAITING_TO_START_TASK) RETURN TRUE ENDIF ENDIF ENDIF ENDIF RETURN FALSE ENDFUNC FUNC BOOL IS_COORD_ON_SAME_LEVEL_AS_COORD(VECTOR vCoord1, VECTOR vCoord2) FLOAT acceptableHeight FLOAT fTemp = vCoord2.z - vCoord1.z IF fTemp < 0.0 fTemp *= -1.0 ENDIF #IF IS_DEBUG_BUILD printDebugString("\nIS_COORD_ON_SAME_LEVEL_AS_COORD - vCoord1.z = ") printDebugFloat(vCoord1.z) printDebugString("\n") printDebugString("\nIS_COORD_ON_SAME_LEVEL_AS_COORD - vCoord2.z = ") printDebugFloat(vCoord2.z) printDebugString("\n") printDebugString("\nIS_COORD_ON_SAME_LEVEL_AS_COORD - fTemp = ") printDebugFloat(fTemp) printDebugString("\n") #ENDIF IF vCoord1.z <= 1 // Destination is most likely a waypoint blip printDebugString("\nIS_COORD_ON_SAME_LEVEL_AS_COORD - vCoord1.z <= 1, probably a waypoint blip - RETURN TRUE\n") RETURN TRUE ENDIF acceptableHeight = VDIST(vCoord1, vCoord2) acceptableHeight = acceptableHeight/1.75 #IF IS_DEBUG_BUILD printDebugString("\nIS_COORD_ON_SAME_LEVEL_AS_COORD - (VDIST(vCoord1, vCoord2)/1.75) = ") printDebugFloat(acceptableHeight) printDebugString("\n") #ENDIF // make sure taxi is on same level as player IF fTemp < acceptableHeight printDebugString("\nIS_COORD_ON_SAME_LEVEL_AS_COORD - fTemp < acceptableHeight, RETURN TRUE\n") RETURN TRUE ENDIF RETURN FALSE ENDFUNC FUNC BOOL ARE_COORDS_IN_3D_AREA(VECTOR vInCoords, VECTOR vMinCoords, VECTOR vMaxCoords) IF (vInCoords.x > vMinCoords.x) AND (vInCoords.x < vMaxCoords.x) AND (vInCoords.y > vMinCoords.y) AND (vInCoords.y < vMaxCoords.y) AND (vInCoords.z > vMinCoords.z) AND (vInCoords.z < vMaxCoords.z) RETURN(TRUE) ENDIF RETURN(FALSE) ENDFUNC /// PURPOSE: /// Gets Heading given 2 coords /// NOTE: taken from "rgeneral_include.sch" /// PARAMS: /// oldCoords - source point /// newCoords - target point /// invert - this is true (just keep it as true) /// RETURNS: /// Heading FUNC FLOAT TAXI_GET_HEADING_FROM_COORDS(vector oldCoords,vector newCoords, bool invert=true) float heading float dX = newCoords.x - oldCoords.x float dY = newCoords.y - oldCoords.y if dY != 0 heading = ATAN2(dX,dY) ELSE if dX < 0 heading = -90 ELSE heading = 90 ENDIF ENDIF //flip because for some odd reason the coders think west is a heading of 90 degrees, so this'll match the output of commands such as GET_ENTITY_HEADING() IF invert = TRUE heading *= -1.0 //below not necessary but helps for debugging IF heading < 0 heading += 360.0 ENDIF ENDIF RETURN heading ENDFUNC /// PURPOSE: /// check the specified vehicle is a taxi and has it's lights on /// PARAMS: /// vehicleIndex - vehicle to check /// RETURNS: /// TRUE if vehicleIndex is a taxi model and has it's lights on FUNC BOOL DOES_TAXI_HAVE_LIGHT_ON(VEHICLE_INDEX vehicleIndex) IF DOES_ENTITY_EXIST(vehicleIndex) IF IS_VEHICLE_DRIVEABLE(vehicleIndex) IF IS_VEHICLE_A_TAXI_MODEL(vehicleIndex) IF IS_TAXI_LIGHT_ON(vehicleIndex) RETURN TRUE ENDIF ENDIF ENDIF ENDIF RETURN TRUE // Temp until taxis actually have lights ENDFUNC /// PURPOSE: /// check the ped model is suitable taxi driver /// PARAMS: /// pedIndex - ped to check /// RETURNS: /// TRUE if pedIndex is suitable driver model FUNC BOOL IS_PED_A_SUITABLE_TAXI_DRIVER_MODEL(PED_INDEX pedIndex) IF NOT IS_PED_INJURED(pedIndex) IF pedIndex <> PLAYER_PED_ID() IF IS_ENTITY_A_MISSION_ENTITY(pedIndex) IF IS_PED_MODEL(pedIndex, A_M_Y_STLAT_01) // new agree taxi driver ped model - see B*1424685 RETURN TRUE ENDIF ELSE RETURN TRUE // not sure why this is being done yet? ENDIF ENDIF ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// check if the taxi service script is safe to run /// RETURNS: /// FALSE if there is a reason to force terminate FUNC BOOL IS_TAXI_SERVICE_SAFE_TO_RUN() // Player is injured IF IS_PED_INJURED(PLAYER_PED_ID()) //CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : IS_TAXI_SERVICE_SAFE_TO_RUN() return FALSE : IS_PED_INJURED(PLAYER_PED_ID()) check") RETURN FALSE ENDIF // script cannot be holding onto assets when a lead in is playing out IF g_bPlayerLockedInToTrigger = TRUE //CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : IS_TAXI_SERVICE_SAFE_TO_RUN() return FALSE : g_bPlayerLockedInToTrigger check") RETURN FALSE ENDIF // script cannot be holding onto assets when a mocap is playing out IF IS_CUTSCENE_PLAYING() //CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : IS_TAXI_SERVICE_SAFE_TO_RUN() return FALSE : IS_CUTSCENE_PLAYING check") RETURN FALSE ENDIF IF g_bRequestTaxiServiceCleanup //CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : IS_TAXI_SERVICE_SAFE_TO_RUN() return FALSE : g_bRequestTaxiServiceCleanup has been set.") RETURN FALSE ENDIF IF g_bRockstarEditorActive //CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : IS_TAXI_SERVICE_SAFE_TO_RUN() return FALSE : g_bRockstarEditorActive has been set.") RETURN FALSE ENDIF // B*2190070 - duplicate Taxi in replay editor IF REPLAY_SYSTEM_HAS_REQUESTED_A_SCRIPT_CLEANUP() //CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : IS_TAXI_SERVICE_SAFE_TO_RUN() return FALSE : REPLAY_SYSTEM_HAS_REQUESTED_A_SCRIPT_CLEANUP check.") RETURN FALSE ENDIF RETURN TRUE ENDFUNC /// PURPOSE: /// request path nodes using REQUEST_PATH_NODES_IN_AREA_THIS_FRAME /// PARAMS: /// vPickupPosition - where the taxi picks up the player from /// vDestinationPosition - where the taxi needs to path to /// vPathNodeMin - the calculated minimum position we are loading paths /// vPathNodeMax - the calculated maximum position we are loading paths /// iExtraDist - used to add leeywa area around the position before the request PROC REQUEST_PATH_NODES_IN_AREA_FOR_TAXI_THIS_FRAME(VECTOR vPickupPosition, VECTOR vDestinationPosition, VECTOR &vPathNodeMin, VECTOR &vPathNodeMax, INT iExtraDist = 1000) VECTOR vTempPathNodeMin, vTempPathNodeMax // determine if this is a new request // set the area's X values IF vDestinationPosition.X <= vPickupPosition.X vTempPathNodeMin.X = vDestinationPosition.X vTempPathNodeMax.X = vPickupPosition.X ELSE vTempPathNodeMin.X = vPickupPosition.X vTempPathNodeMax.X = vDestinationPosition.X ENDIF // set the area's X values IF vDestinationPosition.Y <= vPickupPosition.Y vTempPathNodeMin.Y = vDestinationPosition.Y vTempPathNodeMax.Y = vPickupPosition.Y ELSE vTempPathNodeMin.Y = vPickupPosition.Y vTempPathNodeMax.Y = vDestinationPosition.Y ENDIF // extra leeway around the positions vTempPathNodeMin -= << iExtraDist, iExtraDist, iExtraDist >> vTempPathNodeMax += << iExtraDist, iExtraDist, iExtraDist >> CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : REQUEST_PATH_NODES_IN_AREA_FOR_TAXI_THIS_FRAME -locally generated vector = vMin : ", vTempPathNodeMin, " vMax : ", vTempPathNodeMax, " using vPickupPosition : ", vPickupPosition, " : vDestinationPosition : ", vDestinationPosition) IF NOT ARE_VECTORS_ALMOST_EQUAL(vTempPathNodeMin, vPathNodeMin) OR NOT ARE_VECTORS_ALMOST_EQUAL(vTempPathNodeMin, vPathNodeMin) vPathNodeMin = vTempPathNodeMin vPathNodeMax = vTempPathNodeMax CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : REQUEST_PATH_NODES_IN_AREA_FOR_TAXI_THIS_FRAME - detected new request for - vMin : ", vPathNodeMin, " vMax : ", vPathNodeMax) ELSE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : REQUEST_PATH_NODES_IN_AREA_FOR_TAXI_THIS_FRAME - detected existing request for - vMin : ", vPathNodeMin, " vMax : ", vPathNodeMax) ENDIF REQUEST_PATH_NODES_IN_AREA_THIS_FRAME(vPathNodeMin.X, vPathNodeMin.Y, vPathNodeMax.X, vPathNodeMax.Y) ENDPROC /// PURPOSE: /// check if the path nodes are loaded for the area /// PARAMS: /// vPathNodeMin - minimum positon /// vPathNodeMax - maximum position /// RETURNS: /// if ARE_NODES_LOADED_FOR_AREA are TRUE FUNC BOOL ARE_REQUEST_PATH_NODES_LOADED_FOR_TAXI(VECTOR vPathNodeMin, VECTOR vPathNodeMax) IF ARE_NODES_LOADED_FOR_AREA(vPathNodeMin.X, vPathNodeMin.Y, vPathNodeMax.X, vPathNodeMax.Y) //CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_REQUEST_PATH_NODES_LOADED_FOR_TAXI - returning TRUE for - vMin : ", vPathNodeMin, " vMax : ", vPathNodeMax) RETURN TRUE ENDIF CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_REQUEST_PATH_NODES_LOADED_FOR_TAXI - returning FALSE for - vMin : ", vPathNodeMin, " vMax : ", vPathNodeMax) RETURN FALSE ENDFUNC /// PURPOSE: /// Create a taxi and /// PARAMS: /// vehIndexReturned - the returned taxi vehicle index /// pedIndexReturned - the returned taxi drvier index /// vPos - coords to spawn at /// fHeading - heading to spawn with /// RETURNS: /// TRUE if taxi and driver were successfully created FUNC BOOL CREATE_TAXI_AND_DRIVER(VEHICLE_INDEX &vehIndexReturned, PED_INDEX &pedIndexReturned, VECTOR vPos, FLOAT fHeading) REQUEST_MODEL(GET_TAXI_DRIVER_MODEL()) REQUEST_MODEL(GET_TAXI_MODEL()) IF HAS_MODEL_LOADED(GET_TAXI_MODEL()) IF HAS_MODEL_LOADED(GET_TAXI_DRIVER_MODEL()) // Create taxi vehIndexReturned = CREATE_VEHICLE(GET_TAXI_MODEL(), vPos, fHeading) IF DOES_ENTITY_EXIST(vehIndexReturned) IF IS_VEHICLE_DRIVEABLE(vehIndexReturned) SET_VEHICLE_ON_GROUND_PROPERLY(vehIndexReturned) // B*1163822 - maybe it left through because the offset putit lower than ground z? SET_TAXI_LIGHTS(vehIndexReturned, TRUE) SET_VEHICLE_HAS_BEEN_OWNED_BY_PLAYER(vehIndexReturned, TRUE) SET_VEHICLE_AUTOMATICALLY_ATTACHES(vehIndexReturned, FALSE) SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(vehIndexReturned, TRUE) // B*1163822 - task fell through world, JMart says once taxi gets tasked and has a valid follow route it will drive #IF IS_DEBUG_BUILD TEXT_LABEL tDebugName = "TSveh" SET_VEHICLE_NAME_DEBUG(vehIndexReturned, tDebugName) #ENDIF // Create Driver pedIndexReturned = CREATE_PED_INSIDE_VEHICLE(vehIndexReturned, PEDTYPE_SPECIAL, GET_TAXI_DRIVER_MODEL()) IF DOES_ENTITY_EXIST(pedIndexReturned) IF NOT IS_PED_INJURED(pedIndexReturned) SET_VEHICLE_FORWARD_SPEED(vehIndexReturned, 5.0) IF NOT IS_ENTITY_A_MISSION_ENTITY(pedIndexReturned) SET_ENTITY_AS_MISSION_ENTITY(pedIndexReturned) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : CREATE_TAXI_AND_DRIVER() : set pedIndexReturned as mission entity") ENDIF IF NOT IS_ENTITY_A_MISSION_ENTITY(vehIndexReturned) SET_ENTITY_AS_MISSION_ENTITY(vehIndexReturned) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : CREATE_TAXI_AND_DRIVER() : set vehIndexReturned as mission entity") ENDIF SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedIndexReturned, TRUE) // B*1536974 - Press to enter taxi as passenger hold to jack driver - opposite to how it worked on IV // to get IV behaviour you have to ensur this flag is false then task the player in script to enter as rear passenger when input detected SET_PED_CONFIG_FLAG(pedIndexReturned, PCF_AICanDrivePlayerAsRearPassenger, TRUE) SET_PED_COMBAT_ATTRIBUTES(pedIndexReturned, CA_ALWAYS_FIGHT, FALSE) SET_PED_COMBAT_ATTRIBUTES(pedIndexReturned, CA_ALWAYS_FLEE, TRUE) SET_PED_FLEE_ATTRIBUTES(pedIndexReturned, FA_NEVER_FLEE, FALSE) SET_AMBIENT_VOICE_NAME(pedIndexReturned, "A_M_M_EASTSA_02_LATINO_FULL_01") // alternative coming soon - // SET_AMBIENT_VOICE_NAME(g_WaitingTaxiDriver, "S_M_M_BOUNCER_01_LATINO_FULL_01") SET_MODEL_AS_NO_LONGER_NEEDED(GET_TAXI_MODEL()) SET_MODEL_AS_NO_LONGER_NEEDED(GET_TAXI_DRIVER_MODEL()) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : CREATE_TAXI_AND_DRIVER() return TRUE") RETURN TRUE ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF RETURN FALSE ENDFUNC FUNC BOOL CREATE_TAXI(MODEL_NAMES TaxiModel, VECTOR pos, FLOAT heading, BOOL bCreateSlightlyToRight = FALSE, BOOL bCreateAsWaiting = TRUE) VEHICLE_INDEX CarID PED_INDEX DriverID REQUEST_MODEL(GET_TAXI_DRIVER_MODEL()) REQUEST_MODEL(TaxiModel) IF HAS_MODEL_LOADED(TaxiModel) IF HAS_MODEL_LOADED(GET_TAXI_DRIVER_MODEL()) // Create Cab CarID = CREATE_VEHICLE(TaxiModel, pos, heading) IF (bCreateSlightlyToRight) SET_ENTITY_HEADING(CarID, heading) SET_ENTITY_COORDS(CarID, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(CarID, <<2.0, 0.0, 0.0>>)) ENDIF SET_VEHICLE_ON_GROUND_PROPERLY(CarID) // B*1163822 - maybe it left through because the offset putit lower than ground z? SET_TAXI_LIGHTS(CarID, TRUE) SET_VEHICLE_HAS_BEEN_OWNED_BY_PLAYER(CarID, TRUE) // Create Driver DriverID = CREATE_PED_INSIDE_VEHICLE(CarID, PEDTYPE_SPECIAL, GET_TAXI_DRIVER_MODEL()) SET_VEHICLE_FORWARD_SPEED(CarID, 5.0) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(DriverID, TRUE) SET_MODEL_AS_NO_LONGER_NEEDED(TaxiModel) SET_MODEL_AS_NO_LONGER_NEEDED(GET_TAXI_DRIVER_MODEL()) SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(CarID, TRUE) // B*1163822 - task fell through world, JMart says once taxi gets tasked and has a valid follow route it will drive #IF IS_DEBUG_BUILD TEXT_LABEL tDebugName = "TSveh" SET_VEHICLE_NAME_DEBUG(CarID, tDebugName) printDebugString("\n CREATE_TAXI - DONE \n") #ENDIF IF bCreateAsWaiting STORE_CAR_AS_TAXI_WAITING_FOR_PLAYER(CarID, DriverID) ELSE SET_PED_AS_NO_LONGER_NEEDED(DriverID) SET_VEHICLE_AS_NO_LONGER_NEEDED(CarID) ENDIF RETURN(TRUE) ENDIF ENDIF RETURN(FALSE) ENDFUNC PROC CREATE_TAXI_WITH_WAIT(MODEL_NAMES TaxiModel, VECTOR pos, FLOAT heading) WHILE NOT CREATE_TAXI(TaxiModel, pos, heading) WAIT(0) ENDWHILE ENDPROC /// PURPOSE: /// taken from restrictedareas.sc - perfer to move to common file /// RETURNS: /// TRUE if player is allowed to be in the studios FUNC BOOL TAXI_IS_STUDIO_OPEN_FOR_CURRENT_PLAYER() #if USE_CLF_DLC return true #endif #if USE_NRM_DLC return true #endif #if not USE_CLF_DLC #if not USE_NRM_DLC enumCharacterList eTempChar = GET_CURRENT_PLAYER_PED_ENUM() IF eTempChar = CHAR_MICHAEL IF GET_MISSION_FLOW_FLAG_STATE(FLOWFLAG_MOVIE_STUDIO_OPEN) RETURN TRUE ENDIF // B*1405773 - Don't get a wanted level if Solomon1 is available, even if they don't go to security gates IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH (HASH("ambient_Solomon")) > 0 RETURN TRUE ENDIF ELIF eTempChar = CHAR_FRANKLIN IF GET_MISSION_FLOW_FLAG_STATE(FLOWFLAG_MOVIE_STUDIO_OPEN_FRANKLIN) RETURN TRUE ENDIF ELIF eTempChar = CHAR_TREVOR IF GET_MISSION_FLOW_FLAG_STATE(FLOWFLAG_MOVIE_STUDIO_OPEN) RETURN TRUE ENDIF ENDIF RETURN FALSE #endif #endif ENDFUNC /// PURPOSE: /// Used to decide if call to taxi service should be successful response /// or position is ok to spawn a taxi /// RETURNS: /// TRUE if position is in a taxi restricted area /// PURPOSE: /// Used to decide if call to taxi service should be successful response /// or position is ok to spawn a taxi /// PARAMS: /// vPosition - position to test /// bAllowExceptionsForCallingTaxi - as this func is also used to determine if a call for a taxi should go through, some areas shouldn't block the call /// e.g. Floyd's apartment, don't want taxis in the apartment block but should be able to order one from inside the block to stop on the road /// RETURNS: /// TRUE if position is in a taxi restricted area FUNC BOOL IS_POSITION_IN_TAXI_RESTRICTED_AREA(VECTOR vPosition, BOOL bAllowExceptionsForCallingTaxi = FALSE) // only use this if it covers the green - still want to call cabs from the carpark //IF IS_AREACHECK_IN_ACTIVE_RANGE(AC_GOLF_COURSE, vPosition) // too big a radius check IF TAXI_IS_COORD_IN_RANGE_OF_COORD(vPosition, << -1144.49731, 43.01712, 51.94447 >>, 325.0) // ensure checks only happen if player is within range of course IF IS_COORD_IN_SPECIFIED_AREA(vPosition, AC_GOLF_COURSE) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : IS_POSITION_IN_TAXI_RESTRICTED_AREA return TRUE : AC_GOLF_COURSE check") RETURN TRUE ENDIF // ac golf checks are too loose so need extra area checks unfortunately // Goes from here along the clubhouse heading clockwise IF IS_POINT_IN_ANGLED_AREA(vPosition, <<-1319.768555,29.526155,49.566158>>, <<-1336.526611,121.035141,75.618881>>, 18.000000) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : IS_POSITION_IN_TAXI_RESTRICTED_AREA return TRUE : golf course extra check 1") RETURN TRUE ENDIF // Caddy carpark - leading to main carpark IF IS_POINT_IN_ANGLED_AREA(vPosition, <<-1360.019653,110.130661,52.634132>>, <<-1365.276001,172.062439,72.013123>>, 52.000000) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : IS_POSITION_IN_TAXI_RESTRICTED_AREA return TRUE : golf course extra check 2") RETURN TRUE ENDIF // North East corner IF IS_POINT_IN_ANGLED_AREA(vPosition, <<-1363.006592,170.533035,50.008129>>, <<-1296.903320,178.813324,73.371040>>, 35.000000) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : IS_POSITION_IN_TAXI_RESTRICTED_AREA return TRUE : golf course extra check 3") RETURN TRUE ENDIF // Along North wall IF IS_POINT_IN_ANGLED_AREA(vPosition, <<-1197.521240,199.864288,57.044708>>, <<-1298.039551,176.138412,73.332520>>, 34.000000) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : IS_POSITION_IN_TAXI_RESTRICTED_AREA return TRUE : golf course extra check 4") RETURN TRUE ENDIF // Along North East corner IF IS_POINT_IN_ANGLED_AREA(vPosition, <<-1103.744873,221.136673,55.348141>>, <<-1208.393799,191.090927,79.137085>>, 45.000000) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : IS_POSITION_IN_TAXI_RESTRICTED_AREA return TRUE : golf course extra check 5") RETURN TRUE ENDIF // East border IF IS_POINT_IN_ANGLED_AREA(vPosition, <<-989.032837,-89.393761,32.488010>>, <<-1086.210938,-115.707649,50.650505>>, 70.000000) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : IS_POSITION_IN_TAXI_RESTRICTED_AREA return TRUE : golf course extra check 6") RETURN TRUE ENDIF // South border IF IS_POINT_IN_ANGLED_AREA(vPosition, <<-958.548096,-111.545547,30.764324>>, <<-1132.685303,190.784119,73.903656>>, 70.000000) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : IS_POSITION_IN_TAXI_RESTRICTED_AREA return TRUE : golf course extra check 7") RETURN TRUE ENDIF // south boarder heading from southern most point up towards the club house IF IS_POINT_IN_ANGLED_AREA(vPosition, <<-1077.028198,-139.733704,38.733883>>, <<-1299.555908,-15.168939,63.437103>>, 20.000000) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : IS_POSITION_IN_TAXI_RESTRICTED_AREA return TRUE : golf course extra check 8") RETURN TRUE ENDIF // south boarder West corner covering on foot entrance to green IF IS_POINT_IN_ANGLED_AREA(vPosition, <<-1319.768555,29.526155,47.566158>>, <<-1287.619263,-24.888639,67.527298>>, 20.000000) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : IS_POSITION_IN_TAXI_RESTRICTED_AREA return TRUE : golf course extra check 9") RETURN TRUE ENDIF ENDIF IF IS_AREACHECK_IN_ACTIVE_RANGE(AC_AIRPORT_AIRSIDE, vPosition) IF IS_COORD_IN_SPECIFIED_AREA(vPosition, AC_AIRPORT_AIRSIDE) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : IS_POSITION_IN_TAXI_RESTRICTED_AREA return TRUE : AC_AIRPORT_AIRSIDE check") RETURN TRUE ENDIF ENDIF IF IS_AREACHECK_IN_ACTIVE_RANGE(AC_MILITARY_BASE, vPosition) IF IS_COORD_IN_SPECIFIED_AREA(vPosition, AC_MILITARY_BASE) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : IS_POSITION_IN_TAXI_RESTRICTED_AREA return TRUE : AC_MILITARY_BASE check") RETURN TRUE ENDIF ENDIF IF IS_AREACHECK_IN_ACTIVE_RANGE(AC_PRISON, vPosition) IF IS_COORD_IN_SPECIFIED_AREA(vPosition, AC_PRISON) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : IS_POSITION_IN_TAXI_RESTRICTED_AREA return TRUE : AC_PRISON check") RETURN TRUE ENDIF ENDIF IF IS_AREACHECK_IN_ACTIVE_RANGE(AC_BIOTECH, vPosition) IF IS_COORD_IN_SPECIFIED_AREA(vPosition, AC_BIOTECH) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : IS_POSITION_IN_TAXI_RESTRICTED_AREA return TRUE : AC_BIOTECH check") RETURN TRUE ENDIF ENDIF IF IS_AREACHECK_IN_ACTIVE_RANGE(AC_MILITARY_DOCKS, vPosition) IF IS_COORD_IN_SPECIFIED_AREA(vPosition, AC_MILITARY_DOCKS) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : IS_POSITION_IN_TAXI_RESTRICTED_AREA return TRUE : AC_MILITARY_DOCKS check") RETURN TRUE ENDIF ENDIF IF NOT TAXI_IS_STUDIO_OPEN_FOR_CURRENT_PLAYER() IF IS_AREACHECK_IN_ACTIVE_RANGE(AC_MOVIE_STUDIO, vPosition) IF IS_COORD_IN_SPECIFIED_AREA(vPosition, AC_MOVIE_STUDIO) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : IS_POSITION_IN_TAXI_RESTRICTED_AREA return TRUE : AC_MOVIE_STUDIO check") RETURN TRUE ENDIF ENDIF ENDIF IF IS_AREACHECK_IN_ACTIVE_RANGE(AC_DOWNTOWN_POLICE, vPosition) IF IS_COORD_IN_SPECIFIED_AREA(vPosition, AC_DOWNTOWN_POLICE) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : IS_POSITION_IN_TAXI_RESTRICTED_AREA return TRUE : AC_DOWNTOWN_POLICE check") RETURN TRUE ENDIF ENDIF // road leading up to gov facility // B*1395206 - IF IS_POINT_IN_ANGLED_AREA(vPosition, <<2591.626465,-268.893951,111.885857>>, <<2591.331055,-614.435547,55.369205>>, 70.000000) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : IS_POSITION_IN_TAXI_RESTRICTED_AREA return TRUE : gov facility road check") RETURN TRUE ENDIF //2025599 - Pilot School Area IF IS_POINT_IN_ANGLED_AREA(vPosition, <<-1112.586182,-2674.766846,12.568037>>, <<-1215.468140,-2854.588623,19.445877>>, 41.2500) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : IS_POSITION_IN_TAXI_RESTRICTED_AREA return TRUE : Pilot School Area") RETURN TRUE ENDIF // B*1392187 - mountainous area leading to base jump in Raton Canyon IF IS_POINT_IN_ANGLED_AREA(vPosition, <<-804.050049,4216.411621,204.487198>>, <<-509.067871,4135.190430,123.250168>>, 250.000000) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : IS_POSITION_IN_TAXI_RESTRICTED_AREA return TRUE : mountainous area Raton Canyon base jump") RETURN TRUE ENDIF // B*1533798 - West side Mount Chiliad IF IS_POINT_IN_ANGLED_AREA(vPosition, <<-148.877655,4862.203613,305.644196>>, <<454.627441,5573.104004,804.096985>>, 250.000000) // majority West from top of cable cart building down OR IS_POINT_IN_ANGLED_AREA(vPosition, <<-482.893066,4990.255371,155.160110>>, <<7.830751,5009.370605,430.760376>>, 250.000000) // minor West following down from previous check to lower ground CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : IS_POSITION_IN_TAXI_RESTRICTED_AREA return TRUE : Mount Chiliad West") RETURN TRUE ENDIF // B*1533798 - East side Mount Chiliad IF IS_POINT_IN_ANGLED_AREA(vPosition, <<441.399902,5579.990234,802.513794>>, <<965.777588,5675.920898,601.264648>>, 250.000000) // East from top of cable cart building down OR IS_POINT_IN_ANGLED_AREA(vPosition, <<954.113892,5641.050781,646.505432>>, <<2140.375000,5377.753418,149.122086>>, 250.000000) // majority East following down from previous check to lower ground OR IS_POINT_IN_ANGLED_AREA(vPosition, <<2117.347656,5377.259277,173.329727>>, <<2439.933838,5297.444824,62.686623>>, 100.000000) // minor East following down from previous check to lower ground OR IS_POINT_IN_ANGLED_AREA(vPosition, <<2393.347412,5321.579590,107.062424>>, <<2523.945557,5124.745605,41.683842>>, 70.000000) // minor East following down from previous check to base CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : IS_POSITION_IN_TAXI_RESTRICTED_AREA return TRUE : Mount Chiliad East") RETURN TRUE ENDIF //B*1485093 - Port of LS heist Setup area - restricted by gates IF TAXI_IS_COORD_IN_RANGE_OF_COORD(vPosition, << -99.68751, -2448.89111, 5.01731 >>, 230.0) // ensure checks only happen if player is within range of the area IF IS_POINT_IN_ANGLED_AREA(vPosition, <<85.054482,-2511.883789,-2.996267>>, <<-57.599766,-2412.716309,15.000947>>, 75.000000) // East section heading down the side of the gates OR IS_POINT_IN_ANGLED_AREA(vPosition, <<7.516524,-2546.740967,1.331557>>, <<-177.326843,-2417.046631,19.160444>>, 80.000000) // Central area heading from South East gates into area OR IS_POINT_IN_ANGLED_AREA(vPosition, <<-260.035370,-2419.978271,1.399635>>, <<-27.263750,-2423.848389,25.000641>>, 80.000000) // Waters edge OR IS_POINT_IN_ANGLED_AREA(vPosition, <<-187.425598,-2516.085693,-6.849975>>, <<-186.751801,-2438.148682,25.001602>>, 40.00000) // South gates OR IS_POINT_IN_ANGLED_AREA(vPosition, <<-73.608131,-2538.563721,-6.989857>>, <<-183.255585,-2465.145020,25.020298>>, 70.000000) // South area CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : IS_POSITION_IN_TAXI_RESTRICTED_AREA return TRUE : Port of LS heist Setup area") RETURN TRUE ENDIF ENDIF IF NOT bAllowExceptionsForCallingTaxi // B*1553064 Floyd's apartment (prevent taxi spawning in the alleyway) IF IS_POINT_IN_ANGLED_AREA(vPosition, <<-1171.708618,-1524.659790,23.379686>>, <<-1139.721436,-1573.588989,-1.585432>>, 55.000000) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : IS_POSITION_IN_TAXI_RESTRICTED_AREA return TRUE : Floyd's apartment") RETURN TRUE ENDIF // B*1574664 - Hayes Autos (both entrances gated) - covering front (North) entrance IF IS_POINT_IN_ANGLED_AREA(vPosition, <<476.539398,-1301.547974,44.824577>>, <<499.582245,-1339.024536,26.317030>>, 35.000000) //covering front (North) entrance OR IS_POINT_IN_ANGLED_AREA(vPosition, <<496.981628,-1412.255127,43.293907>>, <<497.269012,-1339.363892,26.316479>>, 40.000000) // covering back (South) entrance CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : IS_POSITION_IN_TAXI_RESTRICTED_AREA return TRUE : Hayes Autos") RETURN TRUE ENDIF ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// perform checks on vSpawnPosition to make sure it's safe for spawning taxi /// PARAMS: /// vPlayerCoords - player's position /// vSpawnPosition - place to check is safe /// fMaxSpawnDist - max dist vSpawnPosition is allowed to be from vPlayerCoords (jMart said 300m is path loading size /// fMinSpawnDist - min dist vSpawnPosition has to be from vPlayerCoords /// RETURNS: /// TRUE if spawn position is safe FUNC BOOL IS_SPAWN_POSITION_SAFE_FOR_TAXI(VECTOR vPlayerCoords, VECTOR vSpawnPosition, FLOAT fMaxSpawnDist = 300.0, FLOAT fMinSpawnDist = 20.0) // cheaper FLOAT fDistSquared = VDIST2(vPlayerCoords, vSpawnPosition) // check the spawn position isn't too far away IF fDistSquared >= (fMaxSpawnDist * fMaxSpawnDist) //CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : IS_SPAWN_POSITION_SAFE_FOR_TAXI() : return FALSE spawn pos too far away!") RETURN FALSE ENDIF // check the spawn position isn't too close to the playe IF fDistSquared <= (fMinSpawnDist * fMinSpawnDist) //CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : IS_SPAWN_POSITION_SAFE_FOR_TAXI() : return FALSE spawn pos to close to player!") RETURN FALSE ENDIF // check player won't see it spawn in IF IS_SPHERE_VISIBLE(vSpawnPosition, 2.5) //CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : IS_SPAWN_POSITION_SAFE_FOR_TAXI() : return FALSE sphere at position visible") RETURN FALSE ENDIF //check the position isn't obsured IF IS_POINT_OBSCURED_BY_A_MISSION_ENTITY(vSpawnPosition, <<3,3,3>>) //CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : IS_SPAWN_POSITION_SAFE_FOR_TAXI() : return FALSE point obsured by mission entity") RETURN FALSE ENDIF IF IS_POSITION_IN_TAXI_RESTRICTED_AREA(vSpawnPosition) //CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : IS_SPAWN_POSITION_SAFE_FOR_TAXI() : return FALSE point in taxi restricted area") RETURN FALSE ENDIF RETURN TRUE ENDFUNC /// PURPOSE: /// test if the specific coords are in a special taxi area... /// basically anywhere where taxi will need to have it's spawn location / drive to position set by script /// Work this up so you pass in an enum of the special taxi locations which gets set /// PARAMS: /// vInCoords - specific position to check /// RETURNS: /// TRUE if coords are in a special area FUNC TAXI_SPECIAL_AREAS_ENUM GET_TAXI_SPECIAL_AREA_AT_COORDS(VECTOR vInCoords) // Michael's house - same areas ARE_COORDS_IN_SPECIAL_AREA IF ARE_COORDS_IN_3D_AREA(vInCoords, <<-874.9833, 125.7645,-100>>, <<-768.625366,193.029709,100>>) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : GET_TAXI_SPECIAL_AREA_AT_COORDS return TRUE : TAXI_SPECIAL_AREAS_MICHAEL_HOUSE") RETURN TAXI_SPECIAL_AREAS_MICHAEL_HOUSE ENDIF //Del Perro Pier IF IS_COORD_IN_RANGE_OF_COORD_2D(vInCoords, << -1693.30176, -1109.13049, 17.89778 >>, 240.0) // main area of the pier IF IS_POINT_IN_ANGLED_AREA(vInCoords, <<-1538.980591,-941.132324,10.566226>>, <<-1715.570313,-1139.765869,52.203613>>, 110.000000) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : GET_TAXI_SPECIAL_AREA_AT_COORDS return TRUE : TAXI_SPECIAL_AREAS_DEL_PERRO_PIER") RETURN TAXI_SPECIAL_AREAS_DEL_PERRO_PIER ENDIF // walk way leading to end of the pier IF IS_POINT_IN_ANGLED_AREA(vInCoords, <<-1739.989014,-1115.973022,10.087262>>, <<-1800.514893,-1187.179810,52.017200>>, 25.000000) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : GET_TAXI_SPECIAL_AREA_AT_COORDS return TRUE : TAXI_SPECIAL_AREAS_DEL_PERRO_PIER") RETURN TAXI_SPECIAL_AREAS_DEL_PERRO_PIER ENDIF // end of the pier IF IS_POINT_IN_ANGLED_AREA(vInCoords, <<-1801.766357,-1180.251709,4.017236>>, <<-1857.717651,-1244.628418,38.496529>>, 85.000000) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : GET_TAXI_SPECIAL_AREA_AT_COORDS return TRUE : TAXI_SPECIAL_AREAS_DEL_PERRO_PIER") RETURN TAXI_SPECIAL_AREAS_DEL_PERRO_PIER ENDIF ENDIF // Armenian 2 - Melanoma St. Vespucci Beach - dead end alleyway, also covers the dead end road which the alley way is on IF IS_POINT_IN_ANGLED_AREA(vInCoords, <<-1140.889648,-1573.134888,-6.566939>>, <<-1067.084351,-1675.975586,23.531528>>, 52.000000) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : GET_TAXI_SPECIAL_AREA_AT_COORDS return TRUE : TAXI_SPECIAL_AREAS_ARMENIAN_2_ALLEYWAY") RETURN TAXI_SPECIAL_AREAS_ARMENIAN_2_ALLEYWAY ENDIF // Military Base - don't do the more expensive check if vInCoords is no where near the area IF IS_AREACHECK_IN_ACTIVE_RANGE(AC_MILITARY_BASE, vInCoords) IF IS_COORD_IN_SPECIFIED_AREA(vInCoords, AC_MILITARY_BASE) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : GET_TAXI_SPECIAL_AREA_AT_COORDS return TRUE : TAXI_SPECIAL_AREA_MILITARY_BASE") RETURN TAXI_SPECIAL_AREA_MILITARY_BASE ENDIF ENDIF // Martin Madrazo's ranch (prevents taxi spawning around the stables) IF IS_POINT_IN_ANGLED_AREA(vInCoords, <<1324.171509,1110.747925,99.654930>>, <<1523.096802,1110.473389,132.885864>>, 170.000000) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : GET_TAXI_SPECIAL_AREA_AT_COORDS return TRUE : TAXI_SPECIAL_AREA_MARTIN_RANCH") RETURN TAXI_SPECIAL_AREA_MARTIN_RANCH ENDIF // B*1553064 Floyd's apartment (prevent taxi spawning in the alleyway) IF IS_POINT_IN_ANGLED_AREA(vInCoords, <<-1171.708618,-1524.659790,23.379686>>, <<-1139.721436,-1573.588989,-1.585432>>, 55.000000) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : GET_TAXI_SPECIAL_AREA_AT_COORDS return TRUE : TAXI_SPECIAL_AREA_FLOYD_APARTMENT") RETURN TAXI_SPECIAL_AREA_FLOYD_APARTMENT ENDIF RETURN TAXI_SPECIAL_AREAS_INVALID ENDFUNC /// PURPOSE: /// Returns a safe spawn position for a taxi who need to navigate to the the specified special area /// PARAMS: /// vPlayerCoords - player's position to use in safe checks /// eSpecialArea - the area the taxi is going to be navigating to /// vReturnSpawnCoords - reference to spawn position /// fReturnSpawnHeading - reference to spawn heading /// RETURNS: /// TRUE if spawn info was set successfully FUNC BOOL GET_TAXI_SPAWN_INFO_FOR_TAXI_SPECIAL_AREA(VECTOR vPlayerCoords, TAXI_SPECIAL_AREAS_ENUM eSpecialArea, VECTOR &vReturnSpawnCoords, FLOAT &fReturnSpawnHeading) VECTOR vTempCoords FLOAT fTempHeading INT i, iVariations IF eSpecialArea = TAXI_SPECIAL_AREAS_MICHAEL_HOUSE i = 0 iVariations = 5 REPEAT iVariations i IF i = 0 vTempCoords = <<-883.8992, 76.3237, 50.9372>> fTempHeading = 271.8234 // South West ELIF i = 1 vTempCoords = <<-838.2045, 88.1067, 51.3396>> fTempHeading = 102.3721 // South East ELIF i = 2 vTempCoords = <<-884.0715, 217.2857, 71.7633>> fTempHeading = 254.5437 // North West ELIF i = 3 vTempCoords = <<-834.0018, 217.2782, 73.1540>> fTempHeading = 80.7037 // North East ELIF i = 4 vTempCoords = <<-830.9222, 135.3548, 58.1352>> fTempHeading = 92.9570 // Road running along south boarder of house ENDIF IF IS_SPAWN_POSITION_SAFE_FOR_TAXI(vPlayerCoords, vTempCoords) vReturnSpawnCoords = vTempCoords fReturnSpawnHeading = fTempHeading CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : GET_TAXI_SPAWN_INFO_FOR_TAXI_SPECIAL_AREA() : TAXI_SPECIAL_AREAS_MICHAEL_HOUSE : return TRUE Variation = ", i, " vReturnSpawnCoords = ", vReturnSpawnCoords, " fReturnSpawnHeading = ", fReturnSpawnHeading) RETURN TRUE ENDIF ENDREPEAT ELIF eSpecialArea = TAXI_SPECIAL_AREAS_DEL_PERRO_PIER i = 0 iVariations = 6 REPEAT iVariations i IF i = 0 vTempCoords = <<-1587.0962, -928.5875, 14.3046>> fTempHeading = 139.9023 // towards bottom of the bridge ELIF i = 1 vTempCoords = <<-1532.4579, -863.6670, 21.6188>> fTempHeading = 139.9028 // browe of the hill on the bridge ELIF i = 2 vTempCoords = <<-1472.8877, -733.0396, 24.0746>> fTempHeading = 236.3756 // north west of entrance sign ELIF i = 3 vTempCoords = <<-1397.3027, -781.1235, 19.3347>> fTempHeading = 48.1876 // south east of entrance sign ELIF i = 4 vTempCoords = <<-1605.4087, -1012.5778, 12.0175>> fTempHeading = 51.1191 // on the pier close to car park ELIF i = 5 vTempCoords = <<-1572.4573, -1007.1061, 12.0184>> fTempHeading = 141.2024 // on the pier car park ENDIF IF IS_SPAWN_POSITION_SAFE_FOR_TAXI(vPlayerCoords, vTempCoords) vReturnSpawnCoords = vTempCoords fReturnSpawnHeading = fTempHeading CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : GET_TAXI_SPAWN_INFO_FOR_TAXI_SPECIAL_AREA() : TAXI_SPECIAL_AREAS_DEL_PERRO_PIER : return TRUE Variation = ", i, " vReturnSpawnCoords = ", vReturnSpawnCoords, " fReturnSpawnHeading = ", fReturnSpawnHeading) RETURN TRUE ENDIF ENDREPEAT ELIF eSpecialArea = TAXI_SPECIAL_AREAS_ARMENIAN_2_ALLEYWAY i = 0 iVariations = 4 REPEAT iVariations i IF i = 0 vTempCoords = <<-1126.5519, -1530.5911, 3.2940>> fTempHeading = 214.5477 // road leading onto dead end road North ELIF i = 1 vTempCoords = <<-1043.0194, -1644.1719, 3.4894>> fTempHeading = 35.3163 // road leading onto dead end road South ELIF i = 2 vTempCoords = <<-1039.3455, -1532.5812, 4.1467>> fTempHeading = 32.1734 // block away South ELIF i = 3 vTempCoords = <<-1067.5765, -1501.9440, 4.0327>> fTempHeading = 216.1659 // block away North ENDIF IF IS_SPAWN_POSITION_SAFE_FOR_TAXI(vPlayerCoords, vTempCoords) vReturnSpawnCoords = vTempCoords fReturnSpawnHeading = fTempHeading CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : GET_TAXI_SPAWN_INFO_FOR_TAXI_SPECIAL_AREA() : TAXI_SPECIAL_AREAS_ARMENIAN_2_ALLEYWAY : return TRUE Variation = ", i, " vReturnSpawnCoords = ", vReturnSpawnCoords, " fReturnSpawnHeading = ", fReturnSpawnHeading) RETURN TRUE ENDIF ENDREPEAT ELIF eSpecialArea = TAXI_SPECIAL_AREA_MILITARY_BASE i = 0 iVariations = 4 REPEAT iVariations i IF i = 0 vTempCoords = <<-1247.2906, 2549.5300, 16.4214>> fTempHeading = 137.1185 // just East of main bridge entrance ELIF i = 1 vTempCoords = <<-1314.1100, 2470.6770, 23.3185>> fTempHeading = 309.2187 // just West of main bridge entrance ELIF i = 2 vTempCoords = <<-1095.3818, 2686.4868, 18.5919>> fTempHeading = 130.0954 // East of main bridge behind building ELIF i = 3 vTempCoords = <<-1373.5143, 2429.9441, 26.7492>> fTempHeading = 298.9626 // West to the left of main bridge entrance ENDIF IF IS_SPAWN_POSITION_SAFE_FOR_TAXI(vPlayerCoords, vTempCoords) vReturnSpawnCoords = vTempCoords fReturnSpawnHeading = fTempHeading CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : GET_TAXI_SPAWN_INFO_FOR_TAXI_SPECIAL_AREA() : TAXI_SPECIAL_AREA_MILITARY_BASE : return TRUE Variation = ", i, " vReturnSpawnCoords = ", vReturnSpawnCoords, " fReturnSpawnHeading = ", fReturnSpawnHeading) RETURN TRUE ENDIF ENDREPEAT ELIF eSpecialArea = TAXI_SPECIAL_AREA_MARTIN_RANCH i = 0 iVariations = 5 REPEAT iVariations i IF i = 0 vTempCoords = <<1299.1980, 1164.3418, 105.3728>> fTempHeading = 3.1765 // close to north gate heading north along road ELIF i = 1 vTempCoords = <<1304.8314, 1084.5979, 104.6453>> fTempHeading = 8.2195 // close to south gate heading north along road ELIF i = 2 vTempCoords = <<1290.8727, 1237.6844, 107.4217>> fTempHeading = 186.5802 // close to north gate heading south along road ELIF i = 3 vTempCoords = <<1310.9749, 1001.1377, 104.9354>> fTempHeading = 359.3654 // close to south gate heading south along road ELIF i = 4 vTempCoords = <<1284.9357, 1355.7482, 103.4301>> fTempHeading = 182.4582 // over brow of the hill to the north along the road ENDIF IF IS_SPAWN_POSITION_SAFE_FOR_TAXI(vPlayerCoords, vTempCoords) vReturnSpawnCoords = vTempCoords fReturnSpawnHeading = fTempHeading CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : GET_TAXI_SPAWN_INFO_FOR_TAXI_SPECIAL_AREA() : TAXI_SPECIAL_AREA_MARTIN_RANCH : return TRUE Variation = ", i, " vReturnSpawnCoords = ", vReturnSpawnCoords, " fReturnSpawnHeading = ", fReturnSpawnHeading) RETURN TRUE ENDIF ENDREPEAT ELIF eSpecialArea = TAXI_SPECIAL_AREA_FLOYD_APARTMENT i = 0 iVariations = 5 REPEAT iVariations i IF i = 0 vTempCoords = <<-1208.6174, -1410.7325, 3.1853>> fTempHeading = 215.8772 // north up a block main road ELIF i = 1 vTempCoords = <<-1172.9000, -1412.3802, 3.6078>> fTempHeading = 126.9322 // North east up a block turn ELIF i = 2 vTempCoords = <<-1112.8418, -1437.8954, 4.0310>> fTempHeading = 211.4814 // East block away behind junc to the north ELIF i = 3 vTempCoords = <<-1079.8854, -1472.8779, 4.0784>> fTempHeading = 32.9476 // East block away behind junc to the south ELIF i = 4 vTempCoords = <<-1086.7677, -1540.7067, 3.5549>> fTempHeading = 128.3527 // South ENDIF IF IS_SPAWN_POSITION_SAFE_FOR_TAXI(vPlayerCoords, vTempCoords) vReturnSpawnCoords = vTempCoords fReturnSpawnHeading = fTempHeading CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : GET_TAXI_SPAWN_INFO_FOR_TAXI_SPECIAL_AREA() : TAXI_SPECIAL_AREA_FLOYD_APARTMENT : return TRUE Variation = ", i, " vReturnSpawnCoords = ", vReturnSpawnCoords, " fReturnSpawnHeading = ", fReturnSpawnHeading) RETURN TRUE ENDIF ENDREPEAT ENDIF RETURN FALSE ENDFUNC PROC PLAY_HAIL_ANIMS_AND_DIALOGUE() SEQUENCE_INDEX seq BOOL bFlag = IS_AMBIENT_SPEECH_DISABLED(PLAYER_PED_ID()) // flag down taxi - but it refuses to pick up player CLEAR_PED_TASKS(PLAYER_PED_ID()) IF NOT (g_playerIsDrunk) ANIM_DATA none ANIM_DATA animDataBlend INT iAnimFlags = 0 // B*1991223 - first person specific hail anim IF (GET_CAM_VIEW_MODE_FOR_CONTEXT(GET_CAM_ACTIVE_VIEW_MODE_CONTEXT()) = CAM_VIEW_MODE_FIRST_PERSON) animDataBlend.type = APT_SINGLE_ANIM animDataBlend.anim0 = "FP_HAIL_TAXI" animDataBlend.dictionary0 = "TAXI_HAIL" animDataBlend.phase0 = 0.0 animDataBlend.rate0 = 1.0 animDataBlend.filter = GET_HASH_KEY("UpperbodyAndIk_filter") iAnimFlags += ENUM_TO_INT(AF_UPPERBODY) iAnimFlags += ENUM_TO_INT(AF_SECONDARY) iAnimFlags += ENUM_TO_INT(AF_EXIT_AFTER_INTERRUPTED) animDataBlend.flags = INT_TO_ENUM(ANIMATION_FLAGS, iAnimFlags) animDataBlend.ikFlags = AIK_USE_FP_ARM_LEFT ELSE animDataBlend.type = APT_SINGLE_ANIM animDataBlend.anim0 = "HAIL_TAXI" animDataBlend.dictionary0 = "TAXI_HAIL" animDataBlend.phase0 = 0.0 animDataBlend.rate0 = 1.0 animDataBlend.filter = GET_HASH_KEY("BONEMASK_HEAD_NECK_AND_L_ARM") //iAnimFlags += ENUM_TO_INT(AF_UPPERBODY) // don't use this flag since it makes the spine wobble iAnimFlags += ENUM_TO_INT(AF_SECONDARY) iAnimFlags += ENUM_TO_INT(AF_EXIT_AFTER_INTERRUPTED) animDataBlend.flags = INT_TO_ENUM(ANIMATION_FLAGS, iAnimFlags) ENDIF WEAPON_TYPE equippedWeapon GET_CURRENT_PED_WEAPON(PLAYER_PED_ID(),equippedWeapon) IF IS_PED_ARMED(PLAYER_PED_ID(), WF_INCLUDE_MELEE|WF_INCLUDE_PROJECTILE|WF_INCLUDE_GUN) OR ((ARE_STRINGS_EQUAL(animDataBlend.anim0,"FP_HAIL_TAXI")) AND (equippedWeapon = WEAPONTYPE_PETROLCAN))//B*2132396 IF equippedWeapon != WEAPONTYPE_PETROLCAN OR NOT ARE_STRINGS_EQUAL(animDataBlend.anim0,"FP_HAIL_TAXI") SET_PED_CONFIG_FLAG(PLAYER_PED_ID(), PCF_KeepWeaponHolsteredUnlessFired, TRUE) ENDIF OPEN_SEQUENCE_TASK(seq) TASK_SWAP_WEAPON(NULL, FALSE) TASK_SCRIPTED_ANIMATION(NULL, animDataBlend, none, none, SLOW_BLEND_DURATION, SLOW_BLEND_DURATION) CLOSE_SEQUENCE_TASK(seq) TASK_PERFORM_SEQUENCE(PLAYER_PED_ID(), seq) CLEAR_SEQUENCE_TASK(seq) ELSE TASK_SCRIPTED_ANIMATION(PLAYER_PED_ID(), animDataBlend, none, none, SLOW_BLEND_DURATION, SLOW_BLEND_DURATION) ENDIF CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " PLAY_HAIL_ANIMS_AND_DIALOGUE - applied new scripted anim task * : ", animDataBlend.anim0) ELSE IF (bFlag) STOP_PED_SPEAKING(PLAYER_PED_ID(), FALSE) ENDIF PLAY_PED_AMBIENT_SPEECH(PLAYER_PED_ID(), "TAXI_HAIL_DRUNK", SPEECH_PARAMS_FORCE_NORMAL_CLEAR) IF (bFlag) STOP_PED_SPEAKING(PLAYER_PED_ID(), TRUE) ENDIF ENDIF ENDPROC FUNC BOOL IS_PLAYER_TO_RIGHT_OF_CAR(VEHICLE_INDEX inCar) VECTOR pos, pos2, pos3 VECTOR vec1, vec2 IF NOT IS_ENTITY_DEAD(inCar) pos = GET_ENTITY_COORDS(inCar) pos2 = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(inCar, <<1.0, 0.0, 0.0>>) IF IS_PLAYER_PLAYING(PLAYER_ID()) pos3 = GET_ENTITY_COORDS(PLAYER_PED_ID()) ENDIF vec1 = pos2 - pos vec2 = pos3 - pos IF (GET_ANGLE_BETWEEN_2D_VECTORS(vec1.x, vec1.y, vec2.x, vec2.y) < 90.0) RETURN(TRUE) ENDIF ENDIF RETURN(FALSE) ENDFUNC FUNC INT GET_NEAREST_PASSENGER_SIDE(VEHICLE_INDEX ThisCar) VECTOR char_pos VECTOR right_pos VECTOR left_pos VECTOR right_vec VECTOR left_vec CONST_INT LEFT_PASSENGER 1 CONST_INT RIGHT_PASSENGER 2 IF IS_VEHICLE_DRIVEABLE(ThisCar) // get player coords IF IS_PLAYER_PLAYING(PLAYER_ID()) char_pos = GET_ENTITY_COORDS(PLAYER_PED_ID()) ELSE RETURN(-1) ENDIF // right side right_pos = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(ThisCar, <<1.0, -0.5, 0.0>>) right_vec = right_pos - char_pos // left side left_pos = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(ThisCar, <<-1.0, -0.5, 0.0>>) left_vec = left_pos - char_pos // choose the smaller of the two IF VMAG(right_vec) < VMAG(left_vec) RETURN(RIGHT_PASSENGER) ELSE RETURN(LEFT_PASSENGER) ENDIF ELSE RETURN(-1) ENDIF ENDFUNC /// PURPOSE: /// gets which side vCoordsToCheck is to entityIndex /// Used to decide which side the player is to the taxi for entry seat selection /// NOTE: doesn't check entity is alive /// PARAMS: /// entityIndex - the entity to check against /// vEntityCoords - the entities coords /// vCoordsToCheck - the coords we want to check /// RETURNS: /// Int depicting the side of entityIndex the vCoordsToCheck is. 0 = Left side, 1 = Right side, -1 = directly in line FUNC INT TAXI_GET_SIDE_COORDS_IS_TO_ENTITY(ENTITY_INDEX entityIndex, VECTOR vEntityCoords, VECTOR vCoordsToCheck) FLOAT fSide VECTOR vPlaneNorm vPlaneNorm = NORMALISE_VECTOR(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(entityIndex, << 3.0, 0.0, 0.0 >>) - vEntityCoords) fSide = DOT_PRODUCT(vCoordsToCheck - vEntityCoords, vPlaneNorm) /*#IF IS_DEBUG_BUILD VECTOR vTemp vTemp = GET_ENTITY_FORWARD_VECTOR(entityIndex) * 60.0 DRAW_DEBUG_LINE(GET_ENTITY_COORDS(entityIndex) + vTemp, GET_ENTITY_COORDS(entityIndex) - vTemp, 255, 0, 0, 150) //CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : GET_SIDE_COORDS_IS_TO_ENTITY : vEntityCoords = ", vEntityCoords, " vCoordsToCheck = ", vCoordsToCheck, // " vPlaneNorm = ", vPlaneNorm, " dot returning : ", fSide) #ENDIF*/ IF (fSide < 0) RETURN 0 //left side ELIF (fSide > 0) RETURN 1 //right side ENDIF RETURN -1 // directly in line ENDFUNC /// PURPOSE: /// Extra checks need for title update (MP) - added as new func so no changes are made to ARE_COORDS_IN_SPECIAL_AREA /// since this is referenced in SP pushes the patch size up /// PARAMS: /// vInCoords - position to test /// ReturnCoord - returned drop off position /// ReturnHeading - returned heading /// iMpTaxi - taxi's index /// RETURNS: /// TRUE if position was in a special area FUNC BOOL ARE_COORDS_IN_SPECIAL_AREA_TITLE_UPDATE(VECTOR vInCoords, VECTOR &ReturnCoord, FLOAT &ReturnHeading, INT iMpTaxi = 1) //INT iVariation VECTOR vTempInCoords // Impound (see B*1603797) - note same area as Tow Truck Oddjob check in ARE_COORDS_IN_SPECIAL_AREA // however this area is better and the returnCoord isn't inside the compound vTempInCoords = vInCoords IF vInCoords.Z = 1.0 vTempInCoords.Z = 28.0 ENDIF IF IS_POINT_IN_ANGLED_AREA(vTempInCoords, <<400.987091,-1659.755981,26.916147>>, <<437.656616,-1617.478882,48.341854>>, 45.000000) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIAL_AREA_TITLE_UPDATE return TRUE : Impound") // near entrance IF iMpTaxi < 4 ReturnCoord = <<413.7399, -1608.9109, 28.1610>> ReturnHeading = 238.2568 ELSE // around corner near exit ReturnCoord = <<416.8107, -1666.5142, 28.1758>> ReturnHeading = 144.8478 ENDIF RETURN TRUE ENDIF //Pilot School IF IS_POINT_IN_ANGLED_AREA(vTempInCoords, <<-1112.586182,-2674.766846,12.568037>>, <<-1215.468140,-2854.588623,19.445877>>, 41.2500) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIAL_AREA_TITLE_UPDATE return TRUE : Pilot School") IF iMpTaxi < 4 ReturnCoord = <<-1094.4923, -2662.2698, 12.6066>> ReturnHeading = 196.0365 ELSE ReturnCoord = <<-1076.7362, -2684.0393, 12.8070>> ReturnHeading = 211.7278 ENDIF RETURN TRUE ENDIF RETURN FALSE ENDFUNC FUNC BOOL ARE_COORDS_IN_SPECIAL_AREA(VECTOR vInCoords, VECTOR &ReturnCoord, FLOAT &ReturnHeading, INT iMpTaxi = 1) INT iVariation VECTOR vTempInCoords // these cover the custom waypoint 1.0 z value issue so don't need vTempInCoords settings // B*1948116 - Over the ocean where the yankton map nodes would be IF ARE_COORDS_IN_3D_AREA(vInCoords, <<1900.0, -6600.0, 100>>, <<6900, -3600, 140>>) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIAL_AREA return TRUE : Yankton Map") ReturnCoord = << 1261.5804, -3332.6846, 5.4191 >> ReturnHeading = 163.87 RETURN(TRUE) // B*1948116 - Over the ocean the north west corner ELIF ARE_COORDS_IN_3D_AREA(vInCoords, <<-3800.0, 5400, -100>>, <<-1900, 8500, 100>>) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIAL_AREA return TRUE : North West Pacific") ReturnCoord = << -1577.1599, 5166.5103, 19.1864 >> ReturnHeading = 0.0 RETURN(TRUE) // these cover the custom waypoint 1.0 z value issue so don't need vTempInCoords settings // Michael's house ELIF ARE_COORDS_IN_3D_AREA(vInCoords, <<-874.9833, 125.7645,-100>>, <<-768.625366,193.029709,100>>) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIAL_AREA return TRUE : Michael's house") ReturnCoord = << -856.6151, 163.7361, 65.0930 >> ReturnHeading = 355.3355 RETURN(TRUE) // Franklin's house ELIF ARE_COORDS_IN_3D_AREA(vInCoords, << -39.2005, -1473.5498,-100>>, << 10.6133, -1430.0988,100>>) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIAL_AREA return TRUE : Franklin's house") ReturnCoord = << -15.5181, -1456.3999, 29.4244 >> ReturnHeading = 94.6893 RETURN(TRUE) // Trevor's trailer ELIF ARE_COORDS_IN_3D_AREA(vInCoords, <<1964.742065,3792.590088,-100>>, <<1992.636108,3840.253174,100>>) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIAL_AREA return TRUE : Trevor's trailer") ReturnCoord = <<1996.3718, 3818.8308, 31.1612>> ReturnHeading = 170.0221 RETURN(TRUE) // Armenian Garage ELIF IS_POINT_IN_ANGLED_AREA(vInCoords, <<-68.218704,-1086.951050,-100>>, <<-10.545177,-1106.895264,100>>, 43.500000) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIAL_AREA return TRUE : Armenian Garage") ReturnCoord = << -63.5854, -1074.7321, 26.0995 >> ReturnHeading = 324.1257 RETURN(TRUE) // Tow Truck Oddjob ELIF IS_POINT_IN_ANGLED_AREA(vInCoords, <<398.789856,-1651.417358,-100>>, <<423.837250,-1619.432495,100>>, 45.000000) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIAL_AREA return TRUE : Tow Truck Oddjob") ReturnCoord = << 416.8710, -1613.0814, 28.1401 >> ReturnHeading = 227.9333 RETURN(TRUE) // Multistorey at airport 1 ELIF IS_POINT_IN_ANGLED_AREA(vInCoords, <<-988.853516,-2553.177490,-100>>, <<-1041.486450,-2644.969971,100>>, 49.750000) AND NOT NETWORK_IS_GAME_IN_PROGRESS() //Done Further Down for MP #IF IS_DEBUG_BUILD PRINTSTRING("\n<") PRINTSTRING(GET_THIS_SCRIPT_NAME()) PRINTSTRING("> - ARE_COORDS_IN_SPECIAL_AREA = TRUE - Multistorey at airport 1 \n") #endif ReturnCoord = << -1039.5425, -2574.4670, 12.7566 >> ReturnHeading = 162.2744 RETURN(TRUE) // Multistorey at airport 2 ELIF IS_POINT_IN_ANGLED_AREA(vInCoords, <<-906.902039,-2600.460693,-100>>, <<-959.765137,-2692.057129,100>>, 49.750000) AND NOT NETWORK_IS_GAME_IN_PROGRESS() //Done Further Down for MP #IF IS_DEBUG_BUILD PRINTSTRING("\n<") PRINTSTRING(GET_THIS_SCRIPT_NAME()) PRINTSTRING("> - ARE_COORDS_IN_SPECIAL_AREA = TRUE - Multistorey at airport 2 \n") #endif ReturnCoord = << -911.1597, -2676.1316, 12.7567 >> ReturnHeading = 338.9414 RETURN(TRUE) ENDIF // Family 4 vTempInCoords = vInCoords IF vInCoords.Z = 1.0 // because custom waypoints placed on the map don't take Z value into account // having to test the position with a z closer to the ground level at the location vTempInCoords.Z = 28.0 ENDIF IF IS_POINT_IN_ANGLED_AREA(vTempInCoords, <<-209.337189,-2011.099487,26.620369>>, <<-257.222473,-2076.963135,36.620373>>, 30.000000) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIAL_AREA return TRUE : Stadium") ReturnCoord = <<-211.8546, -2030.7715, 26.6204>> ReturnHeading = 154.4302 RETURN(TRUE) ENDIF // B*1392187 - mountainous area leading to base jump in Raton Canyon - keep in sync with IS_POSITION_IN_TAXI_RESTRICTED_AREA check and used for closest minigame STATIC_BLIP_AMBIENT_BASEJUMP_ROCK_CLIFF vTempInCoords = vInCoords IF vInCoords.Z = 1.0 // because custom waypoints placed on the map don't take Z value into account // having to test the position with a z closer to the ground level at the location vTempInCoords.Z = 159.0 // note higher position than drop off coords ENDIF IF IS_POINT_IN_ANGLED_AREA(vTempInCoords, <<-804.050049,4216.411621,204.487198>>, <<-509.067871,4135.190430,123.250168>>, 250.000000) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIAL_AREA return TRUE : mountainous area Raton Canyon base jump vTempInCoords : ", vTempInCoords) ReturnCoord = <<-623.3622, 3996.0000, 120.7669>> ReturnHeading = 37.8784 RETURN TRUE ENDIF // Kortz Museum vTempInCoords = vInCoords IF vInCoords.Z = 1.0 // because custom waypoints placed on the map don't take Z value into account // having to test the position with a z closer to the ground level at the location vTempInCoords.Z = 180.0 ENDIF IF IS_POINT_IN_ANGLED_AREA(vTempInCoords, <<-2203.167480,183.354950,167.402191>>, <<-2311.587402,434.382813,195.466919>>, 138.500000) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIAL_AREA return TRUE : Kortz Museum") ReturnCoord = <<-2294.9446, 376.2506, 173.4669>> ReturnHeading = 296.6963 RETURN(TRUE) ENDIF // Pacific bluffs, covering beach nodes and cycle path, length of the row of houses. Also covers Shrink's Office vTempInCoords = vInCoords IF vInCoords.Z = 1.0 // because custom waypoints placed on the map don't take Z value into account // having to test the position with a z closer to the ground level at the location vTempInCoords.Z = 10.0 ENDIF IF IS_POINT_IN_ANGLED_AREA(vTempInCoords, <<-2041.478027,-553.215942,-0.089962>>, <<-1787.080078,-768.088562,37.999176>>, 220.000000) // Shrink's Office (initial values set ReturnCoord = <<-1897.0765, -557.3334, 10.7279>> ReturnHeading = 228.7709 IF IS_POINT_IN_ANGLED_AREA(vTempInCoords, <<-1882.883179,-541.744202,4.675224>>, <<-1929.626465,-598.602600,40.429798>>, 35.000000) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIAL_AREA return TRUE : Shrink's Office") // values arlready set above RETURN(TRUE) // Pacific bluffs, covering beach ELSE // get closest safe dropoff point - all on the highway in front of the houses from North to South VECTOR vDropOff[6] vDropOff[0] = <<-1962.4679, -503.4229, 10.8349>> vDropOff[1] = <<-1924.4722, -534.7357, 10.8181>> vDropOff[2] = <<-1896.3240, -557.7680, 10.7256>> vDropOff[3] = <<-1850.6611, -595.8367, 10.4649>> vDropOff[4] = <<-1808.9995, -632.1207, 10.0016>> vDropOff[5] = <<-1745.0428, -694.4053, 9.1245>> INT iClosest = -1 FLOAT fClosestDist = 99999.0 FLOAT fDist INT i FOR i = 0 TO 5 fDist = VDIST(vDropOff[i], vTempInCoords) IF (fDist < fClosestDist) fClosestDist = fDist iClosest = i ENDIF ENDFOR // set the position ReturnCoord = vDropOff[iClosest] // set the heading IF iClosest = 0 ReturnHeading = 234.3999 ELIF iClosest = 1 ReturnHeading = 232.2255 ELIF iClosest = 2 ReturnHeading = 228.2855 ELIF iClosest = 3 ReturnHeading = 231.4914 ELIF iClosest = 4 ReturnHeading = 230.6703 ELIF iClosest = 5 ReturnHeading = 228.7709 ENDIF CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIAL_AREA return TRUE : Pacific bluffs beach side iClosest = ", iClosest) RETURN(TRUE) ENDIF ENDIF // Observatory vTempInCoords = vInCoords IF vInCoords.Z = 1.0 // because custom waypoints placed on the map don't take Z value into account // having to test the position with a z closer to the ground level at the location vTempInCoords.Z = 330.0 ENDIF IF IS_POINT_IN_ANGLED_AREA(vTempInCoords, <<-446.119995,1057.451538,318.616852>>, <<-405.833618,1194.486450,337.096558>>, 106.250000) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIAL_AREA return TRUE : Observatory") ReturnCoord = <<-411.3629, 1174.5865, 324.6421>> ReturnHeading = 255.2881 RETURN(TRUE) ENDIF // Golf Club vTempInCoords = vInCoords IF vInCoords.Z = 1.0 // because custom waypoints placed on the map don't take Z value into account // having to test the position with a z closer to the ground level at the location vTempInCoords.Z = 20.0 ENDIF IF IS_POINT_IN_ANGLED_AREA(vTempInCoords, <<-1362.090576,-29.267771,-100>>, <<-1377.953125,152.238876,100>>, 50.0) iVariation = iMpTaxi%8 CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIAL_AREA return TRUE : Golf Club : iVariation = ", iVariation) SWITCH iVariation CASE 1 ReturnCoord = <<-1380.1006, 95.1566, 53.5054>> ReturnHeading = 4.5550 BREAK CASE 2 ReturnCoord = <<-1379.1394, 84.2472, 53.0592>> ReturnHeading = 6.9278 BREAK CASE 3 ReturnCoord = <<-1378.4266, 74.5077, 52.6622>> ReturnHeading = 2.6813 BREAK CASE 4 ReturnCoord = <<-1384.1774, 73.9207, 52.7438>> ReturnHeading = 5.5420 BREAK CASE 5 ReturnCoord = <<-1381.1179, 35.7838, 52.6590>> ReturnHeading = 7.6687 BREAK CASE 6 ReturnCoord = <<-1383.7413, 64.1491, 52.6647>> ReturnHeading = 2.5572 BREAK CASE 7 ReturnCoord = <<-1382.6162, 49.6876, 52.6585>> ReturnHeading = 3.0185 BREAK DEFAULT ReturnCoord = <<-1383.2987, 54.4598, 52.6562>> ReturnHeading = 6.2155 BREAK ENDSWITCH RETURN(TRUE) // Main Gun Shop - Ammunation ELIF NETWORK_IS_GAME_IN_PROGRESS() IF IS_POINT_IN_ANGLED_AREA(vInCoords, <<48.310059,-1120.669434,28.030502>>, <<-12.123452,-1112.084106,36.085670>>, 60.0) #IF IS_DEBUG_BUILD PRINTSTRING("\n<") PRINTSTRING(GET_THIS_SCRIPT_NAME()) PRINTSTRING("> - ARE_COORDS_IN_SPECIAL_AREA = TRUE - Main Gun Shop \n") #endif iVariation = iMpTaxi%8 #IF IS_DEBUG_BUILD PRINTSTRING("\n<") PRINTSTRING(GET_THIS_SCRIPT_NAME()) PRINTLN("> - ARE_COORDS_IN_SPECIAL_AREA - iVariation = ", iVariation) PRINTNL() #endif SWITCH iVariation CASE 1 ReturnCoord = <<50.9889, -1092.5254, 28.2152>> ReturnHeading = 150.8833 BREAK CASE 2 ReturnCoord = <<46.7725, -1099.7506, 28.1639>> ReturnHeading = 149.4322 BREAK CASE 3 ReturnCoord = <<41.6146, -1107.7419, 28.1318>> ReturnHeading = 154.1378 BREAK CASE 4 ReturnCoord = <<38.1922, -1113.3936, 28.1507>> ReturnHeading = 146.3778 BREAK CASE 5 ReturnCoord = <<13.0436, -1124.7668, 27.7359>> ReturnHeading = 91.1630 BREAK CASE 6 ReturnCoord = <<1.4336, -1125.0425, 27.1705>> ReturnHeading = 91.0578 BREAK CASE 7 ReturnCoord = <<-11.1811, -1125.8105, 26.3688>> ReturnHeading = 91.8660 BREAK DEFAULT ReturnCoord = <<21.9431, -1124.5731, 27.9417>> ReturnHeading = 91.6961 BREAK ENDSWITCH RETURN(TRUE) // Airport - Upper Taxi Rank FIRST ELIF IS_POINT_IN_ANGLED_AREA(vInCoords, <<-1061.018066,-2540.235107,18.669323>>, <<-1023.332458,-2562.114502,31.576157>>, 250.0) #IF IS_DEBUG_BUILD PRINTSTRING("\n<") PRINTSTRING(GET_THIS_SCRIPT_NAME()) PRINTSTRING("> - ARE_COORDS_IN_SPECIAL_AREA = TRUE - Airport - Upper Taxi Rank FIRST \n") #endif iVariation = iMpTaxi%8 #IF IS_DEBUG_BUILD PRINTSTRING("\n<") PRINTSTRING(GET_THIS_SCRIPT_NAME()) PRINTLN("> - ARE_COORDS_IN_SPECIAL_AREA - iVariation = ", iVariation) PRINTNL() #endif SWITCH iVariation CASE 1 ReturnCoord = <<-1023.9825, -2489.8818, 19.0755>> ReturnHeading = 148.7004 BREAK CASE 2 ReturnCoord = <<-1029.9678, -2500.4377, 19.0803>> ReturnHeading = 148.7144 BREAK CASE 3 ReturnCoord = <<-1070.5457, -2570.8594, 19.0836>> ReturnHeading = 150.0955 BREAK CASE 4 ReturnCoord = <<-1056.0647, -2545.6619, 19.0809>> ReturnHeading = 149.5649 BREAK CASE 5 ReturnCoord = <<-1050.5780, -2536.2185, 19.0824>> ReturnHeading = 150.7363 BREAK CASE 6 ReturnCoord = <<-1036.0316, -2510.9021, 19.0794>> ReturnHeading = 147.2113 BREAK CASE 7 ReturnCoord = <<-1044.4872, -2525.5342, 19.0790>> ReturnHeading = 150.7597 BREAK DEFAULT ReturnCoord = <<-1064.5002, -2560.6528, 19.0905>> ReturnHeading = 150.7081 BREAK ENDSWITCH RETURN(TRUE) // Airport - Lower Taxi Rank FIRST ELIF IS_POINT_IN_ANGLED_AREA(vInCoords, <<-1061.058716,-2540.253662,10.944668>>, <<-1023.296814,-2562.052490,18.516848>>, 250.0) #IF IS_DEBUG_BUILD PRINTSTRING("\n<") PRINTSTRING(GET_THIS_SCRIPT_NAME()) PRINTSTRING("> - ARE_COORDS_IN_SPECIAL_AREA = TRUE - Airport - Lower Taxi Rank FIRST \n") #endif iVariation = iMpTaxi%8 #IF IS_DEBUG_BUILD PRINTSTRING("\n<") PRINTSTRING(GET_THIS_SCRIPT_NAME()) PRINTLN("> - ARE_COORDS_IN_SPECIAL_AREA - iVariation = ", iVariation) PRINTNL() #endif SWITCH iVariation CASE 1 ReturnCoord = <<-1044.7413, -2528.7859, 12.7568>> ReturnHeading = 150.9439 BREAK CASE 2 ReturnCoord = <<-1050.7631, -2539.4978, 12.7566>> ReturnHeading = 150.8510 BREAK CASE 3 ReturnCoord = <<-1054.9523, -2546.8596, 12.7566>> ReturnHeading = 149.9285 BREAK CASE 4 ReturnCoord = <<-1060.3972, -2556.8979, 12.6066>> ReturnHeading = 150.8244 BREAK CASE 5 ReturnCoord = <<-1020.7437, -2490.0842, 12.6396>> ReturnHeading = 148.6134 BREAK CASE 6 ReturnCoord = <<-1076.9043, -2589.1794, 12.6858>> ReturnHeading = 149.0112 BREAK CASE 7 ReturnCoord = <<-1026.3866, -2501.9521, 12.6923>> ReturnHeading = 149.7553 BREAK DEFAULT ReturnCoord = <<-1070.5065, -2578.3892, 12.6932>> ReturnHeading = 148.5232 BREAK ENDSWITCH RETURN(TRUE) // Airport - Upper Taxi Rank SECOND ELIF IS_POINT_IN_ANGLED_AREA(vInCoords, <<-1043.364136,-2747.290039,16.960567>>, <<-991.536804,-2657.681641,69.123489>>, 200.0) #IF IS_DEBUG_BUILD PRINTSTRING("\n<") PRINTSTRING(GET_THIS_SCRIPT_NAME()) PRINTSTRING("> - ARE_COORDS_IN_SPECIAL_AREA = TRUE - Airport - Upper Taxi Rank SECOND\n") #endif iVariation = iMpTaxi%8 #IF IS_DEBUG_BUILD PRINTSTRING("\n<") PRINTSTRING(GET_THIS_SCRIPT_NAME()) PRINTLN("> - ARE_COORDS_IN_SPECIAL_AREA - iVariation = ", iVariation) PRINTNL() #endif SWITCH iVariation CASE 1 ReturnCoord = <<-1067.8463, -2708.9397, 19.0588>> ReturnHeading = 230.9025 BREAK CASE 2 ReturnCoord = <<-1058.2238, -2716.2166, 19.0600>> ReturnHeading = 237.1285 BREAK CASE 3 ReturnCoord = <<-1004.5667, -2744.7971, 19.0811>> ReturnHeading = 255.6885 BREAK CASE 4 ReturnCoord = <<-1049.5092, -2721.5801, 19.0546>> ReturnHeading = 242.3581 BREAK CASE 5 ReturnCoord = <<-1017.1544, -2740.1174, 19.0525>> ReturnHeading = 243.5798 BREAK CASE 6 ReturnCoord = <<-1042.0872, -2726.0767, 19.0452>> ReturnHeading = 240.2381 BREAK CASE 7 ReturnCoord = <<-1027.3530, -2734.4617, 19.0509>> ReturnHeading = 239.8703 BREAK DEFAULT ReturnCoord = <<-1033.7404, -2730.7458, 19.0521>> ReturnHeading = 239.9237 BREAK ENDSWITCH RETURN(TRUE) // Airport - Lower Taxi Rank SECOND ELIF IS_POINT_IN_ANGLED_AREA(vInCoords, <<-1047.646484,-2754.947021,2.941969>>, <<-991.731445,-2653.153320,16.892282>>, 200.0) #IF IS_DEBUG_BUILD PRINTSTRING("\n<") PRINTSTRING(GET_THIS_SCRIPT_NAME()) PRINTSTRING("> - ARE_COORDS_IN_SPECIAL_AREA = TRUE - Airport - Lower Taxi Rank SECOND\n") #endif iVariation = iMpTaxi%8 #IF IS_DEBUG_BUILD PRINTSTRING("\n<") PRINTSTRING(GET_THIS_SCRIPT_NAME()) PRINTLN("> - ARE_COORDS_IN_SPECIAL_AREA - iVariation = ", iVariation) PRINTNL() #endif SWITCH iVariation CASE 1 ReturnCoord = <<-971.9154, -2749.1221, 12.6069>> ReturnHeading = 265.8022 BREAK CASE 2 ReturnCoord = <<-980.6166, -2748.5349, 12.7570>> ReturnHeading = 263.5472 BREAK CASE 3 ReturnCoord = <<-987.6072, -2747.2734, 12.6069>> ReturnHeading = 257.2886 BREAK CASE 4 ReturnCoord = <<-1006.8151, -2739.3450, 12.6334>> ReturnHeading = 242.1315 BREAK CASE 5 ReturnCoord = <<-1051.8304, -2713.5527, 12.6333>> ReturnHeading = 239.9312 BREAK CASE 6 ReturnCoord = <<-1041.0035, -2719.6467, 12.6402>> ReturnHeading = 240.1081 BREAK CASE 7 ReturnCoord = <<-1023.8323, -2729.4646, 12.6445>> ReturnHeading = 239.6737 BREAK DEFAULT ReturnCoord = <<-1012.8478, -2735.1724, 12.6656>> ReturnHeading = 237.6545 BREAK ENDSWITCH RETURN(TRUE) ENDIF ENDIF // Gun Shop - East Los Santos vTempInCoords = vInCoords IF vInCoords.Z = 1.0 // because custom waypoints placed on the map don't take Z value into account // having to test the position with a z closer to the ground level at the location vTempInCoords.Z = 20.0 ENDIF IF IS_POINT_IN_ANGLED_AREA(vTempInCoords, <<845.721619,-990.747314,37.469604>>, <<846.339722,-1066.880493,16.966232>>, 90.0) //845.021484,-1045.892090,23.806255>>, <<845.281677,-990.733521,39.362217>>, 65.0) iVariation = iMpTaxi%8 CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIAL_AREA return TRUE : Gun Shop - East Los Santos : iVariation = ", iVariation) SWITCH iVariation CASE 1 ReturnCoord = <<868.1039, -995.9224, 29.7369>> ReturnHeading = 93.1320 BREAK CASE 2 ReturnCoord = <<859.2830, -996.4102, 28.7865>> ReturnHeading = 92.2581 BREAK CASE 3 ReturnCoord = <<849.4288, -997.1062, 27.5347>> ReturnHeading = 92.7140 BREAK CASE 4 ReturnCoord = <<841.1268, -997.4826, 26.5744>> ReturnHeading = 92.8628 BREAK CASE 5 ReturnCoord = <<831.2605, -1009.5560, 25.5990>> ReturnHeading = 268.6186 BREAK CASE 6 ReturnCoord = <<844.6506, -1010.0903, 26.9894>> ReturnHeading = 270.0760 BREAK CASE 7 ReturnCoord = <<852.2498, -1010.1324, 27.8091>> ReturnHeading = 269.7220 BREAK DEFAULT ReturnCoord = <<861.4028, -1010.0249, 28.8080>> ReturnHeading = 270.7686 BREAK ENDSWITCH RETURN(TRUE) ENDIF // Mod Shop - East Los Santos vTempInCoords = vInCoords IF vInCoords.Z = 1.0 // because custom waypoints placed on the map don't take Z value into account // having to test the position with a z closer to the ground level at the location vTempInCoords.Z = 20.0 ENDIF IF IS_POINT_IN_ANGLED_AREA(vTempInCoords, <<767.373596,-1077.428833,-10.786545>>, <<682.828369,-1080.685791,79.673035>>, 60.0) #IF IS_DEBUG_BUILD PRINTSTRING("\n<") PRINTSTRING(GET_THIS_SCRIPT_NAME()) PRINTSTRING("> - ARE_COORDS_IN_SPECIAL_AREA = TRUE - Mod Shop - East Los Santos\n") #endif iVariation = iMpTaxi%8 #IF IS_DEBUG_BUILD PRINTSTRING("\n<") PRINTSTRING(GET_THIS_SCRIPT_NAME()) PRINTLN("> - ARE_COORDS_IN_SPECIAL_AREA - iVariation = ", iVariation) PRINTNL() #endif SWITCH iVariation CASE 1 ReturnCoord = <<703.2726, -1067.6997, 21.4765>> ReturnHeading = 181.3629 BREAK CASE 2 ReturnCoord = <<715.2089, -1070.3993, 21.2708>> ReturnHeading = 175.43624 BREAK CASE 3 ReturnCoord = <<715.2911, -1059.4200, 21.0876>> ReturnHeading = 181.0347 BREAK CASE 4 ReturnCoord = <<709.6841, -1086.7800, 21.4190>> ReturnHeading = 233.1690 BREAK CASE 5 ReturnCoord = <<703.8070, -1057.8665, 21.4152>> ReturnHeading = 170.1609 BREAK CASE 6 ReturnCoord = <<708.1994, -1048.1937, 21.2160>> ReturnHeading = 134.2729 BREAK CASE 7 ReturnCoord = <<711.1124, -1069.4229, 21.3129>> ReturnHeading = 177.9198 BREAK DEFAULT ReturnCoord = <<703.5450, -1078.7177, 21.3987>> ReturnHeading = 180.5686 BREAK ENDSWITCH RETURN(TRUE) ENDIF // Military Base - don't do the more expensive check if vInCoords is no where near the area vTempInCoords = vInCoords IF vInCoords.Z = 1.0 // because custom waypoints placed on the map don't take Z value into account // having to test the position with a z closer to the ground level at Lester's house vTempInCoords.Z = 31.0 ENDIF IF IS_AREACHECK_IN_ACTIVE_RANGE(AC_MILITARY_BASE, vTempInCoords) IF IS_COORD_IN_SPECIFIED_AREA(vTempInCoords, AC_MILITARY_BASE) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIAL_AREA return TRUE : Military Base") ReturnCoord = <<-1520.1213, 2731.5110, 16.6437>> ReturnHeading = 48.1572 RETURN(TRUE) ENDIF ENDIF // Car Scrap Yard - property vTempInCoords = vInCoords IF vInCoords.Z = 1.0 // because custom waypoints placed on the map don't take Z value into account // having to test the position with a z closer to the ground level at the Car Scrap Yard vTempInCoords.Z = 77.2 ENDIF IF IS_POINT_IN_ANGLED_AREA(vTempInCoords, <<1535.986572,-2041.496948,68.212753>>, <<1529.356567,-2204.463379,96.111946>>, 105.000000) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIAL_AREA return TRUE : Car Scrap Yard - property ") ReturnCoord = << 1540.75, -2051.49, 76.85 >> ReturnHeading = 255.41 RETURN(TRUE) ENDIF // Lester's house vTempInCoords = vInCoords IF vInCoords.Z = 1.0 // because custom waypoints placed on the map don't take Z value into account // having to test the position with a z closer to the ground level at Lester's house vTempInCoords.Z = 51.1739 ENDIF // large area cover all his road (since nodes are turned off along the whole road) IF IS_POINT_IN_ANGLED_AREA(vTempInCoords, <<1185.810425,-1768.367188,28.311447>>, <<1369.067993,-1701.451538,66.253891>>, 70.000000, TRUE) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIAL_AREA return TRUE : Lester's house") // choose closest position: // outside Lester House - also used as default position IF IS_COORD_IN_RANGE_OF_COORD_2D(vTempInCoords, << 1283.32568, -1731.52222, 51.78555 >>, 17.0) ReturnCoord = << 1283.32568, -1731.52222, 51.78555 >> ReturnHeading = 275.4274 RETURN(TRUE) ENDIF // Heading East From Lesters House up the hill IF IS_COORD_IN_RANGE_OF_COORD_2D(vTempInCoords, << 1334.38611, -1709.76245, 55.70131 >>, 41.0) ReturnCoord = << 1334.38611, -1709.76245, 55.70131 >> ReturnHeading = 275.4411 RETURN(TRUE) ENDIF // Heading West From Lesters House down the hill IF IS_COORD_IN_RANGE_OF_COORD_2D(vTempInCoords, << 1246.16614, -1750.62463, 45.35691 >>, 28.0) ReturnCoord = << 1246.16614, -1750.62463, 45.35691 >> ReturnHeading = 301.2981 RETURN(TRUE) ENDIF // West From Lesters House bottom of the hill round the bend to the main road IF IS_COORD_IN_RANGE_OF_COORD_2D(vTempInCoords, << 1196.27161, -1753.05054, 37.63976 >>, 32.0) ReturnCoord = << 1196.27161, -1753.05054, 37.63976 >> ReturnHeading = 209.4354 RETURN(TRUE) ENDIF // default position outside Lester's house ReturnCoord = << 1283.32568, -1731.52222, 51.78555 >> ReturnHeading = 275.4274 RETURN(TRUE) ENDIF //Del Perro Pier vTempInCoords = vInCoords IF vInCoords.Z = 1.0 // because custom waypoints placed on the map don't take Z value into account // having to test the position with a z closer to the ground level at Lester's house vTempInCoords.Z = 25 ENDIF IF IS_COORD_IN_RANGE_OF_COORD_2D(vTempInCoords, << -1693.30176, -1109.13049, 17.89778 >>, 240.0) // main area of the pier IF IS_POINT_IN_ANGLED_AREA(vTempInCoords, <<-1538.980591,-941.132324,10.566226>>, <<-1715.570313,-1139.765869,52.203613>>, 110.000000) // walk way leading to end of the pier OR IS_POINT_IN_ANGLED_AREA(vTempInCoords, <<-1739.989014,-1115.973022,10.087262>>, <<-1800.514893,-1187.179810,52.017200>>, 25.000000) // end of the pier OR IS_POINT_IN_ANGLED_AREA(vTempInCoords, <<-1801.766357,-1180.251709,4.017236>>, <<-1857.717651,-1244.628418,38.496529>>, 85.000000) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIAL_AREA return TRUE : Del Perro Pier") ReturnCoord = <<-1624.4452, -976.9755, 12.0175>> ReturnHeading = 141.1670 RETURN (TRUE) ENDIF ENDIF // Armenian 2 - dead end alleyway, also covers the dead end road which the alley way is on vTempInCoords = vInCoords IF vInCoords.Z = 1.0 // because custom waypoints placed on the map don't take Z value into account // having to test the position with a z closer to the ground level at the Car Scrap Yard vTempInCoords.Z = 10 ENDIF IF IS_POINT_IN_ANGLED_AREA(vTempInCoords, <<-1140.889648,-1573.134888,-6.566939>>, <<-1067.084351,-1675.975586,23.531528>>, 52.000000) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIAL_AREA return TRUE : Armenian 2 - dead end alleyway") ReturnCoord = << -1095.63, -1577.24, 3.82 >> ReturnHeading = 216.12 RETURN (TRUE) ENDIF // Martin 1 - Martin's ranch (also could be used off mission) vTempInCoords = vInCoords IF vInCoords.Z = 1.0 // because custom waypoints placed on the map don't take Z value into account // having to test the position with a z closer to the ground level at the Car Scrap Yard vTempInCoords.Z = 114.0 ENDIF IF IS_POINT_IN_ANGLED_AREA(vTempInCoords, <<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_SPECIAL_AREA return TRUE : Martin's ranch") iVariation = 3 SWITCH GET_RANDOM_INT_IN_RANGE(0, iVariation) CASE 0 ReturnCoord = <<1369.2460, 1147.6527, 112.7592>> ReturnHeading = 182.0998 BREAK // front of the steps of the house CASE 1 ReturnCoord = <<1360.8483, 1139.1210, 112.7592>> ReturnHeading = 83.3356 BREAK // front of house offset to North CASE 2 ReturnCoord = <<1364.7513, 1154.3668, 112.7592>> ReturnHeading = 223.2795 BREAK // front of house offset to South ENDSWITCH RETURN (TRUE) ENDIF // Trevor's hangar vTempInCoords = vInCoords IF vInCoords.Z = 1.0 // because custom waypoints placed on the map don't take Z value into account // having to test the position with a z closer to the ground level at the Car Scrap Yard vTempInCoords.Z = 40.0 ENDIF IF IS_POINT_IN_ANGLED_AREA(vTempInCoords, <<1737.390137,3287.795410,35.138969>>, <<1724.345215,3337.854004,57.200382>>, 40.000000) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIAL_AREA return TRUE : Trevor's hangar") ReturnCoord = <<1782.1903, 3300.0759, 40.4593>> // towards the road since majority are tagged as offroad which taxi can't use ReturnHeading = 142.4260 RETURN (TRUE) ENDIF // Franklin/Michael's helipad area - La Puerta / Shank St vTempInCoords = vInCoords IF vInCoords.Z = 1.0 // because custom waypoints placed on the map don't take Z value into account // having to test the position with a z closer to the ground level at the Car Scrap Yard vTempInCoords.Z = 7.0 ENDIF IF IS_POINT_IN_ANGLED_AREA(vTempInCoords, <<-695.798096,-1379.678467,24.481243>>, <<-777.373108,-1491.130005,-3.594945>>, 72.000000) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIAL_AREA return TRUE : Franklin/Michael's helipad area - La Puerta / Shank St check") ReturnCoord = <<-658.2056, -1388.7886, 9.4990>> // on the main road to avoid the road blocks ReturnHeading = 174.6945 RETURN (TRUE) ENDIF // RC - Extreme 3 - top of Maze tower - B*1408629 vTempInCoords = vInCoords IF vInCoords.Z = 1.0 // because custom waypoints placed on the map don't take Z value into account // having to test the position with a z closer to the ground level at the Car Scrap Yard vTempInCoords.Z = 325.0 ENDIF IF VDIST2(vTempInCoords, << -75.59782, -818.60815, 325.17450 >>) < (58.0 * 58.0) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIAL_AREA return TRUE : top of Maze tower") ReturnCoord = <<-142.3670, -895.0251, 28.1910>> // entrance to the tower ReturnHeading = 71.6555 RETURN (TRUE) ENDIF // B*1497949 - Film Studio - drop outside if it isn't open to the player IF NOT TAXI_IS_STUDIO_OPEN_FOR_CURRENT_PLAYER() vTempInCoords = vInCoords IF vInCoords.Z = 1.0 // because custom waypoints placed on the map don't take Z value into account // having to test the position with a z closer to the ground level at the Car Scrap Yard vTempInCoords.Z = 36.1141 ENDIF IF IS_AREACHECK_IN_ACTIVE_RANGE(AC_MOVIE_STUDIO, vTempInCoords) IF IS_COORD_IN_SPECIFIED_AREA(vTempInCoords, AC_MOVIE_STUDIO) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIAL_AREA return TRUE : AC_MOVIE_STUDIO check") ReturnCoord = <<-1012.3105, -465.1634, 36.1141>> ReturnHeading = 112.1485 RETURN TRUE ENDIF ENDIF ENDIF // B*1497949 - Airport runway / restricted area vTempInCoords = vInCoords IF vInCoords.Z = 1.0 // because custom waypoints placed on the map don't take Z value into account // having to test the position with a z closer to the ground level at the Car Scrap Yard vTempInCoords.Z = 12.7091 ENDIF IF IS_AREACHECK_IN_ACTIVE_RANGE(AC_AIRPORT_AIRSIDE, vTempInCoords) IF IS_COORD_IN_SPECIFIED_AREA(vTempInCoords, AC_AIRPORT_AIRSIDE) iVariation = 4 IF NOT NETWORK_IS_GAME_IN_PROGRESS() SWITCH GET_RANDOM_INT_IN_RANGE(0, iVariation) CASE 0 ReturnCoord = <<-979.9500, -2746.1086, 12.7091>> ReturnHeading = 91.4929 BREAK // along the drop off slip road South/east CASE 1 ReturnCoord = <<-1025.1935, -2728.2175, 12.6647>> ReturnHeading = 239.0041 BREAK // East taxi bay outside main terminal CASE 2 ReturnCoord = <<-1051.3149, -2713.0686, 12.6676>> ReturnHeading = 236.4666 BREAK // West taxi bay outside main terminal CASE 3 ReturnCoord = <<-1095.7417, -2637.8713, 12.6461>> ReturnHeading = 188.9897 BREAK // along the drop off slip road North/west ENDSWITCH ELSE iVariation = iMpTaxi%8 SWITCH iVariation CASE 1 ReturnCoord = <<-1023.9825, -2489.8818, 19.0755>> ReturnHeading = 148.7004 BREAK CASE 2 ReturnCoord = <<-1029.9678, -2500.4377, 19.0803>> ReturnHeading = 148.7144 BREAK CASE 3 ReturnCoord = <<-1070.5457, -2570.8594, 19.0836>> ReturnHeading = 150.0955 BREAK CASE 4 ReturnCoord = <<-1056.0647, -2545.6619, 19.0809>> ReturnHeading = 149.5649 BREAK CASE 5 ReturnCoord = <<-1050.5780, -2536.2185, 19.0824>> ReturnHeading = 150.7363 BREAK CASE 6 ReturnCoord = <<-1036.0316, -2510.9021, 19.0794>> ReturnHeading = 147.2113 BREAK CASE 7 ReturnCoord = <<-1044.4872, -2525.5342, 19.0790>> ReturnHeading = 150.7597 BREAK DEFAULT ReturnCoord = <<-1064.5002, -2560.6528, 19.0905>> ReturnHeading = 150.7081 BREAK ENDSWITCH ENDIF CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIAL_AREA return TRUE : AC_AIRPORT_AIRSIDE check. Use Coords ", ReturnCoord) RETURN TRUE ENDIF ENDIF VECTOR vMtChiliadWestDropPos = <<-509.5746, 4938.9185, 146.3271>> FLOAT fMtChiliadWestDropHead = 232.0109 FLOAT fDistToMtChiliadWestDropPos = FLAT_VDIST2(vInCoords, vMtChiliadWestDropPos) VECTOR vMtChiliadEastDropPos = <<2450.6035, 5129.2236, 45.9722>> FLOAT fMtChiliadEastDropHead = 241.1957 FLOAT fDistToMtChiliadEastDropPos = FLAT_VDIST2(vInCoords, vMtChiliadEastDropPos) // B*1533798 - West side Mount Chiliad - keep in sync with IS_POSITION_IN_TAXI_RESTRICTED_AREA check vTempInCoords = vInCoords BOOL bInMountainRange = FALSE IF vInCoords.Z = 1.0 // because custom waypoints placed on the map don't take Z value into account // having to test the position with a z closer to the ground level at the Car Scrap Yard vTempInCoords.Z = 400.0 ENDIF IF IS_POINT_IN_ANGLED_AREA(vTempInCoords, <<-148.877655,4862.203613,305.644196>>, <<454.627441,5573.104004,804.096985>>, 250.000000) // majority West from top of cable cart building down bInMountainRange = TRUE ENDIF IF vInCoords.Z = 1.0 vTempInCoords.Z = 200.0 ENDIF IF IS_POINT_IN_ANGLED_AREA(vTempInCoords, <<-482.893066,4990.255371,155.160110>>, <<7.830751,5009.370605,430.760376>>, 250.000000) // minor West following down from previous check to lower ground bInMountainRange = TRUE ENDIF IF bInMountainRange CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIAL_AREA return TRUE : Mount Chiliad West") ReturnCoord = vMtChiliadWestDropPos ReturnHeading = fMtChiliadWestDropHead // if we are closer to the east side use the east side IF (fDistToMtChiliadEastDropPos < fDistToMtChiliadWestDropPos) ReturnCoord = vMtChiliadEastDropPos ReturnHeading = fMtChiliadEastDropHead CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIAL_AREA return TRUE : We are closer to the East Side of the mountain - Override with Mount Chiliad East") ENDIF RETURN TRUE ENDIF // B*1533798 - East side Mount Chiliad - keep in sync with IS_POSITION_IN_TAXI_RESTRICTED_AREA check bInMountainRange = FALSE // reset IF vInCoords.Z = 1.0 vTempInCoords.Z = 700.0 ENDIF IF IS_POINT_IN_ANGLED_AREA(vTempInCoords, <<441.399902,5579.990234,802.513794>>, <<965.777588,5675.920898,601.264648>>, 250.000000) // East from top of cable cart building down bInMountainRange = TRUE ENDIF IF vInCoords.Z = 1.0 vTempInCoords.Z = 300.0 ENDIF IF IS_POINT_IN_ANGLED_AREA(vTempInCoords, <<954.113892,5641.050781,646.505432>>, <<2140.375000,5377.753418,149.122086>>, 250.000000) // majority East following down from previous check to lower ground bInMountainRange = TRUE ENDIF IF vInCoords.Z = 1.0 vTempInCoords.Z = 100.0 ENDIF IF IS_POINT_IN_ANGLED_AREA(vTempInCoords, <<2117.347656,5377.259277,173.329727>>, <<2439.933838,5297.444824,62.686623>>, 100.000000) // minor East following down from previous check to lower ground bInMountainRange = TRUE ENDIF IF vInCoords.Z = 1.0 vTempInCoords.Z = 65.0 ENDIF IF IS_POINT_IN_ANGLED_AREA(vTempInCoords, <<2393.347412,5321.579590,107.062424>>, <<2523.945557,5124.745605,41.683842>>, 70.000000) // minor East following down from previous check to base bInMountainRange = TRUE ENDIF IF bInMountainRange CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIAL_AREA return TRUE : Mount Chiliad East") ReturnCoord = vMtChiliadEastDropPos ReturnHeading = fMtChiliadEastDropHead // if we are closer to the west side use the west side IF (fDistToMtChiliadWestDropPos < fDistToMtChiliadEastDropPos) ReturnCoord = vMtChiliadWestDropPos ReturnHeading = fMtChiliadWestDropHead CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIAL_AREA return TRUE : We are closer to the West Side of the mountain - Override with Mount Chiliad West") ENDIF RETURN TRUE ENDIF //B*1485093 - Port of LS heist Setup area - restricted by gates IF vInCoords.Z = 1.0 vTempInCoords.Z = 6.0 ENDIF IF TAXI_IS_COORD_IN_RANGE_OF_COORD(vTempInCoords, << -99.68751, -2448.89111, 5.01731 >>, 230.0) // ensure checks only happen if player is within range of the area IF IS_POINT_IN_ANGLED_AREA(vTempInCoords, <<85.054482,-2511.883789,-2.996267>>, <<-57.599766,-2412.716309,15.000947>>, 75.000000) // East section heading down the side of the gates OR IS_POINT_IN_ANGLED_AREA(vTempInCoords, <<7.516524,-2546.740967,1.331557>>, <<-177.326843,-2417.046631,19.160444>>, 80.000000) // Central area heading from South East gates into area OR IS_POINT_IN_ANGLED_AREA(vTempInCoords, <<-260.035370,-2419.978271,1.399635>>, <<-27.263750,-2423.848389,25.000641>>, 80.000000) // Waters edge OR IS_POINT_IN_ANGLED_AREA(vTempInCoords, <<-187.425598,-2516.085693,-6.849975>>, <<-186.751801,-2438.148682,25.001602>>, 40.00000) // South gates OR IS_POINT_IN_ANGLED_AREA(vTempInCoords, <<-73.608131,-2538.563721,-6.989857>>, <<-183.255585,-2465.145020,25.020298>>, 70.000000) // South area CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIAL_AREA return TRUE : Port of LS heist Setup area") iVariation = 2 IF GET_RANDOM_INT_IN_RANGE(0, iVariation) = 0 ReturnCoord = <<29.5582, -2553.5869, 5.0004>> // East entrance facing away ReturnHeading = 253.9545 ELSE ReturnCoord = <<-189.6824, -2531.6492, 5.0031>> // South entrance facing towards gate ReturnHeading = 0.0408 ENDIF RETURN TRUE ENDIF ENDIF // B*1558280 - Barn on farm North of Mount Chiliad include the nodes leading up to the barn IF vInCoords.Z = 1.0 vTempInCoords.Z = 28.4 ENDIF IF IS_POINT_IN_ANGLED_AREA(vTempInCoords, <<412.279022,6481.867676,25.808207>>, <<468.935303,6442.752441,45.607273>>, 24.000000) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIAL_AREA return TRUE : Barn on farm North of Mount Chiliad") ReturnCoord = <<445.2310, 6476.9482, 28.4862>> // on the dirt track along the side of the barn ReturnHeading = 219.4788 RETURN TRUE ENDIF // B*1574664 - Hayes Autos (both entrances gated) - covering front (North) entrance //NOTE: also a taxi no spawn area IF vInCoords.Z = 1.0 vTempInCoords.Z = 28.2065 ENDIF IF IS_POINT_IN_ANGLED_AREA(vTempInCoords, <<476.539398,-1301.547974,44.824577>>, <<499.582245,-1339.024536,26.317030>>, 35.000000) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIAL_AREA return TRUE : Hayes Autos front entrance") ReturnCoord = <<498.1850, -1288.5354, 28.1923>> // near the front gate to the North ReturnHeading = 181.3208 RETURN TRUE ENDIF // B*1574664 - Car Steal 1 garage / Hayes Autos (both entrances gated) - covering back (South) entrance IF vInCoords.Z = 1.0 vTempInCoords.Z = 28.2065 ENDIF IF IS_POINT_IN_ANGLED_AREA(vTempInCoords, <<496.981628,-1412.255127,43.293907>>, <<497.269012,-1339.363892,26.316479>>, 40.000000) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIAL_AREA return TRUE : Hayes Autos back entrance") ReturnCoord = <<504.1738, -1421.2511, 28.2065>> // near the back gate east ReturnHeading = 83.2905 RETURN TRUE ENDIF // Biker Bar near Race Course (needs to be checked before race course area) IF vInCoords.Z = 1.0 vTempInCoords.Z = 73.0 ENDIF IF IS_POINT_IN_ANGLED_AREA(vTempInCoords, <<951.170410,-147.004669,71.543259>>, <<1005.244934,-98.447449,95.626785>>, 70.000000) // Covers the compound the bike bar is inside CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIAL_AREA return TRUE : Biker Bar near race course") ReturnCoord = <<961.3104, -150.1964, 73.4016>> // outside compound on the main road ReturnHeading = 58.9938 RETURN TRUE ENDIF // Horse Race course IF vInCoords.Z = 1.0 vTempInCoords.Z = 52.0 ENDIF IF IS_POINT_IN_ANGLED_AREA(vTempInCoords, <<1137.022095,89.068535,74.890221>>, <<1267.820801,292.010620,102.990440>>, 195.000000) // North East end - from middle carpark CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIAL_AREA return TRUE : Horse Race course North") ReturnCoord = <<1118.7509, 262.0209, 79.8555>> // Horse race course (North East section) car park at side of the grand stand ReturnHeading = 52.3086 RETURN TRUE ELIF IS_POINT_IN_ANGLED_AREA(vTempInCoords, <<1137.022095,89.068535,71.890221>>, <<1010.045959,-91.566986,103.456757>>, 180.000000) // South West end - from middle carpark CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIAL_AREA return TRUE : Horse Race course North") ReturnCoord = <<1134.0535, 53.1835, 79.7553>> // Horse race course (South West section) car park in the middle of the course ReturnHeading = 145.5134 RETURN TRUE ENDIF // B*1576487 - underground carpark restricted in FIB2 above maze tower IF vInCoords.Z = 1.0 vTempInCoords.Z = 30.6 ENDIF IF IS_POINT_IN_ANGLED_AREA(vTempInCoords, <<191.873123,-723.553040,40.235764>>, <<79.586555,-687.668396,29.547338>>, 85.000000) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIAL_AREA return TRUE : FIB2 underground car park above maze tower") iVariation = 2 IF GET_RANDOM_INT_IN_RANGE(0, iVariation) = 0 ReturnCoord = <<182.6361, -753.5836, 31.8051>> // East entrance to car park. just South ReturnHeading = 162.0019 ELSE ReturnCoord = <<81.5318, -675.4875, 30.5695>> // West entrance under the high road, just North of car park entrance ReturnHeading = 341.8541 ENDIF RETURN TRUE ENDIF // B*1651975 - Interior of Union Despository parking structure IF vInCoords.Z = 1.0 vTempInCoords.Z = 33.5 ENDIF IF IS_POINT_IN_ANGLED_AREA(vTempInCoords, <<-40.0, -687.7, 36.6>>, <<-72.7, -682.0, 29.6>>, 15.000000) OR IS_POINT_IN_ANGLED_AREA(vTempInCoords, <<-45.3, -687.8, 29.3>>, <<5.9, -688.7, 36.8>>, 55.000000) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIAL_AREA return TRUE : B*1651975 - Interior of Union Despository parking structure - Front Entrance.") ReturnCoord = <<-88.4, -660.9, 35.0>> // Near the main street entrance ReturnHeading = -20 RETURN TRUE ELIF IS_POINT_IN_ANGLED_AREA(vTempInCoords, <<8.1, -685.5, 31.2>>, <<26.3, -665.7, 35.2>>, 10.000000) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIAL_AREA return TRUE : B*1651975 - Interior of Union Despository parking structure - Rear Entrance.") ReturnCoord = <<61.4, -653.2, 32.0>> // near the rear entrance ReturnHeading = 160 RETURN TRUE ENDIF IF IS_POINT_IN_ANGLED_AREA(vInCoords, <<496.2593, -3116.5859, 13.6414>>,<<471.4366, -3116.2583, 5.7109>>, 10) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : ARE_COORDS_IN_SPECIAL_AREA return TRUE : Port securty doors") ReturnCoord = <<484.0132, -3033.1621, 5.0717>> ReturnHeading = 140.7302 RETURN TRUE ENDIF RETURN(FALSE) ENDFUNC /// PURPOSE: /// check if the specified position is in a zone classed as safe for the taxi to use deadend nodes in it's path finding /// basically anything in urban areas aren't safe because NF_IGNORE_SWITCHED_OFF_DEADENDS ae used for driveways /// PARAMS: /// vPos - specific position /// RETURNS: /// TRUE if the position is safe to allow NF_IGNORE_SWITCHED_OFF_DEADENDS FUNC BOOL IS_POSITION_IN_ZONE_SAFE_FOR_DEADEND_NODES(VECTOR vPos) STRING tempZone tempZone = GET_NAME_OF_ZONE(vPos) IF ARE_STRINGS_EQUAL("SanAnd", tempZone) // San Andreas OR ARE_STRINGS_EQUAL("Alamo", tempZone) // Alamo Sea //OR ARE_STRINGS_EQUAL("Alta", tempZone) // Alta //OR ARE_STRINGS_EQUAL("Airp", tempZone) // Los Santos International Airport OR ARE_STRINGS_EQUAL("ArmyB", tempZone) // Fort Zancudo OR ARE_STRINGS_EQUAL("BhamCa", tempZone) // Banham Canyon //OR ARE_STRINGS_EQUAL("Banning", tempZone) // Banning OR ARE_STRINGS_EQUAL("Baytre", tempZone) // Baytree Canyon //OR ARE_STRINGS_EQUAL("Beach", tempZone) // Vespucci Beach OR ARE_STRINGS_EQUAL("BradT", tempZone) // Braddock Tunnel OR ARE_STRINGS_EQUAL("BradP", tempZone) // Braddock Pass //OR ARE_STRINGS_EQUAL("Burton", tempZone) // Burton OR ARE_STRINGS_EQUAL("CANNY", tempZone) // Raton Canyon OR ARE_STRINGS_EQUAL("CCreak", tempZone) // Cassidy Creek //OR ARE_STRINGS_EQUAL("CalafB", tempZone) // Calafia Bridge OR ARE_STRINGS_EQUAL("ChamH", tempZone) // Chamberlain Hills OR ARE_STRINGS_EQUAL("CHU", tempZone) // Chumash //OR ARE_STRINGS_EQUAL("CHIL", tempZone) // Vinewood Hills OR ARE_STRINGS_EQUAL("COSI", tempZone) // Countryside OR ARE_STRINGS_EQUAL("CMSW", tempZone) // Chiliad Mountain State Wilderness OR ARE_STRINGS_EQUAL("Cypre", tempZone) // Cypress Flats //OR ARE_STRINGS_EQUAL("Davis", tempZone) // Davis OR ARE_STRINGS_EQUAL("Desrt", tempZone) // Grand Senora Desert //OR ARE_STRINGS_EQUAL("DelBe", tempZone) // Del Perro Beach //OR ARE_STRINGS_EQUAL("DelPe", tempZone) // Del Perro //OR ARE_STRINGS_EQUAL("DelSol", tempZone) // La Puerta //OR ARE_STRINGS_EQUAL("Downt", tempZone) // Downtown //OR ARE_STRINGS_EQUAL("DTVine", tempZone) // Downtown Vinewood //OR ARE_STRINGS_EQUAL("Eclips", tempZone) // Eclipse //OR ARE_STRINGS_EQUAL("ELSant", tempZone) // East Los Santos //OR ARE_STRINGS_EQUAL("EBuro", tempZone) // El Burro Heights OR ARE_STRINGS_EQUAL("ELGorl", tempZone) // El Gordo Lighthouse //OR ARE_STRINGS_EQUAL("Elysian", tempZone) // Elysian Island OR ARE_STRINGS_EQUAL("Galli", tempZone) // Galileo Park OR ARE_STRINGS_EQUAL("Galfish", tempZone) // Galilee //OR ARE_STRINGS_EQUAL("Greatc", tempZone) // Great Chaparral //OR ARE_STRINGS_EQUAL("Golf", tempZone) // GWC and Golfing Society //OR ARE_STRINGS_EQUAL("GrapeS", tempZone) // Grapeseed //OR ARE_STRINGS_EQUAL("Hawick", tempZone) // Hawick OR ARE_STRINGS_EQUAL("Harmo", tempZone) // Harmony //OR ARE_STRINGS_EQUAL("Heart", tempZone) // Heart Attacks Beach OR ARE_STRINGS_EQUAL("HumLab", tempZone) // Humane Labs and Research //OR ARE_STRINGS_EQUAL("HORS", tempZone) // Vinewood Racetrack //OR ARE_STRINGS_EQUAL("Koreat", tempZone) // Little Seoul OR ARE_STRINGS_EQUAL("Jail", tempZone) // Bolingbroke Penitentiary OR ARE_STRINGS_EQUAL("LAct", tempZone) // Land Act Reservoir OR ARE_STRINGS_EQUAL("LDam", tempZone) // Land Act Dam OR ARE_STRINGS_EQUAL("Lago", tempZone) // Lago Zancudo //OR ARE_STRINGS_EQUAL("LegSqu", tempZone) // Legion Square //OR ARE_STRINGS_EQUAL("LosSF", tempZone) // Los Santos Freeway //OR ARE_STRINGS_EQUAL("LMesa", tempZone) // La Mesa //OR ARE_STRINGS_EQUAL("LosPuer", tempZone) // La Puerta //OR ARE_STRINGS_EQUAL("LosPFy", tempZone) // La Puerta Fwy //OR ARE_STRINGS_EQUAL("LOSTMC", tempZone) // Lost MC //OR ARE_STRINGS_EQUAL("Mirr", tempZone) // Mirror Park //OR ARE_STRINGS_EQUAL("Morn", tempZone) // Morningwood //OR ARE_STRINGS_EQUAL("Murri", tempZone) // Murrieta Heights OR ARE_STRINGS_EQUAL("MTChil", tempZone) // Mount Chiliad OR ARE_STRINGS_EQUAL("MTJose", tempZone) // Mount Josiah OR ARE_STRINGS_EQUAL("MTGordo", tempZone) // Mount Gordo - B*1334556 //OR ARE_STRINGS_EQUAL("Movie", tempZone) // Richards Majestic OR ARE_STRINGS_EQUAL("NCHU", tempZone) // North Chumash //OR ARE_STRINGS_EQUAL("Noose", tempZone) // N.O.O.S.E OR ARE_STRINGS_EQUAL("Oceana", tempZone) // Pacific Ocean //OR ARE_STRINGS_EQUAL("Observ", tempZone) // Galileo Observatory OR ARE_STRINGS_EQUAL("Palmpow", tempZone) // Palmer-Taylor Power Station //OR ARE_STRINGS_EQUAL("PBOX", tempZone) // Pillbox Hill OR ARE_STRINGS_EQUAL("PBluff", tempZone) // Pacific Bluffs OR ARE_STRINGS_EQUAL("Paleto", tempZone) // Paleto Bay OR ARE_STRINGS_EQUAL("PalCov", tempZone) // Paleto Cove - B*1332906 OR ARE_STRINGS_EQUAL("PalFor", tempZone) // Paleto Forest OR ARE_STRINGS_EQUAL("PalHigh", tempZone) // Palomino Highlands //OR ARE_STRINGS_EQUAL("ProcoB", tempZone) // Procopio Beach //OR ARE_STRINGS_EQUAL("Prol", tempZone) // North Yankton OR ARE_STRINGS_EQUAL("RTRAK", tempZone) // Redwood Lights Track OR ARE_STRINGS_EQUAL("Rancho", tempZone) // Rancho //OR ARE_STRINGS_EQUAL("RGLEN", tempZone) // Richman Glen //OR ARE_STRINGS_EQUAL("Richm", tempZone) // Richman //OR ARE_STRINGS_EQUAL("Rockf", tempZone) // Rockford Hills OR ARE_STRINGS_EQUAL("SANDY", tempZone) // Sandy Shores OR ARE_STRINGS_EQUAL("TongvaH", tempZone) // Tongva Hills OR ARE_STRINGS_EQUAL("TongvaV", tempZone) // Tongva Valley //OR ARE_STRINGS_EQUAL("East_V", tempZone) // East Vinewood OR ARE_STRINGS_EQUAL("Zenora", tempZone) // Senora Freeway OR ARE_STRINGS_EQUAL("Slab", tempZone) // Stab City //OR ARE_STRINGS_EQUAL("SKID", tempZone) // Mission Row //OR ARE_STRINGS_EQUAL("SLSant", tempZone) // South Los Santos //OR ARE_STRINGS_EQUAL("Stad", tempZone) // Maze Bank Arena //OR ARE_STRINGS_EQUAL("Tatamo", tempZone) // Tataviam Mountains //OR ARE_STRINGS_EQUAL("Termina", tempZone) // Terminal //OR ARE_STRINGS_EQUAL("TEXTI", tempZone) // Textile City //OR ARE_STRINGS_EQUAL("WVine", tempZone) // West Vinewood //OR ARE_STRINGS_EQUAL("UtopiaG", tempZone) // Utopia Gardens //OR ARE_STRINGS_EQUAL("Vesp", tempZone) // Vespucci //OR ARE_STRINGS_EQUAL("VCana", tempZone) // Vespucci Canals //OR ARE_STRINGS_EQUAL("Vine", tempZone) // Vinewood //OR ARE_STRINGS_EQUAL("WMirror", tempZone) // W Mirror Drive OR ARE_STRINGS_EQUAL("WindF", tempZone) // Ron Alternates Wind Farm OR ARE_STRINGS_EQUAL("Zancudo", tempZone) // Zancudo River OR ARE_STRINGS_EQUAL("SanChia", tempZone) // San Chianski Mountain Range //OR ARE_STRINGS_EQUAL("STRAW", tempZone) // Strawberry OR ARE_STRINGS_EQUAL("zQ_UAR", tempZone) // Davis Quartz //OR ARE_STRINGS_EQUAL("ZP_ORT", tempZone) // Port of South Los Santos CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : IS_POSITION_IN_ZONE_SAFE_FOR_DEADEND_NODES return TRUE for vPos = ", vPos, " zone = ", tempZone) RETURN TRUE ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// check if the specified position is in a zone classed as countryside /// used to test if the taxi should be using switched off nodes or not /// PARAMS: /// vPos - specific positin /// RETURNS: /// TRUE if the position is in the countryside FUNC BOOL IS_POSITION_IN_COUNTRYSIDE(VECTOR vPos) STRING tempZone tempZone = GET_NAME_OF_ZONE(vPos) IF ARE_STRINGS_EQUAL("Alamo", tempZone) OR ARE_STRINGS_EQUAL("COSI", tempZone) OR ARE_STRINGS_EQUAL("Desrt", tempZone) OR ARE_STRINGS_EQUAL("GALLI", tempZone) OR ARE_STRINGS_EQUAL("GOcean", tempZone) OR ARE_STRINGS_EQUAL("Harmo", tempZone) OR ARE_STRINGS_EQUAL("SANDY", tempZone) OR ARE_STRINGS_EQUAL("Senora", tempZone) OR ARE_STRINGS_EQUAL("WindF", tempZone) OR ARE_STRINGS_EQUAL("Zancudo", tempZone) OR ARE_STRINGS_EQUAL("Lago", tempZone) OR ARE_STRINGS_EQUAL("CANNY", tempZone) OR ARE_STRINGS_EQUAL("RTRAK", tempZone) OR ARE_STRINGS_EQUAL("CHU", tempZone) OR ARE_STRINGS_EQUAL("CHIL", tempZone) OR ARE_STRINGS_EQUAL("GrapeS", tempZone) OR ARE_STRINGS_EQUAL("MTJose", tempZone) OR ARE_STRINGS_EQUAL("Paleto", tempZone) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " IS_POSITION_IN_COUNTRYSIDE return TRUE for vPos = ", vPos, " zone = ", tempZone) RETURN TRUE ENDIF RETURN FALSE ENDFUNC FUNC BOOL IS_PLAYER_IN_COUNTRYSIDE() STRING tempZone IF NOT IS_PED_INJURED(PLAYER_PED_ID()) printDebugString("<")printDebugString(GET_THIS_SCRIPT_NAME())printDebugString("> - GET_NAME_OF_ZONE(GET_ENTITY_COORDS(PLAYER_PED_ID())) = ") tempZone = GET_NAME_OF_ZONE(GET_ENTITY_COORDS(PLAYER_PED_ID())) printDebugString(tempZone) printDebugString("\n") IF ARE_STRINGS_EQUAL("Alamo", tempZone) OR ARE_STRINGS_EQUAL("COSI", tempZone) OR ARE_STRINGS_EQUAL("Desrt", tempZone) OR ARE_STRINGS_EQUAL("GALLI", tempZone) OR ARE_STRINGS_EQUAL("GOcean", tempZone) OR ARE_STRINGS_EQUAL("Harmo", tempZone) OR ARE_STRINGS_EQUAL("SANDY", tempZone) OR ARE_STRINGS_EQUAL("Senora", tempZone) OR ARE_STRINGS_EQUAL("WindF", tempZone) OR ARE_STRINGS_EQUAL("Zancudo", tempZone) OR ARE_STRINGS_EQUAL("Lago", tempZone) OR ARE_STRINGS_EQUAL("CANNY", tempZone) OR ARE_STRINGS_EQUAL("RTRAK", tempZone) OR ARE_STRINGS_EQUAL("CHU", tempZone) OR ARE_STRINGS_EQUAL("CHIL", tempZone) OR ARE_STRINGS_EQUAL("GrapeS", tempZone) OR ARE_STRINGS_EQUAL("MTJose", tempZone) OR ARE_STRINGS_EQUAL("Paleto", tempZone) RETURN TRUE ENDIF ENDIF RETURN FALSE ENDFUNC FUNC BOOL GET_OFF_NODE_IF_ALLOWED(VECTOR vNodePos) IF IS_PLAYER_IN_COUNTRYSIDE() RETURN TRUE ELSE IF NOT GET_VEHICLE_NODE_IS_SWITCHED_OFF(GET_NTH_CLOSEST_VEHICLE_NODE_ID(vNodePos, 1)) RETURN TRUE ENDIF ENDIF RETURN FALSE ENDFUNC PROC SEND_TAXI_TO_COORD(VECTOR vDestination, FLOAT fDestinationH = 0.0, FLOAT taxiSpeed = 12.0, BOOL bUseOffNodes = FALSE, BOOL bInstantRelease = TRUE) DRIVINGMODE taxiDrivingMode IF bUseOffNodes taxiDrivingMode = DF_SteerAroundStationaryCars|DF_StopForPeds|DF_StopAtLights|DF_ChangeLanesAroundObstructions//|DF_UseSwitchedOffNodes ELSE taxiDrivingMode = DF_SteerAroundStationaryCars|DF_StopForPeds|DF_ChangeLanesAroundObstructions ENDIF IF fDestinationH = 0 ENDIF IF IS_VEHICLE_DRIVEABLE(g_WaitingTaxi) IF NOT IS_PED_INJURED(g_WaitingTaxiDriver) TASK_VEHICLE_MISSION_COORS_TARGET(g_WaitingTaxiDriver, g_WaitingTaxi, vDestination, MISSION_GOTO, taxiSpeed, taxiDrivingMode, 10, 10) IF bInstantRelease SET_PED_KEEP_TASK(g_WaitingTaxiDriver, TRUE) WAIT(0) CLEANUP_WAITING_TAXI() ENDIF ENDIF ENDIF ENDPROC PROC SET_TAXI_DROPOFF_LOCATION_FOR_BLIP(BLIP_INDEX &inBlipID, VECTOR vPosition, FLOAT fHeading) IF DOES_BLIP_EXIST(inBlipID) g_CustomDropOffBlip = inBlipID g_vCustomDropPosition = vPosition g_fCustomDropHeading = fHeading CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : SET_TAXI_DROPOFF_LOCATION_FOR_BLIP : g_vCustomDropPosition = ", g_vCustomDropPosition, " g_fCustomDropHeading = ", g_fCustomDropHeading) ENDIF ENDPROC PROC SET_BLIP_AS_FIRST_IN_TAXI_METER(BLIP_INDEX &inBlip) g_FirstBlipInTaxiMeter = inBlip ENDPROC PROC SET_BLIP_SPRITE_AS_FIRST_IN_TAXI_METER(BLIP_SPRITE inSprite) g_FirstBlipSpriteInTaxiMeter = inSprite ENDPROC PROC SET_TAXI_TO_IGNORE_BLIP(BLIP_INDEX &inBlip) g_BlipToIgnore = inBlip ENDPROC FUNC BLIP_SPRITE GET_SPRITE_FOR_BLIP(BLIP_INDEX inBlip) BLIP_SPRITE ReturnedBlipSprite IF DOES_BLIP_EXIST(inBlip) ReturnedBlipSprite = GET_BLIP_SPRITE(inBlip) ENDIF RETURN(ReturnedBlipSprite) ENDFUNC FUNC BOOL SHOULD_WE_IGNORE_THIS_BLIP(BLIP_INDEX &inBlip)//, BLIP_SPRITE BlipSprite) IF NOT DOES_BLIP_EXIST(inBlip) RETURN(TRUE) ENDIF IF (g_BlipToIgnore = inBlip) RETURN(TRUE) ENDIF IF GET_BLIP_COLOUR(inBlip) = BLIP_COLOUR_INACTIVE_MISSION RETURN TRUE ENDIF IF ARE_VECTORS_EQUAL(GET_BLIP_COORDS(inBlip), <<0,0,0>>) RETURN TRUE ENDIF IF GET_SPRITE_FOR_BLIP(inBlip) = RADAR_TRACE_INVALID RETURN TRUE ENDIF RETURN(FALSE) ENDFUNC PROC SET_TAXI_TO_DISPLAY_ONLY_THIS_MISSION_BLIP(BLIP_INDEX &inBlip) g_OnlyMissionBlipToDisplayOnTaxiMeter = inBlip ENDPROC //PROC SET_TAXI_BLIP_NAME(BLIP_INDEX &inBlip, STRING inString, BOOL bAmbient = FALSE) // // IF DOES_BLIP_EXIST(inBlip) // CHANGE_BLIP_NAME_FROM_TEXT_FILE(inBlip, inString) // ENDIF // //// IF DOES_BLIP_EXIST(inBlip) //// IF NOT (bAmbient) //// g_CustomNamedBlip = inBlip //// g_tlCustomBlipName = inString //// ELSE //// g_CustomNamedBlipSpecial = inBlip //// g_tlCustomBlipNameSpecial = inString //// ENDIF //// ENDIF //ENDPROC FUNC BOOL IS_THERE_A_TAXI_WAITING_FOR_THE_PLAYER() IF IS_VEHICLE_DRIVEABLE(g_WaitingTaxi) IF DOES_ENTITY_EXIST(g_WaitingTaxiDriver) IF NOT IS_PED_INJURED(g_WaitingTaxiDriver) IF IS_PED_IN_VEHICLE(g_WaitingTaxiDriver, g_WaitingTaxi) IF IS_VEHICLE_SEAT_FREE(g_WaitingTaxi, VS_ANY_PASSENGER) RETURN(TRUE) ENDIF ENDIF ENDIF ENDIF ENDIF RETURN(FALSE) ENDFUNC FUNC BOOL IS_CAR_A_TAXI_MODEL(VEHICLE_INDEX InCar) IF IS_VEHICLE_MODEL(InCar, TAXI) //OR IS_VEHICLE_MODEL(InCar, TAXI2) RETURN(TRUE) ENDIF RETURN(FALSE) ENDFUNC FUNC BOOL IS_PED_IN_BACK_OF_TAXI(PED_INDEX InChar) VEHICLE_INDEX TempCar IF NOT IS_PED_INJURED(InChar) IF IS_PED_IN_ANY_VEHICLE(InChar) TempCar = GET_VEHICLE_PED_IS_IN(InChar) IF IS_VEHICLE_DRIVEABLE(TempCar) IF IS_CAR_A_TAXI_MODEL(TempCar) IF (GET_VEHICLE_MAX_NUMBER_OF_PASSENGERS(TempCar) = 3) IF NOT IS_VEHICLE_SEAT_FREE (TempCar, VS_BACK_LEFT) IF (GET_PED_IN_VEHICLE_SEAT(TempCar, VS_BACK_LEFT) = InChar) RETURN(TRUE) ENDIF ENDIF IF NOT IS_VEHICLE_SEAT_FREE (TempCar, VS_BACK_RIGHT) IF (GET_PED_IN_VEHICLE_SEAT(TempCar, VS_BACK_RIGHT) = InChar) RETURN(TRUE) ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF RETURN(FALSE) ENDFUNC FUNC BOOL IS_ANY_DIALOGUE_PLAYING(PED_INDEX DriverID, BOOL bReturnTrueForMessageDisplayed = TRUE) IF NOT IS_PED_INJURED(DriverID) IF IS_AMBIENT_SPEECH_PLAYING(DriverID) printDebugString("\ntaxi_functions - IS_ANY_DIALOGUE_PLAYING - IS_AMBIENT_SPEECH_PLAYING(DriverID)\n") RETURN(TRUE) ENDIF ENDIF IF IS_PLAYER_PLAYING(PLAYER_ID()) IF IS_AMBIENT_SPEECH_PLAYING(PLAYER_PED_ID()) printDebugString("\ntaxi_functions - IS_ANY_DIALOGUE_PLAYING - IS_AMBIENT_SPEECH_PLAYING(PLAYER_PED_ID())\n") RETURN(TRUE) ENDIF ENDIF IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() printDebugString("\ntaxi_functions - IS_ANY_DIALOGUE_PLAYING - IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()\n") RETURN(TRUE) ENDIF IF bReturnTrueForMessageDisplayed IF IS_MESSAGE_BEING_DISPLAYED() printDebugString("\ntaxi_functions - IS_ANY_DIALOGUE_PLAYING - IS_MESSAGE_BEING_DISPLAYED()\n") RETURN TRUE ENDIF ENDIF PED_INDEX TempGroupPedID INT i, j IF IS_PLAYER_PLAYING(PLAYER_ID()) IF DOES_GROUP_EXIST(PLAYER_GROUP_ID()) GET_GROUP_SIZE(PLAYER_GROUP_ID(), j, i) IF (i > 0) REPEAT i j TempGroupPedID = GET_PED_AS_GROUP_MEMBER(PLAYER_GROUP_ID(), j) IF NOT IS_PED_INJURED(TempGroupPedID) IF IS_AMBIENT_SPEECH_PLAYING(TempGroupPedID) printDebugString("\ntaxi_functions - IS_ANY_DIALOGUE_PLAYING - IS_AMBIENT_SPEECH_PLAYING(TempGroupPedID)\n") RETURN(TRUE) ENDIF ENDIF ENDREPEAT ENDIF ENDIF ENDIF RETURN(FALSE) ENDFUNC //// rewritten function to work for japanese version so no need for big #IF blocks //FUNC BOOL COMPARE_STREETS_FOR_AUDIO(INT street_label_hash, STRING street_label, STRING gxt_text_label) // // RETURN street_label_hash = GET_HASH_KEY(gxt_text_label) // //ENDFUNC FUNC VECTOR GET_RADAR_BLIP_COORDS(BLIP_INDEX inBlipID) VECTOR vReturn = << 0.0 , 0.0, 0.0>> VEHICLE_INDEX TempCar PED_INDEX TempChar OBJECT_INDEX TempObject PICKUP_INDEX TempPickup eRADAR_BLIP_TYPE eBlipType = GET_BLIP_INFO_ID_TYPE(inBlipID) IF eBlipType = BLIPTYPE_VEHICLE TempCar = GET_BLIP_INFO_ID_ENTITY_INDEX(inBlipID) IF IS_VEHICLE_DRIVEABLE(TempCar) vReturn = GET_ENTITY_COORDS(TempCar) ENDIF ELIF eBlipType = BLIPTYPE_CHAR TempChar = GET_PED_INDEX_FROM_ENTITY_INDEX(GET_BLIP_INFO_ID_ENTITY_INDEX(inBlipID)) IF NOT IS_PED_INJURED(TempChar) vReturn = GET_ENTITY_COORDS(TempChar) ENDIF ELIF eBlipType = BLIPTYPE_OBJECT TempObject = GET_OBJECT_INDEX_FROM_ENTITY_INDEX(GET_BLIP_INFO_ID_ENTITY_INDEX(inBlipID)) IF DOES_ENTITY_EXIST(TempObject) vReturn = GET_ENTITY_COORDS(TempObject) ENDIF ELIF eBlipType = BLIPTYPE_COORDS vReturn = GET_BLIP_COORDS(inBlipID) ELIF eBlipType = BLIPTYPE_PICKUP TempPickup = GET_BLIP_INFO_ID_PICKUP_INDEX(inBlipID) IF DOES_PICKUP_EXIST(TempPickup) vReturn = GET_PICKUP_COORDS(TempPickup) ENDIF ELIF eBlipType = BLIPTYPE_CONTACT vReturn = GET_BLIP_COORDS(inBlipID) ENDIF // // not used // BLIPTYPE_UNUSED // BLIPTYPE_PICKUP // BLIPTYPE_RADIUS // vReturn = << 0.0 , 0.0, 0.0>> // ENDIF RETURN(vReturn) ENDFUNC FUNC FLOAT GET_BLIP_DISTANCE(BLIP_INDEX inBlipID) VECTOR vec = << 0.0, 0.0, 9999999.9>> IF IS_PLAYER_PLAYING(PLAYER_ID()) IF DOES_BLIP_EXIST(inBlipID) vec = GET_RADAR_BLIP_COORDS(inBlipID) - GET_ENTITY_COORDS(PLAYER_PED_ID()) ENDIF ENDIF RETURN(VMAG(vec)) ENDFUNC FUNC BOOL IS_TAXI_DEST_NEARER_THAN_TAXI_DEST(TAXI_DEST inTaxiDest1, TAXI_DEST inTaxiDest2) IF GET_BLIP_DISTANCE(inTaxiDest1.BlipID) < GET_BLIP_DISTANCE(inTaxiDest2.BlipID) RETURN(TRUE) ENDIF RETURN(FALSE) ENDFUNC /// PURPOSE: /// convert a TEXT_LABEL into type STRING /// PARAMS: /// tlTextLabel - the text label to convert /// RETURNS: /// STRING FUNC STRING TAXI_CONVERT_TEXT_LABEL_TO_STRING_FORMAT(STRING tlTextLabel) RETURN(tlTextLabel) ENDFUNC /// PURPOSE: /// get the audio string for the destination /// unfortunately audio set the strigs to use the actual location names in stead of the text key names GET_NAME_OF_ZONE returns /// RETURNS: /// String FUNC STRING GET_LOCATION_AUDIO_STRING() TEXT_LABEL_31 tl31ZoneLabel = GET_NAME_OF_ZONE(GET_RADAR_BLIP_COORDS(currentTaxiDestination.BlipID)) IF ARE_STRINGS_EQUAL("SanAnd", tl31ZoneLabel) // San Andreas RETURN("LOCATION_SAN_ANDREAS") ELIF ARE_STRINGS_EQUAL("Alamo", tl31ZoneLabel) // Alamo Sea RETURN("LOCATION_ALAMO_SEA") ELIF ARE_STRINGS_EQUAL("Alta", tl31ZoneLabel) // Alta RETURN("LOCATION_ALTA") ELIF ARE_STRINGS_EQUAL("Airp", tl31ZoneLabel) // Los Santos International Airport RETURN("LOCATION_LOS_SANTOS_INTERNATIONAL_AIRPORT") ELIF ARE_STRINGS_EQUAL("ArmyB", tl31ZoneLabel) // Fort Zancudo RETURN("LOCATION_FORT_ZANCUDO") ELIF ARE_STRINGS_EQUAL("BhamCa", tl31ZoneLabel) // Banham Canyon RETURN("LOCATION_BANHAM_CANYON") ELIF ARE_STRINGS_EQUAL("Banning", tl31ZoneLabel) // Banning RETURN("LOCATION_BANNING") ELIF ARE_STRINGS_EQUAL("Baytre", tl31ZoneLabel) // Baytree Canyon RETURN("LOCATION_BAYTREE_CANYON") ELIF ARE_STRINGS_EQUAL("Beach", tl31ZoneLabel) // Vespucci Beach RETURN("LOCATION_VESPUCCI_BEACH") ELIF ARE_STRINGS_EQUAL("BradT", tl31ZoneLabel) // Braddock Tunnel RETURN("LOCATION_BRADDOCK_TUNNEL") ELIF ARE_STRINGS_EQUAL("BradP", tl31ZoneLabel) // Braddock Pass RETURN("LOCATION_BRADDOCK_PASS") ELIF ARE_STRINGS_EQUAL("Burton", tl31ZoneLabel) // Burton RETURN("LOCATION_BURTON") ELIF ARE_STRINGS_EQUAL("CANNY", tl31ZoneLabel) // Raton Canyon RETURN("LOCATION_RATON_CANYON") ELIF ARE_STRINGS_EQUAL("CCreak", tl31ZoneLabel) // Cassidy Creek RETURN("LOCATION_CASSIDY_CREEK") ELIF ARE_STRINGS_EQUAL("CalafB", tl31ZoneLabel) // Calafia Bridge RETURN("LOCATION_CALAFIA_BRIDGE") ELIF ARE_STRINGS_EQUAL("ChamH", tl31ZoneLabel) // Chamberlain Hills RETURN("LOCATION_CHAMBERLAIN_HILLS") ELIF ARE_STRINGS_EQUAL("CHU", tl31ZoneLabel) // Chumash RETURN("LOCATION_CHUMASH") ELIF ARE_STRINGS_EQUAL("CHIL", tl31ZoneLabel) // Vinewood Hills RETURN("LOCATION_VINEWOOD_HILLS") ELIF ARE_STRINGS_EQUAL("COSI", tl31ZoneLabel) // Countryside RETURN("LOCATION_COUNTRYSIDE") ELIF ARE_STRINGS_EQUAL("CMSW", tl31ZoneLabel) // Chiliad Mountain State Wilderness RETURN("LOCATION_CHILIAD_MOUNTAIN_STATE_WILDERNESS") ELIF ARE_STRINGS_EQUAL("Cypre", tl31ZoneLabel) // Cypress Flats RETURN("LOCATION_CYPRESS_FLATS") ELIF ARE_STRINGS_EQUAL("Davis", tl31ZoneLabel) // Davis RETURN("LOCATION_DAVIS") ELIF ARE_STRINGS_EQUAL("Desrt", tl31ZoneLabel) // Grand Senora Desert RETURN("LOCATION_GRAND_SENORA_DESERT") ELIF ARE_STRINGS_EQUAL("DelBe", tl31ZoneLabel) // Del Perro Beach RETURN("LOCATION_DEL_PERRO_BEACH") ELIF ARE_STRINGS_EQUAL("DelPe", tl31ZoneLabel) // Del Perro RETURN("LOCATION_DEL_PERRO") ELIF ARE_STRINGS_EQUAL("DelSol", tl31ZoneLabel) // La Puerta RETURN("LOCATION_LA_PUERTA") ELIF ARE_STRINGS_EQUAL("Downt", tl31ZoneLabel) // Downtown RETURN("LOCATION_DOWNTOWN") ELIF ARE_STRINGS_EQUAL("DTVine", tl31ZoneLabel) // Downtown Vinewood RETURN("LOCATION_DOWNTOWN_VINEWOOD") ELIF ARE_STRINGS_EQUAL("Eclips", tl31ZoneLabel) // Eclipse RETURN("LOCATION_ECLIPSE") ELIF ARE_STRINGS_EQUAL("ELSant", tl31ZoneLabel) // East Los Santos RETURN("LOCATION_EAST_LOS_SANTOS") ELIF ARE_STRINGS_EQUAL("EBuro", tl31ZoneLabel) // El Burro Heights RETURN("LOCATION_EL_BURRO_HEIGHTS") ELIF ARE_STRINGS_EQUAL("ELGorl", tl31ZoneLabel) // El Gordo Lighthouse RETURN("LOCATION_EL_GORDO_LIGHTHOUSE") ELIF ARE_STRINGS_EQUAL("Elysian", tl31ZoneLabel) // Elysian Island RETURN("LOCATION_ELYSIAN_ISLAND") ELIF ARE_STRINGS_EQUAL("Galli", tl31ZoneLabel) // Galileo Park RETURN("LOCATION_GALILEO_PARK") ELIF ARE_STRINGS_EQUAL("Galfish", tl31ZoneLabel) // Galilee RETURN("LOCATION_GALILEE") ELIF ARE_STRINGS_EQUAL("Greatc", tl31ZoneLabel) // Great Chaparral RETURN("LOCATION_GREAT_CHAPARRAL") ELIF ARE_STRINGS_EQUAL("Golf", tl31ZoneLabel) // GWC and Golfing Society RETURN("LOCATION_GWC_AND_GOLFING_SOCIETY") ELIF ARE_STRINGS_EQUAL("GrapeS", tl31ZoneLabel) // Grapeseed RETURN("LOCATION_GRAPESEED") ELIF ARE_STRINGS_EQUAL("Hawick", tl31ZoneLabel) // Hawick RETURN("LOCATION_HAWICK") ELIF ARE_STRINGS_EQUAL("Harmo", tl31ZoneLabel) // Harmony RETURN("LOCATION_HARMONY") ELIF ARE_STRINGS_EQUAL("Heart", tl31ZoneLabel) // Heart Attacks Beach RETURN("LOCATION_HEART_ATTACKS_BEACH") ELIF ARE_STRINGS_EQUAL("HumLab", tl31ZoneLabel) // Humane Labs and Research RETURN("LOCATION_HUMANE_LABS_AND_RESEARCH") ELIF ARE_STRINGS_EQUAL("HORS", tl31ZoneLabel) // Vinewood Racetrack RETURN("LOCATION_VINEWOOD_RACETRACK") ELIF ARE_STRINGS_EQUAL("Koreat", tl31ZoneLabel) // Little Seoul RETURN("LOCATION_LITTLE_SEOUL") ELIF ARE_STRINGS_EQUAL("Jail", tl31ZoneLabel) // Bolingbroke Penitentiary RETURN("LOCATION_BOLINGBROKE_PENITENTIARY") ELIF ARE_STRINGS_EQUAL("LAct", tl31ZoneLabel) // Land Act Reservoir RETURN("LOCATION_LAND_ACT_RESERVOIR") ELIF ARE_STRINGS_EQUAL("LDam", tl31ZoneLabel) // Land Act Dam RETURN("LOCATION_LAND_ACT_DAM") ELIF ARE_STRINGS_EQUAL("Lago", tl31ZoneLabel) // Lago Zancudo RETURN("LOCATION_LAGO_ZANCUDO") ELIF ARE_STRINGS_EQUAL("LegSqu", tl31ZoneLabel) // Legion Square RETURN("LOCATION_LEGION_SQUARE") ELIF ARE_STRINGS_EQUAL("LosSF", tl31ZoneLabel) // Los Santos Freeway RETURN("LOCATION_LOS_SANTOS_FREEWAY") ELIF ARE_STRINGS_EQUAL("LMesa", tl31ZoneLabel) // La Mesa RETURN("LOCATION_LA_MESA") ELIF ARE_STRINGS_EQUAL("LosPuer", tl31ZoneLabel) // La Puerta RETURN("LOCATION_LA_PUERTA") ELIF ARE_STRINGS_EQUAL("LosPFy", tl31ZoneLabel) // La Puerta Fwy RETURN("LOCATION_LA_PUERTA_FWY") //ELIF ARE_STRINGS_EQUAL("LOSTMC", tl31ZoneLabel) // Lost MC // not recorded // RETURN("LOCATION") ELIF ARE_STRINGS_EQUAL("Mirr", tl31ZoneLabel) // Mirror Park RETURN("LOCATION_MIRROR_PARK") ELIF ARE_STRINGS_EQUAL("Morn", tl31ZoneLabel) // Morningwood RETURN("LOCATION_MORNINGWOOD") ELIF ARE_STRINGS_EQUAL("Murri", tl31ZoneLabel) // Murrieta Heights RETURN("LOCATION_MURRIETA_HEIGHTS") ELIF ARE_STRINGS_EQUAL("MTChil", tl31ZoneLabel) // Mount Chiliad RETURN("LOCATION_MOUNT_CHILIAD") ELIF ARE_STRINGS_EQUAL("MTJose", tl31ZoneLabel) // Mount Josiah RETURN("LOCATION_MOUNT_JOSIAH") ELIF ARE_STRINGS_EQUAL("MTGordo", tl31ZoneLabel) // Mount Gordo - B*1334556 RETURN("LOCATION_MOUNT_GORDO") ELIF ARE_STRINGS_EQUAL("Movie", tl31ZoneLabel) // Richards Majestic RETURN("LOCATION_RICHARDS_MAJESTIC") ELIF ARE_STRINGS_EQUAL("NCHU", tl31ZoneLabel) // North Chumash RETURN("LOCATION_NORTH_CHUMASH") //ELIF ARE_STRINGS_EQUAL("Noose", tl31ZoneLabel) // N.O.O.S.E // not recorded // RETURN("LOCATION_") ELIF ARE_STRINGS_EQUAL("Oceana", tl31ZoneLabel) // Pacific Ocean RETURN("LOCATION_PACIFIC_OCEAN") ELIF ARE_STRINGS_EQUAL("Observ", tl31ZoneLabel) // Galileo Observatory RETURN("LOCATION_GALILEO_OBSERVATORY") ELIF ARE_STRINGS_EQUAL("Palmpow", tl31ZoneLabel) // Palmer-Taylor Power Station RETURN("LOCATION_PALMER-TAYLOR_POWER_STATION") ELIF ARE_STRINGS_EQUAL("PBOX", tl31ZoneLabel) // Pillbox Hill RETURN("LOCATION_PILLBOX_HILL") ELIF ARE_STRINGS_EQUAL("PBluff", tl31ZoneLabel) // Pacific Bluffs RETURN("LOCATION_PACIFIC_BLUFFS") ELIF ARE_STRINGS_EQUAL("Paleto", tl31ZoneLabel) // Paleto Bay RETURN("LOCATION_PALETO_BAY") ELIF ARE_STRINGS_EQUAL("PalCov", tl31ZoneLabel) // Paleto Cove - B*1332906 RETURN("LOCATION_PALETO_COVE") ELIF ARE_STRINGS_EQUAL("PalFor", tl31ZoneLabel) // Paleto Forest RETURN("LOCATION_PALETO_FOREST") ELIF ARE_STRINGS_EQUAL("PalHigh", tl31ZoneLabel) // Palomino Highlands RETURN("LOCATION_PALOMINO_HIGHLANDS") ELIF ARE_STRINGS_EQUAL("ProcoB", tl31ZoneLabel) // Procopio Beach RETURN("LOCATION_PROCOPIO_BEACH") ELIF ARE_STRINGS_EQUAL("Prol", tl31ZoneLabel) // North Yankton RETURN("LOCATION_NORTH_YANKTON") ELIF ARE_STRINGS_EQUAL("RTRAK", tl31ZoneLabel) // Redwood Lights Track RETURN("LOCATION_REDWOOD_LIGHTS_TRACK") ELIF ARE_STRINGS_EQUAL("Rancho", tl31ZoneLabel) // Rancho RETURN("LOCATION_RANCHO") ELIF ARE_STRINGS_EQUAL("RGLEN", tl31ZoneLabel) // Richman Glen RETURN("LOCATION_RICHMAN_GLEN") ELIF ARE_STRINGS_EQUAL("Richm", tl31ZoneLabel) // Richman RETURN("LOCATION_RICHMAN") ELIF ARE_STRINGS_EQUAL("Rockf", tl31ZoneLabel) // Rockford Hills RETURN("LOCATION_ROCKFORD_HILLS") ELIF ARE_STRINGS_EQUAL("SANDY", tl31ZoneLabel) // Sandy Shores RETURN("LOCATION_SANDY_SHORES") ELIF ARE_STRINGS_EQUAL("TongvaH", tl31ZoneLabel) // Tongva Hills RETURN("LOCATION_TONGVA_HILLS") ELIF ARE_STRINGS_EQUAL("TongvaV", tl31ZoneLabel) // Tongva Valley RETURN("LOCATION_TONGVA_VALLEY") ELIF ARE_STRINGS_EQUAL("East_V", tl31ZoneLabel) // East Vinewood RETURN("LOCATION_EAST_VINEWOOD") ELIF ARE_STRINGS_EQUAL("Zenora", tl31ZoneLabel) // Senora Freeway RETURN("LOCATION_SENORA_FREEWAY") ELIF ARE_STRINGS_EQUAL("Slab", tl31ZoneLabel) // Stab City RETURN("LOCATION_SLAB_CITY") ELIF ARE_STRINGS_EQUAL("SKID", tl31ZoneLabel) // Mission Row RETURN("LOCATION_MISSION_ROW") ELIF ARE_STRINGS_EQUAL("SLSant", tl31ZoneLabel) // South Los Santos RETURN("LOCATION_SOUTH_LOS_SANTOS") ELIF ARE_STRINGS_EQUAL("Stad", tl31ZoneLabel) // Maze Bank Arena RETURN("LOCATION_MAZE_BANK_ARENA") ELIF ARE_STRINGS_EQUAL("Tatamo", tl31ZoneLabel) // Tataviam Mountains RETURN("LOCATION_TATAVIAM_MOUNTAINS") ELIF ARE_STRINGS_EQUAL("Termina", tl31ZoneLabel) // Terminal RETURN("LOCATION_TERMINAL") ELIF ARE_STRINGS_EQUAL("TEXTI", tl31ZoneLabel) // Textile City RETURN("LOCATION_TEXTILE_CITY") ELIF ARE_STRINGS_EQUAL("WVine", tl31ZoneLabel) // West Vinewood RETURN("LOCATION_WEST_VINEWOOD") ELIF ARE_STRINGS_EQUAL("UtopiaG", tl31ZoneLabel) // Utopia Gardens RETURN("LOCATION_UTOPIA_GARDENS") ELIF ARE_STRINGS_EQUAL("Vesp", tl31ZoneLabel) // Vespucci RETURN("LOCATION_VESPUCCI") ELIF ARE_STRINGS_EQUAL("VCana", tl31ZoneLabel) // Vespucci Canals RETURN("LOCATION_VESPUCCI_CANALS") ELIF ARE_STRINGS_EQUAL("Vine", tl31ZoneLabel) // Vinewood RETURN("LOCATION_VINEWOOD") ELIF ARE_STRINGS_EQUAL("WMirror", tl31ZoneLabel) // W Mirror Drive RETURN("LOCATION_W_MIRROR_DRIVE") ELIF ARE_STRINGS_EQUAL("WindF", tl31ZoneLabel) // Ron Alternates Wind Farm RETURN("LOCATION_RON_ALTERNATES_WIND_WARM") ELIF ARE_STRINGS_EQUAL("Zancudo", tl31ZoneLabel) // Zancudo River RETURN("LOCATION_ZANCUDO_RIVER") ELIF ARE_STRINGS_EQUAL("SanChia", tl31ZoneLabel) // San Chianski Mountain Range RETURN("LOCATION_SAN_CHIANSKI_MOUNTAIN_RANGE") ELIF ARE_STRINGS_EQUAL("STRAW", tl31ZoneLabel) // Strawberry RETURN("LOCATION_STRAWBERRY") ELIF ARE_STRINGS_EQUAL("zQ_UAR", tl31ZoneLabel) // Davis Quartz RETURN("LOCATION_DAVIS_QUARTZ") ELIF ARE_STRINGS_EQUAL("ZP_ORT", tl31ZoneLabel) // Port of South Los Santos RETURN("LOCATION_PORT_OF_SOUTH_LOS_SANTOS") ENDIF RETURN "" ENDFUNC PROC PLAYER_SAY_TAXI_DESTINATION() STRING stringAreaAudio = GET_LOCATION_AUDIO_STRING() IF NOT IS_STRING_NULL_OR_EMPTY(stringAreaAudio) BOOL bFlag = IS_AMBIENT_SPEECH_DISABLED(PLAYER_PED_ID()) IF (bFlag) STOP_PED_SPEAKING(PLAYER_PED_ID(), FALSE) ENDIF PLAY_PED_AMBIENT_SPEECH(PLAYER_PED_ID(), stringAreaAudio, SPEECH_PARAMS_FORCE_NORMAL_CLEAR) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : PLAYER_SAY_TAXI_DESTINATION() - triggered : ", stringAreaAudio) IF (bFlag) STOP_PED_SPEAKING(PLAYER_PED_ID(), TRUE) ENDIF ELSE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : PLAYER_SAY_TAXI_DESTINATION() - skipped area name not valid : ") ENDIF ENDPROC PROC PLAY_TAXI_DIALOGUE(PED_INDEX DriverID, TAXI_DIALOGUE &iSpeechToPlay) BOOL bFlag IF NOT IS_PED_INJURED(DriverID) IF NOT IS_ANY_DIALOGUE_PLAYING(DriverID, FALSE) IF NOT (iSpeechToPlay = TAXI_DIALOGUE_NOTHING) IF iSpeechToPlay = TAXI_DIALOGUE_WHERE_TO PLAY_PED_AMBIENT_SPEECH(DriverID, "TAXID_WHERE_TO", SPEECH_PARAMS_FORCE_NORMAL_CLEAR) iSpeechToPlay = TAXI_DIALOGUE_WAIT_TO_FINISH CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : PLAY_TAXI_DIALOGUE() - triggered : ", "TAXID_WHERE_TO context = TAXID_WHERE_TO ") ELIF iSpeechToPlay = TAXI_DIALOGUE_BEGIN_JOURNEY_1 IF IS_PLAYER_PLAYING(PLAYER_ID()) PLAYER_SAY_TAXI_DESTINATION() iSpeechToPlay = TAXI_DIALOGUE_BEGIN_JOURNEY_2 CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : PLAY_TAXI_DIALOGUE() - triggered : ", "TAXI_DIALOGUE_BEGIN_JOURNEY_1") ENDIF ELIF iSpeechToPlay = TAXI_DIALOGUE_BEGIN_JOURNEY_2 PLAY_PED_AMBIENT_SPEECH(DriverID, "TAXID_BEGIN_JOURNEY", SPEECH_PARAMS_FORCE_NORMAL_CLEAR) iSpeechToPlay = TAXI_DIALOGUE_WAIT_TO_FINISH CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : PLAY_TAXI_DIALOGUE() - triggered : ", "TAXI_DIALOGUE_BEGIN_JOURNEY_2 context = TAXID_BEGIN_JOURNEY ") ELIF iSpeechToPlay = TAXI_DIALOGUE_BANTER PLAY_PED_AMBIENT_SPEECH(DriverID, "TAXID_BANTER") iSpeechToPlay = TAXI_DIALOGUE_WAIT_TO_FINISH CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : PLAY_TAXI_DIALOGUE() - triggered : ", "TAXI_DIALOGUE_BANTER context = TAXID_BANTER ") ELIF iSpeechToPlay = TAXI_DIALOGUE_ARRIVE PLAY_PED_AMBIENT_SPEECH(DriverID, "TAXID_ARRIVE_AT_DEST", SPEECH_PARAMS_FORCE_NORMAL_CLEAR) iSpeechToPlay = TAXI_DIALOGUE_THANKS CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : PLAY_TAXI_DIALOGUE() - triggered : ", "TAXI_DIALOGUE_ARRIVE context = TAXID_ARRIVE_AT_DEST ") ELIF iSpeechToPlay = TAXI_DIALOGUE_CLOSE_AS_POSS PLAY_PED_AMBIENT_SPEECH(DriverID, "TAXID_CLOSE_AS_POSS", SPEECH_PARAMS_FORCE_NORMAL_CLEAR) iSpeechToPlay = TAXI_DIALOGUE_WAIT_TO_FINISH CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : PLAY_TAXI_DIALOGUE() - triggered : ", "TAXI_DIALOGUE_CLOSE_AS_POSS context = TAXI_DIALOGUE_CLOSE_AS_POSS ") ELIF iSpeechToPlay = TAXI_DIALOGUE_NO_MONEY PLAY_PED_AMBIENT_SPEECH(DriverID, "TAXID_NO_MONEY", SPEECH_PARAMS_FORCE_NORMAL_CLEAR) iSpeechToPlay = TAXI_DIALOGUE_WAIT_TO_FINISH CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : PLAY_TAXI_DIALOGUE() - triggered : ", "TAXI_DIALOGUE_NO_MONEY context = TAXI_DIALOGUE_NO_MONEY ") ELIF iSpeechToPlay = TAXI_DIALOGUE_CHANGE_DEST_1 IF IS_PLAYER_PLAYING(PLAYER_ID()) bFlag = IS_AMBIENT_SPEECH_DISABLED(PLAYER_PED_ID()) IF (bFlag) STOP_PED_SPEAKING(PLAYER_PED_ID(), FALSE) ENDIF PLAY_PED_AMBIENT_SPEECH(PLAYER_PED_ID(), "TAXI_CHANGE_DEST", SPEECH_PARAMS_FORCE_NORMAL_CLEAR) IF (bFlag) STOP_PED_SPEAKING(PLAYER_PED_ID(), TRUE) ENDIF iSpeechToPlay = TAXI_DIALOGUE_CHANGE_DEST_2 CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : PLAY_TAXI_DIALOGUE() - triggered player : ", "TAXI_DIALOGUE_CHANGE_DEST_1 context = TAXI_CHANGE_DEST ") ENDIF ELIF iSpeechToPlay = TAXI_DIALOGUE_CHANGE_DEST_2 IF IS_PLAYER_PLAYING(PLAYER_ID()) PLAYER_SAY_TAXI_DESTINATION() CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : PLAY_TAXI_DIALOGUE() - triggered : ", "TAXI_DIALOGUE_CHANGE_DEST_2") iSpeechToPlay = TAXI_DIALOGUE_CHANGE_DEST_3 ENDIF ELIF iSpeechToPlay = TAXI_DIALOGUE_CHANGE_DEST_3 PLAY_PED_AMBIENT_SPEECH(DriverID, "TAXID_CHANGE_DEST", SPEECH_PARAMS_FORCE_NORMAL_CLEAR) iSpeechToPlay = TAXI_DIALOGUE_WAIT_TO_FINISH CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : PLAY_TAXI_DIALOGUE() - triggered : ", "TAXI_DIALOGUE_CHANGE_DEST_3 context = TAXID_CHANGE_DEST ") ELIF iSpeechToPlay = TAXI_DIALOGUE_RUN_AWAY PLAY_PED_AMBIENT_SPEECH(DriverID, "TAXID_RUN_AWAY", SPEECH_PARAMS_FORCE_NORMAL_CLEAR) iSpeechToPlay = TAXI_DIALOGUE_WAIT_TO_FINISH CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : PLAY_TAXI_DIALOGUE() - triggered : ", "TAXI_DIALOGUE_RUN_AWAY context = TAXID_RUN_AWAY ") ELIF iSpeechToPlay = TAXI_DIALOGUE_OUT_EARLY PLAY_PED_AMBIENT_SPEECH(DriverID, "TAXID_GET_OUT_EARLY", SPEECH_PARAMS_FORCE_NORMAL_CLEAR) iSpeechToPlay = TAXI_DIALOGUE_WAIT_TO_FINISH CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : PLAY_TAXI_DIALOGUE() - triggered : ", "TAXI_DIALOGUE_OUT_EARLY context = TAXI_DIALOGUE_OUT_EARLY ") ELIF iSpeechToPlay = TAXI_DIALOGUE_TRASHED PLAY_PED_AMBIENT_SPEECH(DriverID, "TAXID_TRASHED", SPEECH_PARAMS_FORCE_NORMAL_CLEAR) iSpeechToPlay = TAXI_DIALOGUE_WAIT_TO_FINISH CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : PLAY_TAXI_DIALOGUE() - triggered : ", "TAXI_DIALOGUE_TRASHED context = TAXID_TRASHED ") ELIF iSpeechToPlay = TAXI_DIALOGUE_PART_JOURNEY IF NOT (g_bPlayerCannotAffordToSkip) PLAY_PED_AMBIENT_SPEECH(DriverID, "TAXID_AFFORD_PART_JOURNEY", SPEECH_PARAMS_FORCE_NORMAL_CLEAR) g_bPlayerCannotAffordToSkip = TRUE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : PLAY_TAXI_DIALOGUE() - triggered : ", "TAXI_DIALOGUE_PART_JOURNEY context = TAXID_AFFORD_PART_JOURNEY ") ENDIF iSpeechToPlay = TAXI_DIALOGUE_WAIT_TO_FINISH ELIF iSpeechToPlay = TAXI_DIALOGUE_FIRST_CAB PLAY_PED_AMBIENT_SPEECH(DriverID, "TAXID_TAKE_FIRST_CAB", SPEECH_PARAMS_FORCE_NORMAL_CLEAR) iSpeechToPlay = TAXI_DIALOGUE_WAIT_TO_FINISH CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : PLAY_TAXI_DIALOGUE() - triggered : ", "TAXI_DIALOGUE_FIRST_CAB context = TAXID_TAKE_FIRST_CAB ") ELIF iSpeechToPlay = TAXI_DIALOGUE_RADIO_1 //IF PLAY_SINGLE_SPEECH("TAX1_RADIO", nfScriptedSpeech, SPEECH_PRIORITY_AMBIENT_LOW) iSpeechToPlay = TAXI_DIALOGUE_RADIO_2 //ENDIF ELIF iSpeechToPlay = TAXI_DIALOGUE_RADIO_2 IF IS_RADIO_RETUNING() SETTIMERA(0) ELIF TIMERA() > 4000 IF IS_PLAYER_PLAYING(PLAYER_ID()) // has player been shut up for mission? bFlag = IS_AMBIENT_SPEECH_DISABLED(PLAYER_PED_ID()) //bFlag = TRUE IF (bFlag) STOP_PED_SPEAKING(PLAYER_PED_ID(), FALSE) ENDIF SWITCH GET_PLAYER_RADIO_STATION_INDEX() CASE 0 PLAY_PED_AMBIENT_SPEECH(PLAYER_PED_ID(), "RADIO_REQ_VIBE", SPEECH_PARAMS_FORCE_NORMAL_CLEAR) BREAK CASE 1 PLAY_PED_AMBIENT_SPEECH(PLAYER_PED_ID(), "RADIO_REQ_LRR", SPEECH_PARAMS_FORCE_NORMAL_CLEAR) BREAK CASE 2 PLAY_PED_AMBIENT_SPEECH(PLAYER_PED_ID(), "RADIO_REQ_JNR", SPEECH_PARAMS_FORCE_NORMAL_CLEAR) BREAK CASE 3 PLAY_PED_AMBIENT_SPEECH(PLAYER_PED_ID(), "RADIO_REQ_MASSIVEB", SPEECH_PARAMS_FORCE_NORMAL_CLEAR) BREAK CASE 4 PLAY_PED_AMBIENT_SPEECH(PLAYER_PED_ID(), "RADIO_REQ_K109", SPEECH_PARAMS_FORCE_NORMAL_CLEAR) BREAK CASE 5 PLAY_PED_AMBIENT_SPEECH(PLAYER_PED_ID(), "RADIO_REQ_WKTT", SPEECH_PARAMS_FORCE_NORMAL_CLEAR) BREAK CASE 6 PLAY_PED_AMBIENT_SPEECH(PLAYER_PED_ID(), "RADIO_REQ_LCHC", SPEECH_PARAMS_FORCE_NORMAL_CLEAR) BREAK CASE 7 PLAY_PED_AMBIENT_SPEECH(PLAYER_PED_ID(), "RADIO_REQ_JOURNEY", SPEECH_PARAMS_FORCE_NORMAL_CLEAR) BREAK CASE 8 PLAY_PED_AMBIENT_SPEECH(PLAYER_PED_ID(), "RADIO_REQ_FUSION", SPEECH_PARAMS_FORCE_NORMAL_CLEAR) BREAK CASE 9 PLAY_PED_AMBIENT_SPEECH(PLAYER_PED_ID(), "RADIO_REQ_BEAT", SPEECH_PARAMS_FORCE_NORMAL_CLEAR) BREAK CASE 10 PLAY_PED_AMBIENT_SPEECH(PLAYER_PED_ID(), "RADIO_REQ_BROKER", SPEECH_PARAMS_FORCE_NORMAL_CLEAR) BREAK CASE 11 PLAY_PED_AMBIENT_SPEECH(PLAYER_PED_ID(), "RADIO_REQ_VLADIVOSTOK", SPEECH_PARAMS_FORCE_NORMAL_CLEAR) BREAK CASE 12 PLAY_PED_AMBIENT_SPEECH(PLAYER_PED_ID(), "RADIO_REQ_PLR", SPEECH_PARAMS_FORCE_NORMAL_CLEAR) BREAK CASE 13 PLAY_PED_AMBIENT_SPEECH(PLAYER_PED_ID(), "RADIO_REQ_SANJUAN", SPEECH_PARAMS_FORCE_NORMAL_CLEAR) BREAK CASE 14 PLAY_PED_AMBIENT_SPEECH(PLAYER_PED_ID(), "RADIO_REQ_FRANCOIS", SPEECH_PARAMS_FORCE_NORMAL_CLEAR) BREAK CASE 15 PLAY_PED_AMBIENT_SPEECH(PLAYER_PED_ID(), "RADIO_REQ_CLASSICS", SPEECH_PARAMS_FORCE_NORMAL_CLEAR) BREAK ENDSWITCH IF (bFlag) STOP_PED_SPEAKING(PLAYER_PED_ID(), TRUE) ENDIF ENDIF iSpeechToPlay = TAXI_DIALOGUE_WAIT_TO_FINISH CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : PLAY_TAXI_DIALOGUE() - triggered player : ", "TAXI_DIALOGUE_RADIO_2 for radio index : ", GET_PLAYER_RADIO_STATION_INDEX()) ENDIF ELIF iSpeechToPlay = TAXI_DIALOGUE_RADIO_3 // IF PLAY_SINGLE_SPEECH("TAX1_RESP", nfScriptedSpeech, SPEECH_PRIORITY_AMBIENT_MEDIUM) iSpeechToPlay = TAXI_DIALOGUE_WAIT_TO_FINISH // ENDIF ELIF iSpeechToPlay = TAXI_DIALOGUE_STEP_ON_IT_1 IF IS_PLAYER_PLAYING(PLAYER_ID()) // has player been shut up for mission? bFlag = IS_AMBIENT_SPEECH_DISABLED(PLAYER_PED_ID()) //bFlag = TRUE IF (bFlag) STOP_PED_SPEAKING(PLAYER_PED_ID(), FALSE) ENDIF PLAY_PED_AMBIENT_SPEECH(PLAYER_PED_ID(), "TAXI_STEP_ON_IT", SPEECH_PARAMS_FORCE_NORMAL_CLEAR) IF (bFlag) STOP_PED_SPEAKING(PLAYER_PED_ID(), TRUE) ENDIF iSpeechToPlay = TAXI_DIALOGUE_STEP_ON_IT_2 CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : PLAY_TAXI_DIALOGUE() - triggered player : ", "TAXI_DIALOGUE_STEP_ON_IT_1 context = TAXI_STEP_ON_IT ") ENDIF ELIF iSpeechToPlay = TAXI_DIALOGUE_STEP_ON_IT_2 PLAY_PED_AMBIENT_SPEECH(DriverID, "TAXID_SPEED_UP", SPEECH_PARAMS_FORCE_NORMAL_CLEAR) iSpeechToPlay = TAXI_DIALOGUE_WAIT_TO_FINISH CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : PLAY_TAXI_DIALOGUE() - triggered : ", "TAXI_DIALOGUE_STEP_ON_IT_2 context = TAXID_SPEED_UP ") ELIF iSpeechToPlay = TAXI_DIALOGUE_THANKS IF IS_PLAYER_PLAYING(PLAYER_ID()) // has player been shut up for mission? bFlag = IS_AMBIENT_SPEECH_DISABLED(PLAYER_PED_ID()) //bFlag = TRUE IF (bFlag) STOP_PED_SPEAKING(PLAYER_PED_ID(), FALSE) ENDIF PLAY_PED_AMBIENT_SPEECH(PLAYER_PED_ID(), "THANKS", SPEECH_PARAMS_FORCE_NORMAL_CLEAR) IF (bFlag) STOP_PED_SPEAKING(PLAYER_PED_ID(), TRUE) ENDIF iSpeechToPlay = TAXI_DIALOGUE_WAIT_TO_FINISH CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : PLAY_TAXI_DIALOGUE() - triggered player : ", "TAXI_DIALOGUE_THANKS context = THANKS ") ENDIF ELIF iSpeechToPlay = TAXI_DIALOGUE_WAIT_TO_FINISH IF NOT IS_ANY_DIALOGUE_PLAYING(DriverID, FALSE) iSpeechToPlay = TAXI_DIALOGUE_NOTHING ENDIF ENDIF ENDIF //ELSE //iSpeechToPlay = TAXI_DIALOGUE_NOTHING ENDIF ENDIF ENDPROC PROC GET_GROUP_INTO_CAB(INT iTargetSeat) INT i, j PED_INDEX GroupPedID SEQUENCE_INDEX seq // if any group members they should also get in taxi IF DOES_GROUP_EXIST(PLAYER_GROUP_ID()) PRINTLN("<",GET_THIS_SCRIPT_NAME(), "> - DOES_GROUP_EXIST(PLAYER_GROUP_ID())") GET_GROUP_SIZE(PLAYER_GROUP_ID(), j, i) IF (i > 0) GroupPedID = GET_PED_AS_GROUP_MEMBER(PLAYER_GROUP_ID(), 0) IF NOT IS_PED_INJURED(GroupPedID) PRINTLN("<",GET_THIS_SCRIPT_NAME(),"> - IF NOT IS_PED_INJURED(GroupPedID)") CLEAR_PED_TASKS(GroupPedID) OPEN_SEQUENCE_TASK(seq) IF (iTargetSeat = 1) TASK_ENTER_VEHICLE(NULL, g_WaitingTaxi, DEFAULT_TIME_BEFORE_WARP, VS_BACK_RIGHT) #IF IS_DEBUG_BUILD printDebugString("TAXI TRIGGER - buddy entering taxi as passenger 2a \n") #endif ELSE TASK_ENTER_VEHICLE(NULL, g_WaitingTaxi, DEFAULT_TIME_BEFORE_WARP, VS_BACK_LEFT) #IF IS_DEBUG_BUILD printDebugString("TAXI TRIGGER - buddy entering taxi as passenger 2b \n") #endif ENDIF CLOSE_SEQUENCE_TASK(seq) TASK_PERFORM_SEQUENCE(GroupPedID, seq) CLEAR_SEQUENCE_TASK(seq) ENDIF IF (i > 1) GroupPedID = GET_PED_AS_GROUP_MEMBER(PLAYER_GROUP_ID(), 1) IF NOT IS_PED_INJURED(GroupPedID) OPEN_SEQUENCE_TASK(seq) TASK_ENTER_VEHICLE(NULL, g_WaitingTaxi, DEFAULT_TIME_BEFORE_WARP, VS_FRONT_RIGHT) CLOSE_SEQUENCE_TASK(seq) TASK_PERFORM_SEQUENCE(GroupPedID, seq) CLEAR_SEQUENCE_TASK(seq) printDebugString("TAXI TRIGGER - buddy entering taxi as front right \n") ENDIF ENDIF ENDIF ENDIF ENDPROC PROC CANCEL_GROUP_GETTING_INTO_CAB() INT i, j PED_INDEX GroupPedID // if any group members they should also get in taxi IF DOES_GROUP_EXIST(PLAYER_GROUP_ID()) GET_GROUP_SIZE(PLAYER_GROUP_ID(), j, i) IF (i > 0) GroupPedID = GET_PED_AS_GROUP_MEMBER(PLAYER_GROUP_ID(), 0) IF NOT IS_PED_INJURED(GroupPedID) CLEAR_PED_TASKS(GroupPedID) IF NOT IS_ENTITY_DEAD(g_WaitingTaxi) IF IS_PED_IN_VEHICLE(GroupPedID, g_WaitingTaxi) TASK_LEAVE_VEHICLE(GroupPedID, g_WaitingTaxi, ECF_DONT_WAIT_FOR_VEHICLE_TO_STOP) ENDIF ENDIF ENDIF IF (i > 1) GroupPedID = GET_PED_AS_GROUP_MEMBER(PLAYER_GROUP_ID(), 1) IF NOT IS_PED_INJURED(GroupPedID) CLEAR_PED_TASKS(GroupPedID) IF NOT IS_ENTITY_DEAD(g_WaitingTaxi) IF IS_PED_IN_VEHICLE(GroupPedID, g_WaitingTaxi) TASK_LEAVE_VEHICLE(GroupPedID, g_WaitingTaxi, ECF_DONT_WAIT_FOR_VEHICLE_TO_STOP) ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDPROC FUNC BOOL IS_BLIP_A_CUSTOM_MAP_BLIP//(BLIP_INDEX &inBlip, VECTOR &inCoord, FLOAT &inHeading) //// // manhattan gun shop // IF (inBlip = g_mapBlips[MB_GUNS_MH].blip) // inCoord = <<60.5485, -349.2893, 13.6821>> // inHeading = 347.5195 // RETURN(TRUE) // ENDIF RETURN(FALSE) ENDFUNC PROC RAISE_COORDS_IF_IN_SPECIFIC_RAISED_ARED(VECTOR &inCoord) IF ARE_COORDS_IN_3D_AREA(inCoord, <<827.205, -22.4701, -1000.0>> , <<870.0048, 40.8799, -100.0>>) #IF IS_DEBUG_BUILD printDebugString("ARE_COORDS_IN_SPECIFIC_RAISED_ARED = raised to 25.0 \n") #endif inCoord.z = 25.0 ENDIF ENDPROC FUNC BOOL ARE_COORDS_IN_A_SINGLE_LANE_AREA(VECTOR inCoord) IF inCoord.x > 0 ENDIF // For the bloody compiler // // charge island // IF ARE_COORDS_IN_3D_AREA(inCoord, <<433.0, 576.0, -1000.0>>, <<701.8750, 1144.0, -100.0>>) // #IF IS_DEBUG_BUILD // printDebugString("ARE_COORDS_IN_A_SINGLE_LANE_AREA = TRUE - charge island \n") // #endif // RETURN(TRUE) // ENDIF RETURN(FALSE) ENDFUNC FUNC BOOL ARE_COORDS_IN_DISABLE_NODES_AREA(VECTOR vInCoords) // down at docks IF ARE_COORDS_IN_3D_AREA(vInCoords, <<-1242.8979, 245.2448, -1000.0>>, <<-898.5730, 577.4948, -100.0>>) #IF IS_DEBUG_BUILD printDebugString("ARE_COORDS_IN_DISABLE_NODES_AREA = TRUE - docks area \n") #endif RETURN(TRUE) ENDIF RETURN(FALSE) ENDFUNC //FUNC BOOL IS_COORD_IN_ALLOWED_INTERIOR(VECTOR vInCoord) // IF (GET_INTERIOR_AT_COORDS (vInCoord) = NULL) // INTERIOR_INSTANCE_INDEX // ENDIF // RETURN FALSE //ENDFUNC FUNC BOOL IS_NODE_COORD_SUITABLE_FOR_TAXI(VECTOR vBlipCoord, VECTOR vInCoord) // IF NOT (GET_INTERIOR_AT_COORDS (vInCoord) = NULL) // printDebugString("IS_NODE_COORD_SUITABLE_FOR_TAXI - FALSE - in interior \n ") // // RETURN(FALSE) // ELSE IF (vInCoord.z > 0.0) VECTOR vec vec = vBlipCoord - vInCoord vec.z = 0.0 IF (VMAG2(vec) < (MINIMUM_DROP_OFF_DISTANCE_TO_COORD_WARPING * MINIMUM_DROP_OFF_DISTANCE_TO_COORD_WARPING)) printDebugString("IS_NODE_COORD_SUITABLE_FOR_TAXI - FALSE - too close \n ") RETURN(FALSE) ENDIF ELSE printDebugString("IS_NODE_COORD_SUITABLE_FOR_TAXI - FALSE - z less than zero \n ") RETURN(FALSE) ENDIF // ENDIF printDebugString("IS_NODE_COORD_SUITABLE_FOR_TAXI - TRUE \n ") RETURN(TRUE) ENDFUNC PROC ROTATE_VECTOR(VECTOR &InVec, VECTOR rotation) FLOAT CosAngle FLOAT SinAngle VECTOR ReturnVec // Rotation about the x axis CosAngle = COS(rotation.x) SinAngle = SIN(rotation.x) ReturnVec.x = InVec.x ReturnVec.y = (CosAngle * InVec.y) - (SinAngle * InVec.z) ReturnVec.z = (SinAngle * InVec.y) + (CosAngle * InVec.z) InVec = ReturnVec // Rotation about the y axis CosAngle = COS(rotation.y) SinAngle = SIN(rotation.y) ReturnVec.x = (CosAngle * InVec.x) + (SinAngle * InVec.z) ReturnVec.y = InVec.y ReturnVec.z = (CosAngle * InVec.z) - (SinAngle * InVec.x) InVec = ReturnVec // Rotation about the z axis CosAngle = COS(rotation.z) SinAngle = SIN(rotation.z) ReturnVec.x = (CosAngle * InVec.x) - (SinAngle * InVec.y) ReturnVec.y = (SinAngle * InVec.x) + (CosAngle * InVec.y) ReturnVec.z = InVec.z InVec = ReturnVec ENDPROC PROC SHIFT_COORD_TO_THE_RIGHT(VECTOR &vInCoord, FLOAT fInHeading, FLOAT fMetersToTheRight) VECTOR vec1 VECTOR vec2 vec1 = << 0.0, fMetersToTheRight, 0.0 >> vec2 = << 0.0, 0.0, (fInHeading - 90.0) >> ROTATE_VECTOR(vec1, vec2) vInCoord += vec1 ENDPROC FUNC BOOL IS_BLIP_VISIBLE(BLIP_INDEX inBlip) BLIP_DISPLAY ThisBlipDisplay IF DOES_BLIP_EXIST(inBlip) ThisBlipDisplay = GET_BLIP_INFO_ID_DISPLAY(inBlip) IF NOT (ThisBlipDisplay = DISPLAY_NOTHING) AND NOT (ThisBlipDisplay = DISPLAY_MARKER) RETURN(TRUE) ENDIF ENDIF RETURN(FALSE) ENDFUNC PROC DISABLE_TAXI_HAILING(BOOL bDisable = TRUE) IF bDisable g_sTaxiHailingDisabledByThisScript = GET_THIS_SCRIPT_NAME() g_bTaxiHailingIsDisabled = TRUE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : DISABLE_TAXI_HAILING() - g_bTaxiHailingIsDisabled = TRUE g_sTaxiHailingDisabledByThisScript = ", g_sTaxiHailingDisabledByThisScript) ELSE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : DISABLE_TAXI_HAILING() - g_bTaxiHailingIsDisabled = FALSE g_sTaxiHailingDisabledByThisScript = ", g_sTaxiHailingDisabledByThisScript) g_sTaxiHailingDisabledByThisScript = "NULL" g_bTaxiHailingIsDisabled = FALSE ENDIF ENDPROC /// PURPOSE: /// If the player is allowed to enter a taxi as a passenger /// checks status of g_bTaxiHailingIsUnlocked & g_bTaxiHailingIsDisabled /// RETURNS: /// TRUE if allowed to enter a taxi as a passenger FUNC BOOL IS_PLAYER_ALLOWED_TO_RIDE_IN_TAXIS() IF NOT g_bTaxiHailingIsUnlocked RETURN FALSE ENDIF IF g_bTaxiHailingIsDisabled RETURN FALSE ENDIF RETURN TRUE ENDFUNC FUNC INT COUNT_CONTACT_BLIPS_ON_RADAR() INT i INT iCount BLIP_INDEX TempBlip iCount = 0 REPEAT COUNT_OF(BLIP_SPRITE) i TempBlip = GET_FIRST_BLIP_INFO_ID(INT_TO_ENUM(BLIP_SPRITE, i)) WHILE DOES_BLIP_EXIST(TempBlip) eRADAR_BLIP_TYPE BlipType BlipType = GET_BLIP_INFO_ID_TYPE(TempBlip) IF (BlipType = BLIPTYPE_CONTACT) iCount++ ENDIF TempBlip = GET_NEXT_BLIP_INFO_ID(INT_TO_ENUM(BLIP_SPRITE, i)) ENDWHILE ENDREPEAT RETURN(iCount) ENDFUNC FUNC BOOL IS_BLIP_FRIENDLY(BLIP_INDEX radarBlip) IF GET_BLIP_HUD_COLOUR(radarBlip) = HUD_COLOUR_BLUE OR GET_BLIP_HUD_COLOUR(radarBlip) = HUD_COLOUR_BLUEDARK OR GET_BLIP_HUD_COLOUR(radarBlip) = HUD_COLOUR_BLUELIGHT OR GET_BLIP_HUD_COLOUR(radarBlip) = HUD_COLOUR_MENU_BLUE RETURN TRUE ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// check if blipIndex's colour is allowed for a standard blip (mission blip) /// RETURNS: /// TRUE if blip is blue(friendly entity) or yellow (destination) FUNC BOOL IS_BLIP_COLOUR_ALLOWED_FOR_STANDARD_BLIP(BLIP_INDEX &blipIndex) IF DOES_BLIP_EXIST(blipIndex) HUD_COLOURS eBlipColour = GET_BLIP_HUD_COLOUR(blipIndex) // support blue blips IF eBlipColour = HUD_COLOUR_BLUE OR eBlipColour = HUD_COLOUR_BLUEDARK OR eBlipColour = HUD_COLOUR_BLUELIGHT OR eBlipColour = HUD_COLOUR_MENU_BLUE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " IS_BLIP_COLOUR_ALLOWED_FOR_STANDARD_BLIP() : return TRUE : blip using HUD_COLOUR_BLUE...") RETURN TRUE // support yellow blips ELIF eBlipColour = HUD_COLOUR_YELLOW OR eBlipColour = HUD_COLOUR_YELLOWDARK OR eBlipColour = HUD_COLOUR_YELLOWLIGHT CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " IS_BLIP_COLOUR_ALLOWED_FOR_STANDARD_BLIP() : return TRUE : blip using HUD_COLOUR_YELLOW...") RETURN TRUE ENDIF ENDIF RETURN FALSE ENDFUNC FUNC INT COUNT_MISSION_BLIPS_ON_RADAR() INT iCount BLIP_INDEX tempBlip iCount = 0 tempBlip = GET_FIRST_BLIP_INFO_ID(taxiStandardBlipSprite) WHILE DOES_BLIP_EXIST(tempBlip) IF IS_BLIP_VISIBLE(tempBlip) IF (GET_BLIP_INFO_ID_TYPE(tempBlip) = BLIPTYPE_COORDS) OR (GET_BLIP_INFO_ID_TYPE(tempBlip) = BLIPTYPE_PICKUP) OR (GET_BLIP_INFO_ID_TYPE(tempBlip) = BLIPTYPE_OBJECT) iCount++ // PRINTSTRING("<") // PRINTSTRING(GET_THIS_SCRIPT_NAME()) // PRINTSTRING("> COUNT_MISSION_BLIPS_ON_RADAR() taxiStandardBlipSprite found. iCount = ") // PRINTINT(iCount) // PRINTNL() ENDIF IF (GET_BLIP_INFO_ID_TYPE(tempBlip) = BLIPTYPE_CHAR) OR (GET_BLIP_INFO_ID_TYPE(tempBlip) = BLIPTYPE_VEHICLE) IF IS_BLIP_FRIENDLY(tempBlip) iCount++ // PRINTSTRING("<") // PRINTSTRING(GET_THIS_SCRIPT_NAME()) // PRINTSTRING("> COUNT_MISSION_BLIPS_ON_RADAR() FRIENDLY taxiStandardBlipSprite found. iCount = ") // PRINTINT(iCount) // PRINTNL() ENDIF ENDIF ENDIF tempBlip = GET_NEXT_BLIP_INFO_ID(taxiStandardBlipSprite) ENDWHILE tempBlip = GET_FIRST_BLIP_INFO_ID(taxiWaypointBlipSprite) WHILE DOES_BLIP_EXIST(tempBlip) IF IS_BLIP_VISIBLE(tempBlip) IF (GET_BLIP_INFO_ID_TYPE(tempBlip) = BLIPTYPE_COORDS) iCount++ // PRINTSTRING("<") // PRINTSTRING(GET_THIS_SCRIPT_NAME()) // PRINTSTRING("> COUNT_MISSION_BLIPS_ON_RADAR() taxiWaypointBlipSprite found. iCount = ") // PRINTINT(iCount) // PRINTNL() ENDIF ENDIF tempBlip = GET_NEXT_BLIP_INFO_ID(taxiWaypointBlipSprite) ENDWHILE RETURN(iCount) ENDFUNC FUNC INT COUNT_ALL_OTHER_BLIPS_ON_RADAR() INT i INT iCount BLIP_INDEX TempBlip iCount = 0 // these relate to the enum in commands_ny, we are checking for all blip sprites between these 2 values. INT iStartSprite = ENUM_TO_INT(RADAR_TRACE_OBJECTIVE) INT iEndSprite = ENUM_TO_INT(MAX_RADAR_TRACES) REPEAT COUNT_OF(BLIP_SPRITE) i IF (i >= iStartSprite) AND (i <= iEndSprite) TempBlip = GET_FIRST_BLIP_INFO_ID(INT_TO_ENUM(BLIP_SPRITE, i)) WHILE DOES_BLIP_EXIST(TempBlip) eRADAR_BLIP_TYPE BlipType BlipType = GET_BLIP_INFO_ID_TYPE(TempBlip) IF NOT (BlipType = BLIPTYPE_CONTACT) iCount++ ENDIF TempBlip = GET_NEXT_BLIP_INFO_ID(INT_TO_ENUM(BLIP_SPRITE, i)) ENDWHILE ENDIF ENDREPEAT // PRINTSTRING("<") // PRINTSTRING(GET_THIS_SCRIPT_NAME()) // PRINTSTRING("> - COUNT_ALL_OTHER_BLIPS_ON_RADAR() = ") // PRINTINT(iCount) // PRINTNL() RETURN(iCount) ENDFUNC /// PURPOSE: /// clears the g_CustomDropOffBlip if it's doesn't exist PROC CLEAR_CUSTOM_DROP_OFF() // clear custom blip drop off if it doesn't exist IF NOT (g_CustomDropOffBlip = NULL) IF NOT DOES_BLIP_EXIST(g_CustomDropOffBlip) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : CLEAR_CUSTOM_DROP_OFF() set g_CustomDropOffBlip = NULL") g_CustomDropOffBlip = NULL ENDIF ENDIF ENDPROC /// PURPOSE: /// checks to see if this vehicle is suitable for player to enter as passenger /// PARAMS: /// vehicleIndex - the vehicle to check /// mnTaxi - what model the taxi needs to be /// mnTaxiDriver - what model the taxi driver needs to be /// RETURNS: /// TRUE if vehicle is suitable for player to enter FUNC BOOL IS_PLAYER_OK_TO_ENTER_VEHICLE_AS_PASSENGER(VEHICLE_INDEX &vehicleIndex, MODEL_NAMES mnTaxi, MODEL_NAMES mnTaxiDriver) PED_INDEX pedIndex LOCK_STATE vehLockState IF DOES_ENTITY_EXIST(vehicleIndex) IF IS_VEHICLE_DRIVEABLE(vehicleIndex) IF (GET_ENTITY_MODEL(vehicleIndex) = mnTaxi) pedIndex = GET_PED_IN_VEHICLE_SEAT(vehicleIndex) IF DOES_ENTITY_EXIST(pedIndex) IF NOT IS_PED_INJURED(pedIndex) IF NOT IS_PED_FLEEING(pedIndex) IF NOT IS_PED_IN_COMBAT(pedIndex) IF IS_PED_MODEL(pedIndex, mnTaxiDriver) IF IS_ENTITY_UPRIGHT(vehicleIndex) vehLockState = GET_VEHICLE_DOOR_LOCK_STATUS(vehicleIndex) IF (vehLockState != VEHICLELOCK_LOCKOUT_PLAYER_ONLY) AND (vehLockState != VEHICLELOCK_LOCKED) RETURN TRUE ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// checks to see if this vehicle is suitable for player to enter as passenger /// PARAMS: /// vehicleIndex - the vehicle to check /// pedIndex - the vehicle's driver /// mnTaxi - what model the taxi needs to be /// mnTaxiDriver - what model the taxi driver needs to be /// RETURNS: /// TRUE if vehicle is suitable for player to enter FUNC BOOL IS_TAXI_AND_DRIVER_OK_FOR_PLAYER_TO_ENTER_AS_PASSENGER(VEHICLE_INDEX &vehicleIndex, PED_INDEX &pedIndex, MODEL_NAMES mnTaxi, MODEL_NAMES mnTaxiDriver) IF DOES_ENTITY_EXIST(vehicleIndex) IF IS_VEHICLE_DRIVEABLE(vehicleIndex) IF DOES_ENTITY_EXIST(pedIndex) IF NOT IS_PED_INJURED(pedIndex) IF NOT IS_PED_FLEEING(pedIndex) IF NOT IS_PED_IN_COMBAT(pedIndex) IF IS_PED_SITTING_IN_VEHICLE(pedIndex, vehicleIndex) IF GET_ENTITY_MODEL(vehicleIndex) = mnTaxi IF IS_PED_MODEL(pedIndex, mnTaxiDriver) RETURN TRUE ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// handle getting the player's group members into the taxi /// PARAMS: /// vehIndexTaxi - the taxi entering NOTE: doesn't perform safety checks on vehicle /// eReservedPlayerSeat - Seat which player will be using PROC SET_PLAYER_GROUP_MEMBERS_INTO_TAXI(VEHICLE_INDEX &vehIndexTaxi, VEHICLE_SEAT eReservedPlayerSeat) INT i, j PED_INDEX GroupPedID PED_INDEX tempPed BOOL bApplyEnterTask VEHICLE_SEAT eTargetSeat IF DOES_GROUP_EXIST(PLAYER_GROUP_ID()) GET_GROUP_SIZE(PLAYER_GROUP_ID(), j, i) // take first member into the other back seat IF (i > 0) 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(vehIndexTaxi, eTargetSeat) IF DOES_ENTITY_EXIST(tempPed) // player already sitting in the seat IF (tempPed = PLAYER_PED_ID()) bApplyEnterTask = FALSE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : SET_PLAYER_GROUP_MEMBERS_INTO_TAXI : NOT tasked, player sat 1st group member eTargetSeat : ", eTargetSeat) // ped is already sitting in the seat ELIF (tempPed = GroupPedID) bApplyEnterTask = FALSE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : SET_PLAYER_GROUP_MEMBERS_INTO_TAXI : 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 CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : SET_PLAYER_GROUP_MEMBERS_INTO_TAXI : 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 CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : SET_PLAYER_GROUP_MEMBERS_INTO_TAXI : NOT tasked, 1st group member already running enter vehicle task") ENDIF IF bApplyEnterTask //CLEAR_PED_TASKS(GroupPedID) TASK_ENTER_VEHICLE(GroupPedID, vehIndexTaxi, DEFAULT_TIME_BEFORE_WARP, eTargetSeat, PEDMOVEBLENDRATIO_RUN, ECF_RESUME_IF_INTERRUPTED | ECF_BLOCK_SEAT_SHUFFLING | ECF_DONT_JACK_ANYONE) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : SET_PLAYER_GROUP_MEMBERS_INTO_TAXI : NOT tasked, 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(vehIndexTaxi, eTargetSeat) IF DOES_ENTITY_EXIST(tempPed) // player already sitting in the seat IF (tempPed = PLAYER_PED_ID()) bApplyEnterTask = FALSE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : SET_PLAYER_GROUP_MEMBERS_INTO_TAXI : NOT tasked, player sat 2nd group member eTargetSeat : ", eTargetSeat) // ped is already sitting in the seat ELIF (tempPed = GroupPedID) bApplyEnterTask = FALSE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : SET_PLAYER_GROUP_MEMBERS_INTO_TAXI : 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 CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : SET_PLAYER_GROUP_MEMBERS_INTO_TAXI : 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) /*IF IS_PED_GETTING_INTO_A_VEHICLE(GroupPedID) IF (GET_VEHICLE_PED_IS_ENTERING(GroupPedID) = vehTempPlayer) ENDIF ENDIF*/ bApplyEnterTask = FALSE CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : SET_PLAYER_GROUP_MEMBERS_INTO_TAXI : NOT tasked, 2nd group member already running enter vehicle task") ENDIF IF bApplyEnterTask //CLEAR_PED_TASKS(GroupPedID) TASK_ENTER_VEHICLE(GroupPedID, vehIndexTaxi, DEFAULT_TIME_BEFORE_WARP, eTargetSeat, PEDMOVEBLENDRATIO_RUN, ECF_RESUME_IF_INTERRUPTED | ECF_BLOCK_SEAT_SHUFFLING | ECF_DONT_JACK_ANYONE) CPRINTLN(DEBUG_TAXI_SERVICE, GET_THIS_SCRIPT_NAME(), " : SET_PLAYER_GROUP_MEMBERS_INTO_TAXI : NOT tasked, 2nd group member task applied eTargetSeat : ", eTargetSeat) ENDIF ENDIF ENDIF ENDIF ENDIF ENDPROC