From ca4a593d69f3f2442a2cbe43baef074b1b640a89 Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Mon, 1 Dec 2025 15:17:07 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E9=9B=86=E7=BE=A4=E6=9E=B6=E6=9E=84?= =?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/ClusterFunc.go | 2 +- src/server/conf/json.go | 1 + src/server/conf/server.json | 5 ++++- src/server/game/ClusterMgr.go | 16 ++++++++++++++++ src/server/game/FriendMgr.go | 11 +++++++++++ src/server/game/mod/msg/Msg.go | 4 ++++ 6 files changed, 37 insertions(+), 2 deletions(-) diff --git a/src/server/cluster/ClusterFunc.go b/src/server/cluster/ClusterFunc.go index 6bdcd475..b610540b 100644 --- a/src/server/cluster/ClusterFunc.go +++ b/src/server/cluster/ClusterFunc.go @@ -126,6 +126,7 @@ func SendServerMsg(m *msg.Msg, serverId int) error { } func CallServerMsg(m *msg.Msg, serverId int) (*msg.Msg, error) { + m.UniKey = GoUtil.UniKey(fmt.Sprintf("%v,Cluster Msg", m)) if v, ok := serverAgent.Load(serverId); ok { data, err := GoUtil.GobMarshal(m) if err != nil { @@ -134,7 +135,6 @@ func CallServerMsg(m *msg.Msg, serverId int) (*msg.Msg, error) { } 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) diff --git a/src/server/conf/json.go b/src/server/conf/json.go index 471018f0..64bd3ec7 100644 --- a/src/server/conf/json.go +++ b/src/server/conf/json.go @@ -47,6 +47,7 @@ var Server struct { ListenAddr string CenterAddr string + CenterNode int RemoteAddr string GameConfPath string diff --git a/src/server/conf/server.json b/src/server/conf/server.json index e139badd..c6779e49 100644 --- a/src/server/conf/server.json +++ b/src/server/conf/server.json @@ -24,6 +24,10 @@ "ServerStatus" : 1, "ServerCenter" : 1, "GameConfPath": "D:/Github/pet_home_server/src/server/gamedata/config/", + + "ListenAddr":":9001", + "CenterAddr": "pethome.bywaystudios.com:9000", + "RemoteAddr":"host.docker.internal:9001", "RedisAddr":"127.0.0.1", "RedisPort" :"6379", @@ -35,7 +39,6 @@ "RedisConnType":"Direct", "GoogleVerify":false, - "RemoteAddr":"host.docker.internal:9001", "Partition":3, "KafkaHost":"kafka-server", "CountryCode":"004", diff --git a/src/server/game/ClusterMgr.go b/src/server/game/ClusterMgr.go index 6eec04b3..e3b1ba4e 100644 --- a/src/server/game/ClusterMgr.go +++ b/src/server/game/ClusterMgr.go @@ -37,4 +37,20 @@ func init() { RegisterClusterHandler(msg.HANDLE_TYPE_REQ_CARD, FriendMgrSend) RegisterClusterHandler(msg.HANDLE_TYPE_AGREE_CARD, FriendMgrSend) RegisterClusterHandler(msg.CLUSTER_FRIEND_SYNC, ClusterFriendSync) + RegisterClusterHandler(msg.HANDLE_TYPE_CHAMPSHIP_INRANK, champshipInrankHandler) + RegisterClusterHandler(msg.HANDLE_TYPE_CHAMPSHIP_RANK_INFO, champshipRankInfoHandler) +} + +func champshipInrankHandler(m *msg.Msg) error { + G_GameLogicPtr.ChampshipMgrSend(m) + return nil +} + +func champshipRankInfoHandler(m *msg.Msg) error { + data := G_GameLogicPtr.ChampshipMgrCall(m) + m.To = m.From + m.From = 0 + m.Extra = data + FriendMgrSend(m) + return nil } diff --git a/src/server/game/FriendMgr.go b/src/server/game/FriendMgr.go index 033029a3..b571cc37 100644 --- a/src/server/game/FriendMgr.go +++ b/src/server/game/FriendMgr.go @@ -90,6 +90,8 @@ func (f *FriendMgr) Init() { f.RegisterHandler(msg.HANDLE_TYPE_VAR_USER_SET, f.SetVarUserData) f.RegisterHandler(msg.HANDLE_TYPE_VAR_EXPIRE_SET, f.SetExpireVarData) + + f.RegisterHandler(msg.HANDLE_TYPE_CHAMPSHIP_LOGIN, f.SendMsgToCenter) } func (f *FriendMgr) getData() *FirendData { @@ -252,6 +254,15 @@ func ClusterFriendSync(m *msg.Msg) error { return nil } +// 异步发送消息给中心服 +func (f *FriendMgr) SendMsgToCenter(m *msg.Msg) (interface{}, error) { + return nil, mergeCluster.SendServerMsg(m, conf.Server.CenterNode) +} + +func (f *FriendMgr) CallMsgToCenter(m *msg.Msg) (interface{}, error) { + return mergeCluster.CallServerMsg(m, conf.Server.CenterNode) +} + func FriendMgrCall(m *msg.Msg) interface{} { ToServer := GoUtil.GetServerIdByUid(m.To) if ToServer != conf.Server.ServerID { diff --git a/src/server/game/mod/msg/Msg.go b/src/server/game/mod/msg/Msg.go index fdbc64ea..269987be 100644 --- a/src/server/game/mod/msg/Msg.go +++ b/src/server/game/mod/msg/Msg.go @@ -107,6 +107,10 @@ const ( HANDLE_TYPE_FRIEND_GREETING_REPLY // 好友问候回复 HANDLE_TYPE_FRIEND_SPONSOER // 好友赞助体力 + + HANDLE_TYPE_CHAMPSHIP_LOGIN // 锦标赛登录 + HANDLE_TYPE_CHAMPSHIP_RANK_INFO // 锦标赛排名信息 + ) const ( From 8c5b63a49aace4f887011edcc8c13c75e8f45d3c Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Mon, 1 Dec 2025 18:45:22 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E9=9B=86=E7=BE=A4=E6=9E=B6=E6=9E=84?= =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + src/server/cluster/ClusterFunc.go | 19 +++++++++++++------ src/server/game/FriendMgr.go | 9 +++++++++ src/server/game/Type.go | 1 + src/server/game/mod/msg/Msg.go | 1 + 5 files changed, 25 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index e65e11c5..fea300b4 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,4 @@ src/server/unit_test.go src/server/teLog/* src/server/teLog/log.2024-11-28 src/server/logs/ga_log/*.log +src/server/conf/server.json diff --git a/src/server/cluster/ClusterFunc.go b/src/server/cluster/ClusterFunc.go index b610540b..1e1ef822 100644 --- a/src/server/cluster/ClusterFunc.go +++ b/src/server/cluster/ClusterFunc.go @@ -127,6 +127,13 @@ func SendServerMsg(m *msg.Msg, serverId int) error { func CallServerMsg(m *msg.Msg, serverId int) (*msg.Msg, error) { m.UniKey = GoUtil.UniKey(fmt.Sprintf("%v,Cluster Msg", m)) + + // 先注册回调通道,避免发送出去后对方快速返回导致丢失 + newChan := make(chan *msg.Msg, 1) + registerChanel(m.UniKey, newChan) + defer unregisterChanel(m.UniKey) + + // 之后再发送消息 if v, ok := serverAgent.Load(serverId); ok { data, err := GoUtil.GobMarshal(m) if err != nil { @@ -134,14 +141,14 @@ func CallServerMsg(m *msg.Msg, serverId int) (*msg.Msg, error) { return nil, err } v.(network.Agent).WriteMsg(data) + } else { + return nil, fmt.Errorf("server %d not online", serverId) } - newChan := make(chan *msg.Msg, 1) - registerChanel(m.UniKey, newChan) + + // 等待返回(直接接收一次) timeout := time.After(15 * time.Second) select { - case <-newChan: - backm := <-newChan - unregisterChanel(m.UniKey) + case backm := <-newChan: if backm == nil { return nil, fmt.Errorf("server %d not response", serverId) } @@ -169,8 +176,8 @@ func processMsg(a *Agent, m *msg.Msg) error { if m.UniKey != "" { if chanel, ok := CallbackChan[m.UniKey]; ok { chanel <- m + return nil } - return nil } if fun, ok := FuncMap[m.Type]; ok { err = fun(a, m) diff --git a/src/server/game/FriendMgr.go b/src/server/game/FriendMgr.go index b571cc37..97bfa892 100644 --- a/src/server/game/FriendMgr.go +++ b/src/server/game/FriendMgr.go @@ -92,6 +92,7 @@ func (f *FriendMgr) Init() { f.RegisterHandler(msg.HANDLE_TYPE_VAR_EXPIRE_SET, f.SetExpireVarData) f.RegisterHandler(msg.HANDLE_TYPE_CHAMPSHIP_LOGIN, f.SendMsgToCenter) + f.RegisterHandler(msg.HANDLE_TYPE_CHAMPSHIP_INRANK, f.SendMsgToCenter) } func (f *FriendMgr) getData() *FirendData { @@ -275,3 +276,11 @@ func FriendMgrCall(m *msg.Msg) interface{} { } return G_GameLogicPtr.FriendMgrCall(m.Clone()) } + +func SendMsgToCenter(m *msg.Msg) error { + return mergeCluster.SendServerMsg(m, conf.Server.CenterNode) +} + +func CallMsgToCenter(m *msg.Msg) (interface{}, error) { + return mergeCluster.CallServerMsg(m, conf.Server.CenterNode) +} diff --git a/src/server/game/Type.go b/src/server/game/Type.go index 9ff8994d..31200159 100644 --- a/src/server/game/Type.go +++ b/src/server/game/Type.go @@ -110,4 +110,5 @@ func init() { gob.Register(&GameResult{}) gob.Register(&CatnipMsg{}) gob.Register(&CatnipLock{}) + gob.Register(CRank{}) } diff --git a/src/server/game/mod/msg/Msg.go b/src/server/game/mod/msg/Msg.go index 269987be..a5a1c4ba 100644 --- a/src/server/game/mod/msg/Msg.go +++ b/src/server/game/mod/msg/Msg.go @@ -110,6 +110,7 @@ const ( HANDLE_TYPE_CHAMPSHIP_LOGIN // 锦标赛登录 HANDLE_TYPE_CHAMPSHIP_RANK_INFO // 锦标赛排名信息 + HANDLE_TYPE_CHAMPSHIP_MY_RANK // 锦标赛我的排名 ) From 4dc6dcbee70d7045ed180e7ed13ec0171d66c1a8 Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Mon, 1 Dec 2025 18:47:17 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E9=9B=86=E7=BE=A4=E6=9E=B6=E6=9E=84?= =?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/GoUtil/GoUtil.go | 6 ++++++ src/server/game/ClusterMgr.go | 10 ++++++++++ src/server/game/mod/msg/Msg.go | 19 ++++++++++--------- 3 files changed, 26 insertions(+), 9 deletions(-) diff --git a/src/server/GoUtil/GoUtil.go b/src/server/GoUtil/GoUtil.go index 494b9b8c..b5ca11dd 100644 --- a/src/server/GoUtil/GoUtil.go +++ b/src/server/GoUtil/GoUtil.go @@ -238,6 +238,12 @@ func GobUnmarshal(data []byte, obj interface{}) error { } func GetServerIdByUid(uid int) int { + if uid <= 100000 { + return uid + } + if uid <= 100000000 { + return uid / 100000 + } return int((uid % 100000000) / 100000) } diff --git a/src/server/game/ClusterMgr.go b/src/server/game/ClusterMgr.go index e3b1ba4e..98374e2f 100644 --- a/src/server/game/ClusterMgr.go +++ b/src/server/game/ClusterMgr.go @@ -39,6 +39,7 @@ func init() { RegisterClusterHandler(msg.CLUSTER_FRIEND_SYNC, ClusterFriendSync) RegisterClusterHandler(msg.HANDLE_TYPE_CHAMPSHIP_INRANK, champshipInrankHandler) RegisterClusterHandler(msg.HANDLE_TYPE_CHAMPSHIP_RANK_INFO, champshipRankInfoHandler) + RegisterClusterHandler(msg.HANDLE_TYPE_CHAMPSHIP_MY_RANK, champshipMyRankHandler) } func champshipInrankHandler(m *msg.Msg) error { @@ -54,3 +55,12 @@ func champshipRankInfoHandler(m *msg.Msg) error { FriendMgrSend(m) return nil } + +func champshipMyRankHandler(m *msg.Msg) error { + MyRank := G_GameLogicPtr.ChampshipMgr.getMyRank(m.From) + m.To = m.From + m.From = 0 + m.Extra = MyRank + FriendMgrSend(m) + return nil +} diff --git a/src/server/game/mod/msg/Msg.go b/src/server/game/mod/msg/Msg.go index a5a1c4ba..3e5d89ef 100644 --- a/src/server/game/mod/msg/Msg.go +++ b/src/server/game/mod/msg/Msg.go @@ -126,15 +126,16 @@ const ( func (m *Msg) Clone() *Msg { return &Msg{ - Type: m.Type, - To: m.To, - From: m.From, - Item: m.Item, - SendT: m.SendT, - End: m.End, - Extra: m.Extra, - Id: m.Id, - H: m.H, + Type: m.Type, + To: m.To, + From: m.From, + Item: m.Item, + SendT: m.SendT, + End: m.End, + Extra: m.Extra, + Id: m.Id, + H: m.H, + UniKey: m.UniKey, } } From 91e5b48fe5c1231666386c937a50da16a9ef82ce Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Tue, 2 Dec 2025 10:09:21 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E9=9B=86=E7=BE=A4=E6=9E=B6=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/conf/server.json | 6 ++--- src/server/game/UnitTest.go | 49 +++++++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+), 3 deletions(-) diff --git a/src/server/conf/server.json b/src/server/conf/server.json index c6779e49..d77d57cb 100644 --- a/src/server/conf/server.json +++ b/src/server/conf/server.json @@ -22,12 +22,12 @@ "ServerOpenTime": "2018-01-01 00:00:00", "ServerName": "Merge_Pet", "ServerStatus" : 1, - "ServerCenter" : 1, + "ServerCenter" : 0, "GameConfPath": "D:/Github/pet_home_server/src/server/gamedata/config/", "ListenAddr":":9001", - "CenterAddr": "pethome.bywaystudios.com:9000", - "RemoteAddr":"host.docker.internal:9001", + "CenterAddr": "127.0.0.1:9000", + "RemoteAddr":"127.0.0.1:9001", "RedisAddr":"127.0.0.1", "RedisPort" :"6379", diff --git a/src/server/game/UnitTest.go b/src/server/game/UnitTest.go index a7ada801..44fe9c28 100644 --- a/src/server/game/UnitTest.go +++ b/src/server/game/UnitTest.go @@ -3,10 +3,12 @@ package game import ( "fmt" "math" + "server/GoUtil" mergeDataCfg "server/conf/mergeData" orderCfg "server/conf/order" "server/game/mod/decorate" "server/game/mod/item" + MsgMod "server/game/mod/msg" "server/game/mod/order" "server/game/mod/quest" "server/msg" @@ -371,3 +373,50 @@ func UnitOrderPetReward(p *Player) error { } return nil } + +func UnitClusterChampship(p *Player) error { + ChampshipMod := p.PlayMod.getChampshipMod() + Score := float64(ChampshipMod.GetScore()) + //更新排行榜 + m := &MsgMod.Msg{ + Type: MsgMod.HANDLE_TYPE_CHAMPSHIP_INRANK, + SendT: GoUtil.Now(), + Extra: CRank{ + Uid: int(p.M_DwUin), + Score: Score, + H: ChampshipMod.GetH(), + N: ChampshipMod.GetN(), + }, + } + + time.Sleep(5 * time.Second) + SendMsgToCenter(m) + <-p.msgChan + return nil +} + +func UnitClusterChampshipCall(p *Player) error { + ChampshipMod := p.PlayMod.getChampshipMod() + Score := float64(ChampshipMod.GetScore()) + //更新排行榜 + m := &MsgMod.Msg{ + Type: MsgMod.HANDLE_TYPE_CHAMPSHIP_MY_RANK, + SendT: GoUtil.Now(), + From: int(p.M_DwUin), + Extra: CRank{ + Uid: int(p.M_DwUin), + Score: Score, + H: ChampshipMod.GetH(), + N: ChampshipMod.GetN(), + }, + } + SendMsgToCenter(m) + time.Sleep(5 * time.Second) + r, err := CallMsgToCenter(m) + if err != nil { + log.Debug(err.Error()) + return err + } + fmt.Print(r) + return nil +}