FiveM फार्मिंग सिस्टम: फसलें, जानवर और बिक्री चेन
एक गहरा FiveM फार्मिंग सिस्टम बनाएं। फसलें, पशुधन, प्रोसेसिंग, सेल NPCs और इमर्सिव रोलप्ले अर्थव्यवस्थाओं के लिए शीर्ष फार्मिंग स्क्रिप्ट्स।
Agency Scripts
Agency Scripts के संस्थापक और प्रमुख डेवलपर
फार्मिंग सिस्टम डिज़ाइन दर्शन
एक खेती और कृषि प्रणाली FiveM रोलप्ले सर्वरों में पूरी तरह से अलग गति लाती है, खिलाड़ियों को उच्च-एड्रेनालाईन अपराध गतिविधियों और कानून प्रवर्तन के लिए एक आरामदायक विकल्प प्रदान करती है। सर्वश्रेष्ठ खेती प्रणालियाँ एक आत्मनिर्भर आर्थिक चक्र बनाती हैं जहाँ खिलाड़ी बीज खरीदते हैं, निर्दिष्ट खेतों पर फसल लगाते हैं, वास्तविक समय विकास चक्रों के दौरान उनकी देखभाल करते हैं, उपज काटते हैं, और लाभ के लिए बाजार में बेचते हैं। डिज़ाइन चुनौती यह है कि प्रणाली इतनी आकर्षक हो कि खिलाड़ी नियमित रूप से लौटें बिना इसे इतना समय-गहन बनाए कि यह बोझिल लगे। वास्तविक समय विकास चक्रों का उपयोग करें जो खिलाड़ी ऑफ़लाइन होने पर भी जारी रहते हैं, ताकि किसान लॉग इन करें और अपनी फसलों को विभिन्न विकास चरणों में पाएं। मुख्य डेटा मॉडल को प्रत्येक व्यक्तिगत फसल प्लॉट के साथ उसका स्थान, फसल प्रकार, वर्तमान विकास चरण, लगाया गया समय, जल स्तर, और गुणवत्ता रेटिंग ट्रैक करनी चाहिए। इसे सर्वर-साइड डेटाबेस में संग्रहित करें ताकि फार्म स्थिति सर्वर पुनःप्रारंभ के दौरान बनी रहे और क्लाइंट-साइड हेरफेर से सुरक्षित रहे।
फसल लगाना और डेटाबेस स्कीमा
प्लांटिंग सिस्टम एक खिलाड़ी के अपने इन्वेंट्री से बीज चुनने और उन्हें वैध खेत के क्षेत्रों में लगाने से शुरू होता है। खेत को मानचित्र पर कॉन्फ़िगर करने योग्य बहुभुज क्षेत्रों के रूप में परिभाषित करें जहाँ पौधारोपण की अनुमति है, जिससे खिलाड़ी फुटपाथ या इमारतों के अंदर फसल उगाने से रोकें। प्रत्येक खेत के प्लॉट में भूमि के आकार के आधार पर सीमित स्लॉट होने चाहिए, और खिलाड़ी NPC या रियल एस्टेट सिस्टम के माध्यम से खेत किराए पर ले सकते हैं या खरीद सकते हैं। जब कोई खिलाड़ी बीज लगाता है, तो एक डेटाबेस रिकॉर्ड बनाएं जो फसल के पूरे जीवनचक्र को ट्रैक करता है। यहाँ एक व्यावहारिक डेटाबेस स्कीमा और सर्वर-साइड प्लांटिंग हैंडलर है:
CREATE TABLE IF NOT EXISTS farm_crops (
id INT AUTO_INCREMENT PRIMARY KEY,
owner VARCHAR(50) NOT NULL,
farm_id VARCHAR(50) NOT NULL,
crop_type VARCHAR(50) NOT NULL,
position_x FLOAT NOT NULL,
position_y FLOAT NOT NULL,
position_z FLOAT NOT NULL,
planted_at BIGINT NOT NULL,
growth_stage INT DEFAULT 0,
water_level FLOAT DEFAULT 100.0,
quality FLOAT DEFAULT 1.0,
is_harvestable TINYINT DEFAULT 0,
is_dead TINYINT DEFAULT 0,
last_watered BIGINT DEFAULT 0,
INDEX idx_owner (owner),
INDEX idx_farm (farm_id)
);
CREATE TABLE IF NOT EXISTS farm_plots (
id INT AUTO_INCREMENT PRIMARY KEY,
farm_id VARCHAR(50) NOT NULL UNIQUE,
owner VARCHAR(50) DEFAULT NULL,
max_slots INT DEFAULT 20,
rent_price INT DEFAULT 500,
coords_center_x FLOAT NOT NULL,
coords_center_y FLOAT NOT NULL,
coords_center_z FLOAT NOT NULL,
radius FLOAT DEFAULT 30.0
);
RegisterNetEvent('farming:server:plantCrop', function(cropType, position)
local src = source
local Player = QBCore.Functions.GetPlayer(src)
if not Player then return end
local citizenid = Player.PlayerData.citizenid
local seedItem = 'seed_' .. cropType
if not Player.Functions.GetItemByName(seedItem) then
return TriggerClientEvent('QBCore:Notify', src, 'You need seeds to plant', 'error')
end
local farmId = GetFarmAtPosition(position)
if not farmId then
return TriggerClientEvent('QBCore:Notify', src, 'You can only plant on farmland', 'error')
end
local currentCrops = MySQL.scalar.await(
'SELECT COUNT(*) FROM farm_crops WHERE farm_id = ? AND is_dead = 0',
{farmId}
)
local maxSlots = MySQL.scalar.await(
'SELECT max_slots FROM farm_plots WHERE farm_id = ?', {farmId}
)
if currentCrops >= maxSlots then
return TriggerClientEvent('QBCore:Notify', src, 'Farm is full', 'error')
end
Player.Functions.RemoveItem(seedItem, 1)
MySQL.insert(
'INSERT INTO farm_crops (owner, farm_id, crop_type, position_x, position_y, position_z, planted_at, last_watered) VALUES (?, ?, ?, ?, ?, ?, ?, ?)',
{citizenid, farmId, cropType, position.x, position.y, position.z, os.time(), os.time()}
)
TriggerClientEvent('QBCore:Notify', src, 'Planted ' .. cropType, 'success')
TriggerClientEvent('farming:client:spawnCropProp', -1, position, cropType, 0)
end)
प्रत्येक फसल प्रकार के लिए कॉन्फ़िगरेशन तालिका में अलग-अलग वृद्धि पैरामीटर परिभाषित होने चाहिए। गेहूं 30 वास्तविक मिनट में 4 चरणों में बढ़ सकता है, जबकि कैनबिस या अंगूर को कई घंटे लग सकते हैं 6 चरणों के साथ, जो धैर्यवान किसानों को उच्च-मूल्य वाली उपज के साथ पुरस्कृत करता है। वृद्धि चरण यह निर्धारित करता है कि दुनिया में कौन सा प्रॉप मॉडल प्रदर्शित होगा, जो समय के साथ एक छोटे अंकुर से पूर्ण विकसित पौधे में परिवर्तित होता है।
विकास चक्र इंजन और सिंचाई
विकास चक्र इंजन एक सर्वर-साइड लूप है जो समय-समय पर सभी लगाए गए फसलों की जांच करता है और बीते समय और जल स्तर जैसी स्थितियों के आधार पर उनके विकास चरणों को आगे बढ़ाता है। इसे एक समयबद्ध सर्वर थ्रेड के रूप में चलाएं जो हर कुछ मिनटों में निष्पादित होता है, यह गणना करता है कि प्रत्येक फसल को उसके फसल प्रकार के विकास अवधि और रोपण के बाद के समय के आधार पर अगले चरण में बढ़ना चाहिए या नहीं। जल स्तर प्राथमिक मैकेनिक है जो खिलाड़ियों को संलग्न रखता है: फसलें समय के साथ पानी का उपभोग करती हैं, और यदि जल स्तर शून्य हो जाता है, तो विकास रुक जाता है और फसल की गुणवत्ता घटती है। खिलाड़ियों को अपने खेत पर लौटना होगा और जल स्तर को पुनः भरने के लिए एक पानी डालने का कनस्तर या सिंचाई प्रणाली का उपयोग करना होगा। सर्वर-साइड विकास इंजन यहां है:
local CropConfig = {
wheat = {
stages = 4,
growthTime = 1800, -- 30 min total, ~7.5 min per stage
waterConsumption = 5, -- per cycle
baseYield = 5,
sellPrice = 50
},
corn = {
stages = 5,
growthTime = 3600,
waterConsumption = 7,
baseYield = 4,
sellPrice = 80
},
tomato = {
stages = 4,
growthTime = 2400,
waterConsumption = 8,
baseYield = 6,
sellPrice = 65
},
grape = {
stages = 6,
growthTime = 7200,
waterConsumption = 4,
baseYield = 8,
sellPrice = 120
}
}
CreateThread(function()
while true do
Wait(60000 * 5) -- Run every 5 minutes
local crops = MySQL.query.await(
'SELECT * FROM farm_crops WHERE is_dead = 0 AND is_harvestable = 0'
)
for _, crop in ipairs(crops or {}) do
local config = CropConfig[crop.crop_type]
if not config then goto continue end
local elapsed = os.time() - crop.planted_at
local stageTime = config.growthTime / config.stages
local expectedStage = math.min(math.floor(elapsed / stageTime), config.stages)
-- Degrade water
local newWater = math.max(0, crop.water_level - config.waterConsumption)
local newQuality = crop.quality
-- Quality degrades without water
if newWater <= 0 then
newQuality = math.max(0.3, crop.quality - 0.05)
expectedStage = crop.growth_stage -- Pause growth
end
local isHarvestable = expectedStage >= config.stages and newWater > 0
if expectedStage ~= crop.growth_stage or newWater ~= crop.water_level then
MySQL.update(
'UPDATE farm_crops SET growth_stage = ?, water_level = ?, quality = ?, is_harvestable = ? WHERE id = ?',
{expectedStage, newWater, newQuality, isHarvestable and 1 or 0, crop.id}
)
if expectedStage ~= crop.growth_stage then
TriggerClientEvent('farming:client:updateCropStage', -1,
crop.id, expectedStage, crop.crop_type,
vector3(crop.position_x, crop.position_y, crop.position_z))
end
end
:continue:
end
end
end)
पानी देने की यांत्रिकी थकाऊ नहीं बल्कि इंटरैक्टिव महसूस होनी चाहिए। खिलाड़ी को एक वाटरिंग कैन आइटम दें जो फसलों के पास उपयोग करने पर एनिमेशन ट्रिगर करे, और एक ही क्रिया में कई पास की फसलों को पानी दें बजाय एक-एक करके पानी देने के। बड़े खेतों के लिए, एक सिंचाई प्रणाली अपग्रेड पेश करें जो नियमित अंतराल पर प्लॉट की सभी फसलों को स्वचालित रूप से पानी दे, जिससे मैनुअल श्रम कम हो लेकिन सामग्री में प्रारंभिक निवेश की आवश्यकता हो। जब खिलाड़ी किसी प्रॉप को देखे, तो प्रत्येक फसल के पानी स्तर और वृद्धि प्रगति को छोटे संकेतक के माध्यम से ऊपर दिखाएं, 3D टेक्स्ट या टारगेट सिस्टम ओवरले का उपयोग करते हुए।
फसल कटाई और उत्पाद गुणवत्ता
फसल कटाई वह पल है जो पूरे खेती चक्र को संतोषजनक बनाता है। जब कोई फसल अपने अंतिम विकास चरण तक पहुंचती है और पर्याप्त पानी दिया गया होता है, तो वह कटाई योग्य हो जाती है। खिलाड़ी फसल के साथ इंटरैक्ट करता है, कटाई एनिमेशन चलाता है, और अपने इन्वेंटरी में उत्पाद आइटम प्राप्त करता है। उत्पाद की मात्रा और गुणवत्ता इस बात पर निर्भर करती है कि खिलाड़ी ने विकास चक्र के दौरान फसल का कितना ध्यान रखा: लगातार पानी देने से उच्च गुणवत्ता वाले आइटम बनते हैं जो अधिक कीमत पर बिकते हैं, जबकि उपेक्षित फसलें कम और निम्न गुणवत्ता वाले आइटम देती हैं। एक गुणवत्ता गुणक लागू करें जो उत्पादन मात्रा और बिक्री मूल्य दोनों को प्रभावित करता है, जिससे सावधानीपूर्वक खेती के लिए मजबूत प्रोत्साहन बनता है। कटाई के बाद, फसल को डेटाबेस से हटा दें और प्रॉप को दुनिया से डिलीट करें, जिससे प्लॉट स्लॉट पुनः रोपण के लिए मुक्त हो जाता है। एक कम्पोस्टिंग मैकेनिक जोड़ने पर विचार करें जहां निम्न गुणवत्ता वाली कटाई को उर्वरक में बदला जा सके जो भविष्य की फसलों की गुणवत्ता बढ़ाता है, एक शून्य-अपशिष्ट चक्र बनाते हुए जो निरंतर खेती गतिविधि को पुरस्कृत करता है।
पशुपालन प्रणाली
पशु खेती के अनुभव में एक दूसरा आयाम जोड़ते हैं और अतिरिक्त राजस्व धाराएँ बनाते हैं। खरीदे जाने योग्य पशुओं को लागू करें जैसे मुर्गियां, गायें, और भेड़ें जो खेत पर निर्दिष्ट पशु पेन में रखे जाते हैं। प्रत्येक पशु प्रकार की अपनी उत्पादन चक्र होती है: मुर्गियां हर कुछ घंटों में अंडे देती हैं, गायें दैनिक दूध देती हैं, और भेड़ें समय-समय पर ऊन के लिए कतराई जा सकती हैं। पशुओं को खिलाने के लिए खिलाड़ी के उत्पादन इन्वेंटरी से भोजन की आवश्यकता होती है, जो फसल प्रणाली को सीधे पशु प्रणाली से जोड़ता है और एक बंद आर्थिक चक्र बनाता है। यहाँ फार्म पशुओं के लिए एक कॉन्फ़िगरेशन और भोजन प्रणाली है:
Config.Animals = {
chicken = {
model = 'a_c_hen',
purchasePrice = 500,
feedItem = 'wheat',
feedInterval = 3600, -- needs feeding every hour
productionItem = 'eggs',
productionAmount = 3,
productionInterval = 7200, -- produces every 2 hours
maxPerFarm = 10
},
cow = {
model = 'a_c_cow',
purchasePrice = 3000,
feedItem = 'corn',
feedInterval = 5400,
productionItem = 'milk',
productionAmount = 2,
productionInterval = 14400,
maxPerFarm = 5
},
sheep = {
model = 'a_c_sheep',
purchasePrice = 1500,
feedItem = 'wheat',
feedInterval = 4800,
productionItem = 'wool',
productionAmount = 1,
productionInterval = 21600,
maxPerFarm = 8
}
}
RegisterNetEvent('farming:server:feedAnimal', function(animalId)
local src = source
local Player = QBCore.Functions.GetPlayer(src)
if not Player then return end
local animal = MySQL.query.await(
'SELECT * FROM farm_animals WHERE id = ? AND owner = ?',
{animalId, Player.PlayerData.citizenid}
)
if not animal or not animal[1] then return end
animal = animal[1]
local config = Config.Animals[animal.animal_type]
if not Player.Functions.GetItemByName(config.feedItem) then
return TriggerClientEvent('QBCore:Notify', src, 'Need ' .. config.feedItem .. ' to feed', 'error')
end
Player.Functions.RemoveItem(config.feedItem, 1)
MySQL.update(
'UPDATE farm_animals SET last_fed = ?, hunger = 100 WHERE id = ?',
{os.time(), animalId}
)
TriggerClientEvent('QBCore:Notify', src, 'Animal fed successfully', 'success')
end)
जो पशु समय पर नहीं खिलाए जाते वे दुखी हो जाते हैं, जिससे उनका उत्पादन कम हो जाता है। यदि बहुत लंबे समय तक बिना भोजन के छोड़ा जाए, तो वे पूरी तरह से उत्पादन बंद कर देते हैं। पशु की स्थिति को एक लक्ष्य इंटरैक्शन के माध्यम से दिखाएं जो भूख स्तर, खुशी, और अगले उत्पादन तक का समय दिखाता है। यह किसानों के लिए एक दैनिक जांच-इन दिनचर्या बनाता है जो उन्हें फसल विकास चक्रों के बीच सर्वर के साथ जुड़ा रखता है।
मार्केट सिस्टम और उत्पाद बिक्री
मार्केट सिस्टम किसानों को व्यापक सर्वर अर्थव्यवस्था से जोड़ता है। नक्शे पर किसानों के बाजारों, किराने की दुकानों, और रेस्तरां में NPC विक्रेता स्थान बनाएं जहां खिलाड़ी अपनी उपज बेच सकते हैं। एक गतिशील मूल्य निर्धारण प्रणाली लागू करें जहां कीमतें आपूर्ति और मांग के आधार पर बदलती हैं: यदि कई किसान गेहूं उगा रहे हैं, तो गेहूं की कीमतें गिरती हैं, जो फसल विविधता को प्रोत्साहित करती है। कुल बिक्री मात्रा को रोलिंग समय विंडो में प्रति फसल प्रकार ट्रैक करें और कीमतों को तदनुसार समायोजित करें। उच्च गुणवत्ता वाली फसलों से प्रीमियम उपज आधार मूल्य से ऊपर एक गुणक पर बिकती है, जो सावधानीपूर्वक खेती को पुरस्कृत करती है। खिलाड़ी से खिलाड़ी व्यापार विकल्प जोड़ने पर विचार करें जहां किसान निर्दिष्ट क्षेत्रों में बाजार स्टॉल स्थापित कर सकते हैं, सीधे अन्य खिलाड़ियों को कस्टम कीमतों पर बेच सकते हैं। यह किसानों और खरीदारों के बीच जैविक रोलप्ले इंटरैक्शन बनाता है, और उद्यमी खिलाड़ियों को सस्ते थोक उत्पाद खरीदकर उच्च यातायात क्षेत्रों में खुदरा मूल्य पर बेचकर लाभ कमाने देता है।
Weather Effects on Farming
मौसम एकीकरण खेती में अप्रत्याशितता और रणनीति जोड़ता है। अपने सर्वर के मौसम प्रणाली से जुड़ें ताकि फसल की वृद्धि और पानी की खपत पर संशोधक लागू किए जा सकें। बारिश स्वाभाविक रूप से सभी बाहरी फसलों को पानी देती है, जिससे गीले मौसम के दौरान मैनुअल पानी देने की आवश्यकता कम हो जाती है। अत्यधिक गर्मी पानी की खपत बढ़ाती है, जिससे किसान गर्म मौसम में अधिक बार पानी देना पड़ता है। तूफान फसलों को नुकसान पहुंचा सकते हैं, गुणवत्ता कम कर सकते हैं या यहां तक कि बिना कटे हुए उत्पाद को नष्ट कर सकते हैं जो बहुत लंबे समय तक छोड़ा गया हो। सर्दियों के मौसम में ठंड के कारण होने वाली ठंढी घटनाएं कुछ फसल प्रकारों को पूरी तरह मार सकती हैं, जिससे किसानों को ठंड प्रतिरोधी किस्में चुननी पड़ती हैं या ग्रीनहाउस संरचनाओं में निवेश करना पड़ता है जो फसलों को मौसम के प्रभावों से बचाती हैं। एक मौसम पूर्वानुमान प्रणाली लागू करें जो इन-गेम फोन ऐप या टीवी प्रसारण के माध्यम से सुलभ हो ताकि किसान आगामी परिस्थितियों के अनुसार अपनी बुवाई अनुसूची की योजना बना सकें, जिससे खेती के अनुभव में एक रणनीतिक योजना परत जुड़ती है जो सरल क्लिक-एंड-वेट यांत्रिकी से ऊपर उठती है।
फार्म अपग्रेड और प्रगति
एक प्रगति प्रणाली किसानों को दीर्घकालिक लक्ष्य और लगातार खेलने के लिए पुरस्कार देती है। खिलाड़ियों को एक छोटा प्लॉट के साथ शुरू करें जो कुछ फसलों को रख सकता है, फिर उन्हें खेती XP या सीधे खरीद के माध्यम से विस्तार अर्जित करने दें। प्रत्येक उन्नयन स्तर नई क्षमताएं अनलॉक करता है: स्वचालित स्प्रिंकलर सिस्टम जो पानी देना संभालते हैं, अधिक पशुधन के लिए बड़े पशु पेन, अधिशेष उत्पाद संग्रहीत करने के लिए एक बार्न, प्रसंस्करण स्टेशन जो कच्ची वस्तुओं को उच्च-मूल्य वाले सामानों में परिवर्तित करते हैं जैसे गेहूं को आटे में या अंगूर को वाइन में, और एक ट्रैक्टर वाहन जो बड़े प्लॉट में रोपण और कटाई को तेज करता है। खेती XP को अन्य सर्वर प्रगति से अलग ट्रैक करें ताकि एक समर्पित खेती कौशल बनाया जा सके जो उच्च स्तरों पर उपज की गुणवत्ता में सुधार करता है और विकास समय को कम करता है। प्रसंस्करण प्रणाली अर्थव्यवस्था के लिए विशेष रूप से महत्वपूर्ण है क्योंकि यह कच्चे उत्पाद और तैयार माल के बीच मूल्य-वर्धित चरण जोड़ती है, आपूर्ति श्रृंखला रोलप्ले के अवसर बनाती है जहां किसान कच्चे माल को खिलाड़ी-स्वामित्व वाली बेकरी, वाइनरी, या रेस्तरां को बेचते हैं जो उन्हें अंतिम उत्पादों में परिवर्तित करते हैं।