It compiles on 1.14, but there's a deadlock
This commit is contained in:
parent
bfe4400c77
commit
d40945c53c
@ -71,7 +71,7 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.spigotmc</groupId>
|
<groupId>org.spigotmc</groupId>
|
||||||
<artifactId>spigot</artifactId>
|
<artifactId>spigot</artifactId>
|
||||||
<version>1.13.2-R0.1-SNAPSHOT</version>
|
<version>1.14-R0.1-SNAPSHOT</version>
|
||||||
<scope>provided</scope>
|
<scope>provided</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
|
@ -3,18 +3,18 @@ package nl.rutgerkok.worldgeneratorapi.internal;
|
|||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
import org.bukkit.World;
|
import org.bukkit.World;
|
||||||
import org.bukkit.craftbukkit.v1_13_R2.CraftWorld;
|
import org.bukkit.craftbukkit.v1_14_R1.CraftWorld;
|
||||||
import org.bukkit.craftbukkit.v1_13_R2.generator.NormalChunkGenerator;
|
|
||||||
|
|
||||||
import net.minecraft.server.v1_13_R2.ChunkGenerator;
|
import net.minecraft.server.v1_14_R1.ChunkGenerator;
|
||||||
import net.minecraft.server.v1_13_R2.ChunkGeneratorAbstract;
|
import net.minecraft.server.v1_14_R1.ChunkGeneratorAbstract;
|
||||||
import net.minecraft.server.v1_13_R2.ChunkProviderDebug;
|
import net.minecraft.server.v1_14_R1.ChunkProviderDebug;
|
||||||
import net.minecraft.server.v1_13_R2.ChunkProviderFlat;
|
import net.minecraft.server.v1_14_R1.ChunkProviderFlat;
|
||||||
import net.minecraft.server.v1_13_R2.ChunkProviderGenerate;
|
import net.minecraft.server.v1_14_R1.ChunkProviderGenerate;
|
||||||
import net.minecraft.server.v1_13_R2.ChunkProviderHell;
|
import net.minecraft.server.v1_14_R1.ChunkProviderHell;
|
||||||
import net.minecraft.server.v1_13_R2.ChunkProviderTheEnd;
|
import net.minecraft.server.v1_14_R1.ChunkProviderTheEnd;
|
||||||
import net.minecraft.server.v1_13_R2.SeededRandom;
|
import net.minecraft.server.v1_14_R1.GeneratorAccess;
|
||||||
import net.minecraft.server.v1_13_R2.WorldServer;
|
import net.minecraft.server.v1_14_R1.SeededRandom;
|
||||||
|
import net.minecraft.server.v1_14_R1.WorldServer;
|
||||||
import nl.rutgerkok.worldgeneratorapi.BaseChunkGenerator;
|
import nl.rutgerkok.worldgeneratorapi.BaseChunkGenerator;
|
||||||
import nl.rutgerkok.worldgeneratorapi.internal.bukkitoverrides.ChunkDataImpl;
|
import nl.rutgerkok.worldgeneratorapi.internal.bukkitoverrides.ChunkDataImpl;
|
||||||
import nl.rutgerkok.worldgeneratorapi.internal.bukkitoverrides.InjectedChunkGenerator;
|
import nl.rutgerkok.worldgeneratorapi.internal.bukkitoverrides.InjectedChunkGenerator;
|
||||||
@ -38,20 +38,11 @@ final class BaseChunkGeneratorImpl implements BaseChunkGenerator {
|
|||||||
static BaseChunkGenerator fromMinecraft(World world) {
|
static BaseChunkGenerator fromMinecraft(World world) {
|
||||||
WorldServer worldServer = ((CraftWorld) world).getHandle();
|
WorldServer worldServer = ((CraftWorld) world).getHandle();
|
||||||
ChunkGenerator<?> chunkGenerator = worldServer.getChunkProvider().getChunkGenerator();
|
ChunkGenerator<?> chunkGenerator = worldServer.getChunkProvider().getChunkGenerator();
|
||||||
if (chunkGenerator instanceof NormalChunkGenerator<?>) {
|
|
||||||
try {
|
|
||||||
chunkGenerator = (ChunkGenerator<?>) ReflectionUtil
|
|
||||||
.getFieldOfType(chunkGenerator, ChunkGenerator.class)
|
|
||||||
.get(chunkGenerator);
|
|
||||||
} catch (IllegalAccessException e) {
|
|
||||||
throw new RuntimeException("Error getting chunkGenerator from NormalChunkGenerator", e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (chunkGenerator instanceof InjectedChunkGenerator) {
|
if (chunkGenerator instanceof InjectedChunkGenerator) {
|
||||||
return ((InjectedChunkGenerator) chunkGenerator).getBaseChunkGenerator();
|
return ((InjectedChunkGenerator) chunkGenerator).getBaseChunkGenerator();
|
||||||
}
|
}
|
||||||
if (isSupported(chunkGenerator)) {
|
if (isSupported(chunkGenerator)) {
|
||||||
return new BaseChunkGeneratorImpl(chunkGenerator);
|
return new BaseChunkGeneratorImpl(worldServer, chunkGenerator);
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new UnsupportedOperationException(
|
throw new UnsupportedOperationException(
|
||||||
@ -71,11 +62,13 @@ final class BaseChunkGeneratorImpl implements BaseChunkGenerator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private final ChunkGenerator<?> internal;
|
private final ChunkGenerator<?> internal;
|
||||||
|
private final GeneratorAccess world;
|
||||||
|
|
||||||
private BaseChunkGeneratorImpl(ChunkGenerator<?> chunkGenerator) {
|
private BaseChunkGeneratorImpl(GeneratorAccess world, ChunkGenerator<?> chunkGenerator) {
|
||||||
if (chunkGenerator instanceof InjectedChunkGenerator) {
|
if (chunkGenerator instanceof InjectedChunkGenerator) {
|
||||||
throw new IllegalArgumentException("Double-wrapping");
|
throw new IllegalArgumentException("Double-wrapping");
|
||||||
}
|
}
|
||||||
|
this.world = Objects.requireNonNull(world, "world");
|
||||||
this.internal = Objects.requireNonNull(chunkGenerator, "internal");
|
this.internal = Objects.requireNonNull(chunkGenerator, "internal");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -87,13 +80,13 @@ final class BaseChunkGeneratorImpl implements BaseChunkGenerator {
|
|||||||
|
|
||||||
// Make sure this matches isSupported above
|
// Make sure this matches isSupported above
|
||||||
if (internal instanceof ChunkProviderGenerate) {
|
if (internal instanceof ChunkProviderGenerate) {
|
||||||
((ChunkProviderGenerate) internal).a(chunk.getChunkX(), chunk.getChunkZ(), blocks.getHandle());
|
((ChunkProviderGenerate) internal).buildNoise(world, blocks.getHandle());
|
||||||
} else if (internal instanceof ChunkProviderFlat) {
|
} else if (internal instanceof ChunkProviderFlat) {
|
||||||
((ChunkProviderFlat) internal).a(chunk.getChunkX(), chunk.getChunkZ(), blocks.getHandle());
|
((ChunkProviderFlat) internal).buildNoise(world, blocks.getHandle());
|
||||||
} else if (internal instanceof ChunkProviderHell) {
|
} else if (internal instanceof ChunkProviderHell) {
|
||||||
((ChunkProviderHell) internal).a(chunk.getChunkX(), chunk.getChunkZ(), blocks.getHandle());
|
((ChunkProviderHell) internal).buildNoise(world, blocks.getHandle());
|
||||||
} else if (internal instanceof ChunkProviderTheEnd) {
|
} else if (internal instanceof ChunkProviderTheEnd) {
|
||||||
((ChunkProviderTheEnd) internal).a(chunk.getChunkX(), chunk.getChunkZ(), blocks.getHandle());
|
((ChunkProviderTheEnd) internal).buildNoise(world, blocks.getHandle());
|
||||||
} else if (internal instanceof ChunkProviderDebug) {
|
} else if (internal instanceof ChunkProviderDebug) {
|
||||||
// Generate nothing - there is no base terrain
|
// Generate nothing - there is no base terrain
|
||||||
} else {
|
} else {
|
||||||
|
@ -3,10 +3,10 @@ package nl.rutgerkok.worldgeneratorapi.internal;
|
|||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
import org.bukkit.block.Biome;
|
import org.bukkit.block.Biome;
|
||||||
import org.bukkit.craftbukkit.v1_13_R2.block.CraftBlock;
|
import org.bukkit.craftbukkit.v1_14_R1.block.CraftBlock;
|
||||||
|
|
||||||
import net.minecraft.server.v1_13_R2.BiomeBase;
|
import net.minecraft.server.v1_14_R1.BiomeBase;
|
||||||
import net.minecraft.server.v1_13_R2.WorldChunkManager;
|
import net.minecraft.server.v1_14_R1.WorldChunkManager;
|
||||||
import nl.rutgerkok.worldgeneratorapi.BiomeGenerator;
|
import nl.rutgerkok.worldgeneratorapi.BiomeGenerator;
|
||||||
|
|
||||||
public final class BiomeGeneratorImpl implements BiomeGenerator {
|
public final class BiomeGeneratorImpl implements BiomeGenerator {
|
||||||
@ -30,7 +30,8 @@ public final class BiomeGeneratorImpl implements BiomeGenerator {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Biome[] getZoomedOutBiomes(int minX, int minZ, int xSize, int zSize) {
|
public Biome[] getZoomedOutBiomes(int minX, int minZ, int xSize, int zSize) {
|
||||||
BiomeBase[] biomeArray = internal.getBiomes(minX, minZ, xSize, zSize);
|
// Last parameter doesn't seem to be used anywhere V
|
||||||
|
BiomeBase[] biomeArray = internal.a(minX, minZ, xSize, zSize, false);
|
||||||
|
|
||||||
Biome[] biomes = new Biome[xSize * zSize];
|
Biome[] biomes = new Biome[xSize * zSize];
|
||||||
for (int i = 0; i < xSize * zSize; i++) {
|
for (int i = 0; i < xSize * zSize; i++) {
|
||||||
|
@ -6,58 +6,72 @@ import org.bukkit.Material;
|
|||||||
import org.bukkit.block.Biome;
|
import org.bukkit.block.Biome;
|
||||||
import org.bukkit.block.BlockState;
|
import org.bukkit.block.BlockState;
|
||||||
import org.bukkit.block.data.BlockData;
|
import org.bukkit.block.data.BlockData;
|
||||||
import org.bukkit.craftbukkit.v1_13_R2.block.CraftBanner;
|
import org.bukkit.craftbukkit.v1_14_R1.block.CraftBanner;
|
||||||
import org.bukkit.craftbukkit.v1_13_R2.block.CraftBeacon;
|
import org.bukkit.craftbukkit.v1_14_R1.block.CraftBarrel;
|
||||||
import org.bukkit.craftbukkit.v1_13_R2.block.CraftBlock;
|
import org.bukkit.craftbukkit.v1_14_R1.block.CraftBeacon;
|
||||||
import org.bukkit.craftbukkit.v1_13_R2.block.CraftBlockEntityState;
|
import org.bukkit.craftbukkit.v1_14_R1.block.CraftBell;
|
||||||
import org.bukkit.craftbukkit.v1_13_R2.block.CraftBlockState;
|
import org.bukkit.craftbukkit.v1_14_R1.block.CraftBlastFurnace;
|
||||||
import org.bukkit.craftbukkit.v1_13_R2.block.CraftBrewingStand;
|
import org.bukkit.craftbukkit.v1_14_R1.block.CraftBlock;
|
||||||
import org.bukkit.craftbukkit.v1_13_R2.block.CraftChest;
|
import org.bukkit.craftbukkit.v1_14_R1.block.CraftBlockEntityState;
|
||||||
import org.bukkit.craftbukkit.v1_13_R2.block.CraftCommandBlock;
|
import org.bukkit.craftbukkit.v1_14_R1.block.CraftBlockState;
|
||||||
import org.bukkit.craftbukkit.v1_13_R2.block.CraftComparator;
|
import org.bukkit.craftbukkit.v1_14_R1.block.CraftBrewingStand;
|
||||||
import org.bukkit.craftbukkit.v1_13_R2.block.CraftCreatureSpawner;
|
import org.bukkit.craftbukkit.v1_14_R1.block.CraftCampfire;
|
||||||
import org.bukkit.craftbukkit.v1_13_R2.block.CraftDaylightDetector;
|
import org.bukkit.craftbukkit.v1_14_R1.block.CraftChest;
|
||||||
import org.bukkit.craftbukkit.v1_13_R2.block.CraftDispenser;
|
import org.bukkit.craftbukkit.v1_14_R1.block.CraftCommandBlock;
|
||||||
import org.bukkit.craftbukkit.v1_13_R2.block.CraftDropper;
|
import org.bukkit.craftbukkit.v1_14_R1.block.CraftComparator;
|
||||||
import org.bukkit.craftbukkit.v1_13_R2.block.CraftEnchantingTable;
|
import org.bukkit.craftbukkit.v1_14_R1.block.CraftCreatureSpawner;
|
||||||
import org.bukkit.craftbukkit.v1_13_R2.block.CraftEndGateway;
|
import org.bukkit.craftbukkit.v1_14_R1.block.CraftDaylightDetector;
|
||||||
import org.bukkit.craftbukkit.v1_13_R2.block.CraftEnderChest;
|
import org.bukkit.craftbukkit.v1_14_R1.block.CraftDispenser;
|
||||||
import org.bukkit.craftbukkit.v1_13_R2.block.CraftFurnace;
|
import org.bukkit.craftbukkit.v1_14_R1.block.CraftDropper;
|
||||||
import org.bukkit.craftbukkit.v1_13_R2.block.CraftHopper;
|
import org.bukkit.craftbukkit.v1_14_R1.block.CraftEnchantingTable;
|
||||||
import org.bukkit.craftbukkit.v1_13_R2.block.CraftJukebox;
|
import org.bukkit.craftbukkit.v1_14_R1.block.CraftEndGateway;
|
||||||
import org.bukkit.craftbukkit.v1_13_R2.block.CraftShulkerBox;
|
import org.bukkit.craftbukkit.v1_14_R1.block.CraftEnderChest;
|
||||||
import org.bukkit.craftbukkit.v1_13_R2.block.CraftSign;
|
import org.bukkit.craftbukkit.v1_14_R1.block.CraftFurnace;
|
||||||
import org.bukkit.craftbukkit.v1_13_R2.block.CraftSkull;
|
import org.bukkit.craftbukkit.v1_14_R1.block.CraftHopper;
|
||||||
import org.bukkit.craftbukkit.v1_13_R2.block.CraftStructureBlock;
|
import org.bukkit.craftbukkit.v1_14_R1.block.CraftJigsaw;
|
||||||
import org.bukkit.craftbukkit.v1_13_R2.block.data.CraftBlockData;
|
import org.bukkit.craftbukkit.v1_14_R1.block.CraftJukebox;
|
||||||
|
import org.bukkit.craftbukkit.v1_14_R1.block.CraftLectern;
|
||||||
|
import org.bukkit.craftbukkit.v1_14_R1.block.CraftShulkerBox;
|
||||||
|
import org.bukkit.craftbukkit.v1_14_R1.block.CraftSign;
|
||||||
|
import org.bukkit.craftbukkit.v1_14_R1.block.CraftSkull;
|
||||||
|
import org.bukkit.craftbukkit.v1_14_R1.block.CraftSmoker;
|
||||||
|
import org.bukkit.craftbukkit.v1_14_R1.block.CraftStructureBlock;
|
||||||
|
import org.bukkit.craftbukkit.v1_14_R1.block.data.CraftBlockData;
|
||||||
|
|
||||||
import net.minecraft.server.v1_13_R2.BlockPosition;
|
import net.minecraft.server.v1_14_R1.BlockPosition;
|
||||||
import net.minecraft.server.v1_13_R2.IBlockData;
|
import net.minecraft.server.v1_14_R1.BlockPosition.MutableBlockPosition;
|
||||||
import net.minecraft.server.v1_13_R2.IChunkAccess;
|
import net.minecraft.server.v1_14_R1.IBlockData;
|
||||||
import net.minecraft.server.v1_13_R2.NBTTagCompound;
|
import net.minecraft.server.v1_14_R1.IChunkAccess;
|
||||||
import net.minecraft.server.v1_13_R2.RegionLimitedWorldAccess;
|
import net.minecraft.server.v1_14_R1.NBTTagCompound;
|
||||||
import net.minecraft.server.v1_13_R2.TileEntity;
|
import net.minecraft.server.v1_14_R1.RegionLimitedWorldAccess;
|
||||||
import net.minecraft.server.v1_13_R2.TileEntityBanner;
|
import net.minecraft.server.v1_14_R1.TileEntity;
|
||||||
import net.minecraft.server.v1_13_R2.TileEntityBeacon;
|
import net.minecraft.server.v1_14_R1.TileEntityBanner;
|
||||||
import net.minecraft.server.v1_13_R2.TileEntityBrewingStand;
|
import net.minecraft.server.v1_14_R1.TileEntityBarrel;
|
||||||
import net.minecraft.server.v1_13_R2.TileEntityChest;
|
import net.minecraft.server.v1_14_R1.TileEntityBeacon;
|
||||||
import net.minecraft.server.v1_13_R2.TileEntityCommand;
|
import net.minecraft.server.v1_14_R1.TileEntityBell;
|
||||||
import net.minecraft.server.v1_13_R2.TileEntityComparator;
|
import net.minecraft.server.v1_14_R1.TileEntityBlastFurnace;
|
||||||
import net.minecraft.server.v1_13_R2.TileEntityDispenser;
|
import net.minecraft.server.v1_14_R1.TileEntityBrewingStand;
|
||||||
import net.minecraft.server.v1_13_R2.TileEntityDropper;
|
import net.minecraft.server.v1_14_R1.TileEntityCampfire;
|
||||||
import net.minecraft.server.v1_13_R2.TileEntityEnchantTable;
|
import net.minecraft.server.v1_14_R1.TileEntityChest;
|
||||||
import net.minecraft.server.v1_13_R2.TileEntityEndGateway;
|
import net.minecraft.server.v1_14_R1.TileEntityCommand;
|
||||||
import net.minecraft.server.v1_13_R2.TileEntityEnderChest;
|
import net.minecraft.server.v1_14_R1.TileEntityComparator;
|
||||||
import net.minecraft.server.v1_13_R2.TileEntityFurnace;
|
import net.minecraft.server.v1_14_R1.TileEntityDispenser;
|
||||||
import net.minecraft.server.v1_13_R2.TileEntityHopper;
|
import net.minecraft.server.v1_14_R1.TileEntityDropper;
|
||||||
import net.minecraft.server.v1_13_R2.TileEntityJukeBox;
|
import net.minecraft.server.v1_14_R1.TileEntityEnchantTable;
|
||||||
import net.minecraft.server.v1_13_R2.TileEntityLightDetector;
|
import net.minecraft.server.v1_14_R1.TileEntityEndGateway;
|
||||||
import net.minecraft.server.v1_13_R2.TileEntityMobSpawner;
|
import net.minecraft.server.v1_14_R1.TileEntityEnderChest;
|
||||||
import net.minecraft.server.v1_13_R2.TileEntityShulkerBox;
|
import net.minecraft.server.v1_14_R1.TileEntityFurnace;
|
||||||
import net.minecraft.server.v1_13_R2.TileEntitySign;
|
import net.minecraft.server.v1_14_R1.TileEntityHopper;
|
||||||
import net.minecraft.server.v1_13_R2.TileEntitySkull;
|
import net.minecraft.server.v1_14_R1.TileEntityJigsaw;
|
||||||
import net.minecraft.server.v1_13_R2.TileEntityStructure;
|
import net.minecraft.server.v1_14_R1.TileEntityJukeBox;
|
||||||
import net.minecraft.server.v1_13_R2.BlockPosition.MutableBlockPosition;
|
import net.minecraft.server.v1_14_R1.TileEntityLectern;
|
||||||
|
import net.minecraft.server.v1_14_R1.TileEntityLightDetector;
|
||||||
|
import net.minecraft.server.v1_14_R1.TileEntityMobSpawner;
|
||||||
|
import net.minecraft.server.v1_14_R1.TileEntityShulkerBox;
|
||||||
|
import net.minecraft.server.v1_14_R1.TileEntitySign;
|
||||||
|
import net.minecraft.server.v1_14_R1.TileEntitySkull;
|
||||||
|
import net.minecraft.server.v1_14_R1.TileEntitySmoker;
|
||||||
|
import net.minecraft.server.v1_14_R1.TileEntityStructure;
|
||||||
import nl.rutgerkok.worldgeneratorapi.decoration.DecorationArea;
|
import nl.rutgerkok.worldgeneratorapi.decoration.DecorationArea;
|
||||||
|
|
||||||
class DecorationAreaImpl implements DecorationArea {
|
class DecorationAreaImpl implements DecorationArea {
|
||||||
@ -98,17 +112,27 @@ class DecorationAreaImpl implements DecorationArea {
|
|||||||
Material material = CraftBlockData.fromData(internal.getType(position)).getMaterial();
|
Material material = CraftBlockData.fromData(internal.getType(position)).getMaterial();
|
||||||
// This code is based on the following: (this code is similar, in that it
|
// This code is based on the following: (this code is similar, in that it
|
||||||
// creates tile entities that have not been added to a world)
|
// creates tile entities that have not been added to a world)
|
||||||
// https://hub.spigotmc.org/stash/projects/SPIGOT/repos/craftbukkit/browse/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBlockState.java?at=421c1728c81e2f729dff88da2ac96535d2b8e5e8#227
|
// https://hub.spigotmc.org/stash/projects/SPIGOT/repos/craftbukkit/browse/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBlockState.java?at=a2d787f6ebeb72fa7d5750788221fb9a0d838ac4#290
|
||||||
// If new tile entities are added, don't forget to add them here
|
// If new tile entities are added, don't forget to add them here
|
||||||
switch (material) {
|
switch (material) {
|
||||||
case SIGN:
|
case ACACIA_SIGN:
|
||||||
case WALL_SIGN:
|
case ACACIA_WALL_SIGN:
|
||||||
|
case BIRCH_SIGN:
|
||||||
|
case BIRCH_WALL_SIGN:
|
||||||
|
case DARK_OAK_SIGN:
|
||||||
|
case DARK_OAK_WALL_SIGN:
|
||||||
|
case JUNGLE_SIGN:
|
||||||
|
case JUNGLE_WALL_SIGN:
|
||||||
|
case OAK_SIGN:
|
||||||
|
case OAK_WALL_SIGN:
|
||||||
|
case SPRUCE_SIGN:
|
||||||
|
case SPRUCE_WALL_SIGN:
|
||||||
return new CraftSign(material, (TileEntitySign) tileEntity);
|
return new CraftSign(material, (TileEntitySign) tileEntity);
|
||||||
case CHEST:
|
case CHEST:
|
||||||
case TRAPPED_CHEST:
|
case TRAPPED_CHEST:
|
||||||
return new CraftChest(material, (TileEntityChest) tileEntity);
|
return new CraftChest(material, (TileEntityChest) tileEntity);
|
||||||
case FURNACE:
|
case FURNACE:
|
||||||
return new CraftFurnace(material, (TileEntityFurnace) tileEntity);
|
return new CraftFurnace<>(material, (TileEntityFurnace) tileEntity);
|
||||||
case DISPENSER:
|
case DISPENSER:
|
||||||
return new CraftDispenser(material, (TileEntityDispenser) tileEntity);
|
return new CraftDispenser(material, (TileEntityDispenser) tileEntity);
|
||||||
case DROPPER:
|
case DROPPER:
|
||||||
@ -203,6 +227,21 @@ class DecorationAreaImpl implements DecorationArea {
|
|||||||
return new CraftDaylightDetector(material, (TileEntityLightDetector) tileEntity);
|
return new CraftDaylightDetector(material, (TileEntityLightDetector) tileEntity);
|
||||||
case COMPARATOR:
|
case COMPARATOR:
|
||||||
return new CraftComparator(material, (TileEntityComparator) tileEntity);
|
return new CraftComparator(material, (TileEntityComparator) tileEntity);
|
||||||
|
case BARREL:
|
||||||
|
return new CraftBarrel(material, (TileEntityBarrel) tileEntity);
|
||||||
|
case BELL:
|
||||||
|
return new CraftBell(material, (TileEntityBell) tileEntity);
|
||||||
|
case BLAST_FURNACE:
|
||||||
|
return new CraftBlastFurnace(material, (TileEntityBlastFurnace) tileEntity);
|
||||||
|
case CAMPFIRE:
|
||||||
|
return new CraftCampfire(material, (TileEntityCampfire) tileEntity);
|
||||||
|
case JIGSAW:
|
||||||
|
return new CraftJigsaw(material, (TileEntityJigsaw) tileEntity);
|
||||||
|
case LECTERN:
|
||||||
|
return new CraftLectern(material, (TileEntityLectern) tileEntity);
|
||||||
|
case SMOKER:
|
||||||
|
return new CraftSmoker(material, (TileEntitySmoker) tileEntity);
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return new CraftBlockState(material);
|
return new CraftBlockState(material);
|
||||||
}
|
}
|
||||||
@ -240,10 +279,10 @@ class DecorationAreaImpl implements DecorationArea {
|
|||||||
|
|
||||||
// Update TileEntity data
|
// Update TileEntity data
|
||||||
if (blockState instanceof CraftBlockEntityState) {
|
if (blockState instanceof CraftBlockEntityState) {
|
||||||
IChunkAccess chunk = internal.y(position);
|
IChunkAccess chunk = internal.x(position);
|
||||||
NBTTagCompound tag = ((CraftBlockEntityState<?>) blockState).getSnapshotNBT();
|
NBTTagCompound tag = ((CraftBlockEntityState<?>) blockState).getSnapshotNBT();
|
||||||
TileEntity tileEntity = TileEntity.create(tag);
|
TileEntity tileEntity = TileEntity.create(tag);
|
||||||
chunk.a(position, tileEntity);
|
chunk.setTileEntity(position, tileEntity);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -12,11 +12,11 @@ import org.bukkit.Keyed;
|
|||||||
import org.bukkit.NamespacedKey;
|
import org.bukkit.NamespacedKey;
|
||||||
import org.bukkit.World;
|
import org.bukkit.World;
|
||||||
import org.bukkit.block.Biome;
|
import org.bukkit.block.Biome;
|
||||||
import org.bukkit.craftbukkit.v1_13_R2.CraftWorld;
|
import org.bukkit.craftbukkit.v1_14_R1.CraftWorld;
|
||||||
import org.bukkit.craftbukkit.v1_13_R2.block.CraftBlock;
|
import org.bukkit.craftbukkit.v1_14_R1.block.CraftBlock;
|
||||||
|
|
||||||
import net.minecraft.server.v1_13_R2.BiomeBase;
|
import net.minecraft.server.v1_14_R1.BiomeBase;
|
||||||
import net.minecraft.server.v1_13_R2.Biomes;
|
import net.minecraft.server.v1_14_R1.Biomes;
|
||||||
import nl.rutgerkok.worldgeneratorapi.WorldGeneratorApi;
|
import nl.rutgerkok.worldgeneratorapi.WorldGeneratorApi;
|
||||||
import nl.rutgerkok.worldgeneratorapi.WorldRef;
|
import nl.rutgerkok.worldgeneratorapi.WorldRef;
|
||||||
import nl.rutgerkok.worldgeneratorapi.property.FloatProperty;
|
import nl.rutgerkok.worldgeneratorapi.property.FloatProperty;
|
||||||
@ -57,11 +57,11 @@ public final class PropertyRegistryImpl implements PropertyRegistry {
|
|||||||
public PropertyRegistryImpl() {
|
public PropertyRegistryImpl() {
|
||||||
addMinecraftBiomeFloatProperty(TEMPERATURE, BiomeBase::getTemperature);
|
addMinecraftBiomeFloatProperty(TEMPERATURE, BiomeBase::getTemperature);
|
||||||
addMinecraftBiomeFloatProperty(WETNESS, BiomeBase::getHumidity);
|
addMinecraftBiomeFloatProperty(WETNESS, BiomeBase::getHumidity);
|
||||||
addMinecraftBiomeFloatProperty(BASE_HEIGHT, BiomeBase::h);
|
addMinecraftBiomeFloatProperty(BASE_HEIGHT, BiomeBase::g);
|
||||||
addMinecraftBiomeFloatProperty(HEIGHT_VARIATION, BiomeBase::l);
|
addMinecraftBiomeFloatProperty(HEIGHT_VARIATION, BiomeBase::k);
|
||||||
addMinecraftWorldProperty(WORLD_SEED, world -> (Long) world.getSeed(), -1L);
|
addMinecraftWorldProperty(WORLD_SEED, world -> (Long) world.getSeed(), -1L);
|
||||||
addMinecraftWorldFloatProperty(SEA_LEVEL, world -> (float) world.getSeaLevel(), (world, level) -> {
|
addMinecraftWorldFloatProperty(SEA_LEVEL, world -> (float) world.getSeaLevel(), (world, level) -> {
|
||||||
((CraftWorld) world).getHandle().b(level.intValue());
|
((CraftWorld) world).getHandle().c(level.intValue());
|
||||||
if (world.getSeaLevel() != level.intValue()) {
|
if (world.getSeaLevel() != level.intValue()) {
|
||||||
throw new UnsupportedOperationException("Failed to set sea level to " + level.intValue());
|
throw new UnsupportedOperationException("Failed to set sea level to " + level.intValue());
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
package nl.rutgerkok.worldgeneratorapi.internal;
|
package nl.rutgerkok.worldgeneratorapi.internal;
|
||||||
|
|
||||||
import java.util.BitSet;
|
import java.util.BitSet;
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.EnumMap;
|
import java.util.EnumMap;
|
||||||
import java.util.EnumSet;
|
import java.util.EnumSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -12,15 +11,15 @@ import java.util.Set;
|
|||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
import java.util.concurrent.CopyOnWriteArrayList;
|
import java.util.concurrent.CopyOnWriteArrayList;
|
||||||
|
|
||||||
import net.minecraft.server.v1_13_R2.BiomeBase;
|
import net.minecraft.server.v1_14_R1.BiomeBase;
|
||||||
import net.minecraft.server.v1_13_R2.BlockFalling;
|
import net.minecraft.server.v1_14_R1.BlockPosition;
|
||||||
import net.minecraft.server.v1_13_R2.BlockPosition;
|
import net.minecraft.server.v1_14_R1.ChunkCoordIntPair;
|
||||||
import net.minecraft.server.v1_13_R2.ChunkGenerator;
|
import net.minecraft.server.v1_14_R1.ChunkGenerator;
|
||||||
import net.minecraft.server.v1_13_R2.RegionLimitedWorldAccess;
|
import net.minecraft.server.v1_14_R1.IChunkAccess;
|
||||||
import net.minecraft.server.v1_13_R2.SeededRandom;
|
import net.minecraft.server.v1_14_R1.RegionLimitedWorldAccess;
|
||||||
import net.minecraft.server.v1_13_R2.WorldGenCarverWrapper;
|
import net.minecraft.server.v1_14_R1.SeededRandom;
|
||||||
import net.minecraft.server.v1_13_R2.WorldGenFeatureConfiguration;
|
import net.minecraft.server.v1_14_R1.WorldGenCarverWrapper;
|
||||||
import net.minecraft.server.v1_13_R2.WorldGenStage;
|
import net.minecraft.server.v1_14_R1.WorldGenStage;
|
||||||
import nl.rutgerkok.worldgeneratorapi.BaseChunkGenerator;
|
import nl.rutgerkok.worldgeneratorapi.BaseChunkGenerator;
|
||||||
import nl.rutgerkok.worldgeneratorapi.BaseChunkGenerator.GeneratingChunk;
|
import nl.rutgerkok.worldgeneratorapi.BaseChunkGenerator.GeneratingChunk;
|
||||||
import nl.rutgerkok.worldgeneratorapi.decoration.BaseDecorationType;
|
import nl.rutgerkok.worldgeneratorapi.decoration.BaseDecorationType;
|
||||||
@ -52,19 +51,23 @@ public final class WorldDecoratorImpl implements WorldDecorator {
|
|||||||
private final Map<BaseDecorationType, List<BaseChunkGenerator>> customBaseDecorations = new ConcurrentHashMap<>();
|
private final Map<BaseDecorationType, List<BaseChunkGenerator>> customBaseDecorations = new ConcurrentHashMap<>();
|
||||||
private final Set<BaseDecorationType> disabledBaseDecorations = EnumSet.noneOf(BaseDecorationType.class);
|
private final Set<BaseDecorationType> disabledBaseDecorations = EnumSet.noneOf(BaseDecorationType.class);
|
||||||
|
|
||||||
|
private BiomeBase getCarvingBiome(IChunkAccess ichunkaccess) {
|
||||||
|
return ichunkaccess.getBiome(BlockPosition.ZERO);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<BaseChunkGenerator> getCustomBaseDecorations(BaseDecorationType type) {
|
public List<BaseChunkGenerator> getCustomBaseDecorations(BaseDecorationType type) {
|
||||||
Objects.requireNonNull(type, "type");
|
Objects.requireNonNull(type, "type");
|
||||||
return customBaseDecorations.computeIfAbsent(type, t -> new CopyOnWriteArrayList<>());
|
return customBaseDecorations.computeIfAbsent(type, t -> new CopyOnWriteArrayList<>());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<Decoration> getCustomDecorations(DecorationType type) {
|
public List<Decoration> getCustomDecorations(DecorationType type) {
|
||||||
Objects.requireNonNull(type, "type");
|
Objects.requireNonNull(type, "type");
|
||||||
return customDecorations.computeIfAbsent(type, t -> new CopyOnWriteArrayList<>());
|
return customDecorations.computeIfAbsent(type, t -> new CopyOnWriteArrayList<>());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public boolean isDefaultEnabled(BaseDecorationType type) {
|
public boolean isDefaultEnabled(BaseDecorationType type) {
|
||||||
return !this.disabledBaseDecorations.contains(type);
|
return !this.disabledBaseDecorations.contains(type);
|
||||||
}
|
}
|
||||||
@ -89,29 +92,27 @@ public final class WorldDecoratorImpl implements WorldDecorator {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("deprecation")
|
public void spawnCarvers(IChunkAccess ichunkaccess, WorldGenStage.Features stage, int seaLevel, long seed) {
|
||||||
public void spawnCarvers(RegionLimitedWorldAccess world, WorldGenStage.Features stage, SeededRandom seededrandom) {
|
SeededRandom seededrandom = new SeededRandom(seed);
|
||||||
DecorationType decorationType = CARVER_TRANSLATION.get(stage);
|
DecorationType decorationType = CARVER_TRANSLATION.get(stage);
|
||||||
if (!this.disabledDecorations.contains(decorationType)) {
|
if (!this.disabledDecorations.contains(decorationType)) {
|
||||||
// Spawn default carvers (code based on ChunkGeneratorAbstract.addFeatures)
|
// Spawn default carvers (code based on ChunkGenerator.doCarving)
|
||||||
int chunkX = world.a();
|
ChunkCoordIntPair chunkcoordintpair = ichunkaccess.getPos();
|
||||||
int chunkZ = world.b();
|
int i = chunkcoordintpair.x;
|
||||||
BitSet bitset = world.getChunkAt(chunkX, chunkZ).a(stage);
|
int j = chunkcoordintpair.z;
|
||||||
for (int lookingChunkX = chunkX - 8; lookingChunkX <= chunkX + 8; ++lookingChunkX) {
|
BitSet bitset = ichunkaccess.a(stage);
|
||||||
for (int lookingChunkZ = chunkZ - 8; lookingChunkZ <= chunkZ + 8; ++lookingChunkZ) {
|
|
||||||
BiomeBase biome = world.getChunkProvider().getChunkGenerator()
|
for (int k = i - 8; k <= i + 8; ++k) {
|
||||||
.getWorldChunkManager()
|
for (int l = j - 8; l <= j + 8; ++l) {
|
||||||
.getBiome(new BlockPosition(lookingChunkX * 16, 0, lookingChunkZ * 16), null);
|
List<WorldGenCarverWrapper<?>> list = this.getCarvingBiome(ichunkaccess).a(stage);
|
||||||
List<WorldGenCarverWrapper<?>> list = biome == null ? Collections.emptyList() : biome.a(stage);
|
|
||||||
ListIterator<WorldGenCarverWrapper<?>> listiterator = list.listIterator();
|
ListIterator<WorldGenCarverWrapper<?>> listiterator = list.listIterator();
|
||||||
|
|
||||||
while (listiterator.hasNext()) {
|
while (listiterator.hasNext()) {
|
||||||
int i2 = listiterator.nextIndex();
|
int i1 = listiterator.nextIndex();
|
||||||
WorldGenCarverWrapper<?> worldgencarverwrapper = listiterator.next();
|
WorldGenCarverWrapper<?> worldgencarverwrapper = listiterator.next();
|
||||||
seededrandom.c(world.getMinecraftWorld().getSeed() + i2, lookingChunkX, lookingChunkZ);
|
seededrandom.c(seed + i1, k, l);
|
||||||
if (worldgencarverwrapper.a(world, seededrandom, lookingChunkX, lookingChunkZ,
|
if (worldgencarverwrapper.a(seededrandom, k, l)) {
|
||||||
WorldGenFeatureConfiguration.e)) {
|
worldgencarverwrapper.a(ichunkaccess, seededrandom, seaLevel, k, l, i, j, bitset);
|
||||||
worldgencarverwrapper.a(world, seededrandom, lookingChunkX, lookingChunkZ, chunkX, chunkZ,
|
|
||||||
bitset, WorldGenFeatureConfiguration.e);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -119,14 +120,7 @@ public final class WorldDecoratorImpl implements WorldDecorator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Spawn custom carvers
|
// Spawn custom carvers
|
||||||
List<Decoration> decorations = this.customDecorations.get(decorationType);
|
// TODO re-enable now that it operates
|
||||||
if (decorations == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
DecorationArea decorationArea = new DecorationAreaImpl(world);
|
|
||||||
for (Decoration decoration : decorations) {
|
|
||||||
decoration.decorate(decorationArea, seededrandom);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void spawnCustomBaseDecorations(BaseDecorationType type, GeneratingChunk chunk) {
|
public void spawnCustomBaseDecorations(BaseDecorationType type, GeneratingChunk chunk) {
|
||||||
@ -142,7 +136,6 @@ public final class WorldDecoratorImpl implements WorldDecorator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void spawnDecorations(ChunkGenerator<?> chunkGenerator, RegionLimitedWorldAccess populationArea) {
|
public void spawnDecorations(ChunkGenerator<?> chunkGenerator, RegionLimitedWorldAccess populationArea) {
|
||||||
BlockFalling.instaFall = true;
|
|
||||||
int i = populationArea.a();
|
int i = populationArea.a();
|
||||||
int j = populationArea.b();
|
int j = populationArea.b();
|
||||||
int k = i * 16;
|
int k = i * 16;
|
||||||
@ -175,7 +168,6 @@ public final class WorldDecoratorImpl implements WorldDecorator {
|
|||||||
decorationIndex++;
|
decorationIndex++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
BlockFalling.instaFall = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -6,13 +6,12 @@ import java.util.Objects;
|
|||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
import org.bukkit.World;
|
import org.bukkit.World;
|
||||||
import org.bukkit.craftbukkit.v1_13_R2.CraftWorld;
|
import org.bukkit.craftbukkit.v1_14_R1.CraftWorld;
|
||||||
|
|
||||||
import net.minecraft.server.v1_13_R2.ChunkGenerator;
|
import net.minecraft.server.v1_14_R1.ChunkGenerator;
|
||||||
import net.minecraft.server.v1_13_R2.ChunkProviderServer;
|
import net.minecraft.server.v1_14_R1.ChunkProviderServer;
|
||||||
import net.minecraft.server.v1_13_R2.ChunkTaskScheduler;
|
import net.minecraft.server.v1_14_R1.WorldChunkManager;
|
||||||
import net.minecraft.server.v1_13_R2.WorldChunkManager;
|
import net.minecraft.server.v1_14_R1.WorldServer;
|
||||||
import net.minecraft.server.v1_13_R2.WorldServer;
|
|
||||||
import nl.rutgerkok.worldgeneratorapi.BaseChunkGenerator;
|
import nl.rutgerkok.worldgeneratorapi.BaseChunkGenerator;
|
||||||
import nl.rutgerkok.worldgeneratorapi.BiomeGenerator;
|
import nl.rutgerkok.worldgeneratorapi.BiomeGenerator;
|
||||||
import nl.rutgerkok.worldgeneratorapi.WorldGenerator;
|
import nl.rutgerkok.worldgeneratorapi.WorldGenerator;
|
||||||
@ -75,6 +74,13 @@ final class WorldGeneratorImpl implements WorldGenerator {
|
|||||||
return worldRef;
|
return worldRef;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Class<?> nmsClass(String simpleName) throws ClassNotFoundException {
|
||||||
|
// Returns a class in the net.mineraft.server package
|
||||||
|
Class<?> exampleNmsClass = ChunkGenerator.class;
|
||||||
|
String name = exampleNmsClass.getName().replace(exampleNmsClass.getSimpleName(), simpleName);
|
||||||
|
return Class.forName(name);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Injects {@link InjectedChunkGenerator} into the world, so that we can
|
* Injects {@link InjectedChunkGenerator} into the world, so that we can
|
||||||
* customize how blocks are generated.
|
* customize how blocks are generated.
|
||||||
@ -91,10 +97,15 @@ final class WorldGeneratorImpl implements WorldGenerator {
|
|||||||
Field chunkGeneratorField = ReflectionUtil.getFieldOfType(chunkProvider, ChunkGenerator.class);
|
Field chunkGeneratorField = ReflectionUtil.getFieldOfType(chunkProvider, ChunkGenerator.class);
|
||||||
chunkGeneratorField.set(chunkProvider, injected);
|
chunkGeneratorField.set(chunkProvider, injected);
|
||||||
|
|
||||||
Field chunkTaskSchedulerField = ReflectionUtil.getFieldOfType(chunkProvider, ChunkTaskScheduler.class);
|
try {
|
||||||
ChunkTaskScheduler scheduler = (ChunkTaskScheduler) chunkTaskSchedulerField.get(chunkProvider);
|
Field chunkTaskSchedulerField = ReflectionUtil.getFieldOfType(chunkProvider,
|
||||||
chunkGeneratorField = ReflectionUtil.getFieldOfType(scheduler, ChunkGenerator.class);
|
nmsClass("ChunkTaskScheduler"));
|
||||||
chunkGeneratorField.set(scheduler, injected);
|
Object scheduler = chunkTaskSchedulerField.get(chunkProvider);
|
||||||
|
chunkGeneratorField = ReflectionUtil.getFieldOfType(scheduler, ChunkGenerator.class);
|
||||||
|
chunkGeneratorField.set(scheduler, injected);
|
||||||
|
} catch (ClassNotFoundException e) {
|
||||||
|
// Ignore, we're not on Paper but on Spigot
|
||||||
|
}
|
||||||
|
|
||||||
this.injected = injected;
|
this.injected = injected;
|
||||||
} catch (ReflectiveOperationException e) {
|
} catch (ReflectiveOperationException e) {
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
package nl.rutgerkok.worldgeneratorapi.internal.bukkitoverrides;
|
package nl.rutgerkok.worldgeneratorapi.internal.bukkitoverrides;
|
||||||
|
|
||||||
import org.bukkit.block.Biome;
|
import org.bukkit.block.Biome;
|
||||||
import org.bukkit.craftbukkit.v1_13_R2.block.CraftBlock;
|
import org.bukkit.craftbukkit.v1_14_R1.block.CraftBlock;
|
||||||
import org.bukkit.generator.ChunkGenerator.BiomeGrid;
|
import org.bukkit.generator.ChunkGenerator.BiomeGrid;
|
||||||
|
|
||||||
import net.minecraft.server.v1_13_R2.BiomeBase;
|
import net.minecraft.server.v1_14_R1.BiomeBase;
|
||||||
|
|
||||||
public final class BiomeGridImpl implements BiomeGrid {
|
public final class BiomeGridImpl implements BiomeGrid {
|
||||||
private final BiomeBase[] biomeArray;
|
private final BiomeBase[] biomeArray;
|
||||||
|
@ -2,22 +2,29 @@ package nl.rutgerkok.worldgeneratorapi.internal.bukkitoverrides;
|
|||||||
|
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.block.data.BlockData;
|
import org.bukkit.block.data.BlockData;
|
||||||
import org.bukkit.craftbukkit.v1_13_R2.block.data.CraftBlockData;
|
import org.bukkit.craftbukkit.v1_14_R1.block.data.CraftBlockData;
|
||||||
import org.bukkit.generator.ChunkGenerator.ChunkData;
|
import org.bukkit.generator.ChunkGenerator.ChunkData;
|
||||||
|
|
||||||
import net.minecraft.server.v1_13_R2.BlockPosition.MutableBlockPosition;
|
import net.minecraft.server.v1_14_R1.BlockPosition.MutableBlockPosition;
|
||||||
import net.minecraft.server.v1_13_R2.IBlockData;
|
import net.minecraft.server.v1_14_R1.HeightMap;
|
||||||
import net.minecraft.server.v1_13_R2.IChunkAccess;
|
import net.minecraft.server.v1_14_R1.IBlockData;
|
||||||
|
import net.minecraft.server.v1_14_R1.IChunkAccess;
|
||||||
|
import net.minecraft.server.v1_14_R1.ProtoChunk;
|
||||||
|
|
||||||
public final class ChunkDataImpl implements ChunkData {
|
public final class ChunkDataImpl implements ChunkData {
|
||||||
private final IChunkAccess internal;
|
private final ProtoChunk internal;
|
||||||
|
private final HeightMap heightmap;
|
||||||
|
private final HeightMap heightmap1;
|
||||||
|
|
||||||
private final int xOffset;
|
private final int xOffset;
|
||||||
private final int zOffset;
|
private final int zOffset;
|
||||||
private final MutableBlockPosition reusableBlockPos = new MutableBlockPosition();
|
private final MutableBlockPosition reusableBlockPos = new MutableBlockPosition();
|
||||||
|
|
||||||
ChunkDataImpl(IChunkAccess internal) {
|
ChunkDataImpl(ProtoChunk internal) {
|
||||||
this.internal = internal;
|
this.internal = internal;
|
||||||
|
this.heightmap = internal.b(HeightMap.Type.OCEAN_FLOOR_WG);
|
||||||
|
this.heightmap1 = internal.b(HeightMap.Type.WORLD_SURFACE_WG);
|
||||||
|
|
||||||
this.xOffset = internal.getPos().x * 16;
|
this.xOffset = internal.getPos().x * 16;
|
||||||
this.zOffset = internal.getPos().z * 16;
|
this.zOffset = internal.getPos().z * 16;
|
||||||
}
|
}
|
||||||
@ -60,6 +67,8 @@ public final class ChunkDataImpl implements ChunkData {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void setBlock(int x, int y, int z, IBlockData blockData) {
|
private void setBlock(int x, int y, int z, IBlockData blockData) {
|
||||||
|
heightmap.a(x, y, z, blockData);
|
||||||
|
heightmap1.a(x, y, z, blockData);
|
||||||
reusableBlockPos.c(xOffset + x, y, zOffset + z);
|
reusableBlockPos.c(xOffset + x, y, zOffset + z);
|
||||||
internal.setType(reusableBlockPos, blockData, false);
|
internal.setType(reusableBlockPos, blockData, false);
|
||||||
}
|
}
|
||||||
|
@ -6,26 +6,27 @@ import java.util.Objects;
|
|||||||
import org.bukkit.generator.ChunkGenerator.BiomeGrid;
|
import org.bukkit.generator.ChunkGenerator.BiomeGrid;
|
||||||
import org.bukkit.generator.ChunkGenerator.ChunkData;
|
import org.bukkit.generator.ChunkGenerator.ChunkData;
|
||||||
|
|
||||||
import net.minecraft.server.v1_13_R2.BiomeBase;
|
import net.minecraft.server.v1_14_R1.BiomeBase;
|
||||||
import net.minecraft.server.v1_13_R2.BiomeBase.BiomeMeta;
|
import net.minecraft.server.v1_14_R1.BiomeBase.BiomeMeta;
|
||||||
import net.minecraft.server.v1_13_R2.BlockPosition;
|
import net.minecraft.server.v1_14_R1.BlockPosition;
|
||||||
import net.minecraft.server.v1_13_R2.ChunkCoordIntPair;
|
import net.minecraft.server.v1_14_R1.ChunkCoordIntPair;
|
||||||
import net.minecraft.server.v1_13_R2.ChunkGeneratorAbstract;
|
import net.minecraft.server.v1_14_R1.ChunkGeneratorAbstract;
|
||||||
import net.minecraft.server.v1_13_R2.ChunkStatus;
|
import net.minecraft.server.v1_14_R1.EnumCreatureType;
|
||||||
import net.minecraft.server.v1_13_R2.EnumCreatureType;
|
import net.minecraft.server.v1_14_R1.GeneratorAccess;
|
||||||
import net.minecraft.server.v1_13_R2.GeneratorSettingsDefault;
|
import net.minecraft.server.v1_14_R1.GeneratorSettingsDefault;
|
||||||
import net.minecraft.server.v1_13_R2.HeightMap;
|
import net.minecraft.server.v1_14_R1.HeightMap.Type;
|
||||||
import net.minecraft.server.v1_13_R2.IChunkAccess;
|
import net.minecraft.server.v1_14_R1.IChunkAccess;
|
||||||
import net.minecraft.server.v1_13_R2.MobSpawnerPhantom;
|
import net.minecraft.server.v1_14_R1.MobSpawnerCat;
|
||||||
import net.minecraft.server.v1_13_R2.NoiseGenerator3;
|
import net.minecraft.server.v1_14_R1.MobSpawnerPatrol;
|
||||||
import net.minecraft.server.v1_13_R2.RegionLimitedWorldAccess;
|
import net.minecraft.server.v1_14_R1.MobSpawnerPhantom;
|
||||||
import net.minecraft.server.v1_13_R2.SeededRandom;
|
import net.minecraft.server.v1_14_R1.NoiseGenerator3;
|
||||||
import net.minecraft.server.v1_13_R2.SpawnerCreature;
|
import net.minecraft.server.v1_14_R1.ProtoChunk;
|
||||||
import net.minecraft.server.v1_13_R2.World;
|
import net.minecraft.server.v1_14_R1.RegionLimitedWorldAccess;
|
||||||
import net.minecraft.server.v1_13_R2.WorldGenFeatureSwampHut;
|
import net.minecraft.server.v1_14_R1.SeededRandom;
|
||||||
import net.minecraft.server.v1_13_R2.WorldGenStage;
|
import net.minecraft.server.v1_14_R1.SpawnerCreature;
|
||||||
import net.minecraft.server.v1_13_R2.WorldGenerator;
|
import net.minecraft.server.v1_14_R1.WorldGenStage;
|
||||||
import net.minecraft.server.v1_13_R2.WorldServer;
|
import net.minecraft.server.v1_14_R1.WorldGenerator;
|
||||||
|
import net.minecraft.server.v1_14_R1.WorldServer;
|
||||||
import nl.rutgerkok.worldgeneratorapi.BaseChunkGenerator;
|
import nl.rutgerkok.worldgeneratorapi.BaseChunkGenerator;
|
||||||
import nl.rutgerkok.worldgeneratorapi.BaseChunkGenerator.GeneratingChunk;
|
import nl.rutgerkok.worldgeneratorapi.BaseChunkGenerator.GeneratingChunk;
|
||||||
import nl.rutgerkok.worldgeneratorapi.BiomeGenerator;
|
import nl.rutgerkok.worldgeneratorapi.BiomeGenerator;
|
||||||
@ -43,7 +44,7 @@ public final class InjectedChunkGenerator extends ChunkGeneratorAbstract<Generat
|
|||||||
private final BiomeGenerator biomeGenerator;
|
private final BiomeGenerator biomeGenerator;
|
||||||
private final BiomeGridImpl biomeGrid;
|
private final BiomeGridImpl biomeGrid;
|
||||||
|
|
||||||
GeneratingChunkImpl(IChunkAccess internal, BiomeGenerator biomeGenerator) {
|
GeneratingChunkImpl(ProtoChunk internal, BiomeGenerator biomeGenerator) {
|
||||||
this.chunkX = internal.getPos().x;
|
this.chunkX = internal.getPos().x;
|
||||||
this.chunkZ = internal.getPos().z;
|
this.chunkZ = internal.getPos().z;
|
||||||
this.blocks = new ChunkDataImpl(internal);
|
this.blocks = new ChunkDataImpl(internal);
|
||||||
@ -81,22 +82,24 @@ public final class InjectedChunkGenerator extends ChunkGeneratorAbstract<Generat
|
|||||||
|
|
||||||
private final org.bukkit.World world;
|
private final org.bukkit.World world;
|
||||||
/**
|
/**
|
||||||
* Could someone ask Mojang why world generation controls Phantom spawning?
|
* Could someone ask Mojang why world generation controls these mobs?
|
||||||
*/
|
*/
|
||||||
private final MobSpawnerPhantom phantomSpawner = new MobSpawnerPhantom();
|
private final MobSpawnerPhantom phantomSpawner = new MobSpawnerPhantom();
|
||||||
private final GeneratorSettingsDefault defaultSettings = new GeneratorSettingsDefault();
|
private final MobSpawnerPatrol patrolSpawner = new MobSpawnerPatrol();
|
||||||
private final NoiseGenerator3 surfaceNoise;
|
private final MobSpawnerCat catSpawner = new MobSpawnerCat();
|
||||||
|
|
||||||
|
private final NoiseGenerator3 surfaceNoise;
|
||||||
public final WorldDecoratorImpl worldDecorator = new WorldDecoratorImpl();
|
public final WorldDecoratorImpl worldDecorator = new WorldDecoratorImpl();
|
||||||
private BaseChunkGenerator baseChunkGenerator;
|
private BaseChunkGenerator baseChunkGenerator;
|
||||||
|
|
||||||
private final BiomeGenerator biomeGenerator;
|
private final BiomeGenerator biomeGenerator;
|
||||||
|
|
||||||
public InjectedChunkGenerator(WorldServer world, BaseChunkGenerator baseChunkGenerator) {
|
public InjectedChunkGenerator(WorldServer world, BaseChunkGenerator baseChunkGenerator) {
|
||||||
super(world, world.getChunkProvider().getChunkGenerator().getWorldChunkManager());
|
super(world, world.getChunkProvider().getChunkGenerator().getWorldChunkManager(),
|
||||||
|
4, 8, 256, world.getChunkProvider().getChunkGenerator().getSettings(), true);
|
||||||
this.world = world.getWorld();
|
this.world = world.getWorld();
|
||||||
|
|
||||||
SeededRandom seededrandom = new SeededRandom(this.b);
|
SeededRandom seededrandom = new SeededRandom(this.seed);
|
||||||
surfaceNoise = new NoiseGenerator3(seededrandom, 4);
|
surfaceNoise = new NoiseGenerator3(seededrandom, 4);
|
||||||
|
|
||||||
this.biomeGenerator = new BiomeGeneratorImpl(world.getChunkProvider()
|
this.biomeGenerator = new BiomeGeneratorImpl(world.getChunkProvider()
|
||||||
@ -105,15 +108,30 @@ public final class InjectedChunkGenerator extends ChunkGeneratorAbstract<Generat
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double[] a(int i, int j) {
|
protected double a(double d0, double d1, int i) {
|
||||||
return this.surfaceNoise.a(i << 4, j << 4, 16, 16, 0.0625, 0.0625, 1.0);
|
// No idea what this is calculating - we only know that it has got something to
|
||||||
|
// do with terrain shape
|
||||||
|
double d3 = (i - (8.5D + d0 * 8.5D / 8.0D * 4.0D)) * 12.0D * 128.0D / 256.0D / d1;
|
||||||
|
if (d3 < 0.0D) {
|
||||||
|
d3 *= 4.0D;
|
||||||
|
}
|
||||||
|
|
||||||
|
return d3;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void a(double[] adouble, int i, int j) {
|
||||||
|
// No idea what this is calculating - but it has got something to do with
|
||||||
|
// terrain shape
|
||||||
|
this.a(adouble, i, j, 684.4119873046875D, 684.4119873046875D, 8.555149841308594D, 4.277574920654297D, 3, -10);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int a(World world, boolean flag, boolean flag1) {
|
protected double[] a(int i, int j) {
|
||||||
final byte b0 = 0;
|
// No idea what this is calculating - but it has got something to do with
|
||||||
final int i = b0 + this.phantomSpawner.a(world, flag, flag1);
|
// terrain shape
|
||||||
return i;
|
throw new UnsupportedOperationException("Not supported, sorry!");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -121,11 +139,6 @@ public final class InjectedChunkGenerator extends ChunkGeneratorAbstract<Generat
|
|||||||
this.worldDecorator.spawnDecorations(this, populationArea);
|
this.worldDecorator.spawnDecorations(this, populationArea);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void addFeatures(RegionLimitedWorldAccess world, WorldGenStage.Features stage) {
|
|
||||||
this.worldDecorator.spawnCarvers(world, stage, new SeededRandom(this.b));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void addMobs(RegionLimitedWorldAccess regionlimitedworldaccess) {
|
public void addMobs(RegionLimitedWorldAccess regionlimitedworldaccess) {
|
||||||
final int i = regionlimitedworldaccess.a();
|
final int i = regionlimitedworldaccess.a();
|
||||||
@ -137,29 +150,30 @@ public final class InjectedChunkGenerator extends ChunkGeneratorAbstract<Generat
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void createChunk(IChunkAccess ichunkaccess) {
|
public void buildBase(IChunkAccess ichunkaccess) {
|
||||||
ChunkCoordIntPair chunkcoordintpair = ichunkaccess.getPos();
|
ChunkCoordIntPair chunkcoordintpair = ichunkaccess.getPos();
|
||||||
int i = chunkcoordintpair.x;
|
int k = chunkcoordintpair.x;
|
||||||
int j = chunkcoordintpair.z;
|
int l = chunkcoordintpair.z;
|
||||||
SeededRandom seededrandom = new SeededRandom();
|
SeededRandom seededrandom = new SeededRandom();
|
||||||
seededrandom.a(i, j);
|
seededrandom.a(k, l);
|
||||||
|
|
||||||
// Generate zoomed-in biomes
|
|
||||||
ichunkaccess.a(this.c.getBiomeBlock(i * 16, j * 16, 16, 16));
|
|
||||||
|
|
||||||
// Generate blocks
|
|
||||||
GeneratingChunkImpl chunk = new GeneratingChunkImpl(ichunkaccess, biomeGenerator);
|
|
||||||
baseChunkGenerator.setBlocksInChunk(chunk);
|
|
||||||
|
|
||||||
// Generate early decorations
|
// Generate early decorations
|
||||||
|
GeneratingChunkImpl chunk = new GeneratingChunkImpl((ProtoChunk) ichunkaccess, biomeGenerator);
|
||||||
this.worldDecorator.spawnCustomBaseDecorations(BaseDecorationType.RAW_GENERATION, chunk);
|
this.worldDecorator.spawnCustomBaseDecorations(BaseDecorationType.RAW_GENERATION, chunk);
|
||||||
|
|
||||||
// Heightmap calculations
|
|
||||||
ichunkaccess.a(HeightMap.Type.WORLD_SURFACE_WG, HeightMap.Type.OCEAN_FLOOR_WG);
|
|
||||||
|
|
||||||
// Generate surface
|
// Generate surface
|
||||||
if (this.worldDecorator.isDefaultEnabled(BaseDecorationType.SURFACE)) {
|
if (this.worldDecorator.isDefaultEnabled(BaseDecorationType.SURFACE)) {
|
||||||
this.a(ichunkaccess, ichunkaccess.getBiomeIndex(), seededrandom, world.getSeaLevel());
|
BiomeBase[] abiomebase = ichunkaccess.getBiomeIndex();
|
||||||
|
for (int i1 = 0; i1 < 16; ++i1) {
|
||||||
|
for (int j1 = 0; j1 < 16; ++j1) {
|
||||||
|
int k1 = k + i1;
|
||||||
|
int l1 = l + j1;
|
||||||
|
int i2 = ichunkaccess.a(Type.WORLD_SURFACE_WG, i1, j1) + 1;
|
||||||
|
double d1 = this.surfaceNoise.a(k1 * 0.0625D, l1 * 0.0625D, 0.0625D, i1 * 0.0625D);
|
||||||
|
abiomebase[j1 * 16 + i1].a(seededrandom, ichunkaccess, k1, l1, i2, d1, this.getSettings().r(),
|
||||||
|
this.getSettings().s(), this.getSeaLevel(), this.a.getSeed());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
this.worldDecorator.spawnCustomBaseDecorations(BaseDecorationType.SURFACE, chunk);
|
this.worldDecorator.spawnCustomBaseDecorations(BaseDecorationType.SURFACE, chunk);
|
||||||
|
|
||||||
@ -168,9 +182,25 @@ public final class InjectedChunkGenerator extends ChunkGeneratorAbstract<Generat
|
|||||||
this.a(ichunkaccess, seededrandom);
|
this.a(ichunkaccess, seededrandom);
|
||||||
}
|
}
|
||||||
this.worldDecorator.spawnCustomBaseDecorations(BaseDecorationType.BEDROCK, chunk);
|
this.worldDecorator.spawnCustomBaseDecorations(BaseDecorationType.BEDROCK, chunk);
|
||||||
|
}
|
||||||
|
|
||||||
ichunkaccess.a(HeightMap.Type.WORLD_SURFACE_WG, HeightMap.Type.OCEAN_FLOOR_WG);
|
@Override
|
||||||
ichunkaccess.a(ChunkStatus.BASE);
|
public void buildNoise(GeneratorAccess generatoraccess, IChunkAccess ichunkaccess) {
|
||||||
|
// Generate blocks
|
||||||
|
GeneratingChunkImpl chunk = new GeneratingChunkImpl((ProtoChunk) ichunkaccess, biomeGenerator);
|
||||||
|
baseChunkGenerator.setBlocksInChunk(chunk);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void doCarving(IChunkAccess world, WorldGenStage.Features stage) {
|
||||||
|
this.worldDecorator.spawnCarvers(world, stage, this.getSeaLevel(), this.seed);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void doMobSpawning(WorldServer worldserver, boolean flag, boolean flag1) {
|
||||||
|
this.phantomSpawner.a(worldserver, flag, flag1);
|
||||||
|
this.patrolSpawner.a(worldserver, flag, flag1);
|
||||||
|
this.catSpawner.a(worldserver, flag, flag1);
|
||||||
}
|
}
|
||||||
|
|
||||||
public BaseChunkGenerator getBaseChunkGenerator() {
|
public BaseChunkGenerator getBaseChunkGenerator() {
|
||||||
@ -183,19 +213,30 @@ public final class InjectedChunkGenerator extends ChunkGeneratorAbstract<Generat
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<BiomeMeta> getMobsFor(EnumCreatureType enumcreaturetype, BlockPosition blockposition) {
|
public List<BiomeMeta> getMobsFor(EnumCreatureType enumcreaturetype, BlockPosition blockposition) {
|
||||||
final BiomeBase biomebase = this.a.getBiome(blockposition);
|
if (WorldGenerator.SWAMP_HUT.c(this.a, blockposition)) {
|
||||||
return (enumcreaturetype == EnumCreatureType.MONSTER
|
if (enumcreaturetype == EnumCreatureType.MONSTER) {
|
||||||
&& ((WorldGenFeatureSwampHut) WorldGenerator.l).d(this.a, blockposition))
|
return WorldGenerator.SWAMP_HUT.e();
|
||||||
? WorldGenerator.l.d()
|
}
|
||||||
: ((enumcreaturetype == EnumCreatureType.MONSTER && WorldGenerator.n.b(this.a, blockposition))
|
|
||||||
? WorldGenerator.n.d()
|
|
||||||
: biomebase.getMobs(enumcreaturetype));
|
|
||||||
|
|
||||||
|
if (enumcreaturetype == EnumCreatureType.CREATURE) {
|
||||||
|
return WorldGenerator.SWAMP_HUT.f();
|
||||||
|
}
|
||||||
|
} else if (enumcreaturetype == EnumCreatureType.MONSTER) {
|
||||||
|
if (WorldGenerator.PILLAGER_OUTPOST.a(this.a, blockposition)) {
|
||||||
|
return WorldGenerator.PILLAGER_OUTPOST.e();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (WorldGenerator.OCEAN_MONUMENT.a(this.a, blockposition)) {
|
||||||
|
return WorldGenerator.OCEAN_MONUMENT.e();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return super.getMobsFor(enumcreaturetype, blockposition);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public GeneratorSettingsDefault getSettings() {
|
public int getSeaLevel() {
|
||||||
return defaultSettings;
|
return world.getSeaLevel();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -203,8 +244,6 @@ public final class InjectedChunkGenerator extends ChunkGeneratorAbstract<Generat
|
|||||||
return world.getSeaLevel() + 1;
|
return world.getSeaLevel() + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public void setBaseChunkGenerator(BaseChunkGenerator baseChunkGenerator) {
|
public void setBaseChunkGenerator(BaseChunkGenerator baseChunkGenerator) {
|
||||||
this.baseChunkGenerator = Objects.requireNonNull(baseChunkGenerator, "baseChunkGenerator");
|
this.baseChunkGenerator = Objects.requireNonNull(baseChunkGenerator, "baseChunkGenerator");
|
||||||
}
|
}
|
||||||
|
@ -8,7 +8,7 @@ import org.bukkit.World;
|
|||||||
import org.bukkit.plugin.Plugin;
|
import org.bukkit.plugin.Plugin;
|
||||||
import org.mockito.Mockito;
|
import org.mockito.Mockito;
|
||||||
|
|
||||||
import net.minecraft.server.v1_13_R2.DispenserRegistry;
|
import net.minecraft.server.v1_14_R1.DispenserRegistry;
|
||||||
|
|
||||||
public class TestFactory {
|
public class TestFactory {
|
||||||
|
|
||||||
@ -22,7 +22,7 @@ public class TestFactory {
|
|||||||
if (Bukkit.getServer() != null) {
|
if (Bukkit.getServer() != null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
DispenserRegistry.c();
|
DispenserRegistry.init();
|
||||||
Server server = Mockito.mock(Server.class);
|
Server server = Mockito.mock(Server.class);
|
||||||
Mockito.when(server.getLogger()).thenReturn(Logger.getLogger(TestFactory.class.getName()));
|
Mockito.when(server.getLogger()).thenReturn(Logger.getLogger(TestFactory.class.getName()));
|
||||||
Mockito.when(server.getWorld(Mockito.eq("test"))).thenAnswer(args -> world(args.getArgument(0)));
|
Mockito.when(server.getWorld(Mockito.eq("test"))).thenAnswer(args -> world(args.getArgument(0)));
|
||||||
|
@ -69,7 +69,7 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.spigotmc</groupId>
|
<groupId>org.spigotmc</groupId>
|
||||||
<artifactId>spigot-api</artifactId>
|
<artifactId>spigot-api</artifactId>
|
||||||
<version>1.13.1-R0.1-SNAPSHOT</version>
|
<version>1.14-R0.1-SNAPSHOT</version>
|
||||||
<scope>provided</scope>
|
<scope>provided</scope>
|
||||||
<exclusions>
|
<exclusions>
|
||||||
<exclusion> <!-- Let's not put the outdated JUnit 4 on our build path -->
|
<exclusion> <!-- Let's not put the outdated JUnit 4 on our build path -->
|
||||||
|
Loading…
x
Reference in New Issue
Block a user