Rindro-Sqr/Project/WorldBoss/WorldBoss.nut

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);