CraftPresence

CraftPresence

完全自定义在Discord中他人观看你游戏的方式!

基础库

CraftPresence

通过 Discord 的 Rich Presence API 和 DiscordIPC API,完全自定义他人在 Discord 上看到你在玩 Minecraft 时的方式 作者:jagrosh

License: MIT Crowdin Codacy Badge Pipeline Status

CurseForge-Downloads CurseForge-Availability

Modrinth-Downloads Modrinth-Availability

一般说明

  • 从 v2.5.0 版本开始,UniLib 现在是必需的依赖项
    • UniLib 是我创建的一个新的库模组,用于抽象常见的 API 函数,以满足更普遍的用例以及未来的项目需求
    • 该模组可以在此处下载
    • 如果找不到 UniLib 或使用了不兼容的版本,此模组将会崩溃
  • 此模组被认定为仅客户端模组
    • 这意味着它不会在服务器端运行。
    • Fabric 和 Quilt 模组加载器会直接忽略此模组,而其他模组加载器可能会崩溃。
  • 某些适用于 Minecraft 1.14.x 及以上版本的模组版本需要 Fabric APIFabric 模组加载器
  • 某些适用于 Minecraft 1.13.x 的模组版本需要 Rift APIRift 模组加载器
  • 某些适用于 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.namepack.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 - (多人)当前原始的服务器 MOTD
    • server.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) - 从指定内容中检索数组元素,如果无法则返回 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
  • 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) - 确定指定图标键是否存在于当前客户端 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 或 EMPTY
  • randomAsset() - 尝试从可用资产中检索随机图标键
  • randomString(args) - 从指定参数中检索一个随机元素,作为字符串
  • removeRepeatWords(input) - 删除输入字符串中的重复单词
  • roundDouble(num, places ?: 0) - 如果可能,将双精度浮点数四舍五入到指定的小数位
  • snapToStep(num, valueStep) - 使用步进速率值将指定值舍入到最接近的值
  • split(input, regex, limit ?: 0) - 根据给定正则表达式的匹配项拆分此字符串
  • stripAllFormatting(input) - 从输入字符串中去除颜色和格式代码
  • stripColors(input) - 从输入字符串中去除颜色代码
  • stripFormatting(input) - 从输入字符串中去除格式代码
  • timeFromEpochMilli(epochMilli) - 从指定的纪元时间检索时间 Instant
  • timeFromEpochSecond(epochSecond) - 从指定的纪元时间检索时间 Instant
  • timeFromString(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 版本中的混淆问题,使用模组的某些部分时可能会出现不正确的数据。
      • 在这种情况下,生物群系和维度模块可能无法自动检测到一些必要的信息
      • 作为后备,该模组也被设计成在首次发现上述生物群系/维度时添加可选择的模块数据。
      • 一些模块列表中提供的"添加新项"选项也可以用来解决这个问题。

此外,某些设置或 API 调用在某些 MC 版本下可能表现不同。

图标请求

没有看到你喜欢的图标,或者对默认客户端 ID 上添加/修改图标有建议?

如果有,你可以按照以下要求在我的问题跟踪器上提出请求:

  • 如果从维度添加图标,请指定该维度来源的模组的链接
    • 这是因为必须使用特定的图标 ID,这些 ID 可以在模组中找到,或者在进入维度后检查你的日志/聊天记录,因为 CraftPresence 会告诉你预期的 ID
  • 需要大小在 512x5121024x1024 之间的图标(最小或推荐尺寸以获得最佳质量)
    • 可以使用这些尺寸之间的图标,但最终质量可能不太好
  • 如果请求修改或删除默认客户端 ID 中的图标,请说明原因
    • 主要是为了记录更改原因,以供将来参考

此外,你也可以按照本指南创建自己的一套图标

支持

需要我的某个模组方面的帮助,或者希望提供反馈?

你可以通过以下方式联系我:

此外,此模组的代码库文档可在此处获取,更多指南可在wiki上找到

许可证

此模组采用 MIT 许可证以及 Apache 2.0 许可证

本项目目前内部使用以下依赖项:

Discord 服务条款

与其他 RPC 模组一样,此模组使用你的游戏内数据向第三方服务(在本例中为 Discord)发送显示信息。

关于为图标创建 Discord ID 的服务条款可在此处找到

关于将 Discord 作为服务使用的服务条款还可在此处找到