FuwenLogic.lua 48 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477
  1. local Msg = require("core.Msg")
  2. local Grid = require("bag.Grid")
  3. local FuwenDefine = require("fuwen.FuwenDefine")
  4. local FuwenGrid = require("fuwen.FuwenGrid")
  5. local HeroLogic = require("hero.HeroLogic")
  6. local FuwenExcel = require("excel.fuwen")
  7. local ItemDefine = require("bag.ItemDefine")
  8. local BagLogic = require("bag.BagLogic")
  9. local ObjHuman = require("core.ObjHuman")
  10. local RoleAttr = require("role.RoleAttr")
  11. local Util = require("common.Util")
  12. local LogDefine = require("common.LogDefine")
  13. local Log = require("common.Log")
  14. local Broadcast = require("broadcast.Broadcast")
  15. local Lang = require("common.Lang")
  16. local HeroEquip = require("hero.HeroEquip")
  17. local HeroExcel = require("excel.hero").hero
  18. local RoleDBLogic = require("role.RoleDBLogic")
  19. local BingshuLogic = require("fuwen.BingshuLogic")
  20. local LiLianLogic = require("dailyTask.LiLianLogic")
  21. local ChengjiuLogic = require("chengjiu.ChengjiuLogic")
  22. local ChengjiuDefine = require("chengjiu.ChengjiuDefine")
  23. local MailManager = require("mail.MailManager")
  24. local MailExcel = require("excel.mail")
  25. local HeroGrowUp = require("absAct.HeroGrowUp")
  26. local YunYingLogic = require("yunying.YunYingLogic")
  27. local TriggerDefine = require("trigger.TriggerDefine")
  28. local TriggerLogic = require("trigger.TriggerLogic")
  29. local Abs365CardLogic = require("absAct.Abs365CardLogic")
  30. -- 符文锁定属性,技能后的刷新时额外消耗的道具Id
  31. local LOCK_COST_ITEN_ID = 136
  32. -- 支持锁定属性,技能的符文的最低品质
  33. local LOCK_FUWEN_COLOR_BASE = 5
  34. -- 符文属性 + 技能的最大锁定数量
  35. local LOCK_FUWEN_MAX_NUM = 4
  36. -- 计算符文属性, 技能锁定后消耗的道具数量
  37. local function calcLockCost(fuwenGrid)
  38. local num = 0
  39. -- 属性
  40. for _, attrInfo in pairs(fuwenGrid.attr or {}) do
  41. if attrInfo[3] and attrInfo[3] == 1 then
  42. num = num + 2
  43. end
  44. end
  45. -- 技能
  46. local skillLockList = fuwenGrid.skillLockList
  47. if skillLockList then
  48. for _, _ in pairs(skillLockList) do
  49. num = num + 6
  50. end
  51. end
  52. return num
  53. end
  54. -- 获取符文的锁定信息
  55. local function getFuwenLockInfo(fuwenGrid)
  56. local lockNum = 0
  57. -- local attrLockPosTb, skillLockPosTb = {}, {}
  58. for pos, attrInfo in pairs(fuwenGrid.attr) do
  59. if attrInfo[3] and attrInfo[3] == 1 then
  60. lockNum = lockNum + 1
  61. -- attrLockPosTb[pos] = 1
  62. end
  63. end
  64. for skillId, pos in pairs(fuwenGrid.skillLockList or {}) do
  65. lockNum = lockNum + 1
  66. -- skillLockPosTb[pos] = skillId
  67. end
  68. -- return lockNum, attrLockPosTb, skillLockPosTb
  69. return lockNum
  70. end
  71. --发送所有符文列表 onLogin
  72. function sendFuwenRefineList(human)
  73. local msgRet = Msg.gc.GC_FUWEN_ALL_LIST
  74. -- 发送 背包符文列表
  75. local fuwenMsgCnt = 0
  76. msgRet.isEnd = 0
  77. for index,fuwenGrid in pairs(human.db.fuwenBag) do
  78. if fuwenGrid and FuwenExcel.fuwen[fuwenGrid.id].refine == 1 then
  79. fuwenMsgCnt = fuwenMsgCnt + 1
  80. Grid.makeItem(msgRet.list[fuwenMsgCnt].fuwen, fuwenGrid.id, 1, nil, fuwenGrid, index,Grid.getOpflagAtBag(fuwenGrid.id))
  81. msgRet.list[fuwenMsgCnt].pos = 0
  82. msgRet.list[fuwenMsgCnt].heroID = 0
  83. msgRet.list[fuwenMsgCnt].heroIndex = 0
  84. -- 分包发送
  85. if fuwenMsgCnt >= FuwenDefine.PAGE_LIST_COUNT then
  86. msgRet.list[0] = fuwenMsgCnt
  87. fuwenMsgCnt = 0
  88. Msg.send(msgRet, human.fd)
  89. end
  90. end
  91. end
  92. -- 英雄符文列表
  93. for index,heroGrid in pairs(human.db.heroBag) do
  94. if index ~= 0 and heroGrid.fuwen then
  95. for j = 1,2 do
  96. if heroGrid.fuwen[j]
  97. and heroGrid.fuwen[j].id
  98. and FuwenExcel.fuwen[heroGrid.fuwen[j].id].refine == 1 then
  99. local fuwenGrid = heroGrid.fuwen[j]
  100. fuwenMsgCnt = fuwenMsgCnt + 1
  101. Grid.makeItem(msgRet.list[fuwenMsgCnt].fuwen, fuwenGrid.id, 1, nil, fuwenGrid, index,Grid.getOpflagAtBag(fuwenGrid.id))
  102. msgRet.list[fuwenMsgCnt].pos = j
  103. msgRet.list[fuwenMsgCnt].heroID = heroGrid.id
  104. msgRet.list[fuwenMsgCnt].heroIndex = index
  105. -- 分包发送
  106. if fuwenMsgCnt >= FuwenDefine.PAGE_LIST_COUNT then
  107. msgRet.list[0] = fuwenMsgCnt
  108. fuwenMsgCnt = 0
  109. Msg.send(msgRet, human.fd)
  110. end
  111. end
  112. end
  113. end
  114. end
  115. msgRet.list[0] = fuwenMsgCnt
  116. msgRet.isEnd = 1
  117. Msg.send(msgRet, human.fd)
  118. end
  119. -- 发送符文背包列表
  120. function sendFuwenBagList(human)
  121. local msgRet = Msg.gc.GC_FUWEN_BAG_LIST
  122. local fuwenMsgCnt = 0
  123. for index,fuwenGrid in pairs(human.db.fuwenBag) do
  124. if fuwenGrid then
  125. fuwenMsgCnt = fuwenMsgCnt + 1
  126. Grid.makeItem(msgRet.list[fuwenMsgCnt], fuwenGrid.id, 1, nil, fuwenGrid, index, Grid.getOpflagAtBag(fuwenGrid.id))
  127. if fuwenMsgCnt >= FuwenDefine.PAGE_LIST_COUNT then
  128. msgRet.list[0] = fuwenMsgCnt
  129. fuwenMsgCnt = 0
  130. Msg.send(msgRet, human.fd)
  131. end
  132. end
  133. end
  134. if fuwenMsgCnt > 0 then
  135. msgRet.list[0] = fuwenMsgCnt
  136. Msg.send(msgRet, human.fd)
  137. end
  138. end
  139. -- 发送符文改变
  140. function sendFuwenItemChange(human, bagIndex, fuwenGrid, op)
  141. local msgRet = Msg.gc.GC_FUWEN_BAG_CHANGE
  142. if op == FuwenDefine.FUWEN_BAG_OP_ADD or op == FuwenDefine.FUWEN_BAG_OP_CHANGE then
  143. msgRet.itemID = fuwenGrid.id
  144. msgRet.itemIndex = bagIndex
  145. Grid.makeItem(msgRet.itemData[1], fuwenGrid.id, 1, nil, fuwenGrid, bagIndex, Grid.getOpflagAtBag(fuwenGrid.id))
  146. msgRet.itemData[0] = 1
  147. elseif op == FuwenDefine.FUWEN_BAG_OP_DEL then
  148. msgRet.itemID = 0
  149. msgRet.itemIndex = bagIndex
  150. msgRet.itemData[0] = 0
  151. else
  152. assert(nil)
  153. end
  154. Msg.send(msgRet, human.fd)
  155. end
  156. -- 添加新符文
  157. function add(human, itemID, itemCnt, logType)
  158. local index = nil
  159. if itemID == nil then
  160. return Broadcast.sendErr(human,Lang.FUWEN_ITEMID_ERR)
  161. end
  162. if itemCnt < 1 then
  163. return Broadcast.sendErr(human,Lang.FUWEN_ITEM_CNT_ERR)
  164. end
  165. for i = 1, itemCnt do
  166. local gridTemp = FuwenGrid.create(itemID)
  167. index = FuwenGrid.getEmptyIndex(human)
  168. if index ~= nil then
  169. human.db.fuwenBag[index] = gridTemp
  170. sendFuwenItemChange(human, index, gridTemp, FuwenDefine.FUWEN_BAG_OP_ADD)
  171. --Log.write(Log.LOGID_OSS_FUWEN, human.db._id, human.db.account, human.db.name, human.db.lv, LogDefine.DEFINE[logType] + LogDefine.TYPE["fuwen"] , itemID, 1)
  172. Log.write(Log.LOGID_OSS_FUWEN, human.db._id, human.db.newUniqueTag, human.db.name, human.db.lv, LogDefine.DEFINE[logType] + LogDefine.TYPE["fuwen"] , itemID, 1)
  173. else
  174. -- 没有空格子了
  175. break
  176. end
  177. LiLianLogic.onCallback(human,LiLianLogic.LILIAN_OUTID28,itemCnt,itemID)
  178. end
  179. return index
  180. end
  181. -- 通过gird添加符文
  182. function addByGrid(human, fuwenGrid, logType)
  183. if fuwenGrid == nil or fuwenGrid.id == nil then
  184. return Broadcast.sendErr(human,Lang.FUWEN_GRID_ERR)
  185. end
  186. local index = FuwenGrid.getEmptyIndex(human)
  187. if not index then
  188. local items = {}
  189. items[1] = { fuwenGrid.id, fuwenGrid }
  190. local title = MailExcel.mail[1000].title
  191. local content = MailExcel.mail[1000].content
  192. local senderName = MailExcel.mail[1000].senderName
  193. MailManager.add(MailManager.SYSTEM, human.db._id, title, content, items, senderName)
  194. return
  195. end
  196. human.db.fuwenBag[index] = fuwenGrid
  197. sendFuwenItemChange(human, index, fuwenGrid, FuwenDefine.FUWEN_BAG_OP_ADD)
  198. --Log.write(Log.LOGID_OSS_FUWEN, human.db._id, human.db.account, human.db.name, human.db.lv, LogDefine.DEFINE[logType] + LogDefine.TYPE["fuwen"] , fuwenGrid.id, 1)
  199. Log.write(Log.LOGID_OSS_FUWEN, human.db._id, human.db.newUniqueTag, human.db.name, human.db.lv, LogDefine.DEFINE[logType] + LogDefine.TYPE["fuwen"] , fuwenGrid.id, 1)
  200. return index
  201. end
  202. -- 从背包删除符文
  203. function del(human, index, logType)
  204. local fuwenGrid = human.db.fuwenBag[index]
  205. if fuwenGrid == nil then
  206. return Broadcast.sendErr(human,Lang.FUWEN_GRID_ERR)
  207. end
  208. human.db.fuwenBag[index] = nil
  209. --Log.write(Log.LOGID_OSS_FUWEN, human.db._id, human.db.account, human.db.name, human.db.lv, LogDefine.DEFINE[logType] + LogDefine.TYPE["fuwen"] , fuwenGrid.id, -1)
  210. Log.write(Log.LOGID_OSS_FUWEN, human.db._id, human.db.newUniqueTag, human.db.name, human.db.lv, LogDefine.DEFINE[logType] + LogDefine.TYPE["fuwen"] , fuwenGrid.id, -1)
  211. sendFuwenItemChange(human, index, nil, FuwenDefine.FUWEN_BAG_OP_DEL)
  212. end
  213. -- 穿上符文
  214. function putOn(human, heroID, heroIndex, fuwenIndex,pos,noCalc)
  215. local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
  216. if heroGrid == nil then
  217. return Broadcast.sendErr(human,Lang.FUWEN_HERO_GRID_ERR)
  218. end
  219. local fuwenGrid = human.db.fuwenBag[fuwenIndex]
  220. if fuwenGrid == nil then
  221. return
  222. end
  223. if heroGrid.fuwen == nil or heroGrid.fuwen[pos] == nil then
  224. return
  225. else
  226. if heroGrid.fuwen[pos].id == nil then
  227. -- 新穿装备
  228. del(human, fuwenIndex, "fuwen_puton")
  229. heroGrid.fuwen = heroGrid.fuwen or {}
  230. heroGrid.fuwen[pos] = fuwenGrid
  231. else
  232. -- 替换装备
  233. local oldFuwenGrid = heroGrid.fuwen[pos]
  234. del(human, fuwenIndex, "fuwen_puton")
  235. addByGrid(human, oldFuwenGrid, "fuwen_putoff")
  236. heroGrid.fuwen[pos] = fuwenGrid
  237. end
  238. end
  239. if noCalc ~= true then
  240. -- 计算属性 todo
  241. ObjHuman.doCalcHero(human,heroIndex)
  242. HeroLogic.sendHeroBagDynamic(human, heroID, heroIndex)
  243. HeroEquip.query(human, heroID, heroIndex)
  244. end
  245. -- 通知客户端
  246. local msgRet = Msg.gc.GC_FUWEN_PUTON
  247. msgRet.heroID = heroID
  248. msgRet.heroIndex = heroIndex
  249. msgRet.pos = pos
  250. Grid.makeItem(msgRet.fuwen, fuwenGrid.id, 1, nil, fuwenGrid, -1, Grid.getOpflagAtBag(fuwenGrid.id))
  251. Msg.send(msgRet, human.fd)
  252. end
  253. -- 脱下符文
  254. function putOff(human, heroID, heroIndex, pos, noCalc, noSend)
  255. local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
  256. if heroGrid == nil then
  257. return
  258. end
  259. if heroGrid.fuwen == nil or heroGrid.fuwen[pos] == nil or heroGrid.fuwen[pos].id == nil then
  260. return
  261. end
  262. if not FuwenGrid.checkEmptyCnt(human, 1) then
  263. return
  264. end
  265. local oldFuwenGrid = heroGrid.fuwen[pos]
  266. heroGrid.fuwen[pos] = {}
  267. addByGrid(human, oldFuwenGrid, "fuwen_putoff")
  268. if noCalc ~= true then
  269. -- 计算属性
  270. ObjHuman.doCalcHero(human,heroIndex)
  271. HeroLogic.sendHeroBagDynamic(human, heroID, heroIndex)
  272. HeroEquip.query(human, heroID, heroIndex)
  273. end
  274. if not noSend then
  275. -- 通知客户端
  276. local msgRet = Msg.gc.GC_FUWEN_PUTOFF
  277. msgRet.heroID = heroID
  278. msgRet.heroIndex = heroIndex
  279. msgRet.pos = pos
  280. Msg.send(msgRet, human.fd)
  281. end
  282. end
  283. function putOffQuick(human, heroID, heroIndex, noSys)
  284. putOff(human, heroID, heroIndex, 1, true)
  285. putOff(human, heroID, heroIndex, 2, true)
  286. if not noSys then
  287. ObjHuman.doCalcHero(human,heroIndex)
  288. HeroLogic.sendHeroBagDynamic(human, heroID, heroIndex)
  289. HeroEquip.query(human, heroID, heroIndex)
  290. end
  291. end
  292. -- 符文合成查询
  293. local cacheFuwenGrid = {}
  294. function fuwenHechengQuery(human,fuwenID,fuwenCnt)
  295. local hechengConfig = FuwenExcel.hechengRule[fuwenID]
  296. if hechengConfig == nil then
  297. return Broadcast.sendErr(human,Lang.FUWEN_HECHENG_CONFIG_ERR)
  298. end
  299. local fuwenConfig = FuwenExcel.fuwen[fuwenID]
  300. if fuwenConfig == nil then
  301. return
  302. end
  303. local sub = fuwenCnt - 1
  304. local costJinbi = hechengConfig.hechengCost[sub]
  305. local succRate = hechengConfig.hechengRate[sub]
  306. local newFuwenID = hechengConfig.newFuwenID
  307. local failSmeltVal = hechengConfig.failRonglian
  308. local msgRet = Msg.gc.GC_FUWEN_HECHENG_QUERY
  309. msgRet.costJinbi = costJinbi
  310. msgRet.successRate = succRate
  311. if fuwenCnt < 2 then
  312. msgRet.costJinbi = 0
  313. msgRet.successRate = 0
  314. end
  315. if cacheFuwenGrid[newFuwenID] == nil then
  316. cacheFuwenGrid[newFuwenID] = FuwenGrid.create(newFuwenID)
  317. end
  318. local fuwenGrid = cacheFuwenGrid[newFuwenID]
  319. Grid.makeItem(msgRet.newFuwen, newFuwenID, 1, nil, fuwenGrid, 1)
  320. msgRet.smeltVal = failSmeltVal
  321. msgRet.accountSmeltVal = human.db.smeltVal or 0
  322. msgRet.desc1 = hechengConfig.desc1
  323. msgRet.desc2 = hechengConfig.desc2
  324. local newFuwenConfig = FuwenExcel.fuwen[newFuwenID]
  325. wrapFuwenAttrNet(msgRet,newFuwenConfig)
  326. Msg.send(msgRet,human.fd)
  327. end
  328. -- 合成符文
  329. function fuwenHechengDo(human,fuwenIndexList)
  330. if human.db.lv < 30 then
  331. return Broadcast.sendErr(human,Lang.FUWEN_HECHENG_LIMIT)
  332. end
  333. -- 校验材料个数
  334. local cnt = fuwenIndexList[0]
  335. if cnt < 2 then
  336. return Broadcast.sendErr(human,Lang.FUWEN_HECHENG_CNR_ERR)
  337. end
  338. local newFuwenID = nil
  339. local oldFuwenID = nil
  340. local config = FuwenExcel.hechengRule
  341. local indexTable = {}
  342. for i = 1,cnt do
  343. -- 防止添加同一个符文
  344. local index = fuwenIndexList[i]
  345. if indexTable[index] then
  346. return
  347. end
  348. -- 背包中没有该符文
  349. if human.db.fuwenBag[index] == nil then
  350. return Broadcast.sendErr(human,Lang.FUWEN_HECHENG_FILL_ERR)
  351. end
  352. -- 校验材料是否相同
  353. local fuwenGrid = human.db.fuwenBag[index]
  354. if oldFuwenID == nil then
  355. oldFuwenID = fuwenGrid.id
  356. else
  357. if oldFuwenID ~= fuwenGrid.id then
  358. return Broadcast.sendErr(human,Lang.FUWEN_ID_ERR)
  359. end
  360. end
  361. indexTable[index] = true
  362. end
  363. -- 校验是否有合成配置
  364. local hechengConfig = FuwenExcel.hechengRule[oldFuwenID]
  365. if hechengConfig == nil then
  366. return Broadcast.sendErr(human,Lang.FUWEN_HECHENG_CONFIG_ERR)
  367. end
  368. -- 校验是否达到合成限制等级
  369. if hechengConfig.limit > human.db.lv then
  370. return Broadcast.sendErr(human,Util.format(Lang.ROLE_LV_TOO_LOW, hechengConfig.limit))
  371. end
  372. -- 校验金币数量够不够
  373. local costJinbi = hechengConfig.hechengCost[cnt - 1]
  374. if human.db.jinbi < costJinbi then
  375. return Broadcast.sendErr(human,Lang.COMMON_NO_JINBI)
  376. end
  377. newFuwenID = hechengConfig.newFuwenID
  378. local rate = hechengConfig.hechengRate[cnt - 1]
  379. ObjHuman.updateJinbi(human, -costJinbi, "fuwen_hecheng")
  380. local randomNum = math.random(1,100)
  381. local newFuwenGrid = nil
  382. local fenjieList = {}
  383. if randomNum <= rate then
  384. -- 合成成功
  385. for i = 1,cnt do
  386. local index = fuwenIndexList[i]
  387. del(human, index, "fuwen_hecheng")
  388. end
  389. local msgRet = Msg.gc.GC_FUWEN_HECHENG_SUCCESS
  390. newFuwenGrid = FuwenGrid.create(newFuwenID)
  391. local newIndex = addByGrid(human, newFuwenGrid, "fuwen_hecheng")
  392. Grid.makeItem(msgRet.fuwen, newFuwenGrid.id, 1, nil, newFuwenGrid, newIndex,0)
  393. Msg.send(msgRet,human.fd)
  394. local tConfig = FuwenExcel.fuwen[newFuwenID]
  395. if tConfig then
  396. TriggerLogic.PublishEvent(TriggerDefine.FUWEN_GETQUALITY, human.db._id, tConfig.order, 1)
  397. end
  398. else
  399. -- 合成失败
  400. for i = 1,cnt do
  401. local index = fuwenIndexList[i]
  402. local fenjieConfig = FuwenExcel.fuwen[oldFuwenID]
  403. del(human, index, "fuwen_fenjie")
  404. local jhCnt = math.floor(fenjieConfig.fenjieJinghua/2)
  405. fenjieList[ItemDefine.ITEM_FUWEN_JINGHUA] = fenjieList[ItemDefine.ITEM_FUWEN_JINGHUA] or 0
  406. fenjieList[ItemDefine.ITEM_FUWEN_JINGHUA] = fenjieList[ItemDefine.ITEM_FUWEN_JINGHUA] + jhCnt
  407. end
  408. BagLogic.addItemList(human, fenjieList, "fuwen_fenjie")
  409. local baseCnt = hechengConfig.failRonglian
  410. local failRonglian_cnt = baseCnt + math.floor((cnt-2) * baseCnt/2)
  411. human.db.smeltVal = human.db.smeltVal or 0
  412. human.db.smeltVal = human.db.smeltVal + failRonglian_cnt
  413. local fenjieConfig = FuwenExcel.fuwen[oldFuwenID]
  414. local fenjieJinghua_cnt = math.floor(fenjieConfig.fenjieJinghua/2) * cnt
  415. local msgRet = Msg.gc.GC_FUWEN_HECHENG_FAIL
  416. msgRet.smeltVal = hechengConfig.failRonglian
  417. msgRet.accountSmeltVal = human.db.smeltVal
  418. Grid.makeItem(msgRet.fuwenJinghua, ItemDefine.ITEM_FUWEN_JINGHUA, fenjieJinghua_cnt)
  419. Msg.send(msgRet,human.fd)
  420. end
  421. -- 符文合成回调
  422. ChengjiuLogic.onCallback(human,ChengjiuDefine.CJ_TASK_TYPE_22,1)
  423. HeroGrowUp.onCallback(human, HeroGrowUp.TASKTYPE8, 1)
  424. YunYingLogic.onCallBack(human, "onFuwenHecheng",1)
  425. TriggerLogic.PublishEvent(TriggerDefine.FUWEN_HECHENG, human.db._id, 1)
  426. end
  427. -- 分解符文
  428. function fuwenFenjieDo(human,fuwenID,fuwenIndex,fenjieType)
  429. -- 校验符文是否可分解
  430. local fenjieConfig = FuwenExcel.fuwen[fuwenID]
  431. if fenjieConfig == nil then
  432. return Broadcast.sendErr(human,Lang.FUWEN_FENJIE_CONFIG_ERR)
  433. end
  434. -- 符文为空
  435. local fuwenGrid = human.db.fuwenBag[fuwenIndex]
  436. if fuwenGrid == nil then
  437. return Broadcast.sendErr(human,Lang.FUWEN_GRID_ERR)
  438. end
  439. -- 符文对不上
  440. if fuwenGrid.id ~= fuwenID then
  441. return Broadcast.sendErr(human,Lang.FUWEN_ID_ERR)
  442. end
  443. del(human, fuwenIndex, "fuwen_fenjie")
  444. local fenjieList = {}
  445. if fenjieType == nil then
  446. local msgRet = Msg.gc.GC_FUWEN_FENJIE
  447. Msg.send(msgRet,human.fd)
  448. fenjieList[ItemDefine.ITEM_FUWEN_JINGHUA] = fenjieConfig.fenjieJinghua
  449. else
  450. local cnt = math.floor(fenjieConfig.fenjieJinghua/2)
  451. fenjieList[ItemDefine.ITEM_FUWEN_JINGHUA] = cnt
  452. end
  453. BagLogic.addItemList(human, fenjieList, "fuwen_fenjie")
  454. end
  455. -- 符文兑换
  456. function fuwenExhcange(human)
  457. if human.db.smeltVal == nil or human.db.smeltVal < FuwenDefine.FUWEN_EXCHANGE_CNT then
  458. return Broadcast.sendErr(human,Lang.FUWEN_EXCHANGE_ERR) -- 熔炼值不够
  459. end
  460. human.db.smeltVal = human.db.smeltVal - FuwenDefine.FUWEN_EXCHANGE_CNT
  461. local index = add(human, FuwenDefine.FUWEN_EXCHANGE_ID, 1, "fuwen_exchange")
  462. local fuwenGrid = human.db.fuwenBag[index]
  463. local msgRet = Msg.gc.GC_FUWEN_EXCHANGE
  464. if fuwenGrid ~= nil then
  465. Grid.makeItem(msgRet.fuwen, fuwenGrid.id, 1, nil, fuwenGrid, 1)
  466. Msg.send(msgRet,human.fd)
  467. local nFuWenID = fuwenGrid.id
  468. local tConfig = FuwenExcel.fuwen[nFuWenID]
  469. if tConfig then
  470. TriggerLogic.PublishEvent(TriggerDefine.FUWEN_GETQUALITY, human.db._id, tConfig.order, 1)
  471. end
  472. end
  473. fuwenSmeltValQuery(human)
  474. end
  475. -- 符文刷新查询
  476. function fuwenRefreshQuery(human,fuwenID,fuwenIndex,pos,heroID,heroIndex)
  477. local fuwen = nil
  478. if fuwenIndex == -1 then
  479. -- 英雄身上符文
  480. local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
  481. if heroGrid == nil then
  482. return Broadcast.sendErr(human,Lang.FUWEN_HERO_GRID_ERR)
  483. end
  484. if heroGrid.fuwen == nil or heroGrid.fuwen[pos] == nil then
  485. return Broadcast.sendErr(human,Lang.FUWEN_PUTOFF_ERR)
  486. end
  487. fuwen = heroGrid.fuwen[pos]
  488. else
  489. fuwen = human.db.fuwenBag[fuwenIndex]
  490. end
  491. if fuwen == nil or fuwen.id == nil then
  492. return Broadcast.sendErr(human,Lang.FUWEN_HECHENG_FILL_ERR) -- 材料不存在
  493. end
  494. if fuwen.id ~= fuwenID then
  495. return Broadcast.sendErr(human,Lang.FUWEN_ID_ERR)
  496. end
  497. local refreshConfig = FuwenExcel.fuwen[fuwenID]
  498. if refreshConfig == nil then
  499. return Broadcast.sendErr(human,Lang.FUWEN_REFRESH_CONFIG_ERR) -- 没有相关id分解配置
  500. end
  501. if human.db.fuwenRefreshCnt == nil then
  502. human.db.fuwenRefreshCnt = {}
  503. human.db.fuwenRefreshCnt.sh = 0
  504. human.db.fuwenRefreshCnt.cs = 0
  505. end
  506. local msgRet = Msg.gc.GC_FUWEN_REFRESH_QUERY
  507. -- 本体符文
  508. Grid.makeItemFuwen(msgRet.fuwen,fuwen.id,FuwenExcel.fuwen[fuwen.id],fuwen,fuwenIndex)
  509. -- 临时符文
  510. Grid.makeItemFuwen(msgRet.fuwenTemp,fuwen.id,FuwenExcel.fuwen[fuwen.id],fuwen,fuwenIndex)
  511. if fuwen.attrTemp == nil then
  512. fuwen.attrTemp = {}
  513. end
  514. -- 临时属性备份
  515. local attrLen = #fuwen.attrTemp
  516. for zz = 1,attrLen do
  517. -- msgRet.fuwenTemp.attrs[zz].key = fuwen.attrTemp[zz][1]
  518. -- msgRet.fuwenTemp.attrs[zz].value = fuwen.attrTemp[zz][2]
  519. msgRet.fuwenTemp.attrs[zz].attrArray.key = fuwen.attrTemp[zz][1]
  520. msgRet.fuwenTemp.attrs[zz].attrArray.value = fuwen.attrTemp[zz][2]
  521. msgRet.fuwenTemp.attrs[zz].isLock = fuwen.attrTemp[zz][3] or 0
  522. end
  523. msgRet.fuwenTemp.attrs[0] = attrLen
  524. -- 临时技能备份
  525. if fuwen.skillTemp == nil then
  526. msgRet.fuwenTemp.skills[0] = 0
  527. else
  528. local skillLen = #fuwen.skillTemp
  529. for zz = 1,skillLen do
  530. Grid.makeFuwenSkill(msgRet.fuwenTemp.skills[zz], fuwen.skillTemp[zz], fuwen.skillLockList)
  531. end
  532. msgRet.fuwenTemp.skills[0] = skillLen
  533. end
  534. if attrLen == 0 and fuwen.skillTemp == nil then
  535. msgRet.fuwenTemp.id = 0
  536. else
  537. msgRet.fuwenTemp.id = fuwen.id
  538. end
  539. local lenth = #refreshConfig.expend
  540. for i = 1,lenth do
  541. Grid.makeItem(msgRet.expend[i],refreshConfig.expend[i][1],refreshConfig.expend[i][2])
  542. end
  543. msgRet.expend[0] = lenth
  544. -- 锁定属性,技能的额外消耗
  545. local itemCnt = calcLockCost(fuwen)
  546. if itemCnt > 0 then
  547. lenth = lenth + 1
  548. msgRet.expend[0] = lenth
  549. Grid.makeItem(msgRet.expend[lenth], LOCK_COST_ITEN_ID, itemCnt)
  550. end
  551. msgRet.refreshCnt = 0
  552. if refreshConfig.rare == ItemDefine.ITEM_RARE_COLOR_5 then
  553. msgRet.refreshCnt = human.db.fuwenRefreshCnt.sh
  554. elseif refreshConfig.rare == ItemDefine.ITEM_RARE_COLOR_6 then
  555. msgRet.refreshCnt = human.db.fuwenRefreshCnt.cs
  556. end
  557. msgRet.needCnt = refreshConfig.luckRefresh or 0
  558. Msg.send(msgRet,human.fd)
  559. end
  560. -- 符文刷新
  561. function fuwenRefreshDo(human,fuwenID,fuwenIndex,heroID,heroIndex,pos)
  562. local refreshConfig = FuwenExcel.fuwen[fuwenID]
  563. if refreshConfig == nil then
  564. return Broadcast.sendErr(human,Lang.FUWEN_REFRESH_CONFIG_ERR) -- 传入参数非法
  565. end
  566. local fuwenGrid = nil
  567. if fuwenIndex == -1 then -- 刷英雄身上的
  568. local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
  569. if heroGrid == nil then
  570. return Broadcast.sendErr(human,Lang.FUWEN_HERO_GRID_ERR) -- 传入的英雄数据非法
  571. end
  572. if pos == nil then
  573. return Broadcast.sendErr(human,Lang.FUWEN_PUTOFF_ERR) -- 传入的参数非法
  574. end
  575. if heroGrid.fuwen == nil or heroGrid.fuwen[pos] == nil or heroGrid.fuwen[pos].id == nil then
  576. return Broadcast.sendErr(human,Lang.FUWEN_PUTOFF_ERR) -- 传入的参数非法
  577. end
  578. fuwenGrid = heroGrid.fuwen[pos]
  579. else -- 刷背包里的
  580. if human.db.fuwenBag == nil or human.db.fuwenBag[fuwenIndex] == nil then
  581. return Broadcast.sendErr(human,Lang.FUWEN_HECHENG_FILL_ERR) -- 材料不存在
  582. end
  583. fuwenGrid = human.db.fuwenBag[fuwenIndex]
  584. end
  585. if fuwenGrid == nil or fuwenGrid.id == nil then
  586. return
  587. end
  588. if fuwenGrid.id ~= nil and fuwenGrid.id ~= fuwenID then
  589. return Broadcast.sendErr(human,Lang.FUWEN_ID_ERR)
  590. end
  591. -- 幸运重铸判定
  592. local luckRefresh = 0
  593. local refreshCnt = 0
  594. human.db.fuwenRefreshCnt.cs = human.db.fuwenRefreshCnt.cs or 0
  595. human.db.fuwenRefreshCnt.sh = human.db.fuwenRefreshCnt.sh or 0
  596. if refreshConfig.rare == ItemDefine.ITEM_RARE_COLOR_5 then
  597. refreshCnt = human.db.fuwenRefreshCnt.sh or 0
  598. elseif refreshConfig.rare == ItemDefine.ITEM_RARE_COLOR_6 then
  599. refreshCnt = human.db.fuwenRefreshCnt.cs or 0
  600. end
  601. if refreshConfig.luckRefresh ~= nil and refreshConfig.luckRefresh ~= 0 and refreshCnt >= refreshConfig.luckRefresh then
  602. luckRefresh = 1
  603. end
  604. local jinghuaCnt = BagLogic.getItemCnt(human, ItemDefine.ITEM_FUWEN_JINGHUA)
  605. if human.db.jinbi < refreshConfig.expend[1][2] or jinghuaCnt < refreshConfig.expend[2][2] then
  606. return Broadcast.sendErr(human,Lang.FUWEN_REFRESH_FILL_ERR) -- 材料不够
  607. end
  608. local itemCnt = calcLockCost(fuwenGrid)
  609. if itemCnt > 0 then
  610. if BagLogic.getItemCnt(human, LOCK_COST_ITEN_ID) < itemCnt then
  611. return Broadcast.sendErr(human,Lang.FUWEN_REFRESH_FILL_ERR)
  612. end
  613. end
  614. if refreshConfig.rare == ItemDefine.ITEM_RARE_COLOR_5 then
  615. human.db.fuwenRefreshCnt.sh = human.db.fuwenRefreshCnt.sh + 1
  616. elseif refreshConfig.rare == ItemDefine.ITEM_RARE_COLOR_6 then
  617. human.db.fuwenRefreshCnt.cs = human.db.fuwenRefreshCnt.cs + 1
  618. end
  619. if human.db.fuwenRefreshCnt.cs > 15 then
  620. human.db.fuwenRefreshCnt.cs = 0
  621. end
  622. if human.db.fuwenRefreshCnt.sh > 25 then
  623. human.db.fuwenRefreshCnt.sh = 0
  624. end
  625. -- 扣消耗
  626. local fuwenGridTemp = Util.copyTable(fuwenGrid)
  627. ObjHuman.updateJinbi(human, -refreshConfig.expend[1][2], "fuwen_refresh")
  628. BagLogic.delItem(human, ItemDefine.ITEM_FUWEN_JINGHUA, refreshConfig.expend[2][2], "fuwen_refresh")
  629. if itemCnt > 0 then
  630. BagLogic.delItem(human, LOCK_COST_ITEN_ID, itemCnt, "fuwen_refresh")
  631. end
  632. Util.printTable(fuwenGridTemp.attr)
  633. -- 改属性
  634. FuwenGrid.genFuwenAttr(fuwenGridTemp,luckRefresh)
  635. fuwenGrid.attrTemp = fuwenGridTemp.attr or {}
  636. fuwenGrid.skillTemp = fuwenGridTemp.skill
  637. local msgRet = Msg.gc.GC_FUWEN_REFRESH_DO
  638. Grid.makeItem(msgRet.fuwen, fuwenGridTemp.id, 1, nil, fuwenGridTemp, fuwenIndex)
  639. Msg.send(msgRet,human.fd)
  640. fuwenRefreshQuery(human,fuwenID,fuwenIndex,pos,heroID,heroIndex)
  641. YunYingLogic.onCallBack(human, "onFuwenChongZhu",1)
  642. TriggerLogic.PublishEvent(TriggerDefine.FUWEN_RESET, human.db._id, 1)
  643. end
  644. -- 锁定/解锁符文的属性,技能
  645. function ResetLock(human, fuwenID,fuwenIndex,heroID,heroIndex,pos, opTarget, opIdx, opType)
  646. local refreshConfig = FuwenExcel.fuwen[fuwenID]
  647. if refreshConfig == nil then
  648. return Broadcast.sendErr(human,Lang.FUWEN_GRID_ERR) -- 传入参数非法
  649. end
  650. if refreshConfig.order < LOCK_FUWEN_COLOR_BASE then
  651. return Broadcast.sendErr(human,Lang.FUWEN_COLOR_ERR)
  652. end
  653. local fuwenGrid = nil
  654. if fuwenIndex == -1 then -- 刷英雄身上的
  655. local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
  656. if heroGrid == nil then
  657. return Broadcast.sendErr(human,Lang.FUWEN_HERO_GRID_ERR) -- 传入的英雄数据非法
  658. end
  659. if pos == nil then
  660. return Broadcast.sendErr(human,Lang.FUWEN_PUTOFF_ERR) -- 传入的参数非法
  661. end
  662. if heroGrid.fuwen == nil or heroGrid.fuwen[pos] == nil or heroGrid.fuwen[pos].id == nil then
  663. return Broadcast.sendErr(human,Lang.FUWEN_PUTOFF_ERR) -- 传入的参数非法
  664. end
  665. fuwenGrid = heroGrid.fuwen[pos]
  666. else -- 刷背包里的
  667. if human.db.fuwenBag == nil or human.db.fuwenBag[fuwenIndex] == nil then
  668. return Broadcast.sendErr(human,Lang.FUWEN_HECHENG_FILL_ERR) -- 材料不存在
  669. end
  670. fuwenGrid = human.db.fuwenBag[fuwenIndex]
  671. end
  672. if fuwenGrid == nil or fuwenGrid.id == nil then
  673. return Broadcast.sendErr(human,Lang.FUWEN_HECHENG_FILL_ERR)
  674. end
  675. if fuwenGrid.id ~= nil and fuwenGrid.id ~= fuwenID then
  676. return Broadcast.sendErr(human,Lang.FUWEN_ID_ERR)
  677. end
  678. if opType ~= 1 and opType ~= 0 then
  679. return Broadcast.sendErr(human,Lang.COMMON_ARGUMENT_ERROR)
  680. end
  681. -- 锁定数量判断
  682. if opType == 1 then
  683. local lockNum = getFuwenLockInfo(fuwenGrid)
  684. if lockNum >= LOCK_FUWEN_MAX_NUM then
  685. return Broadcast.sendErr(human,Lang.FUWEN_LOCK_MAX_ERR)
  686. end
  687. end
  688. -- 对属性进行锁定/解锁
  689. if opTarget == 1 then
  690. if not fuwenGrid.attr[opIdx] then
  691. return Broadcast.sendErr(human,Lang.FUWEN_ATTR_POS_ERR)
  692. end
  693. fuwenGrid.attr[opIdx][3] = opType
  694. elseif opTarget == 2 then -- 对技能进行锁定/解锁
  695. if not fuwenGrid.skill or not fuwenGrid.skill[opIdx] then
  696. return Broadcast.sendErr(human,Lang.FUWEN_SKILL_POS_ERR)
  697. end
  698. local skillId = fuwenGrid.skill[opIdx]
  699. fuwenGrid.skillLockList = fuwenGrid.skillLockList or {}
  700. if opType == 1 then
  701. fuwenGrid.skillLockList[skillId] = opIdx
  702. end
  703. if opType == 0 then
  704. fuwenGrid.skillLockList[skillId] = nil
  705. end
  706. else
  707. return Broadcast.sendErr(human,Lang.COMMON_ARGUMENT_ERROR)
  708. end
  709. fuwenRefreshQuery(human,fuwenID,fuwenIndex,pos,heroID,heroIndex)
  710. end
  711. local function cmpSkill(a, b)
  712. if a.sortID ~= b.sortID then
  713. return a.sortID < b.sortID
  714. end
  715. return a.skillID < b.skillID
  716. end
  717. local SORT_SKILL_LIST = nil
  718. function getSortSkillList()
  719. if not SORT_SKILL_LIST then
  720. SORT_SKILL_LIST = {}
  721. for skillID, config in pairs(FuwenExcel.skill) do
  722. config.skillID = skillID
  723. SORT_SKILL_LIST[#SORT_SKILL_LIST + 1] = config
  724. end
  725. if #SORT_SKILL_LIST > 1 then
  726. table.sort(SORT_SKILL_LIST, cmpSkill)
  727. end
  728. end
  729. return SORT_SKILL_LIST
  730. end
  731. -- 技能查询
  732. function fuwenRareSkillQuery(human, lv)
  733. local configs = getSortSkillList()
  734. local msgRet = Msg.gc.GC_FUWEN_RARE_SKILL_QUERY
  735. msgRet.type = lv
  736. local cnt = 0
  737. for _, config in ipairs(configs) do
  738. if config.lv == lv then
  739. cnt = cnt + 1
  740. Grid.makeFuwenSkill(msgRet.skillInfo[cnt], config.skillID)
  741. end
  742. end
  743. if cnt > 0 then
  744. msgRet.skillInfo[0] = cnt
  745. Msg.send(msgRet, human.fd)
  746. end
  747. end
  748. -- 计算属性
  749. local tbSkillGroupID = {}
  750. function doCalcHero(obj,attrs)
  751. Util.initTable(tbSkillGroupID)
  752. if obj.fuwen then
  753. for i = 1, 2 do
  754. local fuwenGrid = obj.fuwen[i]
  755. if fuwenGrid and fuwenGrid.id ~= nil then
  756. for k, v in ipairs(fuwenGrid.attr) do
  757. RoleAttr.updateValue(v[1], v[2], attrs)
  758. end
  759. local skillLen = fuwenGrid.skill and #fuwenGrid.skill or 0
  760. for j = 1, skillLen do
  761. local skillID = fuwenGrid.skill[j]
  762. local skillConfig = FuwenExcel.skill[skillID]
  763. local groupID = skillConfig.groupID
  764. if (tbSkillGroupID[groupID] or 0) < skillID then
  765. tbSkillGroupID[groupID] = skillID
  766. end
  767. end
  768. end
  769. end
  770. end
  771. -- 兵书技能
  772. if obj.bingshu then
  773. for i = 1, BingshuLogic.BINGSHU_MAXCNT do
  774. local bingshuGrid = obj.bingshu[i]
  775. if bingshuGrid then
  776. local skillID = bingshuGrid.skillID
  777. local skillConfig = FuwenExcel.skill[skillID]
  778. local groupID = skillConfig.groupID
  779. if (tbSkillGroupID[groupID] or 0) < skillID then
  780. tbSkillGroupID[groupID] = skillID
  781. end
  782. end
  783. end
  784. end
  785. -- 符文技能效果这里 如果有多个同类型的技能 效果不叠加 只取最高等级的那个技能的效果
  786. for groupID, skillIDTemp in pairs(tbSkillGroupID) do
  787. local skillConfig = FuwenExcel.skill[skillIDTemp]
  788. local cnt = #skillConfig.attrs
  789. if cnt > 0 then
  790. for k, v in ipairs(skillConfig.attrs) do
  791. RoleAttr.updateValue(v[1], v[2], attrs)
  792. end
  793. end
  794. end
  795. end
  796. -- 熔炼值查询
  797. function fuwenSmeltValQuery(human)
  798. local msgRet = Msg.gc.GC_FUWEN_SMELT_VAL_QUERY
  799. msgRet.accountSmeltVal = human.db.smeltVal or 0
  800. Msg.send(msgRet,human.fd)
  801. end
  802. -- 符文刷新保存
  803. function fuwenRefreshSave(human,fuwenID,fuwenIndex,pos,heroID,heroIndex)
  804. local fuwen = nil
  805. if fuwenIndex == -1 then
  806. local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
  807. if heroGrid == nil then
  808. return Broadcast.sendErr(human,Lang.FUWEN_HERO_GRID_ERR)
  809. end
  810. if heroGrid.fuwen == nil or heroGrid.fuwen[pos] == nil then
  811. return Broadcast.sendErr(human,Lang.FUWEN_PUTOFF_ERR)
  812. end
  813. fuwen = heroGrid.fuwen[pos]
  814. else
  815. fuwen = human.db.fuwenBag[fuwenIndex]
  816. end
  817. if fuwen == nil or fuwen.id == nil then
  818. return Broadcast.sendErr(human,Lang.FUWEN_HECHENG_FILL_ERR)
  819. end
  820. if fuwen.id ~= fuwenID then
  821. return Broadcast.sendErr(human,Lang.FUWEN_ID_ERR)
  822. end
  823. if fuwen.attrTemp ~= nil or fuwen.skillTemp ~= nil then
  824. if fuwen.attrTemp and next(fuwen.attrTemp) then
  825. fuwen.attr = fuwen.attrTemp
  826. fuwen.attrTemp = {}
  827. else
  828. --Log.write(Log.LOGID_DEBUG, human.db._id, human.db.account, human.db.name, human.db.lv, fuwen.id,"refreshsave attrTemp is empty")
  829. Log.write(Log.LOGID_DEBUG, human.db._id, human.db.newUniqueTag, human.db.name, human.db.lv, fuwen.id,"refreshsave attrTemp is empty")
  830. end
  831. if fuwen.skillTemp and next(fuwen.skillTemp) then
  832. fuwen.skill = fuwen.skillTemp
  833. fuwen.skillTemp = nil
  834. else
  835. --Log.write(Log.LOGID_DEBUG, human.db._id, human.db.account, human.db.name, human.db.lv, fuwen.id,"refreshsave skillTemp is empty")
  836. Log.write(Log.LOGID_DEBUG, human.db._id, human.db.newUniqueTag, human.db.name, human.db.lv, fuwen.id,"refreshsave skillTemp is empty")
  837. end
  838. end
  839. Broadcast.sendErr(human,Lang.FUWEN_SAVE_SUCCESS)
  840. if fuwenIndex == -1 then
  841. ObjHuman.doCalcHero(human,heroIndex)
  842. HeroLogic.sendHeroBagDynamic(human, heroID, heroIndex)
  843. HeroEquip.query(human, heroID, heroIndex)
  844. else
  845. sendFuwenItemChange(human, fuwenIndex, fuwen, FuwenDefine.FUWEN_BAG_OP_ADD)
  846. end
  847. fuwenRefreshQuery(human,fuwenID,fuwenIndex,pos,heroID,heroIndex)
  848. end
  849. -- 符文兑换查询
  850. function fuwenExchangeQuery(human)
  851. local msgRet = Msg.gc.GC_FUWEN_EXCHANGE_QUERY
  852. local gridTemp = FuwenGrid.create(FuwenDefine.FUWEN_EXCHANGE_ID)
  853. Grid.makeItem(msgRet.fuwen, gridTemp.id, 1, nil, gridTemp, 1)
  854. Msg.send(msgRet,human.fd)
  855. end
  856. -- 符文格子解锁
  857. function fuwenGridUnlock(human,heroID,heroIndex,pos)
  858. local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
  859. if heroGrid == nil then
  860. return
  861. end
  862. if heroGrid.fuwen ~= nil and heroGrid.fuwen[pos] ~= nil then
  863. return
  864. end
  865. if pos == 1 then
  866. if heroGrid.lv < 100 then
  867. else
  868. heroGrid.fuwen = heroGrid.fuwen or {}
  869. heroGrid.fuwen[1] = {}
  870. end
  871. elseif pos == 2 then
  872. if heroGrid.star < 7 then
  873. else
  874. heroGrid.fuwen = heroGrid.fuwen or {}
  875. heroGrid.fuwen[2] = {}
  876. end
  877. end
  878. end
  879. function wrapFuwenAttrNet(net,fuwenConf)
  880. local len = 0
  881. for _,attr in ipairs(fuwenConf.absAttrPool) do
  882. len = len + 1
  883. net.base_attrs[len].key = attr[1]
  884. net.base_attrs[len].value = attr[2]
  885. end
  886. net.base_attrs[0] = len
  887. local len2 = 0
  888. for _, attr in ipairs(fuwenConf.percentAttrPool) do
  889. len2 = len2 + 1
  890. net.percent_attrs[len2].key = attr[1]
  891. net.percent_attrs[len2].value = attr[2]
  892. end
  893. net.percent_attrs[0] = len2
  894. end
  895. -- 符文属性查询
  896. function CG_FUWEN_ATTR_QUERY(human,fuwenID)
  897. if fuwenID == nil then
  898. return Broadcast.sendErr(human,Lang.FUWEN_ITEMID_ERR)
  899. end
  900. local fuwenConfig = FuwenExcel.fuwen[fuwenID]
  901. if fuwenConfig == nil then
  902. return
  903. end
  904. local msgRet = Msg.gc.GC_FUWEN_ATTR_QUERY
  905. wrapFuwenAttrNet(msgRet,fuwenConfig)
  906. Msg.send(msgRet,human.fd)
  907. end
  908. -- 符文精炼预览
  909. function fuwenRefinePreview(human)
  910. local fuwenGrid = {}
  911. fuwenGrid = FuwenGrid.create(FuwenDefine.FUWEN_REFINE_ID)
  912. local msgRet = Msg.gc.GC_FUWEN_REFINE_PREVIEW_QUERY
  913. Grid.makeItem(msgRet.fuwen, fuwenGrid.id, 1, nil, fuwenGrid, 1)
  914. Msg.send(msgRet,human.fd)
  915. end
  916. -- 符文精炼查询
  917. function fuwenRefineQuery(human,fuwenID,fuwenIndex,pos,heroID,heroIndex)
  918. local fuwen = nil
  919. if fuwenIndex == -1 then
  920. local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
  921. if heroGrid == nil then
  922. return Broadcast.sendErr(human,Lang.FUWEN_HERO_GRID_ERR)
  923. end
  924. if heroGrid.fuwen == nil or heroGrid.fuwen[pos] == nil then
  925. return Broadcast.sendErr(human,Lang.FUWEN_PUTOFF_ERR)
  926. end
  927. fuwen = heroGrid.fuwen[pos]
  928. else
  929. fuwen = human.db.fuwenBag[fuwenIndex]
  930. end
  931. if fuwen == nil or fuwen.id == nil then
  932. return Broadcast.sendErr(human,Lang.FUWEN_HECHENG_FILL_ERR) -- 材料不存在
  933. end
  934. if fuwen.id ~= fuwenID then
  935. return Broadcast.sendErr(human,Lang.FUWEN_ID_ERR)
  936. end
  937. if FuwenExcel.fuwen[fuwen.id].refine ~= 1 then
  938. return
  939. end
  940. local jinglianExcel = FuwenExcel.jinglian
  941. local refine = fuwen.refine or 0
  942. local refineExcel = jinglianExcel[refine + 1]
  943. -- 构造预览符文
  944. local previewFuwen = Util.copyTable(fuwen)
  945. previewFuwen.refine = refine + 1
  946. if refine == 0 then
  947. -- 第1次精炼
  948. local newValue = previewFuwen.attr[1][2] * 2
  949. previewFuwen.attr[1][2] = newValue
  950. elseif refine == 1 then
  951. -- 第2次精炼
  952. local fuwenConfig = FuwenExcel.fuwen[fuwen.id]
  953. cnt = #fuwenConfig.percentAttrPool
  954. if cnt > 0 then
  955. local randIndex = math.random(1, cnt)
  956. local attrKey = fuwenConfig.percentAttrPool[randIndex][1]
  957. local attrVal = fuwenConfig.percentAttrPool[randIndex][2]
  958. previewFuwen.attr[3] = {attrKey, attrVal}
  959. end
  960. elseif refine == 2 then
  961. -- 第3次精炼
  962. local skillConfig = FuwenExcel.skill
  963. local skillLen = #previewFuwen.skill
  964. for i = 1,skillLen do
  965. local skillID = previewFuwen.skill[i]
  966. local skillLv = skillConfig[skillID].lv
  967. if skillLv < 3 then
  968. skillID = skillID + 1000
  969. end
  970. previewFuwen.skill[i] = skillID
  971. end
  972. previewFuwen.id = fuwen.id + 1
  973. end
  974. -- 发数据
  975. local msgRet = Msg.gc.GC_FUWEN_REFINE_QUERY
  976. Grid.makeItem(msgRet.fuwen,previewFuwen.id, 1, nil,previewFuwen, 1)
  977. local expendLen = #refineExcel.expend
  978. for i = 1,expendLen do
  979. Grid.makeItem(msgRet.expend[i],refineExcel.expend[i][1],refineExcel.expend[i][2])
  980. end
  981. msgRet.expend[0] = expendLen
  982. local jinglianLen = #jinglianExcel
  983. for i = 1,jinglianLen do
  984. msgRet.refineDesc[i].desc = jinglianExcel[i].desc
  985. end
  986. msgRet.refineDesc[0] = jinglianLen
  987. Msg.send(msgRet,human.fd)
  988. end
  989. -- 符文精炼
  990. function fuwenRefineDo(human,fuwenID,fuwenIndex,pos,heroID,heroIndex)
  991. local fuwen = nil
  992. if fuwenIndex == -1 then
  993. local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
  994. if heroGrid == nil then
  995. return Broadcast.sendErr(human,Lang.FUWEN_HERO_GRID_ERR)
  996. end
  997. if heroGrid.fuwen == nil or heroGrid.fuwen[pos] == nil then
  998. return Broadcast.sendErr(human,Lang.FUWEN_PUTOFF_ERR)
  999. end
  1000. fuwen = heroGrid.fuwen[pos]
  1001. else
  1002. fuwen = human.db.fuwenBag[fuwenIndex]
  1003. end
  1004. if fuwen == nil or fuwen.id == nil then
  1005. return Broadcast.sendErr(human,Lang.FUWEN_HECHENG_FILL_ERR) -- 材料不存在
  1006. end
  1007. if fuwen.id ~= fuwenID then
  1008. return Broadcast.sendErr(human,Lang.FUWEN_ID_ERR)
  1009. end
  1010. if FuwenExcel.fuwen[fuwen.id].refine ~= 1 then
  1011. return
  1012. end
  1013. local newRefine = fuwen.refine or 0
  1014. newRefine = newRefine + 1
  1015. local jinglianExcel = FuwenExcel.jinglian
  1016. local refineExcel = jinglianExcel[newRefine]
  1017. local expendLen = #refineExcel.expend
  1018. for i = 1,expendLen do
  1019. local v = refineExcel.expend[i]
  1020. local haveCnt = BagLogic.getItemCnt(human,v[1])
  1021. if haveCnt < v[2] then
  1022. return Broadcast.sendErr(human,Lang.FUWEN_REFRESH_FILL_ERR) -- 材料不够
  1023. end
  1024. end
  1025. --删除材料
  1026. for i = 1,expendLen do
  1027. local v = refineExcel.expend[i]
  1028. BagLogic.delItem(human, v[1], v[2], "fuwen_refine")
  1029. end
  1030. if newRefine == 1 then
  1031. -- 第1次精炼
  1032. fuwen.refine = newRefine
  1033. local newValue = fuwen.attr[1][2] * 2
  1034. fuwen.attr[1][2] = newValue
  1035. elseif newRefine == 2 then
  1036. -- 第2次精炼
  1037. fuwen.refine = newRefine
  1038. local fuwenConfig = FuwenExcel.fuwen[fuwen.id]
  1039. cnt = #fuwenConfig.percentAttrPool
  1040. if cnt > 0 then
  1041. local randIndex = math.random(1, cnt)
  1042. local attrKey = fuwenConfig.percentAttrPool[randIndex][1]
  1043. local attrVal = fuwenConfig.percentAttrPool[randIndex][2]
  1044. fuwen.attr[3] = {attrKey, attrVal}
  1045. end
  1046. elseif newRefine == 3 then
  1047. -- 第3次精炼
  1048. fuwen.refine = newRefine
  1049. local skillConfig = FuwenExcel.skill
  1050. local skillLen = #fuwen.skill
  1051. for i = 1,skillLen do
  1052. local skillID = fuwen.skill[i]
  1053. local skillLv = skillConfig[skillID].lv
  1054. if skillLv < 4 then
  1055. skillID = skillID + 1000
  1056. end
  1057. fuwen.skill[i] = skillID
  1058. end
  1059. fuwen.id = fuwen.id + 1
  1060. fuwen.refine = 0
  1061. -- 变成神话特殊判断
  1062. local tConfig = FuwenExcel.fuwen[fuwen.id]
  1063. if tConfig and tConfig.order == 6 then
  1064. TriggerLogic.PublishEvent(TriggerDefine.FUWEN_GETQUALITY, human.db._id, tConfig.order, 1)
  1065. end
  1066. else
  1067. return
  1068. end
  1069. if fuwenIndex == -1 then
  1070. ObjHuman.doCalcHero(human,heroIndex)
  1071. HeroLogic.sendHeroBagDynamic(human, heroID, heroIndex)
  1072. HeroEquip.query(human, heroID, heroIndex)
  1073. else
  1074. sendFuwenItemChange(human, fuwenIndex, fuwen, FuwenDefine.FUWEN_BAG_OP_ADD)
  1075. end
  1076. local msgRet = Msg.gc.GC_FUWEN_REFINE_DO
  1077. Grid.makeItem(msgRet.fuwen,fuwen.id, 1,nil, fuwen, 1)
  1078. Msg.send(msgRet,human.fd)
  1079. end
  1080. -- 是否有符文红点
  1081. function isFuwenDot(human, heroGrid)
  1082. if not heroGrid then return end
  1083. local heroConfig = HeroExcel[heroGrid.id]
  1084. if not heroConfig then return end
  1085. if human.db.lv < 9 then
  1086. return false
  1087. end
  1088. local haveFuwen = nil
  1089. local emptyCnt = FuwenGrid.getEmptyCnt(human)
  1090. if emptyCnt < FuwenDefine.FUWEN_BAG_MAX_CNT then
  1091. haveFuwen = true
  1092. end
  1093. for pos = 1, 2 do
  1094. local fuwenGrid = heroGrid.fuwen and heroGrid.fuwen[pos]
  1095. if fuwenGrid ~= nil and fuwenGrid.id == nil and haveFuwen then
  1096. return true
  1097. end
  1098. end
  1099. end
  1100. -- 是否有装备红点
  1101. function isFuwenDotByPos(human, heroGrid, pos)
  1102. if not heroGrid then return end
  1103. local heroConfig = HeroExcel[heroGrid.id]
  1104. if not heroConfig then return end
  1105. local haveFuwen = nil
  1106. local emptyCnt = FuwenGrid.getEmptyCnt(human)
  1107. if emptyCnt < FuwenDefine.FUWEN_BAG_MAX_CNT then
  1108. haveFuwen = true
  1109. end
  1110. local fuwenGrid = heroGrid.fuwen and heroGrid.fuwen[pos]
  1111. if fuwenGrid ~= nil and fuwenGrid.id == nil and haveFuwen then
  1112. return true
  1113. end
  1114. end
  1115. function sendFuwenGetWay(human)
  1116. local msgRet = Msg.gc.GC_FUWEN_GET_WAY_QUERY
  1117. local fuwenGrid = FuwenGrid.create(80001)
  1118. local hechengConfig = FuwenExcel.hechengRule[80001]
  1119. Grid.makeItem(msgRet.newFuwen, 80001, 1, nil, fuwenGrid, 1)
  1120. msgRet.desc1 = hechengConfig.desc1
  1121. msgRet.desc2 = hechengConfig.desc2
  1122. Msg.send(msgRet,human.fd)
  1123. end
  1124. function fuwenHechengOneClickDo(human, tFuwenIndex)
  1125. -- 没买卡
  1126. if 0 == Abs365CardLogic.IsBuyCard(human) then
  1127. return
  1128. end
  1129. -- 等级不够
  1130. if human.db.lv < 30 then
  1131. return
  1132. end
  1133. local nAllLen = tFuwenIndex[0]
  1134. if nAllLen < 2 or nAllLen % 5 ~= 0 then
  1135. return Broadcast.sendErr(human,Lang.FUWEN_HECHENG_CNR_ERR)
  1136. end
  1137. local tFuWenList, tCheckIndex = {}, {}
  1138. local tFuWenGroup, nCheckFuWenID = {}, nil
  1139. local nLen, nAllUseJinBi = 0, 0
  1140. -- 检查一下是否有重复
  1141. for i = 1, nAllLen, 1 do
  1142. nLen = nLen + 1
  1143. local nIndex = tFuwenIndex[i]
  1144. if tCheckIndex[nIndex] then
  1145. print("[fuwenHechengOneClickDo] 存在重复的 nIndex = "..nIndex)
  1146. return
  1147. end
  1148. -- 背包中没有该符文
  1149. if human.db.fuwenBag[nIndex] == nil then
  1150. return Broadcast.sendErr(human,Lang.FUWEN_HECHENG_FILL_ERR)
  1151. end
  1152. -- 校验材料是否相同
  1153. local fuwenGrid = human.db.fuwenBag[nIndex]
  1154. if nCheckFuWenID == nil then
  1155. nCheckFuWenID = fuwenGrid.id
  1156. else
  1157. if nCheckFuWenID ~= fuwenGrid.id then
  1158. return Broadcast.sendErr(human,Lang.FUWEN_ID_ERR)
  1159. end
  1160. end
  1161. tCheckIndex[nIndex] = true
  1162. table.insert(tFuWenGroup, nIndex)
  1163. if nLen == 5 then
  1164. -- 一组完成,检查一下对应的配置
  1165. local tHeChengConfig = FuwenExcel.hechengRule[nCheckFuWenID]
  1166. if not tHeChengConfig then
  1167. return Broadcast.sendErr(human,Lang.FUWEN_HECHENG_CONFIG_ERR)
  1168. end
  1169. -- 校验是否达到合成限制等级
  1170. if tHeChengConfig.limit > human.db.lv then
  1171. return Broadcast.sendErr(human,Util.format(Lang.ROLE_LV_TOO_LOW, tHeChengConfig.limit))
  1172. end
  1173. nAllUseJinBi = nAllUseJinBi + tHeChengConfig.hechengCost[nLen - 1]
  1174. table.insert(tFuWenList, tFuWenGroup)
  1175. nLen = 0
  1176. tFuWenGroup = {}
  1177. nCheckFuWenID = nil
  1178. print("[fuwenHechengOneClickDo] 插入数据一次")
  1179. end
  1180. end
  1181. if human.db.jinbi < nAllUseJinBi then
  1182. return Broadcast.sendErr(human,Lang.COMMON_NO_JINBI)
  1183. end
  1184. ObjHuman.updateJinbi(human, -nAllUseJinBi, "fuwen_hecheng")
  1185. table.print_lua_table(tFuWenList)
  1186. print("[fuwenHechengOneClickDo] 打印符文数据完成")
  1187. -- 开始进行合成操作
  1188. --local fenjieList, nAllSmeltVal, nAllfenjieJinghua_cnt = {}, 0, 0
  1189. local tMsgData = Msg.gc.GC_FUWEN_HECHENG_ONECLICK
  1190. tMsgData.tSuccess[0] = 0
  1191. for i, v in ipairs(tFuWenList) do
  1192. local nIndex, nIndexLen = v[1], #v
  1193. local fuwenGrid = human.db.fuwenBag[nIndex]
  1194. local nFuWenID = fuwenGrid.id
  1195. local hechengConfig = FuwenExcel.hechengRule[nFuWenID]
  1196. if hechengConfig then
  1197. local nNewFuWenID = hechengConfig.newFuwenID
  1198. local rate = hechengConfig.hechengRate[nIndexLen - 1]
  1199. local randomNum = math.random(1,100)
  1200. for j = 1,nIndexLen do
  1201. local index = v[j]
  1202. del(human, index, "fuwen_hecheng")
  1203. end
  1204. tMsgData.tSuccess[0] = tMsgData.tSuccess[0] + 1
  1205. local msgRet = tMsgData.tSuccess[tMsgData.tSuccess[0]]
  1206. local newFuwenGrid = FuwenGrid.create(nNewFuWenID)
  1207. local newIndex = addByGrid(human, newFuwenGrid, "fuwen_hecheng")
  1208. Grid.makeItem(msgRet, newFuwenGrid.id, 1, nil, newFuwenGrid, newIndex,0)
  1209. local tConfig = FuwenExcel.fuwen[nNewFuWenID]
  1210. if tConfig then
  1211. TriggerLogic.PublishEvent(TriggerDefine.FUWEN_GETQUALITY, human.db._id, tConfig.order, 1)
  1212. end
  1213. end
  1214. end
  1215. print("[fuwenHechengOneClickDo] 发送数据的长度为 "..tMsgData.tSuccess[0])
  1216. Msg.send(tMsgData, human.fd)
  1217. print("[fuwenHechengOneClickDo]发送符文数据结束")
  1218. -- 符文合成回调
  1219. ChengjiuLogic.onCallback(human,ChengjiuDefine.CJ_TASK_TYPE_22, #tFuWenList)
  1220. HeroGrowUp.onCallback(human, HeroGrowUp.TASKTYPE8, #tFuWenList)
  1221. YunYingLogic.onCallBack(human, "onFuwenHecheng", #tFuWenList)
  1222. TriggerLogic.PublishEvent(TriggerDefine.FUWEN_HECHENG, human.db._id, #tFuWenList)
  1223. end