| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- <?php
- namespace App\Module\Game\Dtos;
- use App\Module\Pet\Dtos\PetDataDto;
- use App\Module\Pet\Dtos\PetLifeSkillDto;
- /**
- * 宠物状态临时数据DTO
- *
- * 用于存储和传输宠物的完整数据
- * 继承自PetDataDto,包含宠物的完整数据
- * 适用于PetCreatedEvent和PetUpdateEvent事件的数据存储
- */
- class PetStatusTempDto extends PetDataDto
- {
- /**
- * 更新时间戳
- *
- * @var int
- */
- public int $updatedAt = 0;
- /**
- * 从缓存中恢复对象数组
- *
- * 重写父类方法以正确处理嵌套的PetLifeSkillDto对象数组
- *
- * @param mixed $cachedData 缓存的数据
- * @return array DTO对象数组
- */
- public static function fromCache($cachedData): array
- {
- if (is_null($cachedData)) {
- return [];
- }
- if (!is_array($cachedData)) {
- return [];
- }
- $result = [];
- foreach ($cachedData as $key => $item) {
- if ($item instanceof static) {
- // 如果已经是正确的对象类型,检查并修复lifeSkills
- self::fixLifeSkills($item);
- $result[$key] = $item;
- } elseif (is_array($item)) {
- // 从数组创建DTO对象
- $dto = new static();
- // 复制基本属性
- $dto->id = $item['id'] ?? 0;
- $dto->typeId = $item['type_id'] ?? $item['typeId'] ?? 0;
- $dto->name = $item['name'] ?? '';
- $dto->level = $item['level'] ?? 1;
- $dto->exp = $item['exp'] ?? 0;
- $dto->power = $item['power'] ?? 0;
- $dto->maxpower = $item['maxpower'] ?? 100;
- $dto->score = $item['score'] ?? 0;
- $dto->fightingCapacity = $item['fighting_capacity'] ?? $item['fightingCapacity'] ?? 0;
- $dto->grade = $item['grade'] ?? 0;
- $dto->status = $item['status'] ?? 1;
- $dto->updatedAt = $item['updated_at'] ?? $item['updatedAt'] ?? time();
- // 特殊处理lifeSkills数组,确保其中的元素是PetLifeSkillDto对象
- $lifeSkills = [];
- $skillsData = $item['life_skills'] ?? $item['lifeSkills'] ?? [];
- if (is_array($skillsData)) {
- foreach ($skillsData as $skillData) {
- if ($skillData instanceof PetLifeSkillDto) {
- $lifeSkills[] = $skillData;
- } elseif (is_array($skillData)) {
- $skillDto = new PetLifeSkillDto();
- $skillDto->skillId = $skillData['skill_id'] ?? $skillData['skillId'] ?? 0;
- $skillDto->canuse = $skillData['canuse'] ?? false;
- $skillDto->curnum = $skillData['curnum'] ?? 0;
- $skillDto->maxnum = $skillData['maxnum'] ?? 0;
- $lifeSkills[] = $skillDto;
- }
- }
- }
- $dto->lifeSkills = $lifeSkills;
- $result[$key] = $dto;
- }
- }
- return $result;
- }
- /**
- * 修复lifeSkills数组,确保其中的元素是PetLifeSkillDto对象
- *
- * @param PetStatusTempDto $dto
- * @return void
- */
- private static function fixLifeSkills(PetStatusTempDto $dto): void
- {
- if (!isset($dto->lifeSkills) || !is_array($dto->lifeSkills)) {
- $dto->lifeSkills = [];
- return;
- }
- $fixedSkills = [];
- foreach ($dto->lifeSkills as $skill) {
- if ($skill instanceof PetLifeSkillDto) {
- $fixedSkills[] = $skill;
- } elseif (is_array($skill)) {
- $skillDto = new PetLifeSkillDto();
- $skillDto->skillId = $skill['skill_id'] ?? $skill['skillId'] ?? 0;
- $skillDto->canuse = $skill['canuse'] ?? false;
- $skillDto->curnum = $skill['curnum'] ?? 0;
- $skillDto->maxnum = $skill['maxnum'] ?? 0;
- $fixedSkills[] = $skillDto;
- }
- }
- $dto->lifeSkills = $fixedSkills;
- }
- }
|