跳转到主要内容

如何正确删除区块删除玩家背包物品 - 致模组服新手OP/腐竹

本文撰写于 2020/07/03 且方法较为简单粗暴,可能已失去部分参考价值。

排版瞎排的,因为要发 MCBBS。

本文并没有骗到绿宝石。

在模组服中,腐竹可能会遇到以下问题:

某个玩家无法进入服务器/玩家进入某个范围服务器就崩溃/玩家拿出某个物品服务器就崩溃

这些问题一直是许多腐竹的心头大患,今天我就来教大家缓解此问题。


解决这些问题的通常做法是回档,但是作为一个大型服务器,回档会导致很多问题。

更高级的办法是查看崩溃报告,检查该模组是否开源,报告问题,或是直接尝试修复。

今天我们要教的是一种简单粗暴的方式,直接删除地图文件中出问题的物品或方块。


打开 Forge 的自动移除错误功能

打开 forge 配置文件
这个文件在
1.16.5 以下服务端/config/forge.cfg
1.16.5 及以上服务端/world/serverconfig/forge-server.toml   (world 是你的存档文件夹)
找到这两行

B:removeErroringEntities=false
B:removeErroringTileEntities=false

把 false 改成 true

B:removeErroringEntities=false
B:removeErroringTileEntities=false

这样 Forge 在遇到 Entities实体 或者 TileEntities 错误时能自动的把错误的物品移除,大大减少了蹦服几率。

这样做的代价是可能会导致某些物品凭空消失,不过我目前没遇到过。

但是这样也不是能100%解决的。


区块文件和玩家文件的位置

首先我们打开存档文件夹,通常能看到一下几个文件夹

image-1593773456602.png

region 文件夹内储存的是主世界的区块文件,其他世界的区块文件存在对应世界编号文件夹里面的 region 文件夹

在控制台输入 forge tps 能看到对应编号的世界是哪一个

image-1593773768830.png

playerdata 文件夹内储存的是玩家数据,包括背包,所在位置等。


当玩家使用某物品崩服时

我们举一个栗子

某玩家报告说自己拿出某种物品时,客户端/服务端崩掉了,拿的是什么已经不记得了。

1.问玩家的ID是多少

2.如果是正版服务器,到 https://mcuuid.net/ 输入 ID 查询 UUID。

例如 10935336 的 UUID 是 2b09d9e5-0f4c-4949-b476-9d50acbe3b98

3.如果是盗版/离线服务器,把 OfflinePlayer:玩家ID 进行 32 位 MD5 加密得到的就是玩家UUID

例如 OfflinePlayer:10935336 进行 32 位 MD5 加密得到的是 AC4149B4A41DD357DA160254C5AB4314
对应的 UUID 是 ac4149b4-a41d-3357-9a16-0254c5ab4314

MD5加密工具:https://tool.chinaz.com/tools/md5.aspx

image-1593774784857.png

4.下载 NBTexplorer 下载地址 https://github.com/jaquadro/NBTExplorer/releases

5.到 存档文件夹里面的 playerdata 内找到玩家对应的 UUID.dat 文件,比如 2b09d9e5-0f4c-4949-b476-9d50acbe3b98.dat

6.使用 NBTexplorer 打开

image-1593775922958.png

Inventory 里面就是玩家背包内的物品,点击+号就能看到物品名称等详细信息

7.查看崩溃报告找到是什么东西蹦服的,或是直接问玩家

比如说是这本任务书(questbook:itemquestbook)导致的蹦服,我们选中这个 4 entries 按下键盘上的 Del 删除按键,然后按上面的保存按钮保存。

image-1593776111194.png

然后把修改后的文件放回服务端的存档文件夹原位,重启服务器。

Duang 玩家背包里的任务书不见了,崩溃也不复存在。


当某个区块导致蹦服时

我们举一个栗子

某玩家报告说自己在地上放了一个方块,然后自己客户端崩了。而且不记得坐标。

1.问玩家的ID是多少,并问清楚在哪一个世界崩溃的

2.如果是正版服务器,到 https://mcuuid.net/ 输入 ID 查询 UUID。

例如 10935336 的 UUID 是 2b09d9e5-0f4c-4949-b476-9d50acbe3b98

3.如果是盗版/离线服务器,把 OfflinePlayer:玩家ID 进行 32 位 MD5 加密得到的就是玩家UUID

例如 OfflinePlayer:10935336 进行 32 位 MD5 加密得到的是 AC4149B4A41DD357DA160254C5AB4314
对应的 UUID 是 ac4149b4-a41d-3357-9a16-0254c5ab4314

MD5加密工具:https://tool.chinaz.com/tools/md5.aspx

image-1593774784857.png

4.下载 NBTexplorer,下载地址 https://github.com/jaquadro/NBTExplorer/releases

5.到 存档文件夹里面的 playerdata 内找到玩家对应的 UUID.dat 文件,比如 2b09d9e5-0f4c-4949-b476-9d50acbe3b98.dat

6.使用 NBTexplorer 打开

image-1593776460005.png

Pos 里面就是玩家所在的坐标,图中的坐标就是 X:-208   Z:-777   Y:141 注意正负号

7.使用 Dinnerbone 的坐标工具来得到所在的区块文件。

(Dinnerbone 似乎一直在养病,网站未维护打不开了,下面几个网站也是一样的用法)

或是在 Minecraft Wiki 上查看手动计算方法:

 

 在第一栏输入玩家所在的坐标,注意正负号

然后第三栏就会出现,对应的区块文件的名字

image-1593776781348.png

如图所示,我们得到的区块文件是 r.-1.-2.mca

 

8.打开对应世界对应维度的 reign 文件夹,找到 r.-1.-2.mca ,使用 NBTexplorer 打开


9.查看 Dinnerbone 的坐标工具的第二行,我这里是 X:-13 Z:-49 ,Y 不需要。

image-1593776881101.png

我们选中这个 Chunk 按下键盘上的 Del 删除按键,然后按上面的保存按钮保存。

然后把修改后的文件放回服务端的存档文件夹原位,重启服务器。

Duang 这个区块回到了被删除了,崩溃也不复存在。