Files
red-valley/cache/files/aty_busjob/resource.rpf

2858 lines
134 KiB
Plaintext
Raw Normal View History

RPF2<00><00><00><00>*TI<00>TI5<00><00><00>CH<00>HR <00>f <00>==&X& 5`5ZN!<00>N!i<00><00><00><00><00><00><00><00><00>pz<00><00><00><00> <00><00><00>(<00><00><00>0<00><00><00>8<00><00>@<00>83H83<00>F
2026-03-29 21:41:17 +03:00
<00>F
<00><00>F<00><00>F<00><00><00><00>/.fxapclientmain.luanui.luautils.luaconfig.luadatabase.jsonfxmanifest.lualocaleslocales.luauiassetsclock.pngdefault.pngdivider.pngdots.pnglogo.pngroad-b.pngroad.pngcssstyle.cssstyle.css.mapstyle.scssindex.htmljsmain.jsFXAP<00><>b<EFBFBD><62><EFBFBD><EFBFBD>,
P<EFBFBD>FV<EFBFBD><EFBFBD><EFBFBD> <0C><01>8<><38><EFBFBD>_ ǡ'6t1`Ǹ<><C7B8><EFBFBD>TN<54>)<29>!<18><><EFBFBD>h9<68> <0B>fM#5<><35><03>'<27>@<40>d<EFBFBD>'R<><52>#݉۩<DD89><DBA9><EFBFBD><EFBFBD>š:q<> <09><><EFBFBD><EFBFBD>'~#<23><>;<3B>::<3A><06>oJ<>xP<78><50> {<7B><>H<EFBFBD>x<EFBFBD><18> <0C><>J<><4A><EFBFBD>x]RQ<52>yY<79><1C>P^)<29><05><>YZuiLoaded = false
spam = false
menuOpen = false
stopBlip = nil
npc = nil
npcBlip = nil
jobStarted = false
entered = false
level = 0
stopId = 1
CurrentJob = {}
PlayerData = {}
time = Config.TimeToGetInVehicle
passengers = {}
createdPassengers = 0
passengersEntering = false
busySeats = {}
cam = nil
firstStart = true
goinBack = false
damaged = false
time2 = 25
local toFloat = '%f'
PlayerJob = nil
-- ##### PLAYER LOADED ##### --
RegisterNetEvent("QBCore:Client:OnPlayerLoaded", function()
Wait(2000)
PlayerData = Framework.Functions.GetPlayerData()
PlayerJob = PlayerData.job.name
end)
RegisterNetEvent("esx:playerLoaded", function()
Wait(2000)
PlayerData = Framework.GetPlayerData()
PlayerJob = PlayerData.job.name
end)
RegisterNetEvent("QBCore:Client:OnJobUpdate", function(jobInfo)
PlayerJob = jobInfo.name
end)
RegisterNetEvent("esx:setJob", function(jobInfo)
PlayerJob = jobInfo.name
end)
-- ##### EVENTS ##### --
RegisterNetEvent("aty_busjob:client:toggleMenu", function()
while #json.encode(PlayerData) < 4 do
PlayerData = Config.Framework == "qb" and Framework.Functions.GetPlayerData() or Framework.GetPlayerData()
Wait(100)
end
if Functions.CHECK_JOB() then
if not jobStarted then
if not spam then
Functions.START_SPAM_TIMER()
menuOpen = true
Functions.TRIGGER_SERVER_CALLBACK("aty_busjob:getData", function(cb)
local playerName = cb.name
level = math.floor(cb.data.exp / 100)
SetNuiFocus(true, true)
SendNUIMessage({
action = "openMenu",
routes = Config.Routes,
level = level,
name = playerName,
oldRoutes = cb.data.oldMissons,
avatar = cb.data.avatar,
exp = cb.data.exp,
workers = cb.workers,
allData = cb.allData,
exp = cb.data.exp
})
end)
else
Config.Notify(Translation[Config.Locale].SPAMMING_MENU, "error", 5000)
end
else
Config.Notify(Translation[Config.Locale].MISSION_ENDED, "success", 5000)
Functions.CANCEL_JOB()
end
end
end)
AddEventHandler("gameEventTriggered", function(event, data)
if event == "CEventNetworkEntityDamage" then
local victim = data[1]
if CurrentJob.Vehicle == victim then
if not damaged then
damaged = true
TriggerServerEvent("aty_busjob:removeMoney")
Config.Notify(string.format(Translation[Config.Locale].CRASHED_VEHICLE, Config.CrashFine), "error", 5000)
SetTimeout(1000, function()
damaged = false
ClearEntityLastDamageEntity(CurrentJob.Vehicle)
end)
end
end
end
end)
-- ##### LOOPS ##### --
CreateThread(function()
npc = Functions.CREATE_PED_ON_COORD()
npcBlip = Functions.CREATE_BLIP(Config.NPC.coords.x, Config.NPC.coords.y, Config.NPC.coords.z, Config.NPC.blip.sprite, Config.NPC.blip.color, Config.NPC.blip.name, Config.NPC.blip.scale)
local sleep = 1000
if Config.Target == "ox" then
exports.ox_target:addLocalEntity(npc, {
label = Translation[Config.Locale].MENU,
name = "busOxMenu",
icon = "fa-solid fa-gamepad",
distance = 1.5,
event = "aty_busjob:client:toggleMenu",
})
elseif Config.Target == "qb" then
exports['qb-target']:AddTargetEntity(npc, {
options = {
{
event = "aty_busjob:client:toggleMenu",
icon = "fa-solid fa-gamepad",
label = Translation[Config.Locale].MENU,
},
},
distance = 1.5,
})
else
while true do
Wait(sleep)
if uiLoaded and not menuOpen then
local ped = PlayerPedId()
local coords = GetEntityCoords(ped)
local dist = #(coords - Config.Menu)
if dist < 1.5 then
sleep = 1
if not jobStarted then
Functions.SHOW_HELP_TEXT(Translation[Config.Locale].DRIVER_MENU_2)
if IsControlJustReleased(0, 38) then
TriggerEvent("aty_busjob:client:toggleMenu")
end
else
Functions.SHOW_HELP_TEXT(Translation[Config.Locale].END_MISSION_2)
if IsControlJustReleased(0, 38) then
TriggerEvent("aty_busjob:client:toggleMenu")
end
end
else
sleep = 1000
end
end
end
end
end)
CreateThread(function()
local sleep = 1000
while true do
Wait(sleep)
if jobStarted and not entered then
if DoesEntityExist(CurrentJob.Vehicle) then
sleep = 1
local ped = PlayerPedId()
local coords = GetEntityCoords(ped)
local carCoords = GetEntityCoords(CurrentJob.Vehicle)
local vehdist = #(coords - carCoords)
if vehdist > 1.5 and vehdist < 25.0 then
DrawMarker(2, carCoords.x, carCoords.y, carCoords.z + 3, 0.0, 0.0, 0.0, 180.0, 0.0, 0.0, 0.75, 0.75, 0.75, 0, 255, 0, 100, true, true, 2, false, false, false, false)
if IsPedInVehicle(ped, CurrentJob.Vehicle, true) then
Config.Notify(Translation[Config.Locale].MISSION_STARTED, "success", 5000)
entered = true
sleep = 1000
Functions.GET_NEXT_STOP()
SendNUIMessage({
action = "startJob",
})
end
end
end
end
end
end)
CreateThread(function()
local sleep = 100
while true do
Wait(sleep)
if jobStarted then
local ped = PlayerPedId()
if not DoesEntityExist(CurrentJob.Vehicle) then
Config.Notify(Translation[Config.Locale].VEHICLE_DESTROYED, "error", 5000)
Functions.CANCEL_JOB()
end
if entered then
if not IsPedInVehicle(ped, CurrentJob.Vehicle, true) then
sleep = 1000
time = time - 1
SendNUIMessage({
action = "updateTime",
time = time
})
if time == 0 then
Config.Notify(Translation[Config.Locale].VEHICLE_ABANDONED, "error", 5000)
Functions.CANCEL_JOB()
SendNUIMessage({
action = "hideTimer",
})
end
else
sleep = 100
time = Config.TimeToGetInVehicle
SendNUIMessage({
action = "hideTimer",
})
end
end
end
end
end)
CreateThread(function()
if Config.DebugStreet then
while true do
Wait(2000)
local playerPed = PlayerPedId()
local coords = GetEntityCoords(playerPed)
local streetHash, road = GetStreetNameAtCoord(table.unpack(coords))
print("Street Name:", GetStreetNameFromHashKey(road))
end
end
end)
CreateThread(function()
SetPlayerControl(PlayerId(), true, 0)
local sleep = 1000
while true do
Wait(sleep)
if jobStarted and entered and not passengersEntering then
local ped = PlayerPedId()
local coords = GetEntityCoords(ped)
local stopCoords = CurrentJob.Stops[stopId].StopCoords
local dist = GetDistanceBetweenCoords(coords, stopCoords.x, stopCoords.y, stopCoords.z, true)
if dist < 50.0 then
sleep = 1
DrawMarker(1, stopCoords.x, stopCoords.y, stopCoords.z - 0.5, 0.0, 0.0, 0.0, 180.0, 0.0, 0.0, 1.0, 1.0, 1.0, 0, 255, 0, 100, false, true, 2, false, false, false, false)
if IsPedInVehicle(ped, CurrentJob.Vehicle, false) then
if dist < 3.0 then
sleep = 1
Functions.SHOW_HELP_TEXT(Translation[Config.Locale].LET_PASSENGERS_IN)
if IsControlJustReleased(0, 38) then
busySeats = {}
SetPlayerControl(PlayerId(), false, 0)
SetVehicleDoorOpen(CurrentJob.Vehicle, 0, false, false)
SetVehicleDoorOpen(CurrentJob.Vehicle, 1, false, false)
SetVehicleDoorOpen(CurrentJob.Vehicle, 2, false, false)
SetVehicleDoorOpen(CurrentJob.Vehicle, 3, false, false)
Config.Notify(Translation[Config.Locale].WAIT_PASSENGERS_LEAVE, "success", 5000)
passengersEntering = true
cam = CreateCam("DEFAULT_SCRIPTED_CAMERA", true)
PointCamAtEntity(cam, CurrentJob.Vehicle, 2.5, 3.5, 1.0, true)
SetCamCoord(cam, CurrentJob.Stops[stopId].PassengerWaitCoords.x, CurrentJob.Stops[stopId].PassengerWaitCoords.y, CurrentJob.Stops[stopId].PassengerWaitCoords.z + 1)
RenderScriptCams(true, true, 1000, true, true)
SetCamActive(cam, true)
SetCamFov(cam, 35.0)
Wait(1000)
if goinBack then
goinBack = false
TriggerServerEvent("aty_busjob:giveSalary", CurrentJob.Salary)
Config.Notify(string.format(Translation[Config.Locale].YOU_GOT_SALARY, CurrentJob.Salary), "success", 5000)
end
for _, passenger in pairs(passengers) do
local random = math.random(1, 3)
if random == 1 or random == 2 then
Functions.TASK_MAKE_RANDOM_PEDS_LEAVE_VEH(passenger.ped, CurrentJob.Vehicle)
end
end
Citizen.SetTimeout(15000, function()
for _, passenger in pairs(passengers) do
if not passenger.inVeh then
DeletePed(passenger.ped)
table.remove(passengers, _)
end
end
stopId = stopId + 1
time2 = 25
RenderScriptCams(false, true, 1000, true, true)
SetPlayerControl(PlayerId(), true, 0)
SetVehicleDoorShut(CurrentJob.Vehicle, 0, 1)
SetVehicleDoorShut(CurrentJob.Vehicle, 1, 1)
SetVehicleDoorShut(CurrentJob.Vehicle, 2, 1)
SetVehicleDoorShut(CurrentJob.Vehicle, 3, 1)
TriggerServerEvent("aty_busjob:givePrize", createdPassengers, CurrentJob.Exp, CurrentJob.TicketPrice)
Config.Notify(string.format(Translation[Config.Locale].YOU_LET_PASSENGERS_IN, createdPassengers), "success", 5000)
Functions.GET_NEXT_STOP(stopId)
passengersEntering = false
end)
Citizen.SetTimeout(1000, function()
firstStart = false
Config.Notify(Translation[Config.Locale].WAIT_PASSENGERS_ENTER, "success", 5000)
for _, passenger in pairs(passengers) do
if not passenger.inVeh then
FreezeEntityPosition(passenger.ped, false)
TaskEnterVehicle(passenger.ped, CurrentJob.Vehicle, 20000, math.random(0, 2), 1.0, 0, 0)
Wait(1000)
end
end
end)
end
end
end
else
sleep = 1000
end
end
end
end)
CreateThread(function()
local sleep = 1000
while true do
Wait(sleep)
if passengersEntering then
sleep = 1
for _, passenger in pairs(passengers) do
if not passenger.inVeh then
if IsPedInVehicle(passenger.ped, CurrentJob.Vehicle, false) then
passenger.inVeh = true
end
else
if not passenger.changed then
passenger.changed = true
local seats = GetVehicleModelNumberOfSeats(GetEntityModel(CurrentJob.Vehicle))
local seat = Functions.FIND_FREE_SEAT(seats, busySeats)
table.insert(busySeats, seat)
SetPedIntoVehicle(passenger.ped, CurrentJob.Vehicle, seat)
end
if Functions.IS_ALL_PEDS_IN() then
DestroyCam(cam, false)
RenderScriptCams(false, true, 1, true, true)
SetPlayerControl(PlayerId(), true, 0)
SetVehicleDoorShut(CurrentJob.Vehicle, 0, 1)
SetVehicleDoorShut(CurrentJob.Vehicle, 1, 1)
SetVehicleDoorShut(CurrentJob.Vehicle, 2, 1)
SetVehicleDoorShut(CurrentJob.Vehicle, 3, 1)
passengersEntering = false
stopId = stopId + 1
TriggerServerEvent("aty_busjob:givePrize", createdPassengers, CurrentJob.Exp, CurrentJob.TicketPrice)
Config.Notify(string.format(Translation[Config.Locale].YOU_LET_PASSENGERS_IN, createdPassengers), "success", 5000)
time2 = 25
Functions.GET_NEXT_STOP(stopId)
end
end
end
else
sleep = 1000
end
end
end)RegisterNuiCallback("uiLoaded", function(data, cb)
uiLoaded = true
end)
RegisterNuiCallback("close", function(data, cb)
menuOpen = false
SetNuiFocus(false, false)
end)
RegisterNuiCallback("startRoute", function(data, cb)
SetNuiFocus(false, false)
local lot = Functions.FIND_EMPTY_LOT()
if lot then
CurrentJob = data
firstStart = true
CurrentJob.Vehicle = Functions.CREATE_VEHICLE(lot)
local playerName = ""
if Config.Framework == "qb" then
playerName = PlayerData.charinfo.firstname .. " " .. PlayerData.charinfo.lastname
elseif Config.Framework == "esx" then
playerName = PlayerData.firstName .. " " .. PlayerData.lastName
elseif Config.Framework == "oldesx" then
playerName = PlayerData.firstname .. " " .. PlayerData.lastname
end
TriggerServerEvent("aty_busjob:updateWorker", "Starting...", playerName)
TriggerServerEvent("aty_busjob:addExpedition", data)
Config.Notify(Translation[Config.Locale].VEHICLE_CREATED, "success", 5000)
menuOpen = false
jobStarted = true
else
menuOpen = false
Config.Notify(Translation[Config.Locale].NO_EMPTY_LOT, "error", 5000)
end
end)Framework = Config.CoreExport()
local busCounter = 0
Functions = {
TRIGGER_SERVER_CALLBACK = function(...)
if Config.Framework == "qb" then
Framework.Functions.TriggerCallback(...)
else
Framework.TriggerServerCallback(...)
end
end,
CHECK_JOB = function()
if Config.JobRequirement then
if PlayerJob == Config.Job then
return true
else
return false
end
else
return true
end
end,
SHOW_HELP_TEXT = function(text, time)
BeginTextCommandDisplayHelp("STRING")
AddTextComponentSubstringPlayerName(text)
EndTextCommandDisplayHelp(0, false, true, time or -1)
end,
CREATE_VEHICLE = function(coords)
local model = GetHashKey(Config.Vehicle)
RequestModel(model)
while not HasModelLoaded(model) do
Wait(1)
end
local vehicle = CreateVehicle(model, coords, true, false)
Config.SetFuel(vehicle)
SetVehicleOnGroundProperly(vehicle)
busCounter = busCounter + 1
local plateText = string.format("LS%02dBUS", busCounter)
SetVehicleNumberPlateText(vehicle, plateText)
SetVehicleColours(vehicle, 111, 111)
SetVehicleExtraColours(vehicle, 111, 111)
SetVehicleWindowTint(vehicle, 1)
SetVehicleEngineOn(vehicle, true, true, false)
SetVehicleHasBeenOwnedByPlayer(vehicle, true)
SetVehicleDirtLevel(vehicle, 0.0)
SetVehicleLivery(vehicle, 1)
SetVehicleFuelLevel(vehicle, 100.0)
if Config.Framework == "qb" then
local plate = GetVehicleNumberPlateText(vehicle)
local model = GetDisplayNameFromVehicleModel(GetEntityModel(vehicle))
exports['qs-vehiclekeys']:GiveKeys(plate, model)
end
return vehicle
end,
FIND_EMPTY_LOT = function()
for _, emptySpace in pairs(Config.ParkingLots) do
if not IsPositionOccupied(emptySpace.x, emptySpace.y, emptySpace.z, 2.0, 0, 1, 1, 0, 0, 0, 0) then
return emptySpace
end
end
return false
end,
GET_NEXT_STOP = function()
if stopId > #CurrentJob.Stops or CurrentJob.Stops[stopId].Level > level then
stopId = 1
goinBack = true
Config.Notify(Translation[Config.Locale].GOING_BACK, "success", 5000)
end
if stopBlip then
RemoveBlip(stopBlip)
end
local stop = CurrentJob.Stops[stopId]
ClearGpsMultiRoute()
StartGpsMultiRoute(6, true, true)
AddPointToGpsMultiRoute(stop.StopCoords.x, stop.StopCoords.y, stop.StopCoords.z)
SetGpsMultiRouteRender(true)
stopBlip = Functions.CREATE_BLIP(
stop.StopCoords.x,
stop.StopCoords.y,
stop.StopCoords.z,
stop.StopBlip.Sprite,
stop.StopBlip.Color,
stop.StopBlip.Text,
stop.StopBlip.Scale
)
local nextStop = ""
local oldStop = CurrentJob.Stops[stopId-1] and CurrentJob.Stops[stopId-1].StopName or "Garage"
if stopId+1 > #CurrentJob.Stops or CurrentJob.Stops[stopId+1].Level > level then
nextStop = CurrentJob.Stops[1]
else
nextStop = CurrentJob.Stops[stopId+1]
end
SendNUIMessage({
action = "updateStops",
oldStop = oldStop,
activeStop = stop.StopName,
nextStop = nextStop.StopName,
})
TriggerServerEvent("aty_busjob:updateWorker", stop.StopName)
createdPassengers = Functions.CREATE_PASSENGERS(stop)
return stop
end,
CREATE_PASSENGERS = function(stop)
local maxPassengers = math.random(stop.MinPassengers, stop.MaxPassengers)
for i = 1, maxPassengers do
local randomNumber = math.random(0, 100)
local randomNumber2 = math.random(0, 100)
local randomPed = math.random(1, #Config.PassengerPeds)
local pedHashKey = GetHashKey(Config.PassengerPeds[randomPed])
RequestModel(pedHashKey)
while not HasModelLoaded(pedHashKey) do
Wait(0)
end
local ped = CreatePed(0, pedHashKey, stop.PassengerWaitCoords.x + (randomNumber / 100), stop.PassengerWaitCoords.y + (randomNumber2 / 100), stop.PassengerWaitCoords.z - 1, stop.PassengerWaitCoords.w, false, true)
SetBlockingOfNonTemporaryEvents(ped, true)
SetPedDiesWhenInjured(ped, false)
SetPedCanPlayAmbientAnims(ped, false)
SetPedCanRagdollFromPlayerImpact(ped, false)
SetEntityInvincible(ped, true)
SetEntityAsMissionEntity(ped, true, true)
FreezeEntityPosition(ped, true)
for _, passenger in pairs(passengers) do
if passenger.ped == ped then
SetEntityNoCollisionEntity(ped, passenger.ped, true)
end
end
table.insert(passengers, {ped = ped, inVeh = false, changed = false})
end
return maxPassengers
end,
TASK_MAKE_RANDOM_PEDS_LEAVE_VEH = function(ped, vehicle)
if stopId == 1 then
for _, passenger in pairs(passengers) do
if passenger.inVeh then
TaskLeaveVehicle(passenger.ped, vehicle, 0)
TaskWanderStandard(passenger.ped, 10.0, 10)
table.remove(passengers, _)
Citizen.SetTimeout(5000, function()
SetPedAsNoLongerNeeded(passenger.ped)
DeletePed(passenger.ped)
end)
end
end
else
for _, passenger in pairs(passengers) do
if passenger.ped == ped and passenger.inVeh then
TaskLeaveVehicle(passenger.ped, vehicle, 0)
TaskWanderStandard(passenger.ped, 10.0, 10)
table.remove(passengers, _)
Citizen.SetTimeout(5000, function()
SetPedAsNoLongerNeeded(passenger.ped)
DeletePed(passenger.ped)
end)
end
end
end
end,
IS_ALL_PEDS_IN = function()
local allIn = true
for _, passenger in pairs(passengers) do
if not passenger.inVeh then
allIn = false
end
end
return allIn
end,
FIND_FREE_SEAT = function(seats, busySeats)
for i = 3, seats do
if i ~= 0 or i ~= 1 or i ~= 2 then
Wait(20)
if IsVehicleSeatFree(CurrentJob.Vehicle, i) then
if busySeats then
for _, seat in pairs(busySeats) do
if i == seat then
return Functions.FIND_FREE_SEAT(seats, busySeats)
else
return i
end
end
return i
else
return i
end
end
end
end
end,
CREATE_PED_ON_COORD = function()
local pedHashKey = GetHashKey(Config.NPC.hash)
RequestModel(pedHashKey)
while not HasModelLoaded(pedHashKey) do
Wait(0)
end
local ped = CreatePed(0, pedHashKey, Config.NPC.coords.x, Config.NPC.coords.y, Config.NPC.coords.z - 1, Config.NPC.heading, false, true)
SetBlockingOfNonTemporaryEvents(ped, true)
SetPedDiesWhenInjured(ped, false)
SetPedCanPlayAmbientAnims(ped, false)
SetPedCanRagdollFromPlayerImpact(ped, false)
SetEntityInvincible(ped, true)
FreezeEntityPosition(ped, true)
SetEntityAsMissionEntity(ped, true, true)
return ped
end,
CREATE_BLIP = function(x, y, z, sprite, color, text, scale)
local blip = AddBlipForCoord(x, y, z)
SetBlipSprite(blip, sprite)
SetBlipDisplay(blip, 2)
SetBlipScale(blip, scale)
SetBlipColour(blip, color)
SetBlipAsShortRange(blip, true)
BeginTextCommandSetBlipName("STRING")
AddTextComponentString(text)
EndTextCommandSetBlipName(blip)
return blip
end,
CANCEL_JOB = function()
SendNUIMessage({
action = "hideTimer",
})
SendNUIMessage({
action = "hideStops",
})
if DoesEntityExist(CurrentJob.Vehicle) then
local plate = GetVehicleNumberPlateText(CurrentJob.Vehicle)
local model = GetDisplayNameFromVehicleModel(GetEntityModel(CurrentJob.Vehicle))
exports['qs-vehiclekeys']:RemoveKeys(plate, model)
DeleteEntity(CurrentJob.Vehicle)
end
if DoesBlipExist(stopBlip) then
RemoveBlip(stopBlip)
end
for _, passenger in pairs(passengers) do
if DoesEntityExist(passenger.ped) then
DeleteEntity(passenger.ped)
end
end
TriggerServerEvent("aty_busjob:removeWorker")
ClearGpsMultiRoute()
CurrentJob = {}
jobStarted = false
entered = false
stopId = 1
passengers = {}
createdPassengers = 0
end,
START_SPAM_TIMER = function()
spam = true
Citizen.SetTimeout(Config.SpamProtectionTime, function()
spam = false
end)
end,
}Config = {
Framework = "qb", -- "esx" or "oldesx" or "qb"
Locale = "ro", -- Locale of the script
DebugStreet = false, -- Debug street name
Target = "qb", -- "qb" / "ox" / "none"
2026-03-29 21:41:17 +03:00
CoreExport = function()
if Config.Framework == "qb" then
return exports["qb-core"]:GetCoreObject()
elseif Config.Framework == "esx" or Config.Framework == "oldesx" then
return exports["es_extended"]:getSharedObject()
else
return -- Your core export
end
end,
JobRequirement = true,
Job = "bus",
Menu = vector3(468.8964, -577.0377, 29.4997), -- Coords of the menu
Vehicle = "bus", -- Vehicle model name (https://wiki.gtanet.work/index.php?title=Vehicle_Models)
SpamProtectionTime = 2000, -- Time between opening menu (in milliseconds)
TimeToGetInVehicle = 30, -- Time to get in the vehicle (in seconds)
CrashFine = 50, -- Fine for crashing
NPC = {
hash = "a_m_y_business_02", -- Hash of the NPC (https://wiki.gtanet.work/index.php?title=Peds)
coords = vector3(468.8964, -577.0377, 28.4997), -- Coords of the NPC
heading = 172.1323, -- Heading of the NPC
blip = {
sprite = 513, -- Blip sprite (https://docs.fivem.net/docs/game-references/blips/)
color = 4, -- Blip color
scale = 0.6, -- Blip scale
name = "Sofer de Autobuz", -- Blip name
}
},
PassengerPeds = { -- Peds that will be spawned as passengers
"a_f_m_bevhills_01",
"a_f_m_bevhills_02",
"a_f_m_business_02",
"a_f_m_downtown_01",
"a_f_m_eastsa_01",
"a_f_m_eastsa_02",
"a_f_m_ktown_01",
"a_f_m_ktown_02",
"a_f_m_prolhost_01",
"a_f_m_salton_01",
"a_f_m_skidrow_01",
"a_f_m_soucentmc_01",
"a_f_m_soucent_01",
"a_f_m_soucent_02",
},
ParkingLots = { -- Parking lots where the bus will be spawned
vector4(439.9370, -581.0314, 28.4998, 263.1297),
vector4(437.3640, -585.4839, 28.4998, 264.4554),
vector4(434.4360, -589.4965, 28.4998, 266.5495),
vector4(474.4873, -586.5387, 28.4996, 352.9474),
vector4(470.7718, -606.2182, 28.4994, 355.4654),
},
Routes = {
{
RouteName = "Aeroport", -- Name of the route
Salary = 150, -- Salary of the route
Level = 0, -- Level required to do the route
TicketPrice = 5, -- Price of the ticket
Exp = 3, -- Exp to give to the player each stop
Stops = {
{
Preview = "https://cdn.discordapp.com/attachments/582570734174339101/1169775464148107305/image.png?ex=6556a14c&is=65442c4c&hm=8a0180939fafeb0f6c2c0f2339e0901451a61bda046e80bbed0bb1efaa953f4e&", -- Image of the stop (in the menu)
StopName = "Little Bighorn Ave", -- Name of the stop
Level = 0, -- Level required to do the stop
StopCoords = vector3(460.4128, -618.2562, 28.4998), -- Coords of the stop
PassengerWaitCoords = vector4(455.2104, -615.7665, 28.4998, 291.3041), -- Coords where the passengers will wait
MaxPassengers = 6, -- Max passengers to create on stop
MinPassengers = 2, -- Min passengers to create on stop
StopBlip = { -- Blip of the stop (https://docs.fivem.net/docs/game-references/blips/)
Sprite = 1,
Color = 4,
Scale = 0.6,
Text = "Statie: Little Bighorn Ave"
}
},
{
Preview = "https://cdn.discordapp.com/attachments/582570734174339101/1169775589914312765/image.png?ex=6556a16a&is=65442c6a&hm=f53e79ddfaab8b84f261eda9d756d172dd6c65066087a68174addbfeaa883ddd&", -- Image of the stop (in the menu)
StopName = "Strawberry Ave", -- Name of the stop
Level = 0, -- Level required to do the stop
StopCoords = vector3(308.2967, -768.3861, 29.3087), -- Coords of the stop
PassengerWaitCoords = vector4(305.4775, -765.5773, 29.1584, 248.1796), -- Coords where the passengers will wait
MaxPassengers = 4, -- Max passengers to create on stop
MinPassengers = 2, -- Min passengers to create on stop
StopBlip = { -- Blip of the stop (https://docs.fivem.net/docs/game-references/blips/)
Sprite = 1,
Color = 4,
Scale = 0.6,
Text = "Statie: Strawberry Ave"
}
},
{
Preview = "https://cdn.discordapp.com/attachments/582570734174339101/1170376825181052988/image.png?ex=6558d15b&is=65465c5b&hm=88b1a06d0fad320d8548932b54eb6a429876a697c64f622bf0beeec9cef0db7f&", -- Image of the stop (in the menu)
StopName = "Macdonald St", -- Name of the stop
Level = 0, -- Level required to do the stop
StopCoords = vector3(92.7498, -1449.7028, 29.2555), -- Coords of the stop
PassengerWaitCoords = vector4(90.2388, -1447.3125, 29.1968, 227.0327), -- Coords where the passengers will wait
MaxPassengers = 5, -- Max passengers to create on stop
MinPassengers = 1, -- Min passengers to create on stop
StopBlip = { -- Blip of the stop (https://docs.fivem.net/docs/game-references/blips/)
Sprite = 1,
Color = 4,
Scale = 0.6,
Text = "Statie: Macdonald St"
}
},
{
Preview = "https://cdn.discordapp.com/attachments/582570734174339101/1170376908261838918/image.png?ex=6558d16f&is=65465c6f&hm=4b991744f80d2dedaf7c05371cf3fc670bb666c9c5324e3fe6b64d542559175b&", -- Image of the stop (in the menu)
StopName = "Davis Ave", -- Name of the stop
Level = 0, -- Level required to do the stop
StopCoords = vector3(-107.8732, -1688.2101, 29.2449), -- Coords of the stop
PassengerWaitCoords = vector4(-109.9528, -1686.5634, 29.3072, 231.1350), -- Coords where the passengers will wait
MaxPassengers = 5, -- Max passengers to create on stop
MinPassengers = 1, -- Min passengers to create on stop
StopBlip = { -- Blip of the stop (https://docs.fivem.net/docs/game-references/blips/)
Sprite = 1,
Color = 4,
Scale = 0.6,
Text = "Statie: Davis Ave"
}
},
{
Preview = "https://cdn.discordapp.com/attachments/582570734174339101/1170376982190633032/image.png?ex=6558d181&is=65465c81&hm=3ed0fdda5044e6360ed0d2a3adca2130a1811f7c8c497d6324c280e7bc7117ab&", -- Image of the stop (in the menu)
StopName = "Airport", -- Name of the stop
Level = 1, -- Level required to do the stop
StopCoords = vector3(-1027.6862, -2725.3535, 13.7275), -- Coords of the stop
PassengerWaitCoords = vector4(-1031.4918, -2728.9023, 13.7566, 327.4242), -- Coords where the passengers will wait
MaxPassengers = 6, -- Max passengers to create on stop
MinPassengers = 2, -- Min passengers to create on stop
StopBlip = { -- Blip of the stop (https://docs.fivem.net/docs/game-references/blips/)
Sprite = 1,
Color = 4,
Scale = 0.6,
Text = "Statie: Aiport"
}
},
{
Preview = "https://cdn.discordapp.com/attachments/582570734174339101/1170377057843302500/image.png?ex=6558d193&is=65465c93&hm=5b9dae240586f74675a1c1a661faec6bf4278559c7c0dfe68135a0548bf5ee69&", -- Image of the stop (in the menu)
StopName = "Carson Ave", -- Name of the stop
Level = 1, -- Level required to do the stop
StopCoords = vector3(-44.8379, -1649.8337, 29.1988), -- Coords of the stop
PassengerWaitCoords = vector4(-42.4621, -1652.0872, 29.2884, 49.9490), -- Coords where the passengers will wait
MaxPassengers = 2, -- Max passengers to create on stop
MinPassengers = 1, -- Min passengers to create on stop
StopBlip = { -- Blip of the stop (https://docs.fivem.net/docs/game-references/blips/)
Sprite = 1,
Color = 4,
Scale = 0.6,
Text = "Statie: Carson Ave"
}
},
{
Preview = "https://cdn.discordapp.com/attachments/582570734174339101/1170377134091538473/image.png?ex=6558d1a5&is=65465ca5&hm=aac5e8e94aad977c8c30c62995568a7a60be8eed1bd17c9f4fae1d5bc35e8ee4&", -- Image of the stop (in the menu)
StopName = "Carson Ave", -- Name of the stop
Level = 2, -- Level required to do the stop
StopCoords = vector3(118.9607, -1453.2471, 29.2491), -- Coords of the stop
PassengerWaitCoords = vector4(121.5716, -1456.0439, 29.2944, 76.1904), -- Coords where the passengers will wait
MaxPassengers = 1, -- Max passengers to create on stop
MinPassengers = 1, -- Min passengers to create on stop
StopBlip = { -- Blip of the stop (https://docs.fivem.net/docs/game-references/blips/)
Sprite = 1,
Color = 4,
Scale = 0.6,
Text = "Statie: Carson Ave"
}
},
}
},
{
RouteName = "Movie Star Way", -- Name of the route
Salary = 200, -- Salary of the route
Level = 1, -- Level required to do the route
TicketPrice = 5, -- Price of the ticket
Exp = 3, -- Exp to give to the player each stop
Stops = {
{
Preview = "https://cdn.discordapp.com/attachments/582570734174339101/1169775464148107305/image.png?ex=6556a14c&is=65442c4c&hm=8a0180939fafeb0f6c2c0f2339e0901451a61bda046e80bbed0bb1efaa953f4e&", -- Image of the stop (in the menu)
StopName = "Little Bighorn Ave", -- Name of the stop
Level = 0, -- Level required to do the stop
StopCoords = vector3(460.4128, -618.2562, 28.4998), -- Coords of the stop
PassengerWaitCoords = vector4(455.2104, -615.7665, 28.4998, 291.3041), -- Coords where the passengers will wait
MaxPassengers = 6, -- Max passengers to create on stop
MinPassengers = 2, -- Min passengers to create on stop
StopBlip = { -- Blip of the stop (https://docs.fivem.net/docs/game-references/blips/)
Sprite = 1,
Color = 4,
Scale = 0.6,
Text = "Statie: Little Bighorn Ave"
}
},
{
Preview = "https://cdn.discordapp.com/attachments/582570734174339101/1169775669425733743/image.png?ex=6556a17c&is=65442c7c&hm=a5f86aec8864cd93dd27d515e7bea00a957b0dff5a3e16097c93448864a1cd70&", -- Image of the stop (in the menu)
StopName = "Elgin Ave", -- Name of the stop
Level = 0, -- Level required to do the stop
StopCoords = vector3(114.0657, -785.8300, 31.3968), -- Coords of the stop
PassengerWaitCoords = vector4(115.2365, -782.1114, 31.4007, 160.7219), -- Coords where the passengers will wait
MaxPassengers = 4, -- Max passengers to create on stop
MinPassengers = 1, -- Min passengers to create on stop
StopBlip = { -- Blip of the stop (https://docs.fivem.net/docs/game-references/blips/)
Sprite = 1,
Color = 4,
Scale = 0.6,
Text = "Statie: Elgin Ave"
}
},
{
Preview = "https://cdn.discordapp.com/attachments/582570734174339101/1170394764009537658/image.png?ex=6558e210&is=65466d10&hm=1dc931e23bcbe25480b93a098a7d8dab2cb0a9c3b21c22f70fb0666b13ab4b51&", -- Image of the stop (in the menu)
StopName = "Little Seoul", -- Name of the stop
Level = 0, -- Level required to do the stop
StopCoords = vector3(-511.7252, -649.1313, 33.0958), -- Coords of the stop
PassengerWaitCoords = vector4(-511.5065, -645.7701, 33.1609, 182.0), -- Coords where the passengers will wait
MaxPassengers = 6, -- Max passengers to create on stop
MinPassengers = 3, -- Min passengers to create on stop
StopBlip = { -- Blip of the stop (https://docs.fivem.net/docs/game-references/blips/)
Sprite = 1,
Color = 4,
Scale = 0.6,
Text = "Statie: Little Seoul"
}
},
{
Preview = "https://cdn.discordapp.com/attachments/582570734174339101/1170394880971911218/image.png?ex=6558e22c&is=65466d2c&hm=d75d6632e420dd3e7b8a7ed88de79ab2c1f5e5e6444ea142db72d042ce6f1c8b&", -- Image of the stop (in the menu)
StopName = "Movie Star Wy", -- Name of the stop
Level = 1, -- Level required to do the stop
StopCoords = vector3(-1037.4742, -271.0980, 37.6823), -- Coords of the stop
PassengerWaitCoords = vector4(-1034.0753, -269.7583, 37.7751, 116.2458), -- Coords where the passengers will wait
MaxPassengers = 2, -- Max passengers to create on stop
MinPassengers = 1, -- Min passengers to create on stop
StopBlip = { -- Blip of the stop (https://docs.fivem.net/docs/game-references/blips/)
Sprite = 1,
Color = 4,
Scale = 0.6,
Text = "Statie: Movie Star Wy"
}
},
{
Preview = "https://cdn.discordapp.com/attachments/582570734174339101/1170394945685831810/image.png?ex=6558e23b&is=65466d3b&hm=2fc0ceb46ecaf72f14d94b08fe49961c39b7c77f64ef748d0bfd6cc045c478f8&", -- Image of the stop (in the menu)
StopName = "Palomino Ave", -- Name of the stop
Level = 1, -- Level required to do the stop
StopCoords = vector3(-691.9785, -667.4823, 30.8143), -- Coords of the stop
PassengerWaitCoords = vector4(-692.0262, -670.0702, 30.8745, 0.6169), -- Coords where the passengers will wait
MaxPassengers = 2, -- Max passengers to create on stop
MinPassengers = 1, -- Min passengers to create on stop
StopBlip = { -- Blip of the stop (https://docs.fivem.net/docs/game-references/blips/)
Sprite = 1,
Color = 4,
Scale = 0.6,
Text = "Statie: Palomino Ave"
}
},
{
Preview = "https://cdn.discordapp.com/attachments/582570734174339101/1170394795785601024/image.png?ex=6558e218&is=65466d18&hm=e27569d858fc2d60ca5a2c78ea1d958ffa6d706ecd9192ad23b05343e9408728&", -- Image of the stop (in the menu)
StopName = "Little Seoul", -- Name of the stop
Level = 2, -- Level required to do the stop
StopCoords = vector3(-504.7980, -667.9174, 32.9930), -- Coords of the stop
PassengerWaitCoords = vector4(-504.8210, -670.2271, 33.0938, 359.1518), -- Coords where the passengers will wait
MaxPassengers = 6, -- Max passengers to create on stop
MinPassengers = 3, -- Min passengers to create on stop
StopBlip = { -- Blip of the stop (https://docs.fivem.net/docs/game-references/blips/)
Sprite = 1,
Color = 4,
Scale = 0.6,
Text = "Statie: Little Seoul"
}
},
{
Preview = "https://cdn.discordapp.com/attachments/582570734174339101/1170395220446281778/image.png?ex=6558e27d&is=65466d7d&hm=3627218db5aa8585d02c9c5bcdbde53f2ed561b3a2804893ec4e035d156afc79&", -- Image of the stop (in the menu)
StopName = "Strawberry Ave", -- Name of the stop
Level = 2, -- Level required to do the stop
StopCoords = vector3(341.8715, -865.5232, 29.2834), -- Coords of the stop
PassengerWaitCoords = vector4(341.8887, -869.7383, 29.2916, 359.9434), -- Coords where the passengers will wait
MaxPassengers = 2, -- Max passengers to create on stop
MinPassengers = 1, -- Min passengers to create on stop
StopBlip = { -- Blip of the stop (https://docs.fivem.net/docs/game-references/blips/)
Sprite = 1,
Color = 4,
Scale = 0.6,
Text = "Statie: Strawberry Ave"
}
},
}
},
},
Notify = function(msg, type, length)
if Config.Framework == "qb" then
Framework.Functions.Notify(msg, type, length)
else
Framework.ShowNotification(msg)
end
end,
SetFuel = function(vehicle)
-- exports["LegacyFuel"]:SetFuel(vehicle, 100)
end,
}[{"name":"Alu","avatar":"https://upload.wikimedia.org/wikipedia/commons/8/89/Portrait_Placeholder.png","oldMissons":[{"date":"03/01/2026 08:46:22","routeName":"Aeroport"},{"date":"03/01/2026 09:01:40","routeName":"Aeroport"},{"date":"03/01/2026 10:07:06","routeName":"Aeroport"},{"date":"03/01/2026 10:52:49","routeName":"Aeroport"}],"exp":27,"license":"license:10638d147852e8029eb5289f2ac81f04961da5dd"}]fx_version 'cerulean'
2026-03-29 21:41:17 +03:00
game 'gta5'
author 'atiysu'
lua54 'yes'
shared_scripts {
'config.lua',
'locales/locales.lua',
}
client_scripts {
'client/nui.lua',
'client/utils.lua',
'client/main.lua',
}
server_scripts {
'serverconfig.lua',
'server/utils.lua',
'server/main.lua',
}
ui_page 'ui/index.html'
files {
'ui/**/*.*',
'ui/*.*',
'database.json',
}
escrow_ignore {
'config.lua',
'locales/locales.lua',
'serverconfig.lua',
'client/*.lua',
'server/*.lua',
}
dependency '/assetpacks'Translation = {
["ro"] = {
["SPAMMING_MENU"] = "Deschizi meniul prea repede!",
["MISSION_ENDED"] = "Ai terminat cursa!",
["MISSION_STARTED"] = "Cursa a inceput!",
["VEHICLE_DESTROYED"] = "Vehiculul a fost distrus!",
["VEHICLE_ABANDONED"] = "Ai abandonat vehiculul!",
["WAIT_PASSENGERS_LEAVE"] = "Asteapta ca pasagerii sa coboare",
["WAIT_PASSENGERS_ENTER"] = "Asteapta pana cand pasagerii urca in vehicul",
["CRASHED_VEHICLE"] = "Ai avut un accident si ai primit o amenda de $%s",
["YOU_LET_PASSENGERS_IN"] = "%s pasageri au urcat in vehicul!",
["VEHICLE_CREATED"] = "Vehiculul tau a fost creat.",
["NO_EMPTY_LOT"] = "Nu exista niciun loc de parcare liber!",
["YOU_GOT_SALARY"] = "Ai terminat ruta si ai primit salariul de $%s",
["GOING_BACK"] = "Ai ajuns la ultima statie, te intorci!",
["DRIVER_MENU"] = "(%sm) Meniul Soferului de Autobuz",
["DRIVER_MENU_2"] = "[E] Meniul Soferului de Autobuz",
["END_MISSION"] = "(%sm) Termina Cursa",
["END_MISSION_2"] = "[E] Termina Cursa",
["GET_CLOSER"] = "(%sm) APROPIE-TE",
["LET_PASSENGERS_IN"] = "[E] Lasa pasagerii sa urce in vehicul",
["MENU"] = "DESCHIDE MENIU / TERMINA CURSA",
},
["tr"] = {
["SPAMMING_MENU"] = "Menüyü bu kadar hızlııp kapatamazsın!",
["MISSION_ENDED"] = "Görevi bitiridin!",
["MISSION_STARTED"] = "Görev başladı!",
["VEHICLE_DESTROYED"] = "Araç kullanılamaz halde!",
["VEHICLE_ABANDONED"] = "Aracaını terk ettin!",
["WAIT_PASSENGERS_LEAVE"] = "Yolcuların inmesini bekle",
["WAIT_PASSENGERS_ENTER"] = "Tüm yolcular araca binene kadar bekle",
["CRASHED_VEHICLE"] = "Kaza yaptın ve $%s dolar ceza yedin",
["YOU_LET_PASSENGERS_IN"] = "Araca %s adet yolcu bindi!",
["VEHICLE_CREATED"] = "Aracın oluşturuldu",
["NO_EMPTY_LOT"] = "Boş park alanı bulunamadı!",
["YOU_GOT_SALARY"] = "Rotayı bitirdin. Maaşın $%s olarak ödendi",
["GOING_BACK"] = "Son durağa geldin, geri dönüyorsun!",
["DRIVER_MENU"] = "(%sm) Otobüs Şoförü Menüsü",
["DRIVER_MENU_2"] = "[E] Otobüs Şoförü Menüsü",
["END_MISSION"] = "(%sm) Görevi Bitir",
["END_MISSION_2"] = "[E] Görevi Bitir",
["GET_CLOSER"] = "(%sm) YAKLAŞ",
["LET_PASSENGERS_IN"] = "[E] Yolcuları araca al",
["MENU"] = "MENÜYÜ AÇ / GÖREVİ BİTİR",
},
["en"] = {
["SPAMMING_MENU"] = "You are spamming the menu!",
["MISSION_ENDED"] = "You ended the mission!",
["MISSION_STARTED"] = "The mission just started!",
["VEHICLE_DESTROYED"] = "The vehicle was destroyed!",
["VEHICLE_ABANDONED"] = "You abandoned the vehicle!",
["WAIT_PASSENGERS_LEAVE"] = "Waiting for passengers to leave",
["WAIT_PASSENGERS_ENTER"] = "Wait until passengers enter the vehicle",
["CRASHED_VEHICLE"] = "You've crashed and fined $%s",
["YOU_LET_PASSENGERS_IN"] = "You let %s passengers into the vehicle!",
["VEHICLE_CREATED"] = "Your vehicle is created.",
["NO_EMPTY_LOT"] = "There is no empty parking lot!",
["YOU_GOT_SALARY"] = "You've finished the route and got $%s of sallary",
["GOING_BACK"] = "You've reached the last stop, going back!",
["DRIVER_MENU"] = "(%sm) Bus Driver Menu",
["DRIVER_MENU_2"] = "[E] Bus Driver Menu",
["END_MISSION"] = "(%sm) End The Mission",
["END_MISSION_2"] = "[E] End The Mission",
["GET_CLOSER"] = "(%sm) GET CLOSER",
["LET_PASSENGERS_IN"] = "[E] Let the passengers into the vehicle",
["MENU"] = "OPEN MENU / END JOB",
},
["es"] = {
["SPAMMING_MENU"] = "¡Estás haciendo spam en el menú!",
["MISSION_ENDED"] = "¡Terminaste la misión!",
["MISSION_STARTED"] = "¡La misión acaba de empezar!",
["VEHICLE_DESTROYED"] = "¡El vehículo fue destruido!",
["VEHICLE_ABANDONED"] = "¡Abandonaste el vehículo!",
["WAIT_PASSENGERS_LEAVE"] = "Esperando a que los pasajeros salgan",
["WAIT_PASSENGERS_ENTER"] = "Espera a que los pasajeros entren al vehículo",
["CRASHED_VEHICLE"] = "¡Has chocado y te han multado con $%s!",
["YOU_LET_PASSENGERS_IN"] = "¡Dejaste entrar a %s pasajeros al vehículo!",
["VEHICLE_CREATED"] = "Tu vehículo ha sido creado.",
["NO_EMPTY_LOT"] = "¡No hay espacio de estacionamiento disponible!",
["YOU_GOT_SALARY"] = "Terminaste la ruta y obtuviste un salario de $%s",
["GOING_BACK"] = "Has llegado a la última parada, ¡regresando!",
["DRIVER_MENU"] = "(%sm) Menú del Conductor de Autobús",
["DRIVER_MENU_2"] = "[E] Menú del Conductor de Autobús",
["END_MISSION"] = "(%sm) Finalizar la Misión",
["END_MISSION_2"] = "[E] Finalizar la Misión",
["GET_CLOSER"] = "(%sm) ACÉRCATE",
["LET_PASSENGERS_IN"] = "[E] Deja entrar a los pasajeros al vehículo",
["MENU"] = "ABRIR MENÚ / FINALIZAR TRABAJO",
},
["de"] = {
["SPAMMING_MENU"] = "Du spamst das Menü!",
["MISSION_ENDED"] = "Die Mission wurde beendet!",
["MISSION_STARTED"] = "Die Mission hat gerade begonnen!",
["VEHICLE_DESTROYED"] = "Das Fahrzeug wurde zerstört!",
["VEHICLE_ABANDONED"] = "Du hast das Fahrzeug verlassen!",
["WAIT_PASSENGERS_LEAVE"] = "Warten, bis die Passagiere aussteigen",
["WAIT_PASSENGERS_ENTER"] = "Warte, bis die Passagiere in das Fahrzeug einsteigen",
["CRASHED_VEHICLE"] = "Du bist abgestürzt und hast $%s Strafe bekommen!",
["YOU_LET_PASSENGERS_IN"] = "Du hast %s Passagiere in das Fahrzeug gelassen!",
["VEHICLE_CREATED"] = "Dein Fahrzeug wurde erstellt.",
["NO_EMPTY_LOT"] = "Es gibt keinen freien Parkplatz!",
["YOU_GOT_SALARY"] = "Du hast die Route beendet und $%s Gehalt erhalten",
["GOING_BACK"] = "Du hast die letzte Haltestelle erreicht, geh zurück!",
["DRIVER_MENU"] = "(%sm) Busfahrer-Menü",
["DRIVER_MENU_2"] = "[E] Busfahrer-Menü",
["END_MISSION"] = "(%sm) Mission beenden",
["END_MISSION_2"] = "[E] Mission beenden",
["GET_CLOSER"] = "(%sm) Näher herangehen",
["LET_PASSENGERS_IN"] = "[E] Die Passagiere in das Fahrzeug lassen",
["MENU"] = "MENÜ ÖFFNEN / JOB BEENDEN",
},
["ru"] = {
["SPAMMING_MENU"] = "Вы спамите меню!",
["MISSION_ENDED"] = "Миссия завершена!",
["MISSION_STARTED"] = "Миссия только началась!",
["VEHICLE_DESTROYED"] = "Транспортное средство уничтожено!",
["VEHICLE_ABANDONED"] = "Вы покинули транспортное средство!",
["WAIT_PASSENGERS_LEAVE"] = "Ожидание выхода пассажиров",
["WAIT_PASSENGERS_ENTER"] = "Подождите, пока пассажиры войдут в транспортное средство",
["CRASHED_VEHICLE"] = "Вы разбились и получили штраф в размере $%s!",
["YOU_LET_PASSENGERS_IN"] = "Вы пустили %s пассажиров в транспортное средство!",
["VEHICLE_CREATED"] = "Ваше транспортное средство создано.",
["NO_EMPTY_LOT"] = "Нет свободных мест для парковки!",
["YOU_GOT_SALARY"] = "Вы завершили маршрут и получили зарплату в размере $%s",
["GOING_BACK"] = "Вы достигли последней остановки, возвращаемся!",
["DRIVER_MENU"] = "(%sm) Меню водителя автобуса",
["DRIVER_MENU_2"] = "[E] Меню водителя автобуса",
["END_MISSION"] = "(%sm) Завершить миссию",
["END_MISSION_2"] = "[E] Завершить миссию",
["GET_CLOSER"] = "(%sm) Подойти ближе",
["LET_PASSENGERS_IN"] = "[E] Пустить пассажиров в транспортное средство",
["MENU"] = "ОТКРЫТЬ МЕНЮ / ЗАВЕРШИТЬ РАБОТУ",
},
}<00>PNG

IHDR
<00> pHYs  <00><>sRGB<00><><1C>gAMA<00><> <0B>a<00>IDATx<01>P<EFBFBD> <0A>0 <0C>]<06>(<28><>Q<EFBFBD>Ll<>m&)l<><08><>,<2C><>;)A( <20>R'w<><77>'U<>u]U<1D><>"<22><><17>o]<5D>݉ 7<><37>`b<><62>Eb@><3E>l<EFBFBD>Z{F圁<10><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><15>j'<27><12><><11>V<EFBFBD><56><1F>G<EFBFBD><47>(<28><> <20><><EFBFBD> <01>E<EFBFBD><45><01><><EFBFBD><EFBFBD><EFBFBD>P<EFBFBD>b}<7D><>M<EFBFBD><4D><EFBFBD><EFBFBD><EFBFBD>귯&<26>z)<19>Mt<4D>å/7<>F!<21>on<6F>R<EFBFBD><1C><>IEND<4E>B`<60><00>PNG

IHDR;0<><30> pHYs  <00><>sRGB<00><><1C>gAMA<00><> <0B>a!IDATx<01>W[pTw<1D><><EFBFBD><EFBFBD>5'7<>%I7P<37>%<25><><EFBFBD><EFBFBD>j<EFBFBD>ֶ<>8
<EFBFBD>A<EFBFBD><13><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>o<EFBFBD> <09><><EFBFBD>3J<33>љ<EFBFBD><03>u<>X`<1C><>A&LS*<2A><>ҤIȆ$K<>$d<>{<7B><><EFBFBD><EFBFBD><EFBFBD> !<03>L6<4C><36><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>}<7D><><EFBFBD><EFBFBD>~+<2B><><EFBFBD>F.<2E>t<EFBFBD>0<EFBFBD>7fm<><6D>x<EFBFBD>Kx<4B>U# @<40>/<2F><>+YN<59><<3C>5<11>Cȳw<C8B3><06><74>{<7B>ҭ<EFBFBD><D2AD><1E>mw<6D><77>W<01>7<EFBFBD>9<EFBFBD><14>1<EFBFBD>=Wz<>,<2C><><04>rv0)<29><><1A><02>7<EFBFBD><37><EFBFBD>[<5B>vl<76>+݀u <09><><EFBFBD>C<1F><><EFBFBD><1E>
C<EFBFBD>Yh<EFBFBD>ͻp<EFBFBD>|<00>T<EFBFBD><54>8<EFBFBD>*6<><36>ǵ<EFBFBD><C7B5>
T]C(l<>|<7C>u<EFBFBD>^<05> &\]h{<7B><>Jۋ+g<><67> <09>;!z<>!;ZN\<5C>w<EFBFBD>"<22><04>U<15>"C廢<43><E5BBA2><15>,3<11><>,<2C><>?<3F><><EFBFBD><1A><><<3C>#<23>: <0A><07><>U<EFBFBD>BP<13><>}<7D><<3C>J:k<><6B><1A><><EFBFBD><EFBFBD>Z <0A><00>"A(<28>u<>"<22>0<EFBFBD><30><EFBFBD>'<27><17>9:=<3D>k%<25><><EFBFBD>C<1E>A<EFBFBD>oeׁq<D781>c8%J8<4A>8<04>|<7C>&<26>*<2A><><EFBFBD><EFBFBD>%ͺ<><CDBA>$<24>ƿM<><4D><EFBFBD>F<EFBFBD><46> <16><>.<2E>]<19>G<04><>(2<01><>$<24><>n<EFBFBD><<08><>`<60><>x<>1B5<><35><EFBFBD>$ H<>5у]<5D>U<EFBFBD><55>%5<><35>ժ<10><><EFBFBD>D<EFBFBD>(<28>|<7C>.v<>.<2E><>-<2D>z<08><>@<40>$H<><48><EFBFBD><EFBFBD>Yv3<>F<>%<25>PA<50><41>@<05>)<29>b;e<><65>%<25>q<EFBFBD>L&g<>Z<EFBFBD>oi<6F><69>CK<43><4B><EFBFBD>ݿ<EFBFBD>
<EFBFBD><EFBFBD><1A>]<5D><><EFBFBD>X<EFBFBD>Et<45>r<EFBFBD>}_y[kuX<75><58><EFBFBD>HEs<45><73><EFBFBD><EFBFBD>HM<><4D>&<26>D-<2D><1F><><EFBFBD><EFBFBD><EFBFBD>y<EFBFBD><79><EFBFBD>ys>k<>^<5E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>R<EFBFBD><52><08> <20>af<61>R<><52><EFBFBD>V<EFBFBD><56><EFBFBD>Mx<4D>^Dѕ<44><D195>!<08>\@<40><><EFBFBD><>pr9<72>-<2D>>o<><6F>%2b<32>ʁ`<11><>˖e&<26><><EFBFBD>q<EFBFBD>z<EFBFBD>%<25><>}b4<62><1B>A<EFBFBD>t?<3F><>.|<7C>c~<7E><15><><EFBFBD>_F#k<><6B><EFBFBD><18><>`{l-&<26>N x<><78>}Y<>= <0B>:8<>R-<2D><><EFBFBD><EFBFBD>g?<3F>*<2A><><EFBFBD><EFBFBD><7F><EFBFBD><EFBFBD><EFBFBD>o<EFBFBD><6F><EFBFBD>/1<>0<EFBFBD><30>־2]<5D>W'<27>Ѣ<EFBFBD>:<3A><><EFBFBD>_#<23>E<EFBFBD>33<33>nMB<4D><42><EFBFBD>y<>b<EFBFBD>U[<5B>`,<2C>Dr< <09>X<12>ԝj<10>;3<>n<EFBFBD>&<26>Y<EFBFBD>@<40>Z<<3C><><1D><><EFBFBD><EFBFBD><04><10>v<>֡1<D6A1><31> <0B><><EFBFBD><EFBFBD>7<EFBFBD><37> @<40><><EFBFBD><EFBFBD>Ē<05><><EFBFBD>t<EFBFBD>\<5C><>rt<72><74>}<7D><>)ׅ<>?<04><><EFBFBD><EFBFBD>+y6<79><36>_<EFBFBD>c<><06><>yBm-Đ<><C490><EFBFBD>5<08><><EFBFBD> cO<63><00>l<EFBFBD>]<5D>$<24>ޝ<EFBFBD><DE9D>L<EFBFBD><4C><><D0A6>Z<>ey<65><79>\<5C>A<EFBFBD>C<EFBFBD><43><EFBFBD><EFBFBD><EFBFBD>Ɏ<EFBFBD>"99 7<1C><><EFBFBD><02><>J<><0E><><>!zs <02>g<EFBFBD>M<EFBFBD><4D><EFBFBD><EFBFBD>)<02>0Qwu<77> b<>x>X<><58><EFBFBD>UcPR<50><52>{<7B>AL <0C><>t<EFBFBD><74>|<7C>es<65>`<60>F<EFBFBD><46><19>/<>b<EFBFBD><62><EFBFBD><EFBFBD>
ϯ-jH<6A><48>pm<1B>e<EFBFBD><65>9h<39>ԏ<EFBFBD>t<EFBFBD><74>,<2C>J<EFBFBD>i<EFBFBD><69>#<23><><EFBFBD>l<EFBFBD><6C>AB<41><42>jw<1C>Ly<><79>@
<EFBFBD>gf<EFBFBD><EFBFBD>?/C߸<06>[B%<25><>_<EFBFBD>z΄<7A>l;B<>6<EFBFBD>^<5E><><13>/<2F><><EFBFBD><EFBFBD>Yf3ѐ<33><1E><><00><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>א<EFBFBD><D790>u<1A><>N<EFBFBD> Ë<><C38B>j| r<><14><>]<5D><>3<EFBFBD><33>Ґd<15>:<3A><><EFBFBD>I<> <20>ϲ; <09>lX<6C><58><EFBFBD><EFBFBD><EFBFBD>[<5B>|Z<><5A><17>{<7B>
<EFBFBD><16>J;%<25><14><><EFBFBD>ʅ R/`<60>{=Pܪx<DCAA> T{8<><38><1A>g<EFBFBD><1D><><EFBFBD>1}'Ih<><15>\<17><>f<EFBFBD><66><EFBFBD>Ρ<CEA1>L<><4C>k<><6B>d <0C>a<EFBFBD><61><EFBFBD><EFBFBD>s<EFBFBD>q<EFBFBD><71>OgPf<50><66>7<EFBFBD><37><EFBFBD>ql<71>N<EFBFBD><4E><EFBFBD>H<EFBFBD>/_<>L<EFBFBD><4C>g<EFBFBD>
_醧v*C <09>0<EFBFBD>B>9A@U<>, <20>b"<22>k4<6B><34>ON\ď<>[<5B><1D>O!X<13><>ug<75><67><EFBFBD><EFBFBD><07> B `<60><>Y<EFBFBD>B<EFBFBD><42><EFBFBD><EFBFBD>[XGA<47><41><EFBFBD>(ɡ<><C9A1><EFBFBD>9<EFBFBD>I<EFBFBD><49><EFBFBD><<<0E><>en&<26>"<22><><EFBFBD>ݼ<0F><>э<EFBFBD>)<29><><EFBFBD><EFBFBD><EFBFBD>-<2D><1E>d#S<05><>X!<21>߹><3E><><EFBFBD>gx,<2C><>ۨ;{<7B>[<5B><>Ūn<C5AA><6E>G<EFBFBD>#i<><69><EFBFBD><EFBFBD>H|<15>)I<><49>a<EFBFBD>w]<5D><>ˤMe<4D>`<60><>KaR<61>*<2A><>ϔ<EFBFBD>q<EFBFBD>Nb<4E><62><EFBFBD><EFBFBD><EFBFBD> <20>b<EFBFBD><62>e<EFBFBD><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><<3C>t_<74>o3[b<><07>|<7C>{<7B>!q<>p<EFBFBD><70>*<2A><>Z<05><>F<EFBFBD><46>ȁ <20>!<21><><EFBFBD><EFBFBD>)(<28>K<EFBFBD>-<2D><><EFBFBD><EFBFBD>u(XedI<64>MP<4D>k,2<>qh<71><68><EFBFBD>W56<1E>WoO<6F><EFBFBD>j<EFBFBD><6A>L<EFBFBD><4C><EFBFBD><EFBFBD>̥y<CCA5>D<05>g<EFBFBD><67>/56@<40>3<EFBFBD>H<EFBFBD>@@<40><><EFBFBD><14>*<2A><06><>0<02><$M<>,<2C><><EFBFBD><EFBFBD>Nޚ@<40>¬3<C2AC>.<2E>V<1F><>ի]<5D>=<3D><EFBFBD><7F>;<3B><12><12>1f<31><66><EFBFBD>;<3B>hE<68>C<EFBFBD><43><EFBFBD><EFBFBD>.<2E>sl.<2E><15><>u<EFBFBD><75>0<EFBFBD>P
_"Kd<4B>h<EFBFBD> <0E>}qLz<4C><7A>dj<64>k9<6B><03><><EFBFBD>H<EFBFBD><48><EFBFBD>v|<7C>s<EFBFBD>-1<><31>(<28><>b<EFBFBD>fB<66><42>E<EFBFBD>@<40>O<EFBFBD>A<EFBFBD>ZSУ]<5D>><3E><07>X<EFBFBD><58><EFBFBD>k<EFBFBD><6B><EFBFBD>?s<><73>J<EFBFBD>?t<><74>;p &<26>B]j <20>_<EFBFBD>g)<29>+<2B><><EFBFBD># <20>Ěs~f,<2C>5<EFBFBD><35>m<EFBFBD>ô<EFBFBD><C3B4>oq><3E>v<EFBFBD><76><03><><<3C>W<EFBFBD>O<EFBFBD>x#V<><56>]<5D><><EFBFBD><EFBFBD>"wȚj<C89A>YJ<59>E<EFBFBD>"b?Ks<4B><73><EFBFBD><EFBFBD><EFBFBD>v<EFBFBD>x<EFBFBD>a<EFBFBD><61><05><><EFBFBD>;t<>04<30>Հ<EFBFBD><D580><01>uu%<25><><EFBFBD><01>R<EFBFBD><52>9<0E>.IEND<4E>B`<60><00>PNG

IHDR U<>\<5C> pHYs<10><10>&<26>:4sRGB<00><><1C>gAMA<00><> <0B>a:IDATx DQ<44>T]4<>E<EFBFBD><EFBFBD>Kg<4B><67>t<>_~HZ$<24>3ۭ@D<><44><<30>?<3F><>řH
8<EFBFBD>IEND<4E>B`<60><00>PNG

IHDR
<00><><EFBFBD>I pHYs  <00><>sRGB<00><><1C>gAMA<00><> <0B>aIDATx<01><>1A0<41>i?<3F>`<60><>3<EFBFBD>z<EFBFBD><7A><EFBFBD>9<EFBFBD><39><08><><EFBFBD>JIEND<4E>B`<60><00>PNG

IHDR0(<00><>yq pHYs  <00><>sRGB<00><><1C>gAMA<00><> <0B>a<02>IDATx<01><>=hA<18>߉i<14><><EFBFBD>ʋ<EFBFBD><41>`%<25>!<21><>l,l$<24><> Xj%
<EFBFBD><EFBFBD><EFBFBD>VZ<EFBFBD>€<EFBFBD>*<11><>(<28>;<3B>B<EFBFBD><42>9<>0©EB<45><42><EFBFBD><EFBFBD><EFBFBD>r<EFBFBD><72><EFBFBD><EFBFBD>]<5D><> <<3C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*<11> `<60>nEQ<7F>G<EFBFBD><47>e<EFBFBD>xI<78><49>?<3F>ҊR<D28A><52><EFBFBD>=LbLKĞ<4B>wZ<77><5A><EFBFBD>?<03>^<5E><><EFBFBD>M&<26>Nq<4E>>A<><41><EFBFBD>W<EFBFBD><57>saK<61>h"<22><><EFBFBD><EFBFBD><EFBFBD>-K<><4B>}<7D>ѝ<EFBFBD><D19D><EFBFBD>fIp3<70><33><EFBFBD><EFBFBD>e<EFBFBD><65><EFBFBD><EFBFBD>i<EFBFBD><69>'<27><>s<EFBFBD>g<EFBFBD>;W<>01-<2D>D<44>:/a<><61><EFBFBD><EFBFBD>N<EFBFBD>}<7D><>?E<>Iq1<>!^`<60><>(P<>S:<3A><><EFBFBD>L<EFBFBD>H7<48><37>$<24><>#<23><>b<06><>:_r<5F><72><EFBFBD>Ih\<5C>)<29> ^<5E>{<7B> <09><01>Ξ+t<>~<7E><><EFBFBD><02><>7<EFBFBD>\<5C> =N<><4E>wt<77>Z<><5A><16><>{<1C>5t&x<><1E><>Sp:<3A>o#6<18>fzW<7A>ܠ<EFBFBD><1B><><EFBFBD><<3C><><EFBFBD>a<EFBFBD><06>z!<21><CL0<4C><30>R<EFBFBD><52><EFBFBD> [;}D 0<>K<12><05><06>C̪3=<3D><><EFBFBD>M<EFBFBD><4D>OJ<4F><4A>B/<10><>s<EFBFBD>[g<>Q<EFBFBD>N<EFBFBD><4E>mX鬸9K/z<><7A>A <08>Nps<70>Q,<2C>Y<EFBFBD>|<7C>Y+<2B><><EFBFBD>tkZeE<65><45>o<EFBFBD>,<2C>9<EFBFBD>J<EFBFBD><4A>׍|<7C>P<><50><16>BK<42>2S<32><00>j<EFBFBD>L7<4C><37><EFBFBD>s<EFBFBD>[<5B>yd<>Haޡ<61>܌<EFBFBD><DC8C><EFBFBD><43>u<EFBFBD><75><11>3<EFBFBD><33><EFBFBD>q[<5B>.+v<>2jF<03>?<3F>^G? <20>4oU<6F>Z<>; <0C>}<7D><>:<3A>Xap<61>u<EFBFBD><75><EFBFBD>=<3D><>`PğIt<49><74>YL<59>%<25>k:<3A><><EFBFBD>e<><65> 1_%~y `<60><><EFBFBD><EFBFBD>a`cb<58>!<21> m<>D<EFBFBD><44><EFBFBD><EFBFBD><EFBFBD>\<5C><><EFBFBD>S<18>>;&V5<56> jF[<5B><>IEND<4E>B`<60><00>PNG

IHDR<00>xl0 pHYs  <00><>sRGB<00><><1C>gAMA<00><> <0B>aTIDATx<01>U<EFBFBD>q<EFBFBD>0<10><><EFBFBD><EFBFBD>gJ @<07>H<07><>Ii<>d\A܁<41>
B<EFBFBD>| <0B><><EFBFBD><EFBFBD><EFBFBD> "<22><>8~3<>v<EFBFBD><76>魐9<E9AD90><39><EFBFBD><EFBFBD>`<18>w<EFBFBD><77>y<EFBFBD>s<EFBFBD>u<1C><><EFBFBD><EFBFBD>,<2C>Г<EFBFBD><D093><11>3<EFBFBD><33>e,C<><00>?<3F><>5@}<7D>6<EFBFBD>$(<28>"<22><>35V<35>5?<3F><>p<EFBFBD>h-G<><47>
SP<EFBFBD>c<06>!<21>٘<EFBFBD><D998><EFBFBD><EFBFBD><17><>p<><70><EFBFBD><EFBFBD><EFBFBD><14>V8<56>Y(<28><>.dw<64><77><EFBFBD><EFBFBD>\<12><><1B><6F> <0A><>%<25>%<25>S<02>2us<75><<3C>;<3B><00>;<3B><><EFBFBD><EFBFBD>)<01>INTY<54>4aYV"$<24><EFBFBD><E6829E>c<EFBFBD>ڤ[<5B><><EFBFBD><EFBFBD>@<40><>'<27><>N\1<><31><EFBFBD><EC9484>VUu<55>t<EFBFBD><74>V<EFBFBD><><D78D><EFBFBD>9<EFBFBD><00>D(<28> <0A><><EFBFBD>ڣ<EFBFBD>1=<3D><><EFBFBD><1A>;y|"$<24><>%4<>d[<5B><><EFBFBD>k*$<24><>A<><41><EFBFBD>c<EFBFBD><63><EFBFBD>=g<><67>*Y<><59>IEND<4E>B`<60><00>PNG

IHDR /8<05> pHYs  <00><>sRGB<00><><1C>gAMA<00><> <0B>a<00>IDATxe<><65> <0A> <14><><11><01><>;B7<42><1B>NP7<50>c<> @<40><>*<2A>'<27><><EFBFBD><EFBFBD>r8PR<50><52>_RJw<4A><1F><><EFBFBD>9<EFBFBD>F/Q3<51>gf<67>
K+<0E>E<EFBFBD>c<><63>`k<>X\V<18><><EFBFBD>VXp<58>/<1B>Õ<EFBFBD>r<><1C><>M+<2B>'$྅K<E0BE85><4B><EFBFBD><EFBFBD><EFBFBD><1C><>ȿd<C8BF><64>h<EFBFBD><68>2u<32>m<07><18> <0C><>.sԎ<15><>/<1C><><EFBFBD><05>:L<>#<23>IEND<4E>B`<60>@import url("https://fonts.googleapis.com/css2?family=Barlow:wght@100;200;300;400;500;600;700;800;900&display=swap");
* {
margin: 0;
padding: 0;
user-select: none;
box-sizing: border-box;
user-select: none;
font-family: "Barlow", sans-serif;
}
body {
overflow: hidden;
width: 100vw;
height: 100vh;
}
::-webkit-scrollbar {
width: 0px;
}
.leaderboard {
position: absolute;
left: 5vw;
top: 6vh;
display: flex;
flex-direction: column;
gap: 10px;
padding: 20px;
border-radius: 2px;
background: rgba(116, 116, 116, 0.2);
width: 20vw;
display: none;
}
.leaderboard .title-wrapper {
display: flex;
align-items: center;
gap: 10px;
}
.leaderboard .title-wrapper .title {
color: #dfdfdf;
font-size: 30px;
font-weight: 600;
}
.leaderboard .title-wrapper .icon {
width: 50px;
height: 50px;
display: flex;
align-items: center;
justify-content: center;
border-radius: 2px;
background: rgba(233, 233, 233, 0.1);
}
.leaderboard .players-wrapper {
display: flex;
flex-direction: column;
gap: 5px;
}
.leaderboard .players-wrapper .player {
display: flex;
border-radius: 2px;
background: rgba(233, 233, 233, 0.1);
padding: 10px;
align-items: center;
gap: 20px;
}
.leaderboard .players-wrapper .player .rank {
color: #FFF;
font-size: 20px;
font-weight: 600;
text-align: center;
}
.leaderboard .players-wrapper .player .other {
display: flex;
justify-content: space-between;
align-items: center;
width: 87%;
}
.leaderboard .players-wrapper .player .total-routes {
text-align: right;
width: 22%;
}
.leaderboard .players-wrapper .player .total-routes .title {
color: rgb(203, 203, 203);
font-size: 10px;
font-weight: 500;
}
.leaderboard .players-wrapper .player .total-routes .text {
color: #FFF;
font-size: 12px;
font-weight: 500;
}
.leaderboard .players-wrapper .player .pp-wrapper {
display: flex;
align-items: center;
gap: 5px;
width: 75%;
}
.leaderboard .players-wrapper .player .pp-wrapper .name {
color: #F0F0F0;
font-size: 20px;
font-weight: 500;
text-transform: uppercase;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
width: 100%;
}
.leaderboard .players-wrapper .player .pp-wrapper .pp {
width: 30px;
height: 30px;
border-radius: 50%;
overflow: hidden;
position: relative;
}
.leaderboard .players-wrapper .player .pp-wrapper .pp img {
width: 100%;
border-radius: 50%;
}
.timer {
position: absolute;
top: 2vh;
left: 50%;
transform: translateX(-50%);
width: fit-content;
height: fit-content;
display: none;
padding: 0.5vw 5vw;
background: rgba(255, 255, 255, 0.2);
color: #fff;
font-size: 20px;
border-radius: 2px;
}
.timer::after {
content: "";
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
z-index: -1;
position: absolute;
width: 200%;
height: 400%;
border-radius: 50%;
background: radial-gradient(49.84% 49.84% at 50% 50.16%, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0) 100%);
}
.stops-box {
border-radius: 2px;
background: rgba(255, 255, 255, 0.2);
position: absolute;
top: 7vh;
left: 2vw;
padding: 20px 30px;
width: 15vw;
display: none;
}
.stops-box::after {
content: "";
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
z-index: -1;
position: absolute;
width: 400%;
height: 300%;
border-radius: 50%;
background: radial-gradient(49.84% 49.84% at 50% 50.16%, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0) 100%);
}
.stops-box .title {
color: #EEE;
font-size: 24px;
font-weight: 700;
opacity: 0.9;
margin-bottom: 10px;
}
.stops-box .stops {
display: flex;
flex-direction: column;
}
.stops-box .stops #stop-next {
opacity: 0.5;
}
.stops-box .stops .stop {
color: #FFF;
font-size: 12px;
font-weight: 500;
padding-left: 10px;
opacity: 0.4;
position: relative;
line-height: 100%;
}
.stops-box .stops .stop::after {
content: "";
width: 3px;
height: 3px;
border-radius: 50%;
background-color: #fff;
position: absolute;
left: 0;
top: 50%;
transform: translateY(-50%);
}
.stops-box .stops .stop.active {
color: #F90;
font-size: 14px;
opacity: 1;
font-weight: 600;
}
.stops-box .stops .stop.active::after {
width: 5px;
height: 5px;
background-color: #F90;
}
main {
width: 35vw;
height: 100vh;
position: absolute;
right: 0;
top: 0;
background: linear-gradient(270deg, #000 -19.93%, #000 -19.92%, rgba(0, 0, 0, 0) 100%);
display: none;
flex-direction: column;
align-items: end;
padding: 3vh 3vw;
}
main .lines {
position: absolute;
display: flex;
gap: 1vw;
transform: rotate(-25.5deg);
right: -15%;
top: -15%;
z-index: -1;
}
main .lines .line-a {
width: 2vw;
height: 100vh;
background: linear-gradient(180deg, #F90 0%, rgba(255, 153, 0, 0) 100%);
}
main .lines .line-b {
width: 5vw;
height: 100vh;
background: linear-gradient(180deg, #F90 0%, rgba(255, 153, 0, 0) 100%);
}
main .lines .line-c {
width: 7vw;
height: 100vh;
background: linear-gradient(180deg, #F90 0%, rgba(255, 153, 0, 0) 100%);
}
main .header {
margin-bottom: 4vh;
}
main .header .title-wrapper {
display: flex;
align-items: center;
justify-content: end;
margin-bottom: 2vh;
gap: 20px;
}
main .header .title-wrapper img {
height: 40px;
}
main .header .title-wrapper span {
color: #FFFFFF;
font-size: 48px;
font-weight: 800;
letter-spacing: 1.92px;
display: flex;
gap: 10px;
}
main .header .title-wrapper span p {
color: #F90;
}
main .header .desc {
color: rgba(255, 255, 255, 0.6);
text-align: right;
font-size: 12px;
font-weight: 300;
padding-left: 16%;
margin-bottom: 2vh;
}
main .header .user-info {
display: flex;
flex-direction: column;
align-items: flex-end;
}
main .header .user-info .title {
color: #FFF;
text-align: right;
font-size: 24px;
font-weight: 700;
margin-bottom: 9px;
}
main .header .user-info .user {
display: flex;
align-items: center;
gap: 6px;
}
main .header .user-info .user .name-wrapper {
display: flex;
align-items: end;
flex-direction: column;
text-transform: uppercase;
text-align: right;
}
main .header .user-info .user .name-wrapper .name {
color: #FFF;
font-size: 16px;
font-weight: 700;
}
main .header .user-info .user .name-wrapper .level {
color: #9D9D9D;
font-size: 10px;
font-weight: 500;
}
main .header .user-info .user .name-wrapper .level span {
color: #F90;
}
main .header .user-info .user .pp {
border: 1px solid rgba(255, 255, 255, 0.5);
box-shadow: 0px 0px 10px 0 rgba(255, 255, 255, 0.3), inset 0px 0px 10px 0 rgba(255, 255, 255, 0.3);
border-radius: 50%;
width: 36px;
height: 36px;
padding: 2px;
}
main .header .user-info .user .pp img {
border-radius: 50%;
width: 100%;
}
main .section {
position: relative;
padding-bottom: 35px;
padding-right: 15px;
margin-bottom: 4vh;
display: flex;
flex-direction: column;
align-items: end;
width: 17vw;
gap: 15px;
}
main .section#stops-sec {
display: none;
}
main .section#stops-sec .box {
background: linear-gradient(270deg, rgba(255, 255, 255, 0.2) 0%, rgba(255, 255, 255, 0) 100%);
}
main .section#routes-sec .box:hover {
background: linear-gradient(270deg, rgba(255, 255, 255, 0.2) 0%, rgba(255, 255, 255, 0) 100%);
transform: translateX(-10px);
}
main .section#routes-sec .box.active {
background: linear-gradient(270deg, rgba(255, 255, 255, 0.2) 0%, rgba(255, 255, 255, 0) 100%);
transform: translateX(-10px);
}
main .section .section {
position: absolute;
right: 110%;
width: 17vw;
top: 0;
}
main .section .section .image-box {
position: absolute;
right: 100%;
top: 50%;
transform: translateY(-50%);
width: 20vw;
height: auto;
padding: 10px;
border-radius: 2px;
background: rgba(255, 255, 255, 0.2);
display: none;
}
main .section .section .image-box img {
width: 100%;
}
main .section .section::after {
z-index: -1;
content: "";
position: absolute;
width: 200%;
height: 150%;
background: #6C6C6C;
border-radius: 50%;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
background: radial-gradient(50% 50% at 50% 50%, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0) 95%);
}
main .section .section .content {
max-height: 35vh;
overflow: visible;
width: 100%;
}
main .section .section .content .box-wrapper {
max-height: 26vh;
overflow-y: scroll;
display: flex;
flex-direction: column;
gap: 10px;
width: 100%;
position: relative;
}
main .section .section .content .start-btn {
border-radius: 2px;
background: rgba(255, 255, 255, 0.15);
padding: 10px 45px;
width: fit-content;
color: #FFF;
text-align: center;
font-size: 13px;
font-weight: 500;
letter-spacing: -0.26px;
cursor: pointer;
margin-top: 5px;
}
main .section .section .content .start-btn:hover {
background: rgba(255, 255, 255, 0.2);
}
main .section .bottom-icon {
position: absolute;
bottom: 4px;
right: 12px;
}
main .section::after {
content: "";
position: absolute;
width: 1px;
height: 100%;
background: #6C6C6C;
bottom: 0;
right: 0;
border-radius: 2px;
}
main .section .sec-title {
text-align: right;
display: flex;
gap: 10px;
align-items: end;
}
main .section .sec-title .title {
color: #F0F0F0;
font-size: 24px;
font-weight: 600;
}
main .section .sec-title .counter {
color: #F90;
font-size: 15px;
font-weight: 600;
position: relative;
padding-bottom: 7px;
}
main .section .sec-title .counter::before {
content: "";
position: absolute;
width: 2px;
height: 2px;
background: #1AE022;
top: -1px;
right: -3px;
border-radius: 50%;
}
main .section .sec-title .counter::after {
content: "";
position: absolute;
bottom: 4px;
left: -10%;
width: 120%;
height: 1px;
background: #6C6C6C;
}
main .section .content {
text-align: right;
max-height: 12.5vh;
overflow-y: scroll;
display: flex;
flex-direction: column;
align-items: end;
gap: 10px;
width: 100%;
}
main .section .content .users {
display: flex;
flex-direction: column;
align-items: end;
gap: 13px;
}
main .section .content .users .user {
display: flex;
align-items: center;
gap: 6px;
}
main .section .content .users .user .name-wrapper {
display: flex;
align-items: end;
flex-direction: column;
text-transform: uppercase;
text-align: right;
}
main .section .content .users .user .name-wrapper .name {
color: #FFF;
font-size: 16px;
font-weight: 700;
}
main .section .content .users .user .name-wrapper .current-place {
color: #9D9D9D;
font-size: 10px;
font-weight: 500;
}
main .section .content .users .user .name-wrapper .current-place span {
color: #F90;
}
main .section .content .users .user .pp {
border: 1px solid rgba(255, 255, 255, 0.5);
box-shadow: 0px 0px 10px 0 rgba(255, 255, 255, 0.3), inset 0px 0px 10px 0 rgba(255, 255, 255, 0.3);
border-radius: 50%;
width: 36px;
height: 36px;
padding: 2px;
}
main .section .content .users .user .pp img {
border-radius: 50%;
width: 100%;
}
main .section .content .box {
width: 100%;
padding: 10px;
border-radius: 2px;
background: linear-gradient(270deg, rgba(255, 255, 255, 0.15) 0%, rgba(255, 255, 255, 0) 100%);
display: flex;
flex-direction: column;
align-items: end;
gap: 4px;
cursor: pointer;
position: relative;
transition: 0.2s;
}
main .section .content .box.disabled {
background: linear-gradient(270deg, rgba(255, 255, 255, 0.07) 0%, rgba(255, 255, 255, 0) 100%) !important;
pointer-events: none;
}
main .section .content .box.disabled .box-header, main .section .content .box.disabled .box-content {
opacity: 0.2;
}
main .section .content .box .box-header {
display: flex;
gap: 14px;
}
main .section .content .box .box-header .item {
color: rgba(198, 198, 198, 0.7);
font-size: 10px;
font-weight: 600;
display: flex;
align-items: center;
}
main .section .content .box .box-header .item.salary, main .section .content .box .box-header .item.level {
display: flex;
gap: 3px;
}
main .section .content .box .box-header .item.salary span, main .section .content .box .box-header .item.level span {
color: #F90;
}
main .section .content .box .box-header .item.title {
color: #C6C6C6;
font-size: 12px;
font-weight: 600;
display: flex;
align-items: center;
gap: 3px;
}
main .section .content .box .box-content {
text-align: right;
font-size: 14px;
font-weight: 500;
text-transform: uppercase;
color: #9D9D9D;
}
main .section .content .box .box-content span {
color: #F90;
}
/*# sourceMappingURL=style.css.map */
{"version":3,"sourceRoot":"","sources":["style.scss"],"names":[],"mappings":"AAAQ;AAER;EACI;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;;AAEA;EACI;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AAIR;EACI;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;;AAEA;EACI;EACA;EACA;;AAGJ;EACI;EACA;EACA;;AAIR;EACI;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;;;AAQxB;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAIR;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;;AAEA;EACI;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;;;AAOpB;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;;AAGJ;EACI;EACA;EACA;;AAGJ;EACI;EACA;EACA;;AAIR;EACI;;AAEA;EACI;EACA;EACA;EACA;EACA;;AAEA;EACI;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;;AAKZ;EACI;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;;AAGJ;EACI;EACA;EACA;;AAEA;EACI;;AAKZ;EACI;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;;AAOpB;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;;AAEA;EACI;;AAMA;EACI;EACA;;AAGJ;EACI;EACA;;AAKZ;EACI;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;;AAIR;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;;AAMhB;EACI;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AAKZ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;;AAGJ;EACI;EACA;EACA;;AAEA;EACI;;AAKZ;EACI;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;;AAMhB;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EAKI;EACA;;AALA;EACI;;AAOR;EACI;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;;AAEA;EACI;;AAIR;EACI;EACA;EACA;EACA;EACA;EACA;;AAKZ;EACI;EACA;EACA;EACA;EACA;;AAEA;EACI","file":"style.css"}
*{
margin: 0;
padding: 0;
user-select: none;
box-sizing: border-box;
user-select: none;
font-family: 'Barlow', sans-serif;
}
body{
overflow: hidden;
width: 100vw;
height: 100vh;
}
::-webkit-scrollbar {
width: 0px;
}
.leaderboard{
position: absolute;
left: 5vw;
top: 6vh;
display: flex;
flex-direction: column;
gap: 10px;
padding: 20px;
border-radius: 2px;
background: rgba(116, 116, 116, 0.2);
width: 20vw;
display: none;
.title-wrapper{
display: flex;
align-items: center;
gap: 10px;
.title{
color: #dfdfdf;
font-size: 30px;
font-weight: 600;
}
.icon{
width: 50px;
height: 50px;
display: flex;
align-items: center;
justify-content: center;
border-radius: 2px;
background: rgba(233, 233, 233, 0.1);
}
}
.players-wrapper{
display: flex;
flex-direction: column;
gap: 5px;
.player{
display: flex;
border-radius: 2px;
background: rgba(233, 233, 233, 0.1);
padding: 10px;
align-items: center;
gap: 20px;
.rank{
color: #FFF;
font-size: 20px;
font-weight: 600;
text-align: center;
}
.other{
display: flex;
justify-content: space-between;
align-items: center;
width: 87%;
}
.total-routes{
text-align: right;
width: 22%;
.title{
color: rgb(203, 203, 203);
font-size: 10px;
font-weight: 500;
}
.text{
color: #FFF;
font-size: 12px;
font-weight: 500;
}
}
.pp-wrapper{
display: flex;
align-items: center;
gap: 5px;
width: 75%;
.name{
color: #F0F0F0;
font-size: 20px;
font-weight: 500;
text-transform: uppercase;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
width: 100%;
}
.pp{
width: 30px;
height: 30px;
border-radius: 50%;
overflow: hidden;
position: relative;
img{
width: 100%;
border-radius: 50%;
}
}
}
}
}
}
.timer{
position: absolute;
top: 2vh;
left: 50%;
transform: translateX(-50%);
width: fit-content;
height: fit-content;
display: none;
padding: 0.5vw 5vw;
background: rgba(255, 255, 255, 0.20);
color: #fff;
font-size: 20px;
border-radius: 2px;
&::after{
content: '';
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
z-index: -1;
position: absolute;
width: 200%;
height: 400%;
border-radius: 50%;
background: radial-gradient(49.84% 49.84% at 50% 50.16%, rgba(0, 0, 0, 0.50) 0%, rgba(0, 0, 0, 0.00) 100%);
}
}
.stops-box{
border-radius: 2px;
background: rgba(255, 255, 255, 0.20);
position: absolute;
top: 7vh;
left: 2vw;
padding: 20px 30px;
width: 15vw;
display: none;
&::after{
content: '';
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
z-index: -1;
position: absolute;
width: 400%;
height: 300%;
border-radius: 50%;
background: radial-gradient(49.84% 49.84% at 50% 50.16%, rgba(0, 0, 0, 0.50) 0%, rgba(0, 0, 0, 0.00) 100%);
}
.title{
color: #EEE;
font-size: 24px;
font-weight: 700;
opacity: 0.9;
margin-bottom: 10px;
}
.stops{
display: flex;
flex-direction: column;
#stop-next{
opacity: 0.5;
}
.stop{
color: #FFF;
font-size: 12px;
font-weight: 500;
padding-left: 10px;
opacity: 0.4;
position: relative;
line-height: 100%;
&::after{
content: '';
width: 3px;
height: 3px;
border-radius: 50%;
background-color: #fff;
position: absolute;
left: 0;
top: 50%;
transform: translateY(-50%);
}
&.active{
color: #F90;
font-size: 14px;
opacity: 1;
font-weight: 600;
&::after{
width: 5px;
height: 5px;
background-color: #F90;
}
}
}
}
}
main{
width: 35vw;
height: 100vh;
position: absolute;
right: 0;
top: 0;
background: linear-gradient(270deg, #000 -19.93%, #000 -19.92%, rgba(0, 0, 0, 0.00) 100%);
display: none;
flex-direction: column;
align-items: end;
padding: 3vh 3vw;
.lines{
position: absolute;
display: flex;
gap: 1vw;
transform: rotate(-25.5deg);
right: -15%;
top: -15%;
z-index: -1;
.line-a{
width: 2vw;
height: 100vh;
background: linear-gradient(180deg, #F90 0%, rgba(255, 153, 0, 0.00) 100%);
}
.line-b{
width: 5vw;
height: 100vh;
background: linear-gradient(180deg, #F90 0%, rgba(255, 153, 0, 0.00) 100%);
}
.line-c{
width: 7vw;
height: 100vh;
background: linear-gradient(180deg, #F90 0%, rgba(255, 153, 0, 0.00) 100%);
}
}
.header{
margin-bottom: 4vh;
.title-wrapper{
display: flex;
align-items: center;
justify-content: end;
margin-bottom: 2vh;
gap: 20px;
img{
height: 40px;
}
span{
color: #FFFFFF;
font-size: 48px;
font-weight: 800;
letter-spacing: 1.92px;
display: flex;
gap: 10px;
p{
color: #F90;
}
}
}
.desc{
color: rgba(255, 255, 255, 0.60);
text-align: right;
font-size: 12px;
font-weight: 300;
padding-left: 16%;
margin-bottom: 2vh;
}
.user-info{
display: flex;
flex-direction: column;
align-items: flex-end;
.title{
color: #FFF;
text-align: right;
font-size: 24px;
font-weight: 700;
margin-bottom: 9px;
}
.user{
display: flex;
align-items: center;
gap: 6px;
.name-wrapper{
display: flex;
align-items: end;
flex-direction: column;
text-transform: uppercase;
text-align: right;
.name{
color: #FFF;
font-size: 16px;
font-weight: 700;
}
.level{
color: #9D9D9D;
font-size: 10px;
font-weight: 500;
span{
color: #F90;
}
}
}
.pp{
border: 1px solid rgba(255, 255, 255, 0.5);
box-shadow: 0px 0px 10px 0 rgba(255, 255, 255, 0.3), inset 0px 0px 10px 0 rgba(255, 255, 255, 0.3);
border-radius: 50%;
width: 36px;
height: 36px;
padding: 2px;
img{
border-radius: 50%;
width: 100%;
}
}
}
}
}
.section{
position: relative;
padding-bottom: 35px;
padding-right: 15px;
margin-bottom: 4vh;
display: flex;
flex-direction: column;
align-items: end;
width: 17vw;
gap: 15px;
&#stops-sec{
display: none;
.box{
background: linear-gradient(270deg, rgba(255, 255, 255, 0.20) 0%, rgba(255, 255, 255, 0.00) 100%);
}
}
&#routes-sec{
.box{
&:hover{
background: linear-gradient(270deg, rgba(255, 255, 255, 0.20) 0%, rgba(255, 255, 255, 0.00) 100%);
transform: translateX(-10px);
}
&.active{
background: linear-gradient(270deg, rgba(255, 255, 255, 0.20) 0%, rgba(255, 255, 255, 0.00) 100%);
transform: translateX(-10px);
}
}
}
.section{
position: absolute;
right: 110%;
width: 17vw;
top: 0;
.image-box{
position: absolute;
right: 100%;
top: 50%;
transform: translateY(-50%);
width: 20vw;
height: auto;
padding: 10px;
border-radius: 2px;
background: rgba(255, 255, 255, 0.20);
display: none;
img{
width: 100%;
}
}
&::after{
z-index: -1;
content: '';
position: absolute;
width: 200%;
height: 150%;
background: #6C6C6C;
border-radius: 50%;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
background: radial-gradient(50% 50% at 50% 50%, rgba(0, 0, 0, 0.50) 0%, rgba(0, 0, 0, 0.0) 95%);
}
.content{
max-height: 35vh;
overflow: visible;
width: 100%;
.box-wrapper{
max-height: 26vh;
overflow-y: scroll;
display: flex;
flex-direction: column;
gap: 10px;
width: 100%;
position: relative;
}
.start-btn{
border-radius: 2px;
background: rgba(255, 255, 255, 0.15);
padding: 10px 45px;
width: fit-content;
color: #FFF;
text-align: center;
font-size: 13px;
font-weight: 500;
letter-spacing: -0.26px;
cursor: pointer;
margin-top: 5px;
&:hover{
background: rgba(255, 255, 255, 0.20);
}
}
}
}
.bottom-icon{
position: absolute;
bottom: 4px;
right: 12px;
}
&::after{
content: '';
position: absolute;
width: 1px;
height: 100%;
background: #6C6C6C;
bottom: 0;
right: 0;
border-radius: 2px;
}
.sec-title{
text-align: right;
display: flex;
gap: 10px;
align-items: end;
.title{
color: #F0F0F0;
font-size: 24px;
font-weight: 600;
}
.counter{
color: #F90;
font-size: 15px;
font-weight: 600;
position: relative;
padding-bottom: 7px;
&::before{
content: '';
position: absolute;
width: 2px;
height: 2px;
background: #1AE022;
top: -1px;
right: -3px;
border-radius: 50%;
}
&::after{
content: '';
position: absolute;
bottom: 4px;
left: -10%;
width: 120%;
height: 1px;
background: #6C6C6C;
}
}
}
.content{
text-align: right;
max-height: 12.5vh;
overflow-y: scroll;
display: flex;
flex-direction: column;
align-items: end;
gap: 10px;
width: 100%;
.users{
display: flex;
flex-direction: column;
align-items: end;
gap: 13px;
.user{
display: flex;
align-items: center;
gap: 6px;
.name-wrapper{
display: flex;
align-items: end;
flex-direction: column;
text-transform: uppercase;
text-align: right;
.name{
color: #FFF;
font-size: 16px;
font-weight: 700;
}
.current-place{
color: #9D9D9D;
font-size: 10px;
font-weight: 500;
span{
color: #F90;
}
}
}
.pp{
border: 1px solid rgba(255, 255, 255, 0.5);
box-shadow: 0px 0px 10px 0 rgba(255, 255, 255, 0.3), inset 0px 0px 10px 0 rgba(255, 255, 255, 0.3);
border-radius: 50%;
width: 36px;
height: 36px;
padding: 2px;
img{
border-radius: 50%;
width: 100%;
}
}
}
}
.box{
width: 100%;
padding: 10px;
border-radius: 2px;
background: linear-gradient(270deg, rgba(255, 255, 255, 0.15) 0%, rgba(255, 255, 255, 0.00) 100%);
display: flex;
flex-direction: column;
align-items: end;
gap: 4px;
cursor: pointer;
position: relative;
transition: 0.2s;
&.disabled{
.box-header, .box-content{
opacity: 0.2;
}
background: linear-gradient(270deg, rgba(255, 255, 255, 0.07) 0%, rgba(255, 255, 255, 0.00) 100%) !important;
pointer-events: none;
}
.box-header{
display: flex;
gap: 14px;
.item{
color: rgba(198, 198, 198, 0.70);
font-size: 10px;
font-weight: 600;
display: flex;
align-items: center;
&.salary, &.level{
display: flex;
gap: 3px;
span{
color: #F90;
}
}
&.title{
color: #C6C6C6;
font-size: 12px;
font-weight: 600;
display: flex;
align-items: center;
gap: 3px;
}
}
}
.box-content{
text-align: right;
font-size: 14px;
font-weight: 500;
text-transform: uppercase;
color: #9D9D9D;
span{
color: #F90;
}
}
}
}
}
}<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ATY BUS JOB</title>
<link rel="stylesheet" href="css/style.css">
</head>
<body>
<div class="timer">
Timp ramas pana la incheierea misiunii: <span>0 secunde.</span>
</div>
<div class="stops-box">
<div class="title"><img src="assets/road-b.png"> STATII</div>
<div class="stops" id="stops-box">
<div class="stop" id="stop-old">VESPUCCI STOP</div>
<div class="divider"><img src="assets/divider.png"></div>
<div class="stop active" id="stop-active">VESPUCCI STOP</div>
<div class="divider"><img src="assets/divider.png"></div>
<div class="stop" id="stop-next">VESPUCCI STOP</div>
</div>
</div>
<div class="leaderboard">
<div class="title-wrapper">
<div class="icon">
<svg width="24" height="21" viewBox="0 0 24 21" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M5.96667 21C4.32044 21 2.91467 20.406 1.74933 19.2181C0.583111 18.031 0 16.5991 0 14.9222C0 13.2716 0.566222 11.8564 1.69867 10.6766C2.83111 9.49677 4.20756 8.88876 5.828 8.85254C5.99867 8.85254 6.16978 8.86567 6.34133 8.89193C6.512 8.91728 6.68267 8.94761 6.85333 8.98293L2.46133 0H8.82133L12 6.47846L15.18 0H21.5387L17.1787 8.88921C17.3333 8.8539 17.4916 8.82764 17.6533 8.81044C17.816 8.79233 17.9827 8.78327 18.1533 8.78327C19.7862 8.82583 21.1689 9.43701 22.3013 10.6168C23.4338 11.7966 24 13.2204 24 14.8882C24 16.5878 23.4169 18.031 22.2507 19.2181C21.0853 20.406 19.6684 21 18 21C17.7484 21 17.4916 20.9855 17.2293 20.9565C16.9671 20.9285 16.7187 20.8741 16.484 20.7936C17.5356 20.3273 18.2733 19.535 18.6973 18.4168C19.1213 17.2976 19.3333 16.1215 19.3333 14.8882C19.3333 12.8039 18.6227 11.0378 17.2013 9.59003C15.7791 8.14222 14.0453 7.41832 12 7.41832C9.95378 7.41832 8.22 8.14222 6.79867 9.59003C5.37733 11.0387 4.66667 12.8048 4.66667 14.8882C4.66667 16.1314 4.86222 17.3275 5.25333 18.4765C5.64444 19.6264 6.39556 20.3988 7.50667 20.7936C7.256 20.8741 7.00356 20.9285 6.74933 20.9565C6.496 20.9855 6.23511 21 5.96667 21ZM12 21C10.3333 21 8.91645 20.4056 7.74933 19.2167C6.58222 18.0279 5.99911 16.585 6 14.8882C6 13.1905 6.58356 11.7473 7.75067 10.5584C8.91778 9.36955 10.3342 8.77558 12 8.77648C13.6667 8.77648 15.0836 9.37091 16.2507 10.5598C17.4178 11.7486 18.0009 13.1914 18 14.8882C18 16.586 17.4164 18.0292 16.2493 19.2181C15.0822 20.4069 13.6658 21.0009 12 21ZM9.91733 17.9957L12 16.3822L14.0827 17.9957L13.3027 15.3772L15.384 13.8642H12.8133L12 11.1017L11.1867 13.8642H8.616L10.6973 15.3772L9.91733 17.9957Z" fill="#C6C6C6"/>
</svg>
</div>
<div class="title">CLASAMENT</div>
</div>
<div class="players-wrapper">
</div>
</div>
<main>
<div class="lines">
<div class="line-a"></div>
<div class="line-b"></div>
<div class="line-c"></div>
</div>
<div class="header">
<div class="title-wrapper">
<div class="logo">
<img src="assets/logo.png">
</div>
<span>ATY<p>BUS JOB</p></span>
</div>
<div class="desc">Bine ai venit! Poti incepe expeditia alegand o ruta. Trebuie sa opresti la fiecare statie si sa iei pasagerii. Tine minte ca daca intarzii la o statie, vei primi mai putini bani! Cu cat termini mai repede, cu atat castigi mai mult.</div>
<div class="user-info">
<div class="title">INFO UTILIZATOR</div>
<div class="user">
<div class="name-wrapper">
<div class="name" id="player-name">Atiysu Scripts</div>
<div class="level" id="player-exp">EXP <span>02</span></div>
<div class="level" id="player-level">NIVEL <span>02</span></div>
</div>
<div class="pp" id="player-pp"><img src=""></div>
</div>
</div>
</div>
<div class="section" id="workers-sec">
<div class="sec-title">
<div class="title">SOFERI ACTIVI</div>
<div class="counter">23</div>
</div>
<div class="content">
<div class="users" id="workers">
<div class="user">
<div class="name-wrapper">
<div class="name">Atiysu Scripts</div>
<div class="current-place">IN PREZENT LA <span>vespucci beach</span></div>
</div>
<div class="pp"><img src="assets/default.png"></div>
</div>
</div>
</div>
<div class="bottom-icon"><img src="assets/dots.png"></div>
</div>
<div class="section" id="routes-sec">
<div class="sec-title">
<div class="title">RUTE DISPONIBILE</div>
<div class="counter">06</div>
</div>
<div class="content" id="routes">
<div class="box">
<div class="box-header">
<div class="item">CLICK PENTRU START</div>
<div class="item salary">SALARIU <span>$1000</span></div>
<div class="item title"><img src="assets/road.png">NIVEL <span>1</span></div>
</div>
<div class="box-content">RUTA <SPAN>VESPUCCI BEACH</SPAN></div>
</div>
</div>
<div class="bottom-icon"><img src="assets/dots.png"></div>
<div class="section" id="stops-sec">
<div class="sec-title">
<div class="title">STATII</div>
<div class="counter">06</div>
</div>
<div class="content">
<div class="box-wrapper" id="stops">
<div class="box">
<div class="image-box"><img src=""></div>
<div class="box-header">
<div class="item level">NIVEL <span>00</span></div>
<div class="item title"><img src="assets/road.png">STATIE <span>1</span></div>
</div>
<div class="box-content">RUTA <SPAN>VESPUCCI BEACH</SPAN></div>
</div>
</div>
<div class="start-btn">PORNESTE</div>
</div>
<div class="bottom-icon"><img src="assets/dots.png"></div>
</div>
</div>
<div class="section" id="expedition">
<div class="sec-title">
<div class="title">EXPEDITII ANTERIOARE</div>
<div class="counter">08</div>
</div>
<div class="content" id="old-routes">
<div class="box">
<div class="box-header">
<div class="item title"><img src="assets/clock.png">10/12/2023 1:23 AM</div>
</div>
<div class="box-content">RUTA <SPAN>VESPUCCI BEACH</SPAN></div>
</div>
</div>
<div class="bottom-icon"><img src="assets/dots.png"></div>
</div>
</main>
<script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
<script src="js/main.js"></script>
</body>
</html>let routes = []
let level = 0
let added = false
let exp = 0
$(function() {
$.post(`https://${GetParentResourceName()}/uiLoaded`);
window.addEventListener("message", function(event) {
if (event.data.action == "openMenu") {
level = event.data.level;
$("#player-name").text(event.data.name);
$("#player-pp img").attr("src", event.data.avatar);
$("#player-level span").text(String(event.data.level).padStart(2, "0"));
$("#player-level").html("NIVEL <span>" + String(event.data.level).padStart(2, "0") + "</span>");
$("#player-exp span").text(event.data.exp);
SetRoutes(event.data.routes);
SetOldMissions(event.data.oldRoutes);
SetActiveWorkers(event.data.workers)
$("main, .leaderboard").fadeIn(100);
$("main, .leaderboard").css("display", "flex")
level = event.data.level;
exp = event.data.exp;
routes = event.data.routes;
let allData = event.data.allData;
let filteredData = {};
allData.forEach((data, key) => {
filteredData[key] = {
avatar: data.avatar,
name: data.name,
oldRoutes: data.oldMissons.length,
};
});
let sortedData = Object.keys(filteredData).sort(function(a, b) {
return filteredData[b].oldRoutes - filteredData[a].oldRoutes;
});
$(".leaderboard .players-wrapper").empty();
sortedData.forEach((player, i) => {
$(".leaderboard .players-wrapper").append(`
<div class="player">
<div class="rank">${i + 1}</div>
<div class="other">
<div class="pp-wrapper">
<div class="pp"><img src="${filteredData[player].avatar}"></div>
<div class="name">${filteredData[player].name}</div>
</div>
<div class="total-routes">
<div class="title">Total Rute</div>
<div class="text">${filteredData[player].oldRoutes}</div>
</div>
<!-- Add other HTML elements for additional properties -->
</div>
</div>
`);
});
}
if (event.data.action == "updateTime"){
$(".timer").fadeIn();
$(".timer span").text(event.data.time);
}
if (event.data.action == "hideTimer"){
$(".timer").fadeOut();
}
if (event.data.action == "updateStops"){
$(".stops-box").fadeIn(100)
$("#stop-old").text(event.data.oldStop);
$("#stop-active").text(event.data.activeStop);
$("#stop-next").text(event.data.nextStop);
}
if (event.data.action == "hideStops"){
$(".stops-box").fadeOut(100)
}
})
$(document).on("click", "#routes .box", function() {
$("#routes .box").removeClass("active");
$(this).addClass("active");
let routeId = $(this).data("id") - 1;
let stops = routes[routeId].Stops;
$("#stops").empty();
$("#stops-sec .counter").text(String("0").padStart(2, "0"))
stops.forEach((stop, i) => {
$("#stops").append(`
<div data-stopid="${i+1}" class="box ${stop.Level > level ? "disabled" : ""}">
<div class="box-header">
<div class="item level">NIVEL NECESAR <span>${String(stop.Level).padStart(2, "0")}</span></div>
<div class="item title"><img src="assets/road.png">STATIE <span>${i+1}</span></div>
</div>
<div class="box-content">STATIE <SPAN>${stop.StopName}</SPAN></div>
</div>`);
$("#stops-sec .counter").text(String(i+1).padStart(2, "0"))
});
$("#stops-sec").fadeIn(200)
$("#stops-sec").css("display", "flex")
})
$(document).on("click", ".start-btn", function() {
let routeId = $("#routes .box.active").data("id") - 1;
let route = routes[routeId];
if (route.Level > level) {
$.post(`https://${GetParentResourceName()}/notify`, JSON.stringify("Nu ai nivelul necesar pentru a incepe aceasta ruta."))
}else{
$.post(`https://${GetParentResourceName()}/startRoute`, JSON.stringify(route))
}
$("main, .leaderboard").fadeOut("fast")
$("#stops-sec").fadeOut(200)
})
$(document).on("mouseover", "#stops-sec .box", function() {
if (added) return;
added = true
$(this).parent().parent().append(`<div class="image-box"><img src="${routes[$("#routes .box.active").data("id") - 1].Stops[$(this).data("stopid") - 1].Preview}"></div>`)
$(".image-box").show()
})
$(document).on("mouseleave", "#stops-sec .box", function() {
added = false
$(".image-box").remove()
})
})
function SetRoutes(routes){
$("#routes").empty();
$("#routes-sec .counter").text(String("0").padStart(2, "0"))
routes.forEach((route, i) => {
$("#routes").append(`
<div class="box ${route.Level > level ? "disabled" : ""}" data-id="${i+1}">
<div class="box-header">
<div class="item">CLICK PENTRU START</div>
<div class="item salary">SALARIU <span>${route.Salary}</span></div>
<div class="item title"><img src="assets/road.png">NIVEL <span>${String(route.Level).padStart(2, "0")}</span></div>
</div>
<div class="box-content">RUTA <span>${route.RouteName}</span></div>
</div>`);
$("#routes-sec .counter").text(String(i+1).padStart(2, "0"))
});
}
function SetOldMissions(oldroutes){
$("#old-routes").empty();
$("#expedition .counter").text(String("0").padStart(2, "0"))
oldroutes.forEach((route, i) => {
$("#old-routes").prepend(`
<div class="box">
<div class="box-header">
<div class="item title"><img src="assets/clock.png">${route.date}</div>
</div>
<div class="box-content">RUTA <span>${route.routeName}</span></div>
</div> `);
$("#expedition .counter").text(String(i+1).padStart(2, "0"))
});
}
function SetActiveWorkers(workers){
$("#workers").empty();
$("#workers-sec .counter").text(String("0").padStart(2, "0"))
workers.forEach((worker, i) => {
$("#workers").prepend(`
<div class="user">
<div class="name-wrapper">
<div class="name">${worker.name}</div>
<div class="current-place">IN PREZENT LA <span>${worker.place}</span></div>
</div>
<div class="pp"><img src="${worker.avatar}"></div>
</div>`);
$("#workers-sec .counter").text(String(i+1).padStart(2, "0"))
});
}
$(window).on("keydown", function ({ originalEvent: { key } }) {
if (key == "Escape") {
$.post(`https://${GetParentResourceName()}/close`)
$("main, .leaderboard").fadeOut("fast")
$("#stops-sec").fadeOut(200)
}
})