完善多人世界队伍

This commit is contained in:
huangxiaolei
2022-12-10 19:48:35 +08:00
parent 50de81588b
commit edd8a98f92
17 changed files with 313 additions and 485 deletions

View File

@@ -1,7 +1,6 @@
package game
import (
"encoding/json"
"sync"
"time"
@@ -12,24 +11,20 @@ import (
)
type UserManager struct {
dao *dao.Dao
playerMap map[uint32]*model.Player
playerMapLock sync.RWMutex
localEventChan chan *LocalEvent
dao *dao.Dao
playerMap map[uint32]*model.Player
playerMapLock sync.RWMutex
}
func NewUserManager(dao *dao.Dao, localEventChan chan *LocalEvent) (r *UserManager) {
func NewUserManager(dao *dao.Dao) (r *UserManager) {
r = new(UserManager)
r.dao = dao
r.playerMap = make(map[uint32]*model.Player)
r.localEventChan = localEventChan
return r
}
func (u *UserManager) GetUserOnlineState(userId uint32) bool {
u.playerMapLock.RLock()
player, exist := u.playerMap[userId]
u.playerMapLock.RUnlock()
if !exist {
return false
} else {
@@ -38,9 +33,7 @@ func (u *UserManager) GetUserOnlineState(userId uint32) bool {
}
func (u *UserManager) GetOnlineUser(userId uint32) *model.Player {
u.playerMapLock.RLock()
player, exist := u.playerMap[userId]
u.playerMapLock.RUnlock()
if !exist {
return nil
} else {
@@ -54,14 +47,12 @@ func (u *UserManager) GetOnlineUser(userId uint32) *model.Player {
func (u *UserManager) GetAllOnlineUserList() map[uint32]*model.Player {
onlinePlayerMap := make(map[uint32]*model.Player)
u.playerMapLock.RLock()
for userId, player := range u.playerMap {
if player.Online == false {
continue
}
onlinePlayerMap[userId] = player
}
u.playerMapLock.RUnlock()
return onlinePlayerMap
}
@@ -73,9 +64,7 @@ type PlayerRegInfo struct {
}
func (u *UserManager) CheckUserExistOnReg(userId uint32, req *proto.SetPlayerBornDataReq, clientSeq uint32) (exist bool, asyncWait bool) {
u.playerMapLock.RLock()
_, exist = u.playerMap[userId]
u.playerMapLock.RUnlock()
if exist {
return true, false
} else {
@@ -85,7 +74,7 @@ func (u *UserManager) CheckUserExistOnReg(userId uint32, req *proto.SetPlayerBor
if player != nil {
exist = true
}
u.localEventChan <- &LocalEvent{
LOCAL_EVENT_MANAGER.localEventChan <- &LocalEvent{
EventId: CheckUserExistOnRegFromDbFinish,
Msg: &PlayerRegInfo{
Exist: exist,
@@ -100,9 +89,7 @@ func (u *UserManager) CheckUserExistOnReg(userId uint32, req *proto.SetPlayerBor
}
func (u *UserManager) LoadTempOfflineUserSync(userId uint32) *model.Player {
u.playerMapLock.RLock()
player, exist := u.playerMap[userId]
u.playerMapLock.RUnlock()
if exist {
return player
} else {
@@ -110,10 +97,7 @@ func (u *UserManager) LoadTempOfflineUserSync(userId uint32) *model.Player {
if player == nil {
return nil
}
player.DbState = model.DbOffline
u.playerMapLock.Lock()
u.playerMap[player.PlayerID] = player
u.playerMapLock.Unlock()
return player
}
}
@@ -132,9 +116,7 @@ func (u *UserManager) AddUser(player *model.Player) {
return
}
u.ChangeUserDbState(player, model.DbInsert)
u.playerMapLock.Lock()
u.playerMap[player.PlayerID] = player
u.playerMapLock.Unlock()
}
func (u *UserManager) DeleteUser(player *model.Player) {
@@ -142,19 +124,7 @@ func (u *UserManager) DeleteUser(player *model.Player) {
return
}
u.ChangeUserDbState(player, model.DbDelete)
u.playerMapLock.Lock()
u.playerMap[player.PlayerID] = player
u.playerMapLock.Unlock()
}
func (u *UserManager) UpdateUser(player *model.Player) {
if player == nil {
return
}
u.ChangeUserDbState(player, model.DbUpdate)
u.playerMapLock.Lock()
u.playerMap[player.PlayerID] = player
u.playerMapLock.Unlock()
}
type PlayerLoginInfo struct {
@@ -164,9 +134,7 @@ type PlayerLoginInfo struct {
}
func (u *UserManager) OnlineUser(userId uint32, clientSeq uint32) (*model.Player, bool) {
u.playerMapLock.RLock()
player, exist := u.playerMap[userId]
u.playerMapLock.RUnlock()
if exist {
u.ChangeUserDbState(player, model.DbNormal)
return player, false
@@ -179,7 +147,7 @@ func (u *UserManager) OnlineUser(userId uint32, clientSeq uint32) (*model.Player
u.playerMap[player.PlayerID] = player
u.playerMapLock.Unlock()
}
u.localEventChan <- &LocalEvent{
LOCAL_EVENT_MANAGER.localEventChan <- &LocalEvent{
EventId: LoadLoginUserFromDbFinish,
Msg: &PlayerLoginInfo{
UserId: userId,
@@ -192,53 +160,27 @@ func (u *UserManager) OnlineUser(userId uint32, clientSeq uint32) (*model.Player
}
}
func (u *UserManager) OfflineUser(player *model.Player) {
if player == nil {
return
}
u.ChangeUserDbState(player, model.DbOffline)
u.playerMapLock.Lock()
u.playerMap[player.PlayerID] = player
u.playerMapLock.Unlock()
}
func (u *UserManager) ChangeUserDbState(player *model.Player, state int) {
if player == nil {
return
}
switch player.DbState {
case model.DbInsert:
if state == model.DbDelete {
player.DbState = model.DbDelete
}
break
case model.DbDelete:
case model.DbUpdate:
if state == model.DbDelete {
player.DbState = model.DbDelete
} else if state == model.DbOffline {
player.DbState = model.DbOffline
if state == model.DbNormal {
player.DbState = model.DbNormal
}
case model.DbNormal:
if state == model.DbDelete {
player.DbState = model.DbDelete
} else if state == model.DbUpdate {
player.DbState = model.DbUpdate
} else if state == model.DbOffline {
player.DbState = model.DbOffline
}
case model.DbOffline:
if state == model.DbDelete {
player.DbState = model.DbDelete
} else if state == model.DbUpdate {
player.DbState = model.DbUpdate
} else if state == model.DbNormal {
player.DbState = model.DbNormal
}
}
}
// 用户数据库定时同步协程
func (u *UserManager) StartAutoSaveUser() {
// 用户数据库定时同步协程
go func() {
ticker := time.NewTicker(time.Minute * 5)
for {
@@ -249,57 +191,44 @@ func (u *UserManager) StartAutoSaveUser() {
}
func (u *UserManager) SaveUser() {
logger.LOG.Info("auto save user start")
playerMapTemp := make(map[uint32]*model.Player)
playerMapSave := make(map[uint32]*model.Player, len(u.playerMap))
u.playerMapLock.RLock()
for k, v := range u.playerMap {
playerMapTemp[k] = v
playerMapSave[k] = v
}
u.playerMapLock.RUnlock()
logger.LOG.Info("copyLocalTeamToWorld user map finish")
insertList := make([]*model.Player, 0)
deleteList := make([]uint32, 0)
updateList := make([]*model.Player, 0)
for k, v := range playerMapTemp {
switch v.DbState {
case model.DbInsert:
insertList = append(insertList, v)
playerMapTemp[k].DbState = model.DbNormal
case model.DbDelete:
deleteList = append(deleteList, v.PlayerID)
delete(playerMapTemp, k)
case model.DbUpdate:
updateList = append(updateList, v)
playerMapTemp[k].DbState = model.DbNormal
case model.DbNormal:
for uid, player := range playerMapSave {
if uid < 100000000 {
continue
case model.DbOffline:
updateList = append(updateList, v)
delete(playerMapTemp, k)
}
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)
}
}
insertListJson, err := json.Marshal(insertList)
logger.LOG.Debug("insertList: %v", string(insertListJson))
deleteListJson, err := json.Marshal(deleteList)
logger.LOG.Debug("deleteList: %v", string(deleteListJson))
updateListJson, err := json.Marshal(updateList)
logger.LOG.Debug("updateList: %v", string(updateListJson))
logger.LOG.Info("db state init finish")
err = u.dao.InsertPlayerList(insertList)
err := u.dao.InsertPlayerList(insertList)
if err != nil {
logger.LOG.Error("insert player list error: %v", err)
}
err = u.dao.DeletePlayerList(deleteList)
if err != nil {
logger.LOG.Error("delete player error: %v", err)
return
}
err = u.dao.UpdatePlayerList(updateList)
if err != nil {
logger.LOG.Error("update player error: %v", err)
logger.LOG.Error("update player list error: %v", err)
return
}
logger.LOG.Info("db write finish")
u.playerMapLock.Lock()
u.playerMap = playerMapTemp
u.playerMap = playerMapSave
u.playerMapLock.Unlock()
logger.LOG.Info("auto save user finish")
logger.LOG.Info("save user finish, insert user count: %v, update user count: %v", len(insertList), len(updateList))
}