DynamicItemScan 模组宾果

这个服务器端模组让你以物品作为宾果目标进行游戏。它会扫描所有已加载的其他模组,识别出在生存模式中可获得的物品,并将其加入物品池。你可以单人游玩,也可以组队进行。

迷你游戏

DynamicItemScan Modded Bingo

这是一个仅限服务端的 1.12.2 Forge 模组。

这个模组是关于什么的?

这个模组让你在 Minecraft 中玩宾果游戏,目标物品是所有已加载的可生存模式下获得的原版和模组物品。每个队伍或单人玩家会获得一份包含物品网格的宾果卡副本。网格大小可调,从 3x3 到 9x9 不等。通过在生存模式下发现或合成物品,卡上的物品会被标记为已获得。最先完成一整行、一列或对角线的队伍或单人玩家获胜!

这个模组有什么特别之处?

动态物品扫描

该模组会遍历所有已加载的 loot 表、合成配方、村民交易和熔炉烧炼配方,记录其中发现的所有新物品。它还会通过二进制排列,尝试 Loot 表中所有可能应用于物品的 LootFunction 组合,以捕获所有可以在生存模式下出现或合成的物品。

不会搜索完整的物品注册表,因为它可能包含仅能在创造模式下获得、无法在生存模式中获取的物品。

物品会确保唯一性,使得每个物品在宾果卡中出现的概率相同。要加入最终物品列表,一个物品的注册名、元数据和 NBT 标签不能与列表中已有的任何物品完全相同。

注意:无论安装了哪些模组,该功能都有效。所有模组都会被扫描,如果 mods 文件夹的内容发生变化,在服务器重启后,物品池会自动调整。

动态物品扫描的主要局限:

  • 我们无法保证扫描能找到每一个可获得的物品。如果一个物品没有注册在合成或烧炼配方或 loot 表中,而是通过模组添加的机器获得的,那么它不会被检测到。
  • 合成配方的原料被假定为可获得,以缓解上述问题,但这可能不总是符合实际情况。
  • 我们无法检测哪些附魔适用于哪些物品。为了添加一些附魔物品,每个已注册附魔的附魔书都会被添加到物品池中。

“至少”原则——物品如何判定相等?

核心思想是,将宾果卡中的所需物品和玩家物品栏中的已获得物品进行非对称处理。当已获得物品满足所需物品的所有属性时,两个物品被视为相等。已获得物品可以拥有多余的属性。

注意:

  • 数量被忽略。
  • 物品元数据和物品耐久度共用同一个变量。如果物品被标记为可损坏,即它“认为自己是可损坏的”,则该变量用于耐久度,我们忽略它作为属性。

考虑以下示例:

属性 已获得物品 所需物品
注册名 stone_hoe stone_hoe
元数据 0 23

这两个物品不会被视为相等,因为所需物品指定了元数据,而已获得物品没有。

属性 已获得物品 所需物品
注册名 stone_hoe stone_hoe
元数据 23 0

但这里,这两个物品会被视为相等,因为已获得物品满足的属性比所需物品要求的更多。

如果已获得物品有附魔而所需物品没有,或者已获得物品的附魔多于所需物品,情况同样适用。

可变宾果卡尺寸

通常,宾果游戏使用 5x5 的方形卡片。在这里,你可以自定义宾果卡尺寸,范围从 3x3 到 9x9。

玩家可以重新加入

当玩家离开时,模组会记住他所在的队伍。一旦他重新加入且游戏仍在进行中,他将自动被分配回正确的队伍,并且卡片上的进度会被更新。

游戏流程

设置队伍 -----------> 开始 ---------> 自然结束(宾果)/ 取消 ---------> 设置队伍

命令

  • /teams:设置指定的队伍。
  • /start:使用指定的设置开始新游戏。
  • /cancel:取消当前正在进行的游戏。

用法:

  • /teams [player1,player2][player3](需要括号!)将产生:
    队伍 1 队伍 2
    player1, player2 player3
  • /start 3-9(网格尺寸) 3-6(背包尺寸) true-false(不同队伍不同卡片) true-false(每人钻石镐) true-false(每人工作台) true-false(死亡不掉落) true-false(无饥饿) 括号中的文字仅为解释,实际命令语法中不需要。

该命令共需 7 个参数。

例如:/start 5 6 false true true true true 将开始一个游戏,使用 5x5 宾果卡、6x9 背包、所有队伍相同卡片(都追求相同目标)、每人有钻石镐和工作台、死亡不掉落开启、游戏期间无饥饿。

/start 9 6 true true true true true 将使用 9x9 宾果卡、6x9 背包、不同队伍不同地图(各有各的目标,相对于其他队伍,在目标难度上可能幸运或不幸)、钻石镐、工作台、死亡不掉落和无饥饿。

  • /cancel

为什么有这么多“z”?

物品扫描意味着该模组需要在所有其他模组加载完其物品之后才被加载。因此,由于 Forge 模组加载器倾向于按字母顺序加载模组,该模组的 modid 以及 jar 文件名都以 3 个“z”开头。

其他

数据包

该模组会修改客户端-服务器通信所需的入站和出站数据包。该模组已测试过,但请注意,服务端绑定和客户端绑定数据包管道中的任何错误都可能导致服务器和/或客户端崩溃。

反射

本项目使用反射来实现其功能。通常不建议使用反射。请注意,这使得项目非常不稳定且版本特定。该模组在 Forge 版本 1.12.2-14.23.5.2847 上测试过。理论上,其他 1.12.2 版本也应该能工作,但未测试。我不承担任何责任。

克隆与构建

该模组为 Minecraft 1.12.2 开发,构建需要 JDK 1.8.0。测试用例版本为 JDK 版本 1.8.0_302。

  • 在你选择的本地目录中克隆仓库(参见来源链接)。
  • 确保你设备上的某个位置安装了 JDK 1.8.0 版本。
  • 在克隆的目录中打开命令提示符。
  • 使用 gradle wrapper 构建,指定使用的 Java 版本:
    • Windows:gradlew build -Dorg.gradle.java.home=JDK_1.8.0 的路径
    • Unix:./gradlew build -Dorg.gradle.java.home=JDK_1.8.0 的路径

生成的模组 jar 文件将位于 /build/libs 中,可以粘贴到你的服务器的 mods 文件夹中。