IT | Several small improvements

This commit is contained in:
Zughy 2020-08-19 22:49:39 +00:00
parent 62e2d0f835
commit 704c3d84cf
9 changed files with 194 additions and 327 deletions

View File

@ -11,7 +11,7 @@ redirect_from:
## Introduzione <!-- omit in toc -->
Capire la struttura base della cartella di una mod è un requisito essenziale per creare mod.
Capire la struttura base della cartella di una mod è un requisito essenziale per creare qualsivoglia contenuto.
- [Cosa sono i giochi e le mod?](#cosa-sono-i-giochi-e-le-mod)
- [Dove vengono salvate le mod?](#dove-vengono-salvate-le-mod)
@ -29,24 +29,18 @@ Capire la struttura base della cartella di una mod è un requisito essenziale pe
## Cosa sono i giochi e le mod?
Il punto forte di Minetest è l'abilità di sviluppare facilmente giochi senza il bisogno
di crearti da zero il motore grafico, gli algoritmi voxel o tutta la parte network.
Il punto forte di Minetest è l'abilità di sviluppare facilmente giochi senza il bisogno di crearsi da zero il motore grafico, gli algoritmi voxel o tutta la parte network.
In Minetest, un gioco è una collezione di moduli che lavorano insieme per fornire il contenuto
e il comportamento di un gioco.
Un modulo, solitamente conosciuto come "mod" (femminile), è una collezione di script e risorse.
È possibile creare un gioco usando semplicemente una mod, ma questo non accade spesso perché
riduce la comodità di poter sostituire o calibrare alcune parti del gioco in maniera indipendente
dalle altre.
In Minetest, un gioco è una collezione di moduli che lavorano insieme per fornire il contenuto e il comportamento di un gioco.
Un modulo, solitamente conosciuto come "mod", è una collezione di script e risorse, e in teoria ne potrebbe bastare uno per creare un intero gioco.
Tuttavia, questo non accade spesso, perché riduce la comodità di poter sostituire o calibrare alcune parti di quest'ultimo in maniera indipendente dalle altre.
È anche possibile distribuire le mod al di fuori di un gioco, nel qual caso sono sempre mod
nel senso più tradizionale del termine: modifiche. Queste mod calibrano o espandono le proprietà
di un gioco.
È poi anche possibile distribuire le mod come a sé stanti, nel qual caso sono sempre mod nel senso più tradizionale del termine: modifiche.
Esse calibrano o espandono le proprietà di un gioco.
Sia le mod presenti in un gioco che quelle a sé stanti usano la stessa API.
Indipendentemente da come le si voglia usare (specifiche per un gioco o come estensioni generiche) usano la stessa API.
Questo libro coprirà le parti principali della API di Minetest,
ed è applicabile sia per gli sviluppatori che per i creatori di mod.
Questo libro coprirà le parti principali della API di Minetest, ed è pensato sia per gli sviluppatori del motore di gioco (Minetest, in C++) che per i creatori di mod.
## Dove vengono salvate le mod?
@ -54,37 +48,30 @@ ed è applicabile sia per gli sviluppatori che per i creatori di mod.
<a name="mod-locations"></a>
Ogni mod ha la sua cartella personale dove viene messo il suo codice in Lua, le sue texture,
i suoi modelli e i suoi file audio. Minetest fa un check in più punti per le mod. Questi punti
sono generalmente chiamati *percorsi di caricamento mod* (in inglese *mod load paths*).
i suoi modelli e i suoi file audio. Minetest fa un check in più punti e questi punti sono generalmente chiamati *percorsi di caricamento mod* (*mod load paths*).
Per un dato mondo/salvataggio, vengono controllati tre punti.
Essi sono, in ordine:
1. Mod di gioco. Queste sono le mod che compongono il gioco che il mondo sta eseguendo.
Es: `minetest/games/minetest_game/mods/`, `/usr/share/minetest/games/minetest/`
2. Mod globali. Il luogo dove le mod vengono quasi sempre installate. Se si è in dubbio,
le si metta qui.
2. Mod globali. Il luogo dove le mod vengono quasi sempre installate. Se si è in dubbio, le si metta qui.
Es: `minetest/mods/`
3. Mod del mondo. Il luogo dove mettere le mod che sono specifiche di un dato mondo.
Es: `minetest/worlds/world/worldmods/`
Minetest controllerà questi punti nell'ordine sopraelencato. Se incontra una mod con lo
stesso nome di una incontrata in precedenza, l'ultima verrà caricata al posto della prima.
Questo significa che si può sovrascrivere le mod di gioco piazzando una mod con lo stesso
nome nella cartella delle mod globali.
Minetest controllerà questi punti nell'ordine sopraelencato.
Se incontra una mod con lo stesso nome di una incontrata in precedenza, l'ultima verrà caricata al posto della prima.
Questo significa, per esempio, che è possibile sovrascriverne una di gioco se ve n'è una omonima nelle globali.
La posizione di ogni percorso di caricamento mod dipende da quale sistema operativo si sta
usando, e come è stato installato Minetest.
La posizione di ogni percorso dipende da quale sistema operativo si sta usando, e da come è stato installato Minetest.
* **Windows:**
* Per le build portatili, per esempio da un file .zip, vai dove hai estratto lo zip e
cerca le cartelle `games`, `mods` e `worlds`.
* Per le build installate, per esempio da un setup.exe,
guarda in C:\\\\Minetest o C:\\\\Games\\Minetest.
* Per le build portatili, per esempio da un file .zip, vai dove hai estratto lo zip e cerca le cartelle `games`, `mods` e `worlds`.
* Per le build installate, per esempio da un setup.exe, guarda in C:\\\\Minetest o C:\\\\Games\\Minetest.
* **GNU/Linux:**
* Per le installazioni di sistema, guarda in `~/.minetest`.
Attenzione che `~` equivale alla cartella home dell'utente, e che i file e le cartelle
che iniziano con un punto (`.`) sono nascosti di default.
Attenzione che `~` equivale alla cartella home dell'utente, e che i file e le cartelle che iniziano con un punto (`.`) sono nascosti di default.
* Per le installazioni portatili, guarda nella cartella di build.
* Per installazioni Flatpak, guarda in `~/.var/app/net.minetest.Minetest/.minetest/mods/`.
* **MacOS**
@ -95,11 +82,9 @@ usando, e come è stato installato Minetest.
![Find the mod's directory]({{ page.root }}/static/folder_modfolder.jpg)
Il *nome mod* è usato per riferirsi a una mod. Ogni mod dovrebbe avere un nome unico.
I nomi mod possono includere lettere, numeri e trattini bassi. Un buon nome dovrebbe
descrivere cosa fa la mod, e la cartella che contiene i componenti di una mod deve avere
lo stesso nome del nome mod.
Per scoprire se un nome mod è disponibile, prova a cercarlo su
Il *nome mod* è usato per riferirsi a una mod e ognuna di esse dovrebbe averne uno unico.
Questi possono includere lettere, numeri e trattini bassi, e un buon nome dovrebbe descrivere brevemente cosa fa la mod (è anche consigliato nominare la cartella della mod allo stesso modo).
Per scoprire se un nome è disponibile, prova a cercarlo su
[content.minetest.net](https://content.minetest.net).
@ -114,27 +99,24 @@ Per scoprire se un nome mod è disponibile, prova a cercarlo su
Solo il file init.lua è necessario in una mod per eseguirla al lanciare un gioco;
tuttavia, mod.conf è consigliato e altri componenti potrebbero essere richiesti a
seconda della funzione della mod.
seconda di quello che si vuole fare.
## Dipendenze
Una dipendenza avviene quando una mod richiede che un'altra mod sia avviata prima di essa.
Una dipendenza avviene quando una mod ne richiede un'altra da avviare prima di essa.
Una mod potrebbe infatti richiedere il codice di quest'ultima, i suoi oggetti o altre risorse.
Ci sono due tipi di dipendenze: forti e opzionali.
Entrambe richiedono che la mod richiesta venga caricata prima, con la differenza che se la
dipendenza è forte e la mod non viene trovata, l'altra fallirà nel caricare, mentre se è opzionale,
verranno semplicemente caricate meno feature.
Entrambe richiedono che la mod richiesta venga caricata prima, con la differenza che se la dipendenza è forte e la mod non viene trovata, l'altra fallirà nel caricare, mentre se è opzionale, verranno semplicemente caricate meno feature.
Una dipendenza opzionale è utile se si vuole integrare opzionalmente un'altra mod; può abilitare
contenuti extra se l'utente desidera usare entrambe le mod in contemporanea.
Una dipendenza opzionale è utile se si vuole integrare opzionalmente un'altra mod; può abilitare contenuti extra se l'utente desidera usare entrambe le mod in contemporanea.
Le dipendenze vanno elencate in mod.conf.
### mod.conf
Questo file è utilizzato per i metadati della mod, che includono il suo nome, la descrizione e
altre informazioni. Per esempio:
Questo file è utilizzato per i metadati della mod, che includono il suo nome, la descrizione e altre informazioni.
Per esempio:
name = lamiamod
description = Aggiunge X, Y, e Z.
@ -143,22 +125,18 @@ altre informazioni. Per esempio:
### depends.txt
Per questioni di compatibilità con le versioni 0.4.x di Minetest, al posto di specificare le
dipendenze solamente in mod.conf, c'è bisogno di fornire un file depends.txt nel quale vanno
elencate tutte le dipendenze:
Per questioni di compatibilità con le versioni 0.4.x di Minetest, al posto di specificare le dipendenze solamente in mod.conf, c'è bisogno di fornire un file depends.txt nel quale vanno elencate tutte le dipendenze:
mod1
mod2
mod3?
Ogni nome mod occupa una riga, e i nomi mod seguiti da un punto di domanda indicano una dipendenza
opzionale.
Ogni nome mod occupa una riga, e quelli seguiti da un punto di domanda indicano una dipendenza opzionale.
## Pacchetti mod (mod pack)
Le mod possono essere raggruppate in pacchetti che permettono a più mod di essere confezionate
e spostate insieme. Sono comodi se si vogliono fornire più mod al giocatore, ma non si vuole al
tempo stesso fargliele scaricare una per una.
Le mod possono essere raggruppate in pacchetti che permettono di confezionarne e spostarne più alla volta.
Sono comodi se si vogliono fornire più mod al giocatore, ma non si vuole al tempo stesso fargliele scaricare una per una.
pacchettomod1
├── modpack.lua (necessario) - segnala che è un pacchetto mod
@ -167,8 +145,7 @@ tempo stesso fargliele scaricare una per una.
└── mymod (opzionale)
   └── ... file mod
Attenzione che un pacchetto mod non equivale a un *gioco*.
I giochi hanno una propria struttura organizzativa che verrà spiegata nel loro apposito capitolo.
Attenzione che un pacchetto mod non equivale a un *gioco*. I giochi hanno una propria struttura organizzativa che verrà spiegata nel loro apposito capitolo.
## Esempio
@ -201,7 +178,7 @@ minetest.register_node("lamiamod:nodo", {
descriptions = Aggiunge un nodo
depends = default
Questa mod ha il nome "lamiamod". Ha tre file di testo: init.lua, mod.conf e depends.txt.\\
Questa mod ha come nome "lamiamod". Ha tre file di testo: init.lua, mod.conf e depends.txt.\\
Lo script stampa un messaggio e poi registra un nodo che sarà spiegato nel prossimo capitolo.\\
C'è una sola dipendenza, la [mod default](https://content.minetest.net/metapackages/default/), che
si trova solitamente nel Minetest Game.\\

View File

@ -9,8 +9,7 @@ redirect_from: /it/chapters/lua.html
## Introduzione <!-- omit in toc -->
In questo capitolo parleremo della programmazione in Lua, degli strumenti necessari,
e tratteremo alcune tecniche che troverai probabilmente utili.
In questo capitolo parleremo della programmazione in Lua, degli strumenti necessari, e tratteremo alcune tecniche che troverai probabilmente utili.
- [Editor di codice](#editor-di-codice)
- [Programmare in Lua](#programmare-in-lua)
@ -27,8 +26,7 @@ e tratteremo alcune tecniche che troverai probabilmente utili.
## Editor di codice
Un editor di codice con evidenziamento delle parole chiave è sufficiente per scrivere script in Lua.
L'evidenziamento assegna colori diversi a parole e caratteri diversi a seconda del loro significato.
Questo ti permette di individuare più facilmente eventuali errori.
L'evidenziamento assegna colori diversi a parole e caratteri diversi a seconda del loro significato, permettendo di individuare più facilmente eventuali errori.
```lua
function ctf.post(team,msg)
@ -47,7 +45,7 @@ end
```
Per esempio, parole chiave come if, then, end e return sono evidenziate nel passaggio qui sopra.
table.insert è invece una funzione base che deriva direttamente da Lua.
Lo stesso vale per le funzioni interne di Lua come table.insert.
Segue una lista di editor noti che si prestano bene per programmare in Lua.
Non sono, ovviamente, gli unici esisteneti.
@ -62,13 +60,12 @@ Non sono, ovviamente, gli unici esisteneti.
I programmi sono una serie di comandi che vengono eseguiti uno dopo l'altro.
Chiamiamo questi comandi "istruzioni".
Il flusso del programma è il come queste istruzioni vengono eseguite.
Differenti tipi di flusso ti permettono di saltare o meno serie di comandi.
Ci sono tre tipi di flusso:
Il flusso del programma è il come queste istruzioni vengono eseguite, e a differenti tipi di flusso corrispondono comportamenti diversi.
Essi possono essere:
* Sequenziale: esegue un'istruzione dopo l'altra, senza salti.
* Selettivo: salta alcune sequenze a seconda delle condizioni.
* Iterante: ripete ciclicamente. Continua a eseguire le stesse istruzioni
* Sequenziali: eseguono un'istruzione dopo l'altra, senza salti.
* Selettivi: saltano alcune sequenze a seconda delle condizioni.
* Iteranti: ripetono ciclicamente. Continuano a eseguire le stesse istruzioni
finché una condizione non è soddisfatta.
Quindi, come vengono rappresentate le istruzioni in Lua?
@ -83,21 +80,16 @@ print("La somma è ".. risultato)
Whoa, cos'è appena successo?
a, b, e risultato sono *variabili*. Le variabili locali si dichiarano
tramite l'uso della parola chiave local, e assegnando loro un valore iniziale.
Local sarà discussa in un attimo, in quanto parte di un concetto molto importante
chiamato *portata*.
a, b, e risultato sono *variabili*. Le variabili locali si dichiarano tramite l'uso della parola chiave local (che vedremo tra poco), e assegnando eventualmente loro un valore iniziale.
Il simbolo `=` significa *assegnazione*, quindi `risultato = a + b` significa impostare "risultato" ad a + b.
I nomi delle variabili possono essere più lunghi di un carattere, al contrario che in matematica, come
visto nella variabile "risultato".
Vale anche la pena notare che Lua è *case-sensitive* (differenzia maiscuole da minuscole);
Per quanto riguarda i nomi delle variabili, essi possono essere più lunghi di un carattere - al contrario che in matematica - come visto in "risultato", e vale anche la pena notare che Lua è *case-sensitive* (differenzia maiuscole da minuscole);
A è una variabile diversa da a.
### Tipi di variabili
Una variabile può equivalere solo a uno dei seguenti tipi e può cambiare tipo dopo l'assegnazione.
È buona pratica assicurarsi che una variabile sia sempre solo o nil o diversa da nil.
È buona pratica assicurarsi che sia sempre solo o nil o diversa da nil.
| Tipo | Descrizione | Esempio |
|----------|---------------------------------|----------------|
@ -123,7 +115,8 @@ Lista non esaustiva, ce ne sono altri
### Selezione
La selezione più basica è il costrutto if. Si presenta così:
La selezione più basica è il costrutto if.
Si presenta così:
```lua
local random_number = math.random(1, 100) -- Tra 1 e 100.
@ -134,9 +127,9 @@ else
end
```
Questo esempio genera un numero casuale tra 1 e 100. Stampa poi
"Woohoo!" se il numero è superiore a 50, altrimenti stampa "No!".
Cos'altro puoi usare oltre a '>'?
Questo esempio genera un numero casuale tra 1 e 100.
Stampa poi "Woohoo!" se il numero è superiore a 50, altrimenti stampa "No!".
Cos'altro si può usare oltre a '>'?
### Operatori logici
@ -152,7 +145,7 @@ Cos'altro puoi usare oltre a '>'?
| A or B | O (almeno uno dei due vero) | (2 > 1) or (1 == 2) (true), (2 > 4) or (1 == 3) (false) |
| not A | non vero | not (1 == 2) (true), not (1 == 1) (false) |
La lista non è esaustiva, e puoi inoltre combinare gli operatori in questo modo:
La lista non è esaustiva, e gli operatori possono essere combinati, come da esempio:
```lua
if not A and B then
@ -162,8 +155,7 @@ end
Che stampa "Yay!" se A è falso e B vero.
Gli operatori logici e matematici funzionano esattamente allo stesso modo;
entrambi accettano input e ritornano un valore che può essere immagazzinato.
Gli operatori logici e matematici funzionano esattamente allo stesso modo; entrambi accettano input e ritornano un valore che può essere immagazzinato.
```lua
local A = 5
@ -175,16 +167,12 @@ end
## Programmare
Programmare è l'azione di prendere un problema, come ordinare una lista di oggetti,
e tramutarlo in dei passaggi che il computer può comprendere.
Programmare è l'azione di prendere un problema, come ordinare una lista di oggetti, e tramutarlo in dei passaggi che il computer può comprendere.
Insegnarti i processi logici della programmazione non rientra nell'ambito di questo libro;
tuttavia, i seguenti siti sono alquanto utili per approfondire l'argomento:
Insegnarti i processi logici della programmazione non rientra nell'ambito di questo libro; tuttavia, i seguenti siti sono alquanto utili per approfondire l'argomento:
* [Codecademy](http://www.codecademy.com/) è una delle migliori risorse per
imparare a 'programmare'; offre un'esperienza guidata interattiva.
* [Scratch](https://scratch.mit.edu) è una buona risorsa quando si comincia
dalle basi assolute, imparando le tecniche di problem solving necessarie per programmare.\\
* [Codecademy](http://www.codecademy.com/) è una delle migliori risorse per imparare come scrivere codice; offre un'esperienza guidata interattiva.
* [Scratch](https://scratch.mit.edu) è una buona risorsa quando si comincia dalle basi assolute, imparando le tecniche di problem solving necessarie per la programmazione.\\
Scratch è **ideato per insegnare ai bambini** e non è un linguaggio serio di programmazione.
## Portata locale e globale
@ -240,11 +228,10 @@ one()
two()
```
dump() è una funzione che può trasformare qualsiasi variabile in una stringa, cosicché
il programmatore possa vedere cosa rappresenta. La variabile foo sarà stampata come
"bar", virgolette incluse (che dimostrano che è una stringa).
dump() è una funzione che può trasformare qualsiasi variabile in una stringa, cosicché il programmatore possa vedere cosa rappresenta.
In questo caso `foo` sarà stampata come "bar", virgolette incluse (che dimostrano che è una stringa).
L'esempio precedente non è buona programmazione e Minetest, infatti, avviserà di ciò:
L'esempio precedente non è tuttavia buona norma e Minetest, infatti, ci avviserà di ciò:
Assignment to undeclared global 'foo' inside function at init.lua:2
@ -264,12 +251,10 @@ two()
```
Ricorda che nil significa **non inizializzato**.
Ovvero la variabile non è stata ancora assegnata a un valore,
non esiste o è stata deinizializzata (cioè impostata a nil)
Ovvero la variabile non è stata ancora assegnata a un valore, non esiste o è stata deinizializzata (cioè impostata a nil)
La stessa cosa vale per le funzioni. Le funzioni sono variabili di tipo speciale,
e dovrebbero essere dichiarate locali, in quanto altre mod potrebbero sennò avere funzioni
con lo stesso nome.
La stessa cosa vale per le funzioni.
Le funzioni sono variabili di tipo speciale, e dovrebbero essere dichiarate locali, in quanto altre mod potrebbero sennò avere funzioni con lo stesso nome.
```lua
local function foo(bar)
@ -310,5 +295,4 @@ print(ret) -- Hello world!
```
Nei capitoli seguenti si parlerà nel dettaglio di come suddividere il codice di una mod.
Tuttavia, per ora l'approccio semplicistico è di avere file differenti per diversi tipi di cose
— nodi.lua, craft.lua, oggetti.lua ecc.
Tuttavia, per ora l'approccio semplicistico è di avere file differenti per diversi tipi di cose — nodi.lua, craft.lua, oggetti.lua ecc.

View File

@ -9,13 +9,10 @@ redirect_from: /it/chapters/creating_textures.html
## Introduzione <!-- omit in toc -->
Essere in grado di creare e ottimizare le texture è un'abilità alquanto utile quando si sviluppa
per Minetest.
Ci sono molti approcci sul come creare texture in pixel art, e capire questi approcci
migliorerà nettamente la qualità dei tuoi lavori.
Essere in grado di creare e ottimizare le texture è un'abilità alquanto utile quando si sviluppa per Minetest.
Ci sono molti approcci sul come creare texture in pixel art, e capire questi approcci migliorerà nettamente la qualità dei tuoi lavori.
Fornire spiegazioni dettagliate non rientra tuttavia nell'ambito di questo libro:
verranno quindi trattate solo le tecniche più semplici.
Fornire spiegazioni dettagliate non rientra tuttavia nell'ambito di questo libro: verranno quindi trattate solo le tecniche più semplici.
Se si vuole approfondire, ci sono comunque molti [buoni tutorial online](http://www.photonstorm.com/art/tutorials-art/16x16-pixel-art-tutorial) disponibili, che si occupano di pixel art in modo molto più dettagliato.
- [Tecniche](#tecniche)
@ -31,17 +28,14 @@ Se si vuole approfondire, ci sono comunque molti [buoni tutorial online](http://
### Usare la matita
Lo strumento matita è disponibile nella maggior parte dei programmi di disegno.
Quando viene impostato alla dimensione minima, ti permette di disegnare un pixel alla volta
senza alterare le atre parti dell'immagine.
Manipolando i singoli pixel si possono creare texture chiare e nette senza alcuna
sfocatura non voluta, dando inoltre un alto livello di precisione e controllo.
Quando viene impostato alla dimensione minima, permette di disegnare un pixel alla volta senza alterare le atre parti dell'immagine.
Manipolando i singoli pixel si possono creare texture chiare e nette senza alcuna sfocatura non voluta, dando inoltre un alto livello di precisione e controllo.
### Piastrellatura (tiling)
Le texture usate per i nodi dovrebbero generalmente essere progettate per ripetersi come
delle piastrelle.
Questo significa che quando piazzi più nodi con la stessa texture vicini, i bordi dovranno
allinearsi correttamente creando un effetto di continuità.
Questo significa che quando piazzi più nodi con la stessa texture vicini, i bordi dovranno allinearsi correttamente creando un effetto di continuità.
<!-- IMAGE NEEDED - cobblestone that tiles correctly -->
@ -52,10 +46,8 @@ gradevole da vedere.
### Trasparenza
La trasparenza è importante quando si creano texture per pressoché tutti gli
oggetti fabbricabili e per alcuni nodi, come il vetro.
Non tutti i programmi supportano la trasparenza, perciò assicurati di sceglierne
uno adatto ai tipi di texture che vuoi creare.
La trasparenza è importante quando si creano texture per pressoché tutti gli oggetti fabbricabili e per alcuni nodi, come il vetro.
Non tutti i programmi supportano la trasparenza, perciò assicurati di sceglierne uno adatto ai tipi di texture che vuoi creare.
## Programmi
@ -69,8 +61,7 @@ tuttavia se la trasparenza è un requisito nelle tue texture dovresti guardare o
### GIMP
GIMP viene impiegato spesso nella comunità di Minetest.
Ha una curva di apprendimento alquanto alta, dato che molte delle sue funzioni
non risultano ovvie nell'immediato.
Ha una curva di apprendimento alquanto alta, dato che molte delle sue funzioni non risultano ovvie nell'immediato.
Quando usi GIMP, puoi selezionare la matita dalla Barra degli Strumenti:

View File

@ -13,8 +13,7 @@ redirect_from:
## Introduzione <!-- omit in toc -->
In questo capitolo, imparerai come usare e manipolare gli inventari, siano essi quelli
di un giocatore, di un nodo o a sé stanti.
In questo capitolo, imparerai come usare e manipolare gli inventari, siano essi quelli di un giocatore, di un nodo o a sé stanti.
- [Cosa sono gli ItemStack e gli inventari?](#cosa-sono-gli-itemstack-e-gli-inventari)
- [ItemStack](#itemstack)
@ -31,21 +30,17 @@ di un giocatore, di un nodo o a sé stanti.
## Cosa sono gli ItemStack e gli inventari?
Un ItemStack (*pila di oggetti*) è il dato dietro una singola cella di un inventario.
Un ItemStack ( lett. "pila di oggetti") è il dato dietro una singola cella di un inventario.
Un *inventario* è una collezione di *liste* apposite, ognuna delle quali è una griglia
2D di ItemStack.
Lo scopo di un inventario è quello di raggruppare più liste in un singolo oggetto (l'inventario appunto),
in quanto a ogni giocatore e a ogni nodo può essere associato massimo un inventario.
Un *inventario* è una collezione di *liste* apposite, ognuna delle quali è una griglia 2D di ItemStack.
Lo scopo di un inventario è quello di raggruppare più liste in un singolo oggetto (l'inventario appunto), in quanto a ogni giocatore e a ogni nodo ne può essere associato massimo uno.
## ItemStack
Gli ItemStack sono composti da quattro parametri: nome, quantità, durabilità e metadati.
Il nome dell'oggetto può essere il nome di un oggetto registrato, di uno sconosciuto (non registrato)
o un alias.
Gli oggetti sconosciuti sono tipici di quando si disinstallano le mod, o quando le mod rimuovono
degli oggetti senza nessun accorgimento, tipo senza registrarne un alias.
Il nome dell'oggetto può essere il nome di un oggetto registrato, di uno sconosciuto (non registrato) o un alias.
Gli oggetti sconosciuti sono tipici di quando si disinstallano le mod, o quando le mod rimuovono degli oggetti senza nessun accorgimento, tipo senza registrarne un alias.
```lua
print(stack:get_name())
@ -57,18 +52,13 @@ end
```
La quantità sarà sempre 0 o maggiore.
Durante una normale sessione di gioco, la quantità non dovrebbe mai essere maggiore della dimensione
massima della pila dell'oggetto - `stack_max`.
Tuttavia, comandi da amministratore e mod fallate potrebbero portare a oggetti impilati che superano
la grandezza massima.
Durante una normale sessione di gioco, la quantità non dovrebbe mai essere maggiore della dimensione massima della pila dell'oggetto - `stack_max`.
Tuttavia, comandi da amministratore e mod fallate potrebbero portare a oggetti impilati che superano la grandezza massima.
```lua
print(stack:get_stack_max())
```
Un ItemStack può essere vuoto, nel qual caso avrà come quantità 0.
```lua
@ -76,7 +66,7 @@ print(stack:get_count())
stack:set_count(10)
```
Gli ItemStack possono essere creati in diversi modi usando la funzione ItemStack.
Gli ItemStack possono poi essere creati in diversi modi usando l'omonima funzione.
```lua
ItemStack() -- name="", count=0
@ -87,8 +77,7 @@ ItemStack({ name = "default:wood", count = 10 })
I metadati di un oggetto sono una o più coppie chiave-valore custodite in esso.
Chiave-valore significa che si usa un nome (la chiave) per accedere al dato corrispettivo (il valore).
Alcune chiavi hanno significati predefiniti, come `description` che è usato per specificare la descrizione
di una pila di oggetti.
Alcune chiavi hanno significati predefiniti, come `description` che è usato per specificare la descrizione di una pila di oggetti.
Questo sarà trattato più in dettaglio nel capitolo Storaggio e Metadati.
## Collocazione inventari
@ -105,8 +94,7 @@ local inv = minetest.get_inventory({ type="node", pos={x=1, y=2, z=3} })
```
L'esempio in alto ottiene il *riferimento a un inventario*, comunemente definito *InvRef*.
Questi riferimenti sono usati per manipolare l'inventario, e son chiamati così perché i dati
non sono davvero salvati dentro all'oggetto (in questo caso "inv"), bensì *puntano* a quei dati.
Questi riferimenti sono usati per manipolare l'inventario, e son chiamati così perché i dati non sono davvero salvati dentro all'oggetto (in questo caso "inv"), bensì *puntano* a quei dati.
In questo modo, modificando "inv", stiamo in verità modificando l'inventario.
La collocazione di tali riferimenti può essere ottenuta nel seguente modo:
@ -115,8 +103,8 @@ La collocazione di tali riferimenti può essere ottenuta nel seguente modo:
local location = inv:get_location()
```
Gli inventari dei giocatori si ottengono in maniera simile, oppure usando il riferimento
a un giocatore (*PlayerRef*). In entrambi casi, il giocatore deve essere connesso.
Gli inventari dei giocatori si ottengono in maniera simile, oppure usando il riferimento a un giocatore (*PlayerRef*).
In entrambi casi, il giocatore deve essere connesso.
```lua
local inv = minetest.get_inventory({ type="player", name="player1" })
@ -124,8 +112,7 @@ local inv = minetest.get_inventory({ type="player", name="player1" })
local inv = player:get_inventory()
```
Gli inventari separati, infine, sono quelli non collegati né a nodi né a giocatori,
e al contrario degli altri, vengono persi dopo un riavvio.
Gli inventari separati, infine, sono quelli non collegati né a nodi né a giocatori, e al contrario degli altri, vengono persi dopo un riavvio.
```lua
local inv = minetest.get_inventory({
@ -138,9 +125,8 @@ Un'ulteriore differenza, è che gli inventari separati devono essere creati prim
minetest.create_detached_inventory("inventory_name")
```
La funzione create_detached_inventory accetta 3 parametri, di cui solo il primo - il nome - è necessario.
Il secondo parametro prende una tabella di callback, che possono essere utilizzati
per controllare come i giocatori interagiscono con l'inventario:
La funzione `create_detached_inventory` accetta 3 parametri, di cui solo il primo - il nome - è necessario.
Il secondo parametro prende una tabella di callback, che possono essere utilizzati per controllare come i giocatori interagiscono con l'inventario:
```lua
-- Input only detached inventory
@ -165,22 +151,18 @@ minetest.create_detached_inventory("inventory_name", {
})
```
I callback dei permessi - quelle che iniziano con `allow_` - ritornano il numero
degli oggetti da trasferire, e si usa -1 per impedirne del tutto l'azione.
I callback dei permessi - quelle che iniziano con `allow_` - ritornano il numero degli oggetti da trasferire, e si usa -1 per impedirne del tutto l'azione.
I callback delle azioni - quelle che iniziano con `on_` - non ritornano invece alcun valore.
## Liste
Le liste negli inventari permettono di disporre più griglie nello stesso luogo (l'inventario).
Esse sono particolarmente utili per il giocatore, e infatti di base ogni gioco possiede già
delle liste come *main* per il corpo principale dell'inventario e *craft* per l'area di fabbricazione.
Esse sono particolarmente utili per il giocatore, e infatti di base ogni gioco possiede già delle liste come *main* per il corpo principale dell'inventario e *craft* per l'area di fabbricazione.
### Dimensione e ampiezza
Le liste hanno una dimensione, equivalente al numero totale di celle nella griglia, e un'ampiezza,
che è usata esclusivamente dentro il motore di gioco: quando viene disegnato un inventario in una finestra,
infatti, il codice dietro di essa già determina che ampiezza usare.
Le liste hanno una dimensione, equivalente al numero totale di celle nella griglia, e un'ampiezza, che è usata esclusivamente dentro il motore di gioco: quando viene disegnato un inventario in una finestra, infatti, il codice dietro di essa già determina che ampiezza usare.
```lua
if inv:set_size("main", 32) then
@ -192,10 +174,8 @@ else
end
```
`set_size` non andrà in porto e ritornerà "false" se il nome della lista o la dimensione dichiarata
non risultano valide.
Per esempio, la nuova dimensione potrebbe essere troppo piccola per contenere gli oggetti attualmente
presenti nell'inventario.
`set_size` non andrà in porto e ritornerà "false" se il nome della lista o la dimensione dichiarata non risultano valide.
Per esempio, la nuova dimensione potrebbe essere troppo piccola per contenere gli oggetti attualmente presenti nell'inventario.
### Controllare il contenuto
@ -219,8 +199,8 @@ end
### Aggiungere a una lista
Per aggiungere degli oggetti a una lista (in questo caso "main") usiamo `add_item`. Nell'esempio
sottostante ci accertiamo anche di rispettare la dimensione:
Per aggiungere degli oggetti a una lista (in questo caso "main") usiamo `add_item`.
Nell'esempio sottostante ci accertiamo anche di rispettare la dimensione:
```lua
local stack = ItemStack("default:stone 99")
@ -248,8 +228,7 @@ Puoi modificare le singole pile prima ottenendole:
local stack = inv:get_stack(listname, 0)
```
E poi modificandole impostando le nuove proprietà o usando i metodi che
rispettano `stack_size`:
E poi modificandole impostando le nuove proprietà o usando i metodi che rispettano `stack_size`:
```lua
local pila = ItemStack("default:stone 50")
@ -267,8 +246,7 @@ print("Hai " .. pila:get_count() .. " oggetti")
```
`add_item` aggiungerà gli oggetti all'ItemStack e ritornerà quelli in eccesso.
`take_item` rimuoverà gli oggetti indicati (o meno se ce ne sono meno), e ritornerà
l'ammontare rimosso.
`take_item` rimuoverà gli oggetti indicati (o meno se ce ne sono meno), e ritornerà l'ammontare rimosso.
Infine, si imposta la pila modificata:
@ -278,9 +256,8 @@ inv:set_stack(listname, 0, pila)
## Usura
Gli strumenti possono avere un livello di usura; l'usura è rappresentata da un barra progressiva
e fa rompere lo strumento quando completamente logorato.
L'usura è un numero da 0 a 65535; più è alto, più è consumato l'oggetto.
Gli strumenti possono avere un livello di usura; essa è rappresentata da un barra progressiva e fa rompere lo strumento quando completamente logorato.
Nello specifico, l'usura è un numero da 0 a 65535: più è alto, più è consumato l'oggetto.
Il livello di usura può essere manipolato usando `add_wear()`, `get_wear()`, e `set_wear(wear)`.
@ -293,7 +270,7 @@ local usi_massimi = 10
pila:add_wear(65535 / (usi_massimi - 1))
```
Quando scavi un nodo, l'incremento di usura di uno strumento dipende da che tipo di nodo è.
Quando si scava un nodo, l'incremento di usura di uno strumento dipende da che tipo di nodo è.
Di conseguenza, `usi_massimi` varia a seconda di cos'è stato scavato.
## Tabelle Lua
@ -334,10 +311,8 @@ La tabella di liste ritornata da `get_lists()` sarà nel seguente formato:
`get_list()` ritornerà una lista singola fatta di ItemStack.
Una cosa importante da sottolineare è che i metodi `set` qui in alto non cambiano
la dimensione delle liste.
Questo significa che si può svuotare una lista dichiarandola uguale a una tabella vuota,
e la sua dimensione tuttavia non cambierà:
Una cosa importante da sottolineare è che i metodi `set` qui in alto non cambiano la dimensione delle liste.
Questo significa che si può svuotare una lista dichiarandola uguale a una tabella vuota, e la sua dimensione tuttavia non cambierà:
```lua
inv:set_list("main", {})

View File

@ -10,21 +10,14 @@ redirect_from: /it/chapters/node_drawtypes.html
## Introduzione <!-- omit in toc -->
Il metodo col quale un nodo viene disegnato in gioco è chiamato *drawtype*.
Ci sono diversi tipi di drawtype: il loro comportamento è determinato dalle proprietà
impostate durante la definizione del tipo di nodo.
Queste proprietà sono fisse, uguali per tutte le istanze, tuttavia
è possibile manipolarne alcune per singolo nodo usando una cosa chiamata `param2`.
Ci sono diversi tipi di drawtype: il loro comportamento è determinato dalle proprietà impostate durante la definizione del tipo di nodo.
Queste proprietà sono fisse, uguali per tutte le istanze, tuttavia è possibile manipolarne alcune per singolo nodo usando una cosa chiamata `param2`.
Il concetto di nodo è stato introdotto nello scorso capitolo, ma non è mai stata
data una definizione completa.
Il mondo di Minetest è una griglia 3D: un nodo è un punto di quella griglia ed è composto
da un tipo (name) e due parametri (param1 e param2).
Non farti inoltre ingannare dalla funzione `minetest.register_node`, in quanto è un po' fuorviante:
essa non registra infatti un nuovo nodo (c'è solo una definizione di nodo), bensì un nuovo *tipo* di nodo.
Il concetto di nodo è stato introdotto nello scorso capitolo, ma non è mai stata data una definizione completa.
Il mondo di Minetest è una griglia 3D: un nodo è un punto di quella griglia ed è composto da un tipo (`name`) e due parametri (`param1` e `param2`).
Non farti inoltre ingannare dalla funzione `minetest.register_node`, in quanto è un po' fuorviante: essa non registra infatti un nuovo nodo (c'è solo una definizione di nodo), bensì un nuovo *tipo* di nodo.
I parametri sono infine usati per controllare come un nodo viene renderizzato individualmente:
`param1` immagazzina le proprietà di luce, mentre il ruolo di `param2` dipende dalla
proprietà `paramtype2`, la quale è situata nella definizione dei singoli tipi di nodi.
I parametri sono infine usati per controllare come un nodo viene renderizzato individualmente: `param1` immagazzina le proprietà di luce, mentre il ruolo di `param2` dipende dalla proprietà `paramtype2`, la quale è situata nella definizione dei singoli tipi.
- [Nodi cubici: normali e a facciate piene](#nodi-cubici-normali-e-a-facciate-piene)
- [Nodi vitrei](#nodi-vitrei)
@ -50,14 +43,12 @@ proprietà `paramtype2`, la quale è situata nella definizione dei singoli tipi
</figcaption>
</figure>
Il drawtype normale è tipicamente usato per renderizzare un nodo cubico.
Se il lato di uno di questi nodi tocca un nodo solido, allora quel lato non sarà renderizzato,
risultando in un grande guadagno sulle prestazioni.
Il *drawtype* normale è tipicamente usato per renderizzare un nodo cubico.
Se il lato di uno di questi nodi tocca un nodo solido, allora quel lato non sarà renderizzato, risultando in un grande guadagno sulle prestazioni.
Al contrario, i drawtype a facciate piene (allfaces) renderizzeranno comunque il lato interno quando
è contro un nodo solido. Ciò è buono per quei nodi con facce in parte trasparenti come
le foglie. Puoi inoltre usare il drawtype `allfaces_optional` per permettere agli utenti
di fare opt-out dal rendering più pesante, facendo comportare il nodo come se fosse di tipo normale.
Al contrario, i *drawtype* a facciate piene (*allfaces*) renderizzeranno comunque il lato interno quando è contro un nodo solido.
Ciò è buono per quei nodi con facce in parte trasparenti come le foglie.
Puoi inoltre usare il drawtype `allfaces_optional` per permettere agli utenti di fare opt-out dal rendering più pesante, facendo comportare il nodo come se fosse di tipo normale.
```lua
minetest.register_node("miamod:diamante", {
@ -77,10 +68,8 @@ Attenzione: il drawtype normale è quello predefinito, quindi non c'è bisogno d
## Nodi vitrei
La differenza tra i nodi vitrei (glasslike) e quelli normali è che piazzando i primi vicino a un
nodo normale, non nasconderanno il lato di quest'ultimo.
Questo è utile in quanto i nodi vitrei tendono a essere trasparenti, perciò permettono
di vedere attraverso.
La differenza tra i nodi vitrei (*glasslike*) e quelli normali è che piazzando i primi vicino a un nodo normale, non nasconderanno il lato di quest'ultimo.
Questo è utile in quanto i nodi vitrei tendono a essere trasparenti, perciò permettono di vedere attraverso.
<figure>
<img src="{{ page.root }}//static/drawtype_glasslike_edges.png" alt="Bordi vitrei">
@ -104,8 +93,7 @@ minetest.register_node("default:obsidian_glass", {
### Vitreo incorniciato
Questa opzione crea un solo bordo lungo tutto l'insieme di nodi, al posto di
crearne più per singolo nodo.
Questa opzione crea un solo bordo lungo tutto l'insieme di nodi, al posto di crearne più per singolo nodo.
<figure>
<img src="{{ page.root }}//static/drawtype_glasslike_framed.png" alt="Bordi vitrei incorniciati">
@ -127,11 +115,11 @@ minetest.register_node("default:glass", {
})
```
Puoi inoltre usare il drawtype glasslike_framed_optional per permettere un opt-in all'utente.
Puoi inoltre usare il *drawtype* `glasslike_framed_optional` per permettere un opt-in all'utente.
## Nodi d'aria
I nodi d'aria (airlike) non sono renderizzati e perciò non hanno texture.
I nodi d'aria (*airlike*) non sono renderizzati e perciò non hanno texture.
```lua
minetest.register_node("miaaria:aria", {
@ -155,21 +143,20 @@ minetest.register_node("miaaria:aria", {
## Luce e propagazione solare
La luce di un nodo è salvata in param1. Per capire come ombreggiare
il lato di un nodo, viene utilizzato il valore di luminosità dei nodi adiacenti.
La luce di un nodo è salvata in `param1`.
Per capire come ombreggiare il lato di un nodo, viene utilizzato il valore di luminosità dei nodi adiacenti.
Questo comporta un blocco della luce da parte dei nodi solidi.
Di base, non viene salvata la luce in nessun nodo né nelle sue istanze.
È invece solitamente preferibile farla passare in tipi quali quelli d'aria e
vitrei. Per fare ciò, ci sono due proprietà che devono essere definite:
È invece solitamente preferibile farla passare in tipi quali quelli d'aria e vitrei.
Per fare ciò, ci sono due proprietà che devono essere definite:
```lua
paramtype = "light",
sunlight_propagates = true,
```
La prima riga dice a param1 di immagazzinare l'indice di luminosità.
La seconda riga invece permette alla luce del sole di propagarsi attraverso il nodo senza diminuire il suo valore.
La prima riga dice a `param1` di immagazzinare l'indice di luminosità, mentre la seconda permette alla luce del sole di propagarsi attraverso il nodo senza diminuire il proprio valore.
## Nodi liquidi
@ -180,8 +167,7 @@ La seconda riga invece permette alla luce del sole di propagarsi attraverso il n
</figcaption>
</figure>
Ogni tipo di liquido richiede due definizioni di nodi: una per la sorgente e l'altra
per il liquido che scorre.
Ogni tipo di liquido richiede due definizioni di nodi: una per la sorgente e l'altra per il liquido che scorre.
```lua
-- Alcune proprietà sono state rimosse perché non
@ -261,8 +247,7 @@ Guarda default:water_flowing nella mod default di minetest_game per un esempio c
</figcaption>
</figure>
I nodi complessi (nodebox) ti permettono di creare un nodo che non è cubico, bensì un insieme
di più cuboidi.
I nodi complessi (*nodebox*) ti permettono di creare un nodo che non è cubico, bensì un insieme di più cuboidi.
```lua
minetest.register_node("stairs:stair_stone", {
@ -278,27 +263,22 @@ minetest.register_node("stairs:stair_stone", {
})
```
La parte più importable è la tabella node_box:
La parte più importante è la tabella `node_box`:
```lua
{-0.5, -0.5, -0.5, 0.5, 0, 0.5},
{-0.5, 0, 0, 0.5, 0.5, 0.5}
```
Ogni riga corrisponde a un cuboide e l'insieme delle righe forma il nodo complesso:
i primi tre numeri sono le coordinate (da -0.5 a 0.5) dell'angolo davanti in basso a sinistra,
mentre gli altri tre equivalgono all'angolo opposto.
Ogni riga corrisponde a un cuboide e l'insieme delle righe forma il nodo complesso: i primi tre numeri sono le coordinate (da -0.5 a 0.5) dell'angolo davanti in basso a sinistra, mentre gli altri tre equivalgono all'angolo opposto.
Essi sono in formato X, Y, Z, dove Y indica il sopra.
Puoi usare [NodeBoxEditor](https://forum.minetest.net/viewtopic.php?f=14&t=2840) per
creare nodi complessi più facilmente, in quanto permette di vedere in tempo reale le modifiche
sul nodo che si sta modellando.
Puoi usare [NodeBoxEditor](https://forum.minetest.net/viewtopic.php?f=14&t=2840) per creare nodi complessi più facilmente, in quanto permette di vedere in tempo reale le modifiche sul nodo che si sta modellando.
### Nodi complessi a muro
Certe volte si vogliono avere nodi complessi che cambiano a seconda della loro posizione
sul pavimento, sul muro e sul soffitto, come le torce.
Certe volte si vogliono avere nodi complessi che cambiano a seconda della loro posizione sul pavimento, sul muro e sul soffitto, come le torce.
```lua
minetest.register_node("default:sign_wall", {
@ -326,13 +306,11 @@ minetest.register_node("default:sign_wall", {
## Nodi mesh
Mentre i nodi complessi sono generalmente più semplici da fare, essi sono limitati
in quanto possono essere composti solo da cuboidi. I nodi complessi sono anche non ottimizzati:
le facce interne, infatti, saranno comunque renderizzate, anche quando completamente nascoste.
Mentre i nodi complessi sono generalmente più semplici da fare, essi sono limitati in quanto possono essere composti solo da cuboidi.
I nodi complessi sono anche non ottimizzati: le facce interne, infatti, saranno comunque renderizzate, anche quando completamente nascoste.
Una faccia è una superficie piatta di una mesh. Una faccia interna appare quando le
facce di due nodi complessi si sovrappongono, rendendo invisibili parti del modello
ma renderizzandole comunque.
Una faccia è una superficie piatta di una mesh.
Una faccia interna appare quando le facce di due nodi complessi si sovrappongono, rendendo invisibili parti del modello ma renderizzandole comunque.
Puoi registrare un nodo mesh come segue:
@ -351,17 +329,15 @@ minetest.register_node("miamod:meshy", {
```
Assicurati che la mesh sia presente nella cartella `models`.
La maggior parte delle volte la mesh dovrebbe essere nella cartella della tua mod, tuttavia
è ok condividere una mesh fornita da un'altra mod dalla quale dipendi.
Per esempio, una mod che aggiunge più tipi di mobili potrebbe usfruire di un modello
fornito da una mod di mobili base.
La maggior parte delle volte la mesh dovrebbe essere nella cartella della tua mod, tuttavia è ok condividere una mesh fornita da un'altra mod dalla quale dipendi.
Per esempio, una mod che aggiunge più tipi di mobili potrebbe usfruire di un modello fornito da una mod di mobili base.
## Nodi insegna
I nodi insegna (signlike) sono nodi piatti che possono essere affissi sulle facce di altri nodi.
I nodi insegna (*signlike*) sono nodi piatti che possono essere affissi sulle facce di altri nodi.
Al contrario del loro nome, i cartelli non rientrano nei nodi insegna bensì nei nodi complessi,
per fornire un effetto 3D. I tipi insegna tuttavia, sono comunemente usati dalle scale a pioli.
Al contrario del loro nome, i cartelli non rientrano nei nodi insegna bensì in quelli complessi, per fornire un effetto 3D.
I tipi insegna tuttavia, sono comunemente usati dalle scale a pioli.
```lua
minetest.register_node("default:ladder_wood", {
@ -387,7 +363,7 @@ minetest.register_node("default:ladder_wood", {
</figcaption>
</figure>
I nodi pianta raffigurano la loro texture in un pattern a forma di X.
I nodi pianta (*plantlike*) raffigurano la loro texture in un pattern a forma di X.
```lua
minetest.register_node("default:papyrus", {
@ -405,8 +381,7 @@ minetest.register_node("default:papyrus", {
## Nodi fiamma
I nodi fiamma (firelike) sono simili ai pianta, ad eccezione del fatto che sono
ideati per "avvinghiarsi" ai muri e ai soffitti.
I nodi fiamma (*firelike*) sono simili ai pianta, ad eccezione del fatto che sono ideati per avvinghiarsi ai muri e ai soffitti.
<figure>
<img src="{{ page.root }}//static/drawtype_firelike.png" alt="Drawtype fiamma">
@ -426,7 +401,7 @@ minetest.register_node("miamod:avvinghiatutto", {
## Altri drawtype
Questa non è una lista definitiva, ci sono infatti altri tipi di nodi come:
Questa non è una lista esaustiva, in quanto ci sono infatti altri tipi di nodi come:
* Nodi staccionata
* Nodi pianta radicata - per quelle acquatiche
@ -435,5 +410,4 @@ Questa non è una lista definitiva, ci sono infatti altri tipi di nodi come:
Le torce in Minetest Game usano in verità due diverse definizioni dei
nodi mesh (default:torch e default:torch_wall).
Come al solito, consulta la [documentazione sull'API Lua](../../lua_api.html#node-drawtypes)
per l'elenco completo.
Come al solito, consulta la [documentazione sull'API Lua](../../lua_api.html#node-drawtypes) per l'elenco completo.

View File

@ -28,19 +28,15 @@ Saper registrare nuovi nodi, oggetti fabbricabili e conseguenti ricette, è un r
## Cosa sono i nodi e gli oggetti?
Nodi, oggetti fabbricabili e strumenti sono tutti oggetti.
Un oggetto è qualcosa che può essere trovato in un inventario —
anche se potrebbe non risultare possibile durante una normale sessione di gioco.
Un oggetto è qualcosa che può essere trovato in un inventario — anche se potrebbe non risultare possibile durante una normale sessione di gioco.
Un nodo è un oggetto che può essere piazzato o trovato nel mondo.
Ogni coordinata nel mondo deve essere occupata da un unico nodo —
ciò che appare vuoto è solitamente un nodo d'aria.
Ogni coordinata nel mondo deve essere occupata da un unico nodo — ciò che appare vuoto è solitamente un nodo d'aria.
Un oggetto fabbricabile (*craftitem*) non può essere invece piazzato, potendo apparire solo negli inventari
o come oggetto rilasciato nel mondo.
Un oggetto fabbricabile (*craftitem*) non può essere invece piazzato, potendo apparire solo negli inventari o come oggetto rilasciato nel mondo.
Uno strumento (*tool*) può usurarsi e solitamente non possiede la capacità di scavare.
In futuro, è probabile che gli oggetti fabbricabili e gli strumenti verranno fusi in un unico tipo,
in quanto la distinzione fra di essi è alquanto artificiosa.
In futuro, è probabile che gli oggetti fabbricabili e gli strumenti verranno fusi in un unico tipo, in quanto la distinzione fra di essi è alquanto artificiosa.
## Registrare gli oggetti
@ -60,32 +56,30 @@ Ogni oggetto ha un nome usato per riferirsi a esso, che dovrebbe seguire la segu
nomemod:nomeoggetto
Il nomemod equivale appunto al nome della mod che registra l'oggetto, e nomeoggetto è
il nome che si vuole assegnare a quest'ultimo.
Il nome dell'oggetto dovrebbe essere inerente a quello che rappresenta e deve essere unico nella mod.
`nomemod` equivale appunto al nome della mod che registra l'oggetto, e `nomeoggetto` è il nome che si vuole assegnare a quest'ultimo.
Esso dovrebbe essere inerente a quello che rappresenta e deve essere unico nella mod.
Gli oggetti possono anche avere degli *alias* che puntano al loro nome.
Un *alias* è uno pseudonimo che dice al motore di gioco di trattarlo come se fosse il nome a cui punta.
Ciò è comunemente usato in due casi:
* Rinominare gli oggetti rimossi in qualcos'altro.
Ci potrebbero essere nodi sconosciuti nel mondo e negli inventari se un oggetto
viene rimosso da una mod senza nessun codice per gestirlo.
È importante evitare di assegnare come alias nomi di nodi inottenibili già esistenti
al nodo rimosso, se quest'ultimo poteva essere ottenuto.
* Aggiungere una scorciatoia. `/giveme dirt` è più semplice di `/giveme default:dirt`.
Ci potrebbero essere nodi sconosciuti nel mondo e negli inventari se un oggetto viene rimosso da una mod senza nessun codice per gestirlo.
È importante evitare di assegnare come alias nomi di nodi inottenibili già esistenti al nodo rimosso, se quest'ultimo poteva essere ottenuto.
* Aggiungere una scorciatoia.
`/giveme dirt` è più semplice di `/giveme default:dirt`.
Registrare un alias è alquanto semplice.
Un buon modo per ricordarne il funzionamento è `da → a`, dove *da*
è l'alias e *a* è il nome dell'oggetto a cui punta.
```lua
minetest.register_alias("dirt", "default:dirt")
```
Le mod devono assicurarsi di elaborare gli alias prima di occuparsi direttamente
del nome dell'oggeto, in quanto l'engine non lo fa di suo.
Ciò è comunque molto semplice:
Un buon modo per ricordarne il funzionamento è `da → a`, dove *da*
è l'alias e *a* è il nome dell'oggetto a cui punta.
Le mod devono inoltre assicurarsi di elaborare gli alias prima di occuparsi direttamente del nome dell'oggeto, in quanto l'engine non lo fa di suo.
Anche in questo caso non è difficile:
```lua
itemname = minetest.registered_aliases[itemname] or itemname
@ -93,17 +87,13 @@ itemname = minetest.registered_aliases[itemname] or itemname
### Texture
Per convenzione le texture andrebbero messe nella cartella textures/ con nomi che seguono la struttura
`nomemod_nomeoggetto.png`.\\
Le immagini in JPEG sono supportate, ma non supportano la trasparenza e sono generalmente
di cattiva qualità nelle basse risoluzioni.
Per convenzione le texture andrebbero messe nella cartella textures/ con nomi che seguono la struttura `nomemod_nomeoggetto.png`.\\
Le immagini in JPEG sono supportate, ma non supportano la trasparenza e sono generalmente di cattiva qualità nelle basse risoluzioni.
Si consiglia quindi il formato PNG.
Le texture su Minetest sono generalmente 16x16 pixel.
Possono essere di qualsiasi dimensione, ma è buona norma che rientrino nelle potenze di 2,
per esempio 16, 32, 64 o 128.
Questo perché dimensioni differenti potrebbero non essere supportate dai vecchi dispositivi,
comportando una diminuzione delle performance.
Possono essere di qualsiasi dimensione, ma è buona norma che rientrino nelle potenze di 2, per esempio 16, 32, 64 o 128.
Questo perché dimensioni differenti potrebbero non essere supportate dai vecchi dispositivi, comportando una diminuzione delle performance.
## Registrare un nodo base
@ -139,19 +129,18 @@ minetest.register_node("miamod:diamante", {
is_ground_content = true,
groups = {cracky = 3},
drop = "miamod:diamante_frammenti"
-- ^ Al posto di rilasciare diamanti, rilascia miamod:diamante_frammenti
-- ^ Al posto di far cadere diamanti, fa cadere miamod:diamante_frammenti
})
```
L'attributo is_ground_content è essenziale per ogni nodo che si vuole far apparire sottoterra
durante la generazione della mappa.
L'attributo is_ground_content è essenziale per ogni nodo che si vuole far apparire sottoterra durante la generazione della mappa.
Le caverne vengono scavate nel mondo dopo che tutti gli altri nodi nell'area sono stati generati.
## Azioni e callback
Minetest usa ampiamente una struttura per il modding incentrata sui callback (richiami).
I callback possono essere inseriti nella tabella di definizioni dell'oggetto per permettere una
risposta a vari tipi di eventi generati dall'utente.
I callback possono essere inseriti nella tabella di definizioni dell'oggetto per permettere una risposta a vari tipi di eventi generati dall'utente.
Vediamone un esempio.
### on_use
@ -167,14 +156,11 @@ minetest.register_craftitem("miamod:fangotorta", {
})
```
Il numero fornito alla funzione minetest.item_eat è il numero di punti salute ripristinati al
consumare il cibo.
Il numero fornito alla funzione minetest.item_eat è il numero di punti salute ripristinati al consumare il cibo.
In gioco ogni cuore equivale a due punti.
Un giocatore ha solitamente un massimo di 10 cuori, ovvero 20 punti salute.
Quest'ultimi non devono per forza essere interi, bensì possono anche essere decimali.
Un giocatore ha solitamente un massimo di 10 cuori, ovvero 20 punti salute, e quest'ultimi non devono per forza essere interi - ovvero decimali.
minetest.item_eat() è una funzione che ritorna un'altra funzione, in questo caso
quindi impostandola come callback di on_use.
`minetest.item_eat()` è una funzione che ritorna un'altra funzione, in questo caso quindi impostandola come callback di on_use.
Ciò significa che il codice in alto è alquanto simile al seguente:
```lua
@ -200,14 +186,12 @@ Ci sono diversi tipi di ricette di fabbricazione disponibili, indicate dalla pro
* fuel - Definisce gli oggetti che possono alimentare il fuoco nella fornace.
* tool_repair - Definisce gli oggetti che possono essere riparati.
Le ricette di fabbricazione non sono oggetti, perciò non usano nomi oggetto per
identificare in maniera univoca se stesse
Le ricette di fabbricazione non sono oggetti, perciò non usano nomi oggetto per identificare in maniera univoca se stesse.
### Fisse (shaped)
Le ricette fisse avvengono quando gli ingredienti devono essere nella forma o sequenza
corretta per funzionare. Nell'esempio sotto, i frammenti necessitano di essere in
in una figura a forma di sedia per poter fabbricare appunto 99 sedie.
Le ricette fisse avvengono quando gli ingredienti devono essere nella forma o sequenza corretta per funzionare.
Nell'esempio sotto, i frammenti necessitano di essere in una figura a forma di sedia per poter fabbricare appunto 99 sedie.
```lua
minetest.register_craft({
@ -222,8 +206,7 @@ minetest.register_craft({
```
Una cosa da tener presente è la colonna vuota sulla parte destra.
Questo significa che ci *deve* essere una colonna vuota a destra della forma, altrimenti
ciò non funzionerà.
Questo significa che ci *deve* essere una colonna vuota a destra della forma, altrimenti ciò non funzionerà.
Se invece la colonna non dovesse servire, basta ometterla in questo modo:
```lua
@ -237,13 +220,11 @@ minetest.register_craft({
})
```
Il campo type non è davvero necessario per le ricette fisse, in quanto sono
il tipo di base.
Il campo type non è davvero necessario per le ricette fisse, in quanto sono il tipo di base.
### Informi (shapeless)
Le ricette informi sono ricette che vengono usate quando non importa
dove sono posizionati gli ingredienti, ma solo che ci siano.
Le ricette informi sono ricette che vengono usate quando non importa dove sono posizionati gli ingredienti, ma solo che ci siano.
```lua
minetest.register_craft({
@ -259,9 +240,7 @@ minetest.register_craft({
### Cottura (cooking) e carburante (fuel)
Le ricette di tipo "cottura" non vengono elaborate nella griglia di fabbricazione,
bensì nelle fornaci o in qualsivoglia altro strumento di cottura che può essere trovato
nelle mod.
Le ricette di tipo "cottura" non vengono elaborate nella griglia di fabbricazione, bensì nelle fornaci o in qualsivoglia altro strumento di cottura che può essere trovato nelle mod.
```lua
minetest.register_craft({
@ -272,17 +251,13 @@ minetest.register_craft({
})
```
L'unica vera differenza nel codice è che in questo la ricetta non è una tabella (tra parentesi graffe),
bensì un singolo oggetto.
Le ricette di cottura dispongono anche di un parametro aggiuntivo "cooktime"
che indica in secondi quanto tempo ci impiega l'oggetto a cuocersi.
L'unica vera differenza nel codice è che in questo la ricetta non è una tabella (tra parentesi graffe), bensì un singolo oggetto.
Le ricette di cottura dispongono anche di un parametro aggiuntivo "cooktime" che indica in secondi quanto tempo ci impiega l'oggetto a cuocersi.
Se non è impostato, di base è 3.
La ricetta qui sopra genera un'unità di frammenti di diamante dopo 10 secondi quando
il blocco di carbone (coalblock) è nello slot di input, con un qualche tipo di carburante sotto di esso.
La ricetta qui sopra genera un'unità di frammenti di diamante dopo 10 secondi quando il blocco di carbone (`coalblock`) è nello slot di input, con un qualche tipo di carburante sotto di esso.
Il tipo "carburante" invece funge da accompagnamento alle ricette di cottura,
in quanto definisce cosa può alimentare il fuoco.
Il tipo "carburante" invece funge da accompagnamento alle ricette di cottura, in quanto definisce cosa può alimentare il fuoco.
```lua
minetest.register_craft({
@ -292,14 +267,13 @@ minetest.register_craft({
})
```
Esso non ha un output come le altre ricette, e possiede un tempo di arsura (burntime)
che definisce in secondi per quanto alimenterà la fiamma. In questo caso, 300 secondi!
Esso non ha un output come le altre ricette, e possiede un tempo di arsura (`burntime`) che definisce in secondi per quanto alimenterà la fiamma.
In questo caso, 300 secondi!
## Gruppi
Gli oggetti possono essere membri di più gruppi, e i gruppi possono avere più membri.
Essi sono definiti usando la proprietà `groups` nella tabella di definizione,
e possiedono un valore associato.
Essi sono definiti usando la proprietà `groups` nella tabella di definizione, e possiedono un valore associato.
```lua
groups = {cracky = 3, wood = 1}
@ -307,8 +281,7 @@ groups = {cracky = 3, wood = 1}
Ci sono diverse ragioni per cui usare i gruppi.
In primis, vengono utilizzati per descrivere proprietà come friabilità e infiammabilità.
In secundis, possono essere usati in una ricetta al posto di un nome oggetto per permettere
a qualsiasi oggetto nel gruppo di essere utilizzato.
In secundis, possono essere usati in una ricetta al posto di un nome oggetto per permettere a qualsiasi oggetto nel gruppo di essere utilizzato.
```lua
minetest.register_craft({
@ -320,11 +293,9 @@ minetest.register_craft({
## Strumenti, Capacità e Friabilità
Le friabilità sono dei gruppi particolari utilizzati per definire la resistenza di un nodo
quando scavato con un determinato strumento.
Le friabilità sono dei gruppi particolari utilizzati per definire la resistenza di un nodo quando scavato con un determinato strumento.
Una friabilità elevata equivale a una maggior facilità e velocità nel romperlo.
È possibile combinarne di più tipi per permettere al nodo di essere distrutto da più tipi di strumento.
Un nodo senza friabilità non può essere distrutto da nessuno strumento.
È possibile combinarne di più tipi per permettere al nodo di essere distrutto da più tipi di strumento, mentre un nodo senza friabilità non può essere distrutto da nessuno strumento.
| Gruppo | Miglior strumento | Descrizione |
|---------|-------------------|-------------|
@ -337,15 +308,11 @@ Un nodo senza friabilità non può essere distrutto da nessuno strumento.
| oddly_breakable_by_hand | *qualsiasi* | Torce e simili — molto veloci da rompere |
Ogni strumento possiede poi delle capacità (capability).
Una capacità include una lista di friabilità supportate, e proprietà associate
per ognuna di esse come la velocità di scavata e il livello di usura.
Gli strumenti possono anche avere una durezza massima supportata per ogni tipo;
ciò serve a prevenire che strumenti più deboli possano rompere nodi meno friabili.
È poi molto comune che uno strumento includa tutte le friabilità nelle sue capacità,
con quelle meno adatte equivalenti a proprietà inefficienti.
Se l'oggetto impugnato dal giocatore non ha una capacità esplicitata,
verrà allora usata quella della mano.
Ogni strumento possiede poi delle capacità (*capability*).
Una capacità include una lista di friabilità supportate, e proprietà associate per ognuna di esse come la velocità di scavata e il livello di usura.
Gli strumenti possono anche avere una durezza massima supportata per ogni tipo; ciò serve a prevenire che strumenti più deboli possano rompere nodi meno friabili.
È poi molto comune che uno strumento includa tutte le friabilità nelle sue capacità, con quelle meno adatte equivalenti a proprietà inefficienti.
Se l'oggetto impugnato dal giocatore non ha una capacità esplicitata, verrà allora usata quella della mano.
```lua
minetest.register_tool("miamod:strumento", {
@ -365,6 +332,5 @@ minetest.register_tool("miamod:strumento", {
},
})
```
I gruppi limite (groupcaps) sono una lista delle friabilità supportate dallo strumento.
I gruppi di danno invece (damage_groups) servono a controllare come uno strumento (esterno) danneggia
quell'oggetto. Quest'ultimi verranno discussi in seguito nel capitolo Oggetti, Giocatori e Entità.
I gruppi limite (`groupcaps`) sono una lista delle friabilità supportate dallo strumento.
I gruppi di danno invece (`damage_groups`) servono a controllare come uno strumento (esterno) danneggia quell'oggetto. Quest'ultimi verranno discussi in seguito nel capitolo Oggetti, Giocatori e Entità.

View File

@ -9,7 +9,7 @@ redirect_from:
- /it/map/node_metadata.html
---
## Introduction <!-- omit in toc -->
## Introduzione <!-- omit in toc -->
In questo capitolo imparerai i vari modi per immagazzinare dati.

View File

@ -9,7 +9,7 @@ redirect_from: /it/chapters/chat_complex.html
## Introduzione <!-- omit in toc -->
Questo capitolo ti mostrerà come creare comandi complessi con ChatCmdBuilder, come `/msg <nome> <messaggio>`, `/team entra <nometeam>` or `/team esci <nometeam>`.
Questo capitolo ti mostrerà come creare comandi complessi con ChatCmdBuilder, come `/msg <nome> <messaggio>`, `/team entra <nometeam>` o `/team esci <nometeam>`.
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).

View File

@ -32,7 +32,7 @@ I privilegi non sono fatti per indicare classi o status.
* ban
* vote
* worldedit
* area_admin - admin functions of one mod is ok
* area_admin - se si tratta di un privilegio per gli amministratori è ok
**Privilegi sbagliati:**