CustomConnectedBlockPattern class

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

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

extends: CustomTemplateConnectedBlockPattern

Поля (46)

МодификаторыТипИмя
break
Set var10
Vector3i var10
var10
CustomConnectedBlockTemplateAsset var11
Rotation3D var11
Rotation3D var12
RotationTuple var13
var13
var13
ConnectedBlockShape var14
List var14
Map var15
int var15
Pair var16
RotationTuple var17
Vector3i var18
boolean var21
BlockType var22
HashSet var23
int var25
int var26
var26
var26
var26
var26
Rotation var27
int var28
BlockPattern var30
BlockPattern.BlockEntry var31
BlockType var32
BlockFlipType var33
Ref var34
RotationTuple var35
var35
var35
var35
var35
Store var38
Rotation var39
BlockSection var40
BlockType var41
boolean var45
BlockType var6
int var9
CustomConnectedBlockTemplateAsset var9

Методы (13)

МодификаторыВозвратСигнатура
static boolean checkPatternRuleAgainstBlockTypeboolean checkPatternRuleAgainstBlockType(@Nonnull CustomTemplateConnectedBlockRuleSet var0, @Nonnull CustomConnectedBlockTemplateAsset var1, @Nonnull ConnectedBlockPatternRule var2, @Nonnull String var3, @Nonnull RotationTuple var4, int var5)
for for(String var13 : var10)
for for(ConnectedBlockPatternRule var20 : this.rulesToMatch)
if if(var11 == null)
if if(var21)
if if(var9 == null)
if if(this.transformRulesToOrientation)
if if(var40 == null)
if if(var41 == null)
if if(!var45)
if if(var30 == null)
if if(var31 == null)
if if(var32 == null)

Исходный код

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

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.array.ArrayCodec;
class="kw">import com.hypixel.hytale.codec.codecs.simple.BooleanCodec;
class="kw">import com.hypixel.hytale.component.Ref;
class="kw">import com.hypixel.hytale.component.Store;
class="kw">import com.hypixel.hytale.math.Axis;
class="kw">import com.hypixel.hytale.math.util.HashUtil;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.BlockFlipType;
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.asset.type.buildertool.config.BlockTypeListAsset;
class="kw">import com.hypixel.hytale.server.core.prefab.selection.mask.BlockPattern;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.section.BlockSection;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.ChunkStore;
class="kw">import it.unimi.dsi.fastutil.Pair;
class="kw">import java.util.HashSet;
class="kw">import java.util.List;
class="kw">import java.util.Map;
class="kw">import java.util.Optional;
class="kw">import java.util.Random;
class="kw">import java.util.Set;
class="kw">import java.util.Map.Entry;
class="kw">import javax.annotation.Nonnull;
class="kw">import org.joml.Vector3i;
class="kw">import org.joml.Vector3ic;

class="kw">public class CustomConnectedBlockPattern class="kw">extends CustomTemplateConnectedBlockPattern {
   @Nonnull
   class="kw">public class="kw">static class="kw">final BuilderCodec<CustomConnectedBlockPattern> CODEC = BuilderCodec.builder(
         CustomConnectedBlockPattern.class, CustomConnectedBlockPattern::new
      )
      .append(
         new KeyedCodec<>("TransformRulesToOrientation", Codec.BOOLEAN, false),
         (var0, var1) -> var0.transformRulesToOrientation = var1,
         var0 -> var0.transformRulesToOrientation
      )
      .documentation("If the rules should be transformed to the current orientation of the block.")
      .add()
      .<Rotation>append(
         new KeyedCodec<>("YawToApplyAddReplacedBlockType", Rotation.CODEC, false),
         (var0, var1) -> var0.yawToApplyAddReplacedBlockType = var1,
         var0 -> var0.yawToApplyAddReplacedBlockType
      )
      .documentation(
         "Apply an additional Yaw to the resulting BlockType represented by this shape. This allows your replacement to be offset from your original placement"
      )
      .add()
      .<Boolean>append(
         new KeyedCodec<>("RequireFaceTagsMatchingRoll", Codec.BOOLEAN, false),
         (var0, var1) -> var0.requireFaceTagsMatchingRoll = var1,
         var0 -> var0.requireFaceTagsMatchingRoll
      )
      .documentation("Adds Roll comparison to face tag matching in patterns below")
      .add()
      .<PatternRotationDefinition>append(
         new KeyedCodec<>("AllowedPatternTransformations", PatternRotationDefinition.CODEC, false),
         (var0, var1) -> var0.patternRotationDefinition = var1,
         var0 -> var0.patternRotationDefinition
      )
      .documentation(
         "Will create additional generated patterns that are variants of this pattern, but rotated/mirrored/flipped to achieve different results. A common example of this is the Fence, which should its resulting shape based on the rotation of its pattern (fence corner rotates depending on which two sides have the corner fence shape)"
      )
      .add()
      .<ConnectedBlockPatternRule[]>append(
         new KeyedCodec<>("RulesToMatch", new ArrayCodec<>(ConnectedBlockPatternRule.CODEC, ConnectedBlockPatternRule[]::new), true),
         (var0, var1) -> var0.rulesToMatch = var1,
         var0 -> var0.rulesToMatch
      )
      .documentation("All rules must match in order for the pattern to match")
      .add()
      .<Boolean>append(
         new KeyedCodec<>("OnlyOnPlacement", new BooleanCodec(), false), (var0, var1) -> var0.onlyOnPlacement = var1, var0 -> var0.onlyOnPlacement
      )
      .documentation("If true, this pattern will only be checked when the block is first placed.")
      .add()
      .<Boolean>append(new KeyedCodec<>("OnlyOnUpdate", new BooleanCodec(), false), (var0, var1) -> var0.onlyOnUpdate = var1, var0 -> var0.onlyOnUpdate)
      .documentation("If true, this pattern will only be checked when the block is updated by neighboring block changes.")
      .add()
      .build();
   @Nonnull
   class="kw">private class="kw">static class="kw">final Random random = new Random();
   class="kw">private boolean transformRulesToOrientation = true;
   class="kw">private PatternRotationDefinition patternRotationDefinition = PatternRotationDefinition.DEFAULT;
   class="kw">private ConnectedBlockPatternRule[] rulesToMatch;
   class="kw">private Rotation yawToApplyAddReplacedBlockType;
   class="kw">private boolean requireFaceTagsMatchingRoll;
   class="kw">private boolean onlyOnUpdate;
   class="kw">private boolean onlyOnPlacement;

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

   class="kw">private class="kw">static boolean checkPatternRuleAgainstBlockType(
      @Nonnull CustomTemplateConnectedBlockRuleSet var0,
      @Nonnull CustomConnectedBlockTemplateAsset var1,
      @Nonnull ConnectedBlockPatternRule var2,
      @Nonnull String var3,
      @Nonnull RotationTuple var4,
      int var5
   ) {
      if (!var2.getFaceTags().getDirections().isEmpty()) {
         BlockType var6 = BlockType.getAssetMap().getAsset(var3);
         if (!(var6.getConnectedBlockRuleSet() class="kw">instanceof CustomTemplateConnectedBlockRuleSet var8)) {
            class="kw">return !var2.isInclude();
         }

         int var9 = BlockType.getAssetMap().getIndex(var3);
         Set var10 = var8.getShapesForBlockType(var9);
         CustomConnectedBlockTemplateAsset var11 = var8.getShapeTemplateAsset();
         if (var11 == null) {
            class="kw">return !var2.isInclude();
         }

         for (String var13 : var10) {
            if (var1.connectsToOtherMaterials || var0.getShapeNameToBlockPatternMap().equals(var8.getShapeNameToBlockPatternMap())) {
               ConnectedBlockShape var14 = var11.connectedBlockShapes.get(var13);
               Map var15 = var2.getFaceTags().getBlockFaceTags();

               for (Entry var17 : var15.entrySet()) {
                  Vector3i var18 = Rotation.rotate(new Vector3i(var17.getKey()), Rotation.None.subtract(var4.yaw()), Rotation.None);

                  for (String var20 : var17.getValue()) {
                     boolean var21 = var14.getFaceTags() != null && var14.getFaceTags().contains(var18, var20);
                     if (var21) {
                        class="kw">return var2.isInclude();
                     }
                  }
               }
            }
         }
      }

      if (!var2.getShapeBlockTypeKeys().isEmpty()) {
         BlockType var22 = BlockType.getAssetMap().getAsset(var3);
         if (!(var22.getConnectedBlockRuleSet() class="kw">instanceof CustomTemplateConnectedBlockRuleSet var26)) {
            class="kw">return !var2.isInclude();
         }

         int var28 = BlockType.getAssetMap().getIndex(var3);

         for (String var33 : var26.getShapesForBlockType(var28)) {
            if ((var1.connectsToOtherMaterials || var0.getShapeNameToBlockPatternMap().equals(var26.getShapeNameToBlockPatternMap()))
               && var2.getShapeBlockTypeKeys().contains(new BlockPattern.BlockEntry(var33, var4.index(), var5))) {
               class="kw">return var2.isInclude();
            }
         }
      }

      HashSet var23 = var2.getBlockTypes();
      if (!var23.isEmpty() && var23.contains(var3)) {
         class="kw">return var2.isInclude();
      }

      if (var2.getBlockTypeListAssets() != null) {
         for (BlockTypeListAsset var31 : var2.getBlockTypeListAssets()) {
            if (var31.getBlockTypeKeys().contains(var3)) {
               class="kw">return var2.isInclude();
            }
         }
      }

      class="kw">return !var2.isInclude();
   }

   @Nonnull
   @Override
   class="kw">public Optional<ConnectedBlocksUtil.ConnectedBlockResult> getConnectedBlockTypeKey(
      @Nonnull String var1,
      @Nonnull ChunkStore var2,
      @Nonnull Vector3ic var3,
      @Nonnull CustomTemplateConnectedBlockRuleSet var4,
      @Nonnull BlockType var5,
      int var6,
      @Nonnull Vector3ic var7,
      boolean var8
   ) {
      if ((!var8 || !this.onlyOnUpdate) && (var8 || !this.onlyOnPlacement)) {
         CustomConnectedBlockTemplateAsset var9 = var4.getShapeTemplateAsset();
         if (var9 == null) {
            class="kw">return Optional.empty();
         }

         Vector3i var10 = new Vector3i();
         Rotation3D var11 = new Rotation3D(Rotation.None, Rotation.None, Rotation.None);
         Rotation3D var12 = new Rotation3D(Rotation.None, Rotation.None, Rotation.None);
         List var14 = this.patternRotationDefinition.getRotations();
         int var15 = 0;

         label110:
         while (var15 < var14.size()) {
            Pair var16 = var14.get(var15);
            var11.assign((Rotation)var16.first(), Rotation.None, Rotation.None);
            if (this.transformRulesToOrientation) {
               RotationTuple var17 = RotationTuple.get(var6);
               var12.assign(var17.yaw(), var17.pitch(), var17.roll());
               var11.add(var12);
            }

            label107:
            for (ConnectedBlockPatternRule var20 : this.rulesToMatch) {
               var10.set(var20.getRelativePosition());
               class="kw">switch ((PatternRotationDefinition.MirrorAxis)var16.second()) {
                  case X:
                     var10.x = -var10.x();
                     break;
                  case Z:
                     var10.z = -var10.z();
                  case NONE:
               }

               if (var20.getPlacementNormals() != null) {
                  for (ConnectedBlockPatternRule.AdjacentSide var24 : var20.getPlacementNormals()) {
                     if (var24.relativePosition.equals(var7)) {
                        class="kw">continue label107;
                     }
                  }

                  class="kw">return Optional.empty();
               } else {
                  var10 = Rotation.rotate(var10, var11.rotationYaw, var11.rotationPitch, var11.rotationRoll);
                  var10.add(var3);
                  Ref var34 = var2.getChunkSectionReferenceAtBlock(var10.x, var10.y, var10.z);
                  if (var34 == null || !var34.isValid()) {
                     class="kw">return Optional.empty();
                  }

                  Store var38 = var2.getStore();
                  BlockSection var40 = var38.getComponent(var34, BlockSection.getComponentType());
                  if (var40 == null) {
                     class="kw">return Optional.empty();
                  }

                  BlockType var41 = BlockType.getAssetMap().getAsset(var40.get(var10.x, var10.y, var10.z));
                  if (var41 == null) {
                     class="kw">return Optional.empty();
                  }

                  int var25 = var10.y;
                  RotationTuple var13 = var40.getRotation(var10.x, var25, var10.z);
                  int var26 = var40.getFiller(var10.x, var25, var10.z);
                  var12.assign(var13);
                  var12.subtract(var11);
                  var26 = var12.rotationPitch.subtract(var13.pitch()).rotateX(var26);
                  var26 = var12.rotationYaw.subtract(var13.yaw()).rotateY(var26);
                  var26 = var12.rotationRoll.subtract(var13.roll()).rotateZ(var26);
                  var13 = RotationTuple.of(var12.rotationYaw, var12.rotationPitch, var12.rotationRoll);
                  if (var16.second() != PatternRotationDefinition.MirrorAxis.NONE) {
                     Rotation var27 = var41.getFlipType().flipYaw(var13.yaw(), var16.second() == PatternRotationDefinition.MirrorAxis.X ? Axis.X : Axis.Z);
                     var26 = var27.subtract(var13.yaw()).rotateY(var26);
                     var13 = RotationTuple.of(var27, var13.pitch(), var13.roll());
                  }

                  boolean var45 = checkPatternRuleAgainstBlockType(var4, var9, var20, var41.getId(), var13, var26);
                  if (!var45) {
                     var15++;
                     class="kw">continue label110;
                  }
               }
            }

            BlockPattern var30 = var4.getShapeNameToBlockPatternMap().get(var1);
            if (var30 == null) {
               class="kw">return Optional.empty();
            }

            random.setSeed(HashUtil.hash(var3.x(), var3.y(), var3.z()));
            BlockPattern.BlockEntry var31 = var30.nextBlockTypeKey(random);
            if (var31 == null) {
               class="kw">return Optional.empty();
            }

            BlockType var32 = BlockType.getAssetMap().getAsset(var31.blockTypeKey());
            if (var32 == null) {
               class="kw">return Optional.empty();
            }

            BlockFlipType var33 = var32.getFlipType();
            RotationTuple var35 = RotationTuple.get(var31.rotation());
            var35 = RotationTuple.of(var35.yaw().add(this.yawToApplyAddReplacedBlockType), var35.pitch(), var35.roll());
            if (var16.second() != PatternRotationDefinition.MirrorAxis.NONE) {
               Rotation var39 = var33.flipYaw(var35.yaw(), var16.second() == PatternRotationDefinition.MirrorAxis.X ? Axis.X : Axis.Z);
               var35 = RotationTuple.of(var39, var35.pitch(), var35.roll());
            }

            var35 = RotationTuple.of(var35.yaw().add(var11.rotationYaw), var35.pitch().add(var11.rotationPitch), var35.roll().add(var11.rotationRoll));
            if (var35.pitch().equals(Rotation.OneEighty) && var33.equals(BlockFlipType.ORTHOGONAL)) {
               var35 = RotationTuple.of(var35.yaw().subtract(Rotation.Ninety), var35.pitch(), var35.roll());
            }

            class="kw">return Optional.of(new ConnectedBlocksUtil.ConnectedBlockResult(var31.blockTypeKey(), var35.index()));
         }

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