From 104ab707a6570e235770f9728f9f9bd93e1f636a Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Tue, 20 Jan 2026 17:38:07 +0800 Subject: [PATCH] =?UTF-8?q?=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/game/external.go | 17 ++++++----- src/server/game/player_chess_mod.go | 46 +++++++++++++++++++++++++++-- 2 files changed, 53 insertions(+), 10 deletions(-) diff --git a/src/server/game/external.go b/src/server/game/external.go index 437eb1ef..b9445d54 100644 --- a/src/server/game/external.go +++ b/src/server/game/external.go @@ -147,6 +147,7 @@ func HandleClientReq(args []interface{}) { data, _ := proto.Marshal(ResRegisterAccount) gl.PackResInfo(a, "ResRegisterAccount", data) case "ReqLogin": + now := time.Now().UnixMilli() detail := &msg.ReqLogin{} proto.Unmarshal(buf, detail) accountInfo := db.GetAccountInfoFromDb(detail.UserName) @@ -162,11 +163,13 @@ func HandleClientReq(args []interface{}) { G_GameLogicPtr.PackLoginResInfo(a, ResLogin) return } + newPlayer := false if ResLogin.DwUin > 0 { PlayerInfo := G_GameLogicPtr.GetPlayer(ResLogin.DwUin) err := G_GameLogicPtr.ReplaceExistPlayerAndAgent(a, PlayerInfo) if err != nil { PlayerInfo = G_GameLogicPtr.CreateNewPlayer(a, detail.UserName) + newPlayer = true } if PlayerInfo.PlayMod.getBaseMod().IdCardName == "" && conf.Server.IdVerify { ResLogin.ResultCode = MergeConst.Protocol_Error_Id_Not_Verify @@ -184,6 +187,8 @@ func HandleClientReq(args []interface{}) { p.(*Player).LoginBackData() p.(*Player).TeLog("Login_log", nil) } + execTime := time.Now().UnixMilli() - now + log.Debug("uid : %d, func : %s, execTime : %d ms, isNew: %v", p.(*Player).M_DwUin, m.GetFunc(), execTime, newPlayer) p.(*Player).ProcessTrigger() case "ReqServerTime": // 获取服务器时间 detail := &msg.ReqServerTime{} @@ -219,13 +224,11 @@ func HandleClientReq(args []interface{}) { } p.(*Player).ProcessTrigger() execTime := time.Now().UnixMilli() - now - if execTime > int64(500) { - log.Warn("uid : %d, func : %s, execTime : %d ms", p.(*Player).M_DwUin, m.GetFunc(), execTime) - p.(*Player).TeLog("Long_Method_Log", map[string]interface{}{ - "method_name": m.GetFunc(), - "exec_time": execTime, - }) - } + log.Debug("uid : %d, func : %s, execTime : %d ms", p.(*Player).M_DwUin, m.GetFunc(), execTime) + p.(*Player).TeLog("Long_Method_Log", map[string]interface{}{ + "method_name": m.GetFunc(), + "exec_time": execTime, + }) } } p, b := internal.Agents.Load(a) diff --git a/src/server/game/player_chess_mod.go b/src/server/game/player_chess_mod.go index 4ebefa4b..8c42913e 100644 --- a/src/server/game/player_chess_mod.go +++ b/src/server/game/player_chess_mod.go @@ -92,7 +92,7 @@ func (p *PlayerChessData) UpdatePlayerChessData(player *Player, buf []byte) erro for _, v := range update.MChessHandle { HandleStr += fmt.Sprintf("%v-%v-%v,", v.Id, v.ChessId, v.Type) } - log.Debug("棋子数据不一致, %v===%v===%v===%v", HandleStr, LastMap, update.MChessData, player.PlayMod.getChessMod().GetChessList()) + log.Debug("棋子数据不一致地图, %v===%v===%v===%v", HandleStr, LastMap, update.MChessData, player.PlayMod.getChessMod().GetChessList()) player.SendErrClienRes(res) player.TeLog("outsync_event", map[string]interface{}{ "outsync_event": "UpdatePlayerChessDataFunc", @@ -118,7 +118,7 @@ func (p *PlayerChessData) UpdateChessData(player *Player, MChessData map[string] Code: msg.RES_CODE_FAIL, Msg: "棋子数据不一致", } - log.Debug("棋子数据不一致, %v---%v", p.Data.MChessData, player.PlayMod.getChessMod().GetChessList()) + log.Debug("棋子数据不一致地图, %v---%v", p.Data.MChessData, player.PlayMod.getChessMod().GetChessList()) player.SendErrClienRes(res) player.TeLog("outsync_event", map[string]interface{}{ "outsync_event": "UpdatePlayerChessDataFunc", @@ -165,7 +165,47 @@ func (p *PlayerChessData) checkChessEqual(player *Player) bool { for _, v := range p.Data.MChessData { bCopy = append(bCopy, int(v)) } - return SlicesEqual(aCopy, bCopy) + isEqual := SlicesEqual(aCopy, bCopy) + + if isEqual { + return true + } + // 找出aCopy多的元素和少的元素 + aMap := make(map[int]int) + bMap := make(map[int]int) + + for _, v := range aCopy { + aMap[v]++ + } + for _, v := range bCopy { + bMap[v]++ + } + + extra := make([]int, 0) + missing := make([]int, 0) + + // 找出aCopy多的元素 + for k, v := range aMap { + if bMap[k] < v { + for i := 0; i < v-bMap[k]; i++ { + extra = append(extra, k) + } + } + } + + // 找出aCopy少的元素 + for k, v := range bMap { + if aMap[k] < v { + for i := 0; i < v-aMap[k]; i++ { + missing = append(missing, k) + } + } + } + + if len(extra) > 0 || len(missing) > 0 { + log.Debug("棋子数据对比: aCopy多的元素=%v, aCopy少的元素=%v", extra, missing) + } + return false } // 棋子操作