
引言:本文旨在教给各位牢记原版游戏内容,方便将其破碎重组,更轻松和摆烂地实现模组功能;
模组功能流程:
①兼容式、节约资源式写法:监听器检测PlayerTickEvent,每几秒执行一次检测,检测中心区域几格范围内有没有营火,有则应用生命恢复效果几秒。
②难兼容、易恶意攻击式写法:mixin修改CampfireBlockEntity.clas,头部注入cookTick与cooldownTick方法,每几秒执行一次检测,检测中心区域几格范围内有没有玩家,有则应用生命恢复效果几秒。
方法对比:mixin容易破坏兼容性,但性能较好,写模组过程中可以作为备选方案使用,其次,营火与玩家数量做对比,自然是营火多玩家少,所以①肯定要比开销小。
但是本文讲第二种方法,因为mixin的教程有点少,等用到我会逐一解释;
①安装mixin,这个不讲,我们直接在mixin包下创建一个CampfireBlockEntityMixin类,这个类就是我们的所有功能所在地方:
//此声明指的是我们即将注入的类
@Mixin(CampfireBlockEntity.class)
public abstract class CampfireBlockEntityMixin extends BlockEntity {
//继承父类,并生成super构造器
public CampfireBlockEntityMixin(BlockEntityType<?> type, BlockPos pos, BlockState blockState) {
super(type, pos, blockState);
}
//此处我们介绍注解@Inject,这个是最常用的几个注解,一般使用在方法注入额外功能上,其参数一个是method = "cookTick",代表我们要用下面的方法代理注入这个cookTick方法,at = @At("HEAD")这句代表我们要注入的位置,HEAD代表头部(投币),可以理解为方法的第一行,类似还有RETURN, TAIL, INVOKE, INVOKE_ASSIGN, FIELD, NEW, INVOKE_STRING, JUMP and CONSTAN,太多不看,其中RETURN、TAIL与HEAD类似,都是一些相对位置,TAIL是指最后一个return,而RETURN是所有return,需要指明第几个,不然会全部应用,这些用到再讲;
@Inject(method = "cookTick", at = @At("HEAD"))
private static void healTick1(Level level, BlockPos pos, BlockState state, CampfireBlockEntity blockEntity, CallbackInfo ci) {
//方法名无所谓,如果你有IDEA,大概率是不需要自己填写形参的,形参应当与原方法一致,如果需要回调变量(返回值),可以加上形参CallbackInfo ci,接着写入你想注入的代码即可(日子变好了,这玩意可比ASM好用多了)
funcZip$applyEffect(level, pos); }
//同理,可以对照查看
@Inject(method = "cooldownTick", at = @At("HEAD"))
private static void healTick2(Level level, BlockPos pos, BlockState state, CampfireBlockEntity blockEntity, CallbackInfo ci) {
funcZip$applyEffect(level, pos);
}
//此注解类似兼容声明,防止方法与原类成员冲突,这个方法就是个普通方法,只是我喜欢把主体功能模块化外置所以才有了这个方法
@Unique
private static void funcZip$applyEffect(Level level, BlockPos pos) {
//判断是否服务端,是否是四秒一次(80tick)
if (!level.isClientSide && level.getGameTime() % 80L == 0L) {
//范围
double d0 = 5;
//强度 从0开始计数
int i = 0;
//时间(tick)
int j = 85;
//形成区域
AABB aabb = (new AABB(pos)).inflate(d0).expandTowards(0.0, level.getHeight(), 0.0);
//获取区域内玩家
List
list = level.getEntitiesOfClass(Player.class, aabb);
//迭代器遍历
Iterator var11 = list.iterator();
Player player1;
while(var11.hasNext()) {
player1 = var11.next();
//应用生命恢复效果REGENERATION(不是Heal)
player1.addEffect(new MobEffectInstance(MobEffects.REGENERATION, j, i, true, true)); }
}
}
}
②在resources/MODID.mixins.json中添加刚刚的类
{
"required": true,
//mixin版本
"minVersion": "0.8",
//包位置
"package": "god.MODID.mixin",
//编译兼容
"compatibilityLevel": "JAVA_8",
//本文件
"refmap": "MODID.refmap.json",
//写入此list的文件在服务端和客户端都会进行注入
"mixins": [
"CampfireBlockEntityMixin"
],
//仅在客户端注入
"client": [
"FishingHookmixin"
],
"injectors": {
"defaultRequire": 1
}
}
至此,注入成功;
-
声明:本文由搏战智远攻略网独家原创,未经允许,严禁转载!如有侵权请邮箱联系352082832@qq.com