PC: Geldgier Schicksal
ESSID: Goettendaemmerung
The various dragon breath potions (paralixer, deralixir, anta-alkalixir, etc) don't seem to work for my PC. After several times attempting to use them in combat and failing, I experimented on the hoards of rats in the sewers. I'd get close to a cluster of them, face them, and use the potion. I'd see the visual effect for the given potion, but there would be no checks, no damage, no nothing - except in one case where I tried to use the anti-alkalixir and did acid damage to a rat standing somewhere behind my PC.
I have yet to try the potions against another PC (I will soon). However, I did have another PC try the paralixer against me, and it worked.
Thanks,
-Grumpy
I did some more tests, this time against PC Drego Blackfoot in the Crone basement. I used a variety of dragon breath potions, facing a number of different directions from him, and there were no checks. Drego Blackfoot then used a dragon breath item against Geldgier, and there was no check there either.
May be a simple case of things that aren't set to hostile not being targets for dragon breathe.
I had Drego Blackfoot set to hostile (forgot to mention that). The sewer rats were red (hostile).
Tried the dragon's breath potions in toolset, they were hitting a kobold in the distance but not a bandit directly in front of me >.> remember that dragon breaths are normally directionally cast "spells" so when the target, via potion, becomes "self" there's a good chance of AoE cone discrepancies as it has no "bearing" of your character.
EDIT: In this above test, I was facing south toward the bandit, and the kobold was to the east/south/east, the strike-zone of an east-facing dragon breath
As an additional one off test from what I noticed above, I tried four potions at north / east / west / south, with my character facing away from two mobs positioned about 5 metres apart horizontally. The only potion that worked was the west potion, striking both mobs which leads me to believe the breath only goes east :3 if you have a spare to try this in game to confirm, feel free. Not sure if there are further modifications to the spell in-game after all, and "bear" in mind I only did one test.
Thanks for the research zDark_Shadowz. I'll try it against someone to my east.
zDark_Shadowz was absolutely correct; The dragon breath potions fire to the east every time.
Since I don't have a clue how the script for the Dragon Breath Potions look like, this reply might be nonesense, so apologies for that if that's the case. I'm assuming that the script for the potion is using the script for the Dragon Breath as a monster ability (the type the creatures have). I noticed on the original script for the Dragon Breath, that it can only be used as a touch attack and not as a target self.
However, the script for the FEAT Dragon Breath which the RDD gets, handles the issue of targeting yourself as the target. Here are the two scripts:
[hide="Monster Ability Dragon Breath"]//::///////////////////////////////////////////////
//:: Dragon Breath Fire
//:: NW_S1_DragFire
//:: Copyright (c) 2001 Bioware Corp.
//:://////////////////////////////////////////////
/*
Calculates the proper damage and DC Save for the
breath weapon based on the HD of the dragon.
*/
//:://////////////////////////////////////////////
//:: Created By: Preston Watamaniuk
//:: Created On: May 9, 2001
//:://////////////////////////////////////////////
#include "NW_I0_SPELLS"
void main()
{
//Declare major variables
int nAge = GetHitDice(OBJECT_SELF);
int nDamage, nDC, nDamStrike;
float fDelay;
object oTarget;
effect eVis, eBreath;
//Use the HD of the creature to determine damage and save DC
if (nAge <= 6) //Wyrmling
{
nDamage = d10(2);
nDC = 15;
}
else if (nAge >= 7 && nAge <= 9) //Very Young
{
nDamage = d10(4);
nDC = 18;
}
else if (nAge >= 10 && nAge <= 12) //Young
{
nDamage = d10(6);
nDC = 19;
}
else if (nAge >= 13 && nAge <= 15) //Juvenile
{
nDamage = d10(8);
nDC = 22;
}
else if (nAge >= 16 && nAge <= 18) //Young Adult
{
nDamage = d10(10);
nDC = 24;
}
else if (nAge >= 19 && nAge <= 22) //Adult
{
nDamage = d10(12);
nDC = 25;
}
else if (nAge >= 23 && nAge <= 24) //Mature Adult
{
nDamage = d10(14);
nDC = 28;
}
else if (nAge >= 25 && nAge <= 27) //Old
{
nDamage = d10(16);
nDC = 30;
}
else if (nAge >= 28 && nAge <= 30) //Very Old
{
nDamage = d10(18);
nDC = 33;
}
else if (nAge >= 31 && nAge <= 33) //Ancient
{
nDamage = d10(20);
nDC = 35;
}
else if (nAge >= 34 && nAge <= 37) //Wyrm
{
nDamage = d10(22);
nDC = 38;
}
else if (nAge > 37) //Great Wyrm
{
nDamage = d10(24);
nDC = 40;
}
PlayDragonBattleCry();
//Get first target in spell area
oTarget = GetFirstObjectInShape(SHAPE_SPELLCONE, 14.0, GetSpellTargetLocation(), TRUE);
while(GetIsObjectValid(oTarget))
{
if(oTarget != OBJECT_SELF && !GetIsReactionTypeFriendly(oTarget))
{
//Reset the damage to full
nDamStrike = nDamage;
//Fire cast spell at event for the specified target
SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELLABILITY_DRAGON_BREATH_FIRE));
//Adjust the damage based on the Reflex Save, Evasion and Improved Evasion.
if(MySavingThrow(SAVING_THROW_REFLEX, oTarget, nDC, SAVING_THROW_TYPE_FIRE))
{
nDamStrike = nDamStrike/2;
if(GetHasFeat(FEAT_EVASION, oTarget) || GetHasFeat(FEAT_IMPROVED_EVASION, oTarget))
{
nDamStrike = 0;
}
}
else if(GetHasFeat(FEAT_IMPROVED_EVASION, oTarget))
{
nDamStrike = nDamStrike/2;
}
if (nDamStrike > 0)
{
//Set Damage and VFX
eBreath = EffectDamage(nDamStrike, DAMAGE_TYPE_FIRE);
eVis = EffectVisualEffect(VFX_IMP_FLAME_M);
//Determine effect delay
fDelay = GetDistanceBetween(OBJECT_SELF, oTarget)/20;
//Apply the VFX impact and effects
DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget));
DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eBreath, oTarget));
}
}
//Get next target in spell area
oTarget = GetNextObjectInShape(SHAPE_SPELLCONE, 14.0, GetSpellTargetLocation(), TRUE);
}
}
[/hide]
[hide="Feat Dragon Breath"]//::///////////////////////////////////////////////
//:: Breath Weapon for Dragon Disciple Class
//:: x2_s2_discbreath
//:: Copyright (c) 2003Bioware Corp.
//:://////////////////////////////////////////////
/*
Damage Type is Fire
Save is Reflex
Shape is cone, 30' == 10m
Level Damage Save
---------------------------
3 2d10 19
7 4d10 19
10 6d10 19
after 10:
damage: 6d10 + 1d10 per 3 levels after 10
savedc: increasing by 1 every 4 levels after 10
*/
//:://////////////////////////////////////////////
//:: Created By: Georg Zoeller
//:: Created On: June, 17, 2003
//:://////////////////////////////////////////////
#include "NW_I0_SPELLS"
void main()
{
int nType = GetSpellId();
int nDamageDice;
int nSaveDC = 19;
int nLevel = GetLevelByClass(37,OBJECT_SELF);// 37 = red dragon disciple
if (nLevel <7)
{
nDamageDice = 2;
}
else if (nLevel <10)
{
nDamageDice = 4;
}
else if (nLevel ==10)
{
nDamageDice = 6;
}
else
{
nDamageDice = 6+((nLevel -10)/3);
nSaveDC = nSaveDC + ((nLevel -10)/4);
}
int nDamage = d10(nDamageDice);
//Declare major variables
float fDelay;
object oTarget;
effect eVis, eBreath;
int nPersonalDamage;
eVis = EffectVisualEffect(494);
ApplyEffectAtLocation(DURATION_TYPE_INSTANT,eVis,GetSpellTargetLocation());
[B][COLOR=#FF8C00] //Get first target in spell area
location lFinalTarget = GetSpellTargetLocation();
if ( lFinalTarget == GetLocation(OBJECT_SELF) )
{
// Since the target and origin are the same, we have to determine the
// direction of the spell from the facing of OBJECT_SELF (which is more
// intuitive than defaulting to East everytime).
// In order to use the direction that OBJECT_SELF is facing, we have to
// instead we pick a point slightly in front of OBJECT_SELF as the target.
vector lTargetPosition = GetPositionFromLocation(lFinalTarget);
vector vFinalPosition;
vFinalPosition.x = lTargetPosition.x + cos(GetFacing(OBJECT_SELF));
vFinalPosition.y = lTargetPosition.y + sin(GetFacing(OBJECT_SELF));
lFinalTarget = Location(GetAreaFromLocation(lFinalTarget),vFinalPosition,GetFacingFromLocation(lFinalTarget));
}
oTarget = GetFirstObjectInShape(SHAPE_SPELLCONE, 10.0, lFinalTarget, TRUE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR | OBJECT_TYPE_PLACEABLE);[/COLOR][/B]
while(GetIsObjectValid(oTarget))
{
nPersonalDamage = nDamage;
if(oTarget != OBJECT_SELF && !GetIsReactionTypeFriendly(oTarget))
{
//Fire cast spell at event for the specified target
SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, GetSpellId()));
//Adjust the damage based on the Reflex Save, Evasion and Improved Evasion.
//Determine effect delay
fDelay = GetDistanceBetween(OBJECT_SELF, oTarget)/20;
if(MySavingThrow(SAVING_THROW_REFLEX, oTarget, nSaveDC, SAVING_THROW_TYPE_FIRE))
{
nPersonalDamage = nPersonalDamage/2;
if(GetHasFeat(FEAT_EVASION, oTarget) || GetHasFeat(FEAT_IMPROVED_EVASION, oTarget))
{
nPersonalDamage = 0;
}
}
else if(GetHasFeat(FEAT_IMPROVED_EVASION, oTarget))
{
nPersonalDamage = nPersonalDamage/2;
}
if (nPersonalDamage > 0)
{
//Set Damage and VFX
eBreath = EffectDamage(nPersonalDamage, DAMAGE_TYPE_FIRE);
eVis = EffectVisualEffect(VFX_IMP_FLAME_M);
//Apply the VFX impact and effects
DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget));
DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eBreath, oTarget));
}
}
//Get next target in spell area
oTarget = GetNextObjectInShape(SHAPE_SPELLCONE, 10.0, lFinalTarget, TRUE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR | OBJECT_TYPE_PLACEABLE);
}
}
[/hide]
I marked the part that handles the possibility of targeting yourself in orange in the Dragon Breath - Feat (Script). So, the adjustment I would make to check the possibility on the script of the Monster Ability would be:
[hide="Monster Ability Dragon Breath with handling of Target-Self"]//::///////////////////////////////////////////////
//:: Dragon Breath Fire
//:: NW_S1_DragFire
//:: Copyright (c) 2001 Bioware Corp.
//:://////////////////////////////////////////////
/*
Calculates the proper damage and DC Save for the
breath weapon based on the HD of the dragon.
*/
//:://////////////////////////////////////////////
//:: Created By: Preston Watamaniuk
//:: Created On: May 9, 2001
//:://////////////////////////////////////////////
#include "NW_I0_SPELLS"
void main()
{
//Declare major variables
int nAge = GetHitDice(OBJECT_SELF);
int nDamage, nDC, nDamStrike;
float fDelay;
object oTarget;
effect eVis, eBreath;
//Use the HD of the creature to determine damage and save DC
if (nAge <= 6) //Wyrmling
{
nDamage = d10(2);
nDC = 15;
}
else if (nAge >= 7 && nAge <= 9) //Very Young
{
nDamage = d10(4);
nDC = 18;
}
else if (nAge >= 10 && nAge <= 12) //Young
{
nDamage = d10(6);
nDC = 19;
}
else if (nAge >= 13 && nAge <= 15) //Juvenile
{
nDamage = d10(8);
nDC = 22;
}
else if (nAge >= 16 && nAge <= 18) //Young Adult
{
nDamage = d10(10);
nDC = 24;
}
else if (nAge >= 19 && nAge <= 22) //Adult
{
nDamage = d10(12);
nDC = 25;
}
else if (nAge >= 23 && nAge <= 24) //Mature Adult
{
nDamage = d10(14);
nDC = 28;
}
else if (nAge >= 25 && nAge <= 27) //Old
{
nDamage = d10(16);
nDC = 30;
}
else if (nAge >= 28 && nAge <= 30) //Very Old
{
nDamage = d10(18);
nDC = 33;
}
else if (nAge >= 31 && nAge <= 33) //Ancient
{
nDamage = d10(20);
nDC = 35;
}
else if (nAge >= 34 && nAge <= 37) //Wyrm
{
nDamage = d10(22);
nDC = 38;
}
else if (nAge > 37) //Great Wyrm
{
nDamage = d10(24);
nDC = 40;
}
PlayDragonBattleCry();
//Get first target in spell area
[B][COLOR=#FF8C00] location lFinalTarget = GetSpellTargetLocation();
if ( lFinalTarget == GetLocation(OBJECT_SELF) )
{
// Since the target and origin are the same, we have to determine the
// direction of the spell from the facing of OBJECT_SELF (which is more
// intuitive than defaulting to East everytime).
// In order to use the direction that OBJECT_SELF is facing, we have to
// instead we pick a point slightly in front of OBJECT_SELF as the target.
vector lTargetPosition = GetPositionFromLocation(lFinalTarget);
vector vFinalPosition;
vFinalPosition.x = lTargetPosition.x + cos(GetFacing(OBJECT_SELF));
vFinalPosition.y = lTargetPosition.y + sin(GetFacing(OBJECT_SELF));
lFinalTarget = Location(GetAreaFromLocation(lFinalTarget),vFinalPosition,GetFacingFromLocation(lFinalTarget));
}[/COLOR][/B]
oTarget = GetFirstObjectInShape(SHAPE_SPELLCONE, 14.0, [B][COLOR=#FF8C00]lFinalTarget[/COLOR][/B], TRUE);
while(GetIsObjectValid(oTarget))
{
if(oTarget != OBJECT_SELF && !GetIsReactionTypeFriendly(oTarget))
{
//Reset the damage to full
nDamStrike = nDamage;
//Fire cast spell at event for the specified target
SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELLABILITY_DRAGON_BREATH_FIRE));
//Adjust the damage based on the Reflex Save, Evasion and Improved Evasion.
if(MySavingThrow(SAVING_THROW_REFLEX, oTarget, nDC, SAVING_THROW_TYPE_FIRE))
{
nDamStrike = nDamStrike/2;
if(GetHasFeat(FEAT_EVASION, oTarget) || GetHasFeat(FEAT_IMPROVED_EVASION, oTarget))
{
nDamStrike = 0;
}
}
else if(GetHasFeat(FEAT_IMPROVED_EVASION, oTarget))
{
nDamStrike = nDamStrike/2;
}
if (nDamStrike > 0)
{
//Set Damage and VFX
eBreath = EffectDamage(nDamStrike, DAMAGE_TYPE_FIRE);
eVis = EffectVisualEffect(VFX_IMP_FLAME_M);
//Determine effect delay
fDelay = GetDistanceBetween(OBJECT_SELF, oTarget)/20;
//Apply the VFX impact and effects
DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget));
DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eBreath, oTarget));
}
}
//Get next target in spell area
oTarget = GetNextObjectInShape(SHAPE_SPELLCONE, 14.0, [B][COLOR=#FF8C00]lFinalTarget[/COLOR][/B], TRUE);
}
}
[/hide]
As I wrote, I have no idea how the potion's script is written, so there should be some adjustments.
I hope I got the problem right and sorry if I ended up wasting anyone's time =(
Wish there was a brave, heroic DM who could implement this... (wink wink)
Should be fixed, let me know if something broke.
Sweetness! Thanks Tala!