CraftPresence
通过 Discord 的 Rich Presence API 和 DiscordIPC API,完全自定义其他人看到你游玩 Minecraft 的方式
作者:jagrosh!
一般说明
- 从 v2.5.0 开始,UniLib 现在是必需依赖
- UniLib 是我创建的一个新库模组,用于将常见 API 功能抽象出来,以便更通用的使用场景以及未来项目使用
- 该模组可在这里下载
- 如果未找到 UniLib 或使用了不兼容版本,此模组将会崩溃
- 此模组被标识为仅客户端模组
- 这意味着它不会在服务器端运行。
- Fabric 和 Quilt 模组加载器会直接忽略该
模组,而其他模组加载器则可能会崩溃。
- 针对 Minecraft 1.14.x 及以上版本的某些模组版本需要
- 针对 Minecraft 1.13.x 的某些模组版本需要
- 针对 Minecraft 1.1.0 及以下版本的某些模组版本
功能特性
除了能够将你的 discord 状态从“Playing Minecraft”进行修改之外,
这个模组还提供了大量自定义选项,用于完整指定其他人如何看到你在玩游戏。
从显示你当前所在的生物群系、所处维度,到你所在的服务器等等。
自定义的可能性几乎是无限的,真正的限制只有你对显示内容的创意程度。
启动器与整合包集成支持
CraftPresence 会检测你的启动目录中是否包含:
- 一个 ATLauncher 实例(instance.json)
- 一个有效的 Twitch/Overwolf/Curse/GDLauncher 清单(manifest.json, minecraftinstance.json)
- 一个 MCUpdater 实例(instance.json)
- 一个 Modrinth 实例(profile.json)
- 一个 MultiMC 实例(instance.cfg)
- 一个 Technic installedPacks 文件(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 及以上版本中,这些命令只能通过配置界面中的 Commands 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- 显示所有可用的维度名称,需要启用Show Current Dimension -
/cp view biomes- 显示所有可用的生物群系名称,需要启用Show Current Biome -
/cp view servers- 显示所有可用的服务器地址,需要启用Show Game State -
/cp view screens- 如果启用了 Per-Gui,则显示所有 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 期间,按键绑定现在需要在 Config Gui 的辅助功能设置中自定义,而不是在
常规控制菜单中
- 在 v1.8.0 及以上版本中,按键绑定现在既可以在 Config Gui 中的专用菜单中自定义,也可以在适用版本的
常规控制菜单中自定义
-
Open Config Gui- 用于打开 CraftPresence 配置界面的按键绑定(默认:GRAVE/TILDE 键)
关于占位符与函数
在某些配置区域中,CraftPresence 提供了一些占位符和函数来让操作更轻松:
请注意以下事项:
- 在 v2.0.0 中,占位符已被重写,以兼容
- 本节较旧的列表可以在
这里)查看
- 所有占位符、函数和代码表达式都必须使用花括号包围(示例:
{foo.bar}) - 如果你需要在函数参数中将占位符与其他数据结合使用,请使用
getResult
函数
- 其他函数和标准变量可在
StandardLib中找到
占位符列表
以下占位符可在 CraftPresence 的任意位置使用:
- 通用占位符:
-
general.brand- Minecraft 品牌标签 -
general.icon- 默认显示图标 -
general.mods- 你当前 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- (MP) 当前服务器原始地址 -
server.address.short- (MP) 当前服务器格式化地址 -
server.name- (MP) 当前服务器名称 -
server.motd.raw- (MP) 当前服务器原始 motd -
server.minigame- (Realm) 当前领域小游戏名称 -
server.type- (Realm) 当前领域世界类型 - 物品占位符:
-
item.message.default- 默认物品显示数据(适用时) -
item.message.holding- 手持物品显示数据(适用时) -
item.message.equipped- 已装备物品显示数据(适用时) -
item.[slotId].name- 当前slotId物品名称 -
item.[slotId].message- 当前slotId物品消息 - 集成 - Replay Mod:
-
replaymod.time.current- 在 Video Renderer 中时,获取renderTimeTaken字段 -
replaymod.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- 当前slotId的实例 -
data.item.[slotId].class- 当前slotId的类对象 -
data.screen.instance- 当前 Gui 界面的实例 -
data.server.motd.line_[number]- 获取server.motd.raw的某一特定行 -
data.[moduleName].time- 某模块主状态发生变化时的时间戳 - 当前 RPC 的启动时间戳请使用
data.general.time
函数列表
以下函数可在 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,
...)` -
通过反射调用目标类中的指定方法
-
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()- 获取当前时间,作为一个 Instant -
getElapsedMillis()- 获取已过去的时间(毫秒) -
getElapsedNanos()- 获取已过去的时间(纳秒) -
getElapsedSeconds()- 获取已过去的时间(秒) -
getField(classToAccess=Object|String|Class, instance=Object, fieldName=String...)- 通过反射获取
指定字段
-
getFields(classObj=Object|String|Class)- 获取某个类对象可用的字段名称 -
getFirst(args)- 从指定参数中获取第一个非 null 字符串,若无则返回 null -
getJsonElement(url|jsonString, path=Object...)- 从指定内容中获取 json 元素,无法获取时返回 null -
getMethods(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)- 通过正则判断指定字符串是否为有效 Uuid -
isValidAsset(input)- 判断指定图标键是否存在于当前 Client ID 下 -
isValidId(input)- 判断指定 Client ID 是否有效 -
isWithinValue(value, min, max, containsmin ?: false, containsmax ?: 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 或 EMPTY -
randomAsset()- 尝试从可用资源中获取一个随机图标键 -
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 时间获取一个时间 Instant -
timeFromEpochSecond(epochSecond)- 从指定 epoch 时间获取一个时间 Instant -
timeFromString(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 及以上
- 随着游戏越来越多部分变为数据驱动,一些模组化数据在未先进入世界之前将无法自动获取。
- 目前,Biome 和 Dimension 模块会受到这一变化影响,只会显示默认数据,额外数据
需要先被发现。
- Minecraft 1.15 及以下
-
MC-112292:当与RenderUtils#drawItemStack方法交互时(v2 物品渲染器所使用),某些使用特定渲染器的方块
可能无法正确显示。
- 此外,仅在 1.15.x 上,使用该方法的界面还可能出现 z-level 问题
- Minecraft a1.1.2_01 及以下
- 在这些版本中,Biome 和 Dimension 模块会使用默认数据进行占位实现,因为这些
方法所需的逻辑尚不存在(最初是在 Alpha 1.2.6 中实现的)
- 杂项问题
- 由于早期 Minecraft 版本中的混淆问题,在使用模组某些部分时可能会出现错误数据。
- 在这种情况下,Biome 和 Dimension 模块可能无法自动检测某些必要信息
- 作为补救措施,模组还被设计为在首次发现相关生物群系/维度时添加可选模块数据。
- 某些模块列表中的 “Add New” 选项也可用于绕过此问题。
此外,某些设置或 API 调用在不同 MC 版本下的表现可能有所不同。
图标请求
没有看到你喜欢的图标,或者想为默认 Client ID 中新增/修改某个图标提出建议吗?
如果是这样,你可以在我的 Issue Tracker 上提出请求,并满足
以下要求:
- 如果要添加来自某个维度的图标,请提供该维度来源模组的链接
- 这是因为必须使用特定的图标 ID,而这些 ID 可以从模组中获得,或者在进入该维度后查看你的日志/聊天信息,
因为 CraftPresence 会告诉你所期望的 ID
- 请提供尺寸在
512x512到1024x1024之间的图标(这是最低或推荐尺寸,以获得最佳质量) - 这些尺寸之间的图标可以使用,但最终质量可能不够理想
- 如果请求修改或移除默认 Client ID 中的某个图标,请说明原因
- 主要是为了记录变更原因,以供将来参考
此外,你也可以通过
参考本指南
来创建你自己的图标集
支持
需要我某个模组的帮助,或者想提供反馈吗?
你可以通过以下方式联系我:
- [Email](mailto:cstack2011@yahoo.com)
- CurseForge
- Discord ::
此外,此模组的代码库文档可在
这里查看,更多指南可在
wiki 上找到
许可
此模组采用 MIT License 以及 Apache 2.0 License
本项目当前在内部使用以下依赖:
- DiscordIPC API 作者:jagrosh
- UniLib 作者:CDAGaming
Discord 服务条款
与其他 RPC 模组一样,此模组会使用你的游戏内数据将显示信息发送到第三方服务(在本例中为
Discord)。
与为图标创建 Discord ID 相关的服务条款可在
这里找到
使用 Discord 作为服务的服务条款也可在
这里查看