FuwenLogic.lua 50 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535
  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. local skillArray = fuwen.skill
  509. if skillArray then
  510. local skillNum = #skillArray
  511. local fuwenConfig = FuwenExcel.fuwen[fuwen.id]
  512. local skillMaxNum = FuwenGrid.getFuwenSkillMaxCnt(fuwenConfig)
  513. if skillNum > skillMaxNum then
  514. local skillTb = {}
  515. for _, skillId in ipairs(skillArray) do
  516. table.insert(skillTb, skillId)
  517. end
  518. table.sort(skillTb, function (a, b)
  519. return a > b
  520. end)
  521. fuwen.skill = {}
  522. for i=1, skillMaxNum do
  523. fuwen.skill[1] = skillTb[i]
  524. end
  525. skillArray = fuwen.skill
  526. end
  527. local skillLockList = fuwen.skillLockList
  528. if skillLockList and next(skillLockList) then
  529. for skillId, skillPos in pairs(skillLockList) do
  530. if not table.find(skillArray, skillId) then
  531. skillLockList[skillId] = nil
  532. local reallySkillId = skillArray[skillPos]
  533. skillLockList[reallySkillId] = skillPos
  534. end
  535. end
  536. end
  537. end
  538. -- 本体符文
  539. Grid.makeItemFuwen(msgRet.fuwen,fuwen.id,FuwenExcel.fuwen[fuwen.id],fuwen,fuwenIndex)
  540. -- 临时符文
  541. Grid.makeItemFuwen(msgRet.fuwenTemp,fuwen.id,FuwenExcel.fuwen[fuwen.id],fuwen,fuwenIndex)
  542. if fuwen.attrTemp == nil then
  543. fuwen.attrTemp = {}
  544. end
  545. -- 临时属性备份
  546. local attrLen = #fuwen.attrTemp
  547. for zz = 1,attrLen do
  548. -- msgRet.fuwenTemp.attrs[zz].key = fuwen.attrTemp[zz][1]
  549. -- msgRet.fuwenTemp.attrs[zz].value = fuwen.attrTemp[zz][2]
  550. msgRet.fuwenTemp.attrs[zz].attrArray.key = fuwen.attrTemp[zz][1]
  551. msgRet.fuwenTemp.attrs[zz].attrArray.value = fuwen.attrTemp[zz][2]
  552. msgRet.fuwenTemp.attrs[zz].isLock = fuwen.attrTemp[zz][3] or 0
  553. end
  554. msgRet.fuwenTemp.attrs[0] = attrLen
  555. -- 临时技能备份
  556. if fuwen.skillTemp == nil then
  557. msgRet.fuwenTemp.skills[0] = 0
  558. else
  559. local skillLen = #fuwen.skillTemp
  560. for zz = 1,skillLen do
  561. Grid.makeFuwenSkill(msgRet.fuwenTemp.skills[zz], fuwen.skillTemp[zz], fuwen.skillLockList)
  562. end
  563. msgRet.fuwenTemp.skills[0] = skillLen
  564. end
  565. if attrLen == 0 and fuwen.skillTemp == nil then
  566. msgRet.fuwenTemp.id = 0
  567. else
  568. msgRet.fuwenTemp.id = fuwen.id
  569. end
  570. local lenth = #refreshConfig.expend
  571. for i = 1,lenth do
  572. Grid.makeItem(msgRet.expend[i],refreshConfig.expend[i][1],refreshConfig.expend[i][2])
  573. end
  574. msgRet.expend[0] = lenth
  575. -- 锁定属性,技能的额外消耗
  576. local itemCnt = calcLockCost(fuwen)
  577. if itemCnt > 0 then
  578. lenth = lenth + 1
  579. msgRet.expend[0] = lenth
  580. Grid.makeItem(msgRet.expend[lenth], LOCK_COST_ITEN_ID, itemCnt)
  581. end
  582. msgRet.refreshCnt = 0
  583. if refreshConfig.rare == ItemDefine.ITEM_RARE_COLOR_5 then
  584. msgRet.refreshCnt = human.db.fuwenRefreshCnt.sh
  585. elseif refreshConfig.rare == ItemDefine.ITEM_RARE_COLOR_6 then
  586. msgRet.refreshCnt = human.db.fuwenRefreshCnt.cs
  587. end
  588. msgRet.needCnt = refreshConfig.luckRefresh or 0
  589. Msg.send(msgRet,human.fd)
  590. end
  591. -- 符文刷新
  592. function fuwenRefreshDo(human,fuwenID,fuwenIndex,heroID,heroIndex,pos)
  593. local refreshConfig = FuwenExcel.fuwen[fuwenID]
  594. if refreshConfig == nil then
  595. return Broadcast.sendErr(human,Lang.FUWEN_REFRESH_CONFIG_ERR) -- 传入参数非法
  596. end
  597. local fuwenGrid = nil
  598. if fuwenIndex == -1 then -- 刷英雄身上的
  599. local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
  600. if heroGrid == nil then
  601. return Broadcast.sendErr(human,Lang.FUWEN_HERO_GRID_ERR) -- 传入的英雄数据非法
  602. end
  603. if pos == nil then
  604. return Broadcast.sendErr(human,Lang.FUWEN_PUTOFF_ERR) -- 传入的参数非法
  605. end
  606. if heroGrid.fuwen == nil or heroGrid.fuwen[pos] == nil or heroGrid.fuwen[pos].id == nil then
  607. return Broadcast.sendErr(human,Lang.FUWEN_PUTOFF_ERR) -- 传入的参数非法
  608. end
  609. fuwenGrid = heroGrid.fuwen[pos]
  610. else -- 刷背包里的
  611. if human.db.fuwenBag == nil or human.db.fuwenBag[fuwenIndex] == nil then
  612. return Broadcast.sendErr(human,Lang.FUWEN_HECHENG_FILL_ERR) -- 材料不存在
  613. end
  614. fuwenGrid = human.db.fuwenBag[fuwenIndex]
  615. end
  616. if fuwenGrid == nil or fuwenGrid.id == nil then
  617. return
  618. end
  619. if fuwenGrid.id ~= nil and fuwenGrid.id ~= fuwenID then
  620. return Broadcast.sendErr(human,Lang.FUWEN_ID_ERR)
  621. end
  622. -- 幸运重铸判定
  623. local luckRefresh = 0
  624. local refreshCnt = 0
  625. human.db.fuwenRefreshCnt.cs = human.db.fuwenRefreshCnt.cs or 0
  626. human.db.fuwenRefreshCnt.sh = human.db.fuwenRefreshCnt.sh or 0
  627. if refreshConfig.rare == ItemDefine.ITEM_RARE_COLOR_5 then
  628. refreshCnt = human.db.fuwenRefreshCnt.sh or 0
  629. elseif refreshConfig.rare == ItemDefine.ITEM_RARE_COLOR_6 then
  630. refreshCnt = human.db.fuwenRefreshCnt.cs or 0
  631. end
  632. if refreshConfig.luckRefresh ~= nil and refreshConfig.luckRefresh ~= 0 and refreshCnt >= refreshConfig.luckRefresh then
  633. luckRefresh = 1
  634. end
  635. local jinghuaCnt = BagLogic.getItemCnt(human, ItemDefine.ITEM_FUWEN_JINGHUA)
  636. if human.db.jinbi < refreshConfig.expend[1][2] or jinghuaCnt < refreshConfig.expend[2][2] then
  637. return Broadcast.sendErr(human,Lang.FUWEN_REFRESH_FILL_ERR) -- 材料不够
  638. end
  639. local itemCnt = calcLockCost(fuwenGrid)
  640. if itemCnt > 0 then
  641. if BagLogic.getItemCnt(human, LOCK_COST_ITEN_ID) < itemCnt then
  642. return Broadcast.sendErr(human,Lang.FUWEN_REFRESH_FILL_ERR)
  643. end
  644. end
  645. if refreshConfig.rare == ItemDefine.ITEM_RARE_COLOR_5 then
  646. human.db.fuwenRefreshCnt.sh = human.db.fuwenRefreshCnt.sh + 1
  647. elseif refreshConfig.rare == ItemDefine.ITEM_RARE_COLOR_6 then
  648. human.db.fuwenRefreshCnt.cs = human.db.fuwenRefreshCnt.cs + 1
  649. end
  650. if human.db.fuwenRefreshCnt.cs > 15 then
  651. human.db.fuwenRefreshCnt.cs = 0
  652. end
  653. if human.db.fuwenRefreshCnt.sh > 25 then
  654. human.db.fuwenRefreshCnt.sh = 0
  655. end
  656. -- 扣消耗
  657. local fuwenGridTemp = Util.copyTable(fuwenGrid)
  658. ObjHuman.updateJinbi(human, -refreshConfig.expend[1][2], "fuwen_refresh")
  659. BagLogic.delItem(human, ItemDefine.ITEM_FUWEN_JINGHUA, refreshConfig.expend[2][2], "fuwen_refresh")
  660. if itemCnt > 0 then
  661. BagLogic.delItem(human, LOCK_COST_ITEN_ID, itemCnt, "fuwen_refresh")
  662. end
  663. Util.printTable(fuwenGridTemp.attr)
  664. -- 改属性
  665. FuwenGrid.genFuwenAttr(fuwenGridTemp,luckRefresh)
  666. fuwenGrid.attrTemp = fuwenGridTemp.attr or {}
  667. fuwenGrid.skillTemp = fuwenGridTemp.skill
  668. local msgRet = Msg.gc.GC_FUWEN_REFRESH_DO
  669. Grid.makeItem(msgRet.fuwen, fuwenGridTemp.id, 1, nil, fuwenGridTemp, fuwenIndex)
  670. Msg.send(msgRet,human.fd)
  671. fuwenRefreshQuery(human,fuwenID,fuwenIndex,pos,heroID,heroIndex)
  672. YunYingLogic.onCallBack(human, "onFuwenChongZhu",1)
  673. TriggerLogic.PublishEvent(TriggerDefine.FUWEN_RESET, human.db._id, 1)
  674. end
  675. -- 锁定/解锁符文的属性,技能
  676. function ResetLock(human, fuwenID,fuwenIndex,heroID,heroIndex,pos, opTarget, opIdx, opType)
  677. local refreshConfig = FuwenExcel.fuwen[fuwenID]
  678. if refreshConfig == nil then
  679. return Broadcast.sendErr(human,Lang.FUWEN_GRID_ERR) -- 传入参数非法
  680. end
  681. if refreshConfig.order < LOCK_FUWEN_COLOR_BASE then
  682. return Broadcast.sendErr(human,Lang.FUWEN_COLOR_ERR)
  683. end
  684. local fuwenGrid = nil
  685. if fuwenIndex == -1 then -- 刷英雄身上的
  686. local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
  687. if heroGrid == nil then
  688. return Broadcast.sendErr(human,Lang.FUWEN_HERO_GRID_ERR) -- 传入的英雄数据非法
  689. end
  690. if pos == nil then
  691. return Broadcast.sendErr(human,Lang.FUWEN_PUTOFF_ERR) -- 传入的参数非法
  692. end
  693. if heroGrid.fuwen == nil or heroGrid.fuwen[pos] == nil or heroGrid.fuwen[pos].id == nil then
  694. return Broadcast.sendErr(human,Lang.FUWEN_PUTOFF_ERR) -- 传入的参数非法
  695. end
  696. fuwenGrid = heroGrid.fuwen[pos]
  697. else -- 刷背包里的
  698. if human.db.fuwenBag == nil or human.db.fuwenBag[fuwenIndex] == nil then
  699. return Broadcast.sendErr(human,Lang.FUWEN_HECHENG_FILL_ERR) -- 材料不存在
  700. end
  701. fuwenGrid = human.db.fuwenBag[fuwenIndex]
  702. end
  703. if fuwenGrid == nil or fuwenGrid.id == nil then
  704. return Broadcast.sendErr(human,Lang.FUWEN_HECHENG_FILL_ERR)
  705. end
  706. if fuwenGrid.id ~= nil and fuwenGrid.id ~= fuwenID then
  707. return Broadcast.sendErr(human,Lang.FUWEN_ID_ERR)
  708. end
  709. if opType ~= 1 and opType ~= 0 then
  710. return Broadcast.sendErr(human,Lang.COMMON_ARGUMENT_ERROR)
  711. end
  712. -- 锁定数量判断
  713. if opType == 1 then
  714. local lockNum = getFuwenLockInfo(fuwenGrid)
  715. if lockNum >= LOCK_FUWEN_MAX_NUM then
  716. return Broadcast.sendErr(human,Lang.FUWEN_LOCK_MAX_ERR)
  717. end
  718. end
  719. -- 对属性进行锁定/解锁
  720. if opTarget == 1 then
  721. if not fuwenGrid.attr[opIdx] then
  722. return Broadcast.sendErr(human,Lang.FUWEN_ATTR_POS_ERR)
  723. end
  724. fuwenGrid.attr[opIdx][3] = opType
  725. elseif opTarget == 2 then -- 对技能进行锁定/解锁
  726. if not fuwenGrid.skill or not fuwenGrid.skill[opIdx] then
  727. return Broadcast.sendErr(human,Lang.FUWEN_SKILL_POS_ERR)
  728. end
  729. local skillId = fuwenGrid.skill[opIdx]
  730. fuwenGrid.skillLockList = fuwenGrid.skillLockList or {}
  731. if opType == 1 then
  732. fuwenGrid.skillLockList[skillId] = opIdx
  733. end
  734. if opType == 0 then
  735. fuwenGrid.skillLockList[skillId] = nil
  736. end
  737. else
  738. return Broadcast.sendErr(human,Lang.COMMON_ARGUMENT_ERROR)
  739. end
  740. fuwenRefreshQuery(human,fuwenID,fuwenIndex,pos,heroID,heroIndex)
  741. end
  742. local function cmpSkill(a, b)
  743. if a.sortID ~= b.sortID then
  744. return a.sortID < b.sortID
  745. end
  746. return a.skillID < b.skillID
  747. end
  748. local SORT_SKILL_LIST = nil
  749. function getSortSkillList()
  750. if not SORT_SKILL_LIST then
  751. SORT_SKILL_LIST = {}
  752. for skillID, config in pairs(FuwenExcel.skill) do
  753. config.skillID = skillID
  754. SORT_SKILL_LIST[#SORT_SKILL_LIST + 1] = config
  755. end
  756. if #SORT_SKILL_LIST > 1 then
  757. table.sort(SORT_SKILL_LIST, cmpSkill)
  758. end
  759. end
  760. return SORT_SKILL_LIST
  761. end
  762. -- 技能查询
  763. function fuwenRareSkillQuery(human, lv)
  764. local configs = getSortSkillList()
  765. local msgRet = Msg.gc.GC_FUWEN_RARE_SKILL_QUERY
  766. msgRet.type = lv
  767. local cnt = 0
  768. for _, config in ipairs(configs) do
  769. if config.lv == lv then
  770. cnt = cnt + 1
  771. Grid.makeFuwenSkill(msgRet.skillInfo[cnt], config.skillID)
  772. end
  773. end
  774. if cnt > 0 then
  775. msgRet.skillInfo[0] = cnt
  776. Msg.send(msgRet, human.fd)
  777. end
  778. end
  779. -- 计算属性
  780. local tbSkillGroupID = {}
  781. function doCalcHero(obj,attrs)
  782. Util.initTable(tbSkillGroupID)
  783. if obj.fuwen then
  784. for i = 1, 2 do
  785. local fuwenGrid = obj.fuwen[i]
  786. if fuwenGrid and fuwenGrid.id ~= nil then
  787. for k, v in ipairs(fuwenGrid.attr) do
  788. RoleAttr.updateValue(v[1], v[2], attrs)
  789. end
  790. local skillLen = fuwenGrid.skill and #fuwenGrid.skill or 0
  791. for j = 1, skillLen do
  792. local skillID = fuwenGrid.skill[j]
  793. local skillConfig = FuwenExcel.skill[skillID]
  794. local groupID = skillConfig.groupID
  795. if (tbSkillGroupID[groupID] or 0) < skillID then
  796. tbSkillGroupID[groupID] = skillID
  797. end
  798. end
  799. end
  800. end
  801. end
  802. -- 兵书技能
  803. if obj.bingshu then
  804. for i = 1, BingshuLogic.BINGSHU_MAXCNT do
  805. local bingshuGrid = obj.bingshu[i]
  806. if bingshuGrid then
  807. local skillID = bingshuGrid.skillID
  808. local skillConfig = FuwenExcel.skill[skillID]
  809. local groupID = skillConfig.groupID
  810. if (tbSkillGroupID[groupID] or 0) < skillID then
  811. tbSkillGroupID[groupID] = skillID
  812. end
  813. end
  814. end
  815. end
  816. -- 符文技能效果这里 如果有多个同类型的技能 效果不叠加 只取最高等级的那个技能的效果
  817. for groupID, skillIDTemp in pairs(tbSkillGroupID) do
  818. local skillConfig = FuwenExcel.skill[skillIDTemp]
  819. local cnt = #skillConfig.attrs
  820. if cnt > 0 then
  821. for k, v in ipairs(skillConfig.attrs) do
  822. RoleAttr.updateValue(v[1], v[2], attrs)
  823. end
  824. end
  825. end
  826. end
  827. -- 熔炼值查询
  828. function fuwenSmeltValQuery(human)
  829. local msgRet = Msg.gc.GC_FUWEN_SMELT_VAL_QUERY
  830. msgRet.accountSmeltVal = human.db.smeltVal or 0
  831. Msg.send(msgRet,human.fd)
  832. end
  833. -- 符文刷新保存
  834. function fuwenRefreshSave(human,fuwenID,fuwenIndex,pos,heroID,heroIndex)
  835. local fuwen = nil
  836. if fuwenIndex == -1 then
  837. local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
  838. if heroGrid == nil then
  839. return Broadcast.sendErr(human,Lang.FUWEN_HERO_GRID_ERR)
  840. end
  841. if heroGrid.fuwen == nil or heroGrid.fuwen[pos] == nil then
  842. return Broadcast.sendErr(human,Lang.FUWEN_PUTOFF_ERR)
  843. end
  844. fuwen = heroGrid.fuwen[pos]
  845. else
  846. fuwen = human.db.fuwenBag[fuwenIndex]
  847. end
  848. if fuwen == nil or fuwen.id == nil then
  849. return Broadcast.sendErr(human,Lang.FUWEN_HECHENG_FILL_ERR)
  850. end
  851. if fuwen.id ~= fuwenID then
  852. return Broadcast.sendErr(human,Lang.FUWEN_ID_ERR)
  853. end
  854. if fuwen.attrTemp ~= nil or fuwen.skillTemp ~= nil then
  855. if fuwen.attrTemp and next(fuwen.attrTemp) then
  856. fuwen.attr = fuwen.attrTemp
  857. fuwen.attrTemp = {}
  858. else
  859. --Log.write(Log.LOGID_DEBUG, human.db._id, human.db.account, human.db.name, human.db.lv, fuwen.id,"refreshsave attrTemp is empty")
  860. Log.write(Log.LOGID_DEBUG, human.db._id, human.db.newUniqueTag, human.db.name, human.db.lv, fuwen.id,"refreshsave attrTemp is empty")
  861. end
  862. if fuwen.skillTemp and next(fuwen.skillTemp) then
  863. fuwen.skill = fuwen.skillTemp
  864. fuwen.skillTemp = nil
  865. local skillLockList = fuwen.skillLockList
  866. if skillLockList and next(skillLockList) then
  867. -- local posList = {}
  868. -- for _,skillPos in pairs(skillLockList) do
  869. -- posList[skillPos] = 1
  870. -- end
  871. skillLockList = {}
  872. for skillPos, skillId in ipairs(fuwen.skill) do
  873. -- if posList[skillPos] then
  874. skillLockList[skillId] = skillPos
  875. -- end
  876. end
  877. fuwen.skillLockList = skillLockList
  878. end
  879. else
  880. --Log.write(Log.LOGID_DEBUG, human.db._id, human.db.account, human.db.name, human.db.lv, fuwen.id,"refreshsave skillTemp is empty")
  881. Log.write(Log.LOGID_DEBUG, human.db._id, human.db.newUniqueTag, human.db.name, human.db.lv, fuwen.id,"refreshsave skillTemp is empty")
  882. end
  883. end
  884. Broadcast.sendErr(human,Lang.FUWEN_SAVE_SUCCESS)
  885. if fuwenIndex == -1 then
  886. ObjHuman.doCalcHero(human,heroIndex)
  887. HeroLogic.sendHeroBagDynamic(human, heroID, heroIndex)
  888. HeroEquip.query(human, heroID, heroIndex)
  889. else
  890. sendFuwenItemChange(human, fuwenIndex, fuwen, FuwenDefine.FUWEN_BAG_OP_ADD)
  891. end
  892. fuwenRefreshQuery(human,fuwenID,fuwenIndex,pos,heroID,heroIndex)
  893. end
  894. -- 符文兑换查询
  895. function fuwenExchangeQuery(human)
  896. local msgRet = Msg.gc.GC_FUWEN_EXCHANGE_QUERY
  897. local gridTemp = FuwenGrid.create(FuwenDefine.FUWEN_EXCHANGE_ID)
  898. Grid.makeItem(msgRet.fuwen, gridTemp.id, 1, nil, gridTemp, 1)
  899. Msg.send(msgRet,human.fd)
  900. end
  901. -- 符文格子解锁
  902. function fuwenGridUnlock(human,heroID,heroIndex,pos)
  903. local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
  904. if heroGrid == nil then
  905. return
  906. end
  907. if heroGrid.fuwen ~= nil and heroGrid.fuwen[pos] ~= nil then
  908. return
  909. end
  910. if pos == 1 then
  911. if heroGrid.lv < 100 then
  912. else
  913. heroGrid.fuwen = heroGrid.fuwen or {}
  914. heroGrid.fuwen[1] = {}
  915. end
  916. elseif pos == 2 then
  917. if heroGrid.star < 7 then
  918. else
  919. heroGrid.fuwen = heroGrid.fuwen or {}
  920. heroGrid.fuwen[2] = {}
  921. end
  922. end
  923. end
  924. function wrapFuwenAttrNet(net,fuwenConf)
  925. local len = 0
  926. for _,attr in ipairs(fuwenConf.absAttrPool) do
  927. len = len + 1
  928. net.base_attrs[len].key = attr[1]
  929. net.base_attrs[len].value = attr[2]
  930. end
  931. net.base_attrs[0] = len
  932. local len2 = 0
  933. for _, attr in ipairs(fuwenConf.percentAttrPool) do
  934. len2 = len2 + 1
  935. net.percent_attrs[len2].key = attr[1]
  936. net.percent_attrs[len2].value = attr[2]
  937. end
  938. net.percent_attrs[0] = len2
  939. end
  940. -- 符文属性查询
  941. function CG_FUWEN_ATTR_QUERY(human,fuwenID)
  942. if fuwenID == nil then
  943. return Broadcast.sendErr(human,Lang.FUWEN_ITEMID_ERR)
  944. end
  945. local fuwenConfig = FuwenExcel.fuwen[fuwenID]
  946. if fuwenConfig == nil then
  947. return
  948. end
  949. local msgRet = Msg.gc.GC_FUWEN_ATTR_QUERY
  950. wrapFuwenAttrNet(msgRet,fuwenConfig)
  951. Msg.send(msgRet,human.fd)
  952. end
  953. -- 符文精炼预览
  954. function fuwenRefinePreview(human)
  955. local fuwenGrid = {}
  956. fuwenGrid = FuwenGrid.create(FuwenDefine.FUWEN_REFINE_ID)
  957. local msgRet = Msg.gc.GC_FUWEN_REFINE_PREVIEW_QUERY
  958. Grid.makeItem(msgRet.fuwen, fuwenGrid.id, 1, nil, fuwenGrid, 1)
  959. Msg.send(msgRet,human.fd)
  960. end
  961. -- 符文精炼查询
  962. function fuwenRefineQuery(human,fuwenID,fuwenIndex,pos,heroID,heroIndex)
  963. local fuwen = nil
  964. if fuwenIndex == -1 then
  965. local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
  966. if heroGrid == nil then
  967. return Broadcast.sendErr(human,Lang.FUWEN_HERO_GRID_ERR)
  968. end
  969. if heroGrid.fuwen == nil or heroGrid.fuwen[pos] == nil then
  970. return Broadcast.sendErr(human,Lang.FUWEN_PUTOFF_ERR)
  971. end
  972. fuwen = heroGrid.fuwen[pos]
  973. else
  974. fuwen = human.db.fuwenBag[fuwenIndex]
  975. end
  976. if fuwen == nil or fuwen.id == nil then
  977. return Broadcast.sendErr(human,Lang.FUWEN_HECHENG_FILL_ERR) -- 材料不存在
  978. end
  979. if fuwen.id ~= fuwenID then
  980. return Broadcast.sendErr(human,Lang.FUWEN_ID_ERR)
  981. end
  982. if FuwenExcel.fuwen[fuwen.id].refine ~= 1 then
  983. return
  984. end
  985. local jinglianExcel = FuwenExcel.jinglian
  986. local refine = fuwen.refine or 0
  987. local refineExcel = jinglianExcel[refine + 1]
  988. -- 构造预览符文
  989. local previewFuwen = Util.copyTable(fuwen)
  990. previewFuwen.refine = refine + 1
  991. if refine == 0 then
  992. -- 第1次精炼
  993. local newValue = previewFuwen.attr[1][2] * 2
  994. previewFuwen.attr[1][2] = newValue
  995. elseif refine == 1 then
  996. -- 第2次精炼
  997. local fuwenConfig = FuwenExcel.fuwen[fuwen.id]
  998. cnt = #fuwenConfig.percentAttrPool
  999. if cnt > 0 then
  1000. local randIndex = math.random(1, cnt)
  1001. local attrKey = fuwenConfig.percentAttrPool[randIndex][1]
  1002. local attrVal = fuwenConfig.percentAttrPool[randIndex][2]
  1003. previewFuwen.attr[3] = {attrKey, attrVal}
  1004. end
  1005. elseif refine == 2 then
  1006. -- 第3次精炼
  1007. local skillConfig = FuwenExcel.skill
  1008. local skillLen = #previewFuwen.skill
  1009. for i = 1,skillLen do
  1010. local skillID = previewFuwen.skill[i]
  1011. local skillLv = skillConfig[skillID].lv
  1012. if skillLv < 3 then
  1013. skillID = skillID + 1000
  1014. end
  1015. previewFuwen.skill[i] = skillID
  1016. end
  1017. previewFuwen.id = fuwen.id + 1
  1018. end
  1019. -- 发数据
  1020. local msgRet = Msg.gc.GC_FUWEN_REFINE_QUERY
  1021. Grid.makeItem(msgRet.fuwen,previewFuwen.id, 1, nil,previewFuwen, 1)
  1022. local expendLen = #refineExcel.expend
  1023. for i = 1,expendLen do
  1024. Grid.makeItem(msgRet.expend[i],refineExcel.expend[i][1],refineExcel.expend[i][2])
  1025. end
  1026. msgRet.expend[0] = expendLen
  1027. local jinglianLen = #jinglianExcel
  1028. for i = 1,jinglianLen do
  1029. msgRet.refineDesc[i].desc = jinglianExcel[i].desc
  1030. end
  1031. msgRet.refineDesc[0] = jinglianLen
  1032. Msg.send(msgRet,human.fd)
  1033. end
  1034. -- 符文精炼
  1035. function fuwenRefineDo(human,fuwenID,fuwenIndex,pos,heroID,heroIndex)
  1036. local fuwen = nil
  1037. if fuwenIndex == -1 then
  1038. local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
  1039. if heroGrid == nil then
  1040. return Broadcast.sendErr(human,Lang.FUWEN_HERO_GRID_ERR)
  1041. end
  1042. if heroGrid.fuwen == nil or heroGrid.fuwen[pos] == nil then
  1043. return Broadcast.sendErr(human,Lang.FUWEN_PUTOFF_ERR)
  1044. end
  1045. fuwen = heroGrid.fuwen[pos]
  1046. else
  1047. fuwen = human.db.fuwenBag[fuwenIndex]
  1048. end
  1049. if fuwen == nil or fuwen.id == nil then
  1050. return Broadcast.sendErr(human,Lang.FUWEN_HECHENG_FILL_ERR) -- 材料不存在
  1051. end
  1052. if fuwen.id ~= fuwenID then
  1053. return Broadcast.sendErr(human,Lang.FUWEN_ID_ERR)
  1054. end
  1055. if FuwenExcel.fuwen[fuwen.id].refine ~= 1 then
  1056. return
  1057. end
  1058. local newRefine = fuwen.refine or 0
  1059. newRefine = newRefine + 1
  1060. local jinglianExcel = FuwenExcel.jinglian
  1061. local refineExcel = jinglianExcel[newRefine]
  1062. local expendLen = #refineExcel.expend
  1063. for i = 1,expendLen do
  1064. local v = refineExcel.expend[i]
  1065. local haveCnt = BagLogic.getItemCnt(human,v[1])
  1066. if haveCnt < v[2] then
  1067. return Broadcast.sendErr(human,Lang.FUWEN_REFRESH_FILL_ERR) -- 材料不够
  1068. end
  1069. end
  1070. --删除材料
  1071. for i = 1,expendLen do
  1072. local v = refineExcel.expend[i]
  1073. BagLogic.delItem(human, v[1], v[2], "fuwen_refine")
  1074. end
  1075. if newRefine == 1 then
  1076. -- 第1次精炼
  1077. fuwen.refine = newRefine
  1078. local newValue = fuwen.attr[1][2] * 2
  1079. fuwen.attr[1][2] = newValue
  1080. elseif newRefine == 2 then
  1081. -- 第2次精炼
  1082. fuwen.refine = newRefine
  1083. local fuwenConfig = FuwenExcel.fuwen[fuwen.id]
  1084. cnt = #fuwenConfig.percentAttrPool
  1085. if cnt > 0 then
  1086. local randIndex = math.random(1, cnt)
  1087. local attrKey = fuwenConfig.percentAttrPool[randIndex][1]
  1088. local attrVal = fuwenConfig.percentAttrPool[randIndex][2]
  1089. fuwen.attr[3] = {attrKey, attrVal}
  1090. end
  1091. elseif newRefine == 3 then
  1092. -- 第3次精炼
  1093. fuwen.refine = newRefine
  1094. local skillConfig = FuwenExcel.skill
  1095. local skillLen = #fuwen.skill
  1096. for i = 1,skillLen do
  1097. local skillID = fuwen.skill[i]
  1098. local skillLv = skillConfig[skillID].lv
  1099. if skillLv < 4 then
  1100. skillID = skillID + 1000
  1101. end
  1102. fuwen.skill[i] = skillID
  1103. end
  1104. fuwen.id = fuwen.id + 1
  1105. fuwen.refine = 0
  1106. -- 变成神话特殊判断
  1107. local tConfig = FuwenExcel.fuwen[fuwen.id]
  1108. if tConfig and tConfig.order == 6 then
  1109. TriggerLogic.PublishEvent(TriggerDefine.FUWEN_GETQUALITY, human.db._id, tConfig.order, 1)
  1110. end
  1111. else
  1112. return
  1113. end
  1114. if fuwenIndex == -1 then
  1115. ObjHuman.doCalcHero(human,heroIndex)
  1116. HeroLogic.sendHeroBagDynamic(human, heroID, heroIndex)
  1117. HeroEquip.query(human, heroID, heroIndex)
  1118. else
  1119. sendFuwenItemChange(human, fuwenIndex, fuwen, FuwenDefine.FUWEN_BAG_OP_ADD)
  1120. end
  1121. local msgRet = Msg.gc.GC_FUWEN_REFINE_DO
  1122. Grid.makeItem(msgRet.fuwen,fuwen.id, 1,nil, fuwen, 1)
  1123. Msg.send(msgRet,human.fd)
  1124. end
  1125. -- 是否有符文红点
  1126. function isFuwenDot(human, heroGrid)
  1127. if not heroGrid then return end
  1128. local heroConfig = HeroExcel[heroGrid.id]
  1129. if not heroConfig then return end
  1130. if human.db.lv < 9 then
  1131. return false
  1132. end
  1133. local haveFuwen = nil
  1134. local emptyCnt = FuwenGrid.getEmptyCnt(human)
  1135. if emptyCnt < FuwenDefine.FUWEN_BAG_MAX_CNT then
  1136. haveFuwen = true
  1137. end
  1138. for pos = 1, 2 do
  1139. local fuwenGrid = heroGrid.fuwen and heroGrid.fuwen[pos]
  1140. if fuwenGrid ~= nil and fuwenGrid.id == nil and haveFuwen then
  1141. return true
  1142. end
  1143. end
  1144. end
  1145. -- 是否有装备红点
  1146. function isFuwenDotByPos(human, heroGrid, pos)
  1147. if not heroGrid then return end
  1148. local heroConfig = HeroExcel[heroGrid.id]
  1149. if not heroConfig then return end
  1150. local haveFuwen = nil
  1151. local emptyCnt = FuwenGrid.getEmptyCnt(human)
  1152. if emptyCnt < FuwenDefine.FUWEN_BAG_MAX_CNT then
  1153. haveFuwen = true
  1154. end
  1155. local fuwenGrid = heroGrid.fuwen and heroGrid.fuwen[pos]
  1156. if fuwenGrid ~= nil and fuwenGrid.id == nil and haveFuwen then
  1157. return true
  1158. end
  1159. end
  1160. function sendFuwenGetWay(human)
  1161. local msgRet = Msg.gc.GC_FUWEN_GET_WAY_QUERY
  1162. local fuwenGrid = FuwenGrid.create(80001)
  1163. local hechengConfig = FuwenExcel.hechengRule[80001]
  1164. Grid.makeItem(msgRet.newFuwen, 80001, 1, nil, fuwenGrid, 1)
  1165. msgRet.desc1 = hechengConfig.desc1
  1166. msgRet.desc2 = hechengConfig.desc2
  1167. Msg.send(msgRet,human.fd)
  1168. end
  1169. function fuwenHechengOneClickDo(human, tFuwenIndex)
  1170. -- 没买卡
  1171. if 0 == Abs365CardLogic.IsBuyCard(human) then
  1172. return
  1173. end
  1174. -- 等级不够
  1175. if human.db.lv < 30 then
  1176. return
  1177. end
  1178. local nAllLen = tFuwenIndex[0]
  1179. if nAllLen < 2 or nAllLen % 5 ~= 0 then
  1180. return Broadcast.sendErr(human,Lang.FUWEN_HECHENG_CNR_ERR)
  1181. end
  1182. local tFuWenList, tCheckIndex = {}, {}
  1183. local tFuWenGroup, nCheckFuWenID = {}, nil
  1184. local nLen, nAllUseJinBi = 0, 0
  1185. -- 检查一下是否有重复
  1186. for i = 1, nAllLen, 1 do
  1187. nLen = nLen + 1
  1188. local nIndex = tFuwenIndex[i]
  1189. if tCheckIndex[nIndex] then
  1190. print("[fuwenHechengOneClickDo] 存在重复的 nIndex = "..nIndex)
  1191. return
  1192. end
  1193. -- 背包中没有该符文
  1194. if human.db.fuwenBag[nIndex] == nil then
  1195. return Broadcast.sendErr(human,Lang.FUWEN_HECHENG_FILL_ERR)
  1196. end
  1197. -- 校验材料是否相同
  1198. local fuwenGrid = human.db.fuwenBag[nIndex]
  1199. if nCheckFuWenID == nil then
  1200. nCheckFuWenID = fuwenGrid.id
  1201. else
  1202. if nCheckFuWenID ~= fuwenGrid.id then
  1203. return Broadcast.sendErr(human,Lang.FUWEN_ID_ERR)
  1204. end
  1205. end
  1206. tCheckIndex[nIndex] = true
  1207. table.insert(tFuWenGroup, nIndex)
  1208. if nLen == 5 then
  1209. -- 一组完成,检查一下对应的配置
  1210. local tHeChengConfig = FuwenExcel.hechengRule[nCheckFuWenID]
  1211. if not tHeChengConfig then
  1212. return Broadcast.sendErr(human,Lang.FUWEN_HECHENG_CONFIG_ERR)
  1213. end
  1214. -- 校验是否达到合成限制等级
  1215. if tHeChengConfig.limit > human.db.lv then
  1216. return Broadcast.sendErr(human,Util.format(Lang.ROLE_LV_TOO_LOW, tHeChengConfig.limit))
  1217. end
  1218. nAllUseJinBi = nAllUseJinBi + tHeChengConfig.hechengCost[nLen - 1]
  1219. table.insert(tFuWenList, tFuWenGroup)
  1220. nLen = 0
  1221. tFuWenGroup = {}
  1222. nCheckFuWenID = nil
  1223. print("[fuwenHechengOneClickDo] 插入数据一次")
  1224. end
  1225. end
  1226. if human.db.jinbi < nAllUseJinBi then
  1227. return Broadcast.sendErr(human,Lang.COMMON_NO_JINBI)
  1228. end
  1229. ObjHuman.updateJinbi(human, -nAllUseJinBi, "fuwen_hecheng")
  1230. table.print_lua_table(tFuWenList)
  1231. print("[fuwenHechengOneClickDo] 打印符文数据完成")
  1232. -- 开始进行合成操作
  1233. --local fenjieList, nAllSmeltVal, nAllfenjieJinghua_cnt = {}, 0, 0
  1234. local tMsgData = Msg.gc.GC_FUWEN_HECHENG_ONECLICK
  1235. tMsgData.tSuccess[0] = 0
  1236. for i, v in ipairs(tFuWenList) do
  1237. local nIndex, nIndexLen = v[1], #v
  1238. local fuwenGrid = human.db.fuwenBag[nIndex]
  1239. local nFuWenID = fuwenGrid.id
  1240. local hechengConfig = FuwenExcel.hechengRule[nFuWenID]
  1241. if hechengConfig then
  1242. local nNewFuWenID = hechengConfig.newFuwenID
  1243. local rate = hechengConfig.hechengRate[nIndexLen - 1]
  1244. local randomNum = math.random(1,100)
  1245. for j = 1,nIndexLen do
  1246. local index = v[j]
  1247. del(human, index, "fuwen_hecheng")
  1248. end
  1249. tMsgData.tSuccess[0] = tMsgData.tSuccess[0] + 1
  1250. local msgRet = tMsgData.tSuccess[tMsgData.tSuccess[0]]
  1251. local newFuwenGrid = FuwenGrid.create(nNewFuWenID)
  1252. local newIndex = addByGrid(human, newFuwenGrid, "fuwen_hecheng")
  1253. Grid.makeItem(msgRet, newFuwenGrid.id, 1, nil, newFuwenGrid, newIndex,0)
  1254. local tConfig = FuwenExcel.fuwen[nNewFuWenID]
  1255. if tConfig then
  1256. TriggerLogic.PublishEvent(TriggerDefine.FUWEN_GETQUALITY, human.db._id, tConfig.order, 1)
  1257. end
  1258. end
  1259. end
  1260. print("[fuwenHechengOneClickDo] 发送数据的长度为 "..tMsgData.tSuccess[0])
  1261. Msg.send(tMsgData, human.fd)
  1262. print("[fuwenHechengOneClickDo]发送符文数据结束")
  1263. -- 符文合成回调
  1264. ChengjiuLogic.onCallback(human,ChengjiuDefine.CJ_TASK_TYPE_22, #tFuWenList)
  1265. HeroGrowUp.onCallback(human, HeroGrowUp.TASKTYPE8, #tFuWenList)
  1266. YunYingLogic.onCallBack(human, "onFuwenHecheng", #tFuWenList)
  1267. TriggerLogic.PublishEvent(TriggerDefine.FUWEN_HECHENG, human.db._id, #tFuWenList)
  1268. end