diff --git a/gs/game/command_manager.go b/gs/game/command_manager.go index 16f4b39d..3bc1ea47 100644 --- a/gs/game/command_manager.go +++ b/gs/game/command_manager.go @@ -46,12 +46,11 @@ type CommandManager struct { func NewCommandManager() *CommandManager { r := new(CommandManager) - // 创建一个公共的开放世界的AI + // 创建AI世界 GAME_MANAGER.OnRegOk(false, &proto.SetPlayerBornDataReq{AvatarId: 10000007, NickName: "System"}, 1, 0) r.system = USER_MANAGER.GetOnlineUser(1) - // 开放大世界 - r.system.SceneLoadState = model.SceneEnterDone r.system.DbState = model.DbNormal + r.system.SceneLoadState = model.SceneEnterDone WORLD_MANAGER.InitBigWorld(r.system) // 初始化 diff --git a/gs/game/game_manager.go b/gs/game/game_manager.go index b4392268..2e1c8135 100644 --- a/gs/game/game_manager.go +++ b/gs/game/game_manager.go @@ -11,6 +11,7 @@ import ( "hk4e/pkg/reflection" "hk4e/protocol/cmd" "hk4e/protocol/proto" + "time" ) var GAME_MANAGER *GameManager = nil @@ -69,8 +70,10 @@ func (g *GameManager) Start() { func (g *GameManager) Stop() { // 保存玩家数据 - USER_MANAGER.SaveUser() - + LOCAL_EVENT_MANAGER.localEventChan <- &LocalEvent{ + EventId: RunUserCopyAndSave, + } + time.Sleep(time.Second * 5) //g.worldManager.worldStatic.SaveTerrain() } @@ -115,6 +118,18 @@ func (g *GameManager) CommonRetError(cmdId uint16, player *model.Player, rsp pb. g.SendMsg(cmdId, player.PlayerID, player.ClientSeq, rsp) } +// CommonRetSucc 通用返回成功 +func (g *GameManager) CommonRetSucc(cmdId uint16, player *model.Player, rsp pb.Message) { + if rsp == nil { + return + } + ok := reflection.SetStructFieldValue(rsp, "Retcode", int32(proto.Retcode_RET_SUCC)) + if !ok { + return + } + g.SendMsg(cmdId, player.PlayerID, player.ClientSeq, rsp) +} + func (g *GameManager) ReconnectPlayer(userId uint32) { g.SendMsg(cmd.ClientReconnectNotify, userId, 0, new(proto.ClientReconnectNotify)) } diff --git a/gs/game/local_event_manager.go b/gs/game/local_event_manager.go index c6695335..7c40a256 100644 --- a/gs/game/local_event_manager.go +++ b/gs/game/local_event_manager.go @@ -1,10 +1,17 @@ package game +import ( + "hk4e/gs/model" + "hk4e/pkg/logger" + "time" +) + // 本地事件队列管理器 const ( LoadLoginUserFromDbFinish = iota CheckUserExistOnRegFromDbFinish + RunUserCopyAndSave ) type LocalEvent struct { @@ -26,9 +33,47 @@ func (l *LocalEventManager) LocalEventHandle(localEvent *LocalEvent) { switch localEvent.EventId { case LoadLoginUserFromDbFinish: playerLoginInfo := localEvent.Msg.(*PlayerLoginInfo) + USER_MANAGER.playerMap[playerLoginInfo.Player.PlayerID] = playerLoginInfo.Player GAME_MANAGER.OnLoginOk(playerLoginInfo.UserId, playerLoginInfo.Player, playerLoginInfo.ClientSeq) case CheckUserExistOnRegFromDbFinish: playerRegInfo := localEvent.Msg.(*PlayerRegInfo) GAME_MANAGER.OnRegOk(playerRegInfo.Exist, playerRegInfo.Req, playerRegInfo.UserId, playerRegInfo.ClientSeq) + case RunUserCopyAndSave: + startTime := time.Now().UnixNano() + // 拷贝一份数据避免并发访问 + insertPlayerList := make([]model.Player, 0, len(USER_MANAGER.playerMap)) + updatePlayerList := make([]model.Player, 0, len(USER_MANAGER.playerMap)) + for uid, player := range USER_MANAGER.playerMap { + if uid < 100000000 { + continue + } + switch player.DbState { + case model.DbNone: + break + case model.DbInsert: + insertPlayerList = append(insertPlayerList, *player) + USER_MANAGER.playerMap[uid].DbState = model.DbNormal + case model.DbDelete: + updatePlayerList = append(updatePlayerList, *player) + delete(USER_MANAGER.playerMap, uid) + case model.DbNormal: + updatePlayerList = append(updatePlayerList, *player) + } + } + insertPlayerPointerList := make([]*model.Player, 0, len(insertPlayerList)) + updatePlayerPointerList := make([]*model.Player, 0, len(updatePlayerList)) + for _, player := range insertPlayerList { + insertPlayerPointerList = append(insertPlayerPointerList, &player) + } + for _, player := range updatePlayerList { + updatePlayerPointerList = append(updatePlayerPointerList, &player) + } + USER_MANAGER.saveUserChan <- &SaveUserData{ + insertPlayerList: insertPlayerPointerList, + updatePlayerList: updatePlayerPointerList, + } + endTime := time.Now().UnixNano() + costTime := endTime - startTime + logger.LOG.Info("run save user copy cost time: %v ns", costTime) } } diff --git a/gs/game/user_login.go b/gs/game/user_login.go index 17a6878a..0dd82c26 100644 --- a/gs/game/user_login.go +++ b/gs/game/user_login.go @@ -284,9 +284,10 @@ func (g *GameManager) CreatePlayer(userId uint32, nickName string, mainCharAvata player := new(model.Player) player.PlayerID = userId player.NickName = nickName - player.Signature = "惟愿时光记忆,一路繁花千树。" + player.Signature = "" player.MainCharAvatarId = mainCharAvatarId player.HeadImage = mainCharAvatarId + player.Birthday = [2]uint8{0, 0} player.NameCard = 210001 player.NameCardList = make([]uint32, 0) player.NameCardList = append(player.NameCardList, 210001, 210042) diff --git a/gs/game/user_manager.go b/gs/game/user_manager.go index e6d0b4da..3ad44d27 100644 --- a/gs/game/user_manager.go +++ b/gs/game/user_manager.go @@ -1,7 +1,6 @@ package game import ( - "sync" "time" "hk4e/gs/dao" @@ -10,16 +9,22 @@ import ( "hk4e/protocol/proto" ) +type SaveUserData struct { + insertPlayerList []*model.Player + updatePlayerList []*model.Player +} + type UserManager struct { - dao *dao.Dao - playerMap map[uint32]*model.Player - playerMapLock sync.RWMutex + dao *dao.Dao + playerMap map[uint32]*model.Player + saveUserChan chan *SaveUserData } func NewUserManager(dao *dao.Dao) (r *UserManager) { r = new(UserManager) r.dao = dao r.playerMap = make(map[uint32]*model.Player) + r.saveUserChan = make(chan *SaveUserData) return r } @@ -97,6 +102,7 @@ func (u *UserManager) LoadTempOfflineUserSync(userId uint32) *model.Player { if player == nil { return nil } + u.ChangeUserDbState(player, model.DbDelete) u.playerMap[player.PlayerID] = player return player } @@ -141,12 +147,11 @@ func (u *UserManager) OnlineUser(userId uint32, clientSeq uint32) (*model.Player } else { go func() { player = u.loadUserFromDb(userId) - if player != nil { - player.DbState = model.DbNormal - u.playerMapLock.Lock() - u.playerMap[player.PlayerID] = player - u.playerMapLock.Unlock() + if player == nil { + logger.LOG.Error("can not find user from db, uid: %v", userId) + return } + u.ChangeUserDbState(player, model.DbNormal) LOCAL_EVENT_MANAGER.localEventChan <- &LocalEvent{ EventId: LoadLoginUserFromDbFinish, Msg: &PlayerLoginInfo{ @@ -165,70 +170,64 @@ func (u *UserManager) ChangeUserDbState(player *model.Player, state int) { return } switch player.DbState { + case model.DbNone: + if state == model.DbInsert { + player.DbState = model.DbInsert + } else if state == model.DbDelete { + player.DbState = model.DbDelete + } else if state == model.DbNormal { + player.DbState = model.DbNormal + } else { + logger.LOG.Error("player db state change not allow, before: %v, after: %v", player.DbState, state) + } case model.DbInsert: + logger.LOG.Error("player db state change not allow, before: %v, after: %v", player.DbState, state) break case model.DbDelete: if state == model.DbNormal { player.DbState = model.DbNormal + } else { + logger.LOG.Error("player db state change not allow, before: %v, after: %v", player.DbState, state) } case model.DbNormal: if state == model.DbDelete { player.DbState = model.DbDelete + } else { + logger.LOG.Error("player db state change not allow, before: %v, after: %v", player.DbState, state) } } } -// 用户数据库定时同步协程 +// 用户数据库定时同步 func (u *UserManager) StartAutoSaveUser() { go func() { ticker := time.NewTicker(time.Minute * 5) for { - u.SaveUser() + LOCAL_EVENT_MANAGER.localEventChan <- &LocalEvent{ + EventId: RunUserCopyAndSave, + } <-ticker.C } }() + go func() { + for { + saveUserData := <-u.saveUserChan + u.SaveUser(saveUserData) + } + }() } -func (u *UserManager) SaveUser() { - playerMapSave := make(map[uint32]*model.Player, len(u.playerMap)) - u.playerMapLock.RLock() - for k, v := range u.playerMap { - playerMapSave[k] = v - } - u.playerMapLock.RUnlock() - insertList := make([]*model.Player, 0) - updateList := make([]*model.Player, 0) - for uid, player := range playerMapSave { - if uid < 100000000 { - continue - } - switch player.DbState { - case model.DbInsert: - insertList = append(insertList, player) - playerMapSave[uid].DbState = model.DbNormal - case model.DbDelete: - updateList = append(updateList, player) - delete(playerMapSave, uid) - case model.DbNormal: - updateList = append(updateList, player) - } - if !player.Online { - delete(playerMapSave, uid) - } - } - err := u.dao.InsertPlayerList(insertList) +func (u *UserManager) SaveUser(saveUserData *SaveUserData) { + err := u.dao.InsertPlayerList(saveUserData.insertPlayerList) if err != nil { logger.LOG.Error("insert player list error: %v", err) return } - err = u.dao.UpdatePlayerList(updateList) + err = u.dao.UpdatePlayerList(saveUserData.updatePlayerList) if err != nil { logger.LOG.Error("update player list error: %v", err) return } - u.playerMapLock.Lock() - u.playerMap = playerMapSave - u.playerMapLock.Unlock() - logger.LOG.Info("save user finish, insert user count: %v, update user count: %v", len(insertList), len(updateList)) + logger.LOG.Info("save user finish, insert user count: %v, update user count: %v", len(saveUserData.insertPlayerList), len(saveUserData.updatePlayerList)) } diff --git a/gs/game/user_map.go b/gs/game/user_map.go index bc5a9c7b..b605be37 100644 --- a/gs/game/user_map.go +++ b/gs/game/user_map.go @@ -20,10 +20,7 @@ func (g *GameManager) SceneTransToPointReq(player *model.Player, payloadMsg pb.M transPointId := strconv.Itoa(int(req.SceneId)) + "_" + strconv.Itoa(int(req.PointId)) transPointConfig, exist := gdc.CONF.ScenePointEntries[transPointId] if !exist { - sceneTransToPointRsp := &proto.SceneTransToPointRsp{ - Retcode: int32(proto.Retcode_RET_SVR_ERROR), - } - g.SendMsg(cmd.SceneTransToPointRsp, player.PlayerID, player.ClientSeq, sceneTransToPointRsp) + g.CommonRetError(cmd.SceneTransToPointRsp, player, &proto.SceneTransToPointRsp{}) return } diff --git a/gs/game/user_multiplayer.go b/gs/game/user_multiplayer.go index 77f66f69..cfbec168 100644 --- a/gs/game/user_multiplayer.go +++ b/gs/game/user_multiplayer.go @@ -52,21 +52,19 @@ func (g *GameManager) PlayerApplyEnterMpResultReq(player *model.Player, payloadM func (g *GameManager) PlayerGetForceQuitBanInfoReq(player *model.Player, payloadMsg pb.Message) { logger.LOG.Debug("user get world exit ban info, uid: %v", player.PlayerID) - result := true + ok := true world := WORLD_MANAGER.GetWorldByID(player.WorldId) for _, worldPlayer := range world.playerMap { if worldPlayer.SceneLoadState != model.SceneEnterDone { - result = false + ok = false } } - playerGetForceQuitBanInfoRsp := new(proto.PlayerGetForceQuitBanInfoRsp) - if result { - playerGetForceQuitBanInfoRsp.Retcode = int32(proto.Retcode_RET_SUCC) - } else { - playerGetForceQuitBanInfoRsp.Retcode = int32(proto.Retcode_RET_MP_TARGET_PLAYER_IN_TRANSFER) + if !ok { + g.CommonRetError(cmd.PlayerGetForceQuitBanInfoRsp, player, &proto.PlayerGetForceQuitBanInfoRsp{}, proto.Retcode_RET_MP_TARGET_PLAYER_IN_TRANSFER) + return } - g.SendMsg(cmd.PlayerGetForceQuitBanInfoRsp, player.PlayerID, player.ClientSeq, playerGetForceQuitBanInfoRsp) + g.CommonRetSucc(cmd.PlayerGetForceQuitBanInfoRsp, player, &proto.PlayerGetForceQuitBanInfoRsp{}) } func (g *GameManager) BackMyWorldReq(player *model.Player, payloadMsg pb.Message) { @@ -74,13 +72,11 @@ func (g *GameManager) BackMyWorldReq(player *model.Player, payloadMsg pb.Message // 其他玩家 ok := g.UserLeaveWorld(player) - backMyWorldRsp := new(proto.BackMyWorldRsp) - if ok { - backMyWorldRsp.Retcode = int32(proto.Retcode_RET_SUCC) - } else { - backMyWorldRsp.Retcode = int32(proto.Retcode_RET_MP_TARGET_PLAYER_IN_TRANSFER) + if !ok { + g.CommonRetError(cmd.BackMyWorldRsp, player, &proto.BackMyWorldRsp{}, proto.Retcode_RET_MP_TARGET_PLAYER_IN_TRANSFER) + return } - g.SendMsg(cmd.BackMyWorldRsp, player.PlayerID, player.ClientSeq, backMyWorldRsp) + g.CommonRetSucc(cmd.BackMyWorldRsp, player, &proto.BackMyWorldRsp{}) } func (g *GameManager) ChangeWorldToSingleModeReq(player *model.Player, payloadMsg pb.Message) { @@ -88,13 +84,11 @@ func (g *GameManager) ChangeWorldToSingleModeReq(player *model.Player, payloadMs // 房主 ok := g.UserLeaveWorld(player) - changeWorldToSingleModeRsp := new(proto.ChangeWorldToSingleModeRsp) - if ok { - changeWorldToSingleModeRsp.Retcode = int32(proto.Retcode_RET_SUCC) - } else { - changeWorldToSingleModeRsp.Retcode = int32(proto.Retcode_RET_MP_TARGET_PLAYER_IN_TRANSFER) + if !ok { + g.CommonRetError(cmd.ChangeWorldToSingleModeRsp, player, &proto.ChangeWorldToSingleModeRsp{}, proto.Retcode_RET_MP_TARGET_PLAYER_IN_TRANSFER) + return } - g.SendMsg(cmd.ChangeWorldToSingleModeRsp, player.PlayerID, player.ClientSeq, changeWorldToSingleModeRsp) + g.CommonRetSucc(cmd.ChangeWorldToSingleModeRsp, player, &proto.ChangeWorldToSingleModeRsp{}) } func (g *GameManager) SceneKickPlayerReq(player *model.Player, payloadMsg pb.Message) { @@ -102,30 +96,27 @@ func (g *GameManager) SceneKickPlayerReq(player *model.Player, payloadMsg pb.Mes req := payloadMsg.(*proto.SceneKickPlayerReq) world := WORLD_MANAGER.GetWorldByID(player.WorldId) if player.PlayerID != world.owner.PlayerID { - sceneKickPlayerRsp := &proto.SceneKickPlayerRsp{ - Retcode: int32(proto.Retcode_RET_SVR_ERROR), - } - g.SendMsg(cmd.SceneKickPlayerRsp, player.PlayerID, player.ClientSeq, sceneKickPlayerRsp) + g.CommonRetError(cmd.SceneKickPlayerRsp, player, &proto.SceneKickPlayerRsp{}) return } targetUid := req.TargetUid targetPlayer := USER_MANAGER.GetOnlineUser(targetUid) ok := g.UserLeaveWorld(targetPlayer) - if ok { - sceneKickPlayerNotify := &proto.SceneKickPlayerNotify{ - TargetUid: targetUid, - KickerUid: player.PlayerID, - } - for _, worldPlayer := range world.playerMap { - g.SendMsg(cmd.SceneKickPlayerNotify, worldPlayer.PlayerID, worldPlayer.ClientSeq, sceneKickPlayerNotify) - } + if !ok { + g.CommonRetError(cmd.SceneKickPlayerRsp, player, &proto.SceneKickPlayerRsp{}, proto.Retcode_RET_MP_TARGET_PLAYER_IN_TRANSFER) + return } - sceneKickPlayerRsp := new(proto.SceneKickPlayerRsp) - if ok { - sceneKickPlayerRsp.TargetUid = targetUid - } else { - sceneKickPlayerRsp.Retcode = int32(proto.Retcode_RET_MP_TARGET_PLAYER_IN_TRANSFER) + sceneKickPlayerNotify := &proto.SceneKickPlayerNotify{ + TargetUid: targetUid, + KickerUid: player.PlayerID, + } + for _, worldPlayer := range world.playerMap { + g.SendMsg(cmd.SceneKickPlayerNotify, worldPlayer.PlayerID, worldPlayer.ClientSeq, sceneKickPlayerNotify) + } + + sceneKickPlayerRsp := &proto.SceneKickPlayerRsp{ + TargetUid: targetUid, } g.SendMsg(cmd.SceneKickPlayerRsp, player.PlayerID, player.ClientSeq, sceneKickPlayerRsp) } diff --git a/gs/game/user_social.go b/gs/game/user_social.go index 30a98051..86235fb1 100644 --- a/gs/game/user_social.go +++ b/gs/game/user_social.go @@ -20,27 +20,28 @@ func (g *GameManager) GetPlayerSocialDetailReq(player *model.Player, payloadMsg req := payloadMsg.(*proto.GetPlayerSocialDetailReq) targetUid := req.Uid - getPlayerSocialDetailRsp := new(proto.GetPlayerSocialDetailRsp) // TODO 同步阻塞待优化 targetPlayer := USER_MANAGER.LoadTempOfflineUserSync(targetUid) - if targetPlayer != nil { - _, exist := player.FriendList[targetPlayer.PlayerID] - socialDetail := &proto.SocialDetail{ - Uid: targetPlayer.PlayerID, - ProfilePicture: &proto.ProfilePicture{AvatarId: targetPlayer.HeadImage}, - Nickname: targetPlayer.NickName, - Signature: targetPlayer.Signature, - Level: targetPlayer.PropertiesMap[constant.PlayerPropertyConst.PROP_PLAYER_LEVEL], - Birthday: &proto.Birthday{Month: 2, Day: 13}, - WorldLevel: targetPlayer.PropertiesMap[constant.PlayerPropertyConst.PROP_PLAYER_WORLD_LEVEL], - NameCardId: targetPlayer.NameCard, - IsShowAvatar: false, - FinishAchievementNum: 0, - IsFriend: exist, - } - getPlayerSocialDetailRsp.DetailData = socialDetail - } else { - getPlayerSocialDetailRsp.Retcode = int32(proto.Retcode_RET_PLAYER_NOT_EXIST) + if targetPlayer == nil { + g.CommonRetError(cmd.GetPlayerSocialDetailRsp, player, &proto.GetPlayerSocialDetailRsp{}, proto.Retcode_RET_PLAYER_NOT_EXIST) + return + } + _, exist := player.FriendList[targetPlayer.PlayerID] + socialDetail := &proto.SocialDetail{ + Uid: targetPlayer.PlayerID, + ProfilePicture: &proto.ProfilePicture{AvatarId: targetPlayer.HeadImage}, + Nickname: targetPlayer.NickName, + Signature: targetPlayer.Signature, + Level: targetPlayer.PropertiesMap[constant.PlayerPropertyConst.PROP_PLAYER_LEVEL], + Birthday: &proto.Birthday{Month: uint32(targetPlayer.Birthday[0]), Day: uint32(targetPlayer.Birthday[1])}, + WorldLevel: targetPlayer.PropertiesMap[constant.PlayerPropertyConst.PROP_PLAYER_WORLD_LEVEL], + NameCardId: targetPlayer.NameCard, + IsShowAvatar: false, + FinishAchievementNum: 0, + IsFriend: exist, + } + getPlayerSocialDetailRsp := &proto.GetPlayerSocialDetailRsp{ + DetailData: socialDetail, } g.SendMsg(cmd.GetPlayerSocialDetailRsp, player.PlayerID, player.ClientSeq, getPlayerSocialDetailRsp) } @@ -48,8 +49,18 @@ func (g *GameManager) GetPlayerSocialDetailReq(player *model.Player, payloadMsg func (g *GameManager) SetPlayerBirthdayReq(player *model.Player, payloadMsg pb.Message) { logger.LOG.Debug("user set birthday, uid: %v", player.PlayerID) req := payloadMsg.(*proto.SetPlayerBirthdayReq) - _ = req - g.CommonRetError(cmd.SetPlayerBirthdayRsp, player, &proto.SetPlayerBirthdayRsp{}) + if player.Birthday[0] != 0 || player.Birthday[1] != 0 { + g.CommonRetError(cmd.SetPlayerBirthdayRsp, player, &proto.SetPlayerBirthdayRsp{}) + return + } + birthday := req.Birthday + player.Birthday[0] = uint8(birthday.Month) + player.Birthday[1] = uint8(birthday.Day) + + setPlayerBirthdayRsp := &proto.SetPlayerBirthdayRsp{ + Birthday: req.Birthday, + } + g.SendMsg(cmd.SetPlayerBirthdayRsp, player.PlayerID, player.ClientSeq, setPlayerBirthdayRsp) } func (g *GameManager) SetNameCardReq(player *model.Player, payloadMsg pb.Message) { @@ -325,6 +336,7 @@ func (g *GameManager) GetOnlinePlayerListReq(player *model.Player, payloadMsg pb } func (g *GameManager) PacketOnlinePlayerInfo(player *model.Player) *proto.OnlinePlayerInfo { + world := WORLD_MANAGER.GetWorldByID(player.WorldId) onlinePlayerInfo := &proto.OnlinePlayerInfo{ Uid: player.PlayerID, Nickname: player.NickName, @@ -333,11 +345,7 @@ func (g *GameManager) PacketOnlinePlayerInfo(player *model.Player) *proto.Online NameCardId: player.NameCard, Signature: player.Signature, ProfilePicture: &proto.ProfilePicture{AvatarId: player.HeadImage}, - CurPlayerNumInWorld: 1, - } - world := WORLD_MANAGER.GetWorldByID(player.WorldId) - if world != nil && world.playerMap != nil { - onlinePlayerInfo.CurPlayerNumInWorld = uint32(world.GetWorldPlayerNum()) + CurPlayerNumInWorld: uint32(world.GetWorldPlayerNum()), } return onlinePlayerInfo } diff --git a/gs/game/user_stamina.go b/gs/game/user_stamina.go index 9263d2f5..c5883828 100644 --- a/gs/game/user_stamina.go +++ b/gs/game/user_stamina.go @@ -28,10 +28,7 @@ func (g *GameManager) SceneAvatarStaminaStepReq(player *model.Player, payloadMsg angleRevise = int32(req.Rot.X - 360.0) } else { logger.LOG.Error("invalid rot x angle: %v, uid: %v", req.Rot.X, player.PlayerID) - sceneAvatarStaminaStepRsp := &proto.SceneAvatarStaminaStepRsp{ - Retcode: int32(proto.Retcode_RET_FAIL), - } - g.SendMsg(cmd.SceneAvatarStaminaStepRsp, player.PlayerID, player.ClientSeq, sceneAvatarStaminaStepRsp) + g.CommonRetError(cmd.SceneAvatarStaminaStepRsp, player, &proto.SceneAvatarStaminaStepRsp{}) return } // 攀爬耐力修正曲线 diff --git a/gs/game/user_team.go b/gs/game/user_team.go index 8c56316f..39821661 100644 --- a/gs/game/user_team.go +++ b/gs/game/user_team.go @@ -16,11 +16,9 @@ func (g *GameManager) ChangeAvatarReq(player *model.Player, payloadMsg pb.Messag logger.LOG.Debug("user change avatar, uid: %v", player.PlayerID) req := payloadMsg.(*proto.ChangeAvatarReq) targetAvatarGuid := req.Guid - world := WORLD_MANAGER.GetWorldByID(player.WorldId) scene := world.GetSceneById(player.SceneId) playerTeamEntity := scene.GetPlayerTeamEntity(player.PlayerID) - oldAvatarId := world.GetPlayerActiveAvatarId(player) oldAvatar := player.AvatarMap[oldAvatarId] if oldAvatar.Guid == targetAvatarGuid { @@ -37,9 +35,11 @@ func (g *GameManager) ChangeAvatarReq(player *model.Player, payloadMsg pb.Messag logger.LOG.Error("can not find the target avatar in team, uid: %v, target avatar guid: %v", player.PlayerID, targetAvatarGuid) return } - player.TeamConfig.CurrAvatarIndex = uint8(index) - world.SetPlayerLocalAvatarIndex(player, index) - + if world.multiplayer { + world.SetPlayerLocalAvatarIndex(player, index) + } else { + player.TeamConfig.CurrAvatarIndex = uint8(index) + } entity := scene.GetEntity(playerTeamEntity.avatarEntityMap[oldAvatarId]) if entity == nil { return @@ -178,13 +178,11 @@ func (g *GameManager) ChangeMpTeamAvatarReq(player *model.Player, payloadMsg pb. logger.LOG.Debug("user change mp team avatar, uid: %v", player.PlayerID) req := payloadMsg.(*proto.ChangeMpTeamAvatarReq) avatarGuidList := req.AvatarGuidList - world := WORLD_MANAGER.GetWorldByID(player.WorldId) if !world.multiplayer || len(avatarGuidList) == 0 || len(avatarGuidList) > 4 { g.CommonRetError(cmd.ChangeMpTeamAvatarRsp, player, &proto.ChangeMpTeamAvatarRsp{}) return } - avatarIdList := make([]uint32, 0) for _, avatarGuid := range avatarGuidList { avatarId := player.GetAvatarIdByGuid(avatarGuid) @@ -192,7 +190,6 @@ func (g *GameManager) ChangeMpTeamAvatarReq(player *model.Player, payloadMsg pb. } world.SetPlayerLocalTeam(player, avatarIdList) world.SetPlayerLocalAvatarIndex(player, 0) - world.UpdateMultiplayerTeam() scene := world.GetSceneById(player.SceneId) scene.UpdatePlayerTeamEntity(player) @@ -204,7 +201,6 @@ func (g *GameManager) ChangeMpTeamAvatarReq(player *model.Player, payloadMsg pb. avatarId := world.GetPlayerActiveAvatarId(player) avatar := player.AvatarMap[avatarId] - changeMpTeamAvatarRsp := &proto.ChangeMpTeamAvatarRsp{ CurAvatarGuid: avatar.Guid, AvatarGuidList: req.AvatarGuidList, diff --git a/gs/model/player.go b/gs/model/player.go index 4bd745c6..e45be3bf 100644 --- a/gs/model/player.go +++ b/gs/model/player.go @@ -6,9 +6,10 @@ import ( ) const ( - DbNormal = iota + DbNone = iota DbInsert DbDelete + DbNormal ) const ( @@ -27,6 +28,7 @@ type Player struct { NickName string `bson:"nickname"` // 玩家昵称 Signature string `bson:"signature"` // 玩家签名 HeadImage uint32 `bson:"headImage"` // 玩家头像 + Birthday [2]uint8 `bson:"birthday"` // 生日 NameCard uint32 `bson:"nameCard"` // 当前名片 NameCardList []uint32 `bson:"nameCardList"` // 已解锁名片列表 FriendList map[uint32]bool `bson:"friendList"` // 好友uid列表 diff --git a/protocol/cmd/cmd_id_proto_obj_map.go b/protocol/cmd/cmd_id_proto_obj_map.go index 0903a838..2c446989 100644 --- a/protocol/cmd/cmd_id_proto_obj_map.go +++ b/protocol/cmd/cmd_id_proto_obj_map.go @@ -95,6 +95,8 @@ func (c *CmdProtoMap) registerAllMessage() { c.registerMessage(ToTheMoonEnterSceneRsp, &proto.ToTheMoonEnterSceneRsp{}) // 进入场景响应 c.registerMessage(SetEntityClientDataNotify, &proto.SetEntityClientDataNotify{}) // 通知 c.registerMessage(LeaveWorldNotify, &proto.LeaveWorldNotify{}) // 删除客户端世界通知 + c.registerMessage(SceneAvatarStaminaStepReq, &proto.SceneAvatarStaminaStepReq{}) // 缓慢游泳或缓慢攀爬时消耗耐力请求 + c.registerMessage(SceneAvatarStaminaStepRsp, &proto.SceneAvatarStaminaStepRsp{}) // 缓慢游泳或缓慢攀爬时消耗耐力响应 // 战斗与技能 c.registerMessage(AvatarFightPropNotify, &proto.AvatarFightPropNotify{}) // 角色战斗属性通知 @@ -222,10 +224,6 @@ func (c *CmdProtoMap) registerAllMessage() { c.registerMessage(McoinExchangeHcoinReq, &proto.McoinExchangeHcoinReq{}) // 结晶换原石请求 c.registerMessage(McoinExchangeHcoinRsp, &proto.McoinExchangeHcoinRsp{}) // 结晶换原石响应 - // 耐力 - c.registerMessage(SceneAvatarStaminaStepReq, &proto.SceneAvatarStaminaStepReq{}) // 缓慢游泳或缓慢攀爬时消耗耐力请求 - c.registerMessage(SceneAvatarStaminaStepRsp, &proto.SceneAvatarStaminaStepRsp{}) // 缓慢游泳或缓慢攀爬时消耗耐力响应 - // 乱七八糟 c.registerMessage(MarkMapReq, &proto.MarkMapReq{}) // 标记地图请求 c.registerMessage(TowerAllDataReq, &proto.TowerAllDataReq{}) // 深渊数据请求