414 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
		
		
			
		
	
	
			414 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
|  | /* | ||
|  | 文件名:WorldBoss.nut | ||
|  | 路径:Project/WorldBoss/WorldBoss.nut | ||
|  | 创建日期:2025-05-01	23:54 | ||
|  | 文件用途:世界BOSS | ||
|  | */ | ||
|  | 
 | ||
|  | class WorldBossC extends LenheartNewUI_Windows { | ||
|  |     //调试模式 | ||
|  |     // DeBugMode = true; | ||
|  | 
 | ||
|  |     //不是窗口 | ||
|  |     // NoWindow = true; | ||
|  | 
 | ||
|  |     //是否可见 | ||
|  |     Visible = false; | ||
|  | 
 | ||
|  |     WindowImg = Rindro_Image("hud/worldboss.img"); | ||
|  |     WindowTimeImg = Rindro_Image("hud/worldboss_time.img"); | ||
|  |     WindowTimeNumImg = Rindro_Image("hud/worldboss_timenum.img"); | ||
|  | 
 | ||
|  |     //基础信息 | ||
|  |     BaseInfo = null; | ||
|  | 
 | ||
|  |     //Pvf信息 | ||
|  |     PvfInfo = null; | ||
|  | 
 | ||
|  |     //伤害列表 | ||
|  |     RankList = null; | ||
|  | 
 | ||
|  | 
 | ||
|  |     //页面 | ||
|  |     Page = 0; | ||
|  |     //查询排名页数 | ||
|  |     CheckPage = 1; | ||
|  |     MaxPage = 50; | ||
|  | 
 | ||
|  | 
 | ||
|  |     //计时器 | ||
|  |     TiemrCache = null; | ||
|  |     Timer = null; | ||
|  | 
 | ||
|  |     //累计伤害 | ||
|  |     TotalDamage = null; | ||
|  | 
 | ||
|  |     constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH) { | ||
|  |         Childrens = []; | ||
|  | 
 | ||
|  |         InitButtonConfig(); | ||
|  |         //注册控件 | ||
|  |         RegisterWidget(); | ||
|  | 
 | ||
|  |         LenheartNewUI_Windows.constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH); | ||
|  | 
 | ||
|  | 
 | ||
|  |         Pack_Control.rawset(20060002, function(Chunk) { | ||
|  |             local Jso = Json.Decode(Chunk); | ||
|  |             BaseInfo = Jso; | ||
|  |         }.bindenv(this)); | ||
|  | 
 | ||
|  |         Pack_Control.rawset(20060006, function(Chunk) { | ||
|  |             local Jso = Json.Decode(Chunk); | ||
|  |             RankList = Jso.list; | ||
|  |         }.bindenv(this)); | ||
|  | 
 | ||
|  |         Pack_Control.rawset(20060014, function(Chunk) { | ||
|  |             local Jso = Json.Decode(Chunk); | ||
|  |             Timer = Clock(); | ||
|  |             TiemrCache = Jso.endTime; | ||
|  |         }.bindenv(this)); | ||
|  | 
 | ||
|  | 
 | ||
|  |         PushDamageFontFuncTab.rawset("DamagePerSecondCFunc", function(ObjAddress, MySelfAddress, Value) { | ||
|  |             if (!SendDamagePackFlag) return; | ||
|  |             if (ObjAddress == 0 || ObjAddress == MySelfAddress) { | ||
|  |                 if (!TotalDamage) TotalDamage = longlong(0); | ||
|  |                 TotalDamage += longlong(Value); | ||
|  |             } | ||
|  |         }.bindenv(this)); | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  |         // ChangePage(1); | ||
|  |         // SendPackEx({ | ||
|  |         //     op = 20060005, | ||
|  |         //     page = 1 | ||
|  |         // }) | ||
|  |     } | ||
|  | 
 | ||
|  |     function InitButtonConfig() { | ||
|  |         PvfInfo = Rindro_Script.GetFileData("etc/rindro/worldboss/worldboss.etc", function(DataTable, Data) { | ||
|  |             while (!Data.Eof()) { | ||
|  |                 local Key = Data.Get(); | ||
|  |                 if (Key == "[Enter Button]") { | ||
|  |                     DataTable.EnterButton <- { | ||
|  |                         x = Data.Get(), | ||
|  |                         y = Data.Get(), | ||
|  |                         width = Data.Get(), | ||
|  |                         height = Data.Get() | ||
|  |                     } | ||
|  |                 } else if (Key == "[Refresh Button]") { | ||
|  |                     DataTable.RefreshButton <- { | ||
|  |                         x = Data.Get(), | ||
|  |                         y = Data.Get(), | ||
|  |                         width = Data.Get(), | ||
|  |                         height = Data.Get() | ||
|  |                     } | ||
|  |                 } else if (Key == "[Rank List]") { | ||
|  |                     DataTable.RankList <- { | ||
|  |                         x = Data.Get(), | ||
|  |                         y = Data.Get() | ||
|  |                     } | ||
|  |                 } else if (Key == "[Time Countdown]") { | ||
|  |                     DataTable.Countdown <- { | ||
|  |                         x = Data.Get(), | ||
|  |                         y = Data.Get() | ||
|  |                     } | ||
|  |                 } | ||
|  |             } | ||
|  |         }.bindenv(this)); | ||
|  |     } | ||
|  | 
 | ||
|  | 
 | ||
|  |     //标题栏 | ||
|  |     Title = null; | ||
|  | 
 | ||
|  |     function ChangePage(ToPage) { | ||
|  |         foreach(ButtonObj in Title) { | ||
|  |             ButtonObj.State = 0; | ||
|  |         } | ||
|  |         Page = ToPage; | ||
|  |         Title[ToPage].State = 1; | ||
|  |     } | ||
|  | 
 | ||
|  |     function RegisterWidget() { | ||
|  |         Title = []; | ||
|  |         local Tabbars1 = LenheartNewUI_TabbarsText(2, 27, "玩法简介"); | ||
|  |         Tabbars1.State = 1; | ||
|  |         Tabbars1.SetTextOffset(7, 4); | ||
|  |         AddChild(Tabbars1); | ||
|  |         Tabbars1.OnClick = function() { | ||
|  |             ChangePage(0); | ||
|  |         }.bindenv(this); | ||
|  |         Title.append(Tabbars1); | ||
|  | 
 | ||
|  |         local Tabbars2 = LenheartNewUI_TabbarsText(64, 27, "世界BOSS"); | ||
|  |         Tabbars2.SetTextOffset(7, 4); | ||
|  |         AddChild(Tabbars2); | ||
|  |         Tabbars2.OnClick = function() { | ||
|  |             ChangePage(1); | ||
|  |         }.bindenv(this); | ||
|  |         Title.append(Tabbars2); | ||
|  | 
 | ||
|  | 
 | ||
|  |         //关闭按钮 | ||
|  |         local CloseButton = LenheartNewUI_BaseButton(600, 5, 11, 12, "interface/lenheartwindowcommon.img", 276); | ||
|  |         CloseButton.OnClick = function() { | ||
|  |             this.Visible = false; | ||
|  |         }.bindenv(this); | ||
|  |         Childrens.append(CloseButton); | ||
|  | 
 | ||
|  |         //进入按钮 | ||
|  |         local EnterButton = LenheartNewUI_BaseButton(PvfInfo.EnterButton.x, PvfInfo.EnterButton.y, PvfInfo.EnterButton.width, PvfInfo.EnterButton.height, "hud/worldboss.img", 1); | ||
|  |         EnterButton.OnClick = function() { | ||
|  |             SendPackEx({ | ||
|  |                 op = 20060007 | ||
|  |             }) | ||
|  |         }.bindenv(this); | ||
|  |         EnterButton.SetCallBackFunc(function(Btn) { | ||
|  |             if (Page == 1) | ||
|  |                 Btn.Visible = true; | ||
|  |             else | ||
|  |                 Btn.Visible = false; | ||
|  |         }.bindenv(this)) | ||
|  |         Childrens.append(EnterButton); | ||
|  | 
 | ||
|  |         //刷新按钮 | ||
|  |         local RefreshButton = LenheartNewUI_BaseButton(PvfInfo.RefreshButton.x, PvfInfo.RefreshButton.y, PvfInfo.RefreshButton.width, PvfInfo.RefreshButton.height, "hud/worldboss.img", 5); | ||
|  |         RefreshButton.OnClick = function() { | ||
|  | 
 | ||
|  |         }.bindenv(this); | ||
|  |         RefreshButton.SetCallBackFunc(function(Btn) { | ||
|  |             if (Page == 1) | ||
|  |                 Btn.Visible = true; | ||
|  |             else | ||
|  |                 Btn.Visible = false; | ||
|  |         }.bindenv(this)) | ||
|  |         Childrens.append(RefreshButton); | ||
|  | 
 | ||
|  | 
 | ||
|  |         //左按钮 | ||
|  |         local LeftButton = LenheartNewUI_BaseButton(PvfInfo.RankList.x + 150, PvfInfo.RankList.y + 284, 12, 9, "interface/lenheartwindowcommon.img", 511); | ||
|  |         LeftButton.OnClick = function() { | ||
|  |             if (CheckPage > 1) CheckPage--; | ||
|  |             SendPackEx({ | ||
|  |                 op = 20060005, | ||
|  |                 Page = CheckPage | ||
|  |             }) | ||
|  |         }.bindenv(this); | ||
|  |         LeftButton.SetCallBackFunc(function(Btn) { | ||
|  |             if (Page == 1) | ||
|  |                 Btn.Visible = true; | ||
|  |             else | ||
|  |                 Btn.Visible = false; | ||
|  |         }.bindenv(this)) | ||
|  |         Childrens.append(LeftButton); | ||
|  |         //关闭按钮 | ||
|  |         local RightButton = LenheartNewUI_BaseButton(PvfInfo.RankList.x + 196, PvfInfo.RankList.y + 284, 12, 9, "interface/lenheartwindowcommon.img", 521); | ||
|  |         RightButton.OnClick = function() { | ||
|  |             if (CheckPage< MaxPage) CheckPage++; | ||
|  |             SendPackEx({ | ||
|  |                 op = 20060005, | ||
|  |                 page = CheckPage | ||
|  |             }) | ||
|  |         }.bindenv(this); | ||
|  |         RightButton.SetCallBackFunc(function(Btn) { | ||
|  |             if (Page == 1) | ||
|  |                 Btn.Visible = true; | ||
|  |             else | ||
|  |                 Btn.Visible = false; | ||
|  |         }.bindenv(this)) | ||
|  |         Childrens.append(RightButton); | ||
|  |     } | ||
|  | 
 | ||
|  |     //悬停层绘制Flag | ||
|  |     HoverFlag = null; | ||
|  | 
 | ||
|  |     //绘制主界面 | ||
|  |     function DrawMain(obj) { | ||
|  |         //玩法简介 | ||
|  |         if (Page == 0) { | ||
|  |             WindowImg.DrawPng(0, X, Y); | ||
|  |         } | ||
|  |         //世界BOSS | ||
|  |         else if (Page == 1) { | ||
|  |             WindowImg.DrawPng(9, X, Y); | ||
|  |             WindowImg.DrawPng(10, X + PvfInfo.RankList.x, Y + PvfInfo.RankList.y); | ||
|  | 
 | ||
|  |             //绘制查询页数 | ||
|  |             local Str = CheckPage + "/" + MaxPage; | ||
|  |             L_sq_DrawCode(Str, X + PvfInfo.RankList.x + 179 - LenheartTextClass.GetStringLength(Str) / 2, Y + PvfInfo.RankList.y + 283, sq_RGBA(230, 200, 155, 255), 0, 1); | ||
|  | 
 | ||
|  |             HoverFlag = null; | ||
|  |             //绘制排行榜 | ||
|  |             if (RankList) { | ||
|  |                 foreach(Pos, info in RankList) { | ||
|  |                     local Rank = info.rank.tostring(); | ||
|  |                     L_sq_DrawCode(Rank, X + PvfInfo.RankList.x + 18 - LenheartTextClass.GetStringLength(Rank) / 2, Y + PvfInfo.RankList.y + 10 + (Pos * 20), sq_RGBA(230, 200, 155, 255), 0, 1); | ||
|  | 
 | ||
|  |                     local TeamName = info.teamName; | ||
|  |                     L_sq_DrawCode(TeamName, X + PvfInfo.RankList.x + 70 - LenheartTextClass.GetStringLength(TeamName) / 2, Y + PvfInfo.RankList.y + 10 + (Pos * 20), sq_RGBA(230, 200, 155, 255), 0, 1); | ||
|  | 
 | ||
|  |                     local Damage = info.totalDamage.tostring(); | ||
|  |                     L_sq_DrawCode(Damage, X + PvfInfo.RankList.x + 150 - LenheartTextClass.GetStringLength(Damage) / 2, Y + PvfInfo.RankList.y + 10 + (Pos * 20), sq_RGBA(230, 200, 155, 255), 0, 1); | ||
|  | 
 | ||
|  |                     if (sq_IsIntersectRect(IMouse.GetXPos(), IMouse.GetYPos(), 1, 1, X + PvfInfo.RankList.x, Y + PvfInfo.RankList.y + (Pos * 20), 200, 20)) { | ||
|  |                         HoverFlag = Pos; | ||
|  |                     } | ||
|  |                 } | ||
|  |             } | ||
|  | 
 | ||
|  |             //悬停层 | ||
|  |             if (HoverFlag != null) { | ||
|  |                 L_sq_DrawWindow(X + PvfInfo.RankList.x, Y + PvfInfo.RankList.y + (HoverFlag * 20), 200, 100, "interface/lenheartwindowcommon.img", 97, 11, 12, 11, 13); | ||
|  |                 L_sq_DrawWindow(X + PvfInfo.RankList.x, Y + PvfInfo.RankList.y + (HoverFlag * 20), 200, 100, "interface/lenheartwindowcommon.img", 97, 11, 12, 11, 13); | ||
|  | 
 | ||
|  |                 L_sq_DrawCode(RankList[HoverFlag].teamName, X + PvfInfo.RankList.x + 104 - LenheartTextClass.GetStringLength(RankList[HoverFlag].teamName) / 2, Y + PvfInfo.RankList.y + (HoverFlag * 20) + 14, sq_RGBA(83, 205, 255, 255), 0, 1); | ||
|  |                 local Yoffset = 40; | ||
|  |                 for (local Pos = 0; Pos < 4; Pos++) { | ||
|  |                     local info = { | ||
|  |                         name = "无队员", | ||
|  |                         job = "无职业", | ||
|  |                         damage = "0", | ||
|  |                         color = sq_RGBA(174, 174, 174, 255) | ||
|  |                     } | ||
|  |                     if(RankList[HoverFlag].team.len() > Pos) { | ||
|  |                         info = RankList[HoverFlag].team[Pos]; | ||
|  |                         info.color <- sq_RGBA(218, 248, 129, 255); | ||
|  |                     } | ||
|  |                     local Name = info.name; | ||
|  |                     L_sq_DrawCode(Name, X + PvfInfo.RankList.x + 28 - LenheartTextClass.GetStringLength(Name) / 2, Y + PvfInfo.RankList.y + (HoverFlag * 20) + Yoffset + (Pos * 20), info.color, 0, 1); | ||
|  |                     local Job = info.job; | ||
|  |                     L_sq_DrawCode(Job, X + PvfInfo.RankList.x + 110 - LenheartTextClass.GetStringLength(Job) / 2, Y + PvfInfo.RankList.y + (HoverFlag * 20) + Yoffset + (Pos * 20), info.color, 0, 1); | ||
|  | 
 | ||
|  |                     local Damage = info.damage.tostring(); | ||
|  |                     L_sq_DrawCode(Damage, X + PvfInfo.RankList.x + 202 - LenheartTextClass.GetStringLength(Damage), Y + PvfInfo.RankList.y + (HoverFlag * 20) + Yoffset + (Pos * 20), info.color, 0, 1); | ||
|  |                 } | ||
|  |             } | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  | 
 | ||
|  |     function DrawTime(obj) { | ||
|  |         if (!TiemrCache || !Timer) return; | ||
|  |         local DrawX = PvfInfo.Countdown.x; | ||
|  |         local DrawY = PvfInfo.Countdown.y; | ||
|  |         //背景绘制 | ||
|  |         WindowTimeImg.DrawPng(1, DrawX, DrawY); | ||
|  |         WindowTimeImg.DrawPng(0, DrawX, DrawY + 2); | ||
|  | 
 | ||
|  |         //时间绘制 | ||
|  |         local DrawTime = TiemrCache - (Clock() - Timer); | ||
|  |         local TotalSeconds = DrawTime / 1000; | ||
|  |         local Minutes = (TotalSeconds % 3600) / 60; | ||
|  |         local Seconds = (TotalSeconds % 3600) % 60; | ||
|  |         local Millisecond = DrawTime % 1000 / 10; | ||
|  | 
 | ||
|  |         local Offset = 43; | ||
|  |         DrawNum(format("%02d", Minutes), Offset); | ||
|  |         Offset += 40; | ||
|  |         WindowTimeNumImg.DrawPng(10, DrawX + Offset - 5, DrawY + 27); | ||
|  |         DrawNum(format("%02d", Seconds), Offset); | ||
|  |         Offset += 40; | ||
|  |         WindowTimeNumImg.DrawPng(10, DrawX + Offset - 5, DrawY + 27); | ||
|  |         DrawNum(format("%02d", Millisecond), Offset); | ||
|  |     } | ||
|  | 
 | ||
|  |     function DrawNum(time, Xoffset) { | ||
|  |         local DrawX = PvfInfo.Countdown.x; | ||
|  |         local DrawY = PvfInfo.Countdown.y; | ||
|  |         for (local i = 0; i< time.len(); i++) { | ||
|  |             local DrawNum = time.slice(i, i + 1); | ||
|  |             WindowTimeNumImg.DrawPng(DrawNum.tointeger(), DrawX + Xoffset + (i * 15), DrawY + 21); | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     function Show(obj) { | ||
|  |         DrawMain(obj); | ||
|  |         LenheartNewUI_Windows.Show(obj); | ||
|  | 
 | ||
|  |     } | ||
|  | 
 | ||
|  |     //进入副本初始化包Flag | ||
|  |     EnterMapPackFlag = false; | ||
|  |     //发送伤害包Flag | ||
|  |     SendDamagePackFlag = false; | ||
|  | 
 | ||
|  |     //副本逻辑 | ||
|  |     function DungeonLogic() { | ||
|  |         local stage = sq_GetGlobaludpModuleStage(); | ||
|  |         local mapIndex = sq_GetMapIndex(stage); | ||
|  |         local dungeon = sq_GetDungeonByStage(stage); | ||
|  |         local dungeonIndex = sq_GetDuegonIndex(dungeon); | ||
|  |         if (dungeonIndex == BaseInfo.dgn && mapIndex == BaseInfo.map) { | ||
|  |             if (!EnterMapPackFlag) { | ||
|  |                 EnterMapPackFlag = true; | ||
|  |                 SendPackEx({ | ||
|  |                     op = 20060013 | ||
|  |                 }) | ||
|  |             } | ||
|  |             SendDamagePackFlag = true; | ||
|  |         } else { | ||
|  |             SendDamagePackFlag = false; | ||
|  |             TiemrCache = null; | ||
|  |             Timer = null; | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     //发送伤害计时器 | ||
|  |     SendDamageT = 0; | ||
|  |     //逻辑入口 | ||
|  |     function Proc(obj) { | ||
|  |         LenheartNewUI_Windows.SyncPos(X, Y); | ||
|  |         if (!BaseInfo) return; | ||
|  |         DungeonLogic(); | ||
|  |         DrawTime(obj); | ||
|  | 
 | ||
|  |         //在副本中需要发送伤害的时候 | ||
|  |         if (TotalDamage) { | ||
|  |             if (SendDamagePackFlag) { | ||
|  |                 SendDamageT += Rindro_Duration; | ||
|  |                 if (SendDamageT > 5000) { | ||
|  |                     SendDamageT = 0; | ||
|  |                     SendPackEx({ | ||
|  |                         op = 20060017, | ||
|  |                         Damage = TotalDamage.Value | ||
|  |                     }) | ||
|  |                     TotalDamage = null; | ||
|  |                 } | ||
|  |             } | ||
|  |             //结束时再发一次 | ||
|  |             else { | ||
|  |                 SendPackEx({ | ||
|  |                     op = 20060017, | ||
|  |                     Damage = TotalDamage.Value | ||
|  |                 }) | ||
|  |                 TotalDamage = null; | ||
|  |             } | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     function OpenCallBack() { | ||
|  |         Visible = true; | ||
|  | 
 | ||
|  |         SendPackEx({ | ||
|  |             op = 20060005, | ||
|  |             page = 1 | ||
|  |         }) | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | 
 | ||
|  | function Lenheart_WorldBoss_Fun(obj) { | ||
|  |     local RootTab = getroottable(); | ||
|  |     if (!RootTab.rawin("WorldBoss_Obj")) { | ||
|  |         RootTab.rawset("WorldBoss_Obj", true); | ||
|  |         local Win = LenheartNewUI_CreateWindow(WorldBossC, "阿拉德守卫战窗口", ((getroottable().Rindro_Scr_Width - 620) / 2).tointeger(), 64, 620, 430, 28); | ||
|  |         EventList_Obj.AddEvent("阿拉德守卫战", 1001, Win); | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | getroottable()["LenheartFuncTab"].rawset("WorldBossFuncN", Lenheart_WorldBoss_Fun); | ||
|  | 
 |