mirror of
https://github.com/qbcore-fivem/qb-core.git
synced 2026-08-29 09:18:56 +00:00
312f24d245
FxDK does not include license identifiers by default and thus breaks scripts that utilize those. Without this you will get the "No valid Rockstar license" error when connecting. This fix was not my own I found it in the post linked below and tested myself. https://forum.cfx.re/t/connection-rejected-by-server-fxdk/2504365/5 Co-authored-by: Kakarot <57848836+GhzGarage@users.noreply.github.com> Co-authored-by: Stan <96954031+tom-osborne@users.noreply.github.com> Co-authored-by: Zerio <54480523+Z3rio@users.noreply.github.com>
318 lines
12 KiB
Lua
318 lines
12 KiB
Lua
-- Event Handler
|
|
|
|
AddEventHandler('chatMessage', function(_, _, message)
|
|
if string.sub(message, 1, 1) == '/' then
|
|
CancelEvent()
|
|
return
|
|
end
|
|
end)
|
|
|
|
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..' ..'\n **Reason:** ' .. reason)
|
|
Player.Functions.Save()
|
|
QBCore.Player_Buckets[Player.PlayerData.license] = nil
|
|
QBCore.Players[src] = nil
|
|
end)
|
|
|
|
-- Player Connecting
|
|
|
|
local function onPlayerConnecting(name, _, deferrals)
|
|
local src = source
|
|
local license
|
|
local identifiers = GetPlayerIdentifiers(src)
|
|
deferrals.defer()
|
|
|
|
-- Mandatory wait
|
|
Wait(0)
|
|
|
|
if QBCore.Config.Server.Closed then
|
|
if not IsPlayerAceAllowed(src, 'qbadmin.join') then
|
|
deferrals.done(QBCore.Config.Server.ClosedReason)
|
|
end
|
|
end
|
|
|
|
for _, v in pairs(identifiers) do
|
|
if string.find(v, 'license') then
|
|
license = v
|
|
break
|
|
end
|
|
end
|
|
|
|
if GetConvarInt("sv_fxdkMode", false) then
|
|
license = 'license:AAAAAAAAAAAAAAAA' -- Dummy License
|
|
end
|
|
|
|
if not license then
|
|
deferrals.done(Lang:t('error.no_valid_license'))
|
|
elseif QBCore.Config.Server.CheckDuplicateLicense and QBCore.Functions.IsLicenseInUse(license) then
|
|
deferrals.done(Lang:t('error.duplicate_license'))
|
|
end
|
|
|
|
local databaseTime = os.clock()
|
|
local databasePromise = promise.new()
|
|
|
|
-- conduct database-dependant checks
|
|
CreateThread(function()
|
|
deferrals.update(string.format(Lang:t('info.checking_ban'), name))
|
|
local databaseSuccess, databaseError = pcall(function()
|
|
local isBanned, Reason = QBCore.Functions.IsPlayerBanned(src)
|
|
if isBanned then
|
|
deferrals.done(Reason)
|
|
end
|
|
end)
|
|
|
|
if QBCore.Config.Server.Whitelist then
|
|
deferrals.update(string.format(Lang:t('info.checking_whitelisted'), name))
|
|
databaseSuccess, databaseError = pcall(function()
|
|
if not QBCore.Functions.IsWhitelisted(src) then
|
|
deferrals.done(Lang:t('error.not_whitelisted'))
|
|
end
|
|
end)
|
|
end
|
|
|
|
if not databaseSuccess then
|
|
databasePromise:reject(databaseError)
|
|
end
|
|
databasePromise:resolve()
|
|
end)
|
|
|
|
-- wait for database to finish
|
|
databasePromise:next(function()
|
|
deferrals.update(string.format(Lang:t('info.join_server'), name))
|
|
deferrals.done()
|
|
end, function (databaseError)
|
|
deferrals.done(Lang:t('error.connecting_database_error'))
|
|
print('^1' .. databaseError)
|
|
end)
|
|
|
|
-- if conducting checks for too long then raise error
|
|
while databasePromise.state == 0 do
|
|
if os.clock() - databaseTime > 30 then
|
|
deferrals.done(Lang:t('error.connecting_database_timeout'))
|
|
error(Lang:t('error.connecting_database_timeout'))
|
|
break
|
|
end
|
|
Wait(1000)
|
|
end
|
|
|
|
-- Add any additional defferals you may need!
|
|
end
|
|
|
|
AddEventHandler('playerConnecting', onPlayerConnecting)
|
|
|
|
-- Open & Close Server (prevents players from joining)
|
|
|
|
RegisterNetEvent('QBCore:Server:CloseServer', function(reason)
|
|
local src = source
|
|
if QBCore.Functions.HasPermission(src, 'admin') then
|
|
reason = reason or 'No reason specified'
|
|
QBCore.Config.Server.Closed = true
|
|
QBCore.Config.Server.ClosedReason = reason
|
|
for k in pairs(QBCore.Players) do
|
|
if not QBCore.Functions.HasPermission(k, QBCore.Config.Server.WhitelistPermission) then
|
|
QBCore.Functions.Kick(k, reason, nil, nil)
|
|
end
|
|
end
|
|
else
|
|
QBCore.Functions.Kick(src, Lang:t("error.no_permission"), nil, nil)
|
|
end
|
|
end)
|
|
|
|
RegisterNetEvent('QBCore:Server:OpenServer', function()
|
|
local src = source
|
|
if QBCore.Functions.HasPermission(src, 'admin') then
|
|
QBCore.Config.Server.Closed = false
|
|
else
|
|
QBCore.Functions.Kick(src, Lang:t("error.no_permission"), nil, nil)
|
|
end
|
|
end)
|
|
|
|
-- Callback Events --
|
|
|
|
-- Client Callback
|
|
RegisterNetEvent('QBCore:Server:TriggerClientCallback', function(name, ...)
|
|
if QBCore.ClientCallbacks[name] then
|
|
QBCore.ClientCallbacks[name](...)
|
|
QBCore.ClientCallbacks[name] = nil
|
|
end
|
|
end)
|
|
|
|
-- Server Callback
|
|
RegisterNetEvent('QBCore:Server:TriggerCallback', function(name, ...)
|
|
local src = source
|
|
QBCore.Functions.TriggerCallback(name, src, function(...)
|
|
TriggerClientEvent('QBCore:Client:TriggerCallback', src, name, ...)
|
|
end, ...)
|
|
end)
|
|
|
|
-- Player
|
|
|
|
RegisterNetEvent('QBCore:UpdatePlayer', function()
|
|
local src = source
|
|
local Player = QBCore.Functions.GetPlayer(src)
|
|
if not Player then return end
|
|
local newHunger = Player.PlayerData.metadata['hunger'] - QBCore.Config.Player.HungerRate
|
|
local newThirst = Player.PlayerData.metadata['thirst'] - QBCore.Config.Player.ThirstRate
|
|
if newHunger <= 0 then
|
|
newHunger = 0
|
|
end
|
|
if newThirst <= 0 then
|
|
newThirst = 0
|
|
end
|
|
Player.Functions.SetMetaData('thirst', newThirst)
|
|
Player.Functions.SetMetaData('hunger', newHunger)
|
|
TriggerClientEvent('hud:client:UpdateNeeds', src, newHunger, newThirst)
|
|
Player.Functions.Save()
|
|
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
|
|
Player.Functions.SetMetaData(meta, data)
|
|
TriggerClientEvent('hud:client:UpdateNeeds', src, Player.PlayerData.metadata['hunger'], Player.PlayerData.metadata['thirst'])
|
|
end)
|
|
|
|
RegisterNetEvent('QBCore:ToggleDuty', function()
|
|
local src = source
|
|
local Player = QBCore.Functions.GetPlayer(src)
|
|
if not Player then return end
|
|
if Player.PlayerData.job.onduty then
|
|
Player.Functions.SetJobDuty(false)
|
|
TriggerClientEvent('QBCore:Notify', src, Lang:t('info.off_duty'))
|
|
else
|
|
Player.Functions.SetJobDuty(true)
|
|
TriggerClientEvent('QBCore:Notify', src, Lang:t('info.on_duty'))
|
|
end
|
|
TriggerClientEvent('QBCore:Client:SetDuty', src, Player.PlayerData.job.onduty)
|
|
end)
|
|
|
|
-- BaseEvents
|
|
|
|
-- Vehicles
|
|
RegisterServerEvent('baseevents:enteringVehicle', function(veh,seat,modelName,netid)
|
|
local src = source
|
|
local data = {
|
|
vehicle = veh,
|
|
seat = seat,
|
|
name = modelName,
|
|
netid = netid,
|
|
event = 'Entering'
|
|
}
|
|
TriggerClientEvent('QBCore:Client:VehicleInfo', src, data)
|
|
end)
|
|
|
|
RegisterServerEvent('baseevents:enteredVehicle', function(veh,seat,modelName,netid)
|
|
local src = source
|
|
local data = {
|
|
vehicle = veh,
|
|
seat = seat,
|
|
name = modelName,
|
|
netid = netid,
|
|
event = 'Entered'
|
|
}
|
|
TriggerClientEvent('QBCore:Client:VehicleInfo', src, data)
|
|
end)
|
|
|
|
RegisterServerEvent('baseevents:enteringAborted', function()
|
|
local src = source
|
|
TriggerClientEvent('QBCore:Client:AbortVehicleEntering', src)
|
|
end)
|
|
|
|
RegisterServerEvent('baseevents:leftVehicle', function(veh,seat,modelName,netid)
|
|
local src = source
|
|
local data = {
|
|
vehicle = veh,
|
|
seat = seat,
|
|
name = modelName,
|
|
netid = netid,
|
|
event = 'Left'
|
|
}
|
|
TriggerClientEvent('QBCore:Client:VehicleInfo', src, data)
|
|
end)
|
|
|
|
-- Items
|
|
|
|
-- This event is exploitable and should not be used. It has been deprecated, and will be removed soon.
|
|
RegisterNetEvent('QBCore:Server:UseItem', function(item)
|
|
print(string.format("%s triggered QBCore:Server:UseItem by ID %s with the following data. This event is deprecated due to exploitation, and will be removed soon. Check qb-inventory for the right use on this event.", GetInvokingResource(), source))
|
|
QBCore.Debug(item)
|
|
end)
|
|
|
|
-- This event is exploitable and should not be used. It has been deprecated, and will be removed soon. function(itemName, amount, slot)
|
|
RegisterNetEvent('QBCore:Server:RemoveItem', function(itemName, amount)
|
|
local src = source
|
|
print(string.format("%s triggered QBCore:Server:RemoveItem by ID %s for %s %s. This event is deprecated due to exploitation, and will be removed soon. Adjust your events accordingly to do this server side with player functions.", GetInvokingResource(), src, amount, itemName))
|
|
end)
|
|
|
|
-- This event is exploitable and should not be used. It has been deprecated, and will be removed soon. function(itemName, amount, slot, info)
|
|
RegisterNetEvent('QBCore:Server:AddItem', function(itemName, amount)
|
|
local src = source
|
|
print(string.format("%s triggered QBCore:Server:AddItem by ID %s for %s %s. This event is deprecated due to exploitation, and will be removed soon. Adjust your events accordingly to do this server side with player functions.", GetInvokingResource(), src, amount, itemName))
|
|
end)
|
|
|
|
-- Non-Chat Command Calling (ex: qb-adminmenu)
|
|
|
|
RegisterNetEvent('QBCore:CallCommand', function(command, args)
|
|
local src = source
|
|
if not QBCore.Commands.List[command] then return end
|
|
local Player = QBCore.Functions.GetPlayer(src)
|
|
if not Player then return end
|
|
local hasPerm = QBCore.Functions.HasPermission(src, "command."..QBCore.Commands.List[command].name)
|
|
if hasPerm then
|
|
if QBCore.Commands.List[command].argsrequired and #QBCore.Commands.List[command].arguments ~= 0 and not args[#QBCore.Commands.List[command].arguments] then
|
|
TriggerClientEvent('QBCore:Notify', src, Lang:t('error.missing_args2'), 'error')
|
|
else
|
|
QBCore.Commands.List[command].callback(src, args)
|
|
end
|
|
else
|
|
TriggerClientEvent('QBCore:Notify', src, Lang:t('error.no_access'), 'error')
|
|
end
|
|
end)
|
|
|
|
-- Use this for player vehicle spawning
|
|
-- Vehicle server-side spawning callback (netId)
|
|
-- use the netid on the client with the NetworkGetEntityFromNetworkId native
|
|
-- convert it to a vehicle via the NetToVeh native
|
|
QBCore.Functions.CreateCallback('QBCore:Server:SpawnVehicle', function(source, cb, model, coords, warp)
|
|
local ped = GetPlayerPed(source)
|
|
model = type(model) == 'string' and joaat(model) or model
|
|
if not coords then coords = GetEntityCoords(ped) end
|
|
local veh = CreateVehicle(model, coords.x, coords.y, coords.z, coords.w, true, true)
|
|
while not DoesEntityExist(veh) do Wait(0) end
|
|
if warp then
|
|
while GetVehiclePedIsIn(ped) ~= veh do
|
|
Wait(0)
|
|
TaskWarpPedIntoVehicle(ped, veh, -1)
|
|
end
|
|
end
|
|
while NetworkGetEntityOwner(veh) ~= source do Wait(0) end
|
|
cb(NetworkGetNetworkIdFromEntity(veh))
|
|
end)
|
|
|
|
-- Use this for long distance vehicle spawning
|
|
-- vehicle server-side spawning callback (netId)
|
|
-- use the netid on the client with the NetworkGetEntityFromNetworkId native
|
|
-- convert it to a vehicle via the NetToVeh native
|
|
QBCore.Functions.CreateCallback('QBCore:Server:CreateVehicle', function(source, cb, model, coords, warp)
|
|
model = type(model) == 'string' and GetHashKey(model) or model
|
|
if not coords then coords = GetEntityCoords(GetPlayerPed(source)) end
|
|
local CreateAutomobile = GetHashKey("CREATE_AUTOMOBILE")
|
|
local veh = Citizen.InvokeNative(CreateAutomobile, model, coords, coords.w, true, true)
|
|
while not DoesEntityExist(veh) do Wait(0) end
|
|
if warp then TaskWarpPedIntoVehicle(GetPlayerPed(source), veh, -1) end
|
|
cb(NetworkGetNetworkIdFromEntity(veh))
|
|
end)
|
|
|
|
--QBCore.Functions.CreateCallback('QBCore:HasItem', function(source, cb, items, amount)
|
|
-- https://github.com/qbcore-framework/qb-inventory/blob/e4ef156d93dd1727234d388c3f25110c350b3bcf/server/main.lua#L2066
|
|
--end)
|