Simple Animated Guns 枪械属性修改

本文最后更新于:2024年10月26日 晚上

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

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

工具:Vscode

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

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

  1. 原 mod 项目
  2. 一个能用的编辑器,如 Vscode、Sublime
  3. Java17 环境

Clone 或下载原作者项目

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

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

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

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

QQ_1721236869939

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

准备好编辑器

我推荐使用微软的 vsocde 作为编辑器,这个编辑器在微软商店就能下载到:

QQ_1721237162354

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

准备好 Java 环境

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

QQ_1721238704344

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

QQ_1721239112188

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

1
java -version

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

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

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

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

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

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

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

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

1
where java

解析 - Simple Animated Guns 枪械属性

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

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

QQ_1721244782340

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

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

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

QQ_1721245065074

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

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

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

QQ_1721245291655

这个就是作者定义的全部相关东西了。值得一提的是,在原地址的 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

QQ_1721245438657

不过版本更迭,现在 1.20.1 并没有这份官方汉化 json 文件了,我个人简单翻译了一下,在 1.20.1 版本的同目录下创建了一份 zh_cn.json 文件,以供大家参考。

个人力量有限,出错在所难免,如遇到请见谅。

QQ_1721245633177

有了这份总览,心中总算也是踏实许多。

接下来我们找到:src\main\java\net\elidhan\anim_guns\item\ModItems.java

QQ_1721245988951

下面就是我找到 GunItem.java 中的构造函数后进行对照再为大家进行注释解释后的代码了,我这里仅用第一个枪械做例子。

因为其他的枪械是大差不差的,除了开火模式全自动半自动的差别、装填方式、持枪方式、可装备的附件类型外,基本差不多?。

属性值一览

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

1
2
3
4
5
6
7
8
9
10
11
12
13
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 版本分支的枪械属性注册

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// 以下为枪械注册属性信息
    // 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 版本分支的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
   // 将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)
       // 后面还有个{},是一个匿名内部类,此处为空,但是可以在里面添加自定义的方法或覆盖父类的方法
{
});

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

构造函数解析

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

1721381736298

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

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

好了,收回删除线伏笔,这些枪械可能存在的差异,如:全自动半自动的、装填方式、持枪方式等。我也给大家进行注释解释了,就在:src\main\java\net\elidhan\anim_guns\item\GunItem.java 的 826 行开始:

QQ_1721247100101

这些都是枚举类型的,大家可以自行对应理解。而可装备的附件类型其实就在枪械的上面,或者说,在 json 文件中也能知道,好像就 3 种?:

QQ_1721247279794zh_cn.json63 行处:

1
2
3
"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 行开始

QQ_1721248383896

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

QQ_1721248484232

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

我们打开 build.gradle 文件

QQ_1721248808489

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

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

QQ_1721248879550

好的,我们做完修改之后,点击左上角的文件 -> 全部保存。将我们做的修改保存下来,不然是不会生效的。

实践 - 编译

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

QQ_1721249073586

由于项目自带 gradlew 和 gradlew.bat,所以我们可以不用安装 gradle,我们直接使用它们来编译,执行命令为:

1
gradlew build

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

QQ_1721249741382

编译后的文件在:Simple-Animated-Guns-1.20.1\build\libs 中

QQ_1721249787069

不出意外的话,使用上面这个不带 sources 的 jar 包就可以了。

实践 - 替换 jar 包测试

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

QQ_1721249892892

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

QQ_1721249976750

替换之后,可以看到 PCL2 可以搜到我们替换的 jar 包

QQ_1721250119387

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

2024-07-18_05.07.31

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

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

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

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

QQ_1721252012398

相关链接

勘误 & 补充

2024 年 7 月 18 日 21:54 勘误,补上原作者全版本源码链接。

2024 年 7 月 19 日 11:43 补充,在属性值部分补充关于构造函数的参数要求。

可能遇到的问题

  • 编译的时候显示:Exception in thread "main" javax.net.ssl.SSLHandshakeException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

​ 请检查是否开启了系统代理。关闭后再尝试编译。

  • 编译时报错: 不兼容的类型:从 double 转换到 float 可能会有损失 & 错误:找不到符号 & 构造器 (FabricItemSettings,String,String,double,int,int,Item,int,float [],float [],int,LoadingType,< 空值 >,SoundEvent,SoundEvent,SoundEvent,SoundEvent,< 空值 >,int,boolean,boolean,int,int,int,FiringType,ArmType,AttachType [])

​ 请检查属性值是否符合参数要求,如:9.5 默认为 double 类型,而构造函数要求为 float。请改为 9.5f 或 9.5F


Simple Animated Guns 枪械属性修改
https://4rozen.github.io/archives/Gamer/64665.html
作者
4rozeN
发布于
2024年7月18日
许可协议