68 lines
1.8 KiB
Java
68 lines
1.8 KiB
Java
package net.minecraft.util;
|
|
|
|
import java.util.Locale;
|
|
import java.util.function.Consumer;
|
|
|
|
public class StaticCache2D<T> {
|
|
private final int minX;
|
|
private final int minZ;
|
|
private final int sizeX;
|
|
private final int sizeZ;
|
|
private final Object[] cache;
|
|
|
|
public static <T> StaticCache2D<T> create(int centerX, int centerZ, int size, StaticCache2D.Initializer<T> initializer) {
|
|
int i = centerX - size;
|
|
int j = centerZ - size;
|
|
int k = 2 * size + 1;
|
|
return new StaticCache2D<>(i, j, k, k, initializer);
|
|
}
|
|
|
|
private StaticCache2D(int minX, int minZ, int sizeX, int sizeZ, StaticCache2D.Initializer<T> initializer) {
|
|
this.minX = minX;
|
|
this.minZ = minZ;
|
|
this.sizeX = sizeX;
|
|
this.sizeZ = sizeZ;
|
|
this.cache = new Object[this.sizeX * this.sizeZ];
|
|
|
|
for (int i = minX; i < minX + sizeX; i++) {
|
|
for (int j = minZ; j < minZ + sizeZ; j++) {
|
|
this.cache[this.getIndex(i, j)] = initializer.get(i, j);
|
|
}
|
|
}
|
|
}
|
|
|
|
public void forEach(Consumer<T> action) {
|
|
for (Object object : this.cache) {
|
|
action.accept(object);
|
|
}
|
|
}
|
|
|
|
public T get(int x, int z) {
|
|
if (!this.contains(x, z)) {
|
|
throw new IllegalArgumentException("Requested out of range value (" + x + "," + z + ") from " + this);
|
|
} else {
|
|
return (T)this.cache[this.getIndex(x, z)];
|
|
}
|
|
}
|
|
|
|
public boolean contains(int x, int z) {
|
|
int i = x - this.minX;
|
|
int j = z - this.minZ;
|
|
return i >= 0 && i < this.sizeX && j >= 0 && j < this.sizeZ;
|
|
}
|
|
|
|
public String toString() {
|
|
return String.format(Locale.ROOT, "StaticCache2D[%d, %d, %d, %d]", this.minX, this.minZ, this.minX + this.sizeX, this.minZ + this.sizeZ);
|
|
}
|
|
|
|
private int getIndex(int x, int z) {
|
|
int i = x - this.minX;
|
|
int j = z - this.minZ;
|
|
return i * this.sizeZ + j;
|
|
}
|
|
|
|
@FunctionalInterface
|
|
public interface Initializer<T> {
|
|
T get(int i, int j);
|
|
}
|
|
}
|