Hmm, thanks for trying that! I guess it's even more complicated... I'll take a deeper look.
EDIT 30 Jan 2014:
I have now also tried my theory, and I get the same result as you. I forgot to mention that the HELL and SKY biomes are removed from the list, so you should not visit them either. Here is the json file I used (note this still did not allow me to obtain the achievement). I also made sure I was in one of the right biomes before I logged out to update the file.
{"achievement.theEnd2":2,
"stat.useItem.119":21,
"stat.useItem.381":24,
"achievement.acquireIron":2,
"achievement.openInventory":29,
"stat.craftItem.278":16,
"achievement.exploreAllBiomes":{"value":0,
"progress":
["Ocean",
"Plains",
"Desert",
"Extreme Hills",
"Forest",
"Taiga",
"Swampland",
"River",
"FrozenOcean",
"FrozenRiver",
"Ice Plains",
"Ice Mountains",
"MushroomIsland",
"MushroomIslandShore",
"Beach",
"DesertHills",
"ForestHills",
"TaigaHills",
"Extreme Hills Edge",
"Jungle",
"JungleHills",
"JungleEdge",
"Deep Ocean",
"Stone Beach",
"Cold Beach",
"Birch Forest",
"Birch Forest Hills",
"Roofed Forest",
"Cold Taiga",
"Cold Taiga Hills",
"Mega Taiga",
"Mega Taiga Hills",
"Extreme Hills+",
"Savanna",
"Savanna Plateau",
"Mesa",
"Mesa Plateau F",
"Mesa Plateau"]
},
"stat.useItem.49":14,
"stat.useItem.259":1,
"stat.craftItem.58":16,
"stat.craftItem.5":256,
"achievement.portal":2,
"stat.flyOneCm":270343,
"achievement.buildWorkBench":32,
"achievement.buildPickaxe":32,
"achievement.buildFurnace":16,
"achievement.theEnd":1,
"stat.drop":8,
"achievement.diamonds":1,
"stat.useItem.120":31,
"achievement.buildBetterPickaxe":32,
"stat.playOneMinute":8204,
"stat.useItem.61":2,
"achievement.mineWood":1,
"stat.jump":11,
"stat.useItem.58":1,
"stat.mobKills":1,
"stat.craftItem.265":1,
"stat.walkOneCm":7139,
"stat.craftItem.61":8,
"stat.useItem.276":11,
"achievement.blazeRod":1}
The code concerning biome 161 appears to be a bit of a hack. The below code (from BiomeBase) creates all the "M" biomes.
/* 27: 60 */ private static final BiomeBase[] biomes = new BiomeBase[256];
/* 28: 61 */ public static final Set n = Sets.newHashSet();
/* <snip> */
static
/* 71: */ {
/* 72:129 */ PLAINS.k();
/* 73:130 */ DESERT.k();
/* 74:131 */ FOREST.k();
/* 75:132 */ TAIGA.k();
/* 76:133 */ SWAMPLAND.k();
/* 77:134 */ ICE_PLAINS.k();
/* 78:135 */ JUNGLE.k();
/* 79:136 */ JUNGLE_EDGE.k();
/* 80:137 */ COLD_TAIGA.k();
/* 81:138 */ SAVANNA.k();
/* 82:139 */ SAVANNA_PLATEAU.k();
/* 83:140 */ MESA.k();
/* 84:141 */ MESA_PLATEAU_F.k();
/* 85:142 */ MESA_PLATEAU.k();
/* 86:143 */ BIRCH_FOREST.k();
/* 87:144 */ BIRCH_FOREST_HILLS.k();
/* 88:145 */ ROOFED_FOREST.k();
/* 89:146 */ MEGA_TAIGA.k();
/* 90:147 */ EXTREME_HILLS.k();
/* 91:148 */ EXTREME_HILLS_PLUS.k();
/* 92: */
/* 93: */
/* 94:151 */ biomes[(MEGA_TAIGA_HILLS.id + 128)] = biomes[(MEGA_TAIGA.id + 128)];
/* 95:153 */ for (BiomeBase localBiomeBase : biomes) {
/* 96:154 */ if ((localBiomeBase != null) && (localBiomeBase.id < 128)) {
/* 97:155 */ n.add(localBiomeBase);
/* 98: */ }
/* 99: */ }
/* 100:159 */ n.remove(HELL);
/* 101:160 */ n.remove(SKY);
/* 102: */ }
The subroutine "k()" is responsible for creating all of the "M" biomes except for the MEGA_TAIGA_HILLS one. It results in constructing a new BiomeBase object with the new id (normal biome + 128). It appears as if an attempt has been made to create an "M" version of MEGA_TAIGA_HILLS which is identical to the "M" version of MEGA_TAIGA, however as this is done with just the assignment in the above code. A new BiomeBase object is not created and so the biome does not have a new id.
That is "BiomeBase.biomes[161].id == 160". Pretty sure that's a bug right there 😉
However, it is not what is stopping the achievement from being gained! It is the HashSet named "n" in the code above which is used to check if all biomes have been visited. Only biomes with id < 128 are added.
The bug preventing the biome achievement from being set is actually a bit more tricky. See the below code snippet from EntityPlayer.
/* 312: */ protected void j()
/* 313: */ {
/* 314: 303 */ BiomeBase biomebase = this.world.getBiome(MathHelper.floor(this.locX), MathHelper.floor(this.locZ));
/* 315: 305 */ if (biomebase != null)
/* 316: */ {
/* 317: 306 */ String s = biomebase.af;
/* 318: 307 */ AchievementSet achievementset = (AchievementSet)x().b(AchievementList.L);
/* 319: 309 */ if (achievementset == null) {
/* 320: 310 */ achievementset = (AchievementSet)x().a(AchievementList.L, new AchievementSet());
/* 321: */ }
/* 322: 313 */ achievementset.add(s);
/* 323: 314 */ if ((x().b(AchievementList.L)) && (achievementset.size() == BiomeBase.n.size()))
/* 324: */ {
/* 325: 315 */ HashSet hashset = Sets.newHashSet(BiomeBase.n);
/* 326: 316 */ Iterator iterator = achievementset.iterator();
/* 327: 318 */ while (iterator.hasNext())
/* 328: */ {
/* 329: 319 */ String s1 = (String)iterator.next();
/* 330: 320 */ Iterator iterator1 = hashset.iterator();
/* 331: 322 */ while (iterator1.hasNext())
/* 332: */ {
/* 333: 323 */ BiomeBase biomebase1 = (BiomeBase)iterator1.next();
/* 334: 325 */ if (biomebase1.af.equals(s1)) {
/* 335: 326 */ iterator1.remove();
/* 336: */ }
/* 337: */ }
/* 338: 330 */ if (hashset.isEmpty()) {
/* 339: */ break;
/* 340: */ }
/* 341: */ }
/* 342: 335 */ if (hashset.isEmpty()) {
/* 343: 336 */ a(AchievementList.L);
/* 344: */ }
/* 345: */ }
/* 346: */ }
/* 347: */ }
Forgive me if I have read it all wrong (decompiled code isn't the easiest to work with) but I believe the error (or at least an error) is the check "achievementset.size() == BiomeBase.n.size()". Every biome is added to achievementset but only those with id < 128 are added to BiomeBase.n. So the size and contents of these can only be equal if you visit every biome with id < 128 WITHOUT visiting any biome with id > 128. I'd be interested to know if someone could test this theory by editing their json file.
So this is not 1 bug but 3.
1) Not all biomes generate (10 "Frozen Ocean" and 20 "Extreme Hills Edge") – yet they are checked for in this achievement
2) The id of biome 161 is wrong "BiomeBase.biomes[161].id == 160"
3) All biomes are stored in the achievement set yet only those with id < 128 are expected.
There are 2 possible solutions to the last bug (which is actually prevent the achievement).
1) If it is intentional that players do not have to visit the "M" biomes for the achievement: biomes with id < 128 should not be added to the achievementset.
2) Otherwise, ALL biomes should be added to "BiomeBaes.n"
I hope this information and code snippets is useful in fixing these 3 issues 🙂
I also have a similar problem with the spawner not giving loot on an older Bedrock server. This affects all players in the world and not just me.