diff --git a/sql/characters.sql b/sql/characters.sql index fc717c1ef..0be0021a5 100644 --- a/sql/characters.sql +++ b/sql/characters.sql @@ -21,7 +21,7 @@ DROP TABLE IF EXISTS `character_db_version`; CREATE TABLE `character_db_version` ( - `required_7903_01_characters_character_pet` bit(1) default NULL + `required_7932_01_characters_character_pet` bit(1) default NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Last applied sql update to DB'; -- diff --git a/sql/updates/7932_01_characters_character_pet.sql b/sql/updates/7932_01_characters_character_pet.sql new file mode 100644 index 000000000..665f15bd5 --- /dev/null +++ b/sql/updates/7932_01_characters_character_pet.sql @@ -0,0 +1,9 @@ +ALTER TABLE character_db_version CHANGE COLUMN required_7903_01_characters_character_pet required_7932_01_characters_character_pet bit; + +UPDATE character_pet + SET abdata = CONCAT(REPLACE(TRIM(abdata),' ',' '),' '); + +UPDATE character_pet + SET abdata = SUBSTRING_INDEX(SUBSTRING_INDEX(abdata,' ',(10-3)*2),' ',-(10-3-3)*2) + WHERE length(SUBSTRING_INDEX(abdata, ' ', 20)) < length(abdata) and length(SUBSTRING_INDEX(abdata, ' ', 21)) >= length(abdata); + diff --git a/sql/updates/Makefile.am b/sql/updates/Makefile.am index acd664849..c075d94d2 100644 --- a/sql/updates/Makefile.am +++ b/sql/updates/Makefile.am @@ -208,6 +208,7 @@ pkgdata_DATA = \ 7908_01_mangos_creature_template.sql \ 7908_02_mangos_creature_addon.sql \ 7908_03_mangos_creature_template_addon.sql \ + 7932_01_characters_character_pet.sql \ README ## Additional files to include when running 'make dist' @@ -396,4 +397,5 @@ EXTRA_DIST = \ 7908_01_mangos_creature_template.sql \ 7908_02_mangos_creature_addon.sql \ 7908_03_mangos_creature_template_addon.sql \ + 7932_01_characters_character_pet.sql \ README diff --git a/src/game/Pet.cpp b/src/game/Pet.cpp index 1b1905110..a85f2d7ab 100644 --- a/src/game/Pet.cpp +++ b/src/game/Pet.cpp @@ -239,14 +239,9 @@ bool Pet::LoadPetFromDB( Player* owner, uint32 petentry, uint32 petnumber, bool CharacterDatabase.CommitTransaction(); } + // load action bar, if data broken will fill later by default spells. if (!is_temporary_summoned) - { - if(!m_charmInfo->LoadActionBar(fields[13].GetCppString())) - { - delete result; - return false; - } - } + m_charmInfo->LoadPetActionBar(fields[13].GetCppString()); // since last save (in seconds) uint32 timediff = (time(NULL) - fields[14].GetUInt32()); @@ -411,7 +406,8 @@ void Pet::SavePetToDB(PetSaveMode mode) << curmana << ", " << GetPower(POWER_HAPPINESS) << ", '"; - for(uint32 i = 0; i < MAX_UNIT_ACTION_BAR_INDEX; ++i) + // save only spell slots from action bar + for(uint32 i = ACTION_BAR_INDEX_PET_SPELL_START; i < ACTION_BAR_INDEX_PET_SPELL_END; ++i) { ss << uint32(m_charmInfo->GetActionBarEntry(i)->Type) << " " << uint32(m_charmInfo->GetActionBarEntry(i)->SpellOrAction) << " "; diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp index c8f19e0f8..e1a46f104 100644 --- a/src/game/Unit.cpp +++ b/src/game/Unit.cpp @@ -10319,21 +10319,22 @@ CharmInfo::CharmInfo(Unit* unit) void CharmInfo::InitPetActionBar() { // the first 3 SpellOrActions are attack, follow and stay - // last 3 SpellOrActions are reactions - for(uint32 i = 0; i < 3; ++i) - { - SetActionBar(i,COMMAND_ATTACK - i,ACT_COMMAND); - SetActionBar(i + 7,COMMAND_ATTACK - i,ACT_REACTION); - } + for(uint32 i = 0; i < ACTION_BAR_INDEX_PET_SPELL_START - ACTION_BAR_INDEX_START; ++i) + SetActionBar(ACTION_BAR_INDEX_START + i,COMMAND_ATTACK - i,ACT_COMMAND); + // middle 4 SpellOrActions are spells/special attacks/abilities - for(uint32 i = 0; i < 4; ++i) - SetActionBar(i + 3,0,ACT_DISABLED); + for(uint32 i = 0; i < ACTION_BAR_INDEX_PET_SPELL_END-ACTION_BAR_INDEX_PET_SPELL_START; ++i) + SetActionBar(ACTION_BAR_INDEX_PET_SPELL_START + i,0,ACT_DISABLED); + + // last 3 SpellOrActions are reactions + for(uint32 i = 0; i < ACTION_BAR_INDEX_END - ACTION_BAR_INDEX_PET_SPELL_END; ++i) + SetActionBar(ACTION_BAR_INDEX_PET_SPELL_END + i,COMMAND_ATTACK - i,ACT_REACTION); } void CharmInfo::InitEmptyActionBar() { - SetActionBar(0,COMMAND_ATTACK,ACT_COMMAND); - for(uint32 x = 1; x < MAX_UNIT_ACTION_BAR_INDEX; ++x) + SetActionBar(ACTION_BAR_INDEX_START,COMMAND_ATTACK,ACT_COMMAND); + for(uint32 x = ACTION_BAR_INDEX_START+1; x < ACTION_BAR_INDEX_END; ++x) SetActionBar(x,0,ACT_PASSIVE); } @@ -10470,16 +10471,18 @@ void CharmInfo::SetPetNumber(uint32 petnumber, bool statwindow) m_unit->SetUInt32Value(UNIT_FIELD_PETNUMBER, 0); } -bool CharmInfo::LoadActionBar( std::string data ) +void CharmInfo::LoadPetActionBar( std::string data ) { + InitPetActionBar(); + Tokens tokens = StrSplit(data, " "); - if (tokens.size() != MAX_UNIT_ACTION_BAR_INDEX*2) - return false; + if (tokens.size() != (ACTION_BAR_INDEX_PET_SPELL_END-ACTION_BAR_INDEX_PET_SPELL_START)*2) + return; // non critical, will reset to default int index; Tokens::iterator iter; - for(iter = tokens.begin(), index = 0; index < MAX_UNIT_ACTION_BAR_INDEX; ++iter, ++index ) + for(iter = tokens.begin(), index = ACTION_BAR_INDEX_PET_SPELL_START; index < ACTION_BAR_INDEX_PET_SPELL_END; ++iter, ++index ) { // use unsigned cast to avoid sign negative format use at long-> ActiveStates (int) conversion PetActionBar[index].Type = atol((*iter).c_str()); @@ -10490,7 +10493,6 @@ bool CharmInfo::LoadActionBar( std::string data ) if(PetActionBar[index].IsActionBarForSpell() && !sSpellStore.LookupEntry(PetActionBar[index].SpellOrAction)) SetActionBar(index,0,ACT_DISABLED); } - return true; } void CharmInfo::BuildActionBar( WorldPacket* data ) diff --git a/src/game/Unit.h b/src/game/Unit.h index e5946c6e8..d6dac29c9 100644 --- a/src/game/Unit.h +++ b/src/game/Unit.h @@ -791,7 +791,15 @@ struct CharmSpellEntry uint16 active; }; -#define MAX_UNIT_ACTION_BAR_INDEX 10 +enum ActionBarIndex +{ + ACTION_BAR_INDEX_START = 0, + ACTION_BAR_INDEX_PET_SPELL_START = 3, + ACTION_BAR_INDEX_PET_SPELL_END = 7, + ACTION_BAR_INDEX_END = 10, +}; + +#define MAX_UNIT_ACTION_BAR_INDEX (ACTION_BAR_INDEX_END-ACTION_BAR_INDEX_START) struct CharmInfo { @@ -815,7 +823,7 @@ struct CharmInfo //return true if successful bool AddSpellToActionBar(uint32 spellid, ActiveStates newstate = ACT_DECIDE); bool RemoveSpellFromActionBar(uint32 spell_id); - bool LoadActionBar(std::string data); + void LoadPetActionBar(std::string data); void BuildActionBar(WorldPacket* data); void SetSpellAutocast(uint32 spell_id, bool state); void SetActionBar(uint8 index, uint32 spellOrAction,ActiveStates type) diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 813844348..27eb3b050 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "7931" + #define REVISION_NR "7932" #endif // __REVISION_NR_H__