2026/06/05 Update

Added Sanctified damage type.
Added Holy damage type.
Added Unholy damage type.
Added Falling damage type.
Added Ballistic damage type.
Added Desiccation damage type.
Fixed Major Missile's LABEL in spells.2da.
Fixed Major Missile's LABEL in des_cft_spells.2da.
Fixed Major Missile's LABEL in des_cft_scrolls.2da.
Disabled incomplete PnP version of Shades spell.
Astaroth's free crafting feats should drop off onRest, when expelling a vestige & when rebinding a vestige.
Re-enabled caster level override variable clearing in GetInvokerLevel().
Change Piercing Cold's damagetype to Untyped.
Constanted new damagetypes correctly for scripting (@lightbeard)
Changed all force spells damagetype to force.
Fixed issue with Initiators using Shadows Blade, Ironheart Aura and Shadow Trickster with dual-stances.
Changed Eldritch Blast to Untyped damage.
Fixed Path of Shadow screwing up caster levels.
Changed Sanctify Martial strike to be Holy damage.
Changed Vile Martial strike to be Vile damage.
Updated Forsaker to work with Warforged "Armor".
Added a SignalEvent() to Invisible Needle so it would break Invisibility when it should.
Fixed equip exploit with Shou Disciple and monk weapons.
Changed Saint template's Holy Touch to do Holy Damage.
Changed Horrid Wilting to do Desiccation damage.
Fixed Break Enchantment's targeting.
Fixed the Command spell to obey mind immunity.
Changed Damning Darkness to do Unholy damage.
Change the Necrotic spells to do Vile damage.
Made Persistent Blade more like PnP and made it dispellable.
This commit is contained in:
Jaysyn904
2026-06-05 21:33:30 -04:00
parent c437270cd1
commit 306779349c
54 changed files with 614 additions and 167 deletions

View File

@@ -362,6 +362,17 @@ string GetBindingClassFile(int nClass)
void ApplyVestige(object oBinder, int nVestige)
{
//:: Remove Astaroth's crafting feat to allow leveling up.
effect eOld = GetFirstEffect(oBinder);
while (GetIsEffectValid(eOld))
{
if (GetEffectTag(eOld) == "AstarothCraftingFeat")
{
RemoveEffect(oBinder, eOld);
}
eOld = GetNextEffect(oBinder);
}
PRCRemoveSpellEffects(nVestige, oBinder, oBinder);
GZPRCRemoveSpellEffects(nVestige, oBinder, FALSE);
ActionCastSpellOnSelf(nVestige, METAMAGIC_NONE, oBinder);
@@ -393,7 +404,18 @@ void ApplyVestige(object oBinder, int nVestige)
void ExpelVestige(object oBinder, int nVestige)
{
SetPersistantLocalInt(oBinder, "ExpelledVestige", TRUE);
//:: Remove Astaroth's crafting feat to allow leveling up.
effect eOld = GetFirstEffect(oBinder);
while (GetIsEffectValid(eOld))
{
if (GetEffectTag(eOld) == "AstarothCraftingFeat")
{
RemoveEffect(oBinder, eOld);
}
eOld = GetNextEffect(oBinder);
}
SetPersistantLocalInt(oBinder, "ExpelledVestige", TRUE);
SetPersistantLocalInt(oBinder, "ExpelledVestige"+IntToString(nVestige), TRUE);
// Here, making a good pack means we can unbind it
if (GetLocalInt(oBinder, "PactQuality"+IntToString(nVestige)))
@@ -965,4 +987,6 @@ int GetPatronVestige(object oBinder)
else if (GetHasFeat(FEAT_PATRON_VESTIGE_ABYSM , oBinder)) nPatron = VESTIGE_ABYSM;
return nPatron;
}
}
//:: void main(){}

View File

@@ -465,7 +465,7 @@ int GetInvokerLevel(object oInvoker = OBJECT_SELF, int nSpecificClass = CLASS_TY
if(nLevel)
{
if(DEBUG) SendMessageToPC(oInvoker, "Forced-level Invoking at level " + IntToString(GetCasterLevel(oInvoker)));
//DelayCommand(1.0, DeleteLocalInt(oInvoker, PRC_CASTERLEVEL_OVERRIDE));
DelayCommand(1.0, DeleteLocalInt(oInvoker, PRC_CASTERLEVEL_OVERRIDE));
return nLevel + nAdjust;
}

View File

@@ -2671,7 +2671,7 @@ void DoPiercingCold(object oCaster, object oTarget, int nDamageAmount, int nCurr
if (nDamageAmount > nTest)
{
// Apply the difference to ignore resist
effect eDam = EffectDamage(nDamageAmount - nTest, DAMAGE_TYPE_MAGICAL, DAMAGE_POWER_ENERGY);
effect eDam = EffectDamage(nDamageAmount - nTest, DAMAGE_TYPE_UNTYPED, DAMAGE_POWER_ENERGY);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eDam, oTarget);
effect eVis = EffectVisualEffect(VFX_IMP_FROST_L);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget);
@@ -2786,13 +2786,13 @@ effect PRCEffectDamage(object oTarget, int nDamageAmount, int nDamageType=DAMAGE
{
int nDice = (iDiabolistLevel + 5) / 5;
int nDamage = d6(nDice);
int nDamageType = DAMAGE_TYPE_DIVINE;
int nDamageType = DAMAGE_TYPE_UNHOLY;
if(GetLocalInt(oCaster, "VileDiabolism"))
{
//FloatingTextStringOnCreature("Vile Diabolism is active", oCaster, FALSE);
nDamage /= 2;
nDamageType = DAMAGE_TYPE_POSITIVE;
nDamageType = DAMAGE_TYPE_VILE;
DeleteLocalInt(oCaster, "VileDiabolism");
}

View File

@@ -900,14 +900,16 @@ const int IP_CONST_ONHIT_SAVEDC_70 = 70;
// Creature Epic Criticals
const int IP_CONST_FEAT_DEVCRITICAL_CREATURE = 271;
const int IP_CONST_FEAT_OVERCRITICAL_CREATURE = 272;
//const int IP_CONST_FEAT_WEAPON_PROF_CREATURE = 38; // provided by Bioware in 1.66
// Epic DR
const int IP_CONST_FEAT_EPIC_DR_3 = 273;
const int IP_CONST_FEAT_EPIC_DR_6 = 274;
const int IP_CONST_FEAT_EPIC_DR_9 = 275;
//IP_CONST_DAMAGETYPE
//:://////////////////////////////////////////////
//:: New damage types (iprp_damagetype.2da)
//:://////////////////////////////////////////////
//const int IP_CONST_DAMAGETYPE_BLOOD = 15; //:: Not a 3e PnP damage type
const int IP_CONST_DAMAGETYPE_POISON = 16;
//const int IP_CONST_DAMAGETYPE_SHADOW = 17; //:: Not a 3e PnP damage type
@@ -917,6 +919,12 @@ const int IP_CONST_DAMAGETYPE_RADIANT = 20;
const int IP_CONST_DAMAGETYPE_FORCE = 21;
const int IP_CONST_DAMAGETYPE_UNTYPED = 22;
const int IP_CONST_DAMAGETYPE_VILE = 23;
const int IP_CONST_DAMAGETYPE_SANCTIFIED = 24;
const int IP_CONST_DAMAGETYPE_HOLY = 25;
const int IP_CONST_DAMAGETYPE_UNHOLY = 26;
const int IP_CONST_DAMAGETYPE_FALLING = 27;
const int IP_CONST_DAMAGETYPE_BALLISTIC = 28;
const int IP_CONST_DAMAGETYPE_DESSICATION = 29;
//IP_CONST_DAMAGESOAK
const int IP_CONST_DAMAGESOAK_1_HP = 11;

View File

@@ -13,12 +13,18 @@ const int EFFECT_ICON_ULTRAVISION = 131;
//:://////////////////////////////////////////////
//:: New damage types (damagetypes.2da)
//:://////////////////////////////////////////////
const int DAMAGE_TYPE_POISON = 16384; // CUSTOM2
const int DAMAGE_TYPE_PSYCHIC = 32768; // CUSTOM4
const int DAMAGE_TYPE_RADIANT = 65536; // CUSTOM6
const int DAMAGE_TYPE_FORCE = 524288; // CUSTOM7
const int DAMAGE_TYPE_UNTYPED = 1048576; // CUSTOM8
const int DAMAGE_TYPE_VILE = 2097152; // CUSTOM9
const int DAMAGE_TYPE_POISON = 16384; // CUSTOM2
const int DAMAGE_TYPE_PSYCHIC = 32768; // CUSTOM4
const int DAMAGE_TYPE_RADIANT = 65536; // CUSTOM6
const int DAMAGE_TYPE_FORCE = 524288; // CUSTOM7
const int DAMAGE_TYPE_UNTYPED = 1048576; // CUSTOM8
const int DAMAGE_TYPE_VILE = 2097152; // CUSTOM9
const int DAMAGE_TYPE_SANCTIFIED = 4194304; // CUSTOM10
const int DAMAGE_TYPE_HOLY = 8388608; // CUSTOM11
const int DAMAGE_TYPE_UNHOLY = 16777216; // CUSTOM12
const int DAMAGE_TYPE_FALLING = 33554432; // CUSTOM13
const int DAMAGE_TYPE_BALLISTIC = 67108864; // CUSTOM14
const int DAMAGE_TYPE_DESSICATION = 134217728; // CUSTOM15
//:://////////////////////////////////////////////

View File

@@ -214,7 +214,7 @@ float GetVFXLength(location lCaster, float fLength, float fAngle)
//:://////////////////////////////////////////////
//:: Modified March 14 2003: Removed the option to hurt chests/doors
//:: was potentially causing bugs when no creature targets available.
void PRCDoMissileStorm(int nD6Dice, int nCap, int nSpell, int nMIRV = VFX_IMP_MIRV, int nVIS = VFX_IMP_MAGBLUE, int nDAMAGETYPE = DAMAGE_TYPE_MAGICAL, int nONEHIT = FALSE, int nReflexSave = FALSE)
void PRCDoMissileStorm(int nD6Dice, int nCap, int nSpell, int nMIRV = VFX_IMP_MIRV, int nVIS = VFX_IMP_MAGBLUE, int nDAMAGETYPE = DAMAGE_TYPE_FORCE, int nONEHIT = FALSE, int nReflexSave = FALSE)
{
object oTarget = OBJECT_INVALID;
int nCasterLvl = PRCGetCasterLevel(OBJECT_SELF);
@@ -312,7 +312,7 @@ void PRCDoMissileStorm(int nD6Dice, int nCap, int nSpell, int nMIRV = VFX_IMP_MI
int i = 0;
//--------------------------------------------------------------
// GZ: Moved SR check out of loop to have 1 check per target
// not one check per missile, which would rip spell mantels
// not one check per missile, which would rip spell mantles
// apart
//--------------------------------------------------------------
if (!PRCDoResistSpell(OBJECT_SELF, oTarget,nCasterLvl, fDelay))

View File

@@ -49,6 +49,9 @@ const int MANEUVER_TYPE_MANEUVER = 5;
/* Function prototypes */
//////////////////////////////////////////////////
int GetHasActiveStanceOfDiscipline(object oInitiator, int nDiscipline);
/**
* Determines from what class's maneuver list the currently being initiated
* maneuver is initiated from.
@@ -481,6 +484,34 @@ int _AllowedDiscipline(object oInitiator, int nClass, int nDiscipline)
/* Function definitions */
//////////////////////////////////////////////////
int GetHasActiveStanceOfDiscipline(object oInitiator, int nDiscipline)
{
int bHasDualStance = (GetLevelByClass(CLASS_TYPE_WARBLADE, oInitiator) >= 20) ||
(GetLevelByClass(CLASS_TYPE_MASTER_OF_NINE, oInitiator) >= 3 && GetLocalInt(oInitiator, "MoNDualStance"));
if (bHasDualStance)
{
// Check both stances for dual-stance characters
int nStance1 = GetLocalInt(oInitiator, "TOBStanceOne");
int nStance2 = GetLocalInt(oInitiator, "TOBStanceTwo");
if (nStance1 > 0 && GetDisciplineByManeuver(nStance1) == nDiscipline)
return TRUE;
if (nStance2 > 0 && GetDisciplineByManeuver(nStance2) == nDiscipline)
return TRUE;
return FALSE;
}
else
{
// Single stance check for normal characters
int nStance = GetHasActiveStance(oInitiator);
if (nStance != -1 && GetDisciplineByManeuver(nStance) == nDiscipline)
return TRUE;
return FALSE;
}
}
int GetInitiatingClass(object oInitiator = OBJECT_SELF)
{
return GetLocalInt(oInitiator, PRC_INITIATING_CLASS) - 1;