服务器时间

Yandex Games SDK 允许获取与服务器同步的时间。 该方法适用于:

  • 防作弊保护:用户无法通过更改设备时间来影响游戏进程。
  • 游戏事件:基于此,您可以添加需要可信时间来源的活动和奖励(例如,每日或每周奖励、季节性活动和任务)。

ysdk.serverTime()

该方法返回 timestamp,即服务器时间(以毫秒为单位),在所有设备上保持一致。 它与 Date.now() 的返回结果格式相似,但后者返回的是用户设备的时间,该时间可能与服务器时间不同,且无法防止玩家篡改。 方法 ysdk.serverTime() 对设备系统时间的篡改具有抵抗力,因此更加可靠。

每当您需要获取当前时间时,就调用它。

1const ysdk = await YaGames.init();
2
3// 返回与服务器同步的毫秒时间。
4ysdk.serverTime(); // 例如,1720613073778。
5
6// 一段时间后再次调用。
7ysdk.serverTime(); // 例如,1720613132635。
1YaGames.init()
2    .then((ysdk) => {
3        // 返回与服务器同步的时间(以毫秒为单位)。
4        ysdk.serverTime(); // 例如,1720613073778。
5
6        // 一段时间后再次调用。
7        ysdk.serverTime(); // 例如,1720613132635。
8    });

每日奖励实现示例

  • 使用 ysdk.serverTime() 获取可靠的服务器时间。
  • 通过 player.setData() 保存数据。
  • 实现了防止重复领取奖励的保护机制。
  • 以安全的方式对时间进行比较。

重要

示例中的 giveReward() 函数是你自行实现的,负责发放玩家奖励。

距上次登录游戏后24小时获得奖励

 1YaGames.init()
 2    .then(async (ysdk) => {
 3        // 初始化玩家。
 4        const player = await ysdk.getPlayer();
 5
 6        // 获取已保存的数据。
 7        const data = await player.getData();
 8
 9        // 当前服务器时间。
10        const currentTime = ysdk.serverTime();
11
12        // 上次领取奖励的时间(如果没有,则使用0)。
13        const lastRewardTime = data.lastRewardTime || 0;
14
15        // 24小时的毫秒数。
16        const DAY_IN_MS = 24 * 60 * 60 * 1000;
17
18        if (currentTime - lastRewardTime >= DAY_IN_MS) {
19            // 已经过了24小时,可以发放奖励。
20            await giveReward(); // 您的奖励发放函数。
21
22            // 保存新的领奖时间。
23            await player.setData({
24                lastRewardTime: currentTime
25            });
26        }
27    });

奖励每天(UTC时间午夜重置一次)

 1YaGames.init()
 2    .then(async (ysdk) => {
 3        // 初始化玩家。
 4        const player = await ysdk.getPlayer();
 5
 6        // 获取已保存的数据。
 7        const data = await player.getData();
 8
 9        // 当前服务器时间。
10        const currentTime = ysdk.serverTime();
11
12        // 获取上次领奖日期,格式为 "YYYY-MM-DD"。
13        const lastRewardDate = data.lastRewardDate || '';
14
15        // 获取当前日期,格式为 "YYYY-MM-DD"。
16        const currentDate = new Date(currentTime).toISOString().split('T')[0];
17
18        if (currentDate !== lastRewardDate) {
19            // 今天还没有领取奖励。
20            await giveReward(); // 您的奖励发放函数。
21
22            // 保存领奖日期。
23            await player.setData({
24                lastRewardDate: currentDate
25            });
26        }
27    });

备注

支持服务员工帮助将成品游戏发布到 Yandex Games 平台。 关于开发和测试的具体问题,其他开发者会在Discord 社区中给出针对性解答。

如果在使用 Yandex Games SDK 时遇到问题或有疑问,请联系技术支持:

写入聊天信息
上一篇
下一篇