From 0d93bec5e708d66a4b4954afddf24a6696f31a22 Mon Sep 17 00:00:00 2001 From: Adubbz Date: Tue, 26 Aug 2014 18:02:09 +1000 Subject: [PATCH] Fixed biome weights not working with non multiples of 10 --- .../world/gen/layer/GenLayerBiome.java.patch | 68 ++++-- .../minecraftforge/common/BiomeManager.java | 220 ++++++++++++++++-- 2 files changed, 244 insertions(+), 44 deletions(-) diff --git a/patches/minecraft/net/minecraft/world/gen/layer/GenLayerBiome.java.patch b/patches/minecraft/net/minecraft/world/gen/layer/GenLayerBiome.java.patch index 090061647..82aa2644d 100644 --- a/patches/minecraft/net/minecraft/world/gen/layer/GenLayerBiome.java.patch +++ b/patches/minecraft/net/minecraft/world/gen/layer/GenLayerBiome.java.patch @@ -1,6 +1,6 @@ --- ../src-base/minecraft/net/minecraft/world/gen/layer/GenLayerBiome.java +++ ../src-work/minecraft/net/minecraft/world/gen/layer/GenLayerBiome.java -@@ -1,29 +1,49 @@ +@@ -1,29 +1,52 @@ package net.minecraft.world.gen.layer; +import java.util.ArrayList; @@ -18,10 +18,7 @@ - private BiomeGenBase[] field_151621_d; - private BiomeGenBase[] field_151622_e; - private BiomeGenBase[] field_151620_f; -+ private List desertBiomes = new ArrayList(); -+ private List warmBiomes = new ArrayList(); -+ private List coolBiomes = new ArrayList(); -+ private List icyBiomes = new ArrayList(); ++ private List[] biomes = new ArrayList[BiomeManager.BiomeType.values().length]; + private static final String __OBFID = "CL_00000555"; @@ -36,60 +33,81 @@ this.field_75909_a = p_i2122_3_; - + -+ this.desertBiomes.addAll(BiomeManager.desertBiomes); -+ this.warmBiomes.addAll(BiomeManager.warmBiomes); -+ this.coolBiomes.addAll(BiomeManager.coolBiomes); -+ this.icyBiomes.addAll(BiomeManager.icyBiomes); ++ for (BiomeManager.BiomeType type : BiomeManager.BiomeType.values()) ++ { ++ com.google.common.collect.ImmutableList biomesToAdd = BiomeManager.getBiomes(type); ++ int idx = type.ordinal(); ++ ++ if (biomes[idx] == null) biomes[idx] = new ArrayList(); ++ if (biomesToAdd != null) biomes[idx].addAll(biomesToAdd); ++ } ++ ++ int desertIdx = BiomeManager.BiomeType.DESERT.ordinal(); + if (p_i2122_4_ == WorldType.field_77136_e) { - this.field_151623_c = new BiomeGenBase[] {BiomeGenBase.field_76769_d, BiomeGenBase.field_76767_f, BiomeGenBase.field_76770_e, BiomeGenBase.field_76780_h, BiomeGenBase.field_76772_c, BiomeGenBase.field_76768_g}; -+ desertBiomes.add(new BiomeEntry(BiomeGenBase.field_76769_d, 10)); -+ desertBiomes.add(new BiomeEntry(BiomeGenBase.field_76767_f, 10)); -+ desertBiomes.add(new BiomeEntry(BiomeGenBase.field_76770_e, 10)); -+ desertBiomes.add(new BiomeEntry(BiomeGenBase.field_76780_h, 10)); -+ desertBiomes.add(new BiomeEntry(BiomeGenBase.field_76772_c, 10)); -+ desertBiomes.add(new BiomeEntry(BiomeGenBase.field_76768_g, 10)); ++ biomes[desertIdx].add(new BiomeEntry(BiomeGenBase.field_76769_d, 10)); ++ biomes[desertIdx].add(new BiomeEntry(BiomeGenBase.field_76767_f, 10)); ++ biomes[desertIdx].add(new BiomeEntry(BiomeGenBase.field_76770_e, 10)); ++ biomes[desertIdx].add(new BiomeEntry(BiomeGenBase.field_76780_h, 10)); ++ biomes[desertIdx].add(new BiomeEntry(BiomeGenBase.field_76772_c, 10)); ++ biomes[desertIdx].add(new BiomeEntry(BiomeGenBase.field_76768_g, 10)); } + else + { -+ desertBiomes.add(new BiomeEntry(BiomeGenBase.field_76769_d, 30)); -+ desertBiomes.add(new BiomeEntry(BiomeGenBase.field_150588_X, 20)); -+ desertBiomes.add(new BiomeEntry(BiomeGenBase.field_76772_c, 10)); ++ biomes[desertIdx].add(new BiomeEntry(BiomeGenBase.field_76769_d, 30)); ++ biomes[desertIdx].add(new BiomeEntry(BiomeGenBase.field_150588_X, 20)); ++ biomes[desertIdx].add(new BiomeEntry(BiomeGenBase.field_76772_c, 10)); + } } public int[] func_75904_a(int p_75904_1_, int p_75904_2_, int p_75904_3_, int p_75904_4_) -@@ -63,7 +83,7 @@ +@@ -63,7 +86,7 @@ } else { - aint1[j1 + i1 * p_75904_3_] = this.field_151623_c[this.func_75902_a(this.field_151623_c.length)].field_76756_M; -+ aint1[j1 + i1 * p_75904_3_] = ((BiomeEntry)WeightedRandom.getItem(this.desertBiomes, (int)(this.nextLong(WeightedRandom.func_76272_a(this.desertBiomes) / 10) * 10))).biome.field_76756_M; ++ aint1[j1 + i1 * p_75904_3_] = getWeightedBiomeEntry(BiomeManager.BiomeType.DESERT).biome.field_76756_M; } } else if (k1 == 2) -@@ -74,7 +94,7 @@ +@@ -74,7 +97,7 @@ } else { - aint1[j1 + i1 * p_75904_3_] = this.field_151621_d[this.func_75902_a(this.field_151621_d.length)].field_76756_M; -+ aint1[j1 + i1 * p_75904_3_] = ((BiomeEntry)WeightedRandom.getItem(this.warmBiomes, (int)(this.nextLong(WeightedRandom.func_76272_a(this.warmBiomes) / 10) * 10))).biome.field_76756_M; ++ aint1[j1 + i1 * p_75904_3_] = getWeightedBiomeEntry(BiomeManager.BiomeType.WARM).biome.field_76756_M; } } else if (k1 == 3) -@@ -85,12 +105,12 @@ +@@ -85,12 +108,12 @@ } else { - aint1[j1 + i1 * p_75904_3_] = this.field_151622_e[this.func_75902_a(this.field_151622_e.length)].field_76756_M; -+ aint1[j1 + i1 * p_75904_3_] = ((BiomeEntry)WeightedRandom.getItem(this.coolBiomes, (int)(this.nextLong(WeightedRandom.func_76272_a(this.coolBiomes) / 10) * 10))).biome.field_76756_M; ++ aint1[j1 + i1 * p_75904_3_] = getWeightedBiomeEntry(BiomeManager.BiomeType.COOL).biome.field_76756_M; } } else if (k1 == 4) { - aint1[j1 + i1 * p_75904_3_] = this.field_151620_f[this.func_75902_a(this.field_151620_f.length)].field_76756_M; -+ aint1[j1 + i1 * p_75904_3_] = ((BiomeEntry)WeightedRandom.getItem(this.icyBiomes, (int)(this.nextLong(WeightedRandom.func_76272_a(this.icyBiomes) / 10) * 10))).biome.field_76756_M; ++ aint1[j1 + i1 * p_75904_3_] = getWeightedBiomeEntry(BiomeManager.BiomeType.ICY).biome.field_76756_M; } else { +@@ -101,4 +124,14 @@ + + return aint1; + } ++ ++ protected BiomeEntry getWeightedBiomeEntry(BiomeManager.BiomeType type) ++ { ++ List biomeList = biomes[type.ordinal()]; ++ int totalWeight = WeightedRandom.func_76272_a(biomeList); ++ int rand = func_75902_a(totalWeight / 10) * 10; ++ int weight = rand + (BiomeManager.isTypeListModded(type) ? func_75902_a(Math.min(10, totalWeight - rand)) : 0); ++ ++ return (BiomeEntry)WeightedRandom.getItem(biomeList, weight); ++ } + } diff --git a/src/main/java/net/minecraftforge/common/BiomeManager.java b/src/main/java/net/minecraftforge/common/BiomeManager.java index 86ce48878..ef5061bd6 100644 --- a/src/main/java/net/minecraftforge/common/BiomeManager.java +++ b/src/main/java/net/minecraftforge/common/BiomeManager.java @@ -1,22 +1,38 @@ package net.minecraftforge.common; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.Iterator; import java.util.List; +import com.google.common.collect.ImmutableList; + import net.minecraft.util.WeightedRandom; import net.minecraft.world.WorldType; import net.minecraft.world.biome.BiomeGenBase; import net.minecraft.world.gen.structure.MapGenVillage; import net.minecraft.world.biome.WorldChunkManager; +import net.minecraftforge.common.BiomeDictionary.Type; +import net.minecraftforge.common.util.EnumHelper; public class BiomeManager { - public static List desertBiomes = new ArrayList(); - public static List warmBiomes = new ArrayList(); - public static List coolBiomes = new ArrayList(); - public static List icyBiomes = new ArrayList(); + private static TrackedList[] biomes = setupBiomes(); + + /* + * These lists should no longer be accessed directly. Instead, use the appropriate add, remove and get methods within this class. + */ + @Deprecated + public static List desertBiomes = biomes[BiomeType.DESERT.ordinal()]; + @Deprecated + public static List warmBiomes = biomes[BiomeType.WARM.ordinal()]; + @Deprecated + public static List coolBiomes = biomes[BiomeType.COOL.ordinal()]; + @Deprecated + public static List icyBiomes = biomes[BiomeType.ICY.ordinal()]; + + private static boolean isModded = false; public static List oceanBiomes = new ArrayList(); @@ -25,25 +41,42 @@ public class BiomeManager static { - warmBiomes.add(new BiomeEntry(BiomeGenBase.forest, 10)); - warmBiomes.add(new BiomeEntry(BiomeGenBase.roofedForest, 10)); - warmBiomes.add(new BiomeEntry(BiomeGenBase.extremeHills, 10)); - warmBiomes.add(new BiomeEntry(BiomeGenBase.plains, 10)); - warmBiomes.add(new BiomeEntry(BiomeGenBase.birchForest, 10)); - warmBiomes.add(new BiomeEntry(BiomeGenBase.swampland, 10)); - - coolBiomes.add(new BiomeEntry(BiomeGenBase.forest, 10)); - coolBiomes.add(new BiomeEntry(BiomeGenBase.extremeHills, 10)); - coolBiomes.add(new BiomeEntry(BiomeGenBase.taiga, 10)); - coolBiomes.add(new BiomeEntry(BiomeGenBase.plains, 10)); - - icyBiomes.add(new BiomeEntry(BiomeGenBase.icePlains, 30)); - icyBiomes.add(new BiomeEntry(BiomeGenBase.coldTaiga, 10)); - oceanBiomes.add(BiomeGenBase.ocean); oceanBiomes.add(BiomeGenBase.deepOcean); oceanBiomes.add(BiomeGenBase.frozenOcean); } + + private static TrackedList[] setupBiomes() + { + TrackedList[] currentBiomes = new TrackedList[BiomeType.values().length]; + List list = new ArrayList(); + + list.add(new BiomeEntry(BiomeGenBase.forest, 10)); + list.add(new BiomeEntry(BiomeGenBase.roofedForest, 10)); + list.add(new BiomeEntry(BiomeGenBase.extremeHills, 10)); + list.add(new BiomeEntry(BiomeGenBase.plains, 10)); + list.add(new BiomeEntry(BiomeGenBase.birchForest, 10)); + list.add(new BiomeEntry(BiomeGenBase.swampland, 10)); + + currentBiomes[BiomeType.WARM.ordinal()] = new TrackedList(list); + list.clear(); + + list.add(new BiomeEntry(BiomeGenBase.forest, 10)); + list.add(new BiomeEntry(BiomeGenBase.extremeHills, 10)); + list.add(new BiomeEntry(BiomeGenBase.taiga, 10)); + list.add(new BiomeEntry(BiomeGenBase.plains, 10)); + + currentBiomes[BiomeType.COOL.ordinal()] = new TrackedList(list); + list.clear(); + + list.add(new BiomeEntry(BiomeGenBase.icePlains, 30)); + list.add(new BiomeEntry(BiomeGenBase.coldTaiga, 10)); + + currentBiomes[BiomeType.ICY.ordinal()] = new TrackedList(list); + list.clear(); + + return currentBiomes; + } @SuppressWarnings("unchecked") public static void addVillageBiome(BiomeGenBase biome, boolean canSpawn) @@ -99,6 +132,70 @@ public class BiomeManager } } + public static void addBiome(BiomeType type, BiomeEntry entry) + { + isModded = true; + + int idx = type.ordinal(); + List list = idx > biomes.length ? null : biomes[idx]; + if (list != null) list.add(entry); + } + + public static void removeBiome(BiomeType type, BiomeEntry entry) + { + isModded = true; + + int idx = type.ordinal(); + List list = idx > biomes.length ? null : biomes[idx]; + + if (list != null && list.contains(entry)) + { + list.remove(entry); + } + } + + public static ImmutableList getBiomes(BiomeType type) + { + int idx = type.ordinal(); + List list = idx > biomes.length ? null : biomes[idx]; + + return list != null ? ImmutableList.copyOf(list) : null; + } + + public static boolean isTypeListModded(BiomeType type) + { + int idx = type.ordinal(); + TrackedList list = idx > biomes.length ? null : biomes[idx]; + + if (list != null) return list.isModded(); + + return false; + } + + public static enum BiomeType + { + DESERT, WARM, COOL, ICY; + + public static BiomeType getType(String name) + { + name = name.toUpperCase(); + + for (BiomeType t : values()) + { + if (t.name().equals(name)) return t; + } + + BiomeType ret = EnumHelper.addEnum(BiomeType.class, name, BiomeType.class); + + if (ret.ordinal() >= biomes.length) + { + biomes = Arrays.copyOf(biomes, ret.ordinal()); + } + + return ret; + } + } + public static class BiomeEntry extends WeightedRandom.Item { public final BiomeGenBase biome; @@ -110,4 +207,89 @@ public class BiomeManager this.biome = biome; } } + + private static class TrackedList extends ArrayList + { + private boolean isModded = false; + + public TrackedList(Collection c) + { + super(c); + } + + @Override + public E set(int index, E element) + { + isModded = true; + return super.set(index, element); + } + + @Override + public boolean add(E e) + { + isModded = true; + return super.add(e); + } + + @Override + public void add(int index, E element) + { + isModded = true; + super.add(index, element); + } + + @Override + public E remove(int index) + { + isModded = true; + return super.remove(index); + } + + @Override + public boolean remove(Object o) + { + isModded = true; + return super.remove(o); + } + + @Override + public void clear() + { + isModded = true; + super.clear(); + } + + @Override + public boolean addAll(Collection c) + { + isModded = true; + return super.addAll(c); + } + + @Override + public boolean addAll(int index, Collection c) + { + isModded = true; + return super.addAll(index, c); + } + + @Override + public boolean removeAll(Collection c) + { + isModded = true; + return super.removeAll(c); + } + + @Override + public boolean retainAll(Collection c) + { + isModded = true; + return super.retainAll(c); + } + + public boolean isModded() + { + return isModded; + } + } } \ No newline at end of file