Blame view

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