diff --git a/qbx_core.sql b/qbx_core.sql index 76352c034..8beb47d87 100644 --- a/qbx_core.sql +++ b/qbx_core.sql @@ -23,6 +23,9 @@ ALTER TABLE `players` ADD IF NOT EXISTS `last_logged_out` timestamp NULL DEFAULT NULL AFTER `last_updated`, MODIFY COLUMN `name` varchar(255) NOT NULL COLLATE utf8mb4_unicode_ci; +ALTER TABLE `players` +ADD IF NOT EXISTS `userId` INT UNSIGNED DEFAULT NULL AFTER `id`; + CREATE TABLE IF NOT EXISTS `bans` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) DEFAULT NULL, diff --git a/server/events.lua b/server/events.lua index 07b7b31d7..b68dfd4d1 100644 --- a/server/events.lua +++ b/server/events.lua @@ -172,6 +172,11 @@ AddEventHandler('onResourceStart', function(resource) if resource ~= cache.resource then return end storage.createUsersTable() + + MySQL.query([[ + ALTER TABLE `players` + ADD IF NOT EXISTS `userId` INT UNSIGNED DEFAULT NULL AFTER `id`; + ]]) end) -- New method for checking if logged in across all scripts (optional) diff --git a/server/player.lua b/server/player.lua index 7e6b5d988..1cd83d449 100644 --- a/server/player.lua +++ b/server/player.lua @@ -23,10 +23,14 @@ function Login(source, citizenid, newData) return false end + local license = GetPlayerIdentifierByType(source --[[@as string]], 'license2') or GetPlayerIdentifierByType(source --[[@as string]], 'license') + local userId = storage.fetchUserByIdentifier(license) + if citizenid then - local license, license2 = GetPlayerIdentifierByType(source --[[@as string]], 'license'), GetPlayerIdentifierByType(source --[[@as string]], 'license2') local playerData = storage.fetchPlayerEntity(citizenid) - if playerData and (license2 == playerData.license or license == playerData.license) then + if playerData and license == playerData.license then + playerData.userId = userId + return not not CheckPlayerData(source, playerData) else DropPlayer(tostring(source), locale('info.exploit_dropped')) @@ -40,6 +44,8 @@ function Login(source, citizenid, newData) }) end else + newData.userId = userId + local player = CheckPlayerData(source, newData) Save(player.PlayerData.source) return true @@ -548,6 +554,7 @@ function CheckPlayerData(source, playerData) Offline = false end + playerData.userId = playerData.userId or nil playerData.citizenid = playerData.citizenid or GenerateUniqueIdentifier('citizenid') playerData.cid = playerData.charinfo?.cid or playerData.cid or 1 playerData.money = playerData.money or {} diff --git a/server/storage/players.lua b/server/storage/players.lua index 9381229c3..3a07f6552 100644 --- a/server/storage/players.lua +++ b/server/storage/players.lua @@ -28,7 +28,7 @@ local function createUser(identifiers) end ---@param identifier string ----@return number? +---@return integer? local function fetchUserByIdentifier(identifier) local idType = identifier:match('([^:]+)') local select = ('SELECT `userId` FROM `users` WHERE `%s` = ? LIMIT 1'):format(idType) @@ -93,7 +93,8 @@ end ---@param request UpsertPlayerRequest local function upsertPlayerEntity(request) - MySQL.insert.await('INSERT INTO players (citizenid, cid, license, name, money, charinfo, job, gang, position, metadata, last_logged_out) VALUES (:citizenid, :cid, :license, :name, :money, :charinfo, :job, :gang, :position, :metadata, :last_logged_out) ON DUPLICATE KEY UPDATE name = :name, money = :money, charinfo = :charinfo, job = :job, gang = :gang, position = :position, metadata = :metadata, last_logged_out = :last_logged_out', { + MySQL.insert.await('INSERT INTO players (userId, citizenid, cid, license, name, money, charinfo, job, gang, position, metadata, last_logged_out) VALUES (:userId, :citizenid, :cid, :license, :name, :money, :charinfo, :job, :gang, :position, :metadata, :last_logged_out) ON DUPLICATE KEY UPDATE userId = :userId, name = :name, money = :money, charinfo = :charinfo, job = :job, gang = :gang, position = :position, metadata = :metadata, last_logged_out = :last_logged_out', { + userId = request.playerEntity.userId, citizenid = request.playerEntity.citizenid, cid = request.playerEntity.charinfo.cid, license = request.playerEntity.license, @@ -146,9 +147,10 @@ end ---@return PlayerEntity? local function fetchPlayerEntity(citizenId) ---@type PlayerEntityDatabase - local player = MySQL.single.await('SELECT citizenid, license, name, charinfo, money, job, gang, position, metadata, UNIX_TIMESTAMP(last_logged_out) AS lastLoggedOutUnix FROM players WHERE citizenid = ?', { citizenId }) + local player = MySQL.single.await('SELECT userId, citizenid, license, name, charinfo, money, job, gang, position, metadata, UNIX_TIMESTAMP(last_logged_out) AS lastLoggedOutUnix FROM players WHERE citizenid = ?', { citizenId }) local charinfo = player and json.decode(player.charinfo) return player and { + userId = player.userId, citizenid = player.citizenid, license = player.license, name = player.name, diff --git a/types.lua b/types.lua index fd40bb84e..99698e98c 100644 --- a/types.lua +++ b/types.lua @@ -126,6 +126,7 @@ ---@field position vector3 ---@class PlayerEntity +---@field userId? integer ---@field citizenid string ---@field license string ---@field name string