diff --git a/Base/CallBack/RegistPushString.nut b/Base/CallBack/RegistPushString.nut new file mode 100644 index 0000000..fdfe9f3 --- /dev/null +++ b/Base/CallBack/RegistPushString.nut @@ -0,0 +1,364 @@ +/* +文件名: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}"; + + 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 + "_"); +} + + + diff --git a/Base/_Tool/Hacker_RegApi.nut b/Base/_Tool/Hacker_RegApi.nut index 17cae70..8c3bc87 100644 --- a/Base/_Tool/Hacker_RegApi.nut +++ b/Base/_Tool/Hacker_RegApi.nut @@ -368,4 +368,43 @@ Rindro_Haker.LoadHook(0x67C560, ["pointer", "int", "int", "int", "int", "void"], // // print(format("%02x", args.pop())); // // TTTAni <- args.pop(); // return null; -// }); \ No newline at end of file +// }); + + +//右边窗口公告 + +/* + +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; + }); diff --git a/Base/_Z_Data/Global.nut b/Base/_Z_Data/Global.nut new file mode 100644 index 0000000..0691f29 --- /dev/null +++ b/Base/_Z_Data/Global.nut @@ -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_(); diff --git a/FileConfig.json b/FileConfig.json index 439efe8..3d8059f 100644 --- a/FileConfig.json +++ b/FileConfig.json @@ -12,11 +12,13 @@ "Base/_Tool/Image_Class.nut", "Base/_Tool/Animation_Class.nut", "Base/_Tool/Item_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,6 +56,18 @@ "CSBase/Interface.nut" ], "ProjectScript": { + "扩展装备": { + "Private": true, + "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, "Script": [ diff --git a/Project/ExpandEquipment/ExpandEquipment.nut b/Project/ExpandEquipment/ExpandEquipment.nut new file mode 100644 index 0000000..f252d5c --- /dev/null +++ b/Project/ExpandEquipment/ExpandEquipment.nut @@ -0,0 +1,382 @@ +/* +文件名: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()["LenheartFuncTab"].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) {} \ No newline at end of file diff --git a/Project/TreasureGoblin/TreasureGoblin.nut b/Project/TreasureGoblin/TreasureGoblin.nut index 6ebba88..c392054 100644 --- a/Project/TreasureGoblin/TreasureGoblin.nut +++ b/Project/TreasureGoblin/TreasureGoblin.nut @@ -14,6 +14,7 @@ class TreasureGoblinC extends LenheartNewUI_Windows { //是否可见 // Visible = false; + BaseImg = Rindro_Image("interface2/rindro_reward.img"); MainImg = Rindro_Image("treasuregoblin/main.img"); diff --git a/folder-alias.json b/folder-alias.json index 5febfc1..fe5dfbf 100644 --- a/folder-alias.json +++ b/folder-alias.json @@ -220,5 +220,11 @@ }, "Project/WarehouseLock": { "description": "仓库锁" + }, + "Base/_Z_Data/Global.nut": { + "description": "全局信息类" + }, + "Project/ExpandEquipment": { + "description": "拓展装备" } } \ No newline at end of file