minecraft-src/net/minecraft/world/level/lighting/DataLayerStorageMap.java
2025-07-04 01:41:11 +03:00

80 lines
1.9 KiB
Java

package net.minecraft.world.level.lighting;
import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap;
import net.minecraft.world.level.chunk.DataLayer;
import org.jetbrains.annotations.Nullable;
public abstract class DataLayerStorageMap<M extends DataLayerStorageMap<M>> {
private static final int CACHE_SIZE = 2;
private final long[] lastSectionKeys = new long[2];
private final DataLayer[] lastSections = new DataLayer[2];
private boolean cacheEnabled;
protected final Long2ObjectOpenHashMap<DataLayer> map;
protected DataLayerStorageMap(Long2ObjectOpenHashMap<DataLayer> map) {
this.map = map;
this.clearCache();
this.cacheEnabled = true;
}
public abstract M copy();
public DataLayer copyDataLayer(long index) {
DataLayer dataLayer = this.map.get(index).copy();
this.map.put(index, dataLayer);
this.clearCache();
return dataLayer;
}
public boolean hasLayer(long sectionPos) {
return this.map.containsKey(sectionPos);
}
@Nullable
public DataLayer getLayer(long sectionPos) {
if (this.cacheEnabled) {
for (int i = 0; i < 2; i++) {
if (sectionPos == this.lastSectionKeys[i]) {
return this.lastSections[i];
}
}
}
DataLayer dataLayer = this.map.get(sectionPos);
if (dataLayer == null) {
return null;
} else {
if (this.cacheEnabled) {
for (int j = 1; j > 0; j--) {
this.lastSectionKeys[j] = this.lastSectionKeys[j - 1];
this.lastSections[j] = this.lastSections[j - 1];
}
this.lastSectionKeys[0] = sectionPos;
this.lastSections[0] = dataLayer;
}
return dataLayer;
}
}
@Nullable
public DataLayer removeLayer(long sectionPos) {
return this.map.remove(sectionPos);
}
public void setLayer(long sectionPos, DataLayer array) {
this.map.put(sectionPos, array);
}
public void clearCache() {
for (int i = 0; i < 2; i++) {
this.lastSectionKeys[i] = Long.MAX_VALUE;
this.lastSections[i] = null;
}
}
public void disableCache() {
this.cacheEnabled = false;
}
}