Files
gtav-src/script/dev_ng/singleplayer/include/private/clearMissionArea_private.sch
T
2025-09-29 00:52:08 +02:00

742 lines
26 KiB
Scheme
Executable File

USING "Flow_Mission_Data_Public.sch"
USING "vehicle_gen_public.sch"
#IF USE_CLF_DLC
using "spy_vehicle_system.sch"
#endif
proc RESOLVE_VEHICLES_AT_MISSION_TRIGGER_PRIVATE(vector vTriggerLocation, vector vMoveToLocation, float fMoveToHeading, vector vAllowableSize, bool deleteIfCharacterVehicle = FALSE,
VEHICLE_CREATE_TYPE_ENUM eTypePreference = VEHICLE_TYPE_DEFAULT, bool clearTriggerLocation = TRUE,
bool checkIfVehicleInGarage = FALSE, bool setVehicleAsVehGen = TRUE,
bool bHeliAllowed = TRUE, bool bPlaneAllowed = TRUE, bool bBoatAllowed = TRUE)
BOOL bFound
BOOL bAllowPlayerLastVehicle
VECTOR vRTemp
VECTOR vVehicleCoord
MODEL_NAMES VehicleModel
VEHICLE_INDEX veh
// removing vehicle gen functionality from resolve system
IF setVehicleAsVehGen
setVehicleAsVehGen = FALSE
ENDIF
CONST_FLOAT fCONST_REPOSITION_VEHICLE_RADIUS 30.0
veh = GET_PLAYERS_LAST_VEHICLE()
if DOES_ENTITY_EXIST(veh)
if IS_VEHICLE_DRIVEABLE(veh)
vVehicleCoord = GET_ENTITY_COORDS(veh)
VehicleModel = GET_ENTITY_MODEL(veh)
bAllowPlayerLastVehicle = TRUE //allow any driveable last player vehicle by default
IF IS_THIS_MODEL_A_HELI(VehicleModel) //allow or disallow helis
IF bHeliAllowed = FALSE
bAllowPlayerLastVehicle = FALSE
ENDIF
ENDIF
IF IS_THIS_MODEL_A_PLANE(VehicleModel) //allow or disallow planes
IF bPlaneAllowed = FALSE
bAllowPlayerLastVehicle = FALSE
ENDIF
ENDIF
IF IS_THIS_MODEL_A_BOAT(VehicleModel) //allow or disallow planes
IF bBoatAllowed = FALSE
bAllowPlayerLastVehicle = FALSE
ENDIF
ENDIF
vector vVehicleSizeMin,vVehicleSizeMax
GET_MODEL_DIMENSIONS(GET_ENTITY_MODEL(veh),vVehicleSizeMin,vVehicleSizeMax)
IF vVehicleSizeMax.x - vVehicleSizeMin.x > vAllowableSize.x
bAllowPlayerLastVehicle = FALSE
ELIF vVehicleSizeMax.y - vVehicleSizeMin.y > vAllowableSize.y
bAllowPlayerLastVehicle = FALSE
ELIF vVehicleSizeMax.z - vVehicleSizeMin.z > vAllowableSize.z
bAllowPlayerLastVehicle = FALSE
ENDIF
IF bAllowPlayerLastVehicle
if deleteIfCharacterVehicle
if IS_PLAYER_USING_DEFAULT_VEHICLE(eTypePreference)
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
vRTemp = GET_ENTITY_COORDS(PLAYER_PED_ID())
SET_ENTITY_COORDS(PLAYER_PED_ID(),vRTemp)
ENDIF
if DOES_ENTITY_EXIST(veh)
if not DOES_ENTITY_BELONG_TO_THIS_SCRIPT(veh)
OR NOT IS_ENTITY_A_MISSION_ENTITY(veh)
SET_ENTITY_AS_MISSION_ENTITY(veh,TRUE,TRUE)
ENDIF
DELETE_VEHICLE(veh)
ENDIF
ELSE
bFound=TRUE
ENDIF
ELSE
bFound=TRUE
ENDIF
// if the player last vehicle was a taxi that he was passenger in, delete it
if IS_VEHICLE_DRIVEABLE(veh)
IF IS_VEHICLE_MODEL(veh, TAXI)
IF GET_PED_IN_VEHICLE_SEAT(veh, VS_DRIVER) != PLAYER_PED_ID()
AND GET_PED_IN_VEHICLE_SEAT(veh, VS_DRIVER) != NULL
if not DOES_ENTITY_BELONG_TO_THIS_SCRIPT(veh)
OR NOT IS_ENTITY_A_MISSION_ENTITY(veh)
SET_ENTITY_AS_MISSION_ENTITY(veh)
ENDIF
DELETE_VEHICLE(veh)
bFound = FALSE
ENDIF
ENDIF
ENDIF
if checkIfVehicleInGarage
if IS_VEHICLE_IN_PLAYERS_GARAGE(veh, GET_CURRENT_PLAYER_PED_ENUM(), TRUE)
bFound = FALSE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
if bFound=true
//bug 392509 - only reposition last known vehicle if within 30m of trigger coord
IF (VDIST2(vVehicleCoord, vTriggerLocation) < (fCONST_REPOSITION_VEHICLE_RADIUS*fCONST_REPOSITION_VEHICLE_RADIUS))
if DOES_ENTITY_EXIST(veh)
if not DOES_ENTITY_BELONG_TO_THIS_SCRIPT(veh)
OR NOT IS_ENTITY_A_MISSION_ENTITY(veh)
SET_ENTITY_AS_MISSION_ENTITY(veh,TRUE,TRUE)
ENDIF
// Cleanup previous vehgens that have been used for mission vehicles
/*
IF setVehicleAsVehGen
if GET_VEHICLE_GEN_VEHICLE_INDEX(VEHGEN_MISSION_VEH) != veh
CLEANUP_MISSION_VEHICLE_GEN_VEHICLE()
endif
ENDIF
*/
CLEAR_AREA(vMoveToLocation,6.0,true)
SET_ENTITY_COORDS(veh,vMoveToLocation)
SET_ENTITY_HEADING(veh,fMoveToHeading)
SET_VEHICLE_DOORS_SHUT(veh, true)
SET_VEHICLE_ON_GROUND_PROPERLY(veh)
SET_VEHICLE_ENGINE_ON(veh, FALSE, TRUE)
// Kenneth R.
// Pass the vehicle over to the vehicle gen controller script so that it persists until the player interacts with it.
/*
IF setVehicleAsVehGen
if GET_VEHICLE_GEN_VEHICLE_INDEX(VEHGEN_MISSION_VEH) != veh
SET_MISSION_VEHICLE_GEN_VEHICLE(veh, <<0.0,0.0,0.0>>, 0.0)
ENDIF
ENDIF
*/
ELSE
CLEAR_AREA(vMoveToLocation,6.0,true)
ENDIF
ENDIF
ENDIF
IF clearTriggerLocation
//float clearAreaSize = GET_DISTANCE_BETWEEN_COORDS(vTriggerLocation,vMoveToLocation)
CLEAR_AREA(vTriggerLocation,LOCATE_SIZE_ANY_MEANS,true)
ENDIF
ENDPROC
//check if two lines intersect within the boundaries of the line end points
func bool do_lines_cross(vector vA, vector vB, vector vP, vector vU)
float p0_x, p0_y, p1_x, p1_y
float p2_x, p2_y, p3_x, p3_y
p0_x = vA.x
p0_y = vA.y
p1_x = vB.x
p1_y = vB.y
p2_x = vP.x
p2_y = vP.y
p3_x = vU.x
p3_y = vU.y
float s1_x, s1_y, s2_x, s2_y
s1_x = p1_x - p0_x
s1_y = p1_y - p0_y
s2_x = p3_x - p2_x
s2_y = p3_y - p2_y
float s, t
s = (-s1_y * (p0_x - p2_x) + s1_x * (p0_y - p2_y)) / (-s2_x * s1_y + s1_x * s2_y)
t = ( s2_x * (p0_y - p2_y) - s2_y * (p0_x - p2_x)) / (-s2_x * s1_y + s1_x * s2_y)
if (s >= 0 AND s <= 1 AND t >= 0 AND t <= 1)
return true
endif
return false // No collision
endfunc
FUNC BOOL DOES_VEHICLE_OVERLAP_ANGLED_AREA(vehicle_index veh, VECTOR VecCoors1, VECTOR VecCoors2, FLOAT AreaWidth)
IF IS_VEHICLE_DRIVEABLE(veh)
VecCoors1.z = VecCoors2.z
vector vNorm = NORMALISE_VECTOR(VecCoors1-VecCoors2)
vector vTemp = vNorm
vector vA,vB,vC,vD
vector vE[4]
vNorm.x = -vTemp.y
vNorm.y = vTemp.x
vNorm.z = 0
vA = VecCoors1 - (vNorm * (AreaWidth / 2.0))
vB = VecCoors1 + (vNorm * (AreaWidth / 2.0))
vC = VecCoors2 - (vNorm * (AreaWidth / 2.0))
vD = VecCoors2 + (vNorm * (AreaWidth / 2.0))
//find corners of vehicle
vector vVehicleSizeMin,vVehicleSizeMax
GET_MODEL_DIMENSIONS(GET_ENTITY_MODEL(veh),vVehicleSizeMin,vVehicleSizeMax)
vE[0] = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh,<<vVehicleSizeMin.x,vVehicleSizeMin.y,0>>)
vE[1] = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh,<<vVehicleSizeMin.x,vVehicleSizeMax.y,0>>)
vE[2] = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh,<<vVehicleSizeMax.x,vVehicleSizeMin.y,0>>)
vE[3] = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh,<<vVehicleSizeMax.x,vVehicleSizeMax.y,0>>)
if do_lines_cross(ve[0],ve[1],vA,vB)
or do_lines_cross(ve[0],ve[1],vB,vD)
or do_lines_cross(ve[0],ve[1],vC,vD)
or do_lines_cross(ve[0],ve[1],vA,vC)
or do_lines_cross(ve[1],ve[3],vA,vB)
or do_lines_cross(ve[1],ve[3],vB,vD)
or do_lines_cross(ve[1],ve[3],vC,vD)
or do_lines_cross(ve[1],ve[3],vA,vC)
or do_lines_cross(ve[3],ve[2],vA,vB)
or do_lines_cross(ve[3],ve[2],vB,vD)
or do_lines_cross(ve[3],ve[2],vC,vD)
or do_lines_cross(ve[3],ve[2],vA,vC)
or do_lines_cross(ve[2],ve[0],vA,vB)
or do_lines_cross(ve[2],ve[0],vB,vD)
or do_lines_cross(ve[2],ve[0],vC,vD)
or do_lines_cross(ve[2],ve[0],vA,vC)
RETURN TRUE
endif
endif
RETURN FALSE
ENDFUNC
/// PURPOSE: restores the 3 vehicle healths to a safe level.
/// e.g. Incase the vehicle is resolved with an engine health of 100 (Driveable). Code automatically reduces
/// the engine health if the health is <= 200. Therfore the vehicle could become undriveable by the time a
/// mocap cutscene has finished playing and the mission resumes.
proc make_vehicle_healths_safe(vehicle_index veh)
if does_entity_exist(veh)
if is_vehicle_driveable(veh)
if get_vehicle_engine_health(veh) <= 200 //code automatically reduce health <= 200
set_vehicle_engine_health(veh, 500)
endif
if get_vehicle_petrol_tank_health(veh) <= 700 //code automatically reduce health <= 700
set_vehicle_engine_health(veh, 900)
endif
if get_entity_health(veh) < 200
set_vehicle_engine_health(veh, 500)
endif
endif
endif
endproc
PROC PRIVATE_REPOSITION_VEHICLES_INSIDE_ANGLED_AREA(VECTOR VecCoors1, VECTOR VecCoors2, FLOAT AreaWidth, vector vMoveToCoord, float fMoveToHeading, vector vMaxAllowableSize, bool bClearAngledArea=TRUE, bool setVehicleAsVehGen=TRUE, bool ignoreVehicleInPlayerGarage=TRUE, bool EngineOffDoorsClosed=FALSE, bool allow_make_vehicle_healths_safe = false)
// removing vehicle gen functionality from resolve system
IF setVehicleAsVehGen
setVehicleAsVehGen = FALSE
ENDIF
VEHICLE_INDEX veh
bool bVehIsNotSafe
bool bAllowPlayerLastVehicle = TRUE
bool bSetAsMissonEntity = FALSE
veh = GET_PLAYERS_LAST_VEHICLE()
if DOES_ENTITY_EXIST(veh)
// Bug fix - because CLEAR_ANGLED_AREA_OF_VEHICLES deletes any vehicle classed as abandoned (even if it's outside of the specified area), the player's last vehicle could get deleted
// setting it as a mission entity stops this happening, it's gets set as SET_VEHICLE_AS_NO_LONGER_NEEDED again at the end of the proc
if not IS_ENTITY_A_MISSION_ENTITY(veh)
SET_ENTITY_AS_MISSION_ENTITY(veh)
bSetAsMissonEntity = TRUE
CPRINTLN(DEBUG_MISSION, "PRIVATE_REPOSITION_VEHICLES_INSIDE_ANGLED_AREA - player last vehicle ", GET_MODEL_NAME_OF_VEHICLE_FOR_DEBUG_ONLY(veh), " SET_ENTITY_AS_MISSION_ENTITY")
ENDIF
if IS_VEHICLE_DRIVEABLE(veh)
vector vVehicleSizeMin,vVehicleSizeMax
if allow_make_vehicle_healths_safe
make_vehicle_healths_safe(veh)
endif
IF IS_ENTITY_IN_ANGLED_AREA(veh,VecCoors1,VecCoors2,AreaWidth)
bVehIsNotSafe = TRUE
ELSE
vector vCar = GET_ENTITY_COORDS(veh)
IF (vCar.z > VecCoors1.z and vCar.z < VecCoors2.z)
OR (vCar.z > VecCoors2.z and vCar.z < VecCoors1.z)
//find corners of angled area
IF DOES_VEHICLE_OVERLAP_ANGLED_AREA(veh,VecCoors1,VecCoors2,AreaWidth)
bVehIsNotSafe = TRUE
ENDIF
endif
ENDIF
// if the player last vehicle was a taxi that he was passenger in, delete it
//this below was originally added in rev #18 of clearmissionarea.sch. That fix turns out to delete the player from a taxi wherever they are in the map.
//change below to deal with this. See cause, bug 1910193 NG.
if IS_VEHICLE_DRIVEABLE(veh)
IF IS_VEHICLE_MODEL(veh, TAXI)
IF GET_PED_IN_VEHICLE_SEAT(veh, VS_DRIVER) != PLAYER_PED_ID()
AND GET_PED_IN_VEHICLE_SEAT(veh, VS_DRIVER) != NULL
IF GET_DISTANCE_BETWEEN_COORDS((VecCoors1+VecCoors2)/2.0,get_entity_coords(veh)) < 20
//DELETE_VEHICLE(veh) //removed from here so it can be dealth with below.
bVehIsNotSafe = true
bAllowPlayerLastVehicle = FALSE
ENDIF
ENDIF
ENDIF
ENDIF
//if player's last vehicle is in a player garage, don't reposition it and don't let it be deleted.
if ignoreVehicleInPlayerGarage
if IS_VEHICLE_IN_PLAYERS_GARAGE(veh, GET_CURRENT_PLAYER_PED_ENUM(), TRUE)
bVehIsNotSafe = FALSE
ENDIF
ENDIF
/*
if not IS_ENTITY_A_MISSION_ENTITY(veh)
SET_ENTITY_AS_MISSION_ENTITY(veh)
ENDIF
*/
if bVehIsNotSafe
//check if vehicle is of the allowable size
IF NOT IS_VECTOR_ZERO(vMaxAllowableSize)
IF IS_VEHICLE_DRIVEABLE(veh)
model_names vehModel
vehModel = GET_ENTITY_MODEL(veh)
GET_VEHICLE_SIZE(veh, vVehicleSizeMin, vVehicleSizeMax) //GET_MODEL_DIMENSIONS(vehModel,vVehicleSizeMin,vVehicleSizeMax)
IF IS_THIS_MODEL_A_HELI(vehModel)
//choppers seem to have unreasonably large dimensions. Much larger than their blades.
vMaxAllowableSize.x += 3
vMaxAllowableSize.y += 3
ENDIF
IF ENUM_TO_INT(vehModel) = HASH("zentorno") //#1696370
OR ENUM_TO_INT(vehModel) = HASH("btype") //#1738925
OR ENUM_TO_INT(vehModel) = HASH("dubsta3") //#1846988
OR ENUM_TO_INT(vehModel) = HASH("Monster") //#1891164
vMaxAllowableSize *= 1.1
ELIF ENUM_TO_INT(vehModel) = HASH("t20") //#2333237 & 2335303
OR ENUM_TO_INT(vehModel) = HASH("virgo") //#2345087
vMaxAllowableSize *= 1.2
ENDIF
IF vVehicleSizeMax.x - vVehicleSizeMin.x > vMaxAllowableSize.x
CPRINTLN(DEBUG_MISSION, "#TU PRIVATE_REPOSITION_VEHICLES_INSIDE_ANGLED_AREA - vehicle X too large [", vVehicleSizeMax.x - vVehicleSizeMin.x, " > ", vMaxAllowableSize.x, "]")
bAllowPlayerLastVehicle = FALSE
ELIF vVehicleSizeMax.y - vVehicleSizeMin.y > vMaxAllowableSize.y
CPRINTLN(DEBUG_MISSION, "#TU PRIVATE_REPOSITION_VEHICLES_INSIDE_ANGLED_AREA - vehicle Y too large [", vVehicleSizeMax.y - vVehicleSizeMin.y, " > ", vMaxAllowableSize.y, "]")
bAllowPlayerLastVehicle = FALSE
ELIF vVehicleSizeMax.z - vVehicleSizeMin.z > vMaxAllowableSize.z
CPRINTLN(DEBUG_MISSION, "#TU PRIVATE_REPOSITION_VEHICLES_INSIDE_ANGLED_AREA - vehicle Z too large [", vVehicleSizeMax.z - vVehicleSizeMin.z, " > ", vMaxAllowableSize.z, "]")
bAllowPlayerLastVehicle = FALSE
ELSE
CPRINTLN(DEBUG_MISSION, "#TU PRIVATE_REPOSITION_VEHICLES_INSIDE_ANGLED_AREA - vehicle within size limits")
ENDIF
ENDIF
endif
IF IS_VEHICLE_DRIVEABLE(veh)
IF bAllowPlayerLastVehicle
CLEAR_AREA_OF_VEHICLES(vMoveToCoord,5)
SET_ENTITY_HEADING(veh,fMoveToHeading)
SET_ENTITY_COORDS(veh,vMoveToCoord)
set_vehicle_on_ground_properly(veh)
IF EngineOffDoorsClosed
SET_VEHICLE_ENGINE_ON(veh, FALSE, TRUE)
SET_VEHICLE_DOORS_SHUT(veh,TRUE)
ENDIF
CPRINTLN(DEBUG_MISSION, "PRIVATE_REPOSITION_VEHICLES_INSIDE_ANGLED_AREA - player last vehicle ", GET_MODEL_NAME_OF_VEHICLE_FOR_DEBUG_ONLY(veh), " repositioned ", vMoveToCoord)
else
if NOT IS_ENTITY_A_MISSION_ENTITY(veh)
OR NOT DOES_ENTITY_BELONG_TO_THIS_SCRIPT(veh)
SET_ENTITY_AS_MISSION_ENTITY(veh,true,true)
ENDIF
IF IS_PED_IN_VEHICLE(player_ped_id(),veh)
SET_ENTITY_COORDS(player_ped_id(),GET_ENTITY_COORDS(veh))
ENDIF
DELETE_VEHICLE(veh)
CPRINTLN(DEBUG_MISSION, "PRIVATE_REPOSITION_VEHICLES_INSIDE_ANGLED_AREA - player last vehicle ", GET_MODEL_NAME_OF_VEHICLE_FOR_DEBUG_ONLY(veh), " deleted")
endif
endif
endif
//These two were in the previous vehicle check. Removing as these should prob be done on a case by case basis. Want to try and leave things as the player found them.
//SET_VEHICLE_DOORS_SHUT(veh, true)
//SET_VEHICLE_ENGINE_ON(veh, FALSE, TRUE)
// Kenneth R.
// Pass the vehicle over to the vehicle gen controller script so that it persists until the player interacts with it.
/*
if IS_VEHICLE_DRIVEABLE(veh)
SET_VEHICLE_ON_GROUND_PROPERLY(veh)
IF setVehicleAsVehGen
// Cleanup previous vehgens that have been used for mission vehicles
IF GET_VEHICLE_GEN_VEHICLE_INDEX(VEHGEN_MISSION_VEH) != veh
CLEANUP_MISSION_VEHICLE_GEN_VEHICLE()
SET_MISSION_VEHICLE_GEN_VEHICLE(veh, <<0.0,0.0,0.0>>, 0.0)
ENDIF
ENDIF
ENDIF
*/
IF bClearAngledArea
CLEAR_ANGLED_AREA_OF_VEHICLES(VecCoors1, VecCoors2, AreaWidth)
ENDIF
IF bSetAsMissonEntity = TRUE
IF DOES_ENTITY_EXIST(veh)
IF IS_ENTITY_A_MISSION_ENTITY(veh)
CPRINTLN(DEBUG_MISSION, "PRIVATE_REPOSITION_VEHICLES_INSIDE_ANGLED_AREA - player last vehicle ", GET_MODEL_NAME_OF_VEHICLE_FOR_DEBUG_ONLY(veh), " SET_VEHICLE_AS_NO_LONGER_NEEDED ")
SET_VEHICLE_AS_NO_LONGER_NEEDED(veh)
ENDIF
ENDIF
ENDIF
ELSE
if not IS_ENTITY_A_MISSION_ENTITY(veh)
SET_ENTITY_AS_MISSION_ENTITY(veh)
ENDIF
//warp peds from undriveable car and delete undriveable car.
ped_index aPed
aPed = GET_PED_IN_VEHICLE_SEAT(veh,VS_DRIVER)
IF DOES_ENTITY_EXIST(aPed) AND NOT IS_PED_INJURED(aPed)
SET_ENTITY_COORDS(aPed,GET_ENTITY_COORDS(aPed))
ENDIF
int iSeats = GET_VEHICLE_MODEL_NUMBER_OF_SEATS(GET_ENTITY_MODEL(veh))
IF iSeats <= 2
aPed = GET_PED_IN_VEHICLE_SEAT(veh,VS_FRONT_RIGHT)
IF DOES_ENTITY_EXIST(aPed) AND NOT IS_PED_INJURED(aPed)
SET_ENTITY_COORDS(aPed,GET_ENTITY_COORDS(aPed))
ENDIF
ENDIF
IF iSeats <= 4
aPed = GET_PED_IN_VEHICLE_SEAT(veh,VS_BACK_LEFT)
IF DOES_ENTITY_EXIST(aPed) AND NOT IS_PED_INJURED(aPed)
SET_ENTITY_COORDS(aPed,GET_ENTITY_COORDS(aPed))
ENDIF
aPed = GET_PED_IN_VEHICLE_SEAT(veh,VS_BACK_RIGHT)
IF DOES_ENTITY_EXIST(aPed) AND NOT IS_PED_INJURED(aPed)
SET_ENTITY_COORDS(aPed,GET_ENTITY_COORDS(aPed))
ENDIF
ENDIF
#IF USE_CLF_DLC
if spy_vehicle_is_this_vehicle_the_spy_vehicle(veh)
spy_vehicle_delete_spy_vehicle()
else
delete_vehicle(veh)
endif
#ENDIF
#IF NOT USE_CLF_DLC
delete_vehicle(veh)
#ENDIF
ENDIF
endif
ENDPROC
//-----------SPY_VEHICLE
#IF USE_CLF_DLC
PROC private_reposition_spy_vehicle_and_last_players_vehicle_inside_angled_area(VECTOR VecCoors1, VECTOR VecCoors2, FLOAT AreaWidth, vector vMoveToCoord, float fMoveToHeading, vector spy_veh_move_to_coord, float spy_veh_move_to_heading, vector vMaxAllowableSize, bool bClearAngledArea=TRUE, bool ignoreVehicleInPlayerGarage=TRUE, bool EngineOffDoorsClosed=FALSE, bool allow_make_vehicle_healths_safe = true)
VEHICLE_INDEX veh
bool bVehIsNotSafe
bool bAllowPlayerLastVehicle = TRUE
bool bSetAsMissonEntity = FALSE
if spy_vehicle_does_global_spy_vehicle_exist()
veh = spy_vehicle_get_vehicle_index()
// Bug fix - because CLEAR_ANGLED_AREA_OF_VEHICLES deletes any vehicle classed as abandoned (even if it's outside of the specified area), the player's last vehicle could get deleted
// setting it as a mission entity stops this happening, it's gets set as SET_VEHICLE_AS_NO_LONGER_NEEDED again at the end of the proc
// if not IS_ENTITY_A_MISSION_ENTITY(veh)
// SET_ENTITY_AS_MISSION_ENTITY(veh)
// bSetAsMissonEntity = TRUE
// CPRINTLN(DEBUG_MISSION, "PRIVATE_REPOSITION_VEHICLES_INSIDE_ANGLED_AREA - player last vehicle ", GET_MODEL_NAME_OF_VEHICLE_FOR_DEBUG_ONLY(veh), " SET_ENTITY_AS_MISSION_ENTITY")
// ENDIF
if IS_VEHICLE_DRIVEABLE(veh)
vector vVehicleSizeMin,vVehicleSizeMax
if allow_make_vehicle_healths_safe
make_vehicle_healths_safe(veh)
endif
IF IS_ENTITY_IN_ANGLED_AREA(veh,VecCoors1,VecCoors2,AreaWidth)
bVehIsNotSafe = TRUE
ELSE
vector vCar = GET_ENTITY_COORDS(veh)
IF (vCar.z > VecCoors1.z and vCar.z < VecCoors2.z)
OR (vCar.z > VecCoors2.z and vCar.z < VecCoors1.z)
//find corners of angled area
IF DOES_VEHICLE_OVERLAP_ANGLED_AREA(veh,VecCoors1,VecCoors2,AreaWidth)
bVehIsNotSafe = TRUE
ENDIF
endif
ENDIF
// if the player last vehicle was a taxi that he was passenger in, delete it
//this below was originally added in rev #18 of clearmissionarea.sch. That fix turns out to delete the player from a taxi wherever they are in the map.
//change below to deal with this. See cause, bug 1910193 NG.
if IS_VEHICLE_DRIVEABLE(veh)
IF IS_VEHICLE_MODEL(veh, TAXI)
IF GET_PED_IN_VEHICLE_SEAT(veh, VS_DRIVER) != PLAYER_PED_ID()
AND GET_PED_IN_VEHICLE_SEAT(veh, VS_DRIVER) != NULL
IF GET_DISTANCE_BETWEEN_COORDS((VecCoors1+VecCoors2)/2.0,get_entity_coords(veh)) < 20
//DELETE_VEHICLE(veh) //removed from here so it can be dealth with below.
bVehIsNotSafe = true
bAllowPlayerLastVehicle = FALSE
ENDIF
ENDIF
ENDIF
ENDIF
//if player's last vehicle is in a player garage, don't reposition it and don't let it be deleted.
if ignoreVehicleInPlayerGarage
if IS_VEHICLE_IN_PLAYERS_GARAGE(veh, GET_CURRENT_PLAYER_PED_ENUM(), TRUE)
bVehIsNotSafe = FALSE
ENDIF
ENDIF
if bVehIsNotSafe
//check if vehicle is of the allowable size
IF NOT IS_VECTOR_ZERO(vMaxAllowableSize)
IF IS_VEHICLE_DRIVEABLE(veh)
model_names vehModel
vehModel = GET_ENTITY_MODEL(veh)
// vector vVehicleSizeMinb,vVehicleSizeMax
GET_MODEL_DIMENSIONS(vehModel,vVehicleSizeMin,vVehicleSizeMax)
If IS_THIS_MODEL_A_HELI(vehModel)
//choppers seem to have unreasonably large dimensions. Much larger than their blades.
vMaxAllowableSize.x += 3
vMaxAllowableSize.y += 3
ENDIF
// cprintln(debug_trevor3,vVehicleSizeMax," ",vMaxAllowableSize)
#IF NOT USE_TU_CHANGES
IF vVehicleSizeMax.x - vVehicleSizeMin.x > vMaxAllowableSize.x
CPRINTLN(DEBUG_MISSION, "PRIVATE_REPOSITION_VEHICLES_INSIDE_ANGLED_AREA - vehicle X too large")
bAllowPlayerLastVehicle = FALSE
ELIF vVehicleSizeMax.y - vVehicleSizeMin.y > vMaxAllowableSize.y
CPRINTLN(DEBUG_MISSION, "PRIVATE_REPOSITION_VEHICLES_INSIDE_ANGLED_AREA - vehicle Y too large")
bAllowPlayerLastVehicle = FALSE
ELIF vVehicleSizeMax.z - vVehicleSizeMin.z > vMaxAllowableSize.z
CPRINTLN(DEBUG_MISSION, "PRIVATE_REPOSITION_VEHICLES_INSIDE_ANGLED_AREA - vehicle Z too large")
bAllowPlayerLastVehicle = FALSE
ELSE
CPRINTLN(DEBUG_MISSION, "PRIVATE_REPOSITION_VEHICLES_INSIDE_ANGLED_AREA - vehicle within size limits")
ENDIF
#ENDIF
#IF USE_TU_CHANGES
IF ENUM_TO_INT(vehModel) = HASH("zentorno") //#1696370
OR ENUM_TO_INT(vehModel) = HASH("btype") //#1738925
OR ENUM_TO_INT(vehModel) = HASH("dubsta3") //#1846988
OR ENUM_TO_INT(vehModel) = HASH("Monster") //#1891164
vMaxAllowableSize *= 1.1
ENDIF
IF vVehicleSizeMax.x - vVehicleSizeMin.x > vMaxAllowableSize.x
CPRINTLN(DEBUG_MISSION, "#TU PRIVATE_REPOSITION_VEHICLES_INSIDE_ANGLED_AREA - vehicle X too large [", vVehicleSizeMax.x - vVehicleSizeMin.x, " > ", vMaxAllowableSize.x, "]")
bAllowPlayerLastVehicle = FALSE
ELIF vVehicleSizeMax.y - vVehicleSizeMin.y > vMaxAllowableSize.y
CPRINTLN(DEBUG_MISSION, "#TU PRIVATE_REPOSITION_VEHICLES_INSIDE_ANGLED_AREA - vehicle Y too large [", vVehicleSizeMax.y - vVehicleSizeMin.y, " > ", vMaxAllowableSize.y, "]")
bAllowPlayerLastVehicle = FALSE
ELIF vVehicleSizeMax.z - vVehicleSizeMin.z > vMaxAllowableSize.z
CPRINTLN(DEBUG_MISSION, "#TU PRIVATE_REPOSITION_VEHICLES_INSIDE_ANGLED_AREA - vehicle Z too large [", vVehicleSizeMax.z - vVehicleSizeMin.z, " > ", vMaxAllowableSize.z, "]")
bAllowPlayerLastVehicle = FALSE
ELSE
CPRINTLN(DEBUG_MISSION, "#TU PRIVATE_REPOSITION_VEHICLES_INSIDE_ANGLED_AREA - vehicle within size limits")
ENDIF
#ENDIF
ENDIF
endif
IF IS_VEHICLE_DRIVEABLE(veh)
IF bAllowPlayerLastVehicle
CLEAR_AREA_OF_VEHICLES(spy_veh_move_to_coord,5)
SET_ENTITY_HEADING(veh,spy_veh_move_to_heading)
SET_ENTITY_COORDS(veh,spy_veh_move_to_coord)
set_vehicle_on_ground_properly(veh)
IF EngineOffDoorsClosed
SET_VEHICLE_ENGINE_ON(veh, FALSE, TRUE)
SET_VEHICLE_DOORS_SHUT(veh,TRUE)
ENDIF
CPRINTLN(DEBUG_MISSION, "PRIVATE_REPOSITION_VEHICLES_INSIDE_ANGLED_AREA - player last vehicle ", GET_MODEL_NAME_OF_VEHICLE_FOR_DEBUG_ONLY(veh), " repositioned")
else
if NOT IS_ENTITY_A_MISSION_ENTITY(veh)
OR NOT DOES_ENTITY_BELONG_TO_THIS_SCRIPT(veh)
SET_ENTITY_AS_MISSION_ENTITY(veh,true,true)
ENDIF
IF IS_PED_IN_VEHICLE(player_ped_id(),veh)
SET_ENTITY_COORDS(player_ped_id(),GET_ENTITY_COORDS(veh))
ENDIF
DELETE_VEHICLE(veh)
CPRINTLN(DEBUG_MISSION, "PRIVATE_REPOSITION_VEHICLES_INSIDE_ANGLED_AREA - player last vehicle ", GET_MODEL_NAME_OF_VEHICLE_FOR_DEBUG_ONLY(veh), " deleted")
endif
endif
endif
IF bClearAngledArea
CLEAR_ANGLED_AREA_OF_VEHICLES(VecCoors1, VecCoors2, AreaWidth)
ENDIF
IF bSetAsMissonEntity = TRUE
IF DOES_ENTITY_EXIST(veh)
IF IS_ENTITY_A_MISSION_ENTITY(veh)
SET_VEHICLE_AS_NO_LONGER_NEEDED(veh)
CPRINTLN(DEBUG_MISSION, "PRIVATE_REPOSITION_VEHICLES_INSIDE_ANGLED_AREA - player last vehicle ", GET_MODEL_NAME_OF_VEHICLE_FOR_DEBUG_ONLY(veh), " SET_VEHICLE_AS_NO_LONGER_NEEDED")
ENDIF
ENDIF
ENDIF
ELSE
if not IS_ENTITY_A_MISSION_ENTITY(veh)
SET_ENTITY_AS_MISSION_ENTITY(veh)
ENDIF
//warp peds from undriveable car and delete undriveable car.
ped_index aPed
aPed = GET_PED_IN_VEHICLE_SEAT(veh,VS_DRIVER)
IF DOES_ENTITY_EXIST(aPed) AND NOT IS_PED_INJURED(aPed)
SET_ENTITY_COORDS(aPed,GET_ENTITY_COORDS(aPed))
ENDIF
int iSeats = GET_VEHICLE_MODEL_NUMBER_OF_SEATS(GET_ENTITY_MODEL(veh))
IF iSeats <= 2
aPed = GET_PED_IN_VEHICLE_SEAT(veh,VS_FRONT_RIGHT)
IF DOES_ENTITY_EXIST(aPed) AND NOT IS_PED_INJURED(aPed)
SET_ENTITY_COORDS(aPed,GET_ENTITY_COORDS(aPed))
ENDIF
ENDIF
IF iSeats <= 4
aPed = GET_PED_IN_VEHICLE_SEAT(veh,VS_BACK_LEFT)
IF DOES_ENTITY_EXIST(aPed) AND NOT IS_PED_INJURED(aPed)
SET_ENTITY_COORDS(aPed,GET_ENTITY_COORDS(aPed))
ENDIF
aPed = GET_PED_IN_VEHICLE_SEAT(veh,VS_BACK_RIGHT)
IF DOES_ENTITY_EXIST(aPed) AND NOT IS_PED_INJURED(aPed)
SET_ENTITY_COORDS(aPed,GET_ENTITY_COORDS(aPed))
ENDIF
ENDIF
spy_vehicle_delete_spy_vehicle()
ENDIF
endif
//resolve the last players vehicle
PRIVATE_REPOSITION_VEHICLES_INSIDE_ANGLED_AREA(VecCoors1, VecCoors2, AreaWidth, vMoveToCoord, fMoveToHeading, vMaxAllowableSize, bClearAngledArea, TRUE, ignoreVehicleInPlayerGarage, EngineOffDoorsClosed, allow_make_vehicle_healths_safe)
ENDPROC
#endif
//----------
//handy for checking if any vehicles are blocking an area near a ped. Uses the overlapping command above
FUNC BOOL CHECK_AREA_NEAR_TO_PED_FREE_OF_CARS(PED_INDEX pedToCheck,vector vLocate1,vector vLocate2, float areaWidth)
VEHICLE_INDEX vehCars[20]
int iNumCars
int i
IF NOT IS_PED_INJURED(pedToCheck)
iNumCars = GET_PED_NEARBY_VEHICLES(pedToCheck,vehCars)
FOR i = 0 to iNumCars-1
IF IS_VEHICLE_DRIVEABLE(vehCars[i])
IF DOES_VEHICLE_OVERLAP_ANGLED_AREA(vehCars[i],vLocate1,vLocate2,areaWidth)
RETURN FALSE
ENDIF
ENDIF
ENDFOR
ENDIF
RETURN TRUE
ENDFUNC