Что-то как-то все запутанно. Если нужно просто пропатчить один файл, то зачем создавать пакет в Эклипсе?.. Ладно, а ошибка то какая? Может скинешь мне этот мод? Попробую у себя запустить.Скрытый текст
Создание модов для Minecraft
- Авторизуйтесь для ответа в теме
#22 Cyxapuk
- Главные модераторы
- Сообщений: 8706
-
Ник в Minecraft:
Meegoo
Написал 08.03.2014 - 10:10
Декомпильни майнкрафт MCP, в кач-ве воркспейса ставь папку eclipse в mcp, меняй нужный файл. Запускай recompile.bat, а потом reobfuscate.bat. Измененный файл появится, если меня не изменяет память, в bin'е. А вообще, какая версия майнкрафта то?Проблема такова. Надо заменить один из .class'ов майна патченым. Открываю эклипс, создаю базовый пеккедж, в нем класс "загрузчик", создаю пеккедж с точной иерархией от декомпильнутого MCP (net.minecraft.client.gui), создаю там FontRenderer.java, патчу его. Запускаем майн из эклипса - патч работает. Собираю в самостоятельный файл мода - не пашет. Пробовал менять иерархию, и рефакторил под обфусцированый вид, и двигал пакаги туда-сюда, и с джаром колдовал. Нифига. Работал только первый вариант. ЧЯДНТ, и как это исправить.
#23 ubunterro
- Пользователи
- Сообщений: 101
Добытчик дерева
Написал 08.03.2014 - 16:56
if (var4 > 7) { var4 = 15; var3 = 0; }Но для начала, нужно хотя бы заставить работать так (при всех экспериментах оптифайн был выключен), ну а потом каким нибудь образом пропатчить оптифайн (кстати, прошу в этом совета).
http://rghost.ru/52909499
Тут сорцы и 4 варианта jar'а. Первый - собран из работающего в эклипсе варианта. Остальные - двигания, переиминовывания, и прочие извращения. Закинуть
#24 Cyxapuk
- Главные модераторы
- Сообщений: 8706
-
Ник в Minecraft:
Meegoo
#25 rumickon
- Администраторы
- Сообщений: 705
Написал 08.03.2014 - 18:37
#28 NiKolyan
- Пользователи
- Сообщений: 111
Добытчик дерева
- Откуда: Омск
Написал 17.03.2014 - 21:58
#29 battlekruiser
- Пользователи
- Сообщений: 1857
Зачарователь
-
Ник в Minecraft:
battlekruiser - Откуда: С той стороны монитора
Написал 18.03.2014 - 07:52
Добавлено спустя 58 секунд:
Да, и как оно вообще будет работать? С сундуками? С воронками? С трубами из других модов?
Нажми, чтобы узреть мою подпись:
Мой цитатник:
Дай Андрею идею, и он тут же создаст по ней тред.
У рака есть мозги, а у мозга их нету, зато у рака есть мозг!
У тебя там настолько много пространства.зато я создал в голове руку
Таким образом и изобрели пироги.
Сиськи и тортики тесно связанны. Издревле стриптизёрш в торт прятали.Как-то плавно из обсуждения фапанья все перешли в обсуждение тортиков.
Сколько у него хп было?Я замочил лист, на котором надо было писать контрольную
Такие дела, да. А теперь возьми же коробку запятых да расставь по посту своему там, где надо!
#30 NiKolyan
- Пользователи
- Сообщений: 111
Добытчик дерева
- Откуда: Омск
Написал 23.03.2014 - 15:06
#31 umar11
- Пользователи
- Сообщений: 1
Странник
Написал 25.05.2014 - 11:13
Всем доброго времени суток!
Этот учебник предназначен как для новичков, так и для опытных создателей.
Вообще заходите на специальный сайт посвященный моддингу Minecraft. Куча полезного софта, данный учебник и других фич на http://www.mcmodding.ru/
Новичкам рекомендую проходить учебник по главам сверху вниз.
Видео-ролики для видео-обучения:
Канал YouTube: https://www.youtube....er/Petr19980422
Ролики:
Скрытый текстКак создать мод для Minecraft. Forge. 1 часть. Подготовка
https://www.youtube....h?v=TFD52q1lhcc
Как создать мод для MineCraft. Forge. 2 часть. Блок
https://www.youtube....h?v=wieBMW2_DQs
Как создать мод для MineCraft. Forge. 3 часть. Еще про блок
https://www.youtube....h?v=COUQbVqC-xs
Как создать мод для MineCraft. Forge. 4 часть. Создание предмета
https://www.youtube....h?v=NuivHuYulrw
Как создать мод для MineCraft. Forge. 5 часть. Рецепты
https://www.youtube....h?v=s0lk6TmPd5M
Как создать мод для MineCraft. Forge. 6 часть. Готовый мод
https://www.youtube....h?v=LAFwML2bvGo
Как создать мод для MineCraft. Forge. 7 часть. Вкладка в креативе
https://www.youtube....h?v=3ZMXioBPaek
Как создать мод для MineCraft. Forge. 8 часть. Блок с моделью(1)
https://www.youtube....h?v=2JmkS1Z8h54
Как создать мод для MineCraft. Forge. 9 часть. Анимированные текстуры
https://www.youtube....h?v=G-6LmTWFTtM
Как создать мод для MineCraft. Forge. 10 часть. Предмет в данжах. Дроп с травы
https://www.youtube....h?v=u7Reoq3JAPc
Приступим!
Вступление
Скрытый текстИтак, создавать моды можно несколькими способами: с помощью доп. API и без доп. API.
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 во время установки и так несколько раз, то переместите вашу папку в системный диск и попробуйте установить там, мне помогло.
Глава 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.javapackage 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 блок.
Сразу после публикации нашего класса регистрируем блок:
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
Скрытый текстЕсли вы что-то забыли про текстуры и вам неудобно рыться в главе про создание блока в поисках ответа, можете заглянуть сюда.
Путь к текстуре всегда прописывается в файле предмета (будь то блок или итем). Обычно он выглядит так:
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!
Если recompile.bat выдает ошибку
Скрытый текстВ процессе написания учебника я проверяю, работает ли вообще код, который я пишу. И при рекомпиляции, перед reobufscate у меня высветилось куча ошибок с непонятными символами и словами UTF-8. Если у вас возникла та же проблема – не паникуйте. Просто удалите все комментарии из всех файлов мода.
Глава 6. Доп. про блок
Скрытый текстПрежде чем мы приступим к созданию предмета, я хотел бы рассказать про дополнительные свойства блока. В этой главе вы поиграетесь с настройками блока и посмотрим на его основные параметры.
Итак в коде нашего блока (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.блабла.
Приведу сразу весь файл, в котором мы получаем наш блок с помощью верстака, бесформенный крафт и с помощью печки.
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, а выше) пишем такой код:
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 не исключение. Бутерброды, соки, яблочные печеньки – почему нет?
Там же, где мы создавали предмет и блок пишем код:
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. Своя вкладка в креативе
Скрытый текстХотите создать свою вкладку в креативе, чтобы складывать туда свои блоки и итемы.
Все там же, где мы создаем блоки и итемы пишем:
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. Создание своих инструментов
Скрытый текстХочется создать свои инструменты, ну наподобие алмазных или железных? Легко. Для начала нужно создать новый материал для ваших инструментов. Там, где создавали блоки пишем следующее:
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. Создание своей брони
Скрытый текстНо какой комплект инструментов без своего сета брони? Никакой.
Все там же, где мы создавали инструменты пишем:
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 пишем
@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. Туда кидаете мод в архиве (смотрите "Создание готового мода"). Вот и все! Можете подключаться и играть с вашим модом!
Глава 15. Создание своего растения (как пшеница)
Скрытый текстВ этой главе мы создадим собственно растение. Свойства у него будут как у пшеницы.
Итак для начала нужно создать блок 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. Добавление вещей в данжи, бонусный сундук и т.д.
Скрытый текстВ регистрах пишем:
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. Создание конфиг файла.
Скрытый текстВсе просто.
Если строка создания блока выглядит так:
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();}}
Новые главы в разработке...
Сообщение отредактировал Cyxapuk: 25.05.2014 - 13:12
Пункт 5.4
#33 Nordicus666
- Пользователи
- Сообщений: 11
Странник
Написал 09.06.2016 - 15:23
Блоки.. инструменты.. базовая хрень.. зачем все это? да, согласен, можно, но вкратце, я перелистал гайдов 10 по моддингу, все как с одного слизаны, одно и то же, "давайте создадим блок".. "давайте сделаем инструмент.. пусть это будет кирка".. дали бы то, чего действительно нет и не хватает, список событий инструментов, блоков, игрока, мира, да всего, просто список событий майна, список функций, как создавать уникальные итемы, а не стандартные инструменты со своими хар-ми, я вот пытаюсь написать аддон к индастриалу последнему с оружием, пушка теслы, волновое орудие, еще чего нить, но вот как реализовать его? текстурку, да крафт да, я сделал, а дальше все, гайд кончается, а мне нужно событие в предмете когда игрок жмет ПКМ им, мне нужны методы создания молнии, хотя бы, или как определить куда смотрит игрок, что б в том направлении на расстоянии что то делать, я знаю что такое есть, так как добрался (спустя два дня, опять же спасибо недо-гайдерам) до кодов индастрала и таум-крафта, а так же их аддонов, еще сутки сидел читал, но половина функций, методов и полей не расшифровались и соответственно нифига не понятно, на майл вопросах все молчат, так как этим мало кто занимается, так вот вы, ГАЙДЕРЫ блин, создайте полный гайд, а не копируйте чужие! пригорело.отчаявшийся начинающий создатель модов и аддонов
- Поблагодарил: Гладиатор
Количество пользователей, читающих эту тему: 0
0 пользователей, 0 гостей, 0 анонимных