aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2011-03-26 23:45:23 +0100
committerShauren <shauren.trinity@gmail.com>2011-03-26 23:45:23 +0100
commitcbb552ead71adc4c043e9a94df4575ddde0e2a06 (patch)
treef738278fed350a6d8456b3452785672fb57a5c75 /src
parent592ad10866a5e6948849934ef044593c98e0e31b (diff)
Core/SAI: Fixed memory leaks in targeting (lists were not being deleted)
Diffstat (limited to 'src')
-rw-r--r--src/server/game/AI/SmartScripts/SmartScript.cpp2481
-rw-r--r--src/server/game/AI/SmartScripts/SmartScript.h28
2 files changed, 1387 insertions, 1122 deletions
diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp
index 3603c61fb69..94c4a0a0955 100644
--- a/src/server/game/AI/SmartScripts/SmartScript.cpp
+++ b/src/server/game/AI/SmartScripts/SmartScript.cpp
@@ -125,77 +125,92 @@ void SmartScript::ProcessAction(SmartScriptHolder &e, Unit* unit, uint32 var0, u
switch (e.GetActionType())
{
case SMART_ACTION_TALK:
+ {
+ ObjectList* targets = GetTargets(e, unit);
+ talker = me;
+ if (targets)
{
- ObjectList* targets = GetTargets(e, unit);
- talker = me;
- if (targets)
+ for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
{
- for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
+ if (IsCreature((*itr)))
{
- if (IsCreature((*itr)))
- {
- talker = (*itr)->ToCreature();
- break;
- }
+ talker = (*itr)->ToCreature();
+ break;
}
}
- mLastTextID = e.action.talk.textGroupID;
- mTextTimer = e.action.talk.duration;
- mTextGUID = IsPlayer(GetLastInvoker())? GetLastInvoker()->GetGUID() : NULL;//invoker, used for $vars in texts
- mUseTextTimer = true;
- sCreatureTextMgr->SendChat(talker, uint8(e.action.talk.textGroupID), mTextGUID);
-
- sLog->outDebug(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction: SMART_ACTION_TALK: talker: %s (GuidLow: %u), textGuid: %u",
- talker->GetName(), talker->GetGUIDLow(), mTextGUID);
- break;
+ delete targets;
}
+
+ mLastTextID = e.action.talk.textGroupID;
+ mTextTimer = e.action.talk.duration;
+ mTextGUID = IsPlayer(GetLastInvoker()) ? GetLastInvoker()->GetGUID() : NULL;//invoker, used for $vars in texts
+ mUseTextTimer = true;
+ sCreatureTextMgr->SendChat(talker, uint8(e.action.talk.textGroupID), mTextGUID);
+
+ sLog->outDebug(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction: SMART_ACTION_TALK: talker: %s (GuidLow: %u), textGuid: %u",
+ talker->GetName(), talker->GetGUIDLow(), mTextGUID);
+
+ break;
+ }
case SMART_ACTION_SIMPLE_TALK:
+ {
+ ObjectList* targets = GetTargets(e, unit);
+ if (targets)
{
- ObjectList* targets = GetTargets(e, unit);
- if (targets)
+ for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
{
- for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
+ if (IsCreature((*itr)))
+ sCreatureTextMgr->SendChat((*itr)->ToCreature(), uint8(e.action.talk.textGroupID), IsPlayer(GetLastInvoker())? GetLastInvoker()->GetGUID() : NULL);
+ else if (IsPlayer((*itr)))
{
- if (IsCreature((*itr)))
- sCreatureTextMgr->SendChat((*itr)->ToCreature(), uint8(e.action.talk.textGroupID), IsPlayer(GetLastInvoker())? GetLastInvoker()->GetGUID() : NULL);
- else if (IsPlayer((*itr)))
- {
- Unit* templastInvoker = GetLastInvoker();
- sCreatureTextMgr->SendChat(me, uint8(e.action.talk.textGroupID),IsPlayer(templastInvoker)? templastInvoker->GetGUID() : NULL,CHAT_TYPE_END,LANG_ADDON,TEXT_RANGE_NORMAL,NULL,TEAM_OTHER,false, (*itr)->ToPlayer());
- }
- sLog->outDebug(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction:: SMART_ACTION_SIMPLE_TALK: talker: %s (GuidLow: %u), textGroupId: %u",
- (*itr)->GetName(), (*itr)->GetGUIDLow(), uint8(e.action.talk.textGroupID));
+ Unit* templastInvoker = GetLastInvoker();
+ sCreatureTextMgr->SendChat(me, uint8(e.action.talk.textGroupID), IsPlayer(templastInvoker) ? templastInvoker->GetGUID() : NULL, CHAT_TYPE_END, LANG_ADDON, TEXT_RANGE_NORMAL, NULL, TEAM_OTHER, false, (*itr)->ToPlayer());
}
+ sLog->outDebug(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction:: SMART_ACTION_SIMPLE_TALK: talker: %s (GuidLow: %u), textGroupId: %u",
+ (*itr)->GetName(), (*itr)->GetGUIDLow(), uint8(e.action.talk.textGroupID));
}
- break;
+
+ delete targets;
}
+ break;
+ }
case SMART_ACTION_PLAY_EMOTE:
+ {
+ ObjectList* targets = GetTargets(e, unit);
+ if (targets)
{
- ObjectList* targets = GetTargets(e, unit);
- if (targets)
- for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
- if (IsUnit((*itr)))
- {
- (*itr)->ToUnit()->HandleEmoteCommand(e.action.emote.emote);
- sLog->outDebug(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction:: SMART_ACTION_PLAY_EMOTE: target: %s (GuidLow: %u), emote: %u",
- (*itr)->GetName(), (*itr)->GetGUIDLow(), e.action.emote.emote);
- }
- break;
+ for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
+ if (IsUnit((*itr)))
+ {
+ (*itr)->ToUnit()->HandleEmoteCommand(e.action.emote.emote);
+ sLog->outDebug(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction:: SMART_ACTION_PLAY_EMOTE: target: %s (GuidLow: %u), emote: %u",
+ (*itr)->GetName(), (*itr)->GetGUIDLow(), e.action.emote.emote);
+ }
+
+ delete targets;
}
+ break;
+ }
case SMART_ACTION_SOUND:
+ {
+ ObjectList* targets = GetTargets(e, unit);
+ if (targets)
{
- ObjectList* targets = GetTargets(e, unit);
- if (targets)
- for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
- if (IsCreature((*itr)))
- {
- sCreatureTextMgr->SendSound((*itr)->ToCreature(), e.action.sound.sound, CHAT_TYPE_SAY, 0, TextRange(e.action.sound.range), Team(NULL), false);
- sLog->outDebug(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction:: SMART_ACTION_SOUND: source: %s (GuidLow: %u), sound: %u, range: %u",
- (*itr)->GetName(), (*itr)->GetGUIDLow(), e.action.sound.sound, e.action.sound.range);
- }
- break;
+ for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
+ {
+ if (IsCreature((*itr)))
+ {
+ sCreatureTextMgr->SendSound((*itr)->ToCreature(), e.action.sound.sound, CHAT_TYPE_SAY, 0, TextRange(e.action.sound.range), Team(NULL), false);
+ sLog->outDebug(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction:: SMART_ACTION_SOUND: source: %s (GuidLow: %u), sound: %u, range: %u",
+ (*itr)->GetName(), (*itr)->GetGUIDLow(), e.action.sound.sound, e.action.sound.range);
+ }
+ }
+
+ delete targets;
}
+ break;
+ }
case SMART_ACTION_SET_FACTION:
{
ObjectList* targets = GetTargets(e, unit);
@@ -225,13 +240,16 @@ void SmartScript::ProcessAction(SmartScriptHolder &e, Unit* unit, uint32 var0, u
}
}
}
+
+ delete targets;
}
break;
}
case SMART_ACTION_MORPH_TO_ENTRY_OR_MODEL:
{
ObjectList* targets = GetTargets(e, unit);
- if (!targets) return;
+ if (!targets)
+ return;
for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
{
if (!IsCreature((*itr)))
@@ -265,12 +283,15 @@ void SmartScript::ProcessAction(SmartScriptHolder &e, Unit* unit, uint32 var0, u
(*itr)->GetEntry(), (*itr)->GetGUIDLow());
}
}
+
+ delete targets;
break;
}
case SMART_ACTION_FAIL_QUEST:
{
ObjectList* targets = GetTargets(e, unit);
- if (!targets) return;
+ if (!targets)
+ return;
for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
{
if (IsPlayer((*itr)))
@@ -280,12 +301,15 @@ void SmartScript::ProcessAction(SmartScriptHolder &e, Unit* unit, uint32 var0, u
(*itr)->GetGUIDLow(), e.action.quest.quest);
}
}
+
+ delete targets;
break;
}
case SMART_ACTION_ADD_QUEST:
{
ObjectList* targets = GetTargets(e, unit);
- if (!targets) return;
+ if (!targets)
+ return;
for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
{
if (IsPlayer((*itr)))
@@ -296,6 +320,8 @@ void SmartScript::ProcessAction(SmartScriptHolder &e, Unit* unit, uint32 var0, u
(*itr)->GetGUIDLow(), e.action.quest.quest);
}
}
+
+ delete targets;
break;
}
case SMART_ACTION_SET_REACT_STATE:
@@ -310,49 +336,57 @@ void SmartScript::ProcessAction(SmartScriptHolder &e, Unit* unit, uint32 var0, u
break;
}
case SMART_ACTION_RANDOM_EMOTE:
+ {
+ ObjectList* targets = GetTargets(e, unit);
+ if (!targets)
+ return;
+ uint32 emotes[SMART_ACTION_PARAM_COUNT];
+ emotes[0] = e.action.randomEmote.emote1;
+ emotes[1] = e.action.randomEmote.emote2;
+ emotes[2] = e.action.randomEmote.emote3;
+ emotes[3] = e.action.randomEmote.emote4;
+ emotes[4] = e.action.randomEmote.emote5;
+ emotes[5] = e.action.randomEmote.emote6;
+ uint32 temp[SMART_ACTION_PARAM_COUNT];
+ uint32 count = 0;
+ for (uint8 i = 0; i < SMART_ACTION_PARAM_COUNT; i++)
{
- ObjectList* targets = GetTargets(e, unit);
- if (!targets) return;
- uint32 emotes[SMART_ACTION_PARAM_COUNT];
- emotes[0] = e.action.randomEmote.emote1;
- emotes[1] = e.action.randomEmote.emote2;
- emotes[2] = e.action.randomEmote.emote3;
- emotes[3] = e.action.randomEmote.emote4;
- emotes[4] = e.action.randomEmote.emote5;
- emotes[5] = e.action.randomEmote.emote6;
- uint32 temp[SMART_ACTION_PARAM_COUNT];
- uint32 count = 0;
- for (uint8 i = 0; i < SMART_ACTION_PARAM_COUNT; i++)
+ if (emotes[i])
{
- if (emotes[i])
- {
- temp[count] = emotes[i];
- count++;
- }
+ temp[count] = emotes[i];
+ count++;
+ }
+ }
+
+ for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
+ {
+ if (IsUnit((*itr)))
+ {
+ uint32 emote = temp[urand(0, count)];
+ (*itr)->ToUnit()->HandleEmoteCommand(emote);
+ sLog->outDebug(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction:: SMART_ACTION_RANDOM_EMOTE: Creature guidLow %u handle random emote %u",
+ (*itr)->GetGUIDLow(), emote);
}
- for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
- if (IsUnit((*itr)))
- {
- uint32 emote = temp[urand(0, count)];
- (*itr)->ToUnit()->HandleEmoteCommand(emote);
- sLog->outDebug(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction:: SMART_ACTION_RANDOM_EMOTE: Creature guidLow %u handle random emote %u",
- (*itr)->GetGUIDLow(), emote);
- }
- break;
}
+
+ delete targets;
+ break;
+ }
case SMART_ACTION_THREAT_ALL_PCT:
{
if (!me)
return;
- std::list<HostileReference*>& threatList = me->getThreatManager().getThreatList();
- for (std::list<HostileReference*>::iterator i = threatList.begin(); i != threatList.end(); ++i)
- if (Unit* Temp = Unit::GetUnit(*me,(*i)->getUnitGuid()))
+ std::list<HostileReference*> const& threatList = me->getThreatManager().getThreatList();
+ for (std::list<HostileReference*>::const_iterator i = threatList.begin(); i != threatList.end(); ++i)
+ {
+ if (Unit* Temp = Unit::GetUnit(*me, (*i)->getUnitGuid()))
{
me->getThreatManager().modifyThreatPercent(Temp, e.action.threatPCT.threatINC ? (int32)e.action.threatPCT.threatINC : -(int32)e.action.threatPCT.threatDEC);
sLog->outDebug(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction:: SMART_ACTION_THREAT_ALL_PCT: Creature guidLow %u modify threat for unit %u, value %i",
me->GetGUIDLow(), Temp->GetGUIDLow(), e.action.threatPCT.threatINC ? (int32)e.action.threatPCT.threatINC : -(int32)e.action.threatPCT.threatDEC);
}
+ }
break;
}
case SMART_ACTION_THREAT_SINGLE_PCT:
@@ -361,879 +395,1023 @@ void SmartScript::ProcessAction(SmartScriptHolder &e, Unit* unit, uint32 var0, u
return;
ObjectList* targets = GetTargets(e, unit);
- if (!targets) return;
+ if (!targets)
+ return;
+
for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
+ {
if (IsUnit((*itr)))
{
me->getThreatManager().modifyThreatPercent((*itr)->ToUnit(), e.action.threatPCT.threatINC ? (int32)e.action.threatPCT.threatINC : -(int32)e.action.threatPCT.threatDEC);
sLog->outDebug(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction:: SMART_ACTION_THREAT_SINGLE_PCT: Creature guidLow %u modify threat for unit %u, value %i",
me->GetGUIDLow(), (*itr)->GetGUIDLow(), e.action.threatPCT.threatINC ? (int32)e.action.threatPCT.threatINC : -(int32)e.action.threatPCT.threatDEC);
}
+ }
+
+ delete targets;
break;
}
case SMART_ACTION_CALL_AREAEXPLOREDOREVENTHAPPENS:
+ {
+ ObjectList* targets = GetTargets(e, unit);
+ if (!targets)
+ return;
+
+ for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
{
- //if (!me) return;
- ObjectList* targets = GetTargets(e, unit);
- if (!targets) return;
- for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
- if (IsPlayer((*itr)))
- {
- (*itr)->ToPlayer()->AreaExploredOrEventHappens(e.action.quest.quest);
- sLog->outDebug(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction:: SMART_ACTION_CALL_AREAEXPLOREDOREVENTHAPPENS: Player guidLow %u credited quest %u",
- (*itr)->GetGUIDLow(), e.action.quest.quest);
- }
- break;
+ if (IsPlayer((*itr)))
+ {
+ (*itr)->ToPlayer()->AreaExploredOrEventHappens(e.action.quest.quest);
+ sLog->outDebug(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction:: SMART_ACTION_CALL_AREAEXPLOREDOREVENTHAPPENS: Player guidLow %u credited quest %u",
+ (*itr)->GetGUIDLow(), e.action.quest.quest);
+ }
}
+
+ delete targets;
+ break;
+ }
case SMART_ACTION_SEND_CASTCREATUREORGO:
+ {
+ if (!GetBaseObject())
+ return;
+
+ ObjectList* targets = GetTargets(e, unit);
+ if (!targets)
+ return;
+
+ for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
{
- if (!GetBaseObject()) return;
- ObjectList* targets = GetTargets(e, unit);
- if (!targets) return;
- for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
- if (IsPlayer((*itr)))
- {
- (*itr)->ToPlayer()->CastedCreatureOrGO(e.action.castedCreatureOrGO.creature, GetBaseObject()->GetGUID(), e.action.castedCreatureOrGO.spell);
- sLog->outDebug(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction:: SMART_ACTION_SEND_CASTCREATUREORGO: Player guidLow %u.org Creature: %u, BaseObject GUID: "UI64FMTD" , Spell: %u",
- e.action.castedCreatureOrGO.creature, GetBaseObject()->GetGUID(), e.action.castedCreatureOrGO.spell);
- }
- break;
+ if (IsPlayer((*itr)))
+ {
+ (*itr)->ToPlayer()->CastedCreatureOrGO(e.action.castedCreatureOrGO.creature, GetBaseObject()->GetGUID(), e.action.castedCreatureOrGO.spell);
+ sLog->outDebug(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction:: SMART_ACTION_SEND_CASTCREATUREORGO: Player guidLow %u.org Creature: %u, BaseObject GUID: "UI64FMTD" , Spell: %u",
+ e.action.castedCreatureOrGO.creature, GetBaseObject()->GetGUID(), e.action.castedCreatureOrGO.spell);
+ }
}
+
+ delete targets;
+ break;
+ }
case SMART_ACTION_CAST:
- {
- if (!me)
- return;
+ {
+ if (!me)
+ return;
- ObjectList* targets = GetTargets(e, unit);
- if (!targets) return;
- for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
- if (IsUnit((*itr)))
- {
- if (e.action.cast.flags & SMARTCAST_INTERRUPT_PREVIOUS)
- me->InterruptNonMeleeSpells(false);
+ ObjectList* targets = GetTargets(e, unit);
+ if (!targets)
+ return;
- me->CastSpell((*itr)->ToUnit(), e.action.cast.spell,(e.action.cast.flags & SMARTCAST_TRIGGERED) ? true : false);
- sLog->outDebug(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction:: SMART_ACTION_CAST:: Creature %u casts spell %u on target %u with castflags %u",
- me->GetGUIDLow(), e.action.cast.spell, (*itr)->GetGUIDLow(), e.action.cast.flags);
- }
- break;
+ for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
+ {
+ if (IsUnit((*itr)))
+ {
+ if (e.action.cast.flags & SMARTCAST_INTERRUPT_PREVIOUS)
+ me->InterruptNonMeleeSpells(false);
+
+ me->CastSpell((*itr)->ToUnit(), e.action.cast.spell, (e.action.cast.flags & SMARTCAST_TRIGGERED) ? true : false);
+ sLog->outDebug(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction:: SMART_ACTION_CAST:: Creature %u casts spell %u on target %u with castflags %u",
+ me->GetGUIDLow(), e.action.cast.spell, (*itr)->GetGUIDLow(), e.action.cast.flags);
+ }
}
+
+ delete targets;
+ break;
+ }
case SMART_ACTION_INVOKER_CAST:
+ {
+ Unit* tempLastInvoker = GetLastInvoker();
+ if (!tempLastInvoker)
+ return;
+
+ ObjectList* targets = GetTargets(e, unit);
+ if (!targets)
+ return;
+
+ for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
{
- Unit* tempLastInvoker = GetLastInvoker();
- if (!tempLastInvoker)
- return;
- ObjectList* targets = GetTargets(e, unit);
- if (!targets) return;
- for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
- if (IsUnit((*itr)))
- {
- if (e.action.cast.flags & SMARTCAST_INTERRUPT_PREVIOUS)
- tempLastInvoker->InterruptNonMeleeSpells(false);
+ if (IsUnit((*itr)))
+ {
+ if (e.action.cast.flags & SMARTCAST_INTERRUPT_PREVIOUS)
+ tempLastInvoker->InterruptNonMeleeSpells(false);
- tempLastInvoker->CastSpell((*itr)->ToUnit(), e.action.cast.spell,(e.action.cast.flags & SMARTCAST_TRIGGERED) ? true : false);
- sLog->outDebug(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction:: SMART_ACTION_INVOKER_CAST: Invoker %u casts spell % on target %u with castflags %u",
- tempLastInvoker->GetGUIDLow(), (*itr)->GetGUIDLow(), e.action.cast.spell, e.action.cast.flags);
- }
- break;
+ tempLastInvoker->CastSpell((*itr)->ToUnit(), e.action.cast.spell, (e.action.cast.flags & SMARTCAST_TRIGGERED) ? true : false);
+ sLog->outDebug(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction:: SMART_ACTION_INVOKER_CAST: Invoker %u casts spell % on target %u with castflags %u",
+ tempLastInvoker->GetGUIDLow(), (*itr)->GetGUIDLow(), e.action.cast.spell, e.action.cast.flags);
+ }
}
+
+ delete targets;
+ break;
+ }
case SMART_ACTION_ADD_AURA:
- {
- ObjectList* targets = GetTargets(e, unit);
- if (!targets)
- return;
+ {
+ ObjectList* targets = GetTargets(e, unit);
+ if (!targets)
+ return;
- for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
- if (IsUnit((*itr)))
- {
- (*itr)->ToUnit()->AddAura(e.action.cast.spell, (*itr)->ToUnit());
- sLog->outDebug(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction:: SMART_ACTION_ADD_AURA: Adding aura %u to unit %u",
- e.action.cast.spell, (*itr)->GetGUIDLow());
- }
- break;
+ for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
+ {
+ if (IsUnit((*itr)))
+ {
+ (*itr)->ToUnit()->AddAura(e.action.cast.spell, (*itr)->ToUnit());
+ sLog->outDebug(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction:: SMART_ACTION_ADD_AURA: Adding aura %u to unit %u",
+ e.action.cast.spell, (*itr)->GetGUIDLow());
+ }
}
+
+ delete targets;
+ break;
+ }
case SMART_ACTION_ACTIVATE_GOBJECT:
- {
- ObjectList* targets = GetTargets(e, unit);
- if (!targets)
- return;
+ {
+ ObjectList* targets = GetTargets(e, unit);
+ if (!targets)
+ return;
- for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
- if (IsGameObject((*itr)))
- {
- // Activate
- (*itr)->ToGameObject()->SetLootState(GO_READY);
- (*itr)->ToGameObject()->UseDoorOrButton();
- sLog->outDebug(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction:: SMART_ACTION_ACTIVATE_GOBJECT. Gameobject %u (entry: %u) activated",
- (*itr)->GetGUIDLow(), (*itr)->GetEntry());
- }
- break;
+ for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
+ {
+ if (IsGameObject((*itr)))
+ {
+ // Activate
+ (*itr)->ToGameObject()->SetLootState(GO_READY);
+ (*itr)->ToGameObject()->UseDoorOrButton();
+ sLog->outDebug(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction:: SMART_ACTION_ACTIVATE_GOBJECT. Gameobject %u (entry: %u) activated",
+ (*itr)->GetGUIDLow(), (*itr)->GetEntry());
+ }
}
+
+ delete targets;
+ break;
+ }
case SMART_ACTION_RESET_GOBJECT:
+ {
+ ObjectList* targets = GetTargets(e, unit);
+ if (!targets)
+ return;
+ for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
{
- ObjectList* targets = GetTargets(e, unit);
- if (!targets) return;
- for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
- if (IsGameObject((*itr)))
- {
- (*itr)->ToGameObject()->ResetDoorOrButton();
- sLog->outDebug(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction:: SMART_ACTION_RESET_GOBJECT. Gameobject %u (entry: %u) reset",
- (*itr)->GetGUIDLow(), (*itr)->GetEntry());
- }
- break;
+ if (IsGameObject((*itr)))
+ {
+ (*itr)->ToGameObject()->ResetDoorOrButton();
+ sLog->outDebug(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction:: SMART_ACTION_RESET_GOBJECT. Gameobject %u (entry: %u) reset",
+ (*itr)->GetGUIDLow(), (*itr)->GetEntry());
+ }
}
+
+ delete targets;
+ break;
+ }
case SMART_ACTION_SET_EMOTE_STATE:
+ {
+ ObjectList* targets = GetTargets(e, unit);
+ if (!targets)
+ return;
+
+ for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
{
- ObjectList* targets = GetTargets(e, unit);
- if (!targets) return;
- for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
- if (IsUnit((*itr)))
- {
- (*itr)->ToUnit()->SetUInt32Value(UNIT_NPC_EMOTESTATE, e.action.emote.emote);
- sLog->outDebug(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction:: SMART_ACTION_SET_EMOTE_STATE. Unit %u set emotestate to %u",
- (*itr)->GetGUIDLow(), e.action.emote.emote);
- }
- break;
+ if (IsUnit((*itr)))
+ {
+ (*itr)->ToUnit()->SetUInt32Value(UNIT_NPC_EMOTESTATE, e.action.emote.emote);
+ sLog->outDebug(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction:: SMART_ACTION_SET_EMOTE_STATE. Unit %u set emotestate to %u",
+ (*itr)->GetGUIDLow(), e.action.emote.emote);
+ }
}
+
+ delete targets;
+ break;
+ }
case SMART_ACTION_SET_UNIT_FLAG:
+ {
+ ObjectList* targets = GetTargets(e, unit);
+ if (!targets)
+ return;
+ for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
{
- ObjectList* targets = GetTargets(e, unit);
- if (!targets) return;
- for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
- if (IsUnit((*itr)))
- {
- (*itr)->ToUnit()->SetFlag(UNIT_FIELD_FLAGS, e.action.unitFlag.flag);
- sLog->outDebug(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction:: SMART_ACTION_SET_UNIT_FLAG. Unit %u added flag %u to UNIT_FIELD_FLAGS",
- (*itr)->GetGUIDLow(), e.action.unitFlag.flag);
- }
- break;
+ if (IsUnit((*itr)))
+ {
+ (*itr)->ToUnit()->SetFlag(UNIT_FIELD_FLAGS, e.action.unitFlag.flag);
+ sLog->outDebug(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction:: SMART_ACTION_SET_UNIT_FLAG. Unit %u added flag %u to UNIT_FIELD_FLAGS",
+ (*itr)->GetGUIDLow(), e.action.unitFlag.flag);
+ }
}
+
+ delete targets;
+ break;
+ }
case SMART_ACTION_REMOVE_UNIT_FLAG:
+ {
+ ObjectList* targets = GetTargets(e, unit);
+ if (!targets)
+ return;
+
+ for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
{
- ObjectList* targets = GetTargets(e, unit);
- if (!targets) return;
- for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
- if (IsUnit((*itr)))
- {
- (*itr)->ToUnit()->RemoveFlag(UNIT_FIELD_FLAGS, e.action.unitFlag.flag);
- sLog->outDebug(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction:: SMART_ACTION_REMOVE_UNIT_FLAG. Unit %u removed flag %u to UNIT_FIELD_FLAGS",
- (*itr)->GetGUIDLow(), e.action.unitFlag.flag);
- }
- break;
+ if (IsUnit((*itr)))
+ {
+ (*itr)->ToUnit()->RemoveFlag(UNIT_FIELD_FLAGS, e.action.unitFlag.flag);
+ sLog->outDebug(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction:: SMART_ACTION_REMOVE_UNIT_FLAG. Unit %u removed flag %u to UNIT_FIELD_FLAGS",
+ (*itr)->GetGUIDLow(), e.action.unitFlag.flag);
+ }
}
+
+ delete targets;
+ break;
+ }
case SMART_ACTION_AUTO_ATTACK:
- {
- if (!IsSmart())
- return;
+ {
+ if (!IsSmart())
+ return;
- CAST_AI(SmartAI, me->AI())->SetAutoAttack(e.action.autoAttack.attack ? true : false);
- sLog->outDebug(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction:: SMART_ACTION_AUTO_ATTACK: Creature: %u bool on = %u",
- me->GetGUIDLow(), e.action.autoAttack.attack);
- break;
- }
+ CAST_AI(SmartAI, me->AI())->SetAutoAttack(e.action.autoAttack.attack ? true : false);
+ sLog->outDebug(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction:: SMART_ACTION_AUTO_ATTACK: Creature: %u bool on = %u",
+ me->GetGUIDLow(), e.action.autoAttack.attack);
+ break;
+ }
case SMART_ACTION_ALLOW_COMBAT_MOVEMENT:
- {
- if (!IsSmart())
- return;
+ {
+ if (!IsSmart())
+ return;
- bool move = e.action.combatMove.move ? true : false;
- CAST_AI(SmartAI, me->AI())->SetCombatMove(move);
- sLog->outDebug(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction:: SMART_ACTION_ALLOW_COMBAT_MOVEMENT: Creature %u bool on = %u",
- me->GetGUIDLow(), e.action.combatMove.move);
- break;
- }
+ bool move = e.action.combatMove.move ? true : false;
+ CAST_AI(SmartAI, me->AI())->SetCombatMove(move);
+ sLog->outDebug(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction:: SMART_ACTION_ALLOW_COMBAT_MOVEMENT: Creature %u bool on = %u",
+ me->GetGUIDLow(), e.action.combatMove.move);
+ break;
+ }
case SMART_ACTION_SET_EVENT_PHASE:
- {
- SetPhase(e.action.setEventPhase.phase);
- sLog->outDebug(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction:: SMART_ACTION_SET_EVENT_PHASE: Creature %u set event phase %u",
- me->GetGUIDLow(), e.action.setEventPhase.phase);
- break;
- }
+ {
+ SetPhase(e.action.setEventPhase.phase);
+ sLog->outDebug(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction:: SMART_ACTION_SET_EVENT_PHASE: Creature %u set event phase %u",
+ me->GetGUIDLow(), e.action.setEventPhase.phase);
+ break;
+ }
case SMART_ACTION_INC_EVENT_PHASE:
- {
- IncPhase(e.action.incEventPhase.inc);
- DecPhase(e.action.incEventPhase.dec);
+ {
+ IncPhase(e.action.incEventPhase.inc);
+ DecPhase(e.action.incEventPhase.dec);
- sLog->outDebug(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction:: SMART_ACTION_INC_EVENT_PHASE: Creature %u inc event phase by %u, "
- "decrease by %u", me->GetGUIDLow(), e.action.incEventPhase.inc, e.action.incEventPhase.dec);
- break;
- }
+ sLog->outDebug(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction:: SMART_ACTION_INC_EVENT_PHASE: Creature %u inc event phase by %u, "
+ "decrease by %u", me->GetGUIDLow(), e.action.incEventPhase.inc, e.action.incEventPhase.dec);
+ break;
+ }
case SMART_ACTION_EVADE:
- {
- if (!me)
- return;
-
- me->AI()->EnterEvadeMode();
- sLog->outDebug(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction:: SMART_ACTION_EVADE: Creature %u EnterEvadeMode", me->GetGUIDLow());
+ {
+ if (!me)
return;
- }
+
+ me->AI()->EnterEvadeMode();
+ sLog->outDebug(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction:: SMART_ACTION_EVADE: Creature %u EnterEvadeMode", me->GetGUIDLow());
+ return;
+ }
case SMART_ACTION_FLEE_FOR_ASSIST:
- {
- if (!me)
- return;
+ {
+ if (!me)
+ return;
- me->DoFleeToGetAssistance();
- sLog->outDebug(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction:: SMART_ACTION_FLEE_FOR_ASSIST: Creature %u DoFleeToGetAssistance", me->GetGUIDLow());
- break;
- }
+ me->DoFleeToGetAssistance();
+ sLog->outDebug(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction:: SMART_ACTION_FLEE_FOR_ASSIST: Creature %u DoFleeToGetAssistance", me->GetGUIDLow());
+ break;
+ }
case SMART_ACTION_CALL_GROUPEVENTHAPPENS:
+ {
+ if (IsPlayer(unit) && GetBaseObject())
{
- if (IsPlayer(unit) && GetBaseObject())
- {
- unit->ToPlayer()->GroupEventHappens(e.action.quest.quest, GetBaseObject());
- sLog->outDebug(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction: SMART_ACTION_CALL_GROUPEVENTHAPPENS: Player %u, group credit for quest %u",
- unit->GetGUIDLow(), e.action.quest.quest);
- }
- break;
+ unit->ToPlayer()->GroupEventHappens(e.action.quest.quest, GetBaseObject());
+ sLog->outDebug(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction: SMART_ACTION_CALL_GROUPEVENTHAPPENS: Player %u, group credit for quest %u",
+ unit->GetGUIDLow(), e.action.quest.quest);
}
+ break;
+ }
case SMART_ACTION_CALL_CASTEDCREATUREORGO:
- {
- if (!GetBaseObject())
- return;
+ {
+ if (!GetBaseObject())
+ return;
- ObjectList* targets = GetTargets(e, unit);
- if (!targets)
- return;
+ ObjectList* targets = GetTargets(e, unit);
+ if (!targets)
+ return;
- for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
+ for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
+ {
+ if (IsPlayer((*itr)))
{
- if (IsPlayer((*itr)))
- {
- (*itr)->ToPlayer()->CastedCreatureOrGO(e.action.castedCreatureOrGO.creature, GetBaseObject()->GetGUID(), e.action.castedCreatureOrGO.spell);
- sLog->outDebug(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction: SMART_ACTION_CALL_CASTEDCREATUREORGO: Player %u, target %u, spell %u",
- (*itr)->GetGUIDLow(), e.action.castedCreatureOrGO.creature, e.action.castedCreatureOrGO.spell);
- }
+ (*itr)->ToPlayer()->CastedCreatureOrGO(e.action.castedCreatureOrGO.creature, GetBaseObject()->GetGUID(), e.action.castedCreatureOrGO.spell);
+ sLog->outDebug(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction: SMART_ACTION_CALL_CASTEDCREATUREORGO: Player %u, target %u, spell %u",
+ (*itr)->GetGUIDLow(), e.action.castedCreatureOrGO.creature, e.action.castedCreatureOrGO.spell);
}
- break;
}
+
+ delete targets;
+ break;
+ }
case SMART_ACTION_REMOVEAURASFROMSPELL:
- {
- ObjectList* targets = GetTargets(e, unit);
- if (!targets)
- return;
+ {
+ ObjectList* targets = GetTargets(e, unit);
+ if (!targets)
+ return;
- for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
- {
- if (!IsUnit((*itr)))
- continue;
+ for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
+ {
+ if (!IsUnit((*itr)))
+ continue;
- (*itr)->ToUnit()->RemoveAurasDueToSpell(e.action.removeAura.spell);
- sLog->outDebug(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction: SMART_ACTION_REMOVEAURASFROMSPELL: Unit %u, spell %u",
- (*itr)->GetGUIDLow(), e.action.removeAura.spell);
- }
- break;
+ (*itr)->ToUnit()->RemoveAurasDueToSpell(e.action.removeAura.spell);
+ sLog->outDebug(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction: SMART_ACTION_REMOVEAURASFROMSPELL: Unit %u, spell %u",
+ (*itr)->GetGUIDLow(), e.action.removeAura.spell);
}
+
+ delete targets;
+ break;
+ }
case SMART_ACTION_FOLLOW:
- {
- if (!IsSmart())
- return;
+ {
+ if (!IsSmart())
+ return;
- ObjectList* targets = GetTargets(e, unit);
- if (!targets)
- return;
+ ObjectList* targets = GetTargets(e, unit);
+ if (!targets)
+ return;
- for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
+ for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
+ {
+ if (IsUnit((*itr)))
{
- if (IsUnit((*itr)))
- {
- CAST_AI(SmartAI, me->AI())->SetFollow((*itr)->ToUnit(), (float)e.action.follow.dist, (float)e.action.follow.angle, e.action.follow.credit, e.action.follow.entry, e.action.follow.creditType);
- sLog->outDebug(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction: SMART_ACTION_FOLLOW: Creature %u following target %u",
- me->GetGUIDLow(), (*itr)->GetGUIDLow());
- return;
- }
+ CAST_AI(SmartAI, me->AI())->SetFollow((*itr)->ToUnit(), (float)e.action.follow.dist, (float)e.action.follow.angle, e.action.follow.credit, e.action.follow.entry, e.action.follow.creditType);
+ sLog->outDebug(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction: SMART_ACTION_FOLLOW: Creature %u following target %u",
+ me->GetGUIDLow(), (*itr)->GetGUIDLow());
+ return;
}
- break;
}
+
+ delete targets;
+ break;
+ }
case SMART_ACTION_RANDOM_PHASE:
+ {
+ uint32 phases[SMART_ACTION_PARAM_COUNT];
+ phases[0] = e.action.randomPhase.phase1;
+ phases[1] = e.action.randomPhase.phase2;
+ phases[2] = e.action.randomPhase.phase3;
+ phases[3] = e.action.randomPhase.phase4;
+ phases[4] = e.action.randomPhase.phase5;
+ phases[5] = e.action.randomPhase.phase6;
+ uint32 temp[SMART_ACTION_PARAM_COUNT];
+ uint32 count = 0;
+ for (uint8 i = 0; i < SMART_ACTION_PARAM_COUNT; i++)
{
- uint32 phases[SMART_ACTION_PARAM_COUNT];
- phases[0] = e.action.randomPhase.phase1;
- phases[1] = e.action.randomPhase.phase2;
- phases[2] = e.action.randomPhase.phase3;
- phases[3] = e.action.randomPhase.phase4;
- phases[4] = e.action.randomPhase.phase5;
- phases[5] = e.action.randomPhase.phase6;
- uint32 temp[SMART_ACTION_PARAM_COUNT];
- uint32 count = 0;
- for (uint8 i = 0; i < SMART_ACTION_PARAM_COUNT; i++)
+ if (phases[i] > 0)
{
- if (phases[i] > 0)
- {
- temp[count] = phases[i];
- count++;
- }
+ temp[count] = phases[i];
+ count++;
}
-
- uint32 phase = temp[urand(0, count)];
- SetPhase(phase);
- sLog->outDebug(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction: SMART_ACTION_RANDOM_PHASE: Creature %u sets event phase to %u",
- me->GetGUIDLow(), phase);
- break;
}
+
+ uint32 phase = temp[urand(0, count)];
+ SetPhase(phase);
+ sLog->outDebug(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction: SMART_ACTION_RANDOM_PHASE: Creature %u sets event phase to %u",
+ me->GetGUIDLow(), phase);
+ break;
+ }
case SMART_ACTION_RANDOM_PHASE_RANGE:
- {
- uint32 phase = urand(e.action.randomPhaseRange.phaseMin, e.action.randomPhaseRange.phaseMax);
- SetPhase(phase);
- sLog->outDebug(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction: SMART_ACTION_RANDOM_PHASE_RANGE: Creature %u sets event phase to %u",
- me->GetGUIDLow(), phase);
- break;
- }
+ {
+ uint32 phase = urand(e.action.randomPhaseRange.phaseMin, e.action.randomPhaseRange.phaseMax);
+ SetPhase(phase);
+ sLog->outDebug(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction: SMART_ACTION_RANDOM_PHASE_RANGE: Creature %u sets event phase to %u",
+ me->GetGUIDLow(), phase);
+ break;
+ }
case SMART_ACTION_CALL_KILLEDMONSTER:
- {
- Player* pPlayer = NULL;
- if (me)
- pPlayer = me->GetLootRecipient();
-
- if (me && pPlayer)
- pPlayer->RewardPlayerAndGroupAtEvent(e.action.killedMonster.creature, pPlayer);
-
- else if (GetBaseObject())
- {
- ObjectList* targets = GetTargets(e, unit);
- if (!targets)
- return;
+ {
+ Player* pPlayer = NULL;
+ if (me)
+ pPlayer = me->GetLootRecipient();
- for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
- {
- if (!IsPlayer((*itr)))
- continue;
+ if (me && pPlayer)
+ pPlayer->RewardPlayerAndGroupAtEvent(e.action.killedMonster.creature, pPlayer);
- (*itr)->ToPlayer()->RewardPlayerAndGroupAtEvent(e.action.killedMonster.creature, (*itr)->ToPlayer());
- sLog->outDebug(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction: SMART_ACTION_CALL_KILLEDMONSTER: Player %u, Killcredit: %u",
- (*itr)->GetGUIDLow(), e.action.killedMonster.creature);
- }
- }
- else if (trigger && IsPlayer(unit))
- {
- unit->ToPlayer()->RewardPlayerAndGroupAtEvent(e.action.killedMonster.creature, unit);
- sLog->outDebug(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction: SMART_ACTION_CALL_KILLEDMONSTER: (trigger == true) Player %u, Killcredit: %u",
- unit->GetGUIDLow(), e.action.killedMonster.creature);
- }
- break;
- }
- case SMART_ACTION_SET_INST_DATA:
+ else if (GetBaseObject())
{
- WorldObject* obj = GetBaseObject();
- if (!obj)
- obj = unit;
-
- if (!obj)
+ ObjectList* targets = GetTargets(e, unit);
+ if (!targets)
return;
- InstanceScript* pInst = (InstanceScript*)obj->GetInstanceScript();
- if (!pInst)
+ for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
{
- sLog->outErrorDb("SmartScript: Event %u attempt to set instance data without instance script. EntryOrGuid %d", e.GetEventType(), e.entryOrGuid);
- return;
+ if (!IsPlayer((*itr)))
+ continue;
+
+ (*itr)->ToPlayer()->RewardPlayerAndGroupAtEvent(e.action.killedMonster.creature, (*itr)->ToPlayer());
+ sLog->outDebug(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction: SMART_ACTION_CALL_KILLEDMONSTER: Player %u, Killcredit: %u",
+ (*itr)->GetGUIDLow(), e.action.killedMonster.creature);
}
- pInst->SetData(e.action.setInstanceData.field, e.action.setInstanceData.data);
- sLog->outDebug(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction: SMART_ACTION_SET_INST_DATA: Field: %u, data: %u",
- e.action.setInstanceData.field, e.action.setInstanceData.data);
- break;
+ delete targets;
}
- case SMART_ACTION_SET_INST_DATA64:
+ else if (trigger && IsPlayer(unit))
{
- WorldObject* obj = GetBaseObject();
- if (!obj)
- obj = unit;
+ unit->ToPlayer()->RewardPlayerAndGroupAtEvent(e.action.killedMonster.creature, unit);
+ sLog->outDebug(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction: SMART_ACTION_CALL_KILLEDMONSTER: (trigger == true) Player %u, Killcredit: %u",
+ unit->GetGUIDLow(), e.action.killedMonster.creature);
+ }
+ break;
+ }
+ case SMART_ACTION_SET_INST_DATA:
+ {
+ WorldObject* obj = GetBaseObject();
+ if (!obj)
+ obj = unit;
- if (!obj)
- return;
+ if (!obj)
+ return;
- InstanceScript* pInst = (InstanceScript*)obj->GetInstanceScript();
- if (!pInst)
- {
- sLog->outErrorDb("SmartScript: Event %u attempt to set instance data without instance script. EntryOrGuid %d", e.GetEventType(), e.entryOrGuid);
- return;
- }
+ InstanceScript* pInst = (InstanceScript*)obj->GetInstanceScript();
+ if (!pInst)
+ {
+ sLog->outErrorDb("SmartScript: Event %u attempt to set instance data without instance script. EntryOrGuid %d", e.GetEventType(), e.entryOrGuid);
+ return;
+ }
- ObjectList* targets = GetTargets(e, unit);
- if (!targets)
- return;
+ pInst->SetData(e.action.setInstanceData.field, e.action.setInstanceData.data);
+ sLog->outDebug(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction: SMART_ACTION_SET_INST_DATA: Field: %u, data: %u",
+ e.action.setInstanceData.field, e.action.setInstanceData.data);
+ break;
+ }
+ case SMART_ACTION_SET_INST_DATA64:
+ {
+ WorldObject* obj = GetBaseObject();
+ if (!obj)
+ obj = unit;
- for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
- {
- pInst->SetData64(e.action.setInstanceData64.field, (*itr)->GetGUID());
- sLog->outDebug(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction: SMART_ACTION_SET_INST_DATA64: Field: %u, data: "UI64FMTD,
- e.action.setInstanceData64.field, (*itr)->GetGUID());
- return;
- }
+ if (!obj)
+ return;
- break;
+ InstanceScript* pInst = (InstanceScript*)obj->GetInstanceScript();
+ if (!pInst)
+ {
+ sLog->outErrorDb("SmartScript: Event %u attempt to set instance data without instance script. EntryOrGuid %d", e.GetEventType(), e.entryOrGuid);
+ return;
}
+
+ ObjectList* targets = GetTargets(e, unit);
+ if (!targets)
+ return;
+
+ pInst->SetData64(e.action.setInstanceData64.field, targets->front()->GetGUID());
+ sLog->outDebug(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction: SMART_ACTION_SET_INST_DATA64: Field: %u, data: "UI64FMTD,
+ e.action.setInstanceData64.field, targets->front()->GetGUID());
+
+ delete targets;
+ break;
+ }
case SMART_ACTION_UPDATE_TEMPLATE:
- {
- if (!me || me->GetEntry() == e.action.updateTemplate.creature)
- return;
+ {
+ if (!me || me->GetEntry() == e.action.updateTemplate.creature)
+ return;
- me->UpdateEntry(e.action.updateTemplate.creature, e.action.updateTemplate.team ? HORDE : ALLIANCE);
- sLog->outDebug(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction: SMART_ACTION_UPDATE_TEMPLATE: Creature %u, Template: %u, Team: %u",
- me->GetGUIDLow(), e.action.updateTemplate.team ? HORDE : ALLIANCE);
- break;
- }
+ me->UpdateEntry(e.action.updateTemplate.creature, e.action.updateTemplate.team ? HORDE : ALLIANCE);
+ sLog->outDebug(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction: SMART_ACTION_UPDATE_TEMPLATE: Creature %u, Template: %u, Team: %u",
+ me->GetGUIDLow(), e.action.updateTemplate.team ? HORDE : ALLIANCE);
+ break;
+ }
case SMART_ACTION_DIE:
+ {
+ if (me && !me->isDead())
{
- if (me && !me->isDead())
- {
- me->Kill(me);
- sLog->outDebug(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction: SMART_ACTION_DIE: Creature %u", me->GetGUIDLow());
- }
- break;
+ me->Kill(me);
+ sLog->outDebug(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction: SMART_ACTION_DIE: Creature %u", me->GetGUIDLow());
}
+ break;
+ }
case SMART_ACTION_SET_IN_COMBAT_WITH_ZONE:
+ {
+ if (me)
{
- if (me)
- {
- me->SetInCombatWithZone();
- sLog->outDebug(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction: SMART_ACTION_SET_IN_COMBAT_WITH_ZONE: Creature %u", me->GetGUIDLow());
- }
- break;
+ me->SetInCombatWithZone();
+ sLog->outDebug(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction: SMART_ACTION_SET_IN_COMBAT_WITH_ZONE: Creature %u", me->GetGUIDLow());
}
+ break;
+ }
case SMART_ACTION_CALL_FOR_HELP:
+ {
+ if (me)
{
- if (me)
- {
- me->CallForHelp((float)e.action.callHelp.range);
- sLog->outDebug(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction: SMART_ACTION_CALL_FOR_HELP: Creature %u", me->GetGUIDLow());
- }
- break;
+ me->CallForHelp((float)e.action.callHelp.range);
+ sLog->outDebug(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction: SMART_ACTION_CALL_FOR_HELP: Creature %u", me->GetGUIDLow());
}
+ break;
+ }
case SMART_ACTION_SET_SHEATH:
+ {
+ if (me)
{
- if (me)
- {
- me->SetSheath(SheathState(e.action.setSheath.sheath));
- sLog->outDebug(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction: SMART_ACTION_SET_SHEATH: Creature %u, State: %u",
- me->GetGUIDLow(), e.action.setSheath.sheath);
- }
- break;
+ me->SetSheath(SheathState(e.action.setSheath.sheath));
+ sLog->outDebug(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction: SMART_ACTION_SET_SHEATH: Creature %u, State: %u",
+ me->GetGUIDLow(), e.action.setSheath.sheath);
}
+ break;
+ }
case SMART_ACTION_FORCE_DESPAWN:
- {
- if (!IsSmart()) return;
- CAST_AI(SmartAI, me->AI())->SetDespawnTime(e.action.forceDespawn.delay + 1);//next tick
- CAST_AI(SmartAI, me->AI())->StartDespawn();
- break;
- }
+ {
+ if (!IsSmart())
+ return;
+ CAST_AI(SmartAI, me->AI())->SetDespawnTime(e.action.forceDespawn.delay + 1);//next tick
+ CAST_AI(SmartAI, me->AI())->StartDespawn();
+ break;
+ }
case SMART_ACTION_SET_INGAME_PHASE_MASK:
- {
- if (GetBaseObject())
- GetBaseObject()->SetPhaseMask(e.action.ingamePhaseMask.mask, true);
- break;
- }
+ {
+ if (GetBaseObject())
+ GetBaseObject()->SetPhaseMask(e.action.ingamePhaseMask.mask, true);
+ break;
+ }
case SMART_ACTION_MOUNT_TO_ENTRY_OR_MODEL:
+ {
+ ObjectList* targets = GetTargets(e, unit);
+ if (!targets)
+ return;
+ for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
{
- ObjectList* targets = GetTargets(e, unit);
- if (!targets) return;
- for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
+ if(!IsUnit((*itr))) continue;
+ if (e.action.morphOrMount.creature || e.action.morphOrMount.model)
{
- if(!IsUnit((*itr))) continue;
- if (e.action.morphOrMount.creature || e.action.morphOrMount.model)
+ if (e.action.morphOrMount.creature > 0)
{
- if (e.action.morphOrMount.creature > 0)
+ if (CreatureInfo const* cInfo = GetCreatureTemplateStore(e.action.morphOrMount.creature))
{
- if (CreatureInfo const* cInfo = GetCreatureTemplateStore(e.action.morphOrMount.creature))
- {
- uint32 display_id = sObjectMgr->ChooseDisplayId(0, cInfo);
- (*itr)->ToUnit()->Mount(display_id);
- }
+ uint32 display_id = sObjectMgr->ChooseDisplayId(0, cInfo);
+ (*itr)->ToUnit()->Mount(display_id);
}
- else
- (*itr)->ToUnit()->Mount(e.action.morphOrMount.model);
}
else
- (*itr)->ToUnit()->Unmount();
+ (*itr)->ToUnit()->Mount(e.action.morphOrMount.model);
}
- break;
- }
- case SMART_ACTION_SET_INVINCIBILITY_HP_LEVEL:
- {
- if (!GetBaseObject()) return;
- if (e.action.invincHP.minHP)
- mInvinceabilityHpLevel = me->CountPctFromMaxHealth(e.action.invincHP.minHP);
else
- mInvinceabilityHpLevel = e.action.invincHP.minHP;
- break;
+ (*itr)->ToUnit()->Unmount();
}
+
+ delete targets;
+ break;
+ }
+ case SMART_ACTION_SET_INVINCIBILITY_HP_LEVEL:
+ {
+ if (!GetBaseObject())
+ return;
+ if (e.action.invincHP.minHP)
+ mInvinceabilityHpLevel = me->CountPctFromMaxHealth(e.action.invincHP.minHP);
+ else
+ mInvinceabilityHpLevel = e.action.invincHP.minHP;
+ break;
+ }
case SMART_ACTION_SET_DATA:
+ {
+ ObjectList* targets = GetTargets(e, unit);
+ if (!targets)
+ return;
+
+ for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
{
- ObjectList* targets = GetTargets(e, unit);
- if (!targets) return;
- for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
- {
- if (IsCreature((*itr)))
- (*itr)->ToCreature()->AI()->SetData(e.action.setData.field, e.action.setData.data);
- if (IsGameObject((*itr)))
- (*itr)->ToGameObject()->AI()->SetData(e.action.setData.field, e.action.setData.data);
- return;
- }
- break;
+ if (IsCreature((*itr)))
+ (*itr)->ToCreature()->AI()->SetData(e.action.setData.field, e.action.setData.data);
+ else if (IsGameObject((*itr)))
+ (*itr)->ToGameObject()->AI()->SetData(e.action.setData.field, e.action.setData.data);
}
+
+ delete targets;
+ break;
+ }
case SMART_ACTION_MOVE_FORWARD:
- {
- if (!me) return;
- float x,y,z;
- me->GetClosePoint(x, y, z, me->GetObjectSize() / 3, (float)e.action.moveRandom.distance);
- me->GetMotionMaster()->MovePoint(SMART_RANDOM_POINT,x,y,z);
- break;
- }
+ {
+ if (!me)
+ return;
+ float x, y, z;
+ me->GetClosePoint(x, y, z, me->GetObjectSize() / 3, (float)e.action.moveRandom.distance);
+ me->GetMotionMaster()->MovePoint(SMART_RANDOM_POINT, x, y, z);
+ break;
+ }
case SMART_ACTION_SET_VISIBILITY:
- {
- if (me)
- me->SetVisible(e.action.visibility.state ? true : false);
- break;
- }
+ {
+ if (me)
+ me->SetVisible(e.action.visibility.state ? true : false);
+ break;
+ }
case SMART_ACTION_SET_ACTIVE:
- {
- if (GetBaseObject())
- GetBaseObject()->setActive(true);
- break;
- }
+ {
+ if (GetBaseObject())
+ GetBaseObject()->setActive(true);
+ break;
+ }
case SMART_ACTION_ATTACK_START:
+ {
+ if (!me)
+ return;
+
+ ObjectList* targets = GetTargets(e, unit);
+ if (!targets)
+ return;
+
+ for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
{
- if (!me) return;
- ObjectList* targets = GetTargets(e, unit);
- if (!targets) return;
- for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
+ if (IsUnit(*itr))
{
- if (IsUnit((*itr)))
- me->AI()->AttackStart((*itr)->ToUnit());
+ me->AI()->AttackStart((*itr)->ToUnit());
+ delete targets;
return;
}
- break;
}
+ break;
+ }
case SMART_ACTION_SUMMON_CREATURE:
+ {
+ WorldObject* obj = GetBaseObject();
+ if (!obj)
+ obj = unit;
+ float x, y, z, o;
+ ObjectList* targets = GetTargets(e, unit);
+ if (targets)
{
- WorldObject* obj = GetBaseObject();
- if (!obj)
- obj = unit;
- float x,y,z,o;;
- ObjectList* targets = GetTargets(e, unit);
- if (targets)
- {
- for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
- {
- if(!IsUnit((*itr))) continue;
- (*itr)->GetPosition(x,y,z,o);
- if (Creature* summon = GetBaseObject()->SummonCreature(e.action.summonCreature.creature, x, y, z, o, (TempSummonType)e.action.summonCreature.type, e.action.summonCreature.duration))
- {
- if (unit && e.action.summonCreature.attackInvoker)
- {
- summon->AI()->AttackStart((*itr)->ToUnit());
- }
- }
- }
- }
- if (e.GetTargetType() != SMART_TARGET_POSITION)
- return;
- if (Creature* summon = GetBaseObject()->SummonCreature(e.action.summonCreature.creature, e.target.x, e.target.y, e.target.z, e.target.o, (TempSummonType)e.action.summonCreature.type, e.action.summonCreature.duration))
+ for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
{
- if (unit && e.action.summonCreature.attackInvoker)
- summon->AI()->AttackStart(unit);
+ if (!IsUnit(*itr))
+ continue;
+
+ (*itr)->GetPosition(x, y, z, o);
+ if (Creature* summon = GetBaseObject()->SummonCreature(e.action.summonCreature.creature, x, y, z, o, (TempSummonType)e.action.summonCreature.type, e.action.summonCreature.duration))
+ if (unit && e.action.summonCreature.attackInvoker)
+ summon->AI()->AttackStart((*itr)->ToUnit());
}
- break;
+
+ delete targets;
}
+
+ if (e.GetTargetType() != SMART_TARGET_POSITION)
+ return;
+
+ if (Creature* summon = GetBaseObject()->SummonCreature(e.action.summonCreature.creature, e.target.x, e.target.y, e.target.z, e.target.o, (TempSummonType)e.action.summonCreature.type, e.action.summonCreature.duration))
+ if (unit && e.action.summonCreature.attackInvoker)
+ summon->AI()->AttackStart(unit);
+ break;
+ }
case SMART_ACTION_SUMMON_GO:
+ {
+ if (!GetBaseObject())
+ return;
+
+ float x, y, z, o;
+ ObjectList* targets = GetTargets(e, unit);
+ if (targets)
{
- if (!GetBaseObject()) return;
- float x,y,z,o;
- ObjectList* targets = GetTargets(e, unit);
- if (targets)
+ for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
{
- for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
- {
- if(!IsUnit((*itr))) continue;
- (*itr)->GetPosition(x,y,z,o);
- GetBaseObject()->SummonGameObject(e.action.summonGO.entry, x, y, z, o, 0, 0, 0, 0, e.action.summonGO.despawnTime);
- }
+ if (!IsUnit(*itr))
+ continue;
+
+ (*itr)->GetPosition(x, y, z, o);
+ GetBaseObject()->SummonGameObject(e.action.summonGO.entry, x, y, z, o, 0, 0, 0, 0, e.action.summonGO.despawnTime);
}
- if (e.GetTargetType() != SMART_TARGET_POSITION)
- return;
- GetBaseObject()->SummonGameObject(e.action.summonGO.entry, e.target.x, e.target.y, e.target.z, e.target.o, 0, 0, 0, 0, e.action.summonGO.despawnTime);
- break;
+
+ delete targets;
}
+
+ if (e.GetTargetType() != SMART_TARGET_POSITION)
+ return;
+
+ GetBaseObject()->SummonGameObject(e.action.summonGO.entry, e.target.x, e.target.y, e.target.z, e.target.o, 0, 0, 0, 0, e.action.summonGO.despawnTime);
+ break;
+ }
case SMART_ACTION_KILL_UNIT:
+ {
+ ObjectList* targets = GetTargets(e, unit);
+ if (!targets)
+ return;
+ for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
{
- ObjectList* targets = GetTargets(e, unit);
- if (!targets) return;
- for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
- {
- if(!IsUnit((*itr))) continue;
- (*itr)->ToUnit()->Kill((*itr)->ToUnit());
- }
- break;
+ if (!IsUnit(*itr))
+ continue;
+
+ (*itr)->ToUnit()->Kill((*itr)->ToUnit());
}
+
+ delete targets;
+ break;
+ }
case SMART_ACTION_INSTALL_AI_TEMPLATE:
- {
- InstallTemplate(e);
- break;
- }
+ {
+ InstallTemplate(e);
+ break;
+ }
case SMART_ACTION_ADD_ITEM:
+ {
+ ObjectList* targets = GetTargets(e, unit);
+ if (!targets)
+ return;
+
+ for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
{
- ObjectList* targets = GetTargets(e, unit);
- if (!targets) return;
- for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
- {
- if(!IsPlayer((*itr))) continue;
- (*itr)->ToPlayer()->AddItem(e.action.item.entry, e.action.item.count);
- }
- break;
+ if (!IsPlayer(*itr))
+ continue;
+
+ (*itr)->ToPlayer()->AddItem(e.action.item.entry, e.action.item.count);
}
+
+ delete targets;
+ break;
+ }
case SMART_ACTION_REMOVE_ITEM:
+ {
+ ObjectList* targets = GetTargets(e, unit);
+ if (!targets)
+ return;
+
+ for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
{
- ObjectList* targets = GetTargets(e, unit);
- if (!targets) return;
- for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
- {
- if(!IsPlayer((*itr))) continue;
- (*itr)->ToPlayer()->DestroyItemCount(e.action.item.entry, e.action.item.count, true);
- }
- break;
+ if (!IsPlayer(*itr))
+ continue;
+
+ (*itr)->ToPlayer()->DestroyItemCount(e.action.item.entry, e.action.item.count, true);
}
+
+ delete targets;
+ break;
+ }
case SMART_ACTION_STORE_VARIABLE_DECIMAL:
- {
- if(mStoredDecimals.find(e.action.storeVar.id) != mStoredDecimals.end())
- mStoredDecimals.erase(e.action.storeVar.id);
- mStoredDecimals[e.action.storeVar.id] = e.action.storeVar.number;
- break;
- }
+ {
+ if (mStoredDecimals.find(e.action.storeVar.id) != mStoredDecimals.end())
+ mStoredDecimals.erase(e.action.storeVar.id);
+ mStoredDecimals[e.action.storeVar.id] = e.action.storeVar.number;
+ break;
+ }
case SMART_ACTION_STORE_TARGET_LIST:
- {
- ObjectList* targets = GetTargets(e, unit);
- StoreTargetList(targets, e.action.storeTargets.id);
- break;
- }
+ {
+ ObjectList* targets = GetTargets(e, unit);
+ StoreTargetList(targets, e.action.storeTargets.id);
+ break;
+ }
case SMART_ACTION_TELEPORT:
+ {
+ ObjectList* targets = GetTargets(e, unit);
+ if (!targets)
+ return;
+
+ for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
{
- ObjectList* targets = GetTargets(e, unit);
- if (!targets) return;
- for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
- {
- if(!IsPlayer((*itr))) continue;
- (*itr)->ToPlayer()->TeleportTo(e.action.teleport.mapID, e.target.x, e.target.y, e.target.z, e.target.o);
- }
- break;
+ if (!IsPlayer(*itr))
+ continue;
+
+ (*itr)->ToPlayer()->TeleportTo(e.action.teleport.mapID, e.target.x, e.target.y, e.target.z, e.target.o);
}
+
+ delete targets;
+ break;
+ }
case SMART_ACTION_SET_FLY:
- {
- if (!IsSmart()) return;
- CAST_AI(SmartAI, me->AI())->SetFly(e.action.setFly.fly ? true : false);
- break;
- }
+ {
+ if (!IsSmart())
+ return;
+ CAST_AI(SmartAI, me->AI())->SetFly(e.action.setFly.fly ? true : false);
+ break;
+ }
case SMART_ACTION_SET_RUN:
- {
- if (!IsSmart()) return;
- CAST_AI(SmartAI, me->AI())->SetRun(e.action.setRun.run ? true : false);
- break;
- }
-
+ {
+ if (!IsSmart())
+ return;
+ CAST_AI(SmartAI, me->AI())->SetRun(e.action.setRun.run ? true : false);
+ break;
+ }
case SMART_ACTION_SET_SWIMM:
- {
- if (!IsSmart()) return;
- CAST_AI(SmartAI, me->AI())->SetSwimm(e.action.setSwimm.swimm ? true : false);
- break;
- }
+ {
+ if (!IsSmart())
+ return;
+ CAST_AI(SmartAI, me->AI())->SetSwimm(e.action.setSwimm.swimm ? true : false);
+ break;
+ }
case SMART_ACTION_WP_START:
- {
- if (!IsSmart()) return;
- bool run = e.action.wpStart.run ? true : false;
- uint32 entry = e.action.wpStart.pathID;
- bool repeat = e.action.wpStart.repeat ? true : false;
- ObjectList* targets = GetTargets(e, unit);
- StoreTargetList(targets, SMART_ESCORT_TARGETS);
- me->SetReactState((ReactStates)e.action.wpStart.reactState);
- CAST_AI(SmartAI, me->AI())->StartPath(run, entry, repeat, unit);
-
- uint32 quest = e.action.wpStart.quest;
- uint32 DespawnTime = e.action.wpStart.despawnTime;
- CAST_AI(SmartAI, me->AI())->mEscortQuestID = quest;
- CAST_AI(SmartAI, me->AI())->SetDespawnTime(DespawnTime);
- break;
- }
+ {
+ if (!IsSmart())
+ return;
+ bool run = e.action.wpStart.run ? true : false;
+ uint32 entry = e.action.wpStart.pathID;
+ bool repeat = e.action.wpStart.repeat ? true : false;
+ ObjectList* targets = GetTargets(e, unit);
+ StoreTargetList(targets, SMART_ESCORT_TARGETS);
+ me->SetReactState((ReactStates)e.action.wpStart.reactState);
+ CAST_AI(SmartAI, me->AI())->StartPath(run, entry, repeat, unit);
+
+ uint32 quest = e.action.wpStart.quest;
+ uint32 DespawnTime = e.action.wpStart.despawnTime;
+ CAST_AI(SmartAI, me->AI())->mEscortQuestID = quest;
+ CAST_AI(SmartAI, me->AI())->SetDespawnTime(DespawnTime);
+ break;
+ }
case SMART_ACTION_WP_PAUSE:
- {
- if (!IsSmart()) return;
- uint32 delay = e.action.wpPause.delay;
- CAST_AI(SmartAI, me->AI())->PausePath(delay, e.GetEventType() == SMART_EVENT_WAYPOINT_REACHED ? false : true);
- break;
- }
+ {
+ if (!IsSmart())
+ return;
+ uint32 delay = e.action.wpPause.delay;
+ CAST_AI(SmartAI, me->AI())->PausePath(delay, e.GetEventType() == SMART_EVENT_WAYPOINT_REACHED ? false : true);
+ break;
+ }
case SMART_ACTION_WP_STOP:
- {
- if (!IsSmart()) return;
- uint32 DespawnTime = e.action.wpStop.despawnTime;
- uint32 quest = e.action.wpStop.quest;
- bool fail = e.action.wpStop.fail ? true : false;
- CAST_AI(SmartAI, me->AI())->StopPath(DespawnTime, quest, fail);
- break;
- }
+ {
+ if (!IsSmart())
+ return;
+ uint32 DespawnTime = e.action.wpStop.despawnTime;
+ uint32 quest = e.action.wpStop.quest;
+ bool fail = e.action.wpStop.fail ? true : false;
+ CAST_AI(SmartAI, me->AI())->StopPath(DespawnTime, quest, fail);
+ break;
+ }
case SMART_ACTION_WP_RESUME:
- {
- if (!IsSmart()) return;
- CAST_AI(SmartAI, me->AI())->ResumePath();
- break;
- }
+ {
+ if (!IsSmart())
+ return;
+ CAST_AI(SmartAI, me->AI())->ResumePath();
+ break;
+ }
case SMART_ACTION_SET_ORIENTATION:
- {
- if (!me) return;
- ObjectList* targets = GetTargets(e, unit);
- if (e.GetTargetType() == SMART_TARGET_SELF)
- me->SetFacing(me->GetCreatureData()->orientation, NULL);
- else if (e.GetTargetType() == SMART_TARGET_POSITION)
- me->SetFacing(e.target.o, NULL);
- else if (targets && !targets->empty())
- me->SetFacing(0, (*targets->begin()));
- break;
- }
+ {
+ if (!me)
+ return;
+
+ ObjectList* targets = GetTargets(e, unit);
+ if (e.GetTargetType() == SMART_TARGET_SELF)
+ me->SetFacing(me->GetCreatureData()->orientation, NULL);
+ else if (e.GetTargetType() == SMART_TARGET_POSITION)
+ me->SetFacing(e.target.o, NULL);
+ else if (targets && !targets->empty())
+ me->SetFacing(0, (*targets->begin()));
+
+ delete targets;
+ break;
+ }
case SMART_ACTION_PLAYMOVIE:
- {
- ObjectList* targets = GetTargets(e, unit);
- if (!targets) return;
- for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
- {
- if(!IsPlayer((*itr))) continue;
- (*itr)->ToPlayer()->SendMovieStart(e.action.movie.entry);
- }
+ {
+ ObjectList* targets = GetTargets(e, unit);
+ if (!targets)
+ return;
- break;
- }
- case SMART_ACTION_MOVE_TO_POS:
+ for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
{
- if (!IsSmart()) return;
- bool run = e.action.setRun.run ? true : false;
- CAST_AI(SmartAI, me->AI())->SetRun(run);
- me->GetMotionMaster()->MovePoint(0, e.target.x, e.target.y , e.target.z);
- break;
+ if (!IsPlayer(*itr))
+ continue;
+ (*itr)->ToPlayer()->SendMovieStart(e.action.movie.entry);
}
+
+ delete targets;
+ break;
+ }
+ case SMART_ACTION_MOVE_TO_POS:
+ {
+ if (!IsSmart())
+ return;
+ bool run = e.action.setRun.run ? true : false;
+ CAST_AI(SmartAI, me->AI())->SetRun(run);
+ me->GetMotionMaster()->MovePoint(0, e.target.x, e.target.y , e.target.z);
+ break;
+ }
case SMART_ACTION_RESPAWN_TARGET:
{
ObjectList* targets = GetTargets(e, unit);
- if (!targets) return;
+ if (!targets)
+ return;
+
for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
{
- if(IsCreature((*itr)))
+ if (IsCreature(*itr))
(*itr)->ToCreature()->Respawn();
- if(IsGameObject((*itr)))
+ else if (IsGameObject(*itr))
(*itr)->ToGameObject()->Respawn();
}
+
+ delete targets;
break;
}
case SMART_ACTION_CLOSE_GOSSIP:
- {
- ObjectList* targets = GetTargets(e, unit);
- if (!targets) return;
- for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
- {
- if(IsPlayer((*itr)))
- (*itr)->ToPlayer()->PlayerTalkClass->CloseGossip();
- }
- break;
- }
+ {
+ ObjectList* targets = GetTargets(e, unit);
+ if (!targets)
+ return;
+
+ for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
+ if (IsPlayer(*itr))
+ (*itr)->ToPlayer()->PlayerTalkClass->CloseGossip();
+
+ delete targets;
+ break;
+ }
case SMART_ACTION_EQUIP:
+ {
+ ObjectList* targets = GetTargets(e, unit);
+ if (!targets)
+ return;
+
+ for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
{
- ObjectList* targets = GetTargets(e, unit);
- if (!targets) return;
- for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
+ if(Creature* npc = (*itr)->ToCreature())
{
- if(Creature* npc = (*itr)->ToCreature())
+ uint32 slot[3];
+ if (e.action.equip.entry)
{
- uint32 slot[3];
- if (e.action.equip.entry)
- {
- EquipmentInfo const *einfo = sObjectMgr->GetEquipmentInfo(e.action.equip.entry);
- if (!einfo)
- {
- sLog->outErrorDb("SmartScript: SMART_ACTION_EQUIP uses non-existent equipment info entry %u", e.action.equip.entry);
- return;
- }
- npc->SetCurrentEquipmentId(e.action.equip.entry);
- slot[0] = einfo->equipentry[0];
- slot[1] = einfo->equipentry[1];
- slot[2] = einfo->equipentry[2];
- }
- else
+ EquipmentInfo const *einfo = sObjectMgr->GetEquipmentInfo(e.action.equip.entry);
+ if (!einfo)
{
- slot[0] = e.action.equip.slot1;
- slot[1] = e.action.equip.slot2;
- slot[2] = e.action.equip.slot3;
+ sLog->outErrorDb("SmartScript: SMART_ACTION_EQUIP uses non-existent equipment info entry %u", e.action.equip.entry);
+ return;
}
- if (!e.action.equip.mask || e.action.equip.mask & 1)
- npc->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, slot[0]);
- if (!e.action.equip.mask || e.action.equip.mask & 2)
- npc->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, slot[1]);
- if (!e.action.equip.mask || e.action.equip.mask & 4)
- npc->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 2, slot[2]);
+ npc->SetCurrentEquipmentId(e.action.equip.entry);
+ slot[0] = einfo->equipentry[0];
+ slot[1] = einfo->equipentry[1];
+ slot[2] = einfo->equipentry[2];
}
+ else
+ {
+ slot[0] = e.action.equip.slot1;
+ slot[1] = e.action.equip.slot2;
+ slot[2] = e.action.equip.slot3;
+ }
+ if (!e.action.equip.mask || e.action.equip.mask & 1)
+ npc->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, slot[0]);
+ if (!e.action.equip.mask || e.action.equip.mask & 2)
+ npc->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, slot[1]);
+ if (!e.action.equip.mask || e.action.equip.mask & 4)
+ npc->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 2, slot[2]);
}
- break;
}
- case SMART_ACTION_CREATE_TIMED_EVENT:
- {
- SmartEvent ne;
- ne.type = (SMART_EVENT)SMART_EVENT_UPDATE;
- ne.event_chance = e.action.timeEvent.chance;
- if (!ne.event_chance) ne.event_chance = 100;
-
- ne.minMaxRepeat.min = e.action.timeEvent.min;
- ne.minMaxRepeat.max = e.action.timeEvent.max;
- ne.minMaxRepeat.repeatMin = e.action.timeEvent.repeatMin;
- ne.minMaxRepeat.repeatMax = e.action.timeEvent.repeatMax;
-
- if (!ne.minMaxRepeat.repeatMin && !ne.minMaxRepeat.repeatMax)
- ne.event_flags |= SMART_EVENT_FLAG_NOT_REPEATABLE;
-
- SmartAction ac;
- ac.type = (SMART_ACTION)SMART_ACTION_TRIGGER_TIMED_EVENT;
- ac.timeEvent.id = e.action.timeEvent.id;
- SmartScriptHolder ev;
- ev.event = ne;
- ev.event_id = e.action.timeEvent.id;
- ev.target = e.target;
- ev.action = ac;
- InitTimer(ev);
- mStoredEvents.push_back(ev);
+ delete targets;
+ break;
+ }
+ case SMART_ACTION_CREATE_TIMED_EVENT:
+ {
+ SmartEvent ne;
+ ne.type = (SMART_EVENT)SMART_EVENT_UPDATE;
+ ne.event_chance = e.action.timeEvent.chance;
+ if (!ne.event_chance) ne.event_chance = 100;
+
+ ne.minMaxRepeat.min = e.action.timeEvent.min;
+ ne.minMaxRepeat.max = e.action.timeEvent.max;
+ ne.minMaxRepeat.repeatMin = e.action.timeEvent.repeatMin;
+ ne.minMaxRepeat.repeatMax = e.action.timeEvent.repeatMax;
+
+ if (!ne.minMaxRepeat.repeatMin && !ne.minMaxRepeat.repeatMax)
+ ne.event_flags |= SMART_EVENT_FLAG_NOT_REPEATABLE;
+
+ SmartAction ac;
+ ac.type = (SMART_ACTION)SMART_ACTION_TRIGGER_TIMED_EVENT;
+ ac.timeEvent.id = e.action.timeEvent.id;
+
+ SmartScriptHolder ev;
+ ev.event = ne;
+ ev.event_id = e.action.timeEvent.id;
+ ev.target = e.target;
+ ev.action = ac;
+ InitTimer(ev);
+ mStoredEvents.push_back(ev);
- break;
- }
+ break;
+ }
case SMART_ACTION_TRIGGER_TIMED_EVENT:
- {
- ProcessEventsFor((SMART_EVENT)SMART_EVENT_TIMED_EVENT_TRIGGERED, NULL, e.action.timeEvent.id);
- break;
- }
+ ProcessEventsFor((SMART_EVENT)SMART_EVENT_TIMED_EVENT_TRIGGERED, NULL, e.action.timeEvent.id);
+ break;
case SMART_ACTION_REMOVE_TIMED_EVENT:
- {
- mRemIDs.push_back(e.action.timeEvent.id);
- break;
- }
+ mRemIDs.push_back(e.action.timeEvent.id);
+ break;
case SMART_ACTION_OVERRIDE_SCRIPT_BASE_OBJECT:
+ {
+ ObjectList* targets = GetTargets(e, unit);
+ if (!targets)
+ return;
+
+ for (ObjectList::iterator itr = targets->begin(); itr != targets->end(); itr++)
{
- ObjectList* targets = GetTargets(e, unit);
- if (!targets) return;
- for (ObjectList::iterator itr = targets->begin(); itr != targets->end(); itr++)
+ if (IsCreature(*itr))
{
- if (IsCreature(*itr))
- {
- if (!meOrigGUID)
- meOrigGUID = me?me->GetGUID():0;
- if (!goOrigGUID)
- goOrigGUID = go?go->GetGUID():0;
- go = NULL;
- me = (*itr)->ToCreature();
- return;
- }else if (IsGameObject((*itr)))
- {
- if (!meOrigGUID)
- meOrigGUID = me?me->GetGUID():0;
- if (!goOrigGUID)
- goOrigGUID = go?go->GetGUID():0;
- go = (*itr)->ToGameObject();
- me = NULL;
- return;
- }
+ if (!meOrigGUID)
+ meOrigGUID = me ? me->GetGUID() : 0;
+ if (!goOrigGUID)
+ goOrigGUID = go ? go->GetGUID() : 0;
+ go = NULL;
+ me = (*itr)->ToCreature();
+
+ delete targets;
+ return;
+ }
+ else if (IsGameObject(*itr))
+ {
+ if (!meOrigGUID)
+ meOrigGUID = me ? me->GetGUID() : 0;
+ if (!goOrigGUID)
+ goOrigGUID = go ? go->GetGUID() : 0;
+ go = (*itr)->ToGameObject();
+ me = NULL;
+
+ delete targets;
+ return;
}
- break;
}
+
+ delete targets;
+ break;
+ }
case SMART_ACTION_RESET_SCRIPT_BASE_OBJECT:
ResetBaseObject();
break;
@@ -1241,231 +1419,285 @@ void SmartScript::ProcessAction(SmartScriptHolder &e, Unit* unit, uint32 var0, u
OnReset();
break;
case SMART_ACTION_ENTER_VEHICLE:
+ {
+ if (!me)
+ return;
+
+ ObjectList* targets = GetTargets(e, unit);
+ if (!targets)
+ return;
+
+ for (ObjectList::iterator itr = targets->begin(); itr != targets->end(); itr++)
{
- if (!me) return;
- ObjectList* targets = GetTargets(e, unit);
- if (!targets) return;
- for (ObjectList::iterator itr = targets->begin(); itr != targets->end(); itr++)
+ if (IsUnit(*itr) && (*itr)->ToUnit()->GetVehicleKit())
{
- if (IsUnit(*itr) && (*itr)->ToUnit()->GetVehicleKit())
- {
- me->EnterVehicle((*itr)->ToUnit(), e.action.enterVehicle.seat);
- return;
- }
+ me->EnterVehicle((*itr)->ToUnit(), e.action.enterVehicle.seat);
+ delete targets;
+ return;
}
- break;
}
+
+ delete targets;
+ break;
+ }
case SMART_ACTION_CALL_TIMED_ACTIONLIST:
+ {
+ if (e.GetTargetType() == SMART_TARGET_NONE)
{
- if (e.GetTargetType() == SMART_TARGET_NONE)
- {
- sLog->outErrorDb("SmartScript: Entry %d SourceType %u Event %u Action %u is using TARGET_NONE(0) for Script9 target. Please correct target_type in database.", e.entryOrGuid, e.GetScriptType(), e.GetEventType(), e.GetActionType());
- return;
- }
- ObjectList* targets = GetTargets(e, unit);
- if (targets)
+ sLog->outErrorDb("SmartScript: Entry %d SourceType %u Event %u Action %u is using TARGET_NONE(0) for Script9 target. Please correct target_type in database.", e.entryOrGuid, e.GetScriptType(), e.GetEventType(), e.GetActionType());
+ return;
+ }
+
+ ObjectList* targets = GetTargets(e, unit);
+ if (targets)
+ {
+ for (ObjectList::iterator itr = targets->begin(); itr != targets->end(); itr++)
{
- for (ObjectList::iterator itr = targets->begin(); itr != targets->end(); itr++)
+ if (Creature* target = (*itr)->ToCreature())
{
- if (Creature* target = (*itr)->ToCreature())
- {
- if (IsSmart(target))
- CAST_AI(SmartAI, target->AI())->SetScript9(e, e.action.timedActionList.id, GetLastInvoker());
- } else if (GameObject* target = (*itr)->ToGameObject())
- {
- if (IsSmartGO(target))
- CAST_AI(SmartGameObjectAI, target->AI())->SetScript9(e, e.action.timedActionList.id, GetLastInvoker());
- }
+ if (IsSmart(target))
+ CAST_AI(SmartAI, target->AI())->SetScript9(e, e.action.timedActionList.id, GetLastInvoker());
+ }
+ else if (GameObject* target = (*itr)->ToGameObject())
+ {
+ if (IsSmartGO(target))
+ CAST_AI(SmartGameObjectAI, target->AI())->SetScript9(e, e.action.timedActionList.id, GetLastInvoker());
}
}
- break;
+
+ delete targets;
}
+ break;
+ }
case SMART_ACTION_SET_NPC_FLAG:
- {
- ObjectList* targets = GetTargets(e, unit);
- if (!targets) return;
- for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
- if (IsUnit((*itr)))
- (*itr)->ToUnit()->SetUInt32Value(UNIT_NPC_FLAGS, e.action.unitFlag.flag);
- break;
- }
+ {
+ ObjectList* targets = GetTargets(e, unit);
+ if (!targets)
+ return;
+
+ for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
+ if (IsUnit(*itr))
+ (*itr)->ToUnit()->SetUInt32Value(UNIT_NPC_FLAGS, e.action.unitFlag.flag);
+
+ delete targets;
+ break;
+ }
case SMART_ACTION_ADD_NPC_FLAG:
- {
- ObjectList* targets = GetTargets(e, unit);
- if (!targets) return;
- for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
- if (IsUnit((*itr)))
- (*itr)->ToUnit()->SetFlag(UNIT_NPC_FLAGS, e.action.unitFlag.flag);
- break;
- }
+ {
+ ObjectList* targets = GetTargets(e, unit);
+ if (!targets)
+ return;
+
+ for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
+ if (IsUnit(*itr))
+ (*itr)->ToUnit()->SetFlag(UNIT_NPC_FLAGS, e.action.unitFlag.flag);
+
+ delete targets;
+ break;
+ }
case SMART_ACTION_REMOVE_NPC_FLAG:
+ {
+ ObjectList* targets = GetTargets(e, unit);
+ if (!targets)
+ return;
+
+ for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
+ if (IsUnit(*itr))
+ (*itr)->ToUnit()->RemoveFlag(UNIT_NPC_FLAGS, e.action.unitFlag.flag);
+
+ delete targets;
+ break;
+ }
+ case SMART_ACTION_CROSS_CAST:
+ {
+ ObjectList* casters = GetTargets(CreateEvent(SMART_EVENT_UPDATE_IC, 0, 0, 0, 0, 0, SMART_ACTION_NONE, 0, 0, 0, 0, 0, 0, (SMARTAI_TARGETS)e.action.cast.targetType, e.action.cast.targetParam1, e.action.cast.targetParam2, e.action.cast.targetParam3, 0), unit);
+ if (!casters)
+ return;
+
+ ObjectList* targets = GetTargets(e, unit);
+ if (!targets)
{
- ObjectList* targets = GetTargets(e, unit);
- if (!targets) return;
- for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
- if (IsUnit((*itr)))
- (*itr)->ToUnit()->RemoveFlag(UNIT_NPC_FLAGS, e.action.unitFlag.flag);
- break;
+ delete casters; // casters already validated, delete now
+ return;
}
- case SMART_ACTION_CROSS_CAST:
+
+ for (ObjectList::const_iterator itr = casters->begin(); itr != casters->end(); itr++)
{
- ObjectList* casters = GetTargets(CreateEvent(SMART_EVENT_UPDATE_IC,0,0,0,0,0,SMART_ACTION_NONE,0,0,0,0,0,0,(SMARTAI_TARGETS)e.action.cast.targetType,e.action.cast.targetParam1,e.action.cast.targetParam2,e.action.cast.targetParam3,0), unit);
- ObjectList* targets = GetTargets(e, unit);
- if (!targets || !casters) return;
- for (ObjectList::const_iterator itr = casters->begin(); itr != casters->end(); itr++)
+ if (IsUnit(*itr))
{
- if (IsUnit((*itr)))
- {
- if (e.action.cast.flags & SMARTCAST_INTERRUPT_PREVIOUS)
- (*itr)->ToUnit()->InterruptNonMeleeSpells(false);
+ if (e.action.cast.flags & SMARTCAST_INTERRUPT_PREVIOUS)
+ (*itr)->ToUnit()->InterruptNonMeleeSpells(false);
- for (ObjectList::const_iterator it = targets->begin(); it != targets->end(); it++)
- {
- if (IsUnit((*it)))
- {
- (*itr)->ToUnit()->CastSpell((*it)->ToUnit(), e.action.cast.spell,(e.action.cast.flags & SMARTCAST_TRIGGERED) ? true : false);
- }
- }
- }
+ for (ObjectList::const_iterator it = targets->begin(); it != targets->end(); it++)
+ if (IsUnit(*it))
+ (*itr)->ToUnit()->CastSpell((*it)->ToUnit(), e.action.cast.spell, (e.action.cast.flags & SMARTCAST_TRIGGERED) ? true : false);
}
- break;
}
+
+ delete targets;
+ delete casters;
+ break;
+ }
case SMART_ACTION_CALL_RANDOM_TIMED_ACTIONLIST:
+ {
+ uint32 actions[SMART_ACTION_PARAM_COUNT];
+ actions[0] = e.action.randTimedActionList.entry1;
+ actions[1] = e.action.randTimedActionList.entry2;
+ actions[2] = e.action.randTimedActionList.entry3;
+ actions[3] = e.action.randTimedActionList.entry4;
+ actions[4] = e.action.randTimedActionList.entry5;
+ actions[5] = e.action.randTimedActionList.entry6;
+ uint32 temp[SMART_ACTION_PARAM_COUNT];
+ uint32 count = 0;
+ for (uint8 i = 0; i < SMART_ACTION_PARAM_COUNT; i++)
{
- uint32 actions[SMART_ACTION_PARAM_COUNT];
- actions[0] = e.action.randTimedActionList.entry1;
- actions[1] = e.action.randTimedActionList.entry2;
- actions[2] = e.action.randTimedActionList.entry3;
- actions[3] = e.action.randTimedActionList.entry4;
- actions[4] = e.action.randTimedActionList.entry5;
- actions[5] = e.action.randTimedActionList.entry6;
- uint32 temp[SMART_ACTION_PARAM_COUNT];
- uint32 count = 0;
- for (uint8 i = 0; i < SMART_ACTION_PARAM_COUNT; i++)
+ if (actions[i] > 0)
{
- if (actions[i] > 0)
- {
- temp[count] = actions[i];
- count++;
- }
+ temp[count] = actions[i];
+ ++count;
}
- uint32 id = temp[urand(0, count)];
- if (e.GetTargetType() == SMART_TARGET_NONE)
- {
- sLog->outErrorDb("SmartScript: Entry %d SourceType %u Event %u Action %u is using TARGET_NONE(0) for Script9 target. Please correct target_type in database.", e.entryOrGuid, e.GetScriptType(), e.GetEventType(), e.GetActionType());
- return;
- }
- ObjectList* targets = GetTargets(e, unit);
- if (targets)
+ }
+
+ uint32 id = temp[urand(0, count)];
+ if (e.GetTargetType() == SMART_TARGET_NONE)
+ {
+ sLog->outErrorDb("SmartScript: Entry %d SourceType %u Event %u Action %u is using TARGET_NONE(0) for Script9 target. Please correct target_type in database.", e.entryOrGuid, e.GetScriptType(), e.GetEventType(), e.GetActionType());
+ return;
+ }
+
+ ObjectList* targets = GetTargets(e, unit);
+ if (targets)
+ {
+ for (ObjectList::iterator itr = targets->begin(); itr != targets->end(); itr++)
{
- for (ObjectList::iterator itr = targets->begin(); itr != targets->end(); itr++)
+ if (Creature* target = (*itr)->ToCreature())
{
- if (Creature* target = (*itr)->ToCreature())
- {
- if (IsSmart(target))
- CAST_AI(SmartAI, target->AI())->SetScript9(e, id, GetLastInvoker());
- } else if (GameObject* target = (*itr)->ToGameObject())
- {
- if (IsSmartGO(target))
- CAST_AI(SmartGameObjectAI, target->AI())->SetScript9(e, id, GetLastInvoker());
- }
+ if (IsSmart(target))
+ CAST_AI(SmartAI, target->AI())->SetScript9(e, id, GetLastInvoker());
+ }
+ else if (GameObject* target = (*itr)->ToGameObject())
+ {
+ if (IsSmartGO(target))
+ CAST_AI(SmartGameObjectAI, target->AI())->SetScript9(e, id, GetLastInvoker());
}
}
- break;
+
+ delete targets;
}
+ break;
+ }
case SMART_ACTION_CALL_RANDOM_RANGE_TIMED_ACTIONLIST:
+ {
+ uint32 id = urand(e.action.randTimedActionList.entry1, e.action.randTimedActionList.entry2);
+ if (e.GetTargetType() == SMART_TARGET_NONE)
{
- uint32 id = urand(e.action.randTimedActionList.entry1, e.action.randTimedActionList.entry2);
- if (e.GetTargetType() == SMART_TARGET_NONE)
- {
- sLog->outErrorDb("SmartScript: Entry %d SourceType %u Event %u Action %u is using TARGET_NONE(0) for Script9 target. Please correct target_type in database.", e.entryOrGuid, e.GetScriptType(), e.GetEventType(), e.GetActionType());
- return;
- }
- ObjectList* targets = GetTargets(e, unit);
- if (targets)
+ sLog->outErrorDb("SmartScript: Entry %d SourceType %u Event %u Action %u is using TARGET_NONE(0) for Script9 target. Please correct target_type in database.", e.entryOrGuid, e.GetScriptType(), e.GetEventType(), e.GetActionType());
+ return;
+ }
+
+ ObjectList* targets = GetTargets(e, unit);
+ if (targets)
+ {
+ for (ObjectList::iterator itr = targets->begin(); itr != targets->end(); itr++)
{
- for (ObjectList::iterator itr = targets->begin(); itr != targets->end(); itr++)
+ if (Creature* target = (*itr)->ToCreature())
{
- if (Creature* target = (*itr)->ToCreature())
- {
- if (IsSmart(target))
- CAST_AI(SmartAI, target->AI())->SetScript9(e, id, GetLastInvoker());
- } else if (GameObject* target = (*itr)->ToGameObject())
- {
- if (IsSmartGO(target))
- CAST_AI(SmartGameObjectAI, target->AI())->SetScript9(e, id, GetLastInvoker());
- }
+ if (IsSmart(target))
+ CAST_AI(SmartAI, target->AI())->SetScript9(e, id, GetLastInvoker());
+ } else if (GameObject* target = (*itr)->ToGameObject())
+ {
+ if (IsSmartGO(target))
+ CAST_AI(SmartGameObjectAI, target->AI())->SetScript9(e, id, GetLastInvoker());
}
}
- break;
+
+ delete targets;
}
+ break;
+ }
case SMART_ACTION_ACTIVATE_TAXI:
- {
- ObjectList* targets = GetTargets(e, unit);
- if (!targets) return;
- for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
- if (IsPlayer((*itr)))
- (*itr)->ToPlayer()->ActivateTaxiPathTo(e.action.taxi.id);
- break;
- }
+ {
+ ObjectList* targets = GetTargets(e, unit);
+ if (!targets)
+ return;
+
+ for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
+ if (IsPlayer(*itr))
+ (*itr)->ToPlayer()->ActivateTaxiPathTo(e.action.taxi.id);
+
+ delete targets;
+ break;
+ }
case SMART_ACTION_RANDOM_MOVE:
+ {
+ ObjectList* targets = GetTargets(e, unit);
+ if (!targets)
+ return;
+
+ for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
{
- ObjectList* targets = GetTargets(e, unit);
- if (!targets) return;
- for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
- if (IsCreature((*itr)))
- {
- if (e.action.moveRandom.distance)
- (*itr)->ToCreature()->GetMotionMaster()->MoveRandom((float)e.action.moveRandom.distance);
- else
- (*itr)->ToCreature()->GetMotionMaster()->MoveIdle();
- }
- break;
+ if (IsCreature((*itr)))
+ {
+ if (e.action.moveRandom.distance)
+ (*itr)->ToCreature()->GetMotionMaster()->MoveRandom((float)e.action.moveRandom.distance);
+ else
+ (*itr)->ToCreature()->GetMotionMaster()->MoveIdle();
+ }
}
+
+ delete targets;
+ break;
+ }
case SMART_ACTION_SET_UNIT_FIELD_BYTES_1:
- {
- ObjectList* targets = GetTargets(e, unit);
- if (!targets) return;
- for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
- if (IsUnit((*itr)))
- (*itr)->ToUnit()->SetByteFlag(UNIT_FIELD_BYTES_1, 0, e.action.setunitByte.byte1);
- break;
- }
+ {
+ ObjectList* targets = GetTargets(e, unit);
+ if (!targets)
+ return;
+ for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
+ if (IsUnit(*itr))
+ (*itr)->ToUnit()->SetByteFlag(UNIT_FIELD_BYTES_1, 0, e.action.setunitByte.byte1);
+
+ delete targets;
+ break;
+ }
case SMART_ACTION_REMOVE_UNIT_FIELD_BYTES_1:
- {
- ObjectList* targets = GetTargets(e, unit);
- if (!targets) return;
- for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
- if (IsUnit((*itr)))
- (*itr)->ToUnit()->RemoveByteFlag(UNIT_FIELD_BYTES_1, 0, e.action.delunitByte.byte1);
- break;
- }
+ {
+ ObjectList* targets = GetTargets(e, unit);
+ if (!targets)
+ return;
+ for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
+ if (IsUnit(*itr))
+ (*itr)->ToUnit()->RemoveByteFlag(UNIT_FIELD_BYTES_1, 0, e.action.delunitByte.byte1);
+
+ delete targets;
+ break;
+ }
case SMART_ACTION_INTERRUPT_SPELL:
- {
- ObjectList* targets = GetTargets(e, unit);
- if (!targets)
- return;
+ {
+ ObjectList* targets = GetTargets(e, unit);
+ if (!targets)
+ return;
- for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
- {
- if (IsUnit((*itr)))
- (*itr)->ToUnit()->InterruptNonMeleeSpells(e.action.interruptSpellCasting.withDelayed,e.action.interruptSpellCasting.spell_id,e.action.interruptSpellCasting.withInstant);
- }
+ for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
+ if (IsUnit(*itr))
+ (*itr)->ToUnit()->InterruptNonMeleeSpells(e.action.interruptSpellCasting.withDelayed, e.action.interruptSpellCasting.spell_id, e.action.interruptSpellCasting.withInstant);
- break;
- }
+ delete targets;
+ break;
+ }
case SMART_ACTION_SEND_GO_CUSTOM_ANIM:
- {
- ObjectList* targets = GetTargets(e, unit);
- if (!targets)
- return;
+ {
+ ObjectList* targets = GetTargets(e, unit);
+ if (!targets)
+ return;
- for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
- if (IsGameObject((*itr)))
- (*itr)->ToGameObject()->SendCustomAnim(e.action.sendGoCustomAnim.anim);
+ for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); itr++)
+ if (IsGameObject(*itr))
+ (*itr)->ToGameObject()->SendCustomAnim(e.action.sendGoCustomAnim.anim);
- break;
- }
+ delete targets;
+ break;
+ }
default:
sLog->outErrorDb("SmartScript::ProcessAction: Unhandled Action type %u", e.GetActionType());
break;
@@ -1486,56 +1718,56 @@ void SmartScript::InstallTemplate(SmartScriptHolder e)
{
case SMARTAI_TEMPLATE_CASTER:
{
- AddEvent(SMART_EVENT_UPDATE_IC,0, 0,0,e.action.installTtemplate.param2,e.action.installTtemplate.param3,SMART_ACTION_CAST,e.action.installTtemplate.param1,e.target.raw.param1,0,0,0,0,SMART_TARGET_VICTIM,0,0,0,1);
- AddEvent(SMART_EVENT_RANGE,0, e.action.installTtemplate.param4,300,0,0,SMART_ACTION_ALLOW_COMBAT_MOVEMENT,1,0,0,0,0,0,SMART_TARGET_NONE,0,0,0,1);
- AddEvent(SMART_EVENT_RANGE,0, 0,e.action.installTtemplate.param4>10?e.action.installTtemplate.param4-10:0,0,0,SMART_ACTION_ALLOW_COMBAT_MOVEMENT,0,0,0,0,0,0,SMART_TARGET_NONE,0,0,0,1);
- AddEvent(SMART_EVENT_MANA_PCT,0,e.action.installTtemplate.param5-15>100?100:e.action.installTtemplate.param5+15,100,1000,1000,SMART_ACTION_SET_EVENT_PHASE,1,0,0,0,0,0,SMART_TARGET_NONE,0,0,0,0);
- AddEvent(SMART_EVENT_MANA_PCT,0,0,e.action.installTtemplate.param5,1000,1000,SMART_ACTION_SET_EVENT_PHASE,0,0,0,0,0,0,SMART_TARGET_NONE,0,0,0,0);
- AddEvent(SMART_EVENT_MANA_PCT,0,0,e.action.installTtemplate.param5,1000,1000,SMART_ACTION_ALLOW_COMBAT_MOVEMENT,1,0,0,0,0,0,SMART_TARGET_NONE,0,0,0,0);
+ AddEvent(SMART_EVENT_UPDATE_IC, 0, 0, 0, e.action.installTtemplate.param2, e.action.installTtemplate.param3, SMART_ACTION_CAST, e.action.installTtemplate.param1, e.target.raw.param1, 0, 0, 0, 0, SMART_TARGET_VICTIM, 0, 0, 0, 1);
+ AddEvent(SMART_EVENT_RANGE, 0, e.action.installTtemplate.param4, 300, 0, 0, SMART_ACTION_ALLOW_COMBAT_MOVEMENT, 1, 0, 0, 0, 0, 0, SMART_TARGET_NONE, 0, 0, 0, 1);
+ AddEvent(SMART_EVENT_RANGE, 0, 0, e.action.installTtemplate.param4>10?e.action.installTtemplate.param4-10:0, 0, 0, SMART_ACTION_ALLOW_COMBAT_MOVEMENT, 0, 0, 0, 0, 0, 0, SMART_TARGET_NONE, 0, 0, 0, 1);
+ AddEvent(SMART_EVENT_MANA_PCT, 0, e.action.installTtemplate.param5-15>100?100:e.action.installTtemplate.param5+15, 100, 1000, 1000, SMART_ACTION_SET_EVENT_PHASE, 1, 0, 0, 0, 0, 0, SMART_TARGET_NONE, 0, 0, 0, 0);
+ AddEvent(SMART_EVENT_MANA_PCT, 0, 0, e.action.installTtemplate.param5, 1000, 1000, SMART_ACTION_SET_EVENT_PHASE, 0, 0, 0, 0, 0, 0, SMART_TARGET_NONE, 0, 0, 0, 0);
+ AddEvent(SMART_EVENT_MANA_PCT, 0, 0, e.action.installTtemplate.param5, 1000, 1000, SMART_ACTION_ALLOW_COMBAT_MOVEMENT, 1, 0, 0, 0, 0, 0, SMART_TARGET_NONE, 0, 0, 0, 0);
break;
}
case SMARTAI_TEMPLATE_TURRET:
{
- AddEvent(SMART_EVENT_UPDATE_IC,0, 0,0,e.action.installTtemplate.param2,e.action.installTtemplate.param3,SMART_ACTION_CAST,e.action.installTtemplate.param1,e.target.raw.param1,0,0,0,0,SMART_TARGET_VICTIM,0,0,0,0);
- AddEvent(SMART_EVENT_JUST_CREATED,0, 0,0,0,0,SMART_ACTION_ALLOW_COMBAT_MOVEMENT,0,0,0,0,0,0,SMART_TARGET_NONE,0,0,0,0);
+ AddEvent(SMART_EVENT_UPDATE_IC, 0, 0, 0, e.action.installTtemplate.param2, e.action.installTtemplate.param3, SMART_ACTION_CAST, e.action.installTtemplate.param1, e.target.raw.param1, 0, 0, 0, 0, SMART_TARGET_VICTIM, 0, 0, 0, 0);
+ AddEvent(SMART_EVENT_JUST_CREATED, 0, 0, 0, 0, 0, SMART_ACTION_ALLOW_COMBAT_MOVEMENT, 0, 0, 0, 0, 0, 0, SMART_TARGET_NONE, 0, 0, 0, 0);
break;
}
case SMARTAI_TEMPLATE_CAGED_NPC_PART:
{
if (!me) return;
//store cage as id1
- AddEvent(SMART_EVENT_DATA_SET,0,0,0,0,0,SMART_ACTION_STORE_TARGET_LIST,1,0,0,0,0,0,SMART_TARGET_CLOSEST_GAMEOBJECT,e.action.installTtemplate.param1,10,0,0);
+ AddEvent(SMART_EVENT_DATA_SET, 0, 0, 0, 0, 0, SMART_ACTION_STORE_TARGET_LIST, 1, 0, 0, 0, 0, 0, SMART_TARGET_CLOSEST_GAMEOBJECT, e.action.installTtemplate.param1, 10, 0, 0);
//reset(close) cage on hostage(me) respawn
- AddEvent(SMART_EVENT_UPDATE,SMART_EVENT_FLAG_NOT_REPEATABLE,0,0,0,0,SMART_ACTION_RESET_GOBJECT,0,0,0,0,0,0,SMART_TARGET_GAMEOBJECT_DISTANCE,e.action.installTtemplate.param1,5,0,0);
+ AddEvent(SMART_EVENT_UPDATE, SMART_EVENT_FLAG_NOT_REPEATABLE, 0, 0, 0, 0, SMART_ACTION_RESET_GOBJECT, 0, 0, 0, 0, 0, 0, SMART_TARGET_GAMEOBJECT_DISTANCE, e.action.installTtemplate.param1, 5, 0, 0);
- AddEvent(SMART_EVENT_DATA_SET,0,0,0,0,0,SMART_ACTION_SET_RUN,e.action.installTtemplate.param3,0,0,0,0,0,SMART_TARGET_NONE,0,0,0,0);
- AddEvent(SMART_EVENT_DATA_SET,0,0,0,0,0,SMART_ACTION_SET_EVENT_PHASE,1,0,0,0,0,0,SMART_TARGET_NONE,0,0,0,0);
+ AddEvent(SMART_EVENT_DATA_SET, 0, 0, 0, 0, 0, SMART_ACTION_SET_RUN, e.action.installTtemplate.param3, 0, 0, 0, 0, 0, SMART_TARGET_NONE, 0, 0, 0, 0);
+ AddEvent(SMART_EVENT_DATA_SET, 0, 0, 0, 0, 0, SMART_ACTION_SET_EVENT_PHASE, 1, 0, 0, 0, 0, 0, SMART_TARGET_NONE, 0, 0, 0, 0);
- AddEvent(SMART_EVENT_UPDATE,SMART_EVENT_FLAG_NOT_REPEATABLE,1000,1000,0,0,SMART_ACTION_MOVE_FORWARD,e.action.installTtemplate.param4,0,0,0,0,0,SMART_TARGET_NONE,0,0,0,1);
+ AddEvent(SMART_EVENT_UPDATE, SMART_EVENT_FLAG_NOT_REPEATABLE, 1000, 1000, 0, 0, SMART_ACTION_MOVE_FORWARD, e.action.installTtemplate.param4, 0, 0, 0, 0, 0, SMART_TARGET_NONE, 0, 0, 0, 1);
//phase 1: give quest credit on movepoint reached
- AddEvent(SMART_EVENT_MOVEMENTINFORM,0, POINT_MOTION_TYPE,SMART_RANDOM_POINT,0,0,SMART_ACTION_SET_DATA,0,0,0,0,0,0,SMART_TARGET_STORED,1,0,0,1);
+ AddEvent(SMART_EVENT_MOVEMENTINFORM, 0, POINT_MOTION_TYPE, SMART_RANDOM_POINT, 0, 0, SMART_ACTION_SET_DATA, 0, 0, 0, 0, 0, 0, SMART_TARGET_STORED, 1, 0, 0, 1);
//phase 1: despawn after time on movepoint reached
- AddEvent(SMART_EVENT_MOVEMENTINFORM,0, POINT_MOTION_TYPE,SMART_RANDOM_POINT,0,0,SMART_ACTION_FORCE_DESPAWN,e.action.installTtemplate.param2,0,0,0,0,0,SMART_TARGET_NONE,0,0,0,1);
+ AddEvent(SMART_EVENT_MOVEMENTINFORM, 0, POINT_MOTION_TYPE, SMART_RANDOM_POINT, 0, 0, SMART_ACTION_FORCE_DESPAWN, e.action.installTtemplate.param2, 0, 0, 0, 0, 0, SMART_TARGET_NONE, 0, 0, 0, 1);
if (sCreatureTextMgr->TextExist(me->GetEntry(), (uint8)e.action.installTtemplate.param5))
- AddEvent(SMART_EVENT_MOVEMENTINFORM,0, POINT_MOTION_TYPE,SMART_RANDOM_POINT,0,0,SMART_ACTION_TALK,e.action.installTtemplate.param5,0,0,0,0,0,SMART_TARGET_NONE,0,0,0,1);
+ AddEvent(SMART_EVENT_MOVEMENTINFORM, 0, POINT_MOTION_TYPE, SMART_RANDOM_POINT, 0, 0, SMART_ACTION_TALK, e.action.installTtemplate.param5, 0, 0, 0, 0, 0, SMART_TARGET_NONE, 0, 0, 0, 1);
break;
}
case SMARTAI_TEMPLATE_CAGED_GO_PART:
{
if (!go) return;
//store hostage as id1
- AddEvent(SMART_EVENT_GOSSIP_HELLO,0,0,0,0,0,SMART_ACTION_STORE_TARGET_LIST,1,0,0,0,0,0,SMART_TARGET_CLOSEST_CREATURE,e.action.installTtemplate.param1,10,0,0);
+ AddEvent(SMART_EVENT_GOSSIP_HELLO, 0, 0, 0, 0, 0, SMART_ACTION_STORE_TARGET_LIST, 1, 0, 0, 0, 0, 0, SMART_TARGET_CLOSEST_CREATURE, e.action.installTtemplate.param1, 10, 0, 0);
//store invoker as id2
- AddEvent(SMART_EVENT_GOSSIP_HELLO,0,0,0,0,0,SMART_ACTION_STORE_TARGET_LIST,2,0,0,0,0,0,SMART_TARGET_NONE,0,0,0,0);
+ AddEvent(SMART_EVENT_GOSSIP_HELLO, 0, 0, 0, 0, 0, SMART_ACTION_STORE_TARGET_LIST, 2, 0, 0, 0, 0, 0, SMART_TARGET_NONE, 0, 0, 0, 0);
//signal hostage
- AddEvent(SMART_EVENT_GOSSIP_HELLO,0,0,0,0,0,SMART_ACTION_SET_DATA,0,0,0,0,0,0,SMART_TARGET_STORED,1,0,0,0);
+ AddEvent(SMART_EVENT_GOSSIP_HELLO, 0, 0, 0, 0, 0, SMART_ACTION_SET_DATA, 0, 0, 0, 0, 0, 0, SMART_TARGET_STORED, 1, 0, 0, 0);
//when hostage raeched end point, give credit to invoker
if (e.action.installTtemplate.param2)
- AddEvent(SMART_EVENT_DATA_SET,0,0,0,0,0,SMART_ACTION_CALL_KILLEDMONSTER,e.action.installTtemplate.param1,0,0,0,0,0,SMART_TARGET_STORED,2,0,0,0);
+ AddEvent(SMART_EVENT_DATA_SET, 0, 0, 0, 0, 0, SMART_ACTION_CALL_KILLEDMONSTER, e.action.installTtemplate.param1, 0, 0, 0, 0, 0, SMART_TARGET_STORED, 2, 0, 0, 0);
else
- AddEvent(SMART_EVENT_GOSSIP_HELLO,0,0,0,0,0,SMART_ACTION_CALL_KILLEDMONSTER,e.action.installTtemplate.param1,0,0,0,0,0,SMART_TARGET_STORED,2,0,0,0);
+ AddEvent(SMART_EVENT_GOSSIP_HELLO, 0, 0, 0, 0, 0, SMART_ACTION_CALL_KILLEDMONSTER, e.action.installTtemplate.param1, 0, 0, 0, 0, 0, SMART_TARGET_STORED, 2, 0, 0, 0);
break;
}
case SMARTAI_TEMPLATE_BASIC:
@@ -1585,6 +1817,7 @@ ObjectList* SmartScript::GetTargets(SmartScriptHolder e, Unit* invoker)
trigger = invoker;
else if (Unit* tempLastInvoker = GetLastInvoker())
trigger = tempLastInvoker;
+
ObjectList* l = new ObjectList();
switch (e.GetTargetType())
{
@@ -1597,24 +1830,24 @@ ObjectList* SmartScript::GetTargets(SmartScriptHolder e, Unit* invoker)
l->push_back(me->getVictim());
break;
case SMART_TARGET_HOSTILE_SECOND_AGGRO:
- if (!me) return NULL;
- if(Unit* u = me->AI()->SelectTarget(SELECT_TARGET_TOPAGGRO, 1))
- l->push_back(u);
+ if (me)
+ if (Unit* u = me->AI()->SelectTarget(SELECT_TARGET_TOPAGGRO, 1))
+ l->push_back(u);
break;
case SMART_TARGET_HOSTILE_LAST_AGGRO:
- if (!me) return NULL;
- if(Unit* u = me->AI()->SelectTarget(SELECT_TARGET_BOTTOMAGGRO, 0))
- l->push_back(u);
+ if (me)
+ if (Unit* u = me->AI()->SelectTarget(SELECT_TARGET_BOTTOMAGGRO, 0))
+ l->push_back(u);
break;
case SMART_TARGET_HOSTILE_RANDOM:
- if (!me) return NULL;
- if(Unit* u = me->AI()->SelectTarget(SELECT_TARGET_RANDOM, 0))
- l->push_back(u);
+ if (me)
+ if (Unit* u = me->AI()->SelectTarget(SELECT_TARGET_RANDOM, 0))
+ l->push_back(u);
break;
case SMART_TARGET_HOSTILE_RANDOM_NOT_TOP:
- if (!me) return NULL;
- if(Unit* u = me->AI()->SelectTarget(SELECT_TARGET_RANDOM, 1))
- l->push_back(u);
+ if (me)
+ if (Unit* u = me->AI()->SelectTarget(SELECT_TARGET_RANDOM, 1))
+ l->push_back(u);
break;
case SMART_TARGET_NONE:
case SMART_TARGET_ACTION_INVOKER:
@@ -1623,197 +1856,215 @@ ObjectList* SmartScript::GetTargets(SmartScriptHolder e, Unit* invoker)
break;
case SMART_TARGET_ACTION_INVOKER_VEHICLE:
if (trigger && trigger->GetVehicle() && trigger->GetVehicle()->GetBase())
- {
l->push_back(trigger->GetVehicle()->GetBase());
- }
break;
case SMART_TARGET_INVOKER_PARTY:
if (trigger)
{
l->push_back(trigger);
if (Player* plr = trigger->ToPlayer())
- {
if (Group *pGroup = plr->GetGroup())
- {
- for (GroupReference *gr = pGroup->GetFirstMember(); gr != NULL; gr = gr->next())
- {
- if (Player *pGroupGuy = gr->getSource())
- l->push_back(pGroupGuy);
- }
- }
- }
+ for (GroupReference* groupRef = pGroup->GetFirstMember(); groupRef != NULL; groupRef = groupRef->next())
+ if (Player* member = groupRef->getSource())
+ l->push_back(member);
}
break;
case SMART_TARGET_CREATURE_RANGE:
+ {
+ // will always return a valid pointer, even if empty list
+ ObjectList* units = GetWorldObjectsInDist((float)e.target.unitRange.maxDist);
+ for (ObjectList::const_iterator itr = units->begin(); itr != units->end(); ++itr)
{
- ObjectList* units = GetWorldObjectsInDist((float)e.target.unitRange.maxDist);
- if (!units) return NULL;
- for (ObjectList::const_iterator itr = units->begin(); itr != units->end(); itr++)
- {
- if(!IsCreature((*itr)))
- continue;
- if (me && me == (*itr))
- continue;
- if (((e.target.unitRange.creature && (*itr)->ToCreature()->GetEntry() == e.target.unitRange.creature) || !e.target.unitRange.creature) && GetBaseObject()->IsInRange((*itr), (float)e.target.unitRange.minDist, (float)e.target.unitRange.maxDist))
- l->push_back((*itr));
- }
- break;
+ if (!IsCreature(*itr))
+ continue;
+
+ if (me && me == *itr)
+ continue;
+
+ if (((e.target.unitRange.creature && (*itr)->ToCreature()->GetEntry() == e.target.unitRange.creature) || !e.target.unitRange.creature) && GetBaseObject()->IsInRange(*itr, (float)e.target.unitRange.minDist, (float)e.target.unitRange.maxDist))
+ l->push_back(*itr);
}
+
+ delete units;
+ break;
+ }
case SMART_TARGET_CREATURE_DISTANCE:
+ {
+ // will always return a valid pointer, even if empty list
+ ObjectList* units = GetWorldObjectsInDist((float)e.target.unitDistance.dist);
+ for (ObjectList::const_iterator itr = units->begin(); itr != units->end(); ++itr)
{
- ObjectList* units = GetWorldObjectsInDist((float)e.target.unitDistance.dist);
- if (!units) return NULL;
- for (ObjectList::const_iterator itr = units->begin(); itr != units->end(); itr++)
- {
- if(!IsCreature((*itr)))
- continue;
- if (me && me == (*itr))
- continue;
- if ((e.target.unitDistance.creature && (*itr)->ToCreature()->GetEntry() == e.target.unitDistance.creature) || !e.target.unitDistance.creature)
- {
- l->push_back((*itr));
- }
- }
- break;
+ if (!IsCreature(*itr))
+ continue;
+
+ if (me && me == *itr)
+ continue;
+
+ if ((e.target.unitDistance.creature && (*itr)->ToCreature()->GetEntry() == e.target.unitDistance.creature) || !e.target.unitDistance.creature)
+ l->push_back(*itr);
}
+
+ delete units;
+ break;
+ }
case SMART_TARGET_GAMEOBJECT_DISTANCE:
+ {
+ // will always return a valid pointer, even if empty list
+ ObjectList* units = GetWorldObjectsInDist((float)e.target.goDistance.dist);
+ for (ObjectList::const_iterator itr = units->begin(); itr != units->end(); ++itr)
{
- ObjectList* units = GetWorldObjectsInDist((float)e.target.goDistance.dist);
- if (!units) return NULL;
- for (ObjectList::const_iterator itr = units->begin(); itr != units->end(); itr++)
- {
- if(!IsGameObject((*itr)))
- continue;
- if (go && go == (*itr))
- continue;
- if ((e.target.goDistance.entry && (*itr)->ToGameObject()->GetEntry() == e.target.goDistance.entry) || !e.target.goDistance.entry)
- l->push_back((*itr));
- }
- break;
+ if (!IsGameObject(*itr))
+ continue;
+
+ if (go && go == *itr)
+ continue;
+
+ if ((e.target.goDistance.entry && (*itr)->ToGameObject()->GetEntry() == e.target.goDistance.entry) || !e.target.goDistance.entry)
+ l->push_back(*itr);
}
+
+ delete units;
+ break;
+ }
case SMART_TARGET_GAMEOBJECT_RANGE:
+ {
+ // will always return a valid pointer, even if empty list
+ ObjectList* units = GetWorldObjectsInDist((float)e.target.goRange.maxDist);
+ for (ObjectList::const_iterator itr = units->begin(); itr != units->end(); ++itr)
{
- ObjectList* units = GetWorldObjectsInDist((float)e.target.goRange.maxDist);
- if (!units) return NULL;
- for (ObjectList::const_iterator itr = units->begin(); itr != units->end(); itr++)
- {
- if(!IsGameObject((*itr)))
- continue;
- if (go && go == (*itr))
- continue;
- if (((e.target.goRange.entry && IsGameObject((*itr)) && (*itr)->ToGameObject()->GetEntry() == e.target.goRange.entry) || !e.target.goRange.entry) && GetBaseObject()->IsInRange((*itr), (float)e.target.goRange.minDist, (float)e.target.goRange.maxDist))
- l->push_back((*itr));
- }
- break;
+ if(!IsGameObject(*itr))
+ continue;
+
+ if (go && go == *itr)
+ continue;
+
+ if (((e.target.goRange.entry && IsGameObject(*itr) && (*itr)->ToGameObject()->GetEntry() == e.target.goRange.entry) || !e.target.goRange.entry) && GetBaseObject()->IsInRange((*itr), (float)e.target.goRange.minDist, (float)e.target.goRange.maxDist))
+ l->push_back(*itr);
}
+
+ delete units;
+ break;
+ }
case SMART_TARGET_CREATURE_GUID:
+ {
+ Creature* target = NULL;
+ if (e.target.unitGUID.entry)
{
- Creature* target = NULL;
- if (e.target.unitGUID.entry)
- {
- uint64 guid = MAKE_NEW_GUID(e.target.unitGUID.guid, e.target.unitGUID.entry, HIGHGUID_UNIT);
- target = HashMapHolder<Creature>::Find(guid);
- } else
- {
- if (!trigger && !GetBaseObject())
- {
- sLog->outErrorDb("SMART_TARGET_CREATURE_GUID can not be used without invoker and without entry");
- return NULL;
- }
- target = FindCreatureNear(trigger?trigger:GetBaseObject(), e.target.unitGUID.guid);
- }
- if (target)
- {
- l->push_back(target);
- }
- break;
+ uint64 guid = MAKE_NEW_GUID(e.target.unitGUID.guid, e.target.unitGUID.entry, HIGHGUID_UNIT);
+ target = HashMapHolder<Creature>::Find(guid);
}
- case SMART_TARGET_GAMEOBJECT_GUID:
+ else
{
- GameObject* target = NULL;
- if (e.target.unitGUID.entry)
- {
- uint64 guid = MAKE_NEW_GUID(e.target.goGUID.guid, e.target.goGUID.entry, HIGHGUID_GAMEOBJECT);
- target = HashMapHolder<GameObject>::Find(guid);
- } else
+ if (!trigger && !GetBaseObject())
{
- if (!trigger && !GetBaseObject())
- {
- sLog->outErrorDb("SMART_TARGET_GAMEOBJECT_GUID can not be used without invoker and without entry");
- return NULL;
- }
- target = FindGameObjectNear(trigger?trigger:GetBaseObject(), e.target.goGUID.guid);
- }
- if (target)
- {
- l->push_back(target);
+ sLog->outErrorDb("SMART_TARGET_CREATURE_GUID can not be used without invoker and without entry");
+ break;
}
- break;
+
+ target = FindCreatureNear(trigger ? trigger : GetBaseObject(), e.target.unitGUID.guid);
}
- case SMART_TARGET_PLAYER_RANGE:
+
+ if (target)
+ l->push_back(target);
+ break;
+ }
+ case SMART_TARGET_GAMEOBJECT_GUID:
+ {
+ GameObject* target = NULL;
+ if (e.target.unitGUID.entry)
{
- ObjectList* units = GetWorldObjectsInDist((float)e.target.playerRange.maxDist);
- if (!units || !GetBaseObject()) return NULL;
- for (ObjectList::const_iterator itr = units->begin(); itr != units->end(); itr++)
- {
- if(IsPlayer((*itr)) && GetBaseObject()->IsInRange((*itr), (float)e.target.playerRange.minDist, (float)e.target.playerRange.maxDist))
- l->push_back((*itr));
- }
- break;
+ uint64 guid = MAKE_NEW_GUID(e.target.goGUID.guid, e.target.goGUID.entry, HIGHGUID_GAMEOBJECT);
+ target = HashMapHolder<GameObject>::Find(guid);
}
- case SMART_TARGET_PLAYER_DISTANCE:
+ else
{
- ObjectList* units = GetWorldObjectsInDist((float)e.target.playerDistance.dist);
- if (!units) return NULL;
- for (ObjectList::const_iterator itr = units->begin(); itr != units->end(); itr++)
+ if (!trigger && !GetBaseObject())
{
- if(IsPlayer((*itr)))
- l->push_back((*itr));
+ sLog->outErrorDb("SMART_TARGET_GAMEOBJECT_GUID can not be used without invoker and without entry");
+ break;
}
- break;
+
+ target = FindGameObjectNear(trigger ? trigger : GetBaseObject(), e.target.goGUID.guid);
}
+
+ if (target)
+ l->push_back(target);
+ break;
+ }
+ case SMART_TARGET_PLAYER_RANGE:
+ {
+ // will always return a valid pointer, even if empty list
+ ObjectList* units = GetWorldObjectsInDist((float)e.target.playerRange.maxDist);
+ if (!units->empty() && GetBaseObject())
+ for (ObjectList::const_iterator itr = units->begin(); itr != units->end(); ++itr)
+ if (IsPlayer(*itr) && GetBaseObject()->IsInRange(*itr, (float)e.target.playerRange.minDist, (float)e.target.playerRange.maxDist))
+ l->push_back(*itr);
+
+ delete units;
+ break;
+ }
+ case SMART_TARGET_PLAYER_DISTANCE:
+ {
+ // will always return a valid pointer, even if empty list
+ ObjectList* units = GetWorldObjectsInDist((float)e.target.playerDistance.dist);
+ for (ObjectList::const_iterator itr = units->begin(); itr != units->end(); itr++)
+ if (IsPlayer(*itr))
+ l->push_back(*itr);
+
+ delete units;
+ break;
+ }
case SMART_TARGET_STORED:
- {
- ObjectListMap::iterator itr = mTargetStorage->find(e.target.stored.id);
- if (itr != mTargetStorage->end())
- return itr->second;
- return l;
- }
+ {
+ ObjectListMap::iterator itr = mTargetStorage->find(e.target.stored.id);
+ if (itr != mTargetStorage->end())
+ l->assign(itr->second->begin(), itr->second->end());
+
+ return l;
+ }
case SMART_TARGET_CLOSEST_CREATURE:
- {
- Creature* target = GetClosestCreatureWithEntry(GetBaseObject(),e.target.closest.entry, (float)(e.target.closest.dist ? e.target.closest.dist : 100), e.target.closest.dead ? false : true);
- if (target)
- l->push_back(target);
- break;
- }
+ {
+ Creature* target = GetClosestCreatureWithEntry(GetBaseObject(), e.target.closest.entry, (float)(e.target.closest.dist ? e.target.closest.dist : 100), e.target.closest.dead ? false : true);
+ if (target)
+ l->push_back(target);
+ break;
+ }
case SMART_TARGET_CLOSEST_GAMEOBJECT:
- {
- GameObject* target = GetClosestGameObjectWithEntry(GetBaseObject(),e.target.closest.entry, (float)(e.target.closest.dist ? e.target.closest.dist : 100));
- if (target)
- l->push_back(target);
- break;
- }
+ {
+ GameObject* target = GetClosestGameObjectWithEntry(GetBaseObject(), e.target.closest.entry, (float)(e.target.closest.dist ? e.target.closest.dist : 100));
+ if (target)
+ l->push_back(target);
+ break;
+ }
case SMART_TARGET_OWNER_OR_SUMMONER:
- {
- if (!me) return NULL;
- uint64 guid = me->GetCharmerOrOwnerGUID();
- if (Unit* owner = ObjectAccessor::GetUnit(*me, guid))
+ {
+ if (me)
+ if (Unit* owner = ObjectAccessor::GetUnit(*me, me->GetCharmerOrOwnerGUID()))
l->push_back(owner);
- break;
- }
+ break;
+ }
case SMART_TARGET_THREAT_LIST:
+ {
+ if (me)
{
- if (!me) return NULL;
- std::list<HostileReference*>& threatList = me->getThreatManager().getThreatList();
- for (std::list<HostileReference*>::iterator i = threatList.begin(); i != threatList.end(); ++i)
- if (Unit* Temp = Unit::GetUnit(*me,(*i)->getUnitGuid()))
- l->push_back(Temp);
- break;
+ std::list<HostileReference*> const& threatList = me->getThreatManager().getThreatList();
+ for (std::list<HostileReference*>::const_iterator i = threatList.begin(); i != threatList.end(); ++i)
+ if (Unit* temp = Unit::GetUnit(*me, (*i)->getUnitGuid()))
+ l->push_back(temp);
}
+ break;
+ }
case SMART_TARGET_POSITION:
default:
- return NULL;
+ break;
}
+
+ if (l->empty())
+ {
+ delete l;
+ l = NULL;
+ }
+
return l;
}
@@ -1909,7 +2160,7 @@ void SmartScript::ProcessEvent(SmartScriptHolder &e, Unit* unit, uint32 var0, ui
if (!me || !me->isInCombat() || !me->getVictim())
return;
- if (me->IsInRange(me->getVictim(),(float)e.event.minMaxRepeat.min,(float)e.event.minMaxRepeat.max))
+ if (me->IsInRange(me->getVictim(), (float)e.event.minMaxRepeat.min, (float)e.event.minMaxRepeat.max))
{
ProcessAction(e, me->getVictim());
RecalcTimer(e, e.event.minMaxRepeat.repeatMin, e.event.minMaxRepeat.repeatMax);
@@ -2098,7 +2349,7 @@ void SmartScript::ProcessEvent(SmartScriptHolder &e, Unit* unit, uint32 var0, ui
if (var0 > e.event.minMaxRepeat.max || var0 < e.event.minMaxRepeat.min)
return;
ProcessAction(e, unit);
- RecalcTimer(e, e.event.minMaxRepeat.repeatMin,e.event.minMaxRepeat.repeatMax);
+ RecalcTimer(e, e.event.minMaxRepeat.repeatMin, e.event.minMaxRepeat.repeatMax);
break;
}
case SMART_EVENT_MOVEMENTINFORM:
@@ -2184,12 +2435,12 @@ void SmartScript::ProcessEvent(SmartScriptHolder &e, Unit* unit, uint32 var0, ui
case SMART_EVENT_TIMED_EVENT_TRIGGERED:
{
if (e.event.timedEvent.id == var0)
- ProcessAction(e,unit);
+ ProcessAction(e, unit);
break;
}
case SMART_EVENT_GOSSIP_SELECT:
{
- sLog->outDebug(LOG_FILTER_DATABASE_AI,"SmartScript: Gossip Select: menu %u action %u", var0, var1);//little help for scripters
+ sLog->outDebug(LOG_FILTER_DATABASE_AI, "SmartScript: Gossip Select: menu %u action %u", var0, var1);//little help for scripters
if (e.event.gossip.sender != var0 || e.event.gossip.action != var1)
return;
ProcessAction(e, unit, var0, var1);
diff --git a/src/server/game/AI/SmartScripts/SmartScript.h b/src/server/game/AI/SmartScripts/SmartScript.h
index a5331672803..0daa81cdcf9 100644
--- a/src/server/game/AI/SmartScripts/SmartScript.h
+++ b/src/server/game/AI/SmartScripts/SmartScript.h
@@ -100,29 +100,43 @@ class SmartScript
void StoreTargetList(ObjectList* targets, uint32 id)
{
- if (!targets) return;
- if(mTargetStorage->find(id) != mTargetStorage->end())
- mTargetStorage->erase(id);
+ if (!targets)
+ return;
+
+ if (mTargetStorage->find(id) != mTargetStorage->end())
+ delete (*mTargetStorage)[id];
+
(*mTargetStorage)[id] = targets;
}
+
bool IsSmart(Creature* c = NULL)
{
bool smart = true;
- if (c && c->GetAIName() != "SmartAI") smart = false;
- if (!me || me->GetAIName() != "SmartAI") smart = false;
+ if (c && c->GetAIName() != "SmartAI")
+ smart = false;
+
+ if (!me || me->GetAIName() != "SmartAI")
+ smart = false;
+
if (!smart)
sLog->outErrorDb("SmartScript: Action target Creature(entry: %u) is not using SmartAI, action skipped to prevent crash.", c?c->GetEntry():(me?me->GetEntry():0));
return smart;
}
+
bool IsSmartGO(GameObject* g = NULL)
{
bool smart = true;
- if (g && g->GetAIName() != "SmartGameObjectAI") smart = false;
- if (!go || go->GetAIName() != "SmartGameObjectAI") smart = false;
+ if (g && g->GetAIName() != "SmartGameObjectAI")
+ smart = false;
+
+ if (!go || go->GetAIName() != "SmartGameObjectAI")
+ smart = false;
if (!smart)
+
sLog->outErrorDb("SmartScript: Action target GameObject(entry: %u) is not using SmartGameObjectAI, action skipped to prevent crash.", g?g->GetEntry():(go?go->GetEntry():0));
return smart;
}
+
ObjectList* GetTargetList(uint32 id)
{
ObjectListMap::iterator itr = mTargetStorage->find(id);