HeroSkinLogic.lua 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  1. --- 英雄皮肤
  2. local Grid = require("bag.Grid")
  3. local BuyExcel = require("excel.buy").buy
  4. local BagLogic = require("bag.BagLogic")
  5. local HeroSkinExcel = require("excel.present").heroSkin
  6. local SkinExcel = require("excel.skin").skin
  7. local SkinLogic = require("skin.SkinLogic")
  8. local HeadFrameExcel = require("excel.role").headFrame
  9. local RoleHeadLogic = require("role.RoleHeadLogic")
  10. local Msg = require("core.Msg")
  11. local Json = require("common.Json")
  12. local BuyLogic = require("topup.BuyLogic")
  13. local GC_SKIN_QUERY = 54
  14. local function genSkinUnit(human,id)
  15. local cfg = HeroSkinExcel[id]
  16. local buyCfg = BuyExcel[cfg.buyId]
  17. local region = human.region or "CN"
  18. local buyItem = {}
  19. BuyLogic.fontBuyItem(human, buyItem, cfg.buyId)
  20. local skinId = cfg.content[1]
  21. local skinCfg = SkinExcel[skinId]
  22. local attrs = {}
  23. for _,v in pairs(skinCfg.attrs) do
  24. attrs[#attrs + 1] = {
  25. key = v[1],
  26. value = v[2],
  27. }
  28. end
  29. local iconframeId = cfg.content[2]
  30. local iconframeCfg = HeadFrameExcel[iconframeId]
  31. local headNet = {}
  32. headNet.id = iconframeId
  33. headNet.desc = iconframeCfg.desc or ""
  34. headNet.keepTime = iconframeCfg.keepTime
  35. headNet.name = iconframeCfg.name or ""
  36. headNet.camp = iconframeCfg.camp or 0
  37. local len = #iconframeCfg.attrs
  38. headNet.attrs = {}
  39. for i = 1,len do
  40. headNet.attrs[i] = {
  41. key = iconframeCfg.attrs[i][1],
  42. value = iconframeCfg.attrs[i][2],
  43. }
  44. end
  45. return {
  46. id = id,
  47. buyItem = buyItem,
  48. skinData = {
  49. Id = skinId,
  50. attrs = attrs
  51. },
  52. Iconframe = headNet
  53. }
  54. end
  55. local function populateMsg(human, net, id)
  56. local cfg = HeroSkinExcel[id]
  57. local skinId = cfg.content[1]
  58. local skinCfg = SkinExcel[skinId]
  59. local iconframeId = cfg.content[2]
  60. local iconframeCfg = HeadFrameExcel[iconframeId]
  61. net.id = id
  62. net.skinId = skinId
  63. net.headId = iconframeId
  64. net.headDesc = iconframeCfg.desc or ""
  65. net.headKeepTime = iconframeCfg.keepTime
  66. net.headName = iconframeCfg.name or ""
  67. net.headCamp = iconframeCfg.camp or 0
  68. BuyLogic.fontBuyItem(human, net.buyItem, cfg.buyId)
  69. net.skinAttr[0] = #skinCfg.attrs
  70. for i, attrInfo in ipairs(skinCfg.attrs) do
  71. net.skinAttr[i].key = attrInfo[1]
  72. net.skinAttr[i].value = attrInfo[2]
  73. end
  74. net.headAttr[0] = #iconframeCfg.attrs
  75. for i, attrInfo in ipairs(iconframeCfg.attrs) do
  76. net.headAttr[i].key = attrInfo[1]
  77. net.headAttr[i].value = attrInfo[2]
  78. end
  79. end
  80. -----------------------------------------
  81. -- 检查玩家是否已拥有指定皮肤
  82. local function hasSkin(human, skinId)
  83. if not human.db.skinBag then
  84. return false
  85. end
  86. for i = 1, #human.db.skinBag do
  87. local skin = human.db.skinBag[i]
  88. if skin and skin.id == skinId then
  89. return true
  90. end
  91. end
  92. return false
  93. end
  94. function query(human,panelId)
  95. local retLen = 0
  96. local ret = {}
  97. for id,cfg in pairs(HeroSkinExcel) do
  98. if cfg.panelId == panelId then
  99. -- 检查玩家是否已拥有该皮肤,如果已拥有则跳过
  100. local skinId = cfg.content[1]
  101. if not hasSkin(human, skinId) then
  102. -- ret[#ret+1] = genSkinUnit(human,id)
  103. retLen = retLen + 1
  104. ret[retLen] = id
  105. end
  106. end
  107. end
  108. -- return {
  109. -- list = ret
  110. -- }
  111. local msgRet = Msg.gc.GC_SKIN_DATA_QUERY
  112. -- msgRet.ret = GC_SKIN_QUERY
  113. msgRet.ret = 1
  114. msgRet.isEnd = 0
  115. msgRet.skinData[0] = 0
  116. if retLen == 0 then
  117. msgRet.isEnd = 1
  118. return Msg.send(msgRet,human.fd)
  119. end
  120. local len, msgMaxLen = 0, 20
  121. for _, id in ipairs(ret) do
  122. len = len + 1
  123. populateMsg(human, msgRet.skinData[len], id)
  124. if len >= msgMaxLen then
  125. msgRet.skinData[0] = len
  126. retLen = retLen - len
  127. if retLen <= 0 then
  128. msgRet.isEnd = 1
  129. return Msg.send(msgRet,human.fd)
  130. end
  131. Msg.send(msgRet,human.fd)
  132. len = 0
  133. msgRet.ret = 0
  134. end
  135. end
  136. if len > 0 then
  137. msgRet.skinData[0] = len
  138. msgRet.isEnd = 1
  139. Msg.send(msgRet,human.fd)
  140. end
  141. end
  142. function buy(human,buyId)
  143. local skinCfg
  144. for _,cfg in pairs(HeroSkinExcel) do
  145. if cfg.buyId == buyId then
  146. skinCfg = cfg
  147. break
  148. end
  149. end
  150. assert(skinCfg,"invalid buyId")
  151. -- 解锁皮肤和头像
  152. SkinLogic.skinUnlock(human,skinCfg.content[1]) --BagLogic.addItemList(human,skinCfg.content,"skin_buy")
  153. RoleHeadLogic.active(human,RoleHeadLogic.HEAD_TYPE_2,skinCfg.content[2])
  154. --刷新
  155. -- local data=query(human,skinCfg.panelId)
  156. -- RefreshClient(human,GC_SKIN_QUERY,data)
  157. query(human,skinCfg.panelId)
  158. end
  159. function RefreshClient(human,type,data)
  160. local msgRet = Msg.gc.GC_ROLE_CHANGE_BASEINFO
  161. msgRet.ret = type
  162. msgRet.tip = Json.Encode(data)
  163. Msg.send(msgRet,human.fd)
  164. end
  165. function SendSkinInfoByMoney(human, nMoney, nItemID)
  166. if not human or 0 >= nMoney then
  167. return
  168. end
  169. local ret = {}
  170. for id,cfg in pairs(HeroSkinExcel) do
  171. local nBuyID = cfg.buyId
  172. local tBuyCfg = BuyExcel[nBuyID]
  173. if tBuyCfg then
  174. local region = human.region or "CN"
  175. local nTrueMoney = tBuyCfg[region]
  176. if nMoney == nTrueMoney then
  177. ret[#ret+1] = genSkinUnit(human,id)
  178. end
  179. end
  180. end
  181. local data = {
  182. list = ret
  183. }
  184. local msgRet = Msg.gc.GC_ITEM_SKIN_INFO
  185. msgRet.nItemID = nItemID
  186. msgRet.data = Json.Encode(data)
  187. Msg.send(msgRet,human.fd)
  188. end
  189. function BuySkinBySuiPian(human, nSkinID, nItemID)
  190. local skinCfg
  191. for _,cfg in pairs(HeroSkinExcel) do
  192. if cfg.content[1] == nSkinID then
  193. skinCfg = cfg
  194. break
  195. end
  196. end
  197. assert(skinCfg,"invalid buyId")
  198. SkinLogic.skinUnlock(human,skinCfg.content[1]) --BagLogic.addItemList(human,skinCfg.content,"skin_buy")
  199. RoleHeadLogic.active(human,RoleHeadLogic.HEAD_TYPE_2,skinCfg.content[2])
  200. --刷新
  201. -- local data=query(human,skinCfg.panelId)
  202. -- RefreshClient(human,GC_SKIN_QUERY,data)
  203. query(human,skinCfg.panelId)
  204. BagLogic.delItem(human, nItemID, 1, "item_use")
  205. end
  206. -- function GetRemainNum(human, nBuyID)
  207. -- local skinCfg = nil
  208. -- for _,cfg in pairs(HeroSkinExcel) do
  209. -- if cfg.buyId == nBuyID then
  210. -- skinCfg = cfg
  211. -- break
  212. -- end
  213. -- end
  214. -- if not skinCfg then
  215. -- return 0
  216. -- end
  217. -- if not human.db.skinBag then
  218. -- return 1
  219. -- end
  220. -- local isUnlock = false
  221. -- for i = 1,#human.db.skinBag do
  222. -- local skin = human.db.skinBag[i]
  223. -- if skin.id == skinCfg.content[1] then
  224. -- isUnlock =true
  225. -- break
  226. -- end
  227. -- end
  228. -- return (isUnlock == false) and 1 or 0
  229. -- end