2025/12/28 Early update
Wemics have 5 RHD. Fixed Whirling Blade. Factotum now regenerates Inspiration after logging off and back on in he same server session. Spellfire Wielder can't get extra spell levels from overcharging items. Only one Chilling Fog at a time, casting a new one destroys the old one. Heart of Fire now has a Chakra totem. Pearl of Black doubt should be a bit more accurate. Tweaked and tested psionic Keen Edge. Fixed reversed sign for Echoblade validity in prc_equip. Havoc Mage's Battlecast should clean up properly. Updated readme.
This commit is contained in:
@@ -18,4 +18,4 @@ Extract archive contents to your NWN directory according to file type:
|
|||||||
| erf | erf |
|
| erf | erf |
|
||||||
| tlk | tlk |
|
| tlk | tlk |
|
||||||
| 2da | override |
|
| 2da | override |
|
||||||
| mod | module |
|
| mod | modules |
|
||||||
@@ -52,7 +52,7 @@
|
|||||||
48 **** 0 **** **** ****
|
48 **** 0 **** **** ****
|
||||||
49 **** 0 **** **** ****
|
49 **** 0 **** **** ****
|
||||||
50 Drider 4 Aberration 11 6
|
50 Drider 4 Aberration 11 6
|
||||||
51 Wemic 3 MonsterousHumanoid 15 4
|
51 Wemic 3 MonsterousHumanoid 15 5
|
||||||
52 Plant **** **** **** ****
|
52 Plant **** **** **** ****
|
||||||
53 Brownie 4 **** **** ****
|
53 Brownie 4 **** **** ****
|
||||||
54 Krinth 0 **** **** ****
|
54 Krinth 0 **** **** ****
|
||||||
|
|||||||
@@ -8103,7 +8103,12 @@ void AttackLoopLogic(object oDefender, object oAttacker,
|
|||||||
if (DEBUG) DoDebug("entered AttackLoopLogic: bFirstAttack = " + IntToString(bFirstAttack) + ", cleave = " + IntToString(bIsCleaveAttack) + ", current action = " + GetActionName(iAction));
|
if (DEBUG) DoDebug("entered AttackLoopLogic: bFirstAttack = " + IntToString(bFirstAttack) + ", cleave = " + IntToString(bIsCleaveAttack) + ", current action = " + GetActionName(iAction));
|
||||||
if (DEBUG) DoDebug("AttackLoopLogic: iMainAttacks = " + IntToString(iMainAttacks) + ", iOffHandAttacks = " + IntToString(iOffHandAttacks) + ", iBonusAttacks = " + IntToString(iBonusAttacks));
|
if (DEBUG) DoDebug("AttackLoopLogic: iMainAttacks = " + IntToString(iMainAttacks) + ", iOffHandAttacks = " + IntToString(iOffHandAttacks) + ", iBonusAttacks = " + IntToString(iBonusAttacks));
|
||||||
|
|
||||||
int bIsRangedAttack = sAttackVars.bIsRangedWeapon || sAttackVars.iTouchAttackType == TOUCH_ATTACK_RANGED_SPELL || sAttackVars.iTouchAttackType == TOUCH_ATTACK_RANGED;
|
//int bIsRangedAttack = sAttackVars.bIsRangedWeapon || sAttackVars.iTouchAttackType == TOUCH_ATTACK_RANGED_SPELL || sAttackVars.iTouchAttackType == TOUCH_ATTACK_RANGED;
|
||||||
|
|
||||||
|
int bIsRangedAttack = sAttackVars.bIsRangedWeapon ||
|
||||||
|
sAttackVars.iTouchAttackType == TOUCH_ATTACK_RANGED_SPELL ||
|
||||||
|
sAttackVars.iTouchAttackType == TOUCH_ATTACK_RANGED ||
|
||||||
|
GetLocalInt(oAttacker, "WhirlingBlade");
|
||||||
|
|
||||||
// check for valid target etc., but only if it is not a cleave or circle kick (in this case we checked all of this before)
|
// check for valid target etc., but only if it is not a cleave or circle kick (in this case we checked all of this before)
|
||||||
if (!bIsCleaveAttack)
|
if (!bIsCleaveAttack)
|
||||||
|
|||||||
@@ -49,6 +49,8 @@ const int BRILLIANCE_SLOT_3 = 3919;
|
|||||||
//////////////////////////////////////////////////
|
//////////////////////////////////////////////////
|
||||||
/* Function definitions */
|
/* Function definitions */
|
||||||
//////////////////////////////////////////////////
|
//////////////////////////////////////////////////
|
||||||
|
void TriggerInspiration(object oPC, int nCombat);
|
||||||
|
|
||||||
|
|
||||||
void PrepareArcDilSpell(object oPC, int nSpell)
|
void PrepareArcDilSpell(object oPC, int nSpell)
|
||||||
{
|
{
|
||||||
@@ -264,6 +266,21 @@ void FactotumTriggerAbil(object oPC, int nAbil)
|
|||||||
IPSafeAddItemProperty(oSkin, ipIP, 60.0, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
|
IPSafeAddItemProperty(oSkin, ipIP, 60.0, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TriggerInspiration(object oPC, int nCombat)
|
||||||
|
{
|
||||||
|
SetLocalInt(oPC, "InspirationHBRunning", TRUE);
|
||||||
|
DelayCommand(0.249, DeleteLocalInt(oPC, "InspirationHBRunning"));
|
||||||
|
int nCurrent = GetIsInCombat(oPC);
|
||||||
|
// We just entered combat
|
||||||
|
if (nCurrent == TRUE && nCombat == FALSE)
|
||||||
|
SetInspiration(oPC);
|
||||||
|
else if (nCurrent == FALSE && nCombat == TRUE) // Just left combat
|
||||||
|
ClearInspiration(oPC);
|
||||||
|
|
||||||
|
DelayCommand(0.25, TriggerInspiration(oPC, nCurrent));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*void AddCunningBrillianceAbility(object oPC, int nAbil)
|
/*void AddCunningBrillianceAbility(object oPC, int nAbil)
|
||||||
{
|
{
|
||||||
if (DEBUG) DoDebug("AddCunningBrillianceAbility "+IntToString(nAbil));
|
if (DEBUG) DoDebug("AddCunningBrillianceAbility "+IntToString(nAbil));
|
||||||
|
|||||||
@@ -487,7 +487,8 @@ void SpellfireChargeItem(object oPC, object oItem)
|
|||||||
AddSpellfireLevels(oPC, nNewCharges - 50);
|
AddSpellfireLevels(oPC, nNewCharges - 50);
|
||||||
nNewCharges = 50;
|
nNewCharges = 50;
|
||||||
}
|
}
|
||||||
SetItemCharges(oItem, nCharges + nExpend);
|
//SetItemCharges(oItem, nCharges + nExpend);
|
||||||
|
SetItemCharges(oItem, nNewCharges);
|
||||||
//Assuming 50 is the maximum
|
//Assuming 50 is the maximum
|
||||||
//refunding excess charges
|
//refunding excess charges
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,10 +21,40 @@ level before dispersing.
|
|||||||
#include "inv_inc_invfunc"
|
#include "inv_inc_invfunc"
|
||||||
#include "inv_invokehook"
|
#include "inv_invokehook"
|
||||||
|
|
||||||
|
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
if(!PreInvocationCastCode()) return;
|
if(!PreInvocationCastCode()) return;
|
||||||
|
|
||||||
|
object oCaster = OBJECT_SELF;
|
||||||
|
object oExistingFog = GetLocalObject(oCaster, "ChillingFog");
|
||||||
|
|
||||||
|
// Check if there's an existing fog and destroy it
|
||||||
|
if(GetIsObjectValid(oExistingFog))
|
||||||
|
{
|
||||||
|
DestroyObject(oExistingFog);
|
||||||
|
DeleteLocalObject(oCaster, "ChillingFog");
|
||||||
|
}
|
||||||
|
|
||||||
|
//Declare major variables including Area of Effect Object
|
||||||
|
location lTarget = PRCGetSpellTargetLocation();
|
||||||
|
int CasterLvl = GetInvokerLevel(oCaster, GetInvokingClass());
|
||||||
|
float fDuration = TurnsToSeconds(CasterLvl);
|
||||||
|
effect eAOE = EffectAreaOfEffect(INVOKE_AOE_CHILLFOG);
|
||||||
|
effect eImpact = EffectVisualEffect(257);
|
||||||
|
ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eImpact, lTarget);
|
||||||
|
ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eAOE, lTarget, fDuration);
|
||||||
|
|
||||||
|
object oAoE = GetAreaOfEffectObject(lTarget, "INVOKE_AOE_CHILLFOG");
|
||||||
|
SetAllAoEInts(INVOKE_CHILLING_FOG, oAoE, GetInvocationSaveDC(OBJECT_INVALID, OBJECT_SELF, INVOKE_CHILLING_FOG), 0, CasterLvl);
|
||||||
|
SetLocalObject(oCaster, "ChillingFog", oAoE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* void main()
|
||||||
|
{
|
||||||
|
if(!PreInvocationCastCode()) return;
|
||||||
|
|
||||||
object oCaster = OBJECT_SELF;
|
object oCaster = OBJECT_SELF;
|
||||||
if(GetIsObjectValid(GetLocalObject(oCaster, "ChillingFog")))
|
if(GetIsObjectValid(GetLocalObject(oCaster, "ChillingFog")))
|
||||||
{
|
{
|
||||||
@@ -46,4 +76,4 @@ void main()
|
|||||||
object oAoE = GetAreaOfEffectObject(lTarget, "INVOKE_AOE_CHILLFOG");
|
object oAoE = GetAreaOfEffectObject(lTarget, "INVOKE_AOE_CHILLFOG");
|
||||||
SetAllAoEInts(INVOKE_CHILLING_FOG, oAoE, GetInvocationSaveDC(OBJECT_INVALID, OBJECT_SELF, INVOKE_CHILLING_FOG), 0, CasterLvl);
|
SetAllAoEInts(INVOKE_CHILLING_FOG, oAoE, GetInvocationSaveDC(OBJECT_INVALID, OBJECT_SELF, INVOKE_CHILLING_FOG), 0, CasterLvl);
|
||||||
SetLocalObject(oCaster, "ChillingFog", oAoE);
|
SetLocalObject(oCaster, "ChillingFog", oAoE);
|
||||||
}
|
} */
|
||||||
@@ -44,4 +44,41 @@ void main()
|
|||||||
IPSafeAddItemProperty(GetItemInSlot(INVENTORY_SLOT_CHEST, oMeldshaper), ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, 1), 99999.0, X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
|
IPSafeAddItemProperty(GetItemInSlot(INVENTORY_SLOT_CHEST, oMeldshaper), ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, 1), 99999.0, X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
|
||||||
AddEventScript(GetItemInSlot(INVENTORY_SLOT_CHEST, oMeldshaper), EVENT_ITEM_ONHIT, "moi_events", TRUE, FALSE);
|
AddEventScript(GetItemInSlot(INVENTORY_SLOT_CHEST, oMeldshaper), EVENT_ITEM_ONHIT, "moi_events", TRUE, FALSE);
|
||||||
}
|
}
|
||||||
|
else if (GetIsMeldBound(oMeldshaper, MELD_HEART_OF_FIRE) == CHAKRA_TOTEM)
|
||||||
|
{
|
||||||
|
// Add fire damage to natural weapons/unarmed strikes
|
||||||
|
object oTarget = GetItemInSlot(INVENTORY_SLOT_ARMS, oMeldshaper);
|
||||||
|
|
||||||
|
// If no gloves, apply to PC skin as fallback
|
||||||
|
if (!GetIsObjectValid(oTarget))
|
||||||
|
{
|
||||||
|
oTarget = GetPCSkin(oMeldshaper);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Apply fire damage based on essentia invested
|
||||||
|
int nDamageBonus = EssentiaToD4(nEssentia);
|
||||||
|
if (nDamageBonus != -1)
|
||||||
|
{
|
||||||
|
IPSafeAddItemProperty(oTarget,
|
||||||
|
ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_FIRE, nDamageBonus),
|
||||||
|
9999.0,
|
||||||
|
X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* else if (GetIsMeldBound(oMeldshaper, MELD_HEART_OF_FIRE) == CHAKRA_TOTEM)
|
||||||
|
{
|
||||||
|
// Add fire damage to natural weapons based on essentia invested
|
||||||
|
int nDamageDice = nEssentia;
|
||||||
|
if (nDamageDice > 0)
|
||||||
|
{
|
||||||
|
effect eDamage = EffectDamageIncrease(DAMAGE_BONUS_1d4, DAMAGE_TYPE_FIRE);
|
||||||
|
// Stack the effect for each point of essentia
|
||||||
|
int i;
|
||||||
|
for (i = 1; i < nDamageDice; i++)
|
||||||
|
{
|
||||||
|
eDamage = EffectLinkEffects(eDamage, EffectDamageIncrease(DAMAGE_BONUS_1d4, DAMAGE_TYPE_FIRE));
|
||||||
|
}
|
||||||
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, SupernaturalEffect(eDamage), oMeldshaper, 9999.0);
|
||||||
|
}
|
||||||
|
} */
|
||||||
}
|
}
|
||||||
@@ -121,6 +121,13 @@ void main()
|
|||||||
|
|
||||||
if (nBonus > 0)
|
if (nBonus > 0)
|
||||||
{
|
{
|
||||||
|
if(GetLocalInt(oTarget, "PearlOfBlackDoubt_JustHit"))
|
||||||
|
{
|
||||||
|
DeleteLocalInt(oTarget, "PearlOfBlackDoubt_JustHit");
|
||||||
|
// Skip this heartbeat's bonus calculation
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if(DEBUG) DoDebug("Applying AC Bonus: " + IntToString(nBonus));
|
if(DEBUG) DoDebug("Applying AC Bonus: " + IntToString(nBonus));
|
||||||
|
|
||||||
effect eAC = EffectACIncrease(nBonus);
|
effect eAC = EffectACIncrease(nBonus);
|
||||||
|
|||||||
@@ -39,7 +39,6 @@ void main()
|
|||||||
check psi_spellhook to find out more
|
check psi_spellhook to find out more
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (!PsiPrePowerCastCode())
|
if (!PsiPrePowerCastCode())
|
||||||
{
|
{
|
||||||
// If code within the PrePowerCastHook (i.e. UMD) reports FALSE, do not run this spell
|
// If code within the PrePowerCastHook (i.e. UMD) reports FALSE, do not run this spell
|
||||||
@@ -49,24 +48,24 @@ void main()
|
|||||||
// End of Spell Cast Hook
|
// End of Spell Cast Hook
|
||||||
|
|
||||||
object oManifester = OBJECT_SELF;
|
object oManifester = OBJECT_SELF;
|
||||||
object oTarget = IPGetTargetedOrEquippedMeleeWeapon();
|
object oItem = IPGetTargetedOrEquippedMeleeWeapon();
|
||||||
|
|
||||||
// Validity check
|
// Validity check
|
||||||
if(!GetIsObjectValid(oTarget))
|
if(!GetIsObjectValid(oItem))
|
||||||
{
|
{
|
||||||
FloatingTextStrRefOnCreature(83615, oManifester); // Item must be weapon or creature holding a weapon
|
FloatingTextStrRefOnCreature(83615, oManifester); // Item must be weapon or creature holding a weapon
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct manifestation manif =
|
struct manifestation manif =
|
||||||
EvaluateManifestation(oManifester, oTarget,
|
EvaluateManifestation(oManifester, oItem,
|
||||||
PowerAugmentationProfile(),
|
PowerAugmentationProfile(),
|
||||||
METAPSIONIC_EXTEND
|
METAPSIONIC_EXTEND
|
||||||
);
|
);
|
||||||
|
|
||||||
if(manif.bCanManifest)
|
if(manif.bCanManifest)
|
||||||
{
|
{
|
||||||
int nDamageType = GetWeaponDamageType(oTarget);
|
int nDamageType = GetWeaponDamageType(oItem);
|
||||||
effect eVis = EffectVisualEffect(VFX_IMP_SUPER_HEROISM);
|
effect eVis = EffectVisualEffect(VFX_IMP_SUPER_HEROISM);
|
||||||
float fDuration = 600.0f * manif.nManifesterLevel;
|
float fDuration = 600.0f * manif.nManifesterLevel;
|
||||||
if(manif.bExtend) fDuration *= 2;
|
if(manif.bExtend) fDuration *= 2;
|
||||||
@@ -74,9 +73,10 @@ void main()
|
|||||||
if(nDamageType == DAMAGE_TYPE_PIERCING ||
|
if(nDamageType == DAMAGE_TYPE_PIERCING ||
|
||||||
nDamageType == DAMAGE_TYPE_SLASHING
|
nDamageType == DAMAGE_TYPE_SLASHING
|
||||||
)
|
)
|
||||||
|
|
||||||
{
|
{
|
||||||
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, GetItemPossessor(oTarget));
|
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, GetItemPossessor(oItem));
|
||||||
IPSafeAddItemProperty(oTarget, ItemPropertyKeen(), fDuration, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, TRUE, TRUE);
|
IPSafeAddItemProperty(oItem, ItemPropertyKeen(), fDuration, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -177,7 +177,7 @@ void main()
|
|||||||
// Only remove echoblade for weapon types
|
// Only remove echoblade for weapon types
|
||||||
while(GetIsEffectValid(eEffect))
|
while(GetIsEffectValid(eEffect))
|
||||||
{
|
{
|
||||||
if(GetEffectTag(eEffect) != "Echoblade")
|
if(GetEffectTag(eEffect) == "Echoblade")
|
||||||
RemoveEffect(oPC, eEffect);
|
RemoveEffect(oPC, eEffect);
|
||||||
eEffect = GetNextEffect(oPC);
|
eEffect = GetNextEffect(oPC);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
#include "prc_inc_factotum"
|
#include "prc_inc_factotum"
|
||||||
#include "inc_dynconv"
|
#include "inc_dynconv"
|
||||||
|
|
||||||
void TriggerInspiration(object oPC, int nCombat);
|
//:: Moved to prc_inc_factotum --Jaysyn
|
||||||
|
/* void TriggerInspiration(object oPC, int nCombat);
|
||||||
|
|
||||||
void TriggerInspiration(object oPC, int nCombat)
|
void TriggerInspiration(object oPC, int nCombat)
|
||||||
{
|
{
|
||||||
@@ -16,7 +17,7 @@ void TriggerInspiration(object oPC, int nCombat)
|
|||||||
|
|
||||||
DelayCommand(0.25, TriggerInspiration(oPC, nCurrent));
|
DelayCommand(0.25, TriggerInspiration(oPC, nCurrent));
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
int nEvent = GetRunningEvent();
|
int nEvent = GetRunningEvent();
|
||||||
@@ -68,6 +69,16 @@ void main()
|
|||||||
SetLocalInt(oPC, "InspirationHB", TRUE);
|
SetLocalInt(oPC, "InspirationHB", TRUE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if(EVENT_ONCLIENTENTER)
|
||||||
|
{
|
||||||
|
if(GetLevelByClass(CLASS_TYPE_FACTOTUM, oPC) > 0)
|
||||||
|
{
|
||||||
|
DeleteLocalInt(oPC, "InspirationHB");
|
||||||
|
DeleteLocalInt(oPC, "InspirationHBRunning");
|
||||||
|
TriggerInspiration(oPC, FALSE);
|
||||||
|
SetLocalInt(oPC, "InspirationHB", TRUE);
|
||||||
|
}
|
||||||
|
}
|
||||||
else if(nEvent == EVENT_ONPLAYERREST_FINISHED && nClass >= 2)
|
else if(nEvent == EVENT_ONPLAYERREST_FINISHED && nClass >= 2)
|
||||||
{
|
{
|
||||||
AssignCommand(oPC, ClearAllActions(TRUE));
|
AssignCommand(oPC, ClearAllActions(TRUE));
|
||||||
|
|||||||
@@ -6,6 +6,46 @@
|
|||||||
#include "prc_alterations"
|
#include "prc_alterations"
|
||||||
|
|
||||||
void main()
|
void main()
|
||||||
|
{
|
||||||
|
object oPC = OBJECT_SELF;
|
||||||
|
string sMsg;
|
||||||
|
|
||||||
|
if (!GetLocalInt(oPC, "HavocMageBattlecast"))
|
||||||
|
{
|
||||||
|
// Activate
|
||||||
|
effect eFeat = EffectBonusFeat(FEAT_EPIC_IMPROVED_COMBAT_CASTING);
|
||||||
|
eFeat = UnyieldingEffect(eFeat);
|
||||||
|
TagEffect(eFeat, "BATTLECAST_FEAT");
|
||||||
|
|
||||||
|
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eFeat, oPC);
|
||||||
|
SetLocalInt(oPC, "HavocMageBattlecast", TRUE);
|
||||||
|
|
||||||
|
sMsg = "*Battlecast Activated*";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Deactivate: remove the tagged unyielding effect
|
||||||
|
effect e = GetFirstEffect(oPC);
|
||||||
|
while (GetIsEffectValid(e))
|
||||||
|
{
|
||||||
|
if (GetEffectTag(e) == "BATTLECAST_FEAT")
|
||||||
|
{
|
||||||
|
RemoveEffect(oPC, e);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
e = GetNextEffect(oPC);
|
||||||
|
}
|
||||||
|
|
||||||
|
DeleteLocalInt(oPC, "HavocMageBattlecast");
|
||||||
|
sMsg = "*Battlecast Deactivated*";
|
||||||
|
}
|
||||||
|
|
||||||
|
FloatingTextStringOnCreature(sMsg, oPC, FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* void main()
|
||||||
{
|
{
|
||||||
|
|
||||||
object oPC = OBJECT_SELF;
|
object oPC = OBJECT_SELF;
|
||||||
@@ -29,4 +69,4 @@ void main()
|
|||||||
}
|
}
|
||||||
|
|
||||||
FloatingTextStringOnCreature(nMes, oPC, FALSE);
|
FloatingTextStringOnCreature(nMes, oPC, FALSE);
|
||||||
}
|
} */
|
||||||
@@ -8,6 +8,7 @@
|
|||||||
#include "prc_inc_dragsham"
|
#include "prc_inc_dragsham"
|
||||||
#include "shd_inc_myst"
|
#include "shd_inc_myst"
|
||||||
#include "prc_inc_template"
|
#include "prc_inc_template"
|
||||||
|
#include "prc_inc_factotum"
|
||||||
|
|
||||||
void RestoreForsakerAbilities(object oPC)
|
void RestoreForsakerAbilities(object oPC)
|
||||||
{
|
{
|
||||||
@@ -245,6 +246,17 @@ void main()
|
|||||||
RestoreForsakerAbilities(oPC);
|
RestoreForsakerAbilities(oPC);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(GetLevelByClass(CLASS_TYPE_FACTOTUM, oPC) > 0)
|
||||||
|
{
|
||||||
|
// Re-add all event hooks that were lost during disconnect
|
||||||
|
AddEventScript(oPC, EVENT_ONPLAYERREST_FINISHED, "prc_factotum", FALSE, FALSE);
|
||||||
|
// Reinitialize the Inspiration system
|
||||||
|
DeleteLocalInt(oPC, "InspirationHB");
|
||||||
|
DeleteLocalInt(oPC, "InspirationHBRunning");
|
||||||
|
TriggerInspiration(oPC, FALSE);
|
||||||
|
SetLocalInt(oPC, "InspirationHB", TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
ResetTouchOfVitality(oPC);
|
ResetTouchOfVitality(oPC);
|
||||||
DelayCommand(0.15, DeleteLocalInt(oPC,"ONENTER"));
|
DelayCommand(0.15, DeleteLocalInt(oPC,"ONENTER"));
|
||||||
|
|
||||||
|
|||||||
@@ -620,10 +620,11 @@ void main()
|
|||||||
if(DEBUG) DoDebug("prc_onhit: PoBD onHit >> restting AC.");
|
if(DEBUG) DoDebug("prc_onhit: PoBD onHit >> restting AC.");
|
||||||
DeleteLocalInt(oSpellOrigin, "PearlOfBlackDoubtBonus");
|
DeleteLocalInt(oSpellOrigin, "PearlOfBlackDoubtBonus");
|
||||||
RemoveEffect(oSpellOrigin, eEffect);
|
RemoveEffect(oSpellOrigin, eEffect);
|
||||||
|
|
||||||
|
SetLocalInt(oSpellOrigin, "PearlOfBlackDoubt_JustHit", TRUE);
|
||||||
}
|
}
|
||||||
eEffect = GetNextEffect(oSpellOrigin);
|
eEffect = GetNextEffect(oSpellOrigin);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
// Tactics of the Wolf
|
// Tactics of the Wolf
|
||||||
if(GetHasSpellEffect(MOVE_WR_TACTICS_WOLF, oSpellOrigin) && GetBaseItemType(oItem) != BASE_ITEM_ARMOR)
|
if(GetHasSpellEffect(MOVE_WR_TACTICS_WOLF, oSpellOrigin) && GetBaseItemType(oItem) != BASE_ITEM_ARMOR)
|
||||||
|
|||||||
@@ -94,19 +94,48 @@ void main()
|
|||||||
float fLength = FeetToMeters(60.0);
|
float fLength = FeetToMeters(60.0);
|
||||||
|
|
||||||
effect eNone;
|
effect eNone;
|
||||||
|
|
||||||
SetLocalInt(oPC, "WhirlingBlade", TRUE);
|
SetLocalInt(oPC, "WhirlingBlade", TRUE);
|
||||||
|
|
||||||
|
// Store original location to prevent movement
|
||||||
|
location lOrigin = GetLocation(oPC);
|
||||||
|
|
||||||
|
object oTarget = MyFirstObjectInShape(SHAPE_SPELLCYLINDER, fLength, lTarget, TRUE,
|
||||||
|
OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR | OBJECT_TYPE_PLACEABLE, vOrigin);
|
||||||
|
|
||||||
|
while(GetIsObjectValid(oTarget))
|
||||||
|
{
|
||||||
|
if (oTarget != oPC && GetIsReactionTypeHostile(oTarget, oPC))
|
||||||
|
{
|
||||||
|
// Clear actions to prevent automatic movement
|
||||||
|
AssignCommand(oPC, ClearAllActions(TRUE));
|
||||||
|
|
||||||
|
// Perform the attack with stat bonus to BOTH attack and damage
|
||||||
|
DelayCommand(0.0, PerformAttack(oTarget, oPC, eNone, 0.0,
|
||||||
|
nStatBonus, nStatBonus, 0, // ? Fixed: was (nStatBonus, 0, 0)
|
||||||
|
"Whirling Blade: Hit!", "Whirling Blade: Miss!"));
|
||||||
|
|
||||||
|
// Force caster back to original position if they moved
|
||||||
|
DelayCommand(0.1, AssignCommand(oPC, ActionJumpToLocation(lOrigin)));
|
||||||
|
}
|
||||||
|
oTarget = MyNextObjectInShape(SHAPE_SPELLCYLINDER, fLength, lTarget, TRUE,
|
||||||
|
OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR | OBJECT_TYPE_PLACEABLE, vOrigin);
|
||||||
|
}
|
||||||
|
|
||||||
|
DelayCommand(1.0f, DeleteLocalInt(oPC, "WhirlingBlade"));
|
||||||
|
|
||||||
|
/* SetLocalInt(oPC, "WhirlingBlade", TRUE);
|
||||||
|
|
||||||
object oTarget = MyFirstObjectInShape(SHAPE_SPELLCYLINDER, fLength, lTarget, TRUE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR | OBJECT_TYPE_PLACEABLE, vOrigin);
|
object oTarget = MyFirstObjectInShape(SHAPE_SPELLCYLINDER, fLength, lTarget, TRUE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR | OBJECT_TYPE_PLACEABLE, vOrigin);
|
||||||
|
|
||||||
while(GetIsObjectValid(oTarget))
|
while(GetIsObjectValid(oTarget))
|
||||||
{
|
{
|
||||||
if (oTarget != oPC && GetIsReactionTypeHostile(oTarget, oPC))
|
if (oTarget != oPC && GetIsReactionTypeHostile(oTarget, oPC))
|
||||||
{
|
{
|
||||||
DelayCommand(0.0, PerformAttack(oTarget, oPC, eNone, 0.0, nStatBonus, 0, 0, "Whirling Blade: Hit!", "Whirling Blade: Miss!"));
|
DelayCommand(0.0, PerformAttack(oTarget, oPC, eNone, 0.0, nStatBonus, nStatBonus, 0,
|
||||||
|
"Whirling Blade: Hit!", "Whirling Blade: Miss!", TOUCH_ATTACK_RANGED_SPELL));
|
||||||
}
|
}
|
||||||
oTarget = MyNextObjectInShape(SHAPE_SPELLCYLINDER, fLength, lTarget, TRUE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR | OBJECT_TYPE_PLACEABLE, vOrigin);
|
oTarget = MyNextObjectInShape(SHAPE_SPELLCYLINDER, fLength, lTarget, TRUE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR | OBJECT_TYPE_PLACEABLE, vOrigin);
|
||||||
}
|
} */
|
||||||
DelayCommand(1.0f, DeleteLocalInt(oPC, "WhirlingBlade"));
|
DelayCommand(1.0f, DeleteLocalInt(oPC, "WhirlingBlade"));
|
||||||
PRCSetSchool();
|
PRCSetSchool();
|
||||||
}
|
}
|
||||||
Binary file not shown.
@@ -1988,7 +1988,7 @@ An unwilling creature can't be teleported by word of recall. Likewise, a creatur
|
|||||||
<entry id="12765" lang="en" sex="m">Knowledge is power and the quest for knowledge never ends. There is an ever lasting supply of divine lore for you, the epic archivist, to discover.
|
<entry id="12765" lang="en" sex="m">Knowledge is power and the quest for knowledge never ends. There is an ever lasting supply of divine lore for you, the epic archivist, to discover.
|
||||||
|
|
||||||
Hit Die: d6
|
Hit Die: d6
|
||||||
- Skill Points: 4+ Int Modifier.
|
Skill Points: 4+ Int Modifier.
|
||||||
Dark Knowledge (Ex): At 21st level and every 3 levels thereafter, the epic archivist gains an additional use of Dark Knowledge.
|
Dark Knowledge (Ex): At 21st level and every 3 levels thereafter, the epic archivist gains an additional use of Dark Knowledge.
|
||||||
Lore Mastery (Ex): The archivist adds an additional +1 bonus on all Lore skill checks at level 23 and every 5 levels thereafter.
|
Lore Mastery (Ex): The archivist adds an additional +1 bonus on all Lore skill checks at level 23 and every 5 levels thereafter.
|
||||||
Bonus Feats: The epic archivist gains a bonus feat (selected from the list of epic class bonus feats) every three levels higher than 20th.
|
Bonus Feats: The epic archivist gains a bonus feat (selected from the list of epic class bonus feats) every three levels higher than 20th.
|
||||||
@@ -5286,8 +5286,7 @@ Baelnorn Properties: +8 bonus to Hide, Listen, Move Silently, Search, Persuade,
|
|||||||
<entry id="16565" lang="en" sex="m">Myconid</entry>
|
<entry id="16565" lang="en" sex="m">Myconid</entry>
|
||||||
<entry id="16566" lang="en" sex="m">Algoid</entry>
|
<entry id="16566" lang="en" sex="m">Algoid</entry>
|
||||||
<entry id="16567" lang="en" sex="m">****</entry>
|
<entry id="16567" lang="en" sex="m">****</entry>
|
||||||
<entry id="16568" lang="en" sex="m">****
|
<entry id="16568" lang="en" sex="m">****</entry>
|
||||||
</entry>
|
|
||||||
<entry id="16569" lang="en" sex="m">****</entry>
|
<entry id="16569" lang="en" sex="m">****</entry>
|
||||||
<entry id="16570" lang="en" sex="m">****</entry>
|
<entry id="16570" lang="en" sex="m">****</entry>
|
||||||
<entry id="16571" lang="en" sex="m">Abundant Step (Su)</entry>
|
<entry id="16571" lang="en" sex="m">Abundant Step (Su)</entry>
|
||||||
@@ -10516,7 +10515,7 @@ Epic Soulknife:
|
|||||||
|
|
||||||
The epic soulknife is adept at channeling the entirety of his psychic might into the creation of an increasingly potent blade of mental energy.
|
The epic soulknife is adept at channeling the entirety of his psychic might into the creation of an increasingly potent blade of mental energy.
|
||||||
Hit Die: d10
|
Hit Die: d10
|
||||||
Skill Points at Each Additional Level: 4 + Int modifier.
|
Skill Points at Each Additional Level: 4+ Int Modifier.
|
||||||
Mind Blade: At 25th level and every five levels thereafter, the soulknife gains an additional +1 enhancement bonus on attack rolls and damage rolls (+6 at 25th, +7 at 30th, and so on).
|
Mind Blade: At 25th level and every five levels thereafter, the soulknife gains an additional +1 enhancement bonus on attack rolls and damage rolls (+6 at 25th, +7 at 30th, and so on).
|
||||||
Mind Blade Enhancement: The epic soulknife's mind blade gains additional powers as the soulknife gains epic levels. At 22nd level and every four levels thereafter, the soulknife can improve the value of the weapon special abilities on his mind blade by 1 (+5 equivalent bonus at 22nd, +6 at 26th, and so on). As noted in the soulknife class description, reassigning qualities still takes 8 hours of concentration.
|
Mind Blade Enhancement: The epic soulknife's mind blade gains additional powers as the soulknife gains epic levels. At 22nd level and every four levels thereafter, the soulknife can improve the value of the weapon special abilities on his mind blade by 1 (+5 equivalent bonus at 22nd, +6 at 26th, and so on). As noted in the soulknife class description, reassigning qualities still takes 8 hours of concentration.
|
||||||
Psychic strike: The epic soulknife's psychic strike progression continues past 20th level, continuing to grant an additional die (d8) of damage every four levels higher than 19th (+6d8 at 23rd, +7d8 at 27th, and so on).
|
Psychic strike: The epic soulknife's psychic strike progression continues past 20th level, continuing to grant an additional die (d8) of damage every four levels higher than 19th (+6d8 at 23rd, +7d8 at 27th, and so on).
|
||||||
@@ -14756,8 +14755,7 @@ Level:
|
|||||||
<entry id="47155" lang="en" sex="m">Archetypal Form</entry>
|
<entry id="47155" lang="en" sex="m">Archetypal Form</entry>
|
||||||
<entry id="47156" lang="en" sex="m">Type of Feat: Builder's Tool
|
<entry id="47156" lang="en" sex="m">Type of Feat: Builder's Tool
|
||||||
Prerequisite: A creature you don't want people to polymorph into
|
Prerequisite: A creature you don't want people to polymorph into
|
||||||
Specifics: The presence of this feat on a creature, as tested for using GetHasFeat(), prevents the use of it as a template
|
Specifics: The presence of this feat on a creature, as tested for using GetHasFeat(), prevents the use of it as a template by users of PRC polymorphing mechanics (PnP Shifter, Soul Eater, etc.)
|
||||||
by users of PRC polymorphing mechanics (PnP Shifter, Soul Eater, etc.)
|
|
||||||
Use: Automatic, used in the function GetCanShiftIntoCreature() in prc_inc_shifting</entry>
|
Use: Automatic, used in the function GetCanShiftIntoCreature() in prc_inc_shifting</entry>
|
||||||
<entry id="47157" lang="en" sex="m">Soak 4 Damage</entry>
|
<entry id="47157" lang="en" sex="m">Soak 4 Damage</entry>
|
||||||
<entry id="47158" lang="en" sex="m">Soak 6 Damage</entry>
|
<entry id="47158" lang="en" sex="m">Soak 6 Damage</entry>
|
||||||
@@ -23076,7 +23074,7 @@ Special Abilities:
|
|||||||
|
|
||||||
(The following may or may not be in use, depending on the module switch settings)
|
(The following may or may not be in use, depending on the module switch settings)
|
||||||
Level Adjustment: +3
|
Level Adjustment: +3
|
||||||
Racial Hit Dice/Class: 4 of Monstrous Humanoid</entry>
|
Racial Hit Dice/Class: 5 of Monstrous Humanoid</entry>
|
||||||
<entry id="49745" lang="en" sex="m">The wild, empty savannah is not enough to satisfy your natural curiosity about the world for any length of time. Forsaking your own pride, at least for the time being, your wanderings have brought you in contact with the puny Two-Legs who leap so boldly into the face of adventure.</entry>
|
<entry id="49745" lang="en" sex="m">The wild, empty savannah is not enough to satisfy your natural curiosity about the world for any length of time. Forsaking your own pride, at least for the time being, your wanderings have brought you in contact with the puny Two-Legs who leap so boldly into the face of adventure.</entry>
|
||||||
<entry id="49746" lang="en" sex="m">Brownie</entry>
|
<entry id="49746" lang="en" sex="m">Brownie</entry>
|
||||||
<entry id="49747" lang="en" sex="m">brownie</entry>
|
<entry id="49747" lang="en" sex="m">brownie</entry>
|
||||||
@@ -46384,7 +46382,7 @@ Level: 0 1 2 3 4 5 6 7 8 9
|
|||||||
|
|
||||||
Hit Die: d8
|
Hit Die: d8
|
||||||
|
|
||||||
Skill Points at Each Additional Level: 4 + Int modifier.
|
Skill Points at Each Additional Level: 4+ Int Modifier.
|
||||||
|
|
||||||
Spells: Your caster level is equal to your class level. Your number of spells per day does not increase after 20th level.
|
Spells: Your caster level is equal to your class level. Your number of spells per day does not increase after 20th level.
|
||||||
|
|
||||||
@@ -68835,7 +68833,7 @@ Epic Warlock Bonus Feats: Craft Epic Magic Arms and Armor, Craft Epic Rod, Craft
|
|||||||
|
|
||||||
Hit Die: d6.
|
Hit Die: d6.
|
||||||
|
|
||||||
Skill Points at Each Additional Level: 4 + Int modifier.
|
Skill Points at Each Additional Level: 4+ Int Modifier.
|
||||||
|
|
||||||
Spells: The epic shaman's caster level is equal to his class level. The shaman's number of spells per day does not increase after 20th level.
|
Spells: The epic shaman's caster level is equal to his class level. The shaman's number of spells per day does not increase after 20th level.
|
||||||
|
|
||||||
@@ -75516,7 +75514,7 @@ Light Crossbow
|
|||||||
<entry id="211493" lang="en" sex="m">Healer (Default)</entry>
|
<entry id="211493" lang="en" sex="m">Healer (Default)</entry>
|
||||||
<entry id="211494" lang="en" sex="m">(STARTING PACKAGE)
|
<entry id="211494" lang="en" sex="m">(STARTING PACKAGE)
|
||||||
|
|
||||||
The default healer package is focused on survivability & increasing the amount of healing the Healer can perform per spell or skill check.
|
The default healer package is focused on survivability and increasing the amount of healing the Healer can perform per spell or skill check.
|
||||||
|
|
||||||
Equipment:
|
Equipment:
|
||||||
Torch
|
Torch
|
||||||
|
|||||||
Binary file not shown.
Reference in New Issue
Block a user