mirror of
https://github.com/PolyhedralDev/Terra.git
synced 2025-07-18 10:32:30 +00:00
Fix various biome abstraction issues
This commit is contained in:
parent
c4b0057f3e
commit
b5efa7cd79
@ -15,7 +15,6 @@ import java.util.Objects;
|
||||
|
||||
public class BiomeZone {
|
||||
private BiomeGrid[] grids;
|
||||
private final World w;
|
||||
private final FastNoise noise;
|
||||
private static final Map<World, BiomeZone> zones = new HashMap<>();
|
||||
@Nullable
|
||||
@ -24,7 +23,6 @@ public class BiomeZone {
|
||||
private final ImageLoader.Channel channel;
|
||||
|
||||
private BiomeZone(World w) {
|
||||
this.w = w;
|
||||
this.noise = new FastNoise((int) w.getSeed()+2);
|
||||
this.noise.setNoiseType(FastNoise.NoiseType.SimplexFractal);
|
||||
this.noise.setFractalOctaves(4);
|
||||
@ -57,4 +55,8 @@ public class BiomeZone {
|
||||
if(zones.containsKey(w)) return zones.get(w);
|
||||
else return new BiomeZone(w);
|
||||
}
|
||||
|
||||
public static void invalidate() {
|
||||
zones.clear();
|
||||
}
|
||||
}
|
||||
|
@ -16,7 +16,7 @@ public class TerraBiomeGrid extends BiomeGrid {
|
||||
private final World w;
|
||||
|
||||
public TerraBiomeGrid(World w) {
|
||||
super(w, 1f/256, 1f/512);
|
||||
super(w, WorldConfig.fromWorld(w).freq1, WorldConfig.fromWorld(w).freq2);
|
||||
this.w = w;
|
||||
grids.put(w, this);
|
||||
}
|
||||
@ -37,6 +37,10 @@ public class TerraBiomeGrid extends BiomeGrid {
|
||||
return getBiome(l.getBlockX(), l.getBlockZ());
|
||||
}
|
||||
|
||||
public static void invalidate() {
|
||||
grids.clear();
|
||||
}
|
||||
|
||||
public UserDefinedGrid getGrid(int x, int z) {
|
||||
return (UserDefinedGrid) BiomeZone.fromWorld(w).getGrid(x, z);
|
||||
}
|
||||
|
@ -11,13 +11,14 @@ public class UserDefinedBiome implements Biome {
|
||||
private final UserDefinedGenerator gen;
|
||||
private final UserDefinedDecorator decorator;
|
||||
private final org.bukkit.block.Biome vanilla;
|
||||
private final String id;
|
||||
|
||||
|
||||
public UserDefinedBiome(org.bukkit.block.Biome vanilla, UserDefinedDecorator dec, UserDefinedGenerator gen) {
|
||||
|
||||
public UserDefinedBiome(org.bukkit.block.Biome vanilla, UserDefinedDecorator dec, UserDefinedGenerator gen, String id) {
|
||||
this.vanilla = vanilla;
|
||||
this.decorator = dec;
|
||||
this.gen = gen;
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -59,4 +60,8 @@ public class UserDefinedBiome implements Biome {
|
||||
public Decorator getDecorator() {
|
||||
return decorator;
|
||||
}
|
||||
|
||||
public String getID() {
|
||||
return id;
|
||||
}
|
||||
}
|
||||
|
@ -14,16 +14,6 @@ public class UserDefinedGrid extends BiomeGrid {
|
||||
private final boolean fromImage;
|
||||
private final ImageLoader.Channel channelX;
|
||||
private final ImageLoader.Channel channelZ;
|
||||
public UserDefinedGrid(World w, float freq1, float freq2, BiomeGridConfig config) {
|
||||
super(w, freq1, freq2, config.getBiomeGrid().length, config.getBiomeGrid()[0].length);
|
||||
super.setNormalType(NormalType.LOOKUP4096);
|
||||
super.setGrid(config.getBiomeGrid());
|
||||
WorldConfig c = WorldConfig.fromWorld(w);
|
||||
imageLoader = c.imageLoader;
|
||||
fromImage = c.fromImage;
|
||||
channelX = c.biomeXChannel;
|
||||
channelZ = c.biomeZChannel;
|
||||
}
|
||||
public UserDefinedGrid(World w, float freq1, float freq2, UserDefinedBiome[][] b) {
|
||||
super(w, freq1, freq2, b.length, b[0].length);
|
||||
super.setNormalType(NormalType.LOOKUP4096);
|
||||
|
@ -36,8 +36,7 @@ public class UserDefinedCarver extends Carver {
|
||||
|
||||
@Override
|
||||
public boolean isChunkCarved(World w, int chunkX, int chunkZ, Random random) {
|
||||
UserDefinedBiome b = (UserDefinedBiome) TerraBiomeGrid.fromWorld(w).getBiome(chunkX << 4, chunkZ << 4);
|
||||
return random.nextInt(100) < BiomeConfig.fromBiome(b).getCarverChance(this);
|
||||
return random.nextInt(100) < BiomeConfig.fromBiome((UserDefinedBiome) TerraBiomeGrid.fromWorld(w).getBiome(chunkX << 4, chunkZ << 4)).getCarverChance(this);
|
||||
}
|
||||
|
||||
private class UserDefinedWorm extends Worm {
|
||||
|
@ -1,5 +1,6 @@
|
||||
package com.dfsek.terra.config;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
import org.polydev.gaea.commons.io.FilenameUtils;
|
||||
|
||||
@ -9,7 +10,9 @@ import java.lang.reflect.Constructor;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
@ -22,6 +25,7 @@ public class ConfigLoader {
|
||||
public <T extends TerraConfigObject> void load(JavaPlugin main, Class<T> clazz) {
|
||||
File folder = new File(main.getDataFolder() + File.separator + "config" + File.separator + path);
|
||||
folder.mkdirs();
|
||||
List<String> ids = new ArrayList<>();
|
||||
try (Stream<Path> paths = Files.walk(folder.toPath())) {
|
||||
paths
|
||||
.filter(path -> FilenameUtils.wildcardMatch(path.toFile().getName(), "*.yml"))
|
||||
@ -29,6 +33,8 @@ public class ConfigLoader {
|
||||
try {
|
||||
Constructor<T> c = clazz.getConstructor(File.class);
|
||||
T o = c.newInstance(path.toFile());
|
||||
if(ids.contains(o.getID())) Bukkit.getLogger().severe("Duplicate ID found in file: " + path.toString());
|
||||
ids.add(o.getID());
|
||||
main.getLogger().info("Loaded " + o.toString() + " from file " + path.toString());
|
||||
} catch(IllegalAccessException | InstantiationException | NoSuchMethodException e) {
|
||||
e.printStackTrace();
|
||||
|
@ -1,5 +1,7 @@
|
||||
package com.dfsek.terra.config;
|
||||
|
||||
import com.dfsek.terra.biome.BiomeZone;
|
||||
import com.dfsek.terra.biome.TerraBiomeGrid;
|
||||
import com.dfsek.terra.config.genconfig.AbstractBiomeConfig;
|
||||
import com.dfsek.terra.config.genconfig.BiomeConfig;
|
||||
import com.dfsek.terra.config.genconfig.BiomeGridConfig;
|
||||
@ -29,6 +31,8 @@ public class ConfigUtil {
|
||||
|
||||
new ConfigLoader("abstract" + File.separator + "biomes").load(main, AbstractBiomeConfig.class);
|
||||
|
||||
TerraBiomeGrid.invalidate();
|
||||
BiomeZone.invalidate(); // Invalidate BiomeZone and BiomeGrid caches to prevent old instances from being accessed.
|
||||
new ConfigLoader("biomes").load(main, BiomeConfig.class);
|
||||
|
||||
new ConfigLoader("grids").load(main, BiomeGridConfig.class);
|
||||
|
@ -30,7 +30,7 @@ public class WorldConfig {
|
||||
public float freq2;
|
||||
public int seaLevel;
|
||||
public boolean fromImage;
|
||||
public UserDefinedGrid[] definedGrids = new UserDefinedGrid[32];
|
||||
public UserDefinedGrid[] definedGrids;
|
||||
public ImageLoader.Channel biomeXChannel;
|
||||
public ImageLoader.Channel biomeZChannel;
|
||||
public ImageLoader.Channel zoneChannel;
|
||||
@ -102,6 +102,7 @@ public class WorldConfig {
|
||||
|
||||
// Load BiomeGrids from BiomeZone
|
||||
List<String> biomeList = config.getStringList("grids");
|
||||
definedGrids = new UserDefinedGrid[biomeList.size()];
|
||||
for(int i = 0; i < biomeList.size(); i++) {
|
||||
String partName = biomeList.get(i);
|
||||
if(partName.startsWith("BIOME:")) {
|
||||
|
@ -188,14 +188,6 @@ public class BiomeConfig extends TerraConfigObject {
|
||||
throw new InvalidConfigurationException("Invalid Vanilla biome: " + getString("vanilla"));
|
||||
}
|
||||
|
||||
try {
|
||||
// Get UserDefinedBiome instance representing this config.
|
||||
this.biome = new UserDefinedBiome(vanillaBiome, dec, new UserDefinedGenerator(eq, Collections.emptyList(), paletteMap));
|
||||
} catch(ParseException e) {
|
||||
e.printStackTrace();
|
||||
throw new IllegalArgumentException("Unable to parse noise equation!");
|
||||
}
|
||||
|
||||
// Check if ores should be handled by super biome.
|
||||
if(extending && abstractBiome.getOres() != null && !contains("ores")) {
|
||||
ores = abstractBiome.getOres();
|
||||
@ -212,8 +204,13 @@ public class BiomeConfig extends TerraConfigObject {
|
||||
oreHeights = new HashMap<>();
|
||||
}
|
||||
|
||||
|
||||
|
||||
try {
|
||||
// Get UserDefinedBiome instance representing this config.
|
||||
this.biome = new UserDefinedBiome(vanillaBiome, dec, new UserDefinedGenerator(eq, Collections.emptyList(), paletteMap), biomeID);
|
||||
} catch(ParseException e) {
|
||||
e.printStackTrace();
|
||||
throw new IllegalArgumentException("Unable to parse noise equation!");
|
||||
}
|
||||
biomes.put(biomeID, this);
|
||||
}
|
||||
|
||||
@ -245,6 +242,9 @@ public class BiomeConfig extends TerraConfigObject {
|
||||
for(BiomeConfig biome : biomes.values()) {
|
||||
if(biome.getBiome().equals(b)) return biome;
|
||||
}
|
||||
for(BiomeConfig biome : biomes.values()) {
|
||||
Bukkit.getLogger().info(biome.getID() + ":" + biome.hashCode() + " : " + b.getID() + ":" + b.hashCode());
|
||||
}
|
||||
throw new IllegalArgumentException("No BiomeConfig for provided biome.");
|
||||
}
|
||||
|
||||
|
@ -83,7 +83,7 @@ public class BiomeGridConfig extends TerraConfigObject {
|
||||
|
||||
public UserDefinedGrid getGrid(World w) {
|
||||
WorldConfig c = WorldConfig.fromWorld(w);
|
||||
return new UserDefinedGrid(w, c.freq1, c.freq2, this);
|
||||
return new UserDefinedGrid(w, c.freq1, c.freq2, gridRaw);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
Loading…
x
Reference in New Issue
Block a user