diff options
author | Treeston <treeston.mmoc@gmail.com> | 2018-08-25 00:27:37 +0200 |
---|---|---|
committer | Treeston <treeston.mmoc@gmail.com> | 2018-08-25 00:44:33 +0200 |
commit | d4ef2529e91043bc719c3238714413fd21c9005c (patch) | |
tree | 08385d090a0ece4bd08fb5062be912cca63b7cc4 /src | |
parent | cdf4040f4fce4f1e5ebb33525c4618845605081c (diff) |
Core/Unit: Store charmer and charmed pointers on Unit directly, no more map lookups for Unit::GetCharmer and Unit::GetCharmed
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/DungeonFinding/LFGMgr.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Entities/Creature/TemporarySummon.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 10 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 76 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.h | 43 | ||||
-rw-r--r-- | src/server/game/Handlers/PetHandler.cpp | 10 | ||||
-rw-r--r-- | src/server/game/Handlers/SpellHandler.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Handlers/VehicleHandler.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Spells/Spell.cpp | 8 | ||||
-rw-r--r-- | src/server/scripts/Spells/spell_hunter.cpp | 2 |
10 files changed, 82 insertions, 75 deletions
diff --git a/src/server/game/DungeonFinding/LFGMgr.cpp b/src/server/game/DungeonFinding/LFGMgr.cpp index 5aca850f4d1..37fd98570e4 100644 --- a/src/server/game/DungeonFinding/LFGMgr.cpp +++ b/src/server/game/DungeonFinding/LFGMgr.cpp @@ -1324,7 +1324,7 @@ void LFGMgr::TeleportPlayer(Player* player, bool out, bool fromOpcode /*= false* error = LFG_TELEPORTERROR_FATIGUE; else if (player->GetVehicle()) error = LFG_TELEPORTERROR_IN_VEHICLE; - else if (player->GetCharmGUID()) + else if (player->GetCharmedGUID()) error = LFG_TELEPORTERROR_CHARMING; else if (player->HasAura(9454)) // check Freeze debuff error = LFG_TELEPORTERROR_INVALID_LOCATION; diff --git a/src/server/game/Entities/Creature/TemporarySummon.cpp b/src/server/game/Entities/Creature/TemporarySummon.cpp index 0f92d0e29aa..3bdb5e68271 100644 --- a/src/server/game/Entities/Creature/TemporarySummon.cpp +++ b/src/server/game/Entities/Creature/TemporarySummon.cpp @@ -335,7 +335,7 @@ void Guardian::InitSummon() if (GetOwner()->GetTypeId() == TYPEID_PLAYER && GetOwner()->GetMinionGUID() == GetGUID() - && !GetOwner()->GetCharmGUID()) + && !GetOwner()->GetCharmedGUID()) { GetOwner()->ToPlayer()->CharmSpellInitialize(); } diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 14492cb203b..381e0c29618 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -20544,7 +20544,7 @@ void Player::StopCastingCharm() return; } - Unit* charm = GetCharm(); + Unit* charm = GetCharmed(); if (!charm) return; @@ -20555,12 +20555,12 @@ void Player::StopCastingCharm() else if (charm->IsVehicle()) ExitVehicle(); } - if (GetCharmGUID()) + if (GetCharmedGUID()) charm->RemoveCharmAuras(); - if (GetCharmGUID()) + if (GetCharmedGUID()) { - TC_LOG_FATAL("entities.player", "Player::StopCastingCharm: Player '%s' (%s) is not able to uncharm unit (%s)", GetName().c_str(), GetGUID().ToString().c_str(), GetCharmGUID().ToString().c_str()); + TC_LOG_FATAL("entities.player", "Player::StopCastingCharm: Player '%s' (%s) is not able to uncharm unit (%s)", GetName().c_str(), GetGUID().ToString().c_str(), GetCharmedGUID().ToString().c_str()); if (!charm->GetCharmerGUID().IsEmpty()) { TC_LOG_FATAL("entities.player", "Player::StopCastingCharm: Charmed unit has charmer %s", charm->GetCharmerGUID().ToString().c_str()); @@ -20745,7 +20745,7 @@ void Player::PetSpellInitialize() void Player::PossessSpellInitialize() { - Unit* charm = GetCharm(); + Unit* charm = GetCharmed(); if (!charm) return; diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index b91796f9b8a..08eb02c427e 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -291,6 +291,7 @@ Unit::Unit(bool isWorldObject) : WorldObject(isWorldObject), m_playerMovingMe(nullptr), m_lastSanctuaryTime(0), LastCharmerGUID(), m_ControlledByPlayer(false), movespline(new Movement::MoveSpline()), m_AutoRepeatFirstCast(false), m_procDeep(0), m_removedAurasCount(0), + m_charmer(nullptr), m_charmed(nullptr), i_motionMaster(new MotionMaster(this)), m_regenTimer(0), m_vehicle(nullptr), m_vehicleKit(nullptr), m_unitTypeMask(UNIT_MASK_NONE), m_Diminishing(), m_combatManager(this), m_threatManager(this), m_comboTarget(nullptr), m_comboPoints(0), m_spellHistory(new SpellHistory(this)) @@ -5791,14 +5792,6 @@ Player* Unit::GetControllingPlayer() const return const_cast<Player*>(ToPlayer()); } -Unit* Unit::GetCharmer() const -{ - if (ObjectGuid charmerGUID = GetCharmerGUID()) - return ObjectAccessor::GetUnit(*this, charmerGUID); - - return nullptr; -} - Minion* Unit::GetFirstMinion() const { if (ObjectGuid pet_guid = GetMinionGUID()) @@ -5829,25 +5822,6 @@ Guardian* Unit::GetGuardianPet() const return nullptr; } -Unit* Unit::GetCharm() const -{ - if (ObjectGuid charm_guid = GetCharmGUID()) - { - if (Unit* pet = ObjectAccessor::GetUnit(*this, charm_guid)) - return pet; - - TC_LOG_ERROR("entities.unit", "Unit::GetCharm: Charmed creature %s not exist.", charm_guid.ToString().c_str()); - const_cast<Unit*>(this)->SetGuidValue(UNIT_FIELD_CHARM, ObjectGuid::Empty); - } - - return nullptr; -} - -Unit* Unit::GetCharmerOrOwner() const -{ - return GetCharmerGUID() ? GetCharmer() : GetOwner(); -} - void Unit::SetMinion(Minion *minion, bool apply) { TC_LOG_DEBUG("entities.unit", "SetMinion %u for %u, apply %u", minion->GetEntry(), GetEntry(), apply); @@ -5961,7 +5935,7 @@ void Unit::SetMinion(Minion *minion, bool apply) for (ControlList::iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr) { // do not use this check, creature do not have charm guid - //if (GetCharmGUID() == (*itr)->GetGUID()) + //if (GetCharmedGUID() == (*itr)->GetGUID()) if (GetGUID() == (*itr)->GetCharmerGUID()) continue; @@ -5980,7 +5954,7 @@ void Unit::SetMinion(Minion *minion, bool apply) if (AddGuidValue(UNIT_FIELD_SUMMON, (*itr)->GetGUID())) { // show another pet bar if there is no charm bar - if (GetTypeId() == TYPEID_PLAYER && !GetCharmGUID()) + if (GetTypeId() == TYPEID_PLAYER && !GetCharmedGUID()) { if ((*itr)->IsPet()) ToPlayer()->PetSpellInitialize(); @@ -6027,8 +6001,8 @@ void Unit::SetCharm(Unit* charm, bool apply) { if (GetTypeId() == TYPEID_PLAYER) { - if (!AddGuidValue(UNIT_FIELD_CHARM, charm->GetGUID())) - 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(), GetCharmGUID().ToString().c_str()); + 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()); charm->m_ControlledByPlayer = true; /// @todo maybe we can use this flag to check if controlled by player @@ -6040,7 +6014,7 @@ void Unit::SetCharm(Unit* charm, bool apply) // PvP, FFAPvP charm->SetByteValue(UNIT_FIELD_BYTES_2, UNIT_BYTES_2_OFFSET_PVP_FLAG, GetByteValue(UNIT_FIELD_BYTES_2, UNIT_BYTES_2_OFFSET_PVP_FLAG)); - if (!charm->AddGuidValue(UNIT_FIELD_CHARMEDBY, GetGUID())) + 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()); _isWalkingBeforeCharm = charm->IsWalking(); @@ -6058,11 +6032,11 @@ void Unit::SetCharm(Unit* charm, bool apply) if (GetTypeId() == TYPEID_PLAYER) { - if (!RemoveGuidValue(UNIT_FIELD_CHARM, charm->GetGUID())) - 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(), GetCharmGUID().ToString().c_str()); + 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()); } - if (!charm->RemoveGuidValue(UNIT_FIELD_CHARMEDBY, GetGUID())) + 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()); if (charm->GetTypeId() == TYPEID_PLAYER) @@ -6178,7 +6152,7 @@ Unit* Unit::GetMeleeHitRedirectTarget(Unit* victim, SpellInfo const* spellInfo) Unit* Unit::GetFirstControlled() const { // Sequence: charmed, pet, other guardians - Unit* unit = GetCharm(); + Unit* unit = GetCharmed(); if (!unit) if (ObjectGuid guid = GetMinionGUID()) unit = ObjectAccessor::GetUnit(*this, guid); @@ -6207,8 +6181,8 @@ void Unit::RemoveAllControlled() TC_LOG_FATAL("entities.unit", "Unit %u is not able to release its pet %s", GetEntry(), GetPetGUID().ToString().c_str()); if (GetMinionGUID()) TC_LOG_FATAL("entities.unit", "Unit %u is not able to release its minion %s", GetEntry(), GetMinionGUID().ToString().c_str()); - if (GetCharmGUID()) - TC_LOG_FATAL("entities.unit", "Unit %u is not able to release its charm %s", GetEntry(), GetCharmGUID().ToString().c_str()); + if (GetCharmedGUID()) + TC_LOG_FATAL("entities.unit", "Unit %u is not able to release its charm %s", GetEntry(), GetCharmedGUID().ToString().c_str()); if (!IsPet()) // pets don't use the flag for this RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PET_IN_COMBAT); // m_controlled is now empty, so we know none of our minions are in combat } @@ -6220,12 +6194,12 @@ bool Unit::isPossessedByPlayer() const bool Unit::isPossessing(Unit* u) const { - return u->isPossessed() && GetCharmGUID() == u->GetGUID(); + return u->isPossessed() && GetCharmedGUID() == u->GetGUID(); } bool Unit::isPossessing() const { - if (Unit* u = GetCharm()) + if (Unit* u = GetCharmed()) return u->isPossessed(); else return false; @@ -8087,7 +8061,7 @@ void Unit::Mount(uint32 mount, uint32 VehicleId, uint32 creatureEntry) } // if we have charmed npc, stun him also (everywhere) - if (Unit* charm = player->GetCharm()) + if (Unit* charm = player->GetCharmed()) if (charm->GetTypeId() == TYPEID_UNIT) charm->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED); @@ -8150,7 +8124,7 @@ void Unit::Dismount() player->ResummonPetTemporaryUnSummonedIfAny(); // if we have charmed npc, remove stun also - if (Unit* charm = player->GetCharm()) + if (Unit* charm = player->GetCharmed()) if (charm->GetTypeId() == TYPEID_UNIT && charm->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED) && !charm->HasUnitState(UNIT_STATE_STUNNED)) charm->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED); } @@ -9494,12 +9468,9 @@ void Unit::RemoveFromWorld() if (IsCharmed()) RemoveCharmedBy(nullptr); - - if (GetCharmerGUID()) - { - TC_LOG_FATAL("entities.unit", "Unit %u has charmer guid when removed from world", GetEntry()); - ABORT(); - } + + ASSERT(!GetCharmedGUID(), "Unit %u has charmed guid when removed from world", GetEntry()); + ASSERT(!GetCharmerGUID(), "Unit %u has charmer guid when removed from world", GetEntry()); if (Unit* owner = GetOwner()) { @@ -11575,7 +11546,12 @@ void Unit::RemoveCharmedBy(Unit* charmer) } if (GetTypeId() != TYPEID_PLAYER || charmer->GetTypeId() == TYPEID_UNIT) - GetAI()->OnCharmed(false); // AI will potentially schedule a charm ai update + { + if (UnitAI* charmedAI = GetAI()) + charmedAI->OnCharmed(false); // AI will potentially schedule a charm ai update + else + ScheduleAIChange(); + } if (Player* player = ToPlayer()) player->SetClientControl(this, true); @@ -12890,7 +12866,7 @@ void Unit::OutDebugInfo() const { TC_LOG_ERROR("entities.unit", "Unit::OutDebugInfo"); TC_LOG_DEBUG("entities.unit", "%s name %s", GetGUID().ToString().c_str(), GetName().c_str()); - TC_LOG_DEBUG("entities.unit", "Owner %s, Minion %s, Charmer %s, Charmed %s", GetOwnerGUID().ToString().c_str(), GetMinionGUID().ToString().c_str(), GetCharmerGUID().ToString().c_str(), GetCharmGUID().ToString().c_str()); + TC_LOG_DEBUG("entities.unit", "Owner %s, Minion %s, Charmer %s, Charmed %s", GetOwnerGUID().ToString().c_str(), GetMinionGUID().ToString().c_str(), GetCharmerGUID().ToString().c_str(), GetCharmedGUID().ToString().c_str()); TC_LOG_DEBUG("entities.unit", "In world %u, unit type mask %u", (uint32)(IsInWorld() ? 1 : 0), m_unitTypeMask); if (IsInWorld()) TC_LOG_DEBUG("entities.unit", "Mapid %u", GetMapId()); diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index ad11d9708cc..df6fd428290 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1144,14 +1144,45 @@ class TC_GAME_API Unit : public WorldObject void SetCreatorGUID(ObjectGuid creator) { SetGuidValue(UNIT_FIELD_CREATEDBY, creator); } ObjectGuid GetMinionGUID() const { return GetGuidValue(UNIT_FIELD_SUMMON); } void SetMinionGUID(ObjectGuid guid) { SetGuidValue(UNIT_FIELD_SUMMON, guid); } - ObjectGuid GetCharmerGUID() const { return GetGuidValue(UNIT_FIELD_CHARMEDBY); } - void SetCharmerGUID(ObjectGuid owner) { SetGuidValue(UNIT_FIELD_CHARMEDBY, owner); } - ObjectGuid GetCharmGUID() const { return GetGuidValue(UNIT_FIELD_CHARM); } void SetPetGUID(ObjectGuid guid) { m_SummonSlot[SUMMON_SLOT_PET] = guid; } ObjectGuid GetPetGUID() const { return m_SummonSlot[SUMMON_SLOT_PET]; } void SetCritterGUID(ObjectGuid guid) { SetGuidValue(UNIT_FIELD_CRITTER, guid); } ObjectGuid GetCritterGUID() const { return GetGuidValue(UNIT_FIELD_CRITTER); } + bool SetCharmerData(Unit const* unit) + { + if (!AddGuidValue(UNIT_FIELD_CHARMEDBY, unit->GetGUID())) + return false; + m_charmer = const_cast<Unit*>(unit); + return true; + } + bool ClearCharmerData(Unit const* verify) + { + if (!RemoveGuidValue(UNIT_FIELD_CHARMEDBY, verify->GetGUID())) + return false; + m_charmer = nullptr; + return true; + } + ObjectGuid GetCharmerGUID() const { return GetGuidValue(UNIT_FIELD_CHARMEDBY); } + Unit* GetCharmer() const { return m_charmer; } + + bool SetCharmedData(Unit const* unit) + { + if (!AddGuidValue(UNIT_FIELD_CHARM, unit->GetGUID())) + return false; + m_charmed = const_cast<Unit*>(unit); + return true; + } + bool ClearCharmedData(Unit const* verify) + { + if (!RemoveGuidValue(UNIT_FIELD_CHARM, verify->GetGUID())) + return false; + m_charmed = nullptr; + return true; + } + ObjectGuid GetCharmedGUID() const { return GetGuidValue(UNIT_FIELD_CHARM); } + Unit* GetCharmed() const { return m_charmed; } + bool IsControlledByPlayer() const { return m_ControlledByPlayer; } Player* GetControllingPlayer() const; ObjectGuid GetCharmerOrOwnerGUID() const override { return IsCharmed() ? GetCharmerGUID() : GetOwnerGUID(); } @@ -1159,9 +1190,7 @@ class TC_GAME_API Unit : public WorldObject Guardian* GetGuardianPet() const; Minion* GetFirstMinion() const; - Unit* GetCharmer() const; - Unit* GetCharm() const; - Unit* GetCharmerOrOwner() const; + Unit* GetCharmerOrOwner() const { return IsCharmed() ? GetCharmer() : GetOwner(); } void SetMinion(Minion *minion, bool apply); void GetAllMinionsByEntry(std::list<Creature*>& Minions, uint32 entry); @@ -1732,6 +1761,8 @@ class TC_GAME_API Unit : public WorldObject float m_speed_rate[MAX_MOVE_TYPE]; + Unit* m_charmer; // Unit that is charming ME + Unit* m_charmed; // Unit that is being charmed BY ME CharmInfo* m_charmInfo; SharedVisionList m_sharedVision; diff --git a/src/server/game/Handlers/PetHandler.cpp b/src/server/game/Handlers/PetHandler.cpp index 3ef03ffc80b..87c12e95943 100644 --- a/src/server/game/Handlers/PetHandler.cpp +++ b/src/server/game/Handlers/PetHandler.cpp @@ -130,7 +130,7 @@ void WorldSession::HandlePetStopAttack(WorldPacket &recvData) return; } - if (pet != GetPlayer()->GetPet() && pet != GetPlayer()->GetCharm()) + if (pet != GetPlayer()->GetPet() && pet != GetPlayer()->GetCharmed()) { TC_LOG_ERROR("entities.pet", "HandlePetStopAttack: %s isn't a pet or charmed creature of player %s", guid.ToString().c_str(), GetPlayer()->GetName().c_str()); @@ -705,7 +705,7 @@ void WorldSession::HandlePetSpellAutocastOpcode(WorldPacket& recvPacket) uint8 state; //1 for on, 0 for off recvPacket >> guid >> spellid >> state; - if (!_player->GetGuardianPet() && !_player->GetCharm()) + if (!_player->GetGuardianPet() && !_player->GetCharmed()) return; if (guid.IsPlayer()) @@ -713,7 +713,7 @@ void WorldSession::HandlePetSpellAutocastOpcode(WorldPacket& recvPacket) Creature* pet = ObjectAccessor::GetCreatureOrPetOrVehicle(*_player, guid); - if (!pet || (pet != _player->GetGuardianPet() && pet != _player->GetCharm())) + if (!pet || (pet != _player->GetGuardianPet() && pet != _player->GetCharmed())) { TC_LOG_ERROR("entities.pet", "HandlePetSpellAutocastOpcode. %s isn't pet of player %s (%s).", guid.ToString().c_str(), GetPlayer()->GetName().c_str(), GetPlayer()->GetGUID().ToString().c_str()); return; @@ -759,12 +759,12 @@ void WorldSession::HandlePetCastSpellOpcode(WorldPacket& recvPacket) TC_LOG_DEBUG("entities.pet", "WORLD: CMSG_PET_CAST_SPELL, %s, castCount: %u, spellId %u, castFlags %u", guid.ToString().c_str(), castCount, spellId, castFlags); // This opcode is also sent from charmed and possessed units (players and creatures) - if (!_player->GetGuardianPet() && !_player->GetCharm()) + if (!_player->GetGuardianPet() && !_player->GetCharmed()) return; Unit* caster = ObjectAccessor::GetUnit(*_player, guid); - if (!caster || (caster != _player->GetGuardianPet() && caster != _player->GetCharm())) + if (!caster || (caster != _player->GetGuardianPet() && caster != _player->GetCharmed())) { TC_LOG_ERROR("entities.pet", "HandlePetCastSpellOpcode: %s isn't pet of player %s (%s).", guid.ToString().c_str(), GetPlayer()->GetName().c_str(), GetPlayer()->GetGUID().ToString().c_str()); return; diff --git a/src/server/game/Handlers/SpellHandler.cpp b/src/server/game/Handlers/SpellHandler.cpp index f1637e4e39a..a26574d787f 100644 --- a/src/server/game/Handlers/SpellHandler.cpp +++ b/src/server/game/Handlers/SpellHandler.cpp @@ -505,7 +505,7 @@ void WorldSession::HandlePetCancelAuraOpcode(WorldPacket& recvPacket) return; } - if (pet != GetPlayer()->GetGuardianPet() && pet != GetPlayer()->GetCharm()) + if (pet != GetPlayer()->GetGuardianPet() && pet != GetPlayer()->GetCharmed()) { TC_LOG_ERROR("network", "HandlePetCancelAura: %s is not a pet of player '%s'", guid.ToString().c_str(), GetPlayer()->GetName().c_str()); return; diff --git a/src/server/game/Handlers/VehicleHandler.cpp b/src/server/game/Handlers/VehicleHandler.cpp index 339631f283a..5b5d2697b80 100644 --- a/src/server/game/Handlers/VehicleHandler.cpp +++ b/src/server/game/Handlers/VehicleHandler.cpp @@ -28,7 +28,7 @@ void WorldSession::HandleDismissControlledVehicle(WorldPacket &recvData) { TC_LOG_DEBUG("network", "WORLD: Recvd CMSG_DISMISS_CONTROLLED_VEHICLE"); - ObjectGuid vehicleGUID = _player->GetCharmGUID(); + ObjectGuid vehicleGUID = _player->GetCharmedGUID(); if (!vehicleGUID) // something wrong here... { diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index ec8b1202208..5329bee5c37 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -3789,7 +3789,7 @@ void Spell::finish(bool ok) // Unsummon summon as possessed creatures on spell cancel if (m_spellInfo->IsChanneled() && unitCaster->GetTypeId() == TYPEID_PLAYER) { - if (Unit* charm = unitCaster->GetCharm()) + if (Unit* charm = unitCaster->GetCharmed()) if (charm->GetTypeId() == TYPEID_UNIT && charm->ToCreature()->HasUnitTypeMask(UNIT_MASK_PUPPET) && charm->GetUInt32Value(UNIT_CREATED_BY_SPELL) == m_spellInfo->Id) @@ -5616,7 +5616,7 @@ SpellCastResult Spell::CheckCast(bool strict, uint32* param1 /*= nullptr*/, uint return SPELL_FAILED_ALREADY_HAVE_SUMMON; // intentional missing break, check both GetPetGUID() and GetCharmGUID for SUMMON_CATEGORY_PET case SUMMON_CATEGORY_PUPPET: - if (unitCaster->GetCharmGUID()) + if (unitCaster->GetCharmedGUID()) return SPELL_FAILED_ALREADY_HAVE_CHARM; break; } @@ -5651,7 +5651,7 @@ SpellCastResult Spell::CheckCast(bool strict, uint32* param1 /*= nullptr*/, uint return SPELL_FAILED_ALREADY_HAVE_SUMMON; } - if (unitCaster->GetCharmGUID()) + if (unitCaster->GetCharmedGUID()) return SPELL_FAILED_ALREADY_HAVE_CHARM; break; } @@ -5817,7 +5817,7 @@ SpellCastResult Spell::CheckCast(bool strict, uint32* param1 /*= nullptr*/, uint if (!m_spellInfo->HasAttribute(SPELL_ATTR1_DISMISS_PET) && unitCaster->GetPetGUID()) return SPELL_FAILED_ALREADY_HAVE_SUMMON; - if (unitCaster->GetCharmGUID()) + if (unitCaster->GetCharmedGUID()) return SPELL_FAILED_ALREADY_HAVE_CHARM; } diff --git a/src/server/scripts/Spells/spell_hunter.cpp b/src/server/scripts/Spells/spell_hunter.cpp index 69b48fde85d..d97e13df132 100644 --- a/src/server/scripts/Spells/spell_hunter.cpp +++ b/src/server/scripts/Spells/spell_hunter.cpp @@ -1428,7 +1428,7 @@ class spell_hun_tame_beast : public SpellScriptLoader if (caster->GetPetGUID()) return SPELL_FAILED_ALREADY_HAVE_SUMMON; - if (caster->GetCharmGUID()) + if (caster->GetCharmedGUID()) return SPELL_FAILED_ALREADY_HAVE_CHARM; } else |