AxisRotation enum

Пакет: com.hypixel.hytale.builtin.triggervolumes.effect.builtin.conditions

Файл: com/hypixel/hytale/builtin/triggervolumes/effect/builtin/conditions/BlockTypeCondition.java

Поля (1)

МодификаторыТипИмя
private final Rotation rotation

Методы (4)

МодификаторыВозвратСигнатура
abstract DEG_270 DEG_270(Rotation.TwoSeventy)
public boolean matchespublic boolean matches(@Nonnull Rotation var1)
private static BlockTypeCondition.AxisRotation ofprivate static BlockTypeCondition.AxisRotation of(@Nonnull Rotation var0)
return switchreturn switch(var0)

Исходный код

Показать/скрыть
class="kw">package com.hypixel.hytale.builtin.triggervolumes.effect.builtin.conditions;

class="kw">import com.hypixel.hytale.builtin.triggervolumes.YawRotation;
class="kw">import com.hypixel.hytale.builtin.triggervolumes.effect.TriggerCondition;
class="kw">import com.hypixel.hytale.builtin.triggervolumes.effect.TriggerContext;
class="kw">import com.hypixel.hytale.builtin.triggervolumes.effect.TriggerEventType;
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.EnumCodec;
class="kw">import com.hypixel.hytale.component.Ref;
class="kw">import com.hypixel.hytale.math.util.ChunkUtil;
class="kw">import com.hypixel.hytale.math.util.MathUtil;
class="kw">import com.hypixel.hytale.math.vector.Vector3dUtil;
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.World;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.BlockChunk;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.ChunkStore;
class="kw">import java.util.Arrays;
class="kw">import java.util.List;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">import org.joml.Vector3d;

class="kw">public class BlockTypeCondition class="kw">extends TriggerCondition {
   @Nonnull
   class="kw">public class="kw">static class="kw">final BuilderCodec<BlockTypeCondition> CODEC = BuilderCodec.builder(BlockTypeCondition.class, BlockTypeCondition::new, BASE_CODEC)
      .append(
         new KeyedCodec<>("BlockType", Codec.STRING_ARRAY, false),
         (var0, var1) -> var0.blockTypes = var1 != null ? var1 : new String[0],
         var0 -> var0.blockTypes.length == 0 ? null : var0.blockTypes
      )
      .add()
      .append(
         new KeyedCodec<>("PositionSource", new EnumCodec<>(BlockTypeCondition.PositionSource.class), false),
         (var0, var1) -> var0.positionSource = var1 != null ? var1 : BlockTypeCondition.PositionSource.EVENT,
         var0 -> var0.positionSource
      )
      .add()
      .append(
         new KeyedCodec<>("PositionOffset", Vector3dUtil.CODEC, false),
         (var0, var1) -> var0.positionOffset = var1 != null ? var1 : new Vector3d(),
         var0 -> var0.hasOffset() ? var0.positionOffset : null
      )
      .add()
      .append(
         new KeyedCodec<>("RotationX", new EnumCodec<>(BlockTypeCondition.AxisRotation.class), false),
         (var0, var1) -> var0.rotationX = var1 != null ? var1 : BlockTypeCondition.AxisRotation.ANY,
         var0 -> var0.rotationX == BlockTypeCondition.AxisRotation.ANY ? null : var0.rotationX
      )
      .add()
      .append(
         new KeyedCodec<>("RotationY", new EnumCodec<>(BlockTypeCondition.AxisRotation.class), false),
         (var0, var1) -> var0.rotationY = var1 != null ? var1 : BlockTypeCondition.AxisRotation.ANY,
         var0 -> var0.rotationY == BlockTypeCondition.AxisRotation.ANY ? null : var0.rotationY
      )
      .add()
      .append(
         new KeyedCodec<>("RotationZ", new EnumCodec<>(BlockTypeCondition.AxisRotation.class), false),
         (var0, var1) -> var0.rotationZ = var1 != null ? var1 : BlockTypeCondition.AxisRotation.ANY,
         var0 -> var0.rotationZ == BlockTypeCondition.AxisRotation.ANY ? null : var0.rotationZ
      )
      .add()
      .append(
         new KeyedCodec<>("State", Codec.STRING, false),
         (var0, var1) -> var0.state = var1 != null ? var1 : "",
         var0 -> var0.state.isEmpty() ? null : var0.state
      )
      .add()
      .build();
   @Nonnull
   class="kw">private String[] blockTypes = new String[0];
   @Nonnull
   class="kw">private String state = "";
   @Nonnull
   class="kw">private BlockTypeCondition.AxisRotation rotationX = BlockTypeCondition.AxisRotation.ANY;
   @Nonnull
   class="kw">private BlockTypeCondition.AxisRotation rotationY = BlockTypeCondition.AxisRotation.ANY;
   @Nonnull
   class="kw">private BlockTypeCondition.AxisRotation rotationZ = BlockTypeCondition.AxisRotation.ANY;
   @Nonnull
   class="kw">private BlockTypeCondition.PositionSource positionSource = BlockTypeCondition.PositionSource.EVENT;
   @Nonnull
   class="kw">private Vector3d positionOffset = new Vector3d();

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

   @Nonnull
   class="kw">public class="kw">static BlockTypeCondition create(@Nonnull TriggerEventType var0, @Nonnull String... var1) {
      BlockTypeCondition var2 = new BlockTypeCondition();
      var2.setEventType(var0);
      var2.blockTypes = var1;
      class="kw">return var2;
   }

   @Override
   class="kw">public boolean test(@Nonnull TriggerContext var1) {
      if (this.positionSource == BlockTypeCondition.PositionSource.EVENT && !this.hasOffset() && this.state.isEmpty()) {
         String var8 = var1.getBlockId();
         if (var8 == null) {
            class="kw">return false;
         } else {
            class="kw">return !this.matchesBlockTypes(var8, null) ? false : this.matchesRotation(var1, var1.getBlockPosition());
         }
      } else {
         Vector3d var2 = this.resolvePosition(var1);
         if (var2 == null) {
            class="kw">return false;
         }

         World var3 = var1.getStore().getExternalData().getWorld();
         if (var3 == null) {
            class="kw">return false;
         }

         int var4 = MathUtil.floor(var2.x());
         int var5 = MathUtil.floor(var2.y());
         int var6 = MathUtil.floor(var2.z());
         BlockType var7 = var3.getBlockType(var4, var5, var6);
         if (var7 != null && var7 != BlockType.EMPTY) {
            if (!this.matchesBlockTypes(var7.getId(), var7)) {
               class="kw">return false;
            } else {
               class="kw">return !this.matchesState(var7) ? false : this.matchesRotation(var1, var2);
            }
         } else {
            class="kw">return false;
         }
      }
   }

   @Override
   class="kw">public void rotateInPlace(float var1, @Nonnull Vector3d var2) {
      if (this.positionSource == BlockTypeCondition.PositionSource.VOLUME_ORIGIN && this.positionOffset != null) {
         YawRotation.rotateBlockOffset(this.positionOffset, var1, var2);
      }

      int var3 = YawRotation.quarterTurns(var1);
      if (var3 > 0 && this.rotationY != BlockTypeCondition.AxisRotation.ANY && this.rotationY.rotation != null) {
         this.rotationY = BlockTypeCondition.AxisRotation.of(YawRotation.rotate(this.rotationY.rotation, var3));
      }
   }

   @Nullable
   class="kw">private Vector3d resolvePosition(@Nonnull TriggerContext var1) {
      Vector3d var2 = class="kw">switch (this.positionSource) {
         case EVENT -> var1.getBlockPosition();
         case VOLUME_ORIGIN -> new Vector3d(var1.getVolume().getPosition());
         case ENTITY -> var1.getActorPosition();
         case WORLD_ABSOLUTE -> new Vector3d();
      };
      class="kw">return var2 != null ? var2.add(this.positionOffset) : null;
   }

   class="kw">private boolean matchesBlockTypes(@Nonnull String var1, @Nullable BlockType var2) {
      if (this.blockTypes.length == 0) {
         class="kw">return true;
      }

      List var3 = Arrays.asList(this.blockTypes);
      if (var3.contains(var1)) {
         class="kw">return true;
      }

      if (var2 == null) {
         var2 = BlockType.getAssetMap().getAsset(var1);
         if (var2 == null) {
            class="kw">return false;
         }
      }

      String var4 = var2.getBlockKeyForState("class="kw">default");
      class="kw">return var4 != null && var3.contains(var4);
   }

   class="kw">private boolean matchesState(@Nonnull BlockType var1) {
      if (this.state.isEmpty()) {
         class="kw">return true;
      }

      String var2 = var1.getStateForBlock(var1);
      if (var2 == null) {
         var2 = "class="kw">default";
      }

      for (String var6 : this.state.split(",", -1)) {
         String var7 = var6.trim();
         if (!var7.isEmpty() && var7.equalsIgnoreCase(var2)) {
            class="kw">return true;
         }
      }

      class="kw">return false;
   }

   class="kw">private boolean matchesRotation(@Nonnull TriggerContext var1, @Nullable Vector3d var2) {
      if (this.rotationX == BlockTypeCondition.AxisRotation.ANY
         && this.rotationY == BlockTypeCondition.AxisRotation.ANY
         && this.rotationZ == BlockTypeCondition.AxisRotation.ANY) {
         class="kw">return true;
      }

      if (var2 == null) {
         class="kw">return false;
      }

      World var3 = var1.getStore().getExternalData().getWorld();
      if (var3 == null) {
         class="kw">return false;
      }

      int var4 = MathUtil.floor(var2.x());
      int var5 = MathUtil.floor(var2.y());
      int var6 = MathUtil.floor(var2.z());
      ChunkStore var7 = var3.getChunkStore();
      Ref var8 = var7.getChunkReference(ChunkUtil.indexChunkFromBlock(var4, var6));
      if (var8 != null && var8.isValid()) {
         BlockChunk var9 = var7.getStore().getComponent(var8, BlockChunk.getComponentType());
         if (var9 == null) {
            class="kw">return false;
         }

         int var10 = var9.getSectionAtBlockY(var5).getRotationIndex(var4, var5, var6);
         RotationTuple var11 = RotationTuple.get(var10);
         class="kw">return this.rotationX.matches(var11.pitch()) && this.rotationY.matches(var11.yaw()) && this.rotationZ.matches(var11.roll());
      } else {
         class="kw">return false;
      }
   }

   class="kw">private boolean hasOffset() {
      class="kw">return this.positionOffset.x() != 0.0 || this.positionOffset.y() != 0.0 || this.positionOffset.z() != 0.0;
   }

   class="kw">public enum AxisRotation {
      ANY(null),
      DEG_0(Rotation.None),
      DEG_90(Rotation.Ninety),
      DEG_180(Rotation.OneEighty),
      DEG_270(Rotation.TwoSeventy);

      @Nullable
      class="kw">private class="kw">final Rotation rotation;

      AxisRotation(@Nullable Rotation nullxx) {
         this.rotation = nullxx;
      }

      class="kw">public boolean matches(@Nonnull Rotation var1) {
         class="kw">return this.rotation == null || this.rotation == var1;
      }

      @Nonnull
      class="kw">private class="kw">static BlockTypeCondition.AxisRotation of(@Nonnull Rotation var0) {
         class="kw">return class="kw">switch (var0) {
            case None -> DEG_0;
            case Ninety -> DEG_90;
            case OneEighty -> DEG_180;
            case TwoSeventy -> DEG_270;
         };
      }
   }

   class="kw">public enum PositionSource {
      EVENT,
      VOLUME_ORIGIN,
      ENTITY,
      WORLD_ABSOLUTE;

      PositionSource() {
      }
   }
}