Commit 3e92be6732e35706d94116282645326b32b8b73f
1 parent
db8164b6
fix: 优化协议,除了登录和创建角色接口,其他协议都直接把role数据传递进去。
Showing
5 changed files
with
71 additions
and
68 deletions
Show diff stats
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 |