Implement OreVeinGenerateEvent and TreeGenerateEvent

This commit is contained in:
dfsek
2020-10-21 01:37:25 -07:00
parent 862e9e82a2
commit 454d9ce659
16 changed files with 183 additions and 24 deletions

View File

@@ -8,8 +8,11 @@ import com.dfsek.terra.biome.UserDefinedBiome;
import com.dfsek.terra.config.base.ConfigPack;
import com.dfsek.terra.config.genconfig.biome.BiomeConfig;
import com.dfsek.terra.config.genconfig.biome.BiomeFloraConfig;
import com.dfsek.terra.event.TreeGenerateEvent;
import com.dfsek.terra.generation.UserDefinedDecorator;
import org.bukkit.Bukkit;
import org.bukkit.Chunk;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.block.Block;
import org.jetbrains.annotations.NotNull;
@@ -34,6 +37,8 @@ public class FloraPopulator extends GaeaBlockPopulator {
try (ProfileFuture ignored = TerraProfiler.fromWorld(world).measure("FloraTime")) {
TerraWorld tw = TerraWorld.getWorld(world);
if(!tw.isSafe()) return;
int originX = chunk.getX() << 4;
int originZ = chunk.getZ() << 4;
TerraBiomeGrid grid = tw.getGrid();
ConfigPack config = tw.getConfig();
for(int x = 0; x < 16; x++) {
@@ -42,7 +47,9 @@ public class FloraPopulator extends GaeaBlockPopulator {
if((x & 1) == 0 && (z & 1) == 0) {
int treeChance = biome.getDecorator().getTreeDensity();
if(random.nextInt(1000) < treeChance) {
if(doTrees(biome, tw, random, chunk, offset(random, x), offset(random, z))) continue;
int xt = offset(random, x);
int zt = offset(random, z);
if(doTrees(biome, tw, random, chunk, xt, zt)) continue;
}
}
if(biome.getDecorator().getFloraChance() <= 0) continue;
@@ -51,7 +58,7 @@ public class FloraPopulator extends GaeaBlockPopulator {
BiomeFloraConfig f = c.getFlora();
for(int i = 0; i < f.getFloraAttempts(); i++) {
Flora item;
if(f.isFloraSimplex()) item = biome.getDecorator().getFlora().get(f.getFloraNoise(), (chunk.getX() << 4) + x, (chunk.getZ() << 4) + z);
if(f.isFloraSimplex()) item = biome.getDecorator().getFlora().get(f.getFloraNoise(), originX + x, originZ + z);
else item = biome.getDecorator().getFlora().get(random);
for(Block highest : item.getValidSpawnsAt(chunk, x, z, c.getFloraHeights(item))) {
if(random.nextInt(100) < biome.getDecorator().getFloraChance())
@@ -69,7 +76,10 @@ public class FloraPopulator extends GaeaBlockPopulator {
Range range = world.getConfig().getBiome(biome).getTreeRange(tree);
if(!range.isInRange(block.getY())) continue;
try {
return tree.plant(block.getLocation(), random, Terra.getInstance());
Location l = block.getLocation();
TreeGenerateEvent event = new TreeGenerateEvent(world, l, tree);
Bukkit.getPluginManager().callEvent(event);
if(!event.isCancelled()) tree.plant(l, random, Terra.getInstance());
} catch(NullPointerException ignore) {}
}
return false;

View File

@@ -3,6 +3,8 @@ package com.dfsek.terra.population;
import com.dfsek.terra.TerraWorld;
import com.dfsek.terra.config.base.ConfigPack;
import com.dfsek.terra.config.genconfig.biome.BiomeOreConfig;
import com.dfsek.terra.event.OreVeinGenerateEvent;
import org.bukkit.Bukkit;
import org.bukkit.util.Vector;
import org.polydev.gaea.math.Range;
import com.dfsek.terra.TerraProfiler;
@@ -30,13 +32,20 @@ public class OrePopulator extends GaeaBlockPopulator {
BiomeOreConfig ores = config.getBiome((UserDefinedBiome) b).getOres();
for(Map.Entry<OreConfig, Range> e : ores.getOres().entrySet()) {
int num = e.getValue().get(random);
int edgeOffset = e.getKey().getChunkEdgeOffset();
OreConfig ore = e.getKey();
int edgeOffset = ore.getChunkEdgeOffset();
for(int i = 0; i < num; i++) {
int x = random.nextInt(16 - edgeOffset*2) + edgeOffset;
int z = random.nextInt(16 - edgeOffset*2) + edgeOffset;
int y = ores.getOreHeights().get(e.getKey()).get(random);
if(e.getKey().crossChunks()) e.getKey().doVein(new Vector(x, y, z), chunk, random);
else e.getKey().doVeinSingle(new Vector(x, y, z), chunk, random);
int y = ores.getOreHeights().get(ore).get(random);
Vector v = new Vector(x, y, z);
OreVeinGenerateEvent event = new OreVeinGenerateEvent(tw, v.toLocation(world), ore);
Bukkit.getPluginManager().callEvent(event);
if(! event.isCancelled()) {
if(ore.crossChunks()) ore.doVein(v, chunk, random);
else ore.doVeinSingle(new Vector(x, y, z), chunk, random);
}
}
}
}