Add Argument serializer for ModIdArgument. EnumArgument can't as vanilla doesn't support extra data.

This commit is contained in:
LexManos 2019-08-20 15:29:26 -07:00
parent 0c1c1b65e1
commit 5291ea7270
3 changed files with 56 additions and 2 deletions

View File

@ -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)

View File

@ -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<T extends Enum<T>> implements ArgumentType<T> {
public class EnumArgument<T extends Enum<T>> implements ArgumentType<T> {
private final Class<T> enumClass;
public static <R extends Enum<R>> EnumArgument<R> enumArgument(Class<R> enumClass) {
@ -37,4 +40,27 @@ public class EnumArgument<T extends Enum<T>> implements ArgumentType<T> {
public Collection<String> getExamples() {
return Stream.of(enumClass.getEnumConstants()).map(Object::toString).collect(Collectors.toList());
}
@SuppressWarnings({"rawtypes", "unchecked"})
public static class Serialzier implements IArgumentSerializer<EnumArgument> {
@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());
}
}
}

View File

@ -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<String> {
public Collection<String> getExamples() {
return EXAMPLES;
}
public static class Serialzier implements IArgumentSerializer<ModIdArgument> {
@Override
public void write(ModIdArgument argument, PacketBuffer buffer) {
}
@Override
public ModIdArgument read(PacketBuffer buffer) {
return null;
}
@Override
public void write(ModIdArgument argument, JsonObject json) {
}
}
}