zkm00323
本帖最后由 zkm00323 于 2017-1-14 19:47 编辑


现在我们来制作一个物品

1.新建item文件
我们可以新建一个放物品类的包,再在里面新建一个class


我们让ItemBloodsave来继承Item,然后我们写一个ItemCrystal的构造函数↓
public class ItemBloodsave extends Item{
        public ItemBloodsave(){
                setUnlocalizedName("itembloodsave");
                setRegistryName("itembloodsave");
                setCreativeTab(CreativeTabs.MATERIALS);
        }
}unlocalizedName:注册外部名,用于写lang文件
setRegistryName:注册内部名,必须小写,游戏内部运作,以及读取贴图用
setCreativeTab:设置物品所在物品栏

如果你跟我一样懒,外部名和内部名写一样也是没关系的





2.注册物品
接下来我们要注册这个物品


ModItems里写↓
public class ModItems {
        
        public static Item itembloodsave = new ItemBloodsave();

        public static void init(){
                GameRegistry.register(itembloodsave);
        }
        
        public static void register(){
                registerinit(itembloodsave);
        }
        
        public static void registerinit(Item item){
                ModelLoader.setCustomModelResourceLocation(item, 0, new ModelResourceLocation(item.getRegistryName() , "inventory"));
        }
}

init之后让Main呼叫
registe则是之后让客户端来呼叫

CommonProxy里我们写
public interface CommonProxy {
        public void init();
}

再来让ClientProxy重写这个方法,并且呼叫ModItems.register()
public class ClientProxy implements CommonProxy{
        public void init(){
                ModItems.register();
        }
}

最后,在Main里的preInit方法呼叫ModItems.init()以及proxy.init()
        @EventHandler
        public void preInit(FMLPreInitializationEvent event){
                ModItems.init();
                proxy.init();
        }

注意proxy.init()请务必放在preInit!并且在物品,方块,实体等注册完以后呼叫
ModelLoader.setCustomModelResourceLocation();这个渲染注册似乎
必须在preinit时呼叫才能够正常使用,当时苦恼了3天为什么贴图显示不出来






3.贴图以及model
1.8以后的每个物品和方块等都要写相对应的json文件
可以说是比较麻烦了,但也可以说自定义的东西外形更方便了
在src/main/resources下新建assets.modID......

这里新手没有把握请和的用一模一样的包名

Moditems.registerinit里面的ModelLoader.setCustomModelResourceLocation(item, 0, new ModelResourceLocation(item.getRegistryName() , "inventory"));
item.getRegistryName()="soa:itembloodsave"
所以我们的json文件名就必须是itembloodsave才会被读取到,并且放在models.item里

在models.item里新建一个json文件


在里面输入下
{
    "parent": "item/generated",
    "textures": {
        "layer0": "soa:items/itembloodsave"
    }
}

"textures":贴图
"layer0":layer0贴图所在路径"modID:items/贴图名"
"parent":继承于哪里,这里继承的是mc
原版里的文件,我们可以在这里找到↓



最后我们往textures.items里丢入图片

附赠贴图 当然你可以自己画

好的我们现在可以打开游戏看看了


好其实今天的过程也是非常基础简单,下一节我们来玩ntb!
所有文件最后代码↓(供检查用)
src 教程3.rar (5.07 KB, 下载次数: 181)







2021.12 数据,可能有更多内容
现在我们来制作一个物品


1.新建item文件
我们可以新建一个放物品类的包,再在里面新建一个class



我们让ItemBloodsave来继承Item,然后我们写一个ItemCrystal的构造函数↓
public class ItemBloodsave extends Item{
  public ItemBloodsave(){
    setUnlocalizedName("itembloodsave");
    setRegistryName("itembloodsave");
    setCreativeTab(CreativeTabs.MATERIALS);
  }
}unlocalizedName:注册外部名,用于写lang文件
setRegistryName:注册内部名,必须小写,游戏内部运作,以及读取贴图用
setCreativeTab:设置物品所在物品栏


如果你跟我一样懒,外部名和内部名写一样也是没关系的


2.注册物品
接下来我们要注册这个物品


ModItems里写↓
public class ModItems {
 
  public static Item itembloodsave = new ItemBloodsave();


  public static void init(){
    GameRegistry.register(itembloodsave);
  }
 
  public static void register(){
    registerinit(itembloodsave);
  }
 
  public static void registerinit(Item item){
    ModelLoader.setCustomModelResourceLocation(item, 0, new ModelResourceLocation(item.getRegistryName() , "inventory"));
  }
}


init之后让Main呼叫
registe则是之后让客户端来呼叫


CommonProxy里我们写
public interface CommonProxy {
  public void init();
}


再来让ClientProxy重写这个方法,并且呼叫ModItems.register()
public class ClientProxy implements CommonProxy{
  public void init(){
    ModItems.register();
  }
}


最后,在Main里的preInit方法呼叫ModItems.init()以及proxy.init()
  @EventHandler
  public void preInit(FMLPreInitializationEvent event){
    ModItems.init();
    proxy.init();
  }


注意proxy.init()请务必放在preInit!并且在物品,方块,实体等注册完以后呼叫
ModelLoader.setCustomModelResourceLocation();这个渲染注册似乎
必须在preinit时呼叫才能够正常使用,当时苦恼了3天为什么贴图显示不出来




3.贴图以及model
1.8以后的每个物品和方块等都要写相对应的json文件
可以说是比较麻烦了,但也可以说自定义的东西外形更方便了
在src/main/resources下新建assets.modID......

这里新手没有把握请和的用一模一样的包名


Moditems.registerinit里面的ModelLoader.setCustomModelResourceLocation(item, 0, new ModelResourceLocation(item.getRegistryName() , "inventory"));
item.getRegistryName()="soa:itembloodsave"
所以我们的json文件名就必须是itembloodsave才会被读取到,并且放在models.item里


在models.item里新建一个json文件


在里面输入下
{
    "parent": "item/generated",
    "textures": {
  "layer0": "soa:items/itembloodsave"
    }
}


"textures":贴图
"layer0":layer0贴图所在路径"modID:items/贴图名"
"parent":继承于哪里,这里继承的是mc
原版里的文件,我们可以在这里找到↓



最后我们往textures.items里丢入图片

附赠贴图
当然你可以自己画

好的我们现在可以打开游戏看看了


好其实今天的过程也是非常基础简单,下一节我们来玩ntb!
所有文件最后代码↓(供检查用)







zkm00323
本帖最后由 zkm00323 于 2017-1-15 14:55 编辑

上一篇:2.基本mod框架下一篇:4.用nbt玩耍


fukoy
zkm00323 发表于 2017-1-14 22:37
上一篇:2.基本mod框架下一篇:4.用nbt玩耍

能写一个新建block的教程吗

白天
本帖最后由 白天 于 2017-2-7 23:17 编辑

不是很懂mod大佬……话说帖子结尾是NBT还是NTB?

好吧我看到下一个帖子了……我以为是我看错了

nnsdldy
本帖最后由 nnsdldy 于 2017-7-8 23:08 编辑

楼主这个GameRegistry里面的register()是不是被取消了?我打出来报错,你的代码我打开来也是报错。



-----------------------------------------------------------------
我换了个老版本的forge果然不报错了。。。。。。

zkm00323
nnsdldy 发表于 2017-7-8 16:48
楼主这个GameRegistry里面的register()是不是被取消了?我打出来报错,你的代码我打开来也是报错 ...

可能是你forge版本和我不一样,方法名改了吧,eclipse应该会提示相近的方法名,懵一下看会不会中

zhangsanfeng
这样写完之后直接丢到服务端就能跑?

FR_RedStone
辛苦了辛苦了

spider853
怎么新建json文件?

IMENDERDRAGON
怎么在游戏里显示聊天信息?

Ayase_Miya
items下和图片一起的db文件怎么出来的?之前一直贴图不成功,用了压缩包里的图片才成功,有什么要求吗?

Alex20041130
nnsdldy 发表于 2017-7-8 16:48
楼主这个GameRegistry里面的register()是不是被取消了?我打出来报错,你的代码我打开来也是报错 ...

用这个
  1. ForgeRegistries.ITEMS.register(itembloodsave);
复制代码

老曾滑稽
zkm00323 发表于 2017-7-29 18:56
可能是你forge版本和我不一样,方法名改了吧,eclipse应该会提示相近的方法名,懵一下看会不会中 ...

那1.12.2forge2768呢?

指间青春
楼主请问1.12.2怎么注册物品啊