Spectral Guardian encounter
Hello everyone. First, I'd like to thank the entire community for contributing to the EQ emulator effort. jshows1 and I have been working on our own server for a while now (Jer's Server), as he mentioned in a previous post. Although I have created many events for our Norrath, here is one I found particularly satisfying, perhaps because it taught me how to do signalling. At any rate, I thought I'd share it with you.
Very brief overview: turn in 4 pure elements, defeat the encounter, get Convergence of the Elements as a reward, along with a chest of loot.
The 13 NPCs to be created are listed in the headers of the perl files (except the loot chest mob). The 5 items (mentioned in brief overview) are also described in the files.
The perl files:
#############
#Quest: Script for Spectral Guardian encounter
#NPCid 1269
#Name: Taris
#Race 128 (iksar), d_melee_texture1 and 2 = 11524 (spectral sword)
#Location: x=9133, y=925, z=1064, h=127 of dreadlands (behind grassy area near pyramid park (also need to relocate Klok F`tshai to outside pyramid park)
#Level: 40
#Type: quest NPC
#Loot: tableid
#HP: 5000
#############
sub EVENT_SPAWN {
quest::npcfeature("race", 128 );
$npc->NPCSpecialAttacks(HfDCAB, 0);
}
sub EVENT_SAY {
if($npc->GetRace() == 147) {
if($text=~/Hail/i){
quest::say("Help free me from this prison! The elements have used the power within my spectral swords to... What is that monstrosity in the distance?");
}
}
else {
if($text=~/Hail/i){
quest::say("Hello, $name. What brings to you the spires of Dreadlands, a convergence of the [elements]?");
}
if($text=~/elements/i){
quest::say("Not many know the true nature of the elements. If you should bring me a pure sample of each, I can combine them for you.");
}
}
}
sub EVENT_ITEM {
# 3871 pure_fire, 3885 pure_water, 3901 pure_air, 3902 pure_earth
if ((plugin::check_handin(\%itemcount, 3871 => 1, 3885 => 1, 3901 => 1, 3902 => 1)) && ($npc->GetRace() == 128 )) {
quest::emote("is shocked by the interaction of the pure elements.");
quest::say("I think something is happening...");
quest::npcfeature("race", 147);
quest::spawn2(1257,0,0,9318,779,1065,64); #spawns First_Spectral_Guardian
}
plugin::return_items(\%itemcount);
}
sub EVENT_SIGNAL {
if ($signal => 1) {
quest::npcfeature("race", 128 );
}
}
#############
#Quest: Script for Spectral Guardian encounter
#NPCid 1257
#Name: First_Spectral_Guardian
#Race 308 (storm golem), Texture of 0, Size 20, gender 2, runspeed 0
#Location: x, y, z of $zonesn
#Level: 47
#Type: monster
#Loot: tableid
#HP: 30,000
#############
sub EVENT_SPAWN {
quest::npcfeature("race", 308 );
$npc->NPCSpecialAttacks(fDCS, 0);
quest::setnexthpevent(60);
quest::modifynpcstat("max_hit",265);
quest::modifynpcstat("min_hit",90);
quest::shout("The elements combine into a living force.");
}
sub EVENT_HP {
if($hpevent == 60) {
quest::setnexthpevent(30);
quest::modifynpcstat("max_hit",350);
}
if($hpevent == 30) {
quest::modifynpcstat("min_hit",250);
}
}
sub EVENT_DEATH {
quest::emote("crumbles into dust. The winds gather the material into a new guardian nearby.");
quest::spawn2(1258,0,0,$x-250,$y,$z,$h); #spawns Second_Spectral_Guardian
}
#############
#Quest: Script for Spectral Guardian encounter
#NPCid 1258
#Name: Second_Spectral_Guardian
#Race 308 (storm golem), Texture of 0, Size 25, gender 2, runspeed 0
#Location: x, y, z of $zonesn
#Level: 50
#Type: monster
#Loot: tableid
#HP: 50,000
#############
sub EVENT_SPAWN {
quest::emote("forms from the dust of the former guardian.");
quest::shout("I am reborn of the elements.");
quest::npcfeature("race", 308 );
$npc->NPCSpecialAttacks(fDCS, 0);
quest::setnexthpevent(90);
my $eid = $npc->GetID(); #get this npc's Entity_ID
quest::settimer("signal",6);
}
sub EVENT_TIMER {
if ($timer eq "signal") {
my $eid = $npc->GetID(); #get this npc's Entity_ID
quest::signalwith(quest::ChooseRandom(1259,1260,12 61,1262),$eid,0); #send Entity_ID as a signal to one of the Totems with delay 0 ms
quest::settimer("signal",6); #every 6 seconds
}
}
sub EVENT_HP {
if($hpevent == 90) {
quest::setnexthpevent(80);
quest::emote("calls upon Earth.");
quest::spawn2(1259,0,0,$x-50,$y-50,$z,32);
}
if($hpevent == 80) {
quest::setnexthpevent(70);
quest::emote("calls upon Air.");
quest::spawn2(1260,0,0,$x-50,$y+50,$z,96);
}
if($hpevent == 70) {
quest::setnexthpevent(60);
quest::emote("calls upon Water.");
quest::spawn2(1261,0,0,$x+50,$y-50,$z,-32);
}
if($hpevent == 60) {
quest::emote("calls upon Fire.");
quest::spawn2(1262,0,0,$x+50,$y+50,$z,-96);
}
}
sub EVENT_DEATH {
quest::shout("The elemental forces dispersed, I can no longer sustain this form.");
quest::spawn2(1267,0,0,$x+250,$y,$z,$h); #spawns Third_Spectral_Guardian
}
#############
#Quest: Script for Spectral Guardian encounter
#NPCid 1259
#Name: Earth_Totem
#Race 173 (totem), Texture of 0, Size 15, gender 2, runspeed 0, minhit 0, maxhit 0
#Location: x, y, z of $zonesn
#Level: 50
#Type: monster
#Loot: tableid
#HP: 20,000
#############
sub EVENT_SPAWN {
quest::npcfeature("race", 173);
$npc->NPCSpecialAttacks(HfDCAB, 0); #Invulnerable to melee, spell: "AB"
quest::settimer("vulner",100); #100 sec timer before totem become attackable
}
sub EVENT_SIGNAL {
if ($signal => 1) {
my $eid = $signal; #transfering the signal number for use in CastSpell
$npc->CastSpell(9965, $eid, 11); #Casts heal on signalling npc, slot 11 argument prevents fizzling
}
}
sub EVENT_TIMER {
if($timer eq "vulner") {
$npc->NPCSpecialAttacks(HfDC, 0); #Now attackable
}
}
sub EVENT_DEATH {
quest::spawn2(1263,0,0,$x,$y,$z,$h); #spawns a Living_Totem upon death, elemental of same type as totem, casts spell on itself instead of Guardian
}
#############
#Quest: Script for Spectral Guardian encounter
#NPCid 1260
#Name: Air_Totem
#Race 260 (bat), Texture of 0, Size 15, gender 2, runspeed 0, minhit 0, maxhit 0
#Location: x, y, z of $zonesn
#Level: 50
#Type: monster
#Loot: tableid
#HP: 20,000
#############
sub EVENT_SPAWN {
quest::npcfeature("race", 260);
$npc->NPCSpecialAttacks(HfDCAB, 0); #Invulnerable to melee, spell: "AB"
quest::settimer("vulner",100); #100 sec timer before totem become attackable
}
sub EVENT_SIGNAL {
if ($signal => 1) {
my $eid = $signal; #transfering the signal number for use in CastSpell
$npc->CastSpell(4740, $eid, 11); #Casts (Haste of the Tunat'Muram 50% haste, 60 DS) on signalling npc, slot 11 argument prevents fizzling
}
}
sub EVENT_TIMER {
if($timer eq "vulner") {
$npc->NPCSpecialAttacks(HfDC, 0); #Now attackable
}
}
sub EVENT_DEATH {
quest::spawn2(1264,0,0,$x,$y,$z,$h); #spawns a Living_Totem upon death, elemental of same type as totem, casts spell on itself instead of Guardian
}
#############
#Quest: Script for Spectral Guardian encounter
#NPCid 1261
#Name: Water_Totem
#Race 187 (siren), Texture of 0, Size 15, gender 2, runspeed 0, minhit 0, maxhit 0
#Location: x, y, z of $zonesn
#Level: 50
#Type: monster
#Loot: tableid
#HP: 20,000
#############
sub EVENT_SPAWN {
quest::npcfeature("race", 187);
$npc->NPCSpecialAttacks(HfDCAB, 0); #Invulnerable to melee, spell: "AB"
quest::settimer("vulner",100); #100 sec timer before totem become attackable
}
sub EVENT_SIGNAL {
if ($signal => 1) {
my $eid = $signal; #transfering the signal number for use in CastSpell
$npc->CastSpell(25321, $eid, 11); #Casts (Armor of Courage PAL/88 ) on signalling npc, slot 11 argument prevents fizzling
}
}
sub EVENT_TIMER {
if($timer eq "vulner") {
$npc->NPCSpecialAttacks(HfDC, 0); #Now attackable
}
}
sub EVENT_DEATH {
quest::spawn2(1265,0,0,$x,$y,$z,$h); #spawns a Living_Totem upon death, elemental of same type as totem, casts spell on itself instead of Guardian
}
#############
#Quest: Script for Spectral Guardian encounter
#NPCid 1262
#Name: Fire_Totem
#Race 126 (djinn), Texture of 0, Size 15, gender 2, runspeed 0, minhit 0, maxhit 0
#Location: x, y, z of $zonesn
#Level: 50
#Type: monster
#Loot: tableid
#HP: 20,000
#############
sub EVENT_SPAWN {
quest::npcfeature("race", 126);
$npc->NPCSpecialAttacks(HfDCAB, 0); #Invulnerable to melee, spell: "AB"
quest::settimer("vulner",100); #100 sec timer before totem become attackable
}
sub EVENT_SIGNAL {
if ($signal => 1) {
my $eid = $signal; #transfering the signal number for use in CastSpell
$npc->CastSpell(10434, $eid, 11); #Casts (Fermata of Preservation BRD/73) on signalling npc, slot 11 argument prevents fizzling
}
}
sub EVENT_TIMER {
if($timer eq "vulner") {
$npc->NPCSpecialAttacks(HfDC, 0); #Now attackable
}
}
sub EVENT_DEATH {
quest::spawn2(1266,0,0,$x,$y,$z,$h); #spawns a Living_Totem upon death, elemental of same type as totem, casts spell on itself instead of Guardian
}
#############
#Quest: Script for Spectral Guardian encounter
#NPCid 1263
#Name: Living_Earth
#Race 209 (earth elemental), Texture of 0, Size 12, gender 2, runspeed 0
#Location: x, y, z of $zonesn
#Level: 50
#Type: monster
#Loot: tableid
#HP: 20,000
#############
sub EVENT_SPAWN {
quest::npcfeature("race", 209);
$npc->NPCSpecialAttacks(fDCS, 0);
quest::settimer("totem", 20); #20 sec timer for totem spell
}
sub EVENT_TIMER {
if($timer eq "totem") {
$npc->CastSpell(9965,$npc->GetID()); #Casts heal on self, slot 11 argument prevents fizzling
quest::settimer("totem", 20);
}
}
#############
#Quest: Script for Spectral Guardian encounter
#NPCid 1264
#Name: Living_Air
#Race 210 (air elemental), Texture of 0, Size 12, gender 2, runspeed 0
#Location: x, y, z of $zonesn
#Level: 50
#Type: monster
#Loot: tableid
#HP: 20,000
#############
sub EVENT_SPAWN {
quest::npcfeature("race", 210);
$npc->NPCSpecialAttacks(fDCS, 0);
quest::settimer("totem", 20); #20 sec timer for totem spell
}
sub EVENT_TIMER {
if($timer eq "totem") {
$npc->CastSpell(3150,$npc->GetID()); #Cast (Direption of Dreams Cancel Magic (9) x 12) on self, slot 11 argument prevents fizzling, removes 12 buffs
quest::settimer("totem", 20);
}
}
#############
#Quest: Script for Spectral Guardian encounter
#NPCid 1265
#Name: Living_Water
#Race 211 (water elemental), Texture of 0, Size 12, gender 2, runspeed 0
#Location: x, y, z of $zonesn
#Level: 50
#Type: monster
#Loot: tableid
#HP: 20,000
#############
sub EVENT_SPAWN {
quest::npcfeature("race", 211);
$npc->NPCSpecialAttacks(fDCS, 0);
quest::settimer("totem", 20); #20 sec timer for totem spell
quest::set_proximity($x - 50, $x + 50, $y - 50, $y + 50);
}
sub EVENT_TIMER {
if($timer eq "totem") {
$npc->CastSpell(25321,$npc->GetID()); #Cast (Armor of Courage PAL/88 ) on self, slot 11 argument prevents fizzling
quest::settimer("totem", 20);
}
}
sub EVENT_ENTER {
quest::selfcast(6560); #Casts Golem Slow on player, 1: Max HP change by (-20%) 2: Decrease Movement by 40% 3: Decrease Attack Speed by 15%
quest::set_proximity($x - 50, $x + 50, $y - 50, $y + 50);
}
#############
#Quest: Script for Spectral Guardian encounter
#NPCid 1266
#Name: Living_Fire
#Race 212 (fire elemental), Texture of 0, Size 12, gender 2, runspeed 0
#Location: x, y, z of $zonesn
#Level: 50
#Type: monster
#Loot: tableid
#HP: 20,000
#############
sub EVENT_SPAWN {
quest::npcfeature("race", 212);
$npc->NPCSpecialAttacks(fDCS, 0);
quest::settimer("totem", 20); #20 sec timer for totem spell
quest::set_proximity($x - 50, $x + 50, $y - 50, $y + 50);
}
sub EVENT_TIMER {
if($timer eq "totem") {
$npc->CastSpell(10434,$npc->GetID()); #Cast (Fermata of Preservation BRD/73) on self, slot 11 argument prevents fizzling
quest::settimer("totem", 20);
}
}
sub EVENT_ENTER {
quest::selfcast(7123); #Casts Eaten Flesh on player, 650 per tick and root BPAE
quest::set_proximity($x - 50, $x + 50, $y - 50, $y + 50);
}
#############
#Quest: Script for Spectral Guardian encounter
#NPCid 1267
#Name: Third_Spectral_Guardian
#Race 308 (storm golem), Texture of 0, Size 30, gender 2, runspeed 0, very high AC, very resistant to all spells, d_melee_texture1 and 2 = 11524 (spectral sword)
#Location: x, y, z of $zonesn
#Level: 53
#Type: monster
#Loot: tableid
#HP: 80,000
#############
sub EVENT_SPAWN {
quest::npcfeature("race", 308 );
$npc->NPCSpecialAttacks(fDCS, 0);
quest::snow(1);
quest::setsky(0);
quest::set_proximity($x - 50, $x + 50, $y - 50, $y + 50);
quest::setnexthpevent(90);
quest::shout("Witness the true power of the Guardian.");
}
sub EVENT_HP {
if($hpevent == 90) { #begins using spell ability at 90% HP
quest::settimer("spell", quest::ChooseRandom(15,20,25,30)); #random timer for spell
quest::setnexthpevent(70);
}
if($hpevent == 70) { #begins using spell2 ability at 70% HP
quest::settimer("spell2", quest::ChooseRandom(15,20,25,30)); #random timer for spell2
}
}
sub EVENT_TIMER {
if($timer eq "spell") {
$npc->CastSpell(7132,$client); #Casts Bleak Promise, decrease hitpoints by 1125 (L1) to 1225 (L100) PBAE 30 range
quest::settimer("spell", quest::ChooseRandom(15,20,25,30)); #random timer for spell
}
if($timer eq "spell2") {
$npc->CastSpell(21789,$NPC_ID); #Flusterbolt Memblur Effect, 100% memblur on self
quest::emote("channels the elements through its body, taking on their form.");
quest::npcfeature("race", quest::ChooseRandom(209,210,211,212,308 ));
quest::settimer("spell2", quest::ChooseRandom(15,20,25,30)); #random timer for spell2
}
}
sub EVENT_EXIT {
quest::selfcast(2811); #Player casts Abysmal Banishment on self, 1: Blindness (3) 2: Decrease HP when cast by 700 3: Decrease Hitpoints by 700 per tick
quest::set_proximity($x - 50, $x + 50, $y - 50, $y + 50);
}
sub EVENT_DEATH {
if($npc->GetRace() == 308 ) {
quest::snow(0);
$client->Message(15, "Having destroyed the Guardian while all four elements were occupying the creature, it cannot be recreated. The elemental forces instead converge on you.");
$client->Message(15, "You have been granted a temporary surname!");
$client->Message(15, "Taris wakes from a living nightmare, remembering nothing.");
quest::summonitem(3903); #summons Convergence of the Elements, quest item
quest::signalwith(1269,1,0); #send 1 as a signal to Taris, returning him to regular iksar from spectral iksar race
quest::surname(the_Spectral_Guardian); #changes player surname to "the Spectral Guardian"
quest::spawn2(1268,0,0,$x+100,$y,$z,$h); #spawns chest with loot, 3 x Spectral Guardian's Cloak
}
else {
quest::shout("Although you have managed to remove one of the elements visibly harboring in the Guardian, the others focus to recreate the creature.");
quest::spawn2(1267,0,0,$x,$y,$z,$h); #respawns Third_Spectral_Guardian
}
}
************************
Please leave comments and/or suggestions as we hope to improve our server and attract a playerbase to test this for us. Thank you to those who have been playing and finding bugs. Once I finish all the epic 0.5 quests (intended for lvl 30-40), I will post them here as well.
Salvanna Emberleaf the Immortal
GM/quest designer of Jer's Server
|