From 6167bd2340d410d711b1eee61ffc9a5e3b474134 Mon Sep 17 00:00:00 2001 From: Maddy Miller Date: Mon, 17 Feb 2025 14:31:48 +0100 Subject: [PATCH 1/2] Add a //registry command to search registries (#2584) * Add a //registry command to search registries * Fix missing arg annotation for registry command * Remove RegistryType since it's not needed * Fix this up to actually work * Allow viewing the entire registry with no search param --------- Co-authored-by: Octavia Togami (cherry picked from commit 5311195efbe778b11f8f16b6462ccc476be7cfb5) --- .../worldedit/bukkit/WorldEditPlugin.java | 9 ++ .../main/java/com/sk89q/util/StringUtil.java | 52 ++++++++++++ .../worldedit/command/GeneralCommands.java | 84 +++++++++++++++++++ .../command/argument/RegistryConverter.java | 7 +- .../registry/NamespacedRegistry.java | 13 +++ .../sk89q/worldedit/registry/Registries.java | 62 ++++++++++++++ .../sk89q/worldedit/registry/Registry.java | 51 ++++++++++- .../worldedit/world/biome/BiomeCategory.java | 2 +- .../worldedit/world/biome/BiomeType.java | 9 +- .../worldedit/world/block/BlockCategory.java | 2 +- .../worldedit/world/block/BlockType.java | 2 +- .../worldedit/world/entity/EntityType.java | 2 +- .../worldedit/world/fluid/FluidCategory.java | 2 +- .../worldedit/world/fluid/FluidType.java | 2 +- .../worldedit/world/gamemode/GameMode.java | 2 +- .../generation/ConfiguredFeatureType.java | 2 +- .../world/generation/StructureType.java | 2 +- .../worldedit/world/item/ItemCategory.java | 2 +- .../sk89q/worldedit/world/item/ItemType.java | 2 +- .../worldedit/world/weather/WeatherType.java | 2 +- .../src/main/resources/lang/strings.json | 5 +- 21 files changed, 298 insertions(+), 18 deletions(-) create mode 100644 worldedit-core/src/main/java/com/sk89q/worldedit/registry/Registries.java diff --git a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/WorldEditPlugin.java b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/WorldEditPlugin.java index 14b5d019b4..feab5ea186 100644 --- a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/WorldEditPlugin.java +++ b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/WorldEditPlugin.java @@ -49,6 +49,8 @@ import com.sk89q.worldedit.internal.anvil.ChunkDeleter; import com.sk89q.worldedit.internal.command.CommandUtil; import com.sk89q.worldedit.internal.util.LogManagerCompat; +import com.sk89q.worldedit.registry.Registries; +import com.sk89q.worldedit.registry.state.Property; import com.sk89q.worldedit.util.lifecycle.Lifecycled; import com.sk89q.worldedit.util.lifecycle.SimpleLifecycled; import com.sk89q.worldedit.world.World; @@ -359,9 +361,16 @@ private void initializeRegistries() { adapter.initializeRegistries(); } + // Registries only available via NMS + BukkitImplAdapter adapter = getBukkitImplAdapter(); + if (adapter != null) { + adapter.initializeRegistries(); + } + // ... :| GameModes.get(""); WeatherTypes.get(""); + Registries.get(""); } private void setupTags() { diff --git a/worldedit-core/src/main/java/com/sk89q/util/StringUtil.java b/worldedit-core/src/main/java/com/sk89q/util/StringUtil.java index 7c50cd9cb8..5fbd0ebfc4 100644 --- a/worldedit-core/src/main/java/com/sk89q/util/StringUtil.java +++ b/worldedit-core/src/main/java/com/sk89q/util/StringUtil.java @@ -337,6 +337,58 @@ public static List parseListInQuotes( return parsableBlocks; } + public static List parseListInQuotes(String[] input, char delimiter, char[] quoteOpen, char[] quoteClose, boolean appendLeftover) { + List parsableBlocks = new ArrayList<>(); + StringBuilder buffer = new StringBuilder(); + int quotes = quoteOpen.length; + if (quotes != quoteClose.length) { + throw new Error("Mismatched quoteOpen and quoteClose lengths"); + } + for (String split : input) { + boolean quoteHandled = false; + for (int i = 0; i < quotes; i++) { + if (split.indexOf(quoteOpen[i]) != -1 && split.indexOf(quoteClose[i]) == -1) { + buffer.append(split).append(delimiter); + quoteHandled = true; + break; + } else if (split.indexOf(quoteClose[i]) != -1 && split.indexOf(quoteOpen[i]) == -1) { + buffer.append(split); + parsableBlocks.add(buffer.toString()); + buffer = new StringBuilder(); + quoteHandled = true; + break; + } + } + if (!quoteHandled) { + if (buffer.length() == 0) { + parsableBlocks.add(split); + } else { + buffer.append(split).append(delimiter); + } + } + } + if (appendLeftover && buffer.length() != 0) { + parsableBlocks.add(buffer.delete(buffer.length() - 1, buffer.length()).toString()); + } + + return parsableBlocks; + } + + /** + * Converts a glob pattern to a regex pattern, supporting * and ?. + * + *

+ * Note: this assumes that the text has been pre-validated or quoted, to not contain any regex special characters. + *

+ * + * @param glob The glob pattern + * @return The regex pattern + */ + public static Pattern convertGlobToRegex(String glob) { + return Pattern.compile("^" + glob + .replace("*", ".*") + .replace("?", ".") + "$"); + } //FAWE start /** diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/GeneralCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/GeneralCommands.java index 865e6f937b..7e7a22de3c 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/GeneralCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/GeneralCommands.java @@ -29,6 +29,7 @@ import com.fastasyncworldedit.core.util.StringMan; import com.fastasyncworldedit.core.util.TextureUtil; import com.google.common.collect.ImmutableList; +import com.sk89q.util.StringUtil; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.LocalConfiguration; import com.sk89q.worldedit.LocalSession; @@ -49,6 +50,11 @@ import com.sk89q.worldedit.internal.command.CommandRegistrationHandler; import com.sk89q.worldedit.internal.command.CommandUtil; import com.sk89q.worldedit.internal.cui.ServerCUIHandler; +import com.sk89q.worldedit.math.BlockVector3; +import com.sk89q.worldedit.registry.Keyed; +import com.sk89q.worldedit.registry.Registry; +import com.sk89q.worldedit.session.Placement; +import com.sk89q.worldedit.session.PlacementType; import com.sk89q.worldedit.util.SideEffect; import com.sk89q.worldedit.util.SideEffectSet; import com.sk89q.worldedit.util.auth.AuthorizationException; @@ -57,7 +63,12 @@ import com.sk89q.worldedit.util.formatting.text.Component; import com.sk89q.worldedit.util.formatting.text.TextComponent; import com.sk89q.worldedit.util.formatting.text.TranslatableComponent; +import com.sk89q.worldedit.util.formatting.text.event.ClickEvent; +import com.sk89q.worldedit.util.formatting.text.event.HoverEvent; +import com.sk89q.worldedit.util.formatting.text.format.TextColor; import com.sk89q.worldedit.world.World; +import com.sk89q.worldedit.world.biome.BiomeType; +import com.sk89q.worldedit.world.block.BlockType; import com.sk89q.worldedit.world.item.ItemType; import org.enginehub.piston.CommandManager; import org.enginehub.piston.CommandManagerService; @@ -76,6 +87,7 @@ import java.util.Set; import java.util.TreeMap; import java.util.concurrent.Callable; +import java.util.regex.Pattern; import java.util.stream.Collectors; import static com.google.common.base.Preconditions.checkNotNull; @@ -658,4 +670,76 @@ public Component call() throws Exception { } //FAWE end + + private static final Pattern ALLOWED_KEY_CHARACTERS = Pattern.compile("[a-z0-9_:?*/]+"); + + @Command( + name = "/registry", + desc = "Search through the given registry" + ) + @CommandPermissions("worldedit.registry") + public void registry(Actor actor, + @Arg(desc = "The registry to search through") + Registry registry, + @ArgFlag(name = 'p', desc = "Page of results to return", def = "1") + int page, + @Arg(desc = "Search query", variable = true, def = "*") + List queryBits) { + String query = String.join("_", queryBits); + + if (!ALLOWED_KEY_CHARACTERS.matcher(query).matches()) { + actor.printError(TranslatableComponent.of("worldedit.registry.error.invalid-key")); + } + + WorldEditAsyncCommandBuilder.createAndSendMessage(actor, new RegistrySearcher(registry, query, page), + TranslatableComponent.of("worldedit.registry.searching", TextComponent.of(query))); + } + + private static class RegistrySearcher implements Callable { + private final Registry registry; + private final String search; + private final int page; + private final Pattern matcher; + + RegistrySearcher(Registry registry, String search, int page) { + this.registry = registry; + this.search = search; + this.page = page; + + String matcherQuery = search; + if (!matcherQuery.contains("*") && !matcherQuery.contains("?")) { + // If there are no wildcards, add them around the query + matcherQuery = "*" + matcherQuery + "*"; + } + + this.matcher = StringUtil.convertGlobToRegex(matcherQuery); + } + + @Override + public Component call() throws Exception { + String command = "//registry " + registry.id() + " -p %page% " + search; + Map results = new TreeMap<>(); + for (Keyed searchType : registry) { + final String id = searchType.id(); + if (matcher.matcher(id).matches()) { + var builder = TextComponent.builder() + .append(searchType.id()) + .clickEvent(ClickEvent.copyToClipboard(searchType.id())); + switch (searchType) { + case ItemType itemType -> builder.hoverEvent(HoverEvent.showText(itemType.getRichName())); + case BlockType blockType -> builder.hoverEvent(HoverEvent.showText(blockType.getRichName())); + case BiomeType biomeType -> builder.hoverEvent(HoverEvent.showText(biomeType.getRichName())); + default -> { + } + } + results.put(id, builder.build()); + } + } + List list = new ArrayList<>(results.values()); + boolean isBlank = search.isBlank() || search.equals("*"); + String title = isBlank ? "Registry contents" : "Search results for '" + search + "'"; + return PaginationBox.fromComponents(title, command, list) + .create(page); + } + } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/argument/RegistryConverter.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/argument/RegistryConverter.java index 2c4107a386..371e3db93d 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/argument/RegistryConverter.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/argument/RegistryConverter.java @@ -20,6 +20,7 @@ package com.sk89q.worldedit.command.argument; import com.google.common.collect.ImmutableList; +import com.google.common.reflect.TypeToken; import com.sk89q.worldedit.command.util.SuggestionHelper; import com.sk89q.worldedit.registry.Keyed; import com.sk89q.worldedit.registry.Registry; @@ -49,7 +50,6 @@ import java.lang.reflect.Field; import java.util.List; import java.util.Locale; -import java.util.stream.Collectors; public final class RegistryConverter implements ArgumentConverter { @@ -75,6 +75,9 @@ public static void register(CommandManager commandManager) { .forEach(registryType -> commandManager.registerConverter(Key.of(registryType), from(registryType)) ); + + // This must be separate as it has a generic type + commandManager.registerConverter(Key.of(new TypeToken<>() {}), new RegistryConverter<>(Registry.REGISTRY)); } @SuppressWarnings("unchecked") @@ -114,7 +117,7 @@ public ConversionResult convert(String argument, InjectedValueAccess injected @Override public List getSuggestions(String input, InjectedValueAccess context) { - return SuggestionHelper.getRegistrySuggestions(registry, input).collect(Collectors.toList()); + return SuggestionHelper.getRegistrySuggestions(registry, input).toList(); } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/registry/NamespacedRegistry.java b/worldedit-core/src/main/java/com/sk89q/worldedit/registry/NamespacedRegistry.java index e6715907c3..5954154365 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/registry/NamespacedRegistry.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/registry/NamespacedRegistry.java @@ -43,23 +43,36 @@ public final class NamespacedRegistry extends Registry { private int lastInternalId = 0; //FAWE end + @Deprecated public NamespacedRegistry(final String name) { this(name, MINECRAFT_NAMESPACE); } + @Deprecated public NamespacedRegistry(final String name, final boolean checkInitialized) { this(name, MINECRAFT_NAMESPACE, checkInitialized); } + @Deprecated public NamespacedRegistry(final String name, final String defaultNamespace) { this(name, defaultNamespace, false); } + @Deprecated public NamespacedRegistry(final String name, final String defaultNamespace, final boolean checkInitialized) { super(name, checkInitialized); this.defaultNamespace = defaultNamespace; } + public NamespacedRegistry(final String name, final String id, final String defaultNamespace) { + this(name, id, defaultNamespace, false); + } + + public NamespacedRegistry(final String name, final String id, final String defaultNamespace, final boolean checkInitialized) { + super(name, id, checkInitialized); + this.defaultNamespace = defaultNamespace; + } + @Nullable @Override public V get(final String key) { diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/registry/Registries.java b/worldedit-core/src/main/java/com/sk89q/worldedit/registry/Registries.java new file mode 100644 index 0000000000..7e3321e5fe --- /dev/null +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/registry/Registries.java @@ -0,0 +1,62 @@ +/* + * WorldEdit, a Minecraft world manipulation toolkit + * Copyright (C) sk89q + * Copyright (C) WorldEdit team and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.sk89q.worldedit.registry; + +import com.sk89q.worldedit.world.biome.BiomeCategory; +import com.sk89q.worldedit.world.biome.BiomeType; +import com.sk89q.worldedit.world.block.BlockCategory; +import com.sk89q.worldedit.world.block.BlockType; +import com.sk89q.worldedit.world.entity.EntityType; +import com.sk89q.worldedit.world.fluid.FluidCategory; +import com.sk89q.worldedit.world.fluid.FluidType; +import com.sk89q.worldedit.world.gamemode.GameMode; +import com.sk89q.worldedit.world.generation.ConfiguredFeatureType; +import com.sk89q.worldedit.world.generation.StructureType; +import com.sk89q.worldedit.world.item.ItemCategory; +import com.sk89q.worldedit.world.item.ItemType; +import com.sk89q.worldedit.world.weather.WeatherType; + +import javax.annotation.Nullable; + +public class Registries { + public static final Registry BLOCK_TYPE = addRegistry(BlockType.REGISTRY); + public static final Registry BLOCK_CATEGORY = addRegistry(BlockCategory.REGISTRY); + public static final Registry ITEM_TYPE = addRegistry(ItemType.REGISTRY); + public static final Registry ITEM_CATEGORY = addRegistry(ItemCategory.REGISTRY); + public static final Registry GAME_MODE = addRegistry(GameMode.REGISTRY); + public static final Registry WEATHER_TYPE = addRegistry(WeatherType.REGISTRY); + public static final Registry BIOME_TYPE = addRegistry(BiomeType.REGISTRY); + public static final Registry BIOME_CATEGORY = addRegistry(BiomeCategory.REGISTRY); + public static final Registry ENTITY_TYPE = addRegistry(EntityType.REGISTRY); + public static final Registry FLUID_TYPE = addRegistry(FluidType.REGISTRY); + public static final Registry FLUID_CATEGORY = addRegistry(FluidCategory.REGISTRY); + public static final Registry CONFIGURED_FEATURE_TYPE = addRegistry(ConfiguredFeatureType.REGISTRY); + public static final Registry STRUCTURE_TYPE = addRegistry(StructureType.REGISTRY); + + private static Registry addRegistry(Registry registry) { + Registry.REGISTRY.register(registry.id(), registry); + return registry; + } + + @Nullable + public static Registry get(final String id) { + return Registry.REGISTRY.get(id); + } +} diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/registry/Registry.java b/worldedit-core/src/main/java/com/sk89q/worldedit/registry/Registry.java index b29af49e8a..f3d0c958c8 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/registry/Registry.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/registry/Registry.java @@ -33,18 +33,60 @@ import static com.google.common.base.Preconditions.checkState; import static java.util.Objects.requireNonNull; -public class Registry implements Iterable { - +public class Registry implements Iterable, Keyed { + public static final Registry> REGISTRY = new Registry<>("registry", "registry"); private final Map map = new HashMap<>(); private final String name; + private final String id; private final boolean checkInitialized; + private static String nameToId(String name) { + return name.toLowerCase(Locale.ROOT).replace(' ', '_'); + } + + /** + * Creates a new Registry. + * + * @param name The name of the registry + * @deprecated Use {@link #Registry(String, String)} instead to provide an ID + */ + @Deprecated public Registry(final String name) { this(name, false); } + /** + * Creates a new Registry. + * + * @param name The name of the registry + * @param checkInitialized Whether to check if WorldEdit is initialized + * @deprecated Use {@link #Registry(String, String, boolean)} instead to provide an ID + */ + @Deprecated public Registry(final String name, final boolean checkInitialized) { + this(name, nameToId(name), checkInitialized); + } + + /** + * Creates a new Registry. + * + * @param name The name of the registry + * @param id The ID of the registry + */ + public Registry(final String name, final String id) { + this(name, id, false); + } + + /** + * Creates a new Registry. + * + * @param name The name of the registry + * @param id The ID of the registry + * @param checkInitialized Whether to check if WorldEdit is initialized + */ + public Registry(final String name, final String id, final boolean checkInitialized) { this.name = name; + this.id = id; this.checkInitialized = checkInitialized; } @@ -52,6 +94,11 @@ public String getName() { return name; } + @Override + public String id() { + return this.id; + } + //FAWE start public Map getMap() { return map; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/biome/BiomeCategory.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/biome/BiomeCategory.java index a51a868237..725ebcad7b 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/biome/BiomeCategory.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/biome/BiomeCategory.java @@ -31,7 +31,7 @@ */ public class BiomeCategory extends Category implements Keyed { - public static final NamespacedRegistry REGISTRY = new NamespacedRegistry<>("biome tag", true); + public static final NamespacedRegistry REGISTRY = new NamespacedRegistry<>("biome tag", "biome_tag", "minecraft", true); public BiomeCategory(final String id) { super(id); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/biome/BiomeType.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/biome/BiomeType.java index d49289093b..e187f57fbe 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/biome/BiomeType.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/biome/BiomeType.java @@ -20,10 +20,13 @@ package com.sk89q.worldedit.world.biome; import com.fastasyncworldedit.core.registry.RegistryItem; +import com.sk89q.worldedit.WorldEdit; +import com.sk89q.worldedit.extension.platform.Capability; import com.sk89q.worldedit.function.pattern.BiomePattern; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.registry.Keyed; import com.sk89q.worldedit.registry.NamespacedRegistry; +import com.sk89q.worldedit.util.formatting.text.Component; /** * All the types of biomes in the game. @@ -32,7 +35,7 @@ public class BiomeType implements RegistryItem, Keyed, BiomePattern { //FAWE end - public static final NamespacedRegistry REGISTRY = new NamespacedRegistry<>("biome type", true); + public static final NamespacedRegistry REGISTRY = new NamespacedRegistry<>("biome type", "biome_type", "minecraft", true); //FAWE start private final String id; @@ -105,4 +108,8 @@ public BiomeType applyBiome(BlockVector3 position) { return this; } + public Component getRichName() { + return WorldEdit.getInstance().getPlatformManager().queryCapability(Capability.GAME_HOOKS) + .getRegistries().getBiomeRegistry().getRichName(this); + } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockCategory.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockCategory.java index 29d8ee53bc..8e809a8ec9 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockCategory.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockCategory.java @@ -36,7 +36,7 @@ public class BlockCategory extends Category implements Keyed { //FAWE start private boolean[] flatMap; //FAWE end - public static final NamespacedRegistry REGISTRY = new NamespacedRegistry<>("block tag", true); + public static final NamespacedRegistry REGISTRY = new NamespacedRegistry<>("block tag", "block_tag", "minecraft", true); public BlockCategory(final String id) { super(id); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockType.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockType.java index 4592c7ce2c..bb5af10e03 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockType.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockType.java @@ -56,7 +56,7 @@ public class BlockType implements Keyed, Pattern { //FAWE end - public static final NamespacedRegistry REGISTRY = new NamespacedRegistry<>("block type", true); + public static final NamespacedRegistry REGISTRY = new NamespacedRegistry<>("block type", "block_type", "minecraft", true); private static final Logger LOGGER = LogManagerCompat.getLogger(); private final String id; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/entity/EntityType.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/entity/EntityType.java index aba23b6361..75f2023ed5 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/entity/EntityType.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/entity/EntityType.java @@ -27,7 +27,7 @@ public class EntityType implements RegistryItem, Keyed { //FAWE end - public static final NamespacedRegistry REGISTRY = new NamespacedRegistry<>("entity type", true); + public static final NamespacedRegistry REGISTRY = new NamespacedRegistry<>("entity type", "entity_type", "minecraft", true); //FAWE start private final String id; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/fluid/FluidCategory.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/fluid/FluidCategory.java index 775ec58a68..7bcb24717b 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/fluid/FluidCategory.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/fluid/FluidCategory.java @@ -32,7 +32,7 @@ */ public class FluidCategory extends Category implements Keyed { - public static final NamespacedRegistry REGISTRY = new NamespacedRegistry<>("fluid tag"); + public static final NamespacedRegistry REGISTRY = new NamespacedRegistry<>("fluid tag", "fluid_tag", "minecraft"); public FluidCategory(final String id) { super(id); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/fluid/FluidType.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/fluid/FluidType.java index 1aca4c25f7..5be794849d 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/fluid/FluidType.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/fluid/FluidType.java @@ -30,7 +30,7 @@ public class FluidType implements RegistryItem, Keyed { //FAWE end - public static final NamespacedRegistry REGISTRY = new NamespacedRegistry<>("fluid type"); + public static final NamespacedRegistry REGISTRY = new NamespacedRegistry<>("fluid type", "fluid_type", "minecraft"); //FAWE start private final String id; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/gamemode/GameMode.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/gamemode/GameMode.java index 94b7b7cfe6..075820cc7d 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/gamemode/GameMode.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/gamemode/GameMode.java @@ -24,7 +24,7 @@ public record GameMode(String id) implements Keyed { - public static final Registry REGISTRY = new Registry<>("game mode"); + public static final Registry REGISTRY = new Registry<>("game mode", "game_mode"); /** * Gets the name of this game mode, or the ID if the name cannot be found. diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/generation/ConfiguredFeatureType.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/generation/ConfiguredFeatureType.java index 378fe484d7..f99aa951b1 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/generation/ConfiguredFeatureType.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/generation/ConfiguredFeatureType.java @@ -31,7 +31,7 @@ public record ConfiguredFeatureType(String id, boolean place_on_face) implements Keyed { //FAWE end - public static final NamespacedRegistry REGISTRY = new NamespacedRegistry<>("configured feature type"); + public static final NamespacedRegistry REGISTRY = new NamespacedRegistry<>("configured feature type", "configured_feature_type", "minecraft"); //FAWE start - place on face public ConfiguredFeatureType(String id) { diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/generation/StructureType.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/generation/StructureType.java index 06fef05f8d..3f42847992 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/generation/StructureType.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/generation/StructureType.java @@ -26,7 +26,7 @@ public record StructureType(String id) implements Keyed { - public static final NamespacedRegistry REGISTRY = new NamespacedRegistry<>("structure type"); + public static final NamespacedRegistry REGISTRY = new NamespacedRegistry<>("structure type", "structure_type", "minecraft"); @Override public String toString() { diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/item/ItemCategory.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/item/ItemCategory.java index 28811bc0f3..d9a5058846 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/item/ItemCategory.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/item/ItemCategory.java @@ -34,7 +34,7 @@ */ public class ItemCategory extends Category implements Keyed { - public static final NamespacedRegistry REGISTRY = new NamespacedRegistry<>("item tag"); + public static final NamespacedRegistry REGISTRY = new NamespacedRegistry<>("item tag", "item_tag", "minecraft"); public ItemCategory(final String id) { super(id); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/item/ItemType.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/item/ItemType.java index e7a72b3c91..69d10ec492 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/item/ItemType.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/item/ItemType.java @@ -39,7 +39,7 @@ public class ItemType implements RegistryItem, Keyed { //FAWE end - public static final NamespacedRegistry REGISTRY = new NamespacedRegistry<>("item type", true); + public static final NamespacedRegistry REGISTRY = new NamespacedRegistry<>("item type", "item_type", "minecraft", true); private final String id; @SuppressWarnings({"deprecation", "this-escape"}) diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/weather/WeatherType.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/weather/WeatherType.java index 4a7b3cd0c9..05f3ff0846 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/weather/WeatherType.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/weather/WeatherType.java @@ -23,7 +23,7 @@ import com.sk89q.worldedit.registry.Registry; public record WeatherType(String id) implements Keyed { - public static final Registry REGISTRY = new Registry<>("weather type"); + public static final Registry REGISTRY = new Registry<>("weather type", "weather_type"); /** * Gets the name of this weather, or the ID if the name cannot be found. diff --git a/worldedit-core/src/main/resources/lang/strings.json b/worldedit-core/src/main/resources/lang/strings.json index ad1e014a9b..d032936520 100644 --- a/worldedit-core/src/main/resources/lang/strings.json +++ b/worldedit-core/src/main/resources/lang/strings.json @@ -559,7 +559,10 @@ "worldedit.pastebin.uploading": "(Please wait... sending output to paste service...)", "worldedit.session.cant-find-session": "Unable to find session for {0}", "worldedit.platform.no-file-dialog": "File dialogs are not supported in your environment.", - "worldedit.tool.max-block-changes": "Max blocks change limit reached.", + "worldedit.registry.error.invalid-key": "Invalid registry key: {0}", + "worldedit.registry.searching": "(Please wait... searching registry...)", + + "worldedit.tool.max-block-changes": "Max blocks change limit reached.", "worldedit.tool.no-block": "No block in sight!", "worldedit.tool.repl.equip": "Block replacer tool bound to {0}.", "worldedit.tool.repl.switched": "Replacer tool switched to: {0}", From 2df5812f485953d36d5f92af95ab6e59f57d4cf5 Mon Sep 17 00:00:00 2001 From: SirYwell Date: Wed, 13 May 2026 19:48:53 +0200 Subject: [PATCH 2/2] Fix bad merges --- .../java/com/sk89q/worldedit/bukkit/WorldEditPlugin.java | 7 ------- .../src/main/java/com/sk89q/util/StringUtil.java | 1 + worldedit-core/src/main/resources/lang/strings.json | 5 ++--- 3 files changed, 3 insertions(+), 10 deletions(-) diff --git a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/WorldEditPlugin.java b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/WorldEditPlugin.java index feab5ea186..cfdf36ad95 100644 --- a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/WorldEditPlugin.java +++ b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/WorldEditPlugin.java @@ -50,7 +50,6 @@ import com.sk89q.worldedit.internal.command.CommandUtil; import com.sk89q.worldedit.internal.util.LogManagerCompat; import com.sk89q.worldedit.registry.Registries; -import com.sk89q.worldedit.registry.state.Property; import com.sk89q.worldedit.util.lifecycle.Lifecycled; import com.sk89q.worldedit.util.lifecycle.SimpleLifecycled; import com.sk89q.worldedit.world.World; @@ -361,12 +360,6 @@ private void initializeRegistries() { adapter.initializeRegistries(); } - // Registries only available via NMS - BukkitImplAdapter adapter = getBukkitImplAdapter(); - if (adapter != null) { - adapter.initializeRegistries(); - } - // ... :| GameModes.get(""); WeatherTypes.get(""); diff --git a/worldedit-core/src/main/java/com/sk89q/util/StringUtil.java b/worldedit-core/src/main/java/com/sk89q/util/StringUtil.java index 5fbd0ebfc4..1a30098f42 100644 --- a/worldedit-core/src/main/java/com/sk89q/util/StringUtil.java +++ b/worldedit-core/src/main/java/com/sk89q/util/StringUtil.java @@ -25,6 +25,7 @@ import java.util.List; import java.util.Locale; import java.util.Map; +import java.util.regex.Pattern; /** * String utilities. diff --git a/worldedit-core/src/main/resources/lang/strings.json b/worldedit-core/src/main/resources/lang/strings.json index d032936520..0eccfff93b 100644 --- a/worldedit-core/src/main/resources/lang/strings.json +++ b/worldedit-core/src/main/resources/lang/strings.json @@ -560,9 +560,8 @@ "worldedit.session.cant-find-session": "Unable to find session for {0}", "worldedit.platform.no-file-dialog": "File dialogs are not supported in your environment.", "worldedit.registry.error.invalid-key": "Invalid registry key: {0}", - "worldedit.registry.searching": "(Please wait... searching registry...)", - - "worldedit.tool.max-block-changes": "Max blocks change limit reached.", + "worldedit.registry.searching": "(Please wait... searching registry...)", + "worldedit.tool.max-block-changes": "Max blocks change limit reached.", "worldedit.tool.no-block": "No block in sight!", "worldedit.tool.repl.equip": "Block replacer tool bound to {0}.", "worldedit.tool.repl.switched": "Replacer tool switched to: {0}",