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

Все из них запускаются на сервере:

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 берёт id сервера игрока и номер bucket. SetEntityRoutingBucket берёт обработчик сущности. Сущности которые вы создаёте на сервере после того как игрок переместился начинают в bucket 0 если вы их не перемещаете, поэтому установите bucket сразу после создания их:

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

Выберите номера bucket на цель. Обычная привычка это зарезервировать диапазоны, например один диапазон для домов, один для minigames, так что две функции никогда не переиспользуют число по ошибке.

Внимание: эти natives это только на сервере. Вызов их из клиента скрипта не делает ничего полезного. Отправьте событие на сервер и позвольте серверу переместить игрока, после того как это проверило запрос.

Население и lockdown

Каждый bucket может иметь его собственные правила:

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) выключает ambient NPCs и трафик в том bucket. Это полезно для instances, потому что пустой интерьер или minigame не нуждается в машинах движущихся через него. Bucket 0 держит его нормальное население.
  • 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 в одном месте, поэтому каждый путь выхода его сбрасывает:

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)

Вызовите LeaveInstance при выходе, на смерть, и когда ваш ресурс останавливается:

lua
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, и проверьте результат в ваших собственных тестах.

Скрипты без этой проблемы

Arcade MachinesСемь аркадных игр в настоящих автоматах, с таблицами рекордов и ставками.Смотреть скрипт →CCTV Security CamerasУстанавливаемые камеры, планшет с мультиэкраном в реальном времени и распечатанные фото-улики.Смотреть скрипт →

Читайте также