FiveM Drogen-System-Design: Sammeln, Verarbeiten und sicher Verkaufen

Wie man ein FiveM-Drogen-System designt: Sammeln und Verarbeiten mit Server-seitigen Item-Überprüfungen, Rate-Limits, sicheres Verkaufen an NPCs, Polizei-Warnungen und Ausgleich von Auszahlungen.

Das Symptom: Spieler haben in Minuten Tausende Drogen, verkaufen den gleichen Gegenstand für immer an den gleichen NPC, oder verdienen zehnmal so viel wie ein Job ohne Polizei-Warnung.

Ein Drogen-System hat drei Stufen: Sammeln, Verarbeiten und Verkaufen. Alle drei folgen der gleichen Regel: Der Client fragt, der Server überprüft und entscheidet. Dieser Artikel zeigt die Überprüfungen und die Ausgleichsfragen, die wichtig sind.

Die drei Stufen

Stufe Was passiert Was der Server überprüfen muss
Sammeln Spieler pflückt eine Pflanze, schürft eine Ressource Standort, Cooldown, ein Rate-Limit
Verarbeiten Rohe Items werden zu einem fertigen Produkt Der Spieler hat die Items, ist am Verarbeitungsort
Verkaufen Produkt wird zu Geld oder schmutziges Geld Das Item, der Käufer, der Preis, der Cooldown

Jede Stufe verbraucht oder erstellt Items, daher verwendet das sichere Design deine Inventar-Server-Funktionen. Die Item-Erstellungsseite ist in adding items to ox_inventory.

Server-seitige Item-Überprüfungen

Vertraue niemals einem Client, der sagt „Ich habe 10 davon". Frage das Inventar auf dem Server, entferne die Eingaben, füge dann die Ausgaben hinzu, an einem Ort:

lua
-- server
RegisterNetEvent('drugs:process', function()
    local src = source
    if not isNearProcessor(src) then return end   -- distance check on the server

    local count = exports.ox_inventory:GetItemCount(src, 'weed_leaf')
    if count < 3 then return end

    if exports.ox_inventory:RemoveItem(src, 'weed_leaf', 3) then
        exports.ox_inventory:AddItem(src, 'weed_bag', 1)
    end
end)

Entferne zuerst, füge zweite hinzu, und füge nur hinzu, wenn die Entfernung erfolgreich war. Wenn du zuerst hinzufügst, kann ein Spieler, der das Event spammt, die Ausgabe behalten und nichts verlieren. Überprüfe canCarryItem, bevor du hinzufügst, wenn Spieler voll sein können.

Rate-Limits

Selbst ein legitimes Event kann durch Auslösen in einer Schleife missbraucht werden. Gib jeder Aktion eine Mindest-Verzögerung pro Spieler, auf dem Server:

lua
local lastAction = {}

local function rateLimited(src, key, ms)
    local now = GetGameTimer()
    lastAction[src] = lastAction[src] or {}
    if lastAction[src][key] and now - lastAction[src][key] < ms then
        return true
    end
    lastAction[src][key] = now
    return false
end

Setze die Verzögerung ein wenig unter, was die echte Aktion dauert, damit ehrliche Spieler nie blockiert werden. Denke daran, lastAction[src] bei playerDropped zu löschen, damit die Tabelle nicht für immer wächst. Das Sammeln sollte auch durch Ort begrenzt sein: Eine Pflanze, die auf einem Feld existiert, darf nicht von überall gepflückt werden.

Sichereres Verkaufen an NPCs

Der Verkauf an Fußgänger ist der am meisten missbrauchte Teil, da der Client den Ped wählt. Füge die Option mit deiner Ziel-Bibliothek auf dem Client hinzu, zum Beispiel auf allen Peds:

lua
-- client (ox_target)
exports.ox_target:addGlobalPed({
    {
        label = 'Offer drugs',
        icon = 'fa-solid fa-cannabis',
        distance = 2.0,
        canInteract = function(entity)
            return not IsPedAPlayer(entity) and not IsEntityDead(entity)
        end,
        onSelect = function(data)
            TriggerServerEvent('drugs:sell', 'weed_bag')
        end,
    },
})

Ziel-Grundlagen sind in adding ox_target zones. Beachte, dass der Client nur den Item-Namen sendet. Alles andere wird auf dem Server entschieden:

lua
RegisterNetEvent('drugs:sell', function(item)
    local src = source
    local price = Config.Prices[item]
    if not price then return end                      -- only allowed items
    if rateLimited(src, 'sell', 4000) then return end -- cooldown between deals

    if exports.ox_inventory:RemoveItem(src, item, 1) then
        local payout = math.random(price.min, price.max)
        exports.ox_inventory:AddItem(src, 'black_money', payout)
    end
end)

Der Preis kommt aus der Server-Konfiguration, niemals vom Client. Der Item-Name sollte gegen eine erlaubte Liste überprüft werden, da ein Client jeden Namen senden könnte. Füge eine zufällige Chance hinzu, dass der NPC sich weigert oder dich anzeigt. Wenn der Verkauf erfordert, dass der Spieler in einer Zone oder nur nachts ist, überprüfe das auch auf dem Server. Der black_money-Item-Name hängt von deinem Setup ab; siehe money types.

Polizei-Warnungen

Risiko ist das, was Drogen interessant macht. Warnt die Polizei auf Chance, vom Server, mit dem Ort des Deals:

  • Eine Prozentchance bei jedem Verkauf (zum Beispiel eine kleine Chance, dass der NPC die Polizei anruft).
  • Eine größere Chance, wenn weniger Deals in einer ruhigen Gegend gemacht wurden, oder wenn viele Deals am gleichen Ort passieren.
  • Eine erforderliche Mindestanzahl von Dienst habenden Beamten zum Verkaufen und Verarbeiten, gezählt auf dem Server, wie in setting up a police job.

Wenn du eine Phone-App für Deals verwendest, sollten Bestellungen und Treffpunkte immer noch auf dem Server erstellt und überprüft werden.

Drug Dealer AppStraßenverkauf als lb-phone-App: Zonen, NPC-Käufer, Level und Polizeialarme.ab 18,15 €Script ansehen →

Auszahlungen ausgleichen

Ausgeglichene Zahlen, nicht im Gefühl:

  1. Zeitpunkt einer vollständigen Schleife (Sammeln, Verarbeiten, Verkaufen) und zähle, wie viele Minuten es dauert.
  2. Berechne Geld pro Stunde: Auszahlung mal Schleifen pro Stunde.
  3. Vergleiche es mit deinem besten legalen Job-Gehalt. Drogen können mehr zahlen, wegen des Risikos, aber ein Faktor von zwei oder drei reicht.
  4. Füge Reibung hinzu: Verarbeitungszeit, Item-Gewicht, eine begrenzte Anzahl von Verkäufen pro NPC, einen Cooldown pro Ort.

Dann beobachte das Geld in deiner Datenbank nach einer Woche und passe an. Die Methode ist in balancing your server economy.

Checkliste

Symptom Lösung
Unendliche Items Überprüfe Ort, entferne Eingaben zuerst und Rate-Limit auf dem Server
Client setzt den Preis Nimm Preise nur aus der Server-Konfiguration
Verkauft jedes Item als Drogen Überprüfe den Item-Namen gegen eine erlaubte Liste
Gleicher NPC kauft für immer Füge einen Cooldown pro Spieler und pro Ped oder Ort hinzu
Drogen zahlen zu viel Vergleiche Geld pro Stunde mit einem normalen Job
Keine Polizei-Reaktion Warne auf Chance, vom Server

Kurze Antworten

Warum bekommen Spieler unbegrenzte Drogen?

Das Sammel- oder Verarbeitungs-Event läuft auf dem Server ohne Überprüfung von Ort, Zeit oder Grenzen, daher kann ein modifizierter Client es in einer Schleife auslösen. Füge die Überprüfungen und ein Rate-Limit auf dem Server hinzu.

Wie lasse ich Spieler Drogen an NPCs verkaufen?

Füge eine Ziel-Option zu Fußgängern auf dem Client hinzu, lass dann den Server das Item, die Entfernung, einen Cooldown und den Preis überprüfen, bevor er zahlt. Der Client fragt nur.

Wie gleiche ich Drogen-Auszahlungen aus?

Berechne das Geld pro Stunde, das ein Spieler verdienen kann, und vergleiche es mit einem normalen Job. Drogen können mehr zahlen, da sie riskant sind, aber nicht so viel, dass niemand anders etwas macht.

Scripts ohne dieses Problem

Drug Dealer AppStraßenverkauf als lb-phone-App: Zonen, NPC-Käufer, Level und Polizeialarme.Script ansehen →Item Creator V2Erstelle nutzbare Items mit Animationen, Props, Effekten und mehr — ganz ohne Code.Script ansehen →Pawn Shop AppEin Pfandmarkt zwischen Spielern, direkt in lb-phone.Script ansehen →

Weiterlesen