FiveM Tekne Balıkçılığı Sistemi: Gerçekçi Okyanus Meslekleri Kodlayın
FiveM içinde eksiksiz bir tekne balıkçılığı sistemi oluşturun. Sahil rol yapma deneyiminizi güçlendirecek noktalar, yakalama mantığı, satış zincirleri, tekne kiralama ve en iyi script'ler.
Agency Scripts
Agency Scripts Kurucusu ve Baş Geliştiricisi
Bir Oynanış Sistemi Olarak Açık Deniz Balıkçılığı
Açık deniz balıkçılığı, çoğu FiveM sunucusunda bulunan standart balıkçılık mekaniğini genişleterek oyuncuları açık sulara taşır; burada oyuncular daha büyük balık türleriyle mücadele eder, okyanus tehlikeleriyle başa çıkar, tekne yakıtını ve depolama kapasitesini yönetir. Kıyı balıkçılığı oyuncuların olta atıp beklediği pasif bir aktiviteyken, açık deniz balıkçılığı hazırlık, yatırım ve ekip çalışması gerektiren bir keşif gezisidir. Oyuncular tekne kiralar veya satın alır, yem ve olta takımı tedarik eder, deniz haritasında işaretli balıkçılık alanlarına gider ve suyun altındaki balık sürülerini tespit etmek için sonar ekipmanları kullanır. Avlanan balıklar kıyı balıklarına göre çok daha değerlidir ancak riskler de daha yüksektir: Fırtınalar teknelere zarar verebilir, kıyıdan uzakta yakıt tükenebilir ve nadir trofe balıklar oyuncunun sabrını ve becerisini sınayan uzun mücadeleler gerektirir. Bu risk ve ödül dengesi, bir oyuncunun doğru noktaya ulaşmak için otuz dakika yol aldıktan sonra dev bir orkinos yakalamasıyla gerçekten heyecan verici oynanış anları yaratır; arkadaşlarla çıkılan balık tutma turlarının sosyal dinamiği ise oyuncuların sunucuya tekrar dönmesini sağlayan anılar oluşturur.
Tekne Yapılandırması ve Filo Yönetimi
Kıyıya yakın balıkçılık için küçük botlardan derin su seferleri için büyük kiralık teknelere kadar birden fazla tekne sınıfı tanımlayın. Her teknenin hız, yakıt kapasitesi, yakalanan balıklar için depolama yuvaları, aynı anda kaç olta atılabileceğini belirleyen olta tutucu sayısı ve kullanım ile fırtınaya maruz kalma sonucu azalan bir dayanıklılık derecesi dahil yapılandırılabilir özellikleri olmalıdır. Tekne sahipliğini veritabanında saklayın ve oyuncuların teknelerini satın alabileceği, yükseltebileceği ve bakımını yapabileceği bir marina konumu sağlayın. Tekne sahiplerinin diğer oyuncuları güverteden balık tutabilecek mürettebat üyeleri olarak davet etmesine izin verin; böylece kaptan tekneyi yönetirken mürettebat üyelerinin birden fazla oltayı idare ettiği iş birliğine dayalı bir deneyim oluşturun:
Config.Boats = {
['dinghy'] = {
label = 'Fishing Dinghy',
model = 'dinghy',
price = 15000,
fuelCapacity = 60,
storageSlots = 10,
maxWeight = 200,
rodHolders = 1,
maxCrew = 2,
durability = 100,
speed = 'slow',
fishingZones = { 'nearshore' },
},
['marquis'] = {
label = 'Sport Fisher',
model = 'marquis',
price = 85000,
fuelCapacity = 200,
storageSlots = 30,
maxWeight = 800,
rodHolders = 4,
maxCrew = 6,
durability = 250,
speed = 'medium',
fishingZones = { 'nearshore', 'offshore', 'deep_sea' },
},
['tug'] = {
label = 'Commercial Trawler',
model = 'tug',
price = 250000,
fuelCapacity = 500,
storageSlots = 60,
maxWeight = 3000,
rodHolders = 6,
maxCrew = 8,
durability = 500,
speed = 'slow',
fishingZones = { 'nearshore', 'offshore', 'deep_sea', 'abyssal' },
},
}
Config.FishingZones = {
['nearshore'] = {
areas = {
{ center = vector3(-1850.0, -1250.0, 0.0), radius = 300.0 },
{ center = vector3(-3420.0, 970.0, 0.0), radius = 400.0 },
},
fish = {
{ item = 'bass', weight = { 1, 8 }, chance = 35, price = 15 },
{ item = 'mackerel', weight = { 0.5, 4 }, chance = 40, price = 10 },
{ item = 'snapper', weight = { 2, 12 }, chance = 20, price = 25 },
{ item = 'grouper', weight = { 5, 25 }, chance = 5, price = 40 },
},
},
['deep_sea'] = {
areas = {
{ center = vector3(-4200.0, -800.0, 0.0), radius = 600.0 },
{ center = vector3(-3800.0, 2200.0, 0.0), radius = 500.0 },
},
fish = {
{ item = 'tuna', weight = { 20, 120 }, chance = 25, price = 80 },
{ item = 'swordfish', weight = { 30, 200 }, chance = 15, price = 120 },
{ item = 'marlin', weight = { 50, 350 }, chance = 8, price = 200 },
{ item = 'shark', weight = { 80, 500 }, chance = 2, price = 500 },
},
},
}
Bölge sistemi, her alanda hangi balık türlerinin bulunabileceğini sınırlandırarak oyuncuları daha değerli avlar için kıyıdan uzaklaşmaya zorlar. Küçük tekneler yalnızca kıyıya yakın bölgelere erişebilirken, daha büyük tekneler en karlı balıkların yüzdüğü açık deniz ve derin deniz bölgelerinin kilidini açar. Bu durum, oyuncuların daha iyi balıkçılık alanlarına erişim sağlayan tekneleri finanse etmek için küçük avlardan para kazandığı doğal bir ilerleme yolu oluşturur.
Sonar ve Balık Bulma Mekanikleri
Teknelere çevredeki sudaki balık yoğunluğunu gösteren bir sonar ekranı ekleyin. Sonarı, oyuncu teknenin kontrol panelinden balık bulucu ekipmanını etkinleştirdiğinde görünen bir NUI katmanı olarak uygulayın. Sonar, çeşitli derinliklerdeki balık sürülerini temsil eden sinyal noktalarıyla dairesel bir tarama göstermeli, balık hareketini simüle etmek için hafif konum değişiklikleriyle birkaç saniyede bir güncellenmelidir. Her sinyal noktasının boyutu, sürünün yoğunluğunu ve potansiyel av kalitesini belirtir. Oyuncular oltalarını atmadan önce teknelerini bir sürünün üzerine konumlandırmalıdır, bu da balık tutma eylemi başlamadan önce bir navigasyon mini oyunu öğesi ekler. Sonar verileri, teknenin yapılandırılmış balıkçılık bölgelerine göre gerçek konumuna bağlı olarak sunucu tarafında oluşturulmalıdır: oyuncuların sabit av noktalarını kolayca ezberleyememesi için zamanla değişen rastgele sürü konumları kullanılmalıdır.
Balık Tutma Minigame'i ve Mücadele Mekanikleri
Bir balık oltaya vurduğunda, balık türüne ve ağırlığına göre zorluğu değişen bir olta mücadelesi mini oyunu başlatın. Mücadele, balığın davranışına göre hareket eden dinamik bir çubuk aracılığıyla misina gerilimini yönetmeyi içermelidir. Oyuncu bir tuşa basılı tutarak oltayı sarar, ancak misinanın kopmasını önlemek için balık ani hamle yaptığında tuşu bırakmalıdır. Daha büyük balıklar daha sert ve daha uzun süre mücadele eder, marlin ve köpekbalığı gibi derin deniz türleri birkaç dakika süren dikkatli bir gerilim yönetimi gerektirir. Uzun süren mücadelelerde heyecanı canlı tutmak için tahmini balık ağırlığını, türün siluetini ve mücadele ilerlemesini gösterin. Mücadele zorluğunu etkileyen akıntı kuvveti ve hava durumu gibi çevresel faktörler ekleyin, sakin havalar balık tutmak için ideal olurken fırtınalar zorluğu önemli ölçüde artırır:
local fishFight = {
active = false,
tension = 50, -- 0-100, snaps at 100
progress = 0, -- 0-100, fish landed at 100
fishStrength = 0,
fishBehavior = 'steady',
reeling = false,
}
function StartFishFight(fishData)
fishFight.active = true
fishFight.tension = 30
fishFight.progress = 0
fishFight.fishStrength = fishData.weight * 0.5
SendNUIMessage({
action = 'showFishFight',
species = fishData.item,
estimatedWeight = fishData.weight,
})
CreateThread(function()
while fishFight.active do
-- Fish behavior changes randomly
local behaviorRoll = math.random(100)
if behaviorRoll < 15 then
fishFight.fishBehavior = 'surge' -- strong pull
elseif behaviorRoll < 40 then
fishFight.fishBehavior = 'resist' -- moderate pull
else
fishFight.fishBehavior = 'steady' -- light pull
end
-- Apply fish force
local force = fishFight.fishStrength * 0.02
if fishFight.fishBehavior == 'surge' then
force = force * 3.0
fishFight.progress = math.max(0, fishFight.progress - 2)
elseif fishFight.fishBehavior == 'resist' then
force = force * 1.5
end
-- Reeling input
if IsControlPressed(0, 38) then -- E key
fishFight.reeling = true
fishFight.progress = fishFight.progress + 0.8
fishFight.tension = fishFight.tension + force + 1.5
else
fishFight.reeling = false
fishFight.tension = math.max(0, fishFight.tension - 3)
end
-- Check win/lose conditions
if fishFight.tension >= 100 then
EndFishFight(false, 'Line snapped!')
return
end
if fishFight.progress >= 100 then
EndFishFight(true, fishData)
return
end
-- Update HUD
SendNUIMessage({
action = 'updateFishFight',
tension = fishFight.tension,
progress = fishFight.progress,
behavior = fishFight.fishBehavior,
})
Wait(100)
end
end)
end
Hava ve Okyanus Koşulları
Oynanışı etkileyen dinamik okyanus koşulları oluşturmak için balıkçılık sisteminizi sunucunun hava durumuyla entegre edin. Sakin hava, düşük dalga şiddeti ve maksimum sonar doğruluğuyla ideal balıkçılık koşulları sağlar. Fırtınalar dalga boyunu artırır, sonar verimliliğini düşürür, zamanla teknelere hasar verir ve balıkların yakalanması daha zor olan derinliklere inmesine yol açar. Mevcut hava durumuna göre sakin, orta, dalgalı ve fırtınalı koşullar arasında kademeli geçiş yapan bir deniz durumu sistemi uygulayın. Fırtınalar sırasında native su seviyesi ayarlamalarıyla artan dalga boyu, tekne güvertesinde serpinti partikülleri ve dalga şiddetiyle artan ekran sarsıntısı gibi görsel efektler gösterin. Oyuncuların balık avı turlarını elverişli koşullara göre planlayabilmeleri için marinada hava durumu tahmini bilgisi sunun ve hava kötüleştiğinde denizdeki tekneleri uyararak koşullar tehlikeli hale gelmeden limana dönmelerini sağlayan bir fırtına uyarı sistemi ekleyin.
Balık Pazarı ve Ekonomi Entegrasyonu
Marinada, oyuncuların avlarını arz ve talebe göre dalgalanan fiyatlarla sattığı bir balık pazarı oluşturun. Birçok oyuncu ton balığı sattığında, ton balığı fiyatı düşer. Bir süredir kimse kılıç balığı satmadığında ise fiyat yükselir. Bu dinamik fiyatlandırma, pazar doygunluğa ulaştığında oyuncuları avlarını çeşitlendirmeye ve daha az popüler türleri hedeflemeye teşvik eder. Değişen zaman pencerelerinde tür başına satılan toplam balık miktarını takip edin ve fiyatları yapılandırılmış minimum ve maksimum sınırlar içinde ayarlayın. Oyuncuların yola çıkmadan önce hangi türleri hedefleyecekleri konusunda bilinçli kararlar verebilmeleri için güncel piyasa fiyatlarını marinadaki bir panoda sergileyin. Gelişmiş entegrasyon için, sunucudaki restoranların belirli balık türleri için yüksek fiyatlardan toplu sipariş vermesine izin verin: bu sayede balık tutan oyuncular ile restoran işletmecileri arasında her iki oyun döngüsünü de zenginleştiren doğrudan bir tedarik zinciri oluşturun.
Performans ve Entity Yönetimi
Tekneler ve okyanus ortamları benzersiz performans zorlukları sunar, çünkü GTA V'te su render işlemi zaten maliyetlidir; tekne entity'leri, balık tutma mücadele efektleri ve sonar katmanları eklemek yükü daha da artırır. Sunucudaki herkesin görebileceği düzinelerce balık nesnesi oluşturmaktan kaçınmak için, balık entity'lerini yalnızca aktif mücadeleler sırasında ve yalnızca mücadele eden oyuncuya görünür şekilde spawn edin. Su sıçramaları ve mücadele göstergeleri için partikül efektlerini idareli kullanınız, scope tabanlı render ile bunları uzaktaki gözlemciler için devre dışı bırakınız. Tekne yakıtı ve depolama durumu, sürekli senkronize edilmek yerine istemcinin yalnızca oyuncu ilgili UI panelini açtığında güncelleme talep etmesiyle server-side olarak takip edilmelidir. Oyuncular teknelerini marinaya bağladıklarında, tekne entity'sini despawn ediniz ve yakıt seviyesi, dayanıklılık ve depolanan balıklar dahil olmak üzere durumunu veritabanında saklayınız. Bu, marinaların sahipleri çevrim dışıyken bile sunucu kaynaklarını tüketen kalıcı tekne entity'leri ile dolmasını önler. Sisteminizi, birden fazla teknenin aynı bölgede aynı anda balık tuttuğu çok oyunculu senaryolarda test ediniz; balık sürüsü verilerinin, sonar ekranlarının ve mücadele örneklerinin her oyuncu için uygun şekilde izole kaldığından emin olunuz.