aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorxinef1 <w.szyszko2@gmail.com>2017-02-05 23:42:31 +0100
committerShauren <shauren.trinity@gmail.com>2019-07-21 21:06:54 +0200
commit4f65dc5e20cc3af5b3595809707c632faa6e5900 (patch)
treeb265710b6dd2d87bb0f4409770ab77d116654de0 /src
parentad4e63bae145ae49b584ab2fc621660430cec0d3 (diff)
Core/Misc: Various crash fixes (#19059)
* Replaced some FindPlayer calls with GetPlayer Fixed some more crashes * Correction (cherrypicked from 14dfc377b48bc909894396e65d4e4ce89d9708b6)
Diffstat (limited to 'src')
-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.cpp3
-rw-r--r--src/server/game/Handlers/InspectHandler.cpp4
-rw-r--r--src/server/game/Handlers/LootHandler.cpp3
-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
19 files changed, 62 insertions, 35 deletions
diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp
index be37c0e671e..d22aae3ae0f 100644
--- a/src/server/game/AI/SmartScripts/SmartScript.cpp
+++ b/src/server/game/AI/SmartScripts/SmartScript.cpp
@@ -605,7 +605,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))
@@ -702,7 +702,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;
@@ -955,7 +955,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;
}
@@ -1099,7 +1099,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);
}
@@ -4115,14 +4115,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 57d2a3389ce..4e00c286952 100644
--- a/src/server/game/AI/SmartScripts/SmartScript.h
+++ b/src/server/game/AI/SmartScripts/SmartScript.h
@@ -92,7 +92,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 886e9f3bbeb..20556b8152f 100644
--- a/src/server/game/Combat/ThreatManager.cpp
+++ b/src/server/game/Combat/ThreatManager.cpp
@@ -441,7 +441,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 77c1bef1900..0baa01497bb 100644
--- a/src/server/game/DungeonFinding/LFGMgr.cpp
+++ b/src/server/game/DungeonFinding/LFGMgr.cpp
@@ -1387,7 +1387,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)
@@ -1431,7 +1431,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 0107d9adcfb..e16a11a5623 100644
--- a/src/server/game/DungeonFinding/LFGMgr.h
+++ b/src/server/game/DungeonFinding/LFGMgr.h
@@ -29,6 +29,7 @@
class Group;
class Player;
class Quest;
+class Map;
struct LFGDungeonsEntry;
enum Difficulty : uint8;
@@ -323,7 +324,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 aa5baff7d19..af4fd6e6ec5 100644
--- a/src/server/game/Entities/Object/Object.cpp
+++ b/src/server/game/Entities/Object/Object.cpp
@@ -1655,7 +1655,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*/, bool visibleBySummonerOnly /*= false*/)
+TempSummon* Map::SummonCreature(uint32 entry, Position const& pos, SummonPropertiesEntry const* properties /*= nullptr*/, uint32 duration /*= 0*/, Unit* summoner /*= nullptr*/, uint32 spellId /*= 0*/, uint32 vehId /*= 0*/, bool visibleBySummonerOnly /*= false*/)
{
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 fbca88492f5..20cb86a37b3 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -1744,6 +1744,9 @@ void Player::RemoveFromWorld()
StopCastingBindSight();
UnsummonPetTemporaryIfAny();
ClearComboPoints();
+ ObjectGuid lootGuid = GetLootGUID();
+ if (!lootGuid.IsEmpty())
+ m_session->DoLootRelease(lootGuid);
sOutdoorPvPMgr->HandlePlayerLeaveZone(this, m_zoneUpdateId);
sBattlefieldMgr->HandlePlayerLeaveZone(this, m_zoneUpdateId);
}
diff --git a/src/server/game/Handlers/InspectHandler.cpp b/src/server/game/Handlers/InspectHandler.cpp
index 0db71b633e8..7f0117ae775 100644
--- a/src/server/game/Handlers/InspectHandler.cpp
+++ b/src/server/game/Handlers/InspectHandler.cpp
@@ -27,7 +27,7 @@
void WorldSession::HandleInspectOpcode(WorldPackets::Inspect::Inspect& inspect)
{
- Player* player = ObjectAccessor::FindPlayer(inspect.Target);
+ Player* player = ObjectAccessor::GetPlayer(*_player, inspect.Target);
if (!player)
{
TC_LOG_DEBUG("network", "WorldSession::HandleInspectOpcode: Target %s not found.", inspect.Target.ToString().c_str());
@@ -77,7 +77,7 @@ void WorldSession::HandleInspectOpcode(WorldPackets::Inspect::Inspect& inspect)
void WorldSession::HandleQueryInspectAchievements(WorldPackets::Inspect::QueryInspectAchievements& inspect)
{
- Player* player = ObjectAccessor::FindPlayer(inspect.Guid);
+ Player* player = ObjectAccessor::GetPlayer(*_player, inspect.Guid);
if (!player)
{
TC_LOG_DEBUG("network", "WorldSession::HandleQueryInspectAchievements: [%s] inspected unknown Player [%s]", GetPlayer()->GetGUID().ToString().c_str(), inspect.Guid.ToString().c_str());
diff --git a/src/server/game/Handlers/LootHandler.cpp b/src/server/game/Handlers/LootHandler.cpp
index edffaa0d11b..bca2b96e93a 100644
--- a/src/server/game/Handlers/LootHandler.cpp
+++ b/src/server/game/Handlers/LootHandler.cpp
@@ -462,7 +462,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, ObjectGuid::Empty, LOOT_ERROR_PLAYER_NOT_FOUND);
diff --git a/src/server/game/Handlers/VehicleHandler.cpp b/src/server/game/Handlers/VehicleHandler.cpp
index 5880268d976..95e2746d94e 100644
--- a/src/server/game/Handlers/VehicleHandler.cpp
+++ b/src/server/game/Handlers/VehicleHandler.cpp
@@ -122,7 +122,7 @@ void WorldSession::HandleRequestVehicleSwitchSeat(WorldPackets::Vehicle::Request
void WorldSession::HandleRideVehicleInteract(WorldPackets::Vehicle::RideVehicleInteract& rideVehicleInteract)
{
- if (Player* player = ObjectAccessor::FindPlayer(rideVehicleInteract.Vehicle))
+ if (Player* player = ObjectAccessor::GetPlayer(*_player, rideVehicleInteract.Vehicle))
{
if (!player->GetVehicleKit())
return;
@@ -130,6 +130,9 @@ void WorldSession::HandleRideVehicleInteract(WorldPackets::Vehicle::RideVehicleI
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 ce5a75cb313..c6258b67f44 100644
--- a/src/server/game/Instances/InstanceScript.cpp
+++ b/src/server/game/Instances/InstanceScript.cpp
@@ -749,7 +749,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 a58f36b8e07..4a5ce244c56 100644
--- a/src/server/game/Maps/Map.cpp
+++ b/src/server/game/Maps/Map.cpp
@@ -3925,6 +3925,11 @@ Conversation* Map::GetConversation(ObjectGuid const& guid)
return _objectsStore.Find<Conversation>(guid);
}
+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 5fc1e79b743..4cfc9c475db 100644
--- a/src/server/game/Maps/Map.h
+++ b/src/server/game/Maps/Map.h
@@ -446,10 +446,11 @@ 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, bool visibleOnlyBySummoner = false);
- 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, bool visibleOnlyBySummoner = false);
+ void SummonCreatureGroup(uint8 group, std::list<TempSummon*>* list = nullptr);
AreaTrigger* GetAreaTrigger(ObjectGuid const& guid);
Conversation* GetConversation(ObjectGuid const& guid);
+ Player* GetPlayer(ObjectGuid const& guid);
Corpse* GetCorpse(ObjectGuid const& guid);
Creature* GetCreature(ObjectGuid const& guid);
DynamicObject* GetDynamicObject(ObjectGuid const& guid);
diff --git a/src/server/game/Maps/MapScripts.cpp b/src/server/game/Maps/MapScripts.cpp
index 6729b02dd4f..f6fed3dad9a 100644
--- a/src/server/game/Maps/MapScripts.cpp
+++ b/src/server/game/Maps/MapScripts.cpp
@@ -310,7 +310,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::Creature:
@@ -321,7 +321,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::GameObject:
case HighGuid::Transport:
@@ -350,7 +350,7 @@ void Map::ScriptsProcess()
target = GetPet(step.targetGUID);
break;
case HighGuid::Player:
- target = HashMapHolder<Player>::Find(step.targetGUID);
+ target = GetPlayer(step.targetGUID);
break;
case HighGuid::GameObject:
case HighGuid::Transport:
diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp
index f2ec658f89f..bcf64d299cb 100644
--- a/src/server/game/Spells/Auras/SpellAuras.cpp
+++ b/src/server/game/Spells/Auras/SpellAuras.cpp
@@ -1005,7 +1005,8 @@ bool Aura::CanBeSaved() const
if (IsPassive())
return false;
- if (GetCasterGUID() != GetOwner()->GetGUID())
+ // Check if aura is single target, not only spell info
+ if (GetCasterGUID() != GetOwner()->GetGUID() || IsSingleTarget())
if (GetSpellInfo()->IsSingleTarget())
return false;
@@ -1017,6 +1018,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 c416460080b..220bf980463 100644
--- a/src/server/game/Spells/SpellInfo.cpp
+++ b/src/server/game/Spells/SpellInfo.cpp
@@ -444,8 +444,7 @@ bool SpellEffectInfo::IsFarUnitTargetEffect() const
{
return (Effect == SPELL_EFFECT_SUMMON_PLAYER)
|| (Effect == SPELL_EFFECT_SUMMON_RAF_FRIEND)
- || (Effect == SPELL_EFFECT_RESURRECT)
- || (Effect == SPELL_EFFECT_SKIN_PLAYER_CORPSE);
+ || (Effect == SPELL_EFFECT_RESURRECT);
}
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 38699c2865a..d53b7984146 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_coren_direbrew.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_coren_direbrew.cpp
@@ -208,7 +208,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 797003b13c7..d81c7f284c0 100644
--- a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp
+++ b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp
@@ -581,7 +581,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 82f33015979..923ed9109a0 100644
--- a/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_ahune.cpp
+++ b/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_ahune.cpp
@@ -210,7 +210,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();