Minecraft 1.19.2 Forge模组开发 11.Mixin

news/2023/6/7 0:00:38

我们本次使用Mixin在1.19.2中制作一个属于自己的不死图腾。

在这里插入图片描述

演示效果演示效果演示效果

什么是Mixin?

简单来说是通过注入一些我们的代码,达到对MC原版内容的修改。

详细内容可以参考Minecraft 17.1 Mixin

1.首先我们需要在开发包中引入mixin的依赖,来到项目的build.gradle文件:

build.gradle

plugins {id 'eclipse'id 'maven-publish'id 'net.minecraftforge.gradle' version '5.+'//引入这个mixin依赖id 'org.spongepowered.mixin' version '0.7-SNAPSHOT'
}version = "1.2.8-1.19"
group = "com.joy187.re8joymod"
archivesBaseName = "joy187"java.toolchain.languageVersion = JavaLanguageVersion.of(17)sourceSets.main.resources { srcDir 'src/generated/resources' }//设置你的mixin源文件名称
mixin {add sourceSets.main, "re8.refmap.json"
}minecraft {mappings channel: 'official', version: '1.19'accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg') // Currently, this location cannot be changed from the default.runs {client {workingDirectory project.file('run')property 'mixin.env.disableRefMap', 'true'property 'mixin.env.refMapRemappingFile', "${projectDir}/build/createSrgToMcp/output.srg"property 'forge.logging.markers', 'SCAN,REGISTRIES,REGISTRYDUMP'property 'forge.logging.console.level', 'debug'//客户端中指定你资源包中的mixin文件arg '-mixin.config=re8.mixins.json'mods {re8joymod {source sourceSets.main}}}server {workingDirectory project.file('run')property 'mixin.env.disableRefMap', 'true'property 'mixin.env.refMapRemappingFile', "${projectDir}/build/createSrgToMcp/output.srg"property 'forge.logging.markers', 'SCAN,REGISTRIES,REGISTRYDUMP'property 'forge.logging.console.level', 'debug'//服务端中指定你资源包中的mixin文件arg '-mixin.config=re8.mixins.json'mods {re8joymod {source sourceSets.main}}}data {workingDirectory project.file('run')property 'mixin.env.disableRefMap', 'true'property 'mixin.env.refMapRemappingFile', "${projectDir}/build/createSrgToMcp/output.srg"property 'forge.logging.markers', 'SCAN,REGISTRIES,REGISTRYDUMP'property 'forge.logging.console.level', 'debug'args '--mod', 're8joymod', '--all', '--output', file('src/generated/resources/')//数据包中指定你资源包中的mixin文件arg '-mixin.config=re8.mixins.json'mods {re8joymod {source sourceSets.main}}}}
}repositories {mavenLocal()maven {url "https://www.cursemaven.com"}maven {name "Progwml6 maven"url "https://dvs1.progwml6.com/files/maven/"}maven { url 'https://dl.cloudsmith.io/public/geckolib3/geckolib/maven/' }
//    maven {
//        name "ModMaven"
//        url "https://modmaven.k-4u.nl"
//    }maven {name = "Curios API"url = "https://maven.theillusivec4.top/"}
}dependencies {minecraft 'net.minecraftforge:forge:1.19.2-43.1.1'implementation fg.deobf('curse.maven:framework-549225:3873800')implementation fg.deobf('curse.maven:mrcrayfishs-gun-mod-289479:3874034')implementation fg.deobf('software.bernie.geckolib:geckolib-forge-1.19:3.1.36')compileOnly fg.deobf("mezz.jei:jei-1.19-common-api:11.0.0.211")compileOnly fg.deobf("mezz.jei:jei-1.19-forge-api:11.0.0.211")runtimeOnly fg.deobf("top.theillusivec4.curios:curios-forge:1.19.2-5.1.1.0")compileOnly fg.deobf("top.theillusivec4.curios:curios-forge:1.19.2-5.1.1.0:api")runtimeOnly fg.deobf("mezz.jei:jei-1.19-forge:11.0.0.211")//这里引入mixin依赖annotationProcessor 'org.spongepowered:mixin:0.8.5:processor'
}jar {manifest {attributes(["Specification-Title": "Resident Evil 8 mod","Specification-Vendor": "Joy187","Specification-Version": "1","Implementation-Title": "Resident Evil 8 mod","Implementation-Version": project.version,"Implementation-Vendor" : "Joy187",//"Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ"),//你资源包中的mixin配置文件"MixinConfigs": "re8.mixins.json"])}
}jar.finalizedBy('reobfJar')tasks.withType(JavaCompile).configureEach {options.encoding = 'UTF-8'
}publishing {publications {mavenJava(MavenPublication) {artifact jar}}repositories {maven {url "file:///X:/localmaven/mcmods"}}
}

之后选择刷新gradle项目:

cr0.jpg

2.重新构建完成后我们在资源包中新建一个我们的mixin文件,文件名称与上面"MixinConfigs"字段填写的名称一样:

cr1.jpg

之后在文件中写一些内容:

re8.mixins.json

{"required": true,"package": "com.joy187.re8joymod.mixin","compatibilityLevel": "JAVA_8","minVersion": "0.8","refmap": "re8.refmap.json","plugin": "com.joy187.re8joymod.mixin.MixinPlugin", //注意这个地址"mixins": [],"client": [],"injectors": {"defaultRequire": 1}
}

3.来到Java包中,在上一步中我们声明了一个plugin地址,按照这个路径创建一个MixinPlugin文件,作为模组的mixin启动器:

cr2.jpg

MixinPlugin.java

package com.joy187.re8joymod.mixin;import org.objectweb.asm.tree.ClassNode;
import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin;
import org.spongepowered.asm.mixin.extensibility.IMixinInfo;import java.util.List;
import java.util.Set;public class MixinPlugin implements IMixinConfigPlugin{private boolean isFrameworkInstalled;@Overridepublic void onLoad(String mixinPackage) {try {   //这个字符串对应你的项目主类Class.forName("com.joy187.re8joymod.Main", false, this.getClass().getClassLoader());isFrameworkInstalled = true;} catch (Exception e) {isFrameworkInstalled = false;}}@Overridepublic String getRefMapperConfig() {return null;}@Overridepublic boolean shouldApplyMixin(String targetClassName, String mixinClassName) {return isFrameworkInstalled; // this makes sure that forge's helpful mods not found screen shows up}@Overridepublic void acceptTargets(Set<String> myTargets, Set<String> otherTargets) {}@Overridepublic List<String> getMixins() {return null;}@Overridepublic void preApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) {}@Overridepublic void postApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) {}
}

之后我们在同样的包中新建一个LivingEntityMixin类,作为我们的注入类:

LivingEntityMixin.json

package com.joy187.re8joymod.mixin;import com.joy187.re8joymod.init.ItemInit;
import net.minecraft.advancements.CriteriaTriggers;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.stats.Stats;
import net.minecraft.world.damagesource.DamageSource;
import net.minecraft.world.effect.MobEffectInstance;
import net.minecraft.world.effect.MobEffects;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.player.Inventory;
import net.minecraft.world.item.ItemStack;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;@Mixin(LivingEntity.class)
public abstract class LivingEntityMixin {//这里我们将代码注入到checkTotemDeathProtection中,注入位置是其HEAD头部@Inject(method = {"checkTotemDeathProtection"}, at = {@At("HEAD")}, cancellable = true)private void checkTotemDeathProtection(DamageSource source, CallbackInfoReturnable<Boolean> info) {LivingEntity livingEntity = ((LivingEntity)(Object)this);if (livingEntity instanceof ServerPlayer player) {ItemStack itemStack = null;Inventory inventory = player.getInventory();//在背包中找到我们的物品for (int i = 0; i < inventory.getContainerSize(); i++) {ItemStack stack = inventory.getItem(i);if (stack.getItem().equals(ItemInit.BODYGUARD.get())) {itemStack = stack;break;}}//如果找到了,当我们陷入濒死之时就会使用该物品并给予玩家一个15s的生命回复效果if (itemStack != null) {player.awardStat(Stats.ITEM_USED.get(ItemInit.BODYGUARD.get()));CriteriaTriggers.USED_TOTEM.trigger(player, itemStack);itemStack.shrink(1);player.setHealth(10.0F);player.removeAllEffects();player.addEffect(new MobEffectInstance(MobEffects.REGENERATION, 300, 1));player.level.broadcastEntityEvent(player, (byte) 35);info.setReturnValue(true);}}}
}

把这个类的名称放入我们之前资源包中的注入文件中:

re8.mixins.json

{"required": true,"package": "com.joy187.re8joymod.mixin","compatibilityLevel": "JAVA_8","minVersion": "0.8","refmap": "re8.refmap.json","plugin": "com.joy187.re8joymod.mixin.MixinPlugin","mixins": ["LivingEntityMixin" //放在这里],"client": [],"injectors": {"defaultRequire": 1}
}

4.在ItemInit中注册我们的物品,作为图腾使用:

ItemInit.java

    public static final RegistryObject<Item> BODYGUARD = register("bodyguard",() -> new Item(new Item.Properties().tab(Main.TUTORIAL_TAB)));

在资源包中物品的名称、模型、贴图文件。

en_us.json

	"item.re8joymod.bodyguard":"Crystal",

模型文件

bodyguard.json

{"parent": "item/generated","textures": {"layer0": "re8joymod:item/bodyguard"}
}

贴图文件

在这里插入图片描述

5.启动游戏调试

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.exyb.cn/news/show-4559194.html

如若内容造成侵权/违法违规/事实不符,请联系郑州代理记账网进行投诉反馈,一经查实,立即删除!

相关文章

测试时出现警告:WARNING: An illegal reflective access operation has occurred WARNING: Illegal reflective acc

问题描述 今天在运行一个功能的测试用例的时候&#xff0c;出现了如下警告&#xff1a; WARNING: An illegal reflective access operation has occurred WARNING: Illegal reflective access by org.codehaus.groovy.vmplugin.v9.Java9 (file:/C:/Users/26808/.m2/repositor…

C/C++反汇编与逆向分析学习笔记(2)--反汇编静态分析工具IDA

所谓“静态分析”&#xff0c;是相对于前面提到的“动态分析”而言的。在“动态分析”过程中&#xff0c;调试器加载程序&#xff0c;并以调试模式运行起来&#xff0c;分析者可以在程序的执行过程中观察程序的执行流程和计算记过。但是&#xff0c;在实际分析中&#xff0c;很…

linux设备树概念及使用方法简述

设备树&#xff08;DT&#xff09;是易于阅读的硬件描述文件&#xff0c;它采用JSON式的格式化风格&#xff0c;在这种简单的树形结构中&#xff0c; 设备表示为带有属性的节点。属性可以为空&#xff08;只有键&#xff0c;用来描述布尔值&#xff09;&#xff0c;也可以是键值…

【Blender】源代码分析_第三方库的说明

Blender 使用了不少第三方库&#xff0c;使用freemind绘图如下所示&#xff0c;注释部分有些不能准确翻译的请留言帮忙修正。 Blosc Blosc - Blocked Shuffling and Compression Library Embree Embree is a collection of high-performance ray tracing kernels, developed a…

FPGA知识汇集-关于Xilinx 工具报告

工具报告概述 FPGA综合和物理实现工具产生许多种报告,包含了错误和警告、逻辑利用、设计频率、时序、时钟等信息。需要设计者了解大量有关设计工具的知识才能阅读报告,以及迅速找到所需信息。Xilinx 和其他 FPGA 设计工具还能将报告中的一些最重要和最常用的信息用图形显示出来…

Vue+Element 国际化(i18n)

第一步&#xff1a;安装 i18n 这里为了让 Element 兼容&#xff0c;安装的是 8 版本的 npm install vue-i18n8 第二步&#xff1a;在 src 目录下新建一个i18n文件 一般有三个文件&#xff1a;index.js( 配置 )、zh( 中文 )、en( 英文 ) 如果有个更多的语言设置&#xff0c;新…

ise 界面参数

7.5 实现属性参数设置选项功能1)翻译属性(Translate Properties)&#xff1a;a、使用位置约束(Use LOC Constraints)&#xff1a;指定在输入网表或者UCF文件中是否使用位置约束&#xff0c;当设置为否时&#xff0c;NGDBuild忽略任何会导致错误的无效位 置信息&#xff0c; 在命…

【黑马学成在线2023版】解决P7创建父工程时Maven的pom文件依赖爆红问题(亲测有效)

本期目录问题描述解决方案问题描述 感谢黑马贡献的高质量视频教程《学成在线》微服务项目。笔者在学到《P7-创建父工程基础工程》时&#xff0c;直接粘贴黑马老师的 pom 文件中的依赖会出现依赖的 <artifactId> 和 <version> 爆红&#xff0c;显示无法找到依赖的错…