[租賃服可用] 一條指令拿到無限耐久的物品!

相信點(diǎn)開這個(gè)專欄前,你已經(jīng)看過以下這些視頻了。
99.9%的MC玩家都不知道的,一個(gè)指令——獲取無限耐久裝備
那你會(huì)感到很疑惑,這個(gè)專欄有什么用?
問得好,這個(gè)專欄會(huì)解答你多年的疑惑——為什么把兩個(gè)耐久為負(fù)數(shù)的物品在背包合成欄合并后,卻得到了一個(gè)耐久為正數(shù)的“無限耐久”的物品?
在這里,我會(huì)告訴你以上視頻中“/give @p 物品名稱 2 17204”是怎么來的,以及如何最大限度地獲取最高耐久的物品。
溫馨提示:閱讀此文章需要約 10?分鐘左右,且有一定的數(shù)學(xué)知識(shí)和計(jì)算機(jī)編程知識(shí),徹底理解可能需要更久,請(qǐng)根據(jù)個(gè)人實(shí)際情況斟酌。

首先我們要了解幾個(gè)數(shù)學(xué)知識(shí)。
1. ?x? 代表對(duì) x 進(jìn)行向下取值的運(yùn)算,你可以理解為去除小數(shù)?x 的小數(shù)部分,而只保留它的整數(shù)部分。例如??3.0? = 3,??3.5? = 3,??3.9? = 3,??4.5? = 4 。
2. “*” 指代乘號(hào)。
在研究整個(gè)問題前,我們需要知道同種物品在合并后,最終所得物品的耐久度計(jì)算公式。
通過翻閱 Wiki ,我們有“兩個(gè)物品合并后所得物品的耐久 = 兩個(gè)物品原始耐久的加和 + ?該種物品的滿耐久值 * 5%?”

然而,值得我們注意的是,在 Minecraft 中,程序員不會(huì)存儲(chǔ)當(dāng)前物品的“耐久值”,而是存儲(chǔ)這個(gè)物品的“損耗值(Damage)”,我們又可以親切的稱呼它為“當(dāng)前物品的已使用次數(shù)”。
在研究接下來的問題前,我們需要了解幾個(gè)與計(jì)算機(jī)編程知識(shí)有關(guān)的概念。你不用害怕,因?yàn)樗鼈兎浅5暮?jiǎn)單!
在計(jì)算機(jī)中,我們用 0 和 1 這種二進(jìn)制的東東來表示數(shù)據(jù)。你上過小學(xué),所以你知道如果你可以用 1 個(gè) 0 或?1 來表示數(shù)的話,那么你可以表示 2 個(gè)數(shù),也就是 0 和 1;如果你可以用 2 個(gè) 0 或?1 來表示數(shù)的話,那么你可以表示 2*2=4 個(gè)數(shù),也就是 00 01 10 11 。
于是,業(yè)界有一個(gè)規(guī)定,我們用 8 個(gè) 0 或?1 來表示 1 個(gè)字節(jié),這代表著 1 個(gè)字節(jié)可以表示 2*2*2*2*2*2*2*2=2^8=256 個(gè)數(shù)。另外,表示這個(gè)字節(jié)的每一個(gè) 0 或 1 被稱為“比特”。
int32 是計(jì)算機(jī)中一種數(shù)據(jù)類型,它被用于表示范圍在 -2147483648 到 2147483647 之間的整數(shù)。于是,一個(gè) int32 需要由 4 個(gè)字節(jié)來表示,因此一個(gè) int32 可以表示 256*256*256*256=256^4=4294967296 個(gè)數(shù)——天哪,這么多的數(shù)!
int16?亦是計(jì)算機(jī)中一種數(shù)據(jù)類型,它被用于表示范圍在?-32768?到 32767?之間的整數(shù)。于是,一個(gè) int16 需要由 2?個(gè)字節(jié)來表示,因此一個(gè) int16?可以表示 256*256=65536 個(gè)數(shù)。
相信喜歡 32k 的朋友們這時(shí)候 DNA 動(dòng)了——這不就是我熟悉的 32767 嗎?這下你知道為什么附魔等級(jí)的最大上限是 32767 了吧,因?yàn)槲覀兛ㄍ垡沥纬绦騿T使用 int16 這一數(shù)據(jù)類型來表示附魔等級(jí)!
但讓我們思考一個(gè)新的問題,如果一個(gè)數(shù)據(jù)類型為 int16 的整數(shù) 32767 加上一,那么會(huì)發(fā)生什么——相信上過電腦課的朋友肯定了解,這時(shí)候會(huì)發(fā)生數(shù)據(jù)溢出——因此得到的結(jié)果不是 32768 ,而是 -32768 ,這是因?yàn)?int16 只能表示?-32768?到 32767?之間的整數(shù)!
言歸正傳——損耗值被儲(chǔ)存在物品的 tag 標(biāo)簽下,其數(shù)據(jù)類型為 int32 。但需要特別注意的是,在實(shí)際運(yùn)算中,程序員選擇了 int16 ,因此損耗值實(shí)際上只能被 int16 可表示的數(shù)表示,這意味著物品的損耗值的取值范圍只能是 -32768 到 32767 之間的整數(shù)。
根據(jù)上文提到的,損耗值代表物品的已使用次數(shù),所以我們有“物品當(dāng)前的耐久值 = 物品的滿耐久值 - 物品的已使用次數(shù)”。這意味著損耗值為 0 時(shí),物品的耐久還是滿的;而損耗值為 1 時(shí),物品已被使用 1 次,耐久度減去 1 ;而損耗值等于滿耐久度時(shí),代表物品已被完全損耗,此時(shí)耐久度為 0 。

那么嗶嗶賴賴這么多,那么讓我們定義一些變量,然后用它們推導(dǎo)一下合并后所得物品的損耗值吧!
????? 合并后所得物品的總耐久
????被合并的第一個(gè)物品的原始耐久
????被合并的第二個(gè)物品的原始耐久
? ? ?該種物品的滿耐久
? ? ?合并后所得物品的總使用次數(shù)
????被合并的第一個(gè)物品的原始使用次數(shù)
????被合并的第二個(gè)物品的原始使用次數(shù)
于是根據(jù)上文提到的“兩個(gè)物品合并后所得物品的耐久 = 兩個(gè)物品原始耐久的加和 + ?該種物品的滿耐久值 * 5%?”,我們可以得到:
根據(jù)上文提到的“物品當(dāng)前的耐久值 = 物品的滿耐久值 - 物品的已使用次數(shù)”,我們可以得到:
于是將上述 3 個(gè)表達(dá)式代入第 1 個(gè)表達(dá)式,我們可以得到:
化簡(jiǎn)后有:

根據(jù)上文提到的“數(shù)據(jù)溢出”和“損耗值”的實(shí)際數(shù)據(jù)類型是 int16 的小知識(shí),當(dāng) D 取 32768 時(shí),實(shí)際所得物品的損耗值 D 是 -32768 ,而耐久度為“滿耐久+32768”。
一般情況下,我們讓 ,于是我們有?
。
令? ,代入上式可以解得?
?。
于是計(jì)算所得的??便是我們要求的答案——通過使用“/give @s 物品英文ID名 2
”獲得兩個(gè)耐久/損耗相同的物品,然后放入背包的合成欄合成,此時(shí)合并后所得物品的損耗值最小,為 -32768 ,而它的耐久度最大,為“32768+該種物品的滿耐久”。
特別地,如果計(jì)算所得的??不是整數(shù),則此時(shí) D 應(yīng)取 32769 ,且此時(shí)合并后所得物品的損耗值為 -32767 ,耐久度為“32767+該種物品的滿耐久”。

是時(shí)候解答開篇提到的“/give @p 物品名稱 2 17204”的來源的問題了~
實(shí)際上,這個(gè)指令是專為鉆石劍而設(shè)計(jì)的。通過查閱 Wiki ,我們知道鉆石劍的滿耐久度為 1561 ,因此取 D=32768, N=1561 得??,是一個(gè)小數(shù)。
因此取?D=32769, N=1561 得??,因此得到指令“/give @p diamond_sword 2 17204”。

那么到這里就全部結(jié)束啦,你有什么收獲嘛?