From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Date: Sun, 22 Aug 2021 15:21:57 -0700 Subject: [PATCH] Fix entity type tags suggestions in selectors This would really be better as a client fix because just to fix it all EntityArguments have been told to ask the server for completions when if this was fixed on the client, that wouldn't be needed. Mojira Issue: https://bugs.mojang.com/browse/MC-235045 diff --git a/src/main/java/com/destroystokyo/paper/PaperConfig.java b/src/main/java/com/destroystokyo/paper/PaperConfig.java index 2e0191e5cfe8e29fb0a6c4fc6a2a570d4b8ae449..b616ac9f9832c3ba2a2b9a56698b9db941d54462 100644 --- a/src/main/java/com/destroystokyo/paper/PaperConfig.java +++ b/src/main/java/com/destroystokyo/paper/PaperConfig.java @@ -524,4 +524,9 @@ public class PaperConfig { itemValidationBookAuthorLength = getInt("settings.item-validation.book.author", itemValidationBookAuthorLength); itemValidationBookPageLength = getInt("settings.item-validation.book.page", itemValidationBookPageLength); } + + public static boolean fixTargetSelectorTagCompletion = true; + private static void fixTargetSelectorTagCompletion() { + fixTargetSelectorTagCompletion = getBoolean("settings.fix-target-selector-tag-completion", fixTargetSelectorTagCompletion); + } } diff --git a/src/main/java/net/minecraft/commands/Commands.java b/src/main/java/net/minecraft/commands/Commands.java index a6f10d47bc4e2cadcc3e06cffa011ed7fb97c68d..efbe103ca9e36ecbc7761215901e25756eb972ad 100644 --- a/src/main/java/net/minecraft/commands/Commands.java +++ b/src/main/java/net/minecraft/commands/Commands.java @@ -438,6 +438,11 @@ public class Commands { } public static RequiredArgumentBuilder argument(String name, ArgumentType type) { + // Paper start + if (com.destroystokyo.paper.PaperConfig.fixTargetSelectorTagCompletion && type.getClass() == net.minecraft.commands.arguments.EntityArgument.class) { + return RequiredArgumentBuilder.argument(name, type).suggests(type::listSuggestions); + } + // Paper end return RequiredArgumentBuilder.argument(name, type); } diff --git a/src/main/java/net/minecraft/commands/arguments/selector/options/EntitySelectorOptions.java b/src/main/java/net/minecraft/commands/arguments/selector/options/EntitySelectorOptions.java index 3a351e36cfd674357363bf17b07b18233d0e39d2..415980ad008e76ca210e2e2b603948de5dca2653 100644 --- a/src/main/java/net/minecraft/commands/arguments/selector/options/EntitySelectorOptions.java +++ b/src/main/java/net/minecraft/commands/arguments/selector/options/EntitySelectorOptions.java @@ -69,6 +69,19 @@ public class EntitySelectorOptions { public static final DynamicCommandExceptionType ERROR_ENTITY_TYPE_INVALID = new DynamicCommandExceptionType((object) -> { return new TranslatableComponent("argument.entity.options.type.invalid", object); }); + // Paper start + public static final DynamicCommandExceptionType ERROR_ENTITY_TAG_INVALID = new DynamicCommandExceptionType((object) -> { + return io.papermc.paper.adventure.PaperAdventure + .asVanilla(net.kyori.adventure.text.Component + .text("Invalid or unknown entity type tag '" + object + "'") + .hoverEvent(net.kyori.adventure.text.event.HoverEvent + .showText(net.kyori.adventure.text.Component + .text("You can disable this error in 'paper.yml'") + ) + ) + ); + }); + // Paper end private static void register(String id, EntitySelectorOptions.Modifier handler, Predicate condition, Component description) { OPTIONS.put(id, new EntitySelectorOptions.Option(handler, condition, description)); @@ -316,8 +329,20 @@ public class EntitySelectorOptions { if (entitySelectorParser.isTag()) { ResourceLocation resourceLocation = ResourceLocation.read(entitySelectorParser.getReader()); + // Paper start - throw error if invalid entity tag + net.minecraft.tags.Tag> tag; + if (com.destroystokyo.paper.PaperConfig.fixTargetSelectorTagCompletion) { + tag = EntityTypeTags.getAllTags().getTag(resourceLocation); + } else { + tag = EntityTypeTags.getAllTags().getTagOrEmpty(resourceLocation); + } + if (tag == null) { + entitySelectorParser.getReader().setCursor(i); + throw ERROR_ENTITY_TAG_INVALID.createWithContext(entitySelectorParser.getReader(), resourceLocation.toString()); + } + // Paper end entitySelectorParser.addPredicate((entity) -> { - return entity.getType().is(entity.getServer().getTags().getOrEmpty(Registry.ENTITY_TYPE_REGISTRY).getTagOrEmpty(resourceLocation)) != bl; + return entity.getType().is(tag) != bl; // Paper }); } else { ResourceLocation resourceLocation2 = ResourceLocation.read(entitySelectorParser.getReader());