EQEmulator Forums

EQEmulator Forums (https://www.eqemulator.org/forums/index.php)
-   Quests::Custom (https://www.eqemulator.org/forums/forumdisplay.php?f=671)
-   -   Temple of Veeshan, Vulak'Aerr Ring Event (https://www.eqemulator.org/forums/showthread.php?t=35922)

Dunge0nMastr 10-28-2012 12:31 PM

Temple of Veeshan, Vulak'Aerr Ring Event
 
Hey folks this is a bit of a round about way of going about recreating the original ring event in ToV, but i wanted to post to see if anyone was able to help me clean it up so its not using quite so many scripts hehe. As opposed to using timers for the waves i used signalwith to compensate for the smaller raids on the server.

All information RE the event was taken from: http://www.monkly-business.net/forum...hp/t-5765.html

While the event is a bit different (semi custom id say) i tried to keep as true as i could considering the raid sizes on my server, to the actual event.
The event starts after all 6 lords/ladys are dead, Thylex of Veeshan then becomes targetable (i moved him back to just in front of Vulak's spawn) when he is killed the event starts.

this was added to each boss to keep track of the bosses being up:
Code:

sub EVENT_DEATH {
quest::signalwith(124000,1,0);
}

Thylex of Veeshan script - accepts signals for when lady/lords die. Also checks to see if the event has been completed recently.
Code:

#Thylex of Veeshan
#New Ring Event to spawn Vulak
#When killed starts event

sub EVENT_SPAWN {
quest::modifynpcstat("special_attacks", "ABHSERFTQUMCNIDf");
$counter = 0;
}

sub EVENT_SIGNAL {
my $globalname = "VulakRingEvent";
if ($signal == 1) {
        $counter += 1;
if (!defined $qglobals{$globalname} && ($counter == 6)) {
                quest::spawn2(124171,0,0,$x,$y,$z,$h);
                quest::depopall(124000);
                }
        }
}

Killable Thylex after all 6 lords/ladys die:
Code:

#Targetable Thylex of Veeshan
#NPCID 124171
#spawns upon all 6 lords/ladys being killed, then triggers Vulak Event

sub EVENT_DEATH {
quest::unique_spawn(124158,0,0,"13.8","0.0","-6.2","0.0"); #Ring Event Tracker NPC
quest::signalwith(124158,0,0);
}

And the Event Tracker: This will track each wave, spawn the other waves accordingly, and will also control the fail/pass mechanisms on the event (if wipe = fail, if vulak dead despawns and event is reset in X hours.

Code:

#Ring Event Tracker
#Triggers when Thylex of Veeshan is Killed
#124158

sub EVENT_SPAWN {
$counter = 0;
quest::settimer("DTmobs",15);
quest::settimer("event",4000);
quest::shout("The Ring Event will begin in 30 seconds.  Prepare yourselves!");
}

sub EVENT_TIMER {
if ($timer eq "DTmobs") {
        quest::spawn2(124021,0,0,"-720.6","971.2","124.1","127.5");
        quest::spawn2(124021,0,0,"-760.6","971.2","124.1","127.5");
        quest::spawn2(124172,0,0,"-740.6","971.2","124.1","127.5");
        quest::stoptimer("DTmobs");
        quest::settimer("wave1",15);
        }
if ($timer eq "wave1") {
        quest::spawn2(124159,0,0,"-739.7","890.2","124.0","127.8"); #Wave 1 Guardian Wurm
        quest::spawn2(124161,0,0,"-811.7","510.1","124.0","62.6"); #Guardian Drake
        quest::spawn2(124161,0,0,"-677.7","510.1","124.0","191.1"); #Guardian Drake
        quest::stoptimer("wave1");
        }
if ($timer eq "vulak") {
        quest::depopall(124155);
        quest::shout("The Ring event has been Reset");
        quest::spawn2(124171,0,0,"-739.7","588.6","124.1","0.1");
        quest::depopall(124158);
        }
if ($timer eq "event") {
        quest::shout("You have failed the Vulak`Aerr Ring event.  Please try again");
        quest::stoptimer("event");
        quest::spawn2(124171,0,0,"-739.7","588.6","124.1","0.1");
        quest::depopall(124158);
        }

}

sub EVENT_SIGNAL {
if ($signal == 1) {
        $counter += 1;
        if ($counter == 3) {
                quest::spawn2(124160,0,0,"-741.5","488.5","122.0","255.3"); #Wave 2 Templar Drake
                }
        if ($counter == 4) {
                quest::spawn2(124159,0,0,"-739.7","890.2","124.0","127.8"); #wave 3 Guardian Wurm
                quest::spawn2(124161,0,0,"-811.7","510.1","124.0","62.6"); #Guardian Drake
                quest::spawn2(124161,0,0,"-677.7","510.1","124.0","191.1"); #Guardian Drake
                }
        if ($counter == 7) {
                quest::spawn2(124162,0,0,"-741.5","488.5","122.0","255.3"); #wave 4, first mini boss Zruk the lifestealer
                }
        if ($counter == 8) {
                quest::spawn2(124159,0,0,"-739.7","890.2","124.0","127.8"); #wave 5 Guardian Wurm
                quest::spawn2(124161,0,0,"-811.7","510.1","124.0","62.6"); #Guardian Drake
                quest::spawn2(124161,0,0,"-677.7","510.1","124.0","191.1"); #Guardian Drake
                }
        if ($counter == 11) {
                quest::spawn2(124159,0,0,"-739.7","890.2","124.0","127.8"); #wave 6 Guardian Wurm
                quest::spawn2(124161,0,0,"-811.7","510.1","124.0","62.6"); #Guardian Drake
                quest::spawn2(124161,0,0,"-677.7","510.1","124.0","191.1"); #Guardian Drake
                }
        if ($counter == 14) {
                quest::spawn2(124160,0,0,"-811.7","510.1","124.0","62.6"); #wave 7 Templar Drake
                quest::spawn2(124160,0,0,"-677.7","510.1","124.0","191.1"); #Templar Drake
                }
        if ($counter == 16) {
                quest::spawn2(124163,0,0,"-741.5","488.5","122.0","255.3"); #wave 8, second mini boss Rathek the Tigerclaw
                }
        if ($counter == 17) {
                quest::spawn2(124164,0,0,"-811.7","510.1","124.0","62.6"); #wave 9 Guardian Destroyer
                quest::spawn2(124164,0,0,"-677.7","510.1","124.0","191.1"); #Guardian Destroyer
                quest::spawn2(124164,0,0,"-739.7","890.2","124.0","127.8"); #Guardian Destroyer
                }
        if ($counter == 20) {
                quest::spawn2(124160,0,0,"-741.5","488.5","122.0","255.3"); #wave 10 Templar Drake
                quest::spawn2(124160,0,0,"-739.7","890.2","124.0","127.8"); #Templar drake
                }
        if ($counter == 22) {
                quest::spawn2(124160,0,0,"-739.7","890.2","124.0","127.8"); #wave 11 Templar Drake
                quest::spawn2(124164,0,0,"-811.7","510.1","124.0","62.6"); #guardian destroyer
                quest::spawn2(124164,0,0,"-677.7","510.1","124.0","191.1"); #guardian Destroyer
                }
        if ($counter == 25) {
                quest::spawn2(124165,0,0,"-741.5","488.5","122.0","255.3"); #wave 12, 3rd mini boss Vethrol the Skycaller
                }
        if ($counter == 26) {
                quest::spawn2(124160,0,0,"-811.7","510.1","124.0","62.6"); #wave 13 Templar Drake
                quest::spawn2(124160,0,0,"-741.5","488.5","122.0","255.3"); #Templar Drake
                quest::spawn2(124160,0,0,"-677.7","510.1","124.0","191.1"); #Templar Drake
                }
        if ($counter == 29) {
                quest::spawn2(124167,0,0,"-811.7","510.1","124.0","62.6"); #wave 14 Drake Warden
                quest::spawn2(124167,0,0,"-677.7","510.1","124.0","191.1"); #Drake Warden
                }
        if ($counter == 33) {
                quest::spawn2(124166,0,0,"-741.5","488.5","122.0","255.3"); #wave 15, Herald of Vulak
                }
        if ($counter == 34) {
                quest::spawn2(124155,0,0,"-739.4","517.2","121","255"); #Vulak Aerr
                quest::settimer("vulak",1200);
                quest::stoptimer("event");
                }
        }
if ($signal == 2) {
        quest::depopall(124155);
        quest::shout("The Ring event has been Reset");
        quest::spawn2(124171,0,0,"-739.7","588.6","124.1","0.1");
        quest::depopall(124158);
        quest::depopall(124021);
        quest::depopall(124021);
        quest::depopall(124172);
        }
if ($signal == 3) {
        quest::stoptimer("event");
        }
if ($signal == 4) {
        quest::stoptimer("vulak");
        quest::depopall(124021);
        quest::depopall(124172);
        quest::depopall(124158);
        }
}

Each wave is commented, i had to add alot of the appropriate mobs, including the mini-bosses, unfortunatley i couldnt find exact information on them as not many guilds did the ring event when it was live, and my old guild's MBs went down years ago 8(. The back of the bridge is also just like live - unescapable, to prevent people from kiting etc. it spawns 3 mobs, 2 with Proximities on them for DT, and 1 which warns players when they get too close (obviously greater proximity than DT mob lol).

Code:

#DT Mob Warner
#Higher Proximity than DT mobs warns players to turn back for face a fate worth than death
#NPCID: 124172

sub EVENT_SPAWN {
quest::set_proximity($x-75,$x+75,$y-75,$y+75,$z-25,$z+25);
}

sub EVENT_ENTER {
$client->Message(14,"You hear a voice in your mind, 'Turn back or face a fate worse than death.' There appears to be no retreat.");
}

and the 2 dt mobs:

Code:

#DT Proximity Mobs in VP
#Spawn when Ring event for Vulak is started
#124021

sub EVENT_SPAWN {
quest::set_proximity($x-40,$x+40,$y-40,$y+40,$z-40,$z+40);
quest::modifynpcstat("special_attacks", "ABHSERFTQUMCNIDf"); #immune to everything
}

sub EVENT_ENTER {
if ($npc && $client) {
        $npc->SpellFinished(7477, $client); #DT's players when they enter the proximity, forces them to not retreat
        }
}

sub EVENT_EXIT {
if ($npc && $client) {
        $npc->SpellFinished(7477, $client); #if it didnt fire when they enter it will when they exit!
        }
}

each mob in the waves has the following code:
Code:

sub EVENT_DEATH {
quest::signalwith(124158,1,0);
}

i decided to control the guardian destroyers Knockbacks through their script:
Code:

#Guardian Destroyer
#For Vulak Ring Event
#124164

sub EVENT_SPAWN {
quest::modifynpcstat("special_attacks","SERFf");
}

sub EVENT_COMBAT {
if ($combat_state == 1) {
        quest::settimer("kb",12);
        }
if ($combat_state == 0) {
        quest::signalwith(124158,2,0);
        quest::depopall(124164);
        }
}

sub EVENT_TIMER {
my $RTarget = $npc->GetHateRandom();
if ($timer eq "kb") {
        if ($RTarget) {
                $npc->SpellFinished(13073,$RTarget);
                }
        }
}


sub EVENT_DEATH {
quest::signalwith(124158,1,0);
}

And the Drake Wardens, which on live kept splitting i think 16mobs total, i set to only do 2 each, again cause of raid size on the server:

Code:

#A Drake Warden
#When killed splits into 2
#124167

sub EVENT_SPAWN {
quest::modifynpcstat("special_attacks","SERFf");
}

sub EVENT_DEATH {
quest::spawn2(124169,0,0,$x,$y,$z,$h);
quest::spawn2(124169,0,0,$x,$y,$z,$h);
}

The final named: The Herald of Vulak, spawns Vulak`Aerr when killed.

Code:

#Herald of Vulak
#124166
#final mini boss of Vulak Ring Event, death triggers Vulak's Spawn, and also casts a knockback.

sub EVENT_SPAWN {
quest::modifynpcstat("special_attacks","gSERFf");
quest::shout("You are fools to challenge the might of Vulak'Aerr");
}

sub EVENT_COMBAT {
if ($combat_state == 1) {
        quest::settimer("kb",12);
        }
if ($combat_state == 0) {
        quest::stoptimer("kb");
        quest::signalwith(124158,2,0);
        quest::depopall(124165);
        }
}

sub EVENT_TIMER {
my $RTarget = $npc->GetHateRandom();
if ($timer eq "kb") {
        if ($RTarget) {
                $npc->SpellFinished(13073,$RTarget);
                }
        }
}

sub EVENT_DEATH {
quest::signalwith(124158,1,0);
}

And Finally Vulak`Aerr:

Code:

#New Vulak`Aerr Script
#has a global 6 hour lock out on Ring event.
#124155

sub EVENT_SPAWN {

quest::signalwith(124158,3,0);
quest::modifynpcstat("special_attacks", "SERFTrMCNIDfdL");
quest::shout("Who dare's Disturb my Temple?!  Behold the power of $npcname!  I shall wipe you from the face of Velious!");
}

sub EVENT_DEATH {
my $globalname = "VulakRingEvent";
quest::shout2("I shall return Mortals!  Be warned, for when I do I will wipe your races from the face of Norrath!");
quest::setglobal("$globalname",1,7,'H6');
quest::signalwith(124158,4,0);
}

Currently i just have the Aggro range on the mobs set very high, basically the event goes: mob waves then break before mini boss (wont aggro unless players are close) - then add waves, mini boss etc till the end. gives players some downtime every couple of waves. Something i need to look into but havent done yet is how to manipulate aggro from one mob to others, (im still working on learning Hatelist manipulation in general).

Anyways - any thoughts comments fixes etc would all be greatly appreciated!

If someone wants all the .pl files for the event (22 in total) i will happily upload them all. I just wanted to get the basic stuff down.

Thanks! Hope someone gets something out of this!

ChaosSlayerZ 10-28-2012 02:11 PM

sorry for dumb question, which part of the script specifically responsible
for calling in the big dragons?

Dunge0nMastr 10-28-2012 02:34 PM

all spawns are handles in the event trackers script and triggered by death of mobs

ChaosSlayerZ 10-28-2012 03:07 PM

I am sorry again, but at which line specifically say Lady Nevederia is summoned?

Dunge0nMastr 10-28-2012 04:42 PM

ahh, the regular lords/ladys from ToV are in their normal spawn points and arent part of the event. they need to be killed in order to trigger the event.

as shown within:

Code:

#Thylex of Veeshan
#New Ring Event to spawn Vulak
#When killed starts event

sub EVENT_SPAWN {
quest::modifynpcstat("special_attacks", "ABHSERFTQUMCNIDf");
$counter = 0;
}

sub EVENT_SIGNAL {
my $globalname = "VulakRingEvent";
if ($signal == 1) {
        $counter += 1;
if (!defined $qglobals{$globalname} && ($counter == 6)) {
                quest::spawn2(124171,0,0,$x,$y,$z,$h);
                quest::depopall(124000);
                }
        }
}

each time the lords/ladies die, they send a signal to the npc above (untargetable thylex) when 6 signals are received, then the event is able to be started, assming the event hasnt been done in the alst 6 hours, looking @ it i need to set a else statement there to keep the counter @ 0, (yay for editing while on the run!) but the drgaons like Lady N and such arent part of the actual ring, if you look @ the event tracker ive commented what mobs are part of each wave.

ChaosSlayerZ 10-28-2012 04:48 PM

ok I got that part ;)
The thing is, maybe I am not understanding the base concept, but let me explain.

I have never done this event on LIVE, so I am only going by what is posted at Alla. And according to Alla, if attacked, Vulak was suppose to SUMMON to his location other named dragons - specifically the 6 Lady/Lords, unless they are killed off first. Perhaps I am thinking of an older/later version of this encounter? Or perhaps this information completely off?

Sorry to keep pestering you about this, it just I thought that would be in your script, and I wanted to see how you scripted "teleporting" the dragons that already spawned elsewhere ;)

Burningsoul 10-28-2012 04:51 PM

What you're thinking of is pre-ring Chaos. Long before the ring event, Vulak would just sit in his little room and if aggroed, would call for all the Lords and Ladies currently alive to help him. It was changed for the ring event, and then it was turned into the Thylex of Veeshan event that we've had since.

ChaosSlayerZ 10-28-2012 04:56 PM

Got it ;) I started to suspect something like that, but wanted to clarify ;)

Dunge0nMastr 10-28-2012 05:14 PM

Hah! i got ya no worries :p

yeah i think the orignal event was you could start the ring event but if the other lords/ladies were still alive they woulld be summoned. i decided to leave that part out and require the players kill the other dragons first, (as much as i would have loved to watch people attempt it wihtout knowing that haha). since Vulak isnt a static spawn (only spawns at end of the event) i would have it set to when vulak does spawn, (at end of the 15th wave) to do an entity check, so it would probably look like:

i would add a sub EVENT_COMBAT check to Vulak`Aerr when he was pulled, which will then add any of the Lords or Ladies who are spawned to his hatelist, not 100% sure on how to directly summon, and i know some of the mobs are defautly rooted, but this would send those who were not on a run straight through ToV right at the party @ the vulak bridge.

Code:

sub EVENT_COMBAT {
if ($combat_state == 1) {
        my $check_ladym = $entity_list->GetMobByNpcTypeID(124077);
        my $check_ladyn = $entity_list->GetMobByNpcTypeID(124076);
        my $check_lordk = $entity_list->GetMobByNpcTypeID(124103);
        my $check_lordf = $entity_list->GetMobByNpcTypeID(124008);
        my $check_lordkr = $entity_list->GetMobByNpcTypeID(124074);
        my $check_lordv = $entity_list->GetMobByNpcTypeID(124017);
        if ($check_ladym) {
                my $call_ladym = $check_ladym->CastToNPC();
                $call_ladym->AddToHateList($client,1);
                }
        if ($check_ladyn) {
                my $call_ladyn = $check_ladyn->CastToNPC();
                $call_ladyn->AddToHateList($client,1);
                }
        if ($check_lordk) {
                my $call_lordk = $check_lordk->CastToNPC();
                $call_lordk->AddToHateList($client,1);
                }
        if ($check_lordf) {
                my $call_lordf = $check_lordf->CastToNPC();
                $call_lordf->AddToHateList($client,1);
                }
        if ($check_lordkr) {
                my $call_lordkr = $check_lordkr->CastToNPC();
                $call_lordkr->AddToHateList($client,1);
                }
        if ($check_lordv) {
                my $call_lordv = $check_lordv->CastToNPC();
                $call_lordv->AddToHateList($client,1);
                }
        }
}

To be completely honest im notsure how i would ahve vulak summon them, i suppose I could depop them where they are with signals then have them spawn on top of vulak

like:

if ($combat_state == 1) {
quest::depopall(124077); #depop lady M
quest::spawn2(124077,0,0,$x,$y,$z,$h);
}

etc for each of the 6 dragons, then when they levae combat have them depop again and respawn at their proper spots.

Dunge0nMastr 10-28-2012 05:16 PM

Quote:

Originally Posted by Burningsoul (Post 213754)
What you're thinking of is pre-ring Chaos. Long before the ring event, Vulak would just sit in his little room and if aggroed, would call for all the Lords and Ladies currently alive to help him. It was changed for the ring event, and then it was turned into the Thylex of Veeshan event that we've had since.

^ yeah, tho you could certainly alter the ring event as you see fit to add what i posted above.

within the Current state of things Thylex (who i know is not orignal, the original event was controled through a proximity on players entering the spot where Vulak Spawns) is untargetable until all 6 die, after they die a targetable version of thylex spawns, who then if killed triggers the event - quick autoattackand event starts. I found the proximity a bit buggy for me which is why i went with a bit of a non traditional way to do things.

ChaosSlayerZ 10-28-2012 05:28 PM

Quote:

Originally Posted by Dunge0nMastr (Post 213757)

To be completely honest im notsure how i would ahve vulak summon them, i suppose I could depop them where they are with signals then have them spawn on top of vulak

like:

if ($combat_state == 1) {
quest::depopall(124077); #depop lady M
quest::spawn2(124077,0,0,$x,$y,$z,$h);
}

etc for each of the 6 dragons, then when they levae combat have them depop again and respawn at their proper spots.


Yeah depop and spawn is what I was thinking.
I am not sure if there is a way to instantly teleport an npc, like you can with players.

there is:
quest::moveto(x,y,z, [h, saveguardspot?]) - NPC moves to the set coordinates with Heading and saveguardspot being optional. NPC will path back unless saveguardspot is set to 1. Heading of -1 will use existing heading.

I never had chance to try it, but people tell me that it causes npc to WALK to the location, rather than to be instantly moved there.

Perhaps we could ask the Devs to create an insta-move command for the npcs? ;) It could be useful in the future.

Dunge0nMastr 10-28-2012 05:32 PM

Quote:

Originally Posted by ChaosSlayerZ (Post 213759)
Yeah depop and spawn is what I was thinking.
I am not sure if there is a way to instantly teleport an npc, like you can with players.

there is:
quest::moveto(x,y,z, [h, saveguardspot?]) - NPC moves to the set coordinates with Heading and saveguardspot being optional. NPC will path back unless saveguardspot is set to 1. Heading of -1 will use existing heading.

I never had chance to try it, but people tell me that it causes npc to WALK to the location, rather than to be instantly moved there.

Perhaps we could ask the Devs to create an insta-move command for the npcs? ;) It could be useful in the future.

prolly is a plugin option there, i might screw around with it after this damn hurricane goes by lol. but yeah i couldnt find any easy way to "summon" the npcs either.

Dunge0nMastr 10-28-2012 05:42 PM

i find it easier to view everything within an editor than on the forums, heres a zip file for anyone interested in the event with all the scripts done (note npcids are custom for my server, save for Thylex, Vulak, and the 6 Lords/Ladies) i had to add them in manually since they are no longer part of the DB.
http://www.mediafire.com/?vdhwb96xxxhuklw

ChaosSlayerZ 10-28-2012 05:46 PM

Quote:

Originally Posted by Dunge0nMastr (Post 213761)
prolly is a plugin option there, i might screw around with it after this damn hurricane goes by lol. but yeah i couldnt find any easy way to "summon" the npcs either.

there is a gm command #summon that instantly moves npcs. We just need it exported to perl.

Also - potentially problem with depop&spawn approach - imagine there already a different raid fighting one of those dragons - and suddenly it goes POOF :D

Dunge0nMastr 10-28-2012 05:55 PM

haha good point about the other raid, kind of trolley otherwise :P

ill look into playing wtih stuff a bit later, im kind of curious to see how far i could get with this now lol


All times are GMT -4. The time now is 07:25 AM.

Powered by vBulletin®, Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.