KLMainAttackPanel.lua 13 KB

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