FiveM Çiftçilik Sistemi: Ekinler, Hayvanlar ve Satış Zincirleri
Kapsamlı bir FiveM çiftçilik sistemi oluşturun. Sürükleyici rol yapma ekonomileri için ekinler, hayvancılık, işleme, satış NPC'leri ve en iyi çiftçilik script'leri.
Agency Scripts
Agency Scripts Kurucusu ve Baş Geliştiricisi
Tarım Sistemi Tasarım Felsefesi
Bir çiftçilik ve tarım sistemi, FiveM roleplay sunucularına tamamen farklı bir tempo kazandırarak oyunculara yüksek adrenalinli suç faaliyetlerine ve kolluk kuvvetlerine karşı rahatlatıcı bir alternatif sunar. En iyi çiftçilik sistemleri, oyuncuların tohum satın aldığı, belirlenen tarım arazilerine ekin ektiği, gerçek zamanlı büyüme döngüleri boyunca bunlarla ilgilendiği, mahsulü hasat ettiği ve kâr amacıyla pazarda sattığı kendi kendini sürdüren bir ekonomik döngü oluşturur. Buradaki tasarım zorluğu, sistemi angarya hissettirecek kadar zaman alıcı yapmadan, oyuncuların düzenli olarak geri dönmesini sağlayacak kadar ilgi çekici kılmaktır. Oyuncu çevrimdışı olduğunda bile devam eden gerçek zamanlı büyüme döngüleri kullanın, böylece çiftçiler oyuna girdiklerinde ekinlerini farklı büyüme aşamalarında bulurlar. Temel veri modelinin her bir ekin parselini konumu, ekin türü, mevcut büyüme aşaması, ekim zaman damgası, su seviyesi ve kalite derecesi ile takip etmesi gerekir. Çiftlik durumunun sunucu yeniden başlatmalarında korunması ve istemci tarafı manipülasyonundan korunması için tüm bunları sunucu tarafında bir veritabanında saklayın.
Mahsul Ekimi ve Veritabanı Şeması
Ekim sistemi, oyuncunun envanterinden tohum seçip bunları geçerli tarım arazisi bölgelerine yerleştirmesiyle başlar. Tarım arazisini harita üzerinde ekime izin verilen yapılandırılabilir çokgen bölgeler olarak tanımlayın; böylece oyuncuların kaldırımlarda veya bina içlerinde ekin yetiştirmesini engelleyin. Her tarım parselinin arazi büyüklüğüne göre sınırlı sayıda yuvası olmalı ve oyuncular tarım arazisini bir NPC veya emlak sistemi aracılığıyla kiralayabilmeli ya da satın alabilmelidir. Bir oyuncu tohum ektiğinde, mahsulü tüm yaşam döngüsü boyunca takip eden bir veritabanı kaydı oluşturun. İşte pratik bir veritabanı şeması ve sunucu taraflı ekim işleyicisi:
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)
Her ekin türü, bir yapılandırma tablosunda tanımlanmış farklı büyüme parametrelerine sahip olmalıdır. Buğday 4 aşamada gerçek dünyadaki 30 dakikada büyüyebilirken, kenevir veya üzüm 6 aşamada birkaç saat sürebilir ve sabırlı çiftçileri daha değerli ürünlerle ödüllendirebilir. Büyüme aşaması, dünyada hangi prop modelinin görüntüleneceğini belirler ve zaman ilerledikçe küçük bir filizden tamamen büyümüş bir bitkiye dönüşür.
Büyüme Döngüsü Motoru ve Sulama
Büyüme döngüsü motoru, ekilen tüm mahsulleri periyodik olarak kontrol eden ve geçen süre ile su seviyesi gibi koşullara bağlı olarak büyüme aşamalarını ilerleten sunucu tarafı bir döngüdür. Bunu birkaç dakikada bir çalışan zamanlanmış bir sunucu thread'i olarak çalıştırın, her mahsulün, mahsul türünün büyüme süresine ve ekimden bu yana geçen süreye göre bir sonraki aşamaya geçip geçmeyeceğini hesaplayın. Su seviyesi, oyuncuların ilgisini canlı tutan temel mekaniktir: Mahsuller zamanla su tüketir ve su seviyesi sıfıra düşerse büyüme durur ve mahsulün kalitesi düşer. Oyuncular çiftliklerine dönmeli ve su seviyelerini yenilemek için bir sulama kabı veya sulama sistemi kullanmalıdır. Sunucu tarafı büyüme motoru şöyledir:
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)
Sulama mekaniği sıkıcı değil, etkileşimli hissettirmelidir. Oyuncuya ekinlerin yakınında kullanıldığında bir animasyon tetikleyen bir sulama kabı eşyası verin ve tek tek sulama gerektirmek yerine yakındaki birden fazla ekini tek bir eylemde sulayın. Daha büyük çiftlikler için, arazideki tüm ekinleri düzenli aralıklarla otomatik olarak sulayan, el emeğini azaltan ancak önceden malzeme yatırımı gerektiren bir sulama sistemi yükseltmesi ekleyin. Oyuncu ekine baktığında, 3D metin veya hedef sistemi katmanı kullanarak prop üzerindeki küçük bir göstergeyle her ekinin su seviyesini ve büyüme ilerlemesini görüntüleyin.
Hasat ve Ürün Kalitesi
Hasat, tüm tarım döngüsünü tatmin edici kılan kazanç anıdır. Bir mahsul son büyüme aşamasına ulaştığında ve yeterince sulandığında hasat edilebilir hale gelir. Oyuncu mahsulle etkileşime girer, bir hasat animasyonu oynatılır ve envanterine ürün eşyaları eklenir. Ürünün miktarı ve kalitesi, oyuncunun büyüme döngüsü boyunca mahsulün bakımını ne kadar iyi yaptığına bağlıdır: Düzenli sulama daha yüksek fiyata satılan daha kaliteli eşyalar üretirken, ihmal edilen mahsuller daha düşük kalitede daha az eşya verir. Hem verim miktarını hem de satış fiyatını etkileyen bir kalite çarpanı uygulayarak özenli tarım için güçlü bir teşvik oluşturun. Hasattan sonra mahsulü veritabanından kaldırın ve prop'u dünyadan silerek parsel alanını yeniden ekim için boşaltın. Düşük kaliteli hasatların gelecekteki mahsullerin kalitesini artıran gübreye dönüştürülebildiği bir kompost mekaniği eklemeyi düşünün, bu sayede sürekli tarım faaliyetini ödüllendiren sıfır atıklı bir döngü oluşturabilirsiniz.
Hayvancılık Sistemi
Hayvanlar, çiftçilik deneyimine ikinci bir boyut kazandırır ve ek gelir akışları oluşturur. Tarım arazisindeki belirlenmiş hayvan ağıllarına yerleştirilen tavuk, inek ve koyun gibi satın alınabilir hayvanları entegre edin. Her hayvan türünün kendi üretim döngüsü vardır: Tavuklar birkaç saatte bir yumurta üretir, inekler günlük süt verir ve koyunlar periyodik olarak yünleri için kırkılabilir. Hayvanlar, oyuncunun mahsul envanterinden beslenmeyi gerektirir; bu da mahsul sistemini doğrudan hayvan sistemine bağlayarak kapalı bir ekonomik döngü oluşturur. İşte çiftlik hayvanları için bir yapılandırma ve besleme sistemi:
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)
Zamanında beslenmeyen hayvanlar mutsuz olur ve üretim verimleri düşer. Çok uzun süre aç bırakılırlarsa üretim tamamen durur. Açlık seviyesini, mutluluk durumunu ve bir sonraki üretime kalan süreyi gösteren bir target etkileşimiyle hayvan durumunu görüntüleyin. Bu sayede çiftçiler için ekin büyüme döngüleri arasında sunucuya bağlı kalmalarını sağlayan günlük bir kontrol rutini oluşur.
Pazar Sistemi ve Ürün Satışı
Pazar sistemi, çiftçileri daha geniş sunucu ekonomisine bağlar. Harita genelindeki çiftçi pazarlarında, bakkallarda ve restoranlarda oyuncuların ürünlerini satabileceği NPC satıcı noktaları oluşturun. Fiyatların arz ve talebe göre dalgalandığı dinamik bir fiyatlandırma sistemi uygulayın: çok sayıda çiftçi buğday yetiştiriyorsa buğday fiyatları düşer ve bu da ürün çeşitliliğini teşvik eder. Belirli zaman aralıklarında ürün türü başına toplam satış hacmini takip edin ve fiyatları buna göre ayarlayın. Yüksek kaliteli mahsullerden elde edilen birinci sınıf ürünler, taban fiyatın üzerinde bir çarpanla satılarak özenli çiftçiliği ödüllendirir. Çiftçilerin belirlenmiş alanlarda pazar tezgahları kurabileceği ve özel fiyatlarla doğrudan diğer oyunculara satış yapabileceği oyuncudan oyuncuya ticaret seçeneği eklemeyi değerlendirin. Bu durum, çiftçiler ile alıcılar arasında doğal roleplay etkileşimleri yaratır ve girişimci oyuncuların ucuz toptan ürün alıp yoğun alanlarda perakende kar marjıyla satarak kazanç sağlamasına olanak tanır.
Hava Durumunun Tarıma Etkileri
Hava durumu entegrasyonu, tarıma öngörülemezlik ve strateji katar. Mahsul büyümesine ve su tüketimine çarpanlar uygulamak için sunucunuzun hava durumu sistemine bağlanın. Yağmur, tüm açık hava mahsullerini doğal olarak sulayarak yağışlı dönemlerde manuel sulama ihtiyacını azaltır. Aşırı sıcaklar su tüketimini artırarak çiftçileri sıcak havalarda daha sık sulama yapmaya zorlar. Fırtınalar mahsullere zarar verebilir, kaliteyi düşürebilir ve hatta çok uzun süre bekletilen hasat edilmemiş ürünleri yok edebilir. Kış mevsimlerindeki don olayları belirli mahsul türlerini tamamen öldürebilir; bu da çiftçilerin soğuğa dayanıklı çeşitleri seçmesini veya mahsulleri hava etkilerinden koruyan sera yapılarına yatırım yapmasını gerektirir. Çiftçilerin ekim takvimlerini yaklaşan koşullara göre planlayabilmeleri için oyun içi telefon uygulaması veya TV yayını üzerinden erişilebilen bir hava durumu tahmin sistemi uygulayın; bu, tarım deneyimini basit tıkla ve bekle mekaniklerinin ötesine taşıyan stratejik bir planlama katmanı ekler.
Çiftlik Yükseltmeleri ve İlerleme
Bir ilerleme sistemi çiftçilere uzun vadeli hedefler verir ve istikrarlı oyunu ödüllendirir. Oyuncuları birkaç ürün alabilen küçük bir arsa ile başlatın, ardından çiftçilik XP'si veya doğrudan satın alma yoluyla genişletmeler kazanmalarını sağlayın. Her yükseltme seviyesi yeni yeteneklerin kilidini açar: Sulama işini üstlenen otomatik fıskiye sistemleri, daha fazla çiftlik hayvanı için daha büyük hayvan barınakları, fazla ürünü depolamak için bir ambar, buğdayı una veya üzümü şaraba dönüştürmek gibi ham maddeleri daha yüksek değerli mallara dönüştüren işleme istasyonları ve büyük arazilerde ekim ile hasadı hızlandıran bir traktör aracı. Verim kalitesini artıran ve daha yüksek seviyelerde büyüme sürelerini azaltan özel bir çiftçilik becerisi oluşturmak için çiftçilik XP'sini diğer sunucu ilerlemelerinden ayrı takip edin. İşleme sistemi ekonomi için özellikle önemlidir çünkü ham ürün ile bitmiş mallar arasına katma değerli adımlar ekleyerek çiftçilerin ham maddeleri tüketiciler için nihai ürünlere dönüştüren oyunculara ait fırınlara, şaraphanelere veya restoranlara sattığı tedarik zinciri roleplay fırsatları yaratır.