【BUG?】摔落缓冲附魔会加快下落速度
Closed this issue · 5 comments
在写百科资料时发现的:根据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); }
- 逻辑解析:
- 获取附魔等级:通过
EnchantmentHelper获取玩家装备的摔落保护附魔等级(level)。 - 调整重力减少系数:
- 初始值为
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。
- 附魔等级 1:
- 初始值为
- 获取附魔等级:通过
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)。- 计算过程:
- 将调整后的重力
g叠加到当前垂直速度motion.y。 - 结果乘以
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%。
- 这可能导致高附魔等级的实际减速效果反而更弱。
- 摔落保护附魔本应进一步减缓下落速度,但代码中
-
可能原因:
- 变量名误导:
gravityReductionFactor实际是“重力保留系数”,而非“减少比例”。- 例如,
0.85表示保留 85% 的重力(减少 15%)。 - 附魔等级增加时,保留更多重力(减少的幅度更小),导致减速效果降低。
- 例如,
- 代码逻辑错误:开发者可能误用公式,正确做法应为:
gravityReductionFactor = Math.max(0.5, gravityReductionFactor - 0.05 * level);
- 附魔等级越高,重力减少幅度越大。
- 变量名误导:
5. 改进建议
-
修正重力调整逻辑:
// 初始值设为 1.0(无修正) float baseReduction = 1.0f; // 每级附魔减少 0.1 的重力影响 gravityReductionFactor = baseReduction - 0.1f * level; // 设置下限(如至少保留 50% 重力) gravityReductionFactor = Math.max(0.5f, gravityReductionFactor);
- 确保附魔等级越高,重力减少幅度越大。
-
重命名变量:
float gravityMultiplier = 1.0f - 0.15f * level; // 更直观的命名
-
验证物理效果:
- 通过实际测试确保高附魔等级确实能显著减缓下落速度,避免逻辑与预期不符。
总结
摔落保护附魔通过增加 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%,达到下限)。
总结
当前代码中,摔落保护附魔的数学关系是 反直觉的,导致附魔等级越高,对下落速度的减缓效果反而越弱。需重新设计函数逻辑以符合预期。
AI的分析实际上是完全错误的,但是这里实际上发生了更幽默的现象。
反直觉但应该在MC里是常识的是Y轴越大表示越高,所以gravityReductionFactor大于1时实际上会导致玩家自行飞天。
问题还没完,实际上拔刀剑的附魔一直是处于无法正常触发的状态。没错,因为检测的是玩家装备栏的附魔,却无法检测到主手装备的拔刀剑。
同时,由于Furia少打了一个0,导致Min函数实际上没有了实际意义:原本设想的效果是Factor是每级附魔只有微乎其微的效果,然后最高可以叠加到0.93这一数值(不至于让玩家直接升天),但是由于原来的0.02变成了0.2,导致只需要一级附魔效果就可以吃到最大效果,根据阎魔刀的预设数值和原版摔落缓冲的最大等级来看,可以认为Furia从一开始就整了一连串巨大的乌龙。
下个版本修复并调整至合理数值。
AI的分析实际上是完全错误的,但是这里实际上发生了更幽默的现象。
反直觉但应该在MC里是常识的是Y轴越大表示越高,所以gravityReductionFactor大于1时实际上会导致玩家自行飞天。
问题还没完,实际上拔刀剑的附魔一直是处于无法正常触发的状态。没错,因为检测的是玩家装备栏的附魔,却无法检测到主手装备的拔刀剑。
同时,由于Furia少打了一个0,导致Min函数实际上没有了实际意义:原本设想的效果是Factor是每级附魔只有微乎其微的效果,然后最高可以叠加到0.93这一数值(不至于让玩家直接升天),但是由于原来的0.02变成了0.2,导致只需要一级附魔效果就可以吃到最大效果,根据阎魔刀的预设数值和原版摔落缓冲的最大等级来看,可以认为Furia从一开始就整了一连串巨大的乌龙。
下个版本修复并调整至合理数值。
有点生草,不过能修就好(