Blame view

cmd/gameserver/action/RoleAction.go 6.2 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"
f74e34e3   zhangqijia   fix: 批量删除装备
7
  	"go.mongodb.org/mongo-driver/bson"
765431a4   zhangqijia   增加schema接口, 抽象 mo...
8
  	"pro2d/common"
0e5d52de   zhangqijia   reactor: 重构底层框架1.0
9
  	"pro2d/common/components"
51d48d11   zhangqijia   fix: 删除装备 删除物品请求
10
  	"pro2d/common/db/mongoproxy"
29a163be   zhangqijia   fix: CreateReq ui...
11
  	"pro2d/common/db/redisproxy"
765431a4   zhangqijia   增加schema接口, 抽象 mo...
12
  	"pro2d/common/logger"
ddc88bac   zhangqijia   fix: 记录战斗
13
  	"pro2d/csvdata"
0e5d52de   zhangqijia   reactor: 重构底层框架1.0
14
  	"pro2d/models"
7f269318   zhangqijia   add pb.go; 添加关闭连接...
15
  	"pro2d/pb"
9644352a   zhangqijia   登录服改为http,游戏服改为长连...
16
17
  )
  
4a502dd5   zhangqijia   fix: game,account...
18
  // HeartRpc 心跳请求
3e92be67   zhangqijia   fix: 优化协议,除了登录和创建...
19
  func HeartRpc(role *models.RoleModel, msg components.IMessage) (int32, interface{}) {
0cc58315   zhangqijia   添加定时器, 检查心跳
20
  	//msg.Conn.SetLastHeartCheckTime()
9644352a   zhangqijia   登录服改为http,游戏服改为长连...
21
22
23
  	return 0, nil
  }
  
4a502dd5   zhangqijia   fix: game,account...
24
  // getRandomName 随机名字
29a163be   zhangqijia   fix: CreateReq ui...
25
26
  func getRandomName() string {
  	name := ""
eadc9aff   zhangqijia   feat: 增加上阵下阵协议,增加...
27
  	for {
29a163be   zhangqijia   fix: CreateReq ui...
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
  		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...
44
45
46
47
48
  /*
  CreateRpc 创建角色请求
   1: proto解析错误
   2: 角色不存在
  */
3e92be67   zhangqijia   fix: 优化协议,除了登录和创建...
49
  func CreateRpc(role1 *models.RoleModel, msg components.IMessage) (int32, interface{}) {
9644352a   zhangqijia   登录服改为http,游戏服改为长连...
50
  	req := pb.CreateReq{}
0e5d52de   zhangqijia   reactor: 重构底层框架1.0
51
  	if err := proto.Unmarshal(msg.GetData(), &req); err != nil {
cad2b7f3   zhangqijia   reactor: 重构目录, 重构...
52
  		logger.Error("CreateRpc err: %v", err)
101d1cc1   zhangqijia   feat: 一个基于redis的自...
53
  		return 1, err
9644352a   zhangqijia   登录服改为http,游戏服改为长连...
54
  	}
29a163be   zhangqijia   fix: CreateReq ui...
55
  	role := models.RoleExistByUid(req.Token)
9644352a   zhangqijia   登录服改为http,游戏服改为长连...
56
  	if role != nil {
101d1cc1   zhangqijia   feat: 一个基于redis的自...
57
58
59
60
61
62
  		return 2, "role exists"
  	}
  
  	roleId, err := common.GetNextRoleId()
  	if err != nil {
  		return 3, err
9644352a   zhangqijia   登录服改为http,游戏服改为长连...
63
64
  	}
  
9644352a   zhangqijia   登录服改为http,游戏服改为长连...
65
  	role = models.NewRole(roleId)
c47aa250   zhangqijia   feat: 增加GM相关接口。详情...
66
  	role.Role.Uid = req.Token
8f6d9ea9   zhangqijia   fix: UpLevel
67
  	role.Role.Level = 1
29a163be   zhangqijia   fix: CreateReq ui...
68
  	role.Role.Nick = getRandomName()
69d286a7   zhangqijia   fix: 插件用来做部分热更
69
  	if err := role.Create(); err != nil {
cad2b7f3   zhangqijia   reactor: 重构目录, 重构...
70
  		logger.Error("CreateRpc role create err: %v", err)
a24dea4c   zhangqijia   fix: id自增做了写更新。阵容...
71
  		return 4, nil
9644352a   zhangqijia   登录服改为http,游戏服改为长连...
72
  	}
8d983031   zhangqijia   loginReq uid -> t...
73
  	role.InitRole()
9644352a   zhangqijia   登录服改为http,游戏服改为长连...
74
75
76
  	return 0, nil
  }
  
4a502dd5   zhangqijia   fix: game,account...
77
  // ChangeTeamRpc 阵容变换
3e92be67   zhangqijia   fix: 优化协议,除了登录和创建...
78
  func ChangeTeamRpc(role *models.RoleModel, msg components.IMessage) (int32, interface{}) {
a24dea4c   zhangqijia   fix: id自增做了写更新。阵容...
79
  	req := pb.ChangeTeamReq{}
eadc9aff   zhangqijia   feat: 增加上阵下阵协议,增加...
80
81
82
83
  	if err := proto.Unmarshal(msg.GetData(), &req); err != nil {
  		logger.Error("loginRpc err: %v", err)
  		return 1, nil
  	}
eadc9aff   zhangqijia   feat: 增加上阵下阵协议,增加...
84
85
86
  
  	role.UpdateTeam(req.Team)
  	return 0, nil
69d286a7   zhangqijia   fix: 插件用来做部分热更
87
  }
17fe96be   zhangqijia   feat: 增加装备相关数据和协议
88
  
4a502dd5   zhangqijia   fix: game,account...
89
90
91
92
  /*
  HeroEquipReferRpc 穿戴/ 装备
   2: 装备不存在
  */
3e92be67   zhangqijia   fix: 优化协议,除了登录和创建...
93
  func HeroEquipReferRpc(role *models.RoleModel, msg components.IMessage) (int32, interface{}) {
17fe96be   zhangqijia   feat: 增加装备相关数据和协议
94
95
96
97
98
  	req := pb.HeroEquipReferReq{}
  	if err := proto.Unmarshal(msg.GetData(), &req); err != nil {
  		logger.Error("loginRpc err: %v", err)
  		return 1, nil
  	}
35adfcdb   zhangqijia   fix: 裝備戒指类型特殊处理
99
100
  	for _, equipInfo := range req.EquipIds {
  		ret := role.EquipmentRefer(equipInfo.EquipId, req.HeroId, req.Refer, equipInfo.Pos)
74286d71   zhangqijia   fix: 裝備 删除pos 添加 ...
101
  		if ret != 0 {
35adfcdb   zhangqijia   fix: 裝備戒指类型特殊处理
102
  			logger.Error("ret: %d, equipId: %s, heroId: %s, refer: %d, pos:%d", ret, equipInfo.EquipId, req.HeroId, req.Refer, equipInfo.Pos)
17fe96be   zhangqijia   feat: 增加装备相关数据和协议
103
  		}
02d11cb7   zhangqijia   fix: update 装备脱/戴
104
  
3cd84ccc   zhangqijia   fix: 裝備位置修改
105
  	}
17fe96be   zhangqijia   feat: 增加装备相关数据和协议
106
107
  	return 0, nil
  }
51d48d11   zhangqijia   fix: 删除装备 删除物品请求
108
  
4a502dd5   zhangqijia   fix: game,account...
109
110
111
112
  /*
  RoleClearItemsRpc 删除物品
   2 删除失败
  */
3e92be67   zhangqijia   fix: 优化协议,除了登录和创建...
113
  func RoleClearItemsRpc(role *models.RoleModel, msg components.IMessage) (int32, interface{}) {
51d48d11   zhangqijia   fix: 删除装备 删除物品请求
114
115
  	req := pb.RoleClearItemsReq{}
  	if err := proto.Unmarshal(msg.GetData(), &req); err != nil {
8f6d9ea9   zhangqijia   fix: UpLevel
116
  		logger.Error("proto rpc err: %v", err)
51d48d11   zhangqijia   fix: 删除装备 删除物品请求
117
118
  		return 1, nil
  	}
51d48d11   zhangqijia   fix: 删除装备 删除物品请求
119
  
c99d59cc   zhangqijia   fix: 批量删除物品
120
121
122
123
124
125
126
127
128
129
130
131
132
  	bkup := make(common.IMapStringNum)
  	for _, item := range req.Items {
  		for k, v := range common.StringToMapNum(item) {
  			tmp, ok := bkup[k]
  			if !ok {
  				tmp = 0
  			}
  			bkup[k] = v + tmp
  		}
  	}
  
  	if !role.CostItems(bkup) {
  		logger.Error("cost err: %s", common.MapNumToString(bkup))
3e92be67   zhangqijia   fix: 优化协议,除了登录和创建...
133
  		return 2, nil
51d48d11   zhangqijia   fix: 删除装备 删除物品请求
134
135
136
137
  	}
  	return 0, nil
  }
  
4a502dd5   zhangqijia   fix: game,account...
138
139
140
141
  /*
  EquipmentDelRpc 删除装备
   2 删除失败
  */
3e92be67   zhangqijia   fix: 优化协议,除了登录和创建...
142
  func EquipmentDelRpc(role *models.RoleModel, msg components.IMessage) (int32, interface{}) {
51d48d11   zhangqijia   fix: 删除装备 删除物品请求
143
144
145
146
147
  	req := pb.EquipmentDelReq{}
  	if err := proto.Unmarshal(msg.GetData(), &req); err != nil {
  		logger.Error("loginRpc err: %v", err)
  		return 1, nil
  	}
8db23cb6   zhangqijia   fix: 批量删除装备 mongo...
148
  	filter := bson.D{{"id", bson.D{{"$in", req.Id}}}}
f74e34e3   zhangqijia   fix: 批量删除装备
149
  	if err := mongoproxy.DelMany("equipment", filter); err != nil {
51d48d11   zhangqijia   fix: 删除装备 删除物品请求
150
  		logger.Error(err.Error())
3e92be67   zhangqijia   fix: 优化协议,除了登录和创建...
151
  		return 2, nil
51d48d11   zhangqijia   fix: 删除装备 删除物品请求
152
  	}
f74e34e3   zhangqijia   fix: 批量删除装备
153
154
155
156
  
  	for _, id := range req.Id {
  		delete(role.Equipments, id)
  	}
51d48d11   zhangqijia   fix: 删除装备 删除物品请求
157
158
159
  
  	return 0, nil
  }
ddc88bac   zhangqijia   fix: 记录战斗
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
  
  /*
  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
  	}
ddc88bac   zhangqijia   fix: 记录战斗
188
  	chapterInfo := csvdata.Get().TbRogueChapter.Get(req.ChapterId)
ddc88bac   zhangqijia   fix: 记录战斗
189
  	chapterCount, first := role.Role.PassChapters[req.ChapterId]
ddc88bac   zhangqijia   fix: 记录战斗
190
191
192
193
194
195
  	carbonInfo, ok := chapterInfo.Carbons[req.CarbonId]
  	if !ok {
  		logger.Error("carbonInfo not exists")
  		return 2, nil
  	}
  
92256e32   zhangqijia   fix: 结束战斗的协议加上队伍id
196
197
198
199
200
201
202
  	//team
  	team, ok := role.Teams[req.TeamId]
  	if !ok {
  		logger.Error("team not exists")
  		return 3, nil
  	}
  
ddc88bac   zhangqijia   fix: 记录战斗
203
204
205
206
207
208
209
210
  	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
4e75670c   zhangqijia   fix: 首次通关记录到数据库
211
  		role.UpdateProperty("pass_chapters", role.Role.PassChapters, false)
ddc88bac   zhangqijia   fix: 记录战斗
212
213
214
215
216
217
218
219
220
221
222
223
224
225
  	}
  
  	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: 结束战斗增加字段
226
  	var amount int32
ddc88bac   zhangqijia   fix: 记录战斗
227
  	if req.Pass {
686ff048   zhangqijia   fix: 结束战斗增加字段
228
  		amount = carbonInfo.CarbonExp
ddc88bac   zhangqijia   fix: 记录战斗
229
  	} else {
686ff048   zhangqijia   fix: 结束战斗增加字段
230
  		amount = carbonInfo.CarbonFailExp
ddc88bac   zhangqijia   fix: 记录战斗
231
  	}
686ff048   zhangqijia   fix: 结束战斗增加字段
232
  	level, exp := role.UpLevel(amount)
2ea16684   zhangqijia   fix: update
233
  	role.UpdateProperties(map[string]interface{}{"level": level, "exp": exp}, true)
ddc88bac   zhangqijia   fix: 记录战斗
234
  
92256e32   zhangqijia   fix: 结束战斗的协议加上队伍id
235
236
237
238
239
  	//team exp
  	heros := make([]*pb.Hero, 4)
  	t := team.(*models.TeamModel).Team
  	h1, ok := role.Heros[t.HeroId1]
  	if ok {
4e75670c   zhangqijia   fix: 首次通关记录到数据库
240
  		level, exp = h1.(*models.HeroModel).UpLevel(amount)
92256e32   zhangqijia   fix: 结束战斗的协议加上队伍id
241
242
243
244
245
246
247
  		h1.SetProperty("level", level)
  		h1.SetProperty("exp", exp)
  		heros = append(heros, h1.(*models.HeroModel).Hero)
  	}
  
  	h2, ok := role.Heros[t.HeroId2]
  	if ok {
4e75670c   zhangqijia   fix: 首次通关记录到数据库
248
  		level, exp = h2.(*models.HeroModel).UpLevel(amount)
92256e32   zhangqijia   fix: 结束战斗的协议加上队伍id
249
250
251
252
253
254
255
  		h2.SetProperty("level", level)
  		h2.SetProperty("exp", exp)
  		heros = append(heros, h2.(*models.HeroModel).Hero)
  	}
  
  	h3, ok := role.Heros[t.HeroId3]
  	if ok {
4e75670c   zhangqijia   fix: 首次通关记录到数据库
256
  		level, exp = h3.(*models.HeroModel).UpLevel(amount)
92256e32   zhangqijia   fix: 结束战斗的协议加上队伍id
257
258
259
260
261
  		h3.SetProperty("level", level)
  		h3.SetProperty("exp", exp)
  		heros = append(heros, h3.(*models.HeroModel).Hero)
  	}
  
8f6d9ea9   zhangqijia   fix: UpLevel
262
  	rsp := &pb.RoleEndBattleRsp{
686ff048   zhangqijia   fix: 结束战斗增加字段
263
264
265
266
267
  		RoleLevel:     level,
  		RoleExp:       exp,
  		RoleExpamount: amount,
  		Pass:          req.Pass,
  		Reward:        common.MapNumToString(reward),
92256e32   zhangqijia   fix: 结束战斗的协议加上队伍id
268
  		Hero:          heros,
ddc88bac   zhangqijia   fix: 记录战斗
269
270
271
  	}
  	return 0, rsp
  }