UseWateringCanInteraction class

Пакет: com.hypixel.hytale.builtin.adventure.farming.interactions

Файл: com/hypixel/hytale/builtin/adventure/farming/interactions/UseWateringCanInteraction.java

extends: SimpleBlockInteraction

Поля (39)

МодификаторыТипИмя
Instant var10
BlockComponentSection var10
var10
int var11
var11
var11
int var11
var11
int var12
var12
int var12
HeadRotation var13
Ref var13
var13
Vector3i var14
BlockType var14
int var15
Ref var15
int var16
BlockSection var16
int var17
TilledSoilBlock var17
int var18
int var19
boolean var20
var20
int var23
int var24
int var25
int var4
BlockType var5
ChunkStore var6
Store var7
WorldTimeResource var8
Ref var8
var8
Instant var9
BlockSection var9
var9

Методы (13)

МодификаторыВозвратСигнатура
for for(int var21 = 0; var21 < var17; var21++)
for for(int var22 = -var18; var22 <= var19; var22++)
if if(var13 != null)
if if(var11 != 0 && var12 != 0)
if if(!var20)
if if(var9 != null && var10 != null)
if if(var9 == null || var10 == null)
if if(var14 == null)
if if(var17 == null)
if if(var15 == null)
if if(var16 != null)
static boolean isTilledSoilBlockboolean isTilledSoilBlock(@Nonnull BlockSection var0, int var1, int var2, int var3)
private boolean waterBlockAtboolean waterBlockAt(@Nonnull World var1, int var2, int var3, int var4, @Nonnull Instant var5)

Исходный код

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

class="kw">import com.hypixel.hytale.builtin.adventure.farming.states.TilledSoilBlock;
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.math.util.ChunkUtil;
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.BlockType;
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.block.BlockEntity;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.HeadRotation;
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.modules.time.WorldTimeResource;
class="kw">import com.hypixel.hytale.server.core.universe.world.World;
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.storage.ChunkStore;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
class="kw">import java.time.Instant;
class="kw">import java.time.temporal.ChronoUnit;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">import org.joml.Vector3i;

class="kw">public class UseWateringCanInteraction class="kw">extends SimpleBlockInteraction {
   @Nonnull
   class="kw">public class="kw">static class="kw">final BuilderCodec<UseWateringCanInteraction> CODEC = BuilderCodec.builder(
         UseWateringCanInteraction.class, UseWateringCanInteraction::new, SimpleBlockInteraction.CODEC
      )
      .documentation("Waters the target farmable block. Supports configurable width and depth for directional area-of-effect watering.")
      .append(new KeyedCodec<>("Duration", Codec.LONG), (var0, var1) -> var0.duration = var1, var0 -> var0.duration)
      .add()
      .append(new KeyedCodec<>("RefreshModifiers", Codec.STRING_ARRAY), (var0, var1) -> var0.refreshModifiers = var1, var0 -> var0.refreshModifiers)
      .add()
      .append(new KeyedCodec<>("RadiusX", Codec.INTEGER), (var0, var1) -> var0.radiusX = var1, var0 -> var0.radiusX)
      .add()
      .append(new KeyedCodec<>("RadiusZ", Codec.INTEGER), (var0, var1) -> var0.radiusZ = var1, var0 -> var0.radiusZ)
      .add()
      .build();
   class="kw">protected long duration;
   class="kw">protected String[] refreshModifiers;
   class="kw">protected int radiusX;
   class="kw">protected int radiusZ;

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

   @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
   ) {
      WorldTimeResource var8 = var2.getResource(WorldTimeResource.getResourceType());
      Instant var9 = var8.getGameTime();
      Instant var10 = var9.plus(this.duration, ChronoUnit.SECONDS);
      int var11 = 0;
      int var12 = -1;
      HeadRotation var13 = var2.getComponent(var4.getEntity(), HeadRotation.getComponentType());
      if (var13 != null) {
         Vector3i var14 = var13.getHorizontalAxisDirection();
         var11 = var14.x();
         var12 = var14.z();
      }

      if (var11 != 0 && var12 != 0) {
         var11 = 0;
      }

      int var25 = var12 != 0 ? 1 : 0;
      int var15 = var11 != 0 ? 1 : 0;
      int var16 = Math.max(this.radiusX, 1);
      int var17 = Math.max(this.radiusZ, 1);
      int var18 = (var16 - 1) / 2;
      int var19 = var16 - 1 - var18;
      boolean var20 = false;

      for (int var21 = 0; var21 < var17; var21++) {
         for (int var22 = -var18; var22 <= var19; var22++) {
            int var23 = var6.x() + var22 * var25 + var21 * var11;
            int var24 = var6.z() + var22 * var15 + var21 * var12;
            if (this.waterBlockAt(var1, var23, var6.y(), var24, var10)) {
               var20 = true;
            }
         }
      }

      if (!var20) {
         var4.getState().state = InteractionState.Failed;
      }
   }

   class="kw">private boolean waterBlockAt(@Nonnull World var1, int var2, int var3, int var4, @Nonnull Instant var5) {
      ChunkStore var6 = var1.getChunkStore();
      Store var7 = var6.getStore();
      Ref var8 = var6.getChunkSectionReferenceAtBlock(var2, var3, var4);
      if (var8 != null && var8.isValid()) {
         BlockSection var9 = var7.getComponent(var8, BlockSection.getComponentType());
         BlockComponentSection var10 = var7.getComponent(var8, BlockComponentSection.getComponentType());
         if (var9 != null && var10 != null) {
            int var11 = var3;
            if (!isTilledSoilBlock(var9, var2, var11, var4)) {
               var11 = var3 - 1;
               if (ChunkUtil.chunkCoordinate(var11) != ChunkUtil.chunkCoordinate(var3)) {
                  var8 = var6.getChunkSectionReferenceAtBlock(var2, var11, var4);
                  if (var8 == null || !var8.isValid()) {
                     class="kw">return false;
                  }

                  var9 = var7.getComponent(var8, BlockSection.getComponentType());
                  var10 = var7.getComponent(var8, BlockComponentSection.getComponentType());
                  if (var9 == null || var10 == null) {
                     class="kw">return false;
                  }
               }

               if (!isTilledSoilBlock(var9, var2, var11, var4)) {
                  class="kw">return false;
               }
            }

            int var12 = ChunkUtil.indexBlock(var2, var11, var4);
            Ref var13 = var10.getBlockReference(var12);
            if (var13 == null || !var13.isValid()) {
               BlockType var14 = BlockType.getAssetMap().getAsset(var9.get(var12));
               if (var14 == null) {
                  class="kw">return false;
               }

               var13 = BlockEntity.ensureBlockEntity(var7, var8, var10, var2, var11, var4, var14, var9.getFiller(var12));
            }

            if (var13 != null && var13.isValid()) {
               TilledSoilBlock var17 = var7.getComponent(var13, TilledSoilBlock.getComponentType());
               if (var17 == null) {
                  class="kw">return false;
               }

               var17.setWateredUntil(var5);
               var10.markBlockNeedsSaving(var12);
               var9.setTicking(var2, var11, var4, true);
               var9.scheduleTick(var12, var5);
               if (ChunkUtil.chunkCoordinate(var11) == ChunkUtil.chunkCoordinate(var11 + 1)) {
                  var9.setTicking(var2, var11 + 1, var4, true);
                  class="kw">return true;
               }

               Ref var15 = var6.getChunkSectionReferenceAtBlock(var2, var11 + 1, var4);
               if (var15 == null) {
                  class="kw">return true;
               }

               BlockSection var16 = var7.getComponent(var15, BlockSection.getComponentType());
               if (var16 != null) {
                  var16.setTicking(var2, var11 + 1, var4, true);
               }

               class="kw">return true;
            } else {
               class="kw">return false;
            }
         } else {
            class="kw">return false;
         }
      } else {
         class="kw">return false;
      }
   }

   class="kw">private class="kw">static boolean isTilledSoilBlock(@Nonnull BlockSection var0, int var1, int var2, int var3) {
      int var4 = ChunkUtil.indexBlock(var1, var2, var3);
      if (var0.getFiller(var4) != 0) {
         class="kw">return false;
      }

      BlockType var5 = BlockType.getAssetMap().getAsset(var0.get(var4));
      class="kw">return var5 == null ? false : BlockEntity.declaresComponent(var5, TilledSoilBlock.getComponentType());
   }

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