La razón por la que comprobar el nombre de un elemento es una mala práctica se debe a la forma en que el procesador NBT comprueba las cadenas.
Recuerde que en NBT, el Name
y otros son simplemente cadenas NBT que contienen JSON en su interior:
{
display: {
Name: '[{"text":"Test"}]'
}
}
Cuando se hace la prueba del Name
está haciendo una comprobación de texto plano en la etiqueta fuente JSON en bruto del elemento, no en la salida renderizada. Esto significa que, aunque dos nombres de elementos diferentes pueden se ven igual cuando se renderizan, pueden haber sido creados con fuentes JSON ligeramente diferentes y, por lo tanto, se considerarán no coincidentes.
Por ejemplo, {"text":"test"}
y [{"text":"test"}]
. Son iguales, pero se consideran diferentes al procesador NBT debido a los corchetes adicionales.
Otro ejemplo, {"text":"test","bold":true}
y {"bold":true,"text":"test"}
. Son iguales, pero se consideran diferentes por el orden de los componentes.
Otro ejemplo, {"text": "test"}
y {"text":"test"}
. ¿Son iguales? Son diferentes porque hay un espacio después del :
en la primera. ¡Cada personaje cuenta! ¡Un percance de un solo personaje lo hará diferente!
Incluso si tratas de asegurarte de que todo tu JSON es consistente, sigue siendo poco fiable, porque Minecraft tiene la desagradable costumbre de convertir tus textos JSON en un formato que considera estándar. Y no hemos sido capaces de identificar lo que desencadena este comportamiento. Es por eso que las pruebas de los textos JSON como el nombre y las cosas son tan poco fiables y deben nunca se utilice.
En lugar de comprobar un nombre de artículo, utilice una etiqueta de artículo personalizada. A diferencia de lo que ocurre en otros lugares, la etiqueta tag
de los artículos permite las etiquetas NBT personalizadas que el juego no utiliza por defecto. Así que cambiar el comando para obtener este elemento en algo como:
give @p minecraft:diamond{display:{Name:'{"text":"Shiny…"}'},showoffDiamond:1b}
replaceitem @p weapon.mainhand minecraft:netherite_sword{display:{Lore:['{"text":"A Mysterious Sword"}']},mysterySword:1b}
y hacer la prueba en su lugar:
execute if entity @e[nbt={Inventory:[{tag:{testItem:1b}}]}]
clear @p minecraft:diamond{showoffDiamond:1b} 0
clear @p minecraft:netherite_sword{mysterySword:1b} 0