diff --git a/sql/characters.sql b/sql/characters.sql index 47cc93bd3..7b069280f 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_9349_01_characters_character_action` bit(1) default NULL + `required_9354_01_characters_character_action` bit(1) default NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Last applied sql update to DB'; -- @@ -341,7 +341,7 @@ CREATE TABLE `character_action` ( `button` tinyint(3) unsigned NOT NULL default '0', `action` int(11) unsigned NOT NULL default '0', `type` tinyint(3) unsigned NOT NULL default '0', - PRIMARY KEY (`guid`,`button`) + PRIMARY KEY (`guid`,`spec`,`button`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='Player System'; -- diff --git a/sql/updates/9354_01_characters_character_action.sql b/sql/updates/9354_01_characters_character_action.sql new file mode 100644 index 000000000..5a865b10d --- /dev/null +++ b/sql/updates/9354_01_characters_character_action.sql @@ -0,0 +1,3 @@ +ALTER TABLE character_db_version CHANGE COLUMN required_9349_01_characters_character_action required_9354_01_characters_character_action bit; + +ALTER TABLE `character_action` DROP PRIMARY KEY, ADD PRIMARY KEY(`guid`,`spec`,`button`); diff --git a/sql/updates/Makefile.am b/sql/updates/Makefile.am index dbd0bd662..63c604c00 100644 --- a/sql/updates/Makefile.am +++ b/sql/updates/Makefile.am @@ -64,6 +64,7 @@ pkgdata_DATA = \ 9331_01_mangos_quest_template.sql \ 9339_01_characters_group.sql \ 9349_01_characters_character_action.sql \ + 9354_01_characters_character_action.sql \ README ## Additional files to include when running 'make dist' @@ -108,4 +109,5 @@ EXTRA_DIST = \ 9331_01_mangos_quest_template.sql \ 9339_01_characters_group.sql \ 9349_01_characters_character_action.sql \ + 9354_01_characters_character_action.sql \ README diff --git a/src/game/Player.cpp b/src/game/Player.cpp index fff02339d..68f8b8eb5 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -5634,7 +5634,7 @@ void Player::SendInitialActionButtons() const sLog.outDetail( "Initializing Action Buttons for '%u'", GetGUIDLow() ); WorldPacket data(SMSG_ACTION_BUTTONS, 1+(MAX_ACTION_BUTTONS*4)); - data << uint8(0); // can be 0, 1, 2 (talent spec) + data << uint8(1); // can be 0, 1, 2 (talent spec) ActionButtonList const& currentActionButtonList = m_actionButtons[m_activeSpec]; for(int button = 0; button < MAX_ACTION_BUTTONS; ++button) { @@ -21315,12 +21315,34 @@ void Player::DeleteEquipmentSet(uint64 setGuid) } } -void Player::ActivateSpec(uint32 specNum) +void Player::ActivateSpec(uint8 specNum) { if(GetActiveSpec() == specNum) return; resetTalents(true); + + SetActiveSpec(specNum); + + SendInitialActionButtons(); + + InitTalentForLevel(); +} + +void Player::UpdateSpecCount(uint8 count) +{ + uint8 curCount = GetSpecsCount(); + if(curCount == count) + return; + + if(count > curCount) + { + //TODO: copy current action button set + } + + SetSpecsCount(count); + + SendTalentsInfoData(false); } void Player::RemoveAtLoginFlag( AtLoginFlags f, bool in_db_also /*= false*/ ) diff --git a/src/game/Player.h b/src/game/Player.h index dae87f44a..28ec7ab48 100644 --- a/src/game/Player.h +++ b/src/game/Player.h @@ -1532,11 +1532,12 @@ class MANGOS_DLL_SPEC Player : public Unit uint32 CalculateTalentsPoints() const; // Dual Spec - uint32 GetActiveSpec() { return m_activeSpec; } - void SetActiveSpec(uint32 spec) { m_activeSpec = spec; } - uint32 GetSpecsCount() { return m_specsCount; } - void SetSpecsCount(uint32 count) { m_specsCount = count; } - void ActivateSpec(uint32 specNum); + uint8 GetActiveSpec() { return m_activeSpec; } + void SetActiveSpec(uint8 spec) { m_activeSpec = spec; } + uint8 GetSpecsCount() { return m_specsCount; } + void SetSpecsCount(uint8 count) { m_specsCount = count; } + void ActivateSpec(uint8 specNum); + void UpdateSpecCount(uint8 count); void InitGlyphsForLevel(); void SetGlyphSlot(uint8 slot, uint32 slottype) { SetUInt32Value(PLAYER_FIELD_GLYPH_SLOTS_1 + slot, slottype); } @@ -2357,8 +2358,8 @@ class MANGOS_DLL_SPEC Player : public Unit SpellCooldowns m_spellCooldowns; uint32 m_lastPotionId; // last used health/mana potion in combat, that block next potion use - uint32 m_activeSpec; - uint32 m_specsCount; + uint8 m_activeSpec; + uint8 m_specsCount; ActionButtonList m_actionButtons[MAX_TALENT_SPEC_COUNT]; diff --git a/src/game/Spell.h b/src/game/Spell.h index ab0dbc036..6785e7dd0 100644 --- a/src/game/Spell.h +++ b/src/game/Spell.h @@ -328,6 +328,8 @@ class Spell void EffectTitanGrip(uint32 i); void EffectEnchantItemPrismatic(uint32 i); void EffectPlayMusic(uint32 i); + void EffectSpecCount(uint32 i); + void EffectActivateSpec(uint32 i); Spell( Unit* Caster, SpellEntry const *info, bool triggered, uint64 originalCasterGUID = 0, Spell** triggeringContainer = NULL ); ~Spell(); diff --git a/src/game/SpellEffects.cpp b/src/game/SpellEffects.cpp index 03ad14829..0cb2e6c0c 100644 --- a/src/game/SpellEffects.cpp +++ b/src/game/SpellEffects.cpp @@ -218,8 +218,8 @@ pEffect SpellEffects[TOTAL_SPELL_EFFECTS]= &Spell::EffectMilling, //158 SPELL_EFFECT_MILLING milling &Spell::EffectRenamePet, //159 SPELL_EFFECT_ALLOW_RENAME_PET allow rename pet once again &Spell::EffectNULL, //160 SPELL_EFFECT_160 unused - &Spell::EffectNULL, //161 SPELL_EFFECT_TALENT_SPEC_COUNT second talent spec (learn/revert) - &Spell::EffectNULL, //162 SPELL_EFFECT_TALENT_SPEC_SELECT activate primary/secondary spec + &Spell::EffectSpecCount, //161 SPELL_EFFECT_TALENT_SPEC_COUNT second talent spec (learn/revert) + &Spell::EffectActivateSpec, //162 SPELL_EFFECT_TALENT_SPEC_SELECT activate primary/secondary spec }; void Spell::EffectNULL(uint32 /*i*/) @@ -6996,3 +6996,20 @@ void Spell::EffectPlayMusic(uint32 i) data << uint32(soundid); ((Player*)unitTarget)->GetSession()->SendPacket(&data); } + +void Spell::EffectSpecCount(uint32 /*eff_idx*/) +{ + if(!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER) + return; + + ((Player*)unitTarget)->UpdateSpecCount(damage); +} + +void Spell::EffectActivateSpec(uint32 /*eff_idx*/) +{ + if(!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER) + return; + + // damage = spec + 1 + ((Player*)unitTarget)->ActivateSpec(damage-1); +} diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index a85d68c22..8b0c1b9a3 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 "9353" + #define REVISION_NR "9354" #endif // __REVISION_NR_H__ diff --git a/src/shared/revision_sql.h b/src/shared/revision_sql.h index c9af4d0bd..a18e3b044 100644 --- a/src/shared/revision_sql.h +++ b/src/shared/revision_sql.h @@ -1,6 +1,6 @@ #ifndef __REVISION_SQL_H__ #define __REVISION_SQL_H__ - #define REVISION_DB_CHARACTERS "required_9349_01_characters_character_action" + #define REVISION_DB_CHARACTERS "required_9354_01_characters_character_action" #define REVISION_DB_MANGOS "required_9331_01_mangos_quest_template" #define REVISION_DB_REALMD "required_9010_01_realmd_realmlist" #endif // __REVISION_SQL_H__