diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Grids/Notifiers/GridNotifiers.h | 15 | ||||
-rw-r--r-- | src/server/game/Spells/Spell.h | 1 | ||||
-rw-r--r-- | src/server/game/Spells/SpellEffects.cpp | 22 |
3 files changed, 37 insertions, 1 deletions
diff --git a/src/server/game/Grids/Notifiers/GridNotifiers.h b/src/server/game/Grids/Notifiers/GridNotifiers.h index a0c31f76348..944649d68ba 100644 --- a/src/server/game/Grids/Notifiers/GridNotifiers.h +++ b/src/server/game/Grids/Notifiers/GridNotifiers.h @@ -1608,6 +1608,21 @@ namespace Trinity ObjectGuid _casterGUID; }; + class ObjectEntryAndPrivateOwnerIfExistsCheck + { + public: + ObjectEntryAndPrivateOwnerIfExistsCheck(ObjectGuid ownerGUID, uint32 entry) : _ownerGUID(ownerGUID), _entry(entry) { } + + bool operator()(WorldObject* object) const + { + return object->GetEntry() == _entry && (!object->IsPrivateObject() || object->GetPrivateObjectOwner() == _ownerGUID); + } + + private: + ObjectGuid _ownerGUID; + uint32 _entry; + }; + // Player checks and do // Prepare using Builder localized packets with caching and send to player diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h index 1d25fcaf267..f80df3dad8b 100644 --- a/src/server/game/Spells/Spell.h +++ b/src/server/game/Spells/Spell.h @@ -371,6 +371,7 @@ class TC_GAME_API Spell void EffectLearnGarrisonBuilding(); void EffectCreateGarrison(); void EffectCreateConversation(); + void EffectCancelConversation(); void EffectAddGarrisonFollower(); void EffectActivateGarrisonBuilding(); void EffectHealBattlePetPct(); diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index c0e0af8045b..584508dc595 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -194,7 +194,7 @@ NonDefaultConstructible<SpellEffectHandlerFn> SpellEffectHandlers[TOTAL_SPELL_EF &Spell::EffectDestroyAllTotems, //110 SPELL_EFFECT_DESTROY_ALL_TOTEMS &Spell::EffectDurabilityDamage, //111 SPELL_EFFECT_DURABILITY_DAMAGE &Spell::EffectNULL, //112 SPELL_EFFECT_112 - &Spell::EffectNULL, //113 SPELL_EFFECT_CANCEL_CONVERSATION + &Spell::EffectCancelConversation, //113 SPELL_EFFECT_CANCEL_CONVERSATION &Spell::EffectTaunt, //114 SPELL_EFFECT_ATTACK_ME &Spell::EffectDurabilityDamagePCT, //115 SPELL_EFFECT_DURABILITY_DAMAGE_PCT &Spell::EffectSkinPlayerCorpse, //116 SPELL_EFFECT_SKIN_PLAYER_CORPSE one spell: Remove Insignia, bg usage, required special corpse flags... @@ -5547,6 +5547,26 @@ void Spell::EffectCreateConversation() Conversation::CreateConversation(effectInfo->MiscValue, unitCaster, destTarget->GetPosition(), ObjectGuid::Empty, GetSpellInfo()); } +void Spell::EffectCancelConversation() +{ + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + + if (!unitTarget) + return; + + std::vector<WorldObject*> objs; + Trinity::ObjectEntryAndPrivateOwnerIfExistsCheck check(unitTarget->GetGUID(), effectInfo->MiscValue); + Trinity::WorldObjectListSearcher<Trinity::ObjectEntryAndPrivateOwnerIfExistsCheck> checker(unitTarget, objs, check, GRID_MAP_TYPE_MASK_CONVERSATION); + Cell::VisitGridObjects(unitTarget, checker, 100.0f); + + for (WorldObject* obj : objs) + { + if (Conversation* convo = obj->ToConversation()) + convo->Remove(); + } +} + void Spell::EffectAddGarrisonFollower() { if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) |