HeroExclusiveWeapon.lua 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396
  1. --超武之专属武器
  2. local Msg = require("core.Msg")
  3. local Grid = require("bag.Grid")
  4. local BagLogic = require("bag.BagLogic")
  5. local HeroLogic = require("hero.HeroLogic")
  6. local RoleSystemLogic = require("roleSystem.RoleSystemLogic")
  7. local RoleSystemDefine = require("roleSystem.RoleSystemDefine")
  8. local Lang = require("common.Lang")
  9. local Broadcast = require("broadcast.Broadcast")
  10. local RoleAttr = require("role.RoleAttr")
  11. local RoleDefine = require("role.RoleDefine")
  12. local ObjHuman = require("core.ObjHuman")
  13. local Config = require("excel.weapon").weapon
  14. local HeroExcel = require("excel.hero").hero
  15. local COND_STAR = 12 -- 获得超武需要的星级
  16. local STAGELV = 20 -- 每20级获得一个特殊效果
  17. local LOGTAG = "HeroExclusiveWeapon" --日志标识
  18. local SSRGRADE = 4 -- SSR英雄的grade值
  19. --获取英雄的专属武器配置
  20. local function getHeroWeaponCfg(heroID)
  21. for _, cfg in pairs(Config) do
  22. if cfg.heroId == heroID then
  23. return cfg
  24. end
  25. end
  26. end
  27. --获得消耗列表
  28. local function getItemList(costItemList, nextWeaponLv)
  29. local itemList = {}
  30. local itemId, itemCnt = 0,0
  31. for i=1, #costItemList, 3 do
  32. local lv = costItemList[i]
  33. if nextWeaponLv < lv then
  34. break
  35. end
  36. itemId = costItemList[i+1]
  37. if type(costItemList[i+2]) == "table" then
  38. itemCnt = costItemList[i+2][1] * nextWeaponLv + costItemList[i+2][2]
  39. else
  40. itemCnt = costItemList[i+2]
  41. end
  42. itemList[itemId] = itemCnt
  43. end
  44. return itemList
  45. end
  46. --计算一个英雄当前专属武器等级消耗的道具
  47. function CalcLevelCostItem(human, heroID, heroIndex)
  48. local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
  49. if heroGrid.star < COND_STAR then
  50. return
  51. end
  52. if not heroGrid.weaponLv or heroGrid.weaponLv <= 0 then
  53. return
  54. end
  55. local heroCfg = HeroExcel[heroGrid.id]
  56. if heroCfg.grade < SSRGRADE then
  57. return
  58. end
  59. local cfg = getHeroWeaponCfg(heroID)
  60. if not cfg then
  61. return
  62. end
  63. local itemList = {}
  64. local costItemList = cfg.costItemList
  65. for i=1, heroGrid.weaponLv do
  66. local costTb = getItemList(costItemList, i)
  67. for itemId, itemCnt in pairs(costTb) do
  68. itemList[itemId] = itemList[itemId] or 0
  69. itemList[itemId] = itemList[itemId] + itemCnt
  70. end
  71. end
  72. return itemList
  73. end
  74. --设置某个英雄的专属武器等级
  75. function SetHeroWeaponLv(human, heroID, heroIndex, lv)
  76. local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
  77. if heroGrid.star < COND_STAR then
  78. return
  79. end
  80. local heroCfg = HeroExcel[heroGrid.id]
  81. if heroCfg.grade < SSRGRADE then
  82. return
  83. end
  84. local cfg = getHeroWeaponCfg(heroID)
  85. if not cfg then
  86. return
  87. end
  88. heroGrid.weaponLv = lv
  89. --更新数据
  90. Query(human, heroID, heroIndex)
  91. end
  92. --专属武器加成
  93. function doCalcHero(heroGrid, addAttrs)
  94. if not heroGrid or not heroGrid.weaponLv then
  95. return
  96. end
  97. local cfg = getHeroWeaponCfg(heroGrid.id)
  98. if not cfg then
  99. return
  100. end
  101. local nowWeaponLv = heroGrid.weaponLv
  102. for _, v in ipairs(cfg.normalAttrs) do
  103. RoleAttr.updateValue(v[1], v[2] * nowWeaponLv, addAttrs)
  104. end
  105. end
  106. --获取专属武器对英雄技能提供额外效果的 技能ID/buff ID
  107. function GetweaponEffectIdList(heroGrid)
  108. if not heroGrid or not heroGrid.weaponLv then
  109. return
  110. end
  111. local cfg = getHeroWeaponCfg(heroGrid.id)
  112. if not cfg then
  113. return
  114. end
  115. local stage = math.floor(heroGrid.weaponLv / STAGELV)
  116. if stage < 1 then
  117. return
  118. end
  119. local ids = {}
  120. local effectCfg = cfg.stage2effect
  121. for k, tabl in ipairs(effectCfg) do
  122. if stage < k then
  123. break
  124. end
  125. for _,v in ipairs(tabl) do
  126. ids[v[1]] = v[2]
  127. end
  128. end
  129. return ids
  130. end
  131. --红点判断
  132. function isWeaponDot(human, heroGrid)
  133. if heroGrid.star < COND_STAR then
  134. return false
  135. end
  136. local heroCfg = HeroExcel[heroGrid.id]
  137. if heroCfg.grade < SSRGRADE then
  138. return false
  139. end
  140. local cfg = getHeroWeaponCfg(heroGrid.id)
  141. if not cfg then
  142. return false
  143. end
  144. local nowWeaponLv = heroGrid.weaponLv or 0
  145. if nowWeaponLv >= cfg.maxLevel then
  146. return false
  147. end
  148. local itemList = getItemList(cfg.costItemList, nowWeaponLv+1)
  149. for itemId, itemCnt in pairs(itemList) do
  150. if BagLogic.getItemCnt(human, itemId) < itemCnt then
  151. return false
  152. end
  153. end
  154. return true
  155. end
  156. --查询
  157. function Query(human, heroID, heroIndex)
  158. local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
  159. if not heroGrid then
  160. return Broadcast.sendErr(human, Lang.COMMON_ARGUMENT_ERROR)
  161. end
  162. if heroGrid.star < COND_STAR then
  163. return Broadcast.sendErr(human, Lang.COMMOM_NOT_ENABLED)
  164. end
  165. local heroCfg = HeroExcel[heroGrid.id]
  166. if heroCfg.grade < SSRGRADE then
  167. return Broadcast.sendErr(human, Lang.COMMOM_NOT_ENABLED)
  168. end
  169. local cfg = getHeroWeaponCfg(heroID)
  170. -- if not cfg then
  171. -- return Broadcast.sendErr(human, Lang.COMMOM_NOT_ENABLED)
  172. -- end
  173. local msgRet = Msg.gc.GC_HERO_EXCLUSIVE_WEAPON_QUERY
  174. msgRet.name = ""
  175. msgRet.level = 0
  176. msgRet.icon = 0
  177. msgRet.costInfo[0] =0
  178. msgRet.normalAttrs[0] = 0
  179. msgRet.specEffect[0] = 0
  180. if cfg then
  181. local nowWeaponLv = heroGrid.weaponLv or 0
  182. local nextWeaponLv = nowWeaponLv + 1
  183. msgRet.name = cfg.name
  184. msgRet.level = nowWeaponLv
  185. msgRet.icon = cfg.iconId
  186. local costInfo = msgRet.costInfo
  187. costInfo[0] = 0
  188. if nowWeaponLv < cfg.maxLevel then
  189. local len= 0
  190. local costItemList = cfg.costItemList
  191. local itemList = getItemList(costItemList, nextWeaponLv)
  192. for itemId, itemCnt in pairs(itemList) do
  193. len = len + 1
  194. Grid.makeItem(costInfo[len], itemId, itemCnt)
  195. end
  196. costInfo[0] = len
  197. end
  198. --普通属性加成
  199. local normalAttrs = msgRet.normalAttrs
  200. local normalAttrsCfg = cfg.normalAttrs
  201. normalAttrs[0] = #normalAttrsCfg
  202. for k, v in ipairs(normalAttrsCfg) do
  203. normalAttrs[k] = {}
  204. normalAttrs[k].key = v[1] or 0
  205. normalAttrs[k].value = v[2] * nowWeaponLv
  206. end
  207. --特殊效果
  208. local stage = math.floor(nowWeaponLv / STAGELV)
  209. local specEffect = msgRet.specEffect
  210. specEffect[0] = #cfg.effectDesc
  211. for k, desc in ipairs(cfg.effectDesc) do
  212. specEffect[k].desc = desc
  213. specEffect[k].isActivate = 0
  214. if stage >= k then
  215. specEffect[k].isActivate = 1
  216. end
  217. end
  218. end
  219. Msg.send(msgRet, human.fd)
  220. end
  221. --升级
  222. function UpgradeWeapon(human, heroID, heroIndex)
  223. local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
  224. if not heroGrid then
  225. return Broadcast.sendErr(human, Lang.COMMON_ARGUMENT_ERROR)
  226. end
  227. if heroGrid.star < COND_STAR then
  228. return Broadcast.sendErr(human, Lang.COMMOM_NOT_ENABLED)
  229. end
  230. local heroCfg = HeroExcel[heroGrid.id]
  231. if heroCfg.grade < SSRGRADE then
  232. return Broadcast.sendErr(human, Lang.COMMOM_NOT_ENABLED)
  233. end
  234. local cfg = getHeroWeaponCfg(heroID)
  235. if not cfg then
  236. return Broadcast.sendErr(human, Lang.COMMOM_NOT_ENABLED)
  237. end
  238. local nowWeaponLv = heroGrid.weaponLv or 0
  239. if nowWeaponLv >= cfg.maxLevel then
  240. return Broadcast.sendErr(human, Lang.BINGSHU_LEVELUP_ERR_FULL)
  241. end
  242. local nextWeaponLv = nowWeaponLv + 1
  243. local costItemList = cfg.costItemList
  244. local itemList = getItemList(costItemList, nextWeaponLv)
  245. for itemId, itemCnt in pairs(itemList) do
  246. if BagLogic.getItemCnt(human, itemId) < itemCnt then
  247. return Broadcast.sendErr(human, Lang.COMMON_ITEM_NOT_ENOUGH)
  248. end
  249. end
  250. --扣除道具
  251. for itemId, itemCnt in pairs(itemList) do
  252. BagLogic.delItem(human, itemId, itemCnt, LOGTAG)
  253. end
  254. --更新等级
  255. heroGrid.weaponLv = nextWeaponLv
  256. --下发数据
  257. Query(human, heroID, heroIndex)
  258. --重算战力和红点
  259. RoleAttr.cleanHeroAttrCache(human)
  260. RoleAttr.doCalc(human)
  261. HeroLogic.sendHeroBagDynamic(human, heroID, heroIndex)
  262. ObjHuman.sendAttr(human, RoleDefine.ZHANDOULI)
  263. HeroLogic.refreshDot(human, heroGrid.uuid)
  264. end
  265. --GM, 设置所有id为heroID英雄的专属武器等级
  266. function GmSetHeroWeaponLv(human, heroID, lv)
  267. local heroCfg = HeroExcel[heroID]
  268. if not heroCfg then
  269. return Broadcast.sendErr(human, Lang.COMMON_ARGUMENT_ERROR)
  270. end
  271. if heroCfg.grade < SSRGRADE then
  272. return Broadcast.sendErr(human, Lang.COMMOM_NOT_ENABLED)
  273. end
  274. local heroNum = human.db.heroBag[0]
  275. for i=1, heroNum do
  276. local heroGrid = human.db.heroBag[i]
  277. if not heroGrid then
  278. break
  279. end
  280. if heroGrid.id == heroID and heroGrid.star >= COND_STAR then
  281. heroGrid.weaponLv = lv
  282. end
  283. end
  284. end
  285. --专属武器图鉴查询
  286. function BookQuery(human, heroID)
  287. local cfg = getHeroWeaponCfg(heroID)
  288. -- if not cfg then
  289. -- return Broadcast.sendErr(human, Lang.COMMOM_NOT_ENABLED)
  290. -- end
  291. local msgRet = Msg.gc.GC_HERO_EXCLUSIVE_WEAPON_BOOK_QUERY
  292. msgRet.name = ""
  293. msgRet.icon = 0
  294. msgRet.normalAttrs[0] = 0
  295. msgRet.specEffect[0] = 0
  296. if cfg then
  297. msgRet.name = cfg.name
  298. msgRet.icon = cfg.iconId
  299. --普通属性加成
  300. local normalAttrs = msgRet.normalAttrs
  301. local normalAttrsCfg = cfg.normalAttrs
  302. normalAttrs[0] = #normalAttrsCfg
  303. for k, v in ipairs(normalAttrsCfg) do
  304. normalAttrs[k] = {}
  305. normalAttrs[k].key = v[1] or 0
  306. normalAttrs[k].value = v[2] * cfg.maxLevel
  307. end
  308. --特殊效果
  309. local specEffect = msgRet.specEffect
  310. specEffect[0] = #cfg.effectDesc
  311. for k, desc in ipairs(cfg.effectDesc) do
  312. specEffect[k].desc = desc
  313. specEffect[k].isActivate = 0
  314. end
  315. end
  316. Msg.send(msgRet, human.fd)
  317. end