mirror of
https://github.com/VolmitSoftware/Iris.git
synced 2026-04-21 07:30:30 +00:00
Move
This commit is contained in:
@@ -0,0 +1,66 @@
|
||||
package com.volmit.iris.gen.bindings;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Random;
|
||||
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.generator.BlockPopulator;
|
||||
import org.bukkit.generator.ChunkGenerator;
|
||||
|
||||
public abstract class BukkitTerrainProvider extends ChunkGenerator implements TerrainProvider
|
||||
{
|
||||
private final TerrainTarget target;
|
||||
|
||||
public BukkitTerrainProvider(TerrainTarget target)
|
||||
{
|
||||
this.target = target;
|
||||
}
|
||||
|
||||
@Override
|
||||
public abstract void generate(Random random, int x, int z, TerrainChunk chunk);
|
||||
|
||||
@Override
|
||||
public ChunkData generateChunkData(World world, Random random, int x, int z, BiomeGrid biome)
|
||||
{
|
||||
TerrainChunk terrain = TerrainChunk.create(world);
|
||||
generate(random, x, z, terrain);
|
||||
return terrain;
|
||||
}
|
||||
|
||||
@Override
|
||||
public abstract boolean canSpawn(World world, int x, int z);
|
||||
|
||||
@Override
|
||||
public boolean canSpawnDefault(World world, int x, int z)
|
||||
{
|
||||
return super.canSpawn(world, x, z);
|
||||
}
|
||||
|
||||
@Override
|
||||
public abstract List<BlockPopulator> getDefaultPopulators(World world);
|
||||
|
||||
@Override
|
||||
public abstract Location getFixedSpawnLocation(World world, Random random);
|
||||
|
||||
@Override
|
||||
public abstract boolean isParallelCapable();
|
||||
|
||||
@Override
|
||||
public abstract boolean shouldGenerateCaves();
|
||||
|
||||
@Override
|
||||
public abstract boolean shouldGenerateDecorations();
|
||||
|
||||
@Override
|
||||
public abstract boolean shouldGenerateMobs();
|
||||
|
||||
@Override
|
||||
public abstract boolean shouldGenerateStructures();
|
||||
|
||||
@Override
|
||||
public TerrainTarget getTarget()
|
||||
{
|
||||
return target;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,77 @@
|
||||
package com.volmit.iris.gen.bindings;
|
||||
|
||||
import org.bukkit.block.Biome;
|
||||
import org.bukkit.generator.ChunkGenerator.BiomeGrid;
|
||||
|
||||
import com.volmit.iris.util.IrisMathHelper;
|
||||
|
||||
public class IrisBiomeStorage
|
||||
{
|
||||
private static final int e;
|
||||
private static final int f;
|
||||
public static final int a;
|
||||
public static final int b;
|
||||
public static final int c;
|
||||
private final Biome[] g;
|
||||
|
||||
static
|
||||
{
|
||||
e = (int) Math.round(Math.log(16.0) / Math.log(2.0)) - 2;
|
||||
f = (int) Math.round(Math.log(256.0) / Math.log(2.0)) - 2;
|
||||
a = 1 << IrisBiomeStorage.e + IrisBiomeStorage.e + IrisBiomeStorage.f;
|
||||
b = (1 << IrisBiomeStorage.e) - 1;
|
||||
c = (1 << IrisBiomeStorage.f) - 1;
|
||||
}
|
||||
|
||||
public IrisBiomeStorage(final Biome[] aBiome)
|
||||
{
|
||||
this.g = aBiome;
|
||||
}
|
||||
|
||||
public IrisBiomeStorage()
|
||||
{
|
||||
this(new Biome[IrisBiomeStorage.a]);
|
||||
}
|
||||
|
||||
public IrisBiomeStorage b()
|
||||
{
|
||||
return new IrisBiomeStorage(this.g.clone());
|
||||
}
|
||||
|
||||
public void inject(BiomeGrid grid)
|
||||
{
|
||||
for(int i = 0; i < 256; i++)
|
||||
{
|
||||
for(int j = 0; j < 16; j++)
|
||||
{
|
||||
for(int k = 0; k < 16; k++)
|
||||
{
|
||||
Biome b = getBiome(j, i, k);
|
||||
|
||||
if(b == null || b.equals(Biome.THE_VOID))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
grid.setBiome(j, i, k, b);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public Biome getBiome(final int x, final int y, final int z)
|
||||
{
|
||||
final int l = x & IrisBiomeStorage.b;
|
||||
final int i2 = IrisMathHelper.clamp(y, 0, IrisBiomeStorage.c);
|
||||
final int j2 = z & IrisBiomeStorage.b;
|
||||
return this.g[i2 << IrisBiomeStorage.e + IrisBiomeStorage.e | j2 << IrisBiomeStorage.e | l];
|
||||
}
|
||||
|
||||
public void setBiome(final int x, final int y, final int z, final Biome biome)
|
||||
{
|
||||
final int l = x & IrisBiomeStorage.b;
|
||||
final int i2 = IrisMathHelper.clamp(y, 0, IrisBiomeStorage.c);
|
||||
final int j2 = z & IrisBiomeStorage.b;
|
||||
this.g[i2 << IrisBiomeStorage.e + IrisBiomeStorage.e | j2 << IrisBiomeStorage.e | l] = biome;
|
||||
}
|
||||
}
|
||||
180
src/main/java/com/volmit/iris/gen/scaffold/IrisTerrainChunk.java
Normal file
180
src/main/java/com/volmit/iris/gen/scaffold/IrisTerrainChunk.java
Normal file
@@ -0,0 +1,180 @@
|
||||
package com.volmit.iris.gen.bindings;
|
||||
|
||||
import java.lang.reflect.Constructor;
|
||||
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.Biome;
|
||||
import org.bukkit.block.data.BlockData;
|
||||
import org.bukkit.generator.ChunkGenerator.ChunkData;
|
||||
import org.bukkit.material.MaterialData;
|
||||
|
||||
import com.volmit.iris.Iris;
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
public class IrisTerrainChunk implements TerrainChunk
|
||||
{
|
||||
private final Biome[] biome2D;
|
||||
private final IrisBiomeStorage biome3D;
|
||||
private final ChunkData rawChunkData;
|
||||
private final Constructor<?> construct = buildConstruct();
|
||||
|
||||
public IrisTerrainChunk(int maxHeight)
|
||||
{
|
||||
rawChunkData = createChunkData(maxHeight);
|
||||
biome2D = Iris.biome3d ? null : new Biome[256];
|
||||
biome3D = Iris.biome3d ? new IrisBiomeStorage() : null;
|
||||
}
|
||||
|
||||
private Constructor<?> buildConstruct()
|
||||
{
|
||||
try
|
||||
{
|
||||
Class<?> chunkDatazz = Class.forName("org.bukkit.craftbukkit." + Iris.nmsTag() + ".generator.CraftChunkData");
|
||||
Constructor<?> construct = chunkDatazz.getConstructor(int.class);
|
||||
construct.setAccessible(true);
|
||||
return construct;
|
||||
}
|
||||
|
||||
catch(Throwable e)
|
||||
{
|
||||
Iris.error("Failed create construct for ChunkData(int)");
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private ChunkData createChunkData(int maxHeight)
|
||||
{
|
||||
try
|
||||
{
|
||||
return (ChunkData) construct.newInstance(maxHeight);
|
||||
}
|
||||
|
||||
catch(Throwable e)
|
||||
{
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Biome getBiome(int x, int z)
|
||||
{
|
||||
if(biome2D != null)
|
||||
{
|
||||
return biome2D[(z << 4) | x];
|
||||
}
|
||||
|
||||
return biome3D.getBiome(x, 0, z);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Biome getBiome(int x, int y, int z)
|
||||
{
|
||||
if(biome2D != null)
|
||||
{
|
||||
return biome2D[(z << 4) | x];
|
||||
}
|
||||
|
||||
return biome3D.getBiome(x, y, z);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setBiome(int x, int z, Biome bio)
|
||||
{
|
||||
if(biome2D != null)
|
||||
{
|
||||
biome2D[(z << 4) | x] = bio;
|
||||
return;
|
||||
}
|
||||
|
||||
biome3D.setBiome(x, 0, z, bio);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setBiome(int x, int y, int z, Biome bio)
|
||||
{
|
||||
if(biome2D != null)
|
||||
{
|
||||
biome2D[(z << 4) | x] = bio;
|
||||
return;
|
||||
}
|
||||
|
||||
biome3D.setBiome(x, y, z, bio);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getMaxHeight()
|
||||
{
|
||||
return rawChunkData.getMaxHeight();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setBlock(int x, int y, int z, BlockData blockData)
|
||||
{
|
||||
rawChunkData.setBlock(x, y, z, blockData);
|
||||
}
|
||||
|
||||
@Override
|
||||
public BlockData getBlockData(int x, int y, int z)
|
||||
{
|
||||
return rawChunkData.getBlockData(x, y, z);
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
@Override
|
||||
public void setBlock(int x, int y, int z, Material material)
|
||||
{
|
||||
rawChunkData.setBlock(x, y, z, material);
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
@Override
|
||||
public void setBlock(int x, int y, int z, MaterialData material)
|
||||
{
|
||||
rawChunkData.setBlock(x, y, z, material);
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
@Override
|
||||
public void setRegion(int xMin, int yMin, int zMin, int xMax, int yMax, int zMax, Material material)
|
||||
{
|
||||
rawChunkData.setRegion(xMin, yMin, zMin, xMax, yMax, zMax, material);
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
@Override
|
||||
public void setRegion(int xMin, int yMin, int zMin, int xMax, int yMax, int zMax, MaterialData material)
|
||||
{
|
||||
rawChunkData.setRegion(xMin, yMin, zMin, xMax, yMax, zMax, material);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setRegion(int xMin, int yMin, int zMin, int xMax, int yMax, int zMax, BlockData blockData)
|
||||
{
|
||||
rawChunkData.setRegion(xMin, yMin, zMin, xMax, yMax, zMax, blockData);
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
@Override
|
||||
public Material getType(int x, int y, int z)
|
||||
{
|
||||
return rawChunkData.getType(x, y, z);
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
@Override
|
||||
public MaterialData getTypeAndData(int x, int y, int z)
|
||||
{
|
||||
return rawChunkData.getTypeAndData(x, y, z);
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
@Override
|
||||
public byte getData(int x, int y, int z)
|
||||
{
|
||||
return rawChunkData.getData(x, y, z);
|
||||
}
|
||||
}
|
||||
117
src/main/java/com/volmit/iris/gen/scaffold/TerrainChunk.java
Normal file
117
src/main/java/com/volmit/iris/gen/scaffold/TerrainChunk.java
Normal file
@@ -0,0 +1,117 @@
|
||||
package com.volmit.iris.gen.bindings;
|
||||
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.block.Biome;
|
||||
import org.bukkit.block.data.BlockData;
|
||||
import org.bukkit.generator.ChunkGenerator.BiomeGrid;
|
||||
import org.bukkit.generator.ChunkGenerator.ChunkData;
|
||||
|
||||
public interface TerrainChunk extends BiomeGrid, ChunkData
|
||||
{
|
||||
public static TerrainChunk create(World world)
|
||||
{
|
||||
return create(world.getMaxHeight());
|
||||
}
|
||||
|
||||
public static TerrainChunk create(int maxHeight)
|
||||
{
|
||||
return new IrisTerrainChunk(maxHeight);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get biome at x, z within chunk being generated
|
||||
*
|
||||
* @param x
|
||||
* - 0-15
|
||||
* @param z
|
||||
* - 0-15
|
||||
* @return Biome value
|
||||
* @deprecated biomes are now 3-dimensional
|
||||
*/
|
||||
@Deprecated
|
||||
Biome getBiome(int x, int z);
|
||||
|
||||
/**
|
||||
* Get biome at x, z within chunk being generated
|
||||
*
|
||||
* @param x
|
||||
* - 0-15
|
||||
* @param y
|
||||
* - 0-255
|
||||
* @param z
|
||||
* - 0-15
|
||||
* @return Biome value
|
||||
*/
|
||||
Biome getBiome(int x, int y, int z);
|
||||
|
||||
/**
|
||||
* Set biome at x, z within chunk being generated
|
||||
*
|
||||
* @param x
|
||||
* - 0-15
|
||||
* @param z
|
||||
* - 0-15
|
||||
* @param bio
|
||||
* - Biome value
|
||||
* @deprecated biomes are now 3-dimensional
|
||||
*/
|
||||
@Deprecated
|
||||
void setBiome(int x, int z, Biome bio);
|
||||
|
||||
/**
|
||||
* Set biome at x, z within chunk being generated
|
||||
*
|
||||
* @param x
|
||||
* - 0-15
|
||||
* @param y
|
||||
* - 0-255
|
||||
* @param z
|
||||
* - 0-15
|
||||
* @param bio
|
||||
* - Biome value
|
||||
*/
|
||||
void setBiome(int x, int y, int z, Biome bio);
|
||||
|
||||
/**
|
||||
* Get the maximum height for the chunk.
|
||||
*
|
||||
* Setting blocks at or above this height will do nothing.
|
||||
*
|
||||
* @return the maximum height
|
||||
*/
|
||||
public int getMaxHeight();
|
||||
|
||||
/**
|
||||
* Set the block at x,y,z in the chunk data to material.
|
||||
*
|
||||
* Setting blocks outside the chunk's bounds does nothing.
|
||||
*
|
||||
* @param x
|
||||
* the x location in the chunk from 0-15 inclusive
|
||||
* @param y
|
||||
* the y location in the chunk from 0 (inclusive) - maxHeight
|
||||
* (exclusive)
|
||||
* @param z
|
||||
* the z location in the chunk from 0-15 inclusive
|
||||
* @param blockData
|
||||
* the type to set the block to
|
||||
*/
|
||||
public void setBlock(int x, int y, int z, BlockData blockData);
|
||||
|
||||
/**
|
||||
* Get the type and data of the block at x, y, z.
|
||||
*
|
||||
* Getting blocks outside the chunk's bounds returns air.
|
||||
*
|
||||
* @param x
|
||||
* the x location in the chunk from 0-15 inclusive
|
||||
* @param y
|
||||
* the y location in the chunk from 0 (inclusive) - maxHeight
|
||||
* (exclusive)
|
||||
* @param z
|
||||
* the z location in the chunk from 0-15 inclusive
|
||||
* @return the data of the block or the BlockData for air if x, y or z are
|
||||
* outside the chunk's bounds
|
||||
*/
|
||||
public BlockData getBlockData(int x, int y, int z);
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
package com.volmit.iris.gen.bindings;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Random;
|
||||
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.generator.BlockPopulator;
|
||||
|
||||
public interface TerrainProvider
|
||||
{
|
||||
public TerrainTarget getTarget();
|
||||
|
||||
public void generate(Random random, int x, int z, TerrainChunk chunk);
|
||||
|
||||
public boolean canSpawn(World world, int x, int z);
|
||||
|
||||
public boolean canSpawnDefault(World world, int x, int z);
|
||||
|
||||
public List<BlockPopulator> getDefaultPopulators(World world);
|
||||
|
||||
public Location getFixedSpawnLocation(World world, Random random);
|
||||
|
||||
public boolean isParallelCapable();
|
||||
|
||||
public boolean shouldGenerateCaves();
|
||||
|
||||
public boolean shouldGenerateDecorations();
|
||||
|
||||
public boolean shouldGenerateMobs();
|
||||
|
||||
public boolean shouldGenerateStructures();
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
package com.volmit.iris.gen.bindings;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.World.Environment;
|
||||
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
@Builder
|
||||
public class TerrainTarget
|
||||
{
|
||||
private long seed;
|
||||
private Environment environment;
|
||||
private String name;
|
||||
private File folder;
|
||||
|
||||
public static TerrainTarget from(World world)
|
||||
{
|
||||
//@builder
|
||||
return new TerrainTargetBuilder()
|
||||
.environment(world.getEnvironment())
|
||||
.seed(world.getSeed())
|
||||
.folder(world.getWorldFolder())
|
||||
.name(world.getName())
|
||||
.build();
|
||||
//@done
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user