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
This commit is contained in:
Rat
2010-11-04 19:56:39 +01:00
parent cf475e75ca
commit 54b11cce01
2 changed files with 22 additions and 13 deletions

View File

@@ -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)
{

View File

@@ -214,6 +214,7 @@ class SmartScript
uint64 mTextGUID;
Creature* talker;
bool mUseTextTimer;
Unit* mLastInvoker;
SMARTAI_TEMPLATE mTemplate;
void InstallEvents();