aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/AI/SmartScripts
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/server/game/AI/SmartScripts
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/server/game/AI/SmartScripts')
-rw-r--r--src/server/game/AI/SmartScripts/SmartScript.cpp26
-rw-r--r--src/server/game/AI/SmartScripts/SmartScript.h2
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;