From 797ae588e6a18a2fc66976d04171782ce0ce0b6c Mon Sep 17 00:00:00 2001 From: Lenheart <947330670@qq.com> Date: Mon, 9 Feb 2026 23:36:05 +0800 Subject: [PATCH] =?UTF-8?q?=E9=9C=B2=E9=9C=B2=E5=AE=9A=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FileConfig.json | 15 + .../CustomPlugins/lulu/ExpandEquipment.nut | 390 ++++++++++++++++++ Project/CustomPlugins/lulu/ObjectConvert.nut | 15 + Project/ExpandEquipment/ExpandEquipment.nut | 1 + 4 files changed, 421 insertions(+) create mode 100644 Project/CustomPlugins/lulu/ExpandEquipment.nut create mode 100644 Project/CustomPlugins/lulu/ObjectConvert.nut diff --git a/FileConfig.json b/FileConfig.json index 8ca766a..f998bb8 100644 --- a/FileConfig.json +++ b/FileConfig.json @@ -1198,6 +1198,21 @@ ] }, "imgPath": "HorseGuessing" + }, + "露露定制内容": { + "Private": true, + "Enabled": false, + "price": 999, + "Script": [ + "Project/ExpandEquipment/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" + } } } } \ No newline at end of file diff --git a/Project/CustomPlugins/lulu/ExpandEquipment.nut b/Project/CustomPlugins/lulu/ExpandEquipment.nut new file mode 100644 index 0000000..fe7a2d9 --- /dev/null +++ b/Project/CustomPlugins/lulu/ExpandEquipment.nut @@ -0,0 +1,390 @@ +/* +文件名: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); + } + } + 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) {} + +*/ \ No newline at end of file diff --git a/Project/CustomPlugins/lulu/ObjectConvert.nut b/Project/CustomPlugins/lulu/ObjectConvert.nut new file mode 100644 index 0000000..95fd640 --- /dev/null +++ b/Project/CustomPlugins/lulu/ObjectConvert.nut @@ -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); +} \ No newline at end of file diff --git a/Project/ExpandEquipment/ExpandEquipment.nut b/Project/ExpandEquipment/ExpandEquipment.nut index 0b82e45..a3362c7 100644 --- a/Project/ExpandEquipment/ExpandEquipment.nut +++ b/Project/ExpandEquipment/ExpandEquipment.nut @@ -53,6 +53,7 @@ class ExpandEquipmentC { getroottable()[FuncName](obj, Index); } } + } } foreach(Index, _v in EquipIndexList) {