Scripts/Icecrown Citadel: Fixed Ice Bomb visual synchronization

Closes #5179
This commit is contained in:
Shauren
2012-04-07 01:06:56 +02:00
parent 478427e0d2
commit 33d5e7c753
2 changed files with 39 additions and 25 deletions

View File

@@ -3410,10 +3410,7 @@ void SpellMgr::LoadDbcDataCorrections()
spellInfo->EffectImplicitTargetA[0] = TARGET_DEST_CASTER;
break;
case 69846: // Frost Bomb
spellInfo->speed = 10;
spellInfo->EffectImplicitTargetA[0] = TARGET_DEST_TARGET_ANY;
spellInfo->EffectImplicitTargetB[0] = TARGET_UNIT_TARGET_ANY;
spellInfo->Effect[1] = 0;
spellInfo->speed = 0.0f; // This spell's summon happens instantly
break;
case 71614: // Ice Lock
spellInfo->Mechanic = MECHANIC_STUN;

View File

@@ -61,6 +61,7 @@ enum Spells
SPELL_ASPHYXIATION = 71665,
SPELL_FROST_BOMB_TRIGGER = 69846,
SPELL_FROST_BOMB_VISUAL = 70022,
SPELL_BIRTH_NO_VISUAL = 40031,
SPELL_FROST_BOMB = 69845,
SPELL_MYSTIC_BUFFET = 70128,
@@ -169,6 +170,23 @@ class FrostwyrmLandEvent : public BasicEvent
Position const& _dest;
};
class FrostBombExplosion : public BasicEvent
{
public:
FrostBombExplosion(Creature* owner, uint64 sindragosaGUID) : _owner(owner), _sindragosaGUID(sindragosaGUID) { }
bool Execute(uint64 /*eventTime*/, uint32 /*updateTime*/)
{
_owner->CastSpell((Unit*)NULL, SPELL_FROST_BOMB, true, NULL, NULL, _sindragosaGUID);
_owner->RemoveAurasDueToSpell(SPELL_FROST_BOMB_VISUAL);
return true;
}
private:
Creature* _owner;
uint64 _sindragosaGUID;
};
class boss_sindragosa : public CreatureScript
{
public:
@@ -325,6 +343,12 @@ class boss_sindragosa : public CreatureScript
void JustSummoned(Creature* summon)
{
summons.Summon(summon);
if (summon->GetEntry() == NPC_FROST_BOMB)
{
summon->CastSpell(summon, SPELL_FROST_BOMB_VISUAL, true);
summon->CastSpell(summon, SPELL_BIRTH_NO_VISUAL, true);
summon->m_Events.AddEvent(new FrostBombExplosion(summon, me->GetGUID()), summon->m_Events.CalculateTime(5500));
}
}
void SummonedCreatureDespawn(Creature* summon)
@@ -337,18 +361,25 @@ class boss_sindragosa : public CreatureScript
void SpellHitTarget(Unit* target, SpellInfo const* spell)
{
if (uint32 spellId = sSpellMgr->GetSpellIdForDifficulty(70127, me))
{
if (spellId == spell->Id)
{
if (Aura const* mysticBuffet = target->GetAura(spell->Id))
_mysticBuffetStack = std::max<uint8>(_mysticBuffetStack, mysticBuffet->GetStackAmount());
return;
}
}
// Frost Infusion
if (Player* player = target->ToPlayer())
{
if (uint32 spellId = sSpellMgr->GetSpellIdForDifficulty(_isThirdPhase ? SPELL_FROST_BREATH_P2 : SPELL_FROST_BREATH_P1, me))
{
if (player->GetQuestStatus(QUEST_FROST_INFUSION) == QUEST_STATUS_INCOMPLETE && spellId == spell->Id)
if (spellId == spell->Id)
{
if (Item* shadowsEdge = player->GetWeaponForAttack(BASE_ATTACK, true))
Item* shadowsEdge = player->GetWeaponForAttack(BASE_ATTACK, true);
if (player->GetQuestStatus(QUEST_FROST_INFUSION) == QUEST_STATUS_INCOMPLETE && shadowsEdge)
{
if (!player->HasAura(SPELL_FROST_IMBUED_BLADE) && shadowsEdge->GetEntry() == ITEM_SHADOW_S_EDGE)
{
@@ -366,15 +397,11 @@ class boss_sindragosa : public CreatureScript
player->CastSpell(player, SPELL_FROST_INFUSION, true);
}
}
return;
}
}
}
if (spell->Id == SPELL_FROST_BOMB_TRIGGER)
{
target->CastSpell(target, SPELL_FROST_BOMB, true);
target->RemoveAurasDueToSpell(SPELL_FROST_BOMB_VISUAL);
}
}
void UpdateAI(uint32 const diff)
@@ -458,21 +485,11 @@ class boss_sindragosa : public CreatureScript
case EVENT_FROST_BOMB:
{
float destX, destY, destZ;
destX = float(rand_norm()) * 117.25f + 4339.25f;
if (destX > 4371.5f && destX < 4432.0f)
destY = float(rand_norm()) * 111.0f + 2429.0f;
else
destY = float(rand_norm()) * 31.23f + 2454.64f;
destX = float(rand_norm()) * 75.0f + 4350.0f;
destY = float(rand_norm()) * 75.0f + 2450.0f;
destZ = 205.0f; // random number close to ground, get exact in next call
me->UpdateGroundPositionZ(destX, destY, destZ);
Position pos;
pos.Relocate(destX, destY, destZ, 0.0f);
if (TempSummon* summ = me->SummonCreature(NPC_FROST_BOMB, pos, TEMPSUMMON_TIMED_DESPAWN, 40000))
{
summ->CastSpell(summ, SPELL_FROST_BOMB_VISUAL, true);
DoCast(summ, SPELL_FROST_BOMB_TRIGGER);
//me->CastSpell(destX, destY, destZ, SPELL_FROST_BOMB_TRIGGER, false);
}
me->CastSpell(destX, destY, destZ, SPELL_FROST_BOMB_TRIGGER, false);
events.ScheduleEvent(EVENT_FROST_BOMB, urand(5000, 10000));
break;
}