饥荒联机吧 关注:165,689贴子:2,755,248
  • 7回复贴,共1

关于兽群, 牛羊的分群逻辑与生娃逻辑解读

取消只看楼主收藏回复

刚看到个帖子: https://tieba.baidu.com/p/8930710067
感觉有点惊讶,电羊工厂玩法人档一个的情况下「兽群」概念还没有在贴吧达成共识,更有 8 级以上的用户的错误知识在前排,感觉会对新人造成一些误导,遂有此文,后续楼层用代码举证言论。
老规矩,百度翻译镇楼。


IP属地:湖南1楼2024-03-14 14:07回复
    因为有牛铃可以带牛离开世界,所以分群比羊更简单,不需要摧毁「兽群」后上下线,因为离开世界会导致脱离「兽群」。驯服后也是脱离「兽群」,退化后与下面的上线后逻辑一致。
    上线后<没有「群」的牛或者羊>以及退化的牛与直接刷出来的牛羊,会给自己刷一个「群」 , 但是这个时候还没有和该「群」 绑定。
    如果附近有其他 「群」, 「群」 会开始周围 20 个墙距<没有 「群」 的牛或者羊>,如果找到了就纳入到自己的「成员」中。
    有两个情况,其他 「群」 找到这个<无 「群」 牛羊>了,这时候<无 「群」 牛羊>刷的<新 「群」> 会因为没有「成员」销毁,分群失败,这也是电羊工厂要求紫宝石传送阵要有间隔的原因; 而另一个情况是新 「群」扫描逻辑先执行,找到这个<无 「群」 牛羊>,成功绑定,此时分群成功。
    所以分群只需要绑定牛铃铛拉远,离开牛群,下线,上线,就多一个群了。上下地洞也是一样。
    检查你有没有成功分群的方法:
    分之前获取当前牛群数 : c_announce(c_countprefabs("beefaloherd"))
    分后再看看有没有 +1 : c_announce(c_countprefabs("beefaloherd"))
    其他群同理
    至于拉远生孩子可以分群,是因为生孩子要的时间太久,期间上下线导致的错误归因。
    反例就是拉远后解除牛铃绑定,无论生多少,都还是原群成员。
    另外
    牛是会合群的,两个牛群距离 20 个墙内,两群数量不大于 12 且其中一群总数小于 4 就会合成一个群。羊不存在合群。
    再,牛和羊的繁殖逻辑整体基本相同,除了牛多一个繁殖后的「认妈」动作
    参考:
    components/herd.lua
    prefabs/beefaloherd.lua
    prefabs/lightinggoatherd.lua


    IP属地:湖南2楼2024-03-14 14:08
    回复
      2025-10-11 16:56:15
      广告
      不感兴趣
      开通SVIP免广告
      新的牛会给自己刷一个「群」是 herdmember 这个组件控制
      牛羊都有这个组件




      herdmember 会在初始化后刷新一个对应「群」


      IP属地:湖南4楼2024-03-14 14:12
      回复
        已有群对附近成员的「归纳」:

        可以看到兽群会一直循环,每次循环开始先收纳周边的拥有 herdmember 的存活成员。
        当兽群未满时会通过 addMember 将找到的成员收纳到自群。


        IP属地:湖南7楼2024-03-14 14:20
        回复
          20 个墙距

          关于牛的合群
          兽群 herd 有一个标志: nomerging, 默认是 false.
          如果该值为 true 则不会合群,可以看到,只有羊设置成了 true

          合群的具体逻辑如下:

          画红线的是目标群小于 4 ,且两群成员和小于等于 12
          可以看到下面的 v:Remove , 被合的群从此消失。


          IP属地:湖南9楼2024-03-14 14:27
          回复
            牛羊的生娃逻辑
            生娃是通过 periodicspawner 控制, periodicspawner 会将新生单位传送到巢穴位置,但是牛会跟着妈是被 beefaloherd 控制的。
            牛的:

            羊的:

            可以看到,牛多了一个获取 parent 逻辑,periodicspawner 传送之后,新生牛会被传送到 parent 位置。
            而 parent 的具体获取如下:

            只要没有骑手,未被完全驯化,就可以被选择。
            而 paris 遍历顺序是不确定的,而且 lua 语言未规定 pairs 遍历规范,所以同一个群哪怕没成员变更的情况下,顺序也是不可控的。
            简单来讲可以认为随机。


            IP属地:湖南10楼2024-03-14 14:40
            回复

              补一下二楼


              IP属地:湖南13楼2024-03-14 14:42
              收起回复
                看了下,应该没了,需要补充问。


                IP属地:湖南来自Android客户端15楼2024-03-14 15:02
                回复