EquipLogic.lua 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368
  1. local Msg = require("core.Msg")
  2. local Util = require("common.Util")
  3. local Grid = require("bag.Grid")
  4. local ItemDefine = require("bag.ItemDefine")
  5. local TuJianExcel = require("excel.equip").tujian
  6. local EquipExcel = require("excel.equip").equip
  7. local ItemExcel = require("excel.item").item
  8. local EquipLogicGrid = require("equip.EquipLogicGrid")
  9. local Log = require("common.Log")
  10. local LogDefine = require("common.LogDefine")
  11. local Lang = require("common.Lang")
  12. local Broadcast = require("broadcast.Broadcast")
  13. local MailManager = require("mail.MailManager")
  14. local MailExcel = require("excel.mail")
  15. local HeroLogic = require("hero.HeroLogic")
  16. local TriggerDefine = require("trigger.TriggerDefine")
  17. local TriggerLogic = require("trigger.TriggerLogic")
  18. EQUIP_BAG_MAX_CNT = 500
  19. EQUIP_BAG_OP_ADD = 1 -- 增
  20. EQUIP_BAG_OP_DEL = 2 -- 删
  21. EQUIP_BAG_OP_CHANGE = 3 -- 改
  22. EQUIP_QUALITY_MAX = 5
  23. EQUIP_QUALITY = { 5000, 3000, 1500, 500 }
  24. EQUIP_QUALITY_WEIGHT = 10000
  25. EQUIP_QUALITY_BASE_RATE = { 7000, 8000, 9000, 10000, 12000 }
  26. -- 随机属性
  27. local attrCheck = {}
  28. function checkAttr(equipGrid)
  29. local quality = equipGrid.quality
  30. local len = 0
  31. for key, value in pairs(equipGrid.attr) do
  32. len = len + 1
  33. attrCheck[len] = {key, value}
  34. end
  35. -- 砍掉后面的
  36. if quality < len then
  37. equipGrid.attr = {}
  38. for z = 1, quality do
  39. equipGrid.attr[attrCheck[z][1]] = attrCheck[z][2]
  40. end
  41. end
  42. end
  43. -- 随机属性
  44. function randomAttr(itemID, isRandom, otherData)
  45. local equipConfig = EquipExcel[itemID]
  46. if not equipConfig then return end
  47. -- 固定属性
  48. local quality = 1
  49. local attr = { }
  50. if equipConfig.random == 1 and not isRandom then
  51. quality = #equipConfig.randomAttr
  52. if quality > EQUIP_QUALITY_MAX then
  53. quality = EQUIP_QUALITY_MAX
  54. end
  55. for i = 1, quality do
  56. local key = equipConfig.randomAttr[i][1]
  57. local value = equipConfig.randomAttr[i][2]
  58. attr[key] = attr[key] or 0
  59. attr[key] = attr[key] + value
  60. end
  61. return attr, quality
  62. end
  63. if not otherData then
  64. -- 随机品质
  65. local random = math.random(1, EQUIP_QUALITY_WEIGHT)
  66. for i = 1, #EQUIP_QUALITY do
  67. local weight = EQUIP_QUALITY[i]
  68. if random <= weight then
  69. quality = i > #equipConfig.randomAttr and #equipConfig.randomAttr or i
  70. break
  71. else
  72. random = random - weight
  73. end
  74. end
  75. else
  76. if type(otherData) == "number" then
  77. otherData = otherData < 0 and 1 or otherData
  78. quality = otherData > #equipConfig.randomAttr and #equipConfig.randomAttr or otherData
  79. end
  80. end
  81. if quality > EQUIP_QUALITY_MAX then
  82. quality = EQUIP_QUALITY_MAX
  83. end
  84. -- 计算总权重
  85. local totalWeight = 0
  86. for k, v in pairs(equipConfig.randomAttr) do
  87. totalWeight = totalWeight + v[3]
  88. end
  89. -- 随机条目属性
  90. local MathRandom = math.random
  91. local randomAttr = Util.copyTable(equipConfig.randomAttr)
  92. for z = 1, quality do
  93. local randmWeight = MathRandom(1, totalWeight)
  94. for k, v in pairs(randomAttr) do
  95. local key = v[1]
  96. local value = v[2]
  97. local weight = v[3]
  98. if randmWeight <= weight then
  99. attr[key] = attr[key] or 0
  100. attr[key] = attr[key] + value
  101. randomAttr[k] = nil
  102. -- 排除这个权重
  103. totalWeight = totalWeight - weight
  104. break
  105. else
  106. randmWeight = randmWeight - weight
  107. end
  108. end
  109. end
  110. return attr, quality
  111. end
  112. -- 检查背包空间
  113. function checkEmptyCnt(human, itemCnt)
  114. if itemCnt > getEmptyCnt(human) then
  115. Broadcast.sendErr(human, Lang.COMMON_BAG_FULL)
  116. return
  117. end
  118. return true
  119. end
  120. -- 获取装备对基础属性的影响
  121. function getEquipBaseRate(quality)
  122. local baseRate = EQUIP_QUALITY_BASE_RATE[quality]
  123. if not baseRate then return 1 end
  124. return baseRate / 10000
  125. end
  126. -- 获取装备品质
  127. function getEquipMaxQuality(equipConfig)
  128. if not equipConfig.randomAttr then return 0 end
  129. local maxQuality = 0
  130. if equipConfig.random == 1 then
  131. maxQuality = #equipConfig.randomAttr
  132. end
  133. return maxQuality
  134. end
  135. -- 获取装备附加属性
  136. function getEquipTzAttr(equipConfig)
  137. if not equipConfig.randomAttr then return end
  138. if equipConfig.random == 1 then
  139. return equipConfig.randomAttr
  140. end
  141. return nil
  142. end
  143. -- 返回装备背包空余格子数
  144. function getEmptyCnt(human)
  145. local emptyCnt = 0
  146. for i = 1, EQUIP_BAG_MAX_CNT do
  147. if human.db.equipBag[i] == nil then
  148. emptyCnt = emptyCnt + 1
  149. end
  150. end
  151. return emptyCnt
  152. end
  153. -- 获得装备背包第一个空格子下标
  154. function getEmptyIndex(human)
  155. for index = 1, EQUIP_BAG_MAX_CNT do
  156. local grid = human.db.equipBag[index]
  157. if grid == nil then
  158. return index
  159. end
  160. end
  161. end
  162. -- 返回装备根据uuid
  163. function getEquipByUuid(human, uuid)
  164. local emptyCnt = 0
  165. for i = 1, EQUIP_BAG_MAX_CNT do
  166. local equipGrid = human.db.equipBag[i]
  167. if equipGrid and equipGrid.uuid == uuid then
  168. return equipGrid
  169. end
  170. end
  171. end
  172. -- 返回装备根据pos
  173. function getEquipByPos(human, star, pos)
  174. local emptyCnt = 0
  175. for i = 1, EQUIP_BAG_MAX_CNT do
  176. local equipGrid = human.db.equipBag[i]
  177. if equipGrid then
  178. local conf = EquipExcel[equipGrid.id]
  179. if conf and conf.subType == pos and star >= conf.star then
  180. return equipGrid
  181. end
  182. end
  183. end
  184. end
  185. -- 修复老数据
  186. function modifyEquip(human, equipGrid)
  187. if equipGrid.putUuid == nil then return end
  188. local heroGrid = HeroLogic.getHeroGridByUuid(human, equipGrid.putUuid)
  189. if heroGrid == nil then
  190. equipGrid.putUuid = nil
  191. end
  192. end
  193. -- 推送装备背包信息
  194. function sendEquipBagList(human)
  195. local msgRet = Msg.gc.GC_EQUIP_BAG_LIST
  196. local len = 0
  197. for index = 1, EQUIP_BAG_MAX_CNT do
  198. local equipGrid = human.db.equipBag[index]
  199. if equipGrid then
  200. len = len + 1
  201. Grid.makeItem(msgRet.list[len], equipGrid.id, 1, nil, equipGrid, index, Grid.getOpflagAtBag(equipGrid.id))
  202. if len >= 30 then
  203. msgRet.list[0] = len
  204. len = 0
  205. Msg.send(msgRet, human.fd)
  206. end
  207. end
  208. end
  209. if len > 0 then
  210. msgRet.list[0] = len
  211. Msg.send(msgRet, human.fd)
  212. end
  213. end
  214. -- 制造一个获得列表
  215. function makeEquipItem(human, nets, len)
  216. if not human.getEquip then return len end
  217. for i = 1, #human.getEquip do
  218. len = len + 1
  219. if not nets[len] then
  220. len = len - 1
  221. break
  222. end
  223. local equipGrid = human.getEquip[i]
  224. Grid.makeItem(nets[len], equipGrid.id, 1, nil, equipGrid)
  225. end
  226. human.getEquip = nil
  227. return len
  228. end
  229. -- 制造一个装备获得
  230. function makeEquipItemOne(human, net)
  231. if not human.getEquip then return end
  232. local equipGrid = human.getEquip[1]
  233. Grid.makeItem(net, equipGrid.id, 1, nil, equipGrid)
  234. human.getEquip = nil
  235. end
  236. -- 制造一个装备
  237. function makeEquip(itemID, otherData)
  238. local equipGrid = EquipLogicGrid.createGrid(itemID)
  239. if not equipGrid then return end
  240. -- 随机属性
  241. local attr, quality = randomAttr(itemID, nil, otherData)
  242. equipGrid.attr = attr
  243. equipGrid.quality = quality
  244. checkAttr(equipGrid)
  245. return equipGrid
  246. end
  247. -- 添加装备
  248. function addEquip(human, itemID, itemCnt, logType, otherData)
  249. if not EquipExcel[itemID] then return end
  250. for i = 1, itemCnt do
  251. local equipGrid = makeEquip(itemID, otherData)
  252. if equipGrid then
  253. addByEquipGrid(human, equipGrid, logType)
  254. TriggerLogic.PublishEvent(TriggerDefine.EQUIP_GETQUALITY, human.db._id, equipGrid.quality, 1)
  255. end
  256. end
  257. end
  258. -- 通过gird添加装备
  259. function addByEquipGrid(human, equipGrid, logType, noSend)
  260. local index = getEmptyIndex(human)
  261. if not index then
  262. --邮件处理
  263. local items = {}
  264. items[1] = { equipGrid.id, equipGrid }
  265. local title = MailExcel.mail[1000].title
  266. local content = MailExcel.mail[1000].content
  267. local senderName = MailExcel.mail[1000].senderName
  268. MailManager.add(MailManager.SYSTEM, human.db._id, title, content, items, senderName)
  269. return
  270. end
  271. human.db.equipBag[index] = equipGrid
  272. sendEquipChange(human, index, equipGrid, EQUIP_BAG_OP_ADD)
  273. Log.write(Log.LOGID_OSS_EQUIP, human.db._id, human.db.account,
  274. human.db.name, human.db.lv, LogDefine.DEFINE[logType] + LogDefine.TYPE["equip"], equipGrid.id, 1, equipGrid.uuid)
  275. if not noSend then
  276. human.getEquip = human.getEquip or {}
  277. human.getEquip[#human.getEquip + 1] = equipGrid
  278. end
  279. return index
  280. end
  281. -- 从背包删除装备
  282. function delEquip(human, index, logType, sendNotify)
  283. local equipGrid = human.db.equipBag[index]
  284. if not equipGrid then return end
  285. Log.write(Log.LOGID_OSS_EQUIP, human.db._id, human.db.account,
  286. human.db.name, human.db.lv, LogDefine.DEFINE[logType] + LogDefine.TYPE["equip"], equipGrid.id, -1, equipGrid.uuid)
  287. human.db.equipBag[index] = nil
  288. if not sendNotify then
  289. sendEquipChange(human, index, nil, EQUIP_BAG_OP_DEL)
  290. end
  291. end
  292. -- 发送装备改变
  293. function sendEquipChange(human, bagIndex, equipGrid, op)
  294. local msgRet = Msg.gc.GC_EQUIP_BAG_CHANGE
  295. if op == EQUIP_BAG_OP_ADD or op == EQUIP_BAG_OP_CHANGE then
  296. msgRet.itemID = equipGrid.id
  297. msgRet.itemIndex = bagIndex
  298. msgRet.itemData[0] = 1
  299. Grid.makeItem(msgRet.itemData[1], equipGrid.id, 1, nil, equipGrid, bagIndex, Grid.getOpflagAtBag(equipGrid.id))
  300. elseif op == EQUIP_BAG_OP_DEL then
  301. msgRet.itemID = 0
  302. msgRet.itemIndex = bagIndex
  303. msgRet.itemData[0] = 0
  304. else
  305. assert(nil)
  306. end
  307. Msg.send(msgRet, human.fd)
  308. end
  309. function getNewAttrByItemID(itemID, attr)
  310. local config = EquipExcel[itemID]
  311. if not config then return end
  312. for _, v in ipairs(config.randomAttr) do
  313. if attr[v[1]] then
  314. attr[v[1]] = v[2]
  315. end
  316. end
  317. end