KLBigMapPanel.lua 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839
  1. ---@class KLBigMapPanel:UIKmlLuaPanelBase
  2. ---@field view KLBigMapPanelView
  3. local KLBigMapPanel = class(UIKmlLuaPanelBase)
  4. local this = KLBigMapPanel
  5. ---@class MapMoveListItemData
  6. ---@field isGroup boolean
  7. ---@field isRoot boolean
  8. ---@field groupExpand boolean
  9. ---@field children cfg_mapMove_column[]
  10. ---@field data cfg_mapMove_column
  11. ---创建时调用一次
  12. function this:Init()
  13. --self.controlMap = {}
  14. --self.mapMoveTabList = {}
  15. self.mapMoveGroup = {}
  16. ---@type MapMoveListItemData[]
  17. self.mapMoveListData = {}
  18. ---随机传送道具相关初始化
  19. self:InitDeliveryItemData()
  20. ---定点传送道具相关初始化
  21. self:InitFixedPointItemData()
  22. self.MonsterPointPool = TablePool()---大地图
  23. self.monsterPointTempList = {}---temp列表保存
  24. --[[ self.specialMonsterPointPool = TablePool()---大地图
  25. self.specialMonsterPointTempList = {}---temp列表保存]]
  26. ---@type cfg_mapMove_column[]
  27. local mapMoveTabList = SL:GetConfigTable("cfg_mapMove")
  28. for _, v in pairs(mapMoveTabList) do
  29. if SL:CheckCalculateConditionGroup(v.mapUIShow) then
  30. if v.group and v.group ~= 0 then
  31. --如果有分组
  32. if not self.mapMoveGroup[v.group] then
  33. self.mapMoveGroup[v.group] = {}
  34. ---@type MapMoveListItemData
  35. local item = {}
  36. item.isGroup = true
  37. item.data = v
  38. item.isRoot = true
  39. table.insert(self.mapMoveListData, item)
  40. end
  41. ---@type MapMoveListItemData
  42. local item = {}
  43. item.isGroup = false
  44. item.data = v
  45. item.isRoot = false
  46. table.insert(self.mapMoveGroup[v.group], item)
  47. else
  48. ---@type MapMoveListItemData
  49. local item = {}
  50. item.isGroup = false
  51. item.data = v
  52. item.isRoot = true
  53. table.insert(self.mapMoveListData, item)
  54. end
  55. end
  56. end
  57. --填充children
  58. for _, v in pairs(self.mapMoveListData) do
  59. if v.isGroup then
  60. v.children = self.mapMoveGroup[v.data.group]
  61. end
  62. end
  63. --[[ GUI:DataListInitData(self.view.TransferList, function() return self:TransferListCountGetFun() end,
  64. function(realIndex) return self:TransferListGetFun(realIndex) end,
  65. nil,
  66. function(realIndex,item) self:TransferListUpdateFun(realIndex,item) end,
  67. nil)]]
  68. GUI:OSAScrollView_Initialized(self.view.TransferScrollView, self.TransferItemGetFun, self.TransferItemUpdateFun, self)
  69. GUI:OSAScrollView_SetItemSizeGetFun(self.view.TransferScrollView, self.TransferItemSizeGetFun, self)
  70. ---@type table<string,UIKmlLuaPanelBase>
  71. self.iconMap = {}
  72. self.sceneImgWidth, self.sceneImgHeight = GUI:getSizeDelta(self.view.img_scene)
  73. self.showedRoadPoints = {}
  74. self.mapIconVisibleInfo = {}
  75. ---@type KLMiniMapPanel
  76. local minimapPanel = GUI:GetUI("dev/ui/Map/Panel/KLMiniMap/KLMiniMapPanel")
  77. if minimapPanel then
  78. for k, v in pairs(minimapPanel.mapIconVisibleInfo) do
  79. self.mapIconVisibleInfo[k] = v
  80. end
  81. end
  82. end
  83. function this:TransferItemSizeGetFun(index)
  84. local data = self.mapMoveListData[index + 1]
  85. if data.isRoot then
  86. return 46
  87. end
  88. return 34
  89. end
  90. function this:TransferItemGetFun()
  91. ---@type KLBigMapTransferItemItem
  92. local itemPanel = GUI:UIPanel_Open("dev/ui/Map/Item/KLBigMapTransferItem/KLBigMapTransferItemItem", self.view.TransferList, self, nil, true)
  93. return itemPanel
  94. end
  95. ---@param item KLBigMapTransferItemItem
  96. ---@param index number
  97. function this:TransferItemUpdateFun(item, index)
  98. item:RefreshUI(self.mapMoveListData[index + 1], function()
  99. self:RefreshListData()
  100. --GUI:DataListUpdateData(self.view.TransferList)
  101. self:RefreshTransferList()
  102. end)
  103. end
  104. --[[function this:TransferListCountGetFun()
  105. return #self.mapMoveListData
  106. end]]
  107. --[[function this:TransferListGetFun()
  108. local itemPanel = GUI:UIPanel_Open("dev/ui/Map/Item/KLBigMapTransferItem/KLBigMapTransferItemItem",self.view.TransferList,self,nil,true)
  109. self.controlMap[itemPanel.view.root.kmlControl] = itemPanel
  110. return itemPanel.view.root.kmlControl
  111. end]]
  112. --[[
  113. function this:TransferListUpdateFun(realIndex,item)
  114. ---@type KLBigMapTransferItemItem
  115. local itemPanel = self.controlMap[item]
  116. itemPanel:RefreshUI(self.mapMoveListData[realIndex + 1], function()
  117. self:RefreshListData()
  118. --GUI:DataListUpdateData(self.view.TransferList)
  119. self:RefreshTransferList()
  120. end)
  121. end
  122. ]]
  123. function this:RefreshListDataWithJumpIndex(jumpIndex)
  124. ---@type cfg_mapMove_column
  125. local jumpTbl = SL:GetConfig("cfg_mapMove", jumpIndex)
  126. if jumpTbl.group ~= 0 then
  127. --展开分组
  128. for _, v in pairs(self.mapMoveListData) do
  129. if v.isGroup and v.data.group == jumpTbl.group then
  130. if not v.groupExpand then
  131. v.groupExpand = true
  132. self:RefreshListData()
  133. end
  134. end
  135. end
  136. end
  137. for k, v in pairs(self.mapMoveListData) do
  138. if not v.isGroup and v.data.id == jumpTbl.id then
  139. return k
  140. end
  141. end
  142. end
  143. function this:RefreshListData()
  144. local newListData = {}
  145. for _, item in pairs(self.mapMoveListData) do
  146. if item.isRoot then
  147. table.insert(newListData, item)
  148. if item.isGroup and item.groupExpand and item.children then
  149. for _, child in pairs(item.children) do
  150. table.insert(newListData, child)
  151. end
  152. end
  153. end
  154. end
  155. self.mapMoveListData = newListData
  156. end
  157. ---创建或者刷新界面数据时调用
  158. function this:Refresh()
  159. SL.HideMainPanel()
  160. GUI:Slider_setPercent(self.view.slider_map_size, 1.00001)
  161. self:SetDeliveryItem()
  162. self:SetFixedPointItem()
  163. GUI:AddOnClickEvent(self.view.Delivery_Item, self, function()
  164. local count = SL:GetBagItemCount(self.DeliveryItemID)
  165. if count < 1 then
  166. SL:CommonTipsMessage({ stringTblID = 494,
  167. ui = self,
  168. sureBtnText = "确定",
  169. cancelBtnText = "取消",
  170. callback = function()
  171. self:BtnCloseOnClick()
  172. shortcutOutMgr.DO(self.DeliveryItemJumpPathList)
  173. end })
  174. return
  175. end
  176. local item_Data = SL:MeData_GetCfgBaseOnItemId(self.DeliveryItemID)
  177. if item_Data then
  178. self.isUseDelivery = true
  179. self:ClearAllRoadPoint()
  180. SL:UseItem(self.DeliveryItemID, item_Data.id, 1)
  181. end
  182. end)
  183. --GUI:DataListUpdateData(self.view.TransferList)
  184. local jumpListIndex
  185. if self.args then
  186. local jumpIndex = tonumber(self.args[1])
  187. jumpListIndex = self:RefreshListDataWithJumpIndex(jumpIndex)
  188. end
  189. self:RefreshTransferList()
  190. if jumpListIndex then
  191. GUI:OSAScrollView_ScrollTo(self.view.TransferScrollView, jumpListIndex - 1)
  192. end
  193. local mapId = SL:GetMetaValue(EMetaVarGetKey.MAP_ID)
  194. ---@type cfg_map_info_column
  195. local mapInfo = SL:GetConfig("cfg_map_info", mapId)
  196. self.initMapScale = mapInfo.showSize or 1
  197. self.initPivot = { 0.5, 0.5 }
  198. self.iconScale = 1 / self.initMapScale
  199. if mapInfo.showPosition then
  200. self.initPivot = mapInfo.showPosition
  201. GUI:SetAnchorAdvanced(self.view.panel_scene, self.initPivot[1], self.initPivot[2])
  202. GUI:setPosition(self.view.panel_scene, 0, 0)
  203. end
  204. GUI:setScale(self.view.panel_scene, self.initMapScale)
  205. GUI:setScale(self.view.img_player_icon, self.iconScale)
  206. local mapFile = SL:GetMetaValue(EMetaVarGetKey.MINIMAP_FILE)
  207. GUI:Image_loadTexture(self.view.img_scene, string.format("Texture/%s.png", mapFile))
  208. self:SetTransferIcon()
  209. self:SetNpcIcon()
  210. self:ZoomMap(1)
  211. self:ShowCurPath()
  212. self:ShowPlayerIcon()
  213. SL:ReqMapMonsterStatusMessage(mapId)
  214. ---设置npc传送列表
  215. GUI:AddOnClickEvent(self.view.btn_npc_transfer1, self, self.TransferToCompoundNpc)
  216. ---地图名称
  217. GUI:Text_setString(self.view.text_map_name, SL:GetMetaValue(EMetaVarGetKey.MAP_NAME))
  218. if not SL:GetIsWebGL() then
  219. GUI:setAnchorPoint(self.view.btn_close,2,1)
  220. GUI:setPosition(self.view.btn_close, 4, -48)
  221. end
  222. end
  223. function this:TransferToCompoundNpc()
  224. self:BtnCloseOnClick()
  225. SL:SendTransferToNpcMessage(100404, true)
  226. --SL:ScheduleOnce(1, function()
  227. -- if not GUI:GetUI("dev/outui/UISynthesis/Panel/KLUISynthesis/KLUISynthesisPanel") then
  228. -- GUI:UIPanel_Open("dev/outui/UISynthesis/Panel/KLUISynthesis/KLUISynthesisPanel", nil, nil, {})
  229. -- end
  230. --end)
  231. end
  232. function this:RefreshTransferList()
  233. GUI:OSAScrollView_RefreshList(self.view.TransferScrollView, #self.mapMoveListData)
  234. end
  235. ---初始化随机传送道具信息
  236. function this:InitDeliveryItemData()
  237. ---随机传送道具id
  238. self.DeliveryItemID = 60010001
  239. ---随机传送道具的跳转路径
  240. self.DeliveryItemJumpPathList = { "openUIPanel", "dev/outui/ShopMain/Panel/KLShopMain/KLShopMainPanel", "1", "1" }
  241. ---@type cfg_item_column
  242. local itemCfg = SL:GetConfig("cfg_item", self.DeliveryItemID)
  243. for i, v in ipairs(itemCfg.Quickshopping) do
  244. if v[1] == "2" and v[3] == "商城" and v[4] == "openUIPanel" then
  245. self.DeliveryItemJumpPathList = {}
  246. for z, a in ipairs(v) do
  247. if z > 3 then
  248. table.insert(self.DeliveryItemJumpPathList, a)
  249. end
  250. end
  251. break
  252. end
  253. end
  254. end
  255. ---初始化定点传送道具信息
  256. function this:InitFixedPointItemData()
  257. ---@type cfg_global_column
  258. local globalCfg = SL:GetConfig("cfg_global", 25003)
  259. local strList = string.split(globalCfg.value, '#')
  260. ---定点传送道具id
  261. self.FixedPointItemID = tonumber(strList[1])
  262. ---定点传送道具所需数量
  263. self.FixedPointItemNeedCount = tonumber(strList[2])
  264. ---是否勾选了定点传送
  265. self.isSelectFixedPoint = false
  266. ---定点传送道具的跳转路径
  267. self.FixedPointItemJumpPathList = { "openUIPanel", "dev/outui/ShopMain/Panel/KLShopMain/KLShopMainPanel", "1", "1" }
  268. ---@type cfg_item_column
  269. local itemCfg = SL:GetConfig("cfg_item", self.FixedPointItemID)
  270. for i, v in ipairs(itemCfg.Quickshopping) do
  271. if v[1] == "2" and v[3] == "商城" and v[4] == "openUIPanel" then
  272. self.FixedPointItemJumpPathList = {}
  273. for z, a in ipairs(v) do
  274. if z > 3 then
  275. table.insert(self.FixedPointItemJumpPathList, a)
  276. end
  277. end
  278. break
  279. end
  280. end
  281. self.isSelectFixedPoint = PlayerPrefs.GetInt("SelectFixedPoint" .. SL:GetMetaValue(EMetaVarGetKey.UID)) == 1
  282. GUI:Toggle_setIsOn(self.view.FixedPointToggle, self.isSelectFixedPoint)
  283. end
  284. ---设置随机传送道具的数量,id,数量文本颜色
  285. function this:SetDeliveryItem()
  286. local count = SL:GetBagItemCount(self.DeliveryItemID)
  287. local colorStr = "#fbd994"
  288. if count < 1 then
  289. colorStr = "#ff2323"
  290. end
  291. GUI:Item_UpdataData(self.view.Delivery_Item, {
  292. itemid = tostring(self.DeliveryItemID),
  293. itemcustomcount = "<color=" .. colorStr .. ">" .. SL:GetBagItemCount(self.DeliveryItemID) .. "</color>",
  294. })
  295. end
  296. ---设置定点传送道具的id
  297. function this:SetFixedPointItem()
  298. local count = SL:GetBagItemCount(self.FixedPointItemID)
  299. local colorStr = "#fbd994"
  300. if count < 1 then
  301. colorStr = "#ff2323"
  302. end
  303. GUI:Text_setString(self.view.FixedPointItemCount, "<color=" .. colorStr .. ">" .. SL:GetSimpleNumber(SL:GetBagItemCount(self.FixedPointItemID), 1) .. "</color>")
  304. GUI:Item_UpdataData(self.view.FixedPointItem, {
  305. itemid = tostring(self.FixedPointItemID),
  306. itemcustomcount = "",
  307. mscale = "25,25,25",
  308. })
  309. end
  310. ---注册UI事件和服务器消息
  311. function this:RegistEvents()
  312. GUI:AddOnTouchEvent(self.view.img_drag, self, self.OnSceneTouch1)
  313. GUI:AddOnTouchEvent(self.view.img_scene, self, self.OnSceneTouch2)
  314. GUI:AddOnClickEvent(self.view.btn_close, self, self.BtnCloseOnClick)
  315. GUI:Slider_addOnEvent(self.view.slider_map_size, self, self.SliderMapSizeOnEvent)
  316. SL:RegisterLUAEvent(LUA_EVENT_PLAYER_MAPPOS_CHANGE, self.OnPlayerMapPosChange, self)
  317. SL:RegisterLUAEvent(LUA_EVENT_PLAYER_TURN_DIR, self.OnPlayerTurnDir, self)
  318. SL:RegisterLUAEvent(LUA_EVENT_BAG_CHANGE_AFTER, self.LUA_EVENT_BAG_CHANGE_AFTER, self)
  319. GUI:AddOnClickEvent(self.view.btn_map_zoom_in, self, self.BtnMapZoomInOnClick)
  320. GUI:AddOnClickEvent(self.view.btn_map_zoom_out, self, self.BtnMapZoomOutOnClick)
  321. GUI:AddOnClickEvent(self.view.FixedPointItem, self, self.BtnFixedPointItemOnClick)
  322. SL:RegisterLuaNetMsg(MessageDef.ResMapMonsterStatusMessage, self.ResMapMonsterStatusMessage, self)
  323. ---特别袖珍罐商店
  324. GUI:AddOnClickEvent(self.view.btn_npc_shop1, self, self.TransferToShopNpc)
  325. GUI:SetToggleOnValueChange(self.view.FixedPointToggle, self, self.FixedPointToggleChange)
  326. end
  327. ---点击定点道具显示tips
  328. function this:BtnFixedPointItemOnClick()
  329. SL:OpenTips("", self.FixedPointItemID)
  330. end
  331. function this:FixedPointToggleChange(control, eventData, value)
  332. self.isSelectFixedPoint = value[1]
  333. PlayerPrefs.SetInt("SelectFixedPoint" .. SL:GetMetaValue(EMetaVarGetKey.UID), value[1] and 1 or 0)
  334. end
  335. function this:LUA_EVENT_BAG_CHANGE_AFTER(_, message)
  336. if message then
  337. self:SetDeliveryItem()
  338. self:SetFixedPointItem()
  339. end
  340. end
  341. function this:OnSceneTouch1(_, touchType)
  342. if touchType == EUIEventName.OnBeginDrag then
  343. self.beginDragPos = SL:GetMetaValue(EMetaVarGetKey.MOUSE_MOVE_POS)
  344. self.beginMapPosX, self.beginMapPosY = GUI:getPosition(self.view.panel_scene)
  345. elseif touchType == EUIEventName.OnDrag then
  346. if not self.beginDragPos then
  347. return
  348. end
  349. local pos = SL:GetMetaValue(EMetaVarGetKey.MOUSE_MOVE_POS)
  350. local delta = pos - self.beginDragPos
  351. local finalPosX = self.beginMapPosX + delta[0]
  352. local finalPosY = self.beginMapPosY + delta[1]
  353. local fac = 1 / self.iconScale * 0.5
  354. if finalPosX < -self.sceneImgWidth * fac then
  355. finalPosX = -self.sceneImgWidth * fac
  356. elseif finalPosX > self.sceneImgWidth * fac then
  357. finalPosX = self.sceneImgWidth * fac
  358. end
  359. if finalPosY < -self.sceneImgHeight * fac then
  360. finalPosY = -self.sceneImgHeight * fac
  361. end
  362. if finalPosY > self.sceneImgHeight * fac then
  363. finalPosY = self.sceneImgHeight * fac
  364. end
  365. GUI:setPosition(self.view.panel_scene, finalPosX, finalPosY)
  366. elseif touchType == EUIEventName.OnEndDrag then
  367. self.beginDragPos = nil
  368. end
  369. end
  370. function this:OnSceneTouch2(_, touchType)
  371. if touchType == EUIEventName.OnBeginDrag then
  372. self.beginDragPos = SL:GetMetaValue(EMetaVarGetKey.MOUSE_MOVE_POS)
  373. self.beginMapPosX, self.beginMapPosY = GUI:getPosition(self.view.panel_scene)
  374. self.oldSceneTouchType = EUIEventName.OnBeginDrag
  375. elseif touchType == EUIEventName.OnDrag then
  376. if not self.beginDragPos then
  377. return
  378. end
  379. local pos = SL:GetMetaValue(EMetaVarGetKey.MOUSE_MOVE_POS)
  380. local delta = pos - self.beginDragPos
  381. local finalPosX = self.beginMapPosX + delta[0]
  382. local finalPosY = self.beginMapPosY + delta[1]
  383. local fac = 1 / self.iconScale * 0.5
  384. if finalPosX < -self.sceneImgWidth * fac then
  385. finalPosX = -self.sceneImgWidth * fac
  386. elseif finalPosX > self.sceneImgWidth * fac then
  387. finalPosX = self.sceneImgWidth * fac
  388. end
  389. if finalPosY < -self.sceneImgHeight * fac then
  390. finalPosY = -self.sceneImgHeight * fac
  391. end
  392. if finalPosY > self.sceneImgHeight * fac then
  393. finalPosY = self.sceneImgHeight * fac
  394. end
  395. GUI:setPosition(self.view.panel_scene, finalPosX, finalPosY)
  396. elseif touchType == EUIEventName.OnEndDrag then
  397. self.beginDragPos = nil
  398. elseif touchType == EUIEventName.OnPointerClick then
  399. --点击拖拽的时候也会调用这个事件 需要判断一下是不是拖拽
  400. if self.oldSceneTouchType == EUIEventName.OnBeginDrag then
  401. self.oldSceneTouchType = nil
  402. return
  403. end
  404. local posX, posY = self:GetCurrentMousePosInMap()
  405. if self.isSelectFixedPoint then
  406. --选择了定点传送
  407. if not SL:GetMetaValue(EMetaVarGetKey.MAP_IS_OBSTACLE, math.round(posX), math.round(posY)) then
  408. --不为阻挡点
  409. local count = SL:GetBagItemCount(self.FixedPointItemID)
  410. if count < self.FixedPointItemNeedCount then
  411. SL:CommonTipsMessage({ stringTblID = 497,
  412. ui = self,
  413. sureBtnText = "确定",
  414. cancelBtnText = "取消",
  415. callback = function()
  416. self:BtnCloseOnClick()
  417. shortcutOutMgr.DO(self.FixedPointItemJumpPathList)
  418. end })
  419. return
  420. end
  421. self:ClearAllRoadPoint()
  422. SL:SendLuaNetMsg(LuaMessageIdToSever.REQ_TRANSFER_WITHIN_MAP, { math.round(posX), math.round(posY) })
  423. else
  424. SL:TipMessage(SL:GetConfig('cfg_string', 498).text, 1, NoticeType.NoticeMid)
  425. end
  426. return
  427. end
  428. ---@type ArriveFuncData
  429. local arriveFuncData = {}
  430. arriveFuncData.IsAutoFight = true
  431. arriveFuncData.callBack = function()
  432. local isSafe = SL:GetMetaValue(EMetaVarGetKey.IN_SAFE_AREA)
  433. if not isSafe then
  434. SL:StartOnHook(true, true)
  435. end
  436. end
  437. SL:StopOnHook(true)
  438. local roadRight = SL:Me_TriggerToMove(Dot2.New(math.round(posX), math.round(posY)), nil, nil, arriveFuncData, true, nil, nil, true, true)
  439. if roadRight then
  440. self:ShowCurPath()
  441. end
  442. elseif touchType == EUIEventName.onDoublePointerClick then
  443. if SL:GetMetaValue("PLATFORM_MOBILE") and SL:GetMetaValue("IS_SDK_LOGIN") then
  444. return
  445. end
  446. self:ClearAllRoadPoint()
  447. local posX, posY = self:GetCurrentMousePosInMap()
  448. SL:MapTransferXY(0, math.round(posX), math.round(posY))
  449. end
  450. end
  451. function this:BtnCloseOnClick()
  452. GUI:UIPanel_Close("dev/ui/Map/Panel/KLBigMap/KLBigMapPanel")
  453. end
  454. function this:Close()
  455. if self.iconMap then
  456. for k, v in pairs(self.iconMap) do
  457. GUI:UIPanel_Close(_, v)
  458. end
  459. table.clear(self.iconMap)
  460. end
  461. --[[for _, point in pairs(self.showedRoadPoints) do
  462. point.kmlControl:Hide()
  463. end
  464. table.clear(self.showedRoadPoints)
  465. if self.roadPointStack then
  466. while not self.roadPointStack:IsEmpty() do
  467. local point = self.roadPointStack:Pop()
  468. point.kmlControl:Hide()
  469. end
  470. end]]
  471. self.MonsterPointPool:Clear()
  472. self.monsterPointTempList = {}---temp列表保存
  473. --[[ self.specialMonsterPointPool:Clear()
  474. self.specialMonsterPointTempList = {}---temp列表保存]]
  475. if self.DeliveryTimer then
  476. SL:UnSchedule(self.DeliveryTimer)
  477. end
  478. SL.ShowMainPanel()
  479. end
  480. function this:GetCurrentMousePosInMap()
  481. local pos = SL:GetMetaValue(EMetaVarGetKey.MOUSE_MOVE_POS)
  482. local _, relativePos = SL:ScreenPointToLocalPointInRectangle(self.view.panel_scene, pos[0], pos[1])
  483. local clickPosX = relativePos[0] + self.sceneImgWidth * self.initPivot[1]
  484. local clickPosY = relativePos[1] + self.sceneImgHeight * self.initPivot[2]
  485. clickPosX = clickPosX / self.sceneImgWidth * 256
  486. clickPosY = clickPosY / self.sceneImgHeight * 256
  487. return clickPosX, clickPosY
  488. end
  489. ---@设置传送点图标
  490. function this:SetTransferIcon()
  491. local mapId = SL:GetMetaValue(EMetaVarGetKey.MAP_ID)
  492. ---@type cfg_transfer_point_column[]
  493. local transferPoint = SL:FindConfigs('cfg_transfer_point', 'mapId', mapId)
  494. if transferPoint then
  495. for _, v in pairs(transferPoint) do
  496. local transferIcon = GUI:UIPanel_Open("dev/ui/Map/Item/KLMapTransferIcon/KLMapTransferIconItem", self.view.icon_parent, self, v, true)
  497. self:SetMapIcon("MapTransferIcon" .. v.id, transferIcon, v.position[1], v.position[2])
  498. end
  499. end
  500. end
  501. function this:SetNpcIcon()
  502. local mapId = SL:GetMetaValue(EMetaVarGetKey.MAP_ID)
  503. ---@type cfg_npclist_column[]
  504. local npcList = SL:FindConfigs('cfg_npclist', 'mapId', mapId)
  505. if npcList then
  506. for _, npcTbl in pairs(npcList) do
  507. local npcIcon = GUI:UIPanel_Open("dev/ui/Map/Item/KLMapNpcIcon/KLMapNpcIconItem", self.view.icon_parent, self, { npcTbl, true }, true)
  508. self:SetMapIcon("MapNpcIcon" .. npcTbl.id, npcIcon, npcTbl.x, npcTbl.y)
  509. end
  510. end
  511. end
  512. ---@param id string
  513. ---@param item UIKmlLuaPanelBase
  514. function this:SetMapIcon(id, item, x, y)
  515. if self.iconMap[id] then
  516. GUI:UIPanel_Close(_, self.iconMap[id])
  517. self.iconMap[id] = nil
  518. end
  519. --GUI:SetParent(icon,self.view.scene_group)
  520. --item.kmlControl:SetParent(self.view.icon_parent.kmlControl)
  521. local miniMapX = x / 256 * self.sceneImgWidth - self.sceneImgWidth / 2
  522. local miniMapY = y / 256 * self.sceneImgHeight - self.sceneImgHeight / 2
  523. GUI:setPosition(item.view.root, miniMapX, miniMapY)
  524. self.iconMap[id] = item
  525. if self.mapIconVisibleInfo[id] then
  526. GUI:setVisible(item.view.root, self.mapIconVisibleInfo[id] == "1")
  527. end
  528. end
  529. ---@return UIKmlLuaControl
  530. function this:PopRoadPoint()
  531. if not self.roadPointStack then
  532. self.roadPointStack = Stack:New()
  533. end
  534. local point
  535. if self.roadPointStack:Count() > 0 then
  536. point = self.roadPointStack:Pop()
  537. else
  538. point = GUI:Image_Create(self.view.icon_parent, { ["src"] = "img_minimap__greenpoint", ["atlas"] = "Atlas/UIMapPanel.spriteatlas", ["a"] = "12" })
  539. end
  540. GUI:setVisible(point, true)
  541. GUI:setScale(point, self.iconScale)
  542. return point
  543. end
  544. ---@param point
  545. function this:PushRoadPoint(point)
  546. GUI:setVisible(point, false)
  547. if not self.roadPointStack then
  548. self.roadPointStack = Stack:New()
  549. end
  550. self.roadPointStack:Push(point)
  551. end
  552. function this:ClearAllRoadPoint()
  553. for _, v in pairs(self.showedRoadPoints) do
  554. self:PushRoadPoint(v)
  555. end
  556. table.clear(self.showedRoadPoints)
  557. end
  558. function this:ShowCurPath()
  559. self:ClearAllRoadPoint()
  560. local path = SL:GetMetaValue(EMetaVarGetKey.MAP_PATH_POINTS)
  561. local index = SL:GetMetaValue(EMetaVarGetKey.MAP_CURRENT_PATH_INDEX)
  562. if not path or not path.n then
  563. return
  564. end
  565. for i = index, path.n, 4 do
  566. local p = path.list[i]
  567. local point = self:PopRoadPoint()
  568. GUI:setPosition(point, p.x / 256 * self.sceneImgWidth, p.z / 256 * self.sceneImgHeight)
  569. self.showedRoadPoints[i] = point
  570. end
  571. end
  572. function this:OnPlayerMapPosChange()
  573. local index = SL:GetMetaValue(EMetaVarGetKey.MAP_CURRENT_PATH_INDEX)
  574. index = index or 0
  575. for i = 1, index do
  576. local point = self.showedRoadPoints[i]
  577. if point then
  578. self:PushRoadPoint(point)
  579. self.showedRoadPoints[i] = nil
  580. end
  581. end
  582. self:RefreshPlayerIconPos()
  583. ---使用了随机传送
  584. if self.isUseDelivery then
  585. self.isUseDelivery = false
  586. --再次寻路
  587. self.DeliveryTimer = SL:Schedule(self.DeliveryTimer, 0, 0.1, -1, function()
  588. self:ShowCurPath()
  589. end)
  590. end
  591. end
  592. function this:ShowPlayerIcon()
  593. self:RefreshPlayerIconPos()
  594. self:OnPlayerTurnDir(_, SL:GetMetaValue(EMetaVarGetKey.DIR))
  595. end
  596. function this:RefreshPlayerIconPos()
  597. ---@type Dot2
  598. local pos = SL:GetMetaValue(EMetaVarGetKey.MAP_PLAYER_POS)
  599. local x = pos.x / 256 * self.sceneImgWidth - self.sceneImgWidth / 2
  600. local z = pos.z / 256 * self.sceneImgHeight - self.sceneImgHeight / 2
  601. GUI:setPosition(self.view.img_player_icon, x, z)
  602. end
  603. function this:OnPlayerTurnDir(_, dir)
  604. GUI:setRotation(self.view.img_player_icon, (dir + 1) * -45)
  605. end
  606. function this:SliderMapSizeOnEvent(_, _, value)
  607. local scale = value[1]
  608. self:ZoomMap(scale)
  609. end
  610. function this:ZoomMap(scale)
  611. GUI:setScale(self.view.panel_scene, scale * self.initMapScale)
  612. self.iconScale = 1 / (scale * self.initMapScale)
  613. for _, icon in pairs(self.iconMap) do
  614. GUI:setScale(icon.view.root, self.iconScale)
  615. end
  616. for _, point in pairs(self.showedRoadPoints) do
  617. GUI:setScale(point, self.iconScale)
  618. end
  619. GUI:setScale(self.view.img_player_icon, self.iconScale)
  620. if next(self.monsterPointTempList) then
  621. for _, v in pairs(self.monsterPointTempList) do
  622. v:setScale(1 / GUI:getScale(self.view.panel_scene))
  623. end
  624. end
  625. end
  626. function this:BtnMapZoomInOnClick()
  627. local percent = GUI:Slider_getPercent(self.view.slider_map_size)
  628. percent = percent + 0.2
  629. if percent > 2 then
  630. percent = 2
  631. end
  632. GUI:Slider_setPercent(self.view.slider_map_size, percent)
  633. self:ZoomMap(percent)
  634. end
  635. function this:BtnMapZoomOutOnClick()
  636. local percent = GUI:Slider_getPercent(self.view.slider_map_size)
  637. percent = percent - 0.2
  638. if percent < 1 then
  639. percent = 1
  640. end
  641. GUI:Slider_setPercent(self.view.slider_map_size, percent)
  642. self:ZoomMap(percent)
  643. end
  644. function this:TransferToShopNpc()
  645. local desc = "是否传送至奇迹币宝箱商城?"
  646. GUI:UIPanel_Open("dev/ui/Common/Panel/KLUICommonTips/KLUICommonTipsPanel", nil, nil,
  647. { showTips = desc,
  648. callback = function()
  649. self:BtnCloseOnClick()
  650. SL:SendTransferToNpcMessage(100115, true)
  651. end,
  652. callbackData = nil,
  653. ui = self })
  654. end
  655. --------------------大地图怪点-------------------------
  656. function this:ShowMonsterPoint(message)
  657. for _, v in pairs(self.monsterPointTempList) do
  658. self.MonsterPointPool:Push(v)
  659. end
  660. self.monsterPointTempList = {}---temp列表保存
  661. local monsterPoints = message.monsterStatus
  662. for i, v in pairs(monsterPoints) do
  663. if v.groupId ~= 0 then
  664. local monsterTbl = SL:GetConfig("cfg_monster", v.configId)
  665. local mongenTbl = SL:GetConfig("cfg_mongen", v.groupId)
  666. if monsterTbl and (monsterTbl.monsterShowIcon == 1 or monsterTbl.monsterShowName == 1 or monsterTbl.monsterShowLv == 1) then
  667. if (mongenTbl and mongenTbl.headpic == 1) or not next(mongenTbl) then
  668. local x, y = 0
  669. x = v.pointX / 256 * self.sceneImgWidth - self.sceneImgWidth / 2
  670. y = v.pointY / 256 * self.sceneImgHeight - self.sceneImgHeight / 2
  671. local monsterPointTemp = self.MonsterPointPool:Pop()
  672. if not next(monsterPointTemp) then
  673. monsterPointTemp = GUI:UIPanel_Open("dev/ui/Map/Item/KLMapMonsterPoint/KLMapMonsterPointItem", self.view.icon_parent, self, nil, true)
  674. end
  675. self.monsterPointTempList[v.monsterId] = monsterPointTemp
  676. monsterPointTemp:ShowBigMonsterIcon(v)
  677. monsterPointTemp:SetPanelXY(x, y)
  678. monsterPointTemp:SetPanelRotation(0)
  679. monsterPointTemp:setScale(1 / GUI:getScale(self.view.panel_scene))
  680. if v.status == 0 then
  681. monsterPointTemp:SetDead()
  682. else
  683. monsterPointTemp:SetLive()
  684. end
  685. end
  686. end
  687. end
  688. end
  689. end
  690. ---@param message MapProtos.MapMonsterStatus
  691. function this:ResMapMonsterStatusMessage(_, message)
  692. if message then
  693. self:ShowMonsterPoint(message)
  694. end
  695. end
  696. --[[---设置当前地图中死亡的怪物状态
  697. ---@param message MapProtos.MonsterStatus[]
  698. function this:MakeBigMapDeadMonsterIcon(message)
  699. for _, v in pairs(self.specialMonsterPointTempList) do
  700. v:SetActiveUI(false)
  701. self.specialMonsterPointPool:Push(v)
  702. end
  703. self.specialMonsterPointTempList = {}---temp列表保存
  704. for i, v in pairs(message) do
  705. if v.configId == 10008 then
  706. self:CreateSpecialMonsterIcon(v)
  707. else
  708. self:SetMonsterIcon(v)
  709. end
  710. end
  711. end
  712. ---刷新地图怪点
  713. ---@param message MapProtos.MonsterStatus
  714. function this:SetMonsterIcon(message)
  715. if self.monsterPointTempList[message.groupId] then
  716. self.monsterPointTempList[message.groupId]:SetActiveUI(true)
  717. if message.status == 0 then
  718. self.monsterPointTempList[message.groupId]:SetDead()
  719. else
  720. self.monsterPointTempList[message.groupId]:SetLive()
  721. end
  722. end
  723. end
  724. ---刷新地图怪点
  725. ---@param message MapProtos.MonsterStatus
  726. function this:SetSpecialMonsterIcon(message)
  727. if self.specialMonsterPointTempList[message.monsterId] then
  728. self.specialMonsterPointTempList[message.monsterId]:SetActiveUI(true)
  729. if message.status == 0 then
  730. self.specialMonsterPointTempList[message.monsterId]:SetDead()
  731. else
  732. self.specialMonsterPointTempList[message.monsterId]:SetLive()
  733. end
  734. end
  735. end
  736. ---刷新地图怪点
  737. ---@param message MapProtos.MonsterStatus
  738. function this:CreateSpecialMonsterIcon(message)
  739. ----@type cfg_monster_attack_column[]
  740. local cfg_monster_attackList =SL:GetConfigTable('cfg_monster_attack')
  741. if cfg_monster_attackList then
  742. local cfg_monster_attack = nil
  743. for k,v in pairs(cfg_monster_attackList) do
  744. if v.monid == message.configId then
  745. cfg_monster_attack = v
  746. break
  747. end
  748. end
  749. if cfg_monster_attack then
  750. local point = {[1] = message.pointX,[2] = message.pointY}
  751. local x, y = 0
  752. if table.count(point) > 1 then
  753. x = point[1]/256*self.sceneImgWidth - self.sceneImgWidth/2
  754. y = point[2]/256*self.sceneImgHeight - self.sceneImgHeight/2
  755. end
  756. ----@type KLMapMonsterPointItem
  757. local monsterPointTemp = self.specialMonsterPointPool:Pop()
  758. if not next(monsterPointTemp) then
  759. monsterPointTemp = GUI:UIPanel_Open("dev/ui/Map/Item/KLMapMonsterPoint/KLMapMonsterPointItem", self.view.icon_parent, self, nil, true)
  760. end
  761. --if not string.contains(monsterPointTemp.view.root.kmlControl.rectTransform.name,monsterPointTemp.panelName) then
  762. -- SL:LogError("dddddddddddddddddddddddd")
  763. --end
  764. self.specialMonsterPointTempList[message.monsterId] = monsterPointTemp
  765. monsterPointTemp:ShowBigMonsterIcon(cfg_monster_attack)
  766. monsterPointTemp:SetPanelXY(x, y)
  767. monsterPointTemp:SetPanelRotation(0)
  768. monsterPointTemp:setScale(1)
  769. monsterPointTemp:SetActiveUI(false)
  770. end
  771. end
  772. self:SetSpecialMonsterIcon(message)
  773. end]]
  774. return this