Rindro-Sqr/Project/CustomizeWeapon/AncientRelic/AncientRelic.nut

269 lines
9.8 KiB
Plaintext
Raw Permalink Normal View History

2025-12-04 21:50:29 +08:00
/*
文件名:AncientRelic.nut
路径:Project/CustomizeWeapon/AncientRelic.nut
创建日期:2025-12-04 14:22
文件用途:
*/
class CustomizeWeapon_AncientRelic {
Info = null;
//是否有荒古装备
IsAncientRelic = false;
2025-12-15 16:45:38 +08:00
//当前荒古装备信息
CurrentAncientRelicInfo = null;
2025-12-04 21:50:29 +08:00
//当前魔能积攒数值
MagicEnergyValue = 0;
//当前魔能开启状态
MagicEnergyState = false;
//魔能爆发阶段
MagicEnergyStage = 0;
//魔能爆发计时器
MagicEnergyTimer = 0;
//常规状态伤害增加率
DamageRate = 1.0;
//魔能状态伤害增加率
MagicDamageRate = 1.0;
2025-12-15 16:45:38 +08:00
EffectSetFlag = null;
2025-12-04 21:50:29 +08:00
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();
2025-12-15 16:45:38 +08:00
local DefaultMagicEnergyValue = Data.Get();
2025-12-04 21:50:29 +08:00
Info.rawset(Fbuf, {
NormalRate = NormalRate.tofloat() / 100.0 + 1.0,
2025-12-15 16:45:38 +08:00
ExRate = ExRate.tofloat() / 100.0 + 1.0,
DefaultMagicEnergyValue = DefaultMagicEnergyValue.tointeger()
2025-12-04 21:50:29 +08:00
})
}
}
}
});
RindroDamageRateChanageRideFunc.rawset("AncientRelic", function() {
return MagicEnergyState ? MagicDamageRate : DamageRate;
}.bindenv(this));
2025-12-15 16:45:38 +08:00
// DrawAppendCallBackFunc.rawset("AncientRelic", DrawEffect.bindenv(this));
2025-12-04 21:50:29 +08:00
// 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);
2025-12-15 16:45:38 +08:00
if (CurrentAncientRelicInfo) {
DamageRate = CurrentAncientRelicInfo.NormalRate;
MagicDamageRate = CurrentAncientRelicInfo.ExRate;
MagicEnergyValue = CurrentAncientRelicInfo.DefaultMagicEnergyValue;
}
//默认魔能值不为0的装备
if (MagicEnergyValue != 0) SetEffect();
2025-12-04 21:50:29 +08:00
}
}
}
//魔能爆炸
function MagicEnergyExplosion(obj) {
local OutbreakBool = obj.getMyPassiveObject(48882, 0);
2025-12-15 16:45:38 +08:00
if (OutbreakBool && !MagicEnergyState && MagicEnergyValue >= 100) {
EffectSetFlag = 7;
2025-12-04 21:50:29 +08:00
MagicEnergyState = true;
MagicEnergyTimer = Clock();
sq_SendDestroyPacketPassiveObject(OutbreakBool);
}
}
2025-12-15 16:45:38 +08:00
// //绘制魔能特效
// 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");
// }
2025-12-04 21:50:29 +08:00
2025-12-15 16:45:38 +08:00
// }
// }
// }
2025-12-04 21:50:29 +08:00
//攻击判定回调
function OnAttack() {
2025-12-15 16:45:38 +08:00
if (IsAncientRelic && !MagicEnergyState) {
2025-12-04 21:50:29 +08:00
MagicEnergyValue++;
2025-12-15 16:45:38 +08:00
SetEffect();
2025-12-04 21:50:29 +08:00
if (MagicEnergyValue > 100) MagicEnergyValue = 100;
}
}
2025-12-15 16:45:38 +08:00
//设置魔能值与动画关联关系
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;
}
}
2025-12-04 21:50:29 +08:00
//检测是否穿戴荒古装备
function CheckWear() {
for (local i = 1; i< 13; ++i) {
//编号
local Index = L_sq_GetCharacterAttribute(0x1c, i);
if (Info.rawin(Index)) {
2025-12-15 16:45:38 +08:00
CurrentAncientRelicInfo = Info[Index];
2025-12-04 21:50:29 +08:00
IsAncientRelic = true;
return;
}
}
IsAncientRelic = false;
}
function MagicEnergyLogic(obj) {
if (IsAncientRelic) {
//魔能开启状态
if (MagicEnergyValue > 0) {
if (MagicEnergyState) {
//检测魔能变更时间
2025-12-15 16:45:38 +08:00
if (Clock() - MagicEnergyTimer >= 1000) {
2025-12-04 21:50:29 +08:00
MagicEnergyTimer = Clock();
MagicEnergyStage++;
2025-12-15 16:45:38 +08:00
EffectSetFlag = 7 + MagicEnergyStage;
2025-12-04 21:50:29 +08:00
//爆发结束
if (MagicEnergyStage > 2) {
MagicEnergyState = false;
MagicEnergyStage = 0;
MagicEnergyValue = 0;
2025-12-15 16:45:38 +08:00
EffectSetFlag = 10;
2025-12-04 21:50:29 +08:00
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;
2025-12-15 16:45:38 +08:00
//移除掉身上的AP
local appendage = CNSquirrelAppendage.sq_GetAppendage(obj, "../etc/rindro/ancientrelic/ancientrelic.nut");
if (appendage) {
CNSquirrelAppendage.sq_RemoveAppendage(obj, "../etc/rindro/ancientrelic/ancientrelic.nut");
}
2025-12-04 21:50:29 +08:00
}
}
}
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();
}
}
2025-12-15 16:45:38 +08:00
function proc_appendage_ancient(appendage) {
if (!appendage) return;
local RootTab = getroottable();
if (RootTab.rawin("CustomizeWeapon_AncientRelic_Obj")) {
RootTab["CustomizeWeapon_AncientRelic_Obj"].AppendProc(appendage);
}
}
2025-12-04 21:50:29 +08:00
getroottable()["LenheartFuncTab"].rawset("AncientRelicFuncN", Lenheart_AncientRelic_Fun);