|
|
@@ -0,0 +1,138 @@
|
|
|
+# 修复宠物生活技能激活状态显示问题
|
|
|
+
|
|
|
+**时间**: 2025年06月06日 19:08
|
|
|
+**任务**: 修复请求 request_1749207804951 返回的pet.lifeSkills信息中技能有开启的,但是没有显示技能开启信息(curnum)的问题
|
|
|
+
|
|
|
+## 问题描述
|
|
|
+
|
|
|
+用户反馈请求 `request_1749207804951` 返回的 `pet.lifeSkills` 信息中,技能有开启的但是没有显示技能开启信息(curnum)。
|
|
|
+
|
|
|
+## 问题分析
|
|
|
+
|
|
|
+### 1. 初步调试
|
|
|
+
|
|
|
+使用调试命令重现问题:
|
|
|
+```bash
|
|
|
+php artisan debug:reproduce-error request_1749207804951
|
|
|
+```
|
|
|
+
|
|
|
+发现返回的 `lifeSkills` 数组中每个技能只有 `skillId` 字段,缺少了 `canuse`、`curnum`、`maxnum` 等字段。
|
|
|
+
|
|
|
+### 2. 代码分析
|
|
|
+
|
|
|
+检查相关代码发现两个问题:
|
|
|
+
|
|
|
+#### 问题1:Protobuf转换代码中属性名不匹配
|
|
|
+在 `app/Module/AppGame/Proto/PetDataDto.php` 中:
|
|
|
+- 第43行:`canuse` 字段被注释掉了
|
|
|
+- 第44行:使用了错误的属性名 `$skill->currentCooldown`,应该是 `$skill->curnum`
|
|
|
+- 第45行:使用了错误的属性名 `$skill->maxCooldown`,应该是 `$skill->maxnum`
|
|
|
+
|
|
|
+#### 问题2:对curnum和maxnum含义理解错误
|
|
|
+通过查看 `DataPetLifeSkill` 的定义发现:
|
|
|
+- `curnum` = 剩余时间(应该是技能激活的剩余时间,不是冷却时间)
|
|
|
+- `maxnum` = 技能最大时间(应该是技能的持续时间)
|
|
|
+
|
|
|
+### 3. 数据库验证
|
|
|
+
|
|
|
+查询数据库确认宠物ID为9确实有激活的技能:
|
|
|
+```sql
|
|
|
+SELECT * FROM kku_pet_active_skills WHERE pet_id = 9 AND status = 'active' AND end_time > NOW()
|
|
|
+```
|
|
|
+
|
|
|
+结果显示技能ID为1(自动除草)仍有剩余时间(9520秒)。
|
|
|
+
|
|
|
+## 修复方案
|
|
|
+
|
|
|
+### 1. 修复Protobuf转换代码
|
|
|
+
|
|
|
+修改 `app/Module/AppGame/Proto/PetDataDto.php`:
|
|
|
+```php
|
|
|
+// 修复前
|
|
|
+// $petLifeSkill->setCanuse($skill->canUse ?? false);// 不在同步了
|
|
|
+$petLifeSkill->setCurnum($skill->currentCooldown ?? 0);
|
|
|
+$petLifeSkill->setMaxnum($skill->maxCooldown ?? 0);
|
|
|
+
|
|
|
+// 修复后
|
|
|
+$petLifeSkill->setCanuse($skill->canuse ?? false);
|
|
|
+$petLifeSkill->setCurnum($skill->curnum ?? 0);
|
|
|
+$petLifeSkill->setMaxnum($skill->maxnum ?? 0);
|
|
|
+```
|
|
|
+
|
|
|
+### 2. 重构技能DTO创建逻辑
|
|
|
+
|
|
|
+修改 `app/Module/Pet/Factories/PetDtoFactory.php` 中的 `createPetLifeSkillDtos` 方法:
|
|
|
+
|
|
|
+1. **添加激活技能查询**:
|
|
|
+ ```php
|
|
|
+ $activeSkills = \App\Module\Pet\Models\PetActiveSkill::where('pet_id', $pet->id)
|
|
|
+ ->where('status', 'active')
|
|
|
+ ->where('end_time', '>', now())
|
|
|
+ ->get()
|
|
|
+ ->keyBy('skill_id');
|
|
|
+ ```
|
|
|
+
|
|
|
+2. **正确设置curnum和maxnum**:
|
|
|
+ - 如果技能有激活记录且未过期:
|
|
|
+ - `curnum` = 激活技能的剩余时间
|
|
|
+ - `maxnum` = 技能的持续时间
|
|
|
+ - 如果没有激活记录或已过期:
|
|
|
+ - `curnum` = 0
|
|
|
+ - `maxnum` = 0
|
|
|
+
|
|
|
+3. **保留冷却时间检查**:
|
|
|
+ - 冷却时间影响 `canuse` 字段,不影响 `curnum`/`maxnum`
|
|
|
+
|
|
|
+## 修复结果
|
|
|
+
|
|
|
+修复后再次运行调试命令,结果显示:
|
|
|
+
|
|
|
+```json
|
|
|
+"lifeSkills": [
|
|
|
+ {
|
|
|
+ "skillId": 1,
|
|
|
+ "canuse": true,
|
|
|
+ "curnum": "9470",
|
|
|
+ "maxnum": "72000"
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "skillId": 2,
|
|
|
+ "canuse": true
|
|
|
+ },
|
|
|
+ // ... 其他技能
|
|
|
+]
|
|
|
+```
|
|
|
+
|
|
|
+- **技能ID为1(自动除草)**:正确显示了激活状态信息
|
|
|
+ - `curnum`: "9470" (剩余激活时间:9470秒)
|
|
|
+ - `maxnum`: "72000" (总持续时间:72000秒)
|
|
|
+- **其他技能**:没有激活,所以不显示curnum和maxnum(值为0时protobuf会省略)
|
|
|
+
|
|
|
+## 技术要点
|
|
|
+
|
|
|
+1. **Protobuf序列化特性**:当字段值为默认值(如0、false、空字符串)时,protobuf会在序列化时省略这些字段
|
|
|
+2. **技能状态区分**:
|
|
|
+ - 激活状态:技能正在生效,有剩余时间
|
|
|
+ - 冷却状态:技能使用后的冷却期,影响是否可以再次使用
|
|
|
+ - 可用状态:综合考虑冷却时间、体力等因素
|
|
|
+
|
|
|
+## 文件修改清单
|
|
|
+
|
|
|
+1. `app/Module/AppGame/Proto/PetDataDto.php` - 修复属性名匹配问题
|
|
|
+2. `app/Module/Pet/Factories/PetDtoFactory.php` - 重构技能DTO创建逻辑
|
|
|
+
|
|
|
+## 验证方法
|
|
|
+
|
|
|
+```bash
|
|
|
+php artisan debug:reproduce-error request_1749207804951
|
|
|
+```
|
|
|
+
|
|
|
+## 提交信息
|
|
|
+
|
|
|
+```
|
|
|
+修复宠物生活技能激活状态显示问题:正确显示激活技能的剩余时间和持续时间
|
|
|
+```
|
|
|
+
|
|
|
+## 完成时间
|
|
|
+
|
|
|
+2025-06-06 19:08
|