Blame view

models/role.go 6.4 KB
ee23102d   zhangqijia   支持mongo, grpc接服务器
1
2
3
  package models
  
  import (
101d1cc1   zhangqijia   feat: 一个基于redis的自...
4
  	"fmt"
4255fd8e   zhangqijia   feat: 更新字段
5
  	"github.com/golang/protobuf/proto"
0e5d52de   zhangqijia   reactor: 重构底层框架1.0
6
  	"pro2d/common"
8d983031   zhangqijia   loginReq uid -> t...
7
  	"pro2d/common/components"
436e0af4   zhangqijia   reactor: dir; Ac...
8
  	"pro2d/common/db/mongoproxy"
765431a4   zhangqijia   增加schema接口, 抽象 mo...
9
  	"pro2d/common/logger"
7f269318   zhangqijia   add pb.go; 添加关闭连接...
10
  	"pro2d/pb"
38dd96b4   zhangqijia   定时器+网络数据 peer 在一条...
11
  	"sync/atomic"
ee23102d   zhangqijia   支持mongo, grpc接服务器
12
13
  )
  
ee23102d   zhangqijia   支持mongo, grpc接服务器
14
  type RoleModel struct {
8d983031   zhangqijia   loginReq uid -> t...
15
  	components.ISchema
23822e2f   zhangqijia   fix: update proto...
16
  	Data       *pb.Role
17fe96be   zhangqijia   feat: 增加装备相关数据和协议
17
18
19
20
  	Heros      SchemaMap
  	Teams      SchemaMap
  	Equipments SchemaMap
  	Prop       *PropModel
ddc88bac   zhangqijia   fix: 记录战斗
21
  	Items      common.IMapStringNum //背包
38dd96b4   zhangqijia   定时器+网络数据 peer 在一条...
22
  
0ce6c418   zhangqijia   fix: 修复 bug RoleM...
23
  	lastSaveTs int64
fc3e08ac   zhangqijia   feat: add log com...
24
25
26
  
  	uniqueCount int64
  	actionUcode string
ee23102d   zhangqijia   支持mongo, grpc接服务器
27
28
  }
  
cad2b7f3   zhangqijia   reactor: 重构目录, 重构...
29
  func RoleExistByUid(uid string) *RoleModel {
a2d4f770   zhangqijia   fix: 首次通关记录到数据库
30
  	data := &pb.Role{Uid: uid, Incres: make(map[string]uint32), Passchapters: make(map[int32]int32)}
1584eb4b   zhangqijia   修复创建唯一索引的bug
31
  
8aaf28dd   zhangqijia   fix: 修复gm系统修改role...
32
  	if err := mongoproxy.FindOne(mongoproxy.GetCollName(data), mongoproxy.GetBsonM("uid", uid), data); err != nil {
23822e2f   zhangqijia   fix: update proto...
33
  		logger.Error("Data not exist err: %v", err)
9644352a   zhangqijia   登录服改为http,游戏服改为长连...
34
  		return nil
ee23102d   zhangqijia   支持mongo, grpc接服务器
35
  	}
f7f4beb5   zhangqijia   新增grpc平滑关闭,修复crea...
36
  
6f0d72bd   zhangqijia   定时器功能完善优化
37
  	r := &RoleModel{
c047d94f   zhangqijia   fix: update equip...
38
  		ISchema:    NewSchema(data.Id, data),
23822e2f   zhangqijia   fix: update proto...
39
  		Data:       data,
c047d94f   zhangqijia   fix: update equip...
40
41
42
43
  		Heros:      make(SchemaMap),
  		Teams:      make(SchemaMap),
  		Equipments: make(SchemaMap),
  		Prop:       new(PropModel),
ddc88bac   zhangqijia   fix: 记录战斗
44
  		Items:      make(common.IMapStringNum),
f7f4beb5   zhangqijia   新增grpc平滑关闭,修复crea...
45
  	}
c47aa250   zhangqijia   feat: 增加GM相关接口。详情...
46
  	r.Load()
6f0d72bd   zhangqijia   定时器功能完善优化
47
48
  	r.LoadAll()
  	return r
ee23102d   zhangqijia   支持mongo, grpc接服务器
49
50
  }
  
33ea26ab   zhangqijia   使用schema封装mongo
51
  func NewRole(id string) *RoleModel {
a2d4f770   zhangqijia   fix: 首次通关记录到数据库
52
  	data := &pb.Role{Id: id, Incres: make(map[string]uint32), Passchapters: make(map[int32]int32)}
ee23102d   zhangqijia   支持mongo, grpc接服务器
53
  	m := &RoleModel{
c047d94f   zhangqijia   fix: update equip...
54
  		ISchema:    NewSchema(id, data),
23822e2f   zhangqijia   fix: update proto...
55
  		Data:       data,
c047d94f   zhangqijia   fix: update equip...
56
57
58
59
  		Heros:      make(SchemaMap),
  		Teams:      make(SchemaMap),
  		Equipments: make(SchemaMap),
  		Prop:       new(PropModel),
ddc88bac   zhangqijia   fix: 记录战斗
60
  		Items:      make(common.IMapStringNum),
ee23102d   zhangqijia   支持mongo, grpc接服务器
61
  	}
ee23102d   zhangqijia   支持mongo, grpc接服务器
62
63
64
  	return m
  }
  
f631f225   zhangqijia   feat: 增加背包系统,以及背包...
65
  func (m *RoleModel) IncreByKey(key string, detal uint32) uint32 {
23822e2f   zhangqijia   fix: update proto...
66
  	v, ok := m.Data.Incres[key]
101d1cc1   zhangqijia   feat: 一个基于redis的自...
67
68
69
70
71
  	if !ok {
  		v = detal
  	} else {
  		v += detal
  	}
23822e2f   zhangqijia   fix: update proto...
72
73
  	m.Data.Incres[key] = v
  	m.SetProperty("incres", m.Data.Incres)
a24dea4c   zhangqijia   fix: id自增做了写更新。阵容...
74
75
76
  	return v
  }
  
f631f225   zhangqijia   feat: 增加背包系统,以及背包...
77
  func (m *RoleModel) IncreHearByKey(detal uint32) string {
23822e2f   zhangqijia   fix: update proto...
78
  	return fmt.Sprintf("%s%04d", m.Data.Id, m.IncreByKey("hero", detal))
a24dea4c   zhangqijia   fix: id自增做了写更新。阵容...
79
  }
d6d589a9   zhangqijia   feat: 增加装备接口
80
  
f631f225   zhangqijia   feat: 增加背包系统,以及背包...
81
  func (m *RoleModel) IncreTeamByKey(detal uint32) string {
23822e2f   zhangqijia   fix: update proto...
82
  	return fmt.Sprintf("%s%02d", m.Data.Id, m.IncreByKey("team", detal))
101d1cc1   zhangqijia   feat: 一个基于redis的自...
83
84
  }
  
d6d589a9   zhangqijia   feat: 增加装备接口
85
  func (m *RoleModel) IncreEquipByKey(detal uint32) string {
23822e2f   zhangqijia   fix: update proto...
86
  	return fmt.Sprintf("%s%04d", m.Data.Id, m.IncreByKey("equipment", detal))
d6d589a9   zhangqijia   feat: 增加装备接口
87
88
  }
  
0ce6c418   zhangqijia   fix: 修复 bug RoleM...
89
  func (m *RoleModel) InitRole() {
8d983031   zhangqijia   loginReq uid -> t...
90
91
  	//init hero
  	h1 := pb.Hero{
17fe96be   zhangqijia   feat: 增加装备相关数据和协议
92
  		Id:        m.IncreHearByKey(1),
23822e2f   zhangqijia   fix: update proto...
93
  		RoleId:    m.Data.Id,
17fe96be   zhangqijia   feat: 增加装备相关数据和协议
94
95
96
97
  		Type:      1,
  		Level:     1,
  		ReinCount: 0,
  		ReinPoint: 0,
6f0d72bd   zhangqijia   定时器功能完善优化
98
  	}
8d983031   zhangqijia   loginReq uid -> t...
99
100
101
  	m.AddHero(&h1)
  
  	h2 := h1
a24dea4c   zhangqijia   fix: id自增做了写更新。阵容...
102
  	h2.Id = m.IncreHearByKey(1)
8d983031   zhangqijia   loginReq uid -> t...
103
104
105
106
  	h2.Type = 2
  	m.AddHero(&h2)
  
  	h3 := h1
a24dea4c   zhangqijia   fix: id自增做了写更新。阵容...
107
  	h3.Id = m.IncreHearByKey(1)
8d983031   zhangqijia   loginReq uid -> t...
108
109
110
111
  	h3.Type = 3
  	m.AddHero(&h3)
  
  	h4 := h1
a24dea4c   zhangqijia   fix: id自增做了写更新。阵容...
112
  	h4.Id = m.IncreHearByKey(1)
8d983031   zhangqijia   loginReq uid -> t...
113
114
115
116
117
  	h4.Type = 4
  	m.AddHero(&h4)
  
  	//init team
  	t1 := pb.Team{
a24dea4c   zhangqijia   fix: id自增做了写更新。阵容...
118
  		Id:      m.IncreTeamByKey(1),
23822e2f   zhangqijia   fix: update proto...
119
  		RoleId:  m.Data.Id,
8d983031   zhangqijia   loginReq uid -> t...
120
121
122
123
124
125
126
  		HeroId1: h1.Id,
  		HeroId2: h2.Id,
  		HeroId3: h3.Id,
  	}
  	m.AddTeam(&t1)
  
  	t2 := t1
a24dea4c   zhangqijia   fix: id自增做了写更新。阵容...
127
  	t2.Id = m.IncreTeamByKey(1)
8d983031   zhangqijia   loginReq uid -> t...
128
129
130
  	m.AddTeam(&t2)
  
  	t3 := t1
a24dea4c   zhangqijia   fix: id自增做了写更新。阵容...
131
  	t3.Id = m.IncreTeamByKey(1)
8d983031   zhangqijia   loginReq uid -> t...
132
133
134
  	m.AddTeam(&t3)
  
  	t4 := t1
a24dea4c   zhangqijia   fix: id自增做了写更新。阵容...
135
  	t4.Id = m.IncreTeamByKey(1)
8d983031   zhangqijia   loginReq uid -> t...
136
  	m.AddTeam(&t4)
a24dea4c   zhangqijia   fix: id自增做了写更新。阵容...
137
  
4a502dd5   zhangqijia   fix: game,account...
138
  	//init limit
495e9142   zhangqijia   fix: 增加DisConnect...
139
140
  	var limit uint32 = 50
  	m.UpdateProperties(map[string]interface{}{"clotheslimit": limit, "weaponslimit": limit, "otherlimit": limit, "jewelrylimit": limit, "materiallimit": limit}, false)
4a502dd5   zhangqijia   fix: game,account...
141
  
a24dea4c   zhangqijia   fix: id自增做了写更新。阵容...
142
  	m.Update()
ee23102d   zhangqijia   支持mongo, grpc接服务器
143
  }
eb417b0b   zhangqijia   reactor mongo
144
  
8d983031   zhangqijia   loginReq uid -> t...
145
146
  func (m *RoleModel) LoadHero() {
  	heros := make([]*pb.Hero, 10)
23822e2f   zhangqijia   fix: update proto...
147
  	err := mongoproxy.FindMany("hero", "roleid", m.Data.Id, &heros)
8d983031   zhangqijia   loginReq uid -> t...
148
149
150
151
152
153
  	if err != nil {
  		logger.Error(err)
  		return
  	}
  	for _, hero := range heros {
  		m.Heros[hero.Id] = NewHero(hero)
6f0d72bd   zhangqijia   定时器功能完善优化
154
155
156
  	}
  }
  
8d983031   zhangqijia   loginReq uid -> t...
157
158
  func (m *RoleModel) LoadTeams() {
  	teams := make([]*pb.Team, 4)
23822e2f   zhangqijia   fix: update proto...
159
  	err := mongoproxy.FindMany("team", "roleid", m.Data.Id, &teams)
8d983031   zhangqijia   loginReq uid -> t...
160
161
162
163
  	if err != nil {
  		logger.Error(err)
  		return
  	}
0ce6c418   zhangqijia   fix: 修复 bug RoleM...
164
  	for _, team := range teams {
8d983031   zhangqijia   loginReq uid -> t...
165
  		m.Teams[team.Id] = NewTeam(team)
6f0d72bd   zhangqijia   定时器功能完善优化
166
167
168
  	}
  }
  
f631f225   zhangqijia   feat: 增加背包系统,以及背包...
169
170
  //加载背包数据到内存
  func (m *RoleModel) LoadItems() {
23822e2f   zhangqijia   fix: update proto...
171
  	m.Items = common.StringToMapNum(m.Data.Items)
17fe96be   zhangqijia   feat: 增加装备相关数据和协议
172
173
174
175
  }
  
  func (m *RoleModel) LoadEquipments() {
  	data := make([]*pb.Equipment, 10)
23822e2f   zhangqijia   fix: update proto...
176
  	err := mongoproxy.FindMany("equipment", "roleid", m.Data.Id, &data)
17fe96be   zhangqijia   feat: 增加装备相关数据和协议
177
178
179
180
181
182
183
  	if err != nil {
  		logger.Error(err)
  		return
  	}
  	for _, d := range data {
  		m.Equipments[d.Id] = NewEquip(d)
  	}
f631f225   zhangqijia   feat: 增加背包系统,以及背包...
184
185
  }
  
0ce6c418   zhangqijia   fix: 修复 bug RoleM...
186
  func (m *RoleModel) LoadAll() {
6f0d72bd   zhangqijia   定时器功能完善优化
187
188
  	m.LoadHero()
  	m.LoadTeams()
f631f225   zhangqijia   feat: 增加背包系统,以及背包...
189
  	m.LoadItems()
17fe96be   zhangqijia   feat: 增加装备相关数据和协议
190
  	m.LoadEquipments()
eb417b0b   zhangqijia   reactor mongo
191
192
  }
  
f631f225   zhangqijia   feat: 增加背包系统,以及背包...
193
194
  func (m *RoleModel) UpdateProperty(key string, val interface{}, notify bool) {
  	m.UpdateProperties(map[string]interface{}{key: val}, notify)
4255fd8e   zhangqijia   feat: 更新字段
195
196
  }
  
f631f225   zhangqijia   feat: 增加背包系统,以及背包...
197
  func (m *RoleModel) UpdateProperties(property map[string]interface{}, notify bool) {
4255fd8e   zhangqijia   feat: 更新字段
198
199
200
201
  	if len(property) < 1 {
  		return
  	}
  
d771e9e3   zhangqijia   fix: 优化FieldByNam...
202
  	role := &pb.Role{}
d35f4f81   zhangqijia   fix: 优化proto to i...
203
  
4255fd8e   zhangqijia   feat: 更新字段
204
205
206
207
208
209
  	ids := m.ParseFields(role.ProtoReflect(), property)
  	if len(ids) == 0 {
  		logger.Error("ParseFields err, len is 0")
  		return
  	}
  
23822e2f   zhangqijia   fix: update proto...
210
  	update := &pb.RoleUpdatePropertyNty{
d771e9e3   zhangqijia   fix: 优化FieldByNam...
211
  		Id:   ids,
4255fd8e   zhangqijia   feat: 更新字段
212
213
214
  		Role: role,
  	}
  	if rsp, err := proto.Marshal(update); err != nil {
23822e2f   zhangqijia   fix: update proto...
215
  		logger.Error("id %s, err:", m.Data.Id, err)
4255fd8e   zhangqijia   feat: 更新字段
216
  		return
d771e9e3   zhangqijia   fix: 优化FieldByNam...
217
  	} else {
f631f225   zhangqijia   feat: 增加背包系统,以及背包...
218
  		if m.GetConn() != nil && notify {
c1d56a47   zhangqijia   fix: update preserve
219
  			m.GetConn().Send(0, uint32(pb.ProtoCode_RoleUpdatePropertyNty), rsp, 0)
d771e9e3   zhangqijia   fix: 优化FieldByNam...
220
  		}
4255fd8e   zhangqijia   feat: 更新字段
221
  	}
7f269318   zhangqijia   add pb.go; 添加关闭连接...
222
223
  }
  
2e0aa298   zhangqijia   update 每条连接新增一条协程...
224
225
226
  func (m *RoleModel) GetAllHero() []*pb.Hero {
  	var h []*pb.Hero
  	for _, hero := range m.Heros {
23822e2f   zhangqijia   fix: update proto...
227
  		h = append(h, hero.(*HeroModel).Data)
6f0d72bd   zhangqijia   定时器功能完善优化
228
229
230
  	}
  	return h
  }
38dd96b4   zhangqijia   定时器+网络数据 peer 在一条...
231
  
0ce6c418   zhangqijia   fix: 修复 bug RoleM...
232
  func (m *RoleModel) GetAllTeam() []*pb.Team {
8d983031   zhangqijia   loginReq uid -> t...
233
  	var t []*pb.Team
0ce6c418   zhangqijia   fix: 修复 bug RoleM...
234
  	for _, team := range m.Teams {
23822e2f   zhangqijia   fix: update proto...
235
  		t = append(t, team.(*TeamModel).Data)
8d983031   zhangqijia   loginReq uid -> t...
236
237
238
239
  	}
  	return t
  }
  
17fe96be   zhangqijia   feat: 增加装备相关数据和协议
240
241
242
  func (m *RoleModel) GetEquipments() []*pb.Equipment {
  	var equips []*pb.Equipment
  	for _, e := range m.Equipments {
23822e2f   zhangqijia   fix: update proto...
243
  		equips = append(equips, e.(*EquipModel).Data)
17fe96be   zhangqijia   feat: 增加装备相关数据和协议
244
245
246
247
  	}
  	return equips
  }
  
38dd96b4   zhangqijia   定时器+网络数据 peer 在一条...
248
  func (m *RoleModel) OnRecoverTimer(now int64) {
c47aa250   zhangqijia   feat: 增加GM相关接口。详情...
249
  	m.SaveRoleData(now)
38dd96b4   zhangqijia   定时器+网络数据 peer 在一条...
250
251
  }
  
7f269318   zhangqijia   add pb.go; 添加关闭连接...
252
253
  func (m *RoleModel) OnOfflineEvent() {
  	// 设置最新的登录时间
c47aa250   zhangqijia   feat: 增加GM相关接口。详情...
254
  	m.SaveRoleData(common.Timex())
7f269318   zhangqijia   add pb.go; 添加关闭连接...
255
256
  }
  
c47aa250   zhangqijia   feat: 增加GM相关接口。详情...
257
258
  func (m *RoleModel) SaveRoleData(now int64) {
  	if now > 0 && now-m.lastSaveTs < common.SaveDataInterval {
38dd96b4   zhangqijia   定时器+网络数据 peer 在一条...
259
260
261
262
  		return
  	}
  	atomic.StoreInt64(&m.lastSaveTs, now)
  	m.Update()
8d983031   zhangqijia   loginReq uid -> t...
263
264
265
266
267
268
269
270
  
  	tbObjs := []components.ISchema{}
  	for _, tbObj := range tbObjs {
  		if tbObj != nil {
  			tbObj.Update()
  		}
  	}
  
c047d94f   zhangqijia   fix: update equip...
271
  	mpObjs := []SchemaMap{m.Heros, m.Teams, m.Equipments}
0ce6c418   zhangqijia   fix: 修复 bug RoleM...
272
273
274
275
276
277
278
279
  	for _, mpObj := range mpObjs {
  		for _, v := range mpObj {
  			if v != nil {
  				v.Update()
  			}
  		}
  	}
  }
8aaf28dd   zhangqijia   fix: 修复gm系统修改role...
280
  
c8509ef6   zhangqijia   fix: notify equip...
281
  func (m *RoleModel) IncrPropertyChan(key string, val int64, notify bool) {
f631f225   zhangqijia   feat: 增加背包系统,以及背包...
282
283
  	if m.GetConn() != nil {
  		m.GetConn().CustomChan() <- func() {
c8509ef6   zhangqijia   fix: notify equip...
284
285
  			incr := m.IncrProperty(key, val)
  			m.UpdateProperty(key, incr, notify)
8aaf28dd   zhangqijia   fix: 修复gm系统修改role...
286
287
288
289
290
291
292
  		}
  	} else {
  		m.IncrProperty(key, val)
  	}
  
  }
  
f631f225   zhangqijia   feat: 增加背包系统,以及背包...
293
294
295
296
  func (m *RoleModel) UpdatePropertyChan(key string, val interface{}, notify bool) {
  	if m.GetConn() != nil {
  		m.GetConn().CustomChan() <- func() {
  			m.UpdateProperties(map[string]interface{}{key: val}, notify)
8aaf28dd   zhangqijia   fix: 修复gm系统修改role...
297
298
  		}
  	} else {
f631f225   zhangqijia   feat: 增加背包系统,以及背包...
299
  		m.UpdateProperties(map[string]interface{}{key: val}, notify)
8aaf28dd   zhangqijia   fix: 修复gm系统修改role...
300
301
302
  	}
  }
  
f631f225   zhangqijia   feat: 增加背包系统,以及背包...
303
304
305
  func (m *RoleModel) SaveRoleDataChan(now int64) {
  	if m.GetConn() != nil {
  		m.GetConn().CustomChan() <- func() {
8aaf28dd   zhangqijia   fix: 修复gm系统修改role...
306
307
308
309
310
311
312
  			m.SaveRoleData(now)
  		}
  	} else {
  		m.SaveRoleData(now)
  	}
  
  }