Initial commit. Updated release archive.
This commit is contained in:
628
_module/nss/z217_behold.nss
Normal file
628
_module/nss/z217_behold.nss
Normal file
@@ -0,0 +1,628 @@
|
||||
///////////////////////////////////////////////////
|
||||
// Beholder Ray: Include file //
|
||||
///////////////////////////////////////////////////
|
||||
/*
|
||||
These are the functions the beholder uses to
|
||||
act in it's most evil way... hehe
|
||||
*/
|
||||
///////////////////////////////////////////////////
|
||||
// Created By: Zarathustra217 //
|
||||
// Created On: Jan 28. 2003 //
|
||||
///////////////////////////////////////////////////
|
||||
#include "prc_inc_spells"
|
||||
#include "prc_inc_sp_tch"
|
||||
|
||||
// object OBJECT_SELF = OBJECT_SELF; <- Just here for testing
|
||||
|
||||
float ConvAngle(float fAngle)
|
||||
{
|
||||
while(fAngle<0.0)
|
||||
{
|
||||
fAngle=fAngle+360.0;
|
||||
}
|
||||
while(fAngle>=360.0)
|
||||
{
|
||||
fAngle=fAngle-360.0;
|
||||
}
|
||||
return fAngle;
|
||||
}
|
||||
int GetLevel(object oTarget)
|
||||
{
|
||||
int nTemp=1;
|
||||
int nLevel=0;
|
||||
while(nTemp<4)
|
||||
{
|
||||
int nClass=GetClassByPosition(nTemp,oTarget);
|
||||
nLevel+=GetLevelByPosition(nTemp,oTarget);
|
||||
nTemp++;
|
||||
}
|
||||
return nLevel;
|
||||
}
|
||||
int ClassSpellLvl(object oTarget)
|
||||
{
|
||||
int nTemp=1;
|
||||
int nSpellLvl=0;
|
||||
while(nTemp<4)
|
||||
{
|
||||
int nClass=GetClassByPosition(nTemp,oTarget);
|
||||
if(nClass==CLASS_TYPE_CLERIC||nClass==CLASS_TYPE_DRUID||nClass==CLASS_TYPE_SORCERER||nClass==CLASS_TYPE_WIZARD)
|
||||
{
|
||||
nSpellLvl+=GetLevelByPosition(nTemp,oTarget);
|
||||
nTemp++;
|
||||
}
|
||||
else
|
||||
{
|
||||
nTemp++;
|
||||
}
|
||||
}
|
||||
return nSpellLvl;
|
||||
}
|
||||
int GetSpellCasterLvl(object oTarget)
|
||||
{
|
||||
if(ClassSpellLvl(oTarget)>0)
|
||||
{
|
||||
return ClassSpellLvl(oTarget);
|
||||
}
|
||||
else
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
//Angle relative to beholder calculater
|
||||
float CalcAngle(object oTarget)
|
||||
{
|
||||
float fBangle=GetFacing(OBJECT_SELF);
|
||||
vector vBpos=GetPosition(OBJECT_SELF);
|
||||
vector vTpos=GetPosition(oTarget);
|
||||
vector vAngelvector=Vector(vTpos.x-vBpos.x,vTpos.y-vBpos.y,0.0);
|
||||
float fAngle=fBangle-VectorToAngle(vAngelvector);
|
||||
return ConvAngle(fAngle);
|
||||
}
|
||||
int CalcArc(object oTarget)
|
||||
{
|
||||
float fTangle=CalcAngle(oTarget);
|
||||
if(fTangle>=225.0&&fTangle<=315.0)
|
||||
{
|
||||
return 4;
|
||||
}
|
||||
else if(fTangle>=135.0&&fTangle<=225.0)
|
||||
{
|
||||
return 3;
|
||||
}
|
||||
else if(fTangle>=45.0&&fTangle<=135.0)
|
||||
{
|
||||
return 2;
|
||||
}
|
||||
else if(315.0<fTangle||fTangle<45.0)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
//Ranged touch <-- Using the PRC's PRCDoRangedTouchAttack instead
|
||||
/* int RangedTouch(object oTarget,int nBeam)
|
||||
{
|
||||
//Debug String
|
||||
//AssignCommand(oTarget,SpeakString(GetName(OBJECT_SELF)+" attemps ranged touch on "+GetName(oTarget)));
|
||||
int nDef=10+GetAbilityModifier(ABILITY_DEXTERITY,oTarget);
|
||||
int nAtt=GetAbilityModifier(ABILITY_DEXTERITY,OBJECT_SELF)+GetLevelByPosition(1,OBJECT_SELF)+PRCGetCreatureSize(oTarget)-3;
|
||||
int nDice=20-Random(20);
|
||||
if(nDice==20)
|
||||
{
|
||||
//Debug String
|
||||
//AssignCommand(oTarget,SpeakString("Critical Hit!"+IntToString(nDice)));
|
||||
ApplyEffectToObject(DURATION_TYPE_TEMPORARY,EffectBeam(nBeam,OBJECT_SELF,BODY_NODE_CHEST),oTarget,0.50);
|
||||
return 2;
|
||||
}
|
||||
else if(nDice==1)
|
||||
{
|
||||
//Debug String
|
||||
//AssignCommand(oTarget,SpeakString("Miss!"+IntToString(nDice)));
|
||||
ApplyEffectToObject(DURATION_TYPE_TEMPORARY,EffectBeam(nBeam,OBJECT_SELF,BODY_NODE_CHEST,TRUE),oTarget,0.50);
|
||||
return 0;
|
||||
}
|
||||
else if(nDef<=nAtt+nDice)
|
||||
{
|
||||
//Debug String
|
||||
//AssignCommand(oTarget,SpeakString("Hit!"+IntToString(nDice)));
|
||||
ApplyEffectToObject(DURATION_TYPE_TEMPORARY,EffectBeam(nBeam,OBJECT_SELF,BODY_NODE_CHEST),oTarget,0.50);
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
//Debug String
|
||||
//AssignCommand(oTarget,SpeakString("Miss!"+IntToString(nDice)));
|
||||
ApplyEffectToObject(DURATION_TYPE_TEMPORARY,EffectBeam(nBeam,OBJECT_SELF,BODY_NODE_CHEST,TRUE),oTarget,0.50);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
//Charm Person function... Some Leeched from nw_s0_charmper
|
||||
void CharmPer(object oTarget)
|
||||
{
|
||||
// SetLocalInt(OBJECT_SELF,"CharmPerUsed",1);
|
||||
if(PRCDoRangedTouchAttack(oTarget,VFX_BEAM_HOLY)!=0)
|
||||
{
|
||||
//Declare major variables
|
||||
effect eVis = EffectVisualEffect(VFX_IMP_CHARM);
|
||||
effect eCharm = EffectCharmed();
|
||||
effect eMind = EffectVisualEffect(VFX_DUR_MIND_AFFECTING_NEGATIVE);
|
||||
effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE);
|
||||
//Link persistant effects
|
||||
effect eLink = EffectLinkEffects(eMind, eCharm);
|
||||
eLink = EffectLinkEffects(eLink, eDur);
|
||||
int nCasterLevel = GetLevelByPosition(1,OBJECT_SELF);
|
||||
int nDuration = 3 + nCasterLevel/3;
|
||||
int nRacial = MyPRCGetRacialType(oTarget);
|
||||
//Fire cast spell at event for the specified target
|
||||
SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELL_CHARM_PERSON, FALSE));
|
||||
//Make SR Check
|
||||
if (!PRCDoResistSpell(OBJECT_SELF, oTarget))
|
||||
{
|
||||
//Verify that the Racial Type is humanoid
|
||||
if ((nRacial == RACIAL_TYPE_DWARF) ||
|
||||
(nRacial == RACIAL_TYPE_ELF) ||
|
||||
(nRacial == RACIAL_TYPE_GNOME) ||
|
||||
(nRacial == RACIAL_TYPE_HUMANOID_GOBLINOID) ||
|
||||
(nRacial == RACIAL_TYPE_HALFLING) ||
|
||||
(nRacial == RACIAL_TYPE_HUMAN) ||
|
||||
(nRacial == RACIAL_TYPE_HALFELF) ||
|
||||
(nRacial == RACIAL_TYPE_HALFORC) ||
|
||||
(nRacial == RACIAL_TYPE_HUMANOID_MONSTROUS) ||
|
||||
(nRacial == RACIAL_TYPE_HUMANOID_ORC) ||
|
||||
(nRacial == RACIAL_TYPE_HUMANOID_REPTILIAN))
|
||||
{
|
||||
//Make a Will Save check
|
||||
if (WillSave(oTarget,18,SAVING_THROW_TYPE_MIND_SPELLS)==0)
|
||||
{
|
||||
//Apply impact and linked effects
|
||||
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, RoundsToSeconds(nDuration));
|
||||
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//Charm Monster function... Some Leeched from nw_s0_charmper
|
||||
void CharmMon(object oTarget)
|
||||
{
|
||||
// SetLocalInt(OBJECT_SELF,"CharmMonUsed",1);
|
||||
if(PRCDoRangedTouchAttack(oTarget,VFX_BEAM_HOLY)!=0)
|
||||
{
|
||||
//Declare major variables
|
||||
effect eVis = EffectVisualEffect(VFX_IMP_CHARM);
|
||||
effect eCharm = EffectCharmed();
|
||||
effect eMind = EffectVisualEffect(VFX_DUR_MIND_AFFECTING_NEGATIVE);
|
||||
effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE);
|
||||
//Link persistant effects
|
||||
effect eLink = EffectLinkEffects(eMind, eCharm);
|
||||
eLink = EffectLinkEffects(eLink, eDur);
|
||||
int nCasterLevel = GetLevelByPosition(1,OBJECT_SELF);
|
||||
int nDuration = 3 + nCasterLevel/3;
|
||||
//Fire cast spell at event for the specified target
|
||||
SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELL_CHARM_PERSON, FALSE));
|
||||
//Make SR Check
|
||||
if (!PRCDoResistSpell(OBJECT_SELF, oTarget))
|
||||
{
|
||||
//Make a Will Save check
|
||||
if (WillSave(oTarget,18,SAVING_THROW_TYPE_MIND_SPELLS)==0)
|
||||
{
|
||||
//Apply impact and linked effects
|
||||
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, RoundsToSeconds(nDuration));
|
||||
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//Sleep... Some Leeched from nw_s0_charmper and nw_s0_sleep
|
||||
void Sleep(object oTarget)
|
||||
{
|
||||
// SetLocalInt(OBJECT_SELF,"SleepUsed",1);
|
||||
if(PRCDoRangedTouchAttack(oTarget,VFX_BEAM_ODD)!=0)
|
||||
{
|
||||
//Declare major variables
|
||||
effect eImpact = EffectVisualEffect(VFX_FNF_LOS_NORMAL_20);
|
||||
effect eSleep = EffectSleep();
|
||||
effect eMind = EffectVisualEffect(VFX_DUR_MIND_AFFECTING_NEGATIVE);
|
||||
effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE);
|
||||
effect eVis = EffectVisualEffect(VFX_IMP_SLEEP);
|
||||
effect eLink = EffectLinkEffects(eSleep, eMind);
|
||||
eLink = EffectLinkEffects(eLink, eDur);
|
||||
eLink = EffectLinkEffects(eLink, eVis);
|
||||
int nCasterLevel = GetLevelByPosition(1,OBJECT_SELF);
|
||||
int nDuration = 3 + nCasterLevel;
|
||||
//Fire cast spell at event for the specified target
|
||||
SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELL_SLEEP));
|
||||
//Make SR Check
|
||||
if (!PRCDoResistSpell(OBJECT_SELF, oTarget))
|
||||
{
|
||||
//Make a Will Save check
|
||||
if (WillSave(oTarget,18,SAVING_THROW_TYPE_MIND_SPELLS)==0)
|
||||
{
|
||||
//Apply impact and linked effects
|
||||
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, RoundsToSeconds(nDuration));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//Flesh To Stone
|
||||
void FleshToStone(object oTarget)
|
||||
{
|
||||
if(PRCDoRangedTouchAttack(oTarget,VFX_BEAM_ODD)!=0)
|
||||
{
|
||||
//Declare major variables
|
||||
effect eImpact = EffectVisualEffect(VFX_FNF_IMPLOSION);
|
||||
effect eDur = EffectVisualEffect(VFX_DUR_PROT_STONESKIN);
|
||||
effect eEntangle =EffectEntangle();
|
||||
effect eParalyze=EffectParalyze();
|
||||
effect eLink = EffectLinkEffects(eImpact, eDur);
|
||||
eLink = EffectLinkEffects(eLink, eParalyze);
|
||||
eLink = EffectLinkEffects(eLink, eEntangle);
|
||||
//Fire cast spell at event for the specified target
|
||||
SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELL_MAGIC_MISSILE));
|
||||
//Make SR Check
|
||||
if (!PRCDoResistSpell(OBJECT_SELF, oTarget))
|
||||
{
|
||||
//Make a Fortitude Save check
|
||||
if (FortitudeSave(oTarget,18)==0)
|
||||
{
|
||||
//Apply impact and linked effects
|
||||
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink, oTarget);
|
||||
SetIsTemporaryNeutral(oTarget,OBJECT_SELF,TRUE,600.0);
|
||||
SetIsTemporaryNeutral(OBJECT_SELF,oTarget,TRUE,600.0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Disintegrate(object oTarget)
|
||||
{
|
||||
if(PRCDoRangedTouchAttack(oTarget,VFX_BEAM_EVIL)!=0)
|
||||
{
|
||||
//Declare major variables
|
||||
effect eSmoke=EffectVisualEffect(VFX_FNF_SMOKE_PUFF);
|
||||
effect eDam=EffectDamage(d6(5),DAMAGE_TYPE_BLUDGEONING);
|
||||
effect eLink = EffectLinkEffects(eDam, eSmoke);
|
||||
//Fire cast spell at event for the specified target
|
||||
SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELL_MAGIC_MISSILE));
|
||||
//Make SR Check
|
||||
if (!PRCDoResistSpell(OBJECT_SELF, oTarget))
|
||||
{
|
||||
//Make a Fortitude Save check
|
||||
int nFort=FortitudeSave(oTarget,18);
|
||||
if (nFort==0)
|
||||
{
|
||||
//Apply impact and linked effects
|
||||
ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eSmoke, GetLocation(oTarget),2.0);
|
||||
DestroyObject(oTarget);
|
||||
}
|
||||
else if(nFort==1)
|
||||
{
|
||||
ApplyEffectToObject(DURATION_TYPE_INSTANT, eLink, oTarget);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//Fear
|
||||
void Fear(object oTarget)
|
||||
{
|
||||
if(PRCDoRangedTouchAttack(oTarget,VFX_BEAM_HOLY)!=0)
|
||||
{
|
||||
//Declare major variables
|
||||
effect eImpact = EffectVisualEffect(VFX_IMP_FEAR_S);
|
||||
effect eDur = EffectVisualEffect(VFX_DUR_MIND_AFFECTING_FEAR);
|
||||
effect eFear =EffectFrightened();
|
||||
effect eLink = EffectLinkEffects(eImpact, eDur);
|
||||
eLink = EffectLinkEffects(eLink, eFear);
|
||||
int nCasterLevel=GetLevelByPosition(1,OBJECT_SELF);
|
||||
int nDuration=nCasterLevel;
|
||||
//Fire cast spell at event for the specified target
|
||||
SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELL_FEAR));
|
||||
//Make SR Check
|
||||
if (!PRCDoResistSpell(OBJECT_SELF, oTarget))
|
||||
{
|
||||
//Make a Will Save check
|
||||
if (WillSave(oTarget,18,SAVING_THROW_TYPE_MIND_SPELLS)==0)
|
||||
{
|
||||
//Apply impact and linked effects
|
||||
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget,RoundsToSeconds(nDuration));
|
||||
AssignCommand(oTarget,ClearAllActions());
|
||||
AssignCommand(oTarget,ActionMoveAwayFromObject(OBJECT_SELF,TRUE,50.0));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
//Slow
|
||||
void Slow(object oTarget)
|
||||
{
|
||||
if(PRCDoRangedTouchAttack(oTarget,VFX_BEAM_HOLY)!=0)
|
||||
{
|
||||
//Declare major variables
|
||||
effect eImpact = EffectVisualEffect(VFX_IMP_SLOW);
|
||||
effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE);
|
||||
effect eSlow =EffectSlow();
|
||||
effect eLink = EffectLinkEffects(eImpact, eDur);
|
||||
eLink = EffectLinkEffects(eLink, eSlow);
|
||||
int nCasterLevel=PRCGetCasterLevel(OBJECT_SELF);
|
||||
int nDuration=nCasterLevel;
|
||||
//Fire cast spell at event for the specified target
|
||||
SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELL_SLOW));
|
||||
//Make SR Check
|
||||
if (!PRCDoResistSpell(OBJECT_SELF, oTarget))
|
||||
{
|
||||
//Make a Will Save check
|
||||
if (WillSave(oTarget,18)==0)
|
||||
{
|
||||
//Apply impact and linked effects
|
||||
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget,RoundsToSeconds(nDuration));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//Inflict moderate wounds
|
||||
void InflictModerateWounds(object oTarget)
|
||||
{
|
||||
//if(RangedTouch(oTarget,VFX_BEAM_FIRE)!=0)
|
||||
if(PRCDoRangedTouchAttack(oTarget,VFX_BEAM_FIRE)!=0)
|
||||
{
|
||||
//Declare major variables
|
||||
effect eNeg=EffectVisualEffect(VFX_COM_HIT_NEGATIVE);
|
||||
effect eDam=EffectDamage(d8(2)+10,DAMAGE_TYPE_MAGICAL);
|
||||
effect eDam2=EffectDamage((d8(2)+10)/2,DAMAGE_TYPE_MAGICAL);
|
||||
effect eLink = EffectLinkEffects(eDam, eNeg);
|
||||
effect eLink2 = EffectLinkEffects(eDam2, eNeg);
|
||||
//Fire cast spell at event for the specified target
|
||||
SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELL_MAGIC_MISSILE));
|
||||
//Make SR Check
|
||||
if (!ResistSpell(OBJECT_SELF, oTarget))
|
||||
{
|
||||
//Make a Will Save check
|
||||
int nWill=WillSave(oTarget,18);
|
||||
if (nWill==0)
|
||||
{
|
||||
//Apply impact and linked effects
|
||||
ApplyEffectToObject(DURATION_TYPE_INSTANT, eLink, oTarget);
|
||||
}
|
||||
else if(nWill==1)
|
||||
{
|
||||
ApplyEffectToObject(DURATION_TYPE_INSTANT, eLink2, oTarget);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//Finger of death
|
||||
void FingerOfDeath(object oTarget)
|
||||
{
|
||||
if(PRCDoRangedTouchAttack(oTarget,VFX_BEAM_COLD)!=0)
|
||||
{
|
||||
//Declare major variables
|
||||
effect eNeg=EffectVisualEffect(VFX_COM_HIT_NEGATIVE);
|
||||
effect eDeath=EffectDeath(TRUE);
|
||||
effect eDam=EffectDamage(d6(3)+13,DAMAGE_TYPE_MAGICAL);
|
||||
effect eLink = EffectLinkEffects(eDeath, eNeg);
|
||||
effect eLink2 = EffectLinkEffects(eDam, eNeg);
|
||||
//Fire cast spell at event for the specified target
|
||||
SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELL_FINGER_OF_DEATH));
|
||||
//Make SR Check
|
||||
if (!ResistSpell(OBJECT_SELF, oTarget))
|
||||
{
|
||||
//Make a Fortitude Save check
|
||||
int nFort=FortitudeSave(oTarget,18);
|
||||
if (nFort==0)
|
||||
{
|
||||
//Apply impact and linked effects
|
||||
ApplyEffectToObject(DURATION_TYPE_INSTANT, eLink, oTarget);
|
||||
}
|
||||
else if(nFort==1)
|
||||
{
|
||||
ApplyEffectToObject(DURATION_TYPE_INSTANT, eLink2, oTarget);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//Telekinesis
|
||||
void Telekinesis(object oTarget)
|
||||
{
|
||||
// SetLocalInt(OBJECT_SELF,"TelekinesisUsed",1);
|
||||
if(PRCDoRangedTouchAttack(oTarget,VFX_BEAM_ODD)!=0)
|
||||
{
|
||||
//Declare major variables
|
||||
effect eVFX=EffectVisualEffect(VFX_FNF_SCREEN_BUMP);
|
||||
effect eFall=EffectKnockdown();
|
||||
effect eParalyze=EffectParalyze();
|
||||
effect eDam=EffectDamage(d4(2),DAMAGE_TYPE_BLUDGEONING);
|
||||
effect eLink = EffectLinkEffects(eVFX, eDam);
|
||||
eLink=EffectLinkEffects(eLink, eParalyze);
|
||||
eLink=EffectLinkEffects(eLink, eFall);
|
||||
//Fire cast spell at event for the specified target
|
||||
SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELL_MAGIC_MISSILE));
|
||||
//Make SR Check
|
||||
if (!ResistSpell(OBJECT_SELF, oTarget))
|
||||
{
|
||||
//Make a Will Save check
|
||||
if (WillSave(oTarget,18)==0)
|
||||
{
|
||||
//Apply impact and linked effects
|
||||
AssignCommand(oTarget,ClearAllActions());
|
||||
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget,5.0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CentalEyeRay(object oTarget)
|
||||
{
|
||||
if(CalcArc(oTarget)==1)
|
||||
{
|
||||
//Declares the silence effect. Some leeched from the silence AOE script.
|
||||
effect eDur=EffectVisualEffect(VFX_IMP_SILENCE);
|
||||
effect eDispel=EffectVisualEffect(VFX_IMP_DISPEL);
|
||||
effect eSilence=EffectSilence();
|
||||
effect eLink=EffectLinkEffects(eDur, eSilence);
|
||||
//Removes all temporary effects from target.
|
||||
effect eTemp=GetFirstEffect(oTarget);
|
||||
while(GetIsEffectValid(eTemp))
|
||||
{
|
||||
if(GetEffectDurationType(eTemp)==DURATION_TYPE_TEMPORARY||GetEffectSubType(eTemp)==(SUBTYPE_MAGICAL||SUBTYPE_SUPERNATURAL))
|
||||
{
|
||||
//Debug String
|
||||
//AssignCommand(oTarget, SpeakString("Removing effects"));
|
||||
RemoveEffect(oTarget,eTemp);
|
||||
ApplyEffectToObject(DURATION_TYPE_INSTANT, eDispel, oTarget);
|
||||
}
|
||||
eTemp=GetNextEffect(oTarget);
|
||||
}
|
||||
//Applies the effects
|
||||
if(!GetIsFriend(oTarget,OBJECT_SELF))
|
||||
{
|
||||
SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELL_SILENCE));
|
||||
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink, oTarget);
|
||||
}
|
||||
else
|
||||
{
|
||||
SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELL_SILENCE, FALSE));
|
||||
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink, oTarget);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
int bValid = FALSE;
|
||||
effect eAOE;
|
||||
eAOE = GetFirstEffect(oTarget);
|
||||
while (GetIsEffectValid(eAOE))
|
||||
{
|
||||
//Debug String
|
||||
//AssignCommand(oTarget, SpeakString("Effect is valid"));
|
||||
if (GetEffectCreator(eAOE) == GetAreaOfEffectCreator())
|
||||
{
|
||||
//Debug String
|
||||
//AssignCommand(oTarget, SpeakString("Effect creator is true"));
|
||||
if(GetEffectType(eAOE) == EFFECT_TYPE_SILENCE)
|
||||
{
|
||||
//Debug String
|
||||
//AssignCommand(oTarget, SpeakString("Effect type is silence"));
|
||||
//AssignCommand(oTarget, SpeakString("Removing effects"));
|
||||
RemoveEffect(oTarget, eAOE);
|
||||
}
|
||||
}
|
||||
eAOE = GetNextEffect(oTarget);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void AssignBestAction()
|
||||
{
|
||||
//Get threat of near enemies.
|
||||
object oNearestE=GetNearestCreature(CREATURE_TYPE_REPUTATION,REPUTATION_TYPE_ENEMY,OBJECT_SELF,1,CREATURE_TYPE_IS_ALIVE,TRUE);
|
||||
object oTemp=oNearestE;
|
||||
object oFacing=GetLocalObject(OBJECT_SELF,"Facing");
|
||||
int nCount=1;
|
||||
int nCloseEnemy=0;
|
||||
float fPrefDist=10.0;
|
||||
while(GetDistanceBetween(OBJECT_SELF,oTemp)<fPrefDist&&oTemp!=OBJECT_INVALID)
|
||||
{
|
||||
nCloseEnemy+=(GetLevel(oTemp)-GetSpellCasterLvl(oTemp));
|
||||
nCount++;
|
||||
oTemp=GetNearestCreature(CREATURE_TYPE_REPUTATION,REPUTATION_TYPE_ENEMY,OBJECT_SELF,nCount,CREATURE_TYPE_IS_ALIVE,TRUE);
|
||||
}
|
||||
//Assign what to do.
|
||||
if(nCloseEnemy<GetLevel(OBJECT_SELF))
|
||||
{
|
||||
if(GetLocalInt(OBJECT_SELF,"EyeOpen"))
|
||||
{
|
||||
if(GetDistanceBetween(OBJECT_SELF,oFacing)>3.0)
|
||||
{
|
||||
//Debug String
|
||||
//AssignCommand(OBJECT_SELF,SpeakString("This position is good!"));
|
||||
//ID:1
|
||||
if(GetLocalInt(OBJECT_SELF,"CurrentAction")!=1)
|
||||
{
|
||||
SetLocalInt(OBJECT_SELF,"CurrentAction",1);
|
||||
AssignCommand(OBJECT_SELF,ClearAllActions());
|
||||
AssignCommand(OBJECT_SELF,SetFacingPoint(GetPosition(oFacing)));
|
||||
AssignCommand(OBJECT_SELF,ActionAttack(oFacing,TRUE));
|
||||
}
|
||||
else
|
||||
{
|
||||
AssignCommand(OBJECT_SELF,ActionAttack(oFacing,TRUE));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//Debug String
|
||||
//AssignCommand(OBJECT_SELF,SpeakString("This position is ok!"));
|
||||
//ID:2
|
||||
if(GetLocalInt(OBJECT_SELF,"CurrentAction")!=2)
|
||||
{
|
||||
SetLocalInt(OBJECT_SELF,"CurrentAction",2);
|
||||
AssignCommand(OBJECT_SELF,ClearAllActions());
|
||||
AssignCommand(OBJECT_SELF,ActionAttack(oFacing,FALSE));
|
||||
}
|
||||
else
|
||||
{
|
||||
AssignCommand(OBJECT_SELF,ActionAttack(oFacing,FALSE));
|
||||
}
|
||||
}
|
||||
//AssignCommand(OBJECT_SELF,ActionAttack(oFacing,TRUE));
|
||||
}
|
||||
else
|
||||
{
|
||||
//Debug String
|
||||
//AssignCommand(OBJECT_SELF,SpeakString("I'll just eat you!"));
|
||||
//ID:3
|
||||
if(GetLocalInt(OBJECT_SELF,"CurrentAction")!=3)
|
||||
{
|
||||
SetLocalInt(OBJECT_SELF,"CurrentAction",3);
|
||||
AssignCommand(OBJECT_SELF,ClearAllActions());
|
||||
AssignCommand(OBJECT_SELF,ActionAttack(oNearestE,FALSE));
|
||||
}
|
||||
else
|
||||
{
|
||||
AssignCommand(OBJECT_SELF,ActionAttack(oNearestE,FALSE));
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//Debug String
|
||||
//AssignCommand(OBJECT_SELF,SpeakString("This position is bad!"));
|
||||
//ID:4
|
||||
if(GetLocalInt(OBJECT_SELF,"CurrentAction")!=4||GetCurrentAction(OBJECT_SELF)!=ACTION_MOVETOPOINT)
|
||||
{
|
||||
SetLocalInt(OBJECT_SELF,"CurrentAction",4);
|
||||
AssignCommand(OBJECT_SELF,ClearAllActions());
|
||||
if(GetDistanceBetween(OBJECT_SELF,oFacing)>fPrefDist)
|
||||
{
|
||||
AssignCommand(OBJECT_SELF,ActionAttack(oFacing,FALSE));
|
||||
}
|
||||
else
|
||||
{
|
||||
AssignCommand(OBJECT_SELF,ActionMoveAwayFromObject(oNearestE,TRUE,1.5*fPrefDist));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if(GetDistanceBetween(OBJECT_SELF,oFacing)>fPrefDist)
|
||||
{
|
||||
AssignCommand(OBJECT_SELF,ActionAttack(oFacing,FALSE));
|
||||
}
|
||||
else
|
||||
{
|
||||
AssignCommand(OBJECT_SELF,ActionMoveAwayFromObject(oNearestE,TRUE,1.5*fPrefDist));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//:: void main (){}
|
Reference in New Issue
Block a user