ChangeFarmingStageInteraction class

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

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

extends: SimpleBlockInteraction

Поля (41)

МодификаторыТипИмя
int var10
Store var11
Ref var12
BlockSection var13
BlockType var14
FarmingData var15
WorldTimeResource var16
Instant var17
BlockComponentSection var18
int var19
Ref var20
var20
boolean var21
String var22
FarmingStageData[] var23
var23
FarmingBlock var24
var24
var24
var24
Holder var25
int var26
int var27
var27
int var28
int var29
int var30
FarmingStageData var31
var31
FarmingStageData[] var32
boolean var34
String var35
int var36
var36
var36
var36
var36
var36
var36
int var8
int var9

Методы (16)

МодификаторыВозвратСигнатура
if if(var13 == null)
if if(var14 == null)
if if(var18 == null)
if if(var23 != null && var23.length != 0)
if if(var20 == null)
if if(var20 != null)
if if(var24 == null)
if if(var20 == null)
if if(var23 != null && var23.length != 0)
if if(var27 >= var23.length)
if if(this.increaseBy != null)
if if(var36 < 0)
if if(var36 < 0)
if if(var36 >= var23.length)
if if(var29 != var36)
if if(var32 != null && var30 >= 0 && var30 < var32.length)

Исходный код

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

class="kw">import com.hypixel.hytale.builtin.adventure.farming.states.FarmingBlock;
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.logger.HytaleLogger;
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.protocol.WaitForDataFrom;
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.farming.FarmingData;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.farming.FarmingStageData;
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.BlockModule;
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 javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">import org.joml.Vector3i;

class="kw">public class ChangeFarmingStageInteraction class="kw">extends SimpleBlockInteraction {
   @Nonnull
   class="kw">private class="kw">static class="kw">final HytaleLogger LOGGER = HytaleLogger.forEnclosingClass();
   @Nonnull
   class="kw">public class="kw">static class="kw">final BuilderCodec<ChangeFarmingStageInteraction> CODEC = BuilderCodec.builder(
         ChangeFarmingStageInteraction.class, ChangeFarmingStageInteraction::new, SimpleBlockInteraction.CODEC
      )
      .documentation("Changes the farming stage of the target block.")
      .<Integer>appendInherited(
         new KeyedCodec<>("Stage", Codec.INTEGER),
         (var0, var1) -> var0.targetStage = var1,
         var0 -> var0.targetStage,
         (var0, var1) -> var0.targetStage = var1.targetStage
      )
      .documentation("The stage index to set (0, 1, 2, etc.). Use -1 for the class="kw">final stage. Ignored if Increase is set.")
      .add()
      .<Integer>appendInherited(
         new KeyedCodec<>("Increase", Codec.INTEGER),
         (var0, var1) -> var0.increaseBy = var1,
         var0 -> var0.increaseBy,
         (var0, var1) -> var0.increaseBy = var1.increaseBy
      )
      .documentation("Add this amount to the current stage (e.g., 1 = advance one stage, 2 = advance two stages). Takes priority over Decrease and Stage.")
      .add()
      .<Integer>appendInherited(
         new KeyedCodec<>("Decrease", Codec.INTEGER),
         (var0, var1) -> var0.decreaseBy = var1,
         var0 -> var0.decreaseBy,
         (var0, var1) -> var0.decreaseBy = var1.decreaseBy
      )
      .documentation("Subtract this amount from the current stage (e.g., 1 = go back one stage). Takes priority over Stage.")
      .add()
      .<String>appendInherited(
         new KeyedCodec<>("StageSet", Codec.STRING),
         (var0, var1) -> var0.targetStageSet = var1,
         var0 -> var0.targetStageSet,
         (var0, var1) -> var0.targetStageSet = var1.targetStageSet
      )
      .documentation("Optional. The stage set to class="kw">switch to (e.g., 'Default', 'Harvested'). If not provided, uses current stage set.")
      .add()
      .build();
   class="kw">protected int targetStage = -1;
   @Nullable
   class="kw">protected Integer increaseBy;
   @Nullable
   class="kw">protected Integer decreaseBy;
   @Nullable
   class="kw">protected String targetStageSet;

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

   @Nonnull
   @Override
   class="kw">public WaitForDataFrom getWaitForDataFrom() {
      class="kw">return WaitForDataFrom.Server;
   }

   @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();
      ((HytaleLogger.Api)LOGGER.atInfo())
         .log(
            "[ChangeFarmingStage] Starting interaction at pos=(%d, %d, %d), increaseBy=%s, decreaseBy=%s, targetStage=%d, targetStageSet=%s",
            var8,
            var9,
            var10,
            this.increaseBy,
            this.decreaseBy,
            this.targetStage,
            this.targetStageSet
         );
      Store var11 = var1.getChunkStore().getStore();
      Ref var12 = var1.getChunkStore().getChunkSectionReferenceAtBlock(var8, var9, var10);
      if (var12 != null && var12.isValid()) {
         BlockSection var13 = var11.getComponent(var12, BlockSection.getComponentType());
         if (var13 == null) {
            ((HytaleLogger.Api)LOGGER.atWarning()).log("[ChangeFarmingStage] FAILED: blockSection is null at pos=(%d, %d, %d)", var8, var9, var10);
            var4.getState().state = InteractionState.Failed;
         } else {
            BlockType var14 = BlockType.getAssetMap().getAsset(var13.get(var8, var9, var10));
            if (var14 == null) {
               ((HytaleLogger.Api)LOGGER.atWarning()).log("[ChangeFarmingStage] FAILED: blockType is null at pos=(%d, %d, %d)", var8, var9, var10);
               var4.getState().state = InteractionState.Failed;
            } else {
               ((HytaleLogger.Api)LOGGER.atInfo()).log("[ChangeFarmingStage] Block type: %s (id=%s)", var14.getId(), var14.getClass().getSimpleName());
               FarmingData var15 = var14.getFarming();
               if (var15 != null && var15.getStages() != null) {
                  ((HytaleLogger.Api)LOGGER.atInfo())
                     .log(
                        "[ChangeFarmingStage] Farming config found. StartingStageSet=%s, StageSetAfterHarvest=%s, AvailableStageSets=%s",
                        var15.getStartingStageSet(),
                        var15.getStageSetAfterHarvest(),
                        var15.getStages() != null ? var15.getStages().keySet() : "null"
                     );
                  WorldTimeResource var16 = var1.getEntityStore().getStore().getResource(WorldTimeResource.getResourceType());
                  Instant var17 = var16.getGameTime();
                  BlockComponentSection var18 = var11.getComponent(var12, BlockComponentSection.getComponentType());
                  if (var18 == null) {
                     ((HytaleLogger.Api)LOGGER.atWarning())
                        .log("[ChangeFarmingStage] FAILED: blockComponentSection is null at pos=(%d, %d, %d)", var8, var9, var10);
                     var4.getState().state = InteractionState.Failed;
                  } else {
                     int var19 = ChunkUtil.indexBlock(var8, var9, var10);
                     Ref var20 = BlockModule.getBlockEntity(var11, var12, var8, var9, var10);
                     boolean var21 = var20 != null;
                     ((HytaleLogger.Api)LOGGER.atInfo()).log("[ChangeFarmingStage] Initial blockRef from getBlockReference: %s", var21 ? "exists" : "null");
                     String var22 = this.targetStageSet != null ? this.targetStageSet : var15.getStartingStageSet();
                     FarmingStageData[] var23 = var15.getStages().get(var22);
                     if (var23 != null && var23.length != 0) {
                        ((HytaleLogger.Api)LOGGER.atInfo()).log("[ChangeFarmingStage] Initial stages lookup: stageSet=%s, stageCount=%d", var22, var23.length);
                        FarmingBlock var24;
                        if (var20 == null) {
                           ((HytaleLogger.Api)LOGGER.atInfo()).log("[ChangeFarmingStage] Creating new block entity (harvest0 pattern)");
                           Holder var25 = ChunkStore.REGISTRY.newHolder();
                           var25.putComponent(BlockModule.BlockStateInfo.getComponentType(), new BlockModule.BlockStateInfo(var19, var12));
                           var24 = new FarmingBlock();
                           var24.setLastTickGameTime(var17);
                           var24.setCurrentStageSet(this.targetStageSet != null ? this.targetStageSet : var15.getStartingStageSet());
                           int var26 = Math.max(0, var23.length - 2);
                           var24.setGrowthProgress(var26);
                           var25.addComponent(FarmingBlock.getComponentType(), var24);
                           var20 = var11.addEntity(var25, AddReason.SPAWN);
                           ((HytaleLogger.Api)LOGGER.atInfo())
                              .log(
                                 "[ChangeFarmingStage] Created new block entity with FarmingBlock: stageSet=%s, initialProgress=%d (second-to-last to avoid removal)",
                                 var24.getCurrentStageSet(),
                                 var26
                              );
                           if (var20 != null) {
                              var24.setGrowthProgress(var23.length - 1);
                              ((HytaleLogger.Api)LOGGER.atInfo())
                                 .log("[ChangeFarmingStage] Updated growthProgress to %d (actual class="kw">final stage)", var23.length - 1);
                           }
                        } else {
                           var24 = var11.getComponent(var20, FarmingBlock.getComponentType());
                           boolean var34 = var24 != null;
                           ((HytaleLogger.Api)LOGGER.atInfo())
                              .log("[ChangeFarmingStage] Block entity exists, FarmingBlock component: %s", var34 ? "exists" : "null");
                           if (var24 == null) {
                              var24 = new FarmingBlock();
                              var24.setLastTickGameTime(var17);
                              var24.setCurrentStageSet(this.targetStageSet != null ? this.targetStageSet : var15.getStartingStageSet());
                              var24.setGrowthProgress(var23.length - 1);
                              var11.putComponent(var20, FarmingBlock.getComponentType(), var24);
                              ((HytaleLogger.Api)LOGGER.atInfo())
                                 .log(
                                    "[ChangeFarmingStage] Added FarmingBlock to existing entity: stageSet=%s, initialProgress=%d",
                                    var24.getCurrentStageSet(),
                                    var23.length - 1
                                 );
                           } else {
                              ((HytaleLogger.Api)LOGGER.atInfo())
                                 .log(
                                    "[ChangeFarmingStage] Existing FarmingBlock: stageSet=%s, growthProgress=%.2f, lastTickGameTime=%s",
                                    var24.getCurrentStageSet(),
                                    var24.getGrowthProgress(),
                                    var24.getLastTickGameTime()
                                 );
                           }
                        }

                        if (var20 == null) {
                           ((HytaleLogger.Api)LOGGER.atWarning()).log("[ChangeFarmingStage] FAILED: blockRef is still null after entity creation");
                           var4.getState().state = InteractionState.Failed;
                        } else {
                           String var35 = this.targetStageSet != null ? this.targetStageSet : var24.getCurrentStageSet();
                           var23 = var15.getStages().get(var35);
                           if (var23 != null && var23.length != 0) {
                              ((HytaleLogger.Api)LOGGER.atInfo()).log("[ChangeFarmingStage] Using stageSet=%s with %d stages", var35, var23.length);
                              int var27 = (int)var24.getGrowthProgress();
                              int var28 = var27;
                              if (var27 >= var23.length) {
                                 ((HytaleLogger.Api)LOGGER.atInfo())
                                    .log("[ChangeFarmingStage] Clamping currentStage from %d to %d (was >= stages.length)", var27, var23.length - 1);
                                 var27 = var23.length - 1;
                              }

                              int var36;
                              if (this.increaseBy != null) {
                                 var36 = var27 + this.increaseBy;
                                 ((HytaleLogger.Api)LOGGER.atInfo()).log("[ChangeFarmingStage] Mode=INCREASE: %d + %d = %d", var27, this.increaseBy, var36);
                              } else if (this.decreaseBy != null) {
                                 var36 = var27 - this.decreaseBy;
                                 ((HytaleLogger.Api)LOGGER.atInfo()).log("[ChangeFarmingStage] Mode=DECREASE: %d - %d = %d", var27, this.decreaseBy, var36);
                              } else {
                                 var36 = this.targetStage;
                                 if (var36 < 0) {
                                    var36 = var23.length - 1;
                                 }

                                 ((HytaleLogger.Api)LOGGER.atInfo())
                                    .log("[ChangeFarmingStage] Mode=ABSOLUTE: targetStage=%d, resolved=%d", this.targetStage, var36);
                              }

                              int var29 = var36;
                              if (var36 < 0) {
                                 var36 = 0;
                              }

                              if (var36 >= var23.length) {
                                 var36 = var23.length - 1;
                              }

                              if (var29 != var36) {
                                 ((HytaleLogger.Api)LOGGER.atInfo()).log("[ChangeFarmingStage] Clamped stageIndex from %d to %d", var29, var36);
                              }

                              int var30 = (int)var24.getGrowthProgress();
                              FarmingStageData var31 = null;
                              FarmingStageData[] var32 = var15.getStages().get(var24.getCurrentStageSet());
                              if (var32 != null && var30 >= 0 && var30 < var32.length) {
                                 var31 = var32[var30];
                              }

                              ((HytaleLogger.Api)LOGGER.atInfo())
                                 .log("[ChangeFarmingStage] Previous stage data: index=%d, hasPreviousStage=%s", var30, var31 != null);
                              var24.setCurrentStageSet(var35);
                              var24.setGrowthProgress(var36);
                              var24.setExecutions(0);
                              var24.setGeneration(var24.getGeneration() + 1);
                              var24.setLastTickGameTime(var17);
                              var18.markBlockNeedsSaving(var19);
                              ((HytaleLogger.Api)LOGGER.atInfo())
                                 .log(
                                    "[ChangeFarmingStage] Updated FarmingBlock: stageSet=%s, growthProgress=%d, generation=%d",
                                    var35,
                                    var36,
                                    var24.getGeneration()
                                 );
                              var13.scheduleTick(var19, var17);
                              var23[var36]
                                 .apply(
                                    var11,
                                    var12,
                                    var20,
                                    ChunkUtil.localCoordinate(var8),
                                    ChunkUtil.localCoordinate(var9),
                                    ChunkUtil.localCoordinate(var10),
                                    var31
                                 );
                              ((HytaleLogger.Api)LOGGER.atInfo()).log("[ChangeFarmingStage] Applied stage %d via stages[%d].apply()", var36, var36);
                              var13.setTicking(var8, var9, var10, true);
                              ((HytaleLogger.Api)LOGGER.atInfo())
                                 .log("[ChangeFarmingStage] SUCCESS: Changed stage from %d to %d at pos=(%d, %d, %d)", var28, var36, var8, var9, var10);
                           } else {
                              ((HytaleLogger.Api)LOGGER.atWarning())
                                 .log("[ChangeFarmingStage] FAILED: stages null/empty after re-fetch with stageSet=%s", var35);
                              var4.getState().state = InteractionState.Failed;
                           }
                        }
                     } else {
                        ((HytaleLogger.Api)LOGGER.atWarning()).log("[ChangeFarmingStage] FAILED: stages is null or empty for stageSet=%s", var22);
                        var4.getState().state = InteractionState.Failed;
                     }
                  }
               } else {
                  ((HytaleLogger.Api)LOGGER.atWarning())
                     .log(
                        "[ChangeFarmingStage] FAILED: farmingConfig is null or has no stages. blockType=%s, hasFarmingConfig=%s", var14.getId(), var15 != null
                     );
                  var4.getState().state = InteractionState.Failed;
               }
            }
         }
      } else {
         ((HytaleLogger.Api)LOGGER.atWarning()).log("[ChangeFarmingStage] FAILED: section is not loaded at pos=(%d, %d, %d)", var8, var9, var10);
         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">public String toString() {
      class="kw">return "ChangeFarmingStageInteraction{targetStage="
         + this.targetStage
         + ", increaseBy="
         + this.increaseBy
         + ", decreaseBy="
         + this.decreaseBy
         + ", targetStageSet='"
         + this.targetStageSet
         + "'} "
         + super.toString();
   }
}