Maybe giving "wiki" as first argument would work ? Just saying, I didn't know this API existed till now.
If you are sure about this API being necessary, you can suggest the author to add a API.addKeyBindWithName(args) method.
(I personally don't think you need an external API to make this KeyBind, unless it gives special properties ?)
You have to use packets to send the changes induced by actionPerformed(args) to the server.
There are tutorials for PacketHandler and such on the wiki.
Look into World class for "setBlock", there are quite a few methods there.
The names and behaviour changed a bit due to Mojang updates (i think it was in 1.4 actually).
setIconIndex() and setTextureFile() methods don't exist in 1.6. The Icons are replacement for them. CommonProxy has nothing to do with it by the way.
Good luck, have fun
At line 167 of your block, in updateTick(args) method:
par1World.setBlockMetadataWithNotify(par2, par3, par4, l & -9, 4);
This has a chance of changing your block metadata.
Yes,he needs to call tryToCreatePortal on his own.
There are countless solutions:
-have it in onBlockActivated
-have it in onNeighbourBlockChange
-use PlayerInteractEvent
-things i didn't think of...
Configurable Biomes ids ? of course, like any block or item...put an int into your config file.
I don't see the point for metadata actually. You'll need to initialize all of your block versions, and check that none overlap...
Even worse for items, you don't have any limitation if you use item damage.
Do baconRaw.setContainerItem(Item.shears) then.
IRecipe is mostly to recognize a complex recipe that wouldn't be handled by Minecraft (like say, with ItemStack NBTTagCompound).
It doesn't tell what damage to apply to which item.
You need a ICraftingHandler to do that.
You can add OreDictionary.WILDCARD_VALUE to the shears ItemStack itemdamage. This way any shears will do.
AFAIK, any item in a recipe will get damaged/removed when taking out the recipe output. It may depend on how you implemented the ContainerItem thing though.
Well you can still use my code, but you'll need to catch chat messages instead.
You can use ClientChatReceivedEvent for that.
Then combine it with diesieben07 advice.