aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/AI/SmartScripts/SmartScript.cpp26
-rw-r--r--src/server/game/AI/SmartScripts/SmartScript.h2
-rw-r--r--src/server/game/Combat/ThreatManager.cpp3
-rw-r--r--src/server/game/DungeonFinding/LFGMgr.cpp4
-rw-r--r--src/server/game/DungeonFinding/LFGMgr.h3
-rw-r--r--src/server/game/Entities/Object/Object.cpp2
-rw-r--r--src/server/game/Entities/Player/Player.cpp5
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp2
-rw-r--r--src/server/game/Groups/Group.cpp36
-rw-r--r--src/server/game/Handlers/LootHandler.cpp3
-rw-r--r--src/server/game/Handlers/MiscHandler.cpp6
-rw-r--r--src/server/game/Handlers/PetHandler.cpp2
-rw-r--r--src/server/game/Handlers/VehicleHandler.cpp5
-rw-r--r--src/server/game/Instances/InstanceScript.cpp2
-rw-r--r--src/server/game/Maps/Map.cpp5
-rw-r--r--src/server/game/Maps/Map.h5
-rw-r--r--src/server/game/Maps/MapScripts.cpp6
-rw-r--r--src/server/game/Spells/Auras/SpellAuras.cpp15
-rw-r--r--src/server/game/Spells/SpellInfo.cpp3
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_coren_direbrew.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp2
-rw-r--r--src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_ahune.cpp2
22 files changed, 80 insertions, 61 deletions
diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp
index 95a04a29cda..8acbc9bea45 100644
--- a/src/server/game/AI/SmartScripts/SmartScript.cpp
+++ b/src/server/game/AI/SmartScripts/SmartScript.cpp
@@ -461,7 +461,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
if (IsUnit(*itr))
if (Vehicle* vehicle = (*itr)->ToUnit()->GetVehicleKit())
for (SeatMap::iterator it = vehicle->Seats.begin(); it != vehicle->Seats.end(); ++it)
- if (Player* player = ObjectAccessor::FindPlayer(it->second.Passenger.Guid))
+ if (Player* player = ObjectAccessor::GetPlayer(*(*itr), it->second.Passenger.Guid))
player->AreaExploredOrEventHappens(e.action.quest.quest);
if (IsPlayer(*itr))
@@ -538,7 +538,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
}
case SMART_ACTION_INVOKER_CAST:
{
- Unit* tempLastInvoker = GetLastInvoker();
+ Unit* tempLastInvoker = GetLastInvoker(unit);
if (!tempLastInvoker)
break;
@@ -791,7 +791,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
// Special handling for vehicles
if (Vehicle* vehicle = unit->GetVehicleKit())
for (SeatMap::iterator it = vehicle->Seats.begin(); it != vehicle->Seats.end(); ++it)
- if (Player* player = ObjectAccessor::FindPlayer(it->second.Passenger.Guid))
+ if (Player* player = ObjectAccessor::GetPlayer(*unit, it->second.Passenger.Guid))
player->GroupEventHappens(e.action.quest.quest, GetBaseObject());
break;
}
@@ -935,7 +935,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
else if (IsUnit(*itr)) // Special handling for vehicles
if (Vehicle* vehicle = (*itr)->ToUnit()->GetVehicleKit())
for (SeatMap::iterator seatItr = vehicle->Seats.begin(); seatItr != vehicle->Seats.end(); ++seatItr)
- if (Player* player = ObjectAccessor::FindPlayer(seatItr->second.Passenger.Guid))
+ if (Player* player = ObjectAccessor::GetPlayer(*(*itr), seatItr->second.Passenger.Guid))
player->KilledMonsterCredit(e.action.killedMonster.creature);
}
@@ -3782,14 +3782,14 @@ void SmartScript::SetScript9(SmartScriptHolder& e, uint32 entry)
}
}
-Unit* SmartScript::GetLastInvoker()
+Unit* SmartScript::GetLastInvoker(Unit* invoker)
{
- WorldObject* lookupRoot = me;
- if (!lookupRoot)
- lookupRoot = go;
-
- if (lookupRoot)
- return ObjectAccessor::GetUnit(*lookupRoot, mLastInvoker);
-
- return ObjectAccessor::FindPlayer(mLastInvoker);
+ // Look for invoker only on map of base object... Prevents multithreaded crashes
+ if (WorldObject* baseObject = GetBaseObject())
+ return ObjectAccessor::GetUnit(*baseObject, mLastInvoker);
+ // used for area triggers invoker cast
+ else if (invoker)
+ return ObjectAccessor::GetUnit(*invoker, mLastInvoker);
+
+ return nullptr;
}
diff --git a/src/server/game/AI/SmartScripts/SmartScript.h b/src/server/game/AI/SmartScripts/SmartScript.h
index ce9879ff236..7113bda92cf 100644
--- a/src/server/game/AI/SmartScripts/SmartScript.h
+++ b/src/server/game/AI/SmartScripts/SmartScript.h
@@ -244,7 +244,7 @@ class TC_GAME_API SmartScript
//TIMED_ACTIONLIST (script type 9 aka script9)
void SetScript9(SmartScriptHolder& e, uint32 entry);
- Unit* GetLastInvoker();
+ Unit* GetLastInvoker(Unit* invoker = nullptr);
ObjectGuid mLastInvoker;
typedef std::unordered_map<uint32, uint32> CounterMap;
CounterMap mCounterList;
diff --git a/src/server/game/Combat/ThreatManager.cpp b/src/server/game/Combat/ThreatManager.cpp
index 1e58b6cd3cf..c858314dc16 100644
--- a/src/server/game/Combat/ThreatManager.cpp
+++ b/src/server/game/Combat/ThreatManager.cpp
@@ -422,7 +422,8 @@ void ThreatManager::doAddThreat(Unit* victim, float threat)
{
float redirectThreat = CalculatePct(threat, redirectThreadPct);
threat -= redirectThreat;
- _addThreat(redirectTarget, redirectThreat);
+ if (ThreatCalcHelper::isValidProcess(redirectTarget, GetOwner()))
+ _addThreat(redirectTarget, redirectThreat);
}
}
diff --git a/src/server/game/DungeonFinding/LFGMgr.cpp b/src/server/game/DungeonFinding/LFGMgr.cpp
index fa8a17234fd..bf13095942e 100644
--- a/src/server/game/DungeonFinding/LFGMgr.cpp
+++ b/src/server/game/DungeonFinding/LFGMgr.cpp
@@ -1347,7 +1347,7 @@ void LFGMgr::TeleportPlayer(Player* player, bool out, bool fromOpcode /*= false*
@param[in] guid Group guid
@param[in] dungeonId Dungeonid
*/
-void LFGMgr::FinishDungeon(ObjectGuid gguid, const uint32 dungeonId)
+void LFGMgr::FinishDungeon(ObjectGuid gguid, const uint32 dungeonId, Map const* currMap)
{
uint32 gDungeonId = GetDungeon(gguid);
if (gDungeonId != dungeonId)
@@ -1391,7 +1391,7 @@ void LFGMgr::FinishDungeon(ObjectGuid gguid, const uint32 dungeonId)
}
Player* player = ObjectAccessor::FindPlayer(guid);
- if (!player)
+ if (!player || player->FindMap() != currMap)
{
TC_LOG_DEBUG("lfg.dungeon.finish", "Group: %s, Player: %s not found in world", gguid.ToString().c_str(), guid.ToString().c_str());
continue;
diff --git a/src/server/game/DungeonFinding/LFGMgr.h b/src/server/game/DungeonFinding/LFGMgr.h
index dfa42a317ee..96f5b2373ff 100644
--- a/src/server/game/DungeonFinding/LFGMgr.h
+++ b/src/server/game/DungeonFinding/LFGMgr.h
@@ -28,6 +28,7 @@
class Group;
class Player;
class Quest;
+class Map;
namespace lfg
{
@@ -303,7 +304,7 @@ class TC_GAME_API LFGMgr
// World.cpp
/// Finish the dungeon for the given group. All check are performed using internal lfg data
- void FinishDungeon(ObjectGuid gguid, uint32 dungeonId);
+ void FinishDungeon(ObjectGuid gguid, uint32 dungeonId, Map const* currMap);
/// Loads rewards for random dungeons
void LoadRewards();
/// Loads dungeons from dbc and adds teleport coords
diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp
index d90a5873f92..7610c9981c5 100644
--- a/src/server/game/Entities/Object/Object.cpp
+++ b/src/server/game/Entities/Object/Object.cpp
@@ -1851,7 +1851,7 @@ void WorldObject::AddObjectToRemoveList()
map->AddObjectToRemoveList(this);
}
-TempSummon* Map::SummonCreature(uint32 entry, Position const& pos, SummonPropertiesEntry const* properties /*= NULL*/, uint32 duration /*= 0*/, Unit* summoner /*= NULL*/, uint32 spellId /*= 0*/, uint32 vehId /*= 0*/)
+TempSummon* Map::SummonCreature(uint32 entry, Position const& pos, SummonPropertiesEntry const* properties /*= nullptr*/, uint32 duration /*= 0*/, Unit* summoner /*= nullptr*/, uint32 spellId /*= 0*/, uint32 vehId /*= 0*/)
{
uint32 mask = UNIT_MASK_SUMMON;
if (properties)
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index f47634b8f56..86eefa043cd 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -2148,6 +2148,9 @@ void Player::RemoveFromWorld()
UnsummonPetTemporaryIfAny();
ClearComboPoints();
ClearComboPointHolders();
+ ObjectGuid lootGuid = GetLootGUID();
+ if (!lootGuid.IsEmpty())
+ m_session->DoLootRelease(lootGuid);
sOutdoorPvPMgr->HandlePlayerLeaveZone(this, m_zoneUpdateId);
sBattlefieldMgr->HandlePlayerLeaveZone(this, m_zoneUpdateId);
}
@@ -23629,7 +23632,7 @@ bool Player::IsAtGroupRewardDistance(WorldObject const* pRewardSource) const
if (!player || IsAlive())
player = this;
- if (player->GetMap()->IsDungeon())
+ if (pRewardSource->GetMap()->IsDungeon())
return true;
return pRewardSource->GetDistance(player) <= sWorld->getFloatConfig(CONFIG_GROUP_XP_DISTANCE);
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index 7f56f670e70..1a55f14cfb5 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -11295,7 +11295,7 @@ void Unit::ClearComboPointHolders()
{
ObjectGuid guid = *m_ComboPointHolders.begin();
- Player* player = ObjectAccessor::FindPlayer(guid);
+ Player* player = ObjectAccessor::GetPlayer(*this, guid);
if (player && player->GetComboTarget() == GetGUID()) // recheck for safe
player->ClearComboPoints(); // remove also guid from m_ComboPointHolders;
else
diff --git a/src/server/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp
index 617a955fea0..d931343b5e2 100644
--- a/src/server/game/Groups/Group.cpp
+++ b/src/server/game/Groups/Group.cpp
@@ -986,21 +986,18 @@ void Group::GroupLoot(Loot* loot, WorldObject* pLootedObject)
Player* member = itr->GetSource();
if (!member || !member->GetSession())
continue;
- if (i->AllowedForPlayer(member))
+ if (member->IsAtGroupRewardDistance(pLootedObject) && i->AllowedForPlayer(member))
{
- if (member->IsAtGroupRewardDistance(pLootedObject))
- {
- r->totalPlayersRolling++;
+ r->totalPlayersRolling++;
- if (member->GetPassOnGroupLoot())
- {
- r->playerVote[member->GetGUID()] = PASS;
- r->totalPass++;
- // can't broadcast the pass now. need to wait until all rolling players are known.
- }
- else
- r->playerVote[member->GetGUID()] = NOT_EMITED_YET;
+ if (member->GetPassOnGroupLoot())
+ {
+ r->playerVote[member->GetGUID()] = PASS;
+ r->totalPass++;
+ // can't broadcast the pass now. need to wait until all rolling players are known.
}
+ else
+ r->playerVote[member->GetGUID()] = NOT_EMITED_YET;
}
}
@@ -1072,13 +1069,10 @@ void Group::GroupLoot(Loot* loot, WorldObject* pLootedObject)
if (!member || !member->GetSession())
continue;
- if (i->AllowedForPlayer(member))
+ if (member->IsAtGroupRewardDistance(pLootedObject) && i->AllowedForPlayer(member))
{
- if (member->IsAtGroupRewardDistance(pLootedObject))
- {
- r->totalPlayersRolling++;
- r->playerVote[member->GetGUID()] = NOT_EMITED_YET;
- }
+ r->totalPlayersRolling++;
+ r->playerVote[member->GetGUID()] = NOT_EMITED_YET;
}
}
@@ -1133,8 +1127,7 @@ void Group::NeedBeforeGreed(Loot* loot, WorldObject* lootedObject)
if (!playerToRoll || !playerToRoll->GetSession())
continue;
- bool allowedForPlayer = i->AllowedForPlayer(playerToRoll);
- if (allowedForPlayer && playerToRoll->IsAtGroupRewardDistance(lootedObject))
+ if (playerToRoll->IsAtGroupRewardDistance(lootedObject) && i->AllowedForPlayer(playerToRoll))
{
r->totalPlayersRolling++;
if (playerToRoll->GetPassOnGroupLoot())
@@ -1209,8 +1202,7 @@ void Group::NeedBeforeGreed(Loot* loot, WorldObject* lootedObject)
if (!playerToRoll || !playerToRoll->GetSession())
continue;
- bool allowedForPlayer = i->AllowedForPlayer(playerToRoll);
- if (allowedForPlayer && playerToRoll->IsAtGroupRewardDistance(lootedObject))
+ if (playerToRoll->IsAtGroupRewardDistance(lootedObject) && i->AllowedForPlayer(playerToRoll))
{
r->totalPlayersRolling++;
r->playerVote[playerToRoll->GetGUID()] = NOT_EMITED_YET;
diff --git a/src/server/game/Handlers/LootHandler.cpp b/src/server/game/Handlers/LootHandler.cpp
index 3adc0ec9166..1e740b33bb9 100644
--- a/src/server/game/Handlers/LootHandler.cpp
+++ b/src/server/game/Handlers/LootHandler.cpp
@@ -394,7 +394,8 @@ void WorldSession::HandleLootMasterGiveOpcode(WorldPacket& recvData)
return;
}
- Player* target = ObjectAccessor::FindPlayer(target_playerguid);
+ // player on other map
+ Player* target = ObjectAccessor::GetPlayer(*_player, target_playerguid);
if (!target)
{
_player->SendLootError(lootguid, LOOT_ERROR_PLAYER_NOT_FOUND);
diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp
index 2f738b64910..daf6dea438b 100644
--- a/src/server/game/Handlers/MiscHandler.cpp
+++ b/src/server/game/Handlers/MiscHandler.cpp
@@ -982,7 +982,7 @@ void WorldSession::HandleInspectOpcode(WorldPacket& recvData)
TC_LOG_DEBUG("network", "WORLD: Received CMSG_INSPECT");
- Player* player = ObjectAccessor::FindPlayer(guid);
+ Player* player = ObjectAccessor::GetPlayer(*_player, guid);
if (!player)
{
TC_LOG_DEBUG("network", "CMSG_INSPECT: No player found from %s", guid.ToString().c_str());
@@ -1018,7 +1018,7 @@ void WorldSession::HandleInspectHonorStatsOpcode(WorldPacket& recvData)
ObjectGuid guid;
recvData >> guid;
- Player* player = ObjectAccessor::FindPlayer(guid);
+ Player* player = ObjectAccessor::GetPlayer(*_player, guid);
if (!player)
{
@@ -1455,7 +1455,7 @@ void WorldSession::HandleQueryInspectAchievements(WorldPacket& recvData)
recvData >> guid.ReadAsPacked();
TC_LOG_DEBUG("network", "CMSG_QUERY_INSPECT_ACHIEVEMENTS [%s] Inspected Player [%s]", _player->GetGUID().ToString().c_str(), guid.ToString().c_str());
- Player* player = ObjectAccessor::FindPlayer(guid);
+ Player* player = ObjectAccessor::GetPlayer(*_player, guid);
if (!player)
return;
diff --git a/src/server/game/Handlers/PetHandler.cpp b/src/server/game/Handlers/PetHandler.cpp
index 89f6e78cc6d..98d15158abb 100644
--- a/src/server/game/Handlers/PetHandler.cpp
+++ b/src/server/game/Handlers/PetHandler.cpp
@@ -697,7 +697,7 @@ void WorldSession::HandlePetSpellAutocastOpcode(WorldPacket& recvPacket)
if (!_player->GetGuardianPet() && !_player->GetCharm())
return;
- if (ObjectAccessor::FindPlayer(guid))
+ if (guid.IsPlayer())
return;
Creature* pet=ObjectAccessor::GetCreatureOrPetOrVehicle(*_player, guid);
diff --git a/src/server/game/Handlers/VehicleHandler.cpp b/src/server/game/Handlers/VehicleHandler.cpp
index 0cdf22e2bd0..17af33cb270 100644
--- a/src/server/game/Handlers/VehicleHandler.cpp
+++ b/src/server/game/Handlers/VehicleHandler.cpp
@@ -130,7 +130,7 @@ void WorldSession::HandleEnterPlayerVehicle(WorldPacket &data)
ObjectGuid guid;
data >> guid;
- if (Player* player = ObjectAccessor::FindPlayer(guid))
+ if (Player* player = ObjectAccessor::GetPlayer(*_player, guid))
{
if (!player->GetVehicleKit())
return;
@@ -138,6 +138,9 @@ void WorldSession::HandleEnterPlayerVehicle(WorldPacket &data)
return;
if (!player->IsWithinDistInMap(_player, INTERACTION_DISTANCE))
return;
+ // Dont' allow players to enter player vehicle on arena
+ if (!_player->FindMap() || _player->FindMap()->IsBattleArena())
+ return;
_player->EnterVehicle(player);
}
diff --git a/src/server/game/Instances/InstanceScript.cpp b/src/server/game/Instances/InstanceScript.cpp
index f4f91c16dc5..75245573e49 100644
--- a/src/server/game/Instances/InstanceScript.cpp
+++ b/src/server/game/Instances/InstanceScript.cpp
@@ -651,7 +651,7 @@ void InstanceScript::UpdateEncounterState(EncounterCreditType type, uint32 credi
if (Group* grp = player->GetGroup())
if (grp->isLFGGroup())
{
- sLFGMgr->FinishDungeon(grp->GetGUID(), dungeonId);
+ sLFGMgr->FinishDungeon(grp->GetGUID(), dungeonId, instance);
return;
}
}
diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp
index 27d784a8110..d2bc9cdfb51 100644
--- a/src/server/game/Maps/Map.cpp
+++ b/src/server/game/Maps/Map.cpp
@@ -3512,6 +3512,11 @@ void BattlegroundMap::RemoveAllPlayers()
player->TeleportTo(player->GetBattlegroundEntryPoint());
}
+Player* Map::GetPlayer(ObjectGuid const& guid)
+{
+ return ObjectAccessor::GetPlayer(this, guid);
+}
+
Corpse* Map::GetCorpse(ObjectGuid const& guid)
{
return _objectsStore.Find<Corpse>(guid);
diff --git a/src/server/game/Maps/Map.h b/src/server/game/Maps/Map.h
index c87726bba57..600594d0861 100644
--- a/src/server/game/Maps/Map.h
+++ b/src/server/game/Maps/Map.h
@@ -451,8 +451,9 @@ class TC_GAME_API Map : public GridRefManager<NGridType>
void UpdateIteratorBack(Player* player);
- TempSummon* SummonCreature(uint32 entry, Position const& pos, SummonPropertiesEntry const* properties = NULL, uint32 duration = 0, Unit* summoner = NULL, uint32 spellId = 0, uint32 vehId = 0);
- void SummonCreatureGroup(uint8 group, std::list<TempSummon*>* list = NULL);
+ TempSummon* SummonCreature(uint32 entry, Position const& pos, SummonPropertiesEntry const* properties = nullptr, uint32 duration = 0, Unit* summoner = nullptr, uint32 spellId = 0, uint32 vehId = 0);
+ void SummonCreatureGroup(uint8 group, std::list<TempSummon*>* list = nullptr);
+ Player* GetPlayer(ObjectGuid const& guid);
Corpse* GetCorpse(ObjectGuid const& guid);
Creature* GetCreature(ObjectGuid const& guid);
GameObject* GetGameObject(ObjectGuid const& guid);
diff --git a/src/server/game/Maps/MapScripts.cpp b/src/server/game/Maps/MapScripts.cpp
index c3a933a753b..300c7fa38e5 100644
--- a/src/server/game/Maps/MapScripts.cpp
+++ b/src/server/game/Maps/MapScripts.cpp
@@ -295,7 +295,7 @@ void Map::ScriptsProcess()
switch (step.sourceGUID.GetHigh())
{
case HighGuid::Item: // as well as HighGuid::Container
- if (Player* player = HashMapHolder<Player>::Find(step.ownerGUID))
+ if (Player* player = GetPlayer(step.ownerGUID))
source = player->GetItemByGuid(step.sourceGUID);
break;
case HighGuid::Unit:
@@ -306,7 +306,7 @@ void Map::ScriptsProcess()
source = GetPet(step.sourceGUID);
break;
case HighGuid::Player:
- source = HashMapHolder<Player>::Find(step.sourceGUID);
+ source = GetPlayer(step.sourceGUID);
break;
case HighGuid::Transport:
case HighGuid::GameObject:
@@ -338,7 +338,7 @@ void Map::ScriptsProcess()
target = GetPet(step.targetGUID);
break;
case HighGuid::Player: // empty GUID case also
- target = HashMapHolder<Player>::Find(step.targetGUID);
+ target = GetPlayer(step.targetGUID);
break;
case HighGuid::Transport:
case HighGuid::GameObject:
diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp
index a30fa83e32b..d93f5fd4de4 100644
--- a/src/server/game/Spells/Auras/SpellAuras.cpp
+++ b/src/server/game/Spells/Auras/SpellAuras.cpp
@@ -946,8 +946,9 @@ bool Aura::CanBeSaved() const
if (IsPassive())
return false;
+ // Check if aura is single target, not only spell info
if (GetCasterGUID() != GetOwner()->GetGUID())
- if (GetSpellInfo()->IsSingleTarget())
+ if (GetSpellInfo()->IsSingleTarget() || IsSingleTarget())
return false;
// Can't be saved - aura handler relies on calculated amount and changes it
@@ -962,6 +963,18 @@ bool Aura::CanBeSaved() const
if (HasEffectType(SPELL_AURA_CONTROL_VEHICLE))
return false;
+ // do not save bind sight auras
+ if (HasEffectType(SPELL_AURA_BIND_SIGHT))
+ return false;
+
+ // no charming auras (taking direct control)
+ if (HasEffectType(SPELL_AURA_MOD_POSSESS) || HasEffectType(SPELL_AURA_MOD_POSSESS_PET))
+ return false;
+
+ // no charming auras can be saved
+ if (HasEffectType(SPELL_AURA_MOD_CHARM) || HasEffectType(SPELL_AURA_AOE_CHARM))
+ return false;
+
// Incanter's Absorbtion - considering the minimal duration and problems with aura stacking
// we skip saving this aura
// Also for some reason other auras put as MultiSlot crash core on keeping them after restart,
diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp
index a6bdeeba9d0..ad58119547c 100644
--- a/src/server/game/Spells/SpellInfo.cpp
+++ b/src/server/game/Spells/SpellInfo.cpp
@@ -391,8 +391,7 @@ bool SpellEffectInfo::IsFarUnitTargetEffect() const
return (Effect == SPELL_EFFECT_SUMMON_PLAYER)
|| (Effect == SPELL_EFFECT_SUMMON_RAF_FRIEND)
|| (Effect == SPELL_EFFECT_RESURRECT)
- || (Effect == SPELL_EFFECT_RESURRECT_NEW)
- || (Effect == SPELL_EFFECT_SKIN_PLAYER_CORPSE);
+ || (Effect == SPELL_EFFECT_RESURRECT_NEW);
}
bool SpellEffectInfo::IsFarDestTargetEffect() const
diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_coren_direbrew.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_coren_direbrew.cpp
index 3475ecc05ba..2dadbecbfbe 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_coren_direbrew.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_coren_direbrew.cpp
@@ -204,7 +204,7 @@ public:
{
if (Group* group = players.begin()->GetSource()->GetGroup())
if (group->isLFGGroup())
- sLFGMgr->FinishDungeon(group->GetGUID(), 287);
+ sLFGMgr->FinishDungeon(group->GetGUID(), 287, me->GetMap());
}
}
diff --git a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp
index 03bc38f2bbe..3102b7461d5 100644
--- a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp
+++ b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp
@@ -576,7 +576,7 @@ public:
{
if (Group* group = players.begin()->GetSource()->GetGroup())
if (group->isLFGGroup())
- sLFGMgr->FinishDungeon(group->GetGUID(), 285);
+ sLFGMgr->FinishDungeon(group->GetGUID(), 285, me->GetMap());
}
}
diff --git a/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_ahune.cpp b/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_ahune.cpp
index d2571e9d1d5..702496500ec 100644
--- a/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_ahune.cpp
+++ b/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_ahune.cpp
@@ -201,7 +201,7 @@ public:
{
if (Group* group = players.begin()->GetSource()->GetGroup())
if (group->isLFGGroup())
- sLFGMgr->FinishDungeon(group->GetGUID(), 286);
+ sLFGMgr->FinishDungeon(group->GetGUID(), 286, me->GetMap());
}
_JustDied();