开启辅助访问     
收藏本站

站内搜索

搜索

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

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

 发表于 16 小时前|显示全部楼层|阅读模式 IP:江苏省
200铁粒
本帖最后由 QWERTY770 于 2025-1-10 01:28 编辑

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

Minecraft 1.21.3中,相关进度的生成代码位于net.minecraft.data.advancements.packs.VanillaHusbandryAdvancements::generate方法中,代码如下:
  1. AdvancementHolder advancementHolder8 = 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, new ItemLike[]{Items.GLASS_BOTTLE}))).display(Items.HONEY_BOTTLE, Component.translatable("advancements.husbandry.safely_harvest_honey.title"), Component.translatable("advancements.husbandry.safely_harvest_honey.description"), (ResourceLocation)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在运行时需要安装前置模组的依赖。

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


苦力怕论坛,感谢有您~
 发表于 7 小时前 来自手机|显示全部楼层 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#7 小时前回复收起回复
苦力怕论坛,感谢有您~
回复

使用道具举报

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

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

使用道具举报

本版积分规则

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

QQ群

访问手机版

访问手机版

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

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

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

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