From 80b90887a569bdca63e5cca26e2235d8579b17ff Mon Sep 17 00:00:00 2001 From: IzzelAliz Date: Thu, 6 May 2021 21:22:20 +0800 Subject: [PATCH] Properly wrap non vanilla argument types (ArclightPowered/lightfall#7) --- .../command/arguments/ArgumentTypesMixin.java | 27 +++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/command/arguments/ArgumentTypesMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/command/arguments/ArgumentTypesMixin.java index ffd3a364..d3daa2a3 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/command/arguments/ArgumentTypesMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/command/arguments/ArgumentTypesMixin.java @@ -11,8 +11,14 @@ import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Overwrite; import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import javax.annotation.Nullable; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; @Mixin(ArgumentTypes.class) public abstract class ArgumentTypesMixin { @@ -20,8 +26,26 @@ public abstract class ArgumentTypesMixin { // @formatter:off @Shadow @Final private static Logger LOGGER; @Shadow @Nullable private static ArgumentTypes.Entry get(ArgumentType type) { return null; } + @Shadow @Final private static Map> ID_TYPE_MAP; // @formatter:on + private static final Set INTERNAL_TYPES = new HashSet<>(); + + @Inject(method = "registerArgumentTypes", at = @At("HEAD")) + private static void arclight$beginRegister(CallbackInfo ci) { + INTERNAL_TYPES.addAll(ID_TYPE_MAP.keySet()); + } + + @Inject(method = "registerArgumentTypes", at = @At("RETURN")) + private static void arclight$endRegister(CallbackInfo ci) { + HashSet set = new HashSet<>(ID_TYPE_MAP.keySet()); + set.removeAll(INTERNAL_TYPES); + INTERNAL_TYPES.clear(); + INTERNAL_TYPES.addAll(set); + INTERNAL_TYPES.add(new ResourceLocation("forge", "enum")); + INTERNAL_TYPES.add(new ResourceLocation("forge", "modid")); + } + /** * @author IzzelAliz * @reason @@ -33,8 +57,7 @@ public abstract class ArgumentTypesMixin { LOGGER.error("Could not serialize {} ({}) - will not be sent to client!", type, type.getClass()); buffer.writeResourceLocation(new ResourceLocation("")); } else { - String namespace = entry.id.getNamespace(); - boolean wrap = SpigotConfig.bungee && !(namespace.equals("minecraft") || namespace.equals("forge") || namespace.equals("brigadier")); + boolean wrap = SpigotConfig.bungee && !INTERNAL_TYPES.contains(entry.id); if (wrap) { buffer.writeString("arclight:wrapped"); }