Grid.lua 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522
  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 then
  251. return
  252. end
  253. net.suipian[0] = 1
  254. net.suipian[1] = net.suipian[1] or {}
  255. net.suipian[1].fullcnt = itemConfig.fullCnt
  256. net.suipian[1].get = itemConfig.get[1] or 0
  257. if itemConfig.subType == ItemDefine.ITEM_SUBTYPE_SUIPIAN or itemConfig.subType == ItemDefine.ITEM_SUBTYPE_SUIPIAN_SKIN then
  258. net.suipian[1].camp = itemConfig.cond[1] or 0
  259. net.suipian[1].star = itemConfig.cond[2] or 0
  260. local heroID = itemConfig.get[3]
  261. local heroConfig = HeroExcel.hero[heroID]
  262. net.suipian[1].grade = heroConfig and heroConfig.grade or 0
  263. if itemConfig.get[1] == SuipianLogic.SUMMON_TYPE_TARGET then
  264. local dropType = itemConfig.get[2]
  265. if dropType == SuipianLogic.SUMMON_SUBTYPE_HERO then
  266. local heroID = itemConfig.get[3]
  267. local heroConfig = HeroExcel.hero[heroID]
  268. if heroConfig then
  269. net.suipian[1].camp = heroConfig.camp
  270. net.suipian[1].star = heroConfig.star
  271. net.icon = heroConfig.head
  272. end
  273. end
  274. end
  275. elseif itemConfig.subType == ItemDefine.ITEM_SUBTYPE_SUIPIAN_TALISMAM then
  276. net.suipian[1].camp = 0
  277. net.suipian[1].star = 0
  278. net.suipian[1].grade = itemConfig.rare or 0
  279. end
  280. end
  281. --------------------------------------------- 可操作 -------------------------------------------------------
  282. -- 可操作行为
  283. function getOpflagAtBag(id)
  284. local itemConfig = ItemDefine.getConfig(id)
  285. if not itemConfig then return flag end
  286. if itemConfig then
  287. itemConfig.id = id
  288. end
  289. local flag = 0
  290. -- 使用道具
  291. if canUse(itemConfig) then
  292. flag = Util.setBit(flag, ItemDefine.ITEM_OP_USE)
  293. end
  294. -- 使用箱子
  295. if canUseBox(itemConfig) then
  296. flag = Util.setBit(flag, ItemDefine.ITEM_OP_USE_BOX)
  297. end
  298. -- 批量使用
  299. if canUseBatch(itemConfig) then
  300. flag = Util.setBit(flag, ItemDefine.ITEM_OP_USE_BATCH)
  301. end
  302. -- 详情
  303. if canDetail(itemConfig) then
  304. flag = Util.setBit(flag, ItemDefine.ITEM_OP_DETAIL)
  305. end
  306. -- 是否可出售
  307. if canSell(itemConfig) then
  308. flag = Util.setBit(flag, ItemDefine.ITEM_OP_SELL)
  309. end
  310. -- 是否用来源
  311. if canSource(itemConfig) then
  312. flag = Util.setBit(flag, ItemDefine.ITEM_OP_SOURCE)
  313. end
  314. -- 是否可以合成
  315. if canHeCheng(itemConfig) then
  316. flag = Util.setBit(flag, ItemDefine.ITEM_OP_HECHENG)
  317. end
  318. -- 能否穿戴
  319. if canEquip(itemConfig) then
  320. flag = Util.setBit(flag, ItemDefine.ITEM_OP_EQUIP)
  321. end
  322. -- 能否重铸
  323. if canCZhu(itemConfig) then
  324. flag = Util.setBit(flag, ItemDefine.ITEM_OP_CZHU)
  325. end
  326. -- 能否分解
  327. if canFJie(itemConfig) then
  328. flag = Util.setBit(flag, ItemDefine.ITEM_OP_FJIE)
  329. end
  330. return flag
  331. end
  332. function getOpflag(itemConfig)
  333. local flag = 0
  334. if not itemConfig then return flag end
  335. -- 预览
  336. if canYulan(itemConfig) then
  337. flag = Util.setBit(flag, ItemDefine.ITEM_OP_YULAN)
  338. end
  339. -- 是否用来源
  340. if canSource(itemConfig) then
  341. flag = Util.setBit(flag, ItemDefine.ITEM_OP_SOURCE)
  342. end
  343. return flag
  344. end
  345. -- 可否使用
  346. function canUse(itemConfig)
  347. if not itemConfig then return end
  348. if not itemConfig.panelID then return end
  349. return itemConfig.panelID > 0
  350. end
  351. -- 可否使用
  352. function canUseBox(itemConfig)
  353. if not itemConfig then return end
  354. if not itemConfig.cmd then return end
  355. local cmdstr = itemConfig.cmd[1]
  356. if not cmdstr then return end
  357. if cmdstr == "box" then
  358. return true
  359. end
  360. end
  361. -- 是否可出售
  362. function canSell(itemConfig)
  363. if not itemConfig then return end
  364. if not itemConfig.price then return end
  365. return #itemConfig.price > 0
  366. end
  367. -- 是否可出售
  368. function canSource(itemConfig)
  369. if not itemConfig then return end
  370. if not itemConfig.getway then return end
  371. return #itemConfig.getway > 0
  372. end
  373. -- 可否批量使用
  374. function canUseBatch(itemConfig)
  375. if not itemConfig then return end
  376. if not itemConfig.cmd then return end
  377. local cmdstr = itemConfig.cmd[1]
  378. if not cmdstr then return end
  379. if cmdstr == "box" or "UseSkinItem" == cmdstr then
  380. return
  381. end
  382. return true
  383. end
  384. -- 可否预览
  385. function canYulan(itemConfig)
  386. if not itemConfig then return end
  387. local cmdStr = itemConfig.cmd and itemConfig.cmd[1]
  388. if cmdStr and cmdStr == "box" then
  389. return true
  390. end
  391. --[[local getWay = itemConfig.get and itemConfig.get[1]
  392. if getWay == SuipianLogic.SUMMON_TYPE_DROP or
  393. getWay == SuipianLogic.SUMMON_TYPE_HERO_SP or
  394. getWay == SuipianLogic.SUMMON_TYPE_SHENQI_SP then
  395. local suipianType = itemConfig.get[2]
  396. if suipianType == SuipianLogic.SUMMON_SUBTYPE_HERO or
  397. suipianType == SuipianLogic.SUMMON_SUBTYPE_EQUIP then
  398. return true
  399. end
  400. end]]
  401. end
  402. -- 可否查看英雄详情
  403. function canDetail(itemConfig)
  404. local getWay = itemConfig.get and itemConfig.get[1]
  405. if getWay == SuipianLogic.SUMMON_TYPE_TARGET then
  406. local suipianType = itemConfig.get[2]
  407. if suipianType == SuipianLogic.SUMMON_SUBTYPE_HERO then
  408. local heroID = itemConfig.get[3]
  409. if HeroExcel.hero[heroID] then
  410. return true
  411. end
  412. end
  413. if suipianType == SuipianLogic.SUMMON_SUBTYPE_SKIN then
  414. local skinID = itemConfig.get[3]
  415. if SkinExcel.skin[skinID] then
  416. return true
  417. end
  418. end
  419. end
  420. end
  421. -- 可否合成
  422. function canHeCheng(itemConfig)
  423. local getWay = itemConfig.get and itemConfig.get[1]
  424. if getWay == SuipianLogic.SUMMON_TYPE_TARGET or getWay == SuipianLogic.SUMMON_TYPE_DROP then
  425. local suipianType = itemConfig.get[2]
  426. if suipianType == SuipianLogic.SUMMON_SUBTYPE_HERO then
  427. return true
  428. end
  429. if suipianType == SuipianLogic.SUMMON_SUBTYPE_SKIN then
  430. return true
  431. end
  432. if suipianType == SuipianLogic.SUMMON_SUBTYPE_TALISAM then
  433. return true
  434. end
  435. end
  436. if ItemDefine.isFuwen(itemConfig.id) then
  437. return true
  438. end
  439. end
  440. -- 可否穿戴
  441. function canEquip(itemConfig)
  442. if ItemDefine.isEquip(itemConfig.id) then
  443. return true
  444. end
  445. if ItemDefine.isFuwen(itemConfig.id) then
  446. return true
  447. end
  448. end
  449. -- 可否重铸
  450. function canCZhu(itemConfig)
  451. if ItemDefine.isFuwen(itemConfig.id) then
  452. return true
  453. end
  454. end
  455. -- 可否重铸
  456. function canFJie(itemConfig)
  457. if ItemDefine.isFuwen(itemConfig.id) then
  458. return true
  459. end
  460. end