FiveM-Immobiliensystem: Maklerjobs und Immobilienverkäufe
Starte eine Maklerwirtschaft auf deinem FiveM-Server. Inserate, Besichtigungstermine, Provisionen und die besten Immobilienskripte für QBCore- und ESX-Server.
Agency Scripts
Gründer und leitender Entwickler bei Agency Scripts
Architektur des Immobiliensystems
Ein Immobiliensystem verwandelt deinen FiveM-Server von einer Sammlung unzugänglicher Gebäude in einen lebendigen Immobilienmarkt, auf dem Spieler Häuser, Wohnungen und Gewerbeflächen kaufen, verkaufen und mieten. Die Architektur basiert auf einer Immobiliendatenbank, die jede verfügbare Immobilie auf dem Server mit Standort, Typ, aktuellem Eigentümer, Marktwert und Innenraumkonfiguration erfasst. Anders als einfache Housing-Scripts, mit denen Spieler nur eine vorgegebene Liste von Immobilien kaufen können, umfasst ein gut entwickeltes Immobiliensystem einen Immobilienmakler-Job, der von Spielern getragene Transaktionen mit Besichtigungen, Verhandlungen und Provisionsmodellen ermöglicht. Das System muss in die Türschloss-Ressource deines Servers integriert werden, damit der Besitz einer Immobilie den Zugang zum Gebäude automatisch gewährt oder entzieht, sowie in Interior-Ladesysteme wie benutzerdefinierte MLOs oder instanzierte Innenräume. Plane von Anfang an drei Immobilienkategorien ein: Wohnimmobilien als Spielerunterkünfte, Gewerbeimmobilien für Unternehmen im Besitz von Spielern und Mietimmobilien, die passives Einkommen für Vermieter generieren.
Immobiliendatenbank und Angebote
Die Immobiliendatenbank ist die Grundlage, auf der alle anderen Komponenten aufbauen. Jeder Immobiliendatensatz benötigt umfangreiche Metadaten, darunter die verwendete Shell oder das MLO-Interior, die Ein- und Ausgangskoordinaten, verfügbare Garagen, Lagerkapazität und Preisverlauf. Führe eine separate Angebotstabelle, in der erfasst wird, welche Immobilien aktuell auf dem Markt sind, welchen Angebotspreis sie haben, welcher Makler sie betreut und wie lange sie bereits angeboten werden. Durch diese Trennung kannst du die Marktentwicklung nachverfolgen und Trends beim Immobilienwert im Zeitverlauf berechnen. Hier ist ein Datenbankschema, das den gesamten Immobilienzyklus abbildet:
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)
);
Befülle die Tabelle „properties“ bei der Ersteinrichtung mit allen verfügbaren Immobilien auf deinem Server. Für jede Immobilie sollten die Koordinaten der Eingänge sorgfältig festgelegt werden, damit sie mit den Türpositionen oder Interaktionszonen übereinstimmen. Das original_price -Feld speichert den Basiswert für Marktberechnungen, während das price -Feld den aktuellen Marktwert widerspiegelt, der sich je nach Nachfrage im Viertel, Verbesserungen durch den Eigentümer und der allgemeinen wirtschaftlichen Lage des Servers ändert.
Immobilienmakler-Job-System
Der Immobilienmakler-Job ist der Punkt, an dem dieses System durch den menschlichen Faktor glänzt. Makler vermitteln zwischen Käufern und Verkäufern, führen Immobilienbesichtigungen durch, verhandeln Preise und erhalten bei abgeschlossenen Verkäufen eine Provision. Definiere Job-Stufen, die schrittweise den Zugang zu besseren Angeboten freischalten: Junior-Makler betreuen Wohnungen und kleine Häuser, Senior-Makler erhalten Zugang zu Luxusimmobilien und Gewerbeflächen, und der Agenturinhaber verwaltet das Team und erhält einen Anteil an allen Provisionen. Wenn ein Spieler, der eine Immobilie kaufen möchte, einen Makler kontaktiert, kann dieser eine Besichtigung starten, bei der beide Spieler für einen Rundgang ins Innere der Immobilie teleportiert werden. Hier ist die Logik für Besichtigungen und Verkaufstransaktionen:
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)
Der Provisionssatz sollte konfigurierbar sein und sich möglicherweise je nach Rang des Maklers unterscheiden. Senior-Makler könnten 7% Provision erhalten, während Junior-Makler nur 3% bekommen, was den beruflichen Aufstieg im Immobilienmakler-Job attraktiver macht. Erfasse das Gesamtverkaufsvolumen und die Provisionseinnahmen jedes Maklers in der Datenbank, um Bestenlisten zu erstellen und Boni für die erfolgreichsten Makler freizuschalten.
Hypotheken- und Finanzierungssystem
Die meisten Spieler können hochwertige Immobilien nicht direkt vollständig bezahlen. Ein Hypothekensystem erweitert daher den Kreis potenzieller Käufer erheblich und macht den Immobilienmarkt auch für neue Spieler zugänglich. Kann ein Käufer den vollen Preis nicht bezahlen, biete eine Hypothek mit einer konfigurierbaren Anzahlung an, die üblicherweise 10-20% des Immobilienwerts beträgt. Der Restbetrag wird in regelmäßigen Raten beglichen, die bei jedem Serverneustart oder in festgelegten Abständen automatisch vom Bankkonto des Spielers abgezogen werden. Erfasse Hypothekendetails wie den Darlehensbetrag, Zinssatz, Restbetrag, monatliche Rate und Zahlungshistorie. Versäumt ein Spieler zu viele aufeinanderfolgende Zahlungen, starte ein Zwangsvollstreckungsverfahren, bei dem die Immobilie zurückgenommen und mit einem Preisnachlass erneut auf den Markt gebracht wird. Der Zinssatz verursacht reale Kreditkosten und motiviert Spieler, ihre Hypothek nach Möglichkeit vorzeitig abzubezahlen. Gleichzeitig sorgt das System für einen stetigen Abfluss von Geld, der die Inflation in der Serverwirtschaft eindämmt.
Mieteinnahmen und Vermietersystem
Spieler, die mehrere Immobilien besitzen, sollten sie für passives Einkommen vermieten können. So entsteht eine Vermieter-Mieter-Dynamik, die fortlaufendes Roleplay ermöglicht. Möchte ein Eigentümer seine Immobilie vermieten, legt er eine monatliche Miete fest und bietet sie über die Immobilienagentur oder als Direktangebot zur Miete an. Mieter erhalten für die Dauer ihres Mietvertrags Zugang per Schlüssel und können den Lagerraum, Kleiderschrank und die Garage nutzen. Die Miete wird automatisch nach einem konfigurierbaren Zeitplan eingezogen und auf das Bankkonto des Vermieters überwiesen. Hier ist die Implementierung des Vermietungssystems:
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)
Die Kaution schützt Vermieter vor Mietern, die die Immobilie beschädigen oder ohne Ankündigung ausziehen. Kündigt ein Mieter den Mietvertrag, wird die Kaution abzüglich eventueller Schadensabzüge zurückerstattet. Implementiere ein System zur Erfassung des Immobilienzustands, das Abnutzung protokolliert und Vermietern einen legitimen Grund gibt, einen Teil der Kaution einzubehalten, wenn der Mieter nicht sorgfältig mit der Immobilie umgegangen ist. So entstehen natürliche Konfliktsituationen, die das Roleplay zwischen Vermietern und Mietern fördern.
Dynamische Marktpreise
Ein statischer Immobilienmarkt wird schnell langweilig, sobald alle begehrten Immobilien verkauft sind. Dynamische Preise halten den Markt interessant, indem sie den Immobilienwert an die tatsächlichen Aktivitäten auf dem Server anpassen. Berücksichtige verschiedene Faktoren, die den Wert eines Viertels beeinflussen: die Anzahl kürzlich erfolgter Verkäufe in der Gegend, die Nähe zu beliebten Orten wie Arbeitsplätzen und Geschäften, Kriminalitätsstatistiken aus dem Polizeisystem und das Verhältnis von bewohnten zu leer stehenden Immobilien. Herrscht in einem Viertel hohe Nachfrage und gab es dort viele kürzliche Käufe, steigen die Immobilienwerte schrittweise. So entsteht ein spekulatives Element, bei dem frühe Käufer in aufstrebenden Gegenden profitieren, wenn sich das Viertel weiterentwickelt. Umgekehrt sinken die Werte in Gegenden mit hoher Kriminalität oder vielen leer stehenden Immobilien. Führe die Marktanpassung als geplante Serveraufgabe aus, die wöchentlich alle Immobilienwerte neu berechnet und Änderungen schrittweise anwendet, um plötzliche Markterschütterungen zu vermeiden. Zeige Markttrends im NUI-Panel der Immobilienagentur an, damit Makler und Käufer fundierte Investitionsentscheidungen treffen können.
Immobilienbesichtigungen und NUI-Oberfläche
In der NUI-Oberfläche können Makler und Käufer verfügbare Immobilien durchsuchen, Details ansehen und Transaktionen starten. Erstelle eine übersichtliche, professionell gestaltete Angebotsseite, auf der jede verfügbare Immobilie mit Foto oder Interior-Vorschau, Kartenstandort, Preis, Zimmeranzahl, Garagenkapazität und Viertelbewertung angezeigt wird. Biete Filter- und Sortieroptionen, damit Nutzer die Ergebnisse nach Immobilientyp, Preisspanne und Standort eingrenzen können. Wählt ein Makler eine Immobilie für eine Besichtigung aus, sollte das System eine Route zum Eingang anzeigen und den Käufer auffordern, zu folgen. Biete im Inneren der Immobilie einen interaktiven Rundgangsmodus, in dem der Makler Merkmale mithilfe von 3D-Markern oder Textanmerkungen hervorheben kann. Zeige dem Käufer nach der Besichtigung ein Bestätigungsfenster für Kauf oder Miete mit einer vollständigen Finanzübersicht, einschließlich Preis, Steuern, Maklerprovision und gegebenenfalls Hypothekenbedingungen. Die Oberfläche sollte außerdem einen Transaktionsverlauf enthalten, in dem Spieler ihre früheren Käufe, Verkäufe und Mietzahlungen einsehen können, um vollständige finanzielle Transparenz zu gewährleisten.
Anpassung von Immobilien und Wertsteigerung
Wenn Eigentümer ihre Immobilien individuell gestalten können, verleiht das ihnen eine persönliche Note und schafft eine Upgrade-Wirtschaft, die den Immobilienwert mit der Zeit steigert. Implementiere ein Möbelplatzierungssystem, mit dem Spieler Möbelstücke kaufen und im Innenraum ihrer Immobilie platzieren können, ähnlich wie GTA Online die Anpassung von Apartments handhabt. Jedes gekaufte Möbelstück steigert den verbesserten Wert der Immobilie, sodass der Eigentümer beim späteren Verkauf einen Teil seiner Investition in die Einrichtung zurückerhält. Biete neben Möbeln auch bauliche Upgrades wie Küchenrenovierungen, Badezimmerumbauten und die Installation von Sicherheitssystemen an, die den Basiswert der Immobilie prozentual erhöhen. Erfasse alle Verbesserungen in einer Tabelle für Immobilienänderungen, damit das Angebot potenziellen Käufern genau zeigen kann, welche Upgrades vorgenommen wurden. Gewerbeimmobilien sollten geschäftsspezifische Upgrades unterstützen, etwa Vitrinen für ein Geschäft, Küchenausstattung für ein Restaurant oder Server-Racks für ein Tech-Unternehmen. So wird das Immobiliensystem mit dem umfassenderen Gameplay-Loop für Unternehmen verknüpft. Die Kombination aus standortbasierten Marktdynamiken und von Spielern vorgenommenen Verbesserungen schafft ein vielfältiges Immobilienökosystem, in dem Immobilien zu einer echten Strategie für den Vermögensaufbau werden und nicht nur als Ort zur Lagerung von Gegenständen und zum Umziehen dienen.