/* 文件名:TH_CombatRank.nut 路径:Project/TH_CombatRank/TH_CombatRank.nut 创建日期:2025-07-01 10:18 文件用途:战力排行榜 */ class TH_CombatRankC extends LenheartNewUI_Windows { //调试模式 // DeBugMode = true; //不是窗口 // NoWindow = true; //是否可见 Visible = false; Img = null; TitleButtonList = null; //个人 公会 Page = 0; Test = null; //个人战力集合 CombatInfoList = null; //个人奖励集合 PersonReward = null; //查看中的详细个人信息 LookingInfo = null; //我的战力 MyCombat = null; //公会奖励集合 GuildReward = null; GuildFlagData = null; GuildFlagImgMap = null; //公会战力集合 GuildInfoList = null; //滚动条 ScrollBar = null; ScrollBarRate = 0; ScrollBarValue = 604; function CheckPersonalCombatPower() { SendPackEx({ op = 20096003 }) } function CheckGuildCombatPower() { SendPackEx({ op = 20096005 }) } constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH) { Childrens = []; TitleButtonList = []; //注册控件 RegisterWidget(); LenheartNewUI_Windows.constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH); Img = {}; Img["main"] <- Rindro_Image("interface/rindro/thnew_rank.img"); Img["information_button_cn"] <- Rindro_Image("interface2/hud/information_button/information_button_cn.img"); Img["newuserinfo"] <- Rindro_Image("interface/userinfomation/newuserinfo.img"); //基础配置数据回包 RegisterPack(20096102, function(Chunk) { local Jso = Json.Decode(Chunk); PersonReward = Jso["config"]; }.bindenv(this)); //基础公会数据回包 RegisterPack(20096104, function(Chunk) { local Jso = Json.Decode(Chunk); GuildReward = Jso["config"]; GuildFlagData = {}; GuildFlagImgMap = {}; foreach(object in Jso["config2"]) { GuildFlagData.rawset(object.guildId, [object.img, object.imgid]); } }.bindenv(this)); //查询个人战力排行榜包 RegisterPack(20096004, function(Chunk) { local Jso = Json.Decode(Chunk); local ranking = Jso.ranking; CombatInfoList = []; foreach(Pos, Info in ranking) { //补全默认公会 if (!Info.rawin("guildname")) Info.guildname <- "无公会"; //构造显示对象 local Buf = TH_CombatRankC_Item(this, Pos, Info, 0); CombatInfoList.append(Buf); } //构造我自己 if(!Jso.my.rawin("guildname")) Jso.my.guildname <- "无公会"; MyCombat = TH_CombatRankC_Item(this, 900, Jso.my, 0); MyCombat.Idx = Jso.on - 1; }.bindenv(this)); RegisterPack(20096006, function(Chunk) { local Jso = Json.Decode(Chunk); local ranking = Jso.ranking; GuildInfoList = []; foreach(Pos, Info in ranking) { local Buf = TH_CombatRankC_Item(this, Pos, Info, 1); GuildInfoList.append(Buf); } }.bindenv(this)); CheckPersonalCombatPower(); CheckGuildCombatPower(); UploadYourOwnCombatPower(); } function RegisterWidget() { //返回按钮 local ReturnButton = LenheartNewUI_BaseButton(506, 6, 11, 12, "interface/lenheartwindowcommon.img", 540); ReturnButton.OnClick = function() { LookingInfo = null; }.bindenv(this); Childrens.append(ReturnButton); //关闭按钮 local CloseButton = LenheartNewUI_BaseButton(521, 2, 11, 12, "interface/lenheartwindowcommon.img", 276); CloseButton.OnClick = function() { this.Visible = false; }.bindenv(this); Childrens.append(CloseButton); local FuncTabbar1 = LenheartNewUI_TabbarsText(4, 23, "巅峰战力"); FuncTabbar1.State = 1; FuncTabbar1.SetTextOffset(8, 4); AddChild(FuncTabbar1); FuncTabbar1.OnClick = function() { TitleButtonList[1].State = 0; TitleButtonList[0].State = 1; TitleButtonList[2].State = 0; Page = 0; LookingInfo = null; ScrollBar.Reset(); }.bindenv(this); TitleButtonList.append(FuncTabbar1); local FuncTabbar2 = LenheartNewUI_TabbarsText(65, 23, "公会战力"); FuncTabbar2.SetTextOffset(8, 4); AddChild(FuncTabbar2); FuncTabbar2.OnClick = function() { TitleButtonList[0].State = 0; TitleButtonList[1].State = 1; TitleButtonList[2].State = 0; Page = 1; LookingInfo = null; ScrollBar.Reset(); }.bindenv(this); TitleButtonList.append(FuncTabbar2); local FuncTabbar3 = LenheartNewUI_TabbarsText(476, 23, "我的战力"); FuncTabbar3.SetTextOffset(8, 4); AddChild(FuncTabbar3); FuncTabbar3.OnClick = function() { TitleButtonList[0].State = 0; TitleButtonList[1].State = 0; TitleButtonList[2].State = 1; Page = 0; LookingInfo = MyCombat; ScrollBar.Reset(); }.bindenv(this); TitleButtonList.append(FuncTabbar3); ScrollBar = Yosin_ScrollBar(530, 315, 198, 50); ScrollBar.SetParent(this); ScrollBar.SetStep(20 / 100.0); ScrollBar.SetOnChange(function(Rate) { ScrollBarRate = Rate; }.bindenv(this)); } //绘制主界面 function DrawMain(obj) { Img["main"].DrawPng(0, X, Y); Img["main"].DrawPng(0, X, Y); Img["main"].DrawPng(0, X, Y); Img["information_button_cn"].DrawPng(136, X + 5, Y + 295); if (Page == 0) { //职业 L_sq_DrawCode("职业", X + 58, Y + 299, sq_RGBA(179, 169, 135, 255), 0, 1); //角色名 L_sq_DrawCode("角色名", X + 152, Y + 299, sq_RGBA(179, 169, 135, 255), 0, 1); //公会名 L_sq_DrawCode("战斗力", X + 280, Y + 299, sq_RGBA(179, 169, 135, 255), 0, 1); //战斗力 L_sq_DrawCode(" 奖励", X + 438, Y + 299, sq_RGBA(179, 169, 135, 255), 0, 1); setClip(X, Y + 316, X + 528, Y + 316 + 196); if (CombatInfoList) { foreach(Pos, Object in CombatInfoList) { Object.Show(X, Y + 316 + (Pos * 40) - (ScrollBarRate * ScrollBarValue).tointeger()); } } releaseClip(); //裁切结束 //绘制前三名 if (CombatInfoList) { for (local i = 0; i< 3; i++) { //如果不足3个 if (i >= CombatInfoList.len()) break; local OffsetX = 270; local OffsetY = 268; if (i == 1) { OffsetX = 130; OffsetY = 268; } if (i == 2) { OffsetX = 410; OffsetY = 268; } if(!LookingInfo || LookingInfo.Idx != i)CombatInfoList[i].ShowCharacter(X + OffsetX, Y + OffsetY); } } //如果有查看者 if (LookingInfo) { Img["main"].DrawPng(7, X + 2, Y + 44); Img["information_button_cn"].DrawPng(136, X + 5, Y + 295); T_DrawDynamicAni(obj, "ui/selectcharacter/animation/selectcharactereffect.ani", X + 15, Y + 50, "桃花战斗力角色背景光环"); Img["main"].DrawPng(8, X + 30, Y + 160); // LookingInfo.CharacShow.Draw(X + 80, Y + 248); LookingInfo.ShowCharacter(X + 80, Y + 248); local YPosBuffer = Y - 5; //排名 L_sq_DrawCode("排名: " + (LookingInfo.Idx + 1), X + 150, YPosBuffer + 60, sq_RGBA(230, 200, 155, 255), 0, 1); //角色名 L_sq_DrawCode("角色名: " + LookingInfo.Info.name, X + 150, YPosBuffer + 78, sq_RGBA(230, 200, 155, 255), 0, 1); //职业 L_sq_DrawCode("角色职业: " + LookingInfo.Info.jobname, X + 150, YPosBuffer+ 96, sq_RGBA(230, 200, 155, 255), 0, 1); //等级 L_sq_DrawCode("角色等级: " + LookingInfo.Info.level, X + 150, YPosBuffer + 114, sq_RGBA(230, 200, 155, 255), 0, 1); //公会名 L_sq_DrawCode("所属公会: " + LookingInfo.Info.guildname, X + 150, YPosBuffer + 132, sq_RGBA(230, 200, 155, 255), 0, 1); //是否在线 L_sq_DrawCode("当前状态: " + (LookingInfo.Info.isOnline ? "在线" : "离线"), X + 150, YPosBuffer + 150, sq_RGBA(230, 200, 155, 255), 0, 1); //战斗力 L_sq_DrawCode("战斗力: " + LookingInfo.Info.zdlS, X + 150, YPosBuffer+ 168, sq_RGBA(230, 200, 155, 255), 0, 1); L_sq_DrawCode("-- 基础战斗力: " + LookingInfo.Info.jczdlS, X + 150, YPosBuffer + 186, sq_RGBA(179, 169, 135, 255), 0, 1); L_sq_DrawCode(" 四维: " + LookingInfo.Info.swzldS, X + 150, YPosBuffer + 204, sq_RGBA(179, 169, 135, 255), 0, 1); L_sq_DrawCode(" 三攻: " + LookingInfo.Info.sgzldS, X + 150, YPosBuffer + 222, sq_RGBA(179, 169, 135, 255), 0, 1); L_sq_DrawCode(" 属强: " + LookingInfo.Info.sqzldS, X + 150, YPosBuffer + 240, sq_RGBA(179, 169, 135, 255), 0, 1); L_sq_DrawCode(" 其他: " + LookingInfo.Info.qtzldS, X + 150, YPosBuffer + 258, sq_RGBA(179, 169, 135, 255), 0, 1); L_sq_DrawCode("-- 魂石战斗力: " + LookingInfo.Info.fstS, X + 150, YPosBuffer + 276, sq_RGBA(179, 169, 135, 255), 0, 1); } } if (Page == 1) { //职业 L_sq_DrawCode("会长", X + 58, Y + 299, sq_RGBA(179, 169, 135, 255), 0, 1); //角色名 L_sq_DrawCode("公会名称", X + 152, Y + 299, sq_RGBA(179, 169, 135, 255), 0, 1); //公会名 L_sq_DrawCode("战斗力", X + 280, Y + 299, sq_RGBA(179, 169, 135, 255), 0, 1); //战斗力 L_sq_DrawCode(" 奖励", X + 438, Y + 299, sq_RGBA(179, 169, 135, 255), 0, 1); setClip(X, Y + 316, X + 528, Y + 316 + 196); if (GuildInfoList) { foreach(Pos, Object in GuildInfoList) { Object.Show(X, Y + 316 + (Pos * 40) - (ScrollBarRate * ScrollBarValue).tointeger()); } } releaseClip(); //裁切结束 if (GuildInfoList) { for (local i = 0; i< 3; i++) { if (GuildInfoList.len() <= i) break; local OffsetX = 270; local OffsetY = 268; if (i == 1) { OffsetX = 130; OffsetY = 268; } if (i == 2) { OffsetX = 410; OffsetY = 268; } local Object = GuildInfoList[i]; local GuildId = Object.Info.guildId; if (GuildFlagData.rawin(GuildId)) { local Info = GuildFlagData[GuildId]; if (!GuildFlagImgMap.rawin(Info[0])) { GuildFlagImgMap[Info[0]] <- Rindro_Image(Info[0]); } GuildFlagImgMap[Info[0]].DrawPng(0, X + OffsetX, Y + OffsetY); } else { Img["main"].DrawPng(3, X + OffsetX, Y + OffsetY); } } } } } function Show(obj) { DrawMain(obj); LenheartNewUI_Windows.Show(obj); } function TopShow(obj) { LenheartNewUI_Windows.TopShow(obj); local MousePos_X = IMouse.GetXPos(); local MousePos_Y = IMouse.GetYPos(); if (CombatInfoList && Page == 0) { setClip(X, Y + 316, X + 528, Y + 316 + 196); foreach(Pos, Object in CombatInfoList) { if (sq_IsIntersectRect(MousePos_X, MousePos_Y, 1, 1, X, Y + 316 + (Pos * 40) - (ScrollBarRate * ScrollBarValue).tointeger(), 526, 39)) { Object.HoverShow(X, Y + 316 + (Pos * 40) - (ScrollBarRate * ScrollBarValue).tointeger()); } } releaseClip(); //裁切结束 } } function DrawItemBase(X, Ypos, Id, Count) { if ((Ypos + 28) > this.Y + 316 && Ypos< this.Y + 316 + 196) { LenheartNewUI_Windows.DrawItemBase(X, Ypos, Id, Count); } } //鼠标滚轮事件回调 function OnMouseWheel(Flag, MousePos_X, MousePos_Y) { LenheartNewUI_BaseWindow.OnMouseWheel(Flag, MousePos_X, MousePos_Y); //左侧的滚动条判定 if (MousePos_X > X && MousePos_X<(X + 528) && MousePos_Y > (Y + 316) && MousePos_Y<(Y + 316 + 196)) { if (Flag) ScrollBar.DoStep(-1); if (!Flag) ScrollBar.DoStep(1); } } //鼠标左键按下回调 function OnMouseLbDown(MousePos_X, MousePos_Y) { LenheartNewUI_BaseWindow.OnMouseLbDown(MousePos_X, MousePos_Y); if (CombatInfoList) { foreach(Pos, Object in CombatInfoList) { if (sq_IsIntersectRect(MousePos_X, MousePos_Y, 1, 1, X, Y + 316 + (Pos * 40) - (ScrollBarRate * ScrollBarValue).tointeger(), 526, 39)) { Object.OnMouseLbDown(X, Y + 316 + (Pos * 40) - (ScrollBarRate * ScrollBarValue).tointeger()); } } } } //逻辑入口 function Proc(obj) { LenheartNewUI_Windows.SyncPos(X, Y); } //上传自身战斗力 //时装 帽子 头部 脸 上衣 下装 鞋子 胸部 腰部 皮肤 光环 // AvatarInfoIdx = [0x3038, 0x3010, 0x3014, 0x3018, 0x301c, 0x3020, 0x3024, 0x3028, 0x302c, 0x3034]; AvatarInfoIdx = [0x3038, 0x3010, 0x3014, 0x3018, 0x301c, 0x3020, 0x3024, 0x3028, 0x302c, 0x3030, 0x3034]; creInfoIdx = [0x3068, 0x306C, 0x3070, 0x3074]; function UploadYourOwnCombatPower() { if (sq_GetCurrentModuleType() != 1) return; local obj = sq_GetMyMasterCharacter(); if (!obj) return; local C_Object = L_sq_RA(0x1ab7cdc); //记录时装 local avataritemsbuf = []; foreach(offset in AvatarInfoIdx) { local AvatarEquiAddress = L_sq_RA(C_Object + offset); if (AvatarEquiAddress >= 0x400000) { local Ab = []; local NormalIndex = L_sq_RA(AvatarEquiAddress + 0x1c); local ExIndex = L_sq_RA(AvatarEquiAddress + 0x13E0); Ab.append(NormalIndex); Ab.append(ExIndex); //皮肤默认给默认皮肤 这里先注释 // if (offset == 0x3030) { // if (sq_getJob(obj) == 0) Ab = [42200, 0]; // else if (sq_getJob(obj) == 1) Ab = [46200, 0]; // else if (sq_getJob(obj) == 2) Ab = [50200, 0]; // else if (sq_getJob(obj) == 3) Ab = [54200, 0]; // else if (sq_getJob(obj) == 4) Ab = [58200, 0]; // else if (sq_getJob(obj) == 5) Ab = [1680000, 0]; // else if (sq_getJob(obj) == 6) Ab = [1800000, 0]; // else if (sq_getJob(obj) == 7) Ab = [29205, 0]; // else if (sq_getJob(obj) == 8) Ab = [2150000, 0]; // else if (sq_getJob(obj) == 9) Ab = [42200, 0]; // else if (sq_getJob(obj) == 10) Ab = [2190081, 0]; // } avataritemsbuf.append(Ab); } else { local Ab = []; Ab.append(0); Ab.append(0); avataritemsbuf.append(Ab); } } //记录装备 local equiitemsbuf = []; local equiupbuf = []; for (local i = 1; i< 13; ++i) { //编号 local Index = L_sq_GetCharacterAttribute(0x1c, i); //强化 local Upvalue = L_sq_GetCharacterAttribute(0x1054, i) //是否有增幅属性 local IsZf = L_sq_GetCharacterAttribute(0x10A8, i) //锻造 local DsUpvalue = L_sq_GetCharacterAttribute(0x10E8, i); //附魔卡片 local Enchanting = L_sq_GetCharacterAttribute(0x1084, i); equiitemsbuf.append(Index); local Info = []; if (IsZf) { Info.append(0); Info.append(Upvalue); } else { Info.append(Upvalue); Info.append(0); } Info.append(DsUpvalue); Info.append(Enchanting); equiupbuf.append(Info); } //记录宠物 local creitemsbuf = []; foreach(offset in creInfoIdx) { local creEquiAddress = L_sq_RA(C_Object + offset); if (creEquiAddress >= 0x400000) { local NormalIndex = L_sq_RA(creEquiAddress + 0x1c); creitemsbuf.append(NormalIndex); } else { creitemsbuf.append(0); } } //记录四维三攻属强 local Attributes = 0; Attributes += L_sq_GetCharacterAttribute(0x2364); Attributes += L_sq_GetCharacterAttribute(0x2394); Attributes += L_sq_GetCharacterAttribute(0x237c); Attributes += L_sq_GetCharacterAttribute(0x23ac); local AttackValue = 0; AttackValue += L_sq_GetCharacterAttribute(0x1E54); AttackValue += L_sq_GetCharacterAttribute(0x1E84); AttackValue += L_sq_GetCharacterAttribute(0x22C8); local Enhancement = 0; //火冰光暗 Enhancement += L_sq_GetCharacterAttribute(0x1b54); Enhancement += L_sq_GetCharacterAttribute(0x1b60); Enhancement += L_sq_GetCharacterAttribute(0x1b78); Enhancement += L_sq_GetCharacterAttribute(0x1b6c); local T = { op = 20096001, ava = avataritemsbuf, equ = equiitemsbuf, sw = Attributes, atk = AttackValue, ele = Enhancement, cre = creitemsbuf, job = sq_getJob(obj), exjob = sq_getGrowType(obj), name = L_Sq_GetObjectName(obj), equUp = equiupbuf, fst = 0, } SendPackEx(T); } function OpenCallBack() { UploadYourOwnCombatPower(); CheckPersonalCombatPower(); CheckGuildCombatPower(); LookingInfo = null; this.Visible = true; } } L_Windows_List <- []; getroottable().rawdelete("LenheartPluginsInitFlag"); getroottable().rawdelete("EventList_Obj") getroottable().rawdelete("TH_CombatRank_Obj"); function Lenheart_TH_CombatRank_Fun(obj) { local RootTab = getroottable(); if (!RootTab.rawin("TH_CombatRank_Obj")) { RootTab.rawset("TH_CombatRank_Obj", true); local Win = LenheartNewUI_CreateWindow(TH_CombatRankC, "桃花定制战力榜窗口", ((getroottable().Rindro_Scr_Width - 542) / 2).tointeger(), 28, 542, 515, 28); EventList_Obj.AddEvent("全服战力榜", 694, Win, "interface2/hud/information_button/information_button_cn.img"); } } getroottable()["LenheartFuncTab"].rawset("TH_CombatRankFuncN", Lenheart_TH_CombatRank_Fun); class TH_CombatRankC_Item { //Img Img = null; //编号 Idx = null; //父对象 Parent = null; //显示角色 CharacShow = null; //信息体 Info = null; //类型 Type = 0; constructor(Window, Idx, Info, Type) { Parent = Window; Img = Window.Img["main"]; this.Idx = Idx; this.Info = Info; this.Type = Type; } function Show(X, Y) { if (Idx< 3) { Img.DrawPng(4 + Idx, X + 3, Y); } else { Img.DrawPng(1, X + 3, Y); } local Ranking = (Idx + 1).tostring(); local JobName; local CharacName; local Combat; if (this.Type == 0) { JobName = Info.jobname; CharacName = Info.name; Combat = Info.zdlS; } else if (this.Type == 1) { JobName = Info.guildMaster; CharacName = Info.guildName; Combat = Info.zdlS; } //绘制排名 L_sq_DrawCode(Ranking, X + 17 - LenheartTextClass.GetStringLength(Ranking) / 2, Y + 14, sq_RGBA(230, 200, 155, 255), 0, 1); //绘制职业 L_sq_DrawCode(JobName, X + 70 - LenheartTextClass.GetStringLength(JobName) / 2, Y + 14, sq_RGBA(230, 200, 155, 255), 0, 1); //绘制角色名 L_sq_DrawCode(CharacName, X + 170 - LenheartTextClass.GetStringLength(CharacName) / 2, Y + 14, sq_RGBA(230, 200, 155, 255), 0, 1); //绘制战斗力 L_sq_DrawCode(Combat, X + 298 - LenheartTextClass.GetStringLength(Combat) / 2, Y + 14, sq_RGBA(230, 200, 155, 255), 0, 1); //绘制奖励 if (this.Type == 0) { if (Parent.PersonReward) { local Reward = Parent.PersonReward[Idx]; foreach(Pos, ItemInfo in Reward) { Parent.DrawItemBase(X + 377 + (Pos * 30), Y + 6, ItemInfo[0], ItemInfo[1]); } } } else if (this.Type == 1) { if (Parent.PersonReward) { local Reward = Parent.PersonReward[Idx]; foreach(Pos, ItemInfo in Reward) { Parent.DrawItemBase(X + 377 + (Pos * 30), Y + 6, ItemInfo[0], ItemInfo[1]); } } } } function HoverShow(X, Y) { if (Y <= (Parent.Y + 316 + 196)) { Img.DrawPng(2, X + 3, Y); } } function ShowCharacter(X, Y) { //没有正在查看的对象的时候才绘制人物 // if (!Parent.LookingInfo) { if(!CharacShow)StructureCharacAni(); CharacShow.Draw(X, Y); // } } function StructureCharacAni() { local AvaList = []; foreach(Ava in Info.avaS) { if (Ava != 0) AvaList.append(Ava); } CharacShow = Rindro_Draw_Character(Info.job.tointeger(), AvaList, "rest.ani", null); } function OnMouseLbDown(X, Y) { if (this.Type == 0) { if (Y <= (Parent.Y + 316 + 196) && Y >= (Parent.Y + 316)) { Parent.LookingInfo = this; } } } }