aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Grids/Notifiers/GridNotifiers.h15
-rw-r--r--src/server/game/Spells/Spell.h1
-rw-r--r--src/server/game/Spells/SpellEffects.cpp22
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)