diff --git a/Project/TH_CombatRank/TH_CombatRank.nut b/Project/TH_CombatRank/TH_CombatRank.nut new file mode 100644 index 0000000..edde536 --- /dev/null +++ b/Project/TH_CombatRank/TH_CombatRank.nut @@ -0,0 +1,540 @@ +/* +文件名: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; + //个人排行人物 + CharacShow = null; + //查看中的详细个人信息 + LookingInfo = null; + + //公会奖励集合 + GuildReward = null; + GuildFlagData = 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 = {}; + 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 = []; + CharacShow = []; + foreach(Pos, Info in ranking) { + local CharacDraw = Rindro_Draw_Character(Info.job.tointeger(), Info.avaS, "rest.ani", null) + CharacShow.append(CharacDraw); + + if (!Info.rawin("guildname")) Info.guildname <- "无公会"; + local Buf = TH_CombatRankC_Item(this, Pos, Info, 0); + Buf.CharacShow = CharacDraw; + CombatInfoList.append(Buf); + } + }.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 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; + Page = 0; + 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; + Page = 1; + ScrollBar.Reset(); + }.bindenv(this); + TitleButtonList.append(FuncTabbar2); + + 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 (CharacShow) { + for (local i = 0; i< 3; i++) { + local CharacObj = CharacShow[i]; + local OffsetX = 270; + local OffsetY = 268; + if (i == 1) { + OffsetX = 130; + OffsetY = 268; + } + if (i == 2) { + OffsetX = 410; + OffsetY = 268; + } + if (!LookingInfo || i != LookingInfo.Idx) CharacObj.Draw(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); + + //角色名 + L_sq_DrawCode("角色名: " + LookingInfo.Info.name, X + 150, Y + 60, sq_RGBA(230, 200, 155, 255), 0, 1); + //职业 + L_sq_DrawCode("角色职业: " + LookingInfo.Info.jobname, X + 150, Y + 78, sq_RGBA(230, 200, 155, 255), 0, 1); + //等级 + L_sq_DrawCode("角色等级: " + LookingInfo.Info.level, X + 150, Y + 96, sq_RGBA(230, 200, 155, 255), 0, 1); + //公会名 + L_sq_DrawCode("所属公会: " + LookingInfo.Info.guildname, X + 150, Y + 114, sq_RGBA(230, 200, 155, 255), 0, 1); + //是否在线 + L_sq_DrawCode("当前状态: " + (LookingInfo.Info.isOnline ? "在线" : "离线"), X + 150, Y + 132, sq_RGBA(230, 200, 155, 255), 0, 1); + + //战斗力 + L_sq_DrawCode("战斗力: " + LookingInfo.Info.zdlS, X + 150, Y + 150, sq_RGBA(230, 200, 155, 255), 0, 1); + L_sq_DrawCode("-- 基础战斗力: " + LookingInfo.Info.jczdlS, X + 150, Y + 168, sq_RGBA(179, 169, 135, 255), 0, 1); + L_sq_DrawCode(" 四维: " + LookingInfo.Info.swzldS, X + 150, Y + 186, sq_RGBA(179, 169, 135, 255), 0, 1); + L_sq_DrawCode(" 三攻: " + LookingInfo.Info.sgzldS, X + 150, Y + 204, sq_RGBA(179, 169, 135, 255), 0, 1); + L_sq_DrawCode(" 属强: " + LookingInfo.Info.sqzldS, X + 150, Y + 222, sq_RGBA(179, 169, 135, 255), 0, 1); + L_sq_DrawCode(" 其他: " + LookingInfo.Info.qtzldS, X + 150, Y + 240, sq_RGBA(179, 169, 135, 255), 0, 1); + + L_sq_DrawCode("-- 魂石战斗力: " + LookingInfo.Info.fstS, X + 150, Y + 258, 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(); //裁切结束 + } + } + + + 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, 0x3030, 0x3034]; + creInfoIdx = [0x3068, 0x306C, 0x3070, 0x3074]; + + function UploadYourOwnCombatPower() { + 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); + 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 OnMouseLbDown(X, Y) { + if (this.Type == 0) { + if (Y <= (Parent.Y + 316 + 196) && Y >= (Parent.Y + 316)) { + Parent.LookingInfo = this; + } + } + } +} \ No newline at end of file diff --git a/Project/TH_CombatRank/img/0.png b/Project/TH_CombatRank/img/0.png new file mode 100644 index 0000000..8a7d9c9 Binary files /dev/null and b/Project/TH_CombatRank/img/0.png differ