InitFunction interface

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

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

Методы (4)

МодификаторыВозвратСигнатура
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)

Исходный код

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