10 Commits

Author SHA1 Message Date
b77e17c012 fix(FileConfig): 更新插件包缩略图URL并添加缺失的缩略图配置
将starter_bundle包的缩略图路径更新为外部URL,并为其他两个插件包添加相同的缩略图配置
2026-04-21 15:08:12 +08:00
ab3832e7a5 refactor(UI): 修复世界地图绘制索引问题并更新插件包配置
修复RepairWorldMap.nut中地图标记绘制索引问题,使用独立DrawIndex变量替代Pos
重构FileConfig.json,将CSBaseScript替换为PackageBundle配置,添加三种插件包方案
2026-04-21 14:55:51 +08:00
40ee8a01aa refactor: 将装备掉落函数重命名为更通用的物品掉落函数
重命名 sq_DropEquipmentUnique 为 sq_DropItemUnique 和 sq_DropEquipment 为 sq_DropItem,使函数命名更准确反映其实际功能,适用于更广泛的物品掉落场景
2026-04-14 13:26:07 +08:00
fe05643f72 feat(偷窃系统): 实现偷窃系统基础功能
- 添加偷窃系统配置文件及脚本入口
- 实现NPC交互菜单和偷窃功能逻辑
- 添加网络通信协议处理
- 初始化偷窃配置数据并注册NPC交互
- 完善偷窃解锁动画和状态管理
2026-04-14 13:20:57 +08:00
e6bb957d3d feat(Steal): 添加解锁成功动画和音效反馈
- 将密码框滚动速度从500ms调整为250ms提升用户体验
- 添加解锁成功动画序列和音效反馈
- 增加全部解锁后的处理逻辑和动画播放
- 优化宝箱动画显示比例
- 添加解锁失败音效提示
2026-04-10 00:54:37 +08:00
8c9c9d718a feat(Steal): 扩展密码框功能并改进锁定机制
- 增加密码字符集支持字母和数字
- 将线性锁定检测改为矩形区域检测
- 添加停止位置偏移量以优化视觉效果
- 实现解锁进度自动计算功能
- 调整默认参数和初始化逻辑
2026-04-09 05:40:23 +08:00
105c9c5d41 feat(Steal): 添加密码框锁定功能及正确锁定计数
实现密码框滚动停止和锁定功能,当用户按下空格时尝试锁定当前焦点密码框
新增正确锁定计数功能,用于追踪成功锁定的次数
添加相关状态变量和方法支持锁定逻辑
2026-04-08 23:36:24 +08:00
1faacb5464 feat(Steal): 为密码框添加滚动效果和相位偏移
实现密码数字序列的平滑滚动动画效果,支持不同密码框的相位偏移显示
修改密码框构造函数以接收相位参数,添加滚动相关属性和计算方法
优化数字显示逻辑,支持循环滚动和动态位置计算
2026-04-08 23:24:34 +08:00
feb316d882 feat: 添加偷窃系统和自己服装备功能
- 新增偷窃系统(Steal)模块及相关UI界面
- 添加自己服(MySelf)装备功能及显示界面
- 在folder-alias.json中添加新系统路径映射
- 为BaseTool_Class添加DrawNineBoxAlpha方法支持透明度
- 修改NewItemInfoWindow装备判断逻辑
- 在FileConfig.json中为多个系统添加Enabled配置项
- 在ObjectConvert.nut中添加装备掉落相关函数
2026-04-08 22:26:57 +08:00
fb1309b486 feat(换装系统): 更新配置并添加详细说明文档
- 将换装系统从私有改为公开并设置价格
- 更新项目作者信息
- 添加详细的换装系统使用说明文档
- 添加图片路径配置
2026-03-18 16:53:30 +08:00
9 changed files with 972 additions and 99 deletions

View File

@@ -312,6 +312,50 @@ class Rindro_BaseToolClass {
Rindro_Image_GlobalMap[Img].DrawPng(StartIndex + 8, X + Width - LeftTopW, Y + Height - LeftTopH);
}
function DrawNineBoxAlpha(X, Y, Width, Height, Img, StartIndex, Alpha)
{
//如果没有载入img就载入
if (!Rindro_Image_GlobalMap.rawin(Img)) {
Rindro_Image_GlobalMap[Img] <- Rindro_Image(Img);
}
//绘制左上角
Rindro_Image_GlobalMap[Img].DrawPng(StartIndex, X, Y);
//获取左上角的图片宽高
local LeftTopW = Rindro_Image_GlobalMap[Img].GetPng(StartIndex).GetWidth();
local LeftTopH = Rindro_Image_GlobalMap[Img].GetPng(StartIndex).GetHeight();
//绘制上边
//获取上边的宽
local TopW = Rindro_Image_GlobalMap[Img].GetPng(StartIndex + 1).GetWidth();
Rindro_Image_GlobalMap[Img].DrawExPng(StartIndex + 1, X + LeftTopW, Y, 0, sq_RGBA(255, 255, 255, Alpha), (Width - LeftTopW * 2).tofloat() / TopW, 1.0);
//绘制右上角
Rindro_Image_GlobalMap[Img].DrawPng(StartIndex + 2, X + Width - LeftTopW, Y);
//绘制左边
//获取左边的高
local LeftH = Rindro_Image_GlobalMap[Img].GetPng(StartIndex + 3).GetHeight();
Rindro_Image_GlobalMap[Img].DrawExPng(StartIndex + 3, X, Y + LeftTopH, 0, sq_RGBA(255, 255, 255, Alpha), 1.0, (Height - LeftTopH * 2).tofloat() / LeftH);
//绘制中间
//获取中间的宽高
local MiddleW = Rindro_Image_GlobalMap[Img].GetPng(StartIndex + 4).GetWidth();
local MiddleH = Rindro_Image_GlobalMap[Img].GetPng(StartIndex + 4).GetHeight();
Rindro_Image_GlobalMap[Img].DrawExPng(StartIndex + 4, X + LeftTopW, Y + LeftTopH, 0, sq_RGBA(255, 255, 255, Alpha), (Width - LeftTopW * 2).tofloat() / MiddleW, (Height - LeftTopH * 2).tofloat() / MiddleH);
//绘制右边
Rindro_Image_GlobalMap[Img].DrawExPng(StartIndex + 5, X + Width - LeftTopW, Y + LeftTopH, 0, sq_RGBA(255, 255, 255, Alpha), 1.0, (Height - LeftTopH * 2).tofloat() / LeftH);
//绘制左下角
Rindro_Image_GlobalMap[Img].DrawPng(StartIndex + 6, X, Y + Height - LeftTopH);
//绘制下边
Rindro_Image_GlobalMap[Img].DrawExPng(StartIndex + 7, X + LeftTopW, Y + Height - LeftTopH, 0, sq_RGBA(255, 255, 255, Alpha), (Width - LeftTopW * 2).tofloat() / TopW, 1.0);
//绘制右下角
Rindro_Image_GlobalMap[Img].DrawPng(StartIndex + 8, X + Width - LeftTopW, Y + Height - LeftTopH);
}
//品级颜色
function GetRarityColor(rarity) {
switch (rarity) {

View File

@@ -106,6 +106,7 @@ class Rindro_Item {
function Show(X, Y) {
//背景框
Rindro_BaseToolClass.DrawNineBox(X, Y, 214, DrawInfo.Height + 30, "interface2/common/mypopup/popup.img", 0);
// Rindro_BaseToolClass.DrawNineBox(X, Y, 214, DrawInfo.Height + 30, "sjweapon/sjwindow.img", 0);
// local C_Object = Rindro_Image_GlobalMap["popup"].GetPng(134);
// print(C_Object);
// L_Sq_CallFunc(0x11DF050, "void", FFI_FASTCALL, ["pointer", "int", "int", "int", "int", "int"], C_Object, 0, 10, 10, 10, 10);

View File

@@ -30,48 +30,137 @@
"Base/UI/Lenheart_Character_Info_Class.nut",
"Base/Interface.nut"
],
"CSBaseScript": [
"CSBase/_ENUM/_ENUM_.nut",
"CSBase/_Tool/Json_Class.nut",
"CSBase/_Tool/Packet_Class.nut",
"CSBase/_Tool/BaseTool_Class.nut",
"CSBase/_Tool/MemoryClass.nut",
"CSBase/_Tool/Hacker_Class.nut",
"CSBase/_Tool/Hacker_RegApi.nut",
"CSBase/_Tool/Script_Class.nut",
"CSBase/_Tool/Image_Class.nut",
"CSBase/_Tool/Animation_Class.nut",
"CSBase/CallBack/PackControl.nut",
"CSBase/CallBack/DrawMain.nut",
"CSBase/CallBack/DrawHudMain.nut",
"CSBase/CallBack/PushDamage.nut",
"CSBase/CallBack/GetDamageRate.nut",
"CSBase/_Z_Data/CharacterInfoData.nut",
"CSBase/UI/Lenheart_Cursor_Class.nut",
"CSBase/UI/OldWindowsMap.nut",
"CSBase/UI/Lenheart_UI_Class.nut",
"CSBase/UI/Lenheart_Ani_Class.nut",
"CSBase/UI/Lenheart_Each_Class.nut",
"CSBase/UI/Lenheart_Event_Class.nut",
"CSBase/UI/Lenheart_Character_Info_Class.nut",
"CSBase/Interface.nut"
],
"PackageBundle": {
"gold_bundle": {
"PackageAlias": "黄金插件包",
"PackageAuthor": "官方",
"PackageVersion": "1.0",
"PackageDescribe": "包含常用双端插件的组合包,该插件包无包安装服务,需要一定基础自行安装。(如需远程安装需单独支付费用)",
"PackagePrice": 50,
"PackageThumb": "https://i.imgs.ovh/2026/04/21/ZwpyBC.png",
"Items": [
"世界BOSS",
"伤害控制",
"土罐",
"圣者遗物箱",
"战令",
"战力系统",
"换装系统",
"收集箱",
"皮肤仓库",
"累计奖励",
"荒古遗尘装备"
]
},
"diamond_bundle": {
"PackageAlias": "钻石插件包",
"PackageAuthor": "官方",
"PackageVersion": "1.0",
"PackageDescribe": "包含常用双端插件的组合包 + 一个团本插件,该插件包无包安装服务,需要一定基础自行安装。(如需远程安装需单独支付费用)",
"PackagePrice": 100,
"PackageThumb": "https://i.imgs.ovh/2026/04/21/ZwpyBC.png",
"Items": [
"世界BOSS",
"伤害控制",
"土罐",
"圣者遗物箱",
"战令",
"战力系统",
"换装系统",
"收集箱",
"皮肤仓库",
"累计奖励",
"荒古遗尘装备",
"安图恩"
]
},
"ultimate_bundle": {
"PackageAlias": "至臻插件包",
"PackageAuthor": "官方",
"PackageVersion": "1.0",
"PackageDescribe": "包含所有插件,该插件包无包安装服务,需要一定基础自行安装。(如需远程安装需单独支付费用)",
"PackagePrice": 200,
"PackageThumb": "https://i.imgs.ovh/2026/04/21/ZwpyBC.png",
"Items": [
"世界BOSS",
"伤害控制",
"土罐",
"圣者遗物箱",
"战令",
"战力系统",
"换装系统",
"收集箱",
"皮肤仓库",
"累计奖励",
"荒古遗尘装备",
"安图恩",
"卢克",
"超时空"
]
}
},
"ProjectScript": {
"换装系统": {
"Private": true,
"price": 20,
"Private": false,
"Enabled": false,
"Script": [
"Project/OutfitSystem/OutfitSystem_Component.nut",
"Project/OutfitSystem/OutfitSystem.nut"
],
"info": {
"ProjectAuthor": "官方 (期限:月)",
"ProjectAuthor": "20",
"ProjectVersion": "1.0.0",
"ProjectDescribe": "换装系统",
"ImageMini": "http://49.234.27.222:8651/dps/download2/Image:chengjiu.png"
"ImageMini": "http://49.234.27.222:8651/dps/download2/Image:chengjiu.png",
"ProjectDetails": [
{
"type": "str",
"content": "在赛利亚这里可以打开换装配置"
},
{
"type": "img",
"content": "0"
},
{
"type": "str",
"content": "点击上面的编号图标,然后点记录,就会记录当前的装备"
},
{
"type": "img",
"content": "1"
},
{
"type": "str",
"content": "输入//HZ 编号(如 //HZ 1)就能换上对应编号的装备,可以在快捷喊话中设置,这样按快捷喊话的键就能换上对应的装备"
},
{
"type": "img",
"content": "2"
},
{
"type": "str",
"content": "换装界面也有使用说明"
},
{
"type": "img",
"content": "3"
},
{
"type": "str",
"content": "换装超快完成"
},
{
"type": "img",
"content": "5"
}
]
},
"imgPath": "OutfitSystem"
},
"黄金哥布林袖珍罐": {
"Private": true,
"Enabled": false,
"Script": [
"Project/TreasureGoblin/TreasureGoblin.nut"
],
@@ -82,8 +171,21 @@
"ImageMini": "http://49.234.27.222:8651/dps/download2/Image:chengjiu.png"
}
},
"偷窃系统": {
"Private": true,
"Script": [
"Project/Steal/Steal.nut"
],
"info": {
"ProjectAuthor": "官方 (期限:月)",
"ProjectVersion": "1.0.0",
"ProjectDescribe": "偷窃系统",
"ImageMini": "http://49.234.27.222:8651/dps/download2/Image:chengjiu.png"
}
},
"异界装备升级": {
"Private": true,
"Enabled": false,
"Script": [
"Project/ItemTool/ItemOtherWolrdUpgrade/ItemOtherWolrdUpgrade.nut"
],
@@ -96,6 +198,7 @@
},
"誉名录": {
"Private": true,
"Enabled": false,
"Script": [
"Project/NewTitle/TitleButton.nut",
"Project/NewTitle/NewTitle.nut"
@@ -121,6 +224,7 @@
},
"灵魂救赎武器": {
"Private": true,
"Enabled": false,
"Script": [
"Project/SoulSalvation/SoulSalvation.nut",
"Project/SoulSalvation/SoulSalvation_Upgrade.nut",
@@ -1174,6 +1278,7 @@
},
"宽屏UI": {
"Private": true,
"Enabled": false,
"Script": [
"Project/HudUi/HudUi.nut"
],

View File

@@ -53,32 +53,32 @@ function sq_SetObjectAbilityFloatWithDecrypt(obj, ObjectAddressOffset, Value) {
//[human damage rate]
// print(DATK(AtkC, 0x294).readFloat());
//[human damage rate]
// print(DATK(AtkC, 0x294).readFloat());
//[fort damage rate]
// print(DATK(AtkC, 0x2A0).readFloat());
//[fort damage rate]
// print(DATK(AtkC, 0x2A0).readFloat());
//[monster damage rate]
// print(DATK(AtkC, 0x2AC).readFloat());
//[monster damage rate]
// print(DATK(AtkC, 0x2AC).readFloat());
//[critical hit]
// print(DATK(AtkC, 0x68).readFloat());
//[critical hit]
// print(DATK(AtkC, 0x68).readFloat());
//[damage]
// print(DATK(AtkC, 0x0).readFloat());
//[damage]
// print(DATK(AtkC, 0x0).readFloat());
//[damage bonus]
// print(DATK(AtkC, 0x24).readInt());
//[damage bonus]
// print(DATK(AtkC, 0x24).readInt());
//[absolute damage]
// print(DATK(AtkC, 0x18).readInt());
//[absolute damage]
// print(DATK(AtkC, 0x18).readInt());
//[damage reaction]
// print(NativePointer(AtkC + 0x4C).readInt());
//[damage reaction]
// print(NativePointer(AtkC + 0x4C).readInt());
//[knuck back]
// print(DATK(AtkC, 0x8C).readInt());
//[knuck back]
// print(DATK(AtkC, 0x8C).readInt());
function EncodeAttackMemoryData(AtkC, Offset) {
@@ -130,37 +130,32 @@ function sq_SetCurrentAttackInfoDamage(attackInfo, damage) {
MemoryTool.EncodeMemoryData(AtkC + 0x0, B.readn('i'));
}
function sq_GetCurrentAttackInfoAbsoluteDamage(attackInfo)
{
function sq_GetCurrentAttackInfoAbsoluteDamage(attackInfo) {
local AtkC = L_sq_P2I(attackInfo["__ot"][28259608]);
local Res = MemoryTool.DecodeMemoryData(AtkC + 0x18);
return Res;
}
function sq_SetCurrentAttackInfoAbsoluteDamage(attackInfo, damage)
{
function sq_SetCurrentAttackInfoAbsoluteDamage(attackInfo, damage) {
local AtkC = L_sq_P2I(attackInfo["__ot"][28259608]);
MemoryTool.EncodeMemoryData(AtkC + 0x18, damage);
}
function sq_GetCurrentAttackInfoBonusRate(attackInfo)
{
function sq_GetCurrentAttackInfoBonusRate(attackInfo) {
local AtkC = L_sq_P2I(attackInfo["__ot"][28259608]);
local Res = MemoryTool.DecodeMemoryData(AtkC + 0x24);
return Res;
}
// print(DATK(AtkC, 0x1c8).readFloat());
// print(DATK(AtkC, 0x1ec).readInt());
// print(DATK(AtkC, 0x234).readInt());
function sq_GetCurrentAttackInfoChangeStatus(attackInfo)
{
// print(DATK(AtkC, 0x1c8).readFloat());
// print(DATK(AtkC, 0x1ec).readInt());
// print(DATK(AtkC, 0x234).readInt());
function sq_GetCurrentAttackInfoChangeStatus(attackInfo) {
local AtkC = L_sq_P2I(attackInfo["__ot"][28259608]);
local Info = [EncodeAttackMemoryData(AtkC, 0x1c8).readFloat(), EncodeAttackMemoryData(AtkC, 0x1ec).readInt(), EncodeAttackMemoryData(AtkC, 0x234).readInt()];
return Info;
}
function sq_SetCurrentAttackInfoChangeStatus(attackInfo, Data1, Data2, Data3)
{
function sq_SetCurrentAttackInfoChangeStatus(attackInfo, Data1, Data2, Data3) {
local AtkC = L_sq_P2I(attackInfo["__ot"][28259608]);
local B = blob();
B.writen(Data1, 'f');
@@ -176,8 +171,7 @@ function sq_SetCurrentAttackInfoChangeStatus(attackInfo, Data1, Data2, Data3)
MemoryTool.EncodeMemoryData(AtkC + 0x234, B.readn('i'));
}
function sq_GetCurrentAttackInfoHumanDamageRate(attackInfo)
{
function sq_GetCurrentAttackInfoHumanDamageRate(attackInfo) {
local AtkC = L_sq_P2I(attackInfo["__ot"][28259608]);
local Res = MemoryTool.DecodeMemoryData(AtkC + 0x294);
local B = blob();
@@ -186,8 +180,7 @@ function sq_GetCurrentAttackInfoHumanDamageRate(attackInfo)
return B.readn('f');
}
function sq_SetCurrentAttackInfoHumanDamageRate(attackInfo, rate)
{
function sq_SetCurrentAttackInfoHumanDamageRate(attackInfo, rate) {
local AtkC = L_sq_P2I(attackInfo["__ot"][28259608]);
local B = blob();
B.writen(rate, 'f');
@@ -195,8 +188,7 @@ function sq_SetCurrentAttackInfoHumanDamageRate(attackInfo, rate)
MemoryTool.EncodeMemoryData(AtkC + 0x294, B.readn('i'));
}
function sq_GetCurrentAttackInfoFortDamageRate(attackInfo)
{
function sq_GetCurrentAttackInfoFortDamageRate(attackInfo) {
local AtkC = L_sq_P2I(attackInfo["__ot"][28259608]);
local Res = MemoryTool.DecodeMemoryData(AtkC + 0x2A0);
local B = blob();
@@ -205,8 +197,7 @@ function sq_GetCurrentAttackInfoFortDamageRate(attackInfo)
return B.readn('f');
}
function sq_SetCurrentAttackInfoFortDamageRate(attackInfo, rate)
{
function sq_SetCurrentAttackInfoFortDamageRate(attackInfo, rate) {
local AtkC = L_sq_P2I(attackInfo["__ot"][28259608]);
local B = blob();
B.writen(rate, 'f');
@@ -214,8 +205,7 @@ function sq_SetCurrentAttackInfoFortDamageRate(attackInfo, rate)
MemoryTool.EncodeMemoryData(AtkC + 0x2A0, B.readn('i'));
}
function sq_GetCurrentAttackInfoMonsterDamageRate(attackInfo)
{
function sq_GetCurrentAttackInfoMonsterDamageRate(attackInfo) {
local AtkC = L_sq_P2I(attackInfo["__ot"][28259608]);
local Res = MemoryTool.DecodeMemoryData(AtkC + 0x2AC);
local B = blob();
@@ -224,8 +214,7 @@ function sq_GetCurrentAttackInfoMonsterDamageRate(attackInfo)
return B.readn('f');
}
function sq_SetCurrentAttackInfoMonsterDamageRate(attackInfo, rate)
{
function sq_SetCurrentAttackInfoMonsterDamageRate(attackInfo, rate) {
local AtkC = L_sq_P2I(attackInfo["__ot"][28259608]);
local B = blob();
B.writen(rate, 'f');
@@ -233,8 +222,7 @@ function sq_SetCurrentAttackInfoMonsterDamageRate(attackInfo, rate)
MemoryTool.EncodeMemoryData(AtkC + 0x2AC, B.readn('i'));
}
function sq_GetCurrentAttackInfoCriticalRate(attackInfo)
{
function sq_GetCurrentAttackInfoCriticalRate(attackInfo) {
local AtkC = L_sq_P2I(attackInfo["__ot"][28259608]);
local Res = MemoryTool.DecodeMemoryData(AtkC + 0x68);
local B = blob();
@@ -243,8 +231,7 @@ function sq_GetCurrentAttackInfoCriticalRate(attackInfo)
return B.readn('f');
}
function sq_SetCurrentAttackInfoCriticalRate(attackInfo, rate)
{
function sq_SetCurrentAttackInfoCriticalRate(attackInfo, rate) {
local AtkC = L_sq_P2I(attackInfo["__ot"][28259608]);
local B = blob();
B.writen(rate, 'f');
@@ -252,35 +239,30 @@ function sq_SetCurrentAttackInfoCriticalRate(attackInfo, rate)
MemoryTool.EncodeMemoryData(AtkC + 0x68, B.readn('i'));
}
function sq_GetCurrentAttackInfoDamageReaction(attackInfo)
{
function sq_GetCurrentAttackInfoDamageReaction(attackInfo) {
local AtkC = L_sq_P2I(attackInfo["__ot"][28259608]);
local Res = MemoryTool.DecodeMemoryData(AtkC + 0x4C);
return Res;
}
function sq_GetCurrentAttackeHitStunTime(attackInfo)
{
function sq_GetCurrentAttackeHitStunTime(attackInfo) {
local AtkC = L_sq_P2I(attackInfo["__ot"][28259608]);
local Res = MemoryTool.DecodeMemoryData(AtkC + 0x138);
return Res;
}
function sq_GetCurrentAttackInfoKnuckBackType(attackInfo)
{
function sq_GetCurrentAttackInfoKnuckBackType(attackInfo) {
local AtkC = L_sq_P2I(attackInfo["__ot"][28259608]);
local Res = MemoryTool.DecodeMemoryData(AtkC + 0x8C);
return Res;
}
function sq_SetCurrentAttackInfoKnuckBackType(attackInfo, type)
{
function sq_SetCurrentAttackInfoKnuckBackType(attackInfo, type) {
local AtkC = L_sq_P2I(attackInfo["__ot"][28259608]);
MemoryTool.EncodeMemoryData(AtkC + 0x8C, type);
}
function sq_GetCurrentAttackInfoStuckRate(attackInfo)
{
function sq_GetCurrentAttackInfoStuckRate(attackInfo) {
local AtkC = L_sq_P2I(attackInfo["__ot"][28259608]);
local Res = MemoryTool.DecodeMemoryData(AtkC + 0x74);
local B = blob();
@@ -289,8 +271,7 @@ function sq_GetCurrentAttackInfoStuckRate(attackInfo)
return B.readn('f');
}
function sq_SetCurrentAttackInfoStuckRate(attackInfo, rate)
{
function sq_SetCurrentAttackInfoStuckRate(attackInfo, rate) {
local AtkC = L_sq_P2I(attackInfo["__ot"][28259608]);
local B = blob();
B.writen(rate, 'f');
@@ -298,16 +279,37 @@ function sq_SetCurrentAttackInfoStuckRate(attackInfo, rate)
MemoryTool.EncodeMemoryData(AtkC + 0x74, B.readn('i'));
}
function sq_GetCurrentAttackUpForce(attackInfo)
{
function sq_GetCurrentAttackUpForce(attackInfo) {
local AtkC = L_sq_P2I(attackInfo["__ot"][28259608]);
local Res = MemoryTool.DecodeMemoryData(AtkC + 0x5c);
return Res;
}
function sq_GetCurrentAttackBackForce(attackInfo)
{
function sq_GetCurrentAttackBackForce(attackInfo) {
local AtkC = L_sq_P2I(attackInfo["__ot"][28259608]);
local Res = MemoryTool.DecodeMemoryData(AtkC + 0x50);
return Res;
}
function sq_DropItemUnique(id, posX, posY) {
local T = {
op = 21016001,
id = id,
posX = posX,
posY = posY,
}
Rindro_BaseToolClass.SendPackEx(T);
}
function sq_DropItem(rarity, posX, posY)
{
local T = {
op = 21016003,
rarity = rarity,
posX = posX,
posY = posY,
}
Rindro_BaseToolClass.SendPackEx(T);
}

View File

@@ -0,0 +1,198 @@
/*
文件名:Equip.nut
路径:Project/MySelf/Equip/Equip.nut
创建日期:2026-03-24 01:54
文件用途:
*/
class MySelfEquipC extends Rindro_BaseToolClass {
constructor() {
local ItemDrawControl = getroottable()["NewItemInfoWindow_Obj"];
ItemDrawControl.AddHookItemId(27572);
}
}
function Lenheart_MySelfEquipC_Fun(obj) {
local RootTab = getroottable();
if (!RootTab.rawin("MySelfEquipC_Obj")) {
RootTab.rawset("MySelfEquipC_Obj", MySelfEquipC());
}
}
getroottable()["LenheartFuncTab"].rawset("MySelfEquipCFuncN", Lenheart_MySelfEquipC_Fun);
L_Windows_List <- [];
getroottable().rawdelete("LenheartPluginsInitFlag");
getroottable().rawdelete("EventList_Obj")
getroottable().rawdelete("MySelfEquipC_Obj");
getroottable().rawdelete("L_Each_Obj");
class Rindro_Item_DrawInfo {
//Item对象
Item = null;
//指导信息 (原装备生成的信息)
GuidanceInformation = null;
//指导信息标志位
GuidanceInformationFlag = 0;
//分割线计数
GuidanceDivCount = 0;
//信息
InfoList = null;
Height = 0;
Padding = 8;
Img = Rindro_Image("sjweapon/sjwindow.img");
Img2 = Rindro_Image("soulweapon/main.img");
constructor(gItem) {
Item = gItem;
InfoList = [];
}
//添加指导信息
function AddGuidanceInformation(info) {
GuidanceInformation = info;
}
function Init() {
//读取强化等级
local UpgradeLevel = Item.GetUpgrade();
//读取名字
local Name = "天 · 狂暴之" + Item.GetName();
local UpgradeStr = UpgradeLevel > 0 ? ("+" + UpgradeLevel + " ") : "";
local NameStr = Name.len() > 0 ? (Name + " ") : "未定名";
AddContent((UpgradeStr + Name), Padding, Padding, Rindro_BaseToolClass.GetRarityColor(6));
AddContent("巨剑(英雄级)", Padding, 18, sq_RGBA(176, 138, 44, 250));
// if (isGm()) {
// //读取编号
// local Index = Item.GetIndex();
// //读取uuid
// local Uuid = Item.GetUuid();
// local IndexStr = Index > 0 ? ("编号: [" + Index + "] ") : "";
// local UuidStr = Uuid > 10000 ? ("uid: [" + Uuid + "] ") : "";
// AddContent((IndexStr + UuidStr), Padding, 15, 0xffffffff);
// }
AddDelegate(20, function(X, Y, Item) {
for (local i = 0; i< 10; i++) {
Img.DrawPng(0, X + 7 + i * 16, Y + 19);
}
}.bindenv(this));
AddDividing(26, 15);
AddContent("攻击力", Padding, 18, 0xffffffff);
AddContent("458", 215 - LenheartTextClass.GetStringLength("458") - Padding, 0, 0xffffffff);
AddContent("命中", Padding, 18, 0xffffffff);
AddContent("100", 215 - LenheartTextClass.GetStringLength("100") - Padding, 0, 0xffffffff);
AddContent("暴击", Padding, 18, 0xffffffff);
AddContent("150", 215 - LenheartTextClass.GetStringLength("150") - Padding, 0, 0xffffffff);
AddContent("格挡", Padding, 18, 0xffffffff);
AddContent("150", 215 - LenheartTextClass.GetStringLength("150") - Padding, 0, 0xffffffff);
AddDividing(26, 15);
// AddContent("灵魂刻印率", Padding, 18, sq_RGBA(244, 21, 79, 250));
AddDelegate(20, function(X, Y, Item) {
L_sq_DrawCode("灵魂刻印率", X + 6, Y + 15, sq_RGBA(244, 21, 79, 255), 0, 1);
local Rate = 0.56;
L_sq_DrawCode(format("%.1f%%", Rate * 100.0), X + 180, Y + 15, sq_RGBA(255, 119, 0, 255), 0, 1);
Img2.DrawPng(0, X + 70, Y + 19);
setClip(X + 72, Y + 21, X + 72 + (Rate * 97.0).tointeger(), Y + 40); //开始裁切
Img2.DrawPng(1, X + 72, Y + 21);
releaseClip(); //裁切结束
}.bindenv(this));
AddContent("※ 力量", Padding, 12, sq_RGBA(104, 213, 237, 255));
AddContent("150", 215 - LenheartTextClass.GetStringLength("150") - Padding, 0, sq_RGBA(104, 213, 237, 255));
AddContent("※ 武器伤害增幅", Padding, 18, sq_RGBA(104, 213, 237, 255));
AddContent("16.3", 215 - LenheartTextClass.GetStringLength("16.3") - Padding, 0, sq_RGBA(104, 213, 237, 255));
AddContent("※ 异常属性攻击", Padding, 18, sq_RGBA(104, 213, 237, 255));
AddContent("25", 215 - LenheartTextClass.GetStringLength("25") - Padding, 0, sq_RGBA(104, 213, 237, 255));
AddDividing(26, 15);
AddDelegate(64, function(X, Y, Item) {
local Str = ["生命铭刻 · 1级", "精准铭刻 · 2级", "寒冰铭刻 · 1级", "火焰铭刻 · 3级"]
local Color = [sq_RGBA(120, 255, 30, 255), sq_RGBA(255, 240, 20, 240), sq_RGBA(33, 131, 217, 240), sq_RGBA(230, 34, 34, 240)]
for (local i = 0; i< 4; i++) {
Img.DrawPng(1 + i, X + 7, Y + 19 + i * 18);
L_sq_DrawCode(Str[i], X + (215 - LenheartTextClass.GetStringLength(Str[i]) - Padding), Y + 18 + i * 18, Color[i], 1);
}
}.bindenv(this));
AddDividing(26, 26);
AddContent("激荡 : 生生不息", Padding, 28, sq_RGBA(60, 180, 0, 255));
AddContent("攻击时,以2%的概率使自身回复35%的", Padding, 18, sq_RGBA(230, 200, 155, 250));
AddContent("生命值。", Padding, 18, sq_RGBA(230, 200, 155, 250));
AddContent("效果发动冷却时间: 15秒", Padding, 18, sq_RGBA(230, 200, 155, 250));
AddDividing(26, 15);
AddContent("回响 : 天行健", Padding, 18, sq_RGBA(60, 180, 0, 255));
AddContent("攻击时,以5%的概率使自身进入心流", Padding, 18, sq_RGBA(230, 200, 155, 250));
AddContent("伤害增幅10%,效果持续时间5秒。", Padding, 18, sq_RGBA(230, 200, 155, 250));
AddContent("效果发动冷却时间: 45秒", Padding, 18, sq_RGBA(230, 200, 155, 250));
AddDividing(26, 15);
AddContent("装备需求职业:", Padding, 18, sq_RGBA(255, 255, 255, 255));
AddContent("鬼剑士", 215 - LenheartTextClass.GetStringLength("鬼剑士") - Padding, 0, sq_RGBA(255, 255, 255, 255));
}
//增加内容
function AddContent(Content, X, Y, Color) {
InfoList.append({
Type = 0,
Content = Content,
X = X,
Y = Y + Height,
Color = Color
});
Height += Y;
}
//增加分割线
function AddDividing(X, Y) {
InfoList.append({
Type = 1,
X = X,
Y = Y + Height + 3,
});
Height += 8;
}
//增加自定义代理
function AddDelegate(Y, Func) {
InfoList.append({
Type = 2,
X = 0,
Y = Height,
Func = Func
});
Height += Y;
}
}

View File

@@ -146,7 +146,7 @@ class NewItemInfoWindowC extends Rindro_BaseToolClass {
local EquipmentAddress = NativePointer(Rindro_Haker.CpuContext.ecx).add(0x178).readInt();
//是装备才做这个事
local Id = NativePointer(EquipmentAddress).add(0x1c).readInt();
if (NativePointer(EquipmentAddress).add(0x4).readInt() == 2 || NeedDrawHookList.rawin(Id)) {
if (NeedDrawHookList.rawin(Id)) {
args[2] = 947330670;
args[3] = EquipmentAddress;
return args;

View File

@@ -92,16 +92,18 @@ class RepairWorldMapC extends LenheartNewUI_Windows {
L_sq_DrawCode(Info[AreaId].Name, 135 + YosinWorldMapX, 10 + YosinWorldMapY, 0xFFFFFFFF, 1, 1);
if (TabbarFlag) {
local DrawIndex = 0;
foreach(Pos, Value in Info) {
L_sq_DrawImg("interface/minimap_minimap_town.img", 9, 131 + YosinWorldMapX, 25 + (Pos * 18) + YosinWorldMapY);
L_sq_DrawImg("interface/minimap_minimap_town.img", 9, 131 + YosinWorldMapX, 25 + (DrawIndex * 18) + YosinWorldMapY);
// L_sq_DrawWindow(128, 24 + (Pos * 18), 108, 10, "interface/lenheartwindowcommon.img", 97, 11, 12, 11, 13);
L_sq_DrawCode(Value.Name, 135 + YosinWorldMapX, 28 + (Pos * 18) + YosinWorldMapY, 0xFFFFFFFF, 1, 1);
if (sq_IsIntersectRect(IMouse.GetXPos(), IMouse.GetYPos(), 1, 1, 131 + YosinWorldMapX, 25 + (Pos * 18) + YosinWorldMapY, 108, 18)) {
L_sq_DrawCode(Value.Name, 135 + YosinWorldMapX, 28 + (DrawIndex * 18) + YosinWorldMapY, 0xFFFFFFFF, 1, 1);
if (sq_IsIntersectRect(IMouse.GetXPos(), IMouse.GetYPos(), 1, 1, 131 + YosinWorldMapX, 25 + (DrawIndex * 18) + YosinWorldMapY, 108, 18)) {
MarkFlag = Pos;
L_sq_SetDrawImgModel(2, 0);
L_sq_DrawImg("interface/minimap_minimap_town.img", 16, 131 + YosinWorldMapX, 25 + (Pos * 18) + YosinWorldMapY);
L_sq_DrawImg("interface/minimap_minimap_town.img", 16, 131 + YosinWorldMapX, 25 + (DrawIndex * 18) + YosinWorldMapY);
L_sq_ReleaseDrawImgModel();
}
DrawIndex++;
}
}
}

515
Project/Steal/Steal.nut Normal file
View File

@@ -0,0 +1,515 @@
/*
文件名:Steal.nut
路径:Project/Steal/Steal.nut
创建日期:2026-04-07 05:19
文件用途:
*/
class StealC_Password_Box extends LenheartNewUI_CommonUi {
NumberSeq = null;
ScrollPixelOffset = 0;
ScrollBaseIndex = 0;
InitBaseIndex = 0;
ScrollStartTimeMs = 0;
RowDurationMs = 250;
RowHeight = 24;
ColumnYOffset = 0;
CorrectIndex = 0;
IsStopped = false;
IsLockedCorrect = false;
StopSnapOffsetY = 0;
PassStr = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"];
constructor(X, Y, ...) {
LenheartNewUI_CommonUi.constructor(X, Y, 30, 120);
local PhaseIndex = 0;
if (vargc > 0) {
PhaseIndex = vargv[0];
}
ColumnYOffset = -(PhaseIndex * 8);
NumberSeq = [];
for (local i = 0; i< 10; i++) {
local Info = {
num = PassStr[sq_getRandom(0, PassStr.len() - 1)],
CorrectFlag = false,
}
NumberSeq.append(Info);
}
CorrectIndex = sq_getRandom(0, 9);
NumberSeq[CorrectIndex].CorrectFlag = true;
local SeqLen = NumberSeq.len();
if (SeqLen > 0) {
local Phase = PhaseIndex % SeqLen;
if (Phase< 0) {
Phase += SeqLen;
}
ScrollBaseIndex = Phase;
InitBaseIndex = Phase;
}
ScrollStartTimeMs = Clock();
}
function GetLoopIndex(Index) {
local SeqLen = NumberSeq.len();
if (SeqLen <= 0) {
return 0;
}
local Value = Index % SeqLen;
if (Value< 0) {
Value += SeqLen;
}
return Value;
}
function UpdateScrollByClock() {
if (RowDurationMs <= 0) {
RowDurationMs = 1;
}
local RunTimeMs = Clock() - ScrollStartTimeMs;
if (RunTimeMs< 0) {
RunTimeMs = 0;
}
local PassedRows = (RunTimeMs / RowDurationMs).tointeger();
local CycleMs = RunTimeMs % RowDurationMs;
ScrollPixelOffset = sq_GetUniformVelocity(0, RowHeight - 1, CycleMs, RowDurationMs).tointeger();
ScrollBaseIndex = GetLoopIndex(InitBaseIndex - PassedRows);
}
function GetCorrectCenterY(RefY) {
local SeqLen = NumberSeq.len();
if (SeqLen <= 0) {
return Y;
}
local Delta = GetLoopIndex(CorrectIndex - ScrollBaseIndex);
local TextY = Y + 10;
local BaseY = TextY + Delta * RowHeight + ScrollPixelOffset + ColumnYOffset + 8;
local CycleHeight = SeqLen * RowHeight;
local BestY = BaseY;
local BestDist = abs(BestY - RefY);
for (local k = -2; k <= 2; k++) {
local CY = BaseY + (k * CycleHeight);
local Dist = abs(CY - RefY);
if (Dist< BestDist) {
BestY = CY;
BestDist = Dist;
}
}
return BestY;
}
function TryLockByRect(LockTopY, LockHeight, SnapExtraOffsetY) {
if (IsStopped) {
return false;
}
UpdateScrollByClock();
local LockCenterY = LockTopY + (LockHeight / 2).tointeger();
local CorrectCenterY = GetCorrectCenterY(LockCenterY);
if (CorrectCenterY >= LockTopY && CorrectCenterY <= (LockTopY + LockHeight)) {
StopSnapOffsetY = (LockCenterY - CorrectCenterY) + SnapExtraOffsetY;
IsStopped = true;
IsLockedCorrect = true;
return true;
}
return false;
}
function Show(obj) {
Parent.Img.DrawExPng(10, X, Y, 0, sq_RGBA(255, 255, 255, 90), 1.0, 1.0);
local SeqLen = NumberSeq.len();
if (SeqLen <= 0) {
return;
}
if (!IsStopped) {
UpdateScrollByClock();
}
local DrawCount = (Height / RowHeight).tointeger() + 4;
local TextY = Y + 10;
for (local i = -2; i< DrawCount - 2; i++) {
local Info = NumberSeq[GetLoopIndex(ScrollBaseIndex + i)];
local NumStr = Info.num.tostring();
local Color = Info.CorrectFlag ? sq_RGBA(157, 245, 10, 255) : sq_RGBA(150, 150, 150, 255);
local DrawY = TextY + i * RowHeight + ScrollPixelOffset + ColumnYOffset + StopSnapOffsetY;
L_sq_DrawCode(NumStr, X + 15 - LenheartTextClass.GetStringLength(NumStr) / 2, DrawY, Color, 0, 1);
}
}
}
class StealC extends LenheartNewUI_Windows {
//调试模式
// DeBugMode = true;
//不是窗口
// NoWindow = true;
//是否可见
Visible = false;
Img = Rindro_Image("steal/widget.img");
//解锁完成度
UnlockComplete = 0.0;
CorrectLockedCount = 0;
LockBoxHeight = 24;
LockSnapOffsetY = -6;
AllUnlockedTriggered = false;
AniQueue = null;
UnlockSuccessAni = null;
UnlockAniPlaying = false;
UnlockAniFinished = false;
UnlockFinalizeDone = false;
UnlockAniFrameDelay = 60;
NPCList = null;
RequestNpcId = -1;
NpcEachRegistered = false;
constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH) {
Childrens = [];
AniQueue = QuestQueue();
//注册控件
RegisterWidget();
LenheartNewUI_Windows.constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH);
RefreshUnlockComplete();
InitStealConfig();
RegisterStealNpcEach();
RegisterPack(21017002, function(Chunk) {
local Jso = Json.Decode(Chunk);
if (Jso.rawin("ret") && Jso.ret == true) {
ResetStealSession();
Visible = true;
ResetFocus();
} else {
Visible = false;
}
}.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);
for (local i = 0; i< 8; i++) {
local PasswordBox = StealC_Password_Box(280 + i * 30, 268, i);
AddChild(PasswordBox);
}
}
//绘制主界面
function InitStealConfig() {
NPCList = [];
Rindro_Script.GetFileData("etc/steal.etc", function(DataTable, Data) {
while (!Data.Eof()) {
local Fragment = Data.Get();
if (Fragment == "[npc list]") {
while (true) {
local Value = Data.Get();
if (Value == "[/npc list]") {
break;
}
local NpcId = Value;
try {
NpcId = Value.tointeger();
} catch (exception) {}
NPCList.append(NpcId);
}
}
}
}.bindenv(this));
}
function RegisterStealNpcEach() {
if (NpcEachRegistered) {
return;
}
if (!NPCList || NPCList.len() <= 0) {
return;
}
local RootTab = getroottable();
local EachManager = null;
if (RootTab.rawin("L_Each_Obj")) {
EachManager = RootTab["L_Each_Obj"];
} else if (RootTab.rawin("Lenheart_Get_EachObj")) {
EachManager = RootTab["Lenheart_Get_EachObj"]();
}
if (!EachManager) {
return;
}
foreach(id in NPCList) {
EachManager.AddEachForNpc(id, function(SThis) {
local StealButton = LenheartNewUI_Each_BaseButton(0, 0, 100, 21, "interface2/popup_menu/popup_back.img", 3);
StealButton.Icon = "interface2/popup_menu/popup_icon_cn.img";
StealButton.IconIdx = 27;
StealButton.Str = "偷窃";
StealButton.OnClick = function(Button) {
local NpcId = Button.Parent.NPC_Index;
RequestNpcId = NpcId;
Button.Parent.CloseAllEach();
Button.Parent.CloseWindow();
SendPackEx({
op = 21017001,
npcid = NpcId
});
}.bindenv(this);
StealButton.SetCallBackFunc(function(Button) {})
SThis.AddChild(StealButton);
}.bindenv(this));
}
NpcEachRegistered = true;
}
function ResetStealSession() {
UnlockComplete = 0.0;
CorrectLockedCount = 0;
AllUnlockedTriggered = false;
UnlockAniPlaying = false;
UnlockAniFinished = false;
UnlockFinalizeDone = false;
UnlockSuccessAni = null;
AniQueue = QuestQueue();
Childrens = [];
RegisterWidget();
RefreshUnlockComplete();
}
function GetLockTopY() {
return Y + 268 + 60;
}
function GetFocusPasswordBox() {
foreach(Child in Childrens) {
if ((Child instanceof StealC_Password_Box) && !Child.IsStopped) {
return Child;
}
}
return null;
}
function GetPasswordBoxTotal() {
local Total = 0;
foreach(Child in Childrens) {
if (Child instanceof StealC_Password_Box) {
Total += 1;
}
}
return Total;
}
function RefreshUnlockComplete() {
local Total = GetPasswordBoxTotal();
if (Total <= 0) {
UnlockComplete = 0.0;
return;
}
UnlockComplete = CorrectLockedCount.tofloat() / Total.tofloat();
}
function BuildUnlockFrameArr() {
local FrameArr = [];
local Delay = UnlockAniFrameDelay;
if (Delay <= 0) {
Delay = 60;
}
for (local i = 0; i< 13; i++) {
FrameArr.append({
ImgIndex = i,
Delay = Delay,
Pos = [0, 0]
});
}
return FrameArr;
}
function StartUnlockSuccessSequence() {
if (UnlockAniPlaying || UnlockAniFinished) {
return;
}
local FrameArr = BuildUnlockFrameArr();
UnlockSuccessAni = Lenheart_Ani("", FrameArr, [X + 269, Y + 260]);
UnlockSuccessAni.ImgPath = "steal/unlock.img";
UnlockSuccessAni.LoopFlag = false;
UnlockSuccessAni.Reset();
UnlockAniPlaying = true;
UnlockAniFinished = false;
if (AniQueue) {
AniQueue.RemoveQuest("StealUnlockSuccessAni");
AniQueue.AddQuest("StealUnlockSuccessAni", function(Name, Time) {
if (!UnlockSuccessAni) {
UnlockAniPlaying = false;
UnlockAniFinished = true;
AniQueue.RemoveQuest(Name);
FinalizeUnlockSuccess();
return;
}
UnlockSuccessAni.X = X + 324;
UnlockSuccessAni.Y = Y + 109;
UnlockSuccessAni.Show(Duration);
if (UnlockSuccessAni.State == 0) {
UnlockAniPlaying = false;
UnlockAniFinished = true;
AniQueue.RemoveQuest(Name);
FinalizeUnlockSuccess();
}
}.bindenv(this));
} else {
UnlockAniPlaying = false;
UnlockAniFinished = true;
FinalizeUnlockSuccess();
}
}
function FinalizeUnlockSuccess() {
if (UnlockFinalizeDone) {
return;
}
UnlockFinalizeDone = true;
SendStealUnlockPack();
CloseWindow();
Visible = false;
}
function SendStealUnlockPack() {
if (RequestNpcId == null || RequestNpcId <= 0) {
return;
}
SendPackEx({
op = 21017003,
npcid = RequestNpcId
});
}
function OnAllUnlockedInternal() {
R_Utils.PlaySound("GAMBLE_RESULT_GOOD");
StartUnlockSuccessSequence();
}
function CheckAllUnlocked() {
if (AllUnlockedTriggered) {
return;
}
local Total = GetPasswordBoxTotal();
if (Total <= 0) {
return;
}
if (CorrectLockedCount >= Total) {
AllUnlockedTriggered = true;
OnAllUnlockedInternal();
}
}
function CheckSpaceLock() {
if (!Visible) {
return;
}
if (!KeyPressNB.isKeyPress(7, "StealC")) {
return;
}
local FocusBox = GetFocusPasswordBox();
if (!FocusBox) {
return;
}
if (FocusBox.TryLockByRect(GetLockTopY(), LockBoxHeight, LockSnapOffsetY)) {
R_Utils.PlaySound("TRADE_OK");
CorrectLockedCount += 1;
RefreshUnlockComplete();
CheckAllUnlocked();
} else {
R_Utils.PlaySound("ALERT_2");
}
}
function DrawMain(obj) {
//灰色背景
DrawNineBoxAlpha(X, Y, 800, 600, "interface2/common/mypopup/popup.img", 0, 150);
//宝箱动画
local Ani = DrawAniEx(X + 425, Y + 230, "npc/animation/storagediamond.ani");
Ani.setImageRateFromOriginal(1.7, 1.7);
//如果未解锁
if (UnlockComplete< 1.0) {
//宝箱锁图像
Img.DrawPng(12, X + 335, Y + 120);
}
//完成度文字
local StealCompleteStr = "解锁完成度: " + UnlockComplete * 100.0 + "%";
L_sq_DrawCode(StealCompleteStr, X + 410 - LenheartTextClass.GetStringLength(StealCompleteStr) / 2, Y + 406, sq_RGBA(255, 255, 255, 255), 0, 1);
//完成度进度条
Img.DrawPng(2, X + 162, Y + 425);
setClip(X + 168, Y + 429, X + 168 + (463 * UnlockComplete).tointeger(), Y + 429 + 6);
Img.DrawPng(3, X + 168, Y + 429);
releaseClip(); //裁切结束
//解锁界面
Img.DrawPng(9, X + 269, Y + 260);
//解锁锁定条
Img.DrawPng(11, X + 269 + 8, Y + 260 + 60);
}
function Show(obj) {
DrawMain(obj);
if (AniQueue) {
AniQueue.Run();
}
//裁切遮罩密码框
setClip(X + 280, Y + 268, X + 280 + 8 * 30, Y + 268 + 120);
LenheartNewUI_Windows.Show(obj);
releaseClip(); //裁切结束
}
//逻辑入口
function Proc(obj) {
LenheartNewUI_Windows.SyncPos(X, Y);
if (!NpcEachRegistered) {
RegisterStealNpcEach();
}
CheckSpaceLock();
}
}
L_Windows_List <- [];
getroottable().rawdelete("LenheartPluginsInitFlag");
getroottable().rawdelete("EventList_Obj")
getroottable().rawdelete("Steal_Obj");
getroottable().rawdelete("L_Each_Obj");
function Lenheart_Steal_Fun(obj) {
local RootTab = getroottable();
if (!RootTab.rawin("Steal_Obj")) {
RootTab.rawset("Steal_Obj", true);
LenheartNewUI_CreateWindow(StealC, "Steal_Window", 0, 0, 800, 600, 0);
}
}
getroottable()["LenheartFuncTab"].rawset("StealFuncN", Lenheart_Steal_Fun);

View File

@@ -259,5 +259,11 @@
},
"Project/OutfitSystem": {
"description": "换装系统"
},
"Project/MySelf": {
"description": "自己服"
},
"Project/Steal": {
"description": "偷窃系统"
}
}