350 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
		
		
			
		
	
	
			350 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
|  | /* | ||
|  | 文件名: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); |