gta6吧 关注:241,391贴子:4,577,638

GTA 在线模式“下午三点”每日更新原理

只看楼主收藏回复

2022 年的冬季更新,Rockstar 修复了长期存在的外贸出口卡住不更新的 bug。不仅如此,Rockstar 还把修复后的更新机制套用到许多新推出的玩法上,包括实验室生产加速、枪支厢型车、街头毒贩、藏匿屋等等。
玩家们很早就已经发现规律,外贸出口在北京时间每天下午三点更新。经过这次修复,这个说法仍然基本正确,不过不够全面。本贴将详细阐述修复后的更新机制。




IP属地:广东1楼2023-01-15 19:22回复
    • 名词解释
    UTC 时间:协调世界时,几乎等同于格林尼治时间,落后北京时间 8 小时,即 BJT = UTC + 8h。
    (Unix)时间戳:当前时刻和 1970 年 1 月 1 日 0 时 0 分 0 秒(均为 UTC 时间)之间相差的秒数。


    IP属地:广东2楼2023-01-15 19:23
    收起回复
      • CBV_RESET_TIME
      GTA 在线模式角色有数以万计存储在服务器上的统计数据,其中用于控制外贸出口的统计数据叫做 CBV_RESET_TIME(CBV 是 chalk board vehicle,即黑板载具的缩写)。
      CBV_RESET_TIME 是与角色关联的统计数据。对于一角色,这个统计数据的全称是 MP0_CBV_RESET_TIME。二角色的则是 MP1_CBV_RESET_TIME。二者完全独立。
      CBV_RESET_TIME 存储的是一个时间戳,对应该角色最近一次更新外贸出口的时刻。举个例子,一个角色的外贸出口在今天(2023年1月15日)15:30 更新,那么他的 CBV_RESET_TIME 就等于 1673767800。


      IP属地:广东3楼2023-01-15 19:26
      回复
        • 外贸天数
        CBV_RESET_TIME 用来计算一个非常重要的数字:
        外贸天数 = (CBV_RESET_TIME − DAILY_OBJ_TIME_REFRESH * 3600) / 86400,
        其中,DAILY_OBJ_TIME_REFRESH = 6,所以
        外贸天数 = (CBV_RESET_TIME − 6 * 3600) / 86400。
        DAILY_OBJ_TIME_REFRESH 是可调参数,含义是每日任务刷新时间,默认值为 6。这就是为什么每日任务的刷新时间为每天的 UTC 时间 6 点,即北京时间 14 点。考虑到 Rockstar 几乎不可能更改它的值,为了方便起见,本贴后面不会用冗长的 DAILY_OBJ_TIME_REFRESH 指代它,而是直接使用它的默认值 6。
        外贸天数的含义是 CBV_RESET_TIME 和 UTC 时间 1970 年 1 月 1 日 6 点之间相差的天数(一小时 3600 秒,一天 86400 秒)。外贸天数是整数,式中的除法是整数除法,小数部分直接忽略。如果代入 CBV_RESET_TIME = 1673767800,可以算得外贸天数等于 19372。从式中可以看出,每当 CBV_RESET_TIME 跨过 UTC 时间 6 点,计算得到的外贸天数就会改变。
        Unix 时间的使用非常广泛,楼主尝试查找 “与 1970 年 1 月 1 日相差的天数”有没有广为接受的简明称呼,但是没有找到。再者,这里讨论的是“与 1970 年 1 月 1 日 6 点之间相差的天数”,二者也不完全等同。考虑到它是由 CBV_RESET_TIME(黑板载具重置时刻)计算得来,本贴姑且把这个天数称为“外贸天数”。


        IP属地:广东4楼2023-01-15 19:31
        回复
          • 受 CBV_RESET_TIME 控制的每天更新的事项
          每当 CBV_RESET_TIME 更新时,它存储的值改为当时的时间戳。然后,游戏用 CBV_RESET_TIME 的新值算出新的外贸天数,接着重置和更新一系列事项。
          1. 重置外贸出口载具清单的交付记录(指黑板上的哪些车已经被交付)和完成记录(指是否交付全部 10 辆载具)。
          2. 以外贸天数为随机种子,随机计算外贸出口载具清单,以及它们在战局中的刷出顺序。
          3. 重置洛圣都车友会的每日一次性的额外洛圣都车友会声望值奖励的获得记录,包括 11 项:进入车友会、将个人载具带入车友会、在车友会改装个人载具、将个人载具带入试车赛道、将测试载具带入试车赛道、完成试车赛道的时间挑战赛、完成双龙斗、完成争先恐后、完成冲刺竞赛、完成街头竞速、完成追逐竞速。
          4. 重置藏匿屋的劫掠记录。然后以外贸天数为随机种子,随机计算藏匿屋的位置。
          5. 以外贸天数为随机种子,随机计算三个街头毒贩的位置、为哪种产品开出高价以及四种产品的开价。
          6. 以外贸天数为随机种子,随机计算枪支厢型车的位置。
          7. 重置致幻剂实验室的加速记录。
          8. 楼主暂时没有弄清第 8 个事项是什么,应该和夜总会、赌场、佩里科岛沙滩的酒吧有关。

          可以看到,有 4 个事项都是本次 DLC 更新添加的内容。在以后的 DLC 更新中,这个列表完全有可能变得更长。


          IP属地:广东5楼2023-01-15 19:35
          收起回复
            看不明白,太专业。
            就说2023年,每次更新是不是还是北京时间每周4晚4点后更新。
            新出的随机箱型车武器店是不是北京时间每天下午3点后更新随机地点。


            IP属地:黑龙江来自Android客户端6楼2023-01-15 19:39
            收起回复
              • CBV_RESET_TIME 的更新逻辑
              上面提到,要执行这一系列的重置和更新,前提是 CBV_RESET_TIME 更新。这就引出两个问题:
              第一,怎么判断 CBV_RESET_TIME 是不是需要更新?
              第二,什么时候判断 CBV_RESET_TIME 是不是需要更新?
              首先回答第一个问题。以下全部是 UTC 时间。
              设 CBV_RESET_TIME 存储的时间戳为 t0,对应 y0 年 m0 月 d0 日 h0 时 m0 分 s0 秒。当前时刻为 t1,对应 y1 年 m1 月 d1 日 h1 时 m1 分 s1 秒。相关代码如下。

              1. 判断 t1 − t0 是否大于等于 86400(即一天的秒数)。如果是,则判定为需要更新,否则继续执行第 2 步。
              2. 判断 t1 和 t0 是否在同一天里,也就是判断 y0 = y1 且 m0 = m1 且 d0 =d1 是否成立。
               ① 如果 t1 和 t0 是同一天,则判断 h0 < 6 且 h1 ≥ 6 是否成立。如果是,则判定为需要更新,否则判定为无需更新。
               ② 如果 t1 和 t0 不是同一天,则判断 h1 > 6 是否成立。如果是,则判定为需要更新,否则判定为无需更新。
              如有需要可参考下面两张表格。



              IP属地:广东7楼2023-01-15 19:40
              回复
                • CBV_RESET_TIME 的更新时机
                现在回答第二个问题:游戏什么时候应用上面那套古怪的逻辑,来判断 CBV_RESET_TIME 是否需要更新呢?这个问题不是很重要,反正只要重启游戏就可以确保当前角色的 CBV_RESET_TIME 处于最新状态。而且楼主目前也不知道确切的答案。不过,根据经验,楼主认为,答案最有可能是:每次启动游戏后,首次进入在线模式时。
                其实,Rockstar 还考虑到了连续 24 小时不关闭游戏的一种情况。不过这种情况太过罕见,本贴就不将其纳入考虑了。
                不重启游戏可能会遇到一些小问题,以下是一例。假设两个角色的 CBV_RESET_TIME 都需要更新。启动游戏后,首次进入在线模式时,游戏更新当前角色的 CBV_RESET_TIME,并用它计算外贸天数。然后,玩家更换角色重新上线,这不算“首次进入在线模式”,所以游戏有可能不会更新后一个角色的 CBV_RESET_TIME。而游戏刚才已经用前一个角色的 CBV_RESET_TIME 算好了外贸天数,更换角色后有可能不会再重新计算。于是后一个角色的 CBV_RESET_TIME 和外贸天数不一致,有可能造成某些事项存在错乱。
                此外,加入外贸天数与自己不一样的玩家的战局也有可能会发现某些事项和预期不一致。


                IP属地:广东8楼2023-01-15 19:46
                回复
                  一脸兴奋的进来,一脸懵逼的出去了。


                  IP属地:浙江9楼2023-01-15 19:49
                  收起回复
                    • 结论
                    以下均为北京时间。“上线”指启动游戏后,首次进入在线模式。
                    ◦ 完整结论
                    1. 上线时,如果距离上一次上线已有 24 小时,那么当前角色的 CBV_RESET_TIME 将更新。
                    2. 上线时,如果距离上一次上线不到 24 小时。
                     ① 如果当前在 8 点(含)到 14 点(不含)之间,且上一次上线在昨天 14 点之前,那么当前角色的 CBV_RESET_TIME 将更新,否则不更新。
                     ② 如果当前在 14 点(含)到 15 点(不含)之间,且上一次上线在今天 8 点(含)到 14 点(不含)之间,那么当前角色的 CBV_RESET_TIME 将更新,否则不更新。
                     ③ 如果当前在 15 点(含)到次日 8 点(不含)之间,且上一次上线在今天 14 点之前,那么当前角色的 CBV_RESET_TIME 将更新,否则不更新。
                    CBV_RESET_TIME 更新为当前时刻后,游戏接着执行一系列重置和更新,见 5 楼。
                    ◦ 简略结论
                    如果离上次上线已有 24 小时,那么再次上线必定更新,而且如果是在 8 点到 14 点之间上线,那么一过 14 点又会更新(一般需要重启游戏)。通常情况下,可以大致认为是每天 15 点更新。


                    IP属地:广东10楼2023-01-15 19:49
                    回复


                      IP属地:山东来自Android客户端11楼2023-01-15 19:55
                      回复
                        原贴 UFO观光卡进度的根本原因和避免方法 的主题是 UFO 观光,这是一个限时事件。楼主将原贴内容修改重发,主要关注长期生效的,也是更本质的 CBV_RESET_TIME。


                        IP属地:广东来自Android客户端12楼2023-01-15 20:00
                        回复


                          IP属地:山东来自Android客户端13楼2023-01-15 20:14
                          回复
                            挺好


                            星座王
                            点亮12星座印记,去领取
                            活动截止:2100-01-01
                            去徽章馆》
                            IP属地:上海来自Android客户端14楼2023-01-15 20:43
                            回复
                              围观大佬


                              IP属地:河南来自Android客户端15楼2023-01-15 20:57
                              回复