From 22fb863d3500d17fb11081ef577e3bb403dddc71 Mon Sep 17 00:00:00 2001 From: renzuzu <82306584+renzuzu@users.noreply.github.com> Date: Sun, 30 May 2021 00:52:37 +0800 Subject: [PATCH 01/12] first commit my legacyfuel version --- client.lua | 314 ++++++++++++++++++++++++++ config.lua | 181 ++++++--------- functions/functions_client.lua | 88 -------- fxmanifest.lua | 33 ++- html/logo.png | Bin 0 -> 49058 bytes html/ui.css | 268 +++++++++++++++++++++++ html/ui.html | 51 +++++ html/ui.js | 182 ++++++++++++++++ server.lua | 30 +++ source/fuel_client.lua | 388 --------------------------------- source/fuel_server.lua | 15 -- 11 files changed, 930 insertions(+), 620 deletions(-) create mode 100644 client.lua delete mode 100644 functions/functions_client.lua create mode 100644 html/logo.png create mode 100644 html/ui.css create mode 100644 html/ui.html create mode 100644 html/ui.js create mode 100644 server.lua delete mode 100644 source/fuel_client.lua delete mode 100644 source/fuel_server.lua diff --git a/client.lua b/client.lua new file mode 100644 index 0000000..a1b617a --- /dev/null +++ b/client.lua @@ -0,0 +1,314 @@ +local isNearPump = false +local pumpLocation = nil +local isFueling = false +local currentFuel = 0.0 +local currentFuel2 = 0.0 +local currentCost = 0.0 + +local output = { + ['price'] = Config.stock.default_price, + ['stock'] = Config.stock.default_stock, +} + +function close() + SetNuiFocus(false, false) + SendNUIMessage({ action = false }) + isFueling = false +end + +function open(vehicle,data) + SetNuiFocus(true, true) + SendNUIMessage({ action = true, fuel = GetVehicleFuelLevel(vehicle), data = data }) +end + +AddEventHandler('onResourceStart', function(name) + if GetCurrentResourceName() ~= name then return end + close() +end) + +RegisterNUICallback('escape', function(data, cb) + close() +end) + +RegisterNetEvent('renzu_fuel:close') +AddEventHandler('renzu_fuel:close',function() + close() +end) + +function ManageFuelUsage(vehicle) + if IsVehicleEngineOn(vehicle) then + SetVehicleFuelLevel(vehicle,GetVehicleFuelLevel(vehicle) - Config.FuelUsage[Round(GetVehicleCurrentRpm(vehicle),1)] * (Config.Classes[GetVehicleClass(vehicle)] or 1.0) / 10) + DecorSetFloat(vehicle,Config.FuelDecor,GetVehicleFuelLevel(vehicle)) + end +end + +Citizen.CreateThread(function() + if Config.Managefuel then + DecorRegister(Config.FuelDecor,1) + while true do + Citizen.Wait(2000) + local ped = PlayerPedId() + if IsPedInAnyVehicle(ped) then + local vehicle = GetVehiclePedIsIn(ped) + if GetPedInVehicleSeat(vehicle,-1) == ped then + ManageFuelUsage(vehicle) + end + end + end + end +end) + +function FindNearestFuelPump() + local coords = GetEntityCoords(PlayerPedId()) + local fuelPumps = {} + local handle,object = FindFirstObject() + local success + + repeat + if Config.PumpModels[GetEntityModel(object)] then + table.insert(fuelPumps,object) + end + + success,object = FindNextObject(handle,object) + until not success + + EndFindObject(handle) + + local pumpObject = 0 + local pumpDistance = 1000 + + for k,v in pairs(fuelPumps) do + local dstcheck = GetDistanceBetweenCoords(coords,GetEntityCoords(v)) + + if dstcheck < pumpDistance then + pumpDistance = dstcheck + pumpObject = v + end + end + return pumpObject,pumpDistance +end + +Citizen.CreateThread(function() + while true do + Citizen.Wait(2000) + local pumpObject,pumpDistance = FindNearestFuelPump() + if pumpDistance < 2.0 then + pumpLocation = nil + for k,v in pairs(Config.GasStation) do + if GetDistanceBetweenCoords(vector3(v[1],v[2],v[3]),GetEntityCoords(pumpObject)) <= v[4] then + pumpLocation = k + end + end + isNearPump = pumpObject + else + isNearPump = false + Citizen.Wait(math.ceil(pumpDistance*20)) + end + end +end) + +RegisterNetEvent("renzu_fuel:syncfuel") +AddEventHandler("renzu_fuel:syncfuel",function(index,change,FuelDecor) + if NetworkDoesNetworkIdExist(index) then + local v = NetToVeh(index) + if DoesEntityExist(v) then + SetVehicleFuelLevel(v,(GetVehicleFuelLevel(v) + change)) + DecorSetFloat(v,FuelDecor,GetVehicleFuelLevel(v)) + end + end +end) + +RegisterNetEvent('renzu_fuel:jerrycan') +AddEventHandler('renzu_fuel:jerrycan',function() + GiveWeaponToPed(PlayerPedId(),883325847,4500,false,true) +end) + +function Round(num,numDecimalPlaces) + local mult = 10^(numDecimalPlaces or 0) + return math.floor(num*mult+0.5) / mult +end + +--[[ Creates gas station and blips ]]-- +Citizen.CreateThread(function() + Wait(1000) + local blip = {} + for k,v in pairs(Config.GasStation) do + if not DoesBlipExist(blip[k]) then + local x,y,z = table.unpack(v) + blip[k] = AddBlipForCoord(x,y,z) + SetBlipSprite(blip[k], 361) + SetBlipDisplay(blip[k], 4) + SetBlipScale(blip[k], 0.5) + SetBlipColour(blip[k], 1) + SetBlipAsShortRange(blip[k], true) + + BeginTextCommandSetBlipName(k) + AddTextEntry(k, k) + EndTextCommandSetBlipName(blip[k]) + end + end +end) + +RegisterNetEvent('renzu_fuel:refuelFromPump') +AddEventHandler('renzu_fuel:refuelFromPump',function(pumpObject,ped,vehicle) + currentFuel = GetVehicleFuelLevel(vehicle) + TaskTurnPedToFaceEntity(ped,vehicle,5000) + 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) + + while isFueling do + Citizen.Wait(4) + local oldFuel = DecorGetFloat(vehicle,Config.FuelDecor) + local fuelToAdd = math.random(1,2) / 100.0 + + for k,v in pairs(Config.DisableKeys) do + DisableControlAction(0,v) + end + + local vehicleCoords = GetEntityCoords(vehicle) + if not pumpObject then + DrawText3Ds(vehicleCoords.x,vehicleCoords.y,vehicleCoords.z + 0.5,"PRESS ~g~E ~w~TO CANCEL") + DrawText3Ds(vehicleCoords.x,vehicleCoords.y,vehicleCoords.z + 0.34,"GALLON: ~b~"..Round(GetAmmoInPedWeapon(ped,883325847) / 4500 * 100,1).."%~w~ TANK: ~y~"..Round(currentFuel,1).."%") + 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 + end + + 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 currentFuel > 100.0 then + currentFuel = 100.0 + isFueling = false + end + + SetVehicleFuelLevel(vehicle,currentFuel) + DecorSetFloat(vehicle,Config.FuelDecor,GetVehicleFuelLevel(vehicle)) + + if IsControlJustReleased(0,38) or DoesEntityExist(GetPedInVehicleSeat(vehicle,-1)) then + isFueling = false + end + end + + ClearPedTasks(ped) + RemoveAnimDict("timetable@gardener@filling_can") +end) + +Citizen.CreateThread(function() + while true do + Citizen.Wait(2000) + local ped = PlayerPedId() + local sleep = 2000 + while not isFueling and ((isNearPump and GetEntityHealth(isNearPump) > 0) or (GetSelectedPedWeapon(ped) == 883325847 and not isNearPump)) do + if isNearPump then + sleep = 1 + end + if IsPedInAnyVehicle(ped) and GetPedInVehicleSeat(GetVehiclePedIsIn(ped),-1) == ped then + local pumpCoords = GetEntityCoords(isNearPump) + DrawText3Ds(pumpCoords.x,pumpCoords.y,pumpCoords.z + 1.2,"GET OUT OF ~y~VEHICLE ~w~TO FUEL") + else + local vehicle = GetPlayersLastVehicle() + local vehicleCoords = GetEntityCoords(vehicle) + if DoesEntityExist(vehicle) and GetDistanceBetweenCoords(GetEntityCoords(ped),vehicleCoords) < 3.5 then + if not DoesEntityExist(GetPedInVehicleSeat(vehicle,-1)) then + local stringCoords = GetEntityCoords(isNearPump) + local canFuel = true + if GetSelectedPedWeapon(ped) == 883325847 then + stringCoords = vehicleCoords + if GetAmmoInPedWeapon(ped,883325847) < 100 then + canFuel = false + end + end + + if GetVehicleFuelLevel(vehicle) < 99 and canFuel then + DrawText3Ds(stringCoords.x,stringCoords.y,stringCoords.z + 1.2,"Press ~g~E ~w~to fuel") + if IsControlJustReleased(0,38) then + if isNearPump then + open(vehicle,output) + isFueling = true + paid = false + else + isFueling = true + TriggerEvent('renzu_fuel:refuelFromPump',isNearPump,ped,vehicle) + end + end + elseif not canFuel then + DrawText3Ds(stringCoords.x,stringCoords.y,stringCoords.z + 1.2,"~o~Cant Refuel") + else + DrawText3Ds(stringCoords.x,stringCoords.y,stringCoords.z + 1.2,"~g~FULL TANK") + end + end + elseif isNearPump then + local stringCoords = GetEntityCoords(isNearPump) + DrawText3Ds(stringCoords.x,stringCoords.y,stringCoords.z + 1.2,"Press ~g~E ~w~to Buy Jerrycan") + if IsControlJustReleased(0,38) then + TriggerServerEvent('renzu_fuel:payfuel',10000,true) + end + end + end + Citizen.Wait(sleep) + end + end +end) + +function ShowHelpNotification(msg, thisFrame, beep, duration) + AddTextEntry('notify_gas', msg) + DisplayHelpTextThisFrame('notify_gas', thisFrame) +end + +RegisterNetEvent('renzu_fuel:Notify') +AddEventHandler('renzu_fuel:Notify',function(msg) + ShowHelpNotification(msg, false) +end) + +RegisterNUICallback('pay', function(data, cb) + local vehicle = GetPlayersLastVehicle() + local new_perc = tonumber(data.new_perc) + if not paid then + if DoesEntityExist(vehicle) and GetDistanceBetweenCoords(GetEntityCoords(PlayerPedId()),GetEntityCoords(vehicle)) < 5 then + TriggerServerEvent('renzu_fuel:payfuel',math.floor(new_perc),false,VehToNet(vehicle),math.floor(new_perc),Config.FuelDecor,pumpLocation) + paid = true + end + end +end) + +RegisterNUICallback('startanim',function(data,cb) + local ped = PlayerPedId() + local vehicle = GetPlayersLastVehicle() + TaskTurnPedToFaceEntity(ped,vehicle,5000) + 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) +end) + +RegisterNUICallback('removeanim',function(data,cb) + local ped = PlayerPedId() + ClearPedTasks(ped) + RemoveAnimDict("timetable@gardener@filling_can") +end) + +function DrawText3Ds(x,y,z,text) + local onScreen,_x,_y = World3dToScreen2d(x,y,z) + + SetTextFont(4) + SetTextScale(0.35,0.35) + SetTextColour(255,255,255,150) + SetTextEntry("STRING") + SetTextCentre(1) + AddTextComponentString(text) + DrawText(_x,_y) + local factor = (string.len(text))/370 + DrawRect(_x,_y+0.0125,0.01+factor,0.03,0,0,0,80) +end + +function LoadAnimDict(dict) + if not HasAnimDictLoaded(dict) then + RequestAnimDict(dict) + while not HasAnimDictLoaded(dict) do + Citizen.Wait(10) + end + end +end \ No newline at end of file diff --git a/config.lua b/config.lua index 8e4ec39..ebc6f69 100644 --- a/config.lua +++ b/config.lua @@ -1,48 +1,17 @@ Config = {} --- Are you using ESX? Turn this to true if you would like fuel & jerry cans to cost something. -Config.UseESX = true - --- What should the price of jerry cans be? -Config.JerryCanCost = 100 -Config.RefillCost = 50 -- If it is missing half of it capacity, this amount will be divided in half, and so on. - --- Fuel decor - No need to change this, just leave it. -Config.FuelDecor = "_FUEL_LEVEL" - --- What keys are disabled while you're fueling. -Config.DisableKeys = {0, 22, 23, 24, 29, 30, 31, 37, 44, 56, 82, 140, 166, 167, 168, 170, 288, 289, 311, 323} - --- Want to use the HUD? Turn this to true. -Config.EnableHUD = true - --- Configure blips here. Turn both to false to disable blips all together. -Config.ShowNearestGasStationOnly = true -Config.ShowAllGasStations = false - --- Modify the fuel-cost here, using a multiplier value. Setting the value to 2.0 would cause a doubled increase. -Config.CostMultiplier = 1.0 +Config.ESX = { + ['ESXSHAREDOBJECT'] = "esx:getSharedObject", +} --- Configure the strings as you wish here. -Config.Strings = { - ExitVehicle = "Exit the vehicle to refuel", - EToRefuel = "Press ~g~E ~w~to refuel vehicle", - JerryCanEmpty = "Jerry can is empty", - FullTank = "Tank is full", - PurchaseJerryCan = "Press ~g~E ~w~to purchase a jerry can for ~g~$" .. Config.JerryCanCost, - CancelFuelingPump = "Press ~g~E ~w~to cancel the fueling", - CancelFuelingJerryCan = "Press ~g~E ~w~to cancel the fueling", - NotEnoughCash = "Not enough cash", - RefillJerryCan = "Press ~g~E ~w~ to refill the jerry can for ", - NotEnoughCashJerryCan = "Not enough cash to refill jerry can", - JerryCanFull = "Jerry can is full", - TotalCost = "Cost", +Config.stock = { + ['default_price'] = 7.00, + ['default_stock'] = 9999 } +Config.Managefuel = true -- enable disable managefuel, disable if you only want gas station function +Config.FuelDecor = "_FUEL_LEVEL" -if not Config.UseESX then - Config.Strings.PurchaseJerryCan = "Press ~g~E ~w~to grab a jerry can" - Config.Strings.RefillJerryCan = "Press ~g~E ~w~ to refill the jerry can" -end +Config.DisableKeys = { 0,22,23,24,29,30,31,37,44,56,82,140,166,167,168,170,288,289,311,323 } Config.PumpModels = { [-2007231801] = true, @@ -54,83 +23,71 @@ Config.PumpModels = { [-164877493] = true } --- Blacklist certain vehicles. Use names or hashes. https://wiki.gtanet.work/index.php?title=Vehicle_Models -Config.Blacklist = { - --"Adder", - --276773164 +Config.GasStation = { + ["gas_station_1"] = {264.95275878906,-1259.4567871094,29.142911911011,30}, + ["gas_station_2"] = {819.61047363281,-1028.2071533203,26.404321670532,30}, + ["gas_station_3"] = {1208.6068115234,-1402.2863769531,35.224140167236,30}, + ["gas_station_4"] = {1180.9593505859,-329.84280395508,69.316436767578,30}, + ["gas_station_5"] = {620.80499267578,268.73849487305,103.08948516846,30}, + ["gas_station_6"] = {2581.1779785156,362.01254272461,108.46883392334,30}, + ["gas_station_7"] = {175.55857849121,-1562.2135009766,29.264209747314,30}, + ["gas_station_8"] = {-319.42581176758,-1471.8182373047,30.548692703247,30}, + ["gas_station_9"] = {1785.9000244141,3330.9035644531,41.377250671387,30}, + ["gas_station_10"] = {49.802303314209,2779.318359375,58.043937683105,30}, + ["gas_station_11"] = {263.92358398438,2607.4140625,44.983062744141,30}, + ["gas_station_12"] = {1039.1220703125,2671.30859375,39.550872802734,30}, + ["gas_station_13"] = {1208.0380859375,2660.4892578125,37.899772644043,30}, + ["gas_station_14"] = {2539.3337402344,2594.61328125,37.944820404053,30}, + ["gas_station_15"] = {2679.9396972656,3264.0981445313,55.240585327148,30}, + ["gas_station_16"] = {2005.0074462891,3774.2006835938,32.40393447876,30}, + ["gas_station_17"] = {1687.263671875,4929.6328125,42.078086853027,30}, + ["gas_station_18"] = {1702.0052490234,6416.9975585938,32.763767242432,30}, + ["gas_station_19"] = {179.82470703125,6602.8408203125,31.868196487427,30}, + ["gas_station_20"] = {-94.206100463867,6419.4975585938,31.489490509033,30}, + ["gas_station_21"] = {-2555.1257324219,2334.2705078125,33.078022003174,30}, + ["gas_station_22"] = {-1799.4152832031,802.8154296875,138.65368652344,30}, + ["gas_station_23"] = {-1436.9724121094,-276.55426025391,46.207653045654,30}, + ["gas_station_24"] = {-2096.5913085938,-321.48611450195,13.168619155884,30}, + ["gas_station_25"] = {-723.298828125,-935.55322265625,19.213928222656,30}, + ["gas_station_26"] = {-525.35266113281,-1211.3215332031,18.184829711914,30}, + ["gas_station_27"] = {-70.514175415039,-1761.2590332031,29.655626296997,30}, } --- Do you want the HUD removed from showing in blacklisted vehicles? -Config.RemoveHUDForBlacklistedVehicle = true - --- Class multipliers. If you want SUVs to use less fuel, you can change it to anything under 1.0, and vise versa. Config.Classes = { - [0] = 1.0, -- Compacts - [1] = 1.0, -- Sedans - [2] = 1.0, -- SUVs - [3] = 1.0, -- Coupes - [4] = 1.0, -- Muscle - [5] = 1.0, -- Sports Classics - [6] = 1.0, -- Sports - [7] = 1.0, -- Super - [8] = 1.0, -- Motorcycles - [9] = 1.0, -- Off-road - [10] = 1.0, -- Industrial - [11] = 1.0, -- Utility - [12] = 1.0, -- Vans + [0] = 0.6, -- Compacts + [1] = 0.6, -- Sedans + [2] = 0.6, -- SUVs + [3] = 0.6, -- Coupes + [4] = 0.6, -- Muscle + [5] = 0.6, -- Sports Classics + [6] = 0.6, -- Sports + [7] = 0.6, -- Super + [8] = 0.6, -- Motorcycles + [9] = 0.6, -- Off-road + [10] = 0.6, -- Industrial + [11] = 0.6, -- Utility + [12] = 0.6, -- Vans [13] = 0.0, -- Cycles - [14] = 1.0, -- Boats - [15] = 1.0, -- Helicopters - [16] = 1.0, -- Planes - [17] = 1.0, -- Service - [18] = 1.0, -- Emergency - [19] = 1.0, -- Military - [20] = 1.0, -- Commercial - [21] = 1.0, -- Trains + [14] = 0.0, -- Boats + [15] = 0.0, -- Helicopters + [16] = 0.0, -- Planes + [17] = 0.3, -- Service + [18] = 0.3, -- Emergency + [19] = 0.6, -- Military + [20] = 0.6, -- Commercial + [21] = 0.6, -- Trains } --- The left part is at percentage RPM, and the right is how much fuel (divided by 10) you want to remove from the tank every second Config.FuelUsage = { - [1.0] = 1.4, - [0.9] = 1.2, - [0.8] = 1.0, - [0.7] = 0.9, - [0.6] = 0.8, - [0.5] = 0.7, - [0.4] = 0.5, - [0.3] = 0.4, - [0.2] = 0.2, - [0.1] = 0.1, + [1.0] = 2.0, + [0.9] = 1.8, + [0.8] = 1.6, + [0.7] = 1.4, + [0.6] = 1.2, + [0.5] = 1.0, + [0.4] = 0.8, + [0.3] = 0.6, + [0.2] = 0.4, + [0.1] = 0.2, [0.0] = 0.0, -} - -Config.GasStations = { - vector3(49.4187, 2778.793, 58.043), - vector3(263.894, 2606.463, 44.983), - vector3(1039.958, 2671.134, 39.550), - vector3(1207.260, 2660.175, 37.899), - vector3(2539.685, 2594.192, 37.944), - vector3(2679.858, 3263.946, 55.240), - vector3(2005.055, 3773.887, 32.403), - vector3(1687.156, 4929.392, 42.078), - vector3(1701.314, 6416.028, 32.763), - vector3(179.857, 6602.839, 31.868), - vector3(-94.4619, 6419.594, 31.489), - vector3(-2554.996, 2334.40, 33.078), - vector3(-1800.375, 803.661, 138.651), - vector3(-1437.622, -276.747, 46.207), - vector3(-2096.243, -320.286, 13.168), - vector3(-724.619, -935.1631, 19.213), - vector3(-526.019, -1211.003, 18.184), - vector3(-70.2148, -1761.792, 29.534), - vector3(265.648, -1261.309, 29.292), - vector3(819.653, -1028.846, 26.403), - vector3(1208.951, -1402.567,35.224), - vector3(1181.381, -330.847, 69.316), - vector3(620.843, 269.100, 103.089), - vector3(2581.321, 362.039, 108.468), - vector3(176.631, -1562.025, 29.263), - vector3(176.631, -1562.025, 29.263), - vector3(-319.292, -1471.715, 30.549), - vector3(1784.324, 3330.55, 41.253) -} +} \ No newline at end of file diff --git a/functions/functions_client.lua b/functions/functions_client.lua deleted file mode 100644 index 37ba151..0000000 --- a/functions/functions_client.lua +++ /dev/null @@ -1,88 +0,0 @@ -function GetFuel(vehicle) - return DecorGetFloat(vehicle, Config.FuelDecor) -end - -function SetFuel(vehicle, fuel) - if type(fuel) == 'number' and fuel >= 0 and fuel <= 100 then - SetVehicleFuelLevel(vehicle, fuel + 0.0) - DecorSetFloat(vehicle, Config.FuelDecor, GetVehicleFuelLevel(vehicle)) - end -end - -function LoadAnimDict(dict) - if not HasAnimDictLoaded(dict) then - RequestAnimDict(dict) - - while not HasAnimDictLoaded(dict) do - Citizen.Wait(1) - end - end -end - -function DrawText3Ds(x, y, z, text) - local onScreen,_x,_y=World3dToScreen2d(x,y,z) - - if onScreen then - SetTextScale(0.35, 0.35) - SetTextFont(4) - SetTextProportional(1) - SetTextColour(255, 255, 255, 215) - SetTextEntry("STRING") - SetTextCentre(1) - AddTextComponentString(text) - DrawText(_x,_y) - end -end - -function Round(num, numDecimalPlaces) - local mult = 10^(numDecimalPlaces or 0) - - return math.floor(num * mult + 0.5) / mult -end - -function CreateBlip(coords) - local blip = AddBlipForCoord(coords) - - SetBlipSprite(blip, 361) - SetBlipScale(blip, 0.9) - SetBlipColour(blip, 4) - SetBlipDisplay(blip, 4) - SetBlipAsShortRange(blip, true) - - BeginTextCommandSetBlipName("STRING") - AddTextComponentString("Gas Station") - EndTextCommandSetBlipName(blip) - - return blip -end - -function FindNearestFuelPump() - local coords = GetEntityCoords(PlayerPedId()) - local fuelPumps = {} - local handle, object = FindFirstObject() - local success - - repeat - if Config.PumpModels[GetEntityModel(object)] then - table.insert(fuelPumps, object) - end - - success, object = FindNextObject(handle, object) - until not success - - EndFindObject(handle) - - local pumpObject = 0 - local pumpDistance = 1000 - - for _, fuelPumpObject in pairs(fuelPumps) do - local dstcheck = GetDistanceBetweenCoords(coords, GetEntityCoords(fuelPumpObject)) - - if dstcheck < pumpDistance then - pumpDistance = dstcheck - pumpObject = fuelPumpObject - end - end - - return pumpObject, pumpDistance -end diff --git a/fxmanifest.lua b/fxmanifest.lua index 9103586..e247591 100644 --- a/fxmanifest.lua +++ b/fxmanifest.lua @@ -1,23 +1,22 @@ -fx_version 'bodacious' -game 'gta5' +fx_version "adamant" +game "gta5" -author 'InZidiuZ' -description 'Legacy Fuel' -version '1.3' - --- What to run -client_scripts { - 'config.lua', - 'functions/functions_client.lua', - 'source/fuel_client.lua' -} +ui_page 'html/ui.html' server_scripts { - 'config.lua', - 'source/fuel_server.lua' + "@mysql-async/lib/MySQL.lua", + "config.lua", + "server.lua" } -exports { - 'GetFuel', - 'SetFuel' +client_scripts { + "config.lua", + "client.lua" } + +files { + 'html/ui.html', + 'html/ui.css', + 'html/ui.js', + 'html/logo.png' +} \ No newline at end of file diff --git a/html/logo.png b/html/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..aab682bac2949e6f9d132aedaefb61fc7b807896 GIT binary patch literal 49058 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

LAZ3uAtXNlp>JgwHj-S zzfy706QjT6-NI+2P*}bA2A?r>R% zSeXUYp`kZt8Jsaba>u1G^~J3D9v+aI`@+36f?}$i z<>8Ecg^GVTl72Ydsk@7b>Fk%MBj*DDX&;D9Q2R^ac!P0ixxXh3Kh66fBCxg|bgu9MpA6HxnvBRa{o6i7xD6X-pxYxM4c5&LtQj%qFsdNLl;f%!Lm>I6K9Dc| z0I70W!A!vnmd3Qy=tMzOqX(eaveLbvvyWZ0;8_ldsqsf38=0q+xzoyz`sMU5{(B$c zpu`fgi9cIUHs{+LR!J9B86o56(qabei8$HU_rgvW{Ji86Fc|vN@N}lmrVR&Diq&R* zaR)r5hdnnwd;sL9$-lr4#2sYIPvaNz*fMUR9cbhOJfZ0MGK7>7py*9<`M)J?Y8<#) zNB9}1WBI<~1!cZn(aw7Ctgm)p3f` z?EB_TY(D{A8R+dG38Q~021xCrepMo*oPf_eT4tB+H5DED^k`#Jc^3T1+mA!er|x|_ zjb8f_VbfCZCRr$B{%3}`h~~LBinK5o>Q36Le|v;K2;v z70eR*b+|zQUYdr%icvDh2G~uRFa**JCCh@M4%sz)ziSQf2~6f+UU)^a+zJ z?3A7l1AH%IM;Un_ZnO$bQd}yj`ewloN`@f3&#I}mGjRtmpD&XFSU1c$W-yH;W*U!$8ifysefrHYyX9|e z9*biU0D~FfE9h`hC0hmDM!^DbnEGHiFk*xveh3aO4E*!|e}==%!C%A@BVettcLyKA zx8?x~{Ad{LnoKPCa2v(V+Xvf4L51#KyAI<;-=#*u{@)+|PfP#%v;W%%s1HDMhr?t$ aOrW| + + + + + + + + + + + +

Fuel in stock:
150

+
+ + +
+ +
+ To fuel
+ Vehicle +
+ Price to Pay +
+ + + +
+
+
+ Vehicle fuel +
+
+ $ 0.00 +
+
+
+
+ Price per liter +
+ $ 1.00 +
+
+
+ + + diff --git a/html/ui.js b/html/ui.js new file mode 100644 index 0000000..5013b42 --- /dev/null +++ b/html/ui.js @@ -0,0 +1,182 @@ +$(document).ready(function(){ + window.addEventListener('message', function( event ) { + if (event.data.action == true) { + + fuel = event.data.fuel; + datafuel = event.data.fuel + dataGas = event.data.data + + + $('#fuel-price').empty(); + $('#fuel-price').append(new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD'}).format(dataGas.price)); + $('#stock').empty(); + if (dataGas.stock == 0) { + $('#stock').append("OUT OF STOCK
" + "NO PETROL
"); + $('.act').fadeOut(); + } else { + $('#stock').append("Fuel in stock:
" + dataGas.stock + " Litres
"); + $('.act').fadeIn(300); + } + + $('body').css('display','flex'); + $('.modal').css('display','none'); + $('.litro').text(Math.round(event.data.fuel) + ' Liters'); + $("#amount").val("") + + $(document).keyup(function(e) { + if (!counting) { + if (e.key === "Escape") { + myStop(); + $("#amount").val("") + counting; + inv; + price; + perc_new; + totalPercent; + guardar; + completar; + maxFuel; + $.post('http://renzu_fuel/escape', JSON.stringify({})); + } + } + }); + } else { + $('body').fadeOut(); + } + }); + + var counting; + var completar; + var guardar; + var price; + var inv; + var totalPercent; + var perc_new; + var maxFuel; + + + function myStart() { + if (inv == undefined) { inv = setInterval(increase,1000); } + } + + function myStop() { + if (inv !== undefined) { clearInterval(inv); inv = undefined; } + } + + function increase() { + if (counting) { + if (fuel < maxFuel) { + fuel++; + totalPercent = Math.round(fuel) + '%' + $('.litro').text(totalPercent); + } else { + $.post('http://renzu_fuel/removeanim', JSON.stringify({})); + if (completar) { + console.log(perc_new*dataGas.price) + console.log(price) + $.post('http://renzu_fuel/pay', JSON.stringify({ new_perc: perc_new*dataGas.price })); + perc_new; + completar = !completar; + } else if (guardar) { + console.log(perc_new*dataGas.price) + console.log(price) + $.post('http://renzu_fuel/pay', JSON.stringify({ new_perc: price })); + price; + guardar = !guardar; + } + counting = !counting; + inv; + totalPercent; + maxFuel; + myStop(); + $.post('http://renzu_fuel/escape', JSON.stringify({})); + } + } + } + + $( "#retirar" ).click(function() { + if (!counting) { + perc_new = 100 - Math.round(datafuel); + $.post('http://renzu_fuel/checkpay', JSON.stringify({ new_perc: perc_new })); + counting = !counting; + completar = !completar; + maxFuel = 99 + $('.modal span').text("Do you want to fill the tank at $"+(perc_new*dataGas.price).toFixed(2)); + $('.modal').fadeIn(300); + $('.container').fadeOut(); + $('left').fadeOut(); + $('.act').fadeOut(); + } + }); + + $( "#guardar" ).click(function() { + if (!counting) { + price = Math.round($("#amount").val()); + if (price > dataGas.price) { + console.log(price) + console.log(((100-Math.round(datafuel))*dataGas.price)) + if (price <= ((100-Math.round(datafuel))*dataGas.price)) { + $.post('http://renzu_fuel/checkpay', JSON.stringify({ new_perc: price })); + counting = !counting; + guardar = !guardar; + maxFuel = (Math.floor(price/dataGas.price)+Math.round(datafuel))-1 + $('.modal span').text("Do you want to fill the tank at $ "+price); + $('.modal').fadeIn(300); + $('.container').fadeOut(); + $('left').fadeOut(); + $('.act').fadeOut(); + } else { + var texto = "The maximum value to fill the tank is $"+((100-Math.round(datafuel))*dataGas.price)+"!" + $.post('http://renzu_fuel/notifytext', JSON.stringify({ text: texto })); + } + } else { + var texto = "The price must be greater than $" + dataGas.price + "!" + $.post('http://renzu_fuel/notifytext', JSON.stringify({ text: texto })); + } + } + }); + + $( "#plus" ).click(function() { + if (!counting) { + if (Math.round($("#amount").val()) < 100) { + $("#amount").val(Math.round($("#amount").val())+1) + price = $("#amount").val() + } + } + }); + + $( "#minus" ).click(function() { + if (!counting) { + if (Math.round($("#amount").val()) > 0) { + $("#amount").val(Math.round($("#amount").val())-1) + price = $("#amount").val() + } + } + }); + + $(".accept").click(function() { + if (counting) { + $('.modal').fadeOut(); + $('.container').fadeIn(300); + $('left').fadeIn(300); + $('.act').fadeIn(300); + $.post('http://renzu_fuel/startanim', JSON.stringify({})); + myStop(); + myStart(); + } + }) + + $(".recuse").click(function() { + $('.modal').fadeOut(); + $('.container').fadeIn(300); + $('left').fadeIn(300); + $('.act').fadeIn(300); + if (completar) { + counting = !counting; + completar = !completar; + } else if (guardar) { + counting = !counting; + guardar = !guardar; + } + }) +}); \ No newline at end of file diff --git a/server.lua b/server.lua new file mode 100644 index 0000000..e393389 --- /dev/null +++ b/server.lua @@ -0,0 +1,30 @@ +ESX = nil +TriggerEvent(Config.ESX.ESXSHAREDOBJECT, function(obj) ESX = obj end) + +RegisterServerEvent("renzu_fuel:payfuel") +AddEventHandler("renzu_fuel:payfuel",function(price,jeryycan,vehicle,fuel,fuel2,key) + local source = source + local output = {} + output = { + ['price'] = Config.stock.default_price, + } + local xPlayer = ESX.GetPlayerFromId(source) + if price > 0 then + local amount = 0 + money = xPlayer.getMoney() + if money >= price then + xPlayer.removeMoney(price) + if jeryycan then + TriggerClientEvent('renzu_fuel:jerrycan',source) + else + amount = math.floor(price/output.price) + fuel = math.floor(fuel/output.price) + TriggerClientEvent('renzu_fuel:syncfuel',-1,vehicle,fuel) + TriggerClientEvent("renzu_fuel:Notify",source,"Paid $"..price.." in "..amount.." liters.") + end + else + TriggerClientEvent('renzu_fuel:insuficiente',source,vehicle,fuel2) + TriggerClientEvent("renzu_fuel:Notify",source,"Insuficient money.") + end + end +end) \ No newline at end of file diff --git a/source/fuel_client.lua b/source/fuel_client.lua deleted file mode 100644 index df886e7..0000000 --- a/source/fuel_client.lua +++ /dev/null @@ -1,388 +0,0 @@ -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 isNearPump = false -local isFueling = false -local currentFuel = 0.0 -local currentCost = 0.0 -local currentCash = 1000 -local fuelSynced = false -local inBlacklisted = 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) - -Citizen.CreateThread(function() - while true do - Citizen.Wait(250) - - local pumpObject, pumpDistance = FindNearestFuelPump() - - if pumpDistance < 2.5 then - isNearPump = pumpObject - - if Config.UseESX then - local playerData = ESX.GetPlayerData() - for i=1, #playerData.accounts, 1 do - if playerData.accounts[i].name == 'money' then - currentCash = playerData.accounts[i].money - break - end - end - end - else - isNearPump = false - - Citizen.Wait(math.ceil(pumpDistance * 20)) - 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 - isFueling = false - end - - currentCost = currentCost + extraCost - - if currentCash >= currentCost then - SetFuel(vehicle, currentFuel) - else - isFueling = false - end - end - - if pumpObject then - TriggerServerEvent('fuel:pay', currentCost) - end - - currentCost = 0.0 -end) - -AddEventHandler('fuel:refuelFromPump', function(pumpObject, ped, vehicle) - TaskTurnPedToFaceEntity(ped, vehicle, 1000) - Citizen.Wait(1000) - SetCurrentPedWeapon(ped, -1569615261, 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', pumpObject, ped, vehicle) - - while isFueling do - for _, controlIndex in pairs(Config.DisableKeys) do - DisableControlAction(0, controlIndex) - end - - local vehicleCoords = GetEntityCoords(vehicle) - - if pumpObject then - local stringCoords = GetEntityCoords(pumpObject) - local extraString = "" - - if Config.UseESX then - extraString = "\n" .. Config.Strings.TotalCost .. ": ~g~$" .. Round(currentCost, 1) - end - - DrawText3Ds(stringCoords.x, stringCoords.y, stringCoords.z + 1.2, Config.Strings.CancelFuelingPump .. extraString) - DrawText3Ds(vehicleCoords.x, vehicleCoords.y, vehicleCoords.z + 0.5, Round(currentFuel, 1) .. "%") - else - 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) .. "%") - end - - 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)) or (isNearPump and GetEntityHealth(pumpObject) <= 0) then - isFueling = false - end - - Citizen.Wait(0) - end - - ClearPedTasks(ped) - RemoveAnimDict("timetable@gardener@filling_can") -end) - -Citizen.CreateThread(function() - while true do - local ped = PlayerPedId() - - if not isFueling and ((isNearPump and GetEntityHealth(isNearPump) > 0) or (GetSelectedPedWeapon(ped) == 883325847 and not isNearPump)) then - if IsPedInAnyVehicle(ped) and GetPedInVehicleSeat(GetVehiclePedIsIn(ped), -1) == ped then - local pumpCoords = GetEntityCoords(isNearPump) - - DrawText3Ds(pumpCoords.x, pumpCoords.y, pumpCoords.z + 1.2, Config.Strings.ExitVehicle) - else - local vehicle = GetPlayersLastVehicle() - local vehicleCoords = GetEntityCoords(vehicle) - - if DoesEntityExist(vehicle) and GetDistanceBetweenCoords(GetEntityCoords(ped), vehicleCoords) < 2.5 then - if not DoesEntityExist(GetPedInVehicleSeat(vehicle, -1)) then - local stringCoords = GetEntityCoords(isNearPump) - local canFuel = true - - if GetSelectedPedWeapon(ped) == 883325847 then - stringCoords = vehicleCoords - - if GetAmmoInPedWeapon(ped, 883325847) < 100 then - canFuel = false - end - end - - if GetVehicleFuelLevel(vehicle) < 95 and canFuel then - if currentCash > 0 then - DrawText3Ds(stringCoords.x, stringCoords.y, stringCoords.z + 1.2, Config.Strings.EToRefuel) - - if IsControlJustReleased(0, 38) then - isFueling = true - - TriggerEvent('fuel:refuelFromPump', isNearPump, ped, vehicle) - LoadAnimDict("timetable@gardener@filling_can") - end - else - DrawText3Ds(stringCoords.x, stringCoords.y, stringCoords.z + 1.2, Config.Strings.NotEnoughCash) - end - elseif not canFuel then - DrawText3Ds(stringCoords.x, stringCoords.y, stringCoords.z + 1.2, Config.Strings.JerryCanEmpty) - else - DrawText3Ds(stringCoords.x, stringCoords.y, stringCoords.z + 1.2, Config.Strings.FullTank) - end - end - elseif isNearPump then - local stringCoords = GetEntityCoords(isNearPump) - - if currentCash >= Config.JerryCanCost then - if not HasPedGotWeapon(ped, 883325847) then - DrawText3Ds(stringCoords.x, stringCoords.y, stringCoords.z + 1.2, Config.Strings.PurchaseJerryCan) - - if IsControlJustReleased(0, 38) then - GiveWeaponToPed(ped, 883325847, 4500, false, true) - - TriggerServerEvent('fuel:pay', Config.JerryCanCost) - - currentCash = ESX.GetPlayerData().money - end - else - if Config.UseESX then - local refillCost = Round(Config.RefillCost * (1 - GetAmmoInPedWeapon(ped, 883325847) / 4500)) - - if refillCost > 0 then - if currentCash >= refillCost then - DrawText3Ds(stringCoords.x, stringCoords.y, stringCoords.z + 1.2, Config.Strings.RefillJerryCan .. refillCost) - - if IsControlJustReleased(0, 38) then - TriggerServerEvent('fuel:pay', refillCost) - - SetPedAmmo(ped, 883325847, 4500) - end - else - DrawText3Ds(stringCoords.x, stringCoords.y, stringCoords.z + 1.2, Config.Strings.NotEnoughCashJerryCan) - end - else - DrawText3Ds(stringCoords.x, stringCoords.y, stringCoords.z + 1.2, Config.Strings.JerryCanFull) - end - else - DrawText3Ds(stringCoords.x, stringCoords.y, stringCoords.z + 1.2, Config.Strings.RefillJerryCan) - - if IsControlJustReleased(0, 38) then - SetPedAmmo(ped, 883325847, 4500) - end - end - end - else - DrawText3Ds(stringCoords.x, stringCoords.y, stringCoords.z + 1.2, Config.Strings.NotEnoughCash) - end - else - Citizen.Wait(250) - end - end - else - Citizen.Wait(250) - end - - Citizen.Wait(0) - 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 diff --git a/source/fuel_server.lua b/source/fuel_server.lua deleted file mode 100644 index 5a61c65..0000000 --- a/source/fuel_server.lua +++ /dev/null @@ -1,15 +0,0 @@ -ESX = nil - -if Config.UseESX then - TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end) - - RegisterServerEvent('fuel:pay') - AddEventHandler('fuel:pay', function(price) - local xPlayer = ESX.GetPlayerFromId(source) - local amount = ESX.Math.Round(price) - - if price > 0 then - xPlayer.removeMoney(amount) - end - end) -end From 5d5c694131edeaad08bd49432d0672da7eb8eef7 Mon Sep 17 00:00:00 2001 From: renzuzu <82306584+renzuzu@users.noreply.github.com> Date: Sun, 30 May 2021 00:57:26 +0800 Subject: [PATCH 02/12] Update README.md --- README.md | 32 ++++++-------------------------- 1 file changed, 6 insertions(+), 26 deletions(-) diff --git a/README.md b/README.md index 86b926c..b4fe1fd 100644 --- a/README.md +++ b/README.md @@ -1,32 +1,12 @@ ### About -Started off as my first script, and for whatever reason, I decided to release it. As it was pretty badly created, I felt like I should rewrite it and make a better version, so ended up spending a few hours doing so. +![alt text](http://url/to/img.png) +My Forked version of LegacyFuel all rights belong to the owner. +this is my version and its NUI based +Future WIP: Target Based +![alt text](https://i.imgur.com/3O0Xnx5.png) ### Installation 1) Download the latest version in the "code" tab on GitHub. 2) Drag & drop the folder into your `resources` server folder. 3) Configure the config file to your liking. -4) Add `start LegacyFuel` to your server config. - -### Exports -There are currently two (client-sided) exports available, which should help you control the fuel level for vehicles whenever needed. - -``` -SetFuel(vehicle --[[ Vehicle ]], value --[[ Number: (0-100) ]]) -GetFuel(vehicle --[[ Vehicle ]]) -- Returns the vehicle's fuel level. -``` - -**Example usage:** -``` -function SpawnVehicle(modelHash) - local vehicle = CreateVehicle(modelHash, coords.x, coords.y, coords.z, true, false) - - exports["LegacyFuel"]:SetFuel(vehicle, 100) -end - -function StoreVehicleInGarage(vehicle) - local plate = GetVehicleNumberPlateText(vehicle) - local fuelLevel = exports["LegacyFuel"]:GetFuel(vehicle) - - TriggerServerEvent('vehiclesStored', plate, fuelLevel) -end -``` +4) Add `start renzu_fuel` to your server config. From 3f8078e1dbc66484a24570309028983ac7896ac3 Mon Sep 17 00:00:00 2001 From: renzuzu <82306584+renzuzu@users.noreply.github.com> Date: Sun, 30 May 2021 00:58:03 +0800 Subject: [PATCH 03/12] Update README.md --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index b4fe1fd..fd2e169 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,4 @@ ### About -![alt text](http://url/to/img.png) My Forked version of LegacyFuel all rights belong to the owner. this is my version and its NUI based Future WIP: Target Based From bfc4ddf74ae225753601c18e57910fb8e48c11b4 Mon Sep 17 00:00:00 2001 From: renzuzu <82306584+renzuzu@users.noreply.github.com> Date: Wed, 4 Aug 2021 16:57:52 +0800 Subject: [PATCH 04/12] tweak(client): added popui as dependency --- client.lua | 153 ++++++++++++++++++++++++++++++++++++----------------- config.lua | 2 +- 2 files changed, 104 insertions(+), 51 deletions(-) diff --git a/client.lua b/client.lua index a1b617a..02a3c45 100644 --- a/client.lua +++ b/client.lua @@ -21,6 +21,11 @@ function open(vehicle,data) SendNUIMessage({ action = true, fuel = GetVehicleFuelLevel(vehicle), data = data }) end +RegisterNetEvent('renzu_fuel:open') +AddEventHandler('renzu_fuel:open',function(vehicle,data) + open(vehicle,data) +end) + AddEventHandler('onResourceStart', function(name) if GetCurrentResourceName() ~= name then return end close() @@ -63,22 +68,17 @@ function FindNearestFuelPump() local fuelPumps = {} local handle,object = FindFirstObject() local success - - repeat - if Config.PumpModels[GetEntityModel(object)] then - table.insert(fuelPumps,object) + for k,v in pairs(GetGamePool('CObject')) do + if Config.PumpModels[GetEntityModel(v)] then + table.insert(fuelPumps,v) end - - success,object = FindNextObject(handle,object) - until not success - - EndFindObject(handle) + end local pumpObject = 0 local pumpDistance = 1000 for k,v in pairs(fuelPumps) do - local dstcheck = GetDistanceBetweenCoords(coords,GetEntityCoords(v)) + local dstcheck = #(coords - GetEntityCoords(v)) if dstcheck < pumpDistance then pumpDistance = dstcheck @@ -88,25 +88,6 @@ function FindNearestFuelPump() return pumpObject,pumpDistance end -Citizen.CreateThread(function() - while true do - Citizen.Wait(2000) - local pumpObject,pumpDistance = FindNearestFuelPump() - if pumpDistance < 2.0 then - pumpLocation = nil - for k,v in pairs(Config.GasStation) do - if GetDistanceBetweenCoords(vector3(v[1],v[2],v[3]),GetEntityCoords(pumpObject)) <= v[4] then - pumpLocation = k - end - end - isNearPump = pumpObject - else - isNearPump = false - Citizen.Wait(math.ceil(pumpDistance*20)) - end - end -end) - RegisterNetEvent("renzu_fuel:syncfuel") AddEventHandler("renzu_fuel:syncfuel",function(index,change,FuelDecor) if NetworkDoesNetworkIdExist(index) then @@ -151,11 +132,12 @@ end) RegisterNetEvent('renzu_fuel:refuelFromPump') AddEventHandler('renzu_fuel:refuelFromPump',function(pumpObject,ped,vehicle) + print(pumpObject,ped,vehicle) currentFuel = GetVehicleFuelLevel(vehicle) TaskTurnPedToFaceEntity(ped,vehicle,5000) 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) - + isFueling = true while isFueling do Citizen.Wait(4) local oldFuel = DecorGetFloat(vehicle,Config.FuelDecor) @@ -198,6 +180,89 @@ AddEventHandler('renzu_fuel:refuelFromPump',function(pumpObject,ped,vehicle) RemoveAnimDict("timetable@gardener@filling_can") end) +RegisterNetEvent('renzu_fuel:fuelevent') +AddEventHandler('renzu_fuel:fuelevent',function(pumpObject,ped,vehicle) + local vehicle = GetPlayersLastVehicle() + local vehicleCoords = GetEntityCoords(vehicle) + local ped = PlayerPedId() + if DoesEntityExist(vehicle) and GetDistanceBetweenCoords(GetEntityCoords(ped),vehicleCoords) < 3.5 then + if isNearPump then + open(vehicle,output) + isFueling = true + paid = false + else + isFueling = true + TriggerEvent('renzu_fuel:refuelFromPump',isNearPump,ped,vehicle) + end + end +end) + +function PopUI(name,v,reqdist,event,arg,server) + if reqdist == nil then reqdist = 5 end + local table = { + ['event'] = event, + ['title'] = name, + ['server_event'] = server, + ['unpack_arg'] = true, + ['invehicle_title'] = 'Get out to vehicle', + ['confirm'] = '[ENTER]', + ['fa'] = '', + ['reject'] = '[CLOSE]', + ['custom_arg'] = arg, -- example: {1,2,3,4} + ['use_cursor'] = false, -- USE MOUSE CURSOR INSTEAD OF INPUT (ENTER) + } + TriggerEvent('renzu_popui:showui',table) + local dist = #(v - GetEntityCoords(PlayerPedId())) + while dist < reqdist and isNearPump do + dist = #(v - GetEntityCoords(PlayerPedId())) + Wait(100) + end + TriggerEvent('renzu_popui:closeui') +end + +function DrawtextUI(name,v,reqdist,event,arg,server,invehicle,key) + if reqdist == nil then reqdist = 5 end + local table = { + ['key'] = key or 'backspace', + ['event'] = event, + ['title'] = name, + ['invehicle_title'] = name, + ['server_event'] = server, + ['unpack_arg'] = true, + ['fa'] = '', + ['custom_arg'] = arg, -- example: {1,2,3,4} + } + TriggerEvent('renzu_popui:drawtextuiwithinput',table) + local dist = #(v - GetEntityCoords(PlayerPedId())) + while dist < reqdist and isNearPump and not IsPedInAnyVehicle(PlayerPedId()) do + dist = #(v - GetEntityCoords(PlayerPedId())) + Wait(100) + end + if invehicle then + while dist < reqdist and isNearPump and IsPedInAnyVehicle(PlayerPedId()) do + dist = #(v - GetEntityCoords(PlayerPedId())) + Wait(100) + end + end + TriggerEvent('renzu_popui:closeui') +end + +Citizen.CreateThread(function() + while true do + Citizen.Wait(2000) + local ped = PlayerPedId() + local sleep = 2000 + local pumpObject,pumpDistance = FindNearestFuelPump() + if pumpDistance < 2.0 then + isNearPump = pumpObject + else + isNearPump = false + Citizen.Wait(math.ceil(pumpDistance*5)) + end + Citizen.Wait(2000) + end +end) + Citizen.CreateThread(function() while true do Citizen.Wait(2000) @@ -205,11 +270,11 @@ Citizen.CreateThread(function() local sleep = 2000 while not isFueling and ((isNearPump and GetEntityHealth(isNearPump) > 0) or (GetSelectedPedWeapon(ped) == 883325847 and not isNearPump)) do if isNearPump then - sleep = 1 + sleep = 1000 end if IsPedInAnyVehicle(ped) and GetPedInVehicleSeat(GetVehiclePedIsIn(ped),-1) == ped then local pumpCoords = GetEntityCoords(isNearPump) - DrawText3Ds(pumpCoords.x,pumpCoords.y,pumpCoords.z + 1.2,"GET OUT OF ~y~VEHICLE ~w~TO FUEL") + DrawtextUI("Get Out of Vehicle",pumpCoords,3.5,'dummyevent',{},false,true) else local vehicle = GetPlayersLastVehicle() local vehicleCoords = GetEntityCoords(vehicle) @@ -224,30 +289,18 @@ Citizen.CreateThread(function() end end - if GetVehicleFuelLevel(vehicle) < 99 and canFuel then - DrawText3Ds(stringCoords.x,stringCoords.y,stringCoords.z + 1.2,"Press ~g~E ~w~to fuel") - if IsControlJustReleased(0,38) then - if isNearPump then - open(vehicle,output) - isFueling = true - paid = false - else - isFueling = true - TriggerEvent('renzu_fuel:refuelFromPump',isNearPump,ped,vehicle) - end - end + if GetVehicleFuelLevel(vehicle) < 99 and canFuel and isNearPump then + PopUI("Re Fuel Vehicle",stringCoords,3.5,'renzu_fuel:open',{vehicle,output},false) elseif not canFuel then - DrawText3Ds(stringCoords.x,stringCoords.y,stringCoords.z + 1.2,"~o~Cant Refuel") + DrawtextUI("Cant Fuel",stringCoords,3.5,'dummyevent',{},false,false) else - DrawText3Ds(stringCoords.x,stringCoords.y,stringCoords.z + 1.2,"~g~FULL TANK") + DrawtextUI("FULL TANK",stringCoords,3.5,'dummyevent',{},false,false) end end elseif isNearPump then local stringCoords = GetEntityCoords(isNearPump) - DrawText3Ds(stringCoords.x,stringCoords.y,stringCoords.z + 1.2,"Press ~g~E ~w~to Buy Jerrycan") - if IsControlJustReleased(0,38) then - TriggerServerEvent('renzu_fuel:payfuel',10000,true) - end + DrawtextUI("Press [E] to Buy Jerry Can",stringCoords,3.5,'renzu_fuel:payfuel',{10000,true},true,false,'E') + --PopUI("Buy Jerry Can",stringCoords,3.5,'renzu_fuel:payfuel',{10000,true},true) end end Citizen.Wait(sleep) diff --git a/config.lua b/config.lua index ebc6f69..bcde04c 100644 --- a/config.lua +++ b/config.lua @@ -8,7 +8,7 @@ Config.stock = { ['default_price'] = 7.00, ['default_stock'] = 9999 } -Config.Managefuel = true -- enable disable managefuel, disable if you only want gas station function +Config.Managefuel = false -- enable disable managefuel, disable if you only want gas station function Config.FuelDecor = "_FUEL_LEVEL" Config.DisableKeys = { 0,22,23,24,29,30,31,37,44,56,82,140,166,167,168,170,288,289,311,323 } From 4cbcf43ca3df69240c3f9a94be8e718ebb4b5370 Mon Sep 17 00:00:00 2001 From: renzuzu <82306584+renzuzu@users.noreply.github.com> Date: Wed, 22 Sep 2021 19:37:59 +0800 Subject: [PATCH 05/12] tweak(client): change popui to drawtextui --- client.lua | 6 +++--- fxmanifest.lua | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/client.lua b/client.lua index 02a3c45..25e6473 100644 --- a/client.lua +++ b/client.lua @@ -132,7 +132,6 @@ end) RegisterNetEvent('renzu_fuel:refuelFromPump') AddEventHandler('renzu_fuel:refuelFromPump',function(pumpObject,ped,vehicle) - print(pumpObject,ped,vehicle) currentFuel = GetVehicleFuelLevel(vehicle) TaskTurnPedToFaceEntity(ped,vehicle,5000) LoadAnimDict("timetable@gardener@filling_can") @@ -253,7 +252,7 @@ Citizen.CreateThread(function() local ped = PlayerPedId() local sleep = 2000 local pumpObject,pumpDistance = FindNearestFuelPump() - if pumpDistance < 2.0 then + if pumpDistance < 3.0 then isNearPump = pumpObject else isNearPump = false @@ -290,7 +289,8 @@ Citizen.CreateThread(function() end if GetVehicleFuelLevel(vehicle) < 99 and canFuel and isNearPump then - PopUI("Re Fuel Vehicle",stringCoords,3.5,'renzu_fuel:open',{vehicle,output},false) + DrawtextUI("Press [E] to Re Fuel Vehicle",stringCoords,3.5,'renzu_fuel:open',{vehicle,output},false,false,'E') + --PopUI("Re Fuel Vehicle",stringCoords,3.5,'renzu_fuel:open',{vehicle,output},false) elseif not canFuel then DrawtextUI("Cant Fuel",stringCoords,3.5,'dummyevent',{},false,false) else diff --git a/fxmanifest.lua b/fxmanifest.lua index e247591..6565ebc 100644 --- a/fxmanifest.lua +++ b/fxmanifest.lua @@ -14,6 +14,7 @@ client_scripts { "client.lua" } +dependency 'renzu_popui' files { 'html/ui.html', 'html/ui.css', From c87b3bc88bae72fa9a5beddaa53a64e73edd8853 Mon Sep 17 00:00:00 2001 From: renzuzu <82306584+renzuzu@users.noreply.github.com> Date: Wed, 22 Sep 2021 19:39:56 +0800 Subject: [PATCH 06/12] tweak(server): server base petrol can --- server.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server.lua b/server.lua index e393389..724e3e3 100644 --- a/server.lua +++ b/server.lua @@ -15,7 +15,7 @@ AddEventHandler("renzu_fuel:payfuel",function(price,jeryycan,vehicle,fuel,fuel2, if money >= price then xPlayer.removeMoney(price) if jeryycan then - TriggerClientEvent('renzu_fuel:jerrycan',source) + xPlayer.addWeapon('WEAPON_PETROLCAN',4500) else amount = math.floor(price/output.price) fuel = math.floor(fuel/output.price) From e9a2117cea224a8ce835e829f2224b7b358ff1a3 Mon Sep 17 00:00:00 2001 From: renzuzu <82306584+renzuzu@users.noreply.github.com> Date: Wed, 22 Sep 2021 20:04:08 +0800 Subject: [PATCH 07/12] tweak(css): minimalistic design --- html/ui.css | 62 ++++++++++++++++++++++++++++++---------------------- html/ui.html | 8 +++---- html/ui.js | 14 ++++++++++++ 3 files changed, 54 insertions(+), 30 deletions(-) diff --git a/html/ui.css b/html/ui.css index 09c69fa..6515635 100644 --- a/html/ui.css +++ b/html/ui.css @@ -14,17 +14,19 @@ body { .container { position: relative; - width: 300px; - height: 300px; + width: 400px; + height: 400px; padding-top: 8px; padding-left: 15px; - background-color: rgba(0, 0, 0, 0.877); + background-color: rgb(8 8 8 / 52%); + border-top-right-radius: 10px; + border-bottom-right-radius: 10px; } .container small { position: relative; top: 5px; - color: rgb(0, 98, 255); + color: rgb(241 251 250); font-size: 9px; font-size: 15px; font-weight: 300; @@ -38,7 +40,7 @@ body { } .container span { - color: rgb(18, 76, 184); + color: rgb(209 225 255); font-size: 25px; margin-bottom: 10px; text-transform: uppercase; @@ -63,7 +65,7 @@ body { .container .item { position: relative; width: 94%; - height: 40px; + height: 60px; display: flex; color: #fff; margin-top: 10px; @@ -72,13 +74,14 @@ body { justify-content: center; border-width: 2px; border-style: solid; - border-image: - linear-gradient( + border-image: linear-gradient( to bottom, - #0068ef, + #000000, #22a7f4 ) 1 100%; - text-transform: uppercase; + text-transform: uppercase; + background: #00000052; + border-radius: 10px; } .container .item .litro { @@ -111,16 +114,18 @@ body { top:50%; left: 50%; width: 300px; - height: 80px; + height: 120px; color: #ffff; padding: 14px; - font-size: 10px; + font-size: 11px; + font-weight: 600; text-align: center; border-radius: .3rem; text-transform: uppercase; - backdrop-filter: blur(20px); + /* backdrop-filter: blur(20px); */ transform: translate(-50%,-50%); - background-color: rgba(0, 0, 0, 0.938); + background-color: rgb(0 0 0 / 64%); + border-radius: 10px; } .modal b { @@ -135,8 +140,8 @@ body { position: absolute; border: 0; left: 15px; - width: 80px; - bottom: 15px; + width: 120px; + bottom: 30px; outline: none; color: #fff; font-size: 12px; @@ -146,14 +151,15 @@ body { text-transform: uppercase; font-family: 'Poppins', sans-serif; background-color: rgba(13, 17, 19, 0.938); + height: 40px; } .modal .recuse { position: absolute; border: 0; right: 15px; - width: 80px; - bottom: 15px; + width: 120px; + bottom: 30px; outline: none; color: #fff; font-size: 12px; @@ -163,6 +169,7 @@ body { text-transform: uppercase; font-family: 'Poppins', sans-serif; background-color: rgba(13, 17, 19, 0.938); + height: 40px; } .modal .btninfo:hover { @@ -184,7 +191,7 @@ body { justify-content: center; transform: translate(0,-50%); font-family: 'Poppins', sans-serif; - background: linear-gradient(to right, #112cc2ea, #062aa1); + background: linear-gradient(to right, #2367a0ea, #003a92); } .container .item button:nth-child(1) { @@ -194,8 +201,8 @@ body { left { position: relative; display: flex; - width: 150px; - height: 300px; + width: 200px; + height: 400px; padding: 15px; color: #fff; font-size: 7px; @@ -204,15 +211,18 @@ left { text-align: center; flex-direction: column; text-transform: uppercase; - background-color: rgba(56, 61, 64, 0.781); + background-color: rgb(14 14 14 / 50%); + border-top-left-radius: 10px; + border-bottom-left-radius: 10px; } left img { position: absolute; left: 50%; - max-height: 70px; - max-width: 100px; + max-height: 200px; + max-width: 120px; transform: translate(-50%,0); + top: 10%; } left p { @@ -230,11 +240,11 @@ left p { left .act button { border: 0; - opacity: .4; + opacity: .9; width: 100%; height: 60px; outline: none; - color: #ffff; + color: #fff; font-weight: 300; letter-spacing: 1px; background-color: transparent; diff --git a/html/ui.html b/html/ui.html index 680b51b..56862cd 100644 --- a/html/ui.html +++ b/html/ui.html @@ -9,11 +9,11 @@ - -

Fuel in stock:
150

+
- - + + +
diff --git a/html/ui.js b/html/ui.js index 5013b42..f90acd0 100644 --- a/html/ui.js +++ b/html/ui.js @@ -44,6 +44,7 @@ $(document).ready(function(){ $('body').fadeOut(); } }); + function close() {} var counting; var completar; @@ -136,6 +137,19 @@ $(document).ready(function(){ } }); + $( "#close" ).click(function() { + $("#amount").val("") + counting; + inv; + price; + perc_new; + totalPercent; + guardar; + completar; + maxFuel; + $.post('http://renzu_fuel/escape', JSON.stringify({})); + }) + $( "#plus" ).click(function() { if (!counting) { if (Math.round($("#amount").val()) < 100) { From b89adf0622094284eb52ad180118c83749d85e7b Mon Sep 17 00:00:00 2001 From: renzuzu <82306584+renzuzu@users.noreply.github.com> Date: Wed, 22 Sep 2021 20:11:21 +0800 Subject: [PATCH 08/12] Update ui.css --- html/ui.css | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/html/ui.css b/html/ui.css index 6515635..e537b72 100644 --- a/html/ui.css +++ b/html/ui.css @@ -4,6 +4,8 @@ body { align-items: center; justify-content: center; display: none; + margin-top: -20%; + margin-left: 40%; } * { @@ -18,7 +20,7 @@ body { height: 400px; padding-top: 8px; padding-left: 15px; - background-color: rgb(8 8 8 / 52%); + background-color: rgb(8 8 8 / 50%); border-top-right-radius: 10px; border-bottom-right-radius: 10px; } @@ -211,7 +213,7 @@ left { text-align: center; flex-direction: column; text-transform: uppercase; - background-color: rgb(14 14 14 / 50%); + background-color: rgb(14 14 14 / 56%); border-top-left-radius: 10px; border-bottom-left-radius: 10px; } @@ -248,8 +250,8 @@ left .act button { font-weight: 300; letter-spacing: 1px; background-color: transparent; - border-top: 1px solid rgba(29, 43, 44, 0.815); - border-bottom: 1px solid rgba(29, 43, 44, 0.815); + border-top: 1px solid rgb(240 240 241 / 22%); + border-bottom: 1px solid rgb(101 117 128 / 38%); } left .act button:hover { From 1cd8069f381fed63db35754fca743d838b515cb6 Mon Sep 17 00:00:00 2001 From: renzuzu <82306584+renzuzu@users.noreply.github.com> Date: Wed, 22 Sep 2021 20:12:35 +0800 Subject: [PATCH 09/12] Update README.md --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index fd2e169..7713a8e 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,7 @@ ### About My Forked version of LegacyFuel all rights belong to the owner. this is my version and its NUI based -Future WIP: Target Based -![alt text](https://i.imgur.com/3O0Xnx5.png) +![image](https://user-images.githubusercontent.com/82306584/134341351-46b14e43-986a-4f26-9e7b-37eac8516f1e.png) ### Installation 1) Download the latest version in the "code" tab on GitHub. From e4f53e59af58a3b3137b75ea02c71ade1c83b651 Mon Sep 17 00:00:00 2001 From: renzuzu <82306584+renzuzu@users.noreply.github.com> Date: Wed, 22 Sep 2021 22:42:37 +0800 Subject: [PATCH 10/12] fix(client): petrol can refuel --- client.lua | 9 ++++++--- server.lua | 2 ++ 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/client.lua b/client.lua index 25e6473..6cbca6b 100644 --- a/client.lua +++ b/client.lua @@ -139,7 +139,7 @@ AddEventHandler('renzu_fuel:refuelFromPump',function(pumpObject,ped,vehicle) isFueling = true while isFueling do Citizen.Wait(4) - local oldFuel = DecorGetFloat(vehicle,Config.FuelDecor) + local oldFuel = DecorGetFloat(vehicle,Config.FuelDecor)+0.0 local fuelToAdd = math.random(1,2) / 100.0 for k,v in pairs(Config.DisableKeys) do @@ -151,7 +151,7 @@ AddEventHandler('renzu_fuel:refuelFromPump',function(pumpObject,ped,vehicle) DrawText3Ds(vehicleCoords.x,vehicleCoords.y,vehicleCoords.z + 0.5,"PRESS ~g~E ~w~TO CANCEL") DrawText3Ds(vehicleCoords.x,vehicleCoords.y,vehicleCoords.z + 0.34,"GALLON: ~b~"..Round(GetAmmoInPedWeapon(ped,883325847) / 4500 * 100,1).."%~w~ TANK: ~y~"..Round(currentFuel,1).."%") if GetAmmoInPedWeapon(ped,883325847) - fuelToAdd * 100 >= 0 then - currentFuel = oldFuel + fuelToAdd + currentFuel = currentFuel + fuelToAdd SetPedAmmo(ped,883325847,math.floor(GetAmmoInPedWeapon(ped,883325847) - fuelToAdd * 100)) else isFueling = false @@ -168,12 +168,12 @@ AddEventHandler('renzu_fuel:refuelFromPump',function(pumpObject,ped,vehicle) end SetVehicleFuelLevel(vehicle,currentFuel) - DecorSetFloat(vehicle,Config.FuelDecor,GetVehicleFuelLevel(vehicle)) if IsControlJustReleased(0,38) or DoesEntityExist(GetPedInVehicleSeat(vehicle,-1)) then isFueling = false end end + DecorSetFloat(vehicle,Config.FuelDecor,GetVehicleFuelLevel(vehicle)+0.0) ClearPedTasks(ped) RemoveAnimDict("timetable@gardener@filling_can") @@ -281,6 +281,7 @@ Citizen.CreateThread(function() if not DoesEntityExist(GetPedInVehicleSeat(vehicle,-1)) then local stringCoords = GetEntityCoords(isNearPump) local canFuel = true + print(GetSelectedPedWeapon(ped),GetAmmoInPedWeapon(ped,883325847),GetVehicleFuelLevel(vehicle),canFuel,isNearPump) if GetSelectedPedWeapon(ped) == 883325847 then stringCoords = vehicleCoords if GetAmmoInPedWeapon(ped,883325847) < 100 then @@ -291,6 +292,8 @@ Citizen.CreateThread(function() if GetVehicleFuelLevel(vehicle) < 99 and canFuel and isNearPump then DrawtextUI("Press [E] to Re Fuel Vehicle",stringCoords,3.5,'renzu_fuel:open',{vehicle,output},false,false,'E') --PopUI("Re Fuel Vehicle",stringCoords,3.5,'renzu_fuel:open',{vehicle,output},false) + elseif canFuel and GetVehicleFuelLevel(vehicle) < 99 then + DrawtextUI("Press [E] to Re Fuel Vehicle (PETROL CAN)",stringCoords,3.5,'renzu_fuel:refuelFromPump',{false,ped,vehicle},false,false,'E') elseif not canFuel then DrawtextUI("Cant Fuel",stringCoords,3.5,'dummyevent',{},false,false) else diff --git a/server.lua b/server.lua index 724e3e3..4387501 100644 --- a/server.lua +++ b/server.lua @@ -15,6 +15,8 @@ AddEventHandler("renzu_fuel:payfuel",function(price,jeryycan,vehicle,fuel,fuel2, if money >= price then xPlayer.removeMoney(price) if jeryycan then + xPlayer.removeWeapon('WEAPON_PETROLCAN') + Wait(500) xPlayer.addWeapon('WEAPON_PETROLCAN',4500) else amount = math.floor(price/output.price) From bd4baa8d2ed73fcffac4d248aedd276902501818 Mon Sep 17 00:00:00 2001 From: renzuzu <82306584+renzuzu@users.noreply.github.com> Date: Wed, 22 Sep 2021 22:45:21 +0800 Subject: [PATCH 11/12] Update client.lua --- client.lua | 1 - 1 file changed, 1 deletion(-) diff --git a/client.lua b/client.lua index 6cbca6b..c24ad6f 100644 --- a/client.lua +++ b/client.lua @@ -281,7 +281,6 @@ Citizen.CreateThread(function() if not DoesEntityExist(GetPedInVehicleSeat(vehicle,-1)) then local stringCoords = GetEntityCoords(isNearPump) local canFuel = true - print(GetSelectedPedWeapon(ped),GetAmmoInPedWeapon(ped,883325847),GetVehicleFuelLevel(vehicle),canFuel,isNearPump) if GetSelectedPedWeapon(ped) == 883325847 then stringCoords = vehicleCoords if GetAmmoInPedWeapon(ped,883325847) < 100 then From 8972593f52dc09ac606d2555f71d9d048ccdd21a Mon Sep 17 00:00:00 2001 From: renzuzu <82306584+renzuzu@users.noreply.github.com> Date: Wed, 1 Dec 2021 22:19:56 +0800 Subject: [PATCH 12/12] Update client.lua --- client.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/client.lua b/client.lua index c24ad6f..c8e3e10 100644 --- a/client.lua +++ b/client.lua @@ -118,13 +118,13 @@ Citizen.CreateThread(function() local x,y,z = table.unpack(v) blip[k] = AddBlipForCoord(x,y,z) SetBlipSprite(blip[k], 361) - SetBlipDisplay(blip[k], 4) + SetBlipDisplay(blip[k], 5) SetBlipScale(blip[k], 0.5) SetBlipColour(blip[k], 1) SetBlipAsShortRange(blip[k], true) - BeginTextCommandSetBlipName(k) - AddTextEntry(k, k) + BeginTextCommandSetBlipName('Gas Station') + AddTextEntry(k, 'Gas Station') EndTextCommandSetBlipName(blip[k]) end end