BreakBlockInteraction class

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

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

extends: SimpleBlockInteraction

Поля (33)

МодификаторыТипИмя
final HytaleLogger LOGGER
return
return
return
return
return
return
ChunkStore var10
Store var11
Ref var12
BlockSection var13
GameplayConfig var14
WorldConfig var15
int var16
int var17
int var18
BlockType var19
com.hypixel.hytale.protocol.BreakBlockInteraction var2
BlockType var2
int var20
Player var21
boolean var22
LinkedHashSet var23
ArrayList var24
boolean var25
boolean var27
Ref var28
Item var29
BlockGathering var3
ItemTool var30
BreakShape var31
Ref var8
Ref var9

Методы (9)

МодификаторыВозвратСигнатура
abstract computeCurrentBlockSyncData computeCurrentBlockSyncData(var4)
if if(this.harvest)
if if(var19 == null)
if if(!var27)
if if(var31 == null)
if if(var22)
if if(var22)
if if(var2 == null)
static boolean isSoftBlockboolean isSoftBlock(@Nonnull BlockSection var0, @Nonnull Vector3i var1)

Исходный код

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

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.CommandBuffer;
class="kw">import com.hypixel.hytale.component.Ref;
class="kw">import com.hypixel.hytale.component.Store;
class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import com.hypixel.hytale.protocol.GameMode;
class="kw">import com.hypixel.hytale.protocol.Interaction;
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.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.gameplay.GameplayConfig;
class="kw">import com.hypixel.hytale.server.core.asset.type.gameplay.WorldConfig;
class="kw">import com.hypixel.hytale.server.core.asset.type.item.config.BreakShapeDurabilityMode;
class="kw">import com.hypixel.hytale.server.core.asset.type.item.config.Item;
class="kw">import com.hypixel.hytale.server.core.asset.type.item.config.ItemTool;
class="kw">import com.hypixel.hytale.server.core.entity.InteractionContext;
class="kw">import com.hypixel.hytale.server.core.entity.entities.Player;
class="kw">import com.hypixel.hytale.server.core.inventory.ItemStack;
class="kw">import com.hypixel.hytale.server.core.modules.interaction.BlockHarvestUtils;
class="kw">import com.hypixel.hytale.server.core.modules.interaction.breakshape.BreakShape;
class="kw">import com.hypixel.hytale.server.core.modules.interaction.interaction.CooldownHandler;
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 java.util.ArrayList;
class="kw">import java.util.LinkedHashSet;
class="kw">import java.util.concurrent.TimeUnit;
class="kw">import java.util.logging.Level;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">import org.joml.Vector3i;

class="kw">public class BreakBlockInteraction class="kw">extends SimpleBlockInteraction {
   class="kw">private class="kw">static class="kw">final HytaleLogger LOGGER = HytaleLogger.forEnclosingClass();
   @Nonnull
   class="kw">public class="kw">static class="kw">final BuilderCodec<BreakBlockInteraction> CODEC = BuilderCodec.builder(
         BreakBlockInteraction.class, BreakBlockInteraction::new, SimpleBlockInteraction.CODEC
      )
      .documentation("Attempts to break the target block.")
      .<Boolean>appendInherited(
         new KeyedCodec<>("Harvest", Codec.BOOLEAN), (var0, var1) -> var0.harvest = var1, var0 -> var0.harvest, (var0, var1) -> var0.harvest = var1.harvest
      )
      .documentation("Whether this should trigger as a harvest gather vs a break gather.")
      .add()
      .<Boolean>appendInherited(
         new KeyedCodec<>("SoftOnly", Codec.BOOLEAN),
         (var0, var1) -> var0.softOnly = var1,
         var0 -> var0.softOnly,
         (var0, var1) -> var0.softOnly = var1.softOnly
      )
      .documentation("Whether this can only break soft blocks, whatever the breaking entity holds.")
      .add()
      .<String>appendInherited(
         new KeyedCodec<>("Tool", Codec.STRING), (var0, var1) -> var0.toolId = var1, var0 -> var0.toolId, (var0, var1) -> var0.toolId = var1.toolId
      )
      .documentation("Tool to break as.")
      .add()
      .<Boolean>appendInherited(
         new KeyedCodec<>("MatchTool", Codec.BOOLEAN),
         (var0, var1) -> var0.matchTool = var1,
         var0 -> var0.matchTool,
         (var0, var1) -> var0.matchTool = var1.matchTool
      )
      .documentation("Whether to require an match to `Tool` to work.")
      .add()
      .build();
   class="kw">protected boolean harvest;
   class="kw">protected boolean softOnly;
   @Nullable
   class="kw">protected String toolId;
   class="kw">protected boolean matchTool;

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

   @Override
   class="kw">protected void tick0(boolean var1, float var2, @Nonnull InteractionType var3, @Nonnull InteractionContext var4, @Nonnull CooldownHandler var5) {
      super.tick0(var1, var2, var3, var4, var5);
      computeCurrentBlockSyncData(var4);
   }

   @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
   ) {
      Ref var8 = var4.getEntity();
      Ref var9 = var4.getOwningEntity();
      ChunkStore var10 = var1.getChunkStore();
      Store var11 = var10.getStore();
      Ref var12 = var10.getChunkSectionReferenceAtBlock(var6.x, var6.y, var6.z);
      if (var12 != null && var12.isValid()) {
         BlockSection var13 = var11.getComponent(var12, BlockSection.getComponentType());
         assert var13 != null;
         GameplayConfig var14 = var1.getGameplayConfig();
         WorldConfig var15 = var14.getWorldConfig();
         if (this.harvest) {
            int var16 = var6.x();
            int var17 = var6.y();
            int var18 = var6.z();
            BlockType var19 = BlockType.getAssetMap().getAsset(var13.get(var16, var17, var18));
            if (var19 == null) {
               var4.getState().state = InteractionState.Failed;
               class="kw">return;
            }

            if (!var15.isBlockGatheringAllowed()) {
               var4.getState().state = InteractionState.Failed;
               class="kw">return;
            }

            if (!BlockHarvestUtils.shouldPickupByInteraction(var19)) {
               var4.getState().state = InteractionState.Failed;
               class="kw">return;
            }

            int var20 = var13.getFiller(var16, var17, var18);
            BlockHarvestUtils.performPickupByInteraction(var8, var6, var19, var20, var12, var13, var2, var11);
         } else {
            boolean var27 = var15.isBlockBreakingAllowed();
            if (!var27) {
               var4.getState().state = InteractionState.Failed;
               class="kw">return;
            }

            if (this.softOnly && !isSoftBlock(var13, var6)) {
               class="kw">return;
            }

            Ref var28 = var9 != null && var9.isValid() ? var9 : var8;
            Item var29 = var5 != null ? var5.getItem() : null;
            ItemTool var30 = var29 != null ? var29.getTool() : null;
            BreakShape var31 = var30 != null ? var30.getBreakShape() : null;
            Player var21 = var2.getComponent(var8, Player.getComponentType());
            boolean var22 = var21 != null && var21.getGameMode() == GameMode.Creative;
            if (var31 == null) {
               if (var22) {
                  BlockHarvestUtils.performBlockBreak(var28, var5, var6, 4096, var12, var2, var11);
               } else {
                  BlockHarvestUtils.performBlockDamage(var28, var8, var6, var5, null, this.toolId, this.matchTool, 1.0F, 0, false, var12, var2, var11);
               }

               class="kw">return;
            }

            LinkedHashSet var23 = new LinkedHashSet<>();

            try {
               var31.selectBlocks(var2, var8, var6, (var1x, var2x, var3x) -> var23.add(new Vector3i(var1x, var2x, var3x)));
            } catch (Exception var26) {
               ((HytaleLogger.Api)((HytaleLogger.Api)LOGGER.at(Level.WARNING).atMostEvery(5, TimeUnit.MINUTES)).withCause(var26))
                  .log("Break shape failed to select blocks (tool='%s'); breaking only the target block.", this.toolId);
               var23.clear();
               var23.add(new Vector3i(var6));
            }

            ArrayList var24 = new ArrayList<>(var23);
            if (var22) {
               BlockHarvestUtils.performBlockBreak(var28, var5, var24, 4096, var2, var11);
            } else {
               boolean var25 = var30.getBreakShapeDurabilityMode() == BreakShapeDurabilityMode.PerBlock;
               BlockHarvestUtils.performBlockDamage(var28, var8, var24, var6, var5, null, this.toolId, this.matchTool, 1.0F, 0, false, var25, var2, var11);
            }
         }
      } else {
         var4.getState().state = InteractionState.Failed;
      }
   }

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

   @Nonnull
   @Override
   class="kw">protected Interaction generatePacket() {
      class="kw">return new com.hypixel.hytale.protocol.BreakBlockInteraction();
   }

   @Override
   class="kw">protected void configurePacket(Interaction var1) {
      super.configurePacket(var1);
      com.hypixel.hytale.protocol.BreakBlockInteraction var2 = (com.hypixel.hytale.protocol.BreakBlockInteraction)var1;
      var2.harvest = this.harvest;
      var2.softOnly = this.softOnly;
   }

   @Nonnull
   @Override
   class="kw">public String toString() {
      class="kw">return "BreakBlockInteraction{harvest=" + this.harvest + ", softOnly=" + this.softOnly + "} " + super.toString();
   }

   class="kw">private class="kw">static boolean isSoftBlock(@Nonnull BlockSection var0, @Nonnull Vector3i var1) {
      BlockType var2 = BlockType.getAssetMap().getAsset(var0.get(var1.x, var1.y, var1.z));
      if (var2 == null) {
         class="kw">return false;
      }

      BlockGathering var3 = var2.getGathering();
      class="kw">return var3 != null && var3.isSoft();
   }
}