当前位置: 首页 > 知识库问答 >
问题:

用mixin重定向方法调用对LivingEntity不起作用。滴

籍靖
2023-03-14

我目前正在为Minecraft Fabric编程一个插件/服务器端模块,它可以改变玩家的死亡。更准确地说:当玩家死亡时,他们应该在某些情况下保留他们的库存。

为了实现这一点,我有一个扩展net的类。我的世界。实体游戏者PlayerEntity和“混入”课堂。我的世界。服务器网络服务器播放属性。现在,如果我调用此方法,我将onDeath(DamageSource source)中的方法调用重定向到我的方法中。在if语句后放置()。

@Redirect(method = "onDeath", at = @At(value = "INVOKE",
            target = "Lnet/minecraft/server/network/ServerPlayerEntity;drop(Lnet/minecraft/entity/damage/DamageSource;)V"))
    public void redirectDrop(ServerPlayerEntity instance, DamageSource damageSource) {
        LOGGER.log(Level.INFO, "Drop called");
        if (!countDeath) {
            LOGGER.log(Level.INFO, "Kept Items");
            return;
        }
        this.drop(damageSource);
        LOGGER.log(Level.INFO, "Dropped Items");
    }

如您所见,dro()方法在计算死亡时调用,而当不计算死亡时,则提前返回该方法。

但问题来了:

当死亡未计算时,玩家的库存仍然会清空,但不会掉落物品。但是我希望球员能够保留他们的库存,而不仅仅是让他们什么都不掉。关于这个的奇怪部分是在服务器游戏性中。onDeath有以下代码:

if (!this.isSpectator()) {
    this.drop(source);
}

这使得玩家在观众模式下被杀时保留他的物品。这是可行的,但不是我的代码。。。

有谁知道我做错了什么,或者能帮我吗?

谢谢你!

共有1个答案

盛辰沛
2023-03-14

在对Minecraft的代码进行了一些探索之后,我终于找到了解决问题的方法:

首先,我的代码运行得很好:当死亡未计算在内时,玩家不会丢弃物品。事实上,玩家的库存在重生后是空的,这与代码无关。drop()方法。

第二,当一个玩家重生了一个全新的网。我的世界。服务器网络已创建服务器播放实体(ServerPlayerEntity)。因此,新创建的ServerPlayer对象的库存为空。当在观众模式下死亡或KeepInventory设置为true时,旧ServerPlayer对象的清单将复制到新的。

最后,为了解决我的问题,我将代码注入到服务器PlayerEntity的onDeath(损坏源代码)方法中,该方法将其资源清册保存在地图中(UUID作为键)。为了使玩家恢复原状,我将其注入了网的respawnPlayer方法。我的世界。服务器PlayerManager,以便将旧ServerPlay对象的清单复制到新对象。为了获得新的ServerPlayer实例,我重定向了setMainArm()方法,然后再次调用它,这样行为就相同了。

我的代码如下所示:

@Redirect(method = "respawnPlayer", at = @At(value = "INVOKE",
            target = "Lnet/minecraft/server/network/ServerPlayerEntity;setMainArm(Lnet/minecraft/util/Arm;)V"))
    public void respawn(ServerPlayerEntity instance, Arm arm) {
        instance.setMainArm(arm);

        instance.getInventory().clone(INV_CACHE.get(instance.getUuid()));
        
    }
 类似资料:
  • 我正在寻找一些可以让我像Mongoid那样做的事情: 基本上,包含一个模块并使用其中声明的方法。但是我得到以下错误: 这是模块代码: 下面是课程代码: 我的ruby版本是2.1.2 编辑: 我在模块中使用了这个,它工作得很好:

  • 问题内容: 检查这样的情况后,我有一条重定向的路线 条件为真但未安装组件时,URL会更改。其余的组件代码如下。 我的应用程序组件包含在BrowserRouter中,例如thi 当我在浏览器中直接命中url时,例如’localhost:3000 / intro’组件已成功安装,但是当它通过重定向时,它不会显示该组件。我如何解决它? 因此缺少一个细节,我尝试创建另一个项目来重现该问题。我的App组件是

  • 问题内容: include(‘header.php’); 上面的代码不断给我重定向的问题。错误如下: 警告:无法修改标头信息-已在/ Applications / MAMP / htdocs / testygubbins / OO / test / form中发送的标头(输出始于/Applications/MAMP/htdocs/testygubbins/OO/test/header.php:15

  • 问题内容: 不知道为什么这不起作用。这是代码: 而不是重定向页面,此输出到网页。它跳过了重定向。为什么?我怎样才能解决这个问题?page1.php是一个实际页面,与当前页面位于同一文件夹中。上面的代码是php文件的第一行。没什么 没有。甚至没有空格。 问题答案: Pekka在评论中回答了我的问题。他没有发布答案,所以我现在是。标头重定向后使用此方法。由于某种原因,页眉的其余代码在header()方

  • 尝试调用一个java服务从PHP客户端使用curl函数。我的api期待一个json请求体,如下所示, 我的php客户端代码如下所示, 执行后,它显示一个空白的响应,我也可以访问服务器代码,试图把调试点在我的java代码,似乎超文本传输协议调用没有到达我的服务器。. 刚才执行var_dump(curl_getinfo($ch));得到下面的输出,数组(22){["url"]= 这意味着这是重定向到登

  • 我对symfony框架知之甚少。我复制了一个网站www.example。net访问www.example。com站点使用url 它不会重定向。 谢谢