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.
		
			
				
	
	
		
			94 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			94 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| /*
 | |
| 12/02/19 by Stratovarius
 | |
| 
 | |
| Voice of Shadow
 | |
| 
 | |
| Apprentice, Ebon Whispers 
 | |
| Level/School: 1st/Enchantment (Compulsion) [Mind-Affecting]
 | |
| Range: Close (25 ft. + 5 ft./2 levels) 
 | |
| Target: One creature 
 | |
| Duration: 1 round 
 | |
| Saving Throw: Will negates 
 | |
| Spell Resistance: Yes
 | |
| 
 | |
| By speaking via a conduit through the Plane of Shadow, you deliver a commanding message.
 | |
| 
 | |
| This mystery functions like the spell command, except if cast on undead or constructs. They are dazed for the duration.
 | |
| */
 | |
| 
 | |
| #include "shd_inc_shdfunc"
 | |
| #include "shd_mysthook"
 | |
| 
 | |
| void main()
 | |
| {
 | |
|     if(!ShadPreMystCastCode()) return;
 | |
| 
 | |
|     object oShadow      = OBJECT_SELF;
 | |
|     object oTarget      = PRCGetSpellTargetObject();
 | |
|     struct mystery myst = EvaluateMystery(oShadow, oTarget, METASHADOW_EXTEND);
 | |
| 
 | |
|     if(myst.bCanMyst)
 | |
|     {
 | |
|         myst.fDur = RoundsToSeconds(1);
 | |
|         if(myst.bExtend) myst.fDur *= 2;   
 | |
|         myst.nPen = ShadowSRPen(oShadow, myst.nShadowcasterLevel);
 | |
|         
 | |
|         SignalEvent(oTarget, EventSpellCastAt(oShadow, myst.nMystId));
 | |
|         
 | |
|         // Only creatures, and PvP check.
 | |
|         if(!GetIsReactionTypeFriendly(oTarget))
 | |
|         {
 | |
|             // Check Spell Resistance
 | |
|             if(!PRCDoResistSpell(oShadow, oTarget, myst.nPen) || myst.bIgnoreSR)
 | |
|             {                
 | |
|                 if (MyPRCGetRacialType(oTarget) == RACIAL_TYPE_UNDEAD || MyPRCGetRacialType(oTarget) == RACIAL_TYPE_CONSTRUCT)
 | |
|                 {
 | |
|                     if (!PRCMySavingThrow(SAVING_THROW_WILL, oTarget, GetShadowcasterDC(oShadow), SAVING_THROW_TYPE_NONE))
 | |
|                     {
 | |
|                         effect eVis = EffectVisualEffect(VFX_IMP_CONFUSION_S);
 | |
|                         myst.eLink = EffectLinkEffects(EffectDazed(), EffectVisualEffect(VFX_DUR_MIND_AFFECTING_DISABLED));
 | |
|                         if (myst.bIgnoreSR) myst.eLink = SupernaturalEffect(myst.eLink);
 | |
|                         
 | |
| 						
 | |
| 						object oItem = GetItemInSlot(INVENTORY_SLOT_CARMOUR, oTarget);
 | |
| 						int nRemove = FALSE;
 | |
|     					itemproperty ip = GetFirstItemProperty(oItem);
 | |
|     					while(GetIsItemPropertyValid(ip))
 | |
|     					{
 | |
|     						if (GetItemPropertyType(ip) == ITEM_PROPERTY_IMMUNITY_MISCELLANEOUS && GetItemPropertySubType(ip) == IP_CONST_IMMUNITYMISC_MINDSPELLS)
 | |
|     						{
 | |
|     							RemoveItemProperty(oItem, ip);
 | |
|     							nRemove = TRUE;
 | |
|     						}	
 | |
|     						if (GetItemPropertyType(ip) == ITEM_PROPERTY_MIND_BLANK)
 | |
|     						{
 | |
|     							RemoveItemProperty(oItem, ip);
 | |
|     							nRemove = TRUE;
 | |
|     						}
 | |
|     					    	
 | |
|     					    ip = GetNextItemProperty(oItem);
 | |
|     					}	
 | |
| 						
 | |
|     					AssignCommand(oTarget, ClearAllActions(TRUE));
 | |
|     					effect eLink = EffectLinkEffects(EffectVisualEffect(VFX_DUR_MIND_AFFECTING_POSITIVE), EffectCharmed());
 | |
|     					DelayCommand(0.25, SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, myst.eLink, oTarget, myst.fDur, TRUE, myst.nMystId, myst.nShadowcasterLevel));
 | |
|     					if (nRemove) DelayCommand(1.0, AddItemProperty(DURATION_TYPE_PERMANENT, ItemPropertyImmunityMisc(IP_CONST_IMMUNITYMISC_MINDSPELLS), oItem));                        
 | |
|                         
 | |
|                         SPApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget);
 | |
|                     }                
 | |
|                 }
 | |
|                 else
 | |
|                 {
 | |
|                     if (!PRCMySavingThrow(SAVING_THROW_WILL, oTarget, GetShadowcasterDC(oShadow), SAVING_THROW_TYPE_MIND_SPELLS))
 | |
|                     {
 | |
|                         effect eVis = EffectVisualEffect(VFX_IMP_CONFUSION_S);
 | |
|                         myst.eLink = EffectLinkEffects(EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE), EffectVisualEffect(VFX_DUR_MIND_AFFECTING_DISABLED));
 | |
|                         SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, myst.eLink, oTarget, myst.fDur, TRUE, myst.nMystId, myst.nShadowcasterLevel);
 | |
|                         SPApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget);
 | |
|                         DoCommandSpell(oShadow, oTarget, myst.nMystId, FloatToInt(myst.fDur/6.0), myst.nShadowcasterLevel);                    
 | |
|                     }    
 | |
|                 }
 | |
|             }    
 | |
|         }
 | |
|     }
 | |
| } |