diff options
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(); |