本篇教程由作者设定未经允许禁止转载。

前言

本文主要用于解释部分服主在试图开设关于Vault Hunter 3(以下简称VT3)相关服务器时遇到的各类问题以及对应的解决方法。文中所有的角度均是从服主的角度出发,请谨慎观看。

本文大多内容是出于各种资料/经验综合而成,并不能完全保证所述说法正确,但至少能保证按照如此步骤可以实现预期结果。

本文涉及方面包含部分魔改内容,无相关经验者可以选择性跳过

正文

与Curseforge上的绝大多数的整合包类似,VT3也提供了能够直接用于开服的Server包。你可以通过该Server包直接开启一个基于Forge的服务器。这是VT官方推荐的构建方式,用该方式构建的服务器能够满足绝大多数你对于宝库猎人的需求。但是倘若你想要开一个基于空岛地图的宝库猎人/包含插件的混合端/商业化的宝库猎人服务器。那么仅仅使用官方Forge端是绝对不够的。因此我们的问题将会分为以下几点。

该选择什么核心对于VT3混合端


  • 警告:使用非Forge端将会导致部分宝库猎人技能失效,但是会优化VT包整体性能,请权衡!

很多想要基于本整合包开启大型服务器的玩家会尝试构建一个混合端(可以添加Mod和插件的服务端),类如使用arclight、catserver核心的服务端。但绝大多数的玩家在构建该服务端的时候遇到了此类问题。

宝藏猎人服务端1.18在arclight核心环境下启动崩溃该如何解决 - 崩溃解答 - MC百科社群 - MC百科|最大的Minecraft中文MOD百科 (mcmod.cn)

在尝试构建此类端的时候,我也遇到了类似问题,并且找到了几乎相同的报错,但由于版本原因,还是有些区别,在此例中则是

[10:07:25 FATAL] [mixin]: Mixin apply failed mixins.arclight.core.json:world.item.ItemStackMixin -> net.minecraft.world.item.ItemStack: org.spongepowered.asm.mixin.injection.throwables.InvalidInjectionException @At("JUMP") on net/minecraft/world/item/ItemStack::arclight$itemDamage with priority 500 cannot inject into net/minecraft/world/item/ItemStack::m_41629_(ILjava/util/Random;Lnet/minecraft/server/level/ServerPlayer;)Z merged by iskallia.vault.mixin.MixinItemStack with priority 1001 [PREINJECT Applicator Phase -> mixins.arclight.core.json:world.item.ItemStackMixin -> Prepare Injections ->  -> localvar$bhf000$arclight$itemDamage(IILjava/util/Random;Lnet/minecraft/server/level/ServerPlayer;)I -> Prepare]

其实这类问题可以归结为Mixin注册错误,经过我个人的尝试,国内的ArcLight、CatServer等服务端均无法正常启动VT3服务端,而且报错类型完全相同。推测原因可能是此类服务端中对于Mod的处理方式存在问题/使用了部分优化策略导致。

在寻找多方资料后,找到了一个可能的解释,归结如下:


经过尝试,国内ArcLight、catserve等服务端一并无法启动,原因为the_vault这个自创mod中引用了一些mixin方法,而这些方法在混合端中无法加载。

举个例子,类如arcLight之类的端是通过类似于把mod以插件的加载形式导入到服务器中,这意味着对于mod的兼容性较差——因为服务端中可能丢失部分原本forge端应有的方法。

因此想要通过混合端来运行包含the_vault的整合包,则需要选择一款能够将插件以mod形式导入的服务端,即对插件兼容性较差,但对mod兼容性良好的服务端。


因此最后我选择了Magma端作为服务端核心,成功的避免了Mixin方法缺失导致的报错。如果你不知道Magma端,那你可以通过此链接进行下载。

https://magmafoundation.org/

请注意,该服务端进行构建libraries时需全程保证魔法上网且网络良好,否则会因为无法获取部分资源(如无法下载maven中管理的依赖)而导致服务启动失效。

关于Vault Hunter服务器你必须知道的两三事-第1张图片

上图即为通过Magma端开启的服务器展示,其中使用的点歌插件为Zmusic。


如何在宝库猎人包中修复抽屉刷物品bug


如果你是一个VT资深玩家,想必一定知道大名鼎鼎的机械臂抽屉bug。通过这个bug可以让玩家几乎无限制的、可自动化的、呈指数级的刷任意他们想要的物品。这对于一个大型服务器/试图商业化的服务器来说是不可接受的bug。因此如何进行修复是一个极其重要的问题。相比其他bug,该bug使用成本过低且带来影响即为严重,个人认为所有的公开宝库猎人服务器都应该对此bug进行修复。

如果你不知道该bug,你可以通过该链接导向到相关Mod特性查看,或者在本教程旁边的VT详细教程中最后一部分查看具体的使用方法。这里并不推荐你在其他的宝库猎人服务器中使用该bug,虽然我也不满于宝库猎人默认设置的数值,但此种bug对于游戏寿命的缩短极其严重. . .

关于Vault Hunter服务器你必须知道的两三事-第2张图片

机械手抽屉复制 - MOD特性警示 - MC百科|最大的Minecraft中文MOD百科 (mcmod.cn)

在该特性警示下方,有着SkyIce同学提供的基于kubejs的修复方法。从kubejs修复的代码可以看到其内容非常简单,翻译过来即为:监听<方块破坏>事件,如果被破坏的方块属于<储物抽屉方块列表>,且用户主手物品不为<空>,则取消掉该次破坏事件。

这个逻辑确实能够解决机械手破坏储物抽屉导致复制的问题,但带来的影响即为如果你不空手,理论上是不能破坏储物抽屉的方块的。那这样从修复的角度来说,其实玩家是有感知的。这并不是一个最优的修复方案。并且,由于VT使用的是基于Crafttweaker(简称ctr)的魔改系统,因此为了修复这个问题而引入一个kubejs作为魔改mod也是不够优雅的。

关于Vault Hunter服务器你必须知道的两三事-第3张图片


我给出的方法则是基于craftTweaker的方案,也是比较简单。首先,我通过println监听了一下我所想要的几种属性,如:

println("Player " + event.player.name.getContents()); // 获取破坏方块的玩家名称

关于Vault Hunter服务器你必须知道的两三事-第4张图片

这样,我们在使用机械手破坏方块的时候,就可以获取到机械手这个FakePlayer的具体名称。修改后,在游戏中使用/reload重载,然后查看.minecraft\versions\Vault Hunter 3.10.1\logs中的crafttweaker.log。

关于Vault Hunter服务器你必须知道的两三事-第5张图片

可以看到,这个假玩家的名称就叫做Deployer(机械手的英文名称)。这样剩下的工作就很简单了。

关于Vault Hunter服务器你必须知道的两三事-第6张图片

如图所示,我通过检测物品被破坏时的物品modId是否为储物抽屉以及玩家是否为名为Deployer的假玩家禁止了这种刷物品的行为。在一般的游玩中,Create几乎很少和StroageDrawer联动,原因为drawer不能很好的作为一个缓存容器出现在Create的联动机构中,所以唯一可能会影响的地方是某些使用Create制作的打包机可能会想要采用储物抽屉作为打包方式。

至于更底层的解决方法,最好还是在代码层面进行解决。在魔改层面的话,目前来看这已经是最精简的解法。更好的方式则是直接清除掉该block而并不取消该破坏事件。但清除方块往往会导致另外一些奇怪的情况,所以我并不推荐这种修改方式,但我很乐意给大家演示一下代码,只需要修改最后一行即可。

关于Vault Hunter服务器你必须知道的两三事-第7张图片

该修改方法已经在相关Git页面中提起Issue,需要的服主可以自取。A Method FixCpoy Based on CraftTweaker · Issue #2 · SkyIce0229/FixCopy (github.com)。该Gif则为使用第二种方法进行修复的情况,基本达到了信达雅的要求。

  • 请注意,上文方法已经过期!该方法已无效!!!!!!!上文作为一部分核心逻辑仅保留作为参考!!!下文将会解释原因以及应对方法!!!!


    经过评论区提醒,我在新版的Create中发现,上文中获取Deployer的方法返回的值已经变为对应放置的玩家的id。可以查看放置的机械手,发现其NBT里面多储存了玩家的uuid,在获取假玩家时采用了部分放置玩家(下称owner)的部分属性。我个人猜测如此修复的主要目的为改善部分mod的假人权限问题,包括部分服务器核心对于假人的鉴权问题。

关于Vault Hunter服务器你必须知道的两三事-第8张图片

    因此,上文通过鉴别机械手的id的方法无效。因此将会采用,抽屉仅能通过空手破坏的方法来进行修复。


import crafttweaker.api.events.CTEventManager;

CTEventManager.register<crafttweaker.api.event.block.BlockBreakEvent>((event) => {
    if(event.state.block.registryName.getNamespace() == "storagedrawers"){
        if (event.player.getMainHandItem().asIItemStack() != <item:minecraft:air>) {
            event.player.sendMessage("哦呦!似乎该物品只能空手破坏!");
            event.setCanceled(true);
        }
    }
});

    该代码意为只要抽屉的方块被破坏,那么就判断是否主手使用工具,如果没有,那么就允许破坏,否则会阻止破坏行为,并发送提示。你只需要将改代码保存为任意名称.zs文件,放置在script文件中,即可保证该bug被修复。


如何正确开启一个空岛维度的宝库猎人服务器


首先请允许我指出一个罪魁祸首Terralith。在这个mod的加持下,服务端是不能通过改配置来生成除正常世界以外的任何世界类型的,不光是宝库空岛世界,甚至BOP、超平坦乃至于自己创建的存档导入都会被强制改为正常的维度生成。(原因是因为Terralith会覆盖所有世界类型的生成,你需要删掉这个逆天mod,或者说数据包)

在删除掉这个mod之后,游戏内容几乎不会有任何影响(更何况你是空岛,这个mod其实是一个地形生成类的)。此时你需要一个能够让你生成空岛维度的mod,在这里我找到了两款mod,分别是Sky Vaulters SupportMadOlive's Multiplayer SkyVaults。这两款mod都可以用相同的方式生成空岛世界,即 在本地游戏中生成一个空岛世界存档,而后把该存档更名为world后放入服务端内即可。

这两款mod的不同是,Sky Vaulters Support的使用者较少,但它有着优良的(跟插件一样的)箱子界面,允许玩家通过GUI直接调整空岛权限更改生态群系,并且其处于活跃更新状态。

关于Vault Hunter服务器你必须知道的两三事-第9张图片

MadOlive's Multiplayer SkyVaults的使用者虽然更多,但. . .没了,没啥优点。



该类mod的使用方法是完全相同的,在通过上文的方法导入了一个你自己生成的空岛世界后,只要你保证该mod正常安装,就可以以空岛的方式进行愉快的游玩了,没有任何需要额外注意和配置的点。


后记

个人不推荐使用VT3作为基础来开设RPG服务器,因为VT3作者经常腹泻式更新,而且mod更新需要客户端同步更新,成本异常高,且宝库猎人的游戏模式非常有限,重复度较高反馈较低,因此对于有想法的各位,我推荐开设插件RPG服。当然如果你和我一样是蹭热度开服的那无所谓。

最后,如果各位有需要的话,我可以将我目前用于开服的改良包上传至此。希望这篇教程对你有所帮助。

我已将我服务器使用的服务端和导入包发布在此云盘链接中,点击即可下载