2020-04-27 16:11:54 +03:00
---
title: Chat Command Builder
layout: default
root: ../..
idx: 4.3
2020-07-11 11:30:46 +03:00
description: Creazione di comandi complessi semplificandosi la vita
redirect_from: /it/chapters/chat_complex.html
2020-04-27 16:11:54 +03:00
---
2020-07-11 11:30:46 +03:00
## Introduzione <!-- omit in toc -->
2020-04-27 16:11:54 +03:00
2020-08-20 01:49:39 +03:00
Questo capitolo ti mostrerà come creare comandi complessi con ChatCmdBuilder, come `/msg <nome> <messaggio>` , `/team entra <nometeam>` o `/team esci <nometeam>` .
2020-04-27 16:11:54 +03:00
2020-07-11 11:30:46 +03:00
Tieni conto che ChatCmdBuilder è una libreria creata dall'autore di questo libro, e che molti modder tendono a usare il metodo illustrato nel capitolo [Chat e comandi ](chat.html#complex-subcommands ).
2020-04-27 16:11:54 +03:00
2020-07-11 11:30:46 +03:00
- [Perché ChatCmdBuilder? ](#perche-chatcmdbuilder )
- [Tratte ](#tratte )
- [Funzioni nei sottocomandi ](#funzioni-nei-sottocomandi )
- [Installare ChatCmdBuilder ](#installare-chatcmdbuilder )
- [Esempio: comando complesso /admin ](#esempio-comando-complesso-admin )
2020-04-27 16:11:54 +03:00
2020-07-11 11:30:46 +03:00
## Perché ChatCmdBuilder?
2020-04-27 16:11:54 +03:00
2020-07-11 11:30:46 +03:00
Le mod tradizionali implementano questi comandi complessi usando i pattern Lua.
2020-04-27 16:11:54 +03:00
```lua
2020-07-11 11:30:46 +03:00
local nome = string.match(param, "^join ([%a%d_-]+)")
2020-04-27 16:11:54 +03:00
```
2020-07-11 11:30:46 +03:00
Io, tuttavia, trovo i pattern Lua illeggibili e scomodi.
Per via di ciò, ho creato una libreria che ti semplifichi la vita.
2020-04-27 16:11:54 +03:00
```lua
ChatCmdBuilder.new("sethp", function(cmd)
cmd:sub(":target :hp:int", function(name, target, hp)
2020-07-11 11:30:46 +03:00
local giocatore = minetest.get_player_by_name(target)
if giocatore then
giocatore:set_hp(hp)
return true, "Gli hp di " .. target .. " sono ora " .. hp
2020-04-27 16:11:54 +03:00
else
2020-07-11 11:30:46 +03:00
return false, "Giocatore " .. target .. " non trovato"
2020-04-27 16:11:54 +03:00
end
end)
end, {
2020-07-11 11:30:46 +03:00
description = "Imposta gli hp del giocatore",
2020-04-27 16:11:54 +03:00
privs = {
kick = true
2020-07-11 11:30:46 +03:00
-- ^ è probabilmente meglio impostare un nuovo privilegio
2020-04-27 16:11:54 +03:00
}
})
```
2020-07-11 11:30:46 +03:00
`ChatCmdBuilder.new(name, setup_func, def)` crea un nuovo comando chiamato `name` .
Poi, chiama la funzione passatagli (`setup_func`), che crea a sua volta i sottocomandi.
Ogni `cmd:sub(route, func)` è un sottocomando.
2020-04-27 16:11:54 +03:00
2020-07-11 11:30:46 +03:00
Un sottocomando è una particolare risposta a un parametro di input.
Quando un giocatore esegue il comando, il primo sottocomando che combacia con l'input verrà eseguito.
Se non ne viene trovato nessuno, il giocatore verrà avvisato della sintassi non valida.
Nel codice qui in alto, per esempio, se qualcuno scrive qualcosa come `/sethp nickname 12` , la funzione corrispondente verrà chiamata.
Tuttavia, qualcosa come `/sethp 12 bleh` genererà un messaggio d'errore.
2020-04-27 16:11:54 +03:00
2020-07-11 11:30:46 +03:00
`:name :hp:int` è una tratta.
Descrive il formato del parametro passato a /teleport.
2020-04-27 16:11:54 +03:00
2020-07-11 11:30:46 +03:00
## Tratte
2020-04-27 16:11:54 +03:00
2020-07-11 11:30:46 +03:00
Una tratta è composta di fermate e variabili, dove le prime sono obbligatorie.
Una fermata è per esempio `crea` in `/team crea :nometeam :giocatorimassimi:int` , ma anche gli spazi contano come tali.
2020-04-27 16:11:54 +03:00
2020-07-11 11:30:46 +03:00
Le variabili possono cambiare valore a seconda di cosa scrive l'utente. Per esempio `:nometeam` e `:giocatorimassimi:int` .
2020-04-27 16:11:54 +03:00
2020-07-11 11:30:46 +03:00
Le variabili sono definite con `:nome:tipo` : il nome è usato nella documentazione, mentre il tipo è usato per far combaciare l'input.
Se il tipo non è specificato, allora sarà di base `word` .
2020-04-27 16:11:54 +03:00
2020-07-11 11:30:46 +03:00
I tipi consentiti sono:
2020-04-27 16:11:54 +03:00
2020-07-11 11:30:46 +03:00
* `word` - Predefinito. Qualsiasi stringa senza spazi;
* `int` - Qualsiasi numero intero;
* `number` - Qualsiasi numero, decimali inclusi;
* `pos` - Coordinate. Il formato può essere 1,2,3, o 1.1,2,3.4567, o (1,2,3), o ancora 1.2, 2 ,3.2;
* `text` - Qualsiasi stringa, spazi inclusi. Può esserci solo un `text` e non può essere seguito da nient'altro.
2020-04-27 16:11:54 +03:00
2020-07-11 11:30:46 +03:00
In `:nome :hp:int` , ci sono due variabili:
2020-04-27 16:11:54 +03:00
2020-07-11 11:30:46 +03:00
* `name` - di tipo `word` in quanto non è stato specificato
* `hp` - di tipo `int` , quindi un numero intero
2020-04-27 16:11:54 +03:00
2020-07-11 11:30:46 +03:00
## Funzioni nei sottocomandi
2020-04-27 16:11:54 +03:00
2020-07-11 11:30:46 +03:00
Il primo parametro è il nome di chi invia il comando. Le variabili sono poi passate alla funzione nell'ordine in cui sono state dichiarate.
2020-04-27 16:11:54 +03:00
```lua
cmd:sub(":target :hp:int", function(name, target, hp)
2020-07-11 11:30:46 +03:00
-- funzione del sottocomando
2020-04-27 16:11:54 +03:00
end)
```
2020-07-11 11:30:46 +03:00
## Installare ChatCmdBuilder
2020-04-27 16:11:54 +03:00
2020-07-11 11:30:46 +03:00
Il codice sorgente può essere trovato e scaricato su
2020-04-27 16:11:54 +03:00
[Github ](https://github.com/rubenwardy/ChatCmdBuilder/ ).
2020-07-11 11:30:46 +03:00
Ci sono due modi per installarlo:
2020-04-27 16:11:54 +03:00
2020-07-11 11:30:46 +03:00
1. Installarlo come una mod a sé stante;
2. Includere nella tua mod l'init.lua di ChatCmdBuilder rinominandolo chatcmdbuilder.lua, e integrarlo tramite `dofile` .
2020-04-27 16:11:54 +03:00
2020-07-11 11:30:46 +03:00
## Esempio: comando complesso /admin
2020-04-27 16:11:54 +03:00
2020-07-11 11:30:46 +03:00
Segue un esempio che crea un comando che aggiunge le seguenti funzioni per chi ha il permesso `kick` e `ban` (quindi, in teoria, un admin):
2020-04-27 16:11:54 +03:00
2020-07-11 11:30:46 +03:00
* `/admin uccidi <nome>` - uccide un utente;
* `/admin sposta <nome> a <pos>` - teletrasporta un utente;
* `/admin log <nome>` - mostra il log di un utente;
* `/admin log <nome> <messaggio>` - aggiunge un messaggio al log di un utente.
2020-04-27 16:11:54 +03:00
```lua
local admin_log
2020-07-11 11:30:46 +03:00
local function carica()
2020-04-27 16:11:54 +03:00
admin_log = {}
end
2020-07-11 11:30:46 +03:00
local function salva()
2020-04-27 16:11:54 +03:00
-- todo
end
2020-07-11 11:30:46 +03:00
carica()
2020-04-27 16:11:54 +03:00
ChatCmdBuilder.new("admin", function(cmd)
2020-07-11 11:30:46 +03:00
cmd:sub("uccidi :nome", function(name, target)
local giocatore = minetest.get_player_by_name(target)
if giocatore then
giocatore:set_hp(0)
return true, "Hai ucciso " .. target
2020-04-27 16:11:54 +03:00
else
return false, "Unable to find " .. target
end
end)
2020-07-11 11:30:46 +03:00
cmd:sub("sposta :nome to :pos:pos", function(nome, target, pos)
local giocatore = minetest.get_player_by_name(target)
if giocatore then
giocatore:setpos(pos)
return true, "Giocatore " .. target .. " teletrasportato a " ..
2020-04-27 16:11:54 +03:00
minetest.pos_to_string(pos)
else
2020-07-11 11:30:46 +03:00
return false, "Giocatore " .. target .. " non trovato"
2020-04-27 16:11:54 +03:00
end
end)
2020-07-11 11:30:46 +03:00
cmd:sub("log :nome", function(name, target)
2020-04-27 16:11:54 +03:00
local log = admin_log[target]
if log then
return true, table.concat(log, "\n")
else
2020-07-11 11:30:46 +03:00
return false, "Nessuna voce per " .. target
2020-04-27 16:11:54 +03:00
end
end)
2020-07-11 11:30:46 +03:00
cmd:sub("log :nome :messaggio", function(name, target, messaggio)
2020-04-27 16:11:54 +03:00
local log = admin_log[target] or {}
2020-07-11 11:30:46 +03:00
table.insert(log, messaggio)
2020-04-27 16:11:54 +03:00
admin_log[target] = log
2020-07-11 11:30:46 +03:00
salva()
return true, "Aggiunto"
2020-04-27 16:11:54 +03:00
end)
end, {
2020-07-11 11:30:46 +03:00
description = "Strumenti per gli admin",
2020-04-27 16:11:54 +03:00
privs = {
kick = true,
ban = true
}
})
```