aboutsummaryrefslogtreecommitdiff
path: root/src/server/game
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2015-07-11 00:11:16 +0200
committerShauren <shauren.trinity@gmail.com>2015-07-11 00:11:16 +0200
commitda3247d5bbd30295b993d572a40ed022b5d267d9 (patch)
tree9b1fb00284a8ea7e02bfaaeca171f4ba8a029a4e /src/server/game
parentfacb038b949ef32033198dcba044d1606e0fdfcd (diff)
Core/Players: Fixed glyph slots
Diffstat (limited to 'src/server/game')
-rw-r--r--src/server/game/DataStores/DB2Stores.cpp33
-rw-r--r--src/server/game/DataStores/DB2Stores.h22
-rw-r--r--src/server/game/DataStores/DBCEnums.h7
-rw-r--r--src/server/game/Entities/Player/Player.cpp21
4 files changed, 51 insertions, 32 deletions
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<SpellPowerEntry const*> 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<HotfixNotify> HotfixData;
+#define DEFINE_DB2_SET_COMPARATOR(structure) \
+ struct structure ## Comparator : public std::binary_function<structure const*, structure const*, bool> \
+ { \
+ bool operator()(structure const* left, structure const* right) const; \
+ };
+
class DB2Manager
{
public:
- struct MountTypeXCapabilityComparator : public std::binary_function<MountTypeXCapabilityEntry const*, MountTypeXCapabilityEntry const*, bool>
- {
- 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<uint32 /*hash*/, DB2StorageBase*> StorageMap;
typedef std::unordered_map<uint32 /*areaGroupId*/, std::vector<uint32/*areaId*/>> AreaGroupMemberContainer;
typedef std::unordered_map<uint32, CharStartOutfitEntry const*> CharStartOutfitContainer;
+ typedef std::set<GlyphSlotEntry const*, GlyphSlotEntryComparator> GlyphSlotContainer;
typedef std::map<uint32 /*curveID*/, std::map<uint32/*index*/, CurvePointEntry const*, std::greater<uint32>>> HeirloomCurvesContainer;
typedef std::vector<ItemBonusEntry const*> ItemBonusList;
typedef std::unordered_map<uint32 /*bonusListId*/, ItemBonusList> ItemBonusListContainer;
@@ -136,7 +136,7 @@ public:
typedef std::unordered_map<uint32, std::set<ItemBonusTreeNodeEntry const*>> ItemBonusTreeContainer;
typedef std::unordered_map<uint32, std::vector<ItemSpecOverrideEntry const*>> ItemSpecOverridesContainer;
typedef std::unordered_map<uint32, MountEntry const*> MountContainer;
- typedef std::set<MountTypeXCapabilityEntry const*, MountTypeXCapabilityComparator> MountTypeXCapabilitySet;
+ typedef std::set<MountTypeXCapabilityEntry const*, MountTypeXCapabilityEntryComparator> MountTypeXCapabilitySet;
typedef std::unordered_map<uint32, MountTypeXCapabilitySet> MountCapabilitiesByTypeContainer;
typedef std::unordered_map<uint32, std::array<std::vector<NameGenEntry const*>, 2>> NameGenContainer;
typedef std::unordered_map<uint32, std::set<uint32>> 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<uint32> 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;