BlockPhysicsSystems class

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

Файл: com/hypixel/hytale/builtin/blockphysics/BlockPhysicsSystems.java

Поля (45)

МодификаторыТипИмя
private static final AbstractCachedAccessor.Key<BlockSection> BLOCK_COMPONENT
private static final Set<Dependency<ChunkStore>> DEPENDENCIES
private static final AbstractCachedAccessor.Key<FluidSection> FLUID_COMPONENT
private static final AbstractCachedAccessor.Key<BlockPhysics> PHYSICS_COMPONENT
private static final Query<ChunkStore> QUERY
private static final AbstractCachedAccessor.Registry REGISTRY
private static final ThreadLocal<BlockPhysicsSystems.CachedAccessor> THREAD_LOCAL
return
return
return
return
return
return
protected BlockSection selfBlockSection
protected FluidSection selfFluidSection
protected BlockPhysics selfPhysics
protected Ref<ChunkStore> selfSectionReference
int var10
BlockSection var10
Ref var10
Store var10
BlockPhysics var11
WorldChunk var11
int var11
int var12
BlockPhysicsSystems.CachedAccessor var12
int var12
BlockSection var13
int var13
int var14
int var15
int var5
int var6
ChunkSection var6
BlockPhysics var6
int var7
BlockSection var7
boolean var7
int var8
BlockPhysics var8
BlockType var8
BlockPhysicsSystems.CachedAccessor var9
int var9
FluidSection var9
World var9

Методы (30)

МодификаторыВозвратСигнатура
protected CachedAccessorprotected CachedAccessor()
public Tickingpublic Ticking()
for for(int var5 = -1; var5 < 2; var5++)
for for(int var7 = -1; var7 < 2; var7++)
for for(int var9 = -1; var9 < 2; var9++)
for for(int var4 = -1; var4 < 2; var4++)
for for(int var6 = -1; var6 < 2; var6++)
for for(int var8 = -1; var8 < 2; var8++)
public BlockPhysics getBlockPhysicspublic BlockPhysics getBlockPhysics(int var1, int var2, int var3)
public BlockPhysics getBlockPhysicsAtBlockpublic BlockPhysics getBlockPhysicsAtBlock(int var1, int var2, int var3)
public BlockSection getBlockSectionpublic BlockSection getBlockSection(int var1, int var2, int var3)
public BlockSection getBlockSectionAtBlockpublic BlockSection getBlockSectionAtBlock(int var1, int var2, int var3)
public Set<Dependency<ChunkStore>> getDependenciespublic Set<Dependency<ChunkStore>> getDependencies()
public FluidSection getFluidSectionpublic FluidSection getFluidSection(int var1, int var2, int var3)
public FluidSection getFluidSectionAtBlockpublic FluidSection getFluidSectionAtBlock(int var1, int var2, int var3)
public Query<ChunkStore> getQuerypublic Query<ChunkStore> getQuery()
if if(var12 <= var4)
if if(var13 != null)
if if(var10 != null)
if if(var7 == null)
if if(var8 == null)
if if(var9 == null)
if if(var11 == null)
if if(var8 == null || var5x == 0)
if if(var7)
public static BlockPhysicsSystems.CachedAccessor ofpublic static BlockPhysicsSystems.CachedAccessor of(ComponentAccessor<ChunkStore> var0, Ref<ChunkStore> var1, BlockSection var2, BlockPhysics var3, FluidSection var4, int var5, int var6, int var7, int var8)
public void performBlockUpdatepublic void performBlockUpdate(int var1, int var2, int var3, int var4)
public void performBlockUpdatepublic void performBlockUpdate(int var1, int var2, int var3)
abstract super super(REGISTRY)
public void tickpublic void tick(float var1, int var2, @Nonnull ArchetypeChunk<ChunkStore> var3, @Nonnull Store<ChunkStore> var4, @Nonnull CommandBuffer<ChunkStore> var5)

Исходный код

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

class="kw">import com.hypixel.hytale.builtin.blocktick.system.ChunkBlockTickSystem;
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.DisableProcessingAssert;
class="kw">import com.hypixel.hytale.component.Ref;
class="kw">import com.hypixel.hytale.component.Store;
class="kw">import com.hypixel.hytale.component.dependency.Dependency;
class="kw">import com.hypixel.hytale.component.dependency.Order;
class="kw">import com.hypixel.hytale.component.dependency.SystemDependency;
class="kw">import com.hypixel.hytale.component.query.Query;
class="kw">import com.hypixel.hytale.component.system.tick.EntityTickingSystem;
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.blocktype.component.BlockPhysics;
class="kw">import com.hypixel.hytale.server.core.universe.world.World;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.AbstractCachedAccessor;
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.storage.ChunkStore;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
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 BlockPhysicsSystems {
   @Nonnull
   class="kw">private class="kw">static class="kw">final HytaleLogger LOGGER = HytaleLogger.forEnclosingClass();
   class="kw">public class="kw">static class="kw">final int MAX_SUPPORT_RADIUS = 14;

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

   class="kw">public class="kw">static class CachedAccessor class="kw">extends AbstractCachedAccessor {
      @Nonnull
      class="kw">private class="kw">static class="kw">final ThreadLocal<BlockPhysicsSystems.CachedAccessor> THREAD_LOCAL = ThreadLocal.withInitial(BlockPhysicsSystems.CachedAccessor::new);
      class="kw">private class="kw">static class="kw">final AbstractCachedAccessor.Registry REGISTRY = new AbstractCachedAccessor.Registry();
      class="kw">private class="kw">static class="kw">final AbstractCachedAccessor.Key<BlockPhysics> PHYSICS_COMPONENT = REGISTRY.forSection(BlockPhysics::getComponentType);
      class="kw">private class="kw">static class="kw">final AbstractCachedAccessor.Key<FluidSection> FLUID_COMPONENT = REGISTRY.forSection(FluidSection::getComponentType);
      class="kw">private class="kw">static class="kw">final AbstractCachedAccessor.Key<BlockSection> BLOCK_COMPONENT = REGISTRY.forSection(BlockSection::getComponentType);
      class="kw">protected BlockSection selfBlockSection;
      class="kw">protected BlockPhysics selfPhysics;
      class="kw">protected FluidSection selfFluidSection;
      class="kw">protected Ref<ChunkStore> selfSectionReference;

      class="kw">protected CachedAccessor() {
         super(REGISTRY);
      }

      @Nonnull
      class="kw">public class="kw">static BlockPhysicsSystems.CachedAccessor of(
         ComponentAccessor<ChunkStore> var0,
         Ref<ChunkStore> var1,
         BlockSection var2,
         BlockPhysics var3,
         FluidSection var4,
         int var5,
         int var6,
         int var7,
         int var8
      ) {
         BlockPhysicsSystems.CachedAccessor var9 = THREAD_LOCAL.get();
         var9.init(var0, var5, var6, var7, var8);
         var9.insertSectionComponent(PHYSICS_COMPONENT, var3, var5, var6, var7);
         var9.insertSectionComponent(FLUID_COMPONENT, var4, var5, var6, var7);
         var9.insertSectionComponent(BLOCK_COMPONENT, var2, var5, var6, var7);
         var9.selfSectionReference = var1;
         var9.insertSection(var1, var5, var6, var7);
         var9.selfBlockSection = var2;
         var9.selfPhysics = var3;
         var9.selfFluidSection = var4;
         class="kw">return var9;
      }

      @Nullable
      class="kw">public BlockPhysics getBlockPhysics(int var1, int var2, int var3) {
         class="kw">return this.getComponentSection(var1, var2, var3, PHYSICS_COMPONENT);
      }

      @Nullable
      class="kw">public BlockPhysics getBlockPhysicsAtBlock(int var1, int var2, int var3) {
         class="kw">return this.getComponentSectionAtBlock(var1, var2, var3, PHYSICS_COMPONENT);
      }

      @Nullable
      class="kw">public FluidSection getFluidSection(int var1, int var2, int var3) {
         class="kw">return this.getComponentSection(var1, var2, var3, FLUID_COMPONENT);
      }

      @Nullable
      class="kw">public FluidSection getFluidSectionAtBlock(int var1, int var2, int var3) {
         class="kw">return this.getComponentSectionAtBlock(var1, var2, var3, FLUID_COMPONENT);
      }

      @Nullable
      class="kw">public BlockSection getBlockSection(int var1, int var2, int var3) {
         class="kw">return this.getComponentSection(var1, var2, var3, BLOCK_COMPONENT);
      }

      @Nullable
      class="kw">public BlockSection getBlockSectionAtBlock(int var1, int var2, int var3) {
         class="kw">return this.getComponentSectionAtBlock(var1, var2, var3, BLOCK_COMPONENT);
      }

      class="kw">public void performBlockUpdate(int var1, int var2, int var3, int var4) {
         for (int var5 = -1; var5 < 2; var5++) {
            int var6 = var1 + var5;

            for (int var7 = -1; var7 < 2; var7++) {
               int var8 = var3 + var7;

               for (int var9 = -1; var9 < 2; var9++) {
                  int var10 = var2 + var9;
                  BlockPhysics var11 = this.getBlockPhysics(ChunkUtil.chunkCoordinate(var6), ChunkUtil.chunkCoordinate(var10), ChunkUtil.chunkCoordinate(var8));
                  int var12 = var11 != null ? var11.get(var6, var10, var8) : 0;
                  if (var12 <= var4) {
                     BlockSection var13 = this.getBlockSection(
                        ChunkUtil.chunkCoordinate(var6), ChunkUtil.chunkCoordinate(var10), ChunkUtil.chunkCoordinate(var8)
                     );
                     if (var13 != null) {
                        var13.setTicking(var6, var10, var8, true);
                     }
                  }
               }
            }
         }
      }

      class="kw">public void performBlockUpdate(int var1, int var2, int var3) {
         for (int var4 = -1; var4 < 2; var4++) {
            int var5 = var1 + var4;

            for (int var6 = -1; var6 < 2; var6++) {
               int var7 = var3 + var6;

               for (int var8 = -1; var8 < 2; var8++) {
                  int var9 = var2 + var8;
                  BlockSection var10 = this.getBlockSection(ChunkUtil.chunkCoordinate(var5), ChunkUtil.chunkCoordinate(var9), ChunkUtil.chunkCoordinate(var7));
                  if (var10 != null) {
                     var10.setTicking(var5, var9, var7, true);
                  }
               }
            }
         }
      }
   }

   class="kw">public class="kw">static class Ticking class="kw">extends EntityTickingSystem<ChunkStore> class="kw">implements DisableProcessingAssert {
      @Nonnull
      class="kw">private class="kw">static class="kw">final Query<ChunkStore> QUERY = Query.and(
         ChunkSection.getComponentType(), BlockSection.getComponentType(), BlockPhysics.getComponentType(), FluidSection.getComponentType()
      );
      @Nonnull
      class="kw">private class="kw">static class="kw">final Set<Dependency<ChunkStore>> DEPENDENCIES = Set.of(
         new SystemDependency<>(Order.AFTER, ChunkBlockTickSystem.PreTick.class), new SystemDependency<>(Order.BEFORE, ChunkBlockTickSystem.Ticking.class)
      );

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

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

      @Nonnull
      @Override
      class="kw">public Set<Dependency<ChunkStore>> getDependencies() {
         class="kw">return DEPENDENCIES;
      }

      @Override
      class="kw">public void tick(float var1, int var2, @Nonnull ArchetypeChunk<ChunkStore> var3, @Nonnull Store<ChunkStore> var4, @Nonnull CommandBuffer<ChunkStore> var5) {
         ChunkSection var6 = var3.getComponent(var2, ChunkSection.getComponentType());
         assert var6 != null;

         try {
            BlockSection var7 = var3.getComponent(var2, BlockSection.getComponentType());
            if (var7 == null) {
               class="kw">return;
            }

            if (var7.getTickingBlocksCountCopy() <= 0) {
               class="kw">return;
            }

            BlockPhysics var8 = var3.getComponent(var2, BlockPhysics.getComponentType());
            if (var8 == null) {
               class="kw">return;
            }

            FluidSection var9 = var3.getComponent(var2, FluidSection.getComponentType());
            if (var9 == null) {
               class="kw">return;
            }

            Ref var10 = var6.getChunkColumnReference();
            if (var10 == null || !var10.isValid()) {
               class="kw">return;
            }

            WorldChunk var11 = var5.getComponent(var10, WorldChunk.getComponentType());
            if (var11 == null) {
               class="kw">return;
            }

            BlockPhysicsSystems.CachedAccessor var12 = BlockPhysicsSystems.CachedAccessor.of(
               var5, var3.getReferenceTo(var2), var7, var8, var9, var6.getX(), var6.getY(), var6.getZ(), 14
            );
            var7.forEachTicking(
               var11,
               var12,
               var6.getY(),
               (var0, var1x, var2x, var3x, var4x, var5x) -> {
                  BlockPhysics var6 = var1x.selfPhysics;
                  boolean var7 = var6.isDeco(var2x, var3x, var4x);
                  BlockType var8 = BlockType.getAssetMap().getAsset(var5x);
                  if (var8 == null || var5x == 0) {
                     class="kw">return BlockTickStrategy.IGNORED;
                  }

                  if (var7) {
                     class="kw">return BlockTickStrategy.IGNORED;
                  }

                  World var9 = var0.getWorld();
                  Store var10 = var9.getEntityStore().getStore();
                  int var11 = var0.getX() << 5 | var2x;
                  int var12 = var3x;
                  int var13 = var0.getZ() << 5 | var4x;
                  int var14 = var1x.selfBlockSection.getFiller(var2x, var3x, var4x);
                  int var15 = var1x.selfBlockSection.getRotationIndex(var2x, var3x, var4x);

                  class="kw">return class="kw">switch (BlockPhysicsUtil.applyBlockPhysics(
                     var10,
                     var1x,
                     var1x.selfSectionReference,
                     var1x.selfBlockSection,
                     var1x.selfPhysics,
                     var1x.selfFluidSection,
                     var11,
                     var12,
                     var13,
                     var8,
                     var15,
                     var14
                  )) {
                     case WAITING_CHUNK -> BlockTickStrategy.WAIT_FOR_ADJACENT_CHUNK_LOAD;
                     case VALID -> BlockTickStrategy.IGNORED;
                     case INVALID -> BlockTickStrategy.SLEEP;
                  };
               }
            );
         } catch (Exception var13) {
            ((HytaleLogger.Api)BlockPhysicsSystems.LOGGER.at(Level.SEVERE).withCause(var13)).log("Failed to tick chunk: %s", var6);
         }
      }
   }
}