diff options
author | Shauren <shauren.trinity@gmail.com> | 2019-10-26 23:58:29 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2019-10-27 00:12:45 +0200 |
commit | 3ac790287aba5f7d7c3bccf79e608de9119e461a (patch) | |
tree | 430abdcd4e7e17288c9edaf71980863e77518de9 /src | |
parent | ee2e49429f4383732b4e0f39b493470b9c1dd10c (diff) |
Core/DataStores: Updated db2 structures to 8.2.5
Diffstat (limited to 'src')
47 files changed, 445 insertions, 465 deletions
diff --git a/src/common/DataStores/DB2FileLoader.cpp b/src/common/DataStores/DB2FileLoader.cpp index a6eb2c7fe87..f5029136c21 100644 --- a/src/common/DataStores/DB2FileLoader.cpp +++ b/src/common/DataStores/DB2FileLoader.cpp @@ -678,25 +678,28 @@ void DB2FileLoaderRegularImpl::FillParentLookup(char* dataTable) for (uint32 i = 0; i < _header->SectionCount; ++i) { DB2SectionHeader const& section = GetSection(i); - for (std::size_t j = 0; j < _parentIndexes[i][0].Entries.size(); ++j) + if (!section.TactId) { - uint32 parentId = _parentIndexes[i][0].Entries[j].ParentId; - char* recordData = &dataTable[(_parentIndexes[i][0].Entries[j].RecordIndex + recordIndexOffset) * recordSize]; - - switch (_loadInfo->Meta->Fields[_loadInfo->Meta->ParentIndexField].Type) + for (std::size_t j = 0; j < _parentIndexes[i][0].Entries.size(); ++j) { - case FT_SHORT: - *reinterpret_cast<uint16*>(&recordData[parentIdOffset]) = uint16(parentId); - break; - case FT_BYTE: - *reinterpret_cast<uint8*>(&recordData[parentIdOffset]) = uint8(parentId); - break; - case FT_INT: - *reinterpret_cast<uint32*>(&recordData[parentIdOffset]) = parentId; - break; - default: - ASSERT(false, "Unhandled parent id type '%c' found in %s", _loadInfo->Meta->Fields[_loadInfo->Meta->ParentIndexField].Type, _fileName); - break; + uint32 parentId = _parentIndexes[i][0].Entries[j].ParentId; + char* recordData = &dataTable[(_parentIndexes[i][0].Entries[j].RecordIndex + recordIndexOffset) * recordSize]; + + switch (_loadInfo->Meta->Fields[_loadInfo->Meta->ParentIndexField].Type) + { + case FT_SHORT: + *reinterpret_cast<uint16*>(&recordData[parentIdOffset]) = uint16(parentId); + break; + case FT_BYTE: + *reinterpret_cast<uint8*>(&recordData[parentIdOffset]) = uint8(parentId); + break; + case FT_INT: + *reinterpret_cast<uint32*>(&recordData[parentIdOffset]) = parentId; + break; + default: + ASSERT(false, "Unhandled parent id type '%c' found in %s", _loadInfo->Meta->Fields[_loadInfo->Meta->ParentIndexField].Type, _fileName); + break; + } } } recordIndexOffset += section.RecordCount; @@ -1383,25 +1386,28 @@ void DB2FileLoaderSparseImpl::FillParentLookup(char* dataTable) for (uint32 i = 0; i < _header->SectionCount; ++i) { DB2SectionHeader const& section = GetSection(i); - for (std::size_t j = 0; j < _parentIndexes[i][0].Entries.size(); ++j) + if (!section.TactId) { - uint32 parentId = _parentIndexes[i][0].Entries[j].ParentId; - char* recordData = &dataTable[(_parentIndexes[i][0].Entries[j].RecordIndex + recordIndexOffset) * recordSize]; - - switch (_loadInfo->Meta->Fields[_loadInfo->Meta->ParentIndexField].Type) + for (std::size_t j = 0; j < _parentIndexes[i][0].Entries.size(); ++j) { - case FT_SHORT: - *reinterpret_cast<uint16*>(&recordData[parentIdOffset]) = uint16(parentId); - break; - case FT_BYTE: - *reinterpret_cast<uint8*>(&recordData[parentIdOffset]) = uint8(parentId); - break; - case FT_INT: - *reinterpret_cast<uint32*>(&recordData[parentIdOffset]) = parentId; - break; - default: - ASSERT(false, "Unhandled parent id type '%c' found in %s", _loadInfo->Meta->Fields[_loadInfo->Meta->ParentIndexField].Type, _fileName); - break; + uint32 parentId = _parentIndexes[i][0].Entries[j].ParentId; + char* recordData = &dataTable[(_parentIndexes[i][0].Entries[j].RecordIndex + recordIndexOffset) * recordSize]; + + switch (_loadInfo->Meta->Fields[_loadInfo->Meta->ParentIndexField].Type) + { + case FT_SHORT: + *reinterpret_cast<uint16*>(&recordData[parentIdOffset]) = uint16(parentId); + break; + case FT_BYTE: + *reinterpret_cast<uint8*>(&recordData[parentIdOffset]) = uint8(parentId); + break; + case FT_INT: + *reinterpret_cast<uint32*>(&recordData[parentIdOffset]) = parentId; + break; + default: + ASSERT(false, "Unhandled parent id type '%c' found in %s", _loadInfo->Meta->Fields[_loadInfo->Meta->ParentIndexField].Type, _fileName); + break; + } } } recordIndexOffset += section.RecordCount; @@ -1873,6 +1879,13 @@ bool DB2FileLoader::Load(DB2FileSource* source, DB2FileLoadInfo const* loadInfo) if (loadInfo && !loadInfo->Meta->HasIndexFieldInData() && _header.RecordCount) idTable.reserve(_header.RecordCount); + if (_header.ParentLookupCount) + { + parentIndexes.resize(_header.SectionCount); + for (std::vector<DB2IndexData>& parentIndexesForSection : parentIndexes) + parentIndexesForSection.resize(_header.ParentLookupCount); + } + for (uint32 i = 0; i < _header.SectionCount; ++i) { DB2SectionHeader const& section = _impl->GetSection(i); @@ -1917,9 +1930,7 @@ bool DB2FileLoader::Load(DB2FileSource* source, DB2FileLoadInfo const* loadInfo) if (_header.ParentLookupCount) { - parentIndexes.emplace_back(); - std::vector<DB2IndexData>& parentIndexesForSection = parentIndexes.back(); - parentIndexesForSection.resize(_header.ParentLookupCount); + std::vector<DB2IndexData>& parentIndexesForSection = parentIndexes[i]; for (uint32 j = 0; j < _header.ParentLookupCount; ++j) { DB2IndexDataInfo indexInfo; diff --git a/src/server/database/Database/Implementation/CharacterDatabase.cpp b/src/server/database/Database/Implementation/CharacterDatabase.cpp index b05af92a05e..fc2d7a36527 100644 --- a/src/server/database/Database/Implementation/CharacterDatabase.cpp +++ b/src/server/database/Database/Implementation/CharacterDatabase.cpp @@ -24,7 +24,7 @@ void CharacterDatabaseConnection::DoPrepareStatements() m_stmts.resize(MAX_CHARACTERDATABASE_STATEMENTS); #define SelectItemInstanceContent "ii.guid, ii.itemEntry, ii.creatorGuid, ii.giftCreatorGuid, ii.count, ii.duration, ii.charges, ii.flags, ii.enchantments, ii.randomBonusListId, " \ - "ii.durability, ii.playedTime, ii.text, ii.upgradeId, ii.battlePetSpeciesId, ii.battlePetBreedData, ii.battlePetLevel, ii.battlePetDisplayId, ii.context, ii.bonusListIDs, " \ + "ii.durability, ii.playedTime, ii.text, ii.battlePetSpeciesId, ii.battlePetBreedData, ii.battlePetLevel, ii.battlePetDisplayId, ii.context, ii.bonusListIDs, " \ "iit.itemModifiedAppearanceAllSpecs, iit.itemModifiedAppearanceSpec1, iit.itemModifiedAppearanceSpec2, iit.itemModifiedAppearanceSpec3, iit.itemModifiedAppearanceSpec4, " \ "iit.spellItemEnchantmentAllSpecs, iit.spellItemEnchantmentSpec1, iit.spellItemEnchantmentSpec2, iit.spellItemEnchantmentSpec3, iit.spellItemEnchantmentSpec4, " \ "ig.gemItemId1, ig.gemBonuses1, ig.gemContext1, ig.gemScalingLevel1, ig.gemItemId2, ig.gemBonuses2, ig.gemContext2, ig.gemScalingLevel2, ig.gemItemId3, ig.gemBonuses3, ig.gemContext3, ig.gemScalingLevel3, " \ @@ -167,9 +167,9 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_DEL_ITEM_BOP_TRADE, "DELETE FROM item_soulbound_trade_data WHERE itemGuid = ? LIMIT 1", CONNECTION_ASYNC); PrepareStatement(CHAR_INS_ITEM_BOP_TRADE, "INSERT INTO item_soulbound_trade_data VALUES (?, ?)", CONNECTION_ASYNC); PrepareStatement(CHAR_REP_INVENTORY_ITEM, "REPLACE INTO character_inventory (guid, bag, slot, item) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC); - PrepareStatement(CHAR_REP_ITEM_INSTANCE, "REPLACE INTO item_instance (itemEntry, owner_guid, creatorGuid, giftCreatorGuid, count, duration, charges, flags, enchantments, randomBonusListId, durability, playedTime, text, upgradeId, battlePetSpeciesId, battlePetBreedData, battlePetLevel, battlePetDisplayId, context, bonusListIDs, guid) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); - PrepareStatement(CHAR_UPD_ITEM_INSTANCE, "UPDATE item_instance SET itemEntry = ?, owner_guid = ?, creatorGuid = ?, giftCreatorGuid = ?, count = ?, duration = ?, charges = ?, flags = ?, enchantments = ?, randomBonusListId = ?, durability = ?, playedTime = ?, text = ?, upgradeId = ?, battlePetSpeciesId = ?, battlePetBreedData = ?, battlePetLevel = ?, battlePetDisplayId = ?, context = ?, bonusListIDs = ? WHERE guid = ?", CONNECTION_ASYNC); - PrepareStatement(CHAR_UPD_ITEM_INSTANCE_ON_LOAD, "UPDATE item_instance SET duration = ?, flags = ?, durability = ?, upgradeId = ? WHERE guid = ?", CONNECTION_ASYNC); + PrepareStatement(CHAR_REP_ITEM_INSTANCE, "REPLACE INTO item_instance (itemEntry, owner_guid, creatorGuid, giftCreatorGuid, count, duration, charges, flags, enchantments, randomBonusListId, durability, playedTime, text, battlePetSpeciesId, battlePetBreedData, battlePetLevel, battlePetDisplayId, context, bonusListIDs, guid) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); + PrepareStatement(CHAR_UPD_ITEM_INSTANCE, "UPDATE item_instance SET itemEntry = ?, owner_guid = ?, creatorGuid = ?, giftCreatorGuid = ?, count = ?, duration = ?, charges = ?, flags = ?, enchantments = ?, randomBonusListId = ?, durability = ?, playedTime = ?, text = ?, battlePetSpeciesId = ?, battlePetBreedData = ?, battlePetLevel = ?, battlePetDisplayId = ?, context = ?, bonusListIDs = ? WHERE guid = ?", CONNECTION_ASYNC); + PrepareStatement(CHAR_UPD_ITEM_INSTANCE_ON_LOAD, "UPDATE item_instance SET duration = ?, flags = ?, durability = ? WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_ITEM_INSTANCE, "DELETE FROM item_instance WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_ITEM_INSTANCE_BY_OWNER, "DELETE FROM item_instance WHERE owner_guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_INS_ITEM_INSTANCE_GEMS, "INSERT INTO item_instance_gems (itemGuid, gemItemId1, gemBonuses1, gemContext1, gemScalingLevel1, gemItemId2, gemBonuses2, gemContext2, gemScalingLevel2, gemItemId3, gemBonuses3, gemContext3, gemScalingLevel3) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); @@ -625,8 +625,8 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_DEL_CHAR_FISHINGSTEPS, "DELETE FROM character_fishingsteps WHERE guid = ?", CONNECTION_ASYNC); // Void Storage - PrepareStatement(CHAR_SEL_CHAR_VOID_STORAGE, "SELECT itemId, itemEntry, slot, creatorGuid, randomBonusListId, upgradeId, fixedScalingLevel, artifactKnowledgeLevel, context, bonusListIDs FROM character_void_storage WHERE playerGuid = ?", CONNECTION_ASYNC); - PrepareStatement(CHAR_REP_CHAR_VOID_STORAGE_ITEM, "REPLACE INTO character_void_storage (itemId, playerGuid, itemEntry, slot, creatorGuid, randomBonusListId, upgradeId, fixedScalingLevel, artifactKnowledgeLevel, context, bonusListIDs) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); + PrepareStatement(CHAR_SEL_CHAR_VOID_STORAGE, "SELECT itemId, itemEntry, slot, creatorGuid, randomBonusListId, fixedScalingLevel, artifactKnowledgeLevel, context, bonusListIDs FROM character_void_storage WHERE playerGuid = ?", CONNECTION_ASYNC); + PrepareStatement(CHAR_REP_CHAR_VOID_STORAGE_ITEM, "REPLACE INTO character_void_storage (itemId, playerGuid, itemEntry, slot, creatorGuid, randomBonusListId, fixedScalingLevel, artifactKnowledgeLevel, context, bonusListIDs) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_CHAR_VOID_STORAGE_ITEM_BY_CHAR_GUID, "DELETE FROM character_void_storage WHERE playerGuid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_CHAR_VOID_STORAGE_ITEM_BY_SLOT, "DELETE FROM character_void_storage WHERE slot = ? AND playerGuid = ?", CONNECTION_ASYNC); diff --git a/src/server/database/Database/Implementation/HotfixDatabase.cpp b/src/server/database/Database/Implementation/HotfixDatabase.cpp index d089893b8b1..81bb576e490 100644 --- a/src/server/database/Database/Implementation/HotfixDatabase.cpp +++ b/src/server/database/Database/Implementation/HotfixDatabase.cpp @@ -457,8 +457,8 @@ void HotfixDatabaseConnection::DoPrepareStatements() "ItemGroupSoundsID FROM item ORDER BY ID DESC", CONNECTION_SYNCH); // ItemAppearance.db2 - PrepareStatement(HOTFIX_SEL_ITEM_APPEARANCE, "SELECT ID, DisplayType, ItemDisplayInfoID, DefaultIconFileDataID, UiOrder FROM item_appearance" - " ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_ITEM_APPEARANCE, "SELECT ID, DisplayType, SubclassID, ItemDisplayInfoID, DefaultIconFileDataID, UiOrder" + " FROM item_appearance ORDER BY ID DESC", CONNECTION_SYNCH); // ItemArmorQuality.db2 PrepareStatement(HOTFIX_SEL_ITEM_ARMOR_QUALITY, "SELECT ID, Qualitymod1, Qualitymod2, Qualitymod3, Qualitymod4, Qualitymod5, Qualitymod6, " @@ -580,9 +580,9 @@ void HotfixDatabaseConnection::DoPrepareStatements() "StatPercentEditor5, StatPercentEditor6, StatPercentEditor7, StatPercentEditor8, StatPercentEditor9, StatPercentEditor10, Stackable, " "MaxCount, RequiredAbility, SellPrice, BuyPrice, VendorStackCount, PriceVariance, PriceRandomValue, Flags1, Flags2, Flags3, Flags4, " "FactionRelated, ItemNameDescriptionID, RequiredTransmogHoliday, RequiredHoliday, LimitCategory, GemProperties, SocketMatchEnchantmentId, " - "TotemCategoryID, InstanceBound, ZoneBound, ItemSet, LockID, StartQuestID, PageID, ItemDelay, ScalingStatDistributionID, MinFactionID, " - "RequiredSkillRank, RequiredSkill, ItemLevel, AllowableClass, ExpansionID, ArtifactID, SpellWeight, SpellWeightCategory, SocketType1, " - "SocketType2, SocketType3, SheatheType, Material, PageMaterialID, LanguageID, Bonding, DamageDamageType, StatModifierBonusStat1, " + "TotemCategoryID, InstanceBound, ZoneBound1, ZoneBound2, ItemSet, LockID, StartQuestID, PageID, ItemDelay, ScalingStatDistributionID, " + "MinFactionID, RequiredSkillRank, RequiredSkill, ItemLevel, AllowableClass, ExpansionID, ArtifactID, SpellWeight, SpellWeightCategory, " + "SocketType1, SocketType2, SocketType3, SheatheType, Material, PageMaterialID, LanguageID, Bonding, DamageDamageType, StatModifierBonusStat1, " "StatModifierBonusStat2, StatModifierBonusStat3, StatModifierBonusStat4, StatModifierBonusStat5, StatModifierBonusStat6, " "StatModifierBonusStat7, StatModifierBonusStat8, StatModifierBonusStat9, StatModifierBonusStat10, ContainerSlots, MinReputation, " "RequiredPVPMedal, RequiredPVPRank, RequiredLevel, InventoryType, OverallQualityID FROM item_sparse ORDER BY ID DESC", CONNECTION_SYNCH); @@ -596,10 +596,6 @@ void HotfixDatabaseConnection::DoPrepareStatements() // ItemSpecOverride.db2 PrepareStatement(HOTFIX_SEL_ITEM_SPEC_OVERRIDE, "SELECT ID, SpecID, ItemID FROM item_spec_override ORDER BY ID DESC", CONNECTION_SYNCH); - // ItemUpgrade.db2 - PrepareStatement(HOTFIX_SEL_ITEM_UPGRADE, "SELECT ID, ItemUpgradePathID, ItemLevelIncrement, PrerequisiteID, CurrencyType, CurrencyAmount" - " FROM item_upgrade ORDER BY ID DESC", CONNECTION_SYNCH); - // ItemXBonusTree.db2 PrepareStatement(HOTFIX_SEL_ITEM_X_BONUS_TREE, "SELECT ID, ItemBonusTreeID, ItemID FROM item_x_bonus_tree ORDER BY ID DESC", CONNECTION_SYNCH); @@ -722,7 +718,7 @@ void HotfixDatabaseConnection::DoPrepareStatements() PrepareStatement(HOTFIX_SEL_POWER_DISPLAY, "SELECT ID, GlobalStringBaseTag, ActualType, Red, Green, Blue FROM power_display ORDER BY ID DESC", CONNECTION_SYNCH); // PowerType.db2 - PrepareStatement(HOTFIX_SEL_POWER_TYPE, "SELECT ID, NameGlobalStringTag, CostGlobalStringTag, PowerTypeEnum, MinPower, MaxBasePower, CenterPower, " + PrepareStatement(HOTFIX_SEL_POWER_TYPE, "SELECT NameGlobalStringTag, CostGlobalStringTag, ID, PowerTypeEnum, MinPower, MaxBasePower, CenterPower, " "DefaultPower, DisplayModifier, RegenInterruptTimeMS, RegenPeace, RegenCombat, Flags FROM power_type ORDER BY ID DESC", CONNECTION_SYNCH); // PrestigeLevelInfo.db2 @@ -785,9 +781,6 @@ void HotfixDatabaseConnection::DoPrepareStatements() // RewardPackXItem.db2 PrepareStatement(HOTFIX_SEL_REWARD_PACK_X_ITEM, "SELECT ID, ItemID, ItemQuantity, RewardPackID FROM reward_pack_x_item ORDER BY ID DESC", CONNECTION_SYNCH); - // RulesetItemUpgrade.db2 - PrepareStatement(HOTFIX_SEL_RULESET_ITEM_UPGRADE, "SELECT ID, ItemID, ItemUpgradeID FROM ruleset_item_upgrade ORDER BY ID DESC", CONNECTION_SYNCH); - // ScalingStatDistribution.db2 PrepareStatement(HOTFIX_SEL_SCALING_STAT_DISTRIBUTION, "SELECT ID, PlayerLevelToItemLevelCurveID, MinLevel, MaxLevel" " FROM scaling_stat_distribution ORDER BY ID DESC", CONNECTION_SYNCH); @@ -875,7 +868,7 @@ void HotfixDatabaseConnection::DoPrepareStatements() PrepareStatement(HOTFIX_SEL_SPELL_DURATION, "SELECT ID, Duration, DurationPerLevel, MaxDuration FROM spell_duration ORDER BY ID DESC", CONNECTION_SYNCH); // SpellEffect.db2 - PrepareStatement(HOTFIX_SEL_SPELL_EFFECT, "SELECT ID, DifficultyID, EffectIndex, Effect, EffectAmplitude, EffectAttributes, EffectAura, " + PrepareStatement(HOTFIX_SEL_SPELL_EFFECT, "SELECT ID, EffectAura, DifficultyID, EffectIndex, Effect, EffectAmplitude, EffectAttributes, " "EffectAuraPeriod, EffectBonusCoefficient, EffectChainAmplitude, EffectChainTargets, EffectItemType, EffectMechanic, EffectPointsPerResource, " "EffectPosFacing, EffectRealPointsPerLevel, EffectTriggerSpell, BonusCoefficientFromAP, PvpMultiplier, Coefficient, Variance, " "ResourceCoefficient, GroupSizeBasePointsCoefficient, EffectBasePoints, EffectMiscValue1, EffectMiscValue2, EffectRadiusIndex1, " @@ -915,9 +908,9 @@ void HotfixDatabaseConnection::DoPrepareStatements() " FROM spell_levels ORDER BY ID DESC", CONNECTION_SYNCH); // SpellMisc.db2 - PrepareStatement(HOTFIX_SEL_SPELL_MISC, "SELECT ID, DifficultyID, CastingTimeIndex, DurationIndex, RangeIndex, SchoolMask, Speed, LaunchDelay, " - "MinDuration, SpellIconFileDataID, ActiveIconFileDataID, ContentTuningID, Attributes1, Attributes2, Attributes3, Attributes4, Attributes5, " - "Attributes6, Attributes7, Attributes8, Attributes9, Attributes10, Attributes11, Attributes12, Attributes13, Attributes14, SpellID" + PrepareStatement(HOTFIX_SEL_SPELL_MISC, "SELECT Attributes1, Attributes2, Attributes3, Attributes4, Attributes5, Attributes6, Attributes7, " + "Attributes8, Attributes9, Attributes10, Attributes11, Attributes12, Attributes13, Attributes14, ID, DifficultyID, CastingTimeIndex, " + "DurationIndex, RangeIndex, SchoolMask, Speed, LaunchDelay, MinDuration, SpellIconFileDataID, ActiveIconFileDataID, ContentTuningID, SpellID" " FROM spell_misc ORDER BY ID DESC", CONNECTION_SYNCH); // SpellName.db2 @@ -1020,7 +1013,7 @@ void HotfixDatabaseConnection::DoPrepareStatements() // TransmogSet.db2 PrepareStatement(HOTFIX_SEL_TRANSMOG_SET, "SELECT Name, ID, ClassMask, TrackingQuestID, Flags, TransmogSetGroupID, ItemNameDescriptionID, " - "ParentTransmogSetID, Unknown810, ExpansionID, PatchID, UiOrder FROM transmog_set ORDER BY ID DESC", CONNECTION_SYNCH); + "ParentTransmogSetID, Unknown810, ExpansionID, PatchID, UiOrder, PlayerConditionID FROM transmog_set ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_TRANSMOG_SET, "SELECT ID, Name_lang FROM transmog_set_locale WHERE locale = ?", CONNECTION_SYNCH); // TransmogSetGroup.db2 @@ -1091,10 +1084,6 @@ void HotfixDatabaseConnection::DoPrepareStatements() PrepareStatement(HOTFIX_SEL_WORLD_MAP_OVERLAY, "SELECT ID, UiMapArtID, TextureWidth, TextureHeight, OffsetX, OffsetY, HitRectTop, HitRectBottom, " "HitRectLeft, HitRectRight, PlayerConditionID, Flags, AreaID1, AreaID2, AreaID3, AreaID4 FROM world_map_overlay ORDER BY ID DESC", CONNECTION_SYNCH); - // WorldSafeLocs.db2 - PrepareStatement(HOTFIX_SEL_WORLD_SAFE_LOCS, "SELECT ID, AreaName, LocX, LocY, LocZ, MapID, Facing FROM world_safe_locs ORDER BY ID DESC", CONNECTION_SYNCH); - PREPARE_LOCALE_STMT(HOTFIX_SEL_WORLD_SAFE_LOCS, "SELECT ID, AreaName_lang FROM world_safe_locs_locale WHERE locale = ?", CONNECTION_SYNCH); - // WorldStateExpression.db2 PrepareStatement(HOTFIX_SEL_WORLD_STATE_EXPRESSION, "SELECT ID, Expression FROM world_state_expression ORDER BY ID DESC", CONNECTION_SYNCH); } diff --git a/src/server/database/Database/Implementation/HotfixDatabase.h b/src/server/database/Database/Implementation/HotfixDatabase.h index aa062cd5554..d1d97a1f0cc 100644 --- a/src/server/database/Database/Implementation/HotfixDatabase.h +++ b/src/server/database/Database/Implementation/HotfixDatabase.h @@ -317,8 +317,6 @@ enum HotfixDatabaseStatements : uint32 HOTFIX_SEL_ITEM_SPEC_OVERRIDE, - HOTFIX_SEL_ITEM_UPGRADE, - HOTFIX_SEL_ITEM_X_BONUS_TREE, HOTFIX_SEL_KEYCHAIN, @@ -412,8 +410,6 @@ enum HotfixDatabaseStatements : uint32 HOTFIX_SEL_REWARD_PACK_X_ITEM, - HOTFIX_SEL_RULESET_ITEM_UPGRADE, - HOTFIX_SEL_SCALING_STAT_DISTRIBUTION, HOTFIX_SEL_SCENARIO, @@ -571,9 +567,6 @@ enum HotfixDatabaseStatements : uint32 HOTFIX_SEL_WORLD_MAP_OVERLAY, - HOTFIX_SEL_WORLD_SAFE_LOCS, - HOTFIX_SEL_WORLD_SAFE_LOCS_LOCALE, - HOTFIX_SEL_WORLD_STATE_EXPRESSION, MAX_HOTFIXDATABASE_STATEMENTS diff --git a/src/server/game/Achievements/CriteriaHandler.cpp b/src/server/game/Achievements/CriteriaHandler.cpp index 39aaf2adfcd..f182c261b17 100644 --- a/src/server/game/Achievements/CriteriaHandler.cpp +++ b/src/server/game/Achievements/CriteriaHandler.cpp @@ -786,8 +786,8 @@ void CriteriaHandler::UpdateCriteria(CriteriaTypes type, uint64 miscValue1 /*= 0 case CRITERIA_TYPE_EARN_HONOR_XP: case CRITERIA_TYPE_RELIC_TALENT_UNLOCKED: case CRITERIA_TYPE_REACH_ACCOUNT_HONOR_LEVEL: - case CRITERIA_TREE_HEART_OF_AZEROTH_ARTIFACT_POWER_EARNED: - case CRITERIA_TREE_HEART_OF_AZEROTH_LEVEL_REACHED: + case CRITERIA_TYPE_HEART_OF_AZEROTH_ARTIFACT_POWER_EARNED: + case CRITERIA_TYPE_HEART_OF_AZEROTH_LEVEL_REACHED: break; // Not implemented yet :( } @@ -1151,8 +1151,8 @@ bool CriteriaHandler::IsCompletedCriteria(Criteria const* criteria, uint64 requi case CRITERIA_TYPE_EARN_HONOR_XP: case CRITERIA_TYPE_RELIC_TALENT_UNLOCKED: case CRITERIA_TYPE_REACH_ACCOUNT_HONOR_LEVEL: - case CRITERIA_TREE_HEART_OF_AZEROTH_ARTIFACT_POWER_EARNED: - case CRITERIA_TREE_HEART_OF_AZEROTH_LEVEL_REACHED: + case CRITERIA_TYPE_HEART_OF_AZEROTH_ARTIFACT_POWER_EARNED: + case CRITERIA_TYPE_HEART_OF_AZEROTH_LEVEL_REACHED: return progress->Counter >= requiredAmount; case CRITERIA_TYPE_COMPLETE_ACHIEVEMENT: case CRITERIA_TYPE_COMPLETE_QUEST: @@ -2204,9 +2204,9 @@ char const* CriteriaMgr::GetCriteriaTypeString(CriteriaTypes type) return "RELIC_TALENT_UNLOCKED"; case CRITERIA_TYPE_REACH_ACCOUNT_HONOR_LEVEL: return "REACH_ACCOUNT_HONOR_LEVEL"; - case CRITERIA_TREE_HEART_OF_AZEROTH_ARTIFACT_POWER_EARNED: + case CRITERIA_TYPE_HEART_OF_AZEROTH_ARTIFACT_POWER_EARNED: return "HEART_OF_AZEROTH_ARTIFACT_POWER_EARNED"; - case CRITERIA_TREE_HEART_OF_AZEROTH_LEVEL_REACHED: + case CRITERIA_TYPE_HEART_OF_AZEROTH_LEVEL_REACHED: return "HEART_OF_AZEROTH_LEVEL_REACHED"; } return "MISSING_TYPE"; diff --git a/src/server/game/Battlefield/Battlefield.cpp b/src/server/game/Battlefield/Battlefield.cpp index 0bd37951c5a..bb629db8a8c 100644 --- a/src/server/game/Battlefield/Battlefield.cpp +++ b/src/server/game/Battlefield/Battlefield.cpp @@ -609,7 +609,7 @@ WorldSafeLocsEntry const* Battlefield::GetClosestGraveYard(Player* player) } if (closestGY) - return sWorldSafeLocsStore.LookupEntry(closestGY->GetGraveyardId()); + return sObjectMgr->GetWorldSafeLoc(closestGY->GetGraveyardId()); return nullptr; } @@ -682,8 +682,8 @@ void BfGraveyard::SetSpirit(Creature* spirit, TeamId team) float BfGraveyard::GetDistance(Player* player) { - WorldSafeLocsEntry const* safeLoc = sWorldSafeLocsStore.LookupEntry(m_GraveyardId); - return player->GetDistance2d(safeLoc->Loc.X, safeLoc->Loc.Y); + WorldSafeLocsEntry const* safeLoc = sObjectMgr->GetWorldSafeLoc(m_GraveyardId); + return player->GetDistance2d(safeLoc->Loc.GetPositionX(), safeLoc->Loc.GetPositionY()); } void BfGraveyard::AddPlayer(ObjectGuid playerGuid) @@ -759,12 +759,12 @@ void BfGraveyard::RelocateDeadPlayers() continue; if (closestGrave) - player->TeleportTo(player->GetMapId(), closestGrave->Loc.X, closestGrave->Loc.Y, closestGrave->Loc.Z, player->GetOrientation()); + player->TeleportTo(closestGrave->Loc); else { closestGrave = m_Bf->GetClosestGraveYard(player); if (closestGrave) - player->TeleportTo(player->GetMapId(), closestGrave->Loc.X, closestGrave->Loc.Y, closestGrave->Loc.Z, player->GetOrientation()); + player->TeleportTo(closestGrave->Loc); } } } diff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp index 0f8d3609f62..472cc6aeeb7 100644 --- a/src/server/game/Battlegrounds/Battleground.cpp +++ b/src/server/game/Battlegrounds/Battleground.cpp @@ -1029,7 +1029,7 @@ void Battleground::StartBattleground() void Battleground::TeleportPlayerToExploitLocation(Player* player) { if (WorldSafeLocsEntry const* loc = GetExploitTeleportLocation(Team(player->GetBGTeam()))) - player->TeleportTo(loc->MapID, loc->Loc.X, loc->Loc.Y, loc->Loc.Z, loc->Facing); + player->TeleportTo(loc->Loc); } void Battleground::AddPlayer(Player* player) @@ -1359,7 +1359,7 @@ void Battleground::RelocateDeadPlayers(ObjectGuid guideGuid) closestGrave = GetClosestGraveYard(player); if (closestGrave) - player->TeleportTo(GetMapId(), closestGrave->Loc.X, closestGrave->Loc.Y, closestGrave->Loc.Z, player->GetOrientation()); + player->TeleportTo(closestGrave->Loc); } ghostList.clear(); } diff --git a/src/server/game/Battlegrounds/BattlegroundMgr.cpp b/src/server/game/Battlegrounds/BattlegroundMgr.cpp index 7afa22a5ccd..b71c45294eb 100644 --- a/src/server/game/Battlegrounds/BattlegroundMgr.cpp +++ b/src/server/game/Battlegrounds/BattlegroundMgr.cpp @@ -543,9 +543,9 @@ void BattlegroundMgr::LoadBattlegroundTemplates() if (bgTemplate.Id != BATTLEGROUND_AA && bgTemplate.Id != BATTLEGROUND_RB) { uint32 startId = fields[5].GetUInt32(); - if (WorldSafeLocsEntry const* start = sWorldSafeLocsStore.LookupEntry(startId)) + if (WorldSafeLocsEntry const* start = sObjectMgr->GetWorldSafeLoc(startId)) { - bgTemplate.StartLocation[TEAM_ALLIANCE].Relocate(start->Loc.X, start->Loc.Y, start->Loc.Z, (start->Facing * M_PI) / 180); + bgTemplate.StartLocation[TEAM_ALLIANCE].Relocate(start->Loc); } else { @@ -554,9 +554,9 @@ void BattlegroundMgr::LoadBattlegroundTemplates() } startId = fields[6].GetUInt32(); - if (WorldSafeLocsEntry const* start = sWorldSafeLocsStore.LookupEntry(startId)) + if (WorldSafeLocsEntry const* start = sObjectMgr->GetWorldSafeLoc(startId)) { - bgTemplate.StartLocation[TEAM_HORDE].Relocate(start->Loc.X, start->Loc.Y, start->Loc.Z, (start->Facing * M_PI) / 180); + bgTemplate.StartLocation[TEAM_HORDE].Relocate(start->Loc); } else { diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundAB.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundAB.cpp index 66d710fb87a..bcc88a088a6 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundAB.cpp +++ b/src/server/game/Battlegrounds/Zones/BattlegroundAB.cpp @@ -23,6 +23,7 @@ #include "GameObject.h" #include "Log.h" #include "Map.h" +#include "ObjectMgr.h" #include "Player.h" #include "Random.h" #include "SpellInfo.h" @@ -651,10 +652,10 @@ WorldSafeLocsEntry const* BattlegroundAB::GetClosestGraveYard(Player* player) float mindist = 999999.0f; for (uint8 i = 0; i < nodes.size(); ++i) { - WorldSafeLocsEntry const*entry = sWorldSafeLocsStore.LookupEntry(BG_AB_GraveyardIds[nodes[i]]); + WorldSafeLocsEntry const*entry = sObjectMgr->GetWorldSafeLoc(BG_AB_GraveyardIds[nodes[i]]); if (!entry) continue; - float dist = (entry->Loc.X - plr_x)*(entry->Loc.X - plr_x)+(entry->Loc.Y - plr_y)*(entry->Loc.Y - plr_y); + float dist = (entry->Loc.GetPositionX() - plr_x) * (entry->Loc.GetPositionX() - plr_x) + (entry->Loc.GetPositionY() - plr_y) * (entry->Loc.GetPositionY() - plr_y); if (mindist > dist) { mindist = dist; @@ -665,14 +666,14 @@ WorldSafeLocsEntry const* BattlegroundAB::GetClosestGraveYard(Player* player) } // If not, place ghost on starting location if (!good_entry) - good_entry = sWorldSafeLocsStore.LookupEntry(BG_AB_GraveyardIds[teamIndex+5]); + good_entry = sObjectMgr->GetWorldSafeLoc(BG_AB_GraveyardIds[teamIndex+5]); return good_entry; } WorldSafeLocsEntry const* BattlegroundAB::GetExploitTeleportLocation(Team team) { - return sWorldSafeLocsStore.LookupEntry(team == ALLIANCE ? AB_EXPLOIT_TELEPORT_LOCATION_ALLIANCE : AB_EXPLOIT_TELEPORT_LOCATION_HORDE); + return sObjectMgr->GetWorldSafeLoc(team == ALLIANCE ? AB_EXPLOIT_TELEPORT_LOCATION_ALLIANCE : AB_EXPLOIT_TELEPORT_LOCATION_HORDE); } bool BattlegroundAB::UpdatePlayerScore(Player* player, uint32 type, uint32 value, bool doAddHonor) diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp index 8471a0a95c0..b293de77803 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp +++ b/src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp @@ -1109,16 +1109,16 @@ WorldSafeLocsEntry const* BattlegroundAV::GetClosestGraveYard(Player* player) player->GetPosition(x, y); - pGraveyard = sWorldSafeLocsStore.LookupEntry(BG_AV_GraveyardIds[GetTeamIndexByTeamId(player->GetTeam())+7]); - minDist = (pGraveyard->Loc.X - x)*(pGraveyard->Loc.X - x)+(pGraveyard->Loc.Y - y)*(pGraveyard->Loc.Y - y); + pGraveyard = sObjectMgr->GetWorldSafeLoc(BG_AV_GraveyardIds[GetTeamIndexByTeamId(player->GetTeam()) + 7]); + minDist = (pGraveyard->Loc.GetPositionX() - x) * (pGraveyard->Loc.GetPositionX() - x) + (pGraveyard->Loc.GetPositionY() - y) * (pGraveyard->Loc.GetPositionY() - y); for (uint8 i = BG_AV_NODES_FIRSTAID_STATION; i <= BG_AV_NODES_FROSTWOLF_HUT; ++i) if (m_Nodes[i].Owner == player->GetTeam() && m_Nodes[i].State == POINT_CONTROLED) { - entry = sWorldSafeLocsStore.LookupEntry(BG_AV_GraveyardIds[i]); + entry = sObjectMgr->GetWorldSafeLoc(BG_AV_GraveyardIds[i]); if (entry) { - dist = (entry->Loc.X - x)*(entry->Loc.X - x)+(entry->Loc.Y - y)*(entry->Loc.Y - y); + dist = (entry->Loc.GetPositionX() - x) * (entry->Loc.GetPositionX() - x) + (entry->Loc.GetPositionY() - y) * (entry->Loc.GetPositionY() - y); if (dist < minDist) { minDist = dist; @@ -1131,7 +1131,7 @@ WorldSafeLocsEntry const* BattlegroundAV::GetClosestGraveYard(Player* player) WorldSafeLocsEntry const* BattlegroundAV::GetExploitTeleportLocation(Team team) { - return sWorldSafeLocsStore.LookupEntry(team == ALLIANCE ? AV_EXPLOIT_TELEPORT_LOCATION_ALLIANCE: AV_EXPLOIT_TELEPORT_LOCATION_HORDE); + return sObjectMgr->GetWorldSafeLoc(team == ALLIANCE ? AV_EXPLOIT_TELEPORT_LOCATION_ALLIANCE: AV_EXPLOIT_TELEPORT_LOCATION_HORDE); } bool BattlegroundAV::SetupBattleground() diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp index 781189270b3..af6e6957372 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp +++ b/src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp @@ -25,6 +25,7 @@ #include "Log.h" #include "Map.h" #include "ObjectAccessor.h" +#include "ObjectMgr.h" #include "Player.h" #include "Random.h" #include "SpellInfo.h" @@ -520,15 +521,15 @@ bool BattlegroundEY::SetupBattleground() TC_LOG_ERROR("bg.battleground", "BattlegroundEY: Could not spawn Speedbuff Fel Reaver."); } - WorldSafeLocsEntry const* sg = sWorldSafeLocsStore.LookupEntry(EY_GRAVEYARD_MAIN_ALLIANCE); - if (!sg || !AddSpiritGuide(EY_SPIRIT_MAIN_ALLIANCE, sg->Loc.X, sg->Loc.Y, sg->Loc.Z, 3.124139f, TEAM_ALLIANCE)) + WorldSafeLocsEntry const* sg = sObjectMgr->GetWorldSafeLoc(EY_GRAVEYARD_MAIN_ALLIANCE); + if (!sg || !AddSpiritGuide(EY_SPIRIT_MAIN_ALLIANCE, sg->Loc.GetPositionX(), sg->Loc.GetPositionY(), sg->Loc.GetPositionZ(), 3.124139f, TEAM_ALLIANCE)) { TC_LOG_ERROR("sql.sql", "BatteGroundEY: Failed to spawn spirit guide. The battleground was not created."); return false; } - sg = sWorldSafeLocsStore.LookupEntry(EY_GRAVEYARD_MAIN_HORDE); - if (!sg || !AddSpiritGuide(EY_SPIRIT_MAIN_HORDE, sg->Loc.X, sg->Loc.Y, sg->Loc.Z, 3.193953f, TEAM_HORDE)) + sg = sObjectMgr->GetWorldSafeLoc(EY_GRAVEYARD_MAIN_HORDE); + if (!sg || !AddSpiritGuide(EY_SPIRIT_MAIN_HORDE, sg->Loc.GetPositionX(), sg->Loc.GetPositionY(), sg->Loc.GetPositionZ(), 3.193953f, TEAM_HORDE)) { TC_LOG_ERROR("sql.sql", "BatteGroundEY: Failed to spawn spirit guide. The battleground was not created."); return false; @@ -764,8 +765,8 @@ void BattlegroundEY::EventTeamCapturedPoint(Player* player, uint32 Point) if (!BgCreatures[Point].IsEmpty()) DelCreature(Point); - WorldSafeLocsEntry const* sg = sWorldSafeLocsStore.LookupEntry(m_CapturingPointTypes[Point].GraveYardId); - if (!sg || !AddSpiritGuide(Point, sg->Loc.X, sg->Loc.Y, sg->Loc.Z, 3.124139f, GetTeamIndexByTeamId(Team))) + WorldSafeLocsEntry const* sg = sObjectMgr->GetWorldSafeLoc(m_CapturingPointTypes[Point].GraveYardId); + if (!sg || !AddSpiritGuide(Point, sg->Loc.GetPositionX(), sg->Loc.GetPositionY(), sg->Loc.GetPositionZ(), 3.124139f, GetTeamIndexByTeamId(Team))) TC_LOG_ERROR("bg.battleground", "BatteGroundEY: Failed to spawn spirit guide. point: %u, team: %u, graveyard_id: %u", Point, Team, m_CapturingPointTypes[Point].GraveYardId); @@ -896,7 +897,7 @@ WorldSafeLocsEntry const* BattlegroundEY::GetClosestGraveYard(Player* player) WorldSafeLocsEntry const* entry = NULL; WorldSafeLocsEntry const* nearestEntry = NULL; - entry = sWorldSafeLocsStore.LookupEntry(g_id); + entry = sObjectMgr->GetWorldSafeLoc(g_id); nearestEntry = entry; if (!entry) @@ -909,19 +910,23 @@ WorldSafeLocsEntry const* BattlegroundEY::GetClosestGraveYard(Player* player) float plr_y = player->GetPositionY(); float plr_z = player->GetPositionZ(); - distance = (entry->Loc.X - plr_x)*(entry->Loc.X - plr_x) + (entry->Loc.Y - plr_y)*(entry->Loc.Y - plr_y) + (entry->Loc.Z - plr_z)*(entry->Loc.Z - plr_z); + distance = (entry->Loc.GetPositionX() - plr_x) * (entry->Loc.GetPositionX() - plr_x) + + (entry->Loc.GetPositionY() - plr_y) * (entry->Loc.GetPositionY() - plr_y) + + (entry->Loc.GetPositionZ() - plr_z) * (entry->Loc.GetPositionZ() - plr_z); nearestDistance = distance; for (uint8 i = 0; i < EY_POINTS_MAX; ++i) { if (m_PointOwnedByTeam[i] == player->GetTeam() && m_PointState[i] == EY_POINT_UNDER_CONTROL) { - entry = sWorldSafeLocsStore.LookupEntry(m_CapturingPointTypes[i].GraveYardId); + entry = sObjectMgr->GetWorldSafeLoc(m_CapturingPointTypes[i].GraveYardId); if (!entry) TC_LOG_ERROR("bg.battleground", "BattlegroundEY: Graveyard %u could not be found.", m_CapturingPointTypes[i].GraveYardId); else { - distance = (entry->Loc.X - plr_x)*(entry->Loc.X - plr_x) + (entry->Loc.Y - plr_y)*(entry->Loc.Y - plr_y) + (entry->Loc.Z - plr_z)*(entry->Loc.Z - plr_z); + distance = (entry->Loc.GetPositionX() - plr_x) * (entry->Loc.GetPositionX() - plr_x) + + (entry->Loc.GetPositionY() - plr_y) * (entry->Loc.GetPositionY() - plr_y) + + (entry->Loc.GetPositionZ() - plr_z) * (entry->Loc.GetPositionZ() - plr_z); if (distance < nearestDistance) { nearestDistance = distance; @@ -936,7 +941,7 @@ WorldSafeLocsEntry const* BattlegroundEY::GetClosestGraveYard(Player* player) WorldSafeLocsEntry const* BattlegroundEY::GetExploitTeleportLocation(Team team) { - return sWorldSafeLocsStore.LookupEntry(team == ALLIANCE ? EY_EXPLOIT_TELEPORT_LOCATION_ALLIANCE : EY_EXPLOIT_TELEPORT_LOCATION_HORDE); + return sObjectMgr->GetWorldSafeLoc(team == ALLIANCE ? EY_EXPLOIT_TELEPORT_LOCATION_ALLIANCE : EY_EXPLOIT_TELEPORT_LOCATION_HORDE); } bool BattlegroundEY::IsAllNodesControlledByTeam(uint32 team) const diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundIC.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundIC.cpp index 3d343d2364c..a4c94466fb7 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundIC.cpp +++ b/src/server/game/Battlegrounds/Zones/BattlegroundIC.cpp @@ -21,6 +21,7 @@ #include "GameObject.h" #include "Log.h" #include "Map.h" +#include "ObjectMgr.h" #include "Player.h" #include "Transport.h" #include "UnitAI.h" @@ -875,10 +876,10 @@ WorldSafeLocsEntry const* BattlegroundIC::GetClosestGraveYard(Player* player) float mindist = 999999.0f; for (uint8 i = 0; i < nodes.size(); ++i) { - WorldSafeLocsEntry const*entry = sWorldSafeLocsStore.LookupEntry(BG_IC_GraveyardIds[nodes[i]]); + WorldSafeLocsEntry const*entry = sObjectMgr->GetWorldSafeLoc(BG_IC_GraveyardIds[nodes[i]]); if (!entry) continue; - float dist = (entry->Loc.X - player_x)*(entry->Loc.X - player_x)+(entry->Loc.Y - player_y)*(entry->Loc.Y - player_y); + float dist = (entry->Loc.GetPositionX() - player_x) * (entry->Loc.GetPositionX() - player_x) + (entry->Loc.GetPositionY() - player_y) * (entry->Loc.GetPositionY() - player_y); if (mindist > dist) { mindist = dist; @@ -889,14 +890,14 @@ WorldSafeLocsEntry const* BattlegroundIC::GetClosestGraveYard(Player* player) } // If not, place ghost on starting location if (!good_entry) - good_entry = sWorldSafeLocsStore.LookupEntry(BG_IC_GraveyardIds[teamIndex+MAX_NODE_TYPES]); + good_entry = sObjectMgr->GetWorldSafeLoc(BG_IC_GraveyardIds[teamIndex+MAX_NODE_TYPES]); return good_entry; } WorldSafeLocsEntry const * BattlegroundIC::GetExploitTeleportLocation(Team team) { - return sWorldSafeLocsStore.LookupEntry(team == ALLIANCE ? IC_EXPLOIT_TELEPORT_LOCATION_ALLIANCE : IC_EXPLOIT_TELEPORT_LOCATION_HORDE); + return sObjectMgr->GetWorldSafeLoc(team == ALLIANCE ? IC_EXPLOIT_TELEPORT_LOCATION_ALLIANCE : IC_EXPLOIT_TELEPORT_LOCATION_HORDE); } bool BattlegroundIC::IsAllNodesControlledByTeam(uint32 team) const diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundSA.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundSA.cpp index 12b0a9dad20..87cc2006174 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundSA.cpp +++ b/src/server/game/Battlegrounds/Zones/BattlegroundSA.cpp @@ -25,6 +25,7 @@ #include "Log.h" #include "Map.h" #include "ObjectAccessor.h" +#include "ObjectMgr.h" #include "Player.h" #include "Random.h" #include "UpdateData.h" @@ -188,7 +189,7 @@ bool BattlegroundSA::ResetObjs() //Graveyards for (uint8 i = 0; i < BG_SA_MAX_GY; i++) { - WorldSafeLocsEntry const* sg = sWorldSafeLocsStore.LookupEntry(BG_SA_GYEntries[i]); + WorldSafeLocsEntry const* sg = sObjectMgr->GetWorldSafeLoc(BG_SA_GYEntries[i]); if (!sg) { TC_LOG_ERROR("bg.battleground", "SOTA: Can't find GY entry %u", BG_SA_GYEntries[i]); @@ -198,12 +199,12 @@ bool BattlegroundSA::ResetObjs() if (i == BG_SA_BEACH_GY) { GraveyardStatus[i] = Attackers; - AddSpiritGuide(i + BG_SA_MAXNPC, sg->Loc.X, sg->Loc.Y, sg->Loc.Z, BG_SA_GYOrientation[i], Attackers); + AddSpiritGuide(i + BG_SA_MAXNPC, sg->Loc.GetPositionX(), sg->Loc.GetPositionY(), sg->Loc.GetPositionZ(), BG_SA_GYOrientation[i], Attackers); } else { GraveyardStatus[i] = ((Attackers == TEAM_HORDE)? TEAM_ALLIANCE : TEAM_HORDE); - if (!AddSpiritGuide(i + BG_SA_MAXNPC, sg->Loc.X, sg->Loc.Y, sg->Loc.Z, BG_SA_GYOrientation[i], Attackers == TEAM_HORDE ? TEAM_ALLIANCE : TEAM_HORDE)) + if (!AddSpiritGuide(i + BG_SA_MAXNPC, sg->Loc.GetPositionX(), sg->Loc.GetPositionY(), sg->Loc.GetPositionZ(), BG_SA_GYOrientation[i], Attackers == TEAM_HORDE ? TEAM_ALLIANCE : TEAM_HORDE)) TC_LOG_ERROR("bg.battleground", "SOTA: couldn't spawn GY: %u", i); } } @@ -701,16 +702,16 @@ WorldSafeLocsEntry const* BattlegroundSA::GetClosestGraveYard(Player* player) else safeloc = BG_SA_GYEntries[BG_SA_DEFENDER_LAST_GY]; - closest = sWorldSafeLocsStore.LookupEntry(safeloc); - nearest = player->GetExactDistSq(closest->Loc.X, closest->Loc.Y, closest->Loc.Z); + closest = sObjectMgr->GetWorldSafeLoc(safeloc); + nearest = player->GetExactDistSq(closest->Loc); for (uint8 i = BG_SA_RIGHT_CAPTURABLE_GY; i < BG_SA_MAX_GY; i++) { if (GraveyardStatus[i] != player->GetTeamId()) continue; - ret = sWorldSafeLocsStore.LookupEntry(BG_SA_GYEntries[i]); - dist = player->GetExactDistSq(ret->Loc.X, ret->Loc.Y, ret->Loc.Z); + ret = sObjectMgr->GetWorldSafeLoc(BG_SA_GYEntries[i]); + dist = player->GetExactDistSq(ret->Loc); if (dist < nearest) { closest = ret; @@ -803,14 +804,14 @@ void BattlegroundSA::CaptureGraveyard(BG_SA_Graveyards i, Player* Source) DelCreature(BG_SA_MAXNPC + i); GraveyardStatus[i] = Source->GetTeamId(); - WorldSafeLocsEntry const* sg = sWorldSafeLocsStore.LookupEntry(BG_SA_GYEntries[i]); + WorldSafeLocsEntry const* sg = sObjectMgr->GetWorldSafeLoc(BG_SA_GYEntries[i]); if (!sg) { TC_LOG_ERROR("bg.battleground", "BattlegroundSA::CaptureGraveyard: non-existant GY entry: %u", BG_SA_GYEntries[i]); return; } - AddSpiritGuide(i + BG_SA_MAXNPC, sg->Loc.X, sg->Loc.Y, sg->Loc.Z, BG_SA_GYOrientation[i], GraveyardStatus[i]); + AddSpiritGuide(i + BG_SA_MAXNPC, sg->Loc.GetPositionX(), sg->Loc.GetPositionY(), sg->Loc.GetPositionZ(), BG_SA_GYOrientation[i], GraveyardStatus[i]); uint32 npc = 0; uint32 flag = 0; diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp index 3f24b70f184..ed0f94837ed 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp +++ b/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp @@ -24,6 +24,7 @@ #include "Map.h" #include "Object.h" #include "ObjectAccessor.h" +#include "ObjectMgr.h" #include "Player.h" #include "SpellInfo.h" #include "WorldStatePackets.h" @@ -715,15 +716,15 @@ bool BattlegroundWS::SetupBattleground() return false; } - WorldSafeLocsEntry const* sg = sWorldSafeLocsStore.LookupEntry(WS_GRAVEYARD_MAIN_ALLIANCE); - if (!sg || !AddSpiritGuide(WS_SPIRIT_MAIN_ALLIANCE, sg->Loc.X, sg->Loc.Y, sg->Loc.Z, 3.124139f, TEAM_ALLIANCE)) + WorldSafeLocsEntry const* sg = sObjectMgr->GetWorldSafeLoc(WS_GRAVEYARD_MAIN_ALLIANCE); + if (!sg || !AddSpiritGuide(WS_SPIRIT_MAIN_ALLIANCE, sg->Loc.GetPositionX(), sg->Loc.GetPositionY(), sg->Loc.GetPositionZ(), 3.124139f, TEAM_ALLIANCE)) { TC_LOG_ERROR("sql.sql", "BatteGroundWS: Failed to spawn Alliance spirit guide! Battleground not created!"); return false; } - sg = sWorldSafeLocsStore.LookupEntry(WS_GRAVEYARD_MAIN_HORDE); - if (!sg || !AddSpiritGuide(WS_SPIRIT_MAIN_HORDE, sg->Loc.X, sg->Loc.Y, sg->Loc.Z, 3.193953f, TEAM_HORDE)) + sg = sObjectMgr->GetWorldSafeLoc(WS_GRAVEYARD_MAIN_HORDE); + if (!sg || !AddSpiritGuide(WS_SPIRIT_MAIN_HORDE, sg->Loc.GetPositionX(), sg->Loc.GetPositionY(), sg->Loc.GetPositionZ(), 3.193953f, TEAM_HORDE)) { TC_LOG_ERROR("sql.sql", "BatteGroundWS: Failed to spawn Horde spirit guide! Battleground not created!"); return false; @@ -824,22 +825,22 @@ WorldSafeLocsEntry const* BattlegroundWS::GetClosestGraveYard(Player* player) if (player->GetTeam() == ALLIANCE) { if (GetStatus() == STATUS_IN_PROGRESS) - return sWorldSafeLocsStore.LookupEntry(WS_GRAVEYARD_MAIN_ALLIANCE); + return sObjectMgr->GetWorldSafeLoc(WS_GRAVEYARD_MAIN_ALLIANCE); else - return sWorldSafeLocsStore.LookupEntry(WS_GRAVEYARD_FLAGROOM_ALLIANCE); + return sObjectMgr->GetWorldSafeLoc(WS_GRAVEYARD_FLAGROOM_ALLIANCE); } else { if (GetStatus() == STATUS_IN_PROGRESS) - return sWorldSafeLocsStore.LookupEntry(WS_GRAVEYARD_MAIN_HORDE); + return sObjectMgr->GetWorldSafeLoc(WS_GRAVEYARD_MAIN_HORDE); else - return sWorldSafeLocsStore.LookupEntry(WS_GRAVEYARD_FLAGROOM_HORDE); + return sObjectMgr->GetWorldSafeLoc(WS_GRAVEYARD_FLAGROOM_HORDE); } } WorldSafeLocsEntry const* BattlegroundWS::GetExploitTeleportLocation(Team team) { - return sWorldSafeLocsStore.LookupEntry(team == ALLIANCE ? WS_EXPLOIT_TELEPORT_LOCATION_ALLIANCE : WS_EXPLOIT_TELEPORT_LOCATION_HORDE); + return sObjectMgr->GetWorldSafeLoc(team == ALLIANCE ? WS_EXPLOIT_TELEPORT_LOCATION_ALLIANCE : WS_EXPLOIT_TELEPORT_LOCATION_HORDE); } void BattlegroundWS::FillInitialWorldStates(WorldPackets::WorldState::InitWorldStates& packet) diff --git a/src/server/game/Conditions/ConditionMgr.cpp b/src/server/game/Conditions/ConditionMgr.cpp index 598c1000758..b8d5726345a 100644 --- a/src/server/game/Conditions/ConditionMgr.cpp +++ b/src/server/game/Conditions/ConditionMgr.cpp @@ -1858,7 +1858,7 @@ bool ConditionMgr::isSourceTypeValid(Condition* cond) const case CONDITION_SOURCE_TYPE_SMART_EVENT: break; case CONDITION_SOURCE_TYPE_GRAVEYARD: - if (!sWorldSafeLocsStore.LookupEntry(cond->SourceEntry)) + if (!sObjectMgr->GetWorldSafeLoc(cond->SourceEntry)) { TC_LOG_ERROR("sql.sql", "%s SourceEntry in `condition` table, does not exist in WorldSafeLocs.db2, ignoring.", cond->ToString().c_str()); return false; diff --git a/src/server/game/DataStores/DB2LoadInfo.h b/src/server/game/DataStores/DB2LoadInfo.h index b86c435a338..acea806bdb6 100644 --- a/src/server/game/DataStores/DB2LoadInfo.h +++ b/src/server/game/DataStores/DB2LoadInfo.h @@ -2183,6 +2183,7 @@ struct ItemAppearanceLoadInfo { { false, FT_INT, "ID" }, { false, FT_BYTE, "DisplayType" }, + { true, FT_INT, "SubclassID" }, { true, FT_INT, "ItemDisplayInfoID" }, { true, FT_INT, "DefaultIconFileDataID" }, { true, FT_INT, "UiOrder" }, @@ -2801,7 +2802,8 @@ struct ItemSparseLoadInfo { false, FT_SHORT, "SocketMatchEnchantmentId" }, { false, FT_SHORT, "TotemCategoryID" }, { false, FT_SHORT, "InstanceBound" }, - { false, FT_SHORT, "ZoneBound" }, + { false, FT_SHORT, "ZoneBound1" }, + { false, FT_SHORT, "ZoneBound2" }, { false, FT_SHORT, "ItemSet" }, { false, FT_SHORT, "LockID" }, { false, FT_SHORT, "StartQuestID" }, @@ -2883,24 +2885,6 @@ struct ItemSpecOverrideLoadInfo } }; -struct ItemUpgradeLoadInfo -{ - static DB2LoadInfo const* Instance() - { - static DB2FieldMeta const fields[] = - { - { false, FT_INT, "ID" }, - { false, FT_BYTE, "ItemUpgradePathID" }, - { false, FT_BYTE, "ItemLevelIncrement" }, - { false, FT_SHORT, "PrerequisiteID" }, - { false, FT_SHORT, "CurrencyType" }, - { false, FT_INT, "CurrencyAmount" }, - }; - static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ItemUpgradeMeta::Instance(), HOTFIX_SEL_ITEM_UPGRADE); - return &loadInfo; - } -}; - struct ItemXBonusTreeLoadInfo { static DB2LoadInfo const* Instance() @@ -3649,9 +3633,9 @@ struct PowerTypeLoadInfo { static DB2FieldMeta const fields[] = { - { false, FT_INT, "ID" }, { false, FT_STRING_NOT_LOCALIZED, "NameGlobalStringTag" }, { false, FT_STRING_NOT_LOCALIZED, "CostGlobalStringTag" }, + { false, FT_INT, "ID" }, { true, FT_BYTE, "PowerTypeEnum" }, { true, FT_BYTE, "MinPower" }, { true, FT_SHORT, "MaxBasePower" }, @@ -3966,21 +3950,6 @@ struct RewardPackXItemLoadInfo } }; -struct RulesetItemUpgradeLoadInfo -{ - static DB2LoadInfo const* Instance() - { - static DB2FieldMeta const fields[] = - { - { false, FT_INT, "ID" }, - { true, FT_INT, "ItemID" }, - { false, FT_SHORT, "ItemUpgradeID" }, - }; - static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, RulesetItemUpgradeMeta::Instance(), HOTFIX_SEL_RULESET_ITEM_UPGRADE); - return &loadInfo; - } -}; - struct ScalingStatDistributionLoadInfo { static DB2LoadInfo const* Instance() @@ -4399,12 +4368,12 @@ struct SpellEffectLoadInfo static DB2FieldMeta const fields[] = { { false, FT_INT, "ID" }, + { true, FT_SHORT, "EffectAura" }, { true, FT_INT, "DifficultyID" }, { true, FT_INT, "EffectIndex" }, { false, FT_INT, "Effect" }, { false, FT_FLOAT, "EffectAmplitude" }, { true, FT_INT, "EffectAttributes" }, - { true, FT_SHORT, "EffectAura" }, { true, FT_INT, "EffectAuraPeriod" }, { false, FT_FLOAT, "EffectBonusCoefficient" }, { false, FT_FLOAT, "EffectChainAmplitude" }, @@ -4616,17 +4585,6 @@ struct SpellMiscLoadInfo static DB2FieldMeta const fields[] = { { false, FT_INT, "ID" }, - { false, FT_BYTE, "DifficultyID" }, - { false, FT_SHORT, "CastingTimeIndex" }, - { false, FT_SHORT, "DurationIndex" }, - { false, FT_SHORT, "RangeIndex" }, - { false, FT_BYTE, "SchoolMask" }, - { false, FT_FLOAT, "Speed" }, - { false, FT_FLOAT, "LaunchDelay" }, - { false, FT_FLOAT, "MinDuration" }, - { true, FT_INT, "SpellIconFileDataID" }, - { true, FT_INT, "ActiveIconFileDataID" }, - { true, FT_INT, "ContentTuningID" }, { true, FT_INT, "Attributes1" }, { true, FT_INT, "Attributes2" }, { true, FT_INT, "Attributes3" }, @@ -4641,6 +4599,17 @@ struct SpellMiscLoadInfo { true, FT_INT, "Attributes12" }, { true, FT_INT, "Attributes13" }, { true, FT_INT, "Attributes14" }, + { false, FT_BYTE, "DifficultyID" }, + { false, FT_SHORT, "CastingTimeIndex" }, + { false, FT_SHORT, "DurationIndex" }, + { false, FT_SHORT, "RangeIndex" }, + { false, FT_BYTE, "SchoolMask" }, + { false, FT_FLOAT, "Speed" }, + { false, FT_FLOAT, "LaunchDelay" }, + { false, FT_FLOAT, "MinDuration" }, + { true, FT_INT, "SpellIconFileDataID" }, + { true, FT_INT, "ActiveIconFileDataID" }, + { true, FT_INT, "ContentTuningID" }, { true, FT_INT, "SpellID" }, }; static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, SpellMiscMeta::Instance(), HOTFIX_SEL_SPELL_MISC); @@ -5160,6 +5129,7 @@ struct TransmogSetLoadInfo { false, FT_BYTE, "ExpansionID" }, { true, FT_INT, "PatchID" }, { true, FT_SHORT, "UiOrder" }, + { true, FT_INT, "PlayerConditionID" }, }; static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, TransmogSetMeta::Instance(), HOTFIX_SEL_TRANSMOG_SET); return &loadInfo; @@ -5339,7 +5309,7 @@ struct UnitPowerBarLoadInfo { false, FT_STRING, "ToolTip" }, { false, FT_INT, "MinPower" }, { false, FT_INT, "MaxPower" }, - { false, FT_SHORT, "StartPower" }, + { false, FT_INT, "StartPower" }, { false, FT_BYTE, "CenterPower" }, { false, FT_FLOAT, "RegenerationPeace" }, { false, FT_FLOAT, "RegenerationCombat" }, @@ -5557,25 +5527,6 @@ struct WorldMapOverlayLoadInfo } }; -struct WorldSafeLocsLoadInfo -{ - static DB2LoadInfo const* Instance() - { - static DB2FieldMeta const fields[] = - { - { false, FT_INT, "ID" }, - { false, FT_STRING, "AreaName" }, - { false, FT_FLOAT, "LocX" }, - { false, FT_FLOAT, "LocY" }, - { false, FT_FLOAT, "LocZ" }, - { false, FT_SHORT, "MapID" }, - { false, FT_FLOAT, "Facing" }, - }; - static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, WorldSafeLocsMeta::Instance(), HOTFIX_SEL_WORLD_SAFE_LOCS); - return &loadInfo; - } -}; - struct WorldStateExpressionLoadInfo { static DB2LoadInfo const* Instance() diff --git a/src/server/game/DataStores/DB2Metadata.h b/src/server/game/DataStores/DB2Metadata.h index efda3820af2..e8ffa767a18 100644 --- a/src/server/game/DataStores/DB2Metadata.h +++ b/src/server/game/DataStores/DB2Metadata.h @@ -904,6 +904,34 @@ struct AzeriteItemMilestonePowerMeta } }; +struct AzeriteKnowledgeMultiplierMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[1] = + { + { FT_FLOAT, 1, true }, + }; + static DB2Meta instance(3148050, -1, 1, 0xDBB99B2A, fields, -1); + return &instance; + } +}; + +struct AzeriteLevelInfoMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[3] = + { + { FT_LONG, 1, false }, + { FT_LONG, 1, false }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(3147968, -1, 3, 0xEA8E31FC, fields, -1); + return &instance; + } +}; + struct AzeritePowerMeta { static DB2Meta const* Instance() @@ -1519,7 +1547,7 @@ struct CampaignMeta { static DB2Meta const* Instance() { - static DB2MetaField const fields[7] = + static DB2MetaField const fields[8] = { { FT_STRING, 1, true }, { FT_STRING_NOT_LOCALIZED, 1, true }, @@ -1528,8 +1556,9 @@ struct CampaignMeta { FT_INT, 1, false }, { FT_INT, 1, false }, { FT_INT, 1, false }, + { FT_INT, 1, false }, }; - static DB2Meta instance(2031607, 3, 7, 0x2D49AABD, fields, -1); + static DB2Meta instance(2031607, 3, 8, 0x84DC679F, fields, -1); return &instance; } }; @@ -2356,6 +2385,21 @@ struct CombatConditionMeta } }; +struct CommentatorIndirectSpellMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[3] = + { + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_SHORT, 1, false }, + }; + static DB2Meta instance(3067644, -1, 3, 0x367A3BBC, fields, 2); + return &instance; + } +}; + struct CommentatorStartLocationMeta { static DB2Meta const* Instance() @@ -5255,14 +5299,15 @@ struct ItemAppearanceMeta { static DB2Meta const* Instance() { - static DB2MetaField const fields[4] = + static DB2MetaField const fields[5] = { { FT_BYTE, 1, false }, { FT_INT, 1, true }, { FT_INT, 1, true }, { FT_INT, 1, true }, + { FT_INT, 1, true }, }; - static DB2Meta instance(982462, -1, 4, 0x422F764D, fields, -1); + static DB2Meta instance(982462, -1, 5, 0x26E99D61, fields, -1); return &instance; } }; @@ -5971,7 +6016,7 @@ struct ItemSparseMeta { FT_SHORT, 1, false }, { FT_SHORT, 1, false }, { FT_SHORT, 1, false }, - { FT_SHORT, 1, false }, + { FT_SHORT, 2, false }, { FT_SHORT, 1, false }, { FT_SHORT, 1, false }, { FT_SHORT, 1, false }, @@ -6077,32 +6122,32 @@ struct ItemSubClassMaskMeta } }; -struct ItemUpgradeMeta +struct ItemVisualsMeta { static DB2Meta const* Instance() { - static DB2MetaField const fields[5] = + static DB2MetaField const fields[1] = { - { FT_BYTE, 1, false }, - { FT_BYTE, 1, false }, - { FT_SHORT, 1, false }, - { FT_SHORT, 1, false }, - { FT_INT, 1, false }, + { FT_INT, 5, true }, }; - static DB2Meta instance(801687, -1, 5, 0x706FA369, fields, -1); + static DB2Meta instance(1343605, -1, 1, 0x4025FA36, fields, -1); return &instance; } }; -struct ItemVisualsMeta +struct ItemVisualsXEffectMeta { static DB2Meta const* Instance() { - static DB2MetaField const fields[1] = + static DB2MetaField const fields[5] = { - { FT_INT, 5, true }, + { FT_BYTE, 1, true }, + { FT_BYTE, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, }; - static DB2Meta instance(1343605, -1, 1, 0x4025FA36, fields, -1); + static DB2Meta instance(3043873, -1, 5, 0xC819EA7E, fields, 4); return &instance; } }; @@ -8187,10 +8232,11 @@ struct PowerTypeMeta { static DB2Meta const* Instance() { - static DB2MetaField const fields[12] = + static DB2MetaField const fields[13] = { { FT_STRING_NOT_LOCALIZED, 1, true }, { FT_STRING_NOT_LOCALIZED, 1, true }, + { FT_INT, 1, false }, { FT_BYTE, 1, true }, { FT_BYTE, 1, true }, { FT_SHORT, 1, true }, @@ -8202,7 +8248,7 @@ struct PowerTypeMeta { FT_FLOAT, 1, true }, { FT_SHORT, 1, true }, }; - static DB2Meta instance(1266022, -1, 12, 0x6D438CB5, fields, -1); + static DB2Meta instance(1266022, 2, 13, 0x10DE95BF, fields, -1); return &instance; } }; @@ -8622,6 +8668,21 @@ struct QuestXPMeta } }; +struct RafActivityMeta +{ + static DB2Meta const* Instance() + { + static DB2MetaField const fields[3] = + { + { FT_INT, 1, false }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + }; + static DB2Meta instance(3081207, 0, 3, 0x6E8722C5, fields, -1); + return &instance; + } +}; + struct RandPropPointsMeta { static DB2Meta const* Instance() @@ -8821,20 +8882,6 @@ struct RibbonQualityMeta } }; -struct RulesetItemUpgradeMeta -{ - static DB2Meta const* Instance() - { - static DB2MetaField const fields[2] = - { - { FT_INT, 1, true }, - { FT_SHORT, 1, false }, - }; - static DB2Meta instance(801749, -1, 2, 0xA03B4C48, fields, -1); - return &instance; - } -}; - struct SDReplacementModelMeta { static DB2Meta const* Instance() @@ -10120,12 +10167,12 @@ struct SpellEffectMeta { static DB2MetaField const fields[28] = { + { FT_SHORT, 1, true }, { FT_INT, 1, true }, { FT_INT, 1, true }, { FT_INT, 1, false }, { FT_FLOAT, 1, true }, { FT_INT, 1, true }, - { FT_SHORT, 1, true }, { FT_INT, 1, true }, { FT_FLOAT, 1, true }, { FT_FLOAT, 1, true }, @@ -10149,7 +10196,7 @@ struct SpellEffectMeta { FT_SHORT, 2, true }, { FT_INT, 1, true }, }; - static DB2Meta instance(1140088, -1, 28, 0x803150B7, fields, 27); + static DB2Meta instance(1140088, -1, 28, 0xF0FD10BB, fields, 27); return &instance; } }; @@ -10401,6 +10448,7 @@ struct SpellMiscMeta { static DB2MetaField const fields[13] = { + { FT_INT, 14, true }, { FT_BYTE, 1, false }, { FT_SHORT, 1, false }, { FT_SHORT, 1, false }, @@ -10412,10 +10460,9 @@ struct SpellMiscMeta { FT_INT, 1, true }, { FT_INT, 1, true }, { FT_INT, 1, true }, - { FT_INT, 14, true }, { FT_INT, 1, true }, }; - static DB2Meta instance(1003144, -1, 13, 0x99BBFB8B, fields, 12); + static DB2Meta instance(1003144, -1, 13, 0x0E10E69B, fields, 12); return &instance; } }; @@ -11375,7 +11422,7 @@ struct TransmogSetMeta { static DB2Meta const* Instance() { - static DB2MetaField const fields[12] = + static DB2MetaField const fields[13] = { { FT_STRING, 1, true }, { FT_INT, 1, false }, @@ -11389,8 +11436,9 @@ struct TransmogSetMeta { FT_BYTE, 1, false }, { FT_INT, 1, true }, { FT_SHORT, 1, true }, + { FT_INT, 1, true }, }; - static DB2Meta instance(1376213, 1, 12, 0xFA89DA93, fields, 7); + static DB2Meta instance(1376213, 1, 13, 0x8BEEE3C1, fields, 7); return &instance; } }; @@ -11961,7 +12009,7 @@ struct UiWidgetMeta { static DB2Meta const* Instance() { - static DB2MetaField const fields[6] = + static DB2MetaField const fields[7] = { { FT_STRING_NOT_LOCALIZED, 1, true }, { FT_INT, 1, true }, @@ -11969,8 +12017,9 @@ struct UiWidgetMeta { FT_INT, 1, true }, { FT_INT, 1, true }, { FT_INT, 1, false }, + { FT_INT, 1, true }, }; - static DB2Meta instance(1983278, -1, 6, 0x21A338EE, fields, -1); + static DB2Meta instance(1983278, -1, 7, 0xB7E65C22, fields, -1); return &instance; } }; @@ -12131,7 +12180,7 @@ struct UnitPowerBarMeta { FT_STRING, 1, true }, { FT_INT, 1, false }, { FT_INT, 1, false }, - { FT_SHORT, 1, false }, + { FT_INT, 1, false }, { FT_BYTE, 1, false }, { FT_FLOAT, 1, true }, { FT_FLOAT, 1, true }, @@ -12142,7 +12191,7 @@ struct UnitPowerBarMeta { FT_INT, 6, true }, { FT_INT, 6, true }, }; - static DB2Meta instance(1237753, -1, 16, 0x2640852D, fields, -1); + static DB2Meta instance(1237753, -1, 16, 0xD8CE1BD7, fields, -1); return &instance; } }; diff --git a/src/server/game/DataStores/DB2Stores.cpp b/src/server/game/DataStores/DB2Stores.cpp index 15b18fe53f0..9541a6bc551 100644 --- a/src/server/game/DataStores/DB2Stores.cpp +++ b/src/server/game/DataStores/DB2Stores.cpp @@ -162,7 +162,6 @@ DB2Storage<ItemSetSpellEntry> sItemSetSpellStore("ItemSetSpell DB2Storage<ItemSparseEntry> sItemSparseStore("ItemSparse.db2", ItemSparseLoadInfo::Instance()); DB2Storage<ItemSpecEntry> sItemSpecStore("ItemSpec.db2", ItemSpecLoadInfo::Instance()); DB2Storage<ItemSpecOverrideEntry> sItemSpecOverrideStore("ItemSpecOverride.db2", ItemSpecOverrideLoadInfo::Instance()); -DB2Storage<ItemUpgradeEntry> sItemUpgradeStore("ItemUpgrade.db2", ItemUpgradeLoadInfo::Instance()); DB2Storage<ItemXBonusTreeEntry> sItemXBonusTreeStore("ItemXBonusTree.db2", ItemXBonusTreeLoadInfo::Instance()); DB2Storage<KeychainEntry> sKeychainStore("Keychain.db2", KeychainLoadInfo::Instance()); DB2Storage<LFGDungeonsEntry> sLFGDungeonsStore("LFGDungeons.db2", LfgDungeonsLoadInfo::Instance()); @@ -205,7 +204,6 @@ DB2Storage<RandPropPointsEntry> sRandPropPointsStore("RandPropPo DB2Storage<RewardPackEntry> sRewardPackStore("RewardPack.db2", RewardPackLoadInfo::Instance()); DB2Storage<RewardPackXCurrencyTypeEntry> sRewardPackXCurrencyTypeStore("RewardPackXCurrencyType.db2", RewardPackXCurrencyTypeLoadInfo::Instance()); DB2Storage<RewardPackXItemEntry> sRewardPackXItemStore("RewardPackXItem.db2", RewardPackXItemLoadInfo::Instance()); -DB2Storage<RulesetItemUpgradeEntry> sRulesetItemUpgradeStore("RulesetItemUpgrade.db2", RulesetItemUpgradeLoadInfo::Instance()); DB2Storage<ScalingStatDistributionEntry> sScalingStatDistributionStore("ScalingStatDistribution.db2", ScalingStatDistributionLoadInfo::Instance()); DB2Storage<ScenarioEntry> sScenarioStore("Scenario.db2", ScenarioLoadInfo::Instance()); DB2Storage<ScenarioStepEntry> sScenarioStepStore("ScenarioStep.db2", ScenarioStepLoadInfo::Instance()); @@ -275,7 +273,6 @@ DB2Storage<VehicleSeatEntry> sVehicleSeatStore("VehicleSeat.d DB2Storage<WMOAreaTableEntry> sWMOAreaTableStore("WMOAreaTable.db2", WmoAreaTableLoadInfo::Instance()); DB2Storage<WorldEffectEntry> sWorldEffectStore("WorldEffect.db2", WorldEffectLoadInfo::Instance()); DB2Storage<WorldMapOverlayEntry> sWorldMapOverlayStore("WorldMapOverlay.db2", WorldMapOverlayLoadInfo::Instance()); -DB2Storage<WorldSafeLocsEntry> sWorldSafeLocsStore("WorldSafeLocs.db2", WorldSafeLocsLoadInfo::Instance()); DB2Storage<WorldStateExpressionEntry> sWorldStateExpressionStore("WorldStateExpression.db2", WorldStateExpressionLoadInfo::Instance()); TaxiMask sTaxiNodesMask; @@ -326,7 +323,6 @@ typedef std::array<std::vector<Trinity::wregex>, TOTAL_LOCALES + 1> NameValidati typedef std::unordered_map<uint32, std::vector<uint32>> PhaseGroupContainer; typedef std::array<PowerTypeEntry const*, MAX_POWERS> PowerTypesContainer; typedef std::unordered_map<uint32, std::pair<std::vector<QuestPackageItemEntry const*>, std::vector<QuestPackageItemEntry const*>>> QuestPackageItemContainer; -typedef std::unordered_map<uint32, uint32> RulesetItemUpgradeContainer; typedef std::unordered_multimap<uint32, SkillRaceClassInfoEntry const*> SkillRaceClassInfoContainer; typedef std::unordered_map<uint32, std::vector<SpecializationSpellsEntry const*>> SpecializationSpellsContainer; typedef std::unordered_map<uint32, std::vector<SpellPowerEntry const*>> SpellPowerContainer; @@ -395,7 +391,6 @@ namespace QuestPackageItemContainer _questPackages; std::unordered_map<uint32, std::vector<RewardPackXCurrencyTypeEntry const*>> _rewardPackCurrencyTypes; std::unordered_map<uint32, std::vector<RewardPackXItemEntry const*>> _rewardPackItems; - RulesetItemUpgradeContainer _rulesetItemUpgrade; std::unordered_map<uint32, std::vector<SkillLineEntry const*>> _skillLinesByParentSkillLine; std::unordered_map<uint32, std::vector<SkillLineAbilityEntry const*>> _skillLineAbilitiesBySkillupSkill; SkillRaceClassInfoContainer _skillRaceClassInfoBySkill; @@ -622,7 +617,6 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) LOAD_DB2(sItemSparseStore); LOAD_DB2(sItemSpecStore); LOAD_DB2(sItemSpecOverrideStore); - LOAD_DB2(sItemUpgradeStore); LOAD_DB2(sItemXBonusTreeStore); LOAD_DB2(sKeychainStore); LOAD_DB2(sLFGDungeonsStore); @@ -665,7 +659,6 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) LOAD_DB2(sRewardPackStore); LOAD_DB2(sRewardPackXCurrencyTypeStore); LOAD_DB2(sRewardPackXItemStore); - LOAD_DB2(sRulesetItemUpgradeStore); LOAD_DB2(sScalingStatDistributionStore); LOAD_DB2(sScenarioStore); LOAD_DB2(sScenarioStepStore); @@ -735,8 +728,6 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) LOAD_DB2(sWMOAreaTableStore); LOAD_DB2(sWorldEffectStore); LOAD_DB2(sWorldMapOverlayStore); - LOAD_DB2(sWorldSafeLocsStore); - LOAD_DB2(sWorldStateExpressionStore); #undef LOAD_DB2 @@ -1031,9 +1022,6 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) for (RewardPackXItemEntry const* rewardPackXItem : sRewardPackXItemStore) _rewardPackItems[rewardPackXItem->RewardPackID].push_back(rewardPackXItem); - for (RulesetItemUpgradeEntry const* rulesetItemUpgrade : sRulesetItemUpgradeStore) - _rulesetItemUpgrade[rulesetItemUpgrade->ItemID] = rulesetItemUpgrade->ItemUpgradeID; - for (SkillLineEntry const* skill : sSkillLineStore) if (skill->ParentSkillLineID) _skillLinesByParentSkillLine[skill->ParentSkillLineID].push_back(skill); @@ -2353,15 +2341,6 @@ std::vector<RewardPackXItemEntry const*> const* DB2Manager::GetRewardPackItemsBy return nullptr; } -uint32 DB2Manager::GetRulesetItemUpgrade(uint32 itemId) const -{ - auto itr = _rulesetItemUpgrade.find(itemId); - if (itr != _rulesetItemUpgrade.end()) - return itr->second; - - return 0; -} - std::vector<SkillLineEntry const*> const* DB2Manager::GetSkillLinesForParentSkill(uint32 parentSkillId) const { return Trinity::Containers::MapGetValuePtr(_skillLinesByParentSkillLine, parentSkillId); diff --git a/src/server/game/DataStores/DB2Stores.h b/src/server/game/DataStores/DB2Stores.h index dc49e6d4559..bf00a0e4303 100644 --- a/src/server/game/DataStores/DB2Stores.h +++ b/src/server/game/DataStores/DB2Stores.h @@ -134,7 +134,6 @@ TC_GAME_API extern DB2Storage<ItemSetSpellEntry> sItemSetSpel TC_GAME_API extern DB2Storage<ItemSparseEntry> sItemSparseStore; TC_GAME_API extern DB2Storage<ItemSpecEntry> sItemSpecStore; TC_GAME_API extern DB2Storage<ItemSpecOverrideEntry> sItemSpecOverrideStore; -TC_GAME_API extern DB2Storage<ItemUpgradeEntry> sItemUpgradeStore; TC_GAME_API extern DB2Storage<LFGDungeonsEntry> sLFGDungeonsStore; TC_GAME_API extern DB2Storage<LiquidTypeEntry> sLiquidTypeStore; TC_GAME_API extern DB2Storage<LockEntry> sLockStore; @@ -211,7 +210,6 @@ TC_GAME_API extern DB2Storage<VehicleEntry> sVehicleStor TC_GAME_API extern DB2Storage<VehicleSeatEntry> sVehicleSeatStore; TC_GAME_API extern DB2Storage<WorldEffectEntry> sWorldEffectStore; TC_GAME_API extern DB2Storage<WorldMapOverlayEntry> sWorldMapOverlayStore; -TC_GAME_API extern DB2Storage<WorldSafeLocsEntry> sWorldSafeLocsStore; TC_GAME_API extern DB2Storage<WorldStateExpressionEntry> sWorldStateExpressionStore; struct TaxiPathBySourceAndDestination @@ -328,7 +326,6 @@ public: uint32 GetQuestUniqueBitFlag(uint32 questId); std::vector<RewardPackXCurrencyTypeEntry const*> const* GetRewardPackCurrencyTypesByRewardID(uint32 rewardPackID) const; std::vector<RewardPackXItemEntry const*> const* GetRewardPackItemsByRewardID(uint32 rewardPackID) const; - uint32 GetRulesetItemUpgrade(uint32 itemId) const; std::vector<SkillLineEntry const*> const* GetSkillLinesForParentSkill(uint32 parentSkillId) const; std::vector<SkillLineAbilityEntry const*> const* GetSkillLineAbilitiesBySkill(uint32 skillId) const; SkillRaceClassInfoEntry const* GetSkillRaceClassInfo(uint32 skill, uint8 race, uint8 class_); diff --git a/src/server/game/DataStores/DB2Structure.h b/src/server/game/DataStores/DB2Structure.h index c07ae8845ec..0beef77330c 100644 --- a/src/server/game/DataStores/DB2Structure.h +++ b/src/server/game/DataStores/DB2Structure.h @@ -1420,6 +1420,7 @@ struct ItemAppearanceEntry { uint32 ID; uint8 DisplayType; + int32 SubclassID; int32 ItemDisplayInfoID; int32 DefaultIconFileDataID; int32 UiOrder; @@ -1729,7 +1730,7 @@ struct ItemSparseEntry uint16 SocketMatchEnchantmentId; uint16 TotemCategoryID; uint16 InstanceBound; - uint16 ZoneBound; + uint16 ZoneBound[MAX_ITEM_PROTO_ZONES]; uint16 ItemSet; uint16 LockID; uint16 StartQuestID; @@ -1780,16 +1781,6 @@ struct ItemSpecOverrideEntry int32 ItemID; }; -struct ItemUpgradeEntry -{ - uint32 ID; - uint8 ItemUpgradePathID; - uint8 ItemLevelIncrement; - uint16 PrerequisiteID; - uint16 CurrencyType; - uint32 CurrencyAmount; -}; - struct ItemXBonusTreeEntry { uint32 ID; @@ -2205,9 +2196,9 @@ struct PowerDisplayEntry struct PowerTypeEntry { - uint32 ID; char const* NameGlobalStringTag; char const* CostGlobalStringTag; + uint32 ID; int8 PowerTypeEnum; int8 MinPower; int16 MaxBasePower; @@ -2356,13 +2347,6 @@ struct RewardPackXItemEntry int32 RewardPackID; }; -struct RulesetItemUpgradeEntry -{ - uint32 ID; - int32 ItemID; - uint16 ItemUpgradeID; -}; - struct ScalingStatDistributionEntry { uint32 ID; @@ -2611,12 +2595,12 @@ struct SpellDurationEntry struct SpellEffectEntry { uint32 ID; + int16 EffectAura; int32 DifficultyID; int32 EffectIndex; uint32 Effect; float EffectAmplitude; int32 EffectAttributes; - int16 EffectAura; int32 EffectAuraPeriod; float EffectBonusCoefficient; float EffectChainAmplitude; @@ -2726,6 +2710,7 @@ struct SpellLevelsEntry struct SpellMiscEntry { uint32 ID; + int32 Attributes[14]; uint8 DifficultyID; uint16 CastingTimeIndex; uint16 DurationIndex; @@ -2737,7 +2722,6 @@ struct SpellMiscEntry int32 SpellIconFileDataID; int32 ActiveIconFileDataID; int32 ContentTuningID; - int32 Attributes[14]; int32 SpellID; }; @@ -3013,6 +2997,7 @@ struct TransmogSetEntry uint8 ExpansionID; int32 PatchID; int16 UiOrder; + int32 PlayerConditionID; }; struct TransmogSetGroupEntry @@ -3106,7 +3091,7 @@ struct UnitPowerBarEntry LocalizedString* ToolTip; uint32 MinPower; uint32 MaxPower; - uint16 StartPower; + uint32 StartPower; uint8 CenterPower; float RegenerationPeace; float RegenerationCombat; @@ -3273,15 +3258,6 @@ struct WorldMapOverlayEntry uint32 AreaID[MAX_WORLD_MAP_OVERLAY_AREA_IDX]; }; -struct WorldSafeLocsEntry -{ - uint32 ID; - LocalizedString* AreaName; - DBCPosition3D Loc; - uint16 MapID; - float Facing; -}; - struct WorldStateExpressionEntry { uint32 ID; diff --git a/src/server/game/DataStores/DBCEnums.h b/src/server/game/DataStores/DBCEnums.h index 6bb6b4ebfa1..d33645346e2 100644 --- a/src/server/game/DataStores/DBCEnums.h +++ b/src/server/game/DataStores/DBCEnums.h @@ -166,7 +166,7 @@ enum ArtifactPowerFlag : uint8 #define MAX_ARTIFACT_TIER 1 -#define BATTLE_PET_SPECIES_MAX_ID 2775 +#define BATTLE_PET_SPECIES_MAX_ID 2796 enum ChrSpecializationFlag { @@ -510,11 +510,11 @@ enum CriteriaTypes : uint8 CRITERIA_TYPE_EARN_HONOR_XP = 207, CRITERIA_TYPE_RELIC_TALENT_UNLOCKED = 211, CRITERIA_TYPE_REACH_ACCOUNT_HONOR_LEVEL = 213, - CRITERIA_TREE_HEART_OF_AZEROTH_ARTIFACT_POWER_EARNED= 214, - CRITERIA_TREE_HEART_OF_AZEROTH_LEVEL_REACHED = 215 + CRITERIA_TYPE_HEART_OF_AZEROTH_ARTIFACT_POWER_EARNED= 214, + CRITERIA_TYPE_HEART_OF_AZEROTH_LEVEL_REACHED = 215 }; -#define CRITERIA_TYPE_TOTAL 217 +#define CRITERIA_TYPE_TOTAL 219 enum CriteriaTreeFlags : uint16 { @@ -624,6 +624,7 @@ enum Difficulty : uint8 DIFFICULTY_PVP_ISLAND = 45, DIFFICULTY_NORMAL_WARFRONT = 147, DIFFICULTY_HEROIC_WARFRONT = 149, + DIFFICULTY_LFR_15TH_ANNIVERSARY = 151, MAX_DIFFICULTY }; @@ -690,6 +691,7 @@ enum FactionMasks }; #define MAX_ITEM_PROTO_FLAGS 4 +#define MAX_ITEM_PROTO_ZONES 2 #define MAX_ITEM_PROTO_SOCKETS 3 #define MAX_ITEM_PROTO_STATS 10 diff --git a/src/server/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp index 6bd47efb600..cecf6d8b103 100644 --- a/src/server/game/Entities/Item/Item.cpp +++ b/src/server/game/Entities/Item/Item.cpp @@ -414,7 +414,6 @@ void Item::SaveToDB(CharacterDatabaseTransaction& trans) stmt->setUInt16(++index, m_itemData->Durability); stmt->setUInt32(++index, m_itemData->CreatePlayedTime); stmt->setString(++index, m_text); - stmt->setUInt32(++index, GetModifier(ITEM_MODIFIER_UPGRADE_ID)); stmt->setUInt32(++index, GetModifier(ITEM_MODIFIER_BATTLE_PET_SPECIES_ID)); stmt->setUInt32(++index, GetModifier(ITEM_MODIFIER_BATTLE_PET_BREED_DATA)); stmt->setUInt32(++index, GetModifier(ITEM_MODIFIER_BATTLE_PET_LEVEL)); @@ -545,7 +544,7 @@ void Item::SaveToDB(CharacterDatabaseTransaction& trans) static ItemModifier const modifiersTable[] = { - ITEM_MODIFIER_SCALING_STAT_DISTRIBUTION_FIXED_LEVEL, + ITEM_MODIFIER_TIMEWALKER_LEVEL, ITEM_MODIFIER_ARTIFACT_KNOWLEDGE_LEVEL }; @@ -557,7 +556,7 @@ void Item::SaveToDB(CharacterDatabaseTransaction& trans) { stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_ITEM_INSTANCE_MODIFIERS); stmt->setUInt64(0, GetGUID().GetCounter()); - stmt->setUInt32(1, GetModifier(ITEM_MODIFIER_SCALING_STAT_DISTRIBUTION_FIXED_LEVEL)); + stmt->setUInt32(1, GetModifier(ITEM_MODIFIER_TIMEWALKER_LEVEL)); stmt->setUInt32(2, GetModifier(ITEM_MODIFIER_ARTIFACT_KNOWLEDGE_LEVEL)); trans->Append(stmt); } @@ -621,15 +620,15 @@ bool Item::LoadFromDB(ObjectGuid::LowType guid, ObjectGuid ownerGuid, Field* fie { // 0 1 2 3 4 5 6 7 8 9 10 11 12 // SELECT guid, itemEntry, creatorGuid, giftCreatorGuid, count, duration, charges, flags, enchantments, randomPropertyId, durability, playedTime, text, - // 13 14 15 16 17 18 19 - // upgradeId, battlePetSpeciesId, battlePetBreedData, battlePetLevel, battlePetDisplayId, context, bonusListIDs, - // 20 21 22 23 24 + // 13 14 15 16 17 18 + // battlePetSpeciesId, battlePetBreedData, battlePetLevel, battlePetDisplayId, context, bonusListIDs, + // 19 20 21 22 23 // itemModifiedAppearanceAllSpecs, itemModifiedAppearanceSpec1, itemModifiedAppearanceSpec2, itemModifiedAppearanceSpec3, itemModifiedAppearanceSpec4, - // 25 26 27 28 29 + // 24 25 26 27 28 // spellItemEnchantmentAllSpecs, spellItemEnchantmentSpec1, spellItemEnchantmentSpec2, spellItemEnchantmentSpec3, spellItemEnchantmentSpec4, - // 30 31 32 33 34 35 36 37 38 39 40 41 + // 29 30 31 32 33 34 35 36 37 38 39 40 // gemItemId1, gemBonuses1, gemContext1, gemScalingLevel1, gemItemId2, gemBonuses2, gemContext2, gemScalingLevel2, gemItemId3, gemBonuses3, gemContext3, gemScalingLevel3 - // 42 43 + // 41 42 // fixedScalingLevel, artifactKnowledgeLevel FROM item_instance // create item before any checks for store correct guid @@ -692,67 +691,51 @@ bool Item::LoadFromDB(ObjectGuid::LowType guid, ObjectGuid ownerGuid, Field* fie SetCreatePlayedTime(fields[11].GetUInt32()); SetText(fields[12].GetString()); - uint32 upgradeId = fields[13].GetUInt32(); - ItemUpgradeEntry const* rulesetUpgrade = sItemUpgradeStore.LookupEntry(sDB2Manager.GetRulesetItemUpgrade(entry)); - ItemUpgradeEntry const* upgrade = sItemUpgradeStore.LookupEntry(upgradeId); - if (!rulesetUpgrade || !upgrade || rulesetUpgrade->ItemUpgradePathID != upgrade->ItemUpgradePathID) - { - upgradeId = 0; - need_save = true; - } - - if (rulesetUpgrade && !upgradeId) - { - upgradeId = rulesetUpgrade->ID; - need_save = true; - } - - SetModifier(ITEM_MODIFIER_UPGRADE_ID, upgradeId); - SetModifier(ITEM_MODIFIER_BATTLE_PET_SPECIES_ID, fields[14].GetUInt32()); - SetModifier(ITEM_MODIFIER_BATTLE_PET_BREED_DATA, fields[15].GetUInt32()); - SetModifier(ITEM_MODIFIER_BATTLE_PET_LEVEL, fields[16].GetUInt16()); - SetModifier(ITEM_MODIFIER_BATTLE_PET_DISPLAY_ID, fields[17].GetUInt32()); + SetModifier(ITEM_MODIFIER_BATTLE_PET_SPECIES_ID, fields[13].GetUInt32()); + SetModifier(ITEM_MODIFIER_BATTLE_PET_BREED_DATA, fields[14].GetUInt32()); + SetModifier(ITEM_MODIFIER_BATTLE_PET_LEVEL, fields[15].GetUInt16()); + SetModifier(ITEM_MODIFIER_BATTLE_PET_DISPLAY_ID, fields[16].GetUInt32()); - SetContext(fields[18].GetUInt8()); + SetContext(fields[17].GetUInt8()); - Tokenizer bonusListString(fields[19].GetString(), ' '); + Tokenizer bonusListString(fields[18].GetString(), ' '); std::vector<int32> bonusListIDs; bonusListIDs.reserve(bonusListString.size()); for (char const* token : bonusListString) bonusListIDs.push_back(atoi(token)); SetBonuses(std::move(bonusListIDs)); - SetModifier(ITEM_MODIFIER_TRANSMOG_APPEARANCE_ALL_SPECS, fields[20].GetUInt32()); - SetModifier(ITEM_MODIFIER_TRANSMOG_APPEARANCE_SPEC_1, fields[21].GetUInt32()); - SetModifier(ITEM_MODIFIER_TRANSMOG_APPEARANCE_SPEC_2, fields[22].GetUInt32()); - SetModifier(ITEM_MODIFIER_TRANSMOG_APPEARANCE_SPEC_3, fields[23].GetUInt32()); - SetModifier(ITEM_MODIFIER_TRANSMOG_APPEARANCE_SPEC_4, fields[24].GetUInt32()); + SetModifier(ITEM_MODIFIER_TRANSMOG_APPEARANCE_ALL_SPECS, fields[19].GetUInt32()); + SetModifier(ITEM_MODIFIER_TRANSMOG_APPEARANCE_SPEC_1, fields[20].GetUInt32()); + SetModifier(ITEM_MODIFIER_TRANSMOG_APPEARANCE_SPEC_2, fields[21].GetUInt32()); + SetModifier(ITEM_MODIFIER_TRANSMOG_APPEARANCE_SPEC_3, fields[22].GetUInt32()); + SetModifier(ITEM_MODIFIER_TRANSMOG_APPEARANCE_SPEC_4, fields[23].GetUInt32()); - SetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION_ALL_SPECS, fields[25].GetUInt32()); - SetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_1, fields[26].GetUInt32()); - SetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_2, fields[27].GetUInt32()); - SetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_3, fields[28].GetUInt32()); - SetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_4, fields[29].GetUInt32()); + SetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION_ALL_SPECS, fields[24].GetUInt32()); + SetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_1, fields[25].GetUInt32()); + SetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_2, fields[26].GetUInt32()); + SetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_3, fields[27].GetUInt32()); + SetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_4, fields[28].GetUInt32()); uint32 const gemFields = 4; ItemDynamicFieldGems gemData[MAX_GEM_SOCKETS]; memset(gemData, 0, sizeof(gemData)); for (uint32 i = 0; i < MAX_GEM_SOCKETS; ++i) { - gemData[i].ItemId = fields[30 + i * gemFields].GetUInt32(); - Tokenizer gemBonusListIDs(fields[31 + i * gemFields].GetString(), ' '); + gemData[i].ItemId = fields[29 + i * gemFields].GetUInt32(); + Tokenizer gemBonusListIDs(fields[30 + i * gemFields].GetString(), ' '); uint32 b = 0; for (char const* token : gemBonusListIDs) if (uint32 bonusListID = atoul(token)) gemData[i].BonusListIDs[b++] = bonusListID; - gemData[i].Context = fields[32 + i * gemFields].GetUInt8(); + gemData[i].Context = fields[31 + i * gemFields].GetUInt8(); if (gemData[i].ItemId) - SetGem(i, &gemData[i], fields[33 + i * gemFields].GetUInt32()); + SetGem(i, &gemData[i], fields[32 + i * gemFields].GetUInt32()); } - SetModifier(ITEM_MODIFIER_SCALING_STAT_DISTRIBUTION_FIXED_LEVEL, fields[42].GetUInt32()); - SetModifier(ITEM_MODIFIER_ARTIFACT_KNOWLEDGE_LEVEL, fields[43].GetUInt32()); + SetModifier(ITEM_MODIFIER_TIMEWALKER_LEVEL, fields[41].GetUInt32()); + SetModifier(ITEM_MODIFIER_ARTIFACT_KNOWLEDGE_LEVEL, fields[42].GetUInt32()); // Enchants must be loaded after all other bonus/scaling data Tokenizer enchantmentTokens(fields[8].GetString(), ' '); @@ -782,7 +765,6 @@ bool Item::LoadFromDB(ObjectGuid::LowType guid, ObjectGuid ownerGuid, Field* fie stmt->setUInt32(index++, m_itemData->Expiration); stmt->setUInt32(index++, m_itemData->DynamicFlags); stmt->setUInt32(index++, m_itemData->Durability); - stmt->setUInt32(index++, GetModifier(ITEM_MODIFIER_UPGRADE_ID)); stmt->setUInt64(index++, guid); CharacterDatabase.Execute(stmt); } @@ -1319,7 +1301,8 @@ uint8 Item::GetGemCountWithLimitCategory(uint32 limitCategory) const bool Item::IsLimitedToAnotherMapOrZone(uint32 cur_mapId, uint32 cur_zoneId) const { ItemTemplate const* proto = GetTemplate(); - return proto && ((proto->GetMap() && proto->GetMap() != cur_mapId) || (proto->GetArea() && proto->GetArea() != cur_zoneId)); + return proto && ((proto->GetMap() && proto->GetMap() != cur_mapId) || + ((proto->GetArea(0) && proto->GetArea(0) != cur_zoneId) && (proto->GetArea(1) && proto->GetArea(1) != cur_zoneId))); } void Item::SendUpdateSockets() @@ -2134,11 +2117,11 @@ uint32 Item::GetItemLevel(Player const* owner) const uint32 minItemLevelCutoff = owner->m_unitData->MinItemLevelCutoff; uint32 maxItemLevel = GetTemplate()->GetFlags3() & ITEM_FLAG3_IGNORE_ITEM_LEVEL_CAP_IN_PVP ? 0 : owner->m_unitData->MaxItemLevel; bool pvpBonus = owner->IsUsingPvpItemLevels(); - return Item::GetItemLevel(GetTemplate(), _bonusData, owner->getLevel(), GetModifier(ITEM_MODIFIER_SCALING_STAT_DISTRIBUTION_FIXED_LEVEL), GetModifier(ITEM_MODIFIER_UPGRADE_ID), + return Item::GetItemLevel(GetTemplate(), _bonusData, owner->getLevel(), GetModifier(ITEM_MODIFIER_TIMEWALKER_LEVEL), minItemLevel, minItemLevelCutoff, maxItemLevel, pvpBonus); } -uint32 Item::GetItemLevel(ItemTemplate const* itemTemplate, BonusData const& bonusData, uint32 level, uint32 fixedLevel, uint32 upgradeId, +uint32 Item::GetItemLevel(ItemTemplate const* itemTemplate, BonusData const& bonusData, uint32 level, uint32 fixedLevel, uint32 minItemLevel, uint32 minItemLevelCutoff, uint32 maxItemLevel, bool pvpBonus) { if (!itemTemplate) @@ -2166,8 +2149,6 @@ uint32 Item::GetItemLevel(ItemTemplate const* itemTemplate, BonusData const& bon itemLevel += bonusData.GemItemLevelBonus[i]; uint32 itemLevelBeforeUpgrades = itemLevel; - if (ItemUpgradeEntry const* upgrade = sItemUpgradeStore.LookupEntry(upgradeId)) - itemLevel += upgrade->ItemLevelIncrement; if (pvpBonus) itemLevel += sDB2Manager.GetPvpItemLevelBonus(itemTemplate->GetId()); @@ -2210,7 +2191,7 @@ ItemDisenchantLootEntry const* Item::GetDisenchantLoot(ItemTemplate const* itemT if (itemTemplate->GetFlags() & (ITEM_FLAG_CONJURED | ITEM_FLAG_NO_DISENCHANT) || itemTemplate->GetBonding() == BIND_QUEST) return nullptr; - if (itemTemplate->GetArea() || itemTemplate->GetMap() || itemTemplate->GetMaxStackSize() > 1) + if (itemTemplate->GetArea(0) || itemTemplate->GetArea(1) || itemTemplate->GetMap() || itemTemplate->GetMaxStackSize() > 1) return nullptr; if (!Item::GetSellPrice(itemTemplate, quality, itemLevel) && !sDB2Manager.HasItemCurrencyCost(itemTemplate->GetId())) @@ -2578,7 +2559,7 @@ void Item::GiveArtifactXp(uint64 amount, Item* sourceItem, uint32 artifactCatego void Item::SetFixedLevel(uint8 level) { - if (!_bonusData.HasFixedLevel || GetModifier(ITEM_MODIFIER_SCALING_STAT_DISTRIBUTION_FIXED_LEVEL)) + if (!_bonusData.HasFixedLevel || GetModifier(ITEM_MODIFIER_TIMEWALKER_LEVEL)) return; if (ScalingStatDistributionEntry const* ssd = sScalingStatDistributionStore.LookupEntry(_bonusData.ScalingStatDistribution)) @@ -2589,7 +2570,7 @@ void Item::SetFixedLevel(uint8 level) if ((contentTuning->Flags & 2 || contentTuning->MinLevel || contentTuning->MaxLevel) && !(contentTuning->Flags & 4)) level = std::min(std::max(int32(level), contentTuning->MinLevel), contentTuning->MaxLevel); - SetModifier(ITEM_MODIFIER_SCALING_STAT_DISTRIBUTION_FIXED_LEVEL, level); + SetModifier(ITEM_MODIFIER_TIMEWALKER_LEVEL, level); } } @@ -2598,7 +2579,7 @@ int32 Item::GetRequiredLevel() const if (_bonusData.RequiredLevelOverride) return _bonusData.RequiredLevelOverride; else if (_bonusData.HasFixedLevel) - return GetModifier(ITEM_MODIFIER_SCALING_STAT_DISTRIBUTION_FIXED_LEVEL); + return GetModifier(ITEM_MODIFIER_TIMEWALKER_LEVEL); else return _bonusData.RequiredLevel; } diff --git a/src/server/game/Entities/Item/Item.h b/src/server/game/Entities/Item/Item.h index b5f9897a3e8..b8a8c242ba1 100644 --- a/src/server/game/Entities/Item/Item.h +++ b/src/server/game/Entities/Item/Item.h @@ -280,7 +280,7 @@ class TC_GAME_API Item : public Object bool IsRangedWeapon() const { return GetTemplate()->IsRangedWeapon(); } uint32 GetQuality() const { return _bonusData.Quality; } uint32 GetItemLevel(Player const* owner) const; - static uint32 GetItemLevel(ItemTemplate const* itemTemplate, BonusData const& bonusData, uint32 level, uint32 fixedLevel, uint32 upgradeId, + static uint32 GetItemLevel(ItemTemplate const* itemTemplate, BonusData const& bonusData, uint32 level, uint32 fixedLevel, uint32 minItemLevel, uint32 minItemLevelCutoff, uint32 maxItemLevel, bool pvpBonus); int32 GetRequiredLevel() const; int32 GetItemStatType(uint32 index) const { ASSERT(index < MAX_ITEM_PROTO_STATS); return _bonusData.ItemStatType[index]; } diff --git a/src/server/game/Entities/Item/ItemDefines.h b/src/server/game/Entities/Item/ItemDefines.h index 594071587c3..47887c869df 100644 --- a/src/server/game/Entities/Item/ItemDefines.h +++ b/src/server/game/Entities/Item/ItemDefines.h @@ -194,7 +194,7 @@ enum ItemModifier : uint16 ITEM_MODIFIER_BATTLE_PET_DISPLAY_ID = 6, ITEM_MODIFIER_ENCHANT_ILLUSION_ALL_SPECS = 7, ITEM_MODIFIER_ARTIFACT_APPEARANCE_ID = 8, - ITEM_MODIFIER_SCALING_STAT_DISTRIBUTION_FIXED_LEVEL = 9, + ITEM_MODIFIER_TIMEWALKER_LEVEL = 9, ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_1 = 10, ITEM_MODIFIER_TRANSMOG_APPEARANCE_SPEC_2 = 11, ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_2 = 12, @@ -207,9 +207,11 @@ enum ItemModifier : uint16 ITEM_MODIFIER_CHALLENGE_KEYSTONE_AFFIX_ID_1 = 19, ITEM_MODIFIER_CHALLENGE_KEYSTONE_AFFIX_ID_2 = 20, ITEM_MODIFIER_CHALLENGE_KEYSTONE_AFFIX_ID_3 = 21, - ITEM_MODIFIER_CHALLENGE_KEYSTONE_IS_CHARGED = 22, + ITEM_MODIFIER_CHALLENGE_KEYSTONE_AFFIX_ID_4 = 22, ITEM_MODIFIER_ARTIFACT_KNOWLEDGE_LEVEL = 23, ITEM_MODIFIER_ARTIFACT_TIER = 24, + ITEM_MODIFIER_UNUSED_25 = 25, + ITEM_MODIFIER_PVP_RATING = 26, MAX_ITEM_MODIFIERS }; diff --git a/src/server/game/Entities/Item/ItemTemplate.h b/src/server/game/Entities/Item/ItemTemplate.h index e44d33063cf..2f3d5b805a4 100644 --- a/src/server/game/Entities/Item/ItemTemplate.h +++ b/src/server/game/Entities/Item/ItemTemplate.h @@ -766,7 +766,7 @@ struct TC_GAME_API ItemTemplate uint32 GetStartQuest() const { return ExtendedData->StartQuestID; } uint32 GetLockID() const { return ExtendedData->LockID; } uint32 GetItemSet() const { return ExtendedData->ItemSet; } - uint32 GetArea() const { return ExtendedData->ZoneBound; } + uint32 GetArea(uint32 index) const { ASSERT(index < MAX_ITEM_PROTO_ZONES); return ExtendedData->ZoneBound[index]; } uint32 GetMap() const { return ExtendedData->InstanceBound; } uint32 GetBagFamily() const { return ExtendedData->BagFamily; } uint32 GetTotemCategory() const { return ExtendedData->TotemCategoryID; } diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 6b1d82452d7..1512b07540e 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -4738,12 +4738,12 @@ void Player::RepopAtGraveyard() // and don't show spirit healer location if (ClosestGrave) { - TeleportTo(ClosestGrave->MapID, ClosestGrave->Loc.X, ClosestGrave->Loc.Y, ClosestGrave->Loc.Z, (ClosestGrave->Facing * M_PI) / 180); // Orientation is initially in degrees + TeleportTo(ClosestGrave->Loc); if (isDead()) // not send if alive, because it used in TeleportTo() { WorldPackets::Misc::DeathReleaseLoc packet; - packet.MapID = ClosestGrave->MapID; - packet.Loc = Position(ClosestGrave->Loc.X, ClosestGrave->Loc.Y, ClosestGrave->Loc.Z); + packet.MapID = ClosestGrave->Loc.GetMapId(); + packet.Loc = ClosestGrave->Loc; GetSession()->SendPacket(packet.Write()); } } @@ -11801,9 +11801,6 @@ Item* Player::StoreNewItem(ItemPosCountVec const& pos, uint32 itemId, bool updat item->AddItemFlag(ITEM_FIELD_FLAG_NEW_ITEM); - if (uint32 upgradeID = sDB2Manager.GetRulesetItemUpgrade(itemId)) - item->SetModifier(ITEM_MODIFIER_UPGRADE_ID, upgradeID); - item->SetContext(context); item->SetBonuses(bonusListIDs); @@ -18575,17 +18572,17 @@ void Player::_LoadInventory(PreparedQueryResult result, PreparedQueryResult arti { // 0 1 2 3 4 5 6 7 8 9 10 11 12 // SELECT guid, itemEntry, creatorGuid, giftCreatorGuid, count, duration, charges, flags, enchantments, randomPropertyId, durability, playedTime, text, - // 13 14 15 16 17 18 19 - // upgradeId, battlePetSpeciesId, battlePetBreedData, battlePetLevel, battlePetDisplayId, context, bonusListIDs, - // 20 21 22 23 24 + // 13 14 15 16 17 18 + // battlePetSpeciesId, battlePetBreedData, battlePetLevel, battlePetDisplayId, context, bonusListIDs, + // 19 20 21 22 23 // itemModifiedAppearanceAllSpecs, itemModifiedAppearanceSpec1, itemModifiedAppearanceSpec2, itemModifiedAppearanceSpec3, itemModifiedAppearanceSpec4, - // 25 26 27 28 29 + // 24 25 26 27 28 // spellItemEnchantmentAllSpecs, spellItemEnchantmentSpec1, spellItemEnchantmentSpec2, spellItemEnchantmentSpec3, spellItemEnchantmentSpec4, - // 30 31 32 33 34 35 36 37 38 39 40 41 + // 29 30 31 32 33 34 35 36 37 38 39 40 // gemItemId1, gemBonuses1, gemContext1, gemScalingLevel1, gemItemId2, gemBonuses2, gemContext2, gemScalingLevel2, gemItemId3, gemBonuses3, gemContext3, gemScalingLevel3 - // 42 43 + // 41 42 // fixedScalingLevel, artifactKnowledgeLevel FROM item_instance - // 45 46 + // 43 44 // bag, slot // FROM character_inventory ci // JOIN item_instance ii ON ci.item = ii.guid @@ -18654,8 +18651,8 @@ void Player::_LoadInventory(PreparedQueryResult result, PreparedQueryResult arti if (item->GetTemplate()->GetArtifactID() && artifactDataItr != artifactData.end()) item->LoadArtifactData(this, std::get<0>(artifactDataItr->second), std::get<1>(artifactDataItr->second), std::get<2>(artifactDataItr->second), std::get<3>(artifactDataItr->second)); - ObjectGuid bagGuid = fields[44].GetUInt64() ? ObjectGuid::Create<HighGuid::Item>(fields[44].GetUInt64()) : ObjectGuid::Empty; - uint8 slot = fields[45].GetUInt8(); + ObjectGuid bagGuid = fields[43].GetUInt64() ? ObjectGuid::Create<HighGuid::Item>(fields[43].GetUInt64()) : ObjectGuid::Empty; + uint8 slot = fields[44].GetUInt8(); GetSession()->GetCollectionMgr()->CheckHeirloomUpgrades(item); GetSession()->GetCollectionMgr()->AddItemAppearance(item); @@ -18782,7 +18779,7 @@ void Player::_LoadVoidStorage(PreparedQueryResult result) do { - // SELECT itemId, itemEntry, slot, creatorGuid, randomBonusListId, upgradeId, fixedScalingLevel, artifactKnowledgeLevel, context, bonusListIDs FROM character_void_storage WHERE playerGuid = ? + // SELECT itemId, itemEntry, slot, creatorGuid, randomBonusListId, fixedScalingLevel, artifactKnowledgeLevel, context, bonusListIDs FROM character_void_storage WHERE playerGuid = ? Field* fields = result->Fetch(); uint64 itemId = fields[0].GetUInt64(); @@ -18790,12 +18787,11 @@ void Player::_LoadVoidStorage(PreparedQueryResult result) uint8 slot = fields[2].GetUInt8(); ObjectGuid creatorGuid = fields[3].GetUInt64() ? ObjectGuid::Create<HighGuid::Player>(fields[3].GetUInt64()) : ObjectGuid::Empty; ItemRandomBonusListId randomBonusListId = fields[4].GetUInt32(); - uint32 upgradeId = fields[5].GetUInt32(); - uint32 fixedScalingLevel = fields[6].GetUInt32(); - uint32 artifactKnowledgeLevel = fields[7].GetUInt32(); - uint8 context = fields[8].GetUInt8(); + uint32 fixedScalingLevel = fields[5].GetUInt32(); + uint32 artifactKnowledgeLevel = fields[6].GetUInt32(); + uint8 context = fields[7].GetUInt8(); std::vector<int32> bonusListIDs; - Tokenizer bonusListIdTokens(fields[9].GetString(), ' '); + Tokenizer bonusListIdTokens(fields[8].GetString(), ' '); for (char const* token : bonusListIdTokens) bonusListIDs.push_back(atoul(token)); @@ -18820,7 +18816,7 @@ void Player::_LoadVoidStorage(PreparedQueryResult result) continue; } - _voidStorageItems[slot] = new VoidStorageItem(itemId, itemEntry, creatorGuid, randomBonusListId, upgradeId, fixedScalingLevel, artifactKnowledgeLevel, + _voidStorageItems[slot] = new VoidStorageItem(itemId, itemEntry, creatorGuid, randomBonusListId, fixedScalingLevel, artifactKnowledgeLevel, context, bonusListIDs); WorldPackets::Item::ItemInstance voidInstance; @@ -18997,7 +18993,7 @@ void Player::_LoadMailedItems(Mail* mail) Item* item = NewItemOrBag(proto); - ObjectGuid ownerGuid = fields[44].GetUInt64() ? ObjectGuid::Create<HighGuid::Player>(fields[44].GetUInt64()) : ObjectGuid::Empty; + ObjectGuid ownerGuid = fields[43].GetUInt64() ? ObjectGuid::Create<HighGuid::Player>(fields[43].GetUInt64()) : ObjectGuid::Empty; if (!item->LoadFromDB(itemGuid, ownerGuid, fields, itemEntry)) { TC_LOG_ERROR("entities.player", "Player::_LoadMailedItems: Item (GUID: " UI64FMTD ") in mail (%u) doesn't exist, deleted from mail.", itemGuid, mail->messageID); @@ -20593,14 +20589,13 @@ void Player::_SaveVoidStorage(CharacterDatabaseTransaction& trans) stmt->setUInt8(3, i); stmt->setUInt64(4, _voidStorageItems[i]->CreatorGuid.GetCounter()); stmt->setUInt32(5, _voidStorageItems[i]->RandomBonusListId); - stmt->setUInt32(6, _voidStorageItems[i]->ItemUpgradeId); - stmt->setUInt32(7, _voidStorageItems[i]->FixedScalingLevel); - stmt->setUInt32(8, _voidStorageItems[i]->ArtifactKnowledgeLevel); - stmt->setUInt8(9, _voidStorageItems[i]->Context); + stmt->setUInt32(6, _voidStorageItems[i]->FixedScalingLevel); + stmt->setUInt32(7, _voidStorageItems[i]->ArtifactKnowledgeLevel); + stmt->setUInt8(8, _voidStorageItems[i]->Context); std::ostringstream bonusListIDs; for (int32 bonusListID : _voidStorageItems[i]->BonusListIDs) bonusListIDs << bonusListID << ' '; - stmt->setString(10, bonusListIDs.str()); + stmt->setString(9, bonusListIDs.str()); } trans->Append(stmt); @@ -23149,8 +23144,8 @@ void Player::SetBattlegroundEntryPoint() // If map is dungeon find linked graveyard if (GetMap()->IsDungeon()) { - if (const WorldSafeLocsEntry* entry = sObjectMgr->GetClosestGraveYard(*this, GetTeam(), this)) - m_bgData.joinPos = WorldLocation(entry->MapID, entry->Loc.X, entry->Loc.Y, entry->Loc.Z, 0.0f); + if (WorldSafeLocsEntry const* entry = sObjectMgr->GetClosestGraveYard(*this, GetTeam(), this)) + m_bgData.joinPos.WorldRelocate(entry->Loc.GetMapId(), entry->Loc.GetPositionX(), entry->Loc.GetPositionY(), entry->Loc.GetPositionZ()); else TC_LOG_ERROR("entities.player", "Player::SetBattlegroundEntryPoint: Dungeon (MapID: %u) has no linked graveyard, setting home location as entry point.", GetMapId()); } diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 83a0e5fb60c..f7c8ae952d1 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -899,23 +899,21 @@ struct BGData struct VoidStorageItem { - VoidStorageItem() : ItemId(0), ItemEntry(0), RandomBonusListId(0), ItemUpgradeId(0), FixedScalingLevel(0), ArtifactKnowledgeLevel(0), Context(0) { } + VoidStorageItem() : ItemId(0), ItemEntry(0), RandomBonusListId(0), FixedScalingLevel(0), ArtifactKnowledgeLevel(0), Context(0) { } VoidStorageItem(uint64 id, uint32 entry, ObjectGuid const& creator, ItemRandomBonusListId randomBonusListId, - uint32 upgradeId, uint32 fixedScalingLevel, uint32 artifactKnowledgeLevel, uint8 context, std::vector<int32> const& bonuses) + uint32 fixedScalingLevel, uint32 artifactKnowledgeLevel, uint8 context, std::vector<int32> const& bonuses) : ItemId(id), ItemEntry(entry), CreatorGuid(creator), RandomBonusListId(randomBonusListId), - ItemUpgradeId(upgradeId), FixedScalingLevel(fixedScalingLevel), ArtifactKnowledgeLevel(artifactKnowledgeLevel), Context(context) + FixedScalingLevel(fixedScalingLevel), ArtifactKnowledgeLevel(artifactKnowledgeLevel), Context(context) { BonusListIDs.insert(BonusListIDs.end(), bonuses.begin(), bonuses.end()); } VoidStorageItem(VoidStorageItem&& vsi) noexcept : ItemId(vsi.ItemId), ItemEntry(vsi.ItemEntry), CreatorGuid(vsi.CreatorGuid), RandomBonusListId(vsi.RandomBonusListId), - ItemUpgradeId(vsi.ItemUpgradeId), FixedScalingLevel(vsi.FixedScalingLevel), - ArtifactKnowledgeLevel(vsi.ArtifactKnowledgeLevel), Context(vsi.Context), BonusListIDs(std::move(vsi.BonusListIDs)) { } + FixedScalingLevel(vsi.FixedScalingLevel), ArtifactKnowledgeLevel(vsi.ArtifactKnowledgeLevel), Context(vsi.Context), BonusListIDs(std::move(vsi.BonusListIDs)) { } uint64 ItemId; uint32 ItemEntry; ObjectGuid CreatorGuid; ItemRandomBonusListId RandomBonusListId; - uint32 ItemUpgradeId; uint32 FixedScalingLevel; uint32 ArtifactKnowledgeLevel; uint8 Context; diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index ac4120e5632..0f33a3bd4fd 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -6266,7 +6266,7 @@ void ObjectMgr::LoadGraveyardZones() uint32 zoneId = fields[1].GetUInt32(); uint32 team = fields[2].GetUInt16(); - WorldSafeLocsEntry const* entry = sWorldSafeLocsStore.LookupEntry(safeLocId); + WorldSafeLocsEntry const* entry = GetWorldSafeLoc(safeLocId); if (!entry) { TC_LOG_ERROR("sql.sql", "Table `graveyard_zone` has a record for non-existing graveyard (WorldSafeLocsID: %u), skipped.", safeLocId); @@ -6302,9 +6302,9 @@ WorldSafeLocsEntry const* ObjectMgr::GetDefaultGraveYard(uint32 team) const }; if (team == HORDE) - return sWorldSafeLocsStore.LookupEntry(HORDE_GRAVEYARD); + return GetWorldSafeLoc(HORDE_GRAVEYARD); else if (team == ALLIANCE) - return sWorldSafeLocsStore.LookupEntry(ALLIANCE_GRAVEYARD); + return GetWorldSafeLoc(ALLIANCE_GRAVEYARD); else return nullptr; } @@ -6365,7 +6365,7 @@ WorldSafeLocsEntry const* ObjectMgr::GetClosestGraveYard(WorldLocation const& lo { GraveYardData const& data = range.first->second; - WorldSafeLocsEntry const* entry = sWorldSafeLocsStore.AssertEntry(data.safeLocId); + WorldSafeLocsEntry const* entry = ASSERT_NOTNULL(GetWorldSafeLoc(data.safeLocId)); // skip enemy faction graveyard // team == 0 case can be at call from .neargrave @@ -6377,17 +6377,17 @@ WorldSafeLocsEntry const* ObjectMgr::GetClosestGraveYard(WorldLocation const& lo if (!sConditionMgr->IsObjectMeetingNotGroupedConditions(CONDITION_SOURCE_TYPE_GRAVEYARD, data.safeLocId, conditionSource)) continue; - if (int16(entry->MapID) == mapEntry->ParentMapID && !conditionObject->GetPhaseShift().HasVisibleMapId(entry->MapID)) + if (int16(entry->Loc.GetMapId()) == mapEntry->ParentMapID && !conditionObject->GetPhaseShift().HasVisibleMapId(entry->Loc.GetMapId())) continue; } // find now nearest graveyard at other map - if (MapId != entry->MapID && int16(entry->MapID) != mapEntry->ParentMapID) + if (MapId != entry->Loc.GetMapId() && int16(entry->Loc.GetMapId()) != mapEntry->ParentMapID) { // if find graveyard at different map from where entrance placed (or no entrance data), use any first if (!mapEntry || mapEntry->CorpseMapID < 0 - || uint32(mapEntry->CorpseMapID) != entry->MapID + || uint32(mapEntry->CorpseMapID) != entry->Loc.GetMapId() || (mapEntry->Corpse.X == 0 && mapEntry->Corpse.Y == 0)) // Check X and Y { // not have any corrdinates for check distance anyway @@ -6396,8 +6396,8 @@ WorldSafeLocsEntry const* ObjectMgr::GetClosestGraveYard(WorldLocation const& lo } // at entrance map calculate distance (2D); - float dist2 = (entry->Loc.X - mapEntry->Corpse.X)*(entry->Loc.X - mapEntry->Corpse.X) - +(entry->Loc.Y - mapEntry->Corpse.Y)*(entry->Loc.Y - mapEntry->Corpse.Y); + float dist2 = (entry->Loc.GetPositionX() - mapEntry->Corpse.X) * (entry->Loc.GetPositionX() - mapEntry->Corpse.X) + + (entry->Loc.GetPositionY() - mapEntry->Corpse.Y) * (entry->Loc.GetPositionY() - mapEntry->Corpse.Y); if (foundEntr) { if (dist2 < distEntr) @@ -6416,7 +6416,9 @@ WorldSafeLocsEntry const* ObjectMgr::GetClosestGraveYard(WorldLocation const& lo // find now nearest graveyard at same map else { - float dist2 = (entry->Loc.X - x)*(entry->Loc.X - x)+(entry->Loc.Y - y)*(entry->Loc.Y - y)+(entry->Loc.Z - z)*(entry->Loc.Z - z); + float dist2 = (entry->Loc.GetPositionX() - x) * (entry->Loc.GetPositionX() - x) + + (entry->Loc.GetPositionY() - y) * (entry->Loc.GetPositionY() - y) + + (entry->Loc.GetPositionZ() - z) * (entry->Loc.GetPositionZ() - z); if (foundNear) { if (dist2 < distNear) @@ -6455,6 +6457,46 @@ GraveYardData const* ObjectMgr::FindGraveYardData(uint32 id, uint32 zoneId) cons return nullptr; } +void ObjectMgr::LoadWorldSafeLocs() +{ + uint32 oldMSTime = getMSTime(); + + // 0 1 2 3 4 5 + if (QueryResult result = WorldDatabase.Query("SELECT ID, MapID, LocX, LocY, LocZ, Facing FROM world_safe_locs")) + { + do + { + Field* fields = result->Fetch(); + uint32 id = fields[0].GetUInt32(); + WorldLocation loc(fields[1].GetUInt32(), fields[2].GetFloat(), fields[3].GetFloat(), fields[4].GetFloat(), fields[5].GetFloat()); + if (!MapManager::IsValidMapCoord(loc)) + { + TC_LOG_ERROR("sql.sql", "World location (ID: %u) has a invalid position MapID: %u %s, skipped", id, loc.GetMapId(), loc.ToString().c_str()); + continue; + } + + WorldSafeLocsEntry& worldSafeLocs = _worldSafeLocs[id]; + worldSafeLocs.ID = id; + worldSafeLocs.Loc.WorldRelocate(loc); + + } while (result->NextRow()); + + TC_LOG_INFO("server.loading", ">> Loaded " SZFMTD " world locations %u ms", _worldSafeLocs.size(), GetMSTimeDiffToNow(oldMSTime)); + } + else + TC_LOG_INFO("server.loading", ">> Loaded 0 world locations. DB table `world_safe_locs` is empty."); +} + +WorldSafeLocsEntry const* ObjectMgr::GetWorldSafeLoc(uint32 id) const +{ + return Trinity::Containers::MapGetValuePtr(_worldSafeLocs, id); +} + +Trinity::IteratorPair<std::unordered_map<uint32, WorldSafeLocsEntry>::const_iterator> ObjectMgr::GetWorldSafeLocs() const +{ + return std::make_pair(_worldSafeLocs.begin(), _worldSafeLocs.end()); +} + AreaTriggerStruct const* ObjectMgr::GetAreaTrigger(uint32 trigger) const { AreaTriggerContainer::const_iterator itr = _areaTriggerStore.find(trigger); @@ -6572,7 +6614,7 @@ void ObjectMgr::LoadAreaTriggerTeleports() uint32 Trigger_ID = fields[0].GetUInt32(); uint32 PortLocID = fields[1].GetUInt32(); - WorldSafeLocsEntry const* portLoc = sWorldSafeLocsStore.LookupEntry(PortLocID); + WorldSafeLocsEntry const* portLoc = GetWorldSafeLoc(PortLocID); if (!portLoc) { TC_LOG_ERROR("sql.sql", "Area Trigger (ID: %u) has a non-existing Port Loc (ID: %u) in WorldSafeLocs.dbc, skipped", Trigger_ID, PortLocID); @@ -6581,11 +6623,11 @@ void ObjectMgr::LoadAreaTriggerTeleports() AreaTriggerStruct at; - at.target_mapId = portLoc->MapID; - at.target_X = portLoc->Loc.X; - at.target_Y = portLoc->Loc.Y; - at.target_Z = portLoc->Loc.Z; - at.target_Orientation = (portLoc->Facing * M_PI) / 180; // Orientation is initially in degrees + at.target_mapId = portLoc->Loc.GetMapId(); + at.target_X = portLoc->Loc.GetPositionX(); + at.target_Y = portLoc->Loc.GetPositionY(); + at.target_Z = portLoc->Loc.GetPositionZ(); + at.target_Orientation = portLoc->Loc.GetOrientation(); AreaTriggerEntry const* atEntry = sAreaTriggerStore.LookupEntry(Trigger_ID); if (!atEntry) diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h index 374b13ef836..1816f1a8c5c 100644 --- a/src/server/game/Globals/ObjectMgr.h +++ b/src/server/game/Globals/ObjectMgr.h @@ -25,6 +25,7 @@ #include "DatabaseEnvFwd.h" #include "GameObjectData.h" #include "ItemTemplate.h" +#include "IteratorPair.h" #include "NPCHandler.h" #include "ObjectDefines.h" #include "ObjectGuid.h" @@ -745,6 +746,12 @@ typedef std::unordered_map<uint32, QuestPOIData> QuestPOIContainer; typedef std::array<std::unordered_map<uint32, QuestGreeting>, 2> QuestGreetingContainer; typedef std::array<std::unordered_map<uint32, QuestGreetingLocale>, 2> QuestGreetingLocaleContainer; +struct WorldSafeLocsEntry +{ + uint32 ID = 0; + WorldLocation Loc; +}; + struct GraveYardData { uint32 safeLocId; @@ -1079,6 +1086,9 @@ class TC_GAME_API ObjectMgr void RemoveGraveYardLink(uint32 id, uint32 zoneId, uint32 team, bool persist = false); void LoadGraveyardZones(); GraveYardData const* FindGraveYardData(uint32 id, uint32 zone) const; + void LoadWorldSafeLocs(); + WorldSafeLocsEntry const* GetWorldSafeLoc(uint32 id) const; + Trinity::IteratorPair<std::unordered_map<uint32, WorldSafeLocsEntry>::const_iterator> GetWorldSafeLocs() const; AreaTriggerStruct const* GetAreaTrigger(uint32 trigger) const; AccessRequirement const* GetAccessRequirement(uint32 mapid, Difficulty difficulty) const; @@ -1639,6 +1649,7 @@ class TC_GAME_API ObjectMgr AreaTriggerScriptContainer _areaTriggerScriptStore; AccessRequirementContainer _accessRequirementStore; DungeonEncounterContainer _dungeonEncounterStore; + std::unordered_map<uint32, WorldSafeLocsEntry> _worldSafeLocs; RepRewardRateContainer _repRewardRateStore; RepOnKillContainer _repOnKillStore; diff --git a/src/server/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp index 388bf5239cf..3d5b46665ab 100644 --- a/src/server/game/Groups/Group.cpp +++ b/src/server/game/Groups/Group.cpp @@ -1919,7 +1919,7 @@ ItemDisenchantLootEntry const* Roll::GetItemDisenchantLoot(Player const* player) bonusData.Initialize(itemInstance); ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(itemid); - uint32 itemLevel = Item::GetItemLevel(itemTemplate, bonusData, player->getLevel(), 0, lootItemInSlot->upgradeId, 0, 0, 0, false); + uint32 itemLevel = Item::GetItemLevel(itemTemplate, bonusData, player->getLevel(), 0, 0, 0, 0, false); return Item::GetDisenchantLoot(itemTemplate, bonusData.Quality, itemLevel); } diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp index 2cbae0cd21b..ab4f51ad274 100644 --- a/src/server/game/Guilds/Guild.cpp +++ b/src/server/game/Guilds/Guild.cpp @@ -374,7 +374,7 @@ void Guild::BankTab::LoadFromDB(Field* fields) bool Guild::BankTab::LoadItemFromDB(Field* fields) { - uint8 slotId = fields[46].GetUInt8(); + uint8 slotId = fields[45].GetUInt8(); ObjectGuid::LowType itemGuid = fields[0].GetUInt64(); uint32 itemEntry = fields[1].GetUInt32(); if (slotId >= GUILD_BANK_MAX_SLOTS) @@ -2475,7 +2475,7 @@ void Guild::LoadBankTabFromDB(Field* fields) bool Guild::LoadBankItemFromDB(Field* fields) { - uint8 tabId = fields[45].GetUInt8(); + uint8 tabId = fields[44].GetUInt8(); if (tabId >= _GetPurchasedTabsSize()) { TC_LOG_ERROR("guild", "Invalid tab for item (GUID: %u, id: #%u) in guild bank, skipped.", diff --git a/src/server/game/Guilds/GuildMgr.cpp b/src/server/game/Guilds/GuildMgr.cpp index 3f197b9f564..ec601c37f39 100644 --- a/src/server/game/Guilds/GuildMgr.cpp +++ b/src/server/game/Guilds/GuildMgr.cpp @@ -410,17 +410,17 @@ void GuildMgr::LoadGuilds() // 0 1 2 3 4 5 6 7 8 9 10 11 12 // SELECT guid, itemEntry, creatorGuid, giftCreatorGuid, count, duration, charges, flags, enchantments, randomPropertyId, durability, playedTime, text, - // 13 14 15 16 17 18 19 - // upgradeId, battlePetSpeciesId, battlePetBreedData, battlePetLevel, battlePetDisplayId, context, bonusListIDs, - // 20 21 22 23 24 + // 13 14 15 16 17 18 + // battlePetSpeciesId, battlePetBreedData, battlePetLevel, battlePetDisplayId, context, bonusListIDs, + // 19 20 21 22 23 // itemModifiedAppearanceAllSpecs, itemModifiedAppearanceSpec1, itemModifiedAppearanceSpec2, itemModifiedAppearanceSpec3, itemModifiedAppearanceSpec4, - // 25 26 27 28 29 + // 24 25 26 27 28 // spellItemEnchantmentAllSpecs, spellItemEnchantmentSpec1, spellItemEnchantmentSpec2, spellItemEnchantmentSpec3, spellItemEnchantmentSpec4, - // 30 31 32 33 34 35 36 37 38 39 40 41 + // 29 30 31 32 33 34 35 36 37 38 39 40 // gemItemId1, gemBonuses1, gemContext1, gemScalingLevel1, gemItemId2, gemBonuses2, gemContext2, gemScalingLevel2, gemItemId3, gemBonuses3, gemContext3, gemScalingLevel3 - // 42 43 + // 41 42 // fixedScalingLevel, artifactKnowledgeLevel - // 44 45 46 + // 43 44 45 // guildid, TabId, SlotId FROM guild_bank_item gbi INNER JOIN item_instance ii ON gbi.item_guid = ii.guid PreparedQueryResult result = CharacterDatabase.Query(CharacterDatabase.GetPreparedStatement(CHAR_SEL_GUILD_BANK_ITEMS)); @@ -434,7 +434,7 @@ void GuildMgr::LoadGuilds() do { Field* fields = result->Fetch(); - uint64 guildId = fields[44].GetUInt64(); + uint64 guildId = fields[43].GetUInt64(); if (Guild* guild = GetGuildById(guildId)) guild->LoadBankItemFromDB(fields); diff --git a/src/server/game/Handlers/ItemHandler.cpp b/src/server/game/Handlers/ItemHandler.cpp index 9da8317bd31..0acb41b2c73 100644 --- a/src/server/game/Handlers/ItemHandler.cpp +++ b/src/server/game/Handlers/ItemHandler.cpp @@ -1076,7 +1076,7 @@ void WorldSession::HandleSocketGems(WorldPackets::Item::SocketGems& socketGems) if (gems[i]) { uint32 gemScalingLevel = _player->getLevel(); - if (uint32 fixedLevel = gems[i]->GetModifier(ITEM_MODIFIER_SCALING_STAT_DISTRIBUTION_FIXED_LEVEL)) + if (uint32 fixedLevel = gems[i]->GetModifier(ITEM_MODIFIER_TIMEWALKER_LEVEL)) gemScalingLevel = fixedLevel; itemTarget->SetGem(i, &gemData[i], gemScalingLevel); diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp index e7797c17f7a..82683b854ad 100644 --- a/src/server/game/Handlers/MiscHandler.cpp +++ b/src/server/game/Handlers/MiscHandler.cpp @@ -616,15 +616,15 @@ void WorldSession::HandleAreaTriggerOpcode(WorldPackets::AreaTrigger::AreaTrigge if (Map* map = sMapMgr->FindMap(at->target_mapId, player->GetInstanceSave(at->target_mapId)->GetInstanceId())) if (InstanceMap* instanceMap = map->ToInstanceMap()) if (InstanceScript* instanceScript = instanceMap->GetInstanceScript()) - entranceLocation = sWorldSafeLocsStore.LookupEntry(instanceScript->GetEntranceLocation()); + entranceLocation = sObjectMgr->GetWorldSafeLoc(instanceScript->GetEntranceLocation()); // Finally check with the instancesave for an entrance location if we did not get a valid one from the instancescript if (!entranceLocation) - entranceLocation = sWorldSafeLocsStore.LookupEntry(instanceSave->GetEntranceLocation()); + entranceLocation = sObjectMgr->GetWorldSafeLoc(instanceSave->GetEntranceLocation()); } if (entranceLocation) - player->TeleportTo(entranceLocation->MapID, entranceLocation->Loc.X, entranceLocation->Loc.Y, entranceLocation->Loc.Z, entranceLocation->Facing * M_PI / 180, TELE_TO_NOT_LEAVE_TRANSPORT); + player->TeleportTo(entranceLocation->Loc, TELE_TO_NOT_LEAVE_TRANSPORT); else player->TeleportTo(at->target_mapId, at->target_X, at->target_Y, at->target_Z, at->target_Orientation, TELE_TO_NOT_LEAVE_TRANSPORT); } diff --git a/src/server/game/Handlers/NPCHandler.cpp b/src/server/game/Handlers/NPCHandler.cpp index fceaedd74ba..371b0c8c4be 100644 --- a/src/server/game/Handlers/NPCHandler.cpp +++ b/src/server/game/Handlers/NPCHandler.cpp @@ -315,7 +315,7 @@ void WorldSession::SendSpiritResurrect() WorldSafeLocsEntry const* ghostGrave = sObjectMgr->GetClosestGraveYard(*_player, _player->GetTeam(), _player); if (corpseGrave != ghostGrave) - _player->TeleportTo(corpseGrave->MapID, corpseGrave->Loc.X, corpseGrave->Loc.Y, corpseGrave->Loc.Z, (corpseGrave->Facing * M_PI) / 180); // Orientation is initially in degrees + _player->TeleportTo(corpseGrave->Loc); } } diff --git a/src/server/game/Handlers/VoidStorageHandler.cpp b/src/server/game/Handlers/VoidStorageHandler.cpp index b951e26ed03..0b80b5ca71a 100644 --- a/src/server/game/Handlers/VoidStorageHandler.cpp +++ b/src/server/game/Handlers/VoidStorageHandler.cpp @@ -155,8 +155,7 @@ void WorldSession::HandleVoidStorageTransfer(WorldPackets::VoidStorage::VoidStor } VoidStorageItem itemVS(sObjectMgr->GenerateVoidStorageItemId(), item->GetEntry(), item->GetCreator(), - item->GetItemRandomBonusListId(), item->GetModifier(ITEM_MODIFIER_UPGRADE_ID), - item->GetModifier(ITEM_MODIFIER_SCALING_STAT_DISTRIBUTION_FIXED_LEVEL), item->GetModifier(ITEM_MODIFIER_ARTIFACT_KNOWLEDGE_LEVEL), + item->GetItemRandomBonusListId(), item->GetModifier(ITEM_MODIFIER_TIMEWALKER_LEVEL), item->GetModifier(ITEM_MODIFIER_ARTIFACT_KNOWLEDGE_LEVEL), uint8(item->m_itemData->Context), item->m_itemData->BonusListIDs); WorldPackets::VoidStorage::VoidItem voidItem; @@ -196,7 +195,6 @@ void WorldSession::HandleVoidStorageTransfer(WorldPackets::VoidStorage::VoidStor Item* item = _player->StoreNewItem(dest, itemVS->ItemEntry, true, itemVS->RandomBonusListId, GuidSet(), itemVS->Context, itemVS->BonusListIDs); item->SetCreator(itemVS->CreatorGuid); - item->SetModifier(ITEM_MODIFIER_UPGRADE_ID, itemVS->ItemUpgradeId); item->SetBinding(true); GetCollectionMgr()->AddItemAppearance(item); diff --git a/src/server/game/Instances/InstanceSaveMgr.cpp b/src/server/game/Instances/InstanceSaveMgr.cpp index 5db6edd7695..26e1415fa85 100644 --- a/src/server/game/Instances/InstanceSaveMgr.cpp +++ b/src/server/game/Instances/InstanceSaveMgr.cpp @@ -99,7 +99,7 @@ InstanceSave* InstanceSaveManager::AddInstanceSave(uint32 mapId, uint32 instance return NULL; } - if (entranceId && !sWorldSafeLocsStore.LookupEntry(entranceId)) + if (entranceId && !sObjectMgr->GetWorldSafeLoc(entranceId)) { TC_LOG_WARN("misc", "InstanceSaveManager::AddInstanceSave: invalid entranceId = %d defined for instance save with mapid = %d, instanceid = %d!", entranceId, mapId, instanceId); entranceId = 0; diff --git a/src/server/game/Loot/Loot.cpp b/src/server/game/Loot/Loot.cpp index 21568474dd8..eb37b6b0989 100644 --- a/src/server/game/Loot/Loot.cpp +++ b/src/server/game/Loot/Loot.cpp @@ -47,7 +47,6 @@ LootItem::LootItem(LootStoreItem const& li) needs_quest = li.needs_quest; randomBonusListId = GenerateItemRandomBonusListId(itemid); - upgradeId = sDB2Manager.GetRulesetItemUpgrade(itemid); context = 0; count = 0; is_looted = 0; diff --git a/src/server/game/Loot/Loot.h b/src/server/game/Loot/Loot.h index 709d3aceddb..7373cd5e9d8 100644 --- a/src/server/game/Loot/Loot.h +++ b/src/server/game/Loot/Loot.h @@ -134,7 +134,6 @@ struct TC_GAME_API LootItem { uint32 itemid; ItemRandomBonusListId randomBonusListId; - int32 upgradeId; std::vector<int32> BonusListIDs; uint8 context; ConditionContainer conditions; // additional loot condition @@ -155,7 +154,7 @@ struct TC_GAME_API LootItem explicit LootItem(LootStoreItem const& li); // Empty constructor for creating an empty LootItem to be filled in with DB data - LootItem() : itemid(0), randomBonusListId(0), upgradeId(0), context(0), count(0), is_looted(false), is_blocked(false), + LootItem() : itemid(0), randomBonusListId(0), context(0), count(0), is_looted(false), is_blocked(false), freeforall(false), is_underthreshold(false), is_counted(false), needs_quest(false), follow_loot_rules(false), canSave(true){ }; diff --git a/src/server/game/Server/Packets/ItemPacketsCommon.cpp b/src/server/game/Server/Packets/ItemPacketsCommon.cpp index e94123490aa..83fb1bd9328 100644 --- a/src/server/game/Server/Packets/ItemPacketsCommon.cpp +++ b/src/server/game/Server/Packets/ItemPacketsCommon.cpp @@ -77,25 +77,17 @@ void WorldPackets::Item::ItemInstance::Initialize(::LootItem const& lootItem) if (lootItem.randomBonusListId) ItemBonus->BonusListIDs.push_back(lootItem.randomBonusListId); } - - if (lootItem.upgradeId) - { - Modifications = boost::in_place(); - Modifications->Insert(ITEM_MODIFIER_UPGRADE_ID, lootItem.upgradeId); - } } void WorldPackets::Item::ItemInstance::Initialize(::VoidStorageItem const* voidItem) { ItemID = voidItem->ItemEntry; - if (voidItem->ItemUpgradeId || voidItem->FixedScalingLevel || voidItem->ArtifactKnowledgeLevel) + if (voidItem->FixedScalingLevel || voidItem->ArtifactKnowledgeLevel) { Modifications = boost::in_place(); - if (voidItem->ItemUpgradeId) - Modifications->Insert(ITEM_MODIFIER_UPGRADE_ID, voidItem->ItemUpgradeId); if (voidItem->FixedScalingLevel) - Modifications->Insert(ITEM_MODIFIER_SCALING_STAT_DISTRIBUTION_FIXED_LEVEL, voidItem->FixedScalingLevel); + Modifications->Insert(ITEM_MODIFIER_TIMEWALKER_LEVEL, voidItem->FixedScalingLevel); if (voidItem->ArtifactKnowledgeLevel) Modifications->Insert(ITEM_MODIFIER_ARTIFACT_KNOWLEDGE_LEVEL, voidItem->ArtifactKnowledgeLevel); } diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index 86431c96452..bc7fbbf6ad8 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -1813,6 +1813,9 @@ void World::SetInitialWorldSettings() TC_LOG_INFO("server.loading", "Loading SpellArea Data..."); // must be after quest load sSpellMgr->LoadSpellAreas(); + TC_LOG_INFO("server.loading", "Loading World locations..."); + sObjectMgr->LoadWorldSafeLocs(); // must be before LoadAreaTriggerTeleports and LoadGraveyardZones + TC_LOG_INFO("server.loading", "Loading AreaTrigger definitions..."); sObjectMgr->LoadAreaTriggerTeleports(); diff --git a/src/server/scripts/Commands/cs_debug.cpp b/src/server/scripts/Commands/cs_debug.cpp index e7b1db5060f..522bdcc7b5f 100644 --- a/src/server/scripts/Commands/cs_debug.cpp +++ b/src/server/scripts/Commands/cs_debug.cpp @@ -1257,23 +1257,24 @@ public: float z = player->GetPositionZ(); float distNearest = std::numeric_limits<float>::max(); - for (uint32 i = 0; i < sWorldSafeLocsStore.GetNumRows(); ++i) + for (auto&& kvp : sObjectMgr->GetWorldSafeLocs()) { - WorldSafeLocsEntry const* loc = sWorldSafeLocsStore.LookupEntry(i); - if (loc && loc->MapID == player->GetMapId()) + if (kvp.second.Loc.GetMapId() == player->GetMapId()) { - float dist = (loc->Loc.X - x) * (loc->Loc.X - x) + (loc->Loc.Y - y) * (loc->Loc.Y - y) + (loc->Loc.Z - z) * (loc->Loc.Z - z); + float dist = (kvp.second.Loc.GetPositionX() - x) * (kvp.second.Loc.GetPositionX() - x) + + (kvp.second.Loc.GetPositionY() - y) * (kvp.second.Loc.GetPositionY() - y) + + (kvp.second.Loc.GetPositionZ() - z) * (kvp.second.Loc.GetPositionZ() - z); if (dist < distNearest) { distNearest = dist; - nearestLoc = loc; + nearestLoc = &kvp.second; } } } } if (nearestLoc) - handler->PSendSysMessage(LANG_COMMAND_NEARGRAVEYARD, nearestLoc->ID, nearestLoc->Loc.X, nearestLoc->Loc.Y, nearestLoc->Loc.Z); + handler->PSendSysMessage(LANG_COMMAND_NEARGRAVEYARD, nearestLoc->ID, nearestLoc->Loc.GetPositionX(), nearestLoc->Loc.GetPositionY(), nearestLoc->Loc.GetPositionZ()); else handler->PSendSysMessage(LANG_COMMAND_NEARGRAVEYARD_NOTFOUND); diff --git a/src/server/scripts/Commands/cs_go.cpp b/src/server/scripts/Commands/cs_go.cpp index b062139ce70..41e50f535a8 100644 --- a/src/server/scripts/Commands/cs_go.cpp +++ b/src/server/scripts/Commands/cs_go.cpp @@ -180,7 +180,7 @@ public: if (!graveyardId) return false; - WorldSafeLocsEntry const* gy = sWorldSafeLocsStore.LookupEntry(graveyardId); + WorldSafeLocsEntry const* gy = sObjectMgr->GetWorldSafeLoc(graveyardId); if (!gy) { handler->PSendSysMessage(LANG_COMMAND_GRAVEYARDNOEXIST, graveyardId); @@ -188,9 +188,9 @@ public: return false; } - if (!MapManager::IsValidMapCoord(gy->MapID, gy->Loc.X, gy->Loc.Y, gy->Loc.Z)) + if (!MapManager::IsValidMapCoord(gy->Loc)) { - handler->PSendSysMessage(LANG_INVALID_TARGET_COORD, gy->Loc.X, gy->Loc.Y, gy->MapID); + handler->PSendSysMessage(LANG_INVALID_TARGET_COORD, gy->Loc.GetPositionX(), gy->Loc.GetPositionY(), gy->Loc.GetMapId()); handler->SetSentErrorMessage(true); return false; } @@ -205,7 +205,7 @@ public: else player->SaveRecallPosition(); - player->TeleportTo(gy->MapID, gy->Loc.X, gy->Loc.Y, gy->Loc.Z, (gy->Facing * M_PI) / 180); // Orientation is initially in degrees + player->TeleportTo(gy->Loc); return true; } diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp index ad21e8fe400..f5c18af74dd 100644 --- a/src/server/scripts/Commands/cs_misc.cpp +++ b/src/server/scripts/Commands/cs_misc.cpp @@ -1077,7 +1077,7 @@ public: else return false; - WorldSafeLocsEntry const* graveyard = sWorldSafeLocsStore.LookupEntry(graveyardId); + WorldSafeLocsEntry const* graveyard = sObjectMgr->GetWorldSafeLoc(graveyardId); if (!graveyard) { diff --git a/src/server/scripts/EasternKingdoms/zone_tol_barad.cpp b/src/server/scripts/EasternKingdoms/zone_tol_barad.cpp index 2f7ce49afca..ad796eeb311 100644 --- a/src/server/scripts/EasternKingdoms/zone_tol_barad.cpp +++ b/src/server/scripts/EasternKingdoms/zone_tol_barad.cpp @@ -20,6 +20,7 @@ #include "BattlefieldMgr.h" #include "BattlefieldTB.h" #include "DB2Stores.h" +#include "ObjectMgr.h" #include "Player.h" #include "ScriptedCreature.h" #include "ScriptedGossip.h" @@ -83,8 +84,8 @@ class npc_tb_spirit_guide : public CreatureScript return; } - if (WorldSafeLocsEntry const* safeLoc = sWorldSafeLocsStore.LookupEntry(areaId)) - player->TeleportTo(safeLoc->MapID, safeLoc->Loc.X, safeLoc->Loc.Y, safeLoc->Loc.Z, 0); + if (WorldSafeLocsEntry const* safeLoc = sObjectMgr->GetWorldSafeLoc(areaId)) + player->TeleportTo(safeLoc->Loc); } }; diff --git a/src/server/scripts/Northrend/zone_wintergrasp.cpp b/src/server/scripts/Northrend/zone_wintergrasp.cpp index 3dc606e1f76..9e119a55415 100644 --- a/src/server/scripts/Northrend/zone_wintergrasp.cpp +++ b/src/server/scripts/Northrend/zone_wintergrasp.cpp @@ -218,8 +218,8 @@ class npc_wg_spirit_guide : public CreatureScript GraveyardVect gy = wintergrasp->GetGraveyardVector(); for (uint8 i = 0; i < gy.size(); i++) if (action - GOSSIP_ACTION_INFO_DEF == i && gy[i]->GetControlTeamId() == player->GetTeamId()) - if (WorldSafeLocsEntry const* safeLoc = sWorldSafeLocsStore.LookupEntry(gy[i]->GetGraveyardId())) - player->TeleportTo(safeLoc->MapID, safeLoc->Loc.X, safeLoc->Loc.Y, safeLoc->Loc.Z, 0); + if (WorldSafeLocsEntry const* safeLoc = sObjectMgr->GetWorldSafeLoc(gy[i]->GetGraveyardId())) + player->TeleportTo(safeLoc->Loc); } return true; } diff --git a/src/tools/map_extractor/loadlib/DBFilesClientList.h b/src/tools/map_extractor/loadlib/DBFilesClientList.h index dae88cf4b28..beafec14619 100644 --- a/src/tools/map_extractor/loadlib/DBFilesClientList.h +++ b/src/tools/map_extractor/loadlib/DBFilesClientList.h @@ -75,6 +75,8 @@ DB2FileInfo const DBFilesClientList[] = { 2829666, "AzeriteEssencePower.db2" }, { 1846048, "AzeriteItem.db2" }, { 1915395, "AzeriteItemMilestonePower.db2" }, + { 3148050, "AzeriteKnowledgeMultiplier.db2" }, + { 3147968, "AzeriteLevelInfo.db2" }, { 1846044, "AzeritePower.db2" }, { 1846040, "AzeritePowerSetMember.db2" }, { 1846043, "AzeriteTierUnlock.db2" }, @@ -155,6 +157,7 @@ DB2FileInfo const DBFilesClientList[] = { 1465903, "CloakDampening.db2" }, { 2175218, "CloneEffect.db2" }, { 1120958, "CombatCondition.db2" }, + { 3067644, "CommentatorIndirectSpell.db2" }, { 1664251, "CommentatorStartLocation.db2" }, { 1661584, "CommentatorTrackedCooldown.db2" }, { 2098645, "CommunityIcon.db2" }, @@ -360,8 +363,8 @@ DB2FileInfo const DBFilesClientList[] = { 1134576, "ItemSpecOverride.db2" }, { 1261604, "ItemSubClass.db2" }, { 1302852, "ItemSubClassMask.db2" }, - { 801687, "ItemUpgrade.db2" }, { 1343605, "ItemVisuals.db2" }, + { 3043873, "ItemVisualsXEffect.db2" }, { 987133, "ItemXBonusTree.db2" }, { 1240336, "JournalEncounter.db2" }, { 1301155, "JournalEncounterCreature.db2" }, @@ -501,6 +504,7 @@ DB2FileInfo const DBFilesClientList[] = { 1028735, "QuestV2CliTask.db2" }, { 1573634, "QuestXGroupActivity.db2" }, { 1139378, "QuestXP.db2" }, + { 3081207, "RafActivity.db2" }, { 1310245, "RandPropPoints.db2" }, { 1716803, "RelicSlotTierRequirement.db2" }, { 1671256, "RelicTalent.db2" }, @@ -513,7 +517,6 @@ DB2FileInfo const DBFilesClientList[] = { 1307153, "RewardPackXCurrencyType.db2" }, { 1307155, "RewardPackXItem.db2" }, { 1398908, "RibbonQuality.db2" }, - { 801749, "RulesetItemUpgrade.db2" }, { 1712172, "SDReplacementModel.db2" }, { 2056369, "SSAOSettings.db2" }, { 1141728, "ScalingStatDistribution.db2" }, @@ -726,7 +729,6 @@ DB2FileInfo const DBFilesClientList[] = { 1135240, "WorldElapsedTimer.db2" }, { 1134579, "WorldMapOverlay.db2" }, { 1957212, "WorldMapOverlayTile.db2" }, - { 1369425, "WorldSafeLocs.db2" }, { 1332558, "WorldStateExpression.db2" }, { 1266941, "WorldStateZoneSounds.db2" }, { 1310255, "World_PVP_Area.db2" }, |