diff options
| author | xinef1 <w.szyszko2@gmail.com> | 2017-02-05 23:42:31 +0100 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2019-07-21 21:06:54 +0200 |
| commit | 4f65dc5e20cc3af5b3595809707c632faa6e5900 (patch) | |
| tree | b265710b6dd2d87bb0f4409770ab77d116654de0 /src/server/game/AI/SmartScripts | |
| parent | ad4e63bae145ae49b584ab2fc621660430cec0d3 (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/server/game/AI/SmartScripts')
| -rw-r--r-- | src/server/game/AI/SmartScripts/SmartScript.cpp | 26 | ||||
| -rw-r--r-- | src/server/game/AI/SmartScripts/SmartScript.h | 2 |
2 files changed, 14 insertions, 14 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; |
