
CraftPresence
完全自定义在Discord中他人观看你游戏的方式!
查看大图CraftPresence
通过 Discord 的 Rich Presence API 和 DiscordIPC API,完全自定义他人在 Discord 上看到你在玩 Minecraft 时的方式 作者: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 的 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 文件(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 及以上版本中,这些命令只能通过配置 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 | ?)- 帮助命令,显示上述命令和这些说明
按键绑定
CraftPresence 目前包含以下按键绑定:
注意:
- 在 v1.5.5 到 v1.8.0 版本中,按键绑定现在在配置 GUI 的无障碍设置中自定义,而不是在常规控制菜单中
- 在 v1.8.0 及以上版本中,按键绑定可以在配置 GUI 的专用菜单中自定义,也可以在适用版本的常规控制菜单中自定义
打开配置 GUI- 打开 CraftPresence 配置 GUI 的按键绑定(默认:`(波浪号)键)
关于占位符和函数
在某些配置区域,CraftPresence 提供了一些占位符和函数,以使事情更简单:
请记住以下事项:
- 在 v2.0.0 中,占位符已被重写,以兼容 Starscript
- 此部分的旧列表可以在此处查看
- 所有占位符、函数和代码表达式必须用花括号括起来(示例:
{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- (多人)原始当前服务器地址server.address.short- (多人)格式化后的当前服务器地址server.name- (多人)当前服务器名称server.motd.raw- (多人)当前原始的服务器 MOTDserver.minigame- (领域)当前领域小游戏名称server.type- (领域)当前领域世界类型
- 物品占位符:
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)- 将日期字符串转换为毫秒纪元年时间戳dateToEpochSecond(dateString, format, timeZone ?: null)- 将日期字符串转换为秒纪元时间戳epochMilliToDate(epochMilli, format, timeZone ?: null)- 将纪元时间戳转换为给定格式和时区的日期字符串epochSecondToDate(epochSecond, format, timeZone ?: null)- 将纪元时间戳转换为给定格式和时区的日期字符串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)- 在指定值之间进行线性插值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)- 如果可能,将双精度浮点数四舍五入到指定的小数位snapToStep(num, valueStep)- 使用步进速率值将指定值舍入到最接近的值split(input, regex, limit ?: 0)- 根据给定正则表达式的匹配项拆分此字符串stripAllFormatting(input)- 从输入字符串中去除颜色和格式代码stripColors(input)- 从输入字符串中去除颜色代码stripFormatting(input)- 从输入字符串中去除格式代码timeFromEpochMilli(epochMilli)- 从指定的纪元时间检索时间 InstanttimeFromEpochSecond(epochSecond)- 从指定的纪元时间检索时间 InstanttimeFromString(dateString, fromFormat, fromTimeZone ?: null)- 将日期字符串从一种时区和格式格式化为有效的 Instant 实例timeToEpochMilli(data)- 获取从 Java 纪元算起的毫秒数,源自指定参数timeToEpochSecond(data)- 获取从 Java 纪元算起的秒数,源自指定参数timeToString(date, toFormat, toTimeZone ?: null)- 使用指定的时区和格式格式化日期字符串。toCamelCase(input)- 将字符串转换为有效且可接受的驼峰式格式translate(input=String, args=Object...)- 基于为当前语言检索的模组翻译,翻译未本地化的字符串
免责声明和附加信息
Minecraft 问题和附加构建信息
尽管竭尽全力,由于 Minecraft 代码库的状态,问题仍然可能发生。
这些问题可能阻碍后端的某些部分,并导致模组的某些部分无法正常工作。
考虑到这一点,请注意以下事项:
- Minecraft 1.16 及以上版本
- 随着游戏越来越多的部分由数据驱动,某些模组数据不再能够在不先进入世界的情况下自动检索。
- 到目前为止,生物群系和维度模块受到此更改的影响,只显示默认数据,需要先发现额外的数据。
- Minecraft 1.15 及以下版本
MC-112292:当与 v2 物品渲染器中使用的RenderUtils#drawItemStack方法交互时,使用某些渲染器的方块可能无法正确显示。- 另外,仅在 1.15.x 上,使用此方法的屏幕上可能会出现 z 层级问题
- Minecraft a1.1.2_01 及以下版本
- 在这些版本中,生物群系和维度模块使用了默认数据的桩,因为这些方法的逻辑缺失(最初在 Alpha 1.2.6 中实现)
- 其他问题
- 由于早期 Minecraft 版本中的混淆问题,使用模组的某些部分时可能会出现不正确的数据。
- 在这种情况下,生物群系和维度模块可能无法自动检测到一些必要的信息
- 作为后备,该模组也被设计成在首次发现上述生物群系/维度时添加可选择的模块数据。
- 一些模块列表中提供的"添加新项"选项也可以用来解决这个问题。
- 由于早期 Minecraft 版本中的混淆问题,使用模组的某些部分时可能会出现不正确的数据。
此外,某些设置或 API 调用在某些 MC 版本下可能表现不同。
图标请求
没有看到你喜欢的图标,或者对默认客户端 ID 上添加/修改图标有建议?
如果有,你可以按照以下要求在我的问题跟踪器上提出请求:
- 如果从维度添加图标,请指定该维度来源的模组的链接
- 这是因为必须使用特定的图标 ID,这些 ID 可以在模组中找到,或者在进入维度后检查你的日志/聊天记录,因为 CraftPresence 会告诉你预期的 ID
- 需要大小在
512x512和1024x1024之间的图标(最小或推荐尺寸以获得最佳质量)- 可以使用这些尺寸之间的图标,但最终质量可能不太好
- 如果请求修改或删除默认客户端 ID 中的图标,请说明原因
- 主要是为了记录更改原因,以供将来参考
此外,你也可以按照本指南创建自己的一套图标
支持
需要我的某个模组方面的帮助,或者希望提供反馈?
你可以通过以下方式联系我:
此外,此模组的代码库文档可在此处获取,更多指南可在wiki上找到
许可证
此模组采用 MIT 许可证以及 Apache 2.0 许可证
本项目目前内部使用以下依赖项:
Discord 服务条款
与其他 RPC 模组一样,此模组使用你的游戏内数据向第三方服务(在本例中为 Discord)发送显示信息。
关于为图标创建 Discord ID 的服务条款可在此处找到
关于将 Discord 作为服务使用的服务条款还可在此处找到
正在加载版本记录…




正在加载评论…
评论在新手盒子客户端中发表,这里同步展示。