diff --git a/src/server/cluster/cluster_func.go b/src/server/cluster/cluster_func.go index f22ff9d6..2571144d 100644 --- a/src/server/cluster/cluster_func.go +++ b/src/server/cluster/cluster_func.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/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/cluster_mgr.go b/src/server/game/cluster_mgr.go index e3b1ba4e..98374e2f 100644 --- a/src/server/game/cluster_mgr.go +++ b/src/server/game/cluster_mgr.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/friend_mgr.go b/src/server/game/friend_mgr.go index 787a598a..79ea8061 100644 --- a/src/server/game/friend_mgr.go +++ b/src/server/game/friend_mgr.go @@ -93,6 +93,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 { @@ -276,3 +277,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/game_type.go b/src/server/game/game_type.go index f9ac9e07..47e1f73a 100644 --- a/src/server/game/game_type.go +++ b/src/server/game/game_type.go @@ -111,4 +111,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 b5bacc71..c8592553 100644 --- a/src/server/game/mod/msg/Msg.go +++ b/src/server/game/mod/msg/Msg.go @@ -113,6 +113,7 @@ const ( HANDLE_TYPE_CHAMPSHIP_RANK_INFO // 锦标赛排名信息 HANDLE_TYPE_SET_CATNIP_PARTNER // 设置猫薄荷伙伴 HANDLE_TYPE_CATNIP_SEND_EMOJI // 发送猫薄荷表情 + HANDLE_TYPE_CHAMPSHIP_MY_RANK // 锦标赛我的排名 ) const ( @@ -127,15 +128,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, } } diff --git a/src/server/game_util/GoUtil.go b/src/server/game_util/GoUtil.go index 494b9b8c..b5ca11dd 100644 --- a/src/server/game_util/GoUtil.go +++ b/src/server/game_util/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) }