当前位置: 首页 >> 滚动 > > 正文

[租赁服可用] 一条指令拿到“无限”耐久的物品!

2023-08-14 01:31:42来源:哔哩哔哩

相信点开这个专栏前,你已经看过以下这些视频了。


(资料图片仅供参考)

[网易服务器可用]无限耐久武器获取

%的MC玩家都不知道的,一个指令——获取无限耐久装备

一条指令拿到无限耐久物品(租赁服可用)

那你会感到很疑惑,这个专栏有什么用?

问得好,这个专栏会解答你多年的疑惑——为什么把两个耐久为负数的物品在背包合成栏合并后,却得到了一个耐久为正数的“无限耐久”的物品?

在这里,我会告诉你以上视频中“/give @p 物品名称 2 17204”是怎么来的,以及如何最大限度地获取最高耐久的物品。

温馨提示:阅读此文章需要约 10 分钟左右,且有一定的数学知识和计算机编程知识,彻底理解可能需要更久,请根据个人实际情况斟酌。

首先我们要了解几个数学知识。

1. ⌊x⌋ 代表对 x 进行向下取整的运算,你可以理解为去除小数 x 的小数部分,而只保留它的整数部分。例如 ⌊⌋ = 3, ⌊⌋ = 3, ⌊⌋ = 3, ⌊⌋ = 4 。

2. “*” 指代乘号。

在研究整个问题前,我们需要知道同种物品在合并后,最终所得物品的耐久度计算公式。

通过翻阅 Wiki ,我们有“两个物品合并后所得物品的耐久 = 两个物品原始耐久的加和 + ⌊该种物品的满耐久值 * 5%⌋”

然而,值得我们注意的是,在 Minecraft 中,程序员不会存储当前物品的“耐久值”,而是存储这个物品的“损耗值(Damage)”,我们又可以亲切的称呼它为“当前物品的已使用次数”。

在研究接下来的问题前,我们需要了解几个与计算机编程知识有关的概念。你不用害怕,因为它们非常的简单!

在计算机中,我们用 0 和 1 这种二进制的东东来表示数据。你上过小学,所以你知道如果你可以用 1 个 0 或 1 来表示数的话,那么你可以表示 2 个数,也就是 0 和 1;如果你可以用 2 个 0 或 1 来表示数的话,那么你可以表示 2*2=4 个数,也就是 00 01 10 11 。

于是,业界有一个规定,我们用 8 个 0 或 1 来表示 1 个字节,这代表着 1 个字节可以表示 2*2*2*2*2*2*2*2=2^8=256 个数。另外,表示这个字节的每一个 0 或 1 被称为“比特”。

int32 是计算机中一种数据类型,它被用于表示范围在 -2147483648 到 2147483647 之间的整数。于是,一个 int32 需要由 4 个字节来表示,因此一个 int32 可以表示 256*256*256*256=256^4=4294967296 个数——天哪,这么多的数!

int16 亦是计算机中一种数据类型,它被用于表示范围在 -32768 到 32767 之间的整数。于是,一个 int16 需要由 2 个字节来表示,因此一个 int16 可以表示 256*256=65536 个数。

相信喜欢 32k 的朋友们这时候 DNA 动了——这不就是我熟悉的 32767 吗?这下你知道为什么附魔等级的最大上限是 32767 了吧,因为我们卡哇伊の程序员使用 int16 这一数据类型来表示附魔等级!

但让我们思考一个新的问题,如果一个数据类型为 int16 的整数 32767 加上一,那么会发生什么——相信上过电脑课的朋友肯定了解,这时候会发生数据溢出——因此得到的结果不是 32768 ,而是 -32768 ,这是因为 int16 只能表示 -32768 到 32767 之间的整数!

言归正传——损耗值被储存在物品的 tag 标签下,其数据类型为 int32 。但需要特别注意的是,在实际运算中,程序员选择了 int16 ,因此损耗值实际上只能被 int16 可表示的数表示,这意味着物品的损耗值的取值范围只能是 -32768 到 32767 之间的整数。

根据上文提到的,损耗值代表物品的已使用次数,所以我们有“物品当前的耐久值 = 物品的满耐久值 - 物品的已使用次数”。这意味着损耗值为 0 时,物品的耐久还是满的;而损耗值为 1 时,物品已被使用 1 次,耐久度减去 1 ;而损耗值等于满耐久度时,代表物品已被完全损耗,此时耐久度为 0 。

那么哔哔赖赖这么多,那么让我们定义一些变量,然后用它们推导一下合并后所得物品的损耗值吧!

合并后所得物品的总耐久

被合并的第一个物品的原始耐久

被合并的第二个物品的原始耐久

该种物品的满耐久

合并后所得物品的总使用次数

被合并的第一个物品的原始使用次数

被合并的第二个物品的原始使用次数

于是根据上文提到的“两个物品合并后所得物品的耐久 = 两个物品原始耐久的加和 + ⌊该种物品的满耐久值 * 5%⌋”,我们可以得到:

根据上文提到的“物品当前的耐久值 = 物品的满耐久值 - 物品的已使用次数”,我们可以得到:

于是将上述 3 个表达式代入第 1 个表达式,我们可以得到:

化简后有:

根据上文提到的“数据溢出”和“损耗值”的实际数据类型是 int16 的小知识,当 D 取 32768 时,实际所得物品的损耗值 D 是 -32768 ,而耐久度为“满耐久+32768”。

一般情况下,我们让 ,于是我们有  。

令  ,代入上式可以解得  。

于是计算所得的  便是我们要求的答案——通过使用“/give @s 物品英文ID名 2 ”获得两个耐久/损耗相同的物品,然后放入背包的合成栏合成,此时合并后所得物品的损耗值最小,为 -32768 ,而它的耐久度最大,为“32768+该种物品的满耐久”。

特别地,如果计算所得的  不是整数,则此时 D 应取 32769 ,且此时合并后所得物品的损耗值为 -32767 ,耐久度为“32767+该种物品的满耐久”。

是时候解答开篇提到的“/give @p 物品名称 2 17204”的来源的问题了~

实际上,这个指令是专为钻石剑而设计的。通过查阅 Wiki ,我们知道钻石剑的满耐久度为 1561 ,因此取 D=32768, N=1561 得  ,是一个小数。

因此取 D=32769, N=1561 得  ,因此得到指令“/give @p diamond_sword 2 17204”。

那么到这里就全部结束啦,你有什么收获嘛?

标签: