mirror of
https://github.com/qbcore-fivem/qb-core.git
synced 2026-08-29 01:01:24 +00:00
Merge branch 'main' into ClientCallbacks
This commit is contained in:
@@ -0,0 +1,74 @@
|
||||
# Contributor Code of Conduct
|
||||
|
||||
## Our Pledge
|
||||
|
||||
In the interest of fostering an open and welcoming environment, we as
|
||||
contributors and maintainers pledge to making participation in our project and
|
||||
our community a harassment-free experience for everyone, regardless of age, body
|
||||
size, disability, ethnicity, gender identity and expression, level of experience,
|
||||
education, socio-economic status, nationality, personal appearance, race,
|
||||
religion, or sexual identity and orientation.
|
||||
|
||||
## Our Standards
|
||||
|
||||
Examples of behavior that contributes to creating a positive environment
|
||||
include:
|
||||
|
||||
* Using welcoming and inclusive language
|
||||
* Being respectful of differing viewpoints and experiences
|
||||
* Gracefully accepting constructive criticism
|
||||
* Focusing on what is best for the community
|
||||
* Showing empathy towards other community members
|
||||
|
||||
Examples of unacceptable behavior by participants include:
|
||||
|
||||
* The use of sexualized language or imagery and unwelcome sexual attention or
|
||||
advances
|
||||
* Trolling, insulting/derogatory comments, and personal or political attacks
|
||||
* Public or private harassment
|
||||
* Publishing others' private information, such as a physical or electronic
|
||||
address, without explicit permission
|
||||
* Other conduct which could reasonably be considered inappropriate in a
|
||||
professional setting
|
||||
|
||||
## Our Responsibilities
|
||||
|
||||
Project maintainers are responsible for clarifying the standards of acceptable
|
||||
behavior and are expected to take appropriate and fair corrective action in
|
||||
response to any instances of unacceptable behavior.
|
||||
|
||||
Project maintainers have the right and responsibility to remove, edit, or
|
||||
reject comments, commits, code, wiki edits, issues, and other contributions
|
||||
that are not aligned to this Code of Conduct, or to ban temporarily or
|
||||
permanently any contributor for other behaviors that they deem inappropriate,
|
||||
threatening, offensive, or harmful.
|
||||
|
||||
## Scope
|
||||
|
||||
This Code of Conduct applies both within project spaces and in public spaces
|
||||
when an individual is representing the project or its community. Examples of
|
||||
representing a project or community include using an official project e-mail
|
||||
address, posting via an official social media account, or acting as an appointed
|
||||
representative at an online or offline event. Representation of a project may be
|
||||
further defined and clarified by project maintainers.
|
||||
|
||||
## Enforcement
|
||||
|
||||
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
||||
reported by contacting the project team in the discord at https://discord.com/invite/qbcore. All
|
||||
complaints will be reviewed and investigated and will result in a response that
|
||||
is deemed necessary and appropriate to the circumstances. The project team is
|
||||
obligated to maintain confidentiality with regard to the reporter of an incident.
|
||||
Further details of specific enforcement policies may be posted separately.
|
||||
|
||||
Project maintainers who do not follow or enforce the Code of Conduct in good
|
||||
faith may face temporary or permanent repercussions as determined by other
|
||||
members of the project's leadership.
|
||||
|
||||
## Attribution
|
||||
|
||||
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
|
||||
available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
|
||||
|
||||
[homepage]: https://www.contributor-covenant.org
|
||||
|
||||
@@ -9,7 +9,7 @@ jobs:
|
||||
with:
|
||||
ref: ${{ github.event.pull_request.head.sha }}
|
||||
- name: Lint
|
||||
uses: iLLeniumStudios/fivem-lua-lint-action@v1.0.11
|
||||
uses: iLLeniumStudios/fivem-lua-lint-action@v2
|
||||
with:
|
||||
capture: "junit.xml"
|
||||
args: "-t --formatter JUnit"
|
||||
|
||||
@@ -1,19 +1,6 @@
|
||||
# qb-core
|
||||
|
||||
### [Official QBCore Documentation](https://qbcore-framework.github.io/qb-docs/)
|
||||
|
||||
|
||||
## QBCore is officially partnered with Sonoran Software!
|
||||
Sonoran Software offers:
|
||||
* [The most advanced, integrated CAD software](https://sonorancad.com/kakarot)
|
||||
* [Complete community management software](https://sonorancms.com/kakarot)
|
||||
* [In-depth radio communications simulator](https://sonoranradio.com/kakarot)
|
||||
* [Premium server hosting](https://sonoranservers.com/kakarot)
|
||||
|
||||
Use code `KAKAROT` for 20% off your first month at checkout!
|
||||
|
||||
# Sonoran Software
|
||||

|
||||
### [Official QBCore Documentation](https://docs.qbcore.org)
|
||||
|
||||
# License
|
||||
|
||||
|
||||
+2
-2
@@ -5,7 +5,7 @@ local function hideText()
|
||||
end
|
||||
|
||||
local function drawText(text, position)
|
||||
if not type(position) == "string" then position = "left" end
|
||||
if type(position) ~= "string" then position = "left" end
|
||||
|
||||
SendNUIMessage({
|
||||
action = 'DRAW_TEXT',
|
||||
@@ -17,7 +17,7 @@ local function drawText(text, position)
|
||||
end
|
||||
|
||||
local function changeText(text, position)
|
||||
if not type(position) == "string" then position = "left" end
|
||||
if type(position) ~= "string" then position = "left" end
|
||||
|
||||
SendNUIMessage({
|
||||
action = 'CHANGE_TEXT',
|
||||
|
||||
+3
-2
@@ -127,13 +127,14 @@ RegisterNetEvent('QBCore:Command:SpawnVehicle', function(vehName)
|
||||
Wait(0)
|
||||
end
|
||||
|
||||
if IsPedInAnyVehicle(ped) then
|
||||
if IsPedInAnyVehicle(ped) then
|
||||
DeleteVehicle(veh)
|
||||
end
|
||||
|
||||
local vehicle = CreateVehicle(hash, GetEntityCoords(ped), GetEntityHeading(ped), true, false)
|
||||
TaskWarpPedIntoVehicle(ped, vehicle, -1)
|
||||
SetVehicleFuelLevel(vehicle, 100.0)
|
||||
SetVehicleDirtLevel(vehicle, 0.0)
|
||||
SetModelAsNoLongerNeeded(hash)
|
||||
TriggerEvent("vehiclekeys:client:SetOwner", QBCore.Functions.GetPlate(vehicle))
|
||||
end)
|
||||
@@ -147,7 +148,7 @@ RegisterNetEvent('QBCore:Command:DeleteVehicle', function()
|
||||
else
|
||||
local pcoords = GetEntityCoords(ped)
|
||||
local vehicles = GetGamePool('CVehicle')
|
||||
for k, v in pairs(vehicles) do
|
||||
for _, v in pairs(vehicles) do
|
||||
if #(pcoords - GetEntityCoords(v)) <= 5.0 then
|
||||
SetEntityAsMissionEntity(v, true, true)
|
||||
DeleteVehicle(v)
|
||||
|
||||
@@ -201,7 +201,7 @@ function QBCore.Functions.GetClosestPed(coords, ignoreList)
|
||||
else
|
||||
coords = GetEntityCoords(ped)
|
||||
end
|
||||
local ignoreList = ignoreList or {}
|
||||
ignoreList = ignoreList or {}
|
||||
local peds = QBCore.Functions.GetPeds(ignoreList)
|
||||
local closestDistance = -1
|
||||
local closestPed = -1
|
||||
@@ -422,12 +422,12 @@ function QBCore.Functions.GetVehicleProperties(vehicle)
|
||||
|
||||
local colorPrimary, colorSecondary = GetVehicleColours(vehicle)
|
||||
if GetIsVehiclePrimaryColourCustom(vehicle) then
|
||||
r, g, b = GetVehicleCustomPrimaryColour(vehicle)
|
||||
local r, g, b = GetVehicleCustomPrimaryColour(vehicle)
|
||||
colorPrimary = {r, g, b}
|
||||
end
|
||||
|
||||
if GetIsVehicleSecondaryColourCustom(vehicle) then
|
||||
r, g, b = GetVehicleCustomSecondaryColour(vehicle)
|
||||
local r, g, b = GetVehicleCustomSecondaryColour(vehicle)
|
||||
colorSecondary = {r, g, b}
|
||||
end
|
||||
|
||||
|
||||
+1
-1
@@ -12,7 +12,7 @@ end)
|
||||
CreateThread(function()
|
||||
while true do
|
||||
if LocalPlayer.state.isLoggedIn then
|
||||
if (QBCore.PlayerData.metadata['hunger'] <= 0 or QBCore.PlayerData.metadata['thirst'] <= 0) and not QBCore.PlayerData.metadata['isdead'] then
|
||||
if (QBCore.PlayerData.metadata['hunger'] <= 0 or QBCore.PlayerData.metadata['thirst'] <= 0) and not QBCore.PlayerData.metadata['isdead'] then
|
||||
local ped = PlayerPedId()
|
||||
local currentHealth = GetEntityHealth(ped)
|
||||
local decreaseTreshold = math.random(5, 10)
|
||||
|
||||
+1
-1
@@ -11,4 +11,4 @@ end)
|
||||
|
||||
-- To use this export in a script instead of manifest method
|
||||
-- Just put this line of code below at the very top of the script
|
||||
-- local QBCore = exports['qb-core']:GetCoreObject()
|
||||
-- local QBCore = exports['qb-core']:GetCoreObject()
|
||||
|
||||
+1
-1
@@ -9,7 +9,7 @@ QBConfig.Money = {}
|
||||
QBConfig.Money.MoneyTypes = {['cash'] = 500, ['bank'] = 5000, ['crypto'] = 0} -- ['type'] = startamount - Add or remove money types for your server (for ex. ['blackmoney'] = 0), remember once added it will not be removed from the database!
|
||||
QBConfig.Money.DontAllowMinus = {'cash', 'crypto'} -- Money that is not allowed going in minus
|
||||
QBConfig.Money.PayCheckTimeOut = 10 -- The time in minutes that it will give the paycheck
|
||||
QBConfig.Money.PayCheckSociety = false -- If true paycheck will come from the society account that the player is employed at, requires qb-bossmenu
|
||||
QBConfig.Money.PayCheckSociety = false -- If true paycheck will come from the society account that the player is employed at, requires qb-management
|
||||
|
||||
QBConfig.Player = {}
|
||||
QBConfig.Player.MaxWeight = 120000 -- Max weight a player can carry (currently 120kg, written in grams)
|
||||
|
||||
@@ -25,6 +25,20 @@
|
||||
box-shadow: 0rem 0rem 0.1rem 0.05rem #000000;
|
||||
}
|
||||
|
||||
@media (width: 3840px) and (height: 2160px) {
|
||||
#drawtext-container {
|
||||
display: none;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
overflow: hidden;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
font-family: "Poppins", sans-serif !important;
|
||||
font-weight: 300;
|
||||
font-size: 1.5vh;
|
||||
}
|
||||
}
|
||||
|
||||
.text.pressed {
|
||||
background: var(--active-bg);
|
||||
}
|
||||
|
||||
@@ -2,6 +2,49 @@ html::-webkit-scrollbar {
|
||||
display: none;
|
||||
}
|
||||
|
||||
@media (width: 3840px) and (height: 2160px) {
|
||||
.success {
|
||||
background-color: rgba(23, 23, 23, 90%);
|
||||
border-radius: 10px;
|
||||
box-shadow: 0rem 0rem 0.1rem 0.05rem #000000;
|
||||
border-left: 0.5rem solid #20bb44;
|
||||
font-size: 1.5vh;
|
||||
}
|
||||
|
||||
.primary {
|
||||
background-color: rgba(23, 23, 23, 90%);
|
||||
border-radius: 10px;
|
||||
box-shadow: 0rem 0rem 0.1rem 0.05rem #000000;
|
||||
border-left: 5px solid #1c75d2;
|
||||
font-size: 1.5vh;
|
||||
}
|
||||
|
||||
.error {
|
||||
background-color: rgba(23, 23, 23, 90%);
|
||||
border-radius: 10px;
|
||||
box-shadow: 0rem 0rem 0.1rem 0.05rem #000000;
|
||||
border-left: 5px solid #c10114;
|
||||
font-size: 1.5vh;
|
||||
}
|
||||
|
||||
.police {
|
||||
background-color: rgba(23, 23, 23, 90%);
|
||||
border-radius: 10px;
|
||||
box-shadow: 0rem 0rem 0.1rem 0.05rem #000000;
|
||||
border-left: 5px solid #2197f2;
|
||||
font-size: 1.5vh;
|
||||
}
|
||||
|
||||
.ambulance {
|
||||
background-color: rgba(23, 23, 23, 90%);
|
||||
border-radius: 10px;
|
||||
box-shadow: 0rem 0rem 0.1rem 0.05rem #000000;
|
||||
border-left: 5px solid #f44236;
|
||||
font-size: 1.5vh;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
.success {
|
||||
background-color: rgba(23, 23, 23, 90%);
|
||||
border-radius: 10px;
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
local Translations = {
|
||||
error = {
|
||||
not_online = 'Играчът не е онлайн',
|
||||
wrong_format = 'Некоректен формат',
|
||||
missing_args = 'Не всички аргументи са въведени (x, y, z)',
|
||||
missing_args2 = 'Всички аргументи трябва да бъдат попълнени!',
|
||||
no_access = 'Нямате достъп до тази команда',
|
||||
company_too_poor = 'Работодателят ви е разорен',
|
||||
item_not_exist = 'Артикулът не съществува',
|
||||
too_heavy = 'Ивентарът е препълнен',
|
||||
duplicate_license = 'Намерен е дубликат на Rockstar лиценза',
|
||||
no_valid_license = 'Не е намерен валиден Rockstar лиценз',
|
||||
not_whitelisted = 'Вие не сте включени в белия списък за този сървър'
|
||||
},
|
||||
success = {},
|
||||
info = {
|
||||
received_paycheck = 'Получихте заплата от $%{value}',
|
||||
job_info = 'Работно място: %{value} | Чин: %{value2} | Служба: %{value3}',
|
||||
gang_info = 'Банда: %{value} | Чин: %{value2}',
|
||||
on_duty = 'Сега сте на служба!',
|
||||
off_duty = 'Вече не сте на служба!',
|
||||
checking_ban = 'Здравейте %s. Проверяваме дали сте баннат.',
|
||||
join_server = 'Добре дошли %s в {Server Name}.',
|
||||
checking_whitelisted = 'Здравейте %s. Проверяваме дали сте включени в белия списък.'
|
||||
}
|
||||
}
|
||||
|
||||
Lang = Locale:new({
|
||||
phrases = Translations,
|
||||
warnOnMissing = true
|
||||
})
|
||||
+13
-7
@@ -5,17 +5,23 @@ local Translations = {
|
||||
missing_args = '请输入必须参数 (x, y, z)',
|
||||
missing_args2 = '请输入所有参数!',
|
||||
no_access = '你没有权限',
|
||||
company_too_poor = '你的老板破产了',
|
||||
item_not_exist = '物品不存在',
|
||||
too_heavy = '背包已满'
|
||||
company_too_poor = '你所在的公司账户目前发不起工资',
|
||||
item_not_exist = '该物品不存在',
|
||||
too_heavy = '背包已满',
|
||||
duplicate_license = '发现重复的 Rockstar 许可证',
|
||||
no_valid_license = '未找到有效的 Rockstar 许可证',
|
||||
not_whitelisted = '您没有被列入此服务器的白名单'
|
||||
},
|
||||
success = {},
|
||||
info = {
|
||||
received_paycheck = '你收到了你的工资 $%{value}',
|
||||
job_info = '工作: %{value} | 级别: %{value2} | 责任: %{value3}',
|
||||
gang_info = '团队: %{value} | 级别: %{value2}',
|
||||
on_duty = '你开始工作了!',
|
||||
off_duty = '你现在下班了!'
|
||||
job_info = '工作: %{value} | 级别: %{value2} | 工作状态状态: %{value3}',
|
||||
gang_info = '帮派: %{value} | 级别: %{value2}',
|
||||
on_duty = '你开始上班了!',
|
||||
off_duty = '你现在下班了!',
|
||||
checking_ban = '你好 %s. 我们正在检查你是否被服务器封禁.',
|
||||
join_server = '欢迎 %s 进入 {Server Name}.',
|
||||
checking_whitelisted = '你好 %s. 我们正在检查您是否在白名单内.'
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
local Translations = {
|
||||
error = {
|
||||
not_online = 'Mängija pole serveris!',
|
||||
wrong_format = 'Vale formaat.',
|
||||
missing_args = 'Kõiki argumente pole sisestatud (x, y, z)',
|
||||
missing_args2 = 'Kõik argumendid tuleb täita!',
|
||||
no_access = 'Sellele käsule pole juurdepääsu!',
|
||||
company_too_poor = 'Teie tööandja on pankrotis.',
|
||||
item_not_exist = 'Sellist asja ei eksisteeri',
|
||||
too_heavy = 'Inventuur on liiga täis',
|
||||
duplicate_license = 'Leiti Rockstari litsentsi duplikaat',
|
||||
no_valid_license = 'Kehtivat Rockstari litsentsi ei leitud',
|
||||
not_whitelisted = 'Te\'pole serveri Allowlistis!'
|
||||
},
|
||||
success = {},
|
||||
info = {
|
||||
received_paycheck = 'Saite oma töötasu kätte $%{value}',
|
||||
job_info = 'Töökoht: %{value} | Auaste: %{value2} | Tööl: %{value3}',
|
||||
gang_info = 'Gang: %{value} | Auaste: %{value2}',
|
||||
on_duty = 'Alustasite enda tööpäeva!',
|
||||
off_duty = 'Lõpetasite enda tööpäeva!',
|
||||
checking_ban = 'Tere %s. Me kontrollime, kas olete keelustatud.',
|
||||
join_server = 'Tere tulemast %s serverisse {Server Name}.',
|
||||
checking_whitelisted = 'Tere %s. Kontrollime teie Allowlisti olemasolu.'
|
||||
}
|
||||
}
|
||||
|
||||
Lang = Locale:new({
|
||||
phrases = Translations,
|
||||
warnOnMissing = true
|
||||
})
|
||||
+20
-14
@@ -1,25 +1,31 @@
|
||||
local Translations = {
|
||||
error = {
|
||||
not_online = 'El jugador no está conectado!',
|
||||
wrong_format = 'Formato incorrecto!',
|
||||
missing_args = 'No todos los argumentos estan presente! (x, y, z)',
|
||||
missing_args2 = 'Todos los argumentos tienen que estar presente!',
|
||||
no_access = 'No tienes acceso a este comando!',
|
||||
company_too_poor = 'Tu empresa está en bancarrota. No hay dinero suficiente.',
|
||||
item_not_exist = 'El objeto no existe en el sistema.',
|
||||
too_heavy = 'Tienes el inventario muy lleno.'
|
||||
not_online = 'El jugador no está en línea',
|
||||
wrong_format = 'Formato incorrecto',
|
||||
missing_args = 'No se han ingresado todos los argumentos (x, y, z)',
|
||||
missing_args2 = '¡Todos los argumentos deben estar presentes!',
|
||||
no_access = 'No tienes acceso a este comando',
|
||||
company_too_poor = 'Tu empleador está en bancarrota',
|
||||
item_not_exist = 'El objeto no existe',
|
||||
too_heavy = 'Inventario muy lleno',
|
||||
duplicate_license = 'Tu licencia de Rockstar está duplicada',
|
||||
no_valid_license = 'No tienes licencia de Rockstar válida',
|
||||
not_whitelisted = 'No estás en la lista blanca de este servidor'
|
||||
},
|
||||
success = {},
|
||||
info = {
|
||||
received_paycheck = 'Has recibido tu pago de $%{value}',
|
||||
job_info = 'Trabajo: %{value} | Grado: %{value2} | Estado: %{value3}',
|
||||
gang_info = 'Pandilla: %{value} | Grado: %{value2}',
|
||||
on_duty = 'Ahora estás en servicio!',
|
||||
off_duty = 'Ahora estás fuera de servicio!'
|
||||
received_paycheck = 'Has recibido tu salario de $%{value}',
|
||||
job_info = 'Trabajo: %{value} | Puesto: %{value2} | Estado: %{value3}',
|
||||
gang_info = 'Pandilla: %{value} | Puesto: %{value2}',
|
||||
on_duty = '¡Estás en servicio!',
|
||||
off_duty = '¡Estás fuera de servicio!',
|
||||
checking_ban = 'Hola %s. Estámos revisando si has sido baneado.',
|
||||
join_server = 'Bienvenido %s a {Server Name}.',
|
||||
checking_whitelisted = 'Hola %s. Estámos revisando si estás en nuestra lista blanca.'
|
||||
}
|
||||
}
|
||||
|
||||
Lang = Locale:new({
|
||||
phrases = Translations,
|
||||
warnOnMissing = true
|
||||
})
|
||||
})
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
local Translations = {
|
||||
error = {
|
||||
not_online = 'Mängija pole serveris',
|
||||
wrong_format = 'Vale vorming',
|
||||
missing_args = 'Kõiki argumente pole sisestatud (x, y, z)',
|
||||
missing_args2 = 'Kõik argumendid tuleb täita!',
|
||||
no_access = 'Sellele käsule pole juurdepääsu',
|
||||
company_too_poor = 'Teie tööandja on võlgades',
|
||||
item_not_exist = 'Asi ei eksisteeri',
|
||||
too_heavy = 'Inventuur on liiga täis',
|
||||
duplicate_license = 'Leiti Rockstari litsentsi duplikaat',
|
||||
no_valid_license = 'Kehtivat Rockstari litsentsi ei leitud',
|
||||
not_whitelisted = 'Te ei ole selle serveri jaoks Allowlisted'
|
||||
},
|
||||
success = {},
|
||||
info = {
|
||||
received_paycheck = 'Saite oma palga $%{value}',
|
||||
job_info = 'Töö: %{value} | Auaste: %{value2} | Tööpostil: %{value3}',
|
||||
gang_info = 'Gang: %{value} | Auaste: %{value2}',
|
||||
on_duty = 'Sa oled tööle kirjutatud!',
|
||||
off_duty = 'Sa kirjutasid ennast töölt vabaks!',
|
||||
checking_ban = 'Tere %s. Me kontrollime, kas olete keelustatud.',
|
||||
join_server = 'Tere tulemast %s serverisse {Server Name}.',
|
||||
checking_whitelisted = 'Tere %s. Kontrollime teie Allowlisti staatust.'
|
||||
}
|
||||
}
|
||||
|
||||
Lang = Locale:new({
|
||||
phrases = Translations,
|
||||
warnOnMissing = true
|
||||
})
|
||||
+1
-1
@@ -29,4 +29,4 @@ local Translations = {
|
||||
Lang = Locale:new({
|
||||
phrases = Translations,
|
||||
warnOnMissing = true
|
||||
})
|
||||
})
|
||||
|
||||
+8
-2
@@ -7,7 +7,10 @@ local Translations = {
|
||||
no_access = 'Geen toegang tot dit commando',
|
||||
company_too_poor = 'Je werkgever is arm',
|
||||
item_not_exist = 'Item bestaat niet',
|
||||
too_heavy = 'Inventaris is te vol'
|
||||
too_heavy = 'Inventaris is te vol',
|
||||
duplicate_license = 'Dubbele Rockstar-licentie gevonden',
|
||||
no_valid_license = 'Geen geldige Rockstar-licentie gevonden',
|
||||
not_whitelisted = 'Je staat niet op de whitelist voor deze server'
|
||||
},
|
||||
success = {},
|
||||
info = {
|
||||
@@ -15,7 +18,10 @@ local Translations = {
|
||||
job_info = 'Baan: %{value} | Rang: %{value2} | In dienst: %{value3}',
|
||||
gang_info = 'Gang: %{value} | Rang: %{value2}',
|
||||
on_duty = 'Je bent nu in dienst!',
|
||||
off_duty = 'Je bent nu uit dienst!'
|
||||
off_duty = 'Je bent nu uit dienst!',
|
||||
checking_ban = 'Hallo %s. We controleren of je verbannen bent.',
|
||||
join_server = 'Welkom %s bij {Server Name}.',
|
||||
checking_whitelisted = 'Hallo %s. We controleren of je op de whitelist staat.'
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
local Translations = {
|
||||
error = {
|
||||
not_online = 'O jogador não está online',
|
||||
wrong_format = 'Formato inválido',
|
||||
missing_args = 'Nem todos os argumentos foram inseridos (x, y, z)',
|
||||
missing_args2 = 'Todos os argumentos devem ser preenchidos!',
|
||||
no_access = 'Sem acesso a este comando',
|
||||
company_too_poor = 'Sua compania está quebrada',
|
||||
item_not_exist = 'O item não existe',
|
||||
too_heavy = 'Inventário cheio',
|
||||
duplicate_license = 'Licença duplicada da Rockstar encontrada',
|
||||
no_valid_license = 'Nenhuma licença válida da Rockstar encontrada',
|
||||
not_whitelisted = 'Você não tem whitelist neste servidor'
|
||||
},
|
||||
success = {},
|
||||
info = {
|
||||
received_paycheck = 'Você recebeu seu salário de %{value}€',
|
||||
job_info = 'Emprego: %{value} | Grau: %{value2} | Serviço: %{value3}',
|
||||
gang_info = 'Gang: %{value} | Grau: %{value2}',
|
||||
on_duty = 'Você agora está de plantão!',
|
||||
off_duty = 'Você agora está de folga!',
|
||||
checking_ban = 'Olá %s. Estamos verificando se você foi banido.',
|
||||
join_server = 'Bem-vindo %s a {Server Name}.',
|
||||
checking_whitelisted = 'Olá %s. Estamos verificando sua whitelist.'
|
||||
}
|
||||
}
|
||||
|
||||
Lang = Locale:new({
|
||||
phrases = Translations,
|
||||
warnOnMissing = true
|
||||
})
|
||||
+3
-3
@@ -6,7 +6,7 @@ QBCore.Commands.IgnoreList = { -- Ignore old perm levels while keeping backwards
|
||||
}
|
||||
|
||||
CreateThread(function() -- Add ace to node for perm checking
|
||||
for k,v in pairs(QBConfig.Server.Permissions) do
|
||||
for _, v in pairs(QBConfig.Server.Permissions) do
|
||||
ExecuteCommand(('add_ace qbcore.%s %s allow'):format(v, v))
|
||||
end
|
||||
end)
|
||||
@@ -208,7 +208,7 @@ end, 'admin')
|
||||
-- Inventory (should be in qb-inventory?)
|
||||
|
||||
QBCore.Commands.Add('clearinv', 'Clear Players Inventory (Admin Only)', { { name = 'id', help = 'Player ID' } }, false, function(source, args)
|
||||
local playerId = args[1] and args[1] ~= '' or source
|
||||
local playerId = args[1] ~= '' and args[1] or source
|
||||
local Player = QBCore.Functions.GetPlayer(tonumber(playerId))
|
||||
if Player then
|
||||
Player.Functions.ClearInventory()
|
||||
@@ -224,7 +224,7 @@ QBCore.Commands.Add('ooc', 'OOC Chat Message', {}, false, function(source, args)
|
||||
local Players = QBCore.Functions.GetPlayers()
|
||||
local Player = QBCore.Functions.GetPlayer(source)
|
||||
local playerCoords = GetEntityCoords(GetPlayerPed(source))
|
||||
for k, v in pairs(Players) do
|
||||
for _, v in pairs(Players) do
|
||||
if v == source then
|
||||
TriggerClientEvent('chat:addMessage', v, {
|
||||
color = { 0, 0, 255},
|
||||
|
||||
+1
-1
@@ -42,4 +42,4 @@ end
|
||||
|
||||
function QBCore.ShowSuccess(resource, msg)
|
||||
print('\x1b[32m['..resource..':LOG]\x1b[0m '..msg)
|
||||
end
|
||||
end
|
||||
|
||||
+30
-50
@@ -1,17 +1,17 @@
|
||||
-- Event Handler
|
||||
|
||||
AddEventHandler('chatMessage', function(source, _, message)
|
||||
AddEventHandler('chatMessage', function(_, _, message)
|
||||
if string.sub(message, 1, 1) == '/' then
|
||||
CancelEvent()
|
||||
return
|
||||
end
|
||||
end)
|
||||
|
||||
AddEventHandler('playerDropped', function()
|
||||
AddEventHandler('playerDropped', function(reason)
|
||||
local src = source
|
||||
if not QBCore.Players[src] then return end
|
||||
local Player = QBCore.Players[src]
|
||||
TriggerEvent('qb-log:server:CreateLog', 'joinleave', 'Dropped', 'red', '**' .. GetPlayerName(src) .. '** (' .. Player.PlayerData.license .. ') left..')
|
||||
TriggerEvent('qb-log:server:CreateLog', 'joinleave', 'Dropped', 'red', '**' .. GetPlayerName(src) .. '** (' .. Player.PlayerData.license .. ') left..' ..'\n **Reason:** ' .. reason)
|
||||
Player.Functions.Save()
|
||||
QBCore.Player_Buckets[Player.PlayerData.license] = nil
|
||||
QBCore.Players[src] = nil
|
||||
@@ -144,14 +144,13 @@ end)
|
||||
RegisterNetEvent('QBCore:Server:SetMetaData', function(meta, data)
|
||||
local src = source
|
||||
local Player = QBCore.Functions.GetPlayer(src)
|
||||
if not Player then return end
|
||||
if meta == 'hunger' or meta == 'thirst' then
|
||||
if data > 100 then
|
||||
data = 100
|
||||
end
|
||||
end
|
||||
if Player then
|
||||
Player.Functions.SetMetaData(meta, data)
|
||||
end
|
||||
Player.Functions.SetMetaData(meta, data)
|
||||
TriggerClientEvent('hud:client:UpdateNeeds', src, Player.PlayerData.metadata['hunger'], Player.PlayerData.metadata['thirst'])
|
||||
end)
|
||||
|
||||
@@ -214,54 +213,35 @@ end)
|
||||
|
||||
QBCore.Functions.CreateCallback('QBCore:HasItem', function(source, cb, items, amount)
|
||||
local retval = false
|
||||
if items == nil then return cb(true) end
|
||||
local Player = QBCore.Functions.GetPlayer(source)
|
||||
if not Player then return cb(false) end
|
||||
if type(items) == 'table' then
|
||||
local count = 0
|
||||
local finalcount = 0
|
||||
for k, v in pairs(items) do
|
||||
if type(k) == 'string' then
|
||||
finalcount = 0
|
||||
for i, _ in pairs(items) do finalcount += 1 end
|
||||
local item = Player.Functions.GetItemByName(k)
|
||||
if item then
|
||||
if item.amount >= v then
|
||||
count += 1
|
||||
if count == finalcount then
|
||||
retval = true
|
||||
end
|
||||
end
|
||||
end
|
||||
else
|
||||
finalcount = #items
|
||||
local item = Player.Functions.GetItemByName(v)
|
||||
if item then
|
||||
if amount then
|
||||
if item.amount >= amount then
|
||||
count += 1
|
||||
if count == finalcount then
|
||||
retval = true
|
||||
end
|
||||
end
|
||||
else
|
||||
count += 1
|
||||
if count == finalcount then
|
||||
retval = true
|
||||
end
|
||||
end
|
||||
end
|
||||
local isTable = type(items) == 'table'
|
||||
local isArray = isTable and table.type(items) == 'array' or false
|
||||
local totalItems = #items
|
||||
local count = 0
|
||||
local kvIndex = 2
|
||||
if isTable and not isArray then
|
||||
totalItems = 0
|
||||
for _ in pairs(items) do totalItems += 1 end
|
||||
kvIndex = 1
|
||||
end
|
||||
if isTable then
|
||||
for k, v in pairs(items) do
|
||||
local itemKV = {k, v}
|
||||
local item = Player.Functions.GetItemByName(itemKV[kvIndex])
|
||||
if item and ((amount and item.amount >= amount) or (not amount and not isArray and item.amount >= v) or (not amount and isArray)) then
|
||||
count += 1
|
||||
end
|
||||
end
|
||||
else
|
||||
local item = Player.Functions.GetItemByName(items)
|
||||
if not item then return cb(false) end
|
||||
if amount then
|
||||
if item.amount >= amount then
|
||||
retval = true
|
||||
end
|
||||
else
|
||||
end
|
||||
if count == totalItems then
|
||||
retval = true
|
||||
end
|
||||
else -- Single item as string
|
||||
local item = Player.Functions.GetItemByName(items)
|
||||
if item and not amount or (amount and item.amount >= amount) then
|
||||
retval = true
|
||||
end
|
||||
end
|
||||
end
|
||||
cb(retval)
|
||||
end)
|
||||
|
||||
@@ -65,6 +65,22 @@ end
|
||||
QBCore.Functions.AddItem = AddItem
|
||||
exports('AddItem', AddItem)
|
||||
|
||||
-- Single update item
|
||||
local function UpdateItem(itemName, item)
|
||||
if type(itemName) ~= "string" then
|
||||
return false, "invalid_item_name"
|
||||
end
|
||||
if not QBCore.Shared.Items[itemName] then
|
||||
return false, "item_not_exists"
|
||||
end
|
||||
QBCore.Shared.Items[itemName] = item
|
||||
TriggerClientEvent('QBCore:Client:OnSharedUpdate', -1, 'Items', itemName, item)
|
||||
TriggerEvent('QBCore:Server:UpdateObject')
|
||||
return true, "success"
|
||||
end
|
||||
QBCore.Functions.UpdateItem = UpdateItem
|
||||
exports('UpdateItem', UpdateItem)
|
||||
|
||||
-- Multiple Add Items
|
||||
local function AddItems(items)
|
||||
local shouldContinue = true
|
||||
@@ -152,3 +168,19 @@ local function GetCoreVersion(InvokingResource)
|
||||
end
|
||||
QBCore.Functions.GetCoreVersion = GetCoreVersion
|
||||
exports('GetCoreVersion', GetCoreVersion)
|
||||
|
||||
local function ExploitBan(playerId, origin)
|
||||
local name = GetPlayerName(playerId)
|
||||
MySQL.insert('INSERT INTO bans (name, license, discord, ip, reason, expire, bannedby) VALUES (?, ?, ?, ?, ?, ?, ?)', {
|
||||
name,
|
||||
QBCore.Functions.GetIdentifier(playerId, 'license'),
|
||||
QBCore.Functions.GetIdentifier(playerId, 'discord'),
|
||||
QBCore.Functions.GetIdentifier(playerId, 'ip'),
|
||||
origin,
|
||||
2147483647,
|
||||
'Anti Cheat'
|
||||
})
|
||||
DropPlayer(playerId, "You have been banned for cheating. Check our Discord for more information: " .. QBCore.Config.Server.Discord)
|
||||
TriggerEvent("qb-log:server:CreateLog", "anticheat", "Anti-Cheat", "red", name.." has been banned for exploiting "..origin, true)
|
||||
end
|
||||
exports('ExploitBan', ExploitBan)
|
||||
|
||||
@@ -63,7 +63,7 @@ end
|
||||
|
||||
function QBCore.Functions.GetPlayers()
|
||||
local sources = {}
|
||||
for k, v in pairs(QBCore.Players) do
|
||||
for k, _ in pairs(QBCore.Players) do
|
||||
sources[#sources+1] = k
|
||||
end
|
||||
return sources
|
||||
@@ -137,7 +137,7 @@ end
|
||||
function QBCore.Functions.GetPlayersInBucket(bucket --[[ int ]])
|
||||
local curr_bucket_pool = {}
|
||||
if QBCore.Player_Buckets and next(QBCore.Player_Buckets) then
|
||||
for k, v in pairs(QBCore.Player_Buckets) do
|
||||
for _, v in pairs(QBCore.Player_Buckets) do
|
||||
if v.bucket == bucket then
|
||||
curr_bucket_pool[#curr_bucket_pool + 1] = v.id
|
||||
end
|
||||
@@ -152,7 +152,7 @@ end
|
||||
function QBCore.Functions.GetEntitiesInBucket(bucket --[[ int ]])
|
||||
local curr_bucket_pool = {}
|
||||
if QBCore.Entity_Buckets and next(QBCore.Entity_Buckets) then
|
||||
for k, v in pairs(QBCore.Entity_Buckets) do
|
||||
for _, v in pairs(QBCore.Entity_Buckets) do
|
||||
if v.bucket == bucket then
|
||||
curr_bucket_pool[#curr_bucket_pool + 1] = v.id
|
||||
end
|
||||
@@ -243,7 +243,7 @@ function QBCore.Functions.Kick(source, reason, setKickReason, deferrals)
|
||||
if source then
|
||||
DropPlayer(source, reason)
|
||||
end
|
||||
for i = 0, 4 do
|
||||
for _ = 0, 4 do
|
||||
while true do
|
||||
if source then
|
||||
if GetPlayerPing(source) >= 0 then
|
||||
@@ -286,7 +286,7 @@ function QBCore.Functions.RemovePermission(source, permission)
|
||||
QBCore.Commands.Refresh(src)
|
||||
end
|
||||
else
|
||||
for k,v in pairs(QBCore.Config.Server.Permissions) do
|
||||
for _, v in pairs(QBCore.Config.Server.Permissions) do
|
||||
if IsPlayerAceAllowed(src, v) then
|
||||
ExecuteCommand(('remove_principal identifier.%s qbcore.%s'):format(license, v))
|
||||
QBCore.Commands.Refresh(src)
|
||||
@@ -306,7 +306,7 @@ end
|
||||
function QBCore.Functions.GetPermission(source)
|
||||
local src = source
|
||||
local perms = {}
|
||||
for k,v in pairs (QBCore.Config.Server.Permissions) do
|
||||
for _, v in pairs (QBCore.Config.Server.Permissions) do
|
||||
if IsPlayerAceAllowed(src, v) then
|
||||
perms[v] = true
|
||||
end
|
||||
@@ -335,13 +335,13 @@ end
|
||||
|
||||
function QBCore.Functions.IsPlayerBanned(source)
|
||||
local plicense = QBCore.Functions.GetIdentifier(source, 'license')
|
||||
local result = MySQL.Sync.fetchSingle('SELECT * FROM bans WHERE license = ?', { plicense })
|
||||
local result = MySQL.single.await('SELECT * FROM bans WHERE license = ?', { plicense })
|
||||
if not result then return false end
|
||||
if os.time() < result.expire then
|
||||
local timeTable = os.date('*t', tonumber(result.expire))
|
||||
return true, 'You have been banned from the server:\n' .. result.reason .. '\nYour ban expires ' .. timeTable.day .. '/' .. timeTable.month .. '/' .. timeTable.year .. ' ' .. timeTable.hour .. ':' .. timeTable.min .. '\n'
|
||||
else
|
||||
MySQL.Async.execute('DELETE FROM bans WHERE id = ?', { result.id })
|
||||
MySQL.query('DELETE FROM bans WHERE id = ?', { result.id })
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
+1
-1
@@ -11,4 +11,4 @@ end)
|
||||
|
||||
-- To use this export in a script instead of manifest method
|
||||
-- Just put this line of code below at the very top of the script
|
||||
-- local QBCore = exports['qb-core']:GetCoreObject()
|
||||
-- local QBCore = exports['qb-core']:GetCoreObject()
|
||||
|
||||
+30
-28
@@ -9,7 +9,7 @@ function QBCore.Player.Login(source, citizenid, newData)
|
||||
if source and source ~= '' then
|
||||
if citizenid then
|
||||
local license = QBCore.Functions.GetIdentifier(source, 'license')
|
||||
local PlayerData = MySQL.Sync.prepare('SELECT * FROM players where citizenid = ?', { citizenid })
|
||||
local PlayerData = MySQL.prepare.await('SELECT * FROM players where citizenid = ?', { citizenid })
|
||||
if PlayerData and license == PlayerData.license then
|
||||
PlayerData.money = json.decode(PlayerData.money)
|
||||
PlayerData.job = json.decode(PlayerData.job)
|
||||
@@ -56,7 +56,7 @@ function QBCore.Player.CheckPlayerData(source, PlayerData)
|
||||
PlayerData.charinfo.gender = PlayerData.charinfo.gender or 0
|
||||
PlayerData.charinfo.backstory = PlayerData.charinfo.backstory or 'placeholder backstory'
|
||||
PlayerData.charinfo.nationality = PlayerData.charinfo.nationality or 'USA'
|
||||
PlayerData.charinfo.phone = PlayerData.charinfo.phone or QBCore.Functions.CreatePhoneNumber()
|
||||
PlayerData.charinfo.phone = tonumber(PlayerData.charinfo.phone) or QBCore.Functions.CreatePhoneNumber()
|
||||
PlayerData.charinfo.account = PlayerData.charinfo.account or QBCore.Functions.CreateAccountNumber()
|
||||
-- Metadata
|
||||
PlayerData.metadata = PlayerData.metadata or {}
|
||||
@@ -113,6 +113,7 @@ function QBCore.Player.CheckPlayerData(source, PlayerData)
|
||||
PlayerData.job.name = PlayerData.job.name or 'unemployed'
|
||||
PlayerData.job.label = PlayerData.job.label or 'Civilian'
|
||||
PlayerData.job.payment = PlayerData.job.payment or 10
|
||||
PlayerData.job.type = PlayerData.job.type or 'none'
|
||||
if QBCore.Shared.ForceJobDefaultDutyAtLogin or PlayerData.job.onduty == nil then
|
||||
PlayerData.job.onduty = QBCore.Shared.Jobs[PlayerData.job.name].defaultDuty
|
||||
end
|
||||
@@ -167,6 +168,7 @@ function QBCore.Player.CreatePlayer(PlayerData)
|
||||
self.PlayerData.job.name = job
|
||||
self.PlayerData.job.label = QBCore.Shared.Jobs[job].label
|
||||
self.PlayerData.job.onduty = QBCore.Shared.Jobs[job].defaultDuty
|
||||
self.PlayerData.job.type = QBCore.Shared.Jobs[job].type or 'none'
|
||||
if QBCore.Shared.Jobs[job].grades[grade] then
|
||||
local jobgrade = QBCore.Shared.Jobs[job].grades[grade]
|
||||
self.PlayerData.job.grade = {}
|
||||
@@ -238,9 +240,9 @@ function QBCore.Player.CreatePlayer(PlayerData)
|
||||
self.PlayerData.money[moneytype] = self.PlayerData.money[moneytype] + amount
|
||||
self.Functions.UpdatePlayerData()
|
||||
if amount > 100000 then
|
||||
TriggerEvent('qb-log:server:CreateLog', 'playermoney', 'AddMoney', 'lightgreen', '**' .. GetPlayerName(self.PlayerData.source) .. ' (citizenid: ' .. self.PlayerData.citizenid .. ' | id: ' .. self.PlayerData.source .. ')** $' .. amount .. ' (' .. moneytype .. ') added, new ' .. moneytype .. ' balance: ' .. self.PlayerData.money[moneytype], true)
|
||||
TriggerEvent('qb-log:server:CreateLog', 'playermoney', 'AddMoney', 'lightgreen', '**' .. GetPlayerName(self.PlayerData.source) .. ' (citizenid: ' .. self.PlayerData.citizenid .. ' | id: ' .. self.PlayerData.source .. ')** $' .. amount .. ' (' .. moneytype .. ') added, new ' .. moneytype .. ' balance: ' .. self.PlayerData.money[moneytype] .. ' reason: ' .. reason, true)
|
||||
else
|
||||
TriggerEvent('qb-log:server:CreateLog', 'playermoney', 'AddMoney', 'lightgreen', '**' .. GetPlayerName(self.PlayerData.source) .. ' (citizenid: ' .. self.PlayerData.citizenid .. ' | id: ' .. self.PlayerData.source .. ')** $' .. amount .. ' (' .. moneytype .. ') added, new ' .. moneytype .. ' balance: ' .. self.PlayerData.money[moneytype])
|
||||
TriggerEvent('qb-log:server:CreateLog', 'playermoney', 'AddMoney', 'lightgreen', '**' .. GetPlayerName(self.PlayerData.source) .. ' (citizenid: ' .. self.PlayerData.citizenid .. ' | id: ' .. self.PlayerData.source .. ')** $' .. amount .. ' (' .. moneytype .. ') added, new ' .. moneytype .. ' balance: ' .. self.PlayerData.money[moneytype] .. ' reason: ' .. reason)
|
||||
end
|
||||
TriggerClientEvent('hud:client:OnMoneyChange', self.PlayerData.source, moneytype, amount, false)
|
||||
return true
|
||||
@@ -262,9 +264,9 @@ function QBCore.Player.CreatePlayer(PlayerData)
|
||||
self.PlayerData.money[moneytype] = self.PlayerData.money[moneytype] - amount
|
||||
self.Functions.UpdatePlayerData()
|
||||
if amount > 100000 then
|
||||
TriggerEvent('qb-log:server:CreateLog', 'playermoney', 'RemoveMoney', 'red', '**' .. GetPlayerName(self.PlayerData.source) .. ' (citizenid: ' .. self.PlayerData.citizenid .. ' | id: ' .. self.PlayerData.source .. ')** $' .. amount .. ' (' .. moneytype .. ') removed, new ' .. moneytype .. ' balance: ' .. self.PlayerData.money[moneytype], true)
|
||||
TriggerEvent('qb-log:server:CreateLog', 'playermoney', 'RemoveMoney', 'red', '**' .. GetPlayerName(self.PlayerData.source) .. ' (citizenid: ' .. self.PlayerData.citizenid .. ' | id: ' .. self.PlayerData.source .. ')** $' .. amount .. ' (' .. moneytype .. ') removed, new ' .. moneytype .. ' balance: ' .. self.PlayerData.money[moneytype] .. ' reason: ' .. reason, true)
|
||||
else
|
||||
TriggerEvent('qb-log:server:CreateLog', 'playermoney', 'RemoveMoney', 'red', '**' .. GetPlayerName(self.PlayerData.source) .. ' (citizenid: ' .. self.PlayerData.citizenid .. ' | id: ' .. self.PlayerData.source .. ')** $' .. amount .. ' (' .. moneytype .. ') removed, new ' .. moneytype .. ' balance: ' .. self.PlayerData.money[moneytype])
|
||||
TriggerEvent('qb-log:server:CreateLog', 'playermoney', 'RemoveMoney', 'red', '**' .. GetPlayerName(self.PlayerData.source) .. ' (citizenid: ' .. self.PlayerData.citizenid .. ' | id: ' .. self.PlayerData.source .. ')** $' .. amount .. ' (' .. moneytype .. ') removed, new ' .. moneytype .. ' balance: ' .. self.PlayerData.money[moneytype] .. ' reason: ' .. reason)
|
||||
end
|
||||
TriggerClientEvent('hud:client:OnMoneyChange', self.PlayerData.source, moneytype, amount, true)
|
||||
if moneytype == 'bank' then
|
||||
@@ -281,7 +283,7 @@ function QBCore.Player.CreatePlayer(PlayerData)
|
||||
if not self.PlayerData.money[moneytype] then return false end
|
||||
self.PlayerData.money[moneytype] = amount
|
||||
self.Functions.UpdatePlayerData()
|
||||
TriggerEvent('qb-log:server:CreateLog', 'playermoney', 'SetMoney', 'green', '**' .. GetPlayerName(self.PlayerData.source) .. ' (citizenid: ' .. self.PlayerData.citizenid .. ' | id: ' .. self.PlayerData.source .. ')** $' .. amount .. ' (' .. moneytype .. ') set, new ' .. moneytype .. ' balance: ' .. self.PlayerData.money[moneytype])
|
||||
TriggerEvent('qb-log:server:CreateLog', 'playermoney', 'SetMoney', 'green', '**' .. GetPlayerName(self.PlayerData.source) .. ' (citizenid: ' .. self.PlayerData.citizenid .. ' | id: ' .. self.PlayerData.source .. ')** $' .. amount .. ' (' .. moneytype .. ') set, new ' .. moneytype .. ' balance: ' .. self.PlayerData.money[moneytype] .. ' reason: ' .. reason)
|
||||
return true
|
||||
end
|
||||
|
||||
@@ -351,16 +353,16 @@ function QBCore.Player.CreatePlayer(PlayerData)
|
||||
local slots = QBCore.Player.GetSlotsByItem(self.PlayerData.items, item)
|
||||
local amountToRemove = amount
|
||||
if slots then
|
||||
for _, slot in pairs(slots) do
|
||||
if self.PlayerData.items[slot].amount > amountToRemove then
|
||||
self.PlayerData.items[slot].amount = self.PlayerData.items[slot].amount - amountToRemove
|
||||
for _, _slot in pairs(slots) do
|
||||
if self.PlayerData.items[_slot].amount > amountToRemove then
|
||||
self.PlayerData.items[_slot].amount = self.PlayerData.items[_slot].amount - amountToRemove
|
||||
self.Functions.UpdatePlayerData()
|
||||
TriggerEvent('qb-log:server:CreateLog', 'playerinventory', 'RemoveItem', 'red', '**' .. GetPlayerName(self.PlayerData.source) .. ' (citizenid: ' .. self.PlayerData.citizenid .. ' | id: ' .. self.PlayerData.source .. ')** lost item: [slot:' .. slot .. '], itemname: ' .. self.PlayerData.items[slot].name .. ', removed amount: ' .. amount .. ', new total amount: ' .. self.PlayerData.items[slot].amount)
|
||||
TriggerEvent('qb-log:server:CreateLog', 'playerinventory', 'RemoveItem', 'red', '**' .. GetPlayerName(self.PlayerData.source) .. ' (citizenid: ' .. self.PlayerData.citizenid .. ' | id: ' .. self.PlayerData.source .. ')** lost item: [slot:' .. _slot .. '], itemname: ' .. self.PlayerData.items[_slot].name .. ', removed amount: ' .. amount .. ', new total amount: ' .. self.PlayerData.items[_slot].amount)
|
||||
return true
|
||||
elseif self.PlayerData.items[slot].amount == amountToRemove then
|
||||
self.PlayerData.items[slot] = nil
|
||||
elseif self.PlayerData.items[_slot].amount == amountToRemove then
|
||||
self.PlayerData.items[_slot] = nil
|
||||
self.Functions.UpdatePlayerData()
|
||||
TriggerEvent('qb-log:server:CreateLog', 'playerinventory', 'RemoveItem', 'red', '**' .. GetPlayerName(self.PlayerData.source) .. ' (citizenid: ' .. self.PlayerData.citizenid .. ' | id: ' .. self.PlayerData.source .. ')** lost item: [slot:' .. slot .. '], itemname: ' .. item .. ', removed amount: ' .. amount .. ', item removed')
|
||||
TriggerEvent('qb-log:server:CreateLog', 'playerinventory', 'RemoveItem', 'red', '**' .. GetPlayerName(self.PlayerData.source) .. ' (citizenid: ' .. self.PlayerData.citizenid .. ' | id: ' .. self.PlayerData.source .. ')** lost item: [slot:' .. _slot .. '], itemname: ' .. item .. ', removed amount: ' .. amount .. ', item removed')
|
||||
return true
|
||||
end
|
||||
end
|
||||
@@ -445,7 +447,7 @@ function QBCore.Player.Save(source)
|
||||
local pcoords = GetEntityCoords(ped)
|
||||
local PlayerData = QBCore.Players[source].PlayerData
|
||||
if PlayerData then
|
||||
MySQL.Async.insert('INSERT INTO players (citizenid, cid, license, name, money, charinfo, job, gang, position, metadata) VALUES (:citizenid, :cid, :license, :name, :money, :charinfo, :job, :gang, :position, :metadata) ON DUPLICATE KEY UPDATE cid = :cid, name = :name, money = :money, charinfo = :charinfo, job = :job, gang = :gang, position = :position, metadata = :metadata', {
|
||||
MySQL.insert('INSERT INTO players (citizenid, cid, license, name, money, charinfo, job, gang, position, metadata) VALUES (:citizenid, :cid, :license, :name, :money, :charinfo, :job, :gang, :position, :metadata) ON DUPLICATE KEY UPDATE cid = :cid, name = :name, money = :money, charinfo = :charinfo, job = :job, gang = :gang, position = :position, metadata = :metadata', {
|
||||
citizenid = PlayerData.citizenid,
|
||||
cid = tonumber(PlayerData.cid),
|
||||
license = PlayerData.license,
|
||||
@@ -483,7 +485,7 @@ local playertables = { -- Add tables as needed
|
||||
|
||||
function QBCore.Player.DeleteCharacter(source, citizenid)
|
||||
local license = QBCore.Functions.GetIdentifier(source, 'license')
|
||||
local result = MySQL.Sync.fetchScalar('SELECT license FROM players where citizenid = ?', { citizenid })
|
||||
local result = MySQL.scalar.await('SELECT license FROM players where citizenid = ?', { citizenid })
|
||||
if license == result then
|
||||
local query = "DELETE FROM %s WHERE citizenid = ?"
|
||||
local tableCount = #playertables
|
||||
@@ -494,8 +496,8 @@ function QBCore.Player.DeleteCharacter(source, citizenid)
|
||||
queries[i] = {query = query:format(v.table), values = { citizenid }}
|
||||
end
|
||||
|
||||
MySQL.Async.transaction(queries, function(result)
|
||||
if result then
|
||||
MySQL.transaction(queries, function(result2)
|
||||
if result2 then
|
||||
TriggerEvent('qb-log:server:CreateLog', 'joinleave', 'Character Deleted', 'red', '**' .. GetPlayerName(source) .. '** ' .. license .. ' deleted **' .. citizenid .. '**..')
|
||||
end
|
||||
end)
|
||||
@@ -509,7 +511,7 @@ end
|
||||
|
||||
function QBCore.Player.LoadInventory(PlayerData)
|
||||
PlayerData.items = {}
|
||||
local inventory = MySQL.Sync.prepare('SELECT inventory FROM players WHERE citizenid = ?', { PlayerData.citizenid })
|
||||
local inventory = MySQL.prepare.await('SELECT inventory FROM players WHERE citizenid = ?', { PlayerData.citizenid })
|
||||
local missingItems = {}
|
||||
if inventory then
|
||||
inventory = json.decode(inventory)
|
||||
@@ -565,9 +567,9 @@ function QBCore.Player.SaveInventory(source)
|
||||
}
|
||||
end
|
||||
end
|
||||
MySQL.Async.prepare('UPDATE players SET inventory = ? WHERE citizenid = ?', { json.encode(ItemsJson), PlayerData.citizenid })
|
||||
MySQL.prepare('UPDATE players SET inventory = ? WHERE citizenid = ?', { json.encode(ItemsJson), PlayerData.citizenid })
|
||||
else
|
||||
MySQL.Async.prepare('UPDATE players SET inventory = ? WHERE citizenid = ?', { '[]', PlayerData.citizenid })
|
||||
MySQL.prepare('UPDATE players SET inventory = ? WHERE citizenid = ?', { '[]', PlayerData.citizenid })
|
||||
end
|
||||
end
|
||||
|
||||
@@ -608,7 +610,7 @@ function QBCore.Player.CreateCitizenId()
|
||||
local CitizenId = nil
|
||||
while not UniqueFound do
|
||||
CitizenId = tostring(QBCore.Shared.RandomStr(3) .. QBCore.Shared.RandomInt(5)):upper()
|
||||
local result = MySQL.Sync.prepare('SELECT COUNT(*) as count FROM players WHERE citizenid = ?', { CitizenId })
|
||||
local result = MySQL.prepare.await('SELECT COUNT(*) as count FROM players WHERE citizenid = ?', { CitizenId })
|
||||
if result == 0 then
|
||||
UniqueFound = true
|
||||
end
|
||||
@@ -622,7 +624,7 @@ function QBCore.Functions.CreateAccountNumber()
|
||||
while not UniqueFound do
|
||||
AccountNumber = 'US0' .. math.random(1, 9) .. 'QBCore' .. math.random(1111, 9999) .. math.random(1111, 9999) .. math.random(11, 99)
|
||||
local query = '%' .. AccountNumber .. '%'
|
||||
local result = MySQL.Sync.prepare('SELECT COUNT(*) as count FROM players WHERE charinfo LIKE ?', { query })
|
||||
local result = MySQL.prepare.await('SELECT COUNT(*) as count FROM players WHERE charinfo LIKE ?', { query })
|
||||
if result == 0 then
|
||||
UniqueFound = true
|
||||
end
|
||||
@@ -634,9 +636,9 @@ function QBCore.Functions.CreatePhoneNumber()
|
||||
local UniqueFound = false
|
||||
local PhoneNumber = nil
|
||||
while not UniqueFound do
|
||||
PhoneNumber = math.random(100,999) .. math.random(1000000,9999999)
|
||||
PhoneNumber = tonumber(math.random(100,999) .. math.random(1000000,9999999))
|
||||
local query = '%' .. PhoneNumber .. '%'
|
||||
local result = MySQL.Sync.prepare('SELECT COUNT(*) as count FROM players WHERE charinfo LIKE ?', { query })
|
||||
local result = MySQL.prepare.await('SELECT COUNT(*) as count FROM players WHERE charinfo LIKE ?', { query })
|
||||
if result == 0 then
|
||||
UniqueFound = true
|
||||
end
|
||||
@@ -650,7 +652,7 @@ function QBCore.Player.CreateFingerId()
|
||||
while not UniqueFound do
|
||||
FingerId = tostring(QBCore.Shared.RandomStr(2) .. QBCore.Shared.RandomInt(3) .. QBCore.Shared.RandomStr(1) .. QBCore.Shared.RandomInt(2) .. QBCore.Shared.RandomStr(3) .. QBCore.Shared.RandomInt(4))
|
||||
local query = '%' .. FingerId .. '%'
|
||||
local result = MySQL.Sync.prepare('SELECT COUNT(*) as count FROM `players` WHERE `metadata` LIKE ?', { query })
|
||||
local result = MySQL.prepare.await('SELECT COUNT(*) as count FROM `players` WHERE `metadata` LIKE ?', { query })
|
||||
if result == 0 then
|
||||
UniqueFound = true
|
||||
end
|
||||
@@ -664,7 +666,7 @@ function QBCore.Player.CreateWalletId()
|
||||
while not UniqueFound do
|
||||
WalletId = 'QB-' .. math.random(11111111, 99999999)
|
||||
local query = '%' .. WalletId .. '%'
|
||||
local result = MySQL.Sync.prepare('SELECT COUNT(*) as count FROM players WHERE metadata LIKE ?', { query })
|
||||
local result = MySQL.prepare.await('SELECT COUNT(*) as count FROM players WHERE metadata LIKE ?', { query })
|
||||
if result == 0 then
|
||||
UniqueFound = true
|
||||
end
|
||||
@@ -678,7 +680,7 @@ function QBCore.Player.CreateSerialNumber()
|
||||
while not UniqueFound do
|
||||
SerialNumber = math.random(11111111, 99999999)
|
||||
local query = '%' .. SerialNumber .. '%'
|
||||
local result = MySQL.Sync.prepare('SELECT COUNT(*) as count FROM players WHERE metadata LIKE ?', { query })
|
||||
local result = MySQL.prepare.await('SELECT COUNT(*) as count FROM players WHERE metadata LIKE ?', { query })
|
||||
if result == 0 then
|
||||
UniqueFound = true
|
||||
end
|
||||
|
||||
+1
-1
@@ -244,7 +244,7 @@ QBShared.Items = {
|
||||
['shotgun_ammo'] = {['name'] = 'shotgun_ammo', ['label'] = 'Shotgun ammo', ['weight'] = 500, ['type'] = 'item', ['image'] = 'shotgun_ammo.png', ['unique'] = false, ['useable'] = true, ['shouldClose'] = true, ['combinable'] = nil, ['description'] = 'Ammo for Shotguns'},
|
||||
['mg_ammo'] = {['name'] = 'mg_ammo', ['label'] = 'MG ammo', ['weight'] = 1000, ['type'] = 'item', ['image'] = 'mg_ammo.png', ['unique'] = false, ['useable'] = true, ['shouldClose'] = true, ['combinable'] = nil, ['description'] = 'Ammo for Machine Guns'},
|
||||
['snp_ammo'] = {['name'] = 'snp_ammo', ['label'] = 'Sniper ammo', ['weight'] = 1000, ['type'] = 'item', ['image'] = 'rifle_ammo.png', ['unique'] = false, ['useable'] = true, ['shouldClose'] = true, ['combinable'] = nil, ['description'] = 'Ammo for Sniper Rifles'},
|
||||
['emp_ammo'] = {['name'] = 'emp_ammo', ['label'] = 'EMP Ammo', ['weight'] = 200, ['type'] = 'item', ['image'] = 'emp_ammo.png', ['unique'] = false, ['useable'] = true, ['shouldClose'] = true, ['combinable'] = nil, ['description'] = 'Ammo for EMP Launcher'},
|
||||
['emp_ammo'] = {['name'] = 'emp_ammo', ['label'] = 'EMP Ammo', ['weight'] = 200, ['type'] = 'item', ['image'] = 'emp_ammo.png', ['unique'] = false, ['useable'] = true, ['shouldClose'] = true, ['combinable'] = nil, ['description'] = 'Ammo for EMP Launcher'},
|
||||
|
||||
-- Card ITEMS
|
||||
['id_card'] = {['name'] = 'id_card', ['label'] = 'ID Card', ['weight'] = 0, ['type'] = 'item', ['image'] = 'id_card.png', ['unique'] = true, ['useable'] = true, ['shouldClose'] = false, ['combinable'] = nil, ['description'] = 'A card containing all your information to identify yourself'},
|
||||
|
||||
+2
-1
@@ -14,6 +14,7 @@ QBShared.Jobs = {
|
||||
},
|
||||
['police'] = {
|
||||
label = 'Law Enforcement',
|
||||
type = "leo",
|
||||
defaultDuty = true,
|
||||
offDutyPay = false,
|
||||
grades = {
|
||||
@@ -279,4 +280,4 @@ QBShared.Jobs = {
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
+1
-2
@@ -31,7 +31,6 @@ end
|
||||
--- @param opts table<string, any> - Constructor opts param
|
||||
--- @return Locale
|
||||
function Locale:new(opts)
|
||||
local self = {}
|
||||
setmetatable(self, Locale)
|
||||
self.warnOnMissing = opts.warnOnMissing or true
|
||||
|
||||
@@ -135,4 +134,4 @@ function Locale:delete(phraseTarget, prefix)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
+1
-1
@@ -155,4 +155,4 @@ QBShared.FemaleNoGloves = {
|
||||
[157] = true,
|
||||
[161] = true,
|
||||
[165] = true
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -4421,6 +4421,6 @@ QBShared.Vehicles = {
|
||||
},
|
||||
}
|
||||
|
||||
for k,v in pairs(QBShared.Vehicles) do
|
||||
for _, v in pairs(QBShared.Vehicles) do
|
||||
QBShared.VehicleHashes[v.hash] = v
|
||||
end
|
||||
|
||||
+1
-1
@@ -145,4 +145,4 @@ QBShared.Weapons = {
|
||||
-- Animals
|
||||
[`weapon_animal`] = {['name'] = 'weapon_animal', ['label'] = 'Animal', ['ammotype'] = nil, ['damagereason'] = 'Mauled'},
|
||||
[`weapon_cougar`] = {['name'] = 'weapon_cougar', ['label'] = 'Cougar', ['ammotype'] = nil, ['damagereason'] = 'Mauled'},
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user