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.
		
			
				
	
	
		
			186 lines
		
	
	
		
			7.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			186 lines
		
	
	
		
			7.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| //::///////////////////////////////////////////////
 | |
| //:: Pestilence
 | |
| //:: sp_pest_aura_oe.nss
 | |
| //:://////////////////////////////////////////////
 | |
| /*
 | |
|  Contagiousness aura onenter script for Pestilence.
 | |
|  This will get some data from it's carrier the first time it
 | |
|  is called.
 | |
|  The aura will delete itself should it be present when the carrier is
 | |
|  no longer infected.
 | |
|  
 | |
|  The creature entering the aura will be subject to SR and fort checks
 | |
|  to resist being infected.
 | |
|  
 | |
| */
 | |
| //:://////////////////////////////////////////////
 | |
| //:: Created By: Ornedan
 | |
| //:: Created On: December 26, 2004
 | |
| //:://////////////////////////////////////////////
 | |
| 
 | |
| #include "prc_inc_spells"
 | |
| 
 | |
| void SetupPestilenceAura(object oTarget, object oCaster, int nCasterLevel, int nDC)
 | |
| {
 | |
|     effect eAoE = EffectAreaOfEffect(AOE_MOB_PESTILENCE);
 | |
|     SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eAoE, oTarget, HoursToSeconds(24) /*+10*/, FALSE, SPELL_PESTILENCE, nCasterLevel, oCaster);
 | |
| 
 | |
|     object oAoE = GetAreaOfEffectObject(GetLocation(oTarget), "VFX_MOB_PESTILENCE");
 | |
|     SetAllAoEInts(SPELL_PESTILENCE, oAoE, nDC, 1, nCasterLevel);
 | |
| }
 | |
| 
 | |
| 
 | |
| void main()
 | |
| {
 | |
|     //SpawnScriptDebugger();
 | |
|     
 | |
| PRCSetSchool(SPELL_SCHOOL_NECROMANCY);
 | |
| 
 | |
|     object oTarget = GetEnteringObject();
 | |
|     object oCarrier, oCaster;
 | |
|     int nDC, nCasterLvl, nPenetr;
 | |
|     
 | |
|     
 | |
|     // See if we've already got a handle on the creature carrying this AoE around
 | |
|     if(!GetLocalInt(OBJECT_SELF, "INIT_DONE"))
 | |
|     {
 | |
|         //Not initialized yet. Look through creatures in AoE to find a new carrier
 | |
|         // (which should almost always be the one carrying this AoE)
 | |
|         int bFound = FALSE;
 | |
|         oCarrier = GetFirstInPersistentObject();
 | |
|         while(oCarrier != OBJECT_INVALID && !bFound)
 | |
|         {
 | |
|             if(GetLocalInt(oCarrier, "SPELL_PESTILENCE_DO_ONCE"))
 | |
|             {
 | |
|                 bFound = TRUE;
 | |
|                 break;
 | |
|             }// end if - is this a new carrier?
 | |
|             
 | |
|             oCarrier = GetNextInPersistentObject();
 | |
|         }// end while - search for the carrier
 | |
|         
 | |
|         // Get caster data from the carrier
 | |
|         nDC = GetLocalInt(oCarrier, "SPELL_PESTILENCE_DC");
 | |
|         nCasterLvl = GetLocalInt(oCarrier, "SPELL_PESTILENCE_CASTERLVL");
 | |
|         nPenetr = GetLocalInt(oCarrier, "SPELL_PESTILENCE_SPELLPENETRATION");
 | |
|         oCaster = GetLocalObject(oCarrier, "SPELL_PESTILENCE_CASTER");
 | |
|         
 | |
|         // Store the data on self for easier access
 | |
|         SetLocalInt(OBJECT_SELF, "SPELL_PESTILENCE_DC", nDC);
 | |
|         SetLocalInt(OBJECT_SELF, "SPELL_PESTILENCE_CASTERLVL", nCasterLvl);
 | |
|         SetLocalInt(OBJECT_SELF, "SPELL_PESTILENCE_SPELLPENETRATION", nPenetr);
 | |
|         SetLocalObject(OBJECT_SELF, "SPELL_PESTILENCE_CARRIER", oCarrier);
 | |
|         SetLocalObject(OBJECT_SELF, "SPELL_PESTILENCE_CASTER", oCaster);
 | |
|         
 | |
|         // These are no longer needed on the carrier, so delete them.
 | |
|         //DeleteLocalInt(oCarrier, "SPELL_PESTILENCE_DC");
 | |
|         //DeleteLocalInt(oCarrier, "SPELL_PESTILENCE_CASTERLVL");
 | |
|         DeleteLocalInt(oCarrier, "SPELL_PESTILENCE_SPELLPENETRATION");
 | |
|         //DeleteLocalObject(oCarrier, "SPELL_PESTILENCE_CASTER");
 | |
|         
 | |
|         // Mark the initialization being done
 | |
|         DeleteLocalInt(oCarrier, "SPELL_PESTILENCE_DO_ONCE");
 | |
|         SetLocalInt(OBJECT_SELF, "INIT_DONE", TRUE);
 | |
|     }// end if - initialization wasn't done yet
 | |
|     else
 | |
|     {
 | |
|         oCaster  = GetLocalObject(OBJECT_SELF, "SPELL_PESTILENCE_CASTER");
 | |
|         oCarrier = GetLocalObject(OBJECT_SELF, "SPELL_PESTILENCE_CARRIER");
 | |
|         nDC        = GetLocalInt(OBJECT_SELF, "SPELL_PESTILENCE_DC");
 | |
|         nCasterLvl = GetLocalInt(OBJECT_SELF, "SPELL_PESTILENCE_CASTERLVL");
 | |
|         nPenetr    = GetLocalInt(OBJECT_SELF, "SPELL_PESTILENCE_SPELLPENETRATION");
 | |
|     }// end else - initilization already done, just load data from self
 | |
|     
 | |
|     /* Make sure the carrier is still infected. It is possible for
 | |
|      * this effect to be present on the carrier even if it has been
 | |
|      * cured.
 | |
|      */
 | |
|     if(!PRCGetHasEffect(EFFECT_TYPE_DISEASE, oCarrier))
 | |
|     {
 | |
|         // It isn't, so do a paranoia cleanup of the carrier and delete self
 | |
|         DeleteLocalInt(oCarrier, "SPELL_PESTILENCE_SAVED");
 | |
|         DeleteLocalInt(oCarrier, "SPELL_PESTILENCE_DC");
 | |
|         DeleteLocalInt(oCarrier, "SPELL_PESTILENCE_CASTERLVL");
 | |
|         DeleteLocalInt(oCarrier, "SPELL_PESTILENCE_SPELLPENETRATION");
 | |
|         DeleteLocalInt(oCarrier, "SPELL_PESTILENCE_DO_ONCE");
 | |
|         DeleteLocalObject(oCarrier, "SPELL_PESTILENCE_CASTER");
 | |
|         
 | |
|         DestroyObject(OBJECT_SELF);
 | |
|         return;
 | |
|     }
 | |
|     
 | |
|     /* All is OK, so we can proceed with infecting oTarget */
 | |
|     
 | |
|     // Do not try to re-infect the carrier or a target that is already.
 | |
|     // diseased. That'd just cause extra spam.
 | |
|     if(!(oTarget == oCarrier || PRCGetHasEffect(EFFECT_TYPE_DISEASE, oTarget)))
 | |
|     {
 | |
|         //Make sure the target is a living one
 | |
|         if(PRCGetIsAliveCreature(oTarget))
 | |
|         {
 | |
|             //Make SR Check
 | |
|             if (!PRCDoResistSpell(oCaster, oTarget, nPenetr))
 | |
|             {
 | |
|                 if(!PRCMySavingThrow(SAVING_THROW_FORT, oTarget, nDC, SAVING_THROW_TYPE_DISEASE))
 | |
|                 {
 | |
|                     effect eDisease = EffectDisease(DISEASE_PESTILENCE);
 | |
|                     effect eAoE = EffectAreaOfEffect(AOE_MOB_PESTILENCE);
 | |
|                     
 | |
|                     SPApplyEffectToObject(DURATION_TYPE_PERMANENT, eDisease, oTarget, 0.0f, FALSE, SPELL_PESTILENCE, nCasterLvl, oCaster);
 | |
|                     SetLocalInt(oTarget, "SPELL_PESTILENCE_DC", nDC);
 | |
|                     SetLocalInt(oTarget, "SPELL_PESTILENCE_CASTERLVL", nCasterLvl);
 | |
|                     SetLocalInt(oTarget, "SPELL_PESTILENCE_SPELLPENETRATION", nPenetr);
 | |
|                     SetLocalObject(oTarget, "SPELL_PESTILENCE_CASTER", oCaster);
 | |
|                     SetLocalInt(oTarget, "SPELL_PESTILENCE_DO_ONCE", TRUE);
 | |
|     //              DelayCommand(4.0f, DeleteLocalInt(oTarget, "SPELL_PESTILENCE_DO_ONCE"));
 | |
|                     
 | |
|                     // Delayed a bit. Seems like the presence of the disease effect may
 | |
|                     // not register immediately, resulting in the AoE killing itself
 | |
|                     // right away due to that check failing.
 | |
|                     DelayCommand(0.4f, SetupPestilenceAura(oTarget, oCaster, nCasterLvl, nDC));
 | |
|             }// end if - fort save
 | |
|             }// end if - spell resistance
 | |
|         }// end if - only living targets
 | |
|     }// end if - do not affect the carrier
 | |
| 
 | |
| // Clean up the spell local
 | |
| PRCSetSchool();
 | |
| }
 | |
| 
 | |
| /*
 | |
| <Jasperre> eg:
 | |
| <Jasperre> // Get the spell save DC of an AOE (Being OBJECT_SELF). Stores in a local for futher use.
 | |
| <Jasperre> int PHS_GetAOESpellSaveDC()
 | |
| <Jasperre> {
 | |
| <Jasperre>     // Check for previous values
 | |
| <Jasperre>     int nDC = GetLocalInt(OBJECT_SELF, PHS_AOE_SPELL_SAVE_DC);
 | |
| <Jasperre>     if(nDC >= 1)
 | |
| <Jasperre>     {
 | |
| <Jasperre>         // Stop and return
 | |
| <Jasperre>         return nDC;
 | |
| <Jasperre>     }
 | |
| <Jasperre>     // Else get it - first time
 | |
| <Jasperre>     // Get the creator of OBJECT_SELF - the AOE
 | |
| <Jasperre>     object oCreator = GetAreaOfEffectCreator();
 | |
| <Jasperre>     // If it is a placeable, the caster level is going to be special
 | |
| <Jasperre>     if(GetObjectType(oCreator) != OBJECT_TYPE_CREATURE)
 | |
| <Jasperre>     {
 | |
| <Jasperre>         // Get the save DC
 | |
| <Jasperre>         nDC = PRCGetSaveDC();
 | |
| <Jasperre>     }
 | |
| <Jasperre>     else
 | |
| <Jasperre>     {
 | |
| <Jasperre>         // Get the save DC
 | |
| <Jasperre>         nDC = PRCGetSaveDC();
 | |
| <Jasperre>     }
 | |
| <Jasperre>     // Make sure it is not 0 (Placeable casting maybe)
 | |
| <Jasperre>     if(nDC < 1)
 | |
| <Jasperre>     {
 | |
| <Jasperre>         nDC = 1;
 | |
| <Jasperre>     }
 | |
| <Jasperre>     // Set the local, and return the value
 | |
| <Jasperre>     SetLocalInt(OBJECT_SELF, PHS_AOE_SPELL_SAVE_DC, nDC);
 | |
| <Jasperre>     // Return value
 | |
| <Jasperre>     return nDC;
 | |
| <Jasperre> }
 | |
| */ |