Updated AMS marker feats. Removed arcane & divine marker feats. Updated Dread Necromancer for epic progression. Updated weapon baseitem models. Updated new weapons for crafting & npc equip. Updated prefix. Updated release archive.
106 lines
5.0 KiB
Plaintext
106 lines
5.0 KiB
Plaintext
//::///////////////////////////////////////////////
|
|
//:: Frightful Presence
|
|
//:: prc_fright_presence
|
|
//::///////////////////////////////////////////////
|
|
/**
|
|
When you charge, attack, or cast a spell while wearing the helm,
|
|
your frightful presence might affect enemies within 30 feet who
|
|
have fewer Hit Dice than you. Creatures of 4 or fewer Hit Dice
|
|
become panicked for 1 minute, and creatures of 5 or more Hit
|
|
Dice become shaken for 1 minute. A successful Will save (DC 17
|
|
or 15 + your Cha modifier, whichever is higher) negates either
|
|
effect. Whether the saving throw succeeds or fails, the creature
|
|
is immune to your frightful presence for 24 hours. Dragons are immune
|
|
to your frightful presence regardless of their Hit Dice.
|
|
|
|
@author Stratovarius
|
|
@date Created - 20.07.2020
|
|
*/
|
|
//:://////////////////////////////////////////////
|
|
//:://////////////////////////////////////////////
|
|
|
|
#include "prc_inc_spells"
|
|
|
|
void main()
|
|
{
|
|
object oPC = OBJECT_SELF;
|
|
effect eShaken = ExtraordinaryEffect(EffectShaken());
|
|
// Construct Panicked effect
|
|
effect ePanicked = EffectLinkEffects(eShaken, EffectFrightened());
|
|
ePanicked = EffectLinkEffects(ePanicked, EffectVisualEffect(VFX_DUR_MIND_AFFECTING_FEAR));
|
|
// Make the effects extraordinary
|
|
ePanicked = ExtraordinaryEffect(ePanicked);
|
|
|
|
// Radius = 30ft
|
|
float fRadius = FeetToMeters(30.0f);
|
|
float fDuration;
|
|
|
|
int nDC = 17;
|
|
if (15 + GetAbilityModifier(ABILITY_CHARISMA, oPC) > nDC)
|
|
nDC = 20 + GetAbilityModifier(ABILITY_CHARISMA, oPC);
|
|
int nPCHitDice = GetHitDice(oPC);
|
|
int nTargetHitDice;
|
|
int bDoVFX = FALSE;
|
|
|
|
// The samurai's object ID for enforcing the 24h rule
|
|
string sPCOid = ObjectToString(oPC);
|
|
|
|
// Loop over creatures in range
|
|
location lTarget = GetLocation(oPC);
|
|
object oTarget = GetFirstObjectInShape(SHAPE_SPHERE, fRadius, lTarget, TRUE);
|
|
while (GetIsObjectValid(oTarget))
|
|
{
|
|
// Target validity check
|
|
if(oTarget != oPC && // Can't affect self
|
|
!GetLocalInt(oTarget, "PRC_CWSM_Fright_SavedVs" + sPCOid) && // Hasn't saved successfully against this samurai's Frightful Presence in the last 24h
|
|
spellsIsTarget(oTarget, SPELL_TARGET_SELECTIVEHOSTILE, oPC)) // Only hostiles
|
|
{
|
|
// Set the marker that tells we tried to affect someone
|
|
bDoVFX = TRUE;
|
|
|
|
// Let the target know something hostile happened
|
|
SignalEvent(oTarget, EventSpellCastAt(oPC, -1, TRUE));
|
|
|
|
// Will save
|
|
if(!PRCMySavingThrow(SAVING_THROW_WILL, oTarget, nDC, SAVING_THROW_TYPE_FEAR, oPC) &&
|
|
!GetIsImmune(oTarget, IMMUNITY_TYPE_FEAR, oPC) && // Explicit immunity check, because of the fucking stupid BW immunity handling
|
|
MyPRCGetRacialType(oTarget) != RACIAL_TYPE_DRAGON)
|
|
{
|
|
// Roll duration
|
|
fDuration = 60.0;
|
|
|
|
// HD 4 or less - panicked
|
|
if(nTargetHitDice <= 4)
|
|
{
|
|
// Assign commands to drop items in left & right hands
|
|
if(GetIsObjectValid(GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oTarget)))
|
|
AssignCommand(oTarget, ActionPutDownItem(GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oTarget)));
|
|
if(GetIsObjectValid(GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oTarget)))
|
|
AssignCommand(oTarget, ActionPutDownItem(GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oTarget)));
|
|
|
|
// Apply the effect
|
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, ePanicked, oTarget, fDuration);
|
|
}
|
|
// More then 4 HD, less than the samurai - shaken
|
|
else
|
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eShaken, oTarget, fDuration);
|
|
}
|
|
// Successfull save, set marker and queue marker deletion
|
|
else
|
|
{
|
|
SetLocalInt(oTarget, "PRC_CWSM_Fright_SavedVs" + sPCOid, TRUE);
|
|
|
|
// Add variable deletion to the target's queue. That way, if the samurai logs out, it will still get cleared
|
|
AssignCommand(oTarget, DelayCommand(HoursToSeconds(24), DeleteLocalInt(oTarget, "PRC_CWSM_Fright_SavedVs" + sPCOid)));
|
|
}
|
|
}// end if - Target validity check
|
|
|
|
// Get next target in area
|
|
oTarget = GetNextObjectInShape(SHAPE_SPHERE, fRadius, lTarget, TRUE);
|
|
}// end while - Loop over creatures in 30ft area
|
|
|
|
// If we tried to affect someone, do war cry VFX
|
|
if(bDoVFX)
|
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(GetGender(oPC) == GENDER_FEMALE ? VFX_FNF_HOWL_WAR_CRY_FEMALE : VFX_FNF_HOWL_WAR_CRY), oPC);
|
|
}
|