本帖最后由 —?—! 于 2022-9-1 10:35 编辑
已自行解决(答案:使用实体交互事件回调)
如题。假如现在有两个模组,他们都对AbstractMinecartEntity进行了注入,代码如下
A模组:
复制代码B模组:
复制代码如果游戏只装了其中任意一个模组,那导出的混入之后的AbstractMinecartEntity类里面会存在一个interact方法
但是如果同时装了两个模组,那这个interact方法只保留其中一个模组的interact功能,另一个模组的会凭空消失
请问有什么办法能让两个模组都安装时interact的功能都保留下来,并且两个模组单独安装时也不会出现问题吗?
已自行解决(答案:使用实体交互事件回调)
如题。假如现在有两个模组,他们都对AbstractMinecartEntity进行了注入,代码如下
A模组:
- package a.a;
- import ...
- @Mixin(AbstractMinecartEntity.class)
- public class AbstractMinecartEntityMixin extends Entity {
- ...
- @Override
- public ActionResult interact(...) {...}
- ...
- }
- package b.b;
- import ...
- @Mixin(AbstractMinecartEntity.class)
- public class AbstractMinecartEntityMixin extends Entity {
- ...
- @Override
- public ActionResult interact(...) {...}
- ...
- }
但是如果同时装了两个模组,那这个interact方法只保留其中一个模组的interact功能,另一个模组的会凭空消失
请问有什么办法能让两个模组都安装时interact的功能都保留下来,并且两个模组单独安装时也不会出现问题吗?
mixin里面并未提供@Override注解,你是不是想说@Overwrite ?
然后既然此问题提在了“Mod开发”里面,可以尝试B模组检测A模组是否存在,若存在就执行合并后的做法,不存在则执行单独的做法。
然后既然此问题提在了“Mod开发”里面,可以尝试B模组检测A模组是否存在,若存在就执行合并后的做法,不存在则执行单独的做法。
ABlueCat 发表于 2022-8-29 20:27
mixin里面并未提供@Override注解,你是不是想说@Overwrite ?
然后既然此问题提在了“Mod开发”里面,可以 ...
我说的是jdk提供@Override,之所以这样做是因为AbstractMinecartEntity没有声明interact,不能直接注入,要自己写一个,用@Override只是为了强调这是继承自Entity的方法(不注解显然也会出现题目描述的问题)
另外,你说的方法具体怎样实现?是用代理吗?
可以试试短路注入器,当检测到某个条件时就执行自己的方法,否则继续执行原版方法,这样合并之后就会类似于这样:复制代码
- if (A模组条件通过) {
- 执行A模组的方法;
- return;
- }
- if (B模组的条件通过) {
- 执行B模组的方法;
- return;
- }
- 执行原版方法;