From 26ecc2877b322a693410ef671b364b4e0770dc95 Mon Sep 17 00:00:00 2001 From: Jason Penilla <11360596+jpenilla@users.noreply.github.com> Date: Thu, 1 Aug 2024 19:09:10 -0700 Subject: [PATCH] Add helper for registering adventure argument types on NeoForge --- .../neoforge/AdventureArgumentTypes.java | 52 +++++++++++++++++++ .../impl/AdventureNeoforgeCommon.java | 27 +++++++++- .../tester/neoforge/AdventureNeoTester.java | 26 ++-------- 3 files changed, 80 insertions(+), 25 deletions(-) create mode 100644 neoforge/src/main/java/net/kyori/adventure/platform/neoforge/AdventureArgumentTypes.java diff --git a/neoforge/src/main/java/net/kyori/adventure/platform/neoforge/AdventureArgumentTypes.java b/neoforge/src/main/java/net/kyori/adventure/platform/neoforge/AdventureArgumentTypes.java new file mode 100644 index 00000000..bca61264 --- /dev/null +++ b/neoforge/src/main/java/net/kyori/adventure/platform/neoforge/AdventureArgumentTypes.java @@ -0,0 +1,52 @@ +/* + * This file is part of adventure-platform-mod, licensed under the MIT License. + * + * Copyright (c) 2024 KyoriPowered + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package net.kyori.adventure.platform.neoforge; + +import net.kyori.adventure.platform.neoforge.impl.AdventureNeoforgeCommon; + +/** + * Helper for registering {@link net.kyori.adventure.platform.modcommon.ComponentArgumentType} and + * {@link net.kyori.adventure.platform.modcommon.KeyArgumentType}. + */ +public final class AdventureArgumentTypes { + private AdventureArgumentTypes() { + } + + private static boolean registered = false; + + /** + * Registers the Adventure {@link com.mojang.brigadier.arguments.ArgumentType}s. + * + *

This is not done by default as it requires the client to also register the types.

+ */ + public static synchronized void register() { + if (registered) { + return; + } + + registered = true; + + AdventureNeoforgeCommon.registerArgumentTypes(); + } +} diff --git a/neoforge/src/main/java/net/kyori/adventure/platform/neoforge/impl/AdventureNeoforgeCommon.java b/neoforge/src/main/java/net/kyori/adventure/platform/neoforge/impl/AdventureNeoforgeCommon.java index 99bda312..224578cf 100644 --- a/neoforge/src/main/java/net/kyori/adventure/platform/neoforge/impl/AdventureNeoforgeCommon.java +++ b/neoforge/src/main/java/net/kyori/adventure/platform/neoforge/impl/AdventureNeoforgeCommon.java @@ -29,8 +29,11 @@ import java.util.Objects; import java.util.concurrent.ExecutionException; import net.kyori.adventure.permission.PermissionChecker; +import net.kyori.adventure.platform.modcommon.ComponentArgumentType; +import net.kyori.adventure.platform.modcommon.KeyArgumentType; import net.kyori.adventure.platform.modcommon.impl.AdventureCommon; import net.kyori.adventure.platform.modcommon.impl.ClickCallbackRegistry; +import net.kyori.adventure.platform.modcommon.impl.ComponentArgumentTypeSerializer; import net.kyori.adventure.platform.modcommon.impl.LocaleHolderBridge; import net.kyori.adventure.platform.modcommon.impl.PlatformHooks; import net.kyori.adventure.platform.modcommon.impl.SidedProxy; @@ -45,13 +48,19 @@ import net.kyori.adventure.pointer.Pointered; import net.kyori.adventure.pointer.Pointers; import net.kyori.adventure.util.TriState; +import net.minecraft.commands.synchronization.ArgumentTypeInfo; +import net.minecraft.commands.synchronization.ArgumentTypeInfos; +import net.minecraft.commands.synchronization.SingletonArgumentInfo; +import net.minecraft.core.registries.Registries; import net.minecraft.server.level.ServerPlayer; import net.neoforged.api.distmarker.Dist; +import net.neoforged.bus.api.IEventBus; import net.neoforged.fml.common.Mod; import net.neoforged.fml.loading.FMLLoader; import net.neoforged.neoforge.common.NeoForge; import net.neoforged.neoforge.event.RegisterCommandsEvent; import net.neoforged.neoforge.event.entity.player.ClientInformationUpdatedEvent; +import net.neoforged.neoforge.registries.DeferredRegister; import net.neoforged.neoforge.server.permission.PermissionAPI; import net.neoforged.neoforge.server.permission.nodes.PermissionNode; import net.neoforged.neoforge.server.permission.nodes.PermissionTypes; @@ -59,8 +68,9 @@ @Mod("adventure_platform_neoforge") @SuppressWarnings("checkstyle:HideUtilityClassConstructor") // Not a utility class, this is our main mod class. -public class AdventureNeoforgeCommon { +public final class AdventureNeoforgeCommon { public static SidedProxy SIDE_PROXY; + private static final DeferredRegister> COMMAND_ARGUMENT_TYPES = DeferredRegister.create(Registries.COMMAND_ARGUMENT_TYPE, "adventure"); static { if (FMLLoader.getDist() == Dist.DEDICATED_SERVER) { @@ -83,7 +93,20 @@ public class AdventureNeoforgeCommon { PlainTextComponentSerializerProviderImpl.DELEGATE = new net.kyori.adventure.platform.modcommon.impl.service.PlainTextComponentSerializerProviderImpl(); } - public AdventureNeoforgeCommon() { + public static void registerArgumentTypes() { + COMMAND_ARGUMENT_TYPES.register("component", () -> ArgumentTypeInfos.registerByClass( + ComponentArgumentType.class, + ComponentArgumentTypeSerializer.INSTANCE + )); + COMMAND_ARGUMENT_TYPES.register("key", () -> ArgumentTypeInfos.registerByClass( + KeyArgumentType.class, + SingletonArgumentInfo.contextFree(KeyArgumentType::key) + )); + } + + public AdventureNeoforgeCommon(final IEventBus bus) { + COMMAND_ARGUMENT_TYPES.register(bus); + NeoForge.EVENT_BUS.addListener((ClientInformationUpdatedEvent e) -> { if (!Objects.equals(e.getOldInformation().language(), e.getUpdatedInformation().language())) { AdventureCommon.HOOKS.onLocaleChange(e.getEntity(), LocaleHolderBridge.toLocale(e.getUpdatedInformation().language())); diff --git a/neoforge/tester/src/main/java/net/kyori/adventure/platform/tester/neoforge/AdventureNeoTester.java b/neoforge/tester/src/main/java/net/kyori/adventure/platform/tester/neoforge/AdventureNeoTester.java index 33477f66..5c69fe14 100644 --- a/neoforge/tester/src/main/java/net/kyori/adventure/platform/tester/neoforge/AdventureNeoTester.java +++ b/neoforge/tester/src/main/java/net/kyori/adventure/platform/tester/neoforge/AdventureNeoTester.java @@ -48,11 +48,9 @@ import net.kyori.adventure.inventory.Book; import net.kyori.adventure.key.Key; import net.kyori.adventure.platform.modcommon.AdventureCommandSourceStack; -import net.kyori.adventure.platform.modcommon.ComponentArgumentType; -import net.kyori.adventure.platform.modcommon.KeyArgumentType; import net.kyori.adventure.platform.modcommon.MinecraftAudiences; import net.kyori.adventure.platform.modcommon.MinecraftServerAudiences; -import net.kyori.adventure.platform.modcommon.impl.ComponentArgumentTypeSerializer; +import net.kyori.adventure.platform.neoforge.AdventureArgumentTypes; import net.kyori.adventure.pointer.Pointered; import net.kyori.adventure.sound.Sound; import net.kyori.adventure.text.Component; @@ -67,24 +65,17 @@ import net.kyori.adventure.translation.GlobalTranslator; import net.kyori.adventure.translation.TranslationRegistry; import net.minecraft.commands.arguments.EntityArgument; -import net.minecraft.commands.synchronization.ArgumentTypeInfo; -import net.minecraft.commands.synchronization.ArgumentTypeInfos; -import net.minecraft.commands.synchronization.SingletonArgumentInfo; import net.minecraft.commands.synchronization.SuggestionProviders; -import net.minecraft.core.Holder; -import net.minecraft.core.registries.Registries; import net.minecraft.network.chat.ComponentUtils; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.Entity; -import net.neoforged.bus.api.IEventBus; import net.neoforged.fml.common.Mod; import net.neoforged.neoforge.common.NeoForge; import net.neoforged.neoforge.event.RegisterCommandsEvent; import net.neoforged.neoforge.event.server.ServerStartingEvent; import net.neoforged.neoforge.event.server.ServerStoppedEvent; -import net.neoforged.neoforge.registries.DeferredRegister; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -136,19 +127,8 @@ private static Key advKey(final String location) { return requireNonNull(this.platform, "Tried to access Fabric platform without a running server"); } - // TODO - add registration helper for neo - private static final DeferredRegister> COMMAND_ARGUMENT_TYPES = DeferredRegister.create(Registries.COMMAND_ARGUMENT_TYPE, "adventure"); - private static final Holder> COMPONENT_ARGUMENT_TYPE = COMMAND_ARGUMENT_TYPES.register("component", () -> ArgumentTypeInfos.registerByClass( - ComponentArgumentType.class, - ComponentArgumentTypeSerializer.INSTANCE - )); - private static final Holder> KEY_ARGUMENT_TYPE = COMMAND_ARGUMENT_TYPES.register("key", () -> ArgumentTypeInfos.registerByClass( - KeyArgumentType.class, - SingletonArgumentInfo.contextFree(KeyArgumentType::key) - )); - - public AdventureNeoTester(final IEventBus modBus) { - COMMAND_ARGUMENT_TYPES.register(modBus); + public AdventureNeoTester() { + AdventureArgumentTypes.register(); // Register localizations final TranslationRegistry testmodRegistry = TranslationRegistry.create(advKey("testmod_localizations"));