/* 文件名:AncientRelic.nut 路径:Project/CustomizeWeapon/AncientRelic.nut 创建日期:2025-12-04 14:22 文件用途: */ class CustomizeWeapon_AncientRelic { Info = null; //是否有荒古装备 IsAncientRelic = false; //当前魔能积攒数值 MagicEnergyValue = 0; //当前魔能开启状态 MagicEnergyState = false; //魔能爆发阶段 MagicEnergyStage = 0; //魔能爆发计时器 MagicEnergyTimer = 0; //常规状态伤害增加率 DamageRate = 1.0; //魔能状态伤害增加率 MagicDamageRate = 1.0; constructor() { Info = {}; //读取PVF中 荒古装备的配置 Rindro_Script.GetFileData("etc/rindro/ancientrelic/ancientrelic.etc", function(DataTable, Data) { while (!Data.Eof()) { local Fragment = Data.Get(); if (Fragment == "[info]") { while (true) { local Fbuf = Data.Get(); if (Fbuf == "[/info]") { break; } local NormalRate = Data.Get(); local ExRate = Data.Get(); Info.rawset(Fbuf, { NormalRate = NormalRate.tofloat() / 100.0 + 1.0, ExRate = ExRate.tofloat() / 100.0 + 1.0 }) } } } }); RindroDamageRateChanageRideFunc.rawset("AncientRelic", function() { return MagicEnergyState ? MagicDamageRate : DamageRate; }.bindenv(this)); DrawAppendCallBackFunc.rawset("AncientRelic", DrawEffect.bindenv(this)); // onAttackParentCallBackFunc.rawset("AncientRelic", OnAttack.bindenv(this)); // local str = "funcaksdnjkansdknasjdad"; // local A = Memory.allocUtf8String(str); // local B = Memory.alloc(0x1000); // local str = "testsadsdads"; // local B = Memory.alloc(0x1000); // B.writeByteArray(str); // print(B.readUtf8String(str.len())); } function AdditionalAppendage(obj) { if (sq_GetCurrentModuleType() == 3) { local appendage = CNSquirrelAppendage.sq_GetAppendage(obj, "../etc/rindro/ancientrelic/ancientrelic.nut"); if (!appendage) { CNSquirrelAppendage.sq_AppendAppendage(obj, obj, 169, true, "../etc/rindro/ancientrelic/ancientrelic.nut", true); } } } //魔能爆炸 function MagicEnergyExplosion(obj) { local OutbreakBool = obj.getMyPassiveObject(48882, 0); if (OutbreakBool && !MagicEnergyState) { MagicEnergyState = true; MagicEnergyTimer = Clock(); sq_SendDestroyPacketPassiveObject(OutbreakBool); } } //绘制魔能特效 function DrawEffect(args) { if (IsAncientRelic) { //魔能开启状态 if (MagicEnergyValue > 0) { if (MagicEnergyState) { if (MagicEnergyStage == 0) { Rindro_BaseToolClass.DrawAniEx(args[1], args[2], "etc/rindro/ancientrelic/ani/open/01_red/red_onedodge2.ani"); } else if (MagicEnergyStage == 1) { Rindro_BaseToolClass.DrawAniEx(args[1], args[2], "etc/rindro/ancientrelic/ani/open/02_yellow/yellow_onedodge2.ani"); } else if (MagicEnergyStage == 2) { Rindro_BaseToolClass.DrawAniEx(args[1], args[2], "etc/rindro/ancientrelic/ani/open/03_white/white_onedodge2.ani"); } } //普通状态 else { local Step = ((MagicEnergyValue / 20).tointeger() + 1); if (Step > 5) Step = 5; Rindro_BaseToolClass.DrawAniEx(args[1], args[2], "etc/rindro/ancientrelic/ani/" + Step + "/particle1.ani"); } } } } //攻击判定回调 function OnAttack() { if (IsAncientRelic) { MagicEnergyValue++; if (MagicEnergyValue > 100) MagicEnergyValue = 100; } } //检测是否穿戴荒古装备 function CheckWear() { for (local i = 1; i< 13; ++i) { //编号 local Index = L_sq_GetCharacterAttribute(0x1c, i); if (Info.rawin(Index)) { DamageRate = Info[Index].NormalRate; MagicDamageRate = Info[Index].ExRate; IsAncientRelic = true; return; } } IsAncientRelic = false; } function MagicEnergyLogic(obj) { if (IsAncientRelic) { //魔能开启状态 if (MagicEnergyValue > 0) { if (MagicEnergyState) { //检测魔能变更时间 if (Clock() - MagicEnergyTimer >= 7000) { MagicEnergyTimer = Clock(); MagicEnergyStage++; //爆发结束 if (MagicEnergyStage > 2) { MagicEnergyState = false; MagicEnergyStage = 0; MagicEnergyValue = 0; sq_GetCNRDObjectToSQRCharacter(obj).sq_SendCreatePassiveObjectPacket(48883, 0, 0, 0, 0); } } } } } } function Proc(obj) { CheckWear(); //如果穿戴了荒古装备 if (IsAncientRelic) { MagicEnergyExplosion(obj); AdditionalAppendage(obj); MagicEnergyLogic(obj); } else { //是否有荒古装备 IsAncientRelic = false; //当前魔能积攒数值 MagicEnergyValue = 0; //当前魔能开启状态 MagicEnergyState = false; //魔能爆发阶段 MagicEnergyStage = 0; //魔能爆发计时器 MagicEnergyTimer = 0; //常规状态伤害增加率 DamageRate = 1.0; //魔能状态伤害增加率 MagicDamageRate = 1.0; } } } getroottable().rawdelete("CustomizeWeapon_AncientRelic_Obj"); function Lenheart_AncientRelic_Fun(obj) { local RootTab = getroottable(); if (!RootTab.rawin("CustomizeWeapon_AncientRelic_Obj")) { RootTab.rawset("CustomizeWeapon_AncientRelic_Obj", CustomizeWeapon_AncientRelic()); } else { RootTab["CustomizeWeapon_AncientRelic_Obj"].Proc(obj); } } function onAttackParent_appendage_AncientRelic(appendage, realAttacker, damager, boundingBox, isStuck) { if (!appendage) return; local RootTab = getroottable(); if (RootTab.rawin("CustomizeWeapon_AncientRelic_Obj")) { RootTab["CustomizeWeapon_AncientRelic_Obj"].OnAttack(); } } getroottable()["LenheartFuncTab"].rawset("AncientRelicFuncN", Lenheart_AncientRelic_Fun);