diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 0c6dce0f1..61f1953c8 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -21145,6 +21145,18 @@ void Unit::setRace(uint8 race) m_race = race; } +DisplayRace Unit::GetDisplayRaceFromModelId(uint32 modelId) const +{ + if (CreatureDisplayInfoEntry const* display = sCreatureDisplayInfoStore.LookupEntry(modelId)) + { + if (CreatureDisplayInfoExtraEntry const* displayExtra = sCreatureDisplayInfoExtraStore.LookupEntry(display->ExtendedDisplayInfoID)) + { + return DisplayRace(displayExtra->DisplayRaceID); + } + } + return DisplayRace::None; +} + // Check if unit in combat with specific unit bool Unit::IsInCombatWith(Unit const* who) const { diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index a28cc6396..84d147742 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1438,6 +1438,8 @@ public: [[nodiscard]] uint8 getClass() const { return GetByteValue(UNIT_FIELD_BYTES_0, 1); } [[nodiscard]] uint32 getClassMask() const { return 1 << (getClass() - 1); } [[nodiscard]] uint8 getGender() const { return GetByteValue(UNIT_FIELD_BYTES_0, 2); } + [[nodiscard]] DisplayRace GetDisplayRaceFromModelId(uint32 modelId) const; + [[nodiscard]] DisplayRace GetDisplayRace() const { return GetDisplayRaceFromModelId(GetDisplayId()); }; [[nodiscard]] float GetStat(Stats stat) const { return float(GetUInt32Value(static_cast(UNIT_FIELD_STAT0) + stat)); } void SetStat(Stats stat, int32 val) { SetStatInt32Value(static_cast(UNIT_FIELD_STAT0) + stat, val); } diff --git a/src/server/shared/SharedDefines.h b/src/server/shared/SharedDefines.h index 314f2d6c4..998c56cc0 100644 --- a/src/server/shared/SharedDefines.h +++ b/src/server/shared/SharedDefines.h @@ -105,6 +105,33 @@ enum Races #define RACEMASK_HORDE RACEMASK_ALL_PLAYABLE & ~RACEMASK_ALLIANCE +// DisplayRace values from CreatureDisplayInfoExtra.dbc +enum class DisplayRace : uint8 +{ + None = 0, + Human = 1, + Orc = 2, + Dwarf = 3, + NightElf = 4, + Undead = 5, + Tauren = 6, + Gnome = 7, + Troll = 8, + Goblin = 9, + BloodElf = 10, + Draenei = 11, + FelOrc = 12, + Naga = 13, + Broken = 14, + Skeleton = 15, + Vrykul = 16, + Tuskarr = 17, + ForestTroll = 18, + Taunka = 19, + NorthrendSkeleton = 20, + IceTroll = 21 +}; + // Class value is index in ChrClasses.dbc // EnumUtils: DESCRIBE THIS enum Classes