饥荒联机版中海上漂浮物是如何刷新的?新手玩家可能对其规律还不了解,下面一起来看看饥荒联机版海上漂浮物刷新机制介绍吧。
饥荒联机版海上漂浮物刷新机制介绍
一、漂浮物种类
权重刷新物品:
中文名,代码,权重
浮木, driftwood_log, 1
船残骸, boatfragment03, 0.3
船残骸, boatfragment04,0.3
船残骸, boatfragment05, 0.3,
割下的草, cutgrass,1
绳子, twigs,1
海底垃圾, oceanfishableflotsam_water, 1
必刷物品:
漂流瓶,messagebottle
二、表层逻辑
1、漂流瓶刷新和其他物品的刷新是两个互不干扰的流程,但会共同使用一些相关函数。
2、漂流瓶的刷新周期为随机1-2天,如果随机生成的刷新点不满足条件,则会在8分之一天之后重新刷新。刷新地点为以玩家为中心,角度随机,半径40的点。
3、其他物品的首次刷新周期为随机1-150秒,之后的刷新周期为随机30-180秒。地点与漂流瓶相同。
4、每个玩家独立刷新,也就是说,凑在一起的玩家数越多,感官上刷新的会越快(多)。
三、底层逻辑
本部分所有函数默认在flotsamgerator组件下,每个生成过程都与单独一个玩家绑定。
漂流瓶刷新流程:当系统需要生成漂流瓶时,系统会首先调用StartGuaranteedSpawn函数。紧接着调用ScheduleGuaranteedSpawn函数对漂流瓶设置一个计时器,周期为1-2个游戏天数(TUNING.TOTAL_DAY_TIME)的均匀分布。当计时器时间结束,便会触发SpawnGuaranteedFlotsam函数。此时会调用SpawnFlotsamForPlayer函数对物品进行生成。生成之后会根据生成的结果回调ScheduleGuaranteedSpawn函数为漂流瓶的下次更新计时。如果生成物品成功,则按之前的时间计时;如果生成物品失败,则上述计时器的周期为8分之一游戏天数(GUARANTEED_FLOTSAM_REATTEMPT_DELAY)。
其他物品刷新流程:当系统需要生成其他漂浮物品时,系统会首先调用ScheduleSpawn函数。系统会设置一个计时器,计时周期为1-150的随机秒数(150的来源为代码中写的是180-30)。计时周期调用SpawnFlotsamForPlayer函数生成其他物品,并重新进入计时周期。之后的计时周期为30-180的随机秒数。
SpawnFlotsamForPlayer函数:首先获取玩家的位置,并判断玩家是否在船上,如果不在船上则直接返回。否则就获取船的坐标。物品刷新的位置仅与玩家位置和船的位置有关,物品位置生成的函数为GetSpawnPoint。如果生成的坐标可用,则会生成漂浮物。这里需要注意的一点,当系统需要生成漂流瓶时,会传入override_prefab和override_notrealflotsam两个参数,而当生成其他漂流物时,这两个参数传入的为空。override_prefab和override_notrealflotsam两个参数会接着传给GetSpawnPoint函数。第一个参数用来指定生成的漂浮物,如果不指定该参数,则会根据权重随机生成漂浮物。(因此只有当这里传入“漂流瓶”参数时,才能生成漂流瓶。)第二个参数override_notrealflotsam最终会被传给setinsttoflotsam函数,用来判断是否给生成物品添加"flotsam"标记。除此之外,SpawnFlotsamForPlayer函数还有一个额外的参数reschedule,这个参数类型是一个函数名。当系统从ScheduleSpawn函数地调用SpawnFlotsamForPlayer函数是,会将ScheduleSpawn函数本身作为reschedule的参数,来为下一个计时周期做准备。
SpawnFlotsam函数:该函数共有3个参数spawnpoint, prefab, notrealflotsam。spawnpoint为从SpawnFlotsamForPlayer函数传进来的物品坐标,prefab为指定生成物品(可以为空)。notrealflotsam会传给setinsttoflotsam函数。如上述所说,函数会先判断prefab是否为空,如果为空,则通过权重随机选择一个物品生成。之后生成一个随机数,用来判断是否对物品旋转180度。然后将物品转移到相应的坐标,然后将物品和notrealflotsam参数传入setinsttoflotsam函数。
GetSpawnPoint函数:生成坐标。。大致思想是,以玩家坐标为基础,角度随机,半径为40的点生成。会对坐标的可用性进行判断。
setinsttoflotsam函数:该函数共有三个参数,inst, time, notag。inst为要生成的物品。如果time为空,则会将time赋值为3-4个游戏周期(均匀分布)。该时间被用来计算物品刷新到沉没的时间。notag用来判断是否增加"flotsam"tag。同时,为物品设计3个监听事件,分别为到沉没时间、被捡起、被移除。之后会分别有其他函数来对应处理。比较有意思的是,当物品沉没时,会在物品原坐标处生成一个“splash_sink”。(本人在游戏中测试了一下,好像是一个气泡。)
整体逻辑:
有一个变量_maxflotsam,用来控制最大的漂浮物数量,目前为4(但是并没有在程序中看到对当前漂浮物数量的判断。所以这个变量可能并未被实际使用)。
当生成世界时,会对_updating变量进行判断,如果为false,则置为true,并让所有在_activeplayers列表中的玩家进入漂流瓶生成流程和其他漂浮物生成流程。如果为true,则删除当前所有的漂浮物(包括漂流瓶)的数据,并重新生成。。
当新玩家进入游戏时,会将玩家添加到_activeplayers列表中。同时进入生成漂流瓶的流程。除此之外,会判断_updating变量。如果为true,则额外进入生成其他漂浮物的流程。
全部评论