diff --git a/src/main/java/net/minecraftforge/common/ForgeMod.java b/src/main/java/net/minecraftforge/common/ForgeMod.java index 4df75983f..8f6b45ac2 100644 --- a/src/main/java/net/minecraftforge/common/ForgeMod.java +++ b/src/main/java/net/minecraftforge/common/ForgeMod.java @@ -28,7 +28,9 @@ import net.minecraftforge.fml.event.server.FMLServerStartingEvent; import net.minecraftforge.fml.event.server.FMLServerStoppingEvent; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import net.minecraftforge.server.command.ConfigCommand; +import net.minecraftforge.server.command.EnumArgument; import net.minecraftforge.server.command.ForgeCommand; +import net.minecraftforge.server.command.ModIdArgument; import net.minecraftforge.versions.forge.ForgeVersion; import net.minecraftforge.versions.mcp.MCPVersion; @@ -36,6 +38,8 @@ import org.apache.commons.lang3.tuple.Pair; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import net.minecraft.command.arguments.ArgumentSerializer; +import net.minecraft.command.arguments.ArgumentTypes; import net.minecraft.data.DataGenerator; import net.minecraft.nbt.CompoundNBT; import net.minecraft.world.storage.SaveHandler; @@ -45,12 +49,12 @@ import net.minecraftforge.common.data.ForgeItemTagsProvider; import net.minecraftforge.common.data.ForgeRecipeProvider; import net.minecraftforge.common.model.animation.CapabilityAnimation; import net.minecraftforge.energy.CapabilityEnergy; +import net.minecraftforge.event.entity.player.PlayerEvent; import net.minecraftforge.fml.event.lifecycle.GatherDataEvent; import net.minecraftforge.fluids.capability.CapabilityFluidHandler; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.fluids.UniversalBucket; import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.event.entity.player.PlayerEvent; import org.apache.logging.log4j.Marker; import org.apache.logging.log4j.MarkerManager; @@ -118,6 +122,9 @@ public class ForgeMod implements WorldPersistenceHooks.WorldPersistenceHook { VersionChecker.startVersionCheck(); } + + //ArgumentTypes.register("forge:enum", EnumArgument.class, new EnumArgument.Serialzier()); //This can't register, it breaks vanilla clients. As the packet serailzier doesn't discard unknown data + ArgumentTypes.register("forge:modid", ModIdArgument.class, new ArgumentSerializer<>(ModIdArgument::modIdArgument)); } public void serverStarting(FMLServerStartingEvent evt) diff --git a/src/main/java/net/minecraftforge/server/command/EnumArgument.java b/src/main/java/net/minecraftforge/server/command/EnumArgument.java index 25cd6a8c4..2f6adf087 100644 --- a/src/main/java/net/minecraftforge/server/command/EnumArgument.java +++ b/src/main/java/net/minecraftforge/server/command/EnumArgument.java @@ -1,5 +1,6 @@ package net.minecraftforge.server.command; +import com.google.gson.JsonObject; import com.mojang.brigadier.StringReader; import com.mojang.brigadier.arguments.ArgumentType; import com.mojang.brigadier.context.CommandContext; @@ -7,13 +8,15 @@ import com.mojang.brigadier.exceptions.CommandSyntaxException; import com.mojang.brigadier.suggestion.Suggestions; import com.mojang.brigadier.suggestion.SuggestionsBuilder; import net.minecraft.command.ISuggestionProvider; +import net.minecraft.command.arguments.IArgumentSerializer; +import net.minecraft.network.PacketBuffer; import java.util.Collection; import java.util.concurrent.CompletableFuture; import java.util.stream.Collectors; import java.util.stream.Stream; -public class EnumArgument> implements ArgumentType { +public class EnumArgument> implements ArgumentType { private final Class enumClass; public static > EnumArgument enumArgument(Class enumClass) { @@ -37,4 +40,27 @@ public class EnumArgument> implements ArgumentType { public Collection getExamples() { return Stream.of(enumClass.getEnumConstants()).map(Object::toString).collect(Collectors.toList()); } + + @SuppressWarnings({"rawtypes", "unchecked"}) + public static class Serialzier implements IArgumentSerializer { + @Override + public void write(EnumArgument argument, PacketBuffer buffer) { + buffer.writeString(argument.enumClass.getName()); + } + + @Override + public EnumArgument read(PacketBuffer buffer) { + try { + String name = buffer.readString(); + return new EnumArgument(Class.forName(name)); + } catch (ClassNotFoundException e) { + return null; + } + } + + @Override + public void write(EnumArgument argument, JsonObject json) { + json.addProperty("enum", argument.enumClass.getName()); + } + } } diff --git a/src/main/java/net/minecraftforge/server/command/ModIdArgument.java b/src/main/java/net/minecraftforge/server/command/ModIdArgument.java index 0645518d7..844996717 100644 --- a/src/main/java/net/minecraftforge/server/command/ModIdArgument.java +++ b/src/main/java/net/minecraftforge/server/command/ModIdArgument.java @@ -1,5 +1,6 @@ package net.minecraftforge.server.command; +import com.google.gson.JsonObject; import com.mojang.brigadier.StringReader; import com.mojang.brigadier.arguments.ArgumentType; import com.mojang.brigadier.context.CommandContext; @@ -7,6 +8,8 @@ import com.mojang.brigadier.exceptions.CommandSyntaxException; import com.mojang.brigadier.suggestion.Suggestions; import com.mojang.brigadier.suggestion.SuggestionsBuilder; import net.minecraft.command.ISuggestionProvider; +import net.minecraft.command.arguments.IArgumentSerializer; +import net.minecraft.network.PacketBuffer; import net.minecraftforge.fml.ModContainer; import net.minecraftforge.fml.ModList; @@ -36,4 +39,22 @@ public class ModIdArgument implements ArgumentType { public Collection getExamples() { return EXAMPLES; } + + public static class Serialzier implements IArgumentSerializer { + + @Override + public void write(ModIdArgument argument, PacketBuffer buffer) { + } + + @Override + public ModIdArgument read(PacketBuffer buffer) { + return null; + } + + @Override + public void write(ModIdArgument argument, JsonObject json) { + + } + + } }