1
0
Fork 0
forked from Simnation/Main

lc_fuel update

This commit is contained in:
Nordi98 2025-06-17 17:17:59 +02:00
parent e9335eaf78
commit cae0aa5e6a
28 changed files with 6064 additions and 5968 deletions

View file

@ -1,16 +1,16 @@
# LC_Fuel - FiveM # LC_Fuel - FiveM
## About ## About
A fuel system that adds realism and depth to vehicle management. Whether your players drive gas-powered cars, diesel, or electric vehicles, this script ensures an immersive refueling experience. A fuel system that adds realism and depth to vehicle management. Whether your players drive gas-powered cars, diesel, or electric vehicles, this script ensures an immersive refueling experience.
## Installation ## Installation
Install steps available on our docs: [Installation - LC Fuel](https://docs.lixeirocharmoso.com/lc_fuel/installation) Install steps available on our docs: [Installation - LC Fuel](https://docs.lixeirocharmoso.com/lc_fuel/installation)
## Exports ## Exports
Exports available in our docs: [Exports - LC Fuel](https://docs.lixeirocharmoso.com/lc_fuel/exports) Exports available in our docs: [Exports - LC Fuel](https://docs.lixeirocharmoso.com/lc_fuel/exports)
## Our links ## Our links
- Discord: [https://discord.gg/U5YDgbh](https://discord.gg/U5YDgbh) - Discord: [https://discord.gg/U5YDgbh](https://discord.gg/U5YDgbh)
- Tebex: [https://lixeirocharmoso.tebex.io](https://lixeirocharmoso.tebex.io) - Tebex: [https://lixeirocharmoso.tebex.io](https://lixeirocharmoso.tebex.io)
- Docs: [https://docs.lixeirocharmoso.com](https://docs.lixeirocharmoso.com/lc_fuel) - Docs: [https://docs.lixeirocharmoso.com](https://docs.lixeirocharmoso.com/lc_fuel)
- Showcase: [https://youtu.be/M6__IeCwxH8](https://youtu.be/M6__IeCwxH8) - Showcase: [https://youtu.be/M6__IeCwxH8](https://youtu.be/M6__IeCwxH8)

File diff suppressed because it is too large Load diff

View file

@ -1,153 +1,153 @@
-- Do not load anything here if electric is disabled -- Do not load anything here if electric is disabled
if not Config.Electric.enabled then if not Config.Electric.enabled then
return return
end end
local electricChargers = {} local electricChargers = {}
----------------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------------------------------------------------
-- Threads -- Threads
----------------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------------------------------------------------
-- Create sphere zones for each station, hooking up onEnter/onExit -- Create sphere zones for each station, hooking up onEnter/onExit
function createElectricZones() function createElectricZones()
assert(Utils.Zones, "You are using an outdated version of lc_utils. Please update your 'lc_utils' script to the latest version: https://github.com/LeonardoSoares98/lc_utils/releases/latest/download/lc_utils.zip") assert(Utils.Zones, "You are using an outdated version of lc_utils. Please update your 'lc_utils' script to the latest version: https://github.com/LeonardoSoares98/lc_utils/releases/latest/download/lc_utils.zip")
local stations = groupChargersByStation() local stations = groupChargersByStation()
for _, station in pairs(stations) do for _, station in pairs(stations) do
Utils.Zones.createZone({ Utils.Zones.createZone({
coords = station.center, coords = station.center,
radius = 50.0, radius = 50.0,
onEnter = function() onEnter = function()
for _, charger in pairs(station.chargers) do for _, charger in pairs(station.chargers) do
loadElectricCharger(charger) loadElectricCharger(charger)
end end
end, end,
onExit = function() onExit = function()
for _, charger in pairs(station.chargers) do for _, charger in pairs(station.chargers) do
unloadElectricCharger(charger) unloadElectricCharger(charger)
end end
end end
}) })
end end
end end
-- Thread to detect near electric chargers -- Thread to detect near electric chargers
function createElectricMarkersThread() function createElectricMarkersThread()
CreateThread(function() CreateThread(function()
while true do while true do
local ped = PlayerPedId() local ped = PlayerPedId()
local playerCoords = GetEntityCoords(ped) local playerCoords = GetEntityCoords(ped)
local pump, pumpModel = GetClosestPump(playerCoords, true) local pump, pumpModel = GetClosestPump(playerCoords, true)
while pump and pump > 0 and #(playerCoords - GetEntityCoords(pump)) < 2.0 do while pump and pump > 0 and #(playerCoords - GetEntityCoords(pump)) < 2.0 do
playerCoords = GetEntityCoords(ped) playerCoords = GetEntityCoords(ped)
if not mainUiOpen and not DoesEntityExist(fuelNozzle) then if not mainUiOpen and not DoesEntityExist(fuelNozzle) then
Utils.Markers.showHelpNotification(cachedTranslations.open_recharge, true) Utils.Markers.showHelpNotification(cachedTranslations.open_recharge, true)
if IsControlJustPressed(0,38) then if IsControlJustPressed(0,38) then
clientOpenUI(pump, pumpModel, true) clientOpenUI(pump, pumpModel, true)
end end
end end
Wait(2) Wait(2)
end end
Wait(1000) Wait(1000)
end end
end) end)
end end
function createElectricTargetsThread() function createElectricTargetsThread()
local pumpModels = {} -- This will be the final list without duplicates local pumpModels = {} -- This will be the final list without duplicates
local seenModels = {} -- This acts as a set to track unique values local seenModels = {} -- This acts as a set to track unique values
for _, chargerData in pairs(Config.Electric.chargersLocation) do for _, chargerData in pairs(Config.Electric.chargersLocation) do
local model = chargerData.prop local model = chargerData.prop
if not seenModels[model] then if not seenModels[model] then
seenModels[model] = true -- Mark model as seen seenModels[model] = true -- Mark model as seen
table.insert(pumpModels, model) -- Insert only if it's not a duplicate table.insert(pumpModels, model) -- Insert only if it's not a duplicate
end end
end end
-- Pass unique models to the target creation function -- Pass unique models to the target creation function
Utils.Target.createTargetForModel(pumpModels, openElectricUICallback, Utils.translate('target.open_recharge'), "fas fa-plug", "#00a413",nil,nil,canOpenPumpUiTargetCallback) Utils.Target.createTargetForModel(pumpModels, openElectricUICallback, Utils.translate('target.open_recharge'), "fas fa-plug", "#00a413",nil,nil,canOpenPumpUiTargetCallback)
Utils.Target.createTargetForModel(pumpModels,returnNozzle,Utils.translate('target.return_nozzle'),"fas fa-plug","#a42100",nil,nil,canReturnNozzleTargetCallback) Utils.Target.createTargetForModel(pumpModels,returnNozzle,Utils.translate('target.return_nozzle'),"fas fa-plug","#a42100",nil,nil,canReturnNozzleTargetCallback)
end end
function openElectricUICallback() function openElectricUICallback()
local ped = PlayerPedId() local ped = PlayerPedId()
local playerCoords = GetEntityCoords(ped) local playerCoords = GetEntityCoords(ped)
local pump, pumpModel = GetClosestPump(playerCoords, true) local pump, pumpModel = GetClosestPump(playerCoords, true)
if pump then if pump then
clientOpenUI(pump, pumpModel, true) clientOpenUI(pump, pumpModel, true)
else else
exports['lc_utils']:notify("error", Utils.translate("pump_not_found")) exports['lc_utils']:notify("error", Utils.translate("pump_not_found"))
end end
end end
----------------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------------------------------------------------
-- Utils -- Utils
----------------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------------------------------------------------
function loadElectricCharger(chargerData) function loadElectricCharger(chargerData)
if not electricChargers[chargerData.location] then if not electricChargers[chargerData.location] then
RequestModel(chargerData.prop) RequestModel(chargerData.prop)
while not HasModelLoaded(chargerData.prop) do while not HasModelLoaded(chargerData.prop) do
Wait(10) Wait(10)
end end
local heading = chargerData.location.w + 180.0 local heading = chargerData.location.w + 180.0
local electricCharger = CreateObject(chargerData.prop, chargerData.location.x, chargerData.location.y, chargerData.location.z, false, true, true) local electricCharger = CreateObject(chargerData.prop, chargerData.location.x, chargerData.location.y, chargerData.location.z, false, true, true)
SetEntityHeading(electricCharger, heading) SetEntityHeading(electricCharger, heading)
FreezeEntityPosition(electricCharger, true) FreezeEntityPosition(electricCharger, true)
electricChargers[chargerData.location] = electricCharger electricChargers[chargerData.location] = electricCharger
end end
end end
function unloadElectricCharger(chargerData) function unloadElectricCharger(chargerData)
local charger = electricChargers[chargerData.location] local charger = electricChargers[chargerData.location]
if charger and DoesEntityExist(charger) then if charger and DoesEntityExist(charger) then
DeleteEntity(charger) DeleteEntity(charger)
electricChargers[chargerData.location] = nil electricChargers[chargerData.location] = nil
end end
end end
-- Utility to group chargers by their station -- Utility to group chargers by their station
function groupChargersByStation() function groupChargersByStation()
local stations = {} local stations = {}
for _, charger in pairs(Config.Electric.chargersLocation) do for _, charger in pairs(Config.Electric.chargersLocation) do
local assigned = false local assigned = false
for _, station in pairs(stations) do for _, station in pairs(stations) do
local dist = #(station.center - vector3(charger.location.x, charger.location.y, charger.location.z)) local dist = #(station.center - vector3(charger.location.x, charger.location.y, charger.location.z))
if dist < 20.0 then if dist < 20.0 then
table.insert(station.chargers, charger) table.insert(station.chargers, charger)
station.center = (station.center + vector3(charger.location.x, charger.location.y, charger.location.z)) / 2 station.center = (station.center + vector3(charger.location.x, charger.location.y, charger.location.z)) / 2
assigned = true assigned = true
break break
end end
end end
if not assigned then if not assigned then
table.insert(stations, { table.insert(stations, {
center = vector3(charger.location.x, charger.location.y, charger.location.z), center = vector3(charger.location.x, charger.location.y, charger.location.z),
chargers = { charger } chargers = { charger }
}) })
end end
end end
return stations return stations
end end
AddEventHandler('onResourceStop', function(resourceName) AddEventHandler('onResourceStop', function(resourceName)
if GetCurrentResourceName() ~= resourceName then return end if GetCurrentResourceName() ~= resourceName then return end
deleteAllElectricChargers() deleteAllElectricChargers()
end) end)
function deleteAllElectricChargers() function deleteAllElectricChargers()
for _, charger in pairs(electricChargers) do for _, charger in pairs(electricChargers) do
if DoesEntityExist(charger) then if DoesEntityExist(charger) then
DeleteEntity(charger) DeleteEntity(charger)
end end
end end
electricChargers = {} electricChargers = {}
end end

View file

@ -1,77 +1,77 @@
----------------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------------------------------------------------
-- Fuel consumption chart -- Fuel consumption chart
----------------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------------------------------------------------
if Config.FuelConsumptionChart.enabled then if Config.FuelConsumptionChart.enabled then
RegisterCommand(Config.FuelConsumptionChart.command,function(source) RegisterCommand(Config.FuelConsumptionChart.command,function(source)
toggleFuelConsumptionChart() toggleFuelConsumptionChart()
end, false) end, false)
RegisterCommand("fuel_focus", function() RegisterCommand("fuel_focus", function()
if isFuelConsumptionChartOpen then if isFuelConsumptionChartOpen then
SetNuiFocus(true,true) SetNuiFocus(true,true)
end end
end, false) end, false)
RegisterKeyMapping( RegisterKeyMapping(
"fuel_focus", -- command triggered by key "fuel_focus", -- command triggered by key
"Focus Fuel Chart UI", -- description in keybindings "Focus Fuel Chart UI", -- description in keybindings
"keyboard", "keyboard",
Config.FuelConsumptionChart.focusShortcut Config.FuelConsumptionChart.focusShortcut
) )
function toggleFuelConsumptionChart() function toggleFuelConsumptionChart()
loadNuiVariables() loadNuiVariables()
if isFuelConsumptionChartOpen then if isFuelConsumptionChartOpen then
closeFuelConsumptionChartUI() closeFuelConsumptionChartUI()
else else
local ped = PlayerPedId() local ped = PlayerPedId()
if not IsPedInAnyVehicle(ped, false) then if not IsPedInAnyVehicle(ped, false) then
exports['lc_utils']:notify("error",Utils.translate("vehicle_not_found")) exports['lc_utils']:notify("error",Utils.translate("vehicle_not_found"))
return return
end end
local vehicle = GetVehiclePedIsIn(ped, false) local vehicle = GetVehiclePedIsIn(ped, false)
if GetPedInVehicleSeat(vehicle, -1) ~= ped or IsVehicleBlacklisted(vehicle) then if GetPedInVehicleSeat(vehicle, -1) ~= ped or IsVehicleBlacklisted(vehicle) then
exports['lc_utils']:notify("error",Utils.translate("vehicle_not_found")) exports['lc_utils']:notify("error",Utils.translate("vehicle_not_found"))
return return
end end
SendNUIMessage({ SendNUIMessage({
showFuelConsumptionChart = true, showFuelConsumptionChart = true,
isRecording = isRecording, isRecording = isRecording,
position = Config.FuelConsumptionChart.position, position = Config.FuelConsumptionChart.position,
focusShortcut = Config.FuelConsumptionChart.focusShortcut, focusShortcut = Config.FuelConsumptionChart.focusShortcut,
}) })
isFuelConsumptionChartOpen = true isFuelConsumptionChartOpen = true
end end
end end
function updateFuelConsumptionChart(fuelConsumptionData) function updateFuelConsumptionChart(fuelConsumptionData)
SendNUIMessage({ SendNUIMessage({
updateFuelConsumptionChart = true, updateFuelConsumptionChart = true,
fuelConsumptionData = fuelConsumptionData, fuelConsumptionData = fuelConsumptionData,
}) })
end end
function closeFuelConsumptionChartUI() function closeFuelConsumptionChartUI()
SendNUIMessage({ SendNUIMessage({
hideFuelConsumptionChart = true, hideFuelConsumptionChart = true,
}) })
isFuelConsumptionChartOpen = false isFuelConsumptionChartOpen = false
SetNuiFocus(false,false) SetNuiFocus(false,false)
end end
function storeDataForChart(vehicle, newFuelLevel, currentConsumption) function storeDataForChart(vehicle, newFuelLevel, currentConsumption)
if not isRecording then if not isRecording then
updateFuelConsumptionChart({ fuel = nil, speed = nil, consumption = nil }) updateFuelConsumptionChart({ fuel = nil, speed = nil, consumption = nil })
return return
end end
local speed = GetEntitySpeed(vehicle) * 3.6 local speed = GetEntitySpeed(vehicle) * 3.6
if isFuelConsumptionChartOpen then if isFuelConsumptionChartOpen then
updateFuelConsumptionChart({ fuel = newFuelLevel, speed = speed, consumption = currentConsumption }) updateFuelConsumptionChart({ fuel = newFuelLevel, speed = speed, consumption = currentConsumption })
end end
end end
end end

View file

@ -0,0 +1,10 @@
RegisterCommand(Config.FuelTypeCommand, function()
local vehicle = GetVehiclePedIsIn(PlayerPedId(), false)
if not DoesEntityExist(vehicle) then
exports['lc_utils']:notify("error", Utils.translate("vehicle_not_found"))
return
end
local fuelType = getVehicleFuelTypeFromServer(vehicle)
exports['lc_utils']:notify("info", Utils.translate("fuel_types.type_title"):format(Utils.translate("fuel_types."..fuelType)))
end, false)

View file

@ -1,140 +1,140 @@
local customGasPumps = {} local customGasPumps = {}
----------------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------------------------------------------------
-- Threads -- Threads
----------------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------------------------------------------------
-- Thread to detect near fuel pumps -- Thread to detect near fuel pumps
function createGasMarkersThread() function createGasMarkersThread()
CreateThread(function() CreateThread(function()
while true do while true do
local ped = PlayerPedId() local ped = PlayerPedId()
local playerCoords = GetEntityCoords(ped) local playerCoords = GetEntityCoords(ped)
local pump, pumpModel = GetClosestPump(playerCoords, false) local pump, pumpModel = GetClosestPump(playerCoords, false)
while pump and pump > 0 and #(playerCoords - GetEntityCoords(pump)) < 2.0 do while pump and pump > 0 and #(playerCoords - GetEntityCoords(pump)) < 2.0 do
playerCoords = GetEntityCoords(ped) playerCoords = GetEntityCoords(ped)
if not mainUiOpen and not DoesEntityExist(fuelNozzle) then if not mainUiOpen and not DoesEntityExist(fuelNozzle) then
Utils.Markers.showHelpNotification(cachedTranslations.open_refuel, true) Utils.Markers.showHelpNotification(cachedTranslations.open_refuel, true)
if IsControlJustPressed(0,38) then if IsControlJustPressed(0,38) then
clientOpenUI(pump, pumpModel, false) clientOpenUI(pump, pumpModel, false)
end end
end end
Wait(2) Wait(2)
end end
Wait(1000) Wait(1000)
end end
end) end)
end end
function createGasTargetsThread() function createGasTargetsThread()
local pumpModels = {} local pumpModels = {}
for _, v in pairs(Config.GasPumpProps) do for _, v in pairs(Config.GasPumpProps) do
table.insert(pumpModels, v.prop) table.insert(pumpModels, v.prop)
end end
Utils.Target.createTargetForModel(pumpModels,openFuelUICallback,Utils.translate('target.open_refuel'),"fas fa-gas-pump","#a42100",nil,nil,canOpenPumpUiTargetCallback) Utils.Target.createTargetForModel(pumpModels,openFuelUICallback,Utils.translate('target.open_refuel'),"fas fa-gas-pump","#a42100",nil,nil,canOpenPumpUiTargetCallback)
Utils.Target.createTargetForModel(pumpModels,returnNozzle,Utils.translate('target.return_nozzle'),"fas fa-gas-pump","#a42100",nil,nil,canReturnNozzleTargetCallback) Utils.Target.createTargetForModel(pumpModels,returnNozzle,Utils.translate('target.return_nozzle'),"fas fa-gas-pump","#a42100",nil,nil,canReturnNozzleTargetCallback)
end end
function openFuelUICallback() function openFuelUICallback()
local ped = PlayerPedId() local ped = PlayerPedId()
local playerCoords = GetEntityCoords(ped) local playerCoords = GetEntityCoords(ped)
local pump, pumpModel = GetClosestPump(playerCoords, false) local pump, pumpModel = GetClosestPump(playerCoords, false)
if pump then if pump then
clientOpenUI(pump, pumpModel, false) clientOpenUI(pump, pumpModel, false)
else else
exports['lc_utils']:notify("error", Utils.translate("pump_not_found")) exports['lc_utils']:notify("error", Utils.translate("pump_not_found"))
end end
end end
function createCustomPumpModelsThread() function createCustomPumpModelsThread()
for _, pumpConfig in pairs(Config.CustomGasPumpLocations) do for _, pumpConfig in pairs(Config.CustomGasPumpLocations) do
RequestModel(pumpConfig.prop) RequestModel(pumpConfig.prop)
while not HasModelLoaded(pumpConfig.prop) do while not HasModelLoaded(pumpConfig.prop) do
Wait(50) Wait(50)
end end
local heading = pumpConfig.location.w + 180.0 local heading = pumpConfig.location.w + 180.0
local gasPump = CreateObject(pumpConfig.prop, pumpConfig.location.x, pumpConfig.location.y, pumpConfig.location.z, false, true, true) local gasPump = CreateObject(pumpConfig.prop, pumpConfig.location.x, pumpConfig.location.y, pumpConfig.location.z, false, true, true)
SetEntityHeading(gasPump, heading) SetEntityHeading(gasPump, heading)
FreezeEntityPosition(gasPump, true) FreezeEntityPosition(gasPump, true)
table.insert(customGasPumps, gasPump) table.insert(customGasPumps, gasPump)
end end
end end
AddEventHandler('onResourceStop', function(resourceName) AddEventHandler('onResourceStop', function(resourceName)
if GetCurrentResourceName() ~= resourceName then return end if GetCurrentResourceName() ~= resourceName then return end
deleteAllCustomGasPumps() deleteAllCustomGasPumps()
end) end)
function deleteAllCustomGasPumps() function deleteAllCustomGasPumps()
for k, v in ipairs(customGasPumps) do for k, v in ipairs(customGasPumps) do
DeleteEntity(v) DeleteEntity(v)
end end
end end
----------------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------------------------------------------------
-- Jerry Cans -- Jerry Cans
----------------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------------------------------------------------
-- Thread to handle the fuel consumption -- Thread to handle the fuel consumption
function createJerryCanThread() function createJerryCanThread()
CreateThread(function() CreateThread(function()
while true do while true do
Wait(1000) Wait(1000)
local ped = PlayerPedId() local ped = PlayerPedId()
if not IsPedInAnyVehicle(ped, false) and GetSelectedPedWeapon(ped) == JERRY_CAN_HASH then if not IsPedInAnyVehicle(ped, false) and GetSelectedPedWeapon(ped) == JERRY_CAN_HASH then
refuelLoop(true) refuelLoop(true)
end end
end end
end) end)
end end
-- Code to save jerry can ammo in any inventory -- Code to save jerry can ammo in any inventory
local currentWeaponData local currentWeaponData
function updateWeaponAmmo(ammo) function updateWeaponAmmo(ammo)
ammo = math.floor(ammo) -- This is needed or some inventories will break ammo = math.floor(ammo) -- This is needed or some inventories will break
if currentWeaponData and currentWeaponData.info and currentWeaponData.info.ammo then if currentWeaponData and currentWeaponData.info and currentWeaponData.info.ammo then
currentWeaponData.info.ammo = ammo currentWeaponData.info.ammo = ammo
end end
TriggerServerEvent('ox_inventory:updateWeapon', "ammo", ammo) TriggerServerEvent('ox_inventory:updateWeapon', "ammo", ammo)
TriggerServerEvent("weapons:server:UpdateWeaponAmmo", currentWeaponData, ammo) TriggerServerEvent("weapons:server:UpdateWeaponAmmo", currentWeaponData, ammo)
TriggerServerEvent("qb-weapons:server:UpdateWeaponAmmo", currentWeaponData, ammo) TriggerServerEvent("qb-weapons:server:UpdateWeaponAmmo", currentWeaponData, ammo)
if Config.Debug then print("updateWeaponAmmo:ammo",ammo) end if Config.Debug then print("updateWeaponAmmo:ammo",ammo) end
if Config.Debug then Utils.Debug.printTable("updateWeaponAmmo:currentWeaponData",currentWeaponData) end if Config.Debug then Utils.Debug.printTable("updateWeaponAmmo:currentWeaponData",currentWeaponData) end
local ped = PlayerPedId() local ped = PlayerPedId()
SetPedAmmo(ped, JERRY_CAN_HASH, ammo) SetPedAmmo(ped, JERRY_CAN_HASH, ammo)
end end
AddEventHandler('weapons:client:SetCurrentWeapon', function(data, bool) AddEventHandler('weapons:client:SetCurrentWeapon', function(data, bool)
if bool ~= false then if bool ~= false then
currentWeaponData = data currentWeaponData = data
else else
currentWeaponData = {} currentWeaponData = {}
end end
end) end)
AddEventHandler('qb-weapons:client:SetCurrentWeapon', function(data, bool) AddEventHandler('qb-weapons:client:SetCurrentWeapon', function(data, bool)
if bool ~= false then if bool ~= false then
currentWeaponData = data currentWeaponData = data
else else
currentWeaponData = {} currentWeaponData = {}
end end
end) end)
-- Get jerry can ammo by metadata -- Get jerry can ammo by metadata
function getJerryCanAmmo() function getJerryCanAmmo()
if currentWeaponData and currentWeaponData.info and currentWeaponData.info.ammo then if currentWeaponData and currentWeaponData.info and currentWeaponData.info.ammo then
if Config.Debug then print("getJerryCanAmmo:currentWeaponData.info.ammo", currentWeaponData.info.ammo) end if Config.Debug then print("getJerryCanAmmo:currentWeaponData.info.ammo", currentWeaponData.info.ammo) end
return currentWeaponData.info.ammo return currentWeaponData.info.ammo
end end
local ped = PlayerPedId() local ped = PlayerPedId()
if Config.Debug then print("getJerryCanAmmo:GetAmmoInPedWeapon", GetAmmoInPedWeapon(ped, JERRY_CAN_HASH)) end if Config.Debug then print("getJerryCanAmmo:GetAmmoInPedWeapon", GetAmmoInPedWeapon(ped, JERRY_CAN_HASH)) end
return GetAmmoInPedWeapon(ped, JERRY_CAN_HASH) return GetAmmoInPedWeapon(ped, JERRY_CAN_HASH)
end end

View file

@ -1,477 +1,497 @@
local refuelingThread = nil local refuelingThread = nil
local isRefuelling = false local isRefuelling = false
local inCooldown = false local inCooldown = false
local vehicleAttachedToNozzle = nil local vehicleAttachedToNozzle = nil
local remainingFuelToRefuel = 0 local remainingFuelToRefuel = 0
local currentFuelTypePurchased = nil local currentFuelTypePurchased = nil
local distanceToCap, distanceToPump = math.maxinteger, math.maxinteger local distanceToCap, distanceToPump = math.maxinteger, math.maxinteger
local litersDeductedEachTick = 0.5 local litersDeductedEachTick = 0.5
----------------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------------------------------------------------
-- Refuelling -- Refuelling
----------------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------------------------------------------------
RegisterNetEvent('lc_fuel:getPumpNozzle') RegisterNetEvent('lc_fuel:getPumpNozzle')
AddEventHandler('lc_fuel:getPumpNozzle', function(fuelAmountPurchased, fuelTypePurchased) AddEventHandler('lc_fuel:getPumpNozzle', function(fuelAmountPurchased, fuelTypePurchased)
closeUI() closeUI()
if DoesEntityExist(fuelNozzle) then return end if DoesEntityExist(fuelNozzle) then return end
if not currentPump then return end if not currentPump then return end
local ped = PlayerPedId() local ped = PlayerPedId()
local pumpCoords = GetEntityCoords(currentPump) local pumpCoords = GetEntityCoords(currentPump)
-- Animate the ped to grab the nozzle -- Animate the ped to grab the nozzle
Utils.Animations.loadAnimDict("anim@am_hold_up@male") Utils.Animations.loadAnimDict("anim@am_hold_up@male")
TaskPlayAnim(ped, "anim@am_hold_up@male", "shoplift_high", 2.0, 8.0, -1, 50, 0, false, false, false) TaskPlayAnim(ped, "anim@am_hold_up@male", "shoplift_high", 2.0, 8.0, -1, 50, 0, false, false, false)
Wait(300) Wait(300)
StopAnimTask(ped, "anim@am_hold_up@male", "shoplift_high", 1.0) StopAnimTask(ped, "anim@am_hold_up@male", "shoplift_high", 1.0)
-- Spawn the nozzle -- Spawn the nozzle
fuelNozzle = createFuelNozzleObject(fuelTypePurchased) fuelNozzle = createFuelNozzleObject(fuelTypePurchased)
-- Attach the nozzle -- Attach the nozzle
attachNozzleToPed() attachNozzleToPed()
if Config.EnablePumpRope then if Config.EnablePumpRope then
fuelRope = CreateRopeToPump(pumpCoords) fuelRope = CreateRopeToPump(pumpCoords)
end end
-- Get the max distance the player can go with the nozzle -- Get the max distance the player can go with the nozzle
local ropeLength = getNearestPumpRopeLength(fuelTypePurchased, pumpCoords) local ropeLength = getNearestPumpRopeLength(fuelTypePurchased, pumpCoords)
-- Thread to handle fuel nozzle -- Thread to handle fuel nozzle
CreateThread(function() CreateThread(function()
while DoesEntityExist(fuelNozzle) do while DoesEntityExist(fuelNozzle) do
local waitTime = 500 local waitTime = 500
local nozzleCoords = GetEntityCoords(fuelNozzle) -- Conside the nozzle position, not the ped local nozzleCoords = GetEntityCoords(fuelNozzle) -- Conside the nozzle position, not the ped
distanceToPump = #(pumpCoords - nozzleCoords) distanceToPump = #(pumpCoords - nozzleCoords)
-- If player reach the distance limit delete the nozzle -- If player reach the distance limit delete the nozzle
if distanceToPump > ropeLength then if distanceToPump > ropeLength then
exports['lc_utils']:notify("error", Utils.translate("too_far_away")) exports['lc_utils']:notify("error", Utils.translate("too_far_away"))
deleteRopeAndNozzleProp() deleteRopeAndNozzleProp()
end end
-- If player is near the distance limit, show a notification to him -- If player is near the distance limit, show a notification to him
if distanceToPump > (ropeLength * 0.7) then if distanceToPump > (ropeLength * 0.7) then
Utils.Markers.showHelpNotification(Utils.translate("too_far_away"), true) Utils.Markers.showHelpNotification(Utils.translate("too_far_away"), true)
end end
-- Check if ped entered a vehicle -- Check if ped entered a vehicle
if IsPedSittingInAnyVehicle(ped) then if IsPedSittingInAnyVehicle(ped) then
-- Gives him 2 seconds to leave before clearing the nozzle -- Gives him 2 seconds to leave before clearing the nozzle
SetTimeout(2000,function() SetTimeout(2000,function()
if IsPedSittingInAnyVehicle(ped) and DoesEntityExist(fuelNozzle) then if IsPedSittingInAnyVehicle(ped) and DoesEntityExist(fuelNozzle) then
exports['lc_utils']:notify("error", Utils.translate("too_far_away")) exports['lc_utils']:notify("error", Utils.translate("too_far_away"))
deleteRopeAndNozzleProp() deleteRopeAndNozzleProp()
end end
end) end)
end end
if Utils.Config.custom_scripts_compatibility.target == "disabled" and distanceToPump < 1.5 then if Utils.Config.custom_scripts_compatibility.target == "disabled" and distanceToPump < 1.5 then
waitTime = 2 waitTime = 2
Utils.Markers.showHelpNotification(cachedTranslations.return_nozzle, true) Utils.Markers.showHelpNotification(cachedTranslations.return_nozzle, true)
if IsControlJustPressed(0,38) then if IsControlJustPressed(0,38) then
-- See which one the player is nearer. The fuel cap or fuel pump -- See which one the player is nearer. The fuel cap or fuel pump
if distanceToPump < distanceToCap then if distanceToPump < distanceToCap then
-- Avoid player press E to return nozzle and press E to refuel in same tick, so it gives preference to refuel -- Avoid player press E to return nozzle and press E to refuel in same tick, so it gives preference to refuel
Wait(100) Wait(100)
returnNozzle() returnNozzle()
end end
end end
end end
Wait(waitTime) Wait(waitTime)
end end
-- Not near the pump anymore -- Not near the pump anymore
distanceToPump = math.maxinteger distanceToPump = math.maxinteger
end) end)
-- Thread to refuel the vehicle -- Thread to refuel the vehicle
CreateThread(function() CreateThread(function()
-- Set the fuel purchased in a global variable -- Set the fuel purchased in a global variable
remainingFuelToRefuel = fuelAmountPurchased remainingFuelToRefuel = fuelAmountPurchased
-- Set the fuel type in a global variable -- Set the fuel type in a global variable
currentFuelTypePurchased = fuelTypePurchased currentFuelTypePurchased = fuelTypePurchased
-- Trigger the function to allow refuel on markers -- Trigger the function to allow refuel on markers
if Utils.Config.custom_scripts_compatibility.target == "disabled" then if Utils.Config.custom_scripts_compatibility.target == "disabled" then
refuelLoop(false) refuelLoop(false)
end end
-- Not near the fuel cap anymore -- Not near the fuel cap anymore
distanceToCap = math.maxinteger distanceToCap = math.maxinteger
end) end)
end) end)
function returnNozzle() function returnNozzle()
local ped = PlayerPedId() local ped = PlayerPedId()
if not isRefuelling then if not isRefuelling then
Utils.Animations.loadAnimDict("anim@am_hold_up@male") Utils.Animations.loadAnimDict("anim@am_hold_up@male")
TaskPlayAnim(ped, "anim@am_hold_up@male", "shoplift_high", 2.0, 8.0, -1, 50, 0, false, false, false) TaskPlayAnim(ped, "anim@am_hold_up@male", "shoplift_high", 2.0, 8.0, -1, 50, 0, false, false, false)
Wait(300) Wait(300)
StopAnimTask(ped, "anim@am_hold_up@male", "shoplift_high", 1.0) StopAnimTask(ped, "anim@am_hold_up@male", "shoplift_high", 1.0)
deleteRopeAndNozzleProp() deleteRopeAndNozzleProp()
if Config.ReturnNozzleRefund then if Config.ReturnNozzleRefund then
local isElectric = Utils.Table.contains({"electricnormal", "electricfast"}, currentFuelTypePurchased) local isElectric = Utils.Table.contains({"electricnormal", "electricfast"}, currentFuelTypePurchased)
TriggerServerEvent('lc_fuel:returnNozzle', remainingFuelToRefuel, isElectric) TriggerServerEvent('lc_fuel:returnNozzle', remainingFuelToRefuel, isElectric)
end end
end end
end end
function executeRefuelAction(isFromJerryCan, closestVehicle, closestCapPos, closestVehicleHash, customVehicleParameters) function executeRefuelAction(isFromJerryCan, closestVehicle, closestCapPos, closestVehicleHash, customVehicleParameters)
if Config.Debug then print("executeRefuelAction:p", isFromJerryCan, closestVehicle, closestCapPos, closestVehicleHash, customVehicleParameters) end if Config.Debug then print("executeRefuelAction:p", isFromJerryCan, closestVehicle, closestCapPos, closestVehicleHash, customVehicleParameters) end
local ped = PlayerPedId() local ped = PlayerPedId()
local refuelTick = Config.RefuelTick local refuelTick = Config.RefuelTick
local isElectric = false local isElectric = false
local fuelTypePurchased = currentFuelTypePurchased local fuelTypePurchased = currentFuelTypePurchased
-- Change the fuel tick if its electric charging -- Change the fuel tick if its electric charging
if fuelTypePurchased == "electricfast" then if fuelTypePurchased == "electricfast" then
isElectric = true isElectric = true
refuelTick = Config.Electric.chargeTypes.fast.time * 1000 / 2 -- Divide by 2 because each tick adds 0.5kWh. refuelTick = Config.Electric.chargeTypes.fast.time * 1000 / 2 -- Divide by 2 because each tick adds 0.5kWh.
end end
if fuelTypePurchased == "electricnormal" then if fuelTypePurchased == "electricnormal" then
isElectric = true isElectric = true
refuelTick = Config.Electric.chargeTypes.normal.time * 1000 / 2 refuelTick = Config.Electric.chargeTypes.normal.time * 1000 / 2
end end
local animationDuration = 1000 -- 1 sec local animationDuration = 1000 -- 1 sec
if isFromJerryCan then if isFromJerryCan then
animationDuration = -1 -- (infinite) Do not allow the player walk during refuel from jerry can animationDuration = -1 -- (infinite) Do not allow the player walk during refuel from jerry can
end end
-- Do not allow user mix electric and petrol fuel/vehicles -- Do not allow user mix electric and petrol fuel/vehicles
if (isElectric and Config.Electric.vehiclesListHash[closestVehicleHash]) or (not isElectric and not Config.Electric.vehiclesListHash[closestVehicleHash]) then if (isElectric and Config.Electric.vehiclesListHash[closestVehicleHash]) or (not isElectric and not Config.Electric.vehiclesListHash[closestVehicleHash]) then
if not isRefuelling and not vehicleAttachedToNozzle then if not isRefuelling and not vehicleAttachedToNozzle then
if remainingFuelToRefuel > 0 then if remainingFuelToRefuel > 0 then
-- Reset the vehicle fuel to 0 when refueling with a different fuel type -- Reset the vehicle fuel to 0 when refueling with a different fuel type
if not isFromJerryCan and not isElectric then if not isFromJerryCan and not isElectric then
local fuelType = getVehicleFuelTypeFromServer(closestVehicle) local fuelType = getVehicleFuelTypeFromServer(closestVehicle)
if fuelTypePurchased ~= fuelType then if fuelTypePurchased ~= fuelType then
changeVehicleFuelType(closestVehicle, fuelTypePurchased) changeVehicleFuelType(closestVehicle, fuelTypePurchased)
end end
end end
isRefuelling = true isRefuelling = true
-- Animate the ped -- Animate the ped
TaskTurnPedToFaceCoord(ped, closestCapPos.x, closestCapPos.y, closestCapPos.z, animationDuration) TaskTurnPedToFaceCoord(ped, closestCapPos.x, closestCapPos.y, closestCapPos.z, animationDuration)
Utils.Animations.loadAnimDict("weapons@misc@jerrycan@") Utils.Animations.loadAnimDict("weapons@misc@jerrycan@")
TaskPlayAnim(ped, "weapons@misc@jerrycan@", "fire", 2.0, 8.0, animationDuration, 50, 0, false, false, false) TaskPlayAnim(ped, "weapons@misc@jerrycan@", "fire", 2.0, 8.0, animationDuration, 50, 0, false, false, false)
-- Plug the nozzle in the car -- Plug the nozzle in the car
attachNozzleToVehicle(closestVehicle, customVehicleParameters) attachNozzleToVehicle(closestVehicle, customVehicleParameters)
-- Refuel the vehicle -- Refuel the vehicle
refuelingThread = CreateThread(function() refuelingThread = CreateThread(function()
local vehicleToRefuel = closestVehicle local vehicleToRefuel = closestVehicle
local startingFuel = GetFuel(vehicleToRefuel) -- Get vehicle fuel level local startingFuel = GetFuel(vehicleToRefuel) -- Get vehicle fuel level
local vehicleTankSize = getVehicleTankSize(vehicleToRefuel) local vehicleTankSize = getVehicleTankSize(vehicleToRefuel)
local currentFuel = startingFuel local currentFuel = startingFuel
-- Loop keep happening while the player has not canceled, while the fuelNozzle exists and while the ped still has jerry can in hands -- Loop keep happening while the player has not canceled, while the fuelNozzle exists and while the ped still has jerry can in hands
while isRefuelling and (DoesEntityExist(fuelNozzle) or (isFromJerryCan and GetSelectedPedWeapon(ped) == JERRY_CAN_HASH)) do while isRefuelling and (DoesEntityExist(fuelNozzle) or (isFromJerryCan and GetSelectedPedWeapon(ped) == JERRY_CAN_HASH)) do
currentFuel = GetFuel(vehicleToRefuel) currentFuel = GetFuel(vehicleToRefuel)
local percentageOfFuelToAdd = calculateFuelToAddPercentage(vehicleTankSize) -- Add 0.5L each tick, but the % is proportional to the vehicle tank local percentageOfFuelToAdd = calculateFuelToAddPercentage(vehicleTankSize) -- Add 0.5L each tick, but the % is proportional to the vehicle tank
if currentFuel + percentageOfFuelToAdd > 100 then if currentFuel + percentageOfFuelToAdd > 100 then
-- Increase the vehicle fuel level -- Increase the vehicle fuel level
percentageOfFuelToAdd = 100 - currentFuel percentageOfFuelToAdd = 100 - currentFuel
end end
if remainingFuelToRefuel < litersDeductedEachTick then if remainingFuelToRefuel < litersDeductedEachTick then
-- Break when the user has used all the fuel he paid for -- Break when the user has used all the fuel he paid for
break break
end end
if percentageOfFuelToAdd <= 0.01 then if percentageOfFuelToAdd <= 0.01 then
-- Break when the vehicle tank is full -- Break when the vehicle tank is full
exports['lc_utils']:notify("info", Utils.translate("vehicle_tank_full")) exports['lc_utils']:notify("info", Utils.translate("vehicle_tank_full"))
break break
end end
-- Decrease the purchased fuel amount and increase the vehicle fuel level -- Decrease the purchased fuel amount and increase the vehicle fuel level
remainingFuelToRefuel = remainingFuelToRefuel - litersDeductedEachTick remainingFuelToRefuel = remainingFuelToRefuel - litersDeductedEachTick
currentFuel = currentFuel + percentageOfFuelToAdd currentFuel = currentFuel + percentageOfFuelToAdd
SetFuel(vehicleToRefuel, currentFuel) SetFuel(vehicleToRefuel, currentFuel)
SendNUIMessage({ SendNUIMessage({
showRefuelDisplay = true, showRefuelDisplay = true,
remainingFuelAmount = remainingFuelToRefuel, remainingFuelAmount = remainingFuelToRefuel,
currentVehicleTankSize = vehicleTankSize, currentVehicleTankSize = vehicleTankSize,
currentDisplayFuelAmount = getVehicleDisplayFuelAmount(currentFuel, vehicleTankSize), currentDisplayFuelAmount = getVehicleDisplayFuelAmount(currentFuel, vehicleTankSize),
isElectric = isElectric, isElectric = isElectric,
fuelTypePurchased = fuelTypePurchased fuelTypePurchased = fuelTypePurchased
}) })
if Config.Debug then print("executeRefuelAction:remainingFuelToRefuel", remainingFuelToRefuel) end if Config.Debug then print("executeRefuelAction:remainingFuelToRefuel", remainingFuelToRefuel) end
Wait(refuelTick) Wait(refuelTick)
end end
if isFromJerryCan then if isFromJerryCan then
-- Update the jerry can ammo -- Update the jerry can ammo
SetPedAmmo(ped, JERRY_CAN_HASH, remainingFuelToRefuel) SetPedAmmo(ped, JERRY_CAN_HASH, remainingFuelToRefuel)
updateWeaponAmmo(remainingFuelToRefuel) updateWeaponAmmo(remainingFuelToRefuel)
vehicleAttachedToNozzle = nil vehicleAttachedToNozzle = nil
end end
if isElectric then if isElectric then
exports['lc_utils']:notify("success", Utils.translate("vehicle_recharged"):format(Utils.Math.round(getVehicleDisplayFuelAmount(currentFuel, vehicleTankSize) - getVehicleDisplayFuelAmount(startingFuel, vehicleTankSize), 1))) exports['lc_utils']:notify("success", Utils.translate("vehicle_recharged"):format(Utils.Math.round(getVehicleDisplayFuelAmount(currentFuel, vehicleTankSize) - getVehicleDisplayFuelAmount(startingFuel, vehicleTankSize), 1)))
else else
exports['lc_utils']:notify("success", Utils.translate("vehicle_refueled"):format(Utils.Math.round(getVehicleDisplayFuelAmount(currentFuel, vehicleTankSize) - getVehicleDisplayFuelAmount(startingFuel, vehicleTankSize), 1))) exports['lc_utils']:notify("success", Utils.translate("vehicle_refueled"):format(Utils.Math.round(getVehicleDisplayFuelAmount(currentFuel, vehicleTankSize) - getVehicleDisplayFuelAmount(startingFuel, vehicleTankSize), 1)))
end end
-- Stop refuelling -- Stop refuelling
stopRefuelAnimation() stopRefuelAnimation()
SendNUIMessage({ hideRefuelDisplay = true }) SendNUIMessage({ hideRefuelDisplay = true })
isRefuelling = false isRefuelling = false
end) end)
else else
exports['lc_utils']:notify("error", Utils.translate("not_enough_refuel")) exports['lc_utils']:notify("error", Utils.translate("not_enough_refuel"))
end end
else else
-- Terminate refuelling -- Terminate refuelling
stopRefuelAction() stopRefuelAction()
-- Cooldown to prevent the user to spam E and glitch things -- Cooldown to prevent the user to spam E and glitch things
inCooldown = true inCooldown = true
SetTimeout(refuelTick + 1,function() SetTimeout(refuelTick + 1,function()
inCooldown = false inCooldown = false
end) end)
end end
else else
exports['lc_utils']:notify("error", Utils.translate("incompatible_fuel")) exports['lc_utils']:notify("error", Utils.translate("incompatible_fuel"))
end end
end end
function calculateFuelToAddPercentage(totalVolumeLiters) function calculateFuelToAddPercentage(totalVolumeLiters)
local percentage = (litersDeductedEachTick / totalVolumeLiters) * 100 local percentage = (litersDeductedEachTick / totalVolumeLiters) * 100
return percentage return percentage
end end
----------------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------------------------------------------------
-- Markers -- Markers
----------------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------------------------------------------------
function refuelLoop(isFromJerryCan) function refuelLoop(isFromJerryCan)
-- Load variables to open te UI -- Load variables to open te UI
loadNuiVariables() loadNuiVariables()
local ped = PlayerPedId() local ped = PlayerPedId()
local closestCapPos local closestCapPos
local closestVehicle local closestVehicle
local customVehicleParameters local customVehicleParameters
local closestVehicleHash local closestVehicleHash
if isFromJerryCan then if isFromJerryCan then
remainingFuelToRefuel = getJerryCanAmmo() remainingFuelToRefuel = getJerryCanAmmo()
end end
isRefuelling = false isRefuelling = false
while DoesEntityExist(fuelNozzle) or (isFromJerryCan and GetSelectedPedWeapon(ped) == JERRY_CAN_HASH) do while DoesEntityExist(fuelNozzle) or (isFromJerryCan and GetSelectedPedWeapon(ped) == JERRY_CAN_HASH) do
local waitTime = 200 local waitTime = 200
if closestCapPos then if closestCapPos then
distanceToCap = #(GetEntityCoords(ped) - vector3(closestCapPos.x,closestCapPos.y,closestCapPos.z + customVehicleParameters.nozzleOffset.up + 0.0)) distanceToCap = #(GetEntityCoords(ped) - vector3(closestCapPos.x,closestCapPos.y,closestCapPos.z))
if distanceToCap < customVehicleParameters.distance + 0.0 and (not vehicleAttachedToNozzle or (vehicleAttachedToNozzle and DoesEntityExist(vehicleAttachedToNozzle) and vehicleAttachedToNozzle == closestVehicle)) then if distanceToCap < customVehicleParameters.distance + 0.0 and (not vehicleAttachedToNozzle or (vehicleAttachedToNozzle and DoesEntityExist(vehicleAttachedToNozzle) and vehicleAttachedToNozzle == closestVehicle)) then
waitTime = 1 waitTime = 1
Utils.Markers.drawText3D(closestCapPos.x,closestCapPos.y,closestCapPos.z + customVehicleParameters.nozzleOffset.up + 0.0, cachedTranslations.interact_with_vehicle) Utils.Markers.drawText3D(closestCapPos.x,closestCapPos.y,closestCapPos.z, cachedTranslations.interact_with_vehicle)
if IsControlJustPressed(0, 38) and not inCooldown then if IsControlJustPressed(0, 38) and not inCooldown then
-- See which one the player is nearer. The fuel cap or fuel pump -- See which one the player is nearer. The fuel cap or fuel pump
if distanceToPump >= distanceToCap then if distanceToPump >= distanceToCap then
executeRefuelAction(isFromJerryCan, closestVehicle, closestCapPos, closestVehicleHash, customVehicleParameters) executeRefuelAction(isFromJerryCan, closestVehicle, closestCapPos, closestVehicleHash, customVehicleParameters)
end end
end end
else else
-- Player is not near the cap, set it to null to find it again later -- Player is not near the cap, set it to null to find it again later
closestCapPos = nil closestCapPos = nil
end end
else else
-- Find the nearest vehicle and cap pos -- Find the nearest vehicle and cap pos
closestVehicle, closestCapPos, closestVehicleHash, customVehicleParameters = getClosestVehicleVariables() closestVehicle, closestCapPos, closestVehicleHash, customVehicleParameters = getClosestVehicleVariables()
end end
Wait(waitTime) Wait(waitTime)
end end
terminateRefuelThread() terminateRefuelThread()
end end
----------------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------------------------------------------------
-- Target -- Target
----------------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------------------------------------------------
function createTargetForVehicleIteraction() function createTargetForVehicleIteraction()
local attachParams = { local attachParams = {
labelText = Utils.translate("target.start_refuel"), labelText = Utils.translate("target.start_refuel"),
icon = "fas fa-gas-pump", icon = "fas fa-gas-pump",
iconColor = "#2986cc", iconColor = "#2986cc",
zone_id = "start_refuel", zone_id = "start_refuel",
distance = 2.0 distance = 2.0
} }
Utils.Target.createTargetForBone(vehicleCapBoneList(),attachParams,executeRefuelActionFromTarget,nil,canAttachNozzleTargetCallback) Utils.Target.createTargetForBone(vehicleCapBoneList(),attachParams,executeRefuelActionFromTarget,nil,canAttachNozzleTargetCallback)
local detachParams = { local detachParams = {
labelText = Utils.translate("target.stop_refuel"), labelText = Utils.translate("target.stop_refuel"),
icon = "fas fa-gas-pump", icon = "fas fa-gas-pump",
iconColor = "#2986cc", iconColor = "#2986cc",
zone_id = "stop_refuel", zone_id = "stop_refuel",
distance = 2.0 distance = 2.0
} }
Utils.Target.createTargetForBone(vehicleCapBoneList(),detachParams,stopRefuelAction,nil,canDetachNozzleTargetCallback) Utils.Target.createTargetForBone(vehicleCapBoneList(),detachParams,stopRefuelAction,nil,canDetachNozzleTargetCallback)
end end
function executeRefuelActionFromTarget() function executeRefuelActionFromTarget()
-- Load variables to open te UI -- Load variables to open te UI
loadNuiVariables() loadNuiVariables()
local ped = PlayerPedId() local ped = PlayerPedId()
-- Calculate if player is holding a jerry can -- Calculate if player is holding a jerry can
local isFromJerryCan = false local isFromJerryCan = false
if not IsPedInAnyVehicle(ped, false) and GetSelectedPedWeapon(ped) == JERRY_CAN_HASH then if not IsPedInAnyVehicle(ped, false) and GetSelectedPedWeapon(ped) == JERRY_CAN_HASH then
isFromJerryCan = true isFromJerryCan = true
remainingFuelToRefuel = getJerryCanAmmo() remainingFuelToRefuel = getJerryCanAmmo()
if Config.Debug then print("executeRefuelActionFromTarget:remainingFuelToRefuel",remainingFuelToRefuel) end if Config.Debug then print("executeRefuelActionFromTarget:remainingFuelToRefuel",remainingFuelToRefuel) end
end end
local closestVehicle, closestCapPos, closestVehicleHash, customVehicleParameters = getClosestVehicleVariables() local closestVehicle, closestCapPos, closestVehicleHash, customVehicleParameters = getClosestVehicleVariables()
executeRefuelAction(isFromJerryCan, closestVehicle, closestCapPos, closestVehicleHash, customVehicleParameters) executeRefuelAction(isFromJerryCan, closestVehicle, closestCapPos, closestVehicleHash, customVehicleParameters)
end end
function canAttachNozzleTargetCallback(entity, distance) function canAttachNozzleTargetCallback(entity, distance)
local ped = PlayerPedId() local ped = PlayerPedId()
if (DoesEntityExist(fuelNozzle) or GetSelectedPedWeapon(ped) == JERRY_CAN_HASH) if (DoesEntityExist(fuelNozzle) or GetSelectedPedWeapon(ped) == JERRY_CAN_HASH)
and not isRefuelling and not isRefuelling
and not vehicleAttachedToNozzle then and not vehicleAttachedToNozzle then
return true return true
end end
return false return false
end end
function canDetachNozzleTargetCallback(entity, distance) function canDetachNozzleTargetCallback(entity, distance)
local ped = PlayerPedId() local ped = PlayerPedId()
if (DoesEntityExist(fuelNozzle) or GetSelectedPedWeapon(ped) == JERRY_CAN_HASH) if (DoesEntityExist(fuelNozzle) or GetSelectedPedWeapon(ped) == JERRY_CAN_HASH)
and vehicleAttachedToNozzle then and vehicleAttachedToNozzle then
return true return true
end end
return false return false
end end
function canOpenPumpUiTargetCallback() function canOpenPumpUiTargetCallback()
return not DoesEntityExist(fuelNozzle) return not DoesEntityExist(fuelNozzle)
end end
function canReturnNozzleTargetCallback() function canReturnNozzleTargetCallback()
return DoesEntityExist(fuelNozzle) return DoesEntityExist(fuelNozzle)
end end
----------------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------------------------------------------------
-- Utils -- Utils
----------------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------------------------------------------------
function getClosestVehicleVariables() function getClosestVehicleVariables()
-- Get the closest vehicle and its cap pos -- Get the closest vehicle and its cap pos
local closestVehicle = GetClosestVehicle() local closestVehicle = GetClosestVehicle()
local closestCapPos = GetVehicleCapPos(closestVehicle) local closestCapPos = GetVehicleCapPos(closestVehicle)
local closestVehicleHash = GetEntityModel(closestVehicle) local closestVehicleHash = GetEntityModel(closestVehicle)
local customVehicleParameters = (Config.CustomVehicleParametersHash[closestVehicleHash] or Config.CustomVehicleParametersHash.default or { distance = 1.2, nozzleOffset = { forward = 0.0, right = -0.15, up = 0.5 }, nozzleRotation = { x = 0, y = 0, z = 0} }) local customVehicleParameters = (Config.CustomVehicleParametersHash[closestVehicleHash] or Config.CustomVehicleParametersHash.default or { distance = 1.2, nozzleOffset = { forward = 0.0, right = -0.15, up = 0.5 }, nozzleRotation = { x = 0, y = 0, z = 0} })
if not closestCapPos then if not closestCapPos then
print("Cap not found for vehicle") print("Cap not found for vehicle")
end end
return closestVehicle, closestCapPos, closestVehicleHash, customVehicleParameters
end local finalWorldPos = getWorldPosFromOffset(closestVehicle, customVehicleParameters.nozzleOffset)
function terminateRefuelThread() return closestVehicle, finalWorldPos, closestVehicleHash, customVehicleParameters
-- Stop the refueling process end
if refuelingThread and IsThreadActive(refuelingThread) then
TerminateThread(refuelingThread) function getWorldPosFromOffset(vehicle, offset)
refuelingThread = nil local closestCapPos = GetVehicleCapPos(vehicle)
end local forwardVector, rightVector, upVector, _ = GetEntityMatrix(vehicle)
end
-- Adjust the offsets
function stopRefuelAnimation() local forwardOffset = forwardVector * offset.forward
local ped = PlayerPedId() local rightoffset = rightVector * offset.right
ClearPedTasks(ped) local upOffset = upVector * offset.up
RemoveAnimDict("weapons@misc@jerrycan@")
end -- Final world position of the nozzle point
return vector3(
function stopRefuelAction() closestCapPos.x + forwardOffset.x + rightoffset.x + upOffset.x,
-- Stop refuelling closestCapPos.y + forwardOffset.y + rightoffset.y + upOffset.y,
stopRefuelAnimation() closestCapPos.z + forwardOffset.z + rightoffset.z + upOffset.z
SendNUIMessage({ hideRefuelDisplay = true }) )
attachNozzleToPed() end
isRefuelling = false
end function terminateRefuelThread()
-- Stop the refueling process
function attachNozzleToVehicle(closestVehicle, customVehicleParameters) if refuelingThread and IsThreadActive(refuelingThread) then
DetachEntity(fuelNozzle, true, true) TerminateThread(refuelingThread)
refuelingThread = nil
-- Find the appropriate bone for the fuel cap end
local tankBones = vehicleCapBoneList() end
local boneIndex = -1
function stopRefuelAnimation()
for _, boneName in ipairs(tankBones) do local ped = PlayerPedId()
boneIndex = GetEntityBoneIndexByName(closestVehicle, boneName) ClearPedTasks(ped)
if boneIndex ~= -1 then RemoveAnimDict("weapons@misc@jerrycan@")
break end
end
end function stopRefuelAction()
-- Stop refuelling
if boneIndex ~= -1 then stopRefuelAnimation()
local vehicleRotation = GetEntityRotation(closestVehicle) SendNUIMessage({ hideRefuelDisplay = true })
local forwardVector, rightVector, upVector, _ = GetEntityMatrix(closestVehicle) attachNozzleToPed()
isRefuelling = false
-- Adjust the offsets end
local forwardOffset = forwardVector * customVehicleParameters.nozzleOffset.forward
local rightoffset = rightVector * customVehicleParameters.nozzleOffset.right function attachNozzleToVehicle(closestVehicle, customVehicleParameters)
local upOffset = upVector * customVehicleParameters.nozzleOffset.up DetachEntity(fuelNozzle, true, true)
local finalOffset = forwardOffset + rightoffset + upOffset
-- Find the appropriate bone for the fuel cap
-- Adjust the rotation local tankBones = vehicleCapBoneList()
local nozzleRotation = customVehicleParameters.nozzleRotation or { x = 0, y = 0, z = 0 } local boneIndex = -1
local finalRotationX = vehicleRotation.x + nozzleRotation.x
local finalRotationY = vehicleRotation.y + nozzleRotation.y for _, boneName in ipairs(tankBones) do
local finalRotationZ = vehicleRotation.z + nozzleRotation.z boneIndex = GetEntityBoneIndexByName(closestVehicle, boneName)
if boneIndex ~= -1 then
-- Attach the nozzle to the vehicle's fuel cap bone with the calculated rotation break
AttachEntityToEntity(fuelNozzle, closestVehicle, boneIndex, finalOffset.x, finalOffset.y, finalOffset.z, finalRotationX - 45, finalRotationY, finalRotationZ - 90, false, false, false, false, 2, false) end
else end
print("No valid fuel cap bone found on the vehicle.")
end if boneIndex ~= -1 then
local vehicleRotation = GetEntityRotation(closestVehicle)
-- Set the global variable to indicate the vehicle attached to nozzle local forwardVector, rightVector, upVector, _ = GetEntityMatrix(closestVehicle)
vehicleAttachedToNozzle = closestVehicle
end -- Adjust the offsets
local forwardOffset = forwardVector * customVehicleParameters.nozzleOffset.forward
function attachNozzleToPed() local rightoffset = rightVector * customVehicleParameters.nozzleOffset.right
DetachEntity(fuelNozzle, true, true) local upOffset = upVector * customVehicleParameters.nozzleOffset.up
local finalOffset = forwardOffset + rightoffset + upOffset
local ped = PlayerPedId()
local pedBone = GetPedBoneIndex(ped, 18905) -- Adjust the rotation
AttachEntityToEntity(fuelNozzle, ped, pedBone, 0.13, 0.04, 0.01, -42.0, -115.0, -63.42, false, true, false, true, 0, true) local nozzleRotation = customVehicleParameters.nozzleRotation or { x = 0, y = 0, z = 0 }
local finalRotationX = vehicleRotation.x + nozzleRotation.x
vehicleAttachedToNozzle = nil local finalRotationY = vehicleRotation.y + nozzleRotation.y
end local finalRotationZ = vehicleRotation.z + nozzleRotation.z
function getNearestPumpRopeLength(fuelTypePurchased, pumpCoords) -- Attach the nozzle to the vehicle's fuel cap bone with the calculated rotation
local distanceToFindPump = 10 AttachEntityToEntity(fuelNozzle, closestVehicle, boneIndex, finalOffset.x, finalOffset.y, finalOffset.z, finalRotationX - 45, finalRotationY, finalRotationZ - 90, false, false, false, false, 2, false)
local ropeLength = Config.DefaultRopeLength else
if fuelTypePurchased == "electricfast" or fuelTypePurchased == "electricnormal" then print("No valid fuel cap bone found on the vehicle.")
for _, pumpConfig in pairs(Config.Electric.chargersLocation) do end
local distance = #(vector3(pumpConfig.location.x, pumpConfig.location.y, pumpConfig.location.z) - pumpCoords)
if distance < distanceToFindPump then -- Set the global variable to indicate the vehicle attached to nozzle
ropeLength = pumpConfig.ropeLength vehicleAttachedToNozzle = closestVehicle
break end
end
end function attachNozzleToPed()
else DetachEntity(fuelNozzle, true, true)
for _, pumpConfig in pairs(Config.CustomGasPumpLocations) do
local distance = #(vector3(pumpConfig.location.x, pumpConfig.location.y, pumpConfig.location.z) - pumpCoords) local ped = PlayerPedId()
if distance < distanceToFindPump then local pedBone = GetPedBoneIndex(ped, 18905)
ropeLength = pumpConfig.ropeLength AttachEntityToEntity(fuelNozzle, ped, pedBone, 0.13, 0.04, 0.01, -42.0, -115.0, -63.42, false, true, false, true, 0, true)
break
end vehicleAttachedToNozzle = nil
end end
end
return ropeLength function getNearestPumpRopeLength(fuelTypePurchased, pumpCoords)
end local distanceToFindPump = 10
local ropeLength = Config.DefaultRopeLength
function createFuelNozzleObject(fuelTypePurchased) if fuelTypePurchased == "electricfast" or fuelTypePurchased == "electricnormal" then
local nozzle_prop_label = Config.NozzleProps.gas for _, pumpConfig in pairs(Config.Electric.chargersLocation) do
-- Change the nozzle prop to electric local distance = #(vector3(pumpConfig.location.x, pumpConfig.location.y, pumpConfig.location.z) - pumpCoords)
if fuelTypePurchased == "electricfast" or fuelTypePurchased == "electricnormal" then if distance < distanceToFindPump then
nozzle_prop_label = Config.NozzleProps.electric ropeLength = pumpConfig.ropeLength
end break
end
RequestModel(nozzle_prop_label) end
while not HasModelLoaded(nozzle_prop_label) do else
Wait(50) for _, pumpConfig in pairs(Config.CustomGasPumpLocations) do
end local distance = #(vector3(pumpConfig.location.x, pumpConfig.location.y, pumpConfig.location.z) - pumpCoords)
if distance < distanceToFindPump then
return CreateObject(joaat(nozzle_prop_label), 1.0, 1.0, 1.0, true, true, false) ropeLength = pumpConfig.ropeLength
break
end
end
end
return ropeLength
end
function createFuelNozzleObject(fuelTypePurchased)
local nozzle_prop_label = Config.NozzleProps.gas
-- Change the nozzle prop to electric
if fuelTypePurchased == "electricfast" or fuelTypePurchased == "electricnormal" then
nozzle_prop_label = Config.NozzleProps.electric
end
RequestModel(nozzle_prop_label)
while not HasModelLoaded(nozzle_prop_label) do
Wait(50)
end
return CreateObject(joaat(nozzle_prop_label), 1.0, 1.0, 1.0, true, true, false)
end end

View file

@ -1,48 +1,49 @@
fx_version 'cerulean' fx_version 'cerulean'
game 'gta5' game 'gta5'
author 'LixeiroCharmoso' author 'LixeiroCharmoso'
name 'lc_fuel' name 'lc_fuel'
ui_page "nui/ui.html" ui_page "nui/ui.html"
lua54 'yes' lua54 'yes'
escrow_ignore { escrow_ignore {
'**' '**'
} }
client_scripts { client_scripts {
"client/client.lua", "client/client.lua",
"client/client_gas.lua", "client/client_gas.lua",
"client/client_electric.lua", "client/client_electric.lua",
"client/client_refuel.lua", "client/client_refuel.lua",
"client/client_fuel_chart.lua", "client/client_fuel_chart.lua",
} "client/client_fuel_type.lua",
}
server_scripts {
"@mysql-async/lib/MySQL.lua", server_scripts {
"server/server.lua", "@mysql-async/lib/MySQL.lua",
} "server/server.lua",
}
shared_scripts {
"lang/*.lua", shared_scripts {
"config.lua", "lang/*.lua",
"@lc_utils/functions/loader.lua", "config.lua",
} "@lc_utils/functions/loader.lua",
}
files {
"version", files {
"nui/lang/*", "version",
"nui/ui.html", "nui/lang/*",
"nui/panel.js", "nui/ui.html",
"nui/scripts/*", "nui/panel.js",
"nui/css/*", "nui/scripts/*",
"nui/images/*", "nui/css/*",
"nui/fonts/Technology.woff", "nui/images/*",
} "nui/fonts/Technology.woff",
}
dependency "lc_utils"
provides 'LegacyFuel' dependency "lc_utils"
provides 'LegacyFuel'
data_file 'DLC_ITYP_REQUEST' 'stream/prop_electric_01.ytyp'
data_file 'DLC_ITYP_REQUEST' 'stream/prop_electric_01.ytyp'
data_file 'DLC_ITYP_REQUEST' 'stream/prop_eletricpistol.ytyp' data_file 'DLC_ITYP_REQUEST' 'stream/prop_eletricpistol.ytyp'

View file

@ -1,41 +1,49 @@
if not Lang then Lang = {} end if not Lang then Lang = {} end
Lang['de'] = { Lang['de'] = {
['markers'] = { ['markers'] = {
['open_refuel'] = "Drücke ~INPUT_CONTEXT~, um zu tanken", ['open_refuel'] = "Drücke ~INPUT_CONTEXT~, um zu tanken",
['open_recharge'] = "Drücke ~INPUT_CONTEXT~, um aufzuladen", ['open_recharge'] = "Drücke ~INPUT_CONTEXT~, um aufzuladen",
['interact_with_vehicle'] = "Drücke ~y~E~w~, um zu interagieren", ['interact_with_vehicle'] = "Drücke ~y~E~w~, um zu interagieren",
['return_nozzle'] = "Drücke ~INPUT_CONTEXT~, um die Zapfpistole zurückzugeben", ['return_nozzle'] = "Drücke ~INPUT_CONTEXT~, um die Zapfpistole zurückzugeben",
}, },
['target'] = { ['target'] = {
['open_refuel'] = "Tankmenü öffnen", ['open_refuel'] = "Tankmenü öffnen",
['open_recharge'] = "Lademenü öffnen", ['open_recharge'] = "Lademenü öffnen",
['start_refuel'] = "Fahrzeug betanken", ['start_refuel'] = "Fahrzeug betanken",
['stop_refuel'] = "Tanken beenden", ['stop_refuel'] = "Tanken beenden",
['return_nozzle'] = "Zapfpistole zurückgeben", ['return_nozzle'] = "Zapfpistole zurückgeben",
}, },
['blip_text'] = "Tankstelle", ['blip_text'] = "Tankstelle",
['not_enough_refuel'] = "Sie haben den gesamten bezahlten Kraftstoff bereits verbraucht. Bitte kaufen Sie bei Bedarf zusätzlichen Treibstoff", ['not_enough_refuel'] = "Sie haben den gesamten bezahlten Kraftstoff bereits verbraucht. Bitte kaufen Sie bei Bedarf zusätzlichen Treibstoff",
['invalid_value'] = "Ungültiger Wert", ['invalid_value'] = "Ungültiger Wert",
['not_enough_money'] = "Du hast nicht genug $%s geld um das zu Bezahlen", ['not_enough_money'] = "Du hast nicht genug $%s geld um das zu Bezahlen",
['not_enough_stock'] = "Diese Tankstelle verfügt nicht über genügend Lagerbestände, um diese Aktion durchzuführen", ['not_enough_stock'] = "Diese Tankstelle verfügt nicht über genügend Lagerbestände, um diese Aktion durchzuführen",
['refuel_paid'] = "$%s bezahlt zum Tanken", ['refuel_paid'] = "$%s bezahlt zum Tanken",
['returned_fuel'] = "Du hast %sL Kraftstoff zurückgegeben und $%s zurückerhalten", ['returned_fuel'] = "Du hast %sL Kraftstoff zurückgegeben und $%s zurückerhalten",
['returned_charge'] = "Du hast %skWh Ladung zurückgegeben und $%s zurückerhalten", ['returned_charge'] = "Du hast %skWh Ladung zurückgegeben und $%s zurückerhalten",
['jerry_can_paid'] = "$%s bezahlt für den Kanister", ['jerry_can_paid'] = "$%s bezahlt für den Kanister",
['too_far_away'] = "Sie sind zu weit von der Zapfseule entfernt", ['too_far_away'] = "Sie sind zu weit von der Zapfseule entfernt",
['vehicle_refueled'] = "Sie haben %sL ins Fahrzeug getankt", ['vehicle_refueled'] = "Sie haben %sL ins Fahrzeug getankt",
['vehicle_recharged'] = "Sie haben %skWh im Fahrzeug aufgeladen", ['vehicle_recharged'] = "Sie haben %skWh im Fahrzeug aufgeladen",
['vehicle_tank_full'] = "Auto ist voll getankt", ['vehicle_tank_full'] = "Auto ist voll getankt",
['vehicle_tank_emptied'] = "Fahrzeugtank ist leer", ['vehicle_tank_emptied'] = "Fahrzeugtank ist leer",
['vehicle_not_found'] = "Fahrzeug konnte nicht gefunden werden", ['vehicle_not_found'] = "Fahrzeug konnte nicht gefunden werden",
['pump_not_found'] = "Zapfseule konnte nicht gefunden werden", ['pump_not_found'] = "Zapfseule konnte nicht gefunden werden",
['vehicle_wrong_fuel'] = "Sie haben für dieses Fahrzeug den falschen Kraftstofftyp verwendet, was zu einer Panne geführt hat.", ['vehicle_wrong_fuel'] = "Sie haben für dieses Fahrzeug den falschen Kraftstofftyp verwendet, was zu einer Panne geführt hat.",
['incompatible_fuel'] = "Inkompatibler Kraftstofftyp erkannt. Bitte wählen Sie die richtige Betankungsoption für Ihr Fahrzeug aus.", ['incompatible_fuel'] = "Inkompatibler Kraftstofftyp erkannt. Bitte wählen Sie die richtige Betankungsoption für Ihr Fahrzeug aus.",
['owned_gas_stations'] = { ['owned_gas_stations'] = {
['balance_jerry_can'] = "Benzinkanister verkauft (%s Liter)", ['balance_jerry_can'] = "Benzinkanister verkauft (%s Liter)",
['balance_fuel'] = "Treibstoff verkauft (%s Liter)", ['balance_fuel'] = "Treibstoff verkauft (%s Liter)",
['balance_electric'] = "Elektrische Ladung verkauft (%s kWh)", ['balance_electric'] = "Elektrische Ladung verkauft (%s kWh)",
['refund_fuel'] = "Kraftstoff erstattet (%s Liter)", ['refund_fuel'] = "Kraftstoff erstattet (%s Liter)",
['refund_electric'] = "Stromladung erstattet (%s kWh)", ['refund_electric'] = "Stromladung erstattet (%s kWh)",
} },
} ['fuel_types'] = {
['type_title'] = "Kraftstoffart: %s",
['electric'] = "Elektrisch",
['regular'] = "Regulär",
['plus'] = "Plus",
['premium'] = "Premium",
['diesel'] = "Diesel",
},
}

View file

@ -1,41 +1,49 @@
if not Lang then Lang = {} end if not Lang then Lang = {} end
Lang['en'] = { Lang['en'] = {
['markers'] = { ['markers'] = {
['open_refuel'] = "Press ~INPUT_CONTEXT~ to refuel", ['open_refuel'] = "Press ~INPUT_CONTEXT~ to refuel",
['open_recharge'] = "Press ~INPUT_CONTEXT~ to recharge", ['open_recharge'] = "Press ~INPUT_CONTEXT~ to recharge",
['interact_with_vehicle'] = "Press ~y~E~w~ to interact", ['interact_with_vehicle'] = "Press ~y~E~w~ to interact",
['return_nozzle'] = "Press ~INPUT_CONTEXT~ to return the nozzle", ['return_nozzle'] = "Press ~INPUT_CONTEXT~ to return the nozzle",
}, },
['target'] = { ['target'] = {
['open_refuel'] = "Open refuel menu", ['open_refuel'] = "Open refuel menu",
['open_recharge'] = "Open recharge menu", ['open_recharge'] = "Open recharge menu",
['start_refuel'] = "Refuel vehicle", ['start_refuel'] = "Refuel vehicle",
['stop_refuel'] = "Stop refuel", ['stop_refuel'] = "Stop refuel",
['return_nozzle'] = "Return the nozzle", ['return_nozzle'] = "Return the nozzle",
}, },
['blip_text'] = "Gas stations", ['blip_text'] = "Gas stations",
['not_enough_refuel'] = "You've already used all the fuel you paid for. Please purchase additional fuel if needed", ['not_enough_refuel'] = "You've already used all the fuel you paid for. Please purchase additional fuel if needed",
['invalid_value'] = "Invalid value", ['invalid_value'] = "Invalid value",
['not_enough_money'] = "You don't have $%s to pay this", ['not_enough_money'] = "You don't have $%s to pay this",
['not_enough_stock'] = "This gas station don't have enough stock to perform this action", ['not_enough_stock'] = "This gas station don't have enough stock to perform this action",
['refuel_paid'] = "Paid $%s for this refuel", ['refuel_paid'] = "Paid $%s for this refuel",
['returned_fuel'] = "You've returned %sL of fuel and received back $%s", ['returned_fuel'] = "You've returned %sL of fuel and received back $%s",
['returned_charge'] = "You've returned %skWh of fuel and received back $%s", ['returned_charge'] = "You've returned %skWh of fuel and received back $%s",
['jerry_can_paid'] = "Paid $%s for this jerry can", ['jerry_can_paid'] = "Paid $%s for this jerry can",
['too_far_away'] = "You are too far from the pump", ['too_far_away'] = "You are too far from the pump",
['vehicle_refueled'] = "You refueled %sL in the vehicle", ['vehicle_refueled'] = "You refueled %sL in the vehicle",
['vehicle_recharged'] = "You recharged %skWh in the vehicle", ['vehicle_recharged'] = "You recharged %skWh in the vehicle",
['vehicle_tank_full'] = "Vehicle tank is full", ['vehicle_tank_full'] = "Vehicle tank is full",
['vehicle_tank_emptied'] = "Vehicle tank emptied", ['vehicle_tank_emptied'] = "Vehicle tank emptied",
['vehicle_not_found'] = "Vehicle not found", ['vehicle_not_found'] = "Vehicle not found",
['pump_not_found'] = "Pump not found", ['pump_not_found'] = "Pump not found",
['vehicle_wrong_fuel'] = "You used the wrong fuel type for this vehicle, causing it to break down.", ['vehicle_wrong_fuel'] = "You used the wrong fuel type for this vehicle, causing it to break down.",
['incompatible_fuel'] = "Incompatible fuel type detected. Please select the correct refueling option for your vehicle.", ['incompatible_fuel'] = "Incompatible fuel type detected. Please select the correct refueling option for your vehicle.",
['owned_gas_stations'] = { ['owned_gas_stations'] = {
['balance_jerry_can'] = "Gas can sold (%s Liters)", ['balance_jerry_can'] = "Gas can sold (%s Liters)",
['balance_fuel'] = "Fuel sold (%s Liters)", ['balance_fuel'] = "Fuel sold (%s Liters)",
['balance_electric'] = "Electric charge sold (%s kWh)", ['balance_electric'] = "Electric charge sold (%s kWh)",
['refund_fuel'] = "Fuel refunded (%s Liters)", ['refund_fuel'] = "Fuel refunded (%s Liters)",
['refund_electric'] = "Electric charge refunded (%s kWh)", ['refund_electric'] = "Electric charge refunded (%s kWh)",
} },
['fuel_types'] = {
['type_title'] = "Fuel Type: %s",
['electric'] = "Electric",
['regular'] = "Regular",
['plus'] = "Plus",
['premium'] = "Premium",
['diesel'] = "Diesel",
},
} }

View file

@ -1,41 +1,49 @@
if not Lang then Lang = {} end if not Lang then Lang = {} end
Lang['es'] = { Lang['es'] = {
['markers'] = { ['markers'] = {
['open_refuel'] = "Pulsa ~INPUT_CONTEXT~ para repostar", ['open_refuel'] = "Pulsa ~INPUT_CONTEXT~ para repostar",
['open_recharge'] = "Pulsa ~INPUT_CONTEXT~ para cargar", ['open_recharge'] = "Pulsa ~INPUT_CONTEXT~ para cargar",
['interact_with_vehicle'] = "Pulsa ~y~E~w~ para interactuar", ['interact_with_vehicle'] = "Pulsa ~y~E~w~ para interactuar",
['return_nozzle'] = "Pulsa ~INPUT_CONTEXT~ para devolver la manguera", ['return_nozzle'] = "Pulsa ~INPUT_CONTEXT~ para devolver la manguera",
}, },
['target'] = { ['target'] = {
['open_refuel'] = "Abrir menú de repostaje", ['open_refuel'] = "Abrir menú de repostaje",
['open_recharge'] = "Abrir menú de carga", ['open_recharge'] = "Abrir menú de carga",
['start_refuel'] = "Repostar vehículo", ['start_refuel'] = "Repostar vehículo",
['stop_refuel'] = "Detener repostaje", ['stop_refuel'] = "Detener repostaje",
['return_nozzle'] = "Devolver la manguera", ['return_nozzle'] = "Devolver la manguera",
}, },
['blip_text'] = "Gasolineras", ['blip_text'] = "Gasolineras",
['not_enough_refuel'] = "Ya has usado todo el combustible que pagaste. Compra más combustible si es necesario", ['not_enough_refuel'] = "Ya has usado todo el combustible que pagaste. Compra más combustible si es necesario",
['invalid_value'] = "Valor inválido", ['invalid_value'] = "Valor inválido",
['not_enough_money'] = "No tienes $%s para pagar esto", ['not_enough_money'] = "No tienes $%s para pagar esto",
['not_enough_stock'] = "Esta gasolinera no tiene suficiente stock para realizar esta acción", ['not_enough_stock'] = "Esta gasolinera no tiene suficiente stock para realizar esta acción",
['refuel_paid'] = "Pagaste $%s por este repostaje", ['refuel_paid'] = "Pagaste $%s por este repostaje",
['returned_fuel'] = "Has devuelto %sL de combustible y recibido $%s", ['returned_fuel'] = "Has devuelto %sL de combustible y recibido $%s",
['returned_charge'] = "Has devuelto %skWh de carga y recibido $%s", ['returned_charge'] = "Has devuelto %skWh de carga y recibido $%s",
['jerry_can_paid'] = "Pagaste $%s por este bidón de gasolina", ['jerry_can_paid'] = "Pagaste $%s por este bidón de gasolina",
['too_far_away'] = "Estás demasiado lejos del surtidor", ['too_far_away'] = "Estás demasiado lejos del surtidor",
['vehicle_refueled'] = "Repostaste %sL en el vehículo", ['vehicle_refueled'] = "Repostaste %sL en el vehículo",
['vehicle_recharged'] = "Recargaste %skWh en el vehículo", ['vehicle_recharged'] = "Recargaste %skWh en el vehículo",
['vehicle_tank_full'] = "El tanque del vehículo está lleno", ['vehicle_tank_full'] = "El tanque del vehículo está lleno",
['vehicle_tank_emptied'] = "El tanque del vehículo se ha vaciado", ['vehicle_tank_emptied'] = "El tanque del vehículo se ha vaciado",
['vehicle_not_found'] = "Vehículo no encontrado", ['vehicle_not_found'] = "Vehículo no encontrado",
['pump_not_found'] = "Surtidor no encontrado", ['pump_not_found'] = "Surtidor no encontrado",
['vehicle_wrong_fuel'] = "Usaste el tipo de combustible incorrecto para este vehículo, causando que se averíe.", ['vehicle_wrong_fuel'] = "Usaste el tipo de combustible incorrecto para este vehículo, causando que se averíe.",
['incompatible_fuel'] = "Tipo de combustible incompatible detectado. Por favor, selecciona la opción de repostaje correcta para tu vehículo.", ['incompatible_fuel'] = "Tipo de combustible incompatible detectado. Por favor, selecciona la opción de repostaje correcta para tu vehículo.",
['owned_gas_stations'] = { ['owned_gas_stations'] = {
['balance_jerry_can'] = "Bidón de gasolina vendido (%s Litros)", ['balance_jerry_can'] = "Bidón de gasolina vendido (%s Litros)",
['balance_fuel'] = "Combustible vendido (%s Litros)", ['balance_fuel'] = "Combustible vendido (%s Litros)",
['balance_electric'] = "Carga eléctrica vendida (%s kWh)", ['balance_electric'] = "Carga eléctrica vendida (%s kWh)",
['refund_fuel'] = "Combustible reembolsado (%s litros)", ['refund_fuel'] = "Combustible reembolsado (%s litros)",
['refund_electric'] = "Carga eléctrica reembolsada (%s kWh)", ['refund_electric'] = "Carga eléctrica reembolsada (%s kWh)",
} },
} ['fuel_types'] = {
['type_title'] = "Tipo de combustible: %s",
['electric'] = "Eléctrico",
['regular'] = "Sin plomo",
['plus'] = "Plus",
['premium'] = "Premium",
['diesel'] = "Diésel",
},
}

View file

@ -1,41 +1,49 @@
if not Lang then Lang = {} end if not Lang then Lang = {} end
Lang['fr'] = { Lang['fr'] = {
['markers'] = { ['markers'] = {
['open_refuel'] = "Appuyez sur ~INPUT_CONTEXT~ pour faire le plein", ['open_refuel'] = "Appuyez sur ~INPUT_CONTEXT~ pour faire le plein",
['open_recharge'] = "Appuyez sur ~INPUT_CONTEXT~ pour recharger", ['open_recharge'] = "Appuyez sur ~INPUT_CONTEXT~ pour recharger",
['interact_with_vehicle'] = "Appuyez sur ~y~E~w~ pour interagir", ['interact_with_vehicle'] = "Appuyez sur ~y~E~w~ pour interagir",
['return_nozzle'] = "Appuyez sur ~INPUT_CONTEXT~ pour remettre le pistolet", ['return_nozzle'] = "Appuyez sur ~INPUT_CONTEXT~ pour remettre le pistolet",
}, },
['target'] = { ['target'] = {
['open_refuel'] = "Ouvrir le menu de ravitaillement", ['open_refuel'] = "Ouvrir le menu de ravitaillement",
['open_recharge'] = "Ouvrir le menu de recharge", ['open_recharge'] = "Ouvrir le menu de recharge",
['start_refuel'] = "Faire le plein du véhicule", ['start_refuel'] = "Faire le plein du véhicule",
['stop_refuel'] = "Arrêter le ravitaillement", ['stop_refuel'] = "Arrêter le ravitaillement",
['return_nozzle'] = "Ranger le pistolet", ['return_nozzle'] = "Ranger le pistolet",
}, },
['blip_text'] = "Stations-service", ['blip_text'] = "Stations-service",
['not_enough_refuel'] = "Vous avez déjà utilisé tout le carburant que vous avez payé. Veuillez acheter plus de carburant si nécessaire", ['not_enough_refuel'] = "Vous avez déjà utilisé tout le carburant que vous avez payé. Veuillez acheter plus de carburant si nécessaire",
['invalid_value'] = "Valeur invalide", ['invalid_value'] = "Valeur invalide",
['not_enough_money'] = "Vous n'avez pas $%s pour payer cela", ['not_enough_money'] = "Vous n'avez pas $%s pour payer cela",
['not_enough_stock'] = "Cette station-service n'a pas assez de stock pour effectuer cette action", ['not_enough_stock'] = "Cette station-service n'a pas assez de stock pour effectuer cette action",
['refuel_paid'] = "Vous avez payé $%s pour ce ravitaillement", ['refuel_paid'] = "Vous avez payé $%s pour ce ravitaillement",
['returned_fuel'] = "Vous avez rendu %sL de carburant et reçu $%s", ['returned_fuel'] = "Vous avez rendu %sL de carburant et reçu $%s",
['returned_charge'] = "Vous avez rendu %skWh de charge et reçu $%s", ['returned_charge'] = "Vous avez rendu %skWh de charge et reçu $%s",
['jerry_can_paid'] = "Vous avez payé $%s pour ce bidon d'essence", ['jerry_can_paid'] = "Vous avez payé $%s pour ce bidon d'essence",
['too_far_away'] = "Vous êtes trop loin de la pompe", ['too_far_away'] = "Vous êtes trop loin de la pompe",
['vehicle_refueled'] = "Vous avez mis %sL dans le véhicule", ['vehicle_refueled'] = "Vous avez mis %sL dans le véhicule",
['vehicle_recharged'] = "Vous avez rechargé %skWh dans le véhicule", ['vehicle_recharged'] = "Vous avez rechargé %skWh dans le véhicule",
['vehicle_tank_full'] = "Le réservoir du véhicule est plein", ['vehicle_tank_full'] = "Le réservoir du véhicule est plein",
['vehicle_tank_emptied'] = "Le réservoir du véhicule est vide", ['vehicle_tank_emptied'] = "Le réservoir du véhicule est vide",
['vehicle_not_found'] = "Véhicule non trouvé", ['vehicle_not_found'] = "Véhicule non trouvé",
['pump_not_found'] = "Pompe non trouvée", ['pump_not_found'] = "Pompe non trouvée",
['vehicle_wrong_fuel'] = "Vous avez utilisé le mauvais type de carburant pour ce véhicule, ce qui l'a endommagé.", ['vehicle_wrong_fuel'] = "Vous avez utilisé le mauvais type de carburant pour ce véhicule, ce qui l'a endommagé.",
['incompatible_fuel'] = "Type de carburant incompatible détecté. Veuillez sélectionner la bonne option de ravitaillement pour votre véhicule.", ['incompatible_fuel'] = "Type de carburant incompatible détecté. Veuillez sélectionner la bonne option de ravitaillement pour votre véhicule.",
['owned_gas_stations'] = { ['owned_gas_stations'] = {
['balance_jerry_can'] = "Bidon d'essence vendu (%s Litres)", ['balance_jerry_can'] = "Bidon d'essence vendu (%s Litres)",
['balance_fuel'] = "Carburant vendu (%s Litres)", ['balance_fuel'] = "Carburant vendu (%s Litres)",
['balance_electric'] = "Charge électrique vendue (%s kWh)", ['balance_electric'] = "Charge électrique vendue (%s kWh)",
['refund_fuel'] = "Carburant remboursé (%s litres)", ['refund_fuel'] = "Carburant remboursé (%s litres)",
['refund_electric'] = "Recharge électrique remboursée (%s kWh)", ['refund_electric'] = "Recharge électrique remboursée (%s kWh)",
} },
['fuel_types'] = {
['type_title'] = "Type de carburant : %s",
['electric'] = "Électrique",
['regular'] = "Ordinaire",
['plus'] = "Plus",
['premium'] = "Premium",
['diesel'] = "Diesel",
},
} }

View file

@ -1,41 +1,49 @@
if not Lang then Lang = {} end if not Lang then Lang = {} end
Lang['ja'] = { Lang['ja'] = {
['markers'] = { ['markers'] = {
['open_refuel'] = "INPUT_CONTEXTを押して燃料を補給します", ['open_refuel'] = "INPUT_CONTEXTを押して燃料を補給します",
['open_recharge'] = "INPUT_CONTEXTを押して充電", ['open_recharge'] = "INPUT_CONTEXTを押して充電",
['interact_with_vehicle'] = "yEwを押して車両と操作", ['interact_with_vehicle'] = "yEwを押して車両と操作",
['return_nozzle'] = "INPUT_CONTEXTを押してズルを戻す", ['return_nozzle'] = "INPUT_CONTEXTを押してズルを戻す",
}, },
['target'] = { ['target'] = {
['open_refuel'] = "燃料補給メニューを開く", ['open_refuel'] = "燃料補給メニューを開く",
['open_recharge'] = "充電メニューを開く", ['open_recharge'] = "充電メニューを開く",
['start_refuel'] = "車両に燃料補給", ['start_refuel'] = "車両に燃料補給",
['stop_refuel'] = "燃料補給を停止", ['stop_refuel'] = "燃料補給を停止",
['return_nozzle'] = "ノズルを戻す", ['return_nozzle'] = "ノズルを戻す",
}, },
['blip_text'] = "ガソリンスタンド", ['blip_text'] = "ガソリンスタンド",
['not_enough_refuel'] = "既に支払った燃料を使い切っています。必要であれば追加購入してください。", ['not_enough_refuel'] = "既に支払った燃料を使い切っています。必要であれば追加購入してください。",
['invalid_value'] = "無効な値です", ['invalid_value'] = "無効な値です",
['not_enough_money'] = "この支払いには$%sが不足しています", ['not_enough_money'] = "この支払いには$%sが不足しています",
['not_enough_stock'] = "このガソリンスタンドでは在庫が不足しているため、この操作は実行できません", ['not_enough_stock'] = "このガソリンスタンドでは在庫が不足しているため、この操作は実行できません",
['refuel_paid'] = "この燃料補給に$%s支払いました", ['refuel_paid'] = "この燃料補給に$%s支払いました",
['returned_fuel'] = "燃料を%sL返却し、$%sを受け取りました", ['returned_fuel'] = "燃料を%sL返却し、$%sを受け取りました",
['returned_charge'] = "電力を%skWh返却し、$%sを受け取りました", ['returned_charge'] = "電力を%skWh返却し、$%sを受け取りました",
['jerry_can_paid'] = "このガソリン缶に$%s支払いました", ['jerry_can_paid'] = "このガソリン缶に$%s支払いました",
['too_far_away'] = "ポンプから離れすぎています", ['too_far_away'] = "ポンプから離れすぎています",
['vehicle_refueled'] = "車両に%sLの燃料を補給しました", ['vehicle_refueled'] = "車両に%sLの燃料を補給しました",
['vehicle_recharged'] = "車両に%s kWhの充電を行いました", ['vehicle_recharged'] = "車両に%s kWhの充電を行いました",
['vehicle_tank_full'] = "車両のタンクが満タンです", ['vehicle_tank_full'] = "車両のタンクが満タンです",
['vehicle_tank_emptied'] = "車両のタンクが空になりました", ['vehicle_tank_emptied'] = "車両のタンクが空になりました",
['vehicle_not_found'] = "車両が見つかりませんでした", ['vehicle_not_found'] = "車両が見つかりませんでした",
['pump_not_found'] = "ポンプが見つかりませんでした", ['pump_not_found'] = "ポンプが見つかりませんでした",
['vehicle_wrong_fuel'] = "この車両には間違った燃料タイプを使用したため、故障しました。", ['vehicle_wrong_fuel'] = "この車両には間違った燃料タイプを使用したため、故障しました。",
['incompatible_fuel'] = "互換性のない燃料タイプが検出されました。正しい燃料補給オプションを選択してください。", ['incompatible_fuel'] = "互換性のない燃料タイプが検出されました。正しい燃料補給オプションを選択してください。",
['owned_gas_stations'] = { ['owned_gas_stations'] = {
['balance_jerry_can'] = "ガソリン缶販売 (%s L)", ['balance_jerry_can'] = "ガソリン缶販売 (%s L)",
['balance_fuel'] = "燃料販売 (%s L)", ['balance_fuel'] = "燃料販売 (%s L)",
['balance_electric'] = "電気充電販売 (%s kWh)", ['balance_electric'] = "電気充電販売 (%s kWh)",
['refund_fuel'] = "燃料が返金されました(%sリットル", ['refund_fuel'] = "燃料が返金されました(%sリットル",
['refund_electric'] = "電気充電が返金されました(%s kWh", ['refund_electric'] = "電気充電が返金されました(%s kWh",
} },
['fuel_types'] = {
['type_title'] = "燃料の種類: %s",
['electric'] = "電気",
['regular'] = "レギュラー",
['plus'] = "プラス",
['premium'] = "プレミアム",
['diesel'] = "ディーゼル",
},
} }

View file

@ -1,41 +1,49 @@
if not Lang then Lang = {} end if not Lang then Lang = {} end
Lang['tr'] = { Lang['tr'] = {
['markers'] = { ['markers'] = {
['open_refuel'] = "Yakıt almak için ~INPUT_CONTEXT~ tuşuna basın", ['open_refuel'] = "Yakıt almak için ~INPUT_CONTEXT~ tuşuna basın",
['open_recharge'] = "Şarj etmek için ~INPUT_CONTEXT~ tuşuna basın", ['open_recharge'] = "Şarj etmek için ~INPUT_CONTEXT~ tuşuna basın",
['interact_with_vehicle'] = "Etkileşim için ~y~E~w~ tuşuna basın", ['interact_with_vehicle'] = "Etkileşim için ~y~E~w~ tuşuna basın",
['return_nozzle'] = "Tabancayı geri koymak için ~INPUT_CONTEXT~ tuşuna basın", ['return_nozzle'] = "Tabancayı geri koymak için ~INPUT_CONTEXT~ tuşuna basın",
}, },
['target'] = { ['target'] = {
['open_refuel'] = "Yakıt menüsünü aç", ['open_refuel'] = "Yakıt menüsünü aç",
['open_recharge'] = "Şarj menüsünü aç", ['open_recharge'] = "Şarj menüsünü aç",
['start_refuel'] = "Araca yakıt doldur", ['start_refuel'] = "Araca yakıt doldur",
['stop_refuel'] = "Yakıt doldurmayı durdur", ['stop_refuel'] = "Yakıt doldurmayı durdur",
['return_nozzle'] = "Tabancayı geri koy", ['return_nozzle'] = "Tabancayı geri koy",
}, },
['blip_text'] = "Benzin istasyonları", ['blip_text'] = "Benzin istasyonları",
['not_enough_refuel'] = "Zaten ödediğiniz tüm yakıtı kullandınız. Gerekirse ek yakıt satın alın", ['not_enough_refuel'] = "Zaten ödediğiniz tüm yakıtı kullandınız. Gerekirse ek yakıt satın alın",
['invalid_value'] = "Geçersiz değer", ['invalid_value'] = "Geçersiz değer",
['not_enough_money'] = "Bunu ödemek için $%s paranız yok", ['not_enough_money'] = "Bunu ödemek için $%s paranız yok",
['not_enough_stock'] = "Bu benzin istasyonunda bu işlemi gerçekleştirmek için yeterli stok yok", ['not_enough_stock'] = "Bu benzin istasyonunda bu işlemi gerçekleştirmek için yeterli stok yok",
['refuel_paid'] = "Bu yakıt için $%s ödendi", ['refuel_paid'] = "Bu yakıt için $%s ödendi",
['returned_fuel'] = "%sL yakıt iade ettiniz ve $%s geri aldınız", ['returned_fuel'] = "%sL yakıt iade ettiniz ve $%s geri aldınız",
['returned_charge'] = "%skWh şarj iade ettiniz ve $%s geri aldınız", ['returned_charge'] = "%skWh şarj iade ettiniz ve $%s geri aldınız",
['jerry_can_paid'] = "Bu bidon için $%s ödendi", ['jerry_can_paid'] = "Bu bidon için $%s ödendi",
['too_far_away'] = "Pompadan çok uzaktasınız", ['too_far_away'] = "Pompadan çok uzaktasınız",
['vehicle_refueled'] = "Araca %sL yakıt dolduruldu", ['vehicle_refueled'] = "Araca %sL yakıt dolduruldu",
['vehicle_recharged'] = "Araca %skWh şarj yapıldı", ['vehicle_recharged'] = "Araca %skWh şarj yapıldı",
['vehicle_tank_full'] = "Araç deposu dolu", ['vehicle_tank_full'] = "Araç deposu dolu",
['vehicle_tank_emptied'] = "Araç deposu boşaltıldı", ['vehicle_tank_emptied'] = "Araç deposu boşaltıldı",
['vehicle_not_found'] = "Araç bulunamadı", ['vehicle_not_found'] = "Araç bulunamadı",
['pump_not_found'] = "Pompa bulunamadı", ['pump_not_found'] = "Pompa bulunamadı",
['vehicle_wrong_fuel'] = "Bu araç için yanlış yakıt kullandınız ve aracınız bozuldu.", ['vehicle_wrong_fuel'] = "Bu araç için yanlış yakıt kullandınız ve aracınız bozuldu.",
['incompatible_fuel'] = "Uyumsuz yakıt türü tespit edildi. Lütfen aracınız için doğru yakıt seçeneğini seçin.", ['incompatible_fuel'] = "Uyumsuz yakıt türü tespit edildi. Lütfen aracınız için doğru yakıt seçeneğini seçin.",
['owned_gas_stations'] = { ['owned_gas_stations'] = {
['balance_jerry_can'] = "Yakıt bidonu satıldı (%s Litre)", ['balance_jerry_can'] = "Yakıt bidonu satıldı (%s Litre)",
['balance_fuel'] = "Yakıt satıldı (%s Litre)", ['balance_fuel'] = "Yakıt satıldı (%s Litre)",
['balance_electric'] = "Elektrik şarjı satıldı (%s kWh)", ['balance_electric'] = "Elektrik şarjı satıldı (%s kWh)",
['refund_fuel'] = "Yakıt iade edildi (%s litre)", ['refund_fuel'] = "Yakıt iade edildi (%s litre)",
['refund_electric'] = "Elektrik şarjı iade edildi (%s kWh)", ['refund_electric'] = "Elektrik şarjı iade edildi (%s kWh)",
} },
} ['fuel_types'] = {
['type_title'] = "Yakıt Türü: %s",
['electric'] = "Elektrikli",
['regular'] = "Normal",
['plus'] = "Plus",
['premium'] = "Premium",
['diesel'] = "Dizel",
},
}

View file

@ -1,41 +1,49 @@
if not Lang then Lang = {} end if not Lang then Lang = {} end
Lang['zh-cn'] = { Lang['zh-cn'] = {
['markers'] = { ['markers'] = {
['open_refuel'] = "按下 ~INPUT_CONTEXT~ 进行加油", ['open_refuel'] = "按下 ~INPUT_CONTEXT~ 进行加油",
['open_recharge'] = "按下 ~INPUT_CONTEXT~ 进行充电", ['open_recharge'] = "按下 ~INPUT_CONTEXT~ 进行充电",
['interact_with_vehicle'] = "按下 ~y~E~w~ 与车辆交互", ['interact_with_vehicle'] = "按下 ~y~E~w~ 与车辆交互",
['return_nozzle'] = "按下 ~INPUT_CONTEXT~ 归还油枪", ['return_nozzle'] = "按下 ~INPUT_CONTEXT~ 归还油枪",
}, },
['target'] = { ['target'] = {
['open_refuel'] = "进行加油", ['open_refuel'] = "进行加油",
['open_recharge'] = "进行充电", ['open_recharge'] = "进行充电",
['start_refuel'] = "开始加油", ['start_refuel'] = "开始加油",
['stop_refuel'] = "终止加油", ['stop_refuel'] = "终止加油",
['return_nozzle'] = "归还油枪", ['return_nozzle'] = "归还油枪",
}, },
['blip_text'] = "加油站", ['blip_text'] = "加油站",
['not_enough_refuel'] = "您已用完所支付的燃油。如需继续,请购买更多燃油", ['not_enough_refuel'] = "您已用完所支付的燃油。如需继续,请购买更多燃油",
['invalid_value'] = "无效数值", ['invalid_value'] = "无效数值",
['not_enough_money'] = "您的账户余额不足支付当前金额 ($%s) ", ['not_enough_money'] = "您的账户余额不足支付当前金额 ($%s) ",
['not_enough_stock'] = "本站点当前无充足库存完成该操作", ['not_enough_stock'] = "本站点当前无充足库存完成该操作",
['refuel_paid'] = "本次燃油补给消费 $%s", ['refuel_paid'] = "本次燃油补给消费 $%s",
['returned_fuel'] = "你已归还%s升燃料并收到$%s", ['returned_fuel'] = "你已归还%s升燃料并收到$%s",
['returned_charge'] = "你已归还%skWh电量并收到$%s", ['returned_charge'] = "你已归还%skWh电量并收到$%s",
['jerry_can_paid'] = "本次便携油桶购买消费 $%s", ['jerry_can_paid'] = "本次便携油桶购买消费 $%s",
['too_far_away'] = "您与加油设备间距超出操作范围!", ['too_far_away'] = "您与加油设备间距超出操作范围!",
['vehicle_refueled'] = "车辆成功加注燃油 %s 升(L)", ['vehicle_refueled'] = "车辆成功加注燃油 %s 升(L)",
['vehicle_recharged'] = "车辆成功充入电能 %s 千瓦时(kWh)", ['vehicle_recharged'] = "车辆成功充入电能 %s 千瓦时(kWh)",
['vehicle_tank_full'] = "车辆油箱已达最大容量", ['vehicle_tank_full'] = "车辆油箱已达最大容量",
['vehicle_tank_emptied'] = "车辆油箱燃油已全部清空", ['vehicle_tank_emptied'] = "车辆油箱燃油已全部清空",
['vehicle_not_found'] = "未检测到关联载具", ['vehicle_not_found'] = "未检测到关联载具",
['pump_not_found'] = "未检测到可用加油设备", ['pump_not_found'] = "未检测到可用加油设备",
['vehicle_wrong_fuel'] = "误用燃油类型导致车辆受损, 请立即停止操作!", ['vehicle_wrong_fuel'] = "误用燃油类型导致车辆受损, 请立即停止操作!",
['incompatible_fuel'] = "燃油类型与车辆配置不匹配,请选择适配的加油方案.", ['incompatible_fuel'] = "燃油类型与车辆配置不匹配,请选择适配的加油方案.",
['owned_gas_stations'] = { ['owned_gas_stations'] = {
['balance_jerry_can'] = "便携式油桶销售量 (%s 升)", ['balance_jerry_can'] = "便携式油桶销售量 (%s 升)",
['balance_fuel'] = "燃油销售总量 (%s 升)", ['balance_fuel'] = "燃油销售总量 (%s 升)",
['balance_electric'] = "电能销售收入 (%s 千瓦时)", ['balance_electric'] = "电能销售收入 (%s 千瓦时)",
['refund_fuel'] = "燃料已退款(%s 升)", ['refund_fuel'] = "燃料已退款(%s 升)",
['refund_electric'] = "电力已退款(%s 千瓦时)", ['refund_electric'] = "电力已退款(%s 千瓦时)",
} },
['fuel_types'] = {
['type_title'] = "燃料类型:%s",
['electric'] = "电动",
['regular'] = "92号燃油",
['plus'] = "95号燃油",
['premium'] = "98号燃油",
['diesel'] = "柴油",
},
} }

File diff suppressed because it is too large Load diff

View file

@ -1,85 +1,85 @@
if (Lang == undefined) { if (Lang == undefined) {
var Lang = []; var Lang = [];
} }
Lang["de"] = { Lang["de"] = {
pumpInterface: { pumpInterface: {
stationStock: "{0} L", stationStock: "{0} L",
vehicleFuel: "{0} L", vehicleFuel: "{0} L",
confirm: "Bestätigen", confirm: "Bestätigen",
vehicleFuelTooltip: "Aktueller Kraftstoff / Tankkapazität", vehicleFuelTooltip: "Aktueller Kraftstoff / Tankkapazität",
fuelTypes: { fuelTypes: {
regular: "Regulär", regular: "Regulär",
plus: "Plus", plus: "Plus",
premium: "Premium", premium: "Premium",
diesel: "Diesel", diesel: "Diesel",
}, },
}, },
pumpRefuelDisplay: { pumpRefuelDisplay: {
liters: "L", liters: "L",
carTank: "Autotank", carTank: "Autotank",
remaining: "Übrig", remaining: "Übrig",
}, },
confirmRefuelModal: { confirmRefuelModal: {
title: "Bestätigen Sie „Tanken“.", title: "Bestätigen Sie „Tanken“.",
description: "Sie kaufen {0}L {1} Kraftstoff für {2}.", description: "Sie kaufen {0}L {1} Kraftstoff für {2}.",
paymentBank: "Bezahlen Sie mit der Bank", paymentBank: "Bezahlen Sie mit der Bank",
paymentCash: "Bezahlen Sie mit Bargeld", paymentCash: "Bezahlen Sie mit Bargeld",
}, },
confirmBuyJerryCanModal: { confirmBuyJerryCanModal: {
title: "Kauf Bestätigen", title: "Kauf Bestätigen",
paymentBank: "Bezahlen Sie mit der Bank", paymentBank: "Bezahlen Sie mit der Bank",
paymentCash: "Bezahlen Sie mit Bargeld", paymentCash: "Bezahlen Sie mit Bargeld",
}, },
confirmFuelChangeModal: { confirmFuelChangeModal: {
title: "Kraftstoffe können nicht gemischt werden", title: "Kraftstoffe können nicht gemischt werden",
description: "⚠️ Kraftstoffe können nicht gemischt werden", description: "⚠️ Kraftstoffe können nicht gemischt werden",
}, },
electricInterface: { electricInterface: {
chargerType: { chargerType: {
title: "LADEGERÄTETYP", title: "LADEGERÄTETYP",
fast: { fast: {
title: "SCHNELL", title: "SCHNELL",
power: "220kW", power: "220kW",
}, },
normal: { normal: {
title: "NORMAL", title: "NORMAL",
power: "100kW", power: "100kW",
}, },
pricePerKWh: "{0}/kWh", pricePerKWh: "{0}/kWh",
}, },
chargerAmount: { chargerAmount: {
title: "BETRAG WÄHLEN", title: "BETRAG WÄHLEN",
typeSelected: "{0} AUSGEWÄHLT", typeSelected: "{0} AUSGEWÄHLT",
placeholder: "Menge", placeholder: "Menge",
timeToRechargeText: "Zeit zum Aufladen:", timeToRechargeText: "Zeit zum Aufladen:",
timeToRechargeValue: "{0} min {1} sec", timeToRechargeValue: "{0} min {1} sec",
}, },
chargerPayment: { chargerPayment: {
title: "Bezahlmethode", title: "Bezahlmethode",
money: "Bar", money: "Bar",
bank: "Karte", bank: "Karte",
payButton: "Bezahlen {0}", payButton: "Bezahlen {0}",
}, },
continueButton: "Bestätigen", continueButton: "Bestätigen",
outOfStock: "Ausverkauft", outOfStock: "Ausverkauft",
}, },
rechargerDisplay: { rechargerDisplay: {
title: "AUFLADEN...", title: "AUFLADEN...",
remainingTimeText: "VERBLEIBENDE ZEIT", remainingTimeText: "VERBLEIBENDE ZEIT",
remainingTimeValue: "{0} min {1} sek", remainingTimeValue: "{0} min {1} sek",
}, },
fuelConsumptionChart: { fuelConsumptionChart: {
title: "Kraftstoffverbrauchsdiagramm", title: "Kraftstoffverbrauchsdiagramm",
chartLabels: { chartLabels: {
fuel: "Kraftstoff (%)", fuel: "Kraftstoff (%)",
speed: "Geschwindigkeit (km/h)", speed: "Geschwindigkeit (km/h)",
consumption: "Verbrauch (L/s)", consumption: "Verbrauch (L/s)",
shortSeconds: "{0}s", shortSeconds: "{0}s",
}, },
footer: { footer: {
focus: "F3 zum Fokussieren umschalten", focus: "F3 zum Fokussieren umschalten",
toggleRecording: "Aufnahme umschalten", toggleRecording: "Aufnahme umschalten",
recordsLength: "Verlaufslänge ({0}s)", recordsLength: "Verlaufslänge ({0}s)",
}, },
}, },
}; };

View file

@ -1,85 +1,85 @@
if (Lang == undefined) { if (Lang == undefined) {
var Lang = []; var Lang = [];
} }
Lang["en"] = { Lang["en"] = {
pumpInterface: { pumpInterface: {
stationStock: "{0} L", stationStock: "{0} L",
vehicleFuel: "{0} L", vehicleFuel: "{0} L",
confirm: "CONFIRM", confirm: "CONFIRM",
vehicleFuelTooltip: "Current Fuel / Tank Capacity", vehicleFuelTooltip: "Current Fuel / Tank Capacity",
fuelTypes: { fuelTypes: {
regular: "Regular", regular: "Regular",
plus: "Plus", plus: "Plus",
premium: "Premium", premium: "Premium",
diesel: "Diesel", diesel: "Diesel",
}, },
}, },
pumpRefuelDisplay: { pumpRefuelDisplay: {
liters: "L", liters: "L",
carTank: "Car Tank", carTank: "Car Tank",
remaining: "Remaining", remaining: "Remaining",
}, },
confirmRefuelModal: { confirmRefuelModal: {
title: "Confirm Refuel", title: "Confirm Refuel",
description: "You are purchasing {0}L of {1} fuel for {2}.", description: "You are purchasing {0}L of {1} fuel for {2}.",
paymentBank: "Pay with bank", paymentBank: "Pay with bank",
paymentCash: "Pay with cash", paymentCash: "Pay with cash",
}, },
confirmBuyJerryCanModal: { confirmBuyJerryCanModal: {
title: "Confirm Purchase", title: "Confirm Purchase",
paymentBank: "Pay with bank", paymentBank: "Pay with bank",
paymentCash: "Pay with cash", paymentCash: "Pay with cash",
}, },
confirmFuelChangeModal: { confirmFuelChangeModal: {
title: "Fuels cannot be mixed", title: "Fuels cannot be mixed",
description: "⚠️ To change the fuel type in your vehicle, the tank will be emptied.", description: "⚠️ To change the fuel type in your vehicle, the tank will be emptied.",
}, },
electricInterface: { electricInterface: {
chargerType: { chargerType: {
title: "CHARGER TYPE", title: "CHARGER TYPE",
fast: { fast: {
title: "FAST", title: "FAST",
power: "220kW", power: "220kW",
}, },
normal: { normal: {
title: "NORMAL", title: "NORMAL",
power: "100kW", power: "100kW",
}, },
pricePerKWh: "{0}/kWh", pricePerKWh: "{0}/kWh",
}, },
chargerAmount: { chargerAmount: {
title: "SELECT AMOUNT", title: "SELECT AMOUNT",
typeSelected: "{0} CHARGER", typeSelected: "{0} CHARGER",
placeholder: "Amount", placeholder: "Amount",
timeToRechargeText: "Time to recharge:", timeToRechargeText: "Time to recharge:",
timeToRechargeValue: "{0} min {1} sec", timeToRechargeValue: "{0} min {1} sec",
}, },
chargerPayment: { chargerPayment: {
title: "PAYMENT METHOD", title: "PAYMENT METHOD",
money: "MONEY", money: "MONEY",
bank: "BANK", bank: "BANK",
payButton: "PAY {0}", payButton: "PAY {0}",
}, },
continueButton: "CONTINUE", continueButton: "CONTINUE",
outOfStock: "Out of stock", outOfStock: "Out of stock",
}, },
rechargerDisplay: { rechargerDisplay: {
title: "CHARGING...", title: "CHARGING...",
remainingTimeText: "REMAINING TIME", remainingTimeText: "REMAINING TIME",
remainingTimeValue: "{0} min {1} sec", remainingTimeValue: "{0} min {1} sec",
}, },
fuelConsumptionChart: { fuelConsumptionChart: {
title: "Fuel consumption chart", title: "Fuel consumption chart",
chartLabels: { chartLabels: {
fuel: "Fuel (%)", fuel: "Fuel (%)",
speed: "Speed (km/h)", speed: "Speed (km/h)",
consumption: "Consumption (L/s)", consumption: "Consumption (L/s)",
shortSeconds: "{0}s", shortSeconds: "{0}s",
}, },
footer: { footer: {
focus: "F3 to toggle focus", focus: "F3 to toggle focus",
toggleRecording: "Toggle Recording", toggleRecording: "Toggle Recording",
recordsLength: "History Length ({0}s)", recordsLength: "History Length ({0}s)",
}, },
}, },
}; };

View file

@ -1,85 +1,85 @@
if (Lang == undefined) { if (Lang == undefined) {
var Lang = []; var Lang = [];
} }
Lang["es"] = { Lang["es"] = {
pumpInterface: { pumpInterface: {
stationStock: "{0} L", stationStock: "{0} L",
vehicleFuel: "{0} L", vehicleFuel: "{0} L",
confirm: "CONFIRMAR", confirm: "CONFIRMAR",
vehicleFuelTooltip: "Combustible actual / Capacidad del tanque", vehicleFuelTooltip: "Combustible actual / Capacidad del tanque",
fuelTypes: { fuelTypes: {
regular: "Sin plomo", regular: "Sin plomo",
plus: "Plus", plus: "Plus",
premium: "Premium", premium: "Premium",
diesel: "Diésel", diesel: "Diésel",
}, },
}, },
pumpRefuelDisplay: { pumpRefuelDisplay: {
liters: "L", liters: "L",
carTank: "Depósito del coche", carTank: "Depósito del coche",
remaining: "Restante", remaining: "Restante",
}, },
confirmRefuelModal: { confirmRefuelModal: {
title: "Confirmar Repostaje", title: "Confirmar Repostaje",
description: "Estás comprando {0}L de combustible {1} por {2}.", description: "Estás comprando {0}L de combustible {1} por {2}.",
paymentBank: "Pagar con el banco", paymentBank: "Pagar con el banco",
paymentCash: "Pagar en efectivo", paymentCash: "Pagar en efectivo",
}, },
confirmBuyJerryCanModal: { confirmBuyJerryCanModal: {
title: "Confirmar Compra", title: "Confirmar Compra",
paymentBank: "Pagar con el banco", paymentBank: "Pagar con el banco",
paymentCash: "Pagar en efectivo", paymentCash: "Pagar en efectivo",
}, },
confirmFuelChangeModal: { confirmFuelChangeModal: {
title: "No se pueden mezclar combustibles", title: "No se pueden mezclar combustibles",
description: "⚠️ Para cambiar el tipo de combustible en tu vehículo, el depósito se vaciará.", description: "⚠️ Para cambiar el tipo de combustible en tu vehículo, el depósito se vaciará.",
}, },
electricInterface: { electricInterface: {
chargerType: { chargerType: {
title: "TIPO DE CARGADOR", title: "TIPO DE CARGADOR",
fast: { fast: {
title: "RÁPIDO", title: "RÁPIDO",
power: "220kW", power: "220kW",
}, },
normal: { normal: {
title: "NORMAL", title: "NORMAL",
power: "100kW", power: "100kW",
}, },
pricePerKWh: "{0}/kWh", pricePerKWh: "{0}/kWh",
}, },
chargerAmount: { chargerAmount: {
title: "SELECCIONAR CANTIDAD", title: "SELECCIONAR CANTIDAD",
typeSelected: "CARGADOR {0}", typeSelected: "CARGADOR {0}",
placeholder: "Cantidad", placeholder: "Cantidad",
timeToRechargeText: "Tiempo de recarga:", timeToRechargeText: "Tiempo de recarga:",
timeToRechargeValue: "{0} min {1} seg", timeToRechargeValue: "{0} min {1} seg",
}, },
chargerPayment: { chargerPayment: {
title: "MÉTODO DE PAGO", title: "MÉTODO DE PAGO",
money: "EFECTIVO", money: "EFECTIVO",
bank: "BANCO", bank: "BANCO",
payButton: "PAGAR {0}", payButton: "PAGAR {0}",
}, },
continueButton: "CONTINUAR", continueButton: "CONTINUAR",
outOfStock: "Sin stock", outOfStock: "Sin stock",
}, },
rechargerDisplay: { rechargerDisplay: {
title: "CARGANDO...", title: "CARGANDO...",
remainingTimeText: "TIEMPO RESTANTE", remainingTimeText: "TIEMPO RESTANTE",
remainingTimeValue: "{0} min {1} seg", remainingTimeValue: "{0} min {1} seg",
}, },
fuelConsumptionChart: { fuelConsumptionChart: {
title: "Gráfico de consumo de combustible", title: "Gráfico de consumo de combustible",
chartLabels: { chartLabels: {
fuel: "Combustible (%)", fuel: "Combustible (%)",
speed: "Velocidad (km/h)", speed: "Velocidad (km/h)",
consumption: "Consumo (L/s)", consumption: "Consumo (L/s)",
shortSeconds: "{0}s", shortSeconds: "{0}s",
}, },
footer: { footer: {
focus: "F3 para alternar enfoque", focus: "F3 para alternar enfoque",
toggleRecording: "Alternar grabación", toggleRecording: "Alternar grabación",
recordsLength: "Duración del historial ({0}s)", recordsLength: "Duración del historial ({0}s)",
}, },
}, },
}; };

View file

@ -1,85 +1,85 @@
if (Lang == undefined) { if (Lang == undefined) {
var Lang = []; var Lang = [];
} }
Lang["fr"] = { Lang["fr"] = {
pumpInterface: { pumpInterface: {
stationStock: "{0} L", stationStock: "{0} L",
vehicleFuel: "{0} L", vehicleFuel: "{0} L",
confirm: "CONFIRMER", confirm: "CONFIRMER",
vehicleFuelTooltip: "Carburant actuel / Capacité du réservoir", vehicleFuelTooltip: "Carburant actuel / Capacité du réservoir",
fuelTypes: { fuelTypes: {
regular: "Ordinaire", regular: "Ordinaire",
plus: "Plus", plus: "Plus",
premium: "Premium", premium: "Premium",
diesel: "Diesel", diesel: "Diesel",
}, },
}, },
pumpRefuelDisplay: { pumpRefuelDisplay: {
liters: "L", liters: "L",
carTank: "Réservoir", carTank: "Réservoir",
remaining: "Restant", remaining: "Restant",
}, },
confirmRefuelModal: { confirmRefuelModal: {
title: "Confirmer le ravitaillement", title: "Confirmer le ravitaillement",
description: "Vous achetez {0} L de carburant {1} pour {2}.", description: "Vous achetez {0} L de carburant {1} pour {2}.",
paymentBank: "Payer avec la banque", paymentBank: "Payer avec la banque",
paymentCash: "Payer en espèces", paymentCash: "Payer en espèces",
}, },
confirmBuyJerryCanModal: { confirmBuyJerryCanModal: {
title: "Confirmer l'achat", title: "Confirmer l'achat",
paymentBank: "Payer avec la banque", paymentBank: "Payer avec la banque",
paymentCash: "Payer en espèces", paymentCash: "Payer en espèces",
}, },
confirmFuelChangeModal: { confirmFuelChangeModal: {
title: "Les carburants ne peuvent pas être mélangés", title: "Les carburants ne peuvent pas être mélangés",
description: "⚠️ Pour changer le type de carburant dans votre véhicule, le réservoir sera vidé.", description: "⚠️ Pour changer le type de carburant dans votre véhicule, le réservoir sera vidé.",
}, },
electricInterface: { electricInterface: {
chargerType: { chargerType: {
title: "TYPE DE CHARGEUR", title: "TYPE DE CHARGEUR",
fast: { fast: {
title: "RAPIDE", title: "RAPIDE",
power: "220kW", power: "220kW",
}, },
normal: { normal: {
title: "NORMAL", title: "NORMAL",
power: "100kW", power: "100kW",
}, },
pricePerKWh: "{0}/kWh", pricePerKWh: "{0}/kWh",
}, },
chargerAmount: { chargerAmount: {
title: "SÉLECTIONNER LA QUANTITÉ", title: "SÉLECTIONNER LA QUANTITÉ",
typeSelected: "{0} CHARGEUR", typeSelected: "{0} CHARGEUR",
placeholder: "Quantité", placeholder: "Quantité",
timeToRechargeText: "Temps pour recharger :", timeToRechargeText: "Temps pour recharger :",
timeToRechargeValue: "{0} min {1} sec", timeToRechargeValue: "{0} min {1} sec",
}, },
chargerPayment: { chargerPayment: {
title: "MODE DE PAIEMENT", title: "MODE DE PAIEMENT",
money: "ESPÈCES", money: "ESPÈCES",
bank: "BANQUE", bank: "BANQUE",
payButton: "PAYER {0}", payButton: "PAYER {0}",
}, },
continueButton: "CONTINUER", continueButton: "CONTINUER",
outOfStock: "Rupture de stock", outOfStock: "Rupture de stock",
}, },
rechargerDisplay: { rechargerDisplay: {
title: "CHARGE EN COURS...", title: "CHARGE EN COURS...",
remainingTimeText: "TEMPS RESTANT", remainingTimeText: "TEMPS RESTANT",
remainingTimeValue: "{0} min {1} sec", remainingTimeValue: "{0} min {1} sec",
}, },
fuelConsumptionChart: { fuelConsumptionChart: {
title: "Graphique de consommation de carburant", title: "Graphique de consommation de carburant",
chartLabels: { chartLabels: {
fuel: "Carburant (%)", fuel: "Carburant (%)",
speed: "Vitesse (km/h)", speed: "Vitesse (km/h)",
consumption: "Consommation (L/s)", consumption: "Consommation (L/s)",
shortSeconds: "{0}s", shortSeconds: "{0}s",
}, },
footer: { footer: {
focus: "F3 pour basculer le focus", focus: "F3 pour basculer le focus",
toggleRecording: "Activer/Désactiver lenregistrement", toggleRecording: "Activer/Désactiver lenregistrement",
recordsLength: "Durée de lhistorique ({0}s)", recordsLength: "Durée de lhistorique ({0}s)",
}, },
}, },
}; };

View file

@ -1,85 +1,85 @@
if (Lang == undefined) { if (Lang == undefined) {
var Lang = []; var Lang = [];
} }
Lang["ja"] = { Lang["ja"] = {
pumpInterface: { pumpInterface: {
stationStock: "{0} L", stationStock: "{0} L",
vehicleFuel: "{0} L", vehicleFuel: "{0} L",
confirm: "確認", confirm: "確認",
vehicleFuelTooltip: "現在の燃料 / タンク容量", vehicleFuelTooltip: "現在の燃料 / タンク容量",
fuelTypes: { fuelTypes: {
regular: "レギュラー", regular: "レギュラー",
plus: "プラス", plus: "プラス",
premium: "プレミアム", premium: "プレミアム",
diesel: "ディーゼル", diesel: "ディーゼル",
}, },
}, },
pumpRefuelDisplay: { pumpRefuelDisplay: {
liters: "L", liters: "L",
carTank: "自動車タンク", carTank: "自動車タンク",
remaining: "残り", remaining: "残り",
}, },
confirmRefuelModal: { confirmRefuelModal: {
title: "給油の確認", title: "給油の確認",
description: "{0}Lの{1}を{2}で購入します。", description: "{0}Lの{1}を{2}で購入します。",
paymentBank: "銀行で支払う", paymentBank: "銀行で支払う",
paymentCash: "現金で支払う", paymentCash: "現金で支払う",
}, },
confirmBuyJerryCanModal: { confirmBuyJerryCanModal: {
title: "購入を確認する", title: "購入を確認する",
paymentBank: "銀行で支払う", paymentBank: "銀行で支払う",
paymentCash: "現金で支払う", paymentCash: "現金で支払う",
}, },
confirmFuelChangeModal: { confirmFuelChangeModal: {
title: "燃料の混合はできません", title: "燃料の混合はできません",
description: "⚠️ 燃料の種類を変更する場合はタンクを空にしてください。", description: "⚠️ 燃料の種類を変更する場合はタンクを空にしてください。",
}, },
electricInterface: { electricInterface: {
chargerType: { chargerType: {
title: "チャージャータイプ", title: "チャージャータイプ",
fast: { fast: {
title: "高速", title: "高速",
power: "220kW", power: "220kW",
}, },
normal: { normal: {
title: "普通", title: "普通",
power: "100kW", power: "100kW",
}, },
pricePerKWh: "{0}/kWh", pricePerKWh: "{0}/kWh",
}, },
chargerAmount: { chargerAmount: {
title: "金額選択", title: "金額選択",
typeSelected: "{0}チャージャー", typeSelected: "{0}チャージャー",
placeholder: "金額", placeholder: "金額",
timeToRechargeText: "充電時間:", timeToRechargeText: "充電時間:",
timeToRechargeValue: "{0} 分 {1} 秒", timeToRechargeValue: "{0} 分 {1} 秒",
}, },
chargerPayment: { chargerPayment: {
title: "支払い方法", title: "支払い方法",
money: "現金", money: "現金",
bank: "銀行", bank: "銀行",
payButton: "{0}で支払う", payButton: "{0}で支払う",
}, },
continueButton: "決定", continueButton: "決定",
outOfStock: "在庫切れ", outOfStock: "在庫切れ",
}, },
rechargerDisplay: { rechargerDisplay: {
title: "充電中・・・", title: "充電中・・・",
remainingTimeText: "残り時間", remainingTimeText: "残り時間",
remainingTimeValue: "{0} 分 {1} 秒", remainingTimeValue: "{0} 分 {1} 秒",
}, },
fuelConsumptionChart: { fuelConsumptionChart: {
title: "燃料消費チャート", title: "燃料消費チャート",
chartLabels: { chartLabels: {
fuel: "燃料 (%)", fuel: "燃料 (%)",
speed: "速度 (km/h)", speed: "速度 (km/h)",
consumption: "消費量 (L/s)", consumption: "消費量 (L/s)",
shortSeconds: "{0}秒", shortSeconds: "{0}秒",
}, },
footer: { footer: {
focus: "F3でフォーカス切替", focus: "F3でフォーカス切替",
toggleRecording: "記録の切り替え", toggleRecording: "記録の切り替え",
recordsLength: "履歴の長さ ({0}秒)", recordsLength: "履歴の長さ ({0}秒)",
}, },
}, },
}; };

View file

@ -1,85 +1,85 @@
if (Lang == undefined) { if (Lang == undefined) {
var Lang = []; var Lang = [];
} }
Lang["tr"] = { Lang["tr"] = {
pumpInterface: { pumpInterface: {
stationStock: "{0} L", stationStock: "{0} L",
vehicleFuel: "{0} L", vehicleFuel: "{0} L",
confirm: "ONAYLA", confirm: "ONAYLA",
vehicleFuelTooltip: "Mevcut Yakıt / Depo Kapasitesi", vehicleFuelTooltip: "Mevcut Yakıt / Depo Kapasitesi",
fuelTypes: { fuelTypes: {
regular: "Normal", regular: "Normal",
plus: "Plus", plus: "Plus",
premium: "Premium", premium: "Premium",
diesel: "Dizel", diesel: "Dizel",
}, },
}, },
pumpRefuelDisplay: { pumpRefuelDisplay: {
liters: "L", liters: "L",
carTank: "Araç Deposu", carTank: "Araç Deposu",
remaining: "Kalan", remaining: "Kalan",
}, },
confirmRefuelModal: { confirmRefuelModal: {
title: "Yakıt Alımını Onayla", title: "Yakıt Alımını Onayla",
description: "{0}L {1} yakıtı {2} karşılığında satın alıyorsunuz.", description: "{0}L {1} yakıtı {2} karşılığında satın alıyorsunuz.",
paymentBank: "Banka ile öde", paymentBank: "Banka ile öde",
paymentCash: "Nakit ile öde", paymentCash: "Nakit ile öde",
}, },
confirmBuyJerryCanModal: { confirmBuyJerryCanModal: {
title: "Satın Alımı Onayla", title: "Satın Alımı Onayla",
paymentBank: "Banka ile öde", paymentBank: "Banka ile öde",
paymentCash: "Nakit ile öde", paymentCash: "Nakit ile öde",
}, },
confirmFuelChangeModal: { confirmFuelChangeModal: {
title: "Yakıtlar Karıştırılamaz", title: "Yakıtlar Karıştırılamaz",
description: "⚠️ Araçtaki yakıt türünü değiştirmek için depo boşaltılacaktır.", description: "⚠️ Araçtaki yakıt türünü değiştirmek için depo boşaltılacaktır.",
}, },
electricInterface: { electricInterface: {
chargerType: { chargerType: {
title: "ŞARJ CİHAZI TÜRÜ", title: "ŞARJ CİHAZI TÜRÜ",
fast: { fast: {
title: "HIZLI", title: "HIZLI",
power: "220kW", power: "220kW",
}, },
normal: { normal: {
title: "NORMAL", title: "NORMAL",
power: "100kW", power: "100kW",
}, },
pricePerKWh: "{0}/kWh", pricePerKWh: "{0}/kWh",
}, },
chargerAmount: { chargerAmount: {
title: "MİKTAR SEÇİN", title: "MİKTAR SEÇİN",
typeSelected: "{0} ŞARJ CİHAZI", typeSelected: "{0} ŞARJ CİHAZI",
placeholder: "Miktar", placeholder: "Miktar",
timeToRechargeText: "Şarj süresi:", timeToRechargeText: "Şarj süresi:",
timeToRechargeValue: "{0} dk {1} sn", timeToRechargeValue: "{0} dk {1} sn",
}, },
chargerPayment: { chargerPayment: {
title: "ÖDEME YÖNTEMİ", title: "ÖDEME YÖNTEMİ",
money: "NAKİT", money: "NAKİT",
bank: "BANKA", bank: "BANKA",
payButton: "{0} ÖDE", payButton: "{0} ÖDE",
}, },
continueButton: "DEVAM", continueButton: "DEVAM",
outOfStock: "Stokta yok", outOfStock: "Stokta yok",
}, },
rechargerDisplay: { rechargerDisplay: {
title: "ŞARJ EDİLİYOR...", title: "ŞARJ EDİLİYOR...",
remainingTimeText: "KALAN SÜRE", remainingTimeText: "KALAN SÜRE",
remainingTimeValue: "{0} dk {1} sn", remainingTimeValue: "{0} dk {1} sn",
}, },
fuelConsumptionChart: { fuelConsumptionChart: {
title: "Yakıt tüketim grafiği", title: "Yakıt tüketim grafiği",
chartLabels: { chartLabels: {
fuel: "Yakıt (%)", fuel: "Yakıt (%)",
speed: "Hız (km/s)", speed: "Hız (km/s)",
consumption: "Tüketim (L/s)", consumption: "Tüketim (L/s)",
shortSeconds: "{0}s", shortSeconds: "{0}s",
}, },
footer: { footer: {
focus: "Odağı değiştirmek için F3", focus: "Odağı değiştirmek için F3",
toggleRecording: "Kaydı Aç/Kapat", toggleRecording: "Kaydı Aç/Kapat",
recordsLength: "Geçmiş Uzunluğu ({0}s)", recordsLength: "Geçmiş Uzunluğu ({0}s)",
}, },
}, },
}; };

View file

@ -1,85 +1,85 @@
if (Lang == undefined) { if (Lang == undefined) {
var Lang = []; var Lang = [];
} }
Lang["zh-cn"] = { Lang["zh-cn"] = {
pumpInterface: { pumpInterface: {
stationStock: "{0} 升(L)", stationStock: "{0} 升(L)",
vehicleFuel: "{0} 升(L)", vehicleFuel: "{0} 升(L)",
confirm: "确认", confirm: "确认",
vehicleFuelTooltip: "当前燃料 / 油箱容量", vehicleFuelTooltip: "当前燃料 / 油箱容量",
fuelTypes: { fuelTypes: {
regular: "92号燃油", regular: "92号燃油",
plus: "95号燃油", plus: "95号燃油",
premium: "98号燃油", premium: "98号燃油",
diesel: "柴油", diesel: "柴油",
}, },
}, },
pumpRefuelDisplay: { pumpRefuelDisplay: {
liters: "升(L)", liters: "升(L)",
carTank: "车辆油箱", carTank: "车辆油箱",
remaining: "剩余容量", remaining: "剩余容量",
}, },
confirmRefuelModal: { confirmRefuelModal: {
title: "加油确认", title: "加油确认",
description: "您正在为车牌号 {2} 的车辆补充 {0} 升 {1} 类燃油", description: "您正在为车牌号 {2} 的车辆补充 {0} 升 {1} 类燃油",
paymentBank: "银行结算", paymentBank: "银行结算",
paymentCash: "现金结算", paymentCash: "现金结算",
}, },
confirmBuyJerryCanModal: { confirmBuyJerryCanModal: {
title: "确认购买", title: "确认购买",
paymentBank: "银行结算", paymentBank: "银行结算",
paymentCash: "现金结算", paymentCash: "现金结算",
}, },
confirmFuelChangeModal: { confirmFuelChangeModal: {
title: "燃油类型变更提示", title: "燃油类型变更提示",
description: "⚠️ 更换燃油种类前请确保油箱完全排空", description: "⚠️ 更换燃油种类前请确保油箱完全排空",
}, },
electricInterface: { electricInterface: {
chargerType: { chargerType: {
title: "充电规格选择", title: "充电规格选择",
fast: { fast: {
title: "极速充电", title: "极速充电",
power: "220kW", power: "220kW",
}, },
normal: { normal: {
title: "标准充电", title: "标准充电",
power: "100kW", power: "100kW",
}, },
pricePerKWh: "{0}/kWh", pricePerKWh: "{0}/kWh",
}, },
chargerAmount: { chargerAmount: {
title: "充电金额设定", title: "充电金额设定",
typeSelected: "充电桩 {0} 台", typeSelected: "充电桩 {0} 台",
placeholder: "输入金额", placeholder: "输入金额",
timeToRechargeText: "预计充电时长:", timeToRechargeText: "预计充电时长:",
timeToRechargeValue: "{0} 分 {1} 秒", timeToRechargeValue: "{0} 分 {1} 秒",
}, },
chargerPayment: { chargerPayment: {
title: "支付方式选择", title: "支付方式选择",
money: "现金结算", money: "现金结算",
bank: "银行解锁", bank: "银行解锁",
payButton: "支付 {0}", payButton: "支付 {0}",
}, },
continueButton: "下一步", continueButton: "下一步",
outOfStock: "库存不足", outOfStock: "库存不足",
}, },
rechargerDisplay: { rechargerDisplay: {
title: "充电中...", title: "充电中...",
remainingTimeText: "剩余充电时间", remainingTimeText: "剩余充电时间",
remainingTimeValue: "{0} 分 {1} 秒", remainingTimeValue: "{0} 分 {1} 秒",
}, },
fuelConsumptionChart: { fuelConsumptionChart: {
title: "燃料消耗图表", title: "燃料消耗图表",
chartLabels: { chartLabels: {
fuel: "燃料 (%)", fuel: "燃料 (%)",
speed: "速度 (km/h)", speed: "速度 (km/h)",
consumption: "消耗 (L/s)", consumption: "消耗 (L/s)",
shortSeconds: "{0}秒", shortSeconds: "{0}秒",
}, },
footer: { footer: {
focus: "按F3切换焦点", focus: "按F3切换焦点",
toggleRecording: "切换录制", toggleRecording: "切换录制",
recordsLength: "历史长度({0}秒)", recordsLength: "历史长度({0}秒)",
}, },
}, },
}; };

File diff suppressed because it is too large Load diff

File diff suppressed because one or more lines are too long

View file

@ -1,279 +1,279 @@
<html> <html>
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<!-- Google Fonts --> <!-- Google Fonts -->
<link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Lexend+Zetta:wght@100..900&family=Lexend:wght@100..900&display=swap" rel="stylesheet"> <link href="https://fonts.googleapis.com/css2?family=Lexend+Zetta:wght@100..900&family=Lexend:wght@100..900&display=swap" rel="stylesheet">
<link href="https://fonts.googleapis.com/css2?family=Montserrat&display=swap" rel="stylesheet"> <link href="https://fonts.googleapis.com/css2?family=Montserrat&display=swap" rel="stylesheet">
<link href="https://fonts.googleapis.com/css2?family=Montserrat:wght@600;700&display=swap" rel="stylesheet"> <link href="https://fonts.googleapis.com/css2?family=Montserrat:wght@600;700&display=swap" rel="stylesheet">
<link href="https://fonts.googleapis.com/css2?family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&family=Lexend+Zetta:wght@100..900&family=Lexend:wght@100..900&display=swap" rel="stylesheet"> <link href="https://fonts.googleapis.com/css2?family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&family=Lexend+Zetta:wght@100..900&family=Lexend:wght@100..900&display=swap" rel="stylesheet">
<!-- jQuery --> <!-- jQuery -->
<script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.min.js"></script>
<script src="https://code.jquery.com/ui/1.14.1/jquery-ui.min.js"></script> <script src="https://code.jquery.com/ui/1.14.1/jquery-ui.min.js"></script>
<!-- Stylesheets --> <!-- Stylesheets -->
<link rel="stylesheet" href="css/style.css"> <link rel="stylesheet" href="css/style.css">
<!-- Chart JS --> <!-- Chart JS -->
<script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.1"></script> <script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.1"></script>
<script src="https://cdn.jsdelivr.net/npm/luxon@1.27.0"></script> <script src="https://cdn.jsdelivr.net/npm/luxon@1.27.0"></script>
<script src="https://cdn.jsdelivr.net/npm/chartjs-adapter-luxon@1.0.0"></script> <script src="https://cdn.jsdelivr.net/npm/chartjs-adapter-luxon@1.0.0"></script>
<script src="scripts/chartjs-plugin-streaming@2.0.0"></script> <script src="scripts/chartjs-plugin-streaming@2.0.0"></script>
<!-- Utils JavaScript --> <!-- Utils JavaScript -->
<script src="https://cfx-nui-lc_utils/nui/index.js" type="text/javascript"></script> <script src="https://cfx-nui-lc_utils/nui/index.js" type="text/javascript"></script>
<link rel="stylesheet" href="https://cfx-nui-lc_utils/nui/css/tooltip.css"> <link rel="stylesheet" href="https://cfx-nui-lc_utils/nui/css/tooltip.css">
</head> </head>
<body> <body>
<div id="gas-pump-container" class="gas-pump-container" style="display: none; zoom: 100%; overflow: hidden;"> <div id="gas-pump-container" class="gas-pump-container" style="display: none; zoom: 100%; overflow: hidden;">
<img id="gas-pump-container-image" src="images/gas_pump.png" alt="background" width="1920"> <img id="gas-pump-container-image" src="images/gas_pump.png" alt="background" width="1920">
<div class="gas-pump-interactive-button" onclick="openBuyJerryCanModal()"> <div class="gas-pump-interactive-button" onclick="openBuyJerryCanModal()">
<div class="gas-pump-interactive-inner-button"></div> <div class="gas-pump-interactive-inner-button"></div>
</div> </div>
<div class="gas-pump-elements-container"> <div class="gas-pump-elements-container">
<div class="gas-pump-values-container"> <div class="gas-pump-values-container">
<div class="controls-container"> <div class="controls-container">
<div></div> <div></div>
<button onclick="increaseZoom()">+</button> <button onclick="increaseZoom()">+</button>
<button onclick="decreaseZoom()">-</button> <button onclick="decreaseZoom()">-</button>
<!-- <button>?</button> --> <!-- <button>?</button> -->
</div> </div>
<div></div> <div></div>
<div class="amount-display-container"> <div class="amount-display-container">
<span class="digital-text dark price-per-liter"></span> <span class="digital-text dark price-per-liter"></span>
<div class="quantity-input-container"> <div class="quantity-input-container">
<button class="refuel-sub">-</button> <button class="refuel-sub">-</button>
<input id="input-fuel-amount" class="digital-text" type="text" value="1"> <input id="input-fuel-amount" class="digital-text" type="text" value="1">
<button class="refuel-add">+</button> <button class="refuel-add">+</button>
</div> </div>
<div class="stock-values-container"> <div class="stock-values-container">
<span class="digital-text station-stock"></span> <span class="digital-text station-stock"></span>
<span data-tooltip-location="bottom" data-tooltip="" class="digital-text vehicle-fuel"></span> <span data-tooltip-location="bottom" data-tooltip="" class="digital-text vehicle-fuel"></span>
</div> </div>
</div> </div>
<div class="money-display-container"> <div class="money-display-container">
<span class="digital-text-2 bank-balance"></span> <span class="digital-text-2 bank-balance"></span>
<span class="digital-text-2 cash-balance"></span> <span class="digital-text-2 cash-balance"></span>
<button class="confirm-button" onclick="confirmRefuel()"></button> <button class="confirm-button" onclick="confirmRefuel()"></button>
</div> </div>
<div></div> <div></div>
</div> </div>
<div class="gas-pump-fuel-list-container"> <div class="gas-pump-fuel-list-container">
<button class="fuel-type-button regular" onclick="changeSelectedFuelType('regular')"></button> <button class="fuel-type-button regular" onclick="changeSelectedFuelType('regular')"></button>
<button class="fuel-type-button plus" onclick="changeSelectedFuelType('plus')"></button> <button class="fuel-type-button plus" onclick="changeSelectedFuelType('plus')"></button>
<button class="fuel-type-button premium" onclick="changeSelectedFuelType('premium')"></button> <button class="fuel-type-button premium" onclick="changeSelectedFuelType('premium')"></button>
<button class="fuel-type-button diesel" onclick="changeSelectedFuelType('diesel')"></button> <button class="fuel-type-button diesel" onclick="changeSelectedFuelType('diesel')"></button>
</div> </div>
</div> </div>
</div> </div>
<div id="refuel-display" class="refuel-display-body" style="display: none;"> <div id="refuel-display" class="refuel-display-body" style="display: none;">
<div class="refuel-display-container"> <div class="refuel-display-container">
<div class="refuel-display-info-container" style="margin-top: 12px; margin-right: 5px;"> <div class="refuel-display-info-container" style="margin-top: 12px; margin-right: 5px;">
<span class="refuel-display-label" id="refuel-display-car-label"></span> <span class="refuel-display-label" id="refuel-display-car-label"></span>
<div> <div>
<span class="refuel-display-value" id="refuel-display-car-value"></span> <span class="refuel-display-value" id="refuel-display-car-value"></span>
<small class="refuel-display-liters"></small> <small class="refuel-display-liters"></small>
</div> </div>
</div> </div>
<div class="refuel-display-info-container" style="margin-top: 9px; margin-right: 5px;"> <div class="refuel-display-info-container" style="margin-top: 9px; margin-right: 5px;">
<span class="refuel-display-label" id="refuel-display-pump-label"></span> <span class="refuel-display-label" id="refuel-display-pump-label"></span>
<div> <div>
<span class="refuel-display-value" id="refuel-display-pump-value"></span> <span class="refuel-display-value" id="refuel-display-pump-value"></span>
<small class="refuel-display-liters"></small> <small class="refuel-display-liters"></small>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<div id="recharge-display" class="recharge-display-body" style="display: none;"> <div id="recharge-display" class="recharge-display-body" style="display: none;">
<div class="recharge-display-container"> <div class="recharge-display-container">
<div class="recharge-display-title-container"> <div class="recharge-display-title-container">
<h3 id="recharge-display-title"></h3> <h3 id="recharge-display-title"></h3>
</div> </div>
<div class="recharge-display-battery-container"> <div class="recharge-display-battery-container">
<span id="recharge-display-battery-level-span" style="width: 35px;"></span> <span id="recharge-display-battery-level-span" style="width: 35px;"></span>
<div class="recharge-display-battery-bar-container"> <div class="recharge-display-battery-bar-container">
<div class="recharge-display-battery-level"> <div class="recharge-display-battery-level">
<div id="recharge-display-battery-liquid" class="recharge-display-battery-liquid" style="width: 100%;"></div> <div id="recharge-display-battery-liquid" class="recharge-display-battery-liquid" style="width: 100%;"></div>
</div> </div>
</div> </div>
</div> </div>
<div class="recharge-display-remaining-time-container"> <div class="recharge-display-remaining-time-container">
<span id="recharge-display-remaining-time-title" class="recharge-display-remaining-time-title"></span> <span id="recharge-display-remaining-time-title" class="recharge-display-remaining-time-title"></span>
<span id="recharge-display-remaining-time-value" class="recharge-display-remaining-time-value"></span> <span id="recharge-display-remaining-time-value" class="recharge-display-remaining-time-value"></span>
</div> </div>
</div> </div>
</div> </div>
<div id="electric-charger-container" class="electric-charger-container" style="display: none; zoom: 100%; overflow: hidden;"> <div id="electric-charger-container" class="electric-charger-container" style="display: none; zoom: 100%; overflow: hidden;">
<img src="images/electric_charger.png" alt="background" width="1920"> <img src="images/electric_charger.png" alt="background" width="1920">
<div class="electric-charger-elements-container"> <div class="electric-charger-elements-container">
<div class="electric-charger-type-container" style="display: none;"> <div class="electric-charger-type-container" style="display: none;">
<h5 id="electric-charger-type-title" class="electric-charger-title"></h5> <h5 id="electric-charger-type-title" class="electric-charger-title"></h5>
<section class="electric-charger-buttons-container"> <section class="electric-charger-buttons-container">
<div id="electric-charger-fast-label-wrapper"> <div id="electric-charger-fast-label-wrapper">
<input class="electric-charger-type-input" type="radio" id="charger-type-fast" name="charger-type" value="fast" checked> <input class="electric-charger-type-input" type="radio" id="charger-type-fast" name="charger-type" value="fast" checked>
<label id="electric-charger-fast-label" class="electric-charger-type-label" for="charger-type-fast"> <label id="electric-charger-fast-label" class="electric-charger-type-label" for="charger-type-fast">
<svg xmlns="http://www.w3.org/2000/svg" width="49" height="49" viewBox="0 0 49 49" fill="#ffee00d8"><path d="M18.7644 47C18.5131 47.0002 18.2647 46.9454 18.0369 46.8394C17.809 46.7334 17.6071 46.5788 17.4454 46.3864C17.2837 46.194 17.166 45.9685 17.1007 45.7259C17.0355 45.4832 17.0241 45.2291 17.0675 44.9816V44.9712L19.7028 30.5H9.5C9.2168 30.5 8.9394 30.4198 8.69987 30.2687C8.46034 30.1176 8.26849 29.9018 8.14649 29.6462C8.02449 29.3906 7.97733 29.1057 8.01047 28.8245C8.04361 28.5432 8.15569 28.2771 8.33375 28.0569L28.8809 2.65625C29.1148 2.35936 29.4395 2.14725 29.8053 2.05235C30.1712 1.95745 30.558 1.98498 30.9067 2.13074C31.2554 2.27649 31.5468 2.53245 31.7363 2.85946C31.9257 3.18647 32.0029 3.56655 31.9559 3.94156C31.9559 3.96968 31.9484 3.99687 31.9437 4.025L29.2991 18.5H39.5C39.7832 18.5 40.0606 18.5802 40.3001 18.7313C40.5397 18.8824 40.7315 19.0982 40.8535 19.3538C40.9755 19.6094 41.0227 19.8943 40.9895 20.1755C40.9564 20.4568 40.8443 20.7229 40.6663 20.9431L20.1163 46.3438C19.9548 46.5478 19.7494 46.7127 19.5153 46.8264C19.2812 46.94 19.0246 46.9993 18.7644 47Z"/></svg> <svg xmlns="http://www.w3.org/2000/svg" width="49" height="49" viewBox="0 0 49 49" fill="#ffee00d8"><path d="M18.7644 47C18.5131 47.0002 18.2647 46.9454 18.0369 46.8394C17.809 46.7334 17.6071 46.5788 17.4454 46.3864C17.2837 46.194 17.166 45.9685 17.1007 45.7259C17.0355 45.4832 17.0241 45.2291 17.0675 44.9816V44.9712L19.7028 30.5H9.5C9.2168 30.5 8.9394 30.4198 8.69987 30.2687C8.46034 30.1176 8.26849 29.9018 8.14649 29.6462C8.02449 29.3906 7.97733 29.1057 8.01047 28.8245C8.04361 28.5432 8.15569 28.2771 8.33375 28.0569L28.8809 2.65625C29.1148 2.35936 29.4395 2.14725 29.8053 2.05235C30.1712 1.95745 30.558 1.98498 30.9067 2.13074C31.2554 2.27649 31.5468 2.53245 31.7363 2.85946C31.9257 3.18647 32.0029 3.56655 31.9559 3.94156C31.9559 3.96968 31.9484 3.99687 31.9437 4.025L29.2991 18.5H39.5C39.7832 18.5 40.0606 18.5802 40.3001 18.7313C40.5397 18.8824 40.7315 19.0982 40.8535 19.3538C40.9755 19.6094 41.0227 19.8943 40.9895 20.1755C40.9564 20.4568 40.8443 20.7229 40.6663 20.9431L20.1163 46.3438C19.9548 46.5478 19.7494 46.7127 19.5153 46.8264C19.2812 46.94 19.0246 46.9993 18.7644 47Z"/></svg>
<h2 id="electric-charger-type-fast"></h2> <h2 id="electric-charger-type-fast"></h2>
<div style="display: flex;flex-direction: column;"> <div style="display: flex;flex-direction: column;">
<div class="electric-charger-type-label-item-container"> <div class="electric-charger-type-label-item-container">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><path d="M96 0C78.3 0 64 14.3 64 32l0 96 64 0 0-96c0-17.7-14.3-32-32-32zM288 0c-17.7 0-32 14.3-32 32l0 96 64 0 0-96c0-17.7-14.3-32-32-32zM32 160c-17.7 0-32 14.3-32 32s14.3 32 32 32l0 32c0 77.4 55 142 128 156.8l0 67.2c0 17.7 14.3 32 32 32s32-14.3 32-32l0-67.2c12.3-2.5 24.1-6.4 35.1-11.5c-2.1-10.8-3.1-21.9-3.1-33.3c0-80.3 53.8-148 127.3-169.2c.5-2.2 .7-4.5 .7-6.8c0-17.7-14.3-32-32-32L32 160zM432 512a144 144 0 1 0 0-288 144 144 0 1 0 0 288zm47.9-225c4.3 3.7 5.4 9.9 2.6 14.9L452.4 356l35.6 0c5.2 0 9.8 3.3 11.4 8.2s-.1 10.3-4.2 13.4l-96 72c-4.5 3.4-10.8 3.2-15.1-.6s-5.4-9.9-2.6-14.9L411.6 380 376 380c-5.2 0-9.8-3.3-11.4-8.2s.1-10.3 4.2-13.4l96-72c4.5-3.4 10.8-3.2 15.1 .6z"/></svg> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><path d="M96 0C78.3 0 64 14.3 64 32l0 96 64 0 0-96c0-17.7-14.3-32-32-32zM288 0c-17.7 0-32 14.3-32 32l0 96 64 0 0-96c0-17.7-14.3-32-32-32zM32 160c-17.7 0-32 14.3-32 32s14.3 32 32 32l0 32c0 77.4 55 142 128 156.8l0 67.2c0 17.7 14.3 32 32 32s32-14.3 32-32l0-67.2c12.3-2.5 24.1-6.4 35.1-11.5c-2.1-10.8-3.1-21.9-3.1-33.3c0-80.3 53.8-148 127.3-169.2c.5-2.2 .7-4.5 .7-6.8c0-17.7-14.3-32-32-32L32 160zM432 512a144 144 0 1 0 0-288 144 144 0 1 0 0 288zm47.9-225c4.3 3.7 5.4 9.9 2.6 14.9L452.4 356l35.6 0c5.2 0 9.8 3.3 11.4 8.2s-.1 10.3-4.2 13.4l-96 72c-4.5 3.4-10.8 3.2-15.1-.6s-5.4-9.9-2.6-14.9L411.6 380 376 380c-5.2 0-9.8-3.3-11.4-8.2s.1-10.3 4.2-13.4l96-72c4.5-3.4 10.8-3.2 15.1 .6z"/></svg>
<span id="electric-charger-type-label-item-fast-power"></span> <span id="electric-charger-type-label-item-fast-power"></span>
</div> </div>
<div class="electric-charger-type-label-item-container"> <div class="electric-charger-type-label-item-container">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><path d="M0 112.5L0 422.3c0 18 10.1 35 27 41.3c87 32.5 174 10.3 261-11.9c79.8-20.3 159.6-40.7 239.3-18.9c23 6.3 48.7-9.5 48.7-33.4l0-309.9c0-18-10.1-35-27-41.3C462 15.9 375 38.1 288 60.3C208.2 80.6 128.4 100.9 48.7 79.1C25.6 72.8 0 88.6 0 112.5zM288 352c-44.2 0-80-43-80-96s35.8-96 80-96s80 43 80 96s-35.8 96-80 96zM64 352c35.3 0 64 28.7 64 64l-64 0 0-64zm64-208c0 35.3-28.7 64-64 64l0-64 64 0zM512 304l0 64-64 0c0-35.3 28.7-64 64-64zM448 96l64 0 0 64c-35.3 0-64-28.7-64-64z"/></svg> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><path d="M0 112.5L0 422.3c0 18 10.1 35 27 41.3c87 32.5 174 10.3 261-11.9c79.8-20.3 159.6-40.7 239.3-18.9c23 6.3 48.7-9.5 48.7-33.4l0-309.9c0-18-10.1-35-27-41.3C462 15.9 375 38.1 288 60.3C208.2 80.6 128.4 100.9 48.7 79.1C25.6 72.8 0 88.6 0 112.5zM288 352c-44.2 0-80-43-80-96s35.8-96 80-96s80 43 80 96s-35.8 96-80 96zM64 352c35.3 0 64 28.7 64 64l-64 0 0-64zm64-208c0 35.3-28.7 64-64 64l0-64 64 0zM512 304l0 64-64 0c0-35.3 28.7-64 64-64zM448 96l64 0 0 64c-35.3 0-64-28.7-64-64z"/></svg>
<span id="electric-charger-type-label-item-fast-price"></span> <span id="electric-charger-type-label-item-fast-price"></span>
</div> </div>
</div> </div>
</label> </label>
</div> </div>
<div id="electric-charger-normal-label-wrapper"> <div id="electric-charger-normal-label-wrapper">
<input class="electric-charger-type-input" type="radio" id="charger-type-normal" name="charger-type" value="normal"> <input class="electric-charger-type-input" type="radio" id="charger-type-normal" name="charger-type" value="normal">
<label id="electric-charger-normal-label" class="electric-charger-type-label" for="charger-type-normal"> <label id="electric-charger-normal-label" class="electric-charger-type-label" for="charger-type-normal">
<svg xmlns="http://www.w3.org/2000/svg" width="43" height="43" viewBox="0 0 43 43" fill="none"><path fill-rule="evenodd" clip-rule="evenodd" d="M16.125 2.49554C16.125 1.22331 15.0936 0.191971 13.8214 0.191971C12.5492 0.191971 11.5179 1.22331 11.5179 2.49554V10.846H9.21429C7.518 10.846 6.14286 12.2211 6.14286 13.9174V23.1317C6.14286 28.2206 10.2682 32.3458 15.3571 32.3458H19.1964V40.6006C19.1964 41.8728 20.2278 42.9042 21.5 42.9042C22.7722 42.9042 23.8036 41.8728 23.8036 40.6006V32.3458H27.6429C32.7319 32.3458 36.8571 28.2206 36.8571 23.1317V13.9174C36.8571 12.2211 35.4821 10.846 33.7857 10.846H31.4821V2.49554C31.4821 1.22331 30.4508 0.191971 29.1786 0.191971C27.9064 0.191971 26.875 1.22331 26.875 2.49554V10.846H16.125V2.49554Z" fill="white"/></svg> <svg xmlns="http://www.w3.org/2000/svg" width="43" height="43" viewBox="0 0 43 43" fill="none"><path fill-rule="evenodd" clip-rule="evenodd" d="M16.125 2.49554C16.125 1.22331 15.0936 0.191971 13.8214 0.191971C12.5492 0.191971 11.5179 1.22331 11.5179 2.49554V10.846H9.21429C7.518 10.846 6.14286 12.2211 6.14286 13.9174V23.1317C6.14286 28.2206 10.2682 32.3458 15.3571 32.3458H19.1964V40.6006C19.1964 41.8728 20.2278 42.9042 21.5 42.9042C22.7722 42.9042 23.8036 41.8728 23.8036 40.6006V32.3458H27.6429C32.7319 32.3458 36.8571 28.2206 36.8571 23.1317V13.9174C36.8571 12.2211 35.4821 10.846 33.7857 10.846H31.4821V2.49554C31.4821 1.22331 30.4508 0.191971 29.1786 0.191971C27.9064 0.191971 26.875 1.22331 26.875 2.49554V10.846H16.125V2.49554Z" fill="white"/></svg>
<h2 id="electric-charger-type-normal"></h2> <h2 id="electric-charger-type-normal"></h2>
<div style="display: flex;flex-direction: column;"> <div style="display: flex;flex-direction: column;">
<div class="electric-charger-type-label-item-container"> <div class="electric-charger-type-label-item-container">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><path d="M96 0C78.3 0 64 14.3 64 32l0 96 64 0 0-96c0-17.7-14.3-32-32-32zM288 0c-17.7 0-32 14.3-32 32l0 96 64 0 0-96c0-17.7-14.3-32-32-32zM32 160c-17.7 0-32 14.3-32 32s14.3 32 32 32l0 32c0 77.4 55 142 128 156.8l0 67.2c0 17.7 14.3 32 32 32s32-14.3 32-32l0-67.2c12.3-2.5 24.1-6.4 35.1-11.5c-2.1-10.8-3.1-21.9-3.1-33.3c0-80.3 53.8-148 127.3-169.2c.5-2.2 .7-4.5 .7-6.8c0-17.7-14.3-32-32-32L32 160zM432 512a144 144 0 1 0 0-288 144 144 0 1 0 0 288zm47.9-225c4.3 3.7 5.4 9.9 2.6 14.9L452.4 356l35.6 0c5.2 0 9.8 3.3 11.4 8.2s-.1 10.3-4.2 13.4l-96 72c-4.5 3.4-10.8 3.2-15.1-.6s-5.4-9.9-2.6-14.9L411.6 380 376 380c-5.2 0-9.8-3.3-11.4-8.2s.1-10.3 4.2-13.4l96-72c4.5-3.4 10.8-3.2 15.1 .6z"/></svg> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><path d="M96 0C78.3 0 64 14.3 64 32l0 96 64 0 0-96c0-17.7-14.3-32-32-32zM288 0c-17.7 0-32 14.3-32 32l0 96 64 0 0-96c0-17.7-14.3-32-32-32zM32 160c-17.7 0-32 14.3-32 32s14.3 32 32 32l0 32c0 77.4 55 142 128 156.8l0 67.2c0 17.7 14.3 32 32 32s32-14.3 32-32l0-67.2c12.3-2.5 24.1-6.4 35.1-11.5c-2.1-10.8-3.1-21.9-3.1-33.3c0-80.3 53.8-148 127.3-169.2c.5-2.2 .7-4.5 .7-6.8c0-17.7-14.3-32-32-32L32 160zM432 512a144 144 0 1 0 0-288 144 144 0 1 0 0 288zm47.9-225c4.3 3.7 5.4 9.9 2.6 14.9L452.4 356l35.6 0c5.2 0 9.8 3.3 11.4 8.2s-.1 10.3-4.2 13.4l-96 72c-4.5 3.4-10.8 3.2-15.1-.6s-5.4-9.9-2.6-14.9L411.6 380 376 380c-5.2 0-9.8-3.3-11.4-8.2s.1-10.3 4.2-13.4l96-72c4.5-3.4 10.8-3.2 15.1 .6z"/></svg>
<span id="electric-charger-type-label-item-normal-power"></span> <span id="electric-charger-type-label-item-normal-power"></span>
</div> </div>
<div class="electric-charger-type-label-item-container"> <div class="electric-charger-type-label-item-container">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><path d="M0 112.5L0 422.3c0 18 10.1 35 27 41.3c87 32.5 174 10.3 261-11.9c79.8-20.3 159.6-40.7 239.3-18.9c23 6.3 48.7-9.5 48.7-33.4l0-309.9c0-18-10.1-35-27-41.3C462 15.9 375 38.1 288 60.3C208.2 80.6 128.4 100.9 48.7 79.1C25.6 72.8 0 88.6 0 112.5zM288 352c-44.2 0-80-43-80-96s35.8-96 80-96s80 43 80 96s-35.8 96-80 96zM64 352c35.3 0 64 28.7 64 64l-64 0 0-64zm64-208c0 35.3-28.7 64-64 64l0-64 64 0zM512 304l0 64-64 0c0-35.3 28.7-64 64-64zM448 96l64 0 0 64c-35.3 0-64-28.7-64-64z"/></svg> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><path d="M0 112.5L0 422.3c0 18 10.1 35 27 41.3c87 32.5 174 10.3 261-11.9c79.8-20.3 159.6-40.7 239.3-18.9c23 6.3 48.7-9.5 48.7-33.4l0-309.9c0-18-10.1-35-27-41.3C462 15.9 375 38.1 288 60.3C208.2 80.6 128.4 100.9 48.7 79.1C25.6 72.8 0 88.6 0 112.5zM288 352c-44.2 0-80-43-80-96s35.8-96 80-96s80 43 80 96s-35.8 96-80 96zM64 352c35.3 0 64 28.7 64 64l-64 0 0-64zm64-208c0 35.3-28.7 64-64 64l0-64 64 0zM512 304l0 64-64 0c0-35.3 28.7-64 64-64zM448 96l64 0 0 64c-35.3 0-64-28.7-64-64z"/></svg>
<span id="electric-charger-type-label-item-normal-price"></span> <span id="electric-charger-type-label-item-normal-price"></span>
</div> </div>
</div> </div>
</label> </label>
</div> </div>
</section> </section>
<button id="electric-charger-continue-type-button" class="electric-charger-button" onclick="chargerTypeContinue()"></button> <button id="electric-charger-continue-type-button" class="electric-charger-button" onclick="chargerTypeContinue()"></button>
</div> </div>
<div class="electric-charger-amount-container" style="display: none;"> <div class="electric-charger-amount-container" style="display: none;">
<div onclick="chargerAmountReturn()" class="electric-charger-return-container"> <div onclick="chargerAmountReturn()" class="electric-charger-return-container">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg>
</div> </div>
<h5 id="electric-charger-amount-title" class="electric-charger-title" style="margin-bottom: 0;"></h5> <h5 id="electric-charger-amount-title" class="electric-charger-title" style="margin-bottom: 0;"></h5>
<h5 id="electric-charger-amount-type-selected" class="electric-charger-subtitle"></h5> <h5 id="electric-charger-amount-type-selected" class="electric-charger-subtitle"></h5>
<div class="electric-charger-amount-input-container"> <div class="electric-charger-amount-input-container">
<button class="recharge-sub">-</button> <button class="recharge-sub">-</button>
<input id="electric-charger-amount-input" class="electric-charger-amount-input" type="number" placeholder="" value="1"> <input id="electric-charger-amount-input" class="electric-charger-amount-input" type="number" placeholder="" value="1">
<button class="recharge-add">+</button> <button class="recharge-add">+</button>
</div> </div>
<div class="electric-amount-info-container"> <div class="electric-amount-info-container">
<div class="electric-amount-progress-container"> <div class="electric-amount-progress-container">
<svg xmlns="http://www.w3.org/2000/svg" width="26" height="26" fill="white" viewBox="0 0 512 512"><path d="M135.2 117.4L109.1 192l293.8 0-26.1-74.6C372.3 104.6 360.2 96 346.6 96L165.4 96c-13.6 0-25.7 8.6-30.2 21.4zM39.6 196.8L74.8 96.3C88.3 57.8 124.6 32 165.4 32l181.2 0c40.8 0 77.1 25.8 90.6 64.3l35.2 100.5c23.2 9.6 39.6 32.5 39.6 59.2l0 144 0 48c0 17.7-14.3 32-32 32l-32 0c-17.7 0-32-14.3-32-32l0-48L96 400l0 48c0 17.7-14.3 32-32 32l-32 0c-17.7 0-32-14.3-32-32l0-48L0 256c0-26.7 16.4-49.6 39.6-59.2zM128 288a32 32 0 1 0 -64 0 32 32 0 1 0 64 0zm288 32a32 32 0 1 0 0-64 32 32 0 1 0 0 64z"/></svg> <svg xmlns="http://www.w3.org/2000/svg" width="26" height="26" fill="white" viewBox="0 0 512 512"><path d="M135.2 117.4L109.1 192l293.8 0-26.1-74.6C372.3 104.6 360.2 96 346.6 96L165.4 96c-13.6 0-25.7 8.6-30.2 21.4zM39.6 196.8L74.8 96.3C88.3 57.8 124.6 32 165.4 32l181.2 0c40.8 0 77.1 25.8 90.6 64.3l35.2 100.5c23.2 9.6 39.6 32.5 39.6 59.2l0 144 0 48c0 17.7-14.3 32-32 32l-32 0c-17.7 0-32-14.3-32-32l0-48L96 400l0 48c0 17.7-14.3 32-32 32l-32 0c-17.7 0-32-14.3-32-32l0-48L0 256c0-26.7 16.4-49.6 39.6-59.2zM128 288a32 32 0 1 0 -64 0 32 32 0 1 0 64 0zm288 32a32 32 0 1 0 0-64 32 32 0 1 0 0 64z"/></svg>
<div class="recharge-display-battery-bar-container"> <div class="recharge-display-battery-bar-container">
<div class="recharge-display-battery-level"> <div class="recharge-display-battery-level">
<div id="electric-amount-progress-bar" class="recharge-display-battery-liquid" style="width: 100%;"></div> <div id="electric-amount-progress-bar" class="recharge-display-battery-liquid" style="width: 100%;"></div>
</div> </div>
</div> </div>
</div> </div>
<span id="electric-time-to-recharge" class="electric-time-to-recharge"><span id="electric-time-to-recharge-value"></span></span> <span id="electric-time-to-recharge" class="electric-time-to-recharge"><span id="electric-time-to-recharge-value"></span></span>
</div> </div>
<button id="electric-charger-continue-amount-button" class="electric-charger-button" onclick="chargerAmountContinue()"></button> <button id="electric-charger-continue-amount-button" class="electric-charger-button" onclick="chargerAmountContinue()"></button>
</div> </div>
<div class="electric-charger-payment-container" style="display: none;"> <div class="electric-charger-payment-container" style="display: none;">
<div onclick="chargerPaymentReturn()" class="electric-charger-return-container"> <div onclick="chargerPaymentReturn()" class="electric-charger-return-container">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg>
</div> </div>
<h5 id="electric-charger-payment-title" class="electric-charger-title"></h5> <h5 id="electric-charger-payment-title" class="electric-charger-title"></h5>
<section class="electric-charger-buttons-container"> <section class="electric-charger-buttons-container">
<div> <div>
<input class="electric-charger-type-input" type="radio" id="charger-payment-money" name="charger-payment" value="account1" checked> <input class="electric-charger-type-input" type="radio" id="charger-payment-money" name="charger-payment" value="account1" checked>
<label class="electric-charger-type-label" for="charger-payment-money"> <label class="electric-charger-type-label" for="charger-payment-money">
<svg xmlns="http://www.w3.org/2000/svg" width="35" height="35" viewBox="0 0 35 35" fill="none"><path d="M19.0313 23.6982H16.2897C14.3501 23.6982 12.7605 22.0649 12.7605 20.0524C12.7605 19.4545 13.2563 18.9586 13.8542 18.9586C14.4522 18.9586 14.948 19.4545 14.948 20.0524C14.948 20.8545 15.5459 21.5107 16.2897 21.5107H19.0313C19.6001 21.5107 20.0522 21.0003 20.0522 20.3732C20.0522 19.5857 19.8334 19.469 19.3376 19.294L14.948 17.7628C14.0147 17.4274 12.7605 16.7565 12.7605 14.6128C12.7605 12.7899 14.2043 11.2878 15.9688 11.2878H18.7105C20.6501 11.2878 22.2397 12.9212 22.2397 14.9336C22.2397 15.5315 21.7438 16.0274 21.1459 16.0274C20.548 16.0274 20.0522 15.5315 20.0522 14.9336C20.0522 14.1316 19.4542 13.4753 18.7105 13.4753H15.9688C15.4001 13.4753 14.948 13.9858 14.948 14.6128C14.948 15.4003 15.1667 15.517 15.6626 15.692L20.0522 17.2232C20.9855 17.5586 22.2397 18.2295 22.2397 20.3732C22.2397 22.2107 20.7959 23.6982 19.0313 23.6982Z" fill="white"/><path d="M17.5 25.1562C16.9021 25.1562 16.4062 24.6604 16.4062 24.0625V10.9375C16.4062 10.3396 16.9021 9.84375 17.5 9.84375C18.0979 9.84375 18.5938 10.3396 18.5938 10.9375V24.0625C18.5938 24.6604 18.0979 25.1562 17.5 25.1562Z" fill="white"/><path d="M17.5001 33.1771C8.85216 33.1771 1.823 26.1479 1.823 17.5C1.823 8.85209 8.85216 1.82292 17.5001 1.82292C18.098 1.82292 18.5938 2.31876 18.5938 2.91667C18.5938 3.51459 18.098 4.01042 17.5001 4.01042C10.0626 4.01042 4.0105 10.0625 4.0105 17.5C4.0105 24.9375 10.0626 30.9896 17.5001 30.9896C24.9376 30.9896 30.9897 24.9375 30.9897 17.5C30.9897 16.9021 31.4855 16.4063 32.0834 16.4063C32.6813 16.4063 33.1772 16.9021 33.1772 17.5C33.1772 26.1479 26.148 33.1771 17.5001 33.1771Z" fill="white"/><path d="M32.0833 9.84375C31.4854 9.84375 30.9896 9.34792 30.9896 8.75V4.01042H26.25C25.6521 4.01042 25.1562 3.51459 25.1562 2.91667C25.1562 2.31876 25.6521 1.82292 26.25 1.82292H32.0833C32.6812 1.82292 33.1771 2.31876 33.1771 2.91667V8.75C33.1771 9.34792 32.6812 9.84375 32.0833 9.84375Z" fill="white"/><path d="M24.791 11.302C24.5139 11.302 24.2369 11.1999 24.0181 10.9812C23.5952 10.5582 23.5952 9.85825 24.0181 9.43533L31.3098 2.14366C31.7327 1.72075 32.4327 1.72075 32.8556 2.14366C33.2785 2.56658 33.2785 3.26658 32.8556 3.6895L25.5639 10.9812C25.3452 11.1999 25.0681 11.302 24.791 11.302Z" fill="white"/></svg> <svg xmlns="http://www.w3.org/2000/svg" width="35" height="35" viewBox="0 0 35 35" fill="none"><path d="M19.0313 23.6982H16.2897C14.3501 23.6982 12.7605 22.0649 12.7605 20.0524C12.7605 19.4545 13.2563 18.9586 13.8542 18.9586C14.4522 18.9586 14.948 19.4545 14.948 20.0524C14.948 20.8545 15.5459 21.5107 16.2897 21.5107H19.0313C19.6001 21.5107 20.0522 21.0003 20.0522 20.3732C20.0522 19.5857 19.8334 19.469 19.3376 19.294L14.948 17.7628C14.0147 17.4274 12.7605 16.7565 12.7605 14.6128C12.7605 12.7899 14.2043 11.2878 15.9688 11.2878H18.7105C20.6501 11.2878 22.2397 12.9212 22.2397 14.9336C22.2397 15.5315 21.7438 16.0274 21.1459 16.0274C20.548 16.0274 20.0522 15.5315 20.0522 14.9336C20.0522 14.1316 19.4542 13.4753 18.7105 13.4753H15.9688C15.4001 13.4753 14.948 13.9858 14.948 14.6128C14.948 15.4003 15.1667 15.517 15.6626 15.692L20.0522 17.2232C20.9855 17.5586 22.2397 18.2295 22.2397 20.3732C22.2397 22.2107 20.7959 23.6982 19.0313 23.6982Z" fill="white"/><path d="M17.5 25.1562C16.9021 25.1562 16.4062 24.6604 16.4062 24.0625V10.9375C16.4062 10.3396 16.9021 9.84375 17.5 9.84375C18.0979 9.84375 18.5938 10.3396 18.5938 10.9375V24.0625C18.5938 24.6604 18.0979 25.1562 17.5 25.1562Z" fill="white"/><path d="M17.5001 33.1771C8.85216 33.1771 1.823 26.1479 1.823 17.5C1.823 8.85209 8.85216 1.82292 17.5001 1.82292C18.098 1.82292 18.5938 2.31876 18.5938 2.91667C18.5938 3.51459 18.098 4.01042 17.5001 4.01042C10.0626 4.01042 4.0105 10.0625 4.0105 17.5C4.0105 24.9375 10.0626 30.9896 17.5001 30.9896C24.9376 30.9896 30.9897 24.9375 30.9897 17.5C30.9897 16.9021 31.4855 16.4063 32.0834 16.4063C32.6813 16.4063 33.1772 16.9021 33.1772 17.5C33.1772 26.1479 26.148 33.1771 17.5001 33.1771Z" fill="white"/><path d="M32.0833 9.84375C31.4854 9.84375 30.9896 9.34792 30.9896 8.75V4.01042H26.25C25.6521 4.01042 25.1562 3.51459 25.1562 2.91667C25.1562 2.31876 25.6521 1.82292 26.25 1.82292H32.0833C32.6812 1.82292 33.1771 2.31876 33.1771 2.91667V8.75C33.1771 9.34792 32.6812 9.84375 32.0833 9.84375Z" fill="white"/><path d="M24.791 11.302C24.5139 11.302 24.2369 11.1999 24.0181 10.9812C23.5952 10.5582 23.5952 9.85825 24.0181 9.43533L31.3098 2.14366C31.7327 1.72075 32.4327 1.72075 32.8556 2.14366C33.2785 2.56658 33.2785 3.26658 32.8556 3.6895L25.5639 10.9812C25.3452 11.1999 25.0681 11.302 24.791 11.302Z" fill="white"/></svg>
<h2 id="electric-charger-payment-money"></h2> <h2 id="electric-charger-payment-money"></h2>
</label> </label>
</div> </div>
<div> <div>
<input class="electric-charger-type-input" type="radio" id="charger-payment-bank" name="charger-payment" value="account2"> <input class="electric-charger-type-input" type="radio" id="charger-payment-bank" name="charger-payment" value="account2">
<label class="electric-charger-type-label" for="charger-payment-bank"> <label class="electric-charger-type-label" for="charger-payment-bank">
<svg xmlns="http://www.w3.org/2000/svg" width="35" height="35" viewBox="0 0 35 35" fill="none"><path d="M2.91675 11.6667V17.5015H4.37508V26.25H2.91675V30.625H4.37508H8.75008H11.6667H16.0417H18.9584H23.3334H26.2501L30.6251 30.6265L32.0834 30.625V26.25H30.6251V17.5015H32.0834V11.6667L17.5001 2.91667L2.91675 11.6667ZM8.75008 26.25V17.5015H11.6667V26.25H8.75008ZM16.0417 26.25V17.5015H18.9584V26.25H16.0417ZM26.2501 26.25H23.3334V17.5015H26.2501V26.25ZM20.4167 11.6667C20.4167 13.2767 19.1101 14.5833 17.5001 14.5833C15.8901 14.5833 14.5834 13.2767 14.5834 11.6667C14.5834 10.0567 15.8901 8.75001 17.5001 8.75001C19.1101 8.75001 20.4167 10.0567 20.4167 11.6667Z" fill="white"/></svg> <svg xmlns="http://www.w3.org/2000/svg" width="35" height="35" viewBox="0 0 35 35" fill="none"><path d="M2.91675 11.6667V17.5015H4.37508V26.25H2.91675V30.625H4.37508H8.75008H11.6667H16.0417H18.9584H23.3334H26.2501L30.6251 30.6265L32.0834 30.625V26.25H30.6251V17.5015H32.0834V11.6667L17.5001 2.91667L2.91675 11.6667ZM8.75008 26.25V17.5015H11.6667V26.25H8.75008ZM16.0417 26.25V17.5015H18.9584V26.25H16.0417ZM26.2501 26.25H23.3334V17.5015H26.2501V26.25ZM20.4167 11.6667C20.4167 13.2767 19.1101 14.5833 17.5001 14.5833C15.8901 14.5833 14.5834 13.2767 14.5834 11.6667C14.5834 10.0567 15.8901 8.75001 17.5001 8.75001C19.1101 8.75001 20.4167 10.0567 20.4167 11.6667Z" fill="white"/></svg>
<h2 id="electric-charger-payment-bank"></h2> <h2 id="electric-charger-payment-bank"></h2>
</label> </label>
</div> </div>
</section> </section>
<button id="electric-charger-pay-button" class="electric-charger-button" onclick="confirmRecharge()"></button> <button id="electric-charger-pay-button" class="electric-charger-button" onclick="confirmRecharge()"></button>
</div> </div>
</div> </div>
</div> </div>
<div id="confirm-refuel-payment-modal" class="modal" style="display: none;"> <div id="confirm-refuel-payment-modal" class="modal" style="display: none;">
<div class="modal-content"> <div class="modal-content">
<span class="close-button" onclick="closeModal()">&times;</span> <span class="close-button" onclick="closeModal()">&times;</span>
<h2 id="confirm-refuel-payment-modal-title"></h2> <h2 id="confirm-refuel-payment-modal-title"></h2>
<p id="confirm-refuel-payment-modal-desc"></p> <p id="confirm-refuel-payment-modal-desc"></p>
<div class="modal-buttons"> <div class="modal-buttons">
<button id="confirm-refuel-payment-modal-pay-bank" class="modal-button" onclick="confirmRefuelPayment('account2')"></button> <button id="confirm-refuel-payment-modal-pay-bank" class="modal-button" onclick="confirmRefuelPayment('account2')"></button>
<button id="confirm-refuel-payment-modal-pay-cash" class="modal-button" onclick="confirmRefuelPayment('account1')"></button> <button id="confirm-refuel-payment-modal-pay-cash" class="modal-button" onclick="confirmRefuelPayment('account1')"></button>
</div> </div>
</div> </div>
</div> </div>
<div id="confirm-jerry-can-payment-modal" class="modal" style="display: none;"> <div id="confirm-jerry-can-payment-modal" class="modal" style="display: none;">
<div class="modal-content"> <div class="modal-content">
<span class="close-button" onclick="closeModal()">&times;</span> <span class="close-button" onclick="closeModal()">&times;</span>
<h2 id="confirm-jerry-can-payment-modal-title"></h2> <h2 id="confirm-jerry-can-payment-modal-title"></h2>
<img src="images/jerry_can.png" style="width: 140px;"> <img src="images/jerry_can.png" style="width: 140px;">
<h3 id="confirm-jerry-can-payment-modal-desc"></h3> <h3 id="confirm-jerry-can-payment-modal-desc"></h3>
<div class="modal-buttons"> <div class="modal-buttons">
<button id="confirm-jerry-can-payment-modal-pay-bank" class="modal-button" onclick="confirmJerryCanPayment('account2')"></button> <button id="confirm-jerry-can-payment-modal-pay-bank" class="modal-button" onclick="confirmJerryCanPayment('account2')"></button>
<button id="confirm-jerry-can-payment-modal-pay-cash" class="modal-button" onclick="confirmJerryCanPayment('account1')"></button> <button id="confirm-jerry-can-payment-modal-pay-cash" class="modal-button" onclick="confirmJerryCanPayment('account1')"></button>
</div> </div>
</div> </div>
</div> </div>
<div id="confirm-fuel-type-modal" class="modal" style="display: none;"> <div id="confirm-fuel-type-modal" class="modal" style="display: none;">
<div class="modal-content"> <div class="modal-content">
<span class="close-button" onclick="closeModal()">&times;</span> <span class="close-button" onclick="closeModal()">&times;</span>
<h2 id="confirm-fuel-type-modal-title"></h2> <h2 id="confirm-fuel-type-modal-title"></h2>
<p id="confirm-fuel-type-modal-desc"></p> <p id="confirm-fuel-type-modal-desc"></p>
<div class="modal-buttons"> <div class="modal-buttons">
<button id="confirm-fuel-type-modal-confirm" class="modal-button" onclick="changeVehicleFuelType()"></button> <button id="confirm-fuel-type-modal-confirm" class="modal-button" onclick="changeVehicleFuelType()"></button>
<button id="confirm-fuel-type-modal-cancel" class="modal-button cancel-button" onclick="closeModal()"></button> <button id="confirm-fuel-type-modal-cancel" class="modal-button cancel-button" onclick="closeModal()"></button>
</div> </div>
</div> </div>
</div> </div>
<div id="chart-dialog" class="chart-dialog" style="display: none;"> <div id="chart-dialog" class="chart-dialog" style="display: none;">
<span class="close-button" onclick="closeFuelConsumptionChartUI()">&times;</span> <span class="close-button" onclick="closeFuelConsumptionChartUI()">&times;</span>
<div class="dialog-header" id="chart-dialog-title"> <div class="dialog-header" id="chart-dialog-title">
</div> </div>
<div class="dialog-body"> <div class="dialog-body">
<canvas id="fuel-chart"></canvas> <canvas id="fuel-chart"></canvas>
</div> </div>
<div class="dialog-body"> <div class="dialog-body">
<canvas id="speed-chart"></canvas> <canvas id="speed-chart"></canvas>
</div> </div>
<div class="dialog-body"> <div class="dialog-body">
<canvas id="consumption-chart"></canvas> <canvas id="consumption-chart"></canvas>
</div> </div>
<div class="dialog-footer"> <div class="dialog-footer">
<div class="dialog-footer-inputs"> <div class="dialog-footer-inputs">
<div> <div>
<input type="checkbox" id="start-stop-recording"> <input type="checkbox" id="start-stop-recording">
<label id="start-stop-recording-label" for="start-stop-recording"></label> <label id="start-stop-recording-label" for="start-stop-recording"></label>
</div> </div>
<div class="chart-recording-input-container"> <div class="chart-recording-input-container">
<button class="decrease-chart-recording" id="decrease-chart-recording"> <button class="decrease-chart-recording" id="decrease-chart-recording">
- -
</button> </button>
<span id="stepper-chart-recording-input"></span> <span id="stepper-chart-recording-input"></span>
<button class="increase-chart-recording" id="increase-chart-recording"> <button class="increase-chart-recording" id="increase-chart-recording">
+ +
</button> </button>
</div> </div>
</div> </div>
<span id="chart-dialog-footer-text"></span> <span id="chart-dialog-footer-text"></span>
</div> </div>
</div> </div>
<script src="panel.js" type="text/javascript"></script> <script src="panel.js" type="text/javascript"></script>
</body> </body>
</html> </html>

File diff suppressed because it is too large Load diff

View file

@ -1 +1 @@
1.2.2 1.2.3