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

420 lines
19 KiB
XML
Executable File

//////////////////////////////////////////////////////////////////////////////////////////
// //
// SCRIPT NAME : building_control_public.sch //
// AUTHOR : Kenneth Ross //
// DESCRIPTION : Contains all the public funtions for the building and door //
// states. //
// This deals with both single and multi-player data. //
// //
//////////////////////////////////////////////////////////////////////////////////////////
USING "rage_builtins.sch"
USING "globals.sch"
USING "building_control_private.sch"
PROC REMOVE_IPL_WHEN_SCREEN_IS_FADED_OUT(STRING strIPLName)
// Remove straight away if the screen is faded out
IF IS_SCREEN_FADED_OUT()
IF IS_IPL_ACTIVE(strIPLName)
REMOVE_IPL(strIPLName)
ENDIF
// Otherwise add to a list and let the building controller pick it up
ELSE
INT iIPL
INT iIPLHash = GET_HASH_KEY(strIPLName)
INT iIPLRepeatHash
BOOL bAddedToList = FALSE
INT iFreeSlot = -1
REPEAT MAX_IPLS_TO_TRACK_FOR_REMOVAL iIPL
iIPLRepeatHash = GET_HASH_KEY(g_tlIPLsToRemoveOnFadeOut[iIPL])
IF iIPLRepeatHash = 0
iFreeSlot = iIPL
ENDIF
IF iIPLRepeatHash = iIPLHash
// Already added to list so ignore.
bAddedToList = TRUE
ENDIF
ENDREPEAT
IF NOT bAddedToList
AND iFreeSlot != -1
g_tlIPLsToRemoveOnFadeOut[iFreeSlot] = strIPLName
ENDIF
ENDIF
ENDPROC
PROC REMOVE_IPL_FROM_REMOVAL_LIST(STRING strIPLName)
INT iIPL
INT iIPLHash = GET_HASH_KEY(strIPLName)
REPEAT MAX_IPLS_TO_TRACK_FOR_REMOVAL iIPL
IF GET_HASH_KEY(g_tlIPLsToRemoveOnFadeOut[iIPL]) = iIPLHash
g_tlIPLsToRemoveOnFadeOut[iIPL] = ""
ENDIF
ENDREPEAT
ENDPROC
/// PURPOSE:
/// Add an ipl to a global array which can then be removed when no load scene is active
PROC ADD_IPL_WHEN_NO_LOAD_SCENE_IS_ACTIVE(STRING strIPLName)
// Add straight away if no load scene is active
IF NOT IS_NEW_LOAD_SCENE_ACTIVE()
IF NOT IS_IPL_ACTIVE(strIPLName)
REQUEST_IPL(strIPLName)
ENDIF
// Otherwise add to a list and let the building controller pick it up
ELSE
INT iIPL
INT iIPLHash = GET_HASH_KEY(strIPLName)
INT iIPLRepeatHash
BOOL bAddedToList = FALSE
INT iFreeSlot = -1
REPEAT MAX_IPLS_TO_TRACK_FOR_ADD iIPL
iIPLRepeatHash = GET_HASH_KEY(g_tlIPLsToAddOnNoLoadScene[iIPL])
IF iIPLRepeatHash = 0
iFreeSlot = iIPL
ENDIF
IF iIPLRepeatHash = iIPLHash
// Already added to list so ignore.
bAddedToList = TRUE
ENDIF
ENDREPEAT
IF NOT bAddedToList
AND iFreeSlot != -1
g_tlIPLsToAddOnNoLoadScene[iFreeSlot] = strIPLName
ENDIF
ENDIF
ENDPROC
/// PURPOSE: Updates the state of the specified door enum
///
/// PARAMS:
/// eDoor - The door enum set up in building_globals.sch
/// eNewState - The state that we want to change the door to
PROC SET_DOOR_STATE(DOOR_NAME_ENUM eName, DOOR_STATE_ENUM eNewState)
IF eName <> DUMMY_DOORNAME
// Grab the current saved state
DOOR_STATE_ENUM eCurrentState
IF g_bInMultiplayer
#IF USE_SP_DLC eCurrentState = MPGlobals_OLD.g_MPBuildingData.eDoorState[eName] #ENDIF
#IF NOT USE_SP_DLC
#IF USE_TU_CHANGES eCurrentState = g_MPBuildingData.eDoorState[eName] #ENDIF
#IF NOT USE_TU_CHANGES eCurrentState = MPGlobals_OLD.g_MPBuildingData.eDoorState[eName] #ENDIF
#ENDIF
ELSE
#if USE_CLF_DLC
eCurrentState = g_savedGlobalsClifford.sBuildingData.eDoorState[eName]
#endif
#if USE_NRM_DLC
eCurrentState = g_savedGlobalsnorman.sBuildingData.eDoorState[eName]
#endif
#if not USE_CLF_DLC
#if not USE_NRM_DLC
eCurrentState = g_savedGlobals.sBuildingData.eDoorState[eName]
#endif
#endif
ENDIF
// Only perform any updates if the current state differs from the new state
IF eCurrentState <> eNewState
OR IS_BIT_SET(g_iUpdateDoorStateBitset[ENUM_TO_INT(eName)/32], (ENUM_TO_INT(eName)%32))
// Set the saved state
IF eNewState = DOORSTATE_FORCE_LOCKED_THIS_FRAME
OR eNewState = DOORSTATE_FORCE_UNLOCKED_THIS_FRAME
OR eNewState = DOORSTATE_FORCE_OPEN_THIS_FRAME
OR eNewState = DOORSTATE_FORCE_CLOSED_THIS_FRAME
OR eNewState = DOORSTATE_FORCE_LOCKED_UNTIL_OUT_OF_AREA
SET_BIT(g_iOverrideDoorStateBitset[ENUM_TO_INT(eName)/32], ENUM_TO_INT(eName)%32)
g_eOverrideDoorState[eName] = eNewState
ELSE
IF g_bInMultiplayer
#IF USE_SP_DLC MPGlobals_OLD.g_MPBuildingData.eDoorState[eName] = eNewState #ENDIF
#IF NOT USE_SP_DLC
#IF USE_TU_CHANGES g_MPBuildingData.eDoorState[eName] = eNewState #ENDIF
#IF NOT USE_TU_CHANGES MPGlobals_OLD.g_MPBuildingData.eDoorState[eName] = eNewState #ENDIF
#ENDIF
ELSE
#if USE_CLF_DLC
g_savedGlobalsClifford.sBuildingData.eDoorState[eName] = eNewState
#endif
#if USE_NRM_DLC
g_savedGlobalsnorman.sBuildingData.eDoorState[eName] = eNewState
#endif
#if not USE_CLF_DLC
#if not USE_NRM_DLC
g_savedGlobals.sBuildingData.eDoorState[eName] = eNewState
#endif
#endif
ENDIF
ENDIF
SET_BIT(g_iUpdateDoorStateBitset[ENUM_TO_INT(eName)/32], (ENUM_TO_INT(eName)%32))
PERFORM_DOOR_LOCK(eName)
// If we failed to set it's state, try again the following frame.
IF IS_BIT_SET(g_iUpdateDoorStateBitset[ENUM_TO_INT(eName)/32], (ENUM_TO_INT(eName)%32))
QUEUE_DOOR_UPDATE_FOR_NEXT_FRAME(eName)
ENDIF
ENDIF
ENDIF
ENDPROC
FUNC BUILDING_STATE_ENUM GET_BUILDING_STATE(BUILDING_NAME_ENUM eName)
IF eName <> DUMMY_BUILDINGNAME
IF g_bInMultiplayer
#IF USE_TU_CHANGES RETURN g_MPBuildingData.eBuildingState[eName] #ENDIF
#IF NOT USE_TU_CHANGES RETURN MPGlobals_OLD.g_MPBuildingData.eBuildingState[eName] #ENDIF
ELSE
#if USE_CLF_DLC
RETURN g_savedGlobalsClifford.sBuildingData.eBuildingState[eName]
#endif
#if USE_NRM_DLC
RETURN g_savedGlobalsnorman.sBuildingData.eBuildingState[eName]
#endif
#if not USE_CLF_DLC
#if not USE_NRM_DLC
RETURN g_savedGlobals.sBuildingData.eBuildingState[eName]
#endif
#endif
ENDIF
ENDIF
RETURN BUILDINGSTATE_NORMAL
ENDFUNC
/// PURPOSE: Updates the state of the specified building enum
///
/// PARAMS:
/// eBuilding - The building enum set up in building_globals.sch
/// eNewState - The state that we want to change the building to
PROC SET_BUILDING_STATE(BUILDING_NAME_ENUM eName, BUILDING_STATE_ENUM eNewState, BOOL bWaitForPlayerToLeaveArea = FALSE, BOOL bRefreshInterior = TRUE, BOOL bIgnorePlayerDeathCheck = FALSE)
IF eName <> DUMMY_BUILDINGNAME
CPRINTLN(DEBUG_BUILDING, "SET_BUILDING_STATE(", eName, ", ", eNewState, ", ", bWaitForPlayerToLeaveArea, ", ", bRefreshInterior, ") called by ", GET_THIS_SCRIPT_NAME(), ".")
IF g_bInMultiplayer
#IF USE_SP_DLC MPGlobals_OLD.g_MPBuildingData.eBuildingState[eName] = eNewState #ENDIF
#IF NOT USE_SP_DLC
#IF USE_TU_CHANGES g_MPBuildingData.eBuildingState[eName] = eNewState #ENDIF
#IF NOT USE_TU_CHANGES MPGlobals_OLD.g_MPBuildingData.eBuildingState[eName] = eNewState #ENDIF
#ENDIF
ELSE
#if USE_CLF_DLC
g_savedGlobalsClifford.sBuildingData.eBuildingState[eName] = eNewState
#endif
#if USE_NRM_DLC
g_savedGlobalsnorman.sBuildingData.eBuildingState[eName] = eNewState
#endif
#if not USE_CLF_DLC
#if not USE_NRM_DLC
g_savedGlobals.sBuildingData.eBuildingState[eName] = eNewState
#endif
#endif
ENDIF
g_bBuildingStateUpdateDelay[eName] = bWaitForPlayerToLeaveArea
// Set the global flag so the building_controller can pick
// it up if we fail to perfrom the state change this frame.
g_bUpdateBuildingState[eName] = TRUE
PERFORM_BUILDING_SWAP(eName, bRefreshInterior, bIgnorePlayerDeathCheck)
SET_BUILDING_STATE_ASSOCIATED_FEATURES( eName, eNewState )
ENDIF
ENDPROC
/// PURPOSE: Force the buidling controller to re-apply any road node blocking areas.
PROC UPDATE_ALL_BUILDING_STATE_BLOCKS()
INT i
REPEAT NUMBER_OF_BUILDINGS i
g_bBuildingRoadNodeBlockUpdate[i] = TRUE
ENDREPEAT
ENDPROC
/// PURPOSE:
/// Returns whether the given interior is a road tunnel (shouldn't clear shop blips while inside)
/// POPULATE_ROAD_TUNNEL_INTERIOR_INDEX_LIST() must be called in order to use this.
FUNC BOOL IS_INTERIOR_A_ROAD_TUNNEL(INTERIOR_INSTANCE_INDEX intIdx)
INT iIndex
REPEAT gRoadTunnelCount iIndex
IF g_intRoadTunnels[iIndex] = intIdx
RETURN TRUE
ENDIF
ENDREPEAT
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Manually populates the list of road tunnel interior indices for checking if an interior is a road tunnel
PROC POPULATE_ROAD_TUNNEL_INTERIOR_INDEX_LIST()
g_intRoadTunnels[0] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< -1190.58, -685.387, 11.0753 >>,"sm20_tun4")
g_intRoadTunnels[1] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< -1292.36, -730.629, 11.0934 >>,"sm20_tun3")
g_intRoadTunnels[2] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< -1411.97, -759.518, 15.5455 >>,"sm20_tun2")
g_intRoadTunnels[3] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< -1531.56, -762.391, 15.3451 >>,"sm20_tun1")
g_intRoadTunnels[4] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< -573.473, -580.793, 25.3082 >>,"kt1_04_roadtunnel_int")
g_intRoadTunnels[5] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< -675.628, -606.272, 25.3078 >>,"kt1_03_carpark_int")
g_intRoadTunnels[6] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< 274.441, -636.403, 29.0854 >>,"dt1_rd1_tun3")
g_intRoadTunnels[7] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< 142.198, -581.121, 31.2974 >>,"dt1_rd1_tun2")
g_intRoadTunnels[8] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< 204.925, -601.567, 29.3757 >>,"dt1_rd1_tun")
g_intRoadTunnels[9] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< 2159.62, 5995.87, 51.2999 >>,"cs2_roadsb_tunnel_03")
g_intRoadTunnels[10] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< 2250.3, 5915.56, 49.6273 >>,"cs2_roadsb_tunnel_02")
g_intRoadTunnels[11] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< 2341.18, 5814.9, 46.7075 >>,"cs2_roadsb_tunnel_01")
g_intRoadTunnels[12] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< -183.656, 4664.52, 130.5 >>,"cs1_12_tunnel03_int")
g_intRoadTunnels[13] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< -273.86, 4752.12, 138.21 >>,"cs1_12_tunnel02_int")
g_intRoadTunnels[14] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< -410.302, 4860.98, 144.864 >>,"cs1_12_tunnel01_int")
g_intRoadTunnels[15] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< -2596.83, 3088.87, 15.4225 >>,"ch1_roadsdint_tun2")
g_intRoadTunnels[16] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< -2583.04, 3268.07, 13.3157 >>,"ch1_roadsdint_tun1")
g_intRoadTunnels[17] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< -179.51, -180.189, 43.6251 >>,"bt1_04_carpark")
ENDPROC
/// PURPOSE:
/// Returns whether the given interior is a tunnel (shouldn't clear shop blips while inside)
/// RETURNS:
///
FUNC BOOL IS_INTERIOR_A_TUNNEL(INTERIOR_INSTANCE_INDEX intIdx)
int i = 0
FOR i = 0 to gTunnelCount -1
IF g_intTunnels[i] = intIdx
return TRUE
ENDIF
ENDFOR
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Manually populates the list of tunnel interior indices for checking if an interior is an open-air tunnel
PROC POPULATE_TUNNEL_INTERIOR_INDEX_LIST()
g_intTunnels[0] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< -1680.49, -929.44, -0.462531 >>,"vbca_tunnel1")
g_intTunnels[1] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< -1562.04, -876.91, -0.471913 >>,"vbca_tunnel2")
g_intTunnels[2] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< -1429.65, -823.211, -0.432763 >>,"vbca_tunnel3")
g_intTunnels[3] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< -1316.9, -843.515, 1.43639 >>,"vbca_tunnel4")
g_intTunnels[4] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< -1249.67, -896.27, 0.293292 >>,"vbca_tunnel5")
g_intTunnels[5] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< -38.9818, -570.534, 28.4812 >>,"v_31_tun_01")
g_intTunnels[6] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< 481.908, -577.602, 2.41908 >>,"v_31_newtunnel1")
g_intTunnels[7] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< 1029.02, -260.955, 48.2681 >>,"v_31_newtun5")
g_intTunnels[8] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< 1022.25, -205.648, 42.8956 >>,"v_31_newtun4b")
g_intTunnels[9] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< 823.852, -299.823, 4.54864 >>,"v_31_newtun3")
g_intTunnels[0] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< 615.395, -409.282, -1.57599 >>,"v_31_newtun2")
g_intTunnels[11] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< -1190.58, -685.387, 11.0753 >>,"sm20_tun4")
g_intTunnels[12] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< -1292.36, -730.629, 11.0934 >>,"sm20_tun3")
g_intTunnels[13] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< -1411.97, -759.518, 15.5455 >>,"sm20_tun2")
g_intTunnels[14] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< -1531.56, -762.391, 15.3451 >>,"sm20_tun1")
g_intTunnels[15] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< 558.653, -1486.49, 21.4096 >>,"sc1_rd_inttunshort")
g_intTunnels[16] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< 569.673, -1920.17, 21.1009 >>,"sc1_rd_inttun3b_end")
g_intTunnels[17] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< 512.412, -1908.55, 21.2086 >>,"sc1_rd_inttun3b")
g_intTunnels[18] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< 434.343, -1945.27, 17.3936 >>,"sc1_rd_inttun3")
g_intTunnels[19] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< 513.914, -2009.82, 21.1486 >>,"sc1_rd_inttun2b_end")
g_intTunnels[20] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< 465.139, -2025.49, 19.4406 >>,"sc1_rd_inttun2b")
g_intTunnels[21] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< 406.938, -1978.14, 16.3512 >>,"sc1_rd_inttun2")
g_intTunnels[22] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< 319.321, -1896.97, 22.4086 >>,"sc1_rd_inttun1")
g_intTunnels[23] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< -573.473, -580.793, 25.3082 >>,"kt1_04_roadtunnel_int")
g_intTunnels[24] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< -675.628, -606.272, 25.3078 >>,"kt1_03_carpark_int")
g_intTunnels[25] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< 1314.63, -904.059, 53.0877 >>,"id2_21_a_tun5")
g_intTunnels[26] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< 1248.64, -773.6, 44.5493 >>,"id2_21_a_tun4")
g_intTunnels[27] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< 1213.45, -597.799, 37.7533 >>,"id2_21_a_tun3")
g_intTunnels[28] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< 1083.25, -502.542, 34.6573 >>,"id2_21_a_tun2")
g_intTunnels[29] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< 926.428, -488.737, 33.8564 >>,"id2_21_a_tun1")
g_intTunnels[30] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< 732.663, -2486.45, 11.0686 >>,"id1_11_tunnel8_int")
g_intTunnels[31] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< 749.494, -2364.79, 16.2255 >>,"id1_11_tunnel7_int")
g_intTunnels[32] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< 758.957, -2260.08, 23.4637 >>,"id1_11_tunnel6_int")
g_intTunnels[33] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< 769.889, -2124.24, 21.8223 >>,"id1_11_tunnel5_int")
g_intTunnels[34] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< 789.138, -1963.58, 20.6408 >>,"id1_11_tunnel4_int")
g_intTunnels[35] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< 815.852, -1832.2, 22.9671 >>,"id1_11_tunnel3_int")
g_intTunnels[36] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< 829.752, -1718.51, 20.4594 >>,"id1_11_tunnel2_int")
g_intTunnels[37] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< 829.845, -1718.51, 20.1823 >>,"id1_11_tunnel1_int")
g_intTunnels[38] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< 274.441, -636.403, 29.0854 >>,"dt1_rd1_tun3")
g_intTunnels[39] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< 142.198, -581.121, 31.2974 >>,"dt1_rd1_tun2")
g_intTunnels[40] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< 204.925, -601.567, 29.3757 >>,"dt1_rd1_tun")
g_intTunnels[41] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< 2571.05, 3907.95, 41.1896 >>,"cs4_rwayb_tunnelint")
g_intTunnels[42] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< -493.613, 4275.55, 89.1677 >>,"cs3_03railtunnel_int4")
g_intTunnels[43] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< -476.018, 4201.55, 87.9392 >>,"cs3_03railtunnel_int3")
g_intTunnels[44] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< -457.748, 4125.51, 86.1208 >>,"cs3_03railtunnel_int2")
g_intTunnels[45] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< -442.948, 4064.86, 84.1041 >>,"cs3_03railtunnel_int1")
g_intTunnels[46] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< 2159.62, 5995.87, 51.2999 >>,"cs2_roadsb_tunnel_03")
g_intTunnels[47] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< 2250.3, 5915.56, 49.6273 >>,"cs2_roadsb_tunnel_02")
g_intTunnels[48] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< 2341.18, 5814.9, 46.7075 >>,"cs2_roadsb_tunnel_01")
g_intTunnels[49] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< -537.422, 4613.09, 89.7512 >>,"cs1_14brailway6")
g_intTunnels[50] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< -540.452, 4719.74, 89.7576 >>,"cs1_14brailway5")
g_intTunnels[51] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< -543.783, 4821.95, 89.7357 >>,"cs1_14brailway4")
g_intTunnels[52] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< -546.036, 4923.02, 89.8919 >>,"cs1_14brailway3")
g_intTunnels[53] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< -546.265, 4999.07, 90.8104 >>,"cs1_14brailway2")
g_intTunnels[54] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< -539.261, 5077.03, 91.6235 >>,"cs1_14brailway1")
g_intTunnels[55] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< -183.656, 4664.52, 130.5 >>,"cs1_12_tunnel03_int")
g_intTunnels[56] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< -273.86, 4752.12, 138.21 >>,"cs1_12_tunnel02_int")
g_intTunnels[57] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< -410.302, 4860.98, 144.864 >>,"cs1_12_tunnel01_int")
g_intTunnels[58] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< -2596.83, 3088.87, 15.4225 >>,"ch1_roadsdint_tun2")
g_intTunnels[59] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< -2583.04, 3268.07, 13.3157 >>,"ch1_roadsdint_tun1")
g_intTunnels[60] = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< -179.51, -180.189, 43.6251 >>,"bt1_04_carpark")
ENDPROC
#IF FEATURE_FOW_EXPANSION
PROC CONFIGURE_FOW_FOR_SP()
CPRINTLN(DEBUG_BUILDING, "[FOW] CONFIGURE_FOW_FOR_SP() called by script ", GET_THIS_SCRIPT_NAME())
SET_MINIMAP_FOW_DO_NOT_UPDATE(FALSE)
ENABLE_MINIMAP_FOW_CUSTOM_WORLD_EXTENTS(FALSE)
ENDPROC
PROC CONFIGURE_FOW_FOR_MP_MAIN()
CPRINTLN(DEBUG_BUILDING, "[FOW] CONFIGURE_FOW_FOR_MP_MAIN() called by script ", GET_THIS_SCRIPT_NAME())
ENABLE_MINIMAP_FOW_CUSTOM_WORLD_EXTENTS(TRUE)
SET_MINIMAP_FOW_CUSTOM_WORLD_POS_AND_SIZE(FOW_ISLAND_MAP_OFFSET_X, FOW_ISLAND_MAP_OFFSET_Y, FOW_MAP_WIDTH, FOW_MAP_HEIGHT)
SET_MINIMAP_ALLOW_FOW_IN_MP(FALSE)
SET_MINIMAP_FOW_DO_NOT_UPDATE(TRUE)
ENDPROC
PROC CONFIGURE_FOW_FOR_MP_ISLAND()
CPRINTLN(DEBUG_BUILDING, "[FOW] CONFIGURE_FOW_FOR_MP_ISLAND() called by script ", GET_THIS_SCRIPT_NAME())
SET_MINIMAP_ALLOW_FOW_IN_MP(TRUE)
SET_MINIMAP_FOW_DO_NOT_UPDATE(FALSE)
ENABLE_MINIMAP_FOW_CUSTOM_WORLD_EXTENTS(TRUE)
SET_MINIMAP_FOW_CUSTOM_WORLD_POS_AND_SIZE(FOW_ISLAND_MAP_OFFSET_X, FOW_ISLAND_MAP_OFFSET_Y, FOW_MAP_WIDTH, FOW_MAP_HEIGHT)
// Initialise the mp save data if we haven't done so already
INT minX, minY, maxX, maxY, fillValueForRestOfMap
IF NOT GET_MINIMAP_FOW_MP_SAVE_DETAILS(minX, minY, maxX, maxY, fillValueForRestOfMap)
// If we need to adjust save details in future we can compare our new data with the data returned from GET_MINIMAP_FOW_MP_SAVE_DETAILS.
// The grid points that were previously saved will remain intact if they are still within the bounds.
// Full map for now, we will reduce this to only occupy the Island Heist map.
SET_MINIMAP_FOW_MP_SAVE_DETAILS(TRUE, FOW_MP_SAVE_MIN_X, FOW_MP_SAVE_MIN_Y, FOW_MP_SAVE_MAX_X, FOW_MP_SAVE_MAX_Y, FOW_MP_SAVE_FILL)
SET_MINIMAP_REQUEST_CLEAR_FOW(TRUE)
CPRINTLN(DEBUG_BUILDING, "[FOW] CONFIGURE_FOW_FOR_MP_ISLAND() resetting for first time use")
ENDIF
ENDPROC
#ENDIF // FEATURE_FOW_EXPANSION