DoorInfo class

Пакет: com.hypixel.hytale.server.core.modules.interaction.interaction.config.server

Файл: com/hypixel/hytale/server/core/modules/interaction/interaction/config/server/DoorInteraction.java

Поля (4)

МодификаторыТипИмя
private final Vector3i blockPosition
private final BlockType blockType
private final DoorBlockUtils.DoorState doorState
private final int filler

Методы (3)

МодификаторыВозвратСигнатура
public Vector3i getBlockPositionpublic Vector3i getBlockPosition()
public BlockType getBlockTypepublic BlockType getBlockType()
public DoorBlockUtils.DoorState getDoorStatepublic DoorBlockUtils.DoorState getDoorState()

Исходный код

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

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.component.AddReason;
class="kw">import com.hypixel.hytale.component.CommandBuffer;
class="kw">import com.hypixel.hytale.component.Holder;
class="kw">import com.hypixel.hytale.component.Ref;
class="kw">import com.hypixel.hytale.component.Store;
class="kw">import com.hypixel.hytale.math.shape.Box;
class="kw">import com.hypixel.hytale.math.util.MathUtil;
class="kw">import com.hypixel.hytale.math.vector.Rotation3f;
class="kw">import com.hypixel.hytale.protocol.BlockMaterial;
class="kw">import com.hypixel.hytale.protocol.InteractionState;
class="kw">import com.hypixel.hytale.protocol.InteractionType;
class="kw">import com.hypixel.hytale.server.core.asset.type.blockhitbox.BlockBoundingBoxes;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.BlockGathering;
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.PhysicsDropType;
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.blocktype.config.SoftBlockDropType;
class="kw">import com.hypixel.hytale.server.core.asset.type.item.config.Item;
class="kw">import com.hypixel.hytale.server.core.entity.InteractionContext;
class="kw">import com.hypixel.hytale.server.core.inventory.ItemStack;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.TransformComponent;
class="kw">import com.hypixel.hytale.server.core.modules.entity.item.ItemComponent;
class="kw">import com.hypixel.hytale.server.core.modules.interaction.BlockHarvestUtils;
class="kw">import com.hypixel.hytale.server.core.modules.interaction.DoorBlockUtils;
class="kw">import com.hypixel.hytale.server.core.modules.interaction.interaction.CooldownHandler;
class="kw">import com.hypixel.hytale.server.core.modules.interaction.interaction.config.client.SimpleBlockInteraction;
class="kw">import com.hypixel.hytale.server.core.universe.world.SoundUtil;
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.chunk.BlockOperations;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.section.BlockComponentSection;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.section.BlockSection;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.section.ChunkSection;
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 java.util.List;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">import org.joml.Vector3d;
class="kw">import org.joml.Vector3i;

class="kw">public class DoorInteraction class="kw">extends SimpleBlockInteraction {
   @Nonnull
   class="kw">public class="kw">static class="kw">final BuilderCodec<DoorInteraction> CODEC = BuilderCodec.builder(DoorInteraction.class, DoorInteraction::new, SimpleBlockInteraction.CODEC)
      .documentation("Opens/Closes a door")
      .<Boolean>appendInherited(
         new KeyedCodec<>("Horizontal", Codec.BOOLEAN),
         (var0, var1) -> var0.horizontal = var1,
         var0 -> var0.horizontal,
         (var0, var1) -> var0.horizontal = var1.horizontal
      )
      .documentation("Whether the door is horizontal (e.g. gates) or vertical (e.g. regular doors).")
      .add()
      .build();
   class="kw">private class="kw">static class="kw">final String DOOR_BLOCKED = "DoorBlocked";
   class="kw">private boolean horizontal;

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

   class="kw">private class="kw">static boolean checkForDoubleDoor(
      @Nonnull World var0,
      @Nonnull CommandBuffer<EntityStore> var1,
      @Nonnull ChunkStore var2,
      @Nonnull Vector3i var3,
      @Nonnull BlockType var4,
      int var5,
      @Nonnull DoorBlockUtils.DoorState var6,
      @Nonnull DoorBlockUtils.DoorState var7
   ) {
      DoorInteraction.DoorInfo var8 = getDoubleDoor(var2, var3, var4, var5, var7);
      if (var8 == null) {
         class="kw">return false;
      }

      boolean var9 = DoorBlockUtils.isHorizontalDoor(var8.blockType);
      DoorBlockUtils.DoorState var10 = var9 ? var6 : DoorBlockUtils.getOppositeDoorState(var6);
      activateDoor(var0, var1, var2, var8.blockType, var8.blockPosition, var8.doorState, var10);
      class="kw">return true;
   }

   @Nullable
   class="kw">private class="kw">static BlockType activateDoor(
      @Nonnull World var0,
      @Nonnull CommandBuffer<EntityStore> var1,
      @Nonnull ChunkStore var2,
      @Nonnull BlockType var3,
      @Nonnull Vector3i var4,
      @Nonnull DoorBlockUtils.DoorState var5,
      @Nonnull DoorBlockUtils.DoorState var6
   ) {
      Ref var7 = var2.getChunkSectionReferenceAtBlock(var4.x, var4.y, var4.z);
      if (var7 != null && var7.isValid()) {
         Store var8 = var2.getStore();
         BlockSection var9 = var8.getComponent(var7, BlockSection.getComponentType());
         if (var9 == null) {
            class="kw">return null;
         }

         int var10 = var9.getRotationIndex(var4.x, var4.y, var4.z);
         BlockBoundingBoxes var11 = BlockBoundingBoxes.getAssetMap().getAsset(var3.getHitboxTypeIndex());
         String var12 = DoorBlockUtils.getInteractionState(var5, var6);
         BlockType var13 = var3.getBlockForState(var12);
         if (var13 != null) {
            BlockBoundingBoxes var14 = BlockBoundingBoxes.getAssetMap().getAsset(var13.getHitboxTypeIndex());
            if (var14 != null) {
               breakSoftBlocksInHitbox(var1, var2, var4, var14.get(var10));
            }
         }

         BlockOperations.setBlockInteractionState(var2, var7, var4.x, var4.y, var4.z, var3, var12, false);
         BlockType var17 = BlockType.getAssetMap().getAsset(var9.get(var4.x, var4.y, var4.z));
         if (var17 == null) {
            class="kw">return null;
         }

         BlockType var15 = var17.getBlockForState(var12);
         if (var11 != null) {
            FillerBlockUtil.forEachFillerBlock(
               var11.get(var10), (var2x, var3x, var4x) -> var0.performBlockUpdate(var4.x + var2x, var4.y + var3x, var4.z + var4x)
            );
         }

         if (var15 != null) {
            BlockBoundingBoxes var16 = BlockBoundingBoxes.getAssetMap().getAsset(var15.getHitboxTypeIndex());
            if (var16 != null && var16 != var11) {
               FillerBlockUtil.forEachFillerBlock(
                  var16.get(var10), (var2x, var3x, var4x) -> var0.performBlockUpdate(var4.x + var2x, var4.y + var3x, var4.z + var4x)
               );
            }
         }

         class="kw">return var15;
      } else {
         class="kw">return null;
      }
   }

   class="kw">private class="kw">static void breakSoftBlocksInHitbox(
      @Nonnull CommandBuffer<EntityStore> var0, @Nonnull ChunkStore var1, @Nonnull Vector3i var2, @Nonnull BlockBoundingBoxes.RotatedVariantBoxes var3
   ) {
      Store var4 = var1.getStore();
      FillerBlockUtil.forEachFillerBlock(var3, (var4x, var5, var6) -> {
         if (var4x != 0 || var5 != 0 || var6 != 0) {
            int var7 = var2.x + var4x;
            int var8 = var2.y + var5;
            int var9 = var2.z + var6;
            Ref var10 = var1.getChunkSectionReferenceAtBlock(var7, var8, var9);
            if (var10 != null && var10.isValid()) {
               BlockSection var11 = var4.getComponent(var10, BlockSection.getComponentType());
               if (var11 != null) {
                  ChunkSection var12 = var4.getComponent(var10, ChunkSection.getComponentType());
                  if (var12 != null) {
                     BlockType var13 = BlockType.getAssetMap().getAsset(var11.get(var7, var8, var9));
                     if (var13 != null && var13 != BlockType.EMPTY && var13.getMaterial() == BlockMaterial.Empty) {
                        Ref var14 = var12.getChunkColumnReference();
                        if (var14 != null && var14.isValid()) {
                           BlockChunk var15 = var4.getComponent(var14, BlockChunk.getComponentType());
                           if (var15 != null) {
                              BlockComponentSection var16 = var4.getComponent(var10, BlockComponentSection.getComponentType());
                              if (var16 != null) {
                                 int var17 = 1312;
                                 BlockOperations.setBlock(var1, var10, var12, var11, var16, var15, var7, var8, var9, 0, BlockType.EMPTY, 0, 0, 1312);
                                 String var18 = null;
                                 String var19 = null;
                                 BlockGathering var20 = var13.getGathering();
                                 if (var20 != null) {
                                    PhysicsDropType var21 = var20.getPhysics();
                                    SoftBlockDropType var22 = var20.getSoft();
                                    if (var21 != null) {
                                       var18 = var21.getItemId();
                                       var19 = var21.getDropListId();
                                    } else if (var22 != null) {
                                       var18 = var22.getItemId();
                                       var19 = var22.getDropListId();
                                    }
                                 }

                                 List var24 = BlockHarvestUtils.getDrops(var13, 1, var18, var19);
                                 if (!var24.isEmpty()) {
                                    Vector3d var25 = new Vector3d(var7 + 0.5, var8, var9 + 0.5);
                                    Holder[] var23 = ItemComponent.generateItemDrops(var0, var24, var25, Rotation3f.IDENTITY);
                                    var0.addEntities(var23, AddReason.SPAWN);
                                 }
                              }
                           }
                        }
                     }
                  }
               }
            }
         }
      });
   }

   @Nullable
   class="kw">private class="kw">static DoorInteraction.DoorInfo getDoubleDoor(
      @Nonnull ChunkStore var0, @Nonnull Vector3i var1, @Nonnull BlockType var2, int var3, @Nonnull DoorBlockUtils.DoorState var4
   ) {
      Item var5 = var2.getItem();
      if (var5 == null) {
         class="kw">return null;
      }

      BlockType var6 = BlockType.getAssetMap().getAsset(var5.getId());
      if (var6 == null) {
         class="kw">return null;
      }

      int var7 = var6.getHitboxTypeIndex();
      BlockBoundingBoxes var8 = BlockBoundingBoxes.getAssetMap().getAsset(var7);
      if (var8 == null) {
         class="kw">return null;
      }

      BlockBoundingBoxes.RotatedVariantBoxes var9 = var8.get(Rotation.None, Rotation.None, Rotation.None);
      Vector3i var10 = new Vector3i((int)var9.getBoundingBox().getMax().x * 2 - 1, 0, 0);
      Rotation var11 = RotationTuple.get(var3).yaw();
      Vector3i var12 = new Vector3i(var1).add(MathUtil.rotateVectorYAxis(var10, var11.getDegrees(), false));
      DoorInteraction.DoorInfo var13 = getDoorAtPosition(var0, var12.x, var12.y, var12.z, var11.flip());
      if (var13 != null && var13.doorState == var4) {
         BlockType var14 = var13.blockType;
         if (var13.filler != 0) {
            class="kw">return null;
         }

         int var15 = BlockType.getAssetMap().getAsset(var14.getItem().getId()).getHitboxTypeIndex();
         class="kw">return var15 == var7 ? var13 : null;
      } else {
         class="kw">return null;
      }
   }

   @Nullable
   class="kw">public class="kw">static DoorInteraction.DoorInfo getDoorAtPosition(@Nonnull ChunkStore var0, int var1, int var2, int var3, @Nonnull Rotation var4) {
      Store var5 = var0.getStore();
      Ref var6 = var0.getChunkSectionReferenceAtBlock(var1, var2, var3);
      if (var6 != null && var6.isValid()) {
         BlockSection var7 = var5.getComponent(var6, BlockSection.getComponentType());
         if (var7 == null) {
            class="kw">return null;
         } else {
            BlockType var8 = BlockType.getAssetMap().getAsset(var7.get(var1, var2, var3));
            if (var8 != null && var8.isDoor()) {
               RotationTuple var9 = var7.getRotation(var1, var2, var3);
               String var10 = var8.getStateForBlock(var8);
               DoorBlockUtils.DoorState var11 = DoorBlockUtils.DoorState.fromBlockState(var10);
               Rotation var12 = var9.yaw();
               int var13 = var7.getFiller(var1, var2, var3);
               class="kw">return var12 != var4 ? null : new DoorInteraction.DoorInfo(var8, var13, new Vector3i(var1, var2, var3), var11);
            } else {
               class="kw">return null;
            }
         }
      } else {
         class="kw">return null;
      }
   }

   @Override
   class="kw">protected void simulateInteractWithBlock(
      @Nonnull InteractionType var1, @Nonnull InteractionContext var2, @Nullable ItemStack var3, @Nonnull World var4, @Nonnull Vector3i var5
   ) {
   }

   @Override
   class="kw">protected void interactWithBlock(
      @Nonnull World var1,
      @Nonnull CommandBuffer<EntityStore> var2,
      @Nonnull InteractionType var3,
      @Nonnull InteractionContext var4,
      @Nullable ItemStack var5,
      @Nonnull Vector3i var6,
      @Nonnull CooldownHandler var7
   ) {
      int var8 = var6.x();
      int var9 = var6.y();
      int var10 = var6.z();
      ChunkStore var11 = var1.getChunkStore();
      Ref var12 = var11.getChunkSectionReferenceAtBlock(var8, var9, var10);
      if (var12 != null && var12.isValid()) {
         Store var13 = var11.getStore();
         BlockSection var14 = var13.getComponent(var12, BlockSection.getComponentType());
         if (var14 != null) {
            BlockType var15 = BlockType.getAssetMap().getAsset(var14.get(var6.x, var6.y, var6.z));
            if (var15 != null) {
               int var16 = var14.getRotationIndex(var8, var9, var10);
               RotationTuple var17 = RotationTuple.get(var16);
               String var18 = var15.getStateForBlock(var15);
               DoorBlockUtils.DoorState var19 = DoorBlockUtils.DoorState.fromBlockState(var18);
               Ref var20 = var4.getEntity();
               TransformComponent var21 = var2.getComponent(var20, TransformComponent.getComponentType());
               assert var21 != null;
               Vector3d var22 = var21.getPosition();
               DoorBlockUtils.DoorState var23;
               if (var19 != DoorBlockUtils.DoorState.CLOSED) {
                  var23 = DoorBlockUtils.DoorState.CLOSED;
               } else if (!this.horizontal && DoorBlockUtils.isInFrontOfDoor(var6, var17.yaw(), var22)) {
                  var23 = DoorBlockUtils.DoorState.OPENED_OUT;
               } else {
                  var23 = DoorBlockUtils.DoorState.OPENED_IN;
               }

               DoorBlockUtils.DoorState var24 = this.checkDoor(var11, var12, var6, var15, var16, var19, var23);
               if (var24 == null) {
                  var4.getState().state = InteractionState.Failed;
               } else {
                  var23 = var24;
                  DoorBlockUtils.DoorState var25 = DoorBlockUtils.getOppositeDoorState(var19);
                  BlockType var26 = activateDoor(var1, var2, var11, var15, var6, var19, var23);
                  boolean var27 = checkForDoubleDoor(var1, var2, var11, var6, var15, var16, var23, var25);
                  if (var26 != null) {
                     Vector3d var28 = new Vector3d();
                     int var29 = BlockType.getAssetMap().getAsset(var15.getItem().getId()).getHitboxTypeIndex();
                     BlockBoundingBoxes var30 = BlockBoundingBoxes.getAssetMap().getAsset(var29);
                     BlockBoundingBoxes.RotatedVariantBoxes var31 = var30.get(var16);
                     Box var32 = var31.getBoundingBox();
                     if (var27) {
                        Vector3d var33 = new Vector3d(var32.middleX(), 0.0, 0.0);
                        Rotation var34 = RotationTuple.get(var16).yaw();
                        var28.add(MathUtil.rotateVectorYAxis(var33, var34.getDegrees(), false));
                        var28.add(var32.middleX(), var32.middleY(), var32.middleZ());
                     } else {
                        var28.add(var32.middleX(), var32.middleY(), var32.middleZ());
                     }

                     var28.add(var6.x, var6.y, var6.z);
                     SoundUtil.playSoundEvent3d(var20, var26.getInteractionSoundEventIndex(), var28, var2);
                  }
               }
            }
         }
      }
   }

   class="kw">public boolean getIsHorizontal() {
      class="kw">return this.horizontal;
   }

   @Nullable
   class="kw">private DoorBlockUtils.DoorState checkDoor(
      @Nonnull ChunkStore var1,
      @Nonnull Ref<ChunkStore> var2,
      @Nonnull Vector3i var3,
      @Nonnull BlockType var4,
      int var5,
      @Nonnull DoorBlockUtils.DoorState var6,
      @Nonnull DoorBlockUtils.DoorState var7
   ) {
      DoorInteraction.DoorInfo var8 = getDoubleDoor(var1, var3, var4, var5, var6);
      DoorBlockUtils.DoorState var9 = DoorBlockUtils.getOppositeDoorState(var7);
      String var10 = DoorBlockUtils.getInteractionState(var6, var9);
      String var11 = DoorBlockUtils.getInteractionState(var6, var7);
      if (DoorBlockUtils.canOpenDoor(var1, var3, var11)) {
         if (this.horizontal || var8 == null || DoorBlockUtils.canOpenDoor(var1, var8.blockPosition, var10)) {
            class="kw">return var7;
         }

         if (DoorBlockUtils.canOpenDoor(var1, var3, var10) && DoorBlockUtils.canOpenDoor(var1, var8.blockPosition, var11)) {
            class="kw">return var9;
         }

         BlockOperations.setBlockInteractionState(var1, var2, var3.x, var3.y, var3.z, var4, "DoorBlocked", false);
         class="kw">return null;
      } else if (DoorBlockUtils.canOpenDoor(var1, var3, var10) && !this.horizontal) {
         if (var8 != null && !DoorBlockUtils.canOpenDoor(var1, var8.blockPosition, var11)) {
            BlockOperations.setBlockInteractionState(var1, var2, var3.x, var3.y, var3.z, var4, "DoorBlocked", false);
            class="kw">return null;
         } else {
            class="kw">return var9;
         }
      } else {
         if (var7 != DoorBlockUtils.DoorState.CLOSED) {
            BlockOperations.setBlockInteractionState(var1, var2, var3.x, var3.y, var3.z, var4, "DoorBlocked", false);
         }

         class="kw">return null;
      }
   }

   class="kw">public class="kw">static class DoorInfo {
      class="kw">private class="kw">final BlockType blockType;
      class="kw">private class="kw">final int filler;
      class="kw">private class="kw">final Vector3i blockPosition;
      class="kw">private class="kw">final DoorBlockUtils.DoorState doorState;

      class="kw">public DoorInfo(@Nonnull BlockType var1, int var2, @Nonnull Vector3i var3, @Nonnull DoorBlockUtils.DoorState var4) {
         this.blockType = var1;
         this.filler = var2;
         this.blockPosition = var3;
         this.doorState = var4;
      }

      @Nonnull
      class="kw">public BlockType getBlockType() {
         class="kw">return this.blockType;
      }

      @Nonnull
      class="kw">public Vector3i getBlockPosition() {
         class="kw">return this.blockPosition;
      }

      @Nonnull
      class="kw">public DoorBlockUtils.DoorState getDoorState() {
         class="kw">return this.doorState;
      }
   }
}