Added updated ProjectQ troll chief model
Added updated ProjectQ troll chief model. Created encounter table for Great Northern Desert. Created or imported several pnp creature UTCs: vampire spawn, spectre, mohrg, basilisk, monstrous scorpions, air & earth elementals, ankhegs. Created pnp attacks for vampire & spectre. Full compile. Co-Authored-By: Draygoth <65428430+Draygoth@users.noreply.github.com>
This commit is contained in:
@@ -1,186 +0,0 @@
|
||||
///////////////////////////////////
|
||||
// Carcerian's BattleCry Script //
|
||||
// "Evil Dead" Edition //
|
||||
///////////////////////////////////
|
||||
|
||||
#include "NW_I0_GENERIC"
|
||||
#include "prc_inc_racial"
|
||||
|
||||
const int BattleCryChance = 15;
|
||||
const int CombatCryChance = 20;
|
||||
const int DeathCryChance = 20;
|
||||
const int CustomUndeadChance = 50;
|
||||
|
||||
const string COLOR_RED = "<c<> >";
|
||||
const string COLOR_DARK = "<cSSS>";
|
||||
const string COLOR_GREEN = "<c <20> >";
|
||||
const string COLOR_WHITE = "<c<><63><EFBFBD>>";
|
||||
const string COLOR_VIOLET = "<c<> <20>>";
|
||||
const string COLOR_YELLOW = "<c<><63> >";
|
||||
|
||||
int HasSpoken()
|
||||
{
|
||||
if (GetLocalInt(OBJECT_SELF,"HASSPOKEN")) return 1;
|
||||
SetLocalInt(OBJECT_SELF,"HASSPOKEN",1);
|
||||
DelayCommand(IntToFloat(d10(4)),SetLocalInt(OBJECT_SELF,"HASSPOKEN",0));
|
||||
return 0;
|
||||
}
|
||||
|
||||
void DoUndeadChatter()
|
||||
{
|
||||
string sMyTag = GetTag(OBJECT_SELF);
|
||||
if ((FindSubString(sMyTag,"SKEL")>-1)||(FindSubString(sMyTag,"MOHRG")>-1))
|
||||
{
|
||||
switch (d3()) // Skeletons
|
||||
{
|
||||
case 1 : ActionSpeakString(COLOR_WHITE+"I got a bone to pick with you!",TALKVOLUME_TALK); break;
|
||||
case 2 : ActionSpeakString(COLOR_WHITE+"Forward, you worthless bags of bones!",TALKVOLUME_TALK); break;
|
||||
case 3 : ActionSpeakString(COLOR_WHITE+"CHARGE!",TALKVOLUME_TALK); break;
|
||||
}
|
||||
}
|
||||
else if (FindSubString(sMyTag,"ZOMB")>-1)
|
||||
{
|
||||
if (Random(2)) ActionSpeakString(COLOR_GREEN+"Brains!",TALKVOLUME_TALK);
|
||||
else ActionSpeakString(COLOR_GREEN+"BRAINS!",TALKVOLUME_TALK);
|
||||
// "More brains!"
|
||||
}
|
||||
else if ((FindSubString(sMyTag,"GHOUL")>-1)||(FindSubString(sMyTag,"GHAST")>-1)
|
||||
||(FindSubString(sMyTag,"WIGHT")>-1))
|
||||
{
|
||||
switch (d4()) // Flesh Eaters
|
||||
{
|
||||
case 1 : ActionSpeakString(COLOR_GREEN+"I'll feast on your entrails!",TALKVOLUME_TALK); break;
|
||||
case 2 : ActionSpeakString(COLOR_GREEN+"FOOD!",TALKVOLUME_TALK); break;
|
||||
case 3 : ActionSpeakString(COLOR_GREEN+"Live ones!!",TALKVOLUME_TALK); break;
|
||||
case 4 : ActionSpeakString(COLOR_GREEN+"FLESSSSHHHH!!!",TALKVOLUME_TALK); break;
|
||||
}
|
||||
}
|
||||
else if ((FindSubString(sMyTag,"WRAITH")>-1)||(FindSubString(sMyTag,"ALLIP")>-1)
|
||||
||(FindSubString(sMyTag,"Bodak")>-1)||(FindSubString(sMyTag,"SHADOW")>-1)
|
||||
||(FindSubString(sMyTag,"SHFIEND")>-1)||(FindSubString(sMyTag,"SPECTRE")>-1))
|
||||
{
|
||||
switch (d4()) // Soul Eaters
|
||||
{
|
||||
case 1 : ActionSpeakString(COLOR_VIOLET+"I'll swallow your soul!",TALKVOLUME_TALK); break;
|
||||
case 2 : ActionSpeakString(COLOR_VIOLET+"Your soul will be mine!",TALKVOLUME_TALK); break;
|
||||
case 3 : ActionSpeakString(COLOR_VIOLET+"Mine!!!!",TALKVOLUME_TALK); break;
|
||||
case 4 : ActionSpeakString(COLOR_VIOLET+"The darkness calls for you...",TALKVOLUME_TALK); break;
|
||||
}
|
||||
}
|
||||
else switch (d6()) // Generic Undead
|
||||
{
|
||||
case 1 : ActionSpeakString(COLOR_RED+"I'll swallow your soul!",TALKVOLUME_TALK); break;
|
||||
case 2 : ActionSpeakString(COLOR_RED+"Blood and souls!",TALKVOLUME_TALK); break;
|
||||
case 3 : ActionSpeakString(COLOR_RED+"Joinnnn usssssssss!",TALKVOLUME_TALK); break;
|
||||
case 4 : ActionSpeakString(COLOR_RED+"For the Master!",TALKVOLUME_TALK); break;
|
||||
case 5 : ActionSpeakString(COLOR_RED+"For the Master!",TALKVOLUME_TALK); break;
|
||||
case 6 : ActionSpeakString(COLOR_RED+"One by one we will take you!",TALKVOLUME_TALK); break;
|
||||
}
|
||||
}
|
||||
|
||||
// For use on perception
|
||||
void DoBattleCry()
|
||||
{ //if undead spotted "i see dead people!" "Dead ahead!"
|
||||
if (d100()<=BattleCryChance)
|
||||
{
|
||||
if (HasSpoken()) return;
|
||||
if ((MyPRCGetRacialType(OBJECT_SELF) == RACIAL_TYPE_UNDEAD)&&(d100()<=CustomUndeadChance))
|
||||
{
|
||||
DoUndeadChatter();
|
||||
}
|
||||
else switch (d10())
|
||||
{
|
||||
case 1: PlayVoiceChat(VOICE_CHAT_ATTACK); break;
|
||||
case 2: PlayVoiceChat(VOICE_CHAT_BATTLECRY1); break;
|
||||
case 3: PlayVoiceChat(VOICE_CHAT_BATTLECRY2); break;
|
||||
case 4: PlayVoiceChat(VOICE_CHAT_BATTLECRY3); break;
|
||||
case 5: PlayVoiceChat(VOICE_CHAT_THREATEN); break;
|
||||
case 6: PlayVoiceChat(VOICE_CHAT_TAUNT); break;
|
||||
case 7: PlayVoiceChat(VOICE_CHAT_ENEMIES); break;
|
||||
case 8: PlayVoiceChat(VOICE_CHAT_CHEER); break;
|
||||
case 9: PlayVoiceChat(VOICE_CHAT_FOLLOWME); break;
|
||||
case 10: PlayVoiceChat(VOICE_CHAT_LOOKHERE); break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//For End of Combat Round
|
||||
void DoCombatCry()
|
||||
{
|
||||
if (GetHasEffect(EFFECT_TYPE_FRIGHTENED))
|
||||
{
|
||||
if (d100()<=CombatCryChance)
|
||||
{
|
||||
if (HasSpoken()) return;
|
||||
if ((MyPRCGetRacialType(OBJECT_SELF) == RACIAL_TYPE_UNDEAD)&&(d100()<=CustomUndeadChance))
|
||||
switch (d6()) //Turned undead :)
|
||||
{
|
||||
case 1 : ActionSpeakString(COLOR_YELLOW+"It Burns! It Burns!",TALKVOLUME_TALK); break;
|
||||
case 2 : ActionSpeakString(COLOR_YELLOW+"Cursed Light!",TALKVOLUME_TALK); break;
|
||||
case 3 : ActionSpeakString(COLOR_YELLOW+"Your faith is weak, I can feel your fear...",TALKVOLUME_TALK); break;
|
||||
case 4 : ActionSpeakString(COLOR_YELLOW+"AAAIIIEEE!!!",TALKVOLUME_TALK); break;
|
||||
case 5 : ActionSpeakString(COLOR_YELLOW+"NOOO!!!",TALKVOLUME_TALK); break;
|
||||
case 6 : ActionSpeakString(COLOR_YELLOW+"It Burns!",TALKVOLUME_TALK); break;
|
||||
}
|
||||
else switch (d6())
|
||||
{
|
||||
case 1: PlayVoiceChat(VOICE_CHAT_FLEE); break;
|
||||
case 2: PlayVoiceChat(VOICE_CHAT_HELP); break;
|
||||
case 3: PlayVoiceChat(VOICE_CHAT_GUARDME); break;
|
||||
case 4: PlayVoiceChat(VOICE_CHAT_CUSS); break;
|
||||
case 5: PlayVoiceChat(VOICE_CHAT_BADIDEA); break;
|
||||
case 6: PlayVoiceChat(VOICE_CHAT_NEARDEATH); break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (d100()<=CombatCryChance)
|
||||
{
|
||||
if (HasSpoken()) return;
|
||||
if ((MyPRCGetRacialType(OBJECT_SELF) == RACIAL_TYPE_UNDEAD)&&(d100()<=CustomUndeadChance))
|
||||
switch (d6())
|
||||
{
|
||||
DoUndeadChatter();
|
||||
}
|
||||
else switch (d6())
|
||||
{
|
||||
case 1: PlayVoiceChat(VOICE_CHAT_BATTLECRY1); break;
|
||||
case 2: PlayVoiceChat(VOICE_CHAT_BATTLECRY2); break;
|
||||
case 3: PlayVoiceChat(VOICE_CHAT_BATTLECRY3); break;
|
||||
case 4: PlayVoiceChat(VOICE_CHAT_LAUGH); break;
|
||||
case 5: PlayVoiceChat(VOICE_CHAT_TAUNT); break;
|
||||
case 6: PlayVoiceChat(VOICE_CHAT_THREATEN); break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//For Creature Death
|
||||
void DoDeathCry()
|
||||
{
|
||||
if (d100()<=DeathCryChance)
|
||||
{
|
||||
if (HasSpoken()) return;
|
||||
if ((MyPRCGetRacialType(OBJECT_SELF) == RACIAL_TYPE_UNDEAD)&&(d100()<=CustomUndeadChance))
|
||||
switch (d6())
|
||||
{
|
||||
case 1 : ActionSpeakString(COLOR_RED+"Dead by dawn! Dead by dawn!",TALKVOLUME_TALK); break;
|
||||
case 2 : ActionSpeakString(COLOR_RED+"Death is only the beginning!",TALKVOLUME_TALK); break;
|
||||
case 3 : ActionSpeakString(COLOR_RED+"Darkness take me...",TALKVOLUME_TALK); break;
|
||||
case 4 : ActionSpeakString(COLOR_RED+"Free at last...",TALKVOLUME_TALK); break;
|
||||
case 5 : ActionSpeakString(COLOR_RED+"Time to die...",TALKVOLUME_TALK); break;
|
||||
case 6 : ActionSpeakString(COLOR_RED+"Thank you...",TALKVOLUME_TALK); break;
|
||||
} // "No more tears..."
|
||||
else switch (d6())
|
||||
{
|
||||
case 1: PlayVoiceChat(VOICE_CHAT_CUSS); break;
|
||||
case 2: PlayVoiceChat(VOICE_CHAT_DEATH); break;
|
||||
case 3: PlayVoiceChat(VOICE_CHAT_NEARDEATH); break;
|
||||
case 4: PlayVoiceChat(VOICE_CHAT_GOODBYE); break;
|
||||
case 5: PlayVoiceChat(VOICE_CHAT_LAUGH); break;
|
||||
case 6: PlayVoiceChat(VOICE_CHAT_HEALME); break;
|
||||
}
|
||||
}
|
||||
}
|
||||
//void main (){}
|
@@ -1,202 +0,0 @@
|
||||
#include "prc_inc_racial"
|
||||
|
||||
const float fUnlifespan = 300.0;
|
||||
|
||||
string SpawnOf(object oSpawnKiller = OBJECT_INVALID)
|
||||
{
|
||||
string sSpawn = "";
|
||||
string sKiller = GetName(oSpawnKiller, FALSE);
|
||||
object oLeft = GetItemInSlot(INVENTORY_SLOT_LEFTHAND,oSpawnKiller);
|
||||
object oRight = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,oSpawnKiller);
|
||||
string sLeftTag = GetTag(oLeft);
|
||||
string sRightTag = GetTag(oRight);
|
||||
if (!(GetStringRight(sKiller, 6) ==" Spawn") ||
|
||||
!(GetStringRight(sKiller, 6) ==" Rat"))
|
||||
if ((GetIsPC(GetMaster(oSpawnKiller))||(GetIsPC(oSpawnKiller))))
|
||||
{
|
||||
if ((FindSubString(sKiller, "Morg")>-1)||
|
||||
(sRightTag=="vampirespawner")||
|
||||
(sLeftTag=="vampirespawner")) sSpawn = "namechspawn";
|
||||
/* // No Vampires on Athas
|
||||
if ((FindSubString(sKiller, "Vampire")>-1)||(sRightTag=="vampirespawner")||(sLeftTag=="vampirespawner"))
|
||||
{
|
||||
if (GetGender(OBJECT_SELF)==GENDER_FEMALE) sSpawn = "vampirespawn_f";
|
||||
else sSpawn = "vampirespawn_m";
|
||||
} */
|
||||
else if ((FindSubString(sKiller, "Tyrantfog")>-1)||(sRightTag=="tyrantfogspawner")) sSpawn = "zombiespawn";
|
||||
else if (FindSubString(sKiller, "Ghoul")>-1) sSpawn = "ghoulspawn";
|
||||
else if (FindSubString(sKiller, "Ghast")>-1) sSpawn = "ghoulspawn";
|
||||
else if ((FindSubString(sKiller, "Shadow")>-1)||(sRightTag=="shadowspawner")) sSpawn = "shadowspawn";
|
||||
else if (FindSubString(sKiller, "Spectre")>-1) sSpawn = "spectrespawn";
|
||||
else if (FindSubString(sKiller, "Wraith")>-1) sSpawn = "wraithspawn";
|
||||
else if ((FindSubString(sKiller, "Wight")>-1)||(sRightTag=="wightspawner")) sSpawn = "wightspawn";
|
||||
else if (FindSubString(sKiller, "Crypt Chanter")>-1) sSpawn = "wraithspawn";
|
||||
else if (FindSubString(sKiller, "Bleakborn")>-1) sSpawn = "zombiespawn";
|
||||
else if (FindSubString(sKiller, "Bodak")>-1) sSpawn = "zombiespawn";
|
||||
else if (FindSubString(sKiller, "T'liz")>-1) sSpawn = "namechspawn";
|
||||
else if ((FindSubString(sKiller, "Meorty")>-1) ||
|
||||
(FindSubString(sKiller, "Amithrang")>-1)) sSpawn = "namechspawn";
|
||||
}
|
||||
else // Monster Killer
|
||||
{
|
||||
if (FindSubString(sKiller, "Tyrantfog")>-1) sSpawn = "zombiespawn";
|
||||
else if (FindSubString(sKiller, "Ghast")>-1) sSpawn = "ghoulspawn";
|
||||
else if (FindSubString(sKiller, "Ghoul")>-1) sSpawn = "ghoulspawn";
|
||||
else if (((FindSubString(sKiller, "Meorty")>-1) ||
|
||||
(FindSubString(sKiller, "Amithrang")>-1))) sSpawn = "namechspawn";
|
||||
else if (FindSubString(sKiller, "Shadow")>-1) sSpawn = "shadowspawn";
|
||||
else if (FindSubString(sKiller, "Spectre")>-1) sSpawn = "spectrespawn";
|
||||
else if (FindSubString(sKiller, "Crypt Chanter")>-1) sSpawn = "wraithspawn";
|
||||
else if (FindSubString(sKiller, "Bleakborn")>-1) sSpawn = "zombiespawn";
|
||||
else if (FindSubString(sKiller, "Bodak")>-1) sSpawn = "zombiespawn";
|
||||
else if (FindSubString(sKiller, "T'liz")>-1) sSpawn = "namechspawn";
|
||||
else if ((FindSubString(sKiller, "Morg")>-1)||
|
||||
(sRightTag=="vampirespawner")||
|
||||
(sLeftTag=="vampirespawner")) sSpawn = "namechspawn";
|
||||
/* //No Vampires on Athas
|
||||
{
|
||||
if (GetGender(OBJECT_SELF)==GENDER_FEMALE) sSpawn = "vampirespawn_f";
|
||||
else sSpawn = "vampirespawn_m";
|
||||
}*/
|
||||
else if (FindSubString(sKiller, "Wight")>-1) sSpawn = "wightspawn";
|
||||
if (FindSubString(sKiller, "Wraith")>-1) sSpawn = "wraithspawn";
|
||||
}
|
||||
return sSpawn;
|
||||
}
|
||||
|
||||
int ShadeType(object oShadeKiller = OBJECT_INVALID)
|
||||
{
|
||||
int iShade = 0;
|
||||
string sSpawn = "";
|
||||
string sKiller = GetName(oShadeKiller);
|
||||
object oRight = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,oShadeKiller);
|
||||
string sRightTag = GetTag(oRight);
|
||||
if ((FindSubString(sKiller, "Shadow")>-1)||(sRightTag=="shadowspawner")) iShade = 1;
|
||||
else if (FindSubString(sKiller, "Spectre")>-1) iShade = 2;
|
||||
if (FindSubString(sKiller, "Wraith")>-1) iShade = 3;
|
||||
return iShade;
|
||||
}
|
||||
|
||||
int IsSpawnable(int iSpawnRace)
|
||||
{
|
||||
int iSpawnable = 0;
|
||||
if ((iSpawnRace == RACIAL_TYPE_ANIMAL)||
|
||||
(iSpawnRace == RACIAL_TYPE_BEAST)||
|
||||
(iSpawnRace == RACIAL_TYPE_MAGICAL_BEAST)||
|
||||
(iSpawnRace == RACIAL_TYPE_SHAPECHANGER)||
|
||||
(iSpawnRace == RACIAL_TYPE_VERMIN)||
|
||||
(iSpawnRace == RACIAL_TYPE_ABERRATION)||
|
||||
(iSpawnRace == RACIAL_TYPE_FEY)||
|
||||
(iSpawnRace == RACIAL_TYPE_GIANT)||
|
||||
(iSpawnRace == RACIAL_TYPE_HUMANOID_GOBLINOID)||
|
||||
(iSpawnRace == RACIAL_TYPE_HUMANOID_MONSTROUS)||
|
||||
(iSpawnRace == RACIAL_TYPE_HUMANOID_ORC)||
|
||||
(iSpawnRace == RACIAL_TYPE_HUMANOID_REPTILIAN)||
|
||||
(iSpawnRace == RACIAL_TYPE_DRAGON)||
|
||||
(iSpawnRace == RACIAL_TYPE_DWARF)||
|
||||
(iSpawnRace == RACIAL_TYPE_ELF)||
|
||||
(iSpawnRace == RACIAL_TYPE_GNOME)||
|
||||
(iSpawnRace == RACIAL_TYPE_HALFELF)||
|
||||
(iSpawnRace == RACIAL_TYPE_HALFLING)||
|
||||
(iSpawnRace == RACIAL_TYPE_HUMAN)||
|
||||
(iSpawnRace == RACIAL_TYPE_HALFORC))
|
||||
iSpawnable = 1;
|
||||
return iSpawnable;
|
||||
}
|
||||
|
||||
int IsNonHuman(int iSpawnRace)
|
||||
{
|
||||
int iSpawnable = 0;
|
||||
if ((iSpawnRace == RACIAL_TYPE_ANIMAL)||
|
||||
(iSpawnRace == RACIAL_TYPE_BEAST)||
|
||||
(iSpawnRace == RACIAL_TYPE_DRAGON)||
|
||||
(iSpawnRace == RACIAL_TYPE_MAGICAL_BEAST)||
|
||||
(iSpawnRace == RACIAL_TYPE_VERMIN)||
|
||||
(iSpawnRace == RACIAL_TYPE_ABERRATION)||
|
||||
(iSpawnRace == RACIAL_TYPE_FEY)||
|
||||
(iSpawnRace == RACIAL_TYPE_GIANT) ||
|
||||
(iSpawnRace == RACIAL_TYPE_HUMANOID_GOBLINOID)||
|
||||
(iSpawnRace == RACIAL_TYPE_HUMANOID_MONSTROUS)||
|
||||
(iSpawnRace == RACIAL_TYPE_HUMANOID_ORC)||
|
||||
(iSpawnRace == RACIAL_TYPE_HUMANOID_REPTILIAN))
|
||||
iSpawnable = 1;
|
||||
return iSpawnable;
|
||||
}
|
||||
|
||||
int UndeadCheck(object oMyKiller)
|
||||
{
|
||||
int iPassed = 0;
|
||||
int iSpawnVFX = VFX_FNF_SUMMON_UNDEAD;
|
||||
object oMyKiller = GetLastKiller();
|
||||
int iRace = MyPRCGetRacialType(OBJECT_SELF);
|
||||
int iKillerRace = MyPRCGetRacialType(oMyKiller);
|
||||
int iKillerUndeadClass = GetLevelByClass(CLASS_TYPE_UNDEAD, oMyKiller);
|
||||
object oLeft = GetItemInSlot(INVENTORY_SLOT_LEFTHAND,oMyKiller);
|
||||
object oRight = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,oMyKiller);
|
||||
string sLeftTag = GetTag(oLeft);
|
||||
string sRightTag = GetTag(oRight);
|
||||
if ((iKillerRace==RACIAL_TYPE_UNDEAD)
|
||||
||(iKillerUndeadClass>0)
|
||||
||(sRightTag=="tyrantfogspawner")
|
||||
||(sRightTag=="shadowspawner")
|
||||
||(sRightTag=="CR_SLAM_PSISHAD1")
|
||||
||(sLeftTag=="CR_SLAM_PSISHAD1")
|
||||
||(sRightTag=="vampirespawner")
|
||||
||(sLeftTag=="vampirespawner"))
|
||||
if (IsSpawnable(iRace))
|
||||
{
|
||||
string sSpawnStr = SpawnOf(oMyKiller);
|
||||
if (sSpawnStr != "")
|
||||
{
|
||||
ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectVisualEffect(iSpawnVFX), OBJECT_SELF);
|
||||
object oSpawn = CreateObject(OBJECT_TYPE_CREATURE, sSpawnStr, GetLocation(OBJECT_SELF));
|
||||
if (GetIsObjectValid(oSpawn)) iPassed = 1;
|
||||
SetPortraitId(oSpawn, GetPortraitId(OBJECT_SELF));
|
||||
if (GetIsPC(GetMaster(oMyKiller))||(GetIsPC(oMyKiller)))
|
||||
{
|
||||
SetName(oSpawn,GetName(OBJECT_SELF,FALSE)+" "+GetName(oSpawn,TRUE));
|
||||
if (GetIsObjectValid(GetMaster(oMyKiller)))
|
||||
AddHenchman(GetMaster(oMyKiller), oSpawn);
|
||||
else AddHenchman(oMyKiller, oSpawn);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetName(oSpawn,GetName(OBJECT_SELF,FALSE)+" "+GetName(oSpawn,TRUE));
|
||||
//if (FindSubString(GetName(OBJECT_SELF)," Spawn")==-1) SetName(GetName(OBJECT_SELF)+ " Spawn");
|
||||
ChangeFaction(oSpawn,oMyKiller);
|
||||
}
|
||||
int iShadeNum = 0;
|
||||
if (IsNonHuman(iRace))
|
||||
{
|
||||
SetCreatureAppearanceType(oSpawn,GetAppearanceType(OBJECT_SELF));
|
||||
iShadeNum = ShadeType(oMyKiller);
|
||||
switch (iShadeNum)
|
||||
{
|
||||
case 1: //dark shadows
|
||||
ApplyEffectToObject(DURATION_TYPE_PERMANENT,SupernaturalEffect(EffectVisualEffect(VFX_DUR_PROT_SHADOW_ARMOR)),oSpawn,7.0);
|
||||
ApplyEffectToObject(DURATION_TYPE_PERMANENT,SupernaturalEffect(EffectVisualEffect(VFX_DUR_GHOST_TRANSPARENT)),oSpawn,7.0);
|
||||
break;
|
||||
case 2: //grey spectre
|
||||
ApplyEffectToObject(DURATION_TYPE_PERMANENT,SupernaturalEffect(EffectVisualEffect(VFX_DUR_GHOST_TRANSPARENT)),oSpawn,7.0);
|
||||
break;
|
||||
case 3: //light wraith
|
||||
ApplyEffectToObject(DURATION_TYPE_PERMANENT,SupernaturalEffect(EffectVisualEffect(VFX_DUR_GLOW_GREY)),oSpawn,7.0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (iShadeNum>0) //Fly off
|
||||
{
|
||||
DelayCommand(fUnlifespan-1.5,ApplyEffectToObject(DURATION_TYPE_PERMANENT,EffectDisappear(), oSpawn));
|
||||
DestroyObject(oSpawn, fUnlifespan);
|
||||
}
|
||||
else // Decay and Disintegrate
|
||||
{
|
||||
DelayCommand(fUnlifespan-1.5,ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectVisualEffect(VFX_IMP_DEATH), oSpawn));
|
||||
DestroyObject(oSpawn, fUnlifespan);
|
||||
}
|
||||
}
|
||||
}
|
||||
return iPassed;
|
||||
}
|
||||
|
||||
//void main() {}
|
117
_module/nss/bld_drain_onhit.nss
Normal file
117
_module/nss/bld_drain_onhit.nss
Normal file
@@ -0,0 +1,117 @@
|
||||
//::
|
||||
//:: bld_drain_onhit.nss
|
||||
//::
|
||||
//:: Modified by: Jaysyn 20221216
|
||||
//::
|
||||
|
||||
#include "prc_inc_combmove"
|
||||
#include "prc_misc_const"
|
||||
|
||||
/*void DoBloodDrain(object oTarget, object oCaster)
|
||||
{
|
||||
//:: Setup oCaster's healing
|
||||
effect eVis1 = EffectVisualEffect(VFX_IMP_HEALING_L);
|
||||
effect eDrain = EffectTemporaryHitpoints(5);
|
||||
|
||||
eDrain = ExtraordinaryEffect(eDrain);
|
||||
|
||||
//:: Setup Blood Drain
|
||||
effect eVis2 = EffectVisualEffect(VFX_IMP_NEGATIVE_ENERGY);
|
||||
effect eBlood = EffectAbilityDecrease(2, d4(1));
|
||||
|
||||
eBlood = SupernaturalEffect(eBlood);
|
||||
|
||||
//:: Drain blood from oTarget
|
||||
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis2, oTarget);
|
||||
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eBlood, oTarget);
|
||||
|
||||
//:: Apply Temp HP to oCaster
|
||||
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis1, oCaster);
|
||||
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eDrain, oCaster, HoursToSeconds(1));
|
||||
|
||||
if (GetGrapple(oTarget) == TRUE)
|
||||
{
|
||||
DelayCommand(6.0f, DoBloodDrain(oTarget, oCaster));
|
||||
}
|
||||
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
void main()
|
||||
{
|
||||
//:: Declare major variables
|
||||
object oCaster = OBJECT_SELF ; //:: Where the spell came from
|
||||
object oTarget = GetSpellTargetObject(); //:: What the spell is aimed at
|
||||
|
||||
int nRaceType = MyPRCGetRacialType(oTarget);
|
||||
int nChaMod = GetAbilityModifier(5, oCaster);
|
||||
int nMobHD = GetHitDice(oCaster);
|
||||
int nDC = 10 + (nMobHD / 2) + nChaMod;
|
||||
int nSave = FortitudeSave( oTarget, nDC );
|
||||
int GrappleBonus = GetLocalInt(oCaster, "GRAPPLE_BONUS");
|
||||
int CasterSize = PRCGetSizeModifier(oCaster);
|
||||
int TargetSize = PRCGetSizeModifier(oTarget);
|
||||
int GrappleChance = d100();
|
||||
|
||||
int nEvent = GetRunningEvent();
|
||||
|
||||
//:: Check for Entangle Immunity
|
||||
if ( GetIsImmune(oTarget, IMMUNITY_TYPE_ENTANGLE) )
|
||||
{
|
||||
SendMessageToPC(oTarget, "Immune to grappling.");
|
||||
SendMessageToPC(oCaster, "Target is immune to grappling.");
|
||||
return;
|
||||
}
|
||||
|
||||
//:: Check for Freedom Itemprop
|
||||
if ( IPGetHasItemPropertyOnCharacter(oTarget, ITEM_PROPERTY_FREEDOM_OF_MOVEMENT) )
|
||||
{
|
||||
SendMessageToPC(oTarget, "Immune to grappling.");
|
||||
SendMessageToPC(oCaster, "Target is immune to grappling.");
|
||||
return;
|
||||
}
|
||||
|
||||
//:: Don't try to grapple on every attack.
|
||||
/* if (GetGrapple(oTarget) == FALSE)
|
||||
{
|
||||
if (GrappleChance >= 66)
|
||||
{
|
||||
return;
|
||||
}
|
||||
}*/
|
||||
|
||||
//:: Can't grapple target if two or more size categories larger than you are.
|
||||
if (TargetSize - 2 >= CasterSize)
|
||||
{
|
||||
FloatingTextStringOnCreature("This creature is too large to grapple.", oCaster);
|
||||
return;
|
||||
}
|
||||
|
||||
//:: If you got this far, you're getting grappled.
|
||||
|
||||
DoGrapple(oCaster, oTarget, 0, TRUE, TRUE);
|
||||
|
||||
//:: Hook in the events if grapple is successful
|
||||
if (GetGrapple(oTarget) == TRUE)
|
||||
{
|
||||
if(DEBUG) DoDebug("Blood Drain: Adding eventhooks");
|
||||
FloatingTextStringOnCreature("Blood Drain: Adding eventhooks.", oCaster);
|
||||
FloatingTextStringOnCreature("Blood Drain: Adding eventhooks.", oTarget);
|
||||
AddEventScript(oTarget, EVENT_HEARTBEAT, "hb_vamp_bl_drain", TRUE, FALSE);
|
||||
}
|
||||
|
||||
/* if (GetGrapple(oTarget) == FALSE)
|
||||
{
|
||||
DoGrapple(oCaster, oTarget, 0, TRUE, TRUE);
|
||||
|
||||
if (GetGrapple(oTarget) == TRUE)
|
||||
{
|
||||
DoBloodDrain(oTarget, oCaster);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
DoBloodDrain(oTarget, oCaster);
|
||||
}*/
|
||||
}
|
@@ -19,7 +19,17 @@ void DoLevelDrain(object oTarget, object oCaster)
|
||||
|
||||
// Setup Level Drain
|
||||
effect eVis2 = EffectVisualEffect(VFX_IMP_NEGATIVE_ENERGY);
|
||||
effect eNeg = EffectNegativeLevel(1);
|
||||
effect eNeg;
|
||||
|
||||
if (GetResRef(oCaster) == "RA_SPECTRE001")
|
||||
{
|
||||
eNeg = EffectNegativeLevel(2);
|
||||
}
|
||||
else
|
||||
{
|
||||
eNeg = EffectNegativeLevel(1);
|
||||
}
|
||||
|
||||
eNeg = SupernaturalEffect(eNeg);
|
||||
|
||||
// Drain levels from oTarget
|
||||
@@ -42,7 +52,7 @@ void main()
|
||||
int nChaMod = GetAbilityModifier(5, oCaster);
|
||||
int nMobHD = GetHitDice(oCaster);
|
||||
int nDC = 10 + (nMobHD / 2) + nChaMod;
|
||||
int nSave = FortitudeSave( oTarget, nDC );
|
||||
int nSave = FortitudeSave( oTarget, nDC );
|
||||
|
||||
//:: Check for Negative Level Immunity
|
||||
if ( GetIsImmune(oTarget, IMMUNITY_TYPE_NEGATIVE_LEVEL) )
|
||||
@@ -55,7 +65,7 @@ void main()
|
||||
if ( nSave )
|
||||
return;
|
||||
|
||||
//:: if you got this far, you're taking a negative level.
|
||||
//:: if you got this far, you're taking negative levels.
|
||||
|
||||
DelayCommand(0.1, DoLevelDrain(oTarget,oCaster));
|
||||
|
||||
|
@@ -13,16 +13,42 @@
|
||||
|
||||
void main()
|
||||
{
|
||||
object oNPC = OBJECT_SELF;
|
||||
object oAttacker;
|
||||
string sResRef = GetResRef(oNPC);
|
||||
|
||||
//:: Equips best armor
|
||||
if ((!GetIsInCombat(OBJECT_SELF) && (GetItemInSlot(INVENTORY_SLOT_CHEST) == OBJECT_INVALID)))
|
||||
if ((!GetIsInCombat(oNPC) && (GetItemInSlot(INVENTORY_SLOT_CHEST) == OBJECT_INVALID)))
|
||||
DelayCommand(0.5f, ActionEquipMostEffectiveArmor());
|
||||
|
||||
//:: Handles Vampire's Gaseous form death.
|
||||
if(sResRef == "ra_vamp_gas_form")
|
||||
{
|
||||
//:: Get nearest alive PC.
|
||||
oAttacker = GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_IS_PC, oNPC, 1, CREATURE_TYPE_IS_ALIVE, TRUE);
|
||||
|
||||
//:: Set destroyable.
|
||||
SetIsDestroyable(TRUE, FALSE, FALSE);
|
||||
|
||||
//:: Remove plot/immoral/lootable flags JUST in case.
|
||||
SetPlotFlag(oNPC, FALSE);
|
||||
SetImmortal(oNPC, FALSE);
|
||||
SetLootable(oNPC, FALSE);
|
||||
|
||||
//:: Clear Actions & run away
|
||||
ClearAllActions();
|
||||
ActionMoveAwayFromObject(oAttacker, TRUE, 300.0f);
|
||||
|
||||
//:: Destroy ourselves after fleeing the scene
|
||||
DelayCommand(10.0f, DestroyObject(oNPC));
|
||||
}
|
||||
|
||||
//:: Execute the CODI NPC OnHeartbeat script
|
||||
ExecuteScript("no_ai_hrt", OBJECT_SELF);
|
||||
ExecuteScript("no_ai_hrt", oNPC);
|
||||
|
||||
//:: Execute the default NPC OnHeartbeat script
|
||||
//ExecuteScript("nw_c2_default1", OBJECT_SELF);
|
||||
//ExecuteScript("nw_c2_default1", oNPC);
|
||||
|
||||
//:: Execute the PRC NPC OnHeartbeat script
|
||||
ExecuteScript("prc_npc_hb", OBJECT_SELF);
|
||||
ExecuteScript("prc_npc_hb", oNPC);
|
||||
}
|
||||
|
@@ -13,7 +13,9 @@
|
||||
|
||||
void main()
|
||||
{
|
||||
object oNPC = OBJECT_SELF;
|
||||
object oNPC = OBJECT_SELF;
|
||||
|
||||
string sResRef = GetResRef(oNPC);
|
||||
|
||||
// Makes sure armor's droppable flag is set to 0
|
||||
/* SetDroppableFlag(GetItemInSlot(INVENTORY_SLOT_CHEST, OBJECT_SELF), 0);
|
||||
@@ -222,6 +224,32 @@ int nVFX = GetLocalInt(OBJECT_SELF,"SpawnVFX");
|
||||
DelayCommand(0.0f, ApplyEffectToObject(DURATION_TYPE_PERMANENT,eVis,OBJECT_SELF));
|
||||
}
|
||||
|
||||
//:: Vampire's Gaseous Form onDeath
|
||||
if(sResRef == "ra_vampspawn01" || sResRef == "ra_vampspawn02")
|
||||
{
|
||||
effect eVFX;
|
||||
object oSpawn;
|
||||
location lSelf = GetLocation(OBJECT_SELF);
|
||||
|
||||
//:: Apply some visual effects & unload the model.
|
||||
eVFX = EffectVisualEffect(VFX_COM_UNLOAD_MODEL);
|
||||
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVFX, oNPC);
|
||||
eVFX = EffectVisualEffect(VFX_COM_BLOOD_CRT_RED);
|
||||
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVFX, oNPC);
|
||||
eVFX = EffectVisualEffect(491);
|
||||
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVFX, oNPC);
|
||||
eVFX = EffectVisualEffect(VFX_COM_CHUNK_RED_SMALL);
|
||||
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVFX, oNPC);
|
||||
eVFX = EffectVisualEffect(VFX_FNF_SMOKE_PUFF);
|
||||
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVFX, oNPC);
|
||||
|
||||
//:: Spawn Gaseous Form.
|
||||
eVFX = EffectVisualEffect(133);
|
||||
oSpawn = CreateObject(OBJECT_TYPE_CREATURE, "ra_vamp_gas_form", GetLocation(oNPC));
|
||||
DelayCommand(0.5, ApplyEffectToObject(DURATION_TYPE_INSTANT, eVFX, oSpawn));;
|
||||
|
||||
}
|
||||
|
||||
//:: Execute CODI AI NPC OnDeath script
|
||||
ExecuteScript("no_ai_dth", OBJECT_SELF);
|
||||
|
||||
|
@@ -46,19 +46,37 @@ const int EVENT_USER_DEFINED_POSTSPAWN = 1511;
|
||||
#include "ms_name_inc"
|
||||
#include "x2_inc_switches"
|
||||
#include "rnd_commoner_inc"
|
||||
#include "ra_rnd_armor_inc"
|
||||
|
||||
|
||||
|
||||
void ShrinkEm(object oPC)
|
||||
void ShrinkEm(object oNPC)
|
||||
{
|
||||
SetObjectVisualTransform(oPC, OBJECT_VISUAL_TRANSFORM_SCALE, 0.5f);
|
||||
SetObjectVisualTransform(oNPC, OBJECT_VISUAL_TRANSFORM_SCALE, 0.5f);
|
||||
}
|
||||
|
||||
void GrowEm(object oPC)
|
||||
void Embiggen(object oNPC)
|
||||
{
|
||||
SetObjectVisualTransform(oPC, OBJECT_VISUAL_TRANSFORM_SCALE, 1.5f);
|
||||
SetObjectVisualTransform(oNPC, OBJECT_VISUAL_TRANSFORM_SCALE, 1.15f);
|
||||
}
|
||||
|
||||
void GrowEm(object oNPC)
|
||||
{
|
||||
SetObjectVisualTransform(oNPC, OBJECT_VISUAL_TRANSFORM_SCALE, 1.5f);
|
||||
}
|
||||
|
||||
void NoFreeGear(object oNPC)
|
||||
{
|
||||
object oArmor;
|
||||
object oWeapon;
|
||||
|
||||
oArmor = GetItemInSlot(INVENTORY_SLOT_CHEST, OBJECT_SELF);
|
||||
oWeapon = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, OBJECT_SELF);
|
||||
|
||||
SetDroppableFlag(oArmor, FALSE);
|
||||
SetDroppableFlag(oWeapon, FALSE);
|
||||
}
|
||||
|
||||
void main()
|
||||
{
|
||||
string sTag;
|
||||
@@ -85,6 +103,15 @@ void main()
|
||||
SignalEvent(OBJECT_SELF,EventUserDefined(EVENT_USER_DEFINED_PRESPAWN ));
|
||||
}
|
||||
|
||||
//:: Give the Vampire Spawn ~fancy~ clothes
|
||||
if(sResRef == "ra_vampspawn01" || sResRef == "ra_vampspawn02")
|
||||
{
|
||||
oNPC = OBJECT_SELF;
|
||||
rnd_clothes (oNPC);
|
||||
//RndOutcast(oNPC);
|
||||
NoFreeGear(oNPC);
|
||||
}
|
||||
|
||||
sTag=GetLocalString(OBJECT_SELF,"X3_HORSE_OWNER_TAG");
|
||||
if (GetStringLength(sTag)>0)
|
||||
{ // look for master
|
||||
@@ -161,6 +188,13 @@ void main()
|
||||
|
||||
}
|
||||
|
||||
int nEmbiggen = GetLocalInt(OBJECT_SELF,"EMBIGGEN");
|
||||
if (nEmbiggen > 0)
|
||||
{
|
||||
DelayCommand(0.0f, Embiggen(OBJECT_SELF));
|
||||
|
||||
}
|
||||
|
||||
int nNoStun = GetLocalInt(OBJECT_SELF,"NOSTUN");
|
||||
if (nNoStun > 0)
|
||||
{
|
||||
@@ -492,26 +526,7 @@ void main()
|
||||
rnd_tattoo(OBJECT_SELF);
|
||||
}
|
||||
|
||||
|
||||
//:: Execute OnSpawn script.
|
||||
if (sResRef == "monst_spider004")
|
||||
{
|
||||
//:: Execute drop in from above spawn.
|
||||
ExecuteScript("nw_c2_dropin9", OBJECT_SELF);
|
||||
}
|
||||
else
|
||||
{
|
||||
//:: Execute CODI AI OnSpawn script.
|
||||
ExecuteScript(sSpawnType, OBJECT_SELF);
|
||||
|
||||
//:: Execute default OnSpawn script.
|
||||
//ExecuteScript("nw_c2_default9", OBJECT_SELF);
|
||||
}
|
||||
|
||||
//:: Execute PRC OnSpawn script.
|
||||
ExecuteScript("prc_npc_spawn", OBJECT_SELF);
|
||||
|
||||
//:: activate various custom auras.
|
||||
//:: Activate various custom auras.
|
||||
int nAtropal = GetTag(OBJECT_SELF)=="ATROPAL001" ? TRUE : FALSE;
|
||||
if(nAtropal)ExecuteScript("atropal_aura",OBJECT_SELF);
|
||||
|
||||
@@ -570,4 +585,22 @@ void main()
|
||||
SignalEvent(OBJECT_SELF,EventUserDefined(EVENT_USER_DEFINED_POSTSPAWN));
|
||||
}
|
||||
|
||||
|
||||
//:: Execute OnSpawn script.
|
||||
if (sResRef == "monst_spider004")
|
||||
{
|
||||
//:: Execute drop in from above spawn.
|
||||
ExecuteScript("nw_c2_dropin9", OBJECT_SELF);
|
||||
}
|
||||
else
|
||||
{
|
||||
//:: Execute CODI AI OnSpawn script.
|
||||
ExecuteScript(sSpawnType, OBJECT_SELF);
|
||||
|
||||
//:: Execute default OnSpawn script.
|
||||
//ExecuteScript("nw_c2_default9", OBJECT_SELF);
|
||||
}
|
||||
|
||||
//:: Execute PRC OnSpawn script.
|
||||
ExecuteScript("prc_npc_spawn", OBJECT_SELF);
|
||||
}
|
||||
|
@@ -77,6 +77,7 @@ void rnd_tattoo(object oPC)
|
||||
void rnd_clothes(object oPC)
|
||||
{
|
||||
int nNoble = GetLocalInt(OBJECT_SELF,"NOBLE");
|
||||
object oItem;
|
||||
|
||||
if (nNoble != 1)
|
||||
{
|
||||
@@ -87,7 +88,7 @@ void rnd_clothes(object oPC)
|
||||
string sItem;
|
||||
sItem = "baleas_cloth0" + IntToString(nResult);
|
||||
|
||||
object oItem = CreateItemOnObject(sItem, oPC, 1);
|
||||
oItem = CreateItemOnObject(sItem, oPC, 1);
|
||||
|
||||
DelayCommand(0.5f, ActionEquipItem(oItem, INVENTORY_SLOT_CHEST));
|
||||
}
|
||||
@@ -100,7 +101,9 @@ void rnd_clothes(object oPC)
|
||||
int nResult = d10(1);
|
||||
string sItem;
|
||||
sItem = "noble_m_cloth0" + IntToString(nResult);
|
||||
DelayCommand(0.5f, ActionEquipItem(CreateItemOnObject(sItem), INVENTORY_SLOT_CHEST));
|
||||
oItem = CreateItemOnObject(sItem, oPC, 1);
|
||||
//DelayCommand(0.5f, ActionEquipItem(CreateItemOnObject(sItem), INVENTORY_SLOT_CHEST));
|
||||
DelayCommand(0.5f, ActionEquipItem(oItem, INVENTORY_SLOT_CHEST));
|
||||
}
|
||||
|
||||
else
|
||||
@@ -111,7 +114,9 @@ void rnd_clothes(object oPC)
|
||||
int nResult = d10(1);
|
||||
string sItem;
|
||||
sItem = "noble_f_cloth0" + IntToString(nResult);
|
||||
DelayCommand(1.0f, ActionEquipItem(CreateItemOnObject(sItem), INVENTORY_SLOT_CHEST));
|
||||
oItem = CreateItemOnObject(sItem, oPC, 1);
|
||||
//DelayCommand(0.5f, ActionEquipItem(CreateItemOnObject(sItem), INVENTORY_SLOT_CHEST));
|
||||
DelayCommand(0.5f, ActionEquipItem(oItem, INVENTORY_SLOT_CHEST));
|
||||
}
|
||||
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -176,7 +176,44 @@ string SpawnGroup(object oSpawn, string sTemplate)
|
||||
// Only Make Modifications Between These Lines
|
||||
// -------------------------------------------
|
||||
|
||||
//:: Brigands
|
||||
//:: Wererats
|
||||
if (sTemplate == "group_wererats")
|
||||
{
|
||||
switch(d3(1))
|
||||
{
|
||||
case 1:
|
||||
sRetTemplate = "RA_WERERAT004";
|
||||
break;
|
||||
case 2:
|
||||
sRetTemplate = "RA_WERERAT003";
|
||||
break;
|
||||
case 3:
|
||||
sRetTemplate = "RA_WERERAT003";
|
||||
break;
|
||||
}
|
||||
}
|
||||
//:: Wererats
|
||||
|
||||
|
||||
//:: Vampire Spawn
|
||||
if (sTemplate == "group_vampspawn")
|
||||
{
|
||||
switch(d3(1))
|
||||
{
|
||||
case 1:
|
||||
sRetTemplate = "RA_VAMPSPAWN01";
|
||||
break;
|
||||
case 2:
|
||||
sRetTemplate = "RA_VAMPSPAWN01";
|
||||
break;
|
||||
case 3:
|
||||
sRetTemplate = "RA_VAMPSPAWN02";
|
||||
break;
|
||||
}
|
||||
}
|
||||
//:: Vampire Spawn
|
||||
|
||||
//:: Brigands
|
||||
if (sTemplate == "group_brigands")
|
||||
{
|
||||
switch(d3(1))
|
||||
@@ -192,9 +229,9 @@ string SpawnGroup(object oSpawn, string sTemplate)
|
||||
break;
|
||||
}
|
||||
}
|
||||
//:: Brigands
|
||||
//:: Brigands
|
||||
|
||||
// Aragnak in Lair
|
||||
//:: Aragnak in Lair
|
||||
if (sTemplate == "grp_aragnak")
|
||||
{
|
||||
int iRnd = Random(9)+1;
|
||||
@@ -209,7 +246,7 @@ string SpawnGroup(object oSpawn, string sTemplate)
|
||||
sRetTemplate = "RA_DRAG_ARAGNAK2";
|
||||
}
|
||||
}
|
||||
//
|
||||
//:: Aragnak in Lair
|
||||
|
||||
if (GetStringLeft(sTemplate, 7) == "scaled_")
|
||||
{
|
||||
|
41
_module/nss/vamp_gas_form_hb.nss
Normal file
41
_module/nss/vamp_gas_form_hb.nss
Normal file
@@ -0,0 +1,41 @@
|
||||
//::///////////////////////////////////////////////
|
||||
//:: Name vamp_gas_form_hb
|
||||
//:: Copyright (c) 2022 Project RATDOG
|
||||
//:://////////////////////////////////////////////
|
||||
/*
|
||||
Make the Vampire's onDeath Gaseous Form flee
|
||||
& vanish
|
||||
*/
|
||||
//:://////////////////////////////////////////////
|
||||
//:: Created By: Jaysyn
|
||||
//:: Created On: 20221207
|
||||
//:://////////////////////////////////////////////
|
||||
|
||||
void main()
|
||||
{
|
||||
object oNPC = OBJECT_SELF;
|
||||
location lSelf = GetLocation(oNPC);
|
||||
|
||||
object oAttacker = GetNearestCreature(CREATURE_TYPE_REPUTATION , REPUTATION_TYPE_ENEMY, oNPC, 1, CREATURE_TYPE_IS_ALIVE, TRUE);
|
||||
|
||||
string sResRef = GetResRef(oNPC);
|
||||
|
||||
|
||||
//:: Set destroyable.
|
||||
SetIsDestroyable(TRUE, FALSE, FALSE);
|
||||
|
||||
//:: Remove plot/immoral/lootable flags JUST in case.
|
||||
SetPlotFlag(oNPC, TRUE);
|
||||
SetImmortal(oNPC, FALSE);
|
||||
SetLootable(oNPC, FALSE);
|
||||
|
||||
//:: Clear Actions & run away
|
||||
//AssignCommand(oNPC, ClearAllActions());
|
||||
ClearAllActions();
|
||||
ActionMoveAwayFromObject(oAttacker, TRUE, 10.0f);
|
||||
//DelayCommand(0.2f, ActionMoveAwayFromObject(oAttacker, TRUE, 10.0f));
|
||||
|
||||
//:: Destroy ourselves after fleeing the scene
|
||||
DelayCommand(4.0f, DestroyObject(oNPC));
|
||||
|
||||
}
|
Reference in New Issue
Block a user