Hello, guys. I have the Suspend Minion AA working on my server (refreshed SVN yesterday).
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)
@@ -4766,7 +4766,150 @@
return 0;
}
+int get_suspendedminion_spell_id(int account_id){
+ char errbuf[MYSQL_ERRMSG_SIZE];
+ char *query = 0;
+ int spell_id = 0;
+ MYSQL_RES *result;
+ MYSQL_ROW row;
+ if(account_id <=0)
+ return 0;
+
+ if (database.RunQuery(query, MakeAnyLenString(&query, "SELECT spell_id from suspendedminions WHERE account_id=%0d",account_id), errbuf, &result)){
+ if (mysql_num_rows(result)>0){
+ row = mysql_fetch_row(result);
+ mysql_free_result(result);
+ if (strlen(row[0])>0){
+ spell_id=atoi(row[0]);
+ }
+ }
+ }
+ safe_delete_array(query);
+ return (spell_id > 0 ? spell_id : 0);
+}
+
+void delete_suspendedminions(int account_id){
+ char errbuf[MYSQL_ERRMSG_SIZE];
+ char *query = 0;
+
+ if(account_id <=0)
+ return;
+
+ database.RunQuery(query, MakeAnyLenString(&query, "DELETE FROM suspendedminions WHERE account_id=%0d",account_id), errbuf);//Deletes all suspended minions, just in case they happened to get more than one
+ safe_delete_array(query);
+}
+
+int get_suspendedminion_count(int account_id){
+ char errbuf[MYSQL_ERRMSG_SIZE];
+ char *query = 0;
+ int count = 0;
+ MYSQL_RES *result;
+ MYSQL_ROW row;
+
+ if(account_id <=0)
+ return 0;
+
+ if (database.RunQuery(query, MakeAnyLenString(&query, "SELECT COUNT(*) from suspendedminions WHERE account_id=%0d",account_id), errbuf, &result)){
+ if (mysql_num_rows(result)>0){
+ row = mysql_fetch_row(result);
+ mysql_free_result(result);
+ if (strlen(row[0])>0){
+ count=atoi(row[0]);
+ }
+ }
+ }
+ safe_delete_array(query);
+ return (count > 0 ? count : 0);
+}
+
+int get_spellid_from_npctypeid(int npc_type){
+ char errbuf[MYSQL_ERRMSG_SIZE];
+ char *query = 0;
+ int spell_id = 0;
+ MYSQL_RES *result;
+ MYSQL_ROW row;
+
+ if(npc_type <= 0)
+ return 0;
+
+ if (database.RunQuery(query, MakeAnyLenString(&query, "SELECT s.id FROM spells_new s INNER JOIN npc_types nt ON (s.teleport_zone=nt.name) WHERE nt.id=%0d LIMIT 1",npc_type), errbuf, &result)){
+ if (mysql_num_rows(result)>0){
+ row = mysql_fetch_row(result);
+ mysql_free_result(result);
+ if (strlen(row[0])>0){
+ spell_id=atoi(row[0]);
+ }
+ }
+ }
+ safe_delete_array(query);
+ return (spell_id > 0 ? spell_id : 0);
+}
+
+int add_suspendedminion(int account_id,int spell_id){
+ char errbuf[MYSQL_ERRMSG_SIZE];
+ char *query = 0;
+
+ if(account_id <=0 || spell_id <=0)
+ return -1;
+
+ database.RunQuery(query, MakeAnyLenString(&query, "INSERT INTO suspendedminions (account_id,spell_id) VALUES (%i,%i)", account_id, spell_id));
+ safe_delete_array(query);
+ return 0;
+}
+void Client::SuspendMinion(){
+ Client *c = this;
+ char errbuf[MYSQL_ERRMSG_SIZE];
+ char *query = 0;
+ MYSQL_RES *result;
+ MYSQL_ROW row;
+
+ Mob *pet = c->GetPet();
+
+ int cur_level=c->GetAA(aaID::aaSuspendedMinion);//SuspendedMinion ID
+
+ if(cur_level==0){
+ c->Message(0," - You don't have that AA!");
+ return;
+ }
+
+ //TODO: Right now, get the pet to pop and depop--worry about ranks later
+ int spell_id=0;
+ int minion_count = get_suspendedminion_count(c->AccountID());
+ if(pet==0){
+ if(minion_count > 0){
+ spell_id = get_suspendedminion_spell_id(c->AccountID());
+ if(spell_id){
+ c->Message(0,"Your pet falls out of your pocket!");
+ c->MakePet(spell_id,spells[spell_id].teleport_zone);
+ delete_suspendedminions(c->AccountID());
+ }else{
+ c->Message(13,"Error: Couldn't find the spell id for your pet!");
+ return;
+ }
+ }else{
+ c->Message(0,"You check your pocket, but find no minion!");
+ return;
+ }
+ }else{
+ spell_id=get_spellid_from_npctypeid(pet->GetNPCTypeID());
+ if(spell_id){
+ if(minion_count){
+ c->Message(13,"You try to force your pet in your pocket, but your other pet snaps at you.");
+ return;
+ }else{
+ add_suspendedminion(c->AccountID(),spell_id);
+ pet->Kill();
+ c->Message(0,"You open your pocket and your pet hops in.");
+ }
+ }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)
@@ -894,6 +894,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; }
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,10 @@
CastToClient()->GoToBind(4);
break;
}
+ case SE_SuspendMinion:
+ {
+ CastToClient()->SuspendMinion();
+ }
case SE_ImprovedDamage:
case SE_ImprovedHeal: