diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/Object/Object.cpp | 4 | ||||
-rw-r--r-- | src/server/game/Entities/Object/Object.h | 14 |
2 files changed, 10 insertions, 8 deletions
diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index 88870a1ba1c..bbaf33cd2b0 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -1566,7 +1566,7 @@ bool WorldObject::CanDetect(WorldObject const* obj, bool ignoreStealth, bool che bool WorldObject::CanDetectInvisibilityOf(WorldObject const* obj) const { - uint32 mask = obj->m_invisibility.GetFlags() & m_invisibilityDetect.GetFlags(); + uint64 mask = obj->m_invisibility.GetFlags() & m_invisibilityDetect.GetFlags(); // Check for not detected types if (mask != obj->m_invisibility.GetFlags()) @@ -1574,7 +1574,7 @@ bool WorldObject::CanDetectInvisibilityOf(WorldObject const* obj) const for (uint32 i = 0; i < TOTAL_INVISIBILITY_TYPES; ++i) { - if (!(mask & (1 << i))) + if (!(mask & (uint64(1) << i))) continue; int32 objInvisibilityValue = obj->m_invisibility.GetValue(InvisibilityType(i)); diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h index 85a5c829498..0d19519de23 100644 --- a/src/server/game/Entities/Object/Object.h +++ b/src/server/game/Entities/Object/Object.h @@ -409,17 +409,19 @@ template <class T_VALUES, class T_FLAGS, class FLAG_TYPE, size_t ARRAY_SIZE> class FlaggedValuesArray32 { public: + static_assert(sizeof(T_FLAGS) * 8 > ARRAY_SIZE, "Fix T_FLAGS"); + FlaggedValuesArray32() { for (uint32 i = 0; i < ARRAY_SIZE; ++i) m_values[i] = T_VALUES(0); - m_flags = 0; + m_flags = T_FLAGS(0); } T_FLAGS GetFlags() const { return m_flags; } - bool HasFlag(FLAG_TYPE flag) const { return m_flags & (1 << flag); } - void AddFlag(FLAG_TYPE flag) { m_flags |= (1 << flag); } - void DelFlag(FLAG_TYPE flag) { m_flags &= ~(1 << flag); } + bool HasFlag(FLAG_TYPE flag) const { return m_flags & (T_FLAGS(1) << flag); } + void AddFlag(FLAG_TYPE flag) { m_flags |= (T_FLAGS(1) << flag); } + void DelFlag(FLAG_TYPE flag) { m_flags &= ~(T_FLAGS(1) << flag); } T_VALUES GetValue(FLAG_TYPE flag) const { return m_values[flag]; } void SetValue(FLAG_TYPE flag, T_VALUES value) { m_values[flag] = value; } @@ -547,8 +549,8 @@ class TC_GAME_API WorldObject : public Object, public WorldLocation FlaggedValuesArray32<int32, uint32, StealthType, TOTAL_STEALTH_TYPES> m_stealth; FlaggedValuesArray32<int32, uint32, StealthType, TOTAL_STEALTH_TYPES> m_stealthDetect; - FlaggedValuesArray32<int32, uint32, InvisibilityType, TOTAL_INVISIBILITY_TYPES> m_invisibility; - FlaggedValuesArray32<int32, uint32, InvisibilityType, TOTAL_INVISIBILITY_TYPES> m_invisibilityDetect; + FlaggedValuesArray32<int32, uint64, InvisibilityType, TOTAL_INVISIBILITY_TYPES> m_invisibility; + FlaggedValuesArray32<int32, uint64, InvisibilityType, TOTAL_INVISIBILITY_TYPES> m_invisibilityDetect; FlaggedValuesArray32<int32, uint32, ServerSideVisibilityType, TOTAL_SERVERSIDE_VISIBILITY_TYPES> m_serverSideVisibility; FlaggedValuesArray32<int32, uint32, ServerSideVisibilityType, TOTAL_SERVERSIDE_VISIBILITY_TYPES> m_serverSideVisibilityDetect; |