2020-04-27 16:11:54 +03:00
---
2020-07-13 16:09:47 +03:00
title: Errori comuni
2020-04-27 16:11:54 +03:00
layout: default
root: ../..
idx: 8.1
2020-07-13 16:09:47 +03:00
redirect_from: /it/chapters/common_mistakes.html
2020-04-27 16:11:54 +03:00
---
2020-07-13 16:09:47 +03:00
## Introduzione <!-- omit in toc -->
2020-04-27 16:11:54 +03:00
2020-07-13 16:09:47 +03:00
Questo capitolo illustra gli errori più comuni e come evitarli.
2020-04-27 16:11:54 +03:00
2020-12-24 21:40:59 +03:00
- [Fai attenzione quando salvi gli ObjectRef in delle variabili (giocatori ed entità) ](#fai-attenzione-quando-salvi-gli-objectref-in-delle-variabili-giocatori-ed-entità )
2020-07-13 16:09:47 +03:00
- [Non fidarti dei campi dei formspec ](#non-fidarti-dei-campi-dei-formspec )
- [Imposta gli ItemStack dopo averli modificati ](#imposta-gli-itemstack-dopo-averli-modificati )
2020-04-27 16:11:54 +03:00
2020-12-24 21:40:59 +03:00
## Fai attenzione quando salvi gli ObjectRef in delle variabili (giocatori ed entità)
2020-04-27 16:11:54 +03:00
2020-12-24 21:40:59 +03:00
Un ObjectRef viene invalidato quando il giocatore o l'entità che esso rappresenta abbandona il gioco.
Ciò si verifica quando un giocatore si disconnette, o quando un'entità viene rimossa dalla memoria.
2020-04-27 16:11:54 +03:00
2020-12-24 21:40:59 +03:00
Da Minetest 5.2, i metodi degli ObjectRef ritorneranno sempre `nil` quando non validi.
In altre parole, ogni chiamata verrà ignorata.
2020-04-27 16:11:54 +03:00
2020-12-24 21:40:59 +03:00
Si dovrebbe evitare quanto possibile di immagazzinare gli ObjectRef in delle variabili.
Se ciò tuttavia accade, assicurati di controllare se esiste ancora, come illustrato qui di seguito:
2020-04-27 16:11:54 +03:00
```lua
2020-12-24 21:40:59 +03:00
-- questo codice funziona solo da Minetest 5.2 in poi
if obj:get_pos() then
-- è valido!
end
2020-04-27 16:11:54 +03:00
```
2020-07-13 16:09:47 +03:00
## Non fidarti dei campi dei formspec
2020-04-27 16:11:54 +03:00
2020-07-13 16:09:47 +03:00
Client malevoli possono compilare i campi nei formspec quando vogliono, con qualsiasi contenuto vogliono.
2020-04-27 16:11:54 +03:00
2020-07-13 16:09:47 +03:00
Per esempio, il seguente codice presenta una vulnerabilità che permette ai giocatori di assegnarsi da soli il privilegio di moderatore:
2020-04-27 16:11:54 +03:00
```lua
local function show_formspec(name)
if not minetest.check_player_privs(name, { privs = true }) then
return false
end
minetest.show_formspec(name, "modman:modman", [[
size[3,2]
2020-07-13 16:09:47 +03:00
field[0,0;3,1;target;Nome;]
button_exit[0,1;3,1;sub;Promuovi]
2020-04-27 16:11:54 +03:00
]])
return true
})
minetest.register_on_player_receive_fields(function(player,
formname, fields)
2020-07-13 16:09:47 +03:00
-- MALE! Manca il controllo dei privilegi!
2020-04-27 16:11:54 +03:00
local privs = minetest.get_player_privs(fields.target)
privs.kick = true
privs.ban = true
minetest.set_player_privs(fields.target, privs)
return true
end)
```
2020-07-13 16:09:47 +03:00
Aggiungi un controllo dei privilegi per ovviare:
2020-04-27 16:11:54 +03:00
```lua
minetest.register_on_player_receive_fields(function(player,
formname, fields)
if not minetest.check_player_privs(name, { privs = true }) then
return false
end
-- code
end)
```
2020-07-13 16:09:47 +03:00
## Imposta gli ItemStack dopo averli modificati
2020-04-27 16:11:54 +03:00
2020-07-13 16:09:47 +03:00
Se ci si fa caso, nella documentazione si parla di `ItemStack` e non `ItemStackRef` .
Questo perché gli ItemStack NON sono un riferimento, bensì una copia.
Questo vuol dire che modificando la copia, non si modificherà in automatico anche l'originale.
2020-04-27 16:11:54 +03:00
2020-07-13 16:09:47 +03:00
Sbagliato:
2020-04-27 16:11:54 +03:00
```lua
local inv = player:get_inventory()
2020-07-13 16:09:47 +03:00
local pila = inv:get_stack("main", 1) -- lo copio
pila:get_meta():set_string("description", "Un po' smangiucchiato")
-- MALE! Le modifiche saranno perse
2020-04-27 16:11:54 +03:00
```
2020-07-13 16:09:47 +03:00
Giusto:
2020-04-27 16:11:54 +03:00
```lua
local inv = player:get_inventory()
2020-07-13 16:09:47 +03:00
local pila = inv:get_stack("main", 1) -- lo copio
pila:get_meta():set_string("description", "Un po' smangiucchiato")
inv:set_stack("main", 1, pila)
-- Corretto! L'ItemStack è stato cambiato con la copia
2020-04-27 16:11:54 +03:00
```
2020-07-13 16:09:47 +03:00
Il comportamento dei callback è leggermente più complicato.
2020-04-27 16:11:54 +03:00
```lua
minetest.register_on_item_eat(function(hp_change, replace_with_item,
itemstack, user, pointed_thing)
2020-07-13 16:09:47 +03:00
itemstack:get_meta():set_string("description", "Un po' smangiucchiato")
-- Quasi corretto! I dati saranno persi se un altro callback annulla questa chiamata
2020-04-27 16:11:54 +03:00
end)
```
2020-07-13 16:09:47 +03:00
Se nessun callback cancella l'operazione, la pila sarà impostata e la descrizione aggiornata; ma se un callback effettivamente cancella l'operazione, l'aggiornamento potrebbe andar perduto.
2020-04-27 16:11:54 +03:00
2020-07-13 16:09:47 +03:00
È meglio quindi fare così:
2020-04-27 16:11:54 +03:00
```lua
minetest.register_on_item_eat(function(hp_change, replace_with_item,
itemstack, user, pointed_thing)
2020-07-13 16:09:47 +03:00
itemstack:get_meta():set_string("description", "Un po' smangiucchiato")
2020-04-27 16:11:54 +03:00
user:get_inventory():set_stack("main", user:get_wield_index(),
itemstack)
2020-07-13 16:09:47 +03:00
-- Corretto! La descrizione verrà sempre aggiornata
2020-04-27 16:11:54 +03:00
end)
```