KLUISynthesisPanel.lua 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996
  1. ---@class KLUISynthesisPanel:UIKmlLuaPanelBase
  2. ---@field view KLUISynthesisPanelView
  3. ---@field needConsumeDataList table<number,{cfgId:number,count:number,SpecialIdList:table<number,number>}>
  4. ---@field specialDataList table<number,CommonProtos.Item>
  5. ---@field selectSpecialDataList table<number,CommonProtos.Item>
  6. ---@field nowCfg cfg_synthesis_column
  7. local KLUISynthesisPanel = class(UIKmlLuaPanelBase)
  8. local this =KLUISynthesisPanel
  9. ---创建时调用一次
  10. function this:Init()
  11. ---选中的Type
  12. self.selectType = 0
  13. ---选中的SubType
  14. self.selectSubType = -1
  15. ---选中的SubTypeID
  16. self.selectSubTypeID = 0
  17. ---选中的cfgId
  18. self.selectCfgId = 0
  19. ---选中的特殊item
  20. self.selectData = nil
  21. ---需要的材料
  22. self.needConsumeDataList = {}
  23. ---特殊材料
  24. self.specialDataList = {}
  25. ---选中的特殊材料
  26. self.selectSpecialDataList = {}
  27. ---左侧按钮信息
  28. self.LeftButtonDataList = {}
  29. self.itemModelList = {}
  30. ---预览信息
  31. self.PreviewDataList = {}
  32. ---最大合成数量
  33. self.maxSynthesisCount = 0
  34. ---当前合成数量
  35. self.nowSynthesisCount = 1
  36. GUI:setPositionZ(self.view.Special, -300)
  37. GUI:DataListInitData(self.view.LeftButtonDataList,function()
  38. return self:LeftButtonDataListItemCountFunc()
  39. end,function(realIndex)
  40. return self:LeftButtonDataListItemGetFunc(realIndex)
  41. end,function(realIndex, kmlcontrol)
  42. return self:LeftButtonDataListItemInitFunc(realIndex, kmlcontrol)
  43. end, function(realIndex, kmlcontrol)
  44. return self:LeftButtonDataListItemUpdateFunc(realIndex, kmlcontrol)
  45. end)
  46. GUI:DataListInitData(self.view.MaterialDataList,function()
  47. return self:MaterialDataListItemCountFunc()
  48. end,function(realIndex)
  49. return self:MaterialDataListItemGetFunc(realIndex)
  50. end,function(realIndex, kmlcontrol)
  51. return self:MaterialDataListItemInitFunc(realIndex, kmlcontrol)
  52. end, function(realIndex, kmlcontrol)
  53. return self:MaterialDataListItemUpdateFunc(realIndex, kmlcontrol)
  54. end)
  55. GUI:DataListInitData(self.view.SpecialItemDataList,function()
  56. return self:SpecialItemDataListItemCountFunc()
  57. end,function(realIndex)
  58. return self:SpecialItemDataListItemGetFunc(realIndex)
  59. end,function(realIndex, kmlcontrol)
  60. return self:SpecialItemDataListItemInitFunc(realIndex, kmlcontrol)
  61. end, function(realIndex, kmlcontrol)
  62. return self:SpecialItemDataListItemUpdateFunc(realIndex, kmlcontrol)
  63. end)
  64. GUI:DataListInitData(self.view.PreviewDataList,function()
  65. return self:PreviewDataListItemCountFunc()
  66. end,function(realIndex)
  67. return self:PreviewDataListItemGetFunc(realIndex)
  68. end,function(realIndex, kmlcontrol)
  69. return self:PreviewDataListItemInitFunc(realIndex, kmlcontrol)
  70. end, function(realIndex, kmlcontrol)
  71. return self:PreviewDataListItemUpdateFunc(realIndex, kmlcontrol)
  72. end)
  73. end
  74. ---创建或者刷新界面数据时调用
  75. function this:Refresh()
  76. SL.HideMainPanel()
  77. self:GetLeftButton()
  78. self:ShowRightInfo()
  79. self:OpenUISelectProduct()
  80. end
  81. ---打开界面默认选中配方
  82. function this:OpenUISelectProduct()
  83. local productId = self.args and self.args[1]
  84. if not productId then
  85. productId = 0
  86. end
  87. productId = tonumber(productId)
  88. local cfgList = {}
  89. local cfg = SL:GetConfigTable("cfg_synthesis")
  90. for i, v in pairs(cfg) do
  91. table.insert(cfgList,v)
  92. end
  93. table.sort(cfgList,function(a, b)
  94. return a.id < b.id
  95. end)
  96. local data = nil
  97. local type = 2
  98. ---@param v cfg_synthesis_column
  99. for i, v in ipairs(cfgList) do
  100. local isCan = false
  101. if productId == 0 and self.allCfgDataList[v.type] and self.allCfgDataList[v.type][v.subType] then
  102. for z, a in pairs(self.allCfgDataList[v.type][v.subType]) do
  103. if a.id == v.id then
  104. isCan = true
  105. break
  106. end
  107. end
  108. end
  109. for z, a in ipairs(v.productId) do
  110. if (isCan and productId == 0) or a[1] == productId then
  111. self.selectType = v.type
  112. self.selectSubType = v.subType
  113. if v.subType > 0 then
  114. type = 3
  115. end
  116. data = v
  117. break
  118. end
  119. end
  120. if data then
  121. break
  122. end
  123. end
  124. if data then
  125. self:OnClickSelectLeftItemButton(_,{{data = data,type = type}})
  126. end
  127. end
  128. ---注册UI事件和服务器消息
  129. function this:RegistEvents()
  130. GUI:AddOnClickEvent(self.view.closeButton,self,self.OnClickCloseButton)
  131. GUI:AddOnClickEvent(self.view.SpecialCloseButton,self,self.OnClickCloseSpecial)
  132. GUI:AddOnClickEvent(self.view.SelectSpecialButton,self,self.OnClickCloseSpecial)
  133. GUI:AddOnClickEvent(self.view.SynthesisButton,self,self.OnClickSynthesisButton)
  134. GUI:AddOnClickEvent(self.view.BtnMinus,self,self.OnClickBtnMinus)
  135. GUI:AddOnClickEvent(self.view.BtnAdd,self,self.OnClickBtnAdd)
  136. GUI:Input_SetOnValueChange(self.view.Input,self,self.InputOnValueChange)
  137. GUI:AddOnClickEvent(self.view.PreviewButton,self,self.OnClickPreviewButton)
  138. GUI:AddOnClickEvent(self.view.PreviewCloseButton,self,self.ClosePreview)
  139. SL:RegisterLUAEvent(LUA_EVENT_BAG_CHANGE_AFTER, self.BagInfo_Change, self)
  140. SL:RegisterLUAEvent(LUA_EVENT_MONEYCHANGE, self.CoinInfo_Change,self)
  141. SL:RegisterLUAEvent(LUA_EVENT_TIPS_ONCLICK_REPLACE, self.LUA_EVENT_TIPS_ONCLICK_REPLACE, self)
  142. SL:RegisterLuaNetMsg(LuaMessageIdToClient.RES_ITEM_SYNTHESIS,self.RES_ITEM_SYNTHESIS,self)
  143. end
  144. function this:OnClickPreviewButton()
  145. if GUI:getVisible(self.view.Preview) then
  146. self:ClosePreview()
  147. return
  148. end
  149. self:OnClickShowPreview()
  150. end
  151. ---点击显示预览界面
  152. function this:OnClickShowPreview()
  153. if self.nowCfg then
  154. GUI:setPositionX(self.view.root,-309)
  155. self.PreviewDataList = {}
  156. for i, v in ipairs(self.nowCfg.productId) do
  157. table.insert(self.PreviewDataList,tonumber(v[1]))
  158. end
  159. GUI:SetActive(self.view.Preview,true)
  160. GUI:DataListUpdateData(self.view.PreviewDataList)
  161. end
  162. end
  163. ---关闭预览界面
  164. function this:ClosePreview()
  165. if GUI:getVisible(self.view.Preview) then
  166. GUI:setPositionX(self.view.root,0)
  167. GUI:SetActive(self.view.Preview,false)
  168. end
  169. end
  170. --合成按钮
  171. function this:OnClickSynthesisButton()
  172. if self.nowCfg then
  173. local isCan = self:MaterialIsCan(self.nowCfg)
  174. local count = #self.nowCfg.arbitrarily
  175. if count == 0 then
  176. if not isCan then
  177. SL:TipMessage( SL:GetConfig('cfg_string',281).text, 1, NoticeType.NoticeMid )--"合成材料不足!",
  178. return
  179. end
  180. SL:SendLuaNetMsg(LuaMessageIdToSever.REQ_ITEM_SYNTHESIS,{self.nowCfg.id,self.nowSynthesisCount})
  181. else
  182. local specialList = {}
  183. for i, v in ipairs(self.needConsumeDataList) do
  184. if v.item then
  185. table.insert(specialList,{itemId = v.item.id,itemIndex =SL:GetBagIndex(v.item.id)})
  186. end
  187. if v.cfgId == 0 then
  188. isCan = false
  189. end
  190. end
  191. if not isCan then
  192. SL:TipMessage( SL:GetConfig('cfg_string',281).text,1, NoticeType.NoticeMid )--"合成材料不足!",
  193. return
  194. end
  195. SL:SendLuaNetMsg(LuaMessageIdToSever.REQ_ITEM_SYNTHESIS,{self.nowCfg.id,specialList})
  196. end
  197. end
  198. end
  199. ---tips点击替换响应
  200. function this:LUA_EVENT_TIPS_ONCLICK_REPLACE()
  201. if self.selectData.item then
  202. self.selectSpecialId = self.selectData.item.id
  203. end
  204. self:OpenSpecialUI(self.selectData)
  205. end
  206. ---合成回包
  207. function this:RES_ITEM_SYNTHESIS(_,message)
  208. if self.nowCfg then
  209. local list = {}
  210. for i, v in pairs(message) do
  211. table.insert(list,{cfgId = v.itemCfgId,count = v.count,id=v.itemId})
  212. end
  213. SL:OpenRewardTipsByItemList(list,0,"Atlas/UISynthesisPanel.spriteatlas","synthetic_success")
  214. self:ShowRightInfo(self.nowCfg)
  215. end
  216. end
  217. function this:BagInfo_Change(_,message)
  218. if message then
  219. GUI:DataListUpdateData(self.view.MaterialDataList)
  220. GUI:DataListUpdateData(self.view.LeftButtonDataList)
  221. if self.nowCfg then
  222. self:GetMaxCount(self.nowCfg)
  223. end
  224. end
  225. end
  226. function this:CoinInfo_Change(_,message)
  227. GUI:DataListUpdateData(self.view.MaterialDataList)
  228. GUI:DataListUpdateData(self.view.LeftButtonDataList)
  229. if self.nowCfg then
  230. self:GetMaxCount(self.nowCfg)
  231. end
  232. end
  233. function this:InputOnValueChange(a, b,eventData)
  234. local str = eventData[1]
  235. if string.isNullOrEmpty(str) then
  236. self.nowSynthesisCount = 1
  237. else
  238. local count = tonumber(str)
  239. if count <= 0 then
  240. count = 0
  241. end
  242. if count > 0 and count >= self.maxSynthesisCount then
  243. count = self.maxSynthesisCount
  244. end
  245. self.nowSynthesisCount = count
  246. end
  247. if not self.view.Input then
  248. return
  249. end
  250. GUI:Text_setString(self.view.Input,tostring(self.nowSynthesisCount))
  251. GUI:DataListUpdateData(self.view.MaterialDataList)
  252. end
  253. function this:OnClickBtnMinus()
  254. if self.nowSynthesisCount > 1 then
  255. self.nowSynthesisCount = self.nowSynthesisCount - 1
  256. if not self.view.Input then
  257. return
  258. end
  259. GUI:Text_setString(self.view.Input,tostring(self.nowSynthesisCount))
  260. GUI:DataListUpdateData(self.view.MaterialDataList)
  261. end
  262. end
  263. function this:OnClickBtnAdd()
  264. if self.nowSynthesisCount + 1 > self.maxSynthesisCount then
  265. if self.isSynthesisUpperLimit then
  266. SL:TipMessage( SL:GetConfig('cfg_string',32001).text,1, NoticeType.NoticeMid )
  267. return
  268. end
  269. SL:TipMessage( SL:GetConfig('cfg_string',281).text,1, NoticeType.NoticeMid )--"合成材料不足!",
  270. return
  271. end
  272. self.nowSynthesisCount = self.nowSynthesisCount + 1
  273. if not self.view.Input then
  274. return
  275. end
  276. GUI:Text_setString(self.view.Input,tostring(self.nowSynthesisCount))
  277. GUI:DataListUpdateData(self.view.MaterialDataList)
  278. end
  279. function this:OnClickCloseButton()
  280. GUI:UIPanel_Close("dev/outui/UISynthesis/Panel/KLUISynthesis/KLUISynthesisPanel")
  281. SL.ShowMainPanel()
  282. end
  283. function this:OnClickCloseSpecial()
  284. GUI:SetActive(self.view.Special,false)
  285. GUI:DataListUpdateData(self.view.MaterialDataList)
  286. end
  287. function this:Close()
  288. end
  289. ---显示左侧按钮
  290. function this:GetLeftButton()
  291. self.LeftButtonDataList = {}
  292. self.allCfgDataList = {}
  293. self.AllTypeList = {}
  294. local cfg = SL:GetConfigTable("cfg_synthesis")
  295. ---@param v cfg_synthesis_column
  296. for i, v in pairs(cfg) do
  297. local isCareer = false
  298. if #v.career > 0 then
  299. for z, a in ipairs(v.career) do
  300. if a[1] == SL:MeData_GetCareer().baseCareer and a[2] == SL:MeData_GetCareer().careerRank then
  301. isCareer = true
  302. break
  303. end
  304. end
  305. else
  306. isCareer = true
  307. end
  308. if isCareer and SL:MeData_GetLevel() >= v.level then
  309. if not self.allCfgDataList[v.type] then
  310. self.allCfgDataList[v.type] = {}
  311. table.insert(self.AllTypeList,v.type)
  312. end
  313. if not self.allCfgDataList[v.type][v.subType] then
  314. self.allCfgDataList[v.type][v.subType] = {}
  315. end
  316. table.insert(self.allCfgDataList[v.type][v.subType],v)
  317. end
  318. end
  319. table.sort(self.AllTypeList,function(a, b)
  320. return a < b
  321. end)
  322. for i, v in ipairs(self.AllTypeList) do
  323. for z, a in pairs(self.allCfgDataList[v]) do
  324. table.insert(self.LeftButtonDataList,{type=1,data=a[1]})
  325. break
  326. end
  327. end
  328. GUI:DataListUpdateData(self.view.LeftButtonDataList)
  329. end
  330. ---显示右侧信息
  331. ---@param cfg cfg_synthesis_column
  332. function this:ShowRightInfo(cfg)
  333. self.nowCfg = nil
  334. self.needConsumeDataList = {}
  335. self.nowSynthesisCount = 1
  336. if cfg then
  337. GUI:Text_setString(self.view.ModelName,cfg.name)
  338. GUI:Text_setString(self.view.ModelDescription,cfg.description)
  339. GUI:SetActive(self.view.SuccessRateText,cfg.successOpen ~= 2)
  340. GUI:Text_setString(self.view.SuccessRateText,"<color=#1add1f>成功率:"..(tonumber(cfg.successRate) / 100).."%</color>")
  341. GUI:SetActive(self.view.SynthesisButton,true)
  342. GUI:SetActive(self.view.MaterialTitle,true)
  343. local data = {
  344. width = "200",
  345. height = "200",
  346. itemid = cfg.productId[1][1],
  347. mfixsize = "200,200",
  348. itemcount = nil,
  349. bgtype = "0",
  350. raycast="1"
  351. }
  352. if self.item then
  353. GUI:SetActive(self.item, true)
  354. GUI:Item_UpdataData(self.item, data)
  355. else
  356. self.item = GUI:Item_Create(self.view.Model, data)
  357. end
  358. GUI:AddOnClickEvent(self.item, self, function()
  359. SL:OpenTips(nil, cfg.productId[1][1])
  360. end)
  361. self.nowCfg = cfg
  362. if #self.nowCfg.productId > 1 then
  363. GUI:SetActive(self.view.PreviewButton,true)
  364. self:OnClickShowPreview()
  365. else
  366. GUI:SetActive(self.view.PreviewButton,false)
  367. self:ClosePreview()
  368. end
  369. self:GetNeedConsumeData()
  370. else
  371. GUI:SetActive(self.view.PreviewButton,false)
  372. GUI:Text_setString(self.view.ModelName,"")
  373. GUI:Text_setString(self.view.ModelDescription,"")
  374. GUI:Text_setString(self.view.SuccessRateText,"")
  375. GUI:SetActive(self.view.SynthesisButton,false)
  376. GUI:SetActive(self.view.MaterialTitle,false)
  377. if self.item then
  378. GUI:SetActive(self.item, false)
  379. end
  380. GUI:SetActive(self.view.SelectCount,false)
  381. GUI:SetActive(self.view.SynthesisButton_Red,false)
  382. self:ClosePreview()
  383. end
  384. GUI:DataListUpdateData(self.view.MaterialDataList)
  385. end
  386. function this:GetNeedConsumeData()
  387. if self.nowCfg then
  388. ---是否显示选择次数按钮
  389. local isShowSelectCount = true
  390. for i, v in ipairs(self.nowCfg.arbitrarily) do
  391. table.insert(self.needConsumeDataList,{cfgId = 0,count = 0,SpecialIdList = {}})
  392. for z, a in ipairs(v) do
  393. table.insert(self.needConsumeDataList[i].SpecialIdList,tonumber(a))
  394. isShowSelectCount = false
  395. end
  396. end
  397. for i, v in ipairs(self.nowCfg.consumeItem) do
  398. table.insert(self.needConsumeDataList,{cfgId = tonumber(v[1]),count = tonumber(v[2])})
  399. end
  400. GUI:SetActive(self.view.SelectCount,isShowSelectCount)
  401. self:GetMaxCount(self.nowCfg)
  402. GUI:SetActive(self.view.SynthesisButton_Red,false)
  403. if self.maxSynthesisCount > 0 then
  404. self.nowSynthesisCount = 1
  405. GUI:SetActive(self.view.SynthesisButton_Red,true)
  406. end
  407. GUI:Text_setString(self.view.Input,tostring(self.nowSynthesisCount))
  408. end
  409. end
  410. ---获取最大合成数量
  411. ---@param cfg cfg_synthesis_column
  412. function this:GetMaxCount(cfg)
  413. self.maxSynthesisCount = 0
  414. for i, v in ipairs(cfg.consumeItem) do
  415. local cfgId = tonumber(v[1])
  416. local count = tonumber(v[2])
  417. local bagCount = SL:GetBagItemCount(cfgId)
  418. local maxCount = bagCount // count
  419. if i == 1 then
  420. self.maxSynthesisCount = maxCount
  421. else
  422. if self.maxSynthesisCount > maxCount then
  423. self.maxSynthesisCount = maxCount
  424. end
  425. end
  426. end
  427. if table.count(cfg.arbitrarily) > 0 then
  428. local arbitrarilyMaxCount = 0
  429. for i, v in ipairs(cfg.arbitrarily) do
  430. for z, a in ipairs(v) do
  431. local maxCount = SL:GetBagItemCount(tonumber(a))
  432. if i == 1 then
  433. arbitrarilyMaxCount = maxCount
  434. else
  435. if arbitrarilyMaxCount > maxCount then
  436. arbitrarilyMaxCount = maxCount
  437. end
  438. end
  439. end
  440. end
  441. self.maxSynthesisCount = Mathf.Min(self.maxSynthesisCount,arbitrarilyMaxCount)
  442. end
  443. ---是否有合成上限
  444. self.isSynthesisUpperLimit = false
  445. GUI:setVisible(self.view.MaxCountText,false)
  446. if cfg.synthesisType == 2 then
  447. self.isSynthesisUpperLimit = true
  448. if self.maxSynthesisCount > 10 then
  449. self.maxSynthesisCount = 10
  450. end
  451. if GUI:getVisible(self.view.SelectCount) then
  452. GUI:setPosition(self.view.MaxCountText,0,-230)
  453. else
  454. GUI:setPosition(self.view.MaxCountText,0,-265)
  455. end
  456. GUI:setVisible(self.view.MaxCountText,true)
  457. end
  458. end
  459. --------------------------------需要的材料-------------------------------------------------------
  460. function this:MaterialDataListItemCountFunc()
  461. return #self.needConsumeDataList
  462. end
  463. function this:MaterialDataListItemGetFunc(realIndex)
  464. end
  465. function this:MaterialDataListItemInitFunc(realIndex, kmlcontrol)
  466. end
  467. function this:MaterialDataListItemUpdateFunc(realIndex, kmlcontrol)
  468. local data = self.needConsumeDataList[realIndex + 1]
  469. local cfgId = data.cfgId
  470. local count = data.count
  471. local _model = GUI:GetChildControl(self.view.MaterialDataList,realIndex,'MaterialItem_Model')
  472. local _addButton = GUI:GetChildControl(self.view.MaterialDataList,realIndex,'MaterialItem_AddButton')
  473. local _addButtonText = GUI:GetChildControl(self.view.MaterialDataList,realIndex,'MaterialItem_AddButtonText')
  474. local _text = GUI:GetChildControl(self.view.MaterialDataList,realIndex,'MaterialItem_Text')
  475. local _button = GUI:GetChildControl(self.view.MaterialDataList,realIndex,'MaterialItem_Button')
  476. GUI:setPositionZ(_text, -300)
  477. --GUI:SetActive(_model,false)
  478. GUI:SetActive(_addButton,false)
  479. GUI:SetActive(_button,false)
  480. if cfgId > 0 then
  481. --GUI:SetActive(_model,true)
  482. GUI:SetActive(_button,true)
  483. else
  484. GUI:SetActive(_addButton,true)
  485. end
  486. local modelData = {
  487. width = "70",
  488. height = "70",
  489. itemid = cfgId,
  490. mfixsize = "70,70",
  491. itemcount = nil,
  492. raycast="1",
  493. }
  494. local countStr = self:GetCountStr(data)
  495. GUI:SetActive(_addButtonText,data.cfgId == 0)
  496. GUI:Item_UpdataData(_model, modelData)
  497. GUI:Text_setString(_text,countStr)
  498. GUI:AddOnClickEvent(_button,self,self.OnClickMaterialButton,{data})
  499. GUI:AddOnClickEvent(_addButton,self,self.OnClickMaterialAddButton,{data})
  500. end
  501. ---获取数量的文本
  502. function this:GetCountStr(data)
  503. if data.cfgId == 0 then
  504. return ""
  505. end
  506. if data.SpecialIdList then
  507. return ""
  508. end
  509. local bagCount = SL:GetBagItemCount(data.cfgId)
  510. local count = data.count
  511. if self.nowSynthesisCount > 0 then
  512. count = count * self.nowSynthesisCount
  513. end
  514. local color = count <= bagCount and "#1add1f" or "#ff2323"
  515. local n = ""
  516. local bagCountStr = tostring(SL:GetSimpleNumber(bagCount,1))
  517. local needCountStr = tostring(SL:GetSimpleNumber(count,1))
  518. if SL:GetUTF8ByteLen(bagCountStr) + SL:GetUTF8ByteLen(needCountStr) + 1 >= 7 then
  519. n = "\n"
  520. end
  521. return "<color="..color..">"..bagCountStr.."</color>"..n.."/"..needCountStr
  522. end
  523. ---点击材料
  524. function this:OnClickMaterialButton(_,eventData)
  525. local pos = nil
  526. ---特殊材料 需要tips打开之后替换
  527. if eventData[1].SpecialIdList then
  528. pos = "synthesis"
  529. end
  530. SL:OpenTips(pos, eventData[1].cfgId)
  531. end
  532. ---点击选择特殊材料
  533. function this:OnClickMaterialAddButton(_,eventData)
  534. self.selectData = eventData[1]
  535. self:OpenSpecialUI(eventData[1])
  536. end
  537. ---打开特殊材料的界面
  538. function this:OpenSpecialUI(eventData)
  539. GUI:SetActive(self.view.Special,true)
  540. local titleName = "选择"
  541. for i, v in ipairs(eventData.SpecialIdList) do
  542. if SL:HasConfig("cfg_item", v) then
  543. ---@type cfg_item_column
  544. local itemCfg = SL:GetConfig("cfg_item",v)
  545. local itemName = "<color=#1add1f>"..itemCfg.name.."</color>"
  546. if i == 1 then
  547. titleName = titleName..itemName
  548. else
  549. titleName = titleName.."/"..itemName
  550. end
  551. end
  552. end
  553. GUI:Text_setString(self.view.SpecialTitleText,titleName)
  554. self:GetBagSpecialItemList(eventData.SpecialIdList)
  555. end
  556. ---获取背包中符合的特殊材料
  557. function this:GetBagSpecialItemList(SpecialIdList)
  558. self.specialDataList = {}
  559. local items = SL:GetMetaValue(EMetaVarGetKey.STD_ITEMS)
  560. for i, v in pairs(items[1]) do
  561. if SL:HasConfig("cfg_item", v.cfgId) then
  562. if table.contains(SpecialIdList,v.cfgId) then
  563. table.insert(self.specialDataList,v)
  564. end
  565. end
  566. end
  567. GUI:DataListUpdateData(self.view.SpecialItemDataList)
  568. end
  569. ------------------------------------------------------------------------------------------------
  570. --------------------------------特殊材料-------------------------------------------------------
  571. function this:SpecialItemDataListItemCountFunc()
  572. return #self.specialDataList
  573. end
  574. function this:SpecialItemDataListItemGetFunc(realIndex)
  575. end
  576. function this:SpecialItemDataListItemInitFunc(realIndex, kmlcontrol)
  577. end
  578. function this:SpecialItemDataListItemUpdateFunc(realIndex, kmlcontrol)
  579. local data = self.specialDataList[realIndex + 1]
  580. local cfgId = data.cfgId
  581. local count = data.count
  582. local _model = GUI:GetChildControl(self.view.SpecialItemDataList,realIndex,'SpecialItem_Model')
  583. local _text = GUI:GetChildControl(self.view.SpecialItemDataList,realIndex,'SpecialItem_Text')
  584. local _button = GUI:GetChildControl(self.view.SpecialItemDataList,realIndex,'SpecialItem_Button')
  585. local _selectBG = GUI:GetChildControl(self.view.SpecialItemDataList,realIndex,'SpecialItem_SelectBG')
  586. local _selectGou = GUI:GetChildControl(self.view.SpecialItemDataList,realIndex,'SpecialItem_SelectGou')
  587. local _strengthText = GUI:GetChildControl(self.view.SpecialItemDataList,realIndex,'SpecialItem_StrengthText')
  588. local _appendText = GUI:GetChildControl(self.view.SpecialItemDataList,realIndex,'SpecialItem_AppendText')
  589. local modelData = {
  590. width = "70",
  591. height = "70",
  592. itemid = cfgId,
  593. mfixsize = "70,70",
  594. itemcount = nil,
  595. }
  596. GUI:Text_setString(_strengthText,"")
  597. GUI:Text_setString(_appendText,"")
  598. if data.luaExtData and data.luaExtData ~= "null" and data.luaExtData ~= "" then
  599. local str = SL:JsonDecode(data.luaExtData)
  600. if str["strengthlv"] and str["strengthlv"] > 0 then
  601. GUI:Text_setString(_strengthText,"+"..str["strengthlv"])
  602. end
  603. if str["appendlv"] and str["appendlv"] > 0 then
  604. GUI:Text_setString(_appendText,"+"..str["appendlv"])
  605. end
  606. end
  607. GUI:Item_UpdataData(_model, modelData)
  608. GUI:SetActive(_selectBG,false)
  609. GUI:SetActive(_selectGou,false)
  610. if self.selectSpecialId == data.id then
  611. self.selectSpecialItemBG = _selectBG
  612. self.selectSpecialItemGou = _selectGou
  613. GUI:SetActive(_selectBG,true)
  614. GUI:SetActive(_selectGou,true)
  615. end
  616. GUI:AddOnClickEvent(_button,self,self.OnClickSelectSpecialItemButton,{data,_selectBG,_selectGou})
  617. end
  618. ---@param eventData CommonProtos.Item
  619. function this:OnClickSelectSpecialItemButton(_,eventData)
  620. if self.selectSpecialItemBG then
  621. GUI:SetActive(self.selectSpecialItemBG,false)
  622. self.selectSpecialItemBG = nil
  623. end
  624. if self.selectSpecialItemGou then
  625. GUI:SetActive(self.selectSpecialItemGou,false)
  626. self.selectSpecialItemGou = nil
  627. end
  628. if self.selectSpecialId == eventData[1].id then
  629. SL:OpenTips(nil, eventData[1].cfgId,eventData[1].id)
  630. end
  631. self.selectSpecialId = eventData[1].id
  632. self.selectSpecialItemBG = eventData[2]
  633. self.selectSpecialItemGou = eventData[3]
  634. GUI:SetActive(self.selectSpecialItemBG,true)
  635. GUI:SetActive(self.selectSpecialItemGou,true)
  636. if self.selectData then
  637. self.selectData.cfgId = eventData[1].cfgId
  638. self.selectData.item = eventData[1]
  639. end
  640. end
  641. ------------------------------------------------------------------------------------------------
  642. --------------------------------预览界面-------------------------------------------------------
  643. function this:PreviewDataListItemCountFunc()
  644. return #self.PreviewDataList
  645. end
  646. function this:PreviewDataListItemGetFunc(realIndex)
  647. end
  648. function this:PreviewDataListItemInitFunc(realIndex, kmlcontrol)
  649. end
  650. function this:PreviewDataListItemUpdateFunc(realIndex, kmlcontrol)
  651. local data = self.PreviewDataList[realIndex + 1]
  652. local _model = GUI:GetChildControl(self.view.PreviewDataList,realIndex,'Preview_Model')
  653. local _name = GUI:GetChildControl(self.view.PreviewDataList,realIndex,'Preview_Name')
  654. GUI:setPositionZ(_name, -300)
  655. ---@type cfg_item_column
  656. local itemCfg = SL:GetConfig("cfg_item",data)
  657. local colorID = itemCfg.color
  658. local textColor = SL:GetConfigMultiKeys('cfg_color', colorID, 'id').color
  659. GUI:Text_setString(_name,itemCfg.name)
  660. GUI:Text_setTextColor(_name,textColor)
  661. GUI:Item_setItemId(_model, data)
  662. GUI:AddOnClickEvent(_model, self, function()
  663. SL:OpenTips(nil, data)
  664. end)
  665. end
  666. ------------------------------------------------------------------------------------------------
  667. -----------------------------------左侧按钮-------------------------------------------------------
  668. function this:LeftButtonDataListItemCountFunc()
  669. return #self.LeftButtonDataList
  670. end
  671. function this:LeftButtonDataListItemGetFunc(realIndex)
  672. end
  673. function this:LeftButtonDataListItemInitFunc(realIndex, kmlcontrol)
  674. end
  675. function this:LeftButtonDataListItemUpdateFunc(realIndex, kmlcontrol)
  676. local data = self.LeftButtonDataList[realIndex + 1]
  677. local cfgId = data.cfgId
  678. local count = data.count
  679. local _item = GUI:GetChildControl(self.view.LeftButtonDataList,realIndex,'LeftButton')
  680. local _button1 = GUI:GetChildControl(self.view.LeftButtonDataList,realIndex,'LeftButton_1')
  681. local _button2 = GUI:GetChildControl(self.view.LeftButtonDataList,realIndex,'LeftButton_2')
  682. local _button2_Arrow = GUI:GetChildControl(self.view.LeftButtonDataList,realIndex,'LeftButton_2_Arrow')
  683. local _button3 = GUI:GetChildControl(self.view.LeftButtonDataList,realIndex,'LeftButton_3')
  684. local _red1 = GUI:GetChildControl(self.view.LeftButtonDataList,realIndex,'RedDot_1')
  685. local _red2 = GUI:GetChildControl(self.view.LeftButtonDataList,realIndex,'RedDot_2')
  686. local _red3 = GUI:GetChildControl(self.view.LeftButtonDataList,realIndex,'RedDot_3')
  687. GUI:Button_loadTextureNormal(_button1,"btnA_02","Atlas/UISynthesisPanel.spriteatlas")
  688. GUI:Button_loadTextureNormal(_button2,"btnB_02","Atlas/UISynthesisPanel.spriteatlas")
  689. GUI:Button_loadTextureNormal(_button3,"btnC_02","Atlas/UISynthesisPanel.spriteatlas")
  690. GUI:SetActive(_button1,false)
  691. GUI:SetActive(_button2,false)
  692. GUI:SetActive(_button2_Arrow,false)
  693. GUI:SetActive(_button3,false)
  694. GUI:SetActive(_red1,false)
  695. GUI:SetActive(_red2,false)
  696. GUI:SetActive(_red3,false)
  697. GUI:SetEulerAngles(_button2_Arrow,0,0,0)
  698. local nowButton = _button1
  699. local nowButton2 = nil
  700. local isShow = self:RedDotIsShow(data.data,data.type)
  701. if data.type == 1 then
  702. --_item.rectTransform:SetSizeDelta(290,55)
  703. GUI:setContentSize(_item,290,55)
  704. GUI:SetActive(_button1,true)
  705. GUI:Button_setTitleText(_button1,data.data.typeName)
  706. GUI:SetActive(_red1,isShow)
  707. if self.selectType == data.data.type then
  708. GUI:Button_loadTextureNormal(_button1,"btnA_01","Atlas/UISynthesisPanel.spriteatlas")
  709. end
  710. elseif data.type == 2 then
  711. --_item.rectTransform:SetSizeDelta(290,45)
  712. GUI:setContentSize(_item,290,45)
  713. GUI:SetActive(_button2,true)
  714. GUI:SetActive(_red2,isShow)
  715. local name = data.data.subTypeName
  716. if data.data.subType == 0 then
  717. name = data.data.name
  718. end
  719. GUI:SetActive(_button2_Arrow,data.data.subType > 0)
  720. if self.selectSubTypeID == data.data.id then
  721. GUI:Button_loadTextureNormal(_button2,"btnB_01","Atlas/UISynthesisPanel.spriteatlas")
  722. GUI:SetEulerAngles(_button2_Arrow,0,0,90)
  723. end
  724. GUI:Button_setTitleText(_button2,name)
  725. nowButton = _button2
  726. nowButton2 = _button2_Arrow
  727. elseif data.type == 3 then
  728. --_item.rectTransform:SetSizeDelta(290,40)
  729. GUI:setContentSize(_item,290,40)
  730. GUI:Button_setTitleText(_button3,data.data.name)
  731. GUI:SetActive(_red3,isShow)
  732. if self.selectCfgId == data.data.id then
  733. GUI:Button_loadTextureNormal(_button3,"btnC_01","Atlas/UISynthesisPanel.spriteatlas")
  734. end
  735. GUI:SetActive(_button3,true)
  736. nowButton = _button3
  737. end
  738. GUI:AddOnClickEvent(nowButton,self,self.OnClickSelectLeftItemButton,{data})
  739. end
  740. function this:OnClickSelectLeftItemButton(_,eventData)
  741. local info = eventData[1]
  742. --默认第一条信息
  743. local defaultInfo = self.allCfgDataList[info.data.type][info.data.subType][1]
  744. if info.type == 1 then
  745. --选择相同的父类
  746. if info.data.type == self.selectType then
  747. --关闭页签 清除选中 保留上次选中
  748. self.selectType = 0
  749. self.selectCfgId = 0
  750. else
  751. self.selectType = info.data.type
  752. self.selectCfgId = defaultInfo.id
  753. --显示默认第一条信息
  754. self.selectSubType = defaultInfo.subType
  755. self.selectSubTypeID = defaultInfo.id
  756. self:ShowRightInfo(defaultInfo)
  757. end
  758. elseif info.type == 2 then
  759. local isSelectSubTypeID = info.data.id == self.selectSubTypeID
  760. --选择相同的子类
  761. if isSelectSubTypeID then
  762. --无子类
  763. if info.data.subType == 0 then
  764. return
  765. end
  766. --有子类清除一下选中
  767. self.selectSubType = -1
  768. self.selectSubTypeID = 0
  769. else
  770. --显示默认第一条信息
  771. self.selectSubType = info.data.subType
  772. self.selectSubTypeID = info.data.id
  773. self.selectCfgId = info.data.id
  774. end
  775. --无子类
  776. if info.data.subType == 0 then
  777. --显示当前选中数据
  778. self:ShowRightInfo(info.data)
  779. else
  780. --未选择相同的 反之显示上次选中数据
  781. if not isSelectSubTypeID then
  782. --关闭页签 清除选中 保留上次选中
  783. self:ShowRightInfo(defaultInfo)
  784. end
  785. end
  786. elseif info.type == 3 then
  787. --选择相同的子子类不操作
  788. if info.data.id == self.selectCfgId then
  789. return
  790. end
  791. --选择子子类数据
  792. self.selectSubType = info.data.subType
  793. self.selectCfgId = info.data.id
  794. self:ShowRightInfo(info.data)
  795. end
  796. self.LeftButtonDataList = {}
  797. --父类型列表
  798. local typeList = {}
  799. for i, v in ipairs(self.AllTypeList) do
  800. local data = self:SortCfgList(self.allCfgDataList[v])
  801. for z, a in ipairs(data) do
  802. --父类型列表中是否有该父类型
  803. if not table.contains(typeList,a.data[1].type) then
  804. table.insert(self.LeftButtonDataList,{type = 1,data = a.data[1]})
  805. table.insert(typeList,a.data[1].type)
  806. end
  807. end
  808. if self.selectType > 0 and v == info.data.type then
  809. for z, a in ipairs(data) do
  810. local subType = a.subType
  811. local isAdd = false
  812. for q, w in ipairs(a.data) do
  813. if subType > 0 then
  814. if not isAdd then
  815. isAdd = true
  816. table.insert(self.LeftButtonDataList,{type = 2,data = w})
  817. end
  818. if self.selectSubType == subType then
  819. table.insert(self.LeftButtonDataList,{type = 3,data = w})
  820. end
  821. else
  822. table.insert(self.LeftButtonDataList,{type = 2,data = w})
  823. end
  824. end
  825. end
  826. end
  827. end
  828. self.selectSpecialId = 0
  829. GUI:DataListUpdateData(self.view.LeftButtonDataList)
  830. end
  831. ---把表数据根据子类型排下序
  832. ---@return table<number,{subType:number,data:table<number,cfg_synthesis_column>}>
  833. function this:SortCfgList(list)
  834. local copyList = {}
  835. for i, v in pairs(list) do
  836. table.insert(copyList,{subType = i,data = v})
  837. end
  838. table.sort(copyList,function(a, b)
  839. return a.subType < b.subType
  840. end)
  841. return copyList
  842. end
  843. ---红点是否显示
  844. ---@param cfg cfg_synthesis_column
  845. ---@param type number @按钮类型:1:1级按钮(判断下面所有材料是否充足) 2:2级按钮(判断下面材料是否充足) 3:3级按钮(只判断自己是否材料足够)
  846. function this:RedDotIsShow(cfg,type)
  847. local isShowRed = true
  848. if type == 1 then
  849. isShowRed = false
  850. for i, v in pairs(self.allCfgDataList[cfg.type]) do
  851. for q, w in ipairs(v) do
  852. if self:MaterialIsCan(w) then
  853. isShowRed = true
  854. break
  855. end
  856. end
  857. end
  858. elseif type == 2 then
  859. if cfg.subType == 0 then
  860. for i, v in pairs(self.allCfgDataList[cfg.type][cfg.subType]) do
  861. if cfg.id == v.id then
  862. if not self:MaterialIsCan(v) then
  863. isShowRed = false
  864. break
  865. end
  866. end
  867. end
  868. else
  869. isShowRed = false
  870. for i, v in pairs(self.allCfgDataList[cfg.type][cfg.subType]) do
  871. if self:MaterialIsCan(v) then
  872. isShowRed = true
  873. break
  874. end
  875. end
  876. end
  877. elseif type == 3 then
  878. for i, v in pairs(self.allCfgDataList[cfg.type][cfg.subType]) do
  879. if cfg.id == v.id then
  880. if not self:MaterialIsCan(v) then
  881. isShowRed = false
  882. break
  883. end
  884. end
  885. end
  886. end
  887. return isShowRed
  888. end
  889. ---@param cfg cfg_synthesis_column
  890. function this:MaterialIsCan(cfg)
  891. local isArbitrarily = false
  892. if #cfg.arbitrarily > 0 then
  893. for i, v in ipairs(cfg.arbitrarily) do
  894. for z, a in ipairs(v) do
  895. local bagCount = SL:GetBagItemCount(tonumber(a))
  896. if bagCount > 0 then
  897. isArbitrarily = true
  898. break
  899. end
  900. end
  901. end
  902. else
  903. isArbitrarily = true
  904. end
  905. local isConsumeItem = true
  906. for i, v in ipairs(cfg.consumeItem) do
  907. local bagCount = SL:GetBagItemCount(tonumber(v[1]))
  908. local count = tonumber(v[2])
  909. if bagCount < count then
  910. isConsumeItem = false
  911. break
  912. end
  913. end
  914. return isArbitrarily and isConsumeItem
  915. end
  916. ------------------------------------------------------------------------------------------------
  917. return this