Commit 3e92be6732e35706d94116282645326b32b8b73f

Authored by zhangqijia
1 parent db8164b6

fix: 优化协议,除了登录和创建角色接口,其他协议都直接把role数据传递进去。

cmd/gameserver/action/RoleAction.go
@@ -12,7 +12,7 @@ import ( @@ -12,7 +12,7 @@ import (
12 "pro2d/pb" 12 "pro2d/pb"
13 ) 13 )
14 14
15 -func HeartRpc(agent components.IAgent, msg components.IMessage) (int32, interface{}) { 15 +func HeartRpc(role *models.RoleModel, msg components.IMessage) (int32, interface{}) {
16 //msg.Conn.SetLastHeartCheckTime() 16 //msg.Conn.SetLastHeartCheckTime()
17 return 0, nil 17 return 0, nil
18 } 18 }
@@ -36,7 +36,7 @@ func getRandomName() string { @@ -36,7 +36,7 @@ func getRandomName() string {
36 return name 36 return name
37 } 37 }
38 38
39 -func CreateRpc(agent components.IAgent, msg components.IMessage) (int32, interface{}) { 39 +func CreateRpc(role1 *models.RoleModel, msg components.IMessage) (int32, interface{}) {
40 req := pb.CreateReq{} 40 req := pb.CreateReq{}
41 if err := proto.Unmarshal(msg.GetData(), &req); err != nil { 41 if err := proto.Unmarshal(msg.GetData(), &req); err != nil {
42 logger.Error("CreateRpc err: %v", err) 42 logger.Error("CreateRpc err: %v", err)
@@ -63,59 +63,27 @@ func CreateRpc(agent components.IAgent, msg components.IMessage) (int32, interfa @@ -63,59 +63,27 @@ func CreateRpc(agent components.IAgent, msg components.IMessage) (int32, interfa
63 return 0, nil 63 return 0, nil
64 } 64 }
65 65
66 -func LoginRpc(agent components.IAgent, msg components.IMessage) (int32, interface{}) {  
67 - //logger.Debug("11111111cmd: %v, msg: %s", msg.GetHeader().GetMsgID(), msg.GetData())  
68 - req := pb.LoginReq{}  
69 - if err := proto.Unmarshal(msg.GetData(), &req); err != nil {  
70 - logger.Error("loginRpc err: %v", err)  
71 - return 1, nil  
72 - }  
73 -  
74 - role := models.RoleExistByUid(req.Token)  
75 - if role == nil {  
76 - return 2, nil  
77 - }  
78 - role.SetProperty("Device", req.Device)  
79 - protoMsg := &pb.RoleRsp{  
80 - Role: role.Role,  
81 - Hero: role.GetAllHero(),  
82 - Team: role.GetAllTeam(),  
83 - Equipments: role.GetEquipments(),  
84 - }  
85 - //登录成功,存储agent role  
86 - agent.SetSchema(role)  
87 - return 0, protoMsg  
88 -}  
89 -  
90 -func ChangeTeamRpc(agent components.IAgent, msg components.IMessage) (int32, interface{}) { 66 +func ChangeTeamRpc(role *models.RoleModel, msg components.IMessage) (int32, interface{}) {
91 req := pb.ChangeTeamReq{} 67 req := pb.ChangeTeamReq{}
92 if err := proto.Unmarshal(msg.GetData(), &req); err != nil { 68 if err := proto.Unmarshal(msg.GetData(), &req); err != nil {
93 logger.Error("loginRpc err: %v", err) 69 logger.Error("loginRpc err: %v", err)
94 return 1, nil 70 return 1, nil
95 } 71 }
96 - role := agent.GetSchema().(*models.RoleModel)  
97 - if role == nil {  
98 - return 2, nil  
99 - }  
100 72
101 role.UpdateTeam(req.Team) 73 role.UpdateTeam(req.Team)
102 return 0, nil 74 return 0, nil
103 } 75 }
104 76
105 -func HeroEquipReferRpc(agent components.IAgent, msg components.IMessage) (int32, interface{}) { 77 +func HeroEquipReferRpc(role *models.RoleModel, msg components.IMessage) (int32, interface{}) {
106 req := pb.HeroEquipReferReq{} 78 req := pb.HeroEquipReferReq{}
107 if err := proto.Unmarshal(msg.GetData(), &req); err != nil { 79 if err := proto.Unmarshal(msg.GetData(), &req); err != nil {
108 logger.Error("loginRpc err: %v", err) 80 logger.Error("loginRpc err: %v", err)
109 return 1, nil 81 return 1, nil
110 } 82 }
111 - role := agent.GetSchema().(*models.RoleModel)  
112 - if role == nil {  
113 - return 2, nil  
114 - }  
115 83
116 e, ok := role.Equipments[req.EquipId] 84 e, ok := role.Equipments[req.EquipId]
117 if !ok { 85 if !ok {
118 - return 3, nil 86 + return 2, nil
119 } 87 }
120 88
121 equip := e.(*models.EquipModel) 89 equip := e.(*models.EquipModel)
@@ -150,38 +118,30 @@ func HeroEquipReferRpc(agent components.IAgent, msg components.IMessage) (int32, @@ -150,38 +118,30 @@ func HeroEquipReferRpc(agent components.IAgent, msg components.IMessage) (int32,
150 return 0, nil 118 return 0, nil
151 } 119 }
152 120
153 -func RoleClearItemsRpc(agent components.IAgent, msg components.IMessage) (int32, interface{}) { 121 +func RoleClearItemsRpc(role *models.RoleModel, msg components.IMessage) (int32, interface{}) {
154 req := pb.RoleClearItemsReq{} 122 req := pb.RoleClearItemsReq{}
155 if err := proto.Unmarshal(msg.GetData(), &req); err != nil { 123 if err := proto.Unmarshal(msg.GetData(), &req); err != nil {
156 logger.Error("loginRpc err: %v", err) 124 logger.Error("loginRpc err: %v", err)
157 return 1, nil 125 return 1, nil
158 } 126 }
159 - role := agent.GetSchema().(*models.RoleModel)  
160 - if role == nil {  
161 - return 2, nil  
162 - }  
163 127
164 if !role.CostItem(req.Id, req.Count) { 128 if !role.CostItem(req.Id, req.Count) {
165 logger.Error("cost err: %s, %d", req.Id, req.Count) 129 logger.Error("cost err: %s, %d", req.Id, req.Count)
166 - return 3, nil 130 + return 2, nil
167 } 131 }
168 return 0, nil 132 return 0, nil
169 } 133 }
170 134
171 -func EquipmentDelRpc(agent components.IAgent, msg components.IMessage) (int32, interface{}) { 135 +func EquipmentDelRpc(role *models.RoleModel, msg components.IMessage) (int32, interface{}) {
172 req := pb.EquipmentDelReq{} 136 req := pb.EquipmentDelReq{}
173 if err := proto.Unmarshal(msg.GetData(), &req); err != nil { 137 if err := proto.Unmarshal(msg.GetData(), &req); err != nil {
174 logger.Error("loginRpc err: %v", err) 138 logger.Error("loginRpc err: %v", err)
175 return 1, nil 139 return 1, nil
176 } 140 }
177 - role := agent.GetSchema().(*models.RoleModel)  
178 - if role == nil {  
179 - return 2, nil  
180 - }  
181 141
182 if err := mongoproxy.DelOne("equip", "id", req.Id); err != nil { 142 if err := mongoproxy.DelOne("equip", "id", req.Id); err != nil {
183 logger.Error(err.Error()) 143 logger.Error(err.Error())
184 - return 3, nil 144 + return 2, nil
185 } 145 }
186 delete(role.Equipments, req.Id) 146 delete(role.Equipments, req.Id)
187 147
cmd/gameserver/action/protocode.go
@@ -9,7 +9,6 @@ func GetActionMap() map[interface{}]interface{} { @@ -9,7 +9,6 @@ func GetActionMap() map[interface{}]interface{} {
9 logger.Debug("init protocode...") 9 logger.Debug("init protocode...")
10 am := make(map[interface{}]interface{}) 10 am := make(map[interface{}]interface{})
11 am[uint32(pb.ProtoCode_HeartReq)] = HeartRpc 11 am[uint32(pb.ProtoCode_HeartReq)] = HeartRpc
12 - am[uint32(pb.ProtoCode_LoginReq)] = LoginRpc  
13 am[uint32(pb.ProtoCode_CreateReq)] = CreateRpc 12 am[uint32(pb.ProtoCode_CreateReq)] = CreateRpc
14 am[uint32(pb.ProtoCode_ChangeTeamReq)] = ChangeTeamRpc 13 am[uint32(pb.ProtoCode_ChangeTeamReq)] = ChangeTeamRpc
15 am[uint32(pb.ProtoCode_HeroEquipReferReq)] = HeroEquipReferRpc 14 am[uint32(pb.ProtoCode_HeroEquipReferReq)] = HeroEquipReferRpc
cmd/gameserver/service/agent.go
@@ -58,40 +58,75 @@ func (c *Agent) OnConnection(conn components.IConnection) { @@ -58,40 +58,75 @@ func (c *Agent) OnConnection(conn components.IConnection) {
58 c.IConnection = conn 58 c.IConnection = conn
59 } 59 }
60 60
  61 +func (c *Agent) OnLoginQuery(msg components.IMessage) (int32, proto.Message) {
  62 + //logger.Debug("11111111cmd: %v, msg: %s", msg.GetHeader().GetMsgID(), msg.GetData())
  63 + req := pb.LoginReq{}
  64 + if err := proto.Unmarshal(msg.GetData(), &req); err != nil {
  65 + logger.Error("loginRpc err: %v", err)
  66 + return 1, nil
  67 + }
  68 +
  69 + role := models.RoleExistByUid(req.Token)
  70 + if role == nil {
  71 + return 2, nil
  72 + }
  73 + role.SetProperty("Device", req.Device)
  74 + protoMsg := &pb.RoleRsp{
  75 + Role: role.Role,
  76 + Hero: role.GetAllHero(),
  77 + Team: role.GetAllTeam(),
  78 + Equipments: role.GetEquipments(),
  79 + }
  80 + //登录成功,存储agent role
  81 + c.SetSchema(role)
  82 + return 0, protoMsg
  83 +}
  84 +
  85 +func (c *Agent) SendMsg(errCode int32, cmd uint32, msg interface{}) {
  86 + if msg == nil || errCode != 0 {
  87 + c.Send(errCode, cmd, nil)
  88 + return
  89 + }
  90 + rsp, err := proto.Marshal(msg.(proto.Message))
  91 + if err != nil {
  92 + c.Send(-100, cmd, nil)
  93 + return
  94 + }
  95 + c.Send(errCode, cmd, rsp)
  96 +}
  97 +
61 func (c *Agent) OnMessage(msg components.IMessage) { 98 func (c *Agent) OnMessage(msg components.IMessage) {
62 atomic.StoreInt64(&c.lastHeartCheckTime, common.Timex()) 99 atomic.StoreInt64(&c.lastHeartCheckTime, common.Timex())
  100 + //heart
63 if msg.GetHeader().GetMsgID() == uint32(pb.ProtoCode_HeartReq) { 101 if msg.GetHeader().GetMsgID() == uint32(pb.ProtoCode_HeartReq) {
64 return 102 return
65 } 103 }
66 104
  105 + //login
  106 + if msg.GetHeader().GetMsgID() == uint32(pb.ProtoCode_LoginReq) {
  107 + code, protoMsg := c.OnLoginQuery(msg)
  108 + c.SendMsg(code, msg.GetHeader().GetMsgID(), protoMsg)
  109 + return
  110 + }
  111 +
  112 + //get handler by msgid
67 md := c.Server.GetAction(msg.GetHeader().GetMsgID()) 113 md := c.Server.GetAction(msg.GetHeader().GetMsgID())
68 if md == nil { 114 if md == nil {
69 logger.Debug("cmd: %d, handler is nil", msg.GetHeader().GetMsgID()) 115 logger.Debug("cmd: %d, handler is nil", msg.GetHeader().GetMsgID())
70 return 116 return
71 } 117 }
72 - logger.Debug("protocolID: %d", msg.GetHeader().GetMsgID())  
73 - //fmt.Printf("errCode: %d, protoMsg:%v\n", errCode, protoMsg)  
74 -  
75 - f := md.(func(agent components.IAgent, msg components.IMessage) (int32, interface{}))  
76 - errCode, protoMsg := f(c, msg)  
77 118
78 - if protoMsg == nil {  
79 - c.Send(errCode, msg.GetHeader().GetMsgID(), nil)  
80 - return  
81 - } 119 + logger.Debug("protocolID: %d", msg.GetHeader().GetMsgID())
82 120
83 - if errCode != 0 {  
84 - logger.Error("errCode %d, msg: %v", errCode, protoMsg)  
85 - c.Send(errCode, msg.GetHeader().GetMsgID(), nil) 121 + if msg.GetHeader().GetMsgID() != uint32(pb.ProtoCode_CreateReq) && c.Role == nil {
  122 + c.Send(-101, msg.GetHeader().GetMsgID(), nil)
86 return 123 return
87 } 124 }
88 125
89 - rsp, err := proto.Marshal(protoMsg.(proto.Message))  
90 - if err != nil {  
91 - c.Send(-100, msg.GetHeader().GetMsgID(), nil)  
92 - return  
93 - }  
94 - c.Send(errCode, msg.GetHeader().GetMsgID(), rsp) 126 + //调用协议号对应的逻辑函数
  127 + f := md.(func(role *models.RoleModel, msg components.IMessage) (int32, interface{}))
  128 + errCode, protoMsg := f(c.Role, msg)
  129 + c.SendMsg(errCode, msg.GetHeader().GetMsgID(), protoMsg)
95 } 130 }
96 131
97 func (c *Agent) OnTimer() { 132 func (c *Agent) OnTimer() {
common/components/icompontents.go
@@ -2,6 +2,7 @@ package components @@ -2,6 +2,7 @@ package components
2 2
3 import ( 3 import (
4 "github.com/gin-gonic/gin" 4 "github.com/gin-gonic/gin"
  5 + "github.com/golang/protobuf/proto"
5 "google.golang.org/protobuf/reflect/protoreflect" 6 "google.golang.org/protobuf/reflect/protoreflect"
6 "reflect" 7 "reflect"
7 ) 8 )
@@ -93,6 +94,7 @@ type ( @@ -93,6 +94,7 @@ type (
93 94
94 GetServer() IServer 95 GetServer() IServer
95 SetServer(server IServer) 96 SetServer(server IServer)
  97 + SendMsg(errCode int32, cmd uint32, msg proto.Message)
96 } 98 }
97 99
98 //Connector 100 //Connector
tools/generator.py
@@ -41,10 +41,17 @@ def generatorProto(path): @@ -41,10 +41,17 @@ def generatorProto(path):
41 messageStr = sline[1].replace('\n', '').replace('{', "") 41 messageStr = sline[1].replace('\n', '').replace('{', "")
42 n1 = messageStr.find('Req') 42 n1 = messageStr.find('Req')
43 n2 = messageStr.find('Rsp') 43 n2 = messageStr.find('Rsp')
  44 + loginReq = messageStr.find('LoginReq')
  45 +
  46 +
44 47
45 if n1 != -1: 48 if n1 != -1:
46 code += 1 49 code += 1
47 ProtoCodeData += ProtoCodeLineReq.format(messageStr[:n1], code) 50 ProtoCodeData += ProtoCodeLineReq.format(messageStr[:n1], code)
  51 +
  52 + if loginReq != -1:
  53 + continue
  54 +
48 GoCodeData += GoProtoCodeLine.format(messageStr[:n1], messageStr[:n1]) 55 GoCodeData += GoProtoCodeLine.format(messageStr[:n1], messageStr[:n1])
49 elif n2 != -1: 56 elif n2 != -1:
50 code += 1 57 code += 1