Blame view

cmd/gameserver/action/RoleAction.go 5.45 KB
ddc88bac   zhangqijia   fix: 记录战斗
1
  // 游戏服角色相关操作
69d286a7   zhangqijia   fix: 插件用来做部分热更
2
  package action
9644352a   zhangqijia   登录服改为http,游戏服改为长连...
3
4
  
  import (
29a163be   zhangqijia   fix: CreateReq ui...
5
  	"fmt"
9644352a   zhangqijia   登录服改为http,游戏服改为长连...
6
  	"github.com/golang/protobuf/proto"
765431a4   zhangqijia   增加schema接口, 抽象 mo...
7
  	"pro2d/common"
0e5d52de   zhangqijia   reactor: 重构底层框架1.0
8
  	"pro2d/common/components"
51d48d11   zhangqijia   fix: 删除装备 删除物品请求
9
  	"pro2d/common/db/mongoproxy"
29a163be   zhangqijia   fix: CreateReq ui...
10
  	"pro2d/common/db/redisproxy"
765431a4   zhangqijia   增加schema接口, 抽象 mo...
11
  	"pro2d/common/logger"
ddc88bac   zhangqijia   fix: 记录战斗
12
  	"pro2d/csvdata"
0e5d52de   zhangqijia   reactor: 重构底层框架1.0
13
  	"pro2d/models"
7f269318   zhangqijia   add pb.go; 添加关闭连接...
14
  	"pro2d/pb"
9644352a   zhangqijia   登录服改为http,游戏服改为长连...
15
16
  )
  
4a502dd5   zhangqijia   fix: game,account...
17
  // HeartRpc 心跳请求
3e92be67   zhangqijia   fix: 优化协议,除了登录和创建...
18
  func HeartRpc(role *models.RoleModel, msg components.IMessage) (int32, interface{}) {
0cc58315   zhangqijia   添加定时器, 检查心跳
19
  	//msg.Conn.SetLastHeartCheckTime()
9644352a   zhangqijia   登录服改为http,游戏服改为长连...
20
21
22
  	return 0, nil
  }
  
4a502dd5   zhangqijia   fix: game,account...
23
  // getRandomName 随机名字
29a163be   zhangqijia   fix: CreateReq ui...
24
25
  func getRandomName() string {
  	name := ""
eadc9aff   zhangqijia   feat: 增加上阵下阵协议,增加...
26
  	for {
29a163be   zhangqijia   fix: CreateReq ui...
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
  		name = common.RandomName(common.DefaultName)
  		if name == "" {
  			continue
  		}
  
  		relay, err := redisproxy.SETNX(fmt.Sprintf(common.NickNames, name), "1")
  		if err != nil {
  			continue
  		}
  		if relay.(int64) == 1 {
  			break
  		}
  	}
  	return name
  }
  
4a502dd5   zhangqijia   fix: game,account...
43
44
45
46
47
  /*
  CreateRpc 创建角色请求
   1: proto解析错误
   2: 角色不存在
  */
3e92be67   zhangqijia   fix: 优化协议,除了登录和创建...
48
  func CreateRpc(role1 *models.RoleModel, msg components.IMessage) (int32, interface{}) {
9644352a   zhangqijia   登录服改为http,游戏服改为长连...
49
  	req := pb.CreateReq{}
0e5d52de   zhangqijia   reactor: 重构底层框架1.0
50
  	if err := proto.Unmarshal(msg.GetData(), &req); err != nil {
cad2b7f3   zhangqijia   reactor: 重构目录, 重构...
51
  		logger.Error("CreateRpc err: %v", err)
101d1cc1   zhangqijia   feat: 一个基于redis的自...
52
  		return 1, err
9644352a   zhangqijia   登录服改为http,游戏服改为长连...
53
  	}
29a163be   zhangqijia   fix: CreateReq ui...
54
  	role := models.RoleExistByUid(req.Token)
9644352a   zhangqijia   登录服改为http,游戏服改为长连...
55
  	if role != nil {
101d1cc1   zhangqijia   feat: 一个基于redis的自...
56
57
58
59
60
61
  		return 2, "role exists"
  	}
  
  	roleId, err := common.GetNextRoleId()
  	if err != nil {
  		return 3, err
9644352a   zhangqijia   登录服改为http,游戏服改为长连...
62
63
  	}
  
9644352a   zhangqijia   登录服改为http,游戏服改为长连...
64
  	role = models.NewRole(roleId)
c47aa250   zhangqijia   feat: 增加GM相关接口。详情...
65
  	role.Role.Uid = req.Token
8f6d9ea9   zhangqijia   fix: UpLevel
66
  	role.Role.Level = 1
29a163be   zhangqijia   fix: CreateReq ui...
67
  	role.Role.Nick = getRandomName()
69d286a7   zhangqijia   fix: 插件用来做部分热更
68
  	if err := role.Create(); err != nil {
cad2b7f3   zhangqijia   reactor: 重构目录, 重构...
69
  		logger.Error("CreateRpc role create err: %v", err)
a24dea4c   zhangqijia   fix: id自增做了写更新。阵容...
70
  		return 4, nil
9644352a   zhangqijia   登录服改为http,游戏服改为长连...
71
  	}
8d983031   zhangqijia   loginReq uid -> t...
72
  	role.InitRole()
9644352a   zhangqijia   登录服改为http,游戏服改为长连...
73
74
75
  	return 0, nil
  }
  
4a502dd5   zhangqijia   fix: game,account...
76
  // ChangeTeamRpc 阵容变换
3e92be67   zhangqijia   fix: 优化协议,除了登录和创建...
77
  func ChangeTeamRpc(role *models.RoleModel, msg components.IMessage) (int32, interface{}) {
a24dea4c   zhangqijia   fix: id自增做了写更新。阵容...
78
  	req := pb.ChangeTeamReq{}
eadc9aff   zhangqijia   feat: 增加上阵下阵协议,增加...
79
80
81
82
  	if err := proto.Unmarshal(msg.GetData(), &req); err != nil {
  		logger.Error("loginRpc err: %v", err)
  		return 1, nil
  	}
eadc9aff   zhangqijia   feat: 增加上阵下阵协议,增加...
83
84
85
  
  	role.UpdateTeam(req.Team)
  	return 0, nil
69d286a7   zhangqijia   fix: 插件用来做部分热更
86
  }
17fe96be   zhangqijia   feat: 增加装备相关数据和协议
87
  
4a502dd5   zhangqijia   fix: game,account...
88
89
90
91
  /*
  HeroEquipReferRpc 穿戴/ 装备
   2: 装备不存在
  */
3e92be67   zhangqijia   fix: 优化协议,除了登录和创建...
92
  func HeroEquipReferRpc(role *models.RoleModel, msg components.IMessage) (int32, interface{}) {
17fe96be   zhangqijia   feat: 增加装备相关数据和协议
93
94
95
96
97
  	req := pb.HeroEquipReferReq{}
  	if err := proto.Unmarshal(msg.GetData(), &req); err != nil {
  		logger.Error("loginRpc err: %v", err)
  		return 1, nil
  	}
17fe96be   zhangqijia   feat: 增加装备相关数据和协议
98
99
100
  
  	e, ok := role.Equipments[req.EquipId]
  	if !ok {
3e92be67   zhangqijia   fix: 优化协议,除了登录和创建...
101
  		return 2, nil
17fe96be   zhangqijia   feat: 增加装备相关数据和协议
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
  	}
  
  	equip := e.(*models.EquipModel)
  
  	// 装备未被穿戴
  	if equip.Equip.HeroId == "" {
  
  		h, ok := role.Heros[req.HeroId]
  		if ok {
  			hero := h.(*models.HeroModel)
  			hero.UpdateEquipment(equip.Equip.Id, equip.Equip.Type)
  		}
  		equip.SetProperty("heroid", req.HeroId)
  	} else {
  		//装备已经被穿戴
  		if req.HeroId != equip.Equip.HeroId {
  			h, ok := role.Heros[equip.Equip.HeroId]
  			if ok {
  				hero := h.(*models.HeroModel)
  				hero.UpdateEquipment(equip.Equip.Id, "")
  			}
  
  			h, ok = role.Heros[req.HeroId]
  			if ok {
  				hero := h.(*models.HeroModel)
  				hero.UpdateEquipment(equip.Equip.Id, equip.Equip.Type)
  			}
  
  			equip.SetProperty("heroid", req.HeroId)
  		}
  	}
  	return 0, nil
  }
51d48d11   zhangqijia   fix: 删除装备 删除物品请求
135
  
4a502dd5   zhangqijia   fix: game,account...
136
137
138
139
  /*
  RoleClearItemsRpc 删除物品
   2 删除失败
  */
3e92be67   zhangqijia   fix: 优化协议,除了登录和创建...
140
  func RoleClearItemsRpc(role *models.RoleModel, msg components.IMessage) (int32, interface{}) {
51d48d11   zhangqijia   fix: 删除装备 删除物品请求
141
142
  	req := pb.RoleClearItemsReq{}
  	if err := proto.Unmarshal(msg.GetData(), &req); err != nil {
8f6d9ea9   zhangqijia   fix: UpLevel
143
  		logger.Error("proto rpc err: %v", err)
51d48d11   zhangqijia   fix: 删除装备 删除物品请求
144
145
  		return 1, nil
  	}
51d48d11   zhangqijia   fix: 删除装备 删除物品请求
146
147
148
  
  	if !role.CostItem(req.Id, req.Count) {
  		logger.Error("cost err: %s, %d", req.Id, req.Count)
3e92be67   zhangqijia   fix: 优化协议,除了登录和创建...
149
  		return 2, nil
51d48d11   zhangqijia   fix: 删除装备 删除物品请求
150
151
152
153
  	}
  	return 0, nil
  }
  
4a502dd5   zhangqijia   fix: game,account...
154
155
156
157
  /*
  EquipmentDelRpc 删除装备
   2 删除失败
  */
3e92be67   zhangqijia   fix: 优化协议,除了登录和创建...
158
  func EquipmentDelRpc(role *models.RoleModel, msg components.IMessage) (int32, interface{}) {
51d48d11   zhangqijia   fix: 删除装备 删除物品请求
159
160
161
162
163
  	req := pb.EquipmentDelReq{}
  	if err := proto.Unmarshal(msg.GetData(), &req); err != nil {
  		logger.Error("loginRpc err: %v", err)
  		return 1, nil
  	}
51d48d11   zhangqijia   fix: 删除装备 删除物品请求
164
  
a9813bb9   zhangqijia   fix: update
165
  	if err := mongoproxy.DelOne("equipment", "id", req.Id); err != nil {
51d48d11   zhangqijia   fix: 删除装备 删除物品请求
166
  		logger.Error(err.Error())
3e92be67   zhangqijia   fix: 优化协议,除了登录和创建...
167
  		return 2, nil
51d48d11   zhangqijia   fix: 删除装备 删除物品请求
168
169
170
171
172
  	}
  	delete(role.Equipments, req.Id)
  
  	return 0, nil
  }
ddc88bac   zhangqijia   fix: 记录战斗
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
  
  /*
  RoleStartBattleRpc 开始战斗
  */
  func RoleStartBattleRpc(role *models.RoleModel, msg components.IMessage) (int32, interface{}) {
  	req := pb.RoleStartBattleReq{}
  	if err := proto.Unmarshal(msg.GetData(), &req); err != nil {
  		logger.Error("loginRpc err: %v", err)
  		return 1, nil
  	}
  
  	//TODO 消耗体力
  
  	return 0, nil
  }
  
  /*
  RoleEndBattleRpc 结束战斗
   2 关卡不存在
  
   RoleEndBattleRsp 返回值
  */
  func RoleEndBattleRpc(role *models.RoleModel, msg components.IMessage) (int32, interface{}) {
  	req := pb.RoleEndBattleReq{}
  	if err := proto.Unmarshal(msg.GetData(), &req); err != nil {
  		logger.Error("loginRpc err: %v", err)
  		return 1, nil
  	}
  
  	//find chapter from table config
  	chapterInfo := csvdata.Get().TbRogueChapter.Get(req.ChapterId)
  
  	//find chapter from role pass
  	chapterCount, first := role.Role.PassChapters[req.ChapterId]
  
  	//find carbon
  	carbonInfo, ok := chapterInfo.Carbons[req.CarbonId]
  	if !ok {
  		logger.Error("carbonInfo not exists")
  		return 2, nil
  	}
  
  	reward := make(common.IMapStringNum)
  	if !first {
  		role.Role.PassChapters[req.ChapterId] = 1
  		for k, v := range common.StringToMapNum(carbonInfo.FirstAward) {
  			reward[k] = v
  		}
  	} else {
  		role.Role.PassChapters[req.ChapterId] = chapterCount + 1
  	}
  
  	for k, v := range common.StringToMapNum(carbonInfo.NormalAward) {
  		rv, ok := reward[k]
  		if !ok {
  			reward[k] = v
  		} else {
  			reward[k] = rv + v
  		}
  	}
  	//award
  	reward = role.Award(reward)
  
  	//exp
686ff048   zhangqijia   fix: 结束战斗增加字段
237
  	var amount int32
ddc88bac   zhangqijia   fix: 记录战斗
238
  	if req.Pass {
686ff048   zhangqijia   fix: 结束战斗增加字段
239
  		amount = carbonInfo.CarbonExp
ddc88bac   zhangqijia   fix: 记录战斗
240
  	} else {
686ff048   zhangqijia   fix: 结束战斗增加字段
241
  		amount = carbonInfo.CarbonFailExp
ddc88bac   zhangqijia   fix: 记录战斗
242
  	}
686ff048   zhangqijia   fix: 结束战斗增加字段
243
  	level, exp := role.UpLevel(amount)
ddc88bac   zhangqijia   fix: 记录战斗
244
  
8f6d9ea9   zhangqijia   fix: UpLevel
245
  	rsp := &pb.RoleEndBattleRsp{
686ff048   zhangqijia   fix: 结束战斗增加字段
246
247
248
249
250
  		RoleLevel:     level,
  		RoleExp:       exp,
  		RoleExpamount: amount,
  		Pass:          req.Pass,
  		Reward:        common.MapNumToString(reward),
ddc88bac   zhangqijia   fix: 记录战斗
251
252
253
  	}
  	return 0, rsp
  }