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.
		
			
				
	
	
		
			107 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			107 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| //::///////////////////////////////////////////////
 | |
| //:: Poison Vial throw impactscript
 | |
| //:: poison_vialthrow
 | |
| //::///////////////////////////////////////////////
 | |
| /*
 | |
|     This is a script for the grenadelike use of a
 | |
|     poison item.
 | |
| 
 | |
|     The number of poison used is gotten from
 | |
|     local integer "pois_idx" on the item being cast from.
 | |
|     The last 3 letters of the item's tag will be used instead
 | |
|     if the following module switch is set:
 | |
| 
 | |
|     PRC_USE_TAGBASED_INDEX_FOR_POISON
 | |
| 
 | |
| 
 | |
|     If the poison used is an inhaled poison, any
 | |
|     creatures in a RADIUS_SIZE_MEDIUM will be effected.
 | |
|     A contact poison will only affect a targeted creature.
 | |
|     Any other poison type will have no effect.
 | |
| */
 | |
| //:://////////////////////////////////////////////
 | |
| //:: Created By: Ornedan
 | |
| //:: Created On: 12.12.2004
 | |
| //:: Updated On: 20.12.2004
 | |
| //:://////////////////////////////////////////////
 | |
| 
 | |
| #include "prc_inc_sp_tch"
 | |
| #include "inc_poison"
 | |
| 
 | |
| void main(){
 | |
|     object oPC = OBJECT_SELF;
 | |
|     object oTarget = GetSpellTargetObject();
 | |
|     object oItem = GetSpellCastItem();
 | |
|     string sTag = GetTag(oItem);
 | |
|     location lTarget = GetSpellTargetLocation();
 | |
|     float fDist = GetDistanceBetween(OBJECT_SELF, oTarget);
 | |
| 
 | |
| 
 | |
|     // Get the 2da row to lookup the poison from
 | |
|     int nPoisonIdx;
 | |
|     if(GetPRCSwitch(PRC_USE_TAGBASED_INDEX_FOR_POISON))
 | |
|         nPoisonIdx = StringToInt(GetStringRight(GetTag(oItem), 3));
 | |
|     else
 | |
|         nPoisonIdx = GetLocalInt(oItem, "pois_idx");
 | |
| 
 | |
| 
 | |
|     /** Do paranoia **/
 | |
| 
 | |
|     if (nPoisonIdx < 0)
 | |
|     {
 | |
|         WriteTimestampedLogEntry ("Error: Item with resref " +GetResRef(oItem)+ ", tag " +GetTag(oItem) + " has the Poison Vial spellscript attached but "
 | |
|                                    + (GetPRCSwitch(PRC_USE_TAGBASED_INDEX_FOR_POISON) ? "it's tag" : "it's local integer variable 'pois_idx'")
 | |
|                                    + " contains an invalid value!");
 | |
|         return;
 | |
|     }
 | |
| 
 | |
|     if(GetPoisonType(nPoisonIdx) != POISON_TYPE_CONTACT &&
 | |
|        GetPoisonType(nPoisonIdx) != POISON_TYPE_INHALED
 | |
|        )
 | |
|     {
 | |
|         SendMessageToPC(oPC, GetName(oItem) +" " + GetStringByStrRef(STRREF_SHATTER_HARMLESS)); // * Nothing happens *
 | |
|         WriteTimestampedLogEntry ("Error: Item with resref " +GetResRef(oItem)+ ", tag " +GetTag(oItem) + ", pois_idx " + IntToString(nPoisonIdx) + " has the Poison Vial spellscript attached but the poison is not a valid one for this script!");
 | |
|         return;
 | |
|     }
 | |
| 
 | |
| 
 | |
|     /** All is OK. Following mostly ripped from PRCDoGrenade in x0_i0_spells **/
 | |
| 
 | |
|     effect ePoison = EffectPoison(nPoisonIdx);
 | |
| 
 | |
|     if(GetPoisonType(nPoisonIdx) == POISON_TYPE_CONTACT)
 | |
|     {
 | |
|         // This was a contact poison, so we only affect one target.
 | |
|         // First, check if it's a valid one.
 | |
|         if(GetIsObjectValid(oTarget) == TRUE)
 | |
|         {
 | |
|             int nTouch = PRCDoRangedTouchAttack(oTarget);;
 | |
| 
 | |
|             if (nTouch > 0)
 | |
|             {
 | |
|                 SignalEvent(oTarget, EventSpellCastAt(oPC, SPELL_GRENADE_POISONVIAL));
 | |
|                 SPApplyEffectToObject(DURATION_TYPE_PERMANENT, ePoison, oTarget, 0.0f, FALSE,
 | |
|                                       SPELL_GRENADE_POISONVIAL, 1, oPC);
 | |
|             }
 | |
|         }
 | |
|     }// end if - handle vial containing a contact poison
 | |
|     else{
 | |
|         // We had an inhalation poison.
 | |
|         //Apply the explosion at the location captured above.
 | |
|         effect eExplode = EffectVisualEffect(VFX_FNF_LOS_NORMAL_30);
 | |
|         ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eExplode, lTarget);
 | |
| 
 | |
|         object oTarget = GetFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_MEDIUM, lTarget, TRUE, OBJECT_TYPE_CREATURE);
 | |
|         //Cycle through the targets within the spell shape until an invalid object is captured.
 | |
|         while (GetIsObjectValid(oTarget))
 | |
|         {
 | |
|             float fDelay = GetDistanceBetweenLocations(lTarget, GetLocation(oTarget))/20;
 | |
| 
 | |
|             // Apply effects to the currently selected target.
 | |
|             SignalEvent(oTarget, EventSpellCastAt(oPC, SPELL_GRENADE_POISONVIAL));
 | |
|             DelayCommand(fDelay, SPApplyEffectToObject(DURATION_TYPE_PERMANENT, ePoison, oTarget, 0.0f, FALSE, SPELL_GRENADE_POISONVIAL, 1, oPC));
 | |
|             //Select the next target within the spell shape.
 | |
|             oTarget = GetNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_MEDIUM, lTarget, TRUE, OBJECT_TYPE_CREATURE);
 | |
|         }
 | |
|     }// end else - handle vial containing an inhalation poison
 | |
| } |