Zurück zum Blog
Tutorial7 Min. Lesezeit

FiveM-Lotterie- und Glücksspielsysten: Casino-Scripts im Überblick

Füge FiveM Lotterien und Casinospiele hinzu. Spielautomaten, Blackjack, Jackpot-Töpfe und Scripts, die Spieler binden und Geld aus dem Spiel nehmen.

Agency Scripts

Gründer und leitender Entwickler bei Agency Scripts

Warum Casinos und Glücksspiele Spieler anziehen

Lotterie- und Glücksspielsysteme sprechen eine der stärksten Motivationen im Gaming an: den Nervenkitzel des Zufalls. Wenn ein Spieler in deinem FiveM-Server ein Casino betritt und sich an einen Spielautomaten setzt oder ein Lotterielos kauft, nimmt er an einem System teil, das unabhängig vom Ausgang echte Spannung erzeugt. Casinos sind soziale Treffpunkte, an denen Spieler aus allen Fraktionen auf neutralem Gebiet zusammenkommen, High Roller ihren Reichtum zur Schau stellen und Außenseiter dem Traum vom großen Gewinn nachjagen. Aus Sicht der Serverwirtschaft dient Glücksspiel als kontrollierte Geldsenke, die Geld aus dem Umlauf nimmt, wenn das Haus gewinnt. Das hilft, die Inflation zu bekämpfen, die Server plagt, auf denen Geld nur durch Jobs ins Spiel kommt. Ein gut gestaltetes Glücksspielsysten mit fairen Gewinnchancen, transparenten Regeln und verantwortungsvollen Limits bietet Unterhaltung, die Spieler auch in ruhigen Zeiten zum Einloggen bewegt, wenn sie sonst vielleicht nichts zu tun hätten.

Aufbau eines Lotteriesystems

Die Lotterie ist die einfachste Glücksspiele-Mechanik und oft die beliebteste, weil jeder Spieler auf dem Server unabhängig von seinem Aufenthaltsort teilnehmen kann. Gestalte deine Lotterie mit konfigurierbaren Ticketpreisen, Ziehungsplänen, Berechnungen des Gewinnpools und Mechanismen zur Übertragung des Jackpots. Speichere Ticketkäufe in der Datenbank und verknüpfe sie mit Spielerkennungen, damit die Tickets sitzungsübergreifend erhalten bleiben. Führe Ziehungen nach einem Timer oder zu festgelegten Uhrzeiten in der realen Welt aus. Verwende serverseitige Logik, um Gewinnzahlen zufällig auszuwählen und alle gekauften Tickets auf Treffer zu prüfen. Der Gewinnpool sollte sich aus Ticketverkäufen zusammensetzen, wobei ein konfigurierbarer Anteil an das Haus geht und die Serverwirtschaft finanziert:

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

Wenn kein Spieler den Jackpot knackt, übertrage den nicht beanspruchten Gewinnpool auf die nächste Ziehung. Diese Übertragungsmechanik lässt Jackpots anwachsen und sorgt serverweit für Spannung, wenn der Gewinn steigt. Gib den aktuellen Jackpotbetrag regelmäßig über Chat-Benachrichtigungen und auf Casino-Displays bekannt, damit das Interesse zwischen den Ziehungen hoch bleibt.

Implementierung von Spielautomaten

Spielautomaten sind das Herzstück jeder Casinofläche. Jeder Automat sollte konfigurierbare Einsatzbeträge, Walzensymbole mit gewichteten Wahrscheinlichkeiten und Auszahlungstabellen haben, die die Gewinne für jede Symbolkombination festlegen. Entscheidend für einen zufriedenstellenden Spielautomaten ist die visuelle Präsentation: Lass die Walzen mit flüssigen Animationen drehen, baue mit Beinahe-Gewinnen Spannung auf und feiere Gewinne mit Partikeleffekten und Soundeffekten. Ermittle das Ergebnis serverseitig, um Manipulationen auf der Client-Seite zu verhindern, und sende es anschließend zur animierten Darstellung an den Client. Verwende eine gewichtete Zufallsauswahl für Symbole, damit du den Hausvorteil und die erwartete Auszahlungsquote präzise steuern kannst. Ein typischer Spielautomat sollte im Laufe der Zeit zwischen 85 und 95 Prozent der Einsätze zurückzahlen. So hat das Haus einen konstanten Vorteil, während Gewinne trotzdem häufig genug vorkommen, damit Spieler Spaß am Spiel haben.

Kartenspiele und Tischmechaniken

Blackjack- und Pokertische bieten das tiefste Gameplay in deinem Casino, weil sie neben dem Zufall auch echtes Können und Entscheidungen erfordern. Implementiere für Blackjack die Standardregeln: ziehen, stehen, verdoppeln, teilen und Versicherung, wobei sich der Dealer an die Hausregeln hält und bei Soft 17 eine weitere Karte zieht. Die Blackjack-Logik läuft vollständig serverseitig und verwendet ein gemischtes Kartendeck, das pro Tischsitzung verwaltet wird. Wenn sich ein Spieler an einen Tisch setzt, tritt er einer Spielinstanz bei, die den Deckzustand, die Spielerhände, Einsätze und das Verhalten des Dealers verwaltet. Poker ist komplexer, da mehrere Spieler gegeneinander statt gegen das Haus antreten. Implementiere Texas Hold'Em mit korrekten Setzrunden, Gemeinschaftskarten, Handbewertung und Pot-Verwaltung. Die Funktion zur Bewertung von Händen muss alle Pokerhände vom höchsten Blatt bis zum Royal Flush korrekt erkennen und Stichentscheidungen behandeln. Beim Poker zieht das Haus statt eines direkten Vorteils einen kleinen Anteil aus jedem Pot, üblicherweise zwischen zwei und fünf Prozent, begrenzt durch einen Maximalbetrag.

Casino-Innenraum und Atmosphäre

Die Casino-Umgebung beeinflusst maßgeblich, wie Spieler das Glücksspielerlebnis wahrnehmen und genießen. Verwende individuelle MLO-Innenräume oder dekoriere bestehende Innenräume sorgfältig, um eine überzeugende Casinofläche mit getrennten Bereichen für Spielautomaten, Tischspiele, einen VIP-Bereich, eine Bar und eine Kasse zu schaffen. Platziere NPC-Dealer an Kartentischen, die passende Leerlaufanimationen abspielen und auf Spielergebnisse mit freudigen oder mitfühlenden Gesten reagieren. Ergänze über NUI-Audio atmosphärische Casino-Soundeffekte, die Spielautomaten-Jingles, das Mischen von Chips und Hintergrundmusik kombinieren. Implementiere ein Chipsystem, bei dem Spieler an der Kasse Bargeld gegen Casino-Chips tauschen, alle Glücksspiele mit Chips bezahlen und ihre Chips beim Verlassen auszahlen lassen. Dieser Tausch schafft eine psychologische Trennung zwischen echtem Geld und Glücksspielguthaben, wie sie auch in realen Casinos üblich ist. Gleichzeitig bietet er einen natürlichen Punkt zur Erfassung von Transaktionen für deine Systeme zur Überwachung der Wirtschaft.

Limits für verantwortungsvolles Glücksspiel

Jedes Glücksspielsystem benötigt integrierte Schutzmaßnahmen, damit Spieler nicht ihr gesamtes In-Game-Vermögen in einer einzigen Sitzung verlieren. Implementiere tägliche Verlustlimits, die den Verlust eines Spielers über alle Glücksspiele innerhalb eines Zeitraums von vierundzwanzig Stunden begrenzen. Wenn sich ein Spieler seinem Limit nähert, zeige Warnmeldungen an. Sobald er das Limit erreicht, sperre ihn bis zum Ablauf der Abklingzeit für Glücksspiele. Füge eine Selbstausschlussoption hinzu, mit der Spieler sich für einen konfigurierbaren Zeitraum freiwillig vom Casino ausschließen können. Erfasse die Glücksspielstatistiken jedes Spielers, darunter Gesamteinsätze, Gesamtgewinne, Nettogewinn oder -verlust und Sitzungsdauer. Stelle diese Statistiken dem Spieler über ein Menü für den Glücksspielverlauf und Serveradministratoren über ein Verwaltungsdashboard zur Verfügung. Diese Schutzmaßnahmen sind nicht nur gutes Game Design, sondern auch entscheidend für eine gesunde Serverwirtschaft, in der Glücksspiel das Gameplay bereichert, anstatt Frust zu verursachen und Spieler zu vertreiben.

Anti-Cheat und Fairness

Glücksspielsysteme sind besonders anfällig für Exploits, da sie Aktionen direkt in Geld umwandeln. Die gesamte Zufallszahlengenerierung muss serverseitig mit kryptografisch sicheren Zufallsquellen erfolgen. Vertraue niemals darauf, dass der Client Glücksspielergebnisse meldet. Validiere alle Einsätze auf dem Server, indem du vor der Verarbeitung eines Einsatzes das Chipguthaben des Spielers prüfst. Begrenze die Häufigkeit von Glücksspielaktionen, um automatisierte Wettskripte zu verhindern, die Timing-Schwachstellen ausnutzen könnten. Protokolliere jede Glücksspieltransaktion mit Zeitstempeln, Einsatzbeträgen, Ergebnissen und Spielerkennungen, damit Administratoren verdächtige Muster überprüfen können. Achte auf Spieler, die regelmäßig mit statistisch unwahrscheinlicher Häufigkeit gewinnen. Das kann auf Absprachen bei Pokerspielen oder auf das Ausnutzen von Vorhersagemechaniken hindeuten. Stelle bei Mehrspieler-Kartenspielen sicher, dass der Kartenmischalgorithmus tatsächlich zufällige Verteilungen erzeugt und kein Client die verdeckten Karten anderer Spieler durch Speicherinspektion oder Packet Sniffing einsehen kann.

Leistungsaspekte

In Casino-Bereichen halten sich viele Spieler auf engem Raum auf. Sie führen häufige Serveraktionen durch, etwa beim Setzen von Einsätzen, Ziehen von Karten und Drehen an Spielautomaten. Optimiere dein Glücksspielsystem, indem du Datenbankschreibvorgänge für Chiptransaktionen bündelst, für aktive Spielsitzungen einen In-Memory-Zustand verwendest und Daten erst dann in der Datenbank speicherst, wenn ein Spieler auszahlt oder die Verbindung trennt. Animationen an Spielautomaten sollten vollständig auf dem Client laufen, während der Server das Ergebnis im Voraus festlegt. So entfällt während der Drehanimation die kontinuierliche Serverkommunikation. Verwende bei Multiplayer-Pokertischen pro Tisch ein einzelnes Spielzustandsobjekt, das Aktualisierungen gleichzeitig an alle sitzenden Spieler überträgt, anstatt einzelne Nachrichten zu senden. Begrenze die Anzahl gleichzeitiger Spielinstanzen pro Tischtyp und richte für beliebte Tische zu Spitzenzeiten ein Warteschlangensystem ein. Räume den Spielzustand sofort auf, wenn Spieler den Tisch verlassen, um Speicherlecks durch verwaiste Sitzungen zu verhindern, die sich bei langen Serverlaufzeiten ansammeln.

Bereit loszulegen?

Hol dir die Scripts in unserem Shop, oder komm auf den Discord für Support, Updates und einen Blick auf das, was kommt.