FiveM Routing-Buckets: SetPlayerRoutingBucket, Instanzen und Stimme

Wie FiveM Routing-Buckets funktionieren: SetPlayerRoutingBucket, SetEntityRoutingBucket, Bevölkerungs- und Lockdown-Einstellungen, Bucket 0, Use-Cases und was mit der Stimme passiert.

Das Symptom: zwei Gruppen von Spielern teilen den gleichen Standort und du möchtest sie trennen, oder Spieler in einem Minigame sehen eine Welt voller Autos und Fußgänger anderer Menschen.

Routing-Buckets sind FiveMs Version von Dimensionen oder Instanzen. Entitäten und Spieler in verschiedenen Buckets sehen sich nicht gegenseitig. Sie sind das Tool hinter Apartments, Minigames und Character-Selection-Bildschirmen, und sie werden auf dem Server verwaltet. Dieser Artikel behandelt jeden Native und die Fehler, die es zu vermeiden gilt.

Was ein Routing-Bucket ist

Ein Bucket ist eine Zahl. Jeder Spieler und jede Entität gehört zu genau einem Bucket, und der Standard ist 0. Zwei Dinge in verschiedenen Buckets sind füreinander unsichtbar: Spieler sehen die Spieler, Fahrzeuge oder Props des anderen Buckets nicht, und sie interagieren nicht. Sie teilen immer noch die gleiche Karte, daher bleiben die Koordinaten gleich.

Dies funktioniert nur auf einem Server mit OneSync, das aktuelle Server verwenden. Siehe Enabling OneSync, wenn du nicht sicher bist.

Die Kern-Natives

Alle dieser laufen auf dem Server:

lua
-- put a player in a bucket, and read it back
SetPlayerRoutingBucket(source, 50)
local bucket = GetPlayerRoutingBucket(source)

-- put an entity (vehicle, ped, object) in a bucket
SetEntityRoutingBucket(vehicle, 50)
local entityBucket = GetEntityRoutingBucket(vehicle)

-- back to the default world
SetPlayerRoutingBucket(source, 0)

SetPlayerRoutingBucket nimmt die Server-ID des Spielers und eine Bucket-Nummer. SetEntityRoutingBucket nimmt das Entitäts-Handle. Entitäten, die du auf dem Server erstellst, nachdem der Spieler sich bewegt hat, starten in Bucket 0, es sei denn, du bewegst sie, daher stelle den Bucket sofort nach dem Erstellen fest:

lua
local veh = CreateVehicle(`sultan`, 0.0, 0.0, 70.0, 0.0, true, true)
SetEntityRoutingBucket(veh, 50)

Wähle Bucket-Nummern absichtlich. Eine häufige Gewohnheit ist, Bereiche zu reservieren, zum Beispiel einen Bereich für Häuser, einen für Minigames, daher verwenden zwei Features niemals eine Zahl zufällig erneut.

Achtung: Diese Natives sind nur Server-seitig. Ihre Aufrufe von einem Client-Skript machen nichts Nützliches. Sende ein Event an den Server und lass den Server den Spieler bewegen, nachdem er die Anfrage überprüft hat.

Bevölkerung und Lockdown

Jeder Bucket kann seine eigenen Regeln haben:

lua
-- no ambient pedestrians or traffic in bucket 50
SetRoutingBucketPopulationEnabled(50, false)

-- who may create entities in bucket 50
SetRoutingBucketEntityLockdownMode(50, 'strict')
  • SetRoutingBucketPopulationEnabled(bucket, false) schaltet Ambient-NPCs und Verkehr in diesem Bucket aus. Es ist nützlich für Instanzen, weil ein leerer Innenraum oder ein Minigame nicht braucht, dass Autos dadurch fahren. Bucket 0 behält seine normale Bevölkerung.
  • SetRoutingBucketEntityLockdownMode(bucket, mode) steuert die Entitäts-Erstellung. Die Modi sind 'strict', 'relaxed' und 'inactive', und 'inactive' ist das normale Verhalten, mit 'strict' als das straffeste. Überprüfe die Dokumentation des Native auf die genaue Unterschied, bevor du dich auf einen verlässt.

Das Einstellen von Regeln eines neuen Buckets einmal, wenn er zuerst verwendet wird, ist genug. Sie bleiben für die Lebensdauer des Servers.

Use-Cases

  • Apartments und Häuser: ein Bucket pro Eigenschaft, damit identische Innenräume sich nicht überlappen. Das komplette Muster ist in Wohnen und Instanzen.
  • Minigames und Veranstaltungen: Lege die Teilnehmer in einen privaten Bucket mit Bevölkerung aus, damit nichts von außen eingreift.
  • Character-Auswahl und -Erstellung: Lege den Spieler in einen privaten Bucket, während er einen Charakter aussucht, damit er nicht in der Welt stehend gesehen wird, und bewege ihn zu 0, wenn er spawnt.
  • Tutorials und Admin-Räume: ein ruhiger Bucket zum Erklären von Dingen ohne den Rest des Servers.
  • Testen: Versuche ein Skript weg von Spielern.

Stimme in Buckets

Da Spieler in verschiedenen Buckets nicht nah beieinander aus der Sicht des Spiels sind, folgt die Nähe-Stimme im Allgemeinen der gleichen Trennung. Stimm-Resources wie pma-voice sind um OneSync gebaut und funktionieren pro Bucket, daher hören Spieler in einem Haus nicht die Straße. Wenn du möchtest, dass Menschen in verschiedenen Buckets sprechen, nutze die Stimm-Resource, die eigene Kanal- oder Anruffunktionen hat, statt gegen die Buckets zu kämpfen. Wenn die Stimme nach dem Bewegen von Spielern still ist, siehe pma-voice funktioniert nicht. Teste es mit zwei echten Spielern, nicht nur mit einem.

Ein wiederverwendbarer Instanz-Helfer

Halte die Bucket-Logik an einer Stelle, daher setzt jeder Exit-Pfad es zurück:

lua
local instances = {}   -- [source] = bucket

function EnterInstance(src, bucket)
    instances[src] = bucket
    SetPlayerRoutingBucket(src, bucket)
end

function LeaveInstance(src)
    instances[src] = nil
    SetPlayerRoutingBucket(src, 0)
end

AddEventHandler('playerDropped', function()
    instances[source] = nil
end)

Rufe LeaveInstance auf Ausgang, auf Tod und wenn deine Resource stoppt auf:

lua
AddEventHandler('onResourceStop', function(resource)
    if resource ~= GetCurrentResourceName() then return end
    for src in pairs(instances) do
        SetPlayerRoutingBucket(src, 0)
    end
end)

Ohne diesen letzten Handler, ein Script-Neustart lässt Spieler allein in einem leeren Bucket.

Häufige Probleme

  • Ein Spieler ist allein stecken: er wurde nie zurück zu 0 bewegt. Setze auf jedem Exit-Pfad und auf Resource Stop zurück.
  • Ein Fahrzeug fehlt für den Beifahrer: Der Spieler und das Fahrzeug endeten in verschiedenen Buckets. Bewege beide.
  • Gespawnte Entitäten erscheinen in der falschen Welt: neue Server-seitige Entitäten starten in Bucket 0.
  • Verschiedene Features verwenden die gleiche Zahl erneut und Spieler landen in jeder anderen Instanz: reserviere Bereiche.
  • Die Natives auf dem Client aufrufen: Sie gehören auf den Server.

Checkliste

Symptom Behebung
Spieler sehen die falsche Welt Überprüfe GetPlayerRoutingBucket für beide Spieler
Spieler allein nach einem Neustart Setze Buckets auf onResourceStop zurück
Fahrzeug nicht sichtbar für die Freunde des Fahrers Stelle auch den Fahrzeug-Bucket fest
Verkehr in einer Instanz SetRoutingBucketPopulationEnabled(bucket, false)
Kann niemanden hören Gleicher Bucket, dann überprüfe die Stimm-Resource
Nichts passiert auf dem Client Die Natives sind Server-seitig

Kurze Antworten

Was ist der Standard-Routing-Bucket?

Bucket 0. Jeder Spieler und jede Entität startet dort, es sei denn, ein Skript bewegt es.

Kann ein Client seinen eigenen Routing-Bucket ändern?

Nein. Die Natives sind Server-seitig. Der Client fragt, und der Server entscheidet und bewegt den Spieler.

Bewegen sich Fahrzeuge mit dem Spieler, wenn ich den Bucket ändere?

Verlasse dich nicht darauf. Bewege das Fahrzeug explizit mit SetEntityRoutingBucket, und überprüfe das Ergebnis in deinen eigenen Tests.

Scripts ohne dieses Problem

Arcade MachinesSieben spielbare Arcade-Games in echten Automaten, mit Bestenlisten und Wetten.Script ansehen →CCTV Security CamerasPlatzierbare Kameras, ein Live-Tablet mit Multi-View und ausgedruckte Beweisfotos.Script ansehen →

Weiterlesen