856 lines
30 KiB
Lua
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)
|