Создание предмета

Версия Minecraft
1.12.2
API
Forge
40
1
7
Всем добра!

Делаю предмет по учебнику, но оно не работает. Модель не отображается, текстура не накладывается. Помогите решить.
Использую idea 2024.3.1.1 (Community Edition)
В настройках Gradle Project выставлял "Build and Runs using" -> idea (фикс idea)
В build.gradle писал:
build.gradle:
apply plugin: 'idea'
idea.module.inheritOutputDirs = true
Ничего пока не помогло :(

При запуске игры после стадии инициализации создаются следующие ошибки:
1736428981160.png


MoringTechMod.java:
package moringtech;

import moringtech.api.Values;
import moringtech.common.CommonProxy;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.SidedProxy;
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPostInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;


@Mod(
        modid = Values.MODID,
        name = Values.NAME,
        acceptedMinecraftVersions = Values.MINECRAFT_VERSION,
        version = Values.VERSION
)
public class MoringTechMod {
    @Mod.Instance(Values.MODID)
    public static MoringTechMod instance;

    @SidedProxy(
            modId = Values.MODID,
            clientSide = Values.CLIENT_PROXY,
            serverSide = Values.COMMON_PROXT
    )
    public static CommonProxy proxy;

    @Mod.EventHandler
    public static void onPreInit(FMLPreInitializationEvent event) {
        // Регистрация блоков и предметов
        // Регистрация Tile Entity
        // Регистрация сущностей
        // Присвоение имен в Ore Dictionary
        proxy.onPreInit(event);
    };

    @Mod.EventHandler
    public static void onInit(FMLInitializationEvent event) {
        // Регистрация генераторов структур
        // Регистрация рецептов
        // Регистрация обработчиков действий
        proxy.onInit(event);
    };

    @Mod.EventHandler
    public static void onPostInit(FMLPostInitializationEvent event) {
        // Действия связанные с другими модами
        proxy.onPostInit(event);
    };
}
ClientProxy.java:
package moringtech.common;


import moringtech.common.items.ItemsRegistry;
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPostInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;

public class ClientProxy extends CommonProxy {
    @Override
    public void onPreInit(FMLPreInitializationEvent event)
    {
        super.onPreInit(event);
    }

    @Override
    public void onInit(FMLInitializationEvent event)
    {
        super.onInit(event);
    }

    @Override
    public void onPostInit(FMLPostInitializationEvent event)
    {
        super.onPostInit(event);
    }
}

ItemKey.java:
package moringtech.common.items;

import net.minecraft.item.Item;

public class ItemKey extends Item {
    public ItemKey() {
        this.setRegistryName("key");
        this.setUnlocalizedName("key");
    }
}

ItemRegistry.java:
package moringtech.common.items;

import net.minecraft.client.renderer.block.model.ModelBakery;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.item.Item;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.client.event.ModelRegistryEvent;
import net.minecraftforge.client.model.ModelLoader;
import net.minecraftforge.event.RegistryEvent;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.registry.GameRegistry;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;

import moringtech.api.Values;

/*
 * Указывает ModId для других ObjectHolder в классе
 * Если не добавлять аннотацию над классом, то каждый раз придётся прописывать ModId вручную.
 * Подробнее см. https://mcforge.readthedocs.io/en/latest/concepts/registries/#injecting-registry-values-into-fields
 */
@GameRegistry.ObjectHolder(Values.MODID)
@Mod.EventBusSubscriber// Автоматическая регистрация статичных обработчиков событий
public class ItemsRegistry {
    /*
     * Получение предмета по ключу. Вы также можете использовать данную аннотацию для получения ванильных предметов
     * Если вы не добавляли аннотация над классом, то в таком случаи вам нужно прописать вместо [ICODE]key[/ICODE] -> [ICODE]tut:key[/ICODE]
     */
    @GameRegistry.ObjectHolder("key")
    public static final Item KEY = null;

    /*
     * Начиная с 1.12 регистрацию предметов/блоков/моделей и т.п. следует проводить в специальном событии.
     * Событие Register<IForgeRegistryEntry> поддерживает регистрацию: Block, Item, Potion, Biome, SoundEvent,
     * PotionType, Enchantment, IRecipe,  VillagerProfession, EntityEntry.
     * Обратите внимание! Метод является статичным, так как мы используем EventBusSubscriber
     */
    @SubscribeEvent
    public static void onRegistryItem(RegistryEvent.Register<Item> e) {
        // Также вместо [ICODE]register[/ICODE] можно использовать [ICODE]registerAll[/ICODE], чтобы прописать все предметы разом
        e.getRegistry().register(new ItemKey());
    }

    /*
     * Начиная с 1.11 регистрацию моделей для предметов/блоков следует проводить в специальном событии.
     * Обратите внимание! Метод является статичным, так как мы используем EventBusSubscriber
     */
    @SubscribeEvent
    @SideOnly(Side.CLIENT)
    public static void onRegistryModel(ModelRegistryEvent e) {
        ItemsRegistry.registryModel(KEY);
    }


    @SideOnly(Side.CLIENT)
    public static void registryModel(Item item) {
        final ResourceLocation regName = item.getRegistryName();// Не забываем, что getRegistryName может вернуть Null!
        // assert regName != null;
        final ModelResourceLocation mrl = new ModelResourceLocation(regName, "inventory");
        ModelBakery.registerItemVariants(item, mrl);// Регистрация вариантов предмета. Это нужно если мы хотим использовать подтипы предметов/блоков(см. статью подтипы)
        ModelLoader.setCustomModelResourceLocation(item, 0, mrl);// Устанавливаем вариант модели для нашего предмета. Без регистрации варианта модели, сама модель не будет установлена для предмета/блока(см. статью подтипы)
    }
}

key.json:
{
  "parent": "item/generated",
  "textures": {
    "layer0": "moringtech:items/key"
  }
}

Я также пробовал использовать стандартные текстуры, к примеру:
"layer0": "items/charcoal"
Это тоже не работает..

Структура проекта:
1736428791456.png


Полный build.gradle:
build.gradle:
buildscript {
    repositories {
        maven { url = 'https://maven.minecraftforge.net/' }
        mavenCentral()
    }
    dependencies {
        classpath 'net.minecraftforge.gradle:ForgeGradle:3.+'
    }
}
        
apply plugin: 'net.minecraftforge.gradle'
// Only edit below this line, the above code adds and enables the necessary things for Forge to be setup.
apply plugin: 'eclipse'
apply plugin: 'maven-publish'
apply plugin: 'idea'

idea.module.inheritOutputDirs = true

version = '1.0'
group = 'com.yourname.modid' // http://maven.apache.org/guides/mini/guide-naming-conventions.html
archivesBaseName = 'modid'

sourceCompatibility = targetCompatibility = compileJava.sourceCompatibility = compileJava.targetCompatibility = '1.8' // Need this here so eclipse task generates correctly.

minecraft {
    // The mappings can be changed at any time, and must be in the following format.
    // snapshot_YYYYMMDD   Snapshot are built nightly.
    // stable_#            Stables are built at the discretion of the MCP team.
    // Use non-default mappings at your own risk. they may not always work.
    // Simply re-run your setup task after changing the mappings to update your workspace.
    //mappings channel: 'snapshot', version: '20171003-1.12'
    mappings channel: 'snapshot', version: '20171003-1.12'
    // makeObfSourceJar = false // an Srg named sources jar is made by default. uncomment this to disable.
    
    // accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg')

    // Default run configurations.
    // These can be tweaked, removed, or duplicated as needed.
    runs {
        client {
            workingDirectory project.file('run')

            // Recommended logging data for a userdev environment
            property 'forge.logging.markers', 'SCAN,REGISTRIES,REGISTRYDUMP'

            // Recommended logging level for the console
            property 'forge.logging.console.level', 'debug'
        }

        server {

            // Recommended logging data for a userdev environment
            property 'forge.logging.markers', 'SCAN,REGISTRIES,REGISTRYDUMP'

            // Recommended logging level for the console
            property 'forge.logging.console.level', 'debug'
        }
    }
}

dependencies {
    // Specify the version of Minecraft to use, If this is any group other then 'net.minecraft' it is assumed
    // that the dep is a ForgeGradle 'patcher' dependency. And it's patches will be applied.
    // The userdev artifact is a special name and will get all sorts of transformations applied to it.
    minecraft 'net.minecraftforge:forge:1.12.2-14.23.5.2859'

    // You may put jars on which you depend on in ./libs or you may define them like so..
    // compile "some.group:artifact:version:classifier"
    // compile "some.group:artifact:version"

    // Real examples
    // compile 'com.mod-buildcraft:buildcraft:6.0.8:dev'  // adds buildcraft to the dev env
    // compile 'com.googlecode.efficient-java-matrix-library:ejml:0.24' // adds ejml to the dev env

    // The 'provided' configuration is for optional dependencies that exist at compile-time but might not at runtime.
    // provided 'com.mod-buildcraft:buildcraft:6.0.8:dev'

    // These dependencies get remapped to your current MCP mappings
    // deobf 'com.mod-buildcraft:buildcraft:6.0.8:dev'

    // For more info...
    // http://www.gradle.org/docs/current/userguide/artifact_dependencies_tutorial.html
    // http://www.gradle.org/docs/current/userguide/dependency_management.html

}

// Example for how to get properties into the manifest for reading by the runtime..
jar {
    manifest {
        attributes([
            "Specification-Title": "examplemod",
            "Specification-Vendor": "examplemodsareus",
            "Specification-Version": "1", // We are version 1 of ourselves
            "Implementation-Title": project.name,
            "Implementation-Version": "${version}",
            "Implementation-Vendor" :"examplemodsareus",
            "Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ")
        ])
    }
}

// Example configuration to allow publishing using the maven-publish task
// This is the preferred method to reobfuscate your jar file
jar.finalizedBy('reobfJar')
// However if you are in a multi-project build, dev time needs unobfed jar files, so you can delay the obfuscation until publishing by doing
//publish.dependsOn('reobfJar')

publishing {
    publications {
        mavenJava(MavenPublication) {
            artifact jar
        }
    }
    repositories {
        maven {
            url "file:///${project.projectDir}/mcmodsrepo"
        }
    }
}

текстуру которую использую (просто рандомную взял):
key.png
 
 

Фичи и фиксы в IntelliJ IDEA​

Бывает, сталкиваешься с проблемами и никак не удается их решить. Либо вообще нет решения в интернете, либо у всех работает, а у тебя почему-то нет. Расскажу про несколько фич(костылей, ага), которые помогли мне решить проблемы и сделать коддинг чуточку приятнее. 1. IDEA не грузит...
forum.mcmodding.ru
forum.mcmodding.ru
Я уже писал в самом начале, что данный действия не помогают.
 
Где вообще можно указывать расположение моделей вручную? :unsure:
Если допустим расширять файловую структуру разделяя логическим путем.
Типа:
-- models
---- items
------ tools
-------- electrical
-------- steel
-------- iron
 
Не уверен, но попробуй 19-21 строки в градле на свои сменить. На новых версиях это необходимо для работы с ассетами, как на старых версиях с новым градлом - хз.
Пробовал. Не работает.

Пробовал указывать маркеры idea на папки.
Пробовал пересоздавать мод.
Пробовал жестко копировать все с данной репы.

Я уже перепробовал все... Ничего не работает. Суть моддева на майн - без правильного бубна не заведется :)
 
Значит смотришь что в логах вываливается. Там 90% полезной инфы есть
:unsure: Это будет странно, если проблема в коде. Ведь все берется из учебников. Если это не является достоверным источником - тогда я даже не знаю))
 
Назад
Сверху