CraftPresence
Полностью настрой то, как другие видят твою игру в Discord!
- Загрузчики
- FabricNeoForgeForgeQuilt
- Скачиваний на Modrinth
- 14,1 млн
- Подписчиков на Modrinth
- 912
- версий
- 2 830
- Обновлён
- 20 сентября 202620 сент.
- Опубликован
- в 2022
Коротко о моде
Ставится только в игру; на сервер ставить не нужно
CraftPresence
Полностью настрой то, как другие видят твою игру в Minecraft, через Discord Rich Presence API и DiscordIPC API от jagrosh!
Общие примечания
Начиная с v2.5.0, UniLib теперь является обязательной зависимостью
- UniLib — это новый библиотечный мод, который я создал, чтобы вынести общие функции API для более универсального использования, а также будущих проектов
- Мод можно скачать здесь
- Этот мод вылетит, если UniLib не найден или используется несовместимая версия
Этот мод является клиентским модом
- Это значит, что он не будет работать на стороне сервера.
- Загрузчики модов Fabric и Quilt просто проигнорируют мод, а другие загрузчики модов могут вылететь.
- Некоторые версии мода для Minecraft 1.14.x и выше требуют Fabric API и загрузчик модов Fabric
- Некоторые версии мода для Minecraft 1.13.x требуют Rift API и загрузчик модов Rift
- Некоторые версии мода для Minecraft 1.1.0 и ниже требуют Risugami's ModLoader
Возможности
Помимо возможности изменить твой статус в Discord с «Playing Minecraft», этот мод предлагает множество вариантов настройки, позволяющих полностью определить, как другие видят твою игру. От отображения текущего биома до измерения, в котором ты находишься, а также сервера, на котором ты играешь, и многого другого. Возможности настройки безграничны, единственное реальное ограничение — насколько креативно ты настроишь своё отображение.
Поддержка интеграции с лаунчерами и сборками
CraftPresence определит, содержит ли твоя директория запуска:
- Инстанс ATLauncher (instance.json)
- Действительный манифест Twitch/Overwolf/Curse/GDLauncher (manifest.json, minecraftinstance.json)
- Инстанс MCUpdater (instance.json)
- Инстанс Modrinth (profile.json)
- Инстанс MultiMC (instance.cfg)
- Файл installedPacks от Technic (installedPacks)
Если ты используешь какой-либо из этих лаунчеров, учти следующее:
- До v1.6.0 он будет указывать название сборки в твоём отображении, а также показывать её иконку (когда ты не на сервере)
- С v1.6.0 до v2.0.0 он вместо этого подставит название сборки в плейсхолдер
&PACK&, который ты можешь настроить для использования в RPC - В v2.0 информация о сборке вместо этого подставляется в плейсхолдеры
pack.nameиpack.icon, которые ты можешь настроить для использования в RPC
В качестве примера: так мод преобразует название сборки в iconKey:
Пример: All the Mods 7 будет разобран как allthemods7
Примечание: MultiMC изначально имеет свойство Icon Key, которое используется вместо преобразования из отображаемого имени сборки
Команды
На данный момент CraftPresence предлагает следующие команды:
Учтите следующее:
- Команды должны начинаться с
/craftpresenceили/cp - В v1.5.0 и выше эти команды доступны только через меню команд, которое находится в меню конфигурации
/cp compile "[expr]"- Проверить вывод выражения-заполнителя через Starscript/cp search (type:typeName, [searchTerm], all)- Найти доступные заполнители для использования в Rich Presence/cp reload- Перезагрузить данные мода/cp request- Просмотреть информацию о запросе на присоединение/cp export- Просмотреть команды экспорта данных мода/cp view- Команда помощи для отображения команд, доступных для просмотра и управления различными данными отображения/cp view placeholders- Отображает все доступные заполнители для использования в RPC/cp view currentData- Отображает ваши текущие данные RPC в текстовом виде/cp view assets (custom | all)- Отображает все доступные вам ключи иконок ресурсов/cp view dimensions- Отображает все доступные названия измерений, требует включённой опцииShow Current Dimension/cp view biomes- Отображает все доступные названия биомов, требует включённой опцииShow Current Biome/cp view servers- Отображает все доступные адреса серверов, требует включённой опцииShow Game State/cp view screens- Отображает все доступные названия Gui, если включена опция Per-Gui/cp view items- Отображает все доступные названия предметов, если включена опция Per-Item/cp view entities- Отображает все доступные названия сущностей, если включена опция Per-Entity
/cp reboot- Перезапустить RPC/cp shutdown- Отключить RPC (можно снова включить через/cp reboot)/cp (help | ?)- Команда помощи для отображения вышеперечисленных команд и их пояснений
Клавиши
На данный момент CraftPresence содержит следующие клавиши:
Примечания:
- В версиях с v1.5.5 по v1.8.0 клавиши настраиваются в настройках доступности в меню конфигурации, а не в обычном меню управления
- В v1.8.0 и выше клавиши можно настроить либо в отдельном меню в меню конфигурации, либо в обычном меню управления на подходящих версиях
Open Config Gui- Клавиша для открытия меню конфигурации CraftPresence (по умолчанию: клавиша GRAVE/TILDE)
О заполнителях и функциях
В некоторых областях конфигурации CraftPresence предоставляет заполнители и функции для упрощения работы:
Учтите следующее:
В v2.0.0 заполнители были переписаны для совместимости с Starscript
- Старый список из этого раздела можно посмотреть здесь)
- Все заполнители, функции и выражения кода должны быть заключены в фигурные скобки (Пример:
{foo.bar}) - Если вам нужно объединить заполнитель с другими данными в аргументе функции, используйте функцию
getResult - Дополнительные функции и стандартные переменные доступны в StandardLib
Список заполнителей
Следующие заполнители доступны для использования в любом месте CraftPresence:
Общие заполнители:
general.brand- Название бренда Minecraftgeneral.icon- Иконка отображения по умолчаниюgeneral.mods- Количество модов в вашей папке modsgeneral.title- Название Minecraftgeneral.version- Версия Minecraftgeneral.protocol- Протокол версии Minecraft
Заполнители событий меню (загрузка и главное меню):
menu.message- Данные отображения главного меню, когда применимоmenu.icon- Иконка отображения главного меню, когда применимо
Заполнители сборки:
pack.name- Название текущей обнаруженной сборкиpack.icon- Иконка текущей обнаруженной сборкиpack.type- Тип текущей обнаруженной сборки
Заполнители игрока:
player.name- Ваше имя пользователяplayer.uuid.short- Ваш UUID (сокращённый формат)player.uuid.full- Ваш UUID (полный формат, если UUID действителен)player.icon- Иконка вашей головы, когда применимоplayer.position.x- Ваша текущая позиция X в игреplayer.position.y- Ваша текущая позиция Y в игреplayer.position.z- Ваша текущая позиция Z в игреplayer.health.current- Ваше текущее здоровье в игреplayer.health.max- Ваше текущее максимальное здоровье в игреplayer.mode- Ваш текущий игровой режим
Заполнители Gui:
screen.message- Данные отображения текущего экрана Gui, когда применимоscreen.name- Название текущего экрана Guiscreen.icon- Иконка текущего экрана Guiscreen.default.icon- Иконка экрана Gui по умолчанию
Заполнители биома:
biome.message- Данные отображения текущего биома, когда вы в игреbiome.name- Название текущего биомаbiome.identifier- Идентификатор текущего биомаbiome.icon- Иконка текущего биомаbiome.default.icon- Иконка биома по умолчанию
Заполнители измерения:
dimension.message- Данные отображения текущего измерения, когда вы в игреdimension.name- Название текущего измеренияdimension.identifier- Идентификатор текущего измеренияdimension.icon- Иконка текущего измеренияdimension.default.icon- Иконка измерения по умолчанию
Заполнители сущностей:
entity.default.icon- Иконка сущности по умолчаниюentity.target.message- Данные отображения текущей выбранной сущности, когда применимоentity.target.name- Название текущей выбранной сущностиentity.target.icon- Иконка текущей выбранной сущности
entity.riding.message- Отображаемые данные сущности, на которой сейчас едет игрок, если применимоentity.riding.name- Имя сущности, на которой сейчас едет игрокentity.riding.icon- Иконка сущности, на которой сейчас едет игрок
Плейсхолдеры мира:
world.difficulty- Текущая сложность мираworld.weather.name- Название текущей погоды в миреworld.name- Название текущего мираworld.type- Текущий тип мираworld.time.format_24- Текущее игровое время мира (24-часовой формат)world.time.format_12- Текущее игровое время мира (12-часовой формат)world.time.day- Текущий игровой день мира
Плейсхолдеры сервера:
server.message- Отображаемые данные текущего сервера, пока игрок в игреserver.icon- Иконка текущего сервераserver.default.icon- Иконка сервера по умолчаниюserver.players.current- Текущее количество игроков на сервереserver.players.max- Максимальное количество игроков на сервереserver.address.full- (MP) Необработанный адрес текущего сервераserver.address.short- (MP) Отформатированный адрес текущего сервераserver.name- (MP) Название текущего сервераserver.motd.raw- (MP) Необработанный motd текущего сервераserver.minigame- (Realm) Название текущего минигейма realmserver.type- (Realm) Тип мира текущего realm
Плейсхолдеры предметов:
item.message.default- Отображаемые данные предмета по умолчанию, если применимоitem.message.holding- Отображаемые данные предмета(-ов) в руке, если применимоitem.message.equipped- Отображаемые данные надетого предмета(-ов), если применимоitem.[slotId].name- Название предмета в текущемslotIditem.[slotId].message- Сообщение предмета в текущемslotId
Интеграция - Replay Mod:
replaymod.time.current- В Video Renderer получает полеrenderTimeTakenreplaymod.time.remaining- В Video Renderer получает полеrenderTimeLeft
Дополнительные плейсхолдеры (продвинутое использование):
_general.instance- ЭкземплярMinecraft_general.player- Экземпляр игрокаMinecraft_general.world- Экземпляр мираMinecraft_config.instance- Экземпляр конфига мода_[moduleName].instance- Экземпляр одного из модулей CraftPresence- Порядок модулей:
biome, dimension, entity, item, screen, server, <...>
- Порядок модулей:
data.biome.instance- Экземпляр текущего биома игрокаdata.biome.class- Объект класса текущего биома игрокаdata.dimension.instance- Экземпляр текущего измерения игрокаdata.dimension.class- Объект класса текущего измерения игрокаdata.entity.target.instance- Экземпляр текущей целиdata.entity.target.class- Объект класса текущей целиdata.entity.riding.instance- Экземпляр сущности, на которой сейчас едет игрокdata.entity.riding.class- Объект класса сущности, на которой сейчас едет игрокdata.item.[slotId].instance- Экземпляр текущегоslotIddata.item.[slotId].class- Объект класса текущегоslotIddata.screen.instance- Экземпляр текущего Gui Screendata.server.motd.line_[number]- Получает определённую строку изserver.motd.rawdata.[moduleName].time- Временная метка, когда модуль изменил своё основное состояние- Используйте
data.general.timeдля текущей временной метки начала RPC
- Используйте
Список функций
Следующие функции доступны для использования в любом месте CraftPresence:
asIcon(input, whitespaceIndex ?: '')— Преобразует строку в допустимый и корректный формат иконкиasIdentifier(target, formatToId ?: false, avoid ?: false)— Преобразует Identifier в правильно отформатированное и читаемое имяasProperWord(input, avoid ?: false, skipSymbolReplacement ?: false, caseCheckTimes ?: -1)— Преобразует входные данные в правильно читаемую строкуcapitalizeWords(input, timesToCheck ?: -1)— Делает заглавными первые буквы слов в указанной строкеclampDouble(num, min, max)— Ограничивает указанное число между минимальным и максимальным значениемclampFloat(num, min, max)— Ограничивает указанное число между минимальным и максимальным значениемclampInt(num, min, max)— Ограничивает указанное число между минимальным и максимальным значениемclampLong(num, min, max)— Ограничивает указанное число между минимальным и максимальным значениемconvertTime(input, originalPattern, newPattern)— Преобразует указанную строку в указанный формат даты, если возможноconvertTimeFormat(dateString, fromFormat, toFormat)— Преобразует строку даты из одного формата в другойconvertTimeZone(dateString, fromFormat, fromTimeZone, toTimeZone)— Преобразует строку даты из одного часового пояса в другойdateToEpochMilli(dateString, format, timeZone ?: null)— Преобразует строку даты в метку времени Epoch в миллисекундахdateToEpochSecond(dateString, format, timeZone ?: null)— Преобразует строку даты в метку времени Epoch в секундахepochMilliToDate(epochMilli, format, timeZone ?: null)— Преобразует метку времени Epoch в строку даты в заданном формате и часовом поясеepochSecondToDate(epochSecond, format, timeZone ?: null)— Преобразует метку времени Epoch в строку даты в заданном формате и часовом поясеexecuteMethod(classToAccess=Object|String|Class, instance=Object, methodName=String, <parameterType, parameter>...)— Вызывает указанный метод в целевом классе через рефлексиюformat(input=String, args=Object...)— Возвращает отформатированную строку, используя указанную строку формата и аргументыformatAddress(input, returnPort ?: false)— Форматирует IP-адрес на основе входных данныхgetArrayElement(content=Array, index)— Извлекает элемент массива из указанного содержимого или null, если не удалосьgetAsset(input)— Извлекает указанные данные DiscordAsset по ключу иконки, если он присутствуетgetAssetId(input)— Извлекает разобранный ID иконки из указанного ключа, если он присутствуетgetAssetKey(input)— Извлекает разобранный ключ иконки из указанного ключа, если он присутствуетgetAssetType(input)— Извлекает разобранный тип изображения из указанного ключа, если он присутствуетgetAssetUrl(input)— Извлекает разобранный URL изображения из указанного ключа, если он присутствуетgetClass(reference=Object|String)— Пытается получить объект класса через строковый путь или ссылку на объектgetComponent(data=DataComponentHolder, path=String)— (MC 1.20.5+) Пытается получить данные компонента с указанным путёмgetCurrentTime()— Получает текущее время как InstantgetElapsedMillis()— Получает прошедшее время в миллисекундахgetElapsedNanos()— Получает прошедшее время в наносекундахgetElapsedSeconds()— Получает прошедшее время в секундахgetField(classToAccess=Object|String|Class, instance=Object, fieldName=String...)— Извлекает указанное поле (поля) через рефлексиюgetFields(classObj=Object|String|Class)— Получает доступные имена полей для объекта классаgetFirst(args)— Получает первую не-null строку из указанных аргументов или возвращает nullgetJsonElement(url|jsonString, path=Object...)— Извлекает элемент json из указанного содержимого или null, если не удалосьgetMethods(classObj=Object|String|Class)— Получает доступные имена методов для объекта классаgetNamespace(input)— Получает часть namespace из объекта в стиле IdentifiergetNbt(data=Entity|ItemStack, path=String...)— Пытается получить NBT-тег с указанным путёмgetOrDefault(target, alternative ?: '')— Получает основное значение, если оно не пустое; иначе использует вторичное значениеgetPath(input)— Получает часть path из объекта в стиле IdentifiergetResult(input)— Выполняет рекурсивное преобразование указанных входных данныхhasField(classObj=Object|String|Class, fieldName)— Проверяет, содержит ли указанный класс указанное имя поляisColor(input)— Определяет, классифицируется ли введённая строка как допустимый код цветаisCustomAsset(input)— Определяет, присутствует ли указанный ключ иконки в списке пользовательских ассетовisUuid(input)— Проверяет через регулярное выражение, классифицируется ли указанная строка как допустимый UuidisValidAsset(input)— Определяет, присутствует ли указанный ключ иконки под текущим Client IDisValidId(input)— Определяет, является ли указанный Client ID допустимымisWithinValue(value, min, max, contains_min ?: false, contains_max ?: false, check_sanity ?: true)— Определяет, находится ли указанное значение в указанном диапазонеlength(input)— Возвращает длину указанной строкиlerpDouble(num, min, max)— Линейно интерполирует между указанными значениямиlerpFloat(num, min, max)— Линейно интерполирует между указанными значениямиmcTranslate(input=String, args=Object...)— Переводит нелокализованную строку на основе игровых переводов, полученных для текущего языкаminify(input, length)— Сокращает длину строки до указанной длиныnullOrEmpty(input, allowWhitespace ?: false)— Определяет, классифицируется ли строка как NULL или EMPTYrandomAsset()— Пытается получить случайный ключ иконки из доступных ассетовrandomString(args)— Получает случайный элемент из указанных аргументов как строкуremoveRepeatWords(input)— Удаляет повторяющиеся слова во введённой строкеroundDouble(num, places ?: 0)— Округляет Double до заданного количества знаков после запятой, если возможноsnapToStep(num, valueStep)— округляет указанное значение до ближайшего, используя шагsplit(input, regex, limit ?: 0)— разбивает эту строку по совпадениям с заданным регулярным выражениемstripAllFormatting(input)— удаляет цветовые и форматирующие коды из входной строкиstripColors(input)— удаляет цветовые коды из входной строкиstripFormatting(input)— удаляет форматирующие коды из входной строкиtimeFromEpochMilli(epochMilli)— получает момент времени из указанного времени в epochtimeFromEpochSecond(epochSecond)— получает момент времени из указанного времени в epochtimeFromString(dateString, fromFormat, fromTimeZone ?: null)— форматирует строку даты из одного часового пояса и формата в корректный экземпляр InstanttimeToEpochMilli(data)— получает количество миллисекунд от Java Epoch, вычисленное из указанных аргументовtimeToEpochSecond(data)— получает количество секунд от Java Epoch, вычисленное из указанных аргументовtimeToString(date, toFormat, toTimeZone ?: null)— форматирует строку даты с использованием указанного часового пояса и формата.toCamelCase(input)— преобразует строку в корректный и допустимый Camel-Case форматtranslate(input=String, args=Object...)— переводит нелокализованную строку на основе переводов мода, полученных для текущего языка
Дисклеймеры и дополнительная информация
Проблемы Minecraft + дополнительная информация о сборке
Несмотря на все усилия, проблемы могут возникать из-за состояния кодовой базы Minecraft.
Эти проблемы могут затруднить работу определённых частей бэкенда, а также привести к тому, что некоторые части мода не будут работать.
Учитывая это, обратите внимание на следующее:
Minecraft 1.16 и выше
- Поскольку всё больше частей игры становятся управляемыми данными, некоторые данные модов больше не могут быть автоматически получены без предварительного нахождения в мире.
- На данный момент это изменение затрагивает модули биомов и измерений, которые отображают только данные по умолчанию, а дополнительные данные нужно сначала обнаружить.
Minecraft 1.15 и ниже
MC-112292: при взаимодействии с методомRenderUtils#drawItemStack, используемым в v2 Item Renderer, блоки с определёнными рендерерами могут отображаться неправильно.- Кроме того, исключительно на 1.15.x могут возникать проблемы с z-уровнем на экранах, использующих этот метод
Minecraft a1.1.2_01 и ниже
- В этих версиях модули биомов и измерений заглушены данными по умолчанию, поскольку логика для этих методов отсутствует (она была впервые реализована в Alpha 1.2.6)
Разные проблемы
Из-за проблем с обфускацией в ранних версиях Minecraft при использовании определённых частей мода могут отображаться неверные данные.
- В этом случае модули биомов и измерений могут не суметь автоматически определить некоторую необходимую информацию
- В качестве запасного варианта мод также спроектирован так, чтобы добавлять выбираемые данные модуля, когда этот биом/измерение впервые обнаружены.
- Опция "Add New", встречающаяся в некоторых списках модулей, также может использоваться для обхода этой проблемы.
Кроме того, некоторые настройки или вызовы API могут работать иначе в определённых версиях MC.
Запрос иконок
Не видите иконку, которая вам нравится, или есть предложение по иконке, которую стоит добавить/изменить в стандартном Client ID?
Если да, вы можете оставить запрос в моём Issue Tracker со следующими требованиями:
Если добавляете иконку из измерения, укажите ссылку на мод, из которого происходит это измерение
- Это связано с тем, что должны использоваться конкретные ID иконок, которые можно найти в моде или проверив свои логи/чат после входа в измерение, так как CraftPresence сообщит вам ожидаемый ID
Иконка размером от
512x512до1024x1024для использования (либо минимальный, либо рекомендуемый размер для лучшего качества)- Можно использовать иконки между этими размерами, но итоговое качество может быть не очень хорошим
Если запрашиваете изменение или удаление иконки из стандартного Client ID, укажите причину
- В основном просто чтобы можно было зафиксировать, почему её изменили, для будущего учёта
Кроме того, вы можете создать собственный набор иконок, следуя этому руководству
Поддержка
Нужна помощь с одним из моих модов или хотите оставить отзыв?
Со мной можно связаться следующими способами:
Кроме того, документация по коду этого мода доступна здесь, а дополнительные руководства — в вики
Лицензирование
Этот мод распространяется под лицензией MIT, а также под лицензией Apache 2.0
В настоящее время этот проект внутренне использует следующие зависимости:
Условия использования Discord
Как и другие RPC-моды, этот мод использует ваши игровые данные для отправки отображаемой информации стороннему сервису (в данном случае — Discord).
Условия использования, касающиеся создания Discord ID для иконок, можно найти здесь
Условия использования Discord как сервиса также доступны здесь
Частые вопросы
Как установить CraftPresence?
Установите Fabric под свою версию Minecraft, скачайте CraftPresence под ту же версию и загрузчик, положите файл в папку mods и запустите игру с профилем загрузчика.
Для каких версий Minecraft есть CraftPresence?
У CraftPresence есть сборки для Minecraft 1.11.2, 1.12.2, 1.13.2–26.1, 26.1.2–26.3 ….
Нужен ли CraftPresence на сервере?
Ставится только в игру; на сервер ставить не нужно