
波塞冬
客户端Fabric自动钓鱼模组,适用于Hypixel Skyblock:智能咬钩检测,具有类人反应延迟、自动抛竿、海洋生物追踪、鱼饵与重启提醒、聊天触发以及金色鱼类警报功能,所有信息实时显示在HUD上。需要PlayerAPI。
波塞冬(Poseidon)
一款客户端 Fabric 模组,用于在 Hypixel Skyblock 中自动进行钓鱼——抛竿、等待鱼咬钩、收线、再抛竿,所有操作均带有可配置的类人化时间延迟。 以希腊海神命名。
GitHub: https://github.com/noname-mods/Poseidon
运行需要 PlayerAPI 和 YetAnotherConfigLib。 ModMenu 是可选的——它会在模组列表中添加一个设置按钮。
功能特性
智能咬钩检测
波塞冬会扫描附近的实体,寻找服务器在你的浮标有鱼咬钩时放置的 !!! 信号。检测到后,它会根据一个可配置的、随机化的类人反应延迟进行收线,这样时间上就不会显得机械。
自动抛竿
每次捕获后会自动再次抛竿。一个可配置的决策窗口可以让服务器聊天信息在决定前到达,因此用于抑制或停止抛竿的聊天触发器总能及时触发。抛竿延迟可独立随机化(最小/最大毫秒数),并且可以为手动抛竿模式完全禁用。
聊天触发器
最多定义 5 个关键词触发器,用于匹配接收到的捕获信息。每个触发器可以:
- 播放自定义音效
- 在屏幕上显示颜色格式化的标题(完全支持
&d/§d代码) - 抑制下一次自动抛竿
- 完全停止机器人(HUD 保持打开状态)
触发器仅在收线后的 10 秒内触发,并且会过滤为 Hypixel 捕获相关消息(§a 捕获行,§e 双重钩子公告,⛃ 宝藏消息),因此不相关的聊天信息永远不会导致误触发。
服务器消息门控。 波塞冬中的每一个聊天提示——聊天触发器、重启提示和金鱼提示——只对来自服务器的消息做出反应,永远不会对玩家的聊天做出反应。玩家在聊天中键入触发短语(或金鱼行)不会驱动机器人。带签名的玩家消息会因其发送者而被拒绝,而 Hypixel 风格的重格式化玩家聊天([等级] 名称:…,公会 > …,私信)则会因其格式而被拒绝。
鱼饵监控
在抛竿时从你的钓鱼袋(快捷栏最后一个格子)读取鱼饵信息:
- HUD 行 显示当前鱼饵类型和数量
- 低鱼饵提示 当数量降至或低于可配置的阈值时播放音效
- 鱼饵切换提示 当会话中途鱼饵类型改变时播放音效
钓鱼数据 HUD
从 Hypixel 标签列表提取双重钩子几率、海怪几率、钓鱼速度和宝藏几率,并在 HUD 面板中实时显示。
服务器重启提示
检测 Hypixel 的预定重启服务器消息,并播放循环警报,直到你传送到不同区域。HUD 的强调栏会变为红色,并且面板顶部会出现一个警告行,让你无法错过。
金鱼提示 (可选,默认关闭)
监视聊天中的金鱼浮出水面消息。当它出现时,波塞冬会显示一个金色的标题卡片,播放提示音效,收线(如果正在钓鱼),并停止机器人——将控制权交给你,以便让你手动捕获金鱼。之后重新启用机器人即可继续。触发短语、标题文本和音效均可在金鱼配置选项卡中配置。
海怪追踪
每次收线后,波塞冬会扫描区域内的 ⚓ 名牌实体。追踪到的海怪会显示在 HUD 中,当你达到 Hypixel 的 10 个上限时会收到提示。当海怪接近其消失计时器(约 6 分钟)时会触发第二个提示,让你知道在它消失前将其击杀。名牌实体刷新(同一只海怪,新 ID)会通过位置进行检测并正确处理——不会出现重复计数。
浮标漂移检测
如果鱼钩附着在移动的实体上,浮标会从它落点处漂移开。波塞冬会检测超出可配置水平阈值的漂移(经过 1 秒稳定期后),播放提示音效,收线,并可选地再次抛竿——防止机器人卡在移动目标上。漂移自动抛竿是一个独立于全局自动抛竿设置的开关。
鼻涕虫鱼模式
每次抛竿后将所有收线操作延迟 21 秒(装备最大等级鼻涕虫宠物时为 11 秒)。鼻涕虫鱼只在 ≥ 20 秒后才会咬钩,因此这可以防止在瞄准鼻涕虫奖杯鱼时意外捕获普通生物。HUD 会显示实时倒计时,并在计时器结束后变为绿色。 ⚠ 仅在积极捕捞鼻涕虫奖杯鱼时启用。
GUI 关闭锁定
玩家关闭任何 GUI 屏幕后,机器人会等待 0.75 – 2.5 秒的随机延迟,然后再对咬钩信号做出反应。在关闭菜单后立即做出反应看起来可疑——这完全消除了这种模式。
实时 HUD
一个游戏内覆盖层(默认按键:H)显示:
- 机器人开关状态和当前状态
- 浮标状态——无 / 已检测 / 实时倒计时文本
- 鱼饵名称和数量
- 鼻涕虫鱼模式下的倒计时
- 海怪数量 vs. 上限,以及当前区域
- 钓鱼数据(双重钩子几率、海怪几率、速度、宝藏)
- 检测到服务器重启时的警告
- 最近 5 条日志行
完全可配置
所有时间、阈值、音效和开关都通过 YACL 配置界面公开。可以通过 ModMenu、/poseidon 命令或按键绑定来打开。无需编辑文件。
操作控制
所有按键绑定均可在 选项 → 控制 → 波塞冬 中重新绑定。
| 动作 | 默认按键 |
|---|---|
| 切换钓鱼 | Y |
| 切换 HUD | H |
| 打开配置 | (未绑定) |
在聊天中输入 /poseidon 可直接打开配置界面。
安装
- 为 Minecraft 26.1.2 安装 Fabric Loader
- 安装 Fabric API
- 安装 PlayerAPI
- 安装 YetAnotherConfigLib
- 安装 ModMenu (可选)
- 将
poseidon-*.jar放入你的mods文件夹
兼容性
| Minecraft | Fabric Loader | Java |
|---|---|---|
| 26.1.2 | ≥ 0.19.2 | 21 |
Minecraft 版本支持
本模组一次只针对一个 Minecraft 版本。 当它更新到新的 Minecraft 版本时,先前版本将不再获得任何支持——不进行向后移植,不进行错误修复,并且永远不会发布同时支持多个 Minecraft 版本的版本。
- 想要最新功能?你必须使用模组当前支持的 Minecraft 版本。
- 想停留在旧的 Minecraft 版本上?请使用该版本的最后一个发行版——它不会被更新。
游戏内更新检查器能识别 Minecraft 版本:如果最新版本针对的是与你当前运行版本不同的 Minecraft 版本,它会告知你,而不是提示你安装不兼容的构建。
面向开发者
波塞冬(Poseidon)——设计与文档
版本: 1.1.0(配置架构 v13)
平台: Fabric 26.1.2,Java 21
依赖项: PlayerAPI,Fabric API,YACL v3,ModMenu(可选)
模组 ID: poseidon
入口点: com.poseidon.PoseidonMod
配置文件: <游戏目录>/config/poseidon/config.json
日志文件: <游戏目录>/config/poseidon/poseidon.log
目录
- 目的和范围
- 架构概览
- 包结构
- FishingState — 状态枚举
- FishingManager — 核心状态机
- FishingConfig — 配置
- PoseidonHudRenderer — HUD 覆盖层
- PoseidonConfigScreen — YACL 配置 UI
- MouseClickMixin — 右键守卫
- PoseidonLogger — 日志记录
- PoseidonMod — 入口点和事件绑定
- 聊天触发器系统
- 海怪追踪系统
- 鱼钩卡住检测
- AlarmSound 数据类
- 配置架构和迁移历史
- 按键绑定和命令
- HUD 参考
- 配置参考(所有设置)
- 时间参考
- 设计决策和说明
1. 目的和范围
波塞冬是一款为 Hypixel Skyblock 设计的客户端钓鱼自动化模组。它自动化了完整的钓鱼循环:
- 抛竿(手动或自动抛竿)
- 等待服务器的“收线”信号(浮标附近的
!!!实体) - 以类人随机延迟做出反应并收线
- 可选择在可配置延迟后再次抛竿
- 可选择追踪每次捕获后生成的海怪
- 在配置的聊天模式上触发音效提示和标题覆盖层
波塞冬依赖 PlayerAPI 进行所有 Minecraft 交互和调度。它从不直接为玩家输入调用 Minecraft API——一切都通过 MovementActions、Scheduler、TabListInfo、SoundActions、PlayerAPIEvents 进行。
2. 架构概览
PoseidonMod (入口点)
├── 注册按键绑定 (Y, H, 无默认)
├── 注册 /poseidon 命令
├── 订阅 PlayerAPIEvents.TICK → onTick()
├── 订阅 PlayerAPIEvents.CHAT_RECEIVED → onChatReceived()
├── 订阅 PlayerAPIEvents.WORLD_JOIN → onWorldJoin()
└── 注册 HudRenderCallback → PoseidonHudRenderer.render()
onTick() 每个游戏刻:
├── 如果 openConfigNextTick 标志被设置,则打开配置界面
├── FishingManager.tick() — 核心状态机
├── RebootAlertManager.tick() — 驱动重启警报循环
└── handleKeybinds() — 轮询按键按下
onChatReceived(sender, message):
├── RebootAlertManager.onChatReceived() — 始终运行
├── 守卫: isInCatchWindow() — 仅在收线后 10 秒内
├── 守卫: isCatchMessage() — 仅限于 §a、§e 或 ⛃ 前缀
└── 遍历 FishingConfig.getTriggerLevels(),第一个匹配的触发
FishingManager.tick() (仅在激活时):
├── GUI 关闭锁定: 跟踪打开→关闭的转换,设置随机延迟
├── IDLE 状态: 等待浮标;空闲看门狗重试失败的抛竿
├── WAITING 状态: 每个刻运行 detectBite()
│ ├── 发现咬钩 + guiLocked → 跳过 (下一个刻重试)
│ ├── 发现咬钩 + 鼻涕虫鱼计时器未到 → 跳过 (下一个刻重试)
│ ├── 发现咬钩 → 保存浮标位置 → BITING, 安排收线
│ └── 无咬钩: 更新 nearbyText,运行 checkHookStuck()
├── BITING 状态: 等待计划的收线;对浮标丢失做出反应
└── REELING 状态: 等待浮标消失
线程模型: 所有内容都在 Minecraft 客户端主线程上运行。PlayerAPIEvents.TICK 在客户端刻上触发。Scheduler 回调也在客户端线程上执行。更新检查器使用守护线程进行 HTTP 请求。PoseidonLogger 文件 I/O 也在后台线程上运行(追加模式)。
3. 包结构
com.poseidon
├── PoseidonMod.java — ClientModInitializer, 事件绑定, 按键绑定, 命令
├── core/
│ ├── FishingState.java — 枚举: IDLE, WAITING, BITING, REELING
│ ├── FishingManager.java — 单例状态机, 所有钓鱼逻辑
│ ├── FishingConfig.java — 单例配置, 持久化, 迁移
│ ├── RebootAlertManager.java — 检测 Hypixel 重启消息, 驱动警报循环
│ └── PoseidonLogger.java — 单例日志记录器, 内存环形缓冲区 + 文件输出
├── gui/
│ ├── PoseidonHudRenderer.java — 每帧绘制的 HUD 覆盖层
│ └── PoseidonConfigScreen.java — YACL 配置界面构建器
├── mixin/
│ └── MouseClickMixin.java — 在活跃施放期间阻止右键点击 (不在 GUI 中)
└── modmenu/
└── PoseidonModMenuPlugin.java — ModMenu 集成
4. FishingState — 状态枚举
com.poseidon.core.FishingState
| 状态 | 含义 |
|---|---|
IDLE |
机器人已激活但尚未抛竿。浮标不存在。 |
WAITING |
浮标在水中。每个刻扫描 !!! 咬钩信号。同时监视附近倒计时文本和鱼钩漂移。 |
BITING |
检测到 !!! 信号。通过 Scheduler 进行反应倒计时。 |
REELING |
tapKey("use", 100) 命令已发送。等待浮标实体消失。 |
状态转换:
IDLE → WAITING 当 hasBobber 变为 true
WAITING → BITING 当 detectBite() 返回 true (并且所有守卫通过)
WAITING → IDLE 如果在监视期间浮标消失
BITING → REELING 当计划的收线触发时 (BITING 路径) — 或直接安排抛竿 (IDLE 路径)
BITING → IDLE 如果在收线触发前浮标消失
REELING → IDLE 经过 10 刻重置后 (或如果浮标消失)
5. FishingManager — 核心状态机
com.poseidon.core.FishingManager — 单例,FishingManager.getInstance()
激活
FishingManager.getInstance().setActive(true); // 开始监视
FishingManager.getInstance().setActive(false); // 停止,重置为 IDLE
FishingManager.getInstance().toggle(); // 翻转激活状态
setActive(false) 重置所有标志:状态 → IDLE,pendingSuppressRecast,pendingStopBot,lastRecastTick,lastReelTick,castTick,guiWasOpen,guiLockUntilTick,lastBaitName,lowBaitAlertFired。
GUI 关闭锁定
每个刻,tick() 检查 mc.currentScreen 是否从非 null → null 转换。在该转换上,选择一个随机的锁定持续时间(GUI_RESUME_MIN_TICKS=15 到 GUI_RESUME_MAX_TICKS=50 刻,约 0.75–2.5 秒),并设置 guiLockUntilTick。布尔值 guiLocked 在屏幕打开时或关闭后的延迟期间为 true。咬钩检测守卫会检查 guiLocked,如果为真则提前返回。
咬钩检测
detectBite(MinecraftClient mc) 扫描一个以浮标为中心、XZ 方向 ±detectionRadius、Y 方向 -1 到 +detectionRadius+2 的盒子。检查每个实体是否有 hasReelNowSignal():
entity.getCustomName().getString().contains("!!!")- 对于显示实体:
TextDisplayEntity.getText().getString().contains("!!!")
收线和抛竿决策
scheduleReelIn() 选择一个随机延迟并调用 Scheduler.scheduleMs()。Lambda 处理两条路径:
- BITING(正常):转换为 REELING,发送
tapKey("use", 100),安排海怪扫描和 10 刻状态重置。 - IDLE(延迟期间浮标已消失):跳过
tapKey,记录跳过,继续执行通用的抛竿决策尾部。 - 其他状态:立即返回。
BITING 和 IDLE 路径都会在 recastDecisionTicks 后安排抛竿决策。决策会按优先级顺序检查 pendingStopBot、pendingSuppressRecast 和 cfg.isAutoRecast()。
空闲看门狗
当 scheduleRecast 触发其 tapKey 时,会标记 lastRecastTick。如果机器人在 IDLE 状态下停留超过 IDLE_TIMEOUT_TICKS(100)刻而未检测到浮标,看门狗会记录警告并再次调用 scheduleRecast()。检测到浮标(IDLE→WAITING)或调用 setActive(false) 时,lastRecastTick 会被清除。
鼻涕虫鱼模式
首次检测到浮标时(IDLE→WAITING),castTick 被标记。在 WAITING 咬钩检测路径中,如果 cfg.isSlugfishMode() 为真且 currentTick - castTick < required(普通 420 刻 / 装备鼻涕虫宠物 220 刻),则咬钩会被静默忽略,方法返回。浮标丢失和 setActive(false) 时会清除 castTick。
捕获窗口门控
当收线 tapKey 触发时,lastReelTick 被标记。isInCatchWindow() 在该标记后的 CATCH_WINDOW_TICKS(200 刻 / 10 秒)内返回 true。由 PoseidonMod.onChatReceived() 用于门控触发器评估。
公共 Getter 方法
| 方法 | 返回 |
|---|---|
isActive() |
机器人当前是否启用 |
getState() |
当前的 FishingState |
getTrackedCount() |
当前追踪的海怪数量 |
getCurrentArea() |
来自标签列表的区域字符串,或 "" |
getNearbyText() |
倒计时/附近实体文本,或 "" |
getBaitName() |
当前鱼饵显示名称,或 "" |
getBaitCount() |
来自 lore / 堆叠大小的鱼饵数量,或 0 |
getStatFishingSpeed() |
来自标签列表的钓鱼速度,或 "" |
getStatSeaCreatureChance() |
来自标签列表的海怪几率,或 "" |
getStatDoubleHookChance() |
来自标签列表的双重钩子几率,或 "" |
getStatTreasureChance() |
来自标签列表的宝藏几率,或 "" |
getSlugfishRemainingTicks() |
鼻涕虫鱼计时器剩余刻数(≤0 = 就绪,MIN_VALUE = 模式关闭 / 无浮标) |
isInCatchWindow() |
上次收线后 10 秒内为真 |
shouldBlockRightClick() |
在 WAITING/BITING 状态下且无 GUI 打开时为真 |
6. FishingConfig — 配置
com.poseidon.core.FishingConfig — 单例,FishingConfig.getInstance()
配置以 JSON 形式存储在 config/poseidon/config.json。初始化时加载一次。每个 setter 都立即调用 save()。
配置组
检测
detectionRadius— 扫描框半大小,用于检测!!!(默认4.0)hookStuckDetectionEnabled(默认true)hookStuckMaxDistance— 漂移阈值(方块数,默认1.5)hookStuckAutoRecast— 漂移后抛竿,独立于全局自动抛竿(默认true)hookStuckSoundslugfishMode— 抑制收线直到计时器结束(默认false)slugPet— 将鼻涕虫鱼计时器减半(默认false)
反应 / 抛竿
reactionDelayMinMs/reactionDelayMaxMsautoRecast(默认true)recastDelayMinMs/recastDelayMaxMsrecastDecisionTicks(默认10)
鱼饵监控
baitHudVisible(默认true)baitLowThreshold(默认5)baitLowAlertSoundbaitSwitchAlertSound
海怪追踪
trackSeaCreatures(默认true)creatureScanRadius(默认12.0)SEA_CREATURE_CAP=10(静态常量,Hypixel 标准化)seaCreatureCapSounddespawnWarningEnabled(默认true)despawnWarningMinutes(默认5)despawnWarningSound
数据和提示
fishingStatsHudVisible(默认true)rebootAlertEnabled(默认true)rebootAlertSound
触发器
triggerLevels— 5 个TriggerLevel对象列表(默认全部禁用)biteAlertSound(默认静音,durationSeconds=0)
开发者
debugMode(默认false)logLevel(默认LEVEL_WARN= 2)
7. PoseidonHudRenderer — HUD 覆盖层
com.poseidon.gui.PoseidonHudRenderer
可见性: 静态 hudVisible,通过 H 按键绑定切换。在激活时关闭 HUD 会调用 setActive(false)。
面板布局
位置 (4, 4),宽度 200 像素。高度动态变化。
标题头: 左侧显示“Poseidon”标签;右侧显示状态标签(按状态着色)。左侧边缘有强调栏;重启提示期间闪烁红色。
行(按顺序,每行可选):
| 行 | 标签 | 显示时机 | 颜色逻辑 |
|---|---|---|---|
! Reboot |
SOON | 重启提示激活 | 红色 0xFFFF4444 |
Active |
Yes / No | 始终 | 绿色 / 红色 |
State |
状态名称 | 始终 | 状态颜色 |
Bobber |
None / Detected / 倒计时 | 始终 | 灰色=无,绿色=已检测,黄色=倒计时 |
Slug |
-- / Xs / READY |
鼻涕虫鱼模式开启 | 灰色=无浮标,橙色=计数中,绿色=就绪 |
Bait |
名称 (数量) | 鱼饵 HUD 开启 | 无鱼饵时红色 |
Area |
岛屿名称 | 海怪追踪开启 + 已知区域 | 灰色 |
SC |
数量 / 10 | 海怪追踪开启 | 灰色=0,橙色>0,红色=达到上限 |
DHC |
数据或 -- |
数据 HUD 开启 + 已知任何数据 | 浅灰色 |
SCC |
数据或 -- |
数据 HUD 开启 + 已知任何数据 | 浅灰色 |
Speed |
数据或 -- |
数据 HUD 开启 + 已知任何数据 | 浅灰色 |
Treasure |
数据或 -- |
数据 HUD 开启 + 已知任何数据 | 浅灰色 |
日志面板: 主面板下方显示最近 5 条日志行(前缀已去除,最多 50 字符)。
强调栏颜色
| 状态 | 颜色 |
|---|---|
| 重启提示 | 红色 0xFFFF4444(覆盖状态颜色) |
| IDLE (active=false) | 红色 0xFFEE4444 |
| IDLE (active=true) | 橙色 0xFFFFAA00 |
| WAITING | 绿色 0xFF44EE44 |
| BITING | 黄色 0xFFFFFF44 |
| REELING | 蓝色 0xFF44AAFF |
8. PoseidonConfigScreen — YACL 配置 UI
com.poseidon.gui.PoseidonConfigScreen
通过 /poseidon、Open Config 按键绑定或 ModMenu 打开。
标签 1 — 检测
- 检测半径滑块 (1.0 – 10.0)
- 鱼钩卡住检测 部分:启用开关,最大漂移滑块,漂移自动抛竿开关,音效选项
- 鼻涕虫鱼模式 部分:鼻涕虫鱼模式开关(含警告),装备鼻涕虫宠物开关(含假设警告)
标签 2 — 反应延迟
- 最小/最大反应延迟滑块
- 自动抛竿 部分:开关,最小/最大抛竿延迟滑块,触发器等待滑块(含延迟指导)
标签 3 — 海怪追踪
- 启用追踪开关,扫描半径滑块
- 达到上限音效选项
- 消失警告:启用开关,警告时间滑块,音效选项
标签 4 — 鱼饵
- 在 HUD 中显示鱼饵开关(含使用说明)
- 低鱼饵部分:阈值滑块,音效选项
- 鱼饵切换部分:音效选项
标签 5 — 数据和提示
- 钓鱼数据 HUD 开关
- 重启提示开关 + 音效选项
标签 6 — 聊天触发器
- 解释语法的标题标签
- 5 个
OptionGroup块(每个触发槽位一个):启用,名称,模式,动作(保留),显示标题,标题文本(支持&x/§x代码),不抛竿,停止机器人,音效选项 - 底部咬钩提示部分(默认静音)
标签 7 — 更新
- 更新检查开关
标签 8 — 开发者
- 调试模式开关
- 日志级别循环列表(DEBUG / INFO / WARN / ERROR)
9. MouseClickMixin — 右键守卫
com.poseidon.mixin.MouseClickMixin
在 Mouse.onMouseButton() 的 HEAD 处注入,可取消。当 FishingManager.shouldBlockRightClick() 返回 true 时阻止右键点击。
当满足以下条件时 shouldBlockRightClick() 为真:
- 机器人已激活
- 状态为
WAITING或BITING mc.currentScreen == null(无 GUI 打开——从不在菜单内阻止)
10. PoseidonLogger — 日志记录
com.poseidon.core.PoseidonLogger — 单例,PoseidonLogger.getInstance()
| 常量 | 值 | 用途 |
|---|---|---|
LEVEL_DEBUG |
0 | 详细输出 |
LEVEL_INFO |
1 | 正常事件 |
LEVEL_WARN |
2 | 意外情况(默认) |
LEVEL_ERROR |
3 | 失败 |
- 环形缓冲区: 同步
ArrayDeque<String>中的最近 50 行 → HUD 日志面板 - 文件输出: 仅追加到
config/poseidon/poseidon.log - 行格式:
[HH:mm:ss] [LEVEL] 消息
11. PoseidonMod — 入口点和事件绑定
com.poseidon.PoseidonMod — 实现 ClientModInitializer
初始化
- 记录日志“Poseidon initialising…”
FishingConfig.getInstance().load()registerKeybinds()— Y,H,未绑定的配置键registerCommands()—/poseidon+ ALLOW_COMMAND 回退HudRenderCallback.EVENT.register(PoseidonHudRenderer::render)PlayerAPIEvents.TICK.register(this::onTick)PlayerAPIEvents.CHAT_RECEIVED.register(this::onChatReceived)PlayerAPIEvents.WORLD_JOIN.register(this::onWorldJoin)— 触发更新检查- 记录日志“Poseidon ready.”
onChatReceived(String sender, String message)
RebootAlertManager.getInstance().onChatReceived(sender, message)— 始终运行if (!FishingManager.getInstance().isInCatchWindow()) return— 时间门控if (!isCatchMessage(message)) return— 颜色门控(§a,§e,⛃)- 遍历触发级别;第一个匹配:播放音效,显示标题(通过
parseLegacyText()),调用notifyTriggerFired()
showTitle / parseLegacyText
showTitle() 使用由 parseLegacyText() 构建的 MutableText 直接调用 mc.inGameHud.setTitle() / setSubtitle() / setTitleTicks()。& 和 § 都被接受为格式代码前缀。颜色代码会重置粗体/斜体等,以匹配原版行为;§r/&r 重置所有样式。
12. 聊天触发器系统
门控(两者都通过后才检查模式)
- 时间门控:
isInCatchWindow()— 在收线tapKey触发后的 200 刻(10 秒)内为真。 - 颜色门控:
isCatchMessage(msg)— 如果 msg 以§a(绿色捕获)、§e(黄色/金色,例如双重钩子)开头,或者第一个非格式代码字符是⛃(宝藏捕获),则为真。
TriggerLevel 字段
String name // 在配置标题和日志中显示的标签
boolean enabled
String patterns // 逗号分隔,不区分大小写的子字符串
AlarmSound sound
String action // 保留,未使用
boolean dontRecast // 抑制此捕获的自动抛竿
boolean stopBot // 在此捕获后停用机器人
boolean showTitle // 显示 MC 标题覆盖层
String titleText // 支持 &x / §x 颜色代码;回退为名称
模式匹配
TriggerLevel.matches(String chatText) — 按 , 分割模式,全部转为小写,如果任何非空模式是聊天文本的子字符串,则返回 true。不区分大小写,无正则表达式。
13. 海怪追踪系统
检测
isSeaCreatureDisplay(Entity) — 检查自定义名称或 TextDisplayEntity 文本中是否包含 ⚓(U+2693)。
extractCreatureName(Entity) — 从完整名牌文本中去除 [LvN] ⚓ 前缀和生命值后缀。
扫描时机
在收线后的 SCAN_DELAY_TICKS(5)刻运行,以保存的 lastBobberX/Y/Z 位置为锚点。
每次收线最多添加一个海怪,以避免拾取其他玩家附近的生物。
去重
在添加新实体之前,扫描器会检查所有名称相同的已追踪海怪。如果任何已追踪海怪与新实体相距 3 格以内,则视为名牌刷新(同一生物的新显示实体),并就地更新其 entityId,而不是添加新条目。
清理
cleanupDeadCreatures() 每 CLEANUP_PERIOD_TICKS(40)刻运行一次:
- 消失警告: 检查海怪存在时间与
despawnWarningTicks的对比;每个海怪仅触发一次音效。 - 移除已死:
removeIf(t -> mc.world.getEntityById(t.entityId) == null)。位置(lastX/lastZ)在实体存活期间保持最新,用于去重检查。 - 上限重置: 如果移除后追踪数量低于
SEA_CREATURE_CAP,清除capAlertFired。
上限
SEA_CREATURE_CAP = 10 — 单个静态常量。按区域的上限映射已在 1.1.0 中移除。
14. 鱼钩卡住检测
在 1 秒稳定期(BOBBER_SETTLE_TICKS = 20)之后,每个 WAITING 刻:
- 计算
dist = sqrt((bobber.X - initialX)² + (bobber.Z - initialZ)²) - 如果
dist > hookStuckMaxDistance:播放hookStuckSound,发送tapKey("use", 100),如果cfg.isHookStuckAutoRecast()则安排抛竿(独立于全局autoRecast)
仅测量 XZ 平面可避免来自正常垂直浮漂(约 0.5 格)的误报。
15. AlarmSound 数据类
FishingConfig.AlarmSound — 内部类,用于波塞冬中的所有音效。
| 字段 | 类型 | 说明 |
|---|---|---|
soundId |
String | Minecraft 音效 ID |
volume |
double | 0.1 – 2.0 |
pitch |
double | 0.5 – 2.0 |
durationSeconds |
int | 0 = 静音/禁用 |
intervalTicks |
int | 重复播放间隔(刻) |
play() — times = (durationSeconds × 20) / intervalTicks;调用 SoundActions.playByIdRepeated()。如果 `durationSeconds ≤
正在加载版本记录…
正在加载评论…
评论在新手盒子客户端中发表,这里同步展示。