From 76c11deca93394390b62ed7518f3422b692ba8a9 Mon Sep 17 00:00:00 2001 From: kuroppoi <68156848+kuroppoi@users.noreply.github.com> Date: Mon, 25 Oct 2021 17:02:23 +0200 Subject: [PATCH] Replaced WeightedList with a WeightedMap --- .../gameserver/loot/LootManager.java | 4 +- .../brainwine/gameserver/prefab/Prefab.java | 6 +- .../gameserver/util/WeightedList.java | 63 -------------- .../gameserver/util/WeightedMap.java | 82 +++++++++++++++++++ .../gameserver/zone/gen/CaveGenerator.java | 6 +- .../gameserver/zone/gen/GeneratorConfig.java | 14 ++-- .../zone/gen/StructureGenerator.java | 6 +- .../gen/caves/CandyCaneCaveDecorator.java | 4 +- .../zone/gen/caves/CrystalCaveDecorator.java | 4 +- .../zone/gen/caves/MushroomCaveDecorator.java | 4 +- .../gen/caves/RareCrystalCaveDecorator.java | 4 +- 11 files changed, 108 insertions(+), 89 deletions(-) delete mode 100644 gameserver/src/main/java/brainwine/gameserver/util/WeightedList.java create mode 100644 gameserver/src/main/java/brainwine/gameserver/util/WeightedMap.java diff --git a/gameserver/src/main/java/brainwine/gameserver/loot/LootManager.java b/gameserver/src/main/java/brainwine/gameserver/loot/LootManager.java index b0cdd6b..1c87094 100644 --- a/gameserver/src/main/java/brainwine/gameserver/loot/LootManager.java +++ b/gameserver/src/main/java/brainwine/gameserver/loot/LootManager.java @@ -14,7 +14,7 @@ import org.apache.logging.log4j.Logger; import com.fasterxml.jackson.core.type.TypeReference; -import brainwine.gameserver.util.WeightedList; +import brainwine.gameserver.util.WeightedMap; import brainwine.gameserver.zone.Biome; import brainwine.shared.JsonHelper; @@ -66,7 +66,7 @@ public class LootManager { } public Loot getRandomLoot(int level, Biome biome, String... categories) { - WeightedList weightedLoot = new WeightedList<>(); + WeightedMap weightedLoot = new WeightedMap<>(); List eligibleLoot = getEligibleLoot(level, biome, categories); for(Loot loot : eligibleLoot) { diff --git a/gameserver/src/main/java/brainwine/gameserver/prefab/Prefab.java b/gameserver/src/main/java/brainwine/gameserver/prefab/Prefab.java index 989ad6b..9f94580 100644 --- a/gameserver/src/main/java/brainwine/gameserver/prefab/Prefab.java +++ b/gameserver/src/main/java/brainwine/gameserver/prefab/Prefab.java @@ -10,7 +10,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import brainwine.gameserver.GameServer; import brainwine.gameserver.item.Item; -import brainwine.gameserver.util.WeightedList; +import brainwine.gameserver.util.WeightedMap; import brainwine.gameserver.zone.Block; @JsonIgnoreProperties(ignoreUnknown = true) @@ -32,7 +32,7 @@ public class Prefab { private boolean mirrorable; @JsonProperty("replace") - private Map> replacements = new HashMap<>(); + private Map> replacements = new HashMap<>(); @JsonProperty("corresponding_replace") private Map correspondingReplacements = new HashMap<>(); @@ -98,7 +98,7 @@ public class Prefab { return metadata; } - public Map> getReplacements() { + public Map> getReplacements() { return replacements; } diff --git a/gameserver/src/main/java/brainwine/gameserver/util/WeightedList.java b/gameserver/src/main/java/brainwine/gameserver/util/WeightedList.java deleted file mode 100644 index cd1dc92..0000000 --- a/gameserver/src/main/java/brainwine/gameserver/util/WeightedList.java +++ /dev/null @@ -1,63 +0,0 @@ -package brainwine.gameserver.util; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Random; - -import com.fasterxml.jackson.annotation.JsonCreator; - -import io.netty.util.internal.ThreadLocalRandom; - -public class WeightedList { - - private final List entries = new ArrayList<>(); - - @JsonCreator - public WeightedList(Map map) { - map.forEach((k, v) -> { - addEntry(k, v); - }); - } - - @JsonCreator - public WeightedList(List list) { - for(T t : list) { - addEntry(t, 1); - } - } - - public WeightedList() {} - - public WeightedList addEntry(T entry, int weight) { - for(int i = 0; i < weight; i++) { - entries.add(entry); - } - - return this; - } - - public T next() { - return next((T)null); - } - - public T next(T def) { - return next(ThreadLocalRandom.current(), def); - } - - public T next(Random random) { - return next(random, null); - } - - public T next(Random random, T def) { - if(entries.isEmpty()) { - return def; - } - - return entries.get(random.nextInt(entries.size())); - } - - public boolean isEmpty() { - return entries.isEmpty(); - } -} diff --git a/gameserver/src/main/java/brainwine/gameserver/util/WeightedMap.java b/gameserver/src/main/java/brainwine/gameserver/util/WeightedMap.java new file mode 100644 index 0000000..0969a1b --- /dev/null +++ b/gameserver/src/main/java/brainwine/gameserver/util/WeightedMap.java @@ -0,0 +1,82 @@ +package brainwine.gameserver.util; + +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Random; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; + +import io.netty.util.internal.ThreadLocalRandom; + +public class WeightedMap { + + @JsonValue + private final Map map = new HashMap<>(); + private int totalWeight; + + public WeightedMap() {} + + @JsonCreator + public WeightedMap(Collection entries) { + for(T entry : entries) { + addEntry(entry); + } + } + + @JsonCreator + public WeightedMap(Map map) { + map.forEach((entry, weight) -> { + addEntry(entry, weight); + }); + } + + public WeightedMap addEntry(T entry) { + return addEntry(entry, 1); + } + + public WeightedMap addEntry(T entry, int weight) { + if(weight > 0) { + map.put(entry, weight); + totalWeight += weight; + } + + return this; + } + + public boolean isEmpty() { + return map.isEmpty(); + } + + public T next() { + return next((T)null); + } + + public T next(T def) { + return next(ThreadLocalRandom.current(), def); + } + + public T next(Random random) { + return next(random, null); + } + + public T next(Random random, T def) { + if(!map.isEmpty()) { + int rolled = random.nextInt(totalWeight); + + for(Entry entry : map.entrySet()) { + int weight = entry.getValue(); + + if(rolled < weight) { + return entry.getKey(); + } + + rolled -= weight; + } + } + + return def; + } +} diff --git a/gameserver/src/main/java/brainwine/gameserver/zone/gen/CaveGenerator.java b/gameserver/src/main/java/brainwine/gameserver/zone/gen/CaveGenerator.java index 55f6ff4..52bfde9 100644 --- a/gameserver/src/main/java/brainwine/gameserver/zone/gen/CaveGenerator.java +++ b/gameserver/src/main/java/brainwine/gameserver/zone/gen/CaveGenerator.java @@ -7,14 +7,14 @@ import java.util.Queue; import brainwine.gameserver.item.Layer; import brainwine.gameserver.util.MathUtils; -import brainwine.gameserver.util.WeightedList; +import brainwine.gameserver.util.WeightedMap; import brainwine.gameserver.zone.gen.models.BlockPosition; import brainwine.gameserver.zone.gen.models.Cave; import brainwine.gameserver.zone.gen.models.StoneVariant; public class CaveGenerator implements GeneratorTask { - private final WeightedList stoneVariants; + private final WeightedMap stoneVariants; private final List decorators; public CaveGenerator(GeneratorConfig config) { @@ -182,7 +182,7 @@ public class CaveGenerator implements GeneratorTask { } private CaveDecorator getRandomEligibleDecorator(GeneratorContext ctx, int size, double depth) { - WeightedList list = new WeightedList<>(); + WeightedMap list = new WeightedMap<>(); for(CaveDecorator decorator : decorators) { if(size >= decorator.getMinSize() && size <= decorator.getMaxSize() && depth >= decorator.getMinDepth() && depth <= decorator.getMaxDepth()) { diff --git a/gameserver/src/main/java/brainwine/gameserver/zone/gen/GeneratorConfig.java b/gameserver/src/main/java/brainwine/gameserver/zone/gen/GeneratorConfig.java index 861f38b..f1c79e4 100644 --- a/gameserver/src/main/java/brainwine/gameserver/zone/gen/GeneratorConfig.java +++ b/gameserver/src/main/java/brainwine/gameserver/zone/gen/GeneratorConfig.java @@ -12,7 +12,7 @@ import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import brainwine.gameserver.item.Item; import brainwine.gameserver.prefab.Prefab; import brainwine.gameserver.util.Vector2i; -import brainwine.gameserver.util.WeightedList; +import brainwine.gameserver.util.WeightedMap; import brainwine.gameserver.zone.gen.models.BaseResourceType; import brainwine.gameserver.zone.gen.models.Deposit; import brainwine.gameserver.zone.gen.models.OreDeposit; @@ -34,10 +34,10 @@ public class GeneratorConfig { private Prefab[] uniqueStructures = {}; @JsonProperty("dungeons") - private WeightedList dungeons = new WeightedList<>(); + private WeightedMap dungeons = new WeightedMap<>(); @JsonProperty("spawn_towers") - private WeightedList spawnTowers = new WeightedList<>(); + private WeightedMap spawnTowers = new WeightedMap<>(); @JsonProperty("dungeon_region") private Vector2i dungeonRegion = new Vector2i(80, 64); @@ -46,7 +46,7 @@ public class GeneratorConfig { private double dungeonRate = 0.25; @JsonProperty("stone_variants") - private WeightedList stoneVariants = new WeightedList<>(); + private WeightedMap stoneVariants = new WeightedMap<>(); @JsonProperty("cave_types") @JsonDeserialize(using = CaveDecoratorListDeserializer.class) @@ -74,11 +74,11 @@ public class GeneratorConfig { return uniqueStructures; } - public WeightedList getDungeons() { + public WeightedMap getDungeons() { return dungeons; } - public WeightedList getSpawnTowers() { + public WeightedMap getSpawnTowers() { return spawnTowers; } @@ -90,7 +90,7 @@ public class GeneratorConfig { return dungeonRate; } - public WeightedList getStoneVariants() { + public WeightedMap getStoneVariants() { return stoneVariants; } diff --git a/gameserver/src/main/java/brainwine/gameserver/zone/gen/StructureGenerator.java b/gameserver/src/main/java/brainwine/gameserver/zone/gen/StructureGenerator.java index bb7943b..bd97ac2 100644 --- a/gameserver/src/main/java/brainwine/gameserver/zone/gen/StructureGenerator.java +++ b/gameserver/src/main/java/brainwine/gameserver/zone/gen/StructureGenerator.java @@ -3,14 +3,14 @@ package brainwine.gameserver.zone.gen; import brainwine.gameserver.item.Layer; import brainwine.gameserver.prefab.Prefab; import brainwine.gameserver.util.Vector2i; -import brainwine.gameserver.util.WeightedList; +import brainwine.gameserver.util.WeightedMap; import brainwine.gameserver.zone.Block; public class StructureGenerator implements GeneratorTask { private final Prefab[] uniqueStructures; - private final WeightedList dungeons; - private final WeightedList spawnTowers; + private final WeightedMap dungeons; + private final WeightedMap spawnTowers; private final Vector2i dungeonRegion; private final double dungeonRate; diff --git a/gameserver/src/main/java/brainwine/gameserver/zone/gen/caves/CandyCaneCaveDecorator.java b/gameserver/src/main/java/brainwine/gameserver/zone/gen/caves/CandyCaneCaveDecorator.java index eabd6f1..64291ad 100644 --- a/gameserver/src/main/java/brainwine/gameserver/zone/gen/caves/CandyCaneCaveDecorator.java +++ b/gameserver/src/main/java/brainwine/gameserver/zone/gen/caves/CandyCaneCaveDecorator.java @@ -6,7 +6,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import brainwine.gameserver.item.Item; import brainwine.gameserver.item.ItemRegistry; import brainwine.gameserver.item.Layer; -import brainwine.gameserver.util.WeightedList; +import brainwine.gameserver.util.WeightedMap; import brainwine.gameserver.zone.gen.CaveDecorator; import brainwine.gameserver.zone.gen.GeneratorContext; import brainwine.gameserver.zone.gen.models.BlockPosition; @@ -16,7 +16,7 @@ import brainwine.gameserver.zone.gen.models.Cave; public class CandyCaneCaveDecorator extends CaveDecorator { @JsonProperty("candy_canes") - private final WeightedList candyCanes = new WeightedList() + private final WeightedMap candyCanes = new WeightedMap() .addEntry(ItemRegistry.getItem("holiday/candy-cane-small"), 6) .addEntry(ItemRegistry.getItem("holiday/candy-cane-large"), 1); diff --git a/gameserver/src/main/java/brainwine/gameserver/zone/gen/caves/CrystalCaveDecorator.java b/gameserver/src/main/java/brainwine/gameserver/zone/gen/caves/CrystalCaveDecorator.java index f03b6f3..1c2b733 100644 --- a/gameserver/src/main/java/brainwine/gameserver/zone/gen/caves/CrystalCaveDecorator.java +++ b/gameserver/src/main/java/brainwine/gameserver/zone/gen/caves/CrystalCaveDecorator.java @@ -6,7 +6,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import brainwine.gameserver.item.Item; import brainwine.gameserver.item.ItemRegistry; import brainwine.gameserver.item.Layer; -import brainwine.gameserver.util.WeightedList; +import brainwine.gameserver.util.WeightedMap; import brainwine.gameserver.zone.gen.CaveDecorator; import brainwine.gameserver.zone.gen.GeneratorContext; import brainwine.gameserver.zone.gen.models.BlockPosition; @@ -16,7 +16,7 @@ import brainwine.gameserver.zone.gen.models.Cave; public class CrystalCaveDecorator extends CaveDecorator { @JsonProperty("crystals") - private final WeightedList crystals = new WeightedList() + private final WeightedMap crystals = new WeightedMap() .addEntry(ItemRegistry.getItem("ground/crystal-blue-1"), 16) .addEntry(ItemRegistry.getItem("ground/crystal-blue-3"), 16) .addEntry(ItemRegistry.getItem("ground/crystal-blue-2"), 4) diff --git a/gameserver/src/main/java/brainwine/gameserver/zone/gen/caves/MushroomCaveDecorator.java b/gameserver/src/main/java/brainwine/gameserver/zone/gen/caves/MushroomCaveDecorator.java index 944ddb7..d0ed408 100644 --- a/gameserver/src/main/java/brainwine/gameserver/zone/gen/caves/MushroomCaveDecorator.java +++ b/gameserver/src/main/java/brainwine/gameserver/zone/gen/caves/MushroomCaveDecorator.java @@ -4,7 +4,7 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; import brainwine.gameserver.item.Layer; -import brainwine.gameserver.util.WeightedList; +import brainwine.gameserver.util.WeightedMap; import brainwine.gameserver.zone.gen.CaveDecorator; import brainwine.gameserver.zone.gen.GeneratorContext; import brainwine.gameserver.zone.gen.models.BlockPosition; @@ -15,7 +15,7 @@ import brainwine.gameserver.zone.gen.models.MushroomType; public class MushroomCaveDecorator extends CaveDecorator { @JsonProperty("mushrooms") - private final WeightedList mushrooms = new WeightedList<>(); + private final WeightedMap mushrooms = new WeightedMap<>(); @JsonProperty("mushroom_chance") private double rate = 0.2; diff --git a/gameserver/src/main/java/brainwine/gameserver/zone/gen/caves/RareCrystalCaveDecorator.java b/gameserver/src/main/java/brainwine/gameserver/zone/gen/caves/RareCrystalCaveDecorator.java index 23ef2af..9dad9f1 100644 --- a/gameserver/src/main/java/brainwine/gameserver/zone/gen/caves/RareCrystalCaveDecorator.java +++ b/gameserver/src/main/java/brainwine/gameserver/zone/gen/caves/RareCrystalCaveDecorator.java @@ -5,7 +5,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import brainwine.gameserver.item.Item; import brainwine.gameserver.item.Layer; -import brainwine.gameserver.util.WeightedList; +import brainwine.gameserver.util.WeightedMap; import brainwine.gameserver.zone.gen.CaveDecorator; import brainwine.gameserver.zone.gen.GeneratorContext; import brainwine.gameserver.zone.gen.models.BlockPosition; @@ -15,7 +15,7 @@ import brainwine.gameserver.zone.gen.models.Cave; public class RareCrystalCaveDecorator extends CaveDecorator { @JsonProperty("crystals") - private final WeightedList crystals = new WeightedList<>(); + private final WeightedMap crystals = new WeightedMap<>(); @JsonProperty("crystal_chance") private double rate = 0.05;