neogeo游戏怎么玩

引言:本文旨在教给各位牢记原版游戏内容,方便将其破碎重组,更轻松和摆烂地实现模组功能; 模组功能流程: ①兼容式、节约资源式写法:监听器检测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