Grid.lua 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526
  1. ------------------------------------------------
  2. -- 道具格子
  3. ------------------------------------------------
  4. local HeroExcel = require("excel.hero")
  5. local EquipExcel = require("excel.equip")
  6. local FuwenExcel = require("excel.fuwen")
  7. local SkinExcel = require("excel.skin")
  8. local Util = require("common.Util")
  9. local ItemDefine = require("bag.ItemDefine")
  10. local SuipianLogic = require("bag.SuipianLogic")
  11. local RoleAttr = require("role.RoleAttr")
  12. local EquipLogic = require("equip.EquipLogic")
  13. -- 填充装备,道具信息
  14. function makeItem(net, itemID, itemCnt, shuijingAttrID, itemGrid, itemIndex, opFlag, equipQuality, gemBonus)
  15. local itemConfig = ItemDefine.getConfig(itemID)
  16. net.id = itemConfig and itemID or 0
  17. net.cnt = itemConfig and itemCnt or 0
  18. net.name = itemConfig and itemConfig.name or ""
  19. net.mainType = itemConfig and itemConfig.mainType or 0
  20. net.subType = itemConfig and itemConfig.subType or 0
  21. net.order = itemConfig and itemConfig.order or 0
  22. net.icon = itemConfig and itemConfig.icon or 0
  23. net.desc1 = itemConfig and itemConfig.desc1 or ""
  24. net.desc2 = itemConfig and itemConfig.desc2 or ""
  25. local priceId = itemConfig and itemConfig.price and itemConfig.price[1] or 0
  26. local priceConfig = ItemDefine.getConfig(priceId)
  27. net.priceIcon = priceConfig and priceConfig.icon or 0
  28. net.price = itemConfig and itemConfig.price and itemConfig.price[2] or 0
  29. net.rare = itemConfig and itemConfig.rare or 0
  30. net.score = itemConfig and itemConfig.score or 0
  31. net.getway = net.getway or {}
  32. net.getway[0] = (itemConfig and itemConfig.getway) and #itemConfig.getway or 0
  33. for i=1, net.getway[0] do
  34. net.getway[i] = itemConfig.getway[i]
  35. end
  36. net.panelID = itemConfig and itemConfig.panelID or 0
  37. net.isShow = itemConfig and itemConfig.isShow or 0
  38. net.effects = itemConfig and itemConfig.effects or 0
  39. net.opflag = opFlag or getOpflag(itemConfig) or 0
  40. net.suipian = net.suipian or {}
  41. net.equip = net.equip or {}
  42. net.fuwen= net.fuwen or {}
  43. net.suipian[0] = 0
  44. net.equip[0] = 0
  45. net.fuwen[0] = 0
  46. if not itemConfig then return end
  47. makeItemSuipian(net, itemConfig)
  48. makeItemFuwen(net, itemID, itemConfig, itemGrid, itemIndex)
  49. makeItemEquip(net, itemConfig, itemGrid, itemIndex, shuijingAttrID, equipQuality, gemBonus)
  50. end
  51. function makeFuwenSkill(net, skillID)
  52. local skillConfig = FuwenExcel.skill[skillID]
  53. net.skillID = skillID
  54. net.skillIcon = skillConfig.icon
  55. net.skillName = skillConfig.name
  56. net.skillDesc = skillConfig.desc
  57. net.lv = skillConfig.lv
  58. net.isRare = skillConfig.rare or 0
  59. net.isOnlyBinshu = 0
  60. if skillConfig.isBingshuSkill == 1 and skillConfig.isFuwenSkill == 0 then
  61. net.isOnlyBinshu = 1
  62. end
  63. end
  64. function makeItemFuwen(net, itemID, itemConfig, fuwenGrid, fuwenIndex)
  65. if itemConfig.mainType ~= ItemDefine.MAINTYPE_FUWEN then
  66. return
  67. end
  68. local netTemp = nil
  69. if net.fuwen then
  70. net.fuwen[0] = 1
  71. net.fuwen[1] = net.fuwen[1] or {}
  72. netTemp = net.fuwen[1]
  73. else
  74. netTemp = net
  75. end
  76. netTemp.id = itemID
  77. netTemp.index = fuwenIndex or 0
  78. netTemp.fenjieGet = itemConfig.fenjieJinghua
  79. netTemp.refine = 0
  80. netTemp.attrs = netTemp.attrs or {}
  81. netTemp.attrs[0] = 0
  82. netTemp.skills = netTemp.skills or {}
  83. netTemp.skills[0] = 0
  84. netTemp.zhandouli = 0
  85. if fuwenGrid ~= nil then
  86. netTemp.refine = fuwenGrid.refine or 0
  87. local zhandouli = 0
  88. for zz = 1, #fuwenGrid.attr do
  89. local key = fuwenGrid.attr[zz][1]
  90. local value = fuwenGrid.attr[zz][2]
  91. netTemp.attrs[zz] = netTemp.attrs[zz] or {}
  92. netTemp.attrs[zz].key = key
  93. netTemp.attrs[zz].value = value
  94. zhandouli = zhandouli + RoleAttr.getPointByKey(key) * value
  95. end
  96. netTemp.attrs[0] = #fuwenGrid.attr
  97. if fuwenGrid.skill == nil then
  98. netTemp.skills[0] = 0
  99. else
  100. for zz = 1,#fuwenGrid.skill do
  101. local skillID = fuwenGrid.skill[zz]
  102. netTemp.skills[zz] = netTemp.skills[zz] or {}
  103. makeFuwenSkill(netTemp.skills[zz], skillID)
  104. end
  105. netTemp.skills[0] = #fuwenGrid.skill
  106. end
  107. netTemp.zhandouli = math.floor(zhandouli)
  108. end
  109. end
  110. function makeItemEquip(net, itemConfig, equipGrid, equipIndex, shuijingAttrID, equipQuality, gemBonus)
  111. if itemConfig.mainType ~= ItemDefine.MAINTYPE_EQUIP then
  112. return
  113. end
  114. net.equip[0] = 1
  115. net.equip[1] = net.equip[1] or {}
  116. net.equip[1].index = equipIndex or 0
  117. net.equip[1].level = itemConfig.level
  118. net.equip[1].exp = itemConfig.shenqiExp or 0
  119. net.equip[1].star = itemConfig.star or 0
  120. net.equip[1].uuid = equipGrid and equipGrid.uuid or ""
  121. net.equip[1].putUuid = equipGrid and equipGrid.putUuid or ""
  122. net.equip[1].args = net.equip[1].args or {}
  123. net.equip[1].args[0] = 0
  124. local maxQuality = EquipLogic.getEquipMaxQuality(itemConfig)
  125. net.rare = equipGrid and equipGrid.quality or equipQuality or maxQuality
  126. -- 装备基础属性
  127. if itemConfig.subType == ItemDefine.EQUIP_SUBTYPE_SHUIJIN then
  128. -- 水晶属性
  129. net.equip[1].attr = net.equip[1].attr or {}
  130. net.equip[1].attr[0] = 0
  131. net.equip[1].args[0] = 1
  132. local upcf = EquipExcel.shuijingUpNeed[net.id]
  133. net.equip[1].args[1] = (not upcf or upcf.nextID < 1) and 1 or 0 -- 是否满级
  134. if shuijingAttrID then
  135. local shuijingConfig = EquipExcel.shuijingAttr[shuijingAttrID]
  136. local shuijingAttrTB = shuijingConfig.attr
  137. net.equip[1].attr[0] = #shuijingAttrTB
  138. for i=1, net.equip[1].attr[0] do
  139. net.equip[1].attr[i] = net.equip[1].attr[i] or {}
  140. net.equip[1].attr[i].key = shuijingAttrTB[i][1]
  141. net.equip[1].attr[i].value = shuijingAttrTB[i][2]
  142. end
  143. end
  144. else
  145. local baseRate = EquipLogic.getEquipBaseRate(net.rare)
  146. net.score = math.floor(net.score * baseRate)
  147. -- 基础属性
  148. net.equip[1].baseAttr = {}
  149. net.equip[1].baseAttr[0] = #itemConfig.base
  150. --宝石
  151. net.equip[1].gemBaseAttr[0] = 0
  152. if gemBonus then
  153. net.equip[1].gemBaseAttr[0] = #itemConfig.base
  154. end
  155. for i=1, net.equip[1].baseAttr[0] do
  156. net.equip[1].baseAttr[i] = net.equip[1].baseAttr[i] or {}
  157. net.equip[1].baseAttr[i].key = itemConfig.base[i][1]
  158. net.equip[1].baseAttr[i].value = math.floor(itemConfig.base[i][2] * baseRate)
  159. if gemBonus then
  160. net.equip[1].gemBaseAttr[i].key = itemConfig.base[i][1]
  161. net.equip[1].gemBaseAttr[i].value = math.floor(itemConfig.base[i][2] * baseRate * gemBonus.base)
  162. end
  163. end
  164. -- 随机属性
  165. local attrLen = 0
  166. net.equip[1].tzAttr = net.equip[1].tzAttr or {}
  167. if equipGrid then
  168. EquipLogic.checkAttr(equipGrid)
  169. for key, value in pairs(equipGrid.attr) do
  170. attrLen = attrLen + 1
  171. net.equip[1].tzAttr[attrLen] = net.equip[1].tzAttr[attrLen] or {}
  172. net.equip[1].tzAttr[attrLen].key = key
  173. net.equip[1].tzAttr[attrLen].value = math.floor(value * baseRate)
  174. end
  175. else
  176. local randomAttr = EquipLogic.getEquipTzAttr(itemConfig)
  177. if randomAttr then
  178. for _, attr in pairs(randomAttr) do
  179. attrLen = attrLen + 1
  180. net.equip[1].tzAttr[attrLen] = net.equip[1].tzAttr[attrLen] or {}
  181. net.equip[1].tzAttr[attrLen].key = attr[1]
  182. net.equip[1].tzAttr[attrLen].value = attr[2]
  183. end
  184. end
  185. end
  186. net.equip[1].tzAttr[0] = attrLen
  187. end
  188. if itemConfig.subType == ItemDefine.EQUIP_SUBTYPE_SHENQI then
  189. local shenqiUpNeedConfig = EquipExcel.shenqiUpNeed[net.id]
  190. local nextID = shenqiUpNeedConfig and shenqiUpNeedConfig.nextID
  191. net.equip[1].args = net.equip[1].args or {}
  192. net.equip[1].args[0] = 1
  193. net.equip[1].args[1] = (not nextID or nextID < 1) and 1 or 0
  194. end
  195. -- 装备套装属性
  196. net.equip[1].suit = net.equip[1].suit or {}
  197. net.equip[1].suit[0] = 0
  198. if itemConfig.suitIm then
  199. net.equip[1].suit = net.equip[1].suit or {}
  200. net.equip[1].suit[0] = 1
  201. net.equip[1].suit[1] = net.equip[1].suit[1] or {}
  202. net.equip[1].suit[1].attr = net.equip[1].suit[1].attr or {}
  203. net.equip[1].suit[1].attr[0] = #itemConfig.suitIm
  204. net.equip[1].suit[1].gemAttr[0] = 0
  205. if gemBonus then
  206. net.equip[1].suit[1].gemAttr[0] = #itemConfig.suitIm
  207. end
  208. for i=1,net.equip[1].suit[1].attr[0] do
  209. net.equip[1].suit[1].attr[i] = net.equip[1].suit[1].attr[i] or {}
  210. net.equip[1].suit[1].attr[i].key = itemConfig.suitIm[i][1]
  211. net.equip[1].suit[1].attr[i].value = itemConfig.suitIm[i][2]
  212. --宝石
  213. if gemBonus and gemBonus[i+1] then
  214. net.equip[1].suit[1].gemAttr[i] = net.equip[1].suit[1].gemAttr[i] or {}
  215. net.equip[1].suit[1].gemAttr[i].key = itemConfig.suitIm[i][1]
  216. --这里i+1的原因是,装备套装属性配置suitIm中, idx为1的value是2件套加成, idx为2的是3件套加成,以此类推
  217. net.equip[1].suit[1].gemAttr[i].value = gemBonus[i+1] * 100 --转成百分比发给客户端
  218. end
  219. end
  220. net.equip[1].suit[1].id = itemConfig.suit
  221. net.equip[1].suit[1].name = itemConfig.suitName
  222. net.equip[1].suit[1].num = itemConfig.suitNum
  223. end
  224. -- 装备职业专属属性
  225. net.equip[1].job = itemConfig.job
  226. net.equip[1].jobAttr = net.equip[1].jobAttr or {}
  227. net.equip[1].jobAttr[0] = #itemConfig.jobAttr
  228. for i = 1, net.equip[1].jobAttr[0] do
  229. net.equip[1].jobAttr[i] = net.equip[1].jobAttr[i] or {}
  230. net.equip[1].jobAttr[i].key = itemConfig.jobAttr[i][1]
  231. net.equip[1].jobAttr[i].value = itemConfig.jobAttr[i][2]
  232. end
  233. -- 装备阵营专属属性
  234. net.equip[1].camp = itemConfig.camp
  235. net.equip[1].campAttr = net.equip[1].campAttr or {}
  236. net.equip[1].campAttr[0] = #itemConfig.campAttr
  237. for i = 1, net.equip[1].campAttr[0] do
  238. net.equip[1].campAttr[i] = net.equip[1].campAttr[i] or {}
  239. net.equip[1].campAttr[i].key = itemConfig.campAttr[i][1]
  240. net.equip[1].campAttr[i].value = itemConfig.campAttr[i][2]
  241. end
  242. end
  243. -- 封装碎片信息 Suipian
  244. function makeItemSuipian(net, itemConfig)
  245. if itemConfig.mainType ~= ItemDefine.MAINTYPE_ITEM then
  246. return
  247. end
  248. if itemConfig.subType ~= ItemDefine.ITEM_SUBTYPE_SUIPIAN and
  249. itemConfig.subType ~= ItemDefine.ITEM_SUBTYPE_SUIPIAN_SKIN and
  250. itemConfig.subType ~= ItemDefine.ITEM_SUBTYPE_SUIPIAN_TALISMAM and
  251. itemConfig.subType ~= ItemDefine.ITEM_SUBTYPE_SUIPIAN_RELIC then
  252. return
  253. end
  254. net.suipian[0] = 1
  255. net.suipian[1] = net.suipian[1] or {}
  256. net.suipian[1].fullcnt = itemConfig.fullCnt
  257. net.suipian[1].get = itemConfig.get[1] or 0
  258. if itemConfig.subType == ItemDefine.ITEM_SUBTYPE_SUIPIAN or itemConfig.subType == ItemDefine.ITEM_SUBTYPE_SUIPIAN_SKIN then
  259. net.suipian[1].camp = itemConfig.cond[1] or 0
  260. net.suipian[1].star = itemConfig.cond[2] or 0
  261. local heroID = itemConfig.get[3]
  262. local heroConfig = HeroExcel.hero[heroID]
  263. net.suipian[1].grade = heroConfig and heroConfig.grade or 0
  264. if itemConfig.get[1] == SuipianLogic.SUMMON_TYPE_TARGET then
  265. local dropType = itemConfig.get[2]
  266. if dropType == SuipianLogic.SUMMON_SUBTYPE_HERO then
  267. local heroID = itemConfig.get[3]
  268. local heroConfig = HeroExcel.hero[heroID]
  269. if heroConfig then
  270. net.suipian[1].camp = heroConfig.camp
  271. net.suipian[1].star = heroConfig.star
  272. net.icon = heroConfig.head
  273. end
  274. end
  275. end
  276. elseif itemConfig.subType == ItemDefine.ITEM_SUBTYPE_SUIPIAN_TALISMAM or itemConfig.subType == ItemDefine.ITEM_SUBTYPE_SUIPIAN_RELIC then
  277. net.suipian[1].camp = 0
  278. net.suipian[1].star = 0
  279. net.suipian[1].grade = itemConfig.rare or 0
  280. end
  281. end
  282. --------------------------------------------- 可操作 -------------------------------------------------------
  283. -- 可操作行为
  284. function getOpflagAtBag(id)
  285. local itemConfig = ItemDefine.getConfig(id)
  286. if not itemConfig then return flag end
  287. if itemConfig then
  288. itemConfig.id = id
  289. end
  290. local flag = 0
  291. -- 使用道具
  292. if canUse(itemConfig) then
  293. flag = Util.setBit(flag, ItemDefine.ITEM_OP_USE)
  294. end
  295. -- 使用箱子
  296. if canUseBox(itemConfig) then
  297. flag = Util.setBit(flag, ItemDefine.ITEM_OP_USE_BOX)
  298. end
  299. -- 批量使用
  300. if canUseBatch(itemConfig) then
  301. flag = Util.setBit(flag, ItemDefine.ITEM_OP_USE_BATCH)
  302. end
  303. -- 详情
  304. if canDetail(itemConfig) then
  305. flag = Util.setBit(flag, ItemDefine.ITEM_OP_DETAIL)
  306. end
  307. -- 是否可出售
  308. if canSell(itemConfig) then
  309. flag = Util.setBit(flag, ItemDefine.ITEM_OP_SELL)
  310. end
  311. -- 是否用来源
  312. if canSource(itemConfig) then
  313. flag = Util.setBit(flag, ItemDefine.ITEM_OP_SOURCE)
  314. end
  315. -- 是否可以合成
  316. if canHeCheng(itemConfig) then
  317. flag = Util.setBit(flag, ItemDefine.ITEM_OP_HECHENG)
  318. end
  319. -- 能否穿戴
  320. if canEquip(itemConfig) then
  321. flag = Util.setBit(flag, ItemDefine.ITEM_OP_EQUIP)
  322. end
  323. -- 能否重铸
  324. if canCZhu(itemConfig) then
  325. flag = Util.setBit(flag, ItemDefine.ITEM_OP_CZHU)
  326. end
  327. -- 能否分解
  328. if canFJie(itemConfig) then
  329. flag = Util.setBit(flag, ItemDefine.ITEM_OP_FJIE)
  330. end
  331. return flag
  332. end
  333. function getOpflag(itemConfig)
  334. local flag = 0
  335. if not itemConfig then return flag end
  336. -- 预览
  337. if canYulan(itemConfig) then
  338. flag = Util.setBit(flag, ItemDefine.ITEM_OP_YULAN)
  339. end
  340. -- 是否用来源
  341. if canSource(itemConfig) then
  342. flag = Util.setBit(flag, ItemDefine.ITEM_OP_SOURCE)
  343. end
  344. return flag
  345. end
  346. -- 可否使用
  347. function canUse(itemConfig)
  348. if not itemConfig then return end
  349. if not itemConfig.panelID then return end
  350. return itemConfig.panelID > 0
  351. end
  352. -- 可否使用
  353. function canUseBox(itemConfig)
  354. if not itemConfig then return end
  355. if not itemConfig.cmd then return end
  356. local cmdstr = itemConfig.cmd[1]
  357. if not cmdstr then return end
  358. if cmdstr == "box" then
  359. return true
  360. end
  361. end
  362. -- 是否可出售
  363. function canSell(itemConfig)
  364. if not itemConfig then return end
  365. if not itemConfig.price then return end
  366. return #itemConfig.price > 0
  367. end
  368. -- 是否可出售
  369. function canSource(itemConfig)
  370. if not itemConfig then return end
  371. if not itemConfig.getway then return end
  372. return #itemConfig.getway > 0
  373. end
  374. -- 可否批量使用
  375. function canUseBatch(itemConfig)
  376. if not itemConfig then return end
  377. if not itemConfig.cmd then return end
  378. local cmdstr = itemConfig.cmd[1]
  379. if not cmdstr then return end
  380. if cmdstr == "box" or "UseSkinItem" == cmdstr then
  381. return
  382. end
  383. return true
  384. end
  385. -- 可否预览
  386. function canYulan(itemConfig)
  387. if not itemConfig then return end
  388. local cmdStr = itemConfig.cmd and itemConfig.cmd[1]
  389. if cmdStr and cmdStr == "box" then
  390. return true
  391. end
  392. --[[local getWay = itemConfig.get and itemConfig.get[1]
  393. if getWay == SuipianLogic.SUMMON_TYPE_DROP or
  394. getWay == SuipianLogic.SUMMON_TYPE_HERO_SP or
  395. getWay == SuipianLogic.SUMMON_TYPE_SHENQI_SP then
  396. local suipianType = itemConfig.get[2]
  397. if suipianType == SuipianLogic.SUMMON_SUBTYPE_HERO or
  398. suipianType == SuipianLogic.SUMMON_SUBTYPE_EQUIP then
  399. return true
  400. end
  401. end]]
  402. end
  403. -- 可否查看英雄详情
  404. function canDetail(itemConfig)
  405. local getWay = itemConfig.get and itemConfig.get[1]
  406. if getWay == SuipianLogic.SUMMON_TYPE_TARGET then
  407. local suipianType = itemConfig.get[2]
  408. if suipianType == SuipianLogic.SUMMON_SUBTYPE_HERO then
  409. local heroID = itemConfig.get[3]
  410. if HeroExcel.hero[heroID] then
  411. return true
  412. end
  413. end
  414. if suipianType == SuipianLogic.SUMMON_SUBTYPE_SKIN then
  415. local skinID = itemConfig.get[3]
  416. if SkinExcel.skin[skinID] then
  417. return true
  418. end
  419. end
  420. end
  421. end
  422. -- 可否合成
  423. function canHeCheng(itemConfig)
  424. local getWay = itemConfig.get and itemConfig.get[1]
  425. if getWay == SuipianLogic.SUMMON_TYPE_TARGET or getWay == SuipianLogic.SUMMON_TYPE_DROP then
  426. local suipianType = itemConfig.get[2]
  427. if suipianType == SuipianLogic.SUMMON_SUBTYPE_HERO then
  428. return true
  429. end
  430. if suipianType == SuipianLogic.SUMMON_SUBTYPE_SKIN then
  431. return true
  432. end
  433. if suipianType == SuipianLogic.SUMMON_SUBTYPE_TALISAM then
  434. return true
  435. end
  436. if suipianType == SuipianLogic.SUMMON_SUBTYPE_RELIC then
  437. return true
  438. end
  439. end
  440. if ItemDefine.isFuwen(itemConfig.id) then
  441. return true
  442. end
  443. end
  444. -- 可否穿戴
  445. function canEquip(itemConfig)
  446. if ItemDefine.isEquip(itemConfig.id) then
  447. return true
  448. end
  449. if ItemDefine.isFuwen(itemConfig.id) then
  450. return true
  451. end
  452. end
  453. -- 可否重铸
  454. function canCZhu(itemConfig)
  455. if ItemDefine.isFuwen(itemConfig.id) then
  456. return true
  457. end
  458. end
  459. -- 可否重铸
  460. function canFJie(itemConfig)
  461. if ItemDefine.isFuwen(itemConfig.id) then
  462. return true
  463. end
  464. end