RegisterCommand und RegisterKeyMapping: rebindbare Tasten in FiveM

Erstelle FiveM-Befehle und lasse Spieler sie rebinden: RegisterCommand mit ACE, RegisterKeyMapping, halten Aktionen mit +/- Befehlen, und warum eine neue Standard-Taste ignoriert wird.

Du möchtest einen Befehl wie /garage, den jeder eingeben kann, eine Taste wie E, die das gleiche tut, und eine Möglichkeit für jeden Spieler, diese Taste zu ändern. FiveM gibt dir RegisterCommand für den Befehl und RegisterKeyMapping für die Taste. Dieser Artikel zeigt beide, wie man einen Befehl auf Admins beschränkt, wie man eine Aktion macht, die funktioniert, während eine Taste gehalten wird, und warum eine später geänderte Standard-Taste für bestehende Spieler nichts macht.

Ein einfacher Befehl

Ein Befehl ist ein Name und eine Funktion:

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

Auf dem Client ist source nicht nützlich. Die args Tabelle hält die nach dem Befehl eingegebenen Wörter, und rawCommand ist der vollständige Text. Auf dem Server ist source die Spieler-ID, oder 0, wenn der Befehl von der Server-Konsole kommt.

Das gleiche auf dem Server, mit einem Argument:

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

Beschränke einen Befehl mit ACE

Das letzte Argument von RegisterCommand ist restricted. Mit true kann niemand den Befehl ausführen, es sei denn, er hält die ACE-Berechtigung command.<name>. Gib es deinen Admins in server.cfg:

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

Spieler ohne ihn bekommen einen Berechtigungsfehler und der Befehl läuft nie. Wie ACE-Gruppen und Principals funktionieren, wird in ACE-Berechtigungen für FiveM-Admins behandelt.

Achtung: Ein false Befehl kann von jedem eingegeben werden, einschließlich Betrüger, die ihn von Hand aufrufen. Verlasse dich niemals auf einen clientseitigen Befehl, um etwas Wertvolles zu schützen. Mache die echte Berechtigungsprüfung auf dem Server.

Binde den Befehl an eine Taste

RegisterKeyMapping verbindet einen Befehl mit einer Taste, auf dem Client. Der Befehl muss existieren, also registriere beide:

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

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

Die vier Argumente sind der Befehlsname, die dem Spieler gezeigte Beschreibung, das Eingabegerät ('keyboard' hier) und die Standard-Taste. Der Tastenname wird wie E, F5 oder LSHIFT geschrieben.

Spieler können jetzt F5 drücken, oder /garage eingeben, und beide tun das gleiche.

Wo Spieler es rebinden

Die Standard-Taste ist nur ein Vorschlag. Spieler öffnen die Spieleinstellungen Einstellungen > Tastenbelegung > FiveM und finden deine Aktion dort, aufgelistet nach dem Beschreibungstext. Sie können die Taste auf alles ändern, was sie wollen.

Schreibe eine klare Beschreibung ('Open the garage', nicht 'garage'), da das alles ist, was der Spieler sieht. Halte es kurz und einzigartig, damit zwei Scripts nicht das gleiche Label zeigen.

Halten Aktionen mit + und - Befehlen

Für etwas, das währenddessen eine Taste gehalten wird, wie Push-to-Talk oder ein Seil, registriere ein Paar von Befehlen: einer, der mit + beginnt, und einer mit -. Das Spiel läuft +name, wenn die Taste heruntergeht, und -name, wenn sie hochkommt:

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)

Ordne den + Namen zu. Beide der + und der - Befehl müssen registriert sein, oder das Loslassen wird nie gesehen.

Warum eine neue Standard-Taste nichts macht

Das fängt viele Entwickler. Du veröffentlichst Version 1 mit 'F5', dann wechselst du zu 'F6' in Version 2. Spieler, die bereits Version 1 liefen, drücken immer noch F5.

Der Grund: Die Standard-Taste von RegisterKeyMapping wird nur beim ersten Mal angewendet, wenn das Spiel diese Zuordnung sieht. Danach lebt die Bindung in den eigenen Einstellungen des Spielers, und die neue Standard wird nicht verwendet. Also:

  • Neue Spieler bekommen die neue Taste.
  • Bestehende Spieler behalten die alte, oder was sie selbst gewählt haben.

Es gibt keine saubere Möglichkeit, eine Taste auf Spieler zu erzwingen, die bereits die Bindung haben. Deine Optionen:

  1. Sag Spielern, die Taste in Einstellungen > Tastenbelegung > FiveM neu zu binden. Lege es in deine Update-Notizen.
  2. Verwende einen neuen Befehlsnamen für die Aktion, zum Beispiel garage_v2 anstelle von garage. Es ist eine neue Zuordnung, also wird die neue Standard angewendet. Spieler werden beide Einträge sehen, bis die alte entfernt wird.
  3. Verlasse dich nicht auf die Standard. Zeige die tatsächliche Taste in deinem UI anstelle eines festen Buchstabens, oder sage Spielern, wie sie neu binden.

Dies ist auch der Grund, warum du Tastenänderungen auf einem frischen Profil testen solltest, oder nachdem du die Bindung in den Einstellungen entfernt hast. Sonst testest du immer deine alte Taste.

Halte die Befehlslogik klein

Ein Befehl-Handler sollte eine Sache tun: eine Funktion aufrufen. Dann rufen die Taste, der Befehl und eine Zielinteraktion (siehe ox_target: wie man Ziele hinzufügt) alle die gleiche Funktion auf:

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

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

Vermeide Tasten, die andere Dinge bereits verwenden. Das Überprüfen von IsControlJustPressed in einer Schleife für die gleiche Taste wie einem zugeordneten Befehl lässt beide feuern. Verwende die Zuordnung allein.

Checkliste

Symptom Behebung
Befehl funktioniert für alle Übergebe true als drittes Argument und gewähre command.<name> mit add_ace
Taste tut nichts Registriere den Befehl zuerst, dann RegisterKeyMapping mit dem gleichen Namen
Halten Aktion wird nie freigegeben Registriere sowohl +name als auch -name, und ordne den + Namen zu
Geänderte Standard-Taste ignoriert Standards gelten einmal: Spieler rebinden, oder verwende einen neuen Befehlsnamen
Spieler können die Bindung nicht finden Einstellungen > Tastenbelegung > FiveM; verwende eine klare Beschreibung
Server-Befehl bricht auf der Konsole source ist dort 0; handhabe diesen Fall

Kurze Antworten

Wo ändern Spieler eine mit RegisterKeyMapping eingestellte Taste?

In den Einstellungen des Spiels, unter Tastenbelegung, im FiveM-Bereich. Der Beschreibungstext ist das Label, das sie dort sehen.

Ich habe die Standard-Taste in meinem Script geändert, aber Spieler haben immer noch die alte. Warum?

Die Standard wird nur beim ersten Mal angewendet, wenn die Zuordnung registriert wird. Danach gewinnt die vom Spieler gespeicherte Bindung des Spielers. Bitte Spieler, die Taste neu zu binden, oder registriere die Aktion unter einem neuen Befehlsnamen.

Wie beschränke ich einen Befehl auf Admins?

Übergebe true als drittes Argument von RegisterCommand, gebe dann deiner Admin-Gruppe die ACE command.yourcommand in server.cfg mit add_ace.

Scripts ohne dieses Problem

Item Creator V2Erstelle nutzbare Items mit Animationen, Props, Effekten und mehr — ganz ohne Code.Script ansehen →Shop CreatorBau einen Shop in unter einer Minute — Besitzer, Angestellte, Tresore und Überfälle inklusive.Script ansehen →

Weiterlesen