diff options
32 files changed, 234 insertions, 20 deletions
diff --git a/src/common/Debugging/Errors.cpp b/src/common/Debugging/Errors.cpp index 9f832caff4d..7ad137715da 100644 --- a/src/common/Debugging/Errors.cpp +++ b/src/common/Debugging/Errors.cpp @@ -58,8 +58,8 @@ namespace int32 length = vsnprintf(nullptr, 0, format, len); va_end(len); - formatted.resize(length + 1); - vsnprintf(&formatted[0], length + 1, format, args); + formatted.resize(length); + vsnprintf(&formatted[0], length, format, args); return formatted; } @@ -68,20 +68,20 @@ namespace namespace Trinity { -void Assert(char const* file, int line, char const* function, char const* message) +void Assert(char const* file, int line, char const* function, std::string debugInfo, char const* message) { - std::string formattedMessage = StringFormat("\n%s:%i in %s ASSERTION FAILED:\n %s\n", file, line, function, message); + std::string formattedMessage = StringFormat("\n%s:%i in %s ASSERTION FAILED:\n %s\n", file, line, function, message) + debugInfo + '\n'; fprintf(stderr, "%s", formattedMessage.c_str()); fflush(stderr); Crash(formattedMessage.c_str()); } -void Assert(char const* file, int line, char const* function, char const* message, char const* format, ...) +void Assert(char const* file, int line, char const* function, std::string debugInfo, char const* message, char const* format, ...) { va_list args; va_start(args, format); - std::string formattedMessage = StringFormat("\n%s:%i in %s ASSERTION FAILED:\n %s\n", file, line, function, message) + FormatAssertionMessage(format, args) + '\n'; + std::string formattedMessage = StringFormat("\n%s:%i in %s ASSERTION FAILED:\n %s\n", file, line, function, message) + FormatAssertionMessage(format, args) + '\n' + debugInfo + '\n'; va_end(args); fprintf(stderr, "%s", formattedMessage.c_str()); @@ -137,3 +137,8 @@ void AbortHandler(int sigval) } } // namespace Trinity + +std::string GetDebugInfo() +{ + return ""; +} diff --git a/src/common/Debugging/Errors.h b/src/common/Debugging/Errors.h index f64bff72fd1..befb269a120 100644 --- a/src/common/Debugging/Errors.h +++ b/src/common/Debugging/Errors.h @@ -19,11 +19,12 @@ #define TRINITYCORE_ERRORS_H #include "Define.h" +#include <string> namespace Trinity { - DECLSPEC_NORETURN TC_COMMON_API void Assert(char const* file, int line, char const* function, char const* message) ATTR_NORETURN; - DECLSPEC_NORETURN TC_COMMON_API void Assert(char const* file, int line, char const* function, char const* message, char const* format, ...) ATTR_NORETURN ATTR_PRINTF(5, 6); + DECLSPEC_NORETURN TC_COMMON_API void Assert(char const* file, int line, char const* function, std::string debugInfo, char const* message) ATTR_NORETURN; + DECLSPEC_NORETURN TC_COMMON_API void Assert(char const* file, int line, char const* function, std::string debugInfo, char const* message, char const* format, ...) ATTR_NORETURN ATTR_PRINTF(6, 7); DECLSPEC_NORETURN TC_COMMON_API void Fatal(char const* file, int line, char const* function, char const* message, ...) ATTR_NORETURN ATTR_PRINTF(4, 5); @@ -37,6 +38,8 @@ namespace Trinity } // namespace Trinity +TC_COMMON_API std::string GetDebugInfo(); + #if TRINITY_COMPILER == TRINITY_COMPILER_MICROSOFT #define ASSERT_BEGIN __pragma(warning(push)) __pragma(warning(disable: 4127)) #define ASSERT_END __pragma(warning(pop)) @@ -49,7 +52,8 @@ namespace Trinity #define EXCEPTION_ASSERTION_FAILURE 0xC0000420L #endif -#define WPAssert(cond, ...) ASSERT_BEGIN do { if (!(cond)) Trinity::Assert(__FILE__, __LINE__, __FUNCTION__, #cond, ##__VA_ARGS__); } while(0) ASSERT_END +#define WPAssert(cond, ...) ASSERT_BEGIN do { if (!(cond)) Trinity::Assert(__FILE__, __LINE__, __FUNCTION__, GetDebugInfo(), #cond, ##__VA_ARGS__); } while(0) ASSERT_END +#define WPAssert_NODEBUGINFO(cond, ...) ASSERT_BEGIN do { if (!(cond)) Trinity::Assert(__FILE__, __LINE__, __FUNCTION__, "", #cond, ##__VA_ARGS__); } while(0) ASSERT_END #define WPFatal(cond, ...) ASSERT_BEGIN do { if (!(cond)) Trinity::Fatal(__FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__); } while(0) ASSERT_END #define WPError(cond, msg) ASSERT_BEGIN do { if (!(cond)) Trinity::Error(__FILE__, __LINE__, __FUNCTION__, (msg)); } while(0) ASSERT_END #define WPWarning(cond, msg) ASSERT_BEGIN do { if (!(cond)) Trinity::Warning(__FILE__, __LINE__, __FUNCTION__, (msg)); } while(0) ASSERT_END @@ -57,8 +61,10 @@ namespace Trinity #ifdef PERFORMANCE_PROFILING #define ASSERT(cond, ...) ((void)0) +#define ASSERT_NODEBUGINFO(cond, ...) ((void)0) #else #define ASSERT WPAssert +#define ASSERT_NODEBUGINFO WPAssert_NODEBUGINFO #endif #define ABORT WPAbort diff --git a/src/server/game/AI/CoreAI/UnitAI.cpp b/src/server/game/AI/CoreAI/UnitAI.cpp index fe16a56497f..b9c805503e8 100644 --- a/src/server/game/AI/CoreAI/UnitAI.cpp +++ b/src/server/game/AI/CoreAI/UnitAI.cpp @@ -27,6 +27,7 @@ #include "SpellAuras.h" #include "SpellInfo.h" #include "SpellMgr.h" +#include <sstream> void UnitAI::AttackStart(Unit* victim) { @@ -312,6 +313,14 @@ void UnitAI::SortByDistance(std::list<Unit*> list, bool ascending) list.sort(Trinity::ObjectDistanceOrderPred(me, ascending)); } +std::string UnitAI::GetDebugInfo() const +{ + std::stringstream sstr; + sstr << std::boolalpha + << "Me: " << (me ? me->GetDebugInfo() : "NULL"); + return sstr.str(); +} + DefaultTargetSelector::DefaultTargetSelector(Unit const* unit, float dist, bool playerOnly, bool withTank, int32 aura) : me(unit), m_dist(dist), m_playerOnly(playerOnly), except(!withTank ? me->GetThreatManager().GetCurrentVictim() : nullptr), m_aura(aura) { diff --git a/src/server/game/AI/CoreAI/UnitAI.h b/src/server/game/AI/CoreAI/UnitAI.h index 5e5f657b08a..f1d0d862f26 100644 --- a/src/server/game/AI/CoreAI/UnitAI.h +++ b/src/server/game/AI/CoreAI/UnitAI.h @@ -326,6 +326,8 @@ class TC_GAME_API UnitAI // Called when a game event starts or ends virtual void OnGameEvent(bool /*start*/, uint16 /*eventId*/) { } + virtual std::string GetDebugInfo() const; + private: UnitAI(UnitAI const& right) = delete; UnitAI& operator=(UnitAI const& right) = delete; diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index 1d21caa6689..f29d04677f9 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -3374,3 +3374,12 @@ bool Creature::IsEscortNPC(bool onlyIfActive) return ai->IsEscortNPC(onlyIfActive); return false; } + +std::string Creature::GetDebugInfo() const +{ + std::stringstream sstr; + sstr << Unit::GetDebugInfo() << "\n" + << "AIName: " << GetAIName() << " ScriptName: " << GetScriptName() + << " WaypointPath: " << GetWaypointPath() << " SpawnId: " << GetSpawnId(); + return sstr.str(); +} diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h index bca4874df5f..cfc4b025562 100644 --- a/src/server/game/Entities/Creature/Creature.h +++ b/src/server/game/Entities/Creature/Creature.h @@ -367,6 +367,8 @@ class TC_GAME_API Creature : public Unit, public GridObject<Creature>, public Ma void AtEnterCombat() override; void AtExitCombat() override; + std::string GetDebugInfo() const override; + protected: bool CreateFromProto(ObjectGuid::LowType guidlow, uint32 entry, CreatureData const* data = nullptr, uint32 vehId = 0); bool InitEntry(uint32 entry, CreatureData const* data = nullptr); diff --git a/src/server/game/Entities/Creature/TemporarySummon.cpp b/src/server/game/Entities/Creature/TemporarySummon.cpp index 96c62d9b924..e21d3624e32 100644 --- a/src/server/game/Entities/Creature/TemporarySummon.cpp +++ b/src/server/game/Entities/Creature/TemporarySummon.cpp @@ -23,6 +23,7 @@ #include "ObjectAccessor.h" #include "Pet.h" #include "Player.h" +#include <sstream> TempSummon::TempSummon(SummonPropertiesEntry const* properties, Unit* owner, bool isWorldObject) : Creature(isWorldObject), m_Properties(properties), m_type(TEMPSUMMON_MANUAL_DESPAWN), @@ -276,6 +277,15 @@ void TempSummon::RemoveFromWorld() Creature::RemoveFromWorld(); } +std::string TempSummon::GetDebugInfo() const +{ + std::stringstream sstr; + sstr << Creature::GetDebugInfo() << "\n" + << std::boolalpha + << "TempSummonType : " << std::to_string(GetSummonType()) << " Summoner: " << GetSummonerGUID().ToString(); + return sstr.str(); +} + Minion::Minion(SummonPropertiesEntry const* properties, Unit* owner, bool isWorldObject) : TempSummon(properties, owner, isWorldObject), m_owner(owner) { @@ -316,7 +326,7 @@ void Minion::setDeathState(DeathState s) Unit* owner = GetOwner(); if (!owner || owner->GetTypeId() != TYPEID_PLAYER || owner->GetMinionGUID() != GetGUID()) return; - + for (Unit* controlled : owner->m_Controlled) { if (controlled->GetEntry() == GetEntry() && controlled->IsAlive()) @@ -334,6 +344,15 @@ bool Minion::IsGuardianPet() const return IsPet() || (m_Properties && m_Properties->Control == SUMMON_CATEGORY_PET); } +std::string Minion::GetDebugInfo() const +{ + std::stringstream sstr; + sstr << TempSummon::GetDebugInfo() << "\n" + << std::boolalpha + << "Owner: " << (GetOwner() ? GetOwner()->GetGUID().ToString() : ""); + return sstr.str(); +} + Guardian::Guardian(SummonPropertiesEntry const* properties, Unit* owner, bool isWorldObject) : Minion(properties, owner, isWorldObject) , m_bonusSpellDamage(0) { @@ -370,6 +389,13 @@ void Guardian::InitSummon() } } +std::string Guardian::GetDebugInfo() const +{ + std::stringstream sstr; + sstr << Minion::GetDebugInfo(); + return sstr.str(); +} + Puppet::Puppet(SummonPropertiesEntry const* properties, Unit* owner) : Minion(properties, owner, false) //maybe true? { diff --git a/src/server/game/Entities/Creature/TemporarySummon.h b/src/server/game/Entities/Creature/TemporarySummon.h index 6ecb2ef17a0..688b640d1ef 100644 --- a/src/server/game/Entities/Creature/TemporarySummon.h +++ b/src/server/game/Entities/Creature/TemporarySummon.h @@ -56,10 +56,12 @@ class TC_GAME_API TempSummon : public Creature Unit* GetSummoner() const; Creature* GetSummonerCreatureBase() const; ObjectGuid GetSummonerGUID() const { return m_summonerGUID; } - TempSummonType const& GetSummonType() { return m_type; } + TempSummonType GetSummonType() const { return m_type; } uint32 GetTimer() const { return m_timer; } SummonPropertiesEntry const* const m_Properties; + + std::string GetDebugInfo() const override; private: TempSummonType m_type; uint32 m_timer; @@ -94,6 +96,8 @@ class TC_GAME_API Minion : public TempSummon bool IsSpiritWolf() const { return GetEntry() == PET_SPIRIT_WOLF; } // Spirit wolf from feral spirits bool IsGuardianPet() const; + + std::string GetDebugInfo() const override; protected: Unit* const m_owner; float m_followAngle; @@ -119,6 +123,7 @@ class TC_GAME_API Guardian : public Minion int32 GetBonusDamage() const { return m_bonusSpellDamage; } float GetBonusStatFromOwner(Stats stat) const { return m_statFromOwner[stat]; } void SetBonusDamage(int32 damage); + std::string GetDebugInfo() const override; protected: int32 m_bonusSpellDamage; float m_statFromOwner[MAX_STATS]; diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp index 7f4bd3e02c6..999ecab0538 100644 --- a/src/server/game/Entities/GameObject/GameObject.cpp +++ b/src/server/game/Entities/GameObject/GameObject.cpp @@ -2839,3 +2839,11 @@ void GameObject::CreateModel() if (m_model && m_model->isMapObject()) AddFlag(GO_FLAG_MAP_OBJECT); } + +std::string GameObject::GetDebugInfo() const +{ + std::stringstream sstr; + sstr << WorldObject::GetDebugInfo() << "\n" + << "SpawnId: " << GetSpawnId() << " GoState: " << std::to_string(GetGoState()) << " ScriptId: " << GetScriptId() << " AIName: " << GetAIName(); + return sstr.str(); +} diff --git a/src/server/game/Entities/GameObject/GameObject.h b/src/server/game/Entities/GameObject/GameObject.h index a12e96572da..4be1cf2ee59 100644 --- a/src/server/game/Entities/GameObject/GameObject.h +++ b/src/server/game/Entities/GameObject/GameObject.h @@ -308,6 +308,8 @@ class TC_GAME_API GameObject : public WorldObject, public GridObject<GameObject> void AIM_Destroy(); bool AIM_Initialize(); + std::string GetDebugInfo() const override; + UF::UpdateField<UF::GameObjectData, 0, TYPEID_GAMEOBJECT> m_gameObjectData; protected: diff --git a/src/server/game/Entities/Item/Container/Bag.cpp b/src/server/game/Entities/Item/Container/Bag.cpp index 96449083294..8e4ef213eb8 100644 --- a/src/server/game/Entities/Item/Container/Bag.cpp +++ b/src/server/game/Entities/Item/Container/Bag.cpp @@ -23,6 +23,7 @@ #include "Log.h" #include "UpdateData.h" #include "Player.h" +#include <sstream> Bag::Bag(): Item() { @@ -281,6 +282,13 @@ Item* Bag::GetItemByPos(uint8 slot) const return nullptr; } +std::string Bag::GetDebugInfo() const +{ + std::stringstream sstr; + sstr << Item::GetDebugInfo(); + return sstr.str(); +} + uint32 GetBagSize(Bag const* bag) { return bag->GetBagSize(); diff --git a/src/server/game/Entities/Item/Container/Bag.h b/src/server/game/Entities/Item/Container/Bag.h index 3bf36e3c5ea..574a57f323f 100644 --- a/src/server/game/Entities/Item/Container/Bag.h +++ b/src/server/game/Entities/Item/Container/Bag.h @@ -26,7 +26,6 @@ class TC_GAME_API Bag : public Item { public: - Bag(); ~Bag(); @@ -35,7 +34,6 @@ class TC_GAME_API Bag : public Item bool Create(ObjectGuid::LowType guidlow, uint32 itemid, ItemContext context, Player const* owner) override; - void Clear(); void StoreItem(uint8 slot, Item* pItem, bool update); void RemoveItem(uint8 slot, bool update); @@ -64,6 +62,8 @@ class TC_GAME_API Bag : public Item void BuildValuesUpdateForPlayerWithMask(UpdateData* data, UF::ObjectData::Mask const& requestedObjectMask, UF::ItemData::Mask const& requestedItemMask, UF::ContainerData::Mask const& requestedContainerMask, Player const* target) const; + std::string GetDebugInfo() const override; + UF::UpdateField<UF::ContainerData, 0, TYPEID_CONTAINER> m_containerData; protected: diff --git a/src/server/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp index fbbb94df1f1..2fe2f2247b9 100644 --- a/src/server/game/Entities/Item/Item.cpp +++ b/src/server/game/Entities/Item/Item.cpp @@ -1554,7 +1554,7 @@ Item* Item::CreateItem(uint32 itemEntry, uint32 count, ItemContext context, Play if (count > proto->GetMaxStackSize()) count = proto->GetMaxStackSize(); - ASSERT(count != 0, "proto->Stackable == 0 but checked at loading already"); + ASSERT_NODEBUGINFO(count != 0, "proto->Stackable == 0 but checked at loading already"); Item* item = NewItemOrBag(proto); if (item->Create(sObjectMgr->GetGenerator<HighGuid::Item>().Generate(), itemEntry, context, player)) @@ -2694,6 +2694,16 @@ int32 Item::GetRequiredLevel() const return _bonusData.RequiredLevel; } +std::string Item::GetDebugInfo() const +{ + std::stringstream sstr; + sstr << Object::GetDebugInfo() << "\n" + << std::boolalpha + << "Owner: " << GetOwnerGUID().ToString() << " Count: " << GetCount() + << " BagSlot: " << std::to_string(GetBagSlot()) << " Slot: " << std::to_string(GetSlot()) << " Equipped: " << IsEquipped(); + return sstr.str(); +} + void BonusData::Initialize(ItemTemplate const* proto) { Quality = proto->GetQuality(); diff --git a/src/server/game/Entities/Item/Item.h b/src/server/game/Entities/Item/Item.h index 98877b06b80..b0f05500b06 100644 --- a/src/server/game/Entities/Item/Item.h +++ b/src/server/game/Entities/Item/Item.h @@ -421,6 +421,8 @@ class TC_GAME_API Item : public Object void SetPetitionId(uint32 petitionId) { SetUpdateFieldValue(m_values.ModifyValue(&Item::m_itemData).ModifyValue(&UF::ItemData::Enchantment, 0).ModifyValue(&UF::ItemEnchantment::ID), petitionId); } void SetPetitionNumSignatures(uint32 signatures) { SetUpdateFieldValue(m_values.ModifyValue(&Item::m_itemData).ModifyValue(&UF::ItemData::Enchantment, 0).ModifyValue(&UF::ItemEnchantment::Duration), signatures); } + std::string GetDebugInfo() const override; + UF::UpdateField<UF::ItemData, 0, TYPEID_ITEM> m_itemData; protected: diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index c255ebbfaf4..e05beed9feb 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -52,6 +52,7 @@ #include "World.h" #include "WorldSession.h" #include <G3D/Vector3.h> +#include <sstream> constexpr float VisibilityDistances[AsUnderlyingType(VisibilityDistanceType::Max)] = { @@ -747,6 +748,13 @@ void Object::BuildFieldsUpdate(Player* player, UpdateDataMapType& data_map) cons BuildValuesUpdateBlockForPlayer(&iter->second, iter->first); } +std::string Object::GetDebugInfo() const +{ + std::stringstream sstr; + sstr << GetGUID().ToString() + " Entry " << GetEntry(); + return sstr.str(); +} + void MovementInfo::OutDebug() { TC_LOG_DEBUG("misc", "MOVEMENT INFO"); @@ -3272,6 +3280,15 @@ float WorldObject::GetMapHeight(float x, float y, float z, bool vmap/* = true*/, return GetMap()->GetHeight(GetPhaseShift(), x, y, z, vmap, distanceToSearch); } +std::string WorldObject::GetDebugInfo() const +{ + std::stringstream sstr; + sstr << WorldLocation::GetDebugInfo() << "\n" + << Object::GetDebugInfo() << "\n" + << "Name: " << GetName(); + return sstr.str(); +} + template TC_GAME_API void WorldObject::GetGameObjectListWithEntryInGrid(std::list<GameObject*>&, uint32, float) const; template TC_GAME_API void WorldObject::GetGameObjectListWithEntryInGrid(std::deque<GameObject*>&, uint32, float) const; template TC_GAME_API void WorldObject::GetGameObjectListWithEntryInGrid(std::vector<GameObject*>&, uint32, float) const; diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h index b194f96f8c0..8af47209787 100644 --- a/src/server/game/Entities/Object/Object.h +++ b/src/server/game/Entities/Object/Object.h @@ -229,6 +229,8 @@ class TC_GAME_API Object AddToObjectUpdateIfNeeded(); } + virtual std::string GetDebugInfo() const; + protected: Object(); @@ -666,6 +668,8 @@ class TC_GAME_API WorldObject : public Object, public WorldLocation float GetMapWaterOrGroundLevel(float x, float y, float z, float* ground = nullptr) const; float GetMapHeight(float x, float y, float z, bool vmap = true, float distanceToSearch = 50.0f) const; // DEFAULT_HEIGHT_SEARCH in map.h + std::string GetDebugInfo() const override; + // Event handler EventProcessor m_Events; diff --git a/src/server/game/Entities/Object/Position.cpp b/src/server/game/Entities/Object/Position.cpp index b969a5492a9..7a5b8f47f00 100644 --- a/src/server/game/Entities/Object/Position.cpp +++ b/src/server/game/Entities/Object/Position.cpp @@ -199,3 +199,10 @@ ByteBuffer& operator<<(ByteBuffer& buf, Position::ConstStreamer<Position::Packed buf.appendPackXYZ(streamer.Pos->GetPositionX(), streamer.Pos->GetPositionY(), streamer.Pos->GetPositionZ()); return buf; } + +std::string WorldLocation::GetDebugInfo() const +{ + std::stringstream sstr; + sstr << "MapID: " << m_mapId << " " << Position::ToString(); + return sstr.str(); +} diff --git a/src/server/game/Entities/Object/Position.h b/src/server/game/Entities/Object/Position.h index 0954169e756..ad5dc5a390a 100644 --- a/src/server/game/Entities/Object/Position.h +++ b/src/server/game/Entities/Object/Position.h @@ -186,6 +186,8 @@ public: uint32 GetMapId() const { return m_mapId; } uint32 m_mapId; + + std::string GetDebugInfo() const; }; TC_GAME_API ByteBuffer& operator<<(ByteBuffer& buf, Position::ConstStreamer<Position::XY> const& streamer); diff --git a/src/server/game/Entities/Pet/Pet.cpp b/src/server/game/Entities/Pet/Pet.cpp index 8e1926ab99c..3cfac35c530 100644 --- a/src/server/game/Entities/Pet/Pet.cpp +++ b/src/server/game/Entities/Pet/Pet.cpp @@ -1865,3 +1865,12 @@ std::string Pet::GenerateActionBarData() const return ss.str(); } + +std::string Pet::GetDebugInfo() const +{ + std::stringstream sstr; + sstr << Guardian::GetDebugInfo() << "\n" + << std::boolalpha + << "PetType: " << std::to_string(getPetType()); + return sstr.str(); +} diff --git a/src/server/game/Entities/Pet/Pet.h b/src/server/game/Entities/Pet/Pet.h index 05c937a2b21..047df2581ae 100644 --- a/src/server/game/Entities/Pet/Pet.h +++ b/src/server/game/Entities/Pet/Pet.h @@ -148,6 +148,8 @@ class TC_GAME_API Pet : public Guardian Player* GetOwner() const; + std::string GetDebugInfo() const override; + protected: PetType m_petType; int32 m_duration; // time until unsummon (used mostly for summoned guardians and not used for controlled pets) diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 4a8c17a6b3c..2cf5af44a50 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -28955,3 +28955,10 @@ bool Player::CanEnableWarModeInArea() const return area->Flags[1] & AREA_FLAG_2_CAN_ENABLE_WAR_MODE; } + +std::string Player::GetDebugInfo() const +{ + std::stringstream sstr; + sstr << Unit::GetDebugInfo(); + return sstr.str(); +} diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index df930b20727..a9798329b4e 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -2717,6 +2717,8 @@ class TC_GAME_API Player : public Unit, public GridObject<Player> bool CanEnableWarModeInArea() const; + std::string GetDebugInfo() const override; + UF::UpdateField<UF::PlayerData, 0, TYPEID_PLAYER> m_playerData; UF::UpdateField<UF::ActivePlayerData, 0, TYPEID_ACTIVE_PLAYER> m_activePlayerData; diff --git a/src/server/game/Entities/Transport/Transport.cpp b/src/server/game/Entities/Transport/Transport.cpp index fd0bf28c85c..b0e63770133 100644 --- a/src/server/game/Entities/Transport/Transport.cpp +++ b/src/server/game/Entities/Transport/Transport.cpp @@ -31,6 +31,7 @@ #include "UpdateData.h" #include "Vehicle.h" #include <G3D/Vector3.h> +#include <sstream> Transport::Transport() : GameObject(), _transportInfo(nullptr), _isMoving(true), _pendingStop(false), @@ -773,3 +774,10 @@ void Transport::BuildUpdate(UpdateDataMapType& data_map) ClearUpdateMask(true); } + +std::string Transport::GetDebugInfo() const +{ + std::stringstream sstr; + sstr << GameObject::GetDebugInfo(); + return sstr.str(); +} diff --git a/src/server/game/Entities/Transport/Transport.h b/src/server/game/Entities/Transport/Transport.h index 2a5c2340cf7..a8c8a6ae8ff 100644 --- a/src/server/game/Entities/Transport/Transport.h +++ b/src/server/game/Entities/Transport/Transport.h @@ -100,6 +100,8 @@ class TC_GAME_API Transport : public GameObject, public TransportBase TransportTemplate const* GetTransportTemplate() const { return _transportInfo; } + std::string GetDebugInfo() const override; + private: void MoveToNextWaypoint(); float CalculateSegmentPos(float perc); diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index c6a300bbfb2..24686921572 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -987,7 +987,7 @@ bool Unit::HasBreakableByDamageCrowdControlAura(Unit* excludeCasterChannel) cons { Player* he = duel_wasMounted ? victim->GetCharmer()->ToPlayer() : victim->ToPlayer(); - ASSERT(he && he->duel); + ASSERT_NODEBUGINFO(he && he->duel); if (duel_wasMounted) // In this case victim == mount victim->SetHealth(1); @@ -13227,3 +13227,14 @@ float Unit::GetCollisionHeight() const float const collisionHeight = scaleMod * modelData->CollisionHeight * modelData->ModelScale * displayInfo->CreatureModelScale; return collisionHeight == 0.0f ? DEFAULT_COLLISION_HEIGHT : collisionHeight; } + +std::string Unit::GetDebugInfo() const +{ + std::stringstream sstr; + sstr << WorldObject::GetDebugInfo() << "\n" + << std::boolalpha + << "IsAIEnabled: " << IsAIEnabled() << " DeathState: " << std::to_string(getDeathState()) + << " UnitMovementFlags: " << GetUnitMovementFlags() << " ExtraUnitMovementFlags: " << GetExtraUnitMovementFlags() + << " Class: " << std::to_string(getClass()); + return sstr.str(); +} diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 95c205cadfd..ab1f5896009 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1833,6 +1833,8 @@ class TC_GAME_API Unit : public WorldObject uint16 GetVirtualItemAppearanceMod(uint32 slot) const; void SetVirtualItem(uint32 slot, uint32 itemId, uint16 appearanceModId = 0, uint16 itemVisual = 0); + std::string GetDebugInfo() const override; + UF::UpdateField<UF::UnitData, 0, TYPEID_UNIT> m_unitData; protected: diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index 4415caef224..27e3c0f0a59 100644 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -53,6 +53,7 @@ #include "WeatherMgr.h" #include "World.h" #include "WorldSession.h" +#include <sstream> #include "Hacks/boost_1_74_fibonacci_heap.h" BOOST_1_74_FIBONACCI_HEAP_MSVC_COMPILE_FIX(RespawnListContainer::value_type) @@ -4974,3 +4975,21 @@ void Map::UpdateAreaDependentAuras() } } } + +std::string Map::GetDebugInfo() const +{ + std::stringstream sstr; + sstr << std::boolalpha + << "Id: " << GetId() << " InstanceId: " << GetInstanceId() << " Difficulty: " << std::to_string(GetDifficultyID()) + << " HasPlayers: " << HavePlayers(); + return sstr.str(); +} + +std::string InstanceMap::GetDebugInfo() const +{ + std::stringstream sstr; + sstr << Map::GetDebugInfo() << "\n" + << std::boolalpha + << "ScriptId: " << GetScriptId() << " ScriptName: " << GetScriptName(); + return sstr.str(); +} diff --git a/src/server/game/Maps/Map.h b/src/server/game/Maps/Map.h index cd80657860e..88da98bcdb0 100644 --- a/src/server/game/Maps/Map.h +++ b/src/server/game/Maps/Map.h @@ -577,6 +577,8 @@ class TC_GAME_API Map : public GridRefManager<NGridType> _updateObjects.erase(obj); } + virtual std::string GetDebugInfo() const; + private: void LoadMapAndVMap(int gx, int gy); void LoadVMap(int gx, int gy); @@ -889,6 +891,8 @@ class TC_GAME_API InstanceMap : public Map uint32 GetMaxResetDelay() const; virtual void InitVisibilityDistance() override; + + std::string GetDebugInfo() const override; private: bool m_resetAfterUnload; bool m_unloadWhenEmpty; diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp index b45f3e48c67..ace2c4492e9 100644 --- a/src/server/game/Spells/Auras/SpellAuras.cpp +++ b/src/server/game/Spells/Auras/SpellAuras.cpp @@ -37,6 +37,7 @@ #include "Util.h" #include "Vehicle.h" #include "World.h" +#include <sstream> class ChargeDropEvent : public BasicEvent { @@ -293,8 +294,8 @@ void AuraApplication::ClientUpdate(bool remove) uint32 Aura::BuildEffectMaskForOwner(SpellInfo const* spellProto, uint32 availableEffectMask, WorldObject* owner) { - ASSERT(spellProto); - ASSERT(owner); + ASSERT_NODEBUGINFO(spellProto); + ASSERT_NODEBUGINFO(owner); uint32 effMask = 0; switch (owner->GetTypeId()) { @@ -323,7 +324,7 @@ uint32 Aura::BuildEffectMaskForOwner(SpellInfo const* spellProto, uint32 availab Aura* Aura::TryRefreshStackOrCreate(AuraCreateInfo& createInfo) { - ASSERT(createInfo.Caster || !createInfo.CasterGUID.IsEmpty()); + ASSERT_NODEBUGINFO(createInfo.Caster || !createInfo.CasterGUID.IsEmpty()); if (createInfo.IsRefresh) *createInfo.IsRefresh = false; @@ -421,7 +422,7 @@ Aura* Aura::Create(AuraCreateInfo& createInfo) effMask = createInfo._targetEffectMask; effMask = Aura::BuildEffectMaskForOwner(createInfo._spellInfo, effMask, createInfo._owner); - ASSERT(effMask); + ASSERT_NODEBUGINFO(effMask); Unit* unit = createInfo._owner->ToUnit(); aura->ToUnitAura()->AddStaticApplication(unit, effMask); @@ -429,7 +430,7 @@ Aura* Aura::Create(AuraCreateInfo& createInfo) } case TYPEID_DYNAMICOBJECT: createInfo._auraEffectMask = Aura::BuildEffectMaskForOwner(createInfo._spellInfo, createInfo._auraEffectMask, createInfo._owner); - ASSERT(createInfo._auraEffectMask); + ASSERT_NODEBUGINFO(createInfo._auraEffectMask); aura = new DynObjAura(createInfo); break; @@ -2360,6 +2361,15 @@ void Aura::CallScriptAfterEffectProcHandlers(AuraEffect* aurEff, AuraApplication } } +std::string Aura::GetDebugInfo() const +{ + std::stringstream sstr; + sstr << std::boolalpha + << "Id: " << GetId() << " Caster: " << GetCasterGUID().ToString() + << "\nOwner: " << (GetOwner() ? GetOwner()->GetDebugInfo() : "NULL"); + return sstr.str(); +} + UnitAura::UnitAura(AuraCreateInfo const& createInfo) : Aura(createInfo) { diff --git a/src/server/game/Spells/Auras/SpellAuras.h b/src/server/game/Spells/Auras/SpellAuras.h index 8f843d5ab95..ee0e79b2604 100644 --- a/src/server/game/Spells/Auras/SpellAuras.h +++ b/src/server/game/Spells/Auras/SpellAuras.h @@ -302,6 +302,8 @@ class TC_GAME_API Aura AuraEffectVector const& GetAuraEffects() const { return _effects; } + virtual std::string GetDebugInfo() const; + private: AuraScript* GetScriptByType(std::type_info const& type) const; void _DeleteRemovedApplications(); diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index fb1a81e91eb..cbcf5218f14 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -57,6 +57,7 @@ #include "World.h" #include "WorldSession.h" #include <numeric> +#include <sstream> extern NonDefaultConstructible<SpellEffectHandlerFn> SpellEffectHandlers[TOTAL_SPELL_EFFECTS]; @@ -8189,6 +8190,15 @@ void Spell::CancelGlobalCooldown() m_caster->ToUnit()->GetSpellHistory()->CancelGlobalCooldown(m_spellInfo); } +std::string Spell::GetDebugInfo() const +{ + std::stringstream sstr; + sstr << std::boolalpha + << "Id: " << GetSpellInfo()->Id << " OriginalCaster: " << m_originalCasterGUID.ToString() + << " State: " << getState(); + return sstr.str(); +} + namespace Trinity { diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h index 903930d58cd..981d03f8232 100644 --- a/src/server/game/Spells/Spell.h +++ b/src/server/game/Spells/Spell.h @@ -621,6 +621,8 @@ class TC_GAME_API Spell int64 GetGameObjectTargetCountForEffect(SpellEffIndex effect) const; int64 GetItemTargetCountForEffect(SpellEffIndex effect) const; + std::string GetDebugInfo() const; + protected: bool HasGlobalCooldown() const; void TriggerGlobalCooldown(); |