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:
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:
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:
add_ace group.admin command.heal allow
add_principal identifier.license:your_license_here group.adminGracze 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
falsemoż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:
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ę:
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:
- Powiedz graczom, aby zmapowali ponownie w Ustawieniach > Zmapowanie klawiszy > FiveM. Umieść to w notatkach aktualizacji.
- Użyj nowej nazwy polecenia dla akcji, na przykład
garage_v2zamiastgarage. To nowe mapowanie, więc nowy domyślny się zastosuje. Gracze będą widzieć oba wpisy, dopóki stary nie będzie usunięty. - 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ę:
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.

