Files
2025-09-29 00:52:08 +02:00

406 lines
15 KiB
XML
Executable File

USING "commands_misc.sch"
USING "commands_object.sch"
USING "commands_script.sch"
USING "globals.sch"
ENUM AREA_CHECK_AREAS
AC_NONE=0,
AC_GOLF_COURSE,
AC_AIRPORT_AIRSIDE,
AC_MILITARY_BASE,
AC_PRISON,
AC_BIOTECH,
AC_MILITARY_DOCKS,
AC_MOVIE_STUDIO,
AC_DOWNTOWN_POLICE,
AC_END
ENDENUM
//CONST_INT TOTAL_AC_AREAS 5 //ENUM_TO_INT(AC_END)
//STRING g_sAreaSuppressedByThisScript[TOTAL_AC_AREAS]
CONST_INT TOTAL_SUB_AREAS 15
// Debug
#IF IS_DEBUG_BUILD
BOOL bRADebugSpam = FALSE
#ENDIF
/// PURPOSE:
/// Get the nominal centre point of a restricted area
/// PARAMS:
/// eArea - Area check enum for area you want to check
/// RETURNS:
/// Centre point coordinates for the restricted area
FUNC VECTOR GET_AREACHECK_CENTRE_POINT(AREA_CHECK_AREAS eArea)
SWITCH eArea
CASE AC_GOLF_COURSE RETURN << -1155.8766, 48.3426, 52.4985 >> BREAK
CASE AC_AIRPORT_AIRSIDE RETURN << -1245.12, -2818.38, 12.94 >> BREAK
CASE AC_MILITARY_BASE RETURN << -2176.19, 3092.07, 31.81 >> BREAK
CASE AC_PRISON RETURN << 1701.6664, 2586.2612, 51.4925 >> BREAK
CASE AC_BIOTECH RETURN << 3525.0576, 3711.3232, 35.6423 >> BREAK
CASE AC_MILITARY_DOCKS RETURN << 548.1421, -3157.9612, 5.0696 >> BREAK
CASE AC_MOVIE_STUDIO RETURN << -1142.4111, -526.4487, 31.6878 >> BREAK
CASE AC_DOWNTOWN_POLICE RETURN << 456.8879, -985.2783, 35.6895 >> BREAK
ENDSWITCH
RETURN <<0,0,0>>
ENDFUNC
/// PURPOSE:
/// Get the proximity check range, squared, of a restricted area
/// PARAMS:
/// eArea - Area check enum for area you want to check
/// RETURNS:
/// Square of the check distance
FUNC FLOAT GET_AREACHECK_RANGE(AREA_CHECK_AREAS eArea)
SWITCH eArea
CASE AC_GOLF_COURSE RETURN 1000000.0 BREAK
CASE AC_AIRPORT_AIRSIDE RETURN 1000000.0 BREAK
CASE AC_MILITARY_BASE RETURN 1500000.0 BREAK
CASE AC_PRISON RETURN 500000.0 BREAK
CASE AC_BIOTECH RETURN 500000.0 BREAK
CASE AC_MILITARY_DOCKS RETURN 500000.0 BREAK
CASE AC_MOVIE_STUDIO RETURN 500000.0 BREAK
CASE AC_DOWNTOWN_POLICE RETURN 500000.0 BREAK
ENDSWITCH
RETURN 0.0
ENDFUNC
/// PURPOSE:
/// Do a quick proximity check to prevent doing the full check when not needed.
/// You should then do an IS_COORD_IN_SPECIFIED_AREA check if this returns true.
/// PARAMS:
/// eArea - Area you want to check
/// vPlayerCoords - Coordinates you want to check -
/// RETURNS:
/// TRUE if in active range for this area
FUNC BOOL IS_AREACHECK_IN_ACTIVE_RANGE(AREA_CHECK_AREAS eArea, VECTOR vPlayerCoords)
RETURN VDIST2(vPlayerCoords, GET_AREACHECK_CENTRE_POINT(eArea)) < GET_AREACHECK_RANGE(eArea)
ENDFUNC
/// PURPOSE:
/// Checks to see if a given coord lies within the specified area.
/// PARAMS:
/// vInput - Vector of point to check
/// acArea - Area to check
/// iUpperZ - Additional Z to check within from the default z-value for the upper corner of the angled area.
/// RETURNS:
/// TRUE if vInput is within the area checked.
FUNC BOOL IS_COORD_IN_SPECIFIED_AREA(VECTOR vInput, AREA_CHECK_AREAS acArea, INT iUpperZ = 0 #IF USE_TU_CHANGES , BOOL bOverrideZForAll = FALSE #ENDIF )
// USE VDIST2 (VDIST^2) prior to using this check for wanted levels.
VECTOR vPos1[TOTAL_SUB_AREAS]
VECTOR vPos2[TOTAL_SUB_AREAS]
FLOAT fWidth[TOTAL_SUB_AREAS]
INT numberOfSubAreas, i
BOOL bHighlight = FALSE
SWITCH acArea
CASE AC_GOLF_COURSE
vPos1[0] = <<-1332.211304,100.460831,40.384373>>
vPos2[0] = <<-1094.238159,148.427444,73.0>>
fWidth[0] = 171.250000
vPos1[1] = <<-999.734375,-110.223091,25.257057>>
vPos2[1] = <<-1149.493774,109.255829,73.0>>
fWidth[1] = 132.000000
vPos1[2] = <<-1035.112915,-84.958855,28.274601>>
vPos2[2] = <<-1261.103149,50.081482,73.0>>
fWidth[2] = 132.000000
numberOfSubAreas = 3
BREAK
CASE AC_AIRPORT_AIRSIDE
vPos1[0] = <<-804.343872,-3346.500488,10>>
vPos2[0] = <<-1816.953857,-2768.893311,250 + iUpperZ>>
fWidth[0] = 247.000000
vPos1[1] = <<-1911.487915,-2934.197021,10>>
vPos2[1] = <<-968.623596,-3477.747559,250 + iUpperZ>>
fWidth[1] = 149.000000
vPos1[2] = <<-844.943298,-2802.785156,10>>
vPos2[2] = <<-1011.081055,-3086.903809,250 + iUpperZ>>
fWidth[2] = 185.500000
vPos1[3] = <<-1021.086121,-2952.277100,10>>
vPos2[3] = <<-1599.008179,-2616.270508,250 + iUpperZ>>
fWidth[3] = 250.000000
vPos1[4] = <<-1027.136353,-2436.457031,10>>
vPos2[4] = <<-1392.610474,-2226.763428,250 + iUpperZ>>
fWidth[4] = 193.500000
vPos1[5] = <<-1497.549316,-2408.712158,10>>
vPos2[5] = <<-1136.917358,-2617.954590,250 + iUpperZ>>
fWidth[5] = 234.500000
vPos1[6] = <<-982.792358,-2831.708740,12.933130>>
vPos2[6] = <<-966.467651,-2803.458008,16.683130>>
fWidth[6] = 16.000000
vPos1[7] = <<-1110.083130,-3496.805664,12>>
vPos2[7] = <<-1955.298218,-3010.431396,250 + iUpperZ>>
fWidth[7] = 80.00
vPos1[8] = <<-1886.899414,-3193.023682,12>>
vPos2[8] = <<-1836.142944,-3105.268311,250 + iUpperZ>>
fWidth[8] = 142.000
vPos1[9] = <<-1134.336670,-3535.648193,12>>
vPos2[9] = <<-1259.648560,-3463.486328,250 + iUpperZ>>
fWidth[9] =30.750000
vPos1[10] = <<-969.127869,-3463.899414,12>>
vPos2[10] = <<-896.373413,-3505.714844,250 + iUpperZ>>
fWidth[10] = 150.000000
vPos1[11] = <<-1369.491333,-2173.578857,10>>
vPos2[11] = <<-1685.625610,-2720.363525,250 + iUpperZ>>
fWidth[11] = 29.25
vPos1[12] = <<-1010.925598,-3550.943359,10>>
vPos2[12] = <<-1110.197754,-3493.617188,250 + iUpperZ>>
fWidth[12] = 43.00
numberOfSubAreas = 13
BREAK
CASE AC_MILITARY_BASE
vPos1[0] = <<-1773.943970,3287.334229,30>>
vPos2[0] = <<-2029.776489,2845.083252,250 + iUpperZ>>
fWidth[0] =255.000000
vPos1[1] = <<-2725.889404,3291.098633,30>>
vPos2[1] = <<-2009.181519,2879.835205,250 + iUpperZ>>
fWidth[1] =180.000000
vPos1[2] = <<-2442.026123,3326.698730,30>>
vPos2[2] = <<-2033.927856,3089.048828,250 + iUpperZ>>
fWidth[2] =205.000000
vPos1[3] = <<-1917.165405,3374.208984,30>>
vPos2[3] = <<-2016.790894,3195.058105,250 + iUpperZ>>
fWidth[3] =86.250000
vPos1[4] = <<-2192.752930,3373.277832,30>>
vPos2[4] = <<-2191.544434,3150.416504,250 + iUpperZ>>
fWidth[4] =150.500000
vPos1[5] = <<-2077.663330,3344.514160,30>>
vPos2[5] = <<-2191.544434,3150.416504,250 + iUpperZ>>
fWidth[5] =140.500000
vPos1[6] = <<-2861.755371,3352.660645,30>>
vPos2[6] = <<-2715.870850,3269.915527,250 + iUpperZ>>
fWidth[6] =90.000000
vPos1[7] = <<-2005.574463,3364.532715,30>>
vPos2[7] = <<-1977.568848,3330.888184,250 + iUpperZ>>
fWidth[7] =100.000000
vPos1[8] = <<-1682.234985,3004.285156,30>>
vPos2[8] = <<-1942.746948,2947.441162,250 + iUpperZ>>
fWidth[8] =248.750000
// No iUpperZ on these - fringe areas so leniency allowed for cases like Epsilon6
vPos1[9] = <<-2393.295410,2936.406006,31.680103>>
vPos2[9] = <<-2453.036621,3006.863037,52.310028>>
fWidth[9] = 128.00
vPos1[10] = <<-2347.184814,3023.829834,31.565729>>
vPos2[10] = <<-2517.329834,2989.063477,49.956444>>
fWidth[10] = 140.00
vPos1[11] = <<-2259.921875,3358.039795,29.999718>>
vPos2[11] = <<-2299.771973,3385.790039,38.060143>>
fWidth[11] = 16.00
vPos1[12] = <<-2476.309326,3363.914063,31.679329>>
vPos2[12] = <<-2431.980713,3287.669434,39.978264>>
fWidth[12] = 214.25
vPos1[13] = <<-2103.081299,2797.783447,29.378639>>
vPos2[13] = <<-2096.821289,2874.423340,57.809891>>
fWidth[13] = 65.75
#IF USE_TU_CHANGES
// Updated for DLC_Assassin3.sc - military base assassination - x:\gta5\script\dev_network\singleplayer\scripts\missions\DLC_Assassinations\DLC_Assassin3.sc
// Needed to override z values of the fringe areas of the base
INT iFringeUpperZ
// No iUpperZ on these - fringe areas so leniency allowed for cases like Epsilon6
IF bOverrideZForAll
iFringeUpperZ = iUpperZ
ELSE
iFringeUpperZ = 0
ENDIF
vPos2[9].z += iFringeUpperZ
vPos2[10].z += iFringeUpperZ
vPos2[11].z += iFringeUpperZ
vPos2[12].z += iFringeUpperZ
vPos2[13].z += iFringeUpperZ
#ENDIF
numberOfSubAreas = 14
BREAK
CASE AC_PRISON
vPos1[0] = <<1541.607178,2527.554932,40>>
vPos2[0] = <<1815.575317,2535.059570,150 + iUpperZ>>
fWidth[0] = 114.000000
vPos1[1] = <<1788.878662,2445.727295,40>>
vPos2[1] = <<1716.960327,2502.957031,150 + iUpperZ>>
fWidth[1] = 88.500000
vPos1[2] = <<1601.157471,2436.244141,40>>
vPos2[2] = <<1650.077637,2515.922607,150 + iUpperZ>>
fWidth[2] = 133.250000
vPos1[3] = <<1706.330688,2407.597168,40>>
vPos2[3] = <<1698.554565,2460.207764,150 + iUpperZ>>
fWidth[3] = 104.500000
vPos1[4] = <<1712.451660,2756.217529,40>>
vPos2[4] = <<1718.847656,2589.161621,150 + iUpperZ>>
fWidth[4] = 121.750000
vPos1[5] = <<1830.227783,2661.240234,40>>
vPos2[5] = <<1774.812378,2679.418701,150 + iUpperZ>>
fWidth[5] = 84.500000
vPos1[6] = <<1559.050293,2632.220459,40>>
vPos2[6] = <<1657.208252,2595.484375,150 + iUpperZ>>
fWidth[6] = 103.750000
vPos1[7] = <<1612.020874,2716.868896,40>>
vPos2[7] = <<1657.164673,2669.720947,150 + iUpperZ>>
fWidth[7] = 104.250000
vPos1[8] = <<1809.872070,2729.826904,40>>
vPos2[8] = <<1789.855103,2705.036865,150 + iUpperZ>>
fWidth[8] = 91.000000
vPos1[9] = <<1818.788818,2605.947754,40>>
vPos2[9] = <<1783.114258,2606.783203,150 + iUpperZ>>
fWidth[9] = 51.250000
numberOfSubAreas = 10
BREAK
CASE AC_BIOTECH
vPos1[0] = <<3411.001953,3663.184570,20>>
vPos2[0] = <<3615.583008,3626.193604,40 + iUpperZ>>
fWidth[0] = 45.750000
vPos1[1] = <<3426.659912,3733.077881,20>>
vPos2[1] = <<3643.800781,3694.361816,40 + iUpperZ>>
fWidth[1] = 99.000000
vPos1[2] = <<3446.036377,3795.688232,20>>
vPos2[2] = <<3650.914307,3766.151611,40 + iUpperZ>>
fWidth[2] = 81.500000
numberOfSubAreas = 3
BREAK
CASE AC_MILITARY_DOCKS
vPos1[0] = <<526.053040,-3391.496826,-10>>
vPos2[0] = <<523.228943,-3118.677979,10 + iUpperZ>>
fWidth[0] = 120.0
vPos1[1] = <<459.439697,-3199.989502,4.819676>>
vPos2[1] = <<593.892761,-3199.998047,30.069256>>
fWidth[1] = 170.00
vPos1[2] = <<552.846680,-3111.053711,4.819394>>
vPos2[2] = <<585.313721,-3111.844238,17.569231>>
fWidth[2] = 12.50
vPos1[3] = <<598.466553,-3140.147461,4.819257>>
vPos2[3] = <<597.497314,-3117.062744,17.319258>>
fWidth[3] = 9.75
numberOfSubAreas = 4
BREAK
CASE AC_MOVIE_STUDIO
vPos1[0] = <<-1108.549683,-570.879761,20>>
vPos2[0] = <<-1187.810791,-477.503662,50 + iUpperZ>>
fWidth[0] = 162.000000
vPos1[1] = <<-1201.377563,-485.967316,20>>
vPos2[1] = <<-1215.795898,-464.828064,50 + iUpperZ>>
fWidth[1] = 124.000000
vPos1[2] = <<-985.631104,-525.423340,20>>
vPos2[2] = <<-1013.393188,-475.205750,50 + iUpperZ>>
fWidth[2] = 55.000000
vPos1[3] = <<-1055.849243,-477.822601,20>>
vPos2[3] = <<-1073.332520,-498.717010,50 + iUpperZ>>
fWidth[3] = 142.000000
numberOfSubAreas = 4
BREAK
CASE AC_DOWNTOWN_POLICE
// Stairwell to roof
vPos1[0] = <<461.568390,-984.571960,29.439508>>
vPos2[0] = <<471.170044,-984.429199,40.142120>>
fWidth[0] = 7.750000
// Locker room corridor
vPos1[1] = <<457.340393,-984.756042,34.439507>>
vPos2[1] = <<457.208374,-993.718933,29.389584>>
fWidth[1] = 14.750000
// Roof
vPos1[2] = <<477.622681,-986.600037,40.008190>>
vPos2[2] = <<424.868713,-986.327881,48.712406>>
fWidth[2] = 31.500000
vPos1[3] = <<474.388947,-974.461304,39.557606>>
vPos2[3] = <<474.035797,-1021.972107,49.100330>>
fWidth[3] = 30.500000
// Behind front desk
vPos1[4] = <<442.176849,-974.188782,29.689508>>
vPos2[4] = <<442.185516,-979.863525,33.439507>>
fWidth[4] = 6.750000
numberOfSubAreas = 5
BREAK
ENDSWITCH
REPEAT numberOfSubAreas i
IF IS_POINT_IN_ANGLED_AREA(vInput, vPos1[i], vPos2[i], fWidth[i], bHighlight)
#IF IS_DEBUG_BUILD IF bRADebugSpam CPRINTLN(DEBUG_AMBIENT, "IS_COORD_IN_SPECIFIED_AREA: Passed point << ", vInput.x, ",", vInput.y, ",", vInput.z, " >> found in volume ", i, " of ", numberOfSubAreas, " for restricted area ", ENUM_TO_INT(acArea)) ENDIF #ENDIF
RETURN TRUE
ENDIF
ENDREPEAT
#IF IS_DEBUG_BUILD IF bRADebugSpam CPRINTLN(DEBUG_AMBIENT, "IS_COORD_IN_SPECIFIED_AREA: Passed point << ", vInput.x, ",", vInput.y, ",", vInput.z, " >> not in area check for area ", ENUM_TO_INT(acArea)) ENDIF #ENDIF
RETURN FALSE
ENDFUNC
// BOOL bAllowPlayerInActiveRestrictedArea will allow the player to remain in a restricted area after the suppressing script has terminated.
// This is particularly useful in the transition from FBI5a to FBI5b where the player remains in a restricted area off mission.
PROC SUPPRESS_RESTRICTED_AREA_WANTED_LEVEL(AREA_CHECK_AREAS acArea, BOOL bAllowPlayerInActiveRestrictedArea = FALSE)
SET_BIT(g_iRestrictedAreaBitSet, ENUM_TO_INT(acArea))
g_sAreaSuppressedByThisScript[ENUM_TO_INT(acArea)] = GET_THIS_SCRIPT_NAME()
g_bPlayerIsActiveInRestrictedArea[ENUM_TO_INT(acArea)] = bAllowPlayerInActiveRestrictedArea
#if IS_DEBUG_BUILD
PRINTNL()
PRINTSTRING("SUPPRESS_RESTRICTED_AREA_WANTED_LEVEL has been called by ")
PRINTSTRING(GET_THIS_SCRIPT_NAME())
PRINTNL()
#ENDIF
ENDPROC
FUNC BOOL IS_RESTRICTED_AREA_WANTED_LEVEL_SUPPRESSED(AREA_CHECK_AREAS acArea)
IF IS_BIT_SET(g_iRestrictedAreaBitSet, ENUM_TO_INT(acArea))
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
PROC RELEASE_SUPPRESSED_RESTRICTED_AREA_WANTED_LEVEL(AREA_CHECK_AREAS acArea, BOOL bAllowPlayerInActiveRestrictedArea = FALSE)
IF IS_BIT_SET(g_iRestrictedAreaBitSet, ENUM_TO_INT(acArea))
IF NOT bAllowPlayerInActiveRestrictedArea
#if IS_DEBUG_BUILD
PRINTNL()
PRINTSTRING("RELEASE_SUPPRESSED_RESTRICTED_AREA_WANTED_LEVEL cleared this bit = ")
PRINTINT(ENUM_TO_INT(acArea))
PRINTNL()
#ENDIF
CLEAR_BIT(g_iRestrictedAreaBitSet, ENUM_TO_INT(acArea))
g_sAreaSuppressedByThisScript[ENUM_TO_INT(acArea)] = "NULL"
g_bPlayerIsActiveInRestrictedArea[ENUM_TO_INT(acArea)] = bAllowPlayerInActiveRestrictedArea
ENDIF
ELSE
#if IS_DEBUG_BUILD
PRINTNL()
PRINTSTRING("RELEASE_SUPPRESSED_RESTRICTED_AREA_WANTED_LEVEL but this bit is not set = ")
PRINTINT(ENUM_TO_INT(acArea))
PRINTNL()
#ENDIF
ENDIF
ENDPROC
FUNC TEXT_LABEL_23 WANTED_LEVEL_SUPPRESSING_SCRIPT(AREA_CHECK_AREAS acArea)
RETURN g_sAreaSuppressedByThisScript[ENUM_TO_INT(acArea)]
ENDFUNC