It compiles on 1.14, but there's a deadlock

This commit is contained in:
Rutger Kok 2019-04-28 08:01:50 +02:00
parent bfe4400c77
commit d40945c53c
12 changed files with 305 additions and 221 deletions

View File

@ -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>

View File

@ -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 {

View File

@ -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++) {

View File

@ -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);
} }
} }

View File

@ -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());
} }

View File

@ -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;
} }
} }

View File

@ -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) {

View File

@ -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;

View File

@ -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);
} }

View File

@ -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");
} }

View File

@ -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)));

View File

@ -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 -->