QBCore = exports['qb-core']:GetCoreObject() -- PSCore = exports['ps-core']:GetCoreObject() local dbloaded = false MySQL.ready(function() MySQL.query('SELECT * FROM properties', {}, function(result) if not result then return end if result.id then -- If only one result result = {result} end for _, v in pairs(result) do local id = tostring(v.property_id) local propertyData = { property_id = tostring(id), owner = v.owner_citizenid, street = v.street, region = v.region, description = v.description, has_access = json.decode(v.has_access), extra_imgs = json.decode(v.extra_imgs), furnitures = json.decode(v.furnitures), for_sale = v.for_sale, price = v.price, shell = v.shell, apartment = v.apartment, door_data = json.decode(v.door_data), garage_data = json.decode(v.garage_data), } PropertiesTable[id] = Property:new(propertyData) end dbloaded = true end) end) lib.callback.register("ps-housing:server:requestProperties", function(source) while not dbloaded do Wait(100) end return PropertiesTable end) AddEventHandler("ps-housing:server:registerProperty", function (propertyData) -- triggered by realtor job local propertyData = propertyData propertyData.owner = propertyData.owner or nil propertyData.has_access = propertyData.has_access or {} propertyData.extra_imgs = propertyData.extra_imgs or {} propertyData.furnitures = propertyData.furnitures or {} propertyData.door_data = propertyData.door_data or {} propertyData.garage_data = propertyData.garage_data or {} local cols = "(owner_citizenid, street, region, description, has_access, extra_imgs, furnitures, for_sale, price, shell, apartment, door_data, garage_data)" local vals = "(@owner_citizenid, @street, @region, @description, @has_access, @extra_imgs, @furnitures, @for_sale, @price, @shell, @apartment, @door_data, @garage_data)" local id = MySQL.insert.await("INSERT INTO properties " .. cols .. " VALUES " .. vals , { ["@owner_citizenid"] = propertyData.owner or nil, ["@street"] = propertyData.street, ["@region"] = propertyData.region, ["@description"] = propertyData.description, ["@has_access"] = json.encode(propertyData.has_access), ["@extra_imgs"] = json.encode(propertyData.extra_imgs), ["@furnitures"] = json.encode(propertyData.furnitures), ["@for_sale"] = propertyData.for_sale ~= nil and propertyData.for_sale or 1, ["@price"] = propertyData.price or 0, ["@shell"] = propertyData.shell, ["@apartment"] = propertyData.apartment, ["@door_data"] = json.encode(propertyData.door_data), ["@garage_data"] = json.encode(propertyData.garage_data), }) id = tostring(id) propertyData.property_id = id PropertiesTable[id] = Property:new(propertyData) TriggerClientEvent("ps-housing:client:addProperty", -1, propertyData) if propertyData.apartment then local player = QBCore.Functions.GetPlayerByCitizenId(propertyData.owner) local src = player.PlayerData.source local property = Property.Get(id) property:PlayerEnter(src) Wait(1000) local query = "SELECT skin FROM playerskins WHERE citizenid = ?" local result = MySQL.Sync.fetchAll(query, {propertyData.owner}) if result and result[1] then Debug("Player: " .. propertyData.owner .. " skin already exists!") else TriggerClientEvent("hp_charcreator:openCreator", src) -- TriggerClientEvent("qb-clothes:client:CreateFirstCharacter", src) Debug("Player: " .. propertyData.owner .. " is creating a new character!") end Framework[Config.Notify].Notify(src, "Open radial menu for furniture menu and place down your stash and clothing locker.", "info") -- This will create the stash for the apartment and migrate the items from the old apartment stash if applicable TriggerEvent("ps-housing:server:createApartmentStash", propertyData.owner, id) end end) lib.callback.register("ps-housing:cb:GetOwnedApartment", function(source, cid) Debug("ps-housing:cb:GetOwnedApartment", source, cid) if cid ~= nil then local result = MySQL.query.await('SELECT * FROM properties WHERE owner_citizenid = ? AND apartment IS NOT NULL AND apartment <> ""', { cid }) if result[1] ~= nil then return result[1] end return nil else local src = source local Player = QBCore.Functions.GetPlayer(src) local result = MySQL.query.await('SELECT * FROM properties WHERE owner_citizenid = ? AND apartment IS NOT NULL AND apartment <> ""', { Player.PlayerData.citizenid }) if result[1] ~= nil then return result[1] end return nil end end) AddEventHandler("ps-housing:server:updateProperty", function(type, property_id, data) local property = Property.Get(property_id) if not property then return end property[type](property, data) end) AddEventHandler("onResourceStart", function(resourceName) -- Used for when the resource is restarted while in game if (GetCurrentResourceName() == resourceName) then while not dbloaded do Wait(100) end TriggerClientEvent('ps-housing:client:initialiseProperties', -1, PropertiesTable) end end) RegisterNetEvent("ps-housing:server:createNewApartment", function(aptLabel) local src = source if not Config.StartingApartment then return end local citizenid = GetCitizenid(src) local PlayerData = GetPlayerData(src) local apartment = Config.Apartments[aptLabel] if not apartment then return end local propertyData = { owner = citizenid, description = string.format("Dette er %s's lejlighed ved %s", PlayerData.charinfo.firstname .. " " .. PlayerData.charinfo.lastname, apartment.label), for_sale = 0, shell = apartment.shell, apartment = apartment.label, } Debug("Creating new apartment for " .. GetPlayerName(src) .. " in " .. apartment.label) Framework[Config.Logs].SendLog("Creating new apartment for " .. GetPlayerName(src) .. " in " .. apartment.label) TriggerEvent("ps-housing:server:registerProperty", propertyData) end) -- Creates apartment stash -- If player has an existing apartment from qb-apartments, it will transfer the items over to the new apartment stash RegisterNetEvent("ps-housing:server:createApartmentStash", function(citizenId, propertyId) local stashId = string.format("property_%s", propertyId) -- Check for existing apartment and corresponding stash local result = MySQL.query.await('SELECT items, stash FROM stashitems WHERE stash IN (SELECT name FROM apartments WHERE citizenid = ?)', { citizenId }) local items = {} if result[1] ~= nil then items = json.decode(result[1].items) -- Delete the old apartment stash as it is no longer needed MySQL.Async.execute('DELETE FROM stashitems WHERE stash = ?', { result[1].stash }) end -- This will create the stash for the apartment (without requiring player to have first opened and placed item in it) TriggerEvent('ps-inventory:server:SaveStashItems', stashId, items) end) RegisterNetEvent('qb-apartments:returnBucket', function() local src = source SetPlayerRoutingBucket(src, 0) end) AddEventHandler("ps-housing:server:addTenantToApartment", function (data) local apartment = data.apartment local targetSrc = tonumber(data.targetSrc) local realtorSrc = data.realtorSrc local targetCitizenid = GetCitizenid(targetSrc, realtorSrc) -- id of current apartment so we can change it local property_id = nil for _, v in pairs(PropertiesTable) do local propertyData = v.propertyData if propertyData.owner == targetCitizenid then if propertyData.apartment == apartment then Framework[Config.Notify].Notify(targetSrc, "Du er allerede i lejligheden", "error") Framework[Config.Notify].Notify(targetSrc, "Denne person er allerede i lejligheden", "error") return elseif #propertyData.apartment > 1 then property_id = propertyData.property_id break end end end local property = Property.Get(property_id) if not property then return end property:UpdateApartment(data) local citizenid = GetCitizenid(targetSrc, realtorSrc) local targetToAdd = QBCore.Functions.GetPlayerByCitizenId(citizenid) local targetPlayer = targetToAdd.PlayerData Framework[Config.Notify].Notify(targetSrc, "Din lejlighed er nu på "..apartment, "success") Framework[Config.Notify].Notify(realtorSrc, "Du har tilføjet ".. targetPlayer.charinfo.firstname .. " " .. targetPlayer.charinfo.lastname .. " til lejligheden "..apartment, "success") end) exports('IsOwner', function(src, property_id) local property = Property.Get(property_id) if not property then return false end local citizenid = GetCitizenid(src, src) return property:CheckForAccess(citizenid) end) function GetCitizenid(targetSrc, callerSrc) local Player = QBCore.Functions.GetPlayer(tonumber(targetSrc)) if not Player then Framework[Config.Notify].Notify(callerSrc, "Person ikke fundet.", "error") return end local PlayerData = Player.PlayerData local citizenid = PlayerData.citizenid return citizenid end function GetCharName(src) local Player = QBCore.Functions.GetPlayer(tonumber(src)) if not Player then return end local PlayerData = Player.PlayerData return PlayerData.charinfo.firstname .. " " .. PlayerData.charinfo.lastname end function GetPlayerData(src) local Player = QBCore.Functions.GetPlayer(tonumber(src)) if not Player then return end local PlayerData = Player.PlayerData return PlayerData end function GetPlayer(src) local Player = QBCore.Functions.GetPlayer(tonumber(src)) if not Player then return end return Player end -- if PSCore then -- PSCore.Functions.CheckForUpdates() -- PSCore.Functions.CheckResourceName() -- end