FiveM Laden- und Bank-Überfall-Skripte: Einrichtung und Server-seitiges Design

Wie du Laden- und Bank-Überfälle auf FiveM einrichtest und gestaltest: Polizei-Zahl, Server-seitige Cooldowns, Belohnungen, die nur vom Server gegeben werden, Polizei-Benachrichtigungen und Distanz-Überprüfungen.

Das Symptom: Spieler berauben einen Laden ohne Polizei online, der gleiche Laden wird zehnmal in einer Reihe beraubt, oder ein Cheater feuert ein Event und bekommt die ganze Auszahlung.

Ein Überfall-Skript ist ein kleiner Server-seitiger Zustand-Maschine: überprüfe die Regeln, starte, warte, zahle. Die meisten Exploits entstehen durch das Setzen dieser Schritte auf dem Client. Dieser Artikel behandelt ein sicheres Design und die Config-Fehler, die die oben genannten Probleme verursachen.

Der Fluss, den du möchtest

Denke an jeden Überfall als vier Schritte, und führe Schritte 1, 2 und 4 auf dem Server aus:

  1. Start-Anfrage: Der Client fragt, einen Laden zu berauben. Der Server überprüft Polizei-Zahl, Cooldown, Distanz und dass niemand ihn bereits beraubt.
  2. Sperren: Der Server markiert den Laden als beraubt und setzt den Cooldown.
  3. Aktion: Der Client spielt die Fortschrittsleiste, den Hack oder das Lockpick.
  4. Beende: Der Client meldet fertig, der Server überprüft die verstrichene Zeit und die Distanz erneut, dann zahlt.

Der Client behandelt nur die Visuals. Er entscheidet nie über das Ergebnis.

Polizei-Zahl

Erfordern die Mindestanzahl von im Dienst befindlichen Beamten, gezählt auf dem Server. Ein Skript, das die Zahl vom Client liest oder einen Wert, den der Client sendet, liest, ist trivial zu umgehen. Der Zählcode ist in Einrichtung eines Polizei-Jobs. Überprüfe ihn, wenn der Überfall startet, und entscheide, ob er vor der Auszahlung erneut überprüft werden sollte.

Cooldowns auf dem Server gespeichert

Behalte den Zustand in einer Server-Tabelle, die nach der Standort-ID geschlüsselt ist:

lua
-- server
-- [id] = { busy = bool, last = os.time(), robber = source, started = os.time() }
local robberies = {}

local function canRob(id, cooldown)
    local state = robberies[id]
    if not state then return true end
    if state.busy then return false end
    return (os.time() - state.last) >= cooldown
end

Zwei Details sind wichtig:

  • Eine Tabelle im Speicher setzt sich zurück, wenn die Resource neu startet. Wenn du den Cooldown einen Neustart überleben möchtest, speichere die letzte Überfall-Zeit in der Datenbank.
  • Stelle busy fest, wenn der Überfall startet und clear es, wenn er endet oder der Räuber sich trennt, oder der Laden bleibt für immer gesperrt.

Belohnungen nur vom Server

Der häufigste Exploit ist ein Belohnungs-Event, das der Client allein auslösen kann:

lua
-- WRONG: any client can fire this
RegisterNetEvent('robbery:reward', function(amount)
    exports.ox_inventory:AddItem(source, 'money', amount)
end)

Die Behebung ist, dieses Event überhaupt nicht zu haben. Der Server entscheidet den Betrag und zahlt innerhalb des Codes, der den Überfall verifiziert:

lua
-- server (ox_lib callback)
lib.callback.register('robbery:finish', function(source, id)
    local state = robberies[id]
    if not state or state.robber ~= source then return false end
    if os.time() - state.started < Config.MinDuration then return false end

    local ped = GetPlayerPed(source)
    if #(GetEntityCoords(ped) - Config.Stores[id].coords) > 5.0 then return false end

    state.busy = false
    state.last = os.time()
    local amount = math.random(Config.Reward.min, Config.Reward.max)
    exports.ox_inventory:AddItem(source, 'money', amount)
    return true
end)

Beachte die drei Überprüfungen: der gleiche Spieler hat ihn gestartet, genug Zeit hat vergangen, und der Spieler ist noch im Laden. Server-seitige Distanz funktioniert, weil der Server die Position des Spielers mit OneSync kennt. Siehe Sichern von Server-Events und Server-Callbacks für das Muster.

Achtung: Der Element-Name für Bargeld hängt von deiner Einrichtung ab. Nutze das Element oder die Framework-Funktion, die dein Server für Geld nutzt, und behalte es auf dem Server.

Polizei benachrichtigen

Teile den Beamten mit, wenn der Überfall startet, vom Server zu jedem im Dienst befindlichen Polizei-Spieler:

lua
-- server: send to each on-duty officer you found with your police count
TriggerClientEvent('robbery:policeAlert', officerSrc, Config.Stores[id].coords, Config.Stores[id].label)

Auf dem Client, füge einen Blip und eine Benachrichtigung hinzu. Du kannst auch die Benachrichtigung an deine Dispatch-Resource statt zu deinem eigenen Bau geben, das gibt Beamten einen einzelnen Ort für alle Anrufe. Eine kleine Verzögerung oder eine Chance auf einen stillen Alarm macht den Überfall weniger gescripted. Blips werden in Creating Blips behandelt.

Häufige Config-Fehler

  • Polizei-Zahl auf 0 eingestellt während des Testens, dann auf dem Live-Server so gelassen.
  • Belohnungs-Bereich zu hoch. Ein Überfall, das mehr zahlt als eine Stunde einer beliebigen Job, wird bewirtschaftet. Vergleiche mit deinem Gehalt, wie in Ausgleich der Server-Wirtschaft.
  • Cooldown zu kurz. Mit ein paar Läden und schnellen Cooldowns, rotieren Spieler zwischen ihnen.
  • Keine Distanz-Überprüfung auf dem Finish-Schritt, daher kann ein Spieler den Überfall starten und ihn von der anderen Seite der Karte sammeln.
  • Benötigte Gegenstände (Lockpick, Bohrer) nie entfernt, oder entfernt auf dem Client.
  • Busy Flag nie cleared nach einer Trennung oder einem Script-Fehler.
  • Koordinaten von einer anderen Karte kopiert. Wenn du ein anderes MLO oder eine andere Karte nutzt, ist der Laden-Standort falsch.

Teste mit einem zweiten Account, das ist kein Admin, weil Admin-Berechtigungen eine fehlende Überprüfung verstecken können.

Checkliste

Symptom Behebung
Überfall ohne Polizei online Zähle im Dienst befindliche Beamte auf dem Server, stelle ein Minimum über 0 fest
Laden sofort erneut beraubt Füge einen Server-Cooldown hinzu, das nach Laden-ID geschlüsselt ist
Cheater bekommt die Auszahlung Entferne Client-Belohnungs-Events, zahle innerhalb des verifizierten Server-Codes
Auszahlung von weiter weg Überprüfe Distanz auf dem Server beim Start und Beende
Laden für immer gesperrt Leere die Busy Flag beim Beende, Fehler und Trennung
Cooldown beim Neustart verloren Speichere die letzte Überfall-Zeit in der Datenbank

Kurze Antworten

Wo sollte der Überfall-Cooldown gespeichert werden?

Auf dem Server, in einer Tabelle, die nach der Laden- oder Bank-ID geschlüsselt ist. Ein Cooldown, der auf dem Client behalten wird, setzt sich bei jedem Reconnect zurück und ist leicht zu überspringen.

Warum bekommen Spieler Geld aus Überfällen, ohne sie zu tun?

Das Belohnungs-Event verlässt sich auf den Client. Gebe die Belohnung nur innerhalb des Server-Codes, der den Überfall gestartet und überprüft hat, nie von einem Event, das der Client allein auslösen kann.

Wie viele Polizisten sollte ein Überfall brauchen?

Es hängt davon ab, wie viele Beamte dein Server normalerweise hat. Ein gemeinsamer Start ist einer oder zwei für einen kleinen Laden und mehr für eine Bank, dann passe aus dem an, was du siehst.

Scripts ohne dieses Problem

CCTV Security CamerasPlatzierbare Kameras, ein Live-Tablet mit Multi-View und ausgedruckte Beweisfotos.Script ansehen →Advanced BoostingFahrzeug-Boosting per Tablet: Aufträge von Klasse D bis S+, Crews und eine Live-Warteschlange.Script ansehen →Shop CreatorBau einen Shop in unter einer Minute — Besitzer, Angestellte, Tresore und Überfälle inklusive.Script ansehen →

Weiterlesen