Этот учебник предназначен как для новичков, так и для опытных создателей.
Вообще заходите на специальный сайт посвященный моддингу Minecraft. Куча полезного софта, данный учебник и других фич на http://www.mcmodding.ru/
Новичкам рекомендую проходить учебник по главам сверху вниз.
Видео-ролики для видео-обучения:
Канал YouTube: https://www.youtube....er/Petr19980422
Ролики:
Скрытый текст
Как создать мод для Minecraft. Forge. 1 часть. Подготовка
Как создать мод для MineCraft. Forge. 2 часть. Блок
Как создать мод для MineCraft. Forge. 3 часть. Еще про блок
Как создать мод для MineCraft. Forge. 4 часть. Создание предмета
Как создать мод для MineCraft. Forge. 5 часть. Рецепты
Как создать мод для MineCraft. Forge. 6 часть. Готовый мод
Как создать мод для MineCraft. Forge. 7 часть. Вкладка в креативе
Как создать мод для MineCraft. Forge. 8 часть. Блок с моделью(1)
https://www.youtube.com/watch?v=2JmkS1Z8h54
Как создать мод для MineCraft. Forge. 9 часть. Анимированные текстуры
https://www.youtube.com/watch?v=G-6LmTWFTtM
Как создать мод для MineCraft. Forge. 10 часть. Предмет в данжах. Дроп с травы
https://www.youtube.com/watch?v=u7Reoq3JAPc
Как создать мод для MineCraft. Forge. 2 часть. Блок
Как создать мод для MineCraft. Forge. 3 часть. Еще про блок
Как создать мод для MineCraft. Forge. 4 часть. Создание предмета
Как создать мод для MineCraft. Forge. 5 часть. Рецепты
Как создать мод для MineCraft. Forge. 6 часть. Готовый мод
Как создать мод для MineCraft. Forge. 7 часть. Вкладка в креативе
Как создать мод для MineCraft. Forge. 8 часть. Блок с моделью(1)
https://www.youtube.com/watch?v=2JmkS1Z8h54
Как создать мод для MineCraft. Forge. 9 часть. Анимированные текстуры
https://www.youtube.com/watch?v=G-6LmTWFTtM
Как создать мод для MineCraft. Forge. 10 часть. Предмет в данжах. Дроп с травы
https://www.youtube.com/watch?v=u7Reoq3JAPc
Приступим!
Вступление
Скрытый текст
Итак, создавать моды можно несколькими способами: с помощью доп. API и без доп. API.
Api -набор готовых классов, процедур, функций, структур и констант, предоставляемых приложением (библиотекой, сервисом) для использования во внешних программных продуктах. Используется программистами для написания всевозможных приложений. Другими словами с помощью Api для Minecraft проще делать моды. Самое популярное Api для майна это Minecraft Forge.
И вообще, зачем создавать моды с помощью какого-то Api? Ведь мод, созданный с помощью Forge например требует Forge и на Minecraft – больше мороки и проблем. Ответ прост – самая важная (на мой взгляд) причина это то, что Api позволяют устанавливать большое количество модов без конфликтов, чего нельзя добиться без их использования. Надо сказать, что если вы хотите, чтобы люди могли ставить и другие моды, помимо вашего, вам даже с Api не стоит изменять исходные файлы. Добавлять свои – пожалуйста, а изменение исходников с большой вероятностью приведет к проблемам (в дальнейшем поймете почему).
Независимо от того, какое решение вы приняли начать рекомендую с создания модов при помощи разных Api, а именно при помощи Minecraft Forge. Он наиболее прост и популярен.
Api -набор готовых классов, процедур, функций, структур и констант, предоставляемых приложением (библиотекой, сервисом) для использования во внешних программных продуктах. Используется программистами для написания всевозможных приложений. Другими словами с помощью Api для Minecraft проще делать моды. Самое популярное Api для майна это Minecraft Forge.
И вообще, зачем создавать моды с помощью какого-то Api? Ведь мод, созданный с помощью Forge например требует Forge и на Minecraft – больше мороки и проблем. Ответ прост – самая важная (на мой взгляд) причина это то, что Api позволяют устанавливать большое количество модов без конфликтов, чего нельзя добиться без их использования. Надо сказать, что если вы хотите, чтобы люди могли ставить и другие моды, помимо вашего, вам даже с Api не стоит изменять исходные файлы. Добавлять свои – пожалуйста, а изменение исходников с большой вероятностью приведет к проблемам (в дальнейшем поймете почему).
Независимо от того, какое решение вы приняли начать рекомендую с создания модов при помощи разных Api, а именно при помощи Minecraft Forge. Он наиболее прост и популярен.
Создание модов для Minecraft с помощью Forge
Создание модов для Minecraft с помощью Forge
Скрытый текст
Вы выбрали создание модов с помощью Api или же вы новичок, никогда ранее не создававший моды – неважно, создавать моды может каждый, надо лишь уметь это делать. Новички! – обязательно проходите учебник по порядку, особенно первые несколько глав!
Глава 1. Подготовка. 1.6.2
Скрытый текст
Вообще эту главу можно пропустить, просто скачав ModdingPack Forge (ссылка в меню или справа). Но для тех, кто никогда не создавал моды, или создавал, но не на Forge я рекомендую, прямо таки настаиваю, чтобы вы проделали процесс ниже своими руками, чтобы понять, как все работает. А потом скачивайте ModdingPack сколько хотите.
Установите (обновите) java. Скорее всего у вас стоит последняя версия, но предохранится не помешает. http://www.java.com/ru/.
1. Скачайте и установите JDK. Скачать.
2. Создайте на рабочем столе или где вам удобно папку.
3. Скачайте Eclipse. Скачать.
4. Скачайте Forge (качайте рекомендованный, нам нужен src). Скачать.
Переместите все файлы из скачанного Forge в нашу созданную папку и запустите install.cmd. Этот процесс сам загрузит MCP, все установит и т.д., чем Forge и привлекателен.
Папку с eclipse также переместите на рабочий стол.
MCP (Minecraft Coder Pack) - коллекция скриптов и инструментов в помощь разработчику для создания модов клиента и сервера Minecraftа. Данный пакет инструментов позволяет выполнять декомпиляцию кода сервера и клиента игры, а также обратные им действия.
Декомпиляция - процесс преобразования файлов игры в .java файлы, чтобы с ними можно было работать в среде программирования Eclipse.
Рекомпиляция - процесс, обратный декомпиляции - преобразовывает измененные файлы и файлы мода в .class файлы, с которыми работает игра.
Eclipse - среда разработки приложений на языке программирования Java. Вообще для разработки модов можно использовать и блокнот, но на Eclipse в сотни раз быстрее.
Запустите Eclipse. При первом (и при последующих, если не поставить галочку появлений) открытии появится окно, в котором Eclipse попросит указать его рабочее пространство. Указывайте нашу созданную папку, в ней mcp, а далее папку eclipse.
Когда вы запустили Eclipse, обратите внимание на одну делать. Слева, в Package Explorer открываете проект Minecraft (щелк по плюсику (как в проводнике windows)) и если в "JRE System Library" в квадратных скобках у вас стоит "[JavaSE-1.6]", то нажмите правой кнопкой, свойства (properties) и в раскрывающемся списке (Execution environment) выберите JavaSE-1.7(jre7).
Подготовка закончена. Можно приступать к созданию модов!
Если у вас завис Forge во время установки и так несколько раз, то переместите вашу папку в системный диск и попробуйте установить там, мне помогло.
Установите (обновите) java. Скорее всего у вас стоит последняя версия, но предохранится не помешает. http://www.java.com/ru/.
1. Скачайте и установите JDK. Скачать.
2. Создайте на рабочем столе или где вам удобно папку.
3. Скачайте Eclipse. Скачать.
4. Скачайте Forge (качайте рекомендованный, нам нужен src). Скачать.
Переместите все файлы из скачанного Forge в нашу созданную папку и запустите install.cmd. Этот процесс сам загрузит MCP, все установит и т.д., чем Forge и привлекателен.
Папку с eclipse также переместите на рабочий стол.
MCP (Minecraft Coder Pack) - коллекция скриптов и инструментов в помощь разработчику для создания модов клиента и сервера Minecraftа. Данный пакет инструментов позволяет выполнять декомпиляцию кода сервера и клиента игры, а также обратные им действия.
Декомпиляция - процесс преобразования файлов игры в .java файлы, чтобы с ними можно было работать в среде программирования Eclipse.
Рекомпиляция - процесс, обратный декомпиляции - преобразовывает измененные файлы и файлы мода в .class файлы, с которыми работает игра.
Eclipse - среда разработки приложений на языке программирования Java. Вообще для разработки модов можно использовать и блокнот, но на Eclipse в сотни раз быстрее.
Запустите Eclipse. При первом (и при последующих, если не поставить галочку появлений) открытии появится окно, в котором Eclipse попросит указать его рабочее пространство. Указывайте нашу созданную папку, в ней mcp, а далее папку eclipse.
Когда вы запустили Eclipse, обратите внимание на одну делать. Слева, в Package Explorer открываете проект Minecraft (щелк по плюсику (как в проводнике windows)) и если в "JRE System Library" в квадратных скобках у вас стоит "[JavaSE-1.6]", то нажмите правой кнопкой, свойства (properties) и в раскрывающемся списке (Execution environment) выберите JavaSE-1.7(jre7).
Подготовка закончена. Можно приступать к созданию модов!
Если у вас завис Forge во время установки и так несколько раз, то переместите вашу папку в системный диск и попробуйте установить там, мне помогло.
Глава 2. Создание базового файла. 1.6.2
Скрытый текст
Итак, вы закончили подготовку и уже хотите создавать моды, ну тогда приступим!
В Package Explorer переходите в папочку src. Вы видите много пакетов. Один (или даже несколько) из них и будет вашим модом. Выделяете src (ЛКМ) и нажимаете ПКМ. В появившемся окошке выбираете New>Package. Появляется окно в котором нам предлагают вбить имя пакета. Имя должно быть в формате assets.что-то.что-то…. Ну тобишь для этого учебника имя пакета будет assets.testmod.src. Название пакета не должно оканчиваться на точку и не должно использовать зарезервированных Java слов (staic,new,private и т.д.). Жмете Finish и у вас, в самом верху появляется ваш белый пакет. Белый, потому что пустой. Исправим положение!
Кликаем ПКМ на наш созданный пакет и выбираем New>Class. Или же выделяем наш пакет и в верхней панели щелкаем по значку буквы c в зеленом кружочке с желтым крестиком справа сверху. Файл назовите как хотите, в нем будят находится константы для нашего мода (подробнее далее). Я назову его ModInfo и вам советую это название. Больше в окне Java Class ничего менять не нужно, кликаете Finish.
Ну вот вы и создали первый файл вашего мода.
Теперь, между скобочками класса ModInfo, который был создан автоматически пишем следующее(приведу весь файл целиком):
ModInfo.java
package assets.testmod.src; – собственно ваш пакет.
public class ModInfo {…} – класс. Имя класса всегда должно быть таким же, как и имя файла!
final static String MODID = "TestMod"; – объявление строковой(текстовой) константы(нельзя изменить) MODID(константы принято писать заглавными буквами) - "TestMod" - тут ваш ID мода(без пробелов).
final static String NAME = "Test Mod"; – все тоже самой, но название имя вашего мода(можно использовать почти все символы, включая пробелы).
final static String VERSION = "1.0.0"; – версия мода.
Все, пока все действия с файлом ModInfo.java мы закончили. Время создать файл лист – файл содержащий основной контент нашего мода.
(Вообще, ModInfo не обязателен. Эти же константы можно объявить и в файле листе нашего мода. Но об этом подробней в ролике).
Создаете еще один класс. Можете назвать его как хотите, но я назову его в честь названия моего мода – TestMod.java.
Вот тут то и будет происходить все действо.
Пишем в него такой код:
TestMod.java
@Mod(modid=ModInfo.MODID, name=ModInfo.NAME, version=ModInfo.VERSION) – тут то, ради чего мы создавали ModInfo.java. Как видите в поля modid,name,version вместо текста в кавычках мы вставили сначала ModInfo, как указатель на созданный файл и после точки имя нашей константы. Компилятор, увидев такую строку просто заменит ее на то, что у нас в ModInfo.
Ну вот и все! Вы создали инфо-файл и файл лист. Дальше самое интересное!
В Package Explorer переходите в папочку src. Вы видите много пакетов. Один (или даже несколько) из них и будет вашим модом. Выделяете src (ЛКМ) и нажимаете ПКМ. В появившемся окошке выбираете New>Package. Появляется окно в котором нам предлагают вбить имя пакета. Имя должно быть в формате assets.что-то.что-то…. Ну тобишь для этого учебника имя пакета будет assets.testmod.src. Название пакета не должно оканчиваться на точку и не должно использовать зарезервированных Java слов (staic,new,private и т.д.). Жмете Finish и у вас, в самом верху появляется ваш белый пакет. Белый, потому что пустой. Исправим положение!
Кликаем ПКМ на наш созданный пакет и выбираем New>Class. Или же выделяем наш пакет и в верхней панели щелкаем по значку буквы c в зеленом кружочке с желтым крестиком справа сверху. Файл назовите как хотите, в нем будят находится константы для нашего мода (подробнее далее). Я назову его ModInfo и вам советую это название. Больше в окне Java Class ничего менять не нужно, кликаете Finish.
Ну вот вы и создали первый файл вашего мода.
Теперь, между скобочками класса ModInfo, который был создан автоматически пишем следующее(приведу весь файл целиком):
ModInfo.java
package assets[paste][/paste]testmod[paste][/paste]src; public class ModInfo { /* * ID вашего мода */ final static String MODID = "TestMod"; /* * Имя вашего мода */ final static String NAME = "Test Mod"; /* * Версия вашего мода */ final static String VERSION = "1[paste][/paste]0[paste][/paste]0";}Разберем данный код.
package assets.testmod.src; – собственно ваш пакет.
public class ModInfo {…} – класс. Имя класса всегда должно быть таким же, как и имя файла!
final static String MODID = "TestMod"; – объявление строковой(текстовой) константы(нельзя изменить) MODID(константы принято писать заглавными буквами) - "TestMod" - тут ваш ID мода(без пробелов).
final static String NAME = "Test Mod"; – все тоже самой, но название имя вашего мода(можно использовать почти все символы, включая пробелы).
final static String VERSION = "1.0.0"; – версия мода.
Все, пока все действия с файлом ModInfo.java мы закончили. Время создать файл лист – файл содержащий основной контент нашего мода.
(Вообще, ModInfo не обязателен. Эти же константы можно объявить и в файле листе нашего мода. Но об этом подробней в ролике).
Создаете еще один класс. Можете назвать его как хотите, но я назову его в честь названия моего мода – TestMod.java.
Вот тут то и будет происходить все действо.
Пишем в него такой код:
TestMod.java
package assets[paste][/paste]testmod[paste][/paste]src; import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]Mod;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]Mod[paste][/paste]EventHandler;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]event[paste][/paste]FMLInitializationEvent;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]event[paste][/paste]FMLPostInitializationEvent;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]event[paste][/paste]FMLPreInitializationEvent;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]event[paste][/paste]FMLServerStartingEvent; @Mod(modid=ModInfo[paste][/paste]MODID, name=ModInfo[paste][/paste]NAME, version=ModInfo[paste][/paste]VERSION) public class TestMod { @Mod[paste][/paste]Instance(ModInfo[paste][/paste]MODID) public static TestMod mod; @EventHandler public void preInit(FMLPreInitializationEvent event) { } @EventHandler public void init(FMLInitializationEvent event) { } @EventHandler public void postInit(FMLPostInitializationEvent event) { } @EventHandler public void serverStarting(FMLServerStartingEvent event) { }}Разберем все по полкам. То, что было разобрано выше (например пакет или класс) разбирать не буду. Только новое!
import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]Mod;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]Mod[paste][/paste]EventHandler;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]event[paste][/paste]FMLInitializationEvent;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]event[paste][/paste]FMLPostInitializationEvent;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]event[paste][/paste]FMLPreInitializationEvent;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]event[paste][/paste]FMLServerStartingEvent;Это импорты. Импорт – подключение других пакетов или файлов к нашему файлу. Если вы читали "Технические вещи Eclipse", то знаете, что импорты можно автоматически добавлять комбинацией клавиш Ctr+Shift+O. Если их удалить, то некоторые слова eclipse выделит как ошибку.
@Mod(modid=ModInfo.MODID, name=ModInfo.NAME, version=ModInfo.VERSION) – тут то, ради чего мы создавали ModInfo.java. Как видите в поля modid,name,version вместо текста в кавычках мы вставили сначала ModInfo, как указатель на созданный файл и после точки имя нашей константы. Компилятор, увидев такую строку просто заменит ее на то, что у нас в ModInfo.
@Mod[paste][/paste]Instance(ModInfo[paste][/paste]MODID) public static TestMod mod; @EventHandler public void preInit(FMLPreInitializationEvent event) { } @EventHandler public void init(FMLInitializationEvent event) { } @EventHandler public void postInit(FMLPostInitializationEvent event) { } @EventHandler public void serverStarting(FMLServerStartingEvent event) { }@Mod.Instance(ModInfo.MODID) – также указатель на наш ModInfo.java.
@EventHandler public void init(FMLInitializationEvent event) { }А здесь будут важные регистры, такие как регистрация блоков и другое важное. Все остальное пока неважно.
Ну вот и все! Вы создали инфо-файл и файл лист. Дальше самое интересное!
Глава 3. Создание блока. 1.6.2
Скрытый текст
В этой главе начнем собственно наполнять наш пока пустой мод контентом, а именно – создадим блок.
Почему создание блока? Потому что его создание самое простое и демонстрирует основные принципы создания модов.
Начнем. Для начала зарегистрируем в нашем TestMod.java блок.
Сразу после публикации нашего класса регистрируем блок:
Возможно будет выбор – какой пакет импортировать? Берите тот, имя которого начинается на net.minecraft.что-то.
TestBlock – файл, который будет называться TestBlock.java (по названию).
3000– id блока. Всего 4096 id выбирайте что-то в районе 2000 – 3000.
Важно!
ID ни в коем случае не должны повторяться. Все может пройти и запуститься, но проблемы в игре неизбежны!
.setUnlocalizedName(“testBlock”); – связано с текстурой. Рекомендую назвать, как и текстовый id блока.
Первая строка регистрирует блок в игре, а вторая дает ему имя в игре.
В итоге наш TestMod должен выглядеть так.
Единственная загвоздка – текстура.
Но и тут все просто. Идем в нашу когда-то созданную папку. Заходим в mcp > src > minecraft > assets > testmod. Создаем тут папку textures (так, и только с таким именем). В ней создаем папку blocks (имя четко и строго) и уже внутрь кидаем png картинку с именем, которое мы указали в .setUnlocalizedName – тобишь testBlock.
Важно!
С версии 1.5.2 Minecraft поддерживает квадратные текстуры абсолютно любого разрешения. По крайней мере от 16?16 до 512?512 точно. Так что можете создавать блок с супер четкой текстурой.
Вот и все. Рекомендуется посмотреть ролик по этой главе (раздел меню “Видео-уроки”).
Почему создание блока? Потому что его создание самое простое и демонстрирует основные принципы создания модов.
Начнем. Для начала зарегистрируем в нашем TestMod.java блок.
Сразу после публикации нашего класса регистрируем блок:
public class TestMod { @Mod[paste][/paste]Instance(ModInfo[paste][/paste]MODID) public static TestMod testmod; // Первый блок public static final Block testBlock = new TestBlock(3000)[paste][/paste]setUnlocalizedName("testBlock"); @EventHandler public void preInit(FMLPreInitializationEvent event) { } @EventHandler public void init(FMLInitializationEvent event) { // Регистрация блока GameRegistry[paste][/paste]registerBlock(testBlock); // Имя блока в игре LanguageRegistry[paste][/paste]addName(testBlock, "Test Block"); } @EventHandler public void postInit(FMLPostInitializationEvent event) { }Почти наверняка Eclipse высветит ошибки. Но мы уже знаем комбинацию клавиш Ctrl+Shift+O и все необходимые файлы, а именно – пакет с данными о блоках импортируются к нам.
Возможно будет выбор – какой пакет импортировать? Берите тот, имя которого начинается на net.minecraft.что-то.
public static final Block testBlock = new TestBlock(3000)[paste][/paste]setUnlocalizedName("testBlock");testBlock – этакой id блока.
TestBlock – файл, который будет называться TestBlock.java (по названию).
3000– id блока. Всего 4096 id выбирайте что-то в районе 2000 – 3000.
Важно!
ID ни в коем случае не должны повторяться. Все может пройти и запуститься, но проблемы в игре неизбежны!
.setUnlocalizedName(“testBlock”); – связано с текстурой. Рекомендую назвать, как и текстовый id блока.
GameRegistry[paste][/paste]registerBlock(testBlock);//Регистрация блокаLanguageRegistry[paste][/paste]addName(testBlock, "Test Block");//Имя блокаТут проблем возникнуть не должно.
Первая строка регистрирует блок в игре, а вторая дает ему имя в игре.
В итоге наш TestMod должен выглядеть так.
package assets[paste][/paste]testmod[paste][/paste]src;import net[paste][/paste]minecraft[paste][/paste]block[paste][/paste]Block;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]Mod;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]Mod[paste][/paste]EventHandler;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]event[paste][/paste]FMLInitializationEvent;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]event[paste][/paste]FMLPostInitializationEvent;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]event[paste][/paste]FMLPreInitializationEvent;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]network[paste][/paste]NetworkMod;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]registry[paste][/paste]GameRegistry;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]registry[paste][/paste]LanguageRegistry;@Mod(modid=ModInfo[paste][/paste]MODID, name=ModInfo[paste][/paste]MODNAME, version=ModInfo[paste][/paste]MODVERSION)@NetworkMod(clientSideRequired = true, serverSideRequired = false)public class TestMod { @Mod[paste][/paste]Instance(ModInfo[paste][/paste]MODID) public static TestMod testmod; // Первый блок public static final Block testBlock = new TestBlock(3000)[paste][/paste]setUnlocalizedName("testBlock"); @EventHandler public void preInit(FMLPreInitializationEvent event) { } @EventHandler public void init(FMLInitializationEvent event) { // Регистрация блока GameRegistry[paste][/paste]registerBlock(testBlock); // Имя блока в игре LanguageRegistry[paste][/paste]addName(testBlock, "Test Block"); } @EventHandler public void postInit(FMLPostInitializationEvent event) { }}Теперь создаем файл TestBlock.java и пишем в него следующее.
package assets[paste][/paste]testmod[paste][/paste]src; import net[paste][/paste]minecraft[paste][/paste]block[paste][/paste]Block;import net[paste][/paste]minecraft[paste][/paste]block[paste][/paste]material[paste][/paste]Material;import net[paste][/paste]minecraft[paste][/paste]client[paste][/paste]renderer[paste][/paste]texture[paste][/paste]IconRegister;import net[paste][/paste]minecraft[paste][/paste]creativetab[paste][/paste]CreativeTabs; public class TestBlock extends Block { public TestBlock(int par1){super(par1, Material[paste][/paste]ground);//Материал this[paste][/paste]setCreativeTab(CreativeTabs[paste][/paste]tabTools);//Добавляем в креатив}//Регистрируем текстуру@Overridepublic void registerIcons(IconRegister par1IconRegister){ this[paste][/paste]blockIcon = par1IconRegister[paste][/paste]registerIcon(ModInfo[paste][/paste]MODID + ":testBlock");}}Тут все просто и описано в комментариях.
Единственная загвоздка – текстура.
Но и тут все просто. Идем в нашу когда-то созданную папку. Заходим в mcp > src > minecraft > assets > testmod. Создаем тут папку textures (так, и только с таким именем). В ней создаем папку blocks (имя четко и строго) и уже внутрь кидаем png картинку с именем, которое мы указали в .setUnlocalizedName – тобишь testBlock.
Важно!
С версии 1.5.2 Minecraft поддерживает квадратные текстуры абсолютно любого разрешения. По крайней мере от 16?16 до 512?512 точно. Так что можете создавать блок с супер четкой текстурой.
Вот и все. Рекомендуется посмотреть ролик по этой главе (раздел меню “Видео-уроки”).
Глава 4. Текстуры и анимированные текстуры. 1.6.2
Скрытый текст
Если вы что-то забыли про текстуры и вам неудобно рыться в главе про создание блока в поисках ответа, можете заглянуть сюда.
Путь к текстуре всегда прописывается в файле предмета (будь то блок или итем). Обычно он выглядит так:
Ну а теперь гвоздь программы! То, зачем вы и открыли эту главу (наверное) – анимированные текстуры!
Ничего сложного в их создании нет.
Предположим, мы хотим анимировать блок. Текстура нашего блока называется testBlock.png. Ее размер (скорее всего) 16x16. А теперь главное понять принцип. Эту текстуру примем за 0. Теперь в любом графическом редакторе (лучше конечно Photoshop) увеличиваем высоту нашей картинки вдвое, тобишь размер станет 16x32. Получается у нас есть место для 2 блоков. Рисуем 2 блок сразу под первым. Его номер 1. И так далее делайте сколько хотите. Если ваша анимация состоит из 4 картинок, то размер картинки должен быть 16x(16*4) – 16x64. Вот и все текстура готова. Имя и расположение то же, что и обычная текстура блока.
Теперь создадим txt файл проигрывания нашей анимации. Не пугайтесь, ничего сложного тут нет. В той же папки, где находится текстура создаете txt файл с таким же именем. Если у вас анимация из двух картинок, то пишите внутрь 0,1. Если больше, то соответственно ставьте запятую и пишите число. Вуаля – анимация готова и у вашего блока появилась красивая анимированная текстура!
Теперь немного о том, как изменить скорость и последовательность анимации.
Она проигрывается со скоростью 10 кадров в секунду, или 100 миллисекунд на 1 кадр. Создается анимация посредством складывания кадров в 1 изображение, “приклеивая” каждый следующий кадр снизу предыдущего(то, о чем я говорил выше).
Также есть возможность воспроизводить анимацию в особом порядке, учитывая тот факт, что кадры начинаются с нуля, например:
0,1,2,3,2,1
Если нужно увеличить количество тиков, на которое задерживается один или несколько кадров, то можно применить такую конструкцию:
0*4,1*4,2*4,3*4,2*4,1*4
Первое соответственно отвечает за номер кадра, второе за количество тиков.
Путь к текстуре всегда прописывается в файле предмета (будь то блок или итем). Обычно он выглядит так:
public void registerIcons(IconRegister par1IconRegister){ this[paste][/paste]blockIcon = par1IconRegister[paste][/paste]registerIcon(ModInfo[paste][/paste]MODID + ":testBlock");}Пройдите по пути наша созданная папка>mcp>src>minecraft>mods>testmod (или ваш пакет). В ней создайте папку textures и внутри нее создайте папки items и blocks. Вот и все. Если вы создали блок, то кидаете текстуру с именем testBlock (как в примере или свое) в папку blocks если же итем, то в items.
Ну а теперь гвоздь программы! То, зачем вы и открыли эту главу (наверное) – анимированные текстуры!
Ничего сложного в их создании нет.
Предположим, мы хотим анимировать блок. Текстура нашего блока называется testBlock.png. Ее размер (скорее всего) 16x16. А теперь главное понять принцип. Эту текстуру примем за 0. Теперь в любом графическом редакторе (лучше конечно Photoshop) увеличиваем высоту нашей картинки вдвое, тобишь размер станет 16x32. Получается у нас есть место для 2 блоков. Рисуем 2 блок сразу под первым. Его номер 1. И так далее делайте сколько хотите. Если ваша анимация состоит из 4 картинок, то размер картинки должен быть 16x(16*4) – 16x64. Вот и все текстура готова. Имя и расположение то же, что и обычная текстура блока.
Теперь создадим txt файл проигрывания нашей анимации. Не пугайтесь, ничего сложного тут нет. В той же папки, где находится текстура создаете txt файл с таким же именем. Если у вас анимация из двух картинок, то пишите внутрь 0,1. Если больше, то соответственно ставьте запятую и пишите число. Вуаля – анимация готова и у вашего блока появилась красивая анимированная текстура!
Теперь немного о том, как изменить скорость и последовательность анимации.
Она проигрывается со скоростью 10 кадров в секунду, или 100 миллисекунд на 1 кадр. Создается анимация посредством складывания кадров в 1 изображение, “приклеивая” каждый следующий кадр снизу предыдущего(то, о чем я говорил выше).
Также есть возможность воспроизводить анимацию в особом порядке, учитывая тот факт, что кадры начинаются с нуля, например:
0,1,2,3,2,1
Если нужно увеличить количество тиков, на которое задерживается один или несколько кадров, то можно применить такую конструкцию:
0*4,1*4,2*4,3*4,2*4,1*4
Первое соответственно отвечает за номер кадра, второе за количество тиков.
Глава 5. Запуск и создание готового мода
Скрытый текст
Теперь наверняка все хочется проверить, что же получилось? Как же выглядит долгожданный блок? Сделать это очень легко.
В верхней панели есть зеленый кружок с белым треугольничком, повернутым направо. Жмем и у нас запускается игра! И если весь код написан правильно, то игра благополучно запустится и вы увидет свой первый мод в действии.
Но вам хочется идти дальше и создать готовый мод, чтобы можно было скидывать его друзьям и делать еще кучу других вещей. Это также просто.
Заходим в созданную нами папку. Проходим в папку mcp и запускаем файл recompile.bat. Этот файл в финальный раз проверит наш мод на наличие ошибок. Их не должно быть. Если они и есть, то консоль укажет где именно. После успешного завершения рекомпиляции запустите файл reobfuscate.bat. Именно он создаст наш готовый мод! После успешного окончания в этой же папке появится новая папка reobuf. В ней заходите в папку minecraft > mods > testmod и кладете папку textures (со всеми текстурами) рядом с готовыми .class файлами. Теперь эту папку mods пихаем в zip архив, ну а дальше в папку mods уже в реальном minecraft!
В верхней панели есть зеленый кружок с белым треугольничком, повернутым направо. Жмем и у нас запускается игра! И если весь код написан правильно, то игра благополучно запустится и вы увидет свой первый мод в действии.
Но вам хочется идти дальше и создать готовый мод, чтобы можно было скидывать его друзьям и делать еще кучу других вещей. Это также просто.
Заходим в созданную нами папку. Проходим в папку mcp и запускаем файл recompile.bat. Этот файл в финальный раз проверит наш мод на наличие ошибок. Их не должно быть. Если они и есть, то консоль укажет где именно. После успешного завершения рекомпиляции запустите файл reobfuscate.bat. Именно он создаст наш готовый мод! После успешного окончания в этой же папке появится новая папка reobuf. В ней заходите в папку minecraft > mods > testmod и кладете папку textures (со всеми текстурами) рядом с готовыми .class файлами. Теперь эту папку mods пихаем в zip архив, ну а дальше в папку mods уже в реальном minecraft!
Если recompile.bat выдает ошибку
Скрытый текст
В процессе написания учебника я проверяю, работает ли вообще код, который я пишу. И при рекомпиляции, перед reobufscate у меня высветилось куча ошибок с непонятными символами и словами UTF-8. Если у вас возникла та же проблема – не паникуйте. Просто удалите все комментарии из всех файлов мода.
Глава 6. Доп. про блок
Скрытый текст
Прежде чем мы приступим к созданию предмета, я хотел бы рассказать про дополнительные свойства блока. В этой главе вы поиграетесь с настройками блока и посмотрим на его основные параметры.
Итак в коде нашего блока (TestBlock.java (или ваш блок)) обратим внимание на строчку
air
anvil
cactus
cake
circuits
clay
cloth
coral
dragonEgg
fire
glass
grass
ground
ice
iron
lava
leaves
piston
plants
portal
pumpkin
rock
sand
snow
sponge
tnt
vine
water
web
wood
С этим разобрались.
Дальше идет строчка
tabAllSearch – вкладка со всеми предметами
tabBlock – вкладка “Блоки”
tabBrewing – компоненты для зелий
tabCombat - вкладка “Оружие”
tabDecorations – вкладка “Декоративные блоки”
tabFood – вкладка “Еда”
tabMaterials – вкладка “Материалы”
tabMisc – вкладка “Разное”
tabRedstone – вкладка “Механизмы”
tabTools – вкладка “Инструменты”
tabTransport – вкладка “Транспортирующие”
Можете добавлять свои thisы. Вот пример основных параметров для блока.
this.setLightValue(1.0F); – светимость блока. 1.0F – как у светокамня.
this.setResistance(3.0F); – взрывоустойчивость блока.
this.setStepSound(soundMetalFootstep); – звук, при ходьбе по блоку. Список:
soundAnvilFootstep – ходьба по наковальне
soundClothFootstep – ходьба по шерсти
soundGlassFootstep – ходьба по стеклу
soundGrassFootstep – ходьба по траве
soundGravelFootstep – ходьба по гравию
soundLadderFootstep – ходьба по лестнице
soundMetalFootstep – ходьба по драгоценным блокам
soundPowderFootstep – ходьба по пыли
soundSandFootstep – ходьба по песку
soundSnowFootstep – ходьба по снегу
soundStoneFootstep – ходьба по камню
soundWoodFootstep – ходьба по дереву
Хотите, чтобы имя блока было цветным? Пожалуйста:
Итак в коде нашего блока (TestBlock.java (или ваш блок)) обратим внимание на строчку
super(par1, Material[paste][/paste]ground);ground – это наш материал. Если вы сотрете ground включая точку, а потом вновь поставите ее, то у вас выскочит список доступных в игре материалов. Я приведу их тут.
air
anvil
cactus
cake
circuits
clay
cloth
coral
dragonEgg
fire
glass
grass
ground
ice
iron
lava
leaves
piston
plants
portal
pumpkin
rock
sand
snow
sponge
tnt
vine
water
web
wood
С этим разобрались.
Дальше идет строчка
this[paste][/paste]setCreativeTab(CreativeTabs[paste][/paste]tabTools);Тут то мы и указываем основные свойства. В данной строке блок добавляется в креативную таблицу в игре. Таблица указывается после точки. Если вы также сотрете ее название и точку, а потом поставите ее снова, то у вас выскочит список всех таблиц. Также привожу их список.
tabAllSearch – вкладка со всеми предметами
tabBlock – вкладка “Блоки”
tabBrewing – компоненты для зелий
tabCombat - вкладка “Оружие”
tabDecorations – вкладка “Декоративные блоки”
tabFood – вкладка “Еда”
tabMaterials – вкладка “Материалы”
tabMisc – вкладка “Разное”
tabRedstone – вкладка “Механизмы”
tabTools – вкладка “Инструменты”
tabTransport – вкладка “Транспортирующие”
Можете добавлять свои thisы. Вот пример основных параметров для блока.
{super(par1, Material[paste][/paste]ground); this[paste][/paste]setCreativeTab(CreativeTabs[paste][/paste]tabBlock); this[paste][/paste]setHardness(1[paste][/paste]0F); this[paste][/paste]setLightValue(1[paste][/paste]0F); this[paste][/paste]setResistance(3[paste][/paste]0F); this[paste][/paste]setStepSound(soundMetalFootstep);}this.setHardness(1.0F); – скорость разрушения блока. 0.5F – как у грязи.
this.setLightValue(1.0F); – светимость блока. 1.0F – как у светокамня.
this.setResistance(3.0F); – взрывоустойчивость блока.
this.setStepSound(soundMetalFootstep); – звук, при ходьбе по блоку. Список:
soundAnvilFootstep – ходьба по наковальне
soundClothFootstep – ходьба по шерсти
soundGlassFootstep – ходьба по стеклу
soundGrassFootstep – ходьба по траве
soundGravelFootstep – ходьба по гравию
soundLadderFootstep – ходьба по лестнице
soundMetalFootstep – ходьба по драгоценным блокам
soundPowderFootstep – ходьба по пыли
soundSandFootstep – ходьба по песку
soundSnowFootstep – ходьба по снегу
soundStoneFootstep – ходьба по камню
soundWoodFootstep – ходьба по дереву
Хотите, чтобы имя блока было цветным? Пожалуйста:
LanguageRegistry[paste][/paste]addName(testBlock, "u00a72" + "Test Block");Это обычное объявление имени блока. Но вот u00a72 код цвета нашего блока. Заменяя последнюю цифру на цифры ниже вы можете менять цвет блока.
Глава 7. Крафты и рецепты
Скрытый текст
В этой главе я опишу, как создавать для ваших будущих и существующих блоков и предметов крафты в верстаке и в печке.
Крафты записываются там же, где мы писали GameRegistry.блабла.
Приведу сразу весь файл, в котором мы получаем наш блок с помощью верстака, бесформенный крафт и с помощью печки.
"XXX", “XXX", "XXX",
Пока давайте представим это так – "123", "456", "789",
Тогда наш верстак будет выглядеть так:
Первые три X – слева направо первый ряд верстака и так далее.
Вместо X вы можете использовать все что угодно, например Y.
Character.valueOf('X'), Block.cobblestone – в скобочках указанный нами символ и что он из себя представляет (в этом случае – блок булыжника).
Можете использовать несколько символов, например:
{ "X#X", "X#X", "X#X", Character.valueOf('X'), Block.cobblestone, ('#'), Block.dirt});
Думаю объяснять не стоит.
Далее, следующая строчка:
(TestMod.testBlock, 4) – что получаем в каком количестве.
{Item.stick, Block.dirt} – что должно находиться в верстаке.
И наконец рецепт в печке:
TestMod.testBlock, 1 – что получаем и в каком количестве
1.0F – сколько опыта дадут за переплавку
Вот пока что все. Теперь вы можете добавить крафт любому своему предмету/блоку.
Крафты записываются там же, где мы писали GameRegistry.блабла.
Приведу сразу весь файл, в котором мы получаем наш блок с помощью верстака, бесформенный крафт и с помощью печки.
package mods[paste][/paste]testmod; import net[paste][/paste]minecraft[paste][/paste]block[paste][/paste]Block;import net[paste][/paste]minecraft[paste][/paste]item[paste][/paste]Item;import net[paste][/paste]minecraft[paste][/paste]item[paste][/paste]ItemStack;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]Mod;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]Mod[paste][/paste]Init;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]Mod[paste][/paste]Instance;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]Mod[paste][/paste]PostInit;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]Mod[paste][/paste]PreInit;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]event[paste][/paste]FMLInitializationEvent;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]event[paste][/paste]FMLPostInitializationEvent;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]event[paste][/paste]FMLPreInitializationEvent;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]network[paste][/paste]NetworkMod;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]registry[paste][/paste]GameRegistry;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]registry[paste][/paste]LanguageRegistry; @Mod (modid = "TestMod", name = "Test Mod", version = "0[paste][/paste]0[paste][/paste]1")@NetworkMod (clientSideRequired = true, serverSideRequired = false, versionBounds = "1[paste][/paste]0[paste][/paste]0") public class TestMod { public static final Block testBlock = new TestBlock(2020)[paste][/paste]setUnlocalizedName("testBlock"); @Instance("TestModID")public static TestMod instance; @Initpublic void load(FMLInitializationEvent event){GameRegistry[paste][/paste]registerBlock(testBlock);LanguageRegistry[paste][/paste]addName(testBlock, "Test Block");GameRegistry[paste][/paste]addRecipe(new ItemStack(TestMod[paste][/paste]testBlock, 1), new Object[]{ "XXX", "XXX", "XXX", Character[paste][/paste]valueOf('X'), Block[paste][/paste]cobblestone, ('#'), Block[paste][/paste]dirt});GameRegistry[paste][/paste]addShapelessRecipe(new ItemStack(TestMod[paste][/paste]testBlock, 4), new Object[] {Item[paste][/paste]stick, Block[paste][/paste]dirt});GameRegistry[paste][/paste]addSmelting(Block[paste][/paste]dirt[paste][/paste]blockID, new ItemStack(TestMod[paste][/paste]testBlock, 1), 1[paste][/paste]0F);} @PreInitpublic void preLoad(FMLPreInitializationEvent event){} @PostInitpublic void postLoad(FMLPostInitializationEvent event){}}Итак, начнем с крафта в верстаке:
GameRegistry[paste][/paste]addRecipe(new ItemStack(TestMod[paste][/paste]testBlock, 1), new Object[]{ "XXX", "XXX", "XXX", Character[paste][/paste]valueOf('X'), Block[paste][/paste]cobblestone});(TestMod.testBlock, 1) – наш блок и его количество. Можете указать стандартный блок (Block.stone). Обратите внимание, что блоки из мода требуют указания файла, где они созданы (в нашем случае TestMod.java), значит и пишем TestMod.testBlock.
"XXX", “XXX", "XXX",
Пока давайте представим это так – "123", "456", "789",
Тогда наш верстак будет выглядеть так:
Первые три X – слева направо первый ряд верстака и так далее.
Вместо X вы можете использовать все что угодно, например Y.
Character.valueOf('X'), Block.cobblestone – в скобочках указанный нами символ и что он из себя представляет (в этом случае – блок булыжника).
Можете использовать несколько символов, например:
{ "X#X", "X#X", "X#X", Character.valueOf('X'), Block.cobblestone, ('#'), Block.dirt});
Думаю объяснять не стоит.
Далее, следующая строчка:
GameRegistry[paste][/paste]addShapelessRecipe(new ItemStack(TestMod[paste][/paste]testBlock, 4), new Object[] {Item[paste][/paste]stick, Block[paste][/paste]dirt});Это тоже крафт в верстаке, но уже не зависящий от расположения ингредиентов.
(TestMod.testBlock, 4) – что получаем в каком количестве.
{Item.stick, Block.dirt} – что должно находиться в верстаке.
И наконец рецепт в печке:
GameRegistry[paste][/paste]addSmelting(Block[paste][/paste]dirt[paste][/paste]blockID, new ItemStack(TestMod[paste][/paste]testBlock, 1), 1[paste][/paste]0F);Block.dirt.blockID – что переплавляем (верхний слот)
TestMod.testBlock, 1 – что получаем и в каком количестве
1.0F – сколько опыта дадут за переплавку
Вот пока что все. Теперь вы можете добавить крафт любому своему предмету/блоку.
Глава 8. Создание предмета
Скрытый текст
В этой главе создадим простейший предмет.
Там же, где мы создавали блок (не GameRegistry, а выше) пишем такой код:
Ну а там, где у нас все регистрации пишем строчку, которая дает нашему итему имя в игре
Код у него такой:
Важно!
Чтобы у вас появилась текстура вашего итема, вам в папке textures (см. создание блока) надо создать папку items. Получается у вас в textures будет две папки – blocks items. Имена должны быть строго такими. И в items должна лежать текстура с именем testItem.png (.setUnlocalizedName).
Вот собственно и все.
Там же, где мы создавали блок (не GameRegistry, а выше) пишем такой код:
public static Item testItem = new TestItem(2021)[paste][/paste]setUnlocalizedName("testItem");Скорее всего, он выведет ошибку. Добавляем необходимые импорты (Ctrl+Shift+O) и ошибка исчезает.
Ну а там, где у нас все регистрации пишем строчку, которая дает нашему итему имя в игре
LanguageRegistry[paste][/paste]addName(testItem, "Test Item");В итоге, мой TestMod.java будет выглядеть таким образом:
package mods[paste][/paste]testmod; import net[paste][/paste]minecraft[paste][/paste]block[paste][/paste]Block;import net[paste][/paste]minecraft[paste][/paste]item[paste][/paste]Item;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]Mod;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]Mod[paste][/paste]Init;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]Mod[paste][/paste]Instance;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]Mod[paste][/paste]PostInit;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]Mod[paste][/paste]PreInit;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]event[paste][/paste]FMLInitializationEvent;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]event[paste][/paste]FMLPostInitializationEvent;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]event[paste][/paste]FMLPreInitializationEvent;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]network[paste][/paste]NetworkMod;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]registry[paste][/paste]GameRegistry;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]registry[paste][/paste]LanguageRegistry; @Mod (modid = "TestMod", name = "Test Mod", version = "0[paste][/paste]0[paste][/paste]1")@NetworkMod (clientSideRequired = true, serverSideRequired = false, versionBounds = "1[paste][/paste]0[paste][/paste]0") public class TestMod {public static Item testItem = new TestItem(2020)[paste][/paste]setUnlocalizedName("testItem"); @Instance("TestModID")public static TestMod instance; @Initpublic void load(FMLInitializationEvent event){LanguageRegistry[paste][/paste]addName(testItem, "Test Item");} @PreInitpublic void preLoad(FMLPreInitializationEvent event){} @PostInitpublic void postLoad(FMLPostInitializationEvent event){}}У нас все равно остается одна ошибка TestItem, но это из за того, как вы уже поняли, что отсутствует файл TestItem.java. Наводим мышкой на ошибку и у нас появляется в выпадающем меню предложение создать этот файл.
Код у него такой:
package mods[paste][/paste]testmod; import net[paste][/paste]minecraft[paste][/paste]item[paste][/paste]Item;import net[paste][/paste]minecraft[paste][/paste]client[paste][/paste]renderer[paste][/paste]texture[paste][/paste]IconRegister;import net[paste][/paste]minecraft[paste][/paste]creativetab[paste][/paste]CreativeTabs; public class TestItem extends Item{public TestItem(int par1){ super(par1); this[paste][/paste]setCreativeTab(CreativeTabs[paste][/paste]tabTools);} @Overridepublic void registerIcons(IconRegister par1IconRegister){ this[paste][/paste]itemIcon = par1IconRegister[paste][/paste]registerIcon("testmod:testItem");}}Если вы проходили главу про создание блока и главу "доп про блок', то вам все станет понятно.
Важно!
Чтобы у вас появилась текстура вашего итема, вам в папке textures (см. создание блока) надо создать папку items. Получается у вас в textures будет две папки – blocks items. Имена должны быть строго такими. И в items должна лежать текстура с именем testItem.png (.setUnlocalizedName).
Вот собственно и все.
Глава 9. Создание еды
Скрытый текст
Мы все хотим и любим есть. И главый герой в Minecraft не исключение. Бутерброды, соки, яблочные печеньки – почему нет?
Там же, где мы создавали предмет и блок пишем код:
0.4F – на сколько утоляет голод
false – можно ли этой едой приручить волка (true – да, false – нет)
Так выглядит наш файл TestMod.java
ItemFood – означает, что наша еда уже во вкладке "Еда"
Там же, где мы создавали предмет и блок пишем код:
public static Item testFood = new TestFood(2022, 1, 0[paste][/paste]4F, false)[paste][/paste]setUnlocalizedName("testFood");1 – количество восстанавливаемых полу-сердец. 1 = 0.5 сердца.
0.4F – на сколько утоляет голод
false – можно ли этой едой приручить волка (true – да, false – нет)
Так выглядит наш файл TestMod.java
package mods[paste][/paste]testmod;import net[paste][/paste]minecraft[paste][/paste]block[paste][/paste]Block;import net[paste][/paste]minecraft[paste][/paste]creativetab[paste][/paste]CreativeTabs;import net[paste][/paste]minecraft[paste][/paste]item[paste][/paste]Item;import net[paste][/paste]minecraft[paste][/paste]item[paste][/paste]ItemStack;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]Mod;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]Mod[paste][/paste]Init;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]Mod[paste][/paste]Instance;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]Mod[paste][/paste]PostInit;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]Mod[paste][/paste]PreInit;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]event[paste][/paste]FMLInitializationEvent;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]event[paste][/paste]FMLPostInitializationEvent;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]event[paste][/paste]FMLPreInitializationEvent;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]network[paste][/paste]NetworkMod;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]network[paste][/paste]NetworkRegistry;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]registry[paste][/paste]GameRegistry;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]registry[paste][/paste]LanguageRegistry;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]network[paste][/paste]NetworkMod[paste][/paste]SidedPacketHandler;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]SidedProxy;@Mod (modid = "TestMod", name = "Test Mod", version = "0[paste][/paste]0[paste][/paste]1")@NetworkMod (clientSideRequired = true, serverSideRequired = false, versionBounds = "1[paste][/paste]0[paste][/paste]0")public class TestMod {public static Item testFood = new TestFood(5003, 1, 0[paste][/paste]4F, false)[paste][/paste]setUnlocalizedName("testFood");@Instance("TestModID")public static TestMod instance;@Initpublic void load(FMLInitializationEvent event){LanguageRegistry[paste][/paste]addName(testFood, "Test Food");}@PreInitpublic void preLoad(FMLPreInitializationEvent event){}@PostInitpublic void postLoad(FMLPostInitializationEvent event){}}Создаем файл TestFood.java
package mods[paste][/paste]testmod;import net[paste][/paste]minecraft[paste][/paste]client[paste][/paste]renderer[paste][/paste]texture[paste][/paste]IconRegister;import net[paste][/paste]minecraft[paste][/paste]item[paste][/paste]ItemFood;public class TestFood extends ItemFood{public TestFood(int par1, int par2, float par3, boolean par4) { super(par1, par2, par4); maxStackSize = 64; }@Overridepublic void registerIcons(IconRegister par1IconRegister){ this[paste][/paste]itemIcon = par1IconRegister[paste][/paste]registerIcon("testmod:testFood");}}maxStackSize = 64 – сколько предметов может быть в стаке
ItemFood – означает, что наша еда уже во вкладке "Еда"
Глава 10. Своя вкладка в креативе
Скрытый текст
Хотите создать свою вкладку в креативе, чтобы складывать туда свои блоки и итемы.
Все там же, где мы создаем блоки и итемы пишем:
“TestCreativeTab” – типа текстовый Id
Так выглядит TestMod.java
return "Test"; – имя вкладки в игре
Все там же, где мы создаем блоки и итемы пишем:
public static CreativeTabs tabTest = new TabTest(CreativeTabs[paste][/paste]getNextID(),"TestCreativeTab");Ctrl+Shift+O и автоматически добавляется пара необходимых импортов
“TestCreativeTab” – типа текстовый Id
Так выглядит TestMod.java
package mods[paste][/paste]testmod;import net[paste][/paste]minecraft[paste][/paste]creativetab[paste][/paste]CreativeTabs;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]Mod;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]Mod[paste][/paste]Init;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]Mod[paste][/paste]Instance;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]Mod[paste][/paste]PostInit;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]Mod[paste][/paste]PreInit;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]event[paste][/paste]FMLInitializationEvent;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]event[paste][/paste]FMLPostInitializationEvent;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]event[paste][/paste]FMLPreInitializationEvent;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]network[paste][/paste]NetworkMod;@Mod (modid = "TestMod", name = "Test Mod", version = "0[paste][/paste]0[paste][/paste]1")@NetworkMod (clientSideRequired = true, serverSideRequired = false, versionBounds = "1[paste][/paste]0[paste][/paste]0")public class TestMod { public static CreativeTabs tabTest = new TabTest(CreativeTabs[paste][/paste]getNextID(),"TestCreativeTab");@Instance("TestModID")public static TestMod instance;@Initpublic void load(FMLInitializationEvent event){}@PreInitpublic void preLoad(FMLPreInitializationEvent event){}@PostInitpublic void postLoad(FMLPostInitializationEvent event){}}Теперь создаем файл TabTest.java и пишем туда следующее:
package mods[paste][/paste]testmod;import net[paste][/paste]minecraft[paste][/paste]block[paste][/paste]Block;import net[paste][/paste]minecraft[paste][/paste]creativetab[paste][/paste]CreativeTabs;import net[paste][/paste]minecraft[paste][/paste]item[paste][/paste]Item;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]relauncher[paste][/paste]*;public class TabTest extends CreativeTabs {public TabTest(int position, String tabID){super(position, tabID);}@SideOnly(Side[paste][/paste]CLIENT)public int getTabIconItemIndex(){return Block[paste][/paste]cobblestone[paste][/paste]blockID;}public String getTranslatedTabLabel(){return "Test";}}return Block.cobblestone.blockID; – иконка нашей вкладки
return "Test"; – имя вкладки в игре
Глава 11. Создание своих инструментов
Скрытый текст
Хочется создать свои инструменты, ну наподобие алмазных или железных? Легко. Для начала нужно создать новый материал для ваших инструментов. Там, где создавали блоки пишем следующее:
TEST – текстовый Id
4 – порядок нашего материала. Изумруд – 3. Если вы создаете несколько материалов, то соответственно повышаете на единицу
300 – количество использований
7 – урон (1 – 0.5 сердца)
10 – зачароваемость
Далее там же создаем наши инструменты (приведу код для всех инструментов):
swordTest – текстовый Id
2025 – Id
TESTMATERIALTOOL – наш материал
swordTest – имя текстуры (тоесть текстура должна быть такой – swordTest.png).
Со всем остальным так же.
Теперь дадим каждому инструменту имя. Там где прописывали все регистры пишем:
Вот и все – никаких файлов не надо создавать! Закидывайте текстуры по такому пути. Наша созданная папка>mcp>jars>bin>minecraft.jar>textures>items.
Вот так выглядит TestMod.java
public static EnumToolMaterial TESTMATERIALTOOL = EnumHelper[paste][/paste]addToolMaterial("TEST", 4, 300, 7, 3, 10);TESTMATERIALTOOL – имя нашего материала (пишите большими буквами)
TEST – текстовый Id
4 – порядок нашего материала. Изумруд – 3. Если вы создаете несколько материалов, то соответственно повышаете на единицу
300 – количество использований
7 – урон (1 – 0.5 сердца)
10 – зачароваемость
Далее там же создаем наши инструменты (приведу код для всех инструментов):
public static Item swordTest = new ItemSword(2025, TESTMATERIALTOOL)[paste][/paste]setUnlocalizedName("swordTest");public static Item hoeTest = new ItemHoe(2026, TESTMATERIALTOOL)[paste][/paste]setUnlocalizedName("hoeTest");public static Item axeTest = new ItemAxe(2027, TESTMATERIALTOOL)[paste][/paste]setUnlocalizedName("axeTest");public static Item pickaxeTest = new ItemPickaxe(2028, TESTMATERIALTOOL)[paste][/paste]setUnlocalizedName("pickaxeTest");public static Item shovelTest = new ItemSpade(2029, TESTMATERIALTOOL)[paste][/paste]setUnlocalizedName("shovelTest");Если вы хорошо проходили прошлые главы, то поймете этот код. Для других же поясню.
swordTest – текстовый Id
2025 – Id
TESTMATERIALTOOL – наш материал
swordTest – имя текстуры (тоесть текстура должна быть такой – swordTest.png).
Со всем остальным так же.
Теперь дадим каждому инструменту имя. Там где прописывали все регистры пишем:
LanguageRegistry[paste][/paste]addName(axeTest, "Test axe");LanguageRegistry[paste][/paste]addName(hoeTest, "Test hoe");LanguageRegistry[paste][/paste]addName(pickaxeTest, "Test pickaxe");LanguageRegistry[paste][/paste]addName(shovelTest, "Test shovel");LanguageRegistry[paste][/paste]addName(swordTest, "Test sword");Объяснять здесь ничего не надо – текстовый id, а в кавычках имя в игре.
Вот и все – никаких файлов не надо создавать! Закидывайте текстуры по такому пути. Наша созданная папка>mcp>jars>bin>minecraft.jar>textures>items.
Вот так выглядит TestMod.java
package mods[paste][/paste]testmod;import net[paste][/paste]minecraft[paste][/paste]item[paste][/paste]EnumToolMaterial;import net[paste][/paste]minecraft[paste][/paste]item[paste][/paste]Item;import net[paste][/paste]minecraft[paste][/paste]item[paste][/paste]ItemAxe;import net[paste][/paste]minecraft[paste][/paste]item[paste][/paste]ItemHoe;import net[paste][/paste]minecraft[paste][/paste]item[paste][/paste]ItemPickaxe;import net[paste][/paste]minecraft[paste][/paste]item[paste][/paste]ItemSpade;import net[paste][/paste]minecraft[paste][/paste]item[paste][/paste]ItemSword;import net[paste][/paste]minecraftforge[paste][/paste]common[paste][/paste]EnumHelper;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]Mod;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]Mod[paste][/paste]Init;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]Mod[paste][/paste]Instance;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]Mod[paste][/paste]PostInit;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]Mod[paste][/paste]PreInit;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]event[paste][/paste]FMLInitializationEvent;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]event[paste][/paste]FMLPostInitializationEvent;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]event[paste][/paste]FMLPreInitializationEvent;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]network[paste][/paste]NetworkMod;@Mod (modid = "TestMod", name = "Test Mod", version = "0[paste][/paste]0[paste][/paste]1")@NetworkMod (clientSideRequired = true, serverSideRequired = false, versionBounds = "1[paste][/paste]0[paste][/paste]0")public class TestMod {@Instance("TestModID")public static TestMod instance;public static EnumToolMaterial TESTMATERIALTOOL = EnumHelper[paste][/paste]addToolMaterial("TEST", 4, 300, 7, 3, 10);public static Item swordTest = new ItemSword(2025, TESTMATERIALTOOL)[paste][/paste]setUnlocalizedName("swordTest");public static Item hoeTest = new ItemHoe(2026, TESTMATERIALTOOL)[paste][/paste]setUnlocalizedName("hoeTest");public static Item axeTest = new ItemAxe(2027, TESTMATERIALTOOL)[paste][/paste]setUnlocalizedName("axeTest");public static Item pickaxeTest = new ItemPickaxe(2028, TESTMATERIALTOOL)[paste][/paste]setUnlocalizedName("pickaxeTest");public static Item shovelTest = new ItemSpade(2029, TESTMATERIALTOOL)[paste][/paste]setUnlocalizedName("shovelTest");@Initpublic void load(FMLInitializationEvent event){}@PreInitpublic void preLoad(FMLPreInitializationEvent event){}@PostInitpublic void postLoad(FMLPostInitializationEvent event){}}
Глава 12. Создание своей брони
Скрытый текст
Но какой комплект инструментов без своего сета брони? Никакой.
Все там же, где мы создавали инструменты пишем:
30 – поглощаемый урон
{2, 8, 6, 2} – уровень брони на каждую ее часть
10 – зачароваемость
Ниже пишем:
Test – префикс, для модели брони (Test_1.png – шлем и нагрудник, Test_2.png – штаны и ботинки)
helmetTest – текстура в инвентаре
Идем по пути наша созданная папка>mcp>jars>bin>minecraft.jar>armor. Туда кидаем наши Test_1.png и Test_2.png (для примера возьмите в той же папке diamond_1.png и diamond_2.png).
Далее выходим в minecraft.jar>textures>items и туда кидаем helmetTest.png, chestplateTest.png, leggingsTes.pngt, bootsTest.png.
Так выглядит TestMod.java
Все там же, где мы создавали инструменты пишем:
public static EnumArmorMaterial TESTARMORMATERIAL = EnumHelper[paste][/paste]addArmorMaterial("TEST", 30, new int[] {2, 8, 6, 2}, 10);TESTARMORMATERIAL – имя материала для брони
30 – поглощаемый урон
{2, 8, 6, 2} – уровень брони на каждую ее часть
10 – зачароваемость
Ниже пишем:
public static Item helmetTest = new ItemArmor(2030, TESTARMORMATERIAL, ModLoader[paste][/paste]addArmor("Test"), 0)[paste][/paste]setUnlocalizedName("helmetTest");public static Item chestplateTest = new ItemArmor(2031, TESTARMORMATERIAL,ModLoader[paste][/paste]addArmor("Test"),1)[paste][/paste]setUnlocalizedName("chestplateTest");public static Item leggingsTest = new ItemArmor(2032, TESTARMORMATERIAL, ModLoader[paste][/paste]addArmor("Test"), 2)[paste][/paste]setUnlocalizedName("leggingsTest");public static Item bootsTest = new ItemArmor(2033, TESTARMORMATERIAL, ModLoader[paste][/paste]addArmor("Test"), 3)[paste][/paste]setUnlocalizedName("bootsTest");2030 – idишники
Test – префикс, для модели брони (Test_1.png – шлем и нагрудник, Test_2.png – штаны и ботинки)
helmetTest – текстура в инвентаре
Идем по пути наша созданная папка>mcp>jars>bin>minecraft.jar>armor. Туда кидаем наши Test_1.png и Test_2.png (для примера возьмите в той же папке diamond_1.png и diamond_2.png).
Далее выходим в minecraft.jar>textures>items и туда кидаем helmetTest.png, chestplateTest.png, leggingsTes.pngt, bootsTest.png.
Так выглядит TestMod.java
package mods[paste][/paste]testmod;import net[paste][/paste]minecraft[paste][/paste]item[paste][/paste]EnumArmorMaterial;import net[paste][/paste]minecraft[paste][/paste]item[paste][/paste]Item;import net[paste][/paste]minecraft[paste][/paste]item[paste][/paste]ItemArmor;import net[paste][/paste]minecraft[paste][/paste]src[paste][/paste]ModLoader;import net[paste][/paste]minecraftforge[paste][/paste]common[paste][/paste]EnumHelper;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]Mod;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]Mod[paste][/paste]Init;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]Mod[paste][/paste]Instance;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]Mod[paste][/paste]PostInit;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]Mod[paste][/paste]PreInit;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]event[paste][/paste]FMLInitializationEvent;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]event[paste][/paste]FMLPostInitializationEvent;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]event[paste][/paste]FMLPreInitializationEvent;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]network[paste][/paste]NetworkMod;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]registry[paste][/paste]LanguageRegistry;@Mod (modid = "TestMod", name = "Test Mod", version = "0[paste][/paste]0[paste][/paste]1")@NetworkMod (clientSideRequired = true, serverSideRequired = false, versionBounds = "1[paste][/paste]0[paste][/paste]0")public class TestMod {@Instance("TestModID")public static TestMod instance;public static EnumArmorMaterial TESTARMORMATERIAL = EnumHelper[paste][/paste]addArmorMaterial("TEST", 30, new int[] {2, 8, 6, 2}, 10);public static Item helmetTest = new ItemArmor(2030, TESTARMORMATERIAL, ModLoader[paste][/paste]addArmor("Test"), 0)[paste][/paste]setUnlocalizedName("helmetTest");public static Item chestplateTest = new ItemArmor(2031, TESTARMORMATERIAL,ModLoader[paste][/paste]addArmor("Test"),1)[paste][/paste]setUnlocalizedName("chestplateTest");public static Item leggingsTest = new ItemArmor(2032, TESTARMORMATERIAL, ModLoader[paste][/paste]addArmor("Test"), 2)[paste][/paste]setUnlocalizedName("leggingsTest");public static Item bootsTest = new ItemArmor(2033, TESTARMORMATERIAL, ModLoader[paste][/paste]addArmor("Test"), 3)[paste][/paste]setUnlocalizedName("bootsTest");@Initpublic void load(FMLInitializationEvent event){}@PreInitpublic void preLoad(FMLPreInitializationEvent event){}@PostInitpublic void postLoad(FMLPostInitializationEvent event){}}
Глава 13. Создание своей команды в чате
Скрытый текст
Сразу после public class TestMod пишем
Внутри пишем:
this.aliases.add("sampl");
this.aliases.add("sam");
this.aliases.add("s");
Варианты ввода нашей команды (/sample text, /sam text, /s text)
Остальное попытайтесь понять сами.
Команда берет text и пишет его в чате в квадратных скобках.
@ServerStartingpublic void serverLoad(FMLServerStartingEvent event){ event[paste][/paste]registerServerCommand(new SampleCommand());}Добавляем необходимые импорты (если они нужны) и создаем файл SampleCommand.java.
Внутри пишем:
package mods[paste][/paste]testmod;import java[paste][/paste]util[paste][/paste]ArrayList;import java[paste][/paste]util[paste][/paste]List;import net[paste][/paste]minecraft[paste][/paste]command[paste][/paste]ICommand;import net[paste][/paste]minecraft[paste][/paste]command[paste][/paste]ICommandSender;public class SampleCommand implements ICommand{ private List aliases; public SampleCommand() { this[paste][/paste]aliases = new ArrayList(); this[paste][/paste]aliases[paste][/paste]add("sample"); this[paste][/paste]aliases[paste][/paste]add("sam"); this[paste][/paste]aliases[paste][/paste]add("s"); } @Override public String getCommandName() { return "sample"; } @Override public String getCommandUsage(ICommandSender icommandsender) { return "sample <text>"; } @Override public List getCommandAliases() { return this[paste][/paste]aliases; } @Override public void processCommand(ICommandSender icommandsender, String[] astring) { if(astring[paste][/paste]length == 0) { icommandsender[paste][/paste]sendChatToPlayer("Invalid arguments"); return; } icommandsender[paste][/paste]sendChatToPlayer("Sample: [" + astring[0] + "]"); } @Override public boolean canCommandSenderUseCommand(ICommandSender icommandsender) { return true; } @Override public List addTabCompletionOptions(ICommandSender icommandsender, String[] astring) { return null; } @Override public boolean isUsernameIndex(String[] astring, int i) { return false; } @Override public int compareTo(Object o) { return 0; }}Попытайтесь разобраться с кодом сами.
this.aliases.add("sampl");
this.aliases.add("sam");
this.aliases.add("s");
Варианты ввода нашей команды (/sample text, /sam text, /s text)
Остальное попытайтесь понять сами.
Команда берет text и пишет его в чате в квадратных скобках.
Глава 14. Мод на сервер
Скрытый текст
Хотите поиграть на сервере с друзьями с вашим модом? Легко.
Для начала конечно у вас и у ваших друзей должен быть Forge на Minecraft с установленным вашим модом.
Теперь скачиваете minecraft-server.jar (на официальном сайте). Скачать(снизу страницы). Кидаете скачанный jar файл в какую-нибудь папку. Затем скачиваете Forge и скидываете его файлы в minecraft_server.jar (короче как вы патчите обычный Minecraft, так и minecraft_server). Теперь запускаете его и вот у вас знакомая по обычному Minecraft папка mods. Туда кидаете мод в архиве (смотрите "Создание готового мода"). Вот и все! Можете подключаться и играть с вашим модом!
Для начала конечно у вас и у ваших друзей должен быть Forge на Minecraft с установленным вашим модом.
Теперь скачиваете minecraft-server.jar (на официальном сайте). Скачать(снизу страницы). Кидаете скачанный jar файл в какую-нибудь папку. Затем скачиваете Forge и скидываете его файлы в minecraft_server.jar (короче как вы патчите обычный Minecraft, так и minecraft_server). Теперь запускаете его и вот у вас знакомая по обычному Minecraft папка mods. Туда кидаете мод в архиве (смотрите "Создание готового мода"). Вот и все! Можете подключаться и играть с вашим модом!
Глава 15. Создание своего растения (как пшеница)
Скрытый текст
В этой главе мы создадим собственно растение. Свойства у него будут как у пшеницы.
Итак для начала нужно создать блок testPlant, который и будет самим блоком растения и предмет testSeeds, который будет являться семенами для выращивания растения.
Там где создавали блоки пишем:
В регистрах регистрируем наш блок и даем имя семенам:
Теперь testSeeds.java
super(par1, TestMod.testPlant); – что выращивают семена.
this.setCreativeTab(CreativeTabs.tabMaterials); – креативная вкладочка.
("testmod:testSeeds"); – текстура.
Ну и в регистры можете добавить строку
Эта строка добавляет дроп с травы
Вот так выглядит TestMod.java
Итак для начала нужно создать блок testPlant, который и будет самим блоком растения и предмет testSeeds, который будет являться семенами для выращивания растения.
Там где создавали блоки пишем:
public static Block testPlant = new testPlant(2040)[paste][/paste]setUnlocalizedName("testPlant"); public static Item testSeeds = new testSeeds(2041)[paste][/paste]setUnlocalizedName("tomatoSeeds");Если вы проходили главу про создание блоков вопросов возникнуть не должно.
В регистрах регистрируем наш блок и даем имя семенам:
GameRegistry[paste][/paste]registerBlock(testPlant);LanguageRegistry[paste][/paste]addName(testSeeds, "Test Seeds");Создаем файлы testPlant.java и testSeeds.
package mods[paste][/paste]testmod;import net[paste][/paste]minecraft[paste][/paste]block[paste][/paste]Block;import net[paste][/paste]minecraft[paste][/paste]block[paste][/paste]BlockCrops;import net[paste][/paste]minecraft[paste][/paste]client[paste][/paste]renderer[paste][/paste]texture[paste][/paste]IconRegister;import net[paste][/paste]minecraft[paste][/paste]item[paste][/paste]Item;import net[paste][/paste]minecraft[paste][/paste]util[paste][/paste]Icon;import net[paste][/paste]minecraft[paste][/paste]world[paste][/paste]World;import net[paste][/paste]minecraftforge[paste][/paste]common[paste][/paste]ForgeDirection;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]relauncher[paste][/paste]Side;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]relauncher[paste][/paste]SideOnly;public class testPlant extends BlockCrops { private Icon[] iconArray; protected testPlant(int id) { super(id); } @SideOnly(Side[paste][/paste]CLIENT) public Icon getIcon(int par1, int par2) { if (par2 < 0 || par2 > 3) { par2 = 3; } return this[paste][/paste]iconArray[par2]; } public boolean canBlockStay(World par1World, int par2, int par3, int par4) { return par1World[paste][/paste]getBlockId(par2, par3-1, par4)==Block[paste][/paste]tilledField[paste][/paste]blockID; } public boolean canPlaceBlockAt(World par1World, int par2, int par3, int par4) { return par1World[paste][/paste]getBlockId(par2, par3-1, par4)==Block[paste][/paste]tilledField[paste][/paste]blockID; } protected int getSeedItem() { return TestMod[paste][/paste]testSeeds[paste][/paste]itemID; } protected int getCropItem() { return Item[paste][/paste]axeDiamond[paste][/paste]itemID; } @SideOnly(Side[paste][/paste]CLIENT) public void registerIcons(IconRegister par1IconRegister) { this[paste][/paste]iconArray = new Icon[4]; for (int i = 0; i < this[paste][/paste]iconArray[paste][/paste]length; ++i) { this[paste][/paste]iconArray[i] = par1IconRegister[paste][/paste]registerIcon("testmod:testPlant_" + i); } }}Итак начнем разбирать код:
public boolean canBlockStay(World par1World, int par2, int par3, int par4) { return par1World[paste][/paste]getBlockId(par2, par3-1, par4)==Block[paste][/paste]tilledField[paste][/paste]blockID; } public boolean canPlaceBlockAt(World par1World, int par2, int par3, int par4) { return par1World[paste][/paste]getBlockId(par2, par3-1, par4)==Block[paste][/paste]tilledField[paste][/paste]blockID; }Block.tilledField.blockID – измените на любой блок (и сверху и снизу!). На том блоке, который вы выбрали можно будет выращивать ваше растение (к примеру Block.blockDiamond.blockID – на алмазном блоке).
protected int getSeedItem() { return TestMod[paste][/paste]testSeeds[paste][/paste]itemID; }TestMod.testSeeds.itemID – семена для выращивания блока.
protected int getCropItem() { return Item[paste][/paste]axeDiamond[paste][/paste]itemID; }Item.axeDiamond.itemID – дроп с полностью выращенного растения.
this[paste][/paste]iconArray = new Icon[4]; for (int i = 0; i < this[paste][/paste]iconArray[paste][/paste]length; ++i) { this[paste][/paste]iconArray[i] = par1IconRegister[paste][/paste]registerIcon("testmod:testPlant_" + i); }Это массив из 4 элементов. Соответственно в blocks должно быть 4 текстуры стадии роста растения (testPlant_0.png, testPlant_1.png, testPlant_2.png, testPlant_3.png).
Теперь testSeeds.java
package mods[paste][/paste]testmod;import net[paste][/paste]minecraft[paste][/paste]client[paste][/paste]renderer[paste][/paste]texture[paste][/paste]IconRegister;import net[paste][/paste]minecraft[paste][/paste]creativetab[paste][/paste]CreativeTabs;import net[paste][/paste]minecraft[paste][/paste]item[paste][/paste]ItemReed;public class testSeeds extends ItemReed { public testSeeds(int par1) { super(par1, TestMod[paste][/paste]testPlant); this[paste][/paste]setCreativeTab(CreativeTabs[paste][/paste]tabMaterials); } @Override public void registerIcons(IconRegister par1IconRegister) { this[paste][/paste]itemIcon = par1IconRegister[paste][/paste]registerIcon("testmod:testSeeds"); }}Разберем сий код:
super(par1, TestMod.testPlant); – что выращивают семена.
this.setCreativeTab(CreativeTabs.tabMaterials); – креативная вкладочка.
("testmod:testSeeds"); – текстура.
Ну и в регистры можете добавить строку
Эта строка добавляет дроп с травы
MinecraftForge[paste][/paste]addGrassSeed(new ItemStack(OresPlantsBase[paste][/paste]ironSeeds), 10);10 – редкость выпадания как у пшеницы
Вот так выглядит TestMod.java
package mods[paste][/paste]testmod;import net[paste][/paste]minecraft[paste][/paste]block[paste][/paste]Block;import net[paste][/paste]minecraft[paste][/paste]item[paste][/paste]Item;import net[paste][/paste]minecraft[paste][/paste]item[paste][/paste]ItemStack;import net[paste][/paste]minecraftforge[paste][/paste]common[paste][/paste]MinecraftForge;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]Mod;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]Mod[paste][/paste]Init;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]Mod[paste][/paste]Instance;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]Mod[paste][/paste]PostInit;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]Mod[paste][/paste]PreInit;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]event[paste][/paste]FMLInitializationEvent;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]event[paste][/paste]FMLPostInitializationEvent;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]event[paste][/paste]FMLPreInitializationEvent;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]network[paste][/paste]NetworkMod;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]registry[paste][/paste]GameRegistry;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]registry[paste][/paste]LanguageRegistry;@Mod (modid = "TestMod", name = "Test Mod", version = "0[paste][/paste]1")@NetworkMod (clientSideRequired = true, serverSideRequired = false, versionBounds = "1[paste][/paste]0[paste][/paste]0")public class TestMod { public static Block testPlant = new ironPlant(2040)[paste][/paste]setUnlocalizedName("testPlant"); public static Item testSeeds = new ironSeeds(2041)[paste][/paste]setUnlocalizedName("testSeeds"); @Instance("TestModID")public static TestMod instance;@Initpublic void load(FMLInitializationEvent event){ GameRegistry[paste][/paste]registerBlock(testPlant); LanguageRegistry[paste][/paste]addName(testSeeds, "Iron seeds"); MinecraftForge[paste][/paste]addGrassSeed(new ItemStack(TestMod[paste][/paste]testSeeds), 10);}@PreInitpublic void preLoad(FMLPreInitializationEvent event){}@PostInitpublic void postLoad(FMLPostInitializationEvent event){}}Вот собственно и все – растение готово. Теперь можете сажать вашу алмазную пшеницу на алмазные блоки!
Глава 16. Добавление вещей в данжи, бонусный сундук и т.д.
Скрытый текст
В регистрах пишем:
Все категории в игре на 1.5.2 можно посмотреть в eclipse, просто напишите где-нибудь ChestGenHooks и поставьте точку, вам выдадут все возможные варианты.
(TestMod.testItem) – собственно сам предмет.
10, 30, 1 – минимальный шанс появления, максимальный шанс, максимальное количество в сундуке.
ChestGenHooks[paste][/paste]addItem(ChestGenHooks[paste][/paste]BONUS_CHEST, new WeightedRandomChestContent(new ItemStack(TestMod[paste][/paste]testItem), 10, 30, 1));BONUS_CHEST – категория, куда добавляется ваш предмет.
Все категории в игре на 1.5.2 можно посмотреть в eclipse, просто напишите где-нибудь ChestGenHooks и поставьте точку, вам выдадут все возможные варианты.
(TestMod.testItem) – собственно сам предмет.
10, 30, 1 – минимальный шанс появления, максимальный шанс, максимальное количество в сундуке.
Глава 17. Создание конфиг файла.
Скрытый текст
Все просто.
Если строка создания блока выглядит так:
Прописываем регистры, как в главе про создание блока.
Теперь в самом низу, в preInit пишем:
Так выглядит TestMod.java
Если строка создания блока выглядит так:
public static final Block testBlock = new TestBlock(2020)[paste][/paste]setUnlocalizedName("testBlock");Удаляем все от конца включая =. Но ; оставьте. Теперь запись выглядит так:
public static final Block testBlock;Ниже пишем ID:
public static int testBlockblockID;Там где все регистры пишем удаленную часть из строки создания блока:
testBlock = new TestBlock(testBlockblockID,0)[paste][/paste]setUnlocalizedName("testBlock");Но как вы заметили вместо id пишем уже созданный testBlockblockID.
Прописываем регистры, как в главе про создание блока.
Теперь в самом низу, в preInit пишем:
Configuration config = new Configuration(event[paste][/paste]getSuggestedConfigurationFile());config[paste][/paste]load();//Писать надо только между load и save:testBlockblockID = config[paste][/paste]getBlock("testBlock", 2021)[paste][/paste]getInt();config[paste][/paste]save();Вот собственно и все. С итемом также.
Так выглядит TestMod.java
package mods[paste][/paste]testmod;import net[paste][/paste]minecraft[paste][/paste]block[paste][/paste]Block;import net[paste][/paste]minecraft[paste][/paste]creativetab[paste][/paste]CreativeTabs;import net[paste][/paste]minecraft[paste][/paste]item[paste][/paste]Item;import net[paste][/paste]minecraft[paste][/paste]item[paste][/paste]ItemStack;import net[paste][/paste]minecraftforge[paste][/paste]common[paste][/paste]Configuration;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]Mod;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]Mod[paste][/paste]Init;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]Mod[paste][/paste]Instance;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]Mod[paste][/paste]PostInit;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]Mod[paste][/paste]PreInit;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]event[paste][/paste]FMLInitializationEvent;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]event[paste][/paste]FMLPostInitializationEvent;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]event[paste][/paste]FMLPreInitializationEvent;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]network[paste][/paste]NetworkMod;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]network[paste][/paste]NetworkRegistry;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]registry[paste][/paste]GameRegistry;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]registry[paste][/paste]LanguageRegistry;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]network[paste][/paste]NetworkMod[paste][/paste]SidedPacketHandler;import cpw[paste][/paste]mods[paste][/paste]fml[paste][/paste]common[paste][/paste]SidedProxy;@Mod (modid = "TestMod", name = "Test Mod", version = "0[paste][/paste]0[paste][/paste]1")@NetworkMod (clientSideRequired = true, serverSideRequired = false, versionBounds = "1[paste][/paste]0[paste][/paste]0")public class TestMod {public static Block testBlock ;public static int testBlockblockID;@Instance("TestModID")public static TestModBase instance;@Initpublic void load(FMLInitializationEvent event){testBlock = new TestBlock(testBlockblockID,0)[paste][/paste]setUnlocalizedName("testBlock");GameRegistry[paste][/paste]registerBlock(testBlock);LanguageRegistry[paste][/paste]addName(testBlock, "Test Block");}@PostInitpublic void load(FMLPreInitializationEvent event){}@PreInitpublic void preLoad(FMLPreInitializationEvent event){Configuration config = new Configuration(event[paste][/paste]getSuggestedConfigurationFile());config[paste][/paste]load();testBlockblockID = config[paste][/paste]getBlock("testBlock", 2021)[paste][/paste]getInt();config[paste][/paste]save();}}
Новые главы в разработке...