Merge branch 'master' of github.com:TrinityCore/TrinityCore into 4.3.4

This commit is contained in:
Vincent_Michael
2013-12-18 23:48:20 +01:00
20 changed files with 1287 additions and 95 deletions

View File

@@ -367,12 +367,14 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); ++itr)
{
if (IsPlayer(*itr))
{
if (Quest const* q = sObjectMgr->GetQuestTemplate(e.action.quest.quest))
{
(*itr)->ToPlayer()->AddQuestAndCheckCompletion(q, NULL);
TC_LOG_DEBUG("scripts.ai", "SmartScript::ProcessAction:: SMART_ACTION_ADD_QUEST: Player guidLow %u add quest %u",
(*itr)->GetGUIDLow(), e.action.quest.quest);
}
}
}
delete targets;
@@ -380,12 +382,18 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
}
case SMART_ACTION_SET_REACT_STATE:
{
if (!me)
ObjectList* targets = GetTargets(e, unit);
if (!targets)
break;
me->SetReactState(ReactStates(e.action.react.state));
TC_LOG_DEBUG("scripts.ai", "SmartScript::ProcessAction:: SMART_ACTION_SET_REACT_STATE: Creature guidLow %u set reactstate %u",
me->GetGUIDLow(), e.action.react.state);
for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); ++itr)
{
if (!IsCreature(*itr))
continue;
(*itr)->ToCreature()->SetReactState(ReactStates(e.action.react.state));
}
break;
}
case SMART_ACTION_RANDOM_EMOTE:
@@ -825,7 +833,10 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
ObjectList* targets = GetTargets(e, unit);
if (!targets)
{
CAST_AI(SmartAI, me->AI())->StopFollow();
break;
}
for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); ++itr)
{
@@ -1029,25 +1040,41 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
}
case SMART_ACTION_FORCE_DESPAWN:
{
if (!IsSmart())
ObjectList* targets = GetTargets(e, unit);
if (!targets)
break;
// The AI is only updated if the creature is alive
if (me->IsAlive())
for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); ++itr)
{
CAST_AI(SmartAI, me->AI())->SetDespawnTime(e.action.forceDespawn.delay + 1); // Next tick
CAST_AI(SmartAI, me->AI())->StartDespawn();
if (!IsCreature(*itr))
continue;
if ((*itr)->ToUnit()->IsAlive() && IsSmart((*itr)->ToCreature()))
{
CAST_AI(SmartAI, (*itr)->ToCreature()->AI())->SetDespawnTime(e.action.forceDespawn.delay + 1); // Next tick
CAST_AI(SmartAI, (*itr)->ToCreature()->AI())->StartDespawn();
}
else
(*itr)->ToCreature()->DespawnOrUnsummon(e.action.forceDespawn.delay);
}
// Otherwise we call the despawn directly
else
me->DespawnOrUnsummon(e.action.forceDespawn.delay);
break;
}
case SMART_ACTION_SET_INGAME_PHASE_MASK:
{
if (WorldObject* baseObj = GetBaseObject())
baseObj->SetPhaseMask(e.action.ingamePhaseMask.mask, true);
ObjectList* targets = GetTargets(e, unit);
if (!targets)
break;
for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); ++itr)
{
if (IsUnit(*itr))
(*itr)->ToUnit()->SetPhaseMask(e.action.ingamePhaseMask.mask, true);
else if (IsGameObject(*itr))
(*itr)->ToGameObject()->SetPhaseMask(e.action.ingamePhaseMask.mask, true);
}
break;
}
@@ -1132,6 +1159,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
{
if (WorldObject* baseObj = GetBaseObject())
baseObj->setActive(e.action.active.state);
break;
}
case SMART_ACTION_ATTACK_START:
@@ -1647,7 +1675,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
break;
for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); ++itr)
if (IsUnit(*itr))
if (IsCreature(*itr))
(*itr)->ToUnit()->SetUInt32Value(UNIT_NPC_FLAGS, e.action.unitFlag.flag);
delete targets;
@@ -1660,7 +1688,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
break;
for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); ++itr)
if (IsUnit(*itr))
if (IsCreature(*itr))
(*itr)->ToUnit()->SetFlag(UNIT_NPC_FLAGS, e.action.unitFlag.flag);
delete targets;
@@ -1673,7 +1701,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
break;
for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); ++itr)
if (IsUnit(*itr))
if (IsCreature(*itr))
(*itr)->ToUnit()->RemoveFlag(UNIT_NPC_FLAGS, e.action.unitFlag.flag);
delete targets;