From 38d6f14b9540931e367d6da4184bb3dc9bf61cb0 Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Tue, 29 Apr 2025 14:20:01 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=8E=A9=E5=AE=B6=E5=85=A8?= =?UTF-8?q?=E6=9C=8D=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/GoUtil/GoUtil.go | 12 ++++++++ src/server/MergeConst/ErrorCode.go | 4 ++- src/server/cluster/Cluster.go | 2 +- src/server/cluster/ClusterFunc.go | 41 ++++++++++++++++++++++++++ src/server/conf/server.json | 3 +- src/server/game/FriendMgr.go | 41 ++++++++++++++++++++++++-- src/server/game/PlayerBack.go | 13 +++++++- src/server/game/RegisterNetworkFunc.go | 12 +++++++- src/server/game/Type.go | 12 ++++++++ src/server/game/VarMgr.go | 41 +++++++++++++++++++++----- src/server/game/mod/msg/Msg.go | 22 ++++++++------ 11 files changed, 179 insertions(+), 24 deletions(-) diff --git a/src/server/GoUtil/GoUtil.go b/src/server/GoUtil/GoUtil.go index 9f6db1bf..9cf4cbf1 100644 --- a/src/server/GoUtil/GoUtil.go +++ b/src/server/GoUtil/GoUtil.go @@ -4,6 +4,7 @@ import ( "bytes" "crypto/aes" "crypto/cipher" + "crypto/md5" crand "crypto/rand" "encoding/base64" "encoding/gob" @@ -283,3 +284,14 @@ func Compare(x int, condition string, y int) bool { return false } } + +func UniKey(seed string) string { + hash := md5.New() + timestamp := strconv.FormatInt(time.Now().UnixNano(), 10) + io.WriteString(hash, seed+timestamp) + return fmt.Sprintf("%x", hash.Sum(nil)) +} + +func GetUserKey(Uid int64) string { + return fmt.Sprintf("user_data_%d", Uid) +} diff --git a/src/server/MergeConst/ErrorCode.go b/src/server/MergeConst/ErrorCode.go index 78eb002b..84177da7 100644 --- a/src/server/MergeConst/ErrorCode.go +++ b/src/server/MergeConst/ErrorCode.go @@ -94,10 +94,12 @@ const G_Champion_settlement_Duration = 3600 * 23 const G_Champion_Unlock_Score = 2 const G_Champion_Max_Score = 44650 const G_Champion_People_Cnt = 50 - +const SUCCESS = 1 const ( ORDER_STATUS_IDLE = 0 // 订单未完成 ORDER_STATUS_PAY = 1 // 订单已支付 ORDER_STATUS_CANCEL = 2 // 订单取消 ORDER_STATUS_SHIP = 3 // 订单已发货 ) + +const GLOBAL_SERVER_ID = 0 // 全局服ID diff --git a/src/server/cluster/Cluster.go b/src/server/cluster/Cluster.go index 046312d0..254f623a 100644 --- a/src/server/cluster/Cluster.go +++ b/src/server/cluster/Cluster.go @@ -16,7 +16,7 @@ const ( ) var FuncMap = map[int]func(*Agent, *msg.Msg) error{} // 消息处理函数 - +var CallbackChan = make(map[string]chan *msg.Msg) // 回调消息队列 var ( server *network.TCPServer // 服务器 Center *network.TCPClient // 集群中心 diff --git a/src/server/cluster/ClusterFunc.go b/src/server/cluster/ClusterFunc.go index df03a6fb..6bdcd475 100644 --- a/src/server/cluster/ClusterFunc.go +++ b/src/server/cluster/ClusterFunc.go @@ -125,6 +125,32 @@ func SendServerMsg(m *msg.Msg, serverId int) error { return fmt.Errorf("server %d not online", serverId) } +func CallServerMsg(m *msg.Msg, serverId int) (*msg.Msg, error) { + if v, ok := serverAgent.Load(serverId); ok { + data, err := GoUtil.GobMarshal(m) + if err != nil { + log.Debug("CallServerMsg GobMarshal err %v", err) + return nil, err + } + v.(network.Agent).WriteMsg(data) + } + m.UniKey = GoUtil.UniKey("clusterGlobal") + newChan := make(chan *msg.Msg, 1) + registerChanel(m.UniKey, newChan) + timeout := time.After(15 * time.Second) + select { + case <-newChan: + backm := <-newChan + unregisterChanel(m.UniKey) + if backm == nil { + return nil, fmt.Errorf("server %d not response", serverId) + } + return backm, nil + case <-timeout: + return nil, fmt.Errorf("timeout waiting for server %d response", serverId) + } +} + func SendMsgAll(m *msg.Msg) { data, err := GoUtil.GobMarshal(m) if err != nil { @@ -139,6 +165,13 @@ func SendMsgAll(m *msg.Msg) { func processMsg(a *Agent, m *msg.Msg) error { var err error + // 先处理同步回调 + if m.UniKey != "" { + if chanel, ok := CallbackChan[m.UniKey]; ok { + chanel <- m + } + return nil + } if fun, ok := FuncMap[m.Type]; ok { err = fun(a, m) } else { @@ -151,6 +184,14 @@ func registerFunc(key int, fun func(*Agent, *msg.Msg) error) { FuncMap[key] = fun } +func registerChanel(key string, chanel chan *msg.Msg) { + CallbackChan[key] = chanel +} + +func unregisterChanel(key string) { + delete(CallbackChan, key) +} + func sendGameMsg(m *msg.Msg) { MsgChan <- m } diff --git a/src/server/conf/server.json b/src/server/conf/server.json index 437c0371..55c38dba 100644 --- a/src/server/conf/server.json +++ b/src/server/conf/server.json @@ -15,7 +15,8 @@ "TELOGDIR" : "./teLog/", "GameName": "pet_home_local", - "GameID": 1, + "ListenAddr": ":3001", + "CenterAddr": ":3000", "ServerType":"node", "ServerID": 1, diff --git a/src/server/game/FriendMgr.go b/src/server/game/FriendMgr.go index bc14c816..1c24a337 100644 --- a/src/server/game/FriendMgr.go +++ b/src/server/game/FriendMgr.go @@ -4,6 +4,7 @@ import ( "encoding/gob" "fmt" "server/GoUtil" + "server/MergeConst" mergeCluster "server/cluster" "server/conf" "server/game/mod/card" @@ -73,6 +74,9 @@ func (f *FriendMgr) Init() { f.RegisterHandler(msg.HANDLE_TYPE_CHAMPSHIP_RESULT, f.sendToPlayer) f.RegisterHandler(msg.HANDLE_TYPE_TREASURE_RESULT, f.sendToPlayer) f.RegisterHandler(msg.HANDLE_TYPE_FACEBOOK_UNBIND, f.sendToPlayer) + + f.RegisterHandler(msg.HANDLE_TYPE_VAR_USER_GET, f.GetVarUserData) + f.RegisterHandler(msg.HANDLE_TYPE_VAR_USER_SET, f.SetVarUserData) } func (f *FriendMgr) getData() *FirendData { @@ -115,6 +119,31 @@ func (f *FriendMgr) sync(m *msg.Msg) (interface{}, error) { return data, nil } +func (f *FriendMgr) GetVarUserData(m *msg.Msg) (interface{}, error) { + Key := GoUtil.GetUserKey(int64(m.To)) + data := G_GameLogicPtr.VarMgr.GetUserVar(Key) + if data == nil { + data = &VarUserData{ + Upvote: 0, + } + } + return data, nil +} + +func (f *FriendMgr) SetVarUserData(m *msg.Msg) (interface{}, error) { + VarOp := m.Extra.(VarOpration) + Key := GoUtil.GetUserKey(int64(m.To)) + data := G_GameLogicPtr.VarMgr.GetUserVar(Key) + switch VarOp.Type { + case VAR_OP_UPVOTE: + data.Upvote++ + } + return &VarOpration{ + Data: data, + Code: MergeConst.SUCCESS, + }, nil +} + // 发送消息给玩家 func sendToPlayer(m *msg.Msg) error { p := G_GameLogicPtr.GetPlayer(int64(m.To)) @@ -132,19 +161,16 @@ func FriendMgrSend(m1 *msg.Msg) error { err := mergeCluster.SendServerMsg(m, ToServer) if err != nil { // 区服不在线 G_GameLogicPtr.FriendMgrSend(m) - //log.Debug("send to server %d error : %s\n", ToServer, err) return err } return nil } - //log.Debug("send to server %d success, %d", ToServer, conf.Server.ServerID) G_GameLogicPtr.FriendMgrSend(m) return nil } // 集群好友消息同步 func ClusterFriendSync(m *msg.Msg) error { - log.Debug("ClusterFriendSync") if v, ok := G_GameLogicPtr.FriendMgr.getData().ClusterMsg[m.To]; ok { for _, msg := range v { if msg.H == 1 { @@ -160,5 +186,14 @@ func ClusterFriendSync(m *msg.Msg) error { } func FriendMgrCall(m *msg.Msg) interface{} { + ToServer := GoUtil.GetServerIdByUid(m.To) + if ToServer != conf.Server.ServerID { + r, err := mergeCluster.CallServerMsg(m, ToServer) + if err != nil { // 区服不在线 + log.Debug("FriendMgrCall err %v", err) + return nil + } + return r + } return G_GameLogicPtr.FriendMgrCall(m.Clone()) } diff --git a/src/server/game/PlayerBack.go b/src/server/game/PlayerBack.go index 3a2b718c..bba043cc 100644 --- a/src/server/game/PlayerBack.go +++ b/src/server/game/PlayerBack.go @@ -3,6 +3,7 @@ package game import ( "server/GoUtil" "server/game/mod/item" + "server/game/mod/msg" proto "server/msg" ) @@ -133,6 +134,16 @@ func PlayroomVisit(p *Player, Uid int) { r.Upvote = GoUtil.InArray(Uid, PlayroomMod.UpvoteList) r.Items = Items r.Status = int32(PlayroomMod.GameStatus) - r.UpvoteCount = int32(PlayerData.Upvote) + data := FriendMgrCall(&msg.Msg{ + From: int(p.M_DwUin), + To: Uid, + Type: msg.HANDLE_TYPE_VAR_USER_GET, + }) + if data == nil { + data = &VarUserData{ + Upvote: 0, + } + } + r.UpvoteCount = int32(data.(*VarUserData).Upvote) p.PushClientRes(r) } diff --git a/src/server/game/RegisterNetworkFunc.go b/src/server/game/RegisterNetworkFunc.go index 5a320441..737e0b01 100644 --- a/src/server/game/RegisterNetworkFunc.go +++ b/src/server/game/RegisterNetworkFunc.go @@ -2549,6 +2549,7 @@ func ReqFriendTLUpvote(player *Player, buf []byte) error { }) return err } + // 添加时间线 m := &MsqMod.Msg{ Type: MsqMod.HANDLE_TYPE_HANDBOOK_UPVOTE, From: int(player.M_DwUin), @@ -2556,6 +2557,15 @@ func ReqFriendTLUpvote(player *Player, buf []byte) error { SendT: GoUtil.Now(), } FriendMgrSend(m) + // 添加记录 + m1 := &MsqMod.Msg{ + Type: MsqMod.HANDLE_TYPE_VAR_USER_SET, + From: int(player.M_DwUin), + To: int(FUid), + SendT: GoUtil.Now(), + Extra: VarOpration{Type: VAR_OP_UPVOTE}, + } + FriendMgrSend(m1) player.PlayMod.save() player.PushClientRes(&msg.ResFriendTLUpvote{ Code: msg.RES_CODE_SUCCESS, @@ -3059,7 +3069,7 @@ func ReqRaceReward(player *Player, buf []byte) error { // 请求playroom基础数据 func ReqPlayroom(player *Player, buf []byte) error { - PlayroomBackData(player) + // PlayroomBackData(player) return nil } diff --git a/src/server/game/Type.go b/src/server/game/Type.go index bbec70a7..95398077 100644 --- a/src/server/game/Type.go +++ b/src/server/game/Type.go @@ -33,6 +33,17 @@ type VarGoldCard struct { Five int } +type VarOpration struct { + Type int + Key string + Data interface{} + Code int +} + +type VarUserData struct { + Upvote int +} + const ( ACT_STATUS_NOT_START = 0 ACT_STATUS_START = 1 @@ -67,4 +78,5 @@ func init() { gob.Register(&limitedTimeEvent.LuckyCat{}) gob.Register(&msg.HandbookMsg{}) gob.Register(&limitedTimeEvent.CatTrick{}) + gob.Register(&VarOpration{}) } diff --git a/src/server/game/VarMgr.go b/src/server/game/VarMgr.go index 4bc3c84e..4b52a9be 100644 --- a/src/server/game/VarMgr.go +++ b/src/server/game/VarMgr.go @@ -5,6 +5,7 @@ import ( "server/GoUtil" "server/game/mod/card" "server/game/mod/msg" + "sync" "time" ) @@ -14,28 +15,36 @@ type VarMgr struct { type VarData struct { Var map[string]interface{} + UserVar sync.Map ZeroTime int64 } const ( - VAR_GOLD_CARD = "gold_card" + VAR_GOLD_CARD = "gold_card" + VAR_PLAYROOM_UPVOTE = "playroom_upvote" + VAR_USER_DATA = "user_data" +) + +const ( + VAR_OP_UPVOTE = 1 ) func (f *VarMgr) Init() { gob.Register(&VarGoldCard{}) f.key = VAR_MGR_KEY f.data = &VarData{ - Var: make(map[string]interface{}), + Var: map[string]interface{}{}, } // 注册处理函数 f.init() - if f.getData().Var == nil { - f.getData().Var = make(map[string]interface{}) + if f.data.(*VarData).Var == nil { + f.data.(*VarData).Var = make(map[string]interface{}) } if f.getData().ZeroTime == GoUtil.ZeroTimestamp() { f.ZeroUpdate(&msg.Msg{}) } f.RegisterHandler(msg.SERVER_ZERO_UPDATE, f.ZeroUpdate) + f.mDispatr.AfterFunc(time.Duration(GoUtil.NextZeroTimestampDuration())*time.Second, func() { f.Send(&msg.Msg{ Type: msg.SERVER_ZERO_UPDATE, @@ -43,6 +52,10 @@ func (f *VarMgr) Init() { }) } +func (f *VarMgr) SetGlobalData(m *msg.Msg) (interface{}, error) { + return nil, nil +} + func (f *VarMgr) ZeroUpdate(m *msg.Msg) (interface{}, error) { f.getData().ZeroTime = GoUtil.ZeroTimestamp() // 随机生成两个金卡 @@ -55,15 +68,29 @@ func (f *VarMgr) ZeroUpdate(m *msg.Msg) (interface{}, error) { } func (f *VarMgr) SetVar(key string, value interface{}) { - f.getData().Var[key] = value + f.getData().UserVar.Store(key, value) } func (f *VarMgr) GetVar(key string) interface{} { - return f.getData().Var[key] + value, _ := f.getData().UserVar.Load(key) + return value +} + +func (f *VarMgr) SetUserVar(key string, value *VarUserData) { + f.getData().UserVar.Store(key, value) +} + +func (f *VarMgr) GetUserVar(key string) *VarUserData { + value, _ := f.getData().UserVar.Load(key) + if value == nil { + value = &VarUserData{} + f.getData().UserVar.Store(key, value) + } + return value.(*VarUserData) } func (f *VarMgr) DelVar(key string) { - delete(f.getData().Var, key) + f.getData().UserVar.Delete(key) } func (f *VarMgr) getData() *VarData { diff --git a/src/server/game/mod/msg/Msg.go b/src/server/game/mod/msg/Msg.go index 41bf9c11..637d95c8 100644 --- a/src/server/game/mod/msg/Msg.go +++ b/src/server/game/mod/msg/Msg.go @@ -3,15 +3,16 @@ package msg import "server/game/mod/item" type Msg struct { - Type int // 消息类型 - To int // 接收者 - From int // 发送者 - Item []*item.Item // 物品 - SendT int64 // 发送时间 - End int64 // 过期时间 - Extra interface{} //额外信息 - Id int64 - H int //处理类型 + Type int // 消息类型 + To int // 接收者 + From int // 发送者 + Item []*item.Item // 物品 + SendT int64 // 发送时间 + End int64 // 过期时间 + Extra interface{} //额外信息 + Id int64 + UniKey string // 回调监听唯一键值 + H int //处理类型 } var MSG_ZERO_UPDATE = &Msg{Type: SERVER_ZERO_UPDATE} @@ -86,6 +87,9 @@ const ( HANDLE_TYPE_TREASURE_RESULT //宝藏结果 HANDLE_TYPE_FACEBOOK_UNBIND //facebook解绑 + + HANDLE_TYPE_VAR_USER_SET // 设置玩家数据 + HANDLE_TYPE_VAR_USER_GET // 获取玩家数据 ) const (