2026/02/24 Hotfix Update

Hotfix for Vow Poverty item unequip bug.
Invoke Divine Wrath now accepts all Smites as a prereq.
Added IsUnagumentablePower().
Added GetCanSmite().
Fixed Crown of Might Discharge Crown.
This commit is contained in:
Jaysyn904
2026-02-24 00:12:48 -05:00
parent 072249bec6
commit 86666c51e8
10 changed files with 428 additions and 18 deletions

View File

@@ -3115,7 +3115,7 @@
3111 FEAT_FULL_DRAGON_BREATH 16832855 16832856 ife_X2DDBreath **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_FULL_DRAGON_BREATH 5 **** 6 **** **** **** 0 1
3112 FEAT_CLIMB 16847418 16847419 ife_climb **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 2749 **** 0 **** **** 0 **** **** **** **** **** **** **** **** **** FEAT_JUMP 4 **** **** **** **** **** 0 1
3113 Two-Weapon_Rend 16828414 16828415 ife_tw_rend 9 **** 15 **** **** **** **** **** 20 **** 0 0 1 **** **** **** **** 1 **** **** **** 41 374 **** **** **** **** **** **** **** FEAT_TWO_WEAPON_REND 6 **** **** **** **** **** 1 1
3114 FEAT_INVOKE_DIVINE_WRATH 16825348 16825349 ife_X1DivShl **** **** **** **** **** **** **** 9 13 **** 0 0 1 **** **** 2163 **** 1 **** **** 0 301 472 3139 3248 **** 7 26 **** **** FEAT_INVOKE_DIVINE_WRATH 6 1 **** **** **** **** 1 1
3114 FEAT_INVOKE_DIVINE_WRATH 16825348 16825349 ife_X1DivShl **** **** **** **** **** **** **** 9 13 **** 0 0 1 **** **** 2163 **** 1 **** **** 0 **** **** **** **** **** 7 26 **** **** FEAT_INVOKE_DIVINE_WRATH 6 1 **** **** **** **** 1 1
3115 FEAT_EPIC_DIVINE_VIGOR 16825346 16825347 ife_turnvigor **** **** **** **** **** **** 19 **** 3116 774 0 0 1 **** **** 2162 **** 1 **** **** 0 **** **** **** **** **** **** **** **** **** FEAT_EPIC_DIVINE_VIGOR 6 **** **** **** **** **** 1 1
3116 FEAT_DIVINE_VIGOR 16825344 16825345 ife_turnvigor **** **** **** **** **** **** 13 **** 13 294 0 0 1 **** **** 2164 3115 1 **** **** 1 **** **** **** **** **** **** **** **** **** FEAT_DIVINE_VIGOR 6 **** **** **** **** **** 0 1
3117 FEAT_DIVINE_RESISTANCE 16825342 16825343 ife_turnresis **** **** **** **** **** **** 13 **** 3118 **** 0 0 1 **** **** 2166 3119 1 **** **** 1 **** **** **** **** **** **** **** **** **** FEAT_DIVINE_RESISTANCE 6 **** **** **** **** **** 0 1

View File

@@ -29,6 +29,8 @@
/* Function prototypes */
//////////////////////////////////////////////////
int IsUnagumentablePower(int nPower);
/**
* Determines if the power that is currently being attempted to be manifested
* can in fact be manifested. Calculates PP cost and pays it. Determines
@@ -143,6 +145,131 @@ struct manifestation EvaluateDiaDragChannel(object oManifester, object oTarget,
/* Internal functions */
//////////////////////////////////////////////////
//:: Returns TRUE if nPower is a power that can't
//:: normally be augmented.
int IsUnagumentablePower(int nPower)
{
switch (nPower)
{
case POWER_ANIMAL_AFFINITY:
case POWER_ASSIMILATE:
case POWER_ASTRALSEED:
case POWER_BITE_WOLF:
case POWER_BODY_EQUILIBRIUM:
case POWER_BODYPURIFICATION:
case POWER_BURST:
case POWER_CATAPSI:
case POWER_CHAMELEON:
case POWER_CLAIRTANGENT_HAND:
case POWER_CLAIRVOYANT_SENSE:
case POWER_CLAW_ENERGY_COLD:
case POWER_CLAW_ENERGY_ELEC:
case POWER_CLAW_ENERGY_FIRE:
case POWER_CLAW_OF_THE_VAMPIRE:
case POWER_CLOUD_MIND:
case POWER_CLOUD_MIND_MASS:
case POWER_CONCEALTHOUGHT:
case POWER_CONCEALAMORPHA:
case POWER_GREATAMORPHA:
case POWER_CONTROLAIR:
case POWER_CONTROL_OBJECT:
case POWER_CONTROLSOUND:
case POWER_CREATESOUND:
case POWER_CRYSTALLIZE:
case POWER_DARKVISION:
case POWER_DECEREBRATE:
case POWER_DESTINYDISSONANCE:
case POWER_DETECT_REMOTE_VIEWING:
case POWER_DIMENSIONDOOR:
case POWER_DIMENSION_SLIDE:
case POWER_DIMENSIONALANCHOR:
case POWER_DISMISSAL:
case POWER_DISPELLING_BUFFER:
case POWER_DISTRACT:
case POWER_DUODIMENSIONAL_CLAW:
case POWER_ECTOPLASMICFORM:
case POWER_ECTOSHAMBLER:
case POWER_GREASE:
case POWER_ELFSIGHT:
case POWER_EMPATHY:
case POWER_ENERGYADAPTION:
case POWER_ENERGYADAPTACID:
case POWER_ENERGYADAPTCOLD:
case POWER_ENERGYADAPTELEC:
case POWER_ENERGYADAPTFIRE:
case POWER_ENERGYADAPTSONIC:
case POWER_ENERGYWALL_COLD:
case POWER_ENERGYWALL_ELEC:
case POWER_ENERGYWALL_FIRE:
case POWER_ENERGYWALL_SONIC:
case POWER_ESCAPE_DETECTION:
case POWER_ETHEREALJAUNT:
case POWER_ETHEREALNESS:
case POWER_FREEDOM:
case POWER_GENESIS:
case POWER_HUSTLE:
case POWER_IDENTIFY:
case POWER_IMMOVABILITY:
case POWER_INERTBARRIER:
case POWER_IRONBODY:
case POWER_KEENEDGE:
case POWER_KNOCK:
case POWER_MATTERAGITATION:
case POWER_MINDBLANKPERSONAL:
case POWER_PSIMINDBLANK:
case POWER_MOMENTOFPRESCIENCEATTACK:
case POWER_MOMENTOFPRESCIENCEARMOUR:
case POWER_MOMENTOFPRESCIENCESAVES:
case POWER_MOMENTOFPRESCIENCESKILLS:
case POWER_MYLIGHT:
case POWER_NULL_PSIONICS_FIELD:
case POWER_PAINFUL_STRIKE:
case POWER_POWERLEECH:
case POWER_POWERRESISTANCE:
case POWER_PRECOGNITION_MAIN:
case POWER_GREATERPRECOGNITION_MAIN:
case POWER_LOCK:
case POWER_PSIONICREVIVIFY:
case POWER_PSYCHICCHIR_REPAIR:
case POWER_PSYCHICCHIR_TRANSFER:
case POWER_PSYCHICVAMPIRE:
case POWER_PSYCHOFEEDBACK:
case POWER_RECALLDEATH:
case POWER_REDDOPSI:
case POWER_REMOTE_VIEW_TRAP:
case POWER_REMOTE_VIEWING:
case POWER_PSIONICRESTORATION:
case POWER_SECONDCHANCE:
case POWER_SEQUESTER:
case POWER_SHADOWBODY:
case POWER_SHAREPAIN:
case POWER_SHATTERMINDBLANK:
case POWER_SKATE:
case POWER_STEADFASTPERCEP:
case POWER_SYNESTHETE:
case POWER_TELEMPATHICPRO:
case POWER_TELEPORT_SELFONLY:
case POWER_TELEPORT_PARTY:
case POWER_GREATER_TELEPORT_SELFONLY:
case POWER_GREATER_TELEPORT_PARTY:
case POWER_TELEPORTATIONCIRCLE_VISIBLE:
case POWER_TELEPORTATIONCIRCLE_HIDDEN:
case POWER_TIMELESSBODY:
case POWER_TOUCHSIGHT:
case POWER_TRUEMETABOLISM:
case POWER_TRUESEEING:
case POWER_TRUEVENOM:
case POWER_TRUEVENOM_WEAPON:
case POWER_UBIQVISION:
case POWER_VAMPIRIC_WEAPON:
case POWER_WEAPON_ENERGY_COLD:
case POWER_WEAPON_ENERGY_ELEC:
case POWER_WEAPON_ENERGY_FIRE:
return TRUE;
}
return FALSE;
}
/** Internal function.
* Calculates PP cost reduction from various factors. Currently accounts for:
* - Thrallherd

View File

@@ -100,7 +100,256 @@ void ConvertVoPToNWNxEE(object oPC)
SetPersistantLocalInt(oPC, "VoP_NWNxEE_Converted", TRUE);
}
void main()
#include "prc_feat_const"
#include "prc_inc_function"
const string VOP_TAG = "VoP";
// Helper: add a VoP-tagged property to the skin
void AddVoPProperty(object oSkin, itemproperty ip)
{
ip = TagItemProperty(ip, VOP_TAG);
IPSafeAddItemProperty(oSkin, ip, 0.0f, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
}
// Remove all VoP-tagged properties from an item
void RemoveVoPProperties(object oItem)
{
itemproperty ip = GetFirstItemProperty(oItem);
while (GetIsItemPropertyValid(ip))
{
if (GetItemPropertyTag(ip) == VOP_TAG)
RemoveItemProperty(oItem, ip);
ip = GetNextItemProperty(oItem);
}
}
void main()
{
int nEvent = GetRunningEvent();
if (DEBUG) DoDebug("ft_vowofpoverty running, event: " + IntToString(nEvent));
object oPC;
switch (nEvent)
{
case EVENT_ITEM_ONHIT: oPC = OBJECT_SELF; break;
case EVENT_ONPLAYEREQUIPITEM: oPC = GetItemLastEquippedBy(); break;
case EVENT_ONPLAYERUNEQUIPITEM: oPC = GetItemLastUnequippedBy(); break;
case EVENT_ONHEARTBEAT: oPC = OBJECT_SELF; break;
default: oPC = OBJECT_SELF;
}
object oItem;
object oSkin = GetPCSkin(oPC);
int nLevel = GetCharacterLevel(oPC) - GetPersistantLocalInt(oPC, "VoPLevel1") + 1;
int nACArmor = 4 + nLevel / 3;
int nACDeflection = nLevel / 6;
int nACNatural = nLevel / 8;
int nRegen = 1 + (nLevel - 17) / 7;
int nDR = 5 * (1 + (nLevel - 10) / 9);
int nER = (10 * (1 + (nLevel - 13) / 7)) - 5;
int nResist = 0;
if (nLevel >= 17) nResist = 1 + (nLevel - 7) / 5;
else if (nLevel >= 13) nResist = 2;
else if (nLevel >= 7) nResist = 1;
int nForsakerBonus = GetLevelByClass(CLASS_TYPE_FORSAKER, oPC) / 2;
int nSlot, nLevelCheck, nExaltedStrike, nTotalEnhancement;
if (nLevel >= 10) nExaltedStrike = 1 + (nLevel - 7) / 3;
else if (nLevel >= 4) nExaltedStrike = 1;
if (nForsakerBonus >= nExaltedStrike) nTotalEnhancement = nForsakerBonus;
else nTotalEnhancement = nExaltedStrike;
// EvalPRCFeats pass
if (nEvent == FALSE)
{
if (GetPRCSwitch("PRC_NWNXEE_ENABLED") && GetPRCSwitch("PRC_PRCX_ENABLED"))
ConvertVoPToNWNxEE(oPC);
if (GetPRCSwitch("PRC_NWNXEE_ENABLED") && GetPRCSwitch("PRC_PRCX_ENABLED"))
ConvertVoPFeatsToNWNxEE(oPC);
for (nLevelCheck = 1; nLevelCheck <= nLevel; nLevelCheck++)
{
if (!GetPersistantLocalInt(oPC, "VoPBoost" + IntToString(nLevelCheck)) && (nLevelCheck - (nLevelCheck / 4) * 4 == 3) && (nLevelCheck >= 7) && (nLevelCheck <= 27))
{
AssignCommand(oPC, ClearAllActions(TRUE));
SetPersistantLocalInt(oPC, "VoPBoostCheck", nLevelCheck);
StartDynamicConversation("ft_vowpoverty_ab", oPC, DYNCONV_EXIT_NOT_ALLOWED, FALSE, TRUE, oPC);
}
if (GetPersistantLocalInt(oPC, "VoPBoost" + IntToString(nLevelCheck)) >= 10)
{
int stat = GetPersistantLocalInt(oPC, "VoPBoost" + IntToString(nLevelCheck)) - 10;
int value = 2 * (1 + (nLevel - nLevelCheck) / 4);
if (GetPRCSwitch("PRC_NWNXEE_ENABLED") && GetPRCSwitch("PRC_PRCX_ENABLED"))
{
string sKey = "VoP_EE_Boost_" + IntToString(stat);
int nLastApplied = GetPersistantLocalInt(oPC, sKey);
int nDelta = value - nLastApplied;
if (nDelta > 0)
{
PRC_Funcs_ModAbilityScore(oPC, stat, nDelta);
SetPersistantLocalInt(oPC, sKey, value);
}
}
else
{
// Fallback: add tagged ability bonus to skin
itemproperty ip = ItemPropertyAbilityBonus(stat, value);
AddVoPProperty(oSkin, ip);
}
}
if (!GetPersistantLocalInt(oPC, "VoPFeat" + IntToString(nLevelCheck)) && (nLevelCheck - (nLevelCheck / 2) * 2 == 0))
{
AssignCommand(oPC, ClearAllActions(TRUE));
SetPersistantLocalInt(oPC, "VoPFeatCheck", nLevelCheck);
StartDynamicConversation("ft_vowpoverty_ft", oPC, DYNCONV_EXIT_NOT_ALLOWED, FALSE, TRUE, oPC);
}
}
// AC Armor (effect)
ApplyEffectToObject(DURATION_TYPE_PERMANENT, SupernaturalEffect(EffectACIncrease(nACArmor, AC_ARMOUR_ENCHANTMENT_BONUS)), oPC);
// Deflection (effect)
ApplyEffectToObject(DURATION_TYPE_PERMANENT, SupernaturalEffect(EffectACIncrease(nACDeflection, AC_DEFLECTION_BONUS)), oPC);
// Resistance (itemproperty, tagged)
if (nLevel >= 7)
{
itemproperty ip = ItemPropertyBonusSavingThrow(SAVING_THROW_ALL, nResist);
AddVoPProperty(oSkin, ip);
}
// Natural Armor (effect)
ApplyEffectToObject(DURATION_TYPE_PERMANENT, ExtraordinaryEffect(EffectACIncrease(nACNatural, AC_NATURAL_BONUS)), oPC);
// DR (effect)
if (nLevel >= 10) ApplyEffectToObject(DURATION_TYPE_PERMANENT, SupernaturalEffect(EffectDamageReduction(nDR, nTotalEnhancement)), oPC);
// Energy resistances (effects)
if (nLevel >= 13)
{
ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectDamageResistance(DAMAGE_TYPE_ACID, nER, 0, FALSE), oPC);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectDamageResistance(DAMAGE_TYPE_COLD, nER, 0, FALSE), oPC);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectDamageResistance(DAMAGE_TYPE_ELECTRICAL, nER, 0, FALSE), oPC);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectDamageResistance(DAMAGE_TYPE_FIRE, nER, 0, FALSE), oPC);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectDamageResistance(DAMAGE_TYPE_SONIC, nER, 0, FALSE), oPC);
}
// Freedom of Movement (tagged)
if (nLevel >= 14)
{
itemproperty ip = ItemPropertyFreeAction();
AddVoPProperty(oSkin, ip);
}
// Regeneration (tagged)
if (nLevel >= 17)
{
itemproperty ip = ItemPropertyRegeneration(nRegen);
AddVoPProperty(oSkin, ip);
}
// True Seeing (tagged)
if (nLevel >= 18)
{
itemproperty ip = ItemPropertyTrueSeeing();
AddVoPProperty(oSkin, ip);
}
// Exalted Strike (effect, already tagged)
effect eEffect1 = EffectAttackIncrease(nTotalEnhancement);
effect eEffect2 = VoPDamage(nTotalEnhancement);
effect eLink = EffectLinkEffects(eEffect1, eEffect2);
eLink = SupernaturalEffect(eLink);
eLink = TagEffect(eLink, "EffectExaltedStrike");
effect eCheckEffect = GetFirstEffect(oPC);
while (GetIsEffectValid(eCheckEffect))
{
if (GetEffectTag(eCheckEffect) == "EffectExaltedStrike") RemoveEffect(oPC, eCheckEffect);
eCheckEffect = GetNextEffect(oPC);
}
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink, oPC);
// Enforce vow: unequip prohibited items
for (nSlot = 0; nSlot < 13; nSlot++)
{
oItem = GetItemInSlot(nSlot, oPC);
if (!(GetTag(oItem) == "xp1_mystrashand")
&& !(GetTag(oItem) == "H2_SenseiAmulet")
&& !(GetResRef(oItem) == "prc_sk_mblade_bs")
&& !(GetResRef(oItem) == "prc_sk_mblade_th")
&& !(GetResRef(oItem) == "prc_sk_mblade_ss")
&& !(GetResRef(oItem) == "prc_sk_mblade_ls"))
{
if ((GetIsItemPropertyValid(GetFirstItemProperty(oItem)) && !(GetItemPropertyTag(GetFirstItemProperty(oItem)) == "Tag_PRC_OnHitKeeper")
&& !(nSlot == 4 || nSlot == 5))
|| (nSlot == 1 && GetBaseAC(oItem) >= 1)
|| (nSlot == 5 && (GetBaseItemType(oItem) == BASE_ITEM_SMALLSHIELD
|| GetBaseItemType(oItem) == BASE_ITEM_LARGESHIELD
|| GetBaseItemType(oItem) == BASE_ITEM_TOWERSHIELD)))
{
AssignCommand(oPC, ClearAllActions(TRUE));
AssignCommand(oPC, ActionUnequipItem(oItem));
FloatingTextStringOnCreature(GetName(oItem) + " would break your vow!", oPC, FALSE);
}
}
}
// Register unequip hook
AddEventScript(oPC, EVENT_ONPLAYERUNEQUIPITEM, "ft_vowofpoverty", TRUE, FALSE);
}
// OnEquip: enforce vow for equipped weapons
else if (nEvent == EVENT_ONPLAYEREQUIPITEM)
{
oItem = GetPCItemLastEquipped();
int iWeaponAllowed = (GetBaseItemType(oItem) == BASE_ITEM_CLUB
|| GetBaseItemType(oItem) == BASE_ITEM_DAGGER
|| GetBaseItemType(oItem) == BASE_ITEM_DART
|| GetBaseItemType(oItem) == BASE_ITEM_HEAVYCROSSBOW
|| GetBaseItemType(oItem) == BASE_ITEM_LIGHTCROSSBOW
|| GetBaseItemType(oItem) == BASE_ITEM_LIGHTMACE
|| GetBaseItemType(oItem) == BASE_ITEM_MORNINGSTAR
|| GetBaseItemType(oItem) == BASE_ITEM_QUARTERSTAFF
|| GetBaseItemType(oItem) == BASE_ITEM_SICKLE
|| GetBaseItemType(oItem) == BASE_ITEM_SLING
|| GetBaseItemType(oItem) == BASE_ITEM_SHORTSPEAR
|| GetBaseItemType(oItem) == BASE_ITEM_BOLT
|| GetBaseItemType(oItem) == BASE_ITEM_GOAD
|| GetBaseItemType(oItem) == BASE_ITEM_KATAR
|| GetBaseItemType(oItem) == BASE_ITEM_HEAVY_MACE
|| GetBaseItemType(oItem) == BASE_ITEM_BULLET);
int iMagic = 0;
itemproperty eCheckIP = GetFirstItemProperty(oItem);
while (GetIsItemPropertyValid(eCheckIP))
{
if (!(GetItemPropertyTag(eCheckIP) == "Sanctify1")
&& !(GetItemPropertyTag(eCheckIP) == "Sanctify2")
&& !(GetItemPropertyTag(eCheckIP) == "Sanctify3")
&& !(GetItemPropertyTag(eCheckIP) == "Sanctify4"))
iMagic = 1;
eCheckIP = GetNextItemProperty(oItem);
}
if (!(GetTag(oItem) == "xp1_mystrashand")
&& !(GetTag(oItem) == "H2_SenseiAmulet")
&& !(GetResRef(oItem) == "prc_sk_mblade_bs")
&& !(GetResRef(oItem) == "prc_sk_mblade_th")
&& !(GetResRef(oItem) == "prc_sk_mblade_ss")
&& !(GetResRef(oItem) == "prc_sk_mblade_ls"))
{
if ((IPGetIsMeleeWeapon(oItem) || GetWeaponRanged(oItem)) && (iMagic || !iWeaponAllowed))
{
if (!(GetBaseItemType(oItem) == BASE_ITEM_SLING && GetItemPropertyType(GetFirstItemProperty(oItem)) == ITEM_PROPERTY_MIGHTY))
{
AssignCommand(oPC, ClearAllActions(TRUE));
AssignCommand(oPC, ActionUnequipItem(oItem));
FloatingTextStringOnCreature(GetName(oItem) + " would break your vow!", oPC, FALSE);
}
}
}
}
// OnUnequip: remove VoP-tagged properties from the unequipped item
else if (nEvent == EVENT_ONPLAYERUNEQUIPITEM)
{
oItem = GetPCItemLastUnequipped();
if (IPGetIsMeleeWeapon(oItem) || GetWeaponRanged(oItem))
RemoveVoPProperties(oItem);
}
}
/* void main()
{
int nEvent = GetRunningEvent();
if(DEBUG) DoDebug("prc_forsaker running, event: " + IntToString(nEvent));
@@ -186,13 +435,13 @@ void main()
SetCompositeBonus(oSkin, "VoPBoostStat"+IntToString(stat), value, ITEM_PROPERTY_ABILITY_BONUS, stat);
}
}
/* //Applying stat boosts
if(GetPersistantLocalInt(oPC, "VoPBoost"+IntToString(nLevelCheck)) >= 10)
{
int stat = GetPersistantLocalInt(oPC, "VoPBoost"+IntToString(nLevelCheck)) - 10;
int value = 2 * (1 + (nLevel - nLevelCheck) / 4);
SetCompositeBonus(oSkin, "VoPBoostStat"+IntToString(stat), value, ITEM_PROPERTY_ABILITY_BONUS, stat);
} */
//:: Applying stat boosts
// if(GetPersistantLocalInt(oPC, "VoPBoost"+IntToString(nLevelCheck)) >= 10)
// {
// int stat = GetPersistantLocalInt(oPC, "VoPBoost"+IntToString(nLevelCheck)) - 10;
// int value = 2 * (1 + (nLevel - nLevelCheck) / 4);
// SetCompositeBonus(oSkin, "VoPBoostStat"+IntToString(stat), value, ITEM_PROPERTY_ABILITY_BONUS, stat);
// }
//Call exalted feat for each even level
if (!GetPersistantLocalInt(oPC, "VoPFeat"+IntToString(nLevelCheck)) && (nLevelCheck-(nLevelCheck/2)*2 == 0))
@@ -285,7 +534,7 @@ void main()
//Remove bonus from unequiped weapons
oItem = GetPCItemLastUnequipped();
if(IPGetIsMeleeWeapon(oItem) || GetWeaponRanged(oItem)) IPRemoveAllItemProperties(oItem, DURATION_TYPE_PERMANENT);
if(IPGetIsMeleeWeapon(oItem) || GetWeaponRanged(oItem)) IPRemoveAllItemProperties(oItem, DURATION_TYPE_TEMPORARY);
AddEventScript(oPC, EVENT_SCRIPT_MODULE_ON_EQUIP_ITEM, "ft_vowofpoverty", TRUE, FALSE);
}
@@ -338,5 +587,5 @@ void main()
}
}
}
}
} */

View File

@@ -20,6 +20,9 @@
#include "inc_epicspells"
#include "prc_inc_shifting"
// Returns TRUE if oCreature has any smite feature (ignores remaining uses)
int GetCanSmite(object oCreature);
int CheckInvokerAbilityFocus(object oPC = OBJECT_SELF);
// Prevents a Man at Arms from taking improved critical
@@ -97,6 +100,40 @@ int _GetSizeForPrereq(object oPC)
// BEGIN FUNCTIONS
// ---------------
int GetCanSmite(object oPC = OBJECT_SELF)
{
return (GetLevelByClass(CLASS_TYPE_SANCTIFIED_MIND, oPC) > 1)
|| GetHasFeat(FEAT_SMITE_GOOD_ALIGN, oPC, TRUE)
|| GetHasFeat(FEAT_SMITE_GOOD, oPC, TRUE)
|| GetHasFeat(FEAT_SMITE_UNDEAD, oPC, TRUE)
|| GetHasFeat(FEAT_TEMPLATE_CELESTIAL_SMITE_EVIL, oPC, TRUE)
|| GetHasFeat(FEAT_TEMPLATE_FIENDISH_SMITE_GOOD, oPC, TRUE)
|| GetHasFeat(FEAT_TEMPLATE_HALF_CELESTIAL_HOLY_SMITE, oPC, TRUE)
|| GetHasFeat(FEAT_TEMPLATE_HALF_FIENDISH_SMITE_GOOD, oPC, TRUE)
|| GetHasFeat(FEAT_SAPPHIRE_SMITE, oPC, TRUE)
|| GetHasFeat(FEAT_CRUSADER_SMITE, oPC, TRUE)
|| GetHasFeat(FEAT_SMITE_OPPOSITION, oPC, TRUE)
|| GetHasFeat(FEAT_KIAI_SMITE, oPC, TRUE)
|| GetHasFeat(FEAT_CULTIST_SMITE_MAGE, oPC, TRUE)
|| GetHasFeat(FEAT_SMITE_CHAOS, oPC, TRUE)
|| GetHasFeat(FEAT_SHADOWBANE_SMITE, oPC, TRUE)
|| GetHasFeat(FEAT_SMITE_EVIL, oPC, TRUE)
|| GetHasFeat(FEAT_KILLOREN_ASPECT_D, oPC, TRUE);
}
int InvokeDivineWrath(object oPC = OBJECT_SELF)
{
if(GetHasFeat(FEAT_INVOKE_DIVINE_WRATH))
{
if(!GetCanSmite(oPC))
{
SendMessageToPC(oPC, "You must have Smite as a class ability to take Invoke Divine Wrath. Please reslect your feats.");
return TRUE;
}
}
return FALSE;
}
//:: Eldritch Disciple gets one of these abilities at 1st level,
//:: and another ability every three levels thereafter (4th, 7th,
//:: and 10th level).
@@ -3006,6 +3043,7 @@ void main()
|| CheckDivineGifts()
|| DragonHeartFeats()
|| DiamondDragonFeats()
|| InvokeDivineWrath()
//|| Blightbringer()
//|| Shaman()
)

View File

@@ -185,10 +185,6 @@ void main()
if(!GetHasFeat(FEAT_VOWOFPOVERTY,oPC))
{
// REMOVED: Aggressive inventory scanning that was removing all magical items
// This was causing permanent property loss for players
// The Forsaker class should still prevent magical item usage through equip events
if(GetIsUnarmed(oPC) && (nForsakerLvl >= 3)) //If it is unarmed, give DR bypass
{
ApplyEffectToObject(DURATION_TYPE_PERMANENT,EffectAttackIncrease(nBonus),oPC);

View File

@@ -11,7 +11,7 @@ void main()
object oHelm = GetItemInSlot(INVENTORY_SLOT_HEAD, oPC);
string sResRef = GetResRef(oHelm);
if(sResRef == "prc_crown_mght")
if(sResRef == "prc_crown_might")
{
//+8 STR 1 round
effect eLink = EffectVisualEffect(VFX_DUR_MIND_AFFECTING_POSITIVE);

View File

@@ -5016,7 +5016,7 @@ Use: Selected.</entry>
<entry id="16444" lang="en" sex="m">grey elves</entry>
<entry id="16445" lang="en" sex="m">Gray elves are the most noble and regal of all elves. Taller and grander in physical appearance than others of their race, gray elves have a reputation for being aloof and arrogant (even by elven standards). They certainly are more reclusive than high elves, living in isolated mountain citadels and allowing entry only to a select few outsiders. They have either silver hair and amber eyes or pale golden hair and violet eyes. They prefer clothing of white, silver, yellow, or gold, with cloaks of deep blue or purple.
+2 Dexterity, +2 Intelligence, --2 Strength, --2 Constitution.
+2 Dexterity, +2 Intelligence, -2 Strength, -2 Constitution.
Medium: As Medium creatures, gray elves have no special bonuses or penalties due to their size.
@@ -46936,7 +46936,7 @@ Lore: 8 ranks.
Feat: Skill Focus: Lore
Spells: Ability to cast arcane spells of 3rd level or higher.
ABILITIES:
CLASS FEATURES:
Level
1: Bone Skin I - Add +2 to AC. This increases by another +2 for every four levels of Pale Master.