From fdced53be1b911687233ab566e80290730c419c9 Mon Sep 17 00:00:00 2001 From: "Michael Cook (mackal)" Date: Thu, 9 Jan 2014 14:25:29 -0500 Subject: [PATCH] Add pet size preservation like live Run the SQL!! --- changelog.txt | 3 +++ .../required/2014_01_09_PreservePetSize.sql | 1 + zone/client.cpp | 4 +++- zone/client_packet.cpp | 2 +- zone/mob.h | 2 +- zone/pets.cpp | 6 ++++- zone/zonedb.cpp | 23 ++++++++++--------- zone/zonedb.h | 1 + 8 files changed, 27 insertions(+), 15 deletions(-) create mode 100644 utils/sql/git/required/2014_01_09_PreservePetSize.sql diff --git a/changelog.txt b/changelog.txt index 804beec1d..0be0e4687 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,5 +1,8 @@ EQEMu Changelog (Started on Sept 24, 2003 15:50) ------------------------------------------------------- +== 01/09/2014 == +demonstar55: Add pet size preservation like live (zone, camp, etc) + == 01/07/2014 == demonstar55: Moved pet can attack check to before it tries to attack, which is more live like. diff --git a/utils/sql/git/required/2014_01_09_PreservePetSize.sql b/utils/sql/git/required/2014_01_09_PreservePetSize.sql new file mode 100644 index 000000000..f056a0550 --- /dev/null +++ b/utils/sql/git/required/2014_01_09_PreservePetSize.sql @@ -0,0 +1 @@ +ALTER TABLE `character_pet_info` ADD `size` FLOAT NOT NULL DEFAULT '0'; diff --git a/zone/client.cpp b/zone/client.cpp index 6d9dd227a..c8ec493c8 100644 --- a/zone/client.cpp +++ b/zone/client.cpp @@ -581,6 +581,7 @@ bool Client::Save(uint8 iCommitNow) { m_petinfo.Mana = pet->GetMana(); pet->GetPetState(m_petinfo.Buffs, m_petinfo.Items, m_petinfo.Name); m_petinfo.petpower = pet->GetPetPower(); + m_petinfo.size = pet->GetSize(); } else { memset(&m_petinfo, 0, sizeof(struct PetInfo)); } @@ -5437,7 +5438,7 @@ void Client::SuspendMinion() if(m_suspendedminion.SpellID > 0) { MakePoweredPet(m_suspendedminion.SpellID, spells[m_suspendedminion.SpellID].teleport_zone, - m_suspendedminion.petpower, m_suspendedminion.Name); + m_suspendedminion.petpower, m_suspendedminion.Name, m_suspendedminion.size); CurrentPet = GetPet()->CastToNPC(); @@ -5497,6 +5498,7 @@ void Client::SuspendMinion() m_suspendedminion.Mana = CurrentPet->GetMana(); m_suspendedminion.petpower = CurrentPet->GetPetPower(); + m_suspendedminion.size = CurrentPet->GetSize(); if(AALevel >= 2) CurrentPet->GetPetState(m_suspendedminion.Buffs, m_suspendedminion.Items, m_suspendedminion.Name); diff --git a/zone/client_packet.cpp b/zone/client_packet.cpp index 2bbac403e..c929a08c8 100644 --- a/zone/client_packet.cpp +++ b/zone/client_packet.cpp @@ -9154,7 +9154,7 @@ bool Client::FinishConnState2(DBAsyncWork* dbaw) { //Remake pet if (m_petinfo.SpellID > 1 && !GetPet() && m_petinfo.SpellID <= SPDAT_RECORDS) { - MakePoweredPet(m_petinfo.SpellID, spells[m_petinfo.SpellID].teleport_zone, m_petinfo.petpower, m_petinfo.Name); + MakePoweredPet(m_petinfo.SpellID, spells[m_petinfo.SpellID].teleport_zone, m_petinfo.petpower, m_petinfo.Name, m_petinfo.size); if (GetPet() && GetPet()->IsNPC()) { NPC *pet = GetPet()->CastToNPC(); pet->SetPetState(m_petinfo.Buffs, m_petinfo.Items); diff --git a/zone/mob.h b/zone/mob.h index d7b61ca11..f6010a3d3 100644 --- a/zone/mob.h +++ b/zone/mob.h @@ -454,7 +454,7 @@ public: static uint8 GetDefaultGender(uint16 in_race, uint8 in_gender = 0xFF); uint16 GetSkillByItemType(int ItemType); virtual void MakePet(uint16 spell_id, const char* pettype, const char *petname = nullptr); - virtual void MakePoweredPet(uint16 spell_id, const char* pettype, int16 petpower, const char *petname = nullptr); + virtual void MakePoweredPet(uint16 spell_id, const char* pettype, int16 petpower, const char *petname = nullptr, float in_size = 0.0f); bool IsWarriorClass() const; char GetCasterClass() const; uint8 GetArchetype() const; diff --git a/zone/pets.cpp b/zone/pets.cpp index 446da3733..7254f2690 100644 --- a/zone/pets.cpp +++ b/zone/pets.cpp @@ -225,7 +225,8 @@ void Mob::MakePet(uint16 spell_id, const char* pettype, const char *petname) { // making it possible for petpower to be retained without the focus item having to // stay equipped when the character zones. petpower of -1 means that the currently equipped petfocus // of a client is searched for and used instead. -void Mob::MakePoweredPet(uint16 spell_id, const char* pettype, int16 petpower, const char *petname) { +void Mob::MakePoweredPet(uint16 spell_id, const char* pettype, int16 petpower, + const char *petname, float in_size) { // Sanity and early out checking first. if(HasPet() || pettype == nullptr) return; @@ -422,6 +423,9 @@ void Mob::MakePoweredPet(uint16 spell_id, const char* pettype, int16 petpower, c } } + // finally, override size if one was provided + if (in_size > 0.0f) + npc->size = in_size; entity_list.AddNPC(npc, true, true); SetPetID(npc->GetID()); diff --git a/zone/zonedb.cpp b/zone/zonedb.cpp index e1e5194df..0cf9d0da0 100644 --- a/zone/zonedb.cpp +++ b/zone/zonedb.cpp @@ -2745,11 +2745,11 @@ void ZoneDatabase::SavePetInfo(Client *c) { safe_delete_array(query); if(!database.RunQuery(query, MakeAnyLenString(&query, - "INSERT INTO `character_pet_info` (`char_id`, `pet`, `petname`, `petpower`, `spell_id`, `hp`, `mana`) " - "values (%u, 0, '%s', %i, %u, %u, %u) " - "ON DUPLICATE KEY UPDATE `petname`='%s', `petpower`=%i, `spell_id`=%u, `hp`=%u, `mana`=%u", - c->CharacterID(), petinfo->Name, petinfo->petpower, petinfo->SpellID, petinfo->HP, petinfo->Mana, - petinfo->Name, petinfo->petpower, petinfo->SpellID, petinfo->HP, petinfo->Mana), + "INSERT INTO `character_pet_info` (`char_id`, `pet`, `petname`, `petpower`, `spell_id`, `hp`, `mana`, `size`) " + "values (%u, 0, '%s', %i, %u, %u, %u, %f) " + "ON DUPLICATE KEY UPDATE `petname`='%s', `petpower`=%i, `spell_id`=%u, `hp`=%u, `mana`=%u, `size`=%f", + c->CharacterID(), petinfo->Name, petinfo->petpower, petinfo->SpellID, petinfo->HP, petinfo->Mana, petinfo->size, + petinfo->Name, petinfo->petpower, petinfo->SpellID, petinfo->HP, petinfo->Mana, petinfo->size), errbuf)) { safe_delete_array(query); @@ -2792,11 +2792,11 @@ void ZoneDatabase::SavePetInfo(Client *c) { if(!database.RunQuery(query, MakeAnyLenString(&query, - "INSERT INTO `character_pet_info` (`char_id`, `pet`, `petname`, `petpower`, `spell_id`, `hp`, `mana`) " - "values (%u, 1, '%s', %u, %u, %u, %u) " - "ON DUPLICATE KEY UPDATE `petname`='%s', `petpower`=%i, `spell_id`=%u, `hp`=%u, `mana`=%u", - c->CharacterID(), suspended->Name, suspended->petpower, suspended->SpellID, suspended->HP, suspended->Mana, - suspended->Name, suspended->petpower, suspended->SpellID, suspended->HP, suspended->Mana), + "INSERT INTO `character_pet_info` (`char_id`, `pet`, `petname`, `petpower`, `spell_id`, `hp`, `mana`, `size`) " + "values (%u, 1, '%s', %u, %u, %u, %u, %f) " + "ON DUPLICATE KEY UPDATE `petname`='%s', `petpower`=%i, `spell_id`=%u, `hp`=%u, `mana`=%u, `size`=%f", + c->CharacterID(), suspended->Name, suspended->petpower, suspended->SpellID, suspended->HP, suspended->Mana, suspended->size, + suspended->Name, suspended->petpower, suspended->SpellID, suspended->HP, suspended->Mana, suspended->size), errbuf)) { safe_delete_array(query); @@ -2842,7 +2842,7 @@ void ZoneDatabase::LoadPetInfo(Client *c) { memset(suspended, 0, sizeof(PetInfo)); if(database.RunQuery(query, MakeAnyLenString(&query, - "SELECT `pet`, `petname`, `petpower`, `spell_id`, `hp`, `mana` from `character_pet_info` where `char_id`=%u", + "SELECT `pet`, `petname`, `petpower`, `spell_id`, `hp`, `mana`, `size` from `character_pet_info` where `char_id`=%u", c->CharacterID()), errbuf, &result)) { safe_delete_array(query); @@ -2860,6 +2860,7 @@ void ZoneDatabase::LoadPetInfo(Client *c) { pi->SpellID = atoi(row[3]); pi->HP = atoul(row[4]); pi->Mana = atoul(row[5]); + pi->size = atof(row[6]); } mysql_free_result(result); } diff --git a/zone/zonedb.h b/zone/zonedb.h index 78ef3c831..52700daa2 100644 --- a/zone/zonedb.h +++ b/zone/zonedb.h @@ -71,6 +71,7 @@ struct PetInfo { int16 petpower; uint32 HP; uint32 Mana; + float size; SpellBuff_Struct Buffs[BUFF_COUNT]; uint32 Items[MAX_WORN_INVENTORY]; char Name[64];