【全員逃走中】幕后那些事 #2
昨天呢,是茂茂系列逃走中第3季第5期的發(fā)布。 希望各位看得開(kāi)心,本期專欄是對(duì)這期逃走中卡片認(rèn)證任務(wù)的技術(shù)原理解析。 首先明確一點(diǎn),任務(wù)中出現(xiàn)的紅藍(lán)兩個(gè)卡片均由模組添加。 而認(rèn)證程序是基于 Bukkit API 編寫的,這意味著卡片的 Material (表示物品類型) 對(duì)象無(wú)法通過(guò)直接引用獲取。 那怎么判斷你拿到的卡片是紅卡片還是藍(lán)卡片呢?用相等符號(hào)比較肯定不行了,但也不是沒(méi)有辦法。 我們知道對(duì)于任何一個(gè) Minecraft 物品,其都有唯一的名稱,格式是 命名空間:物品名 。 在 Bukkit API 中這個(gè)唯一名稱用一個(gè) NamespacedKey 對(duì)象表示。 而它可以通過(guò) Material.getKey() 方法得到。 又因?yàn)槲覀兊牟寮绦驎?huì)在 Arclight 服務(wù)端上運(yùn)行,Arclight 能自動(dòng)把模組注冊(cè)的物品注入到 Bukkit API 中,所以當(dāng)拾取物品事件發(fā)生時(shí),我們是可以拿到這個(gè)物品的 Material 類型對(duì)象的。 所以只要判斷 Material.getKey() 返回的對(duì)象表示的名稱是否與卡片的物品一致就可以了。 對(duì) NamespacedKey toString 一下就可以得到以上文提及的格式呈現(xiàn)的名稱,那這就下降到字符串比較了,還是很簡(jiǎn)單的。 那么接下來(lái)就又要考慮一個(gè)問(wèn)題,你現(xiàn)在知道這個(gè)物品是什么了,那你還要知道對(duì)方有沒(méi)有另一種卡片。 這當(dāng)然是可以實(shí)現(xiàn)的,因?yàn)?Minecraft 中,如果一個(gè)物品是由一個(gè)玩家扔出的,那么表示這個(gè)掉落物實(shí)體的對(duì)象可以提供扔出者的 UUID 。 順著 UUID 反查玩家還是非常簡(jiǎn)單的,然后就是一系列的背包判斷了。 所以這就解釋了為什么視頻里兩個(gè)人同時(shí)扔出卡片會(huì)顯示認(rèn)證失敗,因?yàn)樵谀隳玫娇ㄆ瑫r(shí)要檢查對(duì)方背包里有沒(méi)有卡片,而不是去檢查對(duì)方扔出過(guò)的東西,那實(shí)在是太麻煩。雖然技術(shù)上可以實(shí)現(xiàn),但是茂茂當(dāng)時(shí)在和我說(shuō)需求的時(shí)候,他說(shuō)就是這么做,那我也就這么做了。 這期內(nèi)容相較于上期技術(shù)解析,我覺(jué)得少很多。因?yàn)檫@個(gè)認(rèn)證程序也真的實(shí)在是太簡(jiǎn)單了,希望之后我能參與一些更有意思更有挑戰(zhàn)性的任務(wù)的開(kāi)發(fā)。 以上就是本期專欄的內(nèi)容。如果還想之后知道幕后的一些事的話,關(guān)注我,不迷路。誒嘿。