2020-04-27 16:11:54 +03:00
---
2020-06-18 22:37:44 +03:00
title: Timer dei nodi e ABM
2020-04-27 16:11:54 +03:00
layout: default
root: ../..
idx: 3.2
2020-06-18 22:37:44 +03:00
description: Impara come creare ABM e timer per modificare i blocchi.
2020-04-27 16:11:54 +03:00
redirect_from:
2020-06-18 22:37:44 +03:00
- /it/chapters/abms.html
- /it/map/abms.html
2020-04-27 16:11:54 +03:00
---
2020-06-18 22:37:44 +03:00
## Introduzione <!-- omit in toc -->
2020-04-27 16:11:54 +03:00
2020-06-18 22:37:44 +03:00
Eseguire periodicamente una funzione su certi nodi è abbastanza comune.
Minetest fornisce due metodi per fare ciò: gli ABM (*Active Block Modifiers*, Modificatori di blocchi attivi) e i timer associati ai nodi.
2020-04-27 16:11:54 +03:00
2020-06-18 22:37:44 +03:00
Gli ABM scansionano tutti i Blocchi Mappa alla ricerca dei nodi che rientrano nei canoni:
essi sono quindi ottimali per quei nodi che si trovano con frequenza in giro per il mondo, come l'erba.
2020-07-02 15:34:49 +03:00
Possiedono un alto consumo della CPU, senza invece pressoché impattare sulla memoria e lo spazio d'archiviazione.
2020-04-27 16:11:54 +03:00
2020-06-18 22:37:44 +03:00
Per i nodi invece non troppo comuni o che già usano metadati, come le fornaci e i macchinari, dovrebbero venire impiegati i timer.
I timer dei nodi tengon traccia dei timer accodati in ogni Blocco Mappa, eseguendoli quando raggiungono lo zero.
2020-07-02 15:34:49 +03:00
Ciò significa che non hanno bisogno di cercare tra tutti i nodi caricati per trovare un match, bensì, richiedendo un po' più di memoria e spazio d'archiviazione, vanno alla ricerca dei soli nodi con un timer in corso.
2020-04-27 16:11:54 +03:00
2020-06-18 22:37:44 +03:00
- [Timer dei nodi ](#timer-dei-nodi )
- [ABM: modificatori di blocchi attivi ](#abm-modificatori-di-blocchi-attivi )
- [Il tuo turno ](#il-tuo-turno )
2020-04-27 16:11:54 +03:00
2020-06-18 22:37:44 +03:00
## Timer dei nodi
2020-04-27 16:11:54 +03:00
2020-06-18 22:37:44 +03:00
A ogni nodo è associato un timer.
Questi timer possono essere gestiti ottenendo un oggetto NodeTimerRef (quindi un riferimento, come già visto per gli inventari).
2020-04-27 16:11:54 +03:00
```lua
2024-10-23 02:39:22 +03:00
local timer = core.get_node_timer(pos)
2020-06-18 22:37:44 +03:00
timer:start(10.5) -- in secondi
2020-04-27 16:11:54 +03:00
```
2020-06-18 22:37:44 +03:00
Quando un timer raggiunge lo zero, viene eseguito il metodo `on_timer` , che va dichiarato dentro la tabella di definizione del nodo.
`on_timer` richiede un solo parametro, ovvero la posizione del nodo.
2020-04-27 16:11:54 +03:00
```lua
2024-10-23 02:39:22 +03:00
core.register_node("porteautomatiche:porta_aperta", {
2020-04-27 16:11:54 +03:00
on_timer = function(pos)
2024-10-23 02:39:22 +03:00
core.set_node(pos, { name = "porteautomatiche:porta_chiusa" })
2020-04-27 16:11:54 +03:00
return false
end
})
```
2021-01-28 03:13:08 +03:00
Ritornando `true` , il timer ripartirà (con la stessa durata di prima).
È inoltre possibile usare `get_node_timer(pos)` all'interno di `on_timer` , basta assicurarsi di ritornare `false` per evitare conflitti.
2020-04-27 16:11:54 +03:00
2020-06-18 22:37:44 +03:00
Potresti aver tuttavia notato una limitazione: per questioni di ottimizzazione, infatti, è possibile avere uno e un solo timer per tipo di nodo, e solo un timer attivo per nodo.
2020-04-27 16:11:54 +03:00
2020-06-18 22:37:44 +03:00
## ABM: modificatori di blocchi attivi
2020-04-27 16:11:54 +03:00
2020-06-18 22:37:44 +03:00
Erba aliena, a scopo illustrativo del capitolo, è un tipo d'erba che ha una probabilità di apparire vicino all'acqua.
2020-04-27 16:11:54 +03:00
```lua
2024-10-23 02:39:22 +03:00
core.register_node("alieni:erba", {
2020-06-18 22:37:44 +03:00
description = "Erba Aliena",
light_source = 3, -- Il nodo irradia luce. Min 0, max 14
tiles = {"alieni_erba.png"},
2020-04-27 16:11:54 +03:00
groups = {choppy=1},
2024-10-23 02:39:22 +03:00
on_use = core.item_eat(20)
2020-04-27 16:11:54 +03:00
})
2024-10-23 02:39:22 +03:00
core.register_abm({
2020-06-18 22:37:44 +03:00
nodenames = {"default:dirt_with_grass"}, -- nodo sul quale applicare l'ABM
neighbors = {"default:water_source", "default:water_flowing"}, -- nodi che devono essere nei suoi dintorni (almeno uno)
interval = 10.0, -- viene eseguito ogni 10 secondi
chance = 50, -- possibilità di partire su un nodo ogni 50
2020-04-27 16:11:54 +03:00
action = function(pos, node, active_object_count,
active_object_count_wider)
local pos = {x = pos.x, y = pos.y + 1, z = pos.z}
2024-10-23 02:39:22 +03:00
core.set_node(pos, {name = "alieni:erba"})
2020-04-27 16:11:54 +03:00
end
})
```
2020-06-18 22:37:44 +03:00
Questo ABM viene eseguito ogni 10 secondi, e per ogni nodo d'erba (`default:default_with_grass`) c'è una possibilità su 50 che l'ABM parta.
Quando ciò accade, un nodo di erba aliena (`alieni:erba`) gli viene piazzato sopra (attenzione, tuttavia, che così facendo, il nodo che c'era prima verrà cancellato, quindi sarebbe meglio controllare prima che sopra ci sia dell'aria)
2020-04-27 16:11:54 +03:00
2020-06-18 22:37:44 +03:00
Specificare dei vicini (*neighbors*) è opzionale.
Se ne vengono specificati più di uno, basterà che uno solo di essi sia presente per soddisfare la condizione.
2020-04-27 16:11:54 +03:00
2020-06-18 22:37:44 +03:00
Anche le possibilità (*chance*) sono opzionali.
Se non vengono specificate, l'ABM verrà sempre eseguito quando le altre condizioni sono soddisfatte.
2020-04-27 16:11:54 +03:00
2020-06-18 22:37:44 +03:00
## Il tuo turno
2020-04-27 16:11:54 +03:00
2020-06-18 22:37:44 +03:00
* Tocco di Mida: tramuta l'acqua in oro con una possibilità di 1 su 100, ogni 5 secondi;
* Decadimento: fai che il legno diventi terra quando questo confina con dell'acqua.
* Al fuoco!: fai prendere fuoco a ogni blocco d'aria (suggerimento: "air" e "fire:basic_flame"). Avvertenza: aspettati un crash del gioco