- Java Development Kit 6 (JDK 6) или Java Development 7 (JDK 7). - Minecraft Coder Pack (нужную вам версию можно узнать выше). - Notepad++, PsPad или Eclipse - обязательно, иначе вы не сможете работать с кодом. - ModLoader + Клиент (нужную вам версию можно узнать выше). - Руки, но не [i]крюки. - Желательно базовое знание английского языка.
Установка:
1. Создаем папку в любом удобном для вас месте. 2. Копируем файлы архива MCP в эту папку. 3. Прописываем путь к javac.exe (JDK) в системной переменной PATH. Для того, чтобы прописать этот путь щелкните правой кнопкой мыши по ярлыку Мой компьютер и выберите категорию Дополнительно. Там же ниже будет кнопка Переменные среды. В системных переменных найдите переменную Path (PATH) и допишите в ней строки:
Code
;C:\Program Files\Java\jdk1.6.0_25\bin
или по-другому в зависимости от версии (определить можно по названию папки).
Без пробела и с символом "точка с запятой". Путь укажите, конечно же, по вашему усмотрению системы. 4. Кладем из клиента Minecraft папки bin и resources в папку jars, которая непосредственно находится в вашей папке которую вы подготовили ранее. 5. Откройте папку bin и найдите minecraft.jar. Откройте (не разархивируйте), и удалите папку META-INF (если есть). 6. Возьмите все файлы ModLoader'a и положите в minecraft.jar (возможно с заменой). 6. Запускаем decompile.bat. 7. Как только вы пройдете уроки ниже, просто напросто запускайте recompile.bat, а после чего startclient.bat и тестируйте. 8. Ну, а когда вы точно решили что мод готов - запускайте reobf.bat, проходите в папочку reobf и все содержимое кидайте в файл minecraft.jar специально подготовленной для этого игры.
Глава 1. Создание блока.
Запоминайте сразу, в пути \src\minecraft\net\minecraft\src находится весь декомпилированный код игры и туда мы будет складывать наши .java файлы.
Для начала давайте создадим новый файлик посредством редактора кода. Называться он будет mod_gcc.java. Он служит для складывания всей информации о блоках, рецептах, и т.д.
Впишем такую строчку.
Code
package net.minecraft.src;
Она включает магию которая даст возможность данному файлику работать с игрой. После чего добавим еще две строчки, но сначала делаем пробел.
Code
public class mod_gcc extends BaseMod {
Здесь мы создаем класс.
Code
public static Block newblock = new BlockNew(130, 0).setHardness(0.5F).setResistance(1.0F).setBlockName("newblock");
Пишем в 5 строке вот такие словечки про наш кубик, тут мы его регистрируем. Давайте попробуем разобрать данную неразбериху.
Code
public static Block newblock
newblock - это название, точнее регистр блока (не путайте с обычным названием, или консоль ошибок покарает вас!).
Code
new BlockNew(130, 0)
Ну а вот тут у нас как раз и обычное название. Будет использоваться для обозначения в отдельном файлике для блока (доп. характеристики). Число 130 - айди блока. Используйте с 130 по 250. Число 0 - не трогайте, это индексация текстуры по terrain.png, оно вообще не понадобится. Пусть стоит в фазе нуля.
Code
setHardness(0.5F)
Тут у нас крепкость указана. На сколько силен блок, так сказать. Вполне реально хватит и 0.5F если это блок похожий на землю (по скорости разрушения).
Code
setResistance(0.3F)
Устойчивость от взрыва. 0.3F отлично вписывается.
Code
setLightValue(1.0F)
Если хотите чтобы ваш блок был светящимся, просто укажите это через точку. 1.0F - светится как австралий.
Code
setBlockName("newblock")
Сделан специально чтобы полностью до конца объявить регистр.
Проверяем...
Code
package net.minecraft.src;
public class mod_gcc extends BaseMod { public static Block newblock = new BlockNew(130, 0).setHardness(0.5F).setResistance(1.0F).setBlockName("newblock");
Теперь давайте создадим специальный файлик BlockNew.java (по названию блока) который определит наш кубик в игре и даст возможность устанавливать ему уникальные свойства. Вписываем в первую строчку магические буковки, опять.
Code
package net.minecraft.src;
Затем импортируем еще одну магию которая даст нам возможность использовать функцию Random.
Code
import java.util.Random;
Потом создаем публичный класс (не забудьте название).
Code
public class BlockNew extends Block {
После чего копипастим вот это.
Code
public BlockNew(int i, int j) { super(i, j, Material.ground); }
Тут у нас получается что мы объявляем блок, делаем его настоящим (материальным) и задаем свойство (каждое свойство имеет ряд своих особенностей, типа звуков и т.п).
Дальше объявляем выбрасывание и его ID.
Code
public int idDropped(int i, Random random, int j) { return mod_gcc.newblock.blockID; } public int quantityDropped(Random random) { return 1; } }
Проверяем...
Code
package net.minecraft.src;
import java.util.Random;
public class BlockNew extends Block { public BlockNew(int i, int j) { super(i, j, Material.ground); } public int idDropped(int i, Random random, int j) { return mod_gcc.newblock.blockID; } public int quantityDropped(Random random) { return 1; } }
Если все так же - переходим к следующей главе.
Глава 1.1. Рецепт для блока или как добыть кубик.
Добавим четыре строчки для определения версии вашего мода (или названия, не важно) в файл mod_gcc.
Code
public String getVersion() { return "1.2.4 Tutorial"; }
Ну а теперь перейдем непосредственно к написанию рецепта. Запишем вот это:
Code
public void load() {
И начнем творить. Регистрируем блок строкой:
Code
ModLoader.registerBlock(newblock);
Добавляем название блока в игре.
Code
ModLoader.addName(newblock, "GCC");
И запюливаем сам рецептик.
Code
ModLoader.addRecipe(new ItemStack(newblock, 1), new Object[]{ "##", "##", Character.valueOf('#'), Block.dirt});
Разберем?
Code
(new ItemStack(newblock, 1)
При крафте появляется newblock в количестве 1 (изменяйте как душе угодно до 64).
Code
new Object[]{ "##", "##", Character.valueOf('#'), Block.dirt
Тут очень сложно объяснить для детей, взрослые может быть и поймут, но, я все же попробую.
Одна решетка обозначает одну ячейку сверху вниз (это может быть и верстак, если решеток более 3 в одной строке). Т.е. в нашем случае мы заполняем обычной землей (Block.dirt) все крафт-ячейки в инвентаре (их 4).
Для примера, если например ваш объект крафтится не только из земли, да еще и в верстаке, поступать нужно так.
Code
new Object[]{ "#X#", "#Z#", "#X#", Character.valueOf('X'), Block.dirt, Character.valueOf('Z'), Block.sand
В данном примере мы ставим землю по середине в верхней строке, ставим песок по середке в средней строке, и опять землю по середине, но только в третьей строке. Если какой-то символ (в нашем случае решетка) не указана в Character.valueOf - то значит дефолтно ячейки должны быть пусты (указаны, например символом #).
Проверяем.
Вот и все. Теперь ваш блок можно спокойно скрафтить. Но мы забыли добавить текстуру, о нет!
Для того, чтобы добавить свой блок (или предмет) в крафт, используйте префикс mod_gcc. Например:
Code
ModLoader.addRecipe(new ItemStack(newblock, 1), new Object[]{ "##", "##", Character.valueOf('#'), mod_gcc.smileItem});
Проверяем...
Code
package net.minecraft.src;
public class mod_gcc extends BaseMod { public static Block newblock = new BlockNew(130, 0).setHardness(0.5F).setResistance(1.0F).setBlockName("newblock");
public String getVersion() { return "1.2.4 Tutorial"; }
public void load() { ModLoader.registerBlock(newblock); ModLoader.addName(newblock, "GCC"); ModLoader.addRecipe(new ItemStack(newblock, 1), new Object[]{ "##", "##", Character.valueOf('#'), Block.dirt}); } }
Глава 1.2. Присваиваем текстуру.
Эта глава очень короткая и легкая, но все же я выделил ей особое место. Берем вот такую текстуру:
(размеры не изменять!)
И временно кидаем ее в папку jars/bin.
Заходим в папку bin, находим minecraft.jar, открываем ее посредством WinRar или 7-zip и создаем там папочку textures. И в эту папочку кидаем нашу текстуру java.png.
Теперь открываем mod_gcc.java и добавляем строчки рядом с рецептом.
Сразу предупреждаю, не забывайте изменять название регистра здесь (у меня частенько бывает такое).
Code
ModLoader.addOverride("/terrain.png"
Не знаю зачем оно, но вроде индексирует размеры блоков внутри terrain.png. Оставляем как есть.
Code
"/textures/java.png"
Ну а тут, непосредственно, указывается путь к текстуре. В нашем случае это java.png в папке textures.
Вот и все! Проверяем...
Code
package net.minecraft.src;
public class mod_gcc extends BaseMod { public static Block newblock = new BlockNew(130, 0).setHardness(0.5F).setResistance(1.0F).setBlockName("newblock");
public String getVersion() { return "1.2.4 Tutorial"; }
public void load() { ModLoader.registerBlock(newblock); ModLoader.addName(newblock, "GCC"); ModLoader.addRecipe(new ItemStack(newblock, 1), new Object[]{ "##", "##", Character.valueOf('#'), Block.dirt});
Если вы уверены что все сделали правильно, запускайте recompile.bat, проверяйте на наличие ошибок (если есть, отписывайте с вопросами сюда), после чего включайте startclient.bat и наслаждайтесь вашим творением!
Глава 1.3. Создание предмета
Для начала добавим одну строчку:
Code
public static final Item smileItem = new Smile(3000).setItemName("smileItem");
сразу же после строки:
Code
public static Block newblock = new BlockNew(130, 0).setHardness(0.5F).setResistance(1.0F).setBlockName("newblock");
давайте разберем то, что мы только что написали:
Code
Item smileItem
Вызываем предмет по тех. названию.
Code
new Smile
Название для будущего Smile.java.
Code
(3000)
IDпредмета
Code
setItemName("smileItem")
Объявляем предмет, даем ему тех. название для идентификации.
И записываем следующее: Это вам должно быть знакомо
Code
ModLoader.AddName(smileItem, "Smile");
Code
(smileItem, "Smile")
И последняя строка рецепта.
Code
ModLoader.addRecipe(new ItemStack(smileItem, 5), new Object[]{ "X#", "#X", Character.valueOf('X'), Block.dirt});
Теперь нам нужно создать файлик Smile.java для определения свойств. В первой строке как обычно:
Code
package net.minecraft.src;
дальше прописываем:
Code
public class Smile extends Item { public Smile(int i) { super(i); maxStackSize = 64; } }
Code
maxStackSize = 64;
Максимальное количество предмета в одном стаке (нап. 64). Проверяем...
Code
package net.minecraft.src;
public class mod_gcc extends BaseMod { public static Block newblock = new BlockNew(130, 0).setHardness(0.5F).setResistance(1.0F).setBlockName("newblock"); public static final Item smileItem = new Smile(3000).setItemName("smileItem");
public String getVersion() { return "1.2.4 Tutorial"; }
public void load() { ModLoader.registerBlock(newblock); ModLoader.addName(newblock, "GCC"); ModLoader.addRecipe(new ItemStack(newblock, 1), new Object[]{ "ZZ", "ZZ", Character.valueOf('Z'), Block.dirt}); newblock.blockIndexInTexture = ModLoader.addOverride("/terrain.png", "/textures/java.png");
public class mod_gcc extends BaseMod { public static Block newblock = new BlockNew(130, 0).setHardness(0.5F).setResistance(1.0F).setBlockName("newblock"); public static final Item smileItem = new Smile(3000).setItemName("smileItem");
public String getVersion() { return "1.2.4 Tutorial"; }
public void load() { ModLoader.registerBlock(newblock); ModLoader.addName(newblock, "GCC"); ModLoader.addRecipe(new ItemStack(newblock, 1), new Object[]{ "ZZ", "ZZ", Character.valueOf('Z'), Block.dirt}); newblock.blockIndexInTexture = ModLoader.addOverride("/terrain.png", "/textures/java.png");
Сейчас я попробую рассказать, как заставить наш блок генерироваться в игровом мире. Для примера он будет появляться у камня (2-3 блока вниз).
Откроем mod_gcc.java.
После первой строки добавьте строку:
Code
import java.util.Random;
А после 13 строки сделаем отступ и запишем вот это.
Code
public void generateSurface(World world, Random rand, int chunkX, int chunkZ) { for(int i = 0; i < 150; i++) { int randPosX = chunkX + rand.nextInt(16); int randPosY = rand.nextInt(150); int randPosZ = chunkZ + rand.nextInt(16); (new WorldGenMinable(mod_gcc.newblock.blockID, 32)).generate(world, rand, randPosX, randPosY, randPosZ); } }
Разбираем.
Число 150 отвечает за редкость блока в игровом мире. 150 - это почти вездесущий, и его будет дохрена. Для теста 150 подойдет отлично. Далее просто экспериментируйте.
Code
for(int i = 0; i < 150; i++)
150 - высота блока от админиума (бедрока). В нашем случае получается он выше камня на один блок в генерации. Тоже можно экспериментировать.
Code
int randPosY = rand.nextInt(150);
mod_gcc - наш мод. newblock - регистр блока. Число 32 - количество блоков на одном месторождении. Для теста я использовал 32 блока.
Code
(new WorldGenMinable(mod_gcc.newblock.blockID, 32)).generate(world, rand, randPosX, randPosY, randPosZ);
Проверяем:
Code
package net.minecraft.src;
public class mod_gcc extends BaseMod { public static Block newblock = new BlockNew(130, 0).setHardness(0.5F).setResistance(1.0F).setBlockName("newblock"); public static final Item smileItem = new Smile(3000).setItemName("smileItem");
public void generateSurface(World world, Random rand, int chunkX, int chunkZ) { for(int i = 0; i < 150; i++) { int randPosX = chunkX + rand.nextInt(16); int randPosY = rand.nextInt(150); int randPosZ = chunkZ + rand.nextInt(16); (new WorldGenMinable(mod_gcc.newblock.blockID, 32)).generate(world, rand, randPosX, randPosY, randPosZ); } }
public String getVersion() { return "1.2.4 Tutorial"; }
public void load() { ModLoader.registerBlock(newblock); ModLoader.addName(newblock, "GCC"); ModLoader.addRecipe(new ItemStack(newblock, 1), new Object[]{ "ZZ", "ZZ", Character.valueOf('Z'), Block.dirt}); newblock.blockIndexInTexture = ModLoader.addOverride("/terrain.png", "/textures/java.png");