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)