RoleRealmLogic.lua 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. --境界系统
  2. --[=[
  3. 数据库存储数据: human.db.realmLv
  4. 只存境界等级,境界的属性加成等则是实时计算
  5. ]=]--
  6. local Msg = require("core.Msg")
  7. local BagLogic = require("bag.BagLogic")
  8. local realmConfig = require("excel.realm").Sheet1
  9. local Grid = require("bag.Grid")
  10. local RoleAttr = require("role.RoleAttr")
  11. local RoleDefine = require("role.RoleDefine")
  12. local ObjHuman = require("core.ObjHuman")
  13. local Util = require("common.Util")
  14. local REALM_UPGRADE_LOG = "realmUpgrade"
  15. --加万分比的属性
  16. local sp_attr = {
  17. [201] = 1,
  18. [202] = 1,
  19. [203] = 1,
  20. [204] = 1
  21. }
  22. local function calAttrSum(tbl, lv)
  23. for i = 1, lv do
  24. local cfg = realmConfig[i]
  25. if cfg and cfg.attrs then
  26. for k,v in ipairs(cfg.attrs) do
  27. local id = v[1]
  28. local value = v[2]
  29. tbl[k] = tbl[k] or {}
  30. tbl[k].key = id
  31. if sp_attr[id] then
  32. tbl[k].value = (tbl[k].value or 0) + (value / 100)
  33. else
  34. tbl[k].value = (tbl[k].value or 0) + value
  35. end
  36. end
  37. end
  38. end
  39. end
  40. local function sendToclient(human)
  41. local realmLv = human.db and human.db.realmLv or 0
  42. local msgRet = Util.copyTable(Msg.gc.GC_ROLE_REALM_QUERY)
  43. local bl = false
  44. if realmLv <= 0 then
  45. bl = true
  46. msgRet.nowRealmName = ""
  47. end
  48. local nowRealmCfg = bl and realmConfig[1] or realmConfig[realmLv]
  49. if not nowRealmCfg then
  50. return
  51. end
  52. if not bl then
  53. msgRet.nowRealmName = nowRealmCfg.name
  54. end
  55. local attrsCfg = nowRealmCfg.attrs
  56. msgRet.nowAttrs[0] = #attrsCfg
  57. if bl then
  58. for k,v in ipairs(attrsCfg) do
  59. msgRet.nowAttrs[k] = msgRet.nowAttrs[k] or {}
  60. msgRet.nowAttrs[k].key = v[1] or 0
  61. msgRet.nowAttrs[k].value = 0
  62. end
  63. else
  64. calAttrSum(msgRet.nowAttrs, realmLv)
  65. end
  66. local itemId, itemCnt, nextRealmCfg
  67. if realmLv < #realmConfig then
  68. nextRealmCfg = realmConfig[realmLv + 1]
  69. if not nextRealmCfg then
  70. return
  71. end
  72. itemCnt = nextRealmCfg.itemCnt
  73. calAttrSum(msgRet.nextAttrs, realmLv+1)
  74. else
  75. nextRealmCfg = realmConfig[realmLv]
  76. itemCnt = 0
  77. calAttrSum(msgRet.nextAttrs, realmLv)
  78. end
  79. itemId = nextRealmCfg.itemId
  80. Grid.makeItem(msgRet.itemData, itemId, itemCnt)
  81. msgRet.nextRealmName = nextRealmCfg.name
  82. msgRet.nextAttrs[0] = #nextRealmCfg.attrs
  83. Msg.send(msgRet, human.fd)
  84. end
  85. --境界对属性加成
  86. function doCalcHero(human, attrs)
  87. if not human then
  88. return
  89. end
  90. local realmLv = human.db and human.db.realmLv or 0
  91. if realmLv <= 0 then
  92. return
  93. end
  94. for i=1, realmLv do
  95. local singleCfg = realmConfig[i]
  96. if singleCfg and singleCfg.attrs then
  97. for _, v in ipairs(singleCfg.attrs) do
  98. if v[2] > 0 then
  99. RoleAttr.updateValue(v[1], v[2], attrs)
  100. end
  101. end
  102. end
  103. end
  104. end
  105. --获取境界名字
  106. function getRealmName(human)
  107. local name = ""
  108. if human.db and human.db.realmLv then
  109. local singleCfg = realmConfig[human.db.realmLv]
  110. if singleCfg and singleCfg.name then
  111. name = singleCfg.name
  112. end
  113. end
  114. return name
  115. end
  116. --红点判断
  117. function isDot(human)
  118. local realmLv = human.db.realmLv or 0
  119. if realmLv >= #realmConfig then
  120. return false
  121. end
  122. local singleCfg = realmConfig[1]
  123. if realmLv > 0 then
  124. singleCfg = realmConfig[realmLv + 1]
  125. end
  126. if not singleCfg then
  127. return false
  128. end
  129. local itemId = singleCfg.itemId
  130. local itemCnt = singleCfg.itemCnt
  131. if BagLogic.getItemCnt(human, itemId) < itemCnt then
  132. return false
  133. end
  134. return true
  135. end
  136. --查询
  137. function query(human)
  138. sendToclient(human)
  139. end
  140. --提升境界
  141. function realmUpgrade(human)
  142. local realmLv = human.db.realmLv or 0
  143. if realmLv >= #realmConfig then
  144. return
  145. end
  146. realmLv = realmLv + 1
  147. local singleCfg = realmConfig[realmLv]
  148. if not singleCfg then
  149. return
  150. end
  151. local itemId = singleCfg.itemId
  152. local itemCnt = singleCfg.itemCnt
  153. if not BagLogic.checkItemCnt(human, itemId, itemCnt) then
  154. return
  155. end
  156. BagLogic.delItem(human, itemId, itemCnt, REALM_UPGRADE_LOG)
  157. human.db.realmLv = realmLv
  158. sendToclient(human)
  159. RoleAttr.cleanHeroAttrCache(human)
  160. RoleAttr.doCalc(human)
  161. ObjHuman.sendAttr(human, RoleDefine.ZHANDOULI)
  162. end