Go Back   EQEmulator Home > EQEmulator Forums > Quests > Quests::Q&A

Quests::Q&A This is the quest support section

Reply
 
Thread Tools Display Modes
  #16  
Old 12-03-2010, 11:05 AM
Akkadius's Avatar
Akkadius
Administrator
 
Join Date: Feb 2009
Location: MN
Posts: 2,072
Default

Quote:
Originally Posted by trevius View Post
If you want to cast a spell on the entire group, it would be easiest to just get the group and cycle through each member having the NPC cast the spell on them. Though, if you only want group spells to land on the full group (and not single target), it would probably take a bit more work. I am not aware of any current commands to check if a spell is a group spell or not, but it would probably be really easy to add one to the source if needed.

Here is an example script (not tested) that includes a subroutine for casting a spell on the whole group. You could even add the sub into your plugins folder and make it into a plugin instead if you wanted so it can be accessed from any script (using plugin::CastOnGroup(SpellID, MaxDist)).


Code:
sub EVENT_SAY {

	if ($text =~ /Hail/i)
	{
		#plugin::CastOnGroup(11, 100, $client); # Can use like this is saved as a plugin instead
		CastOnGroup(11);
		quest::say("Casting buff on your group");
	}

}


#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 $SpellID = $_[0];
	my $MaxDist = $_[1];
	my $Caster = $_[2];

	# 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();
	
	# If the client is grouped
	if ($ClientGroup)
	{
		# Cycle through all 6 possible group members
		my $GCount = 0;
		while ($GCount < 6)
		{
			$GroupMember = $Group->GetMember($GCount);
			# If this group member exists
			if ($GroupMember)
			{
				my $OutOfRange = 0;
				# 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);
					# 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;
					}
				}
				
				# If they aren't out of range or range was not specified
				if (!$OutOfRange)
				{
					my $MemberID = $GroupMember->GetID();
					# Cast the spell on this member
					$npc->CastSpell($SpellID, $MemberID);
					my $PetID = $GroupMember->GetPetID();
					# Check if this member has a pet and if so, cast it on the pet as well
					if ($PetID)
					{
						$npc->CastSpell($SpellID, $PetID);
					}
				}
			
			}
			$GCount++;
		}
	}
	else
	{
		# Client is not grouped, so just cast on them
		my $CasterID = $Caster->GetID();
		$npc->CastSpell($SpellID, $CasterID);
		my $PetID = $Caster->GetPetID();
		# Check if the client has a pet and if so, cast it on the pet as well
		if ($PetID)
		{
			$npc->CastSpell($SpellID, $PetID);
		}
	}

}
Again, this is untested and I just wrote it from scratch. If it works, it would probably be a good one to add to plugins if there isn't already a better way to do this.
Plugin added to repo, merged into group_utils.pl
Reply With Quote
  #17  
Old 12-03-2010, 02:23 PM
Huppy's Avatar
Huppy
Demi-God
 
Join Date: Oct 2010
Posts: 1,332
Default

Quote:
Originally Posted by trevius View Post
If you want to cast a spell on the entire group, it would be easiest to just get the group and cycle through each member having the NPC cast the spell on them. Though, if you only want group spells to land on the full group (and not single target), it would probably take a bit more work. I am not aware of any current commands to check if a spell is a group spell or not, but it would probably be really easy to add one to the source if needed.

Here is an example script (not tested) that includes a subroutine for casting a spell on the whole group. You could even add the sub into your plugins folder and make it into a plugin instead if you wanted so it can be accessed from any script (using plugin::CastOnGroup(SpellID, MaxDist))..
Thanx Trevius. Your right, it would be easiest to just get the group members
to cycle through, getting the buff from the NPC, which I really could live with
that. My whole problem started when using the $npc->CastSpell in a script.
It works fine if the spellid is a single buff (such as Spirit of Eagle). But if I
change the spellid to a group buff (such as Flight of Eagles), the NPC will go
through the anim of casting, but does not actually cast the spell.
The selfcast::(spellid) will work fine with any group buff like KEI, but not the
$npc->CastSpell
This is one of the scripts I am currently using;

sub EVENT_SAY {

if ($text =~/hail/i) {
quest::say("Incoming Clarity for $name");
my $GetPlayerID = $client->GetID();
$npc->CastSpell(1693, $GetPlayerID );
}
}
This script works perfect for any single target spell (SoW, Temp, etc)
But if I change the spellid from 1693 to 2570 (Koadic's Endless Intellect),
The NPC will not cast that spell or any other group spellid.
My goal, to start out with was having an NPC cast the KEI buff using the
$npc->CastSpell only because it casts a full timer buff duration, no matter
what level the character is.
This is when I found out, that command would not cast any group buff.
Reply With Quote
  #18  
Old 12-04-2010, 05:09 AM
trevius's Avatar
trevius
Developer
 
Join Date: Aug 2006
Location: USA
Posts: 5,946
Default

I am not having any issues casting group spells from an NPC using this:

Code:
sub EVENT_SAY {

	if ($text =~/hail/i) {
		my $Group = $client->GetGroup();
		if($Group) {
			$Group->CastGroupSpell($npc, 1693);
		}
		else {
			my $GetPlayerID = $client->GetID();
			$npc->CastSpell(1693, $GetPlayerID );
		}
		quest::say("Incoming Clarity for $name");
	}

}
And, Akkadius, keep in mind that that code was untested. I tested it a bit and there was an issue or 2 with it. This updated one seems to work well enough though:

Code:
#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);
		}
	}

}
__________________
Trevazar/Trevius Owner of: Storm Haven
Everquest Emulator FAQ (Frequently Asked Questions) - Read It!

Last edited by trevius; 12-05-2010 at 03:50 AM..
Reply With Quote
  #19  
Old 12-04-2010, 06:57 AM
Huppy's Avatar
Huppy
Demi-God
 
Join Date: Oct 2010
Posts: 1,332
Default

[QUOTE=trevius;194793]I am not having any issues casting group spells from an NPC using this:

Code:
sub EVENT_SAY {

	if ($text =~/hail/i) {
		my $Group = $client->GetGroup();
		if($Group) {
			$Group->CastGroupSpell($npc, 1693)
		}
		else {
			my $GetPlayerID = $client->GetID();
			$npc->CastSpell(1693, $GetPlayerID );
		}
		quest::say("Incoming Clarity for $name");
	}

}
THANK YOU VERY MUCH, That works perfect
Reply With Quote
  #20  
Old 12-04-2010, 02:00 PM
Akkadius's Avatar
Akkadius
Administrator
 
Join Date: Feb 2009
Location: MN
Posts: 2,072
Default

Quote:
Originally Posted by trevius View Post
I am not having any issues casting group spells from an NPC using this:

Code:
sub EVENT_SAY {

	if ($text =~/hail/i) {
		my $Group = $client->GetGroup();
		if($Group) {
			$Group->CastGroupSpell($npc, 1693)
		}
		else {
			my $GetPlayerID = $client->GetID();
			$npc->CastSpell(1693, $GetPlayerID );
		}
		quest::say("Incoming Clarity for $name");
	}

}
And, Akkadius, keep in mind that that code was untested. I tested it a bit and there was an issue or 2 with it. This updated one seems to work well enough though:

Code:
#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);
		}
	}

}
I figured since your history of posting plugins it would be fine. Not a big deal, updated the plugin. Good job
Reply With Quote
Reply


Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump

   

All times are GMT -4. The time now is 02:08 PM.


 

Everquest is a registered trademark of Daybreak Game Company LLC.
EQEmulator is not associated or affiliated in any way with Daybreak Game Company LLC.
Except where otherwise noted, this site is licensed under a Creative Commons License.
       
Powered by vBulletin®, Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Template by Bluepearl Design and vBulletin Templates - Ver3.3