Files
xyzw_web_helper/MD说明文件夹/月度任务系统集成记录.md
2025-10-17 20:56:50 +08:00

5.9 KiB
Raw Permalink Blame History

月度任务系统集成记录

📅 完成时间

2025-10-12 17:46

功能概述

成功将开源v2.1.1的月度任务系统集成到项目中,包括:

  • 月度进度刷新钓鱼320次、竞技场240次目标
  • 钓鱼补齐(优先普通鱼竿,贪心策略)
  • 竞技场补齐(检查体力,贪心策略)

🔧 关键修复点

1. 命令注册问题

问题activity_get 命令发送后超时,服务器未响应 原因:命令未在 xyzwWebSocket.jsregisterDefaultCommands 中注册 解决

// 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, ...}

📚 核心算法

钓鱼补齐策略

  1. 优先使用普通鱼竿free
  2. 如果普通鱼竿不足使用金鱼竿diamond
  3. 每次钓鱼后等待200ms

竞技场补齐策略

  1. 检查体力是否充足每次5点
  2. 匹配对手 → 战斗 → 延迟
  3. 贪心策略:尽可能多地完成战斗

🎯 与开源代码的差异

相同点

  • 功能逻辑完全一致
  • 目标值相同钓鱼320、竞技场240
  • 补齐策略相同

差异点

  1. 日志系统:使用自有的 batchTaskStore.logConfig 控制,而非开源的 logger.js
  2. 命令参数:我们用 {},开源用 '[BON]'(实际都正常工作)
  3. UI集成:集成在 GameStatus.vue 中,开源可能是独立组件

💡 经验总结

  1. 命令注册优先级最高:未注册的命令会被忽略
  2. 响应映射很关键:响应命令名可能与请求不同,需要建立映射
  3. 时序问题要注意:页面初始化需要合理的等待和轮询机制
  4. 调试日志是救星:关键位置的日志能快速定位问题
  5. Store属性名要准确wsConnections vs connections 的小错误会导致大问题

🔜 后续优化空间

  1. 已完成:自动刷新优化
  2. 待优化:钓鱼/竞技场补齐进度实时显示
  3. 待优化:补齐完成后自动刷新进度
  4. 待优化:失败重试机制
  5. 待优化:一键完成所有(钓鱼+竞技场)

📝 备注

  • 此功能已完全正常运行
  • 所有命令响应映射已添加
  • 适用于后续类似功能的快速集成