*setActive(false) when creature dies.

*Fix some script crash bugs.

--HG--
branch : trunk
This commit is contained in:
megamage
2009-01-10 10:43:57 -06:00
parent bb7fb087ca
commit 4b5bca4f0a
4 changed files with 21 additions and 18 deletions
@@ -214,14 +214,18 @@ struct TRINITY_DLL_DECL boss_the_lurker_belowAI : public Scripted_NoMovementAI
SpoutAnimTimer = 1000; SpoutAnimTimer = 1000;
}else SpoutAnimTimer-=diff; }else SpoutAnimTimer-=diff;
std::list<HostilReference*>& m_threatlist = m_creature->getThreatManager().getThreatList(); Map *map = m_creature->GetMap();
for(std::list<HostilReference*>::iterator itr = m_threatlist.begin(); itr!= m_threatlist.end(); ++itr) if (map->IsDungeon() && pInstance->GetData(DATA_THELURKERBELOWEVENT) == IN_PROGRESS)
{ {
Unit *target = Unit::GetUnit(*m_creature, (*itr)->getUnitGuid()); Map::PlayerList const &PlayerList = map->GetPlayers();
if(target && target->GetTypeId() == TYPEID_PLAYER && m_creature->HasInArc((double)diff/20000*(double)M_PI*2,target) && m_creature->GetDistance(target) <= SPOUT_DIST && !target->IsInWater()) for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i)
{
Player *target = i->getSource();
if(target->isAlive() && m_creature->HasInArc((double)diff/20000*(double)M_PI*2,target) && m_creature->GetDistance(target) <= SPOUT_DIST && !target->IsInWater())
DoCast(target,SPELL_SPOUT,true);//only knock back palyers in arc, in 100yards, not in water DoCast(target,SPELL_SPOUT,true);//only knock back palyers in arc, in 100yards, not in water
} }
} }
}
void StartRotate(Unit* victim) void StartRotate(Unit* victim)
{ {
@@ -272,6 +272,7 @@ struct TRINITY_DLL_DECL boss_terestianAI : public ScriptedAI
if(SummonKilrek && Kilrek) if(SummonKilrek && Kilrek)
{ {
Kilrek->Respawn(); Kilrek->Respawn();
if(Kilrek->AI())
Kilrek->AI()->AttackStart(m_creature->getVictim()); Kilrek->AI()->AttackStart(m_creature->getVictim());
SummonKilrek = false; SummonKilrek = false;
@@ -111,11 +111,12 @@ struct TRINITY_DLL_DECL boss_alarAI : public ScriptedAI
m_creature->SetDisplayId(m_creature->GetNativeDisplayId()); m_creature->SetDisplayId(m_creature->GetNativeDisplayId());
m_creature->SetSpeed(MOVE_RUN, DefaultMoveSpeedRate); m_creature->SetSpeed(MOVE_RUN, DefaultMoveSpeedRate);
m_creature->SetFloatValue(UNIT_FIELD_BOUNDINGRADIUS, 10); //m_creature->SetFloatValue(UNIT_FIELD_BOUNDINGRADIUS, 10);
m_creature->SetFloatValue(UNIT_FIELD_COMBATREACH, 10); //m_creature->SetFloatValue(UNIT_FIELD_COMBATREACH, 10);
m_creature->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FIRE, true); m_creature->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FIRE, true);
m_creature->SetUnitMovementFlags(MOVEMENTFLAG_LEVITATING); m_creature->SetUnitMovementFlags(MOVEMENTFLAG_LEVITATING);
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
m_creature->setActive(false);
} }
void Aggro(Unit *who) void Aggro(Unit *who)
@@ -125,6 +126,7 @@ struct TRINITY_DLL_DECL boss_alarAI : public ScriptedAI
m_creature->SetUnitMovementFlags(MOVEMENTFLAG_LEVITATING); // after enterevademode will be set walk movement m_creature->SetUnitMovementFlags(MOVEMENTFLAG_LEVITATING); // after enterevademode will be set walk movement
DoZoneInCombat(); DoZoneInCombat();
m_creature->setActive(true);
} }
void JustDied(Unit *victim) void JustDied(Unit *victim)
@@ -136,13 +138,8 @@ struct TRINITY_DLL_DECL boss_alarAI : public ScriptedAI
void JustSummoned(Creature *summon) void JustSummoned(Creature *summon)
{ {
if(summon->GetEntry() == CREATURE_EMBER_OF_ALAR) if(summon->GetEntry() == CREATURE_EMBER_OF_ALAR)
{
if(Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0)) if(Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0))
{
summon->AI()->AttackStart(target); summon->AI()->AttackStart(target);
summon->SetInCombatWith(target);
}
}
} }
void MoveInLineOfSight(Unit *who) {} void MoveInLineOfSight(Unit *who) {}
@@ -405,7 +402,7 @@ struct TRINITY_DLL_DECL boss_alarAI : public ScriptedAI
else else
{ {
Unit *target = NULL; Unit *target = NULL;
if(Phase1 && (target = m_creature->SelectNearbyTarget()) && m_creature->IsHostileTo(target)) // core bug, 1620 faction bugged if(Phase1 && (target = m_creature->SelectNearestTarget(5)))
m_creature->AI()->AttackStart(target); m_creature->AI()->AttackStart(target);
else else
{ {
+1
View File
@@ -1643,6 +1643,7 @@ void Creature::setDeathState(DeathState s)
{ {
SetUInt64Value (UNIT_FIELD_TARGET,0); // remove target selection in any cases (can be set at aura remove in Unit::setDeathState) SetUInt64Value (UNIT_FIELD_TARGET,0); // remove target selection in any cases (can be set at aura remove in Unit::setDeathState)
SetUInt32Value(UNIT_NPC_FLAGS, 0); SetUInt32Value(UNIT_NPC_FLAGS, 0);
setActive(false);
if(!isPet() && GetCreatureInfo()->SkinLootId) if(!isPet() && GetCreatureInfo()->SkinLootId)
if ( LootTemplates_Skinning.HaveLootFor(GetCreatureInfo()->SkinLootId) ) if ( LootTemplates_Skinning.HaveLootFor(GetCreatureInfo()->SkinLootId) )