Серверное время
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 Яндекс Игр вы столкнулись с проблемой или у вас появился вопрос, обратитесь в службу поддержки: