Bloga Geri Dön
Tutorial7 dk. okuma

FiveM Piyango ve Kumar Sistemi: Casino Scriptleri Rehberi

FiveM sunucunuza piyangolar ve casino oyunları ekleyin. Slotlar, blackjack, jackpot havuzları ve sunucu etkileşimi ile para tüketimini artıracak en iyi kumar scriptleri.

Agency Scripts

Agency Scripts Kurucusu ve Baş Geliştiricisi

Casino ve Kumar Sistemleri Oyuncuları Neden Çeker?

Piyango ve kumar sistemleri, oyun dünyasındaki en güçlü motivasyon kaynaklarından birinden yararlanır: Şansın verdiği heyecan. Bir oyuncu FiveM sunucunuzda bir kumarhaneye girip slot makinesine oturduğunda veya bir piyango bileti aldığında, sonuç ne olursa olsun gerçek bir heyecan yaratan bir sistemle etkileşime girer. Kumarhaneler, tüm gruplardan oyuncuların tarafsız bir bölgede kaynaştığı, yüksek bahisçilerin zenginliklerini sergilediği ve şansını arayanların büyük kazanma hayalinin peşinden koştuğu sosyal buluşma noktaları olarak hizmet eder. Sunucu ekonomisi açısından kumar, kasa kazandığında nakit parayı dolaşımdan kaldıran kontrollü bir para eritme aracı işlevi görerek paranın yalnızca meslekler aracılığıyla girdiği sunucularda yaşanan enflasyonla mücadeleye yardımcı olur. Doğru oranlara, şeffaf kurallara ve sorumlu limitlere sahip iyi tasarlanmış bir kumar sistemi, oyuncuların başka yapacak bir şey bulamayabilecekleri sakin saatlerde oyuna girmesini sağlayan bir eğlence değeri katar.

Piyango Sistemi Mimarisi

Piyango, uygulanması en basit kumar mekaniğidir ve konumdan bağımsız olarak sunucudaki her oyuncu katılabildiği için genellikle en popüler olanıdır. Piyangonuzu yapılandırılabilir bilet fiyatları, çekiliş takvimleri, ödül havuzu hesaplamaları ve devreden büyük ikramiye mekanikleri ile tasarlayın. Biletlerin oturumlar arasında korunması için bilet alımlarını oyuncu kimliklerine (identifier) bağlı olarak veritabanında saklayın. Kazanan numaraları rastgele seçen ve satın alınan tüm biletleri eşleşmeler için kontrol eden server-side mantık kullanarak çekilişleri bir zamanlayıcıya göre veya planlanmış gerçek dünya saatlerinde yürütün. Ödül havuzu, sunucu ekonomisini fonlayan yapılandırılabilir bir kasa payı ile bilet satışlarından birikmelidir:

Config.Lottery = {
    ticketPrice = 500,
    maxTicketsPerPlayer = 10,
    numberRange = { min = 1, max = 49 },
    numbersPerTicket = 6,
    drawInterval = 7200, -- seconds between draws
    houseCut = 0.15,     -- 15% goes to server economy
    jackpotSeed = 10000, -- minimum jackpot amount
    prizes = {
        [6] = { label = 'Jackpot',    multiplier = 1.0  },  -- all 6 match
        [5] = { label = '5 Match',    multiplier = 0.05 },
        [4] = { label = '4 Match',    multiplier = 0.01 },
        [3] = { label = '3 Match',    multiplier = 0.002 },
    },
}

-- Server-side lottery draw
function ExecuteLotteryDraw()
    local winningNumbers = {}
    local pool = {}
    for i = Config.Lottery.numberRange.min, Config.Lottery.numberRange.max do
        pool[#pool + 1] = i
    end

    for i = 1, Config.Lottery.numbersPerTicket do
        local idx = math.random(1, #pool)
        winningNumbers[#winningNumbers + 1] = pool[idx]
        table.remove(pool, idx)
    end

    table.sort(winningNumbers)

    -- Get current prize pool
    local prizePool = GetLotteryPrizePool()
    local tickets = MySQL.query.await(
        'SELECT * FROM lottery_tickets WHERE draw_id = ?',
        { currentDrawId }
    )

    local winners = {}
    for _, ticket in ipairs(tickets) do
        local playerNumbers = json.decode(ticket.numbers)
        local matches = CountMatches(playerNumbers, winningNumbers)
        if matches >= 3 then
            local prize = Config.Lottery.prizes[matches]
            if prize then
                local winAmount = math.floor(prizePool * prize.multiplier)
                winners[#winners + 1] = {
                    citizenid = ticket.citizenid,
                    matches = matches,
                    prize = winAmount,
                    label = prize.label
                }
            end
        end
    end

    -- Distribute prizes
    for _, winner in ipairs(winners) do
        local Player = QBCore.Functions.GetPlayerByCitizenId(winner.citizenid)
        if Player then
            Player.Functions.AddMoney('bank', winner.prize, 'lottery-win')
            TriggerClientEvent('QBCore:Notify', Player.PlayerData.source,
                string.format('You won the %s! Prize: $%s',
                    winner.label, FormatNumber(winner.prize)), 'success')
        else
            MySQL.update('UPDATE players SET bank = bank + ? WHERE citizenid = ?',
                { winner.prize, winner.citizenid })
        end
    end

    -- Announce results server-wide
    local jackpotWon = false
    for _, w in ipairs(winners) do
        if w.matches == 6 then jackpotWon = true break end
    end

    TriggerClientEvent('lottery:client:drawResults', -1, {
        numbers = winningNumbers,
        winners = #winners,
        jackpotWon = jackpotWon,
        nextJackpot = jackpotWon and Config.Lottery.jackpotSeed
            or (prizePool * (1 - Config.Lottery.houseCut) + Config.Lottery.jackpotSeed)
    })
end

Hiçbir oyuncu büyük ikramiyeyi kazanamadığında, devredilmeyen ödül havuzunu bir sonraki çekilişe aktarın. Bu devretme mekanizması, ödül arttıkça sunucu genelinde heyecan yaratan büyüyen ikramiyeler oluşturur. Çekilişler arasındaki ilgiyi yüksek tutmak için mevcut ikramiye tutarını sohbet bildirimleri ve kumarhane ekranları aracılığıyla periyodik olarak duyurun.

Slot Makinesi Uygulaması

Slot makineleri her kumarhane alanının bel kemiğidir. Her makine; yapılandırılabilir bahis miktarlarına, ağırlıklı olasılıklara sahip makara sembollerine ve her sembol kombinasyonu için kazançları belirleyen ödeme tablolarına sahip olmalıdır. Tatmin edici bir slot makinesinin anahtarı görsel sunumdur: Makaraları akıcı animasyonlarla döndürün, neredeyse kazandıran kombinasyonlarla heyecanı artırın ve kazançları parçacık efektleri ve ses ipuçlarıyla kutlayın. İstemci tarafı manipülasyonunu önlemek için sonuç belirleme işlemini sunucu tarafında uygulayın, ardından sonucu animasyonlu gösterim için istemciye gönderin. Kasa avantajını ve beklenen oyuncuya geri dönüş (RTP) yüzdesini hassas şekilde kontrol edebilmek için sembollerde ağırlıklı rastgele seçim kullanın. Tipik bir slot makinesi, zaman içinde bahislerin yüzde 85 ila 95'ini geri döndürmeli; kasaya istikrarlı bir avantaj sağlarken oyuncuların deneyimden keyif alması için kazançları da yeterince sık kılmalıdır.

Kart Oyunları ve Masa Mekanikleri

Blackjack ve poker masaları, şansın yanı sıra gerçek beceri ve karar verme mekanizmalarını içerdiğinden kasanızdaki en derin oynanışı sunar. Blackjack için; kurpiyenin yumuşak on yedi için kasa kurallarına uymasıyla birlikte hit, stand, double down, split ve insurance dahil standart kuralları uygulayınız. Blackjack mantığı, masa oturumu başına takip edilen karıştırılmış bir deste ile tamamen server-side çalışır. Bir oyuncu masaya oturduğunda; deste durumunu, oyuncu ellerini, bahis miktarlarını ve kurpiye davranışını yöneten bir oyun oturumuna katılır. Poker, birden fazla oyuncunun kasaya karşı değil birbirine karşı yarışması nedeniyle ekstra karmaşıklık gerektirir. Doğru bahis turları, ortak kartlar, el değerlendirmesi ve pot yönetimi ile Texas Hold'Em uygulayınız. El sıralaması değerlendirme fonksiyonu, en yüksek karttan royal flush'a kadar tüm poker ellerini doğru şekilde tanımlamalı ve eşitlik durumlarını yönetmelidir. Poker için kasa doğrudan bir avantaja sahip olmak yerine, genellikle yüzde iki ila beş arasında olan ve belirli bir maksimum tutarla sınırlandırılan küçük bir rake payı alır.

Casino İç Mekanı ve Atmosferi

Kumarhane ortamı, oyuncuların kumar deneyimini nasıl algıladığını ve bundan nasıl keyif aldığını önemli ölçüde etkiler. Slotlar, masa oyunları, VIP alanı, bar ve vezne için ayrı bölgelere sahip ikna edici bir kumarhane katı oluşturmak üzere özel MLO iç mekanları veya özenle dekore edilmiş mevcut iç mekanları kullanın. Kart masalarına uygun bekleme animasyonları sergileyen ve oyun sonuçlarına kutlama veya teselli hareketleriyle tepki veren NPC krupiyeler yerleştirin. Slot makinesi seslerini, fiş karıştırmayı ve arka plan müziğini bir araya getiren NUI sesleri aracılığıyla ortam kumarhane ses efektleri ekleyin. Oyuncuların veznede nakit parayı kumarhane fişleriyle takas ettiği, tüm kumar faaliyetleri için fiş kullandığı ve ayrılırken fişleri nakde çevirdiği bir fiş sistemi uygulayın. Bu fiş takası, gerçek dünya kumarhane tasarımını yansıtan gerçek para ile kumar fonları arasında psikolojik bir ayrım oluştururken, aynı zamanda ekonomi takip sistemleriniz için doğal bir işlem kayıt noktası sağlar.

Sorumlu Kumar Limitleri

Her kumar sisteminin, oyuncuların tek bir oturumda oyun içi varlıklarını tüketmelerini önlemek için yerleşik koruma önlemlerine ihtiyacı vardır. Bir oyuncunun yirmi dört saatlik bir süre içinde tüm kumar aktivitelerinde ne kadar kaybedebileceğini sınırlayan günlük kayıp limitleri uygulayın. Bir oyuncu limitine yaklaştığında uyarı bildirimleri gösterin ve limite ulaştığında bekleme süresi dolana kadar kumar oynamasını engelleyin. Oyuncuların yapılandırılabilir bir süre boyunca kendilerini kumarhaneden gönüllü olarak men edebilecekleri bir kendini hariç tutma (self-exclusion) seçeneği ekleyin. Toplam yatırılan bahis, toplam kazanılan miktar, net kâr veya zarar ve oturum süresi dahil olmak üzere oyuncu başına kumar istatistiklerini takip edin. Bu istatistikleri kumar geçmişi menüsü aracılığıyla oyuncuya, yönetim paneli aracılığıyla da sunucu yöneticilerine sunun. Bu koruma önlemleri yalnızca iyi bir oyun tasarımı olmakla kalmaz; aynı zamanda kumarın oyuncuları uzaklaştıran bir hayal kırıklığı yaratmak yerine oynanışı geliştirdiği sağlıklı bir sunucu ekonomisini sürdürmek için de vazgeçilmezdir.

Anti-Cheat ve Adillik

Kumar sistemleri, eylemleri doğrudan paraya dönüştürdükleri için suistimale en açık hedeflerdir. Tüm rastgele sayı üretimi, kriptografik olarak yeterli rastgele kaynaklar kullanılarak sunucu tarafında gerçekleşmelidir. Kumar sonuçlarını bildirme konusunda asla istemciye güvenmeyin. Herhangi bir bahsi işlemeden önce oyuncunun çip bakiyesini kontrol ederek tüm bahisleri sunucuda doğrulayın. Zamanlama açıklarını kötüye kullanabilecek otomatik bahis script'lerini önlemek için kumar eylemlerine rate limiting uygulayın. Yöneticilerin şüpheli kalıpları denetleyebilmesi için her kumar işlemini zaman damgaları, bahis tutarları, sonuçlar ve oyuncu kimlikleriyle kaydedin. İstatistiki olarak imkansız oranlarda sürekli kazanan oyuncuları izleyin; bu durum poker oyunlarında gizli anlaşmaya veya tahmin mekaniklerinin suistimal edildiğine işaret edebilir. Çok oyunculu kart oyunlarında deste karıştırma algoritmasının gerçekten rastgele dağılımlar ürettiğinden ve hiçbir istemcinin bellek incelemesi veya paket dinleme yoluyla diğer oyuncuların kapalı kartlarını göremediğinden emin olun.

Performans Hususları

Casino bölgeleri, bahisler, kart çekimleri ve slot çevirmeleri aracılığıyla sık sık sunucu etkileşiminde bulunan birçok oyuncuyu küçük bir alanda toplar. Çip işlemleri için veritabanı yazma işlemlerini toplu hale getirerek, aktif oyun oturumları için bellek içi durumu kullanarak ve veritabanına yalnızca bir oyuncu parasını çektiğinde veya bağlantısı kesildiğinde kaydederek kumar sisteminizi optimize edin. Slot makinesi animasyonları, sonucu sunucu tarafından önceden belirlenmiş şekilde tamamen istemcide çalışmalı ve döndürme animasyonu sırasında sürekli sunucu iletişimi ihtiyacını ortadan kaldırmalıdır. Çok oyunculu poker masalarında, bireysel mesajlar göndermek yerine güncellemeleri masadaki tüm oyunculara aynı anda yayınlayan masa başına tek bir oyun durumu nesnesi kullanın. Masa türü başına eşzamanlı oyun örneği sayısını sınırlandırın ve yoğun saatlerde popüler masalar için bir sıra sistemi uygulayın. Uzun sunucu çalışma süreleri boyunca biriken terkedilmiş oturumlardan kaynaklanan bellek sızıntılarını önlemek için, oyuncular masalardan ayrıldığında oyun durumunu derhal temizleyin.

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.