102 lines
3.3 KiB
Plaintext
102 lines
3.3 KiB
Plaintext
|
//::///////////////////////////////////////////////
|
||
|
//:: Regenerate Ring / Circle
|
||
|
//:: sp_regen_ring_circle.nss
|
||
|
//:: Jaysyn - PRC8 2025-08-01
|
||
|
//::
|
||
|
//:: Group fast healing aura spells
|
||
|
//::///////////////////////////////////////////////
|
||
|
#include "prc_inc_spells"
|
||
|
|
||
|
void main()
|
||
|
{
|
||
|
if (!X2PreSpellCastCode()) return;
|
||
|
|
||
|
PRCSetSchool(GetSpellSchool(PRCGetSpellId()));
|
||
|
|
||
|
object oCaster = OBJECT_SELF;
|
||
|
int nSpellId = PRCGetSpellId();
|
||
|
int nMetamagic = PRCGetMetaMagicFeat();
|
||
|
int nCasterLevel = PRCGetCasterLevel(oCaster);
|
||
|
int nDuration = 10 + (nCasterLevel / 2);
|
||
|
int nMaxTargets = nCasterLevel / 2;
|
||
|
float fMaxDistance = 30.0;
|
||
|
int nRegenRate = 1;
|
||
|
|
||
|
if (nSpellId == 9999)
|
||
|
{
|
||
|
nRegenRate = 3;
|
||
|
}
|
||
|
|
||
|
if (nMetamagic == METAMAGIC_EXTEND)
|
||
|
{
|
||
|
nDuration *= 2;
|
||
|
}
|
||
|
|
||
|
location lCaster = GetLocation(oCaster);
|
||
|
object oTarget = MyFirstObjectInShape(SHAPE_SPHERE, fMaxDistance, lCaster, FALSE, OBJECT_TYPE_CREATURE);
|
||
|
int nCount = 0;
|
||
|
|
||
|
while (GetIsObjectValid(oTarget) && nCount < nMaxTargets)
|
||
|
{
|
||
|
if (!GetIsEnemy(oCaster, oTarget) &&
|
||
|
GetRacialType(oTarget) != RACIAL_TYPE_UNDEAD &&
|
||
|
GetRacialType(oTarget) != RACIAL_TYPE_CONSTRUCT)
|
||
|
{
|
||
|
int nCurrentHP = GetCurrentHitPoints(oTarget);
|
||
|
int nInitialHP = GetLocalInt(oTarget, "INITIAL_HIT_POINTS");
|
||
|
|
||
|
if (nCurrentHP > nInitialHP)
|
||
|
{
|
||
|
nInitialHP = nCurrentHP;
|
||
|
SetLocalInt(oTarget, "INITIAL_HIT_POINTS", nInitialHP);
|
||
|
}
|
||
|
|
||
|
int nCurrentRegen = GetLocalInt(oTarget, "REGEN_RATE");
|
||
|
int nExistingDuration = 0;
|
||
|
int bSameSpell = FALSE;
|
||
|
|
||
|
effect e = GetFirstEffect(oTarget);
|
||
|
while (GetIsEffectValid(e))
|
||
|
{
|
||
|
if (GetEffectTag(e) == "REGEN_WOUNDS")
|
||
|
{
|
||
|
if (nCurrentRegen == nRegenRate)
|
||
|
{
|
||
|
bSameSpell = TRUE;
|
||
|
nExistingDuration = GetEffectDurationRemaining(e) / 6;
|
||
|
if (nRegenRate >= nCurrentRegen) RemoveEffect(oTarget, e);
|
||
|
else return;
|
||
|
}
|
||
|
else if (nRegenRate >= nCurrentRegen)
|
||
|
{
|
||
|
RemoveEffect(oTarget, e);
|
||
|
}
|
||
|
}
|
||
|
e = GetNextEffect(oTarget);
|
||
|
}
|
||
|
|
||
|
if (bSameSpell)
|
||
|
{
|
||
|
nDuration += nExistingDuration;
|
||
|
}
|
||
|
|
||
|
SetLocalInt(oTarget, "REGEN_RATE", nRegenRate);
|
||
|
SetLocalInt(oTarget, "REGEN_WOUNDS_REMAINING", nDuration);
|
||
|
|
||
|
effect eVis = EffectVisualEffect(1330/* VFX_DUR_BF_IOUN_STONE_GREEN */);
|
||
|
effect eRegen = EffectRunScript("rs_regen_wounds", "rs_regen_wounds", "rs_regen_wounds", 6.0f, IntToString(nRegenRate));
|
||
|
eRegen = SetEffectSpellId(eRegen, nSpellId);
|
||
|
eRegen = EffectLinkEffects(eVis, eRegen);
|
||
|
eRegen = TagEffect(eRegen, "REGEN_WOUNDS");
|
||
|
|
||
|
PRCRemoveEffectsFromSpell(oTarget, nSpellId);
|
||
|
|
||
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eRegen, oTarget, RoundsToSeconds(nDuration));
|
||
|
|
||
|
nCount++;
|
||
|
}
|
||
|
oTarget = MyNextObjectInShape(SHAPE_SPHERE, fMaxDistance, lCaster, FALSE, OBJECT_TYPE_CREATURE);
|
||
|
}
|
||
|
|
||
|
PRCSetSchool();
|
||
|
}
|