Routing buckety FiveM: SetPlayerRoutingBucket, instancje i głos

Jak działają routing buckety FiveM: SetPlayerRoutingBucket, SetEntityRoutingBucket, ustawienia populacji i lockdownu, bucket 0, przypadki użycia i co się dzieje z głosem.

Objaw: dwie grupy graczy dzielą tę samą lokalizację i chcesz je oddzielić, lub gracze w minigame widzą świat pełny samochodów i pieszych innych ludzi.

Routing buckety to wersja FiveM wymiarów lub instancji. Jednostki i gracze w różnych bucketach się nawzajem nie widzą. To narzędzie za apartamentami, minigames i ekranami wyboru postaci, i są zarządzane na serwerze. Ten artykuł obejmuje każdy native i błędy, którym można się uniknąć.

Co to jest routing bucket

Bucket to liczba. Każdy gracz i każda jednostka należy do dokładnie jednego bucketa, a domyślnie jest 0. Dwie rzeczy w różnych bucketach są sobie niewidoczne: gracze nie widzą graczy z innego bucketa, pojazdów lub propów, i nie oddziałują. Wciąż dzielą tę samą mapę, więc współrzędne pozostają takie same.

To działa tylko na serwerze z OneSync, który bieżące serwery używają. Zobacz enabling OneSync jeśli nie jesteś pewny.

Główne native'y

Wszystkie z nich działają na serwerze:

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 bierze id serwera gracza i numer bucketa. SetEntityRoutingBucket bierze uchwyt jednostki. Jednostki, które tworzysz na serwerze po tym, jak gracz się przeniósł, zaczynają się w buckecie 0, chyba że je przenieś, więc ustaw bucket zaraz po ich utworzeniu:

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

Wybierz numery bucketów na pięście. Typowy zwyczaj to rezerwowanie zakresów, na przykład jeden zakres dla domów, jeden dla minigames, więc dwie funkcje nigdy nie będą ponownie używać liczby przez przypadek.

Ostrzeżenie: te native'y są tylko dla serwera. Ich wezwanie z skryptu klienta nic przydatnego nie robi. Wyślij zdarzenie do serwera i pozwól serwerowi przenieść gracza, po sprawdzeniu żądania.

Populacja i lockdown

Każdy bucket może mieć swoje własne reguły:

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) wyłącza ambulatoryjnych NPC i ruch w tym buckecie. Jest to przydatne dla instancji, ponieważ puste wnętrze lub minigame nie potrzebuje samochodów jeżdżących przez niego. Bucket 0 utrzymuje swoją normalną populację.
  • SetRoutingBucketEntityLockdownMode(bucket, mode) kontroluje tworzenie jednostki. Tryby to 'strict', 'relaxed' i 'inactive', i 'inactive' to normalne zachowanie, z 'strict' będąc największym. Sprawdzaj dokumentację native'a dla dokładnej różnicy zanim na jednym polegasz.

Ustawienie nowych reguł bucketa raz, gdy jest po raz pierwszy użyty, wystarczy. Pozostają przez całe życie serwera.

Przypadki użycia

  • Apartamenty i domy: jeden bucket na każdą właściwość, tak aby identyczne wnętrza się nie pokrywały. Pełny wzór znajduje się w housing and instances.
  • Minigames i zdarzenia: umieść uczestników w prywatnym buckecie z wyłączoną populacją, aby nic z zewnątrz nie zakłócało.
  • Wybór i tworzenie postaci: umieść gracza w prywatnym buckecie, podczas gdy wybiera postać, aby nie został widziany stojąc w świecie, i przenieś go do 0 gdy się pojawia.
  • Tutoriale i strefy admina: cichy bucket do wyjaśniania rzeczy bez reszty serwera.
  • Testowanie: spróbuj skryptu z dala od graczy.

Głos w bucketach

Ponieważ gracze w różnych bucketach nie są blisko siebie z punktu widzenia gry, głos zbliżeniowy ogólnie następuje takie samo oddzielenie. Zasoby głosu, takie jak pma-voice, są budowane wokół OneSync i działają na bucket, więc gracze w domu nie słyszą ulicy. Jeśli chcesz, aby ludzie w różnych bucketach rozmawiali, użyj własnego kanału zasobu głosu lub funkcji rozmowy zamiast walki z bucketami. Jeśli głos jest cichy po przeniesienia graczy, zobacz pma-voice not working. Testuj go z dwoma rzeczywistymi graczami, a nie tylko z jednym.

Wielokrotnie użyteczny instance helper

Trzymaj logikę bucketa w jednym miejscu, aby każda ścieżka wyjścia go resetowała:

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)

Wywołaj LeaveInstance na wyjściu, na śmierci i gdy Twój zasób się zatrzymuje:

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

Bez tego ostatniego handlera, restart skryptu pozostawia graczy samych w pustym buckecie.

Częste problemy

  • Gracz utknął sam: nigdy nie został przeniesiony z powrotem do 0. Resetuj na każdej ścieżce wyjścia i na resource stop.
  • Pojazd brakuje dla pasażera: gracz i pojazd skończyły się w różnych bucketach. Przenieś oba.
  • Spawane jednostki pojawiają się w nieprawidłowym świecie: nowe jednostki po stronie serwera zaczynają się w buckecie 0.
  • Różne funkcje ponownie używają tego samego numeru i gracze lądują w instancjach każdego inne: rezerwuj zakresy.
  • Wezwanie native'ów na kliencie: należą one do serwera.

Checklist

Objaw Rozwiązanie
Gracze widzą niewłaściwy świat Sprawdzaj GetPlayerRoutingBucket dla obu graczy
Gracz sam po restarcie Resetuj buckety na onResourceStop
Pojazd niewidoczny dla przyjaciół kierowcy Ustaw również bucket pojazdu
Ruch wewnątrz instancji SetRoutingBucketPopulationEnabled(bucket, false)
Nie mogę słyszeć nikogo Ten sam bucket, następnie sprawdzaj zasób głosu
Nic się nie dzieje na kliencie Native'y są po stronie serwera

Szybkie odpowiedzi

Jaki jest domyślny routing bucket?

Bucket 0. Każdy gracz i jednostka tam zaczynają, chyba że skrypt go przeniesie.

Czy klient może zmienić swój własny routing bucket?

Nie. Native'y są po stronie serwera. Klient prosi, a serwer decyduje i przenosi gracza.

Czy pojazdy przechodzą z graczem, gdy zmieniam bucket?

Nie polegaj na tym. Przenieś pojazd wyraźnie za pomocą SetEntityRoutingBucket i sprawdzaj wynik w swoich własnych testach.

Skrypty bez tego problemu

Arcade MachinesSiedem grywalnych gier arcade w prawdziwych automatach, z rankingami i zakładami.Zobacz skrypt →CCTV Security CamerasKamery do rozstawienia, tablet z podglądem wielu kamer na żywo i drukowane zdjęcia jako dowody.Zobacz skrypt →

Czytaj dalej