implement BukkitChunkGeneratorWrapper#getFixedSpawnLocation

This commit is contained in:
dfsek 2022-05-30 13:58:09 -07:00
parent ef1f1c0af0
commit f2d9511f01
2 changed files with 35 additions and 2 deletions

View File

@ -17,7 +17,11 @@
package com.dfsek.terra.bukkit.generator; package com.dfsek.terra.bukkit.generator;
import com.dfsek.terra.bukkit.world.block.data.BukkitBlockState;
import org.bukkit.Location;
import org.bukkit.World; import org.bukkit.World;
import org.bukkit.block.data.BlockData;
import org.bukkit.generator.BiomeProvider; import org.bukkit.generator.BiomeProvider;
import org.bukkit.generator.BlockPopulator; import org.bukkit.generator.BlockPopulator;
import org.bukkit.generator.LimitedRegion; import org.bukkit.generator.LimitedRegion;
@ -36,8 +40,12 @@ import com.dfsek.terra.api.world.chunk.generation.util.GeneratorWrapper;
import com.dfsek.terra.bukkit.world.BukkitProtoWorld; import com.dfsek.terra.bukkit.world.BukkitProtoWorld;
import com.dfsek.terra.bukkit.world.BukkitWorldProperties; import com.dfsek.terra.bukkit.world.BukkitWorldProperties;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class BukkitChunkGeneratorWrapper extends org.bukkit.generator.ChunkGenerator implements GeneratorWrapper { public class BukkitChunkGeneratorWrapper extends org.bukkit.generator.ChunkGenerator implements GeneratorWrapper {
private static final Logger LOGGER = LoggerFactory.getLogger(BukkitChunkGeneratorWrapper.class);
private final BlockState air; private final BlockState air;
private ChunkGenerator delegate; private ChunkGenerator delegate;
private ConfigPack pack; private ConfigPack pack;
@ -89,6 +97,31 @@ public class BukkitChunkGeneratorWrapper extends org.bukkit.generator.ChunkGener
//return pack.vanillaFlora(); //return pack.vanillaFlora();
} }
@Override
public @Nullable Location getFixedSpawnLocation(@NotNull World world, @NotNull Random random) {
LOGGER.info("Getting spawn location...");
int x = random.nextInt(-500, 500);
int z = random.nextInt(-500, 500);
int y = world.getMaxHeight() - 1;
int max = 500;
for(int i = 0; i < max; i++) { // 50 attempts.
BukkitWorldProperties properties = new BukkitWorldProperties(world);
while(y > world.getMinHeight() && delegate.getBlock(properties, x, y, z, pack.getBiomeProvider()).isAir()) y--;
if(((BlockData) delegate.getBlock(properties, x, y, z, pack.getBiomeProvider()).getHandle()).getMaterial().isSolid()){
break;
} else {
x = random.nextInt(-500, 500);
z = random.nextInt(-500, 500);
y = world.getMaxHeight() - 1;
if(i % 25 == 0) LOGGER.info("Spawn finding attempt {}/{} failed. Retrying...", i, max);
}
}
return new Location(world, x, y, z);
}
@Override @Override
public boolean shouldGenerateMobs() { public boolean shouldGenerateMobs() {
return true; return true;

View File

@ -15,6 +15,7 @@ import net.minecraft.world.level.GeneratorAccessSeed;
import net.minecraft.world.level.LevelHeightAccessor; import net.minecraft.world.level.LevelHeightAccessor;
import net.minecraft.world.level.StructureManager; import net.minecraft.world.level.StructureManager;
import net.minecraft.world.level.biome.BiomeManager; import net.minecraft.world.level.biome.BiomeManager;
import net.minecraft.world.level.biome.Climate;
import net.minecraft.world.level.biome.Climate.Sampler; import net.minecraft.world.level.biome.Climate.Sampler;
import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.chunk.ChunkGenerator;
import net.minecraft.world.level.chunk.IChunkAccess; import net.minecraft.world.level.chunk.IChunkAccess;
@ -68,7 +69,6 @@ public class NMSChunkGeneratorDelegate extends ChunkGenerator {
} }
// @SuppressWarnings("unchecked")
@Override //buildSurface. Used to be buildBase @Override //buildSurface. Used to be buildBase
public void a(RegionLimitedWorldAccess regionlimitedworldaccess, StructureManager structuremanager, IChunkAccess ichunkaccess) { public void a(RegionLimitedWorldAccess regionlimitedworldaccess, StructureManager structuremanager, IChunkAccess ichunkaccess) {
@ -106,7 +106,7 @@ public class NMSChunkGeneratorDelegate extends ChunkGenerator {
// climateSampler // climateSampler
public Sampler d() { public Sampler d() {
return vanilla.d(); return Climate.a();
} }
//getMinY //getMinY