diff --git a/build.gradle b/build.gradle index 7d6cc87d0..cd9c75fdf 100644 --- a/build.gradle +++ b/build.gradle @@ -18,7 +18,7 @@ version = '1.0.0' project(':mcp') { apply plugin: 'net.minecraftforge.gradle.forgedev.mcp' mcp { - config = 'de.oceanlabs.mcp:mcp_config:1.13@zip' + config = 'de.oceanlabs.mcp:mcp_config:1.13-2018.08.19.04.56.08@zip' pipeline = 'joined' } } @@ -73,13 +73,17 @@ project(':forge') { srgPatches = false clientRun { main = 'net.minecraftforge.fml.LaunchTesting' - env = [ + environment = [ target: 'fmldevclient' ] + properties = [ + target: 'fmldevclient', + assetDirectory: downloadAssets.output + ] } serverRun { main = 'net.minecraftforge.fml.LaunchTesting' - env = [ + environment = [ target: 'fmldevserver' ] } diff --git a/patches/minecraft/net/minecraft/item/ItemStack.java.patch b/patches/minecraft/net/minecraft/item/ItemStack.java.patch index 3bd1c3fb5..08545dc94 100644 --- a/patches/minecraft/net/minecraft/item/ItemStack.java.patch +++ b/patches/minecraft/net/minecraft/item/ItemStack.java.patch @@ -5,7 +5,7 @@ import org.apache.logging.log4j.Logger; -public final class ItemStack { -+public final class ItemStack extends net.minecraftforge.common.capabilities.CapabilityProvider implements net.minecraftforge.common.capabilities.ICapabilitySerializable { ++public final class ItemStack extends net.minecraftforge.common.capabilities.CapabilityProvider implements net.minecraftforge.common.capabilities.ICapabilitySerializable, net.minecraftforge.common.extensions.IForgeItemStack { private static final Logger field_199558_c = LogManager.getLogger(); public static final ItemStack EMPTY = new ItemStack((Item)null); public static final DecimalFormat DECIMALFORMAT = func_208306_D(); diff --git a/patches/minecraft/net/minecraft/item/crafting/IRecipeHidden.java.patch b/patches/minecraft/net/minecraft/item/crafting/IRecipeHidden.java.patch new file mode 100644 index 000000000..b26f8939c --- /dev/null +++ b/patches/minecraft/net/minecraft/item/crafting/IRecipeHidden.java.patch @@ -0,0 +1,11 @@ +--- a/net/minecraft/item/crafting/IRecipeHidden.java ++++ b/net/minecraft/item/crafting/IRecipeHidden.java +@@ -3,7 +3,7 @@ + import net.minecraft.item.ItemStack; + import net.minecraft.util.ResourceLocation; + +-public abstract class IRecipeHidden implements IRecipe { ++public abstract class IRecipeHidden extends net.minecraftforge.registries.ForgeRegistryEntry implements IRecipe { + private final ResourceLocation field_199563_a; + + public IRecipeHidden(ResourceLocation p_i48169_1_) { diff --git a/patches/minecraft/net/minecraft/tileentity/TileEntityBrewingStand.java.patch b/patches/minecraft/net/minecraft/tileentity/TileEntityBrewingStand.java.patch new file mode 100644 index 000000000..b04631940 --- /dev/null +++ b/patches/minecraft/net/minecraft/tileentity/TileEntityBrewingStand.java.patch @@ -0,0 +1,83 @@ +--- a/net/minecraft/tileentity/TileEntityBrewingStand.java ++++ b/net/minecraft/tileentity/TileEntityBrewingStand.java +@@ -133,6 +133,7 @@ + + private boolean canBrew() { + ItemStack itemstack = this.brewingItemStacks.get(3); ++ if (!itemstack.isEmpty()) return net.minecraftforge.common.brewing.BrewingRecipeRegistry.canBrew(brewingItemStacks, itemstack, OUTPUT_SLOTS); // divert to VanillaBrewingRegistry + if (itemstack.isEmpty()) { + return false; + } else if (!PotionBrewing.isReagent(itemstack)) { +@@ -150,16 +151,15 @@ + } + + private void brewPotions() { ++ if (net.minecraftforge.event.ForgeEventFactory.onPotionAttemptBrew(brewingItemStacks)) return; + ItemStack itemstack = this.brewingItemStacks.get(3); + +- for(int i = 0; i < 3; ++i) { +- this.brewingItemStacks.set(i, PotionBrewing.doReaction(itemstack, this.brewingItemStacks.get(i))); +- } ++ net.minecraftforge.common.brewing.BrewingRecipeRegistry.brewPotions(brewingItemStacks, itemstack, OUTPUT_SLOTS); + + itemstack.shrink(1); + BlockPos blockpos = this.getPos(); +- if (itemstack.getItem().hasContainerItem()) { +- ItemStack itemstack1 = new ItemStack(itemstack.getItem().getContainerItem()); ++ if (itemstack.hasContainerItem()) { ++ ItemStack itemstack1 = itemstack.getContainerItem(); + if (itemstack.isEmpty()) { + itemstack = itemstack1; + } else { +@@ -169,6 +169,7 @@ + + this.brewingItemStacks.set(3, itemstack); + this.world.playEvent(1035, blockpos, 0); ++ net.minecraftforge.event.ForgeEventFactory.onPotionBrewed(brewingItemStacks); + } + + public void readFromNBT(NBTTagCompound compound) { +@@ -234,13 +235,13 @@ + + public boolean isItemValidForSlot(int index, ItemStack stack) { + if (index == 3) { +- return PotionBrewing.isReagent(stack); ++ return net.minecraftforge.common.brewing.BrewingRecipeRegistry.isValidIngredient(stack); + } else { + Item item = stack.getItem(); + if (index == 4) { + return item == Items.BLAZE_POWDER; + } else { +- return (item == Items.POTIONITEM || item == Items.SPLASH_POTION || item == Items.LINGERING_POTION || item == Items.GLASS_BOTTLE) && this.getStackInSlot(index).isEmpty(); ++ return net.minecraftforge.common.brewing.BrewingRecipeRegistry.isValidInput(stack) && this.getStackInSlot(index).isEmpty(); + } + } + } +@@ -302,4 +303,27 @@ + public void clear() { + this.brewingItemStacks.clear(); + } ++ ++ net.minecraftforge.common.capabilities.OptionalCapabilityInstance[] handlers = ++ net.minecraftforge.items.wrapper.SidedInvWrapper.create(this, EnumFacing.UP, EnumFacing.DOWN, EnumFacing.NORTH); ++ ++ @Override ++ public net.minecraftforge.common.capabilities.OptionalCapabilityInstance getCapability(net.minecraftforge.common.capabilities.Capability capability, @Nullable EnumFacing facing) { ++ if (facing != null && capability == net.minecraftforge.items.CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) { ++ if (facing == EnumFacing.UP) ++ return handlers[0].cast(); ++ else if (facing == EnumFacing.UP) ++ return handlers[1].cast(); ++ else ++ return handlers[2].cast(); ++ } ++ return super.getCapability(capability, facing); ++ } ++ ++ @Override ++ public void invalidate() { ++ super.invalidate(); ++ for (int x = 0; x < handlers.length; x++) ++ handlers[x].invalidate(); ++ } + } diff --git a/src/main/java/net/minecraftforge/client/ClientCommandHandler.java b/src/main/java/net/minecraftforge/client/ClientCommandHandler.java deleted file mode 100644 index 1b3f813fd..000000000 --- a/src/main/java/net/minecraftforge/client/ClientCommandHandler.java +++ /dev/null @@ -1,168 +0,0 @@ -/* - * Minecraft Forge - * Copyright (c) 2016-2018. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation version 2.1 - * of the License. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -package net.minecraftforge.client; - -import java.util.List; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.GuiChat; -import net.minecraft.command.CommandException; -import net.minecraft.command.CommandHandler; -import net.minecraft.command.ICommand; -import net.minecraft.command.ICommandSender; -import net.minecraft.command.WrongUsageException; -import net.minecraft.server.MinecraftServer; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.event.CommandEvent; -import net.minecraftforge.fml.client.FMLClientHandler; -import net.minecraft.util.text.TextComponentTranslation; -import net.minecraft.util.text.TextFormatting; -import net.minecraftforge.fml.common.FMLLog; - -import static net.minecraft.util.text.TextFormatting.*; - -/** - * The class that handles client-side chat commands. You should register any - * commands that you want handled on the client with this command handler. - * - * If there is a command with the same name registered both on the server and - * client, the client takes precedence! - * - */ -public class ClientCommandHandler {} /*extends CommandHandler -{ - public static final ClientCommandHandler instance = new ClientCommandHandler(); - - public String[] latestAutoComplete = null; - - /** - * @return 1 if successfully executed, -1 if no permission or wrong usage, - * 0 if it doesn't exist or it was canceled (it's sent to the server) - * / - @Override - public int executeCommand(ICommandSender sender, String message) - { - message = message.trim(); - - boolean usedSlash = message.startsWith("/"); - if (usedSlash) - { - message = message.substring(1); - } - - String[] temp = message.split(" "); - String[] args = new String[temp.length - 1]; - String commandName = temp[0]; - System.arraycopy(temp, 1, args, 0, args.length); - ICommand icommand = getCommands().get(commandName); - - try - { - if (icommand == null || (!usedSlash && icommand instanceof IClientCommand && !((IClientCommand)icommand).allowUsageWithoutPrefix(sender, message))) - { - return 0; - } - - if (icommand.checkPermission(this.getServer(), sender)) - { - CommandEvent event = new CommandEvent(icommand, sender, args); - if (MinecraftForge.EVENT_BUS.post(event)) - { - if (event.getException() != null) - { - throw event.getException(); - } - return 0; - } - - this.tryExecute(sender, args, icommand, message); - return 1; - } - else - { - sender.sendMessage(format(RED, "commands.generic.permission")); - } - } - catch (WrongUsageException wue) - { - sender.sendMessage(format(RED, "commands.generic.usage", format(RED, wue.getMessage(), wue.getErrorObjects()))); - } - catch (CommandException ce) - { - sender.sendMessage(format(RED, ce.getMessage(), ce.getErrorObjects())); - } - catch (Throwable t) - { - sender.sendMessage(format(RED, "commands.generic.exception")); - FMLLog.log.error("Command '{}' threw an exception:", message, t); - } - - return -1; - } - - //Couple of helpers because the mcp names are stupid and long... - private TextComponentTranslation format(TextFormatting color, String str, Object... args) - { - TextComponentTranslation ret = new TextComponentTranslation(str, args); - ret.getStyle().setColor(color); - return ret; - } - - public void autoComplete(String leftOfCursor) - { - latestAutoComplete = null; - - if (leftOfCursor.charAt(0) == '/') - { - leftOfCursor = leftOfCursor.substring(1); - - Minecraft mc = FMLClientHandler.instance().getClient(); - if (mc.currentScreen instanceof GuiChat) - { - List commands = getTabCompletions(mc.player, leftOfCursor, mc.player.getPosition()); - if (!commands.isEmpty()) - { - if (leftOfCursor.indexOf(' ') == -1) - { - for (int i = 0; i < commands.size(); i++) - { - commands.set(i, GRAY + "/" + commands.get(i) + RESET); - } - } - else - { - for (int i = 0; i < commands.size(); i++) - { - commands.set(i, GRAY + commands.get(i) + RESET); - } - } - - latestAutoComplete = commands.toArray(new String[commands.size()]); - } - } - } - } - - @Override - protected MinecraftServer getServer() { - return Minecraft.getMinecraft().getIntegratedServer(); - } -} -*/ diff --git a/src/main/java/net/minecraftforge/client/IClientCommand.java b/src/main/java/net/minecraftforge/client/IClientCommand.java deleted file mode 100644 index 50aee5002..000000000 --- a/src/main/java/net/minecraftforge/client/IClientCommand.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Minecraft Forge - * Copyright (c) 2016-2018. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation version 2.1 - * of the License. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -package net.minecraftforge.client; - -import net.minecraft.command.ICommand; -import net.minecraft.command.ICommandSender; - -/** - * Client-side commands can implement this interface to allow additional control over when the command may be used. - */ -public interface IClientCommand extends ICommand -{ - - /** - * Determine whether this command can be used without the "/" prefix. By default this is true. - * @param sender the command sender - * @param message the message, without potential prefix - * @return true to allow the usage of this command without the prefix - */ - boolean allowUsageWithoutPrefix(ICommandSender sender, String message); - -} diff --git a/src/main/java/net/minecraftforge/common/BiomeDictionary.java b/src/main/java/net/minecraftforge/common/BiomeDictionary.java index 9e76e5237..c79c79203 100644 --- a/src/main/java/net/minecraftforge/common/BiomeDictionary.java +++ b/src/main/java/net/minecraftforge/common/BiomeDictionary.java @@ -23,13 +23,15 @@ import java.util.*; import java.util.stream.Collectors; import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import net.minecraft.init.Biomes; -import net.minecraft.init.Blocks; import net.minecraft.util.ResourceLocation; import net.minecraft.world.biome.*; import static net.minecraftforge.common.BiomeDictionary.Type.*; -import net.minecraftforge.fml.common.FMLLog; import net.minecraftforge.registries.ForgeRegistries; import com.google.common.base.Preconditions; @@ -38,6 +40,7 @@ import com.google.common.collect.ImmutableList; public class BiomeDictionary { private static final boolean DEBUG = false; + private static final Logger LOGGER = LogManager.getLogger(); public static final class Type { @@ -106,11 +109,6 @@ public class BiomeDictionary byName.put(name, this); } - private boolean hasSubTypes() - { - return !subTypes.isEmpty(); - } - /** * Gets the name for this type. */ @@ -151,7 +149,7 @@ public class BiomeDictionary } return t; } - + /** * @return An unmodifiable collection of all current biome types. */ @@ -159,6 +157,16 @@ public class BiomeDictionary { return allTypes; } + + @Nullable + public static Type fromVanilla(Biome.Category category) + { + if (category == Biome.Category.NONE) + return null; + if (category == Biome.Category.THEEND) + return VOID; + return getType(category.name()); + } } private static final Map biomeInfoMap = new HashMap(); @@ -262,28 +270,10 @@ public class BiomeDictionary */ public static void makeBestGuess(Biome biome) { - if (biome.decorator.treesPerChunk >= 3) + Type type = Type.fromVanilla(biome.func_201856_r()); + if (type != null) { - if (biome.isHighHumidity() && biome.getDefaultTemperature() >= 0.9F) - { - BiomeDictionary.addTypes(biome, JUNGLE); - } - else if (!biome.isHighHumidity()) - { - BiomeDictionary.addTypes(biome, FOREST); - - if (biome.getDefaultTemperature() <= 0.2f) - { - BiomeDictionary.addTypes(biome, CONIFEROUS); - } - } - } - else if (biome.getHeightVariation() <= 0.3F && biome.getHeightVariation() >= 0.0F) - { - if (!biome.isHighHumidity() || biome.getBaseHeight() >= 0.0F) - { - BiomeDictionary.addTypes(biome, PLAINS); - } + BiomeDictionary.addTypes(biome, type); } if (biome.getRainfall() > 0.85f) @@ -306,15 +296,6 @@ public class BiomeDictionary BiomeDictionary.addTypes(biome, COLD); } - if (biome.decorator.treesPerChunk > 0 && biome.decorator.treesPerChunk < 3) - { - BiomeDictionary.addTypes(biome, SPARSE); - } - else if (biome.decorator.treesPerChunk >= 10) - { - BiomeDictionary.addTypes(biome, DENSE); - } - if (biome.isHighHumidity() && biome.getBaseHeight() < 0.0F && (biome.getHeightVariation() <= 0.3F && biome.getHeightVariation() >= 0.0F)) { BiomeDictionary.addTypes(biome, SWAMP); @@ -341,29 +322,6 @@ public class BiomeDictionary { BiomeDictionary.addTypes(biome, MOUNTAIN); } - - if (biome.getEnableSnow()) - { - BiomeDictionary.addTypes(biome, SNOWY); - } - - if (biome.topBlock.getBlock() != Blocks.SAND && biome.getDefaultTemperature() >= 1.0f && biome.getRainfall() < 0.2f) - { - BiomeDictionary.addTypes(biome, SAVANNA); - } - - if (biome.topBlock.getBlock() == Blocks.SAND) - { - BiomeDictionary.addTypes(biome, SANDY); - } - else if (biome.topBlock.getBlock() == Blocks.MYCELIUM) - { - BiomeDictionary.addTypes(biome, MUSHROOM); - } - if (biome.fillerBlock.getBlock() == Blocks.HARDENED_CLAY) - { - BiomeDictionary.addTypes(biome, MESA); - } } //Internal implementation @@ -380,7 +338,7 @@ public class BiomeDictionary if (!hasAnyType(biome)) { makeBestGuess(biome); - FMLLog.log.warn("No types have been added to Biome {}, types have been assigned on a best-effort guess: {}", biome.getRegistryName(), getTypes(biome)); + LOGGER.warn("No types have been added to Biome {}, types have been assigned on a best-effort guess: {}", biome.getRegistryName(), getTypes(biome)); } } @@ -446,6 +404,17 @@ public class BiomeDictionary addTypes(Biomes.MESA, MESA, SANDY ); addTypes(Biomes.MESA_ROCK, MESA, SPARSE, SANDY ); addTypes(Biomes.MESA_CLEAR_ROCK, MESA, SANDY ); + addTypes(Biomes.field_201936_P, END ); + addTypes(Biomes.field_201937_Q, END ); + addTypes(Biomes.field_201938_R, END ); + addTypes(Biomes.field_201939_S, END ); + addTypes(Biomes.field_203614_T, OCEAN, HOT ); + addTypes(Biomes.field_203615_U, OCEAN ); + addTypes(Biomes.field_203616_V, OCEAN, COLD ); + addTypes(Biomes.field_203617_W, OCEAN, HOT ); + addTypes(Biomes.field_203618_X, OCEAN ); + addTypes(Biomes.field_203619_Y, OCEAN, COLD ); + addTypes(Biomes.field_203620_Z, OCEAN, COLD ); addTypes(Biomes.VOID, VOID ); addTypes(Biomes.MUTATED_PLAINS, PLAINS, RARE ); addTypes(Biomes.MUTATED_DESERT, HOT, DRY, SANDY, RARE ); @@ -472,13 +441,10 @@ public class BiomeDictionary if (DEBUG) { - FMLLog.log.debug("BiomeDictionary:"); - for (Type type : Type.byName.values()) - { - StringBuilder buf = new StringBuilder(); - buf.append(" ").append(type.name).append(": ").append(type.biomes.stream().map(Biome::getBiomeName).collect(Collectors.joining(", "))); - FMLLog.log.debug(buf.toString()); - } + StringBuilder buf = new StringBuilder(); + buf.append("BiomeDictionary:\n"); + Type.byName.forEach((name, type) -> buf.append(" ").append(type.name).append(": ").append(type.biomes.stream().map(b -> b.getRegistryName().toString()).collect(Collectors.joining(", "))).append('\n')); + LOGGER.debug(buf.toString()); } } } diff --git a/src/main/java/net/minecraftforge/common/BiomeManager.java b/src/main/java/net/minecraftforge/common/BiomeManager.java index 7521aaada..d1b0d2607 100644 --- a/src/main/java/net/minecraftforge/common/BiomeManager.java +++ b/src/main/java/net/minecraftforge/common/BiomeManager.java @@ -20,7 +20,6 @@ package net.minecraftforge.common; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collection; import java.util.List; @@ -29,9 +28,7 @@ import com.google.common.collect.ImmutableList; import net.minecraft.init.Biomes; import net.minecraft.util.WeightedRandom; import net.minecraft.world.biome.Biome; -import net.minecraft.world.biome.BiomeProvider; -import net.minecraft.world.gen.structure.MapGenVillage; -import net.minecraftforge.common.util.EnumHelper; +import net.minecraft.world.biome.provider.BiomeProvider; import javax.annotation.Nullable; @@ -41,9 +38,6 @@ public class BiomeManager public static List oceanBiomes = new ArrayList(); - public static ArrayList strongHoldBiomes = new ArrayList(); - public static ArrayList strongHoldBiomesBlackList = new ArrayList(); - static { oceanBiomes.add(Biomes.OCEAN); @@ -86,55 +80,19 @@ public class BiomeManager return currentBiomes; } - public static void addVillageBiome(Biome biome, boolean canSpawn) - { - if (!MapGenVillage.VILLAGE_SPAWN_BIOMES.contains(biome)) - { - ArrayList biomes = new ArrayList(MapGenVillage.VILLAGE_SPAWN_BIOMES); - biomes.add(biome); - MapGenVillage.VILLAGE_SPAWN_BIOMES = biomes; - } - } - - public static void removeVillageBiome(Biome biome) - { - if (MapGenVillage.VILLAGE_SPAWN_BIOMES.contains(biome)) - { - ArrayList biomes = new ArrayList(MapGenVillage.VILLAGE_SPAWN_BIOMES); - biomes.remove(biome); - MapGenVillage.VILLAGE_SPAWN_BIOMES = biomes; - } - } - - public static void addStrongholdBiome(Biome biome) - { - if (!strongHoldBiomes.contains(biome)) - { - strongHoldBiomes.add(biome); - } - } - - public static void removeStrongholdBiome(Biome biome) - { - if (!strongHoldBiomesBlackList.contains(biome)) - { - strongHoldBiomesBlackList.add(biome); - } - } - public static void addSpawnBiome(Biome biome) { - if (!BiomeProvider.allowedBiomes.contains(biome)) + if (!BiomeProvider.field_201540_a.contains(biome)) { - BiomeProvider.allowedBiomes.add(biome); + BiomeProvider.field_201540_a.add(biome); } } public static void removeSpawnBiome(Biome biome) { - if (BiomeProvider.allowedBiomes.contains(biome)) + if (BiomeProvider.field_201540_a.contains(biome)) { - BiomeProvider.allowedBiomes.remove(biome); + BiomeProvider.field_201540_a.remove(biome); } } @@ -179,23 +137,8 @@ public class BiomeManager { 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, new Class[0], new Object[0]); - - if (ret.ordinal() >= biomes.length) - { - biomes = Arrays.copyOf(biomes, ret.ordinal() + 1); - } - - return ret; + public static BiomeType create(String name) { + return null; } } diff --git a/src/main/java/net/minecraftforge/common/DimensionManager.java b/src/main/java/net/minecraftforge/common/DimensionManager.java index b2b772dda..acfadfc14 100644 --- a/src/main/java/net/minecraftforge/common/DimensionManager.java +++ b/src/main/java/net/minecraftforge/common/DimensionManager.java @@ -399,7 +399,7 @@ public class DimensionManager { w.saveAllChunks(true, null); } - catch (MinecraftException e) + catch (Exception e) { LOGGER.error(DIMMGR,"Caught an exception while saving all chunks:", e); } diff --git a/src/main/java/net/minecraftforge/common/brewing/AbstractBrewingRecipe.java b/src/main/java/net/minecraftforge/common/brewing/AbstractBrewingRecipe.java deleted file mode 100644 index a9f4541a8..000000000 --- a/src/main/java/net/minecraftforge/common/brewing/AbstractBrewingRecipe.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Minecraft Forge - * Copyright (c) 2016-2018. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation version 2.1 - * of the License. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -package net.minecraftforge.common.brewing; - -import net.minecraft.item.ItemStack; -import net.minecraftforge.oredict.OreDictionary; - -import javax.annotation.Nonnull; - -public abstract class AbstractBrewingRecipe implements IBrewingRecipe -{ - @Nonnull - private final ItemStack input; - private final T ingredient; - private final ItemStack output; - - protected AbstractBrewingRecipe(@Nonnull ItemStack input, @Nonnull T ingredient, @Nonnull ItemStack output) - { - this.input = input; - this.ingredient = ingredient; - this.output = output; - } - - @Override - public boolean isInput(@Nonnull ItemStack stack) - { - return OreDictionary.itemMatches(this.getInput(), stack, false); - } - - @Override - @Nonnull - public ItemStack getOutput(@Nonnull ItemStack input, @Nonnull ItemStack ingredient) - { - return isInput(input) && isIngredient(ingredient) ? getOutput().copy() : ItemStack.EMPTY; - } - - @Nonnull - public ItemStack getInput() - { - return input; - } - - @Nonnull - public T getIngredient() - { - return ingredient; - } - - @Nonnull - public ItemStack getOutput() - { - return output; - } -} \ No newline at end of file diff --git a/src/main/java/net/minecraftforge/common/brewing/BrewingOreRecipe.java b/src/main/java/net/minecraftforge/common/brewing/BrewingOreRecipe.java deleted file mode 100644 index 9d0b1ce05..000000000 --- a/src/main/java/net/minecraftforge/common/brewing/BrewingOreRecipe.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Minecraft Forge - * Copyright (c) 2016-2018. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation version 2.1 - * of the License. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -package net.minecraftforge.common.brewing; - -import java.util.List; -import net.minecraft.item.ItemStack; -import net.minecraftforge.oredict.OreDictionary; - -import javax.annotation.Nonnull; - -public class BrewingOreRecipe extends AbstractBrewingRecipe> { - - public BrewingOreRecipe(@Nonnull ItemStack input, @Nonnull String ingredient, @Nonnull ItemStack output) - { - super(input, OreDictionary.getOres(ingredient), output); - } - - public BrewingOreRecipe(@Nonnull ItemStack input, @Nonnull List ingredient, @Nonnull ItemStack output) - { - super(input, ingredient, output); - } - - @Override - public boolean isIngredient(@Nonnull ItemStack stack) - { - for (ItemStack target : this.getIngredient()) - { - if (OreDictionary.itemMatches(target, stack, false)) - { - return true; - } - - } - return false; - } -} \ No newline at end of file diff --git a/src/main/java/net/minecraftforge/common/brewing/BrewingRecipe.java b/src/main/java/net/minecraftforge/common/brewing/BrewingRecipe.java index 785674fc2..926880963 100644 --- a/src/main/java/net/minecraftforge/common/brewing/BrewingRecipe.java +++ b/src/main/java/net/minecraftforge/common/brewing/BrewingRecipe.java @@ -20,20 +20,53 @@ package net.minecraftforge.common.brewing; import net.minecraft.item.ItemStack; -import net.minecraftforge.oredict.OreDictionary; +import net.minecraft.item.crafting.Ingredient; import javax.annotation.Nonnull; -public class BrewingRecipe extends AbstractBrewingRecipe { +public class BrewingRecipe implements IBrewingRecipe +{ + @Nonnull private final ItemStack input; + @Nonnull private final Ingredient ingredient; + @Nonnull private final ItemStack output; - public BrewingRecipe(@Nonnull ItemStack input, @Nonnull ItemStack ingredient, @Nonnull ItemStack output) + public BrewingRecipe(ItemStack input, Ingredient ingredient, ItemStack output) { - super(input, ingredient, output); + this.input = input; + this.ingredient = ingredient; + this.output = output; } @Override - public boolean isIngredient(@Nonnull ItemStack stack) + public boolean isInput(@Nonnull ItemStack stack) { - return OreDictionary.itemMatches(this.getIngredient(), stack, false); + return ingredient.test(stack); } -} \ No newline at end of file + + @Override + public ItemStack getOutput(ItemStack input, ItemStack ingredient) + { + return isInput(input) && isIngredient(ingredient) ? getOutput().copy() : ItemStack.EMPTY; + } + + public ItemStack getInput() + { + return input; + } + + public Ingredient getIngredient() + { + return ingredient; + } + + public ItemStack getOutput() + { + return output; + } + + @Override + public boolean isIngredient(ItemStack ingredient) + { + return this.ingredient.test(ingredient); + } +} diff --git a/src/main/java/net/minecraftforge/common/brewing/BrewingRecipeRegistry.java b/src/main/java/net/minecraftforge/common/brewing/BrewingRecipeRegistry.java index aec83d0f8..0c7480541 100644 --- a/src/main/java/net/minecraftforge/common/brewing/BrewingRecipeRegistry.java +++ b/src/main/java/net/minecraftforge/common/brewing/BrewingRecipeRegistry.java @@ -23,10 +23,9 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.Ingredient; import net.minecraft.util.NonNullList; -import javax.annotation.Nonnull; - public class BrewingRecipeRegistry { private static List recipes = new ArrayList(); @@ -50,30 +49,11 @@ public class BrewingRecipeRegistry { * done. * @return true if the recipe was added. */ - public static boolean addRecipe(@Nonnull ItemStack input, @Nonnull ItemStack ingredient, @Nonnull ItemStack output) + public static boolean addRecipe(ItemStack input, Ingredient ingredient, ItemStack output) { return addRecipe(new BrewingRecipe(input, ingredient, output)); } - /** - * Adds a recipe to the registry. Due to the nature of the brewing stand - * inputs that stack (a.k.a max stack size > 1) are not allowed. - * - * @param input - * The ItemStack that goes in same slots as the water bottles - * would. - * @param ingredient - * The ItemStack that goes in the same slot as nether wart would. - * @param output - * The ItemStack that will replace the input once the brewing is - * done. - * @return true if the recipe was added. - */ - public static boolean addRecipe(@Nonnull ItemStack input, @Nonnull String ingredient, @Nonnull ItemStack output) - { - return addRecipe(new BrewingOreRecipe(input, ingredient, output)); - } - /** * Adds a recipe to the registry. Due to the nature of the brewing stand * inputs that stack (a.k.a max stack size > 1) are not allowed. @@ -87,8 +67,7 @@ public class BrewingRecipeRegistry { * Returns the output ItemStack obtained by brewing the passed input and * ingredient. */ - @Nonnull - public static ItemStack getOutput(@Nonnull ItemStack input, @Nonnull ItemStack ingredient) + public static ItemStack getOutput(ItemStack input, ItemStack ingredient) { if (input.isEmpty() || input.getCount() != 1) return ItemStack.EMPTY; if (ingredient.isEmpty()) return ItemStack.EMPTY; @@ -107,7 +86,7 @@ public class BrewingRecipeRegistry { /** * Returns true if the passed input and ingredient have an output */ - public static boolean hasOutput(@Nonnull ItemStack input, @Nonnull ItemStack ingredient) + public static boolean hasOutput(ItemStack input, ItemStack ingredient) { return !getOutput(input, ingredient).isEmpty(); } @@ -117,7 +96,7 @@ public class BrewingRecipeRegistry { * Extra parameters exist to allow modders to create bigger brewing stands * without much hassle */ - public static boolean canBrew(NonNullList inputs, @Nonnull ItemStack ingredient, int[] inputIndexes) + public static boolean canBrew(NonNullList inputs, ItemStack ingredient, int[] inputIndexes) { if (ingredient.isEmpty()) return false; @@ -136,7 +115,7 @@ public class BrewingRecipeRegistry { * Used by the brewing stand to brew its inventory Extra parameters exist to * allow modders to create bigger brewing stands without much hassle */ - public static void brewPotions(NonNullList inputs, @Nonnull ItemStack ingredient, int[] inputIndexes) + public static void brewPotions(NonNullList inputs, ItemStack ingredient, int[] inputIndexes) { for (int i : inputIndexes) { @@ -152,7 +131,7 @@ public class BrewingRecipeRegistry { * Returns true if the passed ItemStack is a valid ingredient for any of the * recipes in the registry. */ - public static boolean isValidIngredient(@Nonnull ItemStack stack) + public static boolean isValidIngredient(ItemStack stack) { if (stack.isEmpty()) return false; @@ -170,7 +149,7 @@ public class BrewingRecipeRegistry { * Returns true if the passed ItemStack is a valid input for any of the * recipes in the registry. */ - public static boolean isValidInput(@Nonnull ItemStack stack) + public static boolean isValidInput(ItemStack stack) { if (stack.getCount() != 1) return false; diff --git a/src/main/java/net/minecraftforge/common/brewing/IBrewingRecipe.java b/src/main/java/net/minecraftforge/common/brewing/IBrewingRecipe.java index 1b5ff8f30..08f8b2804 100644 --- a/src/main/java/net/minecraftforge/common/brewing/IBrewingRecipe.java +++ b/src/main/java/net/minecraftforge/common/brewing/IBrewingRecipe.java @@ -21,8 +21,6 @@ package net.minecraftforge.common.brewing; import net.minecraft.item.ItemStack; -import javax.annotation.Nonnull; - public interface IBrewingRecipe { /** @@ -30,19 +28,18 @@ public interface IBrewingRecipe { * being the item that goes in one of the three bottom slots of the brewing * stand (e.g: water bottle) */ - boolean isInput(@Nonnull ItemStack input); + boolean isInput(ItemStack input); /** * Returns true if the passed ItemStack is an ingredient for this recipe. * "Ingredient" being the item that goes in the top slot of the brewing * stand (e.g: nether wart) */ - boolean isIngredient(@Nonnull ItemStack ingredient); + boolean isIngredient(ItemStack ingredient); /** * Returns the output when the passed input is brewed with the passed * ingredient. Empty if invalid input or ingredient. */ - @Nonnull - ItemStack getOutput(@Nonnull ItemStack input, @Nonnull ItemStack ingredient); -} \ No newline at end of file + ItemStack getOutput(ItemStack input, ItemStack ingredient); +} diff --git a/src/main/java/net/minecraftforge/common/brewing/VanillaBrewingRecipe.java b/src/main/java/net/minecraftforge/common/brewing/VanillaBrewingRecipe.java index 085b8a8cc..948d93056 100644 --- a/src/main/java/net/minecraftforge/common/brewing/VanillaBrewingRecipe.java +++ b/src/main/java/net/minecraftforge/common/brewing/VanillaBrewingRecipe.java @@ -37,7 +37,7 @@ public class VanillaBrewingRecipe implements IBrewingRecipe { * Code adapted from TileEntityBrewingStand.isItemValidForSlot(int index, ItemStack stack) */ @Override - public boolean isInput(@Nonnull ItemStack stack) + public boolean isInput(ItemStack stack) { Item item = stack.getItem(); return item == Items.POTIONITEM || item == Items.SPLASH_POTION || item == Items.LINGERING_POTION || item == Items.GLASS_BOTTLE; @@ -47,7 +47,7 @@ public class VanillaBrewingRecipe implements IBrewingRecipe { * Code adapted from TileEntityBrewingStand.isItemValidForSlot(int index, ItemStack stack) */ @Override - public boolean isIngredient(@Nonnull ItemStack stack) + public boolean isIngredient(ItemStack stack) { return PotionBrewing.isReagent(stack); } @@ -58,8 +58,7 @@ public class VanillaBrewingRecipe implements IBrewingRecipe { * or if the new potion is a splash potion when the old one wasn't. */ @Override - @Nonnull - public ItemStack getOutput(@Nonnull ItemStack input, @Nonnull ItemStack ingredient) + public ItemStack getOutput(ItemStack input, ItemStack ingredient) { if (!input.isEmpty() && !ingredient.isEmpty() && isIngredient(ingredient)) { diff --git a/src/main/java/net/minecraftforge/common/brewing/package-info.java b/src/main/java/net/minecraftforge/common/brewing/package-info.java new file mode 100644 index 000000000..95682b417 --- /dev/null +++ b/src/main/java/net/minecraftforge/common/brewing/package-info.java @@ -0,0 +1,6 @@ +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault +package net.minecraftforge.common.brewing; + +import mcp.MethodsReturnNonnullByDefault; +import javax.annotation.ParametersAreNonnullByDefault; diff --git a/src/main/java/net/minecraftforge/common/command/SelectorHandler.java b/src/main/java/net/minecraftforge/common/command/SelectorHandler.java deleted file mode 100644 index c36fd28d1..000000000 --- a/src/main/java/net/minecraftforge/common/command/SelectorHandler.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Minecraft Forge - * Copyright (c) 2016-2018. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation version 2.1 - * of the License. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -package net.minecraftforge.common.command; - -import java.util.List; - -import net.minecraft.command.CommandException; -import net.minecraft.command.ICommandSender; -import net.minecraft.entity.Entity; - -/** - * Handler for custom types of selectors registered with {@link SelectorHandlerManager} - */ -public interface SelectorHandler -{ - /** - * Returns a {@link List} of {@link Entity Entities} of class {@code targetClass} ({@code T}) represented by {@code token}
- * Note: If {@code token} does not match the overall syntax defined by {@link #isSelector}, this method should return an empty list. - * For any other error, an exception should be thrown - * - * @param sender The {@link ICommandSender} that initiated the query - */ - List matchEntities(ICommandSender sender, String token, Class targetClass) throws CommandException; - - /** - * Returns whether the selector string potentially matches multiple entities - */ - boolean matchesMultiplePlayers(String selectorStr) throws CommandException; - - /** - * Returns whether the string matches the overall syntax of the selector
- * Note: If this returns {@code false}, {@link #matchEntities} should return an empty list - */ - boolean isSelector(String selectorStr); -} diff --git a/src/main/java/net/minecraftforge/common/command/SelectorHandlerManager.java b/src/main/java/net/minecraftforge/common/command/SelectorHandlerManager.java deleted file mode 100644 index fb721078f..000000000 --- a/src/main/java/net/minecraftforge/common/command/SelectorHandlerManager.java +++ /dev/null @@ -1,141 +0,0 @@ -/* - * Minecraft Forge - * Copyright (c) 2016-2018. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation version 2.1 - * of the License. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -package net.minecraftforge.common.command; - -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.NavigableMap; -import java.util.TreeMap; - -import org.apache.commons.lang3.ArrayUtils; - -import net.minecraft.command.CommandException; -import net.minecraft.command.EntitySelector; -import net.minecraft.command.ICommandSender; -import net.minecraft.entity.Entity; -import net.minecraftforge.fml.common.Loader; - -/** - * Allows registration of custom selector types by assigning a {@link SelectorHandler} to a prefix - * This class handles calls to the {@link EntitySelector} methods {@link EntitySelector#matchEntities matchEntities}, - * {@link EntitySelector#matchesMultiplePlayers matchesMultiplePlayers} and {@link EntitySelector#isSelector isSelector}.
- * The calls are delegated to the handler with the longest matching prefix.
- *
- * Note: If you register a {@link SelectorHandler} to a broader domain (not just a single selector), you should take care of possible shadowing conflicts yourself. - * For this you can use the information provided by {@link #selectorHandlers} and {@link #registeringMods}. - */ -public class SelectorHandlerManager -{ - private SelectorHandlerManager() - { - } - - //the ordering is reversed such that longer prefixes appear before their shorter substrings - public static final NavigableMap selectorHandlers = new TreeMap(Collections. reverseOrder()); - public static final NavigableMap registeringMods = new TreeMap(Collections. reverseOrder()); - - private static final SelectorHandler vanillaHandler = new SelectorHandler() - { - @Override - public List matchEntities(final ICommandSender sender, final String token, final Class targetClass) throws CommandException - { - return EntitySelector.matchEntitiesDefault(sender, token, targetClass); - } - - @Override - public boolean matchesMultiplePlayers(final String selectorStr) throws CommandException - { - return EntitySelector.matchesMultiplePlayersDefault(selectorStr); - } - - @Override - public boolean isSelector(final String selectorStr) - { - return EntitySelector.isSelectorDefault(selectorStr); - } - }; - - static - { - for (final String prefix : ArrayUtils.toArray("@p", "@a", "@r", "@e", "@s")) - { - selectorHandlers.put(prefix, vanillaHandler); - registeringMods.put(prefix, "minecraft"); - } - } - - /** - * Registers a new {@link SelectorHandler} for {@code prefix}.
- * - * @param prefix The domain the specified {@code handler} is registered for. - * If you want to register just a single selector, {@code prefix} has the form '@{selectorName}' - */ - public static void register(final String prefix, final SelectorHandler handler) - { - if (prefix.isEmpty()) - { - throw new IllegalArgumentException("Prefix must not be empty"); - } - - final String modId = Loader.instance().activeModContainer().getModId(); - - selectorHandlers.put(prefix, handler); - registeringMods.put(prefix, modId); - } - - /** - * Returns the best matching handler for the given string. Defaults to the vanilla handler if no prefix applies - */ - public static SelectorHandler getHandler(final String selectorStr) - { - if (!selectorStr.isEmpty()) - { - for (final Entry handler : selectorHandlers.subMap(selectorStr, true, selectorStr.substring(0, 1), true).entrySet()) - { - if (selectorStr.startsWith(handler.getKey())) - { - return handler.getValue(); - } - } - } - - return vanillaHandler; - } - - //These methods are called by the vanilla methods - - public static List matchEntities(final ICommandSender sender, final String token, final Class targetClass) throws CommandException - { - return getHandler(token).matchEntities(sender, token, targetClass); - } - - public static boolean matchesMultiplePlayers(final String selectorStr) throws CommandException - { - return getHandler(selectorStr).matchesMultiplePlayers(selectorStr); - } - - public static boolean isSelector(final String selectorStr) - { - return getHandler(selectorStr).isSelector(selectorStr); - } -} diff --git a/src/main/java/net/minecraftforge/common/extensions/IForgeItemStack.java b/src/main/java/net/minecraftforge/common/extensions/IForgeItemStack.java new file mode 100644 index 000000000..801ea8a61 --- /dev/null +++ b/src/main/java/net/minecraftforge/common/extensions/IForgeItemStack.java @@ -0,0 +1,39 @@ +package net.minecraftforge.common.extensions; + +import net.minecraft.item.ItemStack; + +/* + * Extension added to ItemStack that bounces to ItemSack sensitive Item methods. Typically this is just for convince. + */ +public interface IForgeItemStack +{ + // Helpers for accessing Item data + default ItemStack getStack() + { + return (ItemStack)this; + } + + /** + * ItemStack sensitive version of getContainerItem. Returns a full ItemStack + * instance of the result. + * + * @param itemStack The current ItemStack + * @return The resulting ItemStack + */ + default ItemStack getContainerItem() + { + return getStack().getItem().getContainerItem(getStack()); + } + + /** + * ItemStack sensitive version of hasContainerItem + * + * @param stack The current item stack + * @return True if this item has a 'container' + */ + default boolean hasContainerItem() + { + return getStack().getItem().hasContainerItem(getStack()); + } + +} diff --git a/src/main/java/net/minecraftforge/items/wrapper/SidedInvWrapper.java b/src/main/java/net/minecraftforge/items/wrapper/SidedInvWrapper.java index 2ab90cb2f..159832bd8 100644 --- a/src/main/java/net/minecraftforge/items/wrapper/SidedInvWrapper.java +++ b/src/main/java/net/minecraftforge/items/wrapper/SidedInvWrapper.java @@ -22,6 +22,7 @@ package net.minecraftforge.items.wrapper; import net.minecraft.inventory.ISidedInventory; import net.minecraft.item.ItemStack; import net.minecraft.util.EnumFacing; +import net.minecraftforge.common.capabilities.OptionalCapabilityInstance; import net.minecraftforge.items.IItemHandlerModifiable; import net.minecraftforge.items.ItemHandlerHelper; @@ -32,7 +33,17 @@ public class SidedInvWrapper implements IItemHandlerModifiable protected final ISidedInventory inv; protected final EnumFacing side; - public SidedInvWrapper(ISidedInventory inv, EnumFacing side) + @SuppressWarnings("unchecked") + public static > T[] create(ISidedInventory inv, EnumFacing... sides) { + T[] ret = (T[])new Object[sides.length]; + for (int x = 0; x < sides.length; x++) { + final EnumFacing side = sides[x]; + ret[x] = (T)OptionalCapabilityInstance.of(() -> (IItemHandlerModifiable)new SidedInvWrapper(inv, side)); + } + return ret; + } + + protected SidedInvWrapper(ISidedInventory inv, EnumFacing side) { this.inv = inv; this.side = side; diff --git a/src/main/java/net/minecraftforge/oredict/OreDictionary.java b/src/main/java/net/minecraftforge/oredict/OreDictionary.java index b587159eb..b949ed23c 100644 --- a/src/main/java/net/minecraftforge/oredict/OreDictionary.java +++ b/src/main/java/net/minecraftforge/oredict/OreDictionary.java @@ -19,6 +19,7 @@ package net.minecraftforge.oredict; +/* import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; @@ -51,6 +52,7 @@ import net.minecraftforge.fml.common.FMLLog; import net.minecraftforge.fml.common.Loader; import javax.annotation.Nonnull; +*/ public class OreDictionary { @@ -578,7 +580,7 @@ public class OreDictionary * Retrieves a list of all unique ore names that are already registered. * * @return All unique ore names that are currently registered. - */ + * / public static String[] getOreNames() { return idToName.toArray(new String[idToName.size()]); diff --git a/src/main/resources/forge_at.cfg b/src/main/resources/forge_at.cfg index af8464c64..f37eb3772 100644 --- a/src/main/resources/forge_at.cfg +++ b/src/main/resources/forge_at.cfg @@ -353,3 +353,6 @@ public net.minecraft.client.Minecraft func_193986_ar()V # populateSearchTreeMana # Advancements public net.minecraft.advancements.AdvancementManager field_192783_b # GSON public net.minecraft.advancements.CriteriaTriggers func_192118_a(Lnet/minecraft/advancements/ICriterionTrigger;)Lnet/minecraft/advancements/ICriterionTrigger; # register + +# BiomeProvider +public net.minecraft.world.biome.provider.BiomeProvider field_201540_a # BIOMES_TO_SPAWN_IN