省流:
总结一下:目前为止(2025.6.20),飞行代码完全是给鸭子写的
简单来说,他的机制就是让鸭子获得一个2.8移动倍速,并且可以逾越深水,但在深水上被击落时直接秒掉不留尸体
除此之外没有任何其他新机制。
modder们想要使用必须要做出很大的修改。
飞行状态由Pawn_FlightTracker来控制
飞行有四种状态FlightState:地面状态(Grounded),起飞阶段(TakingOff,持续50ticks),飞行中阶段(Flying),降落阶段(Landing,持续50ticks)
并且有两个相关的Stat:
MaxFlightTime:最高飞行时长,单位是秒,默认为0
FlightCooldown:飞行冷却,单位是秒
名词解释:
是否已经处于飞行:除了地面状态,剩下三种状态都视为处于“飞行状态”
能否飞行CanEverFly:如果一个生物的MaxFlightTime不为0,并且没有处于“禁用飞行”的异象实体状态,那么这个生物就具备飞行能力。
当前能否飞行CanFlyNow:首先要满足CanEverFly的条件,且当前不处于“飞行状态”或者飞行冷却状态,那么当前就允许飞行
起飞:持续50tick的动画,渲染位置逐渐上移
降落:持续50tick的动画,渲染位置逐渐恢复。如果降落阶段结束时Pawn是倒地状态且当前位置不可通行,那么立刻击杀该生物且摧毁它的尸体(可能出现这种情况的只有被击倒且降落在深水)
飞行时长:当处于飞行中阶段一定时间后,就会切换为降落阶段。起飞和降落不会消耗这个计时。
飞行冷却:降落后会触发飞行冷却,只有处于地面状态下才会进行冷却的计算。
强制降落:转入降落阶段,且使降落阶段从25tick时开始。强制降落会在获取新工作时触发,也会在被击倒时触发。
逻辑说明:
当生物执行一个新的工作时,首先判断“能否飞行CanEverFly”,如果不能则该Tracker不工作。
否则,会执行以下判断
1.该工作要求尝试飞行
2.当前可以飞行CanFlyNow,需要注意的是已经处于“飞行状态”的生物会被视为不可以飞行
3.根据工作和种族进行一次随机数,随机数成功
如果满足所有判断,那么尝试起飞
否则,不起飞且如果正在处于“飞行状态”,那么强制落地
总结一下:当前在地上,遇到要求飞行的工作,概率起飞
飞行状态,遇到新工作,无论如何立刻下降
【插一句这里代码有明显的逻辑BUG,判断有一行(job.def.tryStartFlying || job.def.ifFlyingKeepFlying) && job.def.tryStartFlying,是明显的若只错误】
飞行状态特点:
1.不再受地板的移动减速影响
2.无视水地形的移动影响
3.无视陷阱
4.不再在移动时产生污渍
5.flightSpeedFactor获得额外的飞行速度乘数,默认是280%,可以在RaceProperties手动调
6.飞行生物和地面生物不会互相堵路(但两个飞行动物之间的堵路判断与两个地面生物一样)
7.可以无视某些无法通行建筑物,也就是寻路相关forcePassableByFlyingPawns:
a.不可通行但允许飞行生物通过的地形,视为可以通行。
飞行后从不能过变为能过的地形:深水
飞行后依然不能过的地形:深海水
原版只有这两种地形是不可通行的
b.不可通行但允许飞行生物通过的建筑,视为可以通行。
原版不存在这种建筑,可能还在更新
分析过程中遇到的三个问题已经上报
1.(flagA || flagB) && flagA,最无法描述的若只错误
2.已经落地的飞行生物在遇到“需要飞行的工作时”起飞,而“已经起飞的飞行生物”在遇到“需要飞行的工作时”强制落地
老子中午让你吃饭,你手里没筷子,你去拿筷子,没毛病,晚上你拿着筷子要来吃饭,我把你筷子打掉让你用手吃,你觉得这个事情是对的吗?
没筷子的,去拿筷子吃饭,已经拿着筷子的,给我把筷子扔了用手吃,你是这么吃饭的嘛?
3.ForceLand的逻辑给flightCooldownTicks赋值了两次,并且两次赋值之间,flightCooldownTicks没有变动,也没有检测。
这两次分别是ForceLand主动赋值,以及ForceLand触发降落脚本的第二次赋值。
总结一下:目前为止(2025.6.20),飞行代码完全是给鸭子写的
简单来说,他的机制就是让鸭子获得一个2.8移动倍速,并且可以逾越深水,但在深水上被击落时直接秒掉不留尸体
除此之外没有任何其他新机制。
modder们想要使用必须要做出很大的修改。
飞行状态由Pawn_FlightTracker来控制
飞行有四种状态FlightState:地面状态(Grounded),起飞阶段(TakingOff,持续50ticks),飞行中阶段(Flying),降落阶段(Landing,持续50ticks)
并且有两个相关的Stat:
MaxFlightTime:最高飞行时长,单位是秒,默认为0
FlightCooldown:飞行冷却,单位是秒
名词解释:
是否已经处于飞行:除了地面状态,剩下三种状态都视为处于“飞行状态”
能否飞行CanEverFly:如果一个生物的MaxFlightTime不为0,并且没有处于“禁用飞行”的异象实体状态,那么这个生物就具备飞行能力。
当前能否飞行CanFlyNow:首先要满足CanEverFly的条件,且当前不处于“飞行状态”或者飞行冷却状态,那么当前就允许飞行
起飞:持续50tick的动画,渲染位置逐渐上移
降落:持续50tick的动画,渲染位置逐渐恢复。如果降落阶段结束时Pawn是倒地状态且当前位置不可通行,那么立刻击杀该生物且摧毁它的尸体(可能出现这种情况的只有被击倒且降落在深水)
飞行时长:当处于飞行中阶段一定时间后,就会切换为降落阶段。起飞和降落不会消耗这个计时。
飞行冷却:降落后会触发飞行冷却,只有处于地面状态下才会进行冷却的计算。
强制降落:转入降落阶段,且使降落阶段从25tick时开始。强制降落会在获取新工作时触发,也会在被击倒时触发。
逻辑说明:
当生物执行一个新的工作时,首先判断“能否飞行CanEverFly”,如果不能则该Tracker不工作。
否则,会执行以下判断
1.该工作要求尝试飞行
2.当前可以飞行CanFlyNow,需要注意的是已经处于“飞行状态”的生物会被视为不可以飞行
3.根据工作和种族进行一次随机数,随机数成功
如果满足所有判断,那么尝试起飞
否则,不起飞且如果正在处于“飞行状态”,那么强制落地
总结一下:当前在地上,遇到要求飞行的工作,概率起飞
飞行状态,遇到新工作,无论如何立刻下降
【插一句这里代码有明显的逻辑BUG,判断有一行(job.def.tryStartFlying || job.def.ifFlyingKeepFlying) && job.def.tryStartFlying,是明显的若只错误】
飞行状态特点:
1.不再受地板的移动减速影响
2.无视水地形的移动影响
3.无视陷阱
4.不再在移动时产生污渍
5.flightSpeedFactor获得额外的飞行速度乘数,默认是280%,可以在RaceProperties手动调
6.飞行生物和地面生物不会互相堵路(但两个飞行动物之间的堵路判断与两个地面生物一样)
7.可以无视某些无法通行建筑物,也就是寻路相关forcePassableByFlyingPawns:
a.不可通行但允许飞行生物通过的地形,视为可以通行。
飞行后从不能过变为能过的地形:深水
飞行后依然不能过的地形:深海水
原版只有这两种地形是不可通行的
b.不可通行但允许飞行生物通过的建筑,视为可以通行。
原版不存在这种建筑,可能还在更新
分析过程中遇到的三个问题已经上报
1.(flagA || flagB) && flagA,最无法描述的若只错误
2.已经落地的飞行生物在遇到“需要飞行的工作时”起飞,而“已经起飞的飞行生物”在遇到“需要飞行的工作时”强制落地
老子中午让你吃饭,你手里没筷子,你去拿筷子,没毛病,晚上你拿着筷子要来吃饭,我把你筷子打掉让你用手吃,你觉得这个事情是对的吗?
没筷子的,去拿筷子吃饭,已经拿着筷子的,给我把筷子扔了用手吃,你是这么吃饭的嘛?
3.ForceLand的逻辑给flightCooldownTicks赋值了两次,并且两次赋值之间,flightCooldownTicks没有变动,也没有检测。
这两次分别是ForceLand主动赋值,以及ForceLand触发降落脚本的第二次赋值。

13








