Preprocessor class

Пакет: com.hypixel.hytale.builtin.blocktick

Файл: com/hypixel/hytale/builtin/blocktick/BlockTickPlugin.java

Поля (6)

МодификаторыТипИмя
public static final ThreadLocal<BlockTickPlugin.Preprocessor> LOCAL
public final IntConsumer indexCollector
public final IntList tickingIds
public final IntList tickingIndices
public final IntConsumer typeCollector
BlockType var2

Методы (3)

МодификаторыВозвратСигнатура
public void clearpublic void clear()
private void collectIndexprivate void collectIndex(int var1)
private void collectTypeprivate void collectType(int var1)

Исходный код

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

class="kw">import com.hypixel.hytale.builtin.blocktick.procedure.BasicChanceBlockGrowthProcedure;
class="kw">import com.hypixel.hytale.builtin.blocktick.procedure.SplitChanceBlockGrowthProcedure;
class="kw">import com.hypixel.hytale.builtin.blocktick.system.ChunkBlockTickSystem;
class="kw">import com.hypixel.hytale.builtin.blocktick.system.MergeWaitingBlocksSystem;
class="kw">import com.hypixel.hytale.component.Holder;
class="kw">import com.hypixel.hytale.event.EventPriority;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktick.BlockTickManager;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktick.IBlockTickProvider;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktick.config.TickProcedure;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.BlockType;
class="kw">import com.hypixel.hytale.server.core.plugin.JavaPlugin;
class="kw">import com.hypixel.hytale.server.core.plugin.JavaPluginInit;
class="kw">import com.hypixel.hytale.server.core.universe.world.TickSuppressionRegistry;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.BlockChunk;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.ChunkColumn;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.WorldChunk;
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.events.ChunkPreLoadProcessEvent;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.ChunkStore;
class="kw">import it.unimi.dsi.fastutil.ints.IntArrayList;
class="kw">import it.unimi.dsi.fastutil.ints.IntList;
class="kw">import java.util.function.IntConsumer;
class="kw">import javax.annotation.Nonnull;

class="kw">public class BlockTickPlugin class="kw">extends JavaPlugin class="kw">implements IBlockTickProvider {
   class="kw">private class="kw">static BlockTickPlugin instance;

   class="kw">public class="kw">static BlockTickPlugin get() {
      class="kw">return instance;
   }

   class="kw">public BlockTickPlugin(@Nonnull JavaPluginInit var1) {
      super(var1);
      instance = this;
   }

   @Override
   class="kw">protected void setup() {
      TickProcedure.CODEC.register("BasicChance", BasicChanceBlockGrowthProcedure.class, BasicChanceBlockGrowthProcedure.CODEC);
      TickProcedure.CODEC.register("SplitChance", SplitChanceBlockGrowthProcedure.class, SplitChanceBlockGrowthProcedure.CODEC);
      this.getEventRegistry().registerGlobal(EventPriority.EARLY, ChunkPreLoadProcessEvent.class, this::discoverTickingBlocks);
      ChunkStore.REGISTRY.registerSystem(new ChunkBlockTickSystem.PreTick());
      ChunkStore.REGISTRY.registerSystem(new ChunkBlockTickSystem.Ticking());
      ChunkStore.REGISTRY.registerSystem(new MergeWaitingBlocksSystem());
      TickSuppressionRegistry.ensureRegistered();
      BlockTickManager.setBlockTickProvider(this);
   }

   @Override
   class="kw">public TickProcedure getTickProcedure(int var1) {
      class="kw">return BlockType.getAssetMap().getAsset(var1).getTickProcedure();
   }

   class="kw">private void discoverTickingBlocks(@Nonnull ChunkPreLoadProcessEvent var1) {
      if (var1.isNewlyGenerated()) {
         this.discoverTickingBlocks(var1.getHolder(), var1.getChunk());
      }
   }

   class="kw">public int discoverTickingBlocks(@Nonnull Holder<ChunkStore> var1, @Nonnull WorldChunk var2) {
      if (!this.isEnabled()) {
         class="kw">return 0;
      }

      BlockChunk var3 = var1.getComponent(BlockChunk.getComponentType());
      if (var3 != null && var3.consumeNeedsPhysics()) {
         ChunkColumn var4 = var1.getComponent(ChunkColumn.getComponentType());
         if (var4 == null) {
            class="kw">return 0;
         }

         Holder[] var5 = var4.getSectionHolders();
         if (var5 == null) {
            class="kw">return 0;
         }

         BlockTickPlugin.Preprocessor var6 = BlockTickPlugin.Preprocessor.LOCAL.get();
         int var7 = 0;

         for (int var8 = 0; var8 < var5.length; var8++) {
            Holder var9 = var5[var8];
            BlockSection var10 = var9.ensureAndGetComponent(BlockSection.getComponentType());
            ChunkSection var11 = var9.getComponent(ChunkSection.getComponentType());
            assert var11 != null;
            if (!var10.isSolidAir()) {
               var6.clear();
               var10.forEachValue(var6.typeCollector);
               if (!var6.tickingIds.isEmpty()) {
                  var10.find(var6.tickingIds, var6.indexCollector);
                  int var12 = var10.setTicking(var6.tickingIndices, true);
                  if (var12 > 0) {
                     var11.markNeedsSaving();
                     var7 += var12;
                  }
               }
            }
         }

         class="kw">return var7;
      } else {
         class="kw">return 0;
      }
   }

   class="kw">public class="kw">static class="kw">final class Preprocessor {
      class="kw">public class="kw">static class="kw">final ThreadLocal<BlockTickPlugin.Preprocessor> LOCAL = ThreadLocal.withInitial(BlockTickPlugin.Preprocessor::new);
      class="kw">public class="kw">final IntList tickingIds = new IntArrayList();
      class="kw">public class="kw">final IntList tickingIndices = new IntArrayList();
      class="kw">public class="kw">final IntConsumer typeCollector = this::collectType;
      class="kw">public class="kw">final IntConsumer indexCollector = this::collectIndex;

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

      class="kw">public void clear() {
         this.tickingIds.clear();
         this.tickingIndices.clear();
      }

      class="kw">private void collectType(int var1) {
         BlockType var2 = BlockType.getAssetMap().getAsset(var1);
         if (var2 != null && var2.getTickProcedure() != null) {
            this.tickingIds.add(var1);
         }
      }

      class="kw">private void collectIndex(int var1) {
         this.tickingIndices.add(var1);
      }
   }
}