/* 文件名:AncientRelic.nut 路径:Project/CustomizeWeapon/AncientRelic.nut 创建日期:2025-12-04 14:22 文件用途: */ class CustomizeWeapon_AncientRelic { Info = null; //是否有荒古装备 IsAncientRelic = false; //当前荒古装备信息 CurrentAncientRelicInfo = null; //当前魔能积攒数值 MagicEnergyValue = 0; //当前魔能开启状态 MagicEnergyState = false; //魔能爆发阶段 MagicEnergyStage = 0; //魔能爆发计时器 MagicEnergyTimer = 0; //常规状态伤害增加率 DamageRate = 1.0; //魔能状态伤害增加率 MagicDamageRate = 1.0; EffectSetFlag = null; 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(); local DefaultMagicEnergyValue = Data.Get(); Info.rawset(Fbuf, { NormalRate = NormalRate.tofloat() / 100.0 + 1.0, ExRate = ExRate.tofloat() / 100.0 + 1.0, DefaultMagicEnergyValue = DefaultMagicEnergyValue.tointeger() }) } } } }); 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); if (CurrentAncientRelicInfo) { DamageRate = CurrentAncientRelicInfo.NormalRate; MagicDamageRate = CurrentAncientRelicInfo.ExRate; MagicEnergyValue = CurrentAncientRelicInfo.DefaultMagicEnergyValue; } //默认魔能值不为0的装备 if (MagicEnergyValue != 0) SetEffect(); } } } //魔能爆炸 function MagicEnergyExplosion(obj) { local OutbreakBool = obj.getMyPassiveObject(48882, 0); if (OutbreakBool && !MagicEnergyState && MagicEnergyValue >= 100) { EffectSetFlag = 7; 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 && !MagicEnergyState) { MagicEnergyValue++; SetEffect(); if (MagicEnergyValue > 100) MagicEnergyValue = 100; } } //设置魔能值与动画关联关系 function SetEffect() { if (MagicEnergyValue == 1) EffectSetFlag = 1; if (MagicEnergyValue == 20) EffectSetFlag = 2; if (MagicEnergyValue == 40) EffectSetFlag = 3; if (MagicEnergyValue == 60) EffectSetFlag = 4; if (MagicEnergyValue == 80) EffectSetFlag = 5; if (MagicEnergyValue == 100) EffectSetFlag = 6; } function AppendProc(appendage) { if (EffectSetFlag != null && EffectSetFlag <= 6 && !MagicEnergyState) { appendage.sq_DeleteEffectFront(); appendage.sq_AddEffectFront("etc/rindro/ancientrelic/ani/" + EffectSetFlag + "/particle1.ani"); EffectSetFlag = null; } else if (EffectSetFlag == 7) { appendage.sq_DeleteEffectFront(); appendage.sq_AddEffectFront("etc/rindro/ancientrelic/ani/open/01_red/red_onedodge2.ani"); EffectSetFlag = null; } else if (EffectSetFlag == 8) { appendage.sq_DeleteEffectFront(); appendage.sq_AddEffectFront("etc/rindro/ancientrelic/ani/open/02_yellow/yellow_onedodge2.ani"); EffectSetFlag = null; } else if (EffectSetFlag == 9) { appendage.sq_DeleteEffectFront(); appendage.sq_AddEffectFront("etc/rindro/ancientrelic/ani/open/03_white/white_onedodge2.ani"); EffectSetFlag = null; } else if (EffectSetFlag == 10) { appendage.sq_DeleteEffectFront(); EffectSetFlag = null; } } //检测是否穿戴荒古装备 function CheckWear() { for (local i = 1; i< 13; ++i) { //编号 local Index = L_sq_GetCharacterAttribute(0x1c, i); if (Info.rawin(Index)) { CurrentAncientRelicInfo = Info[Index]; IsAncientRelic = true; return; } } IsAncientRelic = false; } function MagicEnergyLogic(obj) { if (IsAncientRelic) { //魔能开启状态 if (MagicEnergyValue > 0) { if (MagicEnergyState) { //检测魔能变更时间 if (Clock() - MagicEnergyTimer >= 1000) { MagicEnergyTimer = Clock(); MagicEnergyStage++; EffectSetFlag = 7 + MagicEnergyStage; //爆发结束 if (MagicEnergyStage > 2) { MagicEnergyState = false; MagicEnergyStage = 0; MagicEnergyValue = 0; EffectSetFlag = 10; 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; //移除掉身上的AP local appendage = CNSquirrelAppendage.sq_GetAppendage(obj, "../etc/rindro/ancientrelic/ancientrelic.nut"); if (appendage) { CNSquirrelAppendage.sq_RemoveAppendage(obj, "../etc/rindro/ancientrelic/ancientrelic.nut"); } } } } 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(); } } function proc_appendage_ancient(appendage) { if (!appendage) return; local RootTab = getroottable(); if (RootTab.rawin("CustomizeWeapon_AncientRelic_Obj")) { RootTab["CustomizeWeapon_AncientRelic_Obj"].AppendProc(appendage); } } getroottable()["LenheartFuncTab"].rawset("AncientRelicFuncN", Lenheart_AncientRelic_Fun);