2640 lines
111 KiB
Scheme
Executable File
2640 lines
111 KiB
Scheme
Executable File
USING "rage_builtins.sch"
|
|
USING "commands_camera.sch"
|
|
USING "model_enums.sch"
|
|
USING "commands_audio.sch"
|
|
USING "commands_debug.sch"
|
|
USING "commands_hud.sch"
|
|
USING "commands_misc.sch"
|
|
USING "commands_object.sch"
|
|
USING "commands_pad.sch"
|
|
USING "commands_path.sch"
|
|
USING "commands_ped.sch"
|
|
USING "commands_player.sch"
|
|
USING "commands_script.sch"
|
|
USING "commands_streaming.sch"
|
|
USING "commands_task.sch"
|
|
USING "commands_VEHICLE.sch"
|
|
USING "commands_zone.sch"
|
|
USING "dialogue_public.sch"
|
|
USING "globals.sch"
|
|
USING "script_player.sch"
|
|
USING "script_blips.sch"
|
|
USING "ambient_speech.sch"
|
|
USING "buddy_head_track_public.sch"
|
|
|
|
CONST_FLOAT BUDDY_WILL_GET_IN_SPECIFIC_VEHICLE_DIST 20.0
|
|
CONST_FLOAT BUDDY_SEPARATION_DIST 50.0
|
|
|
|
CONST_INT BS_PRINTED_LOSE_WANTED_LEVEL 0
|
|
CONST_INT BS_PLAYED_LOST_COPS_SPEECH 1
|
|
CONST_INT BS_INITIAL_GOD_TEXT_PRINTED 2
|
|
CONST_INT BS_PRINTED_GET_IN_VEHICLE 3
|
|
CONST_INT BS_PRINTED_GET_BACK_IN_VEHICLE 4
|
|
CONST_INT BS_PRINTED_PICKUP_ALL_BUDDY_TEXT 5
|
|
CONST_INT BS_USE_SPECIFIC_J_SKIP_COORDS 6
|
|
CONST_INT BS_DONT_DO_SAFE_FOR_CUTSCENE_CHECK 7
|
|
CONST_INT BS_LOCATES_HEADER_WIDGET_CREATED 8
|
|
CONST_INT BS_HAS_BEEN_IN_VEHICLE 9
|
|
CONST_INT BS_BUDDIES_WILL_WALK_TO_SPECIFIC_VEHICLE 10
|
|
CONST_INT BS_BUDDIES_WILL_ONLY_GET_IN_WHEN_PLAYER_DOES 11
|
|
CONST_INT BS_DO_LOCATES_ALMOST_STOPPED_CHECK 12
|
|
CONST_INT BS_PLAYER_IS_IN_VEHICLE_WITH_TOO_FEW_SEATS 13
|
|
CONST_INT BS_PRINTED_PICKUP_BUDDY_TEXT_0 14
|
|
CONST_INT BS_PRINTED_PICKUP_BUDDY_TEXT_1 15
|
|
CONST_INT BS_PRINTED_PICKUP_BUDDY_TEXT_2 16
|
|
CONST_INT BS_BUDDY_GIVEN_SPECIFIC_PASSENGER_INDEX_0 17
|
|
CONST_INT BS_BUDDY_GIVEN_SPECIFIC_PASSENGER_INDEX_1 18
|
|
CONST_INT BS_BUDDY_GIVEN_SPECIFIC_PASSENGER_INDEX_2 19
|
|
CONST_INT BS_DONT_DO_J_SKIP 20
|
|
CONST_INT BS_PLAYER_PRESSED_EXIT_BUT_STILL_IN_CAR 21
|
|
CONST_INT BS_PLAYER_STARTS_RIGHT_NEXT_TO_VEHICLE 22
|
|
CONST_INT BS_PLAYED_GET_BACK_IN_VEHICLE_SPEECH 23
|
|
CONST_INT BS_DONT_CLEAR_LOCATE_AREA_OF_VEHICLES 24
|
|
CONST_INT BS_WINDSCREEN_FLAGS_HAVE_BEEN_SET 25
|
|
CONST_INT BS_BUDDIES_WALK_TO_NEAREST_VEHICLE_AT_START 26
|
|
CONST_INT BS_BUDDIES_GIVEN_DEFAULT_PASSENGER_INDEX 27
|
|
CONST_INT BS_BUDDIES_SET_TO_ACTION_MODE 28
|
|
CONST_INT BS_BLOCK_BUDDIES_SETTING_TO_ACTION_MODE 29
|
|
CONST_INT BS_DONT_REMOVE_BUDDIES_FROM_GROUP_ON_CLEANUP 30
|
|
CONST_INT BS_PLAYER_IN_UNSUITABLE_VEHICLE 31
|
|
|
|
ENUM IS_ANY_TEXT_DISPLAYED_FLAGS
|
|
IAT_DO_ALL_CHECKS,
|
|
IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF,
|
|
IAT_IGNORE_DIALOGUE_IF_SUBTITLES_OFF
|
|
ENDENUM
|
|
|
|
STRUCT LOCATES_HEADER_DATA
|
|
BLIP_INDEX vehicleBlip
|
|
BLIP_INDEX BuddyBlipID[3]
|
|
BLIP_INDEX LocationBlip
|
|
BLIP_INDEX GPSBlipID
|
|
|
|
FLOAT fClearvehicleDistance = 10.0
|
|
FLOAT fBuddyJoinDistance = 20.0
|
|
FLOAT fSkipHeading
|
|
|
|
INT iGodTextTime
|
|
INT iLeftBuddyTime
|
|
INT iPrintedMissingBuddiesNumber
|
|
INT iLocatesBitSet // used for all the flags
|
|
INT iAmbientDialogueBitSet //Used for ambient scripts that replace god text with dialogue
|
|
|
|
BOOL bDontClearTasksIfEnteringNearestVehicle
|
|
|
|
PED_INDEX SpeakingBuddyID
|
|
PED_INDEX LocatesBuddyID[3]
|
|
|
|
VEHICLE_INDEX vehStartCar
|
|
|
|
VECTOR vSkipCoords
|
|
ENDSTRUCT
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
WIDGET_GROUP_ID LocatesWidgetID = NULL
|
|
#ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PROC SET_LOCATES_HEADER_WIDGET_GROUP(WIDGET_GROUP_ID parent_widget_group_id)
|
|
LocatesWidgetID = parent_widget_group_id
|
|
ENDPROC
|
|
|
|
PROC CREATE_LOCATES_HEADER_WIDGET(LOCATES_HEADER_DATA &locatesData)
|
|
IF NOT IS_BIT_SET(locatesData.iLocatesBitSet, BS_LOCATES_HEADER_WIDGET_CREATED)
|
|
IF (LocatesWidgetID != NULL)
|
|
SET_CURRENT_WIDGET_GROUP(LocatesWidgetID)
|
|
|
|
START_WIDGET_GROUP("Locates Header")
|
|
ADD_WIDGET_FLOAT_SLIDER("locatesData.fBuddyJoinDistance", locatesData.fBuddyJoinDistance, 0.0, 100.0, 0.1)
|
|
ADD_WIDGET_FLOAT_SLIDER("locatesData.fClearvehicleDistance", locatesData.fClearvehicleDistance, 0.0, 100.0, 0.1)
|
|
ADD_WIDGET_FLOAT_SLIDER("locatesData.fSkipHeading", locatesData.fSkipHeading, 0.0, 360.0, 0.1)
|
|
//ADD_WIDGET_INT_SLIDER("locatesData.iGodTextTime", locatesData.iGodTextTime, -10000, 10000, 1)
|
|
ADD_WIDGET_FLOAT_SLIDER("locatesData.vSkipCoords.x", locatesData.vSkipCoords.x, -9999.0, 9999.0, 0.1)
|
|
ADD_WIDGET_FLOAT_SLIDER("locatesData.vSkipCoords.y", locatesData.vSkipCoords.y, -9999.0, 9999.0, 0.1)
|
|
ADD_WIDGET_FLOAT_SLIDER("locatesData.vSkipCoords.z", locatesData.vSkipCoords.z, -9999.0, 9999.0, 0.1)
|
|
STOP_WIDGET_GROUP()
|
|
SET_BIT(locatesData.iLocatesBitSet, BS_LOCATES_HEADER_WIDGET_CREATED)
|
|
|
|
CLEAR_CURRENT_WIDGET_GROUP(LocatesWidgetID)
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
#ENDIF
|
|
|
|
FUNC BOOL HAS_PRINTED_PICKUP_BUDDY_TEXT(INT iIndex, LOCATES_HEADER_DATA &locatesData)
|
|
SWITCH iIndex
|
|
CASE 0
|
|
RETURN(IS_BIT_SET(locatesData.iLocatesBitSet, BS_PRINTED_PICKUP_BUDDY_TEXT_0))
|
|
BREAK
|
|
CASE 1
|
|
RETURN(IS_BIT_SET(locatesData.iLocatesBitSet, BS_PRINTED_PICKUP_BUDDY_TEXT_1))
|
|
BREAK
|
|
CASE 2
|
|
RETURN(IS_BIT_SET(locatesData.iLocatesBitSet, BS_PRINTED_PICKUP_BUDDY_TEXT_2))
|
|
BREAK
|
|
ENDSWITCH
|
|
RETURN(FALSE)
|
|
ENDFUNC
|
|
PROC CLEAR_BIT_PRINTED_PICKUP_BUDDY_TEXT(INT iIndex, LOCATES_HEADER_DATA &locatesData)
|
|
SWITCH iIndex
|
|
CASE 0
|
|
CLEAR_BIT(locatesData.iLocatesBitSet, BS_PRINTED_PICKUP_BUDDY_TEXT_0)
|
|
BREAK
|
|
CASE 1
|
|
CLEAR_BIT(locatesData.iLocatesBitSet, BS_PRINTED_PICKUP_BUDDY_TEXT_1)
|
|
BREAK
|
|
CASE 2
|
|
CLEAR_BIT(locatesData.iLocatesBitSet, BS_PRINTED_PICKUP_BUDDY_TEXT_2)
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDPROC
|
|
PROC SET_BIT_PRINTED_PICKUP_BUDDY_TEXT(INT iIndex, LOCATES_HEADER_DATA &locatesData)
|
|
SWITCH iIndex
|
|
CASE 0
|
|
SET_BIT(locatesData.iLocatesBitSet, BS_PRINTED_PICKUP_BUDDY_TEXT_0)
|
|
BREAK
|
|
CASE 1
|
|
SET_BIT(locatesData.iLocatesBitSet, BS_PRINTED_PICKUP_BUDDY_TEXT_1)
|
|
BREAK
|
|
CASE 2
|
|
SET_BIT(locatesData.iLocatesBitSet, BS_PRINTED_PICKUP_BUDDY_TEXT_2)
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDPROC
|
|
FUNC BOOL IS_BIT_SET_PRINTED_PICKUP_BUDDY_TEXT(INT iIndex, LOCATES_HEADER_DATA &locatesData)
|
|
SWITCH iIndex
|
|
CASE 0 RETURN(IS_BIT_SET(locatesData.iLocatesBitSet, BS_PRINTED_PICKUP_BUDDY_TEXT_0))
|
|
CASE 1 RETURN(IS_BIT_SET(locatesData.iLocatesBitSet, BS_PRINTED_PICKUP_BUDDY_TEXT_1))
|
|
CASE 2 RETURN(IS_BIT_SET(locatesData.iLocatesBitSet, BS_PRINTED_PICKUP_BUDDY_TEXT_2))
|
|
ENDSWITCH
|
|
RETURN(FALSE)
|
|
ENDFUNC
|
|
|
|
|
|
PROC CLEAR_BIT_BUDDY_GIVEN_SPECIFIC_PASSENGER_INDEX(INT iIndex, LOCATES_HEADER_DATA &locatesData)
|
|
SWITCH iIndex
|
|
CASE 0
|
|
CLEAR_BIT(locatesData.iLocatesBitSet, BS_BUDDY_GIVEN_SPECIFIC_PASSENGER_INDEX_0)
|
|
BREAK
|
|
CASE 1
|
|
CLEAR_BIT(locatesData.iLocatesBitSet, BS_BUDDY_GIVEN_SPECIFIC_PASSENGER_INDEX_1)
|
|
BREAK
|
|
CASE 2
|
|
CLEAR_BIT(locatesData.iLocatesBitSet, BS_BUDDY_GIVEN_SPECIFIC_PASSENGER_INDEX_2)
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDPROC
|
|
PROC SET_BIT_BUDDY_GIVEN_SPECIFIC_PASSENGER_INDEX(INT iIndex, LOCATES_HEADER_DATA &locatesData)
|
|
SWITCH iIndex
|
|
CASE 0
|
|
SET_BIT(locatesData.iLocatesBitSet, BS_BUDDY_GIVEN_SPECIFIC_PASSENGER_INDEX_0)
|
|
BREAK
|
|
CASE 1
|
|
SET_BIT(locatesData.iLocatesBitSet, BS_BUDDY_GIVEN_SPECIFIC_PASSENGER_INDEX_1)
|
|
BREAK
|
|
CASE 2
|
|
SET_BIT(locatesData.iLocatesBitSet, BS_BUDDY_GIVEN_SPECIFIC_PASSENGER_INDEX_2)
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDPROC
|
|
FUNC BOOL IS_BIT_SET_BUDDY_GIVEN_SPECIFIC_PASSENGER_INDEX(INT iIndex, LOCATES_HEADER_DATA &locatesData)
|
|
SWITCH iIndex
|
|
CASE 0 RETURN(IS_BIT_SET(locatesData.iLocatesBitSet, BS_BUDDY_GIVEN_SPECIFIC_PASSENGER_INDEX_0))
|
|
CASE 1 RETURN(IS_BIT_SET(locatesData.iLocatesBitSet, BS_BUDDY_GIVEN_SPECIFIC_PASSENGER_INDEX_1))
|
|
CASE 2 RETURN(IS_BIT_SET(locatesData.iLocatesBitSet, BS_BUDDY_GIVEN_SPECIFIC_PASSENGER_INDEX_2))
|
|
ENDSWITCH
|
|
RETURN(FALSE)
|
|
ENDFUNC
|
|
|
|
|
|
// ***************************************************************************
|
|
PROC SAFE_CLEAR_THIS_PRINT(STRING sInString)
|
|
IF NOT IS_STRING_NULL(sInString)
|
|
CLEAR_THIS_PRINT(sInString)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC TURN_ON_GPS_FOR_BLIP(BLIP_INDEX inBlip, LOCATES_HEADER_DATA &locatesData)
|
|
IF DOES_BLIP_EXIST(inBlip)
|
|
// switch off any existing route
|
|
IF DOES_BLIP_EXIST(locatesData.GPSBlipID)
|
|
SET_BLIP_ROUTE(locatesData.GPSBlipID, FALSE)
|
|
ENDIF
|
|
|
|
SET_GPS_MULTI_ROUTE_RENDER(FALSE)
|
|
CLEAR_GPS_MULTI_ROUTE()
|
|
|
|
locatesData.GPSBlipID = inBlip
|
|
SET_BLIP_ROUTE(inBlip, TRUE)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
FUNC BOOL IS_POINT_VISIBLE(VECTOR vecCoords, FLOAT radius, FLOAT fDist = 100.0)
|
|
IF IS_SPHERE_VISIBLE(vecCoords, radius)
|
|
IF NOT IS_ENTITY_AT_COORD(PLAYER_PED_ID(), vecCoords, <<fDist, fDist, fDist>>, FALSE, FALSE, TM_ANY)
|
|
RETURN(FALSE)
|
|
ELSE
|
|
IF IS_SCREEN_FADED_OUT()
|
|
RETURN(FALSE)
|
|
ELSE
|
|
RETURN(TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
RETURN(FALSE)
|
|
ENDFUNC
|
|
|
|
PROC CLEAR_MISSION_LOCATION_BLIP(LOCATES_HEADER_DATA &locatesData)
|
|
IF DOES_BLIP_EXIST(locatesData.LocationBlip)
|
|
REMOVE_BLIP(locatesData.LocationBlip)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC GIVE_VEHICLE_MINIMUM_HEALTH(VEHICLE_INDEX vehicleID)
|
|
FLOAT fHealth
|
|
IF IS_VEHICLE_DRIVEABLE(vehicleID)
|
|
fHealth = GET_VEHICLE_ENGINE_HEALTH(vehicleID)
|
|
IF (fHealth > 0.0)
|
|
PRINTSTRING("GIVE_VEHICLE_MINIMUM_HEALTH - fHealth = ")
|
|
PRINTFLOAT(fHealth)
|
|
PRINTNL()
|
|
//SET_ENTITY_HEALTH(vehicleID, 1)
|
|
SET_VEHICLE_ENGINE_ON(vehicleID, FALSE, TRUE)
|
|
SET_VEHICLE_ENGINE_HEALTH(vehicleID, -1000.0)
|
|
SET_VEHICLE_DAMAGE(vehicleID, <<0.0, 0.0, 0.0>>, 1000.0, 0.0, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC CLEAR_MISSION_LOCATE_STUFF(LOCATES_HEADER_DATA &locatesData, BOOL bRemoveBuddiesFromGroup = TRUE, BOOL bResetWindscreenFlags = FALSE)
|
|
IF IS_BIT_SET(locatesData.iLocatesBitSet, BS_DONT_REMOVE_BUDDIES_FROM_GROUP_ON_CLEANUP)
|
|
bRemoveBuddiesFromGroup = TRUE
|
|
ENDIF
|
|
|
|
INT i
|
|
CLEAR_MISSION_LOCATION_BLIP(locatesData)
|
|
REPEAT 3 i
|
|
IF DOES_BLIP_EXIST(locatesData.BuddyBlipID[i])
|
|
REMOVE_BLIP(locatesData.BuddyBlipID[i])
|
|
ENDIF
|
|
CLEAR_BIT_PRINTED_PICKUP_BUDDY_TEXT(i, locatesData)
|
|
CLEAR_BIT_BUDDY_GIVEN_SPECIFIC_PASSENGER_INDEX(i, locatesData)
|
|
ENDREPEAT
|
|
REPEAT 31 i
|
|
IF i != BS_LOCATES_HEADER_WIDGET_CREATED //Don't want to delete the widget
|
|
CLEAR_BIT(locatesData.iLocatesBitSet, i)
|
|
CLEAR_BIT(locatesData.iAmbientDialogueBitSet, i)
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
IF DOES_BLIP_EXIST(locatesData.vehicleBlip)
|
|
REMOVE_BLIP(locatesData.vehicleBlip)
|
|
ENDIF
|
|
|
|
locatesData.GPSBlipID = NULL
|
|
|
|
locatesData.iPrintedMissingBuddiesNumber = 0
|
|
locatesData.bDontClearTasksIfEnteringNearestVehicle = FALSE
|
|
|
|
// switch ambient anim blocking back on
|
|
REPEAT 3 i
|
|
IF NOT IS_PED_INJURED(locatesData.LocatesBuddyID[i])
|
|
SET_PED_CAN_PLAY_AMBIENT_ANIMS(locatesData.LocatesBuddyID[i], true)
|
|
SET_PED_CAN_PLAY_AMBIENT_BASE_ANIMS(locatesData.LocatesBuddyID[i], true)
|
|
IF bResetWindscreenFlags
|
|
SET_PED_CONFIG_FLAG(locatesData.LocatesBuddyID[i], PCF_WillFlyThroughWindscreen, TRUE)
|
|
SET_PED_CONFIG_FLAG(locatesData.LocatesBuddyID[i], PCF_DisableJumpingFromVehiclesAfterLeader, FALSE)
|
|
ENDIF
|
|
|
|
SET_PED_CONFIG_FLAG(locatesData.LocatesBuddyID[i], PCF_TeleportToLeaderVehicle, FALSE)
|
|
|
|
IF bRemoveBuddiesFromGroup
|
|
IF IS_PED_GROUP_MEMBER(locatesData.LocatesBuddyID[i], PLAYER_GROUP_ID())
|
|
AND locatesData.LocatesBuddyID[i] != PLAYER_PED_ID() //This is in case a switch took place, if a locates buddy is now the player then don't remove them from the group.
|
|
REMOVE_PED_FROM_GROUP(locatesData.LocatesBuddyID[i])
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_BIT_SET(locatesData.iLocatesBitSet, BS_BLOCK_BUDDIES_SETTING_TO_ACTION_MODE)
|
|
SET_PED_USING_ACTION_MODE(locatesData.LocatesBuddyID[i], FALSE)
|
|
ENDIF
|
|
|
|
//Fix for GTAV 682408: if the player uses the header, clears it, switches, then clears it again, one of the buddy IDs could now be the player. Make sure all the buddies are wiped on a clear.
|
|
locatesData.LocatesBuddyID[i] = NULL
|
|
ENDIF
|
|
ENDREPEAT
|
|
IF IS_PLAYER_PLAYING(PLAYER_ID())
|
|
SET_PED_CAN_PLAY_AMBIENT_ANIMS(PLAYER_PED_ID(), true)
|
|
SET_PED_CAN_PLAY_AMBIENT_BASE_ANIMS(player_ped_id(), true)
|
|
ENDIF
|
|
// set player will fly through windscreen
|
|
IF IS_PLAYER_PLAYING(PLAYER_ID())
|
|
IF bResetWindscreenFlags
|
|
SET_PED_CONFIG_FLAG(PLAYER_PED_ID(), PCF_WillFlyThroughWindscreen, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
locatesData.vehStartCar = NULL
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN("CLEAR_MISSION_LOCATE_STUFF called by: ", GET_THIS_SCRIPT_NAME())
|
|
#ENDIF
|
|
ENDPROC
|
|
|
|
PROC GOD_TEXT(LOCATES_HEADER_DATA &locatesData, STRING strMessage, BOOL bIsReminder = FALSE)
|
|
IF NOT (bIsReminder)
|
|
IF NOT IS_STRING_NULL(strMessage)
|
|
IF NOT ARE_STRINGS_EQUAL(strMessage, "")
|
|
PRINT_NOW(strMessage, DEFAULT_GOD_TEXT_TIME, 1)
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
//PRINT_NOW(strMessage, DEFAULT_REMINDER_TEXT_TIME, 1)
|
|
ENDIF
|
|
locatesData.iGodTextTime = GET_GAME_TIMER()
|
|
ENDPROC
|
|
|
|
PROC GOD_TEXT_FOR_CREW_MEMBER(LOCATES_HEADER_DATA &locatesData, STRING strMessage, STRING strCrewName, BOOL bIsReminder = FALSE)
|
|
IF NOT (bIsReminder)
|
|
IF NOT IS_STRING_NULL(strMessage)
|
|
IF NOT ARE_STRINGS_EQUAL(strMessage, "")
|
|
PRINT_STRING_IN_STRING_NOW(strMessage, strCrewName, DEFAULT_GOD_TEXT_TIME, 1)
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
//PRINT_NOW(strMessage, DEFAULT_REMINDER_TEXT_TIME, 1)
|
|
ENDIF
|
|
locatesData.iGodTextTime = GET_GAME_TIMER()
|
|
ENDPROC
|
|
|
|
PROC EMPTY_VEHICLE(VEHICLE_INDEX invehicle)
|
|
|
|
PED_INDEX temp_char
|
|
INT i
|
|
INT iMaxNumberOfPassengers
|
|
|
|
// clear tasks of any passengers or drivers
|
|
IF DOES_ENTITY_EXIST(invehicle)
|
|
IF IS_VEHICLE_DRIVEABLE(invehicle)
|
|
// driver
|
|
temp_char = GET_PED_IN_VEHICLE_SEAT(invehicle)
|
|
IF DOES_ENTITY_EXIST(temp_char)
|
|
IF NOT IS_PED_INJURED(temp_char)
|
|
CLEAR_PED_TASKS_IMMEDIATELY(temp_char)
|
|
ELSE
|
|
DELETE_PED(temp_char)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
iMaxNumberOfPassengers = GET_VEHICLE_MAX_NUMBER_OF_PASSENGERS(invehicle)
|
|
|
|
// passengers
|
|
REPEAT iMaxNumberOfPassengers i
|
|
IF NOT IS_VEHICLE_SEAT_FREE(invehicle, INT_TO_ENUM(VEHICLE_SEAT, i))
|
|
temp_char = GET_PED_IN_VEHICLE_SEAT(invehicle, INT_TO_ENUM(VEHICLE_SEAT, i))
|
|
IF DOES_ENTITY_EXIST(temp_char)
|
|
IF NOT IS_PED_INJURED(temp_char)
|
|
CLEAR_PED_TASKS_IMMEDIATELY(temp_char)
|
|
ELSE
|
|
DELETE_PED(temp_char)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
|
|
FUNC BOOL IS_CHAR_USING_SAME_VEHICLE_AS_PLAYER(PED_INDEX PedID)
|
|
VEHICLE_INDEX tempvehicle1
|
|
VEHICLE_INDEX tempvehicle2
|
|
IF IS_PLAYER_PLAYING(PLAYER_ID())
|
|
tempvehicle1 = GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID())
|
|
IF IS_VEHICLE_DRIVEABLE(tempvehicle1)
|
|
IF NOT IS_PED_INJURED(PedID)
|
|
tempvehicle2 = GET_VEHICLE_PED_IS_USING(PedID)
|
|
IF IS_VEHICLE_DRIVEABLE(tempvehicle2)
|
|
IF (tempvehicle1 = tempvehicle2)
|
|
IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), PedID, <<20.0, 20.0, 20.0>>, FALSE)
|
|
AND IS_ENTITY_AT_ENTITY(PedID, tempvehicle2, <<20.0, 20.0, 20.0>>, FALSE)
|
|
RETURN(TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
RETURN(FALSE)
|
|
ENDFUNC
|
|
|
|
FUNC BOOL IS_CHAR_USING_VEHICLE(PED_INDEX PedID, VEHICLE_INDEX vehicleID)
|
|
VEHICLE_INDEX temp_VEHICLE
|
|
IF NOT IS_PED_INJURED(PedID)
|
|
IF IS_VEHICLE_DRIVEABLE(vehicleID)
|
|
temp_VEHICLE = GET_VEHICLE_PED_IS_USING(PedID)
|
|
IF (temp_VEHICLE = vehicleID)
|
|
RETURN(TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
RETURN(FALSE)
|
|
ENDFUNC
|
|
|
|
FUNC BOOL IS_PED_IN_ANY_SPEEDING_VEHICLE(PED_INDEX ped, FLOAT fSpeedThreshold = 5.0)
|
|
IF IS_PED_IN_ANY_VEHICLE(ped)
|
|
VEHICLE_INDEX vehTemp = GET_VEHICLE_PED_IS_IN(ped)
|
|
|
|
IF NOT IS_ENTITY_DEAD(vehTemp)
|
|
IF GET_ENTITY_SPEED(vehTemp) > fSpeedThreshold
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
PROC STORE_EXISTING_VEHICLE_AND_EMPTY(VEHICLE_INDEX &Returnvehicle)
|
|
// store existing vehicle if there is one
|
|
IF IS_PLAYER_PLAYING(PLAYER_ID())
|
|
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
Returnvehicle = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
|
|
ENDIF
|
|
ENDIF
|
|
IF NOT DOES_ENTITY_EXIST(Returnvehicle)
|
|
Returnvehicle = GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID())
|
|
ENDIF
|
|
// clear tasks of any passengers or drivers
|
|
IF DOES_ENTITY_EXIST(Returnvehicle)
|
|
IF IS_VEHICLE_DRIVEABLE(Returnvehicle)
|
|
EMPTY_VEHICLE(Returnvehicle)
|
|
ELSE
|
|
Returnvehicle = NULL
|
|
ENDIF
|
|
ELSE
|
|
Returnvehicle = NULL
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC SAFE_WARP_PLAYER_TO_COORDINATE(VECTOR vecCoords, FLOAT fHead = 0.0)
|
|
vector ped_coords
|
|
vecCoords.z += 1.0
|
|
SET_PED_COORDS_KEEP_VEHICLE(PLAYER_PED_ID(), vecCoords)
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
|
|
REQUEST_COLLISION_AT_COORD(vecCoords)
|
|
LOAD_ALL_OBJECTS_NOW()
|
|
//LOAD_SCENE @_No_of_params (vecCoords)
|
|
ped_coords = GET_ENTITY_COORDS(PLAYER_PED_ID())
|
|
GET_GROUND_Z_FOR_3D_COORD(ped_coords, vecCoords.z)
|
|
SET_PED_COORDS_KEEP_VEHICLE(PLAYER_PED_ID(), <<ped_coords.x, ped_coords.y, vecCoords.z>>)
|
|
SET_ENTITY_HEADING(PLAYER_PED_ID(), fHead)
|
|
ENDPROC
|
|
|
|
PROC ENSURE_LOCATE_IS_CLEAR_OF_RANDOM_VEHICLES(VECTOR vecCoords, LOCATES_HEADER_DATA &locatesData)
|
|
IF NOT IS_BIT_SET(locatesData.iLocatesBitSet, BS_DONT_CLEAR_LOCATE_AREA_OF_VEHICLES)
|
|
IF NOT IS_POINT_VISIBLE(vecCoords, locatesData.fClearvehicleDistance)
|
|
IF NOT IS_ENTITY_AT_COORD(PLAYER_PED_ID(), vecCoords, <<50.0, 50.0, 50.0>>, FALSE, TRUE)
|
|
VEHICLE_INDEX Tempvehicle
|
|
Tempvehicle = GET_PLAYERS_LAST_VEHICLE()
|
|
IF DOES_ENTITY_EXIST(Tempvehicle)
|
|
IF NOT IS_ENTITY_DEAD(Tempvehicle)
|
|
IF NOT IS_ENTITY_AT_COORD(Tempvehicle, vecCoords, <<locatesData.fClearvehicleDistance, locatesData.fClearvehicleDistance, locatesData.fClearvehicleDistance>>, FALSE, TRUE)
|
|
CLEAR_AREA_OF_VEHICLES (vecCoords, locatesData.fClearvehicleDistance)
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
CLEAR_AREA_OF_VEHICLES(vecCoords, locatesData.fClearvehicleDistance)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
FUNC BOOL ARE_CHARS_IN_SAME_VEHICLE(PED_INDEX inPed1, PED_INDEX inPed2)
|
|
VEHICLE_INDEX Tempvehicle
|
|
IF NOT IS_PED_INJURED(inPed1)
|
|
IF IS_PED_IN_ANY_VEHICLE(inPed1)
|
|
Tempvehicle = GET_VEHICLE_PED_IS_IN(inPed1)
|
|
IF IS_VEHICLE_DRIVEABLE(Tempvehicle)
|
|
IF NOT IS_PED_INJURED(inPed2)
|
|
IF IS_PED_IN_VEHICLE(inPed2, Tempvehicle)
|
|
RETURN(TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
RETURN(FALSE)
|
|
ENDFUNC
|
|
|
|
FUNC BOOL ARE_CHARS_SITTING_IN_SAME_VEHICLE(PED_INDEX inPed1, PED_INDEX inPed2)
|
|
VEHICLE_INDEX Tempvehicle
|
|
IF NOT IS_PED_INJURED(inPed1)
|
|
IF IS_PED_SITTING_IN_ANY_VEHICLE(inPed1)
|
|
Tempvehicle = GET_VEHICLE_PED_IS_IN(inPed1)
|
|
IF IS_VEHICLE_DRIVEABLE(Tempvehicle)
|
|
IF NOT IS_PED_INJURED(inPed2)
|
|
IF IS_PED_SITTING_IN_VEHICLE(inPed2, Tempvehicle)
|
|
RETURN(TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
RETURN(FALSE)
|
|
ENDFUNC
|
|
|
|
FUNC BOOL IS_VEHICLE_ALMOST_STOPPED(VEHICLE_INDEX invehicle)
|
|
FLOAT fTemp
|
|
IF NOT IS_ENTITY_DEAD(invehicle)
|
|
fTemp = GET_ENTITY_SPEED(invehicle)
|
|
IF (fTemp > -0.5)
|
|
AND (fTemp < 0.5)
|
|
RETURN(TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
RETURN(FALSE)
|
|
ENDFUNC
|
|
|
|
FUNC BOOL IS_CHAR_ALMOST_STOPPED(PED_INDEX inChar)
|
|
FLOAT fTemp
|
|
IF NOT IS_PED_INJURED(inChar)
|
|
fTemp = GET_ENTITY_SPEED(inChar)
|
|
IF (fTemp > -0.5)
|
|
AND (fTemp < 0.5)
|
|
RETURN(TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
RETURN(FALSE)
|
|
ENDFUNC
|
|
|
|
FUNC BOOL ARE_CHARS_RIDING_TOGETHER(PED_INDEX inPed1, PED_INDEX inPed2, FLOAT fDist = 15.0)
|
|
VEHICLE_INDEX tempvehicle1
|
|
VEHICLE_INDEX tempvehicle2
|
|
VECTOR pos
|
|
IF NOT IS_PED_INJURED(inPed1)
|
|
IF NOT IS_PED_INJURED(inPed2)
|
|
IF IS_PED_SITTING_IN_ANY_VEHICLE(inPed1)
|
|
tempvehicle1 = GET_VEHICLE_PED_IS_IN(inPed1)
|
|
IF IS_PED_SITTING_IN_ANY_VEHICLE(inPed2)
|
|
tempvehicle2 = GET_VEHICLE_PED_IS_IN(inPed2)
|
|
IF IS_VEHICLE_DRIVEABLE(tempvehicle1)
|
|
AND IS_VEHICLE_DRIVEABLE(tempvehicle2)
|
|
IF (tempvehicle1 = tempvehicle2)
|
|
RETURN(TRUE)
|
|
ELSE
|
|
pos = GET_ENTITY_COORDS(tempvehicle1)
|
|
IF IS_ENTITY_AT_COORD(tempvehicle2, <<pos.x, pos.y, pos.z>>, <<fDist, fDist, 5.0>>, FALSE, TRUE)
|
|
RETURN(TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
RETURN(FALSE)
|
|
ENDFUNC
|
|
|
|
|
|
FUNC BOOL IS_BUDDY_IN_SAME_GROUP_MOVEMENT(PED_INDEX inBuddy, BOOL bPedsNeedToBeInVehicleWithPlayer = TRUE)
|
|
IF NOT IS_PED_INJURED(inBuddy)
|
|
IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
AND bPedsNeedToBeInVehicleWithPlayer
|
|
IF ARE_CHARS_SITTING_IN_SAME_VEHICLE(PLAYER_PED_ID(), inBuddy)
|
|
SET_GROUP_SEPARATION_RANGE(PLAYER_GROUP_ID(), BUDDY_SEPARATION_DIST)
|
|
RETURN(TRUE)
|
|
ENDIF
|
|
ELSE
|
|
IF IS_PED_GROUP_MEMBER(inBuddy, PLAYER_GROUP_ID())
|
|
SET_GROUP_SEPARATION_RANGE(PLAYER_GROUP_ID(), BUDDY_SEPARATION_DIST)
|
|
RETURN(TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
RETURN(TRUE)
|
|
ENDIF
|
|
RETURN(FALSE)
|
|
ENDFUNC
|
|
|
|
FUNC BOOL HAS_GOD_TEXT_JUST_BEEN_PRINTED(LOCATES_HEADER_DATA &locatesData)
|
|
INT iDiff
|
|
INT iCurrentTime
|
|
iCurrentTime = GET_GAME_TIMER()
|
|
iDiff = iCurrentTime - locatesData.iGodTextTime
|
|
IF (iDiff < 35)
|
|
RETURN(TRUE)
|
|
ENDIF
|
|
RETURN(FALSE)
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Checks if god text is displaying or a conversation is ongoing or queued. Will also check if any prints coming from the locates
|
|
/// header were triggered this frame, this check does nothing if the print didn't come from the locates header.
|
|
/// PARAMS:
|
|
/// locatesData - The locates header struct: used for checking if any locates header prints were triggered this frame.
|
|
/// eIsAnyTextFlag - Lets you modify the checks depending on if subtitles are enabled or not:
|
|
/// IAT_DO_ALL_CHECKS: does all checks (default).
|
|
/// IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF: Use this if you want to play a conversation over god text when subtitles are turned off.
|
|
/// IAT_IGNORE_DIALOGUE_IF_SUBTITLES_OFF: Use this if you want to print god text over a conversation when subtitles are turned off.
|
|
FUNC BOOL IS_ANY_TEXT_BEING_DISPLAYED(LOCATES_HEADER_DATA &locatesData, IS_ANY_TEXT_DISPLAYED_FLAGS eIsAnyTextFlag = IAT_DO_ALL_CHECKS)
|
|
//Check if any god text is being displayed (ignore if flag is set and subtitles are off).
|
|
IF (eIsAnyTextFlag != IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF OR IS_SUBTITLE_PREFERENCE_SWITCHED_ON())
|
|
//Normal messages.
|
|
IF IS_MESSAGE_BEING_DISPLAYED()
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
//Check if the locates header printed something this frame.
|
|
IF HAS_GOD_TEXT_JUST_BEEN_PRINTED(locatesData)
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Check if any conversations are ongoing (ignore if flag is set and subtitles are off).
|
|
IF (eIsAnyTextFlag != IAT_IGNORE_DIALOGUE_IF_SUBTITLES_OFF OR IS_SUBTITLE_PREFERENCE_SWITCHED_ON())
|
|
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND NOT IS_FACE_TO_FACE_CONVERSATION_PAUSED()
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL DOES_SPECIFIC_VEHICLE_EXIST_AND_IS_CHAR_IN_IT(PED_INDEX inChar, VEHICLE_INDEX invehicle)
|
|
IF NOT IS_PED_INJURED(inChar)
|
|
IF DOES_ENTITY_EXIST(invehicle)
|
|
IF IS_VEHICLE_DRIVEABLE(invehicle)
|
|
IF IS_PED_SITTING_IN_VEHICLE(inChar, invehicle)
|
|
RETURN(TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
RETURN(FALSE)
|
|
ENDFUNC
|
|
|
|
FUNC BOOL IS_BUDDY_PLAYING_AMBIENT_SPEECH(LOCATES_HEADER_DATA &locatesData)
|
|
IF NOT IS_PED_INJURED(locatesData.SpeakingBuddyID)
|
|
IF IS_AMBIENT_SPEECH_PLAYING(locatesData.SpeakingBuddyID)
|
|
RETURN(TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
RETURN(FALSE)
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SAFE_IS_THIS_PRINT_BEING_DISPLAYED(STRING sInString)
|
|
IF NOT IS_STRING_NULL(sInString)
|
|
IF IS_THIS_PRINT_BEING_DISPLAYED(sInString)
|
|
RETURN(TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
RETURN(FALSE)
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Checks all of the vehicle stuck timers, if any of them have ran out then the vehicle will be considered permanently stuck.
|
|
FUNC BOOL IS_VEHICLE_PERMANENTLY_STUCK(VEHICLE_INDEX &veh)
|
|
IF IS_VEHICLE_DRIVEABLE(veh)
|
|
IF IS_VEHICLE_STUCK_TIMER_UP(veh, VEH_STUCK_ON_ROOF, ROOF_TIME)
|
|
OR IS_VEHICLE_STUCK_TIMER_UP(veh, VEH_STUCK_JAMMED, JAMMED_TIME)
|
|
OR IS_VEHICLE_STUCK_TIMER_UP(veh, VEH_STUCK_HUNG_UP, HUNG_UP_TIME)
|
|
OR IS_VEHICLE_STUCK_TIMER_UP(veh, VEH_STUCK_ON_SIDE, SIDE_TIME)
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL OK_TO_PLAY_DIALOGUE_WITH_WANTED_LEVEL(LOCATES_HEADER_DATA &locatesData)
|
|
IF IS_BUDDY_PLAYING_AMBIENT_SPEECH()
|
|
OR IS_BIT_SET(locatesData.iLocatesBitSet, BS_PLAYED_LOST_COPS_SPEECH)
|
|
RETURN(FALSE)
|
|
ENDIF
|
|
IF IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
|
|
AND NOT IS_BIT_SET(locatesData.iLocatesBitSet, BS_PRINTED_LOSE_WANTED_LEVEL)
|
|
AND NOT SAFE_IS_THIS_PRINT_BEING_DISPLAYED("LOSE_WANTED")
|
|
RETURN(FALSE)
|
|
ENDIF
|
|
RETURN(TRUE)
|
|
ENDFUNC
|
|
|
|
PROC UPDATE_CHARS_TO_NOT_FLY_THROUGH_WINDSCREEN(LOCATES_HEADER_DATA &locatesData)
|
|
IF NOT IS_BIT_SET(locatesData.iLocatesBitSet, BS_WINDSCREEN_FLAGS_HAVE_BEEN_SET)
|
|
INT i
|
|
IF IS_PLAYER_PLAYING(PLAYER_ID())
|
|
SET_PED_CONFIG_FLAG(PLAYER_PED_ID(), PCF_WillFlyThroughWindscreen, FALSE)
|
|
ENDIF
|
|
REPEAT 3 i
|
|
IF DOES_ENTITY_EXIST(locatesData.LocatesBuddyID[i])
|
|
IF NOT IS_PED_INJURED(locatesData.LocatesBuddyID[i])
|
|
SET_PED_CONFIG_FLAG(locatesData.LocatesBuddyID[i], PCF_WillFlyThroughWindscreen, FALSE)
|
|
SET_PED_CONFIG_FLAG(locatesData.LocatesBuddyID[i], PCF_DisableJumpingFromVehiclesAfterLeader, TRUE)
|
|
SET_PED_CONFIG_FLAG(locatesData.LocatesBuddyID[i], PCF_TeleportToLeaderVehicle, TRUE)
|
|
SET_PED_GET_OUT_UPSIDE_DOWN_VEHICLE(locatesData.LocatesBuddyID[i], FALSE) //GTAV 766697 - If the peds were warped directly into the car this flag wasn't set.
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
SET_BIT(locatesData.iLocatesBitSet, BS_WINDSCREEN_FLAGS_HAVE_BEEN_SET)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
FUNC BOOL DOES_VEHICLE_HAVE_ENOUGH_SEATS(VEHICLE_INDEX vehicleID, LOCATES_HEADER_DATA &locatesData, INT iMinRequiredSeats = 0)
|
|
INT iNumberOfBuddies
|
|
INT iMaxPassengers
|
|
INT i
|
|
IF IS_VEHICLE_DRIVEABLE(vehicleID)
|
|
iNumberOfBuddies = 0
|
|
REPEAT 3 i
|
|
IF DOES_ENTITY_EXIST(locatesData.LocatesBuddyID[i])
|
|
iNumberOfBuddies++
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
iMaxPassengers = GET_VEHICLE_MAX_NUMBER_OF_PASSENGERS(vehicleID)
|
|
IF (iMinRequiredSeats > 0)
|
|
IF (iMaxPassengers >= iMinRequiredSeats)
|
|
IF iMinRequiredSeats > 1
|
|
IF NOT IS_SEAT_WARP_ONLY(vehicleID, VS_BACK_LEFT) //Additional check: some cars have seats that are are only accessible by warping.
|
|
RETURN TRUE
|
|
ENDIF
|
|
ELSE
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF (iMaxPassengers >= iNumberOfBuddies)
|
|
IF iNumberOfBuddies > 1
|
|
IF NOT IS_SEAT_WARP_ONLY(vehicleID, VS_BACK_LEFT)
|
|
RETURN TRUE
|
|
ENDIF
|
|
ELSE
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL private_IS_VEHICLE_AN_OCCUPIED_BUS(VEHICLE_INDEX veh, LOCATES_HEADER_DATA &locatesData)
|
|
IF IS_VEHICLE_DRIVEABLE(veh)
|
|
IF GET_ENTITY_MODEL(veh) = BUS
|
|
OR GET_ENTITY_MODEL(veh) = COACH
|
|
INT iNumFreeSeatsRequired = 0
|
|
INT iNumFreeSeats = 0
|
|
INT i = 0
|
|
|
|
REPEAT 3 i
|
|
IF NOT IS_PED_INJURED(locatesData.LocatesBuddyID[i])
|
|
iNumFreeSeatsRequired++
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
PED_INDEX ped1 = GET_PED_IN_VEHICLE_SEAT(veh, VS_FRONT_RIGHT)
|
|
|
|
IF NOT IS_PED_INJURED(ped1)
|
|
IF ped1 = locatesData.LocatesBuddyID[0]
|
|
OR ped1 = locatesData.LocatesBuddyID[1]
|
|
OR ped1 = locatesData.LocatesBuddyID[2]
|
|
iNumFreeSeats++
|
|
ENDIF
|
|
ELSE
|
|
iNumFreeSeats++
|
|
ENDIF
|
|
|
|
PED_INDEX ped2 = GET_PED_IN_VEHICLE_SEAT(veh, VS_BACK_LEFT)
|
|
|
|
IF NOT IS_PED_INJURED(ped2)
|
|
IF ped2 = locatesData.LocatesBuddyID[0]
|
|
OR ped2 = locatesData.LocatesBuddyID[1]
|
|
OR ped2 = locatesData.LocatesBuddyID[2]
|
|
iNumFreeSeats++
|
|
ENDIF
|
|
ELSE
|
|
iNumFreeSeats++
|
|
ENDIF
|
|
|
|
PED_INDEX ped3 = GET_PED_IN_VEHICLE_SEAT(veh, VS_BACK_RIGHT)
|
|
|
|
IF NOT IS_PED_INJURED(ped3)
|
|
IF ped3 = locatesData.LocatesBuddyID[0]
|
|
OR ped3 = locatesData.LocatesBuddyID[1]
|
|
OR ped3 = locatesData.LocatesBuddyID[2]
|
|
iNumFreeSeats++
|
|
ENDIF
|
|
ELSE
|
|
iNumFreeSeats++
|
|
ENDIF
|
|
|
|
IF iNumFreeSeats < iNumFreeSeatsRequired
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL IS_PLAYER_USING_A_VEHICLE_WITH_ENOUGH_SEATS(LOCATES_HEADER_DATA &locatesData)
|
|
VEHICLE_INDEX temp_VEHICLE
|
|
temp_VEHICLE = GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID())
|
|
IF DOES_VEHICLE_HAVE_ENOUGH_SEATS(temp_VEHICLE, locatesData)
|
|
RETURN(TRUE)
|
|
ENDIF
|
|
RETURN(FALSE)
|
|
ENDFUNC
|
|
|
|
FUNC BOOL IS_PLAYER_IN_A_VEHICLE_WITH_ENOUGH_SEATS(LOCATES_HEADER_DATA &locatesData, INT iMinRequiredSeats = 0)
|
|
VEHICLE_INDEX temp_VEHICLE
|
|
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
temp_VEHICLE = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
|
|
IF DOES_VEHICLE_HAVE_ENOUGH_SEATS(temp_VEHICLE, locatesData, iMinRequiredSeats)
|
|
RETURN(TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
RETURN(FALSE)
|
|
ENDFUNC
|
|
|
|
FUNC BOOL IS_PLAYER_SITTING_IN_A_VEHICLE_WITH_ENOUGH_SEATS(LOCATES_HEADER_DATA &locatesData)
|
|
VEHICLE_INDEX temp_VEHICLE
|
|
IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
temp_VEHICLE = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
|
|
IF DOES_VEHICLE_HAVE_ENOUGH_SEATS(temp_VEHICLE, locatesData)
|
|
RETURN(TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
RETURN(FALSE)
|
|
ENDFUNC
|
|
|
|
FUNC BOOL IS_BUDDY_GOOD_TO_JOIN_PLAYERS_GROUP(LOCATES_HEADER_DATA &locatesData, PED_INDEX inChar, FLOAT fJoinDistance, BOOL bIgnoreIfPlayerInvehicle = FALSE)
|
|
VEHICLE_INDEX Tempvehicle
|
|
IF NOT IS_PED_INJURED(inChar)
|
|
IF IS_PED_SITTING_IN_ANY_VEHICLE(inChar)
|
|
Tempvehicle = GET_VEHICLE_PED_IS_IN(inChar)
|
|
IF NOT IS_ENTITY_DEAD(Tempvehicle)
|
|
IF IS_VEHICLE_DRIVEABLE(Tempvehicle)
|
|
IF IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), Tempvehicle)
|
|
IF IS_PLAYER_SITTING_IN_A_VEHICLE_WITH_ENOUGH_SEATS(locatesData)
|
|
RETURN(TRUE)
|
|
ENDIF
|
|
ELIF bIgnoreIfPlayerInvehicle
|
|
RETURN(TRUE)
|
|
ENDIF
|
|
ELSE
|
|
//--Added to fix 18898. Buddies will rejoin player's group if they are sat in a non-driveable vehicle.
|
|
IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), inChar, <<fJoinDistance, fJoinDistance, 3.0>>, FALSE)
|
|
RETURN(TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), inChar, <<fJoinDistance, fJoinDistance, 3.0>>, FALSE)
|
|
IF NOT (bIgnoreIfPlayerInvehicle)
|
|
Tempvehicle = GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID())
|
|
|
|
IF DOES_ENTITY_EXIST(Tempvehicle)
|
|
IF DOES_VEHICLE_HAVE_ENOUGH_SEATS(Tempvehicle, locatesData)
|
|
IF IS_VEHICLE_DRIVEABLE(Tempvehicle)
|
|
IF IS_VEHICLE_ALMOST_STOPPED(Tempvehicle)
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
RETURN TRUE
|
|
ENDIF
|
|
ELSE
|
|
RETURN(TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
RETURN(FALSE)
|
|
ENDFUNC
|
|
|
|
PROC UPDATE_AMBIENT_ANIM_BLOCKING(LOCATES_HEADER_DATA &locatesData)
|
|
INT i
|
|
REPEAT 3 i
|
|
IF DOES_ENTITY_EXIST(locatesData.LocatesBuddyID[i])
|
|
IF NOT IS_PED_INJURED(locatesData.LocatesBuddyID[i])
|
|
IF IS_PED_SITTING_IN_ANY_VEHICLE(locatesData.LocatesBuddyID[i])
|
|
//AND HAS_PED_BEEN_ADDED_FOR_SCRIPTED_SPEECH(locatesData.LocatesBuddyID[i])
|
|
//AND IS_ANY_SPEECH_CURRENTLY_PLAYING_OR_ABOUT_TO_PLAY()
|
|
SET_PED_CAN_PLAY_AMBIENT_ANIMS(locatesData.LocatesBuddyID[i], false)
|
|
SET_PED_CAN_PLAY_AMBIENT_BASE_ANIMS(locatesData.LocatesBuddyID[i], false)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
IF IS_PLAYER_PLAYING(PLAYER_ID())
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
//AND HAS_PED_BEEN_ADDED_FOR_SCRIPTED_SPEECH(PLAYER_PED_ID())
|
|
//AND IS_ANY_SPEECH_CURRENTLY_PLAYING_OR_ABOUT_TO_PLAY()
|
|
SET_PED_CAN_PLAY_AMBIENT_ANIMS(PLAYER_PED_ID(), false)
|
|
SET_PED_CAN_PLAY_AMBIENT_BASE_ANIMS(player_ped_id(), false)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
FUNC BOOL IS_THIS_BLIP_A_VEHICLE(BLIP_INDEX iBlipID)
|
|
eRADAR_BLIP_TYPE thisBlipType
|
|
IF DOES_BLIP_EXIST(iBlipID)
|
|
thisBlipType = GET_BLIP_INFO_ID_TYPE(iBlipID)
|
|
IF (thisBlipType = BLIPTYPE_VEHICLE)
|
|
RETURN(TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
RETURN(FALSE)
|
|
ENDFUNC
|
|
|
|
FUNC BOOL IS_THIS_BLIP_A_LOCATION(BLIP_INDEX iBlipID)
|
|
eRADAR_BLIP_TYPE thisBlipType
|
|
IF DOES_BLIP_EXIST(iBlipID)
|
|
thisBlipType = GET_BLIP_INFO_ID_TYPE(iBlipID)
|
|
IF (thisBlipType = BLIPTYPE_COORDS)
|
|
OR (thisBlipType = BLIPTYPE_CONTACT)
|
|
RETURN(TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
RETURN(FALSE)
|
|
ENDFUNC
|
|
|
|
|
|
//PROC SET_TAXI_DROPOFF_FOR_LOCATES_HEADER(LOCATES_HEADER_DATA &locatesData, VECTOR vPosition, FLOAT fHeading)
|
|
// IF DOES_BLIP_EXIST(locatesData.LocationBlip)
|
|
// IF IS_THIS_BLIP_A_LOCATION(locatesData.LocationBlip)
|
|
// SET_TAXI_DROPOFF_LOCATION_FOR_BLIP(locatesData.LocationBlip, vPosition, fHeading)
|
|
// ENDIF
|
|
// ENDIF
|
|
//ENDPROC
|
|
#IF IS_DEBUG_BUILD
|
|
PROC SET_THESE_J_SKIP_COORDS(VECTOR vecCoords, FLOAT fHead, LOCATES_HEADER_DATA &locatesData)
|
|
locatesData.vSkipCoords = vecCoords
|
|
locatesData.fSkipHeading = fHead
|
|
SET_BIT(locatesData.iLocatesBitSet, BS_USE_SPECIFIC_J_SKIP_COORDS)
|
|
ENDPROC
|
|
|
|
PROC DONT_DO_J_SKIP(LOCATES_HEADER_DATA &locatesData)
|
|
SET_BIT(locatesData.iLocatesBitSet, BS_DONT_DO_J_SKIP)
|
|
ENDPROC
|
|
|
|
PROC J_SKIP_LH(VECTOR vecCoords, LOCATES_HEADER_DATA &locatesData, BOOL bOnFoot = FALSE, VEHICLE_INDEX SpecificvehicleID = NULL)
|
|
INT i
|
|
VEHICLE_INDEX temp_VEHICLE
|
|
VECTOR pos
|
|
FLOAT fHeading
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
CREATE_LOCATES_HEADER_WIDGET(locatesData)
|
|
#ENDIF
|
|
|
|
IF NOT IS_BIT_SET(locatesData.iLocatesBitSet, BS_DONT_DO_J_SKIP)
|
|
|
|
IF IS_BIT_SET(locatesData.iLocatesBitSet, BS_USE_SPECIFIC_J_SKIP_COORDS)
|
|
vecCoords.x = locatesData.vSkipCoords.x
|
|
vecCoords.y = locatesData.vSkipCoords.y
|
|
vecCoords.z = locatesData.vSkipCoords.z
|
|
fHeading = locatesData.fSkipHeading
|
|
CLEAR_BIT(locatesData.iLocatesBitSet, BS_USE_SPECIFIC_J_SKIP_COORDS)
|
|
ELSE
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
fHeading = GET_ENTITY_HEADING(PLAYER_PED_ID())
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_SCREEN_FADED_IN()
|
|
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_J)
|
|
PRINTLN("J_SKIP - called")
|
|
DO_SCREEN_FADE_OUT(500)
|
|
WHILE NOT IS_SCREEN_FADED_OUT()
|
|
WAIT(0)
|
|
ENDWHILE
|
|
CLEAR_PLAYER_WANTED_LEVEL(PLAYER_ID())
|
|
STORE_EXISTING_VEHICLE_AND_EMPTY(temp_VEHICLE)
|
|
|
|
WAIT(500)
|
|
|
|
LOAD_SCENE(vecCoords)
|
|
|
|
IF (bOnFoot)
|
|
PRINTLN("J_SKIP - onFoot = TRUE")
|
|
SAFE_WARP_PLAYER_TO_COORDINATE(vecCoords)
|
|
REPEAT 3 i
|
|
IF NOT IS_PED_INJURED(locatesData.LocatesBuddyID[i])
|
|
CLEAR_PED_TASKS_IMMEDIATELY(locatesData.LocatesBuddyID[i])
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
pos = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(PLAYER_PED_ID(), <<0.0, (1.0 + TO_FLOAT(i)), 0.0>>)
|
|
SET_PED_COORDS_KEEP_VEHICLE(locatesData.LocatesBuddyID[i], <<pos.x, pos.y, pos.z>>)
|
|
SET_ENTITY_HEADING(locatesData.LocatesBuddyID[i], fHeading)
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
ELSE
|
|
IF DOES_ENTITY_EXIST(SpecificvehicleID)
|
|
PRINTLN("J_SKIP - SpecificvehicleID exists")
|
|
IF IS_VEHICLE_DRIVEABLE(SpecificvehicleID)
|
|
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
|
|
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), SpecificvehicleID)
|
|
REPEAT 3 i
|
|
IF DOES_ENTITY_EXIST(locatesData.LocatesBuddyID[i])
|
|
IF NOT IS_PED_INJURED(locatesData.LocatesBuddyID[i])
|
|
CLEAR_PED_TASKS_IMMEDIATELY(locatesData.LocatesBuddyID[i])
|
|
SET_PED_INTO_VEHICLE(locatesData.LocatesBuddyID[i], SpecificvehicleID, INT_TO_ENUM(VEHICLE_SEAT, i))
|
|
SET_PED_GET_OUT_UPSIDE_DOWN_VEHICLE(locatesData.LocatesBuddyID[i], FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
SAFE_WARP_PLAYER_TO_COORDINATE(vecCoords, fHeading)
|
|
IF IS_VEHICLE_DRIVEABLE(SpecificvehicleID)
|
|
SET_ENTITY_COORDS(SpecificvehicleID, vecCoords)
|
|
ENDIF
|
|
ELSE
|
|
PRINTLN("J_SKIP - searching for temp_VEHICLE")
|
|
IF DOES_ENTITY_EXIST(temp_VEHICLE)
|
|
IF NOT IS_VEHICLE_DRIVEABLE(temp_VEHICLE)
|
|
PRINTLN("J_SKIP - temp_VEHICLE existed but not driveable")
|
|
temp_VEHICLE = NULL
|
|
ENDIF
|
|
ENDIF
|
|
IF NOT DOES_ENTITY_EXIST(temp_VEHICLE)
|
|
PRINTLN("J_SKIP - creating new temp_VEHICLE")
|
|
REQUEST_MODEL(EMPEROR)
|
|
WHILE NOT HAS_MODEL_LOADED(EMPEROR)
|
|
WAIT(0)
|
|
ENDWHILE
|
|
temp_VEHICLE = CREATE_VEHICLE(EMPEROR, vecCoords, 0.0, FALSE)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(EMPEROR)
|
|
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
|
|
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), temp_VEHICLE)
|
|
SET_VEHICLE_AS_NO_LONGER_NEEDED(temp_VEHICLE)
|
|
ELSE
|
|
PRINTLN("J_SKIP - temp_VEHICLE exists")
|
|
IF IS_VEHICLE_DRIVEABLE(temp_VEHICLE)
|
|
PRINTLN("J_SKIP - temp_VEHICLE is driveable")
|
|
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
|
|
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), temp_VEHICLE)
|
|
ENDIF
|
|
ENDIF
|
|
REPEAT 3 i
|
|
IF DOES_ENTITY_EXIST(locatesData.LocatesBuddyID[i])
|
|
IF NOT IS_PED_INJURED(locatesData.LocatesBuddyID[i])
|
|
PRINTLN("J_SKIP - buddy exists, clearing tasks.")
|
|
CLEAR_PED_TASKS_IMMEDIATELY(locatesData.LocatesBuddyID[i])
|
|
IF IS_VEHICLE_DRIVEABLE(temp_VEHICLE)
|
|
SET_PED_INTO_VEHICLE(locatesData.LocatesBuddyID[i], temp_VEHICLE, INT_TO_ENUM(VEHICLE_SEAT, i))
|
|
ELSE
|
|
PRINTLN("J_SKIP - buddy exists, clearing tasks.")
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
REPEAT 3 i
|
|
IF DOES_ENTITY_EXIST(locatesData.LocatesBuddyID[i])
|
|
IF NOT IS_PED_INJURED(locatesData.LocatesBuddyID[i])
|
|
IF IS_VEHICLE_DRIVEABLE(temp_VEHICLE)
|
|
PRINTLN("J_SKIP - warping buddy into vehicle")
|
|
SET_PED_INTO_VEHICLE(locatesData.LocatesBuddyID[i], temp_VEHICLE, INT_TO_ENUM(VEHICLE_SEAT, i))
|
|
//VEHICLE_SEAT
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
IF IS_VEHICLE_DRIVEABLE(temp_VEHICLE)
|
|
SET_ENTITY_COORDS(temp_VEHICLE, vecCoords)
|
|
SET_ENTITY_HEADING(temp_VEHICLE, fHeading)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// wait for ambient clubs to stream in
|
|
//WAIT_FOR_ANY_NEARBY_CLUBS_TO_STREAM_IN()
|
|
|
|
DO_SCREEN_FADE_IN(500)
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
CLEAR_BIT(locatesData.iLocatesBitSet, BS_DONT_DO_J_SKIP)
|
|
ENDIF
|
|
|
|
|
|
ENDPROC
|
|
|
|
PROC J_SKIP_NO_BUDDIES(VECTOR vecCoords, LOCATES_HEADER_DATA &locatesData, BOOL bOnFoot = FALSE, VEHICLE_INDEX SpecificvehicleID = NULL)
|
|
//PED_INDEX null_array[1]
|
|
J_SKIP_LH(vecCoords, locatesData, bOnFoot,SpecificvehicleID)
|
|
ENDPROC
|
|
#ENDIF
|
|
|
|
PROC DONT_DO_SAFE_FOR_CUTSCENE_CHECK(LOCATES_HEADER_DATA &locatesData)
|
|
SET_BIT(locatesData.iLocatesBitSet, BS_DONT_DO_SAFE_FOR_CUTSCENE_CHECK)
|
|
ENDPROC
|
|
|
|
PROC DO_LOCATES_ALMOST_STOPPED_CHECK(LOCATES_HEADER_DATA &locatesData)
|
|
SET_BIT(locatesData.iLocatesBitSet, BS_DO_LOCATES_ALMOST_STOPPED_CHECK)
|
|
ENDPROC
|
|
|
|
|
|
|
|
|
|
FUNC BOOL LOCATES_CAN_PLAYER_START_CUTSCENE(LOCATES_HEADER_DATA &locatesData)
|
|
// BOOL bDoUprightCheck
|
|
// bDoUprightCheck = TRUE
|
|
// IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
// IF IS_PED_ON_ANY_BIKE(PLAYER_PED_ID())
|
|
// OR IS_PED_IN_ANY_HELI(PLAYER_PED_ID())
|
|
// bDoUprightCheck = FALSE
|
|
// ENDIF
|
|
// ENDIF
|
|
|
|
IF IS_BIT_SET(locatesData.iLocatesBitSet, BS_DO_LOCATES_ALMOST_STOPPED_CHECK)
|
|
IF IS_CHAR_ALMOST_STOPPED(PLAYER_PED_ID())
|
|
//IF (CAN_PLAYER_START_CUTSCENE(TRUE, bDoUprightCheck) OR IS_BIT_SET(locatesData.iLocatesBitSet, BS_DONT_DO_SAFE_FOR_CUTSCENE_CHECK))
|
|
IF (CAN_PLAYER_START_CUTSCENE() OR IS_BIT_SET(locatesData.iLocatesBitSet, BS_DONT_DO_SAFE_FOR_CUTSCENE_CHECK))
|
|
RETURN(TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
//IF (CAN_PLAYER_START_CUTSCENE(TRUE, bDoUprightCheck) OR IS_BIT_SET(locatesData.iLocatesBitSet, BS_DONT_DO_SAFE_FOR_CUTSCENE_CHECK))
|
|
IF (CAN_PLAYER_START_CUTSCENE() OR IS_BIT_SET(locatesData.iLocatesBitSet, BS_DONT_DO_SAFE_FOR_CUTSCENE_CHECK))
|
|
RETURN(TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
RETURN(FALSE)
|
|
ENDFUNC
|
|
|
|
FUNC BOOL IS_CHAR_NOT_IN_GROUP_BUT_USING_SPECIFIC_VEHICLE(PED_INDEX Ped, VEHICLE_INDEX vehicleID)
|
|
VEHICLE_INDEX ReturnvehicleID
|
|
IF NOT IS_PED_INJURED(Ped)
|
|
IF NOT IS_PED_GROUP_MEMBER(Ped, PLAYER_GROUP_ID())
|
|
//ReturnvehicleID = GET_VEHICLE_PED_IS_USING(Ped)
|
|
ReturnvehicleID = GET_VEHICLE_PED_IS_ENTERING(Ped)
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(vehicleID)
|
|
IF IS_ENTITY_AT_ENTITY(Ped, vehicleID, <<BUDDY_WILL_GET_IN_SPECIFIC_VEHICLE_DIST + 10.0, BUDDY_WILL_GET_IN_SPECIFIC_VEHICLE_DIST + 10.0, 10.0>>, FALSE)
|
|
IF (ReturnvehicleID = vehicleID)
|
|
RETURN(TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
RETURN(FALSE)
|
|
ENDFUNC
|
|
|
|
|
|
//FUNC BOOL IS_SPECIFIC_CAR_NEARER_THAN_ANY_BUDDIES_AND_PLAYER_IS_NOT_IN_IT(LOCATES_HEADER_DATA &locatesData)
|
|
// IF DOES_BLIP_EXIST(locatesData.vehicleBlip)
|
|
// RETURN(TRUE)
|
|
// ENDIF
|
|
//
|
|
// // if specific car exists and player is not in it, but nearer to it than any buddies then return true
|
|
// IF DOES_ENTITY_EXIST(SpecificvehicleID)
|
|
// IF IS_VEHICLE_DRIVEABLE(SpecificVehicleID)
|
|
// IF NOT IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), SpecificvehicleID)
|
|
// FLOAT fDistToVehicle
|
|
// FLOAT fNearestBuddy
|
|
// FLOAT fDist
|
|
// VECTOR CarPos
|
|
// VECTOR PlayerPos
|
|
// VECTOR BuddyPos
|
|
// VECTOR vec
|
|
// PlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
|
|
// CarPos = GET_ENTITY_COORDS(SpecificVehicleID)
|
|
// fDistToVehicle = VMAG((PlayerPos - CarPos))
|
|
// fNearestBuddy = 9999.9
|
|
// REPEAT 3 i
|
|
// IF NOT IS_PED_INJURED(locatesData.LocatesBuddyID[i])
|
|
// IF NOT IS_PED_GROUP_MEMBER(locatesData.LocatesBuddyID[i], PLAYER_GROUP_ID())
|
|
// IF NOT DOES_BLIP_EXIST(locatesData.BuddyBlipID[i])
|
|
// BuddyPos = GET_ENTITY_COORDS(locatesData.LocatesBuddyID[i])
|
|
// fDist = VMAG((PlayerPos - BuddyPos))
|
|
// IF (fDist < fNearestBuddy)
|
|
// fNearestBuddy = fDist
|
|
// ENDIF
|
|
// ENDIF
|
|
// ENDIF
|
|
// ENDIF
|
|
// ENDREPEAT
|
|
// IF (fDistToVehicle < fNearestBuddy)
|
|
// RETURN(TRUE)
|
|
// ENDIF
|
|
// ENDIF
|
|
// ENDIF
|
|
// ENDIF
|
|
//
|
|
//ENDFUNC
|
|
|
|
FUNC BOOL HAVE_BUDDIES_JOINED_PLAYERS_GROUP(LOCATES_HEADER_DATA &locatesData, PED_INDEX Buddy1, PED_INDEX Buddy2, PED_INDEX Buddy3, STRING sPickupBuddyText1,
|
|
STRING sPickupBuddyText2, STRING sPickupBuddyText3, STRING sPickupAllBuddysText, FLOAT fJoinDistance, BOOL bShowBuddyRoute = FALSE,
|
|
VEHICLE_INDEX SpecificvehicleID = NULL, BOOL bIgnoreIfPlayerInvehicle = FALSE, BOOL bJoinGroupEvenIfNotInSameMovement = FALSE,
|
|
STRING sHeistCrewName1=NULL, STRING sHeistCrewName2=NULL, STRING sHeistCrewName3=NULL, TRANSPORT_MODE transMode = TM_ANY_3D,
|
|
BOOL bLoseWantedLevel = FALSE)
|
|
|
|
INT i
|
|
INT iBuddiesMissing
|
|
INT iBuddiesNearlyMissing
|
|
INT iTotalBuddies
|
|
INT iNumBuddiesSetToDefaultSeat = 0
|
|
INT iThisTime
|
|
BOOL bAllBuddiesHaveJoinedPlayersGroup
|
|
BOOL bBuddyIsMissing[3]
|
|
BOOL bGiveMissingBuddyBlip
|
|
BOOL bPlayerInvehicleWithTooFewSeats
|
|
VEHICLE_INDEX tempvehicle
|
|
SCRIPTTASKSTATUS TaskStatus
|
|
|
|
locatesData.LocatesBuddyID[0] = Buddy1
|
|
locatesData.LocatesBuddyID[1] = Buddy2
|
|
locatesData.LocatesBuddyID[2] = Buddy3
|
|
locatesData.SpeakingBuddyID = Buddy1
|
|
|
|
STRING sPickupText[3]
|
|
sPickupText[0] = sPickupBuddyText1
|
|
sPickupText[1] = sPickupBuddyText2
|
|
sPickupText[2] = sPickupBuddyText3
|
|
|
|
STRING sCrewNames[3]
|
|
sCrewNames[0] = sHeistCrewName1
|
|
sCrewNames[1] = sHeistCrewName2
|
|
sCrewNames[2] = sHeistCrewName3
|
|
|
|
// check if any of the buddies arn't in the players group
|
|
bAllBuddiesHaveJoinedPlayersGroup = TRUE
|
|
iBuddiesMissing = 0
|
|
iBuddiesNearlyMissing = 0
|
|
iTotalBuddies = 0
|
|
bBuddyIsMissing[0] = FALSE
|
|
bBuddyIsMissing[1] = FALSE
|
|
bBuddyIsMissing[2] = FALSE
|
|
|
|
// count the buddies, and do an action mode check here.
|
|
REPEAT 3 i
|
|
IF NOT IS_PED_INJURED(locatesData.LocatesBuddyID[i])
|
|
iTotalBuddies++
|
|
ENDIF
|
|
|
|
IF IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
|
|
IF NOT IS_BIT_SET(locatesData.iLocatesBitSet, BS_BLOCK_BUDDIES_SETTING_TO_ACTION_MODE)
|
|
AND NOT IS_BIT_SET(locatesData.iLocatesBitSet, BS_BUDDIES_SET_TO_ACTION_MODE)
|
|
IF NOT IS_PED_INJURED(locatesData.LocatesBuddyID[i])
|
|
SET_PED_USING_ACTION_MODE(locatesData.LocatesBuddyID[i], TRUE)
|
|
ENDIF
|
|
|
|
IF i = 2
|
|
SET_BIT(locatesData.iLocatesBitSet, BS_BUDDIES_SET_TO_ACTION_MODE)
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_BIT_SET(locatesData.iLocatesBitSet, BS_BLOCK_BUDDIES_SETTING_TO_ACTION_MODE)
|
|
AND IS_BIT_SET(locatesData.iLocatesBitSet, BS_BUDDIES_SET_TO_ACTION_MODE)
|
|
IF NOT IS_PED_INJURED(locatesData.LocatesBuddyID[i])
|
|
SET_PED_USING_ACTION_MODE(locatesData.LocatesBuddyID[i], FALSE)
|
|
ENDIF
|
|
|
|
IF i = 2
|
|
CLEAR_BIT(locatesData.iLocatesBitSet, BS_BUDDIES_SET_TO_ACTION_MODE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
IF (iTotalBuddies = 0)
|
|
RETURN(TRUE)
|
|
ENDIF
|
|
|
|
//Special case: buddies will get into the closest car in all cases.
|
|
IF IS_BIT_SET(locatesData.iLocatesBitSet, BS_BUDDIES_WALK_TO_NEAREST_VEHICLE_AT_START)
|
|
BOOL bCleanupForcedEntryIntoCar = FALSE
|
|
|
|
//Fetch the closest car if it wasn't specified
|
|
IF NOT DOES_ENTITY_EXIST(locatesData.vehStartCar)
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN("BS_BUDDIES_WALK_TO_NEAREST_VEHICLE_AT_START - FETCHING CLOSEST CAR")
|
|
#ENDIF
|
|
|
|
VEHICLE_INDEX vehClosest
|
|
INT iSearchFlags = VEHICLE_SEARCH_FLAG_RETURN_VEHICLES_WITH_PEDS_ENTERING_OR_EXITING
|
|
iSearchFlags |= VEHICLE_SEARCH_FLAG_ALLOW_VEHICLE_OCCUPANTS_TO_BE_PERFORMING_A_NON_DEFAULT_TASK
|
|
iSearchFlags |= VEHICLE_SEARCH_FLAG_ALLOW_VEHICLE_OCCUPANTS_TO_BE_PERFORMING_A_SCRIPTED_TASK
|
|
iSearchFlags |= VEHICLE_SEARCH_FLAG_RETURN_LAW_ENFORCER_VEHICLES
|
|
iSearchFlags |= VEHICLE_SEARCH_FLAG_RETURN_MISSION_VEHICLES
|
|
iSearchFlags |= VEHICLE_SEARCH_FLAG_RETURN_RANDOM_VEHICLES
|
|
iSearchFlags |= VEHICLE_SEARCH_FLAG_RETURN_VEHICLES_CONTAINING_A_DEAD_OR_DYING_PED
|
|
iSearchFlags |= VEHICLE_SEARCH_FLAG_RETURN_VEHICLES_CONTAINING_A_PLAYER
|
|
iSearchFlags |= VEHICLE_SEARCH_FLAG_RETURN_VEHICLES_CONTAINING_GROUP_MEMBERS
|
|
|
|
vehClosest = GET_CLOSEST_VEHICLE(GET_ENTITY_COORDS(PLAYER_PED_ID()), 50.0, DUMMY_MODEL_FOR_SCRIPT, iSearchFlags)
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(vehClosest)
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN("BS_BUDDIES_WALK_TO_NEAREST_VEHICLE_AT_START - CAR FOUND ", GET_MODEL_NAME_OF_VEHICLE_FOR_DEBUG_ONLY(vehClosest))
|
|
#ENDIF
|
|
|
|
locatesData.vehStartCar = vehClosest
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(locatesData.vehStartCar)
|
|
IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(locatesData.vehStartCar)) < 400.0
|
|
IF NOT IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
IF (NOT IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0) OR NOT bLoseWantedLevel)
|
|
IF DOES_VEHICLE_HAVE_ENOUGH_SEATS(locatesData.vehStartCar, locatesData, iTotalBuddies)
|
|
REPEAT 3 i
|
|
IF NOT IS_PED_INJURED(locatesData.LocatesBuddyID[i])
|
|
SET_PED_MAX_MOVE_BLEND_RATIO(locatesData.LocatesBuddyID[i], PEDMOVE_WALK)
|
|
|
|
IF IS_PED_GROUP_MEMBER(locatesData.LocatesBuddyID[i], PLAYER_GROUP_ID())
|
|
REMOVE_PED_FROM_GROUP(locatesData.LocatesBuddyID[i])
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN("BS_BUDDIES_WALK_TO_NEAREST_VEHICLE_AT_START - REMOVE_PED_FROM_GROUP: ", i)
|
|
#ENDIF
|
|
ENDIF
|
|
|
|
IF GET_SCRIPT_TASK_STATUS(locatesData.LocatesBuddyID[i], SCRIPT_TASK_ENTER_VEHICLE) = FINISHED_TASK
|
|
AND NOT IS_CHAR_USING_VEHICLE(locatesData.LocatesBuddyID[i], locatesData.vehStartCar)
|
|
IF NOT IS_PED_RAGDOLL(locatesData.LocatesBuddyID[i])
|
|
AND NOT IS_PED_GETTING_UP(locatesData.LocatesBuddyID[i])
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(locatesData.LocatesBuddyID[i], TRUE)
|
|
TASK_ENTER_VEHICLE(locatesData.LocatesBuddyID[i], locatesData.vehStartCar, 60000, INT_TO_ENUM(VEHICLE_SEAT, i), PEDMOVE_WALK)
|
|
SET_PED_GROUP_MEMBER_PASSENGER_INDEX(locatesData.LocatesBuddyID[i], INT_TO_ENUM(VEHICLE_SEAT, i))
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN("BS_BUDDIES_WALK_TO_NEAREST_VEHICLE_AT_START - told to enter vehicle as passenger ", GET_THIS_SCRIPT_NAME())
|
|
#ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
//Just return TRUE, this ensures the locates header still displays the destination blip even though we're overriding the buddies to do something else.
|
|
RETURN TRUE
|
|
ELSE
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN("BS_BUDDIES_WALK_TO_NEAREST_VEHICLE_AT_START - chosen vehicle doesn't have enough seats. ", GET_THIS_SCRIPT_NAME())
|
|
#ENDIF
|
|
|
|
bCleanupForcedEntryIntoCar = TRUE
|
|
ENDIF
|
|
ELSE
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN("BS_BUDDIES_WALK_TO_NEAREST_VEHICLE_AT_START - player has a wanted level. ", GET_THIS_SCRIPT_NAME())
|
|
#ENDIF
|
|
|
|
bCleanupForcedEntryIntoCar = TRUE
|
|
ENDIF
|
|
ELSE
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN("BS_BUDDIES_WALK_TO_NEAREST_VEHICLE_AT_START - player is already in a car. ", GET_THIS_SCRIPT_NAME())
|
|
#ENDIF
|
|
|
|
bCleanupForcedEntryIntoCar = TRUE
|
|
ENDIF
|
|
ELSE
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN("BS_BUDDIES_WALK_TO_NEAREST_VEHICLE_AT_START - chosen vehicle is too far away. ",
|
|
VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(locatesData.vehStartCar)), " ", GET_THIS_SCRIPT_NAME())
|
|
#ENDIF
|
|
|
|
bCleanupForcedEntryIntoCar = TRUE
|
|
ENDIF
|
|
ELSE
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN("BS_BUDDIES_WALK_TO_NEAREST_VEHICLE_AT_START - chosen vehicle is not driveable. ", GET_THIS_SCRIPT_NAME())
|
|
#ENDIF
|
|
|
|
bCleanupForcedEntryIntoCar = TRUE
|
|
ENDIF
|
|
|
|
IF bCleanupForcedEntryIntoCar
|
|
CLEAR_BIT(locatesData.iLocatesBitSet, BS_BUDDIES_WALK_TO_NEAREST_VEHICLE_AT_START)
|
|
|
|
REPEAT 3 i
|
|
IF NOT IS_PED_INJURED(locatesData.LocatesBuddyID[i])
|
|
IF NOT IS_PED_GETTING_INTO_A_VEHICLE(locatesData.LocatesBuddyID[i]) //Clearing tasks may stop them from closing car doors so check this first.
|
|
AND NOT locatesData.bDontClearTasksIfEnteringNearestVehicle
|
|
CLEAR_PED_TASKS(locatesData.LocatesBuddyID[i])
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_GROUP_MEMBER(locatesData.LocatesBuddyID[i], PLAYER_GROUP_ID())
|
|
IF IS_BUDDY_GOOD_TO_JOIN_PLAYERS_GROUP(locatesData, locatesData.LocatesBuddyID[i], fJoinDistance, TRUE)
|
|
SET_PED_AS_GROUP_MEMBER(locatesData.LocatesBuddyID[i], PLAYER_GROUP_ID())
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN("BS_BUDDIES_WALK_TO_NEAREST_VEHICLE_AT_START - header resetting to standard behaviour.")
|
|
#ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//All non-special case buddy handling.
|
|
IF NOT IS_BIT_SET(locatesData.iLocatesBitSet, BS_BUDDIES_WALK_TO_NEAREST_VEHICLE_AT_START)
|
|
|
|
IF NOT IS_PLAYER_SITTING_IN_A_VEHICLE_WITH_ENOUGH_SEATS(locatesData)
|
|
AND IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
AND NOT DOES_ENTITY_EXIST(SpecificvehicleID)
|
|
tempvehicle = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
|
|
IF IS_VEHICLE_DRIVEABLE(tempvehicle)
|
|
IF NOT IS_BIT_SET(locatesData.iLocatesBitSet, BS_PLAYER_IS_IN_VEHICLE_WITH_TOO_FEW_SEATS)
|
|
//Potential alternative: display god text if you need a vehicle, don't display it for any means but have ambient speech.
|
|
IF ((transMode = TM_IN_VEHICLE_2D) OR (transMode = TM_IN_VEHICLE_3D))
|
|
|
|
ELSE
|
|
|
|
ENDIF
|
|
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(locatesData, IAT_IGNORE_DIALOGUE_IF_SUBTITLES_OFF)
|
|
INT iMaxNumPeds = 0
|
|
INT iNumPedToSpeak = 0
|
|
|
|
REPEAT 3 i
|
|
IF NOT IS_PED_INJURED(locatesData.LocatesBuddyID[i])
|
|
iMaxNumPeds++
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
iNumPedToSpeak = GET_RANDOM_INT_IN_RANGE(0, iMaxNumPeds)
|
|
|
|
IF NOT IS_PED_INJURED(locatesData.LocatesBuddyID[iNumPedToSpeak])
|
|
PLAY_PED_AMBIENT_SPEECH(locatesData.LocatesBuddyID[iNumPedToSpeak], "NEED_A_BIGGER_VEHICLE", SPEECH_PARAMS_FORCE)
|
|
ENDIF
|
|
|
|
GOD_TEXT(locatesData, "MORE_SEATS")
|
|
SET_BIT(locatesData.iLocatesBitSet, BS_PLAYER_IS_IN_VEHICLE_WITH_TOO_FEW_SEATS)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
bPlayerInvehicleWithTooFewSeats = TRUE
|
|
ENDIF
|
|
ELSE
|
|
bPlayerInvehicleWithTooFewSeats = FALSE
|
|
CLEAR_BIT(locatesData.iLocatesBitSet, BS_PLAYER_IS_IN_VEHICLE_WITH_TOO_FEW_SEATS)
|
|
SAFE_CLEAR_THIS_PRINT("MORE_SEATS")
|
|
ENDIF
|
|
|
|
//Print text if the player tries to use a bus that's occupied (passenger peds will never leave the bus).
|
|
IF NOT DOES_ENTITY_EXIST(SpecificvehicleID)
|
|
IF NOT IS_PED_INJURED(locatesData.LocatesBuddyID[0])
|
|
OR NOT IS_PED_INJURED(locatesData.LocatesBuddyID[1])
|
|
OR NOT IS_PED_INJURED(locatesData.LocatesBuddyID[2])
|
|
IF NOT IS_BIT_SET(locatesData.iLocatesBitSet, BS_PLAYER_IN_UNSUITABLE_VEHICLE)
|
|
IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
AND NOT IS_ANY_TEXT_BEING_DISPLAYED(locatesData, IAT_IGNORE_DIALOGUE_IF_SUBTITLES_OFF)
|
|
tempvehicle = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
|
|
|
|
IF private_IS_VEHICLE_AN_OCCUPIED_BUS(tempvehicle, locatesData)
|
|
GOD_TEXT(locatesData, "CMN_VEHSUIT")
|
|
SET_BIT(locatesData.iLocatesBitSet, BS_PLAYER_IN_UNSUITABLE_VEHICLE)
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
CLEAR_BIT(locatesData.iLocatesBitSet, BS_PLAYER_IN_UNSUITABLE_VEHICLE)
|
|
SAFE_CLEAR_THIS_PRINT("CMN_VEHSUIT")
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(SpecificvehicleID)
|
|
IF IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), SpecificvehicleID)
|
|
IF IS_CONTROL_JUST_PRESSED(PLAYER_CONTROL, INPUT_VEH_EXIT)
|
|
SET_BIT(locatesData.iLocatesBitSet, BS_PLAYER_PRESSED_EXIT_BUT_STILL_IN_CAR)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN("HAVE_BUDDIES_JOINED_PLAYERS_GROUP - Player pressed exit but IS_PED_SITTING_IN_VEHICLE still TRUE")
|
|
#ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF IS_BIT_SET(locatesData.iLocatesBitSet, BS_PLAYER_PRESSED_EXIT_BUT_STILL_IN_CAR)
|
|
CLEAR_BIT(locatesData.iLocatesBitSet, BS_PLAYER_PRESSED_EXIT_BUT_STILL_IN_CAR)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
REPEAT 3 i
|
|
IF DOES_ENTITY_EXIST(locatesData.LocatesBuddyID[i])
|
|
IF NOT IS_PED_INJURED(locatesData.LocatesBuddyID[i])
|
|
|
|
// make buddy drown in water if not in group
|
|
IF NOT IS_PED_GROUP_MEMBER(locatesData.LocatesBuddyID[i], PLAYER_GROUP_ID())
|
|
SET_PED_DIES_IN_WATER(locatesData.LocatesBuddyID[i], TRUE)
|
|
ELSE
|
|
SET_PED_DIES_IN_WATER(locatesData.LocatesBuddyID[i], FALSE)
|
|
ENDIF
|
|
|
|
IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
tempvehicle = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
|
|
IF IS_VEHICLE_DRIVEABLE(tempvehicle)
|
|
// if player is a vehicle with too few seats then remove from group
|
|
IF IS_PED_GROUP_MEMBER(locatesData.LocatesBuddyID[i], PLAYER_GROUP_ID())
|
|
IF NOT IS_PLAYER_SITTING_IN_A_VEHICLE_WITH_ENOUGH_SEATS(locatesData)
|
|
AND IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
IF NOT IS_CHAR_USING_SAME_VEHICLE_AS_PLAYER(locatesData.LocatesBuddyID[i])
|
|
//IF NOT ARE_CHARS_IN_SAME_VEHICLE(PLAYER_PED_ID(), locatesData.LocatesBuddyID[i])
|
|
REMOVE_PED_FROM_GROUP(locatesData.LocatesBuddyID[i])
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN("HAVE_BUDDIES_JOINED_PLAYERS_GROUP - REMOVE_CHAR_FROM_GROUP - not enough seats in vehicle.")
|
|
#ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//If vehicle is in water then force the buddies out.
|
|
IF tempvehicle != SpecificvehicleID
|
|
AND NOT IS_ENTITY_DEAD(tempvehicle)
|
|
IF IS_PED_SITTING_IN_VEHICLE(locatesData.LocatesBuddyID[i], tempvehicle)
|
|
IF IS_ENTITY_IN_WATER(tempvehicle)
|
|
AND NOT IS_VEHICLE_ON_ALL_WHEELS(tempvehicle)
|
|
VECTOR vCarPos = GET_ENTITY_COORDS(tempvehicle)
|
|
|
|
IF vCarPos.z < -1.0
|
|
TASK_LEAVE_VEHICLE(locatesData.LocatesBuddyID[i], tempvehicle, ECF_DONT_WAIT_FOR_VEHICLE_TO_STOP)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN("locates_private.sch - Player's vehicle is in water, buddy told to exit.")
|
|
#ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
|
|
bGiveMissingBuddyBlip = TRUE
|
|
IF NOT IS_PED_GROUP_MEMBER(locatesData.LocatesBuddyID[i], PLAYER_GROUP_ID())
|
|
IF IS_PED_SITTING_IN_ANY_VEHICLE(locatesData.LocatesBuddyID[i])
|
|
tempvehicle = GET_VEHICLE_PED_IS_IN(locatesData.LocatesBuddyID[i])
|
|
|
|
IF NOT IS_ENTITY_DEAD(tempvehicle)
|
|
//If buddy is in a vehicle which is not specific, and the player isn't then leave it.
|
|
IF IS_VEHICLE_DRIVEABLE(SpecificvehicleID)
|
|
IF tempvehicle != SpecificvehicleID
|
|
IF NOT IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), tempvehicle)
|
|
IF GET_ENTITY_SPEED(tempvehicle) > 5.0
|
|
TASK_LEAVE_VEHICLE(locatesData.LocatesBuddyID[i], tempvehicle, ECF_DONT_WAIT_FOR_VEHICLE_TO_STOP | ECF_JUMP_OUT)
|
|
ELSE
|
|
TASK_LEAVE_VEHICLE(locatesData.LocatesBuddyID[i], tempvehicle, ECF_DONT_WAIT_FOR_VEHICLE_TO_STOP)
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN("locates_private - HAVE_BUDDIES_JOINED_PLAYERS_GROUP - Buddy told to leave vehicle: buddy is in a different vehicle to the specific ID.")
|
|
#ENDIF
|
|
|
|
bGiveMissingBuddyBlip = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
VEHICLE_INDEX vehPlayer
|
|
|
|
IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
vehPlayer = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
|
|
ENDIF
|
|
|
|
//If the buddy and the player are in different vehicles then tell the buddy to leave theirs.
|
|
IF IS_VEHICLE_DRIVEABLE(vehPlayer)
|
|
IF tempvehicle != vehPlayer
|
|
IF GET_ENTITY_SPEED(tempvehicle) > 5.0
|
|
TASK_LEAVE_VEHICLE(locatesData.LocatesBuddyID[i], tempvehicle, ECF_DONT_WAIT_FOR_VEHICLE_TO_STOP | ECF_JUMP_OUT)
|
|
ELSE
|
|
TASK_LEAVE_VEHICLE(locatesData.LocatesBuddyID[i], tempvehicle, ECF_DONT_WAIT_FOR_VEHICLE_TO_STOP)
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN("locates_private - HAVE_BUDDIES_JOINED_PLAYERS_GROUP - Buddy told to leave vehicle: buddy and player are in different vehicles.")
|
|
#ENDIF
|
|
|
|
bGiveMissingBuddyBlip = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// if the player is using a vehicle with too few seats then set the seat priority too high
|
|
IF IS_PED_GROUP_MEMBER(locatesData.LocatesBuddyID[i], PLAYER_GROUP_ID())
|
|
VEHICLE_INDEX vehTemp = GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID())
|
|
|
|
IF DOES_ENTITY_EXIST(vehTemp)
|
|
IF DOES_VEHICLE_HAVE_ENOUGH_SEATS(vehTemp, locatesData)
|
|
IF IS_BIT_SET_BUDDY_GIVEN_SPECIFIC_PASSENGER_INDEX(i, locatesData)
|
|
OR NOT IS_BIT_SET(locatesData.iLocatesBitSet, BS_BUDDIES_GIVEN_DEFAULT_PASSENGER_INDEX)
|
|
SET_PED_GROUP_MEMBER_PASSENGER_INDEX(locatesData.LocatesBuddyID[i], INT_TO_ENUM(VEHICLE_SEAT, i))
|
|
CLEAR_BIT_BUDDY_GIVEN_SPECIFIC_PASSENGER_INDEX(i, locatesData)
|
|
iNumBuddiesSetToDefaultSeat++
|
|
|
|
IF iNumBuddiesSetToDefaultSeat >= iTotalBuddies
|
|
SET_BIT(locatesData.iLocatesBitSet, BS_BUDDIES_GIVEN_DEFAULT_PASSENGER_INDEX)
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN("locates_private - HAVE_BUDDIES_JOINED_PLAYERS_GROUP - Buddy ", i, "set to passenger seat ", i)
|
|
#ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_BIT_SET_BUDDY_GIVEN_SPECIFIC_PASSENGER_INDEX(i, locatesData)
|
|
//The Sentinel2 has inaccessible seat nodes, so setting the seat to 2 will cause peds to warp in the back.
|
|
IF GET_ENTITY_MODEL(vehTemp) = SENTINEL2
|
|
SET_PED_GROUP_MEMBER_PASSENGER_INDEX(locatesData.LocatesBuddyID[i], INT_TO_ENUM(VEHICLE_SEAT, 4))
|
|
ELSE
|
|
SET_PED_GROUP_MEMBER_PASSENGER_INDEX(locatesData.LocatesBuddyID[i], INT_TO_ENUM(VEHICLE_SEAT, 2))
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN("locates_private - HAVE_BUDDIES_JOINED_PLAYERS_GROUP - Not enough seats, buddy ", i, "set to passenger seat ", 2)
|
|
#ENDIF
|
|
|
|
SET_BIT_BUDDY_GIVEN_SPECIFIC_PASSENGER_INDEX(i, locatesData)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_GROUP_MEMBER(locatesData.LocatesBuddyID[i], PLAYER_GROUP_ID())
|
|
AND NOT DOES_SPECIFIC_VEHICLE_EXIST_AND_IS_CHAR_IN_IT(locatesData.LocatesBuddyID[i], SpecificvehicleID)
|
|
AND NOT IS_CHAR_NOT_IN_GROUP_BUT_USING_SPECIFIC_VEHICLE(locatesData.LocatesBuddyID[i], SpecificvehicleID)
|
|
|
|
// if they are close enough make them join the player's group
|
|
IF IS_BUDDY_GOOD_TO_JOIN_PLAYERS_GROUP(locatesData, locatesData.LocatesBuddyID[i], fJoinDistance, bIgnoreIfPlayerInvehicle)
|
|
IF NOT IS_PED_GROUP_MEMBER(locatesData.LocatesBuddyID[i], PLAYER_GROUP_ID())
|
|
IF NOT IS_PED_RAGDOLL(locatesData.LocatesBuddyID[i]) //Fix for 891812: prevents peds from repeatedly being added to the group while ragdolling.
|
|
AND NOT IS_PED_GETTING_UP(locatesData.LocatesBuddyID[i])
|
|
AND NOT IS_PED_JUMPING_OUT_OF_VEHICLE(locatesData.LocatesBuddyID[i])
|
|
AND NOT IS_PED_GETTING_INTO_A_VEHICLE(locatesData.LocatesBuddyID[i])
|
|
TaskStatus = GET_SCRIPT_TASK_STATUS(locatesData.LocatesBuddyID[i], SCRIPT_TASK_ENTER_VEHICLE)
|
|
|
|
IF (TaskStatus = FINISHED_TASK)
|
|
CLEAR_PED_TASKS(locatesData.LocatesBuddyID[i])
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN("locates_private - HAVE_BUDDIES_JOINED_PLAYERS_GROUP - CLEAR_CHAR_TASKS - 1")
|
|
#ENDIF
|
|
ENDIF
|
|
SET_PED_AS_GROUP_MEMBER(locatesData.LocatesBuddyID[i], PLAYER_GROUP_ID())
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN("HAVE_BUDDIES_JOINED_PLAYERS_GROUP - SET_GROUP_MEMBER - 1")
|
|
#ENDIF
|
|
bGiveMissingBuddyBlip = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF (bGiveMissingBuddyBlip)
|
|
// give him a blip if he doesn't already have one
|
|
IF NOT DOES_BLIP_EXIST(locatesData.BuddyBlipID[i])
|
|
locatesData.iLeftBuddyTime = GET_GAME_TIMER()
|
|
locatesData.BuddyBlipID[i] = CREATE_BLIP_FOR_ENTITY(locatesData.LocatesBuddyID[i], FALSE)
|
|
SET_BLIP_DISPLAY(locatesData.BuddyBlipID[i], DISPLAY_BLIP)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN("HAVE_BUDDIES_JOINED_PLAYERS_GROUP - add blip for char - 1")
|
|
#ENDIF
|
|
|
|
IF (bShowBuddyRoute)
|
|
TURN_ON_GPS_FOR_BLIP(locatesData.BuddyBlipID[i], locatesData)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
bAllBuddiesHaveJoinedPlayersGroup = FALSE
|
|
|
|
ELSE
|
|
|
|
|
|
// remove blip if he had one - but only if he is in the same vehicle as player (if player is in a vehicle)
|
|
IF DOES_BLIP_EXIST(locatesData.BuddyBlipID[i])
|
|
|
|
IF IS_BUDDY_IN_SAME_GROUP_MOVEMENT(locatesData.LocatesBuddyID[i])
|
|
OR DOES_SPECIFIC_VEHICLE_EXIST_AND_IS_CHAR_IN_IT(locatesData.LocatesBuddyID[i], SpecificvehicleID)
|
|
OR (bJoinGroupEvenIfNotInSameMovement)
|
|
OR (IS_VEHICLE_DRIVEABLE(SpecificvehicleID) AND NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), SpecificvehicleID))
|
|
IF DOES_BLIP_EXIST(locatesData.BuddyBlipID[i])
|
|
REMOVE_BLIP(locatesData.BuddyBlipID[i])
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN("HAVE_BUDDIES_JOINED_PLAYERS_GROUP - remove blip for char - 1")
|
|
#ENDIF
|
|
|
|
SAFE_CLEAR_THIS_PRINT(sPickupText[i])
|
|
ENDIF
|
|
ELSE
|
|
IF (bShowBuddyRoute)
|
|
TURN_ON_GPS_FOR_BLIP(locatesData.BuddyBlipID[i], locatesData)
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN("HAVE_BUDDIES_JOINED_PLAYERS_GROUP - bAllBuddiesHaveJoinedPlayersGroup = FALSE 2")
|
|
#ENDIF
|
|
bAllBuddiesHaveJoinedPlayersGroup = FALSE
|
|
ENDIF
|
|
ELSE
|
|
// does a specific vehicle exist?
|
|
IF IS_VEHICLE_DRIVEABLE(SpecificvehicleID)
|
|
|
|
IF NOT IS_PED_SITTING_IN_VEHICLE(locatesData.LocatesBuddyID[i], SpecificvehicleID)
|
|
|
|
// remove the char from the group if the following is true:
|
|
// - The buddy is near the required vehicle.
|
|
// - The player doesn't currently have a wanted level, or they've already been in the requried vehicle (this makes it the priority objective).
|
|
IF IS_ENTITY_AT_ENTITY(locatesData.LocatesBuddyID[i], SpecificvehicleID, <<BUDDY_WILL_GET_IN_SPECIFIC_VEHICLE_DIST, BUDDY_WILL_GET_IN_SPECIFIC_VEHICLE_DIST, 5.0>>, FALSE)
|
|
AND NOT IS_BIT_SET(locatesData.iLocatesBitSet, BS_BUDDIES_WILL_ONLY_GET_IN_WHEN_PLAYER_DOES)
|
|
AND NOT (bLoseWantedLevel AND IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0) AND (NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), SpecificvehicleID)))
|
|
IF IS_PED_SITTING_IN_ANY_VEHICLE(locatesData.LocatesBuddyID[i])
|
|
IF NOT IS_PED_IN_VEHICLE(locatesData.LocatesBuddyID[i], SpecificvehicleID)
|
|
IF NOT IS_BUDDY_IN_SAME_GROUP_MOVEMENT(locatesData.LocatesBuddyID[i])
|
|
IF IS_CHAR_ALMOST_STOPPED(locatesData.LocatesBuddyID[i])
|
|
TaskStatus = GET_SCRIPT_TASK_STATUS(locatesData.LocatesBuddyID[i], SCRIPT_TASK_LEAVE_VEHICLE)
|
|
IF (TaskStatus = FINISHED_TASK)
|
|
TASK_LEAVE_ANY_VEHICLE(locatesData.LocatesBuddyID[i])
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN("HAVE_BUDDIES_JOINED_PLAYERS_GROUP - TASK_LEAVE_ANY_VEHICLE")
|
|
#ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
// IF NOT IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), SpecificvehicleID)
|
|
// SET_FORCE_PLAYER_TO_ENTER_THROUGH_DIRECT_DOOR(PLAYER_PED_ID(), TRUE)
|
|
// ENDIF
|
|
|
|
IF IS_PED_GROUP_MEMBER(locatesData.LocatesBuddyID[i], PLAYER_GROUP_ID())
|
|
IF NOT IS_PED_JUMPING_OUT_OF_VEHICLE(locatesData.LocatesBuddyID[i])
|
|
AND NOT IS_PED_RAGDOLL(locatesData.LocatesBuddyID[i])
|
|
AND NOT IS_PED_GETTING_UP(locatesData.LocatesBuddyID[i])
|
|
AND NOT IS_PED_GETTING_INTO_A_VEHICLE(locatesData.LocatesBuddyID[i])
|
|
AND NOT IS_ENTITY_ON_FIRE(SpecificvehicleID)
|
|
REMOVE_PED_FROM_GROUP(locatesData.LocatesBuddyID[i])
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN("HAVE_BUDDIES_JOINED_PLAYERS_GROUP - REMOVE_PED_FROM_GROUP - ped is close enough to enter specific vehicle.")
|
|
#ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
TaskStatus = GET_SCRIPT_TASK_STATUS(locatesData.LocatesBuddyID[i], SCRIPT_TASK_ENTER_VEHICLE)
|
|
IF (TaskStatus = FINISHED_TASK)
|
|
AND NOT IS_CHAR_USING_VEHICLE(locatesData.LocatesBuddyID[i], SpecificvehicleID) //GTAV bug 672596: if the mission has already given peds a sequence the task check won't work.
|
|
//Don't give the ped the enter task if they're in the process of jumping out a vehicle, as it cancels the ragdoll.
|
|
IF NOT IS_PED_JUMPING_OUT_OF_VEHICLE(locatesData.LocatesBuddyID[i])
|
|
AND NOT IS_PED_JUMPING_OUT_OF_VEHICLE(PLAYER_PED_ID())
|
|
AND NOT IS_PED_IN_ANY_SPEEDING_VEHICLE(locatesData.LocatesBuddyID[i], 2.0)
|
|
AND NOT IS_PED_RAGDOLL(locatesData.LocatesBuddyID[i])
|
|
AND NOT IS_PED_GETTING_UP(locatesData.LocatesBuddyID[i])
|
|
AND NOT IS_ENTITY_ON_FIRE(SpecificvehicleID)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(locatesData.LocatesBuddyID[i], TRUE)
|
|
IF IS_BIT_SET(locatesData.iLocatesBitSet, BS_BUDDIES_WILL_WALK_TO_SPECIFIC_VEHICLE)
|
|
SET_PED_MAX_MOVE_BLEND_RATIO(locatesData.LocatesBuddyID[i], PEDMOVE_WALK)
|
|
ENDIF
|
|
TASK_ENTER_VEHICLE(locatesData.LocatesBuddyID[i], SpecificvehicleID, 60000, INT_TO_ENUM(VEHICLE_SEAT, i))
|
|
SET_PED_GET_OUT_UPSIDE_DOWN_VEHICLE(locatesData.LocatesBuddyID[i], FALSE)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN("HAVE_BUDDIES_JOINED_PLAYERS_GROUP - told to enter vehicle as passenger")
|
|
#ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), SpecificvehicleID)
|
|
locatesData.BuddyBlipID[i] = CREATE_BLIP_FOR_ENTITY(locatesData.LocatesBuddyID[i], FALSE)
|
|
SET_BLIP_DISPLAY(locatesData.BuddyBlipID[i], DISPLAY_BLIP)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN("HAVE_BUDDIES_JOINED_PLAYERS_GROUP - add blip for char - 2")
|
|
PRINTLN("HAVE_BUDDIES_JOINED_PLAYERS_GROUP - bAllBuddiesHaveJoinedPlayersGroup = FALSE 3")
|
|
#ENDIF
|
|
|
|
bAllBuddiesHaveJoinedPlayersGroup = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_PED_GROUP_MEMBER(locatesData.LocatesBuddyID[i], PLAYER_GROUP_ID())
|
|
IF IS_BUDDY_GOOD_TO_JOIN_PLAYERS_GROUP(locatesData, locatesData.LocatesBuddyID[i], fJoinDistance, bIgnoreIfPlayerInvehicle)
|
|
IF NOT IS_PED_RAGDOLL(locatesData.LocatesBuddyID[i])
|
|
AND NOT IS_PED_GETTING_UP(locatesData.LocatesBuddyID[i])
|
|
TaskStatus = GET_SCRIPT_TASK_STATUS(locatesData.LocatesBuddyID[i], SCRIPT_TASK_ENTER_VEHICLE)
|
|
IF (TaskStatus = FINISHED_TASK)
|
|
CLEAR_PED_TASKS(locatesData.LocatesBuddyID[i])
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN("locates_private - HAVE_BUDDIES_JOINED_PLAYERS_GROUP - CLEAR_CHAR_TASKS - 2")
|
|
#ENDIF
|
|
ENDIF
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(locatesData.LocatesBuddyID[i], FALSE)
|
|
SET_PED_AS_GROUP_MEMBER(locatesData.LocatesBuddyID[i], PLAYER_GROUP_ID())
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN("HAVE_BUDDIES_JOINED_PLAYERS_GROUP - SET_GROUP_MEMBER - 2")
|
|
#ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
|
|
//Fix for GTAV bug #234254: There seems to sometimes be a delay between the player pressing the exit vehicle button and
|
|
//IS_PED_SITTING_IN_VEHICLE returning true, which can cause buddies to leave the car. If the exit button is pressed,
|
|
//stop the buddies from being added to the group, reset the flag once IS_PED_SITTING_IN_VEHICLE returns false.
|
|
IF IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), SpecificvehicleID)
|
|
IF NOT IS_PED_GROUP_MEMBER(locatesData.LocatesBuddyID[i], PLAYER_GROUP_ID())
|
|
IF NOT IS_BIT_SET(locatesData.iLocatesBitSet, BS_PLAYER_PRESSED_EXIT_BUT_STILL_IN_CAR)
|
|
SET_PED_AS_GROUP_MEMBER(locatesData.LocatesBuddyID[i], PLAYER_GROUP_ID())
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN("HAVE_BUDDIES_JOINED_PLAYERS_GROUP - SET_GROUP_MEMBER - 3")
|
|
#ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF IS_BIT_SET(locatesData.iLocatesBitSet, BS_PLAYER_PRESSED_EXIT_BUT_STILL_IN_CAR)
|
|
REMOVE_PED_FROM_GROUP(locatesData.LocatesBuddyID[i])
|
|
SET_BIT(locatesData.iLocatesBitSet, BS_PLAYER_PRESSED_EXIT_BUT_STILL_IN_CAR)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN("HAVE_BUDDIES_JOINED_PLAYERS_GROUP - REMOVE_CHAR_FROM_GROUP - 4")
|
|
#ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
//Don't remove from the group if the ped is fleeing the mission-critical vehicle due to it being on fire.
|
|
IF IS_PED_GROUP_MEMBER(locatesData.LocatesBuddyID[i], PLAYER_GROUP_ID())
|
|
AND NOT IS_ENTITY_ON_FIRE(SpecificvehicleID)
|
|
REMOVE_PED_FROM_GROUP(locatesData.LocatesBuddyID[i])
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN("HAVE_BUDDIES_JOINED_PLAYERS_GROUP - REMOVE_CHAR_FROM_GROUP - 3")
|
|
#ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
// remove blip if he had one
|
|
IF DOES_BLIP_EXIST(locatesData.BuddyBlipID[i])
|
|
REMOVE_BLIP(locatesData.BuddyBlipID[i])
|
|
PRINTSTRING("HAVE_BUDDIES_JOINED_PLAYERS_GROUP - remove blip for char - 2")
|
|
PRINTNL()
|
|
SAFE_CLEAR_THIS_PRINT(sPickupText[i])
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
// count buddies missing
|
|
REPEAT 3 i
|
|
IF DOES_BLIP_EXIST(locatesData.BuddyBlipID[i])
|
|
bBuddyIsMissing[i] = TRUE
|
|
iBuddiesMissing++
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
|
|
// print text - 'go back and get...'
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(locatesData, IAT_IGNORE_DIALOGUE_IF_SUBTITLES_OFF)
|
|
|
|
// check if any buddies are in the process of entering players vehicle
|
|
IF (iBuddiesMissing > 0)
|
|
REPEAT 3 i
|
|
IF (bBuddyIsMissing[i])
|
|
IF NOT IS_PED_INJURED(locatesData.LocatesBuddyID[i])
|
|
IF IS_CHAR_USING_SAME_VEHICLE_AS_PLAYER(locatesData.LocatesBuddyID[i])
|
|
OR IS_ENTITY_AT_ENTITY(locatesData.LocatesBuddyID[i], PLAYER_PED_ID(), <<locatesData.fBuddyJoinDistance, locatesData.fBuddyJoinDistance, locatesData.fBuddyJoinDistance>>, FALSE)
|
|
iBuddiesMissing--
|
|
bBuddyIsMissing[i] = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_PED_INJURED(locatesData.LocatesBuddyID[i])
|
|
IF NOT IS_ENTITY_AT_ENTITY(locatesData.LocatesBuddyID[i], PLAYER_PED_ID(),
|
|
<<locatesData.fBuddyJoinDistance * 0.85, locatesData.fBuddyJoinDistance * 0.85, locatesData.fBuddyJoinDistance>>, FALSE)
|
|
AND NOT IS_CHAR_USING_SAME_VEHICLE_AS_PLAYER(locatesData.LocatesBuddyID[i])
|
|
//iBuddiesNearlyMissing++
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
|
|
iThisTime = GET_GAME_TIMER()
|
|
|
|
// PRINTSTRING("-----------------")
|
|
// PRINTNL()
|
|
//
|
|
// PRINTSTRING("locatesData.iPrintedMissingBuddiesNumber = ")
|
|
// PRINTINT(locatesData.iPrintedMissingBuddiesNumber)
|
|
// PRINTNL()
|
|
//
|
|
// PRINTSTRING("iBuddiesMissing = ")
|
|
// PRINTINT(iBuddiesMissing)
|
|
// PRINTNL()
|
|
//
|
|
// PRINTSTRING("iTotalBuddies = ")
|
|
// PRINTINT(iTotalBuddies)
|
|
// PRINTNL()
|
|
//
|
|
// PRINTSTRING("locatesData.iLeftBuddyTime = ")
|
|
// PRINTINT(locatesData.iLeftBuddyTime)
|
|
// PRINTNL()
|
|
//
|
|
// PRINTSTRING("iThisTime = ")
|
|
// PRINTINT(iThisTime)
|
|
// PRINTNL()
|
|
|
|
IF ((iThisTime - locatesData.iLeftBuddyTime) > 1500)
|
|
OR (iTotalBuddies = 1)
|
|
IF (iBuddiesMissing > 0)
|
|
// what text to display?
|
|
IF (locatesData.iPrintedMissingBuddiesNumber < iBuddiesMissing)
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN("HAVE_BUDDIES_JOINED_PLAYERS_GROUP - printing 'pickup' text")
|
|
PRINTLN("locatesData.iPrintedMissingBuddiesNumber = ", locatesData.iPrintedMissingBuddiesNumber)
|
|
PRINTLN("iBuddiesMissing = ", iBuddiesMissing)
|
|
PRINTLN("iTotalBuddies = ", iTotalBuddies)
|
|
#ENDIF
|
|
|
|
IF ((iBuddiesMissing = iTotalBuddies) OR (iBuddiesNearlyMissing + iBuddiesMissing = iTotalBuddies))
|
|
AND (iTotalBuddies > 1)
|
|
IF NOT IS_BIT_SET(locatesData.iLocatesBitSet, BS_PRINTED_PICKUP_ALL_BUDDY_TEXT)
|
|
GOD_TEXT(locatesData, sPickupAllBuddysText)
|
|
SET_BIT(locatesData.iLocatesBitSet, BS_PRINTED_PICKUP_ALL_BUDDY_TEXT)
|
|
locatesData.iPrintedMissingBuddiesNumber = iBuddiesMissing
|
|
ELSE
|
|
locatesData.iPrintedMissingBuddiesNumber = iBuddiesMissing
|
|
ENDIF
|
|
ELSE
|
|
REPEAT 3 i
|
|
IF (bBuddyIsMissing[i])
|
|
IF NOT IS_BIT_SET_PRINTED_PICKUP_BUDDY_TEXT(i, locatesData)
|
|
IF NOT IS_STRING_NULL(sCrewNames[i])
|
|
IF NOT ARE_STRINGS_EQUAL(sCrewNames[i], "")
|
|
GOD_TEXT_FOR_CREW_MEMBER(locatesData, sPickupText[i], sCrewNames[i])
|
|
SET_BIT_PRINTED_PICKUP_BUDDY_TEXT(i, locatesData)
|
|
locatesData.iPrintedMissingBuddiesNumber = iBuddiesMissing
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_BIT_SET_PRINTED_PICKUP_BUDDY_TEXT(i, locatesData)
|
|
GOD_TEXT(locatesData, sPickupText[i])
|
|
SET_BIT_PRINTED_PICKUP_BUDDY_TEXT(i, locatesData)
|
|
locatesData.iPrintedMissingBuddiesNumber = iBuddiesMissing
|
|
ENDIF
|
|
ELSE
|
|
locatesData.iPrintedMissingBuddiesNumber = iBuddiesMissing
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
locatesData.iPrintedMissingBuddiesNumber = 0
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
CLEAR_BIT(locatesData.iLocatesBitSet, BS_BUDDIES_WILL_WALK_TO_SPECIFIC_VEHICLE)
|
|
|
|
// all buddies are in group
|
|
IF (bAllBuddiesHaveJoinedPlayersGroup)
|
|
AND NOT (bPlayerInvehicleWithTooFewSeats)
|
|
REPEAT 3 i
|
|
IF DOES_BLIP_EXIST(locatesData.BuddyBlipID[i])
|
|
REMOVE_BLIP(locatesData.BuddyBlipID[i])
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN("HAVE_BUDDIES_JOINED_PLAYERS_GROUP - remove blip for char - 3")
|
|
#ENDIF
|
|
|
|
SAFE_CLEAR_THIS_PRINT(sPickupText[i])
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
SAFE_CLEAR_THIS_PRINT("MORE_SEATS")
|
|
RETURN(TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
// warp buddies to player
|
|
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_J)
|
|
VECTOR pos
|
|
REPEAT 3 i
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
pos = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(PLAYER_PED_ID(), <<0.0,(1.0 + TO_FLOAT(i)), 0.0>>)
|
|
IF NOT IS_PED_INJURED(locatesData.LocatesBuddyID[i])
|
|
SET_PED_COORDS_KEEP_VEHICLE(locatesData.LocatesBuddyID[i], <<pos.x, pos.y, pos.z>>)
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
#ENDIF // IS_DEBUG_BUILD
|
|
|
|
RETURN(FALSE)
|
|
|
|
ENDFUNC
|
|
|
|
FUNC BOOL HAS_BUDDY_JOINED_PLAYERS_GROUP(LOCATES_HEADER_DATA &locatesData, PED_INDEX Buddy, STRING sPickupBuddyText, BOOL bShowBuddyRoute = FALSE,
|
|
BOOL bIgnoreIfPlayerInvehicle = FALSE, BOOL bJoinGroupEvenIfNotInSameMovement = FALSE, BOOL bLoseWantedLevel = FALSE)
|
|
VEHICLE_INDEX Nullvehicle
|
|
Nullvehicle = NULL
|
|
RETURN(HAVE_BUDDIES_JOINED_PLAYERS_GROUP(locatesData, Buddy, NULL, NULL, sPickupBuddyText, sPickupBuddyText, sPickupBuddyText, sPickupBuddyText, locatesData.fBuddyJoinDistance,
|
|
bShowBuddyRoute, Nullvehicle, bIgnoreIfPlayerInvehicle, bJoinGroupEvenIfNotInSameMovement, "", "", "", TM_ANY_3D, bLoseWantedLevel))
|
|
ENDFUNC
|
|
|
|
|
|
FUNC BOOL IS_PLAYER_AT_LOCATE(LOCATES_HEADER_DATA &locatesData, VECTOR vecCoords, VECTOR vecLocateSize, VECTOR minCoords, Vector maxCoords, BOOL bShowCorona, TRANSPORT_MODE TransMode,
|
|
PED_INDEX Buddy1=NULL, PED_INDEX Buddy2=NULL, PED_INDEX Buddy3=NULL, VEHICLE_INDEX vehicleID=NULL,
|
|
STRING sGotoInstruction=NULL, STRING sDontLeaveBuddyBehind1=NULL, STRING sDontLeaveBuddyBehind2=NULL, STRING sDontLeaveBuddyBehind3=NULL,
|
|
STRING sPickupAllBuddysText=NULL, STRING sGetInVehicle=NULL, BOOL bShowBuddyRoute = FALSE, BOOL bLoseWantedLevel = FALSE,
|
|
STRING sGetBackInvehicle = NULL, BOOL bUseAngledArea = FALSE, INT iMinNoOfSeats = 0, BOOL bShowWantedText = TRUE, BLIP_SPRITE BlipSprite = RADAR_TRACE_INVALID,
|
|
STRING sHeistCrewName1=NULL, STRING sHeistCrewName2=NULL, STRING sHeistCrewName3=NULL, BOOL bShowLocationRoute = TRUE, FLOAT fAngledAreaWidth = 1.0)
|
|
VEHICLE_INDEX temp_VEHICLE
|
|
BOOL bReturn
|
|
INT i
|
|
VECTOR vBlipCoord = vecCoords + <<0.0, 0.0, 1.0>>
|
|
|
|
locatesData.LocatesBuddyID[0] = Buddy1
|
|
locatesData.LocatesBuddyID[1] = Buddy2
|
|
locatesData.LocatesBuddyID[2] = Buddy3
|
|
locatesData.SpeakingBuddyID = Buddy1
|
|
|
|
UPDATE_AMBIENT_ANIM_BLOCKING(locatesData)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
CREATE_LOCATES_HEADER_WIDGET(locatesData)
|
|
#ENDIF
|
|
UPDATE_CHARS_TO_NOT_FLY_THROUGH_WINDSCREEN(locatesData)
|
|
|
|
HANDLE_BUDDY_HEAD_TRACK_WHILE_ENTERING_VEHICLE()
|
|
|
|
//IF IS_VEHICLE_DRIVEABLE(vehicleID)
|
|
//OR (vehicleID = NULL)
|
|
|
|
IF HAVE_BUDDIES_JOINED_PLAYERS_GROUP(locatesData, locatesData.LocatesBuddyID[0], locatesData.LocatesBuddyID[1], locatesData.LocatesBuddyID[2], sDontLeaveBuddyBehind1,
|
|
sDontLeaveBuddyBehind2, sDontLeaveBuddyBehind3, sPickupAllBuddysText, locatesData.fBuddyJoinDistance, bShowBuddyRoute, vehicleID,
|
|
FALSE, FALSE, sHeistCrewName1, sHeistCrewName2, sHeistCrewName3, TransMode, bLoseWantedLevel)
|
|
|
|
SAFE_CLEAR_THIS_PRINT(sDontLeaveBuddyBehind1)
|
|
SAFE_CLEAR_THIS_PRINT(sDontLeaveBuddyBehind2)
|
|
SAFE_CLEAR_THIS_PRINT(sDontLeaveBuddyBehind3)
|
|
SAFE_CLEAR_THIS_PRINT(sPickupAllBuddysText)
|
|
|
|
IF IS_SCREEN_FADED_IN()
|
|
|
|
bReturn = FALSE
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(vehicleID)
|
|
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehicleID)
|
|
SET_BIT(locatesData.iLocatesBitSet, BS_PRINTED_GET_IN_VEHICLE) // if player already started in vehicle
|
|
|
|
//If this is the first time the ped has been in this vehicle, they'll need to be told to get back in if they get out.
|
|
IF NOT IS_BIT_SET(locatesData.iLocatesBitSet, BS_HAS_BEEN_IN_VEHICLE)
|
|
CLEAR_BIT(locatesData.iLocatesBitSet, BS_PRINTED_GET_BACK_IN_VEHICLE)
|
|
ENDIF
|
|
|
|
IF IS_BIT_SET(locatesData.iLocatesBitSet, BS_PLAYED_GET_BACK_IN_VEHICLE_SPEECH)
|
|
CLEAR_BIT(locatesData.iLocatesBitSet, BS_PLAYED_GET_BACK_IN_VEHICLE_SPEECH)
|
|
ENDIF
|
|
|
|
SET_BIT(locatesData.iLocatesBitSet, BS_HAS_BEEN_IN_VEHICLE)
|
|
bReturn = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF ((TransMode = TM_IN_VEHICLE_2D) OR (TransMode = TM_IN_VEHICLE_3D))
|
|
IF IS_PLAYER_IN_A_VEHICLE_WITH_ENOUGH_SEATS(locatesData, iMinNoOfSeats)
|
|
SET_BIT(locatesData.iLocatesBitSet, BS_PRINTED_GET_IN_VEHICLE) // if player already started in vehicle
|
|
|
|
//If this is the first time the ped has been in this vehicle, they'll need to be told to get back in if they get out.
|
|
IF NOT IS_BIT_SET(locatesData.iLocatesBitSet, BS_HAS_BEEN_IN_VEHICLE)
|
|
CLEAR_BIT(locatesData.iLocatesBitSet, BS_PRINTED_GET_BACK_IN_VEHICLE)
|
|
ENDIF
|
|
|
|
SET_BIT(locatesData.iLocatesBitSet, BS_HAS_BEEN_IN_VEHICLE)
|
|
bReturn = TRUE
|
|
ENDIF
|
|
ELSE
|
|
bReturn = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF (bReturn)
|
|
// clear 'get vehicle' text
|
|
SAFE_CLEAR_THIS_PRINT(sGetInVehicle)
|
|
SAFE_CLEAR_THIS_PRINT(sGetBackInvehicle)
|
|
SAFE_CLEAR_THIS_PRINT("MORE_SEATS")
|
|
|
|
// lose wanted level?
|
|
IF (bLoseWantedLevel)
|
|
AND IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
|
|
|
|
IF DOES_BLIP_EXIST(locatesData.LocationBlip)
|
|
REMOVE_BLIP(locatesData.LocationBlip)
|
|
SAFE_CLEAR_THIS_PRINT(sGotoInstruction)
|
|
ENDIF
|
|
IF DOES_BLIP_EXIST(locatesData.vehicleBlip)
|
|
REMOVE_BLIP(locatesData.vehicleBlip)
|
|
ENDIF
|
|
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(locatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
AND NOT IS_BUDDY_PLAYING_AMBIENT_SPEECH(locatesData)
|
|
AND NOT IS_BIT_SET(locatesData.iLocatesBitSet, BS_PRINTED_LOSE_WANTED_LEVEL)
|
|
IF bShowWantedText
|
|
GOD_TEXT(locatesData, "LOSE_WANTED")
|
|
IF NOT IS_PED_INJURED(locatesData.LocatesBuddyID[0])
|
|
PLAY_PED_AMBIENT_SPEECH(locatesData.LocatesBuddyID[0], "VEHICLE_POLICE_PURSUIT", SPEECH_PARAMS_FORCE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SET_BIT(locatesData.iLocatesBitSet, BS_PRINTED_LOSE_WANTED_LEVEL)
|
|
CLEAR_BIT(locatesData.iLocatesBitSet, BS_PLAYED_LOST_COPS_SPEECH)
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
// clear wanted level text
|
|
IF IS_BIT_SET(locatesData.iLocatesBitSet, BS_PRINTED_LOSE_WANTED_LEVEL)
|
|
SAFE_CLEAR_THIS_PRINT("LOSE_WANTED")
|
|
CLEAR_BIT(locatesData.iLocatesBitSet, BS_PRINTED_LOSE_WANTED_LEVEL)
|
|
SET_BIT(locatesData.iLocatesBitSet, BS_PLAYED_LOST_COPS_SPEECH)
|
|
ENDIF
|
|
|
|
// play lose cops speech
|
|
IF IS_BIT_SET(locatesData.iLocatesBitSet, BS_PLAYED_LOST_COPS_SPEECH)
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(locatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
// play ambient speech
|
|
IF NOT IS_PED_INJURED(locatesData.LocatesBuddyID[0])
|
|
PLAY_PED_AMBIENT_SPEECH(locatesData.LocatesBuddyID[0], "LOSE_WANTED_LEVEL", SPEECH_PARAMS_FORCE)
|
|
ENDIF
|
|
CLEAR_BIT(locatesData.iLocatesBitSet, BS_PLAYED_LOST_COPS_SPEECH)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// create blip
|
|
IF NOT DOES_BLIP_EXIST(locatesData.LocationBlip)
|
|
IF DOES_BLIP_EXIST(locatesData.vehicleBlip)
|
|
REMOVE_BLIP(locatesData.vehicleBlip)
|
|
ENDIF
|
|
locatesData.LocationBlip = CREATE_BLIP_FOR_COORD(vBlipCoord)
|
|
IF NOT (BlipSprite = RADAR_TRACE_INVALID)
|
|
SET_BLIP_SPRITE(locatesData.LocationBlip, BlipSprite)
|
|
ENDIF
|
|
|
|
IF bShowLocationRoute
|
|
TURN_ON_GPS_FOR_BLIP(locatesData.LocationBlip, locatesData)
|
|
ENDIF
|
|
|
|
ELIF NOT ARE_VECTORS_ALMOST_EQUAL(vBlipCoord, GET_BLIP_COORDS(locatesData.LocationBlip), 0.1)
|
|
SET_BLIP_COORDS(locatesData.LocationBlip, vBlipCoord)
|
|
|
|
IF bShowLocationRoute
|
|
TURN_ON_GPS_FOR_BLIP(locatesData.LocationBlip, locatesData)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
// print text
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(locatesData, IAT_IGNORE_DIALOGUE_IF_SUBTITLES_OFF)
|
|
IF NOT IS_BIT_SET(locatesData.iLocatesBitSet, BS_INITIAL_GOD_TEXT_PRINTED)
|
|
GOD_TEXT(locatesData, sGotoInstruction)
|
|
SET_BIT(locatesData.iLocatesBitSet, BS_INITIAL_GOD_TEXT_PRINTED)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// if player is in a vehicle with too few seats then hide chevron
|
|
IF ((TransMode = TM_IN_VEHICLE_2D) OR (TransMode = TM_IN_VEHICLE_3D))
|
|
IF IS_BIT_SET(locatesData.iLocatesBitSet, BS_PLAYER_IS_IN_VEHICLE_WITH_TOO_FEW_SEATS)
|
|
bShowCorona = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
bReturn = FALSE
|
|
|
|
//The entity commands use different parameters to the locates header, so do some conversion here.
|
|
BOOL bIn3D = FALSE
|
|
PED_TRANSPORT_MODE pedTransMode = TM_ANY
|
|
|
|
IF TransMode = TM_ANY_3D OR TransMode = TM_ON_FOOT_3D OR TransMode = TM_IN_VEHICLE_3D
|
|
bIn3D = TRUE
|
|
ENDIF
|
|
|
|
IF TransMode = TM_ON_FOOT_2D OR TransMode = TM_ON_FOOT_3D
|
|
pedTransMode = TM_ON_FOOT
|
|
ELIF TransMode = TM_IN_VEHICLE_2D OR TransMode = TM_IN_VEHICLE_3D
|
|
pedTransMode = TM_IN_VEHICLE
|
|
ENDIF
|
|
|
|
|
|
// ANGLED AREA CHECK
|
|
IF bUseAngledArea
|
|
IS_ENTITY_AT_COORD(PLAYER_PED_ID(), vecCoords, vecLocateSize, bShowcorona, bIn3D, pedTransMode) //displays corona over blip location
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), minCoords, maxCoords, fAngledAreaWidth, FALSE, bIn3D, pedTransMode)
|
|
bReturn = TRUE
|
|
ENDIF
|
|
// AXIS ALIGNED AREA CHECK
|
|
ELSE
|
|
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), vecCoords, vecLocateSize, bShowCorona, bIn3D, pedTransMode)
|
|
bReturn = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF (bReturn)
|
|
|
|
bReturn = TRUE
|
|
REPEAT 3 i
|
|
IF NOT IS_PED_INJURED(locatesData.LocatesBuddyID[i])
|
|
IF TransMode = TM_IN_VEHICLE_2D
|
|
OR TransMode = TM_IN_VEHICLE_3D
|
|
temp_VEHICLE = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
|
|
|
|
IF NOT IS_PED_IN_VEHICLE(locatesData.LocatesBuddyID[i], temp_VEHICLE)
|
|
bReturn = FALSE
|
|
ENDIF
|
|
ELSE
|
|
IF vehicleID != NULL
|
|
IF NOT IS_PED_IN_VEHICLE(locatesData.LocatesBuddyID[i], vehicleID)
|
|
bReturn = FALSE
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_PED_GROUP_MEMBER(locatesData.LocatesBuddyID[i], PLAYER_GROUP_ID())
|
|
OR NOT IS_BUDDY_IN_SAME_GROUP_MOVEMENT(locatesData.LocatesBuddyID[i])
|
|
bReturn = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
IF bReturn
|
|
IF LOCATES_CAN_PLAYER_START_CUTSCENE(locatesData)
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN("IS_PLAYER_AT_LOCATE - debug 7")
|
|
#ENDIF
|
|
|
|
SAFE_CLEAR_THIS_PRINT(sGotoInstruction)
|
|
SAFE_CLEAR_THIS_PRINT(sGetInVehicle)
|
|
SAFE_CLEAR_THIS_PRINT(sDontLeaveBuddyBehind1)
|
|
SAFE_CLEAR_THIS_PRINT(sDontLeaveBuddyBehind2)
|
|
SAFE_CLEAR_THIS_PRINT(sDontLeaveBuddyBehind3)
|
|
SAFE_CLEAR_THIS_PRINT(sPickupAllBuddysText)
|
|
SAFE_CLEAR_THIS_PRINT("LOSE_WANTED")
|
|
SAFE_CLEAR_THIS_PRINT("MORE_SEATS")
|
|
SAFE_CLEAR_THIS_PRINT(sGetBackInvehicle)
|
|
CLEAR_MISSION_LOCATE_STUFF(locatesData)
|
|
RETURN(TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
IF DOES_ENTITY_EXIST(vehicleID) // only if using a specific car
|
|
|
|
// lose wanted level? (only if player has not yet got in mission specific vehicle)
|
|
IF (bLoseWantedLevel)
|
|
AND IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
|
|
AND (NOT IS_BIT_SET(locatesData.iLocatesBitSet, BS_HAS_BEEN_IN_VEHICLE) AND NOT IS_BIT_SET(locatesData.iLocatesBitSet, BS_PLAYER_STARTS_RIGHT_NEXT_TO_VEHICLE))
|
|
|
|
// clear 'get in vehicle' text
|
|
SAFE_CLEAR_THIS_PRINT(sGetInVehicle)
|
|
SAFE_CLEAR_THIS_PRINT(sGetBackInvehicle)
|
|
|
|
IF DOES_BLIP_EXIST(locatesData.LocationBlip)
|
|
OR DOES_BLIP_EXIST(locatesData.vehicleBlip)
|
|
REMOVE_BLIP(locatesData.LocationBlip)
|
|
REMOVE_BLIP(locatesData.vehicleBlip)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN("IS_PLAYER_AT_LOCATE_WITH_BUDDIES_IN_VEHICLE - remove blip 3")
|
|
#ENDIF
|
|
SAFE_CLEAR_THIS_PRINT(sGotoInstruction)
|
|
ENDIF
|
|
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(locatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
AND NOT IS_BUDDY_PLAYING_AMBIENT_SPEECH(locatesData)
|
|
AND NOT IS_BIT_SET(locatesData.iLocatesBitSet, BS_PRINTED_LOSE_WANTED_LEVEL)
|
|
IF bShowWantedText //Allow wanted text to be disabled: this is for scripts that wish to use their own dialogue with the header.
|
|
GOD_TEXT(locatesData, "LOSE_WANTED")
|
|
IF NOT IS_PED_INJURED(locatesData.LocatesBuddyID[0])
|
|
PLAY_PED_AMBIENT_SPEECH(locatesData.LocatesBuddyID[0], "VEHICLE_POLICE_PURSUIT", SPEECH_PARAMS_FORCE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SET_BIT(locatesData.iLocatesBitSet, BS_PRINTED_LOSE_WANTED_LEVEL)
|
|
CLEAR_BIT(locatesData.iLocatesBitSet, BS_PLAYED_LOST_COPS_SPEECH)
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
// clear wanted level text
|
|
IF IS_BIT_SET(locatesData.iLocatesBitSet, BS_PRINTED_LOSE_WANTED_LEVEL)
|
|
SAFE_CLEAR_THIS_PRINT("LOSE_WANTED")
|
|
CLEAR_BIT(locatesData.iLocatesBitSet, BS_PRINTED_LOSE_WANTED_LEVEL)
|
|
SET_BIT(locatesData.iLocatesBitSet, BS_PLAYED_LOST_COPS_SPEECH)
|
|
ENDIF
|
|
|
|
// play lose cops speech
|
|
IF IS_BIT_SET(locatesData.iLocatesBitSet, BS_PLAYED_LOST_COPS_SPEECH)
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(locatesData, IAT_IGNORE_GOD_TEXT_IF_SUBTITLES_OFF)
|
|
// play ambient speech
|
|
IF NOT IS_PED_INJURED(locatesData.LocatesBuddyID[0])
|
|
PLAY_PED_AMBIENT_SPEECH(locatesData.LocatesBuddyID[0], "LOSE_WANTED_LEVEL", SPEECH_PARAMS_FORCE)
|
|
ENDIF
|
|
CLEAR_BIT(locatesData.iLocatesBitSet, BS_PLAYED_LOST_COPS_SPEECH)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(vehicleID)
|
|
// create blip
|
|
IF NOT DOES_BLIP_EXIST(locatesData.vehicleBlip)
|
|
IF DOES_BLIP_EXIST(locatesData.LocationBlip)
|
|
REMOVE_BLIP(locatesData.LocationBlip)
|
|
SAFE_CLEAR_THIS_PRINT(sGotoInstruction)
|
|
ENDIF
|
|
locatesData.vehicleBlip = CREATE_BLIP_FOR_ENTITY(vehicleID, FALSE)
|
|
SET_BLIP_DISPLAY(locatesData.vehicleBlip, DISPLAY_BLIP)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN("IS_PLAYER_AT_LOCATE_WITH_BUDDIES_IN_VEHICLE - add blip 2")
|
|
#ENDIF
|
|
|
|
IF NOT IS_BIT_SET(locatesData.iLocatesBitSet, BS_PRINTED_GET_BACK_IN_VEHICLE)
|
|
TURN_ON_GPS_FOR_BLIP(locatesData.vehicleBlip, locatesData)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// print text
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(locatesData, IAT_IGNORE_DIALOGUE_IF_SUBTITLES_OFF) //or conversation_paused
|
|
IF NOT IS_BIT_SET(locatesData.iLocatesBitSet, BS_PRINTED_GET_IN_VEHICLE)
|
|
GOD_TEXT(locatesData, sGetInVehicle)
|
|
SET_BIT(locatesData.iLocatesBitSet, BS_PRINTED_GET_IN_VEHICLE)
|
|
CLEAR_BIT(locatesData.iLocatesBitSet, BS_PRINTED_GET_BACK_IN_VEHICLE)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN("set bit BS_PRINTED_GET_IN_VEHICLE 3")
|
|
#ENDIF
|
|
ELSE
|
|
IF IS_BIT_SET(locatesData.iLocatesBitSet, BS_HAS_BEEN_IN_VEHICLE)
|
|
IF NOT IS_STRING_NULL(sGetBackInvehicle)
|
|
IF NOT IS_BIT_SET(locatesData.iLocatesBitSet, BS_PRINTED_GET_BACK_IN_VEHICLE)
|
|
GOD_TEXT(locatesData, sGetBackInvehicle)
|
|
SET_BIT(locatesData.iLocatesBitSet, BS_PRINTED_GET_BACK_IN_VEHICLE)
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_BIT_SET(locatesData.iLocatesBitSet, BS_PRINTED_GET_BACK_IN_VEHICLE)
|
|
GOD_TEXT(locatesData, sGetInVehicle)
|
|
SET_BIT(locatesData.iLocatesBitSet, BS_PRINTED_GET_BACK_IN_VEHICLE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_BIT_SET(locatesData.iLocatesBitSet, BS_PLAYED_GET_BACK_IN_VEHICLE_SPEECH)
|
|
IF NOT IS_PED_INJURED(locatesData.LocatesBuddyID[0])
|
|
PLAY_PED_AMBIENT_SPEECH(locatesData.LocatesBuddyID[0], "GET_IN_CAR", SPEECH_PARAMS_FORCE)
|
|
ENDIF
|
|
SET_BIT(locatesData.iLocatesBitSet, BS_PLAYED_GET_BACK_IN_VEHICLE_SPEECH)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF DOES_BLIP_EXIST(locatesData.LocationBlip)
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN("IS_PLAYER_AT_LOCATE - Removing location blip, player not currently in suitable vehicle.")
|
|
#ENDIF
|
|
|
|
REMOVE_BLIP(locatesData.LocationBlip)
|
|
SAFE_CLEAR_THIS_PRINT(sGotoInstruction)
|
|
ENDIF
|
|
|
|
// print text
|
|
IF ((TransMode = TM_IN_VEHICLE_2D) OR (TransMode = TM_IN_VEHICLE_3D))
|
|
IF (iMinNoOfSeats > 0)
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(locatesData, IAT_IGNORE_DIALOGUE_IF_SUBTITLES_OFF)
|
|
IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
IF NOT IS_BIT_SET(locatesData.iLocatesBitSet, BS_PLAYER_IS_IN_VEHICLE_WITH_TOO_FEW_SEATS)
|
|
INT iMaxNumPeds = 0
|
|
INT iNumPedToSpeak = 0
|
|
|
|
REPEAT 3 i
|
|
IF NOT IS_PED_INJURED(locatesData.LocatesBuddyID[i])
|
|
iMaxNumPeds++
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
iNumPedToSpeak = GET_RANDOM_INT_IN_RANGE(0, iMaxNumPeds)
|
|
|
|
IF NOT IS_PED_INJURED(locatesData.LocatesBuddyID[iNumPedToSpeak])
|
|
PLAY_PED_AMBIENT_SPEECH(locatesData.LocatesBuddyID[iNumPedToSpeak], "NEED_A_BIGGER_VEHICLE", SPEECH_PARAMS_FORCE)
|
|
ENDIF
|
|
|
|
GOD_TEXT(locatesData, "MORE_SEATS")
|
|
SET_BIT(locatesData.iLocatesBitSet, BS_PLAYER_IS_IN_VEHICLE_WITH_TOO_FEW_SEATS)
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_BIT_SET(locatesData.iLocatesBitSet, BS_PRINTED_GET_IN_VEHICLE)
|
|
GOD_TEXT(locatesData, sGetInVehicle)
|
|
SET_BIT(locatesData.iLocatesBitSet, BS_PRINTED_GET_IN_VEHICLE)
|
|
CLEAR_BIT(locatesData.iLocatesBitSet, BS_PRINTED_GET_BACK_IN_VEHICLE)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN("set bit BS_PRINTED_GET_IN_VEHICLE 4")
|
|
#ENDIF
|
|
ELIF NOT IS_BIT_SET(locatesData.iLocatesBitSet, BS_PRINTED_GET_BACK_IN_VEHICLE)
|
|
IF IS_BIT_SET(locatesData.iLocatesBitSet, BS_HAS_BEEN_IN_VEHICLE)
|
|
GOD_TEXT(locatesData, sGetBackInvehicle)
|
|
SET_BIT(locatesData.iLocatesBitSet, BS_PRINTED_GET_BACK_IN_VEHICLE)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN("set bit BS_PRINTED_GET_BACK_IN_VEHICLE 4")
|
|
#ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(locatesData, IAT_IGNORE_DIALOGUE_IF_SUBTITLES_OFF)
|
|
IF NOT IS_BIT_SET(locatesData.iLocatesBitSet, BS_PRINTED_GET_IN_VEHICLE)
|
|
GOD_TEXT(locatesData, sGetInVehicle)
|
|
SET_BIT(locatesData.iLocatesBitSet, BS_PRINTED_GET_IN_VEHICLE)
|
|
CLEAR_BIT(locatesData.iLocatesBitSet, BS_PRINTED_GET_BACK_IN_VEHICLE)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN("set bit BS_PRINTED_GET_IN_VEHICLE 5")
|
|
#ENDIF
|
|
ELSE
|
|
IF IS_BIT_SET(locatesData.iLocatesBitSet, BS_HAS_BEEN_IN_VEHICLE)
|
|
IF NOT IS_STRING_NULL(sGetBackInvehicle)
|
|
IF NOT IS_BIT_SET(locatesData.iLocatesBitSet, BS_PRINTED_GET_BACK_IN_VEHICLE)
|
|
GOD_TEXT(locatesData, sGetBackInvehicle)
|
|
SET_BIT(locatesData.iLocatesBitSet, BS_PRINTED_GET_BACK_IN_VEHICLE)
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_BIT_SET(locatesData.iLocatesBitSet, BS_PRINTED_GET_BACK_IN_VEHICLE)
|
|
GOD_TEXT(locatesData, sGetInVehicle)
|
|
SET_BIT(locatesData.iLocatesBitSet, BS_PRINTED_GET_BACK_IN_VEHICLE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
ELSE
|
|
IF IS_BIT_SET(locatesData.iLocatesBitSet, BS_PRINTED_LOSE_WANTED_LEVEL)
|
|
CLEAR_BIT(locatesData.iLocatesBitSet, BS_PRINTED_LOSE_WANTED_LEVEL)
|
|
ENDIF
|
|
SAFE_CLEAR_THIS_PRINT(sGotoInstruction)
|
|
SAFE_CLEAR_THIS_PRINT(sGetInVehicle)
|
|
SAFE_CLEAR_THIS_PRINT(sGetBackInvehicle)
|
|
SAFE_CLEAR_THIS_PRINT(sGetInVehicle)
|
|
SAFE_CLEAR_THIS_PRINT("LOSE_WANTED")
|
|
//SAFE_CLEAR_THIS_PRINT("MORE_SEATS") //Buddies seem to be removed from group if there's not enough seats, this call prevents the "more seats" line playing.
|
|
IF DOES_BLIP_EXIST(locatesData.LocationBlip)
|
|
REMOVE_BLIP(locatesData.LocationBlip)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN("IS_PLAYER_AT_LOCATE - Removing location blip, HAVE_BUDDIES_JOINED_PLAYERS_GROUP returned false.")
|
|
#ENDIF
|
|
ENDIF
|
|
IF DOES_BLIP_EXIST(locatesData.vehicleBlip)
|
|
REMOVE_BLIP(locatesData.vehicleBlip)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN("IS_PLAYER_AT_LOCATE - Removing vehicle blip, HAVE_BUDDIES_JOINED_PLAYERS_GROUP returned false.")
|
|
#ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
//ENDIF
|
|
|
|
|
|
// ==== SKIP TO LOCATION (FOR DEBUG) =====
|
|
#IF IS_DEBUG_BUILD
|
|
IF DOES_ENTITY_EXIST(vehicleID)
|
|
J_SKIP_LH(vecCoords, locatesData, FALSE, vehicleID)
|
|
ELSE
|
|
IF ((TransMode = TM_IN_VEHICLE_2D) OR (TransMode = TM_IN_VEHICLE_3D))
|
|
J_SKIP_LH(vecCoords, locatesData, FALSE)
|
|
ELSE
|
|
IF (TransMode = TM_ON_FOOT_3D)
|
|
J_SKIP_LH(vecCoords, locatesData, TRUE)
|
|
ELSE
|
|
J_SKIP_LH(vecCoords, locatesData)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
//ENSURE_LOCATE_IS_CLEAR_OF_RANDOM_VEHICLES(vecCoords, locatesData)
|
|
|
|
CLEAR_BIT(locatesData.iLocatesBitSet, BS_BUDDIES_WILL_ONLY_GET_IN_WHEN_PLAYER_DOES)
|
|
CLEAR_BIT(locatesData.iLocatesBitSet, BS_DO_LOCATES_ALMOST_STOPPED_CHECK)
|
|
|
|
RETURN(FALSE)
|
|
|
|
ENDFUNC
|
|
|
|
PROC PLAY_AMBIENT_LOCATES_DIALOGUE(LOCATES_HEADER_DATA &locatesData, structPedsForConversation sConversationPeds, STRING strTextBlock, STRING strMessage, PED_INDEX pedToTalk)
|
|
IF NOT IS_STRING_NULL(strMessage)
|
|
IF NOT ARE_STRINGS_EQUAL(strMessage, "")
|
|
PLAY_AMBIENT_DIALOGUE_LINE(sConversationPeds, pedToTalk, strTextBlock, strMessage)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
locatesData.iGodTextTime = GET_GAME_TIMER()
|
|
ENDPROC
|
|
|
|
///Used for ambient scripts only, this triggers the given dialogue where god text would normally be displayed.
|
|
PROC MANAGE_AMBIENT_LOCATES_DIALOGUE(LOCATES_HEADER_DATA &locatesData, structPedsForConversation sConversationPeds, STRING strTextBlock,
|
|
STRING strLabelGetInVehicle, STRING strLabelGetBackInVehicle, STRING strLabelGoToLocation, STRING strLabelLoseCops, STRING strLeaveBuddy1,
|
|
STRING strLeaveBuddy2, STRING strLeaveBuddy3, STRING strLeaveAllBuddies, STRING strNeedMoreSeats)
|
|
IF NOT IS_ANY_TEXT_BEING_DISPLAYED(locatesData)
|
|
IF IS_BIT_SET(locatesData.iLocatesBitSet, BS_PRINTED_LOSE_WANTED_LEVEL)
|
|
IF NOT IS_BIT_SET(locatesData.iAmbientDialogueBitSet, BS_PRINTED_LOSE_WANTED_LEVEL)
|
|
PLAY_AMBIENT_LOCATES_DIALOGUE(locatesData, sConversationPeds, strTextBlock, strLabelLoseCops, locatesData.LocatesBuddyID[0])
|
|
SET_BIT(locatesData.iAmbientDialogueBitSet, BS_PRINTED_LOSE_WANTED_LEVEL)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_BIT_SET(locatesData.iLocatesBitSet, BS_PRINTED_GET_IN_VEHICLE)
|
|
IF NOT IS_BIT_SET(locatesData.iAmbientDialogueBitSet, BS_PRINTED_GET_IN_VEHICLE)
|
|
PLAY_AMBIENT_LOCATES_DIALOGUE(locatesData, sConversationPeds, strTextBlock, strLabelGetInVehicle, locatesData.LocatesBuddyID[0])
|
|
SET_BIT(locatesData.iAmbientDialogueBitSet, BS_PRINTED_GET_IN_VEHICLE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_BIT_SET(locatesData.iLocatesBitSet, BS_PRINTED_GET_BACK_IN_VEHICLE)
|
|
IF NOT IS_BIT_SET(locatesData.iAmbientDialogueBitSet, BS_PRINTED_GET_BACK_IN_VEHICLE)
|
|
PLAY_AMBIENT_LOCATES_DIALOGUE(locatesData, sConversationPeds, strTextBlock, strLabelGetBackInVehicle, locatesData.LocatesBuddyID[0])
|
|
SET_BIT(locatesData.iAmbientDialogueBitSet, BS_PRINTED_GET_BACK_IN_VEHICLE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_BIT_SET(locatesData.iLocatesBitSet, BS_INITIAL_GOD_TEXT_PRINTED)
|
|
IF NOT IS_BIT_SET(locatesData.iAmbientDialogueBitSet, BS_INITIAL_GOD_TEXT_PRINTED)
|
|
PLAY_AMBIENT_LOCATES_DIALOGUE(locatesData, sConversationPeds, strTextBlock, strLabelGoToLocation, locatesData.LocatesBuddyID[0])
|
|
SET_BIT(locatesData.iAmbientDialogueBitSet, BS_INITIAL_GOD_TEXT_PRINTED)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_BIT_SET(locatesData.iLocatesBitSet, BS_PRINTED_PICKUP_BUDDY_TEXT_0)
|
|
IF NOT IS_BIT_SET(locatesData.iAmbientDialogueBitSet, BS_PRINTED_PICKUP_BUDDY_TEXT_0)
|
|
PLAY_AMBIENT_LOCATES_DIALOGUE(locatesData, sConversationPeds, strTextBlock, strLeaveBuddy1, locatesData.LocatesBuddyID[0])
|
|
SET_BIT(locatesData.iAmbientDialogueBitSet, BS_PRINTED_PICKUP_BUDDY_TEXT_0)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_BIT_SET(locatesData.iLocatesBitSet, BS_PRINTED_PICKUP_BUDDY_TEXT_1)
|
|
IF NOT IS_BIT_SET(locatesData.iAmbientDialogueBitSet, BS_PRINTED_PICKUP_BUDDY_TEXT_1)
|
|
PLAY_AMBIENT_LOCATES_DIALOGUE(locatesData, sConversationPeds, strTextBlock, strLeaveBuddy2, locatesData.LocatesBuddyID[1])
|
|
SET_BIT(locatesData.iAmbientDialogueBitSet, BS_PRINTED_PICKUP_BUDDY_TEXT_1)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_BIT_SET(locatesData.iLocatesBitSet, BS_PRINTED_PICKUP_BUDDY_TEXT_2)
|
|
IF NOT IS_BIT_SET(locatesData.iAmbientDialogueBitSet, BS_PRINTED_PICKUP_BUDDY_TEXT_2)
|
|
PLAY_AMBIENT_LOCATES_DIALOGUE(locatesData, sConversationPeds, strTextBlock, strLeaveBuddy3, locatesData.LocatesBuddyID[2])
|
|
SET_BIT(locatesData.iAmbientDialogueBitSet, BS_PRINTED_PICKUP_BUDDY_TEXT_2)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_BIT_SET(locatesData.iLocatesBitSet, BS_PRINTED_PICKUP_ALL_BUDDY_TEXT)
|
|
IF NOT IS_BIT_SET(locatesData.iAmbientDialogueBitSet, BS_PRINTED_PICKUP_ALL_BUDDY_TEXT)
|
|
PLAY_AMBIENT_LOCATES_DIALOGUE(locatesData, sConversationPeds, strTextBlock, strLeaveAllBuddies, locatesData.LocatesBuddyID[0])
|
|
SET_BIT(locatesData.iAmbientDialogueBitSet, BS_PRINTED_PICKUP_ALL_BUDDY_TEXT)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_BIT_SET(locatesData.iLocatesBitSet, BS_PLAYER_IS_IN_VEHICLE_WITH_TOO_FEW_SEATS)
|
|
IF NOT IS_BIT_SET(locatesData.iAmbientDialogueBitSet, BS_PLAYER_IS_IN_VEHICLE_WITH_TOO_FEW_SEATS)
|
|
PLAY_AMBIENT_LOCATES_DIALOGUE(locatesData, sConversationPeds, strTextBlock, strNeedMoreSeats, locatesData.LocatesBuddyID[0])
|
|
SET_BIT(locatesData.iAmbientDialogueBitSet, BS_PLAYER_IS_IN_VEHICLE_WITH_TOO_FEW_SEATS)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|