Thời gian máy chủ

SDK Yandex Games cho phép lấy thời gian được đồng bộ hóa với máy chủ. Phương pháp này hữu ích cho:

  • Bảo vệ chống lại việc gian lận: người dùng không thể ảnh hưởng đến quá trình chơi game bằng cách thay đổi thời gian trên thiết bị của mình.
  • Sự kiện trong game: dựa trên nó, bạn có thể thêm vào các hoạt động và phần thưởng mà nguồn thời gian đáng tin cậy là quan trọng, ví dụ: các bonus hàng ngày hoặc hàng tuần, sự kiện mùa vụ và nhiệm vụ.

ysdk.serverTime()

Phương pháp trả về timestamp, thời gian máy chủ tính bằng milliseconds, giống nhau trên tất cả các thiết bị. Nó tương tự như Date.now() về định dạng kết quả, tuy nhiên, cái sau trả về thời gian của thiết bị người dùng, có thể khác biệt so với thời gian máy chủ và không được bảo vệ khỏi việc gian lận từ phía người chơi. Phương pháp ysdk.serverTime() không thể được ghi đè hoặc thay đổi qua code, làm cho nó đáng tin cậy hơn.

Hãy gọi nó mỗi khi bạn cần lấy thời gian hiện tại.

const ysdk = await YaGames.init();

// Trả về thời gian dạng ms, đồng bộ hóa với máy chủ.
ysdk.serverTime(); // Ví dụ, 1720613073778.

// Sau một thời gian, gọi lại.
ysdk.serverTime(); // Ví dụ, 1720613132635.
YaGames.init().then(ysdk => {

    // Trả về thời gian dạng ms, đồng bộ hóa với máy chủ.
    ysdk.serverTime(); // Ví dụ, 1720613073778.

    // Sau một thời gian, gọi lại.
    ysdk.serverTime(); // Ví dụ, 1720613132635.
});

Ví dụ về triển khai phần thưởng hàng ngày

  • Sử dụng ysdk.serverTime() để lấy thời gian máy chủ đáng tin cậy.
  • Dữ liệu được lưu thông qua player.setData().
  • Đã triển khai bảo vệ để tránh nhận thưởng nhiều lần.
  • Thời gian được so sánh một cách an toàn.

Cảnh báo

Hàm giveReward() trong các ví dụ dưới đây là phần bạn tự triển khai để trao thưởng cho người chơi.

Phần thưởng sẽ được nhận sau 24 giờ kể từ lần đăng nhập cuối cùng vào trò chơi

YaGames.init().then(async ysdk => {
    // Khởi tạo người chơi.
    const player = await ysdk.getPlayer();

    // Lấy dữ liệu đã lưu.
    const data = await player.getData();

    // Thời gian máy chủ hiện tại.
    const currentTime = ysdk.serverTime();

    // Thời gian nhận thưởng lần cuối (nếu không có thì dùng 0).
    const lastRewardTime = data.lastRewardTime || 0;

    // 24 giờ tính bằng mili giây.
    const DAY_IN_MS = 24 * 60 * 60 * 1000;

    if (currentTime - lastRewardTime >= DAY_IN_MS) {
        // Đã qua hơn 24 giờ — có thể trao thưởng.
        await giveReward(); // Hàm trao thưởng của bạn.

        // Lưu thời gian nhận thưởng mới.
        await player.setData({
            lastRewardTime: currentTime
        });
    }
});

Phần thưởng chỉ nhận được một lần trong mỗi ngày dương lịch (đặt lại vào nửa đêm theo giờ UTC)

YaGames.init().then(async ysdk => {
    // Khởi tạo người chơi.
    const player = await ysdk.getPlayer();

    // Lấy dữ liệu đã lưu.
    const data = await player.getData();

    // Thời gian máy chủ hiện tại.
    const currentTime = ysdk.serverTime();

    // Lấy ngày nhận thưởng cuối cùng ở định dạng "YYYY-MM-DD".
    const lastRewardDate = data.lastRewardDate || '';

    // Lấy ngày hiện tại ở định dạng "YYYY-MM-DD".
    const currentDate = new Date(currentTime).toISOString().split('T')[0];

    if (currentDate !== lastRewardDate) {
        // Hôm nay vẫn chưa nhận thưởng.
        await giveReward(); // Hàm trao thưởng của bạn.

        // Lưu ngày đã nhận thưởng.
        await player.setData({
            lastRewardDate: currentDate
        });
    }
});

Ghi chú

Nhân viên hỗ trợ sẽ giúp bạn đăng bài trò chơi đã hoàn thiện lên nền tảng trò chơi của Yandex. Để đặt các câu hỏi về việc phát triển và kiểm thử, các nhà phát triển khác sẽ trả lời chuyên sâu trong Kênh Discord.

Nếu bạn đang gặp phải vấn đề hoặc có câu hỏi liên quan đến việc sử dụng Yandex Games SDK, vui lòng liên hệ với bộ phận hỗ trợ:

Viết trong mục trò chuyện