Merge branch 'dev' into vehicle-spawn-validation

This commit is contained in:
Kasey FItton
2024-12-04 05:59:39 +00:00
48 changed files with 1189 additions and 226 deletions
+7
View File
@@ -821,6 +821,13 @@ ALTER TABLE `licenses`
ALTER TABLE `owned_vehicles`
ADD PRIMARY KEY (`plate`);
--
--
-- Indexes for table `vehicles`
--
ALTER TABLE `vehicles`
ADD PRIMARY KEY (`model`);
--
-- Indexes for table `rented_vehicles`
--
+42 -18
View File
@@ -1,51 +1,75 @@
local Jobs = {}
local LastTime = nil
---@class CronJob
---@field h number
---@field m number
---@field cb function|table
---@type CronJob[]
local cronJobs = {}
---@type number|false
local lastTimestamp = false
---@param h number
---@param m number
---@param cb function|table
function RunAt(h, m, cb)
Jobs[#Jobs + 1] = {
cronJobs[#cronJobs + 1] = {
h = h,
m = m,
cb = cb,
}
end
---@return number
function GetUnixTimestamp()
return os.time()
end
function OnTime(time)
for i = 1, #Jobs, 1 do
---@param timestamp number
function OnTime(timestamp)
for i = 1, #cronJobs, 1 do
local scheduledTimestamp = os.time({
hour = Jobs[i].h,
min = Jobs[i].m,
hour = cronJobs[i].h,
min = cronJobs[i].m,
sec = 0, -- Assuming tasks run at the start of the minute
day = os.date("%d", time),
month = os.date("%m", time),
year = os.date("%Y", time),
day = os.date("%d", timestamp),
month = os.date("%m", timestamp),
year = os.date("%Y", timestamp),
})
if time >= scheduledTimestamp and (not LastTime or LastTime < scheduledTimestamp) then
if timestamp >= scheduledTimestamp and (not lastTimestamp or lastTimestamp < scheduledTimestamp) then
local d = os.date('*t', scheduledTimestamp).wday
Jobs[i].cb(d, Jobs[i].h, Jobs[i].m)
cronJobs[i].cb(d, cronJobs[i].h, cronJobs[i].m)
end
end
end
---@return nil
function Tick()
local time = GetUnixTimestamp()
local timestamp = GetUnixTimestamp()
if not LastTime or os.date("%M", time) ~= os.date("%M", LastTime) then
OnTime(time)
LastTime = time
if not lastTimestamp or os.date("%M", timestamp) ~= os.date("%M", lastTimestamp) then
OnTime(timestamp)
lastTimestamp = timestamp
end
SetTimeout(60000, Tick)
end
LastTime = GetUnixTimestamp()
lastTimestamp = GetUnixTimestamp()
Tick()
---@param h number
---@param m number
---@param cb function|table
AddEventHandler("cron:runAt", function(h, m, cb)
local invokingResource = GetInvokingResource() or "Unknown"
local typeH = type(h)
local typeM = type(m)
local typeCb = type(cb)
assert(typeH == "number", ("Expected number for h, got %s. Invoking Resource: '%s'"):format(typeH, invokingResource))
assert(typeM == "number", ("Expected number for m, got %s. Invoking Resource: '%s'"):format(typeM, invokingResource))
assert(typeCb == "function" or (typeCb == "table" and type(getmetatable(cb)?.__call) == "function"), ("Expected function for cb, got %s. Invoking Resource: '%s'"):format(typeCb, invokingResource))
RunAt(h, m, cb)
end)
@@ -0,0 +1,21 @@
local class = {}
class.__index = class
function class:new(...)
local instance = setmetatable({}, self)
if instance.constructor then
local ret = instance:constructor(...)
if type(ret) == 'table' then
return ret
end
end
return instance
end
function Class(body, heritage)
local prototype = body or {}
prototype.__index = prototype
return setmetatable(prototype, heritage or class)
end
return Class
@@ -0,0 +1,44 @@
Point = ESX.Class()
function Point:constructor(properties)
self.coords = properties.coords
self.hidden = properties.hidden or false
self.inside = properties.inside or function() end
self.enter = properties.enter or function() end
self.leave = properties.leave or function() end
self.handle = ESX.CreatePointInternal(properties.coords, properties.distance, properties.hidden, function()
self.nearby = true
if self.enter then
self:enter()
end
if self.inside then
CreateThread(function()
while self.nearby do
local coords = GetEntityCoords(ESX.PlayerData.ped)
self.currDistance = #(coords - self.coords)
self:inside()
Wait(0)
end
end)
end
end, function()
self.nearby = false
if self.leave then
self:leave()
end
end)
end
function Point:delete()
ESX.RemovePointInternal(self.handle)
end
function Point:toggle(hidden)
if hidden == nil then
hidden = not self.hidden
end
self.hidden = hidden
ESX.HidePointInternal(self.handle, hidden)
end
return Point
+49 -19
View File
@@ -42,8 +42,9 @@ RegisterNetEvent("esx:playerLoaded", function(xPlayer, _, skin)
end
Actions:Init()
StartPointsLoop()
StartServerSyncLoops()
NetworkSetLocalPlayerSyncLookAt(true)
end)
local isFirstSpawn = true
@@ -286,29 +287,58 @@ end
function StartServerSyncLoops()
if Config.CustomInventory then return end
-- keep track of ammo
local currentWeapon = {
---@type number
---@diagnostic disable-next-line: assign-type-mismatch
hash = `WEAPON_UNARMED`,
ammo = 0,
}
local function updateCurrentWeaponAmmo(weaponName)
local newAmmo = GetAmmoInPedWeapon(ESX.PlayerData.ped, currentWeapon.hash)
if newAmmo ~= currentWeapon.ammo then
currentWeapon.ammo = newAmmo
TriggerServerEvent("esx:updateWeaponAmmo", weaponName, newAmmo)
end
end
CreateThread(function()
local currentWeapon = { Ammo = 0 }
while ESX.PlayerLoaded do
local sleep = 1500
if GetSelectedPedWeapon(ESX.PlayerData.ped) ~= -1569615261 then
sleep = 1000
local _, weaponHash = GetCurrentPedWeapon(ESX.PlayerData.ped, true)
local weapon = ESX.GetWeaponFromHash(weaponHash)
if weapon then
local ammoCount = GetAmmoInPedWeapon(ESX.PlayerData.ped, weaponHash)
if weapon.name ~= currentWeapon.name then
currentWeapon.Ammo = ammoCount
currentWeapon.name = weapon.name
else
if ammoCount ~= currentWeapon.Ammo then
currentWeapon.Ammo = ammoCount
TriggerServerEvent("esx:updateWeaponAmmo", weapon.name, ammoCount)
end
currentWeapon.hash = GetSelectedPedWeapon(ESX.PlayerData.ped)
if currentWeapon.hash ~= `WEAPON_UNARMED` then
local weaponConfig = ESX.GetWeaponFromHash(currentWeapon.hash)
if weaponConfig then
currentWeapon.ammo = GetAmmoInPedWeapon(ESX.PlayerData.ped, currentWeapon.hash)
while GetSelectedPedWeapon(ESX.PlayerData.ped) == currentWeapon.hash do
updateCurrentWeaponAmmo(weaponConfig.name)
Wait(1000)
end
updateCurrentWeaponAmmo(weaponConfig.name)
end
end
Wait(sleep)
Wait(250)
end
end)
CreateThread(function()
local PARACHUTE_OPENING <const> = 1
local PARACHUTE_OPEN <const> = 2
while ESX.PlayerLoaded do
local parachuteState = GetPedParachuteState(ESX.PlayerData.ped)
if parachuteState == PARACHUTE_OPENING or parachuteState == PARACHUTE_OPEN then
TriggerServerEvent("esx:updateWeaponAmmo", "GADGET_PARACHUTE", 0)
while GetPedParachuteState(ESX.PlayerData.ped) ~= -1 do Wait(1000) end
end
Wait(500)
end
end)
end
@@ -152,7 +152,6 @@ function Actions:PedLoop()
end)
end
function Actions:Init()
self:SlowLoop()
self:PedLoop()
@@ -4,6 +4,7 @@ function Adjustments:RemoveHudComponents()
for i = 1, #Config.RemoveHudComponents do
if Config.RemoveHudComponents[i] then
SetHudComponentSize(i, 0.0, 0.0)
SetHudComponentPosition(i, 900, 900)
end
end
end
@@ -215,6 +216,15 @@ function Adjustments:WantedLevel()
end
end
function Adjustments:DisableRadio()
if Config.RemoveHudComponents[16] then
AddEventHandler("esx:enteredVehicle", function(vehicle, plate, seat, displayName, netId)
SetVehRadioStation(vehicle,"OFF")
SetUserRadioControlEnabled(false)
end)
end
end
function Adjustments:Load()
self:RemoveHudComponents()
self:DisableAimAssist()
@@ -228,4 +238,5 @@ function Adjustments:Load()
self:LicensePlates()
self:DiscordPresence()
self:WantedLevel()
self:DisableRadio()
end
+87 -22
View File
@@ -1,47 +1,68 @@
---@diagnostic disable: duplicate-set-field
-- =============================================
-- MARK: Variables
-- =============================================
Callbacks = {}
Callbacks.requests = {}
Callbacks.storage = {}
Callbacks.id = 0
-- =============================================
-- MARK: Internal Functions
-- =============================================
function Callbacks:Trigger(event, cb, invoker, ...)
self.requests[self.id] = cb
self.requests[self.id] = {
await = type(cb) == "boolean",
cb = cb or promise:new()
}
local table = self.requests[self.id]
TriggerServerEvent("esx:triggerServerCallback", event, self.id, invoker, ...)
self.id += 1
return table.cb
end
function Callbacks:Execute(cb, ...)
function Callbacks:Execute(cb, id, ...)
local success, errorString = pcall(cb, ...)
if not success then
print(("[^1ERROR^7] Failed to execute Callback with RequestId: ^5%s^7"):format(self.currentId))
print(("[^1ERROR^7] Failed to execute Callback with RequestId: ^5%s^7"):format(id))
error(errorString)
return
end
self.currentId = nil
end
function Callbacks:ServerRecieve(requestId, invoker, ...)
self.currentId = requestId
if not self.requests[self.currentId] then
return error(("Server Callback with requestId ^5%s^1 Was Called by ^5%s^1 but does not exist."):format(self.currentId, invoker))
if not self.requests[requestId] then
return error(("Server Callback with requestId ^5%s^1 Was Called by ^5%s^1 but does not exist."):format(requestId, invoker))
end
local callback = self.requests[self.currentId]
local callback = self.requests[requestId]
Callbacks:Execute(callback, ...)
self.requests[requestId] = nil
if callback.await then
callback.cb:resolve({...})
else
self:Execute(callback.cb, requestId, ...)
end
end
function Callbacks:Register(name, cb)
self.storage[name] = cb
function Callbacks:Register(name, resource, cb)
self.storage[name] = {
resource = resource,
cb = cb
}
end
function Callbacks:ClientRecieve(eventName, requestId, invoker, ...)
self.currentId = requestId
if not self.storage[eventName] then
return error(("Client Callback with requestId ^5%s^1 Was Called by ^5%s^1 but does not exist."):format(eventName, invoker))
@@ -50,33 +71,77 @@ function Callbacks:ClientRecieve(eventName, requestId, invoker, ...)
local returnCb = function(...)
TriggerServerEvent("esx:clientCallback", requestId, invoker, ...)
end
local callback = self.storage[eventName]
local callback = self.storage[eventName].cb
Callbacks:Execute(callback, returnCb, ...)
self:Execute(callback, requestId, returnCb, ...)
end
-- =============================================
-- MARK: ESX Functions
-- =============================================
---@param eventName string
---@param callback function
---@param ... any
---@return nil
ESX.TriggerServerCallback = function(eventName, callback, ...)
function ESX.TriggerServerCallback(eventName, callback, ...)
local invokingResource = GetInvokingResource()
local invoker = (invokingResource and invokingResource ~= "unknown") and invokingResource or "es_extended"
Callbacks:Trigger(eventName, callback, invoker, ...)
end
ESX.SecureNetEvent("esx:serverCallback", function(...)
Callbacks:ServerRecieve(...)
end)
---@param eventName string
---@param ... any
---@return any
function ESX.AwaitServerCallback(eventName, ...)
local invokingResource = GetInvokingResource()
local invoker = (invokingResource and invokingResource ~= "unknown") and invokingResource or "es_extended"
local p = Callbacks:Trigger(eventName, false, invoker, ...)
if not p then return end
-- if the server callback takes longer than 15 seconds to respond, reject the promise
SetTimeout(15000, function()
if p.state == "pending" then
p:reject("Server Callback Timed Out")
end
end)
Citizen.Await(p)
return table.unpack(p.value)
end
function ESX.RegisterClientCallback(eventName, callback)
local invokingResource = GetInvokingResource()
local invoker = (invokingResource and invokingResource ~= "Unknown") and invokingResource or "es_extended"
Callbacks:Register(eventName, invoker, callback)
end
---@param eventName string
---@param callback function
---@return nil
ESX.RegisterClientCallback = function(eventName, callback)
Callbacks:Register(eventName, callback)
---@return boolean
function ESX.DoesClientCallbackExist(eventName)
return Callbacks.storage[eventName] ~= nil
end
-- =============================================
-- MARK: Events
-- =============================================
ESX.SecureNetEvent("esx:triggerClientCallback", function(...)
Callbacks:ClientRecieve(...)
end)
ESX.SecureNetEvent("esx:serverCallback", function(...)
Callbacks:ServerRecieve(...)
end)
AddEventHandler("onResourceStop", function(resource)
for k, v in pairs(Callbacks.storage) do
if v.resource == resource then
Callbacks.storage[k] = nil
end
end
end)
+13 -26
View File
@@ -29,7 +29,7 @@ function Death:ByPlayer()
TriggerServerEvent("esx:onPlayerDeath", data)
end
function Death:Natual()
function Death:Natural()
local coords = GetEntityCoords(ESX.PlayerData.ped)
local data = {
@@ -43,25 +43,7 @@ function Death:Natual()
TriggerServerEvent("esx:onPlayerDeath", data)
end
function Death:Damaged(victim, victimDied)
if not victimDied then
return
end
if not IsEntityAPed(victim) then
return
end
if not IsPedAPlayer(victim) then
return
end
local victimId = NetworkGetPlayerIndexFromPed(victim)
local isDead = IsPedDeadOrDying(victim, true) or IsPedFatallyInjured(victim)
if victimId ~= ESX.playerId or not isDead then
return
end
function Death:Died()
self.killerEntity = GetPedSourceOfDeath(ESX.PlayerData.ped)
self.deathCause = GetPedCauseOfDeath(ESX.PlayerData.ped)
self.killerId = NetworkGetPlayerIndexFromPed(self.killerEntity)
@@ -72,15 +54,20 @@ function Death:Damaged(victim, victimDied)
if self.killerEntity ~= ESX.PlayerData.ped and self.killerId and isActive then
self:ByPlayer()
else
self:Natual()
self:Natural()
end
self:ResetValues()
end
AddEventHandler("gameEventTriggered", function(event, data)
if event ~= "CEventNetworkEntityDamage" then
return
end
Death:Damaged(data[1], data[4])
AddEventHandler("esx:onPlayerSpawn", function()
Citizen.CreateThreadNow(function()
while not ESX.PlayerData.dead do
if IsPedDeadOrDying(ESX.PlayerData.ped, true) or IsPedFatallyInjured(ESX.PlayerData.ped) then
Death:Died()
break
end
Citizen.Wait(250)
end
end)
end)
@@ -0,0 +1,57 @@
local points = {}
function ESX.CreatePointInternal(coords, distance, hidden, enter, leave)
local point = {
coords = coords,
distance = distance,
hidden = hidden,
enter = enter,
leave = leave,
resource = GetInvokingResource()
}
local handle = ESX.Table.SizeOf(points) + 1
points[handle] = point
return handle
end
function ESX.RemovePointInternal(handle)
points[handle] = nil
end
function ESX.HidePointInternal(handle, hidden)
if points[handle] then
points[handle].hidden = hidden
end
end
function StartPointsLoop()
CreateThread(function()
while true do
local coords = GetEntityCoords(ESX.PlayerData.ped)
for i, point in pairs(points) do
local distance = #(coords - point.coords)
if not point.hidden and distance <= point.distance then
if not point.nearby then
points[i].nearby = true
points[i].enter()
end
point.currentDistance = distance
elseif point.nearby then
points[i].nearby = false
points[i].leave()
end
end
Wait(500)
end
end)
end
AddEventHandler('onResourceStop', function(resource)
for i, point in pairs(points) do
if point.resource == resource then
points[i] = nil
end
end
end)
+2
View File
@@ -45,6 +45,7 @@ client_scripts {
'client/modules/wrapper.lua',
'client/modules/callback.lua',
'client/modules/adjustments.lua',
'client/modules/points.lua',
'client/main.lua',
@@ -73,6 +74,7 @@ files {
'html/fonts/pdown.ttf',
'html/fonts/bankgothic.ttf',
"client/imports/*.lua",
}
dependencies {
+19
View File
@@ -21,4 +21,23 @@ if not IsDuplicityVersion() then -- Only register this event for the client
ESX.PlayerLoaded = false
ESX.PlayerData = {}
end)
local external = {{"Class", "class.lua"}, {"Point", "point.lua"}}
for i=1, #external do
local module = external[i]
local path = string.format("client/imports/%s", module[2])
local file = LoadResourceFile("es_extended", path)
if file then
local fn, err = load(file, ('@@es_extended/%s'):format(path))
if not fn or err then
return error(('\n^1Error importing module (%s)'):format(external[i]))
end
ESX[module[1]] = fn()
else
return error(('\n^1Error loading module (%s)'):format(external[i]))
end
end
end
+32
View File
@@ -368,4 +368,36 @@ Locales["cs"] = {
["tint_lspd"] = "blue skin",
["tint_orange"] = "orange skin",
["tint_platinum"] = "platinum skin",
-- MK2 Weapon Tints
["tint_classic_gray"] = "klasická šedá",
["tint_classic_two_tone"] = "klasická dvoutónová",
["tint_classic_white"] = "klasická bílá",
["tint_classic_beige"] = "klasická béžová",
["tint_classic_green"] = "klasická zelená",
["tint_classic_blue"] = "klasická modrá",
["tint_classic_earth"] = "klasická hnědá",
["tint_classic_brown_black"] = "klasická hnědá-černá",
["tint_contrast_red"] = "kontrastní červená",
["tint_contrast_blue"] = "kontrastní modrá",
["tint_contrast_yellow"] = "kontrastní žlutá",
["tint_contrast_orange"] = "kontrastní oranžová",
["tint_bold_pink"] = "odvážná růžová",
["tint_bold_purple_yellow"] = "odvážná fialovo-žlutá",
["tint_bold_orange"] = "odvážná oranžová",
["tint_bold_green_purple"] = "odvážná zeleno-fialová",
["tint_bold_red_feat"] = "odvážná červená feat",
["tint_bold_green_feat"] = "odvážná zelená feat",
["tint_bold_cyan_feat"] = "odvážná azurová feat",
["tint_bold_yellow_feat"] = "odvážná žlutá feat",
["tint_bold_red_white"] = "odvážná červená bílá",
["tint_bold_blue_white"] = "odvážná modrá bílá",
["tint_metallic_gold"] = "metalická zlatá",
["tint_metallic_platinum"] = "metalická platina",
["tint_metallic_gray_lilac"] = "metalická šedá lila",
["tint_metallic_purple_lime"] = "metalická fialová limetka",
["tint_metallic_red"] = "metalická červená",
["tint_metallic_green"] = "metalická zelená",
["tint_metallic_blue"] = "metalická modrá",
["tint_metallic_white_aqua"] = "metalická bílá aqua",
["tint_metallic_red_yellow"] = "metalická červená žlutá",
}
+34 -1
View File
@@ -21,7 +21,7 @@ Locales["de"] = {
["received_weapon_ammo"] = "Du bekommst ~o~%sx %s für deine %s von %s",
["received_weapon_withammo"] = "Du bekommst %s mit ~o~%sx %s von %s",
["received_weapon_hasalready"] = "%s hat versucht dir eine %s zu geben, jedoch hast du diese Waffe bereits!",
["received_weapon_noweapon"] = "%s hat versucht dir Munition für eine %s zu geben, jedoch hast du diese Waffe bereits!",
["received_weapon_noweapon"] = "%s hat versucht dir Munition für eine %s zu geben, jedoch hast du diese Waffe nicht!",
["gave_account_money"] = "Du gibst %s€ (%s) an %s",
["received_account_money"] = "Du bekommst %s€ (%s) von %s",
["amount_invalid"] = "Ungültige Anzahl",
@@ -378,4 +378,37 @@ Locales["de"] = {
["tint_lspd"] = "Blau",
["tint_orange"] = "Orange",
["tint_platinum"] = "Platin",
-- MK2 Weapon Tints
["tint_classic_black"] = "klassisches Schwarz",
["tint_classic_gray"] = "klassisches Grau",
["tint_classic_two_tone"] = "klassisches Zwei-Ton",
["tint_classic_white"] = "klassisches Weiß",
["tint_classic_beige"] = "klassisches Beige",
["tint_classic_green"] = "klassisches Grün",
["tint_classic_blue"] = "klassisches Blau",
["tint_classic_earth"] = "klassisches Erdfarben",
["tint_classic_brown_black"] = "klassisches Braun-Schwarz",
["tint_contrast_red"] = "Kontrast Rot",
["tint_contrast_blue"] = "Kontrast Blau",
["tint_contrast_yellow"] = "Kontrast Gelb",
["tint_contrast_orange"] = "Kontrast Orange",
["tint_bold_pink"] = "fette Pink",
["tint_bold_purple_yellow"] = "fette Lila-Gelb",
["tint_bold_orange"] = "fette Orange",
["tint_bold_green_purple"] = "fette Grün-Lila",
["tint_bold_red_feat"] = "fette Rot feat",
["tint_bold_green_feat"] = "fette Grün feat",
["tint_bold_cyan_feat"] = "fette Cyan feat",
["tint_bold_yellow_feat"] = "fette Gelb feat",
["tint_bold_red_white"] = "fette Rot Weiß",
["tint_bold_blue_white"] = "fette Blau Weiß",
["tint_metallic_gold"] = "metallisches Gold",
["tint_metallic_platinum"] = "metallisches Platin",
["tint_metallic_gray_lilac"] = "metallisches Grau-Lila",
["tint_metallic_purple_lime"] = "metallisches Lila-Limette",
["tint_metallic_red"] = "metallisches Rot",
["tint_metallic_green"] = "metallisches Grün",
["tint_metallic_blue"] = "metallisches Blau",
["tint_metallic_white_aqua"] = "metallisches Weiß-Aqua",
["tint_metallic_red_yellow"] = "metallisches Rot-Gelb",
}
+33
View File
@@ -378,4 +378,37 @@ Locales["el"] = {
["tint_lspd"] = "μπλε δέρμα",
["tint_orange"] = "πορτοκαλί δέρμα",
["tint_platinum"] = "πλατίνενο δέρμα",
-- MK2 Weapon Tints
["tint_classic_black"] = "κλασικό μαύρο",
["tint_classic_gray"] = "κλασικό γκρι",
["tint_classic_two_tone"] = "κλασικό δίχρωμο",
["tint_classic_white"] = "κλασικό λευκό",
["tint_classic_beige"] = "κλασικό μπεζ",
["tint_classic_green"] = "κλασικό πράσινο",
["tint_classic_blue"] = "κλασικό μπλε",
["tint_classic_earth"] = "κλασική γή",
["tint_classic_brown_black"] = "κλασικό καφέ-μαύρο",
["tint_contrast_red"] = "αντίθεση κόκκινο",
["tint_contrast_blue"] = "αντίθεση μπλε",
["tint_contrast_yellow"] = "αντίθεση κίτρινο",
["tint_contrast_orange"] = "αντίθεση πορτοκαλί",
["tint_bold_pink"] = "τολμηρό ροζ",
["tint_bold_purple_yellow"] = "τολμηρό μοβ-κίτρινο",
["tint_bold_orange"] = "τολμηρό πορτοκαλί",
["tint_bold_green_purple"] = "τολμηρό πράσινο-μοβ",
["tint_bold_red_feat"] = "τολμηρό κόκκινο feat",
["tint_bold_green_feat"] = "τολμηρό πράσινο feat",
["tint_bold_cyan_feat"] = "τολμηρό κυανό feat",
["tint_bold_yellow_feat"] = "τολμηρό κίτρινο feat",
["tint_bold_red_white"] = "τολμηρό κόκκινο λευκό",
["tint_bold_blue_white"] = "τολμηρό μπλε λευκό",
["tint_metallic_gold"] = "μεταλλικό χρυσό",
["tint_metallic_platinum"] = "μεταλλικό πλατίνα",
["tint_metallic_gray_lilac"] = "μεταλλικό γκρι λιλά",
["tint_metallic_purple_lime"] = "μεταλλικό μοβ-λάιμ",
["tint_metallic_red"] = "μεταλλικό κόκκινο",
["tint_metallic_green"] = "μεταλλικό πράσινο",
["tint_metallic_blue"] = "μεταλλικό μπλε",
["tint_metallic_white_aqua"] = "μεταλλικό λευκό aqua",
["tint_metallic_red_yellow"] = "μεταλλικό κόκκινο-κίτρινο",
}
+33
View File
@@ -378,4 +378,37 @@ Locales["en"] = {
["tint_lspd"] = "blue skin",
["tint_orange"] = "orange skin",
["tint_platinum"] = "platinum skin",
-- MK2 Weapon Tints
["tint_classic_black"] = "classic black",
["tint_classic_gray"] = "classic gray",
["tint_classic_two_tone"] = "classic two-tone",
["tint_classic_white"] = "classic white",
["tint_classic_beige"] = "classic beige",
["tint_classic_green"] = "classic green",
["tint_classic_blue"] = "classic blue",
["tint_classic_earth"] = "classic earth",
["tint_classic_brown_black"] = "classic brown-black",
["tint_contrast_red"] = "contrast red",
["tint_contrast_blue"] = "contrast blue",
["tint_contrast_yellow"] = "contrast yellow",
["tint_contrast_orange"] = "contrast orange",
["tint_bold_pink"] = "bold pink",
["tint_bold_purple_yellow"] = "bold purple-yellow",
["tint_bold_orange"] = "bold orange",
["tint_bold_green_purple"] = "bold green-purple",
["tint_bold_red_feat"] = "bold red feat",
["tint_bold_green_feat"] = "bold green feat",
["tint_bold_cyan_feat"] = "bold cyan feat",
["tint_bold_yellow_feat"] = "bold yellow feat",
["tint_bold_red_white"] = "bold red-white",
["tint_bold_blue_white"] = "bold blue-white",
["tint_metallic_gold"] = "metallic gold",
["tint_metallic_platinum"] = "metallic platinum",
["tint_metallic_gray_lilac"] = "metallic gray-lilac",
["tint_metallic_purple_lime"] = "metallic purple-lime",
["tint_metallic_red"] = "metallic red",
["tint_metallic_green"] = "metallic green",
["tint_metallic_blue"] = "metallic blue",
["tint_metallic_white_aqua"] = "metallic white-aqua",
["tint_metallic_red_yellow"] = "metallic red-yellow",
}
+33 -4
View File
@@ -363,8 +363,37 @@ Locales["es"] = {
["tint_lspd"] = "Skin Azul",
["tint_orange"] = "Skin Naranja",
["tint_platinum"] = "Skin Plata",
-- Duty related
["stopped_duty"] = "Has salido de servicio.",
["started_duty"] = "Has entrado de servicio.",
-- MK2 Weapon Tints
["tint_classic_black"] = "negro clásico",
["tint_classic_gray"] = "gris clásico",
["tint_classic_two_tone"] = "dos tonos clásicos",
["tint_classic_white"] = "blanco clásico",
["tint_classic_beige"] = "beige clásico",
["tint_classic_green"] = "verde clásico",
["tint_classic_blue"] = "azul clásico",
["tint_classic_earth"] = "tierra clásica",
["tint_classic_brown_black"] = "marrón negro clásico",
["tint_contrast_red"] = "rojo de contraste",
["tint_contrast_blue"] = "azul de contraste",
["tint_contrast_yellow"] = "amarillo de contraste",
["tint_contrast_orange"] = "naranja de contraste",
["tint_bold_pink"] = "rosa atrevida",
["tint_bold_purple_yellow"] = "púrpura amarilla atrevida",
["tint_bold_orange"] = "naranja atrevido",
["tint_bold_green_purple"] = "verde púrpura atrevido",
["tint_bold_red_feat"] = "rojo atrevido feat",
["tint_bold_green_feat"] = "verde atrevido feat",
["tint_bold_cyan_feat"] = "cian atrevido feat",
["tint_bold_yellow_feat"] = "amarillo atrevido feat",
["tint_bold_red_white"] = "rojo blanco atrevido",
["tint_bold_blue_white"] = "azul blanco atrevido",
["tint_metallic_gold"] = "oro metálico",
["tint_metallic_platinum"] = "platino metálico",
["tint_metallic_gray_lilac"] = "gris lila metálico",
["tint_metallic_purple_lime"] = "púrpura lima metálico",
["tint_metallic_red"] = "rojo metálico",
["tint_metallic_green"] = "verde metálico",
["tint_metallic_blue"] = "azul metálico",
["tint_metallic_white_aqua"] = "blanco aqua metálico",
["tint_metallic_red_yellow"] = "rojo amarillo metálico",
}
+33
View File
@@ -237,4 +237,37 @@ Locales["fi"] = {
["tint_lspd"] = "Sininen ulkokuori",
["tint_orange"] = "Oranssi ulkokuori",
["tint_platinum"] = "Platina ulkokuori",
-- MK2 Weapon Tints
["tint_classic_black"] = "klassinen musta",
["tint_classic_gray"] = "klassinen harmaa",
["tint_classic_two_tone"] = "klassinen kaksivärinen",
["tint_classic_white"] = "klassinen valkoinen",
["tint_classic_beige"] = "klassinen beessi",
["tint_classic_green"] = "klassinen vihreä",
["tint_classic_blue"] = "klassinen sininen",
["tint_classic_earth"] = "klassinen maa",
["tint_classic_brown_black"] = "klassinen ruskea-musta",
["tint_contrast_red"] = "kontrastinen punainen",
["tint_contrast_blue"] = "kontrastinen sininen",
["tint_contrast_yellow"] = "kontrastinen keltainen",
["tint_contrast_orange"] = "kontrastinen oranssi",
["tint_bold_pink"] = "rohkea vaaleanpunainen",
["tint_bold_purple_yellow"] = "rohkea violetti-keltainen",
["tint_bold_orange"] = "rohkea oranssi",
["tint_bold_green_purple"] = "rohkea vihreä-violetti",
["tint_bold_red_feat"] = "rohkea punainen feat",
["tint_bold_green_feat"] = "rohkea vihreä feat",
["tint_bold_cyan_feat"] = "rohkea syaani feat",
["tint_bold_yellow_feat"] = "rohkea keltainen feat",
["tint_bold_red_white"] = "rohkea punainen valkoinen",
["tint_bold_blue_white"] = "rohkea sininen valkoinen",
["tint_metallic_gold"] = "metallinen kulta",
["tint_metallic_platinum"] = "metallinen platina",
["tint_metallic_gray_lilac"] = "metallinen harmaa lila",
["tint_metallic_purple_lime"] = "metallinen violetti limetti",
["tint_metallic_red"] = "metallinen punainen",
["tint_metallic_green"] = "metallinen vihreä",
["tint_metallic_blue"] = "metallinen sininen",
["tint_metallic_white_aqua"] = "metallinen valkoinen aqua",
["tint_metallic_red_yellow"] = "metallinen punainen keltainen",
}
+33
View File
@@ -378,4 +378,37 @@ Locales["fr"] = {
["tint_lspd"] = "skin bleu",
["tint_orange"] = "skin orange",
["tint_platinum"] = "skin platine",
-- MK2 Weapon Tints
["tint_classic_black"] = "noir classique",
["tint_classic_gray"] = "gris classique",
["tint_classic_two_tone"] = "deux tons classiques",
["tint_classic_white"] = "blanc classique",
["tint_classic_beige"] = "beige classique",
["tint_classic_green"] = "vert classique",
["tint_classic_blue"] = "bleu classique",
["tint_classic_earth"] = "terre classique",
["tint_classic_brown_black"] = "marron noir classique",
["tint_contrast_red"] = "rouge contrasté",
["tint_contrast_blue"] = "bleu contrasté",
["tint_contrast_yellow"] = "jaune contrasté",
["tint_contrast_orange"] = "orange contrasté",
["tint_bold_pink"] = "rose audacieux",
["tint_bold_purple_yellow"] = "violet jaune audacieux",
["tint_bold_orange"] = "orange audacieux",
["tint_bold_green_purple"] = "vert violet audacieux",
["tint_bold_red_feat"] = "rouge audacieux feat",
["tint_bold_green_feat"] = "vert audacieux feat",
["tint_bold_cyan_feat"] = "cyan audacieux feat",
["tint_bold_yellow_feat"] = "jaune audacieux feat",
["tint_bold_red_white"] = "rouge blanc audacieux",
["tint_bold_blue_white"] = "bleu blanc audacieux",
["tint_metallic_gold"] = "or métallique",
["tint_metallic_platinum"] = "platine métallique",
["tint_metallic_gray_lilac"] = "gris lilas métallique",
["tint_metallic_purple_lime"] = "violet lime métallique",
["tint_metallic_red"] = "rouge métallique",
["tint_metallic_green"] = "vert métallique",
["tint_metallic_blue"] = "bleu métallique",
["tint_metallic_white_aqua"] = "blanc aqua métallique",
["tint_metallic_red_yellow"] = "rouge jaune métallique",
}
+33
View File
@@ -372,4 +372,37 @@ Locales["he"] = {
["tint_lspd"] = "צבע כחול",
["tint_orange"] = "צבע כתום",
["tint_platinum"] = "צבע פלטינה",
-- MK2 Weapon Tints
["tint_classic_black"] = "שחור קלאסי",
["tint_classic_gray"] = "אפור קלאסי",
["tint_classic_two_tone"] = "קלאסי דו-גוני",
["tint_classic_white"] = "לבן קלאסי",
["tint_classic_beige"] = "בז' קלאסי",
["tint_classic_green"] = "ירוק קלאסי",
["tint_classic_blue"] = "כחול קלאסי",
["tint_classic_earth"] = "אדמה קלאסית",
["tint_classic_brown_black"] = "חום שחור קלאסי",
["tint_contrast_red"] = "אדום קונטרסט",
["tint_contrast_blue"] = "כחול קונטרסט",
["tint_contrast_yellow"] = "צהוב קונטרסט",
["tint_contrast_orange"] = "כתום קונטרסט",
["tint_bold_pink"] = "ורוד נועז",
["tint_bold_purple_yellow"] = "סגול צהוב נועז",
["tint_bold_orange"] = "כתום נועז",
["tint_bold_green_purple"] = "ירוק סגול נועז",
["tint_bold_red_feat"] = "אדום נועז feat",
["tint_bold_green_feat"] = "ירוק נועז feat",
["tint_bold_cyan_feat"] = "סיאן נועז feat",
["tint_bold_yellow_feat"] = "צהוב נועז feat",
["tint_bold_red_white"] = "אדום לבן נועז",
["tint_bold_blue_white"] = "כחול לבן נועז",
["tint_metallic_gold"] = "זהב מתכתי",
["tint_metallic_platinum"] = "פלטינה מתכתית",
["tint_metallic_gray_lilac"] = "אפור לילך מתכתי",
["tint_metallic_purple_lime"] = "סגול ליים מתכתי",
["tint_metallic_red"] = "אדום מתכתי",
["tint_metallic_green"] = "ירוק מתכתי",
["tint_metallic_blue"] = "כחול מתכתי",
["tint_metallic_white_aqua"] = "לבן aqua מתכתי",
["tint_metallic_red_yellow"] = "אדום צהוב מתכתי",
}
+33 -4
View File
@@ -374,8 +374,37 @@ Locales["hu"] = {
["tint_lspd"] = "blue skin",
["tint_orange"] = "orange skin",
["tint_platinum"] = "platinum skin",
-- Duty related
["stopped_duty"] = "Leadtad a szolgálatot.",
["started_duty"] = "Szolgálatba álltál.",
-- MK2 Weapon Tints
["tint_classic_black"] = "klasszikus fekete",
["tint_classic_gray"] = "klasszikus szürke",
["tint_classic_two_tone"] = "klasszikus két szín",
["tint_classic_white"] = "klasszikus fehér",
["tint_classic_beige"] = "klasszikus bézs",
["tint_classic_green"] = "klasszikus zöld",
["tint_classic_blue"] = "klasszikus kék",
["tint_classic_earth"] = "klasszikus föld",
["tint_classic_brown_black"] = "klasszikus barna-fekete",
["tint_contrast_red"] = "kontraszt piros",
["tint_contrast_blue"] = "kontraszt kék",
["tint_contrast_yellow"] = "kontraszt sárga",
["tint_contrast_orange"] = "kontraszt narancs",
["tint_bold_pink"] = "merész rózsaszín",
["tint_bold_purple_yellow"] = "merész lila-sárga",
["tint_bold_orange"] = "merész narancs",
["tint_bold_green_purple"] = "merész zöld-lila",
["tint_bold_red_feat"] = "merész piros feat",
["tint_bold_green_feat"] = "merész zöld feat",
["tint_bold_cyan_feat"] = "merész cián feat",
["tint_bold_yellow_feat"] = "merész sárga feat",
["tint_bold_red_white"] = "merész piros fehér",
["tint_bold_blue_white"] = "merész kék fehér",
["tint_metallic_gold"] = "metál arany",
["tint_metallic_platinum"] = "metál platina",
["tint_metallic_gray_lilac"] = "metál szürke lila",
["tint_metallic_purple_lime"] = "metál lila lime",
["tint_metallic_red"] = "metál piros",
["tint_metallic_green"] = "metál zöld",
["tint_metallic_blue"] = "metál kék",
["tint_metallic_white_aqua"] = "metál fehér aqua",
["tint_metallic_red_yellow"] = "metál piros sárga",
}
+33
View File
@@ -378,4 +378,37 @@ Locales["id"] = {
["tint_lspd"] = "blue skin",
["tint_orange"] = "orange skin",
["tint_platinum"] = "platinum skin",
-- MK2 Weapon Tints
["tint_classic_black"] = "hitam klasik",
["tint_classic_gray"] = "abu-abu klasik",
["tint_classic_two_tone"] = "dua warna klasik",
["tint_classic_white"] = "putih klasik",
["tint_classic_beige"] = "beige klasik",
["tint_classic_green"] = "hijau klasik",
["tint_classic_blue"] = "biru klasik",
["tint_classic_earth"] = "tanah klasik",
["tint_classic_brown_black"] = "coklat hitam klasik",
["tint_contrast_red"] = "merah kontras",
["tint_contrast_blue"] = "biru kontras",
["tint_contrast_yellow"] = "kuning kontras",
["tint_contrast_orange"] = "oren kontras",
["tint_bold_pink"] = "pink berani",
["tint_bold_purple_yellow"] = "ungu kuning berani",
["tint_bold_orange"] = "oren berani",
["tint_bold_green_purple"] = "hijau ungu berani",
["tint_bold_red_feat"] = "merah berani feat",
["tint_bold_green_feat"] = "hijau berani feat",
["tint_bold_cyan_feat"] = "sian berani feat",
["tint_bold_yellow_feat"] = "kuning berani feat",
["tint_bold_red_white"] = "merah putih berani",
["tint_bold_blue_white"] = "biru putih berani",
["tint_metallic_gold"] = "emas metalik",
["tint_metallic_platinum"] = "platina metalik",
["tint_metallic_gray_lilac"] = "abu-abu lilac metalik",
["tint_metallic_purple_lime"] = "ungu jeruk nipis metalik",
["tint_metallic_red"] = "merah metalik",
["tint_metallic_green"] = "hijau metalik",
["tint_metallic_blue"] = "biru metalik",
["tint_metallic_white_aqua"] = "putih aqua metalik",
["tint_metallic_red_yellow"] = "merah kuning metalik",
}
+33
View File
@@ -378,4 +378,37 @@ Locales["it"] = {
["tint_lspd"] = "color blu",
["tint_orange"] = "color arancio",
["tint_platinum"] = "color platino",
-- MK2 Weapon Tints
["tint_classic_black"] = "nero classico",
["tint_classic_gray"] = "grigio classico",
["tint_classic_two_tone"] = "due toni classico",
["tint_classic_white"] = "bianco classico",
["tint_classic_beige"] = "beige classico",
["tint_classic_green"] = "verde classico",
["tint_classic_blue"] = "blu classico",
["tint_classic_earth"] = "terra classica",
["tint_classic_brown_black"] = "marrone nero classico",
["tint_contrast_red"] = "rosso contrastante",
["tint_contrast_blue"] = "blu contrastante",
["tint_contrast_yellow"] = "giallo contrastante",
["tint_contrast_orange"] = "arancione contrastante",
["tint_bold_pink"] = "rosa audace",
["tint_bold_purple_yellow"] = "viola giallo audace",
["tint_bold_orange"] = "arancione audace",
["tint_bold_green_purple"] = "verde viola audace",
["tint_bold_red_feat"] = "rosso audace feat",
["tint_bold_green_feat"] = "verde audace feat",
["tint_bold_cyan_feat"] = "cyan audace feat",
["tint_bold_yellow_feat"] = "giallo audace feat",
["tint_bold_red_white"] = "rosso bianco audace",
["tint_bold_blue_white"] = "blu bianco audace",
["tint_metallic_gold"] = "oro metallico",
["tint_metallic_platinum"] = "platino metallico",
["tint_metallic_gray_lilac"] = "grigio lilla metallico",
["tint_metallic_purple_lime"] = "viola lime metallico",
["tint_metallic_red"] = "rosso metallico",
["tint_metallic_green"] = "verde metallico",
["tint_metallic_blue"] = "blu metallico",
["tint_metallic_white_aqua"] = "bianco aqua metallico",
["tint_metallic_red_yellow"] = "rosso giallo metallico",
}
+33
View File
@@ -369,4 +369,37 @@ Locales["nl"] = {
["tint_lspd"] = "blauwe skin",
["tint_orange"] = "oranje skin",
["tint_platinum"] = "platina skin",
-- MK2 Weapon Tints
["tint_classic_black"] = "klassiek zwart",
["tint_classic_gray"] = "klassiek grijs",
["tint_classic_two_tone"] = "klassiek twee-tonig",
["tint_classic_white"] = "klassiek wit",
["tint_classic_beige"] = "klassiek beige",
["tint_classic_green"] = "klassiek groen",
["tint_classic_blue"] = "klassiek blauw",
["tint_classic_earth"] = "klassieke aarde",
["tint_classic_brown_black"] = "klassiek bruin zwart",
["tint_contrast_red"] = "contrast rood",
["tint_contrast_blue"] = "contrast blauw",
["tint_contrast_yellow"] = "contrast geel",
["tint_contrast_orange"] = "contrast oranje",
["tint_bold_pink"] = "gedurfde roze",
["tint_bold_purple_yellow"] = "gedurfde paarse geel",
["tint_bold_orange"] = "gedurfde oranje",
["tint_bold_green_purple"] = "gedurfde groene paarse",
["tint_bold_red_feat"] = "gedurfde rode feat",
["tint_bold_green_feat"] = "gedurfde groene feat",
["tint_bold_cyan_feat"] = "gedurfde cyaan feat",
["tint_bold_yellow_feat"] = "gedurfde gele feat",
["tint_bold_red_white"] = "gedurfde rode witte",
["tint_bold_blue_white"] = "gedurfde blauwe witte",
["tint_metallic_gold"] = "metallisch goud",
["tint_metallic_platinum"] = "metallisch platina",
["tint_metallic_gray_lilac"] = "metallisch grijs lila",
["tint_metallic_purple_lime"] = "metallisch paarse limo",
["tint_metallic_red"] = "metallisch rood",
["tint_metallic_green"] = "metallisch groen",
["tint_metallic_blue"] = "metallisch blauw",
["tint_metallic_white_aqua"] = "metallisch wit aqua",
["tint_metallic_red_yellow"] = "metallisch rood geel",
}
+33
View File
@@ -236,4 +236,37 @@ Locales["pl"] = {
["tint_lspd"] = "niebieski skin",
["tint_orange"] = "pomarańczowy skin",
["tint_platinum"] = "platynowy skin",
-- MK2 Weapon Tints
["tint_classic_black"] = "klasyczna czerń",
["tint_classic_gray"] = "klasyczny szary",
["tint_classic_two_tone"] = "klasyczny dwutonowy",
["tint_classic_white"] = "klasyczna biel",
["tint_classic_beige"] = "klasyczny beż",
["tint_classic_green"] = "klasyczna zieleń",
["tint_classic_blue"] = "klasyczny niebieski",
["tint_classic_earth"] = "klasyczna ziemia",
["tint_classic_brown_black"] = "klasyczny brązowo-czarny",
["tint_contrast_red"] = "kontrastowy czerwony",
["tint_contrast_blue"] = "kontrastowy niebieski",
["tint_contrast_yellow"] = "kontrastowy żółty",
["tint_contrast_orange"] = "kontrastowy pomarańczowy",
["tint_bold_pink"] = "odważny różowy",
["tint_bold_purple_yellow"] = "odważny fioletowo-żółty",
["tint_bold_orange"] = "odważny pomarańczowy",
["tint_bold_green_purple"] = "odważny zielono-fioletowy",
["tint_bold_red_feat"] = "odważny czerwony feat",
["tint_bold_green_feat"] = "odważny zielony feat",
["tint_bold_cyan_feat"] = "odważny cyjan feat",
["tint_bold_yellow_feat"] = "odważny żółty feat",
["tint_bold_red_white"] = "odważny czerwony biały",
["tint_bold_blue_white"] = "odważny niebieski biały",
["tint_metallic_gold"] = "złoto metaliczne",
["tint_metallic_platinum"] = "platyna metaliczna",
["tint_metallic_gray_lilac"] = "szaro-liliowe metaliczne",
["tint_metallic_purple_lime"] = "fioletowo-limonkowe metaliczne",
["tint_metallic_red"] = "czerwony metaliczny",
["tint_metallic_green"] = "zielony metaliczny",
["tint_metallic_blue"] = "niebieski metaliczny",
["tint_metallic_white_aqua"] = "białe aqua metaliczne",
["tint_metallic_red_yellow"] = "czerwono-żółte metaliczne",
}
+33
View File
@@ -374,4 +374,37 @@ Locales["sl"] = {
["tint_lspd"] = "blue skin",
["tint_orange"] = "orange skin",
["tint_platinum"] = "platinum skin",
-- MK2 Weapon Tints
["tint_classic_black"] = "klasična črna",
["tint_classic_gray"] = "klasična siva",
["tint_classic_two_tone"] = "klasična dvo-tonska",
["tint_classic_white"] = "klasična bela",
["tint_classic_beige"] = "klasična bež",
["tint_classic_green"] = "klasična zelena",
["tint_classic_blue"] = "klasična modra",
["tint_classic_earth"] = "klasična zemlja",
["tint_classic_brown_black"] = "klasična rjava-črna",
["tint_contrast_red"] = "kontrastna rdeča",
["tint_contrast_blue"] = "kontrastna modra",
["tint_contrast_yellow"] = "kontrastna rumena",
["tint_contrast_orange"] = "kontrastna oranžna",
["tint_bold_pink"] = "drzna roza",
["tint_bold_purple_yellow"] = "drzna vijolično-rumena",
["tint_bold_orange"] = "drzna oranžna",
["tint_bold_green_purple"] = "drzna zelena-vijolična",
["tint_bold_red_feat"] = "drzna rdeča feat",
["tint_bold_green_feat"] = "drzna zelena feat",
["tint_bold_cyan_feat"] = "drzna cian feat",
["tint_bold_yellow_feat"] = "drzna rumena feat",
["tint_bold_red_white"] = "drzna rdeča bela",
["tint_bold_blue_white"] = "drzna modra bela",
["tint_metallic_gold"] = "metalik zlato",
["tint_metallic_platinum"] = "metalik platina",
["tint_metallic_gray_lilac"] = "metalik siv lila",
["tint_metallic_purple_lime"] = "metalik vijolična limona",
["tint_metallic_red"] = "metalik rdeča",
["tint_metallic_green"] = "metalik zelena",
["tint_metallic_blue"] = "metalik modra",
["tint_metallic_white_aqua"] = "metalik bela aqua",
["tint_metallic_red_yellow"] = "metalik rdeče rumeno",
}
+33
View File
@@ -374,4 +374,37 @@ Locales["sr"] = {
["tint_lspd"] = "blue skin",
["tint_orange"] = "orange skin",
["tint_platinum"] = "platinum skin",
-- MK2 Weapon Tints
["tint_classic_black"] = "klasična crna",
["tint_classic_gray"] = "klasična siva",
["tint_classic_two_tone"] = "klasična dvo-tonska",
["tint_classic_white"] = "klasična bela",
["tint_classic_beige"] = "klasična bež",
["tint_classic_green"] = "klasična zelena",
["tint_classic_blue"] = "klasična plava",
["tint_classic_earth"] = "klasična zemlja",
["tint_classic_brown_black"] = "klasična braon-crna",
["tint_contrast_red"] = "kontrastna crvena",
["tint_contrast_blue"] = "kontrastna plava",
["tint_contrast_yellow"] = "kontrastna žuta",
["tint_contrast_orange"] = "kontrastna narandžasta",
["tint_bold_pink"] = "drska roze",
["tint_bold_purple_yellow"] = "drska ljubičasto-žuta",
["tint_bold_orange"] = "drska narandžasta",
["tint_bold_green_purple"] = "drska zelena-ljubičasta",
["tint_bold_red_feat"] = "drska crvena feat",
["tint_bold_green_feat"] = "drska zelena feat",
["tint_bold_cyan_feat"] = "drska cijan feat",
["tint_bold_yellow_feat"] = "drska žuta feat",
["tint_bold_red_white"] = "drska crvena bela",
["tint_bold_blue_white"] = "drska plava bela",
["tint_metallic_gold"] = "metalik zlatna",
["tint_metallic_platinum"] = "metalik platina",
["tint_metallic_gray_lilac"] = "metalik siva lila",
["tint_metallic_purple_lime"] = "metalik ljubičasta limeta",
["tint_metallic_red"] = "metalik crvena",
["tint_metallic_green"] = "metalik zelena",
["tint_metallic_blue"] = "metalik plava",
["tint_metallic_white_aqua"] = "metalik bela aqua",
["tint_metallic_red_yellow"] = "metalik crvena-žuta",
}
+33
View File
@@ -378,4 +378,37 @@ Locales["sv"] = {
["tint_lspd"] = "blue skin",
["tint_orange"] = "orange skin",
["tint_platinum"] = "platinum skin",
-- MK2 Weapon Tints
["tint_classic_black"] = "klassisk svart",
["tint_classic_gray"] = "klassisk grå",
["tint_classic_two_tone"] = "klassisk tvåfärgad",
["tint_classic_white"] = "klassisk vit",
["tint_classic_beige"] = "klassisk beige",
["tint_classic_green"] = "klassisk grön",
["tint_classic_blue"] = "klassisk blå",
["tint_classic_earth"] = "klassisk jord",
["tint_classic_brown_black"] = "klassisk brun svart",
["tint_contrast_red"] = "kontrast röd",
["tint_contrast_blue"] = "kontrast blå",
["tint_contrast_yellow"] = "kontrast gul",
["tint_contrast_orange"] = "kontrast orange",
["tint_bold_pink"] = "djärv rosa",
["tint_bold_purple_yellow"] = "djärv lila gul",
["tint_bold_orange"] = "djärv orange",
["tint_bold_green_purple"] = "djärv grön lila",
["tint_bold_red_feat"] = "djärv röd feat",
["tint_bold_green_feat"] = "djärv grön feat",
["tint_bold_cyan_feat"] = "djärv cyan feat",
["tint_bold_yellow_feat"] = "djärv gul feat",
["tint_bold_red_white"] = "djärv röd vit",
["tint_bold_blue_white"] = "djärv blå vit",
["tint_metallic_gold"] = "metalliskt guld",
["tint_metallic_platinum"] = "metalliskt platina",
["tint_metallic_gray_lilac"] = "metalliskt grå lila",
["tint_metallic_purple_lime"] = "metalliskt lila lime",
["tint_metallic_red"] = "metalliskt röd",
["tint_metallic_green"] = "metalliskt grön",
["tint_metallic_blue"] = "metalliskt blå",
["tint_metallic_white_aqua"] = "metalliskt vitt aqua",
["tint_metallic_red_yellow"] = "metalliskt röd gul",
}
+33
View File
@@ -374,4 +374,37 @@ Locales["zh-cn"] = {
["tint_lspd"] = "洛圣都警局色调",
["tint_orange"] = "橙色调",
["tint_platinum"] = "铂金色调",
-- MK2 Weapon Tints
["tint_classic_black"] = "经典黑色",
["tint_classic_gray"] = "经典灰色",
["tint_classic_two_tone"] = "经典双色",
["tint_classic_white"] = "经典白色",
["tint_classic_beige"] = "经典米色",
["tint_classic_green"] = "经典绿色",
["tint_classic_blue"] = "经典蓝色",
["tint_classic_earth"] = "经典大地色",
["tint_classic_brown_black"] = "经典棕黑色",
["tint_contrast_red"] = "对比红色",
["tint_contrast_blue"] = "对比蓝色",
["tint_contrast_yellow"] = "对比黄色",
["tint_contrast_orange"] = "对比橙色",
["tint_bold_pink"] = "大胆粉色",
["tint_bold_purple_yellow"] = "大胆紫黄色",
["tint_bold_orange"] = "大胆橙色",
["tint_bold_green_purple"] = "大胆绿色紫色",
["tint_bold_red_feat"] = "大胆红色feat",
["tint_bold_green_feat"] = "大胆绿色feat",
["tint_bold_cyan_feat"] = "大胆青色feat",
["tint_bold_yellow_feat"] = "大胆黄色feat",
["tint_bold_red_white"] = "大胆红白色",
["tint_bold_blue_white"] = "大胆蓝白色",
["tint_metallic_gold"] = "金属金色",
["tint_metallic_platinum"] = "金属铂金",
["tint_metallic_gray_lilac"] = "金属灰紫色",
["tint_metallic_purple_lime"] = "金属紫色青柠",
["tint_metallic_red"] = "金属红色",
["tint_metallic_green"] = "金属绿色",
["tint_metallic_blue"] = "金属蓝色",
["tint_metallic_white_aqua"] = "金属白色水蓝",
["tint_metallic_red_yellow"] = "金属红黄色",
}
+12 -2
View File
@@ -130,6 +130,7 @@ function CreateExtendedPlayer(playerId, identifier, group, accounts, inventory,
---@return number
function self.getPlayTime()
-- luacheck: ignore
return self.lastPlaytime + GetPlayerTimeOnline(self.source)
end
@@ -607,8 +608,17 @@ function CreateExtendedPlayer(playerId, identifier, group, accounts, inventory,
function self.updateWeaponAmmo(weaponName, ammoCount)
local _, weapon = self.getWeapon(weaponName)
if weapon then
weapon.ammo = ammoCount
if not weapon then
return
end
weapon.ammo = ammoCount
if weapon.ammo <= 0 then
local _, weaponConfig = ESX.GetWeapon(weaponName)
if weaponConfig.throwable then
self.removeWeapon(weaponName)
end
end
end
+16 -14
View File
@@ -276,15 +276,15 @@ end
ESX.GetPlayers = GetPlayers
local function checkTable(key, val, player, xPlayers)
local function checkTable(key, val, xPlayer, xPlayers)
for valIndex = 1, #val do
local value = val[valIndex]
if not xPlayers[value] then
xPlayers[value] = {}
end
if (key == "job" and player.job.name == value) or player[key] == value then
xPlayers[value][#xPlayers[value] + 1] = player
if (key == "job" and xPlayer.job.name == value) or xPlayer[key] == value then
xPlayers[value][#xPlayers[value] + 1] = xPlayer
end
end
end
@@ -293,20 +293,22 @@ end
---@param val? string|table
---@return table
function ESX.GetExtendedPlayers(key, val)
if not key then
return ESX.Table.ToArray(ESX.Players)
end
local xPlayers = {}
if type(val) == "table" then
for _, v in pairs(ESX.Players) do
checkTable(key, val, v, xPlayers)
for i, xPlayer in pairs(ESX.Players) do
checkTable(key, val, xPlayer, xPlayers)
end
else
for _, v in pairs(ESX.Players) do
if key then
if (key == "job" and v.job.name == val) or v[key] == val then
xPlayers[#xPlayers + 1] = v
end
else
xPlayers[#xPlayers + 1] = v
end
return xPlayers
end
for i, xPlayer in pairs(ESX.Players) do
if (key == "job" and xPlayer.job.name == val) or xPlayer[key] == val then
xPlayers[#xPlayers + 1] = xPlayer
end
end
+5 -3
View File
@@ -102,7 +102,7 @@ if not Config.Multichar then
Wait(0) -- Required
local identifier = ESX.GetIdentifier(playerId)
-- luacheck: ignore
if not SetEntityOrphanMode then
return deferrals.done(("[ESX] ESX Requires a minimum Artifact version of 10188, Please update your server."))
end
@@ -462,6 +462,7 @@ if not Config.CustomInventory then
if not targetXPlayer.hasWeapon(itemName) then
sourceXPlayer.showNotification(TranslateCap("gave_weapon_noweapon", targetXPlayer.name))
targetXPlayer.showNotification(TranslateCap("received_weapon_noweapon", sourceXPlayer.name, weapon.label))
return
end
local _, weaponObject = ESX.GetWeapon(itemName)
@@ -502,7 +503,8 @@ if not Config.CustomInventory then
if itemCount == nil or itemCount < 1 then
return xPlayer.showNotification(TranslateCap("imp_invalid_amount"))
end
local account = xPlayer.getAccount(itemName)
local account = xPlayer.getAccount(itemName)
if itemCount > account.money or account.money < 1 then
return xPlayer.showNotification(TranslateCap("imp_invalid_amount"))
@@ -694,7 +696,7 @@ AddEventHandler("onResourceStart", function(key)
StopResource(key)
error(("WE STOPPED A RESOURCE THAT WILL BREAK ^1ESX^1, PLEASE REMOVE ^5%s^1"):format(key))
end
-- luacheck: ignore
if not SetEntityOrphanMode then
CreateThread(function()
while true do
@@ -1,9 +1,9 @@
RegisterServerEvent("esx:playerPedChanged")
RegisterServerEvent("esx:playerJumping")
RegisterServerEvent("esx:enteringVehicle")
RegisterServerEvent("esx:enteringVehicleAborted")
RegisterServerEvent("esx:enteredVehicle")
RegisterServerEvent("esx:exitedVehicle")
RegisterNetEvent("esx:playerPedChanged")
RegisterNetEvent("esx:playerJumping")
RegisterNetEvent("esx:enteringVehicle")
RegisterNetEvent("esx:enteringVehicleAborted")
RegisterNetEvent("esx:enteredVehicle")
RegisterNetEvent("esx:exitedVehicle")
if Config.EnableDebug then
AddEventHandler("esx:playerPedChanged", function(netId)
+56 -21
View File
@@ -1,13 +1,24 @@
---@diagnostic disable: duplicate-set-field
-- =============================================
-- MARK: Variables
-- =============================================
Callbacks = {}
Callbacks.requests = {}
Callbacks.storage = {}
Callbacks.id = 0
function Callbacks:Register(name, cb)
self.storage[name] = cb
-- =============================================
-- MARK: Internal Functions
-- =============================================
function Callbacks:Register(name, resource, cb)
self.storage[name] = {
resource = resource,
cb = cb
}
end
function Callbacks:Execute(cb, ...)
@@ -39,7 +50,7 @@ function Callbacks:ServerRecieve(player, event, requestId, invoker, ...)
local returnCb = function(...)
TriggerClientEvent("esx:serverCallback", player, requestId, invoker, ...)
end
local callback = self.storage[event]
local callback = self.storage[event].cb
self:Execute(callback, player, returnCb, ...)
end
@@ -57,6 +68,41 @@ function Callbacks:RecieveClient(requestId, invoker, ...)
self.requests[requestId] = nil
end
-- =============================================
-- MARK: ESX Functions
-- =============================================
---@param player number playerId
---@param eventName string
---@param callback function
---@param ... any
function ESX.TriggerClientCallback(player, eventName, callback, ...)
local invokingResource = GetInvokingResource()
local invoker = (invokingResource and invokingResource ~= "Unknown") and invokingResource or "es_extended"
Callbacks:Trigger(player, eventName, callback, invoker, ...)
end
---@param eventName string
---@param callback function
---@return nil
function ESX.RegisterServerCallback(eventName, callback)
local invokingResource = GetInvokingResource()
local invoker = (invokingResource and invokingResource ~= "Unknown") and invokingResource or "es_extended"
Callbacks:Register(eventName, invoker, callback)
end
---@param eventName string
---@return boolean
function ESX.DoesServerCallbackExist(eventName)
return Callbacks.storage[eventName] ~= nil
end
-- =============================================
-- MARK: Events
-- =============================================
RegisterNetEvent("esx:clientCallback", function(requestId, invoker, ...)
Callbacks:RecieveClient(requestId, invoker, ...)
end)
@@ -66,21 +112,10 @@ RegisterNetEvent("esx:triggerServerCallback", function(eventName, requestId, inv
Callbacks:ServerRecieve(source, eventName, requestId, invoker, ...)
end)
---@param player number playerId
---@param eventName string
---@param callback function
---@param ... any
function ESX.TriggerClientCallback(player, eventName, callback, ...)
local invokingResource = GetInvokingResource()
local invoker = (invokingResource and invokingResource ~= "unknown") and invokingResource or "es_extended"
Callbacks:Trigger(player, eventName, callback, invoker, ...)
end
---@param eventName string
---@param callback function
ESX.RegisterServerCallback = function(eventName, callback)
Callbacks:Register(eventName, callback)
end
AddEventHandler("onResourceStop", function(resource)
for k, v in pairs(Callbacks.storage) do
if v.resource == resource then
Callbacks.storage[k] = nil
end
end
end)
@@ -95,10 +95,17 @@ ESX.RegisterCommand(
})
end
local xRoutingBucket = GetPlayerRoutingBucket(xPlayer.source)
ESX.OneSync.SpawnVehicle(args.car, playerCoords, playerHeading, upgrades, function(networkId)
if networkId then
local vehicle = NetworkGetEntityFromNetworkId(networkId)
for _ = 1, 20 do
if xRoutingBucket ~= 0 then
SetEntityRoutingBucket(vehicle, xRoutingBucket)
end
for _ = 1, 100 do
Wait(0)
SetPedIntoVehicle(playerPed, vehicle, -1)
@@ -106,6 +113,7 @@ ESX.RegisterCommand(
break
end
end
if GetVehiclePedIsIn(playerPed, false) ~= vehicle then
showError("[^1ERROR^7] The player could not be seated in the vehicle")
end
@@ -101,7 +101,7 @@ function ESX.OneSync.SpawnVehicle(model, coords, heading, properties, cb)
return error(("Could not spawn vehicle - ^5%s^7!"):format(model))
end
end
-- luacheck: ignore
SetEntityOrphanMode(createdVehicle, 2)
local networkId = NetworkGetNetworkIdFromEntity(createdVehicle)
Entity(createdVehicle).state:set("VehicleProperties", vehicleProperties, true)
+61 -26
View File
@@ -8,6 +8,41 @@ Config.DefaultWeaponTints = {
[6] = TranslateCap("tint_orange"),
[7] = TranslateCap("tint_platinum"),
}
Config.MK2WeaponTints = {
[0] = TranslateCap('tint_classic_black'),
[1] = TranslateCap('tint_classic_gray'),
[2] = TranslateCap('tint_classic_two_tone'),
[3] = TranslateCap('tint_classic_white'),
[4] = TranslateCap('tint_classic_beige'),
[5] = TranslateCap('tint_classic_green'),
[6] = TranslateCap('tint_classic_blue'),
[7] = TranslateCap('tint_classic_earth'),
[8] = TranslateCap('tint_classic_brown_black'),
[9] = TranslateCap('tint_contrast_red'),
[10] = TranslateCap('tint_contrast_blue'),
[11] = TranslateCap('tint_contrast_yellow'),
[12] = TranslateCap('tint_contrast_orange'),
[13] = TranslateCap('tint_bold_pink'),
[14] = TranslateCap('tint_bold_purple_yellow'),
[15] = TranslateCap('tint_bold_orange'),
[16] = TranslateCap('tint_bold_green_purple'),
[17] = TranslateCap('tint_bold_red_feat'),
[18] = TranslateCap('tint_bold_green_feat'),
[19] = TranslateCap('tint_bold_cyan_feat'),
[20] = TranslateCap('tint_bold_yellow_feat'),
[21] = TranslateCap('tint_bold_red_white'),
[22] = TranslateCap('tint_bold_blue_white'),
[23] = TranslateCap('tint_metallic_gold'),
[24] = TranslateCap('tint_metallic_platinum'),
[25] = TranslateCap('tint_metallic_gray_lilac'),
[26] = TranslateCap('tint_metallic_purple_lime'),
[27] = TranslateCap('tint_metallic_red'),
[28] = TranslateCap('tint_metallic_green'),
[29] = TranslateCap('tint_metallic_blue'),
[30] = TranslateCap('tint_metallic_white_aqua'),
[31] = TranslateCap('tint_metallic_orange_yellow'),
[32] = TranslateCap('tint_metallic_red_yellow')
}
Config.Weapons = {
-- Melee
@@ -111,7 +146,7 @@ Config.Weapons = {
name = "WEAPON_REVOLVER_MK2",
label = TranslateCap("weapon_revolver_mk2"),
ammo = { label = TranslateCap("ammo_rounds"), hash = `AMMO_PISTOL` },
tints = Config.DefaultWeaponTints,
tints = Config.MK2WeaponTints,
components = {
{ name = "clip_default", label = TranslateCap("component_clip_default"), hash = `COMPONENT_REVOLVER_MK2_CLIP_01` },
{ name = "ammo_tracer", label = TranslateCap("component_ammo_tracer"), hash = `COMPONENT_REVOLVER_MK2_CLIP_TRACER` },
@@ -153,7 +188,7 @@ Config.Weapons = {
name = "WEAPON_PISTOL_MK2",
label = TranslateCap("weapon_pistol_mk2"),
ammo = { label = TranslateCap("ammo_rounds"), hash = `AMMO_PISTOL` },
tints = Config.DefaultWeaponTints,
tints = Config.MK2WeaponTints,
components = {
{ name = "clip_default", label = TranslateCap("component_clip_default"), hash = `COMPONENT_PISTOL_MK2_CLIP_01` },
{ name = "clip_extended", label = TranslateCap("component_clip_extended"), hash = `COMPONENT_PISTOL_MK2_CLIP_02` },
@@ -217,7 +252,7 @@ Config.Weapons = {
name = "WEAPON_SNSPISTOL_MK2",
label = TranslateCap("weapon_snspistol_mk2"),
ammo = { label = TranslateCap("ammo_rounds"), hash = `AMMO_PISTOL` },
tints = Config.DefaultWeaponTints,
tints = Config.MK2WeaponTints,
components = {
{ name = "clip_default", label = TranslateCap("component_clip_default"), hash = `COMPONENT_SNSPISTOL_MK2_CLIP_01` },
{ name = "clip_extended", label = TranslateCap("component_clip_extended"), hash = `COMPONENT_SNSPISTOL_MK2_CLIP_02` },
@@ -333,7 +368,7 @@ Config.Weapons = {
name = "WEAPON_PUMPSHOTGUN_MK2",
label = TranslateCap("weapon_pumpshotgun_mk2"),
ammo = { label = TranslateCap("ammo_shells"), hash = `AMMO_SHOTGUN` },
tints = Config.DefaultWeaponTints,
tints = Config.MK2WeaponTints,
components = {
{ name = "shells_default", label = TranslateCap("component_shells_default"), hash = `COMPONENT_PUMPSHOTGUN_MK2_CLIP_01` },
{ name = "shells_incendiary", label = TranslateCap("component_shells_incendiary"), hash = `COMPONENT_PUMPSHOTGUN_MK2_CLIP_INCENDIARY` },
@@ -400,7 +435,7 @@ Config.Weapons = {
name = "WEAPON_COMBATMG_MK2",
label = TranslateCap("weapon_combatmg_mk2"),
ammo = { label = TranslateCap("ammo_rounds"), hash = `AMMO_MG` },
tints = Config.DefaultWeaponTints,
tints = Config.MK2WeaponTints,
components = {
{ name = "clip_default", label = TranslateCap("component_clip_default"), hash = `COMPONENT_COMBATMG_MK2_CLIP_01` },
{ name = "clip_extended", label = TranslateCap("component_clip_extended"), hash = `COMPONENT_COMBATMG_MK2_CLIP_02` },
@@ -525,7 +560,7 @@ Config.Weapons = {
name = "WEAPON_SMG_MK2",
label = TranslateCap("weapon_smg_mk2"),
ammo = { label = TranslateCap("ammo_rounds"), hash = `AMMO_SMG` },
tints = Config.DefaultWeaponTints,
tints = Config.MK2WeaponTints,
components = {
{ name = "clip_default", label = TranslateCap("component_clip_default"), hash = `COMPONENT_SMG_MK2_CLIP_01` },
{ name = "clip_extended", label = TranslateCap("component_clip_extended"), hash = `COMPONENT_SMG_MK2_CLIP_02` },
@@ -596,7 +631,7 @@ Config.Weapons = {
name = "WEAPON_ASSAULTRIFLE_MK2",
label = TranslateCap("weapon_assaultrifle_mk2"),
ammo = { label = TranslateCap("ammo_rounds"), hash = `AMMO_RIFLE` },
tints = Config.DefaultWeaponTints,
tints = Config.MK2WeaponTints,
components = {
{ name = "clip_default", label = TranslateCap("component_clip_default"), hash = `COMPONENT_ASSAULTRIFLE_MK2_CLIP_01` },
{ name = "clip_extended", label = TranslateCap("component_clip_extended"), hash = `COMPONENT_ASSAULTRIFLE_MK2_CLIP_02` },
@@ -651,7 +686,7 @@ Config.Weapons = {
name = "WEAPON_BULLPUPRIFLE_MK2",
label = TranslateCap("weapon_bullpuprifle_mk2"),
ammo = { label = TranslateCap("ammo_rounds"), hash = `AMMO_RIFLE` },
tints = Config.DefaultWeaponTints,
tints = Config.MK2WeaponTints,
components = {
{ name = "clip_default", label = TranslateCap("component_clip_default"), hash = `COMPONENT_BULLPUPRIFLE_MK2_CLIP_01` },
{ name = "clip_extended", label = TranslateCap("component_clip_extended"), hash = `COMPONENT_BULLPUPRIFLE_MK2_CLIP_02` },
@@ -707,7 +742,7 @@ Config.Weapons = {
name = "WEAPON_CARBINERIFLE_MK2",
label = TranslateCap("weapon_carbinerifle_mk2"),
ammo = { label = TranslateCap("ammo_rounds"), hash = `AMMO_RIFLE` },
tints = Config.DefaultWeaponTints,
tints = Config.MK2WeaponTints,
components = {
{ name = "clip_default", label = TranslateCap("component_clip_default"), hash = `COMPONENT_CARBINERIFLE_MK2_CLIP_01` },
{ name = "clip_extended", label = TranslateCap("component_clip_extended"), hash = `COMPONENT_CARBINERIFLE_MK2_CLIP_02` },
@@ -788,7 +823,7 @@ Config.Weapons = {
name = "WEAPON_SPECIALCARBINE_MK2",
label = TranslateCap("weapon_specialcarbine_mk2"),
ammo = { label = TranslateCap("ammo_rounds"), hash = `AMMO_RIFLE` },
tints = Config.DefaultWeaponTints,
tints = Config.MK2WeaponTints,
components = {
{ name = "clip_default", label = TranslateCap("component_clip_default"), hash = `COMPONENT_SPECIALCARBINE_MK2_CLIP_01` },
{ name = "clip_extended", label = TranslateCap("component_clip_extended"), hash = `COMPONENT_SPECIALCARBINE_MK2_CLIP_02` },
@@ -854,7 +889,7 @@ Config.Weapons = {
name = "WEAPON_HEAVYSNIPER_MK2",
label = TranslateCap("weapon_heavysniper_mk2"),
ammo = { label = TranslateCap("ammo_rounds"), hash = `AMMO_SNIPER` },
tints = Config.DefaultWeaponTints,
tints = Config.MK2WeaponTints,
components = {
{ name = "clip_default", label = TranslateCap("component_clip_default"), hash = `COMPONENT_HEAVYSNIPER_MK2_CLIP_01` },
{ name = "clip_extended", label = TranslateCap("component_clip_extended"), hash = `COMPONENT_HEAVYSNIPER_MK2_CLIP_02` },
@@ -903,7 +938,7 @@ Config.Weapons = {
name = "WEAPON_MARKSMANRIFLE_MK2",
label = TranslateCap("weapon_marksmanrifle_mk2"),
ammo = { label = TranslateCap("ammo_rounds"), hash = `AMMO_SNIPER` },
tints = Config.DefaultWeaponTints,
tints = Config.MK2WeaponTints,
components = {
{ name = "clip_default", label = TranslateCap("component_clip_default"), hash = `COMPONENT_MARKSMANRIFLE_MK2_CLIP_01` },
{ name = "clip_extended", label = TranslateCap("component_clip_extended"), hash = `COMPONENT_MARKSMANRIFLE_MK2_CLIP_02` },
@@ -973,22 +1008,22 @@ Config.Weapons = {
{ name = "WEAPON_RPG", label = TranslateCap("weapon_rpg"), tints = Config.DefaultWeaponTints, components = {}, ammo = { label = TranslateCap("ammo_rockets"), hash = `AMMO_RPG` } },
{ name = "WEAPON_RAYMINIGUN", label = TranslateCap("weapon_rayminigun"), tints = Config.DefaultWeaponTints, components = {}, ammo = { label = TranslateCap("ammo_rounds"), hash = `AMMO_MINIGUN` } },
-- Thrown
{ name = "WEAPON_BALL", label = TranslateCap("weapon_ball"), components = {}, ammo = { label = TranslateCap("ammo_ball"), hash = `AMMO_BALL` } },
{ name = "WEAPON_BZGAS", label = TranslateCap("weapon_bzgas"), components = {}, ammo = { label = TranslateCap("ammo_bzgas"), hash = `AMMO_BZGAS` } },
{ name = "WEAPON_FLARE", label = TranslateCap("weapon_flare"), components = {}, ammo = { label = TranslateCap("ammo_flare"), hash = `AMMO_FLARE` } },
{ name = "WEAPON_GRENADE", label = TranslateCap("weapon_grenade"), components = {}, ammo = { label = TranslateCap("ammo_grenade"), hash = `AMMO_GRENADE` } },
{ name = "WEAPON_PETROLCAN", label = TranslateCap("weapon_petrolcan"), components = {}, ammo = { label = TranslateCap("ammo_petrol"), hash = `AMMO_PETROLCAN` } },
{ name = "WEAPON_HAZARDCAN", label = TranslateCap("weapon_hazardcan"), components = {}, ammo = { label = TranslateCap("ammo_petrol"), hash = `AMMO_PETROLCAN` } },
{ name = "WEAPON_MOLOTOV", label = TranslateCap("weapon_molotov"), components = {}, ammo = { label = TranslateCap("ammo_molotov"), hash = `AMMO_MOLOTOV` } },
{ name = "WEAPON_PROXMINE", label = TranslateCap("weapon_proxmine"), components = {}, ammo = { label = TranslateCap("ammo_proxmine"), hash = `AMMO_PROXMINE` } },
{ name = "WEAPON_PIPEBOMB", label = TranslateCap("weapon_pipebomb"), components = {}, ammo = { label = TranslateCap("ammo_pipebomb"), hash = `AMMO_PIPEBOMB` } },
{ name = "WEAPON_SNOWBALL", label = TranslateCap("weapon_snowball"), components = {}, ammo = { label = TranslateCap("ammo_snowball"), hash = `AMMO_SNOWBALL` } },
{ name = "WEAPON_STICKYBOMB", label = TranslateCap("weapon_stickybomb"), components = {}, ammo = { label = TranslateCap("ammo_stickybomb"), hash = `AMMO_STICKYBOMB` } },
{ name = "WEAPON_SMOKEGRENADE", label = TranslateCap("weapon_smokegrenade"), components = {}, ammo = { label = TranslateCap("ammo_smokebomb"), hash = `AMMO_SMOKEGRENADE` } },
{ name = "WEAPON_BALL", label = TranslateCap("weapon_ball"), components = {}, ammo = { label = TranslateCap("ammo_ball"), hash = `AMMO_BALL` }, throwable = true },
{ name = "WEAPON_BZGAS", label = TranslateCap("weapon_bzgas"), components = {}, ammo = { label = TranslateCap("ammo_bzgas"), hash = `AMMO_BZGAS` }, throwable = true },
{ name = "WEAPON_FLARE", label = TranslateCap("weapon_flare"), components = {}, ammo = { label = TranslateCap("ammo_flare"), hash = `AMMO_FLARE` }, throwable = true },
{ name = "WEAPON_GRENADE", label = TranslateCap("weapon_grenade"), components = {}, ammo = { label = TranslateCap("ammo_grenade"), hash = `AMMO_GRENADE` }, throwable = true },
{ name = "WEAPON_PETROLCAN", label = TranslateCap("weapon_petrolcan"), components = {}, ammo = { label = TranslateCap("ammo_petrol"), hash = `AMMO_PETROLCAN` }, throwable = true },
{ name = "WEAPON_HAZARDCAN", label = TranslateCap("weapon_hazardcan"), components = {}, ammo = { label = TranslateCap("ammo_petrol"), hash = `AMMO_PETROLCAN` }, throwable = true },
{ name = "WEAPON_MOLOTOV", label = TranslateCap("weapon_molotov"), components = {}, ammo = { label = TranslateCap("ammo_molotov"), hash = `AMMO_MOLOTOV` }, throwable = true },
{ name = "WEAPON_PROXMINE", label = TranslateCap("weapon_proxmine"), components = {}, ammo = { label = TranslateCap("ammo_proxmine"), hash = `AMMO_PROXMINE` }, throwable = true },
{ name = "WEAPON_PIPEBOMB", label = TranslateCap("weapon_pipebomb"), components = {}, ammo = { label = TranslateCap("ammo_pipebomb"), hash = `AMMO_PIPEBOMB` }, throwable = true },
{ name = "WEAPON_SNOWBALL", label = TranslateCap("weapon_snowball"), components = {}, ammo = { label = TranslateCap("ammo_snowball"), hash = `AMMO_SNOWBALL` }, throwable = true },
{ name = "WEAPON_STICKYBOMB", label = TranslateCap("weapon_stickybomb"), components = {}, ammo = { label = TranslateCap("ammo_stickybomb"), hash = `AMMO_STICKYBOMB` }, throwable = true },
{ name = "WEAPON_SMOKEGRENADE", label = TranslateCap("weapon_smokegrenade"), components = {}, ammo = { label = TranslateCap("ammo_smokebomb"), hash = `AMMO_SMOKEGRENADE` }, throwable = true },
-- Tools
{ name = "WEAPON_FIREEXTINGUISHER", label = TranslateCap("weapon_fireextinguisher"), components = {}, ammo = { label = TranslateCap("ammo_charge"), hash = `AMMO_FIREEXTINGUISHER` } },
{ name = "WEAPON_DIGISCANNER", label = TranslateCap("weapon_digiscanner"), components = {} },
{ name = "GADGET_PARACHUTE", label = TranslateCap("gadget_parachute"), components = {} },
{ name = "GADGET_PARACHUTE", label = TranslateCap("gadget_parachute"), components = {}, throwable = true },
{
name = "WEAPON_TACTICALRIFLE",
label = TranslateCap("weapon_tactilerifle"),
@@ -1022,7 +1057,7 @@ Config.Weapons = {
{ name = "suppressor", label = TranslateCap("component_suppressor"), hash = `COMPONENT_PISTOLXM3_SUPP` },
},
},
{ name = "WEAPON_ACIDPACKAGE", label = TranslateCap("weapon_acidpackage"), components = {} },
{ name = "WEAPON_ACIDPACKAGE", label = TranslateCap("weapon_acidpackage"), components = {}, throwable = true },
{ name = "WEAPON_CANDYCANE", label = TranslateCap("weapon_candycane"), components = {} },
{
name = "WEAPON_RAILGUNXM3",
@@ -223,3 +223,11 @@ function ESX.Table.Sort(t, order)
end
end
end
function ESX.Table.ToArray(table)
local array = {}
for _, v in pairs(table) do
array[#array + 1] = v
end
return array
end
+11 -12
View File
@@ -9,8 +9,9 @@
min-width: 350px;
color: #fff;
position: absolute;
background: rgba(33, 33, 33, 0);
background: rgba(15, 15, 15, 0.0);
text-align: center;
border-radius: 5px;
}
.head {
@@ -18,9 +19,9 @@
overflow: hidden;
padding-bottom: 3px;
text-align: center;
margin-bottom: 5px;
white-space: nowrap;
background: rgba(10, 10, 10, 0.9);
background: rgba(10, 10, 10, 1);
border-bottom: 2px solid #fb9b04;
}
.menu .head {
@@ -47,16 +48,14 @@
font-size: 13px;
height: 16px;
text-indent: 5px;
margin-top: 5px;
background: rgba(40, 40, 40, 0.8);
color: rgb(202, 202, 202);
border-radius: 5px;
margin-bottom: 6px;
background: rgba(30, 30, 30, 0.9);
color: rgb(243, 243, 243);
}
.menu .menu-items .menu-item.selected {
border: 1px solid rgba(55, 55, 55, 0.9);
background: rgba(20, 20, 20, 0.9);
border: 1px solid #fb9c04ec;
background: rgba(15, 15, 15, 0.9);
color: rgba(243, 243, 243);
letter-spacing: 0.2px;
font-weight: 500;
@@ -68,7 +67,7 @@
}
.menu.align-top-left {
left: 3rem;
left: 4rem;
top: 0;
}
@@ -99,7 +98,7 @@
}
.menu.align-bottom-left {
left: 3rem;
left: 4rem;
bottom: 0;
}
@@ -25,7 +25,8 @@ function Server:OnConnecting(source, deferrals)
deferrals.defer()
Wait(0) -- Required
local identifier = self:GetIdentifier(source)
-- luacheck: ignore
if not SetEntityOrphanMode then
return deferrals.done(("[ESX] ESX Requires a minimum Artifact version of 10188, Please update your server."))
end
+9 -6
View File
@@ -32,8 +32,8 @@ body {
min-width: 20rem;
width: fit-content;
height: 3.5rem;
background: rgba(5, 5, 5, 0.9);
border-radius: 0.5rem;
background: rgba(15, 15, 15, 0.9);
border-radius: 0.4rem;
margin-top: 0.5rem;
animation: anim 300ms ease-in-out;
align-items: center;
@@ -47,24 +47,27 @@ body {
#root .icon {
float: left;
color: #fff;
}
#root .text {
display: inline-block;
color: #fff;
margin-left: 0.5rem;
}
#root .error {
border-bottom: 3px solid #c0392b;
color: #c0392b;
border: 2px solid #c0392b;
}
#root .success {
border-bottom: 3px solid #2ecc71;
color: #2ecc71;
border: 2px solid #2ecc71;
}
#root .info {
border-bottom: 3px solid #2980b9;
color: #fb9b04;
border: 2px solid #fb9b04;
}
.material-symbols-outlined {
+15 -6
View File
@@ -15,15 +15,15 @@ const types = {
// the color codes example `i ~r~love~s~ donuts`
const codes = {
"~r~": "red",
"~r~": "#c0392b",
"~b~": "#378cbf",
"~g~": "green",
"~g~": "#2ecc71",
"~y~": "yellow",
"~p~": "purple",
"~c~": "grey",
"~m~": "#212121",
"~u~": "black",
"~o~": "orange",
"~o~": "#fb9b04",
};
w.addEventListener("message", (event) => {
@@ -57,8 +57,9 @@ notification = (data) => {
}
}
const id = Math.floor(Math.random() * Math.random());
const notification = $(`
<div class="notify ${data.type}">
<div id="${id}" class="notify ${data.type} fadeIn">
<div class="innerText">
<span class="material-symbols-outlined icon">${types[data.type] ? types[data.type]["icon"] : types["info"]["icon"]}</span>
<p class="text">${data["message"]}</p>
@@ -67,8 +68,16 @@ notification = (data) => {
`).appendTo(`#root`);
setTimeout(() => {
notification.fadeOut(700);
}, data.length);
document.getElementById(id).classList.remove("fadeIn");
}, 300);
setTimeout(() => {
document.getElementById(id).classList.add("fadeOut");
setTimeout(() => {
document.getElementById(id).remove();
}, 400);
},data.length);
return notification;
};
+5 -4
View File
@@ -28,7 +28,7 @@
min-width: 15%;
width: fit-content;
height: 45px;
background-color: rgba(5, 5, 5, 0.8);
background-color: rgba(15, 15, 15, 0.9);
border-radius: 5px;
animation: growDown 300ms ease-in-out;
padding-right: 10px;
@@ -41,8 +41,8 @@
right: 0;
height: 2px;
width: 100%;
border-radius: 20px;
background: linear-gradient(to right, #0052d4, #4364f7, #6fb1fc); /* W3C, IE 10+/ Edge, Firefox 16+, Chrome 26+, Opera 12+, Safari 7+ */
border-radius: 15px;
background: linear-gradient(to right, #b84f05, #de7301, #fb9b04); /* W3C, IE 10+/ Edge, Firefox 16+, Chrome 26+, Opera 12+, Safari 7+ */
}
.icon {
@@ -61,7 +61,7 @@
p {
flex: auto;
word-wrap: break-word;
margin-left: 30px;
margin-left: 35px;
margin-top: 15px;
}
@@ -69,6 +69,7 @@
float: left;
margin-left: 5px;
font-size: 20px;
color: #fb9b04;
}
@keyframes growDown {
+3 -3
View File
@@ -1,13 +1,13 @@
const codes = {
"~r~": "red",
"~r~": "#c0392b",
"~b~": "#378cbf",
"~g~": "green",
"~g~": "#2ecc71",
"~y~": "yellow",
"~p~": "purple",
"~c~": "grey",
"~m~": "#212121",
"~u~": "black",
"~o~": "orange",
"~o~": "#fb9b04",
};
const elems = {
+7 -9
View File
@@ -38,6 +38,7 @@ end
function Menu:InsertElements()
local playerPed = PlayerPedId()
self.elements = {}
for i = 1, #self.components, 1 do
local value = self.components[i].value
local componentId = self.components[i].componentId
@@ -51,15 +52,12 @@ function Menu:InsertElements()
data.type = "slider"
data.max = self.maxValues[self.components[i].name]
if not self.elements then
self.elements = {}
end
self.elements[#self.elements + 1] = data
end
end
function Menu:Submit(data, menu)
Skin.last = exports["skinchanger"]:GetSkin()
Skin.Last = exports["skinchanger"]:GetSkin()
self.submitCb(data, menu)
Camera:Destroy()
end
@@ -67,7 +65,7 @@ end
function Menu:Cancel(data, menu)
menu.close()
Camera:Destroy()
TriggerEvent("skinchanger:loadSkin", Skin.last)
TriggerEvent("skinchanger:loadSkin", Skin.Last)
if self.cancelCb then
self.cancelCb(data, menu)
@@ -125,7 +123,7 @@ function Menu:Open(submit, cancel, restrict)
self.submitCb = submit
self.cancelCb = cancel
self.restricted = restrict
Skin.last = exports["skinchanger"]:GetSkin()
Skin.Last = exports["skinchanger"]:GetSkin()
self.components, self.maxValues = exports["skinchanger"]:GetData()
if restrict then
@@ -134,15 +132,15 @@ function Menu:Open(submit, cancel, restrict)
self:InsertElements()
self.zoomOffset = self.components[1].zoomOffset
self.camOffset = self.components[1].camOffset
Skin.zoomOffset = self.components[1].zoomOffset
Skin.camOffset = self.components[1].camOffset
Camera:Create()
self:ESXMenu()
end
function Menu:Saveable(submitCb, cancelCb, restrict)
Skin.last = exports["skinchanger"]:GetSkin()
Skin.Last = exports["skinchanger"]:GetSkin()
self:Open(function(data, menu)
menu.close()
+3
View File
@@ -1,4 +1,7 @@
RegisterNetEvent("esx_skin:save", function(skin)
if not skin or type(skin) ~= "table" then
return
end
local xPlayer = ESX.GetPlayerFromId(source)
if not ESX.GetConfig().CustomInventory then
+29 -7
View File
@@ -1,6 +1,6 @@
:root {
--color: white;
--bgColor: #212121;
--bgColor: rgba(15, 15, 15, 0.9);
}
* {
@@ -24,22 +24,32 @@ body {
min-width: 15%;
width: fit-content;
height: 50px;
background: rgba(5, 5, 5, 0.9);
background: rgba(15, 15, 15, 0.9);
border-radius: 0.5rem;
animation: growDown 300ms ease-in-out;
align-items: center;
}
.fadeIn {
animation: growUp 300ms ease-in-out;
}
.fadeOut {
animation: growDown 300ms ease-in-out;
}
.error {
border-left: 5px solid #c0392b;
border-left: 3px solid #c0392b;
border-right: 3px solid #c0392b;
}
.success {
border-left: 5px solid #2ecc71;
border-left: 3px solid #2ecc71;
border-right: 3px solid #2ecc71;
}
.info {
border-left: 5px solid #2980b9;
border-left: 3px solid #fb9b04;
border-right: 3px solid #fb9b04;
}
.innerText {
@@ -62,9 +72,21 @@ body {
@keyframes growDown {
0% {
transform: scaleY(1);
}
50% {
transform: scaleY(1.1);
}
100% {
transform: scaleY(0);
}
80% {
}
@keyframes growUp {
0% {
transform: scaleY(0);
}
50% {
transform: scaleY(1.1);
}
100% {
+18 -9
View File
@@ -1,6 +1,6 @@
const w = window;
const doc = document;
let lastType = "";
let lastType = {};
// Gets the current icon it needs to use.
const types = {
@@ -20,21 +20,21 @@ const types = {
// the color codes example `i ~r~love~s~ donuts`
const codes = {
"~r~": "red",
"~r~": "#c0392b",
"~b~": "#378cbf",
"~g~": "green",
"~g~": "#2ecc71",
"~y~": "yellow",
"~p~": "purple",
"~c~": "grey",
"~m~": "#212121",
"~u~": "black",
"~o~": "orange",
"~o~": "#fb9b04",
};
w.addEventListener("message", (event) => {
if (event.data.action === "show") {
if (lastType) {
doc.getElementById(lastType).style.display = "none";
if (lastType.id !== undefined) {
doc.getElementById(lastType["id"]).style.display = "none";
notification({
type: event.data.type,
message: event.data.message,
@@ -47,7 +47,12 @@ w.addEventListener("message", (event) => {
}
} else if (event.data.action === "hide") {
if (lastType !== "") {
doc.getElementById(lastType).style.display = "none";
doc.getElementById(lastType["id"]).classList.add("fadeOut");
setTimeout(() => {
doc.getElementById(lastType["id"]).classList.remove("fadeOut");
doc.getElementById(lastType["id"]).style.display = "none";
doc.getElementById(lastType["message"]).innerHTML = "";
}, 300);
} else {
console.log("There isn't a textUI displaying!?");
}
@@ -78,6 +83,10 @@ notification = (data) => {
}
doc.getElementById(types[data.type]["id"]).style.display = "block";
lastType = types[data.type]["id"];
doc.getElementById(types[data.type]["message"]).innerHTML = data["message"];
doc.getElementById(types[data.type]["id"]).classList.add("fadeIn");
setTimeout(() => {
doc.getElementById(types[data.type]["id"]).classList.remove("fadeIn");
lastType = types[data.type];
doc.getElementById(types[data.type]["message"]).innerHTML = data["message"];
}, 300);
};