Серверное время

SDK Яндекс Игр позволяет получить время, синхронизированное с сервером. Метод полезен для:

  • Защиты от накруток: пользователи не смогут влиять на игровые процессы, изменяя время на своем устройстве.
  • Игровых событий: на его базе вы можете добавлять активности и награды, для которых важен доверенный источник времени, например: ежедневные или еженедельные бонусы, сезонные события и квесты.

ysdk.serverTime()

Метод возвращает timestamp, серверное время в миллисекундах, одинаковое на всех устройствах. Он похож на Date.now() форматом результата, однако последний возвращает время устройства пользователя, которое может отличаться от серверного и не защищено от накруток со стороны игроков. Метод ysdk.serverTime() устойчив к накрутке системного времени на устройстве, что делает его более надежным.

Вызывайте его каждый раз, когда вам требуется получить актуальное время.

const ysdk = await YaGames.init();

// Возвращает время в мс, синхронизированное с сервером.
ysdk.serverTime(); // Например, 1720613073778.

// Спустя время вызываем еще раз.
ysdk.serverTime(); // Например, 1720613132635.
YaGames.init().then(ysdk => {

    // Возвращает время в мс, синхронизированное с сервером.
    ysdk.serverTime(); // Например, 1720613073778.

    // Спустя время вызываем еще раз.
    ysdk.serverTime(); // Например, 1720613132635.
});

Примеры реализации ежедневных наград

  • Используется ysdk.serverTime() для получения надежного серверного времени.
  • Данные сохраняются через player.setData().
  • Реализована защита от повторного получения награды.
  • Время сравнивается безопасным способом.

Важно

Функция giveReward() в примерах — это ваша реализация начисления награды игроку.

Награда спустя 24 часа после последнего посещения игры

YaGames.init().then(async ysdk => {
    // Инициализация игрока.
    const player = await ysdk.getPlayer();

    // Получаем сохраненные данные.
    const data = await player.getData();

    // Текущее серверное время.
    const currentTime = ysdk.serverTime();

    // Время последнего получения награды (если нет, используем 0).
    const lastRewardTime = data.lastRewardTime || 0;

    // 24 часа в миллисекундах.
    const DAY_IN_MS = 24 * 60 * 60 * 1000;

    if (currentTime - lastRewardTime >= DAY_IN_MS) {
        // Прошло более 24 часов — можно выдать награду.
        await giveReward(); // Ваша функция начисления награды.

        // Сохраняем новое время получения награды.
        await player.setData({
            lastRewardTime: currentTime
        });
    }
});

Награда один раз в календарные сутки (сброс в полночь по UTC)

YaGames.init().then(async ysdk => {
    // Инициализация игрока.
    const player = await ysdk.getPlayer();

    // Получаем сохраненные данные.
    const data = await player.getData();

    // Текущее серверное время.
    const currentTime = ysdk.serverTime();

    // Получаем дату последней награды в формате "YYYY-MM-DD".
    const lastRewardDate = data.lastRewardDate || '';

    // Получаем текущую дату в формате "YYYY-MM-DD".
    const currentDate = new Date(currentTime).toISOString().split('T')[0];

    if (currentDate !== lastRewardDate) {
        // Сегодня награда еще не была получена.
        await giveReward(); // Ваша функция начисления награды.

        // Сохраняем дату получения награды.
        await player.setData({
            lastRewardDate: currentDate
        });
    }
});

Примечание

Сотрудники службы поддержки помогают разместить готовую игру на платформе Яндекс Игр. На прикладные вопросы о разработке и тестировании предметно ответят другие разработчики в Сообществе в Телеграме.

Если при использовании SDK Яндекс Игр вы столкнулись с проблемой или у вас появился вопрос, обратитесь в службу поддержки:

Написать в чат
Следующая