—?—!
本帖最后由 —?—! 于 2022-9-1 10:35 编辑

已自行解决(答案:使用实体交互事件回调)


如题。假如现在有两个模组,他们都对AbstractMinecartEntity进行了注入,代码如下
A模组:
  1. package a.a;

  2. import ...

  3. @Mixin(AbstractMinecartEntity.class)
  4. public class AbstractMinecartEntityMixin extends Entity {
  5.     ...
  6.     @Override
  7.     public ActionResult interact(...) {...}
  8.     ...
  9. }
复制代码
B模组:
  1. package b.b;

  2. import ...

  3. @Mixin(AbstractMinecartEntity.class)
  4. public class AbstractMinecartEntityMixin extends Entity {
  5.      ...
  6.      @Override
  7.      public ActionResult interact(...) {...}
  8.      ...
  9. }
复制代码
如果游戏只装了其中任意一个模组,那导出的混入之后的AbstractMinecartEntity类里面会存在一个interact方法
但是如果同时装了两个模组,那这个interact方法只保留其中一个模组的interact功能,另一个模组的会凭空消失

请问有什么办法能让两个模组都安装时interact的功能都保留下来,并且两个模组单独安装时也不会出现问题吗?




ABlueCat
mixin里面并未提供@Override注解,你是不是想说@Overwrite ?
然后既然此问题提在了“Mod开发”里面,可以尝试B模组检测A模组是否存在,若存在就执行合并后的做法,不存在则执行单独的做法。


—?—!
ABlueCat 发表于 2022-8-29 20:27
mixin里面并未提供@Override注解,你是不是想说@Overwrite ?
然后既然此问题提在了“Mod开发”里面,可以 ...

我说的是jdk提供@Override,之所以这样做是因为AbstractMinecartEntity没有声明interact,不能直接注入,要自己写一个,用@Override只是为了强调这是继承自Entity的方法(不注解显然也会出现题目描述的问题)
另外,你说的方法具体怎样实现?是用代理吗?

Ph-苯
可以试试短路注入器,当检测到某个条件时就执行自己的方法,否则继续执行原版方法,这样合并之后就会类似于这样:
  1. if (A模组条件通过) {
  2.     执行A模组的方法;
  3.     return;
  4. }
  5. if (B模组的条件通过) {
  6.     执行B模组的方法;
  7.     return;
  8. }
  9. 执行原版方法;
复制代码

第一页 上一页 下一页 最后一页