From 0a610a79bbc676797b4c6a20d73d00c9b4cd7364 Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Thu, 29 Jan 2026 10:22:08 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/game/player_data.go | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/server/game/player_data.go b/src/server/game/player_data.go index a5b27d96..14582459 100644 --- a/src/server/game/player_data.go +++ b/src/server/game/player_data.go @@ -23,6 +23,7 @@ import ( "server/game/mod/item" limitedTimeEvent "server/game/mod/limited_time_event" MsgMod "server/game/mod/msg" + "server/game/mod/order" "server/game/mod/playroom" "server/game/mod/quest" GoUtil "server/game_util" @@ -431,9 +432,20 @@ func (p *Player) Outline() { BaseMod := p.PlayMod.getBaseMod() BaseMod.Outline(int(Cacumulative)) p.PlayMod.save() + type orderLogout struct { + Id int + Order order.Order + } + orderList := []orderLogout{} + for id, order := range p.PlayMod.getOrderMod().GetOrderList() { + orderList = append(orderList, orderLogout{ + Id: id, + Order: order, + }) + } p.TeLog("logout", map[string]interface{}{ "caccumulative": Cacumulative, - "order_list": p.PlayMod.getOrderMod().GetOrderList(), + "order_list": orderList, "after_level": p.PlayMod.getBaseMod().GetLevel(), "tmp_diamond": p.PlayMod.getBaseMod().GetDiamond(), "tmp_energy": p.PlayMod.getBaseMod().GetEnergy(), From 650bb1136f476471537d3add5d14a74e95342d6a Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Thu, 29 Jan 2026 17:42:48 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E7=AB=9E=E6=A0=87=E8=B5=9B=E6=B6=88?= =?UTF-8?q?=E6=81=AF=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/game/message_mgr.go | 14 +++++++++++++- src/server/game/player_data.go | 27 +++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/src/server/game/message_mgr.go b/src/server/game/message_mgr.go index a1b97f47..ed03fd8c 100644 --- a/src/server/game/message_mgr.go +++ b/src/server/game/message_mgr.go @@ -30,6 +30,15 @@ var save_msg_type = []int{ msg.HANDLE_MOD_USER_VAR_SET, } +var notify_msg_type = []int{ + msg.HANDLE_TYPE_CHAMPSHIP_GROUP, //锦标赛分组操作 + msg.HANDLE_TYPE_CHAMPSHIP_INRANK, //锦标赛入榜操作 + msg.HANDLE_TYPE_CHAMPSHIP_AI, //锦标赛入榜操作 + msg.HANDLE_TYPE_CHAMPSHIP_NOTIFY, //锦标赛排名变动通知 + msg.HANDLE_TYPE_CHAMPSHIP_ZERO, //锦标赛0点更新 + msg.HANDLE_TYPE_CHAMPSHIP_NOTIFY2, //锦标赛0.30点通知 +} + type MessageMgr struct { *ServerMod middlewares []MessageMiddleware @@ -777,7 +786,10 @@ func sendMessageAsync(m *msg.Msg, node int) error { }() log.Debug("[Middleware] Send Async message to node: %d, message: %v", node, m) err := mergeCluster.SendServerMsg(m, node) - if err != nil && GoUtil.InArray(m.HandleType, save_msg_type) { + // 节点不在线且消息需要保存则保存消息 + // 需要保存的消息类型:玩家消息,锦标赛入榜,用户变量设置 + // 不需要保存的消息类型:锦标赛相关通知类消息 + if err != nil && GoUtil.InArray(m.HandleType, save_msg_type) && !GoUtil.InArray(m.Type, notify_msg_type) { saveMessage(m) return err } diff --git a/src/server/game/player_data.go b/src/server/game/player_data.go index 14582459..b368c3f7 100644 --- a/src/server/game/player_data.go +++ b/src/server/game/player_data.go @@ -64,6 +64,7 @@ type Player struct { activity map[int]*ActivityInfo stop bool wg sync.WaitGroup + func_time int } type PlayerBackUp struct { @@ -1197,6 +1198,32 @@ func (p *Player) GetIp() string { return p.GetAgent().RemoteAddr().String() } +func (p *Player) func_exec_add() error { + now := time.Now().Unix() + + // 如果是新的一秒,重置计数 + if now != int64(p.func_time) { + p.func_time = int(now) + p.args["func_exec_count"] = 1 + return nil + } + + // 获取当前秒内的调用次数 + count := 0 + if v, ok := p.args["func_exec_count"]; ok { + count = GoUtil.Int(v) + } + + // 检查是否超过限制 + if count >= 20 { + return errors.New("func_exec_add: call limit exceeded (20 times per second)") + } + + // 增加计数 + p.args["func_exec_count"] = count + 1 + return nil +} + func (p *Player) DispatcherHandle() { go func() { var cb *timer.Timer From 34126d990acf88b3fae4feee06a4552cf9c81a8d Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Thu, 29 Jan 2026 20:02:40 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/cluster/cluster_func.go | 6 ++++ src/server/game/GameLogic.go | 2 +- src/server/game/message_mgr.go | 46 ++++++++++++++++++++++++++---- 3 files changed, 48 insertions(+), 6 deletions(-) diff --git a/src/server/cluster/cluster_func.go b/src/server/cluster/cluster_func.go index c99b9be2..3aebb14f 100644 --- a/src/server/cluster/cluster_func.go +++ b/src/server/cluster/cluster_func.go @@ -112,6 +112,9 @@ func SendServerMsg(m *msg.Msg, serverId int) error { if m.UniKey == "" { m.UniKey = GoUtil.UniKey(fmt.Sprintf("%v,Cluster Msg", m)) } + if m.SendT == 0 { + m.SendT = GoUtil.Now() + } if v, ok := serverAgent.Load(serverId); ok { data, err := GoUtil.GobMarshal(m) if err != nil { @@ -128,6 +131,9 @@ func CallServerMsg(m *msg.Msg, serverId int) (*msg.Msg, error) { if m.UniKey == "" { m.UniKey = GoUtil.UniKey(fmt.Sprintf("%v,Cluster Msg", m)) } + if m.SendT == 0 { + m.SendT = GoUtil.Now() + } v, ok := serverAgent.Load(serverId) // 之后再发送消息 if !ok { diff --git a/src/server/game/GameLogic.go b/src/server/game/GameLogic.go index 79e2b59c..e9732de5 100644 --- a/src/server/game/GameLogic.go +++ b/src/server/game/GameLogic.go @@ -894,7 +894,7 @@ func (ad *GameLogic) GetStartTime() int64 { func NotifyPlayer(Uid int, m *MsgMod.Msg) { m.To = Uid m.HandleType = MsgMod.HANDLE_MOD_PLAYER_MSG - CenterPlayerMsgHandler(m) + NotifyPlayerMsgAsync(m) } func Destroy() { diff --git a/src/server/game/message_mgr.go b/src/server/game/message_mgr.go index ed03fd8c..e4d1dab4 100644 --- a/src/server/game/message_mgr.go +++ b/src/server/game/message_mgr.go @@ -124,6 +124,25 @@ func (m *MessageMgr) MessageMgrInit() { m.Use(TimeoutMiddleware(5 * time.Second)) m.NodeRegister() m.CenterRegister() + FixBug() +} + +func FixBug() { + messageMgrData := getMessageData() + // 先更新 PlayerList(需要加锁) + messageMgrData.mu.Lock() + defer messageMgrData.mu.Unlock() + for k, v := range messageMgrData.MessageList { + if k < 100000 { + delete(messageMgrData.MessageList, k) + } + for i, msgItem := range v.Messages { + if msgItem.Type == msg.HANDLE_TYPE_CHAMPSHIP_NOTIFY { + // 删除消息 + v.Messages = append(v.Messages[:i], v.Messages[i+1:]...) + } + } + } } // 注册处理器 @@ -308,22 +327,39 @@ func ComsumerMsgHandler(data *msg.Msg) (interface{}, error) { return nil, nil } +func NotifyPlayerMsgAsync(m *msg.Msg) { + messageMgrData := getMessageData() + // 检查玩家是否在线(需要加锁) + messageMgrData.mu.Lock() + node, ok := messageMgrData.PlayerList[int64(m.To)] + messageMgrData.mu.Unlock() + // 在线则直接发送消息 + if ok { + SendMsgToNodeAsync(m, node) + } +} + +// 处理玩家消息 func CenterPlayerMsgHandler(data *msg.Msg) (interface{}, error) { PlayerId := int64(data.To) messageMgrData := getMessageData() // 遍历消息列表,发送消息给在线玩家 - messages := getMessge(PlayerId) - messages.mu.Lock() - messages.Messages = append(messages.Messages, data) - messages.mu.Unlock() // 检查玩家是否在线(需要加锁) messageMgrData.mu.Lock() node, ok := messageMgrData.PlayerList[int64(PlayerId)] messageMgrData.mu.Unlock() - + // 在线则直接发送消息 if ok { SendMsgToNodeAsync(data, node) + } else { + // 不在线则存储消息 + if !GoUtil.InArray(data.Type, notify_msg_type) { + messages := getMessge(PlayerId) + messages.mu.Lock() + messages.Messages = append(messages.Messages, data) + messages.mu.Unlock() + } } return nil, nil } From 7f085b6b809dae97db354dc36969edd6ad86936a Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Thu, 29 Jan 2026 20:07:12 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E6=B6=88=E6=81=AF=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/game/message_mgr.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/server/game/message_mgr.go b/src/server/game/message_mgr.go index e4d1dab4..08a742dc 100644 --- a/src/server/game/message_mgr.go +++ b/src/server/game/message_mgr.go @@ -135,9 +135,11 @@ func FixBug() { for k, v := range messageMgrData.MessageList { if k < 100000 { delete(messageMgrData.MessageList, k) + continue } - for i, msgItem := range v.Messages { - if msgItem.Type == msg.HANDLE_TYPE_CHAMPSHIP_NOTIFY { + // 反向遍历以安全删除元素 + for i := len(v.Messages) - 1; i >= 0; i-- { + if v.Messages[i].Type == msg.HANDLE_TYPE_CHAMPSHIP_NOTIFY { // 删除消息 v.Messages = append(v.Messages[:i], v.Messages[i+1:]...) } From 1c667bc066bc96e9142903e02e1d784bd2d3e1cf Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Thu, 29 Jan 2026 20:09:32 +0800 Subject: [PATCH 5/5] 1 --- src/server/conf/server.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/server/conf/server.json b/src/server/conf/server.json index decddb79..ff105c9d 100644 --- a/src/server/conf/server.json +++ b/src/server/conf/server.json @@ -2,8 +2,8 @@ "AppID": 0, "LogLevel": "debug", "LogPath": "./log", - "TCPAddr": ":3601", - "WSAddr": ":3566", + "TCPAddr": ":3602", + "WSAddr": ":3567", "MySqlAddr": "127.0.0.1", "MySqlPort": "3306", "MySqlUsr": "root", @@ -25,9 +25,9 @@ "ServerCenter" : 0, "GameConfPath": "D:/Github/pet_home_server/src/server/gamedata/config/", - "ListenAddr":":9001", + "ListenAddr":":9002", "CenterAddr": "127.0.0.1:7000", - "RemoteAddr":"127.0.0.1:9001", + "RemoteAddr":"127.0.0.1:9002", "RedisAddr":"127.0.0.1", "RedisPort" :"6379",