本篇教程由作者设定未经允许禁止转载。

Simple Animated Guns模组枪械属性修改简易教程

环境:Windows11、Java"17.0.11" 2024-04-16 LTS 64-Bit、PCL2或其他启动器

工具:Vscode


省略我半小时的翻看源代码的心路历程,我们直入正题吧…本文并不复杂,只要不是纯小白,都可一战

在此之前你需要准备的是:

  • 原mod项目

  • 一个能用的编辑器,如Vscode、Sublime

  • Java17环境




Clone或下载原作者项目

原作者项目地址:Simple-Animated-Guns

由于没有官方修改枪械属性的相关教程,所以我的思路是通过开源的源工程文件进行代码审计,修改好属性后将其编译成一个我们的自定义版本。本文仅供学习参考。

赞美原作者!!!Fabric的枪械mod真的很少!


进行以下的步骤前,请先确认你操作的分支是否为你需要的分支:

Fabric可用的Simple Animated Guns模组枪械属性修改简易教程-第1张图片

比如我玩的BetterMC是1.20.1的,所以我就选择了对应的版本。然后我们需要把原作者的项目搞到本地来,因为我们要进行修改嘛。这里不论是 Git clone 还是下载成压缩包都是需要一定"本事"的,有能力的可以自行下载到本地,我这里直接提供lanZouYun的下载链接在文末,请自行下载需要的版本分支项目。



准备好编辑器

我推荐使用vsocde作为编辑器,这个编辑器在Microsoft store就能下载到:

Fabric可用的Simple Animated Guns模组枪械属性修改简易教程-第2张图片

当然你也可以使用你习惯的编辑器,Sublime Text啥的都可以。如果你的Vscode是英文的不习惯,可以自行搜索Vscode汉化,或者参考下面的文章:



准备好Java环境

如果你下载好了项目文件,请将其解压。然后咱们来检查目录中是否存在build.gradle文件,如果没有请重新下载,不出意外是有的。项目目录应该如下:

Fabric可用的Simple Animated Guns模组枪械属性修改简易教程-第3张图片

请使用我们准备好的Vscode将其打开,不出意外你会得到:

Fabric可用的Simple Animated Guns模组枪械属性修改简易教程-第4张图片

可以看到这里要求的Java版本。请按要求切换本地Java版本环境,也就是转到系统环境变量进行调整。如果你忘记本地Java版本,请使用命令行执行查看版本命令,查看本地Java版本的命令是:

java -version

Win+R就可以打开运行,然后输入cmd就可以打开一个命令行了。

上述命令需要你配置好Java环境变量。如果出现版本号且版本对得上,就说明你的Java环境是ok的;如果你从未安装过Java只是在使用启动器时有所耳闻,可以参考下面的文章来安装并配置Java环境变量(文末我会提供Java17版本123云盘链接,蓝奏云限制100m大小没办法)。

环境变量的作用就是能让你在命令行内直接使用java命令,而不是必须得在java.exe目录下才能使用java命令

如果你使用我提供的Java17安装包,也请看一看上面的这篇文章,直接跳到1-2安装步骤即可,或者自行搜索可信的教程文章也是可以的。

上述文章在环境变量配置中,关键字符串如下(分号是变量值最后如果没有分号才需要加)

;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;

如果你的PATH变量不是文章中的样式,而是和我一样是列表,那就简单得多了直接点右边的新建就可以:

Fabric可用的Simple Animated Guns模组枪械属性修改简易教程-第5张图片

好了,如果不出意外你已经可以通过cmd(Win+R输入cmd即可)执行java命令了。如果你忘记Java在哪,可以使用下面的命令:

where java



正片-解析Simple Animated Guns枪械属性

请使用我们准备好的Vscode编辑器打开项目。

如果你安装时选择了将Vscode添加到右键菜单,则可以直接在项目目录空白处直接右键将其作为项目打开:

Fabric可用的Simple Animated Guns模组枪械属性修改简易教程-第6张图片

你的右键菜单可能和我不一样,因为我嫌它安装时给我的字太长了不好看,所以改成了Open as Project

如果你没有,那么你可以直接打开Vscode,在左上角点击文件->打开文件夹,然后找到项目文件夹就好了

打开后,你会得到一个相对简洁的界面:

Fabric可用的Simple Animated Guns模组枪械属性修改简易教程-第7张图片

鼠标左键点击箭头指向的图标就可以看到我们的工程项目文件目录了。


Ok,我们先来看看总览性的东西吧。

我们找到:src\main\resources\assets\anim_guns\lang\en_us.json的这个en_us.json文件

Fabric可用的Simple Animated Guns模组枪械属性修改简易教程-第8张图片

这个就是作者定义的全部相关东西了。值得一提的是,在原地址的default分支,也就是1.18.2v1-test-arms-weaponmods分支中,几乎相同的位置下是存在官方汉化的:

地址:https://github.com/elidhan/Simple-Animated-Guns/tree/1.18.2v1-test-arms-weaponmods/src/main/resources/assets/anim_guns/lang

Fabric可用的Simple Animated Guns模组枪械属性修改简易教程-第9张图片

不过版本更迭,1.20.1之前的版本枪械属性之类的可能现在1.20.1有的会舍弃或者更新,而且1.20.1并没有这份官方汉化json文件了,我个人简单翻译了一下,在1.20.1版本的同目录下创建了一份zh_cn.json文件,以供大家参考。

个人力量有限,出错在所难免,如遇到请见谅。大家可以自行比对新增项目。

Fabric可用的Simple Animated Guns模组枪械属性修改简易教程-第10张图片

有了这份总览,心中总算也是踏实许多。接下来我们找到:src\main\java\net\elidhan\anim_guns\item\ModItems.java

Fabric可用的Simple Animated Guns模组枪械属性修改简易教程-第11张图片

下面就是我找到GunItem.java中的构造函数后进行对照再为大家进行注释解释后的代码了,我这里仅用第一个枪械做例子。因为其他的枪械是大差不差的,除了开火模式全自动半自动的差别、装填方式、持枪方式、可装备的附件类型外,基本差不多(什么暴论)

1.20.1版本分支构造函数如下:

public GunItem(Settings settings, String gunID, String animationID,
                   float gunDamage, int rateOfFire, int magSize,
                   Item ammoType, int reloadCooldown, float[] bulletSpread,
                   float[] gunRecoil, int pelletCount, LoadingType loadingType,
                   SoundEvent reloadSoundStart, SoundEvent reloadSoundMagOut, SoundEvent reloadSoundMagIn, SoundEvent reloadSoundEnd,
                   SoundEvent shootSound, SoundEvent postShootSound, int reloadCycles, boolean isScoped, boolean unscopeAfterShot,
                   int reloadStage1, int reloadStage2, int reloadStage3, FiringType firingType, ArmType armType, AttachmentItem.AttachType[] acceptedAttachmentTypes)
    {
        … 实现部分略 …
    }

主要还是看构造函数中的参数要求,实现部分的赋值倒是可以忽略。

下面这个是经过我注释解释后的1.20.1版本分支的枪械属性注册部分代码

// 以下为枪械注册属性信息
    // pistol_light为手枪
    // 所有枪械id可在src\main\resources\assets\anim_guns\lang\zh_cn.json中找到,zh_cn.json为本人简单翻译,仅供参考
public static final Item PISTOL = registerItem("pistol_light", new GunItem(new FabricItemSettings().maxCount(1),
// 以下属性值仅作参考示例,参数类型在src\main\java\net\elidhan\anim_guns\item\GunItem.java中的构造方法GunItem已写明,可自行理解
           "pistol_light", // 枪械id,请勿修改
"pistol_generic", // 动画id,请勿修改
5, // 伤害值
3, // 射速
17, // 弹匣容量
STANDARD_HANDGUN_BULLET, // 弹药类型
35, // 重新装填的持续时间,单位为ticks,Minecraft的ticks是1/20秒(s),也就是50毫秒(ms)
new float[] {1.5f, 1.5f}, // 子弹偏移/散布范围
new float[] {1f, 2.5f},  // 后坐力
1, // 每次击发的子弹数,主要跟枪械开火模式有关,单发、连发之类的
GunItem.LoadingType.MAGAZINE, // 装填方式,这里是弹匣装填
null, // 重新装填开始时的音效,此处为null
ModSounds.RELOAD_GENERIC_PISTOL_P1, // 装填时,将弹匣拔出的音效
ModSounds.RELOAD_GENERIC_PISTOL_P2, // 装填时,将新弹匣放入的音效
ModSounds.RELOAD_GENERIC_PISTOL_P3, // 装填完毕音效
ModSounds.PISTOL_LIGHT, // 子弹击发音效
null, // 射击后的音效,如子弹落地音、枪声回响音等,此处为null
1, // 重新装填涉及的所有步骤的循环次数,这里为1,表示所有步骤仅做一次
false, // 是否具有瞄准镜
false, // 射击后是否取消瞄准状态
9, // 下面三个数字都是重新装填子弹的步骤持续时间
10,
20,
GunItem.FiringType.SEMI_AUTO, // 射击方式,这里是半自动模式
GunItem.ArmType.HANDGUN_TWOHAND, // 装备或持枪方式,这里是双手持枪
new AttachmentItem.AttachType[]{AttachmentItem.AttachType.MUZZLE}) // 可装备的附件类型,这里只有一个MUZZLE(枪口),也可以在json文件查看
{
} // 这里还提供了一个匿名内部类,可自定义
    );

下面这个则是1.18.2v1-test-arms-weaponmods版本分支的

// 将sniper_classice狙击步枪进行注册,CLASSIC_SNIPER_RIFLE为注册后的静态名称,主要咱们看GunItem的参数
public static final Item CLASSIC_SNIPER_RIFLE = registerItem("sniper_classic", new GunItem(new FabricItemSettings().group(AnimatedGuns.GUNS).maxCount(1), //使用FabricItemSettings设置物品的显示效果
"sniper_classic", // 枪的ID名,请勿修改
"sniper_classic", // 枪的名称,请勿修改
        29, // 枪的伤害值
        20, // 枪的射速
        5, // 枪的弹匣弹药容量
        HEAVY_RIFLE_BULLET, // 枪的子弹类型
        36, // 子弹装填时间,单位为ticks,Minecraft的ticks是1/20秒(s),也就是50毫秒(ms)
        new float[] {0.125f, 0.125f}, // 子弹散布/扩散范围
new float[]{2.5f, 8.25f}, // 后坐力
        1, // 每次击发的子弹数,主要跟枪械开火模式有关,全自动和连发之类的
GunItem.LoadingType.PER_CARTRIDGE, // 子弹装填方式,这里是击发一发后就装填一发
null, // 装填开始时的音效
ModSounds.RELOAD_GENERIC_SNIPER_P1, // 装填过程中弹匣拔出音
ModSounds.RELOAD_CLASSIC_SNIPER_P2, // 装填过程中的新的弹匣装填音
ModSounds.RELOAD_GENERIC_SNIPER_P3, // 装填结束时的音效
        ModSounds.SNIPER_CLASSIC, // 子弹击发声音
        5, // 重新装填弹匣的预期子弹数
        true, // 是否具有瞄准镜
true, // 是否在射击后取消瞄准效果
        12, // 下面都是重新装填子弹的各个阶段的持续时间
        13,
        24)
        // 后面还有个{},是一个匿名内部类,此处为空,但是可以在里面添加自定义的方法或覆盖父类的方法
{
});


GunItem构造函数的具体参数要求如下:

public GunItem(Settings settings, // 注册,不用管
   String gunID, // 枪械ID,字符串类型,如:abc上马*&%(】
                   String animationID, // 动画ID,字符串类型,同上
                   float gunDamage, // 枪械伤害,浮点类型,如:9.5f、9.5F
                   int rateOfFire, // 射速,整数类型,如:10、70
                   int magSize, // 弹匣容量,整数类型,同上
                   Item ammoType, // Item枚举类型,非必要不修改 
                   int reloadCooldown, // 重新装填时间,整数类型
                   float[] bulletSpread, // 子弹扩散范围,浮点数组,非专业人士请勿修改对应的值
                   float[] gunRecoil, // 同上
                   int pelletCount, // 每次击发的子弹数,整数类型
                   LoadingType loadingType, // 装填方式,枚举类型,请勿修改
                   SoundEvent reloadSoundStart, // 声音事件,请勿修改
                   SoundEvent reloadSoundMagOut,
                   SoundEvent reloadSoundMagIn,
                   SoundEvent reloadSoundEnd,
                   SoundEvent shootSound,
                   SoundEvent postShootSound,
                   int reloadCycles, // 重新装填涉及的所有步骤的循环次数,整数类型
                   
                  // 是否具有瞄准镜。布尔类型,取值只有true和false,标识状态
                  boolean isScoped,
                   // 是否在射击后取消瞄准状态,布尔类型,同上
                   boolean unscopeAfterShot,
               
                   int reloadStage1, // 重新装填阶段1的持续时间,整数类型,请勿修改
                   int reloadStage2,
                   int reloadStage3,
               
                   FiringType firingType, // 射击方式,请勿修改
                   ArmType armType, // 装备方式,请勿修改
               
                  // 可装备附件,属性值,可注册。非必要请勿修改
                   AttachmentItem.AttachType[] acceptedAttachmentTypes)

上面的构造函数参数类型要求请千万做到心中明确。

如果你学过Java或者其他编程语言,这部分你可以跳过,但是也请稍微留意一下参数类型要求。否则修改一时爽,编译()


当然1.20.1以下的版本会少对应的属性参数,而1.20.1则是增加了持枪动作类型和枪口等附件的支持的。


好了,收回前面的暴论,这些枪械可能存在的差异,如:全自动半自动的、装填方式、持枪方式等,其实我也给大家进行注释解释了。

就在:src\main\java\net\elidhan\anim_guns\item\GunItem.java的826行开始:

Fabric可用的Simple Animated Guns模组枪械属性修改简易教程-第12张图片

这些都是枚举类型的,大家往下翻看ModItems.java代码时,遇到不理解的可以自行对照。

而可装备的附件类型其实就在枪械的上面,或者说,在json文件中也能知道,好像就3种?

Fabric可用的Simple Animated Guns模组枪械属性修改简易教程-第13张图片zh_cn.json的63行处:

"item.anim_guns.sight_holo":  "全息瞄准镜",
"item.anim_guns.grip_foregrip":  "前握把",
"item.anim_guns.muzzle_mbrake":  "枪口制动器",

也就是说目前附件好像只有这三种?因为我主要关心枪械属性,所以附件类型什么的并未太过深入,大家可以自行查看。


属性修改

Ok,现在大家都有了基本认识,我们来简单修改一个amr_classic狙击枪的伤害值吧。

我们找到:src\main\java\net\elidhan\anim_guns\item\ModItems.java的689行开始

Fabric可用的Simple Animated Guns模组枪械属性修改简易教程-第14张图片

我们简单修改原伤害值40为50

Fabric可用的Simple Animated Guns模组枪械属性修改简易教程-第15张图片

Ok,这里我们的修改完成后,我们基本上就要进行编译了。不过在编译之前,我们先来添加一下国内镜像的仓库源,以防等会编译过程中可能出现的下载慢的情况。

我们打开build.gradle文件

Fabric可用的Simple Animated Guns模组枪械属性修改简易教程-第16张图片

添加一个阿里云的maven地址:

maven{ url'https://maven.aliyun.com/nexus/content/groups/public/'}

Fabric可用的Simple Animated Guns模组枪械属性修改简易教程-第17张图片好的,我们做完修改之后,点击左上角的文件->全部保存。将我们做的修改保存下来,不然是不会生效的。


编译

别关闭Vscode哦,我们直接在打开项目的Vscode上点击它上方导航栏的终端选项,新建一个终端用来运行我们要执行的命令:

Fabric可用的Simple Animated Guns模组枪械属性修改简易教程-第18张图片由于项目自带gradlew和gradlew.bat,所以我们可以不用安装gradle,我们直接使用它们来编译,执行命令为:

gradlew build

如果出现绿字BUILD SUCCESSFUL in 基本上是没问题的:

Fabric可用的Simple Animated Guns模组枪械属性修改简易教程-第19张图片编译后的文件在:Simple-Animated-Guns-1.20.1\build\libs中

Fabric可用的Simple Animated Guns模组枪械属性修改简易教程-第20张图片不出意外的话,使用上面这个不带sources的jar包就可以了。


实践

打开PCL2,将jar包替换(请备份原文件)

Fabric可用的Simple Animated Guns模组枪械属性修改简易教程-第21张图片

这里我将原来我正常使用的jar包剪切出去,放在了编译后的目录下统一管理,接下来将我们编译的jar放回进行测试:

Fabric可用的Simple Animated Guns模组枪械属性修改简易教程-第22张图片替换之后,可以看到PCL2可以搜到我们替换的jar包

Fabric可用的Simple Animated Guns模组枪械属性修改简易教程-第23张图片

接下来就是进游戏测试了:

Fabric可用的Simple Animated Guns模组枪械属性修改简易教程-第24张图片

可以看到Damage伤害变成了我们修改后的50,成功!

我会把我的这一份项目源码也上传蓝奏云供大家参考。


本来到这里也该结束了,但是再稍微提一嘴准星的问题吧。

因为我是玩的BetterMC1.20.1,玩过的朋友可能知道,它这个整合包的准星不是传统派的十字,而是十字左右套了个左右括号包裹起来,我是很难习惯,所以我就把它改回了传统的十字准星,这个改法在BetterMC的MC百科词条下的评论区我发了办法,感兴趣的可以看看:BetterMC修改准星489楼评论

Fabric可用的Simple Animated Guns模组枪械属性修改简易教程-第25张图片

相关链接