diff --git a/src/main/java/com/volmit/iris/Iris.java b/src/main/java/com/volmit/iris/Iris.java index 9032b0001..d67973288 100644 --- a/src/main/java/com/volmit/iris/Iris.java +++ b/src/main/java/com/volmit/iris/Iris.java @@ -562,7 +562,7 @@ public class Iris extends VolmitPlugin implements Listener { } - public static void reportErrorChunk(int x, int z, Throwable e) { + public static void reportErrorChunk(int x, int z, Throwable e, String extra) { if (IrisSettings.get().getGeneral().isDebug()) { File f = instance.getDataFile("debug", "chunk-errors", "chunk."+ x + "." + z + ".txt"); diff --git a/src/main/java/com/volmit/iris/engine/data/chunk/MCATerrainChunk.java b/src/main/java/com/volmit/iris/engine/data/chunk/MCATerrainChunk.java new file mode 100644 index 000000000..7cc9684db --- /dev/null +++ b/src/main/java/com/volmit/iris/engine/data/chunk/MCATerrainChunk.java @@ -0,0 +1,163 @@ +/* + * Iris is a World Generator for Minecraft Bukkit Servers + * Copyright (c) 2021 Arcane Arts (Volmit Software) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.volmit.iris.engine.data.chunk; + +import com.volmit.iris.core.nms.BiomeBaseInjector; +import com.volmit.iris.engine.data.mca.Chunk; +import com.volmit.iris.engine.data.mca.NBTWorld; +import lombok.AllArgsConstructor; +import lombok.Builder; +import org.bukkit.Material; +import org.bukkit.block.Biome; +import org.bukkit.block.data.BlockData; +import org.bukkit.generator.ChunkGenerator; +import org.bukkit.material.MaterialData; +import org.jetbrains.annotations.NotNull; + +@Builder +@AllArgsConstructor +public class MCATerrainChunk implements TerrainChunk { + private NBTWorld writer; + private BiomeBaseInjector injector; + private int ox; + private int oz; + private int minHeight; + private int maxHeight; + private Chunk mcaChunk; + + @Override + public BiomeBaseInjector getBiomeBaseInjector() { + return injector; + } + + @Override + public void setRaw(ChunkGenerator.ChunkData data) { + + } + + @NotNull + @Override + public Biome getBiome(int x, int z) { + return Biome.THE_VOID; + } + + @NotNull + @Override + public Biome getBiome(int x, int y, int z) { + return Biome.THE_VOID; + } + + @Override + public void setBiome(int x, int z, Biome bio) { + setBiome(ox + x, 0, oz + z, bio); + } + + @Override + public void setBiome(int x, int y, int z, Biome bio) { + writer.setBiome(ox + x, y, oz + z, bio); + } + + @Override + public int getMinHeight() { + return minHeight; + } + + @Override + public int getMaxHeight() { + return maxHeight; + } + + @Override + public void setBlock(int x, int y, int z, BlockData blockData) { + int xx = (x + ox) & 15; + int zz = (z + oz) & 15; + + if (y > 255 || y < 0) { + return; + } + + mcaChunk.setBlockStateAt(xx, y, zz, NBTWorld.getCompound(blockData), false); + } + + @NotNull + @Override + public org.bukkit.block.data.BlockData getBlockData(int x, int y, int z) { + if (y > getMaxHeight()) { + y = getMaxHeight(); + } + + if (y < 0) { + y = 0; + } + + return NBTWorld.getBlockData(mcaChunk.getBlockStateAt((x + ox) & 15, y, (z + oz) & 15)); + } + + @Override + public ChunkGenerator.ChunkData getRaw() { + return null; + } + + @Override + public void inject(ChunkGenerator.BiomeGrid biome) { + + } + + @Override + public void setBlock(int x, int y, int z, @NotNull Material material) { + + } + + @Override + public void setBlock(int x, int y, int z, @NotNull MaterialData material) { + + } + + @Override + public void setRegion(int xMin, int yMin, int zMin, int xMax, int yMax, int zMax, @NotNull Material material) { + + } + + @Override + public void setRegion(int xMin, int yMin, int zMin, int xMax, int yMax, int zMax, @NotNull MaterialData material) { + + } + + @Override + public void setRegion(int xMin, int yMin, int zMin, int xMax, int yMax, int zMax, @NotNull BlockData blockData) { + + } + + @NotNull + @Override + public Material getType(int x, int y, int z) { + return null; + } + + @NotNull + @Override + public MaterialData getTypeAndData(int x, int y, int z) { + return null; + } + + @Override + public byte getData(int x, int y, int z) { + return 0; + } +} diff --git a/src/main/java/com/volmit/iris/engine/framework/EngineCompositeGenerator.java b/src/main/java/com/volmit/iris/engine/framework/EngineCompositeGenerator.java index c253bd94b..2ac6d4a9c 100644 --- a/src/main/java/com/volmit/iris/engine/framework/EngineCompositeGenerator.java +++ b/src/main/java/com/volmit/iris/engine/framework/EngineCompositeGenerator.java @@ -27,8 +27,11 @@ import com.volmit.iris.core.pregenerator.PregenListener; import com.volmit.iris.core.pregenerator.PregenTask; import com.volmit.iris.engine.IrisEngineCompound; import com.volmit.iris.engine.data.B; +import com.volmit.iris.engine.data.chunk.MCATerrainChunk; import com.volmit.iris.engine.data.chunk.TerrainChunk; +import com.volmit.iris.engine.data.mca.MCAUtil; import com.volmit.iris.engine.data.mca.NBTWorld; +import com.volmit.iris.engine.data.nbt.tag.CompoundTag; import com.volmit.iris.engine.headless.HeadlessGenerator; import com.volmit.iris.engine.hunk.Hunk; import com.volmit.iris.engine.object.IrisBiome; @@ -474,9 +477,9 @@ public class EngineCompositeGenerator extends ChunkGenerator implements IrisAcce { Iris.error("======================================"); e.printStackTrace(); - Iris.reportErrorChunk(x, z, e); + Iris.reportErrorChunk(x, z, e, "CHUNK"); Iris.error("======================================"); - + ChunkData d = Bukkit.createChunkData(world); for(int i = 0; i < 16; i++) @@ -533,132 +536,34 @@ public class EngineCompositeGenerator extends ChunkGenerator implements IrisAcce @Override public void directWriteChunk(IrisWorld w, int x, int z, NBTWorld writer) { - int ox = x << 4; - int oz = z << 4; - com.volmit.iris.engine.data.mca.Chunk cc = writer.getChunk(x, z); - BiomeBaseInjector injector = (xx, yy, zz, biomeBase) -> cc.setBiomeAt(ox + xx, yy, oz + zz, INMS.get().getTrueBiomeBaseId(biomeBase)); - //noinspection deprecation - generateChunkRawData(w, x, z, new TerrainChunk() { - @Override - public BiomeBaseInjector getBiomeBaseInjector() { - return injector; - } + try + {int ox = x << 4; + int oz = z << 4; + com.volmit.iris.engine.data.mca.Chunk chunk = writer.getChunk(x, z); + generateChunkRawData(w, x, z, MCATerrainChunk.builder() + .writer(writer).ox(ox).oz(oz).mcaChunk(chunk) + .minHeight(w.minHeight()).maxHeight(w.maxHeight()) + .injector((xx, yy, zz, biomeBase) -> chunk.setBiomeAt(ox + xx, yy, oz + zz, + INMS.get().getTrueBiomeBaseId(biomeBase))) + .build()).run(); + } - @Override - public void setRaw(ChunkData data) { - - } - - @NotNull - @Override - public Biome getBiome(int x, int z) { - return Biome.THE_VOID; - } - - @NotNull - @Override - public Biome getBiome(int x, int y, int z) { - return Biome.THE_VOID; - } - - @Override - public void setBiome(int x, int z, Biome bio) { - setBiome(ox + x, 0, oz + z, bio); - } - - @Override - public void setBiome(int x, int y, int z, Biome bio) { - writer.setBiome(ox + x, y, oz + z, bio); - } - - @Override - public int getMinHeight() { - return w.minHeight(); - } - - @Override - public int getMaxHeight() { - return w.maxHeight(); - } - - @Override - public void setBlock(int x, int y, int z, BlockData blockData) { - int xx = (x + ox) & 15; - int zz = (z + oz) & 15; - - if (y > 255 || y < 0) { - return; + catch(Throwable e) + { + Iris.error("======================================"); + e.printStackTrace(); + Iris.reportErrorChunk(x, z, e, "MCA"); + Iris.error("======================================"); + com.volmit.iris.engine.data.mca.Chunk chunk = writer.getChunk(x, z); + CompoundTag c = NBTWorld.getCompound(ERROR_BLOCK); + for(int i = 0; i < 16; i++) + { + for(int j = 0; j < 16; j++) + { + chunk.setBlockStateAt(i, 0, j, c, false); } - - cc.setBlockStateAt(xx, y, zz, NBTWorld.getCompound(blockData), false); } - - @NotNull - @Override - public BlockData getBlockData(int x, int y, int z) { - if (y > getMaxHeight()) { - y = getMaxHeight(); - } - - if (y < 0) { - y = 0; - } - - return NBTWorld.getBlockData(cc.getBlockStateAt((x + ox) & 15, y, (z + oz) & 15)); - } - - @Override - public ChunkData getRaw() { - return null; - } - - @Override - public void inject(BiomeGrid biome) { - - } - - @Override - public void setBlock(int x, int y, int z, @NotNull Material material) { - - } - - @Override - public void setBlock(int x, int y, int z, @NotNull MaterialData material) { - - } - - @Override - public void setRegion(int xMin, int yMin, int zMin, int xMax, int yMax, int zMax, @NotNull Material material) { - - } - - @Override - public void setRegion(int xMin, int yMin, int zMin, int xMax, int yMax, int zMax, @NotNull MaterialData material) { - - } - - @Override - public void setRegion(int xMin, int yMin, int zMin, int xMax, int yMax, int zMax, @NotNull BlockData blockData) { - - } - - @NotNull - @Override - public Material getType(int x, int y, int z) { - return null; - } - - @NotNull - @Override - public MaterialData getTypeAndData(int x, int y, int z) { - return null; - } - - @Override - public byte getData(int x, int y, int z) { - return 0; - } - }).run(); + } } public Runnable generateChunkRawData(IrisWorld world, int x, int z, TerrainChunk tc) {