本篇教程由作者设定使用 CC BY-NC-SA 协议。

简介

就如同MrCrayfish本人说的那样,本模组从1.0版本(实际上是从0.16.0版本)开始就变成了数据驱动型模组,这意味着玩家只能通过修改数据包而非配置文件来自定义武器的属性。虽然本教程内容是以1.0.1版本的源代码为基础编写的,但实际上也适用在不早于0.16.0的版本上。

如果你想要修改0.15.3或者更早的版本中的武器属性,你可以谨慎地参考这篇教程,尽管它存在错误并且已经过时了。

顺便一提,本教程也适用于本模组的拓展模组,比如更多的枪TaC以及Mr Pineapple's Toy Guns

修改前的准备

那些关系到武器属性的json文件都被保存在了数据包当中,第一步你需要先把它们解压出来。你需要准备一个能够解压jar文件的工具(有人管它叫解压软件、压缩工具、文件归档器,爱怎么叫都行),然后用它打开本模组的jar文件,在..\data\cgm\guns目录中,你可以看到一堆以武器命名的json文件,要修改武器属性的话,修改它们即可。

武器属性修改教程(适用于1.0.1版本)-第1张图片

参数及解释

general部分

本部分参数是所有武器通用的参数,与武器自身的大多数性能有关。

参数名
含义
作用
数据类型
默认值
auto
全自动武器
决定武器是否为全自动武器。注1
布尔型
false
rate
射速
武器再次开火的冷却时间。注2
整型
0
gripType
持握方式
影响手臂的动作和渲染。
字符串"GripType.ONE_HANDED"注3、注4
maxAmmo
载弹量
武器最多能装入的弹药数量。
整型0
reloadAmount
单次装弹量
单次装弹最多能装入的弹药数量。注5
整型
1
recoilAngle
后坐力角

影响武器开火时枪口上扬的幅度,会影

响武器的射击精度。

单精度型
0.0F
recoilKick后坐反冲

影响武器开火时向后运动的幅度,不影

响武器的射击精度。

单精度型0.0F
recoilDurationOffset
后坐持续期间补偿

影响武器开火时播放的后坐力动作的时

间长度。

单精度型0.0F
recoilAdsReduction
瞄准射击后坐力削减瞄准状态下开火的后坐力倍数。
单精度型0.2F
projectileAmount
发射量
单次开火射出的弹药数量。注6整型1
alwaysSpread弹药总是散布

决定武器开火时射出的弹药是否发生散

布。

布尔型
false
spread
弹药散布

射出的弹药的初始pitch和yaw方向上的

最大角度。

单精度型0.0F

注释:

  1. 全自动武器的供弹和击发都可以自动循环,能在不放开扳机的状态下连续发射弹药,直到扳机被放开、弹药用罄或者是武器发生故障。

  2. 本模组中的射速概念不同于一般大众所认知的射速概念,而是指再次开火的冷却时间,以tick为单位。

  3. 该默认值写法已经被弃用,现在采用“MODID:GripType”的写法。

  4. GripType有四种类型,分别是ONE_HANDED、TWO_HANDED、MINI_GUN、BAZOOKA。

  5. 由于在没有附魔的情况下本模组所有武器每次装填弹药所消耗的时间都是一致的(10 tick),因此单次装弹量与载弹量的比例越大就意味着装填速度越快。

  6. 某些特殊的武器,比如霰弹枪,这个数值会超过1。当数值超过1时,每颗子弹会均分每次开火能造成的总伤害,这意味着一次射出的子弹越多,每颗子弹造成的伤害越少。

projectile部分

本部分是关于武器弹药的参数。

参数名
含义
作用
数据类型
默认值
item
弹药
决定武器所使用的弹药。
字符串"cgm:basic_ammo"注1
visible
可见

决定武器射出的弹药是否可见。注2

布尔型
false
damage
伤害

决定武器射出的弹药能造成的伤害。注3

单精度型0.0F
size
尺寸

射出的弹药实体的碰撞边界尺寸。

单精度型0.0F
speed
弹药飞行速度

射出后的弹药每tick能够飞行的距离。

双精度型
0.0
life
弹药生命周期

射出后的弹药在与物体发生碰撞或者

被世界移除前的存续时间,以tick为

单位。

整型
0
gravity重力

决定弹药是否受重力影响。如果射出

后受重力影响,则每tick其Y轴的分速

度向量将恒减少0.05,表现为弹道持

续下坠。

布尔型
false
damageReduceOverLife

弹药伤害随生

命周期衰减

决定弹药射出后伤害是否会随着生命

周期衰减,更多信息请查看此页面

布尔型
false
trailColor弹药拖尾颜色
决定弹药拖尾的颜色。
整型
0xFFD289注4
trailLengthMultiplier

弹药拖尾长度

倍数

影响弹药拖尾的长度。双精度型1.0

注释:

  1. 随着基础弹药被移除,该默认值已经失效,如果你执意使用默认值,那么武器使用的弹药就会变成空气(字面意思)。目前本模组的弹药类型有basic_bullet(基础子弹)、advanced_bullet(高级子弹)、shell(霰弹)、missile(火箭弹)、grenade(榴弹)。当然,你也可以添加其它模组的弹药作为本模组武器的弹药,如果你愿意的话,甚至可以用苹果来当弹药。

  2. 在对画面进行重新渲染的瞄准镜(比如中距瞄准镜长距瞄准镜)的视角中,被标记为不可见的子弹依然是可见的。

  3. 部分武器的伤害并不或者并不完全受该数值决定。即便是大多数武器,该伤害值也并不一定是武器所造成的最终伤害,因为还要考虑配件和附魔的因素,以及爆头和暴击的设定。

  4. 颜色的数值是用十六进制数表示的RGB值,由0x(表示十六进制数的前缀)和3组以十六进制表示的分别代表红、绿、蓝的颜色通道的颜色值组成。如果要将十进制RGB转换为十六进制,你可以先分别将R、G、B的值转为十六进制,再把它们叠起来。当然,如果你愿意的话,你用别的进制的整数来表示颜色也可以。

sounds部分

本部分是关于武器音效的参数。

参数名
含义
作用
数据类型
默认值
fire
开火
决定开火音效。
字符串

reload装填弹药
决定装填弹药音效。
字符串

cock
枪机复位
决定枪机复位音效。
字符串

silencedFire消音开火
决定消音开火音效。
字符串

display部分

本部分是关于枪口火焰的参数。

参数名
flash
子参数名
含义
作用
数据类型
默认值
size
尺寸
决定枪口火焰的尺寸。
双精度型
0.5
xOffset
x轴补偿
影响枪口火焰的显示位置。
双精度型
yOffsety轴补偿
影响枪口火焰的显示位置。双精度型
zOffsetz轴补偿
影响枪口火焰的显示位置。双精度型

这里的x轴、y轴和z轴指的是pitch轴、yaw轴和roll轴,下同。(注:如果你端着枪的话,以你的视角出发,pitch轴就是枪的左右方向,yaw轴是上下方向,roll轴是前后方向。)如果以x、y、z三个值都为0的位置作为中心点来参考的话,假设枪口火焰原本位于该中心点,则当x、y、z变成负值时,枪口火焰的位置就从原本的中心点往pitch轴左侧移动,往yaw轴下侧移动,往roll轴后侧移动;正值反之。

武器属性修改教程(适用于1.0.1版本)-第2张图片

modules部分

本部分是关于武器模块的参数。

zoom部分

参数名
含义
作用
数据类型
默认值
fovModifier
视场角修改器
修改视场角以实现画面放大效果。
单精度型
0.0F
xOffset
x轴补偿

影响举枪瞄准状态下武器的位置。

双精度型

yOffsety轴补偿
影响举枪瞄准状态下武器的位置。双精度型
zOffsetz轴补偿
影响举枪瞄准状态下武器的位置。双精度型

注释:实际上,模组是通过缩小FOV的方式来实现游戏画面的放大。放大倍数等于fovModifier数值的倒数。

attachments部分

参数名
scope
子参数名
含义
作用
数据类型
默认值
xOffset
x轴补偿影响瞄准镜的安装位置。双精度型
yOffsety轴补偿影响瞄准镜的安装位置。双精度型
zOffsetz轴补偿影响瞄准镜的安装位置。双精度型


参数名
barrel
子参数名
含义
作用
数据类型
默认值
xOffset
x轴补偿影响枪口的安装位置。双精度型
yOffsety轴补偿影响枪口的安装位置。双精度型
zOffsetz轴补偿影响枪口的安装位置。双精度型


参数名
stock
子参数名
含义
作用
数据类型
默认值
xOffset
x轴补偿影响枪托的安装位置。双精度型
yOffsety轴补偿影响枪托的安装位置。双精度型
zOffsetz轴补偿影响枪托的安装位置。双精度型


参数名
underBarrel
子参数名
含义
作用
数据类型
默认值
xOffset
x轴补偿影响握把的安装位置。双精度型
yOffsety轴补偿影响握把的安装位置。双精度型
zOffsetz轴补偿影响握把的安装位置。双精度型

例子

为了更好地了解以上这些参数是以何种方式书写的,你可以看看如下的例子。这是本模组中关于重型步枪的属性的json文件。

{
    "general": {
        "rate": 40,                        //射速40,再次开火需要经过40tick的冷却时间
        "gripType": "cgm:two_handed",                 //显然重型步枪是双手武器
        "maxAmmo": 4,                      //载弹量4
        "reloadAmount": 1,                 //单次装弹量1,这意味着你要装4下,花费40tick的时间,才能把子弹从零装到满。
        "recoilAngle": 10.0,                    //后坐力角10
        "recoilKick": 1.0,                       //后坐反冲1
        "recoilDurationOffset": 0.5,                    //后坐力持续期间补偿0.5
        "recoilAdsReduction": 0.4,                    //瞄准射击后坐力削减0.4倍,这意味着你瞄准射击时会射的更准
        "alwaysSpread": true,                        //弹药总是散布
        "spread": 1.0                                      //散布角度1
    },
    "projectile": {
        "item": "cgm:advanced_bullet",         //弹药类型是高级子弹
        "visible": false,                                    //弹药射出时不可见
        "gravity": true,                                   //弹药射出后受重力影响
        "damage": 18.0,                                 //初始伤害18
        "size": 0.0625,                                    //弹药碰撞框尺寸0.0625
        "speed": 50.0,                                    //子弹飞行速度50格每tick
        "life": 10                                            //生命周期10tick
    },
    "sounds": {
        "fire": "cgm:item.heavy_rifle.fire",
        "reload": "cgm:item.pistol.reload",
        "cock": "cgm:item.heavy_rifle.cock",
        "silencedFire": "cgm:item.heavy_rifle.silenced_fire",
        "cockAfterFire": true,                        //这个参数已经废弃了
        "cockDelay": 12                               //这个参数已经废弃了
    },
    "display": {
        "flash": {
            "yOffset": 3.6,
            "zOffset": -9.41,
            "size": 1.0
        }
    },
    "modules": {
        "zoom": {
            "fovModifier": 0.6,
            "yOffset": 5.1,
            "zOffset": 2.0
        },
        "attachments": {
            "scope": {
                "yOffset": 4.4,
                "zOffset": 4.0
            },
            "barrel": {
                "yOffset": 3.6,
                "zOffset": -9.4,
                "scale": 0.5
            },
            "underBarrel": {
                "yOffset": 3.0,
                "zOffset": -0.5
            }
        }
    }
}

仔细查看这个例子,你会发现,并非所有的参数都被写进了这个json文件里。对于那些没有写进json文件的参数,模组会自动采用它们默认值,但要注意,有些参数的默认值是无效的,对于那些参数,必须写入有效的数值,否则可能会造成一些奇怪的问题(比如开枪没有声音)。事实上,除了sounds部分的参数以外,所有的参数都有默认值,即便是本教程中默认值一栏留空的参数。所以,大胆放心地去修改好了。

如果你要修改武器的属性,你只需要找到它的json文件,然后对照着本教程的注释进行修改即可。通常的文本编辑器就能满足修改的需求。顺便一提,本模组的弹药和武器性能是完全脱钩的,这意味着同一种弹药装在不同武器上也可以造成完全迥异的伤害,具体的伤害取决于json中projectile部分的写法。

需要特别注意的是,由于源代码的原因,火箭筒榴弹发射器的伤害与json中的伤害仅有有限的关联,具体的关联可在该等武器的资料页面查看。

最后的步骤

当你已经完成了对有关武器属性的json的修改,你就可以保存修改好的json文件,并将它们压缩回模组的jar文件当中,替换掉原本的json文件。然后,进入游戏查看你的成果即可。通常情况下对这些参数的修改会直接生效,但也有需要重新获取武器才会生效的参数。