2025-04-05 22:25:06 +00:00

237 lines
9.0 KiB
Lua

local ApartmentObjects = {}
local QBCore = exports['qb-core']:GetCoreObject()
-- Functions
local function CreateApartmentId(type)
local UniqueFound = false
local AparmentId = nil
while not UniqueFound do
AparmentId = tostring(math.random(1, 9999))
local result = MySQL.query.await('SELECT COUNT(*) as count FROM apartments WHERE name = ?', { tostring(type .. AparmentId) })
if result[1].count == 0 then
UniqueFound = true
end
end
return AparmentId
end
local function GetApartmentInfo(apartmentId)
local retval = nil
local result = MySQL.query.await('SELECT * FROM apartments WHERE name = ?', { apartmentId })
if result[1] ~= nil then
retval = result[1]
end
return retval
end
-- Events
RegisterNetEvent('qb-apartments:server:SetInsideMeta', function(house, insideId, bool, isVisiting)
local src = source
local Player = QBCore.Functions.GetPlayer(src)
local insideMeta = Player.PlayerData.metadata['inside']
if bool then
local routeId = insideId:gsub('[^%-%d]', '')
if not isVisiting then
insideMeta.apartment.apartmentType = house
insideMeta.apartment.apartmentId = insideId
insideMeta.house = nil
Player.Functions.SetMetaData('inside', insideMeta)
end
QBCore.Functions.SetPlayerBucket(src, tonumber(routeId))
else
insideMeta.apartment.apartmentType = nil
insideMeta.apartment.apartmentId = nil
insideMeta.house = nil
Player.Functions.SetMetaData('inside', insideMeta)
QBCore.Functions.SetPlayerBucket(src, 0)
end
end)
RegisterNetEvent('qb-apartments:returnBucket', function()
local src = source
SetPlayerRoutingBucket(src, 0)
end)
RegisterNetEvent('apartments:server:openStash', function(CurrentApartment)
local src = source
exports['qb-inventory']:OpenInventory(src, CurrentApartment)
end)
RegisterNetEvent('apartments:server:CreateApartment', function(type, label, firstSpawn)
local src = source
local Player = QBCore.Functions.GetPlayer(src)
local num = CreateApartmentId(type)
local apartmentId = tostring(type .. num)
label = tostring(label .. ' ' .. num)
MySQL.insert('INSERT INTO apartments (name, type, label, citizenid) VALUES (?, ?, ?, ?)', {
apartmentId,
type,
label,
Player.PlayerData.citizenid
})
TriggerClientEvent('QBCore:Notify', src, Lang:t('success.receive_apart') .. ' (' .. label .. ')')
if firstSpawn then
TriggerClientEvent('apartments:client:SpawnInApartment', src, apartmentId, type)
end
TriggerClientEvent('apartments:client:SetHomeBlip', src, type)
end)
RegisterNetEvent('apartments:server:UpdateApartment', function(type, label)
local src = source
local Player = QBCore.Functions.GetPlayer(src)
MySQL.update('UPDATE apartments SET type = ?, label = ? WHERE citizenid = ?', { type, label, Player.PlayerData.citizenid })
TriggerClientEvent('QBCore:Notify', src, Lang:t('success.changed_apart'))
TriggerClientEvent('apartments:client:SetHomeBlip', src, type)
end)
RegisterNetEvent('apartments:server:RingDoor', function(apartmentId, apartment)
local src = source
if ApartmentObjects[apartment].apartments[apartmentId] ~= nil and next(ApartmentObjects[apartment].apartments[apartmentId].players) ~= nil then
for k, _ in pairs(ApartmentObjects[apartment].apartments[apartmentId].players) do
TriggerClientEvent('apartments:client:RingDoor', k, src)
end
end
end)
RegisterNetEvent('apartments:server:OpenDoor', function(target, apartmentId, apartment)
local OtherPlayer = QBCore.Functions.GetPlayer(target)
if OtherPlayer ~= nil then
TriggerClientEvent('apartments:client:SpawnInApartment', OtherPlayer.PlayerData.source, apartmentId, apartment)
end
end)
RegisterNetEvent('apartments:server:AddObject', function(apartmentId, apartment, offset)
local src = source
local Player = QBCore.Functions.GetPlayer(src)
if ApartmentObjects[apartment] ~= nil and ApartmentObjects[apartment].apartments ~= nil and ApartmentObjects[apartment].apartments[apartmentId] ~= nil then
ApartmentObjects[apartment].apartments[apartmentId].players[src] = Player.PlayerData.citizenid
else
if ApartmentObjects[apartment] ~= nil and ApartmentObjects[apartment].apartments ~= nil then
ApartmentObjects[apartment].apartments[apartmentId] = {}
ApartmentObjects[apartment].apartments[apartmentId].offset = offset
ApartmentObjects[apartment].apartments[apartmentId].players = {}
ApartmentObjects[apartment].apartments[apartmentId].players[src] = Player.PlayerData.citizenid
else
ApartmentObjects[apartment] = {}
ApartmentObjects[apartment].apartments = {}
ApartmentObjects[apartment].apartments[apartmentId] = {}
ApartmentObjects[apartment].apartments[apartmentId].offset = offset
ApartmentObjects[apartment].apartments[apartmentId].players = {}
ApartmentObjects[apartment].apartments[apartmentId].players[src] = Player.PlayerData.citizenid
end
end
end)
RegisterNetEvent('apartments:server:RemoveObject', function(apartmentId, apartment)
local src = source
if ApartmentObjects[apartment].apartments[apartmentId].players ~= nil then
ApartmentObjects[apartment].apartments[apartmentId].players[src] = nil
if next(ApartmentObjects[apartment].apartments[apartmentId].players) == nil then
ApartmentObjects[apartment].apartments[apartmentId] = nil
end
end
end)
RegisterNetEvent('apartments:server:setCurrentApartment', function(ap)
local Player = QBCore.Functions.GetPlayer(source)
if not Player then return end
Player.Functions.SetMetaData('currentapartment', ap)
end)
-- Callbacks
QBCore.Functions.CreateCallback('apartments:GetAvailableApartments', function(_, cb, apartment)
local apartments = {}
if ApartmentObjects ~= nil and ApartmentObjects[apartment] ~= nil and ApartmentObjects[apartment].apartments ~= nil then
for k, _ in pairs(ApartmentObjects[apartment].apartments) do
if (ApartmentObjects[apartment].apartments[k] ~= nil and next(ApartmentObjects[apartment].apartments[k].players) ~= nil) then
local apartmentInfo = GetApartmentInfo(k)
apartments[k] = apartmentInfo.label
end
end
end
cb(apartments)
end)
QBCore.Functions.CreateCallback('apartments:GetApartmentOffset', function(_, cb, apartmentId)
local retval = 0
if ApartmentObjects ~= nil then
for k, _ in pairs(ApartmentObjects) do
if (ApartmentObjects[k].apartments[apartmentId] ~= nil and tonumber(ApartmentObjects[k].apartments[apartmentId].offset) ~= 0) then
retval = tonumber(ApartmentObjects[k].apartments[apartmentId].offset)
end
end
end
cb(retval)
end)
QBCore.Functions.CreateCallback('apartments:GetApartmentOffsetNewOffset', function(_, cb, apartment)
local retval = Apartments.SpawnOffset
if ApartmentObjects ~= nil and ApartmentObjects[apartment] ~= nil and ApartmentObjects[apartment].apartments ~= nil then
for k, _ in pairs(ApartmentObjects[apartment].apartments) do
if (ApartmentObjects[apartment].apartments[k] ~= nil) then
retval = ApartmentObjects[apartment].apartments[k].offset + Apartments.SpawnOffset
end
end
end
cb(retval)
end)
QBCore.Functions.CreateCallback('apartments:GetOwnedApartment', function(source, cb, cid)
if cid ~= nil then
local result = MySQL.query.await('SELECT * FROM apartments WHERE citizenid = ?', { cid })
if result[1] ~= nil then
return cb(result[1])
end
return cb(nil)
else
local src = source
local Player = QBCore.Functions.GetPlayer(src)
local result = MySQL.query.await('SELECT * FROM apartments WHERE citizenid = ?', { Player.PlayerData.citizenid })
if result[1] ~= nil then
return cb(result[1])
end
return cb(nil)
end
end)
QBCore.Functions.CreateCallback('apartments:IsOwner', function(source, cb, apartment)
local src = source
local Player = QBCore.Functions.GetPlayer(src)
if Player ~= nil then
local result = MySQL.query.await('SELECT * FROM apartments WHERE citizenid = ?', { Player.PlayerData.citizenid })
if result[1] ~= nil then
if result[1].type == apartment then
cb(true)
else
cb(false)
end
else
cb(false)
end
end
end)
QBCore.Functions.CreateCallback('apartments:GetOutfits', function(source, cb)
local src = source
local Player = QBCore.Functions.GetPlayer(src)
if Player then
local result = MySQL.query.await('SELECT * FROM player_outfits WHERE citizenid = ?', { Player.PlayerData.citizenid })
if result[1] ~= nil then
cb(result)
else
cb(nil)
end
end
end)