开启辅助访问     
收藏本站

站内搜索

搜索

Minecraft(我的世界)苦力怕论坛

[游戏相关] Mod开发时,使用Mixin给原版进度添加完成方式

 发表于 前天 01:25|显示全部楼层|阅读模式 IP:江苏省
200铁粒
本帖最后由 QWERTY770 于 2025-1-11 00:06 编辑

我想给原版“与蜂共舞”进度添加一个准则,使得使用带有#firefly8:tinted_bottles标签的物品,对着smokey=true的带有#minecraft:beehives标签的方块使用时,也能完成该进度

Minecraft 1.21.3中,相关进度的生成代码位于net.minecraft.data.advancements.packs.VanillaHusbandryAdvancements::generate方法中,代码如下:
  1. AdvancementHolder advancementHolder8 = Advancement.Builder.advancement().parent(advancementHolder).addCriterion("safely_harvest_honey", ItemUsedOnLocationTrigger.TriggerInstance.itemUsedOnBlock(LocationPredicate.Builder.location().setBlock(BlockPredicate.Builder.block().of(holderGetter3, BlockTags.BEEHIVES)).setSmokey(true), ItemPredicate.Builder.item().of(holderGetter2, Items.GLASS_BOTTLE))).display(Items.HONEY_BOTTLE, Component.translatable("advancements.husbandry.safely_harvest_honey.title"), Component.translatable("advancements.husbandry.safely_harvest_honey.description"), null, AdvancementType.TASK, true, true, false ).save(writer, "husbandry/safely_harvest_honey");
复制代码


这个类的完整源代码:


进度准则需要在save方法执行之前添加,但是此时无法捕获变量,无法获得执行save方法的Advancement.Builder对象。

我不知道如何获取这行代码恰好在save方法还未执行时的值。

不要修改Advancement.Builder::save或者Advancement.Builder::build方法,因为这会引发兼容性问题,将和我开发的另一个Mod不兼容。

请给出一段代码(或实现思路,只要能被我看懂即可),在Minecraft 1.21.3版本中,基于官方混淆映射表,实现上述需求。可以使用SpongePowered Mixin,也可以使用其他工具,但请不要引入除Architectury API,Fabric API和NeoForge API以外的、会使得Mod在运行时需要安装前置模组的依赖。

最后,把帖子发在这里(而不是编程分享版块-编程求助)是为了给出更多悬赏金,希望能有更多的坛友对我予以帮助与指导。



苦力怕论坛,感谢有您~
 发表于 前天 10:16 来自手机|显示全部楼层 IP:安徽省
啊啊啊,基岩版开发者看不懂这玩意,但是ChatGpt给出的回答是:
在这种情况下,您可以使用SpongePowered Mixin来拦截生成代码中的内容,并添加您需要的准则。下面是一个简单的示例代码,用于在生成进度时动态添加您的准则:

```java
@Mixin(VanillaHusbandryAdvancements.class)
public class MixinVanillaHusbandryAdvancements {
   
    @Shadow
    private void generate() {
    }

    @Inject(method = "generate", at = @At("HEAD"), cancellable = true)
    private void addCustomCriterion(CallbackInfo ci) {
        // 检查是否满足添加条件,例如判断是否在Minecraft 1.21.3中
        if (yourConditionHere) {
            Advancement.Builder advancementBuilder = ...; // 获取Advancement.Builder对象的方法

            advancementBuilder.addCriterion("your_custom_criterion", YourCustomCriterionTrigger.TriggerInstance.customCriterion(), YourCustomItemPredicate.builder())
                    .save(writer, "husbandry/safely_harvest_honey");

            ci.cancel();
        }
    }
}
```

在上面的代码中,您需要替换`yourConditionHere`、`YourCustomCriterionTrigger`和`YourCustomItemPredicate`为您自己的条件、触发器和物品准则。您还需要添加获取`Advancement.Builder`对象的方法,以确保正确地获取并修改生成的进度。

请注意,这只是一个示例代码,您需要根据实际情况进行适当的修改和调整。在编写代码时,请注意Mixin的注解和方法的位置,以确保正确地拦截和修改生成进度的过程。希望对您有帮助!如果有任何问题,请随时问我。
2#前天 10:16回复收起回复
苦力怕论坛,感谢有您~
回复

使用道具举报

 发表于 前天 10:18 来自手机|显示全部楼层 IP:安徽省
奶糖也不是很甜 发表于 2025-1-10 10:16
啊啊啊,基岩版开发者看不懂这玩意,但是ChatGpt给出的回答是:
在这种情况下,您可以使用SpongePowered Mi ...

至于为什么没用国产AI,因为感觉国产AI对于编程来说太奔awa
3#前天 10:18收起回复
奶糖也不是很甜前天 10:19IP:安徽省
回复举报
太笨(指正)
苦力怕论坛,感谢有您~
回复

使用道具举报

 楼主|  发表于 昨天 00:01|显示全部楼层 IP:江苏省
奶糖也不是很甜 发表于 2025-1-10 10:16
啊啊啊,基岩版开发者看不懂这玩意,但是ChatGpt给出的回答是:
在这种情况下,您可以使用SpongePowered Mi ...

你这样岂不是把整个方法都取消了,而我只想修改其中一行


我把完整的这个类的代码发过来,你重新看看
4#昨天 00:01收起回复
奶糖也不是很甜昨天 11:03IP:安徽省
回复举报
GPT好像接受不了太长的字符awa
QWERTY770回复奶糖也不是很甜昨天 22:56IP:江苏省
回复举报
其实我有copilot使用权限的,我试过copilot生成代码,其他代码可以,Minecraft模组代码效果不太好(也可能是因为我Mod有自己API,它不认识)
苦力怕论坛,感谢有您~
回复

使用道具举报

本版积分规则

本站
关于我们
联系我们
坛史纲要
官方
哔哩哔哩
技术博客
下载
网易版
安卓版
JAVA
反馈
意见建议
教程中心
更多
捐助本站
QQ群
QQ群

QQ群

访问手机版

访问手机版

手机版|小黑屋|系统状态|klpbbs.com

粤公网安备 44200002445329号 | 由 木韩网络 提供支持 | GMT+8, 2025-1-12 06:41

声明:本站与Mojang以及微软公司没有从属关系

Powered by Discuz! X3.4 粤ICP备2023071842号-3