aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp26
-rw-r--r--src/server/game/Entities/Unit/Unit.h31
2 files changed, 17 insertions, 40 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index 93db566db4e..fe94238f9ed 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -5967,8 +5967,10 @@ void Unit::SetCharm(Unit* charm, bool apply)
{
if (GetTypeId() == TYPEID_PLAYER)
{
- if (!SetCharmedData(charm))
- TC_LOG_FATAL("entities.unit", "Player %s is trying to charm unit %u, but it already has a charmed unit %s", GetName().c_str(), charm->GetEntry(), GetCharmedGUID().ToString().c_str());
+ ASSERT(GetCharmedGUID().IsEmpty(),
+ "Player %s is trying to charm unit %u, but it already has a charmed unit %s", GetName().c_str(), charm->GetEntry(), GetCharmedGUID().ToString().c_str());
+ SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::Charm), charm->GetGUID());
+ m_charmed = charm;
charm->m_ControlledByPlayer = true;
/// @todo maybe we can use this flag to check if controlled by player
@@ -5980,8 +5982,10 @@ void Unit::SetCharm(Unit* charm, bool apply)
// PvP, FFAPvP
charm->SetPvpFlags(GetPvpFlags());
- if (!charm->SetCharmerData(this))
- TC_LOG_FATAL("entities.unit", "Unit %u is being charmed, but it already has a charmer %s", charm->GetEntry(), charm->GetCharmerGUID().ToString().c_str());
+ ASSERT(charm->GetCharmerGUID().IsEmpty(),
+ "Unit %u is being charmed, but it already has a charmer %s", charm->GetEntry(), charm->GetCharmerGUID().ToString().c_str());
+ charm->SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::CharmedBy), GetGUID());
+ charm->m_charmer = this;
_isWalkingBeforeCharm = charm->IsWalking();
if (_isWalkingBeforeCharm)
@@ -5995,12 +5999,16 @@ void Unit::SetCharm(Unit* charm, bool apply)
if (GetTypeId() == TYPEID_PLAYER)
{
- if (!ClearCharmedData(charm))
- TC_LOG_FATAL("entities.unit", "Player %s is trying to uncharm unit %u, but it has another charmed unit %s", GetName().c_str(), charm->GetEntry(), GetCharmedGUID().ToString().c_str());
+ ASSERT(GetCharmedGUID() == charm->GetGUID(),
+ "Player %s is trying to uncharm unit %u, but it has another charmed unit %s", GetName().c_str(), charm->GetEntry(), GetCharmedGUID().ToString().c_str());
+ SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::Charm), ObjectGuid::Empty);
+ m_charmed = nullptr;
}
- if (!charm->ClearCharmerData(this))
- TC_LOG_FATAL("entities.unit", "Unit %u is being uncharmed, but it has another charmer %s", charm->GetEntry(), charm->GetCharmerGUID().ToString().c_str());
+ ASSERT(charm->GetCharmerGUID() == GetGUID(),
+ "Unit %u is being uncharmed, but it has another charmer %s", charm->GetEntry(), charm->GetCharmerGUID().ToString().c_str());
+ charm->SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::CharmedBy), ObjectGuid::Empty);
+ charm->m_charmer = nullptr;
if (charm->GetTypeId() == TYPEID_PLAYER)
{
@@ -9126,7 +9134,7 @@ void Unit::RemoveFromWorld()
if (IsCharmed())
RemoveCharmedBy(nullptr);
-
+
ASSERT(!GetCharmedGUID(), "Unit %u has charmed guid when removed from world", GetEntry());
ASSERT(!GetCharmerGUID(), "Unit %u has charmer guid when removed from world", GetEntry());
diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h
index e93563bcd25..3035bc2fa2b 100644
--- a/src/server/game/Entities/Unit/Unit.h
+++ b/src/server/game/Entities/Unit/Unit.h
@@ -1242,40 +1242,9 @@ class TC_GAME_API Unit : public WorldObject
ObjectGuid GetDemonCreatorGUID() const { return m_unitData->DemonCreator; }
void SetDemonCreatorGUID(ObjectGuid guid) { SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::DemonCreator), guid); }
- bool SetCharmerData(Unit const* unit)
- {
- if (!GetCharmerGUID().IsEmpty())
- return false;
- SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::CharmedBy), unit->GetGUID());
- m_charmer = const_cast<Unit*>(unit);
- return true;
- }
- bool ClearCharmerData(Unit const* verify)
- {
- if (GetCharmerGUID() != verify->GetGUID())
- return false;
- SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::CharmedBy), ObjectGuid::Empty);
- m_charmer = nullptr;
- return true;
- }
ObjectGuid GetCharmerGUID() const { return m_unitData->CharmedBy; }
Unit* GetCharmer() const { return m_charmer; }
- bool SetCharmedData(Unit const* unit)
- {
- if (!GetCharmedGUID().IsEmpty())
- return false;
- m_charmed = const_cast<Unit*>(unit);
- return true;
- }
- bool ClearCharmedData(Unit const* verify)
- {
- if (GetCharmedGUID() != verify->GetGUID())
- return false;
- SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::Charm), ObjectGuid::Empty);
- m_charmed = nullptr;
- return true;
- }
ObjectGuid GetCharmedGUID() const { return m_unitData->Charm; }
Unit* GetCharmed() const { return m_charmed; }