peq-quests/plugins/group_utility.pl
2019-06-29 20:15:22 -04:00

235 lines
No EOL
5.9 KiB
Perl

#::: Author: Trevius
#::: Description: Returns Group members or Raid members if present
#::: Usage: takes a client variable ex: @members = plugin::GetGroupMembers($client)
sub GetGroupMembers{
my $cl = shift;
my @group_array;
my $group = $cl->GetGroup();
if($group)
{
for(my $count = 0; $count < 6; $count++)
{
my $cur = $group->GetMember($count);
if($cur)
{
if($cur->IsClient())
{
# this is cast-safe..but, does not account for mercenaries/bots (divergent behavior from system code)
$cur = $cur->CastToClient();
push(@group_array, $cur);
}
}
}
return @group_array;
}
$group = $cl->GetRaid();
if($group){
my $gid = $group->GetGroup($cl->GetName());
print "group is $gid";
if($gid < 0 || $gid >= 12)
{
push(@group_array, $cl);
return @group_array;
}
for(my $count = 0; $count < 72; $count++)
{
my $cur = $group->GetMember($count);
if($cur)
{
my $c_gid = $group->GetGroup($cur->GetName());
if($c_gid == $gid)
{
push(@group_array, $cur);
}
}
}
return @group_array;
}
push(@group_array, $cl);
return @group_array;
}
#::: Author: Akkadius
#::: Description: Used in conjuction with Instance plugin
sub GetGroupID{
my $client = plugin::val('$client');
my $ClientGroup = $client->GetGroup();
if ($ClientGroup){ my $GroupID = $ClientGroup->GetID(); return $GroupID; }
else{ $GroupID = undef; }
}
#::: Author: ?
#::: Description: Used in conjuction with Instance plugin
sub CastGroupSpell{
my $cl = shift;
my $caster = shift;
my $spell_id = shift;
my $group = $cl->GetGroup();
if($group){
$group->CastGroupSpell($caster, $spell_id);
return;
}
$group = $cl->GetRaid();
if($group){
$group->CastGroupSpell($caster, $spell_id);
return;
}
}
#::: Author: ?
#::: Description: Moves group to destination
#::: Usage: plugin::MoveGroup(zoneid, x, y, z, h)
sub MoveGroup{
my $cl = shift;
my $zone_id = shift;
my $x_dest = shift;
my $y_dest = shift;
my $z_dest = shift;
my $heading_dest = shift;
my @group_array = plugin::GetGroupMembers($cl);
foreach $ent (@group_array)
{
if($ent)
{
$ent->MovePC($zone_id, $x_dest, $y_dest, $z_dest, $heading_dest);
}
}
}
#::: Author: ?
#::: Description: Moves group to destination instance
#::: Usage: plugin::MoveGroupInstance(zoneid, instanceid, x, y, z, h)
sub MoveGroupInstance{
my $cl = shift;
my $zone_id = shift;
my $instance_id = shift;
my $x_dest = shift;
my $y_dest = shift;
my $z_dest = shift;
my $heading_dest = shift;
my @group_array = plugin::GetGroupMembers($cl);
foreach $ent (@group_array)
{
if($ent)
{
$ent->MovePC($zone_id, $instance_id, $x_dest, $y_dest, $z_dest, $heading_dest);
}
}
}
# Usage: plugin::CastOnGroup(SpellID, MaxDist=0, Client=$client);
# This script will cast the spell on the client's group from an NPC (such as a buff bot).
# SpellID - This is just the spell ID to be cast.
# MaxDist - This is an optional field for setting the Max Distance for the spell to land on group members.
# The Default 0 setting for MaxDist disables the check for distance so it will be cast on all group members in zone.
# Client - This is an optional field to set a specific client to cast buffs on their group (Default is the client interacting with the NPC)
sub CastOnGroup {
my $npc = plugin::val('$npc');
my $client = plugin::val('$client');
my $entity_list = plugin::val('$entity_list');
my $SpellID = $_[0];
my $MaxDist = $_[1];
my $Caster = $_[2];
#plugin::Debug("If the caster field was not set, use the client interacting with the NPC as the caster");
if (!$Caster){
$Caster = $client;
}
my $ClientGroup = $client->GetGroup();
#plugin::Debug("If the client is grouped");
if ($ClientGroup){
#plugin::Debug("Cycle through all 6 possible group members");
my $GCount = 0;
while ($GCount < 6)
{
$GroupMember = $ClientGroup->GetMember($GCount);
#plugin::Debug("If this group member exists");
if ($GroupMember)
{
my $OutOfRange = 0;
#plugin::Debug("If MaxDist was set, make sure the client is within the desired range");
if ($MaxDist)
{
my $ClientX = $GroupMember->GetX();
my $ClientY = $GroupMember->GetY();
my $ClientZ = $GroupMember->GetZ();
my $ClientDist = $npc->CalculateDistance($ClientX, $ClientY, $ClientZ);
#plugin::Debug("Check if the Square Root of the Distance from NPC to Client is less than MaxDist");
# CalculateDistance returns squared distance
if (sqrt($ClientDist) > $MaxDist)
{
$OutOfRange = 1;
}
}
#plugin::Debug("If they aren't out of range or range was not specified");
if (!$OutOfRange)
{
my $MemberID = $GroupMember->GetID();
#plugin::Debug("Cast the spell on this member");
#$npc->CastSpell($SpellID, $MemberID);
$npc->SpellFinished($SpellID, $GroupMember, 0);
my $PetID = $GroupMember->GetPetID();
#plugin::Debug("Check if this member has a pet and if so, cast it on the pet as well");
if ($PetID)
{
#$npc->CastSpell($SpellID, $PetID);
$npc->SpellFinished($SpellID, $entity_list->GetMobByID($PetID), 0);
}
}
}
$GCount++;
}
}
else
{
#plugin::Debug("Client is not grouped, so just cast on them");
my $CasterID = $Caster->GetID();
#$npc->CastSpell($SpellID, $CasterID);
$npc->SpellFinished($SpellID, $Caster, 0);
my $PetID = $Caster->GetPetID();
#plugin::Debug("Check if the client has a pet and if so, cast it on the pet as well");
if ($PetID)
{
#$npc->CastSpell($SpellID, $PetID);
$npc->SpellFinished($SpellID, $entity_list->GetMobByID($PetID), 0);
}
}
}
#::: Author: Akkadius
#::: Description: Messages group
#::: Usage: plugin::MessageGroup(color, message)
sub MessageGroup{
my $Color = $_[0];
my $Message = $_[1];
my $client = plugin::val('$client');
my @group_array = plugin::GetGroupMembers($client);
foreach $ent (@group_array) {
if($ent) {
$ent->Message($Color, $Message);
}
}
}
1;