/* 文件名: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);