Explorar o código

添加AppGameProtobufResponseListener调试信息:诊断lifeSkills数据类型问题

notfff hai 7 meses
pai
achega
1a4802279b

+ 42 - 6
app/Module/AppGame/Listeners/AppGameProtobufResponseListener.php

@@ -98,13 +98,49 @@ class AppGameProtobufResponseListener
             $p->setScore($pet->score);
             $p->setGrade($pet->grade);
             $lifeSkills=[];
-//            dd($pet);
-            foreach ($pet->lifeSkills as $lifeSkill){
+
+            // 添加调试信息
+            Log::debug('处理宠物生活技能数据', [
+                'user_id' => $user_id,
+                'pet_id' => $pet->id,
+                'pet_class' => get_class($pet),
+                'life_skills_type' => gettype($pet->lifeSkills),
+                'life_skills_count' => count($pet->lifeSkills)
+            ]);
+
+            foreach ($pet->lifeSkills as $index => $lifeSkill){
+                // 添加调试信息
+                Log::debug('处理单个生活技能', [
+                    'user_id' => $user_id,
+                    'pet_id' => $pet->id,
+                    'skill_index' => $index,
+                    'skill_type' => gettype($lifeSkill),
+                    'skill_class' => is_object($lifeSkill) ? get_class($lifeSkill) : 'not_object'
+                ]);
+
                 $ls = new \Uraus\Kku\Common\PetLifeSkill();
-                $ls->setSkillId($lifeSkill->skillId);
-                $ls->setCanuse($lifeSkill->canuse);
-                $ls->setCurnum($lifeSkill->curnum);
-                $ls->setMaxnum($lifeSkill->maxnum);
+
+                // 安全地访问属性
+                if (is_object($lifeSkill)) {
+                    $ls->setSkillId($lifeSkill->skillId);
+                    $ls->setCanuse($lifeSkill->canuse);
+                    $ls->setCurnum($lifeSkill->curnum);
+                    $ls->setMaxnum($lifeSkill->maxnum);
+                } elseif (is_array($lifeSkill)) {
+                    // 如果是数组,使用数组访问方式
+                    $ls->setSkillId($lifeSkill['skill_id'] ?? 0);
+                    $ls->setCanuse($lifeSkill['canuse'] ?? false);
+                    $ls->setCurnum($lifeSkill['curnum'] ?? 0);
+                    $ls->setMaxnum($lifeSkill['maxnum'] ?? 0);
+
+                    Log::warning('生活技能数据是数组而不是对象', [
+                        'user_id' => $user_id,
+                        'pet_id' => $pet->id,
+                        'skill_index' => $index,
+                        'skill_data' => $lifeSkill
+                    ]);
+                }
+
                 $lifeSkills[] = $ls;
             }
             $p->setLifeSkills($lifeSkills);

+ 0 - 100
test_pet_skill_fix.php

@@ -1,100 +0,0 @@
-<?php
-
-require_once 'vendor/autoload.php';
-
-use App\Module\Pet\Dtos\PetLifeSkillDto;
-use App\Module\Game\Dtos\PetStatusTempDto;
-
-echo "开始测试宠物技能修复...\n";
-
-// 测试1: 创建PetLifeSkillDto对象
-echo "\n=== 测试1: 创建PetLifeSkillDto对象 ===\n";
-$lifeSkill1 = new PetLifeSkillDto();
-$lifeSkill1->skillId = 1;
-$lifeSkill1->canuse = true;
-$lifeSkill1->curnum = 0;
-$lifeSkill1->maxnum = 300;
-
-$lifeSkill2 = new PetLifeSkillDto();
-$lifeSkill2->skillId = 2;
-$lifeSkill2->canuse = false;
-$lifeSkill2->curnum = 150;
-$lifeSkill2->maxnum = 300;
-
-echo "创建了2个PetLifeSkillDto对象\n";
-echo "技能1: skillId={$lifeSkill1->skillId}, canuse=" . ($lifeSkill1->canuse ? 'true' : 'false') . "\n";
-echo "技能2: skillId={$lifeSkill2->skillId}, canuse=" . ($lifeSkill2->canuse ? 'true' : 'false') . "\n";
-
-// 测试2: 创建PetStatusTempDto对象并设置lifeSkills
-echo "\n=== 测试2: 创建PetStatusTempDto对象 ===\n";
-$petTempDto = new PetStatusTempDto();
-$petTempDto->id = 1;
-$petTempDto->name = '测试宠物';
-$petTempDto->lifeSkills = [$lifeSkill1, $lifeSkill2];
-
-echo "创建了PetStatusTempDto对象\n";
-echo "宠物ID: {$petTempDto->id}\n";
-echo "宠物名称: {$petTempDto->name}\n";
-echo "生活技能数量: " . count($petTempDto->lifeSkills) . "\n";
-
-foreach ($petTempDto->lifeSkills as $index => $skill) {
-    echo "技能{$index}: " . get_class($skill) . ", skillId={$skill->skillId}\n";
-}
-
-// 测试3: 模拟缓存数据并使用fromCache恢复
-echo "\n=== 测试3: 测试fromCache方法 ===\n";
-$cachedData = [
-    1 => [
-        'id' => 1,
-        'name' => '测试宠物',
-        'life_skills' => [
-            [
-                'skill_id' => 1,
-                'canuse' => true,
-                'curnum' => 0,
-                'maxnum' => 300
-            ],
-            [
-                'skill_id' => 2,
-                'canuse' => false,
-                'curnum' => 150,
-                'maxnum' => 300
-            ]
-        ]
-    ]
-];
-
-echo "模拟缓存数据:\n";
-print_r($cachedData);
-
-$result = PetStatusTempDto::fromCache($cachedData);
-
-echo "\n使用fromCache恢复数据:\n";
-echo "恢复的数据数量: " . count($result) . "\n";
-
-if (isset($result[1])) {
-    $recoveredPet = $result[1];
-    echo "恢复的宠物类型: " . get_class($recoveredPet) . "\n";
-    echo "恢复的宠物ID: {$recoveredPet->id}\n";
-    echo "恢复的宠物名称: {$recoveredPet->name}\n";
-    echo "恢复的生活技能数量: " . count($recoveredPet->lifeSkills) . "\n";
-    
-    foreach ($recoveredPet->lifeSkills as $index => $skill) {
-        echo "恢复的技能{$index}: " . get_class($skill) . ", skillId={$skill->skillId}, canuse=" . ($skill->canuse ? 'true' : 'false') . "\n";
-    }
-    
-    // 测试4: 验证访问skillId属性不会出错
-    echo "\n=== 测试4: 验证访问skillId属性 ===\n";
-    try {
-        foreach ($recoveredPet->lifeSkills as $skill) {
-            echo "访问技能skillId: {$skill->skillId} - 成功\n";
-        }
-        echo "所有技能的skillId属性访问成功!\n";
-    } catch (Exception $e) {
-        echo "错误: " . $e->getMessage() . "\n";
-    }
-} else {
-    echo "错误: 无法恢复宠物数据\n";
-}
-
-echo "\n测试完成!\n";