DoorAction enum

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

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

Поля (1)

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

Исходный код

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

class="kw">import com.hypixel.hytale.builtin.triggervolumes.effect.TriggerContext;
class="kw">import com.hypixel.hytale.builtin.triggervolumes.effect.TriggerEffect;
class="kw">import com.hypixel.hytale.builtin.triggervolumes.manager.VolumeEntry;
class="kw">import com.hypixel.hytale.builtin.triggervolumes.shape.TriggerVolumeShape;
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.component.Store;
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.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.modules.interaction.DoorBlockUtils;
class="kw">import com.hypixel.hytale.server.core.universe.world.World;
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 com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
class="kw">import com.hypixel.hytale.server.core.util.FillerBlockUtil;
class="kw">import it.unimi.dsi.fastutil.longs.LongOpenHashSet;
class="kw">import javax.annotation.Nonnull;
class="kw">import org.joml.Vector3d;
class="kw">import org.joml.Vector3i;

class="kw">public class ControlDoorsEffect class="kw">extends TriggerEffect {
   @Nonnull
   class="kw">public class="kw">static class="kw">final BuilderCodec<ControlDoorsEffect> CODEC = BuilderCodec.builder(ControlDoorsEffect.class, ControlDoorsEffect::new, BASE_CODEC)
      .append(new KeyedCodec<>("Action", new EnumCodec<>(ControlDoorsEffect.DoorAction.class)), (var0, var1) -> var0.action = var1, var0 -> var0.action)
      .add()
      .build();
   @Nonnull
   class="kw">private ControlDoorsEffect.DoorAction action = ControlDoorsEffect.DoorAction.CLOSE;

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

   @Override
   class="kw">public void execute(@Nonnull TriggerContext var1) {
      Store var2 = var1.getStore();
      World var3 = var2.getExternalData().getWorld();
      Vector3d var4 = var1.getActorPosition();
      Vector3d var5 = var4 != null ? var4 : new Vector3d(var1.getVolume().getPosition());
      ChunkStore var6 = var3.getChunkStore();
      Store var7 = var6.getStore();
      Vector3d var8 = new Vector3d();
      Vector3d var9 = new Vector3d();
      LongOpenHashSet var10 = new LongOpenHashSet();

      for (VolumeEntry var12 : var1.getSpatialVolumes()) {
         TriggerVolumeShape var13 = var12.getShape();
         Vector3d var14 = var12.getPosition();
         var13.getWorldAABB(var14, var8, var9);
         int var15 = MathUtil.floor(var8.x());
         int var16 = MathUtil.floor(var8.y());
         int var17 = MathUtil.floor(var8.z());
         int var18 = MathUtil.floor(var9.x());
         int var19 = MathUtil.floor(var9.y());
         int var20 = MathUtil.floor(var9.z());

         for (int var21 = var15; var21 <= var18; var21++) {
            for (int var22 = var16; var22 <= var19; var22++) {
               for (int var23 = var17; var23 <= var20; var23++) {
                  Ref var24 = var6.getChunkSectionReferenceAtBlock(var21, var22, var23);
                  if (var24 != null && var24.isValid()) {
                     BlockSection var25 = var7.getComponent(var24, BlockSection.getComponentType());
                     if (var25 != null) {
                        BlockType var26 = BlockType.getAssetMap().getAsset(var25.get(var21, var22, var23));
                        if (var26 != null && var26.isDoor()) {
                           Vector3i var27 = doorAnchorForCell(var6, var21, var22, var23);
                           if (var10.add(BlockUtil.pack(var27.x, var27.y, var27.z))) {
                              Ref var28 = var6.getChunkSectionReferenceAtBlock(var27.x, var27.y, var27.z);
                              if (var28 != null && var28.isValid()) {
                                 BlockSection var29 = var7.getComponent(var28, BlockSection.getComponentType());
                                 if (var29 != null) {
                                    BlockType var30 = BlockType.getAssetMap().getAsset(var29.get(var27.x, var27.y, var27.z));
                                    if (var30 != null && var30.isDoor()) {
                                       this.applyDoorState(var3, var6, var29, var30, var27.x, var27.y, var27.z, var5);
                                    }
                                 }
                              }
                           }
                        }
                     }
                  }
               }
            }
         }
      }
   }

   @Nonnull
   class="kw">private class="kw">static Vector3i doorAnchorForCell(@Nonnull ChunkStore var0, int var1, int var2, int var3) {
      Ref var4 = var0.getChunkSectionReferenceAtBlock(var1, var2, var3);
      if (var4 != null && var4.isValid()) {
         BlockSection var5 = var0.getStore().getComponent(var4, BlockSection.getComponentType());
         if (var5 == null) {
            class="kw">return new Vector3i(var1, var2, var3);
         }

         int var6 = var5.getFiller(var1, var2, var3);
         class="kw">return var6 == 0
            ? new Vector3i(var1, var2, var3)
            : new Vector3i(var1 - FillerBlockUtil.unpackX(var6), var2 - FillerBlockUtil.unpackY(var6), var3 - FillerBlockUtil.unpackZ(var6));
      } else {
         class="kw">return new Vector3i(var1, var2, var3);
      }
   }

   class="kw">private void applyDoorState(
      @Nonnull World var1, @Nonnull ChunkStore var2, @Nonnull BlockSection var3, @Nonnull BlockType var4, int var5, int var6, int var7, @Nonnull Vector3d var8
   ) {
      Vector3i var9 = new Vector3i(var5, var6, var7);
      String var10 = var4.getStateForBlock(var4);
      DoorBlockUtils.DoorState var11 = DoorBlockUtils.DoorState.fromBlockState(var10);
      if (this.action == ControlDoorsEffect.DoorAction.OPEN) {
         if (var11 != DoorBlockUtils.DoorState.CLOSED) {
            class="kw">return;
         }

         DoorBlockUtils.DoorState var12;
         if (DoorBlockUtils.isHorizontalDoor(var4)) {
            var12 = DoorBlockUtils.DoorState.OPENED_IN;
         } else {
            int var13 = var3.getRotationIndex(var5, var6, var7);
            Rotation var14 = RotationTuple.get(var13).yaw();
            var12 = DoorBlockUtils.isInFrontOfDoor(var9, var14, var8) ? DoorBlockUtils.DoorState.OPENED_OUT : DoorBlockUtils.DoorState.OPENED_IN;
         }

         DoorBlockUtils.DoorState var18 = DoorBlockUtils.getOppositeDoorState(var12);
         tryOpen(var1, var2, var9, var4, var12);
         Ref var19 = var2.getChunkSectionReferenceAtBlock(var5, var6, var7);
         if (var19 == null || !var19.isValid()) {
            class="kw">return;
         }

         BlockSection var15 = var2.getStore().getComponent(var19, BlockSection.getComponentType());
         if (var15 == null) {
            class="kw">return;
         }

         BlockType var16 = BlockType.getAssetMap().getAsset(var15.get(var5, var6, var7));
         if (var16 == null) {
            class="kw">return;
         }

         if (DoorBlockUtils.DoorState.fromBlockState(var16.getStateForBlock(var16)) == DoorBlockUtils.DoorState.CLOSED) {
            tryOpen(var1, var2, var9, var16, var18);
         }
      } else {
         if (var11 == DoorBlockUtils.DoorState.CLOSED) {
            class="kw">return;
         }

         String var17 = DoorBlockUtils.getInteractionState(var11, DoorBlockUtils.DoorState.CLOSED);
         var1.setBlockInteractionState(var9, var4, var17);
      }
   }

   class="kw">private class="kw">static void tryOpen(
      @Nonnull World var0, @Nonnull ChunkStore var1, @Nonnull Vector3i var2, @Nonnull BlockType var3, @Nonnull DoorBlockUtils.DoorState var4
   ) {
      String var5 = DoorBlockUtils.getInteractionState(DoorBlockUtils.DoorState.CLOSED, var4);
      if (DoorBlockUtils.canOpenDoor(var1, var2, var5)) {
         var0.setBlockInteractionState(var2, var3, var5);
      }
   }

   class="kw">private enum DoorAction {
      OPEN,
      CLOSE;

      DoorAction() {
      }
   }
}