if Config.ElectricVehicleCharging then
-- Variables
local QBCore = exports[Config.Core]:GetCoreObject()
local HoldingElectricNozzle = false
local RefuelPossible = false
local RefuelPossibleAmount = 0
local RefuelCancelled = false
local RefuelPurchaseType = 'bank'
if Config.PumpHose then
Rope = nil
end
-- Start
AddEventHandler('onResourceStart', function(resource)
if resource == GetCurrentResourceName() then
Wait(100)
DeleteObject(ElectricNozzle)
HoldingElectricNozzle = false
end
end)
-- Functions
function IsHoldingElectricNozzle()
return HoldingElectricNozzle
end exports('IsHoldingElectricNozzle', IsHoldingElectricNozzle)
function SetElectricNozzle(state)
if state == "putback" then
TriggerServerEvent("InteractSound_SV:PlayOnSource", "putbackcharger", 0.4)
Wait(250)
if Config.FuelTargetExport then exports[Config.TargetResource]:AllowRefuel(false, true) end
DeleteObject(ElectricNozzle)
HoldingElectricNozzle = false
if Config.PumpHose == true then
RopeUnloadTextures()
DeleteRope(Rope)
end
elseif state == "pickup" then
TriggerEvent('cdn-fuel:client:grabelectricnozzle')
HoldingElectricNozzle = true
else
if Config.FuelDebug then print("State is not valid, it must be pickup or putback.") end
end
end exports('SetElectricNozzle', SetElectricNozzle)
-- Events
if Config.Ox.Menu then
RegisterNetEvent('cdn-electric:client:OpenContextMenu', function(total, fuelamounttotal, purchasetype)
lib.registerContext({
id = 'electricconfirmationmenu',
title = Lang:t("menu_purchase_station_header_1")..math.ceil(total)..Lang:t("menu_purchase_station_header_2"),
options = {
{
title = Lang:t("menu_purchase_station_confirm_header"),
description = Lang:t("menu_electric_accept"),
icon = "fas fa-check-circle",
arrow = false, -- puts arrow to the right
event = 'cdn-fuel:client:electric:ChargeVehicle',
args = {
fuelamounttotal = fuelamounttotal,
purchasetype = purchasetype,
}
},
{
title = Lang:t("menu_header_close"),
description = Lang:t("menu_refuel_cancel"),
icon = "fas fa-times-circle",
arrow = false, -- puts arrow to the right
onSelect = function()
lib.hideContext()
end,
},
},
})
lib.showContext('electricconfirmationmenu')
end)
end
RegisterNetEvent('cdn-fuel:client:electric:FinalMenu', function(purchasetype)
local money = nil
if purchasetype == "bank" then money = QBCore.Functions.GetPlayerData().money['bank'] elseif purchasetype == 'cash' then money = QBCore.Functions.GetPlayerData().money['cash'] end
FuelPrice = (1 * Config.ElectricChargingPrice)
local vehicle = GetClosestVehicle()
-- Police Discount Math --
if Config.EmergencyServicesDiscount['enabled'] == true and (Config.EmergencyServicesDiscount['emergency_vehicles_only'] == false or (Config.EmergencyServicesDiscount['emergency_vehicles_only'] == true and GetVehicleClass(vehicle) == 18)) then
local discountedJobs = Config.EmergencyServicesDiscount['job']
local plyJob = QBCore.Functions.GetPlayerData().job.name
local shouldRecieveDiscount = false
if type(discountedJobs) == "table" then
for i = 1, #discountedJobs, 1 do
if plyJob == discountedJobs[i] then
shouldRecieveDiscount = true
break
end
end
elseif plyJob == discountedJobs then
shouldRecieveDiscount = true
end
if shouldRecieveDiscount == true and not QBCore.Functions.GetPlayerData().job.onduty and Config.EmergencyServicesDiscount['ondutyonly'] then
QBCore.Functions.Notify(Lang:t("you_are_discount_eligible"), 'primary', 7500)
shouldRecieveDiscount = false
end
if shouldRecieveDiscount then
local discount = Config.EmergencyServicesDiscount['discount']
if discount > 100 then
discount = 100
else
if discount <= 0 then discount = 0 end
end
if discount ~= 0 then
if discount == 100 then
FuelPrice = 0
if Config.FuelDebug then
print("Your discount for Emergency Services is set @ "..discount.."% so fuel is free!")
end
else
discount = discount / 100
FuelPrice = FuelPrice - (FuelPrice*discount)
if Config.FuelDebug then
print("Your discount for Emergency Services is set @ "..discount.."%. Setting new price to: $"..FuelPrice)
end
end
else
if Config.FuelDebug then
print("Your discount for Emergency Services is set @ "..discount.."%. It cannot be 0 or < 0!")
end
end
end
end
local curfuel = GetFuel(vehicle)
local finalfuel
if curfuel < 10 then finalfuel = string.sub(curfuel, 1, 1) else finalfuel = string.sub(curfuel, 1, 2) end
local maxfuel = (100 - finalfuel - 1)
local wholetankcost = (FuelPrice * maxfuel)
local wholetankcostwithtax = math.ceil((wholetankcost) + GlobalTax(wholetankcost))
if Config.FuelDebug then print("Attempting to open Input with the total: $"..wholetankcostwithtax.." at $"..FuelPrice.." / L".." Maximum Fuel Amount: "..maxfuel) end
if Config.Ox.Input then
Electricity = lib.inputDialog('Electric Charger', {
{ type = "input", label = 'Electric Price',
default = '$'.. FuelPrice .. '/KWh',
disabled = true },
{ type = "input", label = 'Current Charge',
default = finalfuel .. ' KWh',
disabled = true },
{ type = "input", label = 'Required Full Charge',
default = maxfuel,
disabled = true },
{ type = "slider", label = 'Full Charge Cost: $' ..wholetankcostwithtax.. '',
default = maxfuel,
min = 0,
max = maxfuel
},
})
if not Electricity then return end
ElectricityAmount = tonumber(Electricity[4])
if Electricity then
if not ElectricityAmount then if Config.FuelDebug then print("ElectricityAmount is invalid!") end return end
if not HoldingElectricNozzle then QBCore.Functions.Notify(Lang:t("electric_no_nozzle"), 'error', 7500) return end
if (ElectricityAmount + finalfuel) >= 100 then
QBCore.Functions.Notify(Lang:t("tank_already_full"), "error")
else
if GlobalTax(ElectricityAmount * FuelPrice) + (ElectricityAmount * FuelPrice) <= money then
TriggerServerEvent('cdn-fuel:server:electric:OpenMenu', ElectricityAmount, IsInGasStation(), false, purchasetype, FuelPrice)
else
QBCore.Functions.Notify(Lang:t("not_enough_money"), 'error', 7500)
end
end
end
else
Electricity = exports['qb-input']:ShowInput({
header = "Yakıt Miktarını Seç
Güncel Fiyat: $" ..
FuelPrice .. " / KWh
Current Charge: " .. finalfuel .. " KWh
Full Charge Cost: $" ..
wholetankcostwithtax .. "",
submitText = "Insert Charger",
inputs = {{
type = 'number',
isRequired = true,
name = 'amount',
text = 'The Battery Can Hold ' .. maxfuel .. ' More KWh.'
}}
})
if Electricity then
if not Electricity.amount then print("Electricity.amount is invalid!") return end
if not HoldingElectricNozzle then QBCore.Functions.Notify(Lang:t("electric_no_nozzle"), 'error', 7500) return end
if (Electricity.amount + finalfuel) >= 100 then
QBCore.Functions.Notify(Lang:t("tank_already_full"), "error")
else
if GlobalTax(Electricity.amount * FuelPrice) + (Electricity.amount * FuelPrice) <= money then
TriggerServerEvent('cdn-fuel:server:electric:OpenMenu', Electricity.amount, IsInGasStation(), false, purchasetype, FuelPrice)
else
QBCore.Functions.Notify(Lang:t("not_enough_money"), 'error', 7500)
end
end
end
end
end)
RegisterNetEvent('cdn-fuel:client:electric:SendMenuToServer', function()
local vehicle = GetClosestVehicle()
local vehModel = GetEntityModel(vehicle)
local vehiclename = string.lower(GetDisplayNameFromVehicleModel(vehModel))
AwaitingElectricCheck = true
FoundElectricVehicle = false
:: ChargingMenu :: -- Register the starting point for the goto
if not AwaitingElectricCheck then if Config.FuelDebug then print("Attempting to go to Charging Menu") end end
if not AwaitingElectricCheck and FoundElectricVehicle then
local CurFuel = GetVehicleFuelLevel(vehicle)
local playercashamount = QBCore.Functions.GetPlayerData().money['cash']
if not IsHoldingElectricNozzle() then QBCore.Functions.Notify(Lang:t("electric_no_nozzle"), 'error', 7500) return end
if CurFuel < 95 then
if Config.Ox.Menu then
lib.registerContext({
id = 'electricmenu',
title = Config.GasStations[FetchCurrentLocation()].label,
options = {
{
title = Lang:t("menu_header_cash"),
description = Lang:t("menu_pay_with_cash") .. playercashamount,
icon = "fas fa-usd",
arrow = false, -- puts arrow to the right
event = "cdn-fuel:client:electric:FinalMenu",
args = 'cash',
},
{
title = Lang:t("menu_header_bank"),
description = Lang:t("menu_pay_with_bank"),
icon = "fas fa-credit-card",
arrow = false, -- puts arrow to the right
event = "cdn-fuel:client:electric:FinalMenu",
args = 'bank',
},
{
title = Lang:t("menu_header_close"),
description = Lang:t("menu_refuel_cancel"),
icon = "fas fa-times-circle",
arrow = false, -- puts arrow to the right
onSelect = function()
lib.hideContext()
end,
},
},
})
lib.showContext('electricmenu')
else
exports['qb-menu']:openMenu({
{
header = Config.GasStations[FetchCurrentLocation()].label,
isMenuHeader = true,
icon = "fas fa-bolt",
},
{
header = Lang:t("menu_header_cash"),
txt = Lang:t("menu_pay_with_cash") .. playercashamount,
icon = "fas fa-usd",
params = {
event = "cdn-fuel:client:electric:FinalMenu",
args = 'cash',
}
},
{
header = Lang:t("menu_header_bank"),
txt = Lang:t("menu_pay_with_bank"),
icon = "fas fa-credit-card",
params = {
event = "cdn-fuel:client:electric:FinalMenu",
args = 'bank',
}
},
{
header = Lang:t("menu_header_close"),
txt = Lang:t("menu_electric_cancel"),
icon = "fas fa-times-circle",
params = {
event = "qb-menu:closeMenu",
}
},
})
end
else
QBCore.Functions.Notify(Lang:t("tank_already_full"), 'error')
end
else
if Config.FuelDebug then print("Checking") end
if AwaitingElectricCheck then
if Config.ElectricVehicles[vehiclename] and Config.ElectricVehicles[vehiclename].isElectric then
AwaitingElectricCheck = false
FoundElectricVehicle = true
if Config.FuelDebug then print("^2"..current.. "^5 has been found. It ^2matches ^5the Player's Vehicle: ^2"..vehiclename..". ^5This means charging will be allowed.") end
Wait(50)
goto ChargingMenu -- Attempt to go to the charging menu, now that we have found that there was an electric vehicle.
else
FoundElectricVehicle = false
AwaitingElectricCheck = false
Wait(50)
if Config.FuelDebug then print("^2An electric vehicle^5 has NOT been found. ^5This means charging will not be allowed.") end
goto ChargingMenu -- Attempt to go to the charging menu, now that we have not found that there was an electric vehicle.
end
-- for i = 1, #Config.ElectricVehicles do
-- if AwaitingElectricCheck then
-- if Config.FuelDebug then print(i) end
-- local current = joaat(Config.ElectricVehicles[i])
-- if Config.FuelDebug then print("^5Current Search: ^2"..current.." ^5Player's Vehicle: ^2"..vehiclename) end
-- if current == vehiclename then
-- AwaitingElectricCheck = false
-- FoundElectricVehicle = true
-- if Config.FuelDebug then print("^2"..current.. "^5 has been found. It ^2matches ^5the Player's Vehicle: ^2"..vehiclename..". ^5This means charging will be allowed.") end
-- Wait(50)
-- goto ChargingMenu -- Attempt to go to the charging menu, now that we have found that there was an electric vehicle.
-- elseif i == #Config.ElectricVehicles then
-- FoundElectricVehicle = false
-- AwaitingElectricCheck = false
-- Wait(50)
-- if Config.FuelDebug then print("^2An electric vehicle^5 has NOT been found. ^5This means charging will not be allowed.") end
-- goto ChargingMenu -- Attempt to go to the charging menu, now that we have not found that there was an electric vehicle.
-- end
-- else
-- if Config.FuelDebug then print('Search ended..') end
-- end
-- end
else
QBCore.Functions.Notify(Lang:t("electric_vehicle_not_electric"), 'error', 7500)
end
end
end)
RegisterNetEvent('cdn-fuel:client:electric:ChargeVehicle', function(data)
if Config.FuelDebug then print("Charging Vehicle") end
if not Config.RenewedPhonePayment then
purchasetype = data.purchasetype
elseif data.purchasetype == "cash" then
purchasetype = "cash"
else
purchasetype = RefuelPurchaseType
end
if Config.FuelDebug then print("Purchase Type: "..purchasetype) end
if not Config.RenewedPhonePayment then
amount = data.fuelamounttotal
elseif data.purchasetype == "cash" then
amount = data.fuelamounttotal
elseif not data.fuelamounttotal then
amount = RefuelPossibleAmount
end
if not HoldingElectricNozzle then return end
amount = tonumber(amount)
if amount < 1 then return end
if amount < 10 then fuelamount = string.sub(amount, 1, 1) else fuelamount = string.sub(amount, 1, 2) end
local FuelPrice = (Config.ElectricChargingPrice * 1)
local vehicle = GetClosestVehicle()
-- Police Discount Math --
if Config.EmergencyServicesDiscount['enabled'] == true and (Config.EmergencyServicesDiscount['emergency_vehicles_only'] == false or (Config.EmergencyServicesDiscount['emergency_vehicles_only'] == true and GetVehicleClass(vehicle) == 18)) then
local discountedJobs = Config.EmergencyServicesDiscount['job']
local plyJob = QBCore.Functions.GetPlayerData().job.name
local shouldRecieveDiscount = false
if type(discountedJobs) == "table" then
for i = 1, #discountedJobs, 1 do
if plyJob == discountedJobs[i] then
shouldRecieveDiscount = true
break
end
end
elseif plyJob == discountedJobs then
shouldRecieveDiscount = true
end
if shouldRecieveDiscount == true and not QBCore.Functions.GetPlayerData().job.onduty and Config.EmergencyServicesDiscount['ondutyonly'] then
QBCore.Functions.Notify(Lang:t("you_are_discount_eligible"), 'primary', 7500)
shouldRecieveDiscount = false
end
if shouldRecieveDiscount then
local discount = Config.EmergencyServicesDiscount['discount']
if discount > 100 then
discount = 100
else
if discount <= 0 then discount = 0 end
end
if discount ~= 0 then
if discount == 100 then
FuelPrice = 0
if Config.FuelDebug then
print("Your discount for Emergency Services is set @ "..discount.."% so fuel is free!")
end
else
discount = discount / 100
FuelPrice = FuelPrice - (FuelPrice*discount)
if Config.FuelDebug then
print("Your discount for Emergency Services is set @ "..discount.."%. Setting new price to: $"..FuelPrice)
end
end
else
if Config.FuelDebug then
print("Your discount for Emergency Services is set @ "..discount.."%. It cannot be 0 or < 0!")
end
end
end
end
local refillCost = (fuelamount * FuelPrice) + GlobalTax(fuelamount*FuelPrice)
local vehicle = GetClosestVehicle()
local ped = PlayerPedId()
local time = amount * Config.RefuelTime
if amount < 10 then time = 10 * Config.RefuelTime end
local vehicleCoords = GetEntityCoords(vehicle)
if IsInGasStation() then
if IsPlayerNearVehicle() then
RequestAnimDict(Config.RefuelAnimationDictionary)
while not HasAnimDictLoaded('timetable@gardener@filling_can') do Wait(100) end
if GetIsVehicleEngineRunning(vehicle) and Config.VehicleBlowUp then
local Chance = math.random(1, 100)
if Chance <= Config.BlowUpChance then
AddExplosion(vehicleCoords, 5, 50.0, true, false, true)
return
end
end
TaskPlayAnim(ped, Config.RefuelAnimationDictionary, Config.RefuelAnimation, 8.0, 1.0, -1, 1, 0, 0, 0, 0)
refueling = true
Refuelamount = 0
CreateThread(function()
while refueling do
if Refuelamount == nil then Refuelamount = 0 end
Wait(Config.RefuelTime)
Refuelamount = Refuelamount + 1
if Cancelledrefuel then
local finalrefuelamount = math.floor(Refuelamount)
local refillCost = (finalrefuelamount * FuelPrice) + GlobalTax(finalrefuelamount * FuelPrice)
if Config.RenewedPhonePayment and purchasetype == "bank" then
local remainingamount = (amount - Refuelamount)
MoneyToGiveBack = (GlobalTax(remainingamount * FuelPrice) + (remainingamount * FuelPrice))
TriggerServerEvent("cdn-fuel:server:phone:givebackmoney", MoneyToGiveBack)
else
TriggerServerEvent('cdn-fuel:server:PayForFuel', refillCost, purchasetype, FuelPrice)
end
local curfuel = GetFuel(vehicle)
local finalfuel = (curfuel + Refuelamount)
if finalfuel >= 98 and finalfuel < 100 then
SetFuel(vehicle, 100)
else
SetFuel(vehicle, finalfuel)
end
if Config.RenewedPhonePayment then
RefuelCancelled = true
RefuelPossibleAmount = 0
RefuelPossible = false
end
Cancelledrefuel = false
end
end
end)
TriggerServerEvent("InteractSound_SV:PlayOnSource", "charging", 0.3)
if Config.Ox.Progress then
if lib.progressCircle({
duration = time,
label = Lang:t("prog_electric_charging"),
position = 'bottom',
useWhileDead = false,
canCancel = true,
disable = {
move = true,
combat = true
},
}) then
refueling = false
if purchasetype == "cash" then
TriggerServerEvent('cdn-fuel:server:PayForFuel', refillCost, purchasetype, FuelPrice, true)
elseif purchasetype == "bank" then
TriggerServerEvent('cdn-fuel:server:PayForFuel', refillCost, purchasetype, FuelPrice, true)
end
local curfuel = GetFuel(vehicle)
local finalfuel = (curfuel + fuelamount)
if finalfuel > 99 and finalfuel < 100 then
SetFuel(vehicle, 100)
else
SetFuel(vehicle, finalfuel)
end
if Config.RenewedPhonePayment then
RefuelCancelled = true
RefuelPossibleAmount = 0
RefuelPossible = false
end
StopAnimTask(ped, Config.RefuelAnimationDictionary, Config.RefuelAnimation, 3.0, 3.0, -1, 2, 0, 0, 0, 0)
TriggerServerEvent("InteractSound_SV:PlayOnSource", "chargestop", 0.4)
else
refueling = false
Cancelledrefuel = true
StopAnimTask(ped, Config.RefuelAnimationDictionary, Config.RefuelAnimation, 3.0, 3.0, -1, 2, 0, 0, 0, 0)
TriggerServerEvent("InteractSound_SV:PlayOnSource", "chargestop", 0.4)
end
else
QBCore.Functions.Progressbar("charge-car", Lang:t("prog_electric_charging"), time, false, true, {
disableMovement = true,
disableCarMovement = true,
disableMouse = false,
disableCombat = true,
}, {}, {}, {}, function()
refueling = false
if not Config.RenewedPhonePayment or purchasetype == 'cash' then TriggerServerEvent('cdn-fuel:server:PayForFuel', refillCost, purchasetype, FuelPrice, true) end
local curfuel = GetFuel(vehicle)
local finalfuel = (curfuel + fuelamount)
if finalfuel > 99 and finalfuel < 100 then
SetFuel(vehicle, 100)
else
SetFuel(vehicle, finalfuel)
end
if Config.RenewedPhonePayment then
RefuelCancelled = true
RefuelPossibleAmount = 0
RefuelPossible = false
end
StopAnimTask(ped, Config.RefuelAnimationDictionary, Config.RefuelAnimation, 3.0, 3.0, -1, 2, 0, 0, 0, 0)
TriggerServerEvent("InteractSound_SV:PlayOnSource", "chargestop", 0.4)
end, function()
refueling = false
Cancelledrefuel = true
StopAnimTask(ped, Config.RefuelAnimationDictionary, Config.RefuelAnimation, 3.0, 3.0, -1, 2, 0, 0, 0, 0)
TriggerServerEvent("InteractSound_SV:PlayOnSource", "chargestop", 0.4)
end, "fas fa-charging-station")
end
end
else return end
end)
RegisterNetEvent('cdn-fuel:client:grabelectricnozzle', function()
local ped = PlayerPedId()
if HoldingElectricNozzle then return end
LoadAnimDict("anim@am_hold_up@male")
TaskPlayAnim(ped, "anim@am_hold_up@male", "shoplift_high", 2.0, 8.0, -1, 50, 0, 0, 0, 0)
TriggerServerEvent("InteractSound_SV:PlayOnSource", "pickupnozzle", 0.4)
Wait(300)
StopAnimTask(ped, "anim@am_hold_up@male", "shoplift_high", 1.0)
ElectricNozzle = CreateObject(joaat('electric_nozzle'), 1.0, 1.0, 1.0, true, true, false)
local lefthand = GetPedBoneIndex(ped, 18905)
AttachEntityToEntity(ElectricNozzle, ped, lefthand, 0.24, 0.10, -0.052 --[[FWD BWD]], -45.0 --[[ClockWise]], 120.0 --[[Weird Middle Axis]], 75.00 --[[Counter Clockwise]], 0, 1, 0, 1, 0, 1)
local grabbedelectricnozzlecoords = GetEntityCoords(ped)
HoldingElectricNozzle = true
if Config.PumpHose == true then
local pumpCoords, pump = GetClosestPump(grabbedelectricnozzlecoords, true)
RopeLoadTextures()
while not RopeAreTexturesLoaded() do
Wait(0)
RopeLoadTextures()
end
while not pump do
Wait(0)
end
Rope = AddRope(pumpCoords.x, pumpCoords.y, pumpCoords.z, 0.0, 0.0, 0.0, 3.0, Config.RopeType['electric'], 1000.0, 0.0, 1.0, false, false, false, 1.0, true)
while not Rope do
Wait(0)
end
ActivatePhysics(Rope)
Wait(100)
local nozzlePos = GetEntityCoords(ElectricNozzle)
nozzlePos = GetOffsetFromEntityInWorldCoords(ElectricNozzle, -0.005, 0.185, -0.05)
AttachEntitiesToRope(Rope, pump, ElectricNozzle, pumpCoords.x, pumpCoords.y, pumpCoords.z + 1.76, nozzlePos.x, nozzlePos.y, nozzlePos.z, 5.0, false, false, nil, nil)
end
CreateThread(function()
while HoldingElectricNozzle do
local currentcoords = GetEntityCoords(ped)
local dist = #(grabbedelectricnozzlecoords - currentcoords)
if not TargetCreated then if Config.FuelTargetExport then exports[Config.TargetResource]:AllowRefuel(true, true) end end
TargetCreated = true
if dist > 7.5 then
if TargetCreated then if Config.FuelTargetExport then exports[Config.TargetResource]:AllowRefuel(false, true) end end
TargetCreated = true
HoldingElectricNozzle = false
DeleteObject(ElectricNozzle)
QBCore.Functions.Notify(Lang:t("nozzle_cannot_reach"), 'error')
if Config.PumpHose == true then
if Config.FuelDebug then print("Removing ELECTRIC Rope.") end
RopeUnloadTextures()
DeleteRope(Rope)
end
end
Wait(2500)
end
end)
end)
RegisterNetEvent('cdn-fuel:client:electric:RefuelMenu', function()
if Config.RenewedPhonePayment then
if not RefuelPossible then
TriggerEvent('cdn-fuel:client:electric:SendMenuToServer')
else
if Config.RenewedPhonePayment then
if not Cancelledrefuel and not RefuelCancelled then
if RefuelPossibleAmount then
local purchasetype = "bank"
local fuelamounttotal = tonumber(RefuelPossibleAmount)
if Config.FuelDebug then print("Attempting to charge vehicle.") end
TriggerEvent('cdn-fuel:client:electric:ChargeVehicle', purchasetype, fuelamounttotal)
else
QBCore.Functions.Notify(Lang:t("electric_more_than_zero"), 'error', 7500)
end
end
end
end
else
TriggerEvent("cdn-fuel:client:electric:SendMenuToServer")
end
end)
if Config.RenewedPhonePayment then
RegisterNetEvent('cdn-fuel:client:electric:phone:PayForFuel', function(amount)
FuelPrice = Config.ElectricChargingPrice
-- Police Discount Math --
if Config.EmergencyServicesDiscount['enabled'] == true then
local discountedJobs = Config.EmergencyServicesDiscount['job']
local plyJob = QBCore.Functions.GetPlayerData().job.name
local shouldRecieveDiscount = false
if type(discountedJobs) == "table" then
for i = 1, #discountedJobs, 1 do
if plyJob == discountedJobs[i] then
shouldRecieveDiscount = true
break
end
end
elseif plyJob == discountedJobs then
shouldRecieveDiscount = true
end
if shouldRecieveDiscount == true and not QBCore.Functions.GetPlayerData().job.onduty and Config.EmergencyServicesDiscount['ondutyonly'] then
QBCore.Functions.Notify(Lang:t("you_are_discount_eligible"), 'primary', 7500)
shouldRecieveDiscount = false
end
if shouldRecieveDiscount then
local discount = Config.EmergencyServicesDiscount['discount']
if discount > 100 then
discount = 100
else
if discount <= 0 then discount = 0 end
end
if discount ~= 0 then
if discount == 100 then
FuelPrice = 0
if Config.FuelDebug then
print("Your discount for Emergency Services is set @ "..discount.."% so fuel is free!")
end
else
discount = discount / 100
FuelPrice = FuelPrice - (FuelPrice*discount)
if Config.FuelDebug then
print("Your discount for Emergency Services is set @ "..discount.."%. Setting new price to: $"..FuelPrice)
end
end
else
if Config.FuelDebug then
print("Your discount for Emergency Services is set @ "..discount.."%. It cannot be 0 or < 0!")
end
end
end
end
local cost = amount * FuelPrice
local tax = GlobalTax(cost)
local total = math.ceil(cost + tax)
local success = exports['qb-phone']:PhoneNotification(Lang:t("electric_phone_header"), Lang:t("electric_phone_notification")..total, 'fas fa-bolt', '#9f0e63', "NONE", 'fas fa-check-circle', 'fas fa-times-circle')
if success then
if QBCore.Functions.GetPlayerData().money['bank'] <= (GlobalTax(amount) + amount) then
QBCore.Functions.Notify(Lang:t("not_enough_money_in_bank"), "error")
else
TriggerServerEvent('cdn-fuel:server:PayForFuel', total, "bank", FuelPrice, true)
RefuelPossible = true
RefuelPossibleAmount = amount
RefuelPurchaseType = "bank"
RefuelCancelled = false
end
end
end)
end
-- Threads
if Config.ElectricChargerModel then
CreateThread(function()
RequestModel('electric_charger')
while not HasModelLoaded('electric_charger') do
Wait(50)
end
if Config.FuelDebug then
print("Electric Charger Model Loaded!")
end
for i = 1, #Config.GasStations do
if Config.GasStations[i].electricchargercoords ~= nil then
if Config.FuelDebug then print(i) end
local heading = Config.GasStations[i].electricchargercoords[4] - 180
Config.GasStations[i].electriccharger = CreateObject('electric_charger', Config.GasStations[i].electricchargercoords.x, Config.GasStations[i].electricchargercoords.y, Config.GasStations[i].electricchargercoords.z, false, true, true)
if Config.FuelDebug then print("Created Electric Charger @ Location #"..i) end
SetEntityHeading(Config.GasStations[i].electriccharger, heading)
FreezeEntityPosition(Config.GasStations[i].electriccharger, 1)
end
end
end)
end
-- Resource Stop
AddEventHandler('onResourceStop', function(resource)
if resource == GetCurrentResourceName() then
for i = 1, #Config.GasStations do
if Config.GasStations[i].electricchargercoords ~= nil then
DeleteEntity(Config.GasStations[i].electriccharger)
if IsHoldingElectricNozzle() then DeleteEntity(ElectricNozzle) end
end
end
if Config.PumpHose then
RopeUnloadTextures()
DeleteObject(Rope)
end
end
end)
-- Target
local TargetResource = Config.TargetResource
if Config.TargetResource == 'ox_target' then
TargetResource = 'qb-target'
end
exports[TargetResource]:AddTargetModel('electric_charger', {
options = {
{
num = 1,
type = "client",
event = "cdn-fuel:client:grabelectricnozzle",
icon = "fas fa-bolt",
label = Lang:t("grab_electric_nozzle"),
canInteract = function()
if not IsHoldingElectricNozzle() and not IsPedInAnyVehicle(PlayerPedId()) then
return true
end
end
},
{
num = 2,
type = "client",
event = "cdn-fuel:client:returnnozzle",
icon = "fas fa-hand",
label = Lang:t("return_nozzle"),
canInteract = function()
if IsHoldingElectricNozzle() and not refueling then
return true
end
end
},
},
distance = 2.0
})
end