HeroSkinLogic.lua 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342
  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. local function populateMsg2(human, net, id)
  81. local cfg = HeroSkinExcel[id]
  82. local skinId = cfg.content[1]
  83. local skinCfg = SkinExcel[skinId]
  84. net.id = id
  85. BuyLogic.fontBuyItem(human, net.buyItem, cfg.buyId)
  86. net.skinData.Id = skinId
  87. net.skinData.attrs[0] = #skinCfg.attrs
  88. for i, v in ipairs(skinCfg.attrs) do
  89. net.skinData.attrs[i].key = v[1]
  90. net.skinData.attrs[i].value = v[2]
  91. end
  92. local iconframeId = cfg.content[2]
  93. local iconframeCfg = HeadFrameExcel[iconframeId]
  94. net.Iconframe.id = iconframeId
  95. net.Iconframe.desc = iconframeCfg.desc or ""
  96. net.Iconframe.keepTime = iconframeCfg.keepTime or 0
  97. net.Iconframe.name = iconframeCfg.name or ""
  98. net.Iconframe.camp = iconframeCfg.camp or 0
  99. net.Iconframe.attrs[0] = #iconframeCfg.attrs
  100. for i, v in ipairs(iconframeCfg.attrs) do
  101. net.Iconframe.attrs[i].key = v[1]
  102. net.Iconframe.attrs[i].value = v[2]
  103. end
  104. end
  105. -----------------------------------------
  106. -- 检查玩家是否已拥有指定皮肤
  107. local function hasSkin(human, skinId)
  108. if not human.db.skinBag then
  109. return false
  110. end
  111. for i = 1, #human.db.skinBag do
  112. local skin = human.db.skinBag[i]
  113. if skin and skin.id == skinId then
  114. return true
  115. end
  116. end
  117. return false
  118. end
  119. function query(human,panelId)
  120. local retLen = 0
  121. local ret = {}
  122. for id,cfg in pairs(HeroSkinExcel) do
  123. if cfg.panelId == panelId then
  124. -- 检查玩家是否已拥有该皮肤,如果已拥有则跳过
  125. local skinId = cfg.content[1]
  126. if not hasSkin(human, skinId) then
  127. -- ret[#ret+1] = genSkinUnit(human,id)
  128. retLen = retLen + 1
  129. ret[retLen] = id
  130. end
  131. end
  132. end
  133. -- return {
  134. -- list = ret
  135. -- }
  136. local msgRet = Msg.gc.GC_SKIN_DATA_QUERY
  137. -- msgRet.ret = GC_SKIN_QUERY
  138. msgRet.ret = 1
  139. msgRet.isEnd = 0
  140. msgRet.skinData[0] = 0
  141. if retLen == 0 then
  142. msgRet.isEnd = 1
  143. return Msg.send(msgRet,human.fd)
  144. end
  145. local len, msgMaxLen = 0, 20
  146. for _, id in ipairs(ret) do
  147. len = len + 1
  148. populateMsg(human, msgRet.skinData[len], id)
  149. if len >= msgMaxLen then
  150. msgRet.skinData[0] = len
  151. retLen = retLen - len
  152. if retLen <= 0 then
  153. msgRet.isEnd = 1
  154. return Msg.send(msgRet,human.fd)
  155. end
  156. Msg.send(msgRet,human.fd)
  157. len = 0
  158. msgRet.ret = 0
  159. end
  160. end
  161. if len > 0 then
  162. msgRet.skinData[0] = len
  163. msgRet.isEnd = 1
  164. Msg.send(msgRet,human.fd)
  165. end
  166. end
  167. function buy(human,buyId)
  168. local skinCfg
  169. for _,cfg in pairs(HeroSkinExcel) do
  170. if cfg.buyId == buyId then
  171. skinCfg = cfg
  172. break
  173. end
  174. end
  175. assert(skinCfg,"invalid buyId")
  176. -- 解锁皮肤和头像
  177. SkinLogic.skinUnlock(human,skinCfg.content[1]) --BagLogic.addItemList(human,skinCfg.content,"skin_buy")
  178. RoleHeadLogic.active(human,RoleHeadLogic.HEAD_TYPE_2,skinCfg.content[2])
  179. --刷新
  180. -- local data=query(human,skinCfg.panelId)
  181. -- RefreshClient(human,GC_SKIN_QUERY,data)
  182. query(human,skinCfg.panelId)
  183. end
  184. function RefreshClient(human,type,data)
  185. local msgRet = Msg.gc.GC_ROLE_CHANGE_BASEINFO
  186. msgRet.ret = type
  187. msgRet.tip = Json.Encode(data)
  188. Msg.send(msgRet,human.fd)
  189. end
  190. function SendSkinInfoByMoney(human, nMoney, nItemID)
  191. if not human or 0 >= nMoney then
  192. return
  193. end
  194. -- local ret = {}
  195. -- for id,cfg in pairs(HeroSkinExcel) do
  196. -- local nBuyID = cfg.buyId
  197. -- local tBuyCfg = BuyExcel[nBuyID]
  198. -- if tBuyCfg then
  199. -- local region = human.region or "CN"
  200. -- local nTrueMoney = tBuyCfg[region]
  201. -- if nMoney == nTrueMoney then
  202. -- ret[#ret+1] = genSkinUnit(human,id)
  203. -- end
  204. -- end
  205. -- end
  206. -- local data = {
  207. -- list = ret
  208. -- }
  209. -- local msgRet = Msg.gc.GC_ITEM_SKIN_INFO
  210. -- msgRet.nItemID = nItemID
  211. -- msgRet.data = Json.Encode(data)
  212. -- Msg.send(msgRet,human.fd)
  213. local msgRet = Msg.gc.GC_ITEM_SKIN_INFO
  214. msgRet.nItemID = nItemID
  215. msgRet.data[0] = 0
  216. msgRet.isEnd = 0
  217. msgRet.isStart = 1
  218. local skinArr = {}
  219. for id,cfg in pairs(HeroSkinExcel) do
  220. local nBuyID = cfg.buyId
  221. local tBuyCfg = BuyExcel[nBuyID]
  222. if tBuyCfg then
  223. local region = human.region or "CN"
  224. local nTrueMoney = tBuyCfg[region]
  225. if nMoney == nTrueMoney then
  226. skinArr[#skinArr+1] = id
  227. end
  228. end
  229. end
  230. local skinNum = #skinArr
  231. local len, msgOneceLen = 0, 10
  232. for _, skinId in ipairs(skinArr) do
  233. len = len + 1
  234. msgRet.data[0] = len
  235. populateMsg2(human, msgRet.data[len], skinId)
  236. if len >= msgOneceLen then
  237. skinNum = skinNum - len
  238. if skinNum <= 0 then
  239. msgRet.isEnd = 1
  240. return Msg.send(msgRet,human.fd)
  241. end
  242. Msg.send(msgRet,human.fd)
  243. len = 0
  244. msgRet.isStart = 0
  245. end
  246. end
  247. if len > 0 then
  248. msgRet.isEnd = 1
  249. Msg.send(msgRet,human.fd)
  250. end
  251. end
  252. function BuySkinBySuiPian(human, nSkinID, nItemID)
  253. local skinCfg
  254. for _,cfg in pairs(HeroSkinExcel) do
  255. if cfg.content[1] == nSkinID then
  256. skinCfg = cfg
  257. break
  258. end
  259. end
  260. assert(skinCfg,"invalid buyId")
  261. SkinLogic.skinUnlock(human,skinCfg.content[1]) --BagLogic.addItemList(human,skinCfg.content,"skin_buy")
  262. RoleHeadLogic.active(human,RoleHeadLogic.HEAD_TYPE_2,skinCfg.content[2])
  263. --刷新
  264. -- local data=query(human,skinCfg.panelId)
  265. -- RefreshClient(human,GC_SKIN_QUERY,data)
  266. query(human,skinCfg.panelId)
  267. BagLogic.delItem(human, nItemID, 1, "item_use")
  268. end
  269. -- function GetRemainNum(human, nBuyID)
  270. -- local skinCfg = nil
  271. -- for _,cfg in pairs(HeroSkinExcel) do
  272. -- if cfg.buyId == nBuyID then
  273. -- skinCfg = cfg
  274. -- break
  275. -- end
  276. -- end
  277. -- if not skinCfg then
  278. -- return 0
  279. -- end
  280. -- if not human.db.skinBag then
  281. -- return 1
  282. -- end
  283. -- local isUnlock = false
  284. -- for i = 1,#human.db.skinBag do
  285. -- local skin = human.db.skinBag[i]
  286. -- if skin.id == skinCfg.content[1] then
  287. -- isUnlock =true
  288. -- break
  289. -- end
  290. -- end
  291. -- return (isUnlock == false) and 1 or 0
  292. -- end