convert Blood Furnace to new format

--HG--
branch : trunk
This commit is contained in:
Supabad
2010-08-07 23:17:11 +02:00
parent 79b0567a74
commit 7ce0a6cf69
4 changed files with 669 additions and 613 deletions
@@ -37,97 +37,109 @@ enum eEnums
SPELL_POISON = 30914
};
struct boss_broggokAI : public ScriptedAI
class boss_broggok : public CreatureScript
{
boss_broggokAI(Creature *c) : ScriptedAI(c)
{
pInstance = c->GetInstanceData();
}
public:
ScriptedInstance* pInstance;
uint32 AcidSpray_Timer;
uint32 PoisonSpawn_Timer;
uint32 PoisonBolt_Timer;
void Reset()
{
AcidSpray_Timer = 10000;
PoisonSpawn_Timer = 5000;
PoisonBolt_Timer = 7000;
if (pInstance)
boss_broggok()
: CreatureScript("boss_broggok")
{
pInstance->SetData(TYPE_BROGGOK_EVENT, NOT_STARTED);
pInstance->HandleGameObject(pInstance->GetData64(DATA_DOOR4), true);
}
}
void EnterCombat(Unit * /*who*/)
{
DoScriptText(SAY_AGGRO, me);
if (pInstance)
struct boss_broggokAI : public ScriptedAI
{
pInstance->SetData(TYPE_BROGGOK_EVENT, IN_PROGRESS);
pInstance->HandleGameObject(pInstance->GetData64(DATA_DOOR4), false);
boss_broggokAI(Creature* pCreature) : ScriptedAI(pCreature)
{
pInstance = pCreature->GetInstanceData();
}
ScriptedInstance* pInstance;
uint32 AcidSpray_Timer;
uint32 PoisonSpawn_Timer;
uint32 PoisonBolt_Timer;
void Reset()
{
AcidSpray_Timer = 10000;
PoisonSpawn_Timer = 5000;
PoisonBolt_Timer = 7000;
if (pInstance)
{
pInstance->SetData(TYPE_BROGGOK_EVENT, NOT_STARTED);
pInstance->HandleGameObject(pInstance->GetData64(DATA_DOOR4), true);
}
}
void EnterCombat(Unit * /*who*/)
{
DoScriptText(SAY_AGGRO, me);
if (pInstance)
{
pInstance->SetData(TYPE_BROGGOK_EVENT, IN_PROGRESS);
pInstance->HandleGameObject(pInstance->GetData64(DATA_DOOR4), false);
}
}
void JustSummoned(Creature *summoned)
{
summoned->setFaction(16);
summoned->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
summoned->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
summoned->CastSpell(summoned,SPELL_POISON,false,0,0,me->GetGUID());
}
void UpdateAI(const uint32 diff)
{
if (!UpdateVictim())
return;
if (AcidSpray_Timer <= diff)
{
DoCast(me->getVictim(), SPELL_SLIME_SPRAY);
AcidSpray_Timer = 4000+rand()%8000;
}
else
AcidSpray_Timer -=diff;
if (PoisonBolt_Timer <= diff)
{
DoCast(me->getVictim(), SPELL_POISON_BOLT);
PoisonBolt_Timer = 4000+rand()%8000;
}
else
PoisonBolt_Timer -=diff;
if (PoisonSpawn_Timer <= diff)
{
DoCast(me, SPELL_POISON_CLOUD);
PoisonSpawn_Timer = 20000;
}
else
PoisonSpawn_Timer -=diff;
DoMeleeAttackIfReady();
}
void JustDied(Unit* /*who*/)
{
if (pInstance)
{
pInstance->HandleGameObject(pInstance->GetData64(DATA_DOOR4), true);
pInstance->HandleGameObject(pInstance->GetData64(DATA_DOOR5), true);
pInstance->SetData(TYPE_BROGGOK_EVENT, DONE);
}
}
};
CreatureAI* GetAI(Creature* Creature) const
{
return new boss_broggokAI (Creature);
}
}
void JustSummoned(Creature *summoned)
{
summoned->setFaction(16);
summoned->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
summoned->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
summoned->CastSpell(summoned,SPELL_POISON,false,0,0,me->GetGUID());
}
void UpdateAI(const uint32 diff)
{
if (!UpdateVictim())
return;
if (AcidSpray_Timer <= diff)
{
DoCast(me->getVictim(), SPELL_SLIME_SPRAY);
AcidSpray_Timer = 4000+rand()%8000;
} else AcidSpray_Timer -=diff;
if (PoisonBolt_Timer <= diff)
{
DoCast(me->getVictim(), SPELL_POISON_BOLT);
PoisonBolt_Timer = 4000+rand()%8000;
} else PoisonBolt_Timer -=diff;
if (PoisonSpawn_Timer <= diff)
{
DoCast(me, SPELL_POISON_CLOUD);
PoisonSpawn_Timer = 20000;
} else PoisonSpawn_Timer -=diff;
DoMeleeAttackIfReady();
}
void JustDied(Unit* /*who*/)
{
if (pInstance)
{
pInstance->HandleGameObject(pInstance->GetData64(DATA_DOOR4), true);
pInstance->HandleGameObject(pInstance->GetData64(DATA_DOOR5), true);
pInstance->SetData(TYPE_BROGGOK_EVENT, DONE);
}
}
};
CreatureAI* GetAI_boss_broggok(Creature* pCreature)
{
return new boss_broggokAI (pCreature);
}
void AddSC_boss_broggok()
{
Script *newscript;
newscript = new Script;
newscript->Name = "boss_broggok";
newscript->GetAI = &GetAI_boss_broggok;
newscript->RegisterSelf();
new boss_broggok();
}
@@ -67,193 +67,213 @@ const float ShadowmoonChannelers[5][4]=
{316,-109,-24.6,1.257}
};
struct boss_kelidan_the_breakerAI : public ScriptedAI
class boss_kelidan_the_breaker : public CreatureScript
{
boss_kelidan_the_breakerAI(Creature *c) : ScriptedAI(c)
{
pInstance = c->GetInstanceData();
for (uint8 i=0; i<5; ++i)
Channelers[i] = 0;
}
public:
ScriptedInstance* pInstance;
uint32 ShadowVolley_Timer;
uint32 BurningNova_Timer;
uint32 Firenova_Timer;
uint32 Corruption_Timer;
uint32 check_Timer;
bool Firenova;
bool addYell;
uint64 Channelers[5];
void Reset()
{
ShadowVolley_Timer = 1000;
BurningNova_Timer = 15000;
Corruption_Timer = 5000;
check_Timer = 0;
Firenova = false;
addYell = false;
SummonChannelers();
if (pInstance)
pInstance->SetData(TYPE_KELIDAN_THE_BREAKER_EVENT, NOT_STARTED);
}
void EnterCombat(Unit* who)
{
DoScriptText(SAY_WAKE, me);
if (me->IsNonMeleeSpellCasted(false))
me->InterruptNonMeleeSpells(true);
DoStartMovement(who);
if (pInstance)
pInstance->SetData(TYPE_KELIDAN_THE_BREAKER_EVENT, IN_PROGRESS);
}
void KilledUnit(Unit* /*victim*/)
{
if (rand()%2)
return;
DoScriptText(RAND(SAY_KILL_1,SAY_KILL_2), me);
}
void ChannelerEngaged(Unit* who)
{
if (who && !addYell)
boss_kelidan_the_breaker()
: CreatureScript("boss_kelidan_the_breaker")
{
addYell = true;
DoScriptText(RAND(SAY_ADD_AGGRO_1,SAY_ADD_AGGRO_2,SAY_ADD_AGGRO_3), me);
}
for (uint8 i=0; i<5; ++i)
{
Creature *channeler = Unit::GetCreature(*me, Channelers[i]);
if (who && channeler && !channeler->isInCombat())
channeler->AI()->AttackStart(who);
}
}
void ChannelerDied(Unit* killer)
{
for (uint8 i=0; i<5; ++i)
{
Creature *channeler = Unit::GetCreature(*me, Channelers[i]);
if (channeler && channeler->isAlive())
return;
}
if (killer)
me->AI()->AttackStart(killer);
}
uint64 GetChanneled(Creature *channeler1)
{
SummonChannelers();
if (!channeler1) return NULL;
uint8 i;
for (i=0; i<5; ++i)
struct boss_kelidan_the_breakerAI : public ScriptedAI
{
Creature *channeler = Unit::GetCreature(*me, Channelers[i]);
if (channeler && channeler->GetGUID() == channeler1->GetGUID())
break;
}
return Channelers[(i+2)%5];
}
void SummonChannelers()
{
for (uint8 i=0; i<5; ++i)
{
Creature *channeler = Unit::GetCreature(*me, Channelers[i]);
if (!channeler || channeler->isDead())
channeler = me->SummonCreature(ENTRY_CHANNELER,ShadowmoonChannelers[i][0],ShadowmoonChannelers[i][1],ShadowmoonChannelers[i][2],ShadowmoonChannelers[i][3],TEMPSUMMON_CORPSE_TIMED_DESPAWN,300000);
if (channeler)
Channelers[i] = channeler->GetGUID();
else
Channelers[i] = 0;
}
}
void JustDied(Unit* /*Killer*/)
{
DoScriptText(SAY_DIE, me);
if (!pInstance)
return;
pInstance->SetData(TYPE_KELIDAN_THE_BREAKER_EVENT, DONE);
pInstance->HandleGameObject(pInstance->GetData64(DATA_DOOR1), true);
pInstance->HandleGameObject(pInstance->GetData64(DATA_DOOR6), true);
}
void UpdateAI(const uint32 diff)
{
if (!UpdateVictim())
{
if (check_Timer <= diff)
boss_kelidan_the_breakerAI(Creature* pCreature) : ScriptedAI(pCreature)
{
if (!me->IsNonMeleeSpellCasted(false))
DoCast(me, SPELL_EVOCATION);
check_Timer = 5000;
} else check_Timer -= diff;
return;
}
if (Firenova)
{
if (Firenova_Timer <= diff)
{
DoCast(me, SPELL_FIRE_NOVA, true);
Firenova = false;
ShadowVolley_Timer = 2000;
} else Firenova_Timer -=diff;
return;
}
if (ShadowVolley_Timer <= diff)
{
DoCast(me, SPELL_SHADOW_BOLT_VOLLEY);
ShadowVolley_Timer = 5000+rand()%8000;
} else ShadowVolley_Timer -=diff;
if (Corruption_Timer <= diff)
{
DoCast(me, SPELL_CORRUPTION);
Corruption_Timer = 30000+rand()%20000;
} else Corruption_Timer -=diff;
if (BurningNova_Timer <= diff)
{
if (me->IsNonMeleeSpellCasted(false))
me->InterruptNonMeleeSpells(true);
DoScriptText(SAY_NOVA, me);
if (SpellEntry *nova = GET_SPELL(SPELL_BURNING_NOVA))
{
if (Aura * aura = Aura::TryCreate(nova, me, me))
aura->ApplyForTargets();
pInstance = pCreature->GetInstanceData();
for (uint8 i=0; i<5; ++i)
Channelers[i] = 0;
}
if (IsHeroic())
DoTeleportAll(me->GetPositionX(),me->GetPositionY(),me->GetPositionZ(),me->GetOrientation());
ScriptedInstance* pInstance;
BurningNova_Timer = 20000+rand()%8000;
Firenova_Timer= 5000;
Firenova = true;
} else BurningNova_Timer -=diff;
uint32 ShadowVolley_Timer;
uint32 BurningNova_Timer;
uint32 Firenova_Timer;
uint32 Corruption_Timer;
uint32 check_Timer;
bool Firenova;
bool addYell;
uint64 Channelers[5];
DoMeleeAttackIfReady();
}
void Reset()
{
ShadowVolley_Timer = 1000;
BurningNova_Timer = 15000;
Corruption_Timer = 5000;
check_Timer = 0;
Firenova = false;
addYell = false;
SummonChannelers();
if (pInstance)
pInstance->SetData(TYPE_KELIDAN_THE_BREAKER_EVENT, NOT_STARTED);
}
void EnterCombat(Unit* who)
{
DoScriptText(SAY_WAKE, me);
if (me->IsNonMeleeSpellCasted(false))
me->InterruptNonMeleeSpells(true);
DoStartMovement(who);
if (pInstance)
pInstance->SetData(TYPE_KELIDAN_THE_BREAKER_EVENT, IN_PROGRESS);
}
void KilledUnit(Unit* /*victim*/)
{
if (rand()%2)
return;
DoScriptText(RAND(SAY_KILL_1,SAY_KILL_2), me);
}
void ChannelerEngaged(Unit* who)
{
if (who && !addYell)
{
addYell = true;
DoScriptText(RAND(SAY_ADD_AGGRO_1,SAY_ADD_AGGRO_2,SAY_ADD_AGGRO_3), me);
}
for (uint8 i=0; i<5; ++i)
{
Creature *channeler = Unit::GetCreature(*me, Channelers[i]);
if (who && channeler && !channeler->isInCombat())
channeler->AI()->AttackStart(who);
}
}
void ChannelerDied(Unit* killer)
{
for (uint8 i=0; i<5; ++i)
{
Creature *channeler = Unit::GetCreature(*me, Channelers[i]);
if (channeler && channeler->isAlive())
return;
}
if (killer)
me->AI()->AttackStart(killer);
}
uint64 GetChanneled(Creature *channeler1)
{
SummonChannelers();
if (!channeler1) return NULL;
uint8 i;
for (i=0; i<5; ++i)
{
Creature *channeler = Unit::GetCreature(*me, Channelers[i]);
if (channeler && channeler->GetGUID() == channeler1->GetGUID())
break;
}
return Channelers[(i+2)%5];
}
void SummonChannelers()
{
for (uint8 i=0; i<5; ++i)
{
Creature *channeler = Unit::GetCreature(*me, Channelers[i]);
if (!channeler || channeler->isDead())
channeler = me->SummonCreature(ENTRY_CHANNELER,ShadowmoonChannelers[i][0],ShadowmoonChannelers[i][1],ShadowmoonChannelers[i][2],ShadowmoonChannelers[i][3],TEMPSUMMON_CORPSE_TIMED_DESPAWN,300000);
if (channeler)
Channelers[i] = channeler->GetGUID();
else
Channelers[i] = 0;
}
}
void JustDied(Unit* /*Killer*/)
{
DoScriptText(SAY_DIE, me);
if (!pInstance)
return;
pInstance->SetData(TYPE_KELIDAN_THE_BREAKER_EVENT, DONE);
pInstance->HandleGameObject(pInstance->GetData64(DATA_DOOR1), true);
pInstance->HandleGameObject(pInstance->GetData64(DATA_DOOR6), true);
}
void UpdateAI(const uint32 diff)
{
if (!UpdateVictim())
{
if (check_Timer <= diff)
{
if (!me->IsNonMeleeSpellCasted(false))
DoCast(me, SPELL_EVOCATION);
check_Timer = 5000;
}
else
check_Timer -= diff;
return;
}
if (Firenova)
{
if (Firenova_Timer <= diff)
{
DoCast(me, SPELL_FIRE_NOVA, true);
Firenova = false;
ShadowVolley_Timer = 2000;
}
else
Firenova_Timer -=diff;
return;
}
if (ShadowVolley_Timer <= diff)
{
DoCast(me, SPELL_SHADOW_BOLT_VOLLEY);
ShadowVolley_Timer = 5000+rand()%8000;
}
else
ShadowVolley_Timer -=diff;
if (Corruption_Timer <= diff)
{
DoCast(me, SPELL_CORRUPTION);
Corruption_Timer = 30000+rand()%20000;
}
else
Corruption_Timer -=diff;
if (BurningNova_Timer <= diff)
{
if (me->IsNonMeleeSpellCasted(false))
me->InterruptNonMeleeSpells(true);
DoScriptText(SAY_NOVA, me);
if (SpellEntry *nova = GET_SPELL(SPELL_BURNING_NOVA))
{
if (Aura * aura = Aura::TryCreate(nova, me, me))
aura->ApplyForTargets();
}
if (IsHeroic())
DoTeleportAll(me->GetPositionX(),me->GetPositionY(),me->GetPositionZ(),me->GetOrientation());
BurningNova_Timer = 20000+rand()%8000;
Firenova_Timer= 5000;
Firenova = true;
}
else
BurningNova_Timer -=diff;
DoMeleeAttackIfReady();
}
};
CreatureAI* GetAI(Creature* Creature) const
{
return new boss_kelidan_the_breakerAI (Creature);
}
};
CreatureAI* GetAI_boss_kelidan_the_breaker(Creature* pCreature)
{
return new boss_kelidan_the_breakerAI (pCreature);
}
/*######
## mob_shadowmoon_channeler
######*/
@@ -267,92 +287,99 @@ enum eShadowmoon
SPELL_CHANNELING = 39123
};
struct mob_shadowmoon_channelerAI : public ScriptedAI
class mob_shadowmoon_channeler : public CreatureScript
{
mob_shadowmoon_channelerAI(Creature *c) : ScriptedAI(c)
{
}
public:
uint32 ShadowBolt_Timer;
uint32 MarkOfShadow_Timer;
uint32 check_Timer;
void Reset()
{
ShadowBolt_Timer = 1000+rand()%1000;
MarkOfShadow_Timer = 5000+rand()%2000;
check_Timer = 0;
if (me->IsNonMeleeSpellCasted(false))
me->InterruptNonMeleeSpells(true);
}
void EnterCombat(Unit* who)
{
if (Creature *Kelidan = me->FindNearestCreature(ENTRY_KELIDAN, 100))
CAST_AI(boss_kelidan_the_breakerAI, Kelidan->AI())->ChannelerEngaged(who);
if (me->IsNonMeleeSpellCasted(false))
me->InterruptNonMeleeSpells(true);
DoStartMovement(who);
}
void JustDied(Unit* Killer)
{
if (Creature *Kelidan = me->FindNearestCreature(ENTRY_KELIDAN, 100))
CAST_AI(boss_kelidan_the_breakerAI, Kelidan->AI())->ChannelerDied(Killer);
}
void UpdateAI(const uint32 diff)
{
if (!UpdateVictim())
mob_shadowmoon_channeler()
: CreatureScript("mob_shadowmoon_channeler")
{
if (check_Timer <= diff)
{
if (!me->IsNonMeleeSpellCasted(false))
if (Creature *Kelidan = me->FindNearestCreature(ENTRY_KELIDAN, 100))
{
uint64 channeler = CAST_AI(boss_kelidan_the_breakerAI, Kelidan->AI())->GetChanneled(me);
if (Unit *channeled = Unit::GetUnit(*me, channeler))
DoCast(channeled, SPELL_CHANNELING);
}
check_Timer = 5000;
} else check_Timer -= diff;
return;
}
if (MarkOfShadow_Timer <= diff)
struct mob_shadowmoon_channelerAI : public ScriptedAI
{
if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
DoCast(pTarget, SPELL_MARK_OF_SHADOW);
MarkOfShadow_Timer = 15000+rand()%5000;
} else MarkOfShadow_Timer -=diff;
mob_shadowmoon_channelerAI(Creature* pCreature) : ScriptedAI(pCreature)
{
}
if (ShadowBolt_Timer <= diff)
uint32 ShadowBolt_Timer;
uint32 MarkOfShadow_Timer;
uint32 check_Timer;
void Reset()
{
ShadowBolt_Timer = 1000+rand()%1000;
MarkOfShadow_Timer = 5000+rand()%2000;
check_Timer = 0;
if (me->IsNonMeleeSpellCasted(false))
me->InterruptNonMeleeSpells(true);
}
void EnterCombat(Unit* who)
{
if (Creature *Kelidan = me->FindNearestCreature(ENTRY_KELIDAN, 100))
CAST_AI(boss_kelidan_the_breaker::boss_kelidan_the_breakerAI, Kelidan->AI())->ChannelerEngaged(who);
if (me->IsNonMeleeSpellCasted(false))
me->InterruptNonMeleeSpells(true);
DoStartMovement(who);
}
void JustDied(Unit* Killer)
{
if (Creature *Kelidan = me->FindNearestCreature(ENTRY_KELIDAN, 100))
CAST_AI(boss_kelidan_the_breaker::boss_kelidan_the_breakerAI, Kelidan->AI())->ChannelerDied(Killer);
}
void UpdateAI(const uint32 diff)
{
if (!UpdateVictim())
{
if (check_Timer <= diff)
{
if (!me->IsNonMeleeSpellCasted(false))
if (Creature *Kelidan = me->FindNearestCreature(ENTRY_KELIDAN, 100))
{
uint64 channeler = CAST_AI(boss_kelidan_the_breaker::boss_kelidan_the_breakerAI, Kelidan->AI())->GetChanneled(me);
if (Unit *channeled = Unit::GetUnit(*me, channeler))
DoCast(channeled, SPELL_CHANNELING);
}
check_Timer = 5000;
}
else
check_Timer -= diff;
return;
}
if (MarkOfShadow_Timer <= diff)
{
if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
DoCast(pTarget, SPELL_MARK_OF_SHADOW);
MarkOfShadow_Timer = 15000+rand()%5000;
}
else
MarkOfShadow_Timer -=diff;
if (ShadowBolt_Timer <= diff)
{
DoCast(me->getVictim(), SPELL_SHADOW_BOLT);
ShadowBolt_Timer = 5000+rand()%1000;
}
else
ShadowBolt_Timer -=diff;
DoMeleeAttackIfReady();
}
};
CreatureAI* GetAI(Creature* Creature) const
{
DoCast(me->getVictim(), SPELL_SHADOW_BOLT);
ShadowBolt_Timer = 5000+rand()%1000;
} else ShadowBolt_Timer -=diff;
DoMeleeAttackIfReady();
}
return new mob_shadowmoon_channelerAI (Creature);
}
};
CreatureAI* GetAI_mob_shadowmoon_channeler(Creature* pCreature)
{
return new mob_shadowmoon_channelerAI (pCreature);
}
void AddSC_boss_kelidan_the_breaker()
{
Script *newscript;
newscript = new Script;
newscript->Name = "boss_kelidan_the_breaker";
newscript->GetAI = &GetAI_boss_kelidan_the_breaker;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "mob_shadowmoon_channeler";
newscript->GetAI = &GetAI_mob_shadowmoon_channeler;
newscript->RegisterSelf();
new boss_kelidan_the_breaker();
new mob_shadowmoon_channeler();
}
@@ -41,114 +41,126 @@ enum eEnums
SPELL_DOMINATION = 25772 // ???
};
struct boss_the_makerAI : public ScriptedAI
class boss_the_maker : public CreatureScript
{
boss_the_makerAI(Creature *c) : ScriptedAI(c)
{
pInstance = c->GetInstanceData();
}
public:
ScriptedInstance* pInstance;
uint32 AcidSpray_Timer;
uint32 ExplodingBreaker_Timer;
uint32 Domination_Timer;
uint32 Knockdown_Timer;
void Reset()
{
AcidSpray_Timer = 15000;
ExplodingBreaker_Timer = 6000;
Domination_Timer = 120000;
Knockdown_Timer = 10000;
if (!pInstance)
return;
pInstance->SetData(TYPE_THE_MAKER_EVENT, NOT_STARTED);
pInstance->HandleGameObject(pInstance->GetData64(DATA_DOOR2), true);
}
void EnterCombat(Unit * /*who*/)
{
DoScriptText(RAND(SAY_AGGRO_1,SAY_AGGRO_2,SAY_AGGRO_3), me);
if (!pInstance)
return;
pInstance->SetData(TYPE_THE_MAKER_EVENT, IN_PROGRESS);
pInstance->HandleGameObject(pInstance->GetData64(DATA_DOOR2), false);
}
void KilledUnit(Unit* /*victim*/)
{
DoScriptText(RAND(SAY_KILL_1,SAY_KILL_2), me);
}
void JustDied(Unit* /*Killer*/)
{
DoScriptText(SAY_DIE, me);
if (!pInstance)
return;
pInstance->SetData(TYPE_THE_MAKER_EVENT, DONE);
pInstance->HandleGameObject(pInstance->GetData64(DATA_DOOR2), true);
pInstance->HandleGameObject(pInstance->GetData64(DATA_DOOR3), true);
}
void UpdateAI(const uint32 diff)
{
if (!UpdateVictim())
return;
if (AcidSpray_Timer <= diff)
boss_the_maker()
: CreatureScript("boss_the_maker")
{
DoCast(me->getVictim(), SPELL_ACID_SPRAY);
AcidSpray_Timer = 15000+rand()%8000;
} else AcidSpray_Timer -=diff;
}
if (ExplodingBreaker_Timer <= diff)
struct boss_the_makerAI : public ScriptedAI
{
if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM,0))
DoCast(pTarget, SPELL_EXPLODING_BREAKER);
ExplodingBreaker_Timer = 4000+rand()%8000;
} else ExplodingBreaker_Timer -=diff;
boss_the_makerAI(Creature* pCreature) : ScriptedAI(pCreature)
{
pInstance = pCreature->GetInstanceData();
}
/* // Disabled until Core Support for mind control
if (domination_timer_timer <= diff)
ScriptedInstance* pInstance;
uint32 AcidSpray_Timer;
uint32 ExplodingBreaker_Timer;
uint32 Domination_Timer;
uint32 Knockdown_Timer;
void Reset()
{
AcidSpray_Timer = 15000;
ExplodingBreaker_Timer = 6000;
Domination_Timer = 120000;
Knockdown_Timer = 10000;
if (!pInstance)
return;
pInstance->SetData(TYPE_THE_MAKER_EVENT, NOT_STARTED);
pInstance->HandleGameObject(pInstance->GetData64(DATA_DOOR2), true);
}
void EnterCombat(Unit * /*who*/)
{
DoScriptText(RAND(SAY_AGGRO_1,SAY_AGGRO_2,SAY_AGGRO_3), me);
if (!pInstance)
return;
pInstance->SetData(TYPE_THE_MAKER_EVENT, IN_PROGRESS);
pInstance->HandleGameObject(pInstance->GetData64(DATA_DOOR2), false);
}
void KilledUnit(Unit* /*victim*/)
{
DoScriptText(RAND(SAY_KILL_1,SAY_KILL_2), me);
}
void JustDied(Unit* /*Killer*/)
{
DoScriptText(SAY_DIE, me);
if (!pInstance)
return;
pInstance->SetData(TYPE_THE_MAKER_EVENT, DONE);
pInstance->HandleGameObject(pInstance->GetData64(DATA_DOOR2), true);
pInstance->HandleGameObject(pInstance->GetData64(DATA_DOOR3), true);
}
void UpdateAI(const uint32 diff)
{
if (!UpdateVictim())
return;
if (AcidSpray_Timer <= diff)
{
DoCast(me->getVictim(), SPELL_ACID_SPRAY);
AcidSpray_Timer = 15000+rand()%8000;
}
else
AcidSpray_Timer -=diff;
if (ExplodingBreaker_Timer <= diff)
{
if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM,0))
DoCast(pTarget, SPELL_EXPLODING_BREAKER);
ExplodingBreaker_Timer = 4000+rand()%8000;
}
else
ExplodingBreaker_Timer -=diff;
/* // Disabled until Core Support for mind control
if (domination_timer_timer <= diff)
{
Unit *pTarget;
pTarget = SelectUnit(SELECT_TARGET_RANDOM,0);
DoCast(pTarget, SPELL_DOMINATION);
domination_timer = 120000;
} else domination_timer -=diff;
*/
if (Knockdown_Timer <= diff)
{
DoCast(me->getVictim(), SPELL_KNOCKDOWN);
Knockdown_Timer = 4000+rand()%8000;
}
else
Knockdown_Timer -=diff;
DoMeleeAttackIfReady();
}
};
CreatureAI* GetAI(Creature* Creature) const
{
Unit *pTarget;
pTarget = SelectUnit(SELECT_TARGET_RANDOM,0);
DoCast(pTarget, SPELL_DOMINATION);
domination_timer = 120000;
} else domination_timer -=diff;
*/
if (Knockdown_Timer <= diff)
{
DoCast(me->getVictim(), SPELL_KNOCKDOWN);
Knockdown_Timer = 4000+rand()%8000;
} else Knockdown_Timer -=diff;
DoMeleeAttackIfReady();
}
return new boss_the_makerAI (Creature);
}
};
CreatureAI* GetAI_boss_the_makerAI(Creature* pCreature)
{
return new boss_the_makerAI (pCreature);
}
void AddSC_boss_the_maker()
{
Script *newscript;
newscript = new Script;
newscript->Name = "boss_the_maker";
newscript->GetAI = &GetAI_boss_the_makerAI;
newscript->RegisterSelf();
new boss_the_maker();
}
@@ -30,205 +30,210 @@ EndScriptData */
#define ENTRY_SEWER2 181766
#define MAX_ENCOUNTER 3
struct instance_blood_furnace : public ScriptedInstance
class instance_blood_furnace : public InstanceMapScript
{
instance_blood_furnace(Map* pMap) : ScriptedInstance(pMap) {Initialize();};
uint64 The_MakerGUID;
uint64 BroggokGUID;
uint64 Kelidan_The_BreakerGUID;
uint64 Door1GUID;
uint64 Door2GUID;
uint64 Door3GUID;
uint64 Door4GUID;
uint64 Door5GUID;
uint64 Door6GUID;
uint64 PrisonCell1GUID;
uint64 PrisonCell2GUID;
uint64 PrisonCell3GUID;
uint64 PrisonCell4GUID;
uint64 PrisonCell5GUID;
uint64 PrisonCell6GUID;
uint64 PrisonCell7GUID;
uint64 PrisonCell8GUID;
uint32 m_auiEncounter[MAX_ENCOUNTER];
std::string str_data;
void Initialize()
{
memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
The_MakerGUID = 0;
BroggokGUID = 0;
Kelidan_The_BreakerGUID = 0;
Door1GUID = 0;
Door2GUID = 0;
Door3GUID = 0;
Door4GUID = 0;
Door5GUID = 0;
Door6GUID = 0;
PrisonCell1GUID = 0;
PrisonCell2GUID = 0;
PrisonCell3GUID = 0;
PrisonCell4GUID = 0;
PrisonCell5GUID = 0;
PrisonCell6GUID = 0;
PrisonCell7GUID = 0;
PrisonCell8GUID = 0;
}
void OnCreatureCreate(Creature* pCreature, bool add)
{
if (!add)
return;
switch(pCreature->GetEntry())
public:
instance_blood_furnace()
: InstanceMapScript("instance_blood_furnace")
{
case 17381: The_MakerGUID = pCreature->GetGUID(); break;
case 17380: BroggokGUID = pCreature->GetGUID(); break;
case 17377: Kelidan_The_BreakerGUID = pCreature->GetGUID(); break;
}
}
void OnGameObjectCreate(GameObject* pGo, bool add)
{
if (!add)
return;
if (pGo->GetEntry() == 181766) //Final exit door
Door1GUID = pGo->GetGUID();
if (pGo->GetEntry() == 181811) //The Maker Front door
Door2GUID = pGo->GetGUID();
if (pGo->GetEntry() == 181812) //The Maker Rear door
Door3GUID = pGo->GetGUID();
if (pGo->GetEntry() == 181822) //Broggok Front door
Door4GUID = pGo->GetGUID();
if (pGo->GetEntry() == 181819) //Broggok Rear door
Door5GUID = pGo->GetGUID();
if (pGo->GetEntry() == 181823) //Kelidan exit door
Door6GUID = pGo->GetGUID();
if (pGo->GetEntry() == 181813) //The Maker prison cell front right
PrisonCell1GUID = pGo->GetGUID();
if (pGo->GetEntry() == 181814) //The Maker prison cell back right
PrisonCell2GUID = pGo->GetGUID();
if (pGo->GetEntry() == 181816) //The Maker prison cell front left
PrisonCell3GUID = pGo->GetGUID();
if (pGo->GetEntry() == 181815) //The Maker prison cell back left
PrisonCell4GUID = pGo->GetGUID();
if (pGo->GetEntry() == 181821) //Broggok prison cell front right
PrisonCell5GUID = pGo->GetGUID();
if (pGo->GetEntry() == 181818) //Broggok prison cell back right
PrisonCell6GUID = pGo->GetGUID();
if (pGo->GetEntry() == 181820) //Broggok prison cell front left
PrisonCell7GUID = pGo->GetGUID();
if (pGo->GetEntry() == 181817) //Broggok prison cell back left
PrisonCell8GUID = pGo->GetGUID();
}
uint64 GetData64(uint32 data)
{
switch(data)
{
case DATA_THE_MAKER: return The_MakerGUID;
case DATA_BROGGOK: return BroggokGUID;
case DATA_KELIDAN_THE_MAKER: return Kelidan_The_BreakerGUID;
case DATA_DOOR1: return Door1GUID;
case DATA_DOOR2: return Door2GUID;
case DATA_DOOR3: return Door3GUID;
case DATA_DOOR4: return Door4GUID;
case DATA_DOOR5: return Door5GUID;
case DATA_DOOR6: return Door6GUID;
case DATA_PRISON_CELL1: return PrisonCell1GUID;
case DATA_PRISON_CELL2: return PrisonCell2GUID;
case DATA_PRISON_CELL3: return PrisonCell3GUID;
case DATA_PRISON_CELL4: return PrisonCell4GUID;
case DATA_PRISON_CELL5: return PrisonCell5GUID;
case DATA_PRISON_CELL6: return PrisonCell6GUID;
case DATA_PRISON_CELL7: return PrisonCell7GUID;
case DATA_PRISON_CELL8: return PrisonCell8GUID;
}
return 0;
}
void SetData(uint32 /*type*/, uint32 data)
{
switch(data)
{
case TYPE_THE_MAKER_EVENT: m_auiEncounter[0] = data; break;
case TYPE_BROGGOK_EVENT: m_auiEncounter[1] = data; break;
case TYPE_KELIDAN_THE_BREAKER_EVENT: m_auiEncounter[2] = data; break;
}
if (data == DONE)
struct instance_blood_furnace_InstanceMapScript : public ScriptedInstance
{
OUT_SAVE_INST_DATA;
instance_blood_furnace_InstanceMapScript(Map* pMap) : ScriptedInstance(pMap) {Initialize();};
std::ostringstream saveStream;
saveStream << m_auiEncounter[0] << " " << m_auiEncounter[1] << " " << m_auiEncounter[2];
uint64 The_MakerGUID;
uint64 BroggokGUID;
uint64 Kelidan_The_BreakerGUID;
str_data = saveStream.str();
uint64 Door1GUID;
uint64 Door2GUID;
uint64 Door3GUID;
uint64 Door4GUID;
uint64 Door5GUID;
uint64 Door6GUID;
SaveToDB();
OUT_SAVE_INST_DATA_COMPLETE;
}
}
uint64 PrisonCell1GUID;
uint64 PrisonCell2GUID;
uint64 PrisonCell3GUID;
uint64 PrisonCell4GUID;
uint64 PrisonCell5GUID;
uint64 PrisonCell6GUID;
uint64 PrisonCell7GUID;
uint64 PrisonCell8GUID;
uint32 GetData(uint32 data)
{
switch(data)
uint32 m_auiEncounter[MAX_ENCOUNTER];
std::string str_data;
void Initialize()
{
memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
The_MakerGUID = 0;
BroggokGUID = 0;
Kelidan_The_BreakerGUID = 0;
Door1GUID = 0;
Door2GUID = 0;
Door3GUID = 0;
Door4GUID = 0;
Door5GUID = 0;
Door6GUID = 0;
PrisonCell1GUID = 0;
PrisonCell2GUID = 0;
PrisonCell3GUID = 0;
PrisonCell4GUID = 0;
PrisonCell5GUID = 0;
PrisonCell6GUID = 0;
PrisonCell7GUID = 0;
PrisonCell8GUID = 0;
}
void OnCreatureCreate(Creature* pCreature, bool add)
{
if (!add)
return;
switch(pCreature->GetEntry())
{
case 17381: The_MakerGUID = pCreature->GetGUID(); break;
case 17380: BroggokGUID = pCreature->GetGUID(); break;
case 17377: Kelidan_The_BreakerGUID = pCreature->GetGUID(); break;
}
}
void OnGameObjectCreate(GameObject* pGo, bool add)
{
if (!add)
return;
if (pGo->GetEntry() == 181766) //Final exit door
Door1GUID = pGo->GetGUID();
if (pGo->GetEntry() == 181811) //The Maker Front door
Door2GUID = pGo->GetGUID();
if (pGo->GetEntry() == 181812) //The Maker Rear door
Door3GUID = pGo->GetGUID();
if (pGo->GetEntry() == 181822) //Broggok Front door
Door4GUID = pGo->GetGUID();
if (pGo->GetEntry() == 181819) //Broggok Rear door
Door5GUID = pGo->GetGUID();
if (pGo->GetEntry() == 181823) //Kelidan exit door
Door6GUID = pGo->GetGUID();
if (pGo->GetEntry() == 181813) //The Maker prison cell front right
PrisonCell1GUID = pGo->GetGUID();
if (pGo->GetEntry() == 181814) //The Maker prison cell back right
PrisonCell2GUID = pGo->GetGUID();
if (pGo->GetEntry() == 181816) //The Maker prison cell front left
PrisonCell3GUID = pGo->GetGUID();
if (pGo->GetEntry() == 181815) //The Maker prison cell back left
PrisonCell4GUID = pGo->GetGUID();
if (pGo->GetEntry() == 181821) //Broggok prison cell front right
PrisonCell5GUID = pGo->GetGUID();
if (pGo->GetEntry() == 181818) //Broggok prison cell back right
PrisonCell6GUID = pGo->GetGUID();
if (pGo->GetEntry() == 181820) //Broggok prison cell front left
PrisonCell7GUID = pGo->GetGUID();
if (pGo->GetEntry() == 181817) //Broggok prison cell back left
PrisonCell8GUID = pGo->GetGUID();
}
uint64 GetData64(uint32 data)
{
switch(data)
{
case DATA_THE_MAKER: return The_MakerGUID;
case DATA_BROGGOK: return BroggokGUID;
case DATA_KELIDAN_THE_MAKER: return Kelidan_The_BreakerGUID;
case DATA_DOOR1: return Door1GUID;
case DATA_DOOR2: return Door2GUID;
case DATA_DOOR3: return Door3GUID;
case DATA_DOOR4: return Door4GUID;
case DATA_DOOR5: return Door5GUID;
case DATA_DOOR6: return Door6GUID;
case DATA_PRISON_CELL1: return PrisonCell1GUID;
case DATA_PRISON_CELL2: return PrisonCell2GUID;
case DATA_PRISON_CELL3: return PrisonCell3GUID;
case DATA_PRISON_CELL4: return PrisonCell4GUID;
case DATA_PRISON_CELL5: return PrisonCell5GUID;
case DATA_PRISON_CELL6: return PrisonCell6GUID;
case DATA_PRISON_CELL7: return PrisonCell7GUID;
case DATA_PRISON_CELL8: return PrisonCell8GUID;
}
return 0;
}
void SetData(uint32 /*type*/, uint32 data)
{
switch(data)
{
case TYPE_THE_MAKER_EVENT: m_auiEncounter[0] = data; break;
case TYPE_BROGGOK_EVENT: m_auiEncounter[1] = data; break;
case TYPE_KELIDAN_THE_BREAKER_EVENT: m_auiEncounter[2] = data; break;
}
if (data == DONE)
{
OUT_SAVE_INST_DATA;
std::ostringstream saveStream;
saveStream << m_auiEncounter[0] << " " << m_auiEncounter[1] << " " << m_auiEncounter[2];
str_data = saveStream.str();
SaveToDB();
OUT_SAVE_INST_DATA_COMPLETE;
}
}
uint32 GetData(uint32 data)
{
switch(data)
{
case TYPE_THE_MAKER_EVENT: return m_auiEncounter[0];
case TYPE_BROGGOK_EVENT: return m_auiEncounter[1];
case TYPE_KELIDAN_THE_BREAKER_EVENT: return m_auiEncounter[2];
}
return 0;
}
const char* Save()
{
return str_data.c_str();
}
void Load(const char* in)
{
if (!in)
{
OUT_LOAD_INST_DATA_FAIL;
return;
}
OUT_LOAD_INST_DATA(in);
std::istringstream loadStream(in);
loadStream >> m_auiEncounter[0] >> m_auiEncounter[1] >> m_auiEncounter[2];
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
if (m_auiEncounter[i] == IN_PROGRESS || m_auiEncounter[i] == FAIL)
m_auiEncounter[i] = NOT_STARTED;
OUT_LOAD_INST_DATA_COMPLETE;
}
};
InstanceData* GetInstanceData(Map* pMap) const
{
case TYPE_THE_MAKER_EVENT: return m_auiEncounter[0];
case TYPE_BROGGOK_EVENT: return m_auiEncounter[1];
case TYPE_KELIDAN_THE_BREAKER_EVENT: return m_auiEncounter[2];
return new instance_blood_furnace_InstanceMapScript(pMap);
}
return 0;
}
const char* Save()
{
return str_data.c_str();
}
void Load(const char* in)
{
if (!in)
{
OUT_LOAD_INST_DATA_FAIL;
return;
}
OUT_LOAD_INST_DATA(in);
std::istringstream loadStream(in);
loadStream >> m_auiEncounter[0] >> m_auiEncounter[1] >> m_auiEncounter[2];
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
if (m_auiEncounter[i] == IN_PROGRESS || m_auiEncounter[i] == FAIL)
m_auiEncounter[i] = NOT_STARTED;
OUT_LOAD_INST_DATA_COMPLETE;
}
};
InstanceData* GetInstanceData_instance_blood_furnace(Map* pMap)
{
return new instance_blood_furnace(pMap);
}
void AddSC_instance_blood_furnace()
{
Script *newscript;
newscript = new Script;
newscript->Name = "instance_blood_furnace";
newscript->GetInstanceData = &GetInstanceData_instance_blood_furnace;
newscript->RegisterSelf();
new instance_blood_furnace();
}