mirror of
https://github.com/FlourishingWorld/hk4e.git
synced 2026-02-04 14:12:27 +08:00
优化玩家管理器
This commit is contained in:
@@ -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)
|
||||
|
||||
// 初始化
|
||||
|
||||
@@ -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))
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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))
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
// 攀爬耐力修正曲线
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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列表
|
||||
|
||||
@@ -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{}) // 深渊数据请求
|
||||
|
||||
Reference in New Issue
Block a user