diff --git a/output/production/commander-bta.main/net/pedroricardo/commander/content/exceptions/CommanderExceptions.class b/output/production/commander-bta.main/net/pedroricardo/commander/content/exceptions/CommanderExceptions.class index ce0c9bc..174d336 100644 Binary files a/output/production/commander-bta.main/net/pedroricardo/commander/content/exceptions/CommanderExceptions.class and b/output/production/commander-bta.main/net/pedroricardo/commander/content/exceptions/CommanderExceptions.class differ diff --git a/output/production/commander-bta.main/net/pedroricardo/commander/content/helpers/ArgumentParser.class b/output/production/commander-bta.main/net/pedroricardo/commander/content/helpers/ArgumentParser.class index 6648a57..851064b 100644 Binary files a/output/production/commander-bta.main/net/pedroricardo/commander/content/helpers/ArgumentParser.class and b/output/production/commander-bta.main/net/pedroricardo/commander/content/helpers/ArgumentParser.class differ diff --git a/output/production/commander-bta.main/net/pedroricardo/commander/content/helpers/EntitySelectorOptions$Option.class b/output/production/commander-bta.main/net/pedroricardo/commander/content/helpers/EntitySelectorOptions$Option.class index cb14b64..b7cf553 100644 Binary files a/output/production/commander-bta.main/net/pedroricardo/commander/content/helpers/EntitySelectorOptions$Option.class and b/output/production/commander-bta.main/net/pedroricardo/commander/content/helpers/EntitySelectorOptions$Option.class differ diff --git a/output/production/commander-bta.main/net/pedroricardo/commander/content/helpers/EntitySelectorOptions.class b/output/production/commander-bta.main/net/pedroricardo/commander/content/helpers/EntitySelectorOptions.class index 15a957e..a9ae1a8 100644 Binary files a/output/production/commander-bta.main/net/pedroricardo/commander/content/helpers/EntitySelectorOptions.class and b/output/production/commander-bta.main/net/pedroricardo/commander/content/helpers/EntitySelectorOptions.class differ diff --git a/src/main/java/net/pedroricardo/commander/content/helpers/ArgumentParser.java b/src/main/java/net/pedroricardo/commander/content/helpers/ArgumentParser.java index a2261a6..5bd9689 100644 --- a/src/main/java/net/pedroricardo/commander/content/helpers/ArgumentParser.java +++ b/src/main/java/net/pedroricardo/commander/content/helpers/ArgumentParser.java @@ -70,23 +70,8 @@ protected CompletableFuture suggestOpenTag(SuggestionsBuilder sugge return suggestionsBuilder.buildFuture(); } - protected CompletableFuture suggestOpenMetadata(SuggestionsBuilder suggestionsBuilder, Consumer consumer) { - if (!this.reader.canRead()) suggestionsBuilder.suggest(String.valueOf('[')); - return suggestionsBuilder.buildFuture(); - } - private CompletableFuture suggestCloseMetadata(SuggestionsBuilder suggestionsBuilder, Consumer consumer) { if (!this.reader.canRead()) suggestionsBuilder.suggest(String.valueOf(']')); return suggestionsBuilder.buildFuture(); } - - private CompletableFuture suggestCloseTag(SuggestionsBuilder suggestionsBuilder, Consumer consumer) { - if (!this.reader.canRead()) suggestionsBuilder.suggest(String.valueOf('}')); - return suggestionsBuilder.buildFuture(); - } - - private CompletableFuture suggestTagSeparator(SuggestionsBuilder suggestionsBuilder, Consumer consumer) { - if (!this.reader.canRead()) suggestionsBuilder.suggest(String.valueOf(':')); - return suggestionsBuilder.buildFuture(); - } } diff --git a/src/main/java/net/pedroricardo/commander/content/helpers/EntitySelectorOptions.java b/src/main/java/net/pedroricardo/commander/content/helpers/EntitySelectorOptions.java index 22b0270..e501034 100644 --- a/src/main/java/net/pedroricardo/commander/content/helpers/EntitySelectorOptions.java +++ b/src/main/java/net/pedroricardo/commander/content/helpers/EntitySelectorOptions.java @@ -5,6 +5,8 @@ import com.mojang.brigadier.exceptions.DynamicCommandExceptionType; import com.mojang.brigadier.exceptions.SimpleCommandExceptionType; import com.mojang.brigadier.suggestion.SuggestionsBuilder; +import com.mojang.nbt.CompoundTag; +import com.mojang.nbt.Tag; import net.minecraft.client.lang.text.ChainText; import net.minecraft.client.lang.text.Text; import net.minecraft.core.entity.Entity; @@ -16,6 +18,7 @@ import net.minecraft.core.player.gamemode.Gamemode; import net.minecraft.core.util.helper.LogPrintStream; import net.pedroricardo.commander.CommanderHelper; +import net.pedroricardo.commander.NbtHelper; import java.util.*; import java.util.function.BiConsumer; @@ -224,6 +227,26 @@ public static void register(String key, Modifier modifier, Predicate !parser.hasGamemodeEquals(), ChainText.text().trans("argument_types.commander.entity.selector.options.gamemode.description")); + register("nbt", (parser) -> { + boolean invert = parser.shouldInvertValue(); + CompoundTag nbt = NbtHelper.parseNbt(parser.getReader()); + parser.addPredicate((entity) -> { + if (nbt.getValue().isEmpty()) return !invert; + CompoundTag entityNbt = new CompoundTag(); + entity.addAdditionalSaveData(entityNbt); + for (Map.Entry> entry : nbt.getValue().entrySet()) { + if (!entityNbt.getValue().containsKey(entry.getKey()) || (entityNbt.getValue().get(entry.getKey()) != entry.getValue() && !entityNbt.getValue().get(entry.getKey()).equals(entry.getValue()) && !entityNbt.getValue().get(entry.getKey()).getValue().equals(entry.getValue().getValue()))) { + if (!invert) return false; + } + } + return true; + }); + if (invert) { + parser.setHasNotNbt(true); + } else { + parser.setHasNbt(true); + } + }, parser -> !parser.hasNbt(), ChainText.text().trans("argument_types.commander.entity.selector.options.nbt.description")); } public static Modifier get(EntitySelectorParser entitySelectorParser, String string, int i) throws CommandSyntaxException { diff --git a/src/main/java/net/pedroricardo/commander/content/helpers/EntitySelectorParser.java b/src/main/java/net/pedroricardo/commander/content/helpers/EntitySelectorParser.java index a21ac4b..c60a120 100644 --- a/src/main/java/net/pedroricardo/commander/content/helpers/EntitySelectorParser.java +++ b/src/main/java/net/pedroricardo/commander/content/helpers/EntitySelectorParser.java @@ -298,6 +298,8 @@ public BiFunction, CompletableF private boolean hasType = false; private boolean hasNameEquals = false; private boolean hasNameNotEquals = false; + private boolean hasNbt = false; + private boolean hasNotNbt = false; public boolean hasGamemodeEquals() { return this.hasGamemodeEquals; @@ -387,6 +389,22 @@ public void setCurrentEntity(boolean currentEntity) { this.currentEntity = currentEntity; } + public boolean hasNbt() { + return this.hasNbt; + } + + public void setHasNbt(boolean bl) { + this.hasNbt = bl; + } + + public boolean hasNotNbt() { + return this.hasNotNbt; + } + + public void setHasNotNbt(boolean bl) { + this.hasNotNbt = bl; + } + public void setX(double x) { this.x = x; } diff --git a/src/main/resources/lang/commander/en_US.lang b/src/main/resources/lang/commander/en_US.lang index bc4b816..befdc10 100644 --- a/src/main/resources/lang/commander/en_US.lang +++ b/src/main/resources/lang/commander/en_US.lang @@ -23,6 +23,7 @@ argument_types.commander.entity.selector.options.unterminated=Expected end of op argument_types.commander.entity.selector.options.valueless=Expected value for option '%s' argument_types.commander.entity.selector.options.gamemode.invalid=Invalid or unknown game mode '%s' argument_types.commander.entity.selector.options.gamemode.description=Players with game mode +argument_types.commander.entity.selector.options.nbt.description=Entities with NBT argument_types.commander.entity.selector.options.sort.description=Sort the entities argument_types.commander.entity.selector.options.sort.invalid=Invalid or unknown sort type '%s' argument_types.commander.entity.selector.options.limit.description=Maximum number of entities to return