2024-09-16 17:09:36 +08:00
|
|
|
/*
|
|
|
|
|
文件名: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);
|
|
|
|
|
|
2024-09-27 14:04:23 +08:00
|
|
|
//城镇过场Tips背景
|
|
|
|
|
L_sq_WA(0x004580FD, 400 + 133);
|
|
|
|
|
//城镇过场Tips文本
|
|
|
|
|
L_sq_WA(0x004581DD, 400 + 133);
|
|
|
|
|
|
|
|
|
|
//头顶滚动公告
|
|
|
|
|
L_sq_WAB(0x11FA640, 0xC3);
|
|
|
|
|
|
|
|
|
|
|
2024-09-16 17:09:36 +08:00
|
|
|
|
|
|
|
|
//物品栏
|
|
|
|
|
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中处理
|
2024-09-27 14:04:23 +08:00
|
|
|
L_sq_WAB(0x4c8bf5, 542); //Buff图标Y
|
|
|
|
|
L_sq_WAB(0x4bf55a, 542); //Buff图标文字标识Y
|
2024-09-16 17:09:36 +08:00
|
|
|
|
|
|
|
|
//技能变更类型
|
|
|
|
|
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) {
|
|
|
|
|
//绘制背景
|
2024-09-27 14:04:23 +08:00
|
|
|
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);
|
2024-09-29 16:52:10 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (local i = 0; i< 7; i++) {
|
2024-09-27 14:04:23 +08:00
|
|
|
//上排技能
|
|
|
|
|
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);
|
2024-09-16 17:09:36 +08:00
|
|
|
|
|
|
|
|
//绘制血球蓝球
|
|
|
|
|
DrawBall(obj);
|
|
|
|
|
|
|
|
|
|
//绘制经验盖槽
|
|
|
|
|
L_sq_DrawImg("interface2/hud/hud.img", 202, 313, 582);
|
|
|
|
|
|
2024-09-29 16:52:10 +08:00
|
|
|
|
2024-09-16 17:09:36 +08:00
|
|
|
//绘制经验条
|
|
|
|
|
DrawExpBar(obj);
|
|
|
|
|
|
|
|
|
|
//绘制等级和Sp点
|
|
|
|
|
DrawLevelAndSp(obj);
|
|
|
|
|
|
|
|
|
|
//绘制疲劳值
|
|
|
|
|
DrawFatigue(obj);
|
|
|
|
|
|
|
|
|
|
//绘制活动图标背景槽
|
|
|
|
|
DrawEventBackground(obj);
|
2024-09-27 14:04:23 +08:00
|
|
|
|
2024-09-16 17:09:36 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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));
|