2022-08-05 18:12:27 +03:00
---
2023-04-20 00:32:53 +03:00
title: Richiami dei nodi e degli oggetti
2022-08-05 18:12:27 +03:00
layout: default
root: ../..
idx: 2.15
2023-04-20 00:32:53 +03:00
description: Scopri i richiami, le azioni e gli eventi, come on_use, on_punch, on_place e on_rightclick
2022-08-05 18:12:27 +03:00
---
## Introduction <!-- omit in toc -->
2023-04-20 00:28:13 +03:00
Minetest usa una struttura di moddaggio estensivamente incentrata sui richiami. Un richiamo è una funzione che si dà a un'API e che viene chiamata quando l'evento registrato si verifica.
Per esempio, puoi aggiungere una funzione `on_punch` nella definizione di un nodo, che verrà chiamata quando questo viene colpito.
Ci sono poi anche dei richiami globali, come `minetest.register_on_punchnode` , che in questo caso verrà invocato al colpire qualsiasi nodo.
2022-08-05 18:12:27 +03:00
2023-04-20 00:28:13 +03:00
- [Richiami degli oggetti ](#richiami-degli-oggetti )
2022-08-05 18:12:27 +03:00
- [on_use ](#on_use )
2023-04-20 00:28:13 +03:00
- [on_place e on_secondary_use ](#on_place-e-on_secondary_use )
2022-08-05 18:12:27 +03:00
- [on_drop ](#on_drop )
- [after_use ](#after_use )
2023-04-20 00:28:13 +03:00
- [item_place contro place_item ](#item_place-contro-place_item )
- [Richiami dei nodi ](#richiami-dei-nodi )
- [Tasto destro e nodi piazzati ](#tasto-destro-e-nodi-piazzati )
- [Colpire e scavare ](#colpire-e-scavare )
- [...e altro! ](#e-altro )
2022-08-05 18:12:27 +03:00
2023-04-20 00:28:13 +03:00
## Richiami degli oggetti
2022-08-05 18:12:27 +03:00
2023-04-20 00:28:13 +03:00
Quando un giocatore ha un nodo, un oggetto fabbricabile o uno strumento nel proprio inventario, questi potrebbero innescare degli eventi:
2022-08-05 18:12:27 +03:00
2023-04-20 00:28:13 +03:00
| Richiamo | Assegnazione base | Valore base |
2022-08-05 18:12:27 +03:00
|------------------|---------------------------|----------------------------------------------|
2023-04-20 00:28:13 +03:00
| on_use | clic sinistro | nil |
| on_place | clic destro su un nodo | `minetest.item_place` |
| on_secondary_use | clic destro a vuoto | `minetest.item_secondary_use` (non fa nulla) |
2022-08-05 18:12:27 +03:00
| on_drop | Q | `minetest.item_drop` |
2023-04-20 00:28:13 +03:00
| after_use | allo scavare un nodo | nil |
2022-08-05 18:12:27 +03:00
### on_use
2023-04-20 00:28:13 +03:00
Sovrascrivere l'uso dell'oggetto impedisce che quest'ultimo possa essere usato per scavare nodi.
Un impiego comune di questo richiamo lo si trova nel cibo:
2022-08-05 18:12:27 +03:00
```lua
2023-04-20 00:28:13 +03:00
minetest.register_craftitem("miamod:fangotorta", {
description = "Torta aliena di fango",
inventory_image = "miamod_fangotorta.png",
2022-08-05 18:12:27 +03:00
on_use = minetest.item_eat(20),
})
```
2023-04-20 00:28:13 +03:00
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, e quest'ultimi non devono per forza essere interi - bensì anche decimali.
2022-08-05 18:12:27 +03:00
2023-04-20 00:28:13 +03:00
`minetest.item_eat()` è una funzione che ritorna un'altra funzione, in questo caso quindi impostandola come richiamo di on_use.
Ciò significa che il codice in alto è alquanto simile al seguente:
2022-08-05 18:12:27 +03:00
```lua
2023-04-20 00:28:13 +03:00
minetest.register_craftitem("miamod:fangotorta", {
description = "Torta aliena di fango",
inventory_image = "miamod_fangotorta.png",
2022-08-05 18:12:27 +03:00
on_use = function(...)
return minetest.do_item_eat(20, nil, ...)
end,
})
```
2023-04-20 00:28:13 +03:00
Capendo come funziona item_eat, è possibile modificarlo per operazioni più complesse
come per esempio riprodurre un suono personalizzato.
2022-08-05 18:12:27 +03:00
2023-04-20 00:28:13 +03:00
### on_place e on_secondary_use
2022-08-05 18:12:27 +03:00
2023-04-20 00:28:13 +03:00
La differenza tra `on_place` e `on_secondary_use` consiste nel fatto che `on_place` viene chiamato quando il giocatore sta puntando un nodo, mentre `on_secondary_use` quando non ne punta uno.
2022-08-05 18:12:27 +03:00
2023-04-20 00:28:13 +03:00
Entrambi i richiami sono invocati per tutti i tipi di oggetti.
`on_place` risponde alla funzione `minetest.item_place` , la quale o gestisce la chiamata a `on_rightclick` del nodo puntato, o piazza l'oggetto in mano se questo è un nodo.
2022-08-05 18:12:27 +03:00
### on_drop
2023-04-20 00:28:13 +03:00
`on_drop` viene chiamato quando il giocatore fa richiesta per buttare un oggetto, per esempio usando il tasto apposito (Q) o trascinando l'oggetto fuori dall'inventario.
Risponde alla funzione `minetest.item_drop` , la quale gestisce il buttare l'oggetto.
2022-08-05 18:12:27 +03:00
### after_use
2023-04-20 00:28:13 +03:00
`after_use` viene chiamato quando si scava un nodo, e permette di personalizzare come viene applicata l'usura a uno strumento.
Se `after_use` non esiste, è come se ci fosse scritto:
2022-08-05 18:12:27 +03:00
```lua
after_use = function(itemstack, user, node, digparams)
itemstack:add_wear(digparams.wear)
return itemstack
end
```
2023-04-20 00:28:13 +03:00
## item_place contro place_item
2022-08-05 18:12:27 +03:00
2023-04-20 00:28:13 +03:00
L'API di Minetest include varie implementazioni già pronte di richiami.
Queste seguono la nomenclatura "tipodioggetto_azione", per esempio `minetest.item_place` e `minetest.node_dig` .
Alcune sono usate direttamente, mentre altre sono funzioni che ritornano il richiamo vero e proprio:
2022-08-05 18:12:27 +03:00
```lua
2023-04-20 00:28:13 +03:00
minetest.register_item("miamod:esempio", {
2022-08-05 18:12:27 +03:00
on_place = minetest.item_place,
on_use = minetest.item_eat(10),
})
```
2023-04-20 00:28:13 +03:00
Inoltre, l'API di Minetest include funzioni già pronte che _fanno_ qualcosa.
Queste sono spesso chiamate con nomi che rischiano di farle confondere con le implementazioni dei richiami, tuttavia hanno un verbo all'inizio (per esempio `minetest.place_item` e `minetest.dig_node` , che permettono rispettivamente di scavare e piazzare nodi come se lo stesse facendo un giocatore).
2022-08-05 18:12:27 +03:00
2023-04-20 00:28:13 +03:00
## Richiami dei nodi
2022-08-05 18:12:27 +03:00
2023-04-20 00:28:13 +03:00
Quando un nodo si trova in un inventario, vengono invocati i richiami degli oggetti discussi poc'anzi.
Al contrario, quando un nodo è situato nel mondo, vengono invocati i richiami dei nodi.
Ce ne sono di svariati tipi, troppi per essere discussi in questo libro, tuttavia alcuni di questi verranno trattati nei capitoli successivi.
2022-08-05 18:12:27 +03:00
2023-04-20 00:28:13 +03:00
Molti richiami dei nodi sono collegati alle operazioni effettuate - appunto - sui nodi, come piazzarli e rimuoverli dal mondo.
È importante però sottolineare che, per motivi di prestazioni, operazioni come queste non vengono chiamate da modifiche in blocco (quelle che cambiano un grande numero di nodi in un colpo solo).
È meglio quindi non fare affidamento su un'esecuzione sicura al 100%.
2022-08-05 18:12:27 +03:00
2023-04-20 00:28:13 +03:00
### Tasto destro e nodi piazzati
2022-08-05 18:12:27 +03:00
2023-04-20 00:28:13 +03:00
Quando un utente preme col tasto destro un nodo mentre ha un oggetto in mano, viene invocato il richiamo `on_place` dell'oggetto.
Di base, questo è impostato a `minetest.item_place` .
Se il nodo puntato ha un richiamo `on_rightclick` e il tasto accovacciati (shift) è tenuto premuto, allora verrà chiamato `on_rightclick` .
Diversamente, `minetest.item_place` piazzerà il nodo.
2022-08-05 18:12:27 +03:00
2023-04-20 00:28:13 +03:00
Piazzare un nodo invocherà simultaneamente `on_construct` e `after_place_node` : il primo è chiamato da ogni evento che cambia i singoli nodi (quindi non in blocco) e ritorna la posizione e il valore del nodo.
`after_place_node` viene invece chiamato solamente al piazzare un nodo, contenendo di conseguenza più informazioni - come chi l'ha piazzato e l'ItemStack.
2022-08-05 18:12:27 +03:00
2023-04-20 00:28:13 +03:00
È importante notare che i giocatori non sono le uniche realtà che possono piazzare nodi; anche le entità e le mod possono farlo.
Per via di ciò, `place` potrebbe essere un giocatore, ma anche un'entità o `nil` .
2022-08-05 18:12:27 +03:00
```lua
2023-04-20 00:28:13 +03:00
minetest.register_node("miamod:mionodo", {
2022-08-05 18:12:27 +03:00
on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)
if clicker:is_player() then
2023-04-20 00:28:13 +03:00
minetest.chat_send_player(clicker:get_player_name(), "Ciao mondo!")
2022-08-05 18:12:27 +03:00
end
end,
on_construct = function(pos, node)
local meta = minetest.get_meta(pos)
2023-04-20 00:28:13 +03:00
meta:set_string("infotext", "Il mio nodo!")
2022-08-05 18:12:27 +03:00
end,
after_place_node = function(pos, placer, itemstack, pointed_thing)
2023-04-20 00:28:13 +03:00
-- controlla chi sta piazzando
2022-08-05 18:12:27 +03:00
if placer and placer:is_player() then
local meta = minetest.get_meta(pos)
2023-04-20 00:28:13 +03:00
meta:set_string("proprietario", placer:get_player_name())
2022-08-05 18:12:27 +03:00
end
end,
})
```
2023-04-20 00:28:13 +03:00
### Colpire e scavare
2022-08-05 18:12:27 +03:00
2023-04-20 00:28:13 +03:00
Si ha un colpo quando un giocatore preme col tasto sinistro per un breve periodo.
Se l'oggetto in mano possiede un richiamo `on_use` , questo verrà chiamato.
Diversamente, verrà chiamato il richiamo `on_punch` sul nodo selezionato.
2022-08-05 18:12:27 +03:00
2023-04-20 00:28:13 +03:00
Quando il giocatore tenta di scavare un nodo, viene eseguito il richiamo `on_dig` del nodo.
Di base, ciò equivale a `minetest.node_dig` , che controlla eventuali protezioni dell'area, usura l'oggetto, rimuove il nodo, e ne esegue il richiamo `after_dig_node` .
2022-08-05 18:12:27 +03:00
```lua
2023-04-20 00:28:13 +03:00
minetest.register_node("miamod:mionodo", {
2022-08-05 18:12:27 +03:00
on_punch = function(pos, node, puncher, pointed_thing)
if puncher:is_player() then
2023-04-20 00:28:13 +03:00
minetest.chat_send_player(puncher:get_player_name(), "Ahia!")
2022-08-05 18:12:27 +03:00
end
end,
})
```
2023-04-20 00:28:13 +03:00
### ...e altro!
2022-08-05 18:12:27 +03:00
2023-04-20 00:28:13 +03:00
Dài un occhio alla API Lua di Minetest per una lista di tutti i richiami, e per avere più informazioni riguardo quelli vista qui sopra.