KLUIFruitPanel.lua 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502
  1. ---@class KLUIFruitPanel:UIKmlLuaPanelBase
  2. ---@field view KLUIFruitPanelView
  3. ---@field FruitAttDataList table<number,cfg_fruit_column> @果实表信息
  4. ---@field FruitPointTextList table<number,UIKmlLuaControl> @果实类型文本
  5. ---@field allFruitDataList table<number,CommonProtos.Item>
  6. ---@field AttDataList table<number,{type:number,point:number}> @属性加点列表
  7. local KLUIFruitPanel = class(UIKmlLuaPanelBase)
  8. local this =KLUIFruitPanel
  9. ---创建时调用一次
  10. function this:Init()
  11. self.selectCalcData = nil
  12. self.FruitPointTextList = {}
  13. self.severAttList = {}
  14. ---一级属性
  15. self.firstAttTypeList = {}
  16. ---属性类型(百分比的)
  17. self.remarksAttTypeList = {}
  18. ---属性的名字
  19. self.AttNameStrList = {}
  20. ---所有次数的消耗信息
  21. self.consumeInfoList = {}
  22. local consumeCfg = string.split(SL:GetConfig("cfg_global",3002).value,'|')
  23. for i, v in ipairs(consumeCfg) do
  24. local strList = string.split(v,'#')
  25. self.consumeInfoList[tonumber(strList[1])] = {tonumber(strList[2]),tonumber(strList[3])}
  26. end
  27. ---背包里所有果实
  28. self.allFruitDataList = {}
  29. self.allFruitItemList = {}
  30. ---果实点数上限
  31. self.maxNum = InfoManager.fruitInfo.fruitMaxNum
  32. ---重置次数
  33. self.ResetNum = 1
  34. ---货币id
  35. self.coinID = 0
  36. ---货币数量
  37. self.coinCount = 0
  38. ---货币是否足够
  39. self.isCoinEnough = true
  40. ---分配点数
  41. self.distributionPoint = 0
  42. ---果实属性信息
  43. self.FruitAttDataList = {}
  44. self.AttDataList = {}
  45. local fruitCfg = SL:GetConfigTable("cfg_fruit")
  46. ---@param v cfg_fruit_column
  47. for i, v in pairs(fruitCfg) do
  48. table.insert(self.FruitAttDataList,v)
  49. ---@type cfg_att_info_column
  50. local attCfg = SL:GetConfig("cfg_att_info",v.attribute)
  51. if attCfg.base == 1 then
  52. table.insert(self.firstAttTypeList,v.attribute)
  53. table.insert(self.AttDataList,{type=v.attribute,point=0})
  54. end
  55. if attCfg.remarks == 2 then
  56. table.insert(self.remarksAttTypeList,v.attribute)
  57. end
  58. self.AttNameStrList[v.attribute] = v.name
  59. end
  60. table.sort(self.AttDataList,function(a, b)
  61. return a.type < b.type
  62. end)
  63. GUI:DataListInitData(self.view.FruitAttDataList,function()
  64. return self:FruitAttDataListItemCountFunc()
  65. end,function(realIndex)
  66. return self:FruitAttDataListItemGetFunc(realIndex)
  67. end,function(realIndex, kmlcontrol)
  68. return self:FruitAttDataListItemInitFunc(realIndex, kmlcontrol)
  69. end, function(realIndex, kmlcontrol)
  70. return self:FruitAttDataListItemUpdateFunc(realIndex, kmlcontrol)
  71. end)
  72. GUI:DataListUpdateData(self.view.FruitAttDataList,_,function()
  73. self:SetAttText()
  74. end)
  75. GUI:DataListInitData(self.view.FruitDataList,function()
  76. return self:FruitDataListItemCountFunc()
  77. end,function(realIndex)
  78. return self:FruitDataListItemGetFunc(realIndex)
  79. end,function(realIndex, kmlcontrol)
  80. return self:FruitDataListItemInitFunc(realIndex, kmlcontrol)
  81. end, function(realIndex, kmlcontrol)
  82. return self:FruitDataListItemUpdateFunc(realIndex, kmlcontrol)
  83. end)
  84. GUI:DataListInitData(self.view.AttDataList,function()
  85. return self:AttDataListItemCountFunc()
  86. end,function(realIndex)
  87. return self:AttDataListItemGetFunc(realIndex)
  88. end,function(realIndex, kmlcontrol)
  89. return self:AttDataListItemInitFunc(realIndex, kmlcontrol)
  90. end, function(realIndex, kmlcontrol)
  91. return self:AttDataListItemUpdateFunc(realIndex, kmlcontrol)
  92. end)
  93. end
  94. ---创建或者刷新界面数据时调用
  95. function this:Refresh()
  96. SL:SendLuaNetMsg(LuaMessageIdToSever.GET_ALREADY_USE_POINTS)
  97. self:SetUsePointText()
  98. --self:SetAttText()
  99. self:GetBagAllFruit()
  100. end
  101. ---注册UI事件和服务器消息
  102. function this:RegistEvents()
  103. GUI:AddOnClickEvent(self.view.closeButton,self,self.CloseButton)
  104. GUI:AddOnClickEvent(self.view.ClickMask,self,self.CloseResetPanelButton)
  105. GUI:AddOnClickEvent(self.view.BtnReset,self,self.OpenResetPanelButton)
  106. GUI:AddOnClickEvent(self.view.HelpButton,self,self.OnClickShowHelp)
  107. GUI:AddOnClickEvent(self.view.ResetPanel_BtnReset,self,self.OnClickResetPanel_BtnReset)
  108. GUI:AddOnClickEvent(self.view.ResetPanel_BtnCancel,self,self.CloseResetPanelButton)
  109. SL:RegisterLUAEvent(LUA_EVENT_BAG_CHANGE_AFTER, self.BagInfo_Change, self)
  110. SL:RegisterLUAEvent(LUA_EVENT_MONEYCHANGE, self.CoinInfo_Change, self)
  111. SL:RegisterLuaNetMsg(LuaMessageIdToClient.C_USE_FRUIT_RESULT,self.C_USE_FRUIT_RESULT,self)
  112. SL:RegisterLuaNetMsg(LuaMessageIdToClient.C_RESET_FRUIT_COUNT,self.C_RESET_FRUIT_COUNT,self)
  113. SL:RegisterLuaNetMsg(LuaMessageIdToClient.USE_FRUIT_RESULT,self.USE_FRUIT_RESULT,self)
  114. end
  115. ---使用果实结果
  116. function this:USE_FRUIT_RESULT(_,message)
  117. --使用果实的效果
  118. --[[if message then
  119. GUI:Image_loadTexture(self.view.FeedBackImg, "fruit_success", "Atlas/UIFruitPanel.spriteatlas")
  120. else
  121. GUI:Image_loadTexture(self.view.FeedBackImg, "fruit_fail", "Atlas/UIFruitPanel.spriteatlas")
  122. end
  123. GUI:SetActive(self.view.FeedBackImg,true)
  124. GUI:setPosition(self.view.FeedBackImg,-112,0)
  125. SL:EffectDoMove(self.view.FeedBackImg.kmlControl.rectTransform,Vector2.New(646, 361),2, function()
  126. GUI:SetActive(self.view.FeedBackImg,false)
  127. end)--]]
  128. end
  129. function this:C_USE_FRUIT_RESULT(_,message)
  130. self.severAttList = {}
  131. if message then
  132. self.distributionPoint = message["totalFirstLevelAttrs"] and message["totalFirstLevelAttrs"] or 0
  133. if message["attrPoints"] then
  134. for i, v in pairs(message["attrPoints"]) do
  135. self.severAttList[tonumber(i)] = tonumber(v)
  136. end
  137. end
  138. end
  139. SL:SendLuaNetMsg(LuaMessageIdToSever.GET_RESET_FRUIT_COUNT)
  140. self:SetUsePointText()
  141. self:SetAttText()
  142. end
  143. function this:C_RESET_FRUIT_COUNT(_,message)
  144. if message then
  145. self.ResetNum = message + 1
  146. if GUI:getVisible(self.view.ResetPanel) then
  147. GUI:SetActive(self.view.ResetPanel,false)
  148. end
  149. end
  150. end
  151. ---@param eventData {index:number,item:CommonProtos.Item}[]
  152. function this:BagInfo_Change(eventId, eventData)
  153. if not eventData then
  154. return
  155. end
  156. self:RefreshFruitDataList(eventData)
  157. end
  158. function this:CoinInfo_Change(eventId, eventData)
  159. if not GUI:getVisible(self.view.ResetPanel) then
  160. return
  161. end
  162. self:CreatCoinItem()
  163. end
  164. function this:CloseButton()
  165. SL:onLUAEvent(LUA_EVENT_FRUIT_PANEL_CLOSE)
  166. end
  167. ---点击重置(重置界面中)
  168. function this:OnClickResetPanel_BtnReset()
  169. if not self.isCoinEnough then
  170. SL:TipMessage(SL:GetConfig('cfg_string',246).text,1,NoticeType.NoticeMid)--"道具不足,请补充道具",
  171. return
  172. end
  173. local reqData = {}
  174. local allPoint = 0
  175. for i, v in pairs(self.AttDataList) do
  176. allPoint = allPoint + v.point
  177. reqData[tostring(v.type)] = v.point
  178. end
  179. if self.distributionPoint > 0 and allPoint == self.distributionPoint then
  180. SL:SendLuaNetMsg(LuaMessageIdToSever.S_RESET_FRUIT,reqData)
  181. return
  182. end
  183. SL:TipMessage(SL:GetConfig('cfg_string',279).text,1,NoticeType.NoticeMid)--"请将所有点数分配完毕!",
  184. end
  185. ---关闭重置界面
  186. function this:CloseResetPanelButton()
  187. if self.selectCalcData then
  188. return
  189. end
  190. GUI:SetActive(self.view.ResetPanel,false)
  191. end
  192. ---打开重置界面
  193. function this:OpenResetPanelButton()
  194. self.selectCalcData = nil
  195. GUI:SetActive(self.view.IsOpenCalcUI,false)
  196. ---属性
  197. for i, v in pairs(self.AttDataList) do
  198. v.point = 0
  199. end
  200. GUI:DataListUpdateData(self.view.AttDataList)
  201. self:SetResetNumText()
  202. self:SetDistributionPointText()
  203. self:CreatCoinItem()
  204. if not GUI:getVisible(self.view.ResetPanel) then
  205. GUI:SetActive(self.view.ResetPanel,true)
  206. end
  207. end
  208. ---设置属性文本
  209. function this:SetAttText()
  210. for i, v in pairs(self.FruitPointTextList) do
  211. local value = (self.severAttList and self.severAttList[i]) and self.severAttList[i] or 0
  212. local otherStr = ""
  213. if table.contains(self.remarksAttTypeList,i) then
  214. if value > 0 then
  215. value = value * 100
  216. local t1,t2 = math.modf(value)
  217. if t2 <= 0 then
  218. value = t1
  219. end
  220. end
  221. otherStr = "%"
  222. end
  223. GUI:Text_setString(v,self.AttNameStrList[i].."+"..value..otherStr)
  224. end
  225. end
  226. ---生成货币模型和数量
  227. function this:CreatCoinItem()
  228. if self.consumeInfoList[self.ResetNum] then
  229. self.coinID = self.consumeInfoList[self.ResetNum][1]
  230. self.coinCount = self.consumeInfoList[self.ResetNum][2]
  231. else
  232. self.coinID = self.consumeInfoList[#self.consumeInfoList][1]
  233. self.coinCount = self.consumeInfoList[#self.consumeInfoList][2]
  234. end
  235. local data = {
  236. width = "30",
  237. height = "30",
  238. itemid = self.coinID,
  239. noclip = "1",
  240. z = -3001,
  241. mfixsize = "30,30",
  242. itemcount = nil,
  243. }
  244. if self.item then
  245. GUI:Item_UpdataData(self.item, data)
  246. else
  247. self.item = GUI:Item_Create(self.view.Model, data)
  248. end
  249. self.isCoinEnough = SL:GetBagItemCount(self.coinID) >= self.coinCount
  250. local color = self.isCoinEnough and "#1add1f" or "#ff2323"
  251. GUI:Text_setString(self.view.ConsumCount,"<color="..color..">"..tostring(self.coinCount).."</color>")
  252. end
  253. ---设置重置次数文本
  254. function this:SetResetNumText()
  255. GUI:Text_setString(self.view.ResetPanel_TextResetTimes,"第<color=#1add1f> "..self.ResetNum.." </color>次重置")
  256. end
  257. ---设置可分配点数文本
  258. function this:SetDistributionPointText()
  259. local allPoint = 0
  260. for i, v in pairs(self.AttDataList) do
  261. allPoint = allPoint + v.point
  262. end
  263. GUI:Text_setString(self.view.ResetPanel_TextPoint,"可分配点数 "..(self.distributionPoint - allPoint))
  264. end
  265. ---设置使用点数的文本
  266. function this:SetUsePointText()
  267. self.isCanUse = self.distributionPoint < self.maxNum
  268. GUI:Text_setString(self.view.TextPintInfo,"已用点数: "..self.distributionPoint.."/"..self.maxNum)
  269. end
  270. --------------------------------果实属性图标-------------------------------------------------------
  271. function this:FruitAttDataListItemCountFunc()
  272. return #self.FruitAttDataList
  273. end
  274. function this:FruitAttDataListItemGetFunc(realIndex)
  275. end
  276. function this:FruitAttDataListItemInitFunc(realIndex, kmlcontrol)
  277. end
  278. function this:FruitAttDataListItemUpdateFunc(realIndex, kmlcontrol)
  279. local data = self.FruitAttDataList[realIndex + 1]
  280. local _item = GUI:GetChildControl(self.view.FruitAttDataList,realIndex,'FruitAttItem')
  281. local _icon = GUI:GetChildControl(self.view.FruitAttDataList,realIndex,'FruitAttItem_Icon')
  282. local _text = GUI:GetChildControl(self.view.FruitAttDataList,realIndex,'FruitAttItem_Text')
  283. GUI:Image_loadTexture(_icon,data.icon or "","Atlas/UIFruitPanel.spriteatlas")
  284. GUI:setPosition(_item,tonumber(data.location[1]),tonumber(data.location[2]))
  285. self.FruitPointTextList[data.attribute] = _text
  286. end
  287. ------------------------------------------------------------------------------------------------
  288. --------------------------------背包里的果实-------------------------------------------------------
  289. function this:FruitDataListItemCountFunc()
  290. return #self.allFruitDataList
  291. end
  292. function this:FruitDataListItemGetFunc(realIndex)
  293. local index = realIndex + 1
  294. local data = {
  295. width = "70",
  296. height = "70",
  297. tips = "1",
  298. z = -3001,
  299. itemid = self.allFruitDataList[index].cfgId,
  300. itemcustomcount = self:GetFruitCountStr(self.allFruitDataList[index].count),
  301. }
  302. local item = GUI:Item_Create(self.view.FruitDataList, data)
  303. GUI:AddOnClickEvent(item, self, function()
  304. local cfgId = self.allFruitDataList[index].cfgId
  305. local isUse = self.isCanUse
  306. if not table.contains(self.firstAttTypeList,self.allFruitDataList[index].type) then
  307. isUse = true
  308. end
  309. if self.allFruitDataList[index].count > 0 and isUse then
  310. local item = SL:MeData_GetCfgBaseOnItemId(cfgId)
  311. SL:OpenTips("bag", cfgId,item.id,self.allFruitDataList[index].count >= 10 and 10 or self.allFruitDataList[index].count)
  312. else
  313. SL:CommonItemGetPath(nil,cfgId)
  314. end
  315. end)
  316. self.allFruitItemList[item] = item
  317. return item
  318. end
  319. function this:FruitDataListItemInitFunc(realIndex, kmlcontrol)
  320. end
  321. function this:FruitDataListItemUpdateFunc(realIndex, kmlcontrol)
  322. local data = self.allFruitDataList[realIndex + 1]
  323. local item = self.allFruitItemList[kmlcontrol]
  324. GUI:Item_UpdataData(item, {
  325. itemid = data.cfgId,
  326. itemcustomcount = self:GetFruitCountStr(data.count),
  327. })
  328. end
  329. ---获取果实数量的文本
  330. function this:GetFruitCountStr(count)
  331. local color = count > 0 and "#1add1f" or "#ff2323"
  332. if count >= 99 then
  333. count = 99
  334. end
  335. return "<color="..color..">"..count.."</color>"
  336. end
  337. ---获取背包里所有的果实
  338. function this:GetBagAllFruit()
  339. self.allFruitDataList = {}
  340. for i, v in pairs(self.FruitAttDataList) do
  341. table.insert(self.allFruitDataList,{cfgId = v.id,type = v.attribute,count = SL:GetBagItemCount(v.id)})
  342. end
  343. GUI:DataListUpdateData(self.view.FruitDataList)
  344. end
  345. ---刷新背包里所有的果实数量
  346. function this:RefreshFruitDataList()
  347. for i, v in pairs(self.allFruitDataList) do
  348. v.count = SL:GetBagItemCount(v.cfgId)
  349. end
  350. GUI:DataListUpdateData(self.view.FruitDataList)
  351. end
  352. ------------------------------------------------------------------------------------------------
  353. --------------------------------分配点数-------------------------------------------------------
  354. function this:AttDataListItemCountFunc()
  355. return #self.AttDataList
  356. end
  357. function this:AttDataListItemGetFunc(realIndex)
  358. end
  359. function this:AttDataListItemInitFunc(realIndex, kmlcontrol)
  360. end
  361. function this:AttDataListItemUpdateFunc(realIndex, kmlcontrol)
  362. local data = self.AttDataList[realIndex + 1]
  363. local _name = GUI:GetChildControl(self.view.AttDataList,realIndex,'AttItem_Name')
  364. local _btnMinus = GUI:GetChildControl(self.view.AttDataList,realIndex,'AttItem_BtnMinus')
  365. local _btnAdd = GUI:GetChildControl(self.view.AttDataList,realIndex,'AttItem_BtnAdd')
  366. local _text = GUI:GetChildControl(self.view.AttDataList,realIndex,'AttItem_Text')
  367. local _inputButton = GUI:GetChildControl(self.view.AttDataList,realIndex,'AttItem_InputButton')
  368. GUI:Text_setString(_name,self.AttNameStrList[data.type])
  369. self:SetInputText(_text,data.point)
  370. GUI:AddOnClickEvent(_btnMinus,self,self.OnClickMins,{data,_text})
  371. GUI:AddOnClickEvent(_btnAdd,self,self.OnClickAdd,{data,_text})
  372. GUI:AddOnClickEvent(_inputButton,self,self.OnClickShowCalcPanel,{data,_text})
  373. end
  374. function this:OnClickMins(_,eventData)
  375. if eventData[1].point > 0 then
  376. eventData[1].point = eventData[1].point - 1
  377. self:SetInputText(eventData[2],eventData[1].point)
  378. end
  379. self:SetDistributionPointText()
  380. end
  381. function this:OnClickAdd(_,eventData)
  382. local allPoint = 0
  383. for i, v in pairs(self.AttDataList) do
  384. allPoint = allPoint + v.point
  385. end
  386. if self.distributionPoint - allPoint > 0 then
  387. eventData[1].point = eventData[1].point + 1
  388. self:SetInputText(eventData[2],eventData[1].point)
  389. end
  390. self:SetDistributionPointText()
  391. end
  392. function this:OnClickShowCalcPanel(_,eventData)
  393. self.selectCalcData = eventData
  394. GUI:SetActive(self.view.IsOpenCalcUI,true)
  395. local allPoint = 0
  396. for i, v in pairs(self.AttDataList) do
  397. allPoint = allPoint + v.point
  398. end
  399. GUI:UIPanel_Open("dev/ui/Common/Panel/KLCalc/KLCalcPanel",nil,nil,
  400. {
  401. maxNum = self.distributionPoint - allPoint,
  402. ins = self,
  403. callback = self.CalcCallBack,
  404. intro = "增加点数"})
  405. end
  406. function this:CalcCallBack(addValue)
  407. if self.selectCalcData then
  408. self.selectCalcData[1].point = addValue
  409. self:SetInputText(self.selectCalcData[2],addValue)
  410. self.selectCalcData = nil
  411. GUI:SetActive(self.view.IsOpenCalcUI,false)
  412. self:SetDistributionPointText()
  413. end
  414. end
  415. ---@param control UIKmlLuaControl
  416. ---@param value string
  417. function this:SetInputText(control,value)
  418. GUI:Text_setString(control,tostring(value))
  419. end
  420. ------------------------------------------------------------------------------------------------
  421. function this:OnClickShowHelp()
  422. local helpCfg=SL:GetConfig("cfg_rule_text",11)
  423. if helpCfg then
  424. SL:CommonStrTipsMessage({title =helpCfg.menutxt,str=helpCfg.location})
  425. end
  426. end
  427. function this:Close()
  428. GUI:SetActive(self.view.FeedBackImg,false)
  429. end
  430. return this