diff --git a/src/server/cluster/cluster_func.go b/src/server/cluster/cluster_func.go index 5a157b40..5108b1eb 100644 --- a/src/server/cluster/cluster_func.go +++ b/src/server/cluster/cluster_func.go @@ -143,12 +143,13 @@ func CallServerMsg(m *msg.Msg, serverId int) (*msg.Msg, error) { } v.(network.Agent).WriteMsg(data) // 等待返回(直接接收一次) - timeout := time.After(15 * time.Second) + timeout := time.After(5 * time.Second) select { case backm := <-newChan: if backm == nil { return nil, fmt.Errorf("server %d not response", serverId) } + log.Debug("CallServerMsg reply %v", backm) return backm, nil case <-timeout: return nil, fmt.Errorf("timeout waiting for server %d response", serverId) @@ -169,13 +170,7 @@ 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 { diff --git a/src/server/game/GameLogic.go b/src/server/game/GameLogic.go index c9ced423..397bbd13 100644 --- a/src/server/game/GameLogic.go +++ b/src/server/game/GameLogic.go @@ -286,19 +286,6 @@ func (ad *GameLogic) SetUserData(Uid int, Op int, Data interface{}) { }) } -func (ad *GameLogic) GetUserData(Uid int) *VarUserData { - result, err := ad.FriendMgr.Call(&MsgMod.Msg{ - From: Uid, - To: Uid, - Type: MsgMod.HANDLE_TYPE_VAR_USER_GET, - SendT: GoUtil.Now(), - }) - if err != nil { - return &VarUserData{} - } - return result.(*VarUserData) -} - func (ad *GameLogic) FriendMgrCall(m *MsgMod.Msg) interface{} { result, err := ad.FriendMgr.Call(m) if err != nil { diff --git a/src/server/game/message_mgr.go b/src/server/game/message_mgr.go index 1ebdead8..0c880d47 100644 --- a/src/server/game/message_mgr.go +++ b/src/server/game/message_mgr.go @@ -2,6 +2,7 @@ package game import ( "context" + "encoding/gob" "fmt" "runtime/debug" mergeCluster "server/cluster" @@ -63,6 +64,7 @@ func (m *MessageMgr) MessageMgrInit() { MessageList: make(map[int64]*MessageList), PlayerList: make(map[int64]int), } + gob.Register(msg.VarData{}) // 注册处理函数 m.init() m.handler = make(map[int]MessageHandlerFunc) @@ -85,6 +87,7 @@ func (m *MessageMgr) MessageMgrInit() { m.RegisterHandler(msg.HANDLE_MOD_CATNIP_PARTNER, MessageHandlerFunc(CatnipPartnerHandler)) } else { m.RegisterHandler(msg.HANDLE_MOD_PLAYER_MSG, MessageHandlerFunc(PlayerMsgHandler)) + m.RegisterHandler(msg.HANDLE_MOD_REPLY_PLAYER_MSG, MessageHandlerFunc(PlayerReplyMsgHandler)) m.RegisterHandler(msg.HANDLE_MOD_CLUSTER_SYNC, MessageHandlerFunc(ClusterSyncHandler)) } } @@ -220,8 +223,21 @@ func PlayerMsgHandler(data *msg.Msg) (interface{}, error) { defer p.lock.Unlock() p.Send(data.Clone()) // 处理完后发送消费消息 - data.HandleType = msg.HANDLE_MOD_COMSUME_MSG - go SendMsgToCenterAsync(data) + if data.HandleType == msg.HANDLE_MOD_PLAYER_MSG { + data.HandleType = msg.HANDLE_MOD_COMSUME_MSG + go SendMsgToCenterAsync(data) + } + return nil, nil +} + +func PlayerReplyMsgHandler(data *msg.Msg) (interface{}, error) { + // 先处理同步回调 + if data.UniKey != "" { + if chanel, ok := mergeCluster.CallbackChan[data.UniKey]; ok { + log.Debug("reply message ") + chanel <- data + } + } return nil, nil } @@ -518,7 +534,7 @@ func sendMessageAsync(m *msg.Msg, node int) error { // 同步消息到指定节点 节点不在线则保存消息 func sendMessageSync(m *msg.Msg, node int) (*msg.Msg, error) { msg, err := mergeCluster.CallServerMsg(m, node) - if err != nil { + if err != nil && conf.Server.ServerType == "center" { saveMessage(m) return nil, err } @@ -545,6 +561,13 @@ func GetUserData(PlayerId int64, Key string) (*msg.Msg, error) { return SendMsgToCenterSync(&msg.Msg{ From: int(PlayerId), HandleType: msg.HANDLE_MOD_USER_VAR_GET, - Extra: Key, + Extra: msg.VarData{Key: Key}, + }) +} + +func GetServerData(Key string) (*msg.Msg, error) { + return SendMsgToCenterSync(&msg.Msg{ + HandleType: msg.HANDLE_MOD_VAR_GET, + Extra: msg.VarData{Key: Key}, }) } diff --git a/src/server/game/mod/msg/Msg.go b/src/server/game/mod/msg/Msg.go index 79831422..d8dd02cc 100644 --- a/src/server/game/mod/msg/Msg.go +++ b/src/server/game/mod/msg/Msg.go @@ -32,17 +32,18 @@ var MSG_ZERO_UPDATE = &Msg{Type: SERVER_ZERO_UPDATE} var MSG_NOON_UPDATE = &Msg{Type: SERVER_NOON_UPDATE} const ( - HANDLE_MOD_PLAYER_MSG = 20001 // 玩家消息 - HANDLE_MOD_CLUSTER_MSG = 20002 // 集群消息 - HANDLE_MOD_PLAYER_LOGIN = 20003 // 玩家登录消息 - HANDLE_MOD_COMSUME_MSG = 20004 // 消费消息 - HANDLE_MOD_CLUSTER_SYNC = 20005 // 集群同步消息 - HANDLE_MDO_PLAYER_LOGOUT = 20006 // 玩家登出消息 - HANDLE_MOD_VAR_GET = 20007 // 获取变量 - HANDLE_MOD_VAR_SET = 20008 // 设置变量 - HANDLE_MOD_CATNIP_PARTNER = 20009 // 猫薄荷伙伴 - HANDLE_MOD_USER_VAR_GET = 20010 // 获取玩家变量 - HANDLE_MOD_USER_VAR_SET = 20011 // 设置玩家变量 + HANDLE_MOD_PLAYER_MSG = 20001 // 玩家消息 + HANDLE_MOD_CLUSTER_MSG = 20002 // 集群消息 + HANDLE_MOD_PLAYER_LOGIN = 20003 // 玩家登录消息 + HANDLE_MOD_COMSUME_MSG = 20004 // 消费消息 + HANDLE_MOD_CLUSTER_SYNC = 20005 // 集群同步消息 + HANDLE_MDO_PLAYER_LOGOUT = 20006 // 玩家登出消息 + HANDLE_MOD_VAR_GET = 20007 // 获取变量 + HANDLE_MOD_VAR_SET = 20008 // 设置变量 + HANDLE_MOD_CATNIP_PARTNER = 20009 // 猫薄荷伙伴 + HANDLE_MOD_USER_VAR_GET = 20010 // 获取玩家变量 + HANDLE_MOD_USER_VAR_SET = 20011 // 设置玩家变量 + HANDLE_MOD_REPLY_PLAYER_MSG = 20012 // 回复玩家消息 ) const ( diff --git a/src/server/game/player_back.go b/src/server/game/player_back.go index 839b5b31..906ba679 100644 --- a/src/server/game/player_back.go +++ b/src/server/game/player_back.go @@ -113,7 +113,6 @@ func (p *Player) PlayroomBackData() { ItemId: int32(k), }) } - data := G_GameLogicPtr.GetUserData(int(p.M_DwUin)) r.Dress = Dress r.DressSet = GoUtil.MapIntToInt32(PlayroomMod.GetDressSet()) @@ -156,7 +155,7 @@ func (p *Player) PlayroomBackData() { r.Unlock = PlayroomMod.GetUnlockIds() r.DailyTaskReward = GoUtil.IntToInt32(PlayroomMod.DailyTaskReward) r.DailyTask = PlayroomMod.BackDataTask() - r.Kiss = int32(data.Kiss) + r.Kiss = int32(p.GetPlayroomKiss()) r.Revenge = PlayroomMod.RevengeUid r.InteractNum = int32(PlayroomMod.InteractNum) r.AdItem = AdWatch @@ -195,18 +194,16 @@ func (p *Player) PlayroomVisit(Uid int) { r.Upvote = GoUtil.InArray(Uid, PlayroomMod.UpvoteList) r.Items = Items r.Status = int32(PlayroomMod.GameStatus) - data := G_GameLogicPtr.GetUserData(Uid) - r.UpvoteCount = int32(data.Upvote) - r.Chip = int32(data.Chip) - r.Kiss = int32(data.Kiss) + r.UpvoteCount = int32(p.GetPlayroomUpvote()) + r.Chip = int32(p.GetPlayroomChip()) + r.Kiss = int32(p.GetPlayroomKiss()) r.DressSet = GoUtil.MapIntToInt32(PlayerData.DressSet) p.PushClientRes(r) } func (p *Player) NotifyPlayroomKiss() { - data := G_GameLogicPtr.GetUserData(int(p.M_DwUin)) m := &proto.NotifyPlayroomKiss{ - Kiss: int32(data.Kiss), + Kiss: int32(p.GetPlayroomKiss()), } p.PushClientRes(m) } diff --git a/src/server/game/var.go b/src/server/game/var.go index 0726e3b7..a747f019 100644 --- a/src/server/game/var.go +++ b/src/server/game/var.go @@ -25,11 +25,20 @@ func (p *Player) GetVarData(key string) interface{} { return data.Extra } +func GetServerVarData(key string) interface{} { + data, err := GetServerData(key) + if err != nil { + log.Error("GetServerVarData err : %s", err) + return nil + } + return data.Extra +} + func (p *Player) OpVarDataAsync(key string, value interface{}, opType int) { SendMsgToCenterAsync(&msg.Msg{ From: int(p.M_DwUin), HandleType: msg.HANDLE_MOD_USER_VAR_SET, - Extra: &msg.VarData{ + Extra: msg.VarData{ Key: key, Value: value, SetType: opType, @@ -37,6 +46,32 @@ func (p *Player) OpVarDataAsync(key string, value interface{}, opType int) { }) } +func (p *Player) OpVarDataSync(key string, value interface{}, opType int) (*msg.Msg, error) { + return SendMsgToCenterSync(&msg.Msg{ + From: int(p.M_DwUin), + HandleType: msg.HANDLE_MOD_USER_VAR_SET, + Extra: msg.VarData{ + Key: key, + Value: value, + SetType: opType, + }, + }) +} + +func (p *Player) OpServerVarDataAsync(key string, Value interface{}, opType int) { + SendMsgToCenterSync(&msg.Msg{ + HandleType: msg.HANDLE_MOD_VAR_SET, + Extra: msg.VarData{Key: key, Value: Value, SetType: opType}, + }) +} + +func (p *Player) OpServerVarDataSync(key string, Value interface{}, opType int) (*msg.Msg, error) { + return SendMsgToCenterSync(&msg.Msg{ + HandleType: msg.HANDLE_MOD_VAR_SET, + Extra: msg.VarData{Key: key, Value: Value, SetType: opType}, + }) +} + func (p *Player) SetVarDataAsync(key string, value interface{}) { p.OpVarDataAsync(key, value, msg.VAR_OP_SET) } @@ -61,10 +96,34 @@ func (p *Player) SubPlayroomChip(PlayerId int) { p.SubVarDataAsync(VAR_PLAYROOM_CHIP) } +func (p *Player) GetPlayroomUpvote() int { + data := p.GetVarData(VAR_PLAYROOM_UPVOTE) + if data == nil { + return 0 + } + return data.(int) +} + +func (p *Player) GetPlayroomChip() int { + data := p.GetVarData(VAR_PLAYROOM_CHIP) + if data == nil { + return 0 + } + return data.(int) +} + func (p *Player) SetPlayroomKiss(PlayerId int) { p.SetVarDataAsync(VAR_PLAYROOM_KISS, 1) } +func (p *Player) GetPlayroomKiss() int { + data := p.GetVarData(VAR_PLAYROOM_KISS) + if data == nil { + return 0 + } + return data.(int) +} + func (p *Player) GetGoldCard() *VarGoldCard { data := p.GetVarData(VAR_GOLD_CARD) if data == nil { diff --git a/src/server/game/var_mgr.go b/src/server/game/var_mgr.go index 82f5eccb..9d4fb38b 100644 --- a/src/server/game/var_mgr.go +++ b/src/server/game/var_mgr.go @@ -186,7 +186,7 @@ func SetVarDataHandler(m *msg.Msg) (interface{}, error) { data := getVarData() data.mu.Lock() defer data.mu.Unlock() - if v, ok := m.Extra.(*msg.VarData); ok { + if v, ok := m.Extra.(msg.VarData); ok { ved, ok := data.NewVar[v.Key] if !ok { ved = &VarExpireData{} @@ -237,7 +237,7 @@ func SetUserVarDataHandler(m *msg.Msg) (interface{}, error) { data := getVarData() data.mu.Lock() defer data.mu.Unlock() - if v, ok := m.Extra.(*msg.VarData); ok { + if v, ok := m.Extra.(msg.VarData); ok { varData := data.NewUseVar[m.From] if varData == nil { varData = make(map[string]*VarExpireData) @@ -278,7 +278,7 @@ func SetUserVarDataHandler(m *msg.Msg) (interface{}, error) { func GetVarDataHandler(m *msg.Msg) (interface{}, error) { data := getVarData() - if v, ok := m.Extra.(*msg.VarData); ok { + if v, ok := m.Extra.(msg.VarData); ok { if varData, ok := data.NewVar[v.Key]; ok { return varData.D, nil }