This commit is contained in:
Nordi98 2025-08-04 20:21:59 +02:00
parent baf4c9b0a2
commit 5a5b4b855d
24 changed files with 0 additions and 9668 deletions

View file

@ -1,433 +0,0 @@
local playerId = PlayerId()
local playerPed = PlayerPedId()
local playerCoords = GetEntityCoords(playerPed)
local inVehicle = IsPedInAnyVehicle(playerPed)

Citizen.CreateThread(function()
while true do
playerPed = PlayerPedId()
playerCoords = GetEntityCoords(playerPed)
inVehicle = IsPedInAnyVehicle(playerPed)

Citizen.Wait(100)
end
end)

local hudVisible = true
local QBCore = nil

exports('hudVisibility', function(toggle)
hudVisible = toggle
end)

--
-- HIDE HEALTH
--

Citizen.CreateThread(function()
local scaleform = RequestScaleformMovie('minimap')

SetRadarBigmapEnabled(true, false)

Citizen.Wait(0)

SetRadarBigmapEnabled(false, false)

while true do
BeginScaleformMovieMethod(scaleform, 'SETUP_HEALTH_ARMOUR')

if Config.vanilla then
ScaleformMovieMethodAddParamInt(1)
EndScaleformMovieMethod()
return
end

ScaleformMovieMethodAddParamInt(3)
EndScaleformMovieMethod()
SetRadarBigmapEnabled(false, false)

Citizen.Wait(0)
end
end)

--
-- HUD COMPONENTS
--

if Config.componentsDisabler then
Citizen.CreateThread(function()
while true do
HideHudComponentThisFrame(1)
HideHudComponentThisFrame(3)
HideHudComponentThisFrame(4)
HideHudComponentThisFrame(6)
HideHudComponentThisFrame(8)
HideHudComponentThisFrame(7)
HideHudComponentThisFrame(9)

Citizen.Wait(0)
end
end)
end

--
-- RADAR IN VEHICLE
--

local bypass = false

exports('bypassRadar', function(toggle)
bypass = toggle
end)

Citizen.CreateThread(function()
DisplayRadar(true)

if not Config.radarOnlyInCar then
return
end

while true do
if bypass then
DisplayRadar(true)
else
if not inVehicle then
DisplayRadar(false)
else
DisplayRadar(true)
end
end

Citizen.Wait(1000)
end
end)

--
-- HUD LOCATION
--

local activeCoords = vec2(0.0, 0.0)
local postalText = 'CP 0000'
local directionText = 'N'
local postals = {}
local zones = {}

Citizen.CreateThread(function()
local postalsJson = LoadResourceFile(GetCurrentResourceName(), 'zips.json')
postalsJson = json.decode(postalsJson)

for i, postal in ipairs(postalsJson) do
postals[i] = { vec2(postal.x, postal.y), code = postal.code }
end

local zonesJson = LoadResourceFile(GetCurrentResourceName(), 'zones.json')
zonesJson = json.decode(zonesJson)

for _, zone in pairs(zonesJson) do
zones[zone.zone] = zone.name
end
end)

Citizen.CreateThread(function()
while not postals do
Citizen.Wait(0)
end

while true do
local nearestIndex, nearestDist

for i = 1, #postals do
local dist = #(playerCoords.xy - postals[i][1])

if not nearestDist or dist < nearestDist then
nearestIndex = i
nearestDist = dist
activeCoords = postals[i][1]
end
end

local code = postals[nearestIndex].code

postalText = string.format('CP %s', code)

Citizen.Wait(1000)
end
end)

Citizen.CreateThread(function()
local directions = { [0] = 'N', [45] = 'NW', [90] = 'W', [135] = 'SW', [180] = 'S', [225] = 'SE', [270] = 'E', [315] = 'NE', [360] = 'N', }

while true do
for k, v in pairs(directions) do
direction = GetEntityHeading(playerPed)

if math.abs(direction - k) < 22.5 then
directionText = v
break
end
end

Citizen.Wait(500)
end
end)

Citizen.CreateThread(function()
while true do
if not IsRadarHidden() and Config.location.enabled and hudVisible then
local zone = GetNameOfZone(playerCoords.x, playerCoords.y, playerCoords.z)
local streetname, _ = GetStreetNameAtCoord(playerCoords.x, playerCoords.y, playerCoords.z)
local streetnameText = GetStreetNameFromHashKey(streetname)
local dist = #(playerCoords.xy - activeCoords)
local distanceText = string.format('%sm', math.floor(dist))
local zoneText = streetnameText

if zones[string.upper(zone)] then
zoneText = zones[string.upper(zone)]
end

SendNUIMessage({
component = 'position',
heading = GetEntityHeading(playerPed),
postal = postalText,
direction = directionText,
distance = distanceText,
street = streetnameText,
zone = zoneText
})
else
SendNUIMessage({
component = 'position',
visible = false
})
end

Citizen.Wait(Config.globalUpdateTime)
end
end)

--
-- HUD STATUS
--

local hunger = 100
local thirst = 100
local voice_type = 'mic_mute.png'
local voice_talking = false
local voice_radio = false

exports('setThirst', function(val)
thirst = val
end)

exports('setHunger', function(val)
hunger = val
end)

exports('setVoiceDistance', function(val)
if val == 0 then
voice_type = 'mic_mute.png'
elseif val == 1 then
voice_type = 'mic_one.png'
elseif val == 2 then
voice_type = 'mic_two.png'
elseif val == 3 then
voice_type = 'mic_three.png'
end
end)

exports('setVoiceRadio', function(toggle)
voice_radio = toggle
end)

exports('setVoiceTalking', function(toggle)
voice_talking = toggle
end)

Citizen.CreateThread(function()
if Config.framework == 'esx' then
AddEventHandler('esx_status:onTick', function(data)
for i = 1, #data do
if data[i].name == 'thirst' then
thirst = math.floor(data[i].percent)
end

if data[i].name == 'hunger' then
hunger = math.floor(data[i].percent)
end
end
end)
end

if Config.framework == 'qbcore' then
QBCore = exports['qb-core']:GetCoreObject()
end

while true do
::redo::

Citizen.Wait(Config.globalUpdateTime)

local voice = voice_type

if voice_radio then
voice = 'mic_radio.png'
end

if Config.status.enabled and hudVisible then
if Config.framework == 'qbcore' then
local PlayerData = QBCore.Functions.GetPlayerData()

if (PlayerData.metadata ~= nil) then
hunger = PlayerData.metadata['hunger']
thirst = PlayerData.metadata['thirst']
else
SendNUIMessage({
component = 'status',
visible = false
})

goto redo
end
end

if Config.pmaVoice then
exports['jordqn_hud']:setVoiceDistance(LocalPlayer.state.proximity.index)

if not MumbleIsPlayerTalking(playerId) then
voice_talking = false
else
voice_talking = true
end
end

SendNUIMessage({
component = 'status',
framework = Config.framework,
hungerVisible = Config.enableHunger,
thirstVisible = Config.enableThirst,
voiceVisible = Config.enableVoice,
voiceType = voice,
voiceTalking = voice_talking,
health = GetEntityHealth(playerPed),
maxhealth = GetEntityMaxHealth(playerPed),
armor = GetPedArmour(playerPed),
hunger = hunger,
thirst = thirst,
oxygen = GetPlayerUnderwaterTimeRemaining(playerId)
})
else
SendNUIMessage({
component = 'status',
visible = false
})
end
end
end)

--
-- PMA VOICE
--

if Config.pmaVoice then
AddEventHandler('pma-voice:radioActive', function(toggle)
voice_radio = toggle
end)
end

--
-- HUD SPEEDOMETER
--

local seatbelt = false

exports('setSeatBelt', function(toggle)
seatbelt = toggle
end)

Citizen.CreateThread(function()
while true do
if Config.speedometer.enabled and hudVisible then
if inVehicle then
local vehicle = GetVehiclePedIsIn(playerPed, false)

if DoesEntityExist(vehicle) then
local multipler = Config.useMiles and 2.236936 or 3.6
local maxSpeed = GetVehicleEstimatedMaxSpeed(vehicle) * multipler
local speed = GetEntitySpeed(vehicle) * multipler
local maxFuel = GetVehicleHandlingFloat(vehicle, 'CHandlingData', 'fPetrolTankVolume')
local fuel = GetVehicleFuelLevel(vehicle)
local hasMotor = true
local isElectric = false

if maxFuel < 5.0 then
hasMotor = false
end

if Config.LegacyFuel then
fuel = math.floor(exports['LegacyFuel']:GetFuel(vehicle))
end

local model = GetEntityModel(vehicle)

for _, v in pairs(Config.electricVehicles) do
if v == model then
isElectric = true
break
end
end

local _, _, highbeams = GetVehicleLightsState(vehicle)

SendNUIMessage({
component = 'speedometer',
framework = Config.framework,
seatbeltVisible = Config.enableSeatBelt,
fuelVisible = Config.enableFuel,
useMiles = Config.useMiles,
speed = speed,
maxspeed = maxSpeed,
fuel = fuel,
hasmotor = hasMotor,
iselectric = isElectric,
maxfuel = maxFuel,
highbeams = highbeams,
engine = GetIsVehicleEngineRunning(vehicle),
seatbelt = seatbelt
})
else
SendNUIMessage({
component = 'speedometer',
visible = false
})
end
else
SendNUIMessage({
component = 'speedometer',
visible = false
})
end
else
SendNUIMessage({
component = 'speedometer',
visible = false
})
end

Citizen.Wait(Config.globalUpdateTime)
end
end)

--
-- CONFIGURATION
--

Citizen.CreateThread(function()
SendNUIMessage({
component = 'configuration',
locationleft = Config.location.left,
locationbottom = Config.location.bottom,
statusright = Config.status.right,
statusbottom = Config.status.bottom,
speedometerbottom = Config.speedometer.bottom
})
end)

View file

@ -1,86 +0,0 @@
Config = {}

-- Can be 'qbcore', 'esx' or 'standalone'.
Config.framework = 'qbcore' -- Default = 'standalone'

-- Toggle LegacyFuel hook.
Config.LegacyFuel = false -- Default = false

-- Toggle pmaVoice hook.
Config.pmaVoice = false -- Default = false

-- Configure the location component.
Config.location = {
enabled = true, -- Default = true
left = 310, -- Default = 310
bottom = 30 -- Default = 30
}

-- Defines the hud update time, a higher value may reduce script consumption.
Config.globalUpdateTime = 1 -- Default = 1

-- Configure the speedometer component.
Config.speedometer = {
enabled = true, -- Default = true
bottom = -50 -- Default = -50
}

-- Configure the status component.
Config.status = {
enabled = true, -- Default = true
right = 20, -- Default = 20
bottom = 30 -- Default = 30
}

-- Activates/deactivates GTA's vanilla hud for life and armor. [default = false]
Config.vanilla = false

-- Enables/disables components that may interfere with the use of this HUD. [default = true]
Config.componentsDisabler = true

-- Enables/disables radar display only in vehicle (also affects position hud). [default = true]
Config.radarOnlyInCar = true

-- Activates/deactivates the hunger bar display. [default = true]
Config.enableHunger = true

-- Activates/deactivates the thirst bar display. [default = true]
Config.enableThirst = true

-- Activates/deactivates the seat belt display. [default = true]
Config.enableSeatBelt = true

-- Activates/deactivates the fuel level display. [default = true]
Config.enableFuel = true

-- Activates/deactivates the voice display. [default = true]
Config.enableVoice = true

-- Determines whether you want to use miles or kilometers. [default = true]
Config.useMiles = true

-- List of electric vehicles.
Config.electricVehicles = {
`buffalo5`,
`cyclone`,
`cyclone2`,
`dilettante`,
`dilettante2`,
`iwagen`,
`imorgon`,
`khamelion`,
`coureur`,
`neon`,
`omnisegt`,
`powersurge`,
`raiden`,
`voltic2`,
`surge`,
`tezeract`,
`virtue`,
`voltic`,
`caddy`,
`caddy2`,
`caddy3`,
`airtug`
}

View file

@ -1,20 +0,0 @@
fx_version 'cerulean'
game 'gta5'

ui_page 'web/index.html'

files {
'zips.json',
'zones.json',
'web/*.html',
'web/*.js',
'web/*.css',
'web/*.png'
}

client_script {
'config.lua',
'cl_*.lua'
}

lua54 'yes'

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

View file

@ -1,71 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Hanken+Grotesk:ital,wght@0,100..900;1,100..900&display=swap" rel="stylesheet">
<link href="./style.css" rel="stylesheet">
<script defer src="script.js"></script>
</head>
<body>
<section id="speedometer">
<span id="speedtextkm">0</span>
<span id="speedtextmiles">0</span>
<img id="fuel-icon" class="fuel" src="gas.png">
<img id="beam" class="beam" src="beam.png">
<img id="engine" class="engine" src="engine.png">
<img id="seatbelt" class="seatbelt" src="seatbelt.png">
<svg id="speed" viewbox="0 0 200 120">
<path class="speedpath" d="M 20 90 A 50 50 0 1 1 100 90" fill='none' />
<path id="speed-svg" fill='none' class="speedvalue" d="M 20 90 A 50 50 0 1 1 100 90" />
<path id="fuel-path" class="fuelpath" d="M 109 90 A 20 20 0 1 0 118 58" fill='none' />
<path id="fuel-svg" fill='none' class="fuelvalue" d="M 109 90 A 20 20 0 1 0 118 58" />
</svg>
</section>
<section id="location">
<img id="arrow" src="arrow.png">
<span id="zone">Terminal</span>
<span id="streetname">Buccaneer Way</span>
<div class="bottom">
<span id="direction">NW</span>
<span id="zipcode">CP 8090</span>
<span id="distance">20m</span>
</div>
</section>
<section id="status">
<img id="voice" class="voice" src="mic_mute.png">
<div id="oxygencontainer" class="oxygen">
<span class="title">Oxygen</span>
<img src="oxygen.png">
<hr id="oxygen">
<span id="oxygentext">100%</span>
</div>
<div id="armorcontainer" class="armor">
<span class="title">Armor</span>
<img src="armor.png">
<hr id="armor">
<span id="armortext">100%</span>
</div>
<div id="thirstcontainer" class="thirst">
<span class="title">Thirst</span>
<img src="thirst.png">
<hr id="thirst">
<span id="thirsttext">100%</span>
</div>
<div id="foodcontainer" class="food">
<span class="title">Hunger</span>
<img src="food.png">
<hr id="food">
<span id="foodtext">100%</span>
</div>
<div id="healthcontainer" class="health">
<span class="title">Health</span>
<img src="health.png">
<hr id="health">
<span id="healthtext">100%</span>
</div>
</section>
</body>
</html>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

View file

@ -1,227 +0,0 @@
const locationWindow = document.getElementById("location");
const statusWindow = document.getElementById("status");
const speedometerWindow = document.getElementById("speedometer");

const arrow = document.getElementById("arrow");
const direction = document.getElementById("direction");
const zipcode = document.getElementById("zipcode");
const distance = document.getElementById("distance");
const streetname = document.getElementById("streetname");
const zone = document.getElementById("zone");

const thirstcontainer = document.getElementById("thirstcontainer");
const foodcontainer = document.getElementById("foodcontainer");
const armorcontainer = document.getElementById("armorcontainer");
const oxygencontainer = document.getElementById("oxygencontainer");

const healthtext = document.getElementById("healthtext")
const armortext = document.getElementById("armortext")
const thirsttext = document.getElementById("thirsttext")
const foodtext = document.getElementById("foodtext")
const oxygentext = document.getElementById("oxygentext")
const healthbar = document.getElementById("health")
const armorbar = document.getElementById("armor")
const thirstbar = document.getElementById("thirst")
const foodbar = document.getElementById("food")
const oxygenbar = document.getElementById("oxygen")
const voice = document.getElementById("voice")

const speed = document.getElementById("speed-svg");
const speedtextkm = document.getElementById("speedtextkm")
const speedtextmiles = document.getElementById("speedtextmiles")
const fuel = document.getElementById("fuel-svg");
const fuel_path = document.getElementById("fuel-path");
const fuel_icon = document.getElementById("fuel-icon");

const seatbelt = document.getElementById("seatbelt");
const engine = document.getElementById("engine");
const highbeams = document.getElementById("beam");

let left = 0

window.addEventListener('message', (event) => {
if (event.data.component == "position") {
if (event.data.visible == null) {
left = 1
locationWindow.style.opacity = 1
arrow.style.rotate = -event.data.heading + "deg"

direction.innerText = event.data.direction
zipcode.innerText = event.data.postal
distance.innerText = event.data.distance
streetname.innerText = event.data.street
zone.innerText = event.data.zone
} else {
left = 0
locationWindow.style.opacity = 0
}
}

if (event.data.component == "status") {
if (event.data.visible == null) {
statusWindow.style.opacity = 1
if (event.data.hungerVisible) { foodcontainer.style.display = "block" } else { foodcontainer.style.display = "none" }
if (event.data.thirstVisible) { thirstcontainer.style.display = "block" } else { thirstcontainer.style.display = "none" }
if (event.data.voiceVisible) { voice.style.display = "block" } else { voice.style.display = "none" }

if (event.data.voiceTalking == true) {
if (voice.classList.contains("disabled")) {
voice.classList.remove("disabled")
}
} else {
if (!voice.classList.contains("disabled")) {
voice.classList.add("disabled")
}
}

voice.src = event.data.voiceType

let health = Math.round((event.data.health * 100) / event.data.maxhealth)
if (health > 100) { health = 100 }
let armor = Math.round((event.data.armor * 100) / 100)
if (armor > 0) {
armorcontainer.style.display = "block"
} else {
armorcontainer.style.display = "none"
}
let thirst = Math.round((event.data.thirst * 100) / 100)
let food = Math.round((event.data.hunger * 100) / 100)

let oxygen = Math.round((event.data.oxygen * 100) / 40)

if (event.data.framework == "qbcore" || event.data.framework == "esx") {
oxygen = Math.round((event.data.oxygen * 100) / 10)
}

if (oxygen < 0) { oxygen = 0 }

if (oxygen != 100) {
oxygencontainer.style.display = "block"
} else {
oxygencontainer.style.display = "none"
}

healthtext.innerText = health + "%"
healthbar.style.width = (health * 150) / 100 + "px"
healthbar.style.setProperty('--size', 150 - ((health * 150) / 100) + "px");
armortext.innerText = armor + "%"
armorbar.style.width = (armor * 150) / 100 + "px"
armorbar.style.setProperty('--size', 150 - ((armor * 150) / 100) + "px");

thirsttext.innerText = thirst + "%"
thirstbar.style.width = (thirst * 150) / 100 + "px"
thirstbar.style.setProperty('--size', 150 - ((thirst * 150) / 100) + "px");

foodtext.innerText = food + "%"
foodbar.style.width = (food * 150) / 100 + "px"
foodbar.style.setProperty('--size', 150 - ((food * 150) / 100) + "px");

oxygentext.innerText = oxygen + "%"
oxygenbar.style.width = (oxygen * 150) / 100 + "px"
oxygenbar.style.setProperty('--size', 150 - ((oxygen * 150) / 100) + "px");
} else {
if (event.data.visible == true) {
statusWindow.style.opacity = 1
} else {
statusWindow.style.opacity = 0
}
}
}

if (event.data.component == "speedometer") {
if (event.data.visible == null) {
if (event.data.seatbeltVisible) { seatbelt.style.display = "block" } else { seatbelt.style.display = "none" }
if (event.data.fuelVisible) { speedometerWindow.style.marginLeft = '0px'; fuel.style.display = "block"; fuel_path.style.display = "block"; fuel_icon.style.display = "block"; } else { speedometerWindow.style.marginLeft = '10px'; fuel.style.display = "none"; fuel_path.style.display = "none"; fuel_icon.style.display = "none"; }
speedometerWindow.style.opacity = 1
let percent_speed = (event.data.speed * 100) / (event.data.maxspeed + 50)
let percent_fuel = (event.data.fuel * 100) / (event.data.maxfuel)
if (event.data.framework == "qbcore") {
percent_fuel = event.data.fuel
}
setDashedGaugeValue(speed, percent_speed, 219.911485751);
setDashedGaugeValue(fuel, percent_fuel, 87.9645943005);
speedtextkm.innerText = Math.round(event.data.speed)
speedtextmiles.innerText = Math.round(event.data.speed)

if (event.data.iselectric == true) {
fuel_icon.src = "battery.png"
} else {
fuel_icon.src = "gas.png"
}

if (event.data.useMiles == true) {
speedtextkm.style.display = "none"
speedtextmiles.style.display = "block"
} else {
speedtextkm.style.display = "block"
speedtextmiles.style.display = "none"
}

if (event.data.hasmotor == true) {
highbeams.style.display = "block"
engine.style.display = "block"
speedometerWindow.style.marginLeft = '0px'
speedometerWindow.style.marginBottom = '0px'
} else {
highbeams.style.display = "none"
engine.style.display = "none"
seatbelt.style.display = "none"
fuel.style.display = "none"
fuel_path.style.display = "none"
fuel_icon.style.display = "none"
speedometerWindow.style.marginLeft = '10px'
speedometerWindow.style.marginBottom = '-10px'
}

if (event.data.highbeams == 1) {
if (highbeams.classList.contains("disabled")) {
highbeams.classList.remove("disabled")
}
} else {
if (!highbeams.classList.contains("disabled")) {
highbeams.classList.add("disabled")
}
}

if (event.data.engine == 1) {
if (engine.classList.contains("disabled")) {
engine.classList.remove("disabled")
}
} else {
if (!engine.classList.contains("disabled")) {
engine.classList.add("disabled")
}
}

if (event.data.seatbelt == true) {
if (seatbelt.classList.contains("disabled")) {
seatbelt.classList.remove("disabled")
}
} else {
if (!seatbelt.classList.contains("disabled")) {
seatbelt.classList.add("disabled")
}
}
} else {
speedometerWindow.style.opacity = 0
}
}

if (event.data.component == "configuration") {
locationWindow.style.left = event.data.locationleft + "px"
locationWindow.style.bottom = event.data.locationbottom + "px"
statusWindow.style.right = event.data.statusright + "px"
statusWindow.style.bottom = event.data.statusbottom + "px"
speedometerWindow.style.bottom = event.data.speedometerbottom + "px"
}
})

function setDashedGaugeValue(gaugeDOMElement, percentage, arcLength) {
const emptyDashLength = 500;
const filledArcLength = arcLength * (percentage / 100);
gaugeDOMElement.style.strokeDasharray = `${filledArcLength} ${emptyDashLength}`;
gaugeDOMElement.style.strokeDashoffset = filledArcLength;
}

setDashedGaugeValue(speed, 0, 219.911485751);
setDashedGaugeValue(fuel, 0, 87.9645943005);

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

File diff suppressed because one or more lines are too long

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

File diff suppressed because it is too large Load diff

View file

@ -1,370 +0,0 @@
[
{
"zone": "AIRP",
"name": "Los Santos International Airport"
},
{
"zone": "ALAMO",
"name": "Alamo Sea"
},
{
"zone": "ALTA",
"name": "Alta"
},
{
"zone": "ARMYB",
"name": "Fort Zancudo"
},
{
"zone": "BANHAMC",
"name": "Banham Canyon Dr"
},
{
"zone": "BANNING",
"name": "Banning"
},
{
"zone": "BEACH",
"name": "Vespucci Beach"
},
{
"zone": "BHAMCA",
"name": "Banham Canyon"
},
{
"zone": "BRADP",
"name": "Braddock Pass"
},
{
"zone": "BRADT",
"name": "Braddock Tunnel"
},
{
"zone": "BURTON",
"name": "Burton"
},
{
"zone": "CALAFB",
"name": "Calafia Bridge"
},
{
"zone": "CANNY",
"name": "Raton Canyon"
},
{
"zone": "CCREAK",
"name": "Cassidy Creek"
},
{
"zone": "CHAMH",
"name": "Chamberlain Hills"
},
{
"zone": "CHIL",
"name": "Vinewood Hills"
},
{
"zone": "CHU",
"name": "Chumash"
},
{
"zone": "CMSW",
"name": "Chiliad Mountain State Wilderness"
},
{
"zone": "CYPRE",
"name": "Cypress Flats"
},
{
"zone": "DAVIS",
"name": "Davis"
},
{
"zone": "DELBE",
"name": "Del Perro Beach"
},
{
"zone": "DELPE",
"name": "Del Perro"
},
{
"zone": "DELSOL",
"name": "La Puerta"
},
{
"zone": "DESRT",
"name": "Grand Senora Desert"
},
{
"zone": "DOWNT",
"name": "Downtown"
},
{
"zone": "DTVINE",
"name": "Downtown Vinewood"
},
{
"zone": "EAST_V",
"name": "East Vinewood"
},
{
"zone": "EBURO",
"name": "El Burro Heights"
},
{
"zone": "ELGORL",
"name": "El Gordo Lighthouse"
},
{
"zone": "ELYSIAN",
"name": "Elysian Island"
},
{
"zone": "GALFISH",
"name": "Galilee"
},
{
"zone": "GOLF",
"name": "GWC and Golfing Society"
},
{
"zone": "GRAPES",
"name": "Grapeseed"
},
{
"zone": "GREATC",
"name": "Great Chaparral"
},
{
"zone": "HARMO",
"name": "Harmony"
},
{
"zone": "HAWICK",
"name": "Hawick"
},
{
"zone": "HORS",
"name": "Vinewood Racetrack"
},
{
"zone": "HUMLAB",
"name": "Humane Labs and Research"
},
{
"zone": "JAIL",
"name": "Bolingbroke Penitentiary"
},
{
"zone": "KOREAT",
"name": "Little Seoul"
},
{
"zone": "LACT",
"name": "Land Act Reservoir"
},
{
"zone": "LAGO",
"name": "Lago Zancudo"
},
{
"zone": "LDAM",
"name": "Land Act Dam"
},
{
"zone": "LEGSQU",
"name": "Legion Square"
},
{
"zone": "LMESA",
"name": "La Mesa"
},
{
"zone": "LOSPUER",
"name": "La Puerta"
},
{
"zone": "MIRR",
"name": "Mirror Park"
},
{
"zone": "MORN",
"name": "Morningwood"
},
{
"zone": "MOVIE",
"name": "Richards Majestic"
},
{
"zone": "MTCHIL",
"name": "Mount Chiliad"
},
{
"zone": "MTGORDO",
"name": "Mount Gordo"
},
{
"zone": "MTJOSE",
"name": "Mount Josiah"
},
{
"zone": "MURRI",
"name": "Murrieta Heights"
},
{
"zone": "NCHU",
"name": "North Chumash"
},
{
"zone": "NOOSE",
"name": "N.O.O.S.E"
},
{
"zone": "OCEANA",
"name": "Pacific Ocean"
},
{
"zone": "PALCOV",
"name": "Paleto Cove"
},
{
"zone": "PALETO",
"name": "Paleto Bay"
},
{
"zone": "PALFOR",
"name": "Paleto Forest"
},
{
"zone": "PALHIGH",
"name": "Palomino Highlands"
},
{
"zone": "PALMPOW",
"name": "Palmer-Taylor Power Station"
},
{
"zone": "PBLUFF",
"name": "Pacific Bluffs"
},
{
"zone": "PBOX",
"name": "Pillbox Hill"
},
{
"zone": "PROCOB",
"name": "Procopio Beach"
},
{
"zone": "RANCHO",
"name": "Rancho"
},
{
"zone": "RGLEN",
"name": "Richman Glen"
},
{
"zone": "RICHM",
"name": "Richman"
},
{
"zone": "ROCKF",
"name": "Rockford Hills"
},
{
"zone": "RTRAK",
"name": "Redwood Lights Track"
},
{
"zone": "SANAND",
"name": "San Andreas"
},
{
"zone": "SANCHIA",
"name": "San Chianski Mountain Range"
},
{
"zone": "SANDY",
"name": "Sandy Shores"
},
{
"zone": "SKID",
"name": "Mission Row"
},
{
"zone": "SLAB",
"name": "Stab City"
},
{
"zone": "STAD",
"name": "Maze Bank Arena"
},
{
"zone": "STRAW",
"name": "Strawberry"
},
{
"zone": "TATAMO",
"name": "Terminal"
},
{
"zone": "TEXTI",
"name": "Textile City"
},
{
"zone": "TONGVAH",
"name": "Tongva Hills"
},
{
"zone": "TONGVAV",
"name": "Tongva Valley"
},
{
"zone": "VCANA",
"name": "Vespucci Canals"
},
{
"zone": "VESP",
"name": "Vespucci"
},
{
"zone": "VINE",
"name": "Vinewood"
},
{
"zone": "WINDF",
"name": "Ron Alternates Wind Farm"
},
{
"zone": "WVINE",
"name": "West Vinewood"
},
{
"zone": "ZANCUDO",
"name": "Zancudo River"
},
{
"zone": "ZP_ORT",
"name": "Port of South Los Santos"
},
{
"zone": "ZQ_UAR",
"name": "Davis Quartz"
},
{
"zone": "PROL",
"name": "North Yankton"
},
{
"zone": "ISHEIST",
"name": "Cayo Perico Island"
},
{
"zone": "GALLI",
"name": "Galileo"
},
{
"zone": "OBSERV",
"name": "Galileo"
}
]