mirror of
https://github.com/VolmitSoftware/Iris.git
synced 2025-07-18 10:12:53 +00:00
MCA Data Pack Support for custom biomes
This commit is contained in:
parent
2433e31db0
commit
dbdf8a97ae
@ -1,5 +1,6 @@
|
|||||||
package com.volmit.iris.generator.actuator;
|
package com.volmit.iris.generator.actuator;
|
||||||
|
|
||||||
|
import com.volmit.iris.nms.BiomeBaseInjector;
|
||||||
import com.volmit.iris.nms.INMS;
|
import com.volmit.iris.nms.INMS;
|
||||||
import com.volmit.iris.object.IrisBiome;
|
import com.volmit.iris.object.IrisBiome;
|
||||||
import com.volmit.iris.object.IrisBiomeCustom;
|
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.scaffold.parallel.MultiBurst;
|
||||||
import com.volmit.iris.util.PrecisionStopwatch;
|
import com.volmit.iris.util.PrecisionStopwatch;
|
||||||
import com.volmit.iris.util.RNG;
|
import com.volmit.iris.util.RNG;
|
||||||
|
import com.volmit.iris.util.TerrainChunk;
|
||||||
import org.bukkit.block.Biome;
|
import org.bukkit.block.Biome;
|
||||||
|
import org.bukkit.generator.ChunkGenerator;
|
||||||
|
|
||||||
public class IrisBiomeActuator extends EngineAssignedActuator<Biome> {
|
public class IrisBiomeActuator extends EngineAssignedActuator<Biome> {
|
||||||
private final RNG rng;
|
private final RNG rng;
|
||||||
@ -21,6 +24,36 @@ public class IrisBiomeActuator extends EngineAssignedActuator<Biome> {
|
|||||||
rng = new RNG(engine.getWorld().getSeed() + 243995);
|
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
|
@Override
|
||||||
public void onActuate(int x, int z, Hunk<Biome> h) {
|
public void onActuate(int x, int z, Hunk<Biome> h) {
|
||||||
PrecisionStopwatch p = PrecisionStopwatch.start();
|
PrecisionStopwatch p = PrecisionStopwatch.start();
|
||||||
@ -41,10 +74,14 @@ public class IrisBiomeActuator extends EngineAssignedActuator<Biome> {
|
|||||||
{
|
{
|
||||||
IrisBiomeCustom custom = ib.getCustomBiome(rng, x, 0, z);
|
IrisBiomeCustom custom = ib.getCustomBiome(rng, x, 0, z);
|
||||||
Object biomeBase = INMS.get().getCustomBiomeBaseFor(getDimension().getLoadKey()+":"+custom.getId());
|
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++) {
|
for (int i = 0; i < h.getHeight(); i++) {
|
||||||
((BiomeGridHunkView)h).forceBiomeBaseInto(xxf, i, zzf, biomeBase);
|
injectBiome(h, xxf, i, zzf, biomeBase);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
11
src/main/java/com/volmit/iris/nms/BiomeBaseInjector.java
Normal file
11
src/main/java/com/volmit/iris/nms/BiomeBaseInjector.java
Normal 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);
|
||||||
|
}
|
@ -4,6 +4,8 @@ import com.volmit.iris.Iris;
|
|||||||
import com.volmit.iris.IrisSettings;
|
import com.volmit.iris.IrisSettings;
|
||||||
import com.volmit.iris.generator.IrisEngineCompound;
|
import com.volmit.iris.generator.IrisEngineCompound;
|
||||||
import com.volmit.iris.manager.IrisDataManager;
|
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.IrisBiome;
|
||||||
import com.volmit.iris.object.IrisDimension;
|
import com.volmit.iris.object.IrisDimension;
|
||||||
import com.volmit.iris.object.IrisPosition;
|
import com.volmit.iris.object.IrisPosition;
|
||||||
@ -445,7 +447,13 @@ public class EngineCompositeGenerator extends ChunkGenerator implements IrisAcce
|
|||||||
int ox = x << 4;
|
int ox = x << 4;
|
||||||
int oz = z << 4;
|
int oz = z << 4;
|
||||||
com.volmit.iris.scaffold.data.mca.Chunk cc = writer.getChunk(x, z);
|
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() {
|
generateChunkRawData(w, x, z, new TerrainChunk() {
|
||||||
|
@Override
|
||||||
|
public BiomeBaseInjector getBiomeBaseInjector() {
|
||||||
|
return injector;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setRaw(ChunkData data) {
|
public void setRaw(ChunkData data) {
|
||||||
|
|
||||||
@ -468,7 +476,7 @@ public class EngineCompositeGenerator extends ChunkGenerator implements IrisAcce
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setBiome(int x, int y, int z, Biome bio) {
|
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
|
@Override
|
||||||
@ -744,7 +752,13 @@ public class EngineCompositeGenerator extends ChunkGenerator implements IrisAcce
|
|||||||
clearRegeneratedLists(x, z);
|
clearRegeneratedLists(x, z);
|
||||||
int xx = x * 16;
|
int xx = x * 16;
|
||||||
int zz = z * 16;
|
int zz = z * 16;
|
||||||
|
BiomeBaseInjector inj = (a,b,c,d) -> {};
|
||||||
generateChunkRawData(getComposite().getWorld(), x, z, new TerrainChunk() {
|
generateChunkRawData(getComposite().getWorld(), x, z, new TerrainChunk() {
|
||||||
|
@Override
|
||||||
|
public BiomeBaseInjector getBiomeBaseInjector() {
|
||||||
|
return inj;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setRaw(ChunkData data) {
|
public void setRaw(ChunkData data) {
|
||||||
|
|
||||||
|
@ -4,12 +4,14 @@ import com.volmit.iris.nms.INMS;
|
|||||||
import com.volmit.iris.scaffold.hunk.Hunk;
|
import com.volmit.iris.scaffold.hunk.Hunk;
|
||||||
import com.volmit.iris.util.LinkedTerrainChunk;
|
import com.volmit.iris.util.LinkedTerrainChunk;
|
||||||
import com.volmit.iris.util.TerrainChunk;
|
import com.volmit.iris.util.TerrainChunk;
|
||||||
|
import lombok.Getter;
|
||||||
import net.minecraft.world.level.chunk.BiomeStorage;
|
import net.minecraft.world.level.chunk.BiomeStorage;
|
||||||
import org.bukkit.block.Biome;
|
import org.bukkit.block.Biome;
|
||||||
import org.bukkit.craftbukkit.v1_17_R1.generator.CustomChunkGenerator;
|
import org.bukkit.craftbukkit.v1_17_R1.generator.CustomChunkGenerator;
|
||||||
import org.bukkit.generator.ChunkGenerator.BiomeGrid;
|
import org.bukkit.generator.ChunkGenerator.BiomeGrid;
|
||||||
|
|
||||||
public class BiomeGridHunkView implements Hunk<Biome> {
|
public class BiomeGridHunkView implements Hunk<Biome> {
|
||||||
|
@Getter
|
||||||
private final BiomeGrid chunk;
|
private final BiomeGrid chunk;
|
||||||
|
|
||||||
public BiomeGridHunkView(BiomeGrid chunk) {
|
public BiomeGridHunkView(BiomeGrid chunk) {
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
package com.volmit.iris.util;
|
package com.volmit.iris.util;
|
||||||
|
|
||||||
import com.volmit.iris.Iris;
|
import com.volmit.iris.Iris;
|
||||||
|
import com.volmit.iris.nms.BiomeBaseInjector;
|
||||||
|
import com.volmit.iris.nms.INMS;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.block.Biome;
|
import org.bukkit.block.Biome;
|
||||||
@ -44,6 +46,11 @@ public class LinkedTerrainChunk implements TerrainChunk {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BiomeBaseInjector getBiomeBaseInjector() {
|
||||||
|
return (x, y, z, bb) -> INMS.get().forceBiomeInto(x, y, z, bb, storage);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Biome getBiome(int x, int z) {
|
public Biome getBiome(int x, int z) {
|
||||||
if (storage != null) {
|
if (storage != null) {
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package com.volmit.iris.util;
|
package com.volmit.iris.util;
|
||||||
|
|
||||||
|
import com.volmit.iris.nms.BiomeBaseInjector;
|
||||||
import org.bukkit.World;
|
import org.bukkit.World;
|
||||||
import org.bukkit.block.Biome;
|
import org.bukkit.block.Biome;
|
||||||
import org.bukkit.block.data.BlockData;
|
import org.bukkit.block.data.BlockData;
|
||||||
@ -27,6 +28,8 @@ public interface TerrainChunk extends BiomeGrid, ChunkData {
|
|||||||
return new LinkedTerrainChunk(grid, maxHeight);
|
return new LinkedTerrainChunk(grid, maxHeight);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BiomeBaseInjector getBiomeBaseInjector();
|
||||||
|
|
||||||
void setRaw(ChunkData data);
|
void setRaw(ChunkData data);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
x
Reference in New Issue
Block a user