/* 文件名:HudUi.nut 路径:Project/HudUi/HudUi.nut 创建日期:2024-08-27 22:12 文件用途:界面UI */ class HudUiC extends LenheartNewUI_Windows { //调试模式 // DeBugMode = true; //不是窗口 NoWindow = true; //是否可见 // Visible = false; //球Ani Hp_BallAni = null; Mp_BallAni = null; //活动图标是否展开Flag EventListShowFlag = true; //最高等级 MaxLevel = 86; //我的骑乘对象 MyRidingObject = null; //生命损失数组 Lenheart_100UI_HpDamageArr = null; //生命损失标志 Lenheart_100UI_HpDamageRateFlag = null; //生命损失特效 Lenheart_100UI_HpDamageEff = null; //魔法损失数组 Lenheart_100UI_MpDamageArr = null; //魔法损失标志 Lenheart_100UI_MpDamageRateFlag = null; //魔法损失特效 Lenheart_100UI_MpDamageEff = null; //修补内存 function FixMemory() { // 干掉nut初始化基础技能栏坐标 L_sq_WAB(0x4B3239, 0xEB); //右上角绿色小圆球 L_sq_WA(0x00E6D873, 1000); //广播黑条 L_sq_WA(0x01AF4968, 0); //格兰背景 L_sq_WA(0x004CA0B3, 850); L_sq_WA(0x004BB768, 850); //副本名称 L_sq_WA(0x004BB872, 850); L_sq_WA(0x004BB850, 850); //城镇名称 L_sq_WA(0x004CA27C, 850); //城镇过场Tips背景 L_sq_WA(0x004580FD, 400 + 133); //城镇过场Tips文本 L_sq_WA(0x004581DD, 400 + 133); //头顶滚动公告 L_sq_WAB(0x11FA640, 0xC3); //物品栏 for (local i = 0; i< 6; i++) { L_sq_WA(L_sq_RA(L_sq_RA(0x01ADE0CC) + 0x18 + (i * 0x4)) + 0x14, 136 + (i * 31)); L_sq_WA(L_sq_RA(L_sq_RA(0x01ADE0CC) + 0x18 + (i * 0x4)) + 0x18, 569); } //技能栏 for (local i = 0; i< 7; i++) { L_sq_WA(L_sq_RA(L_sq_RA(0x01ADE0CC) + 0x30 + (i * 0x4)) + 0x14, 433 + (i * 31)); L_sq_WA(L_sq_RA(L_sq_RA(0x01ADE0CC) + 0x30 + (i * 0x4)) + 0x18, 565); L_sq_WA(L_sq_RA(L_sq_RA(0x01ADE0CC) + 0x60 + (i * 0x4)) + 0x14, 433 + (i * 31)); L_sq_WA(L_sq_RA(L_sq_RA(0x01ADE0CC) + 0x60 + (i * 0x4)) + 0x18, 534); } //功能按键(我的信息, 背包,任务,技能) for (local i = 0; i< 4; i++) { L_sq_WA(L_sq_RA(L_sq_RA(0x01ADE0CC) + 0x84 + (i * 0x4)) + 0x14, 844 + (i * 17)); L_sq_WA(L_sq_RA(L_sq_RA(0x01ADE0CC) + 0x84 + (i * 0x4)) + 0x18, 561); } //拍卖行(删除) L_sq_WA(L_sq_RA(L_sq_RA(0x01ADE0CC) + 0x84 + (4 * 0x4)) + 0x14, -5000); //Lv小三角(关闭) L_sq_WA(L_sq_RA(L_sq_RA(0x01ADE0CC) + 0x7C8) + 0xC, 256); //游戏菜单按钮 local Muen = L_sq_RA(0x01ADE0CC) + 0xc; Muen = L_sq_RA(Muen) + 0x48; Muen = L_sq_RA(Muen) + 0x5b4; Muen = L_sq_RA(Muen) + 0x28; Muen = L_sq_RA(Muen) + 0x4; Muen = L_sq_RA(Muen); L_sq_WA(Muen + 0x14, 818); L_sq_WA(Muen + 0x18, 561); //商城按钮 local Shop = L_sq_RA(0x01ADE0CC) + 0xc; Shop = L_sq_RA(Shop) + 0x48; Shop = L_sq_RA(Shop) + 0xBC; Shop = L_sq_RA(Shop) + 0x4; Shop = L_sq_RA(Shop) + 0x28; Shop = L_sq_RA(Shop) + 0x4; Shop = L_sq_RA(Shop); L_sq_WA(Shop + 0x14, 755); L_sq_WA(Shop + 0x18, 561); //血槽背景 L_sq_WA(0x00400E01, 133); //血槽背景X L_sq_WA(5021770, 508); //血槽背景Y //血球蓝球(删除) L_sq_WA(4436173, -5000); //血Y L_sq_WA(4436568, -5000); //蓝Y L_sq_WA(4436134, -5000); //血球篮球遮盖X L_sq_WA(4436126, -5000); //血球篮球遮盖X L_sq_WA(4436529, -5000); //血球篮球遮盖Y L_sq_WA(4436521, -5000); //血球篮球遮盖Y L_sq_WA(5006757, -5000); //HP文字标识 Y轴 L_sq_WA(5006965, -5000); //MP文字标识 Y轴 //BUFF图标 X在C++Hook中处理 L_sq_WAB(0x4c8bf5, 542); //Buff图标Y L_sq_WAB(0x4bf55a, 542); //Buff图标文字标识Y //技能变更类型 local SkillChanageA = L_sq_RA(0x01ADE0CC) + 0x124; SkillChanageA = L_sq_RA(SkillChanageA); L_sq_WA(SkillChanageA + 0x14, 416); L_sq_WA(SkillChanageA + 0x18, 562); local SkillChanageB = L_sq_RA(0x01ADE0CC) + 0x128; SkillChanageB = L_sq_RA(SkillChanageB); L_sq_WA(SkillChanageB + 0x14, 416); L_sq_WA(SkillChanageB + 0x18, 562); //拓展技能(被动技能) local PassSkillSwitch = L_sq_RA(0x01ADE0CC) + 0x128; PassSkillSwitch = L_sq_RA(PassSkillSwitch) + 0x2cc; PassSkillSwitch = L_sq_RA(PassSkillSwitch) + 0x0; PassSkillSwitch = L_sq_RA(PassSkillSwitch) + 0x190; PassSkillSwitch = L_sq_RA(PassSkillSwitch); L_sq_WA(PassSkillSwitch + 0x14, 419); L_sq_WA(PassSkillSwitch + 0x18, 532); //小地图指南针(删除) local MiniMapButton = L_sq_RA(0x01ADE0CC) + 0x138; MiniMapButton = L_sq_RA(MiniMapButton); L_sq_WA(MiniMapButton + 0xC, 256); local MiniMapButtonAddress = L_sq_RA(0x01ADE0CC) + 0xC; MiniMapButtonAddress = L_sq_RA(MiniMapButtonAddress) + 0x48; MiniMapButtonAddress = L_sq_RA(MiniMapButtonAddress) + 0xBC; MiniMapButtonAddress = L_sq_RA(MiniMapButtonAddress) + 0x4; MiniMapButtonAddress = L_sq_RA(MiniMapButtonAddress) + 0x28; MiniMapButtonAddress = L_sq_RA(MiniMapButtonAddress) + 0x4; MiniMapButtonAddress = L_sq_RA(MiniMapButtonAddress) + 0x1414; L_sq_WAB(0x4C6F35, 0xEB); //右上角指南针X L_sq_WA(MiniMapButtonAddress, -5000); //干掉废弃的深渊悬停提示 MemoryTool.WirteByteArr(0xE6D90C, [0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90]); //修复点击邮箱会乱跳鼠标 L_sq_WAB(0x11BD16E, 0xEB); } constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH) { Childrens = []; //注册控件 RegisterWidget(); LenheartNewUI_Windows.constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH); FixMemory(); local BallFrameArr = []; for (local i = 0; i< 120; i++) { local T = { ImgIndex = i, Delay = 20, Pos = [0, 0] } BallFrameArr.append(T); } Hp_BallAni = Lenheart_Ani("", BallFrameArr, [355, 534]); Hp_BallAni.ImgPath = "interface2/hud/hpmp_vessel.img"; Mp_BallAni = Lenheart_Ani("", BallFrameArr, [647, 534]); Mp_BallAni.ImgPath = "interface2/hud/hpmp_vessel.img"; //预加载 for (local i = 0; i< 120; i++) { L_sq_DrawImg("interface2/hud/hpmp_vessel.img", i, -5000, 508); } } function RegisterWidget() { //铃铛按钮 local EventButton = LenheartNewUI_BaseButton(728, 561, 27, 27, "interface2/hud/hud.img", 204); EventButton.OnClick = function() { local BasePos = getroottable()["LenheartEventOffset"]; local MyPos = EventList_Obj.Y; if (EventListShowFlag) { getroottable()["LenheartEventOffset"].y = BasePos.y - 5000; EventList_Obj.Y = MyPos - 5000; } else { getroottable()["LenheartEventOffset"].y = BasePos.y + 5000; EventList_Obj.Y = MyPos + 5000; } //刷新一下活动图标 L_sq_RefreshEventIcon(); EventListShowFlag = !EventListShowFlag; // this.Visible = false; }.bindenv(this); EventButton.TopCallBackFunc = function(obj, button) { local obj = sq_getMyCharacter(); local Yoffset = 0; if (button.isLBDown) Yoffset = 1; T_DrawDynamicAni(obj, "common/hud/hud_ui/event/event.ani", button.X + 14, button.Y + 6 + Yoffset, "Lenheart_HUD铃铛图像"); }.bindenv(this); Childrens.append(EventButton); //拍卖行按钮 local AuctionButton = LenheartNewUI_BaseButton(912, 561, 21, 23, "interface2/hud/hud.img", 17); AuctionButton.OnClick = function() { L_sq_Open_ExWindow(0x1ADE090, 13, 0, 1); }.bindenv(this); Childrens.append(AuctionButton); //冒险团 local PassPartyButton = LenheartNewUI_BaseButton(708, 558, 21, 23, "interface2/hud/advhud.img", 2); PassPartyButton.OnClick = function() { L_NewWindows("Lenheart", 33, 0x65535); }.bindenv(this); PassPartyButton.TopCallBackFunc = function(obj, button) { local Yoffset = 0; if (button.isLBDown) Yoffset = 1; L_sq_DrawCode(L_sq_GetPassLevel().tostring(), 719 - (LenheartTextClass.GetStringLength(L_sq_GetPassLevel().tostring())) / 2, 564 + Yoffset, sq_RGBA(230, 200, 155, 255), 1, 1); }.bindenv(this); Childrens.append(PassPartyButton); //小地图指南针按钮 local MiniMapButton = LenheartNewUI_BaseButton(1031, 0, 35, 35, "interface2/hud/hud.img", 77); MiniMapButton.OnClick = function() { LenheartNextFrameFuncTab.append(function() { L_sq_UseSkill(DIK_N); }) }.bindenv(this); Childrens.append(MiniMapButton); } function DrawEventBackground(obj) { //我的 + 原生 local EventCounts = EventList_Obj.Events.len() + L_sq_RA(L_sq_RA(0x1A39C2C) + 0x6c); local XCounts = EventCounts > 8 ? 8 : EventCounts; //如果一个都没有就0 有1个先绘制基本的就要30 后面每一个图标+20 -2是因为够上了就会绘制多一个 local Width = XCounts == 0 ? 0 : 30 + ((XCounts - 2) * 20); local YCounts = (EventCounts - 1) / 8; if (getroottable().rawin("LenheartEventOffset")) L_sq_DrawWindow(getroottable()["LenheartEventOffset"].x + 456 - 5, getroottable()["LenheartEventOffset"].y - 5 - (YCounts * 21), Width, YCounts * 20, "interface2/hud/hudbox.img", 0, 22, 20, 7, 21); } function DrawBall(obj) { //我的异常 local HPRGBA = { R = 255, G = 0, B = 0, A = 250, }; local MPRGBA = { R = 0, G = 0, B = 255, A = 250 }; local HPK = 212; local HPB = 1; local MPK = 213; local MPB = 2; //中毒 if (sq_IsValidActiveStatus(obj, ACTIVESTATUS_POISON)) { HPRGBA = { R = 128, G = 0, B = 128, A = 250 }; HPK = 214; HPB = 20; } //骑乘要锁定骑乘对象 if (sq_IsRidingObject(obj)) { HPRGBA = { R = 255, G = 128, B = 0, A = 250 }; MPRGBA = { R = 255, G = 128, B = 0, A = 250 }; HPK = 215; HPB = 64; MPK = 215; MPB = 64; local objectManager = obj.getObjectManager(); if (objectManager) { local CollisionObjectNumber = objectManager.getCollisionObjectNumber(); for (local i = 0; i< CollisionObjectNumber; i += 1) { local object = objectManager.getCollisionObject(i); local Address = L_Sq_GetObjectAddress(object); if (Address == L_Sq_GetRidingObjectAddress(obj)) { local activeObj = sq_GetCNRDObjectToActiveObject(object); MyRidingObject = activeObj; } } } } else { MyRidingObject = null; } //获取需要绘制血球蓝球的对象 local Gobj = obj; if (sq_IsRidingObject(obj) && MyRidingObject) Gobj = MyRidingObject; //血球 { //生命值比例 local HpRate = (Gobj.getHp().tofloat() / Gobj.getHpMax().tofloat()); //生命值损失数组 if (!Lenheart_100UI_HpDamageArr) Lenheart_100UI_HpDamageArr = []; //生命值损失标志 if (!Lenheart_100UI_HpDamageRateFlag) Lenheart_100UI_HpDamageRateFlag = HpRate; //push if (Lenheart_100UI_HpDamageRateFlag != HpRate && (abs((Lenheart_100UI_HpDamageRateFlag * 1000.0 - HpRate * 1000.0)) >= 10)) { local MaxHpDamgeArrLen = 100; if (Lenheart_100UI_HpDamageArr.len()< MaxHpDamgeArrLen) { local T = { OldHpRate = Lenheart_100UI_HpDamageRateFlag, NowHpRate = HpRate, Time = Clock(), } Lenheart_100UI_HpDamageArr.append(T); if (!Lenheart_100UI_HpDamageEff) { Lenheart_100UI_HpDamageEff = { OldHpRate = Lenheart_100UI_HpDamageRateFlag, Time = Clock(), }; } } } Lenheart_100UI_HpDamageRateFlag = HpRate; if (Lenheart_100UI_HpDamageEff) { local ValueHpBack = Lenheart_100UI_HpDamageEff; local DstTime = Clock() - ValueHpBack.Time; local HpOffset = 534 + (54 * (1.0 - ValueHpBack.OldHpRate)).tointeger(); if (DstTime > 500) { HpOffset = sq_GetUniformVelocity(534 + (54 * (1.0 - ValueHpBack.OldHpRate)).tointeger(), 534 + (54 * (1.0 - HpRate)).tointeger(), DstTime - 500, 500); } setClip(355, HpOffset, 355 + 64, 534 + (54 * (1.0 - HpRate)).tointeger()); //开始裁切 L_sq_SetDrawImgModel(2, 0); Hp_BallAni.ShowEx(Duration, sq_RGBA(HPRGBA.R, HPRGBA.G, HPRGBA.B, HPRGBA.A), 1.0, 1.0); L_sq_ReleaseDrawImgModel(); // HpAni.setRGBA(HPRGBA.R, HPRGBA.G, HPRGBA.B, HPRGBA.A); releaseClip(); //裁切结束 if (DstTime > 1000) { Lenheart_100UI_HpDamageEff = null; } } // 血球缓慢掉血绘制逻辑 foreach(Pos, Value in Lenheart_100UI_HpDamageArr) { local DstTime = Clock() - Value.Time; if (DstTime <= 1000) { if (DstTime <= 500) { local HP_Eff_Alpha = sq_GetUniformVelocity(250, 0, DstTime, 500); setClip(355, 534 + (54 * (1.0 - Value.OldHpRate)).tointeger(), 355 + 64, 534 + (54 * (1.0 - Value.NowHpRate)).tointeger()); //开始裁切 L_sq_SetDrawImgModel(2, 0); Hp_BallAni.ShowEx(Duration, sq_RGBA(HPRGBA.R, HPRGBA.G, HPRGBA.B, HP_Eff_Alpha), 1.0, 1.0); L_sq_ReleaseDrawImgModel(); releaseClip(); //裁切结束 } } else { Lenheart_100UI_HpDamageArr.remove(Pos); } } //血球绘制逻辑 setClip(355, 534 + (54 * (1.0 - HpRate)).tointeger(), 355 + 64, 534 + 54); //开始裁切 L_sq_SetDrawImgModel(2, 0); Hp_BallAni.ShowEx(Duration, sq_RGBA(HPRGBA.R, HPRGBA.G, HPRGBA.B, HPRGBA.A), 1.0, 1.0); Hp_BallAni.ShowEx(Duration, sq_RGBA(HPRGBA.R, HPRGBA.G, HPRGBA.B, HPRGBA.A), 1.0, 1.0); L_sq_ReleaseDrawImgModel(); releaseClip(); //裁切结束 local HpStr = ((Gobj.getHp().tofloat() / Gobj.getHpMax().tofloat()).tofloat() * 100.0) + "%"; L_sq_DrawCode(HpStr, 391 - LenheartTextClass.GetStringLength(HpStr) / 2, 560, 0xFFFFFFFF, 1, 1); } { //魔法值比例 local MpRate = (Gobj.getMp().tofloat() / Gobj.getMpMax().tofloat()); //生命值损失数组 if (!Lenheart_100UI_MpDamageArr) Lenheart_100UI_MpDamageArr = []; //生命值损失标志 if (!Lenheart_100UI_MpDamageRateFlag) Lenheart_100UI_MpDamageRateFlag = MpRate; //Push if (Lenheart_100UI_MpDamageRateFlag != MpRate && (abs((Lenheart_100UI_MpDamageRateFlag * 1000.0 - MpRate * 1000.0)) >= 10)) { local MaxMpDamgeArrLen = 100; if (Lenheart_100UI_MpDamageArr.len()< MaxMpDamgeArrLen) { local T = { OldMpRate = Lenheart_100UI_MpDamageRateFlag, NowMpRate = MpRate, Time = Clock(), } Lenheart_100UI_MpDamageArr.append(T); if (!Lenheart_100UI_MpDamageEff) { Lenheart_100UI_MpDamageEff = { OldMpRate = Lenheart_100UI_MpDamageRateFlag, Time = Clock(), }; } } } Lenheart_100UI_MpDamageRateFlag = MpRate; if (Lenheart_100UI_MpDamageEff) { local ValueMpBack = Lenheart_100UI_MpDamageEff; local DstTime = Clock() - ValueMpBack.Time; local MpOffset = 534 + (63 * (1.0 - ValueMpBack.OldMpRate)).tointeger(); if (DstTime > 500) { MpOffset = sq_GetUniformVelocity(534 + (63 * (1.0 - ValueMpBack.OldMpRate)).tointeger(), 534 + (63 * (1.0 - MpRate)).tointeger(), DstTime - 500, 500); } setClip(647, MpOffset, 647 + 64, 534 + (63 * (1.0 - MpRate)).tointeger()); //开始裁切 L_sq_SetDrawImgModel(2, 0); Mp_BallAni.ShowEx(Duration, sq_RGBA(MPRGBA.R, MPRGBA.G, MPRGBA.B, MPRGBA.A), 1.0, 1.0); L_sq_ReleaseDrawImgModel(); releaseClip(); //裁切结束 if (DstTime > 1000) { Lenheart_100UI_MpDamageEff = null; } } foreach(Pos, Value in Lenheart_100UI_MpDamageArr) { local DstTime = Clock() - Value.Time; if (DstTime <= 1000) { if (DstTime <= 500) { local Mp_Eff_Alpha = sq_GetUniformVelocity(250, 0, DstTime, 500); setClip(647, 534 + (63 * (1.0 - Value.OldMpRate)).tointeger(), 647 + 64, 534 + (63 * (1.0 - Value.NowMpRate)).tointeger()); //开始裁切 L_sq_SetDrawImgModel(2, 0); Mp_BallAni.ShowEx(Duration, sq_RGBA(MPRGBA.R, MPRGBA.G, MPRGBA.B, Mp_Eff_Alpha), 1.0, 1.0); L_sq_ReleaseDrawImgModel(); releaseClip(); //裁切结束 } } else { Lenheart_100UI_MpDamageArr.remove(Pos); } } //蓝球绘制逻辑 setClip(647, 534 + (63 * (1.0 - MpRate)).tointeger(), 647 + 64, 534 + 63); //开始裁切 L_sq_SetDrawImgModel(2, 0); Mp_BallAni.ShowEx(Duration, sq_RGBA(MPRGBA.R, MPRGBA.G, MPRGBA.B, MPRGBA.A), 1.0, 1.0); Mp_BallAni.ShowEx(Duration, sq_RGBA(MPRGBA.R, MPRGBA.G, MPRGBA.B, MPRGBA.A), 1.0, 1.0); L_sq_ReleaseDrawImgModel(); releaseClip(); //裁切结束 local MpStr = ((Gobj.getMp().tofloat() / Gobj.getMpMax().tofloat()).tofloat() * 100.0) + "%"; L_sq_DrawCode(MpStr, 684 - LenheartTextClass.GetStringLength(MpStr) / 2, 560, 0xFFFFFFFF, 1, 1); } //血盖子 L_sq_DrawImg("interface2/hud/hud.img", HPK, 355, 534, 1, sq_RGBA(255, 255, 255, 250), 1.0, 1.0); //蓝盖子 L_sq_DrawImg("interface2/hud/hud.img", 213, 647, 534, 1, sq_RGBA(255, 255, 255, 250), 1.0, 1.0); } function BallRectLogic(obj) { //悬停逻辑 if (sq_IsIntersectRect(IMouse.GetXPos(), IMouse.GetYPos(), 1, 1, 355, 534, 64, 63)) { local Gobj = obj; if (sq_IsRidingObject(obj) && MyRidingObject) Gobj = MyRidingObject; local Str = "生命值: " + Gobj.getHp() + "/" + Gobj.getHpMax(); L_sq_DrawWindow(IMouse.GetXPos() - 140 + LenheartTextClass.GetStringLength(Str) / 2, IMouse.GetYPos() - 36, 0 + LenheartTextClass.GetStringLength(Str), 12, "interface/lenheartwindowcommon.img", 97, 11, 12, 11, 13); L_sq_DrawCode(Str, IMouse.GetXPos() - 126 + LenheartTextClass.GetStringLength(Str) / 2, IMouse.GetYPos() - 24, 0xFFFFFFFF, 1, 1); } else if (sq_IsIntersectRect(IMouse.GetXPos(), IMouse.GetYPos(), 1, 1, 647, 534, 64, 63)) { local Gobj = obj; if (sq_IsRidingObject(obj) && MyRidingObject) Gobj = MyRidingObject; local Str = "魔法值: " + Gobj.getMp() + "/" + Gobj.getMpMax(); L_sq_DrawWindow(IMouse.GetXPos() - 140 + LenheartTextClass.GetStringLength(Str) / 2, IMouse.GetYPos() - 36, 0 + LenheartTextClass.GetStringLength(Str), 12, "interface/lenheartwindowcommon.img", 97, 11, 12, 11, 13); L_sq_DrawCode(Str, IMouse.GetXPos() - 126 + LenheartTextClass.GetStringLength(Str) / 2, IMouse.GetYPos() - 24, 0xFFFFFFFF, 1, 1); } } function DrawExpBar(obj) { local NowExp = L_sq_GetExp(1); local MaxExp = L_sq_GetExp(0); local ExpRate = (NowExp.tofloat() / MaxExp.tofloat()).tofloat(); if (L_Sq_GetObjectLevel(obj) == MaxLevel) { L_sq_DrawImg("interface2/hud/hud.img", 60, 383, 595); } else { setClip(383, 595, 248 + (300.0 * ExpRate).tointeger(), 596 + 4); //开始裁切 L_sq_DrawImg("interface2/hud/hud.img", 4, 383, 595); releaseClip(); //裁切结束 } } function ExpRectLogic(obj) { if (sq_IsIntersectRect(IMouse.GetXPos(), IMouse.GetYPos(), 1, 1, 383, 595, 300, 4)) { if (L_Sq_GetObjectLevel(obj) == MaxLevel) { L_sq_DrawWindow(IMouse.GetXPos() - 150, IMouse.GetYPos() - 36, 144, 12, "interface/lenheartwindowcommon.img", 97, 11, 12, 11, 13); L_sq_DrawCode("已满级!等待服务器下一等级节点!", IMouse.GetXPos() - 142, IMouse.GetYPos() - 24, 0xFFFFFFFF, 1, 1); } else { local Str = "当前经验值: " + L_sq_GetExp(1) + " 总经验值: " + L_sq_GetExp(0); L_sq_DrawWindow(IMouse.GetXPos() - 150, IMouse.GetYPos() - 36, 144 + LenheartTextClass.GetStringLength(L_sq_GetExp(1).tostring() + L_sq_GetExp(0).tostring()), 12, "interface/lenheartwindowcommon.img", 97, 11, 12, 11, 13); L_sq_DrawCode(Str, IMouse.GetXPos() - 140, IMouse.GetYPos() - 24, 0xFFFFFFFF, 1, 1); } } } function DrawLevelAndSp(obj) { local ChrLevel = L_Sq_GetObjectLevel(obj); local ChrSp = L_sq_GetSp(); L_sq_DrawCode("Lv." + ChrLevel.tostring(), 356 - (LenheartTextClass.GetStringLength("Lv." + ChrLevel.tostring()) / 2), 587, sq_RGBA(230, 200, 155, 255), 1, 1); L_sq_DrawCode(ChrSp.tostring(), 713 - (LenheartTextClass.GetStringLength(ChrSp.tostring()) / 2), 587, sq_RGBA(230, 200, 155, 255), 1, 1); } function DrawFatigue(obj) { local MaxFatigue = L_sq_GetFatigue(0); local NowFatigue = MaxFatigue - L_sq_GetFatigue(1); local FatigueRate = ((NowFatigue * 100) / MaxFatigue).tofloat(); //计算比率 setClip(773, 591, 773 + (141 * (FatigueRate / 100).tofloat()).tointeger(), 591 + 8); //开始裁切 L_sq_DrawImg("interface2/hud/hud.img", 3, 773, 591); releaseClip(); //裁切结束 local FatigueStr = NowFatigue + "/" + MaxFatigue; L_sq_DrawCode(FatigueStr, 940 - (LenheartTextClass.GetStringLength(FatigueStr) / 2), 587, sq_RGBA(230, 200, 155, 255), 1, 1); } //绘制主界面 function DrawMain(obj) { //绘制背景 L_sq_DrawImg("interface2/hud/lenheartaddhud.img", 0, 347, 526); //绘制框 for (local i = 0; i< 6; i++) { //消耗品 L_sq_DrawImg("interface2/hud/hud.img", 200, 134 + (i * 31), 567); } for (local i = 0; i< 7; i++) { //上排技能 L_sq_DrawImg("interface2/hud/hud.img", 201, 431 + (i * 31), 531); L_sq_DrawImg("interface2/hud/hud.img", 201, 431 + (i * 31), 562); } //绘制疲劳底框 L_sq_DrawImg("interface2/hud/hud.img", 230, 774, 592); //绘制血球蓝球 DrawBall(obj); //绘制经验盖槽 L_sq_DrawImg("interface2/hud/hud.img", 202, 313, 582); //绘制经验条 DrawExpBar(obj); //绘制等级和Sp点 DrawLevelAndSp(obj); //绘制疲劳值 DrawFatigue(obj); //绘制活动图标背景槽 DrawEventBackground(obj); } function Show(obj) { } function TopShow(obj) { //血蓝球悬停逻辑 BallRectLogic(obj); //经验条悬停逻辑 ExpRectLogic(obj); } function BottomShow(obj) { DrawMain(obj); LenheartNewUI_Windows.Show(obj); } //动态窗口设置逻辑 function Active_Windows_SyncPos() { //任务快捷导航窗口 { local WindowAddress = L_sq_GetWindowById(1); if (WindowAddress) L_sq_WA(WindowAddress + 0x14, 907); } } //逻辑入口 function Proc(obj) { LenheartNewUI_Windows.SyncPos(X, Y); Active_Windows_SyncPos(); } } function Lenheart_HudUi_Fun(obj) { local RootTab = getroottable(); if (!RootTab.rawin("HudUi_Obj")) { RootTab.rawset("HudUi_Obj", LenheartNewUI_CreateWindow(HudUiC, "HUD血槽界面窗口", 0, 0, 0, 0, 0)); } } getroottable()["LenheartFuncTab"].rawset("HudUiFuncN", Lenheart_HudUi_Fun); // L_sq_Test(L_sq_RA(0x01AB7CDC), 0x3DB61400); // local Ret = L_sq_Test(L_sq_RA(0x01AB7CDC), 10); // local Ret = L_sq_Test(L_sq_RA(0x01A5FA88), 101020037); // print(format("%02x", Ret));