Rindro-Sqr/Project/HudUi/HudUi.nut

632 lines
25 KiB
Plaintext

/*
文件名: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);
//物品栏
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< 6; 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, 534); //Buff图标Y
L_sq_WAB(0x4bf55a, 534); //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]);
}
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);
}
// local Window = sq_GetPopupWindowMainCotrol(74);
// print(Window.IsWindowFocus());
}
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;
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/hud.img", 0, 0, 526);
//绘制血球蓝球
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));