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