Rindro-Sqr/Project/Recovery/Recovery.nut

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);