role_wishBox.go 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317
  1. package model
  2. import (
  3. "math/rand"
  4. "rocommon/util"
  5. "roserver/baseserver/model"
  6. "roserver/serverproto"
  7. )
  8. func newRoleWish(r *Role) *RoleWishBox {
  9. roleCommon := &RoleWishBox{
  10. SaveObject: SaveObject{
  11. role: r,
  12. },
  13. }
  14. return roleCommon
  15. }
  16. type WishSlotInfo struct {
  17. *serverproto.WishSlot
  18. //srcDb *model.StDbWishBox
  19. }
  20. func (this WishSlotInfo) HasLucky() bool {
  21. srcDb, ok := model.ConvertWishBoxData[this.SrcItem]
  22. if !ok {
  23. util.ErrorF("WishSlotInfo HasLucky error srcDb == nil")
  24. return false
  25. }
  26. value := rand.Int31n(100)
  27. return value <= srcDb.LuckyProb
  28. }
  29. func (this WishSlotInfo) GetLuckyItem() (item *serverproto.KeyValueType) {
  30. srcDb, ok := model.ConvertWishBoxData[this.SrcItem]
  31. if !ok {
  32. util.ErrorF("WishSlotInfo GetLuckyItem error srcDb == nil")
  33. return nil
  34. }
  35. item = &serverproto.KeyValueType{}
  36. value := rand.Int31n(srcDb.LuckyReward[len(srcDb.LuckyReward)-1].Weight)
  37. for _, data := range srcDb.LuckyReward {
  38. if value > data.Weight {
  39. continue
  40. }
  41. item.Key = data.ItemId
  42. item.Value = data.ItemCnt
  43. break
  44. }
  45. return
  46. }
  47. func (this WishSlotInfo) GetRewardItem(itemId int32) (ret *model.StProbRewardData) {
  48. srcDb, ok := model.ConvertWishBoxData[this.SrcItem]
  49. if !ok {
  50. util.ErrorF("WishSlotInfo GetRewardItem error srcDb == nil")
  51. return nil
  52. }
  53. for _, i2 := range srcDb.RewardList {
  54. if i2.ItemId != itemId {
  55. continue
  56. }
  57. ret = i2
  58. break
  59. }
  60. return
  61. }
  62. func (this WishSlotInfo) GetRandRewardItem() (ret *model.StProbRewardData) {
  63. srcDb, ok := model.ConvertWishBoxData[this.SrcItem]
  64. if !ok {
  65. util.ErrorF("WishSlotInfo GetRandRewardItem error srcDb == nil")
  66. return nil
  67. }
  68. total := srcDb.RewardList[len(srcDb.RewardList)-1].Weight
  69. value := rand.Int31n(total)
  70. for _, i2 := range srcDb.RewardList {
  71. if value > i2.Weight {
  72. continue
  73. }
  74. ret = i2
  75. break
  76. }
  77. return
  78. }
  79. type RoleWishBox struct {
  80. SaveObject
  81. slot []*WishSlotInfo
  82. }
  83. func (this *RoleWishBox) Load(msg interface{}) bool {
  84. proRole := msg.(*serverproto.Role)
  85. wish := proRole.RoleWish
  86. if wish == nil {
  87. return false
  88. }
  89. for _, data := range wish.Slots {
  90. this.slot = append(this.slot, &WishSlotInfo{WishSlot: data})
  91. }
  92. util.InfoF("uid=%v RoleWishBox Load .. list=%v", this.role.GetUUid(), this.slot)
  93. return true
  94. }
  95. func (this *RoleWishBox) Save() {
  96. this.SetDirty(false)
  97. saveMsg := &serverproto.SSWishBoxDataSaveReq{Wishs: &serverproto.RoleWish{}}
  98. for _, data := range this.slot {
  99. saveMsg.Wishs.Slots = append(saveMsg.Wishs.Slots, data.WishSlot)
  100. }
  101. this.role.SendDb(saveMsg)
  102. }
  103. func (this *RoleWishBox) CopyData(wish *serverproto.RoleWish) {
  104. for _, data := range this.slot {
  105. wish.Slots = append(wish.Slots, data.WishSlot)
  106. }
  107. }
  108. // 许愿
  109. func (this *RoleWishBox) OnWishBoxUse(itemId uint64, selectItem int32) (serverproto.ErrorCode, int32) {
  110. index := int32(-1)
  111. if itemId <= 0 {
  112. return serverproto.ErrorCode_ERROR_FAIL, index
  113. }
  114. item := this.role.roleBag.getItemById(itemId)
  115. if item == nil {
  116. return serverproto.ErrorCode_ERROR_WISH_BOX_NOT_ITEM, index
  117. }
  118. if !this.hasSlot() {
  119. return serverproto.ErrorCode_ERROR_WISH_NOT_SLOT, index
  120. }
  121. dbData, ok := model.ConvertWishBoxData[item.ConfigId]
  122. if !ok {
  123. return serverproto.ErrorCode_ERROR_WISH_NOT_WISHBOX, index
  124. }
  125. reward := dbData.GetRewardItem(selectItem)
  126. if !dbData.IsRand && reward == nil {
  127. return serverproto.ErrorCode_ERROR_WISH_NOT_ITEM, index
  128. }
  129. if reward == nil {
  130. reward = dbData.GetRandRewardItem()
  131. }
  132. //this.role.DelItem(item.ConfigId, 1, AddItemST{AddFrom: AddFrom_WishBoxUse, Notify: true})
  133. index = this.AddSlotItem(reward, dbData)
  134. if index < 0 {
  135. return serverproto.ErrorCode_ERROR_FAIL, index
  136. }
  137. this.role.DelItem(item.ConfigId, 1, AddItemST{AddFrom: AddFrom_WishBoxUse, Notify: true})
  138. this.SendWishSlot()
  139. this.SetDirty(true)
  140. return serverproto.ErrorCode_ERROR_OK, index
  141. }
  142. // 解锁许愿槽位
  143. func (this *RoleWishBox) OnUnlockWishSlot() serverproto.ErrorCode {
  144. if int32(len(this.slot)) >= model.GlobalWishSlotMaxCnt {
  145. return serverproto.ErrorCode_ERROR_WISH_ALL_UNLOCK
  146. }
  147. if !this.role.roleBag.CanDelItem(model.GlobalWishSlotCost.Key, model.GlobalWishSlotCost.Value) {
  148. return serverproto.ErrorCode_ERROR_RES_NOT_ENOUGH
  149. }
  150. this.role.DelItem(model.GlobalWishSlotCost.Key, model.GlobalWishSlotCost.Value, AddItemST{AddFrom: AddFrom_WishBox})
  151. this.slot = append(this.slot, &WishSlotInfo{WishSlot: &serverproto.WishSlot{IsOpen: true}})
  152. this.SendWishSlot()
  153. this.SetDirty(true)
  154. return serverproto.ErrorCode_ERROR_OK
  155. }
  156. // 领取许愿奖励
  157. func (this *RoleWishBox) OnWishRewardGet(index int32) (error serverproto.ErrorCode, awardItem *serverproto.KeyValueType, luckyItem *serverproto.KeyValueType) {
  158. error = serverproto.ErrorCode_ERROR_OK
  159. if index < 0 || index > int32(len(this.slot))-1 {
  160. return serverproto.ErrorCode_ERROR_FAIL, nil, nil
  161. }
  162. rewardItem := this.slot[index]
  163. if rewardItem.Item == nil {
  164. return serverproto.ErrorCode_ERROR_WISH_SLOT_NOT_ITEM, nil, nil
  165. }
  166. if rewardItem.EndTime > util.GetTimeSeconds() {
  167. // 加速
  168. dbData, ok := model.ConvertWishBoxData[rewardItem.SrcItem]
  169. if !ok {
  170. return serverproto.ErrorCode_ERROR_FAIL, nil, nil
  171. }
  172. if !this.role.roleBag.CanDelItem(dbData.SpeedCost.Key, dbData.SpeedCost.Value) {
  173. return serverproto.ErrorCode_ERROR_WISH_NOT_SPEED_ITEM, nil, nil
  174. }
  175. this.role.DelItem(dbData.SpeedCost.Key, dbData.SpeedCost.Value, AddItemST{AddFrom: AddFrom_WishBoxSpeed})
  176. rewardItem.IsLucky = rewardItem.HasLucky()
  177. }
  178. // 判断许愿奖励
  179. if rewardItem.Item != nil && this.role.roleBag.CanAddItem(rewardItem.Item.Key, rewardItem.Item.Value) == serverproto.ErrorCode_ERROR_OK {
  180. this.role.roleBag.AddItem(rewardItem.Item.Key, rewardItem.Item.Value, AddItemST{AddFrom: AddFrom_WishBox, Notify: true})
  181. }
  182. // 是否有暴击物品
  183. if rewardItem.IsLucky {
  184. if item := rewardItem.GetLuckyItem(); item != nil {
  185. this.role.roleBag.AddItem(item.Key, item.Value, AddItemST{AddFrom: AddFrom_WishBox, Notify: true})
  186. luckyItem = item
  187. }
  188. }
  189. awardItem = rewardItem.Item
  190. this.clearSlot(index)
  191. this.SendWishSlot()
  192. this.SetDirty(true)
  193. return
  194. }
  195. func (this *RoleWishBox) Update(ms uint64) {
  196. updateMsg := false
  197. sec := int64(ms / 1000)
  198. for _, data := range this.slot {
  199. if data.EndTime <= 0 {
  200. continue
  201. }
  202. if data.EndTime > sec {
  203. continue
  204. }
  205. data.EndTime = 0
  206. updateMsg = true
  207. data.IsLucky = data.HasLucky()
  208. this.SetDirty(true)
  209. }
  210. if updateMsg {
  211. this.SendWishSlot()
  212. }
  213. }
  214. func (this *RoleWishBox) AddSlotItem(itemInfo *model.StProbRewardData, srcDb *model.StDbWishBox) (index int32) {
  215. if itemInfo == nil {
  216. return -1
  217. }
  218. index = -1
  219. for i, slot := range this.slot {
  220. if slot.Item != nil {
  221. continue
  222. }
  223. if !slot.IsOpen {
  224. continue
  225. }
  226. slot.SrcItem = srcDb.ItemId
  227. //slot.srcDb = srcDb
  228. slot.Item = &serverproto.KeyValueType{Key: itemInfo.ItemId, Value: itemInfo.ItemCnt}
  229. slot.EndTime = int64(itemInfo.WaitTime) + util.GetTimeSeconds()
  230. index = int32(i)
  231. break
  232. }
  233. return index
  234. }
  235. //func (this *RoleWishBox) AddSlotItem(itemId, selectItem int32) (index int32) {
  236. // if itemId <= 0 || selectItem <= 0{
  237. // return -1
  238. // }
  239. // dbData, ok := model.ConvertWishBoxData[itemId]
  240. // if !ok{
  241. // return -1
  242. // }
  243. // //reward := dbData.GetRewardItem(selectItem)
  244. // //if !dbData.IsRand && reward == nil{
  245. // // return serverproto.ErrorCode_ERROR_WISH_NOT_ITEM, index
  246. // //}
  247. // //if reward == nil{
  248. // // reward = dbData.GetRandRewardItem()
  249. // //}
  250. // index = -1
  251. // for i, slot := range this.slot {
  252. // if slot.Item != nil{continue}
  253. // if !slot.IsOpen{continue}
  254. // slot.SrcItem = itemId
  255. // if dbData.IsRand{
  256. // Award := slot.GetRandRewardItem()
  257. // }
  258. // slot.Item = &serverproto.KeyValueType{Key: itemInfo.ItemId, Value: itemInfo.ItemCnt}
  259. // slot.EndTime = int64(itemInfo.WaitTime) + util.GetTimeSeconds()
  260. // index = int32(i)
  261. // break
  262. // }
  263. // return index
  264. //}
  265. func (this *RoleWishBox) clearSlot(index int32) {
  266. if len(this.slot) < int(index) {
  267. return
  268. }
  269. this.slot[index].Reset()
  270. this.slot[index].IsOpen = true
  271. }
  272. func (this RoleWishBox) SendWishSlot() {
  273. msg := &serverproto.SCUpdateWishSlotNtf{}
  274. for _, data := range this.slot {
  275. msg.Slots = append(msg.Slots, data.WishSlot)
  276. }
  277. this.role.ReplayGate(msg, true)
  278. }
  279. func (this RoleWishBox) hasSlot() bool {
  280. for _, slot := range this.slot {
  281. if slot.Item != nil {
  282. continue
  283. }
  284. if !slot.IsOpen {
  285. continue
  286. }
  287. return true
  288. }
  289. return false
  290. }