【翻译】McJty教程之1.9相关概念
三三的小狐狸
2018年02月05日 11:20
收录于文集
共20篇

本周开始一个新的系列,是关于Minecraft Mod开发的。我将翻译McJty的开发教程,和大家一起学习~这篇是介绍1.9版本以上的一些mod开发相关的概念。

原文地址:https://wiki.mcjty.eu/modding/index.php?title=Concepts-1.9

在这个章节,我们将会解释并澄清许多和Minecraft开发有关的条款和概念。

目录

方块(Block)

方块意味着minecraft中的一个基础方块。方块本身并不包含数据。比如说土方块,尽管在世界中有多种土方块,但是只有一种泥土方块(dirt)。它们都共享相同的方块实例。你可以和一个方块共同存储的数据只有一个4位的metadata。这玩意在1.8.9你并不能直接访问到,具体可以看看方块状态(block states)

物品(Item)

物品就是你在背包之类的地方有的东西。所有的方块通常都有一个相关的物品,是自动创建的。但是 也有一些物品并没有与之相关的方块,比如说稿子,并没有稿子方块。和方块一样,同一类型的物品共享相同的物品实例,所以你不能在这个类中存储物品的特殊信息。如果你想要干这种事,你必须使用NBT或者从ItemStack加以破坏(这句话翻的好奇怪,请对照原文看看)。

TileEntity

Tile entity是给方块添加额外的信息甚至是逻辑的一种方法。与方块相反,相同类型的每一个方块都拥有一个不同的tile entity实例。这意味着你可以在这里存储信息。当世界(world)被保存时,所有你想要留存的tile entity信息必须能有被转化为NBT数据。默认情况下,tile entity只是数据。通过实现ITickable接口,你也可以得到一个能够“计时(ticks)”的tile entity。这样你的tile entity可以做一些对这个世界产生影响的操作。

ItemStack

物品(或者方块)永远不是直接存储在背包或者箱子之类的地方的。它们被包含在一个ItemStack的实例中。一个涉及一些物品的ItemStack有一个integer类型的破坏值,也可能有NBT数据。

NBT数据

ItemStack是直接以NBT的形式存储它们的数据的。Tile entity不会自己这样做,但是你仍然需要能够将你的tile entity状态转换为NBT。NBT数据基本上说是一个数据的地图,用这种方式可以比较方便的存储数据。

实体(Entity)

实体和tile entity不一样。它代表着世界里的一个动态的对象。比如说,一个人物或者一个掉在地上的物品。

方块状态(Block states)

在1.8之前,你必须直接使用方块的metadata(4位)。从1.8版本开始,有一个全新的概念叫做方块状态(BlockState)。你不用再直接做,而是做。通过调用这个方法,你可以在获得方块的同时得到当前方块状态所定义的属性。这些属性必须和一些metadata一一映射,这一步在Block的实现过程中已经完成了。但是除此之外,你不应该直接操作任何metadata。需要注意的是方块状态也可以被用来描述方块的特性。这个不必和具体的metadata对应。比如说,补充的方块状态可以被用于自定义模型渲染,现有的方块状态可以被用于TESR渲染。

TileEntitySpecialRenderer(TESR)

TESR是一个用于在世界中渲染tile entity信息的类。如果你要用的话,你的方块必须有一个辅助的tile entity。需要注意的是,TESR在每一个框架(frame)都会被渲染,小心不要过度使用。当你有一个方块需要经常改变外观,TESR绝大多数情况下都是很有用的。所以在一个静态的方块里面包含它没有什么意义。

IBakedModel

Baked model是一个被用来静态的渲染方块的类。如果你用普通的json不能表达你的静态方块,你可以使用这个类。自定义的baked model不需要tile entity。当你想要一个相对来说复杂的方块,外观并不是经常变化,但是仍旧需要在不同的情况下进行不同的渲染的时候,baked model会很有用。一个比较好的例子是一个管道系统。你需要判断相邻管道方块的状态来渲染每一个管道。