Routing buckets FiveM : SetPlayerRoutingBucket, instances et voix

Comment fonctionnent les routing buckets FiveM : SetPlayerRoutingBucket, SetEntityRoutingBucket, paramètres de population et de verrouillage, bucket 0, cas d'usage et ce qui se passe avec la voix.

Le symptôme : deux groupes de joueurs partagent le même emplacement et vous voulez qu'ils soient séparés, ou les joueurs dans un minigame voient un monde rempli de voitures et de piétons d'autres personnes.

Les routing buckets sont la version FiveM des dimensions ou des instances. Les entités et les joueurs dans différents buckets ne se voient pas. Ils sont l'outil derrière les appartements, les minigames et les écrans de sélection de personnage, et ils sont gérés sur le serveur. Cet article couvre chaque native et les erreurs à éviter.

Qu'est-ce qu'un routing bucket

Un bucket est un nombre. Chaque joueur et chaque entité appartient à exactement un bucket, et la valeur par défaut est 0. Deux choses dans différents buckets sont invisibles l'une pour l'autre : les joueurs ne voient pas les joueurs, véhicules ou props de l'autre bucket, et ils n'interagissent pas. Ils partagent toujours la même carte, donc les coordonnées restent les mêmes.

Cela ne fonctionne que sur un serveur avec OneSync, que les serveurs actuels utilisent. Consultez activation de OneSync si vous n'êtes pas sûr.

Les natives fondamentales

Tous ceux-ci s'exécutent sur le serveur :

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 prend l'id serveur du joueur et un numéro de bucket. SetEntityRoutingBucket prend la poignée d'entité. Les entités que vous créez sur le serveur après le déplacement du joueur commencent dans le bucket 0 à moins que vous les déplaciez, donc définissez le bucket juste après les avoir créées :

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

Choisissez les numéros de bucket exprès. Une habitude courante est de réserver des plages, par exemple une plage pour les maisons, une pour les minigames, de sorte que deux fonctionnalités ne réutilisent jamais un numéro par accident.

Attention : ces natives ne sont que côté serveur. Les appeler à partir d'un script client ne fait rien d'utile. Envoyez un événement au serveur et laissez le serveur déplacer le joueur, après qu'il ait vérifié la demande.

Population et verrouillage

Chaque bucket peut avoir ses propres règles :

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) désactive les PNJ ambiant et le trafic dans ce bucket. C'est utile pour les instances, car un intérieur vide ou un minigame n'a pas besoin de voitures qui le traversent. Le bucket 0 garde sa population normale.
  • SetRoutingBucketEntityLockdownMode(bucket, mode) contrôle la création d'entité. Les modes sont 'strict', 'relaxed' et 'inactive', et 'inactive' est le comportement normal, avec 'strict' étant le plus strict. Vérifiez la documentation de la native pour la différence exacte avant de compter sur une.

Définir les règles d'un nouveau bucket une fois, quand il est d'abord utilisé, suffit. Elles restent pour la vie du serveur.

Cas d'usage

  • Appartements et maisons : un bucket par propriété, afin que les intérieurs identiques ne se chevauchent pas. Le modèle complet est dans logement et instances.
  • Minigames et événements : mettez les participants dans un bucket privé avec la population désactivée, de sorte que rien à l'extérieur n'interfère.
  • Sélection et création de personnage : mettez le joueur dans un bucket privé tandis qu'il choisit un personnage, de sorte qu'il ne soit pas vu debout dans le monde, et déplacez-le vers 0 quand il apparaît.
  • Tutoriels et espaces d'administrateur : un bucket tranquille pour expliquer les choses sans le reste du serveur.
  • Test : essayez un script loin des joueurs.

Voix dans les buckets

Parce que les joueurs dans différents buckets ne sont pas proches l'un de l'autre du point de vue du jeu, la voix de proximité suit généralement la même séparation. Les ressources vocales comme pma-voice sont construites autour de OneSync et fonctionnent par bucket, de sorte que les joueurs dans une maison n'entendent pas la rue. Si vous voulez que les gens dans différents buckets parlent, utilisez le canal ou les fonctionnalités d'appel de la ressource vocale au lieu de combattre les buckets. Si la voix est muette après avoir déplacé les joueurs, consultez pma-voice ne fonctionne pas. Testez-le avec deux vrais joueurs, pas seulement un.

Un assistant d'instance réutilisable

Gardez la logique de bucket à un endroit, de sorte que chaque chemin de sortie la réinitialise :

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)

Appelez LeaveInstance à la sortie, à la mort, et quand votre ressource s'arrête :

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

Sans ce dernier gestionnaire, un redémarrage de script laisse les joueurs seuls dans un bucket vide.

Problèmes courants

  • Un joueur est coincé seul : il n'a jamais été ramené à 0. Réinitialisez sur chaque chemin de sortie et à l'arrêt des ressources.
  • Un véhicule manque pour le passager : le joueur et le véhicule se sont retrouvés dans différents buckets. Déplacez les deux.
  • Les entités générées apparaissent dans le mauvais monde : les nouvelles entités côté serveur commencent dans le bucket 0.
  • Différentes fonctionnalités réutilisent le même numéro et les joueurs se retrouvent dans les instances les uns des autres : réservez les plages.
  • Appel des natives sur le client : elles appartiennent au serveur.

Liste de contrôle

Symptôme Solution
Les joueurs voient le mauvais monde Vérifiez GetPlayerRoutingBucket pour les deux joueurs
Joueur seul après redémarrage Réinitialisez les buckets sur onResourceStop
Véhicule pas visible pour les amis du conducteur Définissez aussi le bucket du véhicule
Le trafic à l'intérieur d'une instance SetRoutingBucketPopulationEnabled(bucket, false)
Ne peut entendre personne Même bucket, puis vérifiez la ressource vocale
Rien ne se passe sur le client Les natives sont côté serveur

Réponses rapides

Quel est le routing bucket par défaut ?

Bucket 0. Chaque joueur et entité commence là à moins qu'un script les déplace.

Un client peut-il changer son propre routing bucket ?

Non. Les natives sont côté serveur. Le client demande, et le serveur décide et déplace le joueur.

Les véhicules se déplacent-ils avec le joueur quand je change le bucket ?

Ne comptez pas dessus. Déplacez le véhicule explicitement avec SetEntityRoutingBucket, et vérifiez le résultat dans vos propres tests.

Des scripts sans ce problème

Arcade MachinesSept jeux d’arcade jouables dans de vraies bornes, avec classements et paris.Voir le script →CCTV Security CamerasDes caméras à placer, une tablette multi-vues en direct et des photos imprimées comme preuves.Voir le script →

À lire aussi