FluidIdEntry class

Пакет: com.hypixel.hytale.server.core.prefab.selection.buffer

Файл: com/hypixel/hytale/server/core/prefab/selection/buffer/BinaryPrefabBufferCodec.java

Поля (2)

МодификаторыТипИмя
public int id
public String key

Исходный код

Показать/скрыть
class="kw">package com.hypixel.hytale.server.core.prefab.selection.buffer;

class="kw">import com.hypixel.hytale.assetstore.map.BlockTypeAssetMap;
class="kw">import com.hypixel.hytale.assetstore.map.IndexedLookupTableAssetMap;
class="kw">import com.hypixel.hytale.component.Holder;
class="kw">import com.hypixel.hytale.math.block.BlockUtil;
class="kw">import com.hypixel.hytale.math.util.MathUtil;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.BlockMigration;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.BlockType;
class="kw">import com.hypixel.hytale.server.core.asset.type.fluid.Fluid;
class="kw">import com.hypixel.hytale.server.core.prefab.selection.buffer.impl.PrefabBuffer;
class="kw">import com.hypixel.hytale.server.core.prefab.selection.buffer.impl.PrefabBufferBlockEntry;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.ChunkStore;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
class="kw">import com.hypixel.hytale.server.core.util.BsonUtil;
class="kw">import com.hypixel.hytale.sneakythrow.SneakyThrow;
class="kw">import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
class="kw">import java.io.DataOutputStream;
class="kw">import java.io.IOException;
class="kw">import java.nio.ByteBuffer;
class="kw">import java.nio.charset.StandardCharsets;
class="kw">import java.util.Map;
class="kw">import java.util.function.Function;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">import org.bson.BsonDocument;
class="kw">import org.joml.Vector3i;

class="kw">public class BinaryPrefabBufferCodec {
   class="kw">public class="kw">static class="kw">final BinaryPrefabBufferCodec INSTANCE = new BinaryPrefabBufferCodec();
   class="kw">public class="kw">static class="kw">final int VERSION = 21;
   class="kw">private class="kw">static class="kw">final int MASK_CHANCE = 1;
   class="kw">private class="kw">static class="kw">final int MASK_COMPONENTS = 2;
   class="kw">private class="kw">static class="kw">final int MASK_FLUID = 4;
   class="kw">private class="kw">static class="kw">final int MASK_SUPPORT_VALUE = 8;
   class="kw">private class="kw">static class="kw">final int MASK_FILLER = 16;
   class="kw">private class="kw">static class="kw">final int MASK_ROTATION = 32;

   class="kw">public BinaryPrefabBufferCodec() {
   }

   class="kw">public class="kw">static void writeUTF(@Nonnull DataOutputStream var0, @Nonnull String var1) class="kw">throws IOException {
      byte[] var2 = var1.getBytes(StandardCharsets.UTF_8);
      if (var2.length >= 65535) {
         throw new IllegalArgumentException("String is too large");
      }

      var0.writeShort(var2.length);
      var0.write(var2);
   }

   @Nonnull
   class="kw">public class="kw">static String readUTF(@Nonnull ByteBuffer var0) {
      int var1 = Short.toUnsignedInt(var0.getShort());
      byte[] var2 = new byte[var1];
      var0.get(var2);
      class="kw">return new String(var2, StandardCharsets.UTF_8);
   }

   @Nonnull
   class="kw">public PrefabBuffer deserialize(@Nonnull ByteBuffer var1) {
      int var2 = Short.toUnsignedInt(var1.getShort());
      if (var2 != 18553 && var2 >= 21) {
         if (21 < var2) {
            throw new IllegalStateException("Prefab version is newer than supported. Given: " + var2);
         }

         BlockTypeAssetMap var3 = BlockType.getAssetMap();
         int var4 = var1.getShort();
         long var5 = var1.getLong();
         Vector3i var7 = new Vector3i(BlockUtil.unpackX(var5), BlockUtil.unpackY(var5), BlockUtil.unpackZ(var5));
         Function var8 = null;
         Map var9 = BlockMigration.getAssetMap().getAssetMap();
         int var10 = var4;

         for (BlockMigration var11 = var9.get(var10); var11 != null; var11 = var9.get(++var10)) {
            if (var8 == null) {
               var8 = var11::getMigration;
            } else {
               var8 = var8.andThen(var11::getMigration);
            }
         }

         int var12 = var1.getInt();
         Int2ObjectOpenHashMap var13 = new Int2ObjectOpenHashMap(var12);

         for (int var14 = 0; var14 < var12; var14++) {
            try {
               int var15 = var1.getInt();
               BinaryPrefabBufferCodec.BlockIdEntry var16 = this.deserializeBlock(var1, var3, var8);
               var13.put(var15, var16);
            } catch (Exception var44) {
               throw new IllegalStateException("Failed to deserialize block name #" + var14, var44);
            }
         }

         IndexedLookupTableAssetMap var45 = Fluid.getAssetMap();
         int var46 = var1.getInt();
         Int2ObjectOpenHashMap var47 = new Int2ObjectOpenHashMap(var46);

         for (int var17 = 0; var17 < var46; var17++) {
            try {
               int var18 = var1.getInt();
               BinaryPrefabBufferCodec.FluidIdEntry var19 = this.deserializeFluid(var1, var45);
               var47.put(var18, var19);
            } catch (Exception var43) {
               throw new IllegalStateException("Failed to deserialize block name #" + var17, var43);
            }
         }

         PrefabBuffer.Builder var48 = PrefabBuffer.newBuilder();
         var48.setAnchor(var7);
         int var49 = var1.getInt();

         for (int var50 = 0; var50 < var49; var50++) {
            int var20 = var1.getInt();
            int var21 = var1.getInt();
            PrefabBufferBlockEntry[] var22 = new PrefabBufferBlockEntry[var21];

            for (int var23 = 0; var23 < var21; var23++) {
               int var24 = var1.getShort();
               int var25 = var1.getInt();
               BinaryPrefabBufferCodec.BlockIdEntry var26 = (BinaryPrefabBufferCodec.BlockIdEntry)var13.get(var25);
               int var27 = Byte.toUnsignedInt(var1.get());
               boolean var28 = (var27 & 1) == 1;
               boolean var29 = (var27 & 2) == 2;
               boolean var30 = (var27 & 4) == 4;
               boolean var31 = (var27 & 8) == 8;
               boolean var32 = (var27 & 16) == 16;
               boolean var33 = (var27 & 32) == 32;
               float var34 = var28 ? var1.getFloat() : 1.0F;
               Holder var35 = null;
               if (var29) {
                  BsonDocument var36 = BsonUtil.readFromBinaryStream(var1);
                  var35 = ChunkStore.REGISTRY.deserialize(var36);
               }

               byte var58 = 0;
               if (var31) {
                  var58 = (byte)(var1.get() & 15);
               }

               int var37 = 0;
               if (var32) {
                  var37 = Short.toUnsignedInt(var1.getShort());
               }

               int var38 = 0;
               if (var33) {
                  var38 = Byte.toUnsignedInt(var1.get());
               }

               int var39 = 0;
               byte var40 = 0;
               if (var30) {
                  int var41 = var1.getInt();
                  var39 = ((BinaryPrefabBufferCodec.FluidIdEntry)var47.get(var41)).id;
                  var40 = var1.get();
               }

               var22[var23] = new PrefabBufferBlockEntry(var24, var26.id, var26.key, var34, var35, var39, var40, var58, var38, var37);
            }

            int var51 = Short.toUnsignedInt(var1.getShort());
            Holder[] var52 = null;
            if (var51 > 0) {
               var52 = new Holder[var51];

               for (int var53 = 0; var53 < var51; var53++) {
                  try {
                     BsonDocument var55 = BsonUtil.readFromBinaryStream(var1);
                     Holder var57 = EntityStore.REGISTRY.deserialize(var55);
                     var52[var53] = var57;
                  } catch (Exception var42) {
                     throw new IllegalStateException("Failed to deserialize entity wrapper #" + var50, var42);
                  }
               }
            }

            int var54 = MathUtil.unpackLeft(var20);
            int var56 = MathUtil.unpackRight(var20);
            var48.addColumn(var54, var56, var22, var52);
         }

         class="kw">return var48.build();
      } else {
         throw new UpdateBinaryPrefabException("Old prefab format!");
      }
   }

   @Nonnull
   class="kw">private BinaryPrefabBufferCodec.BlockIdEntry deserializeBlock(
      @Nonnull ByteBuffer var1, @Nonnull BlockTypeAssetMap<String, BlockType> var2, @Nullable Function<String, String> var3
   ) {
      String var4 = readUTF(var1);
      String var5 = var4;
      if (var3 != null) {
         var5 = var3.apply(var5);
      }

      int var6 = BlockType.getBlockIdOrUnknown(var2, var5, "Failed to find block '%s'", var4);
      class="kw">return new BinaryPrefabBufferCodec.BlockIdEntry(var6, var5);
   }

   @Nonnull
   class="kw">private BinaryPrefabBufferCodec.FluidIdEntry deserializeFluid(@Nonnull ByteBuffer var1, @Nonnull IndexedLookupTableAssetMap<String, Fluid> var2) {
      String var3 = readUTF(var1);
      int var4 = Fluid.getFluidIdOrUnknown(var2, var3, "Failed to find fluid '%s'", var3);
      class="kw">return new BinaryPrefabBufferCodec.FluidIdEntry(var4, var3);
   }

   class="kw">public void serialize(@Nonnull PrefabBuffer var1, DataOutputStream var2) class="kw">throws IOException {
      PrefabBuffer.PrefabBufferAccessor var3 = var1.newAccess();
      Int2ObjectOpenHashMap var4 = new Int2ObjectOpenHashMap();
      Int2ObjectOpenHashMap var5 = new Int2ObjectOpenHashMap();
      var3.forEachRaw((var0, var1x, var2x, var3x) -> true, (var1x, var2x, var3x, var4x, var5x, var6, var7, var8, var9, var10, var11) -> {
         if (!var4.containsKey(var5x)) {
            BlockTypeAssetMap var12 = BlockType.getAssetMap();
            BlockType var13 = var12.getAsset(var5x);
            if (var13 == null) {
               var13 = BlockType.UNKNOWN;
            }

            var4.put(var5x, var13.getId().toString());
         }
      }, (var1x, var2x, var3x, var4x, var5x, var6) -> {
         if (!var5.containsKey(var4x)) {
            IndexedLookupTableAssetMap var7 = Fluid.getAssetMap();
            Fluid var8 = var7.getAsset(var4x);
            if (var8 == null) {
               var8 = Fluid.UNKNOWN;
            }

            var5.put(var4x, var8.getId());
         }
      }, (var0, var1x, var2x, var3x) -> {}, null);
      var2.writeShort(21);
      var2.writeShort(BlockMigration.getAssetMap().getAssetCount());
      var2.writeLong(BlockUtil.pack(var1.getAnchorX(), var1.getAnchorY(), var1.getAnchorZ()));
      var2.writeInt(var4.size());
      var4.int2ObjectEntrySet().fastForEach(SneakyThrow.sneakyConsumer(var1x -> {
         var2.writeInt(var1x.getIntKey());
         writeUTF(var2, (String)var1x.getValue());
      }));
      var2.writeInt(var5.size());
      var5.int2ObjectEntrySet().fastForEach(SneakyThrow.sneakyConsumer(var1x -> {
         var2.writeInt(var1x.getIntKey());
         writeUTF(var2, (String)var1x.getValue());
      }));
      var2.writeInt(var3.getColumnCount());
      var3.forEachRaw((var1x, var2x, var3x, var4x) -> {
         try {
            var2.writeInt(MathUtil.packInt(var1x, var2x));
            var2.writeInt(var3x);
            class="kw">return true;
         } catch (IOException var6) {
            throw SneakyThrow.sneakyThrow(var6);
         }
      }, (var1x, var2x, var3x, var4x, var5x, var6, var7, var8, var9, var10, var11) -> {
         try {
            var2.writeShort((short)var2x);
            var2.writeInt(var5x);
            boolean var12 = var6 < 1.0F;
            boolean var13 = var7 != null;
            int var14 = 0;
            if (var12) {
               var14 |= 1;
            }

            if (var13) {
               var14 |= 2;
            }

            if ((var4x & 192) != 0) {
               var14 |= 4;
            }

            if (var8 != 0) {
               var14 |= 8;
            }

            if (var10 != 0) {
               var14 |= 16;
            }

            if (var9 != 0) {
               var14 |= 32;
            }

            var2.writeByte(var14);
            if (var12) {
               var2.writeFloat(var6);
            }

            if (var13) {
               try {
                  BsonUtil.writeToBinaryStream(var2, ChunkStore.REGISTRY.serialize(var7));
               } catch (Throwable var16) {
                  throw new IllegalStateException(String.format("Exception while writing %d, %d, %d state!", var1x, var2x, var3x), var16);
               }
            }

            if (var8 != 0) {
               var2.writeByte(var8);
            }

            if (var10 != 0) {
               var2.writeShort(var10);
            }

            if (var9 != 0) {
               var2.writeByte(var9);
            }
         } catch (IOException var17) {
            throw SneakyThrow.sneakyThrow(var17);
         }
      }, (var1x, var2x, var3x, var4x, var5x, var6) -> {
         try {
            var2.writeInt(var4x);
            var2.writeByte(var5x);
         } catch (IOException var8) {
            throw SneakyThrow.sneakyThrow(var8);
         }
      }, (var1x, var2x, var3x, var4x) -> {
         try {
            int var5 = var3x != null ? var3x.length : 0;
            var2.writeShort(var5);

            for (int var6 = 0; var6 < var5; var6++) {
               Holder var7 = var3x[var6];

               try {
                  BsonDocument var8 = EntityStore.REGISTRY.serialize(var7);
                  BsonUtil.writeToBinaryStream(var2, var8);
               } catch (Exception var9) {
                  throw new IllegalStateException(String.format("Failed to write EntityWrapper at %d, %d #%d", var1x, var2x, var6), var9);
               }
            }
         } catch (IOException var10) {
            throw SneakyThrow.sneakyThrow(var10);
         }
      }, null);
   }

   class="kw">private class="kw">static class BlockIdEntry {
      class="kw">public int id;
      class="kw">public String key;

      class="kw">public BlockIdEntry(int var1, String var2) {
         this.id = var1;
         this.key = var2;
      }
   }

   class="kw">private class="kw">static class FluidIdEntry {
      class="kw">public int id;
      class="kw">public String key;

      class="kw">public FluidIdEntry(int var1, String var2) {
         this.id = var1;
         this.key = var2;
      }
   }
}