From 2093c747c636ea2708d28e66ef402dd708cc7d49 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Thu, 19 Nov 2020 17:37:41 +0300 Subject: [PATCH] Weight tree & cleanup --- .../ru/betterend/blocks/basis/BlockBark.java | 1 - .../blocks/basis/BlockBookshelf.java | 1 - .../mixin/client/ModelLoaderMixin.java | 1 - .../java/ru/betterend/registry/EndBiomes.java | 3 + .../ru/betterend/world/biome/BiomeConfig.java | 3 +- .../ru/betterend/world/biome/EndBiome.java | 9 ++- .../world/generator/BiomePicker.java | 12 ++-- .../betterend/world/generator/WeighTree.java | 69 +++++++++++++++++++ 8 files changed, 83 insertions(+), 16 deletions(-) create mode 100644 src/main/java/ru/betterend/world/generator/WeighTree.java diff --git a/src/main/java/ru/betterend/blocks/basis/BlockBark.java b/src/main/java/ru/betterend/blocks/basis/BlockBark.java index 542716d5..94847b94 100644 --- a/src/main/java/ru/betterend/blocks/basis/BlockBark.java +++ b/src/main/java/ru/betterend/blocks/basis/BlockBark.java @@ -4,7 +4,6 @@ import java.io.Reader; import net.minecraft.util.Identifier; import net.minecraft.util.registry.Registry; - import ru.betterend.patterns.Patterns; public class BlockBark extends BlockPillar { diff --git a/src/main/java/ru/betterend/blocks/basis/BlockBookshelf.java b/src/main/java/ru/betterend/blocks/basis/BlockBookshelf.java index a0922b40..a2b7cce5 100644 --- a/src/main/java/ru/betterend/blocks/basis/BlockBookshelf.java +++ b/src/main/java/ru/betterend/blocks/basis/BlockBookshelf.java @@ -15,7 +15,6 @@ import net.minecraft.loot.context.LootContext; import net.minecraft.loot.context.LootContextParameters; import net.minecraft.util.Identifier; import net.minecraft.util.registry.Registry; - import ru.betterend.patterns.Patterns; public class BlockBookshelf extends BlockBase { diff --git a/src/main/java/ru/betterend/mixin/client/ModelLoaderMixin.java b/src/main/java/ru/betterend/mixin/client/ModelLoaderMixin.java index ed3c5e2e..174fc608 100644 --- a/src/main/java/ru/betterend/mixin/client/ModelLoaderMixin.java +++ b/src/main/java/ru/betterend/mixin/client/ModelLoaderMixin.java @@ -23,7 +23,6 @@ import net.minecraft.resource.Resource; import net.minecraft.resource.ResourceManager; import net.minecraft.util.Identifier; import net.minecraft.util.registry.Registry; - import ru.betterend.BetterEnd; import ru.betterend.interfaces.IdentifiedContext; import ru.betterend.patterns.Patterned; diff --git a/src/main/java/ru/betterend/registry/EndBiomes.java b/src/main/java/ru/betterend/registry/EndBiomes.java index 63ea561a..ad3d1f37 100644 --- a/src/main/java/ru/betterend/registry/EndBiomes.java +++ b/src/main/java/ru/betterend/registry/EndBiomes.java @@ -112,6 +112,9 @@ public class EndBiomes { } }); + LAND_BIOMES.rebuild(); + VOID_BIOMES.rebuild(); + LAND_BIOMES.getBiomes().forEach((endBiome) -> { Biome biome = biomeRegistry.get(endBiome.getID()); endBiome.setActualBiome(biome); diff --git a/src/main/java/ru/betterend/world/biome/BiomeConfig.java b/src/main/java/ru/betterend/world/biome/BiomeConfig.java index 76c21903..4f21c41b 100644 --- a/src/main/java/ru/betterend/world/biome/BiomeConfig.java +++ b/src/main/java/ru/betterend/world/biome/BiomeConfig.java @@ -3,10 +3,9 @@ package ru.betterend.world.biome; import org.jetbrains.annotations.Nullable; import net.minecraft.util.Identifier; - import ru.betterend.config.Config; -import ru.betterend.config.ConfigWriter; import ru.betterend.config.ConfigKeeper.Entry; +import ru.betterend.config.ConfigWriter; public class BiomeConfig extends Config { diff --git a/src/main/java/ru/betterend/world/biome/EndBiome.java b/src/main/java/ru/betterend/world/biome/EndBiome.java index f0761852..8460b2b6 100644 --- a/src/main/java/ru/betterend/world/biome/EndBiome.java +++ b/src/main/java/ru/betterend/world/biome/EndBiome.java @@ -10,8 +10,6 @@ import com.google.gson.JsonObject; import net.minecraft.structure.Structure; import net.minecraft.util.Identifier; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.WorldAccess; import net.minecraft.world.biome.Biome; import ru.betterend.util.JsonFactory; import ru.betterend.util.StructureHelper; @@ -53,9 +51,6 @@ public class EndBiome { readStructureList(); } - public void genSurfColumn(WorldAccess world, BlockPos pos, Random random) { - } - public EndBiome getEdge() { return edge == null ? this : edge; } @@ -166,4 +161,8 @@ public class EndBiome { public Biome getActualBiome() { return this.actualBiome; } + + public float getGenChance() { + return this.genChance; + } } diff --git a/src/main/java/ru/betterend/world/generator/BiomePicker.java b/src/main/java/ru/betterend/world/generator/BiomePicker.java index f7cfad46..15108bb8 100644 --- a/src/main/java/ru/betterend/world/generator/BiomePicker.java +++ b/src/main/java/ru/betterend/world/generator/BiomePicker.java @@ -8,7 +8,6 @@ import com.google.common.collect.Lists; import com.google.common.collect.Sets; import net.minecraft.util.Identifier; -import ru.betterend.registry.EndBiomes; import ru.betterend.world.biome.EndBiome; public class BiomePicker { @@ -17,6 +16,7 @@ public class BiomePicker { private float maxChanceUnmutable = 0; private float maxChance = 0; private int biomeCount = 0; + private WeighTree tree; public void addBiome(EndBiome biome) { maxChance = biome.mutateGenChance(maxChance); @@ -38,11 +38,7 @@ public class BiomePicker { } public EndBiome getBiome(Random random) { - float chance = random.nextFloat() * maxChance; - for (EndBiome biome: biomes) - if (biome.canGenerate(chance)) - return biome; - return EndBiomes.END; + return tree.getBiome(random.nextFloat() * maxChance); } public List getBiomes() { @@ -52,4 +48,8 @@ public class BiomePicker { public boolean containsImmutable(Identifier id) { return immutableIDs.contains(id); } + + public void rebuild() { + tree = new WeighTree(biomes); + } } diff --git a/src/main/java/ru/betterend/world/generator/WeighTree.java b/src/main/java/ru/betterend/world/generator/WeighTree.java new file mode 100644 index 00000000..50cf39aa --- /dev/null +++ b/src/main/java/ru/betterend/world/generator/WeighTree.java @@ -0,0 +1,69 @@ +package ru.betterend.world.generator; + +import java.util.List; + +import ru.betterend.world.biome.EndBiome; + +public class WeighTree { + private final Node root; + + public WeighTree(List biomes) { + root = getNode(biomes); + } + + public EndBiome getBiome(float value) { + return root.getBiome(value); + } + + private Node getNode(List biomes) { + int size = biomes.size(); + if (size == 1) { + return new Leaf(biomes.get(0)); + } + else if (size == 2) { + EndBiome first = biomes.get(0); + return new Branch(first.getGenChance(), new Leaf(first), new Leaf(biomes.get(1))); + } + else { + int index = size >> 1; + float separator = biomes.get(index).getGenChance(); + Node a = getNode(biomes.subList(0, index + 1)); + Node b = getNode(biomes.subList(index, size)); + return new Branch(separator, a, b); + } + } + + private abstract class Node { + abstract EndBiome getBiome(float value); + } + + private class Branch extends Node { + final float separator; + final Node min; + final Node max; + + public Branch(float separator, Node min, Node max) { + this.separator = separator; + this.min = min; + this.max = max; + } + + @Override + EndBiome getBiome(float value) { + return value < separator ? min.getBiome(value) : max.getBiome(value); + } + } + + private class Leaf extends Node { + final EndBiome biome; + + Leaf(EndBiome biome) { + this.biome = biome; + } + + @Override + EndBiome getBiome(float value) { + return biome; + } + } +}