
Eclipse核心客户端
该项目的核心功能是在cobblemon客户端中启用双打对战机制,同时它也服务于其他目的,比如在自建模组的服务器上实现4v1突袭。更多功能将逐步添加。
Eclipse Core Client
Cobblemon Eclipse 网络的客户端配套模组,同时是一个适用于任何 Cobblemon 服务器的完整对战 HUD 改造。
对战 HUD
- 对战信息窗口取代 Cobblemon 原版对战信息块:名称/等级、HP、属性图标、速度读数、队伍球标签(闲置/濒死/异常状态/出战状态),以及可点击切换的能力等级提升面板。六种主题:Eclipse Dark、Ruby Red、Forest Green、Rose Pink、Pearl White、Solar Yellow。在双打以及团体战盟友中,窗口会切换为紧凑的整合框架。
- 重新设计的对战菜单:战斗/背包/替换/逃跑/认输按钮、招式按钮、替换上场与目标选择器,以及返回/特殊机制/替换按钮均与 HUD 主题匹配。一个开关即可恢复为 Cobblemon 原版外观。
- 对战日志:可移动和调整大小,按事件类型(伤害、治疗、暴击、濒死、替换、状态、场地/团体战事件)进行颜色编码,支持悬停查看行详情,标题栏上有主题选择器,可重新着色整个对战 UI。在你选择招式目标或替换上场时会自动让开。
- 侧边队伍名单:可拖拽的 2 列网格,带有闪光/光辉图标和悬停信息。
- 团体战 Boss 框架:专用的 Boss 窗口,带有超大立绘、内置护盾计量条,以及护盾阶段之间的 Boss 速度范围。
- 招式提示框,包含附加效果、伤害范围、效果/场地持续时间追踪、可悬停的易变状态图标、浮动伤害数字等。
一切都可以在游戏内通过 ModMenu + Cloth Config 进行配置。
视觉改造适用于任何 Cobblemon 服务器。在 Cobblemon Eclipse 网络上,服务器端的 eclipse-core 模组还会额外驱动实时数据:速度读数、伤害范围、已揭示的招式/道具/特性,以及敌方队伍名单。
多人团体战
- 多人团体战支持:1-4 名玩家合作对抗单个强大 Boss(与服务器端的 eclipse-raids-4v1 模组配合使用)
- 目标选择系统覆盖:在非标准对战格式中提供正确的目标选择
- 对战阵营组织:盟友和敌人显示在正确的阵营
- 团体战 HUD 与音乐:助威 UI、团体战 HUD、循环团体战音乐,可通过
/raidmusic切换
还包含
- 双打/三打特殊机制修复:防止在单个回合内多次使用同一个对战特殊机制(超级进化、太晶化、Z 招式、极巨化)
- 外观与名称标签渲染:从 Eclipse 服务器同步的帽子、披风、粒子效果和自定义头顶名称标签
- Bobby 区块内存修复:区块驱逐和内存压力监控,避免长时间使用 Bobby 时内存泄漏
需求
- Minecraft 1.21.1
- Fabric Loader 0.16.5+
- Fabric API
- Fabric Language Kotlin
- Cobblemon 1.7.3+
安装
- 下载并放入客户端的
mods文件夹。 - 本模组仅客户端。它通过自定义数据包与 Eclipse 服务器模组通信,在其他服务器上保持静默。
面向模组开发者
有兴趣为 Cobblemon 创建自己的团体战或多人对战模组?以下是你需要了解的内容:
核心挑战
Cobblemon 的对战系统是为 1v1 和 2v2 格式设计的。要创建团体战(4v1、3v1 等),你需要解决几个问题:
- 对战创建 - 如何让 4 名玩家在同一方开始对战?
- 目标选择 - 当相邻规则不允许时,玩家如何选中单个 Boss?
- 阵营显示 - 当客户端预期标准格式时,如何正确显示盟友?
- Showdown 兼容性 - 如何让 Showdown 接受非标准队伍配置?
服务器端:启动多人对战
查看 Cobblemon 的 BattleBuilder 和 BattleRegistry。关键类:
BattleBuilder- 使用参与者和格式创建对战BattleActor- 代表参与者(玩家或 NPC)BattleFormat- 定义对战规则(单打、双打等)PokemonBattle- 活跃的对战实例
对于团体战,你需要在同一方有多个 BattleActor 实例。研究 Cobblemon 如何处理双打——这是多人对战的基础。
Showdown 层
Cobblemon 使用 Pokemon Showdown 进行对战逻辑。对战通过以下方式创建:
BattleRegistry.startBattle(format, side1Actors, side2Actors)
Showdown 以“打包字符串”的形式接收队伍数据——即宝可梦的紧凑表示。该格式在 Showdown 的源码中有文档说明。关键洞察:Showdown 的 fPokemon 格式包含物种、等级、招式、特性等。
对于团体战 Boss,请考虑:
- 如何让一只宝可梦拥有更高的有效 HP?
- 如何让一只宝可梦承受多个攻击者的攻击?
- 当 Showdown 计算对“缩放”目标的伤害时会发生什么?
客户端:目标选择问题
在标准双打中,宝可梦只能选择相邻的槽位作为目标。在 4v1 团体战中,所有玩家都需要选中单个 Boss。
客户端使用 ActiveClientBattlePokemon.getAdjacent() 来确定有效目标。该方法检查位置,并根据对战格式返回有效目标。
Eclipse Core Client 通过以下方式解决此问题:
- 拦截目标请求
- 为团体战格式覆盖相邻计算
- 通过自定义数据包通信团体战配置
数据包通信
Fabric 网络允许服务器与客户端之间使用自定义数据包:
// 服务器端:注册并发送
PayloadTypeRegistry.playS2C().register(...)
ServerPlayNetworking.send(player, payload)
// 客户端:注册接收器
ClientPlayNetworking.registerGlobalReceiver(...)
你的数据包应告诉客户端:
- 这是团体战对战吗?
- 有多少玩家参与?
- Boss 在哪一方?
客户端需要在对战 UI 渲染之前获得此信息,才能正确组织阵营。
Showdown 修改(高级)
Cobblemon 将 Showdown 解压到 ./showdown/。sim/ 中的 JavaScript 文件控制对战机制:
battle.js- 主对战循环和回合处理pokemon.js- 宝可梦状态、HP、PP 管理side.js- 阵营管理和槽位处理battle-actions.js- 招式执行和伤害
对于团体战机制,你可能需要修改以下方面的处理方式:
- 对 Boss 的伤害计算
- PP 的追踪方式(Boss 无限 PP?)
- 多目标招式的结算
- Boss 对多个目标采取行动
通过 Mixin 注入 GraalShowdownUnbundler.attemptUnbundle() 以在解压后修补文件。
Mixin 目标参考
客户端(用于目标选择/显示修复):
ActiveClientBattlePokemon- 目标选择和相邻性BattleMoveSelection- 招式选择 UIClientBattle- 阵营组织
服务器端(用于对战创建):
BattleBuilder- 对战初始化BattleActor- 参与者行为NPCBattleActor- NPC 特定逻辑
入门指南
- 创建一个基本的服务器模组,启动双打对战
- 在一方添加第三名玩家——观察哪些地方出问题
- 研究错误以理解约束条件
- 逐层实现修复(Showdown → 服务器 → 客户端)
从“双打可用”到“4v1 团体战可用”的旅程将教会你关于 Cobblemon 对战系统的一切。
Eclipse 数据包协议
希望你的服务器模组与 Eclipse Core Client 配合使用?实现以下数据包:
数据包 1:客户端握手(客户端 → 服务器)
频道: eclipse_raids:client_handshake
当装有 Eclipse Core Client 的玩家加入你的服务器时,会发送此数据包。
| 字段 | 类型 | 描述 |
|---|---|---|
| protocolVersion | Int | 客户端协议版本(当前为 2) |
Kotlin 编解码器:
buf.writeInt(protocolVersion)
// 读取:buf.readInt()
用它来追踪哪些玩家安装了客户端模组。禁止未安装的玩家参与团体战。
数据包 2:握手确认(服务器 → 客户端)
频道: eclipse_raids:handshake_ack
发送此包以确认客户端已被识别。
| 字段 | 类型 | 描述 |
|---|---|---|
| raidsEnabled | Boolean | 此服务器是否启用团体战 |
| message | String | 状态消息(显示在客户端日志中) |
Kotlin 编解码器:
buf.writeBoolean(raidsEnabled)
buf.writeString(message)
数据包 3:团体战阵营配置(服务器 → 客户端)
频道: eclipse_raids:raid_side_config
这是关键数据包。 在开始团体战对战后发送此包,告诉客户端哪些参与者是盟友、哪些是敌人。
| 字段 | 类型 | 描述 |
|---|---|---|
| battleId | UUID | 来自 PokemonBattle.battleId 的对战 UUID |
| allyShowdownIds | List<String> | 玩家方的 Showdown ID(例如 ["p1", "p3", "p5", "p7"]) |
| enemyShowdownIds | List<String> | Boss 方的 Showdown ID(例如 ["p2"]) |
Kotlin 编解码器:
// 写入
buf.writeUuid(battleId)
buf.writeInt(allyShowdownIds.size)
allyShowdownIds.forEach { buf.writeString(it) }
buf.writeInt(enemyShowdownIds.size)
enemyShowdownIds.forEach { buf.writeString(it) }
// 读取
val battleId = buf.readUuid()
val allyCount = buf.readInt()
val allyIds = (0 until allyCount).map { buf.readString() }
val enemyCount = buf.readInt()
val enemyIds = (0 until enemyCount).map { buf.readString() }
Showdown ID 约定
Showdown 根据对战位置分配 ID:
- p1, p3, p5, p7 - 一方的奇数编号(用于玩家)
- p2, p4, p6, p8 - 另一方的偶数编号(用于 Boss)
在 4v1 团体战中:
- 玩家 1 → p1
- 玩家 2 → p3
- 玩家 3 → p5
- 玩家 4 → p7
- Boss → p2
何时发送 RaidSideConfig
时机至关重要。 在以下时刻发送数据包:
BattleRegistry.startBattle()返回之后- 玩家打开对战 UI 之前(他们有约 1-2 秒)
建议:立即发送,然后在 3 秒(60 刻)后再次发送作为安全网,以防客户端尚未准备好。
// 对战开始后立即发送
for (player in players) {
ServerPlayNetworking.send(player, RaidSideConfigPayload(battle.battleId, allyIds, enemyIds))
}
// 安全网 - 3 秒后重新发送
Scheduler.schedule(60) {
for (player in players) {
ServerPlayNetworking.send(player, RaidSideConfigPayload(battle.battleId, allyIds, enemyIds))
}
}
客户端的行为
当 Eclipse Core Client 收到 RaidSideConfigPayload 时:
- 查找与
battleId匹配的活跃ClientBattle - 从双方收集所有
ClientBattleActor - 重新组织它们:盟友 →
side1,敌人 →side2 - 设置
isInRaidBattle = true(启用目标选择覆盖)
这修复了:
- 宝可梦出现在错误的视觉阵营
- 玩家无法选中 Boss(相邻性覆盖生效)
载荷类(Fabric 1.21.1)
// 在你的模组初始化器中注册
PayloadTypeRegistry.playC2S().register(ClientHandshakePayload.ID, ClientHandshakePayload.CODEC)
PayloadTypeRegistry.playS2C().register(HandshakeAckPayload.ID, HandshakeAckPayload.CODEC)
PayloadTypeRegistry.playS2C().register(RaidSideConfigPayload.ID, RaidSideConfigPayload.CODEC)
// 处理传入的握手
ServerPlayNetworking.registerGlobalReceiver(ClientHandshakePayload.ID) { payload, context ->
val player = context.player()
// 记录此玩家拥有客户端模组
// 发送确认回执
}
没有此客户端模组时
如果玩家没有 Eclipse Core Client:
- 正常的 1v1 和 2v2 对战正常工作
- 团体战对战的目标选择会出问题(玩家无法选中 Boss)
- 宝可梦可能视觉上出现在错误的阵营
通过检查你的握手追踪,禁止未安装客户端模组的玩家参与团体战。
兼容性
本模组设计为与实现了 Eclipse 数据包协议的服务器端团体战模组配合使用。没有兼容的服务器模组时,它作为双打/三打对战的被动特殊机制修复功能运行。
支持
本模组按原样提供,用于与兼容的 Eclipse 服务器模组配合使用。
Cobblemon Eclipse 由我们的团队设计、指导、平衡和运营。每个功能及其行为均由我们编写和决定,然后在该指导下借助 AI 协助构建,并在发布前在我们的线上网络中测试。根据 Modrinth 的 AI 政策,本项目已启用“包含 AI 生成内容”披露(代码)。
正在加载版本记录…
正在加载评论…
评论在新手盒子客户端中发表,这里同步展示。