aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGiacomo Pozzoni <giacomopoz@gmail.com>2018-12-14 22:01:16 +0100
committerGitHub <noreply@github.com>2018-12-14 22:01:16 +0100
commit9a924fb9d557434c5a2e4020c80db6e6bfe466ad (patch)
treed163f80c072edb24dffb1bf81adc5267026723e5 /src
parent3acba6dded14afdf84f2ab51ca3b6cec92bdb092 (diff)
Core/Misc: Log more information in asserts (#22783)
* Core/Misc: Log more information in asserts Add a new function GetDebugInfos() to types that could trigger an ASSERT() to easily include more useful information in crashlogs. This is an initial commit that requires many more commits to implement the new GetDebugInfos() function in all required types. If the type doesn't have the function, the global default one is picked which doesn't log anything. * Core/Misc: Fix dynamic build Add missing attribute for dynamic build * Core/Misc: Fix gcc/clang build * Core/Misc: Rename GetDebugInfos() to GetDebugInfo() * Core/Misc: Fix FormatAssertionMessage() adding an extra '\0' * Core/Misc: Add GetDebugInfo support to Unit * Core/Misc: Add GetDebugInfo support to Creature * Core/Misc: Add more info to GetDebugInfo for Creature * Core/Misc: Add GetDebugInfo support to GameObject * Core/Misc: Add GetDebugInfo support to Player * Core/Misc: Add more GetDebugInfo info * Core/Misc: Add GetDebugInfo support to Item * Core/Misc: Add GetDebugInfo support to Bag * Core/Misc: Add GetDebugInfo support to Transport * Core/Misc: Add GetDebugInfo support to TempSummon, Minion, Guardian, Pet * Core/Misc: Add GetDebugInfo support to Map, InstanceMap * Core/Misc: Add GetDebugInfo support to Spell * Core/Misc: Fix build warning * Core/Misc: Add GetDebugInfo support to Aura * Core/Misc: Add GetDebugInfo support to UnitAI
Diffstat (limited to 'src')
-rw-r--r--src/common/Debugging/Errors.cpp17
-rw-r--r--src/common/Debugging/Errors.h12
-rw-r--r--src/server/game/AI/CoreAI/UnitAI.cpp8
-rw-r--r--src/server/game/AI/CoreAI/UnitAI.h2
-rw-r--r--src/server/game/Entities/Creature/Creature.cpp9
-rw-r--r--src/server/game/Entities/Creature/Creature.h2
-rw-r--r--src/server/game/Entities/Creature/TemporarySummon.cpp25
-rw-r--r--src/server/game/Entities/Creature/TemporarySummon.h7
-rw-r--r--src/server/game/Entities/GameObject/GameObject.cpp8
-rw-r--r--src/server/game/Entities/GameObject/GameObject.h2
-rw-r--r--src/server/game/Entities/Item/Container/Bag.cpp7
-rw-r--r--src/server/game/Entities/Item/Container/Bag.h6
-rw-r--r--src/server/game/Entities/Item/Item.cpp12
-rw-r--r--src/server/game/Entities/Item/Item.h2
-rw-r--r--src/server/game/Entities/Object/Object.cpp16
-rw-r--r--src/server/game/Entities/Object/Object.h4
-rw-r--r--src/server/game/Entities/Object/Position.cpp7
-rw-r--r--src/server/game/Entities/Object/Position.h2
-rw-r--r--src/server/game/Entities/Pet/Pet.cpp9
-rw-r--r--src/server/game/Entities/Pet/Pet.h2
-rw-r--r--src/server/game/Entities/Player/Player.cpp7
-rw-r--r--src/server/game/Entities/Player/Player.h3
-rw-r--r--src/server/game/Entities/Transport/Transport.cpp7
-rw-r--r--src/server/game/Entities/Transport/Transport.h2
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp13
-rw-r--r--src/server/game/Entities/Unit/Unit.h2
-rw-r--r--src/server/game/Maps/Map.cpp18
-rw-r--r--src/server/game/Maps/Map.h4
-rw-r--r--src/server/game/Spells/Auras/SpellAuras.cpp19
-rw-r--r--src/server/game/Spells/Auras/SpellAuras.h2
-rw-r--r--src/server/game/Spells/Spell.cpp9
-rw-r--r--src/server/game/Spells/Spell.h2
32 files changed, 226 insertions, 21 deletions
diff --git a/src/common/Debugging/Errors.cpp b/src/common/Debugging/Errors.cpp
index fd46575c237..fc4ecb5f2c8 100644
--- a/src/common/Debugging/Errors.cpp
+++ b/src/common/Debugging/Errors.cpp
@@ -59,8 +59,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;
}
@@ -69,20 +69,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());
@@ -138,3 +138,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 202efa9c370..799012ab453 100644
--- a/src/common/Debugging/Errors.h
+++ b/src/common/Debugging/Errors.h
@@ -20,11 +20,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);
@@ -38,6 +39,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))
@@ -50,7 +53,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
@@ -58,8 +62,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 01c7dd6997f..9386122d552 100644
--- a/src/server/game/AI/CoreAI/UnitAI.cpp
+++ b/src/server/game/AI/CoreAI/UnitAI.cpp
@@ -250,6 +250,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 ? unit->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 a15a15fe199..b736e3835a5 100644
--- a/src/server/game/AI/CoreAI/UnitAI.h
+++ b/src/server/game/AI/CoreAI/UnitAI.h
@@ -327,6 +327,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 88f434d0cd2..cf0cb59a91a 100644
--- a/src/server/game/Entities/Creature/Creature.cpp
+++ b/src/server/game/Entities/Creature/Creature.cpp
@@ -3217,3 +3217,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 b3c04f1fed1..05e2e32c6ef 100644
--- a/src/server/game/Entities/Creature/Creature.h
+++ b/src/server/game/Entities/Creature/Creature.h
@@ -361,6 +361,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 ae215d7e2c4..fed8100aa53 100644
--- a/src/server/game/Entities/Creature/TemporarySummon.cpp
+++ b/src/server/game/Entities/Creature/TemporarySummon.cpp
@@ -271,6 +271,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)
{
@@ -327,6 +336,15 @@ bool Minion::IsGuardianPet() const
return IsPet() || (m_Properties && m_Properties->Category == 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)
{
@@ -363,6 +381,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 55b62610426..e2e385ba73a 100644
--- a/src/server/game/Entities/Creature/TemporarySummon.h
+++ b/src/server/game/Entities/Creature/TemporarySummon.h
@@ -49,10 +49,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;
@@ -79,6 +81,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;
@@ -104,6 +108,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 188a8935d8f..50b67e73a43 100644
--- a/src/server/game/Entities/GameObject/GameObject.cpp
+++ b/src/server/game/Entities/GameObject/GameObject.cpp
@@ -2565,3 +2565,11 @@ GameObjectModel* GameObject::CreateModel()
{
return GameObjectModel::Create(Trinity::make_unique<GameObjectModelOwnerImpl>(this), sWorld->GetDataPath());
}
+
+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 4d28a4b362c..18323ef222b 100644
--- a/src/server/game/Entities/GameObject/GameObject.h
+++ b/src/server/game/Entities/GameObject/GameObject.h
@@ -285,6 +285,8 @@ class TC_GAME_API GameObject : public WorldObject, public GridObject<GameObject>
void AIM_Destroy();
bool AIM_Initialize();
+ std::string GetDebugInfo() const override;
+
protected:
GameObjectModel* CreateModel();
void UpdateModel(); // updates model in case displayId were changed
diff --git a/src/server/game/Entities/Item/Container/Bag.cpp b/src/server/game/Entities/Item/Container/Bag.cpp
index 0d5311a4064..9fea39eed2d 100644
--- a/src/server/game/Entities/Item/Container/Bag.cpp
+++ b/src/server/game/Entities/Item/Container/Bag.cpp
@@ -245,3 +245,10 @@ Item* Bag::GetItemByPos(uint8 slot) const
return nullptr;
}
+
+std::string Bag::GetDebugInfo() const
+{
+ std::stringstream sstr;
+ sstr << Item::GetDebugInfo();
+ return sstr.str();
+}
diff --git a/src/server/game/Entities/Item/Container/Bag.h b/src/server/game/Entities/Item/Container/Bag.h
index f7b3edaee3b..15dcbfe5521 100644
--- a/src/server/game/Entities/Item/Container/Bag.h
+++ b/src/server/game/Entities/Item/Container/Bag.h
@@ -27,16 +27,14 @@
class TC_GAME_API Bag : public Item
{
public:
-
Bag();
~Bag();
void AddToWorld() override;
void RemoveFromWorld() override;
- bool Create(ObjectGuid::LowType guidlow, ObjectGuid::LowType itemid, Player const* owner) override;
+ bool Create(ObjectGuid::LowType guidlow, uint32 itemid, Player const* owner) override;
- void Clear();
void StoreItem(uint8 slot, Item* pItem, bool update);
void RemoveItem(uint8 slot, bool update);
@@ -59,6 +57,8 @@ class TC_GAME_API Bag : public Item
void BuildCreateUpdateBlockForPlayer(UpdateData* data, Player* target) const override;
+ std::string GetDebugInfo() const override;
+
protected:
// Bag Storage space
diff --git a/src/server/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp
index c5091a35cab..f5cac785acc 100644
--- a/src/server/game/Entities/Item/Item.cpp
+++ b/src/server/game/Entities/Item/Item.cpp
@@ -992,7 +992,7 @@ Item* Item::CreateItem(uint32 itemEntry, uint32 count, Player const* player /*=
if (count > proto->GetMaxStackSize())
count = proto->GetMaxStackSize();
- ASSERT(count != 0 && "pProto->Stackable == 0 but checked at loading already");
+ ASSERT_NODEBUGINFO(count != 0 && "pProto->Stackable == 0 but checked at loading already");
Item* item = NewItemOrBag(proto);
if (item->Create(sObjectMgr->GetGenerator<HighGuid::Item>().Generate(), itemEntry, player))
@@ -1197,3 +1197,13 @@ void Item::SetCount(uint32 value)
}
}
}
+
+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();
+}
diff --git a/src/server/game/Entities/Item/Item.h b/src/server/game/Entities/Item/Item.h
index ccdd04d40ec..7ee26ee9eba 100644
--- a/src/server/game/Entities/Item/Item.h
+++ b/src/server/game/Entities/Item/Item.h
@@ -202,6 +202,8 @@ class TC_GAME_API Item : public Object
void RemoveFromObjectUpdate() override;
uint32 GetScriptId() const { return GetTemplate()->ScriptId; }
+
+ std::string GetDebugInfo() const override;
private:
std::string m_text;
uint8 m_slot;
diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp
index 1bc6a777097..a9a9c78c0bb 100644
--- a/src/server/game/Entities/Object/Object.cpp
+++ b/src/server/game/Entities/Object/Object.cpp
@@ -939,6 +939,13 @@ bool Object::PrintIndexError(uint32 index, bool set) const
return false;
}
+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");
@@ -3473,6 +3480,15 @@ float WorldObject::GetMapHeight(float x, float y, float z, bool vmap/* = true*/,
return GetMap()->GetHeight(GetPhaseMask(), 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 e19602f97ff..76824c2719e 100644
--- a/src/server/game/Entities/Object/Object.h
+++ b/src/server/game/Entities/Object/Object.h
@@ -173,6 +173,8 @@ class TC_GAME_API Object
DynamicObject* ToDynObject() { if (GetTypeId() == TYPEID_DYNAMICOBJECT) return reinterpret_cast<DynamicObject*>(this); else return nullptr; }
DynamicObject const* ToDynObject() const { if (GetTypeId() == TYPEID_DYNAMICOBJECT) return reinterpret_cast<DynamicObject const*>(this); else return nullptr; }
+ virtual std::string GetDebugInfo() const;
+
protected:
Object();
@@ -508,6 +510,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 57ebeebfbf1..9cdf7da54fe 100644
--- a/src/server/game/Entities/Object/Position.cpp
+++ b/src/server/game/Entities/Object/Position.cpp
@@ -218,3 +218,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 a0303410206..6dc76698032 100644
--- a/src/server/game/Entities/Object/Position.h
+++ b/src/server/game/Entities/Object/Position.h
@@ -193,6 +193,8 @@ class WorldLocation : public Position
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 bd0ec1affae..06838cbc9cb 100644
--- a/src/server/game/Entities/Pet/Pet.cpp
+++ b/src/server/game/Entities/Pet/Pet.cpp
@@ -1977,3 +1977,12 @@ std::string Pet::GenerateActionBarData() const
return oss.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 1d758452b86..b5c2dcf2d91 100644
--- a/src/server/game/Entities/Pet/Pet.h
+++ b/src/server/game/Entities/Pet/Pet.h
@@ -147,6 +147,8 @@ class TC_GAME_API Pet : public Guardian
Player* GetOwner() const;
+ std::string GetDebugInfo() const override;
+
protected:
uint32 m_happinessTimer;
PetType m_petType;
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 9d398ad1d0f..7de2017eb4b 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -26617,3 +26617,10 @@ void Player::RemoveSocial()
sSocialMgr->RemovePlayerSocial(GetGUID());
m_social = nullptr;
}
+
+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 98f952bc0e3..3577eea21e4 100644
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -1940,7 +1940,6 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
void UpdateSpeakTime();
bool CanSpeak() const;
- void ChangeSpeakTime(int utime);
/*********************************************************/
/*** VARIOUS SYSTEMS ***/
@@ -2152,6 +2151,8 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
std::string GetMapAreaAndZoneString() const;
std::string GetCoordsMapAreaAndZoneString() const;
+ std::string GetDebugInfo() const override;
+
protected:
// Gamemaster whisper whitelist
GuidList WhisperList;
diff --git a/src/server/game/Entities/Transport/Transport.cpp b/src/server/game/Entities/Transport/Transport.cpp
index 52ef320b886..1f6ee40b587 100644
--- a/src/server/game/Entities/Transport/Transport.cpp
+++ b/src/server/game/Entities/Transport/Transport.cpp
@@ -767,3 +767,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 6faa61ed723..39eb34f1b37 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 3326a734577..54a15dd384c 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -888,7 +888,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);
@@ -13458,3 +13458,14 @@ float Unit::GetCollisionHeight() const
float const collisionHeight = scaleMod * modelData->CollisionHeight * modelData->Scale * displayInfo->scale;
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 67b9b886b49..17a4099f9a0 100644
--- a/src/server/game/Entities/Unit/Unit.h
+++ b/src/server/game/Entities/Unit/Unit.h
@@ -1676,6 +1676,8 @@ class TC_GAME_API Unit : public WorldObject
virtual void Whisper(uint32 textId, Player* target, bool isBossWhisper = false);
float GetCollisionHeight() const override;
+
+ std::string GetDebugInfo() const override;
protected:
explicit Unit (bool isWorldObject);
diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp
index 921f982b5a5..46e2479e5d7 100644
--- a/src/server/game/Maps/Map.cpp
+++ b/src/server/game/Maps/Map.cpp
@@ -4660,3 +4660,21 @@ void Map::UpdateAreaDependentAuras()
}
}
}
+
+std::string Map::GetDebugInfo() const
+{
+ std::stringstream sstr;
+ sstr << std::boolalpha
+ << "Id: " << GetId() << " InstanceId: " << GetInstanceId() << " Difficulty: " << std::to_string(GetDifficulty())
+ << " 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 f6fdc2af2e6..ceff28fc9b8 100644
--- a/src/server/game/Maps/Map.h
+++ b/src/server/game/Maps/Map.h
@@ -624,6 +624,8 @@ class TC_GAME_API Map : public GridRefManager<NGridType>
_updateObjects.erase(obj);
}
+ virtual std::string GetDebugInfo() const;
+
private:
void LoadMapAndVMap(int gx, int gy);
@@ -917,6 +919,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 249af19cbcf..e004a05db76 100644
--- a/src/server/game/Spells/Auras/SpellAuras.cpp
+++ b/src/server/game/Spells/Auras/SpellAuras.cpp
@@ -265,8 +265,8 @@ void AuraApplication::ClientUpdate(bool remove)
uint8 Aura::BuildEffectMaskForOwner(SpellInfo const* spellProto, uint8 availableEffectMask, WorldObject* owner)
{
- ASSERT(spellProto);
- ASSERT(owner);
+ ASSERT_NODEBUGINFO(spellProto);
+ ASSERT_NODEBUGINFO(owner);
uint8 effMask = 0;
switch (owner->GetTypeId())
{
@@ -295,7 +295,7 @@ uint8 Aura::BuildEffectMaskForOwner(SpellInfo const* spellProto, uint8 available
Aura* Aura::TryRefreshStackOrCreate(AuraCreateInfo& createInfo)
{
- ASSERT(createInfo.Caster || createInfo.CasterGUID);
+ ASSERT_NODEBUGINFO(createInfo.Caster || createInfo.CasterGUID);
if (createInfo.IsRefresh)
*createInfo.IsRefresh = false;
@@ -393,7 +393,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);
@@ -401,7 +401,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;
@@ -2573,6 +2573,15 @@ void Aura::CallScriptAfterEffectProcHandlers(AuraEffect const* aurEff, AuraAppli
}
}
+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 10e8765c65f..b790e35fcb4 100644
--- a/src/server/game/Spells/Auras/SpellAuras.h
+++ b/src/server/game/Spells/Auras/SpellAuras.h
@@ -266,6 +266,8 @@ class TC_GAME_API Aura
std::vector<AuraScript*> m_loadedScripts;
+ virtual std::string GetDebugInfo() const;
+
private:
AuraScript* GetScriptByName(std::string const& scriptName) const;
void _DeleteRemovedApplications();
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp
index 62cbb663891..8c19863a5db 100644
--- a/src/server/game/Spells/Spell.cpp
+++ b/src/server/game/Spells/Spell.cpp
@@ -7994,6 +7994,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 691bddf43f7..8b94b176eff 100644
--- a/src/server/game/Spells/Spell.h
+++ b/src/server/game/Spells/Spell.h
@@ -558,6 +558,8 @@ class TC_GAME_API Spell
Spell** m_selfContainer; // pointer to our spell container (if applicable)
+ std::string GetDebugInfo() const;
+
protected:
bool HasGlobalCooldown() const;
void TriggerGlobalCooldown();