diff options
author | Shauren <shauren.trinity@gmail.com> | 2023-01-07 22:38:21 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2023-01-07 22:38:21 +0100 |
commit | 92ed5e8af1f8b1aac085fd9b0ea93afb2b6795d4 (patch) | |
tree | f141fe0afd8ff11a7037329ffd75f070d73d6e70 | |
parent | a53e4a57565d3375a978effbbc32d3eed6aac7e3 (diff) |
Core/Misc: Include cleanup, 2023 edition
32 files changed, 1125 insertions, 485 deletions
diff --git a/src/common/Common.h b/src/common/Common.h index 99807a713e2..22cf8ce889b 100644 --- a/src/common/Common.h +++ b/src/common/Common.h @@ -20,25 +20,8 @@ #include "Define.h" #include <array> -#include <memory> #include <string> -#include <utility> - -#if TRINITY_PLATFORM == TRINITY_PLATFORM_WINDOWS -# if TRINITY_COMPILER == TRINITY_COMPILER_INTEL -# if !defined(BOOST_ASIO_HAS_MOVE) -# define BOOST_ASIO_HAS_MOVE -# endif // !defined(BOOST_ASIO_HAS_MOVE) -# endif // if TRINITY_COMPILER == TRINITY_COMPILER_INTEL -#else -# include <sys/types.h> -# include <sys/ioctl.h> -# include <sys/socket.h> -# include <netinet/in.h> -# include <unistd.h> -# include <netdb.h> -# include <cstdlib> -#endif +#include <cstdlib> #if TRINITY_COMPILER == TRINITY_COMPILER_MICROSOFT diff --git a/src/server/game/Achievements/CriteriaHandler.cpp b/src/server/game/Achievements/CriteriaHandler.cpp index 7345b40b0b1..4fc3d89d3c2 100644 --- a/src/server/game/Achievements/CriteriaHandler.cpp +++ b/src/server/game/Achievements/CriteriaHandler.cpp @@ -3221,7 +3221,7 @@ bool CriteriaHandler::ModifierSatisfied(ModifierTreeEntry const* modifier, uint6 case ModifierTreeType::PlayerIsOnQuestInQuestline: // 236 { bool isOnQuest = false; - if (std::unordered_set<QuestLineXQuestEntry const*> const* questLineQuests = sDB2Manager.GetQuestsForQuestLine(reqValue)) + if (std::vector<QuestLineXQuestEntry const*> const* questLineQuests = sDB2Manager.GetQuestsForQuestLine(reqValue)) { isOnQuest = std::any_of(questLineQuests->begin(), questLineQuests->end(), [referencePlayer](QuestLineXQuestEntry const* questLineQuest) { @@ -3255,7 +3255,7 @@ bool CriteriaHandler::ModifierSatisfied(ModifierTreeEntry const* modifier, uint6 } case ModifierTreeType::PlayerCanAcceptQuestInQuestline: // 240 { - std::unordered_set<QuestLineXQuestEntry const*> const* questLineQuests = sDB2Manager.GetQuestsForQuestLine(reqValue); + std::vector<QuestLineXQuestEntry const*> const* questLineQuests = sDB2Manager.GetQuestsForQuestLine(reqValue); if (!questLineQuests) return false; bool canTakeQuest = std::any_of(questLineQuests->begin(), questLineQuests->end(), [referencePlayer](QuestLineXQuestEntry const* questLineQuest) @@ -3270,7 +3270,7 @@ bool CriteriaHandler::ModifierSatisfied(ModifierTreeEntry const* modifier, uint6 } case ModifierTreeType::PlayerHasCompletedQuestline: // 241 { - std::unordered_set<QuestLineXQuestEntry const*> const* questLineQuests = sDB2Manager.GetQuestsForQuestLine(reqValue); + std::vector<QuestLineXQuestEntry const*> const* questLineQuests = sDB2Manager.GetQuestsForQuestLine(reqValue); if (!questLineQuests) return false; for (QuestLineXQuestEntry const* questLineQuest : *questLineQuests) @@ -3280,7 +3280,7 @@ bool CriteriaHandler::ModifierSatisfied(ModifierTreeEntry const* modifier, uint6 } case ModifierTreeType::PlayerHasCompletedQuestlineQuestCount: // 242 { - std::unordered_set<QuestLineXQuestEntry const*> const* questLineQuests = sDB2Manager.GetQuestsForQuestLine(reqValue); + std::vector<QuestLineXQuestEntry const*> const* questLineQuests = sDB2Manager.GetQuestsForQuestLine(reqValue); if (!questLineQuests) return false; uint32 completedQuests = 0; @@ -3293,7 +3293,7 @@ bool CriteriaHandler::ModifierSatisfied(ModifierTreeEntry const* modifier, uint6 } case ModifierTreeType::PlayerHasCompletedPercentageOfQuestline: // 243 { - std::unordered_set<QuestLineXQuestEntry const*> const* questLineQuests = sDB2Manager.GetQuestsForQuestLine(reqValue); + std::vector<QuestLineXQuestEntry const*> const* questLineQuests = sDB2Manager.GetQuestsForQuestLine(reqValue); if (!questLineQuests || questLineQuests->empty()) return false; std::size_t completedQuests = 0; diff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp index 33f7403cc58..12fc769c892 100644 --- a/src/server/game/Battlegrounds/Battleground.cpp +++ b/src/server/game/Battlegrounds/Battleground.cpp @@ -1187,7 +1187,7 @@ void Battleground::EventPlayerLoggedIn(Player* player) { ObjectGuid guid = player->GetGUID(); // player is correct pointer - for (GuidDeque::iterator itr = m_OfflineQueue.begin(); itr != m_OfflineQueue.end(); ++itr) + for (auto itr = m_OfflineQueue.begin(); itr != m_OfflineQueue.end(); ++itr) { if (*itr == guid) { diff --git a/src/server/game/Battlegrounds/Battleground.h b/src/server/game/Battlegrounds/Battleground.h index a1fe02d0881..5cb8976422d 100644 --- a/src/server/game/Battlegrounds/Battleground.h +++ b/src/server/game/Battlegrounds/Battleground.h @@ -23,6 +23,7 @@ #include "Position.h" #include "SharedDefines.h" #include "ZoneScript.h" +#include <deque> #include <map> #include <vector> @@ -597,7 +598,7 @@ class TC_GAME_API Battleground : public ZoneScript // Player lists GuidVector m_ResurrectQueue; // Player GUID - GuidDeque m_OfflineQueue; // Player GUID + std::deque<ObjectGuid> m_OfflineQueue; // Player GUID // Invited counters are useful for player invitation to BG - do not allow, if BG is started to one faction to have 2 more players than another faction // Invited counters will be changed only when removing already invited player from queue, removing player from battleground and inviting player to BG diff --git a/src/server/game/Chat/Channels/ChannelMgr.h b/src/server/game/Chat/Channels/ChannelMgr.h index f8efb4cbb21..6b56fbe7bff 100644 --- a/src/server/game/Chat/Channels/ChannelMgr.h +++ b/src/server/game/Chat/Channels/ChannelMgr.h @@ -32,7 +32,7 @@ class TC_GAME_API ChannelMgr typedef std::unordered_map<ObjectGuid, Channel*> BuiltinChannelContainer; protected: - explicit ChannelMgr(uint32 team) : _team(team) { } + explicit ChannelMgr(uint32 team) : _team(team), _guidGenerator(HighGuid::ChatChannel) { } ~ChannelMgr(); public: @@ -57,7 +57,7 @@ class TC_GAME_API ChannelMgr CustomChannelContainer _customChannels; BuiltinChannelContainer _channels; uint32 const _team; - ObjectGuidGenerator<HighGuid::ChatChannel> _guidGenerator; + ObjectGuidGenerator _guidGenerator; static void SendNotOnChannelNotify(Player const* player, std::string const& name); ObjectGuid CreateCustomChannelGuid(); diff --git a/src/server/game/Combat/ThreatManager.h b/src/server/game/Combat/ThreatManager.h index 36885802068..8cc792b0c1f 100644 --- a/src/server/game/Combat/ThreatManager.h +++ b/src/server/game/Combat/ThreatManager.h @@ -23,6 +23,7 @@ #include "ObjectGuid.h" #include "SharedDefines.h" #include <array> +#include <memory> #include <unordered_map> #include <vector> diff --git a/src/server/game/DataStores/DB2Stores.cpp b/src/server/game/DataStores/DB2Stores.cpp index 7b082c8fa3b..a3f14626b4d 100644 --- a/src/server/game/DataStores/DB2Stores.cpp +++ b/src/server/game/DataStores/DB2Stores.cpp @@ -365,7 +365,6 @@ TaxiMask sTaxiNodesMask; TaxiMask sOldContinentsNodesMask; TaxiMask sHordeTaxiNodesMask; TaxiMask sAllianceTaxiNodesMask; -TaxiPathSetBySource sTaxiPathSetBySource; TaxiPathNodesByPath sTaxiPathNodesByPath; DEFINE_DB2_SET_COMPARATOR(ChrClassesXPowerTypesEntry) @@ -382,7 +381,7 @@ void LoadAzeriteEmpoweredItemUnlockMappings(std::unordered_map<int32, std::vecto typedef std::map<uint32 /*hash*/, DB2StorageBase*> StorageMap; typedef std::unordered_map<uint32 /*areaGroupId*/, std::vector<uint32/*areaId*/>> AreaGroupMemberContainer; typedef std::unordered_map<uint32, std::vector<ArtifactPowerEntry const*>> ArtifactPowersContainer; -typedef std::unordered_map<uint32, std::unordered_set<uint32>> ArtifactPowerLinksContainer; +typedef std::unordered_map<uint32, std::vector<uint32>> ArtifactPowerLinksContainer; typedef std::unordered_map<std::pair<uint32, uint8>, ArtifactPowerRankEntry const*> ArtifactPowerRanksContainer; typedef ChrSpecializationEntry const* ChrSpecializationByIndexContainer[MAX_CLASSES + 1][MAX_SPECIALIZATIONS]; typedef std::unordered_map<uint32 /*curveID*/, std::vector<CurvePointEntry const*>> CurvePointsContainer; @@ -402,6 +401,7 @@ typedef std::unordered_map<uint32 /*itemId | appearanceMod << 24*/, ItemModified typedef std::unordered_map<uint32, std::set<ItemBonusTreeNodeEntry const*>> ItemBonusTreeContainer; typedef std::unordered_map<uint32, std::vector<ItemSetSpellEntry const*>> ItemSetSpellContainer; typedef std::unordered_map<uint32, std::vector<ItemSpecOverrideEntry const*>> ItemSpecOverridesContainer; +typedef std::unordered_map<uint32, std::unordered_map<uint32, MapDifficultyEntry const*>> MapDifficultyContainer; typedef std::unordered_map<uint32, DB2Manager::MountTypeXCapabilitySet> MountCapabilitiesByTypeContainer; typedef std::unordered_map<uint32, DB2Manager::MountXDisplayContainer> MountDisplaysCointainer; typedef std::unordered_map<uint32, std::array<std::vector<NameGenEntry const*>, 2>> NameGenContainer; @@ -456,7 +456,7 @@ namespace std::unordered_map<std::pair<uint8, uint8>, ChrModelEntry const*> _chrModelsByRaceAndGender; std::map<std::tuple<uint8 /*race*/, uint8/*gender*/, uint8/*shapeshift*/>, ShapeshiftFormModelData> _chrCustomizationChoicesForShapeshifts; std::unordered_map<std::pair<uint8 /*race*/, uint8/*gender*/>, std::vector<ChrCustomizationOptionEntry const*>> _chrCustomizationOptionsByRaceAndGender; - std::unordered_map<uint32 /*chrCustomizationReqId*/, std::unordered_map<uint32 /*chrCustomizationOptionId*/, std::vector<uint32>>> _chrCustomizationRequiredChoices; + std::unordered_map<uint32 /*chrCustomizationReqId*/, std::vector<std::pair<uint32 /*chrCustomizationOptionId*/, std::vector<uint32>>>> _chrCustomizationRequiredChoices; ChrSpecializationByIndexContainer _chrSpecializationsByIndex; std::unordered_multimap<uint32, CurrencyContainerEntry const*> _currencyContainers; CurvePointsContainer _curvePoints; @@ -481,7 +481,7 @@ namespace ItemSetSpellContainer _itemSetSpells; ItemSpecOverridesContainer _itemSpecOverrides; std::vector<JournalTierEntry const*> _journalTiersByIndex; - DB2Manager::MapDifficultyContainer _mapDifficulties; + MapDifficultyContainer _mapDifficulties; std::unordered_map<uint32, DB2Manager::MapDifficultyConditionsContainer> _mapDifficultyConditions; std::unordered_map<uint32, MountEntry const*> _mountsBySpellId; MountCapabilitiesByTypeContainer _mountCapabilitiesByType; @@ -493,7 +493,7 @@ namespace PowerTypesContainer _powerTypes; std::unordered_map<uint32, uint8> _pvpItemBonus; PvpTalentSlotUnlockEntry const* _pvpTalentSlotUnlock[MAX_PVP_TALENT_SLOTS]; - std::unordered_map<uint32, std::unordered_set<QuestLineXQuestEntry const*>> _questsByQuestLine; + std::unordered_map<uint32, std::vector<QuestLineXQuestEntry const*>> _questsByQuestLine; QuestPackageItemContainer _questPackages; std::unordered_map<uint32, std::vector<RewardPackXCurrencyTypeEntry const*>> _rewardPackCurrencyTypes; std::unordered_map<uint32, std::vector<RewardPackXItemEntry const*>> _rewardPackItems; @@ -507,6 +507,7 @@ namespace SpellProcsPerMinuteModContainer _spellProcsPerMinuteMods; std::unordered_map<int32, std::vector<SpellVisualMissileEntry const*>> _spellVisualMissilesBySet; TalentsByPosition _talentsByPosition; + std::unordered_map<std::pair<uint32, uint32>, TaxiPathEntry const*> _taxiPaths; ToyItemIdsContainer _toys; std::unordered_map<uint32, TransmogIllusionEntry const*> _transmogIllusionsByEnchantmentId; std::unordered_map<uint32, std::vector<TransmogSetEntry const*>> _transmogSetsByItemModifiedAppearance; @@ -995,8 +996,8 @@ uint32 DB2Manager::LoadStores(std::string const& dataPath, LocaleConstant defaul for (ArtifactPowerLinkEntry const* artifactPowerLink : sArtifactPowerLinkStore) { - _artifactPowerLinks[artifactPowerLink->PowerA].insert(artifactPowerLink->PowerB); - _artifactPowerLinks[artifactPowerLink->PowerB].insert(artifactPowerLink->PowerA); + _artifactPowerLinks[artifactPowerLink->PowerA].push_back(artifactPowerLink->PowerB); + _artifactPowerLinks[artifactPowerLink->PowerB].push_back(artifactPowerLink->PowerA); } for (ArtifactPowerRankEntry const* artifactPowerRank : sArtifactPowerRankStore) @@ -1112,8 +1113,28 @@ uint32 DB2Manager::LoadStores(std::string const& dataPath, LocaleConstant defaul customizationOptionsByModel[customizationOption->ChrModelID].push_back(customizationOption); for (ChrCustomizationReqChoiceEntry const* reqChoice : sChrCustomizationReqChoiceStore) + { if (ChrCustomizationChoiceEntry const* customizationChoice = sChrCustomizationChoiceStore.LookupEntry(reqChoice->ChrCustomizationChoiceID)) - _chrCustomizationRequiredChoices[reqChoice->ChrCustomizationReqID][customizationChoice->ChrCustomizationOptionID].push_back(reqChoice->ChrCustomizationChoiceID); + { + std::vector<std::pair<uint32, std::vector<uint32>>>& requiredChoicesForReq = _chrCustomizationRequiredChoices[reqChoice->ChrCustomizationReqID]; + std::vector<uint32>* choices = nullptr; + for (std::pair<uint32, std::vector<uint32>>& choicesForOption : requiredChoicesForReq) + { + if (int32(choicesForOption.first) == customizationChoice->ChrCustomizationOptionID) + { + choices = &choicesForOption.second; + break; + } + } + if (!choices) + { + std::pair<uint32, std::vector<uint32>>& choicesForReq = requiredChoicesForReq.emplace_back(); + choicesForReq.first = customizationChoice->ChrCustomizationOptionID; + choices = &choicesForReq.second; + } + choices->push_back(reqChoice->ChrCustomizationChoiceID); + } + } std::unordered_map<uint32, uint32> parentRaces; for (ChrRacesEntry const* chrRace : sChrRacesStore) @@ -1379,7 +1400,7 @@ uint32 DB2Manager::LoadStores(std::string const& dataPath, LocaleConstant defaul } for (QuestLineXQuestEntry const* questLineQuest : sQuestLineXQuestStore) - _questsByQuestLine[questLineQuest->QuestLineID].insert(questLineQuest); + _questsByQuestLine[questLineQuest->QuestLineID].push_back(questLineQuest); for (QuestPackageItemEntry const* questPackageItem : sQuestPackageItemStore) { @@ -1434,7 +1455,7 @@ uint32 DB2Manager::LoadStores(std::string const& dataPath, LocaleConstant defaul } for (TaxiPathEntry const* entry : sTaxiPathStore) - sTaxiPathSetBySource[entry->FromTaxiNode][entry->ToTaxiNode] = TaxiPathBySourceAndDestination(entry->ID, entry->Cost); + _taxiPaths[{ entry->FromTaxiNode, entry->ToTaxiNode }] = entry; uint32 pathCount = sTaxiPathStore.GetNumRows(); @@ -1871,7 +1892,7 @@ std::vector<ArtifactPowerEntry const*> DB2Manager::GetArtifactPowers(uint8 artif return std::vector<ArtifactPowerEntry const*>{}; } -std::unordered_set<uint32> const* DB2Manager::GetArtifactPowerLinks(uint32 artifactPowerId) const +std::vector<uint32> const* DB2Manager::GetArtifactPowerLinks(uint32 artifactPowerId) const { return Trinity::Containers::MapGetValuePtr(_artifactPowerLinks, artifactPowerId); } @@ -1984,7 +2005,7 @@ std::vector<ChrCustomizationOptionEntry const*> const* DB2Manager::GetCustomizti return Trinity::Containers::MapGetValuePtr(_chrCustomizationOptionsByRaceAndGender, { race,gender }); } -std::unordered_map<uint32, std::vector<uint32>> const* DB2Manager::GetRequiredCustomizationChoices(uint32 chrCustomizationReqId) const +std::vector<std::pair<uint32, std::vector<uint32>>> const* DB2Manager::GetRequiredCustomizationChoices(uint32 chrCustomizationReqId) const { return Trinity::Containers::MapGetValuePtr(_chrCustomizationRequiredChoices, chrCustomizationReqId); } @@ -2686,11 +2707,6 @@ uint32 DB2Manager::GetLiquidFlags(uint32 liquidType) return 0; } -DB2Manager::MapDifficultyContainer const& DB2Manager::GetMapDifficulties() const -{ - return _mapDifficulties; -} - MapDifficultyEntry const* DB2Manager::GetDefaultMapDifficulty(uint32 mapId, Difficulty* difficulty /*= nullptr*/) const { auto itr = _mapDifficulties.find(mapId); @@ -2896,7 +2912,7 @@ int32 DB2Manager::GetPvpTalentNumSlotsAtLevel(uint32 level, Classes class_) cons return slots; } -std::unordered_set<QuestLineXQuestEntry const*> const* DB2Manager::GetQuestsForQuestLine(uint32 questLineId) const +std::vector<QuestLineXQuestEntry const*> const* DB2Manager::GetQuestsForQuestLine(uint32 questLineId) const { return Trinity::Containers::MapGetValuePtr(_questsByQuestLine, questLineId); } @@ -3053,6 +3069,11 @@ std::vector<TalentEntry const*> const& DB2Manager::GetTalentsByPosition(uint32 c return _talentsByPosition[class_][tier][column]; } +TaxiPathEntry const* DB2Manager::GetTaxiPath(uint32 from, uint32 to) const +{ + return Trinity::Containers::MapGetValuePtr(_taxiPaths, { from, to }); +} + bool DB2Manager::IsTotemCategoryCompatibleWith(uint32 itemTotemCategoryId, uint32 requiredTotemCategoryId) { if (requiredTotemCategoryId == 0) diff --git a/src/server/game/DataStores/DB2Stores.h b/src/server/game/DataStores/DB2Stores.h index 607cda14e82..bc6cf523d27 100644 --- a/src/server/game/DataStores/DB2Stores.h +++ b/src/server/game/DataStores/DB2Stores.h @@ -20,12 +20,10 @@ #include "DB2Store.h" #include "DB2Structure.h" -#include <Optional.h> +#include "Optional.h" #include "SharedDefines.h" #include <map> #include <set> -#include <unordered_map> -#include <unordered_set> #include <vector> // temporary hack until includes are sorted out (don't want to pull in Windows.h) @@ -169,6 +167,7 @@ TC_GAME_API extern DB2Storage<LockEntry> sLockStore; TC_GAME_API extern DB2Storage<MailTemplateEntry> sMailTemplateStore; TC_GAME_API extern DB2Storage<MapEntry> sMapStore; TC_GAME_API extern DB2Storage<MapChallengeModeEntry> sMapChallengeModeStore; +TC_GAME_API extern DB2Storage<MapDifficultyEntry> sMapDifficultyStore; TC_GAME_API extern DB2Storage<MawPowerEntry> sMawPowerStore; TC_GAME_API extern DB2Storage<ModifierTreeEntry> sModifierTreeStore; TC_GAME_API extern DB2Storage<MountCapabilityEntry> sMountCapabilityStore; @@ -304,9 +303,6 @@ struct TaxiPathBySourceAndDestination uint32 price; }; -using TaxiPathSetForSource = std::map<uint32, TaxiPathBySourceAndDestination>; -using TaxiPathSetBySource = std::map<uint32, TaxiPathSetForSource>; - using TaxiPathNodeList = std::vector<TaxiPathNodeEntry const*>; using TaxiPathNodesByPath = std::vector<TaxiPathNodeList>; @@ -314,7 +310,6 @@ TC_GAME_API extern TaxiMask sTaxiNodesMa TC_GAME_API extern TaxiMask sOldContinentsNodesMask; TC_GAME_API extern TaxiMask sHordeTaxiNodesMask; TC_GAME_API extern TaxiMask sAllianceTaxiNodesMask; -TC_GAME_API extern TaxiPathSetBySource sTaxiPathSetBySource; TC_GAME_API extern TaxiPathNodesByPath sTaxiPathNodesByPath; #define DEFINE_DB2_SET_COMPARATOR(structure) \ @@ -373,7 +368,6 @@ public: using FriendshipRepReactionSet = std::set<FriendshipRepReactionEntry const*, FriendshipRepReactionEntryComparator>; using ItemBonusList = std::vector<ItemBonusEntry const*>; - using MapDifficultyContainer = std::unordered_map<uint32, std::unordered_map<uint32, MapDifficultyEntry const*>>; using MapDifficultyConditionsContainer = std::vector<std::pair<uint32, PlayerConditionEntry const*>>; using MountTypeXCapabilitySet = std::set<MountTypeXCapabilityEntry const*, MountTypeXCapabilityEntryComparator>; using MountXDisplayContainer = std::vector<MountXDisplayEntry const*>; @@ -395,7 +389,7 @@ public: std::vector<uint32> GetAreasForGroup(uint32 areaGroupId) const; static bool IsInArea(uint32 objectAreaId, uint32 areaId); std::vector<ArtifactPowerEntry const*> GetArtifactPowers(uint8 artifactId) const; - std::unordered_set<uint32> const* GetArtifactPowerLinks(uint32 artifactPowerId) const; + std::vector<uint32> const* GetArtifactPowerLinks(uint32 artifactPowerId) const; ArtifactPowerRankEntry const* GetArtifactPowerRank(uint32 artifactPowerId, uint8 rank) const; AzeriteEmpoweredItemEntry const* GetAzeriteEmpoweredItem(uint32 itemId) const; bool IsAzeriteItem(uint32 itemId) const; @@ -411,7 +405,7 @@ public: uint32 GetPowerIndexByClass(Powers power, uint32 classId) const; std::vector<ChrCustomizationChoiceEntry const*> const* GetCustomiztionChoices(uint32 chrCustomizationOptionId) const; std::vector<ChrCustomizationOptionEntry const*> const* GetCustomiztionOptions(uint8 race, uint8 gender) const; - std::unordered_map<uint32, std::vector<uint32>> const* GetRequiredCustomizationChoices(uint32 chrCustomizationReqId) const; + std::vector<std::pair<uint32, std::vector<uint32>>> const* GetRequiredCustomizationChoices(uint32 chrCustomizationReqId) const; ChrModelEntry const* GetChrModel(uint8 race, uint8 gender) const; static char const* GetChrRaceName(uint8 race, LocaleConstant locale = DEFAULT_LOCALE); ChrSpecializationEntry const* GetChrSpecializationByIndex(uint32 class_, uint32 index) const; @@ -446,7 +440,6 @@ public: static LFGDungeonsEntry const* GetLfgDungeon(uint32 mapId, Difficulty difficulty); static uint32 GetDefaultMapLight(uint32 mapId); static uint32 GetLiquidFlags(uint32 liquidType); - MapDifficultyContainer const& GetMapDifficulties() const; MapDifficultyEntry const* GetDefaultMapDifficulty(uint32 mapId, Difficulty* difficulty = nullptr) const; MapDifficultyEntry const* GetMapDifficultyData(uint32 mapId, Difficulty difficulty) const; MapDifficultyEntry const* GetDownscaledMapDifficultyData(uint32 mapId, Difficulty &difficulty) const; @@ -467,7 +460,7 @@ public: static PVPDifficultyEntry const* GetBattlegroundBracketById(uint32 mapid, BattlegroundBracketId id); uint32 GetRequiredLevelForPvpTalentSlot(uint8 slot, Classes class_) const; int32 GetPvpTalentNumSlotsAtLevel(uint32 level, Classes class_) const; - std::unordered_set<QuestLineXQuestEntry const*> const* GetQuestsForQuestLine(uint32 questLineId) const; + std::vector<QuestLineXQuestEntry const*> const* GetQuestsForQuestLine(uint32 questLineId) const; std::vector<QuestPackageItemEntry const*> const* GetQuestPackageItems(uint32 questPackageID) const; std::vector<QuestPackageItemEntry const*> const* GetQuestPackageItemsFallback(uint32 questPackageID) const; uint32 GetQuestUniqueBitFlag(uint32 questId); @@ -485,6 +478,7 @@ public: std::vector<SpellProcsPerMinuteModEntry const*> GetSpellProcsPerMinuteMods(uint32 spellprocsPerMinuteId) const; std::vector<SpellVisualMissileEntry const*> const* GetSpellVisualMissiles(int32 spellVisualMissileSetId) const; std::vector<TalentEntry const*> const& GetTalentsByPosition(uint32 class_, uint32 tier, uint32 column) const; + TaxiPathEntry const* GetTaxiPath(uint32 from, uint32 to) const; static bool IsTotemCategoryCompatibleWith(uint32 itemTotemCategoryId, uint32 requiredTotemCategoryId); bool IsToyItem(uint32 toy) const; TransmogIllusionEntry const* GetTransmogIllusionForEnchantment(uint32 spellItemEnchantmentId) const; diff --git a/src/server/game/Entities/Object/ObjectGuid.cpp b/src/server/game/Entities/Object/ObjectGuid.cpp index 90ae18ef5fe..5f5d6d55736 100644 --- a/src/server/game/Entities/Object/ObjectGuid.cpp +++ b/src/server/game/Entities/Object/ObjectGuid.cpp @@ -752,70 +752,27 @@ ByteBuffer& operator>>(ByteBuffer& buf, ObjectGuid& guid) return buf; } -void ObjectGuidGeneratorBase::HandleCounterOverflow(HighGuid high) +ObjectGuid::LowType ObjectGuidGenerator::Generate() { - TC_LOG_ERROR("misc", "%s guid overflow!! Can't continue, shutting down server. ", ObjectGuid::GetTypeName(high)); + if (_nextGuid >= ObjectGuid::GetMaxCounter(_high) - 1) + HandleCounterOverflow(); + + if (_high == HighGuid::Creature || _high == HighGuid::Vehicle || _high == HighGuid::GameObject || _high == HighGuid::Transport) + CheckGuidTrigger(); + + return _nextGuid++; +} + +void ObjectGuidGenerator::HandleCounterOverflow() +{ + TC_LOG_ERROR("misc", "%s guid overflow!! Can't continue, shutting down server. ", ObjectGuid::GetTypeName(_high)); World::StopNow(ERROR_EXIT_CODE); } -void ObjectGuidGeneratorBase::CheckGuidTrigger(ObjectGuid::LowType guidlow) +void ObjectGuidGenerator::CheckGuidTrigger() { - if (!sWorld->IsGuidAlert() && guidlow > sWorld->getIntConfig(CONFIG_RESPAWN_GUIDALERTLEVEL)) + if (!sWorld->IsGuidAlert() && _nextGuid > sWorld->getIntConfig(CONFIG_RESPAWN_GUIDALERTLEVEL)) sWorld->TriggerGuidAlert(); - else if (!sWorld->IsGuidWarning() && guidlow > sWorld->getIntConfig(CONFIG_RESPAWN_GUIDWARNLEVEL)) + else if (!sWorld->IsGuidWarning() && _nextGuid > sWorld->getIntConfig(CONFIG_RESPAWN_GUIDWARNLEVEL)) sWorld->TriggerGuidWarning(); } - -template class TC_GAME_API ObjectGuidGenerator<HighGuid::Null>; -template class TC_GAME_API ObjectGuidGenerator<HighGuid::Uniq>; -template class TC_GAME_API ObjectGuidGenerator<HighGuid::Player>; -template class TC_GAME_API ObjectGuidGenerator<HighGuid::Item>; -template class TC_GAME_API ObjectGuidGenerator<HighGuid::WorldTransaction>; -template class TC_GAME_API ObjectGuidGenerator<HighGuid::StaticDoor>; -template class TC_GAME_API ObjectGuidGenerator<HighGuid::Transport>; -template class TC_GAME_API ObjectGuidGenerator<HighGuid::Conversation>; -template class TC_GAME_API ObjectGuidGenerator<HighGuid::Creature>; -template class TC_GAME_API ObjectGuidGenerator<HighGuid::Vehicle>; -template class TC_GAME_API ObjectGuidGenerator<HighGuid::Pet>; -template class TC_GAME_API ObjectGuidGenerator<HighGuid::GameObject>; -template class TC_GAME_API ObjectGuidGenerator<HighGuid::DynamicObject>; -template class TC_GAME_API ObjectGuidGenerator<HighGuid::AreaTrigger>; -template class TC_GAME_API ObjectGuidGenerator<HighGuid::Corpse>; -template class TC_GAME_API ObjectGuidGenerator<HighGuid::LootObject>; -template class TC_GAME_API ObjectGuidGenerator<HighGuid::SceneObject>; -template class TC_GAME_API ObjectGuidGenerator<HighGuid::Scenario>; -template class TC_GAME_API ObjectGuidGenerator<HighGuid::AIGroup>; -template class TC_GAME_API ObjectGuidGenerator<HighGuid::DynamicDoor>; -template class TC_GAME_API ObjectGuidGenerator<HighGuid::ClientActor>; -template class TC_GAME_API ObjectGuidGenerator<HighGuid::Vignette>; -template class TC_GAME_API ObjectGuidGenerator<HighGuid::CallForHelp>; -template class TC_GAME_API ObjectGuidGenerator<HighGuid::AIResource>; -template class TC_GAME_API ObjectGuidGenerator<HighGuid::AILock>; -template class TC_GAME_API ObjectGuidGenerator<HighGuid::AILockTicket>; -template class TC_GAME_API ObjectGuidGenerator<HighGuid::ChatChannel>; -template class TC_GAME_API ObjectGuidGenerator<HighGuid::Party>; -template class TC_GAME_API ObjectGuidGenerator<HighGuid::Guild>; -template class TC_GAME_API ObjectGuidGenerator<HighGuid::WowAccount>; -template class TC_GAME_API ObjectGuidGenerator<HighGuid::BNetAccount>; -template class TC_GAME_API ObjectGuidGenerator<HighGuid::GMTask>; -template class TC_GAME_API ObjectGuidGenerator<HighGuid::MobileSession>; -template class TC_GAME_API ObjectGuidGenerator<HighGuid::RaidGroup>; -template class TC_GAME_API ObjectGuidGenerator<HighGuid::Spell>; -template class TC_GAME_API ObjectGuidGenerator<HighGuid::Mail>; -template class TC_GAME_API ObjectGuidGenerator<HighGuid::WebObj>; -template class TC_GAME_API ObjectGuidGenerator<HighGuid::LFGObject>; -template class TC_GAME_API ObjectGuidGenerator<HighGuid::LFGList>; -template class TC_GAME_API ObjectGuidGenerator<HighGuid::UserRouter>; -template class TC_GAME_API ObjectGuidGenerator<HighGuid::PVPQueueGroup>; -template class TC_GAME_API ObjectGuidGenerator<HighGuid::UserClient>; -template class TC_GAME_API ObjectGuidGenerator<HighGuid::PetBattle>; -template class TC_GAME_API ObjectGuidGenerator<HighGuid::UniqUserClient>; -template class TC_GAME_API ObjectGuidGenerator<HighGuid::BattlePet>; -template class TC_GAME_API ObjectGuidGenerator<HighGuid::CommerceObj>; -template class TC_GAME_API ObjectGuidGenerator<HighGuid::ClientSession>; -template class TC_GAME_API ObjectGuidGenerator<HighGuid::Cast>; -template class TC_GAME_API ObjectGuidGenerator<HighGuid::ClientConnection>; -template class TC_GAME_API ObjectGuidGenerator<HighGuid::ClubFinder>; -template class TC_GAME_API ObjectGuidGenerator<HighGuid::ToolsClient>; -template class TC_GAME_API ObjectGuidGenerator<HighGuid::WorldLayer>; -template class TC_GAME_API ObjectGuidGenerator<HighGuid::ArenaTeam>; diff --git a/src/server/game/Entities/Object/ObjectGuid.h b/src/server/game/Entities/Object/ObjectGuid.h index 6d0a4187ee6..670fe8bf240 100644 --- a/src/server/game/Entities/Object/ObjectGuid.h +++ b/src/server/game/Entities/Object/ObjectGuid.h @@ -20,7 +20,6 @@ #include "Define.h" #include "EnumFlag.h" -#include <deque> #include <functional> #include <list> #include <set> @@ -384,44 +383,26 @@ class TC_GAME_API ObjectGuid // Some Shared defines using GuidSet = std::set<ObjectGuid>; using GuidList = std::list<ObjectGuid>; -using GuidDeque = std::deque<ObjectGuid>; using GuidVector = std::vector<ObjectGuid>; using GuidUnorderedSet = std::unordered_set<ObjectGuid>; -class TC_GAME_API ObjectGuidGeneratorBase +class TC_GAME_API ObjectGuidGenerator { public: - ObjectGuidGeneratorBase(ObjectGuid::LowType start = UI64LIT(1)) : _nextGuid(start) { } - virtual ~ObjectGuidGeneratorBase() = default; + explicit ObjectGuidGenerator(HighGuid high, ObjectGuid::LowType start = UI64LIT(1)) : _high(high), _nextGuid(start) { } + ~ObjectGuidGenerator() = default; - virtual void Set(ObjectGuid::LowType val) { _nextGuid = val; } - virtual ObjectGuid::LowType Generate() = 0; + void Set(ObjectGuid::LowType val) { _nextGuid = val; } + ObjectGuid::LowType Generate(); ObjectGuid::LowType GetNextAfterMaxUsed() const { return _nextGuid; } protected: - static void HandleCounterOverflow(HighGuid high); - static void CheckGuidTrigger(ObjectGuid::LowType guid); + void HandleCounterOverflow(); + void CheckGuidTrigger(); + HighGuid _high; ObjectGuid::LowType _nextGuid; }; -template<HighGuid high> -class TC_GAME_API ObjectGuidGenerator : public ObjectGuidGeneratorBase -{ -public: - explicit ObjectGuidGenerator(ObjectGuid::LowType start = UI64LIT(1)) : ObjectGuidGeneratorBase(start) { } - - ObjectGuid::LowType Generate() override - { - if (_nextGuid >= ObjectGuid::GetMaxCounter(high) - 1) - HandleCounterOverflow(high); - - if (high == HighGuid::Creature || high == HighGuid::Vehicle || high == HighGuid::GameObject || high == HighGuid::Transport) - CheckGuidTrigger(_nextGuid); - - return _nextGuid++; - } -}; - TC_GAME_API ByteBuffer& operator<<(ByteBuffer& buf, ObjectGuid const& guid); TC_GAME_API ByteBuffer& operator>>(ByteBuffer& buf, ObjectGuid& guid); diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index a69fcc8603c..e2fb50fd300 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -26718,7 +26718,7 @@ void Player::_LoadTraits(PreparedQueryResult configsResult, PreparedQueryResult for (auto&& [_, traitEntry] : Trinity::Containers::MapEqualRange(traitEntriesByConfig, traitConfig.ID)) traitConfig.Entries.emplace_back() = traitEntry; - if (TraitMgr::ValidateConfig(traitConfig, this) != TALENT_LEARN_OK) + if (TraitMgr::ValidateConfig(traitConfig, this) != TraitMgr::LearnResult::Ok) { traitConfig.Entries.clear(); for (UF::TraitEntry const& grantedEntry : TraitMgr::GetGrantedTraitEntriesForConfig(traitConfig, this)) @@ -28937,3 +28937,33 @@ void Player::SendDisplayToast(uint32 entry, DisplayToastType type, bool isBonusR SendDirectMessage(displayToast.Write()); } + +uint64 TraitMgr::PlayerDataAccessor::GetMoney() const +{ + return _player->GetMoney(); +} + +int32 TraitMgr::PlayerDataAccessor::GetCurrency(int32 currencyId) const +{ + return _player->GetCurrency(currencyId); +} + +int32 TraitMgr::PlayerDataAccessor::GetLevel() const +{ + return _player->GetLevel(); +} + +bool TraitMgr::PlayerDataAccessor::IsQuestRewarded(int32 questId) const +{ + return _player->IsQuestRewarded(questId); +} + +bool TraitMgr::PlayerDataAccessor::HasAchieved(int32 achievementId) const +{ + return _player->HasAchieved(achievementId); +} + +uint32 TraitMgr::PlayerDataAccessor::GetPrimarySpecialization() const +{ + return _player->GetPrimarySpecialization(); +} diff --git a/src/server/game/Entities/Player/SceneMgr.h b/src/server/game/Entities/Player/SceneMgr.h index 664bf6a5d6e..34366459ef8 100644 --- a/src/server/game/Entities/Player/SceneMgr.h +++ b/src/server/game/Entities/Player/SceneMgr.h @@ -21,6 +21,7 @@ #include "Common.h" #include "SceneDefines.h" #include <map> +#include <memory> #include <vector> class Player; diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index c15246784b2..3192fb9015e 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -28,6 +28,7 @@ #include "Util.h" #include <array> #include <map> +#include <memory> #include <stack> #define VISUAL_WAYPOINT 1 // Creature Entry ID used for waypoints show, visible only for GMs diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index ec7e046c2f8..650320fff6e 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -2214,9 +2214,8 @@ void ObjectMgr::LoadCreatures() // Build single time for check spawnmask std::unordered_map<uint32, std::set<Difficulty>> spawnMasks; - for (auto& mapDifficultyPair : sDB2Manager.GetMapDifficulties()) - for (auto& difficultyPair : mapDifficultyPair.second) - spawnMasks[mapDifficultyPair.first].insert(Difficulty(difficultyPair.first)); + for (MapDifficultyEntry const* mapDifficulty : sMapDifficultyStore) + spawnMasks[mapDifficulty->MapID].insert(Difficulty(mapDifficulty->DifficultyID)); PhaseShift phaseShift; @@ -2532,9 +2531,8 @@ void ObjectMgr::LoadGameObjects() // build single time for check spawnmask std::unordered_map<uint32, std::set<Difficulty>> spawnMasks; - for (auto& mapDifficultyPair : sDB2Manager.GetMapDifficulties()) - for (auto& difficultyPair : mapDifficultyPair.second) - spawnMasks[mapDifficultyPair.first].insert(Difficulty(difficultyPair.first)); + for (MapDifficultyEntry const* mapDifficulty : sMapDifficultyStore) + spawnMasks[mapDifficulty->MapID].insert(Difficulty(mapDifficulty->DifficultyID)); PhaseShift phaseShift; @@ -6837,26 +6835,17 @@ uint32 ObjectMgr::GetNearestTaxiNode(float x, float y, float z, uint32 mapid, ui void ObjectMgr::GetTaxiPath(uint32 source, uint32 destination, uint32 &path, uint32 &cost) { - TaxiPathSetBySource::iterator src_i = sTaxiPathSetBySource.find(source); - if (src_i == sTaxiPathSetBySource.end()) + TaxiPathEntry const* taxiPath = sDB2Manager.GetTaxiPath(source, destination); + if (taxiPath) { - path = 0; - cost = 0; - return; + path = taxiPath->ID; + cost = taxiPath->Cost; } - - TaxiPathSetForSource& pathSet = src_i->second; - - TaxiPathSetForSource::iterator dest_i = pathSet.find(destination); - if (dest_i == pathSet.end()) + else { path = 0; cost = 0; - return; } - - cost = dest_i->second.price; - path = dest_i->second.ID; } uint32 ObjectMgr::GetTaxiMountDisplayId(uint32 id, uint32 team, bool allowed_alt_team /* = false */) @@ -7454,22 +7443,22 @@ void ObjectMgr::SetHighestGuids() { QueryResult result = CharacterDatabase.Query("SELECT MAX(guid) FROM characters"); if (result) - GetGuidSequenceGenerator<HighGuid::Player>().Set((*result)[0].GetUInt64() + 1); + GetGuidSequenceGenerator(HighGuid::Player).Set((*result)[0].GetUInt64() + 1); result = CharacterDatabase.Query("SELECT MAX(guid) FROM item_instance"); if (result) - GetGuidSequenceGenerator<HighGuid::Item>().Set((*result)[0].GetUInt64() + 1); + GetGuidSequenceGenerator(HighGuid::Item).Set((*result)[0].GetUInt64() + 1); // Cleanup other tables from nonexistent guids ( >= _hiItemGuid) - CharacterDatabase.PExecute("DELETE FROM character_inventory WHERE item >= '%u'", GetGuidSequenceGenerator<HighGuid::Item>().GetNextAfterMaxUsed()); // One-time query - CharacterDatabase.PExecute("DELETE FROM mail_items WHERE item_guid >= '%u'", GetGuidSequenceGenerator<HighGuid::Item>().GetNextAfterMaxUsed()); // One-time query + CharacterDatabase.PExecute("DELETE FROM character_inventory WHERE item >= '%u'", GetGuidSequenceGenerator(HighGuid::Item).GetNextAfterMaxUsed()); // One-time query + CharacterDatabase.PExecute("DELETE FROM mail_items WHERE item_guid >= '%u'", GetGuidSequenceGenerator(HighGuid::Item).GetNextAfterMaxUsed()); // One-time query CharacterDatabase.PExecute("DELETE a, ab, ai FROM auctionhouse a LEFT JOIN auction_bidders ab ON ab.auctionId = a.id LEFT JOIN auction_items ai ON ai.auctionId = a.id WHERE ai.itemGuid >= '%u'", - GetGuidSequenceGenerator<HighGuid::Item>().GetNextAfterMaxUsed()); // One-time query - CharacterDatabase.PExecute("DELETE FROM guild_bank_item WHERE item_guid >= '%u'", GetGuidSequenceGenerator<HighGuid::Item>().GetNextAfterMaxUsed()); // One-time query + GetGuidSequenceGenerator(HighGuid::Item).GetNextAfterMaxUsed()); // One-time query + CharacterDatabase.PExecute("DELETE FROM guild_bank_item WHERE item_guid >= '%u'", GetGuidSequenceGenerator(HighGuid::Item).GetNextAfterMaxUsed()); // One-time query result = WorldDatabase.Query("SELECT MAX(guid) FROM transports"); if (result) - GetGuidSequenceGenerator<HighGuid::Transport>().Set((*result)[0].GetUInt64() + 1); + GetGuidSequenceGenerator(HighGuid::Transport).Set((*result)[0].GetUInt64() + 1); result = CharacterDatabase.Query("SELECT MAX(id) FROM auctionhouse"); if (result) @@ -7508,6 +7497,15 @@ void ObjectMgr::SetHighestGuids() _gameObjectSpawnId = (*result)[0].GetUInt64() + 1; } +ObjectGuidGenerator& ObjectMgr::GetGuidSequenceGenerator(HighGuid high) +{ + auto itr = _guidGenerators.find(high); + if (itr == _guidGenerators.end()) + itr = _guidGenerators.insert(std::make_pair(high, std::make_unique<ObjectGuidGenerator>(high))).first; + + return *itr->second; +} + uint32 ObjectMgr::GenerateAuctionID() { if (_auctionId >= 0xFFFFFFFE) diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h index fe5cb6877c5..c7e205bba3a 100644 --- a/src/server/game/Globals/ObjectMgr.h +++ b/src/server/game/Globals/ObjectMgr.h @@ -1448,11 +1448,11 @@ class TC_GAME_API ObjectMgr void SetHighestGuids(); template<HighGuid type> - inline ObjectGuidGeneratorBase& GetGenerator() + ObjectGuidGenerator& GetGenerator() { static_assert(ObjectGuidTraits<type>::SequenceSource.HasFlag(ObjectGuidSequenceSource::Global | ObjectGuidSequenceSource::Realm), "Only global guid can be generated in ObjectMgr context"); - return GetGuidSequenceGenerator<type>(); + return GetGuidSequenceGenerator(type); } uint32 GenerateAuctionID(); @@ -1801,17 +1801,9 @@ class TC_GAME_API ObjectMgr uint64 _voidItemId; // first free low guid for selected guid type - template<HighGuid high> - inline ObjectGuidGeneratorBase& GetGuidSequenceGenerator() - { - auto itr = _guidGenerators.find(high); - if (itr == _guidGenerators.end()) - itr = _guidGenerators.insert(std::make_pair(high, std::make_unique<ObjectGuidGenerator<high>>())).first; - - return *itr->second; - } + ObjectGuidGenerator& GetGuidSequenceGenerator(HighGuid high); - std::map<HighGuid, std::unique_ptr<ObjectGuidGeneratorBase>> _guidGenerators; + std::map<HighGuid, std::unique_ptr<ObjectGuidGenerator>> _guidGenerators; QuestContainer _questTemplates; std::vector<Quest const*> _questTemplatesAutoPush; QuestObjectivesByIdContainer _questObjectives; diff --git a/src/server/game/Grids/Dynamic/TypeContainer.h b/src/server/game/Grids/Dynamic/TypeContainer.h index 0776bde32e0..f1d57735cef 100644 --- a/src/server/game/Grids/Dynamic/TypeContainer.h +++ b/src/server/game/Grids/Dynamic/TypeContainer.h @@ -36,7 +36,6 @@ template<class OBJECT> struct ContainerMapList { - //std::map<OBJECT_HANDLE, OBJECT *> _element; GridRefManager<OBJECT> _element; }; @@ -82,67 +81,145 @@ struct ContainerUnorderedMap<TypeList<H, T>, KEY_TYPE> template<class OBJECT_TYPES> class TypeMapContainer { - public: - template<class SPECIFIC_TYPE> size_t Count() const { return Trinity::Count(i_elements, (SPECIFIC_TYPE*)nullptr); } - - /// inserts a specific object into the container - template<class SPECIFIC_TYPE> - bool insert(SPECIFIC_TYPE *obj) - { - SPECIFIC_TYPE* t = Trinity::Insert(i_elements, obj); - return (t != nullptr); - } - - /// Removes the object from the container, and returns the removed object - //template<class SPECIFIC_TYPE> - //bool remove(SPECIFIC_TYPE* obj) - //{ - // SPECIFIC_TYPE* t = Trinity::Remove(i_elements, obj); - // return (t != nullptr); - //} - - ContainerMapList<OBJECT_TYPES> & GetElements(void) { return i_elements; } - const ContainerMapList<OBJECT_TYPES> & GetElements(void) const { return i_elements;} - - private: - ContainerMapList<OBJECT_TYPES> i_elements; +public: + TypeMapContainer(); + TypeMapContainer(TypeMapContainer const&) = default; + TypeMapContainer(TypeMapContainer&&) noexcept = default; + TypeMapContainer& operator=(TypeMapContainer const&) = default; + TypeMapContainer& operator=(TypeMapContainer&&) noexcept = default; + ~TypeMapContainer(); + + template<class SPECIFIC_TYPE> + size_t Count() const; + + /// inserts a specific object into the container + template<class SPECIFIC_TYPE> + bool insert(SPECIFIC_TYPE *obj); + + /// Removes the object from the container, and returns the removed object + //template<class SPECIFIC_TYPE> + //bool remove(SPECIFIC_TYPE* obj) + //{ + // SPECIFIC_TYPE* t = Trinity::Remove(i_elements, obj); + // return (t != nullptr); + //} + + ContainerMapList<OBJECT_TYPES>& GetElements(void); + const ContainerMapList<OBJECT_TYPES>& GetElements(void) const; + +private: + ContainerMapList<OBJECT_TYPES> i_elements; }; +template <class OBJECT_TYPES> +TypeMapContainer<OBJECT_TYPES>::TypeMapContainer() = default; + +template <class OBJECT_TYPES> +TypeMapContainer<OBJECT_TYPES>::~TypeMapContainer() = default; + +template <class OBJECT_TYPES> +template <class SPECIFIC_TYPE> +size_t TypeMapContainer<OBJECT_TYPES>::Count() const +{ + return Trinity::Count(i_elements, (SPECIFIC_TYPE*)nullptr); +} + +template <class OBJECT_TYPES> +template <class SPECIFIC_TYPE> +bool TypeMapContainer<OBJECT_TYPES>::insert(SPECIFIC_TYPE* obj) +{ + SPECIFIC_TYPE* t = Trinity::Insert(i_elements, obj); + return (t != nullptr); +} + +template <class OBJECT_TYPES> +ContainerMapList<OBJECT_TYPES>& TypeMapContainer<OBJECT_TYPES>::GetElements() +{ + return i_elements; +} + +template <class OBJECT_TYPES> +const ContainerMapList<OBJECT_TYPES>& TypeMapContainer<OBJECT_TYPES>::GetElements() const +{ + return i_elements; +} + template<class OBJECT_TYPES, class KEY_TYPE> class TypeUnorderedMapContainer { public: + TypeUnorderedMapContainer(); + TypeUnorderedMapContainer(TypeUnorderedMapContainer const&) = default; + TypeUnorderedMapContainer(TypeUnorderedMapContainer&&) noexcept = default; + TypeUnorderedMapContainer& operator=(TypeUnorderedMapContainer const&) = default; + TypeUnorderedMapContainer& operator=(TypeUnorderedMapContainer&&) noexcept = default; + ~TypeUnorderedMapContainer(); + template<class SPECIFIC_TYPE> - bool Insert(KEY_TYPE const& handle, SPECIFIC_TYPE* obj) - { - return Trinity::Insert(_elements, handle, obj); - } + bool Insert(KEY_TYPE const& handle, SPECIFIC_TYPE* obj); template<class SPECIFIC_TYPE> - bool Remove(KEY_TYPE const& handle) - { - return Trinity::Remove(_elements, handle, (SPECIFIC_TYPE*)nullptr); - } + bool Remove(KEY_TYPE const& handle); template<class SPECIFIC_TYPE> - SPECIFIC_TYPE* Find(KEY_TYPE const& handle) - { - return Trinity::Find(_elements, handle, (SPECIFIC_TYPE*)nullptr); - } + SPECIFIC_TYPE* Find(KEY_TYPE const& handle); template<class SPECIFIC_TYPE> - std::size_t Size() const - { - std::size_t size = 0; - Trinity::Size(_elements, &size, (SPECIFIC_TYPE*)nullptr); - return size; - } + std::size_t Size() const; - ContainerUnorderedMap<OBJECT_TYPES, KEY_TYPE>& GetElements() { return _elements; } - ContainerUnorderedMap<OBJECT_TYPES, KEY_TYPE> const& GetElements() const { return _elements; } + ContainerUnorderedMap<OBJECT_TYPES, KEY_TYPE>& GetElements(); + ContainerUnorderedMap<OBJECT_TYPES, KEY_TYPE> const& GetElements() const; private: ContainerUnorderedMap<OBJECT_TYPES, KEY_TYPE> _elements; }; +template <class OBJECT_TYPES, class KEY_TYPE> +TypeUnorderedMapContainer<OBJECT_TYPES, KEY_TYPE>::TypeUnorderedMapContainer() = default; + +template <class OBJECT_TYPES, class KEY_TYPE> +TypeUnorderedMapContainer<OBJECT_TYPES, KEY_TYPE>::~TypeUnorderedMapContainer() = default; + +template <class OBJECT_TYPES, class KEY_TYPE> +template <class SPECIFIC_TYPE> +bool TypeUnorderedMapContainer<OBJECT_TYPES, KEY_TYPE>::Insert(KEY_TYPE const& handle, SPECIFIC_TYPE* obj) +{ + return Trinity::Insert(_elements, handle, obj); +} + +template <class OBJECT_TYPES, class KEY_TYPE> +template <class SPECIFIC_TYPE> +bool TypeUnorderedMapContainer<OBJECT_TYPES, KEY_TYPE>::Remove(KEY_TYPE const& handle) +{ + return Trinity::Remove(_elements, handle, (SPECIFIC_TYPE*)nullptr); +} + +template <class OBJECT_TYPES, class KEY_TYPE> +template <class SPECIFIC_TYPE> +SPECIFIC_TYPE* TypeUnorderedMapContainer<OBJECT_TYPES, KEY_TYPE>::Find(KEY_TYPE const& handle) +{ + return Trinity::Find(_elements, handle, (SPECIFIC_TYPE*)nullptr); +} + +template <class OBJECT_TYPES, class KEY_TYPE> +template <class SPECIFIC_TYPE> +std::size_t TypeUnorderedMapContainer<OBJECT_TYPES, KEY_TYPE>::Size() const +{ + std::size_t size = 0; + Trinity::Size(_elements, &size, (SPECIFIC_TYPE*)nullptr); + return size; +} + +template <class OBJECT_TYPES, class KEY_TYPE> +ContainerUnorderedMap<OBJECT_TYPES, KEY_TYPE>& TypeUnorderedMapContainer<OBJECT_TYPES, KEY_TYPE>::GetElements() +{ + return _elements; +} + +template <class OBJECT_TYPES, class KEY_TYPE> +ContainerUnorderedMap<OBJECT_TYPES, KEY_TYPE> const& TypeUnorderedMapContainer<OBJECT_TYPES, KEY_TYPE>::GetElements() const +{ + return _elements; +} + #endif diff --git a/src/server/game/Grids/GridDefines.h b/src/server/game/Grids/GridDefines.h index d9d13e562bf..32a81b968fb 100644 --- a/src/server/game/Grids/GridDefines.h +++ b/src/server/game/Grids/GridDefines.h @@ -89,6 +89,12 @@ enum GridMapTypeMask GRID_MAP_TYPE_MASK_ALL = 0xFF }; +extern template class Grid<Player, AllWorldObjectTypes, AllGridObjectTypes>; +extern template class NGrid<MAX_NUMBER_OF_CELLS, Player, AllWorldObjectTypes, AllGridObjectTypes>; + +extern template class TypeMapContainer<AllGridObjectTypes>; +extern template class TypeMapContainer<AllWorldObjectTypes>; + typedef Grid<Player, AllWorldObjectTypes, AllGridObjectTypes> GridType; typedef NGrid<MAX_NUMBER_OF_CELLS, Player, AllWorldObjectTypes, AllGridObjectTypes> NGridType; diff --git a/src/server/game/Grids/NGrid.cpp b/src/server/game/Grids/NGrid.cpp index 2e7c7890c9d..b9530c684a2 100644 --- a/src/server/game/Grids/NGrid.cpp +++ b/src/server/game/Grids/NGrid.cpp @@ -16,6 +16,7 @@ */ #include "NGrid.h" +#include "GridDefines.h" #include "Random.h" GridInfo::GridInfo() : i_timer(0), vis_Update(0, irand(0, DEFAULT_VISIBILITY_NOTIFY_PERIOD)), @@ -27,3 +28,9 @@ GridInfo::GridInfo(time_t expiry, bool unload /*= true */) : i_timer(expiry), vi i_unloadActiveLockCount(0), i_unloadExplicitLock(!unload) { } + +template class Grid<Player, AllWorldObjectTypes, AllGridObjectTypes>; +template class NGrid<MAX_NUMBER_OF_CELLS, Player, AllWorldObjectTypes, AllGridObjectTypes>; + +template class TC_GAME_API TypeMapContainer<AllGridObjectTypes>; +template class TC_GAME_API TypeMapContainer<AllWorldObjectTypes>; diff --git a/src/server/game/Handlers/ArtifactHandler.cpp b/src/server/game/Handlers/ArtifactHandler.cpp index 18a30d0f40e..66d94b955c3 100644 --- a/src/server/game/Handlers/ArtifactHandler.cpp +++ b/src/server/game/Handlers/ArtifactHandler.cpp @@ -73,7 +73,7 @@ void WorldSession::HandleArtifactAddPower(WorldPackets::Artifact::ArtifactAddPow if (!(artifactPowerEntry->Flags & ARTIFACT_POWER_FLAG_NO_LINK_REQUIRED)) { - if (std::unordered_set<uint32> const* artifactPowerLinks = sDB2Manager.GetArtifactPowerLinks(artifactPower->ArtifactPowerID)) + if (std::vector<uint32> const* artifactPowerLinks = sDB2Manager.GetArtifactPowerLinks(artifactPower->ArtifactPowerID)) { bool hasAnyLink = false; for (uint32 artifactPowerLinkId : *artifactPowerLinks) diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index e63223554af..c4d6cd0f21d 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -534,12 +534,12 @@ bool WorldSession::MeetsChrCustomizationReq(ChrCustomizationReqEntry const* req, if (checkRequiredDependentChoices) { - if (std::unordered_map<uint32, std::vector<uint32>> const* requiredChoices = sDB2Manager.GetRequiredCustomizationChoices(req->ID)) + if (std::vector<std::pair<uint32, std::vector<uint32>>> const* requiredChoices = sDB2Manager.GetRequiredCustomizationChoices(req->ID)) { - for (std::pair<uint32 const /*chrCustomizationOptionId*/, std::vector<uint32>> const& requiredChoicesForOption : *requiredChoices) + for (auto const& [chrCustomizationOptionId, requiredChoicesForOption] : *requiredChoices) { bool hasRequiredChoiceForOption = false; - for (uint32 requiredChoice : requiredChoicesForOption.second) + for (uint32 requiredChoice : requiredChoicesForOption) { auto choiceItr = std::find_if(selectedChoices.begin(), selectedChoices.end(), [requiredChoice](UF::ChrCustomizationChoice const& choice) { diff --git a/src/server/game/Handlers/TraitHandler.cpp b/src/server/game/Handlers/TraitHandler.cpp index ae61b159d62..16882b134c6 100644 --- a/src/server/game/Handlers/TraitHandler.cpp +++ b/src/server/game/Handlers/TraitHandler.cpp @@ -124,10 +124,10 @@ void WorldSession::HandleTraitsCommitConfig(WorldPackets::Traits::TraitsCommitCo newConfigState.Entries.emplace_back() = newEntry; } - TalentLearnResult validationResult = TraitMgr::ValidateConfig(newConfigState, _player, true); - if (validationResult != TALENT_LEARN_OK) + TraitMgr::LearnResult validationResult = TraitMgr::ValidateConfig(newConfigState, _player, true); + if (validationResult != TraitMgr::LearnResult::Ok) { - SendPacket(WorldPackets::Traits::TraitConfigCommitFailed(configId, 0, validationResult).Write()); + SendPacket(WorldPackets::Traits::TraitConfigCommitFailed(configId, 0, AsUnderlyingType(validationResult)).Write()); return; } @@ -189,8 +189,8 @@ void WorldSession::HandleClassTalentsRequestNewConfig(WorldPackets::Traits::Clas newEntry.Rank = std::max(0, traitNodeEntry->MaxRanks - newEntry.GrantedRanks); } - TalentLearnResult validationResult = TraitMgr::ValidateConfig(classTalentsRequestNewConfig.Config, _player); - if (validationResult != TALENT_LEARN_OK) + TraitMgr::LearnResult validationResult = TraitMgr::ValidateConfig(classTalentsRequestNewConfig.Config, _player); + if (validationResult != TraitMgr::LearnResult::Ok) return; _player->CreateTraitConfig(classTalentsRequestNewConfig.Config); diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index fdec078db36..9b863c17cac 100644 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -164,7 +164,7 @@ i_scriptLock(false), _respawnTimes(std::make_unique<RespawnListContainer>()), _r _weatherUpdateTimer.SetInterval(time_t(1 * IN_MILLISECONDS)); - GetGuidSequenceGenerator<HighGuid::Transport>().Set(sObjectMgr->GetGenerator<HighGuid::Transport>().GetNextAfterMaxUsed()); + GetGuidSequenceGenerator(HighGuid::Transport).Set(sObjectMgr->GetGenerator<HighGuid::Transport>().GetNextAfterMaxUsed()); _poolData = sPoolMgr->InitPoolsForMap(this); @@ -2474,6 +2474,15 @@ void Map::UpdateSpawnGroupConditions() } } +ObjectGuidGenerator& Map::GetGuidSequenceGenerator(HighGuid high) +{ + auto itr = _guidGenerators.find(high); + if (itr == _guidGenerators.end()) + itr = _guidGenerators.insert(std::make_pair(high, std::make_unique<ObjectGuidGenerator>(high))).first; + + return *itr->second; +} + void Map::AddFarSpellCallback(FarSpellCallback&& callback) { _farSpellCallbacks.Enqueue(new FarSpellCallback(std::move(callback))); @@ -3913,3 +3922,5 @@ std::string InstanceMap::GetDebugInfo() const << "ScriptId: " << GetScriptId() << " ScriptName: " << GetScriptName(); return sstr.str(); } + +template class TC_GAME_API TypeUnorderedMapContainer<AllMapStoredObjectTypes, ObjectGuid>; diff --git a/src/server/game/Maps/Map.h b/src/server/game/Maps/Map.h index a3061418e4a..da4aa7ced8e 100644 --- a/src/server/game/Maps/Map.h +++ b/src/server/game/Maps/Map.h @@ -178,6 +178,7 @@ inline bool CompareRespawnInfo::operator()(RespawnInfo const* a, RespawnInfo con return a->type < b->type; } +extern template class TypeUnorderedMapContainer<AllMapStoredObjectTypes, ObjectGuid>; typedef TypeUnorderedMapContainer<AllMapStoredObjectTypes, ObjectGuid> MapStoredObjectTypesContainer; class TC_GAME_API Map : public GridRefManager<NGridType> @@ -494,14 +495,14 @@ class TC_GAME_API Map : public GridRefManager<NGridType> inline ObjectGuid::LowType GenerateLowGuid() { static_assert(ObjectGuidTraits<high>::SequenceSource.HasFlag(ObjectGuidSequenceSource::Map), "Only map specific guid can be generated in Map context"); - return GetGuidSequenceGenerator<high>().Generate(); + return GetGuidSequenceGenerator(high).Generate(); } template<HighGuid high> inline ObjectGuid::LowType GetMaxLowGuid() { static_assert(ObjectGuidTraits<high>::SequenceSource.HasFlag(ObjectGuidSequenceSource::Map), "Only map specific guid can be retrieved in Map context"); - return GetGuidSequenceGenerator<high>().GetNextAfterMaxUsed(); + return GetGuidSequenceGenerator(high).GetNextAfterMaxUsed(); } void AddUpdateObject(Object* obj) @@ -762,17 +763,9 @@ class TC_GAME_API Map : public GridRefManager<NGridType> ZoneDynamicInfoMap _zoneDynamicInfo; IntervalTimer _weatherUpdateTimer; - template<HighGuid high> - inline ObjectGuidGeneratorBase& GetGuidSequenceGenerator() - { - auto itr = _guidGenerators.find(high); - if (itr == _guidGenerators.end()) - itr = _guidGenerators.insert(std::make_pair(high, std::make_unique<ObjectGuidGenerator<high>>())).first; - - return *itr->second; - } + ObjectGuidGenerator& GetGuidSequenceGenerator(HighGuid high); - std::map<HighGuid, std::unique_ptr<ObjectGuidGeneratorBase>> _guidGenerators; + std::map<HighGuid, std::unique_ptr<ObjectGuidGenerator>> _guidGenerators; std::unique_ptr<SpawnedPoolData> _poolData; MapStoredObjectTypesContainer _objectsStore; CreatureBySpawnIdContainer _creatureBySpawnIdStore; diff --git a/src/server/game/Scripting/ScriptMgr.cpp b/src/server/game/Scripting/ScriptMgr.cpp index 994c02cb108..c448585cce8 100644 --- a/src/server/game/Scripting/ScriptMgr.cpp +++ b/src/server/game/Scripting/ScriptMgr.cpp @@ -1194,6 +1194,11 @@ ScriptObject::~ScriptObject() sScriptMgr->DecreaseScriptCount(); } +std::string const& ScriptObject::GetName() const +{ + return _name; +} + ScriptMgr::ScriptMgr() : _scriptCount(0), _scriptIdUpdated(false), _script_loader_callback(nullptr) { @@ -2336,6 +2341,16 @@ SpellScriptLoader::SpellScriptLoader(char const* name) ScriptRegistry<SpellScriptLoader>::Instance()->AddScript(this); } +SpellScript* SpellScriptLoader::GetSpellScript() const +{ + return nullptr; +} + +AuraScript* SpellScriptLoader::GetAuraScript() const +{ + return nullptr; +} + ServerScript::ServerScript(char const* name) : ScriptObject(name) { @@ -2344,6 +2359,30 @@ ServerScript::ServerScript(char const* name) ServerScript::~ServerScript() = default; +void ServerScript::OnNetworkStart() +{ +} + +void ServerScript::OnNetworkStop() +{ +} + +void ServerScript::OnSocketOpen(std::shared_ptr<WorldSocket> /*socket*/) +{ +} + +void ServerScript::OnSocketClose(std::shared_ptr<WorldSocket> /*socket*/) +{ +} + +void ServerScript::OnPacketSend(WorldSession* /*session*/, WorldPacket& /*packet*/) +{ +} + +void ServerScript::OnPacketReceive(WorldSession* /*session*/, WorldPacket& /*packet*/) +{ +} + WorldScript::WorldScript(char const* name) : ScriptObject(name) { @@ -2352,6 +2391,38 @@ WorldScript::WorldScript(char const* name) WorldScript::~WorldScript() = default; +void WorldScript::OnOpenStateChange(bool /*open*/) +{ +} + +void WorldScript::OnConfigLoad(bool /*reload*/) +{ +} + +void WorldScript::OnMotdChange(std::string& /*newMotd*/) +{ +} + +void WorldScript::OnShutdownInitiate(ShutdownExitCode /*code*/, ShutdownMask /*mask*/) +{ +} + +void WorldScript::OnShutdownCancel() +{ +} + +void WorldScript::OnUpdate(uint32 /*diff*/) +{ +} + +void WorldScript::OnStartup() +{ +} + +void WorldScript::OnShutdown() +{ +} + FormulaScript::FormulaScript(char const* name) : ScriptObject(name) { @@ -2360,16 +2431,76 @@ FormulaScript::FormulaScript(char const* name) FormulaScript::~FormulaScript() = default; -UnitScript::UnitScript(char const* name) - : ScriptObject(name) +void FormulaScript::OnHonorCalculation(float& /*honor*/, uint8 /*level*/, float /*multiplier*/) { - ScriptRegistry<UnitScript>::Instance()->AddScript(this); } -UnitScript::~UnitScript() = default; +void FormulaScript::OnGrayLevelCalculation(uint8& /*grayLevel*/, uint8 /*playerLevel*/) +{ +} + +void FormulaScript::OnColorCodeCalculation(XPColorChar& /*color*/, uint8 /*playerLevel*/, uint8 /*mobLevel*/) +{ +} + +void FormulaScript::OnZeroDifferenceCalculation(uint8& /*diff*/, uint8 /*playerLevel*/) +{ +} + +void FormulaScript::OnBaseGainCalculation(uint32& /*gain*/, uint8 /*playerLevel*/, uint8 /*mobLevel*/) +{ +} + +void FormulaScript::OnGainCalculation(uint32& /*gain*/, Player* /*player*/, Unit* /*unit*/) +{ +} + +void FormulaScript::OnGroupRateCalculation(float& /*rate*/, uint32 /*count*/, bool /*isRaid*/) +{ +} + +template <class TMap> +MapScript<TMap>::MapScript(MapEntry const* mapEntry) : _mapEntry(mapEntry) +{ +} + +template <class TMap> +MapEntry const* MapScript<TMap>::GetEntry() const +{ + return _mapEntry; +} + +template <class TMap> +void MapScript<TMap>::OnCreate(TMap* /*map*/) +{ +} + +template <class TMap> +void MapScript<TMap>::OnDestroy(TMap* /*map*/) +{ +} + +template <class TMap> +void MapScript<TMap>::OnPlayerEnter(TMap* /*map*/, Player* /*player*/) +{ +} + +template <class TMap> +void MapScript<TMap>::OnPlayerLeave(TMap* /*map*/, Player* /*player*/) +{ +} + +template <class TMap> +void MapScript<TMap>::OnUpdate(TMap* /*map*/, uint32 /*diff*/) +{ +} + +template class TC_GAME_API MapScript<Map>; +template class TC_GAME_API MapScript<InstanceMap>; +template class TC_GAME_API MapScript<BattlegroundMap>; WorldMapScript::WorldMapScript(char const* name, uint32 mapId) - : ScriptObject(name), MapScript<Map>(sMapStore.LookupEntry(mapId)) + : ScriptObject(name), MapScript(sMapStore.LookupEntry(mapId)) { if (!GetEntry()) TC_LOG_ERROR("scripts", "Invalid WorldMapScript for %u; no such map ID.", mapId); @@ -2383,7 +2514,7 @@ WorldMapScript::WorldMapScript(char const* name, uint32 mapId) WorldMapScript::~WorldMapScript() = default; InstanceMapScript::InstanceMapScript(char const* name, uint32 mapId) - : ScriptObject(name), MapScript<InstanceMap>(sMapStore.LookupEntry(mapId)) + : ScriptObject(name), MapScript(sMapStore.LookupEntry(mapId)) { if (!GetEntry()) TC_LOG_ERROR("scripts", "Invalid InstanceMapScript for %u; no such map ID.", mapId); @@ -2396,8 +2527,13 @@ InstanceMapScript::InstanceMapScript(char const* name, uint32 mapId) InstanceMapScript::~InstanceMapScript() = default; +InstanceScript* InstanceMapScript::GetInstanceScript(InstanceMap* /*map*/) const +{ + return nullptr; +} + BattlegroundMapScript::BattlegroundMapScript(char const* name, uint32 mapId) - : ScriptObject(name), MapScript<BattlegroundMap>(sMapStore.LookupEntry(mapId)) + : ScriptObject(name), MapScript(sMapStore.LookupEntry(mapId)) { if (!GetEntry()) TC_LOG_ERROR("scripts", "Invalid BattlegroundMapScript for %u; no such map ID.", mapId); @@ -2418,6 +2554,59 @@ ItemScript::ItemScript(char const* name) ItemScript::~ItemScript() = default; +bool ItemScript::OnQuestAccept(Player* /*player*/, Item* /*item*/, Quest const* /*quest*/) +{ + return false; +} + +bool ItemScript::OnUse(Player* /*player*/, Item* /*item*/, SpellCastTargets const& /*targets*/, ObjectGuid /*castId*/) +{ + return false; +} + +bool ItemScript::OnExpire(Player* /*player*/, ItemTemplate const* /*proto*/) +{ + return false; +} + +bool ItemScript::OnRemove(Player* /*player*/, Item* /*item*/) +{ + return false; +} + +bool ItemScript::OnCastItemCombatSpell(Player* /*player*/, Unit* /*victim*/, SpellInfo const* /*spellInfo*/, Item* /*item*/) +{ + return true; +} + +UnitScript::UnitScript(char const* name) + : ScriptObject(name) +{ + ScriptRegistry<UnitScript>::Instance()->AddScript(this); +} + +UnitScript::~UnitScript() = default; + +void UnitScript::OnHeal(Unit* /*healer*/, Unit* /*reciever*/, uint32& /*gain*/) +{ +} + +void UnitScript::OnDamage(Unit* /*attacker*/, Unit* /*victim*/, uint32& /*damage*/) +{ +} + +void UnitScript::ModifyPeriodicDamageAurasTick(Unit* /*target*/, Unit* /*attacker*/, uint32& /*damage*/) +{ +} + +void UnitScript::ModifyMeleeDamage(Unit* /*target*/, Unit* /*attacker*/, uint32& /*damage*/) +{ +} + +void UnitScript::ModifySpellDamageTaken(Unit* /*target*/, Unit* /*attacker*/, int32& /*damage*/, SpellInfo const* /*spellInfo*/) +{ +} + CreatureScript::CreatureScript(char const* name) : ScriptObject(name) { @@ -2442,6 +2631,16 @@ AreaTriggerScript::AreaTriggerScript(char const* name) AreaTriggerScript::~AreaTriggerScript() = default; +bool AreaTriggerScript::OnTrigger(Player* /*player*/, AreaTriggerEntry const* /*trigger*/) +{ + return false; +} + +bool AreaTriggerScript::OnExit(Player* /*player*/, AreaTriggerEntry const* /*trigger*/) +{ + return false; +} + OnlyOnceAreaTriggerScript::~OnlyOnceAreaTriggerScript() = default; bool OnlyOnceAreaTriggerScript::OnTrigger(Player* player, AreaTriggerEntry const* trigger) @@ -2456,7 +2655,7 @@ bool OnlyOnceAreaTriggerScript::OnTrigger(Player* player, AreaTriggerEntry const return true; } -void OnlyOnceAreaTriggerScript::ResetAreaTriggerDone(InstanceScript* script, uint32 triggerId) { script->ResetAreaTriggerDone(triggerId); } +void OnlyOnceAreaTriggerScript::ResetAreaTriggerDone(InstanceScript* instance, uint32 triggerId) { instance->ResetAreaTriggerDone(triggerId); } void OnlyOnceAreaTriggerScript::ResetAreaTriggerDone(Player const* player, AreaTriggerEntry const* trigger) { if (InstanceScript* instance = player->GetInstanceScript()) ResetAreaTriggerDone(instance, trigger->ID); } BattlefieldScript::BattlefieldScript(char const* name) @@ -2499,6 +2698,14 @@ WeatherScript::WeatherScript(char const* name) WeatherScript::~WeatherScript() = default; +void WeatherScript::OnChange(Weather* /*weather*/, WeatherState /*state*/, float /*grade*/) +{ +} + +void WeatherScript::OnUpdate(Weather* /*weather*/, uint32 /*diff*/) +{ +} + AuctionHouseScript::AuctionHouseScript(char const* name) : ScriptObject(name) { @@ -2507,6 +2714,22 @@ AuctionHouseScript::AuctionHouseScript(char const* name) AuctionHouseScript::~AuctionHouseScript() = default; +void AuctionHouseScript::OnAuctionAdd(AuctionHouseObject* /*ah*/, AuctionPosting* /*auction*/) +{ +} + +void AuctionHouseScript::OnAuctionRemove(AuctionHouseObject* /*ah*/, AuctionPosting* /*auction*/) +{ +} + +void AuctionHouseScript::OnAuctionSuccessful(AuctionHouseObject* /*ah*/, AuctionPosting* /*auction*/) +{ +} + +void AuctionHouseScript::OnAuctionExpire(AuctionHouseObject* /*ah*/, AuctionPosting* /*auction*/) +{ +} + ConditionScript::ConditionScript(char const* name) : ScriptObject(name) { @@ -2515,6 +2738,11 @@ ConditionScript::ConditionScript(char const* name) ConditionScript::~ConditionScript() = default; +bool ConditionScript::OnConditionCheck(Condition const* /*condition*/, ConditionSourceInfo& /*sourceInfo*/) +{ + return true; +} + VehicleScript::VehicleScript(char const* name) : ScriptObject(name) { @@ -2523,6 +2751,30 @@ VehicleScript::VehicleScript(char const* name) VehicleScript::~VehicleScript() = default; +void VehicleScript::OnInstall(Vehicle* /*veh*/) +{ +} + +void VehicleScript::OnUninstall(Vehicle* /*veh*/) +{ +} + +void VehicleScript::OnReset(Vehicle* /*veh*/) +{ +} + +void VehicleScript::OnInstallAccessory(Vehicle* /*veh*/, Creature* /*accessory*/) +{ +} + +void VehicleScript::OnAddPassenger(Vehicle* /*veh*/, Unit* /*passenger*/, int8 /*seatId*/) +{ +} + +void VehicleScript::OnRemovePassenger(Vehicle* /*veh*/, Unit* /*passenger*/) +{ +} + DynamicObjectScript::DynamicObjectScript(char const* name) : ScriptObject(name) { @@ -2531,6 +2783,10 @@ DynamicObjectScript::DynamicObjectScript(char const* name) DynamicObjectScript::~DynamicObjectScript() = default; +void DynamicObjectScript::OnUpdate(DynamicObject* /*obj*/, uint32 /*diff*/) +{ +} + TransportScript::TransportScript(char const* name) : ScriptObject(name) { @@ -2539,6 +2795,26 @@ TransportScript::TransportScript(char const* name) TransportScript::~TransportScript() = default; +void TransportScript::OnAddPassenger(Transport* /*transport*/, Player* /*player*/) +{ +} + +void TransportScript::OnAddCreaturePassenger(Transport* /*transport*/, Creature* /*creature*/) +{ +} + +void TransportScript::OnRemovePassenger(Transport* /*transport*/, Player* /*player*/) +{ +} + +void TransportScript::OnRelocate(Transport* /*transport*/, uint32 /*mapId*/, float /*x*/, float /*y*/, float /*z*/) +{ +} + +void TransportScript::OnUpdate(Transport* /*transport*/, uint32 /*diff*/) +{ +} + AchievementScript::AchievementScript(char const* name) : ScriptObject(name) { @@ -2547,6 +2823,10 @@ AchievementScript::AchievementScript(char const* name) AchievementScript::~AchievementScript() = default; +void AchievementScript::OnCompleted(Player* /*player*/, AchievementEntry const* /*achievement*/) +{ +} + AchievementCriteriaScript::AchievementCriteriaScript(char const* name) : ScriptObject(name) { @@ -2563,6 +2843,142 @@ PlayerScript::PlayerScript(char const* name) PlayerScript::~PlayerScript() = default; +void PlayerScript::OnPVPKill(Player* /*killer*/, Player* /*killed*/) +{ +} + +void PlayerScript::OnCreatureKill(Player* /*killer*/, Creature* /*killed*/) +{ +} + +void PlayerScript::OnPlayerKilledByCreature(Creature* /*killer*/, Player* /*killed*/) +{ +} + +void PlayerScript::OnLevelChanged(Player* /*player*/, uint8 /*oldLevel*/) +{ +} + +void PlayerScript::OnFreeTalentPointsChanged(Player* /*player*/, uint32 /*points*/) +{ +} + +void PlayerScript::OnTalentsReset(Player* /*player*/, bool /*noCost*/) +{ +} + +void PlayerScript::OnMoneyChanged(Player* /*player*/, int64& /*amount*/) +{ +} + +void PlayerScript::OnMoneyLimit(Player* /*player*/, int64 /*amount*/) +{ +} + +void PlayerScript::OnGiveXP(Player* /*player*/, uint32& /*amount*/, Unit* /*victim*/) +{ +} + +void PlayerScript::OnReputationChange(Player* /*player*/, uint32 /*factionId*/, int32& /*standing*/, bool /*incremental*/) +{ +} + +void PlayerScript::OnDuelRequest(Player* /*target*/, Player* /*challenger*/) +{ +} + +void PlayerScript::OnDuelStart(Player* /*player1*/, Player* /*player2*/) +{ +} + +void PlayerScript::OnDuelEnd(Player* /*winner*/, Player* /*loser*/, DuelCompleteType /*type*/) +{ +} + +void PlayerScript::OnChat(Player* /*player*/, uint32 /*type*/, uint32 /*lang*/, std::string& /*msg*/) +{ +} + +void PlayerScript::OnChat(Player* /*player*/, uint32 /*type*/, uint32 /*lang*/, std::string& /*msg*/, Player* /*receiver*/) +{ +} + +void PlayerScript::OnChat(Player* /*player*/, uint32 /*type*/, uint32 /*lang*/, std::string& /*msg*/, Group* /*group*/) +{ +} + +void PlayerScript::OnChat(Player* /*player*/, uint32 /*type*/, uint32 /*lang*/, std::string& /*msg*/, Guild* /*guild*/) +{ +} + +void PlayerScript::OnChat(Player* /*player*/, uint32 /*type*/, uint32 /*lang*/, std::string& /*msg*/, Channel* /*channel*/) +{ +} + +void PlayerScript::OnClearEmote(Player* /*player*/) +{ +} + +void PlayerScript::OnTextEmote(Player* /*player*/, uint32 /*textEmote*/, uint32 /*emoteNum*/, ObjectGuid /*guid*/) +{ +} + +void PlayerScript::OnSpellCast(Player* /*player*/, Spell* /*spell*/, bool /*skipCheck*/) +{ +} + +void PlayerScript::OnLogin(Player* /*player*/, bool /*firstLogin*/) +{ +} + +void PlayerScript::OnLogout(Player* /*player*/) +{ +} + +void PlayerScript::OnCreate(Player* /*player*/) +{ +} + +void PlayerScript::OnDelete(ObjectGuid /*guid*/, uint32 /*accountId*/) +{ +} + +void PlayerScript::OnFailedDelete(ObjectGuid /*guid*/, uint32 /*accountId*/) +{ +} + +void PlayerScript::OnSave(Player* /*player*/) +{ +} + +void PlayerScript::OnBindToInstance(Player* /*player*/, Difficulty /*difficulty*/, uint32 /*mapId*/, bool /*permanent*/, uint8 /*extendState*/) +{ +} + +void PlayerScript::OnUpdateZone(Player* /*player*/, uint32 /*newZone*/, uint32 /*newArea*/) +{ +} + +void PlayerScript::OnMapChanged(Player* /*player*/) +{ +} + +void PlayerScript::OnQuestStatusChange(Player* /*player*/, uint32 /*questId*/) +{ +} + +void PlayerScript::OnPlayerRepop(Player* /*player*/) +{ +} + +void PlayerScript::OnMovieComplete(Player* /*player*/, uint32 /*movieId*/) +{ +} + +void PlayerScript::OnPlayerChoiceResponse(Player* /*player*/, uint32 /*choiceId*/, uint32 /*responseId*/) +{ +} + AccountScript::AccountScript(char const* name) : ScriptObject(name) { @@ -2571,6 +2987,30 @@ AccountScript::AccountScript(char const* name) AccountScript::~AccountScript() = default; +void AccountScript::OnAccountLogin(uint32 /*accountId*/) +{ +} + +void AccountScript::OnFailedAccountLogin(uint32 /*accountId*/) +{ +} + +void AccountScript::OnEmailChange(uint32 /*accountId*/) +{ +} + +void AccountScript::OnFailedEmailChange(uint32 /*accountId*/) +{ +} + +void AccountScript::OnPasswordChange(uint32 /*accountId*/) +{ +} + +void AccountScript::OnFailedPasswordChange(uint32 /*accountId*/) +{ +} + GuildScript::GuildScript(char const* name) : ScriptObject(name) { @@ -2579,6 +3019,52 @@ GuildScript::GuildScript(char const* name) GuildScript::~GuildScript() = default; +void GuildScript::OnAddMember(Guild* /*guild*/, Player* /*player*/, uint8 /*plRank*/) +{ +} + +void GuildScript::OnRemoveMember(Guild* /*guild*/, ObjectGuid /*guid*/, bool /*isDisbanding*/, bool /*isKicked*/) +{ +} + +void GuildScript::OnMOTDChanged(Guild* /*guild*/, std::string const& /*newMotd*/) +{ +} + +void GuildScript::OnInfoChanged(Guild* /*guild*/, std::string const& /*newInfo*/) +{ +} + +void GuildScript::OnCreate(Guild* /*guild*/, Player* /*leader*/, std::string const& /*name*/) +{ +} + +void GuildScript::OnDisband(Guild* /*guild*/) +{ +} + +void GuildScript::OnMemberWitdrawMoney(Guild* /*guild*/, Player* /*player*/, uint64& /*amount*/, bool /*isRepair*/) +{ +} + +void GuildScript::OnMemberDepositMoney(Guild* /*guild*/, Player* /*player*/, uint64& /*amount*/) +{ +} + +void GuildScript::OnItemMove(Guild* /*guild*/, Player* /*player*/, Item* /*pItem*/, bool /*isSrcBank*/, uint8 /*srcContainer*/, uint8 /*srcSlotId*/, bool /*isDestBank*/, + uint8 /*destContainer*/, uint8 /*destSlotId*/) +{ +} + +void GuildScript::OnEvent(Guild* /*guild*/, uint8 /*eventType*/, ObjectGuid::LowType /*playerGuid1*/, ObjectGuid::LowType /*playerGuid2*/, uint8 /*newRank*/) +{ +} + +void GuildScript::OnBankEvent(Guild* /*guild*/, uint8 /*eventType*/, uint8 /*tabId*/, ObjectGuid::LowType /*playerGuid*/, uint64 /*itemOrMoney*/, uint16 /*itemStackCount*/, + uint8 /*destTabId*/) +{ +} + GroupScript::GroupScript(char const* name) : ScriptObject(name) { @@ -2587,6 +3073,26 @@ GroupScript::GroupScript(char const* name) GroupScript::~GroupScript() = default; +void GroupScript::OnAddMember(Group* /*group*/, ObjectGuid /*guid*/) +{ +} + +void GroupScript::OnInviteMember(Group* /*group*/, ObjectGuid /*guid*/) +{ +} + +void GroupScript::OnRemoveMember(Group* /*group*/, ObjectGuid /*guid*/, RemoveMethod /*method*/, ObjectGuid /*kicker*/, char const* /*reason*/) +{ +} + +void GroupScript::OnChangeLeader(Group* /*group*/, ObjectGuid /*newLeaderGuid*/, ObjectGuid /*oldLeaderGuid*/) +{ +} + +void GroupScript::OnDisband(Group* /*group*/) +{ +} + AreaTriggerEntityScript::AreaTriggerEntityScript(char const* name) : ScriptObject(name) { @@ -2595,6 +3101,11 @@ AreaTriggerEntityScript::AreaTriggerEntityScript(char const* name) AreaTriggerEntityScript::~AreaTriggerEntityScript() = default; +AreaTriggerAI* AreaTriggerEntityScript::GetAI(AreaTrigger* /*at*/) const +{ + return nullptr; +} + ConversationScript::ConversationScript(char const* name) : ScriptObject(name) { @@ -2603,6 +3114,14 @@ ConversationScript::ConversationScript(char const* name) ConversationScript::~ConversationScript() = default; +void ConversationScript::OnConversationCreate(Conversation* /*conversation*/, Unit* /*creator*/) +{ +} + +void ConversationScript::OnConversationLineStarted(Conversation* /*conversation*/, uint32 /*lineId*/, Player* /*sender*/) +{ +} + SceneScript::SceneScript(char const* name) : ScriptObject(name) { @@ -2611,6 +3130,22 @@ SceneScript::SceneScript(char const* name) SceneScript::~SceneScript() = default; +void SceneScript::OnSceneStart(Player* /*player*/, uint32 /*sceneInstanceID*/, SceneTemplate const* /*sceneTemplate*/) +{ +} + +void SceneScript::OnSceneTriggerEvent(Player* /*player*/, uint32 /*sceneInstanceID*/, SceneTemplate const* /*sceneTemplate*/, std::string const& /*triggerName*/) +{ +} + +void SceneScript::OnSceneCancel(Player* /*player*/, uint32 /*sceneInstanceID*/, SceneTemplate const* /*sceneTemplate*/) +{ +} + +void SceneScript::OnSceneComplete(Player* /*player*/, uint32 /*sceneInstanceID*/, SceneTemplate const* /*sceneTemplate*/) +{ +} + QuestScript::QuestScript(char const* name) : ScriptObject(name) { @@ -2619,6 +3154,18 @@ QuestScript::QuestScript(char const* name) QuestScript::~QuestScript() = default; +void QuestScript::OnQuestStatusChange(Player* /*player*/, Quest const* /*quest*/, QuestStatus /*oldStatus*/, QuestStatus /*newStatus*/) +{ +} + +void QuestScript::OnAcknowledgeAutoAccept(Player* /*player*/, Quest const* /*quest*/) +{ +} + +void QuestScript::OnQuestObjectiveChange(Player* /*player*/, Quest const* /*quest*/, QuestObjective const& /*objective*/, int32 /*oldAmount*/, int32 /*newAmount*/) +{ +} + WorldStateScript::WorldStateScript(char const* name) : ScriptObject(name) { @@ -2627,6 +3174,10 @@ WorldStateScript::WorldStateScript(char const* name) WorldStateScript::~WorldStateScript() = default; +void WorldStateScript::OnValueChange(int32 /*worldStateId*/, int32 /*oldValue*/, int32 /*newValue*/, Map const* /*map*/) +{ +} + // Specialize for each script type class like so: template class TC_GAME_API ScriptRegistry<SpellScriptLoader>; template class TC_GAME_API ScriptRegistry<ServerScript>; diff --git a/src/server/game/Scripting/ScriptMgr.h b/src/server/game/Scripting/ScriptMgr.h index 672f5dc6bf0..91d1b3902e8 100644 --- a/src/server/game/Scripting/ScriptMgr.h +++ b/src/server/game/Scripting/ScriptMgr.h @@ -22,6 +22,7 @@ #include "ObjectGuid.h" #include "Tuples.h" #include "Types.h" +#include <memory> #include <vector> class AccountMgr; @@ -181,7 +182,7 @@ class TC_GAME_API ScriptObject ScriptObject& operator=(ScriptObject const& right) = delete; ScriptObject& operator=(ScriptObject&& right) = delete; - const std::string& GetName() const { return _name; } + std::string const& GetName() const; protected: @@ -190,201 +191,182 @@ class TC_GAME_API ScriptObject private: - const std::string _name; -}; - -template<class TObject> class UpdatableScript -{ - protected: - - UpdatableScript() - { - } - - virtual ~UpdatableScript() { } - - public: - - UpdatableScript(UpdatableScript const& right) = delete; - UpdatableScript(UpdatableScript&& right) = delete; - UpdatableScript& operator=(UpdatableScript const& right) = delete; - UpdatableScript& operator=(UpdatableScript&& right) = delete; - - virtual void OnUpdate(TObject* /*obj*/, uint32 /*diff*/) { } + std::string const _name; }; class TC_GAME_API SpellScriptLoader : public ScriptObject { protected: - SpellScriptLoader(char const* name); + explicit SpellScriptLoader(char const* name); public: // Should return a fully valid SpellScript pointer. - virtual SpellScript* GetSpellScript() const { return nullptr; } + virtual SpellScript* GetSpellScript() const; // Should return a fully valid AuraScript pointer. - virtual AuraScript* GetAuraScript() const { return nullptr; } + virtual AuraScript* GetAuraScript() const; }; class TC_GAME_API ServerScript : public ScriptObject { protected: - ServerScript(char const* name); + explicit ServerScript(char const* name); public: ~ServerScript(); // Called when reactive socket I/O is started (WorldTcpSessionMgr). - virtual void OnNetworkStart() { } + virtual void OnNetworkStart(); // Called when reactive I/O is stopped. - virtual void OnNetworkStop() { } + virtual void OnNetworkStop(); // Called when a remote socket establishes a connection to the server. Do not store the socket object. - virtual void OnSocketOpen(std::shared_ptr<WorldSocket> /*socket*/) { } + virtual void OnSocketOpen(std::shared_ptr<WorldSocket> socket); // Called when a socket is closed. Do not store the socket object, and do not rely on the connection // being open; it is not. - virtual void OnSocketClose(std::shared_ptr<WorldSocket> /*socket*/) { } + virtual void OnSocketClose(std::shared_ptr<WorldSocket> socket); // Called when a packet is sent to a client. The packet object is a copy of the original packet, so reading // and modifying it is safe. - virtual void OnPacketSend(WorldSession* /*session*/, WorldPacket& /*packet*/) { } + virtual void OnPacketSend(WorldSession* session, WorldPacket& packet); // Called when a (valid) packet is received by a client. The packet object is a copy of the original packet, so // reading and modifying it is safe. Make sure to check WorldSession pointer before usage, it might be null in case of auth packets - virtual void OnPacketReceive(WorldSession* /*session*/, WorldPacket& /*packet*/) { } + virtual void OnPacketReceive(WorldSession* session, WorldPacket& packet); }; class TC_GAME_API WorldScript : public ScriptObject { protected: - WorldScript(char const* name); + explicit WorldScript(char const* name); public: ~WorldScript(); // Called when the open/closed state of the world changes. - virtual void OnOpenStateChange(bool /*open*/) { } + virtual void OnOpenStateChange(bool open); // Called after the world configuration is (re)loaded. - virtual void OnConfigLoad(bool /*reload*/) { } + virtual void OnConfigLoad(bool reload); // Called before the message of the day is changed. - virtual void OnMotdChange(std::string& /*newMotd*/) { } + virtual void OnMotdChange(std::string& newMotd); // Called when a world shutdown is initiated. - virtual void OnShutdownInitiate(ShutdownExitCode /*code*/, ShutdownMask /*mask*/) { } + virtual void OnShutdownInitiate(ShutdownExitCode code, ShutdownMask mask); // Called when a world shutdown is cancelled. - virtual void OnShutdownCancel() { } + virtual void OnShutdownCancel(); // Called on every world tick (don't execute too heavy code here). - virtual void OnUpdate(uint32 /*diff*/) { } + virtual void OnUpdate(uint32 diff); // Called when the world is started. - virtual void OnStartup() { } + virtual void OnStartup(); // Called when the world is actually shut down. - virtual void OnShutdown() { } + virtual void OnShutdown(); }; class TC_GAME_API FormulaScript : public ScriptObject { protected: - FormulaScript(char const* name); + explicit FormulaScript(char const* name); public: ~FormulaScript(); // Called after calculating honor. - virtual void OnHonorCalculation(float& /*honor*/, uint8 /*level*/, float /*multiplier*/) { } + virtual void OnHonorCalculation(float& honor, uint8 level, float multiplier); // Called after gray level calculation. - virtual void OnGrayLevelCalculation(uint8& /*grayLevel*/, uint8 /*playerLevel*/) { } + virtual void OnGrayLevelCalculation(uint8& grayLevel, uint8 playerLevel); // Called after calculating experience color. - virtual void OnColorCodeCalculation(XPColorChar& /*color*/, uint8 /*playerLevel*/, uint8 /*mobLevel*/) { } + virtual void OnColorCodeCalculation(XPColorChar& color, uint8 playerLevel, uint8 mobLevel); // Called after calculating zero difference. - virtual void OnZeroDifferenceCalculation(uint8& /*diff*/, uint8 /*playerLevel*/) { } + virtual void OnZeroDifferenceCalculation(uint8& diff, uint8 playerLevel); // Called after calculating base experience gain. - virtual void OnBaseGainCalculation(uint32& /*gain*/, uint8 /*playerLevel*/, uint8 /*mobLevel*/) { } + virtual void OnBaseGainCalculation(uint32& gain, uint8 playerLevel, uint8 mobLevel); // Called after calculating experience gain. - virtual void OnGainCalculation(uint32& /*gain*/, Player* /*player*/, Unit* /*unit*/) { } + virtual void OnGainCalculation(uint32& gain, Player* player, Unit* unit); // Called when calculating the experience rate for group experience. - virtual void OnGroupRateCalculation(float& /*rate*/, uint32 /*count*/, bool /*isRaid*/) { } + virtual void OnGroupRateCalculation(float& rate, uint32 count, bool isRaid); }; template<class TMap> -class MapScript : public UpdatableScript<TMap> +class TC_GAME_API MapScript { - MapEntry const* _mapEntry; + MapEntry const* _mapEntry; protected: - MapScript(MapEntry const* mapEntry) : _mapEntry(mapEntry) { } + explicit MapScript(MapEntry const* mapEntry); public: // Gets the MapEntry structure associated with this script. Can return NULL. - MapEntry const* GetEntry() { return _mapEntry; } + MapEntry const* GetEntry() const; // Called when the map is created. - virtual void OnCreate(TMap* /*map*/) { } + virtual void OnCreate(TMap* map); // Called just before the map is destroyed. - virtual void OnDestroy(TMap* /*map*/) { } + virtual void OnDestroy(TMap* map); // Called when a player enters the map. - virtual void OnPlayerEnter(TMap* /*map*/, Player* /*player*/) { } + virtual void OnPlayerEnter(TMap* map, Player* player); // Called when a player leaves the map. - virtual void OnPlayerLeave(TMap* /*map*/, Player* /*player*/) { } + virtual void OnPlayerLeave(TMap* map, Player* player); + + virtual void OnUpdate(TMap* map, uint32 diff); }; class TC_GAME_API WorldMapScript : public ScriptObject, public MapScript<Map> { protected: - WorldMapScript(char const* name, uint32 mapId); + explicit WorldMapScript(char const* name, uint32 mapId); public: ~WorldMapScript(); }; -class TC_GAME_API InstanceMapScript - : public ScriptObject, public MapScript<InstanceMap> +class TC_GAME_API InstanceMapScript : public ScriptObject, public MapScript<InstanceMap> { protected: - InstanceMapScript(char const* name, uint32 mapId); + explicit InstanceMapScript(char const* name, uint32 mapId); public: ~InstanceMapScript(); // Gets an InstanceScript object for this instance. - virtual InstanceScript* GetInstanceScript(InstanceMap* /*map*/) const { return nullptr; } + virtual InstanceScript* GetInstanceScript(InstanceMap* map) const; }; class TC_GAME_API BattlegroundMapScript : public ScriptObject, public MapScript<BattlegroundMap> { protected: - BattlegroundMapScript(char const* name, uint32 mapId); + explicit BattlegroundMapScript(char const* name, uint32 mapId); public: @@ -395,97 +377,97 @@ class TC_GAME_API ItemScript : public ScriptObject { protected: - ItemScript(char const* name); + explicit ItemScript(char const* name); public: ~ItemScript(); // Called when a player accepts a quest from the item. - virtual bool OnQuestAccept(Player* /*player*/, Item* /*item*/, Quest const* /*quest*/) { return false; } + virtual bool OnQuestAccept(Player* player, Item* item, Quest const* quest); // Called when a player uses the item. - virtual bool OnUse(Player* /*player*/, Item* /*item*/, SpellCastTargets const& /*targets*/, ObjectGuid /*castId*/) { return false; } + virtual bool OnUse(Player* player, Item* item, SpellCastTargets const& targets, ObjectGuid castId); // Called when the item expires (is destroyed). - virtual bool OnExpire(Player* /*player*/, ItemTemplate const* /*proto*/) { return false; } + virtual bool OnExpire(Player* player, ItemTemplate const* proto); // Called when the item is destroyed. - virtual bool OnRemove(Player* /*player*/, Item* /*item*/) { return false; } + virtual bool OnRemove(Player* player, Item* item); // Called before casting a combat spell from this item (chance on hit spells of item template, can be used to prevent cast if returning false) - virtual bool OnCastItemCombatSpell(Player* /*player*/, Unit* /*victim*/, SpellInfo const* /*spellInfo*/, Item* /*item*/) { return true; } + virtual bool OnCastItemCombatSpell(Player* player, Unit* victim, SpellInfo const* spellInfo, Item* item); }; class TC_GAME_API UnitScript : public ScriptObject { protected: - UnitScript(char const* name); + explicit UnitScript(char const* name); public: ~UnitScript(); // Called when a unit deals healing to another unit - virtual void OnHeal(Unit* /*healer*/, Unit* /*reciever*/, uint32& /*gain*/) { } + virtual void OnHeal(Unit* healer, Unit* reciever, uint32& gain); // Called when a unit deals damage to another unit - virtual void OnDamage(Unit* /*attacker*/, Unit* /*victim*/, uint32& /*damage*/) { } + virtual void OnDamage(Unit* attacker, Unit* victim, uint32& damage); // Called when DoT's Tick Damage is being Dealt - virtual void ModifyPeriodicDamageAurasTick(Unit* /*target*/, Unit* /*attacker*/, uint32& /*damage*/) { } + virtual void ModifyPeriodicDamageAurasTick(Unit* target, Unit* attacker, uint32& damage); // Called when Melee Damage is being Dealt - virtual void ModifyMeleeDamage(Unit* /*target*/, Unit* /*attacker*/, uint32& /*damage*/) { } + virtual void ModifyMeleeDamage(Unit* target, Unit* attacker, uint32& damage); // Called when Spell Damage is being Dealt - virtual void ModifySpellDamageTaken(Unit* /*target*/, Unit* /*attacker*/, int32& /*damage*/, SpellInfo const* /*spellInfo*/) { } + virtual void ModifySpellDamageTaken(Unit* target, Unit* attacker, int32& damage, SpellInfo const* spellInfo); }; class TC_GAME_API CreatureScript : public ScriptObject { protected: - CreatureScript(char const* name); + explicit CreatureScript(char const* name); public: ~CreatureScript(); // Called when a CreatureAI object is needed for the creature. - virtual CreatureAI* GetAI(Creature* /*creature*/) const = 0; + virtual CreatureAI* GetAI(Creature* creature) const = 0; }; class TC_GAME_API GameObjectScript : public ScriptObject { protected: - GameObjectScript(char const* name); + explicit GameObjectScript(char const* name); public: ~GameObjectScript(); // Called when a GameObjectAI object is needed for the gameobject. - virtual GameObjectAI* GetAI(GameObject* /*go*/) const = 0; + virtual GameObjectAI* GetAI(GameObject* go) const = 0; }; class TC_GAME_API AreaTriggerScript : public ScriptObject { protected: - AreaTriggerScript(char const* name); + explicit AreaTriggerScript(char const* name); public: ~AreaTriggerScript(); // Called when the area trigger is activated by a player. - virtual bool OnTrigger(Player* /*player*/, AreaTriggerEntry const* /*trigger*/) { return false; } + virtual bool OnTrigger(Player* player, AreaTriggerEntry const* trigger); // Called when the area trigger is left by a player. - virtual bool OnExit(Player* /*player*/, AreaTriggerEntry const* /*trigger*/) { return false; } + virtual bool OnExit(Player* player, AreaTriggerEntry const* trigger); }; class TC_GAME_API OnlyOnceAreaTriggerScript : public AreaTriggerScript @@ -500,16 +482,16 @@ class TC_GAME_API OnlyOnceAreaTriggerScript : public AreaTriggerScript protected: // returns true if the trigger was successfully handled, false if we should try again next time - virtual bool TryHandleOnce(Player* /*player*/, AreaTriggerEntry const* /*trigger*/) = 0; - void ResetAreaTriggerDone(InstanceScript* /*instance*/, uint32 /*triggerId*/); - void ResetAreaTriggerDone(Player const* /*player*/, AreaTriggerEntry const* /*trigger*/); + virtual bool TryHandleOnce(Player* player, AreaTriggerEntry const* trigger) = 0; + void ResetAreaTriggerDone(InstanceScript* instance, uint32 triggerId); + void ResetAreaTriggerDone(Player const* player, AreaTriggerEntry const* trigger); }; class TC_GAME_API BattlefieldScript : public ScriptObject { protected: - BattlefieldScript(char const* name); + explicit BattlefieldScript(char const* name); public: @@ -522,7 +504,7 @@ class TC_GAME_API BattlegroundScript : public ScriptObject { protected: - BattlegroundScript(char const* name); + explicit BattlegroundScript(char const* name); public: @@ -536,7 +518,7 @@ class TC_GAME_API OutdoorPvPScript : public ScriptObject { protected: - OutdoorPvPScript(char const* name); + explicit OutdoorPvPScript(char const* name); public: @@ -550,7 +532,7 @@ class TC_GAME_API CommandScript : public ScriptObject { protected: - CommandScript(char const* name); + explicit CommandScript(char const* name); public: @@ -560,139 +542,145 @@ class TC_GAME_API CommandScript : public ScriptObject virtual std::vector<Trinity::ChatCommands::ChatCommandBuilder> GetCommands() const = 0; }; -class TC_GAME_API WeatherScript : public ScriptObject, public UpdatableScript<Weather> +class TC_GAME_API WeatherScript : public ScriptObject { protected: - WeatherScript(char const* name); + explicit WeatherScript(char const* name); public: ~WeatherScript(); // Called when the weather changes in the zone this script is associated with. - virtual void OnChange(Weather* /*weather*/, WeatherState /*state*/, float /*grade*/) { } + virtual void OnChange(Weather* weather, WeatherState state, float grade); + + virtual void OnUpdate(Weather* weather, uint32 diff); }; class TC_GAME_API AuctionHouseScript : public ScriptObject { protected: - AuctionHouseScript(char const* name); + explicit AuctionHouseScript(char const* name); public: ~AuctionHouseScript(); // Called when an auction is added to an auction house. - virtual void OnAuctionAdd(AuctionHouseObject* /*ah*/, AuctionPosting* /*auction*/) { } + virtual void OnAuctionAdd(AuctionHouseObject* ah, AuctionPosting* auction); // Called when an auction is removed from an auction house. - virtual void OnAuctionRemove(AuctionHouseObject* /*ah*/, AuctionPosting* /*auction*/) { } + virtual void OnAuctionRemove(AuctionHouseObject* ah, AuctionPosting* auction); // Called when an auction was succesfully completed. - virtual void OnAuctionSuccessful(AuctionHouseObject* /*ah*/, AuctionPosting* /*auction*/) { } + virtual void OnAuctionSuccessful(AuctionHouseObject* ah, AuctionPosting* auction); // Called when an auction expires. - virtual void OnAuctionExpire(AuctionHouseObject* /*ah*/, AuctionPosting* /*auction*/) { } + virtual void OnAuctionExpire(AuctionHouseObject* ah, AuctionPosting* auction); }; class TC_GAME_API ConditionScript : public ScriptObject { protected: - ConditionScript(char const* name); + explicit ConditionScript(char const* name); public: ~ConditionScript(); // Called when a single condition is checked for a player. - virtual bool OnConditionCheck(Condition const* /*condition*/, ConditionSourceInfo& /*sourceInfo*/) { return true; } + virtual bool OnConditionCheck(Condition const* condition, ConditionSourceInfo& sourceInfo); }; class TC_GAME_API VehicleScript : public ScriptObject { protected: - VehicleScript(char const* name); + explicit VehicleScript(char const* name); public: ~VehicleScript(); // Called after a vehicle is installed. - virtual void OnInstall(Vehicle* /*veh*/) { } + virtual void OnInstall(Vehicle* veh); // Called after a vehicle is uninstalled. - virtual void OnUninstall(Vehicle* /*veh*/) { } + virtual void OnUninstall(Vehicle* veh); // Called when a vehicle resets. - virtual void OnReset(Vehicle* /*veh*/) { } + virtual void OnReset(Vehicle* veh); // Called after an accessory is installed in a vehicle. - virtual void OnInstallAccessory(Vehicle* /*veh*/, Creature* /*accessory*/) { } + virtual void OnInstallAccessory(Vehicle* veh, Creature* accessory); // Called after a passenger is added to a vehicle. - virtual void OnAddPassenger(Vehicle* /*veh*/, Unit* /*passenger*/, int8 /*seatId*/) { } + virtual void OnAddPassenger(Vehicle* veh, Unit* passenger, int8 seatId); // Called after a passenger is removed from a vehicle. - virtual void OnRemovePassenger(Vehicle* /*veh*/, Unit* /*passenger*/) { } + virtual void OnRemovePassenger(Vehicle* veh, Unit* passenger); }; -class TC_GAME_API DynamicObjectScript : public ScriptObject, public UpdatableScript<DynamicObject> +class TC_GAME_API DynamicObjectScript : public ScriptObject { protected: - DynamicObjectScript(char const* name); + explicit DynamicObjectScript(char const* name); public: ~DynamicObjectScript(); + + virtual void OnUpdate(DynamicObject* obj, uint32 diff); }; -class TC_GAME_API TransportScript : public ScriptObject, public UpdatableScript<Transport> +class TC_GAME_API TransportScript : public ScriptObject { protected: - TransportScript(char const* name); + explicit TransportScript(char const* name); public: ~TransportScript(); // Called when a player boards the transport. - virtual void OnAddPassenger(Transport* /*transport*/, Player* /*player*/) { } + virtual void OnAddPassenger(Transport* transport, Player* player); // Called when a creature boards the transport. - virtual void OnAddCreaturePassenger(Transport* /*transport*/, Creature* /*creature*/) { } + virtual void OnAddCreaturePassenger(Transport* transport, Creature* creature); // Called when a player exits the transport. - virtual void OnRemovePassenger(Transport* /*transport*/, Player* /*player*/) { } + virtual void OnRemovePassenger(Transport* transport, Player* player); // Called when a transport moves. - virtual void OnRelocate(Transport* /*transport*/, uint32 /*mapId*/, float /*x*/, float /*y*/, float /*z*/) { } + virtual void OnRelocate(Transport* transport, uint32 mapId, float x, float y, float z); + + virtual void OnUpdate(Transport* transport, uint32 diff); }; class TC_GAME_API AchievementScript : public ScriptObject { protected: - AchievementScript(char const* name); + explicit AchievementScript(char const* name); public: ~AchievementScript(); // Called when an achievement is completed. - virtual void OnCompleted(Player* /*player*/, AchievementEntry const* /*achievement*/) { } + virtual void OnCompleted(Player* player, AchievementEntry const* achievement); }; class TC_GAME_API AchievementCriteriaScript : public ScriptObject { protected: - AchievementCriteriaScript(char const* name); + explicit AchievementCriteriaScript(char const* name); public: @@ -706,293 +694,294 @@ class TC_GAME_API PlayerScript : public ScriptObject { protected: - PlayerScript(char const* name); + explicit PlayerScript(char const* name); public: ~PlayerScript(); // Called when a player kills another player - virtual void OnPVPKill(Player* /*killer*/, Player* /*killed*/) { } + virtual void OnPVPKill(Player* killer, Player* killed); // Called when a player kills a creature - virtual void OnCreatureKill(Player* /*killer*/, Creature* /*killed*/) { } + virtual void OnCreatureKill(Player* killer, Creature* killed); // Called when a player is killed by a creature - virtual void OnPlayerKilledByCreature(Creature* /*killer*/, Player* /*killed*/) { } + virtual void OnPlayerKilledByCreature(Creature* killer, Player* killed); // Called when a player's level changes (after the level is applied) - virtual void OnLevelChanged(Player* /*player*/, uint8 /*oldLevel*/) { } + virtual void OnLevelChanged(Player* player, uint8 oldLevel); // Called when a player's free talent points change (right before the change is applied) - virtual void OnFreeTalentPointsChanged(Player* /*player*/, uint32 /*points*/) { } + virtual void OnFreeTalentPointsChanged(Player* player, uint32 points); // Called when a player's talent points are reset (right before the reset is done) - virtual void OnTalentsReset(Player* /*player*/, bool /*noCost*/) { } + virtual void OnTalentsReset(Player* player, bool noCost); // Called when a player's money is modified (before the modification is done) - virtual void OnMoneyChanged(Player* /*player*/, int64& /*amount*/) { } + virtual void OnMoneyChanged(Player* player, int64& amount); // Called when a player's money is at limit (amount = money tried to add) - virtual void OnMoneyLimit(Player* /*player*/, int64 /*amount*/) { } + virtual void OnMoneyLimit(Player* player, int64 amount); // Called when a player gains XP (before anything is given) - virtual void OnGiveXP(Player* /*player*/, uint32& /*amount*/, Unit* /*victim*/) { } + virtual void OnGiveXP(Player* player, uint32& amount, Unit* victim); // Called when a player's reputation changes (before it is actually changed) - virtual void OnReputationChange(Player* /*player*/, uint32 /*factionId*/, int32& /*standing*/, bool /*incremental*/) { } + virtual void OnReputationChange(Player* player, uint32 factionId, int32& standing, bool incremental); // Called when a duel is requested - virtual void OnDuelRequest(Player* /*target*/, Player* /*challenger*/) { } + virtual void OnDuelRequest(Player* target, Player* challenger); // Called when a duel starts (after 3s countdown) - virtual void OnDuelStart(Player* /*player1*/, Player* /*player2*/) { } + virtual void OnDuelStart(Player* player1, Player* player2); // Called when a duel ends - virtual void OnDuelEnd(Player* /*winner*/, Player* /*loser*/, DuelCompleteType /*type*/) { } + virtual void OnDuelEnd(Player* winner, Player* loser, DuelCompleteType type); // The following methods are called when a player sends a chat message. - virtual void OnChat(Player* /*player*/, uint32 /*type*/, uint32 /*lang*/, std::string& /*msg*/) { } + virtual void OnChat(Player* player, uint32 type, uint32 lang, std::string& msg); - virtual void OnChat(Player* /*player*/, uint32 /*type*/, uint32 /*lang*/, std::string& /*msg*/, Player* /*receiver*/) { } + virtual void OnChat(Player* player, uint32 type, uint32 lang, std::string& msg, Player* receiver); - virtual void OnChat(Player* /*player*/, uint32 /*type*/, uint32 /*lang*/, std::string& /*msg*/, Group* /*group*/) { } + virtual void OnChat(Player* player, uint32 type, uint32 lang, std::string& msg, Group* group); - virtual void OnChat(Player* /*player*/, uint32 /*type*/, uint32 /*lang*/, std::string& /*msg*/, Guild* /*guild*/) { } + virtual void OnChat(Player* player, uint32 type, uint32 lang, std::string& msg, Guild* guild); - virtual void OnChat(Player* /*player*/, uint32 /*type*/, uint32 /*lang*/, std::string& /*msg*/, Channel* /*channel*/) { } + virtual void OnChat(Player* player, uint32 type, uint32 lang, std::string& msg, Channel* channel); // Both of the below are called on emote opcodes. - virtual void OnClearEmote(Player* /*player*/) { } + virtual void OnClearEmote(Player* player); - virtual void OnTextEmote(Player* /*player*/, uint32 /*textEmote*/, uint32 /*emoteNum*/, ObjectGuid /*guid*/) { } + virtual void OnTextEmote(Player* player, uint32 textEmote, uint32 emoteNum, ObjectGuid guid); // Called in Spell::Cast. - virtual void OnSpellCast(Player* /*player*/, Spell* /*spell*/, bool /*skipCheck*/) { } + virtual void OnSpellCast(Player* player, Spell* spell, bool skipCheck); // Called when a player logs in. - virtual void OnLogin(Player* /*player*/, bool /*firstLogin*/) { } + virtual void OnLogin(Player* player, bool firstLogin); // Called when a player logs out. - virtual void OnLogout(Player* /*player*/) { } + virtual void OnLogout(Player* player); // Called when a player is created. - virtual void OnCreate(Player* /*player*/) { } + virtual void OnCreate(Player* player); // Called when a player is deleted. - virtual void OnDelete(ObjectGuid /*guid*/, uint32 /*accountId*/) { } + virtual void OnDelete(ObjectGuid guid, uint32 accountId); // Called when a player delete failed - virtual void OnFailedDelete(ObjectGuid /*guid*/, uint32 /*accountId*/) { } + virtual void OnFailedDelete(ObjectGuid guid, uint32 accountId); // Called when a player is about to be saved. - virtual void OnSave(Player* /*player*/) { } + virtual void OnSave(Player* player); // Called when a player is bound to an instance - virtual void OnBindToInstance(Player* /*player*/, Difficulty /*difficulty*/, uint32 /*mapId*/, bool /*permanent*/, uint8 /*extendState*/) { } + virtual void OnBindToInstance(Player* player, Difficulty difficulty, uint32 mapId, bool permanent, uint8 extendState); // Called when a player switches to a new zone - virtual void OnUpdateZone(Player* /*player*/, uint32 /*newZone*/, uint32 /*newArea*/) { } + virtual void OnUpdateZone(Player* player, uint32 newZone, uint32 newArea); // Called when a player changes to a new map (after moving to new map) - virtual void OnMapChanged(Player* /*player*/) { } + virtual void OnMapChanged(Player* player); // Called after a player's quest status has been changed - virtual void OnQuestStatusChange(Player* /*player*/, uint32 /*questId*/) { } + virtual void OnQuestStatusChange(Player* player, uint32 questId); // Called when a player presses release when he died - virtual void OnPlayerRepop(Player* /*player*/) { } + virtual void OnPlayerRepop(Player* player); // Called when a player completes a movie - virtual void OnMovieComplete(Player* /*player*/, uint32 /*movieId*/) { } + virtual void OnMovieComplete(Player* player, uint32 movieId); // Called when a player choose a response from a PlayerChoice - virtual void OnPlayerChoiceResponse(Player* /*player*/, uint32 /*choiceId*/, uint32 /*responseId*/) { } + virtual void OnPlayerChoiceResponse(Player* player, uint32 choiceId, uint32 responseId); }; class TC_GAME_API AccountScript : public ScriptObject { protected: - AccountScript(char const* name); + explicit AccountScript(char const* name); public: ~AccountScript(); // Called when an account logged in succesfully - virtual void OnAccountLogin(uint32 /*accountId*/) {} + virtual void OnAccountLogin(uint32 accountId); // Called when an account login failed - virtual void OnFailedAccountLogin(uint32 /*accountId*/) {} + virtual void OnFailedAccountLogin(uint32 accountId); // Called when Email is successfully changed for Account - virtual void OnEmailChange(uint32 /*accountId*/) {} + virtual void OnEmailChange(uint32 accountId); // Called when Email failed to change for Account - virtual void OnFailedEmailChange(uint32 /*accountId*/) {} + virtual void OnFailedEmailChange(uint32 accountId); // Called when Password is successfully changed for Account - virtual void OnPasswordChange(uint32 /*accountId*/) {} + virtual void OnPasswordChange(uint32 accountId); // Called when Password failed to change for Account - virtual void OnFailedPasswordChange(uint32 /*accountId*/) {} + virtual void OnFailedPasswordChange(uint32 accountId); }; class TC_GAME_API GuildScript : public ScriptObject { protected: - GuildScript(char const* name); + explicit GuildScript(char const* name); public: ~GuildScript(); // Called when a member is added to the guild. - virtual void OnAddMember(Guild* /*guild*/, Player* /*player*/, uint8 /*plRank*/) { } + virtual void OnAddMember(Guild* guild, Player* player, uint8 plRank); // Called when a member is removed from the guild. - virtual void OnRemoveMember(Guild* /*guild*/, ObjectGuid /*guid*/, bool /*isDisbanding*/, bool /*isKicked*/) { } + virtual void OnRemoveMember(Guild* guild, ObjectGuid guid, bool isDisbanding, bool isKicked); // Called when the guild MOTD (message of the day) changes. - virtual void OnMOTDChanged(Guild* /*guild*/, const std::string& /*newMotd*/) { } + virtual void OnMOTDChanged(Guild* guild, std::string const& newMotd); // Called when the guild info is altered. - virtual void OnInfoChanged(Guild* /*guild*/, const std::string& /*newInfo*/) { } + virtual void OnInfoChanged(Guild* guild, std::string const& newInfo); // Called when a guild is created. - virtual void OnCreate(Guild* /*guild*/, Player* /*leader*/, const std::string& /*name*/) { } + virtual void OnCreate(Guild* guild, Player* leader, std::string const& name); // Called when a guild is disbanded. - virtual void OnDisband(Guild* /*guild*/) { } + virtual void OnDisband(Guild* guild); // Called when a guild member withdraws money from a guild bank. - virtual void OnMemberWitdrawMoney(Guild* /*guild*/, Player* /*player*/, uint64& /*amount*/, bool /*isRepair*/) { } + virtual void OnMemberWitdrawMoney(Guild* guild, Player* player, uint64& amount, bool isRepair); // Called when a guild member deposits money in a guild bank. - virtual void OnMemberDepositMoney(Guild* /*guild*/, Player* /*player*/, uint64& /*amount*/) { } + virtual void OnMemberDepositMoney(Guild* guild, Player* player, uint64& amount); // Called when a guild member moves an item in a guild bank. - virtual void OnItemMove(Guild* /*guild*/, Player* /*player*/, Item* /*pItem*/, bool /*isSrcBank*/, uint8 /*srcContainer*/, uint8 /*srcSlotId*/, - bool /*isDestBank*/, uint8 /*destContainer*/, uint8 /*destSlotId*/) { } + virtual void OnItemMove(Guild* guild, Player* player, Item* pItem, bool isSrcBank, uint8 srcContainer, uint8 srcSlotId, + bool isDestBank, uint8 destContainer, uint8 destSlotId); - virtual void OnEvent(Guild* /*guild*/, uint8 /*eventType*/, ObjectGuid::LowType /*playerGuid1*/, ObjectGuid::LowType /*playerGuid2*/, uint8 /*newRank*/) { } + virtual void OnEvent(Guild* guild, uint8 eventType, ObjectGuid::LowType playerGuid1, ObjectGuid::LowType playerGuid2, uint8 newRank); - virtual void OnBankEvent(Guild* /*guild*/, uint8 /*eventType*/, uint8 /*tabId*/, ObjectGuid::LowType /*playerGuid*/, uint64 /*itemOrMoney*/, uint16 /*itemStackCount*/, uint8 /*destTabId*/) { } + virtual void OnBankEvent(Guild* guild, uint8 eventType, uint8 tabId, ObjectGuid::LowType playerGuid, uint64 itemOrMoney, uint16 itemStackCount, uint8 destTabId); }; class TC_GAME_API GroupScript : public ScriptObject { protected: - GroupScript(char const* name); + explicit GroupScript(char const* name); public: ~GroupScript(); // Called when a member is added to a group. - virtual void OnAddMember(Group* /*group*/, ObjectGuid /*guid*/) { } + virtual void OnAddMember(Group* group, ObjectGuid guid); // Called when a member is invited to join a group. - virtual void OnInviteMember(Group* /*group*/, ObjectGuid /*guid*/) { } + virtual void OnInviteMember(Group* group, ObjectGuid guid); // Called when a member is removed from a group. - virtual void OnRemoveMember(Group* /*group*/, ObjectGuid /*guid*/, RemoveMethod /*method*/, ObjectGuid /*kicker*/, char const* /*reason*/) { } + virtual void OnRemoveMember(Group* group, ObjectGuid guid, RemoveMethod method, ObjectGuid kicker, char const* reason); // Called when the leader of a group is changed. - virtual void OnChangeLeader(Group* /*group*/, ObjectGuid /*newLeaderGuid*/, ObjectGuid /*oldLeaderGuid*/) { } + virtual void OnChangeLeader(Group* group, ObjectGuid newLeaderGuid, ObjectGuid oldLeaderGuid); // Called when a group is disbanded. - virtual void OnDisband(Group* /*group*/) { } + virtual void OnDisband(Group* group); }; class TC_GAME_API AreaTriggerEntityScript : public ScriptObject { protected: - AreaTriggerEntityScript(char const* name); + explicit AreaTriggerEntityScript(char const* name); public: ~AreaTriggerEntityScript(); // Called when a AreaTriggerAI object is needed for the areatrigger. - virtual AreaTriggerAI* GetAI(AreaTrigger* /*at*/) const { return nullptr; } + virtual AreaTriggerAI* GetAI(AreaTrigger* at) const; }; class TC_GAME_API ConversationScript : public ScriptObject { protected: - ConversationScript(char const* name); + + explicit ConversationScript(char const* name); public: ~ConversationScript(); // Called when Conversation is created but not added to Map yet. - virtual void OnConversationCreate(Conversation* /*conversation*/, Unit* /*creator*/) { } + virtual void OnConversationCreate(Conversation* conversation, Unit* creator); // Called when player sends CMSG_CONVERSATION_LINE_STARTED with valid conversation guid - virtual void OnConversationLineStarted(Conversation* /*conversation*/, uint32 /*lineId*/, Player* /*sender*/) { } + virtual void OnConversationLineStarted(Conversation* conversation, uint32 lineId, Player* sender); }; class TC_GAME_API SceneScript : public ScriptObject { protected: - SceneScript(char const* name); + explicit SceneScript(char const* name); public: ~SceneScript(); // Called when a player start a scene - virtual void OnSceneStart(Player* /*player*/, uint32 /*sceneInstanceID*/, SceneTemplate const* /*sceneTemplate*/) { } + virtual void OnSceneStart(Player* player, uint32 sceneInstanceID, SceneTemplate const* sceneTemplate); // Called when a player receive trigger from scene - virtual void OnSceneTriggerEvent(Player* /*player*/, uint32 /*sceneInstanceID*/, SceneTemplate const* /*sceneTemplate*/, std::string const& /*triggerName*/) { } + virtual void OnSceneTriggerEvent(Player* player, uint32 sceneInstanceID, SceneTemplate const* sceneTemplate, std::string const& triggerName); // Called when a scene is canceled - virtual void OnSceneCancel(Player* /*player*/, uint32 /*sceneInstanceID*/, SceneTemplate const* /*sceneTemplate*/) { } + virtual void OnSceneCancel(Player* player, uint32 sceneInstanceID, SceneTemplate const* sceneTemplate); // Called when a scene is completed - virtual void OnSceneComplete(Player* /*player*/, uint32 /*sceneInstanceID*/, SceneTemplate const* /*sceneTemplate*/) { } + virtual void OnSceneComplete(Player* player, uint32 sceneInstanceID, SceneTemplate const* sceneTemplate); }; class TC_GAME_API QuestScript : public ScriptObject { protected: - QuestScript(char const* name); + explicit QuestScript(char const* name); public: ~QuestScript(); // Called when a quest status change - virtual void OnQuestStatusChange(Player* /*player*/, Quest const* /*quest*/, QuestStatus /*oldStatus*/, QuestStatus /*newStatus*/) { } + virtual void OnQuestStatusChange(Player* player, Quest const* quest, QuestStatus oldStatus, QuestStatus newStatus); // Called for auto accept quests when player closes quest UI after seeing initial quest details - virtual void OnAcknowledgeAutoAccept(Player* /*player*/, Quest const* /*quest*/) { } + virtual void OnAcknowledgeAutoAccept(Player* player, Quest const* quest); // Called when a quest objective data change - virtual void OnQuestObjectiveChange(Player* /*player*/, Quest const* /*quest*/, QuestObjective const& /*objective*/, int32 /*oldAmount*/, int32 /*newAmount*/) { } + virtual void OnQuestObjectiveChange(Player* player, Quest const* quest, QuestObjective const& objective, int32 oldAmount, int32 newAmount); }; class TC_GAME_API WorldStateScript : public ScriptObject { protected: - WorldStateScript(char const* name); + explicit WorldStateScript(char const* name); public: ~WorldStateScript(); // Called when worldstate changes value, map is optional - virtual void OnValueChange([[maybe_unused]] int32 worldStateId, [[maybe_unused]] int32 oldValue, [[maybe_unused]] int32 newValue, [[maybe_unused]] Map const* map) { } + virtual void OnValueChange(int32 worldStateId, int32 oldValue, int32 newValue, Map const* map); }; // Manages registration, loading, and execution of scripts. diff --git a/src/server/game/Spells/SpellScript.cpp b/src/server/game/Spells/SpellScript.cpp index d79b43211a7..3ccbe1c8ff9 100644 --- a/src/server/game/Spells/SpellScript.cpp +++ b/src/server/game/Spells/SpellScript.cpp @@ -412,6 +412,12 @@ void SpellScript::DestinationTargetSelectHandler::Call(SpellScript* spellScript, (spellScript->*DestinationTargetSelectHandlerScript)(target); } +SpellScript::SpellScript(): m_spell(nullptr), m_hitPreventEffectMask(0), m_hitPreventDefaultEffectMask(0) +{ +} + +SpellScript::~SpellScript() = default; + bool SpellScript::_Validate(SpellInfo const* entry) { for (auto itr = OnEffectLaunch.begin(); itr != OnEffectLaunch.end(); ++itr) @@ -1275,6 +1281,12 @@ void AuraScript::EnterLeaveCombatHandler::Call(AuraScript* auraScript, bool isNo (auraScript->*_handlerScript)(isNowInCombat); } +AuraScript::AuraScript(): _SpellScript(), m_aura(nullptr), m_auraApplication(nullptr), m_defaultActionPrevented(false) +{ +} + +AuraScript::~AuraScript() = default; + bool AuraScript::_Load(Aura* aura) { m_aura = aura; diff --git a/src/server/game/Spells/SpellScript.h b/src/server/game/Spells/SpellScript.h index 044122a3a51..3c7d47760e6 100644 --- a/src/server/game/Spells/SpellScript.h +++ b/src/server/game/Spells/SpellScript.h @@ -416,7 +416,8 @@ class TC_GAME_API SpellScript : public _SpellScript #define PrepareSpellScript(CLASSNAME) SPELLSCRIPT_FUNCTION_TYPE_DEFINES(CLASSNAME) SPELLSCRIPT_FUNCTION_CAST_DEFINES(CLASSNAME) public: - SpellScript() : m_spell(nullptr), m_hitPreventEffectMask(0), m_hitPreventDefaultEffectMask(0) { } + SpellScript(); + ~SpellScript(); bool _Validate(SpellInfo const* entry) override; bool _Load(Spell* spell); void _InitHit(); @@ -972,8 +973,8 @@ class TC_GAME_API AuraScript : public _SpellScript #define PrepareAuraScript(CLASSNAME) AURASCRIPT_FUNCTION_TYPE_DEFINES(CLASSNAME) AURASCRIPT_FUNCTION_CAST_DEFINES(CLASSNAME) public: - AuraScript() : _SpellScript(), m_aura(nullptr), m_auraApplication(nullptr), m_defaultActionPrevented(false) - { } + AuraScript(); + ~AuraScript(); bool _Validate(SpellInfo const* entry) override; bool _Load(Aura* aura); void _PrepareScriptCall(AuraScriptHookType hookType, AuraApplication const* aurApp = nullptr); diff --git a/src/server/game/Spells/TraitMgr.cpp b/src/server/game/Spells/TraitMgr.cpp index 20bae857fdb..6bfe9e49b6d 100644 --- a/src/server/game/Spells/TraitMgr.cpp +++ b/src/server/game/Spells/TraitMgr.cpp @@ -18,9 +18,9 @@ #include "TraitMgr.h" #include "DB2Stores.h" #include "IteratorPair.h" -#include "Player.h" #include "MapUtils.h" #include "TraitPacketsCommon.h" +#include "UpdateFields.h" namespace TraitMgr { @@ -359,7 +359,7 @@ void TakeCurrencyCost(WorldPackets::Traits::TraitEntry const& entry, std::map<in currencies[cost->TraitCurrencyID] -= cost->Amount * entry.Rank; } -void FillOwnedCurrenciesMap(WorldPackets::Traits::TraitConfig const& traitConfig, Player const* player, std::map<int32, int32>& currencies) +void FillOwnedCurrenciesMap(WorldPackets::Traits::TraitConfig const& traitConfig, PlayerDataAccessor player, std::map<int32, int32>& currencies) { std::vector<Tree const*> const* trees = GetTreesForConfig(traitConfig); if (!trees) @@ -382,27 +382,27 @@ void FillOwnedCurrenciesMap(WorldPackets::Traits::TraitConfig const& traitConfig case TraitCurrencyType::Gold: { int32& amount = currencies[currency->ID]; - if (player->GetMoney() > uint64(std::numeric_limits<int32>::max() - amount)) + if (player.GetMoney() > uint64(std::numeric_limits<int32>::max() - amount)) amount = std::numeric_limits<int32>::max(); else - amount += player->GetMoney(); + amount += player.GetMoney(); break; } case TraitCurrencyType::CurrencyTypesBased: - currencies[currency->ID] += player->GetCurrency(currency->CurrencyTypesID); + currencies[currency->ID] += player.GetCurrency(currency->CurrencyTypesID); break; case TraitCurrencyType::TraitSourced: if (std::vector<TraitCurrencySourceEntry const*>* currencySources = Trinity::Containers::MapGetValuePtr(_traitCurrencySourcesByCurrency, currency->ID)) { for (TraitCurrencySourceEntry const* currencySource : *currencySources) { - if (currencySource->QuestID && !player->IsQuestRewarded(currencySource->QuestID)) + if (currencySource->QuestID && !player.IsQuestRewarded(currencySource->QuestID)) continue; - if (currencySource->AchievementID && !player->HasAchieved(currencySource->AchievementID)) + if (currencySource->AchievementID && !player.HasAchieved(currencySource->AchievementID)) continue; - if (currencySource->PlayerLevel && player->GetLevel() < currencySource->PlayerLevel) + if (currencySource->PlayerLevel && player.GetLevel() < currencySource->PlayerLevel) continue; if (currencySource->TraitNodeEntryID && !hasTraitNodeEntry(currencySource->TraitNodeEntryID)) @@ -445,18 +445,18 @@ void FillSpentCurrenciesMap(WorldPackets::Traits::TraitConfig const& traitConfig FillSpentCurrenciesMap(entry, cachedCurrencies); } -bool MeetsTraitCondition(WorldPackets::Traits::TraitConfig const& traitConfig, Player const* player, TraitCondEntry const* condition, +bool MeetsTraitCondition(WorldPackets::Traits::TraitConfig const& traitConfig, PlayerDataAccessor player, TraitCondEntry const* condition, Optional<std::map<int32, int32>>& cachedCurrencies) { - if (condition->QuestID && !player->IsQuestRewarded(condition->QuestID)) + if (condition->QuestID && !player.IsQuestRewarded(condition->QuestID)) return false; - if (condition->AchievementID && !player->HasAchieved(condition->AchievementID)) + if (condition->AchievementID && !player.HasAchieved(condition->AchievementID)) return false; if (condition->SpecSetID) { - uint32 chrSpecializationId = player->GetPrimarySpecialization(); + uint32 chrSpecializationId = player.GetPrimarySpecialization(); if (traitConfig.Type == TraitConfigType::Combat) chrSpecializationId = traitConfig.ChrSpecializationID; @@ -483,13 +483,13 @@ bool MeetsTraitCondition(WorldPackets::Traits::TraitConfig const& traitConfig, P } } - if (condition->RequiredLevel && int32(player->GetLevel()) < condition->RequiredLevel) + if (condition->RequiredLevel && player.GetLevel() < condition->RequiredLevel) return false; return true; } -std::vector<UF::TraitEntry> GetGrantedTraitEntriesForConfig(WorldPackets::Traits::TraitConfig const& traitConfig, Player const* player) +std::vector<UF::TraitEntry> GetGrantedTraitEntriesForConfig(WorldPackets::Traits::TraitConfig const& traitConfig, PlayerDataAccessor player) { std::vector<UF::TraitEntry> entries; std::vector<Tree const*> const* trees = GetTreesForConfig(traitConfig); @@ -556,7 +556,7 @@ bool IsValidEntry(WorldPackets::Traits::TraitEntry const& traitEntry) return true; } -TalentLearnResult ValidateConfig(WorldPackets::Traits::TraitConfig const& traitConfig, Player const* player, bool requireSpendingAllCurrencies /*= false*/) +LearnResult ValidateConfig(WorldPackets::Traits::TraitConfig const& traitConfig, PlayerDataAccessor player, bool requireSpendingAllCurrencies /*= false*/) { auto getNodeEntryCount = [&](int32 traitNodeId) { @@ -614,23 +614,23 @@ TalentLearnResult ValidateConfig(WorldPackets::Traits::TraitConfig const& traitC for (WorldPackets::Traits::TraitEntry const& traitEntry : traitConfig.Entries) { if (!IsValidEntry(traitEntry)) - return TALENT_FAILED_UNKNOWN; + return LearnResult::Unknown; Node const* node = Trinity::Containers::MapGetValuePtr(_traitNodes, traitEntry.TraitNodeID); if (node->Data->GetType() == TraitNodeType::Selection) if (getNodeEntryCount(traitEntry.TraitNodeID) != 1) - return TALENT_FAILED_UNKNOWN; + return LearnResult::Unknown; for (NodeEntry const& entry : node->Entries) if (!meetsConditions(entry.Conditions)) - return TALENT_FAILED_UNKNOWN; + return LearnResult::Unknown; if (!meetsConditions(node->Conditions)) - return TALENT_FAILED_UNKNOWN; + return LearnResult::Unknown; for (NodeGroup const* group : node->Groups) if (!meetsConditions(group->Conditions)) - return TALENT_FAILED_UNKNOWN; + return LearnResult::Unknown; if (!node->ParentNodes.empty()) { @@ -640,7 +640,7 @@ TalentLearnResult ValidateConfig(WorldPackets::Traits::TraitConfig const& traitC if (!isNodeFullyFilled(parentNode)) { if (edgeType == TraitEdgeType::RequiredForAvailability) - return TALENT_FAILED_NOT_ENOUGH_TALENTS_IN_PRIMARY_TREE; + return LearnResult::NotEnoughTalentsInPrimaryTree; continue; } @@ -649,7 +649,7 @@ TalentLearnResult ValidateConfig(WorldPackets::Traits::TraitConfig const& traitC } if (!hasAnyParentTrait) - return TALENT_FAILED_NOT_ENOUGH_TALENTS_IN_PRIMARY_TREE; + return LearnResult::NotEnoughTalentsInPrimaryTree; } } @@ -666,7 +666,7 @@ TalentLearnResult ValidateConfig(WorldPackets::Traits::TraitConfig const& traitC int32* grantedCount = Trinity::Containers::MapGetValuePtr(grantedCurrencies, traitCurrencyId); if (!grantedCount || *grantedCount < spentAmount) - return TALENT_FAILED_NOT_ENOUGH_TALENTS_IN_PRIMARY_TREE; + return LearnResult::NotEnoughTalentsInPrimaryTree; } @@ -679,11 +679,11 @@ TalentLearnResult ValidateConfig(WorldPackets::Traits::TraitConfig const& traitC int32* spentAmount = Trinity::Containers::MapGetValuePtr(*spentCurrencies, traitCurrencyId); if (!spentAmount || *spentAmount != grantedAmount) - return TALENT_FAILED_UNSPENT_TALENT_POINTS; + return LearnResult::UnspentTalentPoints; } } - return TALENT_LEARN_OK; + return LearnResult::Ok; } std::vector<TraitDefinitionEffectPointsEntry const*> const* GetTraitDefinitionEffectPointModifiers(int32 traitDefinitionId) @@ -691,7 +691,7 @@ std::vector<TraitDefinitionEffectPointsEntry const*> const* GetTraitDefinitionEf return Trinity::Containers::MapGetValuePtr(_traitDefinitionEffectPointModifiers, traitDefinitionId); } -void InitializeStarterBuildTraitConfig(WorldPackets::Traits::TraitConfig& traitConfig, Player const* player) +void InitializeStarterBuildTraitConfig(WorldPackets::Traits::TraitConfig& traitConfig, PlayerDataAccessor player) { traitConfig.Entries.clear(); std::vector<Tree const*> const* trees = GetTreesForConfig(traitConfig); diff --git a/src/server/game/Spells/TraitMgr.h b/src/server/game/Spells/TraitMgr.h index 2350f2bb92d..aceccbfe916 100644 --- a/src/server/game/Spells/TraitMgr.h +++ b/src/server/game/Spells/TraitMgr.h @@ -43,15 +43,45 @@ namespace TraitMgr constexpr uint32 COMMIT_COMBAT_TRAIT_CONFIG_CHANGES_SPELL_ID = 384255u; constexpr uint32 MAX_COMBAT_TRAIT_CONFIGS = 10u; +enum class LearnResult : int32 +{ + Ok = 0, + Unknown = 1, + NotEnoughTalentsInPrimaryTree = 2, + NoPrimaryTreeSelected = 3, + CantDoThatRightNow = 4, + AffectingCombat = 5, + CantRemoveTalent = 6, + CantDoThatChallengeModeActive = 7, + RestArea = 8, + UnspentTalentPoints = 9, + InPvpMatch = 10 +}; + +struct PlayerDataAccessor +{ + /*implicit*/ PlayerDataAccessor(Player const* player) : _player(player) { } + + uint64 GetMoney() const; + int32 GetCurrency(int32 currencyId) const; + int32 GetLevel() const; + bool IsQuestRewarded(int32 questId) const; + bool HasAchieved(int32 achievementId) const; + uint32 GetPrimarySpecialization() const; + +private: + Player const* _player; +}; + void Load(); int32 GenerateNewTraitConfigId(); TraitConfigType GetConfigTypeForTree(int32 traitTreeId); void FillSpentCurrenciesMap(WorldPackets::Traits::TraitEntry const& entry, std::map<int32, int32>& cachedCurrencies); -std::vector<UF::TraitEntry> GetGrantedTraitEntriesForConfig(WorldPackets::Traits::TraitConfig const& traitConfig, Player const* player); +std::vector<UF::TraitEntry> GetGrantedTraitEntriesForConfig(WorldPackets::Traits::TraitConfig const& traitConfig, PlayerDataAccessor player); bool IsValidEntry(WorldPackets::Traits::TraitEntry const& traitEntry); -TalentLearnResult ValidateConfig(WorldPackets::Traits::TraitConfig const& traitConfig, Player const* player, bool requireSpendingAllCurrencies = false); +LearnResult ValidateConfig(WorldPackets::Traits::TraitConfig const& traitConfig, PlayerDataAccessor player, bool requireSpendingAllCurrencies = false); std::vector<TraitDefinitionEffectPointsEntry const*> const* GetTraitDefinitionEffectPointModifiers(int32 traitDefinitionId); -void InitializeStarterBuildTraitConfig(WorldPackets::Traits::TraitConfig& traitConfig, Player const* player); +void InitializeStarterBuildTraitConfig(WorldPackets::Traits::TraitConfig& traitConfig, PlayerDataAccessor player); } #endif // TRINITY_TRAIT_MGR_H diff --git a/src/server/shared/Realm/Realm.h b/src/server/shared/Realm/Realm.h index a04a3ea9139..21627887b31 100644 --- a/src/server/shared/Realm/Realm.h +++ b/src/server/shared/Realm/Realm.h @@ -20,6 +20,7 @@ #include "Common.h" #include "AsioHacksFwd.h" +#include <memory> enum RealmFlags { diff --git a/src/tools/extractor_common/DB2CascFileSource.h b/src/tools/extractor_common/DB2CascFileSource.h index 82809db604e..b68a532584c 100644 --- a/src/tools/extractor_common/DB2CascFileSource.h +++ b/src/tools/extractor_common/DB2CascFileSource.h @@ -20,6 +20,7 @@ #include "DB2FileLoader.h" #include "CascHandles.h" +#include <memory> #include <string> struct DB2CascFileSource : public DB2FileSource diff --git a/src/tools/mmaps_generator/PathCommon.h b/src/tools/mmaps_generator/PathCommon.h index fed5698b119..c098ff02f4c 100644 --- a/src/tools/mmaps_generator/PathCommon.h +++ b/src/tools/mmaps_generator/PathCommon.h @@ -18,7 +18,8 @@ #ifndef _MMAP_COMMON_H #define _MMAP_COMMON_H -#include "Common.h" +#include "Define.h" +#include <memory> #include <string> #include <unordered_map> #include <vector> |