Add pet size preservation like live

Run the SQL!!
This commit is contained in:
Michael Cook (mackal) 2014-01-09 14:25:29 -05:00
parent a394bf25b2
commit fdced53be1
8 changed files with 27 additions and 15 deletions

View File

@ -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.

View File

@ -0,0 +1 @@
ALTER TABLE `character_pet_info` ADD `size` FLOAT NOT NULL DEFAULT '0';

View File

@ -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);

View File

@ -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);

View File

@ -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;

View File

@ -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());

View File

@ -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);
}

View File

@ -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];