2025/08/15 Update

Added Verdant Lord PrC.
Added Create Infusion feat & crafting system.
Added Magical Artisan: Create Infusion feat.
Added Plant Defiance feat.
Added Plant Control feat.
Added Control Plants spell.
Added Forestfold spell.
Added Immunity from Elements spell.
Added Creeping Cold & Greater Creeping Cold spells.
Added Adrenaline Surge spell.
Added Mundane & Infused Herb baseitem types.
Added Mundane & Enchanted Scepter baseitem types.
Added EffectGazeImmunity() effect.
Added Botanical material type.
Created json library for summoning support.
Updated Plant Domain spells.
Fixed bug w/ Regen Circle.
Fixed weapon size bug with Enlarge & Reduce Person.
Fixed TMI bug in Swarm of Arrows (hopefully)
Fixed Blood in the Water.
Fixed Iron Soul / Master of Nine prereq bug.
Fixed Happo Zanshin to work more like PnP.
Fixed targeting bug w/ Ultrablast.
Fixed Ubiquitous Vision.
Fixed Magic Staves for small creatures.
Gave the summoned "treant" from Treebrother a Barkskin vfx.
Radial spells can now be scribed w/ Scribe Scroll.
Fixed Martial Stances not counting bug w/ levelup NUI (@Rakiov)
This commit is contained in:
Jaysyn904
2025-08-15 13:42:37 -04:00
parent dd67019103
commit 9c7b452b9a
3518 changed files with 50047 additions and 45886 deletions

View File

@@ -27,6 +27,9 @@
1734 - Turn_Blightspawned
2259 - turn outsider
3497 - Turn cold
25992 - FEAT_PLANT_DEFIANCE
25993 - FEAT_PLANT_CONTROL
*/
#include "prc_inc_clsfunc"
@@ -57,7 +60,7 @@ void main()
}
// Because Turn Undead/Outsider isn't from a domain, skip this check
if(nTurnType != SPELL_TURN_UNDEAD && nTurnType != SPELL_TURN_OUTSIDER)
if(nTurnType != SPELL_TURN_UNDEAD && nTurnType != SPELL_TURN_OUTSIDER && nTurnType != SPELL_PLANT_DEFIANCE && nTurnType != SPELL_PLANT_CONTROL)
{
// Used by the uses per day check code for bonus domains
if(!DecrementDomainUses(GetTurningDomain(nTurnType), OBJECT_SELF))
@@ -210,7 +213,37 @@ void main()
}
else
{
if(nTurnOrRebuke == ACTION_TURN)
if(nTurnOrRebuke == ACTION_TURN)
{
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_SUNSTRIKE), oTest);
// If target's HD < half level we would normally destroy.
// For plants targeted by Plant Defiance/Control, never destroy <20> apply non-lethal outcome instead.
if(nTargetHD < nLevel/2)
{
if(nTargetRace == RACIAL_TYPE_PLANT
&& (nTurnType == SPELL_PLANT_DEFIANCE || nTurnType == SPELL_PLANT_CONTROL))
{
// For Turn-type (Plant Defiance) -> DoTurn (fear)
// For Control-type (Plant Control) -> DoCommand (dominate)
if(nTurnType == SPELL_PLANT_DEFIANCE)
DelayCommand(0.0, DoTurn(oTest));
else
DelayCommand(0.0, DoCommand(oTest));
}
else
{
// Default: destroy
DelayCommand(0.0, DoDestroy(oTest));
}
}
else
{
DoTurn(oTest);
}
}
/* if(nTurnOrRebuke == ACTION_TURN)
{
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_SUNSTRIKE), oTest);
//if half of level, destroy
@@ -219,7 +252,7 @@ void main()
DelayCommand(0.0, DoDestroy(oTest));
else
DoTurn(oTest);
}
} */
else
{
bDisplayCommandMessage = TRUE;

View File

@@ -0,0 +1,117 @@
//:://////////////////////////////////////////////
//:: ;-. ,-. ,-. ,-.
//:: | ) | ) / ( )
//:: |-' |-< | ;-:
//:: | | \ \ ( )
//:: ' ' ' `-' `-'
//::///////////////////////////////////////////////
//::
/*
Adrenaline Surge
Transmutation
Level: Druid 2, Sor/Wiz 2
Components: V, S, DF
Casting Time: 1 action
Range: Close (25 ft. + 5 fr./2 levels)
Area: Your summoned creatures within a spherical
emanation with a radius equal to the range, centered on you
Duration: 1 round/level
Saving Throw: Will negates (harmless)
Spell Resistance: Yes (harmless)
Each of your summoned creatures within the area receives
a +4 enhancement bonus to Strength. This effect lasts until
the spell ends or the creature leaves the area.
*/
//::
//:://////////////////////////////////////////////
//:: Script: sp_adrenaline
//:: Author: Jaysyn
//:: Created: 2025-08-11 22:28:40
//:://////////////////////////////////////////////
#include "x2_inc_spellhook"
#include "prc_inc_spells"
// Helper function to remove the adrenaline surge effect from the target
void RemoveAdrenalineEffect(object oTarget)
{
if (!GetIsObjectValid(oTarget)) return;
effect e = GetFirstEffect(oTarget);
while (GetIsEffectValid(e))
{
effect eNext = GetNextEffect(oTarget);
if (GetEffectTag(e) == "ADRENALINE_SURGE")
RemoveEffect(oTarget, e);
e = eNext;
}
}
// Checks each second if the target has moved out of range
void CheckAdrenalineSurge(object oCaster, object oTarget, float fRange)
{
if (!GetIsObjectValid(oTarget) || !GetIsObjectValid(oCaster))
return;
// If out of range, remove the effect early
if (GetDistanceBetween(oTarget, oCaster) > fRange)
{
RemoveAdrenalineEffect(oTarget);
return;
}
// Still valid <20> check again in 1 second
DelayCommand(1.0, CheckAdrenalineSurge(oCaster, oTarget, fRange));
}
void main()
{
object oCaster = OBJECT_SELF;
int nCasterLevel = PRCGetCasterLevel(oCaster);
float fRange = 25.0 + (5.0 * IntToFloat(nCasterLevel / 2));
float fDuration = IntToFloat(nCasterLevel) * 6.0; // in seconds
location lCaster = GetLocation(oCaster);
object oTarget = MyFirstObjectInShape(SHAPE_SPHERE, fRange, lCaster, TRUE, OBJECT_TYPE_CREATURE);
while (GetIsObjectValid(oTarget))
{
// Only apply to summons of this caster
if (GetMaster(oTarget) == oCaster)
{
// Prevent stacking <20> skip if already has the effect
int bHas = FALSE;
effect eCheck = GetFirstEffect(oTarget);
while (GetIsEffectValid(eCheck))
{
if (GetEffectTag(eCheck) == "ADRENALINE_SURGE")
{
bHas = TRUE;
break;
}
eCheck = GetNextEffect(oTarget);
}
if (!bHas)
{
effect eStr = EffectAbilityIncrease(ABILITY_STRENGTH, 4);
eStr = TagEffect(eStr, "ADRENALINE_SURGE");
effect eVis = EffectVisualEffect(VFX_IMP_HASTE);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eVis, oTarget, 3.0);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eStr, oTarget);
// Schedule effect removal after the full duration
DelayCommand(fDuration, RemoveAdrenalineEffect(oTarget));
// Start periodic range check
DelayCommand(1.0, CheckAdrenalineSurge(oCaster, oTarget, fRange));
}
}
oTarget = MyNextObjectInShape(SHAPE_SPHERE, fRange, lCaster, TRUE, OBJECT_TYPE_CREATURE);
}
}

View File

@@ -95,6 +95,10 @@ void main()
//Restore original max henchmen
SetMaxHenchmen(nMax);
}
else
{
FloatingTextStringOnCreature("You must have celestial blood to cast this spell", oPC);
}
PRCSetSchool();
//SPGoodShift(oPC);

View File

@@ -0,0 +1,134 @@
//::////////////////////////////////////////////////////////
//::
//:: Creeping Cold & Greater Creeping Cold
//:: sp_creepingcold.nss
//:
//::////////////////////////////////////////////////////////
//::
/*
Creeping Cold
Transmutation [Cold]
Level: Drd 2
Components: V, S, F
Casting Time: 1 action
Range: Close (25 ft. + 5 ft./2 levels)
Target: One creature
Duration: 3 rounds
Saving Throw: Fortitude half
Spell Resistance: Yes
You turn the subject<63>s sweat to ice, creating blisters as
ice forms on and inside the skin. The spell deals 1d6 cumulative
points of cold damage per round it is in effect (that is, 1d6
on the 1st round, 2d6 on the second, and 3d6 on the third).
Only one save is allowed against the spell; if successful,
it halves the damage each round.
Focus: A small glass or pottery vessel worth at least 25
gp filled with ice, snow, or water.
Greater Creeping Cold
Transmutation [Cold]
Level: Drd 7
Duration: See text
This spell is the same as creeping cold, but it adds a fourth
round to the duration, during which it deals 4d6 points
of damage, if the caster is at least 15th level, it adds a fifth
round at 5d6 points of damage. If the caster is at least
20th level, it adds a sixth round at 6d6 points of damage
*/
//::
//::////////////////////////////////////////////////////////
//::
//:: Created By: Jaysyn
//:: Created on: 2025-08-07 00:18:04
//::
//::////////////////////////////////////////////////////////
#include "x2_inc_spellhook"
void ApplyCreepingColdDamage(object oTarget, object oCaster, int nSpellID, int nMetaMagic, int nRound, int nMaxRounds, int nMaxDice, int nSave, int nEleDmg);
void main()
{
if (!X2PreSpellCastCode()) return;
int nSpellID = PRCGetSpellId();
object oCaster = OBJECT_SELF;
object oTarget = PRCGetSpellTargetObject();
int nMetaMagic = PRCGetMetaMagicFeat();
int nCL = PRCGetCasterLevel(oCaster);
nCL += SPGetPenetr();
int nMaxRounds = 3;
int nMaxDice = 3;
if (nSpellID == SPELL_GREATER_CREEPING_COLD)
{
nMaxRounds = 4;
if (nCL >= 15) nMaxRounds = 5;
if (nCL >= 20) nMaxRounds = 6;
nMaxDice = nMaxRounds; // capped at 6
}
// Extend doubles duration but not damage cap
if (nMetaMagic & METAMAGIC_EXTEND)
nMaxRounds *= 2;
int nEleDmg = ChangedElementalDamage(oCaster, DAMAGE_TYPE_COLD);
if (!GetIsReactionTypeFriendly(oTarget, oCaster))
{
SignalEvent(oTarget, EventSpellCastAt(oCaster, nSpellID));
if (PRCDoResistSpell(oCaster, oTarget, nCL))
{
effect eFail = EffectVisualEffect(VFX_IMP_MAGIC_RESISTANCE_USE);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eFail, oTarget);
return;
}
int nDC = PRCGetSpellSaveDC(nSpellID, SPELL_SCHOOL_TRANSMUTATION, oCaster);
int nSave = PRCMySavingThrow(SAVING_THROW_FORT, oTarget, nDC, SAVING_THROW_TYPE_COLD, oCaster);
effect eVis = ExtraordinaryEffect(EffectVisualEffect(VFX_DUR_ICESKIN));
effect eCold = ExtraordinaryEffect(EffectVisualEffect(VFX_IMP_FROST_L));
ApplyEffectToObject(DURATION_TYPE_INSTANT, eCold, oTarget);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eVis, oTarget, RoundsToSeconds(nMaxRounds));
DelayCommand(0.0f, ApplyCreepingColdDamage(oTarget, oCaster, nSpellID, nMetaMagic, 1, nMaxRounds, nMaxDice, nSave, nEleDmg));
}
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_FROST_L), oTarget);
PRCSetSchool(SPELL_SCHOOL_TRANSMUTATION);
}
void ApplyCreepingColdDamage(object oTarget, object oCaster, int nSpellID, int nMetaMagic, int nRound, int nMaxRounds, int nMaxDice, int nSave, int nEleDmg)
{
if (GetIsDead(oTarget)) return;
int nDice = nRound;
if (nDice > nMaxDice)
nDice = nMaxDice;
int nDamage = d6(nDice);
if (nMetaMagic & METAMAGIC_MAXIMIZE)
nDamage = nDice * 6;
else if (nMetaMagic & METAMAGIC_EMPOWER)
nDamage += nDamage / 2;
nDamage += SpellDamagePerDice(oCaster, nDice);
if (nSave == FALSE)
nDamage /= 2;
effect eVFX = EffectVisualEffect(VFX_IMP_FROST_S);
effect eDmg = PRCEffectDamage(oTarget, nDamage, nEleDmg);
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectLinkEffects(eVFX, eDmg), oTarget);
if (nRound < nMaxRounds)
{
DelayCommand(6.0f, ApplyCreepingColdDamage(oTarget, oCaster, nSpellID, nMetaMagic, nRound + 1, nMaxRounds, nMaxDice, nSave, nEleDmg));
}
}

View File

@@ -0,0 +1,119 @@
//:://////////////////////////////////////////////
//:: ;-. ,-. ,-. ,-.
//:: | ) | ) / ( )
//:: |-' |-< | ;-:
//:: | | \ \ ( )
//:: ' ' ' `-' `-'
//:://////////////////////////////////////////////
//::
/*
Control Plants
Transmutation
Level: Drd 8, Plant 8
Components: V, S, DF
Casting Time: 1 standard action
Range: Close (25 ft. + 5 ft./2 levels)
Targets: Up to 2 HD/level of plant creatures,
no two of which can be more than 30 ft.
apart
Duration: 1 min./level
Saving Throw: Will negates
Spell Resistance: No
This spell enables you to control the actions of one
or more plant creatures for a short period of time. You
command the creatures by voice and they understand you,
no matter what language you speak. Even if vocal
communication is impossible the controlled plants do
not attack you. At the end of the spell, the subjects
revert to their normal behavior.
Suicidal or self-destructive commands are simply ignored.
*/
//::
//:://////////////////////////////////////////////
//:: Script: sp_ctrl_plants
//:: Author: Jaysyn
//:: Created: 2025-08-11 22:28:40
//:://////////////////////////////////////////////
#include "prc_inc_spells"
#include "prc_add_spell_dc"
void main()
{
DeleteLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR");
SetLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR", SPELL_SCHOOL_TRANSMUTATION);
if (!X2PreSpellCastCode())
return;
int nMetaMagic = PRCGetMetaMagicFeat();
int CasterLvl = PRCGetCasterLevel(OBJECT_SELF);
if (GetLevelByClass(CLASS_TYPE_VERDANT_LORD, OBJECT_SELF) >= 4)
{
CasterLvl = CasterLvl + 3;
}
int nDuration = CasterLvl; // minutes
int nHDLimit = CasterLvl * 2; // RAW
if (nMetaMagic & METAMAGIC_EXTEND)
nDuration *= 2;
int nPenetr = CasterLvl + SPGetPenetr();
// Close range in NWN terms: 25 ft. + 5 ft./2 levels
float fMaxRange = 25.0 + (IntToFloat(CasterLvl / 2) * 5.0);
object oTarget = PRCGetSpellTargetObject();
location lTarget = GetLocation(oTarget);
object oCreature = GetFirstObjectInShape(SHAPE_SPHERE, fMaxRange, lTarget, TRUE);
while (GetIsObjectValid(oCreature) && nHDLimit > 0)
{
if (MyPRCGetRacialType(oCreature) == RACIAL_TYPE_PLANT
&& !GetIsReactionTypeFriendly(oCreature)
&& GetDistanceBetweenLocations(lTarget, GetLocation(oCreature)) <= 30.0
&& GetHitDice(oCreature) <= nHDLimit)
{
// Fire cast spell at event for the specified target
SignalEvent(oCreature, EventSpellCastAt(OBJECT_SELF, SPELL_CONTROL_PLANTS));
if (!PRCDoResistSpell(OBJECT_SELF, oCreature, nPenetr))
{
if (!PRCMySavingThrow(SAVING_THROW_WILL, oCreature, PRCGetSaveDC(oCreature, OBJECT_SELF),
SAVING_THROW_TYPE_NONE, OBJECT_SELF, 1.0))
{
// Remove old domination if present
effect eCheck = GetFirstEffect(oCreature);
while (GetIsEffectValid(eCheck))
{
int nType = GetEffectType(eCheck);
if (nType == EFFECT_TYPE_DOMINATED || nType == EFFECT_TYPE_CUTSCENE_DOMINATED)
RemoveEffect(oCreature, eCheck);
eCheck = GetNextEffect(oCreature);
}
// Apply domination
effect eControl = EffectCutsceneDominated();
effect eMind = EffectVisualEffect(VFX_DUR_MIND_AFFECTING_DOMINATED);
effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE);
effect eVis = EffectVisualEffect(VFX_IMP_DOMINATE_S);
effect eLink = EffectLinkEffects(eMind, eControl);
eLink = EffectLinkEffects(eLink, eDur);
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oCreature);
DelayCommand(1.0, SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oCreature,
MinutesToSeconds(nDuration), TRUE, -1, CasterLvl));
nHDLimit -= GetHitDice(oCreature);
}
}
}
oCreature = GetNextObjectInShape(SHAPE_SPHERE, fMaxRange, lTarget, TRUE);
}
DeleteLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR");
}

View File

@@ -167,7 +167,7 @@ void main()
eLink = EffectLinkEffects(eLink, EffectAbilityDecrease(ABILITY_DEXTERITY, 2));
eLink = EffectLinkEffects(eLink, EffectAbilityIncrease(ABILITY_STRENGTH, 2));
eLink = EffectLinkEffects(eLink, EffectACDecrease(1));
eLink = EffectLinkEffects(eLink, EffectBonusFeat(FEAT_SIZE_INCREASE_1));
//eLink = EffectLinkEffects(eLink, EffectBonusFeat(FEAT_SIZE_INCREASE_1));
eLink = TagEffect(eLink, "ARCANE_SIZE_INCREASE");
}
else
@@ -176,7 +176,7 @@ void main()
eLink = EffectLinkEffects(eLink, EffectAbilityIncrease(ABILITY_DEXTERITY, 2));
eLink = EffectLinkEffects(eLink, EffectAbilityDecrease(ABILITY_STRENGTH, 2));
eLink = EffectLinkEffects(eLink, EffectACIncrease(1));
eLink = EffectLinkEffects(eLink, EffectBonusFeat(FEAT_SIZE_DECREASE_1));
//eLink = EffectLinkEffects(eLink, EffectBonusFeat(FEAT_SIZE_DECREASE_1));
eLink = TagEffect(eLink, "ARCANE_SIZE_DECREASE");
}

View File

@@ -0,0 +1,79 @@
//::///////////////////////////////////////////////
//::
//:: Forestfold
//:: sp_forestfold.nss
//::
//:://////////////////////////////////////////////
/*
Caster Level(s): Druid 4, Ranger 3
School: Transmutation
Component(s): Verbal, Somatic
Range: Personal
Area of Effect / Target: Caster
Duration: 10 turns / level
Additional Counter Spells:
Save: None
Spell Resistance: No
The caster's movement is muffled & their coloring
changes to match their surroundings, gaining a +20
competence bonus to any Hide and Move Silently
checks.
*/
//:://////////////////////////////////////////////
//::
//:: Created By: Jaysyn
//:: Created On: 2025-08-06 12:24:24
//::
//:://////////////////////////////////////////////
#include "prc_inc_spells"
#include "prc_add_spell_dc"
void PRCDoForestfold(object oPC)
{
//Declare major variables
effect eVis = EffectVisualEffect(VFX_IMP_IMPROVE_ABILITY_SCORE);
int nMetaMagic = PRCGetMetaMagicFeat();
effect eHide = EffectSkillIncrease(SKILL_HIDE, 20);
effect eMS = EffectSkillIncrease(SKILL_MOVE_SILENTLY, 20);
effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_POSITIVE);
effect eLink = EffectLinkEffects(eHide, eDur);
eLink = EffectLinkEffects(eLink, eMS);
int nDuration = 10*PRCGetCasterLevel(oPC); // * Duration 10 turn/level
if (nMetaMagic & METAMAGIC_EXTEND) //Duration is +100%
{
nDuration = nDuration * 2;
}
//Fire spell cast at event for target
SignalEvent(oPC, EventSpellCastAt(oPC, SPELL_FORESTFOLD, FALSE));
//Apply VFX impact and bonus effects
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oPC);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oPC, TurnsToSeconds(nDuration));
}
void main()
{
object oPC = OBJECT_SELF;
DeleteLocalInt(oPC, "X2_L_LAST_SPELLSCHOOL_VAR");
SetLocalInt(oPC, "X2_L_LAST_SPELLSCHOOL_VAR", SPELL_SCHOOL_TRANSMUTATION);
// If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell
if (!X2PreSpellCastCode()) { return; }
// No stacking
PRCRemoveEffectsFromSpell(oPC, SPELL_FORESTFOLD);
// End of Spell Cast Hook
PRCDoForestfold(oPC);
// Erasing the variable used to store the spell's spell school
DeleteLocalInt(oPC, "X2_L_LAST_SPELLSCHOOL_VAR");
}

View File

@@ -0,0 +1,122 @@
//:://////////////////////////////////////////////
//:: ;-. ,-. ,-. ,-.
//:: | ) | ) / ( )
//:: |-' |-< | ;-:
//:: | | \ \ ( )
//:: ' ' ' `-' `-'
//:://////////////////////////////////////////////
//::
/*
Invulnerability to Elements
Abjuration
Level: Druid 9
Components: V, S, DF
Casting Time: 1 action
Range: Touch
Target: Creature touched
Duration: 10 minutes/level
Saving Throw: None
Spell Resistance: Yes
As protection from all elements, but the target creature
becomes immune to damage from acid, cold, electricity,
fire, and sonic damage while the spell is in effect.
*/
//::
//:://////////////////////////////////////////////
//:: Script: sp_inv_elements
//:: Author: Jaysyn
//:: Created: 2025-08-11 22:28:40
//:://////////////////////////////////////////////
#include "prc_sp_func"
// Implements the spell impact
int DoSpell(object oCaster, object oTarget, int nCasterLevel, int nEvent)
{
int nSpellID = PRCGetSpellId();
int nMetaMagic = PRCGetMetaMagicFeat();
float fDuration = MinutesToSeconds(10 * nCasterLevel); // 10 min/level
// Extend Spell metamagic check
if (nMetaMagic & METAMAGIC_EXTEND)
fDuration *= 2.0;
// Fire spell cast at event
SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, nSpellID, FALSE));
// Remove old versions
PRCRemoveEffectsFromSpell(oTarget, nSpellID);
// Visual Effects
effect eDur = EffectVisualEffect(VFX_DUR_PROTECTION_ELEMENTS);
effect eVis = EffectVisualEffect(VFX_IMP_ELEMENTAL_PROTECTION);
effect eDur2 = EffectVisualEffect(VFX_DUR_CESSATE_POSITIVE);
// Immunities
effect eImmAcid = EffectDamageImmunityIncrease(DAMAGE_TYPE_ACID, 100);
effect eImmCold = EffectDamageImmunityIncrease(DAMAGE_TYPE_COLD, 100);
effect eImmElec = EffectDamageImmunityIncrease(DAMAGE_TYPE_ELECTRICAL, 100);
effect eImmFire = EffectDamageImmunityIncrease(DAMAGE_TYPE_FIRE, 100);
effect eImmSonic = EffectDamageImmunityIncrease(DAMAGE_TYPE_SONIC, 100);
// Tag everything for possible later use
eImmAcid = TagEffect(eImmAcid, "invuln_elements");
eImmCold = TagEffect(eImmCold, "invuln_elements");
eImmElec = TagEffect(eImmElec, "invuln_elements");
eImmFire = TagEffect(eImmFire, "invuln_elements");
eImmSonic = TagEffect(eImmSonic, "invuln_elements");
eDur = TagEffect(eDur, "invuln_elements");
eDur2 = TagEffect(eDur2, "invuln_elements");
// Link Effects
effect eLink = EffectLinkEffects(eImmAcid, eImmCold);
eLink = EffectLinkEffects(eLink, eImmElec);
eLink = EffectLinkEffects(eLink, eImmFire);
eLink = EffectLinkEffects(eLink, eImmSonic);
eLink = EffectLinkEffects(eLink, eDur);
eLink = EffectLinkEffects(eLink, eDur2);
// Apply immunity effects
SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, fDuration, TRUE, -1, nCasterLevel);
// Instant cast VFX
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget);
return TRUE;
}
void main()
{
object oCaster = OBJECT_SELF;
int nCasterLevel = PRCGetCasterLevel(oCaster);
PRCSetSchool(GetSpellSchool(PRCGetSpellId()));
if (!X2PreSpellCastCode()) return;
object oTarget = PRCGetSpellTargetObject();
int nEvent = GetLocalInt(oCaster, PRC_SPELL_EVENT);
if (!nEvent) // Normal cast
{
if (GetLocalInt(oCaster, PRC_SPELL_HOLD) && oCaster == oTarget)
{
SetLocalSpellVariables(oCaster, 1); // Hold the charge
return;
}
DoSpell(oCaster, oTarget, nCasterLevel, nEvent);
}
else
{
if (nEvent & PRC_SPELL_EVENT_ATTACK)
{
if (DoSpell(oCaster, oTarget, nCasterLevel, nEvent))
DecrementSpellCharges(oCaster);
}
}
PRCSetSchool();
}

View File

@@ -22,7 +22,7 @@ void main()
float fMaxDistance = 30.0;
int nRegenRate = 1;
if (nSpellId == 9999)
if (nSpellId == SPELL_REGEN_CIRCLE)
{
nRegenRate = 3;
}

View File

@@ -39,6 +39,9 @@ dead after being hit by a fireball).
//:://////////////////////////////////////////////
//:: Created By: Stratovarius
//:: Created On: August 20, 2004
//::
//:: Fixed By: Jaysyn
//:: Fixed On: July 24, 2025
//:://////////////////////////////////////////////
#include "nw_inc_gff"
#include "prc_inc_spells"
@@ -111,8 +114,7 @@ void StartMirrorImageTracking(object oSummoned, object oMaster)
}
void SetMirrorImageScripts(object oImage)
{
{
string sTag = GetTag(oImage);
if(DEBUG) DoDebug("sp_mirror >> SetMirrorImageScripts: Setting OnSpellCastAt script on "+ sTag +".");

View File

@@ -43,279 +43,279 @@ void main()
case SPELL_SUMMON_NATURES_ALLY_1_DIREBADGER:
{
sSummon = "nw_s_badgerdire";
nVFX = VFX_FNF_SUMMON_MONSTER_1;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
case SPELL_SUMMON_NATURES_ALLY_1_DIRERAT:
{
sSummon = "prc_s_direrat001";
nVFX = VFX_FNF_SUMMON_MONSTER_1;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
case SPELL_SUMMON_NATURES_ALLY_1_DOG:
{
sSummon = "prc_s_dog001";
nVFX = VFX_FNF_SUMMON_MONSTER_1;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
case SPELL_SUMMON_NATURES_ALLY_1_HAWK:
{
sSummon = "prc_s_hawk001";
nVFX = VFX_FNF_SUMMON_MONSTER_1;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
case SPELL_SUMMON_NATURES_ALLY_1_TINY_VIPER:
{
sSummon = "prc_s_tnviper001";
nVFX = VFX_FNF_SUMMON_MONSTER_1;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
//:: Summon Nature's Ally 2
case SPELL_SUMMON_NATURES_ALLY_2_DIREBOAR:
{
sSummon = "nw_s_boardire";
nVFX = VFX_FNF_SUMMON_MONSTER_1;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
case SPELL_SUMMON_NATURES_ALLY_2_COOSHEE:
{
sSummon = "prc_s_cooshee001";
nVFX = VFX_FNF_SUMMON_MONSTER_1;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
case SPELL_SUMMON_NATURES_ALLY_2_WOLF:
{
sSummon = "prc_s_wolf001";
nVFX = VFX_FNF_SUMMON_MONSTER_1;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
case SPELL_SUMMON_NATURES_ALLY_2_SMALL_VIPER:
{
sSummon = "prc_s_smviper001";
nVFX = VFX_FNF_SUMMON_MONSTER_1;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
case SPELL_SUMMON_NATURES_ALLY_2_BLACKBEAR:
{
sSummon = "prc_s_blkbear001";
nVFX = VFX_FNF_SUMMON_MONSTER_1;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
//:: Summon Nature's Ally 3
case SPELL_SUMMON_NATURES_ALLY_3_BROWNBEAR:
{
sSummon = "prc_s_brnbear001";
nVFX = VFX_FNF_SUMMON_MONSTER_1;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
case SPELL_SUMMON_NATURES_ALLY_3_DIREWOLK:
{
sSummon = "nw_s_wolfdire";
nVFX = VFX_FNF_SUMMON_MONSTER_1;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
case SPELL_SUMMON_NATURES_ALLY_3_LARGE_VIPER:
{
sSummon = "prc_s_lgviper001";
nVFX = VFX_FNF_SUMMON_MONSTER_1;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
case SPELL_SUMMON_NATURES_ALLY_3_LEOPARD:
{
sSummon = "prc_s_leopard001";
nVFX = VFX_FNF_SUMMON_MONSTER_1;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
case SPELL_SUMMON_NATURES_ALLY_3_SATYR:
{
sSummon = "prc_s_satyr001";
nVFX = VFX_FNF_SUMMON_MONSTER_1;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
//:: Summon Nature's Ally 4
case SPELL_SUMMON_NATURES_ALLY_4_LION:
{
sSummon = "prc_s_lion001";
nVFX = VFX_FNF_SUMMON_MONSTER_2;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
case SPELL_SUMMON_NATURES_ALLY_4_POLAR_BEAR:
{
sSummon = "prc_s_plrbear001";
nVFX = VFX_FNF_SUMMON_MONSTER_2;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
case SPELL_SUMMON_NATURES_ALLY_4_DIRE_SPIDER:
{
sSummon = "nw_s_spiddire";
nVFX = VFX_FNF_SUMMON_MONSTER_2;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
case SPELL_SUMMON_NATURES_ALLY_4_HUGE_VIPER:
{
sSummon = "prc_s_hgviper001";
nVFX = VFX_FNF_SUMMON_MONSTER_2;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
case SPELL_SUMMON_NATURES_ALLY_4_WEREBOAR:
{
sSummon = "prc_s_wrboar001";
nVFX = VFX_FNF_SUMMON_MONSTER_2;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
//:: Summon Nature's Ally 5
case SPELL_SUMMON_NATURES_ALLY_5_MED_AIR:
{
sSummon = "x1_s_airsmall";
nVFX = VFX_FNF_SUMMON_MONSTER_2;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
case SPELL_SUMMON_NATURES_ALLY_5_MED_EARTH:
{
sSummon = "x1_s_earthsmall";
nVFX = VFX_FNF_SUMMON_MONSTER_2;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
case SPELL_SUMMON_NATURES_ALLY_5_MED_FIRE:
{
sSummon = "x1_s_firesmall";
nVFX = VFX_FNF_SUMMON_MONSTER_2;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
case SPELL_SUMMON_NATURES_ALLY_5_MED_WATER:
{
sSummon = "x1_s_watersmall";
nVFX = VFX_FNF_SUMMON_MONSTER_2;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
case SPELL_SUMMON_NATURES_ALLY_5_DIRE_BEAR:
{
sSummon = "nw_s_beardire";
nVFX = VFX_FNF_SUMMON_MONSTER_2;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
//:: Summon Nature's Ally 6
case SPELL_SUMMON_NATURES_ALLY_6_LG_AIR:
{
sSummon = "prc_s_airlarge";
nVFX = VFX_FNF_SUMMON_MONSTER_2;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
case SPELL_SUMMON_NATURES_ALLY_6_LG_EARTH:
{
sSummon = "prc_s_earthlarge";
nVFX = VFX_FNF_SUMMON_MONSTER_2;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
case SPELL_SUMMON_NATURES_ALLY_6_LG_FIRE:
{
sSummon = "prc_s_firelarge";
nVFX = VFX_FNF_SUMMON_MONSTER_2;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
case SPELL_SUMMON_NATURES_ALLY_6_LG_WATER:
{
sSummon = "prc_s_waterlarge";
nVFX = VFX_FNF_SUMMON_MONSTER_2;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
case SPELL_SUMMON_NATURES_ALLY_6_DIRETIGER:
{
sSummon = "nw_s_diretiger";
nVFX = VFX_FNF_SUMMON_MONSTER_2;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
//:: Summon Nature's Ally 7
case SPELL_SUMMON_NATURES_ALLY_7_BULETTE:
{
sSummon = "prc_s_bueltte001";
nVFX = VFX_FNF_SUMMON_MONSTER_3;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
case SPELL_SUMMON_NATURES_ALLY_7_INVSTALKER:
{
sSummon = "prc_s_invstlk001";
nVFX = VFX_FNF_SUMMON_MONSTER_3;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
case SPELL_SUMMON_NATURES_ALLY_7_PIXIE:
{
sSummon = "prc_s_pixie001";
nVFX = VFX_FNF_SUMMON_MONSTER_3;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
case SPELL_SUMMON_NATURES_ALLY_7_GORGON:
{
sSummon = "prc_s_gorgon001";
nVFX = VFX_FNF_SUMMON_MONSTER_3;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
case SPELL_SUMMON_NATURES_ALLY_7_MANTICORE:
{
sSummon = "prc_s_mntcore001";
nVFX = VFX_FNF_SUMMON_MONSTER_3;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
//:: Summon Nature's Ally 8
case SPELL_SUMMON_NATURES_ALLY_8_GR_AIR:
{
sSummon = "nw_s_airgreat";
nVFX = VFX_FNF_SUMMON_MONSTER_3;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
case SPELL_SUMMON_NATURES_ALLY_8_GR_EARTH:
{
sSummon = "nw_s_earthgreat";
nVFX = VFX_FNF_SUMMON_MONSTER_3;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
case SPELL_SUMMON_NATURES_ALLY_8_GR_FIRE:
{
sSummon = "nw_s_firegreat";
nVFX = VFX_FNF_SUMMON_MONSTER_3;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
case SPELL_SUMMON_NATURES_ALLY_8_GR_WATER:
{
sSummon = "nw_s_watergreat";
nVFX = VFX_FNF_SUMMON_MONSTER_3;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
case SPELL_SUMMON_NATURES_ALLY_8_NYMPH:
{
sSummon = "prc_s_nymph001";
nVFX = VFX_FNF_SUMMON_MONSTER_3;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
//:: Summon Nature's Ally 9
case SPELL_SUMMON_NATURES_ALLY_9_ELD_AIR:
{
sSummon = "nw_s_airelder";
nVFX = VFX_FNF_SUMMON_MONSTER_3;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
case SPELL_SUMMON_NATURES_ALLY_9_ELD_EARTH:
{
sSummon = "nw_s_earthelder";
nVFX = VFX_FNF_SUMMON_MONSTER_3;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
case SPELL_SUMMON_NATURES_ALLY_9_ELD_FIRE:
{
sSummon = "nw_s_fireelder";
nVFX = VFX_FNF_SUMMON_MONSTER_3;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
case SPELL_SUMMON_NATURES_ALLY_9_ELD_WATER:
{
sSummon = "nw_s_waterelder";
nVFX = VFX_FNF_SUMMON_MONSTER_3;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
case SPELL_SUMMON_NATURES_ALLY_9_ARANEA:
{
sSummon = "prc_s_aranea001";
nVFX = VFX_FNF_SUMMON_MONSTER_3;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
}
@@ -346,31 +346,31 @@ void main()
case 1:
{
sSummon = "nw_s_badgerdire";
nVFX = VFX_FNF_SUMMON_MONSTER_1;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
case 2:
{
sSummon = "prc_s_direrat001";
nVFX = VFX_FNF_SUMMON_MONSTER_1;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
case 3:
{
sSummon = "prc_s_dog001";
nVFX = VFX_FNF_SUMMON_MONSTER_1;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
case 4:
{
sSummon = "prc_s_hawk001";
nVFX = VFX_FNF_SUMMON_MONSTER_1;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
case 5:
{
sSummon = "prc_s_tnviper001";
nVFX = VFX_FNF_SUMMON_MONSTER_1;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
}
@@ -384,31 +384,31 @@ void main()
case 1:
{
sSummon = "nw_s_boardire";
nVFX = VFX_FNF_SUMMON_MONSTER_1;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
case 2:
{
sSummon = "prc_s_cooshee001";
nVFX = VFX_FNF_SUMMON_MONSTER_1;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
case 3:
{
sSummon = "prc_s_wolf001";
nVFX = VFX_FNF_SUMMON_MONSTER_1;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
case 4:
{
sSummon = "prc_s_smviper001";
nVFX = VFX_FNF_SUMMON_MONSTER_1;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
case 5:
{
sSummon = "prc_s_blkbear001";
nVFX = VFX_FNF_SUMMON_MONSTER_1;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
}
@@ -422,31 +422,31 @@ void main()
case 1:
{
sSummon = "prc_s_brnbear001";
nVFX = VFX_FNF_SUMMON_MONSTER_1;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
case 2:
{
sSummon = "nw_s_wolfdire";
nVFX = VFX_FNF_SUMMON_MONSTER_1;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
case 3:
{
sSummon = "prc_s_lgviper001";
nVFX = VFX_FNF_SUMMON_MONSTER_1;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
case 4:
{
sSummon = "prc_s_leopard001";
nVFX = VFX_FNF_SUMMON_MONSTER_1;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
case 5:
{
sSummon = "prc_s_satyr001";
nVFX = VFX_FNF_SUMMON_MONSTER_1;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
}
@@ -460,31 +460,31 @@ void main()
case 1:
{
sSummon = "prc_s_lion001";
nVFX = VFX_FNF_SUMMON_MONSTER_2;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
case 2:
{
sSummon = "prc_s_plrbear001";
nVFX = VFX_FNF_SUMMON_MONSTER_2;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
case 3:
{
sSummon = "nw_s_spiddire";
nVFX = VFX_FNF_SUMMON_MONSTER_2;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
case 4:
{
sSummon = "prc_s_hgviper001";
nVFX = VFX_FNF_SUMMON_MONSTER_2;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
case 5:
{
sSummon = "prc_s_wrboar001";
nVFX = VFX_FNF_SUMMON_MONSTER_2;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
}
@@ -498,31 +498,31 @@ void main()
case 1:
{
sSummon = "x1_s_airsmall";
nVFX = VFX_FNF_SUMMON_MONSTER_2;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
case 2:
{
sSummon = "x1_s_earthsmall";
nVFX = VFX_FNF_SUMMON_MONSTER_2;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
case 3:
{
sSummon = "x1_s_firesmall";
nVFX = VFX_FNF_SUMMON_MONSTER_2;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
case 4:
{
sSummon = "x1_s_watersmall";
nVFX = VFX_FNF_SUMMON_MONSTER_2;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
case 5:
{
sSummon = "nw_s_beardire";
nVFX = VFX_FNF_SUMMON_MONSTER_2;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
}
@@ -536,31 +536,31 @@ void main()
case 1:
{
sSummon = "prc_s_airlarge";
nVFX = VFX_FNF_SUMMON_MONSTER_2;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
case 2:
{
sSummon = "prc_s_earthlarge";
nVFX = VFX_FNF_SUMMON_MONSTER_2;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
case 3:
{
sSummon = "prc_s_firelarge";
nVFX = VFX_FNF_SUMMON_MONSTER_2;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
case 4:
{
sSummon = "prc_s_waterlarge";
nVFX = VFX_FNF_SUMMON_MONSTER_2;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
case 5:
{
sSummon = "nw_s_diretiger";
nVFX = VFX_FNF_SUMMON_MONSTER_2;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
}
@@ -574,31 +574,31 @@ void main()
case 1:
{
sSummon = "prc_s_bueltte001";
nVFX = VFX_FNF_SUMMON_MONSTER_3;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
case 2:
{
sSummon = "prc_s_invstlk001";
nVFX = VFX_FNF_SUMMON_MONSTER_3;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
case 3:
{
sSummon = "prc_s_pixie001";
nVFX = VFX_FNF_SUMMON_MONSTER_3;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
case 4:
{
sSummon = "prc_s_gorgon001";
nVFX = VFX_FNF_SUMMON_MONSTER_3;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
case 5:
{
sSummon = "prc_s_mntcore001";
nVFX = VFX_FNF_SUMMON_MONSTER_3;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
}
@@ -612,31 +612,31 @@ void main()
case 1:
{
sSummon = "nw_s_airgreat";
nVFX = VFX_FNF_SUMMON_MONSTER_3;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
case 2:
{
sSummon = "nw_s_earthgreat";
nVFX = VFX_FNF_SUMMON_MONSTER_3;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
case 3:
{
sSummon = "nw_s_firegreat";
nVFX = VFX_FNF_SUMMON_MONSTER_3;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
case 4:
{
sSummon = "nw_s_watergreat";
nVFX = VFX_FNF_SUMMON_MONSTER_3;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
case 5:
{
sSummon = "prc_s_nymph001";
nVFX = VFX_FNF_SUMMON_MONSTER_3;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
}
@@ -650,31 +650,31 @@ void main()
case 1:
{
sSummon = "nw_s_airelder";
nVFX = VFX_FNF_SUMMON_MONSTER_3;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
case 2:
{
sSummon = "nw_s_earthelder";
nVFX = VFX_FNF_SUMMON_MONSTER_3;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
case 3:
{
sSummon = "nw_s_fireelder";
nVFX = VFX_FNF_SUMMON_MONSTER_3;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
case 4:
{
sSummon = "nw_s_waterelder";
nVFX = VFX_FNF_SUMMON_MONSTER_3;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
case 5:
{
sSummon = "prc_s_aranea001";
nVFX = VFX_FNF_SUMMON_MONSTER_3;
nVFX = VFX_FNF_SUMMON_NATURES_ALLY_1;
break;
}
}

View File

@@ -0,0 +1,93 @@
//::///////////////////////////////////////////////
//:: Wild Shape
//:: NW_S2_WildShape
//:: Copyright (c) 2001 Bioware Corp.
//:://////////////////////////////////////////////
/*
Allows the Druid to change into animal forms.
Updated: Sept 30 2003, Georg Z.
* Made Armor merge with druid to make forms
more useful.
*/
//:://////////////////////////////////////////////
//:: Created By: Preston Watamaniuk
//:: Created On: Jan 22, 2002
//:://////////////////////////////////////////////
//:: Modified By: Deva Winblood
//:: Modified Date: January 15th-16th, 2008
//:://////////////////////////////////////////////
/*
Modified to insure no shapeshifting spells are castable upon
mounted targets. This prevents problems that can occur due
to dismounting after shape shifting, or other issues that can
occur due to preserved appearances getting out of synch.
This can additional check can be disabled by setting the variable
X3_NO_SHAPESHIFT_SPELL_CHECK to 1 on the module object. If this
variable is set then this script will function as it did prior to
this modification.
*/
//#include "x3_inc_horse"
#include "prc_alterations"
#include "pnp_shft_poly"
void main()
{
object oPC = OBJECT_SELF;
int nSpell = GetSpellId();
int nMetaMagic = PRCGetMetaMagicFeat();
int nCasterLevel = GetLevelByClass(CLASS_TYPE_DRUID, oPC)
+ GetLevelByClass(CLASS_TYPE_LION_OF_TALISID, oPC)
+ GetLevelByClass(CLASS_TYPE_VERDANT_LORD, oPC)
+ GetLevelByClass(CLASS_TYPE_ARCANE_HIEROPHANT, oPC);
float fDuration = HoursToSeconds(nCasterLevel);
int bShiftingDruid = GetLocalInt(GetModule(), "PRC_DRUID_USES_SHIFTING");
if (!GetLocalInt(GetModule(), "X3_NO_SHAPESHIFT_SPELL_CHECK"))
{
if (PRCHorseGetIsMounted(oPC))
{
if (GetIsPC(oPC))
FloatingTextStrRefOnCreature(111982, oPC, FALSE);
return;
}
}
ShifterCheck(oPC);
StoreCurrentAppearanceAsTrueAppearance(oPC, TRUE);
// Always shift into treant form
string sTreantShape = "prc_sum_treant";
ClearAllActions();
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_POLYMORPH), oPC);
effect eBark = EffectVisualEffect(VFX_DUR_PROT_BARKSKIN);
eBark = ExtraordinaryEffect(eBark);
if (bShiftingDruid)
{
ShiftIntoResRef(oPC, SHIFTER_TYPE_DRUID, sTreantShape, FALSE);
DelayCommand(fDuration, SetShiftTrueForm(oPC));
}
else
{
ShiftIntoResRef(oPC, SHIFTER_TYPE_DRUID, sTreantShape, FALSE);
DelayCommand(fDuration, SetShiftTrueForm(oPC));
}
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eBark, oPC, fDuration);
DelayCommand(1.5, ActionCastSpellOnSelf(SPELL_SHAPE_INCREASE_DAMAGE));
}