SlashBlade: Resharped

SlashBlade: Resharped

185k Downloads

【BUG?】摔落缓冲附魔会加快下落速度

Closed this issue · 5 comments

commented

在写百科资料时发现的:根据mods.flammpfeil.slashblade.event.FallHandler.fallDecrease方法,当玩家手持的拔刀剑带有摔落缓冲附魔时,其下落速度反而会比无附魔时更大。
由于种种原因,我难以在游戏中验证,但由代码计算得出的结果是这样的(
下面是某AI分析的结果,仅供参考:

fallDecrease 方法中,摔落保护附魔(Feather Falling)通过调整重力减少系数(gravityReductionFactor)来影响实体的下落速度。以下是具体作用机制和代码逻辑的详细分析:


1. 附魔等级获取与重力调整

  • 代码段
    int level = EnchantmentHelper.getEnchantmentLevel(Enchantments.FALL_PROTECTION, user);
    if (0 < level) {
        gravityReductionFactor = Math.min(0.93, gravityReductionFactor + 0.2 * level);
        AdvancementHelper.grantedIf(Enchantments.FALL_PROTECTION, user);
    }
  • 逻辑解析
    1. 获取附魔等级:通过 EnchantmentHelper 获取玩家装备的摔落保护附魔等级(level)。
    2. 调整重力减少系数
      • 初始值为 0.85(无附魔时的默认值)。
      • 每级附魔增加 0.2 的系数,但上限为 0.93
      • 例如:
        • 附魔等级 1:0.85 + 0.2 * 1 = 1.05 → 被限制为 0.93
        • 附魔等级 2:0.85 + 0.2 * 2 = 1.25 → 仍限制为 0.93

2. 重力计算与速度修正

  • 重力计算

    double g = gravity.getValue() * gravityReductionFactor;
    • gravity.getValue() 是实体原始的重力值(如 Minecraft 默认的 0.08)。
    • 通过 gravityReductionFactor 调整后的重力值 g 会直接作用于下落速度。
  • 速度修正

    user.setDeltaMovement(motion.x, (motion.y + g) * currentRatio, motion.z);
    • currentRatio:从 FallDecreaseRate 获取的减速比例(逐步增加到 1.0)。
    • 计算过程
      1. 将调整后的重力 g 叠加到当前垂直速度 motion.y
      2. 结果乘以 currentRatio,最终减缓下落速度。

3. 实际效果分析

  • 无附魔时

    • gravityReductionFactor = 0.85 → 重力减少 15%。
    • 例如,原始重力为 0.08 → 调整后 0.08 * 0.85 = 0.068
    • 叠加到 motion.y 后,垂直速度增幅更小,下落更慢。
  • 有附魔时

    • gravityReductionFactor 提高(但不超过 0.93)→ 重力减少幅度更小。
    • 例如,原始重力 0.08 → 调整后 0.08 * 0.93 = 0.0744
    • 叠加到 motion.y 后,垂直速度增幅略大,但通过 currentRatio 的乘法修正,整体仍比无附魔时更慢。

4. 矛盾点与潜在问题

  • 反直觉的设计

    • 摔落保护附魔本应进一步减缓下落速度,但代码中 gravityReductionFactor 的增加反而减少了重力修正的幅度(例如从 15% 减伤变为 7%)。
    • 例如:
      • 无附魔时,重力减少 15%;附魔等级 1 时,重力减少 7%。
      • 这可能导致高附魔等级的实际减速效果反而更弱。
  • 可能原因

    1. 变量名误导gravityReductionFactor 实际是“重力保留系数”,而非“减少比例”。
      • 例如,0.85 表示保留 85% 的重力(减少 15%)。
      • 附魔等级增加时,保留更多重力(减少的幅度更小),导致减速效果降低。
    2. 代码逻辑错误:开发者可能误用公式,正确做法应为:
      gravityReductionFactor = Math.max(0.5, gravityReductionFactor - 0.05 * level);
      • 附魔等级越高,重力减少幅度越大。

5. 改进建议

  1. 修正重力调整逻辑

    // 初始值设为 1.0(无修正)
    float baseReduction = 1.0f;
    // 每级附魔减少 0.1 的重力影响
    gravityReductionFactor = baseReduction - 0.1f * level;
    // 设置下限(如至少保留 50% 重力)
    gravityReductionFactor = Math.max(0.5f, gravityReductionFactor);
    • 确保附魔等级越高,重力减少幅度越大。
  2. 重命名变量

    float gravityMultiplier = 1.0f - 0.15f * level; // 更直观的命名
  3. 验证物理效果

    • 通过实际测试确保高附魔等级确实能显著减缓下落速度,避免逻辑与预期不符。

总结

摔落保护附魔通过增加 gravityReductionFactor 的值(上限 0.93),略微减少了重力修正的幅度,但这一设计与预期效果可能存在矛盾。建议审查重力计算逻辑,确保附魔等级越高,下落速度减缓越明显。

数学函数描述(基于当前错误逻辑)

在当前代码的错误逻辑下,摔落保护附魔等级(记为 ( l ),且 ( l \geq 0 ))对重力影响的数学关系如下:


1. 重力修正系数函数

定义修正系数 ( f(l) ) 为附魔等级 ( l ) 的函数:
[
f(l) =
\begin{cases}
0.85, & l = 0 \
\min\left(0.85 + 0.2l, \ 0.93\right), & l \geq 1
\end{cases}
]


2. 实际重力计算

假设实体原始重力加速度为 ( g_0 ),则修正后的重力 ( g_{\text{adjusted}} ) 为:
[
g_{\text{adjusted}} = g_0 \cdot f(l)
]


函数行为分析

附魔等级 ( l ) 计算过程 修正系数 ( f(l) ) 实际重力 ( g_{\text{adjusted}} ) 修正效果
( l = 0 ) ( 0.85 ) ( 0.85 ) ( 0.85g_0 ) 重力减少 15%
( l = 1 ) ( \min(0.85 + 0.2 \cdot 1, 0.93) = 0.93 ) ( 0.93 ) ( 0.93g_0 ) 重力减少 7%(效果变差)
( l \geq 2 ) ( \min(0.85 + 0.2l, 0.93) = 0.93 ) ( 0.93 ) ( 0.93g_0 ) 效果与 ( l=1 ) 相同

矛盾点与错误结论

  • 反直觉设计
    • 当 ( l = 0 )(无附魔)时,重力减少幅度更大(15%)。
    • 当 ( l \geq 1 )(有附魔)时,重力减少幅度反而更小(7%),导致玩家下落速度更快。
  • 根本原因
    • 附魔等级提高时,修正系数 ( f(l) ) 增加(( 0.85 \to 0.93 )),导致重力保留更多(减少幅度更低)。
    • 代码中的 gravityReductionFactor 实际是“重力保留系数”,而非“减少系数”。

修正建议的对比函数

若需正确实现附魔等级越高、减速越强的效果,修正后的函数应为:
[
f_{\text{correct}}(l) = \max\left(0.5, \ 0.85 - 0.1l\right)
]

  • 效果
    • ( l = 0 ): ( 0.85g_0 )(减少 15%)。
    • ( l = 1 ): ( 0.75g_0 )(减少 25%)。
    • ( l = 4 ): ( 0.5g_0 )(减少 50%,达到下限)。

总结

当前代码中,摔落保护附魔的数学关系是 反直觉的,导致附魔等级越高,对下落速度的减缓效果反而越弱。需重新设计函数逻辑以符合预期。

commented

Furia又在代码里拉大便了?
等会我就开始测试。

commented

经过测试,缓降实际无法正常触发。
会尝试进行修复。

commented

AI的分析实际上是完全错误的,但是这里实际上发生了更幽默的现象。
反直觉但应该在MC里是常识的是Y轴越大表示越高,所以gravityReductionFactor大于1时实际上会导致玩家自行飞天。
问题还没完,实际上拔刀剑的附魔一直是处于无法正常触发的状态。没错,因为检测的是玩家装备栏的附魔,却无法检测到主手装备的拔刀剑。
同时,由于Furia少打了一个0,导致Min函数实际上没有了实际意义:原本设想的效果是Factor是每级附魔只有微乎其微的效果,然后最高可以叠加到0.93这一数值(不至于让玩家直接升天),但是由于原来的0.02变成了0.2,导致只需要一级附魔效果就可以吃到最大效果,根据阎魔刀的预设数值和原版摔落缓冲的最大等级来看,可以认为Furia从一开始就整了一连串巨大的乌龙。
下个版本修复并调整至合理数值。

commented

AI的分析实际上是完全错误的,但是这里实际上发生了更幽默的现象。
反直觉但应该在MC里是常识的是Y轴越大表示越高,所以gravityReductionFactor大于1时实际上会导致玩家自行飞天。
问题还没完,实际上拔刀剑的附魔一直是处于无法正常触发的状态。没错,因为检测的是玩家装备栏的附魔,却无法检测到主手装备的拔刀剑。
同时,由于Furia少打了一个0,导致Min函数实际上没有了实际意义:原本设想的效果是Factor是每级附魔只有微乎其微的效果,然后最高可以叠加到0.93这一数值(不至于让玩家直接升天),但是由于原来的0.02变成了0.2,导致只需要一级附魔效果就可以吃到最大效果,根据阎魔刀的预设数值和原版摔落缓冲的最大等级来看,可以认为Furia从一开始就整了一连串巨大的乌龙。
下个版本修复并调整至合理数值。

有点生草,不过能修就好(

commented

已经于1.2.32当中修复。