269 lines
10 KiB
Lua
269 lines
10 KiB
Lua
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
|