RoofConnectedBlockRuleSet class

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

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

extends: ConnectedBlockRuleSet

implements: StairLikeConnectedBlockRuleSet

Поля (82)

МодификаторыТипИмя
break
Vector3i var10
Rotation var10
BlockSection var10
var10
var10
StairConnectedBlockRuleSet.StairType var11
var11
var11
var11
var11
var11
int var11
ObjectIntPair var11
int var11
StairConnectedBlockRuleSet.StairConnection var12
Ref var12
boolean var12
Ref var12
boolean var13
BlockSection var13
ObjectIntPair var13
int var13
var13
var13
boolean var14
int var14
ObjectIntPair var14
BlockType var14
StairConnectedBlockRuleSet.StairConnection var15
int var15
boolean var15
boolean var15
var15
StairConnectedBlockRuleSet.StairConnection var16
int var16
boolean var16
Map var16
Vector3i var17
StairConnectedBlockRuleSet.StairConnection var17
BlockFaceSupport[] var17
Vector3i var18
Vector3i var18
StairConnectedBlockRuleSet.StairConnection var19
RotationTuple var19
var19
StairConnectedBlockRuleSet.StairType var2
com.hypixel.hytale.protocol.RoofConnectedBlockRuleSet var2
Vector3i var20
boolean var21
BlockType var22
Vector3i var23
Rotation var24
int var25
var25
var25
int var26
StairConnectedBlockRuleSet.StairType var27
BlockType var28
BlockType var29
ConnectedBlocksUtil.ConnectedBlockResult var31
StairConnectedBlockRuleSet.StairType var32
int var33
int var34
Rotation var4
Rotation var5
RotationTuple var5
RotationTuple var6
Vector3ic[] var6
StairConnectedBlockRuleSet.StairType var6
Rotation var7
var7
Rotation[] var7
Store var7
Rotation var8
Store var8
Ref var8
boolean var9
boolean var9
var9
ObjectIntPair var9
BlockSection var9

Методы (42)

МодификаторыВозвратСигнатура
static boolean canBeTopperboolean canBeTopper(@Nonnull ChunkStore var0, @Nonnull Vector3i var1, @Nonnull StairLikeConnectedBlockRuleSet var2, @Nonnull RotationTuple var3, @Nonnull Vector3i var4)
for for(int var10 = 0; var10 < var7 - 1; var10++)
for for(int var8 = 0; var8 < var6.length; var8++)
if if(var9)
if if(var12 != null)
if if(var13)
if if(var16 != null)
if if(var14)
if if(var11 == StairConnectedBlockRuleSet.StairType.STRAIGHT)
if if(var15 != null)
if if(var11 == StairConnectedBlockRuleSet.StairType.STRAIGHT)
if if(var19 != null)
if if(var9)
if if(var13 != null)
if if(var11 == null)
if if(!var12)
if if(var15 == var16)
if if(var1 == null)
if if(var9 == null)
if if(var10 != null)
if if(var14 != null)
if if(var16 != null)
if if(this.topper != null && var27 == StairConnectedBlockRuleSet.StairType.STRAIGHT)
if if(var21)
if if(var22 != null)
if if(this.hollow != null && var15)
if if(var28 != null)
if if(var29 != null)
if if(this.regular != null && this.width > 0)
if if(var32 != null && var32 != StairConnectedBlockRuleSet.StairType.STRAIGHT)
if if(var34 != var33)
if if(this.regular != null)
if if(this.hollow != null)
if if(this.topper != null)
if if(var2 != null)
if if(this.regular != null)
if if(this.hollow != null)
if if(this.topper != null)
static boolean isTopperConnectionCompatibleboolean isTopperConnectionCompatible(@Nonnull RotationTuple var0, @Nullable ObjectIntPair<StairConnectedBlockRuleSet.StairType> var1, @Nonnull Rotation var2)
static boolean isValleyConnectionCompatibleboolean isValleyConnectionCompatible(@Nonnull RotationTuple var0, @Nullable ObjectIntPair<StairConnectedBlockRuleSet.StairType> var1, @Nonnull Rotation var2, boolean var3)
abstract return isValleyConnectionCompatiblereturn isValleyConnectionCompatible(var0, var1, var2, true)
static boolean isWidthFulfilledboolean isWidthFulfilled(@Nonnull ChunkStore var0, @Nonnull Vector3ic var1, @Nonnull Vector3i var2, @Nonnull StairConnectedBlockRuleSet.StairConnection var3, @Nonnull Rotation var4, int var5, int var6, int var7)

Исходный код

Показать/скрыть
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.codecs.simple.IntegerCodec;
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.util.ChunkUtil;
class="kw">import com.hypixel.hytale.math.vector.Vector3iUtil;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.BlockFace;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.BlockFaceSupport;
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 com.hypixel.hytale.server.core.util.FillerBlockUtil;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectIntPair;
class="kw">import java.util.Map;
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 RoofConnectedBlockRuleSet class="kw">extends ConnectedBlockRuleSet class="kw">implements StairLikeConnectedBlockRuleSet {
   @Nonnull
   class="kw">public class="kw">static class="kw">final BuilderCodec<RoofConnectedBlockRuleSet> CODEC = BuilderCodec.builder(RoofConnectedBlockRuleSet.class, RoofConnectedBlockRuleSet::new)
      .append(new KeyedCodec<>("Regular", StairConnectedBlockRuleSet.CODEC), (var0, var1) -> var0.regular = var1, var0 -> var0.regular)
      .addValidator(Validators.nonNull())
      .add()
      .append(new KeyedCodec<>("Hollow", StairConnectedBlockRuleSet.CODEC), (var0, var1) -> var0.hollow = var1, var0 -> var0.hollow)
      .add()
      .append(new KeyedCodec<>("Topper", ConnectedBlockOutput.CODEC), (var0, var1) -> var0.topper = var1, var0 -> var0.topper)
      .add()
      .append(new KeyedCodec<>("Width", new IntegerCodec()), (var0, var1) -> var0.width = var1, var0 -> var0.width)
      .add()
      .append(new KeyedCodec<>("MaterialName", Codec.STRING), (var0, var1) -> var0.materialName = var1, var0 -> var0.materialName)
      .add()
      .build();
   class="kw">private StairConnectedBlockRuleSet regular;
   class="kw">private StairConnectedBlockRuleSet hollow;
   class="kw">private ConnectedBlockOutput topper;
   class="kw">private String materialName;
   class="kw">private int width = 1;

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

   @Nonnull
   class="kw">private class="kw">static StairConnectedBlockRuleSet.StairType getConnectedBlockStairType(
      @Nonnull ChunkStore var0, @Nonnull Vector3ic var1, @Nonnull StairLikeConnectedBlockRuleSet var2, int var3, int var4, int var5
   ) {
      RotationTuple var6 = RotationTuple.get(var4);
      Rotation var7 = var6.yaw();
      Rotation var8 = var6.pitch();
      boolean var9 = var8 != Rotation.None;
      if (var9) {
         var7 = var7.flip();
      }

      Vector3i var10 = new Vector3i();
      StairConnectedBlockRuleSet.StairType var11 = StairConnectedBlockRuleSet.StairType.STRAIGHT;
      StairConnectedBlockRuleSet.StairConnection var12 = StairConnectedBlockRuleSet.getInvertedCornerConnection(var0, var2, var1, var10, var7, var9);
      if (var12 != null) {
         boolean var13 = isWidthFulfilled(var0, var1, var10, var12, var7, var3, var4, var5);
         if (var13) {
            var11 = var12.getStairType(true);
         }
      }

      StairConnectedBlockRuleSet.StairConnection var16 = StairConnectedBlockRuleSet.getCornerConnection(var0, var2, var1, var10, var4, var7, var9, var5);
      if (var16 != null) {
         boolean var14 = isWidthFulfilled(var0, var1, var10, var16, var7, var3, var4, var5);
         if (var14) {
            var11 = var16.getStairType(false);
         }
      }

      if (var11 == StairConnectedBlockRuleSet.StairType.STRAIGHT) {
         Vector3i var17 = new Vector3i(var1).add(0, 1, 0);
         StairConnectedBlockRuleSet.StairConnection var15 = getValleyConnection(var0, var1, var17, var2, var6, var10, false, var3, var4, var5);
         if (var15 != null) {
            var11 = var15.getStairType(true);
         }
      }

      if (var11 == StairConnectedBlockRuleSet.StairType.STRAIGHT) {
         Vector3i var18 = new Vector3i(var1).add(0, -1, 0);
         StairConnectedBlockRuleSet.StairConnection var19 = getValleyConnection(var0, var1, var18, var2, var6, var10, true, var3, var4, var5);
         if (var19 != null) {
            var11 = var19.getStairType(false);
         }
      }

      if (var9) {
         var11 = class="kw">switch (var11) {
            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 -> var11;
         };
      }

      class="kw">return var11;
   }

   class="kw">private class="kw">static boolean isWidthFulfilled(
      @Nonnull ChunkStore var0,
      @Nonnull Vector3ic var1,
      @Nonnull Vector3i var2,
      @Nonnull StairConnectedBlockRuleSet.StairConnection var3,
      @Nonnull Rotation var4,
      int var5,
      int var6,
      int var7
   ) {
      Store var8 = var0.getStore();
      boolean var9 = true;

      for (int var10 = 0; var10 < var7 - 1; var10++) {
         var2.set(var3 == StairConnectedBlockRuleSet.StairConnection.CORNER_LEFT ? Vector3iUtil.WEST : Vector3iUtil.EAST).mul(var10 + 1);
         var4.rotateY(var2, var2);
         int var11 = FillerBlockUtil.pack(var2.x, var2.y, var2.z);
         var2.add(var1);
         Ref var12 = var0.getChunkSectionReferenceAtBlock(var2.x, var2.y, var2.z);
         if (var12 != null && var12.isValid()) {
            BlockSection var13 = var8.getComponent(var12, BlockSection.getComponentType());
            if (var13 != null) {
               int var14 = var13.getRotationIndex(var2.x, var2.y, var2.z);
               int var15 = var13.getFiller(var2.x, var2.y, var2.z);
               int var16 = var13.get(var2.x, var2.y, var2.z);
               if ((var15 != 0 || var16 != var5 || var14 != var6) && (var15 != var11 || var16 != var5 || var14 != var6)) {
                  var9 = false;
                  break;
               }
            }
         }
      }

      class="kw">return var9;
   }

   @Nullable
   class="kw">private class="kw">static StairConnectedBlockRuleSet.StairConnection getValleyConnection(
      @Nonnull ChunkStore var0,
      @Nonnull Vector3ic var1,
      @Nonnull Vector3i var2,
      @Nonnull StairLikeConnectedBlockRuleSet var3,
      @Nonnull RotationTuple var4,
      @Nonnull Vector3i var5,
      boolean var6,
      int var7,
      int var8,
      int var9
   ) {
      Rotation var10 = var4.yaw();
      var5.set(var6 ? Vector3iUtil.SOUTH : Vector3iUtil.NORTH).mul(var9);
      var10.rotateY(var5, var5);
      var5.add(var2.x, var2.y, var2.z);
      ObjectIntPair var11 = StairConnectedBlockRuleSet.getStairData(var0, var5, var3.getMaterialName());
      if (var11 == null) {
         class="kw">return null;
      }

      boolean var12 = var6 ? isTopperConnectionCompatible(var4, var11, Rotation.None) : isValleyConnectionCompatible(var4, var11, Rotation.None, false);
      if (!var12) {
         class="kw">return null;
      }

      var5.set(var6 ? Vector3iUtil.EAST : Vector3iUtil.WEST).mul(var9);
      var10.rotateY(var5, var5);
      var5.add(var2.x, var2.y, var2.z);
      ObjectIntPair var13 = StairConnectedBlockRuleSet.getStairData(var0, var5, var3.getMaterialName());
      var5.set(var6 ? Vector3iUtil.WEST : Vector3iUtil.EAST).mul(var9);
      var10.rotateY(var5, var5);
      var5.add(var2.x, var2.y, var2.z);
      ObjectIntPair var14 = StairConnectedBlockRuleSet.getStairData(var0, var5, var3.getMaterialName());
      boolean var15 = var6 ? isTopperConnectionCompatible(var4, var13, Rotation.Ninety) : isValleyConnectionCompatible(var4, var13, Rotation.Ninety, false);
      boolean var16 = var6
         ? isTopperConnectionCompatible(var4, var14, Rotation.TwoSeventy)
         : isValleyConnectionCompatible(var4, var14, Rotation.TwoSeventy, false);
      if (var15 == var16) {
         class="kw">return null;
      }

      StairConnectedBlockRuleSet.StairConnection var17 = var15
         ? StairConnectedBlockRuleSet.StairConnection.CORNER_LEFT
         : StairConnectedBlockRuleSet.StairConnection.CORNER_RIGHT;
      class="kw">return !isWidthFulfilled(var0, var1, var5, var17, var10, var7, var8, var9) ? null : var17;
   }

   class="kw">private class="kw">static boolean isTopperConnectionCompatible(
      @Nonnull RotationTuple var0, @Nullable ObjectIntPair<StairConnectedBlockRuleSet.StairType> var1, @Nonnull Rotation var2
   ) {
      class="kw">return isValleyConnectionCompatible(var0, var1, var2, true);
   }

   class="kw">private class="kw">static boolean canBeTopper(
      @Nonnull ChunkStore var0, @Nonnull Vector3i var1, @Nonnull StairLikeConnectedBlockRuleSet var2, @Nonnull RotationTuple var3, @Nonnull Vector3i var4
   ) {
      Rotation var5 = var3.yaw();
      Vector3ic[] var6 = new Vector3ic[]{Vector3iUtil.NORTH, Vector3iUtil.SOUTH, Vector3iUtil.EAST, Vector3iUtil.WEST};
      Rotation[] var7 = new Rotation[]{Rotation.OneEighty, Rotation.None, Rotation.Ninety, Rotation.TwoSeventy};

      for (int var8 = 0; var8 < var6.length; var8++) {
         var4.set(var6[var8]);
         var5.rotateY(var4, var4);
         var4.add(var1.x, var1.y, var1.z);
         ObjectIntPair var9 = StairConnectedBlockRuleSet.getStairData(var0, var4, var2.getMaterialName());
         if (var9 == null || !isTopperConnectionCompatible(var3, var9, var7[var8])) {
            class="kw">return false;
         }
      }

      class="kw">return true;
   }

   class="kw">private class="kw">static boolean isValleyConnectionCompatible(
      @Nonnull RotationTuple var0, @Nullable ObjectIntPair<StairConnectedBlockRuleSet.StairType> var1, @Nonnull Rotation var2, boolean var3
   ) {
      Rotation var4 = var0.yaw().add(var2);
      if (var1 == null) {
         class="kw">return false;
      } else {
         RotationTuple var5 = RotationTuple.get(var1.rightInt());
         StairConnectedBlockRuleSet.StairType var6 = (StairConnectedBlockRuleSet.StairType)var1.first();
         if (var5.pitch() != var0.pitch()) {
            class="kw">return false;
         } else if (var3 && var6.isCorner()) {
            class="kw">return false;
         } else {
            class="kw">return !var3 && var6.isInvertedCorner()
               ? false
               : var5.yaw() == var4
                  || var6 == StairConnectedBlockRuleSet.StairConnection.CORNER_RIGHT.getStairType(var3) && var5.yaw() == var4.add(Rotation.Ninety)
                  || var6 == StairConnectedBlockRuleSet.StairConnection.CORNER_LEFT.getStairType(var3) && var5.yaw() == var4.add(Rotation.TwoSeventy);
         }
      }
   }

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

   @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
   ) {
      Store var7 = var1.getStore();
      Ref var8 = var1.getChunkSectionReferenceAtBlock(var2.x(), var2.y(), var2.z());
      if (var8 != null && var8.isValid()) {
         BlockSection var9 = var7.getComponent(var8, BlockSection.getComponentType());
         if (var9 == null) {
            class="kw">return Optional.empty();
         }

         BlockSection var10 = var9;
         int var11 = var2.y() - 1;
         if (!ChunkUtil.isSameChunkSection(var2.x(), var2.y(), var2.z(), var2.x(), var11, var2.z())) {
            Ref var12 = var1.getChunkSectionReferenceAtBlock(var2.x(), var11, var2.z());
            if (var12 != null && var12.isValid()) {
               var10 = var7.getComponent(var12, BlockSection.getComponentType());
            } else {
               var10 = null;
            }
         }

         int var13;
         int var25;
         if (var10 != null) {
            var25 = var10.get(var2.x(), var11, var2.z());
            var13 = var10.getRotationIndex(var2.x(), var11, var2.z());
         } else {
            var25 = 0;
            var13 = 0;
         }

         BlockType var14 = BlockType.getAssetMap().getAsset(var25);
         boolean var15 = true;
         if (var14 != null) {
            Map var16 = var14.getSupporting(var13);
            if (var16 != null) {
               BlockFaceSupport[] var17 = var16.get(BlockFace.UP);
               var15 = var17 == null;
            }
         }

         int var26 = BlockType.getAssetMap().getIndex(var3.getId());
         StairConnectedBlockRuleSet.StairType var27 = getConnectedBlockStairType(var1, var2, this, var26, var4, this.width);
         if (this.topper != null && var27 == StairConnectedBlockRuleSet.StairType.STRAIGHT) {
            Vector3i var18 = new Vector3i(var2).add(0, -1, 0);
            RotationTuple var19 = RotationTuple.get(var4);
            var19 = RotationTuple.of(Rotation.None, var19.pitch(), var19.roll());
            Vector3i var20 = new Vector3i();
            boolean var21 = canBeTopper(var1, var18, this, var19, var20);
            if (var21) {
               BlockType var22 = BlockType.getAssetMap().getAsset(this.topper.blockTypeKey);
               if (var22 != null) {
                  class="kw">return Optional.of(new ConnectedBlocksUtil.ConnectedBlockResult(var22.getId(), var4));
               }
            }
         }

         if (this.hollow != null && var15) {
            BlockType var28 = this.hollow.getStairBlockType(var27);
            if (var28 != null) {
               class="kw">return Optional.of(new ConnectedBlocksUtil.ConnectedBlockResult(var28.getId(), var4));
            }
         }

         BlockType var29 = this.regular.getStairBlockType(var27);
         if (var29 != null) {
            ConnectedBlocksUtil.ConnectedBlockResult var31 = new ConnectedBlocksUtil.ConnectedBlockResult(var29.getId(), var4);
            if (this.regular != null && this.width > 0) {
               StairConnectedBlockRuleSet.StairType var32 = this.regular.getStairType(BlockType.getAssetMap().getIndex(var3.getId()));
               if (var32 != null && var32 != StairConnectedBlockRuleSet.StairType.STRAIGHT) {
                  int var33 = var32.isLeft() ? -(this.width - 1) : (var32.isRight() ? this.width - 1 : 0);
                  int var34 = var27.isLeft() ? -(this.width - 1) : (var27.isRight() ? this.width - 1 : 0);
                  if (var34 != var33) {
                     Vector3i var23 = new Vector3i();
                     Rotation var24 = RotationTuple.get(var4).yaw();
                     var23.set(Vector3iUtil.EAST).mul(var33);
                     var24.rotateY(var23, var23);
                     var31.addAdditionalBlock(var23, var29.getId(), var4);
                  }
               }
            }

            class="kw">return Optional.of(var31);
         } else {
            class="kw">return Optional.empty();
         }
      } else {
         class="kw">return Optional.empty();
      }
   }

   @Override
   class="kw">public void updateCachedBlockTypes(@Nonnull BlockType var1, @Nonnull BlockTypeAssetMap<String, BlockType> var2) {
      if (this.regular != null) {
         this.regular.updateCachedBlockTypes(var1, var2);
      }

      if (this.hollow != null) {
         this.hollow.updateCachedBlockTypes(var1, var2);
      }

      if (this.topper != null) {
         this.topper.resolve(var1, var2);
      }
   }

   @Nullable
   @Override
   class="kw">public StairConnectedBlockRuleSet.StairType getStairType(int var1) {
      StairConnectedBlockRuleSet.StairType var2 = this.regular.getStairType(var1);
      if (var2 != null) {
         class="kw">return var2;
      } else {
         class="kw">return this.hollow != null ? this.hollow.getStairType(var1) : null;
      }
   }

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

   @Nullable
   @Override
   class="kw">public com.hypixel.hytale.protocol.ConnectedBlockRuleSet toPacket(@Nonnull BlockTypeAssetMap<String, BlockType> var1) {
      com.hypixel.hytale.protocol.RoofConnectedBlockRuleSet var2 = new com.hypixel.hytale.protocol.RoofConnectedBlockRuleSet();
      if (this.regular != null) {
         var2.regular = this.regular.toProtocol(var1);
      }

      if (this.hollow != null) {
         var2.hollow = this.hollow.toProtocol(var1);
      }

      if (this.topper != null) {
         var2.topperBlockId = var1.getIndex(this.topper.blockTypeKey);
      } else {
         var2.topperBlockId = -1;
      }

      var2.width = this.width;
      var2.materialName = this.materialName;
      class="kw">return var2;
   }
}