- Регистрация
- 4 Апр 2025
- Сообщения
- 24
- Реакции
- 0
- Баллы
- 1
- Город
- Санкт-Петербург
- Веб-сайт
- paxgame.ru
- Discord
- nicolayka
В этом учебнике вы научитесь моддить в Forge, тут написаны мои, и собраны разные туториалы, с разных источников. Удачи в моддинге!
Что требуется для моддинга с Forge?
1. JDK 7
2. MCP (Minecraft Coder Pack)
3. Forge-Src, находим Recommended:, и нажимаем Source. Другие версии тут.
4. Eclipse
5. Чистый клиент и обязательно сервер
Как скачать клиент (Пиратский)
Планы:
Броня, Оружие, Инструменты
Генерация
Добавление Биома
История:
Мини-FAQ
0.1. Подготовка.
0. Как сделать сам мод (Как запаковать в архив).
1. Создание блока.
2. Создание предмета.
3. Текстура (Проблема с текстурой)
4. Рецепты (Крафт, Печка)
5. Как сделать еду.
6. Создание конфиг файла.
7. Создание Metadata блоку.
8.Создание Metadata итему.
Что требуется для моддинга с Forge?
1. JDK 7
2. MCP (Minecraft Coder Pack)
3. Forge-Src, находим Recommended:, и нажимаем Source. Другие версии тут.
4. Eclipse
5. Чистый клиент и обязательно сервер
Как скачать клиент (Пиратский)
Качаем minecraftSP.zip, распаковываем, нажимаем, и видем окно:
Ждём пока загрузка кончиться, и всё, у вас есть чистый клиент!
Ждём пока загрузка кончиться, и всё, у вас есть чистый клиент!
Планы:
Броня, Оружие, Инструменты
Генерация
Добавление Биома
История:
- 22.03.2013 - Сделан туториал Как сделать печку. Перенесен урок Как сделать разносторонний блок.
- 21.03.2013 - Добавлена Категория Мини-Туториалы. Добавлен урок По добавлению Русских имен блокам, и итемам. Перенесен урок 2. Как сделать цветной текст итему и блоку. в категорию Мини-Туториалы. Изменена половина гайдов.
- 12.03.2013 - изменен урок №3. Добавлен урок по созданию сундука.
- 06.03.2013 - изменён урок №11.
- 23.02.2013 - изменён урок №12. Изменены все гайды.
- 17.02.2013 - изменён урок №4. Изменён урок №0 Добавлен урок по решении проблемы с текстурой.
- 06.02.2013 - добавлен туториал по созданию еды. Добавлен туториал по созданию блока с моделью.
- 05.02.2013 - исправлена ошибка в уроке №7, при которой мир в Minecraft не создавался и игра брала очень много Оперативной памяти.
Внимание
- Если вы моддите в первый раз лучше всего идти постепенно, не пропуская уроков.
- Если будут проблемы, или ошибки, не спешите в теме просить помощь, сначала посмотрите маленький FAQ.
Мини-FAQ
Всё свои ошибки пишем в спойлерах:
[ spoiler ] [ /spoiler ]
Вопрос: Я написал код, как мне теперь его проверить в игре?
Ответ: Теперь вам надо его рекомпилировать, нажмите recompile.bat (Пакетный файл MS-DOS), подождите пока пройдёт время, и теперь нажмите startclient.bat.
Вопрос: Я хотел рекомпилировать мод, нажал recompile.bat, появилось окно и пропало, что мне делать?
Ответ: Запускать надо recompile.bat (Пакетный файл MS-DOS), это относится и другим bat'никам.
Вопрос: Нажал recompile.bat, всё было хорошо, но потом мне консоль написал это:
(Пример) src\minecraft\net\testmod\src\TestModBase.java:25: unmappable character for enco
ding UTF-8
//????
Ответ: Forge не принимает UTF-8, удаляйте все русские комментарии, а то рекомпилятор покарает вас ошибками.
[ spoiler ] [ /spoiler ]
Вопрос: Я написал код, как мне теперь его проверить в игре?
Ответ: Теперь вам надо его рекомпилировать, нажмите recompile.bat (Пакетный файл MS-DOS), подождите пока пройдёт время, и теперь нажмите startclient.bat.
Вопрос: Я хотел рекомпилировать мод, нажал recompile.bat, появилось окно и пропало, что мне делать?
Ответ: Запускать надо recompile.bat (Пакетный файл MS-DOS), это относится и другим bat'никам.
Вопрос: Нажал recompile.bat, всё было хорошо, но потом мне консоль написал это:
(Пример) src\minecraft\net\testmod\src\TestModBase.java:25: unmappable character for enco
ding UTF-8
//????
Ответ: Forge не принимает UTF-8, удаляйте все русские комментарии, а то рекомпилятор покарает вас ошибками.
0.1. Подготовка.
Не надо удалять META-INF, в minecraft.jar, и minecraft_server.jar
1. Создаем папку (Например: MCP Forge) и распаковываем туда содержание архива с MCP.
2. Копируем в папку ../MCP Forge/jars/ , из клиента папку bin и resources, из сервера нам потребуется только minecraft_server.jar.
3. Распаковываем архив с Forge-src в папку MCP Forge
4. Открываем папку ../MCP Forge/forge/ и запускаем файл install.cmd. Ждем окончания декомпиляции..
(P.S Если хотите что бы у вас уже был готовый MCP с Forge, например если вы случайно удалили его или ещё что-то, то: Когда декомпиляция пройдёт запустите игру пусть скачает lib, и потом добавьте в архив этот MCP Forge например так (mcp Forge 1.4.7)
5. "Устанавливаем" и запускаем Eclipse, во время запуска у вас "спросят" папку с проектом, указываем путь: ../MCP Forge/eclipse/
6. Итак, мы открыли проект, теперь (Обычно слева, есть Package explorer) смотрим, какую библиотеку он "ест"(В окне Package explorer, "открываем проект Minecraft" и если будет строка "JRE System Library [JavaSE-1.7]", то все нормально, но если строка "JRE System Library [JavaSE-1.6]", то нажимаем ПКМ(Правой кнопкой мыши), выбираем пункт Properties, далее открылось окно в нем пункт Execution environment, выбираем в нем JavaSE-1.7 и нажимаем Ok.
7. Итак, приготовления готовы.
Как же все таки начать писать мод?
Для начала, нам нужно создать "основу", то есть основную "папку" в которой будет храниться наша "основа" и все остальное.
1. Создаем папку (Например: MCP Forge) и распаковываем туда содержание архива с MCP.
2. Копируем в папку ../MCP Forge/jars/ , из клиента папку bin и resources, из сервера нам потребуется только minecraft_server.jar.
3. Распаковываем архив с Forge-src в папку MCP Forge
4. Открываем папку ../MCP Forge/forge/ и запускаем файл install.cmd. Ждем окончания декомпиляции..
(P.S Если хотите что бы у вас уже был готовый MCP с Forge, например если вы случайно удалили его или ещё что-то, то: Когда декомпиляция пройдёт запустите игру пусть скачает lib, и потом добавьте в архив этот MCP Forge например так (mcp Forge 1.4.7)
5. "Устанавливаем" и запускаем Eclipse, во время запуска у вас "спросят" папку с проектом, указываем путь: ../MCP Forge/eclipse/
6. Итак, мы открыли проект, теперь (Обычно слева, есть Package explorer) смотрим, какую библиотеку он "ест"(В окне Package explorer, "открываем проект Minecraft" и если будет строка "JRE System Library [JavaSE-1.7]", то все нормально, но если строка "JRE System Library [JavaSE-1.6]", то нажимаем ПКМ(Правой кнопкой мыши), выбираем пункт Properties, далее открылось окно в нем пункт Execution environment, выбираем в нем JavaSE-1.7 и нажимаем Ok.
7. Итак, приготовления готовы.
Как же все таки начать писать мод?
Для начала, нам нужно создать "основу", то есть основную "папку" в которой будет храниться наша "основа" и все остальное.
- 1.Заходим в Eclipse видим в Package Explorer папку Minecraft, открываем, и нажимаем ПКМ на папку src, выбираем New->Package. Открытом окне в строке Name, мы указываем название папки в которой будет все храниться (Для примера возьмем: testmod.src ) и нажимаем Ok.
- 2. Нажимаем ПКМ по нашей папке ( testmod.src ), далее New -> Class. В строке Name указываем название нашего файла (Например: TestModBase ) и нажимаем Finish.
- 3. В новых версиях надо импортировать "Очень много" всего, чтобы сделать это быстрее в Эклипсе нажимайте "ctrl + shift + o", и вам быстро он всё импортирует, а если появиться окно тогда выбирайте нужный вам импорт.
- 4. Если вы работаете не в эклипсе, тогда вам будет намного труднее, так что лучше перейти на него, он укажет где ошибка, и какие импорты надо, и вы не будете задавать глупых вопросов в комментариях.
package testmod.src;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.Init;
import cpw.mods.fml.common.Mod.Instance;
import cpw.mods.fml.common.Mod.PostInit;
import cpw.mods.fml.common.Mod.PreInit;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.event.FMLPostInitializationEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
import cpw.mods.fml.common.network.NetworkMod;
import cpw.mods.fml.common.network.NetworkRegistry;
import cpw.mods.fml.common.registry.GameRegistry;
import cpw.mods.fml.common.registry.LanguageRegistry;
import cpw.mods.fml.common.network.NetworkMod.SidedPacketHandler;
import cpw.mods.fml.common.SidedProxy;
@Mod (modid = "TestMod", name = "Test Mod", version = "0.0.1")
@NetworkMod (clientSideRequired = true, serverSideRequired = false, versionBounds = "1.0.0")
public class TestModBase {
@Instance("TestModID")
public static TestModBase instance;
@Init
public void load(FMLInitializationEvent event)
{
}
@PreInit
public void preLoad(FMLPreInitializationEvent event)
{
}
@PostInit
public void postLoad(FMLPostInitializationEvent event)
{
}
}
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.Init;
import cpw.mods.fml.common.Mod.Instance;
import cpw.mods.fml.common.Mod.PostInit;
import cpw.mods.fml.common.Mod.PreInit;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.event.FMLPostInitializationEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
import cpw.mods.fml.common.network.NetworkMod;
import cpw.mods.fml.common.network.NetworkRegistry;
import cpw.mods.fml.common.registry.GameRegistry;
import cpw.mods.fml.common.registry.LanguageRegistry;
import cpw.mods.fml.common.network.NetworkMod.SidedPacketHandler;
import cpw.mods.fml.common.SidedProxy;
@Mod (modid = "TestMod", name = "Test Mod", version = "0.0.1")
@NetworkMod (clientSideRequired = true, serverSideRequired = false, versionBounds = "1.0.0")
public class TestModBase {
@Instance("TestModID")
public static TestModBase instance;
@Init
public void load(FMLInitializationEvent event)
{
}
@PreInit
public void preLoad(FMLPreInitializationEvent event)
{
}
@PostInit
public void postLoad(FMLPostInitializationEvent event)
{
}
}
0. Как сделать сам мод (Как запаковать в архив).
Когда вы уже сделаете мод, надо: Нажимайте recompile.bat, потом reobfuscate.bat, когда всё закончиться зайдите в папку reobf/minecraft, и положите в папку testmod нашу папку с текстурой, по туториалу у нас папка textures, теперь нажимаем на папку testmod правой кнопкой, Добавить в архив... выбираем формат .zip, пишем название мода, кидаем наш архив в клиент, в папку mods, играем!
1. Создание блока.
TestModBase
package testmod.src;
import net.minecraft.block.Block;//Добавляем импорт блоков
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.Init;
import cpw.mods.fml.common.Mod.Instance;
import cpw.mods.fml.common.Mod.PostInit;
import cpw.mods.fml.common.Mod.PreInit;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.event.FMLPostInitializationEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
import cpw.mods.fml.common.network.NetworkMod;
import cpw.mods.fml.common.network.NetworkRegistry;
import cpw.mods.fml.common.registry.GameRegistry;
import cpw.mods.fml.common.registry.LanguageRegistry;
import cpw.mods.fml.common.network.NetworkMod.SidedPacketHandler;
import cpw.mods.fml.common.SidedProxy;
@Mod (modid = "TestMod", name = "Test Mod", version = "0.0.1")
@NetworkMod (clientSideRequired = true, serverSideRequired = false, versionBounds = "1.0.0")
public class TestModBase {
//Сам блок, 0 - место текстуры в нашем terrain
public static final Block testBlock = new TestBlock(2020,0).setBlockName("testBlock");
@Instance("TestModID")
public static TestModBase instance;
@Init
public void load(FMLInitializationEvent event)
{
GameRegistry.registerBlock(testBlock);//Регистрация блока
LanguageRegistry.addName(testBlock, "Test Block");//Имя блока
}
@PreInit
public void preLoad(FMLPreInitializationEvent event)
{
}
@PostInit
public void postLoad(FMLPostInitializationEvent event)
{
}
}
TestBlock
package testmod.src;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.creativetab.CreativeTabs;//Добавляем импорт для креативной категории
public class TestBlock extends Block {
public TestBlock(int par1, int par2)
{
super(par1,par2,Material.rock); //par1 - ID блока, par2 - ID его текстуры(Считается от 0), берется из файла ниже.
setCreativeTab(CreativeTabs.tabTools); //Добавляем в панель Creative режима
}
public String getTextureFile()
{
return "/testmod/textures/terrain.png"; //Указываем путь к текстурам. Путь данных текстур ../MCP Forge/src/minecraft/net/test/textures.png
}
}
package testmod.src;
import net.minecraft.block.Block;//Добавляем импорт блоков
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.Init;
import cpw.mods.fml.common.Mod.Instance;
import cpw.mods.fml.common.Mod.PostInit;
import cpw.mods.fml.common.Mod.PreInit;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.event.FMLPostInitializationEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
import cpw.mods.fml.common.network.NetworkMod;
import cpw.mods.fml.common.network.NetworkRegistry;
import cpw.mods.fml.common.registry.GameRegistry;
import cpw.mods.fml.common.registry.LanguageRegistry;
import cpw.mods.fml.common.network.NetworkMod.SidedPacketHandler;
import cpw.mods.fml.common.SidedProxy;
@Mod (modid = "TestMod", name = "Test Mod", version = "0.0.1")
@NetworkMod (clientSideRequired = true, serverSideRequired = false, versionBounds = "1.0.0")
public class TestModBase {
//Сам блок, 0 - место текстуры в нашем terrain
public static final Block testBlock = new TestBlock(2020,0).setBlockName("testBlock");
@Instance("TestModID")
public static TestModBase instance;
@Init
public void load(FMLInitializationEvent event)
{
GameRegistry.registerBlock(testBlock);//Регистрация блока
LanguageRegistry.addName(testBlock, "Test Block");//Имя блока
}
@PreInit
public void preLoad(FMLPreInitializationEvent event)
{
}
@PostInit
public void postLoad(FMLPostInitializationEvent event)
{
}
}
TestBlock
package testmod.src;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.creativetab.CreativeTabs;//Добавляем импорт для креативной категории
public class TestBlock extends Block {
public TestBlock(int par1, int par2)
{
super(par1,par2,Material.rock); //par1 - ID блока, par2 - ID его текстуры(Считается от 0), берется из файла ниже.
setCreativeTab(CreativeTabs.tabTools); //Добавляем в панель Creative режима
}
public String getTextureFile()
{
return "/testmod/textures/terrain.png"; //Указываем путь к текстурам. Путь данных текстур ../MCP Forge/src/minecraft/net/test/textures.png
}
}
2. Создание предмета.
TestModBase
package testmod.src;
import net.minecraft.block.Block;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.Init;
import cpw.mods.fml.common.Mod.Instance;
import cpw.mods.fml.common.Mod.PostInit;
import cpw.mods.fml.common.Mod.PreInit;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.event.FMLPostInitializationEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
import cpw.mods.fml.common.network.NetworkMod;
import cpw.mods.fml.common.network.NetworkRegistry;
import cpw.mods.fml.common.registry.GameRegistry;
import cpw.mods.fml.common.registry.LanguageRegistry;
import cpw.mods.fml.common.network.NetworkMod.SidedPacketHandler;
import cpw.mods.fml.common.SidedProxy;
@Mod (modid = "TestMod", name = "Test Mod", version = "0.0.1")
@NetworkMod (clientSideRequired = true, serverSideRequired = false, versionBounds = "1.0.0")
public class TestModBase {
public static final Item TestItem = new TestItem(5003,64).setItemName("TestItem").setIconCoord(0,0);
//TestItem(5003,64) - 5003 - ID предмета, 64 - максимальное кол-во в ячейке.
//.setIconCoord - Номер иконки в наших текстурах (Первая цифра слева-направо, вторая сверху-вниз)
@Instance("TestModID")
public static TestModBase instance;
@Init
public void load(FMLInitializationEvent event)
{
LanguageRegistry.addName(TestItem, "Test Item");
}
@PreInit
public void preLoad(FMLPreInitializationEvent event)
{
}
@PostInit
public void postLoad(FMLPostInitializationEvent event)
{
}
}
TestItem
package testmod.src;
import net.minecraft.item.Item;
import net.minecraft.creativetab.CreativeTabs;
public class TestItem extends Item
{
public TestItem(int i, int j)
{
super(i);
maxStackSize=j;
setCreativeTab(CreativeTabs.tabTools);
}
public String getTextureFile()
{
return "/testmod/textures/terrain.png";
}
}
package testmod.src;
import net.minecraft.block.Block;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.Init;
import cpw.mods.fml.common.Mod.Instance;
import cpw.mods.fml.common.Mod.PostInit;
import cpw.mods.fml.common.Mod.PreInit;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.event.FMLPostInitializationEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
import cpw.mods.fml.common.network.NetworkMod;
import cpw.mods.fml.common.network.NetworkRegistry;
import cpw.mods.fml.common.registry.GameRegistry;
import cpw.mods.fml.common.registry.LanguageRegistry;
import cpw.mods.fml.common.network.NetworkMod.SidedPacketHandler;
import cpw.mods.fml.common.SidedProxy;
@Mod (modid = "TestMod", name = "Test Mod", version = "0.0.1")
@NetworkMod (clientSideRequired = true, serverSideRequired = false, versionBounds = "1.0.0")
public class TestModBase {
public static final Item TestItem = new TestItem(5003,64).setItemName("TestItem").setIconCoord(0,0);
//TestItem(5003,64) - 5003 - ID предмета, 64 - максимальное кол-во в ячейке.
//.setIconCoord - Номер иконки в наших текстурах (Первая цифра слева-направо, вторая сверху-вниз)
@Instance("TestModID")
public static TestModBase instance;
@Init
public void load(FMLInitializationEvent event)
{
LanguageRegistry.addName(TestItem, "Test Item");
}
@PreInit
public void preLoad(FMLPreInitializationEvent event)
{
}
@PostInit
public void postLoad(FMLPostInitializationEvent event)
{
}
}
TestItem
package testmod.src;
import net.minecraft.item.Item;
import net.minecraft.creativetab.CreativeTabs;
public class TestItem extends Item
{
public TestItem(int i, int j)
{
super(i);
maxStackSize=j;
setCreativeTab(CreativeTabs.tabTools);
}
public String getTextureFile()
{
return "/testmod/textures/terrain.png";
}
}
3. Текстура (Проблема с текстурой)
Этот мини-гайд исправит такую ошибку (пример):
Warning: Texture /Textures.png not preloaded, will cause render glitches!
В нашу базу пишем это (уже с блоком, и итемом):
package testmod.src;
import net.minecraft.block.Block;
import net.minecraft.item.Item;
import net.minecraftforge.client.MinecraftForgeClient;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.Init;
import cpw.mods.fml.common.Mod.Instance;
import cpw.mods.fml.common.Mod.PostInit;
import cpw.mods.fml.common.Mod.PreInit;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.event.FMLPostInitializationEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
import cpw.mods.fml.common.network.NetworkMod;
import cpw.mods.fml.common.network.NetworkRegistry;
import cpw.mods.fml.common.registry.GameRegistry;
import cpw.mods.fml.common.registry.LanguageRegistry;
import cpw.mods.fml.common.network.NetworkMod.SidedPacketHandler;
import cpw.mods.fml.common.SidedProxy;
@Mod (modid = "TestMod", name = "Test Mod", version = "0.0.1")
@NetworkMod (clientSideRequired = true, serverSideRequired = false, versionBounds = "1.0.0")
public class TestModBase {
@Instance("TestModID")
public static TestModBase instance;
@SidedProxy(clientSide = "testmod.src.ClientProxy", serverSide = "testmod.src.CommonProxy")
public static CommonProxy proxy;
public static final Block testBlock = new TestBlock(2020,0).setBlockName("testBlock");
public static final Item TestItem = new TestItem(5003,64).setItemName("TestItem").setIconCoord(0,0);
@Init
public void load(FMLInitializationEvent event)
{
proxy.registerRenderThings();
GameRegistry.registerBlock(testBlock);
LanguageRegistry.addName(testBlock, "Test Block");
LanguageRegistry.addName(TestItem, "Test Item");
}
@PreInit
public void preLoad(FMLPreInitializationEvent event)
{
}
@PostInit
public void postLoad(FMLPostInitializationEvent event)
{
}
Делаем CommonProxy:
package testmod.src;
public class CommonProxy
{
public void registerRenderThings()
{
}
}
И последнее ClientProxy:
package testmod.src;
import cpw.mods.fml.client.registry.RenderingRegistry;
import cpw.mods.fml.common.registry.GameRegistry;
import net.minecraft.client.model.ModelBiped;
import net.minecraftforge.client.MinecraftForgeClient;
public class ClientProxy extends CommonProxy
{
@Override
public void registerRenderThings()
{//Загружаем текстуру
MinecraftForgeClient.preloadTexture("/net/test/textures.png");
}
}
P.S. Если мы в метод (TestModBase.java)
public void preLoad(FMLPreInitializationEvent event)
, добавим этот прелоад
MinecraftForgeClient.preloadTexture("/testmod/textures/terrain.png");
, то клиент запустится без ошибки, а сервер даст крах ))
Warning: Texture /Textures.png not preloaded, will cause render glitches!
В нашу базу пишем это (уже с блоком, и итемом):
package testmod.src;
import net.minecraft.block.Block;
import net.minecraft.item.Item;
import net.minecraftforge.client.MinecraftForgeClient;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.Init;
import cpw.mods.fml.common.Mod.Instance;
import cpw.mods.fml.common.Mod.PostInit;
import cpw.mods.fml.common.Mod.PreInit;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.event.FMLPostInitializationEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
import cpw.mods.fml.common.network.NetworkMod;
import cpw.mods.fml.common.network.NetworkRegistry;
import cpw.mods.fml.common.registry.GameRegistry;
import cpw.mods.fml.common.registry.LanguageRegistry;
import cpw.mods.fml.common.network.NetworkMod.SidedPacketHandler;
import cpw.mods.fml.common.SidedProxy;
@Mod (modid = "TestMod", name = "Test Mod", version = "0.0.1")
@NetworkMod (clientSideRequired = true, serverSideRequired = false, versionBounds = "1.0.0")
public class TestModBase {
@Instance("TestModID")
public static TestModBase instance;
@SidedProxy(clientSide = "testmod.src.ClientProxy", serverSide = "testmod.src.CommonProxy")
public static CommonProxy proxy;
public static final Block testBlock = new TestBlock(2020,0).setBlockName("testBlock");
public static final Item TestItem = new TestItem(5003,64).setItemName("TestItem").setIconCoord(0,0);
@Init
public void load(FMLInitializationEvent event)
{
proxy.registerRenderThings();
GameRegistry.registerBlock(testBlock);
LanguageRegistry.addName(testBlock, "Test Block");
LanguageRegistry.addName(TestItem, "Test Item");
}
@PreInit
public void preLoad(FMLPreInitializationEvent event)
{
}
@PostInit
public void postLoad(FMLPostInitializationEvent event)
{
}
Делаем CommonProxy:
package testmod.src;
public class CommonProxy
{
public void registerRenderThings()
{
}
}
И последнее ClientProxy:
package testmod.src;
import cpw.mods.fml.client.registry.RenderingRegistry;
import cpw.mods.fml.common.registry.GameRegistry;
import net.minecraft.client.model.ModelBiped;
import net.minecraftforge.client.MinecraftForgeClient;
public class ClientProxy extends CommonProxy
{
@Override
public void registerRenderThings()
{//Загружаем текстуру
MinecraftForgeClient.preloadTexture("/net/test/textures.png");
}
}
P.S. Если мы в метод (TestModBase.java)
public void preLoad(FMLPreInitializationEvent event)
, добавим этот прелоад
MinecraftForgeClient.preloadTexture("/testmod/textures/terrain.png");
, то клиент запустится без ошибки, а сервер даст крах ))
4. Рецепты (Крафт, Печка)
package testmod.src;
import net.minecraft.block.Block;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.Init;
import cpw.mods.fml.common.Mod.Instance;
import cpw.mods.fml.common.Mod.PostInit;
import cpw.mods.fml.common.Mod.PreInit;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.event.FMLPostInitializationEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
import cpw.mods.fml.common.network.NetworkMod;
import cpw.mods.fml.common.network.NetworkRegistry;
import cpw.mods.fml.common.registry.GameRegistry;
import cpw.mods.fml.common.registry.LanguageRegistry;
import cpw.mods.fml.common.network.NetworkMod.SidedPacketHandler;
import cpw.mods.fml.common.SidedProxy;
@Mod (modid = "TestMod", name = "Test Mod", version = "0.0.1")
@NetworkMod (clientSideRequired = true, serverSideRequired = false, versionBounds = "1.0.0")
public class TestModBase {
@Instance("TestModID")
public static TestModBase instance;
@Init
public void load(FMLInitializationEvent event)
{
/**
* "Обычный крафт"
* При крафте получаем алмаз, 1 - сколько получим при крафте, для своего крафта пишем
* так: TestModBase.свой блок/итем. Если вам будет понятней то можете крафт записать и в другой форме.
*/
GameRegistry.addRecipe(new ItemStack(Block.oreDiamond, 1), new Object[]{ "XXX", "X#X", "XXX", Character.valueOf('X'), Block.cobblestone, ('#'), Block.dirt});
GameRegistry.addRecipe(new ItemStack(Block.oreDiamond, 1), new Object[]{
"XXX",
"X#X",
"XXX", Character.valueOf('X'), Block.cobblestone, ('#'), Block.dirt});
/**
* "Бесформенный крафт"
* С этим крафтом мы сможем класть наши вещи как попало. Кладём палку и грязь, получаем алмазную руду.
*/
GameRegistry.addShapelessRecipe(new ItemStack(Block.oreDiamond, 4), new Object[] {Item.stick, Block.dirt});
/**
* "Переплавка в печке"
* С земли делаем уголь, 1 - сколько получим после переплавки, 1.0F - опыт при переплавки
*/
GameRegistry.addSmelting(Block.dirt.blockID, new ItemStack(Item.coal, 1), 1.0F);
}
@PreInit
public void preLoad(FMLPreInitializationEvent event)
{
}
@PostInit
public void postLoad(FMLPostInitializationEvent event)
{
}
}
import net.minecraft.block.Block;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.Init;
import cpw.mods.fml.common.Mod.Instance;
import cpw.mods.fml.common.Mod.PostInit;
import cpw.mods.fml.common.Mod.PreInit;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.event.FMLPostInitializationEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
import cpw.mods.fml.common.network.NetworkMod;
import cpw.mods.fml.common.network.NetworkRegistry;
import cpw.mods.fml.common.registry.GameRegistry;
import cpw.mods.fml.common.registry.LanguageRegistry;
import cpw.mods.fml.common.network.NetworkMod.SidedPacketHandler;
import cpw.mods.fml.common.SidedProxy;
@Mod (modid = "TestMod", name = "Test Mod", version = "0.0.1")
@NetworkMod (clientSideRequired = true, serverSideRequired = false, versionBounds = "1.0.0")
public class TestModBase {
@Instance("TestModID")
public static TestModBase instance;
@Init
public void load(FMLInitializationEvent event)
{
/**
* "Обычный крафт"
* При крафте получаем алмаз, 1 - сколько получим при крафте, для своего крафта пишем
* так: TestModBase.свой блок/итем. Если вам будет понятней то можете крафт записать и в другой форме.
*/
GameRegistry.addRecipe(new ItemStack(Block.oreDiamond, 1), new Object[]{ "XXX", "X#X", "XXX", Character.valueOf('X'), Block.cobblestone, ('#'), Block.dirt});
GameRegistry.addRecipe(new ItemStack(Block.oreDiamond, 1), new Object[]{
"XXX",
"X#X",
"XXX", Character.valueOf('X'), Block.cobblestone, ('#'), Block.dirt});
/**
* "Бесформенный крафт"
* С этим крафтом мы сможем класть наши вещи как попало. Кладём палку и грязь, получаем алмазную руду.
*/
GameRegistry.addShapelessRecipe(new ItemStack(Block.oreDiamond, 4), new Object[] {Item.stick, Block.dirt});
/**
* "Переплавка в печке"
* С земли делаем уголь, 1 - сколько получим после переплавки, 1.0F - опыт при переплавки
*/
GameRegistry.addSmelting(Block.dirt.blockID, new ItemStack(Item.coal, 1), 1.0F);
}
@PreInit
public void preLoad(FMLPreInitializationEvent event)
{
}
@PostInit
public void postLoad(FMLPostInitializationEvent event)
{
}
}
5. Как сделать еду.
Пишем в TestModBase это:
package testmod.src;
import net.minecraft.block.Block;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.Init;
import cpw.mods.fml.common.Mod.Instance;
import cpw.mods.fml.common.Mod.PostInit;
import cpw.mods.fml.common.Mod.PreInit;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.event.FMLPostInitializationEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
import cpw.mods.fml.common.network.NetworkMod;
import cpw.mods.fml.common.network.NetworkRegistry;
import cpw.mods.fml.common.registry.GameRegistry;
import cpw.mods.fml.common.registry.LanguageRegistry;
import cpw.mods.fml.common.network.NetworkMod.SidedPacketHandler;
import cpw.mods.fml.common.SidedProxy;
@Mod (modid = "TestMod", name = "Test Mod", version = "0.0.1")
@NetworkMod (clientSideRequired = true, serverSideRequired = false, versionBounds = "1.0.0")
public class TestModBase {
/**
* 1-2 это количество заполняемых сердец, 0.4F, на сколько утоляет голод,
* false - можно ли прирученных волков кормить.
**/
//Обычная еда
public static final Item testFood = new TestFood(5003, 1, 0.4F, false).setItemName("testFood").setIconCoord(0,0);
//Суп
public static final Item testSoup = new TestSoup(5004, 2).setItemName("testSoup").setIconCoord(0,1);
@Instance("TestModID")
public static TestModBase instance;
@Init
public void load(FMLInitializationEvent event)
{
LanguageRegistry.addName(testFood, "Test Food");
LanguageRegistry.addName(testSoup, "Test Soup");
GameRegistry.addRecipe(new ItemStack(TestModBase.testFood, 1), new Object[]{ "#X", Character.valueOf('X'), Item.appleRed, Character.valueOf('#'), Block.dirt});
GameRegistry.addRecipe(new ItemStack(TestModBase.testSoup, 1), new Object[]{ "ZC", Character.valueOf('C'), Item.bowlEmpty, Character.valueOf('Z'), Item.appleRed});
}
@PreInit
public void preLoad(FMLPreInitializationEvent event)
{
}
@PostInit
public void postLoad(FMLPostInitializationEvent event)
{
}
}
Создаём TestFood:
package testmod.src;
import net.minecraft.item.ItemFood;
/**
* Мы поставили родитель ItemFood, и теперь наша еда автоматически будет в категории tabFood.
**/
public class TestFood extends ItemFood
{
public TestFood(int par1, int par2, float par3, boolean par4)
{
super(par1, par2, par4);
maxStackSize = 64;
}
public String getTextureFile()
{
return "/testmod/textures/terrain.png";
}
}
И TestSoup:
package testmod.src;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemFood;
import net.minecraft.item.ItemStack;
import net.minecraft.world.World;
public class TestSoup extends ItemFood
{
public TestSoup(int par1, int par2)
{
super(par1, par2, false);
this.setMaxStackSize(1);
}
public ItemStack onFoodEaten(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer)
{
super.onFoodEaten(par1ItemStack, par2World, par3EntityPlayer);
return new ItemStack(Item.bowlEmpty);//Когда мы покушаем в руке останется деревянная миска.
}
public String getTextureFile()
{
return "/testmod/textures/terrain.png";
}
}
Дополнения
Как добавить эффект зелья для еды.
package testmod.src;
import net.minecraft.block.Block;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.Init;
import cpw.mods.fml.common.Mod.Instance;
import cpw.mods.fml.common.Mod.PostInit;
import cpw.mods.fml.common.Mod.PreInit;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.event.FMLPostInitializationEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
import cpw.mods.fml.common.network.NetworkMod;
import cpw.mods.fml.common.network.NetworkRegistry;
import cpw.mods.fml.common.registry.GameRegistry;
import cpw.mods.fml.common.registry.LanguageRegistry;
import cpw.mods.fml.common.network.NetworkMod.SidedPacketHandler;
import cpw.mods.fml.common.SidedProxy;
@Mod (modid = "TestMod", name = "Test Mod", version = "0.0.1")
@NetworkMod (clientSideRequired = true, serverSideRequired = false, versionBounds = "1.0.0")
public class TestModBase {
/**
* 1-2 это количество заполняемых сердец, 0.4F, на сколько утоляет голод,
* false - можно ли прирученных волков кормить.
**/
//Обычная еда
public static final Item testFood = new TestFood(5003, 1, 0.4F, false).setItemName("testFood").setIconCoord(0,0);
//Суп
public static final Item testSoup = new TestSoup(5004, 2).setItemName("testSoup").setIconCoord(0,1);
@Instance("TestModID")
public static TestModBase instance;
@Init
public void load(FMLInitializationEvent event)
{
LanguageRegistry.addName(testFood, "Test Food");
LanguageRegistry.addName(testSoup, "Test Soup");
GameRegistry.addRecipe(new ItemStack(TestModBase.testFood, 1), new Object[]{ "#X", Character.valueOf('X'), Item.appleRed, Character.valueOf('#'), Block.dirt});
GameRegistry.addRecipe(new ItemStack(TestModBase.testSoup, 1), new Object[]{ "ZC", Character.valueOf('C'), Item.bowlEmpty, Character.valueOf('Z'), Item.appleRed});
}
@PreInit
public void preLoad(FMLPreInitializationEvent event)
{
}
@PostInit
public void postLoad(FMLPostInitializationEvent event)
{
}
}
Создаём TestFood:
package testmod.src;
import net.minecraft.item.ItemFood;
/**
* Мы поставили родитель ItemFood, и теперь наша еда автоматически будет в категории tabFood.
**/
public class TestFood extends ItemFood
{
public TestFood(int par1, int par2, float par3, boolean par4)
{
super(par1, par2, par4);
maxStackSize = 64;
}
public String getTextureFile()
{
return "/testmod/textures/terrain.png";
}
}
И TestSoup:
package testmod.src;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemFood;
import net.minecraft.item.ItemStack;
import net.minecraft.world.World;
public class TestSoup extends ItemFood
{
public TestSoup(int par1, int par2)
{
super(par1, par2, false);
this.setMaxStackSize(1);
}
public ItemStack onFoodEaten(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer)
{
super.onFoodEaten(par1ItemStack, par2World, par3EntityPlayer);
return new ItemStack(Item.bowlEmpty);//Когда мы покушаем в руке останется деревянная миска.
}
public String getTextureFile()
{
return "/testmod/textures/terrain.png";
}
}
Дополнения
Как добавить эффект зелья для еды.
В импорты добавляем это:
import net.minecraft.potion.Potion;
И немного изменяем нашу еду:
/**
* Пишем в эклипсе Potion. и выбираем эффект какой нам надо, 40 - время действие эффекта, 1F - сила эффекта.
**/
public static final Item testFood = new TestFood(5003, 1, 0.4F, false).setPotionEffect(Potion.confusion.id, 40, 0, 1F).setItemName("testFood").setIconCoord(0,0);
import net.minecraft.potion.Potion;
И немного изменяем нашу еду:
/**
* Пишем в эклипсе Potion. и выбираем эффект какой нам надо, 40 - время действие эффекта, 1F - сила эффекта.
**/
public static final Item testFood = new TestFood(5003, 1, 0.4F, false).setPotionEffect(Potion.confusion.id, 40, 0, 1F).setItemName("testFood").setIconCoord(0,0);
6. Создание конфиг файла.
Немного изменим TestModBase:
package testmod.src;
import net.minecraft.block.Block;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraftforge.common.Configuration;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.Init;
import cpw.mods.fml.common.Mod.Instance;
import cpw.mods.fml.common.Mod.PostInit;
import cpw.mods.fml.common.Mod.PreInit;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.event.FMLPostInitializationEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
import cpw.mods.fml.common.network.NetworkMod;
import cpw.mods.fml.common.network.NetworkRegistry;
import cpw.mods.fml.common.registry.GameRegistry;
import cpw.mods.fml.common.registry.LanguageRegistry;
import cpw.mods.fml.common.network.NetworkMod.SidedPacketHandler;
import cpw.mods.fml.common.SidedProxy;
@Mod (modid = "TestMod", name = "Test Mod", version = "0.0.1")
@NetworkMod (clientSideRequired = true, serverSideRequired = false, versionBounds = "1.0.0")
public class TestModBase {
//Немного изменим наш итем
public static Item TestItem;
public static int TestItemitemID; //обязательно добавляем itemID
//И изменим наш блок
public static Block TestBlock ;
public static int TestBlockblockID; //добавляем blockID
@Instance("TestModID")
public static TestModBase instance;
@Init
public void load(FMLInitializationEvent event)
{
//Дописываем наш итем, и вместо айди теперь у нас TestItemitemID
testItem = new TestItem(TestItemitemID,64).setItemName("testItem").setIconCoord(0,0);
//Дописываем блок
testBlock = new TestBlock(TestBlockblockID,0).setBlockName("testBlock");
LanguageRegistry.addName(testItem, "Test Item");
GameRegistry.registerBlock(testBlock);
LanguageRegistry.addName(testBlock, "Test Block");
}
@PostInit
public void load(FMLPreInitializationEvent event)
{
}
@PreInit
public void preLoad(FMLPreInitializationEvent event)
{
Configuration config = new Configuration(event.getSuggestedConfigurationFile());
config.load();//Писать надо только между load и save:
TestItemitemID = config.getItem("TestItem", 5003).getInt();
TestBlockblockID = config.getBlock("TestBlock", 2020).getInt();
config.save();
}
}
Когда запустите игру сгенерируется конфиг файл, найти можно в jars/config
В нашем случаи имя его "TestModBase".
package testmod.src;
import net.minecraft.block.Block;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraftforge.common.Configuration;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.Init;
import cpw.mods.fml.common.Mod.Instance;
import cpw.mods.fml.common.Mod.PostInit;
import cpw.mods.fml.common.Mod.PreInit;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.event.FMLPostInitializationEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
import cpw.mods.fml.common.network.NetworkMod;
import cpw.mods.fml.common.network.NetworkRegistry;
import cpw.mods.fml.common.registry.GameRegistry;
import cpw.mods.fml.common.registry.LanguageRegistry;
import cpw.mods.fml.common.network.NetworkMod.SidedPacketHandler;
import cpw.mods.fml.common.SidedProxy;
@Mod (modid = "TestMod", name = "Test Mod", version = "0.0.1")
@NetworkMod (clientSideRequired = true, serverSideRequired = false, versionBounds = "1.0.0")
public class TestModBase {
//Немного изменим наш итем
public static Item TestItem;
public static int TestItemitemID; //обязательно добавляем itemID
//И изменим наш блок
public static Block TestBlock ;
public static int TestBlockblockID; //добавляем blockID
@Instance("TestModID")
public static TestModBase instance;
@Init
public void load(FMLInitializationEvent event)
{
//Дописываем наш итем, и вместо айди теперь у нас TestItemitemID
testItem = new TestItem(TestItemitemID,64).setItemName("testItem").setIconCoord(0,0);
//Дописываем блок
testBlock = new TestBlock(TestBlockblockID,0).setBlockName("testBlock");
LanguageRegistry.addName(testItem, "Test Item");
GameRegistry.registerBlock(testBlock);
LanguageRegistry.addName(testBlock, "Test Block");
}
@PostInit
public void load(FMLPreInitializationEvent event)
{
}
@PreInit
public void preLoad(FMLPreInitializationEvent event)
{
Configuration config = new Configuration(event.getSuggestedConfigurationFile());
config.load();//Писать надо только между load и save:
TestItemitemID = config.getItem("TestItem", 5003).getInt();
TestBlockblockID = config.getBlock("TestBlock", 2020).getInt();
config.save();
}
}
Когда запустите игру сгенерируется конфиг файл, найти можно в jars/config
В нашем случаи имя его "TestModBase".
7. Создание Metadata блоку.
Внимание: Оригинальный туториал тут.
TestModBase
package testmod.src;
import net.minecraft.block.Block;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraftforge.common.Configuration;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.Init;
import cpw.mods.fml.common.Mod.Instance;
import cpw.mods.fml.common.Mod.PostInit;
import cpw.mods.fml.common.Mod.PreInit;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.event.FMLPostInitializationEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
import cpw.mods.fml.common.network.NetworkMod;
import cpw.mods.fml.common.network.NetworkRegistry;
import cpw.mods.fml.common.registry.GameRegistry;
import cpw.mods.fml.common.registry.LanguageRegistry;
import cpw.mods.fml.common.network.NetworkMod.SidedPacketHandler;
import cpw.mods.fml.common.SidedProxy;
@Mod (modid = "TestMod", name = "Test Mod", version = "0.0.1")
@NetworkMod (clientSideRequired = true, serverSideRequired = false, versionBounds = "1.0.0")
public class TestModBase {
//наш блок, в котором будут другие блоки
public static Block metaBlock = new BlockMetaGem(251);
@Instance("TestModID")
public static TestModBase instance;
@Init
public void load(FMLInitializationEvent event)
{
GameRegistry.registerBlock(TestModBase.metaBlock, ItemBlockMetaGem.class,"TutorialRuby");
LanguageRegistry.addName(new ItemStack(TestModBase.metaBlock,1,0), "Sapphire Block");
LanguageRegistry.addName(new ItemStack(TestModBase.metaBlock,1,1), "Amethyst Block");
LanguageRegistry.addName(new ItemStack(TestModBase.metaBlock,1,2), "Topaz Block");
for(int i = 0;i < 3;i++){ //1 - количество получаемого при крафте, 0-1-2 наши блоки.
GameRegistry.addRecipe(new ItemStack(TestModBase.metaBlock,1,0), "XXX","XXX","XXX", Character.valueOf('X'), new ItemStack(Block.dirt,1,i));
GameRegistry.addRecipe(new ItemStack(TestModBase.metaBlock,1,1), "XXX","XXX", Character.valueOf('X'), new ItemStack(Block.dirt,1,i));
GameRegistry.addRecipe(new ItemStack(TestModBase.metaBlock,1,2), "XXX", Character.valueOf('X'), new ItemStack(Block.dirt,1,i));
}
}
@PreInit
public void preLoad(FMLPreInitializationEvent event)
{
}
@PostInit
public void load(FMLPreInitializationEvent event)
{
}
}
BlockMetaGem
package testmod.src;
import java.util.ArrayList;
import java.util.List;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.ItemStack;
import cpw.mods.fml.relauncher.*;
public class BlockMetaGem extends Block{
public BlockMetaGem(int ID){
super(ID,Material.rock); //Айди и материал
setBlockName("TutorialBlockOre"); //Название
setHardness(3.0F); //Прочность
setResistance(5.0F); //Устойчивость к взрыву
setStepSound(Block.soundStoneFootstep); //Звук хождение по блоку
setCreativeTab(CreativeTabs.tabBlock); //Категория, блоки
setTextureFile("/testmod/textures/terrain.png"); //Текстура
}
public int getBlockTextureFromSideAndMetadata(int i, int j){ //Текстура блоков в метадате, 0-1-2 - блоки, 2-3-4, номера в нашем textures
switch(j){
case 0:return 2; //Сапфир
case 1:return 3; //Аметис
case 2:return 4; //Топаз
default:return 0;
}
}
public int damageDropped(int i){ //Сможем брать блоки в творческом режиме (колесико мышки).
return i;
}
@SideOnly(Side.CLIENT)
public void getSubBlocks(int par1, CreativeTabs par2CreativeTabs, List par3List) //Добавляет в саму категорию, в креатив
{
for (int var4 = 0; var4 < 3; ++var4)
{
par3List.add(new ItemStack(par1, 1, var4));
}
}
}
ItemBlockMetaGem
package testmod.src;
import java.util.List;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemStack;
import cpw.mods.fml.relauncher.*;
public class ItemBlockMetaGem extends ItemBlock
{
public ItemBlockMetaGem(int par1)
{
super(par1);
this.setMaxDamage(0);
this.setHasSubtypes(true);
}
@SideOnly(Side.CLIENT)
public int getIconFromDamage(int par1) //Получаем текстуру
{
return TestModBase.metaBlock.getBlockTextureFromSideAndMetadata(2, par1);
}
public int getMetadata(int par1) //Возвращает значение метадаты
{
return par1;
}
public String getItemNameIS(ItemStack is) //Получаем название элемента в коде от ItemStack
{
String[] types = {"Sapphire","Amethyst","Topaz"};
return "TutorialBlockOre" + types[is.getItemDamage()];
}
}
TestModBase
package testmod.src;
import net.minecraft.block.Block;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraftforge.common.Configuration;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.Init;
import cpw.mods.fml.common.Mod.Instance;
import cpw.mods.fml.common.Mod.PostInit;
import cpw.mods.fml.common.Mod.PreInit;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.event.FMLPostInitializationEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
import cpw.mods.fml.common.network.NetworkMod;
import cpw.mods.fml.common.network.NetworkRegistry;
import cpw.mods.fml.common.registry.GameRegistry;
import cpw.mods.fml.common.registry.LanguageRegistry;
import cpw.mods.fml.common.network.NetworkMod.SidedPacketHandler;
import cpw.mods.fml.common.SidedProxy;
@Mod (modid = "TestMod", name = "Test Mod", version = "0.0.1")
@NetworkMod (clientSideRequired = true, serverSideRequired = false, versionBounds = "1.0.0")
public class TestModBase {
//наш блок, в котором будут другие блоки
public static Block metaBlock = new BlockMetaGem(251);
@Instance("TestModID")
public static TestModBase instance;
@Init
public void load(FMLInitializationEvent event)
{
GameRegistry.registerBlock(TestModBase.metaBlock, ItemBlockMetaGem.class,"TutorialRuby");
LanguageRegistry.addName(new ItemStack(TestModBase.metaBlock,1,0), "Sapphire Block");
LanguageRegistry.addName(new ItemStack(TestModBase.metaBlock,1,1), "Amethyst Block");
LanguageRegistry.addName(new ItemStack(TestModBase.metaBlock,1,2), "Topaz Block");
for(int i = 0;i < 3;i++){ //1 - количество получаемого при крафте, 0-1-2 наши блоки.
GameRegistry.addRecipe(new ItemStack(TestModBase.metaBlock,1,0), "XXX","XXX","XXX", Character.valueOf('X'), new ItemStack(Block.dirt,1,i));
GameRegistry.addRecipe(new ItemStack(TestModBase.metaBlock,1,1), "XXX","XXX", Character.valueOf('X'), new ItemStack(Block.dirt,1,i));
GameRegistry.addRecipe(new ItemStack(TestModBase.metaBlock,1,2), "XXX", Character.valueOf('X'), new ItemStack(Block.dirt,1,i));
}
}
@PreInit
public void preLoad(FMLPreInitializationEvent event)
{
}
@PostInit
public void load(FMLPreInitializationEvent event)
{
}
}
BlockMetaGem
package testmod.src;
import java.util.ArrayList;
import java.util.List;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.ItemStack;
import cpw.mods.fml.relauncher.*;
public class BlockMetaGem extends Block{
public BlockMetaGem(int ID){
super(ID,Material.rock); //Айди и материал
setBlockName("TutorialBlockOre"); //Название
setHardness(3.0F); //Прочность
setResistance(5.0F); //Устойчивость к взрыву
setStepSound(Block.soundStoneFootstep); //Звук хождение по блоку
setCreativeTab(CreativeTabs.tabBlock); //Категория, блоки
setTextureFile("/testmod/textures/terrain.png"); //Текстура
}
public int getBlockTextureFromSideAndMetadata(int i, int j){ //Текстура блоков в метадате, 0-1-2 - блоки, 2-3-4, номера в нашем textures
switch(j){
case 0:return 2; //Сапфир
case 1:return 3; //Аметис
case 2:return 4; //Топаз
default:return 0;
}
}
public int damageDropped(int i){ //Сможем брать блоки в творческом режиме (колесико мышки).
return i;
}
@SideOnly(Side.CLIENT)
public void getSubBlocks(int par1, CreativeTabs par2CreativeTabs, List par3List) //Добавляет в саму категорию, в креатив
{
for (int var4 = 0; var4 < 3; ++var4)
{
par3List.add(new ItemStack(par1, 1, var4));
}
}
}
ItemBlockMetaGem
package testmod.src;
import java.util.List;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemStack;
import cpw.mods.fml.relauncher.*;
public class ItemBlockMetaGem extends ItemBlock
{
public ItemBlockMetaGem(int par1)
{
super(par1);
this.setMaxDamage(0);
this.setHasSubtypes(true);
}
@SideOnly(Side.CLIENT)
public int getIconFromDamage(int par1) //Получаем текстуру
{
return TestModBase.metaBlock.getBlockTextureFromSideAndMetadata(2, par1);
}
public int getMetadata(int par1) //Возвращает значение метадаты
{
return par1;
}
public String getItemNameIS(ItemStack is) //Получаем название элемента в коде от ItemStack
{
String[] types = {"Sapphire","Amethyst","Topaz"};
return "TutorialBlockOre" + types[is.getItemDamage()];
}
}
8.Создание Metadata итему.
Внимание: Оригинальный туториал тут.
TestModBase
package testmod.src;
import net.minecraft.block.Block;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraftforge.common.Configuration;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.Init;
import cpw.mods.fml.common.Mod.Instance;
import cpw.mods.fml.common.Mod.PostInit;
import cpw.mods.fml.common.Mod.PreInit;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.event.FMLPostInitializationEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
import cpw.mods.fml.common.network.NetworkMod;
import cpw.mods.fml.common.network.NetworkRegistry;
import cpw.mods.fml.common.registry.GameRegistry;
import cpw.mods.fml.common.registry.LanguageRegistry;
import cpw.mods.fml.common.network.NetworkMod.SidedPacketHandler;
import cpw.mods.fml.common.SidedProxy;
@Mod (modid = "TestMod", name = "Test Mod", version = "0.0.1")
@NetworkMod (clientSideRequired = true, serverSideRequired = false, versionBounds = "1.0.0")
public class TestModBase {
//Наш итем
public static Item metaGem = new ItemMetaGem(15001);
@Instance("TestModID")
public static TestModBase instance;
@Init
public void load(FMLInitializationEvent event)
{//Добавляем имя
LanguageRegistry.addName(new ItemStack(TestModBase.metaGem,1,0), "Sapphire");
LanguageRegistry.addName(new ItemStack(TestModBase.metaGem,1,1), "Amethyst");
LanguageRegistry.addName(new ItemStack(TestModBase.metaGem,1,2), "Topaz");
}
@PreInit
public void preLoad(FMLPreInitializationEvent event)
{
}
@PostInit
public void load(FMLPreInitializationEvent event)
{
}
}
ItemMetaGem
package testmod.src;
import java.util.List;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import cpw.mods.fml.relauncher.*;
import net.minecraft.creativetab.CreativeTabs;
public class ItemMetaGem extends Item {
public ItemMetaGem(int par1) {
super(par1);
setTextureFile("/testmod/textures/terrain.png");
setItemName("TutorialItemMetaGem");
setCreativeTab(CreativeTabs.tabMaterials);
setHasSubtypes(true);
setMaxDamage(0);
}
@SideOnly(Side.CLIENT)
public int getIconFromDamage(int i){
switch(i){//Текстуры итемов в нашем textures, 0-1-2 - итемы, 1-2-3 - нумерация
case 0:return 1; //ItemSapphire
case 1:return 2; //ItemAmethyst
case 2:return 3; //ItemTopaz
}
return 0;
}
public String getItemNameIS(ItemStack is){
switch(is.getItemDamage()){ //Имена наших итемов
case 0:return "ItemSapphire";
case 1:return "ItemAmethyst";
case 2:return "ItemTopaz";
}
return "itemUnknown";
}
@SideOnly(Side.CLIENT)
public void getSubItems(int itemID, CreativeTabs tab, List itemList) //Добавляет все итемы в креатив
{
for(int i=0;i
TestModBase
package testmod.src;
import net.minecraft.block.Block;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraftforge.common.Configuration;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.Init;
import cpw.mods.fml.common.Mod.Instance;
import cpw.mods.fml.common.Mod.PostInit;
import cpw.mods.fml.common.Mod.PreInit;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.event.FMLPostInitializationEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
import cpw.mods.fml.common.network.NetworkMod;
import cpw.mods.fml.common.network.NetworkRegistry;
import cpw.mods.fml.common.registry.GameRegistry;
import cpw.mods.fml.common.registry.LanguageRegistry;
import cpw.mods.fml.common.network.NetworkMod.SidedPacketHandler;
import cpw.mods.fml.common.SidedProxy;
@Mod (modid = "TestMod", name = "Test Mod", version = "0.0.1")
@NetworkMod (clientSideRequired = true, serverSideRequired = false, versionBounds = "1.0.0")
public class TestModBase {
//Наш итем
public static Item metaGem = new ItemMetaGem(15001);
@Instance("TestModID")
public static TestModBase instance;
@Init
public void load(FMLInitializationEvent event)
{//Добавляем имя
LanguageRegistry.addName(new ItemStack(TestModBase.metaGem,1,0), "Sapphire");
LanguageRegistry.addName(new ItemStack(TestModBase.metaGem,1,1), "Amethyst");
LanguageRegistry.addName(new ItemStack(TestModBase.metaGem,1,2), "Topaz");
}
@PreInit
public void preLoad(FMLPreInitializationEvent event)
{
}
@PostInit
public void load(FMLPreInitializationEvent event)
{
}
}
ItemMetaGem
package testmod.src;
import java.util.List;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import cpw.mods.fml.relauncher.*;
import net.minecraft.creativetab.CreativeTabs;
public class ItemMetaGem extends Item {
public ItemMetaGem(int par1) {
super(par1);
setTextureFile("/testmod/textures/terrain.png");
setItemName("TutorialItemMetaGem");
setCreativeTab(CreativeTabs.tabMaterials);
setHasSubtypes(true);
setMaxDamage(0);
}
@SideOnly(Side.CLIENT)
public int getIconFromDamage(int i){
switch(i){//Текстуры итемов в нашем textures, 0-1-2 - итемы, 1-2-3 - нумерация
case 0:return 1; //ItemSapphire
case 1:return 2; //ItemAmethyst
case 2:return 3; //ItemTopaz
}
return 0;
}
public String getItemNameIS(ItemStack is){
switch(is.getItemDamage()){ //Имена наших итемов
case 0:return "ItemSapphire";
case 1:return "ItemAmethyst";
case 2:return "ItemTopaz";
}
return "itemUnknown";
}
@SideOnly(Side.CLIENT)
public void getSubItems(int itemID, CreativeTabs tab, List itemList) //Добавляет все итемы в креатив
{
for(int i=0;i