5 votos

¿Por qué es una mala práctica comprobar los nombres de los artículos?

He oído que las pruebas de los nombres de los artículos y lores en Minecraft JE es una mala práctica. Por ejemplo, los siguientes comandos no son buenos:

execute if entity @e[nbt={Inventory:[{tag:{display:{Name:'[{"text":"Test Thing"}]'}}}]}]
clear @p minecraft:diamond{display:{Name:'{"text":"Shiny…"}'}} 0
clear @p minecraft:netherite_sword{display:{Lore:['{"text":"A Mysterious Sword"}']}} 0

¿Por qué estos comandos se consideran una mala práctica? ¿Son propensos a fallar y pueden no funcionar? ¿Y qué puedo hacer para solucionarlos?

Tenga en cuenta que esto sólo se aplica a la lectura de los nombres de los elementos, no a su establecimiento. Lo siguiente no se considera una mala práctica y, de hecho, son las únicas formas de realizar estas tareas:

give @p minecraft:diamond{display:{Name:'{"text":"Shiny…"}'}}
replaceitem @p weapon.mainhand minecraft:netherite_sword{display:{Lore:['{"text":"A Mysterious Sword"}']}}

9voto

herdivet Puntos 21

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

JugonesTop.com

Jugonestop es una comunidad para amantes del gaming. Puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X