413 lines
14 KiB
Plaintext
413 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);
|
|
|