土球球
本帖最后由 ustc_zzzz 于 2016-5-5 01:50 编辑

引言
Forge在昨天,也就是五月四日,发布了关于Minecraft 1.9的稳定版(1.9-12.16.1.1887)。
作者参考了国外开发者的变化统计,以及作者自己的发现,整理出了关于Forge with Minecraft 1.9的Mod开发引导。
该部分引导写得比较简略,而且内容可能也比较浅,不过对于1.8的Mod开发者快速上手1.9来说,也应该是足够了。

配置开发环境
从这里下载MinecraftForge的mdk:

解压后的目录应该是这个样子的:
  1. forge-1.9-12.16.1.1887-mdk
  2. |-eclipse/
  3. |-gradle/
  4. |-src/
  5. |-.gitignore
  6. |-build.gradle
  7. |-gradlew
  8. |-gradlew.bat
  9. ...
复制代码

在该文件夹下打开命令行界面,输入:

OSX/Linux:
  1. ./gradlew setupDecompWorkspace
复制代码

Microsoft Windows:
  1. gradlew.bat setupDecompWorkspace
复制代码


按照自己的IDE(Eclipse或IDEA)选择下一步配置:

OSX/Linux:
  1. ./gradlew eclipse
  2. ./gradlew idea
复制代码

Microsoft Windows:
  1. gradlew.bat eclipse
  2. gradlew.bat idea
复制代码

在IDE下打开就好了,这一步骤和1.8的开发过程是一样的。

物品和方块
和1.8一样,物品和方块均在preInit阶段注册,不过不一样的是,Forge提供了一个统一的接口,也就是GameRegistry#register方法。我们需要使用名为“setRegistryName”方法为方块和物品指定名称,比如1.8的物品注册是这样的:
  1. GameRegistry.registerItem(yourItem, "your_item_name");
复制代码

1.9变成了:
  1. yourItem.setRegistryName("your_item_name");
  2. GameRegistry.register(yourItem);
复制代码

在1.9,注册物品模型渲染也变得更方便了点,因为可以直接使用“getRegistryName”方法获取物品的注册名称了:
  1. Minecraft.getMinecraft().getRenderItem().getItemModelMesher().register(item, 0,
  2.         new ModelResourceLocation(item.getRegistryName(), "inventory"));
复制代码

在这里,作者还是建议物品和方块的注册名称(RegistryName)和非本地化名称(UnlocalizedName)分离,也就是这样:
  1. yourItem.setRegistryName("your_item_name");
  2. yourItem.setUnlocalizedName("yourAnotherUnlocalizedName");
复制代码

注册名称使用小写加下划线,而本地化名称使用小写驼峰式。

不过这里有一点需要注意,就是方块对应的物品需要手动注册了,也就是原先在1.8中是这样的:
  1. GameRegistry.registerItem(yourBlock, "your_block_name");
复制代码

在1.9要注册两步:
  1. yourBlock.setRegistryName("your_block_name");
  2. yourItemBlock = new ItemBlock(yourBlock);
  3. yourItemBlock.setRegistryName("your_block_name");
  4. GameRegistry.register(yourBlock);
  5. GameRegistry.register(yourItemBlock);
复制代码

这提醒了Mod开发者需要手动注册方块对应的物品,不失为一件好事。

其实,除了物品和方块,Forge在Minecraft 1.9中还把很多对象收入了统一化的注册接口,包括:


这大大简化了一些之前的注册非常蹩脚的对象的注册。

事件
事件在1.9只有一些细微的变化,很多都是从1.8.9带过来的,也有一些从1.9新加的:


数据存储和同步
用于同步实体的DataWatcher被换成了EntityDataManager,可以使用一些既定的DataSerializer来指定数据序列化的方式,并使用EntityDataManager#register、EntityDataManager#set和EntityDataManager#get方法来方便地注册和管理。
有着悠久历史的IExtendedEntityProperties被删除了,取而代之的是来自1.8.9的Capability系统,该系统可以方便地存储实体、TileEntity和ItemStack的附加数据。

其他


最后附上此次更新的changelog:

土球球
沙发自占,可能会在这一楼补充(因为审核速度= =你懂的)。

ChenXijun
没想到1.9mdk推荐版本出来了

1316293471
顶{:10_492:}