31
Мар

Minecraft Forge в IntelliJ IDEA

В этом туториале я опишу установку Minecraft Forge в среде разработки IntelliJ IDEA для разработки модов

Скачайте Mod Development Kit (или src для старых версий Minecraft) отсюда — http://files.minecraftforge.net

Распакуйте скачанный архив в вашу рабочую папку (например, D:\forge1.7.10)

Откройте IntelliJ IDEA. Если у вас уже открыт какой-то проект, то нажмите

File > Close project

Вы должны увидеть данное окно:

Нажмите на Import Project и выберите файл build.gradle, который находится в распакованном архиве. Оставьте все настройки по умолчанию и нажмите OK.

IntelliJ IDEA может загружать впервые этот проект до 10 минут. После окончания загрузки нажмите на вкладку Gradle в боковой панели. Если её нет, нажмите на кнопку снизу справа и выберите Gradle:

Откройте вкладку Gradle и выберите setupDecompWorkspace. Эта функция скачает и декомпилирует Minecraft. По окончанию установки выберите genIntellijRuns и перезапустите IntelliJ IDEA. Эта функция добавит 2 конфигурации запуска в IDE.

Нажмите на Minecraft Client (справа от зелёной стрелки) и выберите Edit Configurations

В Use classpath of module выберите тот, что оканчивается на main

В Minecraft Server сделайте то же самое

Фикс загрузки ресурсов

В последних версиях IntelliJ IDEA есть проблема, из-за которой ресурсы мода могут не загружаться. Проверим это. Напишите в главном классе мода следующий код:

package com.example.examplemod;

import net.minecraft.client.Minecraft;
import net.minecraft.init.Blocks;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.EventHandler;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import net.minecraft.util.ResourceLocation;
import org.apache.commons.io.IOUtils;

import java.io.IOException;

@Mod(modid = ExampleMod.MODID, version = ExampleMod.VERSION)
public class ExampleMod
{
    public static final String MODID = "examplemod";
    public static final String VERSION = "1.0";
    
    @EventHandler
    public void init(FMLInitializationEvent event)
    {
        try {
            System.out.println(IOUtils.toString(Minecraft.getMinecraft().getResourceManager().getResource(new ResourceLocation("examplemod:file.txt")).getInputStream()));
        } catch (IOException e) {
            e.printStackTrace();
        }
        // some example code
        System.out.println("DIRT BLOCK >> "+Blocks.dirt.getUnlocalizedName());
    }
}

Создайте папку assets, а в ней — examplemod, а в ней — file.txt. Напишите туда любой текст

Запустите Minecraft Client. Если там написало

[14:47:37] [Client thread/INFO] [STDOUT]: [com.example.examplemod.ExampleMod:init:23]: abc
[14:47:37] [Client thread/INFO] [STDOUT]: [com.example.examplemod.ExampleMod:init:28]: DIRT BLOCK >> tile.dirt

Значит, всё хорошо. А если

 [14:51:54] [Client thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:748]: java.io.FileNotFoundException: examplemod:file.txt
 [14:51:54] [Client thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:748]:     at net.minecraft.client.resources.SimpleReloadableResourceManager.getResource(SimpleReloadableResourceManager.java:71)
 [14:51:54] [Client thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:748]:     at com.example.examplemod.ExampleMod.init(ExampleMod.java:23)
 [14:51:54] [Client thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:748]:     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 [14:51:54] [Client thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:748]:     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
 [14:51:54] [Client thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:748]:     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
 [14:51:54] [Client thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:748]:     at java.lang.reflect.Method.invoke(Method.java:497)
 [14:51:54] [Client thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:748]:     at cpw.mods.fml.common.FMLModContainer.handleModStateEvent(FMLModContainer.java:532)
 [14:51:54] [Client thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:748]:     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 [14:51:54] [Client thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:748]:     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
 [14:51:54] [Client thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:748]:     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
 [14:51:54] [Client thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:748]:     at java.lang.reflect.Method.invoke(Method.java:497)
 [14:51:54] [Client thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:748]:     at com.google.common.eventbus.EventSubscriber.handleEvent(EventSubscriber.java:74)
 [14:51:54] [Client thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:748]:     at com.google.common.eventbus.SynchronizedEventSubscriber.handleEvent(SynchronizedEventSubscriber.java:47)
 [14:51:54] [Client thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:748]:     at com.google.common.eventbus.EventBus.dispatch(EventBus.java:322)
 [14:51:54] [Client thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:748]:     at com.google.common.eventbus.EventBus.dispatchQueuedEvents(EventBus.java:304)
 [14:51:54] [Client thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:748]:     at com.google.common.eventbus.EventBus.post(EventBus.java:275)
 [14:51:54] [Client thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:748]:     at cpw.mods.fml.common.LoadController.sendEventToModContainer(LoadController.java:212)
 [14:51:54] [Client thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:748]:     at cpw.mods.fml.common.LoadController.propogateStateMessage(LoadController.java:190)
 [14:51:54] [Client thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:748]:     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 [14:51:54] [Client thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:748]:     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
 [14:51:54] [Client thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:748]:     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
 [14:51:54] [Client thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:748]:     at java.lang.reflect.Method.invoke(Method.java:497)
 [14:51:54] [Client thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:748]:     at com.google.common.eventbus.EventSubscriber.handleEvent(EventSubscriber.java:74)
 [14:51:54] [Client thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:748]:     at com.google.common.eventbus.SynchronizedEventSubscriber.handleEvent(SynchronizedEventSubscriber.java:47)
 [14:51:54] [Client thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:748]:     at com.google.common.eventbus.EventBus.dispatch(EventBus.java:322)
 [14:51:54] [Client thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:748]:     at com.google.common.eventbus.EventBus.dispatchQueuedEvents(EventBus.java:304)
 [14:51:54] [Client thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:748]:     at com.google.common.eventbus.EventBus.post(EventBus.java:275)
 [14:51:54] [Client thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:748]:     at cpw.mods.fml.common.LoadController.distributeStateMessage(LoadController.java:119)
 [14:51:54] [Client thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:748]:     at cpw.mods.fml.common.Loader.initializeMods(Loader.java:737)
 [14:51:54] [Client thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:748]:     at cpw.mods.fml.client.FMLClientHandler.finishMinecraftLoading(FMLClientHandler.java:311)
 [14:51:54] [Client thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:748]:     at net.minecraft.client.Minecraft.startGame(Minecraft.java:597)
 [14:51:54] [Client thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:748]:     at net.minecraft.client.Minecraft.run(Minecraft.java:942)
 [14:51:54] [Client thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:748]:     at net.minecraft.client.main.Main.main(Main.java:164)
 [14:51:54] [Client thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:748]:     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 [14:51:54] [Client thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:748]:     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
 [14:51:54] [Client thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:748]:     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
 [14:51:54] [Client thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:748]:     at java.lang.reflect.Method.invoke(Method.java:497)
 [14:51:54] [Client thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:748]:     at net.minecraft.launchwrapper.Launch.launch(Launch.java:135)
 [14:51:54] [Client thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:748]:     at net.minecraft.launchwrapper.Launch.main(Launch.java:28)
 [14:51:54] [Client thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:748]:     at net.minecraftforge.gradle.GradleStartCommon.launch(Unknown Source)
 [14:51:54] [Client thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:748]:     at GradleStart.main(Unknown Source)
 [14:51:54] [Client thread/INFO] [STDOUT]: [com.example.examplemod.ExampleMod:init:28]: DIRT BLOCK >> tile.dirt

Значит, нужно исправлять.

Идём в

Build, Execution, Deployment > Build Tools > Gradle > Runner 

И убираем галку с Delegate IDE build/run actions to gradle. Теперь всё должно быть хорошо.

Источник

Добавить комментарий