波塞冬

波塞冬

客户端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 可直接打开配置界面。


安装

  1. 为 Minecraft 26.1.2 安装 Fabric Loader
  2. 安装 Fabric API
  3. 安装 PlayerAPI
  4. 安装 YetAnotherConfigLib
  5. 安装 ModMenu (可选)
  6. 将 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


目录

  1. 目的和范围
  2. 架构概览
  3. 包结构
  4. FishingState — 状态枚举
  5. FishingManager — 核心状态机
  6. FishingConfig — 配置
  7. PoseidonHudRenderer — HUD 覆盖层
  8. PoseidonConfigScreen — YACL 配置 UI
  9. MouseClickMixin — 右键守卫
  10. PoseidonLogger — 日志记录
  11. PoseidonMod — 入口点和事件绑定
  12. 聊天触发器系统
  13. 海怪追踪系统
  14. 鱼钩卡住检测
  15. AlarmSound 数据类
  16. 配置架构和迁移历史
  17. 按键绑定和命令
  18. HUD 参考
  19. 配置参考(所有设置)
  20. 时间参考
  21. 设计决策和说明

1. 目的和范围

波塞冬是一款为 Hypixel Skyblock 设计的客户端钓鱼自动化模组。它自动化了完整的钓鱼循环:

  1. 抛竿(手动或自动抛竿)
  2. 等待服务器的“收线”信号(浮标附近的 !!! 实体)
  3. 以类人随机延迟做出反应并收线
  4. 可选择在可配置延迟后再次抛竿
  5. 可选择追踪每次捕获后生成的海怪
  6. 在配置的聊天模式上触发音效提示和标题覆盖层

波塞冬依赖 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)
  • hookStuckSound
  • slugfishMode — 抑制收线直到计时器结束(默认 false)
  • slugPet — 将鼻涕虫鱼计时器减半(默认 false)

反应 / 抛竿

  • reactionDelayMinMs / reactionDelayMaxMs
  • autoRecast(默认 true)
  • recastDelayMinMs / recastDelayMaxMs
  • recastDecisionTicks(默认 10)

鱼饵监控

  • baitHudVisible(默认 true)
  • baitLowThreshold(默认 5)
  • baitLowAlertSound
  • baitSwitchAlertSound

海怪追踪

  • trackSeaCreatures(默认 true)
  • creatureScanRadius(默认 12.0)
  • SEA_CREATURE_CAP = 10(静态常量,Hypixel 标准化)
  • seaCreatureCapSound
  • despawnWarningEnabled(默认 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

初始化

  1. 记录日志“Poseidon initialising…”
  2. FishingConfig.getInstance().load()
  3. registerKeybinds() — Y,H,未绑定的配置键
  4. registerCommands() — /poseidon + ALLOW_COMMAND 回退
  5. HudRenderCallback.EVENT.register(PoseidonHudRenderer::render)
  6. PlayerAPIEvents.TICK.register(this::onTick)
  7. PlayerAPIEvents.CHAT_RECEIVED.register(this::onChatReceived)
  8. PlayerAPIEvents.WORLD_JOIN.register(this::onWorldJoin) — 触发更新检查
  9. 记录日志“Poseidon ready.”

onChatReceived(String sender, String message)

  1. RebootAlertManager.getInstance().onChatReceived(sender, message) — 始终运行
  2. if (!FishingManager.getInstance().isInCatchWindow()) return — 时间门控
  3. if (!isCatchMessage(message)) return — 颜色门控(§a,§e,⛃)
  4. 遍历触发级别;第一个匹配:播放音效,显示标题(通过 parseLegacyText()),调用 notifyTriggerFired()

showTitle / parseLegacyText

showTitle() 使用由 parseLegacyText() 构建的 MutableText 直接调用 mc.inGameHud.setTitle() / setSubtitle() / setTitleTicks()。& 和 § 都被接受为格式代码前缀。颜色代码会重置粗体/斜体等,以匹配原版行为;§r/&r 重置所有样式。


12. 聊天触发器系统

门控(两者都通过后才检查模式)

  1. 时间门控: isInCatchWindow() — 在收线 tapKey 触发后的 200 刻(10 秒)内为真。
  2. 颜色门控: 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)刻运行一次:

  1. 消失警告: 检查海怪存在时间与 despawnWarningTicks 的对比;每个海怪仅触发一次音效。
  2. 移除已死: removeIf(t -&gt; mc.world.getEntityById(t.entityId) == null)。位置(lastX/lastZ)在实体存活期间保持最新,用于去重检查。
  3. 上限重置: 如果移除后追踪数量低于 SEA_CREATURE_CAP,清除 capAlertFired。

上限

SEA_CREATURE_CAP = 10 — 单个静态常量。按区域的上限映射已在 1.1.0 中移除。


14. 鱼钩卡住检测

在 1 秒稳定期(BOBBER_SETTLE_TICKS = 20)之后,每个 WAITING 刻:

  1. 计算 dist = sqrt((bobber.X - initialX)² + (bobber.Z - initialZ)²)
  2. 如果 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 ≤