These tutorials are for ModLoader!
Easy Tutorials
Using Dyes in Recipes (This can be applied to all blocks containing damage values like Wool for instance!)
If you noticed Dyes and Wools are stored using damage values, which allows multiple items/blocks to be stored on a single ID. Because of this the basic Item.dyePowder or Block.wool doesn't work in recipes because your not providing the Damage Value.
To do so is actually really simple.
Here is an example of a recipe that won't work:
To make it work you would need to replace "Item.dyePowder, 9" with "Item.dyePowder, 9, 0", so the new recipe would look like this:
The 9 is the amount that will be crafted after fulfilling the recipe and the 0 is the damage value(which you could also consider the "ID" in some sense) of the Item.dyePowder. With this recipe 1 dirt block will craft 9 Black Dyes.
Now there is a minor tweak that needs to be made when making a dye part of the recipe.
This is an example of a recipe that won't work:
To make it work you would need to replace "Item.dyePowder" with "new ItemStack(Item.dyePowder, 1, 0)", so the new recipe would look like this.
The 1 always has to be there, it doesn't change, the 0 is the damage value of Item.dyePowder. With this recipe 1 Black Dye would craft 1 dirt block.
The damage values for Item.dyePowder and their corresponding color.
Using Weapons/Tools/Armors in RecipesTo do so is actually really simple.
Here is an example of a recipe that won't work:
ModLoader.AddRecipe(new ItemStack(Item.dyePowder, 9), new Object[] { "#", Character.valueOf('#'), Block.dirt });
To make it work you would need to replace "Item.dyePowder, 9" with "Item.dyePowder, 9, 0", so the new recipe would look like this:
ModLoader.AddRecipe(new ItemStack(Item.dyePowder, 9, 0), new Object[] { "#", Character.valueOf('#'), Block.dirt });
The 9 is the amount that will be crafted after fulfilling the recipe and the 0 is the damage value(which you could also consider the "ID" in some sense) of the Item.dyePowder. With this recipe 1 dirt block will craft 9 Black Dyes.
Now there is a minor tweak that needs to be made when making a dye part of the recipe.
This is an example of a recipe that won't work:
ModLoader.AddRecipe(new ItemStack(Block.dirt, 9), new Object[] { "#", Character.valueOf('#'), Item.dyePowder });
To make it work you would need to replace "Item.dyePowder" with "new ItemStack(Item.dyePowder, 1, 0)", so the new recipe would look like this.
ModLoader.AddRecipe(new ItemStack(Block.dirt, 9), new Object[] { "#", Character.valueOf('#'), new ItemStack(Item.dyePowder, 1, 0) });
The 1 always has to be there, it doesn't change, the 0 is the damage value of Item.dyePowder. With this recipe 1 Black Dye would craft 1 dirt block.
The damage values for Item.dyePowder and their corresponding color.
Black - 0 Red - 1 Green - 2 Brown - 3 Blue - 4 Purple - 5 Cyan - 6 Light Gray - 7 Gray - 8 Pink - 9 Lime Green - 10 Yellow - 11 Light Blue - 12 Magenta - 13 Orange - 14 White - 15
Now for the most part using Weapons/Tools/Armors in recipes is pretty straight forward.
Here is an example of a recipe where 1 Iron Pickaxe will create 1 Dirt Block (Just for examples sake):
Now this will work fine except for 1 problem, if the tool has taken any damage the recipe won't work. So to fix that we are going to have to change "Item.pickaxeSteel" to "new ItemStack(Item.pickaxeSteel, 1, -1)".
Doing so would give us this recipe:
Now whether or not the tool has taken any damage, when crafted it will produce 1 dirt block. Now I'm not a 100% certain why this works, but I know for a fact it does.
This can be used with all tools/weapons/armors, simply change "pickaxeSteel" to what tool/weapon/armor you would like to use.
Here is an example of a recipe where 1 Iron Pickaxe will create 1 Dirt Block (Just for examples sake):
ModLoader.AddShapelessRecipe(Block.dirt, 1), new Object[] { Item.pickaxeSteel });
Now this will work fine except for 1 problem, if the tool has taken any damage the recipe won't work. So to fix that we are going to have to change "Item.pickaxeSteel" to "new ItemStack(Item.pickaxeSteel, 1, -1)".
Doing so would give us this recipe:
ModLoader.AddShapelessRecipe(Block.dirt, 1), new Object[] { new ItemStack(Item.pickaxeSteel, 1, -1) });
Now whether or not the tool has taken any damage, when crafted it will produce 1 dirt block. Now I'm not a 100% certain why this works, but I know for a fact it does.
This can be used with all tools/weapons/armors, simply change "pickaxeSteel" to what tool/weapon/armor you would like to use.
Adding New Fuel Sources
Now I've only seen a few tutorials on creating few but some of them aren't really descriptive and could use just a tad bit more information, so I created this quick tutorial on the subject.
We'll start out by creating a new mod_***.java file, we'll call this one mod_NewFuel:
package net.minecraft.src; public class mod_NewFuel extends BaseMod { public mod_NewFuel() { } public String Version() { return "New Fuel 1.8.1"; } }
Now lets take a look at the code that you use to add fuel:
public int AddFuel(int i, int j) { if(i == Name.IDtype) { return fuelAmount; } return 0; }
Name = The name of the item or block you want to become a fuel source.
IDtype = If "Name" is an item, IDtype would become shiftedIndex. If "Name" is a block, IDtype would be blockID.
fuelAmount = Fuel amount is the amount of fuel the new item/block will possess. Each item takes 200 FA to smelt, Coal can smelt 8 items therefore it has 1600 FA.
Now to get this to work, you would place this inside of your mod_NewFuel class but outside of your mod_NewFuel constructor, like so:
package net.minecraft.src; public class mod_NewFuel extends BaseMod { public int AddFuel(int i, int j) { if(i == Block.dirt.blockID) { return 400; } return 0; } public mod_NewFuel() { } public String Version() { return "New Fuel 1.8.1"; } }
This would make it so dirt can be used as a fuel, it will be able to smelt 2 items.
Now let's say you want to add more then one block or item as fuel, it's as simple as adding a new if command.
package net.minecraft.src; public class mod_NewFuel extends BaseMod { public int AddFuel(int i, int j) { if(i == Block.dirt.blockID) { return 400; } if(i == Item.ingotIron.shiftedIndex) { return 1000; } return 0; } public mod_NewFuel() { } public String Version() { return "New Fuel 1.8.1"; } }
Now with this code, Dirt would become a fuel source that smelts 2 items while Iron Bars would become a fuel source that smelts 5 items.
Intermediate Tutorials
Creating a Block With Randomized Drop
In this tutorial I'm going to show you how to make a block drop more then one item. On top of that we are going to randomize the amount that is dropped each time as well as randomize which items are dropped. Keep in mind I don't know exactly what every bit of coding does so if I state something wrong please feel free to correct me.
Here is an example, using a mod I recently released, of what we are going to be doing:
First we need to create a mod_Test.java file. Place the following within this file:
package net.minecraft.src; public class mod_Test extends BaseMod { public mod_Test() { } public String Version() { return "1.8.1"; } }
Now we need to create the block file, we'll name it BlockTest.java. Place the following within this file:
package net.minecraft.src; import java.util.Random; public class BlockTest extends Block { public BlockTest(int i, int j) { super(i, j, Material.ground); } public int idDropped(int i, Random random) { return mod_Test.Test.blockID; } public int quantityDropped(Random random) { return 0; } }
Pretty basic so far, before we go any further lets go ahead and register our block, give it a name, a texture, and recipe within mod_Test.java.
package net.minecraft.src; public class mod_Test extends BaseMod { public static Block Test = new BlockTest(230, 0).setHardness(1.0F).setResistance(60.0F).setBlockName("Test"); public mod_Test() { ModLoader.RegisterBlock(Test); Test.blockIndexInTexture = ModLoader.addOverride("/terrain.png", "/test.png"); ModLoader.AddRecipe(new ItemStack(Test, 1), new Object[] { "#", Character.valueOf('#'), Block.dirt }); } public String Version() { return "1.8.1"; } }
Good now we don't need to edit mod_Test.java anymore, once we finish up with BlockTest.java we can recompile and test.
Now back to BlockTest.java, in order to make this work we are going to have to add a few methods, the first one we'll add is called dropBlockAsItemWithChance.
package net.minecraft.src; import java.util.Random; public class BlockTest extends Block { public BlockTest(int i, int j) { super(i, j, Material.ground); } public int idDropped(int i, Random random) { return mod_Test.Test.blockID; } public int quantityDropped(Random random) { return 0; } public void dropBlockAsItemWithChance(World world, int i, int j, int k, int l, float f) { super.dropBlockAsItemWithChance(world, i, j, k, l, f); if(world.multiplayerWorld) { return; } } }
To the best of my knowledge, this method is what allows us to initiate multiple drops. Now before we move on let's think of what items we are going to allow our block to drop.
I think we'll go with Coal, Iron Ingot(bars), and Gold Ingot(bars). For each item we want to drop we are going to have to make it's own method. We'll create the method for coal first so I can break down what's going on(to the best of my knowledge).
public void dropCoal(World world, int i, int j, int k, int l, float f) //This creates a void method called dropCoal, the void is there so we don't need to have a return within the method. { //Within the ()'s we are telling what information needs to get passed down to the method, in this case it's identical to the dropBlockAsItemWithChance method. float f1 = 0.7F; float f2 = world.rand.nextFloat() * f1 + (1.0F - f1) * 0.5F; float f3 = world.rand.nextFloat() * f1 + (1.0F - f1) * 0.5F; float f4 = world.rand.nextFloat() * f1 + (1.0F - f1) * 0.5F; //Now I'm not 100% sure, but I believe these varibles are set to be used to make the items pop out of the block in random directions. EntityItem entityitem1 = new EntityItem(world, (float)i + f2, (float)j + f3, (float)k + f4, new ItemStack(Item.coal)); //This creates a new instance of EntityItem called entityitem1, it then passes the above variables as well as which item is going to drop onto EntityItem. entityitem1.delayBeforeCanPickup = 10; //This sets the delay before the item can be picked up, I assume this is in place so players can see the items that come out before it is sucked into their inventory. world.entityJoinedWorld(entityitem1); //This is what actually makes the item appear after breaking our block. }
So now we just have to create the methods for our Iron and Gold Ingot drops. The only difference between the 3 methods is the method name and item within new ItemStack(). With all 3 methods added, our BlockTest.java should look like this:
package net.minecraft.src; import java.util.Random; public class BlockTest extends Block { public BlockTest(int i, int j) { super(i, j, Material.ground); } public int idDropped(int i, Random random) { return mod_Test.Test.blockID; } public int quantityDropped(Random random) { return 0; } public void dropBlockAsItemWithChance(World world, int i, int j, int k, int l, float f) { super.dropBlockAsItemWithChance(world, i, j, k, l, f); if(world.multiplayerWorld) { return; } } public void dropCoal(World world, int i, int j, int k, int l, float f) { float f1 = 0.7F; float f2 = world.rand.nextFloat() * f1 + (1.0F - f1) * 0.5F; float f3 = world.rand.nextFloat() * f1 + (1.0F - f1) * 0.5F; float f4 = world.rand.nextFloat() * f1 + (1.0F - f1) * 0.5F; EntityItem entityitem1 = new EntityItem(world, (float)i + f2, (float)j + f3, (float)k + f4, new ItemStack(Item.coal)); entityitem1.delayBeforeCanPickup = 10; world.entityJoinedWorld(entityitem1); } public void dropIron(World world, int i, int j, int k, int l, float f) { float f1 = 0.7F; float f2 = world.rand.nextFloat() * f1 + (1.0F - f1) * 0.5F; float f3 = world.rand.nextFloat() * f1 + (1.0F - f1) * 0.5F; float f4 = world.rand.nextFloat() * f1 + (1.0F - f1) * 0.5F; EntityItem entityitem1 = new EntityItem(world, (float)i + f2, (float)j + f3, (float)k + f4, new ItemStack(Item.ingotIron)); entityitem1.delayBeforeCanPickup = 10; world.entityJoinedWorld(entityitem1); } public void dropGold(World world, int i, int j, int k, int l, float f) { float f1 = 0.7F; float f2 = world.rand.nextFloat() * f1 + (1.0F - f1) * 0.5F; float f3 = world.rand.nextFloat() * f1 + (1.0F - f1) * 0.5F; float f4 = world.rand.nextFloat() * f1 + (1.0F - f1) * 0.5F; EntityItem entityitem1 = new EntityItem(world, (float)i + f2, (float)j + f3, (float)k + f4, new ItemStack(Item.ingotGold)); entityitem1.delayBeforeCanPickup = 10; world.entityJoinedWorld(entityitem1); } }
We're almost done, but now we need to create one last method. This method is going to be responsible for deciding which items should be dropped and actually dropping the items. We're going to call it getDrops and we are going to utilize a For loop and the random function to accomplish this. Before we create this method, we need to declare two variables we are going to use for the rest of the tutorial. Place the following witin the BlockTest class file(either at the top or the bottom):
private int dropAmount; private int dropType;
Now on to the to our last method, we are going to call this method getDrops. Place the following within your BlockTest class file:
public void getDrops(World world, int dropNumber, int i, int j, int k, int l, float f) //This creates a public method called getDrops, the void is there so we don't need a return within the method. { //Within the ()'s we are still feeding the same information to the method as dropBlockAsItemWithChance with the addition of dropNumber, which is going to be the amount of drops that will occur. for(int z=0; z<dropNumber; z++) //This is our For loop. It firsts sets a varible, in this case z, to 0. { //The next part is the condition that needs to be met for the For loop to, well loop. In this case if z is less than dropNumber, it will loop through the code within the {} until z is the same as dropNumber. //The last little bit adds 1 to z each time the For loop loops. int dropType = world.rand.nextInt(180); //This assigns a random number to the variable dropType between 0-180. if (dropType <= 80) //If dropType value is less than or equal to 80, execute the code within the {}'s below. { dropCoal(world, i, j, k, l, f); //This calls our dropCoal method and executes it. } if (dropType > 80 && dropType <= 140) //If dropType value is greater then 80 and less than or equal to 140, execute the code within the {}'s below. { dropIron(world, i, j, k, l, f); //This calls our dropIron method and executes it. } if (dropType > 140 && dropType <= 180) //If dropType is greater then 140 and less than or equal to 180, execute the code within the {}'s below. { dropGold(world, i, j, k, l, f); //This calls our dropGold method and executes it. } else //If neither of the above conditions are met, execute the code within the {}'s below. { dropCoal(world, i, j, k, l, f); } } }
Now you can play around with the values that are required to get a certain drop, decreasing the range a dropType needs to fall within to get a certain item will make it more "rare". Increasing the range will make it more common. Just make sure you change the line, int dropType = world.rand.nextInt(180);, to accomdate your changes.
We are so close to being done I can almost taste the Cooked Porkchops, sorry pig!. As of right now, when you break our Test block nothing will happen. We are going to have to call the method that makes all of the magic happen, getDrops. Before we put in the final snippet of code, verify that your BlockTest.java looks the same as below:
package net.minecraft.src; import java.util.Random; public class BlockTest extends Block { public BlockTest(int i, int j) { super(i, j, Material.ground); } public int idDropped(int i, Random random) { return mod_Test.Test.blockID; } public int quantityDropped(Random random) { return 0; } public void dropBlockAsItemWithChance(World world, int i, int j, int k, int l, float f) { super.dropBlockAsItemWithChance(world, i, j, k, l, f); if(world.multiplayerWorld) { return; } } public void dropCoal(World world, int i, int j, int k, int l, float f) { float f1 = 0.7F; float f2 = world.rand.nextFloat() * f1 + (1.0F - f1) * 0.5F; float f3 = world.rand.nextFloat() * f1 + (1.0F - f1) * 0.5F; float f4 = world.rand.nextFloat() * f1 + (1.0F - f1) * 0.5F; EntityItem entityitem1 = new EntityItem(world, (float)i + f2, (float)j + f3, (float)k + f4, new ItemStack(Item.coal)); entityitem1.delayBeforeCanPickup = 10; world.entityJoinedWorld(entityitem1); } public void dropIron(World world, int i, int j, int k, int l, float f) { float f1 = 0.7F; float f2 = world.rand.nextFloat() * f1 + (1.0F - f1) * 0.5F; float f3 = world.rand.nextFloat() * f1 + (1.0F - f1) * 0.5F; float f4 = world.rand.nextFloat() * f1 + (1.0F - f1) * 0.5F; EntityItem entityitem1 = new EntityItem(world, (float)i + f2, (float)j + f3, (float)k + f4, new ItemStack(Item.ingotIron)); entityitem1.delayBeforeCanPickup = 10; world.entityJoinedWorld(entityitem1); } public void dropGold(World world, int i, int j, int k, int l, float f) { float f1 = 0.7F; float f2 = world.rand.nextFloat() * f1 + (1.0F - f1) * 0.5F; float f3 = world.rand.nextFloat() * f1 + (1.0F - f1) * 0.5F; float f4 = world.rand.nextFloat() * f1 + (1.0F - f1) * 0.5F; EntityItem entityitem1 = new EntityItem(world, (float)i + f2, (float)j + f3, (float)k + f4, new ItemStack(Item.ingotGold)); entityitem1.delayBeforeCanPickup = 10; world.entityJoinedWorld(entityitem1); } public void getDrops(World world, int dropNumber, int i, int j, int k, int l, float f) { for(int z=0; z<dropNumber; z++) { int dropType = world.rand.nextInt(180); if (dropType <= 80) { dropCoal(world, i, j, k, l, f); } if (dropType > 80 && dropType <= 140) { dropIron(world, i, j, k, l, f); } if (dropType > 140 && dropType <= 180) { dropGold(world, i, j, k, l, f); } else { dropCoal(world, i, j, k, l, f); } } } }
Onto the final part, all we have left to do is to call our getDrops method within our dropBlockAsItemWithChance method. Change dropBlockAsItemWithChance so it looks like the following:
public void dropBlockAsItemWithChance(World world, int i, int j, int k, int l, float f) { super.dropBlockAsItemWithChance(world, i, j, k, l, f); if(world.multiplayerWorld) { return; } int dropAmount = world.rand.nextInt(10); //This sets dropAmount with a random number between 0-10. This is also the max amount of drops that will be allowed when the block is destroyed. Decrease of increase this value to satisfy your needs. if (dropAmount == 0) //This is here to make sure that if dropAmount's value is 0, we give a player at least 1 drop. { getDrops(world, 1, i, j, k, l, f); //If dropAmount's value is zero, this executes getDrops and allows for only 1 item to be dropped. } else { getDrops(world, dropAmount, i, j, k, l, f); //If getAmount isn't zero, it passes off it's value to getDrops and runs the method. } }
There we have it, it's done, we have finally completed it. Just to be sure everything was done properly, compare your finished BlockTest.java file with the code below:
package net.minecraft.src; import java.util.Random; public class BlockTest extends Block { public BlockTest(int i, int j) { super(i, j, Material.ground); } public int idDropped(int i, Random random) { return mod_Test.Test.blockID; } public int quantityDropped(Random random) { return 0; } public void dropBlockAsItemWithChance(World world, int i, int j, int k, int l, float f) { super.dropBlockAsItemWithChance(world, i, j, k, l, f); if(world.multiplayerWorld) { return; } int dropAmount = world.rand.nextInt(10); if (dropAmount == 0) { getDrops(world, 1, i, j, k, l, f); } else { getDrops(world, dropAmount, i, j, k, l, f); } } public void dropCoal(World world, int i, int j, int k, int l, float f) { float f1 = 0.7F; float f2 = world.rand.nextFloat() * f1 + (1.0F - f1) * 0.5F; float f3 = world.rand.nextFloat() * f1 + (1.0F - f1) * 0.5F; float f4 = world.rand.nextFloat() * f1 + (1.0F - f1) * 0.5F; EntityItem entityitem1 = new EntityItem(world, (float)i + f2, (float)j + f3, (float)k + f4, new ItemStack(Item.coal)); entityitem1.delayBeforeCanPickup = 10; world.entityJoinedWorld(entityitem1); } public void dropIron(World world, int i, int j, int k, int l, float f) { float f1 = 0.7F; float f2 = world.rand.nextFloat() * f1 + (1.0F - f1) * 0.5F; float f3 = world.rand.nextFloat() * f1 + (1.0F - f1) * 0.5F; float f4 = world.rand.nextFloat() * f1 + (1.0F - f1) * 0.5F; EntityItem entityitem1 = new EntityItem(world, (float)i + f2, (float)j + f3, (float)k + f4, new ItemStack(Item.ingotIron)); entityitem1.delayBeforeCanPickup = 10; world.entityJoinedWorld(entityitem1); } public void dropGold(World world, int i, int j, int k, int l, float f) { float f1 = 0.7F; float f2 = world.rand.nextFloat() * f1 + (1.0F - f1) * 0.5F; float f3 = world.rand.nextFloat() * f1 + (1.0F - f1) * 0.5F; float f4 = world.rand.nextFloat() * f1 + (1.0F - f1) * 0.5F; EntityItem entityitem1 = new EntityItem(world, (float)i + f2, (float)j + f3, (float)k + f4, new ItemStack(Item.ingotGold)); entityitem1.delayBeforeCanPickup = 10; world.entityJoinedWorld(entityitem1); } public void getDrops(World world, int dropNumber, int i, int j, int k, int l, float f) { for(int z=0; z<dropNumber; z++) { int dropType = world.rand.nextInt(180); if (dropType <= 80) { dropCoal(world, i, j, k, l, f); } if (dropType > 80 && dropType <= 140) { dropIron(world, i, j, k, l, f); } if (dropType > 140 && dropType <= 180) { dropGold(world, i, j, k, l, f); } else { dropCoal(world, i, j, k, l, f); } } } }
One last thing, if you wanted to have the drop amount and types fixed, you could skip making the getDrops method and just make a method for each item you want to drop. Then within dropBlockAsItemWithChance call the method of the item you want as many times as you want it. Like so:
public void dropBlockAsItemWithChance(World world, int i, int j, int k, int l, float f) { super.dropBlockAsItemWithChance(world, i, j, k, l, f); if(world.multiplayerWorld) { return; } dropCoal(world, i, j, k, l, f); dropCoal(world, i, j, k, l, f); dropIron(world, i, j, k, l, f); dropGold(world, i, j, k, l, f); dropGold(world, i, j, k, l, f); }
This would drop 2 pieces of coal, 1 Iron Ingot, and 2 Gold Ingots.
I tried to make this tutorial as easy and descriptive as possible, any questions or concerns feel free to leave a message and I'll do my best to help. If throughout this tutorial I've put false information please inform me with the correct information so I can fix it, I don't want to misinform people!
*Also, I did not steal this tutorial from Mad's Modding Tutorials, check the credits, I wrote it, I just wanted to port it over here to show I'm capable of doing more "complex" things* or things that are widely covered.
Advanced/Hard Tutorials
If you used these tutorials or learned from them, either leave a comment or give me +rep. I do these on my own time, just as other tutorial/mod creators do, and it's the least you could do. If you find any mistakes or incorrect information, politely correct me and I will fix it. I don't want to misinform anyone.
Also, check out Mad's Modding Tutorials as well as Strength's Modding Tutorials! They got me started in modding and are a great resource.
Check out my Mod Page!
14
Items and Recipes
Dynamite
Dynamite Bundle
Desert Dynamite
Ice Dynamite
Nether Bomb
Lightning Attractor
Molotov Cocktails
Craftable Slimeballs
Sticky Dynamite
Glowstick
Sticky Glowstick
Spear
Videos
Featured Video: Mod demo by the ever-popular SUTTYYY!
Outdated Videos
Demo by GameChap and Bertie
Demo by craigk195
Demo by cars676
Demo by MegaCrafterGER
Demo + Epic pig killage by craigk195
Demo + Commentary by MCBHD
Download and Installation
Downloads
ModLoader by Risugami is required for all versions.
V1.0.0 for 1.0] With Properties File - customizable.
http://www.mediafire.com/?314vbgx3lbskk9d
32x32 Textures by Vattic, the maker of Faithful 32x32 pack!
http://www.minecraftforum.net/topic/72747-faithful-32x32-pack-updateender-crystal-many-mods-100/ (at bottom of page)
Old Versions
V2.5 for Beta 1.8.1] Deluxe Version - has all the features from above.
http://www.mediafire.com/?2agbl6gg248x8as
V1.0 for Beta 1.8.1] Classic Version - just dynamite and dynamite bundles.
http://www.mediafire.com/?bdc4pidclmn4yaq
Installation
Version History/Changelog
Support Dynamite Mod
Code:
Code:
Terms and Conditions
Post ideas and things I should change!
3
Screenshots:
Default:
Vattic's Failthful 32x32 Pack:
The map includes every block in a screenshot-able layout so you can easily share the look of your texture packs. There is an old items showcase in another part of the map that is not working, made by Lilyo. The map also contains a nether and end portal so they can be shown in the screenshot.
Download (MediaFire): http://www.mediafire.com/?c9u6vqd9doyq6fd
1
1
Also maybe making miningcarts out of all tier tools, and a meeleecart that uses any sword to kill nearby mobs. Also, maybe a vaccumcart that could suck up nearby items?
Crafting:
All tiers of mining gadgets:
VXV
SVP
VXV
Where v=1 tier less than the tools you want (wood for stone, stone for iron, etc.) (sticks for wood), S and P are the shovel and pick for the tier you want. Then craft like a normal miningcart.
All tiers of melee gadgets:
VXV
SVS
VXV
Same as the mining gadget but s is a sword of the tier you want. Put this on a cart with engine for a Meleecart.
Vaccum:
IRI
RIR
IRI
I = iron ingot R = redstone
Vaccumcart is cart with large chest under vaccum.
Simple AI Vaccumcart:
P
V
Simple PCB over vaccumcart. You could set this to reverse its direction when it's full, so it could go back and drop off what it picked up at an advanced detector rail.
1
2
I have changed all blocks, creepers, and pigs. Items, water, lava, and other mobs are coming soon. I cheated a bit on the mobs, they're 4x4, but it's impossible to make a 2x2 per 16 pixels mob. The 4x4 guy made his 8x8.
To clear this up, I made the textures 2x2 in a 32x32 terrain.png and resized them to normal size so that you do not need mcpatcher. Some people might say this is 16x16. I disagree, but call it whatever you like.
Before:
After:
Misc. Screenshots
Aether World (With) (thanks MrMonkey!)
Creeper (Sorry for bad lighting)
The Nether (Also bad lighting)
Coal, trees, grass
View from a mountaintop
Cave (thanks dveh!)
Land (with pigs!) (thanks dveh!)
Pumpkins and Trees (thanks dveh!)
Aether Screenshots (credit to MrMonkey!)
Dungeons/trees:
Grass/tree/clouds:
Portal:
Blocks:
Installation Instructions (v.1.2)
16x Basic/Aether Installation (MCPatcher not required)
1. Download either 16x download below.
2. If you would like custom water, install MCPatcher and follow its instructions.
3. Aether textures will automatically be used.
4. Run Minecraft
2x Basic/Aether Installation (MCPatcher required)
1. Download either 2x download below.
2. Install MCPatcher and follow its instructions.
3. Aether textures will automatically be used.
4. Run Minecraft
Downloads Only the good looking, customizable version is available at the moment, sorry!
I would like to customize my textures using MinecraftCustomizer! [Saved as 16x, MCPatcher needed only for water]
MinecraftCustomizer Page
Install textures normally for Aether!
1
A. It's the only 2x2 pack for 1.7. It's 'orignal'
B. It took effort.
C. Make a better texture pack. Then I will respect you. Just 'smack your face against the key board'.
1
I colored in the pixels by hand, I didn't just resize it.
Do you find it fun to hate on people?
1
I actually worked on my pack for hours, thank you very much. 2x2Craft is the ONLY 2x2 pack for 1.7
Haters gonna hate.
1
Not true.
I spent hours on it.
Stop hating.