/* 文件名:Recovery.nut 路径:Project/Recovery/Recovery.nut 创建日期:2024-11-17 06:16 文件用途:回收系统 */ // class RecoveryMaskC extends LenheartNewUI_Windows { // //信息 // Info = null; // //调试模式 // DeBugMode = true; // constructor(ginfo) { // Childrens = []; // Info = ginfo; // LenheartNewUI_Windows.constructor(Clock() + "+" + Info.type + Info.pos, 0, 0, 0, 0, 0); // } // function Show(obj) { // LenheartNewUI_Windows.Show(obj); // } // //逻辑入口 // function Proc(obj) { // local Window = sq_GetPopupWindowMainCotrol(64); // if (Window) { // X = Window.GetXPos() + ((Info.pos % 8) * 30); // Y = Window.GetYPos() + 206 + ((Info.pos / 8) * 30); // } // LenheartNewUI_Windows.SyncPos(X, Y); // } // } class RecoveryC extends LenheartNewUI_Windows { //包头 Op = 20085000; //调试模式 // DeBugMode = true; //不是窗口 // NoWindow = true; //是否可见 Visible = false; //待回收列表 RecoveryList = null; //待回收绘制列表 RecoveryDrawList = null; //回收奖励列表 RecoveryRewardList = null; //当前绘制对象 DrawItemCurObject = null; //时间对象 Timer = null; Img = Rindro_Image("recovery/main.img"); LenheartUI = Rindro_Image("interface/lenheartwindowcommon.img"); //获取配置包 function GetBaseConfig() { local T = { op = Op + 1 } SendPackEx(T); } //配置包 function BaseConfig(Chunk) { local Jso = Json.Decode(Chunk); //注册NPC功能 RegisterNpc(Jso.npc_id); } function RefreshRecoveryItemListCallBack(Chunk) { local Jso = Json.Decode(Chunk); RecoveryRewardList = Jso.reward; } //遍历背包查找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) return { type = z, pos = i, vis = false, count = MemoryTool.DecodeMemoryData(FindAddress + 0x1A4), itemId = L_sq_RA(FindAddress + 0x1c) } } } return null; } constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH) { Childrens = []; RecoveryList = {}; RecoveryDrawList = []; Timer = Clock(); // RecoveryList.rawset(0x3EA5B400, {}); //注册控件 RegisterWidget(); LenheartNewUI_Windows.constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH); Pack_Control.rawset(Op + 2, BaseConfig.bindenv(this)); Pack_Control.rawset(Op + 4, RefreshRecoveryItemListCallBack.bindenv(this)); DiscardItemCallBackFunc.rawset("RecoveryC", DiscardItem.bindenv(this)); GetBaseConfig(); // local Ret = L_sq_GetWindowById(64); // print(Ret); } //刷新回收道具列表包 function RefreshRecoveryItemList() { local Arr = []; foreach(obj in RecoveryList) { Arr.append(obj); } local T = { op = Op + 3 } if (Arr.len() > 0) T.list <- Arr; SendPackEx(T); } //回收道具回调 function DiscardItem(ItemAddress) { if (!Visible) return true; else { local info = FindItemPosByForeachInven(ItemAddress); if (info) { if (!(RecoveryList.rawin(ItemAddress)) && RecoveryList.len()< 60) { //绘制列表 RecoveryDrawList.append(ItemAddress); // info.Mask <- RecoveryMaskC(info); // AddChild(info.Mask); RecoveryList.rawset(ItemAddress, info); } } RefreshRecoveryItemList(); } } //移除绘制道具列表中指定Item function RemoveDrawItem(ItemAddress) { for (local i = 0; i< RecoveryDrawList.len(); i++) { if (RecoveryDrawList[i] == ItemAddress) { RecoveryDrawList.remove(i); break; } } if (RecoveryList.rawin(ItemAddress)) { RecoveryList.rawdelete(DrawItemCurObject); } RefreshRecoveryItemList(); } function RegisterNpc(id) { local EachManager = getroottable()["L_Each_Obj"]; //先清空注册 EachManager.RemoveEachForNpc(id); 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 = 27; ApplyEngagementButton.Str = "回收"; ApplyEngagementButton.OnClick = function(Button) { //打开背包 L_sq_Open_ExWindow(0x1ADE090, 0, 0, 1); Button.Parent.CloseAllEach(); Button.Parent.CloseWindow(); Visible = true; RecoveryList = {}; RecoveryDrawList = []; RecoveryRewardList = null; ResetFocus(); }.bindenv(this); ApplyEngagementButton.SetCallBackFunc(function(Button) {}) SThis.AddChild(ApplyEngagementButton); }.bindenv(this)); } function RegisterWidget() { // //关闭按钮 // local CloseButton = LenheartNewUI_BaseButton(278, 0, 11, 12, "interface/lenheartwindowcommon.img", 276); // CloseButton.OnClick = function() { // this.Visible = false; // }.bindenv(this); // Childrens.append(CloseButton); local CloseButton = LenheartNewUI_ButtonText(100, 381, 5, "确认"); CloseButton.SetTextOffset(0, 1); CloseButton.OnClick = function() { if (RecoveryList.len() <= 0) return; local T = { op = Op + 5 } SendPackEx(T); RecoveryList = {}; RecoveryDrawList = []; RecoveryRewardList = null; }.bindenv(this); AddChild(CloseButton); local CloseButton = LenheartNewUI_ButtonText(240, 381, 5, "取消"); CloseButton.SetTextOffset(0, 1); CloseButton.OnClick = function() { this.Visible = false; RecoveryList = {}; RecoveryDrawList = []; }.bindenv(this); AddChild(CloseButton); } //绘制主界面 function DrawMain(obj) { //Item信息框一般为211的宽度 L_sq_DrawWindow(X - 5, Y + 14, 400, 356, "interface/lenheartwindowcommon.img", 97, 11, 12, 11, 13); Img.DrawExPng(0, X + 0, Y + 0, 0, sq_RGBA(255, 255, 255, 250), 0.92, 0.92); //标题栏 L_sq_DrawButton(X - 5, Y, 405, "interface/lenheartwindowcommon.img", 609, 2, 7); LenheartUI.DrawExPng(425, X + 191, Y + 221, 0, sq_RGBA(255, 255, 255, 250), 0.92, 0.92); foreach(Pos, Object in RecoveryDrawList) { local Info = RecoveryList[Object]; DrawItemCur(Object, Info, X + 13 + ((Pos % 12) * 32), Y + 42 + ((Pos / 12) * 34)); } if (RecoveryRewardList) { local drawpos = 0; foreach(Index, Count in RecoveryRewardList) { DrawItemEx(X + 13 + ((drawpos % 12) * 32), Y + 250 + ((drawpos / 12) * 34), Index.tointeger(), Count); drawpos++; } } } //绘制项目 function DrawItemCur(Object, Info, XPos, Ypos) { local Id = L_sq_RA(Object + 0x1C); local Rarity = L_sq_RA(Object + 0xF4); L_sq_DrawImg("interface2/rindro_reward.img", Rarity, XPos - 3, Ypos - 3); L_Sq_DrawItem(XPos, Ypos, Id, Info.count, 0, 0, 0); if (sq_IsIntersectRect(IMouse.GetXPos(), IMouse.GetYPos(), 1, 1, XPos, Ypos, 24, 24)) { //打开道具信息窗口 if (!Info.vis) { //手动解锁道具信息窗口 Sq_Memory_WriteByteArr(L_sq_I2P(0xF63DDA), [0x56, 0xE8, 0x10, 0xFE, 0xFF, 0xFF]); local ItemDrawInfo = L_Sq_CallFunc(0xE6E070, "int", FFI_THISCALL, ["int", "int", "int", "int"], L_sq_RA(0x1A5FB20), 275, Object, 41); //校准道具信息窗口位置 L_Sq_CallFunc(0xF3B3B0, "int", FFI_THISCALL, ["int", "int", "int", "int", "int"], ItemDrawInfo, IMouse.GetXPos(), IMouse.GetYPos(), 24, 24); Info.vis = true; //我自己UI打开的道具信息窗口需要把渲染队列改为下层 以显示我打开的道具 getroottable().WindowsShowABFlag <- false; DrawItemCurObject = Object; } } else { if (Info.vis) { //关闭道具信息窗口 L_Sq_CallFunc(0xE6B2B0, "int", FFI_THISCALL, ["int", "int", "int", "char"], 0x1ADE090, 0x113, 0xFFFFFFFF, 0x0); Info.vis = false; DrawItemCurObject = null; } } } //override //鼠标右键按下回调 function OnMouseRbDown(MousePos_X, MousePos_Y) { if (DrawItemCurObject) { if (RecoveryList.rawin(DrawItemCurObject)) { local Info = RecoveryList[DrawItemCurObject]; if (Info.vis) { //关闭道具信息窗口 L_Sq_CallFunc(0xE6B2B0, "int", FFI_THISCALL, ["int", "int", "int", "char"], 0x1ADE090, 0x113, 0xFFFFFFFF, 0x0); Info.vis = false; RemoveDrawItem(DrawItemCurObject); DrawItemCurObject = null; } } } //调用原生方法 LenheartNewUI_Windows.OnMouseLbDown(MousePos_X, MousePos_Y); } function Show(obj) { DrawMain(obj); LenheartNewUI_Windows.Show(obj); } //逻辑入口 function Proc(obj) { // //接管鼠标设定逻辑 // if (Visible) { // _Rindro_Cusor_.TakeoverFlag = true; // } else { // _Rindro_Cusor_.TakeoverFlag = false; // } //同步位移窗口逻辑 local Window = sq_GetPopupWindowMainCotrol(64); if (Window) { X = Window.GetXPos() - 430; Y = Window.GetYPos() + 60; } //悬停已回收锁定逻辑 local SelectItem = L_sq_RA(0x1AE45B4); if (SelectItem) { if (RecoveryList.rawin(SelectItem)) { R_Mouse.Lock(); _Rindro_Cusor_.ForceLockState = true; } else { _Rindro_Cusor_.ForceLockState = false; } } else { _Rindro_Cusor_.ForceLockState = false; } LenheartNewUI_Windows.SyncPos(X, Y); } } getroottable().rawdelete("Recovery_Obj"); function Lenheart_Recovery_Fun(obj) { local RootTab = getroottable(); if (!RootTab.rawin("Recovery_Obj")) { RootTab.rawset("Recovery_Obj", true); LenheartNewUI_CreateWindow(RecoveryC, "回收系统窗口", 43, 128, 420, 412, 0); } } getroottable()["LenheartFuncTab"].rawset("RecoveryFuncN", Lenheart_Recovery_Fun);