Skip to content

Commit e4eb6ea

Browse files
committed
feat: add odometer functionality to vehicle HUD
- Introduced odometer configuration in shared/config.lua, allowing for automatic or manual mileage tracking. - Updated ClassicGauge component to display odometer values using a new OdometerReel component. - Enhanced VehicleHud to integrate odometer display within the classic gauge framework. - Created OdometerReel and OdometerDisplay components for rendering odometer values in a visually appealing manner.
1 parent 062737e commit e4eb6ea

7 files changed

Lines changed: 365 additions & 160 deletions

File tree

MANUAL.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,20 @@ Os **defaults** ficam em `shared/config.lua`. Quando `Config.AdminOnly = true`,
101101

102102
As três opções `ClassicSpeedo*` também podem ser trocadas in-game pelo admin (menu **Aparência**, com o tema `classic` selecionado).
103103

104+
#### Odômetro (milhagem)
105+
106+
O velocímetro exibe um odômetro (aparece na cápsula abaixo da velocidade no tema `sport`; ocultado quando o valor é 0). O HUD **só exibe** — a quilometragem vem de um provedor externo. Há suporte automático embutido:
107+
108+
| Campo | Valores | Padrão |
109+
|---|---|---|
110+
| `Config.Odometer.enabled` | boolean | `true` |
111+
| `Config.Odometer.provider` | `'auto'` \| `'mri_mechanic'` \| `'jg-vehiclemileage'` \| `'none'` | `'auto'` |
112+
| `Config.Odometer.interval` | ms entre leituras | `2000` |
113+
114+
- `'auto'` detecta o provedor rodando (prioriza `mri_mechanic`, depois `jg-vehiclemileage`) e funciona mesmo se o provedor iniciar depois do HUD.
115+
- Os provedores retornam **km**; o HUD converte para **milhas** quando `Config.UseMPH = true`.
116+
- `'none'` desliga a leitura automática — nesse caso qualquer script pode alimentar o odômetro manualmente pelo evento `mri_Qhud:client:setOdometer` (client) ou `TriggerClientEvent('mri_Qhud:client:setOdometer', src, distance)` (server).
117+
104118
### 3.4 Skin de player (sobrenatural)
105119

106120
| Campo | Valores | Padrão |

client/main.lua

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1041,6 +1041,65 @@ RegisterNetEvent("mri_Qhud:client:setOdometer", function(distance)
10411041
})
10421042
end)
10431043

1044+
-- ─────────────────────────────────────────────────────────────────
1045+
-- Suporte automatico a provedores de milhagem (mri_mechanic / jg-vehiclemileage).
1046+
-- O HUD so exibe; a milhagem (km) vem do export do provedor ativo. Detecta em
1047+
-- runtime (aguenta o provedor iniciar depois do HUD), le a milhagem do veiculo
1048+
-- atual e alimenta o mesmo caminho do odometro. Ver Config.Odometer.
1049+
-- ─────────────────────────────────────────────────────────────────
1050+
local function resolveMileageProvider()
1051+
local p = (Config.Odometer and Config.Odometer.provider) or 'none'
1052+
if p == 'none' then return nil end
1053+
if p == 'auto' then
1054+
if GetResourceState('mri_mechanic') == 'started' then return 'mri_mechanic' end
1055+
if GetResourceState('jg-vehiclemileage') == 'started' then return 'jg-vehiclemileage' end
1056+
return nil
1057+
end
1058+
if GetResourceState(p) == 'started' then return p end
1059+
return nil
1060+
end
1061+
1062+
-- Le a milhagem (km) do veiculo pelo export do provedor. pcall porque o export
1063+
-- pode nao existir se o provedor for parado em runtime.
1064+
local function getVehicleMileageKm(provider, veh)
1065+
local ok, km
1066+
if provider == 'mri_mechanic' then
1067+
ok, km = pcall(function() return exports['mri_mechanic']:GetMileage(veh) end)
1068+
elseif provider == 'jg-vehiclemileage' then
1069+
ok, km = pcall(function() return exports['jg-vehiclemileage']:getMileageByEntity(veh) end)
1070+
end
1071+
return (ok and tonumber(km)) or 0
1072+
end
1073+
1074+
CreateThread(function()
1075+
if not (Config.Odometer and Config.Odometer.enabled) then return end
1076+
if Config.Odometer.provider == 'none' then return end
1077+
local provider = nil
1078+
local lastSent = -1
1079+
local interval = (Config.Odometer.interval and math.max(500, Config.Odometer.interval)) or 2000
1080+
while true do
1081+
if provider == nil then provider = resolveMileageProvider() end
1082+
local wait = provider and interval or 5000 -- sem provedor: checa devagar
1083+
if provider and LocalPlayer.state.isLoggedIn then
1084+
local ped = PlayerPedId()
1085+
local veh = GetVehiclePedIsIn(ped, false)
1086+
if veh ~= 0 and GetPedInVehicleSeat(veh, -1) == ped then
1087+
local km = getVehicleMileageKm(provider, veh)
1088+
-- Provedores retornam km; o HUD exibe milhas quando UseMPH.
1089+
local value = Menu.isUseMPHChecked and math.floor(km * 0.621371) or math.floor(km)
1090+
if value ~= lastSent then
1091+
lastSent = value
1092+
SendNUIMessage({ action = "odometer", value = value })
1093+
end
1094+
elseif lastSent ~= 0 then
1095+
lastSent = 0 -- fora do veiculo: zera (o UI esconde com 0)
1096+
SendNUIMessage({ action = "odometer", value = 0 })
1097+
end
1098+
end
1099+
Wait(wait)
1100+
end
1101+
end)
1102+
10441103
RegisterNetEvent('hud:client:UpdateUISettings', function(data)
10451104
UIConfig = data
10461105
sendUIUpdateMessage(data)

0 commit comments

Comments
 (0)