Howdy all,
I was doing some routine spell testing when I found that the base Bioware script x0_s0_gustwind.nss doesn’t do what it says on the tin.
The spell casts ok and the LOS vfx fires, but enemies in the AoE don’t suffer the Knockdown effect when they fail their Fortitude save.
To me, this renders the spell effectively useless!
Has anyone besides me noticed this problem?
If so, I’m going to do something about it…
I should add that I tested this on a vanilla 1.69 setup using the Bioware Goblins for target practice.
No haks, no 2da changes etc.
From: Community Patch spell changes documentation | The Neverwinter Vault
Gust of wind
- added delay into VFXs applications
- added stonehold into list of “blown-able” AOEs
- code for opening/closing door changed to be working without delay also in huge modules
So no never heard of.
If the knockdown doesn’t apply then, either:
- you do have x0_s0_gustwind.ncs somewhere in override, patch-haks, ovr or development
- the vanilla goblins are somehow modified to have immunity to knockdown - in this case caster is not informed about target immunity
Thanks for the reply, Shadoow (as ever!)
My first port of call was to use your script from 1.71 spell scripts (with a couple of minor changes so I wouldn’t need the 70_inc_spells include) but the issue still persisted - no knockdown effect, I’m afraid.
I’ve checked all resources thoroughly and there’s no duplicate/overriding x0_s0_gustwind script in my installation, and since the goblins have no creature hide or feats/abilities other than weapon proficiency (creature) it can’t be an immunity issue.
Just shooting in the dark here, but although you mention “added delay into VFXs applications” I can’t see any difference between your script and the Bioware original in this respect.
Do you think that maybe the line applying the knockdown effect should also be subject to a delay?
Still, if your modded script works for you, then I suppose that can’t be the answer.
I’m only fussing over this since it’s a cool spell and I just want it to work right!!
Thanks again,
PT
Wait a second. First of all I didn’t test it myself so can’t say 100% sure. And now when I look into it more thoroughly I see there is a bug in CPP’s version of the script.
CPP script won’t work against creatures at all. However it won’t even print the saving throw roll - and you wrote initially that they failed on saving throw. If they failed on saving throw then in original code the knockdown must be applied, I see no other way.
If you are using CPP, then creatures won’t roll at all - it won’t work against creatures at all, this is a bug I never noticed - the spell is rarely used I always used it only to clear persistent aoes.
So to be clear. You are using vanilla 1.69 or NWN-EE ? And are you using community patch or not?
fDelay added as a parameter into MyResistSpell and MySavingThrow - these functions are firing a visual effect too.
The spell is not bugged in 1.71 version, the bug was added somewhere in development of 1.72.
As for no delay on knockdown, that is definitely not causing this issue. Whether there should be delay, I guess it should be there, no idea why I didn’t add it in CPP.
Anyway none of this should matter for you, you wrote that you are using vanilla 1.69 setup. I don’t see any issue in 1.69 version of the script. But I can’t test right now. You should test yourself - if something doesn’t work as you expect add debugging - Script debugging tutorial | The Neverwinter Vault
that will tell you where the problem is
Nailed it, Shadooow!!!
I think the problem WAS the missing delay on the knockdown.
I still can’t believe it works, and perfectly at that!!
If you want, I could post the code here. Just let me know.
Thanks again for your help.
In response to a request from “thebffl”, here is my clunky and totally inelegant fix to x0_s0_gustwind.nss.
- Racially defined creatures who fail a Fortitude Save are knocked down for 12 seconds.
- CEP “Bug Cloud” VFX-based swarms are destroyed.
- Impact VFX has been changed since VFX_IMP_PULSE_WIND doesn’t seem to do anything!
//::///////////////////////////////////////////////////////////////////////////
//:: windblast.nss
//:: [based on x0_s0_gustwind.nss]
//::///////////////////////////////////////////////////////////////////////////
/*
This spell creates a gust of wind moving in all directions from the point
or object chosen by the caster as the target.
All targets in a Huge (13m diameter) area can be affected:
- Targets must make a Fortitude Save vs the Spell DC or be
knocked down for 12 seconds.
- Closed doors will open & open doors will close.
- If certain area of effect objects are within the area they are dispelled.
- Spell has been modified to include custom AOEs and Insect Swarms.
*/
//::///////////////////////////////////////////////////////////////////////////
#include "X0_I0_SPELLS"
#include "x2_inc_spellhook"
void main()
{
// Spellcast Hook Code
if (!X2PreSpellCastCode())
{
// If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell
return;
}
// End of Spell Cast Hook
//Declare major variables
string sAOETag;
//object oCaster = OBJECT_SELF;
//int nCasterLvl = GetCasterLevel(oCaster);
float fDelay;
effect eExplode = EffectVisualEffect(VFX_FNF_LOS_NORMAL_20);
effect eVis = EffectVisualEffect(VFX_DUR_MIND_AFFECTING_DISABLED);
effect eKnock = EffectKnockdown();
//Get the spell target location as opposed to the spell target.
location lTarget = GetSpellTargetLocation();
//Apply the fireball explosion at the location captured above.
ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eExplode, lTarget);
//Declare the spell shape, size and the location. Capture the first target object in the shape.
object oTarget = GetFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_HUGE, lTarget, TRUE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR | OBJECT_TYPE_AREA_OF_EFFECT);
//Cycle through the targets within the spell shape until an invalid object is captured.
while (GetIsObjectValid(oTarget))
{
if (GetObjectType(oTarget) == OBJECT_TYPE_AREA_OF_EFFECT)
{
// Gust of wind should only destroy "cloud/fog-like" area of effect spells.
// Tag now added for dispersal of insect swarms.
sAOETag = GetTag(oTarget);
if ( sAOETag == "VFX_PER_FOGACID" ||
sAOETag == "VFX_PER_FOGKILL" ||
sAOETag == "VFX_PER_FOGBEWILDERMENT" ||
sAOETag == "VFX_PER_FOGSTINK" ||
// The Creature or the AOE can be targeted to destroy the stench!
sAOETag == "VFX_MOB_TROGLODYTE_STENCH" ||
sAOETag == "VFX_PER_FOGFIRE" ||
sAOETag == "VFX_PER_FOGMIND" ||
// Next 3 entries are for custom AOE spells - rem/delete if not required.
sAOETag == "VFX_PER_FOGCLOUD" ||
sAOETag == "VFX_PER_FREEZING_FOG" ||
sAOETag == "VFX_PER_IGEDRAZAARS_MIASMA" ||
sAOETag == "VFX_PER_CREEPING_DOOM")
{
DestroyObject(oTarget);
}
}
else
if (spellsIsTarget(oTarget, SPELL_TARGET_STANDARDHOSTILE, OBJECT_SELF) && oTarget != OBJECT_SELF)
{
{
//Fire cast spell at event for the specified target
SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, 75));
// Get the target race of oTarget so that Elementals etc are immune.
int nRacial = GetRacialType(oTarget);
// Get the appearance type of oTarget (from CEP2 appearance.2da)
int nCloud = GetAppearanceType(oTarget);
//Get the distance between the explosion and the target to calculate delay
fDelay = GetDistanceBetweenLocations(lTarget, GetLocation(oTarget))/20;
// If oTarget is a Bug Cloud creature, then waste it!!
if ((nCloud == 1171) || (nCloud == 1172))
{
DestroyObject(oTarget);
}
// * unlocked doors will reverse their open/closed state.
if (GetObjectType(oTarget) == OBJECT_TYPE_DOOR)
{
if (GetLocked(oTarget) == FALSE)
{
if (GetIsOpen(oTarget) == FALSE)
{
// Shadooow's CPP 1.71 version of original line.
AssignCommand(oTarget, ActionPlayAnimation(ANIMATION_DOOR_OPEN1));
}
else
// Shadooow's CPP 1.71 version of original line.
AssignCommand(oTarget, ActionPlayAnimation(ANIMATION_DOOR_CLOSE));
}
}
//Check racial type of oTarget to exclude Undead, Beasts, Oozes, Vermin etc.
if ((nRacial == RACIAL_TYPE_ANIMAL) ||
(nRacial == RACIAL_TYPE_CONSTRUCT) ||
(nRacial == RACIAL_TYPE_DWARF) ||
(nRacial == RACIAL_TYPE_ELF) ||
(nRacial == RACIAL_TYPE_HALFLING) ||
(nRacial == RACIAL_TYPE_HUMAN) ||
(nRacial == RACIAL_TYPE_HALFORC) ||
(nRacial == RACIAL_TYPE_GNOME) ||
(nRacial == RACIAL_TYPE_HUMANOID_GOBLINOID) ||
(nRacial == RACIAL_TYPE_HUMANOID_ORC) ||
(nRacial == RACIAL_TYPE_HUMANOID_REPTILIAN) ||
(nRacial == RACIAL_TYPE_HUMANOID_MONSTROUS))
{
// Magic Resistance removed because I don't use this ability/property.
if(!MySavingThrow(SAVING_THROW_FORT, oTarget, GetSpellSaveDC(), SAVING_THROW_TYPE_SPELL))
{
DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eKnock, oTarget, 12.0f));
DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eVis, oTarget, 12.0f));
}
}
}
}
//Select the next target within the spell shape.
oTarget = GetNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_HUGE, lTarget, TRUE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR | OBJECT_TYPE_AREA_OF_EFFECT);
}
}
Hope I’ve done the inputting right - it’s a new thing for me!!
1 Like
I tested it and the spell works correctly on all NWN versions with vanilla spellscript or with spellscript from community patch version 1.70 or 1.71. As I wrote, I introduced a bug to it somewhere along 1.72 development, but the bug manifested differently than you described and it doesn’t seems that you would be using CPP anyway.
That leaves the only possible explanation and that is that you were not testing with vanilla spellscript. You had some custom changes in your script previously that must have prevent for the knockdown to be applied.
Tl’dr the spell is not bugged normally, there is nothing to fix.