【全员逃走中】幕后那些事 #2
昨天呢,是茂茂系列逃走中第3季第5期的发布。 希望各位看得开心,本期专栏是对这期逃走中卡片认证任务的技术原理解析。 首先明确一点,任务中出现的红蓝两个卡片均由模组添加。 而认证程序是基于 Bukkit API 编写的,这意味着卡片的 Material (表示物品类型) 对象无法通过直接引用获取。 那怎么判断你拿到的卡片是红卡片还是蓝卡片呢?用相等符号比较肯定不行了,但也不是没有办法。 我们知道对于任何一个 Minecraft 物品,其都有唯一的名称,格式是 命名空间:物品名 。 在 Bukkit API 中这个唯一名称用一个 NamespacedKey 对象表示。 而它可以通过 Material.getKey() 方法得到。 又因为我们的插件程序会在 Arclight 服务端上运行,Arclight 能自动把模组注册的物品注入到 Bukkit API 中,所以当拾取物品事件发生时,我们是可以拿到这个物品的 Material 类型对象的。 所以只要判断 Material.getKey() 返回的对象表示的名称是否与卡片的物品一致就可以了。 对 NamespacedKey toString 一下就可以得到以上文提及的格式呈现的名称,那这就下降到字符串比较了,还是很简单的。 那么接下来就又要考虑一个问题,你现在知道这个物品是什么了,那你还要知道对方有没有另一种卡片。 这当然是可以实现的,因为 Minecraft 中,如果一个物品是由一个玩家扔出的,那么表示这个掉落物实体的对象可以提供扔出者的 UUID 。 顺着 UUID 反查玩家还是非常简单的,然后就是一系列的背包判断了。 所以这就解释了为什么视频里两个人同时扔出卡片会显示认证失败,因为在你拿到卡片时要检查对方背包里有没有卡片,而不是去检查对方扔出过的东西,那实在是太麻烦。虽然技术上可以实现,但是茂茂当时在和我说需求的时候,他说就是这么做,那我也就这么做了。 这期内容相较于上期技术解析,我觉得少很多。因为这个认证程序也真的实在是太简单了,希望之后我能参与一些更有意思更有挑战性的任务的开发。 以上就是本期专栏的内容。如果还想之后知道幕后的一些事的话,关注我,不迷路。诶嘿。