-2

Java の使い方を学んでいて、Minecraft の mod を構築しようとしています。

問題は、1.8 のアイテム テクスチャ追加システムに問題があることです。Google は私の親友ですが、この NPE を修正するために何をすべきかまだわかりません。

ベース Mod クラスは次のとおりです。

package rocha.sekai;

import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.Mod.EventHandler;
import net.minecraftforge.fml.common.Mod.Instance;
import net.minecraft.item.Item;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.entity.RenderItem;
import net.minecraft.client.resources.model.ModelResourceLocation;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPostInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
import net.minecraftforge.fml.relauncher.Side;

@Mod(modid=sekai.MODID, name=sekai.MODNAME, version=sekai.MODVER)
public class sekai{

    //items variable
    public static Item testIngot;


    //Set the ID of the mod (Should be lower case).
    public static final String MODID = "sekairocha";
    //Set the "Name" of the mod.
    public static final String MODNAME = "sekai";
    //Set the version of the mod.
    public static final String MODVER = "0.0.1";

    @Instance(value = sekai.MODID) //Tell Forge what instance to use.
    public static sekai instance;

    @EventHandler
    public void preInit(FMLPreInitializationEvent event){
        testIngot = new testItem();
        if(event.getSide() == Side.CLIENT){
            RenderItem renderItem = Minecraft.getMinecraft().getRenderItem();
  line 41-> renderItem.getItemModelMesher().register(testIngot, 0, new ModelResourceLocation("sekai:" + ((testItem) testIngot).getName(), "inventory"));
        }

}


    @EventHandler
    public void load(FMLInitializationEvent event)
    {

    }

    @EventHandler
    public void postInit(FMLPostInitializationEvent event)
    {
    }
}

アイテムクラスは次のとおりです。

package rocha.sekai;

import net.minecraft.item.Item;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraftforge.fml.common.registry.GameRegistry;

public class testItem extends Item{

    private final String name = "testIngot";

    public testItem(){
        GameRegistry.registerItem(this, name);
        maxStackSize = 64;
        setCreativeTab(CreativeTabs.tabMisc);
        setUnlocalizedName("testIngot");

    }

    public String getName(){
        return name;
    }
}

そして、ここにエラーレポートがあります:

java.lang.NullPointerException: Initializing game
    at rocha.sekai.sekai.preInit(sekai.java:41)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at net.minecraftforge.fml.common.FMLModContainer.handleModStateEvent(FMLModContainer.java:536)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at com.google.common.eventbus.EventSubscriber.handleEvent(EventSubscriber.java:74)
    at com.google.common.eventbus.SynchronizedEventSubscriber.handleEvent(SynchronizedEventSubscriber.java:47)

41行目は、コードの直前に「41行目->」でBase Modクラスにマークされています。ここにも転記します。

renderItem.getItemModelMesher().register(testIngot, 0, new ModelResourceLocation("sekai:" + ((testItem) testIngot).getName(), "inventory"));
4

2 に答える 2

2

http://www.minecraftforum.net/forums/mapping-and-modding/minecraft-mods/modification-development/2272349-lessons-from-my-first-mc-1-8-mod

この男は、アイテムのレンダリングを init メソッドに登録する必要があると説明しています。私はそれをしました、そしてそれはうまくいきました。

render 部分を init メソッドに移動するだけで済みました。ベースの Mod クラスでは次のようになりました。

public void load(FMLInitializationEvent event){
        if(event.getSide() == Side.CLIENT)
        {
            RenderItem renderItem = Minecraft.getMinecraft().getRenderItem();
            renderItem.getItemModelMesher().register(testIngot, 0, new ModelResourceLocation(sekai.MODID + ":" + ((testItem) testIngot).getName(), "inventory"));
        }
    }

とにかくありがとう。

于 2015-05-06T20:48:51.203 に答える
0

あなたの問題は、のインスタンス化における MODNAME と MODID の違いだと思いますModelResourceLocation。最初のパラメーターには、「:」の前に MODID が必要です。MODNAME を使用しています。基本 mod クラスで次の行を変更してみてください。

renderItem.getItemModelMesher().register(testIngot, 0, new ModelResourceLocation("sekai:" + ((testItem) testIngot).getName(), "inventory"));

これに:

renderItem.getItemModelMesher().register(testIngot, 0, new ModelResourceLocation("sekairocha:" + ((testItem) testIngot).getName(), "inventory"));

またはさらに良い:

renderItem.getItemModelMesher().register(testIngot, 0, new ModelResourceLocation(sekai.MODID + ":" + ((testItem) testIngot).getName(), "inventory"));

その修正に加えて、あなたのアイテムクラスにはいくつかの変更が必要になると思います。コンストラクターを次のように変更します。

public testItem(){
    super(); //missing initializations from Item class
    maxStackSize = 64;
    this.setCreativeTab(CreativeTabs.tabMisc);
    this.setUnlocalizedName("testIngot");
    GameRegistry.registerItem(this, name); //do this last
}
于 2015-05-06T19:59:05.093 に答える