From e50e3c598b2f83cdc2149ea77e937ccbcb3c80c3 Mon Sep 17 00:00:00 2001 From: Shauren Date: Fri, 20 Mar 2026 09:52:06 +0100 Subject: [PATCH] Core/Objects: Fixed crashes happening when trying to force send dynamic/map/set updatefield changes --- .../Entities/Object/Updates/UpdateField.h | 37 +++++-------------- 1 file changed, 9 insertions(+), 28 deletions(-) diff --git a/src/server/game/Entities/Object/Updates/UpdateField.h b/src/server/game/Entities/Object/Updates/UpdateField.h index c06d6de14c..8fe087fe61 100644 --- a/src/server/game/Entities/Object/Updates/UpdateField.h +++ b/src/server/game/Entities/Object/Updates/UpdateField.h @@ -663,7 +663,7 @@ namespace UF } template - void MarkChanged(DynamicUpdateField(Derived::* field), uint32 index) + void MarkChanged(DynamicUpdateField(Derived::*)) { static_assert(std::is_base_of_v, "Given field argument must belong to the same structure as this HasChangesMask"); @@ -671,13 +671,10 @@ namespace UF _changesMask.Set(BlockBit); _changesMask.Set(Bit); - DynamicUpdateField& uf = (static_cast(this)->*field); - if (index < uf.size()) - uf.MarkChanged(index); } template - void MarkChanged(MapUpdateField(Derived::* field), std::type_identity_t const& key) + void MarkChanged(MapUpdateField(Derived::*)) { static_assert(std::is_base_of_v, "Given field argument must belong to the same structure as this HasChangesMask"); @@ -685,14 +682,10 @@ namespace UF _changesMask.Set(BlockBit); _changesMask.Set(Bit); - MapUpdateField& uf = (static_cast(this)->*field); - auto itr = uf._values.find(key); - if (itr != uf._values.end() && itr->second.state == MapUpdateFieldState::Unchanged) - itr->second.state = MapUpdateFieldState::Changed; } template - void MarkChanged(SetUpdateField(Derived::* field), std::type_identity_t const& key) + void MarkChanged(SetUpdateField(Derived::*)) { static_assert(std::is_base_of_v, "Given field argument must belong to the same structure as this HasChangesMask"); @@ -700,10 +693,6 @@ namespace UF _changesMask.Set(BlockBit); _changesMask.Set(Bit); - SetUpdateField& uf = (static_cast(this)->*field); - auto itr = uf._values.find(key); - if (itr != uf._values.end() && itr->second == MapUpdateFieldState::Unchanged) - itr->second = MapUpdateFieldState::Changed; } template @@ -751,35 +740,27 @@ namespace UF } template - void ClearChanged(DynamicUpdateField(Derived::* field), uint32 index) + void ClearChanged(DynamicUpdateField(Derived::*)) { static_assert(std::is_base_of_v, "Given field argument must belong to the same structure as this HasChangesMask"); - DynamicUpdateField& uf = (static_cast(this)->*field); - if (index < uf.size()) - uf.ClearChanged(index); + _changesMask.Reset(Bit); } template - void ClearChanged(MapUpdateField(Derived::* field), std::type_identity_t const& key) + void ClearChanged(MapUpdateField(Derived::*)) { static_assert(std::is_base_of_v, "Given field argument must belong to the same structure as this HasChangesMask"); - MapUpdateField& uf = (static_cast(this)->*field); - auto itr = uf._values.find(key); - if (itr != uf._values.end() && itr->second.state == MapUpdateFieldState::Changed) - itr->second.state = MapUpdateFieldState::Unchanged; + _changesMask.Reset(Bit); } template - void ClearChanged(SetUpdateField(Derived::* field), std::type_identity_t const& key) + void ClearChanged(SetUpdateField(Derived::*)) { static_assert(std::is_base_of_v, "Given field argument must belong to the same structure as this HasChangesMask"); - SetUpdateField& uf = (static_cast(this)->*field); - auto itr = uf._values.find(key); - if (itr != uf._values.end() && itr->second == MapUpdateFieldState::Changed) - itr->second = MapUpdateFieldState::Unchanged; + _changesMask.Reset(Bit); } template