Fix various issues

This commit is contained in:
dfsek 2020-11-30 17:23:57 -07:00
parent f033b8219c
commit f85d047ee6
12 changed files with 38 additions and 47 deletions

View File

@ -13,7 +13,6 @@ import org.polydev.gaea.biome.BiomeGrid;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.Objects;
public class TerraWorld { public class TerraWorld {
private static final Map<World, TerraWorld> map = new HashMap<>(); private static final Map<World, TerraWorld> map = new HashMap<>();
@ -49,24 +48,8 @@ public class TerraWorld {
Bukkit.getLogger().severe("Terrain will NOT generate properly at this point. Correct your config before using your server!"); Bukkit.getLogger().severe("Terrain will NOT generate properly at this point. Correct your config before using your server!");
} }
} }
BiomeGrid erosion = null;
String erosionName = template.getErodeGrid();
if(template.isErode()) {
try {
BiomeGridBuilder g = Objects.requireNonNull(config.getBiomeGrid(erosionName));
BiomeGrid b = g.build(w, worldConfig);
erosion = b;
} catch(NullPointerException e) {
safe = false;
Debug.stack(e);
Bukkit.getLogger().severe("No such BiomeGrid (erosion): " + erosionName);
Bukkit.getLogger().severe("Please check configuration files for errors. Configuration errors will have been reported during initialization.");
Bukkit.getLogger().severe("ONLY report this to Terra if you are SURE your config is error-free.");
Bukkit.getLogger().severe("Terrain will NOT generate properly at this point. Correct your config before using your server!");
}
}
zone = new BiomeZone(w, worldConfig, definedGrids); zone = new BiomeZone(w, worldConfig, definedGrids);
grid = new TerraBiomeGrid(w, template.getGridFreqX(), template.getGridFreqZ(), zone, config, erosion); grid = new TerraBiomeGrid(w, template.getGridFreqX(), template.getGridFreqZ(), zone, config);
} }
public static void loadWorld(WorldConfig w) { public static void loadWorld(WorldConfig w) {

View File

@ -1,6 +1,7 @@
package com.dfsek.terra.biome; package com.dfsek.terra.biome;
import com.dfsek.terra.WorldObject; import com.dfsek.terra.WorldObject;
import com.dfsek.terra.config.base.ConfigPack;
import com.dfsek.terra.config.builder.GeneratorBuilder; import com.dfsek.terra.config.builder.GeneratorBuilder;
import com.dfsek.terra.config.templates.BiomeTemplate; import com.dfsek.terra.config.templates.BiomeTemplate;
import com.dfsek.terra.generation.UserDefinedDecorator; import com.dfsek.terra.generation.UserDefinedDecorator;
@ -21,16 +22,17 @@ public class UserDefinedBiome implements Biome, WorldObject {
private final org.bukkit.block.Biome vanilla; private final org.bukkit.block.Biome vanilla;
private final String id; private final String id;
private final BiomeTemplate config; private final BiomeTemplate config;
private final boolean erode; private final ConfigPack pack;
private UserDefinedBiome erode;
public UserDefinedBiome(org.bukkit.block.Biome vanilla, UserDefinedDecorator dec, GeneratorBuilder gen, boolean erode, BiomeTemplate config) { public UserDefinedBiome(org.bukkit.block.Biome vanilla, UserDefinedDecorator dec, GeneratorBuilder gen, BiomeTemplate config, ConfigPack pack) {
this.vanilla = vanilla; this.vanilla = vanilla;
this.decorator = dec; this.decorator = dec;
this.gen = gen; this.gen = gen;
this.id = config.getID(); this.id = config.getID();
this.erode = erode;
this.config = config; this.config = config;
this.pack = pack;
} }
/** /**
@ -77,10 +79,14 @@ public class UserDefinedBiome implements Biome, WorldObject {
return id; return id;
} }
public boolean isErodible() { public UserDefinedBiome getErode() {
if(erode == null) {
erode = (config.getErode() == null) ? this : pack.getBiome(config.getErode());
}
return erode; return erode;
} }
public BiomeTemplate getConfig() { public BiomeTemplate getConfig() {
return config; return config;
} }

View File

@ -22,9 +22,8 @@ public class TerraBiomeGrid extends BiomeGrid {
private final BiomeZone zone; private final BiomeZone zone;
private CoordinatePerturb perturb; private CoordinatePerturb perturb;
private ErosionNoise erode; private ErosionNoise erode;
private BiomeGrid erosionGrid;
public TerraBiomeGrid(World w, double freq1, double freq2, BiomeZone zone, ConfigPack c, BiomeGrid erosion) { public TerraBiomeGrid(World w, double freq1, double freq2, BiomeZone zone, ConfigPack c) {
super(w, freq1, freq2, 0, 0); super(w, freq1, freq2, 0, 0);
ConfigPackTemplate t = c.getTemplate(); ConfigPackTemplate t = c.getTemplate();
if(c.getTemplate().isBlend()) { if(c.getTemplate().isBlend()) {
@ -33,7 +32,6 @@ public class TerraBiomeGrid extends BiomeGrid {
this.zone = zone; this.zone = zone;
if(c.getTemplate().isErode()) { if(c.getTemplate().isErode()) {
erode = new ErosionNoise(t.getErodeFreq(), t.getErodeThresh(), t.getErodeOctaves(), w.getSeed()); erode = new ErosionNoise(t.getErodeFreq(), t.getErodeThresh(), t.getErodeOctaves(), w.getSeed());
this.erosionGrid = erosion;
} }
} }
@ -45,7 +43,7 @@ public class TerraBiomeGrid extends BiomeGrid {
public Biome getBiome(int x, int z, GenerationPhase phase) { public Biome getBiome(int x, int z, GenerationPhase phase) {
int xp = x; int xp = x;
int zp = z; int zp = z;
if(perturb != null && phase.equals(GenerationPhase.PALETTE_APPLY)) { if(perturb != null && (phase.equals(GenerationPhase.PALETTE_APPLY) || phase.equals(GenerationPhase.POPULATE))) {
Vector2 perturbCoords = perturb.getShiftedCoords(x, z); Vector2 perturbCoords = perturb.getShiftedCoords(x, z);
xp = (int) perturbCoords.getX(); xp = (int) perturbCoords.getX();
zp = (int) perturbCoords.getZ(); zp = (int) perturbCoords.getZ();
@ -61,9 +59,7 @@ public class TerraBiomeGrid extends BiomeGrid {
failNum++; failNum++;
return null; return null;
} }
if(erode != null && b.isErodible() && erode.isEroded(xp, zp)) { if(erode.isEroded(xp, zp)) return b.getErode();
return erosionGrid.getBiome(xp, zp, phase);
}
return b; return b;
} }

View File

@ -36,7 +36,7 @@ public class BiomeInfoCommand extends WorldCommand {
} }
sender.sendMessage("Biome info for \"" + b.getID() + "\"."); sender.sendMessage("Biome info for \"" + b.getID() + "\".");
sender.sendMessage("Vanilla biome: " + b.getVanillaBiome()); sender.sendMessage("Vanilla biome: " + b.getVanillaBiome());
sender.sendMessage("Erodible: " + b.isErodible()); sender.sendMessage("Eroded by: " + b.getErode());
BiomeTemplate bio = b.getConfig(); BiomeTemplate bio = b.getConfig();

View File

@ -58,6 +58,7 @@ import java.util.Collection;
import java.util.Enumeration; import java.util.Enumeration;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects;
import java.util.Set; import java.util.Set;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.zip.ZipEntry; import java.util.zip.ZipEntry;
@ -144,6 +145,13 @@ public class ConfigPack {
.open("structures/trees").then(streams -> buildAll(new TreeFactory(), treeRegistry, abstractConfigLoader.load(streams, TreeTemplate::new))).close() .open("structures/trees").then(streams -> buildAll(new TreeFactory(), treeRegistry, abstractConfigLoader.load(streams, TreeTemplate::new))).close()
.open("biomes").then(streams -> buildAll(new BiomeFactory(this), biomeRegistry, abstractConfigLoader.load(streams, () -> new BiomeTemplate(this)))).close() .open("biomes").then(streams -> buildAll(new BiomeFactory(this), biomeRegistry, abstractConfigLoader.load(streams, () -> new BiomeTemplate(this)))).close()
.open("grids").then(streams -> buildAll(new BiomeGridFactory(), biomeGridRegistry, abstractConfigLoader.load(streams, BiomeGridTemplate::new))).close(); .open("grids").then(streams -> buildAll(new BiomeGridFactory(), biomeGridRegistry, abstractConfigLoader.load(streams, BiomeGridTemplate::new))).close();
for(UserDefinedBiome b : biomeRegistry.entries()) {
try {
Objects.requireNonNull(b.getErode()); // Throws NPE if it cannot load erosion biomes.
} catch(NullPointerException e) {
throw new LoadException("Invalid erosion biome defined in biome \"" + b.getID() + "\"", e);
}
}
} }
private <C extends AbstractableTemplate, O> void buildAll(TerraFactory<C, O> factory, TerraRegistry<O> registry, List<C> configTemplates) throws LoadException { private <C extends AbstractableTemplate, O> void buildAll(TerraFactory<C, O> factory, TerraRegistry<O> registry, List<C> configTemplates) throws LoadException {

View File

@ -69,10 +69,6 @@ public class ConfigPackTemplate implements ConfigTemplate {
@Default @Default
private int erodeOctaves = 5; private int erodeOctaves = 5;
@Value("erode.grid")
@Default
private String erodeGrid = null;
@Value("vanilla.mobs") @Value("vanilla.mobs")
@Default @Default
private boolean vanillaMobs = false; private boolean vanillaMobs = false;
@ -164,8 +160,4 @@ public class ConfigPackTemplate implements ConfigTemplate {
public int getErodeOctaves() { public int getErodeOctaves() {
return erodeOctaves; return erodeOctaves;
} }
public String getErodeGrid() {
return erodeGrid;
}
} }

View File

@ -26,6 +26,6 @@ public class BiomeFactory implements TerraFactory<BiomeTemplate, UserDefinedBiom
generatorBuilder.setVarScope(pack.getVarScope()); generatorBuilder.setVarScope(pack.getVarScope());
return new UserDefinedBiome(template.getVanilla(), decorator, generatorBuilder, template.isErodible(), template); return new UserDefinedBiome(template.getVanilla(), decorator, generatorBuilder, template, pack);
} }
} }

View File

@ -2,7 +2,7 @@ package com.dfsek.terra.config.factories;
import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.exception.LoadException;
import com.dfsek.terra.config.templates.TreeTemplate; import com.dfsek.terra.config.templates.TreeTemplate;
import com.dfsek.terra.generation.items.TerraTree; import com.dfsek.terra.generation.items.tree.TerraTree;
import org.polydev.gaea.tree.Tree; import org.polydev.gaea.tree.Tree;
public class TreeFactory implements TerraFactory<TreeTemplate, Tree> { public class TreeFactory implements TerraFactory<TreeTemplate, Tree> {

View File

@ -44,10 +44,10 @@ public class BiomeTemplate extends AbstractableTemplate implements ValidatedConf
@Value("vanilla") @Value("vanilla")
@Abstractable @Abstractable
private Biome vanilla; private Biome vanilla;
@Value("erodible") @Value("erode")
@Abstractable @Abstractable
@Default @Default
private boolean erodible = false; private String erode = null;
@Value("structures") @Value("structures")
@Abstractable @Abstractable
@Default @Default
@ -176,8 +176,8 @@ public class BiomeTemplate extends AbstractableTemplate implements ValidatedConf
return vanilla; return vanilla;
} }
public boolean isErodible() { public String getErode() {
return erodible; return erode;
} }
public List<TerraStructure> getStructures() { public List<TerraStructure> getStructures() {

View File

@ -1,4 +1,4 @@
package com.dfsek.terra.generation.items; package com.dfsek.terra.generation.items.tree;
import com.dfsek.terra.procgen.math.Vector2; import com.dfsek.terra.procgen.math.Vector2;
import com.dfsek.terra.structure.Rotation; import com.dfsek.terra.structure.Rotation;

View File

@ -10,6 +10,7 @@ import org.polydev.gaea.math.FastNoiseLite;
import org.polydev.gaea.math.ProbabilityCollection; import org.polydev.gaea.math.ProbabilityCollection;
import org.polydev.gaea.math.Range; import org.polydev.gaea.math.Range;
import org.polydev.gaea.tree.Tree; import org.polydev.gaea.tree.Tree;
import org.polydev.gaea.tree.TreeType;
import java.util.Random; import java.util.Random;
@ -25,7 +26,11 @@ public class TreeLayer extends PlaceableLayer<Tree> {
Block current = chunk.getBlock((int) coords.getX(), level.getMax(), (int) coords.getZ()); Block current = chunk.getBlock((int) coords.getX(), level.getMax(), (int) coords.getZ());
for(int ignored : level) { for(int ignored : level) {
current = current.getRelative(BlockFace.DOWN); current = current.getRelative(BlockFace.DOWN);
if(item.getSpawnable().contains(current.getType())) item.plant(current.getLocation(), random, Terra.getInstance()); if(item.getSpawnable().contains(current.getType())) {
if(item instanceof TreeType && current.getRelative(BlockFace.UP).isEmpty())
item.plant(current.getLocation().add(0, 1, 0), random, Terra.getInstance());
else if(!(item instanceof TreeType)) item.plant(current.getLocation(), random, Terra.getInstance());
}
} }
} }
} }

View File

@ -53,7 +53,8 @@ public final class TagUtil {
|| name.contains("repeater") || name.contains("repeater")
|| name.equals("lily_pad") || name.equals("lily_pad")
|| name.equals("snow") || name.equals("snow")
|| name.equals("pane")) snow.add(m); || name.equals("pane")
|| !m.isSolid()) snow.add(m);
} }
tagMap.put("terra:snow_blacklist", snow); tagMap.put("terra:snow_blacklist", snow);
Bukkit.getLogger().info("Added " + snow.size() + " materials to snow blacklist"); Bukkit.getLogger().info("Added " + snow.size() + " materials to snow blacklist");