StairConnection enum

Пакет: com.hypixel.hytale.server.core.universe.world.connectedblocks.builtin

Файл: com/hypixel/hytale/server/core/universe/world/connectedblocks/builtin/StairConnectedBlockRuleSet.java

Поля (1)

МодификаторыТипИмя
CORNER_LEFT, CORNER_RIGHT

Методы (2)

МодификаторыВозвратСигнатура
public StairConnectedBlockRuleSet.StairType getStairTypepublic StairConnectedBlockRuleSet.StairType getStairType(boolean var1)
return switchreturn switch(this)

Исходный код

Показать/скрыть
class="kw">package com.hypixel.hytale.server.core.universe.world.connectedblocks.builtin;

class="kw">import com.hypixel.hytale.assetstore.map.BlockTypeAssetMap;
class="kw">import com.hypixel.hytale.codec.Codec;
class="kw">import com.hypixel.hytale.codec.KeyedCodec;
class="kw">import com.hypixel.hytale.codec.builder.BuilderCodec;
class="kw">import com.hypixel.hytale.codec.validation.Validators;
class="kw">import com.hypixel.hytale.component.Ref;
class="kw">import com.hypixel.hytale.component.Store;
class="kw">import com.hypixel.hytale.math.vector.Vector3iUtil;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.BlockType;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.Rotation;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.RotationTuple;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.section.BlockSection;
class="kw">import com.hypixel.hytale.server.core.universe.world.connectedblocks.ConnectedBlockRuleSet;
class="kw">import com.hypixel.hytale.server.core.universe.world.connectedblocks.ConnectedBlocksUtil;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.ChunkStore;
class="kw">import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
class="kw">import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
class="kw">import it.unimi.dsi.fastutil.objects.Object2IntMap;
class="kw">import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectIntImmutablePair;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectIntPair;
class="kw">import java.util.Optional;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">import org.joml.Vector3i;
class="kw">import org.joml.Vector3ic;

class="kw">public class StairConnectedBlockRuleSet class="kw">extends ConnectedBlockRuleSet class="kw">implements StairLikeConnectedBlockRuleSet {
   @Nonnull
   class="kw">public class="kw">static class="kw">final String DEFAULT_MATERIAL_NAME = "Stair";
   @Nonnull
   class="kw">public class="kw">static class="kw">final BuilderCodec<StairConnectedBlockRuleSet> CODEC = BuilderCodec.builder(StairConnectedBlockRuleSet.class, StairConnectedBlockRuleSet::new)
      .append(new KeyedCodec<>("Straight", ConnectedBlockOutput.CODEC), (var0, var1) -> var0.straight = var1, var0 -> var0.straight)
      .addValidator(Validators.nonNull())
      .add()
      .<ConnectedBlockOutput>append(
         new KeyedCodec<>("Corner_Left", ConnectedBlockOutput.CODEC), (var0, var1) -> var0.cornerLeft = var1, var0 -> var0.cornerLeft
      )
      .addValidator(Validators.nonNull())
      .add()
      .<ConnectedBlockOutput>append(
         new KeyedCodec<>("Corner_Right", ConnectedBlockOutput.CODEC), (var0, var1) -> var0.cornerRight = var1, var0 -> var0.cornerRight
      )
      .addValidator(Validators.nonNull())
      .add()
      .append(
         new KeyedCodec<>("Inverted_Corner_Left", ConnectedBlockOutput.CODEC), (var0, var1) -> var0.invertedCornerLeft = var1, var0 -> var0.invertedCornerLeft
      )
      .add()
      .append(
         new KeyedCodec<>("Inverted_Corner_Right", ConnectedBlockOutput.CODEC),
         (var0, var1) -> var0.invertedCornerRight = var1,
         var0 -> var0.invertedCornerRight
      )
      .add()
      .append(new KeyedCodec<>("MaterialName", Codec.STRING), (var0, var1) -> var0.materialName = var1, var0 -> var0.materialName)
      .add()
      .build();
   class="kw">protected Object2IntMap<StairConnectedBlockRuleSet.StairType> stairTypeToBlockId;
   class="kw">private ConnectedBlockOutput straight;
   class="kw">private ConnectedBlockOutput cornerLeft;
   class="kw">private ConnectedBlockOutput cornerRight;
   class="kw">private ConnectedBlockOutput invertedCornerLeft;
   class="kw">private ConnectedBlockOutput invertedCornerRight;
   class="kw">private String materialName = "Stair";
   class="kw">private Int2ObjectMap<StairConnectedBlockRuleSet.StairType> blockIdToStairType;

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

   @Nullable
   class="kw">protected class="kw">static ObjectIntPair<StairConnectedBlockRuleSet.StairType> getStairData(@Nonnull ChunkStore var0, @Nonnull Vector3i var1, @Nullable String var2) {
      Store var3 = var0.getStore();
      Ref var4 = var0.getChunkSectionReferenceAtBlock(var1.x, var1.y, var1.z);
      if (var4 != null && var4.isValid()) {
         BlockSection var5 = var3.getComponent(var4, BlockSection.getComponentType());
         if (var5 == null) {
            class="kw">return null;
         }

         int var6 = var5.getFiller(var1.x, var1.y, var1.z);
         if (var6 != 0) {
            class="kw">return null;
         }

         int var7 = var5.get(var1.x, var1.y, var1.z);
         BlockType var8 = BlockType.getAssetMap().getAsset(var7);
         if (var8 == null) {
            class="kw">return null;
         }

         if (var8.getConnectedBlockRuleSet() class="kw">instanceof StairLikeConnectedBlockRuleSet var10) {
            String var11 = var10.getMaterialName();
            if (var2 != null && var11 != null && !var2.equals(var11)) {
               class="kw">return null;
            }

            StairConnectedBlockRuleSet.StairType var12 = var10.getStairType(var7);
            if (var12 == null) {
               class="kw">return null;
            }

            int var13 = var5.getRotationIndex(var1.x, var1.y, var1.z);
            class="kw">return new ObjectIntImmutablePair(var12, var13);
         } else {
            class="kw">return null;
         }
      } else {
         class="kw">return null;
      }
   }

   @Nullable
   class="kw">protected class="kw">static StairConnectedBlockRuleSet.StairConnection getCornerConnection(
      @Nonnull ChunkStore var0,
      @Nonnull StairLikeConnectedBlockRuleSet var1,
      @Nonnull Vector3ic var2,
      @Nonnull Vector3i var3,
      int var4,
      @Nonnull Rotation var5,
      boolean var6,
      int var7
   ) {
      StairConnectedBlockRuleSet.StairConnection var8 = null;
      var3.set(Vector3iUtil.NORTH).mul(var7);
      var5.rotateY(var3, var3);
      var3.add(var2.x(), var2.y(), var2.z());
      ObjectIntPair var9 = getStairData(var0, var3, var1.getMaterialName());
      if (var9 == null && var7 > 1) {
         var3.set(Vector3iUtil.NORTH).mul(var7 + 1);
         var5.rotateY(var3, var3);
         var3.add(var2.x(), var2.y(), var2.z());
         var9 = getStairData(var0, var3, var1.getMaterialName());
         if (var9 != null && var9.first() == StairConnectedBlockRuleSet.StairType.STRAIGHT) {
            var9 = null;
         }
      }

      if (var9 != null) {
         StairConnectedBlockRuleSet.StairType var10 = (StairConnectedBlockRuleSet.StairType)var9.left();
         RotationTuple var11 = RotationTuple.get(var9.rightInt());
         Rotation var12 = var11.yaw();
         boolean var13 = var11.pitch() != Rotation.None;
         if (var13) {
            var12 = var12.flip();
         }

         if (canConnectTo(var5, var12, var6, var13)) {
            var3.set(Vector3iUtil.SOUTH);
            var12.rotateY(var3, var3);
            var3.add(var2);
            ObjectIntPair var14 = getStairData(var0, var3, var1.getMaterialName());
            if (var14 == null || var14.rightInt() != var4) {
               var8 = getConnection(var5, var12, var10, false, var6);
            }
         }
      }

      class="kw">return var8;
   }

   @Nullable
   class="kw">protected class="kw">static StairConnectedBlockRuleSet.StairConnection getInvertedCornerConnection(
      @Nonnull ChunkStore var0,
      @Nonnull StairLikeConnectedBlockRuleSet var1,
      @Nonnull Vector3ic var2,
      @Nonnull Vector3i var3,
      @Nonnull Rotation var4,
      boolean var5
   ) {
      StairConnectedBlockRuleSet.StairConnection var6 = null;
      var3.set(Vector3iUtil.SOUTH);
      var4.rotateY(var3, var3);
      var3.add(var2);
      ObjectIntPair var7 = getStairData(var0, var3, var1.getMaterialName());
      if (var7 != null) {
         StairConnectedBlockRuleSet.StairType var8 = (StairConnectedBlockRuleSet.StairType)var7.left();
         RotationTuple var9 = RotationTuple.get(var7.rightInt());
         Rotation var10 = var9.yaw();
         boolean var11 = var9.pitch() != Rotation.None;
         if (var11) {
            var10 = var10.flip();
         }

         if (canConnectTo(var4, var10, var5, var11)) {
            var6 = getConnection(var4, var10, var8, true, var5);
         }
      }

      class="kw">return var6;
   }

   class="kw">private class="kw">static boolean canConnectTo(@Nonnull Rotation var0, @Nonnull Rotation var1, boolean var2, boolean var3) {
      class="kw">return var3 == var2 && var1 != var0 && var1.add(Rotation.OneEighty) != var0;
   }

   @Nullable
   class="kw">private class="kw">static StairConnectedBlockRuleSet.StairConnection getConnection(
      @Nonnull Rotation var0, @Nonnull Rotation var1, @Nonnull StairConnectedBlockRuleSet.StairType var2, boolean var3, boolean var4
   ) {
      if (var1 == var0.add(Rotation.Ninety)
         && var2 != StairConnectedBlockRuleSet.StairType.invertedCorner(var4 ^ var3)
         && var2 != StairConnectedBlockRuleSet.StairType.corner(var4 ^ !var3)) {
         class="kw">return StairConnectedBlockRuleSet.StairConnection.CORNER_LEFT;
      } else {
         class="kw">return var1 == var0.subtract(Rotation.Ninety)
               && var2 != StairConnectedBlockRuleSet.StairType.invertedCorner(var4 ^ !var3)
               && var2 != StairConnectedBlockRuleSet.StairType.corner(var4 ^ var3)
            ? StairConnectedBlockRuleSet.StairConnection.CORNER_RIGHT
            : null;
      }
   }

   @Override
   class="kw">public boolean onlyUpdateOnPlacement() {
      class="kw">return false;
   }

   @Override
   class="kw">public void updateCachedBlockTypes(@Nonnull BlockType var1, @Nonnull BlockTypeAssetMap<String, BlockType> var2) {
      int var3 = var2.getIndex(var1.getId());
      Int2ObjectMap var4 = new Int2ObjectOpenHashMap();
      Object2IntMap var5 = new Object2IntOpenHashMap();
      var5.defaultReturnValue(var3);
      ConnectedBlockOutput[] var6 = new ConnectedBlockOutput[]{
         this.straight, this.cornerLeft, this.cornerRight, this.invertedCornerLeft, this.invertedCornerRight
      };
      StairConnectedBlockRuleSet.StairType[] var7 = StairConnectedBlockRuleSet.StairType.VALUES;

      for (int var8 = 0; var8 < var6.length; var8++) {
         ConnectedBlockOutput var9 = var6[var8];
         if (var9 != null) {
            int var10 = var9.resolve(var1, var2);
            if (var10 != -1) {
               var4.put(var10, var7[var8]);
               var5.put(var7[var8], var10);
            }
         }
      }

      this.blockIdToStairType = var4;
      this.stairTypeToBlockId = var5;
   }

   @Override
   class="kw">public StairConnectedBlockRuleSet.StairType getStairType(int var1) {
      class="kw">return (StairConnectedBlockRuleSet.StairType)this.blockIdToStairType.get(var1);
   }

   @Nullable
   @Override
   class="kw">public String getMaterialName() {
      class="kw">return this.materialName;
   }

   @Nullable
   class="kw">public BlockType getStairBlockType(@Nonnull StairConnectedBlockRuleSet.StairType var1) {
      if (this.stairTypeToBlockId == null) {
         class="kw">return null;
      }

      int var2 = this.stairTypeToBlockId.getInt(var1);
      class="kw">return BlockType.getAssetMap().getAsset(var2);
   }

   @Nonnull
   @Override
   class="kw">public Optional<ConnectedBlocksUtil.ConnectedBlockResult> getConnectedBlockType(
      @Nonnull ChunkStore var1, @Nonnull Vector3ic var2, @Nonnull BlockType var3, int var4, @Nonnull Vector3ic var5, boolean var6
   ) {
      RotationTuple var7 = RotationTuple.get(var4);
      Rotation var8 = var7.yaw();
      Rotation var9 = var7.pitch();
      boolean var10 = var9 != Rotation.None;
      if (var10) {
         var8 = var8.flip();
      }

      Vector3i var11 = new Vector3i();
      StairConnectedBlockRuleSet.StairType var12 = StairConnectedBlockRuleSet.StairType.STRAIGHT;
      StairConnectedBlockRuleSet.StairConnection var13 = getInvertedCornerConnection(var1, this, var2, var11, var8, var10);
      if (var13 != null) {
         var12 = var13.getStairType(true);
      }

      StairConnectedBlockRuleSet.StairConnection var14 = getCornerConnection(var1, this, var2, var11, var4, var8, var10, 1);
      if (var14 != null) {
         var12 = var14.getStairType(false);
      }

      if (var10) {
         var12 = class="kw">switch (var12) {
            case CORNER_LEFT -> StairConnectedBlockRuleSet.StairType.CORNER_RIGHT;
            case CORNER_RIGHT -> StairConnectedBlockRuleSet.StairType.CORNER_LEFT;
            case INVERTED_CORNER_LEFT -> StairConnectedBlockRuleSet.StairType.INVERTED_CORNER_RIGHT;
            case INVERTED_CORNER_RIGHT -> StairConnectedBlockRuleSet.StairType.INVERTED_CORNER_LEFT;
            class="kw">default -> var12;
         };
      }

      int var15 = this.stairTypeToBlockId.getInt(var12);
      BlockType var16 = BlockType.getAssetMap().getAsset(var15);
      if (var16 == null) {
         class="kw">return Optional.empty();
      }

      String var17 = var16.getId();
      class="kw">return Optional.of(new ConnectedBlocksUtil.ConnectedBlockResult(var17, var4));
   }

   @Nullable
   @Override
   class="kw">public com.hypixel.hytale.protocol.ConnectedBlockRuleSet toPacket(@Nonnull BlockTypeAssetMap<String, BlockType> var1) {
      class="kw">return this.toProtocol(var1);
   }

   @Nonnull
   class="kw">public com.hypixel.hytale.protocol.StairConnectedBlockRuleSet toProtocol(@Nonnull BlockTypeAssetMap<String, BlockType> var1) {
      com.hypixel.hytale.protocol.StairConnectedBlockRuleSet var2 = new com.hypixel.hytale.protocol.StairConnectedBlockRuleSet();
      var2.straightBlockId = this.getBlockIdForStairType(StairConnectedBlockRuleSet.StairType.STRAIGHT, var1);
      var2.cornerLeftBlockId = this.getBlockIdForStairType(StairConnectedBlockRuleSet.StairType.CORNER_LEFT, var1);
      var2.cornerRightBlockId = this.getBlockIdForStairType(StairConnectedBlockRuleSet.StairType.CORNER_RIGHT, var1);
      var2.invertedCornerLeftBlockId = this.getBlockIdForStairType(StairConnectedBlockRuleSet.StairType.INVERTED_CORNER_LEFT, var1);
      var2.invertedCornerRightBlockId = this.getBlockIdForStairType(StairConnectedBlockRuleSet.StairType.INVERTED_CORNER_RIGHT, var1);
      var2.materialName = this.materialName;
      class="kw">return var2;
   }

   class="kw">private int getBlockIdForStairType(@Nonnull StairConnectedBlockRuleSet.StairType var1, @Nonnull BlockTypeAssetMap<String, BlockType> var2) {
      BlockType var3 = this.getStairBlockType(var1);
      class="kw">return var3 == null ? -1 : var2.getIndex(var3.getId());
   }

   class="kw">protected enum StairConnection {
      CORNER_LEFT,
      CORNER_RIGHT;

      StairConnection() {
      }

      @Nonnull
      class="kw">public StairConnectedBlockRuleSet.StairType getStairType(boolean var1) {
         class="kw">return class="kw">switch (this) {
            case CORNER_LEFT -> var1 ? StairConnectedBlockRuleSet.StairType.INVERTED_CORNER_LEFT : StairConnectedBlockRuleSet.StairType.CORNER_LEFT;
            case CORNER_RIGHT -> var1 ? StairConnectedBlockRuleSet.StairType.INVERTED_CORNER_RIGHT : StairConnectedBlockRuleSet.StairType.CORNER_RIGHT;
         };
      }
   }

   class="kw">public enum StairType {
      STRAIGHT,
      CORNER_LEFT,
      CORNER_RIGHT,
      INVERTED_CORNER_LEFT,
      INVERTED_CORNER_RIGHT;

      class="kw">private class="kw">static class="kw">final StairConnectedBlockRuleSet.StairType[] VALUES = values();

      StairType() {
      }

      @Nonnull
      class="kw">public class="kw">static StairConnectedBlockRuleSet.StairType corner(boolean var0) {
         class="kw">return var0 ? CORNER_RIGHT : CORNER_LEFT;
      }

      @Nonnull
      class="kw">public class="kw">static StairConnectedBlockRuleSet.StairType invertedCorner(boolean var0) {
         class="kw">return var0 ? INVERTED_CORNER_RIGHT : INVERTED_CORNER_LEFT;
      }

      class="kw">public boolean isCorner() {
         class="kw">return this == CORNER_LEFT || this == CORNER_RIGHT;
      }

      class="kw">public boolean isInvertedCorner() {
         class="kw">return this == INVERTED_CORNER_LEFT || this == INVERTED_CORNER_RIGHT;
      }

      class="kw">public boolean isLeft() {
         class="kw">return this == CORNER_LEFT || this == INVERTED_CORNER_LEFT;
      }

      class="kw">public boolean isRight() {
         class="kw">return this == CORNER_RIGHT || this == INVERTED_CORNER_RIGHT;
      }
   }
}