FiveM रियल एस्टेट सिस्टम: रियल्टर जॉब्स और संपत्ति बिक्री
अपने FiveM सर्वर पर एक रियल्टर अर्थव्यवस्था लॉन्च करें। लिस्टिंग, ओपन हाउस, कमीशन और QBCore और ESX सर्वरों के लिए शीर्ष रियल एस्टेट स्क्रिप्ट।
Agency Scripts
Agency Scripts के संस्थापक और प्रमुख डेवलपर
प्रॉपर्टी सिस्टम आर्किटेक्चर
एक रियल एस्टेट सिस्टम आपके FiveM सर्वर को असमर्थित इमारतों के संग्रह से एक जीवंत प्रॉपर्टी मार्केट में बदल देता है जहां खिलाड़ी घर, अपार्टमेंट, और वाणिज्यिक स्थान खरीदते, बेचते, और किराए पर लेते हैं। वास्तुकला एक प्रॉपर्टी रजिस्ट्री डेटाबेस के इर्द-गिर्द केंद्रित है जो सर्वर पर हर उपलब्ध प्रॉपर्टी को उसके स्थान, प्रकार, वर्तमान मालिक, बाजार मूल्य, और इंटीरियर कॉन्फ़िगरेशन के साथ ट्रैक करता है। सरल हाउसिंग स्क्रिप्ट्स के विपरीत जो केवल खिलाड़ियों को पूर्वनिर्धारित प्रॉपर्टीज़ की सूची खरीदने देते हैं, एक अच्छी तरह से डिज़ाइन किया गया रियल एस्टेट सिस्टम एक रियल एस्टेट एजेंट जॉब शामिल करता है जो शोइंग, बातचीत, और कमीशन संरचनाओं के साथ खिलाड़ी-चालित लेनदेन बनाता है। सिस्टम को आपके सर्वर के दरवाज़ा लॉक संसाधन के साथ एकीकृत करने की आवश्यकता है ताकि प्रॉपर्टी स्वामित्व स्वचालित रूप से भौतिक भवन की पहुंच प्रदान या रद्द कर दे, और कस्टम MLOs या इंस्टेंस्ड इंटीरियर्स जैसे इंटीरियर लोडिंग सिस्टम के साथ। शुरुआत से तीन प्रॉपर्टी श्रेणियों की योजना बनाएं: खिलाड़ी आवास के लिए आवासीय प्रॉपर्टीज़, खिलाड़ी-स्वामित्व वाले व्यवसायों के लिए वाणिज्यिक प्रॉपर्टीज़, और मकान मालिकों के लिए निष्क्रिय आय उत्पन्न करने वाली किराये की प्रॉपर्टीज़।
प्रॉपर्टी डेटाबेस और लिस्टिंग
संपत्ति डेटाबेस वह आधार है जिस पर हर अन्य घटक बनता है। प्रत्येक संपत्ति रिकॉर्ड को व्यापक मेटाडेटा की आवश्यकता होती है जिसमें इसका उपयोग किया गया शेल या 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)
);
प्रारंभिक सेटअप के दौरान अपने सर्वर पर उपलब्ध सभी संपत्तियों के साथ प्रॉपर्टीज़ टेबल भरें। प्रत्येक संपत्ति के लिए प्रवेश बिंदुओं के लिए सावधानीपूर्वक सेट किए गए निर्देशांक होने चाहिए जो दरवाजे की स्थिति या इंटरैक्शन ज़ोन के अनुरूप हों। 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 अपार्टमेंट कस्टमाइज़ेशन करता है। प्रत्येक खरीदा गया फर्नीचर आइटम संपत्ति के सुधारित मूल्य को बढ़ाता है, इसलिए जब मालिक अंततः बेचता है, तो वे फर्नीचर में अपने निवेश का कुछ हिस्सा वापस पाते हैं। फर्नीचर के अलावा, रसोई नवीनीकरण, बाथरूम रीमॉडलिंग, और सुरक्षा प्रणाली स्थापना जैसे संरचनात्मक उन्नयन प्रदान करें जो संपत्ति के आधार मूल्य को प्रतिशत द्वारा बढ़ाते हैं। सभी सुधारों को एक संपत्ति संशोधन तालिका में ट्रैक करें ताकि रियल एस्टेट लिस्टिंग संभावित खरीदारों को दिखा सके कि कौन से उन्नयन किए गए हैं। वाणिज्यिक संपत्तियों को व्यवसाय-विशिष्ट उन्नयन का समर्थन करना चाहिए जैसे दुकान के लिए डिस्प्ले केस, रेस्तरां के लिए रसोई उपकरण, या टेक कंपनी के लिए सर्वर रैक, जो संपत्ति प्रणाली को व्यापक व्यवसाय गेमप्ले लूप से जोड़ता है। स्थान-आधारित बाजार गतिशीलता और खिलाड़ी-चालित सुधारों का संयोजन एक समृद्ध संपत्ति पारिस्थितिकी तंत्र बनाता है जहाँ रियल एस्टेट केवल वस्तुएं स्टोर करने और कपड़े बदलने की जगह नहीं बल्कि एक वैध धन-सृजन रणनीति बन जाता है।