Come posso testare un tag NBT inesistente?

Aug 24 2020

Ho tre abitanti del villaggio, che potrebbero o non potrebbero avere un nome personalizzato.

Il nome personalizzato è controllato dal CustomNametag NBT.

Per gli abitanti del villaggio con un nome personalizzato, il loro CustomNametag ha questo aspetto:

{CustomName:'{"text":"Chad Ferguson"}'}

Per gli abitanti del villaggio senza un nome personalizzato, il CustomNametag è inesistente.

Ecco un codice per verificare se un abitante del villaggio ha un certo nome (usando l' nbtargomento):

/execute if entity @e[type=villager,nbt={CustomName:'{"text":"Chad Ferguson"}'}] run tellraw @a {"text":"Chad is here!"}

Ora vorrei testare un'entità con un CustomNametag inesistente , qualcosa del genere:

/execute if entity @e[type=villager,nbt={CustomName:''}] run tellraw @a {"text":"An unknown villager is near"}

Ora, questo comando non funzionerà, perché una stringa vuota esistente è diversa dal tag non esistente .

L' !argomento non funzionerà, per questo motivo:

execute
  if entity @e[type=villager,nbt=!{CustomName:''}]    # If there is an entity that does not have an empty custom name...
run tellraw @a {"text":"An unknown villager is near"} # then say a message.

Questo comando verrà eseguito se il tag è inesistente o se il tag ha qualcosa di diverso da una stringa vuota ''.

Come posso testare entità con un tag NBT inesistente? Sono in MCJE 1.16.2.

Risposte

6 ExpertCoder14 Aug 24 2020 at 08:12

Usa questo comando:

execute
  as @e[type=villager]           # Tell all the villagers to run the following:
  store success score @s nbtTest # Store the success/failure of the final command to run here in a scoreboard.
run data get @s CustomName       # Get my custom name.

In questo modo tutti gli abitanti del villaggio eseguiranno il /datacomando per ottenere il loro nome personalizzato.

Ed è qui che avviene la magia: il comando passa se il tag esiste e fallisce se non lo è. E poiché stiamo memorizzando il successo / fallimento nel tabellone, possiamo semplicemente guardare: qualsiasi entità con valore 0 del tabellone ha un CustomNametag inesistente !