RegisterCommand i RegisterKeyMapping: zmapowalne klawisze w FiveM

Twórz komendy FiveM i pozwól graczom je zmapować: RegisterCommand z ACE, RegisterKeyMapping, akcje przytrzymywania z poleceniami +/-, i dlaczego nowy domyślny klawisz jest ignorowany.

Chcesz polecenia takie jak /garage, które każdy może wpisać, klawisz jak E, który robi to samo, i sposób dla każdego gracza, aby zmienić ten klawisz. FiveM daje ci RegisterCommand dla polecenia i RegisterKeyMapping dla klawisza. Ten artykuł pokazuje oba, jak ograniczyć polecenie do adminów, jak stworzyć akcję, która działa, podczas gdy klawisz jest przytrzymywany, i dlaczego zmiana domyślnego klawisza później nic nie robi dla istniejących graczy.

Proste polecenie

Polecenie to nazwa i funkcja:

lua
RegisterCommand('garage', function(source, args, rawCommand)
    print('garage opened')
end, false)

Na kliencie, source nie jest przydatne. Tabela args zawiera słowa wpisane po poleceniu, a rawCommand to pełny tekst. Na serwerze, source to id gracza, lub 0, gdy polecenie pochodzi z konsoli serwera.

To samo na serwerze, z argumentem:

lua
RegisterCommand('heal', function(source, args)
    local target = tonumber(args[1]) or source
    TriggerClientEvent('my_script:heal', target)
end, true)

Ogranicz polecenie za pomocą ACE

Ostatni argument RegisterCommand to restricted. Z true, nikt nie może uruchomić polecenia, chyba że mają uprawnienie ACE command.<name>. Daj je swoim adminom w server.cfg:

cfg
add_ace group.admin command.heal allow
add_principal identifier.license:your_license_here group.admin

Gracze bez niego otrzymują błąd uprawnień i polecenie nigdy się nie uruchami. Jak działają grupy ACE i principals jest pokryte w uprawnienia ACE dla adminów FiveM.

Ostrzeżenie: polecenie false może być wpisane przez każdego, łącznie z oszustami, którzy wezwą go ręcznie. Nigdy nie polegaj na poleceniu po stronie klienta, aby chronić coś cennego. Zrób rzeczywiste sprawdzenie uprawnień na serwerze.

Powiąż polecenie z klawiszem

RegisterKeyMapping wiąże polecenie z klawiszem, na kliencie. Polecenie musi istnieć, więc zarejestruj oba:

lua
RegisterCommand('garage', function()
    print('garage opened')
end, false)

RegisterKeyMapping('garage', 'Open the garage', 'keyboard', 'F5')

Cztery argumenty to nazwa polecenia, opis pokazany graczowi, urządzenie wejściowe (tutaj 'keyboard') i domyślny klawisz. Nazwa klawisza jest napisana jak E, F5 lub LSHIFT.

Gracze mogą teraz nacisnąć F5 lub wpisać /garage, a oba robią to samo.

Gdzie gracze go zmapować

Domyślny klawisz to tylko sugestia. Gracze otwierają Ustawienia > Zmapowanie klawiszy > FiveM i znajdują twoją akcję tam, wymienioną przez tekst opisu. Mogą zmienić klawisz na cokolwiek chcą.

Napisz jasny opis ('Open the garage', nie 'garage'), ponieważ to wszystko co gracz widzi. Utrzymuj krótko i unikalnie, aby dwa skrypty nie pokazywały tej samej etykiety.

Akcje przytrzymywania z poleceniami + i -

W przypadku czegoś, co trwa, podczas gdy klawisz jest przytrzymywany, takie jak push-to-talk lub lina, zarejestruj parę poleceń: jeden zaczynający się od + i jeden od -. Gra uruchamia +name gdy klawisz idzie w dół i -name gdy przychodzi w górę:

lua
local holding = false

RegisterCommand('+my_hold', function()
    holding = true
end, false)

RegisterCommand('-my_hold', function()
    holding = false
end, false)

RegisterKeyMapping('+my_hold', 'Hold to aim the tool', 'keyboard', 'G')

CreateThread(function()
    while true do
        if holding then
            -- do the held action here
            Wait(0)
        else
            Wait(250)
        end
    end
end)

Zmapuj nazwę +. Zarówno polecenie + jak i - muszą być zarejestrowane, inaczej zwolnienie nigdy nie jest widoczne.

Dlaczego nowy domyślny klawisz nic nie robi

To łapie wielu developerów. Wydajesz wersję 1 z 'F5', potem przełączasz na 'F6' w wersji 2. Gracze, którzy już uruchomili wersję 1, wciąż naciskają F5.

Powód: domyślny klawisz z RegisterKeyMapping jest stosowany tylko po raz pierwszy, gdy gra widzi to mapowanie. Później wiązanie żyje we własnych ustawieniach gracza, a nowy domyślnie nie jest używany. Tak:

  • Nowi gracze otrzymują nowy klawisz.
  • Istniejący gracze trzymają stary, lub cokolwiek sami wybrali.

Nie ma czystego sposobu na wymuszenie klawisza na graczach, którzy już mają wiązanie. Twoje opcje:

  1. Powiedz graczom, aby zmapowali ponownie w Ustawieniach > Zmapowanie klawiszy > FiveM. Umieść to w notatkach aktualizacji.
  2. Użyj nowej nazwy polecenia dla akcji, na przykład garage_v2 zamiast garage. To nowe mapowanie, więc nowy domyślny się zastosuje. Gracze będą widzieć oba wpisy, dopóki stary nie będzie usunięty.
  3. Nie polegaj na domyślnym. Pokaż rzeczywisty klawisz w swoim UI zamiast ustalonego listu, lub powiedz graczom jak zmapować.

To również dlatego powinieneś testować zmiany klawiszy na świeżym profilu, lub po usunięciu wiązania w ustawieniach. Inaczej ciągle testujesz swój stary klawisz.

Utrzymuj logikę polecenia małą

Handler polecenia powinien robić jedną rzecz: wezwać funkcję. Potem klawisz, polecenie i interakcja docelowa (zobacz ox_target: jak dodać cele) wszystkie wezwą tę samą funkcję:

lua
local function openGarage()
    print('garage opened')
end

RegisterCommand('garage', openGarage, false)
RegisterKeyMapping('garage', 'Open the garage', 'keyboard', 'F5')

Unikaj klawiszy, które inne rzeczy już używają. Sprawdzanie IsControlJustPressed w pętli dla tego samego klawisza co polecenie zmapowane powoduje wypalenie obu. Użyj samego mapowania.

Lista kontrolna

Symptom Naprawa
Polecenie działa dla każdego Przekaż true jako trzeci argument i przyznaj command.<name> za pomocą add_ace
Klawisz nic nie robi Zarejestruj polecenie najpierw, potem RegisterKeyMapping z tą samą nazwą
Akcja przytrzymywania nigdy się nie zwalnia Zarejestruj zarówno +name jak i -name i zmapuj nazwę +
Zmieniony domyślny klawisz ignorowany Domyślne są stosowane raz: gracze zmapują, lub użyj nowej nazwy polecenia
Gracze nie mogą znaleźć wiązania Ustawienia > Zmapowanie klawiszy > FiveM; użyj jasnego opisu
Polecenie serwera psuje się na konsoli source to 0 tam; obsługuj ten przypadek

Szybkie odpowiedzi

Gdzie gracze zmieniają klawisz ustawiony za pomocą RegisterKeyMapping?

W Ustawieniach gry, pod Zmapowaniem klawiszy, w sekcji FiveM. Tekst opisu to etykieta, którą widzą tam.

Zmieniłem domyślny klawisz w moim skrypcie, ale gracze wciąż mają stary. Dlaczego?

Domyślnie jest stosowana tylko po raz pierwszy, gdy mapowanie jest rejestrowane. Później bierze górę własne wiązanie gracza. Albo poproś graczy, aby zmapowali ponownie, albo zarejestruj akcję pod nową nazwą polecenia.

Jak ograniczyć polecenie tylko do adminów?

Przekaż true jako trzeci argument RegisterCommand, a następnie daj swojej grupie admina ACE command.yourcommand w server.cfg za pomocą add_ace.

Skrypty bez tego problemu

Item Creator V2Twórz używalne przedmioty z animacjami, propami, efektami i nie tylko — bez pisania kodu.Zobacz skrypt →Shop CreatorZbuduj sklep w niecałą minutę — właściciele, pracownicy, sejfy i napady w zestawie.Zobacz skrypt →

Czytaj dalej