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] =?UTF-8?q?=E7=AB=9E=E6=A0=87=E8=B5=9B=E6=B6=88=E6=81=AF?= =?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/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