housing und dj

This commit is contained in:
Nordi98 2025-06-09 23:54:46 +02:00
parent 112c7b1761
commit 10a5d168d4
731 changed files with 506993 additions and 0 deletions

View file

@ -0,0 +1,255 @@
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)

View file

@ -0,0 +1,212 @@
if Config.Framework ~= 'qb' then
return
end

QBCore = exports['qb-core']:GetCoreObject()

userTable = 'players' -- users
identifierColumn = 'citizenid' -- identifier
accountsColumn = 'money'

RegisterNetEvent('QBCore:Server:OnPlayerLoaded', function()
local src = source
Debug('Loaded player:', src)
CreateQuests(src)
end)

CreateThread(function()
for k, v in pairs(QBCore.Functions.GetPlayers()) do
if v then
Debug('Loaded player:', v)
CreateQuests(v)
end
end
end)

function RegisterServerCallback(name, cb)
QBCore.Functions.CreateCallback(name, cb)
end

function RegisterUsableItem(name, cb)
QBCore.Functions.CreateUseableItem(name, cb)
end

function GetPlayerFromId(source)
return QBCore.Functions.GetPlayer(source)
end

function GetPlayerFromIdentifier(identifier)
return QBCore.Functions.GetPlayerByCitizenId(identifier)
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 ' .. accountsColumn .. ' FROM ' .. userTable .. ' WHERE ' .. identifierColumn .. ' = ?', { account })
if not result[1] then return print('Add Money Account : Not finded this account: ' .. account) end
local accounts = json.decode(result[1].money)
accounts.bank = accounts.bank + amount
MySQL.Sync.execute('UPDATE ' .. userTable .. ' SET ' .. accountsColumn .. ' = ? WHERE ' .. identifierColumn .. ' = ?', {
json.encode(accounts),
account

})
end
end

function PlayerIsAdmin(source)
return QBCore.Functions.HasPermission(source, 'god') or IsPlayerAceAllowed(source, 'command') or QBCore.Functions.HasPermission(source, 'admin')
end

function GetJobName(source)
local player = GetPlayerFromId(source)
if not player then return '' end
return player.PlayerData.job.name
end

function GetCharacterName(source)
local player = GetPlayerFromId(source).PlayerData.charinfo
return player.firstname, player.lastname
end

function GetAccountMoney(source, account)
local player = GetPlayerFromId(source)
if account == 'money' then account = 'cash' end
if account == 'black_money' then account = 'crypto' end
return player.PlayerData.money[account]
end

function AddAccountMoney(source, account, amount)
local player = GetPlayerFromId(source)
if account == 'money' then account = 'cash' end
player.Functions.AddMoney(account, amount)
end

function RemoveAccountMoney(source, account, amount)
local player = GetPlayerFromId(source)
if account == 'money' then account = 'cash' end
player.Functions.RemoveMoney(account, amount)
end

function RemoveItem(source, item, count)
local player = GetPlayerFromId(source)
player.Functions.RemoveItem(item, count)
end

function GetIdentifier(source)
local player = GetPlayerFromId(source)
if not player then return false end
return player.PlayerData.citizenid
end

function GetPlayerSourceFromIdentifier(identifier)
local player = GetPlayerFromIdentifier(identifier)
if not player then return false end
return player.PlayerData.source
end

function GetPlayerSourceFromSource(source)
local player = GetPlayerFromId(source)
if not player then
return false
end
return player.PlayerData.source
end

function GetCharacterFromIdentifier(identifier)
local result = MySQL.Sync.fetchAll('SELECT charinfo FROM `players` WHERE citizenid = ?', { identifier })
if not result[1] then
return '', ''
end
result = result[1]
result = json.decode(result.charinfo)
return result?.firstname, result?.lastname
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 ' .. accountsColumn .. ' FROM ' .. userTable .. ' WHERE ' .. identifierColumn .. ' = ?', { account })
if player[1] then
local accounts = json.decode(player[1].money)
if accounts.bank >= amount or dontCheck then
accounts.bank = accounts.bank - amount
MySQL.Sync.execute('UPDATE ' .. userTable .. ' SET ' .. accountsColumn .. ' = ? WHERE ' .. identifierColumn .. ' = ?', { json.encode(accounts), account })
return true
end
end
end
return false
end

function GetPlayerSQLDataFromIdentifier(identifier)
local result = MySQL.Sync.fetchAll('SELECT * FROM `players` WHERE citizenid = ? LIMIT 1', { identifier })
if result[1] then
return result[1]
end
return false
end

function UpdateInside(src, insideId, bool)
local Player = GetPlayerFromId(src)
Player.Functions.SetMetaData('currentHouseId', bool and insideId or nil)
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)

View file

@ -0,0 +1,189 @@
if Config.Framework ~= 'standalone' then return end

-- ESX Callbacks
local serverCallbacks = {}

local clientRequests = {}
local RequestId = 0

---@param eventName string
---@param callback function
RegisterServerCallback = function(eventName, callback)
serverCallbacks[eventName] = callback
end

exports('RegisterServerCallback', RegisterServerCallback)

RegisterNetEvent('houses:triggerServerCallback', function(eventName, requestId, invoker, ...)
if not serverCallbacks[eventName] then
return print(('[^1ERROR^7] Server Callback not registered, name: ^5%s^7, invoker resource: ^5%s^7'):format(eventName, invoker))
end

local source = source

serverCallbacks[eventName](source, function(...)
TriggerClientEvent('houses:serverCallback', source, requestId, invoker, ...)
end, ...)
end)

---@param player number playerId
---@param eventName string
---@param callback function
---@param ... any
TriggerClientCallback = function(player, eventName, callback, ...)
clientRequests[RequestId] = callback

TriggerClientEvent('houses:triggerClientCallback', player, eventName, RequestId, GetInvokingResource() or 'unknown', ...)

RequestId = RequestId + 1
end

RegisterNetEvent('houses:clientCallback', function(requestId, invoker, ...)
if not clientRequests[requestId] then
return print(('[^1ERROR^7] Client Callback with requestId ^5%s^7 Was Called by ^5%s^7 but does not exist.'):format(requestId, invoker))
end

clientRequests[requestId](...)
clientRequests[requestId] = nil
end)

function RegisterUsableItem(name, cb)
ImplementError('RegisterUsableItem is not supported with standalone')
return false
end

function GetIdentifier(source)
ImplementError('Get Identifier : You need to implement this function for your framework.')
for k, v in pairs(GetPlayerIdentifiers(source)) do
if string.sub(v, 1, string.len('license:')) == 'license:' then
return v:gsub('license:', '')
end
end
return nil
end

function GetPlayerFromId(source)
return {
source = source,
identifier = GetIdentifier(source)
}
end

function GetPlayerSource(player)
return player.source
end

function GetPlayerFromIdentifier(identifier)
identifier = string.gsub(identifier, ' ', '')
local players = GetPlayers()
for k, v in pairs(players) do
if GetIdentifier(v) == identifier then
return {
source = v,
identifier = identifier
}
end
end
return nil
end

function GetPlayerSourceFromIdentifier(identifier)
local player = GetPlayerFromIdentifier(identifier)
if player then
return player.source
end
return nil
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
ImplementError('Add Money Account : You need to implement this function for your framework.')
end
end

function GetCharacterName(source)
ImplementError('Get Character Name : You need to implement this function for your framework.')
return 'Unknown', 'Unknown'
end

function GetAccountMoney(source, account)
ImplementError('Get Account Money : You need to implement this function for your framework.')
return 999999999999 -- for provide error
end

function AddAccountMoney(source, account, amount)
ImplementError('Add Account Money : You need to implement this function for your framework.')
end

function RemoveAccountMoney(source, account, amount)
ImplementError('Remove Account Money : You need to implement this function for your framework.')
end

function RemoveItem(source, item, count)
ImplementError('Remove Item : You need to implement this function for your framework.')
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)
ImplementError('Get Character From Identifier : You need to implement this function for your framework.')
return 'unknown', 'unknown'
end

function GetJobName(source)
ImplementError('Get Job Name : You need to implement this function for your framework.')
return 'police'
end

function RemoveMoneyFromAccount(account, amount, dontCheck)
local source = GetPlayerSourceFromIdentifier(account)
if source then
RemoveAccountMoney(source, 'bank', amount)
return true
else
ImplementError('Remove Money From Account : You need to implement this function for your framework.')
end
return false
end

function GetPlayerSQLDataFromIdentifier(identifier)
ImplementError('Check Player Is Exist : You need to implement this function for your framework.')
return true
end

function UpdateInside(src, insideId, bool)
ImplementError('Update Inside : You need to implement this function for your framework.')
end

RegisterServerCallback('qb-phone:server:MeosGetPlayerHouses', function(source, cb, input)
ImplementError('qb-phone:server:MeosGetPlayerHouses : You need to implement this function for your framework.')
cb(nil)
end)

RegisterServerCallback('houses:GetIdentifier', function(source, cb)
local identifier = GetIdentifier(source)
cb(identifier)
end)

RegisterServerCallback('houses:GetPlayers', function(source, cb)
cb(GetPlayers())
end)