From 3e92be6732e35706d94116282645326b32b8b73f Mon Sep 17 00:00:00 2001 From: zqj <582132116@qq.com> Date: Fri, 6 May 2022 18:30:07 +0800 Subject: [PATCH] fix: 优化协议,除了登录和创建角色接口,其他协议都直接把role数据传递进去。 --- cmd/gameserver/action/RoleAction.go | 58 +++++++++------------------------------------------------- cmd/gameserver/action/protocode.go | 1 - cmd/gameserver/service/agent.go | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++------------------ common/components/icompontents.go | 2 ++ tools/generator.py | 7 +++++++ 5 files changed, 71 insertions(+), 68 deletions(-) diff --git a/cmd/gameserver/action/RoleAction.go b/cmd/gameserver/action/RoleAction.go index 2ec1b38..87900fd 100644 --- a/cmd/gameserver/action/RoleAction.go +++ b/cmd/gameserver/action/RoleAction.go @@ -12,7 +12,7 @@ import ( "pro2d/pb" ) -func HeartRpc(agent components.IAgent, msg components.IMessage) (int32, interface{}) { +func HeartRpc(role *models.RoleModel, msg components.IMessage) (int32, interface{}) { //msg.Conn.SetLastHeartCheckTime() return 0, nil } @@ -36,7 +36,7 @@ func getRandomName() string { return name } -func CreateRpc(agent components.IAgent, msg components.IMessage) (int32, interface{}) { +func CreateRpc(role1 *models.RoleModel, msg components.IMessage) (int32, interface{}) { req := pb.CreateReq{} if err := proto.Unmarshal(msg.GetData(), &req); err != nil { logger.Error("CreateRpc err: %v", err) @@ -63,59 +63,27 @@ func CreateRpc(agent components.IAgent, msg components.IMessage) (int32, interfa return 0, nil } -func LoginRpc(agent components.IAgent, msg components.IMessage) (int32, interface{}) { - //logger.Debug("11111111cmd: %v, msg: %s", msg.GetHeader().GetMsgID(), msg.GetData()) - req := pb.LoginReq{} - if err := proto.Unmarshal(msg.GetData(), &req); err != nil { - logger.Error("loginRpc err: %v", err) - return 1, nil - } - - role := models.RoleExistByUid(req.Token) - if role == nil { - return 2, nil - } - role.SetProperty("Device", req.Device) - protoMsg := &pb.RoleRsp{ - Role: role.Role, - Hero: role.GetAllHero(), - Team: role.GetAllTeam(), - Equipments: role.GetEquipments(), - } - //登录成功,存储agent role - agent.SetSchema(role) - return 0, protoMsg -} - -func ChangeTeamRpc(agent components.IAgent, msg components.IMessage) (int32, interface{}) { +func ChangeTeamRpc(role *models.RoleModel, msg components.IMessage) (int32, interface{}) { req := pb.ChangeTeamReq{} if err := proto.Unmarshal(msg.GetData(), &req); err != nil { logger.Error("loginRpc err: %v", err) return 1, nil } - role := agent.GetSchema().(*models.RoleModel) - if role == nil { - return 2, nil - } role.UpdateTeam(req.Team) return 0, nil } -func HeroEquipReferRpc(agent components.IAgent, msg components.IMessage) (int32, interface{}) { +func HeroEquipReferRpc(role *models.RoleModel, msg components.IMessage) (int32, interface{}) { req := pb.HeroEquipReferReq{} if err := proto.Unmarshal(msg.GetData(), &req); err != nil { logger.Error("loginRpc err: %v", err) return 1, nil } - role := agent.GetSchema().(*models.RoleModel) - if role == nil { - return 2, nil - } e, ok := role.Equipments[req.EquipId] if !ok { - return 3, nil + return 2, nil } equip := e.(*models.EquipModel) @@ -150,38 +118,30 @@ func HeroEquipReferRpc(agent components.IAgent, msg components.IMessage) (int32, return 0, nil } -func RoleClearItemsRpc(agent components.IAgent, msg components.IMessage) (int32, interface{}) { +func RoleClearItemsRpc(role *models.RoleModel, msg components.IMessage) (int32, interface{}) { req := pb.RoleClearItemsReq{} if err := proto.Unmarshal(msg.GetData(), &req); err != nil { logger.Error("loginRpc err: %v", err) return 1, nil } - role := agent.GetSchema().(*models.RoleModel) - if role == nil { - return 2, nil - } if !role.CostItem(req.Id, req.Count) { logger.Error("cost err: %s, %d", req.Id, req.Count) - return 3, nil + return 2, nil } return 0, nil } -func EquipmentDelRpc(agent components.IAgent, msg components.IMessage) (int32, interface{}) { +func EquipmentDelRpc(role *models.RoleModel, msg components.IMessage) (int32, interface{}) { req := pb.EquipmentDelReq{} if err := proto.Unmarshal(msg.GetData(), &req); err != nil { logger.Error("loginRpc err: %v", err) return 1, nil } - role := agent.GetSchema().(*models.RoleModel) - if role == nil { - return 2, nil - } if err := mongoproxy.DelOne("equip", "id", req.Id); err != nil { logger.Error(err.Error()) - return 3, nil + return 2, nil } delete(role.Equipments, req.Id) diff --git a/cmd/gameserver/action/protocode.go b/cmd/gameserver/action/protocode.go index 7629c39..7b11f98 100644 --- a/cmd/gameserver/action/protocode.go +++ b/cmd/gameserver/action/protocode.go @@ -9,7 +9,6 @@ func GetActionMap() map[interface{}]interface{} { logger.Debug("init protocode...") am := make(map[interface{}]interface{}) am[uint32(pb.ProtoCode_HeartReq)] = HeartRpc - am[uint32(pb.ProtoCode_LoginReq)] = LoginRpc am[uint32(pb.ProtoCode_CreateReq)] = CreateRpc am[uint32(pb.ProtoCode_ChangeTeamReq)] = ChangeTeamRpc am[uint32(pb.ProtoCode_HeroEquipReferReq)] = HeroEquipReferRpc diff --git a/cmd/gameserver/service/agent.go b/cmd/gameserver/service/agent.go index c9a1860..3a6cf63 100644 --- a/cmd/gameserver/service/agent.go +++ b/cmd/gameserver/service/agent.go @@ -58,40 +58,75 @@ func (c *Agent) OnConnection(conn components.IConnection) { c.IConnection = conn } +func (c *Agent) OnLoginQuery(msg components.IMessage) (int32, proto.Message) { + //logger.Debug("11111111cmd: %v, msg: %s", msg.GetHeader().GetMsgID(), msg.GetData()) + req := pb.LoginReq{} + if err := proto.Unmarshal(msg.GetData(), &req); err != nil { + logger.Error("loginRpc err: %v", err) + return 1, nil + } + + role := models.RoleExistByUid(req.Token) + if role == nil { + return 2, nil + } + role.SetProperty("Device", req.Device) + protoMsg := &pb.RoleRsp{ + Role: role.Role, + Hero: role.GetAllHero(), + Team: role.GetAllTeam(), + Equipments: role.GetEquipments(), + } + //登录成功,存储agent role + c.SetSchema(role) + return 0, protoMsg +} + +func (c *Agent) SendMsg(errCode int32, cmd uint32, msg interface{}) { + if msg == nil || errCode != 0 { + c.Send(errCode, cmd, nil) + return + } + rsp, err := proto.Marshal(msg.(proto.Message)) + if err != nil { + c.Send(-100, cmd, nil) + return + } + c.Send(errCode, cmd, rsp) +} + func (c *Agent) OnMessage(msg components.IMessage) { atomic.StoreInt64(&c.lastHeartCheckTime, common.Timex()) + //heart if msg.GetHeader().GetMsgID() == uint32(pb.ProtoCode_HeartReq) { return } + //login + if msg.GetHeader().GetMsgID() == uint32(pb.ProtoCode_LoginReq) { + code, protoMsg := c.OnLoginQuery(msg) + c.SendMsg(code, msg.GetHeader().GetMsgID(), protoMsg) + return + } + + //get handler by msgid md := c.Server.GetAction(msg.GetHeader().GetMsgID()) if md == nil { logger.Debug("cmd: %d, handler is nil", msg.GetHeader().GetMsgID()) return } - logger.Debug("protocolID: %d", msg.GetHeader().GetMsgID()) - //fmt.Printf("errCode: %d, protoMsg:%v\n", errCode, protoMsg) - - f := md.(func(agent components.IAgent, msg components.IMessage) (int32, interface{})) - errCode, protoMsg := f(c, msg) - if protoMsg == nil { - c.Send(errCode, msg.GetHeader().GetMsgID(), nil) - return - } + logger.Debug("protocolID: %d", msg.GetHeader().GetMsgID()) - if errCode != 0 { - logger.Error("errCode %d, msg: %v", errCode, protoMsg) - c.Send(errCode, msg.GetHeader().GetMsgID(), nil) + if msg.GetHeader().GetMsgID() != uint32(pb.ProtoCode_CreateReq) && c.Role == nil { + c.Send(-101, msg.GetHeader().GetMsgID(), nil) return } - rsp, err := proto.Marshal(protoMsg.(proto.Message)) - if err != nil { - c.Send(-100, msg.GetHeader().GetMsgID(), nil) - return - } - c.Send(errCode, msg.GetHeader().GetMsgID(), rsp) + //调用协议号对应的逻辑函数 + f := md.(func(role *models.RoleModel, msg components.IMessage) (int32, interface{})) + errCode, protoMsg := f(c.Role, msg) + c.SendMsg(errCode, msg.GetHeader().GetMsgID(), protoMsg) } func (c *Agent) OnTimer() { diff --git a/common/components/icompontents.go b/common/components/icompontents.go index 8c67f32..ea78438 100644 --- a/common/components/icompontents.go +++ b/common/components/icompontents.go @@ -2,6 +2,7 @@ package components import ( "github.com/gin-gonic/gin" + "github.com/golang/protobuf/proto" "google.golang.org/protobuf/reflect/protoreflect" "reflect" ) @@ -93,6 +94,7 @@ type ( GetServer() IServer SetServer(server IServer) + SendMsg(errCode int32, cmd uint32, msg proto.Message) } //Connector diff --git a/tools/generator.py b/tools/generator.py index c8c447d..fde617d 100644 --- a/tools/generator.py +++ b/tools/generator.py @@ -41,10 +41,17 @@ def generatorProto(path): messageStr = sline[1].replace('\n', '').replace('{', "") n1 = messageStr.find('Req') n2 = messageStr.find('Rsp') + loginReq = messageStr.find('LoginReq') + + if n1 != -1: code += 1 ProtoCodeData += ProtoCodeLineReq.format(messageStr[:n1], code) + + if loginReq != -1: + continue + GoCodeData += GoProtoCodeLine.format(messageStr[:n1], messageStr[:n1]) elif n2 != -1: code += 1 -- libgit2 0.21.2