This commit is contained in:
2026-07-07 21:08:52 +02:00
commit 4c20cfc716
2613 changed files with 318021 additions and 0 deletions

View File

@@ -0,0 +1,95 @@
HUD = HUD or {}
HUD.VersionCheckBaseURL = "https://raw.githubusercontent.com/esx-framework/ESX-Legacy-Addons/main/%5Besx_addons%5D/"
function HUD:ErrorHandle(msg)
local resourceName = GetCurrentResourceName()
print(("[^1ERROR^7] ^3%s^7: %s"):format(resourceName, msg))
end
function HUD:InfoHandle(msg, color)
local resourceName = GetCurrentResourceName()
local c = ({green=2, red=1, blue=4})[color] or 3
print(("[^9INFO^7] ^3%s^7: ^" .. c .. "%s^7"):format(resourceName, msg))
end
local function normalizeSemver(v)
if type(v) ~= "string" then return nil end
local three = v:match("%d+%.%d+%.%d+")
if three then return three end
local two = v:match("^%d+%.%d+$")
if two then return (two .. ".0") end
local one = v:match("^%d+$")
if one then return (one .. ".0.0") end
return nil
end
VERSION = {
Check = function(err, response, headers)
local resourceName = GetCurrentResourceName()
local currentVersion = GetResourceMetadata(resourceName, "version", 0)
if not currentVersion then return end
local manifestURL = HUD.VersionCheckBaseURL .. resourceName .. "/fxmanifest.lua"
HUD:InfoHandle(("Checking manifest from %s"):format(manifestURL), "blue")
if err ~= 200 or not response then
HUD:ErrorHandle(Translate("errorGetCurrentVersion"))
return
end
local remoteVersion = response:match("version%s+'([%d%.]+)'")
if not remoteVersion then
HUD:ErrorHandle(Translate("errorGetRemoteVersion"))
return
end
local latestVersion = normalizeSemver(remoteVersion)
currentVersion = normalizeSemver(currentVersion)
if not latestVersion or not currentVersion then
HUD:ErrorHandle(Translate("invalidVersion"))
return
end
if currentVersion == latestVersion then
HUD:InfoHandle(Translate("latestVersion"), "green")
HUD:InfoHandle(("Up to date version (%s)"):format(currentVersion), "green")
return
end
local currentVersionSplitted = { string.strsplit(".", currentVersion) }
local latestVersionSplitted = { string.strsplit(".", latestVersion) }
HUD:InfoHandle(Translate("currentVersion") .. latestVersion, "green")
HUD:InfoHandle(Translate("yourVersion") .. currentVersion, "blue")
HUD:InfoHandle(("Update available: remote %s > local %s"):format(latestVersion, currentVersion), "red")
for i = 1, #currentVersionSplitted do
local current, latest = tonumber(currentVersionSplitted[i]), tonumber(latestVersionSplitted[i])
if current ~= latest then
if not current or not latest then return end
if current < latest then
HUD:InfoHandle(Translate("needUpdateResource"), "red")
end
break
end
end
end,
RunVersionChecker = function()
CreateThread(function()
local resourceName = GetCurrentResourceName()
local manifestURL = HUD.VersionCheckBaseURL .. resourceName .. "/fxmanifest.lua"
PerformHttpRequest(manifestURL, VERSION.Check, "GET")
end)
end,
}
AddEventHandler("onResourceStart", function(resourceName)
local currentName = GetCurrentResourceName()
if resourceName ~= currentName then return end
Wait(100)
VERSION:RunVersionChecker()
end)

View File

@@ -0,0 +1,123 @@
if not Config.Disable.Vehicle then
HUD.Mileage = {
Data = {},
}
local Mileage = HUD.Mileage
-- Create column in sql if not exist
-- CREDIT: Overextended (https://github.com/overextended)
CreateThread(function()
local success, result = pcall(MySQL.query.await, "SELECT mileage FROM owned_vehicles")
if not success then
MySQL.query("ALTER TABLE owned_vehicles ADD COLUMN `mileage` FLOAT(10) DEFAULT 0; ")
end
end)
function Mileage:Load(plate, playerId, kmh)
MySQL.single("SELECT mileage FROM owned_vehicles WHERE plate = ?", { plate }, function(data)
local mileage, owned
if data then
mileage, owned = data.mileage, true
if kmh then
mileage = mileage * 1.61
end
else
mileage, owned = math.random(100, 10000), false
end
self:Create(plate, mileage, owned, playerId)
end)
end
function Mileage:Save()
if next(Mileage.Data) then
local parameters = {}
for plate, data in pairs(Mileage.Data) do
if data.owned then
parameters[#parameters + 1] = { data.mileage, plate }
end
end
if next(parameters) then
MySQL.prepare("UPDATE `owned_vehicles` SET `mileage` = ? WHERE `plate` = ?", parameters)
end
end
end
function Mileage:Create(plate, mileage, owned, playerId)
self.Data[plate] = { mileage = mileage, owned = owned }
self:UpdateClient(mileage, playerId)
end
function Mileage:Update(plate, mileage, playerId, kmh)
if not self.Data[plate] then
return
end
if kmh then
mileage = mileage / 1.61
end
self.Data[plate].mileage = mileage
if playerId then
self:UpdateClient(mileage, playerId)
end
end
function Mileage:Exist(plate, playerId, kmh)
if self.Data[plate] then
local milage = self.Data[plate].mileage
if kmh then
milage = self.Data[plate].mileage * 1.61
end
self:UpdateClient(milage, playerId)
return
end
self:Load(plate, playerId, kmh)
end
-- Send date to client
function Mileage:UpdateClient(mileage, playerId)
TriggerClientEvent("esx_hud:UpdateMileage", playerId, mileage)
end
RegisterNetEvent("esx_hud:EnteredVehicle", function(plate, kmh)
local playerId = source
Mileage:Exist(plate, playerId, kmh)
end)
RegisterNetEvent("esx_hud:ExitedVehicle", function(plate, mileage, kmh)
Mileage:Update(plate, mileage, source, kmh)
end)
-- Auto save every 5 min
CreateThread(function()
while true do
Wait(1000 * 60 * 5)
Mileage:Save()
end
end)
-- Auto save on resource stop
AddEventHandler("onResourceStop", function(resourceName)
if GetCurrentResourceName() ~= resourceName then
return
end
Mileage:Save()
end)
-- Auto save 10 sec before scheduled restart
AddEventHandler("txAdmin:events:scheduledRestart", function(eventData)
if eventData.secondsRemaining == 60 then
CreateThread(function()
Wait(50000)
Mileage:Save()
end)
end
end)
-- Auto save on txAdmin server stop
AddEventHandler("txAdmin:events:serverShuttingDown", function()
Mileage:Save()
end)
end