Перейти к основному содержимому

Изолированная таблица лидеров

info

Разделить рекорды по областям видимости можно с помощью изолированных таблиц лидеров.

Обзор

Изолированные таблицы помогают разделить рекорды по разным областям видимости. Все области видимости хранятся по имени варианта. Имя может быть любым. Несколько примеров использования и примеров тегов для сохранения очков:

  • Уровни. Свой рейтинг на каждый уровень. LEVEL_15, LEVEL_35
  • Временные диапазоны. Таблицы лучших игроков за сегодня / неделю / месяц. DAY_01/31/2022, WEEK_4/2022, MONTH_1/2022
  • Именные разделения. Лучшие в локации, клане, расе, гильдии. LOC_FOREST, GUILD_NAGIBATORbl, RACE_ORC
  • Эвенты. Лучшие в событии, турнире. EVENT_HALLOWEEN, TOURNAMENT_POKER_1871
tip

Вы не ограничены этим списком, это всего лишь теги. Можно придумать свои подходы к построению вариантов лидербордов.

Глобальная таблица рейтингов по своей структуре повторяет изолированную таблицу. К ней можно получить доступ по тегу в формате global@key1,key2,key3, например global@score, global@level,exp

Открыть таблицу

+1-2 Request

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

gp.leaderboard.openScoped();

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

gp.leaderboard.openScoped({
// ID таблицы
id: 17,
// Tag таблицы
tag: 'LEVELS',
// Название области видимости
variant: 'level_15',
// Сортировка DESC / ASC, по умолчанию значение лидерборда
order: 'DESC',
// Количество игроков в списке, max - 100, по умолчанию значение лидерборда
limit: 10,
// Включить список полей игрока для отображения в таблице, помимо полей таблицы
includeFields: ['rank'],
// Вывести только нужные поля по очереди
displayFields: ['rank', 'level'],
/**
* Показывать ли текущего игрока в списке, если он не попал в топ
* none — не показывать
* first — показать первым
* last — показать последним
*/
withMe: 'first',
// Показать N ближайших игроков сверху и снизу, максимум 10
showNearest: 5,
});

Примеры:

// Показать лидерборд для нужного уровня
function openLevelRecords(level) {
gp.leaderboard.openScoped({
tag: 'LEVELS',
variant: `LEVEL_${level}`,
});
}

// Показать лучших за сегодня
gp.leaderboard.openScoped({
tag: 'BEST_DAY',
// 01/31/2022
variant: new Date().toLocaleString('en', {
year: 'numeric',
month: '2-digit',
day: '2-digit',
}),
});

Получить таблицу

+1-2 Request

Если есть потребность отрисовывать список самому, то можно просто получить список игроков.

const result = await gp.leaderboard.fetchScoped({
// ID таблицы
id: 17,
// Tag таблицы
tag: 'LEVELS',
// Название области видимости
variant: 'level_15',
// Сортировка DESC / ASC, по умолчанию значение лидерборда
order: 'DESC',
// Количество игроков в списке, max - 100, по умолчанию значение лидерборда
limit: 10,
// Включить список полей игрока для отображения в таблице, помимо полей таблицы
includeFields: ['rank'],
/**
* Показывать ли текущего игрока в списке, если он не попал в топ
* none — не показывать
* first — показать первым
* last — показать последним
*/
withMe: 'first',
// Получить N ближайших игроков сверху и снизу, максимум 10
showNearest: 5,
});

// Результат получения
const { players, fields, topPlayers, abovePlayers, belowPlayers, player } = result;

Ответ:

СвойствоТипОписание
playersLeaderboardPlayer[]подготовленный к отрисовке топ игроков с учетом моего игрока и игроков перед и после игрока
topPlayersLeaderboardPlayer[]список лидеров

Если запрос включает withMe: 'first' | 'last' или showNearest: >0, то дополнительно возвращаются поля:

СвойствоТипОписание
playerLeaderboardPlayerданные моего игрока с позицией
abovePlayersLeaderboardPlayer[]список игроков перед моим игроком
belowPlayersLeaderboardPlayer[]список игроков после моего игрока

Публикация рекорда игрока

+1 Request

Чтобы игрок увидел себя в таблице, нужно опубликовать его рекорд для нужного варианта таблицы.

tip

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

const result = await gp.leaderboard.publishRecord({
// ID таблицы
id: 17,
// Tag таблицы
tag: 'LEVELS',
// Название области видимости
variant: 'level_15',
// Перезаписать макисмальный рекорд?
// По-умолчанию рекорд будет обновлен, если он побил предыдущий
override: true,
// Рекорд игрока, установите значения нужных полей лидерборда
record: {
score: myScore,
level: myLevel,
exp: myExp,
},
});

// Результат публикации
const { record, fields } = result;

Примеры:

// Опубликовать очки для нужного уровня
function saveLevelRecord(level, myScore) {
gp.leaderboard.publishRecord({
tag: 'LEVELS',
variant: `LEVEL_${level}`,
record: {
score: myScore,
},
});
}

// Опубликовать рекорд за сегодня
gp.leaderboard.publishRecord({
tag: 'BEST_DAY',
// 01/31/2022
variant: new Date().toLocaleString('en', {
year: 'numeric',
month: '2-digit',
day: '2-digit',
}),
record: {
score: 15781,
},
});

Оставайтесь на связи

С другими разделами документации вы можете ознакомиться здесь. Для начала работы вы можете ознакомиться с нашими туториалами.

Сообщество GamePush в Telegram: @gs_community.

Для ваших обращений e-mail: [email protected]

Желаем вам успехов!