AbstractCachedAccessor class

Пакет: com.hypixel.hytale.server.core.universe.world.chunk

Файл: com/hypixel/hytale/server/core/universe/world/chunk/AbstractCachedAccessor.java

Поля (34)

МодификаторыТипИмя
final int MAX_SIZE_PER_AXIS
private boolean locked
private int nextColumnId
private int nextSectionId
private ThreadLocal<CachedAccessor> threadLocal
int var10
int var11
int var12
Component[] var14
Component[] var16
int var3
int var3
Ref var4
int var4
int var4
int var4
int var4
int var5
int var5
Ref var5
int var5
Ref var5
int var5
int var6
Ref var6
Ref var6
int var6
Ref var7
Component var7
int var8
Component var8
CachedAccessor var8
CachedAccessor var8
int var9

Методы (39)

МодификаторыВозвратСигнатура
abstract throw new IllegalStateExceptionthrow new IllegalStateException("Can not register on locked registry")
public Registrypublic Registry()
for for(int var13 = 0; var13 < this.columnComponents.length; var13++)
for for(int var15 = 0; var15 < this.sectionComponents.length; var15++)
public <T extends Component<ChunkStore>> AbstractCachedAccessor.Key<T> forColumnpublic <T extends Component<ChunkStore>> AbstractCachedAccessor.Key<T> forColumn(Supplier<ComponentType<ChunkStore, T>> var1)
public <T extends Component<ChunkStore>> AbstractCachedAccessor.Key<T> forSectionpublic <T extends Component<ChunkStore>> AbstractCachedAccessor.Key<T> forSection(Supplier<ComponentType<ChunkStore, T>> var1)
default CachedAccessor getdefault CachedAccessor get(ComponentAccessor<ChunkStore> var1, int var2, int var3, int var4, int var5)
abstract CachedAccessor getCachedAccessor get(ComponentAccessor<ChunkStore> var1, int var2, int var3, int var4, int var5, int var6, int var7)
default CachedAccessor getAtBlockdefault CachedAccessor getAtBlock(ComponentAccessor<ChunkStore> var1, int var2, int var3, int var4, int var5, int var6, int var7)
default CachedAccessor getAtBlockdefault CachedAccessor getAtBlock(ComponentAccessor<ChunkStore> var1, int var2, int var3, int var4, int var5)
if if(this.columns != null && this.columns.length >= var11)
if if(var14 != null && var14.length >= var11)
if if(var16 != null && var16.length >= var12)
if if(this.sections != null && this.sections.length >= var12)
if if(var5 >= 0)
if if(var6 >= 0)
if if(var5 >= 0)
if if(var3 >= 0)
if if(var4 == null)
if if(var4 >= 0)
if if(var5 == null)
if if(var5 >= 0)
if if(var8 == null)
if if(var7 == null)
if if(var4 >= 0)
if if(var7 == null)
if if(var6 == null)
if if(this.locked)
if if(this.locked)
if if(this.threadLocal == null)
private int index2dint index2d(int var1, int var2)
private int index3dint index3d(int var1, int var2, int var3)
protected void initvoid init(ComponentAccessor<ChunkStore> var1, int var2, int var3, int var4, int var5)
protected void initvoid init(ComponentAccessor<ChunkStore> var1, int var2, int var3, int var4, int var5, int var6, int var7)
protected <T extends Component<ChunkStore>> void insertColumnComponent<T extends Component<ChunkStore>> void insertColumnComponent(@Nonnull AbstractCachedAccessor.Key<T> var1, T var2, int var3, int var4)
protected void insertSectionvoid insertSection(Ref<ChunkStore> var1, int var2, int var3, int var4)
protected <T extends Component<ChunkStore>> void insertSectionComponent<T extends Component<ChunkStore>> void insertSectionComponent(@Nonnull AbstractCachedAccessor.Key<T> var1, T var2, int var3, int var4, int var5)
public AbstractCachedAccessor.InitFunction oneShotpublic AbstractCachedAccessor.InitFunction oneShot()
public AbstractCachedAccessor.InitFunction threadLocalpublic AbstractCachedAccessor.InitFunction threadLocal()

Исходный код

Показать/скрыть
class="kw">package com.hypixel.hytale.server.core.universe.world.chunk;

class="kw">import com.hypixel.hytale.component.Component;
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.math.util.ChunkUtil;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.ChunkStore;
class="kw">import java.util.Arrays;
class="kw">import java.util.function.Supplier;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;

class="kw">public class="kw">abstract class AbstractCachedAccessor {
   class="kw">private class="kw">static class="kw">final int MAX_SIZE_PER_AXIS = 64;
   class="kw">private class="kw">static class="kw">final Component<ChunkStore>[][] EMPTY_COMPONENTS = new Component[0][];
   @Nonnull
   class="kw">private class="kw">final AbstractCachedAccessor.Registry registry;
   class="kw">protected ComponentAccessor<ChunkStore> commandBuffer;
   class="kw">private int minX;
   class="kw">private int minY;
   class="kw">private int minZ;
   class="kw">private int lengthX;
   class="kw">private int lengthY;
   class="kw">private int lengthZ;
   class="kw">private Ref<ChunkStore>[] columns;
   class="kw">private class="kw">final Component<ChunkStore>[][] columnComponents;
   class="kw">private Ref<ChunkStore>[] sections;
   class="kw">private class="kw">final Component<ChunkStore>[][] sectionComponents;

   class="kw">protected AbstractCachedAccessor(AbstractCachedAccessor.Registry var1) {
      this.registry = var1;
      var1.locked = true;
      this.sectionComponents = var1.nextSectionId == 0 ? EMPTY_COMPONENTS : new Component[var1.nextSectionId][];
      this.columnComponents = var1.nextColumnId == 0 ? EMPTY_COMPONENTS : new Component[var1.nextColumnId][];
   }

   class="kw">protected void init(ComponentAccessor<ChunkStore> var1, int var2, int var3, int var4, int var5) {
      this.init(var1, var2, var3, var4, var5, var5, var5);
   }

   class="kw">protected void init(ComponentAccessor<ChunkStore> var1, int var2, int var3, int var4, int var5, int var6, int var7) {
      this.commandBuffer = var1;
      int var8 = Math.min(ChunkUtil.chunkCoordinate(var5) + 1, 64);
      int var9 = Math.min(ChunkUtil.chunkCoordinate(var6) + 1, 64);
      int var10 = Math.min(ChunkUtil.chunkCoordinate(var7) + 1, 64);
      this.minX = var2 - var8;
      this.minY = var3 - var9;
      this.minZ = var4 - var10;
      this.lengthX = var8 * 2 + 1;
      this.lengthY = var9 * 2 + 1;
      this.lengthZ = var10 * 2 + 1;
      int var11 = this.lengthX * this.lengthZ;
      int var12 = this.lengthX * this.lengthY * this.lengthZ;
      if (this.columns != null && this.columns.length >= var11) {
         Arrays.fill(this.columns, null);
      } else {
         this.columns = new Ref[var11];
      }

      for (int var13 = 0; var13 < this.columnComponents.length; var13++) {
         Component[] var14 = this.columnComponents[var13];
         if (var14 != null && var14.length >= var11) {
            Arrays.fill(var14, null);
         } else {
            this.columnComponents[var13] = new Component[var11];
         }
      }

      for (int var15 = 0; var15 < this.sectionComponents.length; var15++) {
         Component[] var16 = this.sectionComponents[var15];
         if (var16 != null && var16.length >= var12) {
            Arrays.fill(var16, null);
         } else {
            this.sectionComponents[var15] = new Component[var12];
         }
      }

      if (this.sections != null && this.sections.length >= var12) {
         Arrays.fill(this.sections, null);
      } else {
         this.sections = new Ref[var12];
      }
   }

   class="kw">protected void insertSection(Ref<ChunkStore> var1, int var2, int var3, int var4) {
      int var5 = this.index3d(var2, var3, var4);
      if (var5 >= 0) {
         this.sections[var5] = var1;
      }
   }

   class="kw">protected <T class="kw">extends Component<ChunkStore>> void insertSectionComponent(@Nonnull AbstractCachedAccessor.Key<T> var1, T var2, int var3, int var4, int var5) {
      assert var1.registry == this.registry && var1.forSection;
      int var6 = this.index3d(var3, var4, var5);
      if (var6 >= 0) {
         this.sectionComponents[var1.index][var6] = var2;
      }
   }

   class="kw">protected <T class="kw">extends Component<ChunkStore>> void insertColumnComponent(@Nonnull AbstractCachedAccessor.Key<T> var1, T var2, int var3, int var4) {
      assert var1.registry == this.registry && !var1.forSection;
      int var5 = this.index2d(var3, var4);
      if (var5 >= 0) {
         this.columnComponents[var1.index][var5] = var2;
      }
   }

   @Nullable
   class="kw">public Ref<ChunkStore> getColumn(int var1, int var2) {
      int var3 = this.index2d(var1, var2);
      if (var3 >= 0) {
         Ref var4 = this.columns[var3];
         if (var4 == null) {
            this.columns[var3] = var4 = this.commandBuffer.getExternalData().getChunkReference(ChunkUtil.indexChunk(var1, var2));
         }

         class="kw">return var4;
      } else {
         class="kw">return this.commandBuffer.getExternalData().getChunkReference(ChunkUtil.indexChunk(var1, var2));
      }
   }

   @Nullable
   class="kw">public Ref<ChunkStore> getColumnAtBlock(int var1, int var2) {
      class="kw">return this.getColumn(ChunkUtil.chunkCoordinate(var1), ChunkUtil.chunkCoordinate(var2));
   }

   @Nullable
   class="kw">public Ref<ChunkStore> getSection(int var1, int var2, int var3) {
      int var4 = this.index3d(var1, var2, var3);
      if (var4 >= 0) {
         Ref var5 = this.sections[var4];
         if (var5 == null) {
            this.sections[var4] = var5 = this.commandBuffer.getExternalData().getChunkSectionReference(var1, var2, var3);
         }

         class="kw">return var5;
      } else {
         class="kw">return this.commandBuffer.getExternalData().getChunkSectionReference(var1, var2, var3);
      }
   }

   @Nullable
   class="kw">public Ref<ChunkStore> getSectionAtBlock(int var1, int var2, int var3) {
      class="kw">return this.getSection(ChunkUtil.chunkCoordinate(var1), ChunkUtil.chunkCoordinate(var2), ChunkUtil.chunkCoordinate(var3));
   }

   @Nullable
   class="kw">protected <T class="kw">extends Component<ChunkStore>> T getComponentSection(int var1, int var2, int var3, @Nonnull AbstractCachedAccessor.Key<T> var4) {
      assert var4.registry == this.registry && var4.forSection;
      int var5 = this.index3d(var1, var2, var3);
      if (var5 >= 0) {
         Component var8 = (T)this.sectionComponents[var4.index][var5];
         if (var8 == null) {
            Ref var7 = this.getSection(var1, var2, var3);
            if (var7 == null) {
               class="kw">return null;
            }

            this.sectionComponents[var4.index][var5] = var8 = this.commandBuffer.getComponent(var7, var4.componentType.get());
         }

         class="kw">return var8;
      } else {
         Ref var6 = this.getSection(var1, var2, var3);
         class="kw">return var6 == null ? null : this.commandBuffer.getComponent(var6, var4.componentType.get());
      }
   }

   @Nullable
   class="kw">protected <T class="kw">extends Component<ChunkStore>> T getComponentSectionAtBlock(int var1, int var2, int var3, @Nonnull AbstractCachedAccessor.Key<T> var4) {
      class="kw">return this.getComponentSection(ChunkUtil.chunkCoordinate(var1), ChunkUtil.chunkCoordinate(var2), ChunkUtil.chunkCoordinate(var3), var4);
   }

   @Nullable
   class="kw">protected <T class="kw">extends Component<ChunkStore>> T getComponentColumn(int var1, int var2, @Nonnull AbstractCachedAccessor.Key<T> var3) {
      assert var3.registry == this.registry && !var3.forSection;
      int var4 = this.index2d(var1, var2);
      if (var4 >= 0) {
         Component var7 = (T)this.columnComponents[var3.index][var4];
         if (var7 == null) {
            Ref var6 = this.getColumn(var1, var2);
            if (var6 == null) {
               class="kw">return null;
            }

            this.columnComponents[var3.index][var4] = var7 = this.commandBuffer.getComponent(var6, var3.componentType.get());
         }

         class="kw">return var7;
      } else {
         Ref var5 = this.getColumn(var1, var2);
         class="kw">return var5 == null ? null : this.commandBuffer.getComponent(var5, var3.componentType.get());
      }
   }

   @Nullable
   class="kw">protected <T class="kw">extends Component<ChunkStore>> T getComponentColumnAtBlock(int var1, int var2, @Nonnull AbstractCachedAccessor.Key<T> var3) {
      class="kw">return this.getComponentColumn(ChunkUtil.chunkCoordinate(var1), ChunkUtil.chunkCoordinate(var2), var3);
   }

   class="kw">private int index2d(int var1, int var2) {
      int var3 = var1 - this.minX;
      int var4 = var2 - this.minZ;
      class="kw">return var3 >= 0 && var3 < this.lengthX && var4 >= 0 && var4 < this.lengthZ ? var3 + var4 * this.lengthX : -1;
   }

   class="kw">private int index3d(int var1, int var2, int var3) {
      int var4 = var1 - this.minX;
      int var5 = var2 - this.minY;
      int var6 = var3 - this.minZ;
      class="kw">return var4 >= 0 && var4 < this.lengthX && var5 >= 0 && var5 < this.lengthY && var6 >= 0 && var6 < this.lengthZ
         ? var4 + var6 * this.lengthX + var5 * this.lengthX * this.lengthZ
         : -1;
   }

   @FunctionalInterface
   class="kw">public class="kw">interface InitFunction {
      CachedAccessor get(ComponentAccessor<ChunkStore> var1, int var2, int var3, int var4, int var5, int var6, int var7);

      class="kw">default CachedAccessor get(ComponentAccessor<ChunkStore> var1, int var2, int var3, int var4, int var5) {
         class="kw">return this.get(var1, var2, var3, var4, var5, var5, var5);
      }

      class="kw">default CachedAccessor getAtBlock(ComponentAccessor<ChunkStore> var1, int var2, int var3, int var4, int var5, int var6, int var7) {
         class="kw">return this.get(var1, ChunkUtil.chunkCoordinate(var2), ChunkUtil.chunkCoordinate(var3), ChunkUtil.chunkCoordinate(var4), var5, var6, var7);
      }

      class="kw">default CachedAccessor getAtBlock(ComponentAccessor<ChunkStore> var1, int var2, int var3, int var4, int var5) {
         class="kw">return this.getAtBlock(var1, var2, var3, var4, var5, var5, var5);
      }
   }

   class="kw">public record Key<T class="kw">extends Component<ChunkStore>>(
      AbstractCachedAccessor.Registry registry, int index, boolean forSection, Supplier<ComponentType<ChunkStore, T>> componentType
   ) {
      class="kw">public Key {
      }
   }

   class="kw">public class="kw">static class Registry {
      class="kw">private int nextSectionId;
      class="kw">private int nextColumnId;
      class="kw">private boolean locked;
      @Nullable
      class="kw">private ThreadLocal<CachedAccessor> threadLocal;

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

      class="kw">public <T class="kw">extends Component<ChunkStore>> AbstractCachedAccessor.Key<T> forSection(Supplier<ComponentType<ChunkStore, T>> var1) {
         if (this.locked) {
            throw new IllegalStateException("Can not register on locked registry");
         } else {
            class="kw">return new AbstractCachedAccessor.Key<>(this, this.nextSectionId++, true, var1);
         }
      }

      class="kw">public <T class="kw">extends Component<ChunkStore>> AbstractCachedAccessor.Key<T> forColumn(Supplier<ComponentType<ChunkStore, T>> var1) {
         if (this.locked) {
            throw new IllegalStateException("Can not register on locked registry");
         } else {
            class="kw">return new AbstractCachedAccessor.Key<>(this, this.nextColumnId++, false, var1);
         }
      }

      class="kw">public AbstractCachedAccessor.InitFunction oneShot() {
         class="kw">return (var1, var2, var3, var4, var5, var6, var7) -> {
            CachedAccessor var8 = new CachedAccessor(this);
            var8.init(var1, var2, var3, var4, var5, var6, var7);
            class="kw">return var8;
         };
      }

      class="kw">public AbstractCachedAccessor.InitFunction threadLocal() {
         if (this.threadLocal == null) {
            this.threadLocal = ThreadLocal.withInitial(() -> new CachedAccessor(this));
         }

         class="kw">return (var1, var2, var3, var4, var5, var6, var7) -> {
            CachedAccessor var8 = this.threadLocal.get();
            var8.init(var1, var2, var3, var4, var5, var6, var7);
            class="kw">return var8;
         };
      }
   }
}