MCA Data Pack Support for custom biomes

This commit is contained in:
Daniel Mills 2021-07-14 15:23:04 -04:00
parent 2433e31db0
commit dbdf8a97ae
6 changed files with 77 additions and 3 deletions

View File

@ -1,5 +1,6 @@
package com.volmit.iris.generator.actuator;
import com.volmit.iris.nms.BiomeBaseInjector;
import com.volmit.iris.nms.INMS;
import com.volmit.iris.object.IrisBiome;
import com.volmit.iris.object.IrisBiomeCustom;
@ -11,7 +12,9 @@ import com.volmit.iris.scaffold.parallel.BurstExecutor;
import com.volmit.iris.scaffold.parallel.MultiBurst;
import com.volmit.iris.util.PrecisionStopwatch;
import com.volmit.iris.util.RNG;
import com.volmit.iris.util.TerrainChunk;
import org.bukkit.block.Biome;
import org.bukkit.generator.ChunkGenerator;
public class IrisBiomeActuator extends EngineAssignedActuator<Biome> {
private final RNG rng;
@ -21,6 +24,36 @@ public class IrisBiomeActuator extends EngineAssignedActuator<Biome> {
rng = new RNG(engine.getWorld().getSeed() + 243995);
}
private boolean injectBiome(Hunk<Biome> h, int x, int y, int z, Object bb)
{
try
{
if(h instanceof BiomeGridHunkView)
{
BiomeGridHunkView hh = (BiomeGridHunkView) h;
ChunkGenerator.BiomeGrid g = hh.getChunk();
if(g instanceof TerrainChunk)
{
((TerrainChunk) g).getBiomeBaseInjector().setBiome(x,y,z,bb);
return true;
}
else
{
hh.forceBiomeBaseInto(x, y, z, bb);
return true;
}
}
}
catch(Throwable e)
{
e.printStackTrace();
}
return false;
}
@Override
public void onActuate(int x, int z, Hunk<Biome> h) {
PrecisionStopwatch p = PrecisionStopwatch.start();
@ -41,10 +74,14 @@ public class IrisBiomeActuator extends EngineAssignedActuator<Biome> {
{
IrisBiomeCustom custom = ib.getCustomBiome(rng, x, 0, z);
Object biomeBase = INMS.get().getCustomBiomeBaseFor(getDimension().getLoadKey()+":"+custom.getId());
((BiomeGridHunkView)h).forceBiomeBaseInto(x, 0, z, biomeBase);
if(!injectBiome(h, x, 0, z, biomeBase))
{
throw new RuntimeException("Cant inject biome!");
}
for (int i = 0; i < h.getHeight(); i++) {
((BiomeGridHunkView)h).forceBiomeBaseInto(xxf, i, zzf, biomeBase);
injectBiome(h, xxf, i, zzf, biomeBase);
}
}

View File

@ -0,0 +1,11 @@
package com.volmit.iris.nms;
@FunctionalInterface
public interface BiomeBaseInjector {
default void setBiome(int x, int z, Object biomeBase)
{
setBiome(x, 0, z, biomeBase);
}
void setBiome(int x, int y, int z, Object biomeBase);
}

View File

@ -4,6 +4,8 @@ import com.volmit.iris.Iris;
import com.volmit.iris.IrisSettings;
import com.volmit.iris.generator.IrisEngineCompound;
import com.volmit.iris.manager.IrisDataManager;
import com.volmit.iris.nms.BiomeBaseInjector;
import com.volmit.iris.nms.INMS;
import com.volmit.iris.object.IrisBiome;
import com.volmit.iris.object.IrisDimension;
import com.volmit.iris.object.IrisPosition;
@ -445,7 +447,13 @@ public class EngineCompositeGenerator extends ChunkGenerator implements IrisAcce
int ox = x << 4;
int oz = z << 4;
com.volmit.iris.scaffold.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));
generateChunkRawData(w, x, z, new TerrainChunk() {
@Override
public BiomeBaseInjector getBiomeBaseInjector() {
return injector;
}
@Override
public void setRaw(ChunkData data) {
@ -468,7 +476,7 @@ public class EngineCompositeGenerator extends ChunkGenerator implements IrisAcce
@Override
public void setBiome(int x, int y, int z, Biome bio) {
writer.setBiome((ox + x), y, oz + z, bio);
writer.setBiome(ox + x, y, oz + z, bio);
}
@Override
@ -744,7 +752,13 @@ public class EngineCompositeGenerator extends ChunkGenerator implements IrisAcce
clearRegeneratedLists(x, z);
int xx = x * 16;
int zz = z * 16;
BiomeBaseInjector inj = (a,b,c,d) -> {};
generateChunkRawData(getComposite().getWorld(), x, z, new TerrainChunk() {
@Override
public BiomeBaseInjector getBiomeBaseInjector() {
return inj;
}
@Override
public void setRaw(ChunkData data) {

View File

@ -4,12 +4,14 @@ import com.volmit.iris.nms.INMS;
import com.volmit.iris.scaffold.hunk.Hunk;
import com.volmit.iris.util.LinkedTerrainChunk;
import com.volmit.iris.util.TerrainChunk;
import lombok.Getter;
import net.minecraft.world.level.chunk.BiomeStorage;
import org.bukkit.block.Biome;
import org.bukkit.craftbukkit.v1_17_R1.generator.CustomChunkGenerator;
import org.bukkit.generator.ChunkGenerator.BiomeGrid;
public class BiomeGridHunkView implements Hunk<Biome> {
@Getter
private final BiomeGrid chunk;
public BiomeGridHunkView(BiomeGrid chunk) {

View File

@ -1,6 +1,8 @@
package com.volmit.iris.util;
import com.volmit.iris.Iris;
import com.volmit.iris.nms.BiomeBaseInjector;
import com.volmit.iris.nms.INMS;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.block.Biome;
@ -44,6 +46,11 @@ public class LinkedTerrainChunk implements TerrainChunk {
return null;
}
@Override
public BiomeBaseInjector getBiomeBaseInjector() {
return (x, y, z, bb) -> INMS.get().forceBiomeInto(x, y, z, bb, storage);
}
@Override
public Biome getBiome(int x, int z) {
if (storage != null) {

View File

@ -1,5 +1,6 @@
package com.volmit.iris.util;
import com.volmit.iris.nms.BiomeBaseInjector;
import org.bukkit.World;
import org.bukkit.block.Biome;
import org.bukkit.block.data.BlockData;
@ -27,6 +28,8 @@ public interface TerrainChunk extends BiomeGrid, ChunkData {
return new LinkedTerrainChunk(grid, maxHeight);
}
BiomeBaseInjector getBiomeBaseInjector();
void setRaw(ChunkData data);
/**