Minecraft Wiki
Advertisement

В этой статье описывается создание модификаций на основе Minecraft Forge с использованием Eclipse для версий с 1.10.

Подготовка среды[]

  • Скачайте и установите Eclipse и JDK. Желательно также обновить Java до последней версии, если вы ещё этого не сделали.
  • Скачайте Forge последней версии (с пометкой Mdk в списке) и распакуйте в любую папку. Путь к папке не должен содержать кириллицы.
  • Произведите декомпиляцию игры:
    • Windows: В папке нажмите ⇧ Shift+ПКМ, выберите "Открыть окно команд" и введите gradlew.bat setupDecompWorkspace eclipse
    • Linux: Откройте терминал и введите следующие строки:
cd <путь к папке>
./gradlew setupDecompWorkspace eclipse --refresh-dependencies
  • Убедитесь, что декомпиляция прошла успешно. Её процесс должен занять некоторое время и завершиться надписью BUILD_SUCCESSFUL.
  • Запустите Eclipse. В стартовом окне укажите папку eclipse в папке с Forge.

Уроки[]

Новая модификация[]

В левой части экрана располагается меню Package Explorer (если его там нет, в верхнем меню выберите Window/Show View/Package Explorer), в котором находится папка MDKExample. В этой папке присутствуют две основных папки:

  • src/main/java — папка с кодом модификации.
  • scr/main/resources — папка для файлов ресурсов (текстуры, звуки, модели и JSON-файлы).

Щёлкните ПКМ по папке src/main/java и выберите New/Package. Укажите название каталога в таком формате:

<домен>.<автор модификации>.<название модификации>

В качестве домена можно использовать любое доменное имя (com, net, ru и т. д.). Например, если ваш никнейм — SomeGuy, а название модификации — SampleMod, полное имя каталога может быть таким:

com.someguy.samplemod

Это имя будет использоваться в дальнейших уроках.

Создание классов[]

После создания каталога щёлкните по нему ПКМ и выберите New/Class. Этот класс будет основным. Для удобства назовите его SampleMod. В теле класса (после его названия и фигурной скобки) напишите следующий код:

public static final String MODID = "samplemod";
public static final String VERSION = "1.0";

Над названием класса добавьте строку:

@Mod (modid = SampleMod.MODID, version = SampleMod.VERSION)

Обратите внимание, что маркер @Mod выделен красным цветом. Это значит, что для него отсутствует библиотека, в которой он объявлен. Чтобы это исправить, наведите на него курсор и выберите Import 'Mod' (net.minecraftforge.fml.common):

Forge 1.10 Import mod

Ещё раз щёлкните ПКМ по каталогу и выберите New/Package. Создайте каталог com.someguy.samplemod.proxy. В новом каталоге создайте два класса — ClientProxy и ServerProxy.

Forge 1.10 Proxy

Дважды щёлкните по классу ServerProxy и создайте следующие функции в теле класса:

public void preInit (FMLPreInitializationEvent E)
{

}
 
public void init (FMLInitializationEvent E)
{

}

public void postInit (FMLPostInitializationEvent E)
{

}

Если названия типов в скобках выделены красным цветом, по аналогии с предыдущим случаем наводите курсор и нажимайте Import во всех местах.

Теперь перейдите к классу ClientProxy и унаследуйте его от ServerProxy:

public class ClientProxy extends ServerProxy

Добавьте те же самые функции с маркером @Override:

@Override
public void preInit (FMLPreInitializationEvent E)
{

}

@Override
public void init (FMLInitializationEvent E)
{

}

@Override
public void postInit (FMLPostInitializationEvent E)
{

}

Снова перейдите к классу SampleMod и напишите в теле класса:

@SidedProxy (clientSide = "com.someguy.samplemod.proxy.ClientProxy", serverSide = "com.someguy.samplemod.proxy.ServerProxy")
public static ServerProxy proxy;

Если ваша модификация имеет иное название, напишите его вместо samplemod в обоих местах.
Добавьте уже знакомые вам функции в таком виде:

@EventHandler
public void preInit (FMLPreInitializationEvent E)
{
  proxy.preInit (E);
}

@EventHandler
public void init (FMLInitializationEvent E)
{
  proxy.init (E);
}

@EventHandler
public void postInit (FMLPostInitializationEvent E)
{
  proxy.postInit (E);
}

Мета-информация[]

Основа для вашей модификации готова. Перейдите в папку src/main/resources и откройте файл mcmod.info (при его отсутствии — создайте: ПКМ, пункт New/File). Заполните этот файл следующим образом:

[
  {
    "modid": "samplemod",
    "name": "Sample Mod",
    "description": "Sample Mod description",
    "version": "1.0",
    "mcversion": "",
    "url": "",
    "updateUrl": "",
    "authorList": ["SomeGuy"],
    "credits": "Sample Mod credits",
    "logoFile": "",
    "screenshots": [],
    "dependencies": []
  }
]

После этого ваша модификация будет отображаться в списке.

Для запуска игрового клиента нажмите зелёную кнопку на верхней панели (Forge 1.10 Green button). После загрузки вы можете найти модификацию в списке Mods.

Вкладка в творческом режиме[]

Щёлкните ПКМ по каталогу com.someguy.samplemod и создайте каталог com.someguy.samplemod.tab. Добавьте в него класс с названием SampleModTab и унаследуйте его от CreativeTabs:

public class SampleModTab extends CreativeTabs

Название класса стало подчёркнуто красным цветом. Наведите на него курсор и нажмите Add constructor 'SampleModTab(int, String)' и Add unimplemented methods.

Добавьте функцию preInit:

public static void preInit ( )
{

}

Перейдите к классу SampleMod и в самом начале функции preInit напишите следующее:

SampleModTab.preInit ( );

Теперь вы можете добавлять новые вкладки в творческом режиме.

Простая вкладка[]

Снова выберите класс SampleModTab и напишите эту строку в начале:

public static SampleModTab SAMPLE_MOD;

Дополните функцию preInit данной строкой:

SAMPLE_MOD = new SampleModTab (getNextID ( ), "sample_mod");

Функция getNextID ( ) автоматически определяет свободный ID вкладки, представленной переменной SAMPLE_MOD.

Обратите внимание на функцию getTabIconItem. Данная функция определяет, какой предмет или блок отображается на вашей вкладке в творческом режиме. Если эта функция выглядит так:

public Item getTabIconItem ( )
{
  return null;
}

Вы можете указать в качестве предмета, например, яблоко, таким образом:

public Item getTabIconItem ( )
{
  return Items.APPLE;
}

Если же вместо Item перед названием указано ItemStack, это делается несколько иначе:

public ItemStack getTabIconItem ( )
{
  return new ItemStack (Items.APPLE);
}

Создание нескольких вкладок[]

Если вам необходимо более одной вкладки, добавьте их по аналогии с первой, инициализируя в функции preInit:

SAMPLE_MOD = new SampleModTab (getNextID ( ), "sample_mod");
SAMPLE_MOD_NEW = new SampleModTab (getNextID ( ), "sample_mod_new");

Во вкладке SAMPLE_MOD_NEW, как и в SAMPLE_MOD, будет отображаться тот предмет, который указан в функции getTabIconItem. Ниже приведён код этой вкладки с нестандартным предметом (в данном случае — с блоком железа):

SAMPLE_MOD_NEW = new SampleModTab (getNextID ( ), "sample_mod_new")
{
  public ItemStack getTabIconItem ( )
  {
    return new ItemStack (Blocks.IRON_BLOCK);
  }
};

Оформление[]

Возможно, вы заметили, что имя вашей вкладки отображается некорректно. В папке src/main/resources создайте каталог assets.samplemod.lang. В этом каталоге вы можете размещать локализации для любого языка, поддерживаемого в текущей версии.

Создайте файл en_us.lang и напишите следующую строку:

itemGroup.sample_mod=Sample Mod

Теперь ваша вкладка имеет название при выбранном английском языке в настройках.

Предмет[]

Щёлкните ПКМ по каталогу com.someguy.samplemod и создайте каталог com.someguy.samplemod.item. Создайте в этом каталоге класс SampleModItem и добавьте в него несколько методов:

public static void preInit ( )
{
  addItems ( );
}

public static void addItems ( )
{
  
}

public static void addRenders ( )
{
  
}

public static void addItem (Item item, String name)
{
  GameRegistry.register (item, new ResourceLocation (SampleMod.MODID, name));
}

public static void addRender (Item item, String name)
{
  Minecraft.getMinecraft ( ).getRenderItem ( ).getItemModelMesher ( ).register (item, 0,
    new ModelResourceLocation (SampleMod.MODID + ":" + name, "inventory"));
}

Перейдите к классу SampleMod и добавьте данную строку в функцию preInit:

SampleModItem.preInit ( );

В классе ClientProxy добавьте строку в функцию init:

SampleModItem.addRenders ( );

Теперь вы можете добавить в игру любой предмет за несколько шагов.

Простой предмет[]

Создайте переменную в классе SampleModItem, представляющую предмет, который вы хотите добавить. К примеру, для предмета с названием "Test Item" напишите в начале класса:

public static Item TEST_ITEM;

В функции preInit перед вызовом функции addItems добавьте следующую строку:

TEST_ITEM = new Item ( ).setUnlocalizedName ("test_item").setCreativeTab (SampleModTab.SAMPLE_MOD);

Вместо SAMPLE_MOD вы можете установить любую другую вкладку в творческом режиме, обращаясь к ней через SampleModTab или CreativeTabs.

Дополните функцию addItems этой строкой:

addItem (TEST_ITEM, "test_item");

Добавьте ещё одну строку в функцию addRenders:

addRender (TEST_ITEM, "test_item");

Оформление[]

Добавьте в файл en_us.lang и другие файлы локализации следующую строку:

item.test_item.name=Test Item

Кроме того, вашему предмету нужна текстура. В папке src/main/resources создайте каталог assets.samplemod.models.item и добавьте в него файл test_item.json. Скопируйте данный текст в этот файл:

  {
    "parent": "item/generated",
    "textures":
    {
      "layer0": "samplemod:items/test_item"
    }
  }

В этой же папке создайте каталог assets.samplemod.textures.items и разместите в нём вашу текстуру. Пример текстуры: Forge 1.10 Texture.

Блок[]

Щёлкните ПКМ по каталогу com.someguy.samplemod и создайте каталог com.someguy.samplemod.block. Создайте в этом каталоге класс SampleModBlock и добавьте в него несколько методов:

public static void preInit ( )
{
  addBlocks ( );
}

public static void addBlocks ( )
{
  
}

public static void addRenders ( )
{
  
}

public static void addBlock (Block block, String name) 
{
  GameRegistry.register (block, new ResourceLocation (SampleMod.MODID, name));
  GameRegistry.register (new ItemBlock (block), new ResourceLocation (SampleMod.MODID, name));
}

public static void addRender (Block block, String name)
{
  Minecraft.getMinecraft ( ).getRenderItem ( ).getItemModelMesher ( ).register (Item.getItemFromBlock (block),
    0, new ModelResourceLocation (SampleMod.MODID + ":" + name, "inventory"));
}

Перейдите к классу SampleMod и добавьте данную строку в функцию preInit:

SampleModBlock.preInit ( );

В классе ClientProxy добавьте строку в функцию init:

SampleModBlock.addRenders ( );

Теперь вы можете добавить в игру любой блок за несколько шагов.

Простой блок[]

Создайте переменную в классе SampleModBlock, представляющую блок, который вы хотите добавить. К примеру, для блока с названием "Test Block" напишите в начале класса:

public static Block TEST_BLOCK;

В каталоге com.someguy.samplemod.block создайте класс BlockTestBlock и унаследуйте его от класса Block:

public class BlockTestBlock extends Block

Добавьте конструктор в таком виде:

public BlockTestBlock ( )
{
  super (Material.ROCK);

  setUnlocalizedName ("test_block");
  setCreativeTab (SampleModTab.SAMPLE_MOD);
  setHardness (2);
  setResistance (1);
}

Функция setHardness устанавливает прочность, а setResistance — взрывоустойчивость блока.
Вернитесь к классу SampleModBlock и добавьте строку в функцию preInit перед функцией addBlocks:

TEST_BLOCK = new BlockTestBlock ( );

Дополните функцию addBlocks этой строкой:

addBlock (TEST_BLOCK, "test_block");

Добавьте ещё одну строку в функцию addRenders:

addRender (TEST_BLOCK, "test_block");

Сыпучий блок[]

Если вам необходимо сделать блок сыпучим, перейдите к его классу и просто унаследуйте его от BlockFalling:

public class BlockTestBlock extends BlockFalling

При необходимости вы можете изменить звучание блока, делая его схожим с песком или другим материалом. Для этого добавьте в конструктор следующую строку:

setSoundType (SoundType.SAND);

Оформление[]

Добавьте в файл en_us.lang и другие файлы локализации следующую строку:

tile.test_block.name=Test Block

В папке src/main/resources создайте каталог assets.samplemod.models.block и добавьте в него файл test_block.json. Скопируйте данный текст в этот файл:

{
  "parent": "block/cube_all",
  "textures":
  {
    "all": "samplemod:blocks/test_block"
  }
}

В каталоге assets.samplemod.models.item также создайте файл test_block.json следующего содержания:

{
  "parent": "samplemod:block/test_block"
}

Создайте каталог assets.samplemod.blockstates и добавьте в него файл с таким же названием. Скопируйте данный текст в этот файл:

  {
    "variants":
    {
      "normal": { "model": "samplemod:test_block" }
    }
  }

В этой же папке создайте каталог assets.samplemod.textures.blocks и разместите в нём вашу текстуру.

Рецепт[]

Щёлкните ПКМ по каталогу com.someguy.samplemod и создайте каталог com.someguy.samplemod.recipe. Создайте в этом каталоге класс SampleModRecipe:

public static void preInit ( )
{

}

По аналогии с предыдущими классами, добавьте строку в функцию preInit класса SampleMod:

SampleModRecipe.preInit ( );

Рецепт крафта[]

Добавьте в функцию preInit класса SampleModRecipe следующий код:

GameRegistry.addRecipe (new ItemStack (Blocks.STONE, 1), new Object [ ] { 
  " A ", "ABA", " A ", 'A', Blocks.CLAY, 'B', Blocks.BEDROCK});

Эта строка добавляет в игру такой рецепт:

Ингредиенты Рецепты крафта
Глиняный блок +
Коренная порода





Каждая буква соответствует указанному блоку или предмету, а в пустых местах ставится пробел. Тип и количество выходного ресурса обозначены в скобках после ItemStack.

Этот код добавляет бесформенный рецепт крафта:

GameRegistry.addShapedRecipe (new ItemStack (Blocks.STONE, 1), new Object [ ] { 
  Blocks.CLAY, Blocks.BEDROCK });
Ингредиенты Рецепты крафта
Глиняный блок +
Коренная порода









Компиляция[]

Откройте папку с Forge, запустите терминал и введите команду gradlew.bat build. По окончанию процесса ваша модификация появится в папке build/libs в скомпилированном виде.

Advertisement