Discord Rich Presence позволяет отображать в профиле пользователя информацию о его активности в игре. В клиентах Minecraft это обычно ник игрока, сервер, версия клиента и ссылки через кнопки.
Создание приложения в Discord
Зайдите сюда:
Создайте новое приложение
Скопируйте Application ID (clientId)
При необходимости можно загрузить изображения во вкладке Rich Presence -> Art Assets, но для гифки это не обязательно.
Скачать можно тут:
Запуск:
Вместо APP_ID пишем тот самый клиентайди с сайта и добавляем L потому что число большое, и надо эту переменную вмещать в long
Обновление:
На место "ГИФКА" указываем прямую ссылку на гиф/изображение клиента
Остановка:
Тут мы ничего не меняем.
Динамическое обновление статуса
Чтобы статус обновлялся в зависимости от состояния игры, можно использовать событие тика через вашу систему EventBus
onTick:
Вместо TaiufunClient.get().rpc().update(state, details); пишем вызов update через ваш главный класс.
И вместо Profile profile = TaiufunClient.get().profile(); указываем свою систему профилей (если надо/есть)
Инициализация в клиенте
После создания DiscordRPCManager и DiscordRPCListener необходимо правильно инициализировать их в главном классе клиента.
Если в клиенте используется синглтон главного класса, вызов update следует выполнять через него.
Ник игрока или информация о профиле.
IP сервера или режим игры (Main Menu, Singleplayer).
Время, проведённое в игре.
Версия клиента.
Название клиента или текущая активность.
Ссылки на Telegram, Discord-сервер или сайт через кнопки.
Пример возможного отображения:
State: Taiufun [1]
Details: play.server.net
Large Image: гиф с лого клиента
Small Image: лучше без :)
Buttons: Telegram и Support
Создание приложения в Discord
Зайдите сюда:
Пожалуйста, авторизуйтесь для просмотра ссылки.
Создайте новое приложение
Скопируйте Application ID (clientId)
При необходимости можно загрузить изображения во вкладке Rich Presence -> Art Assets, но для гифки это не обязательно.
Библиотека
Для работы используется библиотека discord-game-sdk4j-1.0.0Скачать можно тут:
Пожалуйста, авторизуйтесь для просмотра ссылки.
Запуск Discord RPC
Создадим класс-менеджер , он будет отвечать за запуск/обновление/остановку RPCЗапуск:
Старт дискордрпц:
public void start() {
try {
CreateParams params = new CreateParams();
params.setClientID(APP_ID);
params.setFlags(CreateParams.getDefaultFlags());
core = new Core(params);
startTime = System.currentTimeMillis() / 1000;
running = true;
new Thread(() -> {
while (running) {
try {
core.runCallbacks();
Thread.sleep(1000);
} catch (Exception ignored) {}
}
}, "Discord-RPC").start();
} catch (Exception e) {
e.printStackTrace();
}
}
Обновление:
Обновление дискордрпц:
public void update(String state, String details) {
if (core == null) return;
Activity activity = new Activity();
activity.setState(state);
activity.setDetails(details);
activity.timestamps().setStart(Instant.ofEpochSecond(startTime));
ActivityAssets assets = activity.assets();
assets.setLargeImage("ГИФКА");
assets.setLargeText(TaiufunClient.VERSION);
assets.setSmallImage("mc");
assets.setSmallText("Minecraft 1.16.5");
activity.setActivityButtonsMode(ActivityButtonsMode.BUTTONS);
// дс поддерживает максимум две кнопки
activity.addButton(new ActivityButton(
"НАЗВАНИЕ КНОПКИ",
"ССЫЛКА ВЕДУЩАЯ"
));
activity.addButton(new ActivityButton(
"НАЗВАНИЕ КНОПКИ2",
"ССЫЛКА ВЕДУЩАЯ2"
));
core.activityManager().updateActivity(activity);
}
Остановка:
Остановка дискорд рпц:
public void stop() {
running = false;
if (core != null) {
core.close();
}
}
Динамическое обновление статуса
Чтобы статус обновлялся в зависимости от состояния игры, можно использовать событие тика через вашу систему EventBus
onTick:
ontick:
@EventHandler
public void onTick(TickEvent e) {
Minecraft mc = Minecraft.getInstance();
Profile profile = TaiufunClient.get().profile();
String state = profile.getAccountName() + " [" + profile.getAccountUid() + "]";
String details;
if (mc.world == null) {
if (mc.getCurrentServerData() != null) {
details = mc.getCurrentServerData().serverIP;
} else {
details = "Main Menu";
}
} else if (mc.isSingleplayer()) {
details = "Singleplayer";
} else if (mc.getCurrentServerData() != null) {
details = mc.getCurrentServerData().serverIP;
} else {
details = "Minecraft";
}
if (!state.equals(lastState) || !details.equals(lastDetails)) {
lastState = state;
lastDetails = details;
TaiufunClient.get().rpc().update(state, details);
}
}
И вместо Profile profile = TaiufunClient.get().profile(); указываем свою систему профилей (если надо/есть)
Инициализация в клиенте
После создания DiscordRPCManager и DiscordRPCListener необходимо правильно инициализировать их в главном классе клиента.
инициализация:
DiscordRPCManager rpc = new DiscordRPCManager();
rpc.start();
rpc.update("Starting", "Main Menu");
bus.register(new DiscordRPCListener());
// Корректное завершение RPC при закрытии игры
Runtime.getRuntime().addShutdownHook(new Thread(rpc::stop));
Если в клиенте используется синглтон главного класса, вызов update следует выполнять через него.
Что можно отображать в Discord
Ник игрока или информация о профиле.
IP сервера или режим игры (Main Menu, Singleplayer).
Время, проведённое в игре.
Версия клиента.
Название клиента или текущая активность.
Ссылки на Telegram, Discord-сервер или сайт через кнопки.
Пример возможного отображения:
State: Taiufun [1]
Details: play.server.net
Large Image: гиф с лого клиента
Small Image: лучше без :)
Buttons: Telegram и Support
