35 Commits

Author SHA1 Message Date
16ad8ac997 更新换装系统插件 2026-03-03 15:44:38 +08:00
95baf717b4 refactor: 重命名函数GetSkillAttackType为sq_GetSkillConversionType
函数重命名以保持命名一致性,使用sq_前缀表示Squirrel原生函数
2026-02-24 01:50:54 +08:00
01c9ae6b2f feat: 添加特殊定制和定制插件配置及获取技能攻击类型函数
添加了Project/SpecialCustomization和Project/CustomPlugins的文件夹别名配置
在_ENUM_.nut中添加GetSkillAttackType函数用于获取角色物理魔法状态
2026-02-24 01:34:41 +08:00
7dc35151c7 更改项目名 装备拓展 2026-02-18 21:05:12 +08:00
f4abe5d1eb 更新哥布林袖珍罐 2026-02-13 20:17:21 +08:00
a98bfaef48 露露定制 路径修复 2026-02-10 14:18:37 +08:00
797ae588e6 露露定制 2026-02-09 23:36:05 +08:00
e2592664e8 关闭默认开启装备继承界面 2026-02-09 18:49:51 +08:00
5ba79e747c 关闭默认开启异界装备升级 2026-02-09 18:44:42 +08:00
6559656acb 添加使用消耗品的HOOK 2026-02-04 16:38:58 +08:00
5fca6f4dbb 毁梦装备继承 2026-02-02 20:47:23 +08:00
58c11ab741 修复读取PVF 2026-02-02 13:31:01 +08:00
df2ebd6501 修复道具数量显示 2026-02-02 13:30:51 +08:00
014f519bfc 拓展装备 2026-02-02 13:30:44 +08:00
baea2ffbfc 新的Item绘制 2026-02-02 13:30:37 +08:00
21d18deac6 誉名录 2026-02-02 13:30:28 +08:00
e8f9aa171b 灵魂救赎武器 2026-02-02 13:29:33 +08:00
9379203e96 异界装备升级 2026-02-02 13:29:22 +08:00
d8c12f3d52 1 2026-02-02 13:29:11 +08:00
4e92ff8140 折磨之礼礼盒 2026-01-20 02:55:29 +08:00
58f5d5945c 新增Item绘制接口HOOK 2026-01-20 02:55:20 +08:00
778f9427f2 杂项 2026-01-20 02:54:49 +08:00
6431e2ef38 新增自定义动画类,修复道具数量显示功能,更新项目脚本配置,禁用多个项目功能,调整UI元素位置,删除无用文件。 2026-01-14 20:28:24 +08:00
955b2fdabe 测试 2026-01-09 23:35:54 +08:00
7990a1189d 测试 2026-01-09 23:34:23 +08:00
9e376f0cbc 测试 2026-01-09 23:32:48 +08:00
f72da0ea25 测试 2026-01-09 23:29:44 +08:00
8e1ef904d8 测试 2026-01-09 23:28:33 +08:00
7186fb3a7a 测试 2026-01-09 23:25:15 +08:00
e61fdb1cea 测试超时空 2026-01-09 23:23:07 +08:00
0d3e7994bc 修复回蓝 2026-01-09 20:01:10 +08:00
dd898db1a1 上架超时空 2026-01-08 14:51:20 +08:00
c0bcfa36ab 注释无用回调 2026-01-06 22:54:34 +08:00
420fa26303 新增扩展装备项目及全局信息类描述,更新Hacker_RegApi.nut以支持装备穿戴回调 2026-01-06 22:50:37 +08:00
dfd46dc127 更新毁梦的一键存仓 2026-01-02 19:32:24 +08:00
79 changed files with 5125 additions and 10567 deletions

View File

@@ -86,8 +86,13 @@ function L_drawMainCustomUI_All() {
// if (!TTTAAA) TTTAAA = Rindro_Draw_Character(0, [601590000, 1751501, 601500069], "rest.ani", null);
// if (TTTAAA) TTTAAA.Draw(120, 200);
}
// Rindro_BaseToolClass.DrawNineBox(0, 0, 200, 200, "interface/lenheartwindowcommon.img", 213);
// print(sq_GetObjectId(obj))
// print(Clock());
// Rindro_Image_GlobalMap["interface/newstyle/windows/popup/popup.img"].DrawExPng(138, 205, 0, 0, sq_RGBA(255, 255, 255, 250), 13.0, 13.0);
}
@@ -135,6 +140,39 @@ function L_drawMainCustomUI_All() {
// function drawAppend_VirtualCharacter(a, b, c, d, e, f) {
// local obj = sq_GetMyMasterCharacter();
// // print(Clock());
// // Sout("a: %L",a);
// // Sout("b: %L",b);
// // Sout("c: %L",c);
// // Sout("d: %L",d);
// // Sout("e: %L",e);
// // Sout("f: %L",f);
// // print(a);
// // print(b);
// // print(c);
// // print(d);
// // print(e);
// // print(f);
// // print(c);
// // print(d);
// // L_sq_DrawImg("newtitle/nangua.img", 0, c - 132, d - 360);
// // Rindro_BaseToolClass.DrawAniEx(c - 140, d, "etc/rindro/newtitle/ani/chn_2021_chivarly_system3/chivalry_s3_bottom_00.ani");
// Rindro_BaseToolClass.DrawAniEx(c, d, "etc/rindro/newtitle/ani/jolin/180607_title_jolin_tsai_normal.ani");
// // Rindro_BaseToolClass.DrawAniEx(c, d, "etc/rindro/newtitle/ani/jolin/180607_title_jolin_tsai_dodge.ani");
// // if (!e) {
// // BasicsDrawTool.T_DrawDynamicAni(obj, "Character/Common/Animation/Aura/chn_2021_chivarly_system3/Chivalry_S3_Bottom_00.ani", c, d, "Server_AuctionSystemTimeP22");
// // BasicsDrawTool.T_DrawDynamicAni(obj, "Character/Common/Animation/Aura/chn_2021_chivarly_system3_2/Chivalry_S3_Text.ani", c, d, "Server_AuctionSystemTimeP");
// // BasicsDrawTool.T_DrawDynamicAni(obj, "Character/Common/Animation/Aura/chn_2021_chivarly_system3/Chivalry_S3_Text.ani", c, d - 50, "Server_AuctionSystemTimeP2");
// // BasicsDrawTool.T_DrawDynamicAni(obj, "Character/Common/Animation/Aura/chn_2021_chivarly_system3_3/Chivalry_S3_Text.ani", c, d - 100, "Server_AuctionSystemTimeP3");
// // }
// }
// local asos = sq_CreateAICharacter(900);
@@ -187,3 +225,14 @@ function L_drawMainCustomUI_All() {
// }
// }
// local AddressBuffer = 0x434C1400;
// for (local i = 0; i < 500; i++) {
// local offAddr = (AddressBuffer + (4 * 100));
// local value = MemoryTool.DecodeMemoryData(offAddr);
// if(value == 1768383901){
// print(i);
// }
// }

View File

@@ -0,0 +1,365 @@
/*
文件名:RegistPushString.nut
路径:Base/CallBack/RegistPushString.nut
创建日期:2025-12-27 03:32
文件用途:注册推送字符串
*/
_o_procAppend_All_Map_ <- {}
function _o_procAppend_All_(obj) {
foreach (Func in _o_procAppend_All_Map_) {
Func(obj);
}
}
_o_onBeforeAttack_All_Map_ <- {}
function _o_onBeforeAttack_All_(obj, damager, boundingBox, isStuck) {
foreach (Func in _o_onBeforeAttack_All_Map_) {
Func(obj, damager, boundingBox, isStuck);
}
}
_o_onAfterAttack_All_Map_ <- {}
function _o_onAfterAttack_All_(obj, damager, boundingBox, isStuck) {
foreach (Func in _o_onAfterAttack_All_Map_) {
Func(obj, damager, boundingBox, isStuck);
}
}
_o_onAttackParent_appendage_plugins_Map_ <- {}
function _o_onAttackParent_appendage_plugins(appendage, realAttacker, damager, boundingBox, isStuck) {
foreach (Func in _o_onAttackParent_appendage_plugins_Map_) {
Func(appendage, realAttacker, damager, boundingBox, isStuck);
}
}
_o_onBeforeDamage_All_Map_ <- {}
function _o_onBeforeDamage_All_(obj) {
foreach (Func in _o_onBeforeDamage_All_Map_) {
Func(obj);
}
}
_o_onDamageParent_appendage_plugins_Map_ <- {}
function _o_onDamageParent_appendage_plugins(appendage, attacker, boundingBox, isStuck) {
foreach (Func in _o_onDamageParent_appendage_plugins_Map_) {
Func(appendage, attacker, boundingBox, isStuck);
}
}
_o_onSetHp_appendage_plugins_Map_ <- {}
function _o_onSetHp_appendage_plugins(appendage, hp, attacker) {
foreach (Func in _o_onSetHp_appendage_plugins_Map_) {
Func(appendage, hp, attacker);
}
return -1;
}
_o_sendSetMpPacket_All_Map_ <- {}
function _o_sendSetMpPacket_All_(obj, mp, sendInstant) {
foreach (Func in _o_sendSetMpPacket_All_Map_) {
Func(obj, mp, sendInstant);
}
}
_o_onApplyHpDamage_appendage_plugins_Map_ <- {}
function _o_onApplyHpDamage_appendage_plugins(appendage, newHpDamage, attacker) {
foreach (Func in _o_onApplyHpDamage_appendage_plugins_Map_) {
Func(appendage, newHpDamage, attacker);
}
return newHpDamage;
}
_o_getImmuneTypeDamageRate_appendage_plugins_Map_ <- {}
function _o_getImmuneTypeDamageRate_appendage_plugins(appendage, damageRate, attacker) {
foreach (Func in _o_getImmuneTypeDamageRate_appendage_plugins_Map_) {
Func(appendage, damageRate, attacker);
}
return damageRate;
}
_o_onDestroyObject_appendage_plugins_Map_ <- {}
function _o_onDestroyObject_appendage_plugins(appendage, destroyObj) {
foreach (Func in _o_onDestroyObject_appendage_plugins_Map_) {
Func(appendage, destroyObj);
}
return true;
}
_o_onStartDungeon_All_Map_ <- {}
function _o_onStartDungeon_All_(obj) {
foreach (Func in _o_onStartDungeon_All_Map_) {
Func(obj);
}
}
_o_onStartMap_All_Map_ <- {}
function _o_onStartMap_All_(obj) {
foreach (Func in _o_onStartMap_All_Map_) {
Func(obj);
}
}
_o_onEndMap_All_Map_ <- {}
function _o_onEndMap_All_(obj) {
foreach (Func in _o_onEndMap_All_Map_) {
Func(obj);
}
}
_o_onChangeSkillEffect_All_Map_ <- {}
function _o_onChangeSkillEffect_All_(obj, skillIndex, reciveData) {
foreach (Func in _o_onChangeSkillEffect_All_Map_) {
Func(obj, skillIndex, reciveData);
}
}
_o_useSkill_before_All_Map_ <- {}
function _o_useSkill_before_All_(obj, skillIndex, consumeMp, consumeItem, oldSkillMpRate)
{
foreach (Func in _o_useSkill_before_All_Map_) {
Func(obj, skillIndex, consumeMp, consumeItem, oldSkillMpRate);
}
}
_o_useSkill_after_All_Map_ <- {}
function _o_useSkill_after_All_(obj, skillIndex, consumeMp, consumeItem, oldSkillMpRate)
{
foreach (Func in _o_useSkill_after_All_Map_) {
Func(obj, skillIndex, consumeMp, consumeItem, oldSkillMpRate);
}
}
_o_setState_All_Map_ <- {}
function _o_setState_All_(obj, state, datas, isResetTimer)
{
foreach (Func in _o_setState_All_Map_) {
Func(obj, state, datas, isResetTimer);
}
}
//注册 procAppend 函数
foreach(jobname in getroottable()._Global_Info_.JobName) {
local funcStr = "function _o_procAppend_%s_(obj) {" +
"\n _o_procAppend_All_(obj);" +
"\n try {" +
"\n return procAppend_%s(obj);" +
"\n } catch (exception) {" +
"\n return 1;" +
"\n }" +
"\n}";
funcStr = format(funcStr, jobname, jobname);
local func = compilestring(funcStr, jobname + "GenerateScript");
func();
L_sq_RegistSqrPushStringMap("procAppend_" + jobname, "_o_procAppend_" + jobname + "_");
}
//注册 onBeforeAttack 函数
foreach(jobname in getroottable()._Global_Info_.JobName) {
local funcStr = "function _o_onBeforeAttack_%s_(obj, damager, boundingBox, isStuck) {" +
"\n _o_onBeforeAttack_All_(obj, damager, boundingBox, isStuck);" +
"\n try {" +
"\n onBeforeAttack_%s(obj, damager, boundingBox, isStuck);" +
"\n } catch (exception) {" +
"\n " +
"\n }" +
"\n}";
funcStr = format(funcStr, jobname, jobname);
local func = compilestring(funcStr, jobname + "GenerateScript");
func();
L_sq_RegistSqrPushStringMap("onBeforeAttack_" + jobname, "_o_onBeforeAttack_" + jobname + "_");
}
//注册 onAttackParent 函数
L_sq_RegistSqrPushStringMap("onAttackParent_appendage_plugins", "_o_onAttackParent_appendage_plugins");
//注册 onAfterAttack 函数
foreach(jobname in getroottable()._Global_Info_.JobName) {
local funcStr = "function _o_onAfterAttack_%s_(obj, damager, boundingBox, isStuck) {" +
"\n _o_onAfterAttack_All_(obj, damager, boundingBox, isStuck);" +
"\n try {" +
"\n onAfterAttack_%s(obj, damager, boundingBox, isStuck);" +
"\n } catch (exception) {" +
"\n " +
"\n }" +
"\n}";
funcStr = format(funcStr, jobname, jobname);
local func = compilestring(funcStr, jobname + "GenerateScript");
func();
L_sq_RegistSqrPushStringMap("onAfterAttack_" + jobname, "_o_onAfterAttack_" + jobname + "_");
}
//注册 onBeforeDamage 函数
foreach(jobname in getroottable()._Global_Info_.JobName) {
local funcStr = "function _o_onBeforeDamage_%s_(obj) {" +
"\n _o_onBeforeDamage_All_(obj);" +
"\n try {" +
"\n onBeforeDamage_%s(obj);" +
"\n } catch (exception) {" +
"\n " +
"\n }" +
"\n}";
funcStr = format(funcStr, jobname, jobname);
local func = compilestring(funcStr, jobname + "GenerateScript");
func();
L_sq_RegistSqrPushStringMap("onBeforeDamage_" + jobname, "_o_onBeforeDamage_" + jobname + "_");
}
//注册 onDamageParent 函数
L_sq_RegistSqrPushStringMap("onDamageParent_appendage_plugins", "_o_onDamageParent_appendage_plugins");
//注册 onSetHp 函数
L_sq_RegistSqrPushStringMap("onSetHp_appendage_plugins", "_o_onSetHp_appendage_plugins");
//注册 sendSetMpPacket 函数
foreach(jobname in getroottable()._Global_Info_.JobName) {
local funcStr = "function _o_sendSetMpPacket_%s_(obj, mp, sendInstant) {" +
"\n _o_sendSetMpPacket_All_(obj, mp, sendInstant);" +
"\n try {" +
"\n return sendSetMpPacket_%s(obj, mp, sendInstant);" +
"\n } catch (exception) {" +
"\n " +
"\n }" +
"\n return true;" +
"\n}";
funcStr = format(funcStr, jobname, jobname);
local func = compilestring(funcStr, jobname + "GenerateScript");
func();
L_sq_RegistSqrPushStringMap("sendSetMpPacket_" + jobname, "_o_sendSetMpPacket_" + jobname + "_");
}
//注册 onApplyHpDamage 函数
L_sq_RegistSqrPushStringMap("onApplyHpDamage_appendage_plugins", "_o_onApplyHpDamage_appendage_plugins");
//注册 onApplyHpDamage 函数
L_sq_RegistSqrPushStringMap("getImmuneTypeDamageRate_appendage_plugins", "_o_getImmuneTypeDamageRate_appendage_plugins");
//注册 onApplyHpDamage 函数
L_sq_RegistSqrPushStringMap("onDestroyObject_appendage_plugins", "_o_onDestroyObject_appendage_plugins");
//注册 onStartDungeon 函数
foreach(jobname in getroottable()._Global_Info_.JobName) {
local funcStr = "function _o_onStartDungeon_%s_(obj) {" +
"\n _o_onStartDungeon_All_(obj);" +
"\n try {" +
"\n return onStartDungeon_%s(obj);" +
"\n } catch (exception) {" +
"\n " +
"\n }" +
"\n}";
funcStr = format(funcStr, jobname, jobname);
local func = compilestring(funcStr, jobname + "GenerateScript");
func();
L_sq_RegistSqrPushStringMap("onStartDungeon_" + jobname, "_o_onStartDungeon_" + jobname + "_");
}
//注册 onStartMap 函数
foreach(jobname in getroottable()._Global_Info_.JobName) {
local funcStr = "function _o_onStartMap_%s_(obj) {" +
"\n _o_onStartMap_All_(obj);" +
"\n try {" +
"\n onStartMap_%s(obj);" +
"\n } catch (exception) {" +
"\n " +
"\n }" +
"\n}";
funcStr = format(funcStr, jobname, jobname);
local func = compilestring(funcStr, jobname + "GenerateScript");
func();
L_sq_RegistSqrPushStringMap("onStartMap_" + jobname, "_o_onStartMap_" + jobname + "_");
}
//注册 onEndMap 函数
foreach(jobname in getroottable()._Global_Info_.JobName) {
local funcStr = "function _o_onEndMap_%s_(obj) {" +
"\n _o_onEndMap_All_(obj);" +
"\n try {" +
"\n onEndMap_%s(obj);" +
"\n } catch (exception) {" +
"\n " +
"\n }" +
"\n}";
funcStr = format(funcStr, jobname, jobname);
local func = compilestring(funcStr, jobname + "GenerateScript");
func();
L_sq_RegistSqrPushStringMap("onEndMap_" + jobname, "_o_onEndMap_" + jobname + "_");
}
//注册 onChangeSkillEffect 函数
foreach(jobname in getroottable()._Global_Info_.JobName) {
local funcStr = "function _o_onChangeSkillEffect_%s_(obj, skillIndex, reciveData) {" +
"\n _o_onChangeSkillEffect_All_(obj, skillIndex, reciveData);" +
"\n try {" +
"\n onChangeSkillEffect_%s(obj, skillIndex, reciveData);" +
"\n } catch (exception) {" +
"\n " +
"\n }" +
"\n}";
funcStr = format(funcStr, jobname, jobname);
local func = compilestring(funcStr, jobname + "GenerateScript");
func();
L_sq_RegistSqrPushStringMap("onChangeSkillEffect_" + jobname, "_o_onChangeSkillEffect_" + jobname + "_");
}
//注册 useSkill_before 函数
foreach(jobname in getroottable()._Global_Info_.JobName) {
local funcStr = "function _o_useSkill_before_%s_(obj, skillIndex, consumeMp, consumeItem, oldSkillMpRate) {" +
"\n _o_useSkill_before_All_(obj, skillIndex, consumeMp, consumeItem, oldSkillMpRate);" +
"\n try {" +
"\n return useSkill_before_%s(obj, skillIndex, consumeMp, consumeItem, oldSkillMpRate);" +
"\n } catch (exception) {" +
"\n return true;" +
"\n }" +
"\n}";
funcStr = format(funcStr, jobname, jobname);
local func = compilestring(funcStr, jobname + "GenerateScript");
func();
L_sq_RegistSqrPushStringMap("useSkill_before_" + jobname, "_o_useSkill_before_" + jobname + "_");
}
//注册 useSkill_after 函数
foreach(jobname in getroottable()._Global_Info_.JobName) {
local funcStr = "function _o_useSkill_after_%s_(obj, skillIndex, consumeMp, consumeItem, oldSkillMpRate) {" +
"\n _o_useSkill_after_All_(obj, skillIndex, consumeMp, consumeItem, oldSkillMpRate);" +
"\n try {" +
"\n return useSkill_after_%s(obj, skillIndex, consumeMp, consumeItem, oldSkillMpRate);" +
"\n } catch (exception) {" +
"\n return true;" +
"\n }" +
"\n}";
funcStr = format(funcStr, jobname, jobname);
local func = compilestring(funcStr, jobname + "GenerateScript");
func();
L_sq_RegistSqrPushStringMap("useSkill_after_" + jobname, "_o_useSkill_after_" + jobname + "_");
}
//注册 setState 函数
foreach(jobname in getroottable()._Global_Info_.JobName) {
local funcStr = "function _o_setState_%s_(obj, state, datas, isResetTimer) {" +
"\n _o_setState_All_(obj, state, datas, isResetTimer);" +
"\n try {" +
"\n setState_%s(obj, state, datas, isResetTimer);" +
"\n } catch (exception) {" +
"\n " +
"\n }" +
"\n}";
funcStr = format(funcStr, jobname, jobname);
local func = compilestring(funcStr, jobname + "GenerateScript");
func();
L_sq_RegistSqrPushStringMap("setState_" + jobname, "_o_setState_" + jobname + "_");
}

View File

@@ -40,19 +40,19 @@ class LenheartNewUI_Each_BaseButton extends LenheartNewUI_CommonUi {
if (isLBDown) {
L_sq_DrawImg(Path, Idx + 1, X, Y);
if (Icon) L_sq_DrawImg(Icon, IconIdx, X + 3, Y + 2);
if (Str) L_sq_DrawCode(Str, X + 60 - LenheartTextClass.GetStringLength(Str) / 2, Y + 5, StrColor, 0, 1);
if (Str) L_sq_DrawCode(Str, X + 61 - LenheartTextClass.GetStringLength(Str) / 2, Y + 5, StrColor, 0, 1);
}
//悬停
else if (isInRect) {
L_sq_DrawImg(Path, Idx, X, Y);
if (Icon) L_sq_DrawImg(Icon, IconIdx, X + 3, Y + 1);
if (Str) L_sq_DrawCode(Str, X + 60 - LenheartTextClass.GetStringLength(Str) / 2, Y + 4, StrColor, 0, 1);
if (Str) L_sq_DrawCode(Str, X + 61 - LenheartTextClass.GetStringLength(Str) / 2, Y + 4, StrColor, 0, 1);
}
//普通
else {
L_sq_DrawImg(Path, 0, X, Y);
if (Icon) L_sq_DrawImg(Icon, IconIdx, X + 3, Y + 1);
if (Str) L_sq_DrawCode(Str, X + 60 - LenheartTextClass.GetStringLength(Str) / 2, Y + 4, StrColor, 0, 1);
if (Str) L_sq_DrawCode(Str, X + 61 - LenheartTextClass.GetStringLength(Str) / 2, Y + 4, StrColor, 0, 1);
}
}
}

View File

@@ -1094,7 +1094,8 @@ class LenheartNewUI_BaseInput extends LenheartNewUI_CommonUi {
}
function SetStr(Value) {
L_sq_SetInputBoxStr(InputController, Value);
str = Value;
// L_sq_SetInputBoxStr(InputController, Value);
}
}
@@ -1505,6 +1506,7 @@ class LenheartNewUI_ItemSlot extends LenheartNewUI_CommonUi {
ItemCount = null;
ItemObject = null;
ItemInfoWindow = null;
HoverFlag = false;
//禁止点击
NoClick = false;
@@ -1535,6 +1537,19 @@ class LenheartNewUI_ItemSlot extends LenheartNewUI_CommonUi {
}
}
}
CheckInRect();
}
function CheckInRect() {
local MousePos_X = IMouse.GetXPos();
local MousePos_Y = IMouse.GetYPos();
if (sq_IsIntersectRect(MousePos_X, MousePos_Y, 1, 1, X, Y, 30, 30)) {
//绘制悬停框
L_sq_SetDrawImgModel(2, 0);
Rindro_Image_GlobalMap["lenheartui"].DrawPng(353, X, Y);
L_sq_ReleaseDrawImgModel();
HoverFlag = true;
} else HoverFlag = false;
}
function SetItem(item) {

View File

@@ -445,3 +445,9 @@ function sq_setEquipAppendage(obj, ApdListId, Time) {
local APD = L_Sq_CallFunc(0x9E5130, "int", FFI_MS_CDECL, ["int", "int", "int"], ApdListId, ObjAddress, ObjAddress);
L_Sq_CallFunc(0x4041c0, "int", FFI_THISCALL, ["int", "int", "int"], APD + 44, 0, Time);
}
//获取当前角色的普通物理魔法状态
function sq_GetSkillConversionType()
{
return NativePointer(0x1A3BB40).readInt();
}

View File

@@ -148,8 +148,7 @@ class Rindro_BaseToolClass {
Pack_Control.rawset(Id, CallBack);
}
function RegisterHexPack(Id, CallBack)
{
function RegisterHexPack(Id, CallBack) {
Pack_Hex_Control.rawset(Id, CallBack);
}
@@ -189,7 +188,29 @@ class Rindro_BaseToolClass {
return ani;
}
//高级绘制文字(带换行)
function L_sq_DrawCode_ExRN(str, x, y, rgba, mb, jc) {
local strarr = [];
if (str.find("\\r\\n") == null) {
L_sq_DrawCode(str, x, y, rgba, mb, jc);
} else {
local Bpos = 0;
while (true) {
local Npos = str.find("\\r\\n", Bpos);
if (!Npos) {
local strbuff = str.slice(Bpos, str.len());
strarr.append(strbuff);
break;
}
local strbuff = str.slice(Bpos, Npos);
strarr.append(strbuff);
Bpos = Npos + 4;
}
for (local z = 0; z< strarr.len(); z++) {
L_sq_DrawCode(strarr[z], x, y + (z * 14), rgba, mb, jc);
}
}
}
//初始化根表成员
function InitClass(Name) {
@@ -295,21 +316,28 @@ class Rindro_BaseToolClass {
function GetRarityColor(rarity) {
switch (rarity) {
case 0:
return sq_RGBA(255, 255, 255, 255);
return 0xFFFFFFFF;
case 1:
return sq_RGBA(104, 213, 237, 255);
return 0xFFEDD568;
case 2:
return sq_RGBA(179, 107, 254, 255);
return 0xFFFF6BB3;
case 3:
return sq_RGBA(255, 0, 240, 255);
return 0xFFF000FF;
case 4:
return sq_RGBA(255, 177, 0, 255);
return 0xFF00B1FF;
case 5:
return sq_RGBA(255, 102, 102, 255);
return 0xFF6666FF;
case 6:
return sq_RGBA(255, 50, 50, 255);
return 0xFF0055FF;
case 7:
return 0xFF9314FF;
case 8:
return 0xFF1CBC0C;
case 9:
return 0xFFACFF08;
}
}
}
//获取文字绘制长度
class LenheartTextClass {

View File

@@ -1,15 +1,16 @@
/*
文件名:Lenheart_Ani_Class.nut
路径:Base/UI/Lenheart_Ani_Class.nut
创建日期:2024-08-06 18:56
文件用途:Ani
文件名:CustomAnimation_Class.nut
路径:Base/_Tool/CustomAnimation_Class.nut
创建日期:2026-01-13 19:54
文件用途:
*/
class Lenheart_Ani {
X = 0;
Y = 0;
class Rindro_CustomAnimation {
//Img路径
ImgPath = null;
//Img对象
Img = null;
//帧信息
ImgFrame = null;
@@ -27,22 +28,27 @@ class Lenheart_Ani {
//img 路径 调用帧数组
constructor(path, frame, Pos) {
ImgPath = ("Character/" + path + ".img").tolower();
constructor(path, frame) {
ImgPath = path.tolower();
Img = Rindro_Image(ImgPath);
ImgFrame = frame;
InitTime = Clock();
State = 1;
X = Pos[0];
Y = Pos[1];
//预载入img
foreach(FrameObj in ImgFrame) {
Img.DrawPng(FrameObj.ImgIndex, -999, 999);
}
}
function Show(dt) {
function Show(dt, X, Y) {
if (State == 1) {
if (ImgFrame) {
local NowFrameObj = ImgFrame[CurFrame];
PlayCurTime += dt;
L_sq_DrawImg(ImgPath, NowFrameObj.ImgIndex, NowFrameObj.Pos[0] + X, NowFrameObj.Pos[1] + Y);
Img.DrawPng(NowFrameObj.ImgIndex, NowFrameObj.Pos[0] + X, NowFrameObj.Pos[1] + Y);
if (PlayCurTime >= NowFrameObj.Delay) {
CurFrame++;
//播放完成
@@ -57,12 +63,12 @@ class Lenheart_Ani {
}
}
function ShowEx(dt,gRgba,rate_x,rate_y) {
function ShowEx(dt, X, Y, gRgba, rate_x, rate_y) {
if (State == 1) {
if (ImgFrame) {
local NowFrameObj = ImgFrame[CurFrame];
PlayCurTime += dt;
L_sq_DrawImg(ImgPath, NowFrameObj.ImgIndex, NowFrameObj.Pos[0] + X, NowFrameObj.Pos[1] + Y,1,gRgba,rate_x,rate_y);
Img.DrawExPng(NowFrameObj.ImgIndex, NowFrameObj.Pos[0] + X, NowFrameObj.Pos[1] + Y, 0, gRgba, rate_x, rate_y);
if (PlayCurTime >= NowFrameObj.Delay) {
CurFrame++;
//播放完成
@@ -77,8 +83,7 @@ class Lenheart_Ani {
}
}
function Reset()
{
function Reset() {
CurFrame = 0;
State = 1;
}

View File

@@ -101,6 +101,15 @@ class R_Utils {
return null;
}
//获取APC编号的文件路径
function GetApcPath(ApcIndex) {
local ApcPathAddress = L_Sq_CallFunc(0x1219E80, "int", FFI_THISCALL, ["int", "int"], 0x1D90B60, ApcIndex);
if (ApcPathAddress) {
return NativePointer(ApcPathAddress).readUnicodeString();
}
return null;
}
//获取Lst文件的返回Array
function GetLstArr(Path, Header) {
local Arr = [];
@@ -341,10 +350,130 @@ Rindro_Haker.LoadHook(0x67C560, ["pointer", "int", "int", "int", "int", "void"],
// //hook打开窗口
// Rindro_Haker.LoadHook(0xE6E070, ["int","int","int","int","void"],
//右边窗口公告
/*
StrIII <- Memory.allocUtf8String("sadasda");
L_Sq_CallFunc(0x9536C0, "void", FFI_FASTCALL, ["int", "int", "pointer", "int", "int", "int", "int", "int"], NativePointer(NativePointer(0x1A5FB20).readInt()).add(0x40).readInt(), 0, StrIII.C_Object, 0xFF9BC8E6, 16, 0, 0, 0);
*/
//穿戴或脱下装备
getroottable().WearOrRemoveEquipmentCallBackFunc <- {};
Rindro_Haker.LoadHook(0x7B64BA, ["int", "int", "bool"],
function(args) {
// foreach (Func in WearOrRemoveEquipmentCallBackFunc) {
// Func(args);
// }
// print(args[1]);
// local ThisC = NativePointer(0x1A5FB24).readInt();
// local Slot = NativePointer(Rindro_Haker.CpuContext.ebp).add(8).readInt();
// local EquiObj = L_Sq_CallFunc(0x7B03C0, "int", FFI_FASTCALL, ["int", "int", "int"], ThisC, 0, Slot);
// if (EquiObj) {
// local Index = NativePointer(EquiObj).add(0x1c).readInt();
// print(Index);
// }
return null;
},
function(args) {
foreach(Func in WearOrRemoveEquipmentCallBackFunc) {
Func(args);
}
// print(666);
// print(format("%02x", args.pop()));
// TTTAni <- args.pop();
return null;
});
getroottable().WorldDrawVirtualCharacterCallBackFunc <- {};
Rindro_Haker.LoadHook(0x80CE30, ["int", "int", "int", "int", "int", "int", "int"],
function(args) {
local Layer = args[0];
local XPos = args[1];
local YPos = args[2];
local InfoAddress = NativePointer(Rindro_Haker.CpuContext.ecx).add(0x208).readInt();
local WorldId = NativePointer(InfoAddress).add(0x4).readUShort();
local NameAddress = NativePointer(InfoAddress).add(0x10).readInt();
local Name = NativePointer(NameAddress).readUnicodeString();
foreach(Func in WorldDrawVirtualCharacterCallBackFunc) {
Func(Layer, XPos, YPos, WorldId, Name);
}
// if (Layer == 0 && WorldId == 6)
//注意 这里的坐标如果出现负数 说明 在角色在屏幕外 不需要绘制 同理 超过 卷轴最大值也是 (不过性能影响不大直接绘制就行 避免称谓比角色大 突然显示)
// printf("绘制层级: " + Layer + " XPos: " + XPos + " YPos: " + YPos + " 角色名: " + Name + " 世界ID: " + WorldId);
return null;
},
function(args) {
return null;
});
//使用消耗品
Rindro_Haker.LoadHook(0x7B7A90, ["int", "int", "int", "char"],
function(args) {
local ThisC = NativePointer(0x1A5FB24).readInt();
local ItemObj = L_Sq_CallFunc(0x7B03C0, "int", FFI_FASTCALL, ["int", "int", "int"], ThisC, 0, args[0]);
if (ItemObj) {
local Index = NativePointer(ItemObj).add(0x1c).readInt();
if (getroottable().rawin("onUseItem")) {
getroottable().onUseItem(sq_getMyCharacter(), Index);
}
}
return null;
},
function(args) {
return null;
});
//加载Img
// Rindro_Haker.LoadHook(0x11C0410, ["int", "int", "int", "int"],
// function(args) {
// return null;
// },
// function(args) {
// local Str = NativePointer(args[2]).readUnicodeString();
// local Ret = args.pop();
// if (Str.find(".img") >= 0 && Ret == 0) {
// print(NativePointer(args[2]).readUnicodeString());
// }
// return null;
// });
// Rindro_Haker.LoadHook(0x7FFA80, ["int", "int", "int", "int", "int", "int", "int", "int", "int", "int", "int", "void"],
// function(args) {
// if(args[0] == 0xA){
// args[1] = 4600563;
// printf("切换武器")
// return args;
// }
// // foreach (Func in WearOrRemoveEquipmentCallBackFunc) {
// // Func(args);
// // }
// // print(args[1]);
// // local ThisC = NativePointer(0x1A5FB24).readInt();
// // local Slot = NativePointer(Rindro_Haker.CpuContext.ebp).add(8).readInt();
// // local EquiObj = L_Sq_CallFunc(0x7B03C0, "int", FFI_FASTCALL, ["int", "int", "int"], ThisC, 0, Slot);
// // if (EquiObj) {
// // local Index = NativePointer(EquiObj).add(0x1c).readInt();
// // print(Index);
// // }
// return null;
// },
// function(args) {
@@ -355,17 +484,6 @@ Rindro_Haker.LoadHook(0x67C560, ["pointer", "int", "int", "int", "int", "void"],
// });
// Rindro_Haker.LoadHook(0xE6E070, ["int", "int", "int", "int", "int"],
// function(args) {
// print("nut:" + format("%02x", args[0]));
// print("nut:" + format("%02x", args[1]));
// print("nut:" + format("%02x", args[2]));
// print("nut:" + format("%02x", args[3]));
// return null;
// },
// function(args) {
// // print(666);
// // print(format("%02x", args.pop()));
// // TTTAni <- args.pop();
// return null;
// });
// NativePointer(0x8266F5).writeShort(0x9090)
// NativePointer(0x78FD37).writeShort(0x9090)
// NativePointer(0x78FD3B).writeShort(0x9090)

View File

@@ -73,6 +73,7 @@ class Rindro_Image {
}
Rindro_Image_GlobalMap <- {};
Rindro_Image_GlobalMap["lenheartui"] <- Rindro_Image("interface/lenheartwindowcommon.img");
Rindro_Image_GlobalMap["popup"] <- Rindro_Image("interface/newstyle/windows/popup/popup.img");
/*
local Png = TestImg.GetPng(0);
Png.Draw(200, 200);

View File

@@ -1,6 +1,8 @@
class Rindro_Item {
//C指针
C_Object = null;
//绘制信息结构体
DrawInfo = null;
constructor() {
@@ -24,6 +26,15 @@ class Rindro_Item {
function SetIndex(Index) {
NativePointer(C_Object).add(0x1C).writeInt(Index);
}
//获取名字
function GetName() {
local NamePointer = NativePointer(C_Object).add(0x20).readInt();
return NativePointer(L_sq_I2P(NamePointer)).readUnicodeString();
}
//获取品级
function GetRarity() {
return NativePointer(C_Object).add(0xF4).readInt();
}
//获取强化值
function GetUpgrade() {
return MemoryTool.DecodeMemoryData(C_Object + 0x1054);
@@ -64,4 +75,175 @@ class Rindro_Item {
function SetEnchanting(Enchanting) {
MemoryTool.EncodeMemoryData(C_Object + 0x1084, Enchanting);
}
//读取Uuid
function GetUuid() {
return NativePointer(C_Object).add(0x206).readInt();
}
//是否为装备
function IsEquip() {
return NativePointer(C_Object).add(0x4).readInt() == 2;
}
//是否为消耗品
function IsStack() {
return NativePointer(C_Object).add(0x4).readInt() == 1;
}
function ConstructDrawingInformation(...) {
if (!DrawInfo) {
DrawInfo = Rindro_Item_DrawInfo(this);
if (vargc > 0) {
DrawInfo.AddGuidanceInformation(vargv[0]);
}
DrawInfo.Init();
}
}
function Show(X, Y) {
//背景框
Rindro_BaseToolClass.DrawNineBox(X, Y, 214, DrawInfo.Height + 30, "interface2/common/mypopup/popup.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);
foreach(info in DrawInfo.InfoList) {
//文字
if (info.Type == 0) {
L_sq_DrawCode(info.Content, X + info.X, Y + info.Y, info.Color, 0, 1);
} else if (info.Type == 1) {
Rindro_Image_GlobalMap["popup"].DrawPng(270, X + info.X, Y + info.Y);
} else if (info.Type == 2) {
info.Func(X + info.X, Y + info.Y, this);
}
}
}
}
class Rindro_Item_DrawInfo {
//Item对象
Item = null;
//指导信息 (原装备生成的信息)
GuidanceInformation = null;
//指导信息标志位
GuidanceInformationFlag = 0;
//分割线计数
GuidanceDivCount = 0;
//信息
InfoList = null;
Height = 0;
Padding = 8;
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(Item.GetRarity()));
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);
}
for (local i = 1; i< GuidanceInformation.len(); i++) {
local info = GuidanceInformation[i];
if (info.Str && info.Str.len() > 0) {
local RealStr = format(info.Str);
if (info.Flag != GuidanceInformationFlag) {
AddContent(RealStr, Padding, 15, info.Color);
}
//说明要绘制在右侧这个左侧信息已经绘制过了
else {
local StrLength = LenheartTextClass.GetStringLength(RealStr);
AddContent(RealStr, 215 - StrLength - Padding, 0, info.Color);
}
} else {
GuidanceDivCount++;
AddDividing(26, 15);
//第二道分割线下面
if (GuidanceDivCount > 1) {
//有自定义的代理内容则添加
if (getroottable()["NewItemInfoWindow_Obj"].CustomDrawDelegate.len() > 0) {
//真正达成条件需要代理的Item
local RealCustomDrawDelegate = [];
//先遍历一遍检查条件是否成立
foreach(Name, Info in getroottable()["NewItemInfoWindow_Obj"].CustomDrawDelegate) {
if (Info.CheckFunc(Item) == true) RealCustomDrawDelegate.append(Info);
}
//需要代理的项
if (RealCustomDrawDelegate.len() > 0) {
foreach(Info in RealCustomDrawDelegate) {
AddDelegate(Info.Height, Info.Func);
}
AddDividing(26, 15);
}
}
}
}
GuidanceInformationFlag = info.Flag;
}
}
//增加内容
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;
}
}
getroottable().rawdelete("NewItemInfoWindow_Obj");

View File

@@ -239,6 +239,8 @@ class Rindro_Script {
local Key = Rindro_Script.GetBinString(FindKey);
if (Key) {
local StrFilePath = Key.tolower();
local Type = StrFilePath.slice(0, StrFilePath.find("/")).tolower();
getroottable().RindroLoadStringTable.rawset(Type, {});
local StrFile = R_Utils.GetScriptFileReader(StrFilePath, 10240000);
if (StrFile) {
local StrBuffer = StrFile.Buffer.readUtf8String(StrFile.Size);
@@ -247,7 +249,8 @@ class Rindro_Script {
if (strobj.find(">") != null) {
local strobjarr = split(strobj, ">");
if (strobjarr.len() > 1) {
getroottable().RindroLoadStringTable.rawset(strobjarr[0], Sq_ConvertWideChar(strobjarr[1], "big5"));
getroottable().RindroLoadStringTable[Type].rawset(strobjarr[0], strobjarr[1]);
// getroottable().RindroLoadStringTable[Type].rawset(strobjarr[0], Sq_ConvertWideChar(strobjarr[1], "big5"));
}
}
}
@@ -293,29 +296,37 @@ class Rindro_Script {
}
}
function GetLoadString(Key) {
if (getroottable().RindroLoadStringTable.rawin(Key)) return getroottable().RindroLoadStringTable[Key];
function GetLoadString(Type, Key) {
if (getroottable().RindroLoadStringTable.rawin(Type) && getroottable().RindroLoadStringTable[Type].rawin(Key)) return getroottable().RindroLoadStringTable[Type][Key];
else return "";
}
function UnpackData(IO, i) {
function UnpackData(IO, i, Type) {
local out = "";
IO.seek(i); //内容指示位
local currentByte = IO.readn('c'); //内容指示位
local after = IO.GetInt();
switch (currentByte) {
case 9: {
local NewcurrentByte = IO.readn('c');
local Newafter = IO.GetInt();
local Buf = Rindro_Script.GetBinString(after);
if (!Buf) {
Buf = "";
} else {
Buf = Rindro_Script.GetLoadString(Type, Buf);
}
return Buf;
}
case 10: {
IO.seek(i - 4);
local Before = IO.readn('i');
local Buf = Rindro_Script.GetBinString(after);
if (!Buf) {
Buf = "";
return "";
} else {
Buf = "<" + Before + "::" + Buf + "`" + Rindro_Script.GetLoadString(Buf) + "`>";
return Rindro_Script.GetLoadString(Type, Buf);
}
Buf = Buf + "\r\n";
out += Buf;
break;
}
case 2: {
IO.seek(-4, 'c');
@@ -327,8 +338,7 @@ class Rindro_Script {
Bbuf.writen(after, 'i');
Bbuf.seek(0);
local Buf = Bbuf.readn('f');
out += after + '\t';
break;
return Buf;
}
case 6:
case 8:
@@ -338,15 +348,8 @@ class Rindro_Script {
if (!Buf) Buf = "";
return Buf;
}
case 9: {
IO.seek(i + 6);
local Before = IO.readn('i');
local Buf = Rindro_Script.GetBinString(Before);
out += Rindro_Script.GetLoadString(Buf);
}
default:
out += "";
break;
return "";
}
return out;
@@ -363,24 +366,24 @@ class Rindro_Script {
local i = 2;
while (true) {
if (i< ReadObject.Size && ReadObject.Size - i >= 5) {
local str = Rindro_Script.UnpackData(IO, i);
local str = Rindro_Script.UnpackData(IO, i, "equipment");
i += 5;
//名称
if (str == "[name]") {
local RealKey = str.slice(1, str.len() - 1);
EquipmentAtt[RealKey] <- Rindro_Script.UnpackData(IO, i);
EquipmentAtt[RealKey] <- Rindro_Script.UnpackData(IO, i, "equipment");
i += 5;
}
//装备类型
else if (str == "[equipment type]") {
local Buf = Rindro_Script.UnpackData(IO, i);
local Buf = Rindro_Script.UnpackData(IO, i, "equipment");
EquipmentAtt["equipment_type"] <- Buf.slice(1, -1);
i += 5;
}
//称号动画
else if (str == "[custom animation]") {
local Buf = Rindro_Script.UnpackData(IO, i).tolower();
local Buf = Rindro_Script.UnpackData(IO, i, "equipment").tolower();
EquipmentAtt["custom_animation"] <- Buf;
i += 5;
}
@@ -389,12 +392,12 @@ class Rindro_Script {
EquipmentAtt["Aurora"] <- {};
EquipmentAtt["Aurora"].Back <- [];
EquipmentAtt["Aurora"].Front <- [];
local Count = Rindro_Script.UnpackData(IO, i);
local Count = Rindro_Script.UnpackData(IO, i, "equipment");
i += 5;
for (local z = 0; z< Count; z++) {
local Layer = Rindro_Script.UnpackData(IO, i);
local Layer = Rindro_Script.UnpackData(IO, i, "equipment");
i += 5;
local Path = Rindro_Script.UnpackData(IO, i).tolower();
local Path = Rindro_Script.UnpackData(IO, i, "equipment").tolower();
i += 5;
if (Layer == 0) EquipmentAtt["Aurora"].Back.append(Path);
if (Layer == 1) EquipmentAtt["Aurora"].Front.append(Path);
@@ -405,7 +408,7 @@ class Rindro_Script {
else if (str == "[hide layer]") {
EquipmentAtt["hidelayer"] <- [];
while (true) {
local Buffer = Rindro_Script.UnpackData(IO, i);
local Buffer = Rindro_Script.UnpackData(IO, i, "equipment");
i += 5;
if (Buffer == "[/hide layer]") {
break;
@@ -415,7 +418,7 @@ class Rindro_Script {
}
//Ani
else if (str == "[animation job]") {
local Job = Rindro_Script.UnpackData(IO, i).slice(1, -1);
local Job = Rindro_Script.UnpackData(IO, i, "equipment").slice(1, -1);
local SpacePos = Job.find(" ");
if (SpacePos) {
Job = Job.slice(0, SpacePos) + Job.slice(SpacePos + 1);
@@ -424,24 +427,24 @@ class Rindro_Script {
EquipmentAtt["Ani_" + Job] <- {};
i += 5;
local Index1 = Rindro_Script.UnpackData(IO, i);
local Index1 = Rindro_Script.UnpackData(IO, i, "equipment");
i += 5;
local Index2 = Rindro_Script.UnpackData(IO, i);
local Index2 = Rindro_Script.UnpackData(IO, i, "equipment");
i += 5;
EquipmentAtt["Ani_" + Job].variation <- [Index1, Index2];
EquipmentAtt["Ani_" + Job].layer_variation <- [];
while (true) {
try {
local Ret = Rindro_Script.UnpackData(IO, i);
local Ret = Rindro_Script.UnpackData(IO, i, "equipment");
i += 5;
if (Ret == "[animation job]" || (Rindro_Script.endswith(Ret, "]") && Ret != "[equipment ani script]" && Ret != "[layer variation]")) {
i -= 5;
break;
} else if (Ret == "[layer variation]") {
local InfoBuf = {};
InfoBuf.Zorder <- Rindro_Script.UnpackData(IO, i);
InfoBuf.Zorder <- Rindro_Script.UnpackData(IO, i, "equipment");
i += 5;
InfoBuf.Path <- Rindro_Script.UnpackData(IO, i);
InfoBuf.Path <- Rindro_Script.UnpackData(IO, i, "equipment");
i += 5;
EquipmentAtt["Ani_" + Job].layer_variation.append(InfoBuf);
}
@@ -692,15 +695,16 @@ class Rindro_Script {
function ResolvingData(IO, Func, Path) {
local DataTable = {};
DataTable.filepath <- Path;
local Type = Path.slice(0, Path.find("/")).tolower();
local DataArr = [];
local Length = IO.len();
if (Length >= 7) {
local i = 2;
while (true) {
if (i< Length && Length - i >= 5) {
local str = Rindro_Script.UnpackData(IO, i);
local str = Rindro_Script.UnpackData(IO, i, Type);
i += 5;
DataArr.push(str);
if(str != "")DataArr.push(str);
} else break;
}
Func(DataTable, _PVF_Data_(DataArr));

29
Base/_Z_Data/Global.nut Normal file
View File

@@ -0,0 +1,29 @@
/*
文件名:Global.nut
路径:Base/_Z_Data/Global.nut
创建日期:2025-12-27 03:50
文件用途:全局信息类
*/
class _GlobalInfoClass_ {
//职业名称
JobName = null;
constructor() {
InitJobNmae();
}
function InitJobNmae() {
JobName = [];
Rindro_Script.GetFileData("character/character.lst", function(DataTable, Data) {
while (!Data.Eof()) {
local Index = Data.Get();
local Name = Data.Get();
Name = Name.slice(Name.find("/") + 1, Name.find(".chr"));
JobName.append(Name);
}
});
}
}
getroottable()._Global_Info_ <- _GlobalInfoClass_();

View File

@@ -1,37 +0,0 @@
/*
文件名:DrawHudMain.nut
路径:Base/CallBack/DrawHudMain.nut
创建日期:2024-08-29 09:39
文件用途:
*/
//血槽背景
function L_HUD_BloodBackground() {
local RootTab = getroottable();
local obj = sq_getMyCharacter();
if (!obj) return;
if (RootTab.rawin("HudUi_Obj")) {
RootTab.HudUi_Obj.BottomShow(obj);
}
if (RootTab.rawin("EventList_Obj")) {
foreach(win in EventList_Obj.Events) {
win.EventShow(obj);
}
}
}
getroottable().Camera_Pos <- {};
//城镇摄像机
function L_Sync_Camera_Pos(Camera_Object) {
// print(Camera_Object);
// print(Camera_Object);
getroottable().Camera_Pos.X <- L_sq_RA(Camera_Object + 0x638);
getroottable().Camera_Pos.Y <- L_sq_RA(Camera_Object + 0x63C);
}
function Sq_DrawChannel() {
// L_sq_DrawImg("interface2/cs_shop/cs_packageevent/2021_summer/hearoursummer_calendarui.img", 0, 0, 0);
}

View File

@@ -1,231 +0,0 @@
/*
文件名:DrawMain.nut
路径:Base/CallBack/DrawMain.nut
创建日期:2024-08-06 18:58
文件用途:绘制回调
*/
//在DrawMain后面调用
function L_drawMainCustomUI_All() {
local obj = sq_getMyCharacter();
if (!obj) return;
local RootTab = getroottable();
//获取与上一帧的dt
if (!(RootTab.rawin("Rindro_DurationFlag"))) {
Rindro_DurationFlag <- L_Getmicroseconds();
Rindro_Duration <- 0;
} else {
local NowM = L_Getmicroseconds();
Rindro_Duration = (NowM - Rindro_DurationFlag);
Rindro_DurationFlag = NowM;
}
//下帧执行任务事件
if (RootTab.rawin("LenheartNextFrameFuncTab")) {
foreach(Func in RootTab["LenheartNextFrameFuncTab"]) {
Func();
}
RootTab["LenheartNextFrameFuncTab"] = [];
} else {
RootTab.LenheartNextFrameFuncTab <- [];
}
//重载逻辑
Sq_ReloadLogic();
//初始化活动图标
Lenheart_EventList_Fun(obj);
//加载注册Base函数窗口
if (RootTab.rawin("LenheartBaseFuncTab")) {
local LenheartFunc = RootTab["LenheartBaseFuncTab"];
foreach(Func in LenheartFunc) {
Func(obj);
}
}
//加载注册Ex函数窗口
if (RootTab.rawin("LenheartFuncTab")) {
local LenheartFunc = RootTab["LenheartFuncTab"];
foreach(name,Func in LenheartFunc) {
if(name = "GetDamageRateFuncN"){
print(name);
Func(obj);
}
}
}
//所有插件初始化完毕
if (!getroottable().rawin("LenheartPluginsInitFlag")) {
local T = {
op = 25001021,
}
Rindro_BaseToolClass.SendPackEx(T);
getroottable().LenheartPluginsInitFlag <- true;
}
// for (local i = 0; i< 100; i++) {
// for (local z = 0; z < 100; z++) {
// sq_PutPixel(sq_RGBA(230, 200, 155, 255), 200 + i, 200 + z);
// }
// }
// sq_DrawBox(100, 100, 100, 100, 0xffffffff);
// L_Sq_CallFunc(0x11E86C0, "char", FFI_STDCALL, ["int", "int", "int", "int", "int"], 10, 10, 750, 350, 0xffffffff);
// for (local i = 0; i< 100; i++) {
// for (local z = 0; z< 100; z++) {
// sq_PutPixel(sq_RGBA(230, 200, 155, 255), 200 + i, 200 + z);
// }
// }
// L_sq_Test(0x11A7B65);
// local Device = NativePointer(0x1B45AB8).readInt();
// print(format("Device:0x%02x", Device));
// L_sq_Test(Device);
// if (!TTTAAA) TTTAAA = Rindro_Draw_Character(0, [601590000, 1751501, 601500069], "rest.ani", null);
// if (TTTAAA) TTTAAA.Draw(120, 200);
}
// for (local i = 0; i < 42; i++) {
// local Value = MemoryTool.DecodeMemoryData(0x394e8c00+0x1050 + (i * 4));
// if(Value == 151)print("Value :" + i * 4);
// }
// print(MemoryTool.DecodeMemoryData(0x1DFFB240));
// MemoryTool.EncodeMemoryData(0x304bdc00+0x1054,7);
// TTTAAA <- null;
// L_NewWindows("Lenheart", 56, 0x1);
// L_Sq_CallFunc(0xE6E070, "int", FFI_THISCALL, ["int", "int", "int", "int"], 0x01ADE090, 56, 0, 0);
// getroottable().Lsnzz <- Clock();
// dofile("sqr/Base/_Tool/Json.nut");
// print(T);
// Register_DPS_Pack(1, function(Jso) {
// printT(Jso);
// });
// for (local i = 0; i< 50; i++) {
// local asos = sq_CreateCharacter(0,0);
// // asos.setValid(false);
// // local obj = sq_GetCNRDObjectToActiveObject(asos);
// // sq_SendDestroyPacketPassiveObject(obj);
// // sendDestroyPacket(obj);
// // sq_SendDestroyPacketPassiveObject(asos);
// // sq_AddObject(sq_getMyCharacter(), asos, OBJECTTYPE_VIRTUALCHARACTER, false);
// // asos.setValid(false);
// // L_sq_Test(L_Sq_GetObjectAddress(asos));
// L_Sq_CallFunc(0x5A44B0, "void", FFI_MS_CDECL, ["int"], L_Sq_GetObjectAddress(asos));
// }
// local asos = sq_CreateAICharacter(900);
// // sq_DeleteParticleCreater(asos);
// local asos = sq_CreateAICharacter(419);
// asos.setCurrentPos(sq_getMyCharacter().getXPos() + 100, sq_getMyCharacter().getYPos(), 0);
// sq_AddObject(sq_getMyCharacter(), asos, OBJECTTYPE_VIRTUALCHARACTER, false);
// sq_ChangeDrawLayer(asos, ENUM_DRAWLAYER_CLOSEBACK);
// L_sq_GoDungeon(1504);
// CargoType <- 0;
// Sq_GetExeStr_Map[21910] <- function(Index) {
// CargoType = 0;
// return 21910;
// }
// Sq_GetExeStr_Map[21911] <- function(Index) {
// CargoType = 1;
// return 21911;
// }
// Rindro_Haker.LoadHook(0xE67800, ["int", "int"],
// function(args) {
// //点击了仓库转移物品
// if (args[0] == 0x2B) {
// if (CargoType == 0) {
// printf("点击个人仓库转移物品");
// local T = {
// op = 21091001,
// type = 0,
// }
// Rindro_BaseToolClass.SendPackEx(T);
// return [0];
// }
// if (CargoType == 1) {
// printf("点击账号仓库转移物品");
// local T = {
// op = 21091001,
// type = 1,
// }
// Rindro_BaseToolClass.SendPackEx(T);
// return [0];
// }
// }
// return null;
// },
// function(args) {
// // print(666);
// // print(format("%02x", args.pop()));
// // TTTAni <- args.pop();
// return null;
// });
// function onAttack_Swordman(obj, damager, boundingBox, isStuck)
// {
// local Mon = sq_GetCNRDObjectToActiveObject(damager);
// Mon.setHp(0, null, true);
// }
// function getCurrentModuleDamageRate(obj) {
// local LLJob = sq_getJob(obj);
// local LLGrowT = sq_getGrowType(obj);
// if (LLJob == 0 && LLGrowT == 2)
// return 2100000000.0;
// return 1.0;
// }
// function onStartDungeon_Swordman(obj) {
// print(666);
// obj.setEnableDamageBox(false);
// }
// local chrobj = sq_CreateCharacter(0, 4);
// print("-----------------------------------------------/");
// foreach(member, val in chrobj.getclass()) {
// ::print(member + "\n");
// local attr;
// if ((attr = chrobj.getclass().getattributes(member)) != null) {
// foreach(i, v in attr) {
// ::print("\t" + i + " = " + (typeof v) + "\n");
// }
// } else {
// ::print("\t<no attributes>\n")
// }
// }

View File

@@ -1,84 +0,0 @@
/*
文件名:GetDamageRate.nut
路径:Base/CallBack/GetDamageRate.nut
创建日期:2024-08-09 14:10
文件用途:获取伤害倍率
*/
RindroDamageRate <- 1.0;
function L_getCurrentModuleDamageRate(obj) {
if (!obj)
return 1.0;
local ClientRat = 1.0;
try {
ClientRat = getCurrentModuleDamageRate(obj).tofloat();
} catch (exception) {
ClientRat = 1.0;
}
return (RindroDamageRate * ClientRat);
}
function Lenheart_GetDamageRate_Fun(obj) {
//在城镇时
if (sq_GetCurrentModuleType() == 1) {
RindroDamageRate = 1.0;
}
}
//修改伤害回调
function SetDamageRateCallBack(Chunk) {
local Jso = Json.Decode(Chunk);
RindroDamageRate = Jso.rate;
}
Pack_Control.rawset(2024110902, SetDamageRateCallBack);
getroottable()["LenheartFuncTab"].rawset("GetDamageRateFuncN", Lenheart_GetDamageRate_Fun);
// ModuleDamageTable <- {
// //这个1是 副本编号
// [1] = {
// //这个0是大职业编号 比如说鬼剑士就是 0 女格斗家就是 1 在character/character.lst 这个文件里可以看
// [0] = {
// //这个0 和 1 是转职编号 0就是未转职 1 就是转了剑魂
// [0] = 1.0,
// [1] = 3.0
// }
// },
// //2号副本
// [2] ={
// //女格斗家职业
// [1] = {
// [0] = 1.0,
// [1] = 3.0
// }
// }
// }
// function getCurrentModuleDamageRate(obj)
// {
// local Rate = 1.0;
// local stage = sq_GetGlobaludpModuleStage();
// local dungeon = sq_GetDungeonByStage(stage);
// local dungeonIndex = sq_GetDuegonIndex(dungeon);
// local LLJob = sq_getJob(obj);
// local LLGrowT = sq_getGrowType(obj);
// //处于生效副本中
// if(ModuleDamageTable.rawin(dungeonIndex)){
// //自己是生效职业
// if(ModuleDamageTable[dungeonIndex].rawin(LLJob)){
// //是生效转职
// if(ModuleDamageTable[dungeonIndex][LLJob].rawin(LLGrowT)){
// Rate += ModuleDamageTable[dungeonIndex][LLJob][LLGrowT].tofloat();
// }
// }
// }
// return Rate;
// }

View File

@@ -1,183 +0,0 @@
/*
文件名:PackControl.nut
路径:Base/PackControl/PackControl.nut
创建日期:2024-08-06 22:13
文件用途:
*/
Pack_Control <- {}
Pack_Hex_Control <- {}
Pack_DPS_Control <- {}
function Register_DPS_Pack(Id, Func) {
Pack_DPS_Control.rawset(Id, Func);
}
function Sq_Pack_Control(Chunk) {
try {
local Pack_Json = Json.Decode(Chunk);
if (Pack_Json.op == 2147483646) {
if (Pack_DPS_Control.rawin(Pack_Json.dps_id)) {
local Jso = Json.Decode(Chunk);
Jso.rawdelete("op");
Pack_DPS_Control[Pack_Json.dps_id](Jso);
}
} else {
if (Pack_Control.rawin(Pack_Json.op)) {
try {
Pack_Control[Pack_Json.op](Chunk);
} catch (exception) {
print("error pack: " + Pack_Json.op);
}
}
}
} catch (exception) {
// print("error packmsg: " + Pack_Json.op);
print(exception);
}
}
function Sq_Pack_ControlLocal(Chunk) {
local Pack_Json = Json.Decode(Chunk);
if (Pack_Json.op == 2147483646) {
if (Pack_DPS_Control.rawin(Pack_Json.dps_id)) {
local Jso = Json.Decode(Chunk);
Jso.rawdelete("op");
Pack_DPS_Control[Pack_Json.dps_id](Jso);
}
} else {
if (Pack_Control.rawin(Pack_Json.op)) {
Pack_Control[Pack_Json.op](Chunk);
}
}
}
//字节流包
function Sq_BlobPack_Control(Size, Pointer) {
local Pack = Packet();
Pack.Load(Pointer, Size);
local Op = Pack.GetInt();
//读取位置回到原点
// Pack.Seek(0);
if (Pack_Hex_Control.rawin(Op)) {
Pack_Hex_Control[Op](Pack);
}
}
function SendPackToDP_S(Id, T) {
T.op <- 2147483646;
T.dps_id <- Id;
Rindro_BaseToolClass.SendPackEx(T);
}
//进入副本回调
function LenheartGotoDgnCallBack(Chunk) {
local Jso = Json.Decode(Chunk);
local DgnId = Jso.map.id;
local DgnRate = Jso.map.ra;
L_sq_GoDungeon(DgnId);
}
Pack_Control.rawset(2024041602, LenheartGotoDgnCallBack);
//进入副本增加属性
function LenheartAdditionalAttributes(obj) {
obj = sq_ObjectToSQRCharacter(obj);
//在副本中
if (sq_GetCurrentModuleType() == 3) {
if (!CNSquirrelAppendage.sq_IsAppendAppendage(obj, "appendage/lenheartap.nut")) {
if ("LenheartAttributesTable" in getroottable()) {
local Abarr = {};
foreach(AtObj in getroottable()["LenheartAttributesTable"]) {
foreach(Apos, At in AtObj) {
if (!Abarr.rawin(Apos)) Abarr[Apos] <- At;
else Abarr[Apos] += At;
}
}
local appendage = CNSquirrelAppendage.sq_AppendAppendage(obj, obj, -1, false, "appendage/lenheartap.nut", true);
CNSquirrelAppendage.sq_Append(appendage, obj, obj);
local change_appendage = appendage.sq_getChangeStatus("Yosin_LenheartDgnBuff");
if (!change_appendage) {
change_appendage = appendage.sq_AddChangeStatusAppendageID(obj, obj, 0,
CHANGE_STATUS_TYPE_COOLTIME_DECLINE,
false, 0, 115514);
}
if (change_appendage) {
change_appendage.clearParameter();
foreach(Key, Value in Abarr) {
if (Key == 0) change_appendage.addParameter(13, false, Value.tofloat()); //HP
else if (Key == 1) change_appendage.addParameter(48, false, Value.tofloat()); //MP
else if (Key == "strength") change_appendage.addParameter(0, false, Value.tofloat()); //力量
else if (Key == "intelligence") change_appendage.addParameter(1, false, Value.tofloat()); //智力
else if (Key == "vitality") change_appendage.addParameter(2, false, Value.tofloat()); //体力
else if (Key == "spirit") change_appendage.addParameter(3, false, Value.tofloat()); //精神
else if (Key == "physicalAttack") change_appendage.addParameter(4, false, Value.tofloat()); //物攻
else if (Key == "magicAttack") change_appendage.addParameter(31, false, Value.tofloat()); //魔攻
else if (Key == "independentAttack") {
change_appendage.addParameter(53, false, Value.tofloat()); //独立
change_appendage.addParameter(54, false, Value.tofloat()); //独立
} else if (Key == "physicalDefense") change_appendage.addParameter(5, false, Value.tofloat()); //物理防御
else if (Key == "magicDefense") change_appendage.addParameter(32, false, Value.tofloat()); //魔法防御
else if (Key == "physicalCritical") change_appendage.addParameter(15, false, Value.tofloat() / 10.0); //物理暴击
else if (Key == "magicCritical") change_appendage.addParameter(16, false, Value.tofloat() / 10.0); //魔法暴击
else if (Key == "attackSpeed") change_appendage.addParameter(10, false, Value.tofloat()); //攻速
else if (Key == "releaseSpeed") change_appendage.addParameter(12, false, Value.tofloat()); //释放
else if (Key == "moveSpeed") change_appendage.addParameter(11, false, Value.tofloat()); //移速
else if (Key == "resistance") change_appendage.addParameter(39, false, Value.tofloat()); //抗磨
else if (Key == "hitRate") change_appendage.addParameter(33, false, Value.tofloat()); //命中
else if (Key == "avoidance") change_appendage.addParameter(27, false, Value.tofloat()); //闪避
else if (Key == "hpRecovery") change_appendage.addParameter(14, false, Value.tofloat()); //HP恢复
else if (Key == "mpRecovery") change_appendage.addParameter(29, false, Value.tofloat()); //MP恢复
else if (Key == "stun") change_appendage.addParameter(41, false, Value.tofloat()); //僵直
else if (Key == "hardStun") change_appendage.addParameter(34, false, Value.tofloat()); //硬直
else if (Key == "fire") change_appendage.addParameter(42, false, Value.tofloat()); //火强
else if (Key == "fireResistance") change_appendage.addParameter(20, false, Value.tofloat()); //火抗
else if (Key == "water") change_appendage.addParameter(43, false, Value.tofloat()); //冰强
else if (Key == "waterResistance") change_appendage.addParameter(21, false, Value.tofloat()); //冰抗
else if (Key == "light") change_appendage.addParameter(45, false, Value.tofloat()); //光强
else if (Key == "lightResistance") change_appendage.addParameter(23, false, Value.tofloat()); //光抗
else if (Key == "dark") change_appendage.addParameter(44, false, Value.tofloat()); //暗强
else if (Key == "darkResistance") change_appendage.addParameter(22, false, Value.tofloat()); //暗抗
}
}
}
}
}
}
if (getroottable().rawin("LenheartFuncTab")) {
getroottable()["LenheartFuncTab"].rawset("LenheartAdditionalAttributesFunc", LenheartAdditionalAttributes);
} else {
local T = {};
T.rawset("LenheartAdditionalAttributesFunc", LenheartAdditionalAttributes);
getroottable().rawset("LenheartFuncTab", T);
}
//进入副本增加属性
function LenheartAdditionalCallBack(Chunk) {
local Jso = Json.Decode(Chunk);
if ("LenheartAttributesTable" in getroottable()) {
local T = getroottable()["LenheartAttributesTable"];
T.rawset("LenheartCollectBoxAb", Jso.Attribute);
} else {
local T = {};
T.rawset("LenheartCollectBoxAb", Jso.Attribute);
getroottable().rawset("LenheartAttributesTable", T);
}
}
Pack_Control.rawset(20069016, LenheartAdditionalCallBack);
getroottable().PluginsCompatibilityModeCallBack <- false;
//兼容模式
function CompatibilityModeCallBack(Chunk) {
getroottable().PluginsCompatibilityModeCallBack <- true;
}
Pack_Control.rawset(30004, CompatibilityModeCallBack);

View File

@@ -1,32 +0,0 @@
/*
文件名:PushDamage.nut
路径:Base/CallBack/PushDamage.nut
创建日期:2024-08-30 14:41
文件用途:发生伤害时
*/
PushDamageFontDataFuncTab <- {};
PushDamageFontFuncTab <- {};
function Sq_PushDamageData(ObjAddress, MySelfAddress, Value) {
// print("MyCharacter: " + format("%02x", L_sq_RA(0x1AB7CDC)));
// print("ObjAddress: " + format("%02x", ObjAddress));
// print("A1: " + format("%02x", A1));
// print("A2: " + format("%02x", A2));
// print(" ");
foreach(Func in PushDamageFontFuncTab) {
Func(ObjAddress, MySelfAddress, Value);
}
}
function Sq_PushDamageFontData(ObjAddress, X, Y, Z, Value, Type, A1, A2) {
local Flag = true;
foreach(Func in PushDamageFontDataFuncTab) {
local Ret = Func(ObjAddress, X, Y, Z, Value, Type, A1, A2);
if (Ret == false) {
Flag = false;
}
}
return Flag;
}

View File

@@ -1,30 +0,0 @@
/*
文件名:Interface.nut
路径:Base/Interface.nut
创建日期:2025-05-01 07:39
文件用途:所有基础文件加载以后 将会执行的逻辑 用于初始化一些接口和默认设置
*/
//消息框黏贴
NativePointer(0x011C53B0).writeShort(0x1B0);
//修复233号弹窗
NativePointer(0x00727017).writeByteArray([0xEB, 0x11, 0x90, 0x90, 0x90, 0x90, 0x90]);
//反遍历函数
NativePointer(0x1370FD7).writeInt(0);
//全局的道具信息
if (!getroottable().rawin("Rindro_ItemInfoObject")) Rindro_ItemInfoObject <- {};
//开启热重载目录
if(getroottable().rawin("RINDROLOCAL") && RINDROLOCAL == true)Sq_AutoReload("sqr");
print("cs base ");
print("cs base ");
print("cs base ");
print("cs base ");
print("cs base ");
print("cs base ");
print("cs base ");

View File

@@ -1,512 +0,0 @@
/*
文件名:Lenheart_Character_Info_Class.nut
路径:Base/UI/Lenheart_Character_Info_Class.nut
创建日期:2024-08-27 12:13
文件用途:个人信息属性面板
*/
return;
class Lenheart_Character_Info_ClassC extends LenheartNewUI_Windows {
//调试模式
// DeBugMode = true;
//不是窗口
NoWindow = true;
//是否可见
Visible = false;
//图标路径
IconPath = "interface2/profile/profile_icon1.img";
//我的信息
MyInfo = null;
//滚轮偏移值
YOffset = 0;
function My_GetCharacterInfoCallBack(Chunk) {
local Jso = Json.Decode(Chunk);
MyInfo = Jso.Attribute;
}
//初始化
constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH) {
Childrens = [];
//注册控件
RegisterWidget();
LenheartNewUI_Windows.constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH);
Pack_Control.rawset(20069014, My_GetCharacterInfoCallBack.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);
}
//绘制主界面
function DrawMain(obj) {
DrawInfo(obj);
}
function CheckPosInDrawBox(PosY) {
if ((PosY + YOffset) >= 0 && (PosY + YOffset)< 144) return true;
return false;
}
//绘制信息
function DrawInfo(obj) {
if (MyInfo) {
//生命魔法值
local PosOffset = 0;
if (CheckPosInDrawBox(PosOffset)) {
L_sq_DrawImg(IconPath, 0, X + 4, Y + 3 + YOffset);
L_sq_DrawCode("HP", X + 20, Y + 4 + PosOffset + YOffset, sq_RGBA(255, 255, 255, 250), 0, 1);
local HpStr = MyInfo.CurHp.tostring() + "/" + MyInfo.MaxHp.tostring();
L_sq_DrawCode(HpStr, X + 128 - LenheartTextClass.GetStringLength(HpStr), Y + 4 + (0 * 18) + YOffset, sq_RGBA(150, 255, 30, 250), 0, 1);
L_sq_DrawImg(IconPath, 1, X + 130, Y + 3 + YOffset);
L_sq_DrawCode("MP", X + 148, Y + 4 + PosOffset + YOffset, sq_RGBA(255, 255, 255, 250), 0, 1);
local HpStr = MyInfo.CurMp.tostring() + "/" + MyInfo.MaxMp.tostring();
L_sq_DrawCode(HpStr, X + 248 - LenheartTextClass.GetStringLength(HpStr), Y + 4 + (0 * 18) + YOffset, sq_RGBA(150, 255, 30, 250), 0, 1);
}
//力量智力
PosOffset += 18;
if (CheckPosInDrawBox(PosOffset)) {
L_sq_DrawImg(IconPath, 2, X + 4, Y + 3 + PosOffset + YOffset);
L_sq_DrawCode("力量", X + 20, Y + 4 + PosOffset + YOffset, sq_RGBA(255, 255, 255, 250), 0, 1);
local Str = MyInfo.Strength.tostring();
L_sq_DrawCode(Str, X + 128 - LenheartTextClass.GetStringLength(Str), Y + 4 + PosOffset + YOffset, sq_RGBA(150, 255, 30, 250), 0, 1);
L_sq_DrawImg(IconPath, 3, X + 130, Y + 3 + PosOffset + YOffset);
L_sq_DrawCode("智力", X + 148, Y + 4 + PosOffset + YOffset, sq_RGBA(255, 255, 255, 250), 0, 1);
local Str2 = MyInfo.Intellect.tostring();
L_sq_DrawCode(Str2, X + 248 - LenheartTextClass.GetStringLength(Str2), Y + 4 + PosOffset + YOffset, sq_RGBA(150, 255, 30, 250), 0, 1);
}
//体力精神
PosOffset += 18;
if (CheckPosInDrawBox(PosOffset)) {
L_sq_DrawImg(IconPath, 4, X + 4, Y + 3 + PosOffset + YOffset);
L_sq_DrawCode("体力", X + 20, Y + 4 + PosOffset + YOffset, sq_RGBA(255, 255, 255, 250), 0, 1);
local Str = MyInfo.Vitality.tostring();
L_sq_DrawCode(Str, X + 128 - LenheartTextClass.GetStringLength(Str), Y + 4 + PosOffset + YOffset, sq_RGBA(150, 255, 30, 250), 0, 1);
L_sq_DrawImg(IconPath, 5, X + 130, Y + 3 + PosOffset + YOffset);
L_sq_DrawCode("精神", X + 148, Y + 4 + PosOffset + YOffset, sq_RGBA(255, 255, 255, 250), 0, 1);
local Str2 = MyInfo.Spirit.tostring();
L_sq_DrawCode(Str2, X + 248 - LenheartTextClass.GetStringLength(Str2), Y + 4 + PosOffset + YOffset, sq_RGBA(150, 255, 30, 250), 0, 1);
}
//物理攻击魔法攻击
PosOffset += 18;
if (CheckPosInDrawBox(PosOffset)) {
L_sq_DrawImg(IconPath, 6, X + 4, Y + 3 + PosOffset + YOffset);
L_sq_DrawCode("物理攻击", X + 20, Y + 4 + PosOffset + YOffset, sq_RGBA(255, 255, 255, 250), 0, 1);
local Str = MyInfo.PhysicalAttack.tostring();
L_sq_DrawCode(Str, X + 128 - LenheartTextClass.GetStringLength(Str), Y + 4 + PosOffset + YOffset, sq_RGBA(150, 255, 30, 250), 0, 1);
L_sq_DrawImg(IconPath, 7, X + 130, Y + 3 + PosOffset + YOffset);
L_sq_DrawCode("魔法攻击", X + 148, Y + 4 + PosOffset + YOffset, sq_RGBA(255, 255, 255, 250), 0, 1);
local Str2 = MyInfo.MagicalAttack.tostring();
L_sq_DrawCode(Str2, X + 248 - LenheartTextClass.GetStringLength(Str2), Y + 4 + PosOffset + YOffset, sq_RGBA(150, 255, 30, 250), 0, 1);
}
//独立攻击力
PosOffset += 18;
if (CheckPosInDrawBox(PosOffset)) {
L_sq_DrawImg(IconPath, 31, X + 4, Y + 3 + PosOffset + YOffset);
L_sq_DrawCode("独立攻击力(物理/魔法)", X + 20, Y + 4 + PosOffset + YOffset, sq_RGBA(255, 255, 255, 250), 0, 1);
local Str = MyInfo.IndependentAttack.tostring();
L_sq_DrawCode(Str, X + 248 - LenheartTextClass.GetStringLength(Str), Y + 4 + PosOffset + YOffset, sq_RGBA(150, 255, 30, 250), 0, 1);
}
//物理防御魔法防御
PosOffset += 18;
if (CheckPosInDrawBox(PosOffset)) {
L_sq_DrawImg(IconPath, 8, X + 4, Y + 3 + PosOffset + YOffset);
L_sq_DrawCode("物理防御", X + 20, Y + 4 + PosOffset + YOffset, sq_RGBA(255, 255, 255, 250), 0, 1);
local Str = MyInfo.PhysicalDefend.tostring();
L_sq_DrawCode(Str, X + 128 - LenheartTextClass.GetStringLength(Str), Y + 4 + PosOffset + YOffset, sq_RGBA(150, 255, 30, 250), 0, 1);
L_sq_DrawImg(IconPath, 9, X + 130, Y + 3 + PosOffset + YOffset);
L_sq_DrawCode("魔法防御", X + 148, Y + 4 + PosOffset + YOffset, sq_RGBA(255, 255, 255, 250), 0, 1);
local Str2 = MyInfo.MagicalDefend.tostring();
L_sq_DrawCode(Str2, X + 248 - LenheartTextClass.GetStringLength(Str2), Y + 4 + PosOffset + YOffset, sq_RGBA(150, 255, 30, 250), 0, 1);
}
//物理暴击 魔法暴击
PosOffset += 18;
if (CheckPosInDrawBox(PosOffset)) {
L_sq_DrawImg(IconPath, 10, X + 4, Y + 3 + PosOffset + YOffset);
L_sq_DrawCode("物理暴击", X + 20, Y + 4 + PosOffset + YOffset, sq_RGBA(255, 255, 255, 250), 0, 1);
local Str = format("%0.1f%%", MyInfo.PhysicalCrit);
L_sq_DrawCode(Str, X + 133 - LenheartTextClass.GetStringLength(Str), Y + 4 + PosOffset + YOffset, sq_RGBA(251, 251, 251, 250), 0, 1);
L_sq_DrawImg(IconPath, 11, X + 130, Y + 3 + PosOffset + YOffset);
L_sq_DrawCode("魔法暴击", X + 148, Y + 4 + PosOffset + YOffset, sq_RGBA(255, 255, 255, 250), 0, 1);
local Str2 = format("%0.1f%%", MyInfo.MagicalCrit);
L_sq_DrawCode(Str2, X + 253 - LenheartTextClass.GetStringLength(Str2), Y + 4 + PosOffset + YOffset, sq_RGBA(251, 251, 251, 250), 0, 1);
}
//攻击速度 释放速度
PosOffset += 18;
if (CheckPosInDrawBox(PosOffset)) {
L_sq_DrawImg(IconPath, 12, X + 4, Y + 3 + PosOffset + YOffset);
L_sq_DrawCode("攻击速度", X + 20, Y + 4 + PosOffset + YOffset, sq_RGBA(255, 255, 255, 250), 0, 1);
local Str = format("%0.1f%%", MyInfo.AttackSpeed);
L_sq_DrawCode(Str, X + 133 - LenheartTextClass.GetStringLength(Str), Y + 4 + PosOffset + YOffset, sq_RGBA(251, 251, 251, 250), 0, 1);
L_sq_DrawImg(IconPath, 13, X + 130, Y + 3 + PosOffset + YOffset);
L_sq_DrawCode("释放速度", X + 148, Y + 4 + PosOffset + YOffset, sq_RGBA(255, 255, 255, 250), 0, 1);
local Str2 = format("%0.1f%%", MyInfo.ReleaseSpeed);
L_sq_DrawCode(Str2, X + 253 - LenheartTextClass.GetStringLength(Str2), Y + 4 + PosOffset + YOffset, sq_RGBA(251, 251, 251, 250), 0, 1);
}
//移动速度 抗魔
PosOffset += 18;
if (CheckPosInDrawBox(PosOffset)) {
L_sq_DrawImg(IconPath, 14, X + 4, Y + 3 + PosOffset + YOffset);
L_sq_DrawCode("移动速度", X + 20, Y + 4 + PosOffset + YOffset, sq_RGBA(255, 255, 255, 250), 0, 1);
local Str = format("%0.1f%%", MyInfo.MoveSpeed);
L_sq_DrawCode(Str, X + 133 - LenheartTextClass.GetStringLength(Str), Y + 4 + PosOffset + YOffset, sq_RGBA(251, 251, 251, 250), 0, 1);
L_sq_DrawImg(IconPath, 15, X + 130, Y + 3 + PosOffset + YOffset);
L_sq_DrawCode("抗魔", X + 148, Y + 4 + PosOffset + YOffset, sq_RGBA(255, 255, 255, 250), 0, 1);
local Str2 = MyInfo.AntiMagic.tostring();
L_sq_DrawCode(Str2, X + 248 - LenheartTextClass.GetStringLength(Str2), Y + 4 + PosOffset + YOffset, sq_RGBA(251, 251, 251, 250), 0, 1);
}
//命中率 回避率
PosOffset += 18;
if (CheckPosInDrawBox(PosOffset)) {
L_sq_DrawImg(IconPath, 16, X + 4, Y + 3 + PosOffset + YOffset);
L_sq_DrawCode("命中率", X + 20, Y + 4 + PosOffset + YOffset, sq_RGBA(255, 255, 255, 250), 0, 1);
local Str = format("%0.1f%%", MyInfo.HitRate);
L_sq_DrawCode(Str, X + 133 - LenheartTextClass.GetStringLength(Str), Y + 4 + PosOffset + YOffset, sq_RGBA(251, 251, 251, 250), 0, 1);
L_sq_DrawImg(IconPath, 17, X + 130, Y + 3 + PosOffset + YOffset);
L_sq_DrawCode("回避率", X + 148, Y + 4 + PosOffset + YOffset, sq_RGBA(255, 255, 255, 250), 0, 1);
local Str2 = format("%0.1f%%", MyInfo.DodgeRate);
L_sq_DrawCode(Str2, X + 253 - LenheartTextClass.GetStringLength(Str2), Y + 4 + PosOffset + YOffset, sq_RGBA(251, 251, 251, 250), 0, 1);
}
//HP恢复量 MP恢复量
PosOffset += 18;
if (CheckPosInDrawBox(PosOffset)) {
L_sq_DrawImg(IconPath, 18, X + 4, Y + 3 + PosOffset + YOffset);
L_sq_DrawCode("HP恢复量", X + 20, Y + 4 + PosOffset + YOffset, sq_RGBA(255, 255, 255, 250), 0, 1);
local Str = MyInfo.HPRecovery.tostring();
L_sq_DrawCode(Str, X + 128 - LenheartTextClass.GetStringLength(Str), Y + 4 + PosOffset + YOffset, sq_RGBA(251, 251, 251, 250), 0, 1);
L_sq_DrawImg(IconPath, 19, X + 130, Y + 3 + PosOffset + YOffset);
L_sq_DrawCode("MP恢复量", X + 148, Y + 4 + PosOffset + YOffset, sq_RGBA(255, 255, 255, 250), 0, 1);
local Str2 = MyInfo.MPRecovery.tostring();
L_sq_DrawCode(Str2, X + 248 - LenheartTextClass.GetStringLength(Str2), Y + 4 + PosOffset + YOffset, sq_RGBA(251, 251, 251, 250), 0, 1);
}
//僵直度 硬直
PosOffset += 18;
if (CheckPosInDrawBox(PosOffset)) {
L_sq_DrawImg(IconPath, 20, X + 4, Y + 3 + PosOffset + YOffset);
L_sq_DrawCode("僵直度", X + 20, Y + 4 + PosOffset + YOffset, sq_RGBA(255, 255, 255, 250), 0, 1);
local Str = MyInfo.StunRate.tostring();
L_sq_DrawCode(Str, X + 128 - LenheartTextClass.GetStringLength(Str), Y + 4 + PosOffset + YOffset, sq_RGBA(251, 251, 251, 250), 0, 1);
L_sq_DrawImg(IconPath, 21, X + 130, Y + 3 + PosOffset + YOffset);
L_sq_DrawCode("硬直", X + 148, Y + 4 + PosOffset + YOffset, sq_RGBA(255, 255, 255, 250), 0, 1);
local Str2 = MyInfo.StunResist.tostring();
L_sq_DrawCode(Str2, X + 248 - LenheartTextClass.GetStringLength(Str2), Y + 4 + PosOffset + YOffset, sq_RGBA(251, 251, 251, 250), 0, 1);
}
//火属性强化 火属性抗性
PosOffset += 18;
if (CheckPosInDrawBox(PosOffset)) {
L_sq_DrawImg(IconPath, 22, X + 4, Y + 3 + PosOffset + YOffset);
L_sq_DrawCode("火属性强化", X + 20, Y + 4 + PosOffset + YOffset, sq_RGBA(255, 255, 255, 250), 0, 1);
local Str = MyInfo.FireStrength.tostring();
L_sq_DrawCode(Str, X + 128 - LenheartTextClass.GetStringLength(Str), Y + 4 + PosOffset + YOffset, sq_RGBA(251, 251, 251, 250), 0, 1);
L_sq_DrawImg(IconPath, 23, X + 130, Y + 3 + PosOffset + YOffset);
L_sq_DrawCode("火属性抗性", X + 148, Y + 4 + PosOffset + YOffset, sq_RGBA(255, 255, 255, 250), 0, 1);
local Str2 = MyInfo.FireResist.tostring();
L_sq_DrawCode(Str2, X + 248 - LenheartTextClass.GetStringLength(Str2), Y + 4 + PosOffset + YOffset, sq_RGBA(251, 251, 251, 250), 0, 1);
}
//冰属性强化 冰属性抗性
PosOffset += 18;
if (CheckPosInDrawBox(PosOffset)) {
L_sq_DrawImg(IconPath, 24, X + 4, Y + 3 + PosOffset + YOffset);
L_sq_DrawCode("冰属性强化", X + 20, Y + 4 + PosOffset + YOffset, sq_RGBA(255, 255, 255, 250), 0, 1);
local Str = MyInfo.IceStrength.tostring();
L_sq_DrawCode(Str, X + 128 - LenheartTextClass.GetStringLength(Str), Y + 4 + PosOffset + YOffset, sq_RGBA(251, 251, 251, 250), 0, 1);
L_sq_DrawImg(IconPath, 25, X + 130, Y + 3 + PosOffset + YOffset);
L_sq_DrawCode("冰属性抗性", X + 148, Y + 4 + PosOffset + YOffset, sq_RGBA(255, 255, 255, 250), 0, 1);
local Str2 = MyInfo.IceResist.tostring();
L_sq_DrawCode(Str2, X + 248 - LenheartTextClass.GetStringLength(Str2), Y + 4 + PosOffset + YOffset, sq_RGBA(251, 251, 251, 250), 0, 1);
}
//光属性强化 光属性抗性
PosOffset += 18;
if (CheckPosInDrawBox(PosOffset)) {
L_sq_DrawImg(IconPath, 26, X + 4, Y + 3 + PosOffset + YOffset);
L_sq_DrawCode("光属性强化", X + 20, Y + 4 + PosOffset + YOffset, sq_RGBA(255, 255, 255, 250), 0, 1);
local Str = MyInfo.LightStrength.tostring();
L_sq_DrawCode(Str, X + 128 - LenheartTextClass.GetStringLength(Str), Y + 4 + PosOffset + YOffset, sq_RGBA(251, 251, 251, 250), 0, 1);
L_sq_DrawImg(IconPath, 27, X + 130, Y + 3 + PosOffset + YOffset);
L_sq_DrawCode("光属性抗性", X + 148, Y + 4 + PosOffset + YOffset, sq_RGBA(255, 255, 255, 250), 0, 1);
local Str2 = MyInfo.LightResist.tostring();
L_sq_DrawCode(Str2, X + 248 - LenheartTextClass.GetStringLength(Str2), Y + 4 + PosOffset + YOffset, sq_RGBA(251, 251, 251, 250), 0, 1);
}
//暗属性强化 暗属性抗性
PosOffset += 18;
if (CheckPosInDrawBox(PosOffset)) {
L_sq_DrawImg(IconPath, 28, X + 4, Y + 3 + PosOffset + YOffset);
L_sq_DrawCode("暗属性强化", X + 20, Y + 4 + PosOffset + YOffset, sq_RGBA(255, 255, 255, 250), 0, 1);
local Str = MyInfo.DarkStrength.tostring();
L_sq_DrawCode(Str, X + 128 - LenheartTextClass.GetStringLength(Str), Y + 4 + PosOffset + YOffset, sq_RGBA(251, 251, 251, 250), 0, 1);
L_sq_DrawImg(IconPath, 29, X + 130, Y + 3 + PosOffset + YOffset);
L_sq_DrawCode("暗属性抗性", X + 148, Y + 4 + PosOffset + YOffset, sq_RGBA(255, 255, 255, 250), 0, 1);
local Str2 = MyInfo.DarkResist.tostring();
L_sq_DrawCode(Str2, X + 248 - LenheartTextClass.GetStringLength(Str2), Y + 4 + PosOffset + YOffset, sq_RGBA(251, 251, 251, 250), 0, 1);
}
//名望值 罪恶值
PosOffset += 18;
if (CheckPosInDrawBox(PosOffset)) {
L_sq_DrawImg(IconPath, 53, X + 4, Y + 3 + PosOffset + YOffset);
L_sq_DrawCode("名望值", X + 20, Y + 4 + PosOffset + YOffset, sq_RGBA(255, 255, 255, 250), 0, 1);
local Str = MyInfo.Fame.tostring();
L_sq_DrawCode(Str, X + 128 - LenheartTextClass.GetStringLength(Str), Y + 4 + PosOffset + YOffset, sq_RGBA(251, 251, 251, 250), 0, 1);
L_sq_DrawImg(IconPath, 45, X + 130, Y + 3 + PosOffset + YOffset);
L_sq_DrawCode("最终伤害", X + 148, Y + 4 + PosOffset + YOffset, sq_RGBA(255, 255, 255, 250), 0, 1);
local Str2 = MyInfo.FinalDamage.tostring();
L_sq_DrawCode(Str2, X + 248 - LenheartTextClass.GetStringLength(Str2), Y + 4 + PosOffset + YOffset, sq_RGBA(251, 251, 251, 250), 0, 1);
}
}
}
function Show(obj) {
}
function RealShow(obj) {
DrawMain(obj);
LenheartNewUI_Windows.Show(obj);
}
//override
//鼠标滚轮事件回调
function OnMouseWheel(Flag, MousePos_X, MousePos_Y) {
if (sq_IsIntersectRect(MousePos_X, MousePos_Y, 1, 1, X, Y, Width, Height)) {
if (Flag) {
if (YOffset< 0) YOffset += 18;
}
if (!Flag) {
if (YOffset > (-145)) YOffset -= 18;
}
}
//调用原生方法
LenheartNewUI_Windows.OnMouseWheel(Flag, MousePos_X, MousePos_Y);
}
GetMyInfoFlag = false;
//逻辑入口
function Proc(obj) {
Visible = false;
LenheartNewUI_Windows.SyncPos(X, Y);
local WindowX = sq_GetPopupWindowMainCotrol(74);
if (!WindowX) {
GetMyInfoFlag = false;
}
if (!WindowX) return;
if (!GetMyInfoFlag) {
GetMyInfoFlag = true;
local T = {
op = 20069013,
Info = Lenheart_Character_GetAttribute(null)
}
SendPackEx(T);
}
X = Base_X;
Y = Base_Y;
}
Base_X = 0;
Base_Y = 0;
function SyncState(Args) {
Base_X = Args[0] + 800;
Base_Y = Args[1] - 174;
local obj = sq_getMyCharacter();
RealShow(obj);
Visible = true;
}
}
DrawCodeCallBackFunc.Rindro_Character_Info <- function(Args) {
if (getroottable().rawin("Lenheart_Character_Info_Class_Obj")) {
local MyWindow = getroottable().rawget("Lenheart_Character_Info_Class_Obj");
MyWindow.SyncState(Args);
}
}
//个人信息窗口逻辑
function L_Character_Info_Window(WindowObject) {
return false;
// //返回Flase 原逻辑继续执行 返回Tue 原逻辑终止执行
// local Flag = false;
// if (getroottable().rawin("Lenheart_Character_Info_Class_Obj")) {
// local MyWindow = getroottable().rawget("Lenheart_Character_Info_Class_Obj");
// local Ret = MyWindow.SyncState(WindowObject);
// if (Ret) Flag = true;
// }
// return Flag;
}
getroottable().rawdelete("Lenheart_Character_Info_Class_Obj");
function Lenheart_Character_Info_Class_Fun(obj) {
local RootTab = getroottable();
if (!RootTab.rawin("Lenheart_Character_Info_Class_Obj")) {
RootTab.rawset("Lenheart_Character_Info_Class_Obj", LenheartNewUI_CreateWindow(Lenheart_Character_Info_ClassC, "个人信息属性面板窗口", 0, 0, 263, 146, 0));
}
}
getroottable()["LenheartFuncTab"].rawset("Lenheart_Character_Info_ClassFuncN", Lenheart_Character_Info_Class_Fun);
class Lenheart_Other_Character_Info_ClassC extends Lenheart_Character_Info_ClassC {
//调试模式
// DeBugMode = true;
//不是窗口
NoWindow = true;
//是否可见
Visible = false;
//图标路径
IconPath = "interface2/profile/profile_icon1.img";
//我的信息
MyInfo = null;
//滚轮偏移值
YOffset = 0;
function Other_GetCharacterInfoCallBack(Chunk) {
local Jso = Json.Decode(Chunk);
MyInfo = Jso.Attribute;
}
constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH) {
Childrens = [];
//注册控件
RegisterWidget();
LenheartNewUI_Windows.constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH);
Pack_Control.rawset(20069012, Other_GetCharacterInfoCallBack.bindenv(this));
}
function RegisterWidget() {
}
function Show(obj) {
}
function DrawMain(obj) {
DrawInfo(obj);
}
function RealShow(obj) {
DrawMain(obj);
LenheartNewUI_Windows.Show(obj);
}
//override
//鼠标滚轮事件回调
function OnMouseWheel(Flag, MousePos_X, MousePos_Y) {
if (Flag) {
if (YOffset< 0) YOffset += 18;
}
if (!Flag) {
if (YOffset > (-145)) YOffset -= 18;
}
//调用原生方法
LenheartNewUI_Windows.OnMouseWheel(Flag, MousePos_X, MousePos_Y);
}
//逻辑入口
function Proc(obj) {
Visible = false;
LenheartNewUI_Windows.SyncPos(X, Y);
local WindowX = sq_GetPopupWindowMainCotrol(74);
if (!WindowX || !OldWindowAddress) return;
X = L_sq_RA(OldWindowAddress + 0x14);
Y = L_sq_RA(OldWindowAddress + 0x18) + 154;
}
OldWindowAddress = null;
function SyncState(Address) {
OldWindowAddress = Address;
local obj = sq_getMyCharacter();
RealShow(obj);
Visible = true;
return true;
}
}
//他人信息窗口逻辑
function L_Other_Character_Info_Window(WindowObject) {
return false;
//返回Flase 原逻辑继续执行 返回Tue 原逻辑终止执行
local Flag = false;
if (getroottable().rawin("Lenheart_Other_Character_Info_Class_Obj")) {
local MyWindow = getroottable().rawget("Lenheart_Other_Character_Info_Class_Obj");
local Ret = MyWindow.SyncState(WindowObject);
if (Ret) Flag = true;
}
return Flag;
}
getroottable().rawdelete("Lenheart_Other_Character_Info_Class_Obj");
function Lenheart_Other_Character_Info_Class_Fun(obj) {
local RootTab = getroottable();
if (!RootTab.rawin("Lenheart_Other_Character_Info_Class_Obj")) {
RootTab.rawset("Lenheart_Other_Character_Info_Class_Obj", LenheartNewUI_CreateWindow(Lenheart_Other_Character_Info_ClassC, "他人信息属性面板窗口", 0, 0, 263, 146, 0));
}
}
getroottable()["LenheartFuncTab"].rawset("Lenheart_Other_Character_Info_ClassFuncN", Lenheart_Other_Character_Info_Class_Fun);

View File

@@ -1,57 +0,0 @@
/*
文件名:Lenheart_Cursor_Class.nut
路径:Base/UI/Lenheart_Cursor_Class.nut
创建日期:2024-09-25 19:23
文件用途:鼠标绘制逻辑
*/
class Rindro_Cursor {
//强制锁
ForceLockState = false;
//是否启用
UseState = 0;
TypeState = 0;
SubState = 0;
constructor() {
}
function Proc(Xpos, Ypos) {
//使用自建的鼠标绘制函数
if (UseState) {
//工作类型为0
if (TypeState == 0) {
//常规状态
if (SubState == 0) {
L_sq_DrawImg("interface/newstyle/windows/cursor.img", 0, Xpos, Ypos);
}
//按下状态
else if (SubState == 1) {
L_sq_DrawImg("interface/newstyle/windows/cursor.img", 1, Xpos, Ypos);
}
} else {
L_sq_DrawImg("interface/newstyle/windows/cursor.img", TypeState, Xpos, Ypos);
}
}
}
function Sync(Xpos, Ypos) {
Proc(Xpos, Ypos);
return UseState;
}
}
_Rindro_Cusor_ <- Rindro_Cursor();
function SyncRindro_Cursor(Xpos, Ypos) {
if (getroottable().rawin("_Rindro_Cusor_")) {
local Ret = _Rindro_Cusor_.Sync(Xpos, Ypos);
return Ret;
}
return false;
}

View File

@@ -1,418 +0,0 @@
/*
文件名:Lenheart_Each_Class.nut
路径:Base/UI/Lenheart_Each_Class.nut
创建日期:2024-09-30 14:46
文件用途:交互界面类
*/
class LenheartNewUI_Each_BaseButton extends LenheartNewUI_CommonUi {
State = 0;
BaseIdx = 29;
DWidth = null;
Path = null;
Idx = null;
SetFlag = null;
SetIndex = null;
Icon = null;
IconIdx = null;
Str = null;
StrColor = sq_RGBA(189, 159, 126, 250);
constructor(X, Y, W, H, Path, Idx) {
this.DWidth = W;
this.Path = Path;
this.Idx = Idx;
LenheartNewUI_CommonUi.constructor(X, Y, W, H);
}
function SetFrame(gPath, gIdx) {
if (gPath) Path = gPath;
Idx = gIdx;
}
function Show(obj) {
//不可用
if (State == 8) {
// L_sq_DrawImg(Path, Idx + 3, X, Y);
} else {
//按下
if (isLBDown) {
L_sq_DrawImg(Path, Idx + 1, X, Y);
if (Icon) L_sq_DrawImg(Icon, IconIdx, X + 3, Y + 2);
if (Str) L_sq_DrawCode(Str, X + 60 - LenheartTextClass.GetStringLength(Str) / 2, Y + 5, StrColor, 0, 1);
}
//悬停
else if (isInRect) {
L_sq_DrawImg(Path, Idx, X, Y);
if (Icon) L_sq_DrawImg(Icon, IconIdx, X + 3, Y + 1);
if (Str) L_sq_DrawCode(Str, X + 60 - LenheartTextClass.GetStringLength(Str) / 2, Y + 4, StrColor, 0, 1);
}
//普通
else {
L_sq_DrawImg(Path, 0, X, Y);
if (Icon) L_sq_DrawImg(Icon, IconIdx, X + 3, Y + 1);
if (Str) L_sq_DrawCode(Str, X + 60 - LenheartTextClass.GetStringLength(Str) / 2, Y + 4, StrColor, 0, 1);
}
}
}
//鼠标左键弹起回调
function OnMouseLbUp(MousePos_X, MousePos_Y) {
if (isLBDown && OnClick) {
OnClick(this);
}
isLBDown = false;
}
}
class Lenheart_EachC extends LenheartNewUI_Windows {
//调试模式
// DeBugMode = true;
//不是窗口
NoWindow = true;
//是否可见
// Visible = false;
Info = null;
NPC_Index = null;
NPC_Flag = false;
NPC_ButtonMap = null;
constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH) {
Childrens = [];
NPC_ButtonMap = {};
//注册控件
RegisterWidget();
LenheartNewUI_Windows.constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH);
}
function RegisterWidget() {
}
function Show(obj) {
}
function TopShow(obj) {
if (NPC_Index) {
SyncPos();
LenheartNewUI_Windows.Show(obj);
}
}
function DrawMain(obj) {
// if (Info) {
// local NPC_Index = Rindro_BaseToolClass.GetEachNpcId();
// }
}
// function BottomShow() {}
//初始化NPC按钮
function InitNpcButton() {
Childrens = [];
if (NPC_ButtonMap.rawin(NPC_Index)) {
foreach(Func in NPC_ButtonMap[NPC_Index]) {
Func(this);
}
}
this.Visible = true;
}
function AddEachForNpc(Index, Func) {
if (NPC_ButtonMap.rawin(Index)) {
NPC_ButtonMap[Index].append(Func);
return;
}
NPC_ButtonMap.rawset(Index, [Func]);
}
function RemoveEachForNpc(Index) {
NPC_ButtonMap.rawdelete(Index);
}
//逻辑入口
function Proc(obj) {
LenheartNewUI_Windows.SyncPos(X, Y);
NPC_Index = Rindro_BaseToolClass.GetEachNpcId();
if (NPC_Index) {
if (!NPC_Flag) {
NPC_Flag = true;
InitNpcButton();
}
} else {
NPC_Flag = false;
}
}
function CloseAllEach() {
local EachClassObject = L_sq_RA(0x1ADE0E0);
if (EachClassObject) {
local FristChildOffset = (EachClassObject + 0x68);
for (local i = 0; i< 74; i++) {
local AddressBuf = FristChildOffset + (4 * i);
local ChildAddress = L_sq_RA(AddressBuf);
if (ChildAddress) {
local OpenFlag = L_sq_RA(ChildAddress + 0xC);
if (OpenFlag = 257) L_sq_WA(ChildAddress + 0xC, 256);
}
}
}
}
function Lenheart_Get_Each_Info() {
local EachCount = 0;
local Xpos = 0;
local Ypos = 0;
local EachClassObject = L_sq_RA(0x1ADE0E0);
if (EachClassObject) {
local FristChildOffset = (EachClassObject + 0x68);
for (local i = 0; i< 74; i++) {
local AddressBuf = FristChildOffset + (4 * i);
local ChildAddress = L_sq_RA(AddressBuf);
if (ChildAddress) {
local OpenFlag = L_sq_RA(ChildAddress + 0xC);
if (OpenFlag == 257) EachCount++;
}
//第0个的时候记录一下坐标
if (i == 0) {
Xpos = L_sq_RA(ChildAddress + 0x14);
Ypos = L_sq_RA(ChildAddress + 0x18);
}
}
}
return {
Count = EachCount,
X = Xpos,
Y = Ypos
};
}
//override
//鼠标左键弹起回调
function OnMouseLbUp(MousePos_X, MousePos_Y) {
//调用原生方法
LenheartNewUI_Windows.OnMouseLbUp(MousePos_X, MousePos_Y);
}
function SyncPos() {
//读取交互坐标数据
Info = Lenheart_Get_Each_Info();
X = Info.X;
Y = Info.Y + (21 * Info.Count);
//宽度
Width = 100;
//高度
Height = (21 * Childrens.len());
//同步子对象坐标
foreach(pos, winobj in Childrens) {
winobj.X = Info.X;
winobj.Y = Info.Y + (21 * (Info.Count + pos));
}
}
}
function Lenheart_Each_Fun(obj) {
local RootTab = getroottable();
if (!RootTab.rawin("L_Each_Obj")) {
RootTab.rawset("L_Each_Obj", LenheartNewUI_CreateWindow(Lenheart_EachC, "玩家与NPC交互界面窗口", 0, 0, 0, 0, 0));
}
}
getroottable()["LenheartFuncTab"].rawset("Lenheart_EachN", Lenheart_Each_Fun);
class Lenheart_PlayerEachC extends LenheartNewUI_Windows {
//调试模式
// DeBugMode = true;
//不是窗口
NoWindow = true;
//是否可见
// Visible = false;
Info = null;
Basic = null;
//当前交互角色姓名
PlayerEach_Name = null;
PlayerEach_Flag = false;
PlayerEach_ButtonMap = null;
//通用按钮
PlayerEach_CommonButtonMap = null;
constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH) {
Childrens = [];
PlayerEach_ButtonMap = {};
PlayerEach_CommonButtonMap = {};
//注册控件
RegisterWidget();
LenheartNewUI_Windows.constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH);
}
function RegisterWidget() {}
function Show(obj) {}
function TopShow(obj) {}
function DrawMain(obj) {}
function MySelfShow() {
if (PlayerEach_Name) {
local obj = sq_getMyCharacter();
LenheartNewUI_Windows.Show(obj);
}
}
//初始化NPC按钮
function InitNpcButton() {
Childrens = [];
if (PlayerEach_ButtonMap.rawin(PlayerEach_Name)) {
foreach(Func in PlayerEach_ButtonMap[PlayerEach_Name]) {
Func(this);
}
}
foreach(Func in PlayerEach_CommonButtonMap) {
Func(this);
}
this.Visible = true;
}
function AddEachForCommon(Index, Func) {
PlayerEach_CommonButtonMap.rawset(Index, Func);
}
function RemoveEachForCommon(Index) {
PlayerEach_CommonButtonMap.rawdelete(Index);
}
function AddEachForPlayerName(Index, Func) {
if (PlayerEach_ButtonMap.rawin(Index)) {
PlayerEach_ButtonMap[Index].append(Func);
return;
}
PlayerEach_ButtonMap.rawset(Index, [Func]);
}
function RemoveEachForPlayerName(Index) {
PlayerEach_ButtonMap.rawdelete(Index);
}
function CloseAllEach() {
if (Basic) {
L_sq_WA(L_sq_P2I(Basic) + 0xC, 256);
}
}
//逻辑入口
function Proc(obj) {
LenheartNewUI_Windows.SyncPos(X, Y);
local Str = L_Sq_GetPlayerEachName();
if (Str.len() > 0) {
PlayerEach_Name = Str;
}
if (PlayerEach_Name) {
if (!PlayerEach_Flag) {
PlayerEach_Flag = true;
InitNpcButton();
}
} else {
PlayerEach_Flag = false;
}
}
//override
//鼠标左键弹起回调
function OnMouseLbUp(MousePos_X, MousePos_Y) {
LenheartNewUI_Windows.OnMouseLbUp(MousePos_X, MousePos_Y);
}
function SelfSyncPos(gInfo) {
//读取交互坐标数据
Info = gInfo;
Basic = gInfo.BasicAdd;
X = Info.X;
Y = Info.Y + (21 * Info.Count);
//宽度
Width = 100;
//高度
Height = (21 * Childrens.len());
//同步子对象坐标
foreach(pos, winobj in Childrens) {
winobj.X = Info.X;
winobj.Y = Info.Y + (21 * (Info.Count + pos));
}
}
}
RindroPlayerEachDrawFlag <- false;
RindroPlayerEachDrawCountBuffer <- 0;
RindroPlayerEachDrawCount <- 0;
Rindro_Haker.LoadHook(0x10002A0, ["pointer", "int", "int"],
function(args) {
if (L_Sq_GetPlayerEachName().len() <= 0) return;
local Xpos = L_sq_RA(L_sq_P2I(args[0]) + 0x14);
local Ypos = L_sq_RA(L_sq_P2I(args[0]) + 0x18);
if (!RindroPlayerEachDrawFlag) {
local RootTab = getroottable();
RindroPlayerEachDrawFlag = true;
if (RootTab.rawin("L_PlayerEach_Obj")) {
RootTab["L_PlayerEach_Obj"].SelfSyncPos({
X = Xpos,
Y = Ypos,
Count = RindroPlayerEachDrawCount,
BasicAdd = args[0]
});
RootTab["L_PlayerEach_Obj"].MySelfShow();
}
}
RindroPlayerEachDrawCountBuffer++;
// print(args[0]);
return null;
},
function(args) {
return null;
});
function Lenheart_PlayerEach_Fun(obj) {
local RootTab = getroottable();
RindroPlayerEachDrawFlag = false;
RindroPlayerEachDrawCount = RindroPlayerEachDrawCountBuffer;
RindroPlayerEachDrawCountBuffer = 0;
if (!RootTab.rawin("L_PlayerEach_Obj")) {
RootTab.rawset("L_PlayerEach_Obj", LenheartNewUI_CreateWindow(Lenheart_PlayerEachC, "玩家与玩家交互界面窗口", 0, 0, 0, 0, 0));
}
}
getroottable()["LenheartFuncTab"].rawset("Lenheart_PlayerEachN", Lenheart_PlayerEach_Fun);

View File

@@ -1,374 +0,0 @@
/*
文件名:Lenheart_Event_Class.nut
路径:Base/UI/Lenheart_Event_Class.nut
创建日期:2024-08-11 09:47
文件用途:活动图标
*/
class LenheartNewUI_EventButton extends LenheartNewUI_CommonUi {
State = 0;
BaseIdx = 29;
DWidth = null;
Path = null;
Idx = null;
BindObj = null;
Timer = 0;
EffFlag = true;
ShowName = null;
constructor(X, Y, Path, Idx) {
this.DWidth = 20;
this.Path = Path;
this.Idx = Idx;
LenheartNewUI_CommonUi.constructor(X, Y, 20, 20);
Timer = Clock();
}
function SetFrame(gPath, gIdx) {
if (gPath) Path = gPath;
Idx = gIdx;
}
function Show(obj) {
T_DrawDynamicAni(obj, "common/yosinevent/eventsystemeff.ani", X, Y, "EventIcon" + ObjectId);
//不可用
if (State == 8) {
L_sq_DrawImg(Path, Idx + 3, X, Y + 1);
} else {
//按下
if (isLBDown) {
L_sq_DrawImg(Path, Idx + 1, X, Y);
}
//悬停
else if (isInRect) {
L_sq_DrawImg(Path, Idx, X, Y);
}
//普通
else {
L_sq_DrawImg(Path, Idx, X, Y);
}
}
}
//鼠标左键按下回调
function OnMouseLbDown(MousePos_X, MousePos_Y) {
if (sq_IsIntersectRect(MousePos_X, MousePos_Y, 1, 1, X, Y, Width, Height)) isLBDown = true;
}
//鼠标左键弹起回调 overr
function OnMouseLbUp(MousePos_X, MousePos_Y) {
if (isLBDown && OnClick) {
local obj = sq_getMyCharacter();
obj.sq_PlaySound("CLICK_BUTTON1");
OnClick(this);
}
isLBDown = false;
}
}
class Rindro_Event extends LenheartNewUI_Windows {
//调试模式
// DeBugMode = true;
EventFlag = true;
//不是窗口
NoWindow = true;
//显示标志位
PosIdx = null;
//闪烁透明度
Alpha = 250;
//闪烁模式
BlinkMode = false;
//时间
Timer = 0;
//是否可见
Visible = true;
//主要Button
MainButton = null;
constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH) {
Childrens = [];
LenheartNewUI_Windows.constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH);
Timer = Clock();
}
//绘制主界面
function DrawMain(obj) {
local RT = Clock() - Timer;
//根据模式调整透明度
if (!BlinkMode) Alpha = sq_GetUniformVelocity(250, 130, RT, 500);
else Alpha = sq_GetUniformVelocity(130, 250, RT, 500);
//转换模式
if (RT >= 500) {
Timer = Clock();
BlinkMode = !BlinkMode;
}
L_sq_SetDrawImgModel(2, 0);
L_sq_DrawImg("interface2/yosin/eventsystemeff.img", 0, X, Y, 1, sq_RGBA(255, 255, 255, Alpha), 1.0, 1.0);
L_sq_ReleaseDrawImgModel();
}
function Show(obj) {
// DrawMain(obj);
// LenheartNewUI_Windows.Show(obj);
}
function EventShow(obj) {
DrawMain(obj);
LenheartNewUI_Windows.Show(obj);
}
function TopShow(obj) {
if (sq_IsIntersectRect(IMouse.GetXPos(), IMouse.GetYPos(), 1, 1, X, Y, 20, 20)) {
local XposOffset = 0;
local Len = LenheartTextClass.GetStringLength(MainButton.ShowName);
local Count = ((Len - 10) / 15) + 1;
XposOffset = (-(10 + Count * 15) / 2) + 10;
L_sq_DrawImg("interface2/yosin/eventsystem.img", 0, X + XposOffset, Y - 24);
for (local i = 0; i< Count; i++) {
L_sq_DrawImg("interface2/yosin/eventsystem.img", 1, X + XposOffset + 5 + (15 * i), Y - 24);
}
L_sq_DrawImg("interface2/yosin/eventsystem.img", 2, X + XposOffset + 5 + (15 * Count), Y - 24);
L_sq_DrawCode(MainButton.ShowName, X - Len / 2 + 12, Y - 17, sq_RGBA(255, 255, 255, 250), 0, 1);
}
}
function SyncEventIcon() {
local Count = L_sq_RA(L_sq_RA(0x1A39C2C) + 0x6c);
X = EventList_Obj.X + (((Count + PosIdx) % 8) * 20);
Y = EventList_Obj.Y - ((Count + PosIdx) / 8) * 20;
}
//逻辑入口
function Proc(obj) {
//同步图标位置
SyncEventIcon();
LenheartNewUI_Windows.SyncPos(X, Y);
}
}
class Rindro_EventList {
X = 0;
Y = 0;
//活动数组
Events = null;
EventsMap = null;
function YosinEventIconInfoCallBack(Chunk) {
local Jso = Json.Decode(Chunk);
X = Jso.YosinEventIconInfoXpos;
Y = Jso.YosinEventIconInfoYpos;
getroottable()["LenheartEventOffset"] <- {
x = X - 456,
y = Y
};
L_sq_RefreshEventIcon();
}
constructor() {
Events = [];
EventsMap = {};
Pack_Control.rawset(30002, YosinEventIconInfoCallBack.bindenv(this));
}
//添加活动
function AddEvent(Name, Idx, WindowObject, ...) {
if (EventsMap.rawin(Name)) return EventsMap.rawget(Name);
local Window = LenheartNewUI_CreateWindow(Rindro_Event, Name, 0, 0, 20, 20, 0)
local Flag = Events.len();
local ImgPath = "interface2/yosin/eventsystemlist.img";
if (vargc == 1) ImgPath = vargv[0];
local ButtonBuf = LenheartNewUI_EventButton(0, 0, ImgPath, Idx);
ButtonBuf.BindObj = WindowObject;
ButtonBuf.ShowName = Name;
ButtonBuf.OnClick = function(B_obj) {
if (B_obj.BindObj) B_obj.BindObj.OpenCallBack();
}.bindenv(this);
Window.AddChild(ButtonBuf);
Window.PosIdx = Events.len();
Window.MainButton = ButtonBuf;
Events.append(Window);
EventsMap.rawset(Name, Window);
return Window;
}
//检测是否悬停活动图标
function CheckInEvent(MousePos_X, MousePos_Y) {
if (sq_GetPopupWindowMainCotrol(244)) return;
foreach(Window in Events) {
if (sq_IsIntersectRect(MousePos_X, MousePos_Y, 1, 1, Window.X, Window.Y, Window.Width, Window.Height)) {
getroottable().WindowsShowABFlag <- true;
}
}
}
}
getroottable().rawdelete("EventList_Obj")
function Lenheart_EventList_Fun(obj) {
local RootTab = getroottable();
if (!RootTab.rawin("EventList_Obj")) {
RootTab.rawset("EventList_Obj", Rindro_EventList());
}
}
//获取活动图标坐标 在活动图标变动时会被调用
function Sq_Get_Event_Pos_X() {
if (getroottable().rawin("LenheartEventOffset")) {
return getroottable()["LenheartEventOffset"].x;
} else {
getroottable()["LenheartEventOffset"] <- {
x = 277,
y = 530
};
return getroottable()["LenheartEventOffset"].x;
}
}
function Sq_Get_Event_Pos_Y() {
if (getroottable().rawin("LenheartEventOffset")) {
return getroottable()["LenheartEventOffset"].y;
} else {
getroottable()["LenheartEventOffset"] <- {
x = 277,
y = 530
};
return getroottable()["LenheartEventOffset"].y;
}
}
/*
//活动图标类
class Rindro_EventIcon extends LenheartNewUI_CommonUi {
//Key
Key = null;
//活动图标文字
EventStr = null;
//活动图标Ani编号
EventFrame = null;
//绑定对象
BandObject = null;
//图标img路径
ImgPath = "interface2/yosin/eventsystemlist.img";
x = null;
y = null;
constructor(gEventStr, gEventFrame, gKey, gBandObject) {
this.EventStr = gEventStr;
this.EventFrame = gEventFrame;
this.Key = gKey;
this.BandObject = gBandObject;
local RootTab = getroottable();
if (RootTab.rawin("YosinEventSystem")) {
local Arr = RootTab["YosinEventSystem"];
local TryAppend = true;
local wpos;
foreach(pos, value in Arr) {
if (value.Key == this.Key) {
TryAppend = false;
wpos = pos;
}
}
if (TryAppend) {
Arr.append(this);
RootTab.rawset("YosinEventSystem", Arr);
} else {
Arr[wpos] = this;
RootTab.rawset("YosinEventSystem", Arr);
}
} else {
local Arr = [];
Arr.append(this);
RootTab.rawset("YosinEventSystem", Arr);
}
}
function Show(obj, X, Y) {
x = X;
y = Y;
//绘制框
T_DrawDynamicAni(obj, "common/yosinevent/eventsystemeff.ani", X, Y, "YosinEventIconEffA");
try {
if (isLBDown()) {
//绘制活动图标
L_sq_DrawImg(ImgPath, EventFrame, X, Y + 1);
//T_DrawStayAni(obj, "common/yosinevent/eventsystemlist.ani", X, Y + 1, EventFrame, "YosinEventIconKey" + Key);
} else {
//绘制活动图标
L_sq_DrawImg(ImgPath, EventFrame, X, Y);
}
} catch (exception) {
if (isLBDown()) {
//绘制活动图标
T_DrawStayAni(obj, "common/yosinevent/eventsystemlist.ani", X, Y + 1, EventFrame, "YosinEventIconKey" + Key);
} else {
//绘制活动图标
T_DrawStayAni(obj, "common/yosinevent/eventsystemlist.ani", X, Y, EventFrame, "YosinEventIconKey" + Key);
}
}
}
function StrShow(obj, X, Y) {
//悬停
if (isInRect() && EventStr) {
local count = EventStr.len() / 3;
T_DrawStayAni(obj, "common/yosinevent/eventsystem.ani", X - (count * 7), Y - 24, 0, "YosinEventIconStrEffL");
for (local i = 0; i< count; i++) {
T_DrawStayAni(obj, "common/yosinevent/eventsystem.ani", X - (count * 7) + 5 + (i * 15), Y - 24, 1, "YosinEventIconStrEffZ");
}
T_DrawStayAni(obj, "common/yosinevent/eventsystem.ani", X - (count * 7) + 5 + (count * 15), Y - 24, 2, "YosinEventIconStrEffR");
L_sq_DrawCode(EventStr, X - (count * 4), Y - 17, sq_RGBA(255, 255, 255, 250), 0, 1);
}
if (isLBActive()) {
BandObject.MainState = true;
BandObject.OpenClassCallBack();
}
}
//悬停状态
function isInRect() {
if (sq_IsIntersectRect(IMouse.GetXPos(), IMouse.GetYPos(), 1, 1, x, y, 20, 20)) return true;
else return false;
}
//左键按下状态
function isLBDown() {
if (isInRect() && Mobj.Lb == 1) return true;
else return false;
}
//左键弹起状态
function isLBUp() {
if (isInRect() && Mobj.Lb == 0) return true;
else return false;
}
//左键单击状态
function isLBActive() {
if (isInRect() && Mobj.LbEvent) return true;
else return false;
}
}
*/

File diff suppressed because it is too large Load Diff

View File

@@ -1,52 +0,0 @@
/*
文件名:OldWindowsMap.nut
路径:Base/UI/OldWindowsMap.nut
创建日期:2024-08-06 18:56
文件用途:用于查询是否鼠标悬停在原生窗口上的Flag 以下编号代表着没有悬停其他均为悬停在原生窗口
*/
NotOldWindowsMap <- {}
NotOldWindowsMap.rawset(92, 1);
NotOldWindowsMap.rawset(79, 1);
NotOldWindowsMap.rawset(2395, 1);
NotOldWindowsMap.rawset(2396, 1);
NotOldWindowsMap.rawset(3877, 1);
NotOldWindowsMap.rawset(3878, 1);
NotOldWindowsMap.rawset(3873, 1);
NotOldWindowsMap.rawset(3874, 1);
NotOldWindowsMap.rawset(3858, 1);
NotOldWindowsMap.rawset(3871, 1);
NotOldWindowsMap.rawset(3857, 1);
NotOldWindowsMap.rawset(3861, 1);
NotOldWindowsMap.rawset(3862, 1);
NotOldWindowsMap.rawset(93, 1);
NotOldWindowsMap.rawset(94, 1);
NotOldWindowsMap.rawset(95, 1);
NotOldWindowsMap.rawset(96, 1);
NotOldWindowsMap.rawset(97, 1);
NotOldWindowsMap.rawset(98, 1);
NotOldWindowsMap.rawset(99, 1);
NotOldWindowsMap.rawset(100, 1);
NotOldWindowsMap.rawset(101, 1);
NotOldWindowsMap.rawset(114, 1);
NotOldWindowsMap.rawset(88, 1);
NotOldWindowsMap.rawset(102, 1);
NotOldWindowsMap.rawset(108, 1);
NotOldWindowsMap.rawset(109, 1);
NotOldWindowsMap.rawset(103, 1);
NotOldWindowsMap.rawset(104, 1);
NotOldWindowsMap.rawset(110, 1);
NotOldWindowsMap.rawset(111, 1);
NotOldWindowsMap.rawset(105, 1);
NotOldWindowsMap.rawset(106, 1);
NotOldWindowsMap.rawset(112, 1);
NotOldWindowsMap.rawset(113, 1);
NotOldWindowsMap.rawset(107, 1);
NotOldWindowsMap.rawset(87, 1);
NotOldWindowsMap.rawset(86, 1);
NotOldWindowsMap.rawset(80, 1);
NotOldWindowsMap.rawset(81, 1);
NotOldWindowsMap.rawset(82, 1);
NotOldWindowsMap.rawset(83, 1);
NotOldWindowsMap.rawset(4067, 1);
NotOldWindowsMap.rawset(122, 1);
NotOldWindowsMap.rawset(120, 1);

View File

@@ -1,426 +0,0 @@
/*
文件名:_ENUM_KEY.nut
路径:Base/_ENUM/_ENUM_KEY.nut
创建日期:2024-08-06 22:09
文件用途:按键枚举类
*/
DIK_ESCAPE <- 0x01
DIK_1 <- 0x02
DIK_2 <- 0x03
DIK_3 <- 0x04
DIK_4 <- 0x05
DIK_5 <- 0x06
DIK_6 <- 0x07
DIK_7 <- 0x08
DIK_8 <- 0x09
DIK_9 <- 0x0A
DIK_0 <- 0x0B
DIK_MINUS <- 0x0C /* - on main keyboard */
DIK_EQUALS <- 0x0D
DIK_BACK <- 0x0E /* backspace */
DIK_TAB <- 0x0F
DIK_Q <- 0x10
DIK_W <- 0x11
DIK_E <- 0x12
DIK_R <- 0x13
DIK_T <- 0x14
DIK_Y <- 0x15
DIK_U <- 0x16
DIK_I <- 0x17
DIK_O <- 0x18
DIK_P <- 0x19
DIK_LBRACKET <- 0x1A
DIK_RBRACKET <- 0x1B
DIK_RETURN <- 0x1C /* Enter on main keyboard */
DIK_LCONTROL <- 0x1D
DIK_A <- 0x1E
DIK_S <- 0x1F
DIK_D <- 0x20
DIK_F <- 0x21
DIK_G <- 0x22
DIK_H <- 0x23
DIK_J <- 0x24
DIK_K <- 0x25
DIK_L <- 0x26
DIK_SEMICOLON <- 0x27
DIK_APOSTROPHE <- 0x28
DIK_GRAVE <- 0x29 /* accent grave */
DIK_LSHIFT <- 0x2A
DIK_BACKSLASH <- 0x2B
DIK_Z <- 0x2C
DIK_X <- 0x2D
DIK_C <- 0x2E
DIK_V <- 0x2F
DIK_B <- 0x30
DIK_N <- 0x31
DIK_M <- 0x32
DIK_COMMA <- 0x33
DIK_PERIOD <- 0x34 /* . on main keyboard */
DIK_SLASH <- 0x35 /* / on main keyboard */
DIK_RSHIFT <- 0x36
DIK_MULTIPLY <- 0x37 /* * on numeric keypad */
DIK_LMENU <- 0x38 /* left Alt */
DIK_SPACE <- 0x39
DIK_CAPITAL <- 0x3A
DIK_F1 <- 0x3B
DIK_F2 <- 0x3C
DIK_F3 <- 0x3D
DIK_F4 <- 0x3E
DIK_F5 <- 0x3F
DIK_F6 <- 0x40
DIK_F7 <- 0x41
DIK_F8 <- 0x42
DIK_F9 <- 0x43
DIK_F10 <- 0x44
DIK_NUMLOCK <- 0x45
DIK_SCROLL <- 0x46 /* Scroll Lock */
DIK_NUMPAD7 <- 0x47
DIK_NUMPAD8 <- 0x48
DIK_NUMPAD9 <- 0x49
DIK_SUBTRACT <- 0x4A /* - on numeric keypad */
DIK_NUMPAD4 <- 0x4B
DIK_NUMPAD5 <- 0x4C
DIK_NUMPAD6 <- 0x4D
DIK_ADD <- 0x4E /* + on numeric keypad */
DIK_NUMPAD1 <- 0x4F
DIK_NUMPAD2 <- 0x50
DIK_NUMPAD3 <- 0x51
DIK_NUMPAD0 <- 0x52
DIK_DECIMAL <- 0x53 /* . on numeric keypad */
DIK_OEM_102 <- 0x56 /* <> or \| on RT 102-key keyboard (Non-U.S.) */
DIK_F11 <- 0x57
DIK_F12 <- 0x58
DIK_F13 <- 0x64 /* (NEC PC98) */
DIK_F14 <- 0x65 /* (NEC PC98) */
DIK_F15 <- 0x66 /* (NEC PC98) */
DIK_KANA <- 0x70 /* (Japanese keyboard) */
DIK_ABNT_C1 <- 0x73 /* /? on Brazilian keyboard */
DIK_CONVERT <- 0x79 /* (Japanese keyboard) */
DIK_NOCONVERT <- 0x7B /* (Japanese keyboard) */
DIK_YEN <- 0x7D /* (Japanese keyboard) */
DIK_ABNT_C2 <- 0x7E /* Numpad . on Brazilian keyboard */
DIK_NUMPADEQUALS <- 0x8D /* = on numeric keypad (NEC PC98) */
DIK_PREVTRACK <- 0x90 /* Previous Track (DIK_CIRCUMFLEX on Japanese keyboard) */
DIK_AT <- 0x91 /* (NEC PC98) */
DIK_COLON <- 0x92 /* (NEC PC98) */
DIK_UNDERLINE <- 0x93 /* (NEC PC98) */
DIK_KANJI <- 0x94 /* (Japanese keyboard) */
DIK_STOP <- 0x95 /* (NEC PC98) */
DIK_AX <- 0x96 /* (Japan AX) */
DIK_UNLABELED <- 0x97 /* (J3100) */
DIK_NEXTTRACK <- 0x99 /* Next Track */
DIK_NUMPADENTER <- 0x9C /* Enter on numeric keypad */
DIK_RCONTROL <- 0x9D
DIK_MUTE <- 0xA0 /* Mute */
DIK_CALCULATOR <- 0xA1 /* Calculator */
DIK_PLAYPAUSE <- 0xA2 /* Play / Pause */
DIK_MEDIASTOP <- 0xA4 /* Media Stop */
DIK_VOLUMEDOWN <- 0xAE /* Volume - */
DIK_VOLUMEUP <- 0xB0 /* Volume + */
DIK_WEBHOME <- 0xB2 /* Web home */
DIK_NUMPADCOMMA <- 0xB3 /* , on numeric keypad (NEC PC98) */
DIK_DIVIDE <- 0xB5 /* / on numeric keypad */
DIK_SYSRQ <- 0xB7
DIK_RMENU <- 0xB8 /* right Alt */
DIK_PAUSE <- 0xC5 /* Pause */
DIK_HOME <- 0xC7 /* Home on arrow keypad */
DIK_UP <- 0xC8 /* UpArrow on arrow keypad */
DIK_PRIOR <- 0xC9 /* PgUp on arrow keypad */
DIK_LEFT <- 0xCB /* LeftArrow on arrow keypad */
DIK_RIGHT <- 0xCD /* RightArrow on arrow keypad */
DIK_END <- 0xCF /* End on arrow keypad */
DIK_DOWN <- 0xD0 /* DownArrow on arrow keypad */
DIK_NEXT <- 0xD1 /* PgDn on arrow keypad */
DIK_INSERT <- 0xD2 /* Insert on arrow keypad */
DIK_DELETE <- 0xD3 /* Delete on arrow keypad */
DIK_LWIN <- 0xDB /* Left Windows key */
DIK_RWIN <- 0xDC /* Right Windows key */
DIK_APPS <- 0xDD /* AppMenu key */
DIK_POWER <- 0xDE /* System Power */
DIK_SLEEP <- 0xDF /* System Sleep */
DIK_WAKE <- 0xE3 /* System Wake */
DIK_WEBSEARCH <- 0xE5 /* Web Search */
DIK_WEBFAVORITES <- 0xE6 /* Web Favorites */
DIK_WEBREFRESH <- 0xE7 /* Web Refresh */
DIK_WEBSTOP <- 0xE8 /* Web Stop */
DIK_WEBFORWARD <- 0xE9 /* Web Forward */
DIK_WEBBACK <- 0xEA /* Web Back */
DIK_MYCOMPUTER <- 0xEB /* My Computer */
DIK_MAIL <- 0xEC /* Mail */
DIK_MEDIASELECT <- 0xED /* Media Select */
FFI_FIRST_ABI <- 0;
FFI_SYSV <- 1;
FFI_STDCALL <- 2;
FFI_THISCALL <- 3;
FFI_FASTCALL <- 4;
FFI_MS_CDECL <- 5;
FFI_PASCAL <- 6;
FFI_REGISTER <- 7;
function Sq_L_Medal(x, y) {}
function Sq_SettingWindowCallBack(x, y) {}
function Sq_BuffSwitchingCallBack(x, y) {}
function Sq_SwitchingCallBack(x, y) {}
function Sq_UpgradeCallBack(x, y) {}
function Sq_RecoveryCallBack(x, y) {}
function Sq_RecoveryTypeSetCallBack(Type) {}
function Sq_DrawMainMaxLayerCustomUI(pack) {}
function Lenheart(VmTop) {}
function Sq_MouseEventCallBack(Lb, Rb, Mb) {}
function Sq_SelectCharacter(Chunk) {}
function Sq_DrawMainTopLayerCustomUI(pack) {}
function Sq_GetExeStr_Event(StrIndex) {
return StrIndex;
}
function Sq_CreatChr(chunk) {}
function Sq_SendPackType_Event(Type) {}
function Sq_SendPackByte_Event(Parm) {}
function Sq_SendPackWord_Event(Parm) {}
function Sq_SendPackDWord_Event(Parm) {}
function Sq_SendPackChar_Event(Parm) {}
function Sq_SendPack_Event() {}
function Sq_DrawItemBack(Xpos, Ypos, Image) {}
function Sq_DrawItemFront(Xpos, Ypos, Image) {}
function Sq_GetDrawMonBloodSw() {
return false;
}
function Sq_DrawMonsterBlood(Object, X, Y) {}
function Sq_Set_Inventory_M_Pos(This) {}
function Sq_Get_Ex_IntData(SkillAddress, Idx, objAddress) {
return 0;
}
function Sq_Get_Ex_SkillCoolTime(SkillAddress, Idx, objAddress) {
return 0;
}
function Sq_Get_Ex_LevelData(SkillAddress, Idx, objAddress) {
return 0;
}
function Sq_PlayerEachPos(x, y) {}
function Sq_DrawMainMaxLayerCustomUI(pack) {}
function Sq_PushDamageFontData(ObjAddress, X, Y, Z, Value, Type, A8, A9) {
return true;
}
function Sq_PushDamageData(ObjAddress, MySelfAddress, Value);
function Sq_Pack_Control(chunk) {}
function Sq_MessageWindowDraw(a, c) {}
function Sq_Get_Event_Pos_X() {
return 1;
}
function Sq_Get_Event_Pos_Y() {
return 1;
}
function Sq_L_OtherPlayerInfo(x, y, Type, Value, ImgBuf) {
local str = Value.tostring();
local lenght = L_sq_GetStringDrawLength(str);
L_sq_DrawImg(ImgBuf, x + 70 - lenght, y + 5);
return Value;
}
function Sq_DrawMiniMapUI(a) {}
function Sq_CompleteTask(a1, a2, a3) {}
function L_drawMainCustomUI_All() {}
function L_MouseCallBack(a, b, c, d) {}
function L_DrawWindow_A() {}
function L_DrawWindow_B() {}
function L_OpenOldWindowCallBack(WindowIndex) {}
function L_Old_Window_Get(WindowObject) {}
function L_Character_Info_Window(WindowObject) {
return false;
}
function L_Other_Character_Info_Window(WindowObject) {
return false;
}
function L_Old_Window_Visible(WindowObject, Flag) {}
getroottable().LenheartBaseFuncTab <- {};
getroottable().LenheartFuncTab <- {};
getroottable().Rindro_Scr_Width <- L_sq_RA(0x4D848E);
getroottable().Rindro_Scr_High <- L_sq_RA(0x4D8495);
//获取装备偏移
function Rindro_GetEquAddr(addr) {
switch (addr) {
case 1:
return 0x3038;
break;
case 2:
return 0x304C;
break;
case 3:
return 0x3048;
break;
case 4:
return 0x3050;
break;
case 5:
return 0x3044;
break;
case 6:
return 0x3040;
break;
case 7:
return 0x3058;
break;
case 8:
return 0x305C;
break;
case 9:
return 0x3054;
break;
case 10:
return 0x3060;
break;
case 11:
return 0x3064;
break;
case 12:
return 0x303c;
break;
case 13: //帽子
return 0x3010;
break;
case 14: //头部
return 0x3014;
break;
case 15: //脸
return 0x3018;
break;
case 16:
return 0x301c;
break;
case 17:
return 0x3020;
break;
case 18:
return 0x3024;
break;
case 19:
return 0x3028;
break;
case 20:
return 0x302c;
break;
case 21:
return 0x3030;
break;
case 22:
return 0x3034;
break;
case 23:
return 0x3030;
break;
case 24:
return 0x3068;
break;
case 25:
return 0x306C;
break;
case 26:
return 0x3070;
break;
case 27:
return 0x3074;
break;
}
return -1;
}
//本地模式
if(!getroottable().rawin("RINDROLOCAL"))RINDROLOCAL <- false;
function deepcopy(obj) {
local copies = {}; // 用于跟踪已拷贝对象的表
return _deepcopy(obj, copies);
}
function _deepcopy(obj, copies) {
local type = typeof obj;
// 处理基本类型
if (type != "table" && type != "array" && type != "class" && type != "instance") {
return obj;
}
// 处理循环引用
if (obj in copies) {
return copies[obj];
}
// 创建新容器
local newObj;
if (type == "array") {
newObj = array(obj.len());
copies[obj] <- newObj; // 在拷贝前记录
for (local i = 0; i < obj.len(); i++) {
newObj[i] = _deepcopy(obj[i], copies);
}
}
else if (type == "table") {
newObj = {};
copies[obj] <- newObj; // 在拷贝前记录
foreach(key, val in obj) {
// 键也需要深拷贝
local newKey = _deepcopy(key, copies);
local newVal = _deepcopy(val, copies);
newObj[newKey] <- newVal;
}
}
else { // 类和实例(浅拷贝)
newObj = obj;
copies[obj] <- newObj;
}
return newObj;
}

View File

@@ -1,545 +0,0 @@
/*
文件名:Animation_Class.nut
路径:Base/_Tool/Animation_Class.nut
创建日期:2024-10-21 16:57
文件用途:动画类
*/
class Rindro_Animation {
//Ani是否可用
IsUsability = true;
//当前帧数
CurrentFrameIndex = 0;
//当前帧时间
CurrentIndexT = 0;
//当前帧
CurrentFrame = null;
//Ani的标签
AnimationFlag = null;
//图片对象数组
PngList = null;
//帧对象数组
FrameList = null;
//附加选项
AdditionalOptions = null;
//角度
Angle = 0;
constructor(Data, ...) {
PngList = [];
FrameList = [];
//附加选项
if (vargc > 0) AdditionalOptions = vargv[0];
//初始化数据
InitData(Data);
}
function InitData(Data) {
local Buf;
if (type(Data) == "table") {
Buf = Data;
}
//从PVF数据加载
else if (type(Data) == "string") {
local ReadObject = R_Utils.GetScriptFileReader(Data);
if (ReadObject) {
Buf = Rindro_Script.ReadAnimation(ReadObject);
}
}
if (Buf) {
AnimationFlag = Buf.Flag;
FrameList = Buf.Frame;
foreach(FrameObj in FrameList) {
//如果有附加处理 格式化
if (AdditionalOptions && AdditionalOptions.rawin("ImgFormat")) FrameObj.Img_Path = AdditionalOptions["ImgFormat"](FrameObj.Img_Path);
local Png = Rindro_Image.Load(FrameObj.Img_Path);
// Png.Draw(-500, -500);
//如果有附加处理 坐标
if (AdditionalOptions && AdditionalOptions.rawin("Pos")) {
FrameObj.Pos.x += AdditionalOptions["Pos"].x;
FrameObj.Pos.y += AdditionalOptions["Pos"].y;
}
// Spritebuf.SetPosition(FrameObj.Pos);
PngList.append(Png);
}
} else {
AnimationFlag = {};
FrameList.append({
AttackBox = [],
DamageBox = [],
Delay = 800,
Flag = {},
Img_Index = 0,
Img_Path = "",
Pos = {
x = -248,
y = -331
}
})
// print(Data);
// print("创建Ani失败,找不到Ani数据");
}
}
//重置Ani
function Reset() {
IsUsability = true;
FlushFrame(0);
}
//获取当前帧信息
function GetCurrentFrameInfo() {
return FrameList[CurrentFrameIndex];
}
function FlushFrame(Index) {
if (PngList.len() <= 0) return;
//同步当前帧
CurrentFrameIndex = Index;
//当前帧更换为本帧
CurrentFrame = PngList[CurrentFrameIndex];
local FlagBuf = FrameList[CurrentFrameIndex].Flag;
//关键帧
if ("SET_FLAG" in FlagBuf) {
// if (StateMachine && StateMachine.State != -1) StateMachine.ChangeAniKeyFlag(FlagBuf.SET_FLAG);
}
//播放音效
if ("PLAY_SOUND" in FlagBuf) {
R_Utils.PlaySound(FlagBuf.PLAY_SOUND);
}
}
//绘制
function DrawFrame(X, Y) {
// local NowDrawPng = CurrentFrame;
if (FrameList.len() <= 0) return;
local FrameObj = FrameList[CurrentFrameIndex];
// printT(FrameObj);
//坐标偏移
local XOffset = FrameObj.Pos.x;
local YOffset = FrameObj.Pos.y;
//染色
local RGBA = sq_RGBA(255, 255, 255, 255);
if ("RGBA" in FrameObj.Flag) {
local Fbuf = FrameObj.Flag.RGBA;
RGBA = sq_RGBA(Fbuf[0].tointeger(), Fbuf[1].tointeger(), Fbuf[2].tointeger(), Fbuf[3].tointeger());
}
//缩放
local XRate = 1.0;
local YRate = 1.0;
if ("IMAGE_RATE" in FrameObj.Flag) {
local Fbuf = FrameObj.Flag.IMAGE_RATE;
XRate = Fbuf.x;
YRate = Fbuf.y;
}
//线性减淡
if ("GRAPHIC_EFFECT_LINEARDODGE" in FrameObj.Flag) {
L_sq_SetDrawImgModel(2, 0);
}
if (CurrentFrame) CurrentFrame.DrawExPng(FrameObj.Img_Index, X + XOffset, Y + YOffset, Angle, RGBA, XRate, YRate);
//线性减淡
if ("GRAPHIC_EFFECT_LINEARDODGE" in FrameObj.Flag) {
L_sq_ReleaseDrawImgModel();
}
}
function Draw(X, Y) {
//可用性检查
if (IsUsability) {
DrawFrame(X, Y);
//累加当前帧时间
CurrentIndexT += Rindro_Duration;
//当前帧时间 超过 当前帧延迟就需要切换帧了
if ("Delay" in FrameList[CurrentFrameIndex] && CurrentIndexT >= FrameList[CurrentFrameIndex].Delay) {
CurrentIndexT = 0;
//如果当前帧小于总帧数就切换
if (CurrentFrameIndex<(FrameList.len() - 1)) {
FlushFrame(CurrentFrameIndex + 1);
}
//说明播放完毕了
else {
//如果有循环
if ("LOOP" in AnimationFlag) {
FlushFrame(0);
}
//没有循环触发状态机回调
else {
//将不再可用
IsUsability = false;
}
}
}
}
}
function DrawIndex(X, Y, Index) {
// return;
if (IsUsability) {
FlushFrame(Index);
DrawFrame(X, Y);
}
}
}
//绘制角色类
class Rindro_Draw_Character {
//名字
Name = null;
//职业
Job = null;
//绘制体信息
DrawInfo = null;
//隐藏图层Map
HideMap = null;
ENUM_RINDRO_JOB_NAME = ["swordman", "fighter", "gunner", "mage", "priest", "atgunner", "thief", "atfighter", "atmage", "demonicswordman", "creatormage"];
ENUM_RINDRO_JOB_TITLE_HEIGHT = [
//男鬼剑士
{
x = -42,
y = -154
},
//女格斗
{
x = -42,
y = -140
},
//男神枪手
{
x = -44,
y = -168
},
//女魔法师
{
x = -46,
y = -126
},
//男圣职者
{
x = -46,
y = -166
},
//女神枪手
{
x = -42,
y = -156
},
//女暗夜使者
{
x = -44,
y = -154
},
//男格斗家
{
x = -45,
y = -160
},
//男魔法师
{
x = -45,
y = -140
},
//黑暗武士
{
x = -42,
y = -154
},
//缔造者
{
x = -46,
y = -126
},
];
ENUM_RINDRO_JOB_FACE_HEIGHT = [
//男鬼剑士
{
x = 11,
y = 111
},
//女格斗
{
x = 9,
y = 103
},
//男神枪手
{
x = 13,
y = 131
},
//女魔法师
{
x = 14,
y = 87
},
//男圣职者
{
x = 16,
y = 126
},
//女神枪手
{
x = 11,
y = 119
},
//女暗夜使者
{
x = 12,
y = 115
},
//男格斗家
{
x = 13,
y = 119
},
//男魔法师
{
x = 13,
y = 101
},
//黑暗武士
{
x = -42,
y = -154
},
//缔造者
{
x = -46,
y = -126
},
];
//获取角色AniBy装备
function GetCharacAniByEqu(Job, Equ, AniName) {
local AniList = [];
foreach(value in Equ) {
if (value > 0) {
local ListBuf = CreateEquipmentAni(value, Job, AniName);
AniList.extend(ListBuf);
}
}
local n = AniList.len();
for (local i = 0; i< n - 1; i++) {
for (local j = i + 1; j< n; j++) {
if (AniList[i].Layer > AniList[j].Layer) {
// 交换两个元素
local temp = AniList[i];
AniList[i] = AniList[j];
AniList[j] = temp;
}
}
}
return AniList;
}
function CreateEquipmentAni(Index, Job, AniName) {
local AniList = [];
//获取装备或时装的文件路径
local FilePath = R_Utils.GetEquPath(Index);
if (FilePath) {
local ReadObject = R_Utils.GetScriptFileReader("equipment/" + FilePath);
if (ReadObject) {
local Equ = Rindro_Script.ReadEquipment(ReadObject);
//职业名字
local JobName = ENUM_RINDRO_JOB_NAME[Job];
//没有装备类型
if (!(Equ.rawin("equipment_type"))) Equ.equipment_type <- "normal";
//光环单独处理 其他的在下面处理
if (Equ.equipment_type == "aurora avatar") {
foreach(Path in Equ.Aurora.Back) {
// local AniBuf = Rindro_Animation(Path);
AniList.append({
Ani = Path,
AniName = Path + Clock(),
Layer = -10000,
DrawType = "Native"
});
}
foreach(Path in Equ.Aurora.Front) {
// local AniBuf = Rindro_Animation(Path);
AniList.append({
Ani = Path,
AniName = Path + Clock(),
Layer = 10000,
DrawType = "Native"
});
}
}
//称号
else if (Equ.equipment_type == "title name") {
local PathBuf = "equipment/" + FilePath;
PathBuf = PathBuf.slice(0, R_Utils.String.FindLastSubstring(PathBuf, "/"));
local Path = PathBuf + "/" + Equ.custom_animation;
local Ao = {
Pos = ENUM_RINDRO_JOB_TITLE_HEIGHT[Job]
}
local AniBuf = Rindro_Animation(Path, Ao);
AniList.append({
Ani = AniBuf,
Layer = 10001,
});
}
//没有Ani 就那种透明时装
if (!(Equ.rawin("Ani_" + JobName))) return AniList;
//记录时装的隐藏图层值
if (Equ.rawin("hidelayer")) {
foreach(value in Equ["hidelayer"]) {
HideMap.rawset(value, true);
}
}
//读取Ani配置
local AniScript = Equ["Ani_" + JobName];
// printT(AniScript);
if (Equ.equipment_type == "skin avatar") {
local Path;
if (JobName.find("at") >= 0) {
Path = format("character/%s/atanimation/%s", JobName.slice(2), AniName);
} else Path = format("character/%s/animation/%s", JobName, AniName);
local Ao = {
ImgVariation = AniScript.variation,
ImgFormat = function(ImgPath) {
if (ImgVariation[0] > 0) {
local Pos = ImgPath.find("%04d");
ImgPath = ImgPath.slice(0, Pos) + "%02d%02d" + ImgPath.slice(Pos + 4);
return format(ImgPath, ImgVariation[0], ImgVariation[1]);
} else {
return format(ImgPath, ImgVariation[1]);
}
}
}
local AniBuf = Rindro_Animation(Path, Ao);
AniList.append({
Ani = AniBuf,
Layer = -1,
});
} else {
foreach(Info in AniScript.layer_variation) {
local PathBuf = "equipment/" + FilePath;
PathBuf = PathBuf.slice(0, R_Utils.String.FindLastSubstring(PathBuf, "/"));
local Path = PathBuf + "/" + Info.Path + "/" + AniName;
local Ao = {
ImgVariation = AniScript.variation,
ImgFormat = function(ImgPath) {
return format(ImgPath, ImgVariation[0], ImgVariation[1]);
}
}
local AniBuf = Rindro_Animation(Path, Ao);
AniList.append({
Ani = AniBuf,
Layer = Info.Zorder,
});
}
}
}
}
return AniList;
}
constructor(Job, EquipmentArr, Action, Name) {
HideMap = {};
DrawInfo = GetCharacAniByEqu(Job, EquipmentArr, Action);
this.Job = Job;
this.Name = Name;
}
function Draw(X, Y) {
foreach(AniInfo in DrawInfo) {
// print(AniInfo.Layer);
if (!HideMap.rawin(AniInfo.Layer)) {
if (!AniInfo.rawin("DrawType") || AniInfo["DrawType"] != "Native") {
AniInfo.Ani.Draw(X, Y);
} else {
Rindro_BaseToolClass.DrawAniEx(X, Y, AniInfo.Ani, AniInfo.AniName);
}
}
}
if (Name) {
L_sq_DrawCode(Name, 44 + X + ENUM_RINDRO_JOB_TITLE_HEIGHT[Job].x - (LenheartTextClass.GetStringLength(Name) / 2), Y + ENUM_RINDRO_JOB_TITLE_HEIGHT[Job].y + 24, sq_RGBA(255, 255, 255, 250), 1, 1);
}
}
function DrawFace(X, Y) {
//兼容模式
if (getroottable().PluginsCompatibilityModeCallBack){
return;
}
setClip(X, Y, X + 22, Y + 18); //开始裁切
foreach(AniInfo in DrawInfo) {
try {
AniInfo.Ani.DrawIndex(X + ENUM_RINDRO_JOB_FACE_HEIGHT[Job].x, Y + ENUM_RINDRO_JOB_FACE_HEIGHT[Job].y, 0);
} catch (exception) {
}
}
releaseClip(); //裁切结束
}
}
//鬼剑士
//601580026 101550559
// Sassq <- {};
// Sassq[0] <- Rindro_Draw_Character(0, [
// 601550071,
// 601560067,
// 601570062,
// 601500069,
// 601510068,
// 601540069,
// 601520061,
// 601530060,
// 601580026,
// 0,
// 27610,
// 26058
// ], "rest.ani", "鬼剑士-Kina")
// //格斗家
// Sassq[1] <- Rindro_Draw_Character(1, [26373, 102550540, 102560700, 102570504, 102520514, 102500742, 102510739, 102540664, 102580139, 102530474], "rest.ani", "Kina")
// //神枪手
// Sassq[2] <- Rindro_Draw_Character(2, [26373, 104550553, 104560725, 104570492, 104520541, 104500750, 104510913, 104540671, 104580148, 104530494], "rest.ani", "Kina")
// //魔法师
// Sassq[3] <- Rindro_Draw_Character(3, [26373, 106550521, 106560580, 106570446, 106520529, 106500603, 106510607, 106540583, 106580143, 106530461], "rest.ani", "Kina")
// //圣职者
// Sassq[4] <- Rindro_Draw_Character(4, [26373, 108550600, 108560591, 108570687, 108520580, 108500587, 108510590, 108540562, 108580138, 108530560], "rest.ani", "Kina")
// //女枪
// Sassq[5] <- Rindro_Draw_Character(5, [26373, 105550431, 105560424, 105570386, 105520415, 105500424, 105510429, 105540408, 105580144, 105530361], "rest.ani", "Kina")
// //暗夜
// Sassq[6] <- Rindro_Draw_Character(6, [26373, 109550385, 109560393, 109570369, 109520406, 109500402, 109510414, 109540389, 109580134, 109530355], "rest.ani", "Kina")
// //男格斗
// Sassq[7] <- Rindro_Draw_Character(7, [26373, 103550302, 103560311, 103570274, 103520297, 103500297, 103510301, 103540284, 103580128, 103530246], "rest.ani", "Kina")
// //男法
// Sassq[8] <- Rindro_Draw_Character(8, [26373, 107550220, 107560223, 107570188, 107520224, 107500233, 107510231, 107540209, 107580129, 107530192], "rest.ani", "Kina")

View File

@@ -1,516 +0,0 @@
/*
文件名:BaseTool_Class.nut
路径:Base/_Tool/BaseTool_Class.nut
创建日期:2024-08-06 23:49
文件用途:基础工具类
*/
function printT(T) {
Sq_OutPutTable(Json.Encode(T));
}
//Json类
class Json {
function Encode(Table) {
local JsonObj = JSONEncoder();
return JsonObj.encode(Table);
local Size = Table.len();
local Pos = 0;
local Str = "{";
foreach(Key, Value in Table) {
++Pos;
Str += "\"";
Str += Key.tostring();
Str += "\"";
Str += ":";
if (typeof(Value) == "string") {
Str += "\"";
Str += Value;
Str += "\"";
} else if (typeof(Value) == "table") {
Str += Json.Encode(Value);
} else if (typeof(Value) == "array") {
Str += "[";
foreach(ArrObj in Value) {
if (typeof(ArrObj) == "table") Str += Json.Encode(Value);
else {
Str += ArrObj;
Str += ",";
}
}
Str = Str.slice(0, Str.len() - 1);
Str += "]";
} else Str += Value;
if (Pos != Size) Str += ",";
}
Str += "}";
return Str;
}
function Decode(Str) {
// Str = L_sq_DecondeJson(Str);
// local Str = "local _M = " + Str + ";\n return _M;\n";
// local Func = compilestring(Str);
// return Func();
local JsonObj = JSONParser();
return JsonObj.parse(Str);
}
}
//Key 键盘按键类
class KeyPress {
function KeyDown(obj, KeyValue) {
local KeyEvent = obj.getVar(KeyValue.tostring()); //声明储存器
KeyEvent.clear_vector(); //清空储存器的向量位
if (sq_IsKeyDown(KeyValue, ENUM_SUBKEY_TYPE_ALL) && KeyEvent.getInt(0) == 0) {
KeyEvent.setInt(0, 1);
return true;
}
}
function KeyUp(obj, KeyValue) {
local KeyEvent = obj.getVar(KeyValue.tostring()); //声明储存器
if (sq_IsKeyUp(KeyValue, ENUM_SUBKEY_TYPE_ALL)) {
KeyEvent.setInt(0, 0);
}
}
function isKeyPress(KeyValue) {
local obj = sq_getMyCharacter();
if (KeyPress.KeyDown(obj, KeyValue)) {
return true;
}
KeyPress.KeyUp(obj, KeyValue);
}
}
//Key 键盘按键类
class KeyPressNB {
function KeyDown(obj, KeyValue, VarKey) {
local KeyEvent = obj.getVar(VarKey); //声明储存器
KeyEvent.clear_vector(); //清空储存器的向量位
if (sq_IsKeyDown(KeyValue, ENUM_SUBKEY_TYPE_ALL) && KeyEvent.getInt(0) == 0) {
KeyEvent.setInt(0, 1);
return true;
}
}
function KeyUp(obj, KeyValue, VarKey) {
local KeyEvent = obj.getVar(VarKey); //声明储存器
if (sq_IsKeyUp(KeyValue, ENUM_SUBKEY_TYPE_ALL)) {
KeyEvent.setInt(0, 0);
}
}
function isKeyPress(KeyValue, VarKey) {
local obj = sq_getMyCharacter();
obj = sq_GetCNRDObjectToActiveObject(obj);
if (KeyPressNB.KeyDown(obj, KeyValue, VarKey)) {
return true;
}
KeyPressNB.KeyUp(obj, KeyValue, VarKey);
}
}
//基础工具类
class Rindro_BaseToolClass {
function IsNumber(value) {
try {
local Buffer = value.tointeger();
return true;
} catch (exception) {
return false;
}
}
function GetItemNameById(ItemId) {
local ItemObject = L_sq_GetItem(ItemId);
local NamePointer = L_sq_RA(ItemObject + 0x20);
local ItemName = NativePointer(L_sq_I2P(NamePointer)).readUnicodeString();
return ItemName;
}
function SendPack(T) {
local str = Json.Encode(T);
L_sq_SendPackType(130);
L_sq_SendPackWChar(str);
L_sq_SendPack();
}
function SendPackEx(T) {
local str = L_sq_EncondeJson(T);
L_sq_SendPackType(130);
L_sq_SendPackWChar(str);
L_sq_SendPack();
}
function RegisterPack(Id, CallBack) {
Pack_Control.rawset(Id, CallBack);
}
function RegisterHexPack(Id, CallBack)
{
Pack_Hex_Control.rawset(Id, CallBack);
}
//绘制简易静态Ani // obj -- ani路径 -- X -- Y -- 第几帧 -- ani名字
function T_DrawStayAni(obj, aniFileName, x, y, index, aniname) {
local SelectAni = obj.getVar().GetAnimationMap(aniname, aniFileName);
//sq_AnimationProc(SelectAni);
sq_DrawSpecificFrame(SelectAni, x, y, false, index, false, 1.0);
return SelectAni;
}
//绘制简易静态Ani // obj -- ani路径 -- X -- Y -- 第几帧 -- ani名字
function T_DrawStayAniRate(obj, aniFileName, x, y, index, aniname, rate) {
local SelectAni = obj.getVar().GetAnimationMap(aniname, aniFileName);
SelectAni.setImageRateFromOriginal(rate, rate);
//sq_AnimationProc(SelectAni);
sq_DrawSpecificFrame(SelectAni, x, y, false, index, false, 1.0);
return SelectAni;
}
//绘制简易动态Ani // obj -- ani路径 -- X -- Y -- ani名字
function T_DrawDynamicAni(obj, aniFileName, x, y, aniname) {
local ani = obj.getVar().GetAnimationMap(aniname, aniFileName);
sq_AnimationProc(ani);
sq_drawCurrentFrame(ani, x, y, true);
return ani;
}
//超简易绘制动态Ani
function DrawAniEx(X, Y, AniPath, ...) {
local AniName = "简易播放Ani:" + AniPath;
if (vargc > 0) AniName = vargv[0];
local obj = sq_getMyCharacter();
local ani = obj.getVar().GetAnimationMap(AniName, AniPath);
sq_AnimationProc(ani);
sq_drawCurrentFrame(ani, X, Y, true);
return ani;
}
//初始化根表成员
function InitClass(Name) {
local RootTab = getroottable();
if (RootTab.rawin(Name) == true) {
RootTab.rawdelete(Name);
}
}
//获取交互Npc名称
function GetEachNpcId() {
local OneAddress = L_sq_RA(0x1ADE0E0);
if (OneAddress) {
local TowAddress = L_sq_RA(OneAddress + 8);
if (TowAddress) {
local Id = L_sq_RA(TowAddress + 0x210);
return Id;
}
}
return null;
}
function DrawTriptych(X, Y, Width, Img, StartIndex) {
//如果没有载入img就载入
if (!Rindro_Image_GlobalMap.rawin(Img)) {
Rindro_Image_GlobalMap[Img] <- Rindro_Image(Img);
}
Rindro_Image_GlobalMap[Img].DrawPng(StartIndex, X, Y);
//获取第一张图片的宽
local FirstW = Rindro_Image_GlobalMap[Img].GetPng(StartIndex).GetWidth();
//获取中间的图片宽
local MiddleW = Rindro_Image_GlobalMap[Img].GetPng(StartIndex + 1).GetWidth();
//获得最后一张图片的宽
local LastW = Rindro_Image_GlobalMap[Img].GetPng(StartIndex + 2).GetWidth();
//绘制中间
Rindro_Image_GlobalMap[Img].DrawExPng(StartIndex + 1, X + FirstW, Y, 0, sq_RGBA(255, 255, 255, 250), (Width - LastW - FirstW).tofloat() / MiddleW, 1.0);
//绘制最后一张
Rindro_Image_GlobalMap[Img].DrawPng(StartIndex + 2, X + Width - LastW, Y);
}
function DrawTriptychDetail(X, Y, Width, Img, Fi, Mi, La) {
//如果没有载入img就载入
if (!Rindro_Image_GlobalMap.rawin(Img)) {
Rindro_Image_GlobalMap[Img] <- Rindro_Image(Img);
}
Rindro_Image_GlobalMap[Img].DrawPng(Fi, X, Y);
//获取第一张图片的宽
local FirstW = Rindro_Image_GlobalMap[Img].GetPng(Fi).GetWidth();
//获取中间的图片宽
local MiddleW = Rindro_Image_GlobalMap[Img].GetPng(Mi).GetWidth();
//获得最后一张图片的宽
local LastW = Rindro_Image_GlobalMap[Img].GetPng(La).GetWidth();
//绘制中间
Rindro_Image_GlobalMap[Img].DrawExPng(Mi, X + FirstW, Y, 0, sq_RGBA(255, 255, 255, 250), (Width - LastW - FirstW).tofloat() / MiddleW, 1.0);
//绘制最后一张
Rindro_Image_GlobalMap[Img].DrawPng(La, X + Width - LastW, Y);
}
function DrawNineBox(X, Y, Width, Height, Img, StartIndex) {
//如果没有载入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, 250), (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, 250), 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, 250), (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, 250), 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, 250), (Width - LeftTopW * 2).tofloat() / TopW, 1.0);
//绘制右下角
Rindro_Image_GlobalMap[Img].DrawPng(StartIndex + 8, X + Width - LeftTopW, Y + Height - LeftTopH);
}
}
//获取文字绘制长度
class LenheartTextClass {
function GetStringLength(str) {
if (typeof str != "string") str = "无字符";
return L_sq_GetStringDrawLength(str);
}
}
class MemoryTool {
//给指定地址写入字节数组
function WirteByteArr(Address, ByteArr) {
for (local i = 0; i< ByteArr.len(); i++) {
L_sq_WAB(Address + i, ByteArr[i]);
}
}
//解密读取内存地址的数据
function DecodeMemoryData(Address) {
local nEax, nEcx8, nEsi, nEdx, nTmp;
nEax = NativePointer(L_sq_I2P(Address)).readInt();
if (nEax == -1) return nEax;
nEcx8 = NativePointer(L_sq_I2P(Address + 8)).readInt();
if (nEcx8 == -1) return nEcx8;
nEsi = NativePointer(L_sq_I2P(0x1AF8D78)).readInt();
if (nEsi == -1) return nEdx;
nEdx = nEax >> 16;
nTmp = (nEdx << 2) + nEsi + 36;
nEdx = NativePointer(L_sq_I2P(nTmp)).readInt();
if (nEdx == -1) return nEdx;
nEax = nEax & 65535;
nTmp = (nEax << 2) + nEdx + 8468;
nEax = NativePointer(L_sq_I2P(nTmp)).readInt();
if (nEax == -1) return nEax;
nEdx = nEax & 0xFFFF;
nEsi = nEdx << 16;
nEsi = nEsi | nEdx;
nEax = nEsi ^ nEcx8;
return nEax;
}
//加密写入内存地址数据
function EncodeMemoryData(AddreSs, Data) {
local JEdi, JEcx, JEax, JEsi, JEdx, JSs;
JEcx = AddreSs;
JEax = L_sq_RA(0x1AF8DB8);
JEax = JEax + 1;
L_sq_WA(0x1AF8DB8, JEax);
JEdx = JEax;
JEdx = JEdx >> 8;
JEdx = JEdx << 24;
JEdx = JEdx >> 24;
JEdx = L_sq_RA(JEdx * 2 + 0x1843F58);
JEdx = JEdx & 0xFFFF;
JEax = JEax << 24;
JEax = JEax >> 24;
JSs = L_sq_RA(JEax * 2 + 0x1844158);
JSs = JSs & 0xFFFF;
JEdx = JEdx ^ JSs;
JEax = JEdx;
JEax = JEax & 0xFFFF;
JEsi = Data;
JEdx = JEsi >> 16;
JSs = JEsi & 0xFFFF;
JEdx = JEdx + JSs;
JEdx = JEdx ^ JEax;
JEdi = JEdx;
JEdx = JEax;
JEax = JEax << 16;
JEax = JEax + JEdx;
JEsi = Data;
JEax = JEax ^ JEsi;
JEsi = AddreSs + 8;
L_sq_WA(JEsi, JEax);
JEax = L_sq_RA(AddreSs);
JEsi = L_sq_RA(0x1AF8D78);
JEcx = JEdi;
JEcx = JEcx << 16;
JEcx = JEcx + JEdx;
JEdx = JEax;
JEdx = JEdx >> 16;
JEdx = L_sq_RA(JEsi + JEdx * 4 + 36);
JEax = JEax & 0xFFFF;
L_sq_WA(JEdx + JEax * 4 + 8468, JEcx);
}
function DecodeMemoryDataF(Address) {
local Value = MemoryTool.DecodeMemoryData(Address);
local Bl = blob();
Bl.writen(Value, 'i');
Bl.seek(0);
return Bl.readn('f');
}
function ReadFloat(Address) {
local Arr = [];
for (local i = 0; i< 4; i++) {
Arr.append(L_sq_RAB(Address + i));
}
// local Value = L_sq_RAB(Address);
// print(Value);
local Bl = blob();
foreach(intvalue in Arr) {
Bl.writen(intvalue, 'c');
}
// Bl.writen(Value, 'i');
Bl.seek(0);
return Bl.readn('f');
}
}
//大数字
class longlong {
Value = null;
//构造函数 不管是不是string类型都要转成string类型
constructor(StrValue) {
Value = StrValue.tostring();
}
function _add(other) {
return longlong(L_sq_LongLongOperation(this.Value, other.Value, "+"));
}
function _sub(other) {
return longlong(L_sq_LongLongOperation(this.Value, other.Value, "-"));
}
function _mul(other) {
return longlong(L_sq_LongLongOperation(this.Value, other.Value, "*"));
}
function _div(other) {
return L_sq_LongLongOperation(this.Value, other.Value, "/");
}
function _unm() {
return longlong(L_sq_LongLongOperation(longlong("0"), this.Value, "-"));
}
function _modulo(other) {
return longlong(L_sq_LongLongOperation(this.Value, other.Value, "%"));
}
function GetFormat(FType) {
local Buf = L_sq_LongLongOperation(this.Value, FType, "format");
if (Buf.len()< 2) return Buf + ".0";
local Value = Buf.slice(0, -1);
local Unit = Buf.slice(-1);
local RetStr = format(FType + Unit, Value.tofloat());
return RetStr;
}
}
//任务队列
class QuestQueue {
//队列
Queue = null;
constructor() {
Queue = {};
}
//添加任务
function AddQuest(QuestName, QuestLogic, ...) {
local args = null;
if (vargc > 0) {
args = [];
for (local i = 0; i< vargc; i++) {
args.append(vargv[i]);
}
}
Queue[QuestName] <- {
Logic = QuestLogic,
InseartTime = Clock(),
arg = args
};
}
//移除任务
function RemoveQuest(QuestName) {
if (Queue) {
Queue.rawdelete(QuestName);
}
}
//执行任务
function Run() {
if (Queue) {
local NowTime = Clock();
foreach(QuestName, QuestInfo in Queue) {
if (QuestInfo.arg && QuestInfo.arg.len() > 0) {
local Arr = [];
Arr.append(getroottable());
Arr.append(QuestName);
Arr.append(NowTime);
foreach(value in QuestInfo.arg) {
Arr.append(value);
}
QuestInfo.Logic.acall(Arr);
// QuestInfo.Logic(QuestName, NowTime - QuestInfo.InseartTime, QuestInfo.arg);
} else QuestInfo.Logic(QuestName, NowTime - QuestInfo.InseartTime);
}
}
}
//示例
/*
Obj.AddQuest("测试任务",function (Name,Time)
{
print(Time);
if(Time >= 2000)Obj.RemoveQuest(Name);
}.bindenv(this));
*/
}

View File

@@ -1,60 +0,0 @@
/*
文件名:Hacker_Class.nut
路径:Base/_Tool/Hacker_Class.nut
创建日期:2024-09-24 06:25
文件用途:
*/
class _Rindro_Hacker {
HookTable = null;
constructor() {
HookTable = {};
}
function UnLoadHook(AddressStr) {
Sq_DeHookFunc(HookTable[AddressStr]);
}
function LoadHook(AddressStr, ArgumentArr, EnterFunc, LeaveFunc) {
//如果已经HOOK过 需要先卸载原来的HOOK
if (HookTable.rawin(AddressStr)) {
UnLoadHook(AddressStr);
print("地址: " + AddressStr + " 已经装载了Hook,本次操作将会卸载之前的Hook在执行。")
}
local Controler = Sq_HookFunc(AddressStr, ArgumentArr, EnterFunc, LeaveFunc);
HookTable.rawset(AddressStr, Controler);
}
}
//初始化Hacker
if (!(getroottable().rawin("Rindro_Haker"))) Rindro_Haker <- _Rindro_Hacker();
//重选角色时触发的回调函数(进入赛利亚房间)
OnSetCharacter_Control <- {}
Rindro_Haker.LoadHook(0x674350, ["pointer", "int"],
function(args) {
foreach(Func in OnSetCharacter_Control) {
Func();
}
return null;
},
function(args) {
return null;
});
OnSetCharacter_Control.MarrySystem <- function() {
if (getroottable().rawin("Yosin_14SkillXpos1") &&
getroottable().rawin("Yosin_14SkillXpos2") &&
getroottable().rawin("Yosin_14SkillYpos1") &&
getroottable().rawin("Yosin_14SkillYpos2")
) {
for (local i = 6; i< 7; i++) {
L_sq_WA(L_sq_RA(L_sq_RA(0x01ADE0CC) + 0x30 + (i * 0x4)) + 0x14, Yosin_14SkillXpos1 + (i * 31));
L_sq_WA(L_sq_RA(L_sq_RA(0x01ADE0CC) + 0x30 + (i * 0x4)) + 0x18, Yosin_14SkillYpos1);
L_sq_WA(L_sq_RA(L_sq_RA(0x01ADE0CC) + 0x60 + (i * 0x4)) + 0x14, Yosin_14SkillXpos2 + (i * 31));
L_sq_WA(L_sq_RA(L_sq_RA(0x01ADE0CC) + 0x60 + (i * 0x4)) + 0x18, Yosin_14SkillYpos2);
}
}
};

View File

@@ -1,301 +0,0 @@
/*
文件名:Hacker_RegApi.nut
路径:Base/_Tool/Hacker_RegApi.nut
创建日期:2024-09-25 18:31
文件用途:注册API
*/
//工具类
class R_Utils {
String = {
FindLastSubstring = function(str, substring) {
local strLen = str.len();
local subLen = substring.len();
local lastIndex = -1;
for (local i = 0; i <= strLen - subLen; i++) {
local found = true;
for (local j = 0; j< subLen; j++) {
if (str[i + j] != substring[j]) {
found = false;
break;
}
}
if (found) {
lastIndex = i;
}
}
return lastIndex;
}
}
//播放音效
function PlaySound(SoundName) {
L_Sq_CallFunc(0x75BD70, "void", FFI_MS_CDECL, ["pointer", "int", "int", "int"], Memory.allocUtf8String(SoundName).C_Object, -1, 0, 0);
}
//读取文件内容
function ReadScript(Path, Size, CodePage) {
local ReadPath = L_sq_P2I(Memory.allocUtf8String(Path).C_Object);
local Reader = Memory.alloc(Size);
local ReadBuffer = L_sq_P2I(Reader.C_Object);
L_Sq_CallFunc(0x11A2030, "int", FFI_FASTCALL, ["int", "int", "int", "int", "int", "int"], 0x1D17638, 0, ReadPath, ReadBuffer, 0x100000, 0x19DAF4);
if (CodePage == "utf8")
return Reader.readUtf8String();
if (CodePage == "unicode")
return Reader.readUnicodeString();
if (CodePage == "big5")
return Reader.readBig5String();
}
//读取文件
function GetScriptFileReader(Path, ...) {
local AllocSize = 102400;
if (vargc > 0) AllocSize = vargv[0];
//读取路径
local ReadPath = L_sq_P2I(Memory.allocUtf8String(Path).C_Object);
//读取缓存
local Reader = Memory.alloc(AllocSize);
local ReadBuffer = L_sq_P2I(Reader.C_Object);
//实际读取大小
local ReadSizeer = Memory.alloc(4);
local ReadSizeBuffer = L_sq_P2I(ReadSizeer.C_Object);
local Flag = L_Sq_CallFunc(0x59E3D0, "bool", FFI_MS_CDECL, ["int", "int", "int", "int"], ReadPath, ReadBuffer, AllocSize, ReadSizeBuffer);
if (Flag) {
return {
Buffer = Reader,
Size = ReadSizeer.readInt()
};
} else return null;
}
//读取配置表
function ReadScriptConfig(Path, Size, ...) {
local CodePage = "utf8";
if (vargc > 0) CodePage = vargv[0];
local Script = R_Utils.ReadScript(Path, Size, CodePage);
local Func = compilestring("return " + Script);
local Ret = Func();
return Ret;
}
//获取一个指定装备的角色对象
function GetCharacByEqu(Job, GrowType, Equ) {
local Obj = sq_CreateCharacter(Job, GrowType);
local ObjAddress = L_Sq_GetObjectAddress(Obj);
foreach(value in Equ) {
local ItemObject = L_sq_GetItem(value);
// L_Sq_CallFunc(0x825570, "void", FFI_THISCALL, ["int", "int"], ObjAddress, ItemObject);
L_Sq_CallFunc(0x8265A0, "void", FFI_THISCALL, ["int", "int", "int"], ObjAddress, ItemObject, -1);
}
return sq_GetCNRDObjectToSQRCharacter(Obj);
}
//获取装备编号的得文件路径
function GetEquPath(Equ) {
local EquPathAddress = L_Sq_CallFunc(0x1219E80, "int", FFI_THISCALL, ["int", "int"], 0x1d7993c, Equ);
if (EquPathAddress) {
return NativePointer(EquPathAddress).readUnicodeString();
}
return null;
}
//获取Lst文件的返回Array
function GetLstArr(Path, Header) {
local Arr = [];
local LstBuf = R_Utils.GetScriptFileReader(Path);
if (LstBuf) {
local IO = Sq_Point2Blob(L_sq_P2I(LstBuf.Buffer.C_Object), LstBuf.Size);
local i = 2;
while (i< LstBuf.Size) {
if ((LstBuf.Size - i) >= 10) {
IO.seek(i + 6); //内容指示位
local FindKey = IO.readn('i');
local Key = Rindro_Script.GetBinString(FindKey);
if (Key) {
local StrFilePath = Header + Key.tolower();
Arr.append(StrFilePath);
}
} else break;
i += 10;
}
}
return Arr;
}
//通过处理函数获取文件Table
function GetFileTableByHandle(Path, Func) {
local Data = {};
local FileData = R_Utils.GetScriptFileReader(Path);
if (FileData) {
if (FileData.Size >= 7) {
//创建Blob对象
local IO = Sq_Point2Blob(L_sq_P2I(FileData.Buffer.C_Object), FileData.Size);
//以5为单步从第二位开始遍历字节
local i = 2;
while (true) {
if (i< FileData.Size && FileData.Size - i >= 5) {
i = Func(Data, IO, i);
} else break;
}
}
}
return Data;
}
}
//根据List读取文件地址
// Rindro_Haker.LoadHook(0x1219E80, ["int", "int", "int"],
// function(args) {
// // print(format("%02x", args[0]));
// // print(args[2]);
// return null;
// },
// function(args) {
// // print(666);
// // print(format("%02x", args.pop()));
// // TTTAni <- args.pop();
// // local Path = NativePointer(L_sq_I2P(args.pop())).readUnicodeString();
// // if (Path != "character/swordman/weapon/katana/kat_lowkogaras.equ" && Path != "new_elvengard.twn") {
// // print(args[0]);
// // print(args[1]);
// // // print(format("%02x", args[1]));
// // print(Path);
// // }
// return null;
// });
//可能是构造装备以及构造其他东西
// Rindro_Haker.LoadHook(0x972220, ["int", "int", "int", "int"],
// function(args) {
// // print(format("%02x", args[0]));
// // local AniPath = NativePointer(L_sq_I2P(args[0])).readUnicodeString();
// if (args[0] == 10402) {
// print(args[0]);
// print(args[1]);
// print(args[2]);
// }
// // print(args[2]);
// return null;
// },
// function(args) {
// // print(666);
// // print(format("%02x", args.pop()));
// // TTTAni <- args.pop();
// return null;
// });
//绘制字符
getroottable().DrawCodeCallBackFunc <- {};
// Rindro_Haker.LoadHook(0x1206BD0, ["int", "int", "int", "pointer", "int", "void"],
// function(args) {
// // print("nut:" + format("%02x", args[3]));
// if (args[3]) {
// // for (local i = 0; i< 10000; i++) {
// local DrawCode = NativePointer((args[3])).readUnicodeString();
// if (DrawCode in DrawCodeCallBackFunc)
// DrawCodeCallBackFunc[DrawCode](args);
// // }
// }
// return null;
// },
// function(args) {
// // print(666);
// // print(format("%02x", args.pop()));
// // TTTAni <- args.pop();
// return null;
// });
//绘制城镇回调
getroottable().DrawTownCallBackFunc <- {};
Rindro_Haker.LoadHook(0x1108700, ["int", "void"],
function(args) {
// print("nut:" + format("%02x", args[3]));
// print(format("%02x", args[0]));
foreach(Func in DrawTownCallBackFunc) {
Func();
}
return null;
},
function(args) {
// print(666);
// print(format("%02x", args.pop()));
// TTTAni <- args.pop();
return null;
});
//顺图
function Rindro_Gm_MoveMap(obj) {
if (sq_IsKeyDown(OPTION_HOTKEY_PAUSE_IN_TOWER, ENUM_SUBKEY_TYPE_ALL) && RINDROLOCAL) {
if (KeyPress.isKeyPress(0)) L_sq_MoveMap(2);
if (KeyPress.isKeyPress(1)) L_sq_MoveMap(0);
if (KeyPress.isKeyPress(2)) L_sq_MoveMap(3);
if (KeyPress.isKeyPress(3)) L_sq_MoveMap(1);
}
}
getroottable()["LenheartFuncTab"].rawset("Rindro_Gm_MoveMapFuncN", Rindro_Gm_MoveMap);
//丢弃物品回调
getroottable().DiscardItemCallBackFunc <- {};
function Sq_DiscardItem(Item) {
local Flag = true;
foreach(Func in DiscardItemCallBackFunc) {
local Ret = Func(Item);
if (!Ret) Flag = false;
}
return Flag;
}
//从exe获取字符串
getroottable()["Sq_GetExeStr_Map"] <- {};
function Sq_GetExeStr_Event(Index)
{
if(Index in getroottable()["Sq_GetExeStr_Map"]){
return getroottable()["Sq_GetExeStr_Map"][Index](Index);
}
return Index;
}
// //hook打开窗口
// Rindro_Haker.LoadHook(0xE6E070, ["int","int","int","int","void"],
// function(args) {
// return null;
// },
// function(args) {
// // print(666);
// // print(format("%02x", args.pop()));
// // TTTAni <- args.pop();
// return null;
// });
// Rindro_Haker.LoadHook(0xE6E070, ["int", "int", "int", "int", "int"],
// function(args) {
// print("nut:" + format("%02x", args[0]));
// print("nut:" + format("%02x", args[1]));
// print("nut:" + format("%02x", args[2]));
// print("nut:" + format("%02x", args[3]));
// return null;
// },
// function(args) {
// // print(666);
// // print(format("%02x", args.pop()));
// // TTTAni <- args.pop();
// return null;
// });

View File

@@ -1,80 +0,0 @@
/*
文件名:Image_Class.nut
路径:Base/_Tool/Image_Class.nut
创建日期:2024-10-21 16:58
文件用途: 图片类
*/
class Rindro_Png {
C_Object = null;
Path = null;
Idx = null;
constructor(Object, Path, Idx) {
this.Path = Path;
this.Idx = Idx;
this.C_Object = Object;
}
function Draw(X, Y) {
L_Sq_CallFunc(0x11A8F60, "int", FFI_THISCALL, ["int", "int", "int", "int"], NativePointer(0x1B45B94).readInt(), X, Y, this.C_Object);
}
function DrawEx(X, Y, Model, Rgba, Xrate, Yrate) {
L_Sq_CallFunc(0x11A97E0, "int", FFI_THISCALL, ["int", "int", "int", "int", "float", "float", "float", "int", "float", "float"], NativePointer(0x1B45B94).readInt(), X, Y, this.C_Object, Xrate, Yrate, Model, Rgba, 0, 0);
}
function GetWidth()
{
return NativePointer(this.C_Object + 0x1C).readShort();
}
function GetHeight()
{
return NativePointer(this.C_Object + 0x1E).readShort();
}
}
class Rindro_Image {
Img = null;
Path = null;
constructor(Path) {
this.Path = Path;
//读取Img
Img = L_Sq_CallFunc(0x11C0410, "int", FFI_THISCALL, ["int", "int", "int"], NativePointer(0x1B4684C).readInt(), 0, L_sq_P2I(Memory.allocUtf8String(Path).C_Object));
}
function GetPng(Idx) {
if (Img) {
local PngObject = L_Sq_CallFunc(0x11AA190, "int", FFI_THISCALL, ["int", "int"], Img, Idx);
return Rindro_Png(PngObject, Path, Idx);
}
}
function DrawPng(Idx, X, Y) {
local Buffer = GetPng(Idx);
Buffer.Draw(X, Y);
}
function DrawExPng(Idx, X, Y, Model, Rgba, Xrate, Yrate) {
local Buffer = GetPng(Idx);
Buffer.DrawEx(X, Y, Model, Rgba, Xrate, Yrate)
}
//加载
function Load(Path) {
if (!(getroottable().rawin("Rindro_Image_Map"))) getroottable().Rindro_Image_Map <- {};
if (getroottable().Rindro_Image_Map.rawin(Path)) return getroottable().Rindro_Image_Map[Path];
else {
getroottable().Rindro_Image_Map[Path] <- Rindro_Image(Path);
return getroottable().Rindro_Image_Map[Path];
}
}
}
Rindro_Image_GlobalMap <- {};
Rindro_Image_GlobalMap["lenheartui"] <- Rindro_Image("interface/lenheartwindowcommon.img");
/*
local Png = TestImg.GetPng(0);
Png.Draw(200, 200);
Png.DrawEx(100, 400, 0, sq_RGBA(255, 255, 255, 255), 1.5, 1.5);
*/

View File

@@ -1,661 +0,0 @@
/*
文件名:Json_Class.nut
路径:Base/_Tool/Json_Class.nut
创建日期:2024-09-27 23:54
文件用途:Json类
*/
class JSONParser {
static version = "1.0.1";
state = "";
stack = null;
container = null;
key = "";
value = "";
converter = null;
constructor() {
stack = [];
container = {};
}
function parse(str, ...) {
if (vargc > 0) converter = vargc[0];
local string = {
go = function() {
state = "ok";
}.bindenv(this),
firstokey = function() {
key = value;
state = "colon";
}.bindenv(this),
okey = function() {
key = value;
state = "colon";
}.bindenv(this),
ovalue = function() {
value = this._convert(value, "string", converter);
state = "ocomma";
}.bindenv(this),
firstavalue = function() {
value = this._convert(value, "string", converter);
state = "acomma";
}.bindenv(this),
avalue = function() {
value = value;
this._convert(value, "string", converter);
state = "acomma";
}.bindenv(this)
};
local number = {
go = function() {
state = "ok";
}.bindenv(this),
ovalue = function() {
value = this._convert(value, "number", converter);
state = "ocomma";
}.bindenv(this),
firstavalue = function() {
value = this._convert(value, "number", converter);
state = "acomma";
}.bindenv(this),
avalue = function() {
value = this._convert(value, "number", converter);
state = "acomma";
}.bindenv(this)
};
local action = {};
action["{"] <- {
go = function() {
stack.push({
state = "ok"
});
container = {};
state = "firstokey";
}.bindenv(this),
ovalue = function() {
stack.push({
container = container,
state = "ocomma",
key = key
});
container = {};
state = "firstokey";
}.bindenv(this),
firstavalue = function() {
stack.push({
container = container,
state = "acomma"
});
container = {};
state = "firstokey";
}.bindenv(this),
avalue = function() {
stack.push({
container = container,
state = "acomma"
});
container = {};
state = "firstokey";
}.bindenv(this)
},
action["}"] <- {
firstokey = function() {
local pop = stack.pop();
value = container;
container = ("container" in pop) ? pop.container : null;
key = ("key" in pop) ? pop.key : null;
state = pop.state;
}.bindenv(this),
ocomma = function() {
local pop = stack.pop();
container[key] <- value;
value = container;
container = ("container" in pop) ? pop.container : null;
key = ("key" in pop) ? pop.key : null;
state = pop.state;
}.bindenv(this)
},
action["["] <- {
go = function() {
stack.push({
state = "ok"
});
container = [];
state = "firstavalue";
}.bindenv(this),
ovalue = function() {
stack.push({
container = container,
state = "ocomma",
key = key
});
container = [];
state = "firstavalue";
}.bindenv(this),
firstavalue = function() {
stack.push({
container = container,
state = "acomma"
});
container = [];
state = "firstavalue";
}.bindenv(this),
avalue = function() {
stack.push({
container = container,
state = "acomma"
});
container = [];
state = "firstavalue";
}.bindenv(this)
},
action["]"] <- {
firstavalue = function() {
local pop = stack.pop();
value = container;
container = ("container" in pop) ? pop.container : null;
key = ("key" in pop) ? pop.key : null;
state = pop.state;
}.bindenv(this),
acomma = function() {
local pop = stack.pop();
container.push(value);
value = container;
container = ("container" in pop) ? pop.container : null;
key = ("key" in pop) ? pop.key : null;
state = pop.state;
}.bindenv(this)
},
action[":"] <- {
colon = function() {
local err = false;
foreach(akey, avalue in container) {
if (akey == key) err = true;
break
}
if (err) throw "Duplicate key \"" + key + "\"";
state = "ovalue";
}.bindenv(this)
},
action[","] <- {
ocomma = function() {
container[key] <- value;
state = "okey";
}.bindenv(this),
acomma = function() {
container.push(value);
state = "avalue";
}.bindenv(this)
},
action["true"] <- {
go = function() {
value = true;
state = "ok";
}.bindenv(this),
ovalue = function() {
value = true;
state = "ocomma";
}.bindenv(this),
firstavalue = function() {
value = true;
state = "acomma";
}.bindenv(this),
avalue = function() {
value = true;
state = "acomma";
}.bindenv(this)
},
action["false"] <- {
go = function() {
value = false;
state = "ok";
}.bindenv(this),
ovalue = function() {
value = false;
state = "ocomma";
}.bindenv(this),
firstavalue = function() {
value = false;
state = "acomma";
}.bindenv(this),
avalue = function() {
value = false;
state = "acomma";
}.bindenv(this)
},
action["null"] <- {
go = function() {
value = null;
state = "ok";
}.bindenv(this),
ovalue = function() {
value = null;
state = "ocomma";
}.bindenv(this),
firstavalue = function() {
value = null;
state = "acomma";
}.bindenv(this),
avalue = function() {
value = null;
state = "acomma";
}.bindenv(this)
}
state = "go";
stack = [];
local start = 0;
try {
local result, token, tokenizer = _JSONTokenizer();
while (token = tokenizer.nextToken(str, start)) {
if ("ptfn" == token.type) {
action[token.value][state]();
} else if ("number" == token.type) {
value = token.value;
number[state]();
} else if ("string" == token.type) {
value = tokenizer.unescape(token.value);
string[state]();
}
start += token.length;
}
} catch (e) {
state = e;
}
if (state != "ok" || regexp("[^\\s]").capture(str, start)) {
local near = str.slice(start, GetMin(str.len(), start + 10));
throw "JSON Syntax Error near `" + near + "`";
}
return value;
}
function GetMin(a, b) {
return a< b ? a : b;
}
function _convert(value, type, converter) {
if ("function" == typeof converter) {
local parametercCount = 2;
if ("getinfos" in converter) {
parametercCount = converter.getinfos().parameters.len() -
1;
}
if (parametercCount == 1) {
return converter(value);
} else if (parametercCount == 2) {
return converter(value, type);
} else {
throw "Error: converter function must take 1 or 2 parameters"
}
} else if ("number" == type) {
local Ret = (value.find(".") == null && value.find("e") == null && value.find("E") == null) ? value.tointeger() : value.tofloat();
return Ret;
} else {
return value;
}
}
}
class _JSONTokenizer {
_ptfnRegex = null;
_numberRegex = null;
_stringRegex = null;
_ltrimRegex = null;
_unescapeRegex = null;
constructor() {
this._ptfnRegex = regexp("^(?:\\,|\\:|\\[|\\]|\\{|\\}|true|false|null)");
this._numberRegex = regexp("^(?:\\-?\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?)");
this._stringRegex = regexp("^(?:\\\"((?:[^\\r\\n\\t\\\\\\\"]|\\\\(?:[\"\\\\\\/trnfb]|u[0-9a-fA-F]{4}))*)\\\")");
this._ltrimRegex = regexp("^[\\s\\t\\n\\r]*");
this._unescapeRegex = regexp("\\\\(?:(?:u\\d{4})|[\\\"\\\\/bfnrt])");
}
function nextToken(str, ...) {
local start = 0;
if (vargc > 0) start = vargv[0];
local
m,
type,
token,
value,
length,
whitespaces;
whitespaces = this._leadingWhitespaces(str, start);
start += whitespaces;
if (m = this._ptfnRegex.capture(str, start)) {
value = str.slice(m[0].begin, m[0].end);
type = "ptfn";
} else if (m = this._numberRegex.capture(str, start)) {
value = str.slice(m[0].begin, m[0].end);
type = "number";
} else if (m = this._stringRegex.capture(str, start)) {
value = str.slice(m[1].begin, m[1].end);
type = "string";
} else {
return null;
}
token = {
type = type,
value = value,
length = m[0].end - m[0].begin + whitespaces
};
return token;
}
function _leadingWhitespaces(str, start) {
local r = this._ltrimRegex.capture(str, start);
if (r) {
return r[0].end - r[0].begin;
} else {
return 0;
}
}
_unescapeReplacements = {
b = "\b",
f = "\f",
n = "\n",
r = "\r",
t = "\t"
};
function unescape(str) {
local start = 0;
local res = "";
while (start< str.len()) {
local m = this._unescapeRegex.capture(str, start);
if (m) {
local token = str.slice(m[0].begin, m[0].end);
local pre = str.slice(start, m[0].begin);
res += pre;
if (token.len() == 6) {
res += token;
} else {
local char = token.slice(1);
if (char in this._unescapeReplacements) {
res += this._unescapeReplacements[char];
} else {
res += char;
}
}
} else {
res += str.slice(start);
break;
}
start = m[0].end;
}
return res;
}
}
class JSONEncoder {
static VERSION = "2.0.0";
static _maxDepth = 32;
function encode(value) {
return this._encode(value);
}
function _encode(val, ...) {
local depth = 0;
if (vargc > 0) depth = vargv[0];
if (depth > this._maxDepth) {
throw "Possible cyclic reference";
}
local
r = "",
s = "",
i = 0;
switch (typeof val) {
case "table":
case "class":
s = "";
foreach(k, v in val) {
if (typeof v != "function") {
s += ",\"" + k + "\":" + this._encode(v, depth + 1);
}
}
s = s.len() > 0 ? s.slice(1) : s;
r += "{" + s + "}";
break;
case "array":
s = "";
for (i = 0; i< val.len(); i++) {
s += "," + this._encode(val[i], depth + 1);
}
s = (i > 0) ? s.slice(1) : s;
r += "[" + s + "]";
break;
case "integer":
case "float":
case "bool":
r += val;
break;
case "null":
r += "null";
break;
case "instance":
if ("_serializeRaw" in val && typeof val._serializeRaw == "function") {
r += val._serializeRaw().tostring();
} else if ("_serialize" in val && typeof val._serialize == "function") {
r += this._encode(val._serialize(), depth + 1);
} else {
s = "";
try {
foreach(k, v in val) {
s += ",\"" + k + "\":" + this._encode(v, depth + 1);
}
} catch (e) {
foreach(k, v in val.getclass()) {
if (typeof v != "function") {
s += ",\"" + k + "\":" + this._encode(val[k], depth + 1);
}
}
}
s = s.len() > 0 ? s.slice(1) : s;
r += "{" + s + "}";
}
break;
case "blob":
r += "\"" + (val.len() ? this._escape(val.tostring()) : "") + "\"";
break;
default:
r += "\"" + this._escape(val.tostring()) + "\"";
break;
}
return r;
}
function _escape(str) {
local res = "";
for (local i = 0; i< str.len(); i++) {
local ch1 = (str[i] & 0xFF);
if ((ch1 & 0x80) == 0x00) {
ch1 = format("%c", ch1);
if (ch1 == "\"") {
res += "\\\"";
} else if (ch1 == "\\") {
res += "\\\\";
} else if (ch1 == "/") {
res += "\\/";
} else if (ch1 == "\b") {
res += "\\b";
} else if (ch1 == "\f") {
res += "\\f";
} else if (ch1 == "\n") {
res += "\\n";
} else if (ch1 == "\r") {
res += "\\r";
} else if (ch1 == "\t") {
res += "\\t";
} else if (ch1 == "\0") {
res += "\\u0000";
} else {
res += ch1;
}
} else {
if ((ch1 & 0xE0) == 0xC0) {
local ch2 = (str[++i] & 0xFF);
res += format("%c%c", ch1, ch2);
} else if ((ch1 & 0xF0) == 0xE0) {
local ch2 = (str[++i] & 0xFF);
local ch3 = (str[++i] & 0xFF);
res += format("%c%c%c", ch1, ch2, ch3);
} else if ((ch1 & 0xF8) == 0xF0) {
local ch2 = (str[++i] & 0xFF);
local ch3 = (str[++i] & 0xFF);
local ch4 = (str[++i] & 0xFF);
res += format("%c%c%c%c", ch1, ch2, ch3, ch4);
}
}
}
return res;
}
}

View File

@@ -1,204 +0,0 @@
/*
文件名:MemoryClass.nut
路径:Base/_Tool/MemoryClass.nut
创建日期:2024-09-24 08:22
文件用途:
*/
class Memory {
function alloc(Size) {
return NativePointer(Size.tostring());
}
function allocUtf8String(Str) {
return NativePointer(Str_Ptr(Str));
}
}
class NativePointer {
//大小
Size = -1;
C_Object = null;
constructor(T) {
if (type(T) == "integer") {
C_Object = L_sq_I2P(T);
} else if (type(T) == "userdata") {
C_Object = T;
} else if (type(T) == "string") {
C_Object = Sq_New_Point(T.tointeger());
Size = T;
//注册销毁伪析构
Register_Destruction(C_Object, this);
}
}
function add(intoffset) {
return NativePointer(L_sq_I2P(L_sq_P2I(this.C_Object) + intoffset));
}
function sub(intoffset) {
return NativePointer(L_sq_I2P(L_sq_P2I(this.C_Object) - intoffset));
}
function writeByteArray(arr) {
Sq_Memory_WriteByteArr(this.C_Object, arr);
}
function readByteArray(size) {
local PointB = Sq_Point2Blob(this.C_Object, size);
local arr = [];
foreach(value in PointB) {
arr.append(value);
}
return arr;
}
function write(value, type) {
local Buf = blob(0);
Buf.writen(value, type);
local arr = [];
foreach(value in Buf) {
arr.append(value);
}
writeByteArray(arr);
}
function writeS8(value) {
write(value, 'c');
}
function writeU8(value) {
write(value, 'b');
}
function writeS16(value) {
write(value, 's');
}
function writeU16(value) {
write(value, 'w');
}
function writeS32(value) {
write(value, 'i');
}
function writeU32(value) {
write(value, 'i');
}
function writeShort(value) {
write(value, 's');
}
function writeUShort(value) {
write(value, 'w');
}
function writeInt(value) {
write(value, 'i');
}
function writeUInt(value) {
write(value, 'i');
}
function writeFloat(value) {
write(value, 'f');
}
function writeDouble(value) {
write(value, 'd');
}
function read(type) {
local Buf = Sq_Point2Blob(L_sq_P2I(this.C_Object), 4);
return Buf.readn(type);
}
function readS8() {
return read('c');
}
function readU8() {
return read('b');
}
function readS16() {
return read('s');
}
function readU16() {
return read('w');
}
function readS32() {
return read('i');
}
function readU32() {
return read('i');
}
function readShort() {
return read('s');
}
function readUShort() {
return read('w');
}
function readInt() {
return read('i');
}
function readUInt() {
return read('i');
}
function readFloat() {
return read('f');
}
function readDouble() {
return read('d');
}
function readUnicodeString(...) {
if (vargc > 0) {
return Sq_Memory_ReadString(this.C_Object, vargv[0]);
} else {
return Sq_Memory_ReadString(this.C_Object);
}
}
function readUtf8String(...) {
if (vargc > 0) {
return Sq_Memory_ReadStringByUtf8(this.C_Object, vargv[0]);
} else {
return Sq_Memory_ReadStringByUtf8(this.C_Object);
}
}
function readBig5String(...) {
if (vargc > 0) {
return Sq_Memory_ReadStringByBig5(this.C_Object, vargv[0]);
} else {
return Sq_Memory_ReadStringByBig5(this.C_Object);
}
}
function readPointer() {
return Sq_ReadPoint(this.C_Object);
}
function tostring() {
return this.C_Object.tostring();
}
}

View File

@@ -1,61 +0,0 @@
/*
文件名:Pack_Class.nut
路径:Base/_Tool/Pack_Class.nut
创建日期:2025-06-30 09:24
文件用途:字节包
*/
class Packet {
//读取指针位置
Index = 0;
//内存数据
Pointer = null;
//包大小
Size = 0;
//加载包
function Load(P, S) {
Pointer = P;
Size = S;
}
//读取指针跳转
function Seek(...) {
local Pos = vargv[0];
local Mode = 0;
if(vargc > 1) Mode = vargv[1];
if (Mode == 0) {
Index = Pos;
} else if (Mode == 1) {
Index += Pos;
} else if (Mode == 2) {
Index -= Pos;
}
}
//读取整形
function GetInt() {
local Size_t = 4;
if (Index + Size_t > Size) {
print("读取包越界!");
return;
}
local Buf = NativePointer(Pointer).add(Index).readInt();
Index += Size_t;
return Buf;
}
//读取流
function GetStream(Size_t) {
if (Index + Size_t > Size) {
print("读取包越界!");
return;
}
local Np = NativePointer(Pointer).add(Index);
Np.Size = Size_t;
Index += Size_t;
return Np;
}
}

View File

@@ -1,713 +0,0 @@
/*
文件名:Script_Class.nut
路径:Base/_Tool/Script_Class.nut
创建日期:2024-10-21 14:49
文件用途:PVF读取类
*/
class BlobEx extends blob {
constructor(BaseBlob) {
blob.constructor(BaseBlob.len());
writeblob(BaseBlob);
}
function writeblob(B) {
blob.writeblob(B);
seek(0);
}
function GetUShort() {
return readn('s');
}
function GetShort() {
return readn('w');
}
function charPtrToInt(arr) {
local value = ((arr[0]) << 0) |
((arr[1]) << 8) |
((arr[2]) << 16) |
((arr[3]) << 24);
return value;
}
function GetInt() {
local CurTPos = tell();
local Ret = charPtrToInt([this[CurTPos], this[CurTPos + 1], this[CurTPos + 2], this[CurTPos + 3]]);
seek(4, 'c');
return Ret;
}
function Get256() {
local Buf = readn('c');
return (256.0 + Buf.tofloat()) % 256.0;
}
function GetFloat() {
return readn('f');
}
function GetString(count) {
local MBuf = Memory.alloc(count);
local BlobBuf = readblob(count);
local arr = [];
foreach(value in BlobBuf) {
arr.append(value);
}
MBuf.writeByteArray(arr);
return MBuf.readUtf8String(count);
}
}
Rindro_Script_Bin_Data <- [];
class _PVF_Data_ {
//数据
Data = null;
//位置
Pos = 0;
//最大值
Max = 0;
function _typeof() {
return "pvf_data";
}
constructor(gData) {
Data = gData;
Max = gData.len();
}
function Last() {
if (Pos > 0) {
Pos--;
return Get();
}
return null;
}
function Seek(i) {
if (Pos > 0 && Pos<(Max - 1)) {
Pos = i;
}
}
function Get() {
local Ret = Data[Pos];
if (Pos<(Max - 1)) {
Pos++;
}
return Ret;
}
function Eof() {
if (Pos == Max - 1)
return true;
}
function Next() {
if (Pos<(Max - 1)) {
Pos++;
return Get();
}
return null;
}
}
class Rindro_Script {
function Get_Ani_Flip_Type(data) {
switch (data) {
case 1:
return "HORIZON";
case 2:
return "VERTICAL";
case 3:
return "ALL";
default:
return "";
}
}
function Get_Ani_Effect_Type(data) {
switch (data) {
case 0:
return "NONE";
case 1:
return "DODGE";
case 2:
return "LINEARDODGE";
case 3:
return "DARK";
case 4:
return "XOR";
case 5:
return "MONOCHROME";
case 6:
return "SPACEDISTORT";
default:
return "";
}
}
function Get_Ani_Damage_Type(data) {
switch (data) {
case 0:
return "NORMAL";
case 1:
return "SUPERARMOR";
case 2:
return "UNBREAKABLE";
default:
return "";
}
}
function Get_Ani_Flag(data) {
switch (data) {
case 0:
return "LOOP";
case 1:
return "SHADOW";
case 3:
return "COORD";
case 7:
return "IMAGE_RATE";
case 8:
return "IMAGE_ROTATE";
case 9:
return "RGBA";
case 10:
return "INTERPOLATION";
case 11:
return "GRAPHIC_EFFECT";
case 12:
return "DELAY";
case 13:
return "DAMAGE_TYPE";
case 14:
return "DAMAGE_BOX";
case 15:
return "ATTACK_BOX";
case 16:
return "PLAY_SOUND";
case 17:
return "PRELOAD";
case 18:
return "SPECTRUM";
case 23:
return "SET_FLAG";
case 24:
return "FLIP_TYPE";
case 25:
return "LOOP_START";
case 26:
return "LOOP_END";
case 27:
return "CLIP";
case 28:
return "OPERATION";
default:
return "";
}
}
function endswith(Str, cmp) {
local len = cmp.len();
local EndStr = Str.slice(-len);
if (EndStr == cmp)
return true;
return false;
}
function InitLoad_String() {
if (getroottable().rawin("RindroLoadStringTable")) return;
getroottable().RindroLoadStringTable <- {};
local N_String = R_Utils.GetScriptFileReader("n_string.lst");
if (N_String) {
local IO = Sq_Point2Blob(L_sq_P2I(N_String.Buffer.C_Object), N_String.Size);
local i = 2;
while (i< N_String.Size) {
if ((N_String.Size - i) >= 10) {
IO.seek(i + 6); //内容指示位
local FindKey = IO.readn('i');
local Key = Rindro_Script.GetBinString(FindKey);
if (Key) {
local StrFilePath = Key.tolower();
local StrFile = R_Utils.GetScriptFileReader(StrFilePath, 10240000);
if (StrFile) {
local StrBuffer = StrFile.Buffer.readUtf8String(StrFile.Size);
local StrArr = split(StrBuffer, "\r\n");
foreach(index, strobj in StrArr) {
if (strobj.find(">") != null) {
local strobjarr = split(strobj, ">");
if (strobjarr.len() > 1) {
getroottable().RindroLoadStringTable.rawset(strobjarr[0], Sq_ConvertWideChar(strobjarr[1], "big5"));
}
}
}
}
}
} else break;
i += 10;
}
}
}
function GetBin() {
local BinFile = R_Utils.GetScriptFileReader("stringtable.bin", 40960000);
if (BinFile) {
local Ro = Sq_Point2Blob(L_sq_P2I(BinFile.Buffer.C_Object), BinFile.Size);
Ro = BlobEx(Ro.readblob(Ro.len()));
local Count = Ro.readn('i');
local CurrentIndex = 0;
for (local i = 0; i< Count; i++) {
Ro.seek(CurrentIndex * 4 + 4);
local StartPos = Ro.readn('i');
local EndPos = Ro.readn('i');
local Len = EndPos - StartPos;
Ro.seek(StartPos + 4);
if (Len > 0) {
local Str = Ro.GetString(Len);
Rindro_Script_Bin_Data.append(Str);
} else {
Rindro_Script_Bin_Data.append("");
}
CurrentIndex++;
}
}
}
function GetBinString(Index) {
if (!(getroottable().rawin("ENUM_TW_GROWTYPE_VERS")) || ENUM_TW_GROWTYPE_VERS >= 24112901) //24112901更新了新的读取bin文件的方式
return L_sq_StringBinById(Index);
else {
if (Index< Rindro_Script_Bin_Data.len()) return Rindro_Script_Bin_Data[Index];
return "";
}
}
function GetLoadString(Key) {
if (getroottable().RindroLoadStringTable.rawin(Key)) return getroottable().RindroLoadStringTable[Key];
else return "";
}
function UnpackData(IO, i) {
local out = "";
IO.seek(i); //内容指示位
local currentByte = IO.readn('c'); //内容指示位
local after = IO.GetInt();
switch (currentByte) {
case 10: {
IO.seek(i - 4);
local Before = IO.readn('i');
local Buf = Rindro_Script.GetBinString(after);
if (!Buf) {
Buf = "";
} else {
Buf = "<" + Before + "::" + Buf + "`" + Rindro_Script.GetLoadString(Buf) + "`>";
}
Buf = Buf + "\r\n";
out += Buf;
break;
}
case 2: {
IO.seek(-4, 'c');
local ret = IO.readn('i');
return ret;
}
case 4: {
local Bbuf = blob(4);
Bbuf.writen(after, 'i');
Bbuf.seek(0);
local Buf = Bbuf.readn('f');
out += after + '\t';
break;
}
case 6:
case 8:
case 7:
case 5: {
local Buf = Rindro_Script.GetBinString(after);
if (!Buf) Buf = "";
return Buf;
}
case 9: {
IO.seek(i + 6);
local Before = IO.readn('i');
local Buf = Rindro_Script.GetBinString(Before);
out += Rindro_Script.GetLoadString(Buf);
}
default:
out += "";
break;
}
return out;
}
function ReadEquipment(ReadObject) {
local EquipmentAtt = {};
if (ReadObject.Size >= 7) {
//创建Blob对象
local IOBUF = Sq_Point2Blob(L_sq_P2I(ReadObject.Buffer.C_Object), ReadObject.Size);
local IO = BlobEx(IOBUF.readblob(IOBUF.len()));
//以5为单步从第二位开始遍历字节
local i = 2;
while (true) {
if (i< ReadObject.Size && ReadObject.Size - i >= 5) {
local str = Rindro_Script.UnpackData(IO, i);
i += 5;
//名称
if (str == "[name]") {
local RealKey = str.slice(1, str.len() - 1);
EquipmentAtt[RealKey] <- Rindro_Script.UnpackData(IO, i);
i += 5;
}
//装备类型
else if (str == "[equipment type]") {
local Buf = Rindro_Script.UnpackData(IO, i);
EquipmentAtt["equipment_type"] <- Buf.slice(1, -1);
i += 5;
}
//称号动画
else if (str == "[custom animation]") {
local Buf = Rindro_Script.UnpackData(IO, i).tolower();
EquipmentAtt["custom_animation"] <- Buf;
i += 5;
}
//光环生成效果
else if (str == "[aurora graphic effects]") {
EquipmentAtt["Aurora"] <- {};
EquipmentAtt["Aurora"].Back <- [];
EquipmentAtt["Aurora"].Front <- [];
local Count = Rindro_Script.UnpackData(IO, i);
i += 5;
for (local z = 0; z< Count; z++) {
local Layer = Rindro_Script.UnpackData(IO, i);
i += 5;
local Path = Rindro_Script.UnpackData(IO, i).tolower();
i += 5;
if (Layer == 0) EquipmentAtt["Aurora"].Back.append(Path);
if (Layer == 1) EquipmentAtt["Aurora"].Front.append(Path);
}
i += 5;
}
//隐藏图层
else if (str == "[hide layer]") {
EquipmentAtt["hidelayer"] <- [];
while (true) {
local Buffer = Rindro_Script.UnpackData(IO, i);
i += 5;
if (Buffer == "[/hide layer]") {
break;
}
EquipmentAtt["hidelayer"].append(Buffer);
}
}
//Ani
else if (str == "[animation job]") {
local Job = Rindro_Script.UnpackData(IO, i).slice(1, -1);
local SpacePos = Job.find(" ");
if (SpacePos) {
Job = Job.slice(0, SpacePos) + Job.slice(SpacePos + 1);
}
i += 5;
EquipmentAtt["Ani_" + Job] <- {};
i += 5;
local Index1 = Rindro_Script.UnpackData(IO, i);
i += 5;
local Index2 = Rindro_Script.UnpackData(IO, i);
i += 5;
EquipmentAtt["Ani_" + Job].variation <- [Index1, Index2];
EquipmentAtt["Ani_" + Job].layer_variation <- [];
while (true) {
try {
local Ret = Rindro_Script.UnpackData(IO, i);
i += 5;
if (Ret == "[animation job]" || (Rindro_Script.endswith(Ret, "]") && Ret != "[equipment ani script]" && Ret != "[layer variation]")) {
i -= 5;
break;
} else if (Ret == "[layer variation]") {
local InfoBuf = {};
InfoBuf.Zorder <- Rindro_Script.UnpackData(IO, i);
i += 5;
InfoBuf.Path <- Rindro_Script.UnpackData(IO, i);
i += 5;
EquipmentAtt["Ani_" + Job].layer_variation.append(InfoBuf);
}
} catch (exception) {
break;
}
}
}
} else break;
}
}
return EquipmentAtt;
}
function ReadAnimation(ReadObject) {
local Ro = Sq_Point2Blob(L_sq_P2I(ReadObject.Buffer.C_Object), ReadObject.Size);
Ro = BlobEx(Ro.readblob(Ro.len()));
local AniObject = {
Img_List = [],
Frame = [],
Flag = {}
};
local Frame_Max = Ro.readn('s');
local Img_Count = Ro.readn('s');
//Img的路径读取 存入数组
for (local index = 0; index< Img_Count; index++) {
local Buf = Ro.readn('i');
local ImgPath = Ro.GetString(Buf);
//有可能Img有空路径
AniObject.Img_List.append(ImgPath);
}
//Ani头部标签数量
local Ani_H_Item_Count = Ro.readn('s');
//处理标签
for (local index = 0; index< Ani_H_Item_Count; index++) {
//标签类型
local Type = Ro.readn('s');
switch (Type) {
case 0:
case 1: {
local Key = Rindro_Script.Get_Ani_Flag(Type);
local Value = Ro.readn('c');
AniObject.Flag.rawset(Key, Value);
break;
}
case 3:
case 28: {
local Key = Rindro_Script.Get_Ani_Flag(Type);
local Value = Ro.readn('s');
AniObject.Flag.rawset(Key, Value);
break;
}
case 18:
// print("残影解析");
//此处无解析 暂时先保证运行 残影功能暂时用不上
Ro.readn('c');
Ro.readn('i');
Ro.readn('i');
Ro.readn('i');
Ro.Get256();
Ro.Get256();
Ro.Get256();
Ro.Get256();
Ro.readn('s');
break;
default:
break;
}
}
//读取每一个Img
for (local index = 0; index< Frame_Max; index++) {
//帧结构体对象
local FrameObject = {
AttackBox = [],
DamageBox = [],
Flag = {},
};
//碰撞框项目数量
local Ani_Box_Item_Count = Ro.readn('s');
for (local _i = 0; _i< Ani_Box_Item_Count; _i++) {
local Box_Type = Ro.readn('s');
local D_Box_b = [];
for (local _k = 0; _k< 6; _k++) {
D_Box_b.append(Ro.readn('i'));
}
if (Box_Type == 15) {
FrameObject.AttackBox.append(D_Box_b);
} else {
FrameObject.DamageBox.append(D_Box_b);
}
// //0是攻击框 1是受击框
// FrameObject.Box.rawset(15 - Box_Type, D_Box_b);
}
//调用的第几个Img
local Index_Buf = Ro.GetShort();
//如果等于-1说明是img路径为空
if (Index_Buf != 65535) {
FrameObject.Img_Path <- AniObject.Img_List[Index_Buf].tolower();
//Img中的PNG下标
FrameObject.Img_Index <- Ro.readn('s');
} else {
FrameObject.Img_Path <- "";
FrameObject.Img_Index <- 0;
}
//坐标
FrameObject.Pos <- {
x = Ro.readn('i'),
y = Ro.readn('i'),
};
//Img中的项目数量
local Img_Flag_Count = Ro.readn('s');
for (local _o = 0; _o< Img_Flag_Count; _o++) {
local Img_Flag_Type = Ro.readn('s');
local Key;
local Value;
switch (Img_Flag_Type) {
case 0:
case 1:
case 10:
Key = Rindro_Script.Get_Ani_Flag(Img_Flag_Type);
Value = Ro.readn('c');
FrameObject.Flag.rawset(Key, Value);
break;
case 3:
Key = "COORD";
Value = Ro.readn('s');
FrameObject.Flag.rawset(Key, Value);
break;
case 17:
Key = "PRELOAD";
Value = 1;
FrameObject.Flag.rawset(Key, Value);
break;
case 7:
Key = "IMAGE_RATE";
Value = {
x = Ro.GetFloat(),
y = Ro.GetFloat()
};
FrameObject.Flag.rawset(Key, Value);
break;
case 8:
Key = "IMAGE_ROTATE";
Value = Ro.GetFloat();
FrameObject.Flag.rawset(Key, Value);
break;
case 9:
Key = "RGBA";
Value = [
Ro.Get256(),
Ro.Get256(),
Ro.Get256(),
Ro.Get256(),
];
FrameObject.Flag.rawset(Key, Value);
break;
case 11:
local Effect_Type = Ro.readn('s');
Key = "GRAPHIC_EFFECT_" + Rindro_Script.Get_Ani_Effect_Type(Effect_Type);
switch (Effect_Type) {
case 5:
Value = [Ro.Get256(), Ro.Get256(), Ro.Get256()];
break;
case 6:
Value = [Ro.GetShort(), Ro.GetShort()];
break;
}
FrameObject.Flag.rawset(Key, Value);
break;
case 12:
Value = Ro.readn('i');
FrameObject.Delay <- Value;
break;
case 13:
Key = "DAMAGE_TYPE";
Value = Rindro_Script.Get_Ani_Damage_Type(Ro.readn('s'));
FrameObject.Flag.rawset(Key, Value);
break;
case 16:
local SoundTempSize = Ro.readn('i');
Key = "PLAY_SOUND";
Value = Ro.GetString(SoundTempSize);
FrameObject.Flag.rawset(Key, Value);
break;
case 23:
Key = "SET_FLAG";
Value = Ro.readn('i');
FrameObject.Flag.rawset(Key, Value);
break;
case 24:
Key = "FLIP_TYPE";
Value = Rindro_Script.Get_Ani_Flip_Type(Ro.readn('s'));
FrameObject.Flag.rawset(Key, Value);
break;
case 25:
Key = "LOOP_START";
FrameObject.Flag.rawset(Key, 1);
break;
case 26:
Key = "LOOP_END";
Value = Ro.readn('i');
FrameObject.Flag.rawset(Key, Value);
break;
case 27:
Key = "CLIP";
Value = [
Ro.GetShort(),
Ro.GetShort(),
Ro.GetShort(),
Ro.GetShort(),
];
FrameObject.Flag.rawset(Key, Value);
break;
default:
break;
}
}
//每一帧都是一个结构体 存入数组中
AniObject.Frame.append(FrameObject);
}
return AniObject;
}
//获取文件并处理
function GetFileData(Path, Func) {
local N_Buffer = R_Utils.GetScriptFileReader(Path);
if (N_Buffer) {
local IO = Sq_Point2Blob(L_sq_P2I(N_Buffer.Buffer.C_Object), N_Buffer.Size);
IO = BlobEx(IO.readblob(IO.len()));
return Rindro_Script.ResolvingData(IO, Func, Path);
} else {
print(Path + "找不到文件!");
return null;
}
}
function ResolvingData(IO, Func, Path) {
local DataTable = {};
DataTable.filepath <- Path;
local DataArr = [];
local Length = IO.len();
if (Length >= 7) {
local i = 2;
while (true) {
if (i< Length && Length - i >= 5) {
local str = Rindro_Script.UnpackData(IO, i);
i += 5;
DataArr.push(str);
} else break;
}
Func(DataTable, _PVF_Data_(DataArr));
return DataTable;
}
return null;
}
}
// Rindro_Script.GetBin();
Rindro_Script.InitLoad_String();

View File

@@ -1,113 +0,0 @@
/*
文件名:CharacterInfoData.nut
路径:Base/_Z_Data/CharacterInfoData.nut
创建日期:2024-09-03 11:34
文件用途:角色信息数据
*/
//读取属性数据
function Lenheart_Character_GetAttribute(Address) {
//传入读传入不传读自己
local ObjectAddress = Address;
if (ObjectAddress == null)
ObjectAddress = L_sq_RA(0x1AB7CDC);
if (!ObjectAddress) return;
local Info = {};
//当前HP
Info.CurHp <- MemoryTool.DecodeMemoryData(ObjectAddress + 0x2BEC);
//总HP
Info.MaxHp <- L_sq_RA(ObjectAddress + 0x36A0);
//当前MP
Info.CurMp <- MemoryTool.DecodeMemoryData(ObjectAddress + 0x2BF8);
//总MP
Info.MaxMp <- L_sq_RA(ObjectAddress + 0x36A4);
//力量
Info.Strength <- MemoryTool.DecodeMemoryData(ObjectAddress + 0x2364);
//智力
Info.Intellect <- MemoryTool.DecodeMemoryData(ObjectAddress + 0x2394);
//体力
Info.Vitality <- MemoryTool.DecodeMemoryData(ObjectAddress + 0x237C);
//精神
Info.Spirit <- MemoryTool.DecodeMemoryData(ObjectAddress + 0x23AC);
//物理攻击 (没读武器精通)
Info.PhysicalAttack <- (MemoryTool.DecodeMemoryData(ObjectAddress + 0x1E54) * (Info.Strength.tofloat() * 0.004 + 1)).tointeger() + MemoryTool.DecodeMemoryData(ObjectAddress + 0x1EB4);
//魔法攻击
Info.MagicalAttack <- (MemoryTool.DecodeMemoryData(ObjectAddress + 0x1E84) * (Info.Intellect.tofloat() * 0.004 + 1)).tointeger() + MemoryTool.DecodeMemoryData(ObjectAddress + 0x1ED8);
//独立攻击力 //TODO 需要加上成长独立攻击力 需要服务端发送给我
Info.IndependentAttack <- MemoryTool.DecodeMemoryData(ObjectAddress + 0x22C8) + MemoryTool.DecodeMemoryData(ObjectAddress + 0x22F8);
//物理防御
Info.PhysicalDefend <- MemoryTool.DecodeMemoryData(ObjectAddress + 0x273C);
//魔法防御
Info.MagicalDefend <- MemoryTool.DecodeMemoryData(ObjectAddress + 0x276C);
//物理暴击
Info.PhysicalCrit <- MemoryTool.DecodeMemoryDataF(ObjectAddress + 0x1F14);
//魔法暴击
Info.MagicalCrit <- MemoryTool.DecodeMemoryDataF(ObjectAddress + 0x1F20);
//攻击速度
Info.AttackSpeed <- (MemoryTool.DecodeMemoryDataF(ObjectAddress + 0x2688) - 1.0) * 100.0;
//释放速度
Info.ReleaseSpeed <- (MemoryTool.DecodeMemoryDataF(ObjectAddress + 0x26A0) - 1.0) * 100.0;
//移动速度
Info.MoveSpeed <- (MemoryTool.DecodeMemoryDataF(ObjectAddress + 0x2670) - 1.0) * 100.0;
//抗魔值
local Kbuf = 0;
for (local i = 1; i< 13; ++i) {
local EquOffset = Rindro_GetEquAddr(i);
local AbAddress = L_sq_RA(ObjectAddress + EquOffset);
if (AbAddress) {
Kbuf += MemoryTool.DecodeMemoryData(AbAddress + 0xAD4);
}
}
Info.AntiMagic <- Kbuf;
//命中率
Info.HitRate <- MemoryTool.DecodeMemoryDataF(ObjectAddress + 0x1F50);
//闪避率
Info.DodgeRate <- MemoryTool.DecodeMemoryDataF(ObjectAddress + 0x1C50);
//HP回复量
Info.HPRecovery <- MemoryTool.DecodeMemoryData(ObjectAddress + 0x1D64) * 1.6;
//MP回复量
Info.MPRecovery <- MemoryTool.DecodeMemoryData(ObjectAddress + 0x1D7C) * 7.2;
//僵直度
Info.StunRate <- MemoryTool.DecodeMemoryData(ObjectAddress + 0x1DF4);
//硬直
Info.StunResist <- MemoryTool.DecodeMemoryData(ObjectAddress + 0x1DDC);
//火属性强化
Info.FireStrength <- MemoryTool.DecodeMemoryData(ObjectAddress + 0x1B54);
//冰属性强化
Info.IceStrength <- MemoryTool.DecodeMemoryData(ObjectAddress + 0x1B60);
//光属性强化
Info.LightStrength <- MemoryTool.DecodeMemoryData(ObjectAddress + 0x1B78);
//暗属性强化
Info.DarkStrength <- MemoryTool.DecodeMemoryData(ObjectAddress + 0x1B6C);
//火属性抗性
Info.FireResist <- MemoryTool.DecodeMemoryData(ObjectAddress + 0x1AF4);
//冰属性抗性
Info.IceResist <- MemoryTool.DecodeMemoryData(ObjectAddress + 0x1B00);
//光属性抗性
Info.LightResist <- MemoryTool.DecodeMemoryData(ObjectAddress + 0x1B18);
//暗属性抗性
Info.DarkResist <- MemoryTool.DecodeMemoryData(ObjectAddress + 0x1B0C);
//名望值
Info.Fame <- 0;
//最终伤害
Info.FinalDamage <- 0;
return Info;
}
// function Rindro_GetCharacterInfoCallBack(Chunk) {
// local Jso = Json.Decode(Chunk);
// Jso.op <- 20069011;
// Jso.Info <- Lenheart_Character_GetAttribute(null);
// Rindro_BaseToolClass.SendPackEx(Jso);
// }
// Pack_Control.rawset(20069010, Rindro_GetCharacterInfoCallBack);

View File

@@ -12,11 +12,14 @@
"Base/_Tool/Image_Class.nut",
"Base/_Tool/Animation_Class.nut",
"Base/_Tool/Item_Class.nut",
"Base/_Tool/CustomAnimation_Class.nut",
"Base/_Z_Data/Global.nut",
"Base/CallBack/PackControl.nut",
"Base/CallBack/DrawMain.nut",
"Base/CallBack/DrawHudMain.nut",
"Base/CallBack/PushDamage.nut",
"Base/CallBack/GetDamageRate.nut",
"Base/CallBack/RegistPushString.nut",
"Base/_Z_Data/CharacterInfoData.nut",
"Base/UI/Lenheart_Cursor_Class.nut",
"Base/UI/OldWindowsMap.nut",
@@ -54,8 +57,110 @@
"CSBase/Interface.nut"
],
"ProjectScript": {
"换装系统": {
"Private": true,
"Script": [
"Project/OutfitSystem/OutfitSystem_Component.nut",
"Project/OutfitSystem/OutfitSystem.nut"
],
"info": {
"ProjectAuthor": "官方 (期限:月)",
"ProjectVersion": "1.0.0",
"ProjectDescribe": "换装系统",
"ImageMini": "http://49.234.27.222:8651/dps/download2/Image:chengjiu.png"
}
},
"黄金哥布林袖珍罐": {
"Private": true,
"Script": [
"Project/TreasureGoblin/TreasureGoblin.nut"
],
"info": {
"ProjectAuthor": "官方 (期限:月)",
"ProjectVersion": "1.0.0",
"ProjectDescribe": "黄金哥布林袖珍罐",
"ImageMini": "http://49.234.27.222:8651/dps/download2/Image:chengjiu.png"
}
},
"异界装备升级": {
"Private": true,
"Script": [
"Project/ItemTool/ItemOtherWolrdUpgrade/ItemOtherWolrdUpgrade.nut"
],
"info": {
"ProjectAuthor": "官方 (期限:月)",
"ProjectVersion": "1.0.0",
"ProjectDescribe": "异界装备升级",
"ImageMini": "http://49.234.27.222:8651/dps/download2/Image:chengjiu.png"
}
},
"誉名录": {
"Private": true,
"Script": [
"Project/NewTitle/TitleButton.nut",
"Project/NewTitle/NewTitle.nut"
],
"info": {
"ProjectAuthor": "官方 (期限:月)",
"ProjectVersion": "1.0.0",
"ProjectDescribe": "新的称号簿",
"ImageMini": "http://49.234.27.222:8651/dps/download2/Image:chengjiu.png"
}
},
"装备拓展": {
"Private": true,
"Script": [
"Project/NewItemInfoWindow/NewItemInfoWindow.nut"
],
"info": {
"ProjectAuthor": "官方 (期限:月)",
"ProjectVersion": "1.0.0",
"ProjectDescribe": "修复道具数量显示",
"ImageMini": "http://49.234.27.222:8651/dps/download2/Image:chengjiu.png"
}
},
"灵魂救赎武器": {
"Private": true,
"Script": [
"Project/SoulSalvation/SoulSalvation.nut",
"Project/SoulSalvation/SoulSalvation_Upgrade.nut",
"Project/SoulSalvation/SoulSalvation_Enchant.nut"
],
"info": {
"ProjectAuthor": "官方 (期限:月)",
"ProjectVersion": "1.0.0",
"ProjectDescribe": "灵魂救赎武器",
"ImageMini": "http://49.234.27.222:8651/dps/download2/Image:chengjiu.png"
}
},
"修复道具数量显示": {
"Private": true,
"Script": [
"Project/FixItemCout/FixItemCout.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/ExpandEquipment/ExpandEquipment.nut"
],
"info": {
"ProjectAuthor": "官方 (期限:月)",
"ProjectVersion": "1.0.0",
"ProjectDescribe": "NPC交易定制插件",
"ImageMini": "http://49.234.27.222:8651/dps/download2/Image:chengjiu.png"
}
},
"修炼场": {
"Private": true,
"Enabled": false,
"Script": [
"Project/Trainingroom/Training_SummonMonster.nut",
"Project/Trainingroom/Training_ModifyAttributes.nut",
@@ -72,6 +177,7 @@
},
"融合装备": {
"Private": true,
"Enabled": false,
"Script": [
"Project/ItemTool/ItemFusion/ItemFusion.nut"
],
@@ -119,6 +225,7 @@
},
"赛利亚的热忱": {
"Private": true,
"Enabled": false,
"Script": [
"Project/SeriaZeal/SeriaZeal.nut"
],
@@ -162,6 +269,7 @@
},
"累计奖励": {
"price": 10,
"Enabled": false,
"Script": [
"Project/CumulativeReward/CumulativeReward.nut"
],
@@ -206,6 +314,7 @@
},
"世界BOSS": {
"price": 100,
"Enabled": false,
"Script": [
"Project/WorldBoss/WorldBoss.nut"
],
@@ -292,6 +401,7 @@
},
"世界BOSS毁梦": {
"Private": true,
"Enabled": false,
"price": 100,
"Script": [
"Project/WorldBoss/WorldBoss_HM.nut"
@@ -300,13 +410,26 @@
"ProjectAuthor": "100",
"ProjectVersion": "1.0.0",
"ProjectDescribe": "🔥 打破原版桎梏,重塑世界 BOSS 核心乐趣",
"ProjectDetails": [
]
"ProjectDetails": []
},
"imgPath": "WorldBoss"
},
"毁梦装备继承": {
"Private": true,
"Enabled": false,
"Script": [
"Project/SpecialCustomization/HM_Inherit.nut"
],
"info": {
"ProjectAuthor": "官方 (期限:月)",
"ProjectVersion": "1.0.0",
"ProjectDescribe": "毁梦装备继承",
"ImageMini": "http://49.234.27.222:8651/dps/download2/Image:chengjiu.png"
}
},
"仓库锁": {
"Private": true,
"Enabled": false,
"price": 100,
"Script": [
"Project/WarehouseLock/WarehouseLock.nut"
@@ -315,13 +438,13 @@
"ProjectAuthor": "100",
"ProjectVersion": "1.0.0",
"ProjectDescribe": "🔥 打破原版桎梏,重塑世界 BOSS 核心乐趣",
"ProjectDetails": [
]
"ProjectDetails": []
},
"imgPath": "WorldBoss"
},
"圣者遗物箱": {
"price": 30,
"Enabled": false,
"Script": [
"Project/AncientheroLuckyBox/AncientheroLuckyBox.nut"
],
@@ -352,6 +475,7 @@
},
"皮肤仓库": {
"price": 25,
"Enabled": false,
"Script": [
"Project/SkinHub/SkinHub.nut"
],
@@ -378,6 +502,7 @@
},
"收集箱": {
"price": 50,
"Enabled": false,
"Script": [
"Project/CollectionBox/CollectionBox.nut"
],
@@ -400,6 +525,7 @@
},
"伤害控制": {
"price": 10,
"Enabled": false,
"Script": [],
"info": {
"ProjectAuthor": "10",
@@ -416,6 +542,7 @@
},
"战令": {
"price": 60,
"Enabled": false,
"Script": [
"Project/AradPass/AradPass_Help.nut",
"Project/AradPass/AradPass_Quest.nut",
@@ -464,6 +591,7 @@
},
"秒伤统计": {
"price": 0,
"Enabled": false,
"Script": [
"Project/DamagePerSecond/DamagePerSecond.nut"
],
@@ -490,6 +618,7 @@
},
"土罐": {
"price": 25,
"Enabled": false,
"Script": [
"Project/Tuguan/Tuguan.nut"
],
@@ -520,6 +649,7 @@
},
"上线公告": {
"price": 0,
"Enabled": false,
"Script": [
"Project/OnlineAnnouncement/OnlineAnnouncement.nut"
],
@@ -542,6 +672,7 @@
},
"时装变身": {
"price": 0,
"Enabled": false,
"Script": [
"Project/Shapeshifting/Shapeshifting.nut"
],
@@ -568,6 +699,7 @@
},
"战力系统": {
"price": 50,
"Enabled": false,
"Script": [
"Project/CombatRank/CombatRank.nut"
],
@@ -594,6 +726,7 @@
},
"安图恩": {
"price": 200,
"Enabled": false,
"Script": [
"Project/Anton/Rindro_Anton_CreateParty.nut",
"Project/Anton/Rindro_Anton_FightSituation.nut",
@@ -723,6 +856,7 @@
},
"卢克": {
"price": 200,
"Enabled": false,
"Script": [
"Project/Luke/Rindro_Luke_CreateParty.nut",
"Project/Luke/Rindro_Luke_FightSituation.nut",
@@ -826,6 +960,114 @@
},
"imgPath": "Luke"
},
"超时空": {
"price": 300,
"Enabled": false,
"Script": [
"Project/Fiendwar/FiendFightLogic.nut",
"Project/Fiendwar/Rindro_Fiendwar_CreateParty.nut",
"Project/Fiendwar/FiendwarHallGoBossDgn.nut",
"Project/Fiendwar/FiendwarFightSituation.nut",
"Project/Fiendwar/FiendwarNoti.nut",
"Project/Fiendwar/Rindro_Fiendwar_Party.nut",
"Project/Fiendwar/Rindro_Fiendwar_PartyApplyJoin.nut",
"Project/Fiendwar/Rindro_Fiendwar_PartyFormation.nut",
"Project/Fiendwar/Rindro_Fiendwar_PartyHall.nut",
"Project/Fiendwar/Rindro_Fiendwar_PartyInfo.nut",
"Project/Fiendwar/Rindro_Fiendwar_PartyMemberInfo.nut",
"Project/Fiendwar/Rindro_Fiendwar_PlayerInteractive.nut",
"Project/Fiendwar/FiendReward.nut",
"Project/Fiendwar/Rindro_Fiendwar.nut"
],
"info": {
"ProjectAuthor": "200",
"ProjectVersion": "1.0.0",
"ProjectDescribe": "一比一复刻!卢克攻坚战 完全体!",
"ProjectDetails": [
{
"type": "str",
"content": "99%机制还原。"
},
{
"type": "str",
"content": "加载插件后要启动19频道作为卢克攻坚战频道。"
},
{
"type": "img",
"content": "1"
},
{
"type": "str",
"content": "频道将会限制只能够在卢克区域活动!"
},
{
"type": "str",
"content": "通过游戏菜单中的寻找队伍,打开攻坚战队伍界面,在这里可以创建与加入攻坚队!"
},
{
"type": "img",
"content": "4"
},
{
"type": "img",
"content": "13"
},
{
"type": "str",
"content": "独家功能1:进团时队长能看到申请人信息,战斗力会直接读登录器的战斗力表!"
},
{
"type": "img",
"content": "5"
},
{
"type": "str",
"content": "独家功能2:攻坚队队内聊天"
},
{
"type": "img",
"content": "6"
},
{
"type": "str",
"content": "独家功能3:头像直接读取当前时装"
},
{
"type": "img",
"content": "7"
},
{
"type": "str",
"content": "独家功能4:后台配置表里可以直接对卢克难度进行调整适合原版、微变、超变的服务器不用麻烦的改pvf副本难度"
},
{
"type": "str",
"content": "独家功能5:可以对全攻坚队复活币使用进行限制"
},
{
"type": "img",
"content": "8"
},
{
"type": "str",
"content": "独家功能6:有简易战况表,可以在没打开大攻坚战况表的的情况下知道了解攻坚状态"
},
{
"type": "img",
"content": "9"
},
{
"type": "str",
"content": "独家功能7:可以设定通关多少次副本才能领取翻牌奖励(也可设置站甲板即可翻牌)"
},
{
"type": "img",
"content": "12"
}
]
},
"imgPath": "Luke"
},
"世界地图修补": {
"price": 0,
"Script": [
@@ -846,6 +1088,7 @@
},
"成就系统": {
"Private": true,
"Enabled": false,
"Script": [
"Project/Achievement/Achievement.nut"
],
@@ -858,6 +1101,7 @@
},
"新成就系统": {
"Private": true,
"Enabled": false,
"price": 999,
"Script": [
"Project/Achievement_New/Achievement_New.nut"
@@ -871,6 +1115,7 @@
},
"定制-交易行": {
"Private": true,
"Enabled": false,
"price": 999,
"Script": [
"Project/Exchange/Exchange.nut",
@@ -885,6 +1130,7 @@
},
"桃花定制战力系统": {
"Private": true,
"Enabled": false,
"price": 999,
"Script": [
"Project/TH_CombatRank/TH_CombatRank.nut"
@@ -898,6 +1144,7 @@
},
"毁梦定制战力系统": {
"Private": true,
"Enabled": false,
"price": 999,
"Script": [
"Project/HM_CombatRank/HM_CombatRank.nut"
@@ -911,6 +1158,7 @@
},
"宿命魂石": {
"Private": true,
"Enabled": false,
"price": 999,
"Script": [
"Project/FatalismStone/FatalismStone_Stone.nut",
@@ -926,6 +1174,7 @@
},
"宽屏UI": {
"Private": true,
"Enabled": false,
"Script": [
"Project/HudUi/HudUi.nut"
],
@@ -938,6 +1187,7 @@
},
"NPC交易": {
"Private": true,
"Enabled": false,
"Script": [
"Project/NpcTransaction/NpcTransaction.nut"
],
@@ -973,6 +1223,21 @@
]
},
"imgPath": "HorseGuessing"
},
"露露定制内容": {
"Private": true,
"Enabled": false,
"price": 999,
"Script": [
"Project/CustomPlugins/lulu/ExpandEquipment.nut",
"Project/CustomPlugins/lulu/ObjectConvert.nut"
],
"info": {
"ProjectAuthor": "官方 (期限:月)",
"ProjectVersion": "1.0.0",
"ProjectDescribe": "定制的拓展装备 定制的对象转换",
"ImageMini": "http://49.234.27.222:8651/dps/download2/Image:chengjiu.png"
}
}
}
}

View File

@@ -0,0 +1,390 @@
/*
文件名:ExpandEquipment.nut
路径:Project/CustomPlugins/lulu/ExpandEquipment.nut
创建日期:2026-02-10 14:18
文件用途:
*/
class ExpandEquipmentC {
//回调集合信息
FuncMapInfo = null;
//全身装备的ID
EquipIndexList = null;
constructor() {
FuncMapInfo = {};
EquipIndexList = {};
GenerateEquipmentFunctionMap();
RegisterCallback();
}
function Proc(obj) {
//在副本中 附加AP的逻辑
if (sq_GetCurrentModuleType() == 3) {
local appendage = CNSquirrelAppendage.sq_GetAppendage(obj, "appendage/appendage_plugins.nut");
if (!appendage) {
CNSquirrelAppendage.sq_AppendAppendage(obj, obj, -1, true, "appendage/appendage_plugins.nut", true);
}
} else {
local appendage = CNSquirrelAppendage.sq_GetAppendage(obj, "appendage/appendage_plugins.nut");
if (appendage) {
CNSquirrelAppendage.sq_RemoveAppendage(obj, "appendage/appendage_plugins.nut");
}
}
//检测身上的装备逻辑
local ReloadFlag = false;
local NewEquipList = {};
for (local i = 1; i< 13; ++i) {
//编号
local Index = L_sq_GetCharacterAttribute(0x1c, i);
if (Index) {
NewEquipList.rawset(Index, true);
}
}
foreach(Index, _v in NewEquipList) {
if (!EquipIndexList.rawin(Index)) {
ReloadFlag = true;
if (FuncMapInfo.rawin("[on equipment event]")) {
if (FuncMapInfo["[on equipment event]"].rawin(Index)) {
local FuncName = FuncMapInfo["[on equipment event]"][Index];
getroottable()[FuncName](obj, Index);
}
}
if (getroottable().rawin("onEquipment")) {
getroottable().onEquipment(obj, Index);
}
}
}
foreach(Index, _v in EquipIndexList) {
if (!NewEquipList.rawin(Index)) {
ReloadFlag = true;
if (FuncMapInfo.rawin("[on deequipment event]")) {
if (FuncMapInfo["[on deequipment event]"].rawin(Index)) {
local FuncName = FuncMapInfo["[on deequipment event]"][Index];
getroottable()[FuncName](obj, Index);
}
}
if (getroottable().rawin("onDeequipment")) {
getroottable().onEquipment(obj, Index);
}
}
}
if (ReloadFlag) {
ReloadFlag = false;
EquipIndexList = {};
GenerateEquipmentFunctionMap();
}
}
function RegisterCallback() {
_o_procAppend_All_Map_["ExpandEquipmentC"] <- function(obj) {
if (FuncMapInfo.rawin("[on proc event]")) {
foreach(Func in FuncMapInfo["[on proc event]"]) {
getroottable()[Func](obj);
}
}
}.bindenv(this);
_o_onBeforeAttack_All_Map_["ExpandEquipmentC"] <- function(obj, damager, boundingBox, isStuck) {
if (FuncMapInfo.rawin("[on before attack event]")) {
foreach(Func in FuncMapInfo["[on before attack event]"]) {
getroottable()[Func](obj, damager, boundingBox, isStuck);
}
}
}.bindenv(this);
_o_onAfterAttack_All_Map_["ExpandEquipmentC"] <- function(obj, damager, boundingBox, isStuck) {
if (FuncMapInfo.rawin("[on after attack event]")) {
foreach(Func in FuncMapInfo["[on after attack event]"]) {
getroottable()[Func](obj, damager, boundingBox, isStuck);
}
}
}.bindenv(this);
_o_onAttackParent_appendage_plugins_Map_["ExpandEquipmentC"] <- function(appendage, realAttacker, damager, boundingBox, isStuck) {
if (FuncMapInfo.rawin("[on attack event]")) {
foreach(Func in FuncMapInfo["[on attack event]"]) {
getroottable()[Func](appendage, realAttacker, damager, boundingBox, isStuck);
}
}
}.bindenv(this);
_o_onBeforeDamage_All_Map_["ExpandEquipmentC"] <- function(obj) {
if (FuncMapInfo.rawin("[on before damage event]")) {
foreach(Func in FuncMapInfo["[on before damage event]"]) {
getroottable()[Func](obj);
}
}
}.bindenv(this);
_o_onDamageParent_appendage_plugins_Map_["ExpandEquipmentC"] <- function(appendage, attacker, boundingBox, isStuck) {
if (FuncMapInfo.rawin("[on damage event]")) {
foreach(Func in FuncMapInfo["[on damage event]"]) {
getroottable()[Func](appendage, attacker, boundingBox, isStuck);
}
}
}.bindenv(this);
_o_onSetHp_appendage_plugins_Map_["ExpandEquipmentC"] <- function(appendage, hp, attacker) {
if (FuncMapInfo.rawin("[on set hp event]")) {
local ret = -1;
foreach(Func in FuncMapInfo["[on set hp event]"]) {
ret = getroottable()[Func](appendage, hp, attacker);
}
return ret;
}
return -1;
}.bindenv(this);
_o_sendSetMpPacket_All_Map_["ExpandEquipmentC"] <- function(obj, mp, sendInstant) {
if (FuncMapInfo.rawin("[on set mp event]")) {
foreach(Func in FuncMapInfo["[on set mp event]"]) {
getroottable()[Func](obj, mp, sendInstant);
}
}
}.bindenv(this);
_o_onApplyHpDamage_appendage_plugins_Map_["ExpandEquipmentC"] <- function(appendage, newHpDamage, attacker) {
if (FuncMapInfo.rawin("[on apply damage event]")) {
local ret = newHpDamage;
foreach(Func in FuncMapInfo["[on apply damage event]"]) {
ret = getroottable()[Func](appendage, ret, attacker);
}
return ret;
}
return newHpDamage;
}.bindenv(this);
_o_getImmuneTypeDamageRate_appendage_plugins_Map_["ExpandEquipmentC"] <- function(appendage, damageRate, attacker) {
if (FuncMapInfo.rawin("[on immune damage event]")) {
local ret = damageRate;
foreach(Func in FuncMapInfo["[on immune damage event]"]) {
ret = getroottable()[Func](appendage, ret, attacker);
}
return ret;
}
return damageRate;
}.bindenv(this);
_o_onDestroyObject_appendage_plugins_Map_["ExpandEquipmentC"] <- function(appendage, destroyObj) {
if (FuncMapInfo.rawin("[on destroy object event]")) {
local ret = true;
foreach(Func in FuncMapInfo["[on destroy object event]"]) {
ret = getroottable()[Func](appendage, destroyObj);
}
return ret;
}
return true;
}.bindenv(this);
_o_onStartDungeon_All_Map_["ExpandEquipmentC"] <- function(obj) {
if (FuncMapInfo.rawin("[on start dungeon event]")) {
foreach(Func in FuncMapInfo["[on start dungeon event]"]) {
getroottable()[Func](obj);
}
}
}.bindenv(this);
_o_onStartMap_All_Map_["ExpandEquipmentC"] <- function(obj) {
if (FuncMapInfo.rawin("[on start map event]")) {
foreach(Func in FuncMapInfo["[on start map event]"]) {
getroottable()[Func](obj);
}
}
}.bindenv(this);
_o_onEndMap_All_Map_["ExpandEquipmentC"] <- function(obj) {
if (FuncMapInfo.rawin("[on end map event]")) {
foreach(Func in FuncMapInfo["[on end map event]"]) {
getroottable()[Func](obj);
}
}
}.bindenv(this);
_o_onChangeSkillEffect_All_Map_["ExpandEquipmentC"] <- function(obj, skillIndex, reciveData) {
if (FuncMapInfo.rawin("[on send effect packet event]")) {
foreach(Func in FuncMapInfo["[on send effect packet event]"]) {
getroottable()[Func](obj, skillIndex, reciveData);
}
}
}.bindenv(this);
_o_useSkill_before_All_Map_["ExpandEquipmentC"] <- function(obj, skillIndex, consumeMp, consumeItem, oldSkillMpRate) {
if (FuncMapInfo.rawin("[on before use skill event]")) {
foreach(Func in FuncMapInfo["[on before use skill event]"]) {
getroottable()[Func](obj, skillIndex, consumeMp, consumeItem, oldSkillMpRate);
}
}
}.bindenv(this);
_o_useSkill_after_All_Map_["ExpandEquipmentC"] <- function(obj, skillIndex, consumeMp, consumeItem, oldSkillMpRate) {
if (FuncMapInfo.rawin("[on after use skill event]")) {
foreach(Func in FuncMapInfo["[on after use skill event]"]) {
getroottable()[Func](obj, skillIndex, consumeMp, consumeItem, oldSkillMpRate);
}
}
}.bindenv(this);
_o_setState_All_Map_["ExpandEquipmentC"] <- function(obj, state, datas, isResetTimer) {
if (FuncMapInfo.rawin("[on set state event]")) {
foreach(Func in FuncMapInfo["[on set state event]"]) {
getroottable()[Func](obj, state, datas, isResetTimer);
}
}
}.bindenv(this);
OnSetCharacter_Control["ExpandEquipmentC"] <- function() {
FuncMapInfo = {};
GenerateEquipmentFunctionMap();
}.bindenv(this);
}
// 生成穿戴函数回调
function GenerateEquipmentFunctionMap() {
//获取全身装备编号
EquipIndexList = {};
for (local i = 1; i< 13; ++i) {
//编号
local Index = L_sq_GetCharacterAttribute(0x1c, i);
if (Index) EquipIndexList.rawset(Index, true);
}
foreach(Index, _v in EquipIndexList) {
local Info = GetSingleEquipmentInfo(Index);
if (Info.len() > 0) {
foreach(FuncType, FuncName in Info) {
if (!FuncMapInfo.rawin(FuncType)) {
FuncMapInfo[FuncType] <- {};
}
FuncMapInfo[FuncType].rawset(Index, FuncName);
}
}
}
}
// GetSingleEquipmentInfo 回调函数
function GetSingleEquipmentInfo(Index) {
local FuncMap = {};
local FilePath = R_Utils.GetEquPath(Index);
if (FilePath) {
FuncMap = Rindro_Script.GetFileData("equipment/" + FilePath, function(DataTable, Data) {
while (!Data.Eof()) {
local Fragment = Data.Get();
if (
Fragment == "[on equipment event]" ||
Fragment == "[on deequipment event]" ||
Fragment == "[on proc event]" ||
Fragment == "[on before attack event]" ||
Fragment == "[on attack event]" ||
Fragment == "[on after attack event]" ||
Fragment == "[on before damage event]" ||
Fragment == "[on damage event]" ||
Fragment == "[on set hp event]" ||
Fragment == "[on set mp event]" ||
Fragment == "[on apply damage event]" ||
Fragment == "[on immune damage event]" ||
Fragment == "[on start dungeon event]" ||
Fragment == "[on start map event]" ||
Fragment == "[on end map event]" ||
Fragment == "[on send effect packet event]" ||
Fragment == "[on before use skill event]" ||
Fragment == "[on after use skill event]" ||
Fragment == "[on set state event]" ||
Fragment == "[on destroy object event]"
) {
local FuncName = Data.Get();
DataTable.rawset(Fragment, FuncName);
}
}
});
FuncMap.rawdelete("filepath");
}
return FuncMap;
}
}
getroottable().rawdelete("ExpandEquipment_Obj");
function Lenheart_ExpandEquipment_Fun(obj) {
local RootTab = getroottable();
if (!RootTab.rawin("ExpandEquipment_Obj")) {
RootTab.rawset("ExpandEquipment_Obj", ExpandEquipmentC());
}
RootTab["ExpandEquipment_Obj"].Proc(obj);
}
getroottable()["LenheartBaseFuncTab"].rawset("ExpandEquipmentFuncN", Lenheart_ExpandEquipment_Fun);
/*
function on_equipment_109000001(Index) {}
function on_deequipment_109000001(Index) {}
function on_proc_109000001(obj) {}
function on_before_attack_109000001(obj, damager, boundingBox, isStuck) {}
function on_attack_109000001(appendage, realAttacker, damager, boundingBox, isStuck) {}
function on_after_attack_109000001(obj, damager, boundingBox, isStuck) {}
function on_before_damage_109000001(obj) {}
function on_damage_109000001(appendage, attacker, boundingBox, isStuck) {}
function on_set_hp_109000001(appendage, hp, attacker) {}
function on_set_mp_109000001(obj, mp, sendInstant) {}
function on_apply_damage_109000001(appendage, newHpDamage, attacker) {}
function on_immune_damage_109000001(appendage, damageRate, attacker) {}
function on_start_dungeon_109000001(obj) {}
function on_start_map_109000001(obj) {}
function on_end_map_109000001(obj) {}
function on_send_effect_packet_109000001(obj, skillIndex, reciveData) {}
function on_before_use_skill_109000001(obj, skillIndex, consumeMp, consumeItem, oldSkillMpRate) {}
function on_after_use_skill_109000001(obj, skillIndex, consumeMp, consumeItem, oldSkillMpRate) {}
function on_set_state_109000001(obj, state, datas, isResetTimer) {}
function on_destroy_object_109000001(appendage, destroyObj) {}
*/

View File

@@ -0,0 +1,15 @@
/*
文件名:ObjectConvert.nut
路径:Project/CustomPlugins/lulu/ObjectConvert.nut
创建日期:2026-02-09 23:33
文件用途:
*/
function sq_GetCNRDObjectToPassiveObject(obj) {
return L_Sq_ObjectAddressToSqrObject(L_Sq_GetObjectAddress(obj), "CNRDPassiveObject", 0);
}
function sq_GetCNRDObjectToSQRPassiveObject(obj) {
return L_Sq_ObjectAddressToSqrObject(L_Sq_GetObjectAddress(obj), "CNSquirrelPassiveObject", 0);
}

View File

@@ -0,0 +1,385 @@
/*
文件名:ExpandEquipment.nut
路径:Project/ExpandEquipment/ExpandEquipment.nut
创建日期:2026-01-03 00:29
文件用途:
*/
class ExpandEquipmentC {
//回调集合信息
FuncMapInfo = null;
//全身装备的ID
EquipIndexList = null;
constructor() {
FuncMapInfo = {};
EquipIndexList = {};
GenerateEquipmentFunctionMap();
RegisterCallback();
}
function Proc(obj) {
//在副本中 附加AP的逻辑
if (sq_GetCurrentModuleType() == 3) {
local appendage = CNSquirrelAppendage.sq_GetAppendage(obj, "appendage/appendage_plugins.nut");
if (!appendage) {
CNSquirrelAppendage.sq_AppendAppendage(obj, obj, -1, true, "appendage/appendage_plugins.nut", true);
}
} else {
local appendage = CNSquirrelAppendage.sq_GetAppendage(obj, "appendage/appendage_plugins.nut");
if (appendage) {
CNSquirrelAppendage.sq_RemoveAppendage(obj, "appendage/appendage_plugins.nut");
}
}
//检测身上的装备逻辑
local ReloadFlag = false;
local NewEquipList = {};
for (local i = 1; i< 13; ++i) {
//编号
local Index = L_sq_GetCharacterAttribute(0x1c, i);
if (Index) {
NewEquipList.rawset(Index, true);
}
}
foreach(Index, _v in NewEquipList) {
if (!EquipIndexList.rawin(Index)) {
ReloadFlag = true;
if (FuncMapInfo.rawin("[on equipment event]")) {
if (FuncMapInfo["[on equipment event]"].rawin(Index)) {
local FuncName = FuncMapInfo["[on equipment event]"][Index];
getroottable()[FuncName](obj, Index);
}
}
}
}
foreach(Index, _v in EquipIndexList) {
if (!NewEquipList.rawin(Index)) {
ReloadFlag = true;
if (FuncMapInfo.rawin("[on deequipment event]")) {
if (FuncMapInfo["[on deequipment event]"].rawin(Index)) {
local FuncName = FuncMapInfo["[on deequipment event]"][Index];
getroottable()[FuncName](obj, Index);
}
}
}
}
if (ReloadFlag) {
ReloadFlag = false;
EquipIndexList = {};
GenerateEquipmentFunctionMap();
}
}
function RegisterCallback() {
_o_procAppend_All_Map_["ExpandEquipmentC"] <- function(obj) {
if (FuncMapInfo.rawin("[on proc event]")) {
foreach(Func in FuncMapInfo["[on proc event]"]) {
getroottable()[Func](obj);
}
}
}.bindenv(this);
_o_onBeforeAttack_All_Map_["ExpandEquipmentC"] <- function(obj, damager, boundingBox, isStuck) {
if (FuncMapInfo.rawin("[on before attack event]")) {
foreach(Func in FuncMapInfo["[on before attack event]"]) {
getroottable()[Func](obj, damager, boundingBox, isStuck);
}
}
}.bindenv(this);
_o_onAfterAttack_All_Map_["ExpandEquipmentC"] <- function(obj, damager, boundingBox, isStuck) {
if (FuncMapInfo.rawin("[on after attack event]")) {
foreach(Func in FuncMapInfo["[on after attack event]"]) {
getroottable()[Func](obj, damager, boundingBox, isStuck);
}
}
}.bindenv(this);
_o_onAttackParent_appendage_plugins_Map_["ExpandEquipmentC"] <- function(appendage, realAttacker, damager, boundingBox, isStuck) {
if (FuncMapInfo.rawin("[on attack event]")) {
foreach(Func in FuncMapInfo["[on attack event]"]) {
getroottable()[Func](appendage, realAttacker, damager, boundingBox, isStuck);
}
}
}.bindenv(this);
_o_onBeforeDamage_All_Map_["ExpandEquipmentC"] <- function(obj) {
if (FuncMapInfo.rawin("[on before damage event]")) {
foreach(Func in FuncMapInfo["[on before damage event]"]) {
getroottable()[Func](obj);
}
}
}.bindenv(this);
_o_onDamageParent_appendage_plugins_Map_["ExpandEquipmentC"] <- function(appendage, attacker, boundingBox, isStuck) {
if (FuncMapInfo.rawin("[on damage event]")) {
foreach(Func in FuncMapInfo["[on damage event]"]) {
getroottable()[Func](appendage, attacker, boundingBox, isStuck);
}
}
}.bindenv(this);
_o_onSetHp_appendage_plugins_Map_["ExpandEquipmentC"] <- function(appendage, hp, attacker) {
if (FuncMapInfo.rawin("[on set hp event]")) {
local ret = -1;
foreach(Func in FuncMapInfo["[on set hp event]"]) {
ret = getroottable()[Func](appendage, hp, attacker);
}
return ret;
}
return -1;
}.bindenv(this);
_o_sendSetMpPacket_All_Map_["ExpandEquipmentC"] <- function(obj, mp, sendInstant) {
if (FuncMapInfo.rawin("[on set mp event]")) {
foreach(Func in FuncMapInfo["[on set mp event]"]) {
getroottable()[Func](obj, mp, sendInstant);
}
}
}.bindenv(this);
_o_onApplyHpDamage_appendage_plugins_Map_["ExpandEquipmentC"] <- function(appendage, newHpDamage, attacker) {
if (FuncMapInfo.rawin("[on apply damage event]")) {
local ret = newHpDamage;
foreach(Func in FuncMapInfo["[on apply damage event]"]) {
ret = getroottable()[Func](appendage, ret, attacker);
}
return ret;
}
return newHpDamage;
}.bindenv(this);
_o_getImmuneTypeDamageRate_appendage_plugins_Map_["ExpandEquipmentC"] <- function(appendage, damageRate, attacker) {
if (FuncMapInfo.rawin("[on immune damage event]")) {
local ret = damageRate;
foreach(Func in FuncMapInfo["[on immune damage event]"]) {
ret = getroottable()[Func](appendage, ret, attacker);
}
return ret;
}
return damageRate;
}.bindenv(this);
_o_onDestroyObject_appendage_plugins_Map_["ExpandEquipmentC"] <- function(appendage, destroyObj) {
if (FuncMapInfo.rawin("[on destroy object event]")) {
local ret = true;
foreach(Func in FuncMapInfo["[on destroy object event]"]) {
ret = getroottable()[Func](appendage, destroyObj);
}
return ret;
}
return true;
}.bindenv(this);
_o_onStartDungeon_All_Map_["ExpandEquipmentC"] <- function(obj) {
if (FuncMapInfo.rawin("[on start dungeon event]")) {
foreach(Func in FuncMapInfo["[on start dungeon event]"]) {
getroottable()[Func](obj);
}
}
}.bindenv(this);
_o_onStartMap_All_Map_["ExpandEquipmentC"] <- function(obj) {
if (FuncMapInfo.rawin("[on start map event]")) {
foreach(Func in FuncMapInfo["[on start map event]"]) {
getroottable()[Func](obj);
}
}
}.bindenv(this);
_o_onEndMap_All_Map_["ExpandEquipmentC"] <- function(obj) {
if (FuncMapInfo.rawin("[on end map event]")) {
foreach(Func in FuncMapInfo["[on end map event]"]) {
getroottable()[Func](obj);
}
}
}.bindenv(this);
_o_onChangeSkillEffect_All_Map_["ExpandEquipmentC"] <- function(obj, skillIndex, reciveData) {
if (FuncMapInfo.rawin("[on send effect packet event]")) {
foreach(Func in FuncMapInfo["[on send effect packet event]"]) {
getroottable()[Func](obj, skillIndex, reciveData);
}
}
}.bindenv(this);
_o_useSkill_before_All_Map_["ExpandEquipmentC"] <- function(obj, skillIndex, consumeMp, consumeItem, oldSkillMpRate) {
if (FuncMapInfo.rawin("[on before use skill event]")) {
foreach(Func in FuncMapInfo["[on before use skill event]"]) {
getroottable()[Func](obj, skillIndex, consumeMp, consumeItem, oldSkillMpRate);
}
}
}.bindenv(this);
_o_useSkill_after_All_Map_["ExpandEquipmentC"] <- function(obj, skillIndex, consumeMp, consumeItem, oldSkillMpRate) {
if (FuncMapInfo.rawin("[on after use skill event]")) {
foreach(Func in FuncMapInfo["[on after use skill event]"]) {
getroottable()[Func](obj, skillIndex, consumeMp, consumeItem, oldSkillMpRate);
}
}
}.bindenv(this);
_o_setState_All_Map_["ExpandEquipmentC"] <- function(obj, state, datas, isResetTimer) {
if (FuncMapInfo.rawin("[on set state event]")) {
foreach(Func in FuncMapInfo["[on set state event]"]) {
getroottable()[Func](obj, state, datas, isResetTimer);
}
}
}.bindenv(this);
OnSetCharacter_Control["ExpandEquipmentC"] <- function() {
FuncMapInfo = {};
GenerateEquipmentFunctionMap();
}.bindenv(this);
}
// 生成穿戴函数回调
function GenerateEquipmentFunctionMap() {
//获取全身装备编号
EquipIndexList = {};
for (local i = 1; i< 13; ++i) {
//编号
local Index = L_sq_GetCharacterAttribute(0x1c, i);
if (Index) EquipIndexList.rawset(Index, true);
}
foreach(Index, _v in EquipIndexList) {
local Info = GetSingleEquipmentInfo(Index);
if (Info.len() > 0) {
foreach(FuncType, FuncName in Info) {
if (!FuncMapInfo.rawin(FuncType)) {
FuncMapInfo[FuncType] <- {};
}
FuncMapInfo[FuncType].rawset(Index, FuncName);
}
}
}
}
// GetSingleEquipmentInfo 回调函数
function GetSingleEquipmentInfo(Index) {
local FuncMap = {};
local FilePath = R_Utils.GetEquPath(Index);
if (FilePath) {
FuncMap = Rindro_Script.GetFileData("equipment/" + FilePath, function(DataTable, Data) {
while (!Data.Eof()) {
local Fragment = Data.Get();
if (
Fragment == "[on equipment event]" ||
Fragment == "[on deequipment event]" ||
Fragment == "[on proc event]" ||
Fragment == "[on before attack event]" ||
Fragment == "[on attack event]" ||
Fragment == "[on after attack event]" ||
Fragment == "[on before damage event]" ||
Fragment == "[on damage event]" ||
Fragment == "[on set hp event]" ||
Fragment == "[on set mp event]" ||
Fragment == "[on apply damage event]" ||
Fragment == "[on immune damage event]" ||
Fragment == "[on start dungeon event]" ||
Fragment == "[on start map event]" ||
Fragment == "[on end map event]" ||
Fragment == "[on send effect packet event]" ||
Fragment == "[on before use skill event]" ||
Fragment == "[on after use skill event]" ||
Fragment == "[on set state event]" ||
Fragment == "[on destroy object event]"
) {
local FuncName = Data.Get();
DataTable.rawset(Fragment, FuncName);
}
}
});
FuncMap.rawdelete("filepath");
}
return FuncMap;
}
}
getroottable().rawdelete("ExpandEquipment_Obj");
function Lenheart_ExpandEquipment_Fun(obj) {
local RootTab = getroottable();
if (!RootTab.rawin("ExpandEquipment_Obj")) {
RootTab.rawset("ExpandEquipment_Obj", ExpandEquipmentC());
}
RootTab["ExpandEquipment_Obj"].Proc(obj);
}
getroottable()["LenheartBaseFuncTab"].rawset("ExpandEquipmentFuncN", Lenheart_ExpandEquipment_Fun);
/*
function on_equipment_109000001(Index) {}
function on_deequipment_109000001(Index) {}
function on_proc_109000001(obj) {}
function on_before_attack_109000001(obj, damager, boundingBox, isStuck) {}
function on_attack_109000001(appendage, realAttacker, damager, boundingBox, isStuck) {}
function on_after_attack_109000001(obj, damager, boundingBox, isStuck) {}
function on_before_damage_109000001(obj) {}
function on_damage_109000001(appendage, attacker, boundingBox, isStuck) {}
function on_set_hp_109000001(appendage, hp, attacker) {}
function on_set_mp_109000001(obj, mp, sendInstant) {}
function on_apply_damage_109000001(appendage, newHpDamage, attacker) {}
function on_immune_damage_109000001(appendage, damageRate, attacker) {}
function on_start_dungeon_109000001(obj) {}
function on_start_map_109000001(obj) {}
function on_end_map_109000001(obj) {}
function on_send_effect_packet_109000001(obj, skillIndex, reciveData) {}
function on_before_use_skill_109000001(obj, skillIndex, consumeMp, consumeItem, oldSkillMpRate) {}
function on_after_use_skill_109000001(obj, skillIndex, consumeMp, consumeItem, oldSkillMpRate) {}
function on_set_state_109000001(obj, state, datas, isResetTimer) {}
function on_destroy_object_109000001(appendage, destroyObj) {}
*/

View File

@@ -1,190 +0,0 @@
/*
文件名:FiendFightLogic.nut
路径:Plugins/Fiendwar/FiendFightLogic.nut
创建日期:2024-05-27 19:18
文件用途:超时空战斗逻辑
*/
class FiendFightLogicC {
//进入BOSS房间发包告诉服务端的Flag
IsBossActiveMsgPackFlag = false;
constructor() {
//注册回调包
Pack_Control.rawset(20063030, SetCharacterDamageRate.bindenv(this));
Pack_Control.rawset(20063600, CreatePassiveObjectById.bindenv(this));
Pack_Control.rawset(20063602, GetBossHp.bindenv(this));
Pack_Control.rawset(20063604, SetBossHp.bindenv(this));
Pack_Control.rawset(20063608, CheckMonsterIsV.bindenv(this));
}
//检测怪物是否存在
function CheckMonsterIsV(Chunk) {
if (!IsBossActiveMsgPackFlag) return;
local Jso = Json.Decode(Chunk);
local Idx = Jso.id;
local ObjectBuf = GetObjectByIndex(Idx);
if (!ObjectBuf) {
local T = {
op = 20063609,
id = Idx
}
Rindro_BaseToolClass.SendPack(T);
}
}
//设置BOSS生命值
function SetBossHp(Chunk) {
if (!IsBossActiveMsgPackFlag) return;
local Jso = Json.Decode(Chunk);
local BossObject = GetObjectByIndex(210994);
//没找到BOSS
if (!BossObject) {
local T = {
op = 20063605,
}
Rindro_BaseToolClass.SendPack(T);
} else {
BossObject.setHp(Jso.hp, null, true);
}
}
//获取BOSS生命值
function GetBossHp(Chunk) {
if (!IsBossActiveMsgPackFlag) return;
local BossObject = GetObjectByIndex(210994);
local curthp = -1;
local rmaxhp = -1;
//找到BOSS
if (BossObject) {
curthp = BossObject.getHp();
rmaxhp = BossObject.getHpMax();
}
local T = {
op = 20063603,
hp = curthp,
maxhp = rmaxhp
}
Rindro_BaseToolClass.SendPack(T);
}
//设置伤害值回调
function SetCharacterDamageRate(Chunk) {
local Jso = Json.Decode(Chunk);
local Rate = Jso.damageMarkup.tofloat() / 100.0;
//超时空伤害设置
if (getroottable().rawin("LenheartFiendModuleDamageRate")) {
getroottable()["LenheartFiendModuleDamageRate"] = Rate;
}
}
//召唤PassiveObject回调
function CreatePassiveObjectById(Chunk) {
local Jso = Json.Decode(Chunk);
local ObjectId = Jso.id;
local ZPos = Jso.z;
//确保在BOSS房间才召唤免得游戏崩溃
if (IsBossActiveMsgPackFlag) {
local obj = sq_GetMyMasterCharacter();
obj = sq_GetCNRDObjectToActiveObject(obj);
// obj.sq_SendCreatePassiveObjectPacket(ObjectId, 0, 99999990, 0, ZPos);
// sq_SendCreatePassiveObjectPacketFromPassivePos(obj, ObjectId, 0, 99999990, 0, ZPos);
sq_SendCreatePassiveObjectPacket(obj, ObjectId, 0, 99999990, 0, ZPos, obj.getDirection());
local Jso = {
op = 20063601,
id = ObjectId,
z = ZPos
}
Rindro_BaseToolClass.SendPack(Jso);
}
}
//获取指定对象
function GetObjectByIndex(Idx) {
local obj = sq_GetMyMasterCharacter();
obj = sq_GetCNRDObjectToActiveObject(obj);
local objectManager = obj.getObjectManager();
local CollisionObjectNumber = objectManager.getCollisionObjectNumber();
for (local i = 0; i< CollisionObjectNumber; i += 1) {
local object = objectManager.getCollisionObject(i);
if (object && object.isObjectType(OBJECTTYPE_ACTIVE)) {
local activeObj = sq_GetCNRDObjectToActiveObject(object);
local MonsterIndex = activeObj.getCollisionObjectIndex();
if (MonsterIndex == Idx) {
return activeObj;
}
}
}
return null;
}
//获取地图ID
function GetMapIndex() {
local stage = sq_GetGlobaludpModuleStage();
local MapIndex = sq_GetMapIndex(stage);
return MapIndex;
}
//检测是否在超时空BOSS图
function CheckBossIsActive() {
//如果在副本中
if (sq_GetCurrentModuleType() == 3) {
//在BOSS地图
if (GetMapIndex() == 24151) {
if (!IsBossActiveMsgPackFlag) {
IsBossActiveMsgPackFlag = true;
local Jso = {
op = 20063801
}
Rindro_BaseToolClass.SendPack(Jso);
return;
}
}
}
//退出副本以后设置flag 还原
else {
IsBossActiveMsgPackFlag = false;
}
}
//怪物死亡回调包
function MonsterDieCallBack(obj) {
//遍历怪物死亡
local objectManager = obj.getObjectManager();
local CollisionObjectNumber = objectManager.getCollisionObjectNumber();
for (local i = 0; i< CollisionObjectNumber; i += 1) {
local object = objectManager.getCollisionObject(i);
if (object && object.isObjectType(OBJECTTYPE_ACTIVE) && obj.isEnemy(object) && object.isInDamagableState(obj) && object.getTeam() != 0) {
local activeObj = sq_GetCNRDObjectToActiveObject(object);
if (activeObj.isDead()) {
local MonsterIndex = activeObj.getCollisionObjectIndex();
if (MonsterIndex >= 210994 && MonsterIndex <= 210999) {
local Jso = {
op = 20063503,
monster_id = MonsterIndex
}
Rindro_BaseToolClass.SendPack(Jso);
}
}
}
}
}
function Proc(obj) {
//如果进入BOSS房间需要告诉服务端
CheckBossIsActive();
//如果在和BOSS干架 要检测所有怪物的死亡
if (IsBossActiveMsgPackFlag) {
//怪物死亡检测
MonsterDieCallBack(obj);
}
}
}

View File

@@ -1,328 +0,0 @@
/*
文件名:FiendReward.nut
路径:Plugins/Fiendwar/FiendReward.nut
创建日期:2024-05-13 10:03
文件用途:超时空奖励
*/
class FiendRewardC extends LenheartNewUI_Windows {
//调试模式
DeBugMode = true;
//默认显示状态需要是关闭 因为要通过收包打开
Visible = false;
//奖励信息
RewardInfo = null;
//奖励动画开始时间
AniStartFlag = null;
//收到奖励包
function RewardCallBack(Chunk) {
// Sout("收到请求加入包 : \n\n\n %L", Chunk);
local Jso = Json.Decode(Chunk);
RewardInfo = Jso;
Visible = true;
AniStartFlag = Clock();
}
constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH) {
Childrens = [];
//注册控件
RegisterWidget();
LenheartNewUI_Windows.constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH);
Pack_Control.rawset(20063026, RewardCallBack.bindenv(this));
local T = {
op = 20063061,
}
Rindro_BaseToolClass.SendPackEx(T);
}
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);
}
AniName_Flag = 0;
AniActFlag = 0;
Ani_Title = null;
Ani_Time = null;
Ani_Time2 = null;
Ani_Card_1 = null;
Ani_Card_2 = null;
Ani_Card_Open_1 = null;
Ani_Card_Open_2 = null;
AniTimeStartFlag = 0;
AniRewardMyStartFlag = 0;
Ani_Card_All_1 = null;
Ani_Card_All_Open = null;
Ani_Card_All_Open_Gold = null;
AniRewardReloadFlag = 0;
AlphaValue = 0.0;
//绘制主界面
function DrawMain(obj) {
if (AniStartFlag) {
local ExiTime = Clock() - AniStartFlag;
//绘制背景
L_sq_DrawImg("interface2/fiendwar_kr/reward/fiend_reward.img", 0, X + 0, Y + 0, 1, sq_RGBA(255, 255, 255, 150), 1.0, 1.0);
//标题一阶段
Ani_Title = Rindro_BaseToolClass.T_DrawDynamicAni(obj, "common/fiendwar_kr/reward/reward_title_00.ani", X + 188, Y + 30, "超时空奖励标题1" + AniName_Flag);
if (sq_IsEnd(Ani_Title)) {
if (AniActFlag == 0) AniActFlag = 1;
}
//时间二阶段
if (AniActFlag >= 1) {
Ani_Time = Rindro_BaseToolClass.T_DrawDynamicAni(obj, "common/fiendwar_kr/reward/reward_time.ani", X + 55, Y + 120, "超时空奖励标题2" + AniName_Flag);
if (sq_IsEnd(Ani_Time)) {
if (AniActFlag == 1) AniActFlag = 2;
}
}
//时间三阶段
if (AniActFlag >= 2) {
Ani_Time2 = Rindro_BaseToolClass.T_DrawDynamicAni(obj, "common/fiendwar_kr/reward/reward_rank_00.ani", X + 570, Y + 90, "超时空奖励标题3" + AniName_Flag);
if (sq_IsEnd(Ani_Time2)) {
//记录一下时间
if (AniActFlag == 2) {
AniTimeStartFlag = Clock();
AniActFlag = 3;
}
}
}
//时间四阶段
if (AniActFlag >= 3) {
local al = sq_GetUniformVelocity(0, 100, Clock() - AniTimeStartFlag, 1500);
AlphaValue = al.tofloat() / 100.0;
local RealTime = RewardInfo.time;
local seconds = RealTime / 10;
local hours = seconds / 3600;
local minutes = seconds / 60;
seconds %= 60;
hours = format("%02d", hours);
seconds = format("%02d", seconds).slice(-2);
minutes = format("%02d", minutes).slice(-2);
local Offset = -6;
DrawImg("hud/fiendwartime.img", hours.slice(0, 1).tointeger(), X + 240 + Offset, Y + 139);
DrawImg("hud/fiendwartime.img", hours.slice(1).tointeger(), X + 260 + Offset, Y + 139);
DrawImg("hud/fiendwartime.img", 10, X + 286 + Offset, Y + 139);
Offset += 60;
DrawImg("hud/fiendwartime.img", minutes.slice(0, 1).tointeger(), X + 240 + Offset, Y + 139);
DrawImg("hud/fiendwartime.img", minutes.slice(1).tointeger(), X + 260 + Offset, Y + 139);
DrawImg("hud/fiendwartime.img", 10, X + 286 + Offset, Y + 139);
Offset += 60;
DrawImg("hud/fiendwartime.img", seconds.slice(0, 1).tointeger(), X + 240 + Offset, Y + 139);
DrawImg("hud/fiendwartime.img", seconds.slice(1).tointeger(), X + 260 + Offset, Y + 139);
Offset += 160;
local DieCount = RewardInfo.deathsNum;
local DrawDieStr = format("%02d", DieCount);
DrawImg("hud/fiendwartime.img", DrawDieStr.slice(0, 1).tointeger(), X + 240 + Offset, Y + 139);
DrawImg("hud/fiendwartime.img", DrawDieStr.slice(1).tointeger(), X + 260 + Offset, Y + 139);
if (al >= 100) {
if (AniActFlag == 3) {
AniActFlag = 4;
}
}
}
//卡牌一阶段
if (AniActFlag == 4) {
Ani_Card_1 = T_DrawDynamicAni(obj, "common/fiendwar_kr/reward/cardspread_01.ani", X + 0, Y + 30, "超时空奖励个人第一张卡牌" + AniName_Flag);
Ani_Card_2 = T_DrawDynamicAni(obj, "common/fiendwar_kr/reward/cardspread_02.ani", X + 0, Y + 30, "超时空奖励个人第二张卡牌" + AniName_Flag);
if (sq_IsEnd(Ani_Card_1) && sq_IsEnd(Ani_Card_2)) {
if (AniActFlag == 4) AniActFlag = 5;
}
}
//卡牌二阶段
if (AniActFlag == 5) {
Ani_Card_Open_1 = T_DrawDynamicAni(obj, "common/fiendwar_kr/reward/reward_card_open.ani", X + 218, Y + 280, "超时空奖励个人第一张卡牌打开" + AniName_Flag);
Ani_Card_Open_2 = T_DrawDynamicAni(obj, "common/fiendwar_kr/reward/reward_card_open.ani", X + 406, Y + 280, "超时空奖励个人第二张卡牌打开" + AniName_Flag);
if (sq_IsEnd(Ani_Card_Open_1) && sq_IsEnd(Ani_Card_Open_2)) {
if (AniActFlag == 5) {
AniRewardMyStartFlag = Clock();
AniActFlag = 6;
}
}
}
//卡牌三阶段
if (AniActFlag == 6) {
local BackGroundFlag = 0;
if (RewardInfo.rewards[0].item == -1) BackGroundFlag = 1;
DrawImg("interface2/fiendwar_kr/reward/fiend_reward.img", 23 + BackGroundFlag, X + 218, Y + 280);
DrawImg("interface2/fiendwar_kr/reward/fiend_reward.img", 23 + BackGroundFlag, X + 406, Y + 280);
DrawItemEx(X + 290, Y + 342, RewardInfo.rewards[0].item, RewardInfo.rewards[0].num, RewardInfo.pid, 0, -10);
DrawItemEx(X + 478, Y + 342, RewardInfo.rewards[0].item2, RewardInfo.rewards[0].num2, RewardInfo.pid, 0, -10);
if ((Clock() - AniRewardMyStartFlag) >= 1500) {
AniActFlag = 7;
}
}
//卡牌四阶段
if (AniActFlag == 7) {
Ani_Card_All_1 = T_DrawDynamicAni(obj, "common/fiendwar_kr/reward/cardspread_00.ani", X + 0, Y + 0, "二阶段翻牌未翻开" + AniName_Flag);
if (sq_IsEnd(Ani_Card_All_1)) {
if (AniActFlag == 7) {
Ani_Card_All_Open = array(8);
Ani_Card_All_Open_Gold = array(8);
AniActFlag = 8;
}
}
}
//卡牌五阶段
if (AniActFlag == 8) {
for (local i = 0; i< 8; i++) {
Ani_Card_All_Open[i] = T_DrawDynamicAni(obj, "common/fiendwar_kr/reward/reward_card_open.ani", X + 30 + ((i % 4) * 188), Y + 250 + ((i / 4) * 138), "超时空奖励团队卡牌打开" + "i" + AniName_Flag);
if (i<(RewardInfo.rewards2.len() - 1) && RewardInfo.rewards2[i][0].grade == 1) {
Ani_Card_All_Open_Gold[i] = T_DrawDynamicAni(obj, "common/fiendwar_kr/reward/gold_nomal.ani", X + 30 + ((i % 4) * 188), Y + 250 + ((i / 4) * 138), "超时空奖励团队卡牌打开金牌" + "i" + AniName_Flag);
}
}
if (sq_IsEnd(Ani_Card_All_Open[7])) {
if (AniActFlag == 8) {
AniActFlag = 9;
AniRewardReloadFlag = Clock();
}
}
}
//卡牌六阶段
if (AniActFlag == 9) {
for (local i = 0; i< 8; i++) {
DrawRewardCard(i);
}
//重置
if (Clock() - AniRewardReloadFlag >= 2000) {
AniActFlag = 0;
Ani_Title = null;
Ani_Time = null;
Ani_Time2 = null;
Ani_Card_1 = null;
Ani_Card_2 = null;
Ani_Card_Open_1 = null;
Ani_Card_Open_2 = null;
AniTimeStartFlag = 0;
AniRewardMyStartFlag = 0;
Ani_Card_All_1 = null;
Ani_Card_All_Open = null;
Ani_Card_All_Open_Gold = null;
AniRewardReloadFlag = 0;
AlphaValue = 0.0;
RewardInfo = null;
AniStartFlag = null;
AniName_Flag += 1;
CloseWindow();
}
}
}
}
function DrawRewardCard(Index) {
if (Index > (RewardInfo.rewards2.len() - 1)) {
DrawImg("interface2/fiendwar_kr/reward/fiend_reward.img", 24, X + 29 + ((Index % 4) * 189), Y + 250 + ((Index / 4) * 138));
return;
}
local Info = RewardInfo.rewards2[Index][0];
local BackGroundFlag = 0;
if (Info.count == 0) {
BackGroundFlag = 1;
DrawImg("interface2/fiendwar_kr/reward/fiend_reward.img", 23 + BackGroundFlag, X + 29 + ((Index % 4) * 189), Y + 250 + ((Index / 4) * 138));
DrawItemEx(X + 29 + ((Index % 4) * 189) + 72, Y + 250 + ((Index / 4) * 138) + 62, Info.item, Info.num, Index, 0, -10);
}
if (Info.count == 1) {
if (Info.grade == 1)(BackGroundFlag = -5)
DrawImg("interface2/fiendwar_kr/reward/fiend_reward.img", 23 + BackGroundFlag, X + 29 + ((Index % 4) * 189), Y + 250 + ((Index / 4) * 138));
DrawItemEx(X + 29 + ((Index % 4) * 189) + 72, Y + 250 + ((Index / 4) * 138) + 62, Info.item, Info.num, Index, 0, -10);
} else if (Info.count == 2) {
if (Info.grade == 1)(BackGroundFlag = -5)
DrawImg("interface2/fiendwar_kr/reward/fiend_reward.img", 23 + BackGroundFlag, X + 29 + ((Index % 4) * 189), Y + 250 + ((Index / 4) * 138));
DrawItemEx(X + 29 + ((Index % 4) * 189) + 72 - 20, Y + 250 + ((Index / 4) * 138) + 62, Info.item, Info.num, Index, 999999, 0);
DrawItemEx(X + 29 + ((Index % 4) * 189) + 72 + 20, Y + 250 + ((Index / 4) * 138) + 62, Info.item2, Info.num2, Index, -20, -10);
}
}
ItemInfoDrawS = null;
//绘制道具相信信息
ItemObject = null;
//绘制道具带道具信息
function DrawItemEx(X, Y, Id, Count, Pid, Flag, Flag2) {
try {
if (Flag != 999999) {
local PartyMasterIcon = FiendwarTotal.GetInstance().MyTeam.MembersList[Pid];
local XOffset = -77 + Flag;
local YOffset = -31 + Flag2;
sq_DrawBox(X + 30 + XOffset, Y + 1 + YOffset, 22, 18, PartyMasterIcon.HandBoxColor[PartyMasterIcon.InfoObj.TeamId]);
//绘制队长头像
foreach(AvatarObj in PartyMasterIcon.InfoObj.EquVos) {
local AXpos = AvatarObj.D[0] + X + PartyMasterIcon.OffsetArr[PartyMasterIcon.InfoObj.Job][0] + XOffset - 12;
local AYpos = AvatarObj.D[1] + Y + PartyMasterIcon.OffsetArr[PartyMasterIcon.InfoObj.Job][1] + YOffset;
setClip(AXpos + PartyMasterIcon.OffsetArr[PartyMasterIcon.InfoObj.Job][2], AYpos + PartyMasterIcon.OffsetArr[PartyMasterIcon.InfoObj.Job][3], AXpos + PartyMasterIcon.OffsetArr[PartyMasterIcon.InfoObj.Job][2] + 22, AYpos + PartyMasterIcon.OffsetArr[PartyMasterIcon.InfoObj.Job][3] + 18); //开始裁切
DrawImg("character/" + AvatarObj.B + ".img", AvatarObj.C, AXpos, AYpos);
releaseClip(); //裁切结束
}
local DrawName = PartyMasterIcon.InfoObj.Name;
//绘制名字
L_sq_DrawCode(DrawName, X + XOffset + 100 - LenheartTextClass.GetStringLength(DrawName) / 2, Y + YOffset + 4, sq_RGBA(247, 214, 90, 250), 0, 1);
}
if (Id != -1) {
local Rarity = AllItemInfoObject[Id].Rarity;
L_sq_DrawImg("interface2/fiendwar_kr/reward/fiend_reward.img", 5 + Rarity, X - 3, Y - 3);
L_Sq_DrawItem(X, Y, Id, Count, 0, 0, 0);
if (sq_IsIntersectRect(IMouse.GetXPos(), IMouse.GetYPos(), 1, 1, X, Y, 24, 24)) {
ItemInfoDrawS = {};
ItemInfoDrawS.X <- X;
ItemInfoDrawS.Y <- Y;
ItemInfoDrawS.ItemId <- Id;
}
}
} catch (exception) {
}
}
//绘制悬停
function DrawItemInfoF(obj) {
if (ItemInfoDrawS) {
if (!ItemObject) {
local ItemId = ItemInfoDrawS.ItemId;
if (AllItemInfoObject.rawin(ItemId)) {
ItemObject = ItemInfoClass(AllItemInfoObject[ItemId]);
}
}
ItemObject.Show(ItemInfoDrawS.X, ItemInfoDrawS.Y - ItemObject.PageLength);
} else {
ItemObject = null;
}
}
function DrawImg(Path, Index, XPos, YPos) {
L_sq_DrawImg(Path, Index, XPos, YPos, 1, sq_RGBA(255, 255, 255, (250 * AlphaValue).tointeger()), 1.0, 1.0);
}
function Show(obj) {
ItemInfoDrawS = null;
DrawMain(obj);
// DrawItemInfoF(obj);
LenheartNewUI_Windows.Show(obj);
}
//逻辑入口
function Proc(obj) {
LenheartNewUI_Windows.SyncPos(X, Y);
}
}

View File

@@ -1,188 +0,0 @@
/*
文件名:Fiendwar.nut
路径:Project/Fiendwar/Fiendwar.nut
创建日期:2024-11-16 20:19
文件用途:
*/
dofile("sqr/Project/Fiendwar/FiendwarHall.nut"); //大厅
dofile("sqr/Project/Fiendwar/FiendwarHallParty.nut"); //大厅的队伍
dofile("sqr/Project/Fiendwar/FiendwarPartyInfo.nut"); //攻坚队具体信息窗口
dofile("sqr/Project/Fiendwar/FiendwarPartyMemberInfo.nut"); //攻坚队具体信息中的队员信息UI
dofile("sqr/Project/Fiendwar/FiendwarPlayerInteractive.nut"); //攻坚队玩家交互
dofile("sqr/Project/Fiendwar/FiendwarPartyFormation.nut"); //攻坚队具体信息中的编队
dofile("sqr/Project/Fiendwar/FiendwarHallCreateParty.nut");
dofile("sqr/Project/Fiendwar/FiendwarHallApplyJoin.nut");
dofile("sqr/Project/Fiendwar/FiendwarFightSituation.nut"); //战况表
dofile("sqr/Project/Fiendwar/FiendwarHallGoBossDgn.nut"); //前往BOSS框
dofile("sqr/Project/Fiendwar/FiendwarNoti.nut"); //超时空信息分发
dofile("sqr/Project/Fiendwar/FiendReward.nut"); //超时空奖励
dofile("sqr/Project/Fiendwar/FiendFightLogic.nut"); //战斗逻辑
class FiendwarTotal extends Rindro_BaseToolClass {
//基础配置
BaseConfig = null;
/*
town_index 城镇编号
channel_index 频道编号
*/
//我的客户端cid
MyCid = null;
//我的攻坚队ID
MyPartyId = null;
//我是否是攻坚队队长
IsCaptain = null;
//我的队伍
MyTeam = null;
//开始攻坚动画
StartAniFlag = false;
//攻坚结束时间
EndTime = null;
PackCurT = null;
//全局获取对象方法
function GetInstance() {
if (getroottable().rawin("FiendwarCObj"))
return getroottable()["FiendwarCObj"];
else {
local RootTab = getroottable();
local Cobj = FiendwarTotal();
RootTab.rawset("FiendwarCObj", Cobj);
Cobj.InitWindow();
return Cobj;
}
}
//请求基础信息配置
function GetFiendwarBase() {
local T = {
op = 20063501,
}
SendPack(T);
}
//请求掉线配置信息
function GetFiendwarDown() {
local T = {
op = 20063063,
}
SendPack(T);
}
//基础信息配置
function FiendwarBase(Chunk) {
BaseConfig = Json.Decode(Chunk);
FiendwarChannelTownLogicCallBack();
}
//团本专属频道上线城镇移动包
function FiendwarChannelTownLogicCallBack() {
if (BaseConfig.channel_index.find("20")) {
if (L_sq_GetTownIndex() != BaseConfig.town_index) {
L_sq_MoveTown(BaseConfig.town_index, 0, 474, 249);
}
} else {
//在超时空区域的 要转移回普通城镇
if (L_sq_GetTownIndex() == BaseConfig.town_index) {
L_sq_MoveTown(1, 1, 474, 249);
}
}
}
//开团Flag包
function StartFight(Chunk) {
FiendwarTotal.GetInstance().StartAniFlag = true;
}
FiendwarHallC_Window = null;
FiendwarFightSituationSwitchC_Window = null;
FiendwarNotiC_Window = null;
FiendRewardC_Window = null;
FiendFightLogicC_Object = null;
constructor() {
//获取基础配置回调包
Pack_Control.rawset(20063502, FiendwarBase.bindenv(this));
Pack_Control.rawset(20063028, StartFight.bindenv(this));
//第一次上线要重新请求一下位置信息
GetFiendwarBase();
//请求掉线配置信息
GetFiendwarDown();
}
//初始化窗口
function InitWindow() {
FiendwarHallC_Window = LenheartNewUI_CreateWindow(FiendwarHallC, "超时空攻坚队伍列表", 320, 40, 478, 434, 18);
FiendwarFightSituationSwitchC_Window = LenheartNewUI_CreateWindow(FiendwarFightSituationSwitchC, "超时空战况表开关", 770, 9, 30, 30, 0);
FiendwarNotiC_Window = LenheartNewUI_CreateWindow(FiendwarNotiC, "超时空攻坚队伍消息分发", 0, 0, 0, 0, 0);
FiendRewardC_Window = LenheartNewUI_CreateWindow(FiendRewardC, "超时空奖励界面", 0, 0, 800, 600, 0);
FiendFightLogicC_Object = FiendFightLogicC();
}
function ClearInfo() {
//我的客户端cid
MyCid = null;
//我的攻坚队ID
MyPartyId = null;
//我是否是攻坚队队长
IsCaptain = null;
//我的队伍
MyTeam = null;
//开始攻坚动画
StartAniFlag = false;
//攻坚结束时间
EndTime = null;
PackCurT = null;
}
function Proc(obj) {
//开始攻坚动画
if (FiendwarTotal.GetInstance().StartAniFlag) {
local Ani = Rindro_BaseToolClass.T_DrawDynamicAni(obj, "common/fiendwar_kr/common/title/start_back.ani", 400, 260, "超时空开始攻坚Ani1");
if (sq_IsEnd(Ani)) {
FiendwarTotal.GetInstance().StartAniFlag = false;
sq_Rewind(Ani);
}
}
if (FiendFightLogicC_Object) FiendFightLogicC_Object.Proc(obj);
}
}
getroottable().rawdelete("FiendwarCObj");
function LenheartFiendwar(obj) {
local RootTab = getroottable();
if (!RootTab.rawin("FiendwarCObj")) {
local Cobj = FiendwarTotal();
RootTab.rawset("FiendwarCObj", Cobj);
Cobj.InitWindow();
} else {
RootTab["FiendwarCObj"].Proc(obj);
}
}
if (getroottable().rawin("LenheartTopFuncTab")) {
getroottable()["LenheartTopFuncTab"].rawset("LenheartFiendwarFunc", LenheartFiendwar);
} else {
local T = {};
T.rawset("LenheartFiendwarFunc", LenheartFiendwar);
getroottable().rawset("LenheartTopFuncTab", T);
}

View File

@@ -1,696 +0,0 @@
/*
文件名:FiendwarFightSituation.nut
路径:Plugins/Fiendwar/FiendwarFightSituation.nut
创建日期:2024-04-10 21:28
文件用途:超时空攻坚战况
*/
//复选框
class Fiendwar_LenheartNewUI_SwitchButton extends LenheartNewUI_CommonUi {
//透明度
AlphaValue = 1.0;
State = 0;
ImgIndex = null;
constructor(X, Y) {
LenheartNewUI_CommonUi.constructor(X, Y, 14, 15);
}
function SyncAlpha(Value) {
AlphaValue = Value;
}
function Show(obj) {
//不可用
if (State == 8) {
L_sq_DrawImg("interface/lenheartwindowcommon.img", ImgIndex ? ImgIndex + 3 : 141, X, Y + 1, 1, sq_RGBA(255, 255, 255, (250 * AlphaValue).tointeger()), 1.0, 1.0);
} else {
//悬停
if (isLBDown) {
L_sq_DrawImg("interface/lenheartwindowcommon.img", ImgIndex ? ImgIndex + 2 : 140, X, Y + 1, 1, sq_RGBA(255, 255, 255, (250 * AlphaValue).tointeger()), 1.0, 1.0);
}
//按下
else if (isInRect) {
if (State == 0)
L_sq_DrawImg("interface/lenheartwindowcommon.img", ImgIndex ? ImgIndex + 1 : 139, X, Y, 1, sq_RGBA(255, 255, 255, (250 * AlphaValue).tointeger()), 1.0, 1.0);
if (State == 1)
L_sq_DrawImg("interface/lenheartwindowcommon.img", ImgIndex ? ImgIndex + 2 : 140, X, Y, 1, sq_RGBA(255, 255, 255, (250 * AlphaValue).tointeger()), 1.0, 1.0);
}
//普通
else {
if (State == 0)
L_sq_DrawImg("interface/lenheartwindowcommon.img", ImgIndex ? ImgIndex : 138, X, Y, 1, sq_RGBA(255, 255, 255, (250 * AlphaValue).tointeger()), 1.0, 1.0);
if (State == 1)
L_sq_DrawImg("interface/lenheartwindowcommon.img", ImgIndex ? ImgIndex + 2 : 140, X, Y, 1, sq_RGBA(255, 255, 255, (250 * AlphaValue).tointeger()), 1.0, 1.0);
}
}
}
}
class Fiendwar_LenheartNewUI_ProgressIndicator extends LenheartNewUI_CommonUi {
//透明度
AlphaValue = 1.0;
//宽
DWidth = null;
//控制者
Controller = 0;
//回调函数
OnChangeControl = null;
//球的偏移 因为除不尽 所以这个最好单独写
BXposOffset = 0;
constructor(X, Y, W, H) {
this.DWidth = W;
LenheartNewUI_CommonUi.constructor(X, Y, W, H);
}
function Show(obj) {
//绘制左
L_sq_DrawImg("hud/fiendwarl.img", 19, X, Y, 1, sq_RGBA(255, 255, 255, (250 * AlphaValue).tointeger()), 1.0, 1.0);
local OffserIndex = 0;
//绘制中
for (local i = 0; i< this.DWidth; i++) {
if (i > (Controller * this.DWidth).tointeger())
OffserIndex = 0;
else OffserIndex = 1;
L_sq_DrawImg("hud/fiendwarl.img", 21 + OffserIndex, X + 8 + i, Y, 1, sq_RGBA(255, 255, 255, (250 * AlphaValue).tointeger()), 1.0, 1.0);
}
//绘制右
L_sq_DrawImg("hud/fiendwarl.img", 20, X + 8 + this.DWidth, Y, 1, sq_RGBA(255, 255, 255, (250 * AlphaValue).tointeger()), 1.0, 1.0);
// local BXposOffset = 0;
// if (BaseX && EndX) BXposOffset = EndX - BaseX;
//绘制球
L_sq_DrawImg("hud/fiendwarl.img", 23, X + BXposOffset + 1, Y + 1, 1, sq_RGBA(255, 255, 255, (250 * AlphaValue).tointeger()), 1.0, 1.0);
}
//按下时的基准X
BaseX = null;
EndX = null;
//鼠标左键按下回调
function OnMouseLbDown(MousePos_X, MousePos_Y) {
if (sq_IsIntersectRect(MousePos_X, MousePos_Y, 1, 1, X + BXposOffset + 1, Y + 1, 15, 14)) {
isLBDown = true;
if (!BaseX) BaseX = MousePos_X;
}
}
//鼠标事件回调
function OnMouseProc(Flag, MousePos_X, MousePos_Y) {
if (isLBDown && Flag == 1) {
if (MousePos_X > (X + DWidth + 8))
MousePos_X = (X + DWidth + 8);
else if (MousePos_X<(X + 8))
MousePos_X = (X + 8);
EndX = MousePos_X;
if (BaseX && EndX) {
BXposOffset = EndX - BaseX;
Controller = BXposOffset.tofloat() / DWidth.tofloat();
AlphaValue = Controller;
if (AlphaValue< 0.4) AlphaValue = 0.4;
if (OnChangeControl) OnChangeControl(Controller);
}
}
}
//鼠标左键弹起回调
function OnMouseLbUp(MousePos_X, MousePos_Y) {
isLBDown = false;
}
}
class FiendwarFightSituationC extends LenheartNewUI_Windows {
Visible = false;
//调试模式
// DeBugMode = true;
//透明度
AlphaValue = 1.0;
//简易战况表复选框
BaseSituationBtn = null;
//简易战况表是否开启
BaseSituationFlag = 0;
//雷达是否存在
RadarFlag = true;
//turret2
turret2 = true;
MonsterFace = {
m20413 = 1,
m20412 = 3,
m20411 = 4,
m20415 = 15,
m20408 = 9,
m20409 = 8,
m20405 = 5,
m20404 = 6,
m20406 = 12,
m20401 = 13,
m20402 = 10,
m20403 = 11,
};
SlotPos = [
[50, 479],
[50, 374],
[50, 270],
[140, 167],
[186, 89],
[275, 36],
[275, 141],
[411, 11],
[365, 88],
[455, 141],
[545, 36],
[141, 427],
[185, 348],
[185, 245],
[321, 271],
[411, 219],
[546, 245],
[591, 166],
[141, 530],
[276, 505],
[320, 375],
[410, 478],
[546, 504],
[456, 401],
[681, 478],
[545, 348],
[680, 374],
[725, 244],
[690, 53],
[727, 129],
]
Info = null;
PackCurT = null;
EndTime = null;
function InfoCallBack(Chunk) {
// print(Chunk);
local Jso = Json.Decode(Chunk);
Info = Jso.fightInfo.platVos;
EndTime = Jso.fightInfo.endTime;
RadarFlag = Jso.fightInfo.radar;
turret2 = Jso.fightInfo.turret2;
FiendwarTotal.GetInstance().EndTime = Jso.fightInfo.endTime;
local Pt = Clock();
PackCurT = Pt;
FiendwarTotal.GetInstance().PackCurT = Pt;
local Win = LenheartNewUI_CreateWindow(FiendwarPartyInfoC, "超时空我的队伍窗口", 430, 15, 354, 290, 18);
Win.CloseWindow();
local Win = LenheartNewUI_CreateWindow(FiendwarHallC, "超时空攻坚队伍列表", 320, 40, 478, 434, 18);
Win.CloseWindow();
}
//收到进入BOSS请求包
function GoBossCallBack(Chunk) {
local Jso = Json.Decode(Chunk);
local Win = LenheartNewUI_CreateWindow(FiendwarHallGoBossDgnC, "超时空攻坚进入罗什", 273, 225, 270, 120, 19);
Win.Visible = true;
Win.Dark = Jso.boss1;
Win.Light = Jso.boss2;
Win.RegisterWidget();
}
PlayerGiveUpTime = null;
PlayerGiveUpFlagTime = null;
//放弃副本包
function PlayerGiveUpCallBack(Chunk) {
local Jso = Json.Decode(Chunk);
PlayerGiveUpTime = Jso.endTime;
PlayerGiveUpFlagTime = Clock();
}
function GetInfo() {
local T = {
op = 20063053,
// teamsId = FiendwarTotal.GetInstance().MyPartyId
}
Rindro_BaseToolClass.SendPackEx(T);
}
constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH) {
Childrens = [];
//注册控件
RegisterWidget();
LenheartNewUI_Windows.constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH);
Pack_Control.rawset(20063016, InfoCallBack.bindenv(this));
Pack_Control.rawset(20063022, GoBossCallBack.bindenv(this));
Pack_Control.rawset(20063024, PlayerGiveUpCallBack.bindenv(this));
GetInfo();
}
function RegisterWidget() {
//关闭按钮
local CloseButton = LenheartNewUI_BaseButton(770, 0, 30, 30, "interface2/fiendwar_kr/navigation/navigationframe.img", 13);
CloseButton.OnClick = function() {
local Win = LenheartNewUI_CreateWindow(FiendwarFightSituationSwitchC, "超时空战况表开关", 770, 9, 30, 30, 0);
Win.ResetFocus();
this.Visible = false;
}.bindenv(this);
Childrens.append(CloseButton);
local PIButton = Fiendwar_LenheartNewUI_ProgressIndicator(264, 11, 80, 10);
PIButton.Controller = 1.0;
PIButton.BaseX = 273;
PIButton.EndX = 352;
PIButton.BXposOffset = 79;
PIButton.OnChangeControl = function(Controller) {
AlphaValue = Controller;
if (AlphaValue< 0.4) AlphaValue = 0.4;
}.bindenv(this);
Childrens.append(PIButton);
//简易战况表复选框
BaseSituationBtn = Fiendwar_LenheartNewUI_SwitchButton(198, 9);
BaseSituationBtn.State = 0;
BaseSituationBtn.ImgIndex = 358;
BaseSituationBtn.Width = 19;
BaseSituationBtn.Height = 19;
BaseSituationBtn.OnClick = function() {
switch (BaseSituationFlag) {
case 0:
BaseSituationFlag = 1;
break;
case 1:
BaseSituationFlag = 0;
break;
}
BaseSituationBtn.State = BaseSituationFlag;
}.bindenv(this);
AddChild(BaseSituationBtn);
}
//绘制简易动态Ani // obj -- ani路径 -- X -- Y -- ani名字
function T_DrawDynamicAni(obj, aniFileName, x, y, aniname, Alpha) {
local ani = obj.getVar().GetAnimationMap(aniname, aniFileName);
ani.setRGBA(255, 255, 255, Alpha);
sq_AnimationProc(ani);
sq_drawCurrentFrame(ani, x, y, true);
return ani;
}
function DrawParty() {
//绘制我的队伍
if (FiendwarTotal.GetInstance().MyTeam) {
local Mt = FiendwarTotal.GetInstance().MyTeam;
if (!Mt) return;
local PartyMaster;
foreach(index, PartyMasterIcon in Mt.MembersList) {
local XOffset = 0;
local YOffset = 9 + (index * 22);
DrawImg("interface2/fiendwar_kr/navigation/partyseatnumber.img", 0, X + XOffset + 10, Y + YOffset);
DrawImg("interface2/fiendwar_kr/navigation/partyseatnumber.img", PartyMasterIcon.InfoObj.TeamId, X + XOffset + 10, Y + YOffset + 1);
sq_DrawBox(X + 30 + XOffset, Y + 1 + YOffset, 22, 18, PartyMasterIcon.HandBoxColor[PartyMasterIcon.InfoObj.TeamId]);
//绘制队长头像
foreach(AvatarObj in PartyMasterIcon.InfoObj.EquVos) {
local AXpos = AvatarObj.D[0] + X + PartyMasterIcon.OffsetArr[PartyMasterIcon.InfoObj.Job][0] + XOffset - 12;
local AYpos = AvatarObj.D[1] + Y + PartyMasterIcon.OffsetArr[PartyMasterIcon.InfoObj.Job][1] + YOffset;
setClip(AXpos + PartyMasterIcon.OffsetArr[PartyMasterIcon.InfoObj.Job][2], AYpos + PartyMasterIcon.OffsetArr[PartyMasterIcon.InfoObj.Job][3], AXpos + PartyMasterIcon.OffsetArr[PartyMasterIcon.InfoObj.Job][2] + 22, AYpos + PartyMasterIcon.OffsetArr[PartyMasterIcon.InfoObj.Job][3] + 18); //开始裁切
DrawImg("character/" + AvatarObj.B + ".img", AvatarObj.C, AXpos, AYpos);
releaseClip(); //裁切结束
}
local RgbaValue = sq_RGBA(255, 255, 255, (250 * AlphaValue).tointeger());
if (PartyMasterIcon.InfoObj.Captain) RgbaValue = sq_RGBA(247, 214, 90, (250 * AlphaValue).tointeger());
if (PartyMasterIcon.InfoObj.Captain) DrawImg("hud/fiendwarl.img", 18, X + 42 + XOffset, Y + 1 + YOffset);
local DrawName = PartyMasterIcon.InfoObj.Name;
if (PlayerGiveUpTime && PlayerGiveUpTime[index]) {
local STime = ((PlayerGiveUpTime[index] - (Clock() - PlayerGiveUpFlagTime)) / 1000);
DrawName = "复活时间: " + STime.tostring() + "秒";
if (STime <= 0) DrawName = PartyMasterIcon.InfoObj.Name;
}
//绘制名字
L_sq_DrawCode(DrawName, X + XOffset + 58, Y + YOffset + 4, RgbaValue, 0, 1);
}
}
}
//绘制主界面
function DrawMain(obj) {
//绘制背景框
DrawImg("interface2/fiendwar_kr/navigation/navigationframe.img", 0, X + 7, Y);
//绘制建议进度表文字
DrawImg("interface2/fiendwar_kr/navigation/navigationframe.img", 71, X + 130, Y + 10);
//绘制透明度文字
DrawImg("interface2/fiendwar_kr/navigation/navigationframe.img", 72, X + 220, Y + 10);
DrawParty();
//Boss底层特效
T_DrawDynamicAni(obj, "common/fiendwar_kr/navigation/common/boss_effect.ani", X + 720, Y + 110, "超时空战况表背景图BOSS区域", (250 * AlphaValue).tointeger());
//下路特效
Rindro_BaseToolClass.T_DrawDynamicAni(obj, "common/fiendwar_kr/navigation/common/linebottom.ani", X + 7, Y, "超时空战况表背景图下路特效B");
//中路特效
Rindro_BaseToolClass.T_DrawDynamicAni(obj, "common/fiendwar_kr/navigation/common/linemiddle.ani", X + 7, Y, "超时空战况表背景图中路特效B");
//上路特效
Rindro_BaseToolClass.T_DrawDynamicAni(obj, "common/fiendwar_kr/navigation/common/linetop.ani", X + 7, Y, "超时空战况表背景图上路特效B");
//绘制地图
DrawImg("interface2/fiendwar_kr/navigation/navigationframe.img", 64, X + 7, Y + 1);
if (Info) {
foreach(Index, Value in Info) {
if (Value.id != -1) {
//裁切比例
local SliceRate = 0;
if (Value.e && Value.s) {
SliceRate = (Value.e.tofloat() - (Clock().tofloat() - PackCurT.tofloat())) / Value.s.tofloat();
}
//BOSS暗
if (Value.id == 28) {
DrawImg("interface2/fiendwar_kr/navigation/navigationframe.img", 60, X - 68 + SlotPos[Value.id][0], Y - 56 + SlotPos[Value.id][1]);
}
//BOSS光
else if (Value.id == 29) {
DrawImg("interface2/fiendwar_kr/navigation/navigationframe.img", 61, X - 68 + SlotPos[Value.id][0], Y - 56 + SlotPos[Value.id][1]);
}
//兵营
else if (Value.id == 10 || Value.id == 17 || Value.id == 27) {
local Offset = 0;
if (!Value.m) Offset = 7;
DrawImg("interface2/fiendwar_kr/navigation/navigationframe.img", 5 + Offset, X - 14 + SlotPos[Value.id][0], Y - 4 + SlotPos[Value.id][1]);
//复活
if (!Value.m) {
if (SliceRate != 0) {
DrawImg("interface2/fiendwar_kr/navigation/navigationframe.img", 55, X - 24 + SlotPos[Value.id][0], Y + 45 + SlotPos[Value.id][1]);
DrawProgress(50, SliceRate, X - 10 + SlotPos[Value.id][0], Y + 51 + SlotPos[Value.id][1]);
}
}
//生成小怪
else {
if (SliceRate != 0) {
DrawImg("interface2/fiendwar_kr/navigation/navigationframe.img", 54, X - 24 + SlotPos[Value.id][0], Y + 45 + SlotPos[Value.id][1]);
DrawProgress(50, SliceRate, X - 10 + SlotPos[Value.id][0], Y + 51 + SlotPos[Value.id][1]);
}
}
}
//前哨
else if (Value.id == 7 || Value.id == 15 || Value.id == 24) {
local Offset = 0;
if (!Value.m) Offset = 7;
DrawImg("interface2/fiendwar_kr/navigation/navigationframe.img", 4 + Offset, X - 14 + SlotPos[Value.id][0], Y - 4 + SlotPos[Value.id][1]);
if (SliceRate != 0) {
DrawImg("interface2/fiendwar_kr/navigation/navigationframe.img", 54, X - 24 + SlotPos[Value.id][0], Y + 45 + SlotPos[Value.id][1]);
DrawProgress(50, SliceRate, X - 10 + SlotPos[Value.id][0], Y + 51 + SlotPos[Value.id][1]);
}
} else if (Value.id == 6 || Value.id == 23) {
//雷达
if (Value.id == 6) {
local Offset = 0;
if (!Value.m) Offset = 7;
DrawImg("interface2/fiendwar_kr/navigation/navigationframe.img", 2 + Offset, X - 14 + SlotPos[Value.id][0], Y - 4 + SlotPos[Value.id][1]);
}
//炮塔
else if (Value.id == 23) {
local Offset = 0;
if (!Value.m) Offset = 7;
DrawImg("interface2/fiendwar_kr/navigation/navigationframe.img", 3 + Offset, X - 14 + SlotPos[Value.id][0], Y - 4 + SlotPos[Value.id][1]);
}
}
//基地和出发点一定有框
if (Value.id == 0 || Value.id == 1 || Value.id == 11 || Value.id == 18) {
DrawImg("interface2/fiendwar_kr/navigation/navigationframe.img", 25, X - 10 + SlotPos[Value.id][0], Y + SlotPos[Value.id][1]);
//基地两边都画
if (Value.id == 0) {
DrawImg("interface2/fiendwar_kr/navigation/navigationframe.img", 26, X - 30 + SlotPos[Value.id][0], Y - 1 + SlotPos[Value.id][1]);
DrawImg("interface2/fiendwar_kr/navigation/navigationframe.img", 26, X + 33 + SlotPos[Value.id][0], Y - 1 + SlotPos[Value.id][1]);
}
} else {
//有怪物
if (Value.m || Value.n) {
if (Value.m) {
DrawImg("interface2/fiendwar_kr/navigation/navigationframe.img", 25, X - 10 + SlotPos[Value.id][0], Y + SlotPos[Value.id][1]);
DrawImg("interface2/fiendwar_kr/navigation/navigationframe.img", 27, X + 36 + SlotPos[Value.id][0], Y - 1 + SlotPos[Value.id][1]);
//如果不是这些 那就是移动怪 并且活着
if (Value.id != 10 && Value.id != 17 && Value.id != 27 && Value.id != 28 && Value.id != 29 && Value.id != 7 && Value.id != 15 && Value.id != 24 && Value.id != 6 && Value.id != 23 && !Value.n) {
//没人打
if (Value.u.len()< 1) {
if (SliceRate != 0) {
DrawImg("interface2/fiendwar_kr/navigation/navigationframe.img", 56, X - 24 + SlotPos[Value.id][0], Y + 45 + SlotPos[Value.id][1]);
DrawProgress(52, SliceRate, X - 10 + SlotPos[Value.id][0], Y + 51 + SlotPos[Value.id][1]);
}
}
//战斗中
else {
if (SliceRate != 0) {
DrawImg("interface2/fiendwar_kr/navigation/navigationframe.img", 53, X - 24 + SlotPos[Value.id][0], Y + 45 + SlotPos[Value.id][1]);
DrawProgress(49, SliceRate, X - 10 + SlotPos[Value.id][0], Y + 51 + SlotPos[Value.id][1]);
}
}
}
} else if (Value.n) {
DrawImg("interface2/fiendwar_kr/navigation/navigationframe.img", 25, X - 10 + SlotPos[Value.id][0], Y + SlotPos[Value.id][1]);
DrawImg("interface2/fiendwar_kr/navigation/navigationframe.img", 59, X + 36 + SlotPos[Value.id][0], Y - 1 + SlotPos[Value.id][1]);
}
DrawImg("interface2/fiendwar_kr/navigation/monsterface.img", 14, X + 37 + SlotPos[Value.id][0], Y + SlotPos[Value.id][1]);
DrawImg("interface2/fiendwar_kr/navigation/navigationframe.img", 98, X + 38 + SlotPos[Value.id][0], Y + 37 + SlotPos[Value.id][1]);
}
}
//如果有玩家
if (Value.u.len() >= 1) {
DrawImg("interface2/fiendwar_kr/navigation/navigationframe.img", 25, X - 10 + SlotPos[Value.id][0], Y + SlotPos[Value.id][1]);
DrawImg("interface2/fiendwar_kr/navigation/navigationframe.img", 26, X - 30 + SlotPos[Value.id][0], Y - 1 + SlotPos[Value.id][1]);
//说明有战斗
if (Value.m) {
//战斗特效
T_DrawDynamicAni(obj, "common/fiendwar_kr/navigation/common/hexagon_ef_red.ani", X - 32 + SlotPos[Value.id][0], Y - 25 + SlotPos[Value.id][1], "超时空战况表战斗方格", (250 * AlphaValue).tointeger());
} else {
//TODO 这里判断有没有商人 没有商人画绿色 有画黄色
T_DrawDynamicAni(obj, "common/fiendwar_kr/navigation/common/hexagon_ef_green.ani", X - 32 + SlotPos[Value.id][0], Y - 25 + SlotPos[Value.id][1], "超时空战况表安全方格", (250 * AlphaValue).tointeger());
}
//绘制队伍编号
foreach(index, pos in Value.u) {
DrawImg("interface2/fiendwar_kr/navigation/navigationframe.img", 28 + pos, X - 24 + SlotPos[Value.id][0], Y + (index * 11) + 2 + SlotPos[Value.id][1]);
}
}
//雷达死完要绘制怪物头像
if (!RadarFlag) {
if (Value.m || Value.n) {
local ImgIndex = 0;
if (Value.m && MonsterFace.rawin("m" + Value.m)) ImgIndex = MonsterFace["m" + Value.m];
DrawImg("interface2/fiendwar_kr/navigation/monsterface.img", ImgIndex, X + 37 + SlotPos[Value.id][0], Y + SlotPos[Value.id][1]);
}
}
}
}
}
DrawFightTime(obj);
}
function DrawImg(Path, Index, XPos, YPos) {
L_sq_DrawImg(Path, Index, XPos, YPos, 1, sq_RGBA(255, 255, 255, (250 * AlphaValue).tointeger()), 1.0, 1.0);
}
function DrawProgress(Index, SliceRate, X, Y) {
if (!turret2) return;
if (RadarFlag) SliceRate = 1.0;
DrawImg("interface2/fiendwar_kr/navigation/navigationframe.img", 48, X, Y);
setClip(X, Y, X + (SliceRate * 61.0).tointeger(), Y + 3); //开始裁切
DrawImg("interface2/fiendwar_kr/navigation/navigationframe.img", Index, X, Y);
releaseClip(); //裁切结束
}
function Show(obj) {
DrawMain(obj);
LenheartNewUI_Windows.Show(obj);
}
//攻坚时间
function DrawFightTime(obj) {
L_sq_DrawImg("interface2/fiendwar_kr/navigation/navigationframe.img", 47, X + 576, Y - 9);
if (EndTime) {
local RealTime = EndTime - (Clock() - PackCurT);
local seconds = RealTime / 1000;
local hours = seconds / 3600;
local minutes = seconds / 60;
seconds %= 60;
hours = format("%02d", hours);
seconds = format("%02d", seconds).slice(-2);
minutes = format("%02d", minutes).slice(-2);
local Offset = 0;
L_sq_DrawImg("interface2/fiendwar_kr/navigation/timenumberset.img", hours.slice(0, 1).tointeger(), X + 657 + Offset, Y + 2);
L_sq_DrawImg("interface2/fiendwar_kr/navigation/timenumberset.img", hours.slice(1).tointeger(), X + 669 + Offset, Y + 2);
Offset += 38;
L_sq_DrawImg("interface2/fiendwar_kr/navigation/timenumberset.img", minutes.slice(0, 1).tointeger(), X + 657 + Offset, Y + 2);
L_sq_DrawImg("interface2/fiendwar_kr/navigation/timenumberset.img", minutes.slice(1).tointeger(), X + 669 + Offset, Y + 2);
Offset += 38;
L_sq_DrawImg("interface2/fiendwar_kr/navigation/timenumberset.img", seconds.slice(0, 1).tointeger(), X + 657 + Offset, Y + 2);
L_sq_DrawImg("interface2/fiendwar_kr/navigation/timenumberset.img", seconds.slice(1).tointeger(), X + 669 + Offset, Y + 2);
}
}
MainButton = null;
//逻辑入口
function Proc(obj) {
//在基地
if (L_sq_GetRegionIndex() == 2) DrawParty();
if (getroottable().rawin("FiendwarTotal") && FiendwarTotal.GetInstance().EndTime) {
DrawFightTime(obj);
L_sq_DrawImg("interface2/fiendwar_kr/navigation/navigationframe.img", 13, X + 770, Y);
}
// //界面未打开
// if (!this.Visible) {
// //在甲板
// if (FiendwarTotal.GetInstance().BaseConfig && FiendwarTotal.GetInstance().BaseConfig.channel_index.find("20") && L_sq_GetTownIndex() == FiendwarTotal.GetInstance().BaseConfig.town_index && L_sq_GetRegionIndex() >= 1) {
// if (!MainButton) {
// MainButton = LenheartBaseButton(X + 770, Y, 30, 30, "interface2/fiendwar_kr/navigation/navigationframe.img", 13);
// } else {
// MainButton.Show();
// if (MainButton.isLBActive()) {
// this.Visible = true;
// GetInfo();
// }
// }
// }
// }
LenheartNewUI_Windows.SyncPos(X, Y);
}
}
/*
文件名:FiendwarHallCreateParty.nut
路径:Plugins/Fiendwar/FiendwarHallCreateParty.nut
创建日期:2024-03-18 13:20
文件用途:
*/
class FiendwarFightSituationSwitchC extends LenheartNewUI_Windows {
//调试模式
// DeBugMode = true;
//不要窗口模式
NoWindow = true;
function GetInfo() {
local T = {
op = 20063053,
// teamsId = FiendwarTotal.GetInstance().MyPartyId
}
Rindro_BaseToolClass.SendPackEx(T);
}
constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH) {
Childrens = [];
//关闭按钮
local CloseButton = LenheartNewUI_BaseButton(0, 0, 30, 30, "interface2/fiendwar_kr/navigation/navigationframe.img", 13);
CloseButton.OnClick = function() {
local Win = LenheartNewUI_CreateWindow(FiendwarFightSituationC, "超时空攻坚战况表", 0, 8, 800, 600, 0);
Win.Visible = true;
Win.ResetFocus();
GetInfo();
}.bindenv(this);
AddChild(CloseButton);
LenheartNewUI_Windows.constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH);
}
//绘制主界面
function DrawMain(obj) {
if (FiendwarTotal.GetInstance().EndTime)
DrawFightTime(obj);
}
//攻坚时间
function DrawFightTime(obj) {
L_sq_DrawImg("interface2/fiendwar_kr/navigation/navigationframe.img", 47, X + 576, Y - 9);
if (FiendwarTotal.GetInstance().EndTime) {
local RealTime = FiendwarTotal.GetInstance().EndTime - (Clock() - FiendwarTotal.GetInstance().PackCurT);
local seconds = RealTime / 1000;
local hours = seconds / 3600;
local minutes = seconds / 60;
seconds %= 60;
hours = format("%02d", hours);
seconds = format("%02d", seconds).slice(-2);
minutes = format("%02d", minutes).slice(-2);
local Offset = 0;
L_sq_DrawImg("interface2/fiendwar_kr/navigation/timenumberset.img", hours.slice(0, 1).tointeger(), X + 657 + Offset, Y + 2);
L_sq_DrawImg("interface2/fiendwar_kr/navigation/timenumberset.img", hours.slice(1).tointeger(), X + 669 + Offset, Y + 2);
Offset += 38;
L_sq_DrawImg("interface2/fiendwar_kr/navigation/timenumberset.img", minutes.slice(0, 1).tointeger(), X + 657 + Offset, Y + 2);
L_sq_DrawImg("interface2/fiendwar_kr/navigation/timenumberset.img", minutes.slice(1).tointeger(), X + 669 + Offset, Y + 2);
Offset += 38;
L_sq_DrawImg("interface2/fiendwar_kr/navigation/timenumberset.img", seconds.slice(0, 1).tointeger(), X + 657 + Offset, Y + 2);
L_sq_DrawImg("interface2/fiendwar_kr/navigation/timenumberset.img", seconds.slice(1).tointeger(), X + 669 + Offset, Y + 2);
}
}
function CloseWindow() {
// print(1233);
// local Win = LenheartNewUI_CreateWindow(FiendwarFightSituationSwitchC, "超时空战况表开关", 770, 9, 30, 30, 0);
// Win.Visible = true;
// Win.ResetFocus();
// LenheartNewUI_Windows.CloseWindow();
}
function Show(obj) {
DrawMain(obj);
LenheartNewUI_Windows.Show(obj);
}
//逻辑入口
function Proc(obj) {
if (!FiendwarTotal.GetInstance().EndTime) {
Visible = false;
} else {
Visible = true;
}
LenheartNewUI_Windows.SyncPos(X, Y);
}
}
LenheartNewUI_CreateWindow(FiendwarFightSituationC, "超时空攻坚战况表", 0, 8, 800, 600, 0);

View File

@@ -1,406 +0,0 @@
/*
文件名:FiendwarHall.nut
路径:Plugins/Fiendwar/FiendwarHall.nut
创建日期:2024-03-11 12:54
文件用途:超时空之战大厅
*/
class FiendwarHallC extends LenheartNewUI_Windows {
// DeBugMode = true;
WindowObj = null; //窗口对象
MainState = false; //主状态
X = 320;
Y = 40;
//默认显示状态需要是关闭 因为要通过按钮打开
Visible = false;
//攻坚队List
PartyList = null;
function GetInstance() {
return getroottable()["FiendwarHallCObj"];
}
//获取所有队伍回调包
function GetAllTeamCallBack(Chunk) {
local Jso = Json.Decode(Chunk);
//清除原来的List PartyList可以直接清除 但是Childrens中的窗口需要调用底层方法清除队伍类
PartyList = [];
// this.RemoveChilds(FiendwarHallPartyC);
//遍历包构造攻坚队UI对象
foreach(TeamsSimple in Jso.TeamSimList) {
local T = {
TeamId = TeamsSimple.TeamId.tostring(),
TeamName = TeamsSimple.TeamName,
TeamPlayerCount = TeamsSimple.TeamPlayerCount,
State = TeamsSimple.State
}
local TeamBuf = FiendwarHallPartyC(T);
AddChild(TeamBuf);
PartyList.append(TeamBuf);
}
//收到刷新队伍列表包时需要将队伍窗口关闭
if ("Close" in Jso) LenheartNewUI_DestoryWindow("超时空我的队伍窗口");
// RemoveChilds(FiendwarHallPartyC, false);
}
//获取攻坚队信息回调
function GetTeamInfoCallBack(Chunk) {
// Sout("收到包 : \n %L", Chunk);
local Jso = Json.Decode(Chunk);
LenheartNewUI_DestoryWindow("超时空我的队伍窗口");
local Win = LenheartNewUI_CreateWindow(FiendwarPartyInfoC, "超时空我的队伍窗口", 430, 15, 354, 290, 18);
FiendwarTotal.GetInstance().MyTeam = Win;
Win.Visible = false;
if (!("Close" in Jso)) {
//开启队伍窗口显示
Win.Visible = true;
//设置置顶
Win.ResetFocus();
}
//清空成员对象集合
Win.MembersList = [];
//清空是否为我的队伍状态
Win.IsMyTeam = false;
//清空是否为队长状态
Win.IsCaptain = false;
//赋值队伍名称
Win.TeamName = Jso.team.TeamName;
//赋值队伍ID
Win.TeamID = Jso.team.TeamId;
//遍历Team包 用于构造队伍窗口中的每一位成员
foreach(_index, MemberObj in Jso.team.characNum) {
//说明我在这个攻坚队里
if (Jso.cid == MemberObj.CID) {
Win.IsMyTeam = true;
local Fo = FiendwarTotal.GetInstance();
//向全局类存入我的攻坚队伍ID
Fo.MyPartyId = Jso.team.TeamId;
//存入我的CID
Fo.MyCid = Jso.cid;
//说明是队长
if (Jso.cid == Jso.team.captainCid) {
Win.IsCaptain = true;
//存入我是攻坚队队长
Fo.IsCaptain = true;
}
}
local T = {
PartyId = Jso.team.TeamId, //攻坚队ID
TeamId = MemberObj.characNum + 1, //小队编号
Level = MemberObj.PlayerLevel.tostring(), //等级
Name = MemberObj.PlayerName, //名字
JobName = MemberObj.PlayerGrowTypeJob, //职业名
Job = MemberObj.PlayerJob, //职业编号
StkHasFlag = MemberObj.isPrepare, //是否拥有攻坚材料
EquVos = MemberObj.equVos, //装备List 用于显示头像
Captain = MemberObj.CaptainBool, //是否为攻坚队队长
Cid = MemberObj.CID, //Cid
OnlineState = MemberObj.onLineStart, //在线状态
ExitTime = MemberObj.exitTime, //离队时间
PlayerSession = MemberObj.PlayerSession, //玩家在世界中的Session 用于进行原生用户操作
ClearanceCount = MemberObj.ClearanceCount, //通关次数
ClearanceCountMax = Jso.ClearanceCountMax, //总通关次数
}
//通过类构造并添加队伍成员UI对象
local TeamBuf = FiendwarPartyInfoMemberC(T);
Win.AddChild(TeamBuf);
Win.MembersList.append(TeamBuf);
}
//刷新界面
Win.RegisterWidget();
//刷新自己的界面
RegisterWidget();
}
//获取所有队伍
function GetAllTeamCall() {
local Jso = {
op = 20063011
}
SendPack(Jso);
}
//退出队伍回调
function ExitPartyCallBack(Chunk) {
LenheartNewUI_DestoryWindow("超时空我的队伍窗口");
FiendwarTotal.GetInstance().ClearInfo();
local Win = LenheartNewUI_CreateWindow(FiendwarHallC, "超时空攻坚队伍列表", 320, 40, 478, 434, 18);
Win.CloseWindow();
RegisterWidget();
}
constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH) {
Childrens = [];
PartyList = [];
//注册控件
RegisterWidget();
//注册回调包
Pack_Control.rawset(20063002, GetAllTeamCallBack.bindenv(this));
Pack_Control.rawset(20063004, GetTeamInfoCallBack.bindenv(this));
Pack_Control.rawset(20063008, ExitPartyCallBack.bindenv(this));
GetAllTeamCall();
LenheartNewUI_Windows.constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH);
}
OnlyPreparingBtn = null;
OnlyPreparingFlag = 1;
InputObject = null;
function RegisterWidget() {
RemoveChilds(FiendwarHallPartyC, false);
//关闭按钮
local CloseButton = LenheartNewUI_BaseButton(457, 0, 11, 12, "interface/lenheartwindowcommon.img", 276);
CloseButton.OnClick = function() {
CloseWindow();
}.bindenv(this);
AddChild(CloseButton);
//我的频道复选框
local MyChannelBtn = LenheartNewUI_SwitchButtonText(16, 30, "我的频道");
MyChannelBtn.State = 1;
MyChannelBtn.ImgIndex = 358;
MyChannelBtn.SetTextPos(12, 2);
MyChannelBtn.Width = 76;
MyChannelBtn.Height = 16;
AddChild(MyChannelBtn);
//只查看招募中的攻坚队
OnlyPreparingBtn = LenheartNewUI_SwitchButtonText(110, 30, "只查看招募中的攻坚队");
OnlyPreparingBtn.ImgIndex = 358;
OnlyPreparingBtn.SetTextPos(12, 2);
OnlyPreparingBtn.Width = 76;
OnlyPreparingBtn.Height = 16;
OnlyPreparingBtn.OnClick = function() {
switch (OnlyPreparingFlag) {
case 0:
OnlyPreparingFlag = 1;
break;
case 1:
OnlyPreparingFlag = 0;
break;
}
OnlyPreparingBtn.State = OnlyPreparingFlag;
}.bindenv(this);
AddChild(OnlyPreparingBtn);
//搜索队伍输入框
InputObject = LenheartNewUI_BaseInput(260, 31, 80, 20);
AddChild(InputObject);
//搜索按钮
local FindButton = LenheartNewUI_ButtonText(348, 28, 5, "搜索");
FindButton.SetTextOffset(0, 1);
FindButton.OnClick = function() {
if (InputObject.str.len() > 0) {
}
}.bindenv(this);
AddChild(FindButton);
//重置按钮
local ResetButton = LenheartNewUI_ButtonText(408, 28, 5, "重置");
ResetButton.SetTextOffset(0, 1);
ResetButton.OnClick = function() {
InputObject.str = "";
}.bindenv(this);
AddChild(ResetButton);
//编号按钮
local ModelButton = LenheartNewUI_ButtonText(9, 56, -18, "编号");
ModelButton.Idx = 163;
ModelButton.DWidth = -8;
ModelButton.SetTextOffset(-9, 1);
AddChild(ModelButton);
//状态按钮
local StateButton = LenheartNewUI_ButtonText(51, 56, -18, "状态");
StateButton.Idx = 163;
StateButton.DWidth = -8;
StateButton.SetTextOffset(-9, 1);
AddChild(StateButton);
//频道按钮
local ChannelButton = LenheartNewUI_ButtonText(93, 56, -18, "频道");
ChannelButton.Idx = 163;
ChannelButton.DWidth = -8;
ChannelButton.SetTextOffset(-9, 1);
AddChild(ChannelButton);
//攻坚队名称按钮
local PartyNameButton = LenheartNewUI_ButtonText(135, 56, 100, "攻坚队名称");
PartyNameButton.Idx = 163;
PartyNameButton.DWidth = 223;
PartyNameButton.FillWidth = 1;
PartyNameButton.FirstWidth = 21;
PartyNameButton.SetTextOffset(26, 1);
AddChild(PartyNameButton);
//阶段按钮
local StageButton = LenheartNewUI_ButtonText(289, 56, 52, "阶段");
StageButton.Idx = 163;
StageButton.DWidth = 140;
StageButton.FillWidth = 1;
StageButton.FirstWidth = 21;
StageButton.SetTextOffset(26, 1);
AddChild(StageButton);
//队员数量按钮
local TeammembersButton = LenheartNewUI_ButtonText(402, 56, 50, "队员数量");
TeammembersButton.Idx = 163;
TeammembersButton.FillWidth = 1;
TeammembersButton.FirstWidth = 21;
TeammembersButton.DWidth = 47;
TeammembersButton.SetTextOffset(-8, 1);
AddChild(TeammembersButton);
//创建攻坚队按钮
local CreateOrMyPartyStr = "创建攻坚队";
if (FiendwarTotal.GetInstance().MyPartyId) CreateOrMyPartyStr = "我的攻坚队";
local MyPartyButton = LenheartNewUI_ButtonText(15, 395, 30, CreateOrMyPartyStr);
MyPartyButton.SetTextOffset(-6, 1);
MyPartyButton.OnClick = function() {
if (FiendwarTotal.GetInstance().MyPartyId) {
//发送查看攻坚队具体信息包
local T = {
op = 20063013,
teamsId = FiendwarTotal.GetInstance().MyPartyId
}
Rindro_BaseToolClass.SendPackEx(T);
} else {
local Win = LenheartNewUI_CreateWindow(FiendwarHallCreatePartyC, "超时空创建队伍窗口", 290, 220, 284, 154, 18);
Win.Visible = true;
Win.ResetFocus();
}
}.bindenv(this);
AddChild(MyPartyButton);
//左翻页按钮
local LeftButton = LenheartNewUI_BaseButton(160, 400, 15, 15, "interface/lenheartwindowcommon.img", 34);
LeftButton.OnClick = function() {
if (Page > 0) Page--;
}.bindenv(this);
AddChild(LeftButton);
//右翻页按钮
local RightButton = LenheartNewUI_BaseButton(220, 400, 15, 15, "interface/lenheartwindowcommon.img", 38);
RightButton.OnClick = function() {
if (Page<(((PartyList.len() / PageMaxCount)))) Page++;
}.bindenv(this);
AddChild(RightButton);
//进入待机按钮
local FQButton = LenheartNewUI_ButtonText(300, 394, 20, "进入待机");
FQButton.SetTextOffset(-5, 2);
FQButton.State = 8;
AddChild(FQButton);
//刷新按钮
local RefreshButton = LenheartNewUI_BaseButton(410, 395, 25, 25, "interface/lenheartwindowcommon.img", 366);
RefreshButton.OnClick = function() {
GetAllTeamCall();
}.bindenv(this);
AddChild(RefreshButton);
//设置按钮
local SettingButton = LenheartNewUI_BaseButton(440, 394, 15, 15, "interface/lenheartwindowcommon.img", 362);
SettingButton.State = 8;
AddChild(SettingButton);
}
function DrawMainBackGround(obj) {
//Item信息框一般为211的宽度
L_sq_DrawWindow(X, Y + 10, 540 * 0.85, 420 * 0.9, "interface/lenheartwindowcommon.img", 97, 11, 12, 11, 13);
L_sq_DrawWindow(X + 6, Y + 19, 528 * 0.85, 47, "interface/lenheartwindowcommon.img", 97, 11, 12, 11, 13);
//绘制背景框标题栏
L_sq_DrawImg("hud/fiendwarl.img", 3, X + 1, Y);
L_sq_DrawCode("寻找攻坚队", X + 217, Y + 3, sq_RGBA(179, 169, 135, 255), 0, 1);
//绘制队伍List
DrawPartyList(obj);
L_sq_DrawWindow(X + 6, Y + 382, 528 * 0.85, 24, "interface/lenheartwindowcommon.img", 97, 11, 12, 11, 13);
//计算页数
local PageStr = Page + 1 + " / " + ((PartyList.len() / PageMaxCount) + 1);
//绘制当前页数
L_sq_DrawCode(PageStr, X + 166 + LenheartTextClass.GetStringLength(PageStr) / 2, Y + 402, sq_RGBA(134, 120, 79, 255), 0, 1);
}
Page = 0;
PageMaxCount = 13;
//绘制队伍信息
function DrawPartyList(obj) {
if (PartyList.len() <= 0) return;
//先遍历一遍全部挪走
foreach(Index, TeamObj in PartyList) {
TeamObj.SyncPos(9999, 9999);
}
//在遍历需要显示的同步坐标
foreach(Index, TeamObj in PartyList.slice((((Page) * PageMaxCount) > 0) ? ((Page) * PageMaxCount) : 0, ((Page + 1) * PageMaxCount) > PartyList.len() ? PartyList.len() : ((Page + 1) * PageMaxCount))) {
TeamObj.SyncPos(X, Y + 2 + (Index % PageMaxCount) * 23);
// TeamObj.Show();
}
}
//绘制主界面
function DrawMain(obj) {
DrawMainBackGround(obj);
}
//绘制入口
function Show(obj) {
DrawMain(obj);
LenheartNewUI_Windows.Show(obj);
}
MainButton = null;
//逻辑入口
function Proc(obj) {
//界面未打开
if (!this.Visible && L_sq_RA(0x1A5FB4C, "0x14+0x28+")< 2) {
//在甲板
if (FiendwarTotal.GetInstance().BaseConfig && FiendwarTotal.GetInstance().BaseConfig.channel_index.find("20") && L_sq_GetTownIndex() == FiendwarTotal.GetInstance().BaseConfig.town_index && L_sq_GetRegionIndex() >= 1) {
local PaW = sq_GetPopupWindowMainCotrol(6);
if (PaW) {
L_sq_UseSkill(DIK_ESCAPE);
this.Visible = true;
GetAllTeamCall();
}
}
}
LenheartNewUI_Windows.SyncPos(X, Y);
}
//鼠标滚轮时间回调
function OnMouseWheel(Flag, MousePos_X, MousePos_Y) {
switch (Flag) {
//下
case 0: {
if (Page<(((PartyList.len() / PageMaxCount)))) Page++;
break;
}
//上
case 1: {
if (Page > 0) Page--;
break;
}
}
LenheartNewUI_Windows.OnMouseWheel(Flag, MousePos_X, MousePos_Y);
}
}

View File

@@ -1,259 +0,0 @@
/*
文件名:FiendwarHallApplyJoin.nut
路径:Plugins/Fiendwar/FiendwarHallApplyJoin.nut
创建日期:2024-04-02 12:07
文件用途:超时空玩家申请加入攻坚队
*/
class FiendwarHallApplyJoinC extends LenheartNewUI_Windows {
//调试模式
// DeBugMode = true;
//角色对象
Charc = null;
//角色等级
Level = "100级";
//角色名称
Name = "凌众K";
//角色职业
Job = 0;
//角色决斗等级
PvpLevel = 1;
//职业名称
JobName = "大暗黑天";
//角色复活币
Coin = "139个";
//角色疲劳值
Fatigue = "156";
//战斗力
Combat = "170051206";
//通过次数
ClearanceCount = 63;
//玩家世界Session
PlayerSession = 0;
//请求者信息集合
RequestJoinTeamArr = null;
NowSelectJoinIndex = 0;
//角色头像集合
AvatarArr = null;
//初始化Flag
InitFlag = false;
//X Y 裁切开始X Y 裁切结束X Y
OffsetArr = [
//男鬼剑士
[45, 103, 230, 231],
//女格斗家
[56, 102, 235, 279],
//男神枪手
[52, 130, 238, 246],
//女魔法师
[55, 87, 234, 293],
//男圣职者
[42, 115, 223, 200],
//女神枪手
[52, 119, 226, 209],
//暗夜使者
[56, 102, 225, 226],
//男格斗家
[50, 114, 239, 216],
//男魔法师
[54, 103, 236, 276],
//黑暗武士
[46, 102, 229, 232],
//缔造者
[56, 86, 235, 293],
]
constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH) {
Childrens = [];
RequestJoinTeamArr = [];
LenheartNewUI_Windows.constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH);
}
function InitInfo() {
local InfoObj = RequestJoinTeamArr[NowSelectJoinIndex];
Charc = InfoObj.Charc;
//角色等级
Level = InfoObj.Level;
//角色名称
Name = InfoObj.Name;
//角色职业
Job = InfoObj.Job;
//角色决斗等级
PvpLevel = InfoObj.PvpLevel;
//职业名称
JobName = InfoObj.JobName;
//角色复活币
Coin = InfoObj.Coin + "个";
//角色疲劳值
Fatigue = InfoObj.Fatigue.tostring();
//战斗力
Combat = InfoObj.Combat;
//通过次数
ClearanceCount = InfoObj.ClearanceCount;
//头像
AvatarArr = InfoObj.AvatarArr;
//玩家世界Session
this.PlayerSession = InfoObj.PlayerSession;
Childrens = [];
//注册控件
RegisterWidget();
InitFlag = true;
}
function PopOne() {
if (RequestJoinTeamArr.len() > 1) {
RequestJoinTeamArr.remove(0);
InitInfo();
} else {
RequestJoinTeamArr = [];
CloseWindow();
}
}
function RegisterWidget() {
//关闭按钮
local CloseButton = LenheartNewUI_BaseButton(244, 0, 11, 12, "interface/lenheartwindowcommon.img", 276);
CloseButton.OnClick = function() {
PopOne();
}.bindenv(this);
AddChild(CloseButton);
//冒险团按钮
local MButton = LenheartNewUI_ButtonText(24, 114, 15, "冒险团信息");
MButton.SetTextOffset(-13, 2);
AddChild(MButton);
//冒险图鉴按钮
local FQButton = LenheartNewUI_ButtonText(95, 113, 15, "冒险图鉴");
FQButton.State = 8;
FQButton.SetTextOffset(-7, 2);
AddChild(FQButton);
//查看信息按钮
local CButton = LenheartNewUI_ButtonText(166, 114, 15, "查看信息");
CButton.SetTextOffset(-7, 2);
CButton.OnClick = function() {
local obj = sq_GetMyMasterCharacter();
// obj.sq_PlaySound("CLICK_BUTTON1");
L_sq_SendPackType(8);
L_sq_SendPackWord(this.PlayerSession);
L_sq_SendPackByte(3);
L_sq_SendPack();
getroottable().WindowsShowABFlag <- false; //让原生窗口置顶
}.bindenv(this);
AddChild(CButton);
//确认按钮
local OkButton = LenheartNewUI_ButtonText(74, 192, -1, "是");
OkButton.SetTextOffset(3, 2);
OkButton.OnClick = function() {
local T = {
op = 20063003,
teamsId = RinDro_Anton_Obj.MyRaidTeamId,
charac = Charc
}
Rindro_BaseToolClass.SendPackEx(T);
PopOne();
}.bindenv(this);
AddChild(OkButton);
//拒绝按钮
local NoButton = LenheartNewUI_ButtonText(130, 192, -1, "否");
NoButton.SetTextOffset(3, 2);
NoButton.OnClick = function() {
local T = {
op = 20063019,
charac = Charc.CID
}
Rindro_BaseToolClass.SendPackEx(T);
PopOne();
}.bindenv(this);
AddChild(NoButton);
//左翻页按钮
local LeftButton = LenheartNewUI_BaseButton(90, 220, 15, 15, "interface/lenheartwindowcommon.img", 34);
LeftButton.OnClick = function() {
if (NowSelectJoinIndex > 0) NowSelectJoinIndex--;
InitInfo();
}.bindenv(this);
AddChild(LeftButton);
//右翻页按钮
local RightButton = LenheartNewUI_BaseButton(154, 220, 15, 15, "interface/lenheartwindowcommon.img", 38);
RightButton.OnClick = function() {
if (NowSelectJoinIndex< RequestJoinTeamArr.len() - 1) NowSelectJoinIndex++;
InitInfo();
}.bindenv(this);
AddChild(RightButton);
}
//绘制主界面
function DrawMain(obj) {
if (!InitFlag) return;
//标题栏
L_sq_DrawButton(X - 2, Y, 252, "interface/lenheartwindowcommon.img", 609, 2, 7);
//绘制窗口名字
L_sq_DrawCode("攻坚队申请", X + 100, Y + 4, sq_RGBA(134, 120, 79, 255), 0, 1);
//Item信息框一般为211的宽度
L_sq_DrawWindow(X, Y + 16, 240, 200, "interface/lenheartwindowcommon.img", 97, 11, 12, 11, 13);
//绘制背景
L_sq_DrawImg("hud/fiendwarl.img", 15, X + 6, Y + 22);
//绘制角色背景
L_sq_DrawImg("hud/fiendwarl.img", 14, X + 8, Y + 40);
//绘制角色头像
if (AvatarArr) {
foreach(AvatarObj in AvatarArr) {
local AXpos = AvatarObj.D[0] + X + OffsetArr[Job][0] - 8;
local AYpos = AvatarObj.D[1] + Y + OffsetArr[Job][1] + 40;
setClip(AXpos + OffsetArr[Job][2], AYpos + OffsetArr[Job][3], AXpos + OffsetArr[Job][2] + 22, AYpos + OffsetArr[Job][3] + 18); //开始裁切
L_sq_DrawImg("character/" + AvatarObj.B + ".img", AvatarObj.C, AXpos, AYpos);
releaseClip(); //裁切结束
}
}
//绘制角色等级
L_sq_DrawCode(Level, X + 78 - LenheartTextClass.GetStringLength(Level) / 2, Y + 45, sq_RGBA(134, 120, 79, 255), 0, 1);
//绘制角色名字
L_sq_DrawCode(Name, X + 137 - LenheartTextClass.GetStringLength(Name) / 2, Y + 45, sq_RGBA(134, 120, 79, 255), 0, 1);
//绘制角色职业类型图标
if (Job != 4) L_sq_DrawImg("hud/fiendwarl.img", 16, X + 176, Y + 43);
//绘制角色职业名称
L_sq_DrawCode(JobName, X + 224 - LenheartTextClass.GetStringLength(JobName) / 2, Y + 45, sq_RGBA(134, 120, 79, 255), 0, 1);
//Item信息框一般为211的宽度
L_sq_DrawWindow(X + 21, Y + 65, 30, 30, "interface/lenheartwindowcommon.img", 97, 11, 12, 11, 13);
L_sq_DrawWindow(X + 62, Y + 65, 156, 30, "interface/lenheartwindowcommon.img", 97, 11, 12, 11, 13);
//绘制决斗等级
local PvpImg = PvpLevel / 6;
L_sq_DrawImg("hud/fiendwarl1.img", 99, X + 25, Y + 74);
L_sq_DrawCode(PvpLevel.tostring(), X + 45 - LenheartTextClass.GetStringLength(PvpLevel.tostring()) / 2, Y + 91, sq_RGBA(134, 120, 79, 255), 0, 1);
//绘制各项信息
L_sq_DrawCode("复活币:", X + 70, Y + 76, sq_RGBA(134, 120, 79, 255), 0, 1);
L_sq_DrawCode(Coin, X + 134 - LenheartTextClass.GetStringLength(Coin) / 2, Y + 76, sq_RGBA(134, 120, 79, 255), 0, 1);
L_sq_DrawCode("疲劳值:", X + 158, Y + 76, sq_RGBA(134, 120, 79, 255), 0, 1);
L_sq_DrawCode(Fatigue, X + 216 - LenheartTextClass.GetStringLength(Fatigue) / 2, Y + 76, sq_RGBA(134, 120, 79, 255), 0, 1);
L_sq_DrawCode("战斗力:", X + 70, Y + 93, sq_RGBA(134, 120, 79, 255), 0, 1);
L_sq_DrawCode(Combat, X + 170 - LenheartTextClass.GetStringLength(Combat) / 2, Y + 93, sq_RGBA(74, 162, 86, 255), 0, 1);
L_sq_DrawCode("通关超时空攻坚战" + ClearanceCount + "次", X + 130 - LenheartTextClass.GetStringLength("通关超时空攻坚战" + ClearanceCount + "次") / 2, Y + 144, sq_RGBA(221, 213, 147, 255), 0, 1);
L_sq_DrawCode("申请加入攻坚队。", X + 87, Y + 160, sq_RGBA(160, 132, 75, 255), 0, 1);
L_sq_DrawCode("请确定是否同意?", X + 87, Y + 176, sq_RGBA(160, 132, 75, 255), 0, 1);
L_sq_DrawWindow(X + 77, Y + 216, 100, 20, "interface/lenheartwindowcommon.img", 204, 4, 14, 4, 14);
//绘制页数
local Str = (NowSelectJoinIndex + 1) + " / " + RequestJoinTeamArr.len();
L_sq_DrawCode(Str, X + 137 - LenheartTextClass.GetStringLength(Str) / 2, Y + 222, sq_RGBA(134, 120, 79, 255), 0, 1);
}
function Show(obj) {
DrawMain(obj);
LenheartNewUI_Windows.Show(obj);
}
//逻辑入口
function Proc(obj) {
LenheartNewUI_Windows.SyncPos(X, Y);
}
}

View File

@@ -1,81 +0,0 @@
/*
文件名:FiendwarHallCreateParty.nut
路径:Plugins/Fiendwar/FiendwarHallCreateParty.nut
创建日期:2024-03-18 13:20
文件用途:
*/
class FiendwarHallCreatePartyC extends LenheartNewUI_Windows {
//调试模式
DeBugMode = false;
X = 290;
Y = 220;
//输入框
InputObject = null;
constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH) {
Childrens = [];
//关闭按钮
local CloseButton = LenheartNewUI_BaseButton(266, 2, 11, 12, "interface/lenheartwindowcommon.img", 276);
CloseButton.OnClick = function() {
CloseWindow();
}.bindenv(this);
AddChild(CloseButton);
local OkButton = LenheartNewUI_ButtonText(78, 124, 5, "确定");
OkButton.SetTextOffset(0, 1);
OkButton.OnClick = function() {
//如果队伍名输出框的文字长度大于0就创建队伍 创建时告诉服务端自己的 头发 帽子 脸部 皮肤
if (InputObject.str.len() > 0) {
local T = {
op = 20063001,
teamsName = InputObject.str,
items = [L_sq_GetCharacterAttribute(0x1c, 21), L_sq_GetCharacterAttribute(0x1c, 15), L_sq_GetCharacterAttribute(0x1c, 14), L_sq_GetCharacterAttribute(0x1c, 13)],
}
Rindro_BaseToolClass.SendPackEx(T);
CloseWindow();
}
}.bindenv(this);
AddChild(OkButton);
local CloseButton = LenheartNewUI_ButtonText(144, 124, 5, "取消");
CloseButton.SetTextOffset(0, 1);
CloseButton.OnClick = function() {
CloseWindow();
}.bindenv(this);
AddChild(CloseButton);
InputObject = LenheartNewUI_BaseInput(62, 68, 152, 20);
AddChild(InputObject);
LenheartNewUI_Windows.constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH);
}
//绘制主界面
function DrawMain(obj) {
L_sq_DrawWindow(X, Y + 10, 260, 120, "interface/lenheartwindowcommon.img", 213, 12, 2, 13, 2);
L_sq_DrawWindow(X, Y + 10, 260, 120, "interface/lenheartwindowcommon.img", 213, 12, 2, 13, 2);
L_sq_DrawImg("interface2/gcontents/180621_fiendwar/raid/raid_areaimg_fiend.img", 0, X + 11, Y + 21);
L_sq_DrawImg("hud/fiendwarl.img", 9, X - 2, Y + 2);
L_sq_DrawCode("创建攻坚队", X + 112, Y + 3, sq_RGBA(179, 169, 135, 255), 0, 1);
L_sq_DrawImg("hud/fiendwarl.img", 10, X + 72, Y + 44);
}
function Show(obj) {
DrawMain(obj);
LenheartNewUI_Windows.Show(obj);
}
//逻辑入口
function Proc(obj) {
LenheartNewUI_Windows.SyncPos(X, Y);
}
}

View File

@@ -1,81 +0,0 @@
/*
文件名:FiendwarHallGoBossDgn.nut
路径:Plugins/Fiendwar/FiendwarHallGoBossDgn.nut
创建日期:2024-05-10 06:55
文件用途:进入罗什的窗口
*/
class FiendwarHallGoBossDgnC extends LenheartNewUI_Windows {
//调试模式
// DeBugMode = true;
Dark = 0;
Light = 0;
constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH) {
Childrens = [];
//注册控件
RegisterWidget();
LenheartNewUI_Windows.constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH);
}
function RegisterWidget() {
Childrens = [];
// //关闭按钮
// local CloseButton = LenheartNewUI_BaseButton(278, 0, 11, 12, "interface/lenheartwindowcommon.img", 276);
// CloseButton.OnClick = function() {
// this.Visible = false;
// }.bindenv(this);
// Childrens.append(CloseButton);
//黑暗按钮
local DarkButton = LenheartNewUI_BaseButton(4, 20, 264, 48, "interface2/gcontents/180621_fiendwar/raid/raid_areaimg_fiend.img", 1);
DarkButton.OnClick = function() {
local T = {
op = 20063059,
key = 28
}
Rindro_BaseToolClass.SendPackEx(T);
CloseWindow();
}.bindenv(this);
if (Dark) DarkButton.State = 8;
Childrens.append(DarkButton);
//纯白按钮
local LightButton = LenheartNewUI_BaseButton(4, 68, 264, 48, "interface2/gcontents/180621_fiendwar/raid/raid_areaimg_fiend.img", 5);
LightButton.OnClick = function() {
local T = {
op = 20063059,
key = 29
}
Rindro_BaseToolClass.SendPackEx(T);
CloseWindow();
}.bindenv(this);
if (Light) LightButton.State = 8;
Childrens.append(LightButton);
}
//绘制主界面
function DrawMain(obj) {
L_sq_DrawWindow(X, Y + 10, 246, 85, "interface/lenheartwindowcommon.img", 213, 12, 2, 13, 2);
L_sq_DrawWindow(X, Y + 10, 246, 85, "interface/lenheartwindowcommon.img", 213, 12, 2, 13, 2);
// L_sq_DrawImg("interface2/gcontents/180621_fiendwar/raid/raid_areaimg_fiend.img", 0, X + 11, Y + 21);
L_sq_DrawImg("hud/fiendwarl.img", 25, X - 3, Y + 2);
L_sq_DrawCode("量子时空传送站", X + 98, Y + 5, sq_RGBA(179, 169, 135, 255), 0, 1);
// L_sq_DrawImg("hud/fiendwarl.img", 10, X + 72, Y + 44);
}
function Show(obj) {
DrawMain(obj);
LenheartNewUI_Windows.Show(obj);
}
//逻辑入口
function Proc(obj) {
LenheartNewUI_Windows.SyncPos(X, Y);
}
}

View File

@@ -1,77 +0,0 @@
/*
文件名:FiendwarHallParty.nut
路径:Plugins/Fiendwar/FiendwarHallParty.nut
创建日期:2024-04-01 22:30
文件用途:超时空之战 大厅中的队伍对象
*/
class FiendwarHallPartyC extends LenheartNewUI_CommonUi {
X = 0;
Y = 0;
Width = null;
Height = null;
TeamObj = null;
//选中状态
SelectState = false;
//攻坚状态
OffensiveState = 0;
constructor(gTeamObj) {
//拿到信息Map
TeamObj = gTeamObj;
//设定宽高 坐标不重要 会被父窗口的Sync同步坐标
this.Width = 458;
this.Height = 21;
this.OnClick = function() {
//还原父对象中其他攻坚队伍类 选中自己
foreach(Obj in Parent.PartyList) {
Obj.SelectState = false;
}
SelectState = !SelectState;
//发送查看攻坚队具体信息包
local T = {
op = 20063013,
teamsId = TeamObj.TeamId
}
Rindro_BaseToolClass.SendPackEx(T);
}
LenheartNewUI_CommonUi.constructor(10, 82, this.Width, this.Height);
}
function Show(obj) {
//绘制底槽
L_sq_DrawImg("hud/fiendwarl.img", 4, X, Y);
//绘制队伍编号
L_sq_DrawCode(TeamObj.TeamId, X + 22 - LenheartTextClass.GetStringLength(TeamObj.TeamId) / 2, Y + 5, sq_RGBA(134, 120, 79, 255), 0, 1);
//绘制队长头像
L_sq_DrawImg("interface/lenheartwindowcommon.img", 55, X + 52, Y + 7);
try {
local channel_index = FiendwarTotal.GetInstance().BaseConfig.channel_index;
channel_index = channel_index.slice(channel_index.len() - 2, channel_index.len());
//绘制频道信息
L_sq_DrawCode(channel_index, X + 102 - LenheartTextClass.GetStringLength(channel_index) / 2, Y + 5, sq_RGBA(134, 120, 79, 255), 0, 1);
} catch (exception) {
}
//绘制攻坚队名称
L_sq_DrawCode(TeamObj.TeamName, X + 130, Y + 5, sq_RGBA(134, 120, 79, 255), 0, 1);
//绘制攻坚队攻坚状态
L_sq_DrawImg("hud/fiendwarl.img", 6 + TeamObj.State, X + 314, Y + 2);
local PartyPlayerCountStr = TeamObj.TeamPlayerCount + " / " + 8;
//绘制攻坚队队员数量
L_sq_DrawCode(PartyPlayerCountStr, X + 434 - LenheartTextClass.GetStringLength(PartyPlayerCountStr) / 2, Y + 5, sq_RGBA(134, 120, 79, 255), 0, 1);
if (SelectState) {
L_sq_DrawImg("hud/fiendwarl.img", 5, X, Y);
}
if (isInRect) {
L_sq_DrawImg("hud/fiendwarl.img", 5, X, Y);
}
}
}

View File

@@ -1,112 +0,0 @@
/*
文件名:FiendwarNoti.nut
路径:Plugins/Fiendwar/FiendwarNoti.nut
创建日期:2024-04-12 22:12
文件用途:超时空攻坚战队伍消息
*/
class FiendwarNotiC extends LenheartNewUI_Windows {
//调试模式
// DeBugMode = true;
//消息内容
Msg = null;
//队长名称
Name = null;
//消息时间
Timer = null;
//队伍聊天消息分发
function FiendwarPartyNotiCallBack(Chunk) {
local Jso = Json.Decode(Chunk);
Name = Jso.Name;
Msg = Jso.msg;
Timer = Clock();
}
constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH) {
Childrens = [];
//注册控件
RegisterWidget();
LenheartNewUI_Windows.constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH);
//队伍聊天消息分发
Pack_Control.rawset(20063018, FiendwarPartyNotiCallBack.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);
}
//队长头像
PartyMasterIcon = null;
//绘制主界面
function DrawMain(obj) {
if (!Name || !Msg) return;
//绘制背景框
L_sq_DrawImg("hud/fiendwarl.img", 24, X + 134, Y + 180);
//绘制队长图标
// L_sq_DrawImg
if (FiendwarTotal.GetInstance().MyTeam) {
local Mt = FiendwarTotal.GetInstance().MyTeam;
local PartyMaster;
foreach(index, value in Mt.MembersList) {
if (value.InfoObj.Captain) {
PartyMasterIcon = clone(value);
}
}
sq_DrawBox(X + 42 + 118, Y + 1 + 185, 22, 18, PartyMasterIcon.HandBoxColor[PartyMasterIcon.InfoObj.TeamId]);
//绘制队长头像
foreach(AvatarObj in PartyMasterIcon.InfoObj.EquVos) {
local AXpos = AvatarObj.D[0] + X + PartyMasterIcon.OffsetArr[PartyMasterIcon.InfoObj.Job][0] + 118;
local AYpos = AvatarObj.D[1] + Y + PartyMasterIcon.OffsetArr[PartyMasterIcon.InfoObj.Job][1] + 185;
setClip(AXpos + PartyMasterIcon.OffsetArr[PartyMasterIcon.InfoObj.Job][2], AYpos + PartyMasterIcon.OffsetArr[PartyMasterIcon.InfoObj.Job][3], AXpos + PartyMasterIcon.OffsetArr[PartyMasterIcon.InfoObj.Job][2] + 22, AYpos + PartyMasterIcon.OffsetArr[PartyMasterIcon.InfoObj.Job][3] + 18); //开始裁切
L_sq_DrawImg("character/" + AvatarObj.B + ".img", AvatarObj.C, AXpos, AYpos);
releaseClip(); //裁切结束
}
}
//绘制队长名字
L_sq_DrawCode(Name, X + 184, Y + 189, sq_RGBA(247, 214, 90, 255), 0, 1);
//绘制点
L_sq_DrawCode(" ", X + 210, Y + 189, sq_RGBA(230, 200, 155, 255), 0, 1);
//绘制消息
L_sq_DrawCode(Msg, X + 190 + LenheartTextClass.GetStringLength(Name), Y + 189, sq_RGBA(230, 200, 155, 255), 0, 1);
}
function Show(obj) {
DrawMain(obj);
LenheartNewUI_Windows.Show(obj);
}
//逻辑入口
function Proc(obj) {
LenheartNewUI_Windows.SyncPos(X, Y);
if (Name && Msg)
Visible = true;
else
Visible = false;
if (Timer) {
if (Clock() - Timer >= 3500) {
Timer = null;
Name = null;
Msg = null;
}
}
}
}

View File

@@ -1,120 +0,0 @@
/*
文件名:FiendwarPartyFormation.nut
路径:Plugins/Fiendwar/FiendwarPartyFormation.nut
创建日期:2024-04-02 12:09
文件用途:超时空攻坚队 队内编队
*/
//编队用按钮需要传递参数所以重写
class FiendwarPartyInfoEdit_BaseButton extends LenheartNewUI_BaseButton {
MyInfoIndex = 0;
constructor(X, Y, W, H, Path, Idx, InfoIndex) {
MyInfoIndex = InfoIndex;
LenheartNewUI_BaseButton.constructor(X, Y, W, H, Path, Idx);
}
//鼠标左键弹起回调
function OnMouseLbUp(MousePos_X, MousePos_Y) {
if (isLBDown && OnClick) {
OnClick(MyInfoIndex);
}
isLBDown = false;
}
}
//编队窗口
class FiendwarPartyFormation extends LenheartNewUI_Windows {
//调试模式
// DeBugMode = true;
PartyMarkFlag = -1;
constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH) {
Childrens = [];
//注册控件
RegisterWidget();
LenheartNewUI_Windows.constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH);
}
function RegisterWidget() {
//关闭按钮
local CloseButton = LenheartNewUI_BaseButton(278, 0, 11, 12, "interface/lenheartwindowcommon.img", 276);
CloseButton.OnClick = function() {
CloseWindow();
}.bindenv(this);
AddChild(CloseButton);
//搜索按钮
local QdButton = LenheartNewUI_ButtonText(10, 157, 5, "签到");
QdButton.State = 8;
QdButton.SetTextOffset(0, 1);
AddChild(QdButton);
//解散队伍按钮
local BreakPartyButton = LenheartNewUI_ButtonText(80, 158, 5, "解散队伍");
BreakPartyButton.SetTextOffset(-12, 1);
BreakPartyButton.OnClick = function() {
}.bindenv(this);
AddChild(BreakPartyButton);
//关闭按钮
local CloseButton = LenheartNewUI_ButtonText(150, 158, 5, "关闭");
CloseButton.SetTextOffset(0, 1);
CloseButton.OnClick = function() {
CloseWindow();
}.bindenv(this);
AddChild(CloseButton);
for (local i = 0; i< 8; i++) {
//右翻页按钮
local PartyIndexButton = FiendwarPartyInfoEdit_BaseButton(12 + (i % 2 * 136), 35 + ((i / 2) * 30), 41, 17, "interface/newstyle/windows/party/party_icon.img", 3 + (i * 3), i);
//继承类 并重写 调用时传入InfoIndex
PartyIndexButton.OnClick = function(MyInfoIndex) {
PartyMarkFlag = MyInfoIndex;
}.bindenv(this);
AddChild(PartyIndexButton);
}
}
//绘制主界面
function DrawMain(obj) {
//标题栏
L_sq_DrawButton(X - 1, Y, 284, "interface/lenheartwindowcommon.img", 609, 2, 7);
//Item信息框一般为211的宽度
L_sq_DrawWindow(X, Y + 17, 272, 154, "interface/lenheartwindowcommon.img", 213, 12, 2, 13, 2);
for (local q = 0; q< 8; q++) {
L_sq_DrawImg("interface/lenheartwindowcommon.img", 358, X + 60 + (q % 2 * 136), Y + 34 + ((q / 2) * 30));
for (local i = 0; i< 3; i++) {
L_sq_DrawImg("interface/lenheartwindowcommon.img", 361, X + 80 + (q % 2 * 136) + (i * 20), Y + 34 + ((q / 2) * 30));
}
}
if (PartyMarkFlag != -1) {
L_sq_WA(0x1b46898, 47);
}
}
function Show(obj) {
DrawMain(obj);
LenheartNewUI_Windows.Show(obj);
}
//逻辑入口
function Proc(obj) {
LenheartNewUI_Windows.SyncPos(X, Y);
}
//鼠标左键弹起回调
function OnMouseLbUp(MousePos_X, MousePos_Y) {
//还原编队的鼠标指针
local win = LenheartNewUI_CreateWindow(FiendwarPartyFormation, "超时空我的队伍编队窗口", 105, 40, 294, 192, 18);
if (win.PartyMarkFlag != -1) {
win.PartyMarkFlag = -1;
L_sq_WA(0x1b46898, 0);
}
LenheartNewUI_Windows.OnMouseLbUp(MousePos_X, MousePos_Y);
}
}

View File

@@ -1,252 +0,0 @@
/*
文件名:FiendwarPartyInfo.nut
路径:Plugins/Fiendwar/FiendwarPartyInfo.nut
创建日期:2024-03-27 19:18
文件用途:超时空攻坚队队伍信息窗口
*/
class FiendwarPartyInfoC extends LenheartNewUI_Windows {
//调试模式
// DeBugMode = true;
//队员列表
MembersList = null;
//队伍名称
TeamName = "";
//队伍ID
TeamID = 99999999;
//是否是我的攻坚队
IsMyTeam = false;
//是否是队长
IsCaptain = false;
//收到请求加入攻坚队包
function JoinTeamCallBack(Chunk) {
// Sout("收到请求加入包 : \n\n\n %L", Chunk);
local Jso = Json.Decode(Chunk);
local win = LenheartNewUI_CreateWindow(FiendwarHallApplyJoinC, "超时空申请加入队伍窗口", 542, 348, 257, 240, 18);
win.Visible = true;
win.ResetFocus();
local T = {
Charc = Jso.charac, //角色对象
Level = Jso.charac.PlayerLevel,
Name = Jso.charac.PlayerName,
Job = Jso.charac.PlayerJob,
PvpLevel = Jso.charac.pvp,
JobName = Jso.charac.PlayerGrowTypeJob,
Coin = Jso.charac.PlayCoin,
Fatigue = Jso.charac.PlayFatigue,
Combat = Jso.charac.ZL,
ClearanceCount = Jso.charac.ClearanceCount,
AvatarArr = Jso.charac.equVos,
PlayerSession = Jso.charac.PlayerSession
}
//没人
if (win.RequestJoinTeamArr.len() == 0) {
win.RequestJoinTeamArr.append(T);
win.InitInfo();
} else win.RequestJoinTeamArr.append(T);
}
constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH) {
Childrens = [];
//注册控件
// RegisterWidget();
LenheartNewUI_Windows.constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH);
Pack_Control.rawset(20063006, JoinTeamCallBack.bindenv(this));
}
function RegisterWidget() {
//清除老的按钮在刷新
RemoveChilds(FiendwarPartyInfoMemberC, false);
//关闭按钮
local CloseButton = LenheartNewUI_BaseButton(336, 0, 11, 12, "interface/lenheartwindowcommon.img", 276);
CloseButton.OnClick = function() {
CloseWindow();
}.bindenv(this);
AddChild(CloseButton);
//队伍按钮
local ModelButton = LenheartNewUI_ButtonText(9, 60, -18, "队伍");
ModelButton.Idx = 163;
ModelButton.DWidth = -8;
ModelButton.SetTextOffset(-9, 1);
AddChild(ModelButton);
//等级按钮
local StateButton = LenheartNewUI_ButtonText(51, 60, -18, "等级");
StateButton.Idx = 163;
StateButton.DWidth = -8;
StateButton.SetTextOffset(-9, 1);
AddChild(StateButton);
//角色名按钮
local ChannelButton = LenheartNewUI_ButtonText(93, 60, 44, "角色名");
ChannelButton.Idx = 163;
ChannelButton.DWidth = 120;
ChannelButton.FillWidth = 1;
ChannelButton.FirstWidth = 21;
ChannelButton.SetTextOffset(17, 1);
AddChild(ChannelButton);
//攻坚队名称按钮
local PartyNameButton = LenheartNewUI_ButtonText(196, 60, 36, "职业名");
PartyNameButton.Idx = 163;
PartyNameButton.DWidth = 100;
PartyNameButton.FillWidth = 1;
PartyNameButton.FirstWidth = 21;
PartyNameButton.SetTextOffset(11, 1);
AddChild(PartyNameButton);
//入场材料按钮
local Striiu = "入场材料";
if (FiendwarTotal.GetInstance().EndTime) Striiu = "通关次数";
local StageButton = LenheartNewUI_ButtonText(289, 60, 0, Striiu);
StageButton.Idx = 163;
StageButton.DWidth = 26;
StageButton.FillWidth = 1;
StageButton.FirstWidth = 21;
StageButton.SetTextOffset(-14, 1);
AddChild(StageButton);
//如果不是我的队伍 并且我没有攻坚队
if (!IsMyTeam && !FiendwarTotal.GetInstance().MyPartyId) {
local JoinPartyButton = LenheartNewUI_ButtonText(10, 268, 10, "参加攻坚队");
JoinPartyButton.SetTextOffset(-15, 1);
JoinPartyButton.OnClick = function() {
local T = {
op = 20063005,
teamsId = TeamID,
items = [L_sq_GetCharacterAttribute(0x1c, 21), L_sq_GetCharacterAttribute(0x1c, 15), L_sq_GetCharacterAttribute(0x1c, 14), L_sq_GetCharacterAttribute(0x1c, 13)],
}
Rindro_BaseToolClass.SendPackEx(T);
}.bindenv(this);
AddChild(JoinPartyButton);
}
//如果是我的队伍
if (IsMyTeam) {
//退出按钮
local ExitButton = LenheartNewUI_ButtonText(220, 268, 5, "退出");
ExitButton.SetTextOffset(-1, 1);
ExitButton.OnClick = function() {
local T = {
op = 20063009,
teamsId = TeamID
}
Rindro_BaseToolClass.SendPackEx(T);
FiendwarTotal.GetInstance().MyCid = null;
FiendwarTotal.GetInstance().MyPartyId = null;
FiendwarTotal.GetInstance().IsCaptain = null;
}.bindenv(this);
AddChild(ExitButton);
if (IsCaptain) {
//队伍编制按钮
local PartyEditButton = LenheartNewUI_ButtonText(10, 268, 5, "队伍编制");
PartyEditButton.SetTextOffset(-12, 1);
PartyEditButton.OnClick = function() {
local win = LenheartNewUI_CreateWindow(FiendwarPartyFormation, "超时空我的队伍编队窗口", 105, 40, 294, 192, 18);
win.Visible = true;
}.bindenv(this);
AddChild(PartyEditButton);
//修改信息按钮
local FqButton = LenheartNewUI_ButtonText(100, 267, 5, "修改信息");
FqButton.State = 8;
FqButton.SetTextOffset(-12, 1);
AddChild(FqButton);
//队伍招募按钮
local FqButton1 = LenheartNewUI_ButtonText(160, 267, 5, "队伍招募");
FqButton1.State = 8;
FqButton1.SetTextOffset(-12, 1);
AddChild(FqButton1);
if (!FiendwarTotal.GetInstance().EndTime) {
//队伍招募按钮
local FightOpenButton = LenheartNewUI_ButtonText(290, 268, 5, "开始攻坚");
FightOpenButton.SetTextOffset(-12, 1);
FightOpenButton.OnClick = function() {
local T = {
op = 20063051,
teamsId = TeamID
}
Rindro_BaseToolClass.SendPackEx(T);
}.bindenv(this);
AddChild(FightOpenButton);
}
}
}
}
//绘制主界面
function DrawMain(obj) {
//标题栏
L_sq_DrawButton(X, Y, 344, "interface/lenheartwindowcommon.img", 609, 2, 7);
//绘制队伍名字
L_sq_DrawCode(TeamName, X + 178 - LenheartTextClass.GetStringLength(TeamName) / 2, Y + 5, sq_RGBA(134, 120, 79, 255), 0, 1);
//Item信息框一般为211的宽度
L_sq_DrawWindow(X, Y + 17, 340, 250, "interface/lenheartwindowcommon.img", 97, 11, 12, 11, 13);
//绘制头图
L_sq_DrawImg("interface2/gcontents/180621_fiendwar/raid/memberwindow.img", 0, X + 10, Y + 24);
//绘制阶段图 //TODO 根据阶段绘制img
L_sq_DrawImg("hud/fiendwarl.img", 7, X + 296, Y + 34);
//绘制队伍List
DrawMembersList(obj);
}
//绘制队伍信息
function DrawMembersList(obj) {
if (MembersList.len() <= 0) return;
//遍历需要显示的同步坐标
foreach(Index, TeamObj in MembersList) {
TeamObj.SyncPos(X, Y + 2 + Index * 23);
}
}
function Show(obj) {
DrawMain(obj);
LenheartNewUI_Windows.Show(obj);
}
//逻辑入口
function Proc(obj) {
LenheartNewUI_Windows.SyncPos(X, Y);
}
/*
# override # "
* @函数作用:
* @参数 name
* @返回值
*/
//鼠标左键弹起回调
function OnMouseLbUp(MousePos_X, MousePos_Y) {
foreach(Window in Childrens) {
Window.OnMouseLbUp(MousePos_X, MousePos_Y);
}
LenheartNewUI_Windows.OnMouseLbUp(MousePos_X, MousePos_Y);
//判断没有点到具体角色就隐藏
if (!sq_IsIntersectRect(MousePos_X, MousePos_Y, 1, 1, X, Y + 80, Width, MembersList.len() * 21)) {
//交互窗口需要隐藏
local Each = LenheartNewUI_CreateWindow(FiendwarHallPlayerInteractiveC, "超时空玩家交互", X, Y, 100, 21, 0);
Each.Visible = false;
}
}
}

View File

@@ -1,188 +0,0 @@
/*
文件名:FiendwarPartyMemberInfo.nut
路径:Plugins/Fiendwar/FiendwarPartyMemberInfo.nut
创建日期:2024-04-02 10:49
文件用途:攻坚队详细信息中的队员显示类
*/
//队员显示类
class FiendwarPartyInfoMemberC extends LenheartNewUI_CommonUi {
X = 0;
Y = 0;
Width = null;
Height = null;
InfoObj = null;
//构造时间
ConstructorTime = null;
//选中状态
SelectState = false;
//攻坚状态
OffensiveState = 0;
//头像框的颜色
HandBoxColor = [
0xff717272,
0xff7b2a29,
0xff874e0d,
0xff8b8108,
0xff658e2d,
0xff0f5c8a,
0xff27238f,
0xff4e2491,
0xff932586,
]
//X Y 裁切开始X Y 裁切结束X Y
OffsetArr = [
//男鬼剑士
[45, 103, 230, 231],
//女格斗家
[56, 102, 235, 279],
//男神枪手
[52, 130, 238, 246],
//女魔法师
[55, 87, 234, 293],
//男圣职者
[42, 115, 223, 200],
//女神枪手
[52, 119, 226, 209],
//暗夜使者
[56, 102, 225, 226],
//男格斗家
[50, 114, 239, 216],
//男魔法师
[54, 103, 236, 276],
//黑暗武士
[46, 102, 229, 232],
//缔造者
[56, 86, 235, 293],
]
constructor(gInfoObj) {
ConstructorTime = Clock();
InfoObj = gInfoObj;
this.Width = 458;
this.Height = 21;
this.OnClick = function() {
//还原其他 选中自己
foreach(Obj in Parent.MembersList) {
Obj.SelectState = false;
}
SelectState = !SelectState;
local win = LenheartNewUI_CreateWindow(FiendwarPartyFormation, "超时空我的队伍编队窗口", 105, 40, 294, 192, 18);
//编队状态
if (win.PartyMarkFlag != -1) {
//并且是属于我的攻坚队的成员
if (FiendwarTotal.GetInstance().MyPartyId == InfoObj.PartyId) {
local T = {
op = 20063015,
teamsId = InfoObj.PartyId,
cidNew = InfoObj.Cid,
num = win.PartyMarkFlag
}
Rindro_BaseToolClass.SendPackEx(T);
win.PartyMarkFlag = -1;
L_sq_WA(0x1b46898, 0);
return;
}
//点了其他队伍成员要还原编队状态
else {
win.PartyMarkFlag = -1;
L_sq_WA(0x1b46898, 0);
}
}
local Interactive = LenheartNewUI_CreateWindow(FiendwarHallPlayerInteractiveC, "超时空玩家交互", 0, 0, 100, 21, 0);
//改变鼠标坐标
Interactive.X = MousePos_X;
Interactive.Y = MousePos_Y;
//赋值对象参数
Interactive.InfoObj = InfoObj;
//对象不是我
if (InfoObj.Cid == FiendwarTotal.GetInstance().MyCid) {
Interactive.InfoObj.IsMyself <- true;
}
//刷新UI
Interactive.InitInfo();
}
LenheartNewUI_CommonUi.constructor(10, 82, this.Width, this.Height);
//如果没有材料要建立一个购买材料的Button 并且要判断是否是自己 //TODO 这里还不行 要拓展一个函数来比对名字
/*
local Name = L_Sq_GetObjectName(sq_GetMyMasterCharacter());
local Name2 = "夜刃";
Name == Name2 失败了
*/
// if (!InfoObj.StkHasFlag && InfoObj.Name == L_Sq_GetObjectName(sq_GetMyMasterCharacter())) {
// }
}
function Show(obj) {
//绘制底槽
L_sq_DrawImg("hud/fiendwarl.img", 12, X, Y);
//绘制队伍编号
L_sq_DrawImg("interface/newstyle/windows/party/party_icon.img", InfoObj.TeamId * 3, X, Y + 1);
sq_DrawBox(X + 42, Y + 1, 22, 18, HandBoxColor[InfoObj.TeamId]);
//绘制队长头像
foreach(AvatarObj in InfoObj.EquVos) {
local AXpos = AvatarObj.D[0] + X + OffsetArr[InfoObj.Job][0];
local AYpos = AvatarObj.D[1] + Y + OffsetArr[InfoObj.Job][1];
setClip(AXpos + OffsetArr[InfoObj.Job][2], AYpos + OffsetArr[InfoObj.Job][3], AXpos + OffsetArr[InfoObj.Job][2] + 22, AYpos + OffsetArr[InfoObj.Job][3] + 18); //开始裁切
L_sq_DrawImg("character/" + AvatarObj.B + ".img", AvatarObj.C, AXpos, AYpos);
releaseClip(); //裁切结束
// }
}
if (InfoObj.Captain) L_sq_DrawImg("hud/fiendwarl.img", 18, X + 42, Y + 1);
//绘制等级
L_sq_DrawCode(InfoObj.Level, X + 76 - LenheartTextClass.GetStringLength(InfoObj.Level) / 2, Y + 5, sq_RGBA(134, 120, 79, 255), 0, 1);
//绘制角色名
L_sq_DrawCode(InfoObj.Name, X + 138 - LenheartTextClass.GetStringLength(InfoObj.Name) / 2, Y + 5, sq_RGBA(134, 120, 79, 255), 0, 1);
//绘制职业名
L_sq_DrawCode(InfoObj.JobName, X + 234 - LenheartTextClass.GetStringLength(InfoObj.JobName) / 2, Y + 5, sq_RGBA(134, 120, 79, 255), 0, 1);
//离线了
if (InfoObj.ExitTime > 0) {
local DrawTime = InfoObj.ExitTime - (Clock() - ConstructorTime);
local seconds = (DrawTime / 1000) % 60; // 计算秒数
local minutes = (DrawTime / (1000 * 60)) % 60; // 计算分钟数
local DrawTimeStr = format("%02d分%02d秒", minutes, seconds);
L_sq_DrawCode(DrawTimeStr, X + 306 - LenheartTextClass.GetStringLength(DrawTimeStr) / 2, Y + 5, sq_RGBA(255, 50, 50, 255), 0, 1);
}
//通关次数
else if (InfoObj.ClearanceCount > 0) {
L_sq_DrawCode((InfoObj.ClearanceCount - 1) + "/" + (InfoObj.ClearanceCountMax), X + 306 - LenheartTextClass.GetStringLength((InfoObj.ClearanceCount - 1) + "/" + (InfoObj.ClearanceCountMax)) / 2, Y + 5, sq_RGBA(250, 250, 181, 255), 0, 1);
} else if (InfoObj.StkHasFlag) {
L_sq_DrawImg("hud/fiendwarlstk.img", 0, X + 280, Y + 3);
} else {
L_sq_DrawImg("hud/fiendwarlstk.img", 1, X + 280, Y + 3);
}
if (SelectState) {
L_sq_DrawImg("hud/fiendwarl.img", 13, X, Y);
}
if (isInRect) {
L_sq_DrawImg("hud/fiendwarl.img", 13, X, Y);
}
}
MousePos_X = 0;
MousePos_Y = 0;
//鼠标事件回调
function OnMouseProc(Flag, gMousePos_X, gMousePos_Y) {
this.MousePos_X = gMousePos_X;
this.MousePos_Y = gMousePos_Y;
LenheartNewUI_CommonUi.OnMouseProc(Flag, gMousePos_X, gMousePos_Y);
}
}

View File

@@ -1,227 +0,0 @@
/*
文件名:FiendwarPlayerInteractive.nut
路径:Plugins/Fiendwar/FiendwarPlayerInteractive.nut
创建日期:2024-04-02 10:55
文件用途:超时空玩家交互
*/
//角色交互按钮需要传递参数所以重写
class FiendwarPlayerInteractive_BaseButton extends LenheartNewUI_BaseButton {
OnShow = null;
constructor(X, Y, W, H, Path, Idx) {
LenheartNewUI_BaseButton.constructor(X, Y, W, H, Path, Idx);
}
//鼠标左键弹起回调
function OnMouseLbUp(MousePos_X, MousePos_Y) {
Y--;
if (isLBDown && OnClick) {
OnClick();
}
isLBDown = false;
local Each = LenheartNewUI_CreateWindow(FiendwarHallPlayerInteractiveC, "超时空玩家交互", X, Y, 100, 21, 0);
Each.Visible = false;
}
function Show(obj) {
//不可用
if (State == 8) {
L_sq_DrawImg(Path, Idx + 3, X, Y + 1);
} else {
//按下
if (isLBDown) {
Y++;
L_sq_DrawImg(Path, (Idx * 2) + 2, X, Y);
}
//悬停
else if (isInRect) {
L_sq_DrawImg(Path, (Idx * 2) + 1, X, Y);
}
//普通
else {
L_sq_DrawImg(Path, 0, X, Y);
}
}
if (OnShow) OnShow(X, Y);
}
}
//角色交互类
class FiendwarHallPlayerInteractiveC extends LenheartNewUI_Windows {
// DeBugMode = true;
//信息对象
InfoObj = null;
//初始化Flag 初始化以后才显示
InitInfoFlag = false;
//有多少个标签
InitIndexFlag = 1;
//头像框颜色
HandBoxColor = [
0xff717272,
0xff7b2a29,
0xff874e0d,
0xff8b8108,
0xff658e2d,
0xff0f5c8a,
0xff27238f,
0xff4e2491,
0xff932586,
]
//X Y 裁切开始X Y 裁切结束X Y
OffsetArr = [
//男鬼剑士
[45, 103, 230, 231],
//女格斗家
[56, 102, 235, 279],
//男神枪手
[52, 130, 238, 246],
//女魔法师
[55, 87, 234, 293],
//男圣职者
[42, 115, 223, 200],
//女神枪手
[52, 119, 226, 209],
//暗夜使者
[56, 102, 225, 226],
//男格斗家
[50, 114, 239, 216],
//男魔法师
[54, 103, 236, 276],
//黑暗武士
[46, 102, 229, 232],
//缔造者
[56, 86, 235, 293],
]
constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH) {
Childrens = [];
LenheartNewUI_Windows.constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH);
}
//初始化信息
function InitInfo() {
Childrens = [];
//还原标签数量
InitIndexFlag = 1;
//还原高度
Height = 21;
//还原可见性
Visible = true;
//置顶窗口
ResetFocus();
RegisterWidget();
InitInfoFlag = true;
}
function RegisterWidget() {
//是团长才能委任 并且不是我自己 并且我们在同一个攻坚队
if (FiendwarTotal.GetInstance().IsCaptain && !("IsMyself" in InfoObj) && FiendwarTotal.GetInstance().MyPartyId == InfoObj.PartyId) {
//委任团长按钮
local GiveMasterButton = FiendwarPlayerInteractive_BaseButton(0, 0 + (InitIndexFlag * 21), 100, 21, "interface2/popup_menu/popup_back.img", 0);
GiveMasterButton.OnShow = function(X, Y) {
L_sq_DrawImg("interface2/popup_menu/popup_icon_character.img", 11, X, Y + 2);
L_sq_DrawCode("委任团长", X + 36, Y + 5, sq_RGBA(104, 213, 237, 255), 0, 1);
}
GiveMasterButton.OnClick = function() {
}.bindenv(this);
AddChild(GiveMasterButton);
InitIndexFlag++;
Height += 21;
}
//查看信息按钮
local CheckInfoButton = FiendwarPlayerInteractive_BaseButton(0, 0 + (InitIndexFlag * 21), 100, 21, "interface2/popup_menu/popup_back.img", 0);
CheckInfoButton.OnShow = function(X, Y) {
L_sq_DrawImg("interface2/popup_menu/popup_icon_character.img", 10, X, Y + 2);
L_sq_DrawCode("查看信息", X + 36, Y + 5, sq_RGBA(104, 213, 237, 255), 0, 1);
}
CheckInfoButton.OnClick = function() {
local obj = sq_GetMyMasterCharacter();
//obj.sq_PlaySound("CLICK_BUTTON1");
L_sq_SendPackType(8);
L_sq_SendPackWord(InfoObj.PlayerSession);
L_sq_SendPackByte(3);
L_sq_SendPack();
getroottable().WindowsShowABFlag <- false; //让原生窗口置顶
}.bindenv(this);
AddChild(CheckInfoButton);
InitIndexFlag++;
Height += 21;
if (!("IsMyself" in InfoObj)) {
//交易按钮
local TransactionButton = FiendwarPlayerInteractive_BaseButton(0, 0 + (InitIndexFlag * 21), 100, 21, "interface2/popup_menu/popup_back.img", 0);
TransactionButton.OnShow = function(X, Y) {
L_sq_DrawImg("interface2/popup_menu/popup_icon_character.img", 0, X, Y + 2);
L_sq_DrawCode("交易", X + 46, Y + 5, sq_RGBA(104, 213, 237, 255), 0, 1);
}
TransactionButton.OnClick = function() {
local obj = sq_GetMyMasterCharacter();
//obj.sq_PlaySound("CLICK_BUTTON1");
L_sq_SendPackType(10);
L_sq_SendPackWord(InfoObj.PlayerSession);
L_sq_SendPackByte(1);
L_sq_SendPackDWord(22053);
L_sq_SendPack();
getroottable().WindowsShowABFlag <- false; //让原生窗口置顶
}.bindenv(this);
AddChild(TransactionButton);
InitIndexFlag++;
Height += 21;
if (FiendwarTotal.GetInstance().IsCaptain && FiendwarTotal.GetInstance().MyPartyId == InfoObj.PartyId) {
//攻坚队员强退按钮
local KickMemberButton = FiendwarPlayerInteractive_BaseButton(0, 0 + (InitIndexFlag * 21), 100, 21, "interface2/popup_menu/popup_back.img", 4);
KickMemberButton.OnShow = function(X, Y) {
L_sq_DrawImg("interface2/popup_menu/popup_icon_warning.img", 3, X, Y + 2);
L_sq_DrawCode("攻坚队员强退", X + 24, Y + 5, sq_RGBA(255, 50, 50, 255), 0, 1);
}
KickMemberButton.OnClick = function() {
local obj = sq_GetMyMasterCharacter();
//obj.sq_PlaySound("CLICK_BUTTON1");
local T = {
op = 20063021,
teamsId = InfoObj.PartyId,
charCid = InfoObj.Cid
}
Rindro_BaseToolClass.SendPackEx(T);
}.bindenv(this);
AddChild(KickMemberButton);
InitIndexFlag++;
Height += 21;
}
}
}
function Show(obj) {
if (!InitInfoFlag) return;
L_sq_DrawImg("interface2/popup_menu/popup_back.img", 0, X, Y);
//绘制角色名
L_sq_DrawCode(InfoObj.Name, X + 61 - LenheartTextClass.GetStringLength(InfoObj.Name) / 2, Y + 4, sq_RGBA(169, 255, 171, 255), 0, 1);
//绘制头像
foreach(AvatarObj in InfoObj.EquVos) {
local AXpos = AvatarObj.D[0] + X + OffsetArr[InfoObj.Job][0] - 40;
local AYpos = AvatarObj.D[1] + Y + OffsetArr[InfoObj.Job][1];
setClip(AXpos + OffsetArr[InfoObj.Job][2], AYpos + OffsetArr[InfoObj.Job][3], AXpos + OffsetArr[InfoObj.Job][2] + 22, AYpos + OffsetArr[InfoObj.Job][3] + 18); //开始裁切
L_sq_DrawImg("character/" + AvatarObj.B + ".img", AvatarObj.C, AXpos, AYpos);
releaseClip(); //裁切结束
}
LenheartNewUI_Windows.Show(obj);
}
function Proc(obj) {
LenheartNewUI_Windows.SyncPos(X, Y);
}
}

View File

@@ -265,14 +265,15 @@ class FiendRewardC extends LenheartNewUI_Windows {
local YOffset = -31 + Flag2;
sq_DrawBox(X + 30 + XOffset, Y + 1 + YOffset, 22, 18, PartyMasterIcon.HandBoxColor[PartyMasterIcon.InfoObj.TeamId]);
//绘制队长头像
foreach(AvatarObj in PartyMasterIcon.InfoObj.EquVos) {
local AXpos = AvatarObj.F[0][2] + X + PartyMasterIcon.OffsetArr[PartyMasterIcon.InfoObj.Job][0] + XOffset - 12;
local AYpos = AvatarObj.F[1][3] + Y + PartyMasterIcon.OffsetArr[PartyMasterIcon.InfoObj.Job][1] + YOffset;
setClip(AXpos + PartyMasterIcon.OffsetArr[PartyMasterIcon.InfoObj.Job][2], AYpos + PartyMasterIcon.OffsetArr[PartyMasterIcon.InfoObj.Job][3], AXpos + PartyMasterIcon.OffsetArr[PartyMasterIcon.InfoObj.Job][2] + 22, AYpos + PartyMasterIcon.OffsetArr[PartyMasterIcon.InfoObj.Job][3] + 18); //开始裁切
DrawImg("character/" + AvatarObj.B + ".img", AvatarObj.F[0][0], AXpos, AYpos);
releaseClip(); //裁切结束
}
// //绘制队长头像
// foreach(AvatarObj in PartyMasterIcon.InfoObj.EquVos) {
// local AXpos = AvatarObj.F[0][2] + X + PartyMasterIcon.OffsetArr[PartyMasterIcon.InfoObj.Job][0] + XOffset - 12;
// local AYpos = AvatarObj.F[1][3] + Y + PartyMasterIcon.OffsetArr[PartyMasterIcon.InfoObj.Job][1] + YOffset;
// setClip(AXpos + PartyMasterIcon.OffsetArr[PartyMasterIcon.InfoObj.Job][2], AYpos + PartyMasterIcon.OffsetArr[PartyMasterIcon.InfoObj.Job][3], AXpos + PartyMasterIcon.OffsetArr[PartyMasterIcon.InfoObj.Job][2] + 22, AYpos + PartyMasterIcon.OffsetArr[PartyMasterIcon.InfoObj.Job][3] + 18); //开始裁切
// DrawImg("character/" + AvatarObj.B + ".img", AvatarObj.F[0][0], AXpos, AYpos);
// releaseClip(); //裁切结束
// }
local DrawName = PartyMasterIcon.InfoObj.Name;
//绘制名字
L_sq_DrawCode(DrawName, X + XOffset + 100 - LenheartTextClass.GetStringLength(DrawName) / 2, Y + YOffset + 4, sq_RGBA(247, 214, 90, 250), 0, 1);

View File

@@ -326,14 +326,14 @@ class FiendwarFightSituationC extends LenheartNewUI_Windows {
sq_DrawBox(X + 30 + XOffset, Y + 1 + YOffset, 22, 18, PartyMasterIcon.HandBoxColor[PartyMasterIcon.InfoObj.TeamId]);
// //绘制队长头像
foreach(AvatarObj in PartyMasterIcon.InfoObj.EquVos) {
local AXpos = AvatarObj.F[0][2] + X + PartyMasterIcon.OffsetArr[PartyMasterIcon.InfoObj.Job][0] + XOffset - 12;
local AYpos = AvatarObj.F[1][3] + Y + PartyMasterIcon.OffsetArr[PartyMasterIcon.InfoObj.Job][1] + YOffset;
setClip(AXpos + PartyMasterIcon.OffsetArr[PartyMasterIcon.InfoObj.Job][2], AYpos + PartyMasterIcon.OffsetArr[PartyMasterIcon.InfoObj.Job][3], AXpos + PartyMasterIcon.OffsetArr[PartyMasterIcon.InfoObj.Job][2] + 22, AYpos + PartyMasterIcon.OffsetArr[PartyMasterIcon.InfoObj.Job][3] + 18); //开始裁切
DrawImg("character/" + AvatarObj.B + ".img", AvatarObj.F[0][0], AXpos, AYpos);
releaseClip(); //裁切结束
}
// // //绘制队长头像
// foreach(AvatarObj in PartyMasterIcon.InfoObj.EquVos) {
// local AXpos = AvatarObj.F[0][2] + X + PartyMasterIcon.OffsetArr[PartyMasterIcon.InfoObj.Job][0] + XOffset - 12;
// local AYpos = AvatarObj.F[1][3] + Y + PartyMasterIcon.OffsetArr[PartyMasterIcon.InfoObj.Job][1] + YOffset;
// setClip(AXpos + PartyMasterIcon.OffsetArr[PartyMasterIcon.InfoObj.Job][2], AYpos + PartyMasterIcon.OffsetArr[PartyMasterIcon.InfoObj.Job][3], AXpos + PartyMasterIcon.OffsetArr[PartyMasterIcon.InfoObj.Job][2] + 22, AYpos + PartyMasterIcon.OffsetArr[PartyMasterIcon.InfoObj.Job][3] + 18); //开始裁切
// DrawImg("character/" + AvatarObj.B + ".img", AvatarObj.F[0][0], AXpos, AYpos);
// releaseClip(); //裁切结束
// }
local RgbaValue = sq_RGBA(255, 255, 255, (250 * AlphaValue).tointeger());
if (PartyMasterIcon.InfoObj.Captain) RgbaValue = sq_RGBA(247, 214, 90, (250 * AlphaValue).tointeger());

View File

@@ -67,14 +67,14 @@ class FiendwarNotiC extends LenheartNewUI_Windows {
}
sq_DrawBox(X + 42 + 118, Y + 1 + 185, 22, 18, PartyMasterIcon.HandBoxColor[PartyMasterIcon.InfoObj.TeamId]);
//绘制队长头像
foreach(AvatarObj in PartyMasterIcon.InfoObj.EquVos) {
local AXpos = AvatarObj.D[0] + X + PartyMasterIcon.OffsetArr[PartyMasterIcon.InfoObj.Job][0] + 118;
local AYpos = AvatarObj.D[1] + Y + PartyMasterIcon.OffsetArr[PartyMasterIcon.InfoObj.Job][1] + 185;
setClip(AXpos + PartyMasterIcon.OffsetArr[PartyMasterIcon.InfoObj.Job][2], AYpos + PartyMasterIcon.OffsetArr[PartyMasterIcon.InfoObj.Job][3], AXpos + PartyMasterIcon.OffsetArr[PartyMasterIcon.InfoObj.Job][2] + 22, AYpos + PartyMasterIcon.OffsetArr[PartyMasterIcon.InfoObj.Job][3] + 18); //开始裁切
L_sq_DrawImg("character/" + AvatarObj.B + ".img", AvatarObj.C, AXpos, AYpos);
releaseClip(); //裁切结束
}
// //绘制队长头像
// foreach(AvatarObj in PartyMasterIcon.InfoObj.EquVos) {
// local AXpos = AvatarObj.D[0] + X + PartyMasterIcon.OffsetArr[PartyMasterIcon.InfoObj.Job][0] + 118;
// local AYpos = AvatarObj.D[1] + Y + PartyMasterIcon.OffsetArr[PartyMasterIcon.InfoObj.Job][1] + 185;
// setClip(AXpos + PartyMasterIcon.OffsetArr[PartyMasterIcon.InfoObj.Job][2], AYpos + PartyMasterIcon.OffsetArr[PartyMasterIcon.InfoObj.Job][3], AXpos + PartyMasterIcon.OffsetArr[PartyMasterIcon.InfoObj.Job][2] + 22, AYpos + PartyMasterIcon.OffsetArr[PartyMasterIcon.InfoObj.Job][3] + 18); //开始裁切
// L_sq_DrawImg("character/" + AvatarObj.B + ".img", AvatarObj.C, AXpos, AYpos);
// releaseClip(); //裁切结束
// }
}

View File

@@ -6,19 +6,6 @@
*/
dofile("sqr/Project/Fiendwar/FiendFightLogic.nut");
dofile("sqr/Project/Fiendwar/Rindro_Fiendwar_CreateParty.nut");
dofile("sqr/Project/Fiendwar/FiendwarHallGoBossDgn.nut");
dofile("sqr/Project/Fiendwar/FiendwarFightSituation.nut");
dofile("sqr/Project/Fiendwar/FiendwarNoti.nut");
dofile("sqr/Project/Fiendwar/Rindro_Fiendwar_Party.nut");
dofile("sqr/Project/Fiendwar/Rindro_Fiendwar_PartyApplyJoin.nut");
dofile("sqr/Project/Fiendwar/Rindro_Fiendwar_PartyFormation.nut");
dofile("sqr/Project/Fiendwar/Rindro_Fiendwar_PartyHall.nut");
dofile("sqr/Project/Fiendwar/Rindro_Fiendwar_PartyInfo.nut");
dofile("sqr/Project/Fiendwar/Rindro_Fiendwar_PartyMemberInfo.nut");
dofile("sqr/Project/Fiendwar/Rindro_Fiendwar_PlayerInteractive.nut");
dofile("sqr/Project/Fiendwar/FiendReward.nut");
//超时空核心数据类
@@ -175,7 +162,7 @@ class RinDro_Fiendwar extends Rindro_BaseToolClass {
JobName = MemberObj.PlayerGrowTypeJob, //职业名
Job = MemberObj.PlayerJob, //职业编号
StkHasFlag = MemberObj.isPrepare, //是否拥有攻坚材料
EquVos = MemberObj.equVos, //装备List 用于显示头像
EquVos = Rindro_Draw_Character(MemberObj.PlayerJob, MemberObj.equVos, "rest.ani", null), //装备List 用于显示头像
Captain = MemberObj.CaptainBool, //是否为攻坚队队长
Cid = MemberObj.CID, //Cid
OnlineState = MemberObj.onLineStart, //在线状态

View File

@@ -204,15 +204,15 @@ class Rindro_FiendwarApplyJoinC extends LenheartNewUI_Windows {
//绘制角色背景
L_sq_DrawImg("hud/fiendwarl.img", 14, X + 8, Y + 40);
//绘制角色头像
if (AvatarArr) {
foreach(AvatarObj in AvatarArr) {
local AXpos = AvatarObj.F[0][2] + X + OffsetArr[Job][0] - 8;
local AYpos = AvatarObj.F[0][3] + Y + OffsetArr[Job][1] + 40;
setClip(AXpos + OffsetArr[Job][2], AYpos + OffsetArr[Job][3], AXpos + OffsetArr[Job][2] + 22, AYpos + OffsetArr[Job][3] + 18); //开始裁切
L_sq_DrawImg("character/" + AvatarObj.B + ".img", AvatarObj.F[0][0], AXpos, AYpos);
releaseClip(); //裁切结束
}
}
// if (AvatarArr) {
// foreach(AvatarObj in AvatarArr) {
// local AXpos = AvatarObj.F[0][2] + X + OffsetArr[Job][0] - 8;
// local AYpos = AvatarObj.F[0][3] + Y + OffsetArr[Job][1] + 40;
// setClip(AXpos + OffsetArr[Job][2], AYpos + OffsetArr[Job][3], AXpos + OffsetArr[Job][2] + 22, AYpos + OffsetArr[Job][3] + 18); //开始裁切
// L_sq_DrawImg("character/" + AvatarObj.B + ".img", AvatarObj.F[0][0], AXpos, AYpos);
// releaseClip(); //裁切结束
// }
// }
//绘制角色等级
L_sq_DrawCode(Level, X + 78 - LenheartTextClass.GetStringLength(Level) / 2, Y + 45, sq_RGBA(134, 120, 79, 255), 0, 1);
//绘制角色名字

View File

@@ -36,7 +36,7 @@ class Rindro_FiendwarPartyInfoC extends LenheartNewUI_Windows {
win.ResetFocus();
local T = {
Charc = Jso.charac, //角色对象
Level = Jso.charac.PlayerLevel,
Level = Jso.charac.PlayerLevel.tostring(),
Name = Jso.charac.PlayerName,
Job = Jso.charac.PlayerJob,
PvpLevel = Jso.charac.pvp,
@@ -45,7 +45,7 @@ class Rindro_FiendwarPartyInfoC extends LenheartNewUI_Windows {
Fatigue = Jso.charac.PlayFatigue,
Combat = Jso.charac.ZL,
ClearanceCount = Jso.charac.ClearanceCount,
AvatarArr = Jso.charac.equVos,
AvatarArr = Rindro_Draw_Character(Jso.charac.PlayerJob, Jso.charac.equVos, "rest.ani", null),
PlayerSession = Jso.charac.PlayerSession
}
//没人

View File

@@ -132,14 +132,14 @@ class Rindro_FiendwarPartyInfoMemberC extends LenheartNewUI_CommonUi {
L_sq_DrawImg("interface/newstyle/windows/party/party_icon.img", InfoObj.TeamId * 3, X, Y + 1);
sq_DrawBox(X + 42, Y + 1, 22, 18, HandBoxColor[InfoObj.TeamId]);
//绘制队长头像
foreach(AvatarObj in InfoObj.EquVos) {
local AXpos = AvatarObj.F[0][2] + X + OffsetArr[InfoObj.Job][0];
local AYpos = AvatarObj.F[0][3] + Y + OffsetArr[InfoObj.Job][1];
setClip(AXpos + OffsetArr[InfoObj.Job][2], AYpos + OffsetArr[InfoObj.Job][3], AXpos + OffsetArr[InfoObj.Job][2] + 22, AYpos + OffsetArr[InfoObj.Job][3] + 18); //开始裁切
L_sq_DrawImg("character/" + AvatarObj.B + ".img", AvatarObj.F[0][0], AXpos, AYpos);
releaseClip(); //裁切结束
}
// //绘制队长头像
// foreach(AvatarObj in InfoObj.EquVos) {
// local AXpos = AvatarObj.F[0][2] + X + OffsetArr[InfoObj.Job][0];
// local AYpos = AvatarObj.F[0][3] + Y + OffsetArr[InfoObj.Job][1];
// setClip(AXpos + OffsetArr[InfoObj.Job][2], AYpos + OffsetArr[InfoObj.Job][3], AXpos + OffsetArr[InfoObj.Job][2] + 22, AYpos + OffsetArr[InfoObj.Job][3] + 18); //开始裁切
// L_sq_DrawImg("character/" + AvatarObj.B + ".img", AvatarObj.F[0][0], AXpos, AYpos);
// releaseClip(); //裁切结束
// }
if (InfoObj.Captain) L_sq_DrawImg("hud/fiendwarl.img", 18, X + 42, Y + 1);

View File

@@ -209,14 +209,14 @@ class Rindro_FiendwarPlayerInteractiveC extends LenheartNewUI_Windows {
L_sq_DrawImg("interface2/popup_menu/popup_back.img", 0, X, Y);
//绘制角色名
L_sq_DrawCode(InfoObj.Name, X + 61 - LenheartTextClass.GetStringLength(InfoObj.Name) / 2, Y + 4, sq_RGBA(169, 255, 171, 255), 0, 1);
//绘制头像
foreach(AvatarObj in InfoObj.EquVos) {
local AXpos = AvatarObj.F[0][2] + X + OffsetArr[InfoObj.Job][0] - 40;
local AYpos = AvatarObj.F[0][3] + Y + OffsetArr[InfoObj.Job][1];
setClip(AXpos + OffsetArr[InfoObj.Job][2], AYpos + OffsetArr[InfoObj.Job][3], AXpos + OffsetArr[InfoObj.Job][2] + 22, AYpos + OffsetArr[InfoObj.Job][3] + 18); //开始裁切
L_sq_DrawImg("character/" + AvatarObj.B + ".img", AvatarObj.F[0][0], AXpos, AYpos);
releaseClip(); //裁切结束
}
// //绘制头像
// foreach(AvatarObj in InfoObj.EquVos) {
// local AXpos = AvatarObj.F[0][2] + X + OffsetArr[InfoObj.Job][0] - 40;
// local AYpos = AvatarObj.F[0][3] + Y + OffsetArr[InfoObj.Job][1];
// setClip(AXpos + OffsetArr[InfoObj.Job][2], AYpos + OffsetArr[InfoObj.Job][3], AXpos + OffsetArr[InfoObj.Job][2] + 22, AYpos + OffsetArr[InfoObj.Job][3] + 18); //开始裁切
// L_sq_DrawImg("character/" + AvatarObj.B + ".img", AvatarObj.F[0][0], AXpos, AYpos);
// releaseClip(); //裁切结束
// }
LenheartNewUI_Windows.Show(obj);
}

View File

@@ -0,0 +1,138 @@
/*
文件名:FixItemCout.nut
路径:Project/FixItemCout/FixItemCout.nut
创建日期:2026-01-14 16:58
文件用途:
*/
class FixItemCoutC {
Img = Rindro_Image("common/smallnumber.img");
Img2 = Rindro_Image("interface/digit/small_stroke_white.img");
LengthList = [6, 4, 6, 6, 6, 6, 6, 6, 6, 6, 3, 8, 7];
SmallLengthList = [5, 4, 5, 5, 5, 5, 5, 5, 5, 5];
constructor() {
_FixItemCount_();
}
function Logic(X, Y, Count) {
if (Count > 1) {
local Suf = -1;
if (Count > 9999) {
Count = Count / 10000.0;
Suf = 12;
local Str = Count.tostring();
if (typeof Count == "float") Str = format("%.1f", Count);
local Length = 0;
local DrawList = [];
for (local i = 0; i< Str.len(); i++) {
local char = Str.slice(i, i + 1);
local Width = 0;
if (char == ".") {
Width = 3;
DrawList.append({
index = 10,
width = Width
})
} else {
local Index = char.tointeger();
Width = LengthList[Index];
DrawList.append({
index = Index,
width = Width
})
}
Length += Width;
}
if (Suf != -1) {
DrawList.append({
index = Suf,
width = LengthList[Suf]
})
Length += LengthList[Suf];
}
local DrawOffset = 0;
foreach(index, info in DrawList) {
local offset = 0;
if (index != 0) {
offset = DrawList[index - 1].width + DrawOffset
}
Img.DrawPng(info.index, X - Length + offset, Y + (info.index == 10 ? 7 : 0) + (info.index == 12 ? -1 : 0));
DrawOffset = offset;
}
} else if (Count > 999 && Count <= 9999) {
local Str = Count.tostring();
local Length = 0;
local DrawList = [];
for (local i = 0; i< Str.len(); i++) {
local char = Str.slice(i, i + 1);
local Index = char.tointeger();
DrawList.append({
index = Index,
width = SmallLengthList[Index]
});
Length += SmallLengthList[Index];
}
local DrawOffset = 0;
foreach(index, info in DrawList) {
local offset = 0;
if (index != 0) {
offset = DrawList[index - 1].width + DrawOffset
}
Img2.DrawPng(info.index, X - 1 - Length + offset, Y);
DrawOffset = offset;
}
} else if (Count <= 999) {
local Str = Count.tostring();
local Length = 0;
local DrawList = [];
for (local i = 0; i< Str.len(); i++) {
local char = Str.slice(i, i + 1);
local Index = char.tointeger();
DrawList.append({
index = Index,
width = LengthList[Index]
});
Length += LengthList[Index];
}
local DrawOffset = 0;
foreach(index, info in DrawList) {
local offset = 0;
if (index != 0) {
offset = DrawList[index - 1].width + DrawOffset
}
Img.DrawPng(info.index, X - 1 - Length + offset, Y);
DrawOffset = offset;
}
}
}
}
}
getroottable().rawdelete("FixItemCout_Obj");
function Lenheart_FixItemCout_Fun(obj) {
local RootTab = getroottable();
if (!RootTab.rawin("FixItemCout_Obj")) {
RootTab.rawset("FixItemCout_Obj", FixItemCoutC());
}
}
function Sq_FixItemCount(X, Y, Count) {
local RootTab = getroottable();
if (RootTab.rawin("FixItemCout_Obj")) {
RootTab["FixItemCout_Obj"].Logic(X, Y, Count);
}
}
getroottable()["LenheartBaseFuncTab"].rawset("FixItemCoutFuncN", Lenheart_FixItemCout_Fun);

View File

@@ -146,10 +146,10 @@ class ItemCrossoverC extends LenheartNewUI_Windows {
if (!MaterialIsEnough) {
local str = "跨界材料不足!";
L_sq_DrawCode(str, X + 147 - LenheartTextClass.GetStringLength(str) / 2, Y + 142, sq_RGBA(255, 60, 48, 255), 0, 1);
L_sq_DrawCode(str, X + 148 - LenheartTextClass.GetStringLength(str) / 2, Y + 142, sq_RGBA(255, 60, 48, 255), 0, 1);
} else {
local str = CrossoverItem.Name;
L_sq_DrawCode(str, X + 147 - LenheartTextClass.GetStringLength(str) / 2, Y + 142, GetRarityColor(CrossoverItem.Rarity), 0, 1);
L_sq_DrawCode(str, X + 148 - LenheartTextClass.GetStringLength(str) / 2, Y + 142, GetRarityColor(CrossoverItem.Rarity), 0, 1);
}
}
}

View File

@@ -16,12 +16,8 @@ class ItemFusionC_ItemSlot extends LenheartNewUI_ItemSlot {
HoverFlag = false;
<<<<<<< HEAD
constructor(X, Y, Index) {
MyIndex = Index;
=======
constructor(X, Y) {
>>>>>>> a11458d226ec41caa22d30b6d76893362389e3e1
LenheartNewUI_ItemSlot.constructor(X, Y);
}
@@ -36,21 +32,21 @@ class ItemFusionC_ItemSlot extends LenheartNewUI_ItemSlot {
// if (Item.rawin("itemAddress")) Parent.TemporaryDrawItemAddress = null;
// }
CheckInRect();
// CheckInRect();
}
function CheckInRect() {
local MousePos_X = IMouse.GetXPos();
local MousePos_Y = IMouse.GetYPos();
if (sq_IsIntersectRect(MousePos_X, MousePos_Y, 1, 1, X, Y, 30, 30)) {
//绘制悬停框
L_sq_SetDrawImgModel(2, 0);
Rindro_Image_GlobalMap["lenheartui"].DrawPng(353, X, Y);
L_sq_ReleaseDrawImgModel();
HoverFlag = true;
} else HoverFlag = false;
}
// function CheckInRect() {
// local MousePos_X = IMouse.GetXPos();
// local MousePos_Y = IMouse.GetYPos();
// if (sq_IsIntersectRect(MousePos_X, MousePos_Y, 1, 1, X, Y, 30, 30)) {
// //绘制悬停框
// L_sq_SetDrawImgModel(2, 0);
// Rindro_Image_GlobalMap["lenheartui"].DrawPng(353, X, Y);
// L_sq_ReleaseDrawImgModel();
// HoverFlag = true;
// } else HoverFlag = false;
// }
function DiscardItem(info) {

View File

@@ -68,6 +68,7 @@ class ItemInheritC extends LenheartNewUI_Windows {
// ResultItemSlot.SetItem(ItemR);
AddChild(ResultItemSlot);
}

View File

@@ -0,0 +1,354 @@
/*
文件名:ItemOtherWolrdUpgrade.nut
路径:Project/ItemTool/ItemOtherWolrdUpgrade/ItemOtherWolrdUpgrade.nut
创建日期:2026-01-13 19:31
文件用途:
*/
class ItemOtherWolrdUpgradeC extends LenheartNewUI_Windows {
//调试模式
// DeBugMode = true;
//不是窗口
// NoWindow = true;
//是否可见
Visible = false;
Img = Rindro_Image("interface2/ui/newitemtool/otherworldup.img");
//装备
Item = null;
//装备槽位
ItemSlot = null;
//注册的NPC列表
NPCList = null;
//所需的基础材料
BasicMaterials = null;
//等级倍率
LevelRate = null;
//品级倍率
RarityRate = null;
//背景动画
BackGroundAni = null;
//错误
Error = null;
//错误信息
ErrorMsg = null;
//所需材料信息
MaterialInfo = null;
//所需材料是否足够
MaterialIsEnough = false;
constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH) {
Childrens = [];
//注册控件
RegisterWidget();
LenheartNewUI_Windows.constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH);
DiscardItemCallBackFunc.rawset("ItemOtherWolrdUpgradeC", DiscardItem.bindenv(this));
//初始化信息
InifPvf();
//注册NPC回调
RegNpc();
//初始化背景动画
local BallFrameArr = [];
for (local i = 0; i< 30; i++) {
local T = {
ImgIndex = i,
Delay = 60,
Pos = [0, 0]
}
BallFrameArr.append(T);
}
BackGroundAni = Rindro_CustomAnimation("interface2/itemtoolwindow/changeoptions/mastercube.img", BallFrameArr);
Pack_Control.rawset(21010002, function(Chunk) {
local Jso = Json.Decode(Chunk);
if (Jso.rawin("error")) {
ErrorMsg = 1;
}
if (Jso.rawin("MgInfo")) {
MaterialInfo = Jso.MgInfo;
//材料是否充足
MaterialIsEnough = true;
foreach(Info in MaterialInfo) {
if (Info.NeedCount > Info.RealCount) {
MaterialIsEnough = false;
break;
}
}
}
}.bindenv(this));
//成功回包
Pack_Control.rawset(21010004, function(Chunk) {
//清空
Item = null;
ItemSlot.RemoveItem();
ErrorMsg = null;
MaterialInfo = null;
MaterialIsEnough = false;
// R_Utils.PlaySound("CHNUTTREE_BOX");
}.bindenv(this));
}
function RegisterWidget() {
//关闭按钮
local CloseButton = LenheartNewUI_BaseButton(274, 4, 11, 12, "interface/lenheartwindowcommon.img", 276);
CloseButton.OnClick = function() {
this.Visible = false;
}.bindenv(this);
Childrens.append(CloseButton);
//确认按钮
local CrossoverButton = LenheartNewUI_ButtonText(109, 260, 15, "确认升级");
CrossoverButton.DWidth = 18;
CrossoverButton.Width = 74;
CrossoverButton.SetTextOffset(-4, 1);
CrossoverButton.OnClickEx = function(Btn) {
if (!Btn.Visible) return;
SendPackEx({
op = 21010003,
item = Item
});
}.bindenv(this);
CrossoverButton.SetCallBackFunc(function(Btn) {
if (ErrorMsg || !MaterialIsEnough) {
Btn.State = 8;
} else {
Btn.State = 0;
}
}.bindenv(this));
AddChild(CrossoverButton);
ItemSlot = LenheartNewUI_ItemSlot(132, 100);
ItemSlot.SetRemoveCallBack(function(obj) {
Item = null;
}.bindenv(this));
AddChild(ItemSlot);
}
//绘制主界面
function DrawMain(obj) {
//背景框
DrawNineBox(X, Y, 292, 292, "interface/lenheartwindowcommon.img", 213);
//标题
DrawWindowTitle(293);
//绘制标题名
L_sq_DrawCode("异界装备升级", X + 110, Y + 5, sq_RGBA(230, 200, 155, 255), 0, 1);
setClip(X + 8, Y + 32, X + 285, Y + 259);
local rate = 0.35;
Img.DrawExPng(1, X + 12, Y + 36, 0, sq_RGBA(255, 255, 255, 250), rate, rate);
L_sq_SetDrawImgModel(2, 0);
BackGroundAni.ShowEx(Duration, X + 12 - 80, Y + 36 - 45, sq_RGBA(255, 255, 255, 250), 0.75, 0.75);
L_sq_ReleaseDrawImgModel();
releaseClip();
Img.DrawPng(0, X + 8, Y + 32);
// if (MaterialsList) {
// foreach(Index, Info in MaterialsList) {
// DrawItemBase(X + 31 + 51 * Index, Y + 195, Info.ItemId, Info.ItemCount);
// }
// }
//绘制跨界所需材料及数量信息
if (MaterialInfo) {
for (local i = 0; i< 5; i++) {
if (i >= MaterialInfo.len()) {
Img.DrawPng(2, X + 31 + 51 * i, Y + 195);
continue;
}
local Info = MaterialInfo[i];
DrawItemBase(X + 31 + 51 * i, Y + 195, Info.Item, Info.NeedCount);
//数量不足绘制遮盖图
if (Info.NeedCount > Info.RealCount) {
Rindro_Image_GlobalMap["lenheartui"].DrawExPng(257, X + 32 + 51 * i, Y + 196, 0, sq_RGBA(255, 255, 255, 120), 1.0, 1.0);
}
local RealCountStr = Info.RealCount.tostring();
local Color = Info.RealCount >= Info.NeedCount ? sq_RGBA(52, 255, 50, 255) : sq_RGBA(255, 60, 47, 255);
L_sq_DrawCode(RealCountStr, X + 46 + (51 * i) - LenheartTextClass.GetStringLength(RealCountStr) / 2, Y + 232, Color, 0, 1);
}
if (!MaterialIsEnough) {
local str = "升级材料不足!";
L_sq_DrawCode(str, X + 148 - LenheartTextClass.GetStringLength(str) / 2, Y + 142, sq_RGBA(255, 60, 48, 255), 0, 1);
} else {
local str = Item.Name;
L_sq_DrawCode(str, X + 148 - LenheartTextClass.GetStringLength(str) / 2, Y + 142, GetRarityColor(Item.Rarity), 0, 1);
}
}
}
function Show(obj) {
DrawMain(obj);
LenheartNewUI_Windows.Show(obj);
}
//逻辑入口
function Proc(obj) {
LenheartNewUI_Windows.SyncPos(X, Y);
}
function DiscardItem(ItemAddress) {
local MousePos_X = IMouse.GetXPos();
local MousePos_Y = IMouse.GetYPos();
if (!sq_IsIntersectRect(MousePos_X, MousePos_Y, 1, 1, X, Y, Width, Height)) return true;
if (!Visible) return true;
else {
Item = FindItemPosByForeachInven(ItemAddress);
if (Item) {
local ItemObject = Rindro_Item();
ItemObject.LoadByAddress(Item.ItemAddress);
ItemSlot.SetItem(ItemObject);
SendPackEx({
op = 21010001,
item = Item
});
}
}
}
//遍历背包查找Item
function FindItemPosByForeachInven(FindAddress) {
local Inven = L_sq_RA(0x1A5FB24);
local InvenAdd = L_sq_RA(Inven + 56);
InvenAdd += 36;
for (local z = 0; z< 1; z++) {
for (local i = 0; i< 48; i++) {
local ItemAdd = L_sq_RA(InvenAdd + ((i + (z * 48)) * 4));
if (ItemAdd == FindAddress) {
local NamePointer = L_sq_RA(FindAddress + 0x20);
if (z != 0) {
if (ItemInfoDrawS) {
L_Sq_CallFunc(0xE6B2B0, "int", FFI_THISCALL, ["int", "int", "int", "char"], 0x1ADE090, 0x113, 0xFFFFFFFF, 0x0);
ItemInfoDrawS = null;
ResetFocus();
}
return null;
}
local rRarity = L_sq_RA(FindAddress + 0xF4);
//不是异界装备
if (rRarity != 5) return;
return {
Type = z,
Pos = i,
Vis = false,
Count = MemoryTool.DecodeMemoryData(FindAddress + 0x1A4),
ItemId = L_sq_RA(FindAddress + 0x1c),
ItemAddress = FindAddress,
Name = NativePointer(L_sq_I2P(NamePointer)).readUnicodeString(),
Rarity = rRarity,
Level = L_sq_RA(FindAddress + 0x8)
};
}
}
}
return null;
}
//读取配置
function InifPvf() {
Rindro_Script.GetFileData("etc/rindro/itemtool/itemotherworldupgrade/itemotherworldupgrade.etc", function(DataTable, Data) {
while (!Data.Eof()) {
local Fragment = Data.Get();
if (Fragment == "[NPC]") {
NPCList = [];
while (true) {
local Fbuf = Data.Get();
if (Fbuf == "[/NPC]") {
break;
}
NPCList.append(Fbuf);
}
} else if (Fragment == "[BASIC MATERIALS]") {
BasicMaterials = [];
while (true) {
local Fbuf = Data.Get();
if (Fbuf == "[/BASIC MATERIALS]") {
break;
}
local T = {
Item = Fbuf,
Count = Data.Get()
}
BasicMaterials.push(T);
}
} else if (Fragment == "[LEVEL RATE]") {
LevelRate = Data.Get()
} else if (Fragment == "[RARITY RATE]") {
RarityRate = Data.Get()
}
}
});
}
function RegNpc() {
local EachManager = Lenheart_Get_EachObj();
foreach(id in NPCList) {
//先清空注册
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 = 53;
ApplyEngagementButton.Str = "装备升级";
ApplyEngagementButton.Data = SThis.NPC_Index;
ApplyEngagementButton.OnClick = function(Button) {
InitWindow();
//打开背包
L_sq_Open_ExWindow(0x1ADE090, 0, 0, 1);
Button.Parent.CloseAllEach();
Button.Parent.CloseWindow();
ResetFocus();
R_Utils.PlaySound("WINDOW_SHOW");
}.bindenv(this);
ApplyEngagementButton.SetCallBackFunc(function(Button) {})
SThis.AddChild(ApplyEngagementButton);
}.bindenv(this));
}
}
function InitWindow() {
Visible = true;
//清空
Item = null;
ItemSlot.RemoveItem();
ErrorMsg = null;
MaterialInfo = null;
MaterialIsEnough = false;
}
}
L_Windows_List <- [];
getroottable().rawdelete("LenheartPluginsInitFlag");
getroottable().rawdelete("EventList_Obj")
getroottable().rawdelete("ItemOtherWolrdUpgrade_Obj");
getroottable().rawdelete("L_Each_Obj");
function Lenheart_ItemOtherWolrdUpgrade_Fun(obj) {
local RootTab = getroottable();
if (!RootTab.rawin("ItemOtherWolrdUpgrade_Obj")) {
RootTab.rawset("ItemOtherWolrdUpgrade_Obj", true);
LenheartNewUI_CreateWindow(ItemOtherWolrdUpgradeC, "异界装备升级窗口", ((getroottable().Rindro_Scr_Width - 700) / 2).tointeger(), 160, 292, 290, 28);
}
}
getroottable()["LenheartFuncTab"].rawset("ItemOtherWolrdUpgradeFuncN", Lenheart_ItemOtherWolrdUpgrade_Fun);

View File

@@ -36,7 +36,7 @@ class Rindro_LukePartyInfoC extends LenheartNewUI_Windows {
win.ResetFocus();
local T = {
Charc = Jso.charac, //角色对象
Level = Jso.charac.PlayerLevel,
Level = Jso.charac.PlayerLevel.tostring(),
Name = Jso.charac.PlayerName,
Job = Jso.charac.PlayerJob,
PvpLevel = Jso.charac.pvp,

View File

@@ -0,0 +1,178 @@
/*
文件名:NewItemInfoWindow.nut
路径:Project/NewItemInfoWindow/NewItemInfoWindow.nut
创建日期:2026-01-18 11:22
文件用途:
*/
class NewItemInfoWindowC extends Rindro_BaseToolClass {
//绘制信息Map
DrawInfoMap = null;
//Script信息
ScriptInfoMap = null;
//需要添加绘制HOOK的List
NeedDrawHookList = null;
//自定义绘制代理
CustomDrawDelegate = null;
constructor() {
DrawInfoMap = {};
ScriptInfoMap = {};
CustomDrawDelegate = {};
NeedDrawHookList = {};
Fix();
}
//绘制Info
function Show(InfoList, EquipAddress, XPos, YPos) {
if (!DrawInfoMap.rawin(EquipAddress)) {
local ItemObject = Rindro_Item();
ItemObject.LoadByAddress(EquipAddress);
ItemObject.ConstructDrawingInformation(InfoList);
DrawInfoMap.rawset(EquipAddress, ItemObject);
}
DrawInfoMap[EquipAddress].Show(XPos, YPos);
}
function Proc() {
//鼠标没有悬停东西的时候直接清空绘制信息
if (NativePointer(0x1AE45B4).readInt() == 0) {
DrawInfoMap = {};
}
if (KeyPress.isKeyPress(OPTION_HOTKEY_TOOLTIP_)) {
DrawInfoMap = {};
}
}
function AddDelegate(Name, Height, Func, CheckFunc) {
CustomDrawDelegate.rawset(Name, {
//代理区域高度
Height = Height,
//代理回调函数
Func = Func,
//代理条件
CheckFunc = CheckFunc
})
}
function AddHookItemId(Index) {
NeedDrawHookList.rawset(Index, true);
}
function RemoveDelegate(Name) {
CustomDrawDelegate.rawdelete(Name);
}
function RemoveHookItemId(Index) {
NeedDrawHookList.rawdelete(Index);
}
function Fix() {
NativePointer(0xF363D9).writeByteArray(array(16, 0x90))
Rindro_Haker.LoadHook(0xF363D0, ["int", "int", "int", "void"],
function(args) {
//先获取到 DrawItemContent_F36110 的 a3参数
local a3 = L_sq_P2I(Rindro_Haker.CpuContext.ecx) + 0x17c;
//计算
//数据头尾指针 一个元素 72字节
local Start = NativePointer(a3).add(0x4).readInt();
local End = NativePointer(a3).add(0x8).readInt();
//数据数组长度
local Length = ((End - Start) / 72);
//原数据
local InfoList = [];
//获取装备编号 (遍历所有数据块 找到标志位 读取装备指针)
local EquipAddress = 0;
for (local i = 1; i< Length; i++) {
local Info = {};
local Str = null;
if (NativePointer(Start).add(72 * i + 0x24).readInt()< 8) {
local StrPointer = NativePointer(Start).add(72 * i + 0x10);
if (L_sq_P2I(StrPointer.C_Object) > 0x400000) {
Str = StrPointer.readUnicodeString();
}
} else {
local StrPointer = NativePointer(Start).add(72 * i + 0x10).readInt();
if (StrPointer > 0x400000) {
Str = NativePointer(StrPointer).readUnicodeString();
}
}
Info.Str <- Str;
Info.Flag <- NativePointer(Start).add(72 * i).readInt();
local Pos = NativePointer(Start).add(72 * i + 0x4).readInt();
local Color = NativePointer(Start).add(72 * i + 0x8).readInt();
//特殊的位置信息 作为标志位的时候 颜色是装备指针
if (Pos == 947330670) {
EquipAddress = Color;
}
Info.Color <- Color;
InfoList.append(Info);
}
if (EquipAddress != 0) {
// printf("装备编号: " + NativePointer(EquipAddress).add(0x1c).readInt());
local XPos = NativePointer(L_sq_P2I(Rindro_Haker.CpuContext.esi) + 0x14).readInt();
local YPos = NativePointer(L_sq_P2I(Rindro_Haker.CpuContext.esi) + 0x18).readInt();
Show(InfoList, EquipAddress, XPos, YPos);
//HOOK原逻辑不执行
NativePointer(0xF363D9).writeByteArray(array(16, 0x90))
}
return null;
}.bindenv(this),
function(args) {
//还原原逻辑
NativePointer(0xF363D9).writeByteArray([0x80, 0xBE, 0x90, 0x01, 0x00, 0x00, 0x00, 0x74, 0x0E, 0xC6, 0x86, 0x90, 0x01, 0x00, 0x00, 0x00]);
return null;
}.bindenv(this));
//构造信息时
Rindro_Haker.LoadHook(0xF542F0, ["int", "int", "int", "int", "int"],
function(args) {
//找到新增分割线的构造时机 将标志位写入位置参数 将Item地址写入颜色参数
if (args[0] > 0) {
if (NativePointer(args[1]).readUnicodeString().len() <= 0) {
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)) {
args[2] = 947330670;
args[3] = EquipmentAddress;
return args;
}
}
}
}.bindenv(this),
function(args) {
return null;
}.bindenv(this));
}
}
getroottable().rawdelete("NewItemInfoWindow_Obj");
function Lenheart_NewItemInfoWindow_Fun(obj) {
local RootTab = getroottable();
if (!RootTab.rawin("NewItemInfoWindow_Obj")) {
RootTab.rawset("NewItemInfoWindow_Obj", NewItemInfoWindowC());
}
RootTab["NewItemInfoWindow_Obj"].Proc();
}
getroottable()["LenheartBaseFuncTab"].rawset("NewItemInfoWindowFuncN", Lenheart_NewItemInfoWindow_Fun);

View File

@@ -0,0 +1,619 @@
/*
文件名:NewTitle.nut
路径:Project/NewTitle/NewTitle.nut
创建日期:2026-01-29 02:36
文件用途:
*/
NewTitleC_Img_Map <- {};
class NewTitleC extends LenheartNewUI_Windows {
//调试模式
// DeBugMode = true;
//不是窗口
// NoWindow = true;
//是否可见
Visible = false;
Img = Rindro_Image("interface2/titlebook/titlebook_ver2.img");
BackGroundAni = null;
BackGroundAni2 = null;
ImgT = Rindro_Image("newtitle/nangua.img");
//信息
Info = null;
//数据信息
DataInfo = null;
//渲染指导信息
ShowData = null;
//称谓类别
CategoryTitle = null;
//称谓按钮List
TitleButtonList = null;
//是否显示复选框
IsDisplayBtn = null;
//层级输入框
InputObject = null;
//当前类别
CurrentCategory = 0; // 当前类别索引
//当前页数
CurrentPage = 0;
//当前选中称谓ID
CurrentSelectId = 1;
//当前选中称谓信息
CurrentSelectInfo = null;
//是否拥有当前选中称谓
CurrentSelectHaveFlag = false;
//当前选中缩放
CurrentSelectScale = 1.0;
//当前选中X轴偏移
CurrentSelectXOffset = 0;
//当前选中Y轴偏移
CurrentSelectYOffset = 0;
function CheckBookInfo() {
SendPackEx({
op = 21012001
})
}
constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH) {
DataInfo = {};
Childrens = [];
//读取PVF
InitPvf();
//注册控件
RegisterWidget();
LenheartNewUI_Windows.constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH);
//初始化背景动画
local FrameArr = [];
for (local i = 0; i< 16; i++) {
local T = {
ImgIndex = i,
Delay = 120,
Pos = [0, 0]
}
FrameArr.append(T);
}
BackGroundAni = Rindro_CustomAnimation("interface2/titlebook/titlebook_effects.img", FrameArr);
local FrameArr2 = [];
for (local i = 16; i< 32; i++) {
local T = {
ImgIndex = i,
Delay = 120,
Pos = [0, 0]
}
FrameArr2.append(T);
}
BackGroundAni2 = Rindro_CustomAnimation("interface2/titlebook/titlebook_effects.img", FrameArr2);
//因为json在传输中会将数字Key转为字符串 所以需要转int
Pack_Control.rawset(21012002, function(Chunk) {
local Jso = Json.Decode(Chunk);
foreach(index, value in Jso.Info) {
DataInfo.rawset(index.tointeger(), value);
}
}.bindenv(this));
//接受需要渲染的称谓数据
Pack_Control.rawset(21012004, function(Chunk) {
ShowData = {};
local Jso = Json.Decode(Chunk);
foreach(index, value in Jso.ShowData) {
foreach(DrawObj in value) {
local PvfInfo = GetTitlePvfInfo(DrawObj.Id.tointeger())
DrawObj.Category <- PvfInfo.Category;
DrawObj.Content <- Json.Decode(Json.Encode(PvfInfo.Content));
}
ShowData.rawset(index.tointeger(), value);
}
}.bindenv(this));
CheckBookInfo();
WorldDrawVirtualCharacterCallBackFunc.rawset("NewTitleC", function(Layer, XPos, YPos, WorldId, Name) {
if (ShowData) {
if (ShowData.rawin(WorldId)) {
foreach(ShowInfo in ShowData[WorldId]) {
//图像
if (ShowInfo.Content.type == "img") {
//没有添加缓存的先添加缓存
if (!NewTitleC_Img_Map.rawin(ShowInfo.Content.img)) {
NewTitleC_Img_Map.rawset(ShowInfo.Content.img, Rindro_Image(ShowInfo.Content.img));
}
//这里从展示框的左上角开始算起 展示框大小为 290 * 115 如果添加新的称谓 可以现在PS里缩放 并记录下针对左上角坐标的偏移 与 缩放值
NewTitleC_Img_Map[ShowInfo.Content.img].DrawExPng(ShowInfo.Content.index,
XPos + ShowInfo.XOffset,
YPos + ShowInfo.YOffset, 0, 0xffffffff,
ShowInfo.Scale.tofloat(), ShowInfo.Scale.tofloat())
}
//Ani
else if (ShowInfo.Content.type == "ani") {
local Ani = DrawAniEx(XPos + ShowInfo.XOffset, YPos + ShowInfo.YOffset, ShowInfo.Content.ani);
Ani.setImageRateFromOriginal(ShowInfo.Scale.tofloat(), ShowInfo.Scale.tofloat());
Ani.setAutoLayerWorkAnimationAddSizeRate(ShowInfo.Scale.tofloat(), ShowInfo.Scale.tofloat());
}
}
}
}
}.bindenv(this));
}
function RegisterWidget() {
//关闭按钮
local CloseButton = LenheartNewUI_BaseButton(435, 4, 11, 12, "interface/lenheartwindowcommon.img", 276);
CloseButton.OnClick = function() {
this.Visible = false;
}.bindenv(this);
Childrens.append(CloseButton);
//注册类别
RegisterCategoryTitle();
TitleButtonList = [];
for (local i = 0; i< 9; i++) {
local TitleButtonBuffer = NewTitleC_Button(14, 138 + (37 * i), Img);
TitleButtonBuffer.OnClickEx = function(Btn) {
CurrentSelectId = Btn.Id;
CurrentSelectInfo = Btn.Info;
local DataInfoObj = null;
//如果有数据
if (DataInfo.rawin(CurrentSelectId)) {
DataInfoObj = DataInfo[CurrentSelectId];
IsDisplayBtn.IsSelected = DataInfoObj.IsDisplay;
if (IsDisplayBtn.IsSelected) IsDisplayBtn.State = 1;
else IsDisplayBtn.State = 0;
InputObject.SetStr(DataInfoObj.ZOrder.tostring());
CurrentSelectScale = DataInfoObj.Scale;
CurrentSelectXOffset = DataInfoObj.XOffset;
CurrentSelectYOffset = DataInfoObj.YOffset;
CurrentSelectHaveFlag = true;
} else {
CurrentSelectHaveFlag = false;
}
}.bindenv(this);
AddChild(TitleButtonBuffer);
TitleButtonList.append(TitleButtonBuffer);
}
local CheckCurrentSelectIdFunc = function(Btn) {
//如果没有选中 或者没有信息 或者没有拥有
if (!CurrentSelectId || !CurrentSelectInfo || !DataInfo.rawin(CurrentSelectId)) {
Btn.Visible = false;
} else {
Btn.Visible = true;
}
}.bindenv(this);
//是否显示复选框
IsDisplayBtn = NewTitleC_SwitchButton(252, 424);
IsDisplayBtn.OnClickEx = function(Btn) {
}.bindenv(this);
IsDisplayBtn.SetCallBackFunc(CheckCurrentSelectIdFunc);
AddChild(IsDisplayBtn);
//层级输入框
InputObject = LenheartNewUI_BaseInput(360, 423, 50, 20);
InputObject.SetCallBackFunc(CheckCurrentSelectIdFunc);
AddChild(InputObject);
// InputObject.SetStr("131232");
//保存按钮
local ConfirmButton = LenheartNewUI_ButtonText(364, 481, 15, " 保 存");
ConfirmButton.DWidth = 18;
ConfirmButton.Width = 74;
ConfirmButton.SetTextOffset(-4, 1);
ConfirmButton.OnClickEx = function(Btn) {
if (Btn.Visible) {
local Order = 1;
try {
Order = InputObject.str.tointeger();
} catch (exception) {
}
SendPackEx({
op = 21012003,
Id = CurrentSelectId,
SendInfo = {
IsDisplay = IsDisplayBtn.IsSelected,
Scale = CurrentSelectScale,
XOffset = CurrentSelectXOffset,
YOffset = CurrentSelectYOffset,
ZOrder = Order
}
})
CheckBookInfo();
}
}.bindenv(this);
ConfirmButton.SetCallBackFunc(CheckCurrentSelectIdFunc);
AddChild(ConfirmButton);
for (local i = 0; i< 3; i++) {
local ControlObject = "CurrentSelectScale";
if (i == 1) ControlObject = "CurrentSelectXOffset";
if (i == 2) ControlObject = "CurrentSelectYOffset";
local BtnBuffer = LenheartNewUI_BaseButton(205, 440 + (i * 16), 20, 15, "interface/lenheartwindowcommon.img", 528);
BtnBuffer.Data = ControlObject;
BtnBuffer.OnClickEx = function(Btn) {
if (Btn.Data == "CurrentSelectScale") {
this[Btn.Data] -= 0.1;
} else {
this[Btn.Data] -= 10;
}
FixCustomData();
}.bindenv(this);
BtnBuffer.SetCallBackFunc(CheckCurrentSelectIdFunc);
Childrens.append(BtnBuffer);
BtnBuffer = LenheartNewUI_BaseButton(232, 440 + (i * 16), 15, 15, "interface/lenheartwindowcommon.img", 34);
BtnBuffer.Data = ControlObject;
BtnBuffer.OnClickEx = function(Btn) {
if (Btn.Data == "CurrentSelectScale") {
this[Btn.Data] -= 0.01;
} else {
this[Btn.Data] -= 1;
}
FixCustomData();
}.bindenv(this);
BtnBuffer.SetCallBackFunc(CheckCurrentSelectIdFunc);
Childrens.append(BtnBuffer);
BtnBuffer = LenheartNewUI_BaseButton(284, 440 + (i * 16), 15, 15, "interface/lenheartwindowcommon.img", 38);
BtnBuffer.Data = ControlObject;
BtnBuffer.OnClickEx = function(Btn) {
if (Btn.Data == "CurrentSelectScale") {
this[Btn.Data] += 0.01;
} else {
this[Btn.Data] += 1;
}
FixCustomData();
}.bindenv(this);
BtnBuffer.SetCallBackFunc(CheckCurrentSelectIdFunc);
Childrens.append(BtnBuffer);
BtnBuffer = LenheartNewUI_BaseButton(311, 440 + (i * 16), 20, 15, "interface/lenheartwindowcommon.img", 532);
BtnBuffer.Data = ControlObject;
BtnBuffer.OnClickEx = function(Btn) {
if (Btn.Data == "CurrentSelectScale") {
this[Btn.Data] += 0.1;
} else {
this[Btn.Data] += 10;
}
FixCustomData();
}.bindenv(this);
BtnBuffer.SetCallBackFunc(CheckCurrentSelectIdFunc);
Childrens.append(BtnBuffer);
}
//初始默认0类别
ChangeCategoryTitle(0);
}
//更改页面
function ChangeCategoryTitle(ToCategory) {
CurrentCategory = ToCategory;
//得到对应分类的称谓List
local ItemList = Info.ItemIndex[CurrentCategory];
local SetInfo = [];
for (local i = (9 * CurrentPage); i< 9; i++) {
//得到ID和Info 0 和 null 为没有数据
local TileId = 0;
local TileInfo = null;
if (i< ItemList.len()) {
//将ID记录到数组
TileId = ItemList[i];
TileInfo = Info.Item[CurrentCategory][ItemList[i]];
}
SetInfo.append({
TileId = TileId,
TileInfo = TileInfo
});
}
//遍历数组将ID与Info 设置给按钮
for (local i = 0; i< 9; i++) {
TitleButtonList[i].SetInfo(SetInfo[i].TileId, SetInfo[i].TileInfo);
}
}
//修正数据
function FixCustomData() {
if (this.CurrentSelectScale > 1.0) this.CurrentSelectScale = 1.0;
if (this.CurrentSelectScale< 0.01) this.CurrentSelectScale = 0.01;
if (this.CurrentSelectXOffset > 800) this.CurrentSelectXOffset = 800;
if (this.CurrentSelectXOffset<(-800)) this.CurrentSelectXOffset = -800;
if (this.CurrentSelectYOffset > 600) this.CurrentSelectYOffset = 600;
if (this.CurrentSelectYOffset<(-600)) this.CurrentSelectYOffset = -600;
}
//注册类别
function RegisterCategoryTitle() {
CategoryTitle = [];
local LogicFunc = function(Btn) {
foreach(Pos, obj in CategoryTitle) {
if (obj != Btn) obj.State = 0;
else {
obj.State = 1;
ChangeCategoryTitle(Pos);
}
}
};
//遍历有多少个Boss
foreach(Pos, Name in Info.category) {
local Tabbars1 = LenheartNewUI_TabbarsText(10 + (Pos * 61), 110, Name);
if (Pos == 0) Tabbars1.State = 1;
Tabbars1.SetTextOffset(31 - LenheartTextClass.GetStringLength(Name) / 2, 4);
AddChild(Tabbars1);
Tabbars1.OnClickEx = LogicFunc.bindenv(this);
CategoryTitle.append(Tabbars1);
}
}
//绘制主界面
function DrawMain(obj) {
//背景框
DrawNineBox(X, Y, 450, 518, "interface/lenheartwindowcommon.img", 213);
//标题
DrawWindowTitle(452);
//绘制标题名
L_sq_DrawCode("誉名录", X + 204, Y + 5, sq_RGBA(230, 200, 155, 255), 0, 1);
//头部图像
Img.DrawPng(0, X + 5, Y + 26);
L_sq_SetDrawImgModel(2, 0);
BackGroundAni.Show(Duration, X + 150, Y + 35);
BackGroundAni2.Show(Duration, X + 150, Y + 30);
L_sq_ReleaseDrawImgModel();
//书本图像
Img.DrawPng(1, X + 184, Y + 46);
L_sq_DrawCode("誉名录完成率", X + 188, Y + 98, sq_RGBA(202, 200, 194, 255), 0, 1);
//左侧背景
Img.DrawPng(2, X + 9, Y + 132);
//右侧背景
Img.DrawPng(3, X + 143, Y + 132);
//详情页
if (CurrentSelectId && CurrentSelectInfo) {
//展示文字
L_sq_DrawCode("效果展示:", X + 150, Y + 140, sq_RGBA(230, 200, 155, 255), 0, 1);
//展示框
Img.DrawPng(11, X + 147, Y + 156);
//图像
if (CurrentSelectInfo.Content.type == "img") {
//没有添加缓存的先添加缓存
if (!NewTitleC_Img_Map.rawin(CurrentSelectInfo.Content.img)) {
NewTitleC_Img_Map.rawset(CurrentSelectInfo.Content.img, Rindro_Image(CurrentSelectInfo.Content.img));
}
//这里从展示框的左上角开始算起 展示框大小为 290 * 115 如果添加新的称谓 可以现在PS里缩放 并记录下针对左上角坐标的偏移 与 缩放值
NewTitleC_Img_Map[CurrentSelectInfo.Content.img].DrawExPng(CurrentSelectInfo.Content.index,
X + 147 + CurrentSelectInfo.DisplayData.x,
Y + 156 + CurrentSelectInfo.DisplayData.y, 0, 0xffffffff,
CurrentSelectInfo.DisplayData.scale, CurrentSelectInfo.DisplayData.scale)
}
//Ani
else if (CurrentSelectInfo.Content.type == "ani") {
local Ani = DrawAniEx(X + 147 + CurrentSelectInfo.DisplayData.x, Y + 156 + CurrentSelectInfo.DisplayData.y, CurrentSelectInfo.Content.ani);
Ani.setImageRateFromOriginal(CurrentSelectInfo.DisplayData.scale, CurrentSelectInfo.DisplayData.scale);
Ani.setAutoLayerWorkAnimationAddSizeRate(CurrentSelectInfo.DisplayData.scale, CurrentSelectInfo.DisplayData.scale);
}
//描述文字
L_sq_DrawCode("称谓信息:", X + 150, Y + 276, sq_RGBA(230, 200, 155, 255), 0, 1);
L_sq_DrawCode_ExRN(CurrentSelectInfo.Explain, X + 150, Y + 292, sq_RGBA(104, 213, 237, 255), 0, 1);
//获取途径文字
L_sq_DrawCode("获取途径:", X + 150, Y + 336, sq_RGBA(230, 200, 155, 255), 0, 1);
L_sq_DrawCode_ExRN(CurrentSelectInfo.Conditions, X + 150, Y + 352, sq_RGBA(124, 110, 82, 255), 0, 1);
if (CurrentSelectHaveFlag) {
//调整文字
L_sq_DrawCode("自定义调整:", X + 150, Y + 410, sq_RGBA(230, 200, 155, 255), 0, 1);
//缩放大小
L_sq_DrawCode("是否启用称谓显示: ", X + 150, Y + 426, sq_RGBA(124, 110, 82, 255), 0, 1);
//层级调整
L_sq_DrawCode("显示层级: ", X + 300, Y + 426, sq_RGBA(124, 110, 82, 255), 0, 1);
L_sq_DrawCode("缩放大小:", X + 150, Y + 442, sq_RGBA(124, 110, 82, 255), 0, 1);
local CurrentSelectScaleStr = format("%.2f", CurrentSelectScale);
L_sq_DrawCode(CurrentSelectScaleStr, X + 266 - LenheartTextClass.GetStringLength(CurrentSelectScaleStr) / 2, Y + 442, sq_RGBA(230, 200, 155, 255), 0, 1);
L_sq_DrawCode("X轴偏移:", X + 150, Y + 458, sq_RGBA(124, 110, 82, 255), 0, 1);
local CurrentSelectXOffsetStr = CurrentSelectXOffset.tostring();
L_sq_DrawCode(CurrentSelectXOffsetStr, X + 266 - LenheartTextClass.GetStringLength(CurrentSelectXOffsetStr) / 2, Y + 458, sq_RGBA(230, 200, 155, 255), 0, 1);
L_sq_DrawCode("Y轴偏移:", X + 150, Y + 474, sq_RGBA(124, 110, 82, 255), 0, 1);
local CurrentSelectYOffsetStr = CurrentSelectYOffset.tostring();
L_sq_DrawCode(CurrentSelectYOffsetStr, X + 266 - LenheartTextClass.GetStringLength(CurrentSelectYOffsetStr) / 2, Y + 474, sq_RGBA(230, 200, 155, 255), 0, 1);
}
}
for (local i = 0; i< 6; i++) {
Img.DrawPng(21 + i, X + 152, Y + 160 + (i * 44));
}
}
function Show(obj) {
DrawMain(obj);
LenheartNewUI_Windows.Show(obj);
}
//逻辑入口
function Proc(obj) {
LenheartNewUI_Windows.SyncPos(X, Y);
}
function OpenCallBack() {
Visible = true;
CurrentSelectId = 0;
CurrentSelectInfo = null;
CheckBookInfo();
}
function InitPvf() {
Info = {};
//读取基础配置
Rindro_Script.GetFileData("etc/rindro/newtitle/newtitle.etc", function(DataTable, Data) {
while (!Data.Eof()) {
local Fragment = Data.Get();
if (Fragment == "[category]") {
Info.category <- [];
while (true) {
local Fbuf = Data.Get();
if (Fbuf == "[/category]") {
break;
}
Info.category.append(Sq_ConvertWideChar(Fbuf, "big5"));
}
}
}
}.bindenv(this));
//读取称谓列表
local TitleInfoMap = Rindro_Script.GetFileData("etc/rindro/newtitle/title.lst", function(InfoMap, Data) {
while (!Data.Eof()) {
local Index = Data.Get();
local Path = "etc/" + Data.Get();
local TitleInfo = Rindro_Script.GetFileData(Path, function(DataTable, Data) {
while (!Data.Eof()) {
local Fragment = Data.Get();
if (Fragment == "[name]") {
DataTable.Name <- Sq_ConvertWideChar(Data.Get(), "big5");
} else if (Fragment == "[icon]") {
DataTable.Icon <- {
img = Data.Get().tolower(),
index = Data.Get()
}
} else if (Fragment == "[explain]") {
DataTable.Explain <- Sq_ConvertWideChar(Data.Get(), "big5");
} else if (Fragment == "[conditions]") {
DataTable.Conditions <- Sq_ConvertWideChar(Data.Get(), "big5");
} else if (Fragment == "[category]") {
DataTable.Category <- Data.Get();
} else if (Fragment == "[content]") {
local Type = Data.Get();
if (Type == "img") {
DataTable.Content <- {
type = Type,
img = Data.Get().tolower(),
index = Data.Get()
}
} else if (Type == "ani") {
DataTable.Content <- {
type = Type,
ani = Data.Get().tolower(),
}
}
} else if (Fragment == "[display data]") {
DataTable.DisplayData <- {
x = Data.Get(),
y = Data.Get(),
scale = Data.Get()
}
}
}
});
InfoMap.rawset(Index, TitleInfo);
}
InfoMap.rawdelete("filepath");
}.bindenv(this));
//遍历称谓列表分配到对应的种类页 并编制索引
Info.Item <- [];
Info.ItemIndex <- [];
foreach(value in Info.category) {
Info.Item.append({});
Info.ItemIndex.append([]);
}
foreach(Index, Value in TitleInfoMap) {
Info.Item[Value.Category].rawset(Index, Value);
Info.ItemIndex[Value.Category].append(Index);
}
}
function L_sq_DrawCode_Ex(str, x, y, rgba, mb, jc) {
local strarr = [];
if (str.find("\r\n") == null) L_sq_DrawCode(str, x, y, rgba, mb, jc);
else {
local Bpos = 0;
while (true) {
local Npos = str.find("\r\n", Bpos);
if (!Npos) {
local strbuff = str.slice(Bpos, str.len());
strarr.append(strbuff);
break;
}
local strbuff = str.slice(Bpos, Npos);
strarr.append(strbuff);
Bpos = Npos + 2;
}
for (local z = 0; z< strarr.len(); z++) {
L_sq_DrawCode(strarr[z], x, y + (z * 14), rgba, mb, jc);
}
}
}
function GetTitlePvfInfo(FindId) {
local FindCategory = -1;
foreach(GroupIndex, Group in Info.ItemIndex) {
foreach(value in Group) {
if (value == FindId) {
FindCategory = GroupIndex;
break;
}
}
}
if (FindCategory != -1) {
return Info.Item[FindCategory][FindId];
}
return null;
}
}
L_Windows_List <- [];
getroottable().rawdelete("LenheartPluginsInitFlag");
getroottable().rawdelete("EventList_Obj")
getroottable().rawdelete("NewTitle_Obj");
getroottable().rawdelete("L_Each_Obj");
function Lenheart_NewTitle_Fun(obj) {
local RootTab = getroottable();
if (!RootTab.rawin("NewTitle_Obj")) {
RootTab.rawset("NewTitle_Obj", true);
local Win = LenheartNewUI_CreateWindow(NewTitleC, "称谓系统窗口", ((getroottable().Rindro_Scr_Width - 450) / 2).tointeger(), 30, 450, 518, 22);
EventList_Obj.AddEvent("誉名录", 109, Win);
}
}
getroottable()["LenheartFuncTab"].rawset("NewTitleFuncN", Lenheart_NewTitle_Fun);

View File

@@ -0,0 +1,116 @@
/*
文件名:TitleButton.nut
路径:Project/NewTitle/TitleButton.nut
创建日期:2026-01-30 04:34
文件用途:
*/
class NewTitleC_Button extends LenheartNewUI_CommonUi {
State = 0;
BaseIdx = 29;
DWidth = null;
Img = null;
Id = 0;
Info = null;
constructor(X, Y, gImg) {
this.DWidth = 121;
this.Img = gImg;
LenheartNewUI_CommonUi.constructor(X, Y, 121, 34);
}
function SetInfo(gId,gInfo) {
this.Id = gId;
this.Info = gInfo;
}
function Show(obj) {
local DownOffset = 0;
//按下
if (isLBDown) {
DownOffset = 1;
}
Img.DrawPng(4, X, Y + DownOffset);
//有信息才绘制
if (Info) {
//是否拥有标识条底
Img.DrawPng(5, X + 35, Y + 26 + DownOffset);
Img.DrawPng(7, X + 35, Y + 26 + DownOffset);
//图标边框
Img.DrawPng(10, X, Y + DownOffset);
//判断是否有初始化图像
if (!NewTitleC_Img_Map.rawin(Info.Icon.img)) {
NewTitleC_Img_Map.rawset(Info.Icon.img, Rindro_Image(Info.Icon.img));
}
NewTitleC_Img_Map[Info.Icon.img].DrawPng(Info.Icon.index, X + 3, Y + 3 + DownOffset);
//名称
L_sq_DrawCode(Info.Name, X + 38, Y + 8 + DownOffset, sq_RGBA(255, 255, 183, 255), 0, 1);
}
if (isInRect) {
Img.DrawPng(8, X, Y + DownOffset);
}
}
}
//复选框
class NewTitleC_SwitchButton extends LenheartNewUI_CommonUi {
State = 0;
ImgIndex = 600;
ImgPath = "interface/lenheartwindowcommon.img";
IsSelected = false;
constructor(X, Y) {
LenheartNewUI_CommonUi.constructor(X, Y, 28, 16);
}
function Show(obj) {
local DownOffset = 0;
if (isLBDown) {
DownOffset = 1;
if (State == 0)
Rindro_Image_GlobalMap["lenheartui"].DrawPng(ImgIndex + 1, X, Y + 1);
if (State == 1)
Rindro_Image_GlobalMap["lenheartui"].DrawPng(ImgIndex + 4, X, Y + 1);
} else if (isInRect) {
if (State == 0)
Rindro_Image_GlobalMap["lenheartui"].DrawPng(ImgIndex + 1, X, Y);
if (State == 1)
Rindro_Image_GlobalMap["lenheartui"].DrawPng(ImgIndex + 4, X, Y);
} else {
if (State == 0)
Rindro_Image_GlobalMap["lenheartui"].DrawPng(ImgIndex, X, Y);
if (State == 1)
Rindro_Image_GlobalMap["lenheartui"].DrawPng(ImgIndex + 3, X, Y);
}
}
//鼠标左键弹起回调
function OnMouseLbUp(MousePos_X, MousePos_Y) {
if (isLBDown) {
if (OnClick) OnClick();
if (OnClickEx) OnClickEx(this);
IsSelected = !IsSelected;
if (IsSelected) State = 1;
else State = 0;
}
isLBDown = false;
}
}
L_Windows_List <- [];
getroottable().rawdelete("LenheartPluginsInitFlag");
getroottable().rawdelete("EventList_Obj")
getroottable().rawdelete("NewTitle_Obj");
getroottable().rawdelete("L_Each_Obj");

View File

@@ -0,0 +1,290 @@
/*
文件名:OutfitSystem.nut
路径:Project/OutfitSystem/OutfitSystem.nut
创建日期:2026-03-01 03:11
文件用途:
*/
class OutfitSystemC extends LenheartNewUI_Windows {
//调试模式
// DeBugMode = true;
//不是窗口
// NoWindow = true;
//是否可见
Visible = false;
/*
武器偏移 "3038"
称号偏移 "303C"
上衣偏移 "3040"
头肩偏移 "3044"
裤子偏移 "3048"
鞋子偏移 "304C"
腰带偏移 "3050"
项链偏移 "3054"
手镯偏移 "3058"
戒指偏移 "305C"
左曹偏移 "3060"
右曹偏移 "3064"
时装帽子偏移 "3008"
时装头部偏移 "300C"
时装脸部偏移 "3010"
时装上衣偏移 "3014"
时装下衣偏移 "3018"
时装鞋子偏移 "301C" 原来3020正确的是301C
时装胸部偏移 "3020"
时装腰带偏移 "3024"
时装皮肤偏移 "3028"
时装光圈偏移 "302C"
时装武器偏移 "3030"
宠物偏移 "3068"
*/
Img = Rindro_Image("interface2/buffswitching/buffswitching.img");
ItemSlotPos = [
[9, 154, 0x3044], //护肩
[9, 186, 0x3048], //下装
[9, 218, 0x304C], //鞋子
[41, 154, 0x3040], //上衣
[41, 186, 0x3050], //腰带
[73, 154, 0x3038], //武器
[73, 186, 0x3058], //手镯
[73, 218, 0x3060], //辅助装备
[73, 250, null], //耳环
[105, 154, 0x303C], //称号
[105, 186, 0x3054], //项链
[105, 218, 0x305C], //戒指
[105, 250, 0x3064], //魔法石
[148, 153, null], //武器装扮
[148, 186, 0x3034], //光环
[181, 153, 0x3014], //头部
[181, 186, 0x3028], //胸部
[181, 220, 0x302C], //腰部
[214, 153, 0x3010], //帽子
[214, 186, 0x301C], //上衣
[214, 220, 0x3020], //下装
[247, 153, 0x3018], //脸部
[247, 186, 0x3030], //皮肤
[247, 220, 0x3024], //鞋
[305, 165, 0x3068] //宠物
];
ItemSlotList = null;
//当前选中
CurrentSelect = null;
constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH) {
Childrens = [];
//注册控件
RegisterWidget();
LenheartNewUI_Windows.constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH);
local EachManager = Lenheart_Get_EachObj();
EachManager.AddEachForNpc(2, 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 = 52;
ApplyEngagementButton.Str = "换装配置";
ApplyEngagementButton.Data = SThis.NPC_Index;
ApplyEngagementButton.OnClick = function(Button) {
InitWindow();
Button.Parent.CloseAllEach();
Button.Parent.CloseWindow();
ResetFocus();
R_Utils.PlaySound("WINDOW_SHOW");
}.bindenv(this);
ApplyEngagementButton.SetCallBackFunc(function(Button) {})
SThis.AddChild(ApplyEngagementButton);
}.bindenv(this));
//成功回包
Pack_Control.rawset(21015004, function(Chunk) {
foreach(SlotObj in ItemSlotList) {
SlotObj.RemoveItem();
}
local Jso = Json.Decode(Chunk);
if (Jso.EquipInfo == null) return;
foreach(_Index, Equip in Jso.EquipInfo) {
if (Equip[0] == 0) continue;
local ItemId = Equip[0];
local Upgrade = Equip[1];
local Amplification = Equip[2];
local Forging = Equip[3];
local Enchanting = Equip[4];
local ItemObject = Rindro_Item();
ItemObject.LoadById(ItemId);
ItemObject.SetUpgrade(Upgrade);
ItemObject.SetAmplification(Amplification);
ItemObject.SetForging(Forging);
ItemObject.SetEnchanting(Enchanting);
ItemSlotList[_Index.tointeger()].SetItem(ItemObject);
}
}.bindenv(this));
}
function RegisterWidget() {
//关闭按钮
local CloseButton = LenheartNewUI_BaseButton(340, 2, 11, 12, "interface/lenheartwindowcommon.img", 276);
CloseButton.OnClick = function() {
this.Visible = false;
}.bindenv(this);
Childrens.append(CloseButton);
local SaveButton = LenheartNewUI_ButtonText(310, 52, 15, "记录");
SaveButton.DWidth = -19;
SaveButton.Width = 36;
SaveButton.SetTextOffset(-12, 1);
SaveButton.OnClick = function() {
if (CurrentSelect == null) {
return;
}
SendPackEx({
op = 21015001,
EquipInfo = ReadSelfEquip(),
Slot = CurrentSelect,
})
}.bindenv(this);
Childrens.append(SaveButton);
local ResetButton = LenheartNewUI_ButtonText(310, 84, 15, "重置");
ResetButton.DWidth = -19;
ResetButton.Width = 36;
ResetButton.SetTextOffset(-12, 1);
ResetButton.OnClick = function() {
if (CurrentSelect == null) {
return;
}
SendPackEx({
op = 21015005,
Slot = CurrentSelect,
})
foreach(SlotObj in ItemSlotList) {
SlotObj.RemoveItem();
}
}.bindenv(this);
Childrens.append(ResetButton);
for (local i = 0; i< 20; i++) {
local Obtn = OutfitSystemC_Button(10 + (i % 10) * 30, 56 + (i / 10) * 30, 3, i);
Obtn.OnClickEx = function(Obj, Idx) {
CurrentSelect = Idx;
SendPackEx({
op = 21015003,
Slot = Idx
})
}.bindenv(this);
AddChild(Obtn);
}
ItemSlotList = [];
local ItemObject = Rindro_Item();
ItemObject.LoadById(3037);
for (local i = 0; i< ItemSlotPos.len(); i++) {
local XPos = ItemSlotPos[i][0];
local YPos = ItemSlotPos[i][1];
local ItemSlot = LenheartNewUI_ItemSlot(XPos, YPos);
// ItemSlot.SetItem(ItemObject);
ItemSlotList.append(ItemSlot);
AddChild(ItemSlot);
}
}
//绘制主界面
function DrawMain(obj) {
Img.DrawPng(0, X, Y);
L_sq_DrawCode("换装配置", X + 152, Y + 3, sq_RGBA(230, 200, 155, 255), 0, 1);
L_sq_DrawCode("装备槽位", X + 48, Y + 135, sq_RGBA(150, 150, 150, 255), 0, 1);
L_sq_DrawCode("时装槽位", X + 188, Y + 135, sq_RGBA(150, 150, 150, 255), 0, 1);
L_sq_DrawCode("宠物", X + 308, Y + 135, sq_RGBA(150, 150, 150, 255), 0, 1);
if (CurrentSelect != null) {
Rindro_Image_GlobalMap["lenheartui"].DrawPng(425, X + 12 + (CurrentSelect % 10) * 30, Y + 38 + (CurrentSelect / 10) * 30);
}
}
function Show(obj) {
DrawMain(obj);
LenheartNewUI_Windows.Show(obj);
}
//逻辑入口
function Proc(obj) {
LenheartNewUI_Windows.SyncPos(X, Y);
}
//读取自身装备并显示在装备槽位
function ReadSelfEquip() {
local EquiList = [];
for (local i = 0; i< ItemSlotPos.len(); i++) {
local Offset = ItemSlotPos[i][2];
if (Offset != null) {
local EquipAddress = GetEquip(Offset);
if (EquipAddress != null) {
local ItemObject = Rindro_Item();
ItemObject.LoadByAddress(EquipAddress);
ItemSlotList[i].SetItem(ItemObject);
local Info = [
ItemObject.GetIndex(),
ItemObject.GetUpgrade(),
ItemObject.GetAmplification(),
ItemObject.GetForging(),
ItemObject.GetEnchanting()
]
EquiList.append(Info);
} else {
EquiList.append([0, 0, 0, 0, 0]);
}
} else {
EquiList.append([0, 0, 0, 0, 0]);
}
}
return EquiList;
}
function GetEquip(Offset) {
local ObjAddress = NativePointer(0x1AB7CDC).readInt();
local EquipAddress = NativePointer(ObjAddress + Offset).readInt();
if (EquipAddress != 0) {
local Index = NativePointer(EquipAddress + 0x1C).readInt();
return EquipAddress;
}
return null;
}
function InitWindow() {
this.CurrentSelect = null;
this.Visible = true;
foreach(SlotObj in ItemSlotList) {
SlotObj.RemoveItem();
}
}
}
L_Windows_List <- [];
getroottable().rawdelete("LenheartPluginsInitFlag");
getroottable().rawdelete("EventList_Obj")
getroottable().rawdelete("OutfitSystem_Obj");
getroottable().rawdelete("L_Each_Obj");
function Lenheart_OutfitSystem_Fun(obj) {
local RootTab = getroottable();
if (!RootTab.rawin("OutfitSystem_Obj")) {
RootTab.rawset("OutfitSystem_Obj", true);
LenheartNewUI_CreateWindow(OutfitSystemC, "换装系统窗口", 60, 150, 356, 286, 18);
}
}
getroottable()["LenheartFuncTab"].rawset("OutfitSystemFuncN", Lenheart_OutfitSystem_Fun);

View File

@@ -0,0 +1,66 @@
/*
文件名:OutfitSystem_Component.nut
路径:Project/OutfitSystem/OutfitSystem_Component.nut
创建日期:2026-03-02 03:39
文件用途:
*/
class OutfitSystemC_Button extends LenheartNewUI_CommonUi {
State = 0;
BaseIdx = 29;
DWidth = null;
Img = Rindro_Image("interface2/buffswitching/buffswitchingp.img");
Idx = 172;
FillWidth = 2;
FirstWidth = 11;
constructor(X, Y, W, gIdx) {
this.DWidth = W;
this.Idx = gIdx;
LenheartNewUI_CommonUi.constructor(X, Y, W + 11 * 2, 13);
}
function Show(obj) {
//不可用
if (State == 8) {
// L_sq_DrawButton(X, Y + 1, this.DWidth, Path, Idx + 9, FillWidth, FirstWidth);
} else {
//按下
if (isLBDown) {
// L_sq_DrawButton(X, Y + 1, this.DWidth, Path, Idx + 3, FillWidth, FirstWidth);
Img.DrawPng(this.Idx, X, Y + 1);
L_sq_SetDrawImgModel(2, 0);
L_sq_DrawButton(X, Y + 1, this.DWidth, "interface/lenheartwindowcommon.img", 258, FillWidth, FirstWidth);
L_sq_ReleaseDrawImgModel();
}
//悬停
else if (isInRect) {
// L_sq_DrawButton(X, Y, this.DWidth, Path, Idx + 3, FillWidth, FirstWidth);
Img.DrawPng(this.Idx, X, Y);
L_sq_SetDrawImgModel(2, 0);
L_sq_DrawButton(X, Y, this.DWidth, "interface/lenheartwindowcommon.img", 258, FillWidth, FirstWidth);
L_sq_ReleaseDrawImgModel();
}
//普通
else {
Img.DrawPng(this.Idx, X, Y);
}
}
}
//鼠标左键弹起回调
function OnMouseLbUp(MousePos_X, MousePos_Y) {
if (isLBDown) {
if (OnClickEx) OnClickEx(this, this.Idx);
}
isLBDown = false;
}
}
L_Windows_List <- [];
getroottable().rawdelete("LenheartPluginsInitFlag");
getroottable().rawdelete("EventList_Obj")
getroottable().rawdelete("OutfitSystem_Obj");
getroottable().rawdelete("L_Each_Obj");

View File

@@ -0,0 +1,263 @@
/*
文件名:SoulSalvation.nut
路径:Project/SoulSalvation/SoulSalvation.nut
创建日期:2026-01-20 03:00
文件用途:灵魂救赎武器
*/
class SoulSalvationC extends Rindro_BaseToolClass {
//灵魂救赎武器标识 (阶段1)
Equipment1List = null;
//1阶段所需灵魂数量
Stage1SoulCount = 1000;
//灵魂救赎武器标识 (阶段2)
Equipment2List = null;
//灵魂救赎武器标识 (阶段3)
Equipment3List = null;
//三阶段灵魂石对应APC
Equipment3SoulStone = null;
Img = Rindro_Image("soulweapon/main.img");
//灵魂数据
EquipData = null;
//APC数据
ApcInfo = null;
constructor() {
Equipment1List = {};
Equipment2List = {};
Equipment3List = {};
Equipment3SoulStone = {};
EquipData = {};
ApcInfo = {};
InifPvf();
local ItemDrawControl = getroottable()["NewItemInfoWindow_Obj"];
ItemDrawControl.AddDelegate("灵魂救赎武器代理一阶段", 28, Delegate1.bindenv(this),
function(Item) {
return Equipment1List.rawin(Item.GetIndex());
}.bindenv(this));
ItemDrawControl.AddDelegate("灵魂救赎武器代理二阶段", 42, Delegate2.bindenv(this),
function(Item) {
return Equipment2List.rawin(Item.GetIndex());
}.bindenv(this));
ItemDrawControl.AddDelegate("灵魂救赎武器代理三阶段", 42, Delegate3.bindenv(this),
function(Item) {
return Equipment3List.rawin(Item.GetIndex());
}.bindenv(this));
foreach(Id, _f in Equipment3SoulStone) {
ItemDrawControl.AddHookItemId(Id);
}
ItemDrawControl.AddDelegate("灵魂救赎灵魂石代理", 160, Delegate4.bindenv(this),
function(Item) {
return Equipment3SoulStone.rawin(Item.GetIndex());
}.bindenv(this));
//上线获取全身灵魂武器灵魂数
Pack_Control.rawset(21011002, function(Chunk) {
local Jso = Json.Decode(Chunk);
EquipData = Jso.Info;
}.bindenv(this));
//多个灵魂武器的补充信息包
Pack_Control.rawset(21011006, function(Chunk) {
local Jso = Json.Decode(Chunk);
foreach(index, value in Jso.Info) {
EquipData[index.tostring()] <- value;
}
}.bindenv(this));
//单个灵魂武器的刷新信息
Pack_Control.rawset(21011004, function(Chunk) {
local Jso = Json.Decode(Chunk);
EquipData[Jso.uuid.tostring()] <- Jso.info;
}.bindenv(this));
SendPackEx({
op = 21011001
})
//创建灵魂武器升级窗口
LenheartNewUI_CreateWindow(SoulSalvation_UpgradeC, "灵魂武器升级窗口", ((getroottable().Rindro_Scr_Width - 700) / 2).tointeger(), 160, 292, 290, 28);
LenheartNewUI_CreateWindow(SoulSalvation_EnchantC, "灵魂武器附灵窗口", ((getroottable().Rindro_Scr_Width - 700) / 2).tointeger(), 160, 292, 290, 28);
}
//1阶段的代理
function Delegate1(X, Y, Item) {
L_sq_DrawCode("灵魂救赎阶段: 1 / 3", X + 6, Y + 15, sq_RGBA(255, 0, 240, 255), 0, 1);
L_sq_DrawCode("封印灵魂数: ", X + 6, Y + 30, sq_RGBA(104, 213, 237, 255), 0, 1);
local Uuid = Item.GetUuid().tostring();
//获取封印灵魂数
local Count = 0;
if (EquipData.rawin(Uuid)) {
Count = EquipData[Uuid].soul_count;
}
local Rate = Count.tofloat() / Stage1SoulCount.tofloat();
L_sq_DrawCode(format("%.1f%%", Rate * 100.0), X + 180, Y + 30, sq_RGBA(255, 119, 0, 255), 0, 1);
Img.DrawPng(0, X + 70, Y + 34);
setClip(X + 72, Y + 36, X + 72 + (Rate * 97.0).tointeger(), Y + 40); //开始裁切
Img.DrawPng(1, X + 72, Y + 36);
releaseClip(); //裁切结束
}
//2阶段的代理
function Delegate2(X, Y, Item) {
L_sq_DrawCode("灵魂救赎阶段: 2 / 3", X + 6, Y + 15, 0xFF0055FF, 0, 1);
L_sq_DrawCode("佩戴释魂通关镇魂曲地区副本", X + 6, Y + 30, 0xFF0055FF, 0, 1);
L_sq_DrawCode("即可救赎沉沦无尽永恒的灵魂!", X + 6, Y + 45, 0xFF0055FF, 0, 1);
}
//3阶段的代理
function Delegate3(X, Y, Item) {
L_sq_DrawCode("灵魂救赎阶段: 3 / 3", X + 6, Y + 15, 0xFF0055FF, 0, 1);
L_sq_DrawCode("已附灵的不朽灵魂:", X + 6, Y + 30, 0xFF0055FF, 0, 1);
local Uuid = Item.GetUuid().tostring();
local APCId = 0;
if (EquipData.rawin(Uuid)) {
APCId = EquipData[Uuid].soul_id;
}
if (APCId == 0) {
L_sq_DrawCode("未定名", X + 6, Y + 45, 0xFF0055FF, 0, 1);
} else {
local ApcName = GetApcInfo(APCId).Name;
L_sq_DrawCode("Lv.85 " + ApcName, X + 6, Y + 45, 0xFF0055FF, 0, 1);
}
}
//灵魂石的代理
function Delegate4(X, Y, Item) {
local ApcId = 0;
if (Equipment3SoulStone.rawin(Item.GetIndex())) {
ApcId = Equipment3SoulStone[Item.GetIndex()];
}
if (ApcId > 0) {
local Info = GetApcInfo(ApcId);
if (!Info.rawin("Ani")) {
Info.Ani <- Rindro_Draw_Character(Info.Job, Info.Equ, "rest.ani", null);
}
L_sq_DrawCode("不朽的灵魂: " + Info.Name, X + 6, Y + 15, 0xFF0055FF, 0, 1);
Info.Ani.Draw(X + 102, Y + 160);
}
}
//读取配置
function InifPvf() {
Rindro_Script.GetFileData("etc/rindro/expandequipment/soulsalvation.etc", function(DataTable, Data) {
while (!Data.Eof()) {
local Fragment = Data.Get();
if (Fragment == "[EQUIPMENT1]") {
Equipment1List = {};
while (true) {
local Fbuf = Data.Get();
if (Fbuf == "[/EQUIPMENT1]") {
break;
}
Equipment1List.rawset(Fbuf, true);
}
} else if (Fragment == "[EQUIPMENT2]") {
Equipment2List = {};
while (true) {
local Fbuf = Data.Get();
if (Fbuf == "[/EQUIPMENT2]") {
break;
}
Equipment2List.rawset(Fbuf, true);
}
} else if (Fragment == "[EQUIPMENT3]") {
Equipment3List = {};
while (true) {
local Fbuf = Data.Get();
if (Fbuf == "[/EQUIPMENT3]") {
break;
}
Equipment3List.rawset(Fbuf, true);
}
} else if (Fragment == "[STAGE1 VALUE]") {
Stage1SoulCount = Data.Get();
} else if (Fragment == "[STAGE2 SOULSTONE]") {
Equipment3SoulStone = {};
while (true) {
local Fbuf = Data.Get();
if (Fbuf == "[/STAGE2 SOULSTONE]") {
break;
}
Equipment3SoulStone.rawset(Fbuf, Data.Get());
}
}
}
});
}
//读取APC名字
function GetApcInfo(ApcIndex) {
if (ApcInfo.rawin(ApcIndex)) return ApcInfo[ApcIndex];
local Path = "aicharacter/" + R_Utils.GetApcPath(ApcIndex);
local Info = Rindro_Script.GetFileData(Path, function(DataTable, Data) {
while (!Data.Eof()) {
local Fragment = Data.Get();
if (Fragment == "[minimum info]") {
DataTable.Name <- Sq_ConvertWideChar(Data.Get(), "big5");
DataTable.Job <- Data.Get();
} else if (Fragment == "[equipment]") {
DataTable.Equ <- [];
while (true) {
local Fbuf = Data.Get();
if (Fbuf == "[/equipment]") {
break;
}
Data.Get();
Data.Get();
DataTable.Equ.append(Fbuf);
}
}
}
});
ApcInfo.rawset(ApcIndex, Info);
return Info;
}
}
function Lenheart_SoulSalvation_Fun(obj) {
local RootTab = getroottable();
if (!RootTab.rawin("SoulSalvation_Obj")) {
RootTab.rawset("SoulSalvation_Obj", SoulSalvationC());
}
if (KeyPressNB.isKeyPress(OPTION_HOTKEY_PAUSE_IN_TOWER, "asdasd")) {
local os = sq_CreateAICharacter(21435);
// foreach(member, val in os.getclass()) {
// ::print(member + "\n");
// local attr;
// if ((attr = os.getclass().getattributes(member)) != null) {
// foreach(i, v in attr) {
// // ::print("\t" + i + " = " + (typeof v) + "\n");
// }
// } else {
// // ::print("\t<no attributes>\n")
// }
// }
// local os = sq_CreateAICharacter(21435);
os.setCurrentPos(obj.getXPos() + 100, obj.getYPos(), 600);
os.setMaster(obj);
os.setMapFollowParent(obj);
os.setMapFollowType(1);
// sq_SetKeyxEnable(obj, E_ATTACK_COMMAND, true);
sq_AddObject(obj, os, OBJECTTYPE_CHARACTER, false);
}
}
getroottable()["LenheartFuncTab"].rawset("SoulSalvationFuncN", Lenheart_SoulSalvation_Fun);
L_Windows_List <- [];
getroottable().rawdelete("LenheartPluginsInitFlag");
getroottable().rawdelete("EventList_Obj")
getroottable().rawdelete("SoulSalvation_Obj");
getroottable().rawdelete("L_Each_Obj");

View File

@@ -0,0 +1,225 @@
/*
文件名:SoulSalvation_Enchant.nut
路径:Project/SoulSalvation/SoulSalvation_Enchant.nut
创建日期:2026-01-26 02:56
文件用途:
*/
class SoulSalvation_EnchantC extends LenheartNewUI_Windows {
//调试模式
// DeBugMode = true;
//不是窗口
// NoWindow = true;
//是否可见
Visible = false;
Img = Rindro_Image("interface2/ui/newitemtool/soulweapon.img");
//装备
Item = null;
//装备槽位
ItemSlot = null;
//灵魂槽位
ItemSlot2 = null;
//注册的NPC列表
NPC = null;
constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH) {
Childrens = [];
//注册控件
RegisterWidget();
InifPvf();
RegNpc();
LenheartNewUI_Windows.constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH);
DiscardItemCallBackFunc.rawset("SoulSalvation_EnchantC", DiscardItem.bindenv(this));
}
function RegisterWidget() {
//关闭按钮
local CloseButton = LenheartNewUI_BaseButton(274, 4, 11, 12, "interface/lenheartwindowcommon.img", 276);
CloseButton.OnClick = function() {
this.Visible = false;
}.bindenv(this);
Childrens.append(CloseButton);
//确认按钮
local CrossoverButton = LenheartNewUI_ButtonText(109, 260, 15, "确认升级");
CrossoverButton.DWidth = 18;
CrossoverButton.Width = 74;
CrossoverButton.SetTextOffset(-4, 1);
CrossoverButton.OnClickEx = function(Btn) {
if (!Btn.Visible) return;
SendPackEx({
op = 21011009,
item = Item
});
}.bindenv(this);
CrossoverButton.SetCallBackFunc(function(Btn) {
if (ItemSlot.ItemObject && ItemSlot2.ItemObject) {
Btn.State = 0;
} else {
Btn.State = 8;
}
}.bindenv(this));
AddChild(CrossoverButton);
ItemSlot = LenheartNewUI_ItemSlot(66, 97);
ItemSlot.SetRemoveCallBack(function(obj) {
Item = null;
}.bindenv(this));
AddChild(ItemSlot);
ItemSlot2 = LenheartNewUI_ItemSlot(197, 97);
ItemSlot2.SetRemoveCallBack(function(obj) {
Item = null;
}.bindenv(this));
AddChild(ItemSlot2);
}
//绘制主界面
function DrawMain(obj) {
//背景框
DrawNineBox(X, Y, 292, 292, "interface/lenheartwindowcommon.img", 213);
//标题
DrawWindowTitle(293);
//绘制标题名
L_sq_DrawCode("灵魂武器附灵", X + 110, Y + 5, sq_RGBA(230, 200, 155, 255), 0, 1);
Img.DrawPng(1, X + 8, Y + 32);
Img.DrawPng(3, X + 8, Y + 32);
for (local i = 0; i< 5; i++) {
Img.DrawPng(2, X + 31 + 51 * i, Y + 195);
continue;
}
}
function Show(obj) {
DrawMain(obj);
LenheartNewUI_Windows.Show(obj);
}
//逻辑入口
function Proc(obj) {
LenheartNewUI_Windows.SyncPos(X, Y);
}
function DiscardItem(ItemAddress) {
local MousePos_X = IMouse.GetXPos();
local MousePos_Y = IMouse.GetYPos();
if (!sq_IsIntersectRect(MousePos_X, MousePos_Y, 1, 1, X, Y, Width, Height)) return true;
local SlotPos = 0;
if (sq_IsIntersectRect(MousePos_X, MousePos_Y, 1, 1, ItemSlot.X, ItemSlot.Y, ItemSlot.Width, ItemSlot.Height)) {
SlotPos = 1;
} else if (sq_IsIntersectRect(MousePos_X, MousePos_Y, 1, 1, ItemSlot2.X, ItemSlot2.Y, ItemSlot2.Width, ItemSlot2.Height)) {
SlotPos = 2;
} else {
return null;
}
if (!Visible) return true;
else {
Item = FindItemPosByForeachInven(ItemAddress, SlotPos);
if (Item) {
local ItemObject = Rindro_Item();
ItemObject.LoadByAddress(Item.ItemAddress);
if (SlotPos == 1)
ItemSlot.SetItem(ItemObject);
else if (SlotPos == 2)
ItemSlot2.SetItem(ItemObject);
}
}
}
//遍历背包查找Item
function FindItemPosByForeachInven(FindAddress, SlotPos) {
local Inven = L_sq_RA(0x1A5FB24);
local InvenAdd = L_sq_RA(Inven + 56);
InvenAdd += 36;
//0是装备 2是任务材料
local z = 0;
if (SlotPos == 2) z = 2;
for (local i = 0; i< 56; i++) {
local ItemAdd = L_sq_RA(InvenAdd + ((i + (z * 56)) * 4));
if (ItemAdd == FindAddress) {
local NamePointer = L_sq_RA(FindAddress + 0x20);
local rRarity = L_sq_RA(FindAddress + 0xF4);
local rItemId = L_sq_RA(FindAddress + 0x1c);
if (SlotPos == 1) {
if (!getroottable().SoulSalvation_Obj.Equipment2List.rawin(rItemId)) return null;
} else if (SlotPos == 2) {
if (rItemId< 92208 || rItemId > 92214) return null;
}
return {
Type = z,
Pos = i,
Vis = false,
Count = MemoryTool.DecodeMemoryData(FindAddress + 0x1A4),
ItemId = rItemId,
ItemAddress = FindAddress,
Name = NativePointer(L_sq_I2P(NamePointer)).readUnicodeString(),
Rarity = rRarity,
};
}
}
return null;
}
function RegNpc() {
local EachManager = Lenheart_Get_EachObj();
EachManager.AddEachForNpc(NPC, 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 = 53;
ApplyEngagementButton.Str = "释魂附灵";
ApplyEngagementButton.Data = SThis.NPC_Index;
ApplyEngagementButton.OnClick = function(Button) {
InitWindow();
//打开背包
L_sq_Open_ExWindow(0x1ADE090, 0, 0, 1);
Button.Parent.CloseAllEach();
Button.Parent.CloseWindow();
ResetFocus();
R_Utils.PlaySound("WINDOW_SHOW");
}.bindenv(this);
ApplyEngagementButton.SetCallBackFunc(function(Button) {})
SThis.AddChild(ApplyEngagementButton);
}.bindenv(this));
}
//读取配置
function InifPvf() {
Rindro_Script.GetFileData("etc/rindro/expandequipment/soulsalvation.etc", function(DataTable, Data) {
while (!Data.Eof()) {
local Fragment = Data.Get();
if (Fragment == "[STAGE2 NPC]") {
NPC = Data.Get();
}
}
});
}
function InitWindow() {
Visible = true;
//清空
Item = null;
ItemSlot.RemoveItem();
ItemSlot2.RemoveItem();
}
}
L_Windows_List <- [];
getroottable().rawdelete("LenheartPluginsInitFlag");
getroottable().rawdelete("EventList_Obj")
getroottable().rawdelete("SoulSalvation_Obj");
getroottable().rawdelete("L_Each_Obj");

View File

@@ -0,0 +1,290 @@
/*
文件名:SoulSalvation_Upgrade.nut
路径:Project/SoulSalvation/SoulSalvation_Upgrade.nut
创建日期:2026-01-23 10:46
文件用途:
*/
class SoulSalvation_UpgradeC extends LenheartNewUI_Windows {
//调试模式
// DeBugMode = true;
//不是窗口
// NoWindow = true;
//是否可见
Visible = false;
Img = Rindro_Image("interface2/ui/newitemtool/soulweapon.img");
//装备
Item = null;
//装备槽位
ItemSlot = null;
//注册的NPC列表
NPC = null;
//所需的基础材料
BasicMaterials = null;
//等级倍率
LevelRate = null;
//品级倍率
RarityRate = null;
//错误
Error = null;
//错误信息
ErrorMsg = null;
//所需材料信息
MaterialInfo = null;
//所需材料是否足够
MaterialIsEnough = false;
constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH) {
Childrens = [];
//注册控件
RegisterWidget();
InifPvf();
RegNpc();
LenheartNewUI_Windows.constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH);
DiscardItemCallBackFunc.rawset("SoulSalvation_UpgradeC", DiscardItem.bindenv(this));
//检查材料
Pack_Control.rawset(21011008, function(Chunk) {
local Jso = Json.Decode(Chunk);
if (Jso.rawin("error")) {
ErrorMsg = Jso.error;
}
if (Jso.rawin("MgInfo")) {
MaterialInfo = Jso.MgInfo;
//材料是否充足
MaterialIsEnough = true;
foreach(Info in MaterialInfo) {
if (Info.NeedCount > Info.RealCount) {
MaterialIsEnough = false;
break;
}
}
}
}.bindenv(this));
//成功回包
Pack_Control.rawset(21011010, function(Chunk) {
//清空
Item = null;
ItemSlot.RemoveItem();
ErrorMsg = null;
MaterialInfo = null;
MaterialIsEnough = false;
// R_Utils.PlaySound("CHNUTTREE_BOX");
}.bindenv(this));
}
function RegisterWidget() {
//关闭按钮
local CloseButton = LenheartNewUI_BaseButton(274, 4, 11, 12, "interface/lenheartwindowcommon.img", 276);
CloseButton.OnClick = function() {
this.Visible = false;
}.bindenv(this);
Childrens.append(CloseButton);
//确认按钮
local CrossoverButton = LenheartNewUI_ButtonText(109, 260, 15, "确认升级");
CrossoverButton.DWidth = 18;
CrossoverButton.Width = 74;
CrossoverButton.SetTextOffset(-4, 1);
CrossoverButton.OnClickEx = function(Btn) {
if (!Btn.Visible) return;
SendPackEx({
op = 21011009,
item = Item
});
}.bindenv(this);
CrossoverButton.SetCallBackFunc(function(Btn) {
if (ErrorMsg || !MaterialIsEnough) {
Btn.State = 8;
} else {
Btn.State = 0;
}
}.bindenv(this));
AddChild(CrossoverButton);
ItemSlot = LenheartNewUI_ItemSlot(132, 100);
ItemSlot.SetRemoveCallBack(function(obj) {
Item = null;
}.bindenv(this));
AddChild(ItemSlot);
}
//绘制主界面
function DrawMain(obj) {
//背景框
DrawNineBox(X, Y, 292, 292, "interface/lenheartwindowcommon.img", 213);
//标题
DrawWindowTitle(293);
//绘制标题名
L_sq_DrawCode("灵魂武器进阶", X + 110, Y + 5, sq_RGBA(230, 200, 155, 255), 0, 1);
Img.DrawPng(1, X + 8, Y + 32);
Img.DrawPng(0, X + 8, Y + 32);
//绘制进阶所需材料及数量信息
if (MaterialInfo) {
for (local i = 0; i< 5; i++) {
if (i >= MaterialInfo.len()) {
Img.DrawPng(2, X + 31 + 51 * i, Y + 195);
continue;
}
local Info = MaterialInfo[i];
DrawItemBase(X + 31 + 51 * i, Y + 195, Info.Item, Info.NeedCount);
//数量不足绘制遮盖图
if (Info.NeedCount > Info.RealCount) {
Rindro_Image_GlobalMap["lenheartui"].DrawExPng(257, X + 32 + 51 * i, Y + 196, 0, sq_RGBA(255, 255, 255, 120), 1.0, 1.0);
}
local RealCountStr = Info.RealCount.tostring();
local Color = Info.RealCount >= Info.NeedCount ? sq_RGBA(52, 255, 50, 255) : sq_RGBA(255, 60, 47, 255);
L_sq_DrawCode(RealCountStr, X + 46 + (51 * i) - LenheartTextClass.GetStringLength(RealCountStr) / 2, Y + 232, Color, 0, 1);
}
if (!MaterialIsEnough) {
local str = "进阶材料不足!";
L_sq_DrawCode(str, X + 148 - LenheartTextClass.GetStringLength(str) / 2, Y + 142, sq_RGBA(255, 60, 48, 255), 0, 1);
} else {
local str = Item.Name;
L_sq_DrawCode(str, X + 148 - LenheartTextClass.GetStringLength(str) / 2, Y + 142, GetRarityColor(Item.Rarity), 0, 1);
}
return;
}
if (ErrorMsg) {
local ErrorStr = null;
if (ErrorMsg == 2) ErrorStr = "所需灵魂不足!";
else if (ErrorMsg == 1) ErrorStr = "装备不可进阶!"
L_sq_DrawCode(ErrorStr, X + 148 - LenheartTextClass.GetStringLength(ErrorStr) / 2, Y + 142, sq_RGBA(255, 60, 48, 255), 0, 1);
}
}
function Show(obj) {
DrawMain(obj);
LenheartNewUI_Windows.Show(obj);
}
//逻辑入口
function Proc(obj) {
LenheartNewUI_Windows.SyncPos(X, Y);
}
function DiscardItem(ItemAddress) {
local MousePos_X = IMouse.GetXPos();
local MousePos_Y = IMouse.GetYPos();
if (!sq_IsIntersectRect(MousePos_X, MousePos_Y, 1, 1, X, Y, Width, Height)) return true;
if (!Visible) return true;
else {
Item = FindItemPosByForeachInven(ItemAddress);
if (Item) {
local ItemObject = Rindro_Item();
ItemObject.LoadByAddress(Item.ItemAddress);
ItemSlot.SetItem(ItemObject);
SendPackEx({
op = 21011007,
item = Item
});
}
}
}
//遍历背包查找Item
function FindItemPosByForeachInven(FindAddress) {
local Inven = L_sq_RA(0x1A5FB24);
local InvenAdd = L_sq_RA(Inven + 56);
InvenAdd += 36;
for (local z = 0; z< 1; z++) {
for (local i = 0; i< 48; i++) {
local ItemAdd = L_sq_RA(InvenAdd + ((i + (z * 48)) * 4));
if (ItemAdd == FindAddress) {
local NamePointer = L_sq_RA(FindAddress + 0x20);
if (z != 0) {
if (ItemInfoDrawS) {
L_Sq_CallFunc(0xE6B2B0, "int", FFI_THISCALL, ["int", "int", "int", "char"], 0x1ADE090, 0x113, 0xFFFFFFFF, 0x0);
ItemInfoDrawS = null;
ResetFocus();
}
return null;
}
local rRarity = L_sq_RA(FindAddress + 0xF4);
return {
Type = z,
Pos = i,
Vis = false,
Count = MemoryTool.DecodeMemoryData(FindAddress + 0x1A4),
ItemId = L_sq_RA(FindAddress + 0x1c),
ItemAddress = FindAddress,
Name = NativePointer(L_sq_I2P(NamePointer)).readUnicodeString(),
Rarity = rRarity,
};
}
}
}
return null;
}
function RegNpc() {
local EachManager = Lenheart_Get_EachObj();
EachManager.AddEachForNpc(NPC, 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 = 53;
ApplyEngagementButton.Str = "镇魂进阶";
ApplyEngagementButton.Data = SThis.NPC_Index;
ApplyEngagementButton.OnClick = function(Button) {
InitWindow();
//打开背包
L_sq_Open_ExWindow(0x1ADE090, 0, 0, 1);
Button.Parent.CloseAllEach();
Button.Parent.CloseWindow();
ResetFocus();
R_Utils.PlaySound("WINDOW_SHOW");
}.bindenv(this);
ApplyEngagementButton.SetCallBackFunc(function(Button) {})
SThis.AddChild(ApplyEngagementButton);
}.bindenv(this));
}
//读取配置
function InifPvf() {
Rindro_Script.GetFileData("etc/rindro/expandequipment/soulsalvation.etc", function(DataTable, Data) {
while (!Data.Eof()) {
local Fragment = Data.Get();
if (Fragment == "[STAGE1 NPC]") {
NPC = Data.Get();
}
}
});
}
function InitWindow() {
Visible = true;
//清空
Item = null;
ItemSlot.RemoveItem();
ErrorMsg = null;
MaterialInfo = null;
MaterialIsEnough = false;
}
}
L_Windows_List <- [];
getroottable().rawdelete("LenheartPluginsInitFlag");
getroottable().rawdelete("EventList_Obj")
getroottable().rawdelete("SoulSalvation_Obj");
getroottable().rawdelete("L_Each_Obj");

View File

@@ -0,0 +1,232 @@
/*
文件名:HM_Inherit.nut
路径:Project/SpecialCustomization/HM_Inherit.nut
创建日期:2026-02-02 19:24
文件用途:毁梦继承
*/
class HM_InheritC extends LenheartNewUI_Windows {
//调试模式
// DeBugMode = true;
//不是窗口
// NoWindow = true;
//是否可见
Visible = false;
Img = Rindro_Image("interface2/ui/newitemtool/soulweapon.img");
//装备
Item = null;
Item2 = null;
//装备槽位
ItemSlot = null;
//灵魂槽位
ItemSlot2 = null;
//注册的NPC列表
NPC = null;
constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH) {
Childrens = [];
//注册控件
RegisterWidget();
RegNpc();
LenheartNewUI_Windows.constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH);
DiscardItemCallBackFunc.rawset("HM_InheritC", DiscardItem.bindenv(this));
//成功回包
Pack_Control.rawset(21013002, function(Chunk) {
//清空
Item = null;
Item2 = null;
ItemSlot.RemoveItem();
ItemSlot2.RemoveItem();
}.bindenv(this));
}
function RegisterWidget() {
//关闭按钮
local CloseButton = LenheartNewUI_BaseButton(274, 4, 11, 12, "interface/lenheartwindowcommon.img", 276);
CloseButton.OnClick = function() {
this.Visible = false;
}.bindenv(this);
Childrens.append(CloseButton);
//确认按钮
local CrossoverButton = LenheartNewUI_ButtonText(109, 260, 15, "确认继承");
CrossoverButton.DWidth = 18;
CrossoverButton.Width = 74;
CrossoverButton.SetTextOffset(-4, 1);
CrossoverButton.OnClickEx = function(Btn) {
if (!Btn.Visible) return;
SendPackEx({
op = 21013001,
item = Item,
item2 = Item2
});
}.bindenv(this);
CrossoverButton.SetCallBackFunc(function(Btn) {
if (ItemSlot.ItemObject && ItemSlot2.ItemObject) {
Btn.State = 0;
} else {
Btn.State = 8;
}
}.bindenv(this));
AddChild(CrossoverButton);
ItemSlot = LenheartNewUI_ItemSlot(66, 97);
ItemSlot.SetRemoveCallBack(function(obj) {
Item = null;
}.bindenv(this));
AddChild(ItemSlot);
ItemSlot2 = LenheartNewUI_ItemSlot(197, 97);
ItemSlot2.SetRemoveCallBack(function(obj) {
Item2 = null;
}.bindenv(this));
AddChild(ItemSlot2);
}
//绘制主界面
function DrawMain(obj) {
//背景框
DrawNineBox(X, Y, 292, 292, "interface/lenheartwindowcommon.img", 213);
//标题
DrawWindowTitle(293);
//绘制标题名
L_sq_DrawCode("武器装备继承", X + 110, Y + 5, sq_RGBA(230, 200, 155, 255), 0, 1);
Img.DrawPng(1, X + 8, Y + 32);
Img.DrawPng(3, X + 8, Y + 32);
for (local i = 0; i< 5; i++) {
Img.DrawPng(2, X + 31 + 51 * i, Y + 195);
continue;
}
}
function Show(obj) {
DrawMain(obj);
LenheartNewUI_Windows.Show(obj);
}
//逻辑入口
function Proc(obj) {
LenheartNewUI_Windows.SyncPos(X, Y);
}
function DiscardItem(ItemAddress) {
local MousePos_X = IMouse.GetXPos();
local MousePos_Y = IMouse.GetYPos();
if (!sq_IsIntersectRect(MousePos_X, MousePos_Y, 1, 1, X, Y, Width, Height)) return true;
local SlotPos = 0;
if (sq_IsIntersectRect(MousePos_X, MousePos_Y, 1, 1, ItemSlot.X, ItemSlot.Y, ItemSlot.Width, ItemSlot.Height)) {
SlotPos = 1;
} else if (sq_IsIntersectRect(MousePos_X, MousePos_Y, 1, 1, ItemSlot2.X, ItemSlot2.Y, ItemSlot2.Width, ItemSlot2.Height)) {
SlotPos = 2;
} else {
return null;
}
if (!Visible) return true;
else {
local ItemBuf = FindItemPosByForeachInven(ItemAddress, SlotPos);
if (ItemBuf) {
local ItemObject = Rindro_Item();
ItemObject.LoadByAddress(ItemBuf.ItemAddress);
if (SlotPos == 1) {
ItemSlot.SetItem(ItemObject);
Item = ItemBuf;
} else if (SlotPos == 2) {
ItemSlot2.SetItem(ItemObject);
Item2 = ItemBuf;
}
}
}
}
//遍历背包查找Item
function FindItemPosByForeachInven(FindAddress, SlotPos) {
local Inven = L_sq_RA(0x1A5FB24);
local InvenAdd = L_sq_RA(Inven + 56);
InvenAdd += 36;
//0是装备 2是任务材料
local z = 0;
for (local i = 0; i< 56; i++) {
local ItemAdd = L_sq_RA(InvenAdd + ((i + (z * 56)) * 4));
if (ItemAdd == FindAddress) {
local NamePointer = L_sq_RA(FindAddress + 0x20);
local rRarity = L_sq_RA(FindAddress + 0xF4);
local rItemId = L_sq_RA(FindAddress + 0x1c);
return {
Type = z,
Pos = i,
Vis = false,
Count = MemoryTool.DecodeMemoryData(FindAddress + 0x1A4),
ItemId = rItemId,
ItemAddress = FindAddress,
Name = NativePointer(L_sq_I2P(NamePointer)).readUnicodeString(),
Rarity = rRarity,
};
}
}
return null;
}
function RegNpc() {
local EachManager = Lenheart_Get_EachObj();
EachManager.AddEachForNpc(2, 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 = 53;
ApplyEngagementButton.Str = "装备继承";
ApplyEngagementButton.Data = SThis.NPC_Index;
ApplyEngagementButton.OnClick = function(Button) {
InitWindow();
//打开背包
L_sq_Open_ExWindow(0x1ADE090, 0, 0, 1);
Button.Parent.CloseAllEach();
Button.Parent.CloseWindow();
ResetFocus();
R_Utils.PlaySound("WINDOW_SHOW");
}.bindenv(this);
ApplyEngagementButton.SetCallBackFunc(function(Button) {})
SThis.AddChild(ApplyEngagementButton);
}.bindenv(this));
}
function InitWindow() {
Visible = true;
//清空
Item = null;
Item2 = null;
ItemSlot.RemoveItem();
ItemSlot2.RemoveItem();
}
}
L_Windows_List <- [];
getroottable().rawdelete("LenheartPluginsInitFlag");
getroottable().rawdelete("EventList_Obj")
getroottable().rawdelete("HM_Inherit_Obj");
getroottable().rawdelete("L_Each_Obj");
function Lenheart_HM_Inherit_Fun(obj) {
local RootTab = getroottable();
if (!RootTab.rawin("HM_Inherit_Obj")) {
RootTab.rawset("HM_Inherit_Obj", true);
LenheartNewUI_CreateWindow(HM_InheritC, "装备继承", ((getroottable().Rindro_Scr_Width - 700) / 2).tointeger(), 160, 292, 290, 28);
}
}
getroottable()["LenheartFuncTab"].rawset("HM_InheritFuncN", Lenheart_HM_Inherit_Fun);

View File

@@ -0,0 +1,174 @@
class TorturegiftC extends LenheartNewUI_Windows {
//调试模式
// DeBugMode = true;
//状态 0展示状态 1滚动状态
MacState = 0;
ItemNameColor = [
0xffffffff, //白装
0xffedd568, //蓝装
0xffff6bb3, //紫装
0xfff000ff, //粉装
0xff0082ff, //传说
0xff00b1ff //史诗
]
//红眼闪光动画
EyesAnimotion = null;
//当前道具组
ItemShowArr = null;
//轮播时间
PlayT = 0;
//轮播速度
PlayRate = 2;
constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH) {
Childrens = [];
ItemShowArr = [];
//注册控件
RegisterWidget();
LenheartNewUI_Windows.constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH);
local FrameArr = [];
for (local i = 0; i< 23; i++) {
local T = {
ImgIndex = 3 + i,
Delay = 60,
Pos = [0, 0]
}
FrameArr.append(T);
}
EyesAnimotion = Lenheart_Ani("null", FrameArr, [100, 100]);
EyesAnimotion.ImgPath = "contents/2022/bakalraid/ui/bakal_reward/title.img";
for (local i = 0; i< 50; i++) {
local T = {
XOffset = (i * 170),
YOffset = 213,
ItemId = 3037,
ItemCount = 100,
Grade = 5,
Name = "无色小晶体"
}
ItemShowArr.append(T);
}
}
function RegisterWidget() {
//关闭按钮
local CloseButton = LenheartNewUI_BaseButton(432, 0, 11, 12, "interface/lenheartwindowcommon.img", 276);
CloseButton.OnClick = function() {
this.Visible = false;
}.bindenv(this);
Childrens.append(CloseButton);
}
//绘制卡牌
function DrawRewardCard(CardInfo) {
//绘制卡牌底
L_sq_DrawImg("rindro_ui/torturegift.img", 4, X + CardInfo.XOffset, Y + CardInfo.YOffset);
//绘制品级框底槽
L_sq_DrawImg("rindro_ui/torturegift_grade.img", CardInfo.Grade, X + CardInfo.XOffset + 64, Y + CardInfo.YOffset + 26);
//绘制名称
L_sq_DrawCode(CardInfo.Name, X + CardInfo.XOffset + 82 - LenheartTextClass.GetStringLength(CardInfo.Name) / 2, Y + CardInfo.YOffset + 70, ItemNameColor[CardInfo.Grade], 0, 1);
//绘制物品
DrawItemBase(X + CardInfo.XOffset + 67, Y + CardInfo.YOffset + 29, CardInfo.ItemId, CardInfo.ItemCount);
}
//绘制主界面
function DrawMain(obj) {
//绘制背景框标题栏
L_sq_DrawImg("rindro_ui/torturegift.img", 0, X, Y);
//轨道底层
L_sq_DrawImg("rindro_ui/torturegift.img", 1, X + 6, Y + 198);
//上牛头
L_sq_DrawImg("rindro_ui/torturegift.img", 2, X + 114, Y + 175);
//下
L_sq_DrawImg("rindro_ui/torturegift.img", 3, X + 114, Y + 336);
//指针
L_sq_DrawImg("rindro_ui/torturegift.img", 5, X + 215, Y + 320);
}
function Show(obj) {
DrawMain(obj);
setClip(X + 30, Y, X + 422, Y + 454); //开始裁切
local AddOffset = 0;
PlayT += Duration;
if (PlayT >= 30) {
AddOffset = (1 * PlayRate);
PlayT = 0;
}
foreach(_index, infoobj in ItemShowArr) {
if (AddOffset) {
infoobj.XOffset -= AddOffset;
// if (_index == 0) print(infoobj.XOffset);
if (infoobj.XOffset <= -200) infoobj.XOffset += (ItemShowArr.len()) * 170;
}
DrawRewardCard(infoobj);
}
releaseClip(); //裁切结束
if (ItemInfoDrawS && MacState == 0) {
PlayRate = 0;
} else if (MacState == 0) {
PlayRate = 1;
}
LenheartNewUI_Windows.Show(obj);
// L_sq_SetDrawImgModel(2, 0);
// EyesAnimotion.X = X - 122;
// EyesAnimotion.Y = Y + 110;
// EyesAnimotion.Show(Duration);
// L_sq_ReleaseDrawImgModel();
}
//逻辑入口
function Proc(obj) {
LenheartNewUI_Windows.SyncPos(X, Y);
}
}
L_Windows_List <- [];
getroottable().rawdelete("LenheartPluginsInitFlag");
getroottable().rawdelete("EventList_Obj")
getroottable().rawdelete("TorturegiftC_Obj");
getroottable().rawdelete("L_Each_Obj");
function Lenheart_Torturegift_New(obj) {
local RootTab = getroottable();
if (!RootTab.rawin("TorturegiftC_Obj")) {
RootTab.rawset("TorturegiftC_Obj", true);
LenheartNewUI_CreateWindow(TorturegiftC, "折磨之礼窗口", 210, 64, 452, 454, 22);
}
}
if (getroottable().rawin("LenheartFuncTab")) {
getroottable()["LenheartFuncTab"].rawset("Lenheart_Torturegift_NewFunc", Lenheart_Torturegift_New);
} else {
local T = {};
T.rawset("Lenheart_Torturegift_NewFunc", Lenheart_Torturegift_New);
getroottable().rawset("LenheartFuncTab", T);
}

View File

@@ -9,22 +9,24 @@ class TreasureGoblinC extends LenheartNewUI_Windows {
// DeBugMode = true;
//不是窗口
// NoWindow = true;
NoWindow = true;
//是否可见
// Visible = false;
Visible = false;
BaseImg = Rindro_Image("interface2/rindro_reward.img");
MainImg = Rindro_Image("treasuregoblin/main.img");
//窗口名称
WindowTitle = "普通宝藏哥布林的宝箱";
//关闭按钮
CloseButton = null;
//搜索时间Flag
SearchTimeFlag = 0;
//搜索时间品级对应表
SearchTimeGradeTable = [1000, 1500, 2000, 2500, 3000, 3500];
SearchTimeGradeTable = [1500, 1500, 2000, 2500, 3000, 3500, 3500, 3500, 3500, 3500, 3500];
//奖励包
RewardPackage = null;
@@ -32,45 +34,65 @@ class TreasureGoblinC extends LenheartNewUI_Windows {
//动画队列
AniQueue = null;
//哥布林配置表 ID -> 名字
GoldGoblinConfig = null;
//当前哥布林ID
CurrentGoblinId = 690000226;
constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH) {
Childrens = [];
AniQueue = QuestQueue();;
AniQueue = QuestQueue();
//注册控件
RegisterWidget();
//初始化哥布林配置
InitGoldGoblinConfig();
LenheartNewUI_Windows.constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH);
local RewList = [3037, 3038, 3039, 26058];
local RewList = [7422, 7422, 7422, 7422, 7422, 2682154, 2682154, 2682154, 2682154, 2682154, 10007482, 10007482, 10007482, 10007482, 10007482, 10007483, 10007483, 10007483, 10007483, 10007483, 10007484, 10007484, 10007484, 10007484, 10007484, 10092470, 10092470, 10092470, 10092470, 10092470, 490701711, 490701711, 490701711, 490701711, 490701711, 490701712, 490701712, 490701712, 490701712, 490701712, 2660671, 2660671, 2660671, 2660671, 2660671, 2660672, 2660672, 2660672, 2660672, 2660672, 7163, 1298, 2682833, 7163, 1298, 2682833, 7163, 1298, 2682833, 2682834, 2682835, 10007249, 10007250, 10007251, 10015164, 10015165, 10015166, 10015167, 10015168, 10015169, 10015170, 10015171, 10015172, 10015173, 10015174, 490001458, 490001942, 490001937, 490001941, 490002485, 490001940, 490001956, 490001693, 490011087, 490703966, 490702732, 490702941, 490700168, 10008064, 10008065, 10008066, 10008067, 10008068, 10008069, 10008070, 10008071, 10008072, 10008073, 10008074, 10008075, 10008076, 10008077, 10008078, 10008079, 10008080, 10008081, 10008082, 10008083, 10008084, 10008085, 10008086, 10008087, 10008088, 10008089, 10008090, 10008091, 10008092, 10008093, 10008094, 10008095, 10008096, 10008097, 10008098, 10008099, 10008100, 10008101, 10008102, 10008103, 10008104, 10008105, 10008106, 10008107, 10008910, 10008911, 8381, 2681176, 2681177, 2681178, 2681179, 2681180, 2681181, 2681182, 2681183, 2681184, 2681185, 2681186, 2681187, 2681482, 2681483, 2681486, 2681487, 2747554, 2747555, 2747556, 2747557, 2747558, 2747559, 2747560, 2747561, 20210112, 20210113];
// RewardPackage = [];
// for (local i = 0; i< sq_getRandom(5, 8); i++) {
// local T = {};
// T.ItemId <- RewList[sq_getRandom(0, RewList.len() - 1)];
// T.ItemCount <- sq_getRandom(1, 5);
// T.IsSearch <- false; //是否已经搜索
// // T.Grade <- L_sq_RA(L_sq_GetItem(T.ItemId) + 0xF4); //到时候品级由服务端决定下发
// // T.Grade <- L_sq_RA(L_sq_GetItem(T.ItemId) + 0xF4);
// T.Grade <- 4;
// RewardPackage.append(T);
// }
// Visible = true;
// SetCurrentGoblinId(1);
// CloseButton.Visible = false;
RewardPackage = [];
for (local i = 0; i< sq_getRandom(5, 16); i++) {
local T = {};
T.ItemId <- RewList[sq_getRandom(0, RewList.len() - 1)];
T.Count <- sq_getRandom(1, 5);
T.IsSearch <- false; //是否已经搜索
// T.Grade <- L_sq_RA(L_sq_GetItem(T.ItemId) + 0xF4); //到时候品级由服务端决定下发
// T.Grade <- L_sq_RA(L_sq_GetItem(T.ItemId) + 0xF4);
T.Grade <- sq_getRandom(4, 5);
RewardPackage.append(T);
}
Pack_Control.rawset(21014002, function (Chunk)
{
local Jso = Json.Decode(Chunk);
RewardPackage = Jso.RewardPackage;
foreach (obj in RewardPackage) {
obj.IsSearch<- false;
}
Visible = true;
CloseButton.Visible = false;
SetCurrentGoblinId(Jso.BoxId);
}.bindenv(this));
}
function RegisterWidget() {
//关闭按钮
local CloseButton = LenheartNewUI_BaseButton(303, 6, 11, 12, "interface/lenheartwindowcommon.img", 276);
CloseButton = LenheartNewUI_BaseButton(303, 6, 11, 12, "interface/lenheartwindowcommon.img", 276);
CloseButton.OnClick = function() {
this.Visible = false;
}.bindenv(this);
Childrens.append(CloseButton);
local PickAllButton = LenheartNewUI_ButtonText(108, 341, 45, "全部拾取");
PickAllButton.SetTextOffset(9, 1);
PickAllButton.OnClick = function() {
}.bindenv(this);
AddChild(PickAllButton);
}
@@ -84,7 +106,7 @@ class TreasureGoblinC extends LenheartNewUI_Windows {
L_sq_DrawCode(WindowTitle, X + 158 - LenheartTextClass.GetStringLength(WindowTitle) / 2, Y + 7, sq_RGBA(230, 200, 155, 255), 0, 1);
//绘制窗口
DrawNineBox(X, Y + 23, 316, 350, "interface/lenheartwindowcommon.img", 213); //背景框
DrawNineBox(X, Y + 23, 316, 317, "interface/lenheartwindowcommon.img", 213); //背景框
//绘制内嵌窗口
DrawNineBox(X + 8, Y + 32, 299, 299, "interface/lenheartwindowcommon.img", 204); //背景框
@@ -92,24 +114,31 @@ class TreasureGoblinC extends LenheartNewUI_Windows {
//绘制分割线
MainImg.DrawExPng(0, X + 10, Y + 34, 0, sq_RGBA(127, 132, 142, 250), 1.0, 1.0);
if (RewardPackage) {
foreach(Index, Info in RewardPackage) {
local XPos = X + 11 + ((Index % 8) * 37);
local YPos = Y + ((Index / 8).tointeger() * 37) + 35;
local XPos = X + 24 + ((Index % 6) * 47);
local YPos = Y + ((Index / 6).tointeger() * 47) + 46;
if (Info.IsSearch) {
BaseImg.DrawPng(Info.Grade, XPos, YPos);
DrawItemBase(XPos + 3, YPos + 3, Info.ItemId, Info.Count);
// BaseImg.DrawPng(Info.Grade, XPos, YPos);
DrawItemBase(XPos + 3, YPos + 3, Info.ItemId, Info.ItemCount);
} else {
MainImg.DrawPng(1, XPos + 10, YPos + 10);
MainImg.DrawPng(1, XPos + 9, YPos + 9);
}
}
//绘制无道具的遮挡槽
for (local i = 0 ; i< 36; i++) {
if (i >= RewardPackage.len()) {
MainImg.DrawPng(2, X + 26 + ((i % 6) * 47), Y + ((i / 6).tointeger() * 47) + 48);
}
}
local AllSearchFinish = true;
foreach(Index, Info in RewardPackage) {
local XPos = X + 11 + ((Index % 8) * 37);
local YPos = Y + ((Index / 8).tointeger() * 37) + 35;
local XPos = 24 + ((Index % 6) * 47);
local YPos =((Index / 6).tointeger() * 47) + 46;
//如果是没有搜索状态
if (!Info.IsSearch) {
AllSearchFinish = false;
//还没有开始计时
if (!Info.rawin("SeachTimer")) {
Info.SeachTimer <- 0;
@@ -117,17 +146,23 @@ class TreasureGoblinC extends LenheartNewUI_Windows {
if (Duration< 100) Info.SeachTimer += Duration;
if (Info.SeachTimer< SearchTimeGradeTable[Info.Grade]) {
local T = GetClockwiseCirclePoint(Info.SeachTimer / 1300.0, 0, 0, 6);
Rindro_Image_GlobalMap["lenheartui"].DrawPng(159, XPos + 12 + T.x, YPos + 12 + T.y);
Rindro_Image_GlobalMap["lenheartui"].DrawPng(159, X + XPos + 12 + T.x, Y + YPos + 12 + T.y);
} else {
Info.IsSearch = true;
R_Utils.PlaySound("ICON_KEY");
local SoundGrade = "ITEM_PICK";
if (Info.Grade == 2 || Info.Grade == 3) SoundGrade = "GoblinBox2";
if (Info.Grade >= 4) SoundGrade = "GoblinBox1";
R_Utils.PlaySound(SoundGrade);
SendPackEx({
op = 21014003
})
AniQueue.AddQuest("搜索完成动画" + Info.Grade, function(Name, Time, Grade, XPos, YPos) {
local AniPath = "common/item_effect/custom_2option_setting.ani";
if (Grade == 3) AniPath = "common/item_effect/custom_3option.ani";
if (Grade == 5) AniPath = "common/item_effect/custom_4option.ani";
if (Grade == 4) AniPath = "common/item_effect/custom_honor_4option.ani";
local Ani = DrawAniEx(XPos, YPos, AniPath);
local AniPath = "common/item_effect/custom_3option.ani";
if (Grade == 2 || Grade == 3) AniPath = "common/item_effect/custom_4option.ani";
if (Grade >= 4) AniPath = "common/item_effect/custom_honor_4option.ani";
local Ani = DrawAniEx(X + XPos, Y + YPos, AniPath);
if (sq_GetAnimationFrameIndex(Ani) == 14) {
sq_Rewind(Ani);
AniQueue.RemoveQuest(Name);
@@ -137,6 +172,10 @@ class TreasureGoblinC extends LenheartNewUI_Windows {
break;
}
}
if (AllSearchFinish) {
CloseButton.Visible = true;
}
}
}
@@ -146,12 +185,14 @@ class TreasureGoblinC extends LenheartNewUI_Windows {
LenheartNewUI_Windows.Show(obj);
}
//逻辑入口
function Proc(obj) {
LenheartNewUI_Windows.SyncPos(X, Y);
IsFocus = true;
}
function GetClockwiseCirclePoint(dt, centerX, centerY, radius) {
// 将dt映射到角度(0到2π弧度),并反转方向实现顺时针
local angle = 2 * 3.1415926535 * (1.0 - dt);
@@ -166,6 +207,46 @@ class TreasureGoblinC extends LenheartNewUI_Windows {
y = centerY + offsetY
};
}
//读取哥布林配置
function InitGoldGoblinConfig() {
GoldGoblinConfig = {};
Rindro_Script.GetFileData("etc/rindro/goldgoblin/goldgoblin.lst", function(ConfigTable, Data) {
while (!Data.Eof()) {
local Index = Data.Get();
local Path = "etc/" + Data.Get();
local GoblinInfo = Rindro_Script.GetFileData(Path, function(InfoTable, InfoData) {
while (!InfoData.Eof()) {
local Fragment = InfoData.Get();
if (Fragment == "[name]") {
InfoTable.Name <- Sq_ConvertWideChar(InfoData.Get(), "big5");
} else if (Fragment == "[trigger]") {
InfoTable.TriggerId <- InfoData.Get();
}
}
}.bindenv(this));
if (GoblinInfo.rawin("TriggerId") && GoblinInfo.rawin("Name")) {
GoldGoblinConfig[GoblinInfo.TriggerId] <- GoblinInfo.Name;
}
}
}.bindenv(this));
}
//根据ID获取哥布林名字
function GetGoblinNameById(goblinId) {
if (GoldGoblinConfig && GoldGoblinConfig.rawin(goblinId)) {
return GoldGoblinConfig[goblinId];
}
return "宝藏哥布林的宝箱";
}
//设置当前哥布林ID并更新窗口标题
function SetCurrentGoblinId(goblinId) {
CurrentGoblinId = goblinId;
WindowTitle = GetGoblinNameById(goblinId);
}
}
getroottable().rawdelete("TreasureGoblin_Obj");
@@ -173,7 +254,7 @@ function Lenheart_TreasureGoblin_Fun(obj) {
local RootTab = getroottable();
if (!RootTab.rawin("TreasureGoblin_Obj")) {
RootTab.rawset("TreasureGoblin_Obj", true);
LenheartNewUI_CreateWindow(TreasureGoblinC, "宝藏哥布林的宝箱窗口", ((getroottable().Rindro_Scr_Width - 317) / 2).tointeger(), 80, 317, 370, 26);
LenheartNewUI_CreateWindow(TreasureGoblinC, "宝藏哥布林的宝箱窗口", ((getroottable().Rindro_Scr_Width - 317) / 2).tointeger(), 80, 317, 335, 26);
}
}
@@ -188,3 +269,8 @@ getroottable().rawdelete("EventList_Obj")
getroottable().rawdelete("TreasureGoblin_Obj");
// L_sq_GoDungeon(3709);
// local Objss = L_Sq_ObjectAddressToSqrObject(L_sq_RA(0x1AB7CDC), "CNSquirrelPassiveObject", 0);
// print(Objss);
// print(Objss.isObjectType(OBJECTTYPE_CHARACTER));

View File

@@ -220,5 +220,41 @@
},
"Project/WarehouseLock": {
"description": "仓库锁"
},
"Base/_Z_Data/Global.nut": {
"description": "全局信息类"
},
"Project/ExpandEquipment": {
"description": "拓展装备"
},
"Project/ItemTool/ItemOtherWolrdUpgrade": {
"description": "异界装备升级"
},
"Base/_Tool/CustomAnimation_Class.nut": {
"description": "自定义Ani"
},
"Project/FixItemCout": {
"description": "修复道具数量显示"
},
"Project/Torturegift": {
"description": "折磨之礼"
},
"Project/FixItemDrawUuid": {
"description": "开启装备uuid显示"
},
"Project/NewItemInfoWindow": {
"description": "新物品信息窗口"
},
"Project/SoulSalvation": {
"description": "灵魂武器"
},
"Project/NewTitle": {
"description": "称谓系统"
},
"Project/SpecialCustomization": {
"description": "特殊定制"
},
"Project/CustomPlugins": {
"description": "定制插件"
}
}