347 lines
9.6 KiB
Lua
347 lines
9.6 KiB
Lua
if Config.UseESX then
|
|
Citizen.CreateThread(function()
|
|
while not ESX do
|
|
TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end)
|
|
|
|
Citizen.Wait(500)
|
|
end
|
|
end)
|
|
end
|
|
|
|
local isFueling = false
|
|
local currentFuel = 0.0
|
|
local currentCost = 0.0
|
|
local currentCash = 1000
|
|
local fuelSynced = false
|
|
local inBlacklisted = false
|
|
local ShutOffPump = false
|
|
|
|
function ManageFuelUsage(vehicle)
|
|
if not DecorExistOn(vehicle, Config.FuelDecor) then
|
|
SetFuel(vehicle, math.random(200, 800) / 10)
|
|
elseif not fuelSynced then
|
|
SetFuel(vehicle, GetFuel(vehicle))
|
|
|
|
fuelSynced = true
|
|
end
|
|
|
|
if IsVehicleEngineOn(vehicle) then
|
|
SetFuel(vehicle, GetVehicleFuelLevel(vehicle) - Config.FuelUsage[Round(GetVehicleCurrentRpm(vehicle), 1)] * (Config.Classes[GetVehicleClass(vehicle)] or 1.0) / 10)
|
|
end
|
|
end
|
|
|
|
Citizen.CreateThread(function()
|
|
DecorRegister(Config.FuelDecor, 1)
|
|
|
|
for index = 1, #Config.Blacklist do
|
|
if type(Config.Blacklist[index]) == 'string' then
|
|
Config.Blacklist[GetHashKey(Config.Blacklist[index])] = true
|
|
else
|
|
Config.Blacklist[Config.Blacklist[index]] = true
|
|
end
|
|
end
|
|
|
|
for index = #Config.Blacklist, 1, -1 do
|
|
table.remove(Config.Blacklist, index)
|
|
end
|
|
|
|
while true do
|
|
Citizen.Wait(1000)
|
|
|
|
local ped = PlayerPedId()
|
|
|
|
if IsPedInAnyVehicle(ped) then
|
|
local vehicle = GetVehiclePedIsIn(ped)
|
|
|
|
if Config.Blacklist[GetEntityModel(vehicle)] then
|
|
inBlacklisted = true
|
|
else
|
|
inBlacklisted = false
|
|
end
|
|
|
|
if not inBlacklisted and GetPedInVehicleSeat(vehicle, -1) == ped then
|
|
ManageFuelUsage(vehicle)
|
|
end
|
|
else
|
|
if fuelSynced then
|
|
fuelSynced = false
|
|
end
|
|
|
|
if inBlacklisted then
|
|
inBlacklisted = false
|
|
end
|
|
end
|
|
end
|
|
end)
|
|
|
|
AddEventHandler('fuel:startFuelUpTick', function(pumpObject, ped, vehicle)
|
|
currentFuel = GetVehicleFuelLevel(vehicle)
|
|
|
|
while isFueling do
|
|
Citizen.Wait(500)
|
|
|
|
local oldFuel = DecorGetFloat(vehicle, Config.FuelDecor)
|
|
local fuelToAdd = math.random(10, 20) / 10.0
|
|
local extraCost = fuelToAdd / 1.5 * Config.CostMultiplier
|
|
|
|
if not pumpObject then
|
|
if GetAmmoInPedWeapon(ped, 883325847) - fuelToAdd * 100 >= 0 then
|
|
currentFuel = oldFuel + fuelToAdd
|
|
|
|
SetPedAmmo(ped, 883325847, math.floor(GetAmmoInPedWeapon(ped, 883325847) - fuelToAdd * 100))
|
|
else
|
|
isFueling = false
|
|
end
|
|
else
|
|
currentFuel = oldFuel + fuelToAdd
|
|
end
|
|
|
|
if currentFuel > 100.0 then
|
|
currentFuel = 100.0
|
|
ShutOffPump = true
|
|
end
|
|
|
|
currentCost = currentCost + extraCost
|
|
|
|
if Config.UseESX then
|
|
currentCash = ESX.GetPlayerData().money
|
|
end
|
|
if currentCash >= currentCost then
|
|
SetFuel(vehicle, currentFuel)
|
|
else
|
|
ShutOffPump = true
|
|
end
|
|
|
|
if ShutOffPump then
|
|
ShutOffPump = false
|
|
Citizen.Wait(Config.WaitTimeAfterRefuel)
|
|
isFueling = false
|
|
end
|
|
|
|
end
|
|
|
|
if pumpObject then
|
|
TriggerServerEvent('fuel:pay', currentCost)
|
|
end
|
|
|
|
currentCost = 0.0
|
|
end)
|
|
|
|
AddEventHandler('fuel:stopRefuelFromPump', function()
|
|
if isFueling then
|
|
ShutOffPump = true
|
|
end
|
|
end)
|
|
|
|
AddEventHandler('fuel:refuelFromPump', function(ped, vehicle)
|
|
isFueling = true
|
|
TriggerEvent('fuel:startFuelUpTick', true, ped, vehicle)
|
|
while isFueling do
|
|
local vehicleCoords = GetEntityCoords(vehicle)
|
|
local extraString = ""
|
|
|
|
if Config.UseESX then
|
|
extraString = "\n" .. Config.Strings.TotalCost .. ": ~g~$" .. Round(currentCost, 1)
|
|
end
|
|
DrawText3Ds(vehicleCoords.x, vehicleCoords.y, vehicleCoords.z + 0.5, Round(currentFuel, 1) .. "%" .. extraString)
|
|
Citizen.Wait(0)
|
|
end
|
|
end)
|
|
|
|
AddEventHandler('fuel:refuelFromJerryCan', function(ped, vehicle)
|
|
TaskTurnPedToFaceEntity(ped, vehicle, 1000)
|
|
Citizen.Wait(1000)
|
|
SetCurrentPedWeapon(ped, -1569615261, true)
|
|
isFueling = true
|
|
LoadAnimDict("timetable@gardener@filling_can")
|
|
TaskPlayAnim(ped, "timetable@gardener@filling_can", "gar_ig_5_filling_can", 2.0, 8.0, -1, 50, 0, 0, 0, 0)
|
|
|
|
TriggerEvent('fuel:startFuelUpTick', false, ped, vehicle)
|
|
|
|
while isFueling do
|
|
for _, controlIndex in pairs(Config.DisableKeys) do
|
|
DisableControlAction(0, controlIndex)
|
|
end
|
|
|
|
local vehicleCoords = GetEntityCoords(vehicle)
|
|
DrawText3Ds(vehicleCoords.x, vehicleCoords.y, vehicleCoords.z + 0.5, Config.Strings.CancelFuelingJerryCan .. "\nGas can: ~g~" .. Round(GetAmmoInPedWeapon(ped, 883325847) / 4500 * 100, 1) .. "% | Vehicle: " .. Round(currentFuel, 1) .. "%")
|
|
|
|
if not IsEntityPlayingAnim(ped, "timetable@gardener@filling_can", "gar_ig_5_filling_can", 3) then
|
|
TaskPlayAnim(ped, "timetable@gardener@filling_can", "gar_ig_5_filling_can", 2.0, 8.0, -1, 50, 0, 0, 0, 0)
|
|
end
|
|
|
|
if IsControlJustReleased(0, 38) or DoesEntityExist(GetPedInVehicleSeat(vehicle, -1)) then
|
|
isFueling = false
|
|
end
|
|
|
|
Citizen.Wait(0)
|
|
end
|
|
|
|
ClearPedTasks(ped)
|
|
RemoveAnimDict("timetable@gardener@filling_can")
|
|
end)
|
|
|
|
AddEventHandler('fuel:requestJerryCanPurchase', function()
|
|
if Config.UseESX then
|
|
currentCash = ESX.GetPlayerData().money
|
|
end
|
|
if currentCash >= Config.JerryCanCost then
|
|
local ped = PlayerPedId()
|
|
if not HasPedGotWeapon(ped, 883325847) then
|
|
ShowNotification(Config.Strings.PurchaseJerryCan)
|
|
GiveWeaponToPed(ped, 883325847, 4500, false, true)
|
|
TriggerServerEvent('fuel:pay', Config.JerryCanCost)
|
|
else
|
|
if Config.UseESX then
|
|
local refillCost = Round(Config.RefillCost * (1 - GetAmmoInPedWeapon(ped, 883325847) / 4500))
|
|
|
|
if refillCost > 0 then
|
|
if currentCash >= refillCost then
|
|
ShowNotification(Config.Strings.RefillJerryCan .. "~g~$" .. refillCost)
|
|
TriggerServerEvent('fuel:pay', refillCost)
|
|
SetPedAmmo(ped, 883325847, 4500)
|
|
else
|
|
ShowNotification(Config.Strings.NotEnoughCashJerryCan)
|
|
end
|
|
else
|
|
ShowNotification(Config.Strings.JerryCanFull)
|
|
end
|
|
else
|
|
ShowNotification(Config.Strings.RefillJerryCan)
|
|
SetPedAmmo(ped, 883325847, 4500)
|
|
end
|
|
end
|
|
else
|
|
ShowNotification(Config.Strings.NotEnoughCash)
|
|
end
|
|
end)
|
|
|
|
if Config.ShowNearestGasStationOnly then
|
|
Citizen.CreateThread(function()
|
|
local currentGasBlip = 0
|
|
|
|
while true do
|
|
local coords = GetEntityCoords(PlayerPedId())
|
|
local closest = 1000
|
|
local closestCoords
|
|
|
|
for _, gasStationCoords in pairs(Config.GasStations) do
|
|
local dstcheck = GetDistanceBetweenCoords(coords, gasStationCoords)
|
|
|
|
if dstcheck < closest then
|
|
closest = dstcheck
|
|
closestCoords = gasStationCoords
|
|
end
|
|
end
|
|
|
|
if DoesBlipExist(currentGasBlip) then
|
|
RemoveBlip(currentGasBlip)
|
|
end
|
|
|
|
currentGasBlip = CreateBlip(closestCoords)
|
|
|
|
Citizen.Wait(10000)
|
|
end
|
|
end)
|
|
elseif Config.ShowAllGasStations then
|
|
Citizen.CreateThread(function()
|
|
for _, gasStationCoords in pairs(Config.GasStations) do
|
|
CreateBlip(gasStationCoords)
|
|
end
|
|
end)
|
|
end
|
|
|
|
if Config.EnableHUD then
|
|
local function DrawAdvancedText(x,y ,w,h,sc, text, r,g,b,a,font,jus)
|
|
SetTextFont(font)
|
|
SetTextProportional(0)
|
|
SetTextScale(sc, sc)
|
|
N_0x4e096588b13ffeca(jus)
|
|
SetTextColour(r, g, b, a)
|
|
SetTextDropShadow(0, 0, 0, 0,255)
|
|
SetTextEdge(1, 0, 0, 0, 255)
|
|
SetTextDropShadow()
|
|
SetTextOutline()
|
|
SetTextEntry("STRING")
|
|
AddTextComponentString(text)
|
|
DrawText(x - 0.1+w, y - 0.02+h)
|
|
end
|
|
|
|
local mph = 0
|
|
local kmh = 0
|
|
local fuel = 0
|
|
local displayHud = false
|
|
|
|
local x = 0.01135
|
|
local y = 0.002
|
|
|
|
Citizen.CreateThread(function()
|
|
while true do
|
|
local ped = PlayerPedId()
|
|
|
|
if IsPedInAnyVehicle(ped) and not (Config.RemoveHUDForBlacklistedVehicle and inBlacklisted) then
|
|
local vehicle = GetVehiclePedIsIn(ped)
|
|
local speed = GetEntitySpeed(vehicle)
|
|
|
|
mph = tostring(math.ceil(speed * 2.236936))
|
|
kmh = tostring(math.ceil(speed * 3.6))
|
|
fuel = tostring(math.ceil(GetVehicleFuelLevel(vehicle)))
|
|
|
|
displayHud = true
|
|
else
|
|
displayHud = false
|
|
|
|
Citizen.Wait(500)
|
|
end
|
|
|
|
Citizen.Wait(50)
|
|
end
|
|
end)
|
|
|
|
Citizen.CreateThread(function()
|
|
while true do
|
|
if displayHud then
|
|
DrawAdvancedText(0.130 - x, 0.77 - y, 0.005, 0.0028, 0.6, mph, 255, 255, 255, 255, 6, 1)
|
|
DrawAdvancedText(0.174 - x, 0.77 - y, 0.005, 0.0028, 0.6, kmh, 255, 255, 255, 255, 6, 1)
|
|
DrawAdvancedText(0.2195 - x, 0.77 - y, 0.005, 0.0028, 0.6, fuel, 255, 255, 255, 255, 6, 1)
|
|
DrawAdvancedText(0.148 - x, 0.7765 - y, 0.005, 0.0028, 0.4, "mp/h km/h Fuel", 255, 255, 255, 255, 6, 1)
|
|
else
|
|
Citizen.Wait(750)
|
|
end
|
|
|
|
Citizen.Wait(0)
|
|
end
|
|
end)
|
|
end
|
|
|
|
local barHeight = 0.010 -- Height of Bar Variable
|
|
local barWidth = 0.140 -- Width of Bar Variable
|
|
local barPos = { x = 0.0855, y = 0.812 } -- Position On Screen (Above Mini Map)
|
|
|
|
-- NOTE -- As you change the HEIGHT or WIDTH you may also need to change the POSITION.
|
|
-- NOTE -- WIDTH and HEIGHT should be divisible by TWO to make it easier for POSITION.
|
|
|
|
Citizen.CreateThread(function()
|
|
while true do Citizen.Wait(0)
|
|
|
|
local playerPed = PlayerPedId() -- The Player
|
|
local vehicle = GetVehiclePedIsIn(playerPed) -- Is The Player in a vehicle?
|
|
local driver = GetPedInVehicleSeat(vehicle, -1) -- Is The Player in the Driver Seat?
|
|
local dead = IsPedDeadOrDying(playerPed, true) -- Is The Player dead or dying?
|
|
local class = GetVehicleClass(vehicle) -- What class of vehicle? Ignore bikes.
|
|
|
|
if (vehicle ~= 0) and (class ~= 13) then
|
|
-- If IN a vehicle, and NOT a bike then
|
|
if driver and not dead then
|
|
-- If The Player is in the Driver Seat and IS NOT dead
|
|
local currentFuel = GetVehicleFuelLevel(vehicle) -- Current Fuel In Vehicle
|
|
local fuelWidth = (barWidth * currentFuel) / 100 -- Fuel Value x Max Bar Width Show The Level Range Within The Bar
|
|
|
|
DrawRect(barPos.x, barPos.y, barWidth, barHeight, 40, 40, 40, 150) -- Bar Background (Black)
|
|
DrawRect(barPos.x - (barWidth - fuelWidth) / 2, barPos.y, fuelWidth, barHeight, 200, 46, 46, 150) -- Current Fuel (Red)
|
|
else
|
|
Wait(500) -- Wait and don't crash
|
|
end
|
|
end
|
|
end
|
|
end) |