PreprocessorAccessor class

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

Файл: com/hypixel/hytale/builtin/fluid/FluidPlugin.java

implements: FluidTicker.Accessor

Поля (13)

МодификаторыТипИмя
private final BlockChunk blockChunk
private final BlockSection[] blockSections
private final ChunkSection[] chunkSections
private final int columnX
private final int columnZ
private final FluidSection[] fluidSections
private final int minSectionY
private long tick
int var4
int var4
int var5
BlockType var6
private final World world

Методы (5)

МодификаторыВозвратСигнатура
public BlockSection getBlockSectionpublic BlockSection getBlockSection(int var1, int var2, int var3)
public FluidSection getFluidSectionpublic FluidSection getFluidSection(int var1, int var2, int var3)
if if(var5 >= 0 && var5 < this.blockSections.length)
if if(var6 != null)
public void setBlockpublic void setBlock(int var1, int var2, int var3, int var4)

Исходный код

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

class="kw">import com.hypixel.hytale.assetstore.AssetRegistry;
class="kw">import com.hypixel.hytale.assetstore.event.LoadedAssetsEvent;
class="kw">import com.hypixel.hytale.assetstore.map.BlockTypeAssetMap;
class="kw">import com.hypixel.hytale.assetstore.map.IndexedLookupTableAssetMap;
class="kw">import com.hypixel.hytale.codec.lookup.Priority;
class="kw">import com.hypixel.hytale.component.ComponentRegistryProxy;
class="kw">import com.hypixel.hytale.component.ComponentType;
class="kw">import com.hypixel.hytale.component.Holder;
class="kw">import com.hypixel.hytale.component.ResourceType;
class="kw">import com.hypixel.hytale.event.EventPriority;
class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import com.hypixel.hytale.math.util.ChunkUtil;
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.fluid.DefaultFluidTicker;
class="kw">import com.hypixel.hytale.server.core.asset.type.fluid.FiniteFluidTicker;
class="kw">import com.hypixel.hytale.server.core.asset.type.fluid.FireFluidTicker;
class="kw">import com.hypixel.hytale.server.core.asset.type.fluid.Fluid;
class="kw">import com.hypixel.hytale.server.core.asset.type.fluid.FluidTicker;
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.Universe;
class="kw">import com.hypixel.hytale.server.core.universe.world.World;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.BlockChunk;
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.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.chunk.section.FluidSection;
class="kw">import com.hypixel.hytale.server.core.universe.world.events.ChunkPreLoadProcessEvent;
class="kw">import com.hypixel.hytale.server.core.universe.world.events.ChunkSectionPreLoadProcessEvent;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.ChunkStore;
class="kw">import it.unimi.dsi.fastutil.ints.IntOpenHashSet;
class="kw">import it.unimi.dsi.fastutil.ints.IntSet;
class="kw">import it.unimi.dsi.fastutil.ints.IntSets;
class="kw">import java.time.Instant;
class="kw">import java.util.Set;
class="kw">import java.util.logging.Level;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;

class="kw">public class FluidPlugin class="kw">extends JavaPlugin {
   @Nonnull
   class="kw">private class="kw">static class="kw">final HytaleLogger LOGGER = HytaleLogger.forEnclosingClass();
   class="kw">private class="kw">static FluidPlugin instance;
   class="kw">private ResourceType<ChunkStore, DisabledFluidResource> disabledFluidResourceType;

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

   @Nonnull
   class="kw">public ResourceType<ChunkStore, DisabledFluidResource> getDisabledFluidResourceType() {
      class="kw">return this.disabledFluidResourceType;
   }

   @Nonnull
   class="kw">static IntSet resolveFluidIds(@Nonnull Set<String> var0) {
      IndexedLookupTableAssetMap var1 = Fluid.getAssetMap();
      IntOpenHashSet var2 = new IntOpenHashSet();

      for (String var4 : var0) {
         int var5 = AssetRegistry.getOrCreateTagIndex(var4);
         var2.addAll(var1.getIndexesForTag(var5));
      }

      class="kw">return (IntSet)(var2.isEmpty() ? IntSets.EMPTY_SET : IntSets.unmodifiable(var2));
   }

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

   @Override
   class="kw">protected void setup() {
      ComponentRegistryProxy var1 = this.getChunkStoreRegistry();
      this.disabledFluidResourceType = var1.registerResource(DisabledFluidResource.class, DisabledFluidResource::new);
      FluidTicker.CODEC.register(Priority.DEFAULT, "Default", DefaultFluidTicker.class, DefaultFluidTicker.CODEC);
      FluidTicker.CODEC.register("Fire", FireFluidTicker.class, FireFluidTicker.CODEC);
      FluidTicker.CODEC.register("Finite", FiniteFluidTicker.class, FiniteFluidTicker.CODEC);
      ComponentType var2 = ChunkSection.getComponentType();
      ComponentType var3 = FluidSection.getComponentType();
      ComponentType var4 = WorldChunk.getComponentType();
      var1.registerSystem(new FluidSystems.EnsureFluidSection(var2, var3));
      var1.registerSystem(new FluidSystems.SetupSection(var2, var3));
      var1.registerSystem(new FluidSystems.LoadPacketGenerator(var2, var3));
      var1.registerSystem(new FluidSystems.ReplicateChanges(var2, var3, var4));
      var1.registerSystem(new FluidSystems.Ticking(var2, var3));
      this.getEventRegistry().registerGlobal(EventPriority.FIRST, ChunkPreLoadProcessEvent.class, FluidPlugin::onChunkPreProcess);
      this.getEventRegistry().registerGlobal(EventPriority.FIRST, ChunkSectionPreLoadProcessEvent.class, FluidPlugin::onChunkSectionPreProcess);
      this.getEventRegistry().register(LoadedAssetsEvent.class, Fluid.class, FluidPlugin::onFluidAssetsLoaded);
      this.getCommandRegistry().registerCommand(new FluidCommand());
   }

   class="kw">private class="kw">static void onFluidAssetsLoaded(@Nonnull LoadedAssetsEvent<String, Fluid, IndexedLookupTableAssetMap<String, Fluid>> var0) {
      ResourceType var1 = DisabledFluidResource.getResourceType();

      for (World var3 : Universe.get().getWorlds().values()) {
         var3.execute(() -> var3.getChunkStore().getStore().getResource(var1).invalidate());
      }
   }

   class="kw">private class="kw">static void onChunkPreProcess(@Nonnull ChunkPreLoadProcessEvent var0) {
      if (var0.isNewlyGenerated()) {
         WorldChunk var1 = var0.getChunk();
         Holder var2 = var0.getHolder();
         ChunkColumn var3 = var2.getComponent(ChunkColumn.getComponentType());
         if (var3 != null) {
            BlockChunk var4 = var2.getComponent(BlockChunk.getComponentType());
            if (var4 != null) {
               Holder[] var5 = var3.getSectionHolders();
               if (var5 != null) {
                  int var6 = Math.min(var5.length, 10);
                  ChunkSection[] var7 = new ChunkSection[var6];
                  FluidSection[] var8 = new FluidSection[var6];
                  BlockSection[] var9 = new BlockSection[var6];

                  for (int var10 = 0; var10 < var6; var10++) {
                     Holder var11 = var5[var10];
                     var7[var10] = var11.getComponent(ChunkSection.getComponentType());
                     var8[var10] = var11.ensureAndGetComponent(FluidSection.getComponentType());
                     var9[var10] = var11.ensureAndGetComponent(BlockSection.getComponentType());
                     var8[var10].preload(var1.getX(), var10, var1.getZ());
                  }

                  boolean var17 = !var1.getWorld().getChunkStore().supportsCubicSections();

                  for (int var18 = 0; var18 < var6; var18++) {
                     if (!var8[var18].isEmpty()) {
                        discoverFluids(var8[var18], var9[var18], var18 > 0 ? var8[var18 - 1] : null, var18 > 0 ? var9[var18 - 1] : null, var18 == 0 && var17);
                     }
                  }

                  int var19 = 0;

                  for (BlockSection var15 : var9) {
                     var19 += var15.getTickingBlocksCount();
                  }

                  if (var19 != 0) {
                     FluidPlugin.PreprocessorAccessor var21 = new FluidPlugin.PreprocessorAccessor(
                        var1.getWorld(), var1.getX(), var1.getZ(), 0, var7, var8, var9, var4
                     );

                     do {
                        for (BlockSection var16 : var9) {
                           var16.preTick(Instant.MIN);
                        }

                        for (int var23 = 0; var23 < var6; var23++) {
                           settleSection(var21, var8[var23], var9[var23], var23);
                        }

                        var21.tick++;
                        var19 = 0;

                        for (BlockSection var32 : var9) {
                           var19 += var32.getTickingBlocksCount();
                        }
                     } while (var19 != 0 && var21.tick <= 100L);

                     for (BlockSection var33 : var9) {
                        var33.mergeTickingBlocks();
                     }
                  }
               }
            }
         }
      }
   }

   class="kw">private class="kw">static void onChunkSectionPreProcess(@Nonnull ChunkSectionPreLoadProcessEvent var0) {
      if (var0.isNewlyGenerated()) {
         Holder var1 = var0.getHolder();
         ChunkSection var2 = var1.getComponent(ChunkSection.getComponentType());
         if (var2 != null) {
            int var3 = var2.getY();
            if (var3 < 0 || var3 >= 10) {
               FluidSection var4 = var1.getComponent(FluidSection.getComponentType());
               if (var4 != null && !var4.isEmpty()) {
                  BlockSection var5 = var1.ensureAndGetComponent(BlockSection.getComponentType());
                  var4.preload(var2.getX(), var3, var2.getZ());
                  discoverFluids(var4, var5, null, null, false);
                  if (var5.getTickingBlocksCount() != 0) {
                     FluidPlugin.PreprocessorAccessor var6 = new FluidPlugin.PreprocessorAccessor(
                        var0.getWorld(), var2.getX(), var2.getZ(), var3, new ChunkSection[]{var2}, new FluidSection[]{var4}, new BlockSection[]{var5}, null
                     );

                     do {
                        var5.preTick(Instant.MIN);
                        settleSection(var6, var4, var5, var3);
                        var6.tick++;
                     } while (var5.getTickingBlocksCount() != 0 && var6.tick <= 100L);

                     var5.mergeTickingBlocks();
                  }
               }
            }
         }
      }
   }

   class="kw">private class="kw">static void discoverFluids(
      @Nonnull FluidSection var0, @Nonnull BlockSection var1, @Nullable FluidSection var2, @Nullable BlockSection var3, boolean var4
   ) {
      IndexedLookupTableAssetMap var5 = Fluid.getAssetMap();
      BlockTypeAssetMap var6 = BlockType.getAssetMap();
      int var7 = var0.getY();

      for (int var8 = 0; var8 < 32768; var8++) {
         int var9 = var0.getFluidId(var8);
         if (var9 != 0) {
            Fluid var10 = var5.getAsset(var9);
            if (var10 == null) {
               LOGGER.at(Level.WARNING).log("Invalid fluid found in chunk section: %d, %d %d with id %d", var0.getX(), var7, var0.getZ(), var9);
               var0.setFluid(var8, 0, (byte)0);
            } else if (FluidTicker.isSolid(var6.getAsset(var1.get(var8)))) {
               var0.setFluid(var8, 0, (byte)0);
            } else {
               if (!var10.getTicker().canDemote()) {
                  int var11 = ChunkUtil.minBlock(var0.getX()) + ChunkUtil.xFromIndex(var8);
                  int var12 = ChunkUtil.minBlock(var7) + ChunkUtil.yFromIndex(var8);
                  int var13 = ChunkUtil.minBlock(var0.getZ()) + ChunkUtil.zFromIndex(var8);
                  boolean var14 = ChunkUtil.isBorderBlockGlobal(var11, var13)
                     || var0.getFluidId(var11 - 1, var12, var13) != var9 && !FluidTicker.isSolid(var6.getAsset(var1.get(var11 - 1, var12, var13)))
                     || var0.getFluidId(var11 + 1, var12, var13) != var9 && !FluidTicker.isSolid(var6.getAsset(var1.get(var11 + 1, var12, var13)))
                     || var0.getFluidId(var11, var12, var13 - 1) != var9 && !FluidTicker.isSolid(var6.getAsset(var1.get(var11, var12, var13 - 1)))
                     || var0.getFluidId(var11, var12, var13 + 1) != var9 && !FluidTicker.isSolid(var6.getAsset(var1.get(var11, var12, var13 + 1)));
                  if (!var14) {
                     if (ChunkUtil.chunkCoordinate(var12 - 1) == var7) {
                        var14 = var0.getFluidId(var11, var12 - 1, var13) != var9 && !FluidTicker.isSolid(var6.getAsset(var1.get(var11, var12 - 1, var13)));
                     } else if (var3 != null) {
                        int var15 = var2 == null ? 0 : var2.getFluidId(var11, var12 - 1, var13);
                        var14 = var15 != var9 && !FluidTicker.isSolid(var6.getAsset(var3.get(var11, var12 - 1, var13)));
                     } else if (!var4) {
                        var14 = true;
                     }
                  }

                  if (!var14) {
                     var1.setTicking(var8, false);
                     class="kw">continue;
                  }
               }

               var1.setTicking(var8, true);
            }
         }
      }
   }

   class="kw">private class="kw">static void settleSection(@Nonnull FluidPlugin.PreprocessorAccessor var0, @Nonnull FluidSection var1, @Nonnull BlockSection var2, int var3) {
      if (var2.getTickingBlocksCountCopy() != 0) {
         var2.forEachTicking(var0, var1, var3, (var1x, var2x, var3x, var4, var5, var6) -> {
            int var7 = var2x.getFluidId(var3x, var4, var5);
            if (var7 == 0) {
               class="kw">return BlockTickStrategy.IGNORED;
            }

            int var8 = var2x.getX() << 5 | var3x;
            int var9 = var2x.getZ() << 5 | var5;
            Fluid var10 = Fluid.getAssetMap().getAsset(var7);
            class="kw">return var10.getTicker().process(var1x.world, var1x.tick, var1x, var2x, var2, var10, var7, var8, var4, var9);
         });
      }
   }

   class="kw">public class="kw">static class PreprocessorAccessor class="kw">implements FluidTicker.Accessor {
      @Nonnull
      class="kw">private class="kw">final World world;
      class="kw">private class="kw">final int columnX;
      class="kw">private class="kw">final int columnZ;
      class="kw">private class="kw">final int minSectionY;
      @Nonnull
      class="kw">private class="kw">final ChunkSection[] chunkSections;
      @Nonnull
      class="kw">private class="kw">final FluidSection[] fluidSections;
      @Nonnull
      class="kw">private class="kw">final BlockSection[] blockSections;
      @Nullable
      class="kw">private class="kw">final BlockChunk blockChunk;
      class="kw">private long tick;

      PreprocessorAccessor(
         @Nonnull World var1,
         int var2,
         int var3,
         int var4,
         @Nonnull ChunkSection[] var5,
         @Nonnull FluidSection[] var6,
         @Nonnull BlockSection[] var7,
         @Nullable BlockChunk var8
      ) {
         this.world = var1;
         this.columnX = var2;
         this.columnZ = var3;
         this.minSectionY = var4;
         this.chunkSections = var5;
         this.fluidSections = var6;
         this.blockSections = var7;
         this.blockChunk = var8;
      }

      @Nullable
      @Override
      class="kw">public FluidSection getFluidSection(int var1, int var2, int var3) {
         int var4 = var2 - this.minSectionY;
         class="kw">return var1 == this.columnX && var3 == this.columnZ && var4 >= 0 && var4 < this.fluidSections.length ? this.fluidSections[var4] : null;
      }

      @Nullable
      @Override
      class="kw">public BlockSection getBlockSection(int var1, int var2, int var3) {
         int var4 = var2 - this.minSectionY;
         class="kw">return var1 == this.columnX && var3 == this.columnZ && var4 >= 0 && var4 < this.blockSections.length ? this.blockSections[var4] : null;
      }

      @Override
      class="kw">public void setBlock(int var1, int var2, int var3, int var4) {
         if (ChunkUtil.chunkCoordinate(var1) == this.columnX && ChunkUtil.chunkCoordinate(var3) == this.columnZ) {
            int var5 = ChunkUtil.chunkCoordinate(var2) - this.minSectionY;
            if (var5 >= 0 && var5 < this.blockSections.length) {
               BlockType var6 = BlockType.getAssetMap().getAsset(var4);
               if (var6 != null) {
                  BlockOperations.setBlockPreLoad(this.chunkSections[var5], this.blockSections[var5], this.blockChunk, var1, var2, var3, var4, var6, 0, 0);
               }
            }
         }
      }
   }
}