import { Component, _decorator, sp } from "cc"; import { COMMON_FACE_ANIM, DRESS_PART, IDressInfo, PET_ANIM_NAME, PET_BODY_FACE_ANIM_MAP, PetInfo } from "./Types"; import { autoBind } from "@max-studio/core/ui/UIDecorator"; import { BasePart } from "./BasePart"; import { GlarePart } from "./GlarePart"; const { ccclass } = _decorator; @ccclass("BasePet") export class BasePet extends Component { private petInfo: PetInfo; @autoBind("RootNode/PetAni", sp.Skeleton) private petBodySkeleton: sp.Skeleton = null; @autoBind("RootNode/PetAni/face", sp.Skeleton) private petFace: sp.Skeleton = null; private parts: Map = new Map(); protected onLoad(): void { this.parts.set(DRESS_PART.GLARE, new GlarePart(this.petBodySkeleton, DRESS_PART.GLARE)); this.parts.set(DRESS_PART.BAG, new BasePart(this.petBodySkeleton, DRESS_PART.BAG)); this.parts.set(DRESS_PART.GLASSES, new BasePart(this.petBodySkeleton, DRESS_PART.GLASSES)); this.parts.set(DRESS_PART.HAT, new BasePart(this.petBodySkeleton, DRESS_PART.HAT)); this.parts.set(DRESS_PART.ACCESS, new BasePart(this.petBodySkeleton, DRESS_PART.ACCESS)); } public setInfo(info: PetInfo) { this.petInfo = info; } public getInfo(): PetInfo { return this.petInfo; } public async putOn(info: IDressInfo) { const { type, sourceLocationType, sourceName } = info; if (type == DRESS_PART.SUIT) { if (info.dressMap) { info.dressMap.forEach(async (dressInfo) => { await this.parts.get(dressInfo.type)?.putOn(dressInfo); }); } return; } await this.parts.get(type)?.putOn(info); } public takeOff(type: DRESS_PART = DRESS_PART.ALL) { if (type == DRESS_PART.ALL) { this.parts.forEach((part) => { part.takeOff(); }); } else { this.parts.get(type)?.takeOff(); } } public playAnim(anim: PET_ANIM_NAME) { this.petBodySkeleton.setAnimation(0, anim, true); const faceAnim = PET_BODY_FACE_ANIM_MAP[anim] ?? PET_ANIM_NAME.IDLE; this.petFace.setAnimation(0, faceAnim, true); this.setFaceSkinFromAnim(faceAnim); } protected setFaceSkinFromAnim(faceAnim: PET_ANIM_NAME) { let faceSkin: string = faceAnim; if (!COMMON_FACE_ANIM.includes(faceAnim)) { faceSkin = `eye/${this.petInfo.name}`; } this.petFace.setSkin(faceSkin); this.petFace._skeleton?.slots.forEach((slot) => { const slotName = slot.data.name.toLowerCase(); if (slotName.endsWith("_hui")) { slot.color.a = slotName == `${this.petInfo.name}_hui`.toLowerCase() ? 1 : 0; } if (slotName.startsWith("dk")) { console.log("slotName:", slotName); } }); } }