11111
This commit is contained in:
350
Project/Recovery/Recovery.nut
Normal file
350
Project/Recovery/Recovery.nut
Normal file
@@ -0,0 +1,350 @@
|
||||
/*
|
||||
文件名: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);
|
||||
Reference in New Issue
Block a user