/src/main/java/mods/railcraft/common/plugins/forge/DataManagerPlugin.java

https://github.com/CovertJaguar/Railcraft · Java · 166 lines · 127 code · 25 blank · 14 comment · 4 complexity · 617825ab5461f5ef4654824d329c64c7 MD5 · raw file

  1. /*------------------------------------------------------------------------------
  2. Copyright (c) CovertJaguar, 2011-2020
  3. http://railcraft.info
  4. This code is the property of CovertJaguar
  5. and may only be used with explicit written
  6. permission unless otherwise specified on the
  7. license page at http://railcraft.info/wiki/info:license.
  8. -----------------------------------------------------------------------------*/
  9. package mods.railcraft.common.plugins.forge;
  10. import io.netty.buffer.ByteBufInputStream;
  11. import io.netty.buffer.ByteBufOutputStream;
  12. import mods.railcraft.common.core.RailcraftConstants;
  13. import mods.railcraft.common.fluids.OptionalFluidStack;
  14. import mods.railcraft.common.plugins.color.EnumColor;
  15. import mods.railcraft.common.util.misc.Game;
  16. import mods.railcraft.common.util.misc.Game.Logger;
  17. import mods.railcraft.common.util.misc.Reflection;
  18. import mods.railcraft.common.util.network.RailcraftInputStream;
  19. import mods.railcraft.common.util.network.RailcraftOutputStream;
  20. import net.minecraft.network.PacketBuffer;
  21. import net.minecraft.network.datasync.DataParameter;
  22. import net.minecraft.network.datasync.DataSerializer;
  23. import net.minecraft.network.datasync.EntityDataManager;
  24. import net.minecraft.util.ResourceLocation;
  25. import net.minecraftforge.fml.common.registry.ForgeRegistries;
  26. import net.minecraftforge.registries.DataSerializerEntry;
  27. import org.apache.logging.log4j.Level;
  28. import java.io.IOException;
  29. import java.util.Arrays;
  30. /**
  31. * Created by CovertJaguar on 6/12/2016 for Railcraft.
  32. *
  33. * @author CovertJaguar <http://www.railcraft.info>
  34. */
  35. public class DataManagerPlugin {
  36. public abstract static class DataSerializerIO<T> implements DataSerializer<T> {
  37. private final String name;
  38. protected DataSerializerIO(String name) {
  39. this.name = name;
  40. }
  41. public ResourceLocation getResourceName() {
  42. return new ResourceLocation(RailcraftConstants.RESOURCE_DOMAIN, name);
  43. }
  44. @Override
  45. public T copyValue(T value) {
  46. return value;
  47. }
  48. @Override
  49. public DataParameter<T> createKey(int id) {
  50. return new DataParameter<>(id, this);
  51. }
  52. }
  53. public static final DataSerializerIO<OptionalFluidStack> OPTIONAL_FLUID_STACK = new DataSerializerIO<OptionalFluidStack>("optional.fluid.stack") {
  54. @Override
  55. public final void write(PacketBuffer buf, OptionalFluidStack value) {
  56. try (ByteBufOutputStream out = new ByteBufOutputStream(buf);
  57. RailcraftOutputStream data = new RailcraftOutputStream(out)) {
  58. data.writeFluidStack(value.orElse(null));
  59. } catch (IOException e) {
  60. Game.log().throwable("Error syncing Object", e);
  61. if (Game.DEVELOPMENT_VERSION)
  62. throw new RuntimeException(e);
  63. }
  64. }
  65. @Override
  66. public final OptionalFluidStack read(PacketBuffer buf) {
  67. try (ByteBufInputStream out = new ByteBufInputStream(buf);
  68. RailcraftInputStream data = new RailcraftInputStream(out)) {
  69. return OptionalFluidStack.of(data.readFluidStack());
  70. } catch (IOException e) {
  71. Game.log().throwable("Error syncing Object", e);
  72. if (Game.DEVELOPMENT_VERSION)
  73. throw new RuntimeException(e);
  74. }
  75. return OptionalFluidStack.empty();
  76. }
  77. @Override
  78. public OptionalFluidStack copyValue(OptionalFluidStack value) {
  79. return value.copy();
  80. }
  81. };
  82. public static final DataSerializerIO<EnumColor> ENUM_COLOR = new DataSerializerIO<EnumColor>("enum.color") {
  83. @Override
  84. public final void write(PacketBuffer buf, EnumColor value) {
  85. try (ByteBufOutputStream out = new ByteBufOutputStream(buf);
  86. RailcraftOutputStream data = new RailcraftOutputStream(out)) {
  87. data.writeEnum(value);
  88. } catch (IOException e) {
  89. Game.log().throwable("Error syncing Object", e);
  90. if (Game.DEVELOPMENT_VERSION)
  91. throw new RuntimeException(e);
  92. }
  93. }
  94. @Override
  95. public final EnumColor read(PacketBuffer buf) {
  96. try (ByteBufInputStream out = new ByteBufInputStream(buf);
  97. RailcraftInputStream data = new RailcraftInputStream(out)) {
  98. return data.readEnum(EnumColor.VALUES);
  99. } catch (IOException e) {
  100. Game.log().throwable("Error syncing Object", e);
  101. if (Game.DEVELOPMENT_VERSION)
  102. throw new RuntimeException(e);
  103. }
  104. return EnumColor.WHITE;
  105. }
  106. };
  107. public static final DataSerializerIO<byte[]> BYTE_ARRAY = new DataSerializerIO<byte[]>("byte.array") {
  108. @Override
  109. public void write(PacketBuffer packetBuffer, byte[] bytes) {
  110. packetBuffer.writeByteArray(bytes);
  111. }
  112. @Override
  113. public byte[] read(PacketBuffer packetBuffer) throws IOException {
  114. return packetBuffer.readByteArray();
  115. }
  116. @Override
  117. public byte[] copyValue(byte[] value) {
  118. return Arrays.copyOf(value, value.length);
  119. }
  120. };
  121. public static void register() {
  122. register(OPTIONAL_FLUID_STACK);
  123. register(ENUM_COLOR);
  124. register(BYTE_ARRAY);
  125. }
  126. private static void register(DataSerializerIO<?> dataSerializer) {
  127. ForgeRegistries.DATA_SERIALIZERS.register(new DataSerializerEntry(dataSerializer).setRegistryName(dataSerializer.getResourceName()));
  128. }
  129. public static <T> DataParameter<T> create(DataSerializer<T> serializer) {
  130. DataParameter<T> dataParameter = EntityDataManager.createKey(Reflection.getCallerClass(1), serializer);
  131. Logger.INSTANCE.msg(Level.WARN, "This is NOT an error. Its just Forge being nosy.");
  132. return dataParameter;
  133. }
  134. public static <T extends Enum<T>> void writeEnum(EntityDataManager dataManager, DataParameter<Byte> parameter, Enum<T> value) {
  135. dataManager.set(parameter, (byte) value.ordinal());
  136. }
  137. public static <T extends Enum<T>> T readEnum(EntityDataManager dataManager, DataParameter<Byte> parameter, T[] values) {
  138. return values[dataManager.get(parameter)];
  139. }
  140. }