Skip to content

Commit

Permalink
1.5.0 - Updated readme, separated code into files, Lua 5.4, and more …
Browse files Browse the repository at this point in the history
…documentation for the config
  • Loading branch information
GoatG33k committed Apr 18, 2021
1 parent b471c29 commit d31d5d3
Show file tree
Hide file tree
Showing 9 changed files with 312 additions and 255 deletions.
15 changes: 12 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Nearest Postals

This script displays a nearest postal next to where PLD would go and also has a command to draw a route to a specific postal
This script displays the nearest postal next to map, and allows you to navigate to specific postal codes with `/postal`

## Installation

Expand All @@ -23,6 +23,15 @@ It will automatically remove the route when within 100m of the destination

## Updates

### 1.5

- Major performance improvements
- Added the `refreshRate` configuration option
- Simplified distance calculation logic
- Separated code into separate files
- Prebuild the postal list with vectors at startup
- Use FiveM Lua 5.4

### 1.4

- Performance Improvements
Expand Down Expand Up @@ -58,8 +67,8 @@ It will automatically remove the route when within 100m of the destination

This script provides a simple way of working on a new postal map

1. In the script, enabled the local variable `dev` near the bottom
2. Restart the script into game
1. In the resource `fxmanifest.lua` file, uncomment the `cl_dev.lua` requirement line
2. Do `refresh` and `restart nearest-postal` in-game
3. Teleport to the first postal code in numerical order
4. Type `/setnext [postalCode]` where postalCode is the postal that you are at
5. Type `/next` to insert it
Expand Down
210 changes: 14 additions & 196 deletions cl.lua
Original file line number Diff line number Diff line change
@@ -1,204 +1,22 @@
-- optimizations
local Wait = Wait
local format = string.format
local ipairs = ipairs
local RemoveBlip = RemoveBlip
local PlayerPedId = PlayerPedId
local IsHudHidden = IsHudHidden
local SetTextFont = SetTextFont
local SetTextScale = SetTextScale
local SetTextOutline = SetTextOutline
local GetEntityCoords = GetEntityCoords
local EndTextCommandDisplayText = EndTextCommandDisplayText
local BeginTextCommandDisplayText = BeginTextCommandDisplayText
local AddTextComponentSubstringPlayerName = AddTextComponentSubstringPlayerName
local vec = vec
-- end optimizations

local raw = LoadResourceFile(GetCurrentResourceName(), GetResourceMetadata(GetCurrentResourceName(), 'postal_file'))

---@class PostalData : table<number, vec>
---@field code string
---@type table<number, PostalData>
local postals = json.decode(raw)
for i, postal in ipairs(postals) do postals[i] = { vec(postal.x, postal.y), code = postal.code } end

local nearest = nil
local pBlip = nil
local nearestPostalText = ""

-- thread for nearest and blip
postals = nil
CreateThread(function()
local config = config
local deleteDist = config.blip.distToDelete
local _total = #postals

while true do
local coords = GetEntityCoords(PlayerPedId())
local _nearestIndex, _nearestD
coords = vec(coords[1], coords[2])

for i = 1, _total do
local D = #(coords - postals[i][1])
if not _nearestD or D < _nearestD then
_nearestIndex = i
_nearestD = D
end
end

if pBlip and _nearestD < deleteDist then
-- delete blip if close
RemoveBlip(pBlip.hndl)
pBlip = nil
end

nearest = { code = postals[_nearestIndex].code, dist = _nearestD }
Wait(250)
end
end)

CreateThread(function()
local formatTemplate = config.text.format
while true do
if nearest then nearestPostalText = format(formatTemplate, nearest.code, nearest.dist) end
Wait(250)
end
postals = LoadResourceFile(GetCurrentResourceName(), GetResourceMetadata(GetCurrentResourceName(), 'postal_file'))
postals = json.decode(postals)
for i, postal in ipairs(postals) do postals[i] = { vec(postal.x, postal.y), code = postal.code } end
end)

-- text display thread
CreateThread(function()
local posX = config.text.posX
local posY = config.text.posY
local _string = "STRING"
local _scale = 0.42
local _font = 4
while true do
if nearest and not IsHudHidden() then
SetTextScale(_scale, _scale)
SetTextFont(_font)
SetTextOutline()
BeginTextCommandDisplayText(_string)
AddTextComponentSubstringPlayerName(nearestPostalText)
EndTextCommandDisplayText(posX, posY)
end
Wait(0)
end
end)

RegisterCommand('postal', function(source, args, raw)
if #args < 1 then
if pBlip then
RemoveBlip(pBlip.hndl)
pBlip = nil
TriggerEvent('chat:addMessage', {
color = { 255, 0, 0 },
args = {
'Postals',
config.blip.deleteText
}
})
end
return
end
local n = string.upper(args[1])

local fp = nil
for _, p in ipairs(postals) do
if string.upper(p.code) == n then
fp = p
break
end
end

if fp then
if pBlip then
RemoveBlip(pBlip.hndl)
end
pBlip = { hndl = AddBlipForCoord(fp.x, fp.y, 0.0), p = fp }
SetBlipRoute(pBlip.hndl, true)
SetBlipSprite(pBlip.hndl, config.blip.sprite)
SetBlipColour(pBlip.hndl, config.blip.color)
SetBlipRouteColour(pBlip.hndl, config.blip.color)
BeginTextCommandSetBlipName('STRING')
AddTextComponentSubstringPlayerName(config.blip.blipText:format(pBlip.p.code))
EndTextCommandSetBlipName(pBlip.hndl)

TriggerEvent('chat:addMessage', {
color = { 255, 0, 0 },
args = {
'Postals',
config.blip.drawRouteText:format(fp.code)
}
})
else
TriggerEvent('chat:addMessage', {
color = { 255, 0, 0 },
args = {
'Postals',
config.blip.notExistText
}
})
end
end)

--[[Development shit]]
local dev = false
if dev then
local devLocal = json.decode(raw)
local next = 0

RegisterCommand('setnext', function(src, args, raw)
local n = tonumber(args[1])
if n ~= nil then
next = n
print('next ' .. next)
return
end
print('invalid ' .. n)
end)

RegisterCommand('next', function(src, args, raw)
for i, d in ipairs(devLocal) do
if d.code == tostring(next) then
print('duplicate ' .. next)
return
end
end
local coords = GetEntityCoords(GetPlayerPed(-1))
table.insert(devLocal, { code = tostring(next), x = coords.x, y = coords.y })
print('insert ' .. next)
next = next + 1
end)

RegisterCommand('rl', function(src, args, raw)
if #devLocal > 0 then
local data = table.remove(devLocal, #devLocal)
print('remove ' .. data.code)
print('next ' .. next)
next = next - 1
else
print('invalid')
end
end)

RegisterCommand('remove', function(src, args, raw)
if #args < 1 then
print('invalid')
else
for i, d in ipairs(devLocal) do
if d.code == args[1] then
table.remove(devLocal, i)
print('remove ' .. d.code)
return
end
end
print('invalid')
end
end)

RegisterCommand('json', function(src, args, raw)
print(json.encode(devLocal))
end)
end
---@class NearestResult
---@field code string
---@field dist number
nearest = nil

---@class PostalBlip
---@field 1 vec
---@field p PostalData
---@field hndl number
pBlip = nil

exports('getPostal', function() return nearest and nearest.code or nil end)
69 changes: 69 additions & 0 deletions cl_commands.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
-- optimizations
local ipairs = ipairs
local upper = string.upper
local format = string.format
-- end optimizations

---
--- [[ Nearest Postal Commands ]] ---
---

TriggerEvent('chat:addSuggestion', '/postal', 'Set the GPS to a specific postal',
{ { name = 'Postal Code', help = 'The postal code you would like to go to' } })

RegisterCommand('postal', function(_, args)
if #args < 1 then
if pBlip then
RemoveBlip(pBlip.hndl)
pBlip = nil
TriggerEvent('chat:addMessage', {
color = { 255, 0, 0 },
args = {
'Postals',
config.blip.deleteText
}
})
end
return
end

local userPostal = upper(args[1])
local foundPostal

for _, p in ipairs(postals) do
if upper(p.code) == userPostal then
foundPostal = p
break
end
end

if foundPostal then
if pBlip then RemoveBlip(pBlip.hndl) end
local blip = AddBlipForCoord(foundPostal[1][1], foundPostal[1][2], 0.0)
pBlip = { hndl = blip, p = foundPostal }
SetBlipRoute(blip, true)
SetBlipSprite(blip, config.blip.sprite)
SetBlipColour(blip, config.blip.color)
SetBlipRouteColour(blip, config.blip.color)
BeginTextCommandSetBlipName('STRING')
AddTextComponentSubstringPlayerName(format(config.blip.blipText, pBlip.p.code))
EndTextCommandSetBlipName(blip)

TriggerEvent('chat:addMessage', {
color = { 255, 0, 0 },
args = {
'Postals',
format(config.blip.drawRouteText, foundPostal.code)
}
})
else
TriggerEvent('chat:addMessage', {
color = { 255, 0, 0 },
args = {
'Postals',
config.blip.notExistText
}
})
end
end)

57 changes: 57 additions & 0 deletions cl_dev.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
--- [[ Development shit ]]

local devLocal = json.decode(raw)
local next = 0

RegisterCommand('setnext', function(_, args)
local n = tonumber(args[1])
if n ~= nil then
next = n
print('next ' .. next)
return
end
print('invalid ' .. n)
end)

RegisterCommand('next', function()
for _, d in ipairs(devLocal) do
if d.code == tostring(next) then
print('duplicate ' .. next)
return
end
end
local coords = GetEntityCoords(PlayerPedId())
insert(devLocal, { code = tostring(next), x = coords.x, y = coords.y })
print('insert ' .. next)
next = next + 1
end)

RegisterCommand('rl', function()
if #devLocal > 0 then
local data = remove(devLocal, #devLocal)
print('remove ' .. data.code)
print('next ' .. next)
next = next - 1
else
print('invalid')
end
end)

RegisterCommand('remove', function(_, args)
if #args < 1 then
print('invalid')
else
for i, d in ipairs(devLocal) do
if d.code == args[1] then
table.remove(devLocal, i)
print('remove ' .. d.code)
return
end
end
print('invalid')
end
end)

RegisterCommand('json', function()
print(json.encode(devLocal))
end)
Loading

0 comments on commit d31d5d3

Please sign in to comment.