5.9 KiB
5.9 KiB
月度任务系统集成记录
📅 完成时间
2025-10-12 17:46
✅ 功能概述
成功将开源v2.1.1的月度任务系统集成到项目中,包括:
- 月度进度刷新(钓鱼320次、竞技场240次目标)
- 钓鱼补齐(优先普通鱼竿,贪心策略)
- 竞技场补齐(检查体力,贪心策略)
🔧 关键修复点
1. 命令注册问题
问题:activity_get 命令发送后超时,服务器未响应
原因:命令未在 xyzwWebSocket.js 的 registerDefaultCommands 中注册
解决:
// src/utils/xyzwWebSocket.js
.register("activity_get", {})
.register("monthlyactivity_receivereward", {})
2. 响应映射缺失
问题:服务器返回 activity_getresp,但 Promise 等待 activity_get,导致超时
原因:响应命令名与请求命令名不匹配,缺少映射关系
解决:在 responseToCommandMap 中添加映射
// src/utils/xyzwWebSocket.js
const responseToCommandMap = {
'activity_getresp': 'activity_get', // 月度活动
'monthlyactivity_receiverewardresp': 'monthlyactivity_receivereward',
'fishing_fishresp': 'fishing_fish', // 钓鱼
'arena_matchopponentresp': 'arena_matchopponent', // 竞技场匹配
'arena_battleresp': 'arena_battle', // 竞技场战斗
// ... 其他映射
}
3. WebSocket连接时序问题
问题:页面加载时自动刷新失败,但手动点击成功 原因:延迟1秒不够,WebSocket可能还在初始化 解决:改用轮询检测机制
// src/components/GameStatus.vue
let monthTaskFetched = false
const checkAndFetchMonthly = () => {
const status = tokenStore.getWebSocketStatus(tokenId)
if (status === 'connected' && !monthTaskFetched) {
monthTaskFetched = true
setTimeout(() => fetchMonthlyActivity(), 1000)
}
}
// 立即检查 + 每秒轮询,最多5次
checkAndFetchMonthly()
const checkInterval = setInterval(() => {
if (checkCount++ >= 5) {
clearInterval(checkInterval)
} else if (status === 'connected' && !monthTaskFetched) {
clearInterval(checkInterval)
checkAndFetchMonthly()
}
}, 1000)
4. 访问Store属性错误
问题:Cannot read properties of undefined (reading 'token_xxx')
原因:错误使用 tokenStore.connections 而非 tokenStore.wsConnections
解决:
// 错误写法
const ws = tokenStore.connections[tokenId]?.ws
// 正确写法
const connection = tokenStore.wsConnections[tokenId]
📁 修改的文件清单
1. src/utils/gameCommands.js
添加月度任务相关命令:
activity_get()- 获取月度活动信息fishing_fish(rodType)- 钓鱼(普通/金鱼竿)arena_matchopponent()- 竞技场匹配对手arena_battle(targetRoleId)- 竞技场战斗monthlyactivity_receivereward()- 领取月度奖励
2. src/utils/xyzwWebSocket.js
- 注册命令:
activity_get,monthlyactivity_receivereward - 添加响应映射:5个月度任务相关的响应映射
3. src/components/GameStatus.vue
新增变量:
const FISH_TARGET = 320 // 钓鱼目标
const ARENA_TARGET = 240 // 竞技场目标
const monthLoading = ref(false)
const monthActivity = ref(null)
const fishToppingUp = ref(false)
const arenaToppingUp = ref(false)
核心函数:
fetchMonthlyActivity()- 获取月度进度topUpFish()- 钓鱼补齐(优先普通鱼竿)topUpArena()- 竞技场补齐(检查体力,贪心策略)getItemCount()- 解析物品数量(支持多种数据格式)
UI组件:月度任务卡片,显示进度条、补齐按钮、一键完成选项
4. src/stores/batchTaskStore.js
添加日志控制:
logConfig: {
// ... 其他配置
monthlyTask: false, // 月度任务日志开关
}
5. src/components/BatchTaskPanel.vue
添加月度任务日志开关UI
🧪 测试验证
测试用例
✅ 刷新进度:成功显示 钓鱼 282/320 (88%)、竞技场 46/240 (19%) ✅ 页面加载自动刷新:成功 ✅ 手动刷新:成功 ✅ 钓鱼补齐:正常 ✅ 竞技场补齐:正常
日志验证
📤 发送消息: activity_get {}
🔍 [Blob响应] cmd: activity_getresp ack: 7 seq: 7
📥 [月度任务] sendMessageWithPromise 返回成功
✅ [月度任务] 解析成功: {钓鱼次数: 282, 竞技场次数: 46, ...}
📚 核心算法
钓鱼补齐策略
- 优先使用普通鱼竿(free)
- 如果普通鱼竿不足,使用金鱼竿(diamond)
- 每次钓鱼后等待200ms
竞技场补齐策略
- 检查体力是否充足(每次5点)
- 匹配对手 → 战斗 → 延迟
- 贪心策略:尽可能多地完成战斗
🎯 与开源代码的差异
相同点
- 功能逻辑完全一致
- 目标值相同(钓鱼320、竞技场240)
- 补齐策略相同
差异点
- 日志系统:使用自有的
batchTaskStore.logConfig控制,而非开源的logger.js - 命令参数:我们用
{},开源用'[BON]'(实际都正常工作) - UI集成:集成在
GameStatus.vue中,开源可能是独立组件
💡 经验总结
- 命令注册优先级最高:未注册的命令会被忽略
- 响应映射很关键:响应命令名可能与请求不同,需要建立映射
- 时序问题要注意:页面初始化需要合理的等待和轮询机制
- 调试日志是救星:关键位置的日志能快速定位问题
- Store属性名要准确:
wsConnectionsvsconnections的小错误会导致大问题
🔜 后续优化空间
- ✅ 已完成:自动刷新优化
- 待优化:钓鱼/竞技场补齐进度实时显示
- 待优化:补齐完成后自动刷新进度
- 待优化:失败重试机制
- 待优化:一键完成所有(钓鱼+竞技场)
📝 备注
- 此功能已完全正常运行
- 所有命令响应映射已添加
- 适用于后续类似功能的快速集成