327 lines
12 KiB
Plaintext
327 lines
12 KiB
Plaintext
|
|
/*
|
||
|
|
文件名:ItemCrossover.nut
|
||
|
|
路径:Project/ItemTool/ItemCrossover/ItemCrossover.nut
|
||
|
|
创建日期:2025-12-14 20:47
|
||
|
|
文件用途:
|
||
|
|
*/
|
||
|
|
class ItemCrossoverC extends LenheartNewUI_Windows {
|
||
|
|
//调试模式
|
||
|
|
// DeBugMode = true;
|
||
|
|
|
||
|
|
//不是窗口
|
||
|
|
// NoWindow = true;
|
||
|
|
|
||
|
|
//是否可见
|
||
|
|
Visible = false;
|
||
|
|
|
||
|
|
NPCList = null;
|
||
|
|
|
||
|
|
Img = Rindro_Image("interface2/ui/newitemtool/newitemtool.img");
|
||
|
|
|
||
|
|
//待跨界装备
|
||
|
|
CrossoverItem = null;
|
||
|
|
|
||
|
|
//错误信息
|
||
|
|
ErrorMsg = null;
|
||
|
|
//所需材料信息
|
||
|
|
MaterialInfo = null;
|
||
|
|
//所需材料是否足够
|
||
|
|
MaterialIsEnough = false;
|
||
|
|
|
||
|
|
|
||
|
|
constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH) {
|
||
|
|
Childrens = [];
|
||
|
|
//注册控件
|
||
|
|
RegisterWidget();
|
||
|
|
|
||
|
|
LenheartNewUI_Windows.constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH);
|
||
|
|
InifPvf();
|
||
|
|
RegNpc();
|
||
|
|
|
||
|
|
DiscardItemCallBackFunc.rawset("ItemCrossoverC", DiscardItem.bindenv(this));
|
||
|
|
|
||
|
|
Pack_Control.rawset(21007002, function(Chunk) {
|
||
|
|
local Jso = Json.Decode(Chunk);
|
||
|
|
if (Jso.rawin("error")) {
|
||
|
|
ErrorMsg = 1;
|
||
|
|
}
|
||
|
|
if (Jso.rawin("MgInfo")) {
|
||
|
|
MaterialInfo = Jso.MgInfo;
|
||
|
|
//材料是否充足
|
||
|
|
MaterialIsEnough = true;
|
||
|
|
foreach(Info in MaterialInfo) {
|
||
|
|
if (Info.NeedCount > Info.RealCount) {
|
||
|
|
MaterialIsEnough = false;
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}.bindenv(this));
|
||
|
|
|
||
|
|
//成功跨界回包
|
||
|
|
Pack_Control.rawset(21007004, function(Chunk) {
|
||
|
|
//清空
|
||
|
|
CrossoverItem = null;
|
||
|
|
ErrorMsg = null;
|
||
|
|
MaterialInfo = null;
|
||
|
|
MaterialIsEnough = false;
|
||
|
|
R_Utils.PlaySound("CHNUTTREE_BOX");
|
||
|
|
}.bindenv(this));
|
||
|
|
}
|
||
|
|
|
||
|
|
function RegisterWidget() {
|
||
|
|
//关闭按钮
|
||
|
|
local CloseButton = LenheartNewUI_BaseButton(274, 4, 11, 12, "interface/lenheartwindowcommon.img", 276);
|
||
|
|
CloseButton.OnClick = function() {
|
||
|
|
this.Visible = false;
|
||
|
|
}.bindenv(this);
|
||
|
|
Childrens.append(CloseButton);
|
||
|
|
|
||
|
|
//确认按钮
|
||
|
|
local CrossoverButton = LenheartNewUI_ButtonText(109, 260, 15, "确认跨界");
|
||
|
|
CrossoverButton.DWidth = 18;
|
||
|
|
CrossoverButton.Width = 74;
|
||
|
|
CrossoverButton.SetTextOffset(-4, 1);
|
||
|
|
CrossoverButton.OnClickEx = function(Btn) {
|
||
|
|
if (!Btn.Visible) return;
|
||
|
|
SendPackEx({
|
||
|
|
op = 21007003,
|
||
|
|
item = CrossoverItem
|
||
|
|
});
|
||
|
|
}.bindenv(this);
|
||
|
|
CrossoverButton.SetCallBackFunc(function(Btn) {
|
||
|
|
// if (mode >= 1 && mode< 3) {
|
||
|
|
// Btn.Visible = true;
|
||
|
|
// } else {
|
||
|
|
// Btn.Visible = false;
|
||
|
|
// }
|
||
|
|
if (ErrorMsg || !MaterialIsEnough) {
|
||
|
|
Btn.State = 8;
|
||
|
|
} else {
|
||
|
|
Btn.State = 0;
|
||
|
|
}
|
||
|
|
}.bindenv(this));
|
||
|
|
AddChild(CrossoverButton);
|
||
|
|
}
|
||
|
|
|
||
|
|
//绘制主界面
|
||
|
|
function DrawMain(obj) {
|
||
|
|
//背景框
|
||
|
|
DrawNineBox(X, Y, 292, 292, "interface/lenheartwindowcommon.img", 213);
|
||
|
|
//标题
|
||
|
|
DrawWindowTitle(293);
|
||
|
|
//绘制标题名
|
||
|
|
L_sq_DrawCode("装备跨界", X + 123, Y + 5, sq_RGBA(230, 200, 155, 255), 0, 1);
|
||
|
|
|
||
|
|
Img.DrawPng(0, X + 8, Y + 32);
|
||
|
|
|
||
|
|
if (CrossoverItem) {
|
||
|
|
//绘制不可跨界原因
|
||
|
|
if (ErrorMsg) {
|
||
|
|
local str = "该装备不可跨界!";
|
||
|
|
L_sq_DrawCode(str, X + 147 - LenheartTextClass.GetStringLength(str) / 2, Y + 142, sq_RGBA(255, 60, 48, 255), 0, 1);
|
||
|
|
for (local i = 0; i< 5; i++) {
|
||
|
|
Img.DrawPng(2, X + 31 + 51 * i, Y + 195);
|
||
|
|
}
|
||
|
|
} else {
|
||
|
|
//绘制跨界所需材料及数量信息
|
||
|
|
if (MaterialInfo) {
|
||
|
|
for (local i = 0; i< 5; i++) {
|
||
|
|
if (i >= MaterialInfo.len()) {
|
||
|
|
Img.DrawPng(2, X + 31 + 51 * i, Y + 195);
|
||
|
|
continue;
|
||
|
|
}
|
||
|
|
local Info = MaterialInfo[i];
|
||
|
|
DrawItemBase(X + 31 + 51 * i, Y + 195, Info.Item, Info.NeedCount);
|
||
|
|
//数量不足绘制遮盖图
|
||
|
|
if (Info.NeedCount > Info.RealCount) {
|
||
|
|
Rindro_Image_GlobalMap["lenheartui"].DrawExPng(257, X + 32 + 51 * i, Y + 196, 0, sq_RGBA(255, 255, 255, 120), 1.0, 1.0);
|
||
|
|
}
|
||
|
|
|
||
|
|
local RealCountStr = Info.RealCount.tostring();
|
||
|
|
local Color = Info.RealCount >= Info.NeedCount ? sq_RGBA(52, 255, 50, 255) : sq_RGBA(255, 60, 47, 255);
|
||
|
|
L_sq_DrawCode(RealCountStr, X + 46 + (51 * i) - LenheartTextClass.GetStringLength(RealCountStr) / 2, Y + 232, Color, 0, 1);
|
||
|
|
}
|
||
|
|
|
||
|
|
if (!MaterialIsEnough) {
|
||
|
|
local str = "跨界材料不足!";
|
||
|
|
L_sq_DrawCode(str, X + 147 - LenheartTextClass.GetStringLength(str) / 2, Y + 142, sq_RGBA(255, 60, 48, 255), 0, 1);
|
||
|
|
} else {
|
||
|
|
local str = CrossoverItem.Name;
|
||
|
|
L_sq_DrawCode(str, X + 147 - LenheartTextClass.GetStringLength(str) / 2, Y + 142, GetRarityColor(CrossoverItem.Rarity), 0, 1);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
DrawItemObject(X + 133, Y + 96, CrossoverItem);
|
||
|
|
}
|
||
|
|
|
||
|
|
local MousePos_X = IMouse.GetXPos();
|
||
|
|
local MousePos_Y = IMouse.GetYPos();
|
||
|
|
if (sq_IsIntersectRect(MousePos_X, MousePos_Y, 1, 1, X + 132, Y + 95, 30, 30)) {
|
||
|
|
L_sq_SetDrawImgModel(2, 0);
|
||
|
|
Rindro_Image_GlobalMap["lenheartui"].DrawPng(353, X + 132, Y + 95);
|
||
|
|
L_sq_ReleaseDrawImgModel();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
//绘制道具带道具信息
|
||
|
|
function DrawItemObject(X, Y, Object) {
|
||
|
|
if (!Object) return;
|
||
|
|
L_Sq_DrawItem(X, Y, Object.ItemId, Object.Count, 0, 0, 0);
|
||
|
|
if (sq_IsIntersectRect(IMouse.GetXPos(), IMouse.GetYPos(), 1, 1, X, Y, 30, 30)) {
|
||
|
|
//打开道具信息窗口
|
||
|
|
if (!ItemInfoDrawS) {
|
||
|
|
ItemInfoDrawS = L_Sq_CallFunc(0xE6E070, "int", FFI_THISCALL, ["int", "int", "int", "int"], L_sq_RA(0x1A5FB20), 275, Object.ItemAddress, 41);
|
||
|
|
//校准道具信息窗口位置
|
||
|
|
L_Sq_CallFunc(0xF3B3B0, "int", FFI_THISCALL, ["int", "int", "int", "int", "int"], ItemInfoDrawS, IMouse.GetXPos(), IMouse.GetYPos(), 28, 28);
|
||
|
|
//我自己UI打开的道具信息窗口需要把渲染队列改为下层 以显示我打开的道具
|
||
|
|
getroottable().WindowsShowABFlag <- false;
|
||
|
|
}
|
||
|
|
} else {
|
||
|
|
if (ItemInfoDrawS) {
|
||
|
|
L_Sq_CallFunc(0xE6B2B0, "int", FFI_THISCALL, ["int", "int", "int", "char"], 0x1ADE090, 0x113, 0xFFFFFFFF, 0x0);
|
||
|
|
ItemInfoDrawS = null;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function Show(obj) {
|
||
|
|
DrawMain(obj);
|
||
|
|
LenheartNewUI_Windows.Show(obj);
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
//逻辑入口
|
||
|
|
function Proc(obj) {
|
||
|
|
LenheartNewUI_Windows.SyncPos(X, Y);
|
||
|
|
}
|
||
|
|
|
||
|
|
//回收道具回调
|
||
|
|
function DiscardItem(ItemAddress) {
|
||
|
|
local MousePos_X = IMouse.GetXPos();
|
||
|
|
local MousePos_Y = IMouse.GetYPos();
|
||
|
|
if (!sq_IsIntersectRect(MousePos_X, MousePos_Y, 1, 1, X, Y, Width, Height)) return true;
|
||
|
|
if (!Visible) return true;
|
||
|
|
else {
|
||
|
|
CrossoverItem = FindItemPosByForeachInven(ItemAddress);
|
||
|
|
//清空
|
||
|
|
ErrorMsg = null;
|
||
|
|
MaterialInfo = null;
|
||
|
|
MaterialIsEnough = false;
|
||
|
|
|
||
|
|
if (CrossoverItem) {
|
||
|
|
SendPackEx({
|
||
|
|
op = 21007001,
|
||
|
|
item = CrossoverItem
|
||
|
|
});
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
//遍历背包查找Item
|
||
|
|
function FindItemPosByForeachInven(FindAddress) {
|
||
|
|
local Inven = L_sq_RA(0x1A5FB24);
|
||
|
|
local InvenAdd = L_sq_RA(Inven + 56);
|
||
|
|
InvenAdd += 36;
|
||
|
|
for (local z = 0; z< 5; z++) {
|
||
|
|
for (local i = 0; i< 48; i++) {
|
||
|
|
local ItemAdd = L_sq_RA(InvenAdd + ((i + (z * 48)) * 4));
|
||
|
|
if (ItemAdd == FindAddress) {
|
||
|
|
local NamePointer = L_sq_RA(FindAddress + 0x20);
|
||
|
|
if (z != 0) {
|
||
|
|
if (ItemInfoDrawS) {
|
||
|
|
L_Sq_CallFunc(0xE6B2B0, "int", FFI_THISCALL, ["int", "int", "int", "char"], 0x1ADE090, 0x113, 0xFFFFFFFF, 0x0);
|
||
|
|
ItemInfoDrawS = null;
|
||
|
|
ResetFocus();
|
||
|
|
}
|
||
|
|
return null;
|
||
|
|
}
|
||
|
|
return {
|
||
|
|
Type = z,
|
||
|
|
Pos = i,
|
||
|
|
Vis = false,
|
||
|
|
Count = MemoryTool.DecodeMemoryData(FindAddress + 0x1A4),
|
||
|
|
ItemId = L_sq_RA(FindAddress + 0x1c),
|
||
|
|
ItemAddress = FindAddress,
|
||
|
|
Name = NativePointer(L_sq_I2P(NamePointer)).readUnicodeString()
|
||
|
|
Rarity = L_sq_RA(FindAddress + 0xF4),
|
||
|
|
};
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return null;
|
||
|
|
}
|
||
|
|
|
||
|
|
function InifPvf() {
|
||
|
|
Rindro_Script.GetFileData("etc/rindro/itemtool/itemcrossover/itemcrossover.etc", function(DataTable, Data) {
|
||
|
|
while (!Data.Eof()) {
|
||
|
|
local Fragment = Data.Get();
|
||
|
|
if (Fragment == "[NPC]") {
|
||
|
|
NPCList = [];
|
||
|
|
while (true) {
|
||
|
|
local Fbuf = Data.Get();
|
||
|
|
if (Fbuf == "[/NPC]") {
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
NPCList.append(Fbuf);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
function RegNpc() {
|
||
|
|
local EachManager = Lenheart_Get_EachObj();
|
||
|
|
foreach(id in NPCList) {
|
||
|
|
//先清空注册
|
||
|
|
EachManager.AddEachForNpc(id, function(SThis) {
|
||
|
|
//关闭按钮
|
||
|
|
local ApplyEngagementButton = LenheartNewUI_Each_BaseButton(0, 0, 100, 21, "interface2/popup_menu/popup_back.img", 3);
|
||
|
|
ApplyEngagementButton.Icon = "interface2/popup_menu/popup_icon_cn.img";
|
||
|
|
ApplyEngagementButton.IconIdx = 53;
|
||
|
|
ApplyEngagementButton.Str = "装备跨界";
|
||
|
|
ApplyEngagementButton.Data = SThis.NPC_Index;
|
||
|
|
ApplyEngagementButton.OnClick = function(Button) {
|
||
|
|
|
||
|
|
InitWindow();
|
||
|
|
//打开背包
|
||
|
|
L_sq_Open_ExWindow(0x1ADE090, 0, 0, 1);
|
||
|
|
Button.Parent.CloseAllEach();
|
||
|
|
Button.Parent.CloseWindow();
|
||
|
|
ResetFocus();
|
||
|
|
R_Utils.PlaySound("WINDOW_SHOW");
|
||
|
|
}.bindenv(this);
|
||
|
|
ApplyEngagementButton.SetCallBackFunc(function(Button) {})
|
||
|
|
SThis.AddChild(ApplyEngagementButton);
|
||
|
|
}.bindenv(this));
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function InitWindow() {
|
||
|
|
Visible = true;
|
||
|
|
//清空
|
||
|
|
CrossoverItem = null;
|
||
|
|
ErrorMsg = null;
|
||
|
|
MaterialInfo = null;
|
||
|
|
MaterialIsEnough = false;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
L_Windows_List <- [];
|
||
|
|
getroottable().rawdelete("LenheartPluginsInitFlag");
|
||
|
|
getroottable().rawdelete("EventList_Obj")
|
||
|
|
getroottable().rawdelete("ItemCrossover_Obj");
|
||
|
|
getroottable().rawdelete("L_Each_Obj");
|
||
|
|
|
||
|
|
function Lenheart_ItemCrossover_Fun(obj) {
|
||
|
|
local RootTab = getroottable();
|
||
|
|
if (!RootTab.rawin("ItemCrossover_Obj")) {
|
||
|
|
RootTab.rawset("ItemCrossover_Obj", true);
|
||
|
|
LenheartNewUI_CreateWindow(ItemCrossoverC, "装备跨界窗口", ((getroottable().Rindro_Scr_Width - 700) / 2).tointeger(), 160, 292, 290, 28);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
getroottable()["LenheartFuncTab"].rawset("ItemCrossoverFuncN", Lenheart_ItemCrossover_Fun);
|