【翻译】McJty教程之1.9Tile entity(存储数据)
三三的小狐狸
2018年02月07日 18:05
收录于文集
共20篇

想要看代码高亮的可以去原文地址或者我的微信公众号(

)查看。

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


如果你想要给你的方块添加额外的数据(不仅仅是那4位metadata)或者你想要给你的方块添加一些逻辑(比如说它是一个机器或者其他什么设备),那么你需要一个tile entity。在这一章我们将会展示一些tile entities的例子。

  • 用tile entity存储数据

  • 用tile entity做一些计时操作

  • 用tile entity从服务器端向客户端同步数据

用tile entity存储数据

在这个例子中我们将会制作一个简单的拥有一个计数器的方块。由于计数器的值可能会很大,我们不能把它存储在4位的metadata中,所以我们必须用tile entity。但是除了计数,这个tile entity不干别的事情。在游戏中,你可以右击这个方块前面的向上箭头来操作它(激活),然后这个计数器就会开始增加。如果你激活了向下的箭头,计数器就会开始减小。这个方块还会在游戏的控制台显示计数器当前的值。为了让我们写玩家点击方块的位置的时候更简单,也为了展示你可以怎样做,我们把方块的方向限制在了水平面。

下面就是方块的代码。在这段代码中,我们也注册了我们的tile entity。我们检查了方块是否被激活,如果激活则调用increment()或者decrement()来让我们的tile entity计数。

Tile entity也很简单。它只需要存储一个数,并且它必须能够将数据和NBT之间进行转换(这样在游戏被保存时,这个数也会被保存)。它不关注客户端的数据所以它不会和客户端进行同步。Tile entity代码中一个重要的调用是markDirty()方法的调用。这个告诉Minecraft,在下一次这个区块被保存到硬盘的时候,这个tile entity也需要被保存。不要忘记这个,不然你的数据是不会被记住的!需要注意的是markDirty()方法不会自动促使数据向客户端同步。这个我们需要其他机制(之后再说)。

下面是方块状态的json(blockstates/datablock.json):

下面是模型本身: