aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRat <none@none>2010-11-04 19:56:39 +0100
committerRat <none@none>2010-11-04 19:56:39 +0100
commit54b11cce015b71e665bf22827fbf97ef86e569e0 (patch)
treef1ca352fdc5db70d69622f0fda65795c0370c10d
parentcf475e75cafa4b83d5020ea0cfbebdc514ad01df (diff)
Core/SmartAI: store event invoker when available, and use it for Invoker target
note: dont forget to call script_reset when script is over! --HG-- branch : trunk
-rw-r--r--src/server/game/AI/SmartScripts/SmartScript.cpp34
-rw-r--r--src/server/game/AI/SmartScripts/SmartScript.h1
2 files changed, 22 insertions, 13 deletions
diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp
index 9b034e522f1..d4d60071c12 100644
--- a/src/server/game/AI/SmartScripts/SmartScript.cpp
+++ b/src/server/game/AI/SmartScripts/SmartScript.cpp
@@ -52,6 +52,7 @@ SmartScript::SmartScript()
meOrigGUID = 0;
goOrigGUID = 0;
mResumeActionList = true;
+ mLastInvoker = NULL;
}
void SmartScript::OnReset()
@@ -64,6 +65,7 @@ void SmartScript::OnReset()
(*i).runOnce = false;
}
ProcessEventsFor(SMART_EVENT_RESET);
+ mLastInvoker = NULL;
}
void SmartScript::ProcessEventsFor(SMART_EVENT e, Unit* unit, uint32 var0, uint32 var1, bool bvar, const SpellEntry* spell, GameObject* gob)
@@ -105,6 +107,9 @@ void SmartScript::ProcessAction(SmartScriptHolder &e, Unit* unit, uint32 var0, u
}
e.runOnce = true;//used for repeat check
+ if (unit)
+ mLastInvoker = unit;
+
if (e.link && e.link != e.event_id)
{
SmartScriptHolder linked = FindLinkedEvent(e.link);
@@ -1171,6 +1176,11 @@ SmartScriptHolder SmartScript::CreateEvent(SMART_EVENT e, uint32 event_flags, ui
ObjectList* SmartScript::GetTargets(SmartScriptHolder e, Unit* invoker)
{
+ Unit* trigger = NULL;
+ if (invoker)
+ trigger = invoker;
+ else if (mLastInvoker)
+ trigger = mLastInvoker;
ObjectList* l = new ObjectList();
switch (e.GetTargetType())
{
@@ -1204,22 +1214,20 @@ ObjectList* SmartScript::GetTargets(SmartScriptHolder e, Unit* invoker)
break;
case SMART_TARGET_NONE:
case SMART_TARGET_ACTION_INVOKER:
- if (invoker)
- {
- l->push_back(invoker);
- }
+ if (trigger)
+ l->push_back(trigger);
break;
case SMART_TARGET_ACTION_INVOKER_VEHICLE:
- if (invoker && invoker->GetVehicle() && invoker->GetVehicle()->GetBase())
+ if (trigger && trigger->GetVehicle() && trigger->GetVehicle()->GetBase())
{
- l->push_back(invoker->GetVehicle()->GetBase());
+ l->push_back(trigger->GetVehicle()->GetBase());
}
break;
case SMART_TARGET_INVOKER_PARTY:
- if (invoker)
+ if (trigger)
{
- l->push_back(invoker);
- if (Player* plr = invoker->ToPlayer())
+ l->push_back(trigger);
+ if (Player* plr = trigger->ToPlayer())
{
if (Group *pGroup = plr->GetGroup())
{
@@ -1303,12 +1311,12 @@ ObjectList* SmartScript::GetTargets(SmartScriptHolder e, Unit* invoker)
target = HashMapHolder<Creature>::Find(guid);
} else
{
- if (!invoker && !GetBaseObject())
+ if (!trigger && !GetBaseObject())
{
sLog.outErrorDb("SMART_TARGET_CREATURE_GUID can not be used without invoker and without entry");
return NULL;
}
- target = FindCreatureNear(invoker?invoker:GetBaseObject(), e.target.unitGUID.guid);
+ target = FindCreatureNear(trigger?trigger:GetBaseObject(), e.target.unitGUID.guid);
}
if (target)
{
@@ -1325,12 +1333,12 @@ ObjectList* SmartScript::GetTargets(SmartScriptHolder e, Unit* invoker)
target = HashMapHolder<GameObject>::Find(guid);
} else
{
- if (!invoker && !GetBaseObject())
+ if (!trigger && !GetBaseObject())
{
sLog.outErrorDb("SMART_TARGET_GAMEOBJECT_GUID can not be used without invoker and without entry");
return NULL;
}
- target = FindGameObjectNear(invoker?invoker:GetBaseObject(), e.target.goGUID.guid);
+ target = FindGameObjectNear(trigger?trigger:GetBaseObject(), e.target.goGUID.guid);
}
if (target)
{
diff --git a/src/server/game/AI/SmartScripts/SmartScript.h b/src/server/game/AI/SmartScripts/SmartScript.h
index 8a15e6b725c..345ab58c8d8 100644
--- a/src/server/game/AI/SmartScripts/SmartScript.h
+++ b/src/server/game/AI/SmartScripts/SmartScript.h
@@ -214,6 +214,7 @@ class SmartScript
uint64 mTextGUID;
Creature* talker;
bool mUseTextTimer;
+ Unit* mLastInvoker;
SMARTAI_TEMPLATE mTemplate;
void InstallEvents();