Ticking class

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

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

extends: EntityTickingSystem<ChunkStore>

Поля (77)

МодификаторыТипИмя
private final ComponentType<ChunkStore, BlockSection> blockSectionComponentType
private final ComponentType<ChunkStore, ChunkSection> chunkSectionComponentType
private final ComponentType<ChunkStore, CoopBlock> coopBlockComponentType
private final ComponentType<ChunkStore, FarmingBlock> farmingBlockComponentType
private final Query<ChunkStore> query
private final ComponentType<ChunkStore, TilledSoilBlock> tilledSoilBlockComponentType
Ref var10
ChunkSection var10
int var10
TickSuppressionRegistry var11
BlockSection var11
int var11
TickSuppressionRegistry var12
Ref var12
boolean var12
int var12
int var13
BlockModule.BlockStateInfo var13
int var13
BlockSection var13
int var14
FarmingBlock var14
BlockType var14
ChunkSection var14
TilledSoilBlock var15
Instant var15
int var15
boolean var15
CoopBlock var16
Instant var16
int var16
BlockType var16
FarmingData.SoilConfig var17
int var17
String var18
double var18
int var19
BlockType var20
Vector3d var20
int var21
Vector3i var21
int var22
boolean var22
int var23
float var23
int var24
Instant var24
ChunkStore var25
Instant var26
String var27
int var28
int var29
BlockModule.BlockStateInfo var3
BlockModule.BlockStateInfo var3
BlockType var30
int var31
int var32
int var33
ChunkStore var34
int var4
Ref var4
int var5
World var5
BlockSection var6
int var6
Store var6
List var6
ChunkSection var7
int var7
WorldTimeResource var7
boolean var7
Ref var8
Ref var8
FarmingCoopAsset var8
BlockComponentSection var9
BlockSection var9
int var9

Методы (23)

МодификаторыВозвратСигнатура
for for(Ref var9 : var6)
public Query<ChunkStore> getQuerypublic Query<ChunkStore> getQuery()
if if(var12 == null)
if if(var14 != null)
if if(var15 != null)
if if(var16 != null)
if if(var9 == null)
if if(var10 == null)
if if(var11 == null)
if if(var14 == null)
if if(var26 != null)
if if(var18 == null)
if if(var19 == Integer.MIN_VALUE)
if if(var8 != null)
if if(var22 && var23 >= 0.0F)
if if(var7)
if if(var15)
if if(var24 != null)
public void tickpublic void tick(float var1, int var2, @Nonnull ArchetypeChunk<ChunkStore> var3, @Nonnull Store<ChunkStore> var4, @Nonnull CommandBuffer<ChunkStore> var5)
private static void tickCoopprivate static void tickCoop(@Nonnull CommandBuffer<ChunkStore> var0, @Nonnull Ref<ChunkStore> var1, @Nonnull CoopBlock var2)
abstract tickCoop tickCoop(var7x, var12, var16)
private static BlockTickStrategy tickSoilprivate static BlockTickStrategy tickSoil(@Nonnull CommandBuffer<ChunkStore> var0, @Nonnull Ref<ChunkStore> var1, @Nonnull TilledSoilBlock var2)
abstract return tickSoilreturn tickSoil(var7x, var12, var15)

Исходный код

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

class="kw">import com.hypixel.hytale.builtin.adventure.farming.component.CoopResidentComponent;
class="kw">import com.hypixel.hytale.builtin.adventure.farming.config.FarmingCoopAsset;
class="kw">import com.hypixel.hytale.builtin.adventure.farming.config.stages.BlockStateFarmingStageData;
class="kw">import com.hypixel.hytale.builtin.adventure.farming.config.stages.BlockTypeFarmingStageData;
class="kw">import com.hypixel.hytale.builtin.adventure.farming.states.CoopBlock;
class="kw">import com.hypixel.hytale.builtin.adventure.farming.states.FarmingBlock;
class="kw">import com.hypixel.hytale.builtin.adventure.farming.states.TilledSoilBlock;
class="kw">import com.hypixel.hytale.component.AddReason;
class="kw">import com.hypixel.hytale.component.ArchetypeChunk;
class="kw">import com.hypixel.hytale.component.CommandBuffer;
class="kw">import com.hypixel.hytale.component.ComponentAccessor;
class="kw">import com.hypixel.hytale.component.ComponentType;
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.component.query.Query;
class="kw">import com.hypixel.hytale.component.system.RefSystem;
class="kw">import com.hypixel.hytale.component.system.tick.EntityTickingSystem;
class="kw">import com.hypixel.hytale.math.util.ChunkUtil;
class="kw">import com.hypixel.hytale.math.vector.Vector3iUtil;
class="kw">import com.hypixel.hytale.protocol.Rangef;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktick.BlockTickStrategy;
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.UUIDComponent;
class="kw">import com.hypixel.hytale.server.core.modules.block.BlockModule;
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.ChunkColumn;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.ChunkFlag;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.WorldChunk;
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.TargetUtil;
class="kw">import java.time.Instant;
class="kw">import java.time.temporal.ChronoUnit;
class="kw">import java.util.List;
class="kw">import java.util.Map;
class="kw">import java.util.UUID;
class="kw">import java.util.concurrent.ThreadLocalRandom;
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 FarmingSystems {
   class="kw">public FarmingSystems() {
   }

   class="kw">private class="kw">static boolean hasCropAbove(@Nonnull BlockSection var0, int var1, int var2, int var3) {
      BlockType var4 = BlockType.getAssetMap().getAsset(var0.get(var1, var2 + 1, var3));
      if (var4 == null) {
         class="kw">return false;
      }

      FarmingData var5 = var4.getFarming();
      class="kw">return var5 != null && var5.getStages() != null;
   }

   @Nullable
   class="kw">private class="kw">static BlockSection blockSectionAbove(@Nonnull ComponentAccessor<ChunkStore> var0, @Nonnull ChunkSection var1) {
      Ref var2 = var0.getExternalData().getChunkSectionReference(var1.getX(), var1.getY() + 1, var1.getZ());
      class="kw">return var2 != null && var2.isValid() ? var0.getComponent(var2, BlockSection.getComponentType()) : null;
   }

   class="kw">private class="kw">static boolean updateSoilDecayTime(@Nonnull CommandBuffer<ChunkStore> var0, @Nonnull TilledSoilBlock var1, @Nullable BlockType var2) {
      if (var2 == null) {
         class="kw">return false;
      }

      FarmingData var3 = var2.getFarming();
      if (var3 != null && var3.getSoilConfig() != null) {
         FarmingData.SoilConfig var4 = var3.getSoilConfig();
         Rangef var5 = var4.getLifetime();
         if (var5 == null) {
            class="kw">return false;
         }

         double var6 = var5.min + (var5.max - var5.min) * ThreadLocalRandom.current().nextDouble();
         Instant var8 = var0.getExternalData().getWorld().getEntityStore().getStore().getResource(WorldTimeResource.getResourceType()).getGameTime();
         Instant var9 = var8.plus(Math.round(var6), ChronoUnit.SECONDS);
         var1.setDecayTime(var9);
         class="kw">return true;
      } else {
         class="kw">return false;
      }
   }

   class="kw">public class="kw">static class CoopResidentEntitySystem class="kw">extends RefSystem<EntityStore> {
      @Nonnull
      class="kw">private class="kw">final ComponentType<EntityStore, CoopResidentComponent> coopResidentComponentType;
      @Nonnull
      class="kw">private class="kw">final ComponentType<EntityStore, UUIDComponent> uuidComponentType;

      class="kw">public CoopResidentEntitySystem(@Nonnull ComponentType<EntityStore, CoopResidentComponent> var1, @Nonnull ComponentType<EntityStore, UUIDComponent> var2) {
         this.coopResidentComponentType = var1;
         this.uuidComponentType = var2;
      }

      @Nonnull
      @Override
      class="kw">public Query<EntityStore> getQuery() {
         class="kw">return this.coopResidentComponentType;
      }

      @Override
      class="kw">public void onEntityAdded(
         @Nonnull Ref<EntityStore> var1, @Nonnull AddReason var2, @Nonnull Store<EntityStore> var3, @Nonnull CommandBuffer<EntityStore> var4
      ) {
      }

      @Override
      class="kw">public void onEntityRemove(
         @Nonnull Ref<EntityStore> var1, @Nonnull RemoveReason var2, @Nonnull Store<EntityStore> var3, @Nonnull CommandBuffer<EntityStore> var4
      ) {
         if (var2 != RemoveReason.UNLOAD) {
            UUIDComponent var5 = var4.getComponent(var1, this.uuidComponentType);
            if (var5 != null) {
               UUID var6 = var5.getUuid();
               CoopResidentComponent var7 = var4.getComponent(var1, this.coopResidentComponentType);
               if (var7 != null) {
                  Vector3i var8 = var7.getCoopLocation();
                  World var9 = var4.getExternalData().getWorld();
                  long var10 = ChunkUtil.indexChunkFromBlock(var8.x, var8.z);
                  Ref var12 = var9.getChunkStore().getChunkReference(var10);
                  if (var12 != null && var12.isValid()) {
                     Store var13 = var9.getChunkStore().getStore();
                     WorldChunk var14 = var13.getComponent(var12, WorldChunk.getComponentType());
                     if (var14 != null && var14.is(ChunkFlag.TICKING)) {
                        ChunkColumn var15 = var13.getComponent(var12, ChunkColumn.getComponentType());
                        if (var15 != null) {
                           Ref var16 = var15.getSection(ChunkUtil.chunkCoordinate(var8.y));
                           if (var16 != null && var16.isValid()) {
                              Ref var17 = BlockModule.getBlockEntity(var13, var16, var8.x, var8.y, var8.z);
                              if (var17 != null) {
                                 CoopBlock var18 = var13.getComponent(var17, CoopBlock.getComponentType());
                                 if (var18 != null) {
                                    var18.handleResidentDespawn(var6);
                                 }
                              }
                           }
                        }
                     }
                  }
               }
            }
         }
      }
   }

   class="kw">public class="kw">static class CoopResidentTicking class="kw">extends EntityTickingSystem<EntityStore> {
      @Nonnull
      class="kw">private class="kw">final ComponentType<EntityStore, CoopResidentComponent> coopResidentComponentType;

      class="kw">public CoopResidentTicking(@Nonnull ComponentType<EntityStore, CoopResidentComponent> var1) {
         this.coopResidentComponentType = var1;
      }

      @Nonnull
      @Override
      class="kw">public Query<EntityStore> getQuery() {
         class="kw">return this.coopResidentComponentType;
      }

      @Override
      class="kw">public void tick(
         float var1, int var2, @Nonnull ArchetypeChunk<EntityStore> var3, @Nonnull Store<EntityStore> var4, @Nonnull CommandBuffer<EntityStore> var5
      ) {
         CoopResidentComponent var6 = var3.getComponent(var2, this.coopResidentComponentType);
         assert var6 != null;
         if (var6.getMarkedForDespawn()) {
            var5.removeEntity(var3.getReferenceTo(var2), RemoveReason.REMOVE);
         }
      }
   }

   class="kw">public class="kw">static class OnCoopAdded class="kw">extends RefSystem<ChunkStore> {
      @Nonnull
      class="kw">private class="kw">final ComponentType<ChunkStore, BlockModule.BlockStateInfo> blockStateInfoComponentType;
      @Nonnull
      class="kw">private class="kw">final ComponentType<ChunkStore, CoopBlock> coopBlockComponentType;
      @Nonnull
      class="kw">private class="kw">final Query<ChunkStore> query;

      class="kw">public OnCoopAdded(@Nonnull ComponentType<ChunkStore, BlockModule.BlockStateInfo> var1, @Nonnull ComponentType<ChunkStore, CoopBlock> var2) {
         this.blockStateInfoComponentType = var1;
         this.coopBlockComponentType = var2;
         this.query = Query.and(var1, var2);
      }

      @Override
      class="kw">public void onEntityAdded(
         @Nonnull Ref<ChunkStore> var1, @Nonnull AddReason var2, @Nonnull Store<ChunkStore> var3, @Nonnull CommandBuffer<ChunkStore> var4
      ) {
         CoopBlock var5 = var4.getComponent(var1, this.coopBlockComponentType);
         assert var5 != null;
         BlockModule.BlockStateInfo var6 = var4.getComponent(var1, this.blockStateInfoComponentType);
         assert var6 != null;
         World var7 = var4.getExternalData().getWorld();
         Store var8 = var7.getEntityStore().getStore();
         WorldTimeResource var9 = var8.getResource(WorldTimeResource.getResourceType());
         int var10 = var6.getIndex();
         int var11 = ChunkUtil.xFromIndex(var10);
         int var12 = ChunkUtil.yFromIndex(var10);
         int var13 = ChunkUtil.zFromIndex(var10);
         Ref var14 = var6.getSectionRef();
         if (var14.isValid()) {
            BlockSection var15 = var4.getComponent(var14, BlockSection.getComponentType());
            if (var15 != null) {
               var15.scheduleTick(ChunkUtil.indexBlock(var11, var12, var13), var5.getNextScheduledTick(var9));
            }
         }
      }

      @Override
      class="kw">public void onEntityRemove(
         @Nonnull Ref<ChunkStore> var1, @Nonnull RemoveReason var2, @Nonnull Store<ChunkStore> var3, @Nonnull CommandBuffer<ChunkStore> var4
      ) {
         if (var2 != RemoveReason.UNLOAD) {
            CoopBlock var5 = var4.getComponent(var1, this.coopBlockComponentType);
            assert var5 != null;
            BlockModule.BlockStateInfo var6 = var4.getComponent(var1, this.blockStateInfoComponentType);
            assert var6 != null;
            Ref var7 = var6.getSectionRef();
            if (var7.isValid()) {
               int var8 = var6.getIndex();
               int var9 = ChunkUtil.xFromIndex(var8);
               int var10 = ChunkUtil.yFromIndex(var8);
               int var11 = ChunkUtil.zFromIndex(var8);
               ChunkSection var12 = var4.getComponent(var7, ChunkSection.getComponentType());
               assert var12 != null;
               int var13 = ChunkUtil.worldCoordFromLocalCoord(var12.getX(), var9);
               int var14 = ChunkUtil.worldCoordFromLocalCoord(var12.getY(), var10);
               int var15 = ChunkUtil.worldCoordFromLocalCoord(var12.getZ(), var11);
               World var16 = var4.getExternalData().getWorld();
               Store var17 = var16.getEntityStore().getStore();
               WorldTimeResource var18 = var17.getResource(WorldTimeResource.getResourceType());
               var5.handleBlockBroken(var16, var18, var17, var13, var14, var15);
            }
         }
      }

      @Nonnull
      @Override
      class="kw">public Query<ChunkStore> getQuery() {
         class="kw">return this.query;
      }
   }

   class="kw">public class="kw">static class OnFarmBlockAdded class="kw">extends RefSystem<ChunkStore> {
      @Nonnull
      class="kw">private class="kw">final ComponentType<ChunkStore, BlockModule.BlockStateInfo> blockStateInfoComponentType;
      @Nonnull
      class="kw">private class="kw">final ComponentType<ChunkStore, FarmingBlock> farmingBlockComponentType;
      @Nonnull
      class="kw">private class="kw">final Query<ChunkStore> query;

      class="kw">public OnFarmBlockAdded(@Nonnull ComponentType<ChunkStore, BlockModule.BlockStateInfo> var1, @Nonnull ComponentType<ChunkStore, FarmingBlock> var2) {
         this.blockStateInfoComponentType = var1;
         this.farmingBlockComponentType = var2;
         this.query = Query.and(var1, var2);
      }

      @Override
      class="kw">public void onEntityAdded(
         @Nonnull Ref<ChunkStore> var1, @Nonnull AddReason var2, @Nonnull Store<ChunkStore> var3, @Nonnull CommandBuffer<ChunkStore> var4
      ) {
         FarmingBlock var5 = var4.getComponent(var1, this.farmingBlockComponentType);
         assert var5 != null;
         BlockModule.BlockStateInfo var6 = var4.getComponent(var1, this.blockStateInfoComponentType);
         assert var6 != null;
         Ref var7 = var6.getSectionRef();
         if (var7.isValid()) {
            BlockSection var8 = var4.getComponent(var7, BlockSection.getComponentType());
            assert var8 != null;
            World var9 = var3.getExternalData().getWorld();
            Store var10 = var9.getEntityStore().getStore();
            WorldTimeResource var11 = var10.getResource(WorldTimeResource.getResourceType());
            if (var5.getLastTickGameTime() == null) {
               int var12 = var6.getIndex();
               int var13 = var8.get(ChunkUtil.xFromIndex(var12), ChunkUtil.yFromIndex(var12), ChunkUtil.zFromIndex(var12));
               BlockType var14 = BlockType.getAssetMap().getAsset(var13);
               if (var14 == null) {
                  class="kw">return;
               }

               FarmingData var15 = var14.getFarming();
               if (var15 == null) {
                  class="kw">return;
               }

               String var16 = var15.getStartingStageSet();
               var5.setCurrentStageSet(var16);
               var5.setLastTickGameTime(var11.getGameTime());
               var6.markNeedsSaving();
               Map var17 = var15.getStages();
               if (var17 != null) {
                  FarmingStageData[] var18 = var17.get(var16);
                  if (var18 != null && var18.length > 0) {
                     boolean var19 = false;

                     for (int var20 = 0; var20 < var18.length; var20++) {
                        FarmingStageData var21 = var18[var20];
                        class="kw">switch (var21) {
                           case BlockTypeFarmingStageData var24:
                              if (var24.getBlock().equals(var14.getId())) {
                                 var5.setGrowthProgress(var20);
                                 var19 = true;
                              }
                              break;
                           case BlockStateFarmingStageData var25:
                              BlockType var26 = var14.getBlockForState(var25.getState());
                              if (var26 != null && var26.getId().equals(var14.getId())) {
                                 var5.setGrowthProgress(var20);
                                 var19 = true;
                              }
                              break;
                           class="kw">default:
                        }
                     }

                     if (!var19 && var7 != null && var7.isValid()) {
                        var18[0].apply(var4, var7, var1, ChunkUtil.xFromIndex(var12), ChunkUtil.yFromIndex(var12), ChunkUtil.zFromIndex(var12), null);
                     }
                  }
               }
            }

            if (var5.getLastTickGameTime() == null) {
               var5.setLastTickGameTime(var11.getGameTime());
               var6.markNeedsSaving();
            }

            int var27 = var6.getIndex();
            int var28 = ChunkUtil.xFromIndex(var27);
            int var29 = ChunkUtil.yFromIndex(var27);
            int var30 = ChunkUtil.zFromIndex(var27);
            BlockSection var31 = var4.getComponent(var7, BlockSection.getComponentType());
            assert var31 != null;
            FarmingUtil.tickFarming(var4, var6, var31, var7, var1, var5, var28, var29, var30, true);
         }
      }

      @Override
      class="kw">public void onEntityRemove(
         @Nonnull Ref<ChunkStore> var1, @Nonnull RemoveReason var2, @Nonnull Store<ChunkStore> var3, @Nonnull CommandBuffer<ChunkStore> var4
      ) {
      }

      @Nonnull
      @Override
      class="kw">public Query<ChunkStore> getQuery() {
         class="kw">return this.query;
      }
   }

   class="kw">public class="kw">static class OnSoilAdded class="kw">extends RefSystem<ChunkStore> {
      @Nonnull
      class="kw">private class="kw">final ComponentType<ChunkStore, BlockModule.BlockStateInfo> blockStateInfoComponentType;
      @Nonnull
      class="kw">private class="kw">final ComponentType<ChunkStore, TilledSoilBlock> tilledSoilBlockComponentType;
      @Nonnull
      class="kw">private class="kw">final Query<ChunkStore> query;

      class="kw">public OnSoilAdded(@Nonnull ComponentType<ChunkStore, BlockModule.BlockStateInfo> var1, @Nonnull ComponentType<ChunkStore, TilledSoilBlock> var2) {
         this.blockStateInfoComponentType = var1;
         this.tilledSoilBlockComponentType = var2;
         this.query = Query.and(var1, var2);
      }

      @Override
      class="kw">public void onEntityAdded(
         @Nonnull Ref<ChunkStore> var1, @Nonnull AddReason var2, @Nonnull Store<ChunkStore> var3, @Nonnull CommandBuffer<ChunkStore> var4
      ) {
         TilledSoilBlock var5 = var4.getComponent(var1, this.tilledSoilBlockComponentType);
         assert var5 != null;
         BlockModule.BlockStateInfo var6 = var4.getComponent(var1, this.blockStateInfoComponentType);
         assert var6 != null;
         Ref var7 = var6.getSectionRef();
         if (var7.isValid()) {
            if (!var5.isPlanted()) {
               int var8 = var6.getIndex();
               int var9 = ChunkUtil.xFromIndex(var8);
               int var10 = ChunkUtil.yFromIndex(var8);
               int var11 = ChunkUtil.zFromIndex(var8);
               BlockSection var12 = var4.getComponent(var7, BlockSection.getComponentType());
               assert var12 != null;
               Instant var13 = var5.getDecayTime();
               if (var13 == null) {
                  int var14 = var12.get(var9, var10, var11);
                  BlockType var15 = BlockType.getAssetMap().getAsset(var14);
                  FarmingSystems.updateSoilDecayTime(var4, var5, var15);
                  var13 = var5.getDecayTime();
               }

               if (var13 == null) {
                  class="kw">return;
               }

               var12.scheduleTick(ChunkUtil.indexBlock(var9, var10, var11), var13);
            }
         }
      }

      @Override
      class="kw">public void onEntityRemove(
         @Nonnull Ref<ChunkStore> var1, @Nonnull RemoveReason var2, @Nonnull Store<ChunkStore> var3, @Nonnull CommandBuffer<ChunkStore> var4
      ) {
      }

      @Nonnull
      @Override
      class="kw">public Query<ChunkStore> getQuery() {
         class="kw">return this.query;
      }
   }

   class="kw">public class="kw">static class Ticking class="kw">extends EntityTickingSystem<ChunkStore> {
      @Nonnull
      class="kw">private class="kw">final ComponentType<ChunkStore, BlockSection> blockSectionComponentType;
      @Nonnull
      class="kw">private class="kw">final ComponentType<ChunkStore, ChunkSection> chunkSectionComponentType;
      @Nonnull
      class="kw">private class="kw">final ComponentType<ChunkStore, FarmingBlock> farmingBlockComponentType;
      @Nonnull
      class="kw">private class="kw">final ComponentType<ChunkStore, TilledSoilBlock> tilledSoilBlockComponentType;
      @Nonnull
      class="kw">private class="kw">final ComponentType<ChunkStore, CoopBlock> coopBlockComponentType;
      @Nonnull
      class="kw">private class="kw">final Query<ChunkStore> query;

      class="kw">public Ticking(
         @Nonnull ComponentType<ChunkStore, BlockSection> var1,
         @Nonnull ComponentType<ChunkStore, ChunkSection> var2,
         @Nonnull ComponentType<ChunkStore, FarmingBlock> var3,
         @Nonnull ComponentType<ChunkStore, TilledSoilBlock> var4,
         @Nonnull ComponentType<ChunkStore, CoopBlock> var5
      ) {
         this.blockSectionComponentType = var1;
         this.chunkSectionComponentType = var2;
         this.farmingBlockComponentType = var3;
         this.tilledSoilBlockComponentType = var4;
         this.coopBlockComponentType = var5;
         this.query = Query.and(var1, var2);
      }

      @Override
      class="kw">public void tick(float var1, int var2, @Nonnull ArchetypeChunk<ChunkStore> var3, @Nonnull Store<ChunkStore> var4, @Nonnull CommandBuffer<ChunkStore> var5) {
         BlockSection var6 = var3.getComponent(var2, this.blockSectionComponentType);
         assert var6 != null;
         if (var6.getTickingBlocksCountCopy() != 0) {
            ChunkSection var7 = var3.getComponent(var2, this.chunkSectionComponentType);
            assert var7 != null;
            Ref var8 = var7.getChunkColumnReference();
            if (var8 != null && var8.isValid()) {
               BlockComponentSection var9 = var3.getComponent(var2, BlockComponentSection.getComponentType());
               assert var9 != null;
               Ref var10 = var3.getReferenceTo(var2);
               TickSuppressionRegistry var11 = var4.getExternalData().getWorld().getEntityStore().getStore().getResource(TickSuppressionRegistry.RESOURCE);
               TickSuppressionRegistry var12 = var11 != null && var11.hasKind(1) ? var11 : null;
               int var13 = var7.getX();
               int var14 = var7.getZ();
               var6.forEachTicking(
                  var9,
                  var5,
                  var7.getY(),
                  (var6x, var7x, var8x, var9x, var10x, var11x) -> {
                     Ref var12 = var6x.getBlockReference(ChunkUtil.indexBlock(var8x, var9x, var10x));
                     if (var12 == null) {
                        class="kw">return BlockTickStrategy.IGNORED;
                     } else {
                        BlockModule.BlockStateInfo var13 = var7x.getComponent(var12, BlockModule.BlockStateInfo.getComponentType());
                        FarmingBlock var14 = var7x.getComponent(var12, this.farmingBlockComponentType);
                        if (var14 != null) {
                           FarmingUtil.tickFarming(var7x, var13, var6, var10, var12, var14, var8x, ChunkUtil.localCoordinate(var9x), var10x, false);
                           class="kw">return BlockTickStrategy.SLEEP;
                        } else if (var12 != null
                           && var12.isBlockSuppressed(
                              ChunkUtil.worldCoordFromLocalCoord(var13, var8x), var9x, ChunkUtil.worldCoordFromLocalCoord(var14, var10x), 1
                           )) {
                           class="kw">return BlockTickStrategy.IGNORED;
                        } else {
                           TilledSoilBlock var15 = var7x.getComponent(var12, this.tilledSoilBlockComponentType);
                           if (var15 != null) {
                              class="kw">return tickSoil(var7x, var12, var15);
                           } else {
                              CoopBlock var16 = var7x.getComponent(var12, this.coopBlockComponentType);
                              if (var16 != null) {
                                 tickCoop(var7x, var12, var16);
                                 class="kw">return BlockTickStrategy.SLEEP;
                              } else {
                                 class="kw">return BlockTickStrategy.IGNORED;
                              }
                           }
                        }
                     }
                  }
               );
            }
         }
      }

      class="kw">private class="kw">static BlockTickStrategy tickSoil(@Nonnull CommandBuffer<ChunkStore> var0, @Nonnull Ref<ChunkStore> var1, @Nonnull TilledSoilBlock var2) {
         BlockModule.BlockStateInfo var3 = var0.getComponent(var1, BlockModule.BlockStateInfo.getComponentType());
         assert var3 != null;
         int var4 = var3.getIndex();
         int var5 = ChunkUtil.xFromIndex(var4);
         int var6 = ChunkUtil.yFromIndex(var4);
         int var7 = ChunkUtil.zFromIndex(var4);
         Ref var8 = var3.getSectionRef();
         if (!var8.isValid()) {
            class="kw">return BlockTickStrategy.SLEEP;
         }

         BlockSection var9 = var0.getComponent(var8, BlockSection.getComponentType());
         if (var9 == null) {
            class="kw">return BlockTickStrategy.SLEEP;
         }

         ChunkSection var10 = var0.getComponent(var8, ChunkSection.getComponentType());
         if (var10 == null) {
            class="kw">return BlockTickStrategy.SLEEP;
         }

         BlockSection var11 = var6 == 31 ? FarmingSystems.blockSectionAbove(var0, var10) : var9;
         if (var11 == null) {
            class="kw">return BlockTickStrategy.WAIT_FOR_ADJACENT_CHUNK_LOAD;
         }

         boolean var12 = FarmingSystems.hasCropAbove(var11, var5, var6, var7);
         int var13 = var9.get(var5, var6, var7);
         BlockType var14 = BlockType.getAssetMap().getAsset(var13);
         if (var14 == null) {
            class="kw">return BlockTickStrategy.SLEEP;
         }

         Instant var15 = var0.getExternalData().getWorld().getEntityStore().getStore().getResource(WorldTimeResource.getResourceType()).getGameTime();
         Instant var16 = var2.getDecayTime();
         if (var2.isPlanted() && !var12) {
            if (!FarmingSystems.updateSoilDecayTime(var0, var2, var14)) {
               class="kw">return BlockTickStrategy.SLEEP;
            }

            Instant var26 = var2.getDecayTime();
            if (var26 != null) {
               var9.scheduleTick(ChunkUtil.indexBlock(var5, var6, var7), var26);
            }
         } else if (!var2.isPlanted() && !var12) {
            if (var16 == null || !var16.isAfter(var15)) {
               if (var14.getFarming() != null && var14.getFarming().getSoilConfig() != null) {
                  FarmingData.SoilConfig var17 = var14.getFarming().getSoilConfig();
                  String var18 = var17.getTargetBlock();
                  if (var18 == null) {
                     class="kw">return BlockTickStrategy.SLEEP;
                  }

                  int var19 = BlockType.getAssetMap().getIndex(var18);
                  if (var19 == Integer.MIN_VALUE) {
                     class="kw">return BlockTickStrategy.SLEEP;
                  }

                  BlockType var20 = BlockType.getAssetMap().getAsset(var19);
                  int var21 = var9.getRotationIndex(var5, var6, var7);
                  int var22 = ChunkUtil.worldCoordFromLocalCoord(var10.getX(), var5);
                  int var23 = ChunkUtil.worldCoordFromLocalCoord(var10.getY(), var6);
                  int var24 = ChunkUtil.worldCoordFromLocalCoord(var10.getZ(), var7);
                  ChunkStore var25 = var0.getExternalData();
                  var0.run(var8x -> {
                     if (var8.isValid()) {
                        BlockOperations.setBlock(var25, var8, var22, var23, var24, var19, var20, var21, 0, 0);
                     }
                  });
                  class="kw">return BlockTickStrategy.SLEEP;
               } else {
                  class="kw">return BlockTickStrategy.SLEEP;
               }
            }
         } else if (var12) {
            var2.setDecayTime(null);
         }

         String var27 = var2.computeBlockType(var15, var14);
         if (var27 != null && !var27.equals(var14.getId())) {
            int var28 = var9.getRotationIndex(var5, var6, var7);
            int var29 = BlockType.getAssetMap().getIndex(var27);
            BlockType var30 = BlockType.getAssetMap().getAsset(var29);
            int var31 = ChunkUtil.worldCoordFromLocalCoord(var10.getX(), var5);
            int var32 = ChunkUtil.worldCoordFromLocalCoord(var10.getY(), var6);
            int var33 = ChunkUtil.worldCoordFromLocalCoord(var10.getZ(), var7);
            ChunkStore var34 = var0.getExternalData();
            var0.run(var8x -> {
               if (var8.isValid()) {
                  BlockOperations.setBlock(var34, var8, var31, var32, var33, var29, var30, var28, 0, 2);
               }
            });
         }

         var2.setPlanted(var12);
         class="kw">return BlockTickStrategy.SLEEP;
      }

      class="kw">private class="kw">static void tickCoop(@Nonnull CommandBuffer<ChunkStore> var0, @Nonnull Ref<ChunkStore> var1, @Nonnull CoopBlock var2) {
         BlockModule.BlockStateInfo var3 = var0.getComponent(var1, BlockModule.BlockStateInfo.getComponentType());
         assert var3 != null;
         Ref var4 = var3.getSectionRef();
         if (var4.isValid()) {
            World var5 = var0.getExternalData().getWorld();
            Store var6 = var5.getEntityStore().getStore();
            WorldTimeResource var7 = var6.getResource(WorldTimeResource.getResourceType());
            FarmingCoopAsset var8 = var2.getCoopAsset();
            if (var8 != null) {
               int var9 = var3.getIndex();
               int var10 = ChunkUtil.xFromIndex(var9);
               int var11 = ChunkUtil.yFromIndex(var9);
               int var12 = ChunkUtil.zFromIndex(var9);
               BlockSection var13 = var0.getComponent(var4, BlockSection.getComponentType());
               assert var13 != null;
               ChunkSection var14 = var0.getComponent(var4, ChunkSection.getComponentType());
               assert var14 != null;
               int var15 = ChunkUtil.worldCoordFromLocalCoord(var14.getX(), var10);
               int var16 = ChunkUtil.worldCoordFromLocalCoord(var14.getY(), var11);
               int var17 = ChunkUtil.worldCoordFromLocalCoord(var14.getZ(), var12);
               double var18 = var13.getRotation(var10, var11, var12).yaw().getRadians();
               Vector3d var20 = new Vector3d().set(var8.getResidentSpawnOffset()).rotateY((float)var18);
               Vector3i var21 = new Vector3i(var15, var16, var17);
               boolean var22 = var8.getCaptureWildNPCsInRange();
               float var23 = var8.getWildCaptureRadius();
               if (var22 && var23 >= 0.0F) {
                  var5.execute(() -> {
                     List var6 = TargetUtil.getAllEntitiesInSphere(Vector3iUtil.toVector3d(var21), var23, var6);
                     boolean var7 = false;

                     for (Ref var9 : var6) {
                        var7 |= var2.tryPutWildResidentFromWild(var6, var9, var7, var21);
                     }

                     if (var7) {
                        var3.markNeedsSaving();
                     }
                  });
               }

               if (var2.shouldResidentsBeInCoop(var7)) {
                  var5.execute(() -> {
                     if (var2.ensureNoResidentsInWorld(var6)) {
                        var3.markNeedsSaving();
                     }
                  });
               } else {
                  var5.execute(
                     () -> {
                        boolean var15 = var2.ensureSpawnResidentsInWorld(var5, var6, Vector3iUtil.toVector3d(var21), var20);
                        var15 |= var2.generateProduceToInventory(var7);
                        if (var15) {
                           var3.markNeedsSaving();
                        }

                        if (var4.isValid()) {
                           BlockType var16 = BlockType.getAssetMap().getAsset(var13.get(var10, var11, var12));
                           assert var16 != null;
                           BlockOperations.setBlockInteractionState(
                              var5.getChunkStore(), var4, var15, var16, var17, var16, var2.hasProduce() ? "Produce_Ready" : "class="kw">default", false
                           );
                        }
                     }
                  );
               }

               Instant var24 = var2.getNextScheduledTick(var7);
               if (var24 != null) {
                  var13.scheduleTick(ChunkUtil.indexBlock(var10, var11, var12), var24);
               }
            }
         }
      }

      @Nonnull
      @Override
      class="kw">public Query<ChunkStore> getQuery() {
         class="kw">return this.query;
      }
   }
}