diff --git a/src/main/java/forestry/apiculture/flowers/Flower.java b/src/main/java/forestry/apiculture/flowers/Flower.java index 523a19b77..be9e9fa2e 100644 --- a/src/main/java/forestry/apiculture/flowers/Flower.java +++ b/src/main/java/forestry/apiculture/flowers/Flower.java @@ -16,20 +16,22 @@ import net.minecraft.item.ItemStack; final class Flower implements Comparable { public final ItemStack item; - public final Double weight; - public final boolean isPlantable; + public Double weight; - public Flower(ItemStack item, double weight, boolean isPlantable) { + public Flower(ItemStack item, double weight) { this.item = item; this.weight = weight; - this.isPlantable = isPlantable; } + public boolean isPlantable() { + return this.weight != 0.0; + } + @Override public boolean equals(Object obj) { if (obj == null || !(obj instanceof Flower)) return false; - return StackUtils.isIdenticalItem(this.item, ((Flower) obj).item) && this.isPlantable == ((Flower) obj).isPlantable; + return StackUtils.isIdenticalItem(this.item, ((Flower) obj).item); } @Override diff --git a/src/main/java/forestry/apiculture/flowers/FlowerRegistry.java b/src/main/java/forestry/apiculture/flowers/FlowerRegistry.java index 88c39f675..ef877e7d8 100644 --- a/src/main/java/forestry/apiculture/flowers/FlowerRegistry.java +++ b/src/main/java/forestry/apiculture/flowers/FlowerRegistry.java @@ -32,12 +32,14 @@ public final class FlowerRegistry implements IFlowerRegistry { private final Map> registeredFlowers; private final Map> growthRules; + private final Map> chances; private boolean hasDepricatedFlowersImported; public FlowerRegistry() { this.registeredFlowers = new HashMap>(); this.growthRules = new HashMap>(); + this.chances = new HashMap>(); this.hasDepricatedFlowersImported = false; @@ -47,15 +49,15 @@ public final class FlowerRegistry implements IFlowerRegistry { @Override public void registerAcceptableFlower(ItemStack is, String... flowerTypes) { - registerFlower(is, null, false, flowerTypes); + registerFlower(is, null, flowerTypes); } @Override public void registerPlantableFlower(ItemStack is, double weight, String... flowerTypes) { - registerFlower(is, weight, true, flowerTypes); + registerFlower(is, weight, flowerTypes); } - private void registerFlower(ItemStack is, Double weight, boolean isPlantable, String... flowerTypes) { + private void registerFlower(ItemStack is, Double weight, String... flowerTypes) { if (is == null || is.getItem() == null) return; if (is.getItemDamage() == Short.MAX_VALUE || is.getItemDamage() == -1) @@ -65,17 +67,27 @@ public final class FlowerRegistry implements IFlowerRegistry { if (weight >= 1.0) weight = 1.0; - Flower newFlower = new Flower(is, weight, isPlantable); + Flower newFlower = new Flower(is, weight); + Integer index; + for (String flowerType : flowerTypes) { if (!this.registeredFlowers.containsKey(flowerType)) { this.registeredFlowers.put(flowerType, new ArrayList()); } - - if (!this.registeredFlowers.get(flowerType).contains(newFlower)) { + + index = this.registeredFlowers.get(flowerType).indexOf(flowerType); + if (index == -1) { this.registeredFlowers.get(flowerType).add(newFlower); - - Collections.sort(this.registeredFlowers.get(flowerType)); } + else if (this.registeredFlowers.get(flowerType).get(index).weight > newFlower.weight) { + this.registeredFlowers.get(flowerType).get(index).weight = newFlower.weight; + } + + if (this.chances.containsKey(flowerType)) { + this.chances.remove(flowerType); + } + + Collections.sort(this.registeredFlowers.get(flowerType)); } } @@ -136,16 +148,24 @@ public final class FlowerRegistry implements IFlowerRegistry { @Override public ItemStack getRandomPlantableFlower(String flowerType, Random rand) { - TreeMap tm = new TreeMap(); - double count = 0.0; - for (Flower f : this.registeredFlowers.get(flowerType)) { - if (f.isPlantable) { - tm.put(count, f); - count += f.weight; - } - } + TreeMap tm = getChancesMap(flowerType); + double maxKey = tm.lastKey() + 1.0; + return tm.get(tm.lowerKey(rand.nextDouble() * maxKey)).item; + } - return tm.get(tm.lowerKey(rand.nextDouble() * count)).item; + private TreeMap getChancesMap(String flowerType) { + if (!this.chances.containsKey(flowerType)) { + TreeMap tm = new TreeMap(); + double count = 0.0; + for (Flower f : this.registeredFlowers.get(flowerType)) { + if (f.isPlantable()) { + tm.put(count, f); + count += f.weight; + } + } + this.chances.put(flowerType, tm); + } + return this.chances.get(flowerType); } /*