FiveM routing buckets: SetPlayerRoutingBucket, instances и голос
Как работают FiveM routing buckets: SetPlayerRoutingBucket, SetEntityRoutingBucket, население и настройки lockdown, bucket 0, использование случаи и что происходит с голосом.
Симптом: две группы игроков разделяют одинаковую локацию и вы хотите их разделить, или игроки в minigame видят мир полный машин и пешеходов других людей.
Routing buckets это версия FiveM размеры или instances. Сущности и игроки в разных buckets не видят друг друга. Они инструмент позади апартаментов, minigames и экраны выбора персонажа, и они управляются на сервере. Эта статья охватывает каждый native и ошибки чтобы избежать.
Что это routing bucket
Bucket это число. Каждый игрок и каждая сущность принадлежит точно одному bucket, и умолчание это 0. Две вещи в разных buckets невидимы друг другу: игроки не видят игроков другого bucket, машины или пропсы, и они не взаимодействуют. Они всё ещё разделяют одинаковую карту, поэтому координаты остаются такими же.
Это работает только на сервере с OneSync, который современные серверы используют. Смотрите включение OneSync если вы не уверены.
Основные natives
Все из них запускаются на сервере:
-- 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 берёт id сервера игрока и номер bucket. SetEntityRoutingBucket берёт обработчик сущности. Сущности которые вы создаёте на сервере после того как игрок переместился начинают в bucket 0 если вы их не перемещаете, поэтому установите bucket сразу после создания их:
local veh = CreateVehicle(`sultan`, 0.0, 0.0, 70.0, 0.0, true, true)
SetEntityRoutingBucket(veh, 50)Выберите номера bucket на цель. Обычная привычка это зарезервировать диапазоны, например один диапазон для домов, один для minigames, так что две функции никогда не переиспользуют число по ошибке.
Внимание: эти natives это только на сервере. Вызов их из клиента скрипта не делает ничего полезного. Отправьте событие на сервер и позвольте серверу переместить игрока, после того как это проверило запрос.
Население и lockdown
Каждый bucket может иметь его собственные правила:
-- no ambient pedestrians or traffic in bucket 50
SetRoutingBucketPopulationEnabled(50, false)
-- who may create entities in bucket 50
SetRoutingBucketEntityLockdownMode(50, 'strict')SetRoutingBucketPopulationEnabled(bucket, false)выключает ambient NPCs и трафик в том bucket. Это полезно для instances, потому что пустой интерьер или minigame не нуждается в машинах движущихся через него. Bucket0держит его нормальное население.SetRoutingBucketEntityLockdownMode(bucket, mode)управляет созданием сущности. Режимы это'strict','relaxed'и'inactive', и'inactive'это нормальное поведение, с'strict'являющейся самой тугой. Проверьте документацию native для точной разницы перед тем как вы положитесь на одну.
Установка правил нового bucket один раз, когда это первый раз используется, это достаточно. Они остаются на всю жизнь сервера.
Использование случаи
- Апартаменты и дома: один bucket на свойство, поэтому идентичные интерьеры не перекрываются. Полный паттерн находится в жилая система и instances.
- Minigames и события: поместите участников в приватный bucket с отключённым населением, так что ничто вне не вмешивается.
- Выбор и создание персонажа: поместите игрока в приватный bucket пока они выбирают персонажа, так что они не видны стоящими в мире, и переместите их в
0когда они спаунятся. - Обучение и админ пространства: тихий bucket чтобы объяснить вещи без остальной части сервера.
- Тестирование: попробуйте скрипт далеко от игроков.
Голос в buckets
Потому что игроки в разных buckets не близко друг друга из точки зрения игры, proximity голос обычно следует одинаковому разделению. Голос ресурсы такие как pma-voice построены вокруг OneSync и работают на bucket, поэтому игроки в доме не слышат улицу. Если вы хотите людей в разных buckets говорить, используйте свои собственные особенности канала или вызова голос ресурса вместо боевой buckets. Если голос молчалив после того как вы переместили игроков, смотрите pma-voice не работает. Тестируйте это с двумя реальными игроками, не только с одним.
Переиспользуемый помощник instance
Держите логику bucket в одном месте, поэтому каждый путь выхода его сбрасывает:
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)Вызовите LeaveInstance при выходе, на смерть, и когда ваш ресурс останавливается:
AddEventHandler('onResourceStop', function(resource)
if resource ~= GetCurrentResourceName() then return end
for src in pairs(instances) do
SetPlayerRoutingBucket(src, 0)
end
end)Без того последнего обработчика, перезагрузка скрипта оставляет игроков одних в пустом bucket.
Распространённые проблемы
- Игрок застрял один: он никогда не был переместён обратно в
0. Сбросьте на каждом пути выхода и на остановке ресурса. - Машина отсутствует для пассажира: игрок и машина оканчиваются в разных buckets. Переместите оба.
- Спаунтые сущности появляются в неправильном мире: новые сущности на сервере начинают в bucket
0. - Разные функции переиспользуют одинаковый номер и игроки приземляются в instances друг друга: зарезервируйте диапазоны.
- Вызов natives на клиенте: они принадлежат на сервере.
Контрольный список
| Симптом | Решение |
|---|---|
| Игроки видят неправильный мир | Проверьте GetPlayerRoutingBucket для обоих игроков |
| Игрок один после перезагрузки | Сбросьте buckets на onResourceStop |
| Машина не видна друзьям водителя | Установите bucket машины также |
| Трафик внутри instance | SetRoutingBucketPopulationEnabled(bucket, false) |
| Не могу слышать кого-либо | Одинаковый bucket, затем проверьте голос ресурс |
| Ничего не происходит на клиенте | Natives это на сервере |
Короткие ответы
Что это routing bucket по умолчанию?
Bucket 0. Каждый игрок и сущность там начинается если скрипт его не перемещает.
Может ли клиент изменить свой собственный routing bucket?
Нет. Natives это на сервере. Клиент просит, и сервер решает и перемещает игрока.
Движутся ли машины с игроком когда я меняю bucket?
Не полагайтесь на это. Переместите машину явно с SetEntityRoutingBucket, и проверьте результат в ваших собственных тестах.

