Updated Release Archive. Fixed Mage-killer prereqs. Removed old LETO & ConvoCC related files. Added organized spell scroll store. Fixed Gloura spellbook. Various TLK fixes. Reorganized Repo. Removed invalid user folders. Added DocGen back in.
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
|
|
} |