mirror of
https://github.com/PolyhedralDev/Terra.git
synced 2025-07-18 10:32:30 +00:00
Add block shifting to caves
This commit is contained in:
parent
9fb70ccbb3
commit
f53e9d5112
@ -16,6 +16,7 @@ import org.polydev.gaea.math.FastNoise;
|
|||||||
import org.polydev.gaea.math.InterpolationType;
|
import org.polydev.gaea.math.InterpolationType;
|
||||||
import org.polydev.gaea.population.PopulationManager;
|
import org.polydev.gaea.population.PopulationManager;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
@ -55,7 +56,7 @@ public class TerraChunkGenerator extends GaeaChunkGenerator {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<GenerationPopulator> getGenerationPopulators(World world) {
|
public List<GenerationPopulator> getGenerationPopulators(World world) {
|
||||||
return Collections.singletonList(new CavePopulator());
|
return Collections.emptyList();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -65,7 +66,7 @@ public class TerraChunkGenerator extends GaeaChunkGenerator {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public @NotNull List<BlockPopulator> getDefaultPopulators(@NotNull World world) {
|
public @NotNull List<BlockPopulator> getDefaultPopulators(@NotNull World world) {
|
||||||
return Collections.singletonList(popMan);
|
return Arrays.asList(new CavePopulator(), popMan);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -15,9 +15,10 @@ public class TerraProfiler extends WorldProfiler {
|
|||||||
this.addMeasurement(new Measurement(2500000, DataType.PERIOD_MILLISECONDS), "TotalChunkGenTime")
|
this.addMeasurement(new Measurement(2500000, DataType.PERIOD_MILLISECONDS), "TotalChunkGenTime")
|
||||||
.addMeasurement(new Measurement(2500000, DataType.PERIOD_MILLISECONDS), "ChunkBaseGenTime")
|
.addMeasurement(new Measurement(2500000, DataType.PERIOD_MILLISECONDS), "ChunkBaseGenTime")
|
||||||
.addMeasurement(new Measurement(2000000, DataType.PERIOD_MILLISECONDS), "BiomeSetTime")
|
.addMeasurement(new Measurement(2000000, DataType.PERIOD_MILLISECONDS), "BiomeSetTime")
|
||||||
.addMeasurement(new Measurement(25000000, DataType.PERIOD_MILLISECONDS), "TreeGenTime")
|
.addMeasurement(new Measurement(25000000, DataType.PERIOD_NANOSECONDS), "TreeGenTime")
|
||||||
.addMeasurement(new Measurement(1500000, DataType.PERIOD_MILLISECONDS), "FaunaTime")
|
.addMeasurement(new Measurement(1500000, DataType.PERIOD_MILLISECONDS), "FaunaTime")
|
||||||
.addMeasurement(new Measurement(1500000, DataType.PERIOD_MILLISECONDS), "CaveTime");
|
.addMeasurement(new Measurement(1500000, DataType.PERIOD_MILLISECONDS), "CaveTime")
|
||||||
|
.addMeasurement(new Measurement(1500000, DataType.PERIOD_MILLISECONDS), "CaveBlockUpdate");
|
||||||
profilerMap.put(w, this);
|
profilerMap.put(w, this);
|
||||||
}
|
}
|
||||||
public static TerraProfiler fromWorld(World w) {
|
public static TerraProfiler fromWorld(World w) {
|
||||||
|
@ -59,7 +59,7 @@ public class UserDefinedCarver extends Carver {
|
|||||||
public void step() {
|
public void step() {
|
||||||
setRadius(new int[] {(int) (runningRadius*radiusMultiplier[0]), (int) (runningRadius*radiusMultiplier[1]), (int) (runningRadius*radiusMultiplier[2])});
|
setRadius(new int[] {(int) (runningRadius*radiusMultiplier[0]), (int) (runningRadius*radiusMultiplier[1]), (int) (runningRadius*radiusMultiplier[2])});
|
||||||
runningRadius += (getRandom().nextDouble()-0.5)*mutate[3];
|
runningRadius += (getRandom().nextDouble()-0.5)*mutate[3];
|
||||||
runningRadius = Math.min(runningRadius, maxRad);
|
runningRadius = Math.max(Math.min(runningRadius, maxRad), 1);
|
||||||
direction.rotateAroundX(Math.toRadians(getRandom().nextDouble()*mutate[0]));
|
direction.rotateAroundX(Math.toRadians(getRandom().nextDouble()*mutate[0]));
|
||||||
direction.rotateAroundY(Math.toRadians(getRandom().nextDouble()*mutate[1]));
|
direction.rotateAroundY(Math.toRadians(getRandom().nextDouble()*mutate[1]));
|
||||||
direction.rotateAroundZ(Math.toRadians(getRandom().nextDouble()*mutate[2]));
|
direction.rotateAroundZ(Math.toRadians(getRandom().nextDouble()*mutate[2]));
|
||||||
|
@ -214,7 +214,7 @@ public class BiomeConfig extends YamlConfiguration {
|
|||||||
} catch(IOException e) {
|
} catch(IOException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
} catch(InvalidConfigurationException | IllegalArgumentException e) {
|
} catch(InvalidConfigurationException | IllegalArgumentException e) {
|
||||||
logger.severe("Configuration error for Biome. ");
|
logger.severe("Configuration error for Biome. File: " + path.toString());
|
||||||
logger.severe(e.getMessage());
|
logger.severe(e.getMessage());
|
||||||
logger.severe("Correct this before proceeding!");
|
logger.severe("Correct this before proceeding!");
|
||||||
}
|
}
|
||||||
|
@ -91,7 +91,7 @@ public class BiomeGridConfig extends YamlConfiguration {
|
|||||||
} catch(IOException e) {
|
} catch(IOException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
} catch(InvalidConfigurationException | IllegalArgumentException e) {
|
} catch(InvalidConfigurationException | IllegalArgumentException e) {
|
||||||
Bukkit.getLogger().severe("[Terra] Configuration error for BiomeGrid. ");
|
Bukkit.getLogger().severe("[Terra] Configuration error for BiomeGrid. File: " + path.toString());
|
||||||
Bukkit.getLogger().severe("[Terra] " + e.getMessage());
|
Bukkit.getLogger().severe("[Terra] " + e.getMessage());
|
||||||
Bukkit.getLogger().severe("[Terra] Correct this before proceeding!");
|
Bukkit.getLogger().severe("[Terra] Correct this before proceeding!");
|
||||||
}
|
}
|
||||||
|
@ -8,6 +8,7 @@ import org.bukkit.block.data.BlockData;
|
|||||||
import org.bukkit.configuration.InvalidConfigurationException;
|
import org.bukkit.configuration.InvalidConfigurationException;
|
||||||
import org.bukkit.configuration.file.YamlConfiguration;
|
import org.bukkit.configuration.file.YamlConfiguration;
|
||||||
import org.bukkit.plugin.java.JavaPlugin;
|
import org.bukkit.plugin.java.JavaPlugin;
|
||||||
|
import org.bukkit.scheduler.BukkitTask;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.polydev.gaea.commons.io.FilenameUtils;
|
import org.polydev.gaea.commons.io.FilenameUtils;
|
||||||
import org.polydev.gaea.math.ProbabilityCollection;
|
import org.polydev.gaea.math.ProbabilityCollection;
|
||||||
@ -20,10 +21,12 @@ import java.nio.file.Path;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
import java.util.TreeMap;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
@ -33,6 +36,9 @@ public class CarverConfig extends YamlConfiguration {
|
|||||||
private String id;
|
private String id;
|
||||||
private final Set<Material> replaceableInner = new HashSet<>();
|
private final Set<Material> replaceableInner = new HashSet<>();
|
||||||
private final Set<Material> replaceableOuter = new HashSet<>();
|
private final Set<Material> replaceableOuter = new HashSet<>();
|
||||||
|
private final Map<Material, Set<Material>> shift = new HashMap<>();
|
||||||
|
private Map<Integer, ProbabilityCollection<BlockData>> inner;
|
||||||
|
private Map<Integer, ProbabilityCollection<BlockData>> outer;
|
||||||
private boolean replaceIsBlacklistInner;
|
private boolean replaceIsBlacklistInner;
|
||||||
private boolean replaceIsBlacklistOuter;
|
private boolean replaceIsBlacklistOuter;
|
||||||
public CarverConfig(File file) throws IOException, InvalidConfigurationException {
|
public CarverConfig(File file) throws IOException, InvalidConfigurationException {
|
||||||
@ -53,20 +59,29 @@ public class CarverConfig extends YamlConfiguration {
|
|||||||
public void load(@NotNull File file) throws IOException, InvalidConfigurationException {
|
public void load(@NotNull File file) throws IOException, InvalidConfigurationException {
|
||||||
super.load(file);
|
super.load(file);
|
||||||
|
|
||||||
if(contains("palette.inner.replace")) {
|
inner = getBlocks("palette.inner.blocks");
|
||||||
for(String s : getStringList("palette.inner.replace")) {
|
|
||||||
replaceableInner.add(Bukkit.createBlockData(s).getMaterial());
|
outer = getBlocks("palette.outer.blocks");
|
||||||
}
|
|
||||||
|
for(String s : getStringList("palette.inner.replace")) {
|
||||||
|
replaceableInner.add(Bukkit.createBlockData(s).getMaterial());
|
||||||
}
|
}
|
||||||
if(contains("palette.outer.replace")) {
|
for(String s : getStringList("palette.outer.replace")) {
|
||||||
for(String s : getStringList("palette.outer.replace")) {
|
replaceableOuter.add(Bukkit.createBlockData(s).getMaterial());
|
||||||
replaceableOuter.add(Bukkit.createBlockData(s).getMaterial());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
for(Map.Entry<String, Object> e : getConfigurationSection("shift").getValues(false).entrySet()) {
|
||||||
|
Set<Material> l = new HashSet<>();
|
||||||
|
for(String s : (List<String>) e.getValue()) {
|
||||||
|
l.add(Bukkit.createBlockData(s).getMaterial());
|
||||||
|
Bukkit.getLogger().info("Added " + s + " to shift-able blocks");
|
||||||
|
}
|
||||||
|
shift.put(Bukkit.createBlockData(e.getKey()).getMaterial(), l);
|
||||||
|
Bukkit.getLogger().info("Added " + e.getKey() + " as master block");
|
||||||
|
}
|
||||||
|
|
||||||
replaceIsBlacklistInner = getBoolean("palette.inner.replace-blacklist", false);
|
replaceIsBlacklistInner = getBoolean("palette.inner.replace-blacklist", false);
|
||||||
replaceIsBlacklistOuter = getBoolean("palette.outer.replace-blacklist", false);
|
replaceIsBlacklistOuter = getBoolean("palette.outer.replace-blacklist", false);
|
||||||
|
|
||||||
|
|
||||||
double[] start = new double[] {getDouble("start.x"), getDouble("start.y"), getDouble("start.z")};
|
double[] start = new double[] {getDouble("start.x"), getDouble("start.y"), getDouble("start.z")};
|
||||||
double[] mutate = new double[] {getDouble("mutate.x"), getDouble("mutate.y"), getDouble("mutate.z"), getDouble("mutate.radius")};
|
double[] mutate = new double[] {getDouble("mutate.x"), getDouble("mutate.y"), getDouble("mutate.z"), getDouble("mutate.radius")};
|
||||||
double[] radiusMultiplier = new double[] {getDouble("start.radius.multiply.x"), getDouble("start.radius.multiply.y"), getDouble("start.radius.multiply.z")};
|
double[] radiusMultiplier = new double[] {getDouble("start.radius.multiply.x"), getDouble("start.radius.multiply.y"), getDouble("start.radius.multiply.z")};
|
||||||
@ -77,6 +92,29 @@ public class CarverConfig extends YamlConfiguration {
|
|||||||
carver = new UserDefinedCarver(height, radius, length, start, mutate, radiusMultiplier);
|
carver = new UserDefinedCarver(height, radius, length, start, mutate, radiusMultiplier);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Map<Integer, ProbabilityCollection<BlockData>> getBlocks(String key) throws InvalidConfigurationException {
|
||||||
|
if(!contains(key)) throw new InvalidConfigurationException("Missing Carver Palette!");
|
||||||
|
Map<Integer, ProbabilityCollection<BlockData>> result = new TreeMap<>();
|
||||||
|
for(Map<?, ?> m : getMapList(key)) {
|
||||||
|
try {
|
||||||
|
ProbabilityCollection<BlockData> layer = new ProbabilityCollection<>();
|
||||||
|
for(Map.Entry<String, Integer> type : ((Map<String, Integer>) m.get("materials")).entrySet()) {
|
||||||
|
layer.add(Bukkit.createBlockData(type.getKey()), type.getValue());
|
||||||
|
Bukkit.getLogger().info("Added " + type.getKey() + " with probability " + type.getValue());
|
||||||
|
}
|
||||||
|
result.put((Integer) m.get("y"), layer);
|
||||||
|
Bukkit.getLogger().info("Added at level " + m.get("y"));
|
||||||
|
} catch(ClassCastException e) {
|
||||||
|
throw new InvalidConfigurationException("SEVERE configuration error for Carver Palette: \n\n" + e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Map<Material, Set<Material>> getShiftedBlocks() {
|
||||||
|
return shift;
|
||||||
|
}
|
||||||
|
|
||||||
public boolean isReplaceableInner(Material m) {
|
public boolean isReplaceableInner(Material m) {
|
||||||
if(replaceIsBlacklistInner) {
|
if(replaceIsBlacklistInner) {
|
||||||
return !replaceableInner.contains(m);
|
return !replaceableInner.contains(m);
|
||||||
@ -91,6 +129,20 @@ public class CarverConfig extends YamlConfiguration {
|
|||||||
return replaceableOuter.contains(m);
|
return replaceableOuter.contains(m);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ProbabilityCollection<BlockData> getPaletteInner(int y) {
|
||||||
|
for(Map.Entry<Integer, ProbabilityCollection<BlockData>> e : inner.entrySet()) {
|
||||||
|
if(e.getKey() >= y ) return e.getValue();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ProbabilityCollection<BlockData> getPaletteOuter(int y) {
|
||||||
|
for(Map.Entry<Integer, ProbabilityCollection<BlockData>> e : outer.entrySet()) {
|
||||||
|
if(e.getKey() >= y ) return e.getValue();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
protected static void loadCaves(JavaPlugin main) {
|
protected static void loadCaves(JavaPlugin main) {
|
||||||
// TODO: Merge all load methods
|
// TODO: Merge all load methods
|
||||||
Logger logger = main.getLogger();
|
Logger logger = main.getLogger();
|
||||||
@ -108,7 +160,7 @@ public class CarverConfig extends YamlConfiguration {
|
|||||||
} catch(IOException e) {
|
} catch(IOException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
} catch(InvalidConfigurationException | IllegalArgumentException e) {
|
} catch(InvalidConfigurationException | IllegalArgumentException e) {
|
||||||
logger.severe("Configuration error for Carver. ");
|
logger.severe("Configuration error for Carver. File: " + path.toString());
|
||||||
logger.severe(e.getMessage());
|
logger.severe(e.getMessage());
|
||||||
logger.severe("Correct this before proceeding!");
|
logger.severe("Correct this before proceeding!");
|
||||||
}
|
}
|
||||||
|
@ -105,7 +105,7 @@ public class FaunaConfig extends YamlConfiguration implements Fauna {
|
|||||||
} catch(IOException e) {
|
} catch(IOException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
} catch(InvalidConfigurationException | IllegalArgumentException e) {
|
} catch(InvalidConfigurationException | IllegalArgumentException e) {
|
||||||
logger.severe("Configuration error for Fauna. ");
|
logger.severe("Configuration error for Fauna. File: " + path.toString());
|
||||||
logger.severe(e.getMessage());
|
logger.severe(e.getMessage());
|
||||||
logger.severe("Correct this before proceeding!");
|
logger.severe("Correct this before proceeding!");
|
||||||
}
|
}
|
||||||
|
@ -112,7 +112,7 @@ public class OreConfig extends YamlConfiguration {
|
|||||||
} catch(IOException e) {
|
} catch(IOException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
} catch(InvalidConfigurationException | IllegalArgumentException e) {
|
} catch(InvalidConfigurationException | IllegalArgumentException e) {
|
||||||
logger.severe("Configuration error for Ore. ");
|
logger.severe("Configuration error for Ore. File: " + path.toString());
|
||||||
logger.severe(e.getMessage());
|
logger.severe(e.getMessage());
|
||||||
logger.severe("Correct this before proceeding!");
|
logger.severe("Correct this before proceeding!");
|
||||||
}
|
}
|
||||||
|
@ -91,7 +91,7 @@ public class PaletteConfig extends YamlConfiguration {
|
|||||||
} catch(IOException e) {
|
} catch(IOException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
} catch(InvalidConfigurationException | IllegalArgumentException e) {
|
} catch(InvalidConfigurationException | IllegalArgumentException e) {
|
||||||
logger.severe("Configuration error for BlockPalette. ");
|
logger.severe("Configuration error for BlockPalette. File: " + path.toString());
|
||||||
logger.severe(e.getMessage());
|
logger.severe(e.getMessage());
|
||||||
logger.severe("Correct this before proceeding!");
|
logger.severe("Correct this before proceeding!");
|
||||||
}
|
}
|
||||||
|
@ -2,37 +2,66 @@ package com.dfsek.terra.population;
|
|||||||
|
|
||||||
import com.dfsek.terra.TerraProfiler;
|
import com.dfsek.terra.TerraProfiler;
|
||||||
import com.dfsek.terra.config.CarverConfig;
|
import com.dfsek.terra.config.CarverConfig;
|
||||||
|
import org.bukkit.Chunk;
|
||||||
|
import org.bukkit.Location;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.World;
|
import org.bukkit.World;
|
||||||
|
import org.bukkit.block.Block;
|
||||||
|
import org.bukkit.generator.BlockPopulator;
|
||||||
import org.bukkit.generator.ChunkGenerator;
|
import org.bukkit.generator.ChunkGenerator;
|
||||||
import org.bukkit.util.Vector;
|
import org.bukkit.util.Vector;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.polydev.gaea.generation.GenerationPopulator;
|
import org.polydev.gaea.generation.GenerationPopulator;
|
||||||
import org.polydev.gaea.profiler.ProfileFuture;
|
import org.polydev.gaea.profiler.ProfileFuture;
|
||||||
import org.polydev.gaea.world.carving.CarvingData;
|
import org.polydev.gaea.world.carving.CarvingData;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
public class CavePopulator extends GenerationPopulator {
|
public class CavePopulator extends BlockPopulator {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ChunkGenerator.ChunkData populate(World world, ChunkGenerator.ChunkData chunk, Random random, int chunkX, int chunkZ) {
|
public void populate(@NotNull World world, @NotNull Random random, @NotNull Chunk chunk) {
|
||||||
|
ProfileFuture cave = TerraProfiler.fromWorld(world).measure("CaveTime");
|
||||||
for(CarverConfig c : CarverConfig.getCarvers()) {
|
for(CarverConfig c : CarverConfig.getCarvers()) {
|
||||||
ProfileFuture cave = TerraProfiler.fromWorld(world).measure("CaveTime");
|
Map<Location, Material> shiftCandidate = new HashMap<>();
|
||||||
Map<Vector, CarvingData.CarvingType> blocks = c.getCarver().carve(chunkX, chunkZ, world).getCarvedBlocks();
|
Map<Vector, CarvingData.CarvingType> blocks = c.getCarver().carve(chunk.getX(), chunk.getZ(), world).getCarvedBlocks();
|
||||||
for(Map.Entry<Vector, CarvingData.CarvingType> e : blocks.entrySet()) {
|
for(Map.Entry<Vector, CarvingData.CarvingType> e : blocks.entrySet()) {
|
||||||
Vector v = e.getKey();
|
Vector v = e.getKey();
|
||||||
Material m = chunk.getType(v.getBlockX(), v.getBlockY(), v.getBlockZ());
|
Block b = chunk.getBlock(v.getBlockX(), v.getBlockY(), v.getBlockZ());
|
||||||
|
Material m = b.getType();
|
||||||
|
boolean liquid = m.equals(Material.WATER) || m.equals(Material.LAVA);
|
||||||
if(e.getValue().equals(CarvingData.CarvingType.CENTER) && c.isReplaceableInner(m)) {
|
if(e.getValue().equals(CarvingData.CarvingType.CENTER) && c.isReplaceableInner(m)) {
|
||||||
chunk.setBlock(v.getBlockX(), v.getBlockY(), v.getBlockZ(), Material.AIR);
|
if(c.getShiftedBlocks().containsKey(b.getType())) shiftCandidate.put(b.getLocation(), b.getType());
|
||||||
|
b.setBlockData(c.getPaletteInner(v.getBlockY()).get(random), liquid);
|
||||||
} else if(c.isReplaceableOuter(m)){
|
} else if(c.isReplaceableOuter(m)){
|
||||||
chunk.setBlock(v.getBlockX(), v.getBlockY(), v.getBlockZ(), Material.ANDESITE);
|
if(c.getShiftedBlocks().containsKey(b.getType())) shiftCandidate.put(b.getLocation(), b.getType());
|
||||||
|
b.setBlockData(c.getPaletteOuter(v.getBlockY()).get(random), liquid);
|
||||||
|
} else if(liquid) {
|
||||||
|
b.setBlockData(b.getBlockData(), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
if(cave != null) cave.complete();
|
int i = 0;
|
||||||
|
int j = 0;
|
||||||
|
for(Location l : shiftCandidate.keySet()) {
|
||||||
|
Location mut = l.clone();
|
||||||
|
Material orig = l.getBlock().getType();
|
||||||
|
do mut.subtract(0, 1, 0);
|
||||||
|
while(mut.getBlock().getType().equals(orig));
|
||||||
|
try {
|
||||||
|
if(c.getShiftedBlocks().get(shiftCandidate.get(l)).contains(mut.getBlock().getType())) {
|
||||||
|
mut.getBlock().setType(shiftCandidate.get(l));
|
||||||
|
j++;
|
||||||
|
}
|
||||||
|
} catch(NullPointerException ignored) {}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
if(i > 0) System.out.println("Shifted " + i + " blocks. " + j + " successful shifts.");
|
||||||
}
|
}
|
||||||
return chunk;
|
|
||||||
|
if(cave != null) cave.complete();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -10,7 +10,6 @@ import org.bukkit.World;
|
|||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.polydev.gaea.biome.Biome;
|
import org.polydev.gaea.biome.Biome;
|
||||||
import org.polydev.gaea.population.GaeaBlockPopulator;
|
import org.polydev.gaea.population.GaeaBlockPopulator;
|
||||||
import org.polydev.gaea.population.PopulationManager;
|
|
||||||
import org.polydev.gaea.profiler.ProfileFuture;
|
import org.polydev.gaea.profiler.ProfileFuture;
|
||||||
import org.polydev.gaea.util.WorldUtil;
|
import org.polydev.gaea.util.WorldUtil;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user