*Add script function DoGetThreat and DoModifyThreatPercent and check if !pUnit to prevent crash.

*Note: it is always possible that getVictim() becomes NULL during updateAI!

--HG--
branch : trunk
This commit is contained in:
megamage
2009-01-09 12:06:08 -06:00
parent 0f0f38c6d7
commit 9b8c50bb3b
27 changed files with 73 additions and 58 deletions
+14 -2
View File
@@ -711,11 +711,23 @@ void ScriptedAI::DoResetThreat()
{
Unit* pUnit = NULL;
pUnit = Unit::GetUnit((*m_creature), (*itr)->getUnitGuid());
if(pUnit && m_creature->getThreatManager().getThreat(pUnit))
m_creature->getThreatManager().modifyThreatPercent(pUnit, -100);
if(pUnit && DoGetThreat(pUnit))
DoModifyThreatPercent(pUnit, -100);
}
}
float ScriptedAI::DoGetThreat(Unit* pUnit)
{
if(!pUnit) return 0.0f;
return m_creature->getThreatManager().getThreat(pUnit);
}
void ScriptedAI::DoModifyThreatPercent(Unit *pUnit, int32 pct)
{
if(!pUnit) return;
m_creature->getThreatManager().modifyThreatPercent(pUnit, pct);
}
void ScriptedAI::DoTeleportPlayer(Unit* pUnit, float x, float y, float z, float o)
{
if(!pUnit || pUnit->GetTypeId() != TYPEID_PLAYER)
@@ -144,6 +144,9 @@ struct TRINITY_DLL_DECL ScriptedAI : public CreatureAI
//Drops all threat to 0%. Does not remove players from the threat list
void DoResetThreat();
float DoGetThreat(Unit *u);
void DoModifyThreatPercent(Unit *pUnit, int32 pct);
//Teleports a player without dropping threat (only teleports to same map)
void DoTeleportPlayer(Unit* pUnit, float x, float y, float z, float o);
void DoTeleportAll(float x, float y, float z, float o);
@@ -684,7 +684,7 @@ struct TRINITY_DLL_DECL Mob_EventAI : public ScriptedAI
Unit* target = GetTargetByType(param2, pActionInvoker);
if (target)
m_creature->getThreatManager().modifyThreatPercent(target, param1);
DoModifyThreatPercent(target, param1);
}
break;
case ACTION_T_THREAT_ALL_PCT:
@@ -696,7 +696,7 @@ struct TRINITY_DLL_DECL Mob_EventAI : public ScriptedAI
{
Temp = Unit::GetUnit((*m_creature),(*i)->getUnitGuid());
if (Temp)
m_creature->getThreatManager().modifyThreatPercent(Temp, param1);
DoModifyThreatPercent(Temp, param1);
}
}
break;
@@ -189,8 +189,8 @@ struct TRINITY_DLL_DECL boss_gurtogg_bloodboilAI : public ScriptedAI
pUnit = Unit::GetUnit((*m_creature), guid);
if(pUnit)
{
if(m_creature->getThreatManager().getThreat(pUnit))
m_creature->getThreatManager().modifyThreatPercent(pUnit, -100);
if(DoGetThreat(pUnit))
DoModifyThreatPercent(pUnit, -100);
if(TargetThreat)
m_creature->AddThreat(pUnit, TargetThreat);
}
@@ -231,7 +231,7 @@ struct TRINITY_DLL_DECL boss_gurtogg_bloodboilAI : public ScriptedAI
if(BewilderingStrikeTimer < diff)
{
DoCast(m_creature->getVictim(), SPELL_BEWILDERING_STRIKE);
float mt_threat = m_creature->getThreatManager().getThreat(m_creature->getVictim());
float mt_threat = DoGetThreat(m_creature->getVictim());
if (Unit* target = SelectUnit(SELECT_TARGET_TOPAGGRO, 1))
m_creature->AddThreat(target, mt_threat);
BewilderingStrikeTimer = 20000;
@@ -240,7 +240,7 @@ struct TRINITY_DLL_DECL boss_gurtogg_bloodboilAI : public ScriptedAI
if(EjectTimer < diff)
{
DoCast(m_creature->getVictim(), SPELL_EJECT1);
m_creature->getThreatManager().modifyThreatPercent(m_creature->getVictim(), -40);
DoModifyThreatPercent(m_creature->getVictim(), -40);
EjectTimer = 15000;
}else EjectTimer -= diff;
@@ -286,11 +286,11 @@ struct TRINITY_DLL_DECL boss_gurtogg_bloodboilAI : public ScriptedAI
{
Phase1 = false;
TargetThreat = m_creature->getThreatManager().getThreat(target);
TargetThreat = DoGetThreat(target);
TargetGUID = target->GetGUID();
target->CastSpell(m_creature, SPELL_TAUNT_GURTOGG, true);
if(m_creature->getThreatManager().getThreat(target))
m_creature->getThreatManager().modifyThreatPercent(target, -100);
if(DoGetThreat(target))
DoModifyThreatPercent(target, -100);
m_creature->AddThreat(target, 50000000.0f);
// If VMaps are disabled, this spell can call the whole instance
DoCast(m_creature, SPELL_INSIGNIFIGANCE, true);
@@ -316,7 +316,7 @@ struct TRINITY_DLL_DECL boss_teron_gorefiendAI : public ScriptedAI
Unit* pUnit = Unit::GetUnit((*m_creature), (*i)->getUnitGuid());
if(pUnit && pUnit->isAlive())
{
float threat = m_creature->getThreatManager().getThreat(pUnit);
float threat = DoGetThreat(pUnit);
Blossom->AddThreat(pUnit, threat);
}
}
@@ -104,8 +104,8 @@ struct TRINITY_DLL_DECL boss_broodlordAI : public ScriptedAI
{
DoCast(m_creature->getVictim(),SPELL_KNOCKBACK);
//Drop 50% aggro
if (m_creature->getThreatManager().getThreat(m_creature->getVictim()))
m_creature->getThreatManager().modifyThreatPercent(m_creature->getVictim(),-50);
if (DoGetThreat(m_creature->getVictim()))
DoModifyThreatPercent(m_creature->getVictim(),-50);
KnockBack_Timer = 15000 + rand()%15000;
}else KnockBack_Timer -= diff;
@@ -63,8 +63,8 @@ struct TRINITY_DLL_DECL boss_firemawAI : public ScriptedAI
if (WingBuffet_Timer < diff)
{
DoCast(m_creature->getVictim(),SPELL_WINGBUFFET);
if(m_creature->getThreatManager().getThreat(m_creature->getVictim()))
m_creature->getThreatManager().modifyThreatPercent(m_creature->getVictim(),-75);
if(DoGetThreat(m_creature->getVictim()))
DoModifyThreatPercent(m_creature->getVictim(),-75);
WingBuffet_Timer = 25000;
}else WingBuffet_Timer -= diff;
@@ -65,8 +65,8 @@ struct TRINITY_DLL_DECL boss_flamegorAI : public ScriptedAI
if (WingBuffet_Timer < diff)
{
DoCast(m_creature->getVictim(),SPELL_WINGBUFFET);
if(m_creature->getThreatManager().getThreat(m_creature->getVictim()))
m_creature->getThreatManager().modifyThreatPercent(m_creature->getVictim(),-75);
if(DoGetThreat(m_creature->getVictim()))
DoModifyThreatPercent(m_creature->getVictim(),-75);
WingBuffet_Timer = 25000;
}else WingBuffet_Timer -= diff;
@@ -97,8 +97,8 @@ struct TRINITY_DLL_DECL boss_razorgoreAI : public ScriptedAI
DoCast(m_creature->getVictim(),SPELL_CONFLAGRATION);
//We will remove this threat reduction and add an aura check.
//if(m_creature->getThreatManager().getThreat(m_creature->getVictim()))
//m_creature->getThreatManager().modifyThreatPercent(m_creature->getVictim(),-50);
//if(DoGetThreat(m_creature->getVictim()))
//DoModifyThreatPercent(m_creature->getVictim(),-50);
Conflagration_Timer = 12000;
}else Conflagration_Timer -= diff;
@@ -291,7 +291,7 @@ struct TRINITY_DLL_DECL mob_doomfire_targettingAI : public ScriptedAI
target = SelectUnit(SELECT_TARGET_RANDOM, 1);
if(target && target->isAlive())
{
m_creature->AddThreat(target, m_creature->getThreatManager().getThreat(m_creature->getVictim()));
m_creature->AddThreat(target, DoGetThreat(m_creature->getVictim()));
m_creature->GetMotionMaster()->MoveChase(target);
}
break;
@@ -469,7 +469,7 @@ struct TRINITY_DLL_DECL boss_archimondeAI : public ScriptedAI
if(!m_creature->IsWithinDistInMap(target, m_creature->GetAttackDistance(target)))
return true; // Cast Finger of Death
else // This target is closest, he is our new tank
m_creature->AddThreat(target, m_creature->getThreatManager().getThreat(m_creature->getVictim()));
m_creature->AddThreat(target, DoGetThreat(m_creature->getVictim()));
}
return false;
@@ -101,7 +101,7 @@ struct TRINITY_DLL_DECL mob_inner_demonAI : public ScriptedAI
if(done_by->GetGUID() != victimGUID && done_by->GetGUID() != m_creature->GetGUID())
{
damage = 0;
m_creature->getThreatManager().modifyThreatPercent(done_by, -100);
DoModifyThreatPercent(done_by, -100);
}
}
@@ -343,7 +343,7 @@ struct TRINITY_DLL_DECL boss_leotheras_the_blindAI : public ScriptedAI
if( pUnit_target && pUnit_target->isAlive())
{
pUnit->CastSpell(pUnit_target, SPELL_CONSUMING_MADNESS, true);
m_creature->getThreatManager().modifyThreatPercent(pUnit_target, -100);
DoModifyThreatPercent(pUnit_target, -100);
}
}
}
@@ -519,7 +519,7 @@ struct TRINITY_DLL_DECL boss_malchezaarAI : public ScriptedAI
if(axe)
{
float threat = 1000000.0f;
if(axe->getVictim() && m_creature->getThreatManager().getThreat(axe->getVictim()))
if(axe->getVictim() && DoGetThreat(axe->getVictim()))
{
threat = axe->getThreatManager().getThreat(axe->getVictim());
axe->getThreatManager().modifyThreatPercent(axe->getVictim(), -100);
@@ -795,9 +795,9 @@ struct TRINITY_DLL_DECL boss_bigbadwolfAI : public ScriptedAI
DoScriptText(SAY_WOLF_HOOD, m_creature);
DoCast(target, SPELL_LITTLE_RED_RIDING_HOOD, true);
TempThreat = m_creature->getThreatManager().getThreat(target);
TempThreat = DoGetThreat(target);
if(TempThreat)
m_creature->getThreatManager().modifyThreatPercent(target, -100);
DoModifyThreatPercent(target, -100);
HoodGUID = target->GetGUID();
m_creature->AddThreat(target, 1000000.0f);
ChaseTimer = 20000;
@@ -811,8 +811,8 @@ struct TRINITY_DLL_DECL boss_bigbadwolfAI : public ScriptedAI
if(target)
{
HoodGUID = 0;
if(m_creature->getThreatManager().getThreat(target))
m_creature->getThreatManager().modifyThreatPercent(target, -100);
if(DoGetThreat(target))
DoModifyThreatPercent(target, -100);
m_creature->AddThreat(target, TempThreat);
TempThreat = 0;
}
@@ -187,7 +187,7 @@ struct TRINITY_DLL_DECL boss_felblood_kaelthasAI : public ScriptedAI
Unit* pUnit = Unit::GetUnit((*m_creature), (*i)->getUnitGuid());
if(pUnit && pUnit->isAlive())
{
float threat = m_creature->getThreatManager().getThreat(pUnit);
float threat = DoGetThreat(pUnit);
SummonedUnit->AddThreat(pUnit, 0.1f);
}
}
@@ -508,7 +508,7 @@ struct TRINITY_DLL_DECL boss_kagani_nightstrikeAI : public boss_priestess_guestA
if(Gouge_Timer < diff)
{
DoCast(m_creature->getVictim(), SPELL_GOUGE);
m_creature->getThreatManager().modifyThreatPercent(m_creature->getVictim(),-100);
DoModifyThreatPercent(m_creature->getVictim(),-100);
Gouge_Timer = 5500;
}else Gouge_Timer -= diff;
@@ -758,7 +758,7 @@ struct TRINITY_DLL_DECL boss_yazzaiAI : public boss_priestess_guestAI
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0))
{
DoCast(target, SPELL_POLYMORPH);
m_creature->getThreatManager().modifyThreatPercent(target,-100);
DoModifyThreatPercent(target,-100);
Polymorph_Timer = 20000;
}
}else Polymorph_Timer -= diff;
@@ -1022,7 +1022,7 @@ struct TRINITY_DLL_DECL boss_garaxxasAI : public boss_priestess_guestAI
if(Freezing_Trap_Timer < diff)
{
DoCast(m_creature->getVictim(), SPELL_FREEZING_TRAP);
m_creature->getThreatManager().modifyThreatPercent(m_creature->getVictim(),-100);
DoModifyThreatPercent(m_creature->getVictim(),-100);
Freezing_Trap_Timer = 30000;
}else Freezing_Trap_Timer -= diff;
@@ -105,8 +105,8 @@ struct TRINITY_DLL_DECL boss_darkmaster_gandlingAI : public ScriptedAI
target = SelectUnit(SELECT_TARGET_RANDOM,0);
if (target && target->GetTypeId() == TYPEID_PLAYER)
{
if(m_creature->getThreatManager().getThreat(target))
m_creature->getThreatManager().modifyThreatPercent(target, -100);
if(DoGetThreat(target))
DoModifyThreatPercent(target, -100);
switch(rand()%6)
{
@@ -115,7 +115,7 @@ struct TRINITY_DLL_DECL boss_jandicebarovAI : public ScriptedAI
m_creature->setFaction(35);
m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
m_creature->SetUInt32Value(UNIT_FIELD_DISPLAYID,11686); // Invisible Model
m_creature->getThreatManager().modifyThreatPercent(m_creature->getVictim(),-99);
DoModifyThreatPercent(m_creature->getVictim(),-99);
//Summon 10 Illusions attacking random gamers
Unit* target = NULL;
@@ -247,8 +247,8 @@ struct TRINITY_DLL_DECL boss_dathrohan_balnazzarAI : public ScriptedAI
if (rand()%100 < 60) //60% chance to cast
{
DoCast(m_creature->getVictim(),SPELL_PSYCHICSCREAM);
if(m_creature->getThreatManager().getThreat(m_creature->getVictim()))
m_creature->getThreatManager().modifyThreatPercent(m_creature->getVictim(),-50);
if(DoGetThreat(m_creature->getVictim()))
DoModifyThreatPercent(m_creature->getVictim(),-50);
}
//15 seconds until we should cast this again
PsychicScream_Timer = 20000;
@@ -139,8 +139,8 @@ struct TRINITY_DLL_DECL boss_void_reaverAI : public ScriptedAI
DoCast(m_creature->getVictim(),SPELL_KNOCK_AWAY);
//Drop 25% aggro
if(m_creature->getThreatManager().getThreat(m_creature->getVictim()))
m_creature->getThreatManager().modifyThreatPercent(m_creature->getVictim(),-25);
if(DoGetThreat(m_creature->getVictim()))
DoModifyThreatPercent(m_creature->getVictim(),-25);
KnockAway_Timer = 30000;
}else KnockAway_Timer -= diff;
@@ -187,8 +187,8 @@ struct TRINITY_DLL_DECL boss_vemAI : public ScriptedAI
if (KnockBack_Timer < diff)
{
DoCast(m_creature->getVictim(),SPELL_KNOCKBACK);
if(m_creature->getThreatManager().getThreat(m_creature->getVictim()))
m_creature->getThreatManager().modifyThreatPercent(m_creature->getVictim(),-80);
if(DoGetThreat(m_creature->getVictim()))
DoModifyThreatPercent(m_creature->getVictim(),-80);
KnockBack_Timer = 15000 + rand()%10000;
}else KnockBack_Timer -= diff;
@@ -127,8 +127,8 @@ struct TRINITY_DLL_DECL boss_fankrissAI : public ScriptedAI
{
DoCast(target, SPELL_ROOT);
if(m_creature->getThreatManager().getThreat(target))
m_creature->getThreatManager().modifyThreatPercent(target, -100);
if(DoGetThreat(target))
DoModifyThreatPercent(target, -100);
switch(rand()%3)
{
@@ -184,8 +184,8 @@ struct TRINITY_DLL_DECL boss_arlokkAI : public ScriptedAI
if(PhaseTwo && Gouge_Timer < diff)
{
DoCast(m_creature->getVictim(), SPELL_GOUGE);
if(m_creature->getThreatManager().getThreat(m_creature->getVictim()))
m_creature->getThreatManager().modifyThreatPercent(m_creature->getVictim(),-80);
if(DoGetThreat(m_creature->getVictim()))
DoModifyThreatPercent(m_creature->getVictim(),-80);
Gouge_Timer = 17000+rand()%10000;
}else Gouge_Timer -= diff;
@@ -59,8 +59,8 @@ struct TRINITY_DLL_DECL boss_grilekAI : public ScriptedAI
target = SelectUnit(SELECT_TARGET_RANDOM,1);
if(m_creature->getThreatManager().getThreat(m_creature->getVictim()))
m_creature->getThreatManager().modifyThreatPercent(m_creature->getVictim(),-50);
if(DoGetThreat(m_creature->getVictim()))
DoModifyThreatPercent(m_creature->getVictim(),-50);
if (target)
AttackStart(target);
@@ -98,8 +98,8 @@ struct TRINITY_DLL_DECL boss_jindoAI : public ScriptedAI
{
DoCast(m_creature->getVictim(), SPELL_HEX);
if(m_creature->getThreatManager().getThreat(m_creature->getVictim()))
m_creature->getThreatManager().modifyThreatPercent(m_creature->getVictim(),-80);
if(DoGetThreat(m_creature->getVictim()))
DoModifyThreatPercent(m_creature->getVictim(),-80);
Hex_Timer = 12000 + rand()%8000;
}else Hex_Timer -= diff;
@@ -127,8 +127,8 @@ struct TRINITY_DLL_DECL boss_jindoAI : public ScriptedAI
{
DoTeleportPlayer(target, -11583.7783,-1249.4278,77.5471,4.745);
if(m_creature->getThreatManager().getThreat(m_creature->getVictim()))
m_creature->getThreatManager().modifyThreatPercent(target,-100);
if(DoGetThreat(m_creature->getVictim()))
DoModifyThreatPercent(target,-100);
Skeletons = m_creature->SummonCreature(14826, target->GetPositionX()+2, target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
Skeletons->AI()->AttackStart(target);
@@ -146,8 +146,8 @@ struct TRINITY_DLL_DECL boss_marliAI : public ScriptedAI
m_creature->UpdateDamagePhysical(BASE_ATTACK);
DoCast(m_creature->getVictim(),SPELL_ENVOLWINGWEB);
if(m_creature->getThreatManager().getThreat(m_creature->getVictim()))
m_creature->getThreatManager().modifyThreatPercent(m_creature->getVictim(),-100);
if(DoGetThreat(m_creature->getVictim()))
DoModifyThreatPercent(m_creature->getVictim(),-100);
PhaseTwo = true;
Transform_Timer = 35000 + rand()%25000;
@@ -117,8 +117,8 @@ struct TRINITY_DLL_DECL boss_renatakiAI : public ScriptedAI
Unit* target = NULL;
target = SelectUnit(SELECT_TARGET_RANDOM,1);
if(m_creature->getThreatManager().getThreat(m_creature->getVictim()))
m_creature->getThreatManager().modifyThreatPercent(m_creature->getVictim(),-50);
if(DoGetThreat(m_creature->getVictim()))
DoModifyThreatPercent(m_creature->getVictim(),-50);
if (target)
AttackStart(target);
@@ -434,8 +434,8 @@ struct TRINITY_DLL_DECL mob_zealot_zathAI : public ScriptedAI
{
DoCast(m_creature->getVictim(),SPELL_GOUGE);
if(m_creature->getThreatManager().getThreat(m_creature->getVictim()))
m_creature->getThreatManager().modifyThreatPercent(m_creature->getVictim(),-100);
if(DoGetThreat(m_creature->getVictim()))
DoModifyThreatPercent(m_creature->getVictim(),-100);
Gouge_Timer = 17000+rand()%10000;
}else Gouge_Timer -= diff;