RegisterCommand e RegisterKeyMapping: tasti rilegabili in FiveM
Crea comandi FiveM e lascia che i giocatori li rileghin: RegisterCommand con ACE, RegisterKeyMapping, azioni tenute con comandi +/-, e perché una nuova chiave predefinita è ignorata.
Vuoi un comando come /garage che chiunque può digitare, una chiave come E che fa lo stesso, e un modo per ogni giocatore di cambiare quella chiave. FiveM ti dà RegisterCommand per il comando e RegisterKeyMapping per la chiave. Questo articolo mostra entrambi, come limitare un comando agli admin, come fare un'azione che funziona mentre una chiave è tenuta, e perché cambiare una chiave predefinita dopo non fa nulla per i giocatori esistenti.
Un comando semplice
Un comando è un nome e una funzione:
RegisterCommand('garage', function(source, args, rawCommand)
print('garage opened')
end, false)Sul client, source non è utile. La tabella args contiene le parole digitate dopo il comando, e rawCommand è il testo completo. Sul server, source è l'id del giocatore, o 0 quando il comando viene dalla console del server.
Lo stesso sul server, con un argomento:
RegisterCommand('heal', function(source, args)
local target = tonumber(args[1]) or source
TriggerClientEvent('my_script:heal', target)
end, true)Limita un comando con ACE
L'ultimo argomento di RegisterCommand è restricted. Con true, nessuno può eseguire il comando a meno che non abbiano il permesso ACE command.<name>. Dallo ai tuoi admin in server.cfg:
add_ace group.admin command.heal allow
add_principal identifier.license:your_license_here group.adminI giocatori senza di esso ricevono un errore di permesso e il comando non gira mai. Come i gruppi ACE e i principal funzionano è coperto in permessi ACE per admin FiveM.
Attenzione: un comando
falsepuò essere digitato da chiunque, inclusi i cheater che lo chiamano a mano. Non fare mai affidamento su un comando lato client per proteggere qualcosa di valore. Fai il vero controllo di permesso sul server.
Lega il comando a una chiave
RegisterKeyMapping lega un comando a una chiave, sul client. Il comando deve esistere, quindi registra entrambi:
RegisterCommand('garage', function()
print('garage opened')
end, false)
RegisterKeyMapping('garage', 'Open the garage', 'keyboard', 'F5')I quattro argomenti sono il nome del comando, la descrizione mostrata al giocatore, il dispositivo di input ('keyboard' qui) e la chiave predefinita. Il nome della chiave è scritto come E, F5 o LSHIFT.
I giocatori possono ora premere F5, o digitare /garage, e entrambi fanno la stessa cosa.
Dove i giocatori lo rilegano
La chiave predefinita è solo un suggerimento. I giocatori aprono le Impostazioni > Key Bindings > FiveM del gioco e trovano la tua azione lì, elencata dal testo di descrizione. Possono cambiare la chiave a quello che vogliono.
Scrivi una descrizione chiara ('Open the garage', non 'garage'), poiché è tutto quello che il giocatore vede. Mantienila breve e unica, così due script non mostrano la stessa etichetta.
Azioni tenute con comandi + e -
Per qualcosa che dura mentre una chiave è tenuta, come un push-to-talk o una corda, registra una coppia di comandi: uno che inizia con + e uno con -. Il gioco esegue +name quando la chiave scende e -name quando sale:
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)Mappa il nome +. Entrambi i comandi + e - devono essere registrati, o il rilascio non è mai visto.
Perché una nuova chiave predefinita non fa nulla
Questo prende un sacco di sviluppatori. Rilasci la versione 1 con 'F5', poi cambi a 'F6' nella versione 2. I giocatori che hanno già eseguito la versione 1 premono ancora F5.
La ragione: la chiave predefinita da RegisterKeyMapping è applicata solo la prima volta che il gioco vede quella mappatura. Dopo il binding vive nelle impostazioni proprie del giocatore, e la nuova chiave predefinita non è usata. Così:
- I nuovi giocatori ottengono la nuova chiave.
- I giocatori esistenti mantengono quella vecchia, o qualsiasi cosa abbiano scelto loro stessi.
Non c'è un modo pulito per forzare una chiave sui giocatori che hanno già il binding. Le tue opzioni:
- Dì ai giocatori di rilegare in Impostazioni > Key Bindings > FiveM. Mettilo nelle tue note di aggiornamento.
- Usa un nuovo nome di comando per l'azione, per esempio
garage_v2invece digarage. È una nuova mappatura, quindi la nuova chiave predefinita si applica. I giocatori vedranno entrambi i voci finché quello vecchio non è rimosso. - Non fare affidamento sulla chiave predefinita. Mostra la chiave effettiva nella tua UI invece di una lettera fissa, o dì ai giocatori come rilegare.
Questo è anche il motivo per cui dovresti testare i cambiamenti di chiave su un profilo fresco, o dopo aver rimosso il binding nelle impostazioni. Altrimenti continui a testare la tua vecchia chiave.
Mantieni la logica del comando piccola
Un handler di comando dovrebbe fare una cosa: chiamare una funzione. Poi la chiave, il comando e un'interazione di target (vedi ox_target: come aggiungere target) tutti chiamano la stessa funzione:
local function openGarage()
print('garage opened')
end
RegisterCommand('garage', openGarage, false)
RegisterKeyMapping('garage', 'Open the garage', 'keyboard', 'F5')Evita le chiavi che altre cose già usano. Controllare IsControlJustPressed in un loop per la stessa chiave di un comando mappato fa sparare entrambi. Usa solo la mappatura.
Checklist
| Sintomo | Soluzione |
|---|---|
| Il comando funziona per tutti | Passa true come terzo argomento e concedi command.<name> con add_ace |
| La chiave non fa nulla | Registra il comando per primo, poi RegisterKeyMapping con lo stesso nome |
| L'azione tenuta non viene mai rilasciata | Registra sia +name che -name, e mappa il nome + |
| La chiave predefinita modificata è ignorata | Le chiavi predefinite si applicano una volta: i giocatori rilegano, o usa un nuovo nome di comando |
| I giocatori non possono trovare il binding | Impostazioni > Key Bindings > FiveM; usa una descrizione chiara |
| Il comando server si rompe sulla console | source è 0 lì; gestisci quel caso |
Risposte rapide
Dove i giocatori cambiano una chiave impostata con RegisterKeyMapping?
Nelle impostazioni del gioco, sotto Key Bindings, nella sezione FiveM. Il tuo testo di descrizione è l'etichetta che vedono lì.
Ho cambiato la chiave predefinita nel mio script ma i giocatori hanno ancora quella vecchia. Perché?
La chiave predefinita è applicata solo la prima volta che la mappatura è registrata. Dopo, il binding memorizzato del giocatore vince. Chiedi ai giocatori di rilegare, o registra l'azione sotto un nuovo nome di comando.
Come posso limitare un comando agli admin?
Passa true come terzo argomento di RegisterCommand, poi dai al tuo gruppo admin l'ACE command.yourcommand in server.cfg con add_ace.

