Начало
Блок
Предмет
Броня
Крафт
Сервер
Установите (обновите) java. Скорее всего у вас стоит последняя версия, но предохранится не помешает. http://www.java.com/ru/.
1. Скачайте и установите JDK.
2. Создайте на рабочем столе или где вам удобно папку.
3. Скачайте Eclipse. Скачать.
4. Скачайте Forge (качайте рекомендованный, нам нужен src). Скачать.
Переместите все файлы из скачанного Forge в нашу созданную папку и запустите install.cmd. Этот процесс сам загрузит MCP, все установит и т.д., чем Forge и привлекателен.
Папку с eclipse также переместите на рабочий стол.
Подготовка закончена. Можно приступать к созданию модов!
Если у вас завис Forge во время установки и так несколько раз, то переместите вашу папку в системный диск и попробуйте установить там, мне помогло.
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).
Декомпиляция – процесс преобразования файлов игры в .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 во время установки и так несколько раз, то переместите вашу папку в системный диск и попробуйте установить там, мне помогло.
Итак, вы закончили подготовку и уже хотите создавать моды, ну тогда приступим!
В Package Explorer переходите в папочку src. Вы видите много пакетов. Один (или даже несколько) из них и будет вашим модом. Выделяете src (ЛКМ) и нажимаете ПКМ. В появившемся окошке выбираете New>Package. Появляется окно в котором нам предлагают вбить имя пакета. Имя должно быть в формате assets.что-то.что-то…. Ну тобишь для этого учебника имя пакета будет assets.testmod.src. Название пакета не должно оканчиваться на точку и не должно использовать зарезервированных Java слов (staic,new,private и т.д.). Жмете Finish и у вас, в самом верху появляется ваш белый пакет. Белый, потому что пустой. Исправим положение!
Для начала нам надо создать файл, в котором мы создадим имя, Id и версию нашего мода.
Кликаем ПКМ на наш созданный пакет и выбираем New>Class. Или же выделяем наш пакет и в верхней панели щелкаем по значку буквы c в зеленом кружочке с желтым крестиком справа сверху. Файл назовите как хотите, в нем будят находится константы для нашего мода (подробнее далее). Я назову его ModInfo и вам советую это название. Больше в окне Java Class ничего менять не нужно, кликайте Finish.
Ну вот вы и создали первый файл вашего мода.
Теперь, между скобочками класса ModInfo, который был создан автоматически пишем следующее(приведу весь файл целиком):
Разберем данный код.
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.
Вот тут то и будет происходить все действо.
Пишем в него такой код:
Разберем все по полкам. То, что было разобрано выше (например пакет или класс) разбирать не буду. Только новое!
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.EventHandler;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.event.FMLPostInitializationEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
import cpw.mods.fml.common.event.FMLServerStartingEvent;
Это импорты. Импорт – подключение других пакетов или файлов к нашему файлу. Если вы читали “Технические вещи Eclipse”, то знаете, что импорты можно автоматически добавлять комбинацией клавиш Ctr+Shift+O. Если их удалить, то некоторые слова eclipse выделит как ошибку.
@Mod(modid=ModInfo.MODID, name=ModInfo.NAME, version=ModInfo.VERSION) – тут то, ради чего мы создавали ModInfo.java. Как видите в поля modid,name,version вместо текста в кавычках мы вставили сначала ModInfo, как указатель на созданный файл и после точки имя нашей константы. Компилятор, увидев такую строку просто заменит ее на то, что у нас в ModInfo.
@Mod.Instance(ModInfo.MODID) – также указатель на наш ModInfo.java.
@EventHandler
public void init(FMLInitializationEvent event)
{
}
А здесь будут важные регистры, такие как регистрация блоков и другое важное. Все остальное пока неважно.
Ну вот и все! Вы создали инфо-файл и файл лист. Дальше самое интересное!
В Package Explorer переходите в папочку src. Вы видите много пакетов. Один (или даже несколько) из них и будет вашим модом. Выделяете src (ЛКМ) и нажимаете ПКМ. В появившемся окошке выбираете New>Package. Появляется окно в котором нам предлагают вбить имя пакета. Имя должно быть в формате assets.что-то.что-то…. Ну тобишь для этого учебника имя пакета будет assets.testmod.src. Название пакета не должно оканчиваться на точку и не должно использовать зарезервированных Java слов (staic,new,private и т.д.). Жмете Finish и у вас, в самом верху появляется ваш белый пакет. Белый, потому что пустой. Исправим положение!
Для начала нам надо создать файл, в котором мы создадим имя, Id и версию нашего мода.
Кликаем ПКМ на наш созданный пакет и выбираем New>Class. Или же выделяем наш пакет и в верхней панели щелкаем по значку буквы c в зеленом кружочке с желтым крестиком справа сверху. Файл назовите как хотите, в нем будят находится константы для нашего мода (подробнее далее). Я назову его ModInfo и вам советую это название. Больше в окне Java Class ничего менять не нужно, кликайте Finish.
Ну вот вы и создали первый файл вашего мода.
Теперь, между скобочками класса ModInfo, который был создан автоматически пишем следующее(приведу весь файл целиком):
Код:
package assets.testmod.src;
public class ModInfo {
/*
* ID вашего мода
*/
final static String MODID = "TestMod";
/*
* Имя вашего мода
*/
final static String NAME = "Test Mod";
/*
* Версия вашего мода
*/
final static String VERSION = "1.0.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.
Вот тут то и будет происходить все действо.
Пишем в него такой код:
Код:
package assets.testmod.src;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.EventHandler;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.event.FMLPostInitializationEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
import cpw.mods.fml.common.event.FMLServerStartingEvent;
@Mod(modid=ModInfo.MODID, name=ModInfo.NAME, version=ModInfo.VERSION)
public class TestMod {
@Mod.Instance(ModInfo.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.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.EventHandler;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.event.FMLPostInitializationEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
import cpw.mods.fml.common.event.FMLServerStartingEvent;
Это импорты. Импорт – подключение других пакетов или файлов к нашему файлу. Если вы читали “Технические вещи Eclipse”, то знаете, что импорты можно автоматически добавлять комбинацией клавиш Ctr+Shift+O. Если их удалить, то некоторые слова eclipse выделит как ошибку.
@Mod(modid=ModInfo.MODID, name=ModInfo.NAME, version=ModInfo.VERSION) – тут то, ради чего мы создавали ModInfo.java. Как видите в поля modid,name,version вместо текста в кавычках мы вставили сначала ModInfo, как указатель на созданный файл и после точки имя нашей константы. Компилятор, увидев такую строку просто заменит ее на то, что у нас в ModInfo.
@Mod.Instance(ModInfo.MODID) – также указатель на наш ModInfo.java.
@EventHandler
public void init(FMLInitializationEvent event)
{
}
А здесь будут важные регистры, такие как регистрация блоков и другое важное. Все остальное пока неважно.
Ну вот и все! Вы создали инфо-файл и файл лист. Дальше самое интересное!
В этой главе начнем собственно наполнять наш пока пустой мод контентом, а именно – создадим блок.
Почему создание блока? Потому что его создание самое простое и демонстрирует основные принципы создания модов.
Начнем. Для начала создадим в нашем TestMod.java собственно блок.
Сразу после публикации нашего класса создаем и регистрируем блок:
Почти наверняка Eclipse высветит ошибки. Но мы уже знаем комбинацию клавиш Ctrl+Shift+O и все необходимые файлы, а именно – пакет с данными о блоках импортируются к нам.
Возможно будет выбор – какой пакет импортировать? Берите тот, имя которого начинается на net.minecraft.что-то.
public static final Block testBlock = new TestBlock(2000).setUnlocalizedName(“testBlock”);
testBlock – этакой id в массиве блоков (загляните в Block.java поймете) блока.
TestBlock – файл, который будет называться TestBlock.java (по названию).
2000 – id блока. Всего 4096 id выбирайте что-то в районе 2000 – 4000.
ID ни в коем случае не должны повторяться. Все может пройти и запуститься, но проблемы в игре неизбежны!
GameRegistry.registerBlock(testBlock);
LanguageRegistry.addName(testBlock, “Test Block”);
Тут проблем возникнуть не должно.
Первая строка регистрирует блок в игре, а вторая дает ему имя в игре.
В итоге наш TestMod должен выглядеть так:
Теперь создаем файл TestBlock.java и пишем в него следующее:
Тут все просто и описано в комментариях.
Единственная загвоздка – текстура.
Сразу прошу заметить вызов нашего ModInfo.java с константой MODID. testBlock это имя текстуры (testBlock.png). Так куда же ее кидать?
Все просто идите по пути ваша созданная папка>mcp>src>minecraft>assets>testmod и создаете тут папку textures(так и только с таким именем), а внутри нее создаете папку blocks(тоже только с таким именем!) ну и кидаете туда вашу текстуру (testBlock.png).
С версии 1.5.2 Minecraft поддерживает квадратные текстуры абсолютно любого разрешения. По крайней мере от 16×16 до 512×512 точно. Так что можете создавать блок с супер четкой текстурой.
Вот и все.
Почему создание блока? Потому что его создание самое простое и демонстрирует основные принципы создания модов.
Начнем. Для начала создадим в нашем TestMod.java собственно блок.
Сразу после публикации нашего класса создаем и регистрируем блок:
Код:
public class TestMod {
public static final Block testBlock = new TestBlock(2000).setUnlocalizedName("testBlock");
@Mod.Instance(ModInfo.MODID)
public static TestMod mod;
@EventHandler
public void preInit(FMLPreInitializationEvent event)
{
}
@EventHandler
public void init(FMLInitializationEvent event)
{
GameRegistry.registerBlock(testBlock);
LanguageRegistry.addName(testBlock, "Test Block");
}
@EventHandler
public void postInit(FMLPostInitializationEvent event)
{
}
@EventHandler
public void serverStarting(FMLServerStartingEvent event)
{
}
Возможно будет выбор – какой пакет импортировать? Берите тот, имя которого начинается на net.minecraft.что-то.
public static final Block testBlock = new TestBlock(2000).setUnlocalizedName(“testBlock”);
testBlock – этакой id в массиве блоков (загляните в Block.java поймете) блока.
TestBlock – файл, который будет называться TestBlock.java (по названию).
2000 – id блока. Всего 4096 id выбирайте что-то в районе 2000 – 4000.
ID ни в коем случае не должны повторяться. Все может пройти и запуститься, но проблемы в игре неизбежны!
GameRegistry.registerBlock(testBlock);
LanguageRegistry.addName(testBlock, “Test Block”);
Тут проблем возникнуть не должно.
Первая строка регистрирует блок в игре, а вторая дает ему имя в игре.
В итоге наш TestMod должен выглядеть так:
Код:
package assets.testmod.src;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.EventHandler;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.event.FMLPostInitializationEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
import cpw.mods.fml.common.event.FMLServerStartingEvent;
@Mod(modid=ModInfo.MODID, name=ModInfo.NAME, version=ModInfo.VERSION)
public class TestMod {
public static final Block testBlock = new TestBlock(2000).setUnlocalizedName("testBlock");
@Mod.Instance(ModInfo.MODID)
public static TestMod mod;
@EventHandler
public void preInit(FMLPreInitializationEvent event)
{
}
@EventHandler
public void init(FMLInitializationEvent event)
{
GameRegistry.registerBlock(testBlock);
LanguageRegistry.addName(testBlock, "Test Block");
}
@EventHandler
public void postInit(FMLPostInitializationEvent event)
{
}
@EventHandler
public void serverStarting(FMLServerStartingEvent event)
{
}
}
Код:
package assets.testmod.src;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.client.renderer.texture.IconRegister;
import net.minecraft.creativetab.CreativeTabs;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
public class TestBlock extends Block
{
protected TestBlock(int par1)
{
super(par1, Material.ground); // Материал
this.setCreativeTab(CreativeTabs.tabBlock); // Таблица в креативе
/*
* Текстура
*/
setTextureName(ModInfo.MODID.toLowerCase() + ":testBlock");
}
}
Единственная загвоздка – текстура.
Сразу прошу заметить вызов нашего ModInfo.java с константой MODID. testBlock это имя текстуры (testBlock.png). Так куда же ее кидать?
Все просто идите по пути ваша созданная папка>mcp>src>minecraft>assets>testmod и создаете тут папку textures(так и только с таким именем), а внутри нее создаете папку blocks(тоже только с таким именем!) ну и кидаете туда вашу текстуру (testBlock.png).
С версии 1.5.2 Minecraft поддерживает квадратные текстуры абсолютно любого разрешения. По крайней мере от 16×16 до 512×512 точно. Так что можете создавать блок с супер четкой текстурой.
Вот и все.
Прежде чем мы приступим к созданию предмета, я хотел бы рассказать про дополнительные свойства блока. В этой главе вы поиграетесь с настройками блока и посмотрим на его основные параметры.
Итак в коде нашего блока (TestBlock.java (или ваш блок)) обратим внимание на строчку
super(par1, Material.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.setCreativeTab(CreativeTabs.tabBlock); // Таблица в креативе
Тут то мы и указываем основные свойства. В данной строке блок добавляется в креативную таблицу в игре. Таблица указывается после точки. Если вы также сотрете ее название и точку, а потом поставите ее снова, то у вас выскочит список всех таблиц. Также привожу их список.
tabAllSearch – вкладка со всеми предметами
tabBlock – вкладка “Блоки”
tabBrewing – компоненты для зелий
tabCombat – вкладка “Оружие”
tabDecorations – вкладка “Декоративные блоки”
tabFood – вкладка “Еда”
tabMaterials – вкладка “Материалы”
tabMisc – вкладка “Разное”
tabRedstone – вкладка “Механизмы”
tabTools – вкладка “Инструменты”
tabTransport – вкладка “Транспортирующие”
Можете добавлять свои this'ы. Вот пример основных параметров для блока.
{
super(par1, Material.ground);
this.setCreativeTab(CreativeTabs.tabBlock);
this.setHardness(1.0F);
this.setLightValue(1.0F);
this.setResistance(3.0F);
this.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.addName(testBlock, EnumChatFormatting.AQUA + “Test Block”);
Нажмите точку после EnumChatFormatting и вы увидите все доступные цвета.
Итак в коде нашего блока (TestBlock.java (или ваш блок)) обратим внимание на строчку
super(par1, Material.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.setCreativeTab(CreativeTabs.tabBlock); // Таблица в креативе
Тут то мы и указываем основные свойства. В данной строке блок добавляется в креативную таблицу в игре. Таблица указывается после точки. Если вы также сотрете ее название и точку, а потом поставите ее снова, то у вас выскочит список всех таблиц. Также привожу их список.
tabAllSearch – вкладка со всеми предметами
tabBlock – вкладка “Блоки”
tabBrewing – компоненты для зелий
tabCombat – вкладка “Оружие”
tabDecorations – вкладка “Декоративные блоки”
tabFood – вкладка “Еда”
tabMaterials – вкладка “Материалы”
tabMisc – вкладка “Разное”
tabRedstone – вкладка “Механизмы”
tabTools – вкладка “Инструменты”
tabTransport – вкладка “Транспортирующие”
Можете добавлять свои this'ы. Вот пример основных параметров для блока.
{
super(par1, Material.ground);
this.setCreativeTab(CreativeTabs.tabBlock);
this.setHardness(1.0F);
this.setLightValue(1.0F);
this.setResistance(3.0F);
this.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.addName(testBlock, EnumChatFormatting.AQUA + “Test Block”);
Нажмите точку после EnumChatFormatting и вы увидите все доступные цвета.
Чтобы создать дроп с блока или моба, то пропишите такой код:
Разберем:
Item – файл, где создан дроп (все предметы стандартного майна находятся в Item.java, все блоки – в Block.java, ну а ваши блоки и предметы могут находится, к примеру, в TestMod.java, так и пишите без .java название файла, где создан контент).
appleGold – собственно текстовый id вашего предмета.
.itemID – или blockID – в зависимости от блока.
Вот и все! (И не забудьте импортировать пакеты (Ctrl+Shift+O)).
Код:
public int idDropped(int par1, Random par2Random, int par3)
{
return Item.appleGold.itemID;
}
Item – файл, где создан дроп (все предметы стандартного майна находятся в Item.java, все блоки – в Block.java, ну а ваши блоки и предметы могут находится, к примеру, в TestMod.java, так и пишите без .java название файла, где создан контент).
appleGold – собственно текстовый id вашего предмета.
.itemID – или blockID – в зависимости от блока.
Вот и все! (И не забудьте импортировать пакеты (Ctrl+Shift+O)).
После того, как вы создали блок, было бы круто сделать так, чтобы он генерировался в мире!
Сделать это легко. В Регистрах пишем:
GameRegistry.registerWorldGenerator(new TestBlockGenerator());
Ну собственно регистрируем файл генератор. Наводим на TestBlockGenerator(), и в выпадающем списке создаем класс TestBlockGenerator. Внутри пишем:
Верхняя часть файла вам не нужна. Обратите внимание на три пустых метода (см. Самоучитель Java): generateNether, generateSurface, generateEnd – это собственно измерения, где блок будет генериться. В generateSurface у нас есть цикл, который и является по сути генератором. (int i = 0; i < 30; i++) 30 – собственно частота генерации.
int randPosY = rand.nextInt(64); – 64 – высота, до которой генерируется ваш блок
(TestMod.blockTest.blockID, 10) – какой блок генерируется и сколько блоков в жиле.
Вот так выглядит TestMod.java:
Сделать это легко. В Регистрах пишем:
GameRegistry.registerWorldGenerator(new TestBlockGenerator());
Ну собственно регистрируем файл генератор. Наводим на TestBlockGenerator(), и в выпадающем списке создаем класс TestBlockGenerator. Внутри пишем:
Код:
package assets.testmod.src;
import java.util.Random;
import net.minecraft.world.World;
import net.minecraft.world.chunk.IChunkProvider;
import net.minecraft.world.gen.feature.WorldGenMinable;
import cpw.mods.fml.common.IWorldGenerator;
public class TestBlockGenerator implements IWorldGenerator {
@Override
public void generate(Random random, int chunkX, int chunkZ, World world, IChunkProvider chunkGenerator, IChunkProvider chunkProvider) {
switch(world.provider.dimensionId) {
case -1:
generateNether();
break;
case 0:
generateSurface(world, random, chunkX*16, chunkZ*16);
break;
case 1:
generateEnd();
break;
}
}
public void generateNether() {
//were not doing ore ore in the nether
}
public void generateSurface(World world, Random rand, int chunkX, int chunkZ) {
for (int i = 0; i < 30; i++) {
int randPosX = chunkX + rand.nextInt(16);
int randPosY = rand.nextInt(64);
int randPosZ = chunkZ + rand.nextInt(16);
(new WorldGenMinable(TestMod.blockTest.blockID, 10)).generate(world, rand,
randPosX, randPosY, randPosZ);
}
}
public void generateEnd() {
//were not going to generate in the end either
}
}
int randPosY = rand.nextInt(64); – 64 – высота, до которой генерируется ваш блок
(TestMod.blockTest.blockID, 10) – какой блок генерируется и сколько блоков в жиле.
Вот так выглядит TestMod.java:
Код:
package assets.testmod.src;
import net.minecraft.block.Block;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.EventHandler;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.registry.GameRegistry;
import cpw.mods.fml.common.registry.LanguageRegistry;
@Mod(modid=ModInfo.MODID, name=ModInfo.MODNAME, version=ModInfo.MODVERSION)
public class TestMod {
@Mod.Instance(ModInfo.MODID)
public static TestMod testmod;
public static final Block blockTest = new BlockTest(3000).setUnlocalizedName("blockTest");
@EventHandler
public void init(FMLInitializationEvent event)
{
GameRegistry.registerBlock(blockTest);
LanguageRegistry.addName(blockTest, "Test Block");
GameRegistry.registerWorldGenerator(new TestBlockGenerator());
}
}
В этом уроке я расскажу вам, как сломать ваш блок СВОЕЙ киркой.
Добавьте в регистры такую строку:
MinecraftForge.setBlockHarvestLevel(blockTest, “pickaxe”, 3);
Разберем:
blockTest – то, что находится после pubic static Block
“pickaxe” – на что взаимодействует (axe – топор, spade – лопата, pickaxe – кирка, hoe – тяпка)
3 – этакой левел разрушения блока. Если вы загляните в EnumToolMaterial.java, то увидите что у каждого материала первая цифра от 0 до 3. 3 у EMERLAND, а 0 у WOOD и GOLD. Я думаю вы уже догадались. Если мы поставим 0, то блок будет ломать любая кирка. Если вы поставить 4, то только кирка с вашим материалом будет ломать этот блок. Ну а если 3, то только алмазная кирка. Внимание! serHardness – скорость разрушения блока влияет только на скорость, но не на добываемость!
Так выглядит TestMod.java :
Добавьте в регистры такую строку:
MinecraftForge.setBlockHarvestLevel(blockTest, “pickaxe”, 3);
Разберем:
blockTest – то, что находится после pubic static Block
“pickaxe” – на что взаимодействует (axe – топор, spade – лопата, pickaxe – кирка, hoe – тяпка)
3 – этакой левел разрушения блока. Если вы загляните в EnumToolMaterial.java, то увидите что у каждого материала первая цифра от 0 до 3. 3 у EMERLAND, а 0 у WOOD и GOLD. Я думаю вы уже догадались. Если мы поставим 0, то блок будет ломать любая кирка. Если вы поставить 4, то только кирка с вашим материалом будет ломать этот блок. Ну а если 3, то только алмазная кирка. Внимание! serHardness – скорость разрушения блока влияет только на скорость, но не на добываемость!
Так выглядит TestMod.java :
Код:
package assets.testmod.src;
import net.minecraftforge.common.MinecraftForge;
import assets.testmod.src.block.BlockList;
import assets.testmod.src.item.ItemList;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.EventHandler;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.registry.GameRegistry;
import cpw.mods.fml.common.registry.LanguageRegistry;
@Mod(modid=ModInfo.MODID, name=ModInfo.MODNAME, version=ModInfo.MODVERSION)
public class TestMod {
@Mod.Instance(ModInfo.MODID)
public static TestMod testmod;
public static final Block blockTest = new TestBlock(3000).setUnlocalizedName("blockTest");
@EventHandler
public void init(FMLInitializationEvent event)
{
GameRegistry.registerBlock(blockTest);
LanguageRegistry.addName(blockTest, "Block TEST");
MinecraftForge.setBlockHarvestLevel(blockTest, "pickaxe", 3);
}
}
Создать для блока разностороннюю текстуру легко. В файле BlockTest.java пишем следующее:
Вот и все. В папку blocks кидаем 4 текстуры, которые и будут отображаться на вашем блоке.
Код:
package assets.testmod.src;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.client.renderer.texture.IconRegister;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.util.Icon;
public class BlockTest extends Block {
private Icon front, side, top, bottom;
public BlockTest(int par1) {
super(par1, Material.rock);
this.setCreativeTab(CreativeTabs.tabBlock);
}
public void registerIcons(IconRegister register)
{
front = register.registerIcon(ModInfo.MODID + ":testFront");
bottom = register.registerIcon(ModInfo.MODID + ":testBottom");
side = register.registerIcon(ModInfo.MODID + ":testSide");
top = register.registerIcon(ModInfo.MODID + ":testTop");
}
@Override
public Icon getIcon(int side, int meta)
{
return side == 1 ? this.top : (side == 0 ? this.bottom : (meta == 2 && side == 2 ? this.front : (meta == 3 && side == 5 ? this.front : (meta == 0 && side == 3 ? this.front : (meta == 1 && side == 4 ? this.front : this.side)))));
}
}
В файле блока пишем:
Разберем сий код:
onBlockClicked – метод, выполняющийся, когда игрок бьет по блоку.
par5EntityPlayer.addPotionEffect(new PotionEffect(EffectId, Time, Power));
EffectId – Id эффекта (http://minecraft-ru.gamepedia.com/Эффекты_зелий)
Time – время действия в тиках (1 секунда = 20 тиков)
Power – сила эффекта
Код:
@Override
public void onBlockClicked(World par1World, int par2, int par3, int par4, EntityPlayer par5EntityPlayer)
{
par5EntityPlayer.addPotionEffect(new PotionEffect(EffectId, Time, Power));
}
onBlockClicked – метод, выполняющийся, когда игрок бьет по блоку.
par5EntityPlayer.addPotionEffect(new PotionEffect(EffectId, Time, Power));
EffectId – Id эффекта (http://minecraft-ru.gamepedia.com/Эффекты_зелий)
Time – время действия в тиках (1 секунда = 20 тиков)
Power – сила эффекта
Вам когда-нибудь было интересно, как работает портал в ад с технической точки зрения? Никогда не заглядывали в BlockPortal.java? А зря, но не беда, так как сейчас я расскажу все, что смог оттуда вытянуть.
Начнем с самого простого – при щелчке по блоку заменить его на другой блок.
В файле блока напишите такой код:
onBlockActivated – при клике правой кнопкой
World par1World – переменная типа World (для работы с миром)
int par2, int par3, int par4 – x,y,z
EntityPlayer par5EntityPlayer – переменная типа EntityPlayer (для работы с игроком)
par1World.setBlock(par2, par3, par4, Block.blockDiamond.blockID); – поставить алмазный блок в точку 0,0,0 (то есть заменить блок, на который кликали).
Теперь, при правом щелчке по блоку, он исчезнет и вместо него появится алмазный блок!
Но это только начало магии.
Чтобы позиционировать создаваемый новый блок относительно того, по которому кликали (0,0,0), надо просто прибавлять значения к par2, par3, par4.
Например следующий код создаст алмазный блок справа от блока, по которому кликали (и он не исчезнет).
На этом с методом onBlockActivated можно закончить. Он себя исчерпал (дальше только ваша фантазия). А я перехожу дальше – Условие.
Теперь, сделаем так, чтобы наш тестовый блок превращался в алмазный, если его поджечь!
Пишем сей код:
У нас идет проверка, что сверху есть огонь и преобразование нашего блока в алмазный, если он огонь присутствует.
На этом с мультиблочными структурами пока все. Возможно дальше буду развивать эту тему, а если не терпится, загляните в BlockPortal.java
Начнем с самого простого – при щелчке по блоку заменить его на другой блок.
В файле блока напишите такой код:
Код:
public boolean onBlockActivated(World par1World, int par2, int par3, int par4, EntityPlayer par5EntityPlayer, int par6, float par7, float par8, float par9)
{
par1World.setBlock(par2, par3, par4, Block.blockDiamond.blockID);
return true;
}
World par1World – переменная типа World (для работы с миром)
int par2, int par3, int par4 – x,y,z
EntityPlayer par5EntityPlayer – переменная типа EntityPlayer (для работы с игроком)
par1World.setBlock(par2, par3, par4, Block.blockDiamond.blockID); – поставить алмазный блок в точку 0,0,0 (то есть заменить блок, на который кликали).
Теперь, при правом щелчке по блоку, он исчезнет и вместо него появится алмазный блок!
Но это только начало магии.
Чтобы позиционировать создаваемый новый блок относительно того, по которому кликали (0,0,0), надо просто прибавлять значения к par2, par3, par4.
Например следующий код создаст алмазный блок справа от блока, по которому кликали (и он не исчезнет).
Код:
public boolean onBlockActivated(World par1World, int par2, int par3, int par4, EntityPlayer par5EntityPlayer, int par6, float par7, float par8, float par9)
{
par1World.setBlock(par2+1, par3, par4, Block.blockDiamond.blockID);
return true;
}
Теперь, сделаем так, чтобы наш тестовый блок превращался в алмазный, если его поджечь!
Пишем сей код:
Код:
public void randomDisplayTick(World par1World, int par2, int par3, int par4, Random par5Random)
{
if(par1World.getBlockId(par2, par3+1, par4) == Block.fire.blockID)
{
par1World.setBlock(par2, par3, par4, Block.blockDiamond.blockID);
}
}
На этом с мультиблочными структурами пока все. Возможно дальше буду развивать эту тему, а если не терпится, загляните в BlockPortal.java
Работаем мы с BlockTest.java
Пишем этот код внутрь:
Теперь вы можете проходить сквозь ваш блок. Теперь под этим кодом напишите:
Сейчас наш блок станет полностью прозрачным. Но он все еще выделяется и находясь в нем невозможно работать с другими блоками.
Этот код уберет черные полоски выделения да и вообще блок как бы будет, но взаимодействовать с ним нельзя так как грубо говоря материально го уже не будет (но вот он сможет воздействовать на вас).
Собственно газ уже готов. Теперь добавим ему убийственные свойства.
Готово, теперь находясь в этом блоке вы будете получать урон! Убийственный газ готов!
Помните, что вы не можете использовать методы воздействия на блок (можете но не сможете их реализовать в игре, так как его там грубо говоря нет), такие как onBlockClick, onBlockActivated и т.д. Можете использовать только воздействие блока на вас – onEntityCollidedWithBlock, onEntityWalking и другие.
Пишем этот код внутрь:
Код:
public AxisAlignedBB getCollisionBoundingBoxFromPool(World par1World, int par2, int par3, int par4)
{
return null;
}
public boolean isOpaqueCube()
{
return false;
}
public boolean renderAsNormalBlock()
{
return false;
}
Код:
public int getRenderType()
{
return 8;
}
Код:
public void setBlockBoundsBasedOnState(IBlockAccess par1IBlockAccess, int par2, int par3, int par4)
{
float f = 0.0000F;
this.setBlockBounds(0.0F, 0.0F, 0.0F, 0.0F, f, 0.0F);
}
Собственно газ уже готов. Теперь добавим ему убийственные свойства.
Код:
public void onEntityCollidedWithBlock(World par1World, int par2, int par3, int par4, Entity par5Entity)
{
par5Entity.attackEntityFrom(DamageSource.cactus, 1.0F);
}
Помните, что вы не можете использовать методы воздействия на блок (можете но не сможете их реализовать в игре, так как его там грубо говоря нет), такие как onBlockClick, onBlockActivated и т.д. Можете использовать только воздействие блока на вас – onEntityCollidedWithBlock, onEntityWalking и другие.
В этой главе создадим простейший предмет.
Там же, где мы создавали блок (не GameRegistry, а выше) пишем такой код:
public static Item testItem = new TestItem(2021).setUnlocalizedName(“testItem”);
Скорее всего, он выведет ошибку. Добавляем необходимые импорты (Ctrl+Shift+O) и ошибка исчезает.
Ну а там, где у нас все регистрации пишем строчку, которая дает нашему итему имя в игре.
LanguageRegistry.addName(testItem, “Test Item”);
В итоге, мой TestMod.java будет выглядеть таким образом:
У нас все равно остается одна ошибка TestItem, но это из за того, как вы уже поняли, что отсутствует файл TestItem.java. Наводим мышкой на ошибку и у нас появляется в выпадающем меню предложение создать этот файл.
Код у него такой:
Если вы проходили главу про создание блока и главу “доп про блок”, то вам все станет понятно.
Чтобы у вас появилась текстура вашего итема, вам в папке textures (см. создание блока) надо создать папку items. Получается у вас в textures будет две папки – blocks items. Имена должны быть строго такими. И в items должна лежать текстура с именем testItem.png (.setUnlocalizedName).
Вот собственно и все.
Там же, где мы создавали блок (не GameRegistry, а выше) пишем такой код:
public static Item testItem = new TestItem(2021).setUnlocalizedName(“testItem”);
Скорее всего, он выведет ошибку. Добавляем необходимые импорты (Ctrl+Shift+O) и ошибка исчезает.
Ну а там, где у нас все регистрации пишем строчку, которая дает нашему итему имя в игре.
LanguageRegistry.addName(testItem, “Test Item”);
В итоге, мой TestMod.java будет выглядеть таким образом:
Код:
package assets.testmod.src;
import net.minecraft.item.Item;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.EventHandler;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.registry.GameRegistry;
import cpw.mods.fml.common.registry.LanguageRegistry;
@Mod(modid=ModInfo.MODID, name=ModInfo.MODNAME, version=ModInfo.MODVERSION)
public class TestMod {
public static Item testItem = new TestItem(3200).setUnlocalizedName("testItem");
@Mod.Instance(ModInfo.MODID)
public static TestMod testmod;
@EventHandler
public void init(FMLInitializationEvent event)
{
LanguageRegistry.addName(testItem, "Test Item");
}
}
Код у него такой:
Код:
package assets.testmod.src;
import net.minecraft.item.Item;
import net.minecraft.client.renderer.texture.IconRegister;
import net.minecraft.creativetab.CreativeTabs;
public class TestItem extends Item
{
public TestItem(int par1)
{
super(par1);
this.setCreativeTab(CreativeTabs.tabTools);
}
@Override
public void registerIcons(IconRegister par1IconRegister)
{
this.itemIcon = par1IconRegister.registerIcon(ModInfo.MODID + ":testItem");
}
}
Чтобы у вас появилась текстура вашего итема, вам в папке textures (см. создание блока) надо создать папку items. Получается у вас в textures будет две папки – blocks items. Имена должны быть строго такими. И в items должна лежать текстура с именем testItem.png (.setUnlocalizedName).
Вот собственно и все.
Мы все хотим и любим есть. И главный герой в Minecraft не исключение. Бутерброды, соки, яблочные печеньки – почему нет?
Там же, где мы создавали предмет и блок пишем код:
public static Item testFood = new TestFood(2022, 1, 0.4F, false).setUnlocalizedName(“testFood”);
1 – количество восстанавливаемых полу-сердец. 1 = 0.5 сердца.
0.4F – на сколько утоляет голод
false – можно ли этой едой приручить волка (true – да, false – нет)
Так выглядит наш файл TestMod.java:
Создаем файл TestFood.java:
maxStackSize = 64 – сколько предметов может быть в стаке
Там же, где мы создавали предмет и блок пишем код:
public static Item testFood = new TestFood(2022, 1, 0.4F, false).setUnlocalizedName(“testFood”);
1 – количество восстанавливаемых полу-сердец. 1 = 0.5 сердца.
0.4F – на сколько утоляет голод
false – можно ли этой едой приручить волка (true – да, false – нет)
Так выглядит наш файл TestMod.java:
Код:
package assets.testmod.src;
import net.minecraft.item.Item;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.EventHandler;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.registry.GameRegistry;
import cpw.mods.fml.common.registry.LanguageRegistry;
@Mod(modid=ModInfo.MODID, name=ModInfo.MODNAME, version=ModInfo.MODVERSION)
public class TestMod {
public static Item testFood = new TestFood(2022, 1, 0.4F, false).setUnlocalizedName("testFood");
@Mod.Instance(ModInfo.MODID)
public static TestMod testmod;
@EventHandler
public void init(FMLInitializationEvent event)
{
LanguageRegistry.addName(testFood, "Test Item");
}
}
Код:
package assets.testmod.src;
import net.minecraft.client.renderer.texture.IconRegister;
import net.minecraft.item.ItemFood;
public class TestFood extends ItemFood
{
public TestFood(int par1, int par2, float par3, boolean par4)
{
super(par1, par2, par4);
maxStackSize = 64;
}
@Override
public void registerIcons(IconRegister par1IconRegister)
{
this.itemIcon = par1IconRegister.registerIcon(ModInfo.MODID + “:testFood”);
}
}
Итак многие, а может и не многие ждали этой главы. Она посвящена созданию своего меча. Следующая глава будет посвящена созданию инструментов. Я решил разнообразить процесс и создавать мы будем не testSword, а биту. Да да именно биту!
Что ж приступим. Там, где мы создавали блоки и предметы пишет две следующие строчки:
public static EnumToolMaterial BATTOOLMATERIAL = EnumHelper.addToolMaterial(“BAT”, 4, 150, 5, 0, 10);
public static final Item bat = new Bat(3000).setUnlocalizedName(“bat”);
Первая строка создает новый материал. Разберем:
“BAT” – собственно материал
4 – типо id мода. Следовательно следующий материал будет иметь id 5 и т.д.
150 – количество использований
5 – количество отнимаемых полу-сердечек
10 – зачаровываемость
Там где у нас все регистры пишем:
LanguageRegistry.addName(bat, “Bat”);
Наш TestMod стал выглядеть так:
Теперь наводим на ошибку, высвечивающуюся под словом Bat, или просто создайте класс Bat.
Внутри пишем:
Как видите – все точно также как и с обычным предметом, только он наследует класс ItemSword, а не Item.
TestMod.BATTOOLMATERIAL – тут собственно наш материал
Дальше идет количество предметов в стаке и добавление во вкладку Combat.
Текстуру кидаем в папку items, которую мы создали в прошлом уроке (testmod>textures>items>bat.png).
Что ж приступим. Там, где мы создавали блоки и предметы пишет две следующие строчки:
public static EnumToolMaterial BATTOOLMATERIAL = EnumHelper.addToolMaterial(“BAT”, 4, 150, 5, 0, 10);
public static final Item bat = new Bat(3000).setUnlocalizedName(“bat”);
Первая строка создает новый материал. Разберем:
“BAT” – собственно материал
4 – типо id мода. Следовательно следующий материал будет иметь id 5 и т.д.
150 – количество использований
5 – количество отнимаемых полу-сердечек
10 – зачаровываемость
Там где у нас все регистры пишем:
LanguageRegistry.addName(bat, “Bat”);
Наш TestMod стал выглядеть так:
Код:
package assets.testmod.src;
import net.minecraft.block.Block;
import net.minecraft.item.EnumToolMaterial;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraftforge.common.EnumHelper;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.EventHandler;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.registry.GameRegistry;
import cpw.mods.fml.common.registry.LanguageRegistry;
@Mod(modid=ModInfo.MODID, name=ModInfo.MODNAME, version=ModInfo.MODVERSION)
public class TestMod {
public static final EnumToolMaterial BATTOOLMATERIAL = EnumHelper.addToolMaterial("BAT", 4, 150, 5, 0, 10);
public static final Item bat = new Bat(3000).setUnlocalizedName("bat");
@Mod.Instance(ModInfo.MODID)
public static TestMod testmod;
@EventHandler
public void init(FMLInitializationEvent event)
{
LanguageRegistry.addName(bat, "Bat");
}
}
Внутри пишем:
Код:
package assets.testmod.src;
import net.minecraft.client.renderer.texture.IconRegister;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.ItemSword;
public class Bat extends ItemSword {
public Bat(int par1)
{
super(par1, TestMod.BATTOOLMATERIAL);
this.maxStackSize = 2;
this.setCreativeTab(CreativeTabs.tabCombat);
}
@Override
public void registerIcons(IconRegister par1IconRegister)
{
this.itemIcon = par1IconRegister.registerIcon(ModInfo.MODID + ":bat");
}
}
TestMod.BATTOOLMATERIAL – тут собственно наш материал
Дальше идет количество предметов в стаке и добавление во вкладку Combat.
Текстуру кидаем в папку items, которую мы создали в прошлом уроке (testmod>textures>items>bat.png).
В прошлой главе мы создали биту. Теперь пришло время создать все остальное. Я покажу создание инструментов только на топоре, так как для всех остальных создание идентичное.
Приступим. Создадим новый материал взамен старого:
public static final EnumToolMaterial TEST = EnumHelper.addToolMaterial(“TEST”, 4, 2000, 10.0F, 5.0F, 10);
Разберем:
“TEST” – имя материала
4 – пробиваемость блоков
2000 – количество использований
10.0F – эффективность (скорость разрушения блоков)
5.0F – урон
10 – зачаровываемость
Создаем топор:
public static final Item testAxe = new TestAxe(3000).setUnlocalizedName(“testAxe”);
Так выглядит наш TestMod.java:
Теперь создаем файл TestAxe.java и пишем в него следующее:
super(par1, TestMod.TEST); – наш материал
Ну и текстуру кладете в папку items. Вот собственно и все. Все остальные предметы создавайте также, только вместо extends ItemAxe пишите ItemSword, ItemSpand(Лопата) ItemHoe(Тяпка), ItemPickaxe(Кирка). При необходимости можете написать под super this. и пошарить по свойствам – добавить что-то свое.
Приступим. Создадим новый материал взамен старого:
public static final EnumToolMaterial TEST = EnumHelper.addToolMaterial(“TEST”, 4, 2000, 10.0F, 5.0F, 10);
Разберем:
“TEST” – имя материала
4 – пробиваемость блоков
2000 – количество использований
10.0F – эффективность (скорость разрушения блоков)
5.0F – урон
10 – зачаровываемость
Создаем топор:
public static final Item testAxe = new TestAxe(3000).setUnlocalizedName(“testAxe”);
Так выглядит наш TestMod.java:
Код:
package assets.testmod.src;
import net.minecraft.block.Block;
import net.minecraft.item.EnumToolMaterial;
import net.minecraft.item.Item;
import net.minecraftforge.common.EnumHelper;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.EventHandler;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.registry.GameRegistry;
import cpw.mods.fml.common.registry.LanguageRegistry;
@Mod(modid=ModInfo.MODID, name=ModInfo.MODNAME, version=ModInfo.MODVERSION)
public class TestMod {
public static final EnumToolMaterial TEST = EnumHelper.addToolMaterial("TEST", 4, 2000, 10.0F, 5.0F, 10);
public static final Item testAxe = new TestAxe(3000).setUnlocalizedName("testAxe");
@Mod.Instance(ModInfo.MODID)
public static TestMod testmod;
@EventHandler
public void init(FMLInitializationEvent event)
{
LanguageRegistry.addName(testAxe, "Test axe");
}
}
Код:
package assets.testmod.src;
import net.minecraft.client.renderer.texture.IconRegister;
import net.minecraft.item.ItemAxe;
public class TestAxe extends ItemAxe {
public TestAxe(int par1) {
super(par1, TestMod.TEST);
}
@Override
public void registerIcons(IconRegister par1IconRegister)
{
this.itemIcon = par1IconRegister.registerIcon(ModInfo.MODID + ":testAxe");
}
}
Ну и текстуру кладете в папку items. Вот собственно и все. Все остальные предметы создавайте также, только вместо extends ItemAxe пишите ItemSword, ItemSpand(Лопата) ItemHoe(Тяпка), ItemPickaxe(Кирка). При необходимости можете написать под super this. и пошарить по свойствам – добавить что-то свое.
В файле итема пишем:
Теперь при нажатии на ПКМ, будет выполняться <<какой-то код>>. Это может быть, например, наложение каких-то эффектов на игрока:
Этот код наложит на вас эффект дыхания под водой.
Тут можно задать любой код, на Ваше усмотрение. Все зависит от Вашей фантазии <img src="http://forum.mcmodding.ru/img/smilies/nomicons/smile.png" width="20" alt="nomicons/smile">
Код:
public ItemStack onItemRightClick(ItemStack is, World world, EntityPlayer player)
{
<<Какой-то код>>
return is;
}
Код:
player.addPotionEffect(new PotionEffect(Potion.waterBreathing.id, 20, 20));
Тут можно задать любой код, на Ваше усмотрение. Все зависит от Вашей фантазии <img src="http://forum.mcmodding.ru/img/smilies/nomicons/smile.png" width="20" alt="nomicons/smile">
Для начала создаем собственный материал для брони (также как и для инструментов) :
Разберем:
TESTARMORMATERIAL – собственно Id материала для брони
1000 – поглощаемый урон
{5, 20, 10, 5} – уровень брони на каждую ее часть (шлем, грудь, штаны, ботинки)
10 – зачаровываемость
Теперь создаем всю броню разом (привожу сразу весь TestMod.java):
Вам остается только создать 4 файла: TestHelmet.java, TestChest.java, TestLeggins.java и TestBoots.java.
Далее напишите внутрь каждого файла этот код (он одинаковый для всех файлов (за исключением названия файла и текстуры в инвентаре)):
Разберем:
public void registerIcons(IconRegister par1IconRegister) – собственно текстурка в инвентаре.
public void onArmorTickUpdate(World world, EntityPlayer player, ItemStack itemStack) – в этом методе вы можете прописать все, что душе угодно. Код в нем выполняется каждый игровой тик, когда соответствующий элемент брони надет.
public String getArmorTexture(ItemStack stack, Entity entity, int slot, int layer) – текстура брони на игроке. Запомните! Для все брони нужна лишь одна картинка! Здесь (http://minecraft.novaskin.me/editor?mod … ayer_1.png) можете нарисовать текстуру брони. Затем скачиваете ее и кидаете в папку /textures/armor/testArmor.png.
Вот и все!
Код:
public static EnumArmorMaterial TESTARMORMATERIAL = EnumHelper.addArmorMaterial("TESTARMORMATERIAL", 1000, new int[] {5, 20, 10, 5}, 10);
TESTARMORMATERIAL – собственно Id материала для брони
1000 – поглощаемый урон
{5, 20, 10, 5} – уровень брони на каждую ее часть (шлем, грудь, штаны, ботинки)
10 – зачаровываемость
Теперь создаем всю броню разом (привожу сразу весь TestMod.java):
Код:
package assets.testmod.src;
import net.minecraft.item.EnumArmorMaterial;
import net.minecraft.item.ItemArmor;
import net.minecraftforge.common.EnumHelper;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.EventHandler;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.registry.LanguageRegistry;
@Mod(modid=ModInfo.MODID, name=ModInfo.MODNAME, version=ModInfo.MODVERSION)
public class TestMod
{
@Mod.Instance(ModInfo.MODID)
public static TestMod testmod;
public static EnumArmorMaterial TESTARMORMATERIAL = EnumHelper.addArmorMaterial("TESTARMORMATERIAL", 1000, new int[] {5, 20, 10, 5}, 10);
public static ItemArmor testHelmet = new TestHelmet(3200, TestMod.TESTARMORMATERIAL, 0, 0);
public static ItemArmor testChest = new TestChest(3201, TestMod.TESTARMORMATERIAL, 1, 1);
public static ItemArmor testLeggins = new TestLeggins(3202, TestMod.TESTARMORMATERIAL, 2, 2);
public static ItemArmor testBoots = new TestBoots(3203, TestMod.TESTARMORMATERIAL, 3, 3);
@EventHandler
public void modLoad(FMLInitializationEvent event)
{
LanguageRegistry.addName(testBoots, "Test boots");
LanguageRegistry.addName(testChest, "Test chest");
LanguageRegistry.addName(testHelmet, "Test helmet");
LanguageRegistry.addName(testLeggins, "Test leggins");
}
}
Далее напишите внутрь каждого файла этот код (он одинаковый для всех файлов (за исключением названия файла и текстуры в инвентаре)):
Код:
package assets.testmod.src;
import net.minecraft.client.main.Main;
import net.minecraft.client.renderer.texture.IconRegister;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.EnumArmorMaterial;
import net.minecraft.item.ItemArmor;
import net.minecraft.item.ItemStack;
import net.minecraft.world.World;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
public class TestHelmet extends ItemArmor
{
public TestHelmet(int par1, EnumArmorMaterial par2EnumArmorMaterial, int par3, int par4)
{
super(par1, par2EnumArmorMaterial, par3, par4);
this.setCreativeTab(CreativeTabs.tabCombat);
}
/*
* Иконка
*/
@SideOnly(Side.CLIENT)
public void registerIcons(IconRegister par1IconRegister)
{
this.itemIcon = par1IconRegister.registerIcon(ModInfo.MODID + ":testHelmet");
}
public void onArmorTickUpdate(World world, EntityPlayer player, ItemStack itemStack)
{
/*
* Любой эффект, когда броня одета (не вся, а только определенный предмет(в данном случае - шлем))
*/
}
/*
* Текстура брони на игроке
*/
public String getArmorTexture(ItemStack stack, Entity entity, int slot, int layer)
{
return ModInfo.MODID + ":textures/armor/testArmor.png";
}
}
public void registerIcons(IconRegister par1IconRegister) – собственно текстурка в инвентаре.
public void onArmorTickUpdate(World world, EntityPlayer player, ItemStack itemStack) – в этом методе вы можете прописать все, что душе угодно. Код в нем выполняется каждый игровой тик, когда соответствующий элемент брони надет.
public String getArmorTexture(ItemStack stack, Entity entity, int slot, int layer) – текстура брони на игроке. Запомните! Для все брони нужна лишь одна картинка! Здесь (http://minecraft.novaskin.me/editor?mod … ayer_1.png) можете нарисовать текстуру брони. Затем скачиваете ее и кидаете в папку /textures/armor/testArmor.png.
Вот и все!
В этой главе я опишу, как создавать для ваших будущих и существующих блоков и предметов крафты в верстаке и в печке.
Крафты записываются там же, где мы писали GameRegistry.блабла.
Приведу сразу весь файл, в котором мы получаем наш блок с помощью верстака, бесформенный крафт и с помощью печки :
Итак, начнем с крафта в верстаке:
(TestMod.testBlock, 1) – наш блок и его количество. Можете указать стандартный блок (Block.stone). Обратите внимание, что блоки из мода требуют указания файла, где они созданы (в нашем случае TestMod.java), значит и пишем TestMod.testBlock.
“XXX”, “XXX”, “XXX”,
Пока давайте представим это так – “123″, “456″, “789″,
Тогда наш верстак будет выглядеть так:
<span class="postimg"><img src="http://www.mcmodding.ru/wp-content/uploads/2013/06/craft.png" alt="http://www.mcmodding.ru/wp-content/uploads/2013/06/craft.png"></span>
Первые три 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} – что должно находиться в верстаке.
И наконец рецепт в печке:
Block.dirt.blockID – что переплавляем (верхний слот)
TestMod.testBlock, 1 – что получаем и в каком количестве
1.0F – сколько опыта дадут за переплавку
Вот пока что все. Теперь вы можете добавить крафт любому своему предмету/блоку.
Крафты записываются там же, где мы писали GameRegistry.блабла.
Приведу сразу весь файл, в котором мы получаем наш блок с помощью верстака, бесформенный крафт и с помощью печки :
Код:
package assets.testmod.src;
import assets.testmod.src.blocks.TestBlock;
import net.minecraft.block.Block;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.EventHandler;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.event.FMLPostInitializationEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
import cpw.mods.fml.common.event.FMLServerStartingEvent;
import cpw.mods.fml.common.registry.GameRegistry;
import cpw.mods.fml.common.registry.LanguageRegistry;
@Mod(modid=ModInfo.MODID, name=ModInfo.NAME, version=ModInfo.VERSION)
public class TestMod {
public static final Block testBlock = new TestBlock(2000).setUnlocalizedName("testBlock");
@Mod.Instance(ModInfo.MODID)
public static TestMod mod;
@EventHandler
public void preInit(FMLPreInitializationEvent event)
{
}
@EventHandler
public void init(FMLInitializationEvent event)
{
GameRegistry.registerBlock(testBlock);
LanguageRegistry.addName(testBlock, "Test Block");
GameRegistry.addRecipe(new ItemStack(TestMod.testBlock, 1), new Object[]{ "XXX", "X#X", "XXX", Character.valueOf('X'), Block.cobblestone, ('#'), Block.dirt});
GameRegistry.addShapelessRecipe(new ItemStack(TestMod.testBlock, 4), new Object[] {Item.appleGold});
GameRegistry.addSmelting(Block.dirt.blockID, new ItemStack(TestMod.testBlock, 1), 1.0F);
}
@EventHandler
public void postInit(FMLPostInitializationEvent event)
{
}
@EventHandler
public void serverStarting(FMLServerStartingEvent event)
{
}
}
Код:
GameRegistry.addRecipe(new ItemStack(TestMod.testBlock, 1), new Object[]{ "XXX", "XXX", "XXX", Character.valueOf('X'), Block.cobblestone});
“XXX”, “XXX”, “XXX”,
Пока давайте представим это так – “123″, “456″, “789″,
Тогда наш верстак будет выглядеть так:
<span class="postimg"><img src="http://www.mcmodding.ru/wp-content/uploads/2013/06/craft.png" alt="http://www.mcmodding.ru/wp-content/uploads/2013/06/craft.png"></span>
Первые три X – слева направо первый ряд верстака и так далее.
Вместо X вы можете использовать все что угодно, например Y.
Character.valueOf('X'), Block.cobblestone – в скобочках указанный нами символ и что он из себя представляет (в этом случае – блок булыжника).
Можете использовать несколько символов, например:
{ “X#X”, “X#X”, “X#X”, Character.valueOf('X'), Block.cobblestone, ('#'), Block.dirt});
Думаю объяснять не стоит.
Далее, следующая строчка:
Код:
GameRegistry.addShapelessRecipe(new ItemStack(TestMod.testBlock, 4), new Object[] {Item.stick, Block.dirt});
(TestMod.testBlock, 4) – что получаем в каком количестве.
{Item.stick, Block.dirt} – что должно находиться в верстаке.
И наконец рецепт в печке:
Код:
GameRegistry.addSmelting(Block.dirt.blockID, new ItemStack(TestMod.testBlock, 1), 1.0F);
TestMod.testBlock, 1 – что получаем и в каком количестве
1.0F – сколько опыта дадут за переплавку
Вот пока что все. Теперь вы можете добавить крафт любому своему предмету/блоку.
Хотите поиграть на сервере с друзьями с вашим модом? Легко.
Для начала конечно у вас и у ваших друзей должен быть 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. Туда кидаете мод в архиве (смотрите “Создание готового мода”). Вот и все! Можете подключаться и играть с вашим модом!
В фале нашего мода пишем под всеми еще один @EventHandler :
Из комментариев понятно что делают данные команды. Там еще много команд. .set – задание разных параметров сервера, можете посмотреть список поставив точку и набрав set, вам высветится список всех параметров.
Манипуляции с сервером можно делать и в init, но только когда он запущен. А лучше только в serverstarting
Код:
package assets.testmod.src;
import net.minecraft.server.MinecraftServer;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.EventHandler;
import cpw.mods.fml.common.event.FMLServerStartingEvent;
@Mod(modid=ModInfo.MODID, name=ModInfo.MODNAME, version=ModInfo.MODVERSION)
public class TestMod {
@Mod.Instance(ModInfo.MODID)
public static TestMod testmod;
@EventHandler
public void serverstarting(FMLServerStartingEvent event)
{
MinecraftServer.getServer().logInfo("TeSt MesSage INFO"); // Сообщение в сервере с приставкой [INFO]
MinecraftServer.getServer().logWarning("TeSt MesSage WARNING"); // Сообщение в сервере с приставкой [WARNING]
MinecraftServer.getServer().logSevere("TeSt MesSage Severe"); // Сообщение в сервере с приставкой [SEVERE]
MinecraftServer.getServer().setMOTD("Test FORGE Server"); // Установка описания под сервером (в Minecraft)
MinecraftServer.getServer().setDifficultyForAllWorlds(1); // Установка сложности
}
}
Манипуляции с сервером можно делать и в init, но только когда он запущен. А лучше только в serverstarting