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:

lua
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:

lua
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:

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

I 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 false può 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:

lua
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:

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)

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:

  1. Dì ai giocatori di rilegare in Impostazioni > Key Bindings > FiveM. Mettilo nelle tue note di aggiornamento.
  2. Usa un nuovo nome di comando per l'azione, per esempio garage_v2 invece di garage. È una nuova mappatura, quindi la nuova chiave predefinita si applica. I giocatori vedranno entrambi i voci finché quello vecchio non è rimosso.
  3. 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:

lua
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.

Script senza questo problema

Item Creator V2Crea oggetti utilizzabili con animazioni, props, effetti e altro — senza scrivere codice.Vedi script →Shop CreatorCrea un negozio in meno di un minuto — proprietari, dipendenti, casseforti e rapine inclusi.Vedi script →

Continua a leggere