This commit is contained in:
2025-08-27 08:45:37 +08:00
parent f3d0cbd222
commit 0d0465fad3
20 changed files with 2263 additions and 330 deletions

View File

@@ -0,0 +1,359 @@
/*
文件名:Exchange.nut
路径:Project/Exchange/Exchange.nut
创建日期:2025-07-23 00:02
文件用途:交易所
*/
class ExchangeC extends LenheartNewUI_Windows {
//包头
Op = 21001000;
//调试模式
// DeBugMode = true;
//不是窗口
// NoWindow = true;
//是否可见
Visible = false;
//手续费
Commission = 0;
//最低价Map
MinPriceMap = null;
//待回收道具
RecoveryItem = null;
//绘制对象的信息
DrawItemCurObject = null;
//输入框
InputObject = null;
//上架价值
InputValue = null;
//时间对象
Timer = null;
Img = Rindro_Image("interface2/yosin/exchange.img");
LenheartUI = Rindro_Image("interface/lenheartwindowcommon.img");
//遍历背包查找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),
name = NativePointer(L_sq_I2P(L_sq_RA(FindAddress + 0x20))).readUnicodeString(),
level = L_sq_RA(FindAddress + 0x8)
}
}
}
return null;
}
constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH) {
Childrens = [];
Timer = Clock();
//注册控件
RegisterWidget();
LenheartNewUI_Windows.constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH);
//初始化PVF配置
InitScriptConfig();
DiscardItemCallBackFunc.rawset("ExchangeC", DiscardItem.bindenv(this));
DiscardItem(1011932160);
}
function InitScriptConfig() {
MinPriceMap = {};
Rindro_Script.GetFileData("etc/rindro/exchange/exchange.etc", function(DataTable, Data) {
while (!Data.Eof()) {
local Str = Data.Get();
if (Str == "[commission]") {
Commission = Data.Get().tofloat() * 0.01;
} else if (Str == "[bottom price]") {
while (!Data.Eof()) {
local Str = Data.Get();
local Str2 = Data.Get();
if (Str == "[/bottom price]") break;
else {
MinPriceMap[Str] <- Str2.tointeger();
}
}
}
}
}.bindenv(this));
}
//回收道具回调
function DiscardItem(ItemAddress) {
// print(ItemAddress);
if (!Visible) return true;
else {
local info = FindItemPosByForeachInven(ItemAddress);
if (info) {
RecoveryItem = null;
DrawItemCurObject = null;
InputObject.str = "";
InputValue = null;
info.ObjectAddress <- ItemAddress;
RecoveryItem = info;
}
}
}
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;
ResetFocus();
}.bindenv(this);
ApplyEngagementButton.SetCallBackFunc(function(Button) {})
SThis.AddChild(ApplyEngagementButton);
}.bindenv(this));
}
function RegisterWidget() {
//关闭按钮
local CloseButton = LenheartNewUI_BaseButton(332, 0, 11, 12, "interface/lenheartwindowcommon.img", 276);
CloseButton.OnClick = function() {
this.Visible = false;
}.bindenv(this);
AddChild(CloseButton);
local CloseButton = LenheartNewUI_ButtonText(80, 324, 5, "上架");
CloseButton.SetTextOffset(0, 1);
CloseButton.OnClick = function() {
if (!RecoveryItem) return;
local equvalue = InputValue.tointeger();
//如果是装备判断一下最低价格
if (RecoveryItem.type == 0) {
local EquipLevel = RecoveryItem.level;
local MinPrice = getMinPrice(EquipLevel);
if (equvalue< MinPrice) {
equvalue = MinPrice;
}
}
local T = {
op = Op + 1,
type = RecoveryItem.type,
pos = RecoveryItem.pos,
value = equvalue
}
SendPackEx(T);
RecoveryItem = null;
DrawItemCurObject = null;
InputObject.str = "";
InputValue = null;
}.bindenv(this);
AddChild(CloseButton);
local CloseButton = LenheartNewUI_ButtonText(210, 324, 5, "取消");
CloseButton.SetTextOffset(0, 1);
CloseButton.OnClick = function() {
this.Visible = false;
RecoveryItem = null;
DrawItemCurObject = null;
InputObject.str = "";
InputValue = null;
}.bindenv(this);
AddChild(CloseButton);
//输入框
InputObject = LenheartNewUI_BaseInput(120, 209, 110, 20);
InputObject.CallBack = function(Input, oldStr) {
if (Rindro_BaseToolClass.IsNumber(Input.str)) {
local buf = Input.str.tointeger();
if (buf == 2147483647) {
Input.SetStr("2147483647");
}
InputValue = buf;
}
}.bindenv(this);
AddChild(InputObject);
}
function getMinPrice(equiplevel) {
// 从当前等级开始查找
local currentLevel = equiplevel;
// 循环查找更低的等级直到找到或等级小于1
while (currentLevel >= 1) {
// 检查当前等级是否存在于映射表中
if (MinPriceMap.rawin(currentLevel)) {
return MinPriceMap[currentLevel];
}
// 降低一个等级继续查找
currentLevel--;
}
// 如果所有等级都找不到返回null或默认值
return null;
}
//绘制主界面
function DrawMain(obj) {
Rindro_BaseToolClass.DrawNineBox(X - 2, Y + 14, 354, 350, "interface/lenheartwindowcommon.img", 0); //背景框
//绘制背景图
Img.DrawPng(0, X + 0, Y + 0);
//绘制点卷图标
Img.DrawPng(1, X + 100, Y + 210);
//绘制标题
L_sq_DrawCode("上架物品", X + 152, Y + 3, sq_RGBA(221, 197, 147, 250), 1, 1);
//如果有上架道具 则绘制
if (RecoveryItem) {
DrawItemCur(RecoveryItem.ObjectAddress, RecoveryItem, X + 162, Y + 80);
L_sq_DrawCode(RecoveryItem.name, X + 176 - LenheartTextClass.GetStringLength(RecoveryItem.name) / 2, Y + 130, sq_RGBA(221, 197, 147, 250), 1, 1);
}
if (InputValue) {
local CommissionStr = (InputValue * Commission).tointeger().tostring(); //手续费
local EstimatedRevenue = (InputValue - (InputValue * Commission)).tointeger().tostring();
L_sq_DrawCode("手续费: " + CommissionStr, X + 154 - (LenheartTextClass.GetStringLength(CommissionStr) / 2), Y + 247, sq_RGBA(221, 197, 147, 250), 1, 1);
L_sq_DrawCode("预计收入: " + EstimatedRevenue, X + 146 - (LenheartTextClass.GetStringLength(EstimatedRevenue) / 2), Y + 282, sq_RGBA(221, 197, 147, 250), 1, 1);
}
}
//绘制项目
function DrawItemCur(Object, Info, XPos, Ypos) {
local Id = L_sq_RA(Object + 0x1C);
local Rarity = L_sq_RA(Object + 0xF4);
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;
}
}
}
function Show(obj) {
DrawMain(obj);
LenheartNewUI_Windows.Show(obj);
}
//逻辑入口
function Proc(obj) {
//同步位移窗口逻辑
local Window = sq_GetPopupWindowMainCotrol(64);
if (Window) {
X = Window.GetXPos() - 430;
Y = Window.GetYPos() + 60;
}
//悬停已回收锁定逻辑
local SelectItem = L_sq_RA(0x1AE45B4);
if (RecoveryItem && RecoveryItem.rawin("ObjectAddress")) {
if (RecoveryItem.ObjectAddress == SelectItem) {
R_Mouse.Lock();
_Rindro_Cusor_.ForceLockState = true;
} else {
_Rindro_Cusor_.ForceLockState = false;
}
} else {
_Rindro_Cusor_.ForceLockState = false;
}
LenheartNewUI_Windows.SyncPos(X, Y);
if (Timer) {
if (Clock() - Timer >= 2000) {
Timer = null;
RegisterNpc(1);
}
}
}
//override
//鼠标右键按下回调
function OnMouseRbDown(MousePos_X, MousePos_Y) {
if (DrawItemCurObject && RecoveryItem) {
local Info = RecoveryItem;
if (Info.vis) {
//关闭道具信息窗口
L_Sq_CallFunc(0xE6B2B0, "int", FFI_THISCALL, ["int", "int", "int", "char"], 0x1ADE090, 0x113, 0xFFFFFFFF, 0x0);
Info.vis = false;
RecoveryItem = null;
DrawItemCurObject = null;
InputObject.str = "";
InputValue = null;
}
}
//调用原生方法
LenheartNewUI_Windows.OnMouseLbDown(MousePos_X, MousePos_Y);
}
}
function Lenheart_Exchange_Fun(obj) {
local RootTab = getroottable();
if (!RootTab.rawin("Exchange_Obj")) {
RootTab.rawset("Exchange_Obj", true);
LenheartNewUI_CreateWindow(ExchangeC, "交易所窗口", 43, 128, 420, 412, 0);
}
}
getroottable()["LenheartFuncTab"].rawset("ExchangeFuncN", Lenheart_Exchange_Fun);
// L_Windows_List <- [];
// getroottable().rawdelete("LenheartPluginsInitFlag");
// getroottable().rawdelete("EventList_Obj")
// getroottable().rawdelete("Exchange_Obj");

View File

@@ -0,0 +1,330 @@
/*
文件名:Exchange_auc.nut
路径:Project/Exchange/Exchange_auc.nut
创建日期:2025-07-23 13:13
文件用途:交易所拍卖行
*/
class Exchange_aucC extends LenheartNewUI_Windows {
//调试模式
// DeBugMode = true;
//不是窗口
// NoWindow = true;
//是否可见
Visible = false;
Img = null;
//标题按钮集合
TitleButtonList = null;
//页面
Page = 0;
//子页面
SubPage = 0;
//总条数
Total = 0;
//拍卖信息
AuctionInfo = null;
//选中拍品
SelectAuction = null;
function QueryExchange() {
AuctionInfo = [];
SendPackEx({
op = 21001003,
type = Page + 1,
offset = SubPage * 7
})
}
constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH) {
Childrens = [];
TitleButtonList = [];
AuctionInfo = [];
//注册控件
RegisterWidget();
LenheartNewUI_Windows.constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH);
Img = {};
Img["main"] <- Rindro_Image("interface2/yosin/exchange.img");
//查询拍卖信息回包
RegisterPack(21001004, function(Chunk) {
local Jso = Json.Decode(Chunk);
Total = Jso.total;
foreach(infoobj in Jso.info) {
infoobj.itemName <- NativePointer(L_sq_I2P(L_sq_RA(L_sq_GetItem(infoobj.itemId) + 0x20))).readUnicodeString()
local buf = Exchange_aucC_Item(this, infoobj);
AuctionInfo.append(buf);
}
}.bindenv(this));
}
function RegisterWidget() {
//关闭按钮
local CloseButton = LenheartNewUI_BaseButton(388, 2, 11, 12, "interface/lenheartwindowcommon.img", 276);
CloseButton.OnClick = function() {
this.Visible = false;
}.bindenv(this);
Childrens.append(CloseButton);
local LogicFunc = function(Btn) {
foreach(Pos, obj in TitleButtonList) {
if (obj != Btn) obj.State = 0;
else {
obj.State = 1;
Page = Pos;
}
}
QueryExchange();
};
local UpdateLogic = function(Btn) {
if (SelectAuction) Btn.Visible = false;
else Btn.Visible = true;
}
local FuncTabbar1 = LenheartNewUI_TabbarsText(4, 20, "装备");
FuncTabbar1.State = 1;
FuncTabbar1.SetTextOffset(20, 4);
AddChild(FuncTabbar1);
FuncTabbar1.OnClickEx = LogicFunc.bindenv(this);
TitleButtonList.append(FuncTabbar1);
// local FuncTabbar2 = LenheartNewUI_TabbarsText(65, 20, "消耗品");
// FuncTabbar2.SetTextOffset(13, 3);
// AddChild(FuncTabbar2);
// FuncTabbar2.OnClickEx = LogicFunc.bindenv(this);
// TitleButtonList.append(FuncTabbar2);
// local FuncTabbar3 = LenheartNewUI_TabbarsText(126, 20, "材料");
// FuncTabbar3.SetTextOffset(20, 3);
// AddChild(FuncTabbar3);
// FuncTabbar3.OnClickEx = LogicFunc.bindenv(this);
// TitleButtonList.append(FuncTabbar3);
// local FuncTabbar4 = LenheartNewUI_TabbarsText(187, 20, "副职业");
// FuncTabbar4.SetTextOffset(13, 3);
// AddChild(FuncTabbar4);
// FuncTabbar4.OnClickEx = LogicFunc.bindenv(this);
// TitleButtonList.append(FuncTabbar4);
// local FuncTabbar5 = LenheartNewUI_TabbarsText(248, 20, "任务");
// FuncTabbar5.SetTextOffset(20, 3);
// AddChild(FuncTabbar5);
// FuncTabbar5.OnClickEx = LogicFunc.bindenv(this);
// TitleButtonList.append(FuncTabbar5);
local FuncTabbar6 = LenheartNewUI_TabbarsText(340, 20, "我的");
FuncTabbar6.SetTextOffset(20, 3);
AddChild(FuncTabbar6);
FuncTabbar6.OnClickEx = LogicFunc.bindenv(this);
TitleButtonList.append(FuncTabbar6);
//左翻页按钮
local LeftButton = LenheartNewUI_BaseButton(320, 350, 15, 15, "interface/lenheartwindowcommon.img", 34);
LeftButton.OnClick = function() {
if (SubPage > 0) SubPage--;
QueryExchange();
}.bindenv(this);
LeftButton.SetCallBackFunc(UpdateLogic.bindenv(this));
AddChild(LeftButton);
//右翻页按钮
local RightButton = LenheartNewUI_BaseButton(380, 350, 15, 15, "interface/lenheartwindowcommon.img", 38);
RightButton.OnClick = function() {
if (SubPage + 1<((Total / 7) + 1)) SubPage++;
QueryExchange();
}.bindenv(this);
RightButton.SetCallBackFunc(UpdateLogic.bindenv(this));
AddChild(RightButton);
local ByCallLogic = function(Btn) {
if (!SelectAuction) Btn.Visible = false;
else Btn.Visible = true;
}
local BuyButton = LenheartNewUI_ButtonText(120, 340, 5, "购买");
BuyButton.SetTextOffset(0, 1);
BuyButton.OnClickEx = function(Btn) {
if (Btn.Visible) {
local T = {
op = 21001005,
uuid = SelectAuction.Info.uid
}
SendPackEx(T);
SelectAuction = null;
QueryExchange();
}
}.bindenv(this);
BuyButton.SetCallBackFunc(ByCallLogic.bindenv(this));
AddChild(BuyButton);
local CancelButton = LenheartNewUI_ButtonText(230, 340, 5, "取消");
CancelButton.SetTextOffset(0, 1);
CancelButton.OnClick = function() {
SelectAuction = null;
}.bindenv(this);
CancelButton.SetCallBackFunc(ByCallLogic.bindenv(this));
AddChild(CancelButton);
}
//绘制主界面
function DrawMain(obj) {
DrawNineBox(X, Y + 2, 405, 372, "interface/lenheartwindowcommon.img", 213); //背景框
Img["main"].DrawPng(2, X + 1, Y);
DrawNineBox(X + 2, Y + 39, 400, 332, "interface/lenheartwindowcommon.img", 213); //背景框
// SelectAuction = Exchange_aucC_Item(this, {
// //唯一id
// uid = "1231",
// itemId = 2243114,
// itemName = "御影法杖",
// count = 1,
// price = 1000,
// name = "Kina"
// });
if (!SelectAuction) {
//绘制交易物品
if (Page >= 0 && Page< 5) {
if (AuctionInfo) {
foreach(Pos, Object in AuctionInfo) {
Object.Show(X + 4, Y + 44 + Pos * 44);
}
}
}
//绘制页数
local SubPageStr = (SubPage + 1).tostring() + "/" + ((Total / 7) + 1).tostring();
L_sq_DrawCode(SubPageStr, X + 359 - LenheartTextClass.GetStringLength(SubPageStr) / 2, Y + 352, sq_RGBA(230, 200, 155, 255), 0, 1);
} else {
//绘制交易唯一ID
L_sq_DrawCode("交易码: " + SelectAuction.Info.uid, X + 8, Y + 60, sq_RGBA(230, 200, 155, 255), 0, 1);
DrawItemBase(X + 8, Y + 80, SelectAuction.Info.itemId, SelectAuction.Info.count);
//绘制名称
L_sq_DrawCode(SelectAuction.Info.itemName + "x" + SelectAuction.Info.count, X + 48, Y + 88, sq_RGBA(230, 200, 155, 255), 0, 1);
//绘制价格
local Pstr = "售价: " + SelectAuction.Info.price + " 单价: " + (SelectAuction.Info.price / SelectAuction.Info.count + "/件");
L_sq_DrawCode(Pstr, X + 8, Y + 120, sq_RGBA(140, 255, 113, 255), 0, 1);
//绘制卖家名称
L_sq_DrawCode("卖家: " + SelectAuction.Info.name, X + 8, Y + 140, sq_RGBA(230, 200, 155, 255), 0, 1);
}
}
function Show(obj) {
DrawMain(obj);
LenheartNewUI_Windows.Show(obj);
}
function TopShow(obj) {
LenheartNewUI_Windows.TopShow(obj);
local MousePos_X = IMouse.GetXPos();
local MousePos_Y = IMouse.GetYPos();
if (Page >= 0 && Page< 5 && !SelectAuction) {
if (AuctionInfo) {
foreach(Pos, Object in AuctionInfo) {
if (sq_IsIntersectRect(MousePos_X, MousePos_Y, 1, 1, X + 4, Y + 44 + Pos * 44, 392, 39)) {
Object.HoverShow(X + 4, Y + 44 + Pos * 44);
}
}
}
}
}
//鼠标左键按下回调
function OnMouseLbDown(MousePos_X, MousePos_Y) {
LenheartNewUI_BaseWindow.OnMouseLbDown(MousePos_X, MousePos_Y);
if (Page >= 0 && Page< 5 && !SelectAuction) {
if (AuctionInfo) {
foreach(Pos, Object in AuctionInfo) {
if (sq_IsIntersectRect(MousePos_X, MousePos_Y, 1, 1, X + 4, Y + 44 + Pos * 44, 392, 39)) {
Object.OnMouseLbDown(X + 4, Y + 44 + Pos * 44);
}
}
}
}
}
//逻辑入口
function Proc(obj) {
LenheartNewUI_Windows.SyncPos(X, Y);
}
function OpenCallBack() {
Visible = true;
QueryExchange();
}
}
function Lenheart_Exchange_auc_Fun(obj) {
local RootTab = getroottable();
if (!RootTab.rawin("Exchange_auc_Obj")) {
RootTab.rawset("Exchange_auc_Obj", true);
local Win = LenheartNewUI_CreateWindow(Exchange_aucC, "交易所拍卖行窗口", ((getroottable().Rindro_Scr_Width - 405) / 2).tointeger(), 100, 405, 372, 28);
EventList_Obj.AddEvent("点券交易所", 43, Win);
}
}
getroottable()["LenheartFuncTab"].rawset("Exchange_aucFuncN", Lenheart_Exchange_auc_Fun);
class Exchange_aucC_Item {
//Img
Img = null;
//父对象
Parent = null;
//信息
Info = null;
constructor(Window, Info) {
Parent = Window;
Img = Window.Img["main"];
this.Info = Info;
}
function Show(X, Y) {
Img.DrawPng(3, X, Y);
local Xpos = X;
local Ypos = Y;
//绘制交易唯一ID
L_sq_DrawCode("交易码: " + Info.uid, Xpos + 8, Ypos + 14, sq_RGBA(230, 200, 155, 255), 0, 1);
//绘制道具
Parent.DrawItemBase(Xpos + 100, Ypos + 5, Info.itemId, Info.count);
//绘制名称
L_sq_DrawCode(Info.itemName + "x" + Info.count, Xpos + 137, Ypos + 14, sq_RGBA(230, 200, 155, 255), 0, 1);
//绘制价格
local Pstr = "售价: " + Info.price + " 单价: " + (Info.price / Info.count + "/件");
L_sq_DrawCode(Pstr, Xpos + 315 - LenheartTextClass.GetStringLength(Pstr) / 2, Ypos + 14, sq_RGBA(140, 255, 113, 255), 0, 1);
}
function HoverShow(X, Y) {
Img.DrawPng(4, X, Y);
}
function OnMouseLbDown(X, Y) {
Parent.SelectAuction = this;
}
}
// L_Windows_List <- [];
// getroottable().rawdelete("LenheartPluginsInitFlag");
// getroottable().rawdelete("EventList_Obj")
// getroottable().rawdelete("Exchange_auc_Obj");