ElfLogic.lua 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633
  1. -- 精灵系统
  2. --db
  3. --[=[
  4. human.db.elfData = {
  5. [elfId1] = {
  6. level = 0,
  7. star = 0,
  8. },
  9. [elfId2] = {
  10. level = 0,
  11. star = 0,
  12. },
  13. }
  14. ]=]--
  15. local Msg = require("core.Msg")
  16. local Lang = require("common.Lang")
  17. local Broadcast = require("broadcast.Broadcast")
  18. local ElfConfig = require("excel.elf")
  19. local ItemConfig = require("excel.item").item
  20. local Grid = require("bag.Grid")
  21. local BagLogic = require("bag.BagLogic")
  22. local Skill = require("combat.Skill")
  23. local RoleAttr = require("role.RoleAttr")
  24. local RoleDefine = require("role.RoleDefine")
  25. local ObjHuman = require("core.ObjHuman")
  26. local RoleSystemLogic = require("roleSystem.RoleSystemLogic")
  27. local RoleSystemDefine = require("roleSystem.RoleSystemDefine")
  28. local HuanJingTowerLogic = require("huanjingTower.HuanjingTowerLogic")
  29. local TalismanLogic = require("talisman.TalismanLogic")
  30. local TriggerLogic = require("trigger.TriggerLogic")
  31. local TriggerDefine = require("trigger.TriggerDefine")
  32. local ChengjiuLogic = require("chengjiu.ChengjiuLogic")
  33. local GiftLogic
  34. local ELF_UPGRADELV_LOG_TAG = "elfUpGradeLv"
  35. local ELF_UPGRADESTAR_LOG_TAG = "elfUpGradeStar"
  36. local ELF_COND_TOWER_LEVEL = 600
  37. local ELF_2_CHENGJIU_TASKID = 406 -- 精灵系统对应的成就任务Id
  38. local function initElfData(human)
  39. human.db.elfData = {}
  40. end
  41. local function getElfData(human)
  42. return human.db.elfData
  43. end
  44. local function updateElfData(human, elfId, newLevel, newStar)
  45. local elfData = getElfData(human)
  46. if not elfData then
  47. initElfData(human)
  48. elfData = getElfData(human)
  49. end
  50. elfData[elfId] = elfData[elfId] or {level = 0, star = 0}
  51. if newLevel then
  52. elfData[elfId].level = newLevel
  53. end
  54. if newStar then
  55. elfData[elfId].star = newStar
  56. end
  57. end
  58. -- 获取来自秘宝的属性倍数加成
  59. local function getAttrMulFromTalisman(human)
  60. local attrMul = TalismanLogic.getTalismanAdd(human, TalismanLogic.OTHER_EFFECT_TBL.Elf_Attr_Mul)
  61. attrMul = attrMul / 100
  62. return attrMul
  63. end
  64. local function getNextStarCostCnt(nextStar)
  65. for _, starCfg in ipairs(ElfConfig.UpGradeStar) do
  66. if nextStar == starCfg.star then
  67. return starCfg.itemCnt
  68. end
  69. end
  70. return 0
  71. end
  72. local function generateCfgByQuality(targetQuality)
  73. local tbl = {}
  74. for id, cfg in ipairs(ElfConfig.Elf) do
  75. if cfg.elfQuality == targetQuality then
  76. tbl[id] = cfg
  77. end
  78. end
  79. if not next(tbl) then
  80. return nil
  81. end
  82. return tbl
  83. end
  84. local function getElfCfgById(targetElfId)
  85. for _, elfCfg in ipairs(ElfConfig.Elf) do
  86. if elfCfg.elfId == targetElfId then
  87. return elfCfg
  88. end
  89. end
  90. end
  91. -- 计算一共可以升多少级, 消耗多少道具
  92. local function calcUpGrade(nowLv, itemAllCnt, maxLv)
  93. local addLv, oldItemAllCnt, itemCostCnt = 0, itemAllCnt, 0
  94. while true do
  95. nowLv = nowLv + 1
  96. if nowLv > maxLv then
  97. break
  98. end
  99. itemCostCnt = nowLv * 3 + 2
  100. if itemAllCnt < itemCostCnt then
  101. break
  102. end
  103. addLv = addLv + 1
  104. itemAllCnt = itemAllCnt - itemCostCnt
  105. end
  106. local useItemCnt = oldItemAllCnt - itemAllCnt
  107. return addLv, useItemCnt
  108. end
  109. -- 计算当前所有精灵的总星级
  110. local function calcAllElfStar(elfDataList)
  111. local stars = 0
  112. for _, elfData in pairs(elfDataList) do
  113. stars = stars + elfData.star
  114. end
  115. return stars
  116. end
  117. -- 计算精灵当前等级加成属性之和
  118. local function calcLvAttr(elfLv, attrCfg)
  119. local nowAttrVal = 0
  120. for i=1, elfLv do
  121. nowAttrVal = nowAttrVal + attrCfg[1] * i + attrCfg[2]
  122. end
  123. return nowAttrVal
  124. end
  125. local function populateMsgSimpleData(net, elfCfg, itemCfg, elfData)
  126. if not net or not elfCfg or not itemCfg then
  127. return
  128. end
  129. local elfNowLv = elfData and elfData.level or 0
  130. local elfNowStar = elfData and elfData.star or 0
  131. net.elfId = elfCfg.elfId
  132. net.elfName = itemCfg.name
  133. net.elfIcon = itemCfg.icon
  134. net.elfLv = elfNowLv
  135. net.elfStar = elfNowStar
  136. net.elfQuality = elfCfg.elfQuality
  137. net.maxLv = elfCfg.elfMaxLv
  138. net.maxStar = elfCfg.elfMaxStar
  139. local upGradeLvItemId = elfCfg.upGradeLvItemId
  140. local upGradeLvItemCnt = elfNowLv >= elfCfg.elfMaxLv and 0 or (elfNowLv + 1) * 3 + 2
  141. Grid.makeItem(net.elfUpGradeLvCost, upGradeLvItemId, upGradeLvItemCnt)
  142. local upGradeStarItemId = elfCfg.upGradeStarItemId
  143. local upGradeStarItemCnt = elfNowStar >= elfCfg.elfMaxStar and 0 or getNextStarCostCnt(elfNowStar+1)
  144. Grid.makeItem(net.elfUpGradeStarCost, upGradeStarItemId, upGradeStarItemCnt)
  145. end
  146. local function populateMsgAttr(attrNet, attrCfg, attrId, elfLv, isMax, attrMul)
  147. local sumAttrVal = calcLvAttr(elfLv, attrCfg)
  148. attrNet.nowAttr.key = attrId
  149. attrNet.nowAttr.value = sumAttrVal * (1 + attrMul)
  150. attrNet.addAtrr.key = attrId
  151. attrNet.addAtrr.value = (attrCfg[1] * (elfLv + 1) + attrCfg[2]) * (1 + attrMul)
  152. if isMax then
  153. attrNet.addAtrr.value = 0
  154. end
  155. end
  156. local function populateMsgAttr2(attrNet, attrId, attrVal, elfStar, isMax, attrMul)
  157. attrMul = 1 + attrMul
  158. attrNet.nowAttr.key = attrId
  159. attrNet.nowAttr.value = attrVal * elfStar * attrMul
  160. attrNet.addAtrr.key = attrId
  161. attrNet.addAtrr.value = attrVal
  162. if isMax then
  163. attrNet.addAtrr.value = 0
  164. end
  165. end
  166. --是否开启本系统, 内部使用, 需要领取任务奖励后才解锁
  167. local function isOpen(human)
  168. -- local towerLevel = HuanJingTowerLogic.getTowerLevel(human)
  169. -- if towerLevel >= ELF_COND_TOWER_LEVEL then
  170. -- return true
  171. -- end
  172. -- return false
  173. local state = ChengjiuLogic.GetTaskState(human, ELF_2_CHENGJIU_TASKID)
  174. if state == 2 then
  175. return true
  176. end
  177. return false
  178. end
  179. -- 重算战力
  180. local function updatePower(human)
  181. RoleAttr.cleanHeroAttrCache(human)
  182. RoleAttr.doCalc(human)
  183. ObjHuman.sendAttr(human, RoleDefine.ZHANDOULI)
  184. end
  185. --红点判断
  186. local function dotJudgment(human, cfgHtbl)
  187. local elfData = getElfData(human)
  188. for _, cfg in pairs(cfgHtbl) do
  189. local nowLevel, nowStar = 0, 0
  190. if elfData and elfData[cfg.elfId] then
  191. nowLevel = elfData[cfg.elfId].level
  192. nowStar = elfData[cfg.elfId].star
  193. end
  194. if nowStar < cfg.elfMaxStar then
  195. local upGradeStarCostCnt = getNextStarCostCnt(nowStar+1)
  196. if BagLogic.getItemCnt(human, cfg.upGradeStarItemId) >= upGradeStarCostCnt then
  197. return true
  198. end
  199. end
  200. -- 需要精灵可激活或已激活
  201. if nowStar >= 1 and nowLevel < cfg.elfMaxLv then
  202. nowLevel = nowLevel + 1
  203. local costItemCnt = nowLevel * 3 + 2
  204. if BagLogic.getItemCnt(human, cfg.upGradeLvItemId) >= costItemCnt then
  205. return true
  206. end
  207. end
  208. end
  209. return false
  210. end
  211. -- 红点更新
  212. local function updateDot(human, targetQuality)
  213. local cfgHtbl = generateCfgByQuality(targetQuality)
  214. -- 该品质的所有精灵不能升星和升级了
  215. if not dotJudgment(human, cfgHtbl) then
  216. local dotID = 0
  217. if targetQuality == 1 then
  218. dotID = RoleSystemDefine.ROLE_SYS_ID_2032
  219. elseif targetQuality == 2 then
  220. dotID = RoleSystemDefine.ROLE_SYS_ID_2033
  221. elseif targetQuality == 3 then
  222. dotID = RoleSystemDefine.ROLE_SYS_ID_2034
  223. else
  224. dotID = RoleSystemDefine.ROLE_SYS_ID_2035
  225. end
  226. --刷新单页
  227. RoleSystemLogic.onDot(human, dotID)
  228. --刷新入口处
  229. RoleSystemLogic.onDot(human, RoleSystemDefine.ROLE_SYS_ID_2031)
  230. end
  231. end
  232. -- 外部调用,精灵加成
  233. function doCalcHero(human, addAttrs)
  234. if not human or not human.db then
  235. return
  236. end
  237. local elfData = getElfData(human)
  238. if not elfData then
  239. return
  240. end
  241. local attrMul = getAttrMulFromTalisman(human)
  242. attrMul = 1 + attrMul
  243. for elfId, singleElfData in pairs(elfData) do
  244. local elfCfg = getElfCfgById(elfId)
  245. if elfCfg then
  246. -- 等级加成
  247. if singleElfData.level > 0 then
  248. local atkVal = calcLvAttr(singleElfData.level, elfCfg.nAttack1)
  249. local hpVal = calcLvAttr(singleElfData.level, elfCfg.nLife1)
  250. RoleAttr.updateValue(RoleDefine.ATK, atkVal * attrMul, addAttrs)
  251. RoleAttr.updateValue(RoleDefine.HP, hpVal * attrMul, addAttrs)
  252. end
  253. -- 星级加成
  254. RoleAttr.updateValue(RoleDefine.ATK, elfCfg.nAttack2 * singleElfData.star * attrMul, addAttrs)
  255. RoleAttr.updateValue(RoleDefine.HP, elfCfg.nLife2 * singleElfData.star * attrMul, addAttrs)
  256. RoleAttr.updateValue(RoleDefine.DEF, elfCfg.nDefense2 * singleElfData.star * attrMul, addAttrs)
  257. RoleAttr.updateValue(RoleDefine.SPEED, elfCfg.nSpeed2 * singleElfData.star * attrMul, addAttrs)
  258. end
  259. end
  260. end
  261. -- 外部调用, 本系统是否开启
  262. function ModuleisOpen(human)
  263. -- return isOpen(human)
  264. local towerLevel = HuanJingTowerLogic.getTowerLevel(human)
  265. if towerLevel >= ELF_COND_TOWER_LEVEL then
  266. return true
  267. end
  268. return false
  269. end
  270. -- 外部调用, 是否有红点
  271. function isDot(human, dotConfig)
  272. if not isOpen(human) then
  273. return false
  274. end
  275. --入口处的红点判断
  276. if dotConfig.id == RoleSystemDefine.ROLE_SYS_ID_2031 then
  277. return dotJudgment(human, ElfConfig.Elf)
  278. else
  279. --单个分页的红点
  280. local elfQuality = 0
  281. if dotConfig.id == RoleSystemDefine.ROLE_SYS_ID_2032 then
  282. elfQuality = 1
  283. elseif dotConfig.id == RoleSystemDefine.ROLE_SYS_ID_2033 then
  284. elfQuality = 2
  285. elseif dotConfig.id == RoleSystemDefine.ROLE_SYS_ID_2034 then
  286. elfQuality = 3
  287. else
  288. elfQuality = 4
  289. end
  290. local cfgHtbl = generateCfgByQuality(elfQuality)
  291. if not cfgHtbl then
  292. return false
  293. end
  294. return dotJudgment(human, cfgHtbl)
  295. end
  296. end
  297. -- 外部调用,是否激活了精灵
  298. function IsActivateElf(human, elfId)
  299. if not isOpen(human) then
  300. return false
  301. end
  302. local elfData = getElfData(human)
  303. if not elfData or not elfData[elfId] then
  304. return false
  305. end
  306. return true
  307. end
  308. -- 外部调用,获取精灵当前技能
  309. function GetElfSkill(human, elfId)
  310. -- if not isOpen(human) then
  311. -- return
  312. -- end
  313. local elfData = getElfData(human)
  314. if not elfData or not elfData[elfId] then
  315. return
  316. end
  317. local elfNowStar = elfData[elfId].star
  318. local elfCfg = getElfCfgById(elfId)
  319. if not elfCfg then
  320. return
  321. end
  322. return elfCfg.skillArr[elfNowStar]
  323. end
  324. -- 请求某个品质的所有精灵的简单数据
  325. function Elf_SimpleData_Query(human, targetElfQuality)
  326. if not isOpen(human) then
  327. return Broadcast.sendErr(human, Lang.COMMOM_NOT_ENABLED)
  328. end
  329. local elfData = getElfData(human) or {}
  330. local msgRet = Msg.gc.GC_ELF_SIMPLEDATA_QUERY
  331. local elfArr = msgRet.elfArr
  332. elfArr[0] = 0
  333. local len = 0
  334. msgRet.allStars = calcAllElfStar(elfData)
  335. for _, elfCfg in ipairs(ElfConfig.Elf) do
  336. if elfCfg.elfQuality == targetElfQuality then
  337. local elfId = elfCfg.elfId
  338. local itemCfg = ItemConfig[elfId]
  339. if itemCfg then
  340. len = len + 1
  341. populateMsgSimpleData(elfArr[len], elfCfg, itemCfg, elfData[elfId])
  342. end
  343. end
  344. end
  345. elfArr[0] = len
  346. Msg.send(msgRet, human.fd)
  347. end
  348. -- 请求某个精灵的详细数据
  349. function Elf_SingleElf_Query(human, elfId)
  350. if not isOpen(human) then
  351. return Broadcast.sendErr(human, Lang.COMMOM_NOT_ENABLED)
  352. end
  353. local itemCfg = ItemConfig[elfId]
  354. local elfCfg = getElfCfgById(elfId)
  355. if not itemCfg or not elfCfg then
  356. return Broadcast.sendErr(human, Lang.COMMON_COMFIG_ERROR)
  357. end
  358. local elfData = getElfData(human) or {}
  359. local targetElfData = elfData[elfId]
  360. local msgRet = Msg.gc.GC_ELF_SINGLE_QUERY
  361. populateMsgSimpleData(msgRet.elfSimpleData, elfCfg, itemCfg, targetElfData)
  362. local elfNowLv = targetElfData and targetElfData.level or 0
  363. local elfNowStar = targetElfData and targetElfData.star or 0
  364. local isMaxLv, isMaxStar = false, false
  365. if elfNowLv >= elfCfg.elfMaxLv then
  366. isMaxLv = true
  367. end
  368. if elfNowStar >= elfCfg.elfMaxStar then
  369. isMaxStar = true
  370. end
  371. local elfSkillDataMsg = msgRet.elfSkillData
  372. elfSkillDataMsg.nowSkillDesc = ""
  373. local elfNowSkillId = elfCfg.skillArr[elfNowStar]
  374. local nowSkillCfg = Skill.GetSkillConfig(elfNowSkillId)
  375. if nowSkillCfg then
  376. elfSkillDataMsg.nowSkillDesc = nowSkillCfg.desc
  377. end
  378. elfSkillDataMsg.nextSkillDesc = ""
  379. local elfNextSkillId = isMaxStar and elfCfg.skillArr[#elfCfg.skillArr] or elfCfg.skillArr[elfNowStar+1]
  380. local nextSkillCfg = Skill.GetSkillConfig(elfNextSkillId)
  381. if nextSkillCfg then
  382. elfSkillDataMsg.nextSkillDesc = nextSkillCfg.desc
  383. end
  384. elfSkillDataMsg.maxSkillDesc = ""
  385. local elfMaxSkillId = elfCfg.skillArr[#elfCfg.skillArr]
  386. local maxSkillCfg = Skill.GetSkillConfig(elfMaxSkillId)
  387. if maxSkillCfg then
  388. elfSkillDataMsg.maxSkillDesc = maxSkillCfg.desc
  389. end
  390. local attrMul = getAttrMulFromTalisman(human)
  391. msgRet.elfLvAttrInfo[0] = 2
  392. populateMsgAttr(msgRet.elfLvAttrInfo[1], elfCfg.nAttack1, RoleDefine.ATK, elfNowLv, isMaxLv, attrMul)
  393. populateMsgAttr(msgRet.elfLvAttrInfo[2], elfCfg.nLife1, RoleDefine.HP, elfNowLv, isMaxLv, attrMul)
  394. msgRet.elfStarAttrInfo[0] = 4
  395. populateMsgAttr2(msgRet.elfStarAttrInfo[1], RoleDefine.HP, elfCfg.nLife2, elfNowStar, isMaxStar, attrMul)
  396. populateMsgAttr2(msgRet.elfStarAttrInfo[2], RoleDefine.ATK, elfCfg.nAttack2, elfNowStar, isMaxStar, attrMul)
  397. populateMsgAttr2(msgRet.elfStarAttrInfo[3], RoleDefine.DEF, elfCfg.nDefense2, elfNowStar, isMaxStar, attrMul)
  398. populateMsgAttr2(msgRet.elfStarAttrInfo[4], RoleDefine.SPEED, elfCfg.nSpeed2, elfNowStar, isMaxStar, attrMul)
  399. Msg.send(msgRet, human.fd)
  400. end
  401. -- 精灵升级
  402. function Elf_UpGradeLv(human, elfId, opType)
  403. if not isOpen(human) then
  404. return Broadcast.sendErr(human, Lang.COMMOM_NOT_ENABLED)
  405. end
  406. local elfCfg = getElfCfgById(elfId)
  407. if not elfCfg then
  408. return Broadcast.sendErr(human, Lang.COMMON_COMFIG_ERROR)
  409. end
  410. local elfData = getElfData(human) or {}
  411. if not elfData[elfId] then
  412. return Broadcast.sendErr(human, Lang.ELF_NOT_ACTIVATE)
  413. end
  414. local elfNowLv = elfData[elfId].level or 0
  415. if elfNowLv >= elfCfg.elfMaxLv then
  416. return Broadcast.sendErr(human, Lang.COMMON_MAXLEVEL)
  417. end
  418. local upGradeLvItemId = elfCfg.upGradeLvItemId
  419. local upGradeLvItemCnt = 0
  420. local itemAllCnt = BagLogic.getItemCnt(human, upGradeLvItemId)
  421. if itemAllCnt <= 0 then
  422. return Broadcast.sendErr(human, Lang.COMMON_ITEM_NOT_ENOUGH)
  423. end
  424. -- if BagLogic.getItemCnt(human, upGradeLvItemId) < upGradeLvItemCnt then
  425. -- return Broadcast.sendErr(human, Lang.COMMON_ITEM_NOT_ENOUGH)
  426. -- end
  427. local addLv = 0
  428. if opType == 1 then
  429. addLv = 1
  430. upGradeLvItemCnt = (elfNowLv + 1) * 3 + 2
  431. elseif opType == 2 then
  432. addLv, upGradeLvItemCnt = calcUpGrade(elfNowLv, itemAllCnt, elfCfg.elfMaxLv)
  433. else
  434. return Broadcast.sendErr(human, Lang.COMMON_ARGUMENT_ERROR)
  435. end
  436. if addLv == 0 or BagLogic.getItemCnt(human, upGradeLvItemId) < upGradeLvItemCnt then
  437. return Broadcast.sendErr(human, Lang.COMMON_ITEM_NOT_ENOUGH)
  438. end
  439. BagLogic.delItem(human, upGradeLvItemId, upGradeLvItemCnt, ELF_UPGRADELV_LOG_TAG)
  440. updateElfData(human, elfId, elfNowLv+addLv)
  441. Elf_SingleElf_Query(human, elfId)
  442. updatePower(human)
  443. -- 红点刷新
  444. updateDot(human, elfCfg.elfQuality)
  445. end
  446. -- 精灵升星
  447. function Elf_UpGradeStar(human, elfId)
  448. if not isOpen(human) then
  449. return Broadcast.sendErr(human, Lang.COMMOM_NOT_ENABLED)
  450. end
  451. local elfCfg = getElfCfgById(elfId)
  452. if not elfCfg then
  453. return Broadcast.sendErr(human, Lang.COMMON_COMFIG_ERROR)
  454. end
  455. local elfData = getElfData(human) or {}
  456. local elfNowStar = elfData[elfId] and elfData[elfId].star or 0
  457. if elfNowStar >= elfCfg.elfMaxStar then
  458. return Broadcast.sendErr(human, Lang.COMMON_MAXLEVEL)
  459. end
  460. local nextStar = elfNowStar+1
  461. local upGradeStarItemId = elfCfg.upGradeStarItemId
  462. local upGradeStarItemCnt = getNextStarCostCnt(nextStar)
  463. if upGradeStarItemCnt == 0 then
  464. return Broadcast.sendErr(human, Lang.ELF_MAX_STAR)
  465. end
  466. if BagLogic.getItemCnt(human, upGradeStarItemId) < upGradeStarItemCnt then
  467. return Broadcast.sendErr(human, Lang.COMMON_ITEM_NOT_ENOUGH)
  468. end
  469. BagLogic.delItem(human, upGradeStarItemId, upGradeStarItemCnt, ELF_UPGRADESTAR_LOG_TAG)
  470. updateElfData(human, elfId, nil, nextStar)
  471. Elf_SingleElf_Query(human, elfId)
  472. updatePower(human)
  473. -- 红点刷新
  474. updateDot(human, elfCfg.elfQuality)
  475. local nAllStar = calcAllElfStar(elfData)
  476. TriggerLogic.PublishEvent(TriggerDefine.EVENT_TYPE_JINGLING_STAR, human.db._id, 1)
  477. GiftLogic = GiftLogic or require("topup.GiftLogic")
  478. GiftLogic.trigger(human, GiftLogic.GIFT_ELF_UPGRADE_STAR, {currentVal = nAllStar}, GiftLogic.GIFT_SEC_TYPE3)
  479. end
  480. -- 布阵界面, 请求精灵数据
  481. function Elf_GetElfData_FromPosPage(human, targetElfQuality)
  482. local msgRet = Msg.gc.GC_ELF_POS_QUERY
  483. local elfArr = msgRet.elfArr
  484. elfArr[0] = 0
  485. local len = 0
  486. local elfData = getElfData(human) or {}
  487. for _, elfCfg in ipairs(ElfConfig.Elf) do
  488. if elfCfg.elfQuality == targetElfQuality then
  489. local elfId = elfCfg.elfId
  490. local itemCfg = ItemConfig[elfId]
  491. if itemCfg then
  492. len = len + 1
  493. local elfNowLv = elfData and elfData.level or 0
  494. local elfNowStar = elfData[elfId] and elfData[elfId].star or 0
  495. elfArr[len].elfId = elfId
  496. elfArr[len].elfName = itemCfg.name
  497. elfArr[len].elfIcon = itemCfg.icon
  498. elfArr[len].elfLv = elfNowLv
  499. elfArr[len].elfStar = elfNowStar
  500. elfArr[len].elfQuality = targetElfQuality
  501. elfArr[len].nowSkillDesc = ""
  502. elfArr[len].nowSkillIcon = ""
  503. local elfNowSkillId = elfCfg.skillArr[elfNowStar]
  504. local nowSkillCfg = Skill.GetSkillConfig(elfNowSkillId)
  505. if nowSkillCfg then
  506. elfArr[len].nowSkillDesc = nowSkillCfg.desc
  507. elfArr[len].nowSkillIcon = nowSkillCfg.icon
  508. end
  509. end
  510. end
  511. end
  512. elfArr[0] = len
  513. Msg.send(msgRet, human.fd)
  514. end