Minecraft 1.8 Forge API IBlockState 与渲染

在 Minecraft 内部,方块也可以看作是可放置的物品,使用 Item 类的静态方法 getItemFromBlock(Block someBlock) 可以获得对应的物品。向游戏内注册该方块也是类似的使用 GameRegistry.registerBlock(Block blockToReg, String unlocalizedName)。然而在处理渲染时需要多额外的一步。

以下为 Item 渲染

String nameToReg = MOD_ID + ':' + item.getUnlocalizedName().substring(5);
Minecraft.getMinecraft()
        .getRenderItem().getItemModelMesher()
        .register(item, 0,
        new ModelResourceLocation(nameToReg, "inventory");

以下为 Block 渲染

Item item = Item.getItemFromBlock(block);
// 从 Block 得到对应的 Item
String nameToReg = MOD_ID + ':' + item.getUnlocalizedName().substring(5);
Minecraft.getMinecraft()
        .getRenderItem().getItemModelMesher()
        .register(item, 0,
        new ModelResourceLocation(nameToReg, "inventory");

区别主要在于多了一句从 Block 获得 Item。虽然是以 Item 注册了渲染,实际上这里和 Item 处理渲染的方法并不相同。

assets/<MOD_ID>/blockstates/<blockUnlocalizedName>.json

我所写的 mod 中许多方块都会根据不同的 BlockState 改变渲染模型,而 BlockState 中不同 IProperty 组合所对应状态所对应的模型在这里指定。关于 BlockState,见上一篇 Forge API 详解。我在这里以 TransitRailMod 的电缆架作为例子。

在源代码中,WirePanel 是 CustomDirectionalBlock 的子类,因此继承其 EnumFacing FACING 的属性,这个方块又根据电缆架上是否插了日光灯改变 EnumBool LAMP 属性、是否是封闭的改变 EnumBool SHUT 属性。因此罗列一下: Continue reading Minecraft 1.8 Forge API IBlockState 与渲染

Minecraft 1.8 Forge API BlockState 与红石详解

由于网上找到的 Minecraft Forge 文档实在是少的可怜,我决定自己写一份以防未来的自己忘记。具体的实践可以在我的客运铁路 mod 见到。

红石的更新本质上也是方块更新,因此当一个方块想要检测红石信号,处理的代码应当放在 Block 类的 onNeighborBlockChange(World worldIn, BlockPos pos, IBlockState state, Block neighborBlock) 方法。

BlockStateIBlockState

可以在方块的 Class 建立 BlockState 以允许方块拥有不同的状态 (IProperty),不同的状态可以在 assets/<MODID>/blockstates/<block_instance_name>.json 中定义不同的方块模型。

每一个 IProperty 拥有自己的 name 和可以取到的有限个值,这些值在 Java 内部以 enum 的形式实现。关于 enum 变量类型,可以在王八壳的 javadoc 上找到。

一个方块的 BlockState 可以包含一个或多个 IProperty,可以使用已经定义好的 IProperty 子类(PropertyDirection, PropertyBool)也可以自己定义 enum 建立 PropertyEnum

Class: public CustomBlock extends Block

通过以下方式建立 IProperty 及其子类的实例:

  • public static final PropertyDirection FACING = PropertyDirection.create("facing", EnumFacing.Plane.HORIZONTAL);
    建立新的方向属性,名称为 "facing" ,可以取的值为平面方向的朝向,为 EnumFacing 下的 NORTHEASTSOUTHWEST
  • public static final PropertyBool POWERED = PropertyBool.create("powered");
    建立布尔型只能为 truefalse 的方块属性。

Continue reading Minecraft 1.8 Forge API BlockState 与红石详解

[Updated Aug 10, 2015]正确的调教wine容器和Evernote

Environment

  • 启用了multilib的最新Archlinux 64-bit
    # pacman -Syu
  • 带有monogecko的Wine 1.7.x
    # pacman -S wine wine_gecko wine-mono mono
  • winetricks,干吗的不用说也明白
    # pacman -S winetricks
  • 顺手的下载器和浏览器
    我的是wgetgoogle-chrome
  • 可能一定会用到梯子和proxychains-ng,自行准备,下载字体要用

Preparation

  1. Evernote官方下载安装包
    $ wget -O "Evernote-Install.exe" "https://evernote.com/download/get.php?file=Win"
    ……我可没说一定要用wget,圣战请移步
  2. 开新的wine容器,名称为evernote
    $ env WINEPREFIX="$HOME/.local/share/wineprefixes/evernote" winecfg

    Wine-Initializing-PREFIX
    图1:wine容器正在初始化
  3. 调整wine设定

Installation

  1. 开始安装到指定容器
    $ env WINEPREFIX="$HOME/.local/share/wineprefixes/evernote" wine Evernote-Install.exe

    就像在Windows里那样,一路下一步
    图4:就像在Windows里那样,一路下一步

    重要!不要更变默认安装配置,不然会给后期的更新和查错带来麻烦!

  2. 安装gnutls库
    重要!没有这个东西Evernote根本不能访问笔记存储服务器!
    # pacman -S lib32-gnutls
  3. winetricks中安装msxml3 msxml5 msxml6
    $ winetricks

    在winetricks中选择Evernote所在的容器
    图5:在winetricks中选择Evernote所在的容器
    选择安装DLL组件
    图6:选择安装DLL组件
    安装msxml3 msxml4 msxml5,它们是印象笔记正常读取笔记需要的支持文件
    图7:安装msxml3 msxml4 msxml5,它们是印象笔记正常读取笔记需要的支持文件,按照提示操作,完成后会回到图6
  4. winetricks中安装富文本控件
    winetricks中的富文本控件,需要他们来正确显示笔记格式
    图8:winetricks中的富文本控件,需要他们来正确显示笔记格式
  5. winetricks中的中文字体配置
    配置字体,以防中文字符全是豆腐
    图9:图6中的界面选择第二项配置字体,以防中文字符全是豆腐,如果不需要日文和韩文字符,后两个可以不选

Done! Happy taking notes!

安装及配置完成!
图10:安装及配置完成!
Evernote的托盘图标和windows上的体验差不多
图11:Evernote的托盘图标和windows上的体验差不多
Evernote已经正常运作,现在正在同步我在云端的笔记
图12:Evernote已经正常运作,现在正在同步我在云端的笔记

Post-installation tweaks

开机启动

虽然wine能够处理大多数让windows程序跑起来的工作,但是wine仍然是一个容器,不足以上升到系统层面,因此你并不能强求印象笔记在你登陆时自行启动。
The Linux Way:使用Gnome高级设置gnome-tweak-tool,使用pacman -S gnome-tweak-tool以安装,在自启菜单中找到Evernote的启动器并添加相应启动项。

 更新

就和安装一个新的一样,重复准备步骤1和安装步骤1即可,Winetricks无需再次配置。

Known Caveats

Evernote-in-wine-bugs

1:笔记本分类错误,在试图更改已经存在的笔记的所属笔记本时会发生错误并且崩溃。
解决方案:not yet

2:图片不能自动缩放到适合大小。
解决方案:错误信息提示需要libjpeg.so.8,即使已经安装64位的libjpeg-turbo,32位的Evernote并不能正确加载,安装lib32-libjpeg-turbo以解决问题

[Update Aug 10, 2015]

疑似无法启动的可以尝试安装AUR里的log4cplus