//:: //:: A pnp version of the Slaughter Wight's Lvl draining touch, //:: Eviscorator Feat & Death master feat. //:: //:: Modified by: DM Heatstroke 01-30-11 //:: #include "NW_I0_GENERIC" //#include "nw_i0_spells" //#include "nw_i0_plot" #include "prc_inc_spells" int DSGetIsShaken(object oTarget,object oOrigin) { effect eEffect = GetFirstEffect(oTarget); int nEffectType; while ( GetIsEffectValid(eEffect) ) { // AssignCommand(oTarget,SpeakString("Effect Creator: " + GetName(GetEffectCreator(eEffect)) // + " Effect ID: " + IntToString(GetEffectSpellId(eEffect)) // + " Effect Type: " + IntToString(GetEffectType(eEffect)) )); if ( GetEffectCreator(eEffect) == oOrigin && GetEffectSpellId(eEffect) == 700 ) { nEffectType = GetEffectType(eEffect); if ( nEffectType == EFFECT_TYPE_ATTACK_DECREASE || nEffectType == EFFECT_TYPE_SAVING_THROW_DECREASE || nEffectType == EFFECT_TYPE_SKILL_DECREASE ) { AssignCommand(oTarget,SpeakString("**Shaken!**")); return TRUE; } } eEffect = GetNextEffect(oTarget); } //AssignCommand(oTarget,SpeakString("I am not shaken")); return FALSE; } void DoLevelDrain(object oTarget, object oCaster) { // Setup oCaster's healing effect eDrain = EffectTemporaryHitpoints(5); eDrain = ExtraordinaryEffect(eDrain); effect eVis1 = EffectVisualEffect(VFX_IMP_HEALING_L); // Setup Level Drain effect eVis2 = EffectVisualEffect(VFX_IMP_NEGATIVE_ENERGY); effect eNeg = EffectNegativeLevel(1); eNeg = SupernaturalEffect(eNeg); // Drain levels from oTarget ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis2, oTarget); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eNeg, oTarget, HoursToSeconds(24)); // Apply Temp HP to oCaster ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis1, oCaster); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eDrain, oCaster, HoursToSeconds(1)); } void main() { object oCaster = OBJECT_SELF ; // Where the spell came from object oTarget = PRCGetSpellTargetObject(); // What the spell is aimed at if ( GetIsImmune(oTarget,IMMUNITY_TYPE_NEGATIVE_LEVEL) ) { SendMessageToPC(oTarget,"Immune to level drain."); return; } DelayCommand(0.1,DoLevelDrain(oTarget,oCaster)); int nRace = MyPRCGetRacialType(oTarget); if (( nRace == RACIAL_TYPE_CONSTRUCT ) || ( nRace == RACIAL_TYPE_ELEMENTAL ) || ( nRace == RACIAL_TYPE_UNDEAD )) return; if ( GetIsImmune( oTarget, IMMUNITY_TYPE_CRITICAL_HIT ) ) return; if ( d20() < 14 ) return; effect eImp = EffectVisualEffect(VFX_FNF_LOS_EVIL_30); effect eVis = EffectVisualEffect(VFX_IMP_DOOM); effect eAttack = EffectAttackDecrease(2); effect eSaves = EffectSavingThrowDecrease(SAVING_THROW_ALL,2); effect eSkills = EffectSkillDecrease(SKILL_ALL_SKILLS,2); effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE); effect eLink = EffectLinkEffects(eAttack,eSaves); eLink = EffectLinkEffects(eLink,eSkills); eLink = EffectLinkEffects(eLink,eDur); effect eVis2 = EffectVisualEffect(VFX_DUR_MIND_AFFECTING_FEAR); effect eDur2 = EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE); effect eLink2 = EffectLinkEffects(eVis2,eDur2); object oAOE = GetFirstObjectInShape(SHAPE_SPHERE, FeetToMeters(30.0), GetLocation(oTarget)); float fDelay; ApplyEffectToObject(DURATION_TYPE_INSTANT,eImp,oTarget); while ( GetIsObjectValid( oAOE ) ) { if ( oAOE != oCaster && GetIsEnemy(oAOE,oCaster) ) { if ( !GetIsImmune( oAOE, IMMUNITY_TYPE_MIND_SPELLS ) && !GetIsImmune( oAOE, IMMUNITY_TYPE_FEAR ) && !GetHasEffect( EFFECT_TYPE_FRIGHTENED, oAOE) ) { fDelay = GetDistanceBetween(oAOE,oTarget) / 20; if ( DSGetIsShaken(oAOE, oCaster) ) { DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eLink2,oAOE,RoundsToSeconds(10))); // AssignCommand(oAOE,SpeakString("Fear! Oh no!")); } else { DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT,eVis,oAOE)); DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eLink,oAOE,RoundsToSeconds(10))); } } } oAOE = GetNextObjectInShape(SHAPE_SPHERE, FeetToMeters(30.0), GetLocation(oTarget)); } }