package gameserver import ( "gac-hkrpg-go/internal/common" goproto "gac-hkrpg-go/protocol/proto" "sort" ) func init() { handle("GetAvatarData", func(s *Session, req *goproto.GetAvatarDataCsReq, rsp *goproto.GetAvatarDataScRsp) error { player := s.JSON() if player == nil { Log("data is not set!") return nil } rsp.IsGetAll = req.IsGetAll for _, id := range BaseAvatarIDs { if av, ok := player.Avatars[id]; ok { rsp.AvatarList = append(rsp.AvatarList, av.ToAvatarProto(player.FindLightconeFor(id), player.MainCharacter.ID(), player.MarchType.ID())) } else { // avatar without save data: report a level-80 default rsp.AvatarList = append(rsp.AvatarList, &goproto.Avatar{ BaseAvatarId: id, Level: 80, Promotion: 6, FirstMetTimestamp: 1712924677, HasTakenPromotionRewardList: []uint32{1, 3, 5}, }) } } for _, av := range player.Avatars { rsp.AvatarPathDataInfoList = append(rsp.AvatarPathDataInfoList, av.ToAvatarPathDataProto(player.FindLightconeFor(av.AvatarID), player.FindRelicsFor(av.AvatarID), player.DressedSkins[av.AvatarID])) } // unlocked skins: res.json skinIds + currently dressed ones seen := map[uint32]bool{} for _, id := range player.DressedSkins { if id != 0 && !seen[id] { seen[id] = true rsp.SkinList = append(rsp.SkinList, id) } } if res, err := common.GameRes(); err == nil { for _, id := range res.SkinIDs { if id != 0 && !seen[id] { seen[id] = true rsp.SkinList = append(rsp.SkinList, id) } } } for _, id := range []uint32{1130301, 1100101, 1131001, 1141501, 1140701, 1150101, 1150501, 1140901} { if !seen[id] { seen[id] = true rsp.SkinList = append(rsp.SkinList, id) } } sort.Slice(rsp.SkinList, func(i, j int) bool { return rsp.SkinList[i] < rsp.SkinList[j] }) return nil }) handle("DressAvatarSkin", func(s *Session, req *goproto.DressAvatarSkinCsReq, rsp *goproto.DressAvatarSkinScRsp) error { player := s.JSON() if player == nil { return nil } player.DressedSkins[req.AvatarId] = req.AvatarSkinId player.SavePersistent() return nil }) handle("TakeOffAvatarSkin", func(s *Session, req *goproto.TakeOffAvatarSkinCsReq, rsp *goproto.TakeOffAvatarSkinScRsp) error { player := s.JSON() if player == nil { return nil } delete(player.DressedSkins, req.AvatarId) player.SavePersistent() return nil }) handle("SetPlayerOutfit", func(s *Session, req *goproto.SetPlayerOutfitCsReq, rsp *goproto.SetPlayerOutfitScRsp) error { return nil // retcode defaults to 0 }) handle("TakePromotionReward", func(s *Session, req *goproto.TakePromotionRewardCsReq, rsp *goproto.TakePromotionRewardScRsp) error { return nil }) handle("SetAvatarEnhancedId", func(s *Session, req *goproto.SetAvatarEnhancedIdCsReq, rsp *goproto.SetAvatarEnhancedIdScRsp) error { return nil }) }