Bloga Geri Dön
Tutorial7 dk. okuma

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.

Başlamaya Hazır mısınız?

Scriptleri mağazamızdan edinin veya destek, güncellemeler ve gelecek yeniliklere göz atmak için Discord'a katılın.