{"id":"8C4xBrF4aZ","url":"https://pastebin.ca/8C4xBrF4aZ","raw_url":"https://raw.anybin.ca/8C4xBrF4aZ","visibility":"public","access":"public","created_at":1793564561267,"expires_at":1794169361267,"fetch_limit":null,"fetches_used":0,"reads_remaining":null,"size_bytes":19409,"syntax_hint":"markdown","title":null,"filename":"M4A1 Config.cpp","change_note":null,"cipher":null,"cipher_meta":null,"parent_id":null,"root_id":"8C4xBrF4aZ","version":1,"owner_id":null,"recipient_id":null,"body":"# DayZ 武器参数完整解析：M4A1\n\n你提供的是 DayZ 原版 `CfgWeapons` 中的 M4A1 武器配置，分为两个类：\n\n- `M4A1_Base : Rifle_Base`：定义武器的基础行为，包括后坐力、精度、射速、弹药兼容性、枪口速度和音效等。\n- `M4A1 : M4A1_Base`：定义实际生成的 M4A1，包括模型、配件槽、贴图、耐久度、粒子特效等。\n\n我会按照 参数作用 → 当前数值 → 实际游戏表现 → 修改建议 的方式解释，并重点区分哪些参数真正影响枪械性能，哪些只影响动画、视觉或音效。\n\n需要特别注意：DayZ 的武器性能并非完全由 `CfgWeapons` 决定。弹道伤害还涉及 `CfgAmmo`，后坐力涉及 `CfgRecoils`，而配件、玩家姿态、武器状态及 Mod 脚本也可能影响最终结果。\n\n## 一、核心战斗参数\n\n这些是你调整服务器武器平衡时最值得关注的参数。\n\n| 参数                    | M4A1 数值         | 作用          |\n| --------------------- | --------------- | ----------- |\n| `initSpeedMultiplier` | 0.9             | 弹药初始速度倍率    |\n| `recoilModifier[]`    | 111             | 后坐力修正       |\n| `swayModifier[]`      | 220.75          | 持枪晃动修正      |\n| `dispersion`          | 0.002           | 武器基础散布（弧度）  |\n| `reloadTime`（半自动）     | 0.12            | 半自动射击间隔（秒）  |\n| `reloadTime`（全自动）     | 0.065           | 全自动射击间隔（秒）  |\n| `recoil`              | recoil_m4       | 使用的后坐力配置    |\n| `recoilProne`         | recoil_m4_prone | 卧姿后坐力配置     |\n| `barrelArmor`         | 2.5             | 枪管相关的损伤耐受参数 |\n| `WeaponLength`        | 0.78            | 武器长度相关参数    |\n| `ObstructionDistance` | 0.526           | 武器障碍检测相关距离  |\n| `ShoulderDistance`    | 0.05            | 武器肩部位置相关参数  |\n\n### 1. `initSpeedMultiplier = 0.9`：子弹初速\n\n这是一个非常重要的参数。\n\n它控制武器对弹药初始速度的倍率：\n\n\\\\[ V\\_{\\text{枪口}}=V\\_{\\text{弹药初速}}\\times\\text{initSpeedMultiplier} \\\\]\n\n假设某种 5.56×45mm 弹药在 `CfgAmmo` 中定义：\n\n```\ninitSpeed = 1000;\n```\n\n那么 M4A1 发射时：\n\n\\\\[ 1000\\times0.9=900\\ \\text{m/s} \\\\]\n\n| 武器倍率    | 示例枪口初速   |\n| ------- | -------- |\n| 0.8     | 800 m/s  |\n| 0.9（当前） | 900 m/s  |\n| 1.0     | 1000 m/s |\n| 1.1     | 1100 m/s |\n\n实际影响：\n\n- 改变子弹飞行时间。\n- 改变弹道下坠。\n- 可能改变命中伤害，因为 DayZ 的弹药伤害计算可能涉及弹丸速度。\n- 可能影响远距离的伤害衰减表现。\n\n需要注意你之前研究过的 `typicalSpeed` 与 `defaultDamageOverride`：不能简单认为提高枪口初速就一定按相同比例提高所有距离的伤害，具体还取决于弹药配置及命中计算逻辑。\n\n### 2. `dispersion = 0.002`：基础射击散布\n\n`dispersion` 表示弹丸发射方向的角度散布，单位通常为弧度。\n\n数值越小，武器的基础机械精度越高。\n\n用简化的小角度关系计算：\n\n\\\\[ R\\approx D\\times\\tan(\\text{dispersion}) \\\\]\n\n在 `dispersion = 0.002` 时：\n\n| 距离    | 近似散布半径 | 近似散布直径 |\n| ----- | ------ | ------ |\n| 100m  | 0.20m  | 0.40m  |\n| 200m  | 0.40m  | 0.80m  |\n| 300m  | 0.60m  | 1.20m  |\n| 500m  | 1.00m  | 2.00m  |\n| 1000m | 2.00m  | 4.00m  |\n\n这是以 0.002 弧度作为最大角度偏差的几何示意，不代表 DayZ 引擎在所有射击状态下的实际弹着分布。真实表现还可能受到附件、状态、姿态及引擎散布算法影响。\n\n例如：\n\n```\ndispersion = 0.001;\n```\n\n理论角度散布相当于原来的一半。\n\n如果你想让 M4A1 更适合中远距离精准射击，可以考虑降低这个参数。但它不会直接降低后坐力，也不会消除瞄准晃动。\n\n### 3. `reloadTime`：射速\n\n虽然名字叫 `reloadTime`，但这里并不是换弹匣时间，而是射击模式中的两发子弹之间的基础间隔。\n\n半自动：\n\n```\nreloadTime = 0.12;\n```\n\n理论最大射速：\n\n\\\\[ RPM=\\frac{60}{0.12}=500 \\\\]\n\n全自动：\n\n```\nreloadTime = 0.065;\n```\n\n\\\\[ RPM=\\frac{60}{0.065}\\approx923 \\\\]\n\n半自动理论上限\n\n# 500 RPM\n\n120 ms / 发\n\n全自动理论射速\n\n# 923 RPM\n\n65 ms / 发\n\n你可以用下面的计算器调整目标射速。\n\n目标射速\n\n## 900 RPM\n\n对应配置\n\nreloadTime = 0.0667;\n\n&#x20;复制\n\n这里计算的是理论值，实际游戏射速还可能受到帧更新、武器状态和射击逻辑影响。\n\n### 4. `recoilModifier[] = {1, 1, 1}`：后坐力\n\n这是后坐力修正数组。\n\n```\nrecoilModifier[] = {1, 1, 1};\n```\n\n它并不独立定义完整的后坐力曲线，而是与：\n\n```\nrecoil = \"recoil_m4\";\nrecoilProne = \"recoil_m4_prone\";\n```\n\n配合使用。\n\n可以确定的是：\n\n- `recoil_m4` 指向 M4 的后坐力配置。\n- `recoil_m4_prone` 用于卧姿。\n- `recoilModifier[]` 是三分量修正数组。\n- `{1,1,1}` 是三个分量均采用 1 倍的配置值。\n\n但不能仅凭这段配置就严谨地断定三个下标分别代表垂直、水平、恢复速度，尤其不能把它直接等同于 Mod 的枪械属性面板。\n\n如果你要精确控制 M4A1 的上跳、左右偏移和回正表现，还需要检查实际 `CfgRecoils` 定义。\n\n### 5. `swayModifier[] = {2, 2, 0.75}`：瞄准晃动\n\n```\nswayModifier[] = {2, 2, 0.75};\n```\n\n这是持枪晃动的三个修正分量。\n\n它与 `recoilModifier[]` 不同：\n\n- `recoilModifier[]` 主要涉及开火后的后坐力。\n- `swayModifier[]` 主要涉及瞄准时的武器晃动。\n\n两者共同影响手感，但不是同一套机制。\n\n修改晃动不等于提高 `dispersion` 所定义的机械精度。即使枪械基础散布很小，玩家仍然可能因为准星晃动而打偏。\n\n这三个分量的准确内部含义需要进一步对照官方脚本或引擎资料，不能简单地把第三个 `0.75` 解释成“晃动恢复速度”。\n\n## 二、基础武器属性\n\n| 参数                     | 当前值          | 解释                     |\n| ---------------------- | ------------ | ---------------------- |\n| `scope`                | 0 / 2        | 0 表示基础类隐藏，2 表示实际物品公开可用 |\n| `weight`               | 2276         | 基础重量 2276g，即 2.276kg   |\n| `absorbency`           | 0            | 吸水率为零                  |\n| `repairableWithKits[]` | 1            | 可使用维修工具包类型 1           |\n| `repairCosts[]`        | 25           | 维修消耗系数，不能直接视为恢复 25 点生命 |\n| `PPDOFProperties[]`    | 10.650200410 | 武器相关景深后处理参数            |\n| `WeaponLength`         | 0.78         | 武器长度相关计算值              |\n| `ObstructionDistance`  | 0.526        | 武器靠近障碍物时的检测距离参数        |\n| `ShoulderDistance`     | 0.05         | 肩部位置相关距离               |\n| `barrelArmor`          | 2.5          | 枪管损伤相关耐受参数             |\n\n这里有三个值得特别说明。\n\n`weight = 2276`\n\n这是基础物品重量，并不代表安装全部配件后的总重量。弹匣、子弹、枪托、瞄准镜等可以贡献额外重量。\n\n`barrelArmor = 2.5`\n\n它不是玩家护甲，也不是子弹穿透力。它与枪管损伤有关，但具体损伤换算不能仅凭这个值确定。\n\n`WeaponLength`、`ObstructionDistance`、`ShoulderDistance`\n\n这三个参数涉及持枪位置和障碍交互。不能把 `WeaponLength = 0.78` 简单理解为现实中 M4A1 的枪管长度，也不能把 `ObstructionDistance` 直接当成从玩家身体量出的固定碰撞半径。\n\n## 三、弹药、弹匣和武器操作\n\n### 1. 弹膛\n\n```\nchamberSize = 1;\nchamberedRound = \"\";\n```\n\n`chamberSize = 1` 表示弹膛容量为一发。\n\n`chamberedRound = \"\"` 没有预设固定的膛内弹药类型，不代表武器永远无法预先上膛。\n\n### 2. 兼容弹药\n\n```\nchamberableFrom[] =\n{\n    \"Ammo_556x45\",\n    \"Ammo_556x45Tracer\"\n};\n```\n\nM4A1 支持普通 5.56×45mm 子弹和曳光弹。\n\n弹药的基础伤害、空气阻力、典型速度、穿透相关行为等，应继续检查 `CfgAmmo`。\n\n### 3. 兼容弹匣\n\n`magazines[]` 定义允许使用的弹匣类名。\n\n你提供的配置包括 STANAG、Coupled STANAG、60 发弹匣，以及 10、20、30、40 发的 CMAG 和不同颜色变体。\n\n注意：在这里添加弹匣类名，并不意味着这个弹匣一定能在游戏中正常工作。它还需要具有兼容的弹药、正确的弹匣配置及相关模型和动画支持。\n\n### 4. `magazineSwitchTime = 0.5`\n\n这是换弹匣操作相关的时间参数。\n\nDayZ Wiki 的配置资料给出一种换算方式：\n\n\\\\[ T=\\text{magazineSwitchTime}\\times10 \\\\]\n\n按这个资料计算，`0.5` 对应约 5 秒。但它不能保证玩家从按下换弹键到完成换弹的所有实际动作都恰好是 5 秒，动画和武器状态机也参与控制。\n\n[image](https://www.google.com/s2/favicons?domain=https://dayz.wiki.gg\\&sz=32)\n\nDayZ Wiki+1\n\n\n\n### 5. `ejectType = 1`\n\n这是弹壳抛出方式的类型值。它不控制武器伤害或射速。仅从数值 1 无法进一步确认具体使用哪一种弹壳模型或抛出轨迹。\n\n## 四、射击声音和消音器\n\n你的 M4A1 配置了两种开火模式，各自具有音效集合。\n\n### `NoiseShoot`\n\n```\nclass NoiseShoot\n{\n    strength = 80;\n    type = \"shot\";\n};\n```\n\n这属于射击噪声事件相关配置。\n\n- `strength = 80`：噪声强度参数。\n- `type = \"shot\"`：将事件归类为射击噪声。\n\n不要把 80 直接理解为 80 米或者 80 分贝。 AI 感知和传播距离还取决于对应系统的计算。\n\n### `soundSetShot[]`\n\n这组参数指定武器开火时使用的声音集合。\n\n| 声音名称                         | 用途       |\n| ---------------------------- | -------- |\n| `M4A1_Shot_1st_SoundSet`     | 第一人称射击声  |\n| `M4A1_Shot_SoundSet`         | 常规射击声    |\n| `M4A1_Tail_SoundSet`         | 枪声尾音     |\n| `M4A1_InteriorTail_SoundSet` | 室内尾音     |\n| `M4A1_Slapback_SoundSet`     | 环境反射相关声音 |\n| `M4A1_Tail_2D_SoundSet`      | 2D 尾音    |\n\n`SoundSet` 的名字表明了设计用途，但最终音量、距离衰减和混音仍由声音配置决定。\n\n### `soundSetShotExt[]`\n\n这是外部枪口附件对应的音效集合。\n\n你的配置有两组：\n\n- 标准消音器：`M4A1_1st_silencer_SoundSet` 等。\n- 自制消音器：`M4A1_1st_silencerHomeMade_SoundSet` 等。\n\n因此可以分别调整标准消音器和自制消音器的枪声，而不必改变 M4A1 本体射速或弹道。\n\n## 五、瞄准镜、机械瞄具与归零距离\n\n### `ironsightsExcludingOptics[]`\n\n```\nironsightsExcludingOptics[] =\n{\n    \"M4_CarryHandleOptic\",\n    \"BUISOptic\",\n    \"M68Optic\",\n    \"M4_T3NRDSOptic\",\n    \"ReflexOptic\",\n    \"ACOGOptic\"\n};\n```\n\n这是机械瞄具相关的光学附件排除列表，用于控制装配特定瞄具时的机械瞄准行为。\n\n它不是武器允许安装的瞄准镜白名单。实际附件槽由 `attachments[]` 定义，附件自身还需要具备兼容配置。\n\n### `OpticsInfo`\n\n```\nclass OpticsInfo : OpticsInfoRifle\n{\n    memoryPointCamera = \"eye\";\n    discreteDistance[] = {25};\n    discreteDistanceInitIndex = 0;\n    modelOptics = \"-\";\n    distanceZoomMin = 25;\n    distanceZoomMax = 25;\n};\n```\n\n| 参数                          | 解释                         |\n| --------------------------- | -------------------------- |\n| `memoryPointCamera`         | 模型中用于瞄准相机的记忆点              |\n| `discreteDistance[]`        | 可选择的归零距离列表                 |\n| `discreteDistanceInitIndex` | 默认选择的归零距离索引，从 0 开始         |\n| `modelOptics`               | 光学瞄准视图模型设置，`\"-\"` 表示未指定独立模型 |\n| `distanceZoomMin`           | 归零距离下限                     |\n| `distanceZoomMax`           | 归零距离上限                     |\n\n这里的 `{25}` 表示基础瞄准配置只有 25 米归零档位。\n\n归零距离不是子弹最大射程，也不是武器的伤害距离。\n\nDayZ Wiki 对 `discreteDistance[]` 的定义也明确将其归类为武器和瞄准镜的归零档位。\n\n[image](https://www.google.com/s2/favicons?domain=https://dayz.wiki.gg\\&sz=32)\n\nDayZ Wiki+1\n\n\n\n## 六、武器模型、附件、贴图\n\n### `attachments[]`\n\n```\nattachments[] =\n{\n    \"weaponButtstockM4\",\n    \"WeaponHandguardM4\",\n    \"weaponWrap\",\n    \"weaponOptics\",\n    \"weaponFlashlight\",\n    \"weaponMuzzleM4\",\n    \"weaponBayonet\"\n};\n```\n\n这些是武器的附件槽，而不是附件类名。\n\n| 附件槽                 | 对应功能 |\n| ------------------- | ---- |\n| `weaponButtstockM4` | 枪托   |\n| `WeaponHandguardM4` | 护木   |\n| `weaponWrap`        | 伪装包裹 |\n| `weaponOptics`      | 瞄准镜  |\n| `weaponFlashlight`  | 战术灯  |\n| `weaponMuzzleM4`    | 枪口附件 |\n| `weaponBayonet`     | 刺刀   |\n\n### `hiddenSelections[]`\n\n```\nhiddenSelections[] = {\"camo\"};\n```\n\n模型中定义了名为 `camo` 的隐藏选择。\n\n```\nhiddenSelectionsTextures[] =\n{\n    \"dz\\weapons\\firearms\\m4\\data\\m4_body_co.paa\"\n};\n```\n\n指定 `camo` 对应的贴图。\n\n```\nhiddenSelectionsMaterials[] =\n{\n    \"dz\\weapons\\firearms\\m4\\data\\m4_body.rvmat\"\n};\n```\n\n指定相应材质。\n\n你之前做过 M4A1 的 TAN、BLACK 等重贴图，这正是自定义颜色变体通常需要修改的两个字段。\n\n但需要注意：`hiddenSelections` 能否覆盖模型所有表面，最终由 P3D 中的命名选择决定。\n\n### `simpleHiddenSelections[]`\n\n```\nsimpleHiddenSelections[] = {\"hide_barrel\"};\n```\n\n这是模型部件显示/隐藏机制涉及的选择名称。它与用于换色的 `camo` 不同。\n\n不能仅凭这个声明就断定 `hide_barrel` 一定会在装配某个枪口附件时自动隐藏，具体还需要查看模型和脚本逻辑。\n\n### `InventorySlotsOffsets`\n\n```\nclass Shoulder\n{\n    position[] = {-0.1, 0, 0.03};\n    orientation[] = {0, 0, 0};\n};\n```\n\n控制武器在肩部装备槽中的显示偏移。\n\n`Melee` 则控制对应装备位置的显示偏移。\n\n它们主要影响物品模型在角色身上的摆放，不直接改变弹道性能。\n\n## 七、耐久度与损坏材质\n\n```\nclass GlobalHealth\n{\n    class Health\n    {\n        hitpoints = 200;\n```\n\nM4A1 的最大物品生命值为 200。\n\n这不是玩家生命值，也不是 M4A1 能承受 200 发射击后才损坏的保证。\n\n武器每次使用受到多少耐久损耗，需要结合弹药、枪械状态、附件及实际损伤逻辑判断。\n\n### `healthLevels[]`\n\n| 阈值  | 材质                       |\n| --- | ------------------------ |\n| 1.0 | `m4_body.rvmat`          |\n| 0.7 | `m4_body.rvmat`          |\n| 0.5 | `m4_body_damage.rvmat`   |\n| 0.3 | `m4_body_damage.rvmat`   |\n| 0.0 | `m4_body_destruct.rvmat` |\n\n这组配置控制物品不同健康等级对应的材质表现。\n\n例如当物品进入损坏等级时，可以显示划痕更明显的材质。\n\n注意： 这些阈值是健康等级的材质映射，不应该直接解释为“每当生命值下降到恰好 50% 就执行一次换材质命令”。\n\n## 八、开火粒子与枪管过热\n\n### `Particles.OnFire`\n\n| 粒子类               | 作用       |\n| ----------------- | -------- |\n| `SmokeCloud`      | 射击烟雾     |\n| `MuzzleFlash`     | 枪口闪光     |\n| `MuzzleFlashStar` | 星形枪口火焰   |\n| `ChamberSmoke`    | 弹膛或抛壳口烟雾 |\n\n例如：\n\n```\nignoreIfSuppressed = 1;\n```\n\n表示安装符合条件的消音器后忽略对应特效。\n\n```\nilluminateWorld = 1;\n```\n\n表示枪口闪光可以照亮环境。\n\n```\npositionOffset[] = {0.2, 0, 0};\n```\n\n表示相对粒子附着位置的三维偏移。\n\n### `Particles.OnOverheating`\n\n```\nmaxOverheatingValue = 12;\nshotsToStartOverheating = 4;\noverheatingDecayInterval = 0.7;\n```\n\n这组参数控制枪管过热粒子效果相关的累积与衰减行为。\n\n- `maxOverheatingValue`：过热效果使用的最大累积值。\n- `shotsToStartOverheating`：开始进入过热效果的射击次数相关参数。\n- `overheatingDecayInterval`：过热值衰减的时间间隔参数。\n\n不能据此推断 M4A1 开火 12 次就会卡弹或损坏。这段主要是粒子系统配置。\n\n不同的 `SmokingBarrel` 通过：\n\n```\nonlyWithinOverheatLimits[] = {0.5, 0.7};\n```\n\n限定生效的过热区间。\n\n通过：\n\n```\nonlyWithinRainLimits[] = {0.2, 0.5};\n```\n\n限定雨量区间。\n\n因此同一把枪在干燥天气和雨天可能显示不同的烟雾或蒸汽效果。\n\n## 九、动画和其他字段\n\n| 参数                             | 作用           |\n| ------------------------------ | ------------ |\n| `weaponStateAnim`              | 武器状态机使用的动画资源 |\n| `itemSize[] = {8,3}`           | 物品在库存网格中的尺寸  |\n| `spawnDamageRange[] = {0,0.6}` | 物品生成时的初始损伤范围 |\n| `displayName`                  | 本地化显示名称      |\n| `descriptionShort`             | 本地化物品说明      |\n| `model`                        | P3D 模型路径     |\n| `magazineSlot`                 | 射击模式使用的弹匣槽名称 |\n\n`spawnDamageRange[]` 不会影响武器开火后每发子弹的磨损，它控制生成物品时的损伤随机范围。\n\n## 十、最新资料核对与特别提醒\n\n我检索了 DayZ 官方 1.29 更新资料、Bohemia Interactive 的公开脚本仓库以及当前可访问的 DayZ 武器配置资料。\n\n有两个重要发现：\n\n第一，公开武器数据库与您提供的配置并不完全一致。 例如部分 Wiki 资料记录的 M4A1 为约 800 RPM、`dispersion = 0.00125`，而你给出的配置为约 923 RPM、`dispersion = 0.002`。这可能是游戏版本、配置来源或修改造成的差异，因此我以上所有具体计算都以你提供的数值为准，而不把旧 Wiki 数值当成当前原版配置。\n\n[image](https://www.google.com/s2/favicons?domain=https://dayz.wiki.gg\\&sz=32)\n\nDayZ Wiki+1\n\n\n\n第二，后坐力的实现可以继续追踪到实际脚本。 Bohemia Interactive 的公开仓库提供了 `RecoilBase`，其中包括 `m_RecoilModifier`、鼠标偏移、手部偏移、相机偏移及射击间隔相关字段。这比只看 `CfgWeapons` 更适合研究武器的真实后坐力行为。\n\n[image](https://www.google.com/s2/favicons?domain=https://github.com\\&sz=32)\n\nGitHub+1\n\n\n\n参考原始资料：\n\n- [BohemiaInteractive — RecoilBase 源码](https://github.com/BohemiaInteractive/DayZ-Script-Diff/blob/main/scripts/4_world/classes/recoilbase/recoilbase.c?utm_source=chatgpt.com)\n- [DayZ 1.29 — RecoilBase 脚本](https://dayzexplorer.zeroy.com/recoilbase_8c_source.html?utm_source=chatgpt.com)\n- [DayZ Wiki — 武器、伤害与护甲](https://dayz.wiki.gg/wiki/Weapons%2C_damage_and_armor?utm_source=chatgpt.com)\n- [DayZ 官方 — 1.29 更新说明](https://dayz.com/article/game-update/dayz-update-129?utm_source=chatgpt.com)\n\n对于你要进行的 DayZ 服务器武器平衡，我建议下一步优先深入研究 `recoilModifier[]`、`swayModifier[]`、`dispersion`、`initSpeedMultiplier` 和 `CfgRecoils`。这些比贴图、声音和粒子配置更直接影响玩家实际的射击体验，尤其是你想区分不同武器、枪托、护木和枪口附件的性能时。"}