Here it is!
Okay, so nevermind on the sending pet buffs to client, I was actually doing a GetClient()->SendPetBuffsToClient(), which had no effect.
That's corrected now and I believe this is a good version.
Of course, I know you guys will give me some feedback, which is very welcome!
There is actually a restriction to where you cannot suspend a pet while it is engaged. Therefore, I took the liberty of creating a general message in red text. If anyone finds that message, please relay that back to me or change it yourself if you have access to the code.
Here it is:
Code:
Index: zone/AA.h
===================================================================
--- zone/AA.h (revision 1094)
+++ zone/AA.h (working copy)
@@ -265,6 +265,7 @@
aaParagonofSpirit = 291, //DB
aaAdvancedInnateStrength = 292, //works
aaAdvancedInnateStamina = 302, //works
+ //aaSuspendMinion = 308, //WIP -- brandon
aaAdvancedInnateAgility = 312, //works
aaAdvancedInnateDexterity = 322, //works
aaAdvancedInnateIntelligence = 332, //works
Index: zone/client.cpp
===================================================================
--- zone/client.cpp (revision 1094)
+++ zone/client.cpp (working copy)
@@ -268,6 +268,7 @@
//for good measure:
memset(&m_pp, 0, sizeof(m_pp));
memset(&m_epp, 0, sizeof(m_epp));
+ memset(&m_suspended_minion, 0, sizeof(m_suspended_minion));
PendingTranslocate = false;
PendingSacrifice = false;
BoatID = 0;
@@ -4767,6 +4768,70 @@
return 0;
}
+void Client::SuspendMinion(){
+ Client *c = this;
+
+ Mob *pet = c->GetPet();
+ NPC *npcPet = NULL;
+
+ int cur_level=c->GetAA(aaID::aaSuspendedMinion);//SuspendedMinion ID
+
+ if(cur_level==0){
+ return;
+ }
+
+ int spell_id=0;
+ if(pet==0){
+ if(m_suspended_minion.pet_id > 0){
+ if(m_suspended_minion.pet_id){
+ c->MakePet(m_suspended_minion.pet_id,spells[m_suspended_minion.pet_id].teleport_zone);
+ pet = GetPet();
+ npcPet = GetPet()->CastToNPC();
+ if(cur_level >= 2){
+ npcPet->SetPetState(m_suspended_minion.pet_buffs, m_suspended_minion.pet_items);
+ pet->SendPetBuffsToClient();
+ }
+ npcPet->CalcBonuses();
+ npcPet->SetHP(m_suspended_minion.pet_hp);
+ npcPet->SetMana(m_suspended_minion.pet_mana);
+ c->Message(clientMessageTell,"%s tells you, 'I live again...'",pet->GetCleanName());
+ memset(&m_suspended_minion, 0, sizeof(m_suspended_minion));
+ }else{
+ c->Message(13,"Error: Couldn't find the spell id for your pet!");
+ return;
+ }
+ }else{
+ return;
+ }
+ }else{
+ npcPet = GetPet()->CastToNPC();
+ spell_id=npcPet->GetPetSpellID();
+ if(spell_id){
+ if(m_suspended_minion.pet_id > 0){
+ c->Message(clientMessageError,"You cannot have more than one pet at a time.");
+ return;
+ }else if(pet->IsEngaged()){
+ c->Message(clientMessageError,"You cannot suspend a pet while in battle.");
+ return;
+ }else{
+
+ m_suspended_minion.pet_id = spell_id;
+ m_suspended_minion.pet_hp = pet->GetHP();;
+ m_suspended_minion.pet_mana = pet->GetMana();
+ if(cur_level >= 2){
+ npcPet->GetPetState(m_suspended_minion.pet_buffs, m_suspended_minion.pet_items,m_suspended_minion.pet_name);
+ }
+
+ c->Message(clientMessageTell,"%s tells you, 'By your command, master.'",pet->GetCleanName());
+ pet->Kill();
+ }
+ }else{
+ c->Message(13,"Error getting the spell_id from the npc_type id.");
+ return;
+ }
+ }
+}
+
void Client::SummonAndRezzAllCorpses()
{
pendingrezzexp = -1;
Index: zone/client.h
===================================================================
--- zone/client.h (revision 1094)
+++ zone/client.h (working copy)
@@ -150,6 +150,16 @@
Client *MakeClient(EQStream* ieqs);
};
+struct SuspendedMinion_Struct
+{
+ int16 pet_id;
+ int16 pet_hp;
+ int16 pet_mana;
+ SpellBuff_Struct pet_buffs[BUFF_COUNT];
+ int32 pet_items[MAX_MATERIALS];
+ char pet_name[64];
+};
+
class Client : public Mob
{
public:
@@ -894,6 +904,7 @@
void CalcItemScale();
bool CalcItemScale(int32 slot_x, int32 slot_y);
void SummonAndRezzAllCorpses();
+ void SuspendMinion();
void NotifyNewTitlesAvailable();
void Signal(int32 data);
Mob *GetBindSightTarget() { return bind_sight_target; }
@@ -1033,6 +1044,8 @@
Inventory m_inv;
Object* m_tradeskill_object;
+ SuspendedMinion_Struct m_suspended_minion;
+
AdventureInfo* m_offered_adventure;
AdventureDetails *m_current_adventure;
Index: zone/command.cpp
===================================================================
--- zone/command.cpp (revision 1094)
+++ zone/command.cpp (working copy)
@@ -341,6 +341,7 @@
command_add("guilds",NULL,0,command_guild) ||
command_add("zonestatus","- Show connected zoneservers, synonymous with /servers",150,command_zonestatus) ||
command_add("manaburn","- Use AA Wizard class skill manaburn on target",10,command_manaburn) ||
+ command_add("suspendminion","- Use pet class AA skill Suspend Minion",10,command_suspendminion) ||
command_add("viewmessage","[id] - View messages in your tell queue",100,command_viewmessage) ||
command_add("viewmessages",NULL,0,command_viewmessage) ||
command_add("doanim","[animnum] [type] - Send an EmoteAnim for you or your target",50,command_doanim) ||
@@ -5158,6 +5159,11 @@
}
}
+void command_suspendminion(Client *c, const Seperator *sep)
+{
+ c->SuspendMinion();
+}
+
void command_viewmessage(Client *c, const Seperator *sep)
{
char errbuf[MYSQL_ERRMSG_SIZE];
Index: zone/command.h
===================================================================
--- zone/command.h (revision 1094)
+++ zone/command.h (working copy)
@@ -218,6 +218,7 @@
bool helper_guild_edit(Client *c, int32 dbid, int32 eqid, int8 rank, const char* what, const char* value);
void command_zonestatus(Client *c, const Seperator *sep);
void command_manaburn(Client *c, const Seperator *sep);
+void command_suspendminion(Client *c, const Seperator *sep);
void command_viewmessage(Client *c, const Seperator *sep);
void command_doanim(Client *c, const Seperator *sep);
void command_randomfeatures(Client *c, const Seperator *sep);
Index: zone/pets.cpp
===================================================================
--- zone/pets.cpp (revision 1094)
+++ zone/pets.cpp (working copy)
@@ -213,8 +213,6 @@
return base_hp;
}
*/
-
-
void Mob::MakePet(int16 spell_id, const char* pettype, const char *petname) {
//see if we are a special type of pet (for command filtering)
PetType type = petOther;
Index: zone/spell_effects.cpp
===================================================================
--- zone/spell_effects.cpp (revision 1094)
+++ zone/spell_effects.cpp (working copy)
@@ -2732,6 +2732,11 @@
CastToClient()->GoToBind(4);
break;
}
+ case SE_SuspendMinion:
+ case SE_SuspendPet:
+ {
+ CastToClient()->SuspendMinion();
+ }
case SE_ImprovedDamage:
case SE_ImprovedHeal:
|