From da3247d5bbd30295b993d572a40ed022b5d267d9 Mon Sep 17 00:00:00 2001 From: Shauren Date: Sat, 11 Jul 2015 00:11:16 +0200 Subject: Core/Players: Fixed glyph slots --- src/server/game/DataStores/DB2Stores.cpp | 33 ++++++++++++++++------ src/server/game/DataStores/DB2Stores.h | 22 ++++++++------- src/server/game/DataStores/DBCEnums.h | 7 +++++ src/server/game/Entities/Player/Player.cpp | 21 ++++++-------- .../Database/Implementation/CharacterDatabase.cpp | 4 +-- 5 files changed, 53 insertions(+), 34 deletions(-) (limited to 'src') diff --git a/src/server/game/DataStores/DB2Stores.cpp b/src/server/game/DataStores/DB2Stores.cpp index 2bf33785137..a3eb7fed48a 100644 --- a/src/server/game/DataStores/DB2Stores.cpp +++ b/src/server/game/DataStores/DB2Stores.cpp @@ -291,19 +291,20 @@ void DB2Manager::LoadStores(std::string const& dataPath) for (uint32 j = 0; j < MAX_POWERS; ++j) _powersByClass[i][j] = MAX_POWERS; - for (uint32 i = 0; i < sChrClassesXPowerTypesStore.GetNumRows(); ++i) + for (ChrClassesXPowerTypesEntry const* power : sChrClassesXPowerTypesStore) { - if (ChrClassesXPowerTypesEntry const* power = sChrClassesXPowerTypesStore.LookupEntry(i)) - { - uint32 index = 0; - for (uint32 j = 0; j < MAX_POWERS; ++j) - if (_powersByClass[power->ClassID][j] != MAX_POWERS) - ++index; + uint32 index = 0; + for (uint32 j = 0; j < MAX_POWERS; ++j) + if (_powersByClass[power->ClassID][j] != MAX_POWERS) + ++index; - _powersByClass[power->ClassID][power->PowerType] = index; - } + _powersByClass[power->ClassID][power->PowerType] = index; } + for (GlyphSlotEntry const* glyphSlot : sGlyphSlotStore) + if (glyphSlot->Type == GLYPH_SLOT_MAJOR || glyphSlot->Type == GLYPH_SLOT_MINOR) + _glyphSlots.insert(glyphSlot); + for (ItemBonusEntry const* bonus : sItemBonusStore) _itemBonusLists[bonus->BonusListID].push_back(bonus); @@ -782,3 +783,17 @@ std::vector DB2Manager::GetSpellPowers(uint32 spellId, D return powers; } + +bool DB2Manager::GlyphSlotEntryComparator::operator()(GlyphSlotEntry const* left, GlyphSlotEntry const* right) const +{ + if (left->Tooltip != right->Tooltip) + return left->Tooltip < right->Tooltip; + return left->Type > right->Type; +} + +bool DB2Manager::MountTypeXCapabilityEntryComparator::operator()(MountTypeXCapabilityEntry const* left, MountTypeXCapabilityEntry const* right) const +{ + if (left->MountTypeID == right->MountTypeID) + return left->OrderIndex > right->OrderIndex; + return left->ID < right->ID; +} diff --git a/src/server/game/DataStores/DB2Stores.h b/src/server/game/DataStores/DB2Stores.h index 50583d487f1..32b6dc4e989 100644 --- a/src/server/game/DataStores/DB2Stores.h +++ b/src/server/game/DataStores/DB2Stores.h @@ -112,22 +112,22 @@ struct HotfixNotify typedef std::vector HotfixData; +#define DEFINE_DB2_SET_COMPARATOR(structure) \ + struct structure ## Comparator : public std::binary_function \ + { \ + bool operator()(structure const* left, structure const* right) const; \ + }; + class DB2Manager { public: - struct MountTypeXCapabilityComparator : public std::binary_function - { - bool operator()(MountTypeXCapabilityEntry const* left, MountTypeXCapabilityEntry const* right) const - { - if (left->MountTypeID == right->MountTypeID) - return left->OrderIndex > right->OrderIndex; - return left->ID < right->ID; - } - }; + DEFINE_DB2_SET_COMPARATOR(GlyphSlotEntry); + DEFINE_DB2_SET_COMPARATOR(MountTypeXCapabilityEntry); typedef std::map StorageMap; typedef std::unordered_map> AreaGroupMemberContainer; typedef std::unordered_map CharStartOutfitContainer; + typedef std::set GlyphSlotContainer; typedef std::map>> HeirloomCurvesContainer; typedef std::vector ItemBonusList; typedef std::unordered_map ItemBonusListContainer; @@ -136,7 +136,7 @@ public: typedef std::unordered_map> ItemBonusTreeContainer; typedef std::unordered_map> ItemSpecOverridesContainer; typedef std::unordered_map MountContainer; - typedef std::set MountTypeXCapabilitySet; + typedef std::set MountTypeXCapabilitySet; typedef std::unordered_map MountCapabilitiesByTypeContainer; typedef std::unordered_map, 2>> NameGenContainer; typedef std::unordered_map> PhaseGroupContainer; @@ -162,6 +162,7 @@ public: static char const* GetBroadcastTextValue(BroadcastTextEntry const* broadcastText, LocaleConstant locale = DEFAULT_LOCALE, uint8 gender = GENDER_MALE, bool forceGender = false); CharStartOutfitEntry const* GetCharStartOutfitEntry(uint8 race, uint8 class_, uint8 gender) const; uint32 GetPowerIndexByClass(uint32 powerType, uint32 classId) const; + GlyphSlotContainer const& GetGlyphSlots() const { return _glyphSlots; } uint32 GetHeirloomItemLevel(uint32 curveId, uint32 level) const; ItemBonusList GetItemBonusList(uint32 bonusListId) const; std::set GetItemBonusTree(uint32 itemId, uint32 itemBonusTreeMod) const; @@ -184,6 +185,7 @@ private: AreaGroupMemberContainer _areaGroupMembers; CharStartOutfitContainer _charStartOutfits; uint32 _powersByClass[MAX_CLASSES][MAX_POWERS]; + GlyphSlotContainer _glyphSlots; HeirloomCurvesContainer _heirloomCurvePoints; ItemBonusListContainer _itemBonusLists; ItemBonusTreeContainer _itemBonusTrees; diff --git a/src/server/game/DataStores/DBCEnums.h b/src/server/game/DataStores/DBCEnums.h index 719e539a9c4..d7125293671 100644 --- a/src/server/game/DataStores/DBCEnums.h +++ b/src/server/game/DataStores/DBCEnums.h @@ -494,6 +494,13 @@ enum AbilytyLearnType SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN = 2 // Spell will be learned/removed together with entire skill }; +enum GlyphSlotType +{ + GLYPH_SLOT_MAJOR = 0, + GLYPH_SLOT_MINOR = 1, + GLYPH_SLOT_PRIME = 2 +}; + enum ItemEnchantmentType { ITEM_ENCHANTMENT_TYPE_NONE = 0, diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index e1a71f5fbdf..35f0b92f3f1 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -24293,20 +24293,16 @@ uint32 Player::GetBarberShopCost(BarberShopStyleEntry const* newHairStyle, uint8 void Player::InitGlyphsForLevel() { - uint32 slot = 0; - for (uint32 i = 0; i < sGlyphSlotStore.GetNumRows() && slot < MAX_GLYPH_SLOT_INDEX; ++i) - if (GlyphSlotEntry const* gs = sGlyphSlotStore.LookupEntry(i)) - SetGlyphSlot(slot++, gs->ID); - - uint8 level = getLevel(); uint32 slotMask = 0; + uint8 slot = 0; + uint8 level = getLevel(); + for (GlyphSlotEntry const* gs : sDB2Manager.GetGlyphSlots()) + { + if (level >= ((gs->Tooltip + 1) * 25)) + slotMask |= 1 << slot; - if (level >= 25) - slotMask |= 0x01 | 0x02 | 0x40; - if (level >= 50) - slotMask |= 0x04 | 0x08 | 0x80; - if (level >= 75) - slotMask |= 0x10 | 0x20 | 0x100; + SetGlyphSlot(slot++, gs->ID); + } SetUInt32Value(PLAYER_GLYPHS_ENABLED, slotMask); } @@ -25420,7 +25416,6 @@ void Player::_SaveGlyphs(SQLTransaction& trans) stmt->setUInt64(0, GetGUID().GetCounter()); trans->Append(stmt); - for (uint8 group = 0; group < GetTalentGroupsCount(); ++group) { uint8 index = 0; diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.cpp b/src/server/shared/Database/Implementation/CharacterDatabase.cpp index 7ceb0931ecf..a9d0ca66407 100644 --- a/src/server/shared/Database/Implementation/CharacterDatabase.cpp +++ b/src/server/shared/Database/Implementation/CharacterDatabase.cpp @@ -127,7 +127,7 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_SEL_CHARACTER_EQUIPMENTSETS, "SELECT setguid, setindex, name, iconname, ignore_mask, item0, item1, item2, item3, item4, item5, item6, item7, item8, " "item9, item10, item11, item12, item13, item14, item15, item16, item17, item18 FROM character_equipmentsets WHERE guid = ? ORDER BY setindex", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_CHARACTER_BGDATA, "SELECT instanceId, team, joinX, joinY, joinZ, joinO, joinMapId, taxiStart, taxiEnd, mountSpell FROM character_battleground_data WHERE guid = ?", CONNECTION_ASYNC); - PrepareStatement(CHAR_SEL_CHARACTER_GLYPHS, "SELECT talentGroup, glyph1, glyph2, glyph3, glyph4, glyph5, glyph6, glyph7, glyph8, glyph9 FROM character_glyphs WHERE guid = ?", CONNECTION_ASYNC); + PrepareStatement(CHAR_SEL_CHARACTER_GLYPHS, "SELECT talentGroup, glyph1, glyph2, glyph3, glyph4, glyph5, glyph6 FROM character_glyphs WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_CHARACTER_TALENTS, "SELECT spell, talentGroup FROM character_talent WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_CHARACTER_SKILLS, "SELECT skill, value, max FROM character_skills WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_CHARACTER_RANDOMBG, "SELECT guid FROM character_battleground_random WHERE guid = ?", CONNECTION_ASYNC); @@ -578,7 +578,7 @@ void CharacterDatabaseConnection::DoPrepareStatements() "spellPower, resilience) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_PETITION_BY_OWNER, "DELETE FROM petition WHERE ownerguid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_PETITION_SIGNATURE_BY_OWNER, "DELETE FROM petition_sign WHERE ownerguid = ?", CONNECTION_ASYNC); - PrepareStatement(CHAR_INS_CHAR_GLYPHS, "INSERT INTO character_glyphs (guid, talentGroup, glyph1, glyph2, glyph3, glyph4, glyph5, glyph6, glyph7, glyph8, glyph9) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); + PrepareStatement(CHAR_INS_CHAR_GLYPHS, "INSERT INTO character_glyphs (guid, talentGroup, glyph1, glyph2, glyph3, glyph4, glyph5, glyph6) VALUES(?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_CHAR_TALENT_BY_SPELL_SPEC, "DELETE FROM character_talent WHERE guid = ? and spell = ? and talentGroup = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_INS_CHAR_TALENT, "INSERT INTO character_talent (guid, spell, talentGroup) VALUES (?, ?, ?)", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_CHAR_ACTION_EXCEPT_SPEC, "DELETE FROM character_action WHERE spec<>? AND guid = ?", CONNECTION_ASYNC); -- cgit v1.2.3