KLMainAttackPanel.lua 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362
  1. ---@class KLMainAttackPanel:UIKmlLuaPanelBase
  2. ---@field view KLMainAttackPanelView
  3. local KLMainAttackPanel = class(UIKmlLuaPanelBase)
  4. local this = KLMainAttackPanel
  5. ---@type table<ESkillType,number[]>>
  6. local centerPos = {
  7. [ESkillType.All] = { 0, 0 },
  8. [ESkillType.Turn] = { 92, -131 },
  9. }
  10. ---@type table<ESkillType,table<number[][]>>
  11. local itemPos = {
  12. [ESkillType.All] = {
  13. [1] = { 107, 53 },
  14. [2] = { 24, 20 },
  15. [3] = { -43, -53 },
  16. [4] = { -81, -143 },
  17. [5] = { 25, 121 },
  18. [6] = { -67, 41 },
  19. [7] = { -136, -61 },
  20. },
  21. [ESkillType.Turn] = {
  22. [1] = { 39, 164 },
  23. [2] = { -64, 156 },
  24. [3] = { -142, 88 },
  25. [4] = { -165, -15 },
  26. [5] = { -127, -106 },
  27. [6] = { -39, -156 },
  28. [7] = { 60, -146 },
  29. [8] = { 139, -88 },
  30. },
  31. }
  32. ---@type KLSkillBtnItem[]
  33. local skillBtns = {}
  34. ---创建时调用一次
  35. function this:Init()
  36. end
  37. ---创建或者刷新界面数据时调用
  38. function this:Refresh()
  39. self:UpdateUI()
  40. end
  41. function this:UpdateUI()
  42. self.curShowType = SL:GetMetaValue(EMetaVarGetKey.SKILL_SETTING_SHOW_TYPE) or ESkillType.All
  43. local cPos = centerPos[self.curShowType]
  44. GUI:setPosition(self.view.SkillStruct, cPos[1], cPos[2])
  45. local maxCount = 8
  46. if self.curShowType == ESkillType.All then
  47. if skillBtns[8] then
  48. GUI:UIPanel_Close(nil, skillBtns[8])
  49. skillBtns[8] = nil
  50. end
  51. maxCount = 7
  52. end
  53. GUI:SetLocalEulerAngles(self.view.SkillStruct, 0, 0, 0)
  54. ---变身走另一套逻辑
  55. if InfoManager.shapeShiftCardInfo:isShiftMonster() then
  56. local shiftMonsterGroup = InfoManager.shapeShiftCardInfo.shiftMonsterGroup
  57. local shiftSkill = InfoManager.shapeShiftCardInfo.shiftSkill
  58. ---@type number[]
  59. local skills = shiftSkill[shiftMonsterGroup].unlockSkill
  60. local lockSkills = shiftSkill[shiftMonsterGroup].lockSkill
  61. local showSkills = {}
  62. local showSkillsLevel = {}
  63. for i, v in pairs(skills) do
  64. ---@type cfg_skill_column
  65. local skill = SL:GetConfig("cfg_skill", i)
  66. if skill.type == ECfgSkillType.Normal and skill.group == ESkillGroup.normal then
  67. showSkills[#showSkills + 1] = i
  68. showSkillsLevel[#showSkillsLevel + 1] = false
  69. elseif skill.type == ECfgSkillType.Normal and skill.group == ESkillGroup.ordinaryAttack then
  70. self.ordinaryAttackId = i
  71. self.ordinaryAttackLevel = v
  72. ---@type cfg_skill_info_column
  73. local skill_info = SL:GetConfigMultiKeys('cfg_skill_info', self.ordinaryAttackId, self.ordinaryAttackLevel, 'skillID', 'skillLevel')
  74. GUI:Image_loadTexture(self.view.sword, skill_info.icon, "Atlas/UIOutSkillIcon.spriteatlas")
  75. end
  76. end
  77. for i, v in pairs(lockSkills) do
  78. ---@type cfg_skill_column
  79. local skill = SL:GetConfig("cfg_skill", i)
  80. if skill.type == ECfgSkillType.Normal and skill.group == ESkillGroup.normal then
  81. local isHave = false
  82. for ii, vv in ipairs(showSkills) do
  83. if i == vv then
  84. isHave = true
  85. break
  86. end
  87. end
  88. if not isHave then
  89. showSkills[#showSkills + 1] = i
  90. showSkillsLevel[#showSkillsLevel + 1] = true
  91. end
  92. end
  93. end
  94. local pos = itemPos[self.curShowType]
  95. for i = 1, maxCount do
  96. ---@type KLSkillBtnItem
  97. local item = skillBtns[i]
  98. if not item then
  99. item = GUI:UIPanel_Open("dev/ui/MainUI/Item/KLSkillBtn/KLSkillBtnItem", self.view.SkillStruct, self, nil, true)
  100. skillBtns[i] = item
  101. end
  102. GUI:setPosition(item.view.root, pos[i][1], pos[i][2])
  103. GUI:SetEulerAngles(item.view.root, 0, 0, 0)
  104. item:UpdateUI(showSkills[i],showSkillsLevel[i])
  105. end
  106. return
  107. end
  108. ---@type number[]
  109. local showSkills = SL:GetMetaValue(EMetaVarGetKey.SKILL_SHOW_LIST)
  110. local pos = itemPos[self.curShowType]
  111. for i = 1, maxCount do
  112. ---@type KLSkillBtnItem
  113. local item = skillBtns[i]
  114. if not item then
  115. item = GUI:UIPanel_Open("dev/ui/MainUI/Item/KLSkillBtn/KLSkillBtnItem", self.view.SkillStruct, self, nil, true)
  116. skillBtns[i] = item
  117. end
  118. GUI:setPosition(item.view.root, pos[i][1], pos[i][2])
  119. GUI:SetEulerAngles(item.view.root, 0, 0, 0)
  120. item:UpdateUI(showSkills[i])
  121. end
  122. GUI:Image_loadTexture(self.view.sword, "img_interface_main039", "Atlas/UIMainAttackPanel.spriteatlas")
  123. GUI:SetCirclebar_time(self.view.Img_cdTime, 0)
  124. end
  125. ---注册UI事件和服务器消息
  126. function this:RegistEvents()
  127. SL:RegisterLUAEvent(Event.Skill_CDing, self.OnSkillCDing, self)
  128. SL:RegisterLUAEvent(LUA_EVENT_REFRESH_ATTACK_SKILL, self.UpdateUI, self)
  129. GUI:AddOnClickEvent(self.view.AttackButton, self, self.OnAttackClick)
  130. GUI:AddOnTouchEvent(self.view.AttackButton, self, self.OnAttackTouch)
  131. GUI:AddOnClickEvent(self.view.BtnKillMonster, self, self.KillMonsterOnClick)
  132. GUI:AddOnClickEvent(self.view.BtnKillPerson, self, self.KillPersonOnClick)
  133. GUI:AddOnClickEvent(self.view.BtnMount, self, self.BtnMountOnClick)
  134. SL:RegisterLUAEvent(Event.UpdateSkillSetting, self.UpdateUI, self)
  135. end
  136. function this:KillPersonOnClick()
  137. GUI:SetActive(self.view.killPerson, true)
  138. if self.co_eff_person then
  139. SL:UnSchedule(self.co_eff_person)
  140. end
  141. self.co_eff_person = SL:ScheduleOnce(0.5, function()
  142. GUI:SetActive(self.view.killPerson, false)
  143. end)
  144. ---@type CheckIsCanSkillDataType
  145. local skillDat = {
  146. skillId = SL:GetMetaValue(EMetaVarGetKey.SKILL_GET_COMMON_ID) or 0,
  147. selectAttachType = ERoleType.Player
  148. }
  149. SL:onLUAEvent(Event.ReleaseSkill, skillDat)
  150. end
  151. function this:KillMonsterOnClick()
  152. GUI:SetActive(self.view.killMonster, true)
  153. if self.co_eff_monster then
  154. SL:UnSchedule(self.co_eff_monster)
  155. end
  156. self.co_eff_monster = SL:ScheduleOnce(0.5, function()
  157. GUI:SetActive(self.view.killMonster, false)
  158. end)
  159. ---@type CheckIsCanSkillDataType
  160. local skillDat = {
  161. skillId = SL:GetMetaValue(EMetaVarGetKey.SKILL_GET_COMMON_ID) or 0,
  162. selectAttachType = ERoleType.Monster
  163. }
  164. SL:onLUAEvent(Event.ReleaseSkill, skillDat)
  165. end
  166. function this:BtnMountOnClick()
  167. if InfoManager.shapeShiftCardInfo:isShiftMonster() then
  168. SL:TipMessage( SL:GetConfig('cfg_string',487).text,1, NoticeType.NoticeMid )
  169. return
  170. end
  171. if InfoManager.mountInfo.ride_mount_id ~= 0 then
  172. SL:SendLuaNetMsg(LuaMessageIdToSever.REQ_CANCEL_RIDING_MOUNT, {})
  173. else
  174. SL:SendLuaNetMsg(LuaMessageIdToSever.REQ_RIDING_MOUNT, {})
  175. end
  176. end
  177. function this:OnAttackClick()
  178. self:ResetAttackControl()
  179. GUI:SetActive(self.view.clickEffect, true)
  180. local skillDat
  181. if InfoManager.shapeShiftCardInfo:isShiftMonster() then
  182. ---@type Skill
  183. local skill = SL:GetMetaValue(EMetaVarGetKey.SKILL_DATA, self.ordinaryAttackId)
  184. if not skill or not skill:IsCDEnough() then
  185. return
  186. end
  187. ---@type CheckIsCanSkillDataType
  188. skillDat = {
  189. skillId = self.ordinaryAttackId or 0,
  190. }
  191. else
  192. ---@type CheckIsCanSkillDataType
  193. skillDat = {
  194. skillId = SL:GetMetaValue(EMetaVarGetKey.SKILL_GET_COMMON_ID) or 0,
  195. }
  196. end
  197. SL:onLUAEvent(Event.ReleaseSkill, skillDat)
  198. end
  199. ---@param kmlCtrl UIKmlLuaControl
  200. ---@param eventType EUIEventName
  201. function this:OnAttackTouch(kmlCtrl, eventType, args)
  202. if eventType == EUIEventName.OnBeginDrag then
  203. self.pointDownPos = args.position
  204. elseif eventType == EUIEventName.OnDrag then
  205. if args.position.y > self.pointDownPos.y then
  206. GUI:SetActive(self.view.killPerson, true)
  207. GUI:SetActive(self.view.killMonster, false)
  208. else
  209. GUI:SetActive(self.view.killPerson, false)
  210. GUI:SetActive(self.view.killMonster, true)
  211. end
  212. elseif eventType == EUIEventName.OnEndDrag then
  213. --玩家
  214. if args.position.y > self.pointDownPos.y then
  215. if args.position.y - self.pointDownPos.y > 5 then
  216. self:KillPersonOnClick()
  217. end
  218. else
  219. --怪物
  220. if self.pointDownPos.y - args.position.y > 5 then
  221. self:KillMonsterOnClick()
  222. end
  223. end
  224. self:ResetAttackControl()
  225. elseif eventType == EUIEventName.OnPointerUp then
  226. self:ResetAttackControl()
  227. end
  228. end
  229. function this:ResetAttackControl()
  230. GUI:SetActive(self.view.killPerson, false)
  231. GUI:SetActive(self.view.killMonster, false)
  232. end
  233. ---@param skill Skill
  234. function this:OnSkillCDing(_, skill)
  235. local commonSkillId
  236. if InfoManager.shapeShiftCardInfo:isShiftMonster() then
  237. commonSkillId = self.ordinaryAttackId
  238. else
  239. commonSkillId = SL:GetMetaValue(EMetaVarGetKey.SKILL_GET_COMMON_ID) or 0
  240. end
  241. if commonSkillId ~= skill.skillId then return end
  242. self.remainCdTime = skill:LeftCDTime()
  243. if skill.curCDTime / 1000 ~= self.cdTime then
  244. self.cdTime = skill.curCDTime / 1000
  245. end
  246. if not self.cdTime then return end
  247. if self.remainCdTime / self.cdTime <= 0.05 then
  248. GUI:SetCirclebar_startper(self.view.Img_cdTime, 0)
  249. else
  250. local startper = self.remainCdTime / self.cdTime * 100
  251. startper = math.floor(startper)
  252. GUI:SetCirclebar_startper(self.view.Img_cdTime, startper)
  253. GUI:SetCirclebar_time(self.view.Img_cdTime, self.remainCdTime)
  254. end
  255. end
  256. ---@param kmlCtrl UIKmlLuaControl
  257. ---@param eventType EUIEventName
  258. function this:OnTouchEvent(kmlCtrl, eventType, args)
  259. if self.curShowType == ESkillType.All then return end
  260. if eventType == EUIEventName.OnDrag then
  261. local angleX, angleY, angleZ = GUI:GetLocalEulerAngles(self.view.SkillStruct)
  262. if (angleZ ~= 0 and angleZ < 200) or angleZ > 360 then return end
  263. local nor = args.delta.y
  264. if Mathf.Abs(args.delta.x) > Mathf.Abs(args.delta.y) then
  265. nor = args.delta.x
  266. end
  267. local mag = Vector2.Magnitude(args.delta)
  268. if nor < 0 then
  269. angleZ = angleZ + mag * 0.4
  270. else
  271. angleZ = angleZ - mag * 0.4
  272. end
  273. if (angleZ > 0 and angleZ < 100) or angleZ > 360 then angleZ = 0 end
  274. if angleZ > 100 and angleZ < 200 then angleZ = 200 end
  275. GUI:SetLocalEulerAngles(self.view.SkillStruct, angleX, angleY, angleZ)
  276. for _, v in pairs(skillBtns) do
  277. GUI:SetEulerAngles(v.view.root, 0, 0, 0)
  278. end
  279. elseif eventType == EUIEventName.OnEndDrag then
  280. local angleX, angleY, angleZ = GUI:GetLocalEulerAngles(self.view.SkillStruct)
  281. local delta = 0
  282. local tmp1, tmp2 = math.modf(angleZ / 36)
  283. if tmp2 < 0.5 then
  284. angleZ = (tmp1) * 36 - delta
  285. else
  286. angleZ = (tmp1 + 1) * 36 - delta
  287. end
  288. if (angleZ > 0 and angleZ < 100) or angleZ > 360 then angleZ = 0 end
  289. if angleZ > 100 and angleZ <= 200 then angleZ = 216 end
  290. GUI:SetLocalEulerAngles(self.view.SkillStruct, angleX, angleY, angleZ)
  291. for _, v in pairs(skillBtns) do
  292. GUI:SetEulerAngles(v.view.root, 0, 0, 0)
  293. end
  294. end
  295. end
  296. function this:Close()
  297. for _, v in pairs(skillBtns) do
  298. GUI:UIPanel_Close("dev/ui/MainUI/Item/KLSkillBtn/KLSkillBtnItem", v)
  299. end
  300. table.clear(skillBtns)
  301. self.cdTime = 0
  302. self.remainCdTime = 0
  303. if self.co_eff_monster then
  304. SL:UnSchedule(self.co_eff_monster)
  305. self.co_eff_monster = nil
  306. end
  307. if self.co_eff_person then
  308. SL:UnSchedule(self.co_eff_person)
  309. self.co_eff_person = nil
  310. end
  311. end
  312. return this