diff --git a/src/strategy/actions/AcceptInvitationAction.cpp b/src/strategy/actions/AcceptInvitationAction.cpp index 2d53c13e..45861370 100644 --- a/src/strategy/actions/AcceptInvitationAction.cpp +++ b/src/strategy/actions/AcceptInvitationAction.cpp @@ -59,7 +59,7 @@ bool AcceptInvitationAction::Execute(Event event) if (sPlayerbotAIConfig->summonWhenGroup && bot->GetDistance(inviter) > sPlayerbotAIConfig->sightDistance) { - Teleport(inviter, bot); + Teleport(inviter, bot, true); } return true; } diff --git a/src/strategy/actions/UseMeetingStoneAction.cpp b/src/strategy/actions/UseMeetingStoneAction.cpp index 6e902730..323d9d58 100644 --- a/src/strategy/actions/UseMeetingStoneAction.cpp +++ b/src/strategy/actions/UseMeetingStoneAction.cpp @@ -52,7 +52,7 @@ bool UseMeetingStoneAction::Execute(Event event) if (!goInfo || goInfo->entry != 179944) return false; - return Teleport(master, bot); + return Teleport(master, bot, false); } bool SummonAction::Execute(Event event) @@ -70,16 +70,16 @@ bool SummonAction::Execute(Event event) { // botAI->GetAiObjectContext()->GetValue("prioritized targets")->Set({}); AI_VALUE(std::list&, "recently flee info").clear(); - return Teleport(master, bot); + return Teleport(master, bot, true); } - if (SummonUsingGos(master, bot) || SummonUsingNpcs(master, bot)) + if (SummonUsingGos(master, bot, true) || SummonUsingNpcs(master, bot, true)) { botAI->TellMasterNoFacing("Hello!"); return true; } - if (SummonUsingGos(bot, master) || SummonUsingNpcs(bot, master)) + if (SummonUsingGos(bot, master, true) || SummonUsingNpcs(bot, master, true)) { botAI->TellMasterNoFacing("Welcome!"); return true; @@ -88,7 +88,7 @@ bool SummonAction::Execute(Event event) return false; } -bool SummonAction::SummonUsingGos(Player* summoner, Player* player) +bool SummonAction::SummonUsingGos(Player* summoner, Player* player, bool preserveAuras) { std::list targets; AnyGameObjectInObjectRangeCheck u_check(summoner, sPlayerbotAIConfig->sightDistance); @@ -98,14 +98,14 @@ bool SummonAction::SummonUsingGos(Player* summoner, Player* player) for (GameObject* go : targets) { if (go->isSpawned() && go->GetGoType() == GAMEOBJECT_TYPE_MEETINGSTONE) - return Teleport(summoner, player); + return Teleport(summoner, player, preserveAuras); } botAI->TellError(summoner == bot ? "There is no meeting stone nearby" : "There is no meeting stone near you"); return false; } -bool SummonAction::SummonUsingNpcs(Player* summoner, Player* player) +bool SummonAction::SummonUsingNpcs(Player* summoner, Player* player, bool preserveAuras) { if (!sPlayerbotAIConfig->summonAtInnkeepersEnabled) return false; @@ -139,7 +139,7 @@ bool SummonAction::SummonUsingNpcs(Player* summoner, Player* player) Spell spell(player, spellInfo, TRIGGERED_NONE); spell.SendSpellCooldown(); - return Teleport(summoner, player); + return Teleport(summoner, player, preserveAuras); } } @@ -147,7 +147,7 @@ bool SummonAction::SummonUsingNpcs(Player* summoner, Player* player) return false; } -bool SummonAction::Teleport(Player* summoner, Player* player) +bool SummonAction::Teleport(Player* summoner, Player* player, bool preserveAuras) { // Player* master = GetMaster(); if (!summoner) @@ -208,7 +208,11 @@ bool SummonAction::Teleport(Player* summoner, Player* player) player->GetMotionMaster()->Clear(); AI_VALUE(LastMovement&, "last movement").clear(); - player->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_TELEPORTED | AURA_INTERRUPT_FLAG_CHANGE_MAP); + + if (!preserveAuras) + player->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_TELEPORTED | + AURA_INTERRUPT_FLAG_CHANGE_MAP); + player->TeleportTo(mapId, x, y, z, 0); if (botAI->HasStrategy("stay", botAI->GetState())) diff --git a/src/strategy/actions/UseMeetingStoneAction.h b/src/strategy/actions/UseMeetingStoneAction.h index f3b59549..ff128228 100644 --- a/src/strategy/actions/UseMeetingStoneAction.h +++ b/src/strategy/actions/UseMeetingStoneAction.h @@ -19,9 +19,9 @@ public: bool Execute(Event event) override; protected: - bool Teleport(Player* summoner, Player* player); - bool SummonUsingGos(Player* summoner, Player* player); - bool SummonUsingNpcs(Player* summoner, Player* player); + bool Teleport(Player* summoner, Player* player, bool preserveAuras); + bool SummonUsingGos(Player* summoner, Player* player, bool preserveAuras); + bool SummonUsingNpcs(Player* summoner, Player* player, bool preserveAuras); }; class UseMeetingStoneAction : public SummonAction