This commit is contained in:
2025-10-17 20:56:50 +08:00
commit 90094ccd5a
342 changed files with 144988 additions and 0 deletions

View File

@@ -0,0 +1,184 @@
# 月度任务系统集成记录
## 📅 完成时间
2025-10-12 17:46
## ✅ 功能概述
成功将开源v2.1.1的月度任务系统集成到项目中,包括:
- 月度进度刷新钓鱼320次、竞技场240次目标
- 钓鱼补齐(优先普通鱼竿,贪心策略)
- 竞技场补齐(检查体力,贪心策略)
## 🔧 关键修复点
### 1. 命令注册问题
**问题**`activity_get` 命令发送后超时,服务器未响应
**原因**:命令未在 `xyzwWebSocket.js``registerDefaultCommands` 中注册
**解决**
```javascript
// src/utils/xyzwWebSocket.js
.register("activity_get", {})
.register("monthlyactivity_receivereward", {})
```
### 2. 响应映射缺失
**问题**:服务器返回 `activity_getresp`,但 Promise 等待 `activity_get`,导致超时
**原因**:响应命令名与请求命令名不匹配,缺少映射关系
**解决**:在 `responseToCommandMap` 中添加映射
```javascript
// 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可能还在初始化
**解决**:改用轮询检测机制
```javascript
// 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`
**解决**
```javascript
// 错误写法
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
**新增变量**
```javascript
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
添加日志控制:
```javascript
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. 待优化:一键完成所有(钓鱼+竞技场)
## 📝 备注
- 此功能已完全正常运行
- 所有命令响应映射已添加
- 适用于后续类似功能的快速集成