From 4e832972fa382f662703755218b754b6c5764f64 Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Mon, 9 Feb 2026 10:41:19 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8E=A8=E8=8D=90=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/db/Mysql.go | 10 +++++ src/server/game/friend_func.go | 45 +++++++++++----------- src/server/game/gm_handler.go | 3 -- src/server/game/rank_mgr.go | 68 +++------------------------------- 4 files changed, 40 insertions(+), 86 deletions(-) diff --git a/src/server/db/Mysql.go b/src/server/db/Mysql.go index 363a8dc3..efe556ae 100644 --- a/src/server/db/Mysql.go +++ b/src/server/db/Mysql.go @@ -432,3 +432,13 @@ func SearchPlayer(key string) ([]*ResPlayerBaseInfo, error) { err := SqlDb.Select(data, sql, "%"+key+"%") return *data, err } + +func GetCommendPlayerFromDb(uid, login int64, level int) ([]int, error) { + sqlStr := "SELECT dwUin FROM t_player_baseinfo WHERE dwUin != ? AND logout_time > ? AND level >= ? ORDER BY logout_time DESC LIMIT 1000" + var res []int + if err := SqlDb.Select(&res, sqlStr, uid, login, level); err != nil { + log.Debug("table: %s, sql :%s, exec failed, err:%v\n", "PlayerBaseInfo", sqlStr, err) + return nil, err + } + return res, nil +} diff --git a/src/server/game/friend_func.go b/src/server/game/friend_func.go index 9bf37175..981b2ca2 100644 --- a/src/server/game/friend_func.go +++ b/src/server/game/friend_func.go @@ -68,7 +68,7 @@ func (p *Player) GetVisitorPlayer() int { if ps == nil { continue } - if GoUtil.Now()-ps.Loginout > 86400 { // 24小时内登录过 + if Now-ps.Loginout > 86400 { // 24小时内登录过 continue } if ps.Loginout > recentLoginTime { @@ -79,17 +79,20 @@ func (p *Player) GetVisitorPlayer() int { if recentFriendUid != 0 { return recentFriendUid } - PlayerList3 := G_GameLogicPtr.RankMgr.getAllRank(RANK_TYPE_USER) + uids, err := db.GetCommendPlayerFromDb(p.M_DwUin, GoUtil.Now()-86400, 15) + if err != nil { + return 0 + } PlayerList4 := make([]int, 0) - for _, v := range PlayerList3 { - if v.Uid == int(p.M_DwUin) { + for _, Uid := range uids { + if Uid == int(p.M_DwUin) { continue } - PlayerSimpleData := G_GameLogicPtr.GetSimplePlayerByUid(v.Uid) - if PlayerSimpleData.Level < 15 { + PlayerSimpleData := G_GameLogicPtr.GetSimplePlayerByUid(Uid) + if PlayerSimpleData == nil { continue } - PlayerList4 = append(PlayerList4, v.Uid) + PlayerList4 = append(PlayerList4, Uid) } L := GoUtil.RandSliceNum(PlayerList4, 1) if len(L) == 0 { @@ -99,34 +102,34 @@ func (p *Player) GetVisitorPlayer() int { } func GetRecommendPlayer(p *Player, Num int) []int { - PlayerList := G_GameLogicPtr.RankMgr.getAllRank(RANK_TYPE_USER) + uids, err := db.GetCommendPlayerFromDb(p.M_DwUin, GoUtil.Now()-259200, 4) + if err != nil { + return nil + } PlayerList1 := make([]int, 0) FriendMod := p.PlayMod.getFriendMod() - for _, v := range PlayerList { - if v.Uid == int(p.M_DwUin) { + for _, Uid := range uids { + if Uid == int(p.M_DwUin) { continue } - if FriendMod.CheckSendApply(v.Uid) { + if FriendMod.CheckSendApply(Uid) { continue } - if FriendMod.CheckFriend(v.Uid) { + if FriendMod.CheckFriend(Uid) { continue } - PlayerSimpleData := G_GameLogicPtr.GetSimplePlayerByUid(v.Uid) - if GoUtil.Now()-PlayerSimpleData.Loginout > 86400 { + PlayerSimpleData := G_GameLogicPtr.GetSimplePlayerByUid(Uid) + if PlayerSimpleData == nil { continue } - if PlayerSimpleData.Level < 4 { - continue - } - PlayerList1 = append(PlayerList1, v.Uid) + PlayerList1 = append(PlayerList1, Uid) } if len(PlayerList1) == 0 { - for _, v := range PlayerList { - if v.Uid == int(p.M_DwUin) { + for _, Uid := range uids { + if Uid == int(p.M_DwUin) { continue } - PlayerList1 = append(PlayerList1, v.Uid) + PlayerList1 = append(PlayerList1, Uid) } } return GoUtil.RandSliceNum(PlayerList1, Num) diff --git a/src/server/game/gm_handler.go b/src/server/game/gm_handler.go index d9ffdb07..507fe285 100644 --- a/src/server/game/gm_handler.go +++ b/src/server/game/gm_handler.go @@ -273,9 +273,6 @@ func ReqGmCommand_(player *Player, Command string) error { HandleType: MsgMod.HANDLE_MDO_CHAMPSHIP_INRANK, } SendMsgToCenterAsync(m) - case "clearRank": - num, _ := strconv.Atoi(arg[1]) - G_GameLogicPtr.RankMgr.ClearRank(num) case "resetUserInfo": Rank := G_GameLogicPtr.RankMgr.getRank(RANK_TYPE_USER) for _, v := range Rank { diff --git a/src/server/game/rank_mgr.go b/src/server/game/rank_mgr.go index a3bbdbe0..7484a13c 100644 --- a/src/server/game/rank_mgr.go +++ b/src/server/game/rank_mgr.go @@ -8,6 +8,7 @@ import ( GoUtil "server/game_util" "sort" "strconv" + "sync" ) const ( @@ -18,6 +19,8 @@ type RankMgr struct { *ServerMod } +var mu sync.Mutex + type RankData struct { List map[int][]*Rank // 玩家排行榜 Champship map[int][]*Rank // 锦标赛排行榜 @@ -98,29 +101,6 @@ func (r *RankMgr) getRank(RankType int) []*Rank { return []*Rank{} } -func (r *RankMgr) getAllRank(RankType int) []*Rank { - if v, ok := r.getData().List[RankType]; ok { - return v - } - return []*Rank{} -} - -func (r *RankMgr) getMyRank(Uid, RankType int) (int, float64) { - if d, ok := r.getData().List[RankType]; ok { - for k, v := range d { - if v.Uid == Uid { - return k + 1, v.Score - } - } - } - return 0, 0.0 -} - -// 设置榜单数据 -func (r *RankMgr) setRank(RankType int, data []*Rank) { - r.getData().List[RankType] = data -} - // 获取排行榜信息 func (r *RankMgr) getRankInfo(m *msg.Msg) (interface{}, error) { data := m.Extra.(RankMsg) @@ -132,12 +112,10 @@ func (r *RankMgr) getRankInfo(m *msg.Msg) (interface{}, error) { if data.RankType == RANK_TYPE_USER { return r.getRedisCountryRankInfo(m) } - rankList := r.getRank(data.RankType) - MyRank, MyScore := r.getMyRank(m.From, data.RankType) return &RankInfo{ - List: rankList, - MyRank: MyRank, - MyScore: MyScore, + List: []*Rank{}, + MyRank: 0, + MyScore: 0, }, nil } @@ -193,32 +171,6 @@ func (r *RankMgr) getRedisRankInfo(m *msg.Msg) (interface{}, error) { // 进入排行榜 func (r *RankMgr) inRank(m *msg.Msg) (interface{}, error) { data := m.Extra.(RankMsg) - rankList := r.getRank(data.RankType) - inRank := false - for _, v := range rankList { - if v.Uid == data.Uid { - if v.Score < data.Score { - v.Score = data.Score - v.Time = m.SendT - inRank = true - break - } - return nil, nil - } - } - - if !inRank { - rankList = append(rankList, &Rank{Uid: data.Uid, Score: data.Score, Time: m.SendT}) - } - sort.Slice(rankList, func(i, j int) bool { // 排序 从大到小 数值相等按时间排序 - if rankList[i].Score > rankList[j].Score { - return true - } else if rankList[i].Score == rankList[j].Score { - return rankList[i].Time < rankList[j].Time - } - return false - }) - r.setRank(data.RankType, rankList) if data.RankType == RANK_TYPE_USER { // 全球玩家排行榜 Uid := strconv.Itoa(data.Uid) @@ -234,11 +186,3 @@ func (r *RankMgr) inRank(m *msg.Msg) (interface{}, error) { r.update = true return nil, nil } - -func (r *RankMgr) ClearRank(RankType int) { - // if RankType == RANK_TYPE_GLOBAL { - // db.RedisDel(RANK_USER) - // return - // } - r.setRank(RankType, []*Rank{}) -}