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;
};
}
}
}