418 lines
11 KiB
Plaintext
418 lines
11 KiB
Plaintext
/*
|
|
文件名:Lenheart_Each_Class.nut
|
|
路径:Base/UI/Lenheart_Each_Class.nut
|
|
创建日期:2024-09-30 14:46
|
|
文件用途:交互界面类
|
|
*/
|
|
class LenheartNewUI_Each_BaseButton extends LenheartNewUI_CommonUi {
|
|
State = 0;
|
|
BaseIdx = 29;
|
|
DWidth = null;
|
|
Path = null;
|
|
Idx = null;
|
|
SetFlag = null;
|
|
SetIndex = null;
|
|
|
|
Icon = null;
|
|
IconIdx = null;
|
|
Str = null;
|
|
StrColor = sq_RGBA(189, 159, 126, 250);
|
|
|
|
constructor(X, Y, W, H, Path, Idx) {
|
|
this.DWidth = W;
|
|
this.Path = Path;
|
|
this.Idx = Idx;
|
|
LenheartNewUI_CommonUi.constructor(X, Y, W, H);
|
|
|
|
}
|
|
|
|
function SetFrame(gPath, gIdx) {
|
|
if (gPath) Path = gPath;
|
|
Idx = gIdx;
|
|
}
|
|
|
|
function Show(obj) {
|
|
//不可用
|
|
if (State == 8) {
|
|
// L_sq_DrawImg(Path, Idx + 3, X, Y);
|
|
} else {
|
|
//按下
|
|
if (isLBDown) {
|
|
L_sq_DrawImg(Path, Idx + 1, X, Y);
|
|
if (Icon) L_sq_DrawImg(Icon, IconIdx, X + 3, Y + 2);
|
|
if (Str) L_sq_DrawCode(Str, X + 60 - LenheartTextClass.GetStringLength(Str) / 2, Y + 5, StrColor, 0, 1);
|
|
}
|
|
//悬停
|
|
else if (isInRect) {
|
|
L_sq_DrawImg(Path, Idx, X, Y);
|
|
if (Icon) L_sq_DrawImg(Icon, IconIdx, X + 3, Y + 1);
|
|
if (Str) L_sq_DrawCode(Str, X + 60 - LenheartTextClass.GetStringLength(Str) / 2, Y + 4, StrColor, 0, 1);
|
|
}
|
|
//普通
|
|
else {
|
|
L_sq_DrawImg(Path, 0, X, Y);
|
|
if (Icon) L_sq_DrawImg(Icon, IconIdx, X + 3, Y + 1);
|
|
if (Str) L_sq_DrawCode(Str, X + 60 - LenheartTextClass.GetStringLength(Str) / 2, Y + 4, StrColor, 0, 1);
|
|
}
|
|
}
|
|
}
|
|
|
|
//鼠标左键弹起回调
|
|
function OnMouseLbUp(MousePos_X, MousePos_Y) {
|
|
if (isLBDown && OnClick) {
|
|
OnClick(this);
|
|
}
|
|
isLBDown = false;
|
|
}
|
|
}
|
|
|
|
class Lenheart_EachC extends LenheartNewUI_Windows {
|
|
//调试模式
|
|
// DeBugMode = true;
|
|
|
|
//不是窗口
|
|
NoWindow = true;
|
|
|
|
//是否可见
|
|
// Visible = false;
|
|
|
|
Info = null;
|
|
|
|
NPC_Index = null;
|
|
NPC_Flag = false;
|
|
NPC_ButtonMap = null;
|
|
|
|
constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH) {
|
|
Childrens = [];
|
|
NPC_ButtonMap = {};
|
|
//注册控件
|
|
RegisterWidget();
|
|
|
|
LenheartNewUI_Windows.constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH);
|
|
|
|
}
|
|
|
|
function RegisterWidget() {
|
|
|
|
}
|
|
|
|
function Show(obj) {
|
|
|
|
}
|
|
|
|
function TopShow(obj) {
|
|
if (NPC_Index) {
|
|
SyncPos();
|
|
LenheartNewUI_Windows.Show(obj);
|
|
}
|
|
}
|
|
|
|
function DrawMain(obj) {
|
|
// if (Info) {
|
|
// local NPC_Index = Rindro_BaseToolClass.GetEachNpcId();
|
|
// }
|
|
|
|
|
|
}
|
|
|
|
|
|
// function BottomShow() {}
|
|
|
|
//初始化NPC按钮
|
|
function InitNpcButton() {
|
|
Childrens = [];
|
|
if (NPC_ButtonMap.rawin(NPC_Index)) {
|
|
foreach(Func in NPC_ButtonMap[NPC_Index]) {
|
|
Func(this);
|
|
}
|
|
}
|
|
this.Visible = true;
|
|
}
|
|
|
|
function AddEachForNpc(Index, Func) {
|
|
if (NPC_ButtonMap.rawin(Index)) {
|
|
NPC_ButtonMap[Index].append(Func);
|
|
return;
|
|
}
|
|
NPC_ButtonMap.rawset(Index, [Func]);
|
|
}
|
|
|
|
function RemoveEachForNpc(Index) {
|
|
NPC_ButtonMap.rawdelete(Index);
|
|
}
|
|
|
|
//逻辑入口
|
|
function Proc(obj) {
|
|
LenheartNewUI_Windows.SyncPos(X, Y);
|
|
|
|
NPC_Index = Rindro_BaseToolClass.GetEachNpcId();
|
|
if (NPC_Index) {
|
|
if (!NPC_Flag) {
|
|
NPC_Flag = true;
|
|
InitNpcButton();
|
|
}
|
|
} else {
|
|
NPC_Flag = false;
|
|
}
|
|
}
|
|
|
|
function CloseAllEach() {
|
|
local EachClassObject = L_sq_RA(0x1ADE0E0);
|
|
if (EachClassObject) {
|
|
local FristChildOffset = (EachClassObject + 0x68);
|
|
for (local i = 0; i< 74; i++) {
|
|
local AddressBuf = FristChildOffset + (4 * i);
|
|
local ChildAddress = L_sq_RA(AddressBuf);
|
|
if (ChildAddress) {
|
|
local OpenFlag = L_sq_RA(ChildAddress + 0xC);
|
|
if (OpenFlag = 257) L_sq_WA(ChildAddress + 0xC, 256);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function Lenheart_Get_Each_Info() {
|
|
local EachCount = 0;
|
|
local Xpos = 0;
|
|
local Ypos = 0;
|
|
local EachClassObject = L_sq_RA(0x1ADE0E0);
|
|
if (EachClassObject) {
|
|
local FristChildOffset = (EachClassObject + 0x68);
|
|
for (local i = 0; i< 74; i++) {
|
|
local AddressBuf = FristChildOffset + (4 * i);
|
|
local ChildAddress = L_sq_RA(AddressBuf);
|
|
if (ChildAddress) {
|
|
local OpenFlag = L_sq_RA(ChildAddress + 0xC);
|
|
if (OpenFlag == 257) EachCount++;
|
|
}
|
|
//第0个的时候记录一下坐标
|
|
if (i == 0) {
|
|
Xpos = L_sq_RA(ChildAddress + 0x14);
|
|
Ypos = L_sq_RA(ChildAddress + 0x18);
|
|
}
|
|
}
|
|
}
|
|
return {
|
|
Count = EachCount,
|
|
X = Xpos,
|
|
Y = Ypos
|
|
};
|
|
}
|
|
|
|
//override
|
|
//鼠标左键弹起回调
|
|
function OnMouseLbUp(MousePos_X, MousePos_Y) {
|
|
//调用原生方法
|
|
LenheartNewUI_Windows.OnMouseLbUp(MousePos_X, MousePos_Y);
|
|
|
|
|
|
}
|
|
|
|
function SyncPos() {
|
|
//读取交互坐标数据
|
|
Info = Lenheart_Get_Each_Info();
|
|
|
|
X = Info.X;
|
|
Y = Info.Y + (21 * Info.Count);
|
|
//宽度
|
|
Width = 100;
|
|
//高度
|
|
Height = (21 * Childrens.len());
|
|
//同步子对象坐标
|
|
foreach(pos, winobj in Childrens) {
|
|
winobj.X = Info.X;
|
|
winobj.Y = Info.Y + (21 * (Info.Count + pos));
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
function Lenheart_Each_Fun(obj) {
|
|
local RootTab = getroottable();
|
|
if (!RootTab.rawin("L_Each_Obj")) {
|
|
RootTab.rawset("L_Each_Obj", LenheartNewUI_CreateWindow(Lenheart_EachC, "玩家与NPC交互界面窗口", 0, 0, 0, 0, 0));
|
|
}
|
|
}
|
|
|
|
getroottable()["LenheartFuncTab"].rawset("Lenheart_EachN", Lenheart_Each_Fun);
|
|
|
|
|
|
|
|
|
|
|
|
class Lenheart_PlayerEachC extends LenheartNewUI_Windows {
|
|
//调试模式
|
|
// DeBugMode = true;
|
|
|
|
//不是窗口
|
|
NoWindow = true;
|
|
|
|
//是否可见
|
|
// Visible = false;
|
|
|
|
Info = null;
|
|
Basic = null;
|
|
|
|
//当前交互角色姓名
|
|
PlayerEach_Name = null;
|
|
PlayerEach_Flag = false;
|
|
PlayerEach_ButtonMap = null;
|
|
|
|
//通用按钮
|
|
PlayerEach_CommonButtonMap = null;
|
|
|
|
constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH) {
|
|
Childrens = [];
|
|
PlayerEach_ButtonMap = {};
|
|
PlayerEach_CommonButtonMap = {};
|
|
//注册控件
|
|
RegisterWidget();
|
|
|
|
LenheartNewUI_Windows.constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH);
|
|
|
|
}
|
|
|
|
function RegisterWidget() {}
|
|
|
|
function Show(obj) {}
|
|
|
|
function TopShow(obj) {}
|
|
|
|
function DrawMain(obj) {}
|
|
|
|
function MySelfShow() {
|
|
if (PlayerEach_Name) {
|
|
local obj = sq_getMyCharacter();
|
|
LenheartNewUI_Windows.Show(obj);
|
|
}
|
|
}
|
|
|
|
|
|
//初始化NPC按钮
|
|
function InitNpcButton() {
|
|
Childrens = [];
|
|
if (PlayerEach_ButtonMap.rawin(PlayerEach_Name)) {
|
|
foreach(Func in PlayerEach_ButtonMap[PlayerEach_Name]) {
|
|
Func(this);
|
|
}
|
|
}
|
|
foreach(Func in PlayerEach_CommonButtonMap) {
|
|
Func(this);
|
|
}
|
|
this.Visible = true;
|
|
}
|
|
|
|
function AddEachForCommon(Index, Func) {
|
|
PlayerEach_CommonButtonMap.rawset(Index, Func);
|
|
}
|
|
|
|
function RemoveEachForCommon(Index) {
|
|
PlayerEach_CommonButtonMap.rawdelete(Index);
|
|
}
|
|
|
|
function AddEachForPlayerName(Index, Func) {
|
|
if (PlayerEach_ButtonMap.rawin(Index)) {
|
|
PlayerEach_ButtonMap[Index].append(Func);
|
|
return;
|
|
}
|
|
PlayerEach_ButtonMap.rawset(Index, [Func]);
|
|
}
|
|
|
|
function RemoveEachForPlayerName(Index) {
|
|
PlayerEach_ButtonMap.rawdelete(Index);
|
|
}
|
|
|
|
function CloseAllEach() {
|
|
if (Basic) {
|
|
L_sq_WA(L_sq_P2I(Basic) + 0xC, 256);
|
|
}
|
|
}
|
|
|
|
//逻辑入口
|
|
function Proc(obj) {
|
|
LenheartNewUI_Windows.SyncPos(X, Y);
|
|
|
|
local Str = L_Sq_GetPlayerEachName();
|
|
if (Str.len() > 0) {
|
|
PlayerEach_Name = Str;
|
|
}
|
|
if (PlayerEach_Name) {
|
|
if (!PlayerEach_Flag) {
|
|
PlayerEach_Flag = true;
|
|
InitNpcButton();
|
|
}
|
|
} else {
|
|
PlayerEach_Flag = false;
|
|
}
|
|
}
|
|
|
|
//override
|
|
//鼠标左键弹起回调
|
|
function OnMouseLbUp(MousePos_X, MousePos_Y) {
|
|
LenheartNewUI_Windows.OnMouseLbUp(MousePos_X, MousePos_Y);
|
|
}
|
|
|
|
function SelfSyncPos(gInfo) {
|
|
//读取交互坐标数据
|
|
Info = gInfo;
|
|
Basic = gInfo.BasicAdd;
|
|
|
|
X = Info.X;
|
|
Y = Info.Y + (21 * Info.Count);
|
|
//宽度
|
|
Width = 100;
|
|
//高度
|
|
Height = (21 * Childrens.len());
|
|
//同步子对象坐标
|
|
foreach(pos, winobj in Childrens) {
|
|
winobj.X = Info.X;
|
|
winobj.Y = Info.Y + (21 * (Info.Count + pos));
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
RindroPlayerEachDrawFlag <- false;
|
|
RindroPlayerEachDrawCountBuffer <- 0;
|
|
RindroPlayerEachDrawCount <- 0;
|
|
Rindro_Haker.LoadHook(0x10002A0, ["pointer", "int", "int"],
|
|
function(args) {
|
|
if (L_Sq_GetPlayerEachName().len() <= 0) return;
|
|
local Xpos = L_sq_RA(L_sq_P2I(args[0]) + 0x14);
|
|
local Ypos = L_sq_RA(L_sq_P2I(args[0]) + 0x18);
|
|
|
|
if (!RindroPlayerEachDrawFlag) {
|
|
local RootTab = getroottable();
|
|
RindroPlayerEachDrawFlag = true;
|
|
if (RootTab.rawin("L_PlayerEach_Obj")) {
|
|
RootTab["L_PlayerEach_Obj"].SelfSyncPos({
|
|
X = Xpos,
|
|
Y = Ypos,
|
|
Count = RindroPlayerEachDrawCount,
|
|
BasicAdd = args[0]
|
|
});
|
|
RootTab["L_PlayerEach_Obj"].MySelfShow();
|
|
}
|
|
}
|
|
RindroPlayerEachDrawCountBuffer++;
|
|
// print(args[0]);
|
|
return null;
|
|
|
|
},
|
|
function(args) {
|
|
return null;
|
|
});
|
|
|
|
|
|
function Lenheart_PlayerEach_Fun(obj) {
|
|
local RootTab = getroottable();
|
|
RindroPlayerEachDrawFlag = false;
|
|
RindroPlayerEachDrawCount = RindroPlayerEachDrawCountBuffer;
|
|
RindroPlayerEachDrawCountBuffer = 0;
|
|
if (!RootTab.rawin("L_PlayerEach_Obj")) {
|
|
RootTab.rawset("L_PlayerEach_Obj", LenheartNewUI_CreateWindow(Lenheart_PlayerEachC, "玩家与玩家交互界面窗口", 0, 0, 0, 0, 0));
|
|
}
|
|
}
|
|
|
|
getroottable()["LenheartFuncTab"].rawset("Lenheart_PlayerEachN", Lenheart_PlayerEach_Fun); |