游戏相关 已自动关闭

Mod开发时,使用Mixin给原版进度添加完成方式

QWER***Lv.3 中级会员 发表于 2025-1-10 · 最后回复 2025-1-11 IP:江苏省 2,381 6
本帖最后由 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在运行时需要安装前置模组的依赖。

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



回复 6 最早 最新 只看楼主
已注销***禁止访问
2025-1-10 10:16:40 · 来自手机 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# 2025-1-10 10:16:40 回复 收起回复
  • QWER*** 铁粒 +20 已自行解决,见灯纟火模组代码;不过还是感.
已注销***禁止访问
2025-1-10 10:18:49 · 来自手机 IP:安徽省
奶糖也不是很甜 发表于 2025-1-10 10:16
啊啊啊,基岩版开发者看不懂这玩意,但是ChatGpt给出的回答是:
在这种情况下,您可以使用SpongePowered Mi ...

至于为什么没用国产AI,因为感觉国产AI对于编程来说太奔awa
3# 2025-1-10 10:18:49 收起回复
已注销_ehRl1k 2025-1-10 10:19 IP:安徽省
回复 举报
太笨(指正)
QWER***楼主Lv.3 中级会员
2025-1-11 00:01:56 IP:江苏省
奶糖也不是很甜 发表于 2025-1-10 10:16
啊啊啊,基岩版开发者看不懂这玩意,但是ChatGpt给出的回答是:
在这种情况下,您可以使用SpongePowered Mi ...

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


我把完整的这个类的代码发过来,你重新看看
4# 2025-1-11 00:01:56 收起回复
已注销_ehRl1k 2025-1-11 11:03 IP:安徽省
回复 举报
GPT好像接受不了太长的字符awa
QWERTY770回复已注销_ehRl1k 2025-1-11 22:56 IP:江苏省
回复 举报
其实我有copilot使用权限的,我试过copilot生成代码,其他代码可以,Minecraft模组代码效果不太好(也可能是因为我Mod有自己API,它不认识)
您需要登录后才可以回帖 登录 | 立即注册
本版积分规则