diff options
21 files changed, 898 insertions, 331 deletions
diff --git a/src/common/Common.h b/src/common/Common.h index 92c0453ddc0..141b163a63e 100644 --- a/src/common/Common.h +++ b/src/common/Common.h @@ -20,27 +20,8 @@ #include "Define.h" #include <array> -#include <memory> #include <string> -#include <utility> - -#if TRINITY_PLATFORM == TRINITY_PLATFORM_WINDOWS -# include <ws2tcpip.h> - -# 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/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp index 7377caa7943..19d5f28eef6 100644 --- a/src/server/game/Battlegrounds/Battleground.cpp +++ b/src/server/game/Battlegrounds/Battleground.cpp @@ -1068,7 +1068,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 dcceb4d1127..4671ba22780 100644 --- a/src/server/game/Battlegrounds/Battleground.h +++ b/src/server/game/Battlegrounds/Battleground.h @@ -23,6 +23,7 @@ #include "ObjectGuid.h" #include "Position.h" #include "SharedDefines.h" +#include <deque> #include <map> namespace WorldPackets @@ -592,7 +593,7 @@ class TC_GAME_API Battleground // 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/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/Entities/Object/ObjectGuid.cpp b/src/server/game/Entities/Object/ObjectGuid.cpp index 959a994c043..3de8cb7b2dc 100644 --- a/src/server/game/Entities/Object/ObjectGuid.cpp +++ b/src/server/game/Entities/Object/ObjectGuid.cpp @@ -91,31 +91,27 @@ ByteBuffer& operator>>(ByteBuffer& buf, PackedGuidReader const& 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::Unit || _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(); } - -#define GUID_TRAIT_INSTANTIATE_GUID( HIGH_GUID ) \ - template class TC_GAME_API ObjectGuidGenerator< HIGH_GUID >; - -GUID_TRAIT_INSTANTIATE_GUID(HighGuid::Container) -GUID_TRAIT_INSTANTIATE_GUID(HighGuid::Player) -GUID_TRAIT_INSTANTIATE_GUID(HighGuid::GameObject) -GUID_TRAIT_INSTANTIATE_GUID(HighGuid::Transport) -GUID_TRAIT_INSTANTIATE_GUID(HighGuid::Unit) -GUID_TRAIT_INSTANTIATE_GUID(HighGuid::Pet) -GUID_TRAIT_INSTANTIATE_GUID(HighGuid::Vehicle) -GUID_TRAIT_INSTANTIATE_GUID(HighGuid::DynamicObject) -GUID_TRAIT_INSTANTIATE_GUID(HighGuid::Mo_Transport) -GUID_TRAIT_INSTANTIATE_GUID(HighGuid::Instance) -GUID_TRAIT_INSTANTIATE_GUID(HighGuid::Group) diff --git a/src/server/game/Entities/Object/ObjectGuid.h b/src/server/game/Entities/Object/ObjectGuid.h index 31996595d0a..46b23671257 100644 --- a/src/server/game/Entities/Object/ObjectGuid.h +++ b/src/server/game/Entities/Object/ObjectGuid.h @@ -20,7 +20,6 @@ #include "ByteBuffer.h" #include "Define.h" -#include <deque> #include <functional> #include <list> #include <memory> @@ -248,11 +247,10 @@ class TC_GAME_API ObjectGuid }; // Some Shared defines -typedef std::set<ObjectGuid> GuidSet; -typedef std::list<ObjectGuid> GuidList; -typedef std::deque<ObjectGuid> GuidDeque; -typedef std::vector<ObjectGuid> GuidVector; -typedef std::unordered_set<ObjectGuid> GuidUnorderedSet; +using GuidSet = std::set<ObjectGuid>; +using GuidList = std::list<ObjectGuid>; +using GuidVector = std::vector<ObjectGuid>; +using GuidUnorderedSet = std::unordered_set<ObjectGuid>; // minimum buffer size for packed guid is 9 bytes #define PACKED_GUID_MIN_BUFFER_SIZE 9 @@ -275,40 +273,23 @@ class TC_GAME_API PackedGuid ByteBuffer _packedGuid; }; -class TC_GAME_API ObjectGuidGeneratorBase +class TC_GAME_API ObjectGuidGenerator { public: - ObjectGuidGeneratorBase(ObjectGuid::LowType start = 1) : _nextGuid(start) { } + explicit ObjectGuidGenerator(HighGuid high, ObjectGuid::LowType start = 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; } - virtual ~ObjectGuidGeneratorBase() { } 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 = 1) : ObjectGuidGeneratorBase(start) { } - - ObjectGuid::LowType Generate() override - { - if (_nextGuid >= ObjectGuid::GetMaxCounter(high) - 1) - HandleCounterOverflow(high); - - if (high == HighGuid::Unit || high == HighGuid::GameObject) - 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/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index fc867d69235..24f8c9ce466 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -7431,21 +7431,21 @@ void ObjectMgr::SetHighestGuids() { QueryResult result = CharacterDatabase.Query("SELECT MAX(guid) FROM characters"); if (result) - GetGuidSequenceGenerator<HighGuid::Player>().Set((*result)[0].GetUInt32()+1); + GetGuidSequenceGenerator(HighGuid::Player).Set((*result)[0].GetUInt32() + 1); result = CharacterDatabase.Query("SELECT MAX(guid) FROM item_instance"); if (result) - GetGuidSequenceGenerator<HighGuid::Item>().Set((*result)[0].GetUInt32()+1); + GetGuidSequenceGenerator(HighGuid::Item).Set((*result)[0].GetUInt32() + 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 auctionhouse WHERE 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 + 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 auctionhouse WHERE 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 result = WorldDatabase.Query("SELECT MAX(guid) FROM transports"); if (result) - GetGuidSequenceGenerator<HighGuid::Mo_Transport>().Set((*result)[0].GetUInt32()+1); + GetGuidSequenceGenerator(HighGuid::Transport).Set((*result)[0].GetUInt32() + 1); result = CharacterDatabase.Query("SELECT MAX(id) FROM auctionhouse"); if (result) @@ -7480,6 +7480,15 @@ void ObjectMgr::SetHighestGuids() _gameObjectSpawnId = (*result)[0].GetUInt32() + 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 875949faf16..8ea3c22213c 100644 --- a/src/server/game/Globals/ObjectMgr.h +++ b/src/server/game/Globals/ObjectMgr.h @@ -1254,10 +1254,10 @@ class TC_GAME_API ObjectMgr void SetHighestGuids(); template<HighGuid type> - inline ObjectGuidGeneratorBase& GetGenerator() + ObjectGuidGenerator& GetGenerator() { static_assert(ObjectGuidTraits<type>::Global, "Only global guid can be generated in ObjectMgr context"); - return GetGuidSequenceGenerator<type>(); + return GetGuidSequenceGenerator(type); } uint32 GenerateAuctionID(); @@ -1584,17 +1584,9 @@ class TC_GAME_API ObjectMgr ObjectGuid::LowType _gameObjectSpawnId; // 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::unique_ptr<ObjectGuidGenerator<high>>(new 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; typedef std::unordered_map<uint32, GossipText> GossipTextContainer; diff --git a/src/server/game/Grids/Dynamic/TypeContainer.h b/src/server/game/Grids/Dynamic/TypeContainer.h index f790f0e3904..14d22d8056c 100644 --- a/src/server/game/Grids/Dynamic/TypeContainer.h +++ b/src/server/game/Grids/Dynamic/TypeContainer.h @@ -38,7 +38,6 @@ template<class OBJECT> struct ContainerMapList { - //std::map<OBJECT_HANDLE, OBJECT *> _element; GridRefManager<OBJECT> _element; }; @@ -84,67 +83,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 a709cc586e8..4ba7f33db81 100644 --- a/src/server/game/Grids/GridDefines.h +++ b/src/server/game/Grids/GridDefines.h @@ -76,12 +76,17 @@ enum GridMapTypeMask GRID_MAP_TYPE_MASK_ALL = 0x1F }; +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; typedef TypeMapContainer<AllGridObjectTypes> GridTypeMapContainer; typedef TypeMapContainer<AllWorldObjectTypes> WorldTypeMapContainer; -typedef TypeUnorderedMapContainer<AllMapStoredObjectTypes, ObjectGuid> MapStoredObjectTypesContainer; template<uint32 LIMIT> struct CoordPair diff --git a/src/server/game/Grids/NGrid.cpp b/src/server/game/Grids/NGrid.cpp index 214bbc8adbd..cd77630fb99 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), i_unloadReferenceLock(false) { } + +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/Instances/InstanceScript.h b/src/server/game/Instances/InstanceScript.h index bd93498877a..063362af456 100644 --- a/src/server/game/Instances/InstanceScript.h +++ b/src/server/game/Instances/InstanceScript.h @@ -22,9 +22,12 @@ #include "Common.h" #include "Duration.h" #include <map> -#include <memory> #include <set> +#ifdef TRINITY_API_USE_DYNAMIC_LINKING +#include <memory> +#endif + #define OUT_SAVE_INST_DATA TC_LOG_DEBUG("scripts", "Saving Instance Data for Instance %s (Map %d, Instance Id %d)", instance->GetMapName(), instance->GetId(), instance->GetInstanceId()) #define OUT_SAVE_INST_DATA_COMPLETE TC_LOG_DEBUG("scripts", "Saving Instance Data for Instance %s (Map %d, Instance Id %d) completed.", instance->GetMapName(), instance->GetId(), instance->GetInstanceId()) #define OUT_LOAD_INST_DATA(a) TC_LOG_DEBUG("scripts", "Loading Instance Data for Instance %s (Map %d, Instance Id %d). Input is '%s'", instance->GetMapName(), instance->GetId(), instance->GetInstanceId(), a) diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index cf358105825..eb0809398bb 100644 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -3522,6 +3522,15 @@ bool Map::IsSpawnGroupActive(uint32 groupId) const return (_toggledSpawnGroupIds.find(groupId) != _toggledSpawnGroupIds.end()) != !(data->flags & SPAWNGROUP_FLAG_MANUAL_SPAWN); } +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))); @@ -4841,3 +4850,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 bf013d0d6ad..237ce5ff654 100644 --- a/src/server/game/Maps/Map.h +++ b/src/server/game/Maps/Map.h @@ -314,6 +314,9 @@ 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> { friend class MapReference; @@ -620,14 +623,14 @@ class TC_GAME_API Map : public GridRefManager<NGridType> inline ObjectGuid::LowType GenerateLowGuid() { static_assert(ObjectGuidTraits<high>::MapSpecific, "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>::MapSpecific, "Only map specific guid can be retrieved in Map context"); - return GetGuidSequenceGenerator<high>().GetNextAfterMaxUsed(); + return GetGuidSequenceGenerator(high).GetNextAfterMaxUsed(); } void AddUpdateObject(Object* obj) @@ -879,17 +882,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::unique_ptr<ObjectGuidGenerator<high>>(new 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; MapStoredObjectTypesContainer _objectsStore; CreatureBySpawnIdContainer _creatureBySpawnIdStore; GameObjectBySpawnIdContainer _gameobjectBySpawnIdStore; diff --git a/src/server/game/Scripting/ScriptMgr.cpp b/src/server/game/Scripting/ScriptMgr.cpp index be8494df7eb..4d19c9a8513 100644 --- a/src/server/game/Scripting/ScriptMgr.cpp +++ b/src/server/game/Scripting/ScriptMgr.cpp @@ -1008,6 +1008,11 @@ ScriptObject::~ScriptObject() sScriptMgr->DecreaseScriptCount(); } +std::string const& ScriptObject::GetName() const +{ + return _name; +} + ScriptMgr::ScriptMgr() : _scriptCount(0), _script_loader_callback(nullptr) { @@ -2129,32 +2134,160 @@ 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) { ScriptRegistry<ServerScript>::Instance()->AddScript(this); } +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) { ScriptRegistry<WorldScript>::Instance()->AddScript(this); } +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) { ScriptRegistry<FormulaScript>::Instance()->AddScript(this); } -UnitScript::UnitScript(char const* name) - : ScriptObject(name) +void FormulaScript::OnHonorCalculation(float& /*honor*/, uint8 /*level*/, float /*multiplier*/) +{ +} + +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*/, ContentLevels /*content*/) +{ +} + +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*/) { - ScriptRegistry<UnitScript>::Instance()->AddScript(this); } +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); @@ -2166,7 +2299,7 @@ WorldMapScript::WorldMapScript(char const* name, uint32 mapId) } 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); @@ -2177,8 +2310,13 @@ InstanceMapScript::InstanceMapScript(char const* name, uint32 mapId) ScriptRegistry<InstanceMapScript>::Instance()->AddScript(this); } +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); @@ -2195,6 +2333,57 @@ ItemScript::ItemScript(char const* name) ScriptRegistry<ItemScript>::Instance()->AddScript(this); } +bool ItemScript::OnQuestAccept(Player* /*player*/, Item* /*item*/, Quest const* /*quest*/) +{ + return false; +} + +bool ItemScript::OnUse(Player* /*player*/, Item* /*item*/, SpellCastTargets const& /*targets*/) +{ + 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); +} + +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*/) +{ +} + CreatureScript::CreatureScript(char const* name) : ScriptObject(name) { @@ -2213,6 +2402,11 @@ AreaTriggerScript::AreaTriggerScript(char const* name) ScriptRegistry<AreaTriggerScript>::Instance()->AddScript(this); } +bool AreaTriggerScript::OnTrigger(Player* /*player*/, AreaTriggerEntry const* /*trigger*/) +{ + return false; +} + bool OnlyOnceAreaTriggerScript::OnTrigger(Player* player, AreaTriggerEntry const* trigger) { uint32 const triggerId = trigger->ID; @@ -2225,7 +2419,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) @@ -2258,36 +2452,113 @@ WeatherScript::WeatherScript(char const* name) ScriptRegistry<WeatherScript>::Instance()->AddScript(this); } +void WeatherScript::OnChange(Weather* /*weather*/, WeatherState /*state*/, float /*grade*/) +{ +} + +void WeatherScript::OnUpdate(Weather* /*weather*/, uint32 /*diff*/) +{ +} + AuctionHouseScript::AuctionHouseScript(char const* name) : ScriptObject(name) { ScriptRegistry<AuctionHouseScript>::Instance()->AddScript(this); } +void AuctionHouseScript::OnAuctionAdd(AuctionHouseObject* /*ah*/, AuctionEntry* /*entry*/) +{ +} + +void AuctionHouseScript::OnAuctionRemove(AuctionHouseObject* /*ah*/, AuctionEntry* /*entry*/) +{ +} + +void AuctionHouseScript::OnAuctionSuccessful(AuctionHouseObject* /*ah*/, AuctionEntry* /*entry*/) +{ +} + +void AuctionHouseScript::OnAuctionExpire(AuctionHouseObject* /*ah*/, AuctionEntry* /*entry*/) +{ +} + ConditionScript::ConditionScript(char const* name) : ScriptObject(name) { ScriptRegistry<ConditionScript>::Instance()->AddScript(this); } +bool ConditionScript::OnConditionCheck(Condition const* /*condition*/, ConditionSourceInfo& /*sourceInfo*/) +{ + return true; +} + VehicleScript::VehicleScript(char const* name) : ScriptObject(name) { ScriptRegistry<VehicleScript>::Instance()->AddScript(this); } +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) { ScriptRegistry<DynamicObjectScript>::Instance()->AddScript(this); } +void DynamicObjectScript::OnUpdate(DynamicObject* /*obj*/, uint32 /*diff*/) +{ +} + TransportScript::TransportScript(char const* name) : ScriptObject(name) { ScriptRegistry<TransportScript>::Instance()->AddScript(this); } +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 /*waypointId*/, uint32 /*mapId*/, float /*x*/, float /*y*/, float /*z*/) +{ +} + +void TransportScript::OnUpdate(Transport* /*transport*/, uint32 /*diff*/) +{ +} + AchievementCriteriaScript::AchievementCriteriaScript(char const* name) : ScriptObject(name) { @@ -2300,24 +2571,246 @@ PlayerScript::PlayerScript(char const* name) ScriptRegistry<PlayerScript>::Instance()->AddScript(this); } +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*/, int32& /*amount*/) +{ +} + +void PlayerScript::OnMoneyLimit(Player* /*player*/, int32 /*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::OnEmote(Player* /*player*/, Emote /*emote*/) +{ +} + +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*/) +{ +} + AccountScript::AccountScript(char const* name) : ScriptObject(name) { ScriptRegistry<AccountScript>::Instance()->AddScript(this); } +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) { ScriptRegistry<GuildScript>::Instance()->AddScript(this); } +void GuildScript::OnAddMember(Guild* /*guild*/, Player* /*player*/, uint8& /*plRank*/) +{ +} + +void GuildScript::OnRemoveMember(Guild* /*guild*/, Player* /*player*/, 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*/, uint32& /*amount*/, bool /*isRepair*/) +{ +} + +void GuildScript::OnMemberDepositMoney(Guild* /*guild*/, Player* /*player*/, uint32& /*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*/, uint32 /*itemOrMoney*/, uint16 /*itemStackCount*/, + uint8 /*destTabId*/) +{ +} + GroupScript::GroupScript(char const* name) : ScriptObject(name) { ScriptRegistry<GroupScript>::Instance()->AddScript(this); } +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*/) +{ +} + // 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 b0f641b80e4..d43b8e1c8b8 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; @@ -172,7 +173,7 @@ class TC_GAME_API ScriptObject public: - const std::string& GetName() const { return _name; } + std::string const& GetName() const; protected: @@ -181,150 +182,136 @@ class TC_GAME_API ScriptObject private: - const std::string _name; -}; - -template<class TObject> class UpdatableScript -{ - protected: - - UpdatableScript() - { - } - - virtual ~UpdatableScript() { } - - public: - - 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: // 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: // 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: // 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*/, ContentLevels /*content*/) { } + virtual void OnBaseGainCalculation(uint32& gain, uint8 playerLevel, uint8 mobLevel, ContentLevels content); // 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> +template<class 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 grid map is loaded. virtual void OnLoadGridMap(TMap* /*map*/, GridMap* /*gmap*/, uint32 /*gx*/, uint32 /*gy*/) { } @@ -333,119 +320,120 @@ template<class TMap> class MapScript : public UpdatableScript<TMap> virtual void OnUnloadGridMap(TMap* /*map*/, GridMap* /*gmap*/, uint32 /*gx*/, uint32 /*gy*/) { } // 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); }; -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: // 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); }; class TC_GAME_API ItemScript : public ScriptObject { protected: - ItemScript(char const* name); + explicit ItemScript(char const* name); public: // 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*/) { return false; } + virtual bool OnUse(Player* player, Item* item, SpellCastTargets const& targets); // 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: // 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*/) { } + virtual void ModifySpellDamageTaken(Unit* target, Unit* attacker, int32& damage); }; class TC_GAME_API CreatureScript : public ScriptObject { protected: - CreatureScript(char const* name); + explicit CreatureScript(char const* name); public: // 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: // 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: // 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); }; class TC_GAME_API OnlyOnceAreaTriggerScript : public AreaTriggerScript @@ -457,16 +445,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: @@ -477,7 +465,7 @@ class TC_GAME_API BattlegroundScript : public ScriptObject { protected: - BattlegroundScript(char const* name); + explicit BattlegroundScript(char const* name); public: @@ -489,7 +477,7 @@ class TC_GAME_API OutdoorPvPScript : public ScriptObject { protected: - OutdoorPvPScript(char const* name); + explicit OutdoorPvPScript(char const* name); public: @@ -501,7 +489,7 @@ class TC_GAME_API CommandScript : public ScriptObject { protected: - CommandScript(char const* name); + explicit CommandScript(char const* name); public: @@ -509,111 +497,119 @@ 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: // 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: // Called when an auction is added to an auction house. - virtual void OnAuctionAdd(AuctionHouseObject* /*ah*/, AuctionEntry* /*entry*/) { } + virtual void OnAuctionAdd(AuctionHouseObject* ah, AuctionEntry* entry); // Called when an auction is removed from an auction house. - virtual void OnAuctionRemove(AuctionHouseObject* /*ah*/, AuctionEntry* /*entry*/) { } + virtual void OnAuctionRemove(AuctionHouseObject* ah, AuctionEntry* entry); // Called when an auction was succesfully completed. - virtual void OnAuctionSuccessful(AuctionHouseObject* /*ah*/, AuctionEntry* /*entry*/) { } + virtual void OnAuctionSuccessful(AuctionHouseObject* ah, AuctionEntry* entry); // Called when an auction expires. - virtual void OnAuctionExpire(AuctionHouseObject* /*ah*/, AuctionEntry* /*entry*/) { } + virtual void OnAuctionExpire(AuctionHouseObject* ah, AuctionEntry* entry); }; class TC_GAME_API ConditionScript : public ScriptObject { protected: - ConditionScript(char const* name); + explicit ConditionScript(char const* name); public: // 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: // 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: + + 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: // 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 /*waypointId*/, uint32 /*mapId*/, float /*x*/, float /*y*/, float /*z*/) { } + virtual void OnRelocate(Transport* transport, uint32 waypointId, uint32 mapId, float x, float y, float z); + + virtual void OnUpdate(Transport* transport, uint32 diff); }; class TC_GAME_API AchievementCriteriaScript : public ScriptObject { protected: - AchievementCriteriaScript(char const* name); + explicit AchievementCriteriaScript(char const* name); public: @@ -625,198 +621,199 @@ class TC_GAME_API PlayerScript : public ScriptObject { protected: - PlayerScript(char const* name); + explicit PlayerScript(char const* name); public: // 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*/, int32& /*amount*/) { } + virtual void OnMoneyChanged(Player* player, int32& amount); // Called when a player's money is at limit (amount = money tried to add) - virtual void OnMoneyLimit(Player* /*player*/, int32 /*amount*/) { } + virtual void OnMoneyLimit(Player* player, int32 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 OnEmote(Player* /*player*/, Emote /*emote*/) { } + virtual void OnEmote(Player* player, Emote emote); - 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 when a player obtains progress on a quest's objective virtual void OnQuestObjectiveProgress(Player* /*player*/, Quest const* /*quest*/, uint32 /*objectiveIndex*/, uint16 /*progress*/) { } // 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); // 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 presses release when he died - virtual void OnPlayerRepop(Player* /*player*/) { } }; class TC_GAME_API AccountScript : public ScriptObject { protected: - AccountScript(char const* name); + explicit AccountScript(char const* name); public: // 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: // 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*/, Player* /*player*/, bool /*isDisbanding*/, bool /*isKicked*/) { } + virtual void OnRemoveMember(Guild* guild, Player* player, 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*/, uint32& /*amount*/, bool /*isRepair*/) { } + virtual void OnMemberWitdrawMoney(Guild* guild, Player* player, uint32& amount, bool isRepair); // Called when a guild member deposits money in a guild bank. - virtual void OnMemberDepositMoney(Guild* /*guild*/, Player* /*player*/, uint32& /*amount*/) { } + virtual void OnMemberDepositMoney(Guild* guild, Player* player, uint32& 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*/, uint32 /*itemOrMoney*/, uint16 /*itemStackCount*/, uint8 /*destTabId*/) { } + virtual void OnBankEvent(Guild* guild, uint8 eventType, uint8 tabId, ObjectGuid::LowType playerGuid, uint32 itemOrMoney, uint16 itemStackCount, uint8 destTabId); }; class TC_GAME_API GroupScript : public ScriptObject { protected: - GroupScript(char const* name); + explicit GroupScript(char const* name); public: // 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); }; // Manages registration, loading, and execution of scripts. diff --git a/src/server/game/Spells/SpellScript.cpp b/src/server/game/Spells/SpellScript.cpp index a822e3a0147..b8b52bf62f6 100644 --- a/src/server/game/Spells/SpellScript.cpp +++ b/src/server/game/Spells/SpellScript.cpp @@ -336,6 +336,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) @@ -1009,6 +1015,12 @@ void AuraScript::EffectProcHandler::Call(AuraScript* auraScript, AuraEffect cons (auraScript->*_EffectHandlerScript)(aurEff, eventInfo); } +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 f2d4c422b5a..91eb9cf5c3b 100644 --- a/src/server/game/Spells/SpellScript.h +++ b/src/server/game/Spells/SpellScript.h @@ -325,6 +325,8 @@ class TC_GAME_API SpellScript : public _SpellScript #define PrepareSpellScript(CLASSNAME) SPELLSCRIPT_FUNCTION_TYPE_DEFINES(CLASSNAME) SPELLSCRIPT_FUNCTION_CAST_DEFINES(CLASSNAME) public: + SpellScript(); + ~SpellScript(); bool _Validate(SpellInfo const* entry) override; bool _Load(Spell* spell); void _InitHit(); @@ -730,8 +732,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/shared/Realm/Realm.h b/src/server/shared/Realm/Realm.h index f5856de5b77..fb19bd78d69 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/server/worldserver/CommandLine/CliRunnable.cpp b/src/server/worldserver/CommandLine/CliRunnable.cpp index c5a14c9dcc2..878b70eab41 100644 --- a/src/server/worldserver/CommandLine/CliRunnable.cpp +++ b/src/server/worldserver/CommandLine/CliRunnable.cpp @@ -35,6 +35,8 @@ #include <cstring> #include <readline/readline.h> #include <readline/history.h> +#else +#include <Windows.h> #endif static constexpr char CLI_PREFIX[] = "TC> "; diff --git a/src/tools/mmaps_generator/PathCommon.h b/src/tools/mmaps_generator/PathCommon.h index 6dbe5630297..4f29a034d92 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 <vector> |