FarmingSystems class

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

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

Поля (178)

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

Методы (64)

МодификаторыВозвратСигнатура
public CoopResidentEntitySystempublic CoopResidentEntitySystem(@Nonnull ComponentType<EntityStore, CoopResidentComponent> var1, @Nonnull ComponentType<EntityStore, UUIDComponent> var2)
public CoopResidentTickingpublic CoopResidentTicking(@Nonnull ComponentType<EntityStore, CoopResidentComponent> var1)
public OnCoopAddedpublic OnCoopAdded(@Nonnull ComponentType<ChunkStore, BlockModule.BlockStateInfo> var1, @Nonnull ComponentType<ChunkStore, CoopBlock> var2)
public OnFarmBlockAddedpublic OnFarmBlockAdded(@Nonnull ComponentType<ChunkStore, BlockModule.BlockStateInfo> var1, @Nonnull ComponentType<ChunkStore, FarmingBlock> var2)
public OnSoilAddedpublic OnSoilAdded(@Nonnull ComponentType<ChunkStore, BlockModule.BlockStateInfo> var1, @Nonnull ComponentType<ChunkStore, TilledSoilBlock> var2)
public Tickingpublic 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)
for for(int var20 = 0; var20 < var18.length; var20++)
for for(Ref var9 : var6)
public Query<EntityStore> getQuerypublic Query<EntityStore> getQuery()
public Query<EntityStore> getQuerypublic Query<EntityStore> getQuery()
public Query<ChunkStore> getQuerypublic Query<ChunkStore> getQuery()
public Query<ChunkStore> getQuerypublic Query<ChunkStore> getQuery()
public Query<ChunkStore> getQuerypublic Query<ChunkStore> getQuery()
public Query<ChunkStore> getQuerypublic Query<ChunkStore> getQuery()
static boolean hasCropAboveboolean hasCropAbove(@Nonnull BlockSection var0, int var1, int var2, int var3)
if if(var4 == null)
if if(var2 == null)
if if(var5 == null)
if if(var2 != RemoveReason.UNLOAD)
if if(var5 != null)
if if(var7 != null)
if if(var15 != null)
if if(var17 != null)
if if(var18 != null)
if if(var15 != null)
if if(var2 != RemoveReason.UNLOAD)
if if(var14 == null)
if if(var15 == null)
if if(var17 != null)
if if(var18 != null && var18.length > 0)
if if(var13 == null)
if if(var13 == null)
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 onEntityAddedpublic void onEntityAdded(@Nonnull Ref<EntityStore> var1, @Nonnull AddReason var2, @Nonnull Store<EntityStore> var3, @Nonnull CommandBuffer<EntityStore> var4)
public void onEntityAddedpublic void onEntityAdded(@Nonnull Ref<ChunkStore> var1, @Nonnull AddReason var2, @Nonnull Store<ChunkStore> var3, @Nonnull CommandBuffer<ChunkStore> var4)
public void onEntityAddedpublic void onEntityAdded(@Nonnull Ref<ChunkStore> var1, @Nonnull AddReason var2, @Nonnull Store<ChunkStore> var3, @Nonnull CommandBuffer<ChunkStore> var4)
public void onEntityAddedpublic void onEntityAdded(@Nonnull Ref<ChunkStore> var1, @Nonnull AddReason var2, @Nonnull Store<ChunkStore> var3, @Nonnull CommandBuffer<ChunkStore> var4)
public void onEntityRemovepublic void onEntityRemove(@Nonnull Ref<EntityStore> var1, @Nonnull RemoveReason var2, @Nonnull Store<EntityStore> var3, @Nonnull CommandBuffer<EntityStore> var4)
public void onEntityRemovepublic void onEntityRemove(@Nonnull Ref<ChunkStore> var1, @Nonnull RemoveReason var2, @Nonnull Store<ChunkStore> var3, @Nonnull CommandBuffer<ChunkStore> var4)
public void onEntityRemovepublic void onEntityRemove(@Nonnull Ref<ChunkStore> var1, @Nonnull RemoveReason var2, @Nonnull Store<ChunkStore> var3, @Nonnull CommandBuffer<ChunkStore> var4)
public void onEntityRemovepublic void onEntityRemove(@Nonnull Ref<ChunkStore> var1, @Nonnull RemoveReason var2, @Nonnull Store<ChunkStore> var3, @Nonnull CommandBuffer<ChunkStore> var4)
switch switch(var21)
public void tickpublic void tick(float var1, int var2, @Nonnull ArchetypeChunk<EntityStore> var3, @Nonnull Store<EntityStore> var4, @Nonnull CommandBuffer<EntityStore> var5)
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)
static boolean updateSoilDecayTimeboolean updateSoilDecayTime(@Nonnull CommandBuffer<ChunkStore> var0, @Nonnull TilledSoilBlock var1, @Nullable BlockType var2)

Исходный код

Показать/скрыть
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;
      }
   }
}