PDA

View Full Version : Custom Formation Spawning and boss events.


Figback65
04-23-2016, 08:00 PM
TL:DR

As I got bored with just cleaning up, I came up with some boss spawning add plugin and scripts to do various things. Enjoy and manipulate. Feel free to clean up also lol. RandomRange only lands once and applies to all, so I had to put in multiple randoms for each npc spawn. MESSY!

Sorry akka, stole some of your plugin to manipulate lol

plugin bosstool.pl
#BOSS EVENT TOOLS

#plugin::AEbomb(npcID, xy, z, depop0/1, depoptime, location);
#locations 1 Front, 2 Back, 3 Right, 4 Left, 5 Front/Back, 6 Right/Left, 7 2Front, 8 2Back, 9 2Right, 10 2Left, 11 Corners
#12 Cross, 13 Circle, 14 random4, 15 random8, 16 random12, 17 random16, 18 random20

sub AEbomb{
my $Mob = $_[0];
my $Range = $_[1];
my $Z = $_[2];
my $Location = $_[3];
my $x = plugin::val('$x');
my $y = plugin::val('$y');
my $npc = plugin::val('$npc');
my $z = $npc->GetZ();

if($Location == 1){ # Front
quest::spawn2($Mob, 0, 0, $x, $y + $Range, $z, 0);
}
elsif($Location == 2){ # Back
quest::spawn2($Mob, 0, 0, $x, $y - $Range, $z, 0);
}
elsif($Location == 3){ # Right
quest::spawn2($Mob, 0, 0, $x - $Range, $y, $z, 0);
}
elsif($Location == 4){ # Left
quest::spawn2($Mob, 0, 0, $x + $Range, $y, $z, 0);
}
elsif($Location == 5){ #Front/Back
quest::spawn2($Mob, 0, 0, $x, $y + $Range, $z, 0);
quest::spawn2($Mob, 0, 0, $x, $y - $Range, $z, 0);
}
elsif($Location == 6){ #Right/Left
quest::spawn2($Mob, 0, 0, $x - $Range, $y, $z, 0);
quest::spawn2($Mob, 0, 0, $x + $Range, $y, $z, 0);
}
elsif($Location == 7){ #2Front
quest::spawn2($Mob, 0, 0, $x + $Range, $y + $Range, $z, 0);
quest::spawn2($Mob, 0, 0, $x - $Range, $y + $Range, $z, 0);
}
elsif($Location == 8){ #2Back
quest::spawn2($Mob, 0, 0, $x + $Range, $y - $Range, $z, 0);
quest::spawn2($Mob, 0, 0, $x - $Range, $y - $Range, $z, 0);

}
elsif($Location == 9){ #2Right
quest::spawn2($Mob, 0, 0, $x - $Range, $y + $Range, $z, 0);
quest::spawn2($Mob, 0, 0, $x - $Range, $y - $Range, $z, 0);

}
elsif($Location == 10){ #2Left
quest::spawn2($Mob, 0, 0, $x + $Range, $y + $Range, $z, 0);
quest::spawn2($Mob, 0, 0, $x + $Range, $y - $Range, $z, 0);

}
elsif($Location == 11){ #Corners
quest::spawn2($Mob, 0, 0, $x + $Range, $y + $Range, $z, 0);
quest::spawn2($Mob, 0, 0, $x - $Range, $y + $Range, $z, 0);
quest::spawn2($Mob, 0, 0, $x + $Range, $y - $Range, $z, 0);
quest::spawn2($Mob, 0, 0, $x - $Range, $y - $Range, $z, 0);
}
elsif($Location == 12){ #Cross
quest::spawn2($Mob, 0, 0, $x, $y + $Range, $z, 0);
quest::spawn2($Mob, 0, 0, $x, $y - $Range, $z, 0);
quest::spawn2($Mob, 0, 0, $x - $Range, $y, $z, 0);
quest::spawn2($Mob, 0, 0, $x + $Range, $y, $z, 0);

}
elsif($Location == 13){ #Circle
quest::spawn2($Mob, 0, 0, $x + $Range, $y + $Range, $z, 0);
quest::spawn2($Mob, 0, 0, $x - $Range, $y + $Range, $z, 0);
quest::spawn2($Mob, 0, 0, $x + $Range, $y - $Range, $z, 0);
quest::spawn2($Mob, 0, 0, $x - $Range, $y - $Range, $z, 0);
quest::spawn2($Mob, 0, 0, $x, $y + $Range + $Range * 0.5, $z, 0); #Front
quest::spawn2($Mob, 0, 0, $x, $y - $Range - $Range * 0.5, $z, 0); #Back
quest::spawn2($Mob, 0, 0, $x - $Range - $Range * 0.5, $y, $z, 0); #Right
quest::spawn2($Mob, 0, 0, $x + $Range + $Range * 0.5, $y, $z, 0); #Left

}
elsif($Location == 14){ #Random 4
my $BR1 = plugin::RandomRange(20, 70);
my $BR2 = plugin::RandomRange(20, 70);
my $BR3 = plugin::RandomRange(20, 70);
my $BR4 = plugin::RandomRange(20, 70);
quest::spawn2($Mob, 0, 0, $x + $BR1, $y + $BR1, $z, 0);
quest::spawn2($Mob, 0, 0, $x - $BR2, $y + $BR2, $z, 0);
quest::spawn2($Mob, 0, 0, $x + $BR3, $y - $BR3, $z, 0);
quest::spawn2($Mob, 0, 0, $x - $BR4, $y - $BR4, $z, 0);
}
elsif($Location == 15){ #Random 8
my $BR1 = plugin::RandomRange(20, 70);
my $BR2 = plugin::RandomRange(20, 70);
my $BR3 = plugin::RandomRange(20, 70);
my $BR4 = plugin::RandomRange(20, 70);
my $BR5 = plugin::RandomRange(20, 70);
my $BR6 = plugin::RandomRange(20, 70);
my $BR7 = plugin::RandomRange(20, 70);
my $BR8 = plugin::RandomRange(20, 70);
quest::spawn2($Mob, 0, 0, $x + $BR1, $y + $BR1, $z, 0);
quest::spawn2($Mob, 0, 0, $x - $BR2, $y + $BR2, $z, 0);
quest::spawn2($Mob, 0, 0, $x + $BR3, $y - $BR3, $z, 0);
quest::spawn2($Mob, 0, 0, $x - $BR4, $y - $BR4, $z, 0);
quest::spawn2($Mob, 0, 0, $x + $BR5, $y + $BR5 * 0.5, $z, 0);
quest::spawn2($Mob, 0, 0, $x - $BR6, $y + $BR6 * 0.5, $z, 0);
quest::spawn2($Mob, 0, 0, $x + $BR7 * 0.5, $y - $BR7, $z, 0);
quest::spawn2($Mob, 0, 0, $x - $BR8 * 0.5, $y - $BR8, $z, 0);
}
elsif($Location == 16){ #Random 12
my $BR1 = plugin::RandomRange(20, 70);
my $BR2 = plugin::RandomRange(20, 70);
my $BR3 = plugin::RandomRange(20, 70);
my $BR4 = plugin::RandomRange(20, 70);
my $BR5 = plugin::RandomRange(20, 70);
my $BR6 = plugin::RandomRange(20, 70);
my $BR7 = plugin::RandomRange(20, 70);
my $BR8 = plugin::RandomRange(20, 70);
my $BR9 = plugin::RandomRange(30, 70);
my $BR10 = plugin::RandomRange(30, 70);
my $BR11 = plugin::RandomRange(30, 70);
my $BR12 = plugin::RandomRange(30, 70);
quest::spawn2($Mob, 0, 0, $x + $BR1, $y + $BR1, $z, 0);
quest::spawn2($Mob, 0, 0, $x - $BR2, $y + $BR2, $z, 0);
quest::spawn2($Mob, 0, 0, $x + $BR3, $y - $BR3, $z, 0);
quest::spawn2($Mob, 0, 0, $x - $BR4, $y - $BR4, $z, 0);
quest::spawn2($Mob, 0, 0, $x + $BR5, $y + $BR5 * 0.5, $z, 0);
quest::spawn2($Mob, 0, 0, $x - $BR6, $y + $BR6 * 0.5, $z, 0);
quest::spawn2($Mob, 0, 0, $x + $BR7 * 0.5, $y - $BR7, $z, 0);
quest::spawn2($Mob, 0, 0, $x - $BR8 * 0.5, $y - $BR8, $z, 0);
quest::spawn2($Mob, 0, 0, $x + $BR9, $y + $BR9 * 2, $z, 0);
quest::spawn2($Mob, 0, 0, $x - $BR10, $y + $BR10 * 2, $z, 0);
quest::spawn2($Mob, 0, 0, $x + $BR11 * 2, $y - $BR11, $z, 0);
quest::spawn2($Mob, 0, 0, $x - $BR12 * 2, $y - $BR12, $z, 0);
}
elsif($Location == 17){ #Random 16
my $BR1 = plugin::RandomRange(20, 70);
my $BR2 = plugin::RandomRange(20, 70);
my $BR3 = plugin::RandomRange(20, 70);
my $BR4 = plugin::RandomRange(20, 70);
my $BR5 = plugin::RandomRange(20, 70);
my $BR6 = plugin::RandomRange(20, 70);
my $BR7 = plugin::RandomRange(20, 70);
my $BR8 = plugin::RandomRange(20, 70);
my $BR9 = plugin::RandomRange(30, 70);
my $BR10 = plugin::RandomRange(30, 70);
my $BR11 = plugin::RandomRange(30, 70);
my $BR12 = plugin::RandomRange(30, 70);
my $BR13 = plugin::RandomRange(30, 70);
my $BR14 = plugin::RandomRange(30, 70);
my $BR15 = plugin::RandomRange(30, 70);
my $BR16 = plugin::RandomRange(30, 70);
quest::spawn2($Mob, 0, 0, $x + $BR1, $y + $BR1, $z, 0);
quest::spawn2($Mob, 0, 0, $x - $BR2, $y + $BR2, $z, 0);
quest::spawn2($Mob, 0, 0, $x + $BR3, $y - $BR3, $z, 0);
quest::spawn2($Mob, 0, 0, $x - $BR4, $y - $BR4, $z, 0);
quest::spawn2($Mob, 0, 0, $x + $BR5, $y + $BR5 * 0.5, $z, 0);
quest::spawn2($Mob, 0, 0, $x - $BR6, $y + $BR6 * 0.5, $z, 0);
quest::spawn2($Mob, 0, 0, $x + $BR7 * 0.5, $y - $BR7, $z, 0);
quest::spawn2($Mob, 0, 0, $x - $BR8 * 0.5, $y - $BR8, $z, 0);
quest::spawn2($Mob, 0, 0, $x + $BR9, $y + $BR9 * 2, $z, 0);
quest::spawn2($Mob, 0, 0, $x - $BR10, $y + $BR10 * 2, $z, 0);
quest::spawn2($Mob, 0, 0, $x + $BR11 * 2, $y - $BR11, $z, 0);
quest::spawn2($Mob, 0, 0, $x - $BR12 * 2, $y - $BR12, $z, 0);
quest::spawn2($Mob, 0, 0, $x + $BR13, $y + $BR13 * 2.5, $z, 0);
quest::spawn2($Mob, 0, 0, $x - $BR14, $y + $BR14 * 2.5, $z, 0);
quest::spawn2($Mob, 0, 0, $x + $BR15 * 2.5, $y - $BR15, $z, 0);
quest::spawn2($Mob, 0, 0, $x - $BR16 * 2.5, $y - $BR16, $z, 0);
}
elsif($Location == 18){ #Random 20
my $BR1 = plugin::RandomRange(20, 70);
my $BR2 = plugin::RandomRange(20, 70);
my $BR3 = plugin::RandomRange(20, 70);
my $BR4 = plugin::RandomRange(20, 70);
my $BR5 = plugin::RandomRange(20, 70);
my $BR6 = plugin::RandomRange(20, 70);
my $BR7 = plugin::RandomRange(20, 70);
my $BR8 = plugin::RandomRange(20, 70);
my $BR9 = plugin::RandomRange(30, 70);
my $BR10 = plugin::RandomRange(30, 70);
my $BR11 = plugin::RandomRange(30, 70);
my $BR12 = plugin::RandomRange(30, 70);
my $BR13 = plugin::RandomRange(30, 70);
my $BR14 = plugin::RandomRange(30, 70);
my $BR15 = plugin::RandomRange(30, 70);
my $BR16 = plugin::RandomRange(30, 70);
my $BR17 = plugin::RandomRange(50, 70);
my $BR18 = plugin::RandomRange(50, 70);
my $BR19 = plugin::RandomRange(50, 70);
my $BR20 = plugin::RandomRange(50, 70);
quest::spawn2($Mob, 0, 0, $x + $BR1, $y + $BR1, $z, 0);
quest::spawn2($Mob, 0, 0, $x - $BR2, $y + $BR2, $z, 0);
quest::spawn2($Mob, 0, 0, $x + $BR3, $y - $BR3, $z, 0);
quest::spawn2($Mob, 0, 0, $x - $BR4, $y - $BR4, $z, 0);
quest::spawn2($Mob, 0, 0, $x + $BR5, $y + $BR5 * 0.5, $z, 0);
quest::spawn2($Mob, 0, 0, $x - $BR6, $y + $BR6 * 0.5, $z, 0);
quest::spawn2($Mob, 0, 0, $x + $BR7 * 0.5, $y - $BR7, $z, 0);
quest::spawn2($Mob, 0, 0, $x - $BR8 * 0.5, $y - $BR8, $z, 0);
quest::spawn2($Mob, 0, 0, $x + $BR9, $y + $BR9 * 2, $z, 0);
quest::spawn2($Mob, 0, 0, $x - $BR10, $y + $BR10 * 2, $z, 0);
quest::spawn2($Mob, 0, 0, $x + $BR11 * 2, $y - $BR11, $z, 0);
quest::spawn2($Mob, 0, 0, $x - $BR12 * 2, $y - $BR12, $z, 0);
quest::spawn2($Mob, 0, 0, $x + $BR13, $y + $BR13 * 2.5, $z, 0);
quest::spawn2($Mob, 0, 0, $x - $BR14, $y + $BR14 * 2.5, $z, 0);
quest::spawn2($Mob, 0, 0, $x + $BR15 * 2.5, $y - $BR15, $z, 0);
quest::spawn2($Mob, 0, 0, $x - $BR16 * 2.5, $y - $BR16, $z, 0);
quest::spawn2($Mob, 0, 0, $x + $BR17, $y + $BR17 * 1.4, $z, 0);
quest::spawn2($Mob, 0, 0, $x - $BR18, $y + $BR18 * 1.6, $z, 0);
quest::spawn2($Mob, 0, 0, $x + $BR19 * 1.4, $y - $BR19, $z, 0);
quest::spawn2($Mob, 0, 0, $x - $BR20 * 1.6, $y - $BR20, $z, 0);

}
quest::set_proximity($x - $Range, $x + $Range, $y - $Range, $y + $Range, $z - $Z, $z + $Z);
}


#plugin::BombSignal(mobID, spellID, casttype);
sub BombSignal {
my $npc = plugin::val('$npc');
my $entity_list = plugin::val('$entity_list');
my $Bomb = $_[0];
my $spell = $_[1];
my $casttype = $_[2];



if($casttype == 0){ #Do Nothing
}

if($casttype == 1){ #Cast on target
my @nlist = $entity_list->GetNPCList();
foreach my $n (@nlist){
if ($n->GetNPCTypeID() == $Bomb){
$n->SpellFinished($spell, $n, 0);
}
}
}
}


Boss event examples : This also allows the "so called adds" to spawn with the boss no matter where its pulled to, negating setting loc for each add.

Timed explosions
#AEBomb Variables #plugin::AEbomb(npcID, xy, z, location);
my $Spawn = 999321; #NPC to spawn for AEs and other effects

#BombSignal Variables #plugin::BombSignal(bossID, mobID, spellID, casttype);
my $Boss = 999319;
my $SignalSpawn = 999321;
my $Spell = 85; #Spell to be casted by $Bomb
#my $Casttype = 0;


#Timer contollers
my $StartEvent = "StartEvent"; #Links Starting event timer name and stop event timer
my $StartTimer = 20; #The time when the event starts AFTER Boss Agro
my $SpawnCast = "SpawnCast";
my $SpawnCastTime = 5;
my $Depop = "Depop";
my $Depoptime = 7;

sub EVENT_SPAWN {

}

sub EVENT_SAY {
if($text=~/Hail/i){
quest::say("I am the test boss for explosions");
}
}

sub EVENT_AGGRO {
quest::settimer("$StartEvent", $StartTimer);
}

sub EVENT_TIMER {
if($timer eq "$StartEvent") { #Check event time
plugin::AEbomb($Spawn, 20, 0, 16); #Spawn bombs
quest::settimer("$SpawnCast", $SpawnCastTime); #Start cast timer
quest::settimer("$Depop", $Depoptime); #Start depop timer
quest::stoptimer("$StartEvent"); #Stop event timer
}

if($timer eq "$SpawnCast") { #Check cast time
plugin::BombSignal($Boss, $SignalSpawn, $Spell, 1); #signal bombs
quest::stoptimer("$SpawnCast"); #Stop event timer
}

if($timer eq "$Depop") { #Check depop time
quest::settimer("$StartEvent", $StartTimer); #Restart Event timer
quest::depopall($Spawn); #Depop all spawned
quest::stoptimer("$Depop"); #Stop event timer
}

}


Growing/Changing formations
my $StartEvent = "StartEvent"; #Links Starting event timer name and stop event timer
my $StartTimer = 10; #The time when the event starts AFTER Boss Agro
my $OutOne = 3;
my $OutTwo = 3;
my $OutThree = 3;
my $OutFour = 3;
my $OutFive = 3;
my $OutSix = 3;
my $OutReset = 3;
my $InOne = 3;
my $InTwo = 3;
my $InThree = 3;
my $InFour = 3;
my $InFive = 3;
my $InSix = 3;
my $InReset = 3;
my $MiddleOutOne = 3;
my $MiddleOutTwo = 3;
my $MiddleOutThree = 3;
my $MiddleOutReset = 3;
my $OutMiddleOne = 3;
my $OutMiddleTwo = 3;
my $OutMiddleThree = 3;
my $OutMiddleReset = 3;
my $Spawn = 999332;

sub EVENT_SAY {
if($text=~/Hail/i){
plugin::Whisper("I am the test boss for explosions");
}
}


sub EVENT_AGGRO {

quest::settimer("$StartEvent", $StartTimer);

}


sub EVENT_TIMER {
if ($timer eq "$StartEvent") {
my $RandomForm = quest::ChooseRandom(1,2,3,4);
if($RandomForm == 1) { #Out
quest::say("Start Out");
quest::settimer("OutOne", $OutOne);
quest::stoptimer("$StartEvent");
}
if($RandomForm == 2) { #In
quest::say("Start In");
quest::settimer("InOne", $InOne);
quest::stoptimer("$StartEvent");
}
if($RandomForm == 3) { #MiddleOut
quest::say("Start MiddleOut");
quest::settimer("MiddleOutOne", $MiddleOutOne);
quest::stoptimer("$StartEvent");
}
if($RandomForm == 4) { #OutMiddle
quest::say("Start OutMiddle");
quest::settimer("OutMiddleOne", $OutMiddleOne);
quest::stoptimer("$StartEvent");
}

}

if($timer eq "OutOne") { #Check event time
plugin::AEbomb($Spawn, 10, 5, 13); #Spawn bombs
quest::settimer("OutTwo", $OutTwo);
quest::stoptimer("OutOne"); #Stop event timer
}
if($timer eq "OutTwo") { #Check event time
plugin::AEbomb($Spawn, 20, 5, 13); #Spawn bombs
quest::settimer("OutThree", $OutThree);
quest::stoptimer("OutTwo"); #Stop event timer
}
if($timer eq "OutThree") { #Check event time
plugin::AEbomb($Spawn, 30, 5, 13); #Spawn bombs
quest::settimer("OutFour", $OutFour);
quest::stoptimer("OutThree"); #Stop event timer
}
if($timer eq "OutFour") { #Check event time
plugin::AEbomb($Spawn, 40, 5, 13); #Spawn bombs
quest::settimer("OutFive", $OutFive);
quest::stoptimer("OutFour"); #Stop event timer
}
if($timer eq "OutFive") { #Check event time
plugin::AEbomb($Spawn, 50, 5, 13); #Spawn bombs
quest::settimer("OutSix", $OutSix);
quest::stoptimer("OutFive"); #Stop event timer
}
if($timer eq "OutSix") { #Check event time
plugin::AEbomb($Spawn, 60, 5, 13); #Spawn bombs
quest::settimer("OutReset", $OutReset);
quest::stoptimer("OutSix"); #Stop event timer
}
if($timer eq "OutReset") { #Check event time
quest::stoptimer("OutReset"); #Stop event timer
quest::depopall($Spawn); #Depop all spawned
quest::settimer("$StartEvent", $StartTimer);
}


if($timer eq "InOne") { #Check event time
plugin::AEbomb($Spawn, 60, 5, 13); #Spawn bombs
quest::settimer("InTwo", $InTwo);
quest::stoptimer("InOne"); #Stop event timer
}
if($timer eq "InTwo") { #Check event time
plugin::AEbomb($Spawn, 50, 5, 13); #Spawn bombs
quest::settimer("InThree", $InThree);
quest::stoptimer("InTwo"); #Stop event timer
}
if($timer eq "InThree") { #Check event time
plugin::AEbomb($Spawn, 40, 5, 13); #Spawn bombs
quest::settimer("InFour", $InFour);
quest::stoptimer("InThree"); #Stop event timer
}
if($timer eq "InFour") { #Check event time
plugin::AEbomb($Spawn, 30, 5, 13); #Spawn bombs
quest::settimer("InFive", $InFive);
quest::stoptimer("InFour"); #Stop event timer
}
if($timer eq "InFive") { #Check event time
plugin::AEbomb($Spawn, 20, 5, 13); #Spawn bombs
quest::settimer("InSix", $InSix);
quest::stoptimer("InFive"); #Stop event timer
}
if($timer eq "InSix") { #Check event time
plugin::AEbomb($Spawn, 10, 5, 13); #Spawn bombs
quest::stoptimer("InSix"); #Stop event timer
quest::settimer("InReset", $InReset);
}
if($timer eq "InReset") { #Check event time
quest::stoptimer("InReset"); #Stop event timer
quest::depopall($Spawn); #Depop all spawned
quest::settimer("$StartEvent", $StartTimer);
}


if($timer eq "MiddleOutOne") { #Check event time
plugin::AEbomb($Spawn, 30, 5, 13); #Spawn bombs
plugin::AEbomb($Spawn, 40, 5, 13); #Spawn bombs
quest::settimer("MiddleOutTwo", $MiddleOutTwo);
quest::stoptimer("MiddleOutOne"); #Stop event timer
}
if($timer eq "MiddleOutTwo") { #Check event time
plugin::AEbomb($Spawn, 50, 5, 13); #Spawn bombs
plugin::AEbomb($Spawn, 20, 5, 13); #Spawn bombs
quest::settimer("MiddleOutThree", $MiddleOutThree);
quest::stoptimer("MiddleOutTwo"); #Stop event timer
}
if($timer eq "MiddleOutThree") { #Check event time
plugin::AEbomb($Spawn, 10, 5, 13); #Spawn bombs
plugin::AEbomb($Spawn, 60, 5, 13); #Spawn bombs
quest::settimer("MiddleOutReset", $MiddleOutReset);
quest::stoptimer("MiddleOutThree"); #Stop event timer
}
if($timer eq "MiddleOutReset") { #Check event time
quest::stoptimer("MiddleOutReset"); #Stop event timer
quest::depopall($Spawn); #Depop all spawned
quest::settimer("$StartEvent", $StartTimer);
}


if($timer eq "OutMiddleOne") { #Check event time
plugin::AEbomb($Spawn, 10, 5, 13); #Spawn bombs
plugin::AEbomb($Spawn, 60, 5, 13); #Spawn bombs
quest::settimer("OutMiddleTwo", $OutMiddleTwo);
quest::stoptimer("OutMiddleOne"); #Stop event timer
}
if($timer eq "OutMiddleTwo") { #Check event time
plugin::AEbomb($Spawn, 50, 5, 13); #Spawn bombs
plugin::AEbomb($Spawn, 20, 5, 13); #Spawn bombs
quest::settimer("OutMiddleThree", $OutMiddleThree);
quest::stoptimer("OutMiddleTwo"); #Stop event timer
}
if($timer eq "OutMiddleThree") { #Check event time
plugin::AEbomb($Spawn, 30, 5, 13); #Spawn bombs
plugin::AEbomb($Spawn, 40, 5, 13); #Spawn bombs
quest::settimer("OutMiddleReset", $OutMiddleReset);
quest::stoptimer("OutMiddleThree"); #Stop event timer
}
if($timer eq "OutMiddleReset") { #Check event time
quest::stoptimer("OutMiddleReset"); #Stop event timer
quest::depopall($Spawn); #Depop all spawned
quest::settimer("$StartEvent", $StartTimer);
}



}

Boss that spawns adds and then the adds to assist boss and even randomly change target based on signal
Boss.pl
#AEBomb Variables #plugin::AEbomb(npcID, xy, z, location);
my $Spawn = 999326; #NPC to spawn for AEs and other effects
my $SpawnA = 999327;
#BombSignal Variables #plugin::BombSignal(bossID, mobID, spellID, casttype);
my $Boss = 999325;
my $SignalSpawn = 999326;
my $SignalSpawnA = 999327;
my $Spell = 85; #Spell to be casted by $Bomb
#my $Casttype = 0;

#$client->SendMarqueeMessage();

#Timer contollers
my $StartEvent = "StartEvent"; #Links Starting event timer name and stop event timer
my $StartTimer = 10; #The time when the event starts AFTER Boss Agro
my $SpawnCast = "SpawnCast";
my $SpawnCastTime = 12;
my $Depop = "Depop";
my $Depoptime = 120;

sub EVENT_SPAWN {

}

sub EVENT_SAY {
if($text=~/Hail/i){
plugin::Whisper("I am the test boss for explosions");
}
}


sub EVENT_AGGRO {
quest::settimer("$StartEvent", $StartTimer);
quest::settimer("Link",3);
}

sub EVENT_TIMER {
if($timer eq "$StartEvent") { #Check event time
plugin::AEbomb($Spawn, 10, 0, 18); #Spawn bombs
quest::settimer("$SpawnCast", $SpawnCastTime); #Start cast timer
quest::settimer("$Depop", $Depoptime); #Start depop timer

quest::stoptimer("$StartEvent"); #Stop event timer
plugin::Whisper("start event timer finished");
}

if($timer eq "$SpawnCast") { #Check cast time
plugin::Whisper("hit attack timer");
quest::signalwith($SignalSpawn, 2, 0);
#quest::stoptimer("$SpawnCast"); #Stop event timer
}




if($timer eq "$Depop") { #Check depop time
quest::settimer("$StartEvent", $StartTimer); #Restart Event timer
quest::depopall($Spawn); #Depop all spawned
quest::stoptimer("$Depop"); #Stop event timer
}

if($timer eq "Link") {
my @nlist = $entity_list->GetNPCList();
foreach my $n (@nlist){
if (plugin::CheckDistBetween2Ents($npc, $n, 150)) {
$n->AddToHateList($npc->GetHateRandom());
}
}
}

}
sub EVENT_DEATH {
quest::stoptimer("$StartEvent"); #Stop event timer
quest::stoptimer("$SpawnCast"); #Stop event timer
quest::depopall($Spawn); #Depop all spawned
quest::stoptimer("$Depop"); #Stop event timer
quest::stoptimer("Link");
}


Adds to assist boss
sub EVENT_AGGRO {
quest::settimer("ChangeTarget", 11);

}

sub EVENT_SIGNAL {
my $RandomPlayer = $npc->GetHateRandom();
my $SpellsList = quest::ChooseRandom(656,230,383);
if ($signal == 1) {
$npc->WipeHateList();
quest::say("removed hate");
$npc->Attack($RandomPlayer);
quest::say("changed target");
}

if ($signal == 2) {
$npc->SpellFinished($SpellsList, $RandomPlayer, 0);
quest::say("casted");
}

if ($signal == 3) {
$npc->SpellFinished($SpellsList, $RandomPlayer, 0);
quest::say("casted");
}

}


sub EVENT_TIMER {
my $RandomPlayer = $npc->GetHateRandom();
my $SpellsList = quest::ChooseRandom(656,230,383);
if ($timer eq "ChangeTarget") {
$npc->WipeHateList();
$npc->Attack($RandomPlayer);

}
}






sub EVENT_DEATH {


quest::stoptimer("Cast");



}

Boss that spawns adds that will heal him based on signal
Boss.pl
#AEBomb Variables #plugin::AEbomb(npcID, xy, z, location);
my $Spawn = 999324; #NPC to spawn for AEs and other effects
my $Boss = 999325;
my $SignalSpawn = 999324;


#Timer contollers
my $StartEvent = "StartEvent"; #Links Starting event timer name and stop event timer
my $StartTimer = 20; #The time when the event starts AFTER Boss Agro
my $SpawnCast = "SpawnCast";
my $SpawnCastTime = 2;
my $Depop = "Depop";
my $Depoptime = 19;

sub EVENT_SPAWN {

}

sub EVENT_SAY {
if($text=~/Hail/i){
quest::say("I am the test boss for explosions");
plugin::AEbomb($Spawn, 20, 0, 13); #Spawn bombs
quest::signalwith($SignalSpawn, 1, 0);
}
}

sub EVENT_AGGRO {
quest::settimer("$StartEvent", $StartTimer);
}

sub EVENT_TIMER {
if($timer eq "$StartEvent") { #Check event time
plugin::AEbomb($Spawn, 20, 0, 13); #Spawn bombs
quest::settimer("$SpawnCast", $SpawnCastTime); #Start cast timer
quest::settimer("$Depop", $Depoptime); #Start depop timer
quest::stoptimer("$StartEvent"); #Stop event timer
}

if($timer eq "$SpawnCast") { #Check cast time
quest::signalwith($SignalSpawn, 1, 0);
quest::say("sent signal");
quest::stoptimer("$SpawnCast"); #Stop event timer
}

if($timer eq "$Depop") { #Check depop time
quest::settimer("$StartEvent", $StartTimer); #Restart Event timer
quest::depopall($Spawn); #Depop all spawned
quest::stoptimer("$Depop"); #Stop event timer
}

}


Adds that heal boss
my $Add = 999324;
my $Spell = 13;


sub EVENT_SIGNAL {
if ($signal == 1) {
my @nlist = $entity_list->GetNPCList();
foreach my $n (@nlist){
my $Boss = $entity_list->GetNPCByNPCTypeID(999323);
if ($n->GetNPCTypeID() == $Add){
$n->SpellFinished($Spell, $Boss, 0);
}
}
}


}