rimworld吧 关注:289,331贴子:5,313,390

Rimworld 代码机制:1.6新增的生物飞行机制

只看楼主收藏回复

省流:
总结一下:目前为止(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触发降落脚本的第二次赋值。


IP属地:福建1楼2025-06-20 17:29回复
    纠正一下,是“仅给鸡鸭鹅”的
    鸡飞3秒,CD10秒
    鸭鹅飞30秒,CD10秒
    移动速率均为x2.8


    IP属地:福建3楼2025-06-20 17:36
    收起回复
      2026-04-23 23:55:04
      广告
      不感兴趣
      开通SVIP免广告
      会尝试飞行的工作:
      GotoWander
      Wait_Combat,无视种族飞行概率
      AttackStatic,无视种族飞行概率
      AttackMelee,无视种族飞行概率
      UseVerbOnThing,无视种族飞行概率
      UseVerbOnThingStatic,无视种族飞行概率
      UseVerbOnThingStaticReserve,无视种族飞行概率
      CastAbilityOnThing,无视种族飞行概率
      CastAbilityTouch,无视种族飞行概率
      CastAbilityOnThingUninterruptible,无视种族飞行概率
      CastAbilityOnThingMelee,无视种族飞行概率
      CastAbilityOnWorldTile
      简单来说,就是战斗相关和释放技能相关的,会尝试飞行。


      IP属地:福建4楼2025-06-20 17:53
      回复
        支持一下


        IP属地:河南来自iPhone客户端5楼2025-06-20 18:01
        回复
          👍


          IP属地:浙江来自Android客户端6楼2025-06-20 18:02
          回复
            no!!!我们的卡利多事业


            IP属地:江西来自Android客户端7楼2025-06-20 18:06
            回复
              泰南还是太善良了,没给原版的建筑写那条判定,可能是想给封闭阵留点后路,真的,我哭死


              来自手机贴吧8楼2025-06-20 18:11
              收起回复
                为啥深海水上方不能飞啊


                IP属地:浙江来自iPhone客户端9楼2025-06-20 18:14
                收起回复
                  2026-04-23 23:49:04
                  广告
                  不感兴趣
                  开通SVIP免广告
                  我一直在想泰南要是做载具的话是会学现在的载具框架用贴图变化来表示转向,还是会做的更细致一点


                  IP属地:江西来自Android客户端11楼2025-06-20 18:40
                  收起回复
                    泰南会不会搞个飞行单位越墙袭击啊,什么飞虫,飞机之类的,甚至出个强化喷气背包什么的。


                    IP属地:江苏来自Android客户端12楼2025-06-20 19:00
                    收起回复
                      看成高达夏亚了


                      IP属地:广东13楼2025-06-20 19:08
                      收起回复
                        我要看被米莉拉飞跃阵地,在贴吧血泪控诉口牙


                        IP属地:贵州来自Android客户端14楼2025-06-20 19:10
                        回复
                          我再重申一遍,目前为止能从不可逾越变为可通行的,只有深水地形,其他所有的,包括建筑物,包括墙体,飞行单位和地面单位都没有任何区别,不能过的依然不能过。有些人在那边越墙越地的,我真的很怀疑你们有没有看。。。


                          IP属地:福建15楼2025-06-20 19:32
                          收起回复
                            实用文,到时候用这套写点简单的战斗类飞行pawn


                            IP属地:浙江来自iPhone客户端16楼2025-06-20 19:39
                            收起回复