Scripts/resources/[ps]/ps-housing/server/sv_property.lua
2024-12-29 21:28:24 +01:00

856 lines
30 KiB
Lua

Property = {
property_id = nil,
propertyData = nil,
playersInside = {}, -- src
playersDoorbell = {}, -- src
raiding = false,
}
Property.__index = Property
function Property:new(propertyData)
local self = setmetatable({}, Property)
self.property_id = tostring(propertyData.property_id)
self.propertyData = propertyData
local stashName = string.format("property_%s", propertyData.property_id)
local stashConfig = Config.Shells[propertyData.shell].stash
Framework[Config.Inventory].RegisterInventory(stashName, propertyData.street or propertyData.apartment or stashName, stashConfig)
return self
end
function Property:PlayerEnter(src)
local _src = tostring(src)
self.playersInside[_src] = true
TriggerClientEvent('qb-weathersync:client:DisableSync', src)
TriggerClientEvent('ps-housing:client:enterProperty', src, self.property_id)
if next(self.playersDoorbell) then
TriggerClientEvent("ps-housing:client:updateDoorbellPool", src, self.property_id, self.playersDoorbell)
if self.playersDoorbell[_src] then
self.playersDoorbell[_src] = nil
end
end
local citizenid = GetCitizenid(src)
if self:CheckForAccess(citizenid) then
local Player = QBCore.Functions.GetPlayer(src)
local insideMeta = Player.PlayerData.metadata["inside"]
insideMeta.property_id = self.property_id
Player.Functions.SetMetaData("inside", insideMeta)
end
local bucket = tonumber(self.property_id) -- because the property_id is a string
SetPlayerRoutingBucket(src, bucket)
end
function Property:PlayerLeave(src)
local _src = tostring(src)
self.playersInside[_src] = nil
TriggerClientEvent('qb-weathersync:client:EnableSync', src)
local citizenid = GetCitizenid(src)
if self:CheckForAccess(citizenid) then
local Player = QBCore.Functions.GetPlayer(src)
local insideMeta = Player.PlayerData.metadata["inside"]
insideMeta.property_id = nil
Player.Functions.SetMetaData("inside", insideMeta)
end
SetPlayerRoutingBucket(src, 0)
end
function Property:CheckForAccess(citizenid)
if self.propertyData.owner == citizenid then return true end
return lib.table.contains(self.propertyData.has_access, citizenid)
end
function Property:AddToDoorbellPoolTemp(src)
local _src = tostring(src)
local name = GetCharName(src)
self.playersDoorbell[_src] = {
src = src,
name = name
}
for src, _ in pairs(self.playersInside) do
local targetSrc = tonumber(src)
Framework[Config.Notify].Notify(targetSrc, "Der er gæster ved døren.", "info")
TriggerClientEvent("ps-housing:client:updateDoorbellPool", targetSrc, self.property_id, self.playersDoorbell)
end
Framework[Config.Notify].Notify(src, "Du har ringet på dørklokken...", "info")
SetTimeout(10000, function()
if self.playersDoorbell[_src] then
self.playersDoorbell[_src] = nil
Framework[Config.Notify].Notify(src, "Ingen åbnede døren.", "error")
end
for src, _ in pairs(self.playersInside) do
local targetSrc = tonumber(src)
TriggerClientEvent("ps-housing:client:updateDoorbellPool", targetSrc, self.property_id, self.playersDoorbell)
end
end)
end
function Property:RemoveFromDoorbellPool(src)
local _src = tostring(src)
if self.playersDoorbell[_src] then
self.playersDoorbell[_src] = nil
end
for src, _ in pairs(self.playersInside) do
local targetSrc = tonumber(src)
TriggerClientEvent("ps-housing:client:updateDoorbellPool", targetSrc, self.property_id, self.playersDoorbell)
end
end
function Property:StartRaid()
self.raiding = true
for src, _ in pairs(self.playersInside) do
local targetSrc = tonumber(src)
Framework[Config.Notify].Notify(targetSrc, "Denne ejendom bliver ransaget.", "error")
end
SetTimeout(Config.RaidTimer * 60000, function()
self.raiding = false
end)
end
function Property:UpdateFurnitures(furnitures)
self.propertyData.furnitures = furnitures
MySQL.update("UPDATE properties SET furnitures = @furnitures WHERE property_id = @property_id", {
["@furnitures"] = json.encode(furnitures),
["@property_id"] = self.property_id
})
for src, _ in pairs(self.playersInside) do
local targetSrc = tonumber(src)
TriggerClientEvent("ps-housing:client:updateFurniture", targetSrc, self.property_id, furnitures)
end
end
function Property:UpdateDescription(data)
local description = data.description
local realtorSrc = data.realtorSrc
if self.propertyData.description == description then return end
self.propertyData.description = description
MySQL.update("UPDATE properties SET description = @description WHERE property_id = @property_id", {
["@description"] = description,
["@property_id"] = self.property_id
})
TriggerClientEvent("ps-housing:client:updateProperty", -1, "UpdateDescription", self.property_id, description)
Framework[Config.Logs].SendLog("**Changed Description** of property with id: " .. self.property_id .. " by: " .. GetPlayerName(realtorSrc))
Debug("Changed Description of property with id: " .. self.property_id, "by: " .. GetPlayerName(realtorSrc))
end
function Property:UpdatePrice(data)
local price = data.price
local realtorSrc = data.realtorSrc
if self.propertyData.price == price then return end
self.propertyData.price = price
MySQL.update("UPDATE properties SET price = @price WHERE property_id = @property_id", {
["@price"] = price,
["@property_id"] = self.property_id
})
TriggerClientEvent("ps-housing:client:updateProperty", -1, "UpdatePrice", self.property_id, price)
Framework[Config.Logs].SendLog("**Changed Price** of property with id: " .. self.property_id .. " by: " .. GetPlayerName(realtorSrc))
Debug("Changed Price of property with id: " .. self.property_id, "by: " .. GetPlayerName(realtorSrc))
end
function Property:UpdateForSale(data)
local forsale = data.forsale
local realtorSrc = data.realtorSrc
self.propertyData.for_sale = forsale
MySQL.update("UPDATE properties SET for_sale = @for_sale WHERE property_id = @property_id", {
["@for_sale"] = forsale and 1 or 0,
["@property_id"] = self.property_id
})
TriggerClientEvent("ps-housing:client:updateProperty", -1, "UpdateForSale", self.property_id, forsale)
Framework[Config.Logs].SendLog("**Changed For Sale** of property with id: " .. self.property_id .. " by: " .. GetPlayerName(realtorSrc))
Debug("Changed For Sale of property with id: " .. self.property_id, "by: " .. GetPlayerName(realtorSrc))
end
function Property:UpdateShell(data)
local shell = data.shell
local realtorSrc = data.realtorSrc
if self.propertyData.shell == shell then return end
self.propertyData.shell = shell
MySQL.update("UPDATE properties SET shell = @shell WHERE property_id = @property_id", {
["@shell"] = shell,
["@property_id"] = self.property_id
})
TriggerClientEvent("ps-housing:client:updateProperty", -1, "UpdateShell", self.property_id, shell)
Framework[Config.Logs].SendLog("**Changed Shell** of property with id: " .. self.property_id .. " by: " .. GetPlayerName(realtorSrc))
Debug("Changed Shell of property with id: " .. self.property_id, "by: " .. GetPlayerName(realtorSrc))
end
function Property:UpdateOwner(data)
local targetSrc = data.targetSrc
local realtorSrc = data.realtorSrc
if not realtorSrc then Debug("No Realtor Src found") return end
if not targetSrc then Debug("No Target Src found") return end
local previousOwner = self.propertyData.owner
local targetPlayer = QBCore.Functions.GetPlayer(tonumber(targetSrc))
local PlayerData = targetPlayer.PlayerData
local bank = PlayerData.money.bank
local citizenid = PlayerData.citizenid
if self.propertyData.owner == citizenid then
Framework[Config.Notify].Notify(targetSrc, "Du ejer allerede denne ejendom", "error")
Framework[Config.Notify].Notify(realtorSrc, "Kunden ejer allerede denne ejendom", "error")
return
end
--add callback
local targetAllow = lib.callback.await("ps-housing:cb:confirmPurchase", targetSrc, self.propertyData.price, self.propertyData.street, self.propertyData.property_id)
if targetAllow ~= "confirm" then
Framework[Config.Notify].Notify(targetSrc, "Du bekræftede ikke købet", "info")
Framework[Config.Notify].Notify(realtorSrc, "Kunden bekræftede ikke købet", "error")
return
end
if bank < self.propertyData.price then
Framework[Config.Notify].Notify(targetSrc, "Du har ikke nok penge i banken", "error")
Framework[Config.Notify].Notify(realtorSrc, "Kunden har ikke nok penge i banken", "error")
return
end
targetPlayer.Functions.RemoveMoney('bank', self.propertyData.price, "Købte ejendom: " .. self.propertyData.street .. " " .. self.property_id)
local prevPlayer = QBCore.Functions.GetPlayerByCitizenId(previousOwner)
local realtor = QBCore.Functions.GetPlayer(tonumber(realtorSrc))
local realtorGradeLevel = realtor.PlayerData.job.grade.level
local commission = math.floor(self.propertyData.price * Config.Commissions[realtorGradeLevel])
local totalAfterCommission = self.propertyData.price - commission
if prevPlayer ~= nil then
Framework[Config.Notify].Notify(prevPlayer.PlayerData.source, "Ejendom solgt: " .. self.propertyData.street .. " " .. self.property_id, "success")
prevPlayer.Functions.AddMoney('bank', totalAfterCommission, "Solgte ejendom: " .. self.propertyData.street .. " " .. self.property_id)
elseif previousOwner then
MySQL.Async.execute('UPDATE `players` SET `bank` = `bank` + @price WHERE `citizenid` = @citizenid', {
['@citizenid'] = previousOwner,
['@price'] = totalAfterCommission
})
end
realtor.Functions.AddMoney('bank', commission, "Kommission fra ejendom: " .. self.propertyData.street .. " " .. self.property_id)
self.propertyData.owner = citizenid
MySQL.update("UPDATE properties SET owner_citizenid = @owner_citizenid, for_sale = @for_sale WHERE property_id = @property_id", {
["@owner_citizenid"] = citizenid,
["@for_sale"] = 0,
["@property_id"] = self.property_id
})
self.propertyData.furnitures = {} -- to be fetched on enter
TriggerClientEvent("ps-housing:client:updateProperty", -1, "UpdateOwner", self.property_id, citizenid)
Framework[Config.Logs].SendLog("**House Bought** by: **"..PlayerData.charinfo.firstname.." "..PlayerData.charinfo.lastname.."** for $"..self.propertyData.price.." from **"..realtor.PlayerData.charinfo.firstname.." "..realtor.PlayerData.charinfo.lastname.."** !")
Framework[Config.Notify].Notify(targetSrc, "Du har købt ejendommen for "..self.propertyData.price..",-", "success")
Framework[Config.Notify].Notify(realtorSrc, "Kunden har købt ejendommen for "..self.propertyData.price..",-", "success")
end
function Property:UpdateImgs(data)
local imgs = data.imgs
local realtorSrc = data.realtorSrc
self.propertyData.imgs = imgs
MySQL.update("UPDATE properties SET extra_imgs = @extra_imgs WHERE property_id = @property_id", {
["@extra_imgs"] = json.encode(imgs),
["@property_id"] = self.property_id
})
TriggerClientEvent("ps-housing:client:updateProperty", -1, "UpdateImgs", self.property_id, imgs)
Framework[Config.Logs].SendLog("**Changed Images** of property with id: " .. self.property_id .. " by: " .. GetPlayerName(realtorSrc))
Debug("Changed Imgs of property with id: " .. self.property_id, "by: " .. GetPlayerName(realtorSrc))
end
function Property:UpdateDoor(data)
local door = data.door
if not door then return end
local realtorSrc = data.realtorSrc
local newDoor = {
x = math.floor(door.x * 10000) / 10000,
y = math.floor(door.y * 10000) / 10000,
z = math.floor(door.z * 10000) / 10000,
h = math.floor(door.h * 10000) / 10000,
length = door.length or 1.5,
width = door.width or 2.2,
locked = door.locked or false,
}
self.propertyData.door_data = newDoor
self.propertyData.street = data.street
self.propertyData.region = data.region
MySQL.update("UPDATE properties SET door_data = @door, street = @street, region = @region WHERE property_id = @property_id", {
["@door"] = json.encode(newDoor),
["@property_id"] = self.property_id,
["@street"] = data.street,
["@region"] = data.region
})
TriggerClientEvent("ps-housing:client:updateProperty", -1, "UpdateDoor", self.property_id, newDoor, data.street, data.region)
Framework[Config.Logs].SendLog("**Changed Door** of property with id: " .. self.property_id .. " by: " .. GetPlayerName(realtorSrc))
Debug("Changed Door of property with id: " .. self.property_id, "by: " .. GetPlayerName(realtorSrc))
end
function Property:UpdateHas_access(data)
local has_access = data or {}
self.propertyData.has_access = has_access
MySQL.update("UPDATE properties SET has_access = @has_access WHERE property_id = @property_id", {
["@has_access"] = json.encode(has_access), --Array of cids
["@property_id"] = self.property_id
})
TriggerClientEvent("ps-housing:client:updateProperty", -1, "UpdateHas_access", self.property_id, has_access)
Debug("Changed Has Access of property with id: " .. self.property_id)
end
function Property:UpdateGarage(data)
local garage = data.garage
local realtorSrc = data.realtorSrc
local newData = {}
if data ~= nil then
newData = {
x = math.floor(garage.x * 10000) / 10000,
y = math.floor(garage.y * 10000) / 10000,
z = math.floor(garage.z * 10000) / 10000,
h = math.floor(garage.h * 10000) / 10000,
length = garage.length or 3.0,
width = garage.width or 5.0,
}
end
self.propertyData.garage_data = newData
MySQL.update("UPDATE properties SET garage_data = @garageCoords WHERE property_id = @property_id", {
["@garageCoords"] = json.encode(newData),
["@property_id"] = self.property_id
})
TriggerClientEvent("ps-housing:client:updateProperty", -1, "UpdateGarage", self.property_id, garage)
Framework[Config.Logs].SendLog("**Changed Garage** of property with id: " .. self.property_id .. " by: " .. GetPlayerName(realtorSrc))
Debug("Changed Garage of property with id: " .. self.property_id, "by: " .. GetPlayerName(realtorSrc))
end
function Property:UpdateApartment(data)
local apartment = data.apartment
local realtorSrc = data.realtorSrc
local targetSrc = data.targetSrc
self.propertyData.apartment = apartment
MySQL.update("UPDATE properties SET apartment = @apartment WHERE property_id = @property_id", {
["@apartment"] = apartment,
["@property_id"] = self.property_id
})
Framework[Config.Notify].Notify(realtorSrc, "Ændrede lejligheden for ejendommen med ID: " .. self.property_id .." til ".. apartment, "success")
Framework[Config.Notify].Notify(targetSrc, "Ændrede lejlighed til " .. apartment, "success")
Framework[Config.Logs].SendLog("**Changed Apartment** with id: " .. self.property_id .. " by: **" .. GetPlayerName(realtorSrc) .. "** for **" .. GetPlayerName(targetSrc) .."**")
TriggerClientEvent("ps-housing:client:updateProperty", -1, "UpdateApartment", self.property_id, apartment)
Debug("Changed Apartment of property with id: " .. self.property_id, "by: " .. GetPlayerName(realtorSrc))
end
function Property:DeleteProperty(data)
local realtorSrc = data.realtorSrc
local propertyid = self.property_id
local realtorName = GetPlayerName(realtorSrc)
MySQL.Async.execute("DELETE FROM properties WHERE property_id = @property_id", {
["@property_id"] = propertyid
}, function (rowsChanged)
if rowsChanged > 0 then
Debug("Deleted property with id: " .. propertyid, "by: " .. realtorName)
end
end)
TriggerClientEvent("ps-housing:client:removeProperty", -1, propertyid)
Framework[Config.Notify].Notify(realtorSrc, "Ejendommen med id: " .. propertyid .." blev fjernet.", "info")
Framework[Config.Logs].SendLog("**Property Deleted** with id: " .. propertyid .. " by: " .. realtorName)
PropertiesTable[propertyid] = nil
self = nil
Debug("Deleted property with id: " .. propertyid, "by: " .. realtorName)
end
function Property.Get(property_id)
return PropertiesTable[tostring(property_id)]
end
RegisterNetEvent('ps-housing:server:enterProperty', function (property_id)
local src = source
Debug("Player is trying to enter property", property_id)
local property = Property.Get(property_id)
if not property then
Debug("Properties returned", json.encode(PropertiesTable, {indent = true}))
return
end
local citizenid = GetCitizenid(src)
if property:CheckForAccess(citizenid) then
Debug("Player has access to property")
property:PlayerEnter(src)
Debug("Player entered property")
return
end
local ringDoorbellConfirmation = lib.callback.await('ps-housing:cb:ringDoorbell', src)
if ringDoorbellConfirmation == "confirm" then
property:AddToDoorbellPoolTemp(src)
Debug("Ringing doorbell")
return
end
end)
RegisterNetEvent("ps-housing:server:showcaseProperty", function(property_id)
local src = source
local property = Property.Get(property_id)
if not property then
Debug("Properties returned", json.encode(PropertiesTable, {indent = true}))
return
end
local PlayerData = GetPlayerData(src)
local job = PlayerData.job
local jobName = job.name
local onDuty = job.onduty
if jobName == Config.RealtorJobName and onDuty then
local showcase = lib.callback.await('ps-housing:cb:showcase', src)
if showcase == "confirm" then
property:PlayerEnter(src)
return
end
end
end)
RegisterNetEvent('ps-housing:server:raidProperty', function(property_id)
local src = source
Debug("Player is trying to raid property", property_id)
local property = Property.Get(property_id)
if not property then
Debug("Properties returned", json.encode(PropertiesTable, {indent = true}))
return
end
local Player = QBCore.Functions.GetPlayer(src)
if not Player then return end
local PlayerData = Player.PlayerData
local job = PlayerData.job
local jobName = job.name
local gradeAllowed = tonumber(job.grade.level) >= Config.MinGradeToRaid
local onDuty = job.onduty
local raidItem = Config.RaidItem
-- Check if the police officer has the "stormram" item
local hasStormRam = (Config.Inventory == "ox" and exports.ox_inventory:Search(src, "count", raidItem) > 0) or Player.Functions.GetItemByName(raidItem)
local isAllowedToRaid = PoliceJobs[jobName] and onDuty and gradeAllowed
if isAllowedToRaid then
if hasStormRam then
if not property.raiding then
local confirmRaid = lib.callback.await('ps-housing:cb:confirmRaid', src, (property.propertyData.street or property.propertyData.apartment) .. " " .. property.property_id, property_id)
if confirmRaid == "confirm" then
property:StartRaid(src)
property:PlayerEnter(src)
Framework[Config.Notify].Notify(src, "Ransagning startet", "success")
if Config.ConsumeRaidItem then
-- Remove the "stormram" item from the officer's inventory
if Config.Inventory == 'ox' then
exports.ox_inventory:RemoveItem(src, raidItem, 1)
else
Player.Functions.RemoveItem(raidItem, 1)
TriggerClientEvent("inventory:client:ItemBox", src, QBCore.Shared.Items[raidItem], "remove")
TriggerEvent("inventory:server:RemoveItem", src, raidItem, 1)
end
end
end
else
Framework[Config.Notify].Notify(src, "Ransagning igang", "success")
property:PlayerEnter(src)
end
else
Framework[Config.Notify].Notify(src, "Du skal bruge en rambuk for at starte en ransagning", "error")
end
else
if not PoliceJobs[jobName] then
Framework[Config.Notify].Notify(src, "Kun politiet kan starte ransagninger", "error")
elseif not onDuty then
Framework[Config.Notify].Notify(src, "Du skal være på arbejde for at kunne starte en ransagning", "error")
elseif not gradeAllowed then
Framework[Config.Notify].Notify(src, "Du har ikke høj nok stilling, til at kunne starte en ransagnings", "error")
end
end
end)
lib.callback.register('ps-housing:cb:getFurnitures', function(source, property_id)
local property = Property.Get(property_id)
if not property then return end
return property.propertyData.furnitures or {}
end)
lib.callback.register('ps-housing:cb:getPlayersInProperty', function(source, property_id)
local property = Property.Get(property_id)
if not property then return end
local players = {}
for src, _ in pairs(property.playersInside) do
local targetSrc = tonumber(src)
if targetSrc ~= source then
local name = GetCharName(targetSrc)
players[#players + 1] = {
src = targetSrc,
name = name
}
end
end
return players or {}
end)
RegisterNetEvent('ps-housing:server:leaveProperty', function (property_id)
local src = source
local property = Property.Get(property_id)
if not property then return end
property:PlayerLeave(src)
end)
-- When player presses doorbell, owner can let them in and this is what is triggered
RegisterNetEvent("ps-housing:server:doorbellAnswer", function (data)
local src = source
local targetSrc = data.targetSrc
local property = Property.Get(data.property_id)
if not property then return end
if not property.playersInside[tostring(src)] then return end
property:RemoveFromDoorbellPool(targetSrc)
property:PlayerEnter(targetSrc)
end)
--@@ NEED TO REDO THIS DOG SHIT
-- I think its not bad anymore but if u got a better idea lmk
RegisterNetEvent("ps-housing:server:buyFurniture", function(property_id, items, price)
local src = source
local citizenid = GetCitizenid(src)
local PlayerData = GetPlayerData(src)
local Player = GetPlayer(src)
-- ik ik, i cbf rn. if your reading this and its still shit, tell me
local property = Property.Get(property_id)
if not property then return end
if not property:CheckForAccess(citizenid) then return end
local price = tonumber(price)
if price > PlayerData.money.bank and price > PlayerData.money.cash then
Framework[Config.Notify].Notify(src, "Du har ikke råd!", "error")
return
end
if price <= PlayerData.money.cash then
Player.Functions.RemoveMoney('cash', price, "Købte møbler")
else
Player.Functions.RemoveMoney('bank', price, "Købte møbler")
end
local numFurnitures = #property.propertyData.furnitures
for i = 1, #items do
numFurnitures = numFurnitures + 1
property.propertyData.furnitures[numFurnitures] = items[i]
end
property:UpdateFurnitures(property.propertyData.furnitures)
Framework[Config.Notify].Notify(src, "Du købte møbler for " .. price..",-", "success")
Framework[Config.Logs].SendLog("**Player ".. GetPlayerName(src) .. "** bought furniture for **$" .. price .. "**")
Debug("Player bought furniture for $" .. price, "by: " .. GetPlayerName(src))
end)
RegisterNetEvent("ps-housing:server:removeFurniture", function(property_id, itemid)
local src = source
local property = Property.Get(property_id)
if not property then return end
local citizenid = GetCitizenid(src)
if not property:CheckForAccess(citizenid) then return end
local currentFurnitures = property.propertyData.furnitures
for k, v in pairs(currentFurnitures) do
if v.id == itemid then
table.remove(currentFurnitures, k)
break
end
end
property:UpdateFurnitures(currentFurnitures)
end)
-- @@ VERY BAD
-- I think its not bad anymore but if u got a better idea lmk
RegisterNetEvent("ps-housing:server:updateFurniture", function(property_id, item)
local src = source
local property = Property.Get(property_id)
if not property then return end
local citizenid = GetCitizenid(src)
if not property:CheckForAccess(citizenid) then return end
local currentFurnitures = property.propertyData.furnitures
for k, v in pairs(currentFurnitures) do
if v.id == item.id then
currentFurnitures[k] = item
Debug("Updated furniture", json.encode(item))
break
end
end
property:UpdateFurnitures(currentFurnitures)
end)
RegisterNetEvent("ps-housing:server:addAccess", function(property_id, srcToAdd)
local src = source
local citizenid = GetCitizenid(src)
local property = Property.Get(property_id)
if not property then return end
if not property.propertyData.owner == citizenid then
-- hacker ban or something
Framework[Config.Notify].Notify(src, "Du ejer ikke ejendommen!", "error")
return
end
local has_access = property.propertyData.has_access
local targetCitizenid = GetCitizenid(srcToAdd)
local targetPlayer = GetPlayerData(srcToAdd)
if not property:CheckForAccess(targetCitizenid) then
has_access[#has_access+1] = targetCitizenid
property:UpdateHas_access(has_access)
Framework[Config.Notify].Notify(src, "Du gav adgang til " .. targetPlayer.charinfo.firstname .. " " .. targetPlayer.charinfo.lastname, "success")
Framework[Config.Notify].Notify(srcToAdd, "Du fik adgang til ejendommen!", "success")
else
Framework[Config.Notify].Notify(src, "Personen har allerede adgang til ejendommen!", "error")
end
end)
RegisterNetEvent("ps-housing:server:removeAccess", function(property_id, citizenidToRemove)
local src = source
local citizenid = GetCitizenid(src)
local property = Property.Get(property_id)
if not property then return end
if not property.propertyData.owner == citizenid then
-- hacker ban or something
Framework[Config.Notify].Notify(src, "Du er ikke ejer af ejendommen!", "error")
return
end
local has_access = property.propertyData.has_access
local citizenidToRemove = citizenidToRemove
if property:CheckForAccess(citizenidToRemove) then
for i = 1, #has_access do
if has_access[i] == citizenidToRemove then
table.remove(has_access, i)
break
end
end
property:UpdateHas_access(has_access)
local playerToAdd = QBCore.Functions.GetPlayerByCitizenId(citizenidToRemove) or QBCore.Functions.GetOfflinePlayerByCitizenId(citizenidToRemove)
local removePlayerData = playerToAdd.PlayerData
local srcToRemove = removePlayerData.source
Framework[Config.Notify].Notify(src, "Du fjernede adgangen for " .. removePlayerData.charinfo.firstname .. " " .. removePlayerData.charinfo.lastname, "success")
if srcToRemove then
Framework[Config.Notify].Notify(srcToRemove, "Du mistede adgangen til " .. (property.propertyData.street or property.propertyData.apartment) .. " " .. property.property_id, "error")
end
else
Framework[Config.Notify].Notify(src, "Denne person har ikke adgang til ejendommen!", "error")
end
end)
lib.callback.register("ps-housing:cb:getPlayersWithAccess", function (source, property_id)
local src = source
local citizenidSrc = GetCitizenid(src)
local property = Property.Get(property_id)
if not property then return end
if property.propertyData.owner ~= citizenidSrc then return end
local withAccess = {}
local has_access = property.propertyData.has_access
for i = 1, #has_access do
local citizenid = has_access[i]
local Player = QBCore.Functions.GetPlayerByCitizenId(citizenid) or QBCore.Functions.GetOfflinePlayerByCitizenId(citizenid)
if Player then
withAccess[#withAccess + 1] = {
citizenid = citizenid,
name = Player.PlayerData.charinfo.firstname .. " " .. Player.PlayerData.charinfo.lastname
}
end
end
return withAccess
end)
lib.callback.register('ps-housing:cb:getPropertyInfo', function (source, property_id)
local src = source
local property = Property.Get(property_id)
if not property then return end
local PlayerData = GetPlayerData(src)
local job = PlayerData.job
local jobName = job.name
local onDuty = job.onduty
if not jobName == Config.RealtorJobName and not onDuty then return end
local data = {}
local ownerPlayer, ownerName
local ownerCid = property.propertyData.owner
if ownerCid then
ownerPlayer = QBCore.Functions.GetPlayerByCitizenId(ownerCid) or QBCore.Functions.GetOfflinePlayerByCitizenId(ownerCid)
ownerName = ownerPlayer.PlayerData.charinfo.firstname .. " " .. ownerPlayer.PlayerData.charinfo.lastname
else
ownerName = "Ingen ejer"
end
data.owner = ownerName
data.street = property.propertyData.street
data.region = property.propertyData.region
data.description = property.propertyData.description
data.for_sale = property.propertyData.for_sale
data.price = property.propertyData.price
data.shell = property.propertyData.shell
data.property_id = property.property_id
return data
end)
RegisterNetEvent('ps-housing:server:resetMetaData', function()
local src = source
local Player = QBCore.Functions.GetPlayer(src)
local insideMeta = Player.PlayerData.metadata["inside"]
insideMeta.property_id = nil
Player.Functions.SetMetaData("inside", insideMeta)
end)