Blame view

models/rolePlugin.go 5.6 KB
f631f225   zhangqijia   feat: 增加背包系统,以及背包...
1
2
3
  package models
  
  import (
f631f225   zhangqijia   feat: 增加背包系统,以及背包...
4
5
  	"fmt"
  	"github.com/golang/protobuf/proto"
17fe96be   zhangqijia   feat: 增加装备相关数据和协议
6
  	"pro2d/common"
f631f225   zhangqijia   feat: 增加背包系统,以及背包...
7
  	"pro2d/common/logger"
ddc88bac   zhangqijia   fix: 记录战斗
8
  	"pro2d/csvdata"
f631f225   zhangqijia   feat: 增加背包系统,以及背包...
9
  	"pro2d/pb"
f631f225   zhangqijia   feat: 增加背包系统,以及背包...
10
11
12
  )
  
  //背包系统
ddc88bac   zhangqijia   fix: 记录战斗
13
  func (m *RoleModel) GetItemCount(key string) int32 {
f631f225   zhangqijia   feat: 增加背包系统,以及背包...
14
15
  	c, ok := m.Items[key]
  	if !ok {
ddc88bac   zhangqijia   fix: 记录战斗
16
  		c = int32(0)
f631f225   zhangqijia   feat: 增加背包系统,以及背包...
17
  	}
ddc88bac   zhangqijia   fix: 记录战斗
18
  	return c
f631f225   zhangqijia   feat: 增加背包系统,以及背包...
19
20
21
  }
  
  func (m *RoleModel) CostItem(key string, count int32) bool {
ddc88bac   zhangqijia   fix: 记录战斗
22
  	if count > m.GetItemCount(key) {
f631f225   zhangqijia   feat: 增加背包系统,以及背包...
23
24
25
26
27
  		return false
  	}
  	return m.AddItem(key, -count)
  }
  
ddc88bac   zhangqijia   fix: 记录战斗
28
  func (m *RoleModel) CostItems(params common.IMapStringNum) bool {
f631f225   zhangqijia   feat: 增加背包系统,以及背包...
29
  	for k, v := range params {
ddc88bac   zhangqijia   fix: 记录战斗
30
  		if v > m.GetItemCount(k) {
f631f225   zhangqijia   feat: 增加背包系统,以及背包...
31
32
33
  			return false
  		}
  
c99d59cc   zhangqijia   fix: 批量删除物品
34
  		params[k] = -v
f631f225   zhangqijia   feat: 增加背包系统,以及背包...
35
  	}
c99d59cc   zhangqijia   fix: 批量删除物品
36
37
  
  	return m.AddItems(params)
f631f225   zhangqijia   feat: 增加背包系统,以及背包...
38
39
40
41
42
  }
  
  func (m *RoleModel) AddItem(key string, count int32) bool {
  	c := m.GetItemCount(key)
  
ddc88bac   zhangqijia   fix: 记录战斗
43
  	num := c + count
f631f225   zhangqijia   feat: 增加背包系统,以及背包...
44
  	if num > 0 {
ddc88bac   zhangqijia   fix: 记录战斗
45
  		m.Items[key] = num
f631f225   zhangqijia   feat: 增加背包系统,以及背包...
46
47
48
  	} else {
  		delete(m.Items, key)
  	}
ddc88bac   zhangqijia   fix: 记录战斗
49
  	m.SetProperty("items", common.MapNumToString(m.Items))
f631f225   zhangqijia   feat: 增加背包系统,以及背包...
50
  
30e6d227   zhangqijia   fix: add nty
51
  	rsp, err := proto.Marshal(&pb.RoleUpdateItemsNty{Items: fmt.Sprintf("%s=%d", key, num)})
f631f225   zhangqijia   feat: 增加背包系统,以及背包...
52
53
54
55
  	if err != nil {
  		logger.Error(err.Error())
  		return true
  	}
c2791869   zhangqijia   fix: gm增加删除装备删除物品接口
56
57
  
  	if m.GetConn() != nil {
c1d56a47   zhangqijia   fix: update preserve
58
  		m.GetConn().Send(0, uint32(pb.ProtoCode_RoleUpdateItemsNty), rsp, 0)
c2791869   zhangqijia   fix: gm增加删除装备删除物品接口
59
  	}
f631f225   zhangqijia   feat: 增加背包系统,以及背包...
60
61
62
  	return true
  }
  
ddc88bac   zhangqijia   fix: 记录战斗
63
  func (m *RoleModel) AddItems(params common.IMapStringNum) bool {
17fe96be   zhangqijia   feat: 增加装备相关数据和协议
64
  	tmp := make(common.IMapString)
f631f225   zhangqijia   feat: 增加背包系统,以及背包...
65
66
67
  	for k, v := range params {
  		c := m.GetItemCount(k)
  
ddc88bac   zhangqijia   fix: 记录战斗
68
  		num := c + v
f631f225   zhangqijia   feat: 增加背包系统,以及背包...
69
70
  		if num > 0 {
  			m.Items[k] = num
f631f225   zhangqijia   feat: 增加背包系统,以及背包...
71
  		} else {
c99d59cc   zhangqijia   fix: 批量删除物品
72
  			num = 0
f631f225   zhangqijia   feat: 增加背包系统,以及背包...
73
74
  			delete(m.Items, k)
  		}
c99d59cc   zhangqijia   fix: 批量删除物品
75
  		tmp[k] = num
f631f225   zhangqijia   feat: 增加背包系统,以及背包...
76
77
  	}
  
ddc88bac   zhangqijia   fix: 记录战斗
78
  	m.SetProperty("items", common.MapNumToString(m.Items))
f631f225   zhangqijia   feat: 增加背包系统,以及背包...
79
  
30e6d227   zhangqijia   fix: add nty
80
  	rsp, err := proto.Marshal(&pb.RoleUpdateItemsNty{Items: common.MapToString(tmp)})
f631f225   zhangqijia   feat: 增加背包系统,以及背包...
81
82
83
84
85
86
  	if err != nil {
  		logger.Error(err.Error())
  		return true
  	}
  
  	if m.GetConn() != nil {
c1d56a47   zhangqijia   fix: update preserve
87
  		m.GetConn().Send(0, uint32(pb.ProtoCode_RoleUpdateItemsNty), rsp, 0)
f631f225   zhangqijia   feat: 增加背包系统,以及背包...
88
89
90
91
  	}
  
  	return true
  }
c8509ef6   zhangqijia   fix: notify equip...
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
  
  func (m *RoleModel) AddHero(hero *pb.Hero) {
  	h := NewHero(hero)
  	h.Create()
  	m.Heros[hero.Id] = h
  }
  
  func (m *RoleModel) AddTeam(team *pb.Team) {
  	t := NewTeam(team)
  	t.Create()
  	m.Teams[team.Id] = t
  }
  
  func (m *RoleModel) UpdateTeam(teams []*pb.Team) {
  	for _, team := range teams {
23822e2f   zhangqijia   fix: update proto...
107
  		team.RoleId = m.Data.Id
c8509ef6   zhangqijia   fix: notify equip...
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
  		t := m.Teams[team.Id]
  		if t != nil {
  			t.UpdateSchema(team)
  		}
  	}
  }
  
  func (m *RoleModel) AddEquip(equip *pb.Equipment) *EquipModel {
  	e := NewEquip(equip)
  	e.Create()
  	m.Equipments[equip.Id] = e
  	m.EquipmentAddNotify(equip)
  	return e
  }
  
  func (m *RoleModel) EquipmentAddNotify(equip *pb.Equipment) {
23822e2f   zhangqijia   fix: update proto...
124
  	update := &pb.EquipmentAddNty{Equip: equip}
c8509ef6   zhangqijia   fix: notify equip...
125
126
127
128
129
  	if rsp, err := proto.Marshal(update); err != nil {
  		logger.Error(" EquipmentAddNotify  err:", err.Error())
  		return
  	} else {
  		if m.GetConn() != nil {
c1d56a47   zhangqijia   fix: update preserve
130
  			m.GetConn().SendSuccess(uint32(pb.ProtoCode_EquipmentAddNty), rsp, 0)
c8509ef6   zhangqijia   fix: notify equip...
131
132
133
  		}
  	}
  }
ddc88bac   zhangqijia   fix: 记录战斗
134
135
  
  func (m *RoleModel) UpLevel(exp int32) (int32, int32) {
23822e2f   zhangqijia   fix: update proto...
136
137
  	exp = exp + m.Data.Exp
  	level := m.Data.Level
ddc88bac   zhangqijia   fix: 记录战斗
138
  	oldLevelExp := csvdata.Get().TbAccountLevelExp.Get(level)
8f6d9ea9   zhangqijia   fix: UpLevel
139
  	if oldLevelExp == nil {
b0e5082c   zhangqijia   fix: 英雄升级函数优化
140
  		return level, exp
8f6d9ea9   zhangqijia   fix: UpLevel
141
  	}
ddc88bac   zhangqijia   fix: 记录战斗
142
  
b0e5082c   zhangqijia   fix: 英雄升级函数优化
143
144
145
146
147
148
149
150
151
152
153
  	for exp > 0 {
  		if exp >= oldLevelExp.NeedExp {
  			exp = exp - oldLevelExp.NeedExp
  			level++
  		} else {
  			break
  		}
  		oldLevelExp = csvdata.Get().TbAccountLevelExp.Get(level)
  		if oldLevelExp == nil {
  			return level, exp
  		}
ddc88bac   zhangqijia   fix: 记录战斗
154
155
  	}
  	return level, exp
ddc88bac   zhangqijia   fix: 记录战斗
156
157
158
159
160
161
  }
  
  func (m *RoleModel) Award(award common.IMapStringNum) common.IMapStringNum {
  	m.AddItems(award)
  	return award
  }
98cfa13a   zhangqijia   fix: 批量穿戴裝備
162
  
35adfcdb   zhangqijia   fix: 裝備戒指类型特殊处理
163
  func (m *RoleModel) EquipmentRefer(equipId, heroId string, refer bool, pos int32) int32 {
98cfa13a   zhangqijia   fix: 批量穿戴裝備
164
165
166
167
168
169
170
171
172
173
  	e, ok := m.Equipments[equipId]
  	if !ok {
  		return 2
  	}
  
  	equip := e.(*EquipModel)
  
  	// 1 脱
  	// 1.1 装备直接脱掉
  	// 2 戴
74286d71   zhangqijia   fix: 裝備 删除pos 添加 ...
174
175
176
177
178
  	// 2.0.1 如果是戒指,特殊处理, 未被其他英雄穿戴直接穿,同位置装备是否穿戴, 已经被穿戴,则脱了再穿
  	// 2.0.2 如果是戒指,特殊处理, 如果其他英雄已经被穿戴,则脱了再穿, 同位置装备是否穿戴, 已经被穿戴,则脱了再穿
  	// 2.1.1 如果不是戒指,未被其他英雄穿戴直接穿,同位置装备是否穿戴, 已经被穿戴,则脱了再穿
  	// 2.1.2 如果不是戒指,如果其他英雄已经被穿戴,则脱了再穿, 同位置装备是否穿戴, 已经被穿戴,则脱了再穿
  	// 可以合并。不用判断是否是戒指。
98cfa13a   zhangqijia   fix: 批量穿戴裝備
179
  	h1 := m.Heros[heroId]
23822e2f   zhangqijia   fix: update proto...
180
  	h2 := m.Heros[equip.Data.HeroId]
98cfa13a   zhangqijia   fix: 批量穿戴裝備
181
182
  
  	var outHero, inHero *HeroModel
23822e2f   zhangqijia   fix: update proto...
183
  	inEquip := csvdata.Get().TbEquipmentData.Get(equip.Data.GetTbId())
98cfa13a   zhangqijia   fix: 批量穿戴裝備
184
  	if !refer {
98cfa13a   zhangqijia   fix: 批量穿戴裝備
185
186
  		if h1 != nil {
  			outHero = h1.(*HeroModel)
23822e2f   zhangqijia   fix: update proto...
187
  			outHero.DelEquipment(equip.Data.Id)
98cfa13a   zhangqijia   fix: 批量穿戴裝備
188
189
190
  		}
  		if h2 != nil {
  			outHero = h2.(*HeroModel)
23822e2f   zhangqijia   fix: update proto...
191
  			outHero.DelEquipment(equip.Data.Id)
98cfa13a   zhangqijia   fix: 批量穿戴裝備
192
193
194
195
196
197
198
199
200
  		}
  		equip.SetProperty("heroid", "")
  
  	} else {
  		if h1 == nil {
  			return 3
  		}
  		inHero = h1.(*HeroModel)
  
35adfcdb   zhangqijia   fix: 裝備戒指类型特殊处理
201
202
203
204
205
  		if common.EquipmentTyp(inEquip.EquipType) == common.Ring {
  			if pos != common.RingPosL && pos != common.RingPosR {
  				return 4
  			}
  		}
74286d71   zhangqijia   fix: 裝備 删除pos 添加 ...
206
  		// 2.1.1
23822e2f   zhangqijia   fix: update proto...
207
  		if equip.Data.HeroId == "" {
98cfa13a   zhangqijia   fix: 批量穿戴裝備
208
  			var outEquipID string
74286d71   zhangqijia   fix: 裝備 删除pos 添加 ...
209
  			for id, typ := range inHero.Equipments {
35adfcdb   zhangqijia   fix: 裝備戒指类型特殊处理
210
  				if typ == pos {
98cfa13a   zhangqijia   fix: 批量穿戴裝備
211
212
213
214
  					outEquipID = id
  					break
  				}
  			}
98cfa13a   zhangqijia   fix: 批量穿戴裝備
215
216
217
218
219
  			if outEquipID != "" {
  				tmpEuqip, ok := m.Equipments[outEquipID]
  				if ok {
  					outEquip := tmpEuqip.(*EquipModel)
  					outEquip.SetProperty("heroid", "")
3cd84ccc   zhangqijia   fix: 裝備位置修改
220
  					inHero.DelEquipment(outEquipID)
98cfa13a   zhangqijia   fix: 批量穿戴裝備
221
222
223
  				}
  			}
  
23822e2f   zhangqijia   fix: update proto...
224
225
  			inHero.AddEquipment(equip.Data.Id, pos)
  			equip.SetProperty("heroid", inHero.Data.Id)
35adfcdb   zhangqijia   fix: 裝備戒指类型特殊处理
226
  			equip.SetProperty("pos", pos)
3cd84ccc   zhangqijia   fix: 裝備位置修改
227
  		} else {
98cfa13a   zhangqijia   fix: 批量穿戴裝備
228
229
230
  			if h2 == nil {
  				return 4
  			}
74286d71   zhangqijia   fix: 裝備 删除pos 添加 ...
231
  			// 2.1.2
98cfa13a   zhangqijia   fix: 批量穿戴裝備
232
233
  			outHero = h2.(*HeroModel)
  			var outEquipID string
3cd84ccc   zhangqijia   fix: 裝備位置修改
234
  			for id, tpos := range inHero.Equipments {
35adfcdb   zhangqijia   fix: 裝備戒指类型特殊处理
235
  				if tpos == pos {
98cfa13a   zhangqijia   fix: 批量穿戴裝備
236
237
238
239
240
241
242
243
244
245
  					outEquipID = id
  					break
  				}
  			}
  
  			if outEquipID != "" {
  				tmpEquip, ok := m.Equipments[outEquipID]
  				if ok {
  					outEquip := tmpEquip.(*EquipModel)
  					outEquip.SetProperty("heroid", "")
3cd84ccc   zhangqijia   fix: 裝備位置修改
246
  					inHero.DelEquipment(outEquipID)
98cfa13a   zhangqijia   fix: 批量穿戴裝備
247
248
249
  				}
  			}
  
23822e2f   zhangqijia   fix: update proto...
250
251
252
  			outHero.DelEquipment(equip.Data.Id)
  			inHero.AddEquipment(equip.Data.Id, pos)
  			equip.SetProperty("heroid", inHero.Data.Id)
35adfcdb   zhangqijia   fix: 裝備戒指类型特殊处理
253
  			equip.SetProperty("pos", pos)
98cfa13a   zhangqijia   fix: 批量穿戴裝備
254
  		}
74286d71   zhangqijia   fix: 裝備 删除pos 添加 ...
255
  
98cfa13a   zhangqijia   fix: 批量穿戴裝備
256
257
258
  	}
  	return 0
  }