CraftPresence
通过 Discord 的 Rich Presence API 和 DiscordIPC API,完全自定义他人在 Discord 上看到你玩 Minecraft 的方式。 作者:jagrosh!
一般说明
- 从 v2.5.0 开始,UniLib 现在是必需的依赖项。
- UniLib 是我创建的一个新的库模组,旨在抽象常用的 API 函数,以便更通用的用例以及未来的项目。
- 该模组可以在此处下载:链接
- 如果未找到 UniLib 或使用了不兼容的版本,此模组将会崩溃。
- 此模组被标识为仅客户端 (Client Side-only) 模组。
- 这意味着它不会在服务器端运行。
- Fabric 和 Quilt 模组加载器将直接忽略该模组,而其他模组加载器可能会崩溃。
- 部分适用于 Minecraft 1.14.x 及以上版本的模组需要 Fabric API 和 Fabric 模组加载器。
- 部分适用于 Minecraft 1.13.x 版本的模组需要 Rift API 和 Rift 模组加载器。
- 部分适用于 Minecraft 1.1.0 及以下版本的模组需要 Risugami's ModLoader。
功能
除了能够将你的 Discord 状态从“正在玩 Minecraft"进行更改外, 此模组还提供了大量的自定义选项,让你完全指定他人如何看到你玩游戏。 从显示当前的生物群系,到你所在的维度,乃至你所在的服务器等等。 自定义的可能性是无限的,唯一的限制就是你发挥创意定制显示内容的程度。
启动器和整合包集成支持
CraftPresence 会检测你的启动目录是否包含以下内容:
- ATLauncher 实例 (
instance.json) - 有效的 Twitch/Overwolf/Curse/GDLauncher 清单文件 (
manifest.json,minecraftinstance.json) - MCUpdater 实例 (
instance.json) - Modrinth 实例 (
profile.json) - MultiMC 实例 (
instance.cfg) - 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 原生拥有一个图标键属性,它将优先使用此属性,而不是从整合包的显示名称进行转换。
命令
CraftPresence 目前提供以下命令:
请记住以下事项:
- 命令必须以
/craftpresence或/cp为前缀。 - 在 v1.5.0 及以上版本中,这些命令只能通过配置 GUI 中的“命令 GUI"使用。
/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- 显示所有可用的维度名称,需要启用“显示当前维度”。/cp view biomes- 显示所有可用的生物群系名称,需要启用“显示当前生物群系”。/cp view servers- 显示所有可用的服务器地址,需要启用“显示游戏状态”。/cp view screens- 如果启用了“每个 GUI",则显示所有可用的 GUI 名称。/cp view items- 如果启用了“每个物品”,则显示所有可用的物品名称。/cp view entities- 如果启用了“每个实体”,则显示所有可用的实体名称。
/cp reboot- 重启 RPC。/cp shutdown- 关闭 RPC(可以通过/cp reboot重新开启)。/cp (help | ?)- 帮助命令,用于显示上述命令及其解释。
按键绑定 (KeyBinds)
CraftPresence 目前包含以下按键绑定:
注意:
- 在 v1.5.5 到 v1.8.0 之间,按键绑定现在在配置 GUI 的“辅助功能设置”中进行自定义,而不是在普通的控制菜单中。
- 在 v1.8.0 及以上版本中,按键绑定既可以在配置 GUI 的专用菜单中自定义,也可以在适用版本的普通控制菜单中自定义。
Open Config Gui- 打开 CraftPresence 配置 GUI 的按键绑定(默认:重音符/波浪号键~或`)。
关于占位符和函数
在某些配置区域,CraftPresence 提供了一些占位符和函数以简化操作:
请记住以下事项:
- 在 v2.0.0 中,占位符已被重写以兼容 Starscript。
- 本节较早版本的列表可以查看 此处。
- 所有占位符、函数和代码表达式必须用花括号包围(例如:
{foo.bar})。 - 如果你需要在函数参数中将占位符与其他数据结合使用,请使用
getResult函数。 - 其他函数和标准变量可在 StandardLib 中找到。
占位符列表
以下占位符可在 CraftPresence 的任何地方使用:
- 通用占位符:
general.brand- Minecraft 品牌标签general.icon- 默认显示图标general.mods- 当前模组文件夹中的模组数量general.title- Minecraft 标题标签general.version- Minecraft 版本标签general.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- 当前 GUI 界面名称screen.icon- 当前 GUI 界面图标screen.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- (多人游戏) 原始当前服务器地址server.address.short- (多人游戏) 格式化后的当前服务器地址server.name- (多人游戏) 当前服务器名称server.motd.raw- (多人游戏) 当前原始服务器 MOTD (公告)server.minigame- (Realm) 当前 Realm 小游戏名称server.type- (Realm) 当前 Realm 世界类型
- 物品占位符:
item.message.default- 默认物品显示数据(如适用)item.message.holding- 手持物品的显示数据(如适用)item.message.equipped- 装备物品的显示数据(如适用)item.[slotId].name- 当前slotId的物品名称item.[slotId].message- 当前slotId的物品消息
- 集成 - Replay Mod:
replaymod.time.current- 在视频渲染器中时,获取renderTimeTaken字段replaymod.time.remaining- 在视频渲染器中时,获取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- 当前slotId的实例data.item.[slotId].class- 当前slotId的类对象data.screen.instance- 当前 GUI 界面的实例data.server.motd.line_[number]- 获取server.motd.raw的特定行data.[moduleName].time- 模块改变其主要状态的时间戳- 使用
data.general.time获取当前 RPC 起始时间戳
- 使用
函数列表
以下函数可在 CraftPresence 的任何地方使用:
asIcon(input, whitespaceIndex ?: '')- 将字符串转换为有效且可接受的图标格式asIdentifier(target, formatToId ?: false, avoid ?: false)- 将标识符转换为格式正确且可解释的名称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)- 从指定内容中检索数组元素,如果无法检索则返回 nullgetAsset(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()- 检索当前时间,作为 Instant 对象getElapsedMillis()- 检索经过的时间(毫秒)getElapsedNanos()- 检索经过的时间(纳秒)getElapsedSeconds()- 检索经过的时间(秒)getField(classToAccess=Object|String|Class, instance=Object, fieldName=String...)- 通过反射检索指定的字段getFields(classObj=Object|String|Class)- 检索类对象的可用字段名称getFirst(args)- 从指定参数中检索第一个非空字符串,否则返回 nullgetJsonElement(url|jsonString, path=Object...)- 从指定内容中检索 JSON 元素,如果无法检索则返回 nullgetMethods(classObj=Object|String|Class)- 检索类对象的可用方法名称getNamespace(input)- 检索标识符风格对象的命名空间部分getNbt(data=Entity|ItemStack, path=String...)- 尝试检索具有指定路径的 NBT 标签getOrDefault(target, alternative ?: '')- 如果主要值非空则检索主要值;否则使用次要值getPath(input)- 检索标识符风格对象的路径部分getResult(input)- 对指定输入执行递归转换hasField(classObj=Object|String|Class, fieldName)- 检索指定类是否包含指定字段名isColor(input)- 确定输入的字符串是否分类为有效的颜色代码isCustomAsset(input)- 确定指定的图标键是否存在于自定义资产列表中isUuid(input)- 通过正则表达式检查指定字符串是否分类为有效的 UUIDisValidAsset(input)- 确定指定的图标键是否存在于当前客户端 ID 下isValidId(input)- 确定指定的客户端 ID 是否有效isWithinValue(value, min, max, contains_min ?: false, contains_max ?: false, check_sanity ?: true)- 确定指定值是否在指定范围内length(input)- 返回指定字符串的长度lerpDouble(num, min, max)- 在指定值之间进行线性插值 (Double)lerpFloat(num, min, max)- 在指定值之间进行线性插值 (Float)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)- 从指定的 epoch 时间检索时间 InstanttimeFromEpochSecond(epochSecond)- 从指定的 epoch 时间检索时间 InstanttimeFromString(dateString, fromFormat, fromTimeZone ?: null)- 将日期字符串从一种时区和格式格式化为有效的 Instant 实例timeToEpochMilli(data)- 从指定参数派生,获取距 Java Epoch 的毫秒数timeToEpochSecond(data)- 从指定参数派生,获取距 Java Epoch 的秒数timeToString(date, toFormat, toTimeZone ?: null)- 使用指定的时区和格式格式化日期字符串toCamelCase(input)- 将字符串转换为有效且可接受的驼峰式格式translate(input=String, args=Object...)- 根据当前语言检索到的模组翻译,翻译未本地化的字符串
免责声明与附加信息
Minecraft 问题与额外构建信息
尽管我们尽了最大努力,但由于 Minecraft 代码库的状态,仍可能出现一些问题。
这些问题可能会阻碍后端的某些部分,并导致模组的某些部分无法工作。
鉴于此,请注意以下事项:
- Minecraft 1.16 及以上版本
- 随着游戏的更多部分变为数据驱动,某些模组数据如果不先进入世界,将无法再自动检索。
- 目前,生物群系和维度模块受此变更影响,仅显示默认数据,需要先探索才能获取额外数据。
- Minecraft 1.15 及以下版本
MC-112292: 在与RenderUtils#drawItemStack方法交互时(用于 v2 物品渲染器),使用某些渲染器的方块可能无法正确显示。- 此外,仅在 1.15.x 版本上,使用此方法的屏幕可能会出现 Z-level 问题。
- Minecraft a1.1.2_01 及以下版本
- 在这些版本上,由于实现这些方法的逻辑缺失(最初是在 Alpha 1.2.6 中实现的),生物群系和维度模块会使用默认数据进行桩处理 (stubbed)。
- 杂项问题
- 由于早期版本 Minecraft 中的混淆问题,使用模组的某些部分时可能会出现不正确数据。
- 在这种情况下,生物群系和维度模块可能无法自动检测某些必要信息。
- 作为后备方案,模组还设计为在首次发现该生物群系/维度时添加可选择的模块数据。
- 某些模块列表中发现的“添加新项 (Add New)"选项也可用于解决此问题。
- 由于早期版本 Minecraft 中的混淆问题,使用模组的某些部分时可能会出现不正确数据。
此外,某些设置或 API 调用在某些 MC 版本下的表现可能不同。
图标请求
没有看到你喜欢的图标?或者有关于添加/修改默认客户端 ID 上图标的建议?
如果是这样,你可以在我的 问题追踪器 上提出请求,需满足以下要求:
- 如果是添加来自某个维度的图标,请指定该维度所属模组的链接。
- 这是因为必须使用特定的图标 ID,这些 ID 可以通过模组找到,或者在进入维度后检查你的日志/聊天记录,CraftPresence 会告诉你预期的 ID。
- 提供尺寸在
512x512到1024x1024之间的图标以供使用(为了最佳质量,请使用最小或推荐尺寸)。- 可以使用介于这些尺寸之间的图标,但最终质量可能不佳。
- 如果请求修改或从默认客户端 ID 中移除某个图标,请说明原因。
- 这主要是为了记录更改原因,以供将来参考。
此外,你也可以通过遵循 此指南 创建自己的一套图标。
支持
需要有关我的某个模组的帮助,或者想提供反馈?
你可以通过以下方式联系我:
此外,此模组的代码库文档可在 此处 找到,更多指南可在 Wiki 上找到。
许可声明
本模组同时遵循 MIT 许可证和 Apache 2.0 许可证。
本项目目前在内部使用了以下依赖项:
Discord 服务条款
与其他 RPC 模组一样,本模组使用你的游戏内数据向第三方服务(在本例中为 Discord)发送显示信息。
关于创建用于图标的 Discord ID 的服务条款可在 此处 找到。
关于使用 Discord 作为服务的服务条款可在 此处 找到。
选择礼物
使用社区积分,为喜欢的作品送上一份支持
打赏记录
感谢每一位送出礼物的社区成员

