Система недвижимости FiveM: Работа риелтора и продажа недвижимости
Запустите экономику риэлторов на вашем сервере FiveM. Объявления, открытые дома, комиссии и лучшие скрипты недвижимости для серверов QBCore и ESX.
Agency Scripts
Основатель и ведущий разработчик Agency Scripts
Архитектура системы собственности
Система недвижимости превращает ваш сервер FiveM из набора недоступных зданий в живой рынок, где игроки покупают, продают и арендуют дома, квартиры и коммерческие помещения. Архитектура строится вокруг базы данных реестра недвижимости, которая отслеживает каждую доступную собственность с ее локацией, типом, текущим владельцем, рыночной стоимостью и конфигурацией интерьера. В отличие от простых скриптов жилья, позволяющих покупать заранее заданный список объектов, хорошо продуманная система недвижимости включает работу агента по недвижимости, создающего сделки с показами, переговорами и комиссионными. Система должна интегрироваться с ресурсом замков дверей сервера, чтобы владение автоматически давало или отзывал доступ к зданию, а также с системами загрузки интерьеров, такими как кастомные MLO или инстансированные интерьеры. Планируйте три категории недвижимости с самого начала: жилые объекты для жилья игроков, коммерческие объекты для бизнеса игроков и арендные объекты, приносящие пассивный доход владельцам.
База данных собственности и объявления
База данных недвижимости , фундамент, на котором строятся все остальные компоненты. Каждая запись о недвижимости требует обширных метаданных, включая используемый shell или MLO интерьер, координаты входа и выхода, наличие гаража, вместимость хранения и историю цен. Поддерживайте отдельную таблицу листингов, отслеживающую, какие объекты сейчас на рынке, их цену, агента и время листинга. Такое разделение позволяет отслеживать историю рынка и рассчитывать тенденции стоимости недвижимости со временем. Вот схема базы данных, поддерживающая полный жизненный цикл недвижимости:
CREATE TABLE IF NOT EXISTS properties (
id INT AUTO_INCREMENT PRIMARY KEY,
property_id VARCHAR(50) NOT NULL UNIQUE,
label VARCHAR(100) NOT NULL,
property_type ENUM('house', 'apartment', 'commercial', 'penthouse') NOT NULL,
owner VARCHAR(50) DEFAULT NULL,
price INT NOT NULL,
original_price INT NOT NULL,
interior VARCHAR(50) DEFAULT 'standard_1bed',
enter_coords JSON NOT NULL,
exit_coords JSON DEFAULT NULL,
garage_slots INT DEFAULT 0,
stash_slots INT DEFAULT 50,
has_wardrobe TINYINT DEFAULT 1,
is_furnished TINYINT DEFAULT 1,
neighborhood VARCHAR(50) DEFAULT 'downtown',
purchased_at BIGINT DEFAULT NULL,
INDEX idx_owner (owner),
INDEX idx_type (property_type),
INDEX idx_neighborhood (neighborhood)
);
CREATE TABLE IF NOT EXISTS property_listings (
id INT AUTO_INCREMENT PRIMARY KEY,
property_id VARCHAR(50) NOT NULL,
asking_price INT NOT NULL,
listing_agent VARCHAR(50) DEFAULT NULL,
listed_at BIGINT NOT NULL,
status ENUM('active', 'pending', 'sold', 'cancelled') DEFAULT 'active',
buyer VARCHAR(50) DEFAULT NULL,
sold_at BIGINT DEFAULT NULL,
sold_price INT DEFAULT NULL,
INDEX idx_status (status),
INDEX idx_agent (listing_agent)
);
Заполните таблицу недвижимости всеми доступными объектами на вашем сервере во время начальной настройки. Каждый объект должен иметь тщательно установленные координаты точек входа, которые совпадают с положением дверей или зонами взаимодействия. The original_price поле сохраняет базовое значение для рыночных расчетов, в то время как price поле отражает текущую рыночную стоимость, которая меняется в зависимости от спроса в районе, улучшений, сделанных владельцем, и общей экономической ситуации на сервере.
Система работы агента по недвижимости
Работа агента по недвижимости , это место, где человеческий фактор делает систему живой. Агенты выступают посредниками между покупателями и продавцами, проводят показы объектов, ведут переговоры о ценах и получают комиссию с завершённых сделок. Определите уровни работы, открывающие доступ к лучшим листингам: младшие агенты работают с квартирами и малыми домами, старшие , с элитной недвижимостью и коммерческими площадями, а владелец агентства управляет командой и получает долю со всех комиссий. Когда игрок, заинтересованный в покупке, связывается с агентом, агент может инициировать показ, телепортируя обоих игроков внутрь объекта для осмотра. Вот логика показа и сделки:
RegisterNetEvent('realestate:server:startShowing', function(propertyId, buyerId)
local src = source
local Agent = QBCore.Functions.GetPlayer(src)
local Buyer = QBCore.Functions.GetPlayer(buyerId)
if not Agent or not Buyer then return end
if Agent.PlayerData.job.name ~= 'realtor' then return end
local property = MySQL.query.await(
'SELECT * FROM properties WHERE property_id = ? AND owner IS NULL',
{propertyId}
)
if not property or not property[1] then
return TriggerClientEvent('QBCore:Notify', src, 'Property not available', 'error')
end
local prop = property[1]
local enterCoords = json.decode(prop.enter_coords)
-- Teleport both to property
TriggerClientEvent('realestate:client:enterShowing', src, prop, enterCoords)
TriggerClientEvent('realestate:client:enterShowing', buyerId, prop, enterCoords)
TriggerClientEvent('QBCore:Notify', buyerId,
'Showing: ' .. prop.label .. ' - $' .. prop.price, 'info')
end)
RegisterNetEvent('realestate:server:purchaseProperty', function(propertyId, buyerId, agreedPrice)
local src = source
local Agent = QBCore.Functions.GetPlayer(src)
local Buyer = QBCore.Functions.GetPlayer(buyerId)
if not Agent or not Buyer then return end
if Agent.PlayerData.job.name ~= 'realtor' then return end
local property = MySQL.query.await(
'SELECT * FROM properties WHERE property_id = ? AND owner IS NULL',
{propertyId}
)
if not property or not property[1] then return end
if not Buyer.Functions.RemoveMoney('bank', agreedPrice, 'property-purchase') then
return TriggerClientEvent('QBCore:Notify', src, 'Buyer cannot afford this', 'error')
end
local commission = math.floor(agreedPrice * 0.05)
Agent.Functions.AddMoney('bank', commission, 'realtor-commission')
MySQL.update(
'UPDATE properties SET owner = ?, price = ?, purchased_at = ? WHERE property_id = ?',
{Buyer.PlayerData.citizenid, agreedPrice, os.time(), propertyId}
)
MySQL.update(
'UPDATE property_listings SET status = "sold", buyer = ?, sold_at = ?, sold_price = ? WHERE property_id = ? AND status = "active"',
{Buyer.PlayerData.citizenid, os.time(), agreedPrice, propertyId}
)
TriggerClientEvent('QBCore:Notify', src,
'Sale complete! Commission: $' .. commission, 'success')
TriggerClientEvent('QBCore:Notify', buyerId,
'Congratulations! You now own ' .. property[1].label, 'success')
TriggerEvent('doorlock:server:updateProperty', propertyId, Buyer.PlayerData.citizenid)
end)
Комиссионный процент должен быть настраиваемым и потенциально варьироваться в зависимости от уровня агента. Старшие агенты могут получать 7% комиссионных, а младшие , только 3%, что мотивирует карьерный рост в сфере недвижимости. Отслеживайте общий объём продаж и заработанные комиссионные каждого агента в базе данных для создания рейтингов производительности и разблокировки бонусов для лучших сотрудников.
Система ипотеки и финансирования
Большинство игроков не могут позволить себе дорогую недвижимость сразу, поэтому система ипотеки значительно расширяет круг потенциальных покупателей и делает рынок недвижимости доступным для новых игроков. Если покупатель не может оплатить полную стоимость, предложите опцию ипотеки с настраиваемым первоначальным взносом, обычно 10-20% от стоимости недвижимости. Остаток выплачивается регулярными взносами, автоматически списываемыми с банковского счёта игрока при каждом перезапуске сервера или по расписанию. Отслеживайте детали ипотеки, включая основную сумму, процентную ставку, остаток, ежемесячный платёж и историю платежей. Если игрок пропускает слишком много последовательных платежей, запускается процесс изъятия недвижимости с последующим выставлением её на рынок со скидкой. Процентная ставка создаёт реальную стоимость заёмных средств, побуждая игроков погашать ипотеку раньше, а система создаёт стабильный отток денег, что помогает бороться с инфляцией в экономике сервера.
Система дохода от аренды и арендодателя
Игроки, владеющие несколькими объектами недвижимости, должны иметь возможность сдавать их в аренду для пассивного дохода, создавая динамику арендодатель-арендатор, которая генерирует постоянный ролевой процесс. Когда владелец хочет сдать недвижимость, он устанавливает ежемесячную арендную плату и выставляет её на аренду через агентство недвижимости или прямое объявление. Арендаторы получают ключи от объекта и могут пользоваться хранилищем, гардеробом и гаражом на время аренды. Арендная плата собирается автоматически по настраиваемому графику и зачисляется на банковский счёт арендодателя. Вот реализация системы аренды:
Config.RentalSettings = {
minRentPrice = 100,
maxRentPrice = 50000,
collectionInterval = 86400, -- every 24 hours real time
maxMissedPayments = 3,
depositMultiplier = 2, -- security deposit = 2x monthly rent
}
RegisterNetEvent('realestate:server:listForRent', function(propertyId, rentPrice)
local src = source
local Player = QBCore.Functions.GetPlayer(src)
if not Player then return end
local property = MySQL.query.await(
'SELECT * FROM properties WHERE property_id = ? AND owner = ?',
{propertyId, Player.PlayerData.citizenid}
)
if not property or not property[1] then return end
if rentPrice < Config.RentalSettings.minRentPrice or
rentPrice > Config.RentalSettings.maxRentPrice then
return TriggerClientEvent('QBCore:Notify', src, 'Invalid rent price', 'error')
end
MySQL.insert(
'INSERT INTO property_rentals (property_id, landlord, rent_price, deposit, listed_at) VALUES (?, ?, ?, ?, ?)',
{propertyId, Player.PlayerData.citizenid, rentPrice,
rentPrice * Config.RentalSettings.depositMultiplier, os.time()}
)
TriggerClientEvent('QBCore:Notify', src,
'Property listed for rent at $' .. rentPrice .. '/day', 'success')
end)
-- Automated rent collection thread
CreateThread(function()
while true do
Wait(1000 * 60 * 60) -- Check every hour
local rentals = MySQL.query.await(
'SELECT * FROM property_rentals WHERE tenant IS NOT NULL AND status = "active"'
)
for _, rental in ipairs(rentals or {}) do
if os.time() - rental.last_collected >= Config.RentalSettings.collectionInterval then
local success = ProcessRentPayment(rental)
if not success then
HandleMissedPayment(rental)
end
end
end
end
end)
Залог защищает арендодателей от арендаторов, которые портят имущество или уходят без предупреждения. Когда арендатор заканчивает аренду, залог возвращается за вычетом стоимости повреждений. Реализуйте систему состояния имущества, которая отслеживает износ, давая арендодателям законное основание удержать часть залога, если арендатор неаккуратно обращался с имуществом. Это создаёт естественные сценарии разрешения конфликтов, стимулирующие ролевое взаимодействие между арендодателями и арендаторами.
Динамическое ценообразование на рынке
Статичный рынок недвижимости быстро устаревает, как только все желаемые объекты куплены. Динамическое ценообразование поддерживает интерес к рынку, корректируя стоимость недвижимости на основе реальной активности на сервере. Отслеживайте несколько факторов, влияющих на стоимость района: количество недавних продаж в зоне, близость к популярным местам, таким как центры работы и магазины, статистику преступности из полицейской системы и общий коэффициент занятости и пустующих объектов. Когда район пользуется высоким спросом с множеством недавних покупок, стоимость недвижимости постепенно растёт, создавая спекулятивный элемент, при котором ранние покупатели в развивающихся районах получают прибыль по мере развития района. Напротив, районы с высокой преступностью или большим количеством пустующих объектов теряют в стоимости. Запускайте корректировку рынка как запланированную задачу сервера, которая еженедельно пересчитывает все стоимости недвижимости, применяя изменения постепенно, чтобы избежать резких рыночных шоков. Отображайте рыночные тенденции в NUI-панели агентства недвижимости, чтобы агенты и покупатели могли принимать обоснованные решения о вложениях.
Показы собственности и NUI интерфейс
Интерфейс NUI , это место, где агенты и покупатели просматривают доступные объекты недвижимости, изучают детали и начинают сделки. Создайте чистую, профессионально выглядящую страницу списка недвижимости, которая отображает каждый доступный объект с фотографией или превью интерьера, расположением на карте, ценой, количеством комнат, вместимостью гаража и рейтингом района. Включите фильтры и сортировку, чтобы пользователи могли сузить результаты по типу недвижимости, ценовому диапазону и местоположению. Когда агент выбирает объект для показа, система должна показывать маршрут к входу и уведомлять покупателя следовать за ним. Внутри объекта предоставьте интерактивный режим тура, где агент может выделять особенности с помощью 3D-маркеров или текстовых аннотаций. После показа представьте покупателю панель подтверждения покупки или аренды с полным финансовым разбором, включая цену, налоги, комиссию агента и условия ипотеки, если применимо. Интерфейс также должен включать вкладку истории транзакций, где игроки могут просматривать свои прошлые покупки, продажи и арендные платежи для полной финансовой прозрачности.
Настройка собственности и повышение её стоимости
Позволяя владельцам настраивать свои объекты недвижимости, вы добавляете личный штрих и создаёте экономику улучшений, которая со временем увеличивает стоимость недвижимости. Реализуйте систему размещения мебели, позволяющую игрокам покупать и размещать предметы мебели внутри интерьера их собственности, аналогично тому, как GTA Online обрабатывает настройку квартир. Каждая купленная мебель увеличивает улучшенную стоимость объекта, поэтому при последующей продаже владелец возвращает часть инвестиций в мебель. Помимо мебели, предложите структурные улучшения, такие как ремонт кухни, обновление ванной комнаты и установка систем безопасности, которые увеличивают базовую стоимость объекта на определённый процент. Отслеживайте все улучшения в таблице модификаций недвижимости, чтобы объявление о продаже могло показать потенциальным покупателям, какие именно улучшения были сделаны. Коммерческие объекты должны поддерживать бизнес-специфичные улучшения, такие как витрины для магазина, кухонное оборудование для ресторана или серверные стойки для технологической компании, связывая систему недвижимости с более широкой игровой механикой бизнеса. Сочетание рыночной динамики, зависящей от локации, и улучшений, сделанных игроками, создаёт богатую экосистему недвижимости, где недвижимость становится законной стратегией накопления богатства, а не просто местом для хранения предметов и смены одежды.