255 lines
8.2 KiB
Lua
255 lines
8.2 KiB
Lua
if Config.Framework ~= 'esx' then
|
|
return
|
|
end
|
|
|
|
userTable = 'users' -- users
|
|
identifierColumn = 'identifier' -- identifier
|
|
accountsColumn = 'accounts'
|
|
|
|
ESX = exports['es_extended']:getSharedObject()
|
|
|
|
RegisterNetEvent('esx:playerLoaded', function(id, data)
|
|
Wait(2000)
|
|
Debug('Loaded player:', id)
|
|
CreateQuests(id)
|
|
end)
|
|
|
|
CreateThread(function()
|
|
for k, v in pairs(ESX.Players) do
|
|
if v and v.source then
|
|
Debug('Loaded player:', v.source)
|
|
CreateQuests(v.source)
|
|
end
|
|
end
|
|
end)
|
|
|
|
function RegisterServerCallback(name, cb)
|
|
ESX.RegisterServerCallback(name, cb)
|
|
end
|
|
|
|
function RegisterUsableItem(name, cb)
|
|
ESX.RegisterUsableItem(name, cb)
|
|
end
|
|
|
|
function GetPlayerFromId(source)
|
|
return ESX.GetPlayerFromId(source)
|
|
end
|
|
|
|
function GetPlayerFromIdentifier(identifier)
|
|
return ESX.GetPlayerFromIdentifier(identifier)
|
|
end
|
|
|
|
function PlayerIsAdmin(source)
|
|
local player = GetPlayerFromId(source)
|
|
return player.getGroup() == 'admin' or player.getGroup() == 'superadmin'
|
|
end
|
|
|
|
function AddMoneyToAccount(account, amount, isNotRent)
|
|
local source = GetPlayerSourceFromIdentifier(account)
|
|
if source then
|
|
AddAccountMoney(source, 'bank', amount)
|
|
if isNotRent then return end
|
|
TriggerClientEvent('qb-houses:sendTextMessage', source, Lang('HOUSING_NOTIFICATION_RENT_PAYMENT') .. amount, 'error')
|
|
else
|
|
local result = MySQL.Sync.fetchAll('SELECT accounts FROM users WHERE identifier = ?', { account })
|
|
if not result[1] then return print('Add Money Account : Not finded this account: ' .. account) end
|
|
local accounts = json.decode(result[1].accounts)
|
|
accounts.bank = accounts.bank + amount
|
|
MySQL.Sync.execute('UPDATE users SET accounts = ? WHERE identifier = ?', {
|
|
json.encode(accounts),
|
|
account
|
|
})
|
|
end
|
|
end
|
|
|
|
function RemoveMoneyFromAccount(account, amount, dontCheck)
|
|
local source = GetPlayerSourceFromIdentifier(account)
|
|
if source then
|
|
RemoveAccountMoney(source, 'bank', amount)
|
|
return true
|
|
else
|
|
local player = MySQL.Sync.fetchAll('SELECT accounts FROM users WHERE identifier = ?', { account })
|
|
if player[1] then
|
|
local accounts = json.decode(player[1].accounts)
|
|
if accounts.bank >= amount or dontCheck then
|
|
accounts.bank = accounts.bank - amount
|
|
MySQL.Sync.execute('UPDATE users SET accounts = ? WHERE identifier = ?', { json.encode(accounts), account })
|
|
return true
|
|
end
|
|
end
|
|
end
|
|
return false
|
|
end
|
|
|
|
function GetJobName(source)
|
|
local player = GetPlayerFromId(source)
|
|
if not player then return '' end
|
|
return player.getJob().name
|
|
end
|
|
|
|
function GetCharacterName(source)
|
|
local xPlayer = GetPlayerFromId(source)
|
|
local firstName, lastName
|
|
if xPlayer.get and xPlayer.get('firstName') and xPlayer.get('lastName') then
|
|
firstName = xPlayer.get('firstName')
|
|
lastName = xPlayer.get('lastName')
|
|
else
|
|
local name = MySQL.Sync.fetchAll('SELECT `firstname`, `lastname` FROM `users` WHERE `identifier`=@identifier', { ['@identifier'] = ESX.GetIdentifier(source) })
|
|
firstName, lastName = name[1]?.firstname or ESX.GetPlayerName(source), name[1]?.lastname or ''
|
|
end
|
|
|
|
return firstName, lastName
|
|
end
|
|
|
|
function GetAccountMoney(source, account)
|
|
local player = GetPlayerFromId(source)
|
|
return player.getAccount(account).money
|
|
end
|
|
|
|
function AddAccountMoney(source, account, amount)
|
|
local player = GetPlayerFromId(source)
|
|
player.addAccountMoney(account, amount)
|
|
end
|
|
|
|
function RemoveAccountMoney(source, account, amount)
|
|
local player = GetPlayerFromId(source)
|
|
player.removeAccountMoney(account, amount)
|
|
end
|
|
|
|
function RemoveItem(source, item, count)
|
|
local player = GetPlayerFromId(source)
|
|
player.removeInventoryItem(item, count)
|
|
end
|
|
|
|
function GetIdentifier(source)
|
|
local player = GetPlayerFromId(source)
|
|
if not player then
|
|
return false
|
|
end
|
|
return player.identifier
|
|
end
|
|
|
|
function GetPlayerSourceFromIdentifier(identifier)
|
|
local player = GetPlayerFromIdentifier(identifier)
|
|
if not player then
|
|
return false
|
|
end
|
|
return player.source
|
|
end
|
|
|
|
function GetPlayerSourceFromSource(source)
|
|
local player = GetPlayerFromId(source)
|
|
if not player then
|
|
return false
|
|
end
|
|
return player.source
|
|
end
|
|
|
|
function GetCharacterFromIdentifier(identifier)
|
|
local result = MySQL.Sync.fetchAll('SELECT * FROM `users` WHERE identifier = ?', { identifier })
|
|
if not result[1] then
|
|
return '', ''
|
|
end
|
|
result = result[1]
|
|
return result?.firstname, result?.lastname
|
|
end
|
|
|
|
RegisterServerCallback('qb-houses:GetInside', function(source, cb)
|
|
local src = source
|
|
local identifier = GetIdentifier(src)
|
|
local fetch = ([[
|
|
SELECT inside
|
|
FROM %s
|
|
WHERE %s = @id;
|
|
]]):format(userTable, identifierColumn)
|
|
local fetchData = { ['@id'] = identifier }
|
|
local result = MySQL.Sync.fetchAll(fetch, fetchData)
|
|
if result and result[1] then
|
|
cb(result[1].inside)
|
|
Debug('qb-houses:GetInside: ', result[1].inside)
|
|
else
|
|
cb(false)
|
|
Debug('qb-houses:GetInside: ', false)
|
|
end
|
|
end)
|
|
|
|
function GetPlayerSQLDataFromIdentifier(identifier)
|
|
local result = MySQL.Sync.fetchAll('SELECT * FROM `users` WHERE identifier = ?', { identifier })
|
|
if result[1] then
|
|
return result[1]
|
|
end
|
|
return false
|
|
end
|
|
|
|
function UpdateInside(src, insideId, bool)
|
|
local identifier = GetIdentifier(src)
|
|
local update = ([[
|
|
UPDATE %s SET inside = @inside
|
|
WHERE %s = @id;
|
|
]]):format(userTable, identifierColumn)
|
|
local updateData = {
|
|
['@inside'] = insideId,
|
|
['@id'] = identifier
|
|
}
|
|
if bool then
|
|
MySQL.Sync.execute(update, updateData)
|
|
else
|
|
updateData = {
|
|
['@inside'] = nil,
|
|
['@id'] = identifier
|
|
}
|
|
MySQL.Sync.execute(update, updateData)
|
|
end
|
|
end
|
|
|
|
RegisterServerCallback('qb-phone:server:MeosGetPlayerHouses', function(source, cb, input)
|
|
if input then
|
|
local search = escape_sqli(input)
|
|
local searchData = {}
|
|
local query = 'SELECT * FROM `' .. userTable .. '` WHERE `' .. identifierColumn .. '` = "' .. search .. '"'
|
|
-- Split on " " and check each var individual
|
|
local searchParameters = SplitStringToArray(search)
|
|
-- Construct query dynamicly for individual parm check
|
|
if #searchParameters > 1 then
|
|
query = query .. ' OR `firstname` LIKE "%' .. searchParameters[1] .. '%" OR `lastname` LIKE "%' .. searchParameters[1] .. '%"'
|
|
for i = 2, #searchParameters do
|
|
query = query .. ' OR `firstname` LIKE "%' .. searchParameters[i] .. '%" OR `lastname` LIKE "%' .. searchParameters[i] .. '%"'
|
|
end
|
|
else
|
|
query = query .. ' OR `firstname` LIKE "%' .. search .. '%" OR `lastname` LIKE "%' .. search .. '%"'
|
|
end
|
|
local result = MySQL.Sync.fetchAll(query)
|
|
if result[1] then
|
|
local houses = MySQL.Sync.fetchAll('SELECT * FROM player_houses WHERE citizenid = ?',
|
|
{ result[1][identifierColumn] })
|
|
if houses[1] then
|
|
for k, v in pairs(houses) do
|
|
local charinfo = {
|
|
firstname = result[1].firstname,
|
|
lastname = result[1].lastname,
|
|
}
|
|
searchData[#searchData + 1] = {
|
|
name = v.house,
|
|
keyholders = v.keyholders,
|
|
owner = v.citizenid,
|
|
price = Config.Houses[v.house].price,
|
|
label = Config.Houses[v.house].address,
|
|
tier = Config.Houses[v.house].tier,
|
|
garage = Config.Houses[v.house].garage,
|
|
charinfo = charinfo,
|
|
coords = {
|
|
x = Config.Houses[v.house].coords.enter.x,
|
|
y = Config.Houses[v.house].coords.enter.y,
|
|
z = Config.Houses[v.house].coords.enter.z
|
|
}
|
|
}
|
|
end
|
|
cb(searchData)
|
|
end
|
|
else
|
|
cb(nil)
|
|
end
|
|
else
|
|
cb(nil)
|
|
end
|
|
end)
|