System nieruchomości FiveM: Praca pośrednika i sprzedaż nieruchomości
Uruchom gospodarkę nieruchomościami na swoim serwerze FiveM. Oferty, dni otwarte, prowizje i najlepsze skrypty nieruchomości dla serwerów QBCore oraz ESX.
Agency Scripts
Założyciel i główny deweloper w Agency Scripts
Architektura systemu posiadłości
System nieruchomości przekształca twój serwer FiveM ze zbioru niedostępnych budynków w tętniący życiem rynek nieruchomości, na którym gracze kupują, sprzedają i wynajmują domy, mieszkania oraz przestrzenie komercyjne. Architektura skupia się wokół bazy rejestru nieruchomości, która śledzi każdą dostępną nieruchomość na serwerze wraz z jej lokalizacją, typem, obecnym właścicielem, wartością rynkową i konfiguracją wnętrza. W przeciwieństwie do prostych skryptów housing, które pozwalają graczom kupować jedynie z góry ustaloną listę nieruchomości, dobrze zaprojektowany system zawiera pracę agenta nieruchomości, tworzącą transakcje napędzane przez graczy z prezentacjami, negocjacjami i strukturami prowizji. System musi integrować się z zasobem door lock twojego serwera, aby posiadanie nieruchomości automatycznie przyznawało lub cofało dostęp do fizycznego budynku, a także z systemami ładowania wnętrz, takimi jak niestandardowe MLO lub wnętrza instancjonowane. Zaplanuj od początku trzy kategorie nieruchomości: mieszkalne pod domy graczy, komercyjne pod firmy graczy oraz nieruchomości na wynajem generujące dochód pasywny dla właścicieli.
Baza danych i oferty posiadłości
Baza danych nieruchomości to fundament, na którym opierają się wszystkie pozostałe komponenty. Każdy wpis nieruchomości wymaga obszernych metadanych, w tym używanego wnętrza shell lub MLO, współrzędnych wejścia i wyjścia, dostępności garażu, pojemności schowka oraz historii cen. Prowadź osobną tabelę ofert, która śledzi, które nieruchomości są aktualnie na rynku, ich cenę wywoławczą, agenta wystawiającego oraz czas ich wystawienia. Taki podział pozwala śledzić historię rynku i obliczać trendy wartości nieruchomości w czasie. Oto schemat bazy danych, który obsługuje pełny cykl życia nieruchomości:
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)
);
Wypełnij tabelę properties wszystkimi dostępnymi nieruchomościami na swoim serwerze podczas wstępnej konfiguracji. Każda nieruchomość powinna mieć starannie ustawione współrzędne punktów wejścia, dopasowane do pozycji drzwi lub stref interakcji. Ten original_price pole zachowuje wartość bazową do kalkulacji rynkowych, podczas gdy price pole odzwierciedla bieżącą wartość rynkową, która zmienia się w zależności od popytu w danej dzielnicy, ulepszeń wprowadzonych przez właściciela oraz ogólnych warunków ekonomicznych serwera.
System pracy agenta nieruchomości
Praca agenta nieruchomości to miejsce, w którym czynnik ludzki nadaje temu systemowi blasku. Agenci działają jako pośrednicy między kupującymi a sprzedającymi, prezentują nieruchomości, negocjują ceny i zarabiają prowizję od zrealizowanych transakcji. Zdefiniuj stopnie zawodowe odblokowujące coraz lepsze oferty: młodsi agenci obsługują mieszkania i małe domy, starsi agenci mają dostęp do luksusowych posiadłości i lokali użytkowych, a właściciel agencji zarządza zespołem i pobiera część każdej prowizji. Gdy gracz zainteresowany zakupem nieruchomości skontaktuje się z agentem, ten może rozpocząć prezentację, która teleportuje obu graczy do wnętrza nieruchomości na oprowadzanie. Oto logika prezentacji i transakcji sprzedaży:
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)
Stawka prowizji powinna być konfigurowalna i potencjalnie zmienna w zależności od stopnia agenta. Agenci wyższego szczebla mogą zarabiać 7% prowizji, podczas gdy początkujący tylko 3%, co motywuje do awansu zawodowego w pracy agenta nieruchomości. Śledź całkowity wolumen sprzedaży każdego agenta i zarobki z prowizji w bazie danych, aby tworzyć rankingi wyników i odblokowywać bonusy dla najlepszych pracowników.
System hipoteczny i finansowania
Większości graczy nie stać na bezpośredni zakup drogich nieruchomości, więc system kredytów hipotecznych diametralnie zwiększa pulę potencjalnych kupców i otwiera rynek nieruchomości dla nowszych graczy. Gdy kupujący nie może zapłacić pełnej ceny, zaoferuj opcję kredytu hipotecznego wymagającą konfigurowalnego wkładu własnego, zwykle 10-20% wartości nieruchomości. Pozostała kwota jest spłacana w regularnych ratach pobieranych automatycznie z konta bankowego gracza przy każdym restarcie serwera lub w ustalonych odstępach czasu. Śledź szczegóły kredytu, w tym kwotę główną, oprocentowanie, pozostałe saldo, miesięczną kwotę spłaty oraz historię płatności. Jeśli gracz opuści zbyt wiele kolejnych płatności, uruchom proces egzekucji komorniczej, który przejmuje nieruchomość i wystawia ją ponownie na rynek ze zniżką. Oprocentowanie tworzy realny koszt pożyczki, zachęcając graczy do wcześniejszej spłaty kredytu, gdy to możliwe, a system generuje stały odpływ gotówki, pomagając zwalczać inflację w gospodarce serwera.
Dochód z wynajmu i system wynajmującego
Gracze posiadający wiele nieruchomości powinni mieć możliwość ich wynajmowania dla pasywnego dochodu, co tworzy relację między właścicielem a najemcą generującą ciągły roleplay. Kiedy właściciel nieruchomości chce ją wynająć, ustala miesięczną kwotę czynszu i wystawia ofertę przez agencję nieruchomości lub ogłoszenie bezpośrednie. Najemcy otrzymują klucze do posiadłości i mogą korzystać z magazynu, garderoby oraz garażu przez czas trwania najmu. Czynsz jest pobierany automatycznie według konfigurowalnego harmonogramu i trafia na konto bankowe właściciela. Oto implementacja systemu wynajmu:
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)
Kaucja chroni wynajmujących przed najemcami, którzy niszczą nieruchomość lub opuszczają ją bez uprzedzenia. Kiedy najemca kończy najem, kaucja jest zwracana po potrąceniu kosztów za zniszczenia. Zaimplementuj system stanu nieruchomości, który śledzi zużycie, dając właścicielom uzasadniony powód do zatrzymania części kaucji, jeśli najemca nie dbał o lokal. Tworzy to naturalne sytuacje rozwiązywania konfliktów, które napędzają roleplay między właścicielami a najemcami.
Dynamiczne ceny rynkowe
Statyczny rynek nieruchomości szybko staje się nudny, gdy wszystkie pożądane nieruchomości zostaną wykupione. Dynamiczne ustalanie cen utrzymuje atrakcyjność rynku, dostosowując wartości nieruchomości na podstawie realnej aktywności na serwerze. Śledź kilka czynników wpływających na wartość okolicy: liczbę niedawnych transakcji sprzedaży w danym rejonie, bliskość popularnych miejsc, takich jak centra pracy i sklepy, statystyki przestępczości z systemu policji oraz ogólny stosunek zamieszkanych nieruchomości do pustostanów. Gdy na daną okolicę jest duży popyt i odnotowano wiele niedawnych zakupów, wartości nieruchomości stopniowo rosną, tworząc element spekulacji, w którym wcześni nabywcy w rozwijających się obszarach zyskują wraz z rozwojem dzielnicy. I odwrotnie: obszary o wysokiej przestępczości lub dzielnice z wieloma pustostanami odnotowują spadek wartości. Uruchamiaj korektę rynku jako zaplanowane zadanie serwera, które co tydzień przelicza wszystkie wartości nieruchomości, wprowadzając zmiany stopniowo, aby uniknąć nagłych szoków rynkowych. Wyświetlaj trendy rynkowe w panelu NUI agencji nieruchomości, aby agenci i kupujący mogli podejmować świadome decyzje o inwestycjach.
Prezentacje posiadłości i interfejs NUI
Interfejs NUI to miejsce, w którym agenci i kupujący przeglądają dostępne nieruchomości, sprawdzają szczegóły i rozpoczynają transakcje. Zbuduj przejrzystą, profesjonalnie wyglądającą listę ofert, która wyświetla każdą dostępną nieruchomość ze zdjęciem lub podglądem wnętrza, lokalizacją na mapie, ceną, liczbą pokoi, pojemnością garażu i oceną okolicy. Uwzględnij opcje filtrowania i sortowania, aby użytkownicy mogli zawężać wyniki według typu nieruchomości, przedziału cenowego i lokalizacji. Gdy agent wybierze nieruchomość do prezentacji, system powinien wyznaczyć trasę do wejścia i powiadomić kupującego, aby za nim podążał. Wewnątrz nieruchomości zapewnij tryb interaktywnego oprowadzania, w którym agent może wyróżniać elementy za pomocą znaczników 3D lub adnotacji tekstowych. Po prezentacji wyświetl kupującemu panel potwierdzenia zakupu lub wynajmu, zawierający pełne rozliczenie finansowe: cenę, podatki, prowizję agenta oraz ewentualne warunki kredytu hipotecznego. Interfejs powinien również zawierać zakładkę historii transakcji, w której gracze mogą przeglądać swoje wcześniejsze zakupy, sprzedaże i opłaty za wynajem w celu zachowania pełnej przejrzystości finansowej.
Personalizacja posiadłości i wzrost ich wartości
Możliwość personalizacji posiadłości przez właścicieli dodaje osobistego charakteru i tworzy ekonomię ulepszeń, która z czasem zwiększa wartość nieruchomości. Wdróż system stawiania mebli, który pozwala graczom kupować i rozmieszczać meble we wnętrzu ich posiadłości, podobnie jak rozwiązano personalizację apartamentów w GTA Online. Każdy zakupiony mebel podnosi ulepszoną wartość nieruchomości, dzięki czemu właściciel przy ewentualnej sprzedaży odzyskuje część zainwestowanych środków. Oprócz mebli zaoferuj ulepszenia strukturalne, takie jak remont kuchni, przebudowa łazienki czy montaż systemu bezpieczeństwa, które procentowo zwiększają bazową wartość nieruchomości. Zapisuj wszystkie ulepszenia w tabeli modyfikacji nieruchomości, aby oferta sprzedaży mogła pokazać potencjalnym nabywcom, jakie dokładnie modyfikacje zostały wprowadzone. Nieruchomości komercyjne powinny obsługiwać ulepszenia dedykowane dla biznesu, takie jak gabloty w sklepie, wyposażenie kuchni w restauracji czy szafy serwerowe w firmie technologicznej, łącząc system posiadłości z szerszą pętlą rozgrywki biznesowej. Połączenie dynamiki rynkowej opartej na lokalizacji z ulepszeniami tworzonymi przez graczy tworzy bogaty ekosystem nieruchomości, w którym stają się one realną strategią budowania majątku, a nie tylko miejscem do przechowywania przedmiotów i zmiany ubrań.