From 59e1d6f1461b0cd7630d20978cf5fae6325518e5 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sat, 10 Oct 2020 02:55:54 -0700 Subject: [PATCH] Add snow to profiler, improve snow performance. --- .../java/com/dfsek/terra/TerraProfiler.java | 1 + .../terra/command/biome/BiomeInfoCommand.java | 47 +++++++++++++++++-- .../dfsek/terra/population/SnowPopulator.java | 38 +++++++++------ 3 files changed, 67 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/dfsek/terra/TerraProfiler.java b/src/main/java/com/dfsek/terra/TerraProfiler.java index babf6df8c..78ada7391 100644 --- a/src/main/java/com/dfsek/terra/TerraProfiler.java +++ b/src/main/java/com/dfsek/terra/TerraProfiler.java @@ -20,6 +20,7 @@ public class TerraProfiler extends WorldProfiler { .addMeasurement(new Measurement(1500000, DataType.PERIOD_MILLISECONDS), "CaveTime") .addMeasurement(new Measurement(1500000, DataType.PERIOD_MILLISECONDS), "StructureTime") .addMeasurement(new Measurement(1500000, DataType.PERIOD_MILLISECONDS), "StructurePasteTime") + .addMeasurement(new Measurement(1500000, DataType.PERIOD_MILLISECONDS), "SnowTime") .addMeasurement(new Measurement(1500000, DataType.PERIOD_MILLISECONDS), "CaveBlockUpdate"); profilerMap.put(w, this); } diff --git a/src/main/java/com/dfsek/terra/command/biome/BiomeInfoCommand.java b/src/main/java/com/dfsek/terra/command/biome/BiomeInfoCommand.java index 6ee7c6f65..0990a683c 100644 --- a/src/main/java/com/dfsek/terra/command/biome/BiomeInfoCommand.java +++ b/src/main/java/com/dfsek/terra/command/biome/BiomeInfoCommand.java @@ -8,6 +8,7 @@ import com.dfsek.terra.config.TerraConfig; import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.config.genconfig.StructureConfig; import com.dfsek.terra.config.genconfig.biome.BiomeConfig; +import com.dfsek.terra.config.genconfig.biome.BiomeSnowConfig; import com.dfsek.terra.config.lang.LangUtil; import com.dfsek.terra.generation.TerraChunkGenerator; import org.bukkit.World; @@ -36,14 +37,52 @@ public class BiomeInfoCommand extends WorldCommand { sender.sendMessage("Biome info for \"" + b.getID() + "\"."); sender.sendMessage("Vanilla biome: " + b.getVanillaBiome()); sender.sendMessage("Erodible: " + b.isErodible()); - sender.sendMessage("-------Structures-------"); - List structureConfigs = cfg.getBiome(b).getStructures(); - for(StructureConfig c : structureConfigs) { - sender.sendMessage(" - " + c.getID()); + BiomeConfig bio = cfg.getBiome(b); + List structureConfigs = bio.getStructures(); + + if(structureConfigs.size() == 0) sender.sendMessage("No Structures"); + else { + sender.sendMessage("-------Structures-------"); + for(StructureConfig c : structureConfigs) { + sender.sendMessage(" - " + c.getID()); + } } + // Get snow info + BiomeSnowConfig snowConfig = bio.getSnow(); + StringBuilder snowMessage = new StringBuilder("----------Snow----------\n"); + int comp = snowConfig.getSnowChance(0); + int compHeight = 0; + boolean changed = false; + // Rebuild original snow data (rather than simply getting it, since it may have changed during initial assembly, if any overlaps occurred) + for(int i = 0; i <= 255; i++) { + int snow = snowConfig.getSnowChance(i); + if(snow != comp) { + changed = true; + snowMessage.append("Y=") + .append(compHeight) + .append("-") + .append(i) + .append(": ") + .append(comp) + .append("% snow\n"); + comp = snow; + compHeight = i; + } + } + if(!changed) { + snowMessage.append("Y=0") + .append("-255") + .append(": ") + .append(comp) + .append("% snow\n"); + } + sender.sendMessage(snowMessage.toString()); + + sender.sendMessage("Do snow: " + snowConfig.doSnow()); + return true; } diff --git a/src/main/java/com/dfsek/terra/population/SnowPopulator.java b/src/main/java/com/dfsek/terra/population/SnowPopulator.java index d9726c2d9..f4b3d48ac 100644 --- a/src/main/java/com/dfsek/terra/population/SnowPopulator.java +++ b/src/main/java/com/dfsek/terra/population/SnowPopulator.java @@ -1,10 +1,12 @@ package com.dfsek.terra.population; +import com.dfsek.terra.TerraProfiler; import com.dfsek.terra.TerraWorld; import com.dfsek.terra.biome.TerraBiomeGrid; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.config.base.ConfigUtil; +import com.dfsek.terra.config.genconfig.biome.BiomeConfig; import com.dfsek.terra.util.DataUtil; import org.bukkit.Bukkit; import org.bukkit.Chunk; @@ -15,6 +17,7 @@ import org.bukkit.block.data.BlockData; import org.jetbrains.annotations.NotNull; import org.polydev.gaea.generation.GenerationPhase; import org.polydev.gaea.population.GaeaBlockPopulator; +import org.polydev.gaea.profiler.ProfileFuture; import java.util.HashSet; import java.util.Random; @@ -43,22 +46,27 @@ public class SnowPopulator extends GaeaBlockPopulator { } @Override public void populate(@NotNull World world, @NotNull Random random, @NotNull Chunk chunk) { - int origX = chunk.getX() << 4; - int origZ = chunk.getZ() << 4; - TerraWorld w = TerraWorld.getWorld(world); - if(!w.isSafe()) return; - TerraBiomeGrid g = w.getGrid(); - for(int x = 0; x < 16; x++) { - for(int z = 0; z < 16; z++) { - int y; - Block b = null; - for(y = 254; y > 0; y--) { - b = chunk.getBlock(x, y, z); - if(!b.getType().isAir()) break; + try (ProfileFuture ignored = TerraProfiler.fromWorld(world).measure("SnowTime")) { + int origX = chunk.getX() << 4; + int origZ = chunk.getZ() << 4; + TerraWorld w = TerraWorld.getWorld(world); + if(! w.isSafe()) return; + TerraBiomeGrid g = w.getGrid(); + for(int x = 0; x < 16; x++) { + for(int z = 0; z < 16; z++) { + BiomeConfig biome = w.getConfig().getBiome((UserDefinedBiome) g.getBiome(origX + x, origZ + z, GenerationPhase.PALETTE_APPLY)); + if(!biome.getSnow().doSnow()) continue; + int y; + Block b = null; + for(y = 254; y > 0; y--) { + b = chunk.getBlock(x, y, z); + if(! b.getType().isAir()) break; + } + if(random.nextInt(100) >= biome.getSnow().getSnowChance(y)) + continue; + if(blacklistSpawn.contains(b.getType()) || b.isPassable()) continue; + chunk.getBlock(x, ++ y, z).setBlockData(DataUtil.SNOW); } - if(random.nextInt(100) >= w.getConfig().getBiome((UserDefinedBiome) g.getBiome(origX+x, origZ+z, GenerationPhase.PALETTE_APPLY)).getSnow().getSnowChance(y)) continue; - if(blacklistSpawn.contains(b.getType()) || b.isPassable()) continue; - chunk.getBlock(x, ++y, z).setBlockData(DataUtil.SNOW); } } }