572 lines
18 KiB
Plaintext
572 lines
18 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");
|
|
WindowLogoImg = Rindro_Image("hud/worldboss_logo.img");
|
|
WindowInfoImg = Rindro_Image("hud/worldboss_info.img");
|
|
|
|
//基础信息
|
|
BaseInfo = null;
|
|
|
|
//Pvf信息
|
|
PvfInfo = null;
|
|
|
|
//伤害列表
|
|
RankList = null;
|
|
|
|
//标题栏
|
|
Title = null;
|
|
//组队榜单按钮
|
|
TeamRankBtn = null;
|
|
//个人榜单按钮
|
|
PersonalRankBtn = null;
|
|
|
|
|
|
|
|
//页面
|
|
Page = 0;
|
|
//查询排名
|
|
CheckType = 0; //0组队 1个人
|
|
RankPage = 0; //当前页数
|
|
MaxRankPage = 1; //最大页数
|
|
|
|
//奖励
|
|
RewardList = null;
|
|
RewardType = 0;
|
|
|
|
//排行榜
|
|
RankObject = null;
|
|
MyRankObject = null;
|
|
|
|
|
|
|
|
//计时器
|
|
TiemrCache = null;
|
|
Timer = null;
|
|
|
|
//累计伤害
|
|
TotalDamage = null;
|
|
|
|
constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH) {
|
|
Childrens = [];
|
|
|
|
//注册控件
|
|
RegisterWidget();
|
|
LenheartNewUI_Windows.constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH);
|
|
|
|
|
|
Pack_Control.rawset(20060002, function(Chunk) {
|
|
local Jso = Json.Decode(Chunk);
|
|
BaseInfo = Jso;
|
|
//临时
|
|
for (local i = 0; i< BaseInfo.info.len(); i++) {
|
|
if (i == 0) BaseInfo.info[i].boss_name <- "斯卡萨侵袭";
|
|
else BaseInfo.info[i].boss_name <- "世界BOSS" + i;
|
|
}
|
|
RegisterBossPage();
|
|
ChangePage(0);
|
|
}.bindenv(this));
|
|
|
|
//获取奖励
|
|
Pack_Control.rawset(20060012, function(Chunk) {
|
|
local Jso = Json.Decode(Chunk);
|
|
RewardList = [];
|
|
RewardList.append(Jso.rewards);
|
|
RewardList.append(Jso.rewards2);
|
|
}.bindenv(this));
|
|
|
|
Pack_Control.rawset(20060006, function(Chunk) {
|
|
local Jso = Json.Decode(Chunk);
|
|
MaxRankPage = Jso.maxPage;
|
|
RankObject = [];
|
|
foreach(Info in Jso.list) {
|
|
local T = {
|
|
idx = Info.rank,
|
|
name = Info.name,
|
|
time = "15:20",
|
|
damage = Info.damage,
|
|
teamid = Info.teamId,
|
|
};
|
|
local Buffer = WorldBossC_Item(this, T);
|
|
RankObject.append(Buffer);
|
|
}
|
|
if (Jso.rawin("myteam")) {
|
|
MyRankObject = WorldBossC_Item(this, {
|
|
idx = Jso.myteam.rank,
|
|
name = "我的队伍",
|
|
time = "15:20",
|
|
damage = Jso.myteam.damage,
|
|
teamid = Jso.myteam.teamId,
|
|
self = true
|
|
})
|
|
}
|
|
}.bindenv(this));
|
|
|
|
Pack_Control.rawset(20060026, function(Chunk) {
|
|
local Jso = Json.Decode(Chunk);
|
|
MaxRankPage = Jso.maxPage;
|
|
RankObject = [];
|
|
foreach(Info in Jso.list) {
|
|
local T = {
|
|
idx = Info.rank,
|
|
name = Info.name,
|
|
time = Info.time,
|
|
damage = Info.damage,
|
|
};
|
|
local Buffer = WorldBossC_Item(this, T);
|
|
RankObject.append(Buffer);
|
|
}
|
|
if (Jso.rawin("myteam")) {
|
|
MyRankObject = WorldBossC_Item(this, {
|
|
idx = Jso.myteam.rank,
|
|
name = "我的队伍",
|
|
time = Jso.myteam.time,
|
|
damage = Jso.myteam.damage,
|
|
self = true
|
|
})
|
|
}
|
|
}.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));
|
|
|
|
|
|
// RankObject = [];
|
|
// for (local i = 0; i< 7; i++) {
|
|
// local Buffer = WorldBossC_Item(this, {
|
|
// idx = i,
|
|
// name = "倾泪寒的队伍" + i,
|
|
// time = "15:20",
|
|
// damage = Clock().tostring(),
|
|
// });
|
|
// RankObject.append(Buffer);
|
|
// }
|
|
// MyRankObject = WorldBossC_Item(this, {
|
|
// idx = 56,
|
|
// name = "我的队伍",
|
|
// time = "15:20",
|
|
// damage = Clock().tostring(),
|
|
// self = true
|
|
// });
|
|
}
|
|
|
|
//请求奖励信息
|
|
function RequestRewardInformation() {
|
|
if (Page == null) return;
|
|
local T = {
|
|
op = 20060001,
|
|
index = Page
|
|
}
|
|
SendPackEx(T);
|
|
}
|
|
|
|
|
|
function ChangePage(ToPage) {
|
|
Page = ToPage;
|
|
RankPage = 0; //重置页数
|
|
CheckRank();
|
|
RequestRewardInformation();
|
|
}
|
|
|
|
function CheckRank() {
|
|
local T = {
|
|
//0查组队 否则查个人
|
|
op = (CheckType == 0 ? 20060005 : 20060025),
|
|
index = Page,
|
|
page = RankPage
|
|
}
|
|
SendPackEx(T);
|
|
}
|
|
|
|
function RegisterBossPage() {
|
|
Title = [];
|
|
|
|
local LogicFunc = function(Btn) {
|
|
foreach(Pos, obj in Title) {
|
|
if (obj != Btn) obj.State = 0;
|
|
else {
|
|
obj.State = 1;
|
|
ChangePage(Pos);
|
|
}
|
|
}
|
|
};
|
|
|
|
//遍历有多少个Boss
|
|
foreach(Pos, Info in BaseInfo.info) {
|
|
local Tabbars1 = LenheartNewUI_TabbarsText(6 + (Pos * 61), 23, Info.boss_name);
|
|
if (Pos == 0) Tabbars1.State = 1;
|
|
Tabbars1.SetTextOffset(31 - LenheartTextClass.GetStringLength(Info.boss_name) / 2, 4);
|
|
AddChild(Tabbars1);
|
|
Tabbars1.OnClickEx = LogicFunc.bindenv(this);
|
|
Title.append(Tabbars1);
|
|
}
|
|
}
|
|
|
|
function RegisterWidget() {
|
|
|
|
//关闭按钮
|
|
local CloseButton = LenheartNewUI_BaseButton(738, 3, 11, 12, "interface/lenheartwindowcommon.img", 276);
|
|
CloseButton.OnClick = function() {
|
|
this.Visible = false;
|
|
}.bindenv(this);
|
|
Childrens.append(CloseButton);
|
|
|
|
local RankingRewardsButton = LenheartNewUI_ButtonText(42, 472, 40, "排名奖励");
|
|
RankingRewardsButton.SetTextOffset(6, 1);
|
|
RankingRewardsButton.OnClickEx = function(Btn) {
|
|
RewardType = 0;
|
|
}.bindenv(this);
|
|
AddChild(RankingRewardsButton);
|
|
|
|
local BasicRewardsButton = LenheartNewUI_ButtonText(170, 472, 40, "基础奖励");
|
|
BasicRewardsButton.SetTextOffset(6, 1);
|
|
BasicRewardsButton.OnClickEx = function(Btn) {
|
|
RewardType = 1;
|
|
}.bindenv(this);
|
|
AddChild(BasicRewardsButton);
|
|
|
|
local PurchaseTicketsButton = LenheartNewUI_ButtonText(420, 478, 150, "开始挑战");
|
|
PurchaseTicketsButton.SetTextOffset(59, 1);
|
|
PurchaseTicketsButton.OnClickEx = function(Btn) {
|
|
local T = {
|
|
op = 20060007,
|
|
index = Page
|
|
}
|
|
SendPackEx(T);
|
|
}.bindenv(this);
|
|
AddChild(PurchaseTicketsButton);
|
|
|
|
|
|
TeamRankBtn = LenheartNewUI_TabbarsText(305, 84, "组队榜单");
|
|
TeamRankBtn.State = 1;
|
|
TeamRankBtn.SetTextOffset(7, 4);
|
|
TeamRankBtn.OnClickEx = function(Btn) {
|
|
if (Btn.State == 1) return;
|
|
PersonalRankBtn.State = 0;
|
|
Btn.State = 1;
|
|
CheckType = 0;
|
|
CheckRank();
|
|
}.bindenv(this);
|
|
AddChild(TeamRankBtn);
|
|
|
|
PersonalRankBtn = LenheartNewUI_TabbarsText(366, 84, "个人榜单");
|
|
PersonalRankBtn.SetTextOffset(7, 4);
|
|
PersonalRankBtn.OnClickEx = function(Btn) {
|
|
if (Btn.State == 1) return;
|
|
TeamRankBtn.State = 0;
|
|
Btn.State = 1;
|
|
CheckType = 1;
|
|
CheckRank();
|
|
}.bindenv(this);
|
|
AddChild(PersonalRankBtn);
|
|
|
|
//左翻页按钮
|
|
local LeftButton = LenheartNewUI_BaseButton(480, 416, 15, 15, "interface/lenheartwindowcommon.img", 34);
|
|
LeftButton.OnClick = function() {
|
|
if (RankPage > 0) {
|
|
RankPage--;
|
|
CheckRank();
|
|
}
|
|
}.bindenv(this);
|
|
AddChild(LeftButton);
|
|
|
|
//右翻页按钮
|
|
local RightButton = LenheartNewUI_BaseButton(550, 416, 15, 15, "interface/lenheartwindowcommon.img", 38);
|
|
RightButton.OnClick = function() {
|
|
if (RankPage<(MaxRankPage - 1)) {
|
|
RankPage++;
|
|
CheckRank();
|
|
}
|
|
}.bindenv(this);
|
|
AddChild(RightButton);
|
|
|
|
for (local i = 0; i< 8; i++) {
|
|
local ButtonBuffer = LenheartNewUI_BaseButton(700, 139 + (i * 40), 25, 25, "interface/lenheartwindowcommon.img", 362);
|
|
ButtonBuffer.Data = i;
|
|
ButtonBuffer.OnClickEx = function(Btn) {
|
|
if (RankObject && Btn.Data< RankObject.len()) {
|
|
local T = {
|
|
op = 20060003,
|
|
index = Page,
|
|
teamId = RankObject[Btn.Data].Info.teamid
|
|
}
|
|
SendPackEx(T);
|
|
}
|
|
}.bindenv(this);
|
|
ButtonBuffer.SetCallBackFunc(function(Btn) {
|
|
if (RankObject && Btn.Data< RankObject.len() && CheckType == 0) Btn.Visible = true;
|
|
else Btn.Visible = false;
|
|
}.bindenv(this));
|
|
Childrens.append(ButtonBuffer);
|
|
}
|
|
}
|
|
|
|
//悬停层绘制Flag
|
|
HoverFlag = null;
|
|
|
|
//绘制主界面
|
|
function DrawMain(obj) {
|
|
|
|
if (Page != null) {
|
|
WindowLogoImg.DrawExPng(Page, X + 1, Y + 19, 0, sq_RGBA(255, 255, 255, 220), 1.0, 1.0);
|
|
}
|
|
|
|
WindowImg.DrawPng(0, X, Y);
|
|
|
|
if (Page != null) {
|
|
WindowInfoImg.DrawExPng(Page, X + 19, Y + 66, 0, sq_RGBA(255, 255, 255, 220), 1.0, 1.0);
|
|
}
|
|
|
|
DrawNineBox(X + 26, Y + 416, 260, 42, "interface/lenheartwindowcommon.img", 213); //背景框
|
|
DrawNineBox(X + 308, Y + 106, 433, 26, "interface/lenheartwindowcommon.img", 213); //榜单表头
|
|
L_sq_DrawCode("名次", X + 330, Y + 113, sq_RGBA(230, 200, 155, 255), 0, 1);
|
|
L_sq_DrawCode(CheckType == 0 ? "队伍名称" : "玩家名称", X + 408, Y + 113, sq_RGBA(230, 200, 155, 255), 0, 1);
|
|
L_sq_DrawCode("战斗时长", X + 510, Y + 113, sq_RGBA(230, 200, 155, 255), 0, 1);
|
|
L_sq_DrawCode("总伤害", X + 604, Y + 113, sq_RGBA(230, 200, 155, 255), 0, 1);
|
|
L_sq_DrawCode("详细", X + 700, Y + 113, sq_RGBA(230, 200, 155, 255), 0, 1);
|
|
|
|
local RankPageStr = (RankPage + 1) + "/" + MaxRankPage;
|
|
L_sq_DrawCode(RankPageStr, X + 524 - LenheartTextClass.GetStringLength(RankPageStr) / 2, Y + 418, sq_RGBA(230, 200, 155, 255), 0, 1);
|
|
if (RewardList) {
|
|
foreach(Pos, ItemId in RewardList[RewardType]) {
|
|
DrawItemEx(X + 34 + (Pos * 36), Y + 423, ItemId, 1);
|
|
}
|
|
}
|
|
|
|
if (RankObject) {
|
|
foreach(Pos, Object in RankObject) {
|
|
Object.Show(X + 309, Y + 132 + (Pos * 40));
|
|
}
|
|
}
|
|
if (MyRankObject) {
|
|
MyRankObject.Show(X + 309, Y + 434);
|
|
}
|
|
}
|
|
|
|
function TopShow(obj) {
|
|
LenheartNewUI_Windows.TopShow(obj);
|
|
local MousePos_X = IMouse.GetXPos();
|
|
local MousePos_Y = IMouse.GetYPos();
|
|
if (RankObject) {
|
|
foreach(Pos, Object in RankObject) {
|
|
if (sq_IsIntersectRect(MousePos_X, MousePos_Y, 1, 1, X + 309, Y + 131 + (Pos * 39), 433, 39)) {
|
|
Object.HoverShow(X + 309, Y + 132 + (Pos * 40));
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
DrawTime(obj);
|
|
}
|
|
|
|
|
|
function DrawTime(obj) {
|
|
if (!TiemrCache || !Timer) return;
|
|
local CountdownX = 300;
|
|
local CountdownY = 0;
|
|
local DrawX = CountdownX;
|
|
local DrawY = CountdownY;
|
|
//背景绘制
|
|
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) {
|
|
if (!TiemrCache || !Timer) return;
|
|
local CountdownX = 300;
|
|
local CountdownY = 0;
|
|
local DrawX = CountdownX;
|
|
local DrawY = CountdownY;
|
|
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);
|
|
if (mapIndex == -1) {
|
|
SendDamagePackFlag = false;
|
|
EnterMapPackFlag = false;
|
|
TiemrCache = null;
|
|
Timer = null;
|
|
}
|
|
local dungeon = sq_GetDungeonByStage(stage);
|
|
local dungeonIndex = sq_GetDuegonIndex(dungeon);
|
|
if (dungeonIndex == BaseInfo.info[Page].dgn && mapIndex == BaseInfo.info[Page].map) {
|
|
if (!EnterMapPackFlag) {
|
|
EnterMapPackFlag = true;
|
|
SendPackEx({
|
|
op = 20060013,
|
|
index = Page
|
|
})
|
|
}
|
|
SendDamagePackFlag = true;
|
|
} else {
|
|
SendDamagePackFlag = false;
|
|
EnterMapPackFlag = 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,
|
|
index = Page,
|
|
Damage = TotalDamage.Value
|
|
})
|
|
// print("发送伤害: " + TotalDamage.Value)
|
|
|
|
TotalDamage = null;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
function OpenCallBack() {
|
|
Visible = true;
|
|
}
|
|
}
|
|
|
|
|
|
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 - 753) / 2).tointeger(), 40, 753, 518, 20);
|
|
EventList_Obj.AddEvent("阿拉德守卫战", 1001, Win);
|
|
}
|
|
}
|
|
|
|
getroottable()["LenheartFuncTab"].rawset("WorldBossFuncN", Lenheart_WorldBoss_Fun);
|
|
|
|
|
|
|
|
|
|
|
|
L_Windows_List <- [];
|
|
getroottable().rawdelete("LenheartPluginsInitFlag");
|
|
getroottable().rawdelete("EventList_Obj")
|
|
getroottable().rawdelete("WorldBoss_Obj");
|
|
|
|
|
|
|
|
class WorldBossC_Item {
|
|
//Img
|
|
Img = null;
|
|
//父对象
|
|
Parent = null;
|
|
//信息
|
|
Info = null;
|
|
|
|
constructor(Window, Info) {
|
|
Parent = Window;
|
|
Img = Window.WindowImg;
|
|
this.Info = Info;
|
|
}
|
|
|
|
function Show(X, Y) {
|
|
if (!Info.rawin("self")) Img.DrawPng(1, X, Y);
|
|
else Parent.DrawNineBox(X + 0, Y + 2, 432, 35, "interface/lenheartwindowcommon.img", 204);
|
|
|
|
local IdxStr = Info.idx.tostring();
|
|
L_sq_DrawCode(IdxStr, X + 32 - LenheartTextClass.GetStringLength(IdxStr) / 2, Y + 10, sq_RGBA(230, 200, 155, 255), 2, 1);
|
|
|
|
|
|
L_sq_DrawCode(Info.name, X + 125 - LenheartTextClass.GetStringLength(Info.name) / 2, Y + 14, sq_RGBA(230, 200, 155, 255), 0, 1);
|
|
|
|
L_sq_DrawCode(Info.time.tostring(), X + 230 - LenheartTextClass.GetStringLength(Info.time.tostring()) / 2, Y + 14, sq_RGBA(230, 200, 155, 255), 0, 1);
|
|
|
|
L_sq_DrawCode(Info.damage, X + 313 - LenheartTextClass.GetStringLength(Info.damage) / 2, Y + 14, sq_RGBA(230, 200, 155, 255), 0, 1);
|
|
}
|
|
|
|
|
|
function HoverShow(X, Y) {
|
|
Img.DrawPng(2, X, Y);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// L_sq_GoDungeon(20501); |