Files
EndlessIDs/src/main/java/com/falsepattern/endlessids/managers/BiomeManager.java
T
2023-12-28 21:30:07 +01:00

109 lines
3.4 KiB
Java

package com.falsepattern.endlessids.managers;
import com.falsepattern.chunk.api.ArrayUtil;
import com.falsepattern.chunk.api.DataManager;
import com.falsepattern.endlessids.Hooks;
import com.falsepattern.endlessids.Tags;
import com.falsepattern.endlessids.mixin.helpers.IChunkMixin;
import lombok.val;
import lombok.var;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.world.chunk.Chunk;
import java.nio.ByteBuffer;
public class BiomeManager implements DataManager.PacketDataManager, DataManager.ChunkDataManager {
@Override
public String domain() {
return Tags.MODID;
}
@Override
public String id() {
return "biome";
}
@Override
public int maxPacketSize() {
return 2 * 16 * 16;
}
@Override
public void writeToBuffer(Chunk chunk, int ebsMask, boolean forceUpdate, ByteBuffer data) {
data.asShortBuffer().put(((IChunkMixin)chunk).getBiomeShortArray());
data.position(data.position() + maxPacketSize());
}
@Override
public void readFromBuffer(Chunk chunk, int ebsMask, boolean forceUpdate, ByteBuffer buffer) {
var arr = ((IChunkMixin)chunk).getBiomeShortArray();
if (arr == null) {
arr = new short[16 * 16];
((IChunkMixin)chunk).setBiomeShortArray(arr);
}
buffer.asShortBuffer().get(arr);
buffer.position(buffer.position() + maxPacketSize());
}
@Override
public boolean chunkPrivilegedAccess() {
return true;
}
@Override
public void writeChunkToNBT(Chunk chunk, NBTTagCompound nbt) {
byte[] arr = Hooks.shortToByteArray(((IChunkMixin)chunk).getBiomeShortArray());
nbt.setByteArray("Biomes16v2", arr);
}
@Override
public void readChunkFromNBT(Chunk chunk, NBTTagCompound nbt) {
var data = ((IChunkMixin) chunk).getBiomeShortArray();
if (data == null) {
data = new short[16 * 16];
((IChunkMixin)chunk).setBiomeShortArray(data);
}
if (nbt.hasKey("Biomes16v2", 7)) {
Hooks.byteToShortArray(nbt.getByteArray("Biomes16v2"), 0, data, 0, data.length * 2);
} else if (nbt.hasKey("Biomes16", 7)) { //NotEnoughBiomes DFU
Hooks.byteToShortArrayLegacy(nbt.getByteArray("Biomes16"), data);
} else if (nbt.hasKey("Biomes", 7)) { //Vanilla DFU
Hooks.scatter(nbt.getByteArray("Biomes"), data);
}
}
@Override
public void cloneChunk(Chunk fromVanilla, Chunk toVanilla) {
val from = (IChunkMixin) fromVanilla;
val to = (IChunkMixin) toVanilla;
to.setBiomeShortArray(ArrayUtil.copyArray(from.getBiomeShortArray(), to.getBiomeShortArray()));
}
@Override
public @NotNull String version() {
return Tags.MODID;
}
@Override
public @Nullable String newInstallDescription() {
return "EndlessIDs extended biome data. Vanilla biome data is limited to 256 biomes. This allows for 65536 biomes.";
}
@Override
public @NotNull String uninstallMessage() {
return "EndlessIDs extended biome data has been uninstalled. Biomes are limited to 256,\n" +
"and any biomes with IDs above 255 in the save will be corrupted.";
}
@Override
public @Nullable String versionChangeMessage(String priorVersion) {
return null;
}
}