Core/Scripts: Baleroc cleanup

- Remove redundant OnGameObjectCreate/Remove, base implementation already takes care of adding and removing doors
- Added missing overrides, fixup bracing and whitespace
- Revamped a little achievement script and get ride of ugly CAST_AI
This commit is contained in:
ariel-
2016-07-23 06:39:15 -03:00
parent 4a96106d60
commit 2d3fa37ef1
2 changed files with 67 additions and 115 deletions

View File

@@ -20,10 +20,9 @@
***
***Implement Vital Spark - http://www.wowhead.com/spell=99262
***Implement Vital Flame - http://www.wowhead.com/spell=99263
***
***Redesign achievement data storage system
*/
#include "GridNotifiers.h"
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "SpellScript.h"
@@ -59,6 +58,8 @@ enum Spells
SPELL_COUNTDOWN_4 = 99518,
SPELL_COUNTDOWN_5 = 99519,
SPELL_SMOULDERING = 101093,
SPELL_BERSERK = 26662
};
@@ -89,15 +90,13 @@ enum Emotes
ABILITY_DECIMATION_BLADE = 9
};
enum Guids
{
GUID_TORMENTED = 1
};
enum Misc
{
EQUIP_DECIMATION_BLADE = 71082,
EQUIP_INFERNO_BLADE = 71138,
GUID_TORMENTED = 1,
DATA_SHARE_THE_PAIN = 5830
};
class boss_baleroc : public CreatureScript
@@ -107,7 +106,7 @@ class boss_baleroc : public CreatureScript
struct boss_balerocAI : public BossAI
{
boss_balerocAI(Creature* creature) : BossAI(creature, DATA_BALEROC) {}
boss_balerocAI(Creature* creature) : BossAI(creature, DATA_BALEROC) { }
bool _canYellKilledPlayer;
@@ -126,13 +125,13 @@ class boss_baleroc : public CreatureScript
case SPELL_INFERNO_BLADE:
SetEquipmentSlots(false, EQUIP_INFERNO_BLADE, EQUIP_UNEQUIP);
me->SetCanDualWield(false);
events.ScheduleEvent(EVENT_RESTORE_WEAPONS, 15*IN_MILLISECONDS);
events.ScheduleEvent(EVENT_RESTORE_WEAPONS, 15 * IN_MILLISECONDS);
break;
case SPELL_DECIMATION_BLADE:
case SPELL_DECIMATION_BLADE_2:
SetEquipmentSlots(false, EQUIP_DECIMATION_BLADE, EQUIP_UNEQUIP);
me->SetCanDualWield(false);
events.ScheduleEvent(EVENT_RESTORE_WEAPONS, 15*IN_MILLISECONDS);
events.ScheduleEvent(EVENT_RESTORE_WEAPONS, 15 * IN_MILLISECONDS);
break;
default:
break;
@@ -145,18 +144,14 @@ class boss_baleroc : public CreatureScript
Talk(EMOTE_AGGRO);
instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me);
events.ScheduleEvent(EVENT_INCENDIARY_SOUL, 8.5*IN_MILLISECONDS);
events.ScheduleEvent(EVENT_SHARDS_OF_TORMENT, 5*IN_MILLISECONDS);
events.ScheduleEvent(EVENT_SHARDS_OF_TORMENT, 5 * IN_MILLISECONDS);
if (me->GetMap()->IsHeroic())
events.ScheduleEvent(EVENT_COUNTDOWN, 26*IN_MILLISECONDS);
events.ScheduleEvent(EVENT_COUNTDOWN, 26 * IN_MILLISECONDS);
events.ScheduleEvent(EVENT_BLADE, 30.5*IN_MILLISECONDS);
events.ScheduleEvent(EVENT_BERSERK, 6*MINUTE*IN_MILLISECONDS);
events.ScheduleEvent(EVENT_BERSERK, 6 * MINUTE*IN_MILLISECONDS);
//Reset our achievement list. We do this here and not in reset, as the debuff may have been spread after the boss has reset.
for (int i = 0; i < 25; i++)
{
_sharedThePain[i].player = 0;
_sharedThePain[i].tormented = 0;
}
_sharedThePain.clear();
}
void KilledUnit(Unit* who) override
@@ -176,16 +171,16 @@ class boss_baleroc : public CreatureScript
SetEquipmentSlots(true);
me->SetCanDualWield(true);;
instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
if (Map* map = me->GetMap())
Map::PlayerList const& playerList = me->GetMap()->GetPlayers();
for (auto const& playerRef : playerList)
{
Map::PlayerList const &PlayerList = map->GetPlayers();
if (!PlayerList.isEmpty())
for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i)
if (i->GetSource()->ToPlayer()->HasQuestForItem(69848))
{
DoCast(101093);
break;
}
Player* player = playerRef.GetSource();
if (player->HasQuestForItem(69848))
{
DoCastAOE(SPELL_SMOULDERING);
break;
}
}
}
@@ -198,7 +193,7 @@ class boss_baleroc : public CreatureScript
_DespawnAtEvade();
}
void DoMeleeAttackIfReady()
void DoBalerocAttackIfReady()
{
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
@@ -232,9 +227,8 @@ class boss_baleroc : public CreatureScript
void UpdateAI(uint32 diff) override
{
if (me->IsAlive())
if (!UpdateVictim())
return;
if (!UpdateVictim())
return;
events.Update(diff);
@@ -259,7 +253,7 @@ class boss_baleroc : public CreatureScript
Talk(ABILITY_DECIMATION_BLADE);
break;
}
events.ScheduleEvent(EVENT_BLADE, 47*IN_MILLISECONDS);
events.ScheduleEvent(EVENT_BLADE, 47 * IN_MILLISECONDS);
break;
case EVENT_RESTORE_WEAPONS:
SetEquipmentSlots(true);
@@ -276,11 +270,11 @@ class boss_baleroc : public CreatureScript
case EVENT_SHARDS_OF_TORMENT:
Talk(EMOTE_SHARDS_OF_TORMENT);
DoCast(SPELL_SHARDS_OF_TORMENT);
events.ScheduleEvent(EVENT_SHARDS_OF_TORMENT, 34*IN_MILLISECONDS);
events.ScheduleEvent(EVENT_SHARDS_OF_TORMENT, 34 * IN_MILLISECONDS);
break;
case EVENT_COUNTDOWN:
DoCast(SPELL_COUNTDOWN);
events.ScheduleEvent(EVENT_COUNTDOWN, 48*IN_MILLISECONDS);
events.ScheduleEvent(EVENT_COUNTDOWN, 48 * IN_MILLISECONDS);
break;
case EVENT_BERSERK:
DoCast(SPELL_BERSERK);
@@ -294,7 +288,8 @@ class boss_baleroc : public CreatureScript
break;
}
}
DoMeleeAttackIfReady();
DoBalerocAttackIfReady();
}
void SetGUID(ObjectGuid guid, int32 type = 0) override
@@ -302,41 +297,35 @@ class boss_baleroc : public CreatureScript
switch (type)
{
case GUID_TORMENTED:
for (int i = 0; i < 25; i++)
{
if (_sharedThePain[i].player == guid)
{
_sharedThePain[i].tormented++;
break;
}
else if (_sharedThePain[i].player == 0)
{
_sharedThePain[i].player = guid;
_sharedThePain[i].tormented++;
break;
}
}
{
auto itr = _sharedThePain.find(guid);
if (itr == _sharedThePain.end())
_sharedThePain.emplace(guid, 1);
else
++itr->second;
break;
}
default:
break;
}
}
bool SharedThePain()
uint32 GetData(uint32 type) const override
{
for (int i = 0; _sharedThePain[i].player != 0; i++)
if (_sharedThePain[i].tormented > 3)
return false;
return true;
if (type != DATA_SHARE_THE_PAIN)
return 0;
for (auto const& pair : _sharedThePain)
{
if (pair.second > 3)
return 0;
}
return 1;
}
private:
struct _sharedThePain
{
uint64 player;
uint32 tormented;
}
_sharedThePain[25];
std::unordered_map<ObjectGuid, uint32> _sharedThePain;
};
CreatureAI* GetAI(Creature* creature) const override
@@ -386,7 +375,7 @@ class npc_shard_of_torment : public CreatureScript
_baleroc->AI()->KilledUnit(who);
}
void UpdateAI(uint32 diff)
void UpdateAI(uint32 diff) override
{
_events.Update(diff);
@@ -412,7 +401,7 @@ class npc_shard_of_torment : public CreatureScript
CreatureAI* GetAI(Creature* creature) const
{
return new npc_shard_of_tormentAI(creature);
return GetFirelandsAI<npc_shard_of_tormentAI>(creature);
}
};
@@ -425,7 +414,7 @@ class spell_countdown_p1 : public SpellScriptLoader
{
PrepareSpellScript(spell_countdown_p1_SpellScript);
bool Load()
bool Load() override
{
return GetCaster()->GetTypeId() == TYPEID_UNIT;
}
@@ -561,14 +550,14 @@ class spell_decimating_strike : public SpellScriptLoader
{
PrepareSpellScript(spell_decimating_strike_SpellScript);
bool Load()
bool Load() override
{
if (GetCaster()->GetTypeId() != TYPEID_UNIT)
return false;
return true;
}
bool Validate(SpellInfo const* /*spellInfo*/)
bool Validate(SpellInfo const* /*spellInfo*/) override
{
if (!sSpellMgr->GetSpellInfo(SPELL_DECIMATING_STRIKE))
return false;
@@ -589,13 +578,13 @@ class spell_decimating_strike : public SpellScriptLoader
SetHitDamage(uint32(250000));
}
void Register()
void Register() override
{
OnHit += SpellHitFn(spell_decimating_strike_SpellScript::ChangeDamage);
}
};
SpellScript* GetSpellScript() const
SpellScript* GetSpellScript() const override
{
return new spell_decimating_strike_SpellScript();
}
@@ -610,7 +599,7 @@ class spell_shards_of_torment : public SpellScriptLoader
{
PrepareSpellScript(spell_shards_of_torment_SpellScript);
bool Load()
bool Load() override
{
return GetCaster()->GetTypeId() == TYPEID_UNIT;
}
@@ -675,7 +664,7 @@ class spell_baleroc_torment : public SpellScriptLoader
{
PrepareSpellScript(spell_baleroc_torment_SpellScript);
bool Load()
bool Load() override
{
return GetCaster()->GetTypeId() == TYPEID_UNIT;
}
@@ -747,18 +736,13 @@ class spell_baleroc_tormented : public SpellScriptLoader
}
}
void Register()
void Register() override
{
OnHit += SpellHitFn(spell_baleroc_tormented_SpellScript::ChangeDamage);
}
};
SpellScript* GetSpellScript() const override
{
return new spell_baleroc_tormented_SpellScript();
}
class spell_baleroc_tormented_AuraScript : public AuraScript
{
PrepareAuraScript(spell_baleroc_tormented_AuraScript);
@@ -780,6 +764,11 @@ class spell_baleroc_tormented : public SpellScriptLoader
}
};
SpellScript* GetSpellScript() const override
{
return new spell_baleroc_tormented_SpellScript();
}
AuraScript* GetAuraScript() const override
{
return new spell_baleroc_tormented_AuraScript();
@@ -823,7 +812,7 @@ class spell_baleroc_tormented_heroic : public SpellScriptLoader
{
PrepareSpellScript(spell_baleroc_tormented_heroic_SpellScript);
bool Load()
bool Load() override
{
return GetCaster()->GetTypeId() == TYPEID_PLAYER;
}
@@ -854,13 +843,10 @@ class achievement_share_the_pain : public AchievementCriteriaScript
bool OnCheck(Player* /*source*/, Unit* target) override
{
if (!target)
if (!target || !target->IsAIEnabled)
return false;
if (BalerocAI* balerocAI = CAST_AI(BalerocAI, target->GetAI()))
return balerocAI->SharedThePain();
return false;
return target->GetAI()->GetData(DATA_SHARE_THE_PAIN) != 0;
}
};

View File

@@ -41,8 +41,6 @@ class instance_firelands : public InstanceMapScript
SetHeaders(DataHeader);
SetBossNumber(EncounterCount);
LoadDoorData(doorData);
BalerocGUID.Clear();
}
void OnCreatureCreate(Creature* creature) override
@@ -59,38 +57,6 @@ class instance_firelands : public InstanceMapScript
}
}
void OnGameObjectCreate(GameObject* go) override
{
switch(go->GetEntry())
{
case GO_LORD_RHYOLITH_BRIDGE:
case GO_BETH_TILAC_DOOR:
//case GO_BALEROC_FIREWALL:
case GO_MAJORDOMO_FIREWALL:
case GO_RAGNAROS_DOOR:
AddDoor(go, true);
break;
default:
break;
}
}
void OnGameObjectRemove(GameObject* go) override
{
switch (go->GetEntry())
{
case GO_LORD_RHYOLITH_BRIDGE:
case GO_BETH_TILAC_DOOR:
//case GO_BALEROC_FIREWALL:
case GO_MAJORDOMO_FIREWALL:
case GO_RAGNAROS_DOOR:
AddDoor(go, false);
break;
default:
break;
}
}
ObjectGuid GetGuidData(uint32 type) const override
{
switch (type)