FarmingUtil class

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

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

Поля (74)

МодификаторыТипИмя
final int MAX_SECONDS_BETWEEN_TICKS
break
break
break
break
return
World var10
FarmingData var10
Store var11
boolean var11
WorldTimeResource var12
Ref var12
Instant var13
Map var13
BlockType var14
FarmingStageData[] var14
FarmingData var15
int var15
float var16
var16
var16
FarmingStageData var16
int var17
var17
var17
var17
String var17
String var18
var18
FarmingStageData[] var18
FarmingStageData[] var19
var19
FarmingBlock var19
var19
var19
long var20
var20
Instant var20
int var21
ChunkSection var22
Ref var22
var22
int var23
Holder var23
int var24
BlockSection var24
int var25
TickSuppressionRegistry var26
FarmingStageData var27
Rangef var28
double var29
PersistentModel var3
double var31
long var33
var33
double var35
Ref var4
ModelAsset var4
GrowthModifierAsset var41
int var45
long var46
long var47
BlockSection var5
CapturedNPCMetadata var5
String var5
BlockType var6
BlockGathering var6
String var6
long var7
int var7
HarvestingDropType var7
List var7
World var8
Vector3d var9

Методы (34)

МодификаторыВозвратСигнатура
static long cappedTickNanoslong cappedTickNanos(long var0, @Nonnull World var2, @Nonnull FarmingBlock var3, int var4, int var5, int var6)
for for(ItemStack var9 : var7)
static void giveDropsvoid giveDrops(@Nonnull ComponentAccessor<EntityStore> var0, @Nullable Ref<EntityStore> var1, @Nonnull Vector3d var2, @Nonnull BlockType var3, @Nonnull HarvestingDropType var4)
abstract giveDrops giveDrops(var1, var2, var9, var3, var7)
static boolean harvestboolean harvest(@Nonnull ComponentAccessor<ChunkStore> var0, @Nonnull ComponentAccessor<EntityStore> var1, @Nullable Ref<EntityStore> var2, @Nonnull Vector3i var3)
static boolean harvestboolean harvest(@Nonnull ComponentAccessor<ChunkStore> var0, @Nonnull ComponentAccessor<EntityStore> var1, @Nullable Ref<EntityStore> var2, @Nonnull BlockType var3, int var4, @Nonnull Vector3i var5)
abstract return harvestreturn harvest(var0, var1, var2, var6, var7, var3)
static boolean harvest0boolean harvest0(@Nonnull ComponentAccessor<ChunkStore> var0, @Nonnull ComponentAccessor<EntityStore> var1, @Nullable Ref<EntityStore> var2, @Nonnull BlockType var3, int var4, @Nonnull Vector3i var5)
if if(var14 != null)
if if(var19 == null)
if if(var18 == null)
if if(var19 != null)
if if(var17 < 0)
if if(var17 >= var19.length)
if if(var22 != null)
if if(var28 == null)
if if(var41 != null)
if if(var20 < var33)
if if(var17 >= var19.length)
if if(var4 == null)
if if(var5 == null)
if if(var6 == null)
if if(var3 == null)
if if(var4 != null)
if if(var6 == null)
if if(var7 == null)
if if(var14 == null)
if if(var18 != null && var18.length != 0)
if if(var22 == null)
if if(var22 == null)
if if(var24 != null)
if if(var1 == null)
static void tickFarmingvoid tickFarming(@Nonnull CommandBuffer<ChunkStore> var0, @Nonnull BlockModule.BlockStateInfo var1, @Nonnull BlockSection var2, @Nonnull Ref<ChunkStore> var3, @Nonnull Ref<ChunkStore> var4, @Nonnull FarmingBlock var5, int var6, int var7, int var8, boolean var9)
while while(var17 < var19.length)

Исходный код

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

class="kw">import com.hypixel.hytale.builtin.adventure.farming.states.FarmingBlock;
class="kw">import com.hypixel.hytale.component.AddReason;
class="kw">import com.hypixel.hytale.component.CommandBuffer;
class="kw">import com.hypixel.hytale.component.ComponentAccessor;
class="kw">import com.hypixel.hytale.component.Holder;
class="kw">import com.hypixel.hytale.component.Ref;
class="kw">import com.hypixel.hytale.component.RemoveReason;
class="kw">import com.hypixel.hytale.component.Store;
class="kw">import com.hypixel.hytale.math.util.ChunkUtil;
class="kw">import com.hypixel.hytale.math.util.HashUtil;
class="kw">import com.hypixel.hytale.math.vector.Rotation3f;
class="kw">import com.hypixel.hytale.protocol.Rangef;
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.HarvestingDropType;
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.asset.type.blocktype.config.farming.GrowthModifierAsset;
class="kw">import com.hypixel.hytale.server.core.asset.type.model.config.ModelAsset;
class="kw">import com.hypixel.hytale.server.core.entity.ItemUtils;
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.entity.component.PersistentModel;
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.time.WorldTimeResource;
class="kw">import com.hypixel.hytale.server.core.universe.world.TickSuppressionRegistry;
class="kw">import com.hypixel.hytale.server.core.universe.world.World;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.BlockOperations;
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.npc.metadata.CapturedNPCMetadata;
class="kw">import java.time.Instant;
class="kw">import java.util.List;
class="kw">import java.util.Map;
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 FarmingUtil {
   class="kw">private class="kw">static class="kw">final int MAX_SECONDS_BETWEEN_TICKS = 15;
   class="kw">private class="kw">static class="kw">final int BETWEEN_RANDOM = 10;

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

   class="kw">private class="kw">static long cappedTickNanos(long var0, @Nonnull World var2, @Nonnull FarmingBlock var3, int var4, int var5, int var6) {
      long var7 = (long)(
         (15.0 + 10.0 * HashUtil.random(var3.getGeneration() ^ 3405692655L, var4, var5, var6))
            * var2.getTps()
            * WorldTimeResource.getSecondsPerTick(var2)
            * 1.0E9
      );
      class="kw">return Math.min(var0, var7);
   }

   class="kw">public class="kw">static void tickFarming(
      @Nonnull CommandBuffer<ChunkStore> var0,
      @Nonnull BlockModule.BlockStateInfo var1,
      @Nonnull BlockSection var2,
      @Nonnull Ref<ChunkStore> var3,
      @Nonnull Ref<ChunkStore> var4,
      @Nonnull FarmingBlock var5,
      int var6,
      int var7,
      int var8,
      boolean var9
   ) {
      World var10 = var0.getExternalData().getWorld();
      Store var11 = var10.getEntityStore().getStore();
      WorldTimeResource var12 = var11.getResource(WorldTimeResource.getResourceType());
      Instant var13 = var12.getGameTime();
      BlockType var14 = var5.getPreviousBlockType() != null
         ? BlockType.getAssetMap().getAsset(var5.getPreviousBlockType())
         : BlockType.getAssetMap().getAsset(var2.get(var6, var7, var8));
      if (var14 != null) {
         if (var14.getFarming() != null) {
            FarmingData var15 = var14.getFarming();
            if (var15.getStages() != null) {
               float var16 = var5.getGrowthProgress();
               int var17 = (int)var16;
               String var18 = var5.getCurrentStageSet();
               FarmingStageData[] var19 = var15.getStages().get(var18);
               if (var19 == null) {
                  var18 = var15.getStartingStageSet();
                  if (var18 == null) {
                     class="kw">return;
                  }

                  var5.setCurrentStageSet(var18);
                  var19 = var15.getStages().get(var18);
                  var1.markNeedsSaving();
               }

               if (var19 != null) {
                  if (var17 < 0) {
                     var17 = 0;
                     var16 = 0.0F;
                     var5.setGrowthProgress(0.0F);
                  }

                  if (var17 >= var19.length) {
                     var0.removeEntity(var4, RemoveReason.REMOVE);
                  } else {
                     long var20 = var13.getEpochSecond() - var5.getLastTickGameTime().getEpochSecond();
                     ChunkSection var22 = var0.getComponent(var3, ChunkSection.getComponentType());
                     if (var22 != null) {
                        int var23 = ChunkUtil.worldCoordFromLocalCoord(var22.getX(), var6);
                        int var24 = ChunkUtil.worldCoordFromLocalCoord(var22.getY(), var7);
                        int var25 = ChunkUtil.worldCoordFromLocalCoord(var22.getZ(), var8);
                        TickSuppressionRegistry var26 = var11.getResource(TickSuppressionRegistry.RESOURCE);
                        if (var26 != null && var26.isBlockSuppressed(var23, var24, var25, 1)) {
                           var5.setLastTickGameTime(var13);
                           var1.markNeedsSaving();
                           var2.scheduleTick(
                              ChunkUtil.indexBlock(var6, var7, var8), var13.plusNanos(cappedTickNanos(Long.MAX_VALUE, var10, var5, var23, var24, var25))
                           );
                        } else {
                           while (var17 < var19.length) {
                              FarmingStageData var27 = var19[var17];
                              if (var27.shouldStop(var0, var3, var4, var6, var7, var8)) {
                                 var1.markNeedsSaving();
                                 var5.setGrowthProgress(var19.length);
                                 var0.removeEntity(var4, RemoveReason.REMOVE);
                                 break;
                              }

                              Rangef var28 = var27.getDuration();
                              if (var28 == null) {
                                 var1.markNeedsSaving();
                                 var0.removeEntity(var4, RemoveReason.REMOVE);
                                 break;
                              }

                              double var29 = HashUtil.random(var5.getGeneration(), var23, var24, var25);
                              double var31 = var28.min + (var28.max - var28.min) * var29;
                              long var33 = Math.round(var31 * (1.0 - var16 % 1.0));
                              double var35 = 1.0;
                              if (var15.getGrowthModifiers() != null) {
                                 for (String var40 : var15.getGrowthModifiers()) {
                                    GrowthModifierAsset var41 = GrowthModifierAsset.getAssetMap().getAsset(var40);
                                    if (var41 != null) {
                                       var35 *= var41.getCurrentGrowthMultiplier(var0, var3, var4, var6, var7, var8, var9);
                                    }
                                 }
                              }

                              var33 = Math.round(var33 / var35);
                              if (var20 < var33) {
                                 var16 += (float)(var20 / (var31 / var35));
                                 var5.setGrowthProgress(var16);
                                 var1.markNeedsSaving();
                                 long var46 = (var33 - var20) * 1000000000L;
                                 var2.scheduleTick(
                                    ChunkUtil.indexBlock(var6, var7, var8), var13.plusNanos(cappedTickNanos(var46, var10, var5, var23, var24, var25))
                                 );
                                 break;
                              }

                              var20 -= var33;
                              int var45 = var17 + 1;
                              if (var45 < var19.length && !var19[var45].canApply(var0, var3, var4, var6, var7, var8)) {
                                 var5.setGrowthProgress(var17);
                                 var1.markNeedsSaving();
                                 long var47 = Math.round(var31 / var35) * 1000000000L;
                                 var2.scheduleTick(ChunkUtil.indexBlock(var6, var7, var8), var13.plusNanos(var47));
                                 break;
                              }

                              var17 = var45;
                              var16 = var17;
                              var5.setGrowthProgress(var16);
                              var1.markNeedsSaving();
                              var5.setGeneration(var5.getGeneration() + 1);
                              if (var17 >= var19.length) {
                                 if (var19[var17 - 1].implementsShouldStop()) {
                                    var17 = var19.length - 1;
                                    var5.setGrowthProgress(var17);
                                    var19[var17].apply(var0, var3, var4, var6, var7, var8, var19[var17]);
                                 } else {
                                    var5.setGrowthProgress(var19.length);
                                    var0.removeEntity(var4, RemoveReason.REMOVE);
                                 }
                              } else {
                                 var5.setExecutions(0);
                                 var19[var17].apply(var0, var3, var4, var6, var7, var8, var19[var17 - 1]);
                                 if (var19[var17].consumesRemainingTime()) {
                                    var20 = 0L;
                                 }
                              }
                           }

                           var5.setLastTickGameTime(var13);
                        }
                     }
                  }
               }
            }
         }
      }
   }

   class="kw">public class="kw">static boolean harvest(
      @Nonnull ComponentAccessor<ChunkStore> var0, @Nonnull ComponentAccessor<EntityStore> var1, @Nullable Ref<EntityStore> var2, @Nonnull Vector3i var3
   ) {
      Ref var4 = var0.getExternalData().getWorld().getChunkStore().getChunkSectionReferenceAtBlock(var3.x, var3.y, var3.z);
      if (var4 == null) {
         class="kw">return false;
      }

      BlockSection var5 = var0.getComponent(var4, BlockSection.getComponentType());
      if (var5 == null) {
         class="kw">return false;
      }

      BlockType var6 = BlockType.getAssetMap().getAsset(var5.get(var3.x, var3.y, var3.z));
      if (var6 == null) {
         class="kw">return false;
      }

      int var7 = var5.getRotationIndex(var3.x, var3.y, var3.z);
      class="kw">return harvest(var0, var1, var2, var6, var7, var3);
   }

   class="kw">public class="kw">static boolean harvest(
      @Nonnull ComponentAccessor<ChunkStore> var0,
      @Nonnull ComponentAccessor<EntityStore> var1,
      @Nullable Ref<EntityStore> var2,
      @Nonnull BlockType var3,
      int var4,
      @Nonnull Vector3i var5
   ) {
      class="kw">return var0.getExternalData().getWorld().getGameplayConfig().getWorldConfig().isBlockGatheringAllowed()
         ? harvest0(var0, var1, var2, var3, var4, var5)
         : false;
   }

   @Nullable
   class="kw">public class="kw">static CapturedNPCMetadata generateCapturedNPCMetadata(@Nonnull ComponentAccessor<EntityStore> var0, @Nonnull Ref<EntityStore> var1, String var2) {
      PersistentModel var3 = var0.getComponent(var1, PersistentModel.getComponentType());
      if (var3 == null) {
         class="kw">return null;
      }

      ModelAsset var4 = ModelAsset.getAssetMap().getAsset(var3.getModelReference().getModelAssetId());
      CapturedNPCMetadata var5 = new CapturedNPCMetadata();
      if (var4 != null) {
         var5.setIconPath(var4.getIcon());
      }

      var5.setNpcNameKey(var2);
      class="kw">return var5;
   }

   class="kw">protected class="kw">static boolean harvest0(
      @Nonnull ComponentAccessor<ChunkStore> var0,
      @Nonnull ComponentAccessor<EntityStore> var1,
      @Nullable Ref<EntityStore> var2,
      @Nonnull BlockType var3,
      int var4,
      @Nonnull Vector3i var5
   ) {
      BlockGathering var6 = var3.getGathering();
      if (var6 == null) {
         class="kw">return false;
      }

      HarvestingDropType var7 = var6.getHarvest();
      if (var7 == null) {
         class="kw">return false;
      }

      World var8 = var0.getExternalData().getWorld();
      Vector3d var9 = new Vector3d();
      var3.getBlockCenter(var4, var9);
      var9.add(var5.x, var5.y, var5.z);
      FarmingData var10 = var3.getFarming();
      boolean var11 = var10 != null && var10.getStages() != null;
      Ref var12 = var8.getChunkStore().getChunkSectionReferenceAtBlock(var5.x, var5.y, var5.z);
      if (var12 == null || !var12.isValid()) {
         class="kw">return false;
      }

      if (var11 && var10.getStageSetAfterHarvest() != null) {
         giveDrops(var1, var2, var9, var3, var7);
         Map var13 = var10.getStages();
         FarmingStageData[] var14 = var13.get(var10.getStartingStageSet());
         if (var14 == null) {
            class="kw">return false;
         }

         int var15 = var14.length - 1;
         FarmingStageData var16 = var14[var15];
         String var17 = var10.getStageSetAfterHarvest();
         FarmingStageData[] var18 = var13.get(var17);
         if (var18 != null && var18.length != 0) {
            Instant var20 = var1.getResource(WorldTimeResource.getResourceType()).getGameTime();
            int var21 = ChunkUtil.indexBlock(var5.x, var5.y, var5.z);
            Ref var22 = BlockModule.getBlockEntity(var0, var12, var5.x, var5.y, var5.z);
            FarmingBlock var19;
            if (var22 == null) {
               Holder var23 = ChunkStore.REGISTRY.newHolder();
               var23.putComponent(BlockModule.BlockStateInfo.getComponentType(), new BlockModule.BlockStateInfo(var21, var12));
               var19 = new FarmingBlock();
               var19.setLastTickGameTime(var20);
               var19.setCurrentStageSet(var17);
               var23.addComponent(FarmingBlock.getComponentType(), var19);
               var22 = var0.addEntity(var23, AddReason.SPAWN);
            } else {
               var19 = var0.ensureAndGetComponent(var22, FarmingBlock.getComponentType());
            }

            var19.setCurrentStageSet(var17);
            var19.setGrowthProgress(0.0F);
            var19.setExecutions(0);
            var19.setGeneration(var19.getGeneration() + 1);
            var19.setLastTickGameTime(var20);
            if (var22 == null) {
               class="kw">return false;
            }

            BlockSection var24 = var0.getComponent(var12, BlockSection.getComponentType());
            if (var24 != null) {
               var24.scheduleTick(var21, var20);
            }

            var18[0].apply(var0, var12, var22, ChunkUtil.localCoordinate(var5.x), ChunkUtil.localCoordinate(var5.y), ChunkUtil.localCoordinate(var5.z), var16);
            class="kw">return true;
         } else {
            BlockOperations.setBlock(var8.getChunkStore(), var12, var5.x, var5.y, var5.z, 0, BlockType.EMPTY, 0, 0, 0);
            class="kw">return false;
         }
      } else {
         giveDrops(var1, var2, var9, var3, var7);
         BlockOperations.setBlock(var8.getChunkStore(), var12, var5.x, var5.y, var5.z, 0, BlockType.EMPTY, 0, 0, 0);
         class="kw">return true;
      }
   }

   class="kw">protected class="kw">static void giveDrops(
      @Nonnull ComponentAccessor<EntityStore> var0,
      @Nullable Ref<EntityStore> var1,
      @Nonnull Vector3d var2,
      @Nonnull BlockType var3,
      @Nonnull HarvestingDropType var4
   ) {
      String var5 = var4.getItemId();
      String var6 = var4.getDropListId();
      List var7 = BlockHarvestUtils.getDrops(var3, 1, var5, var6);
      if (var1 == null) {
         var0.addEntities(ItemComponent.generateItemDrops(var0, var7, var2, Rotation3f.IDENTITY), AddReason.SPAWN);
      } else {
         for (ItemStack var9 : var7) {
            ItemUtils.interactivelyPickupItem(var1, var9, var2, var0);
         }
      }
   }
}