aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGosha <284210+Lordron@users.noreply.github.com>2022-10-07 17:08:20 +0300
committerGitHub <noreply@github.com>2022-10-07 16:08:20 +0200
commit423f81fbdaad9bedf936b313a97afe0be53b6ae0 (patch)
tree11ff00f33576d6364a18806017d3432e5c7296db /src
parent8c3c07cdf4dfa8515aa756e669c2d216648870e8 (diff)
Core/Objects: Fix flags overflow for InvisibilityType because TOTAL_INVISIBILITY_TYPES (38) can't fit in 32 bits flag (#28343)
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Object/Object.cpp4
-rw-r--r--src/server/game/Entities/Object/Object.h14
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;