Подписывайтесь на наш Telegram и не пропускайте важные новости! Перейти

Гайд Интеграция DiscordRPC в MCP с кнопками/гифками

Начинающий
Начинающий
Статус
Оффлайн
Регистрация
9 Июн 2024
Сообщения
92
Реакции
0
Discord Rich Presence позволяет отображать в профиле пользователя информацию о его активности в игре. В клиентах Minecraft это обычно ник игрока, сервер, версия клиента и ссылки через кнопки.

Создание приложения в Discord
Зайдите сюда:
Пожалуйста, авторизуйтесь для просмотра ссылки.

Создайте новое приложение
Скопируйте Application ID (clientId)
При необходимости можно загрузить изображения во вкладке Rich Presence -> Art Assets, но для гифки это не обязательно.

Библиотека

Для работы используется библиотека discord-game-sdk4j-1.0.0
Скачать можно тут:
Пожалуйста, авторизуйтесь для просмотра ссылки.


Запуск Discord RPC

Создадим класс-менеджер , он будет отвечать за запуск/обновление/остановку RPC

Запуск:
Старт дискордрпц:
Expand Collapse Copy
    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();
        }
    }
Вместо APP_ID пишем тот самый клиентайди с сайта и добавляем L потому что число большое, и надо эту переменную вмещать в long

Обновление:

Обновление дискордрпц:
Expand Collapse Copy
    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);
    }
На место "ГИФКА" указываем прямую ссылку на гиф/изображение клиента

Остановка:
Остановка дискорд рпц:
Expand Collapse Copy
    public void stop() {
        running = false;
        if (core != null) {
            core.close();
        }
    }
Тут мы ничего не меняем.

Динамическое обновление статуса
Чтобы статус обновлялся в зависимости от состояния игры, можно использовать событие тика через вашу систему EventBus

onTick:

ontick:
Expand Collapse Copy
    @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);
        }
    }
Вместо TaiufunClient.get().rpc().update(state, details); пишем вызов update через ваш главный класс.
И вместо Profile profile = TaiufunClient.get().profile(); указываем свою систему профилей (если надо/есть)

Инициализация в клиенте
После создания DiscordRPCManager и DiscordRPCListener необходимо правильно инициализировать их в главном классе клиента.

инициализация:
Expand Collapse Copy
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
 
Назад
Сверху Снизу