Scripts/ICC: Strip out code related to raid weeklies and heroic retry counter since those got removed when Cataclysm launched (#22)

This commit is contained in:
Warpten
2020-01-05 20:37:34 +01:00
committed by Ovahlord
parent bb2073c764
commit 61d579601f
10 changed files with 24 additions and 807 deletions

View File

@@ -0,0 +1,16 @@
DELETE FROM `creature` WHERE `guid` IN (137743, 208786, 208778, 208777, 95035, 137744, 137745, 137788, 137787, 137786, 137785, 137784);
DELETE FROM `creature_addon` WHERE `guid` IN (137743, 208786, 208778, 208777, 95035, 137744, 137745, 137788, 137787, 137786, 137785, 137784);
DELETE FROM `smart_scripts` WHERE `entryorguid` IN (-137743, -208786, -208778, -208777, -95035, -137744, -137745, -137788, -137787, -137786, -137785, -137784) AND `source_type`= 0;
UPDATE `creature_template` SET `AIName`= '' WHERE `entry` IN (38471, 38491, 38492, 38490, 38494, 38501, 38551, 38558, 39123, 38557, 38589);
DELETE FROM `spell_script_names` WHERE `ScriptName` IN
('spell_rotface_slime_spray',
'spell_frost_giant_death_plague',
'spell_icc_harvest_blight_specimen');
UPDATE `creature_template` SET `ScriptName`= '' WHERE `ScriptName` IN
('npc_alchemist_adrianna',
'npc_rotting_frost_giant',
'npc_darnavan');
DELETE FROM `areatrigger_scripts` WHERE `ScriptName`= 'at_icc_start_blood_quickening';

View File

@@ -68,7 +68,6 @@ enum Spells
SPELL_TWILIGHT_BLOODBOLT = 71446,
SPELL_INCITE_TERROR = 73070,
SPELL_BLOODBOLT_WHIRL = 71772,
SPELL_ANNIHILATE = 71322,
// Blood Infusion
SPELL_BLOOD_INFUSION_CREDIT = 72934
@@ -123,12 +122,10 @@ enum Points
POINT_CENTER = 1,
POINT_AIR = 2,
POINT_GROUND = 3,
POINT_MINCHAR = 4,
};
Position const centerPos = {4595.7090f, 2769.4190f, 400.6368f, 0.000000f};
Position const airPos = {4595.7090f, 2769.4190f, 422.3893f, 0.000000f};
Position const mincharPos = {4629.3711f, 2782.6089f, 424.6390f, 0.000000f};
bool IsVampire(Unit const* unit)
{
@@ -153,8 +150,6 @@ class boss_blood_queen_lana_thel : public CreatureScript
void Initialize()
{
_offtankGUID.Clear();
_creditBloodQuickening = false;
_killMinchar = false;
}
void Reset() override
@@ -190,10 +185,9 @@ class boss_blood_queen_lana_thel : public CreatureScript
DoCast(me, SPELL_SHROUD_OF_SORROW, true);
DoCast(me, SPELL_FRENZIED_BLOODTHIRST_VISUAL, true);
_creditBloodQuickening = instance->GetData(DATA_BLOOD_QUICKENING_STATE) == IN_PROGRESS;
}
void JustDied(Unit* killer) override
void JustDied(Unit* /*killer*/) override
{
_JustDied();
Talk(SAY_DEATH);
@@ -202,25 +196,6 @@ class boss_blood_queen_lana_thel : public CreatureScript
DoCastAOE(SPELL_BLOOD_INFUSION_CREDIT, true);
CleanAuras();
if (!killer)
return;
// Blah, credit the quest
if (_creditBloodQuickening)
{
instance->SetData(DATA_BLOOD_QUICKENING_STATE, DONE);
if (Player* player = killer->ToPlayer())
player->RewardPlayerAndGroupAtEvent(Is25ManRaid() ? NPC_INFILTRATOR_MINCHAR_BQ_25 : NPC_INFILTRATOR_MINCHAR_BQ, player);
if (Creature* minchar = me->FindNearestCreature(NPC_INFILTRATOR_MINCHAR_BQ, 200.0f))
{
minchar->SetUInt32Value(UNIT_NPC_EMOTESTATE, 0);
minchar->RemoveByteFlag(UNIT_FIELD_BYTES_1, UNIT_BYTES_1_OFFSET_ANIM_TIER, UNIT_BYTE1_FLAG_ALWAYS_STAND);
minchar->SetCanFly(false);
minchar->RemoveAllAuras();
minchar->GetMotionMaster()->MoveCharge(4629.3711f, 2782.6089f, 401.5301f, SPEED_CHARGE / 3.0f);
}
}
}
void CleanAuras()
@@ -237,40 +212,15 @@ class boss_blood_queen_lana_thel : public CreatureScript
instance->DoRemoveAurasDueToSpellOnPlayers(PRESENCE_OF_THE_DARKFALLEN);
}
void DoAction(int32 action) override
{
if (action != ACTION_KILL_MINCHAR)
return;
if (instance->GetBossState(DATA_BLOOD_QUEEN_LANA_THEL) == IN_PROGRESS)
_killMinchar = true;
else
{
me->SetDisableGravity(true);
me->SetByteFlag(UNIT_FIELD_BYTES_1, UNIT_BYTES_1_OFFSET_ANIM_TIER, UNIT_BYTE1_FLAG_ALWAYS_STAND);
me->GetMotionMaster()->MovePoint(POINT_MINCHAR, mincharPos);
}
}
void EnterEvadeMode(EvadeReason why) override
{
if (!_EnterEvadeMode(why))
return;
CleanAuras();
if (_killMinchar)
{
_killMinchar = false;
me->SetDisableGravity(true);
me->SetByteFlag(UNIT_FIELD_BYTES_1, UNIT_BYTES_1_OFFSET_ANIM_TIER, UNIT_BYTE1_FLAG_ALWAYS_STAND);
me->GetMotionMaster()->MovePoint(POINT_MINCHAR, mincharPos);
}
else
{
me->AddUnitState(UNIT_STATE_EVADE);
me->GetMotionMaster()->MoveTargetedHome();
Reset();
}
me->AddUnitState(UNIT_STATE_EVADE);
me->GetMotionMaster()->MoveTargetedHome();
Reset();
}
void JustReachedHome() override
@@ -332,12 +282,6 @@ class boss_blood_queen_lana_thel : public CreatureScript
AttackStart(victim);
events.ScheduleEvent(EVENT_BLOOD_MIRROR, 2500, EVENT_GROUP_CANCELLABLE);
break;
case POINT_MINCHAR:
DoCast(me, SPELL_ANNIHILATE, true);
// already in evade mode
me->GetMotionMaster()->MoveTargetedHome();
Reset();
break;
default:
break;
}
@@ -519,8 +463,6 @@ class boss_blood_queen_lana_thel : public CreatureScript
GuidSet _vampires;
GuidSet _bloodboltedPlayers;
ObjectGuid _offtankGUID;
bool _creditBloodQuickening;
bool _killMinchar;
};
CreatureAI* GetAI(Creature* creature) const override

View File

@@ -459,24 +459,6 @@ class spell_festergut_blighted_spores : public SpellScriptLoader
if (InstanceScript* instance = GetTarget()->GetInstanceScript())
if (Creature* festergut = ObjectAccessor::GetCreature(*GetTarget(), instance->GetGuidData(DATA_FESTERGUT)))
festergut->AI()->SetData(DATA_INOCULATED_STACK, GetStackAmount());
HandleResidue();
}
void HandleResidue()
{
Player* target = GetUnitOwner()->ToPlayer();
if (!target)
return;
if (target->HasAura(SPELL_ORANGE_BLIGHT_RESIDUE))
return;
uint32 questId = target->GetMap()->Is25ManRaid() ? QUEST_RESIDUE_RENDEZVOUS_25 : QUEST_RESIDUE_RENDEZVOUS_10;
if (target->GetQuestStatus(questId) != QUEST_STATUS_INCOMPLETE)
return;
target->CastSpell(target, SPELL_ORANGE_BLIGHT_RESIDUE, TRIGGERED_FULL_MASK);
}
void Register() override

View File

@@ -48,10 +48,6 @@ enum ScriptTexts
SAY_KILL = 14,
SAY_BERSERK = 15,
SAY_DEATH = 16,
// Darnavan
SAY_DARNAVAN_AGGRO = 0,
SAY_DARNAVAN_RESCUED = 1,
};
enum Spells
@@ -111,14 +107,6 @@ enum Spells
SPELL_VENGEFUL_BLAST_25N = 72010,
SPELL_VENGEFUL_BLAST_10H = 72011,
SPELL_VENGEFUL_BLAST_25H = 72012,
// Darnavan
SPELL_BLADESTORM = 65947,
SPELL_CHARGE = 65927,
SPELL_INTIMIDATING_SHOUT = 65930,
SPELL_MORTAL_STRIKE = 65926,
SPELL_SHATTERING_THROW = 65940,
SPELL_SUNDER_ARMOR = 65936,
};
enum EventTypes
@@ -147,26 +135,11 @@ enum Groups
GROUP_TWO = 2
};
enum DeprogrammingData
{
NPC_DARNAVAN_10 = 38472,
NPC_DARNAVAN_25 = 38485,
NPC_DARNAVAN_CREDIT_10 = 39091,
NPC_DARNAVAN_CREDIT_25 = 39092,
ACTION_COMPLETE_QUEST = -384720,
POINT_DESPAWN = 384721,
};
enum Actions
{
ACTION_START_INTRO
};
#define NPC_DARNAVAN RAID_MODE<uint32>(NPC_DARNAVAN_10, NPC_DARNAVAN_25, NPC_DARNAVAN_10, NPC_DARNAVAN_25)
#define NPC_DARNAVAN_CREDIT RAID_MODE<uint32>(NPC_DARNAVAN_CREDIT_10, NPC_DARNAVAN_CREDIT_25, NPC_DARNAVAN_CREDIT_10, NPC_DARNAVAN_CREDIT_25)
#define QUEST_DEPROGRAMMING RAID_MODE<uint32>(QUEST_DEPROGRAMMING_10, QUEST_DEPROGRAMMING_25, QUEST_DEPROGRAMMING_10, QUEST_DEPROGRAMMING_25)
uint32 const SummonEntries[2] = {NPC_CULT_FANATIC, NPC_CULT_ADHERENT};
Position const SummonPositions[7] =
@@ -180,21 +153,6 @@ Position const SummonPositions[7] =
{-524.2480f, 2211.920f, 62.90960f, 3.141592f}, // 7 Upper (Random Cultist)
};
class DarnavanMoveEvent : public BasicEvent
{
public:
DarnavanMoveEvent(Creature& darnavan) : _darnavan(darnavan) { }
bool Execute(uint64 /*time*/, uint32 /*diff*/) override
{
_darnavan.GetMotionMaster()->MovePoint(POINT_DESPAWN, SummonPositions[6]);
return true;
}
private:
Creature& _darnavan;
};
class boss_lady_deathwhisper : public CreatureScript
{
public:
@@ -343,7 +301,7 @@ class boss_lady_deathwhisper : public CreatureScript
instance->SetBossState(DATA_LADY_DEATHWHISPER, IN_PROGRESS);
}
void JustDied(Unit* killer) override
void JustDied(Unit* /*killer*/) override
{
Talk(SAY_DEATH);
@@ -357,35 +315,6 @@ class boss_lady_deathwhisper : public CreatureScript
if (livingAddEntries.size() >= 5)
instance->DoUpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, SPELL_FULL_HOUSE, 0, me);
if (Creature* darnavan = ObjectAccessor::GetCreature(*me, _darnavanGUID))
{
if (darnavan->IsAlive())
{
darnavan->SetFaction(FACTION_FRIENDLY);
darnavan->CombatStop(true);
darnavan->GetMotionMaster()->MoveIdle();
darnavan->SetReactState(REACT_PASSIVE);
darnavan->m_Events.AddEvent(new DarnavanMoveEvent(*darnavan), darnavan->m_Events.CalculateTime(10000));
darnavan->AI()->Talk(SAY_DARNAVAN_RESCUED);
if (!killer)
return;
if (Player* owner = killer->GetCharmerOrOwnerPlayerOrPlayerItself())
{
if (Group* group = owner->GetGroup())
{
for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
if (Player* member = itr->GetSource())
if (member->IsInMap(owner))
member->KilledMonsterCredit(NPC_DARNAVAN_CREDIT);
}
else
owner->KilledMonsterCredit(NPC_DARNAVAN_CREDIT);
}
}
}
_JustDied();
}
@@ -467,11 +396,6 @@ class boss_lady_deathwhisper : public CreatureScript
{
switch (summon->GetEntry())
{
case NPC_DARNAVAN_10:
case NPC_DARNAVAN_25:
_darnavanGUID = summon->GetGUID();
summon->AI()->AttackStart(SelectTarget(SELECT_TARGET_RANDOM));
return;
case NPC_VENGEFUL_SHADE:
if (_nextVengefulShadeTargetGUID.empty())
break;
@@ -508,12 +432,7 @@ class boss_lady_deathwhisper : public CreatureScript
uint8 addIndex = _waveCounter & 1;
uint8 addIndexOther = uint8(addIndex ^ 1);
// Summon first add, replace it with Darnavan if weekly quest is active
if (_waveCounter || !sPoolMgr->IsSpawnedObject<Quest>(QUEST_DEPROGRAMMING))
Summon(SummonEntries[addIndex], SummonPositions[addIndex * 3]);
else
Summon(NPC_DARNAVAN, SummonPositions[addIndex * 3]);
Summon(SummonEntries[addIndex], SummonPositions[addIndex * 3]);
Summon(SummonEntries[addIndexOther], SummonPositions[addIndex * 3 + 1]);
Summon(SummonEntries[addIndex], SummonPositions[addIndex * 3 + 2]);
if (Is25ManRaid())
@@ -860,138 +779,6 @@ class npc_vengeful_shade : public CreatureScript
}
};
class npc_darnavan : public CreatureScript
{
public:
npc_darnavan() : CreatureScript("npc_darnavan") { }
struct npc_darnavanAI : public ScriptedAI
{
npc_darnavanAI(Creature* creature) : ScriptedAI(creature)
{
Initialize();
}
void Initialize()
{
_canCharge = true;
_canShatter = true;
}
void Reset() override
{
_events.Reset();
_events.ScheduleEvent(EVENT_DARNAVAN_BLADESTORM, Seconds(10));
_events.ScheduleEvent(EVENT_DARNAVAN_INTIMIDATING_SHOUT, Seconds(20), Seconds(25));
_events.ScheduleEvent(EVENT_DARNAVAN_MORTAL_STRIKE, Seconds(25), Seconds(30));
_events.ScheduleEvent(EVENT_DARNAVAN_SUNDER_ARMOR, Seconds(5), Seconds(8));
Initialize();
}
void JustDied(Unit* killer) override
{
_events.Reset();
if (!killer)
return;
if (Player* owner = killer->GetCharmerOrOwnerPlayerOrPlayerItself())
{
if (Group* group = owner->GetGroup())
{
for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
if (Player* member = itr->GetSource())
if (member->IsInMap(owner))
member->FailQuest(QUEST_DEPROGRAMMING);
}
else
owner->FailQuest(QUEST_DEPROGRAMMING);
}
}
void MovementInform(uint32 type, uint32 id) override
{
if (type != POINT_MOTION_TYPE || id != POINT_DESPAWN)
return;
me->DespawnOrUnsummon();
}
void JustEngagedWith(Unit* /*victim*/) override
{
Talk(SAY_DARNAVAN_AGGRO);
}
void UpdateAI(uint32 diff) override
{
if (!UpdateVictim())
return;
_events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
if (_canShatter && me->GetVictim() && me->EnsureVictim()->IsImmunedToDamage(SPELL_SCHOOL_MASK_NORMAL))
{
DoCastVictim(SPELL_SHATTERING_THROW);
_canShatter = false;
_events.ScheduleEvent(EVENT_DARNAVAN_SHATTERING_THROW, Seconds(30));
return;
}
if (_canCharge && !me->IsWithinMeleeRange(me->GetVictim()))
{
DoCastVictim(SPELL_CHARGE);
_canCharge = false;
_events.ScheduleEvent(EVENT_DARNAVAN_CHARGE, Seconds(20));
return;
}
while (uint32 eventId = _events.ExecuteEvent())
{
switch (eventId)
{
case EVENT_DARNAVAN_BLADESTORM:
DoCast(SPELL_BLADESTORM);
_events.ScheduleEvent(EVENT_DARNAVAN_BLADESTORM, Seconds(90), Seconds(100));
break;
case EVENT_DARNAVAN_CHARGE:
_canCharge = true;
break;
case EVENT_DARNAVAN_INTIMIDATING_SHOUT:
DoCast(SPELL_INTIMIDATING_SHOUT);
_events.ScheduleEvent(EVENT_DARNAVAN_INTIMIDATING_SHOUT, Seconds(90), Minutes(2));
break;
case EVENT_DARNAVAN_MORTAL_STRIKE:
DoCastVictim(SPELL_MORTAL_STRIKE);
_events.ScheduleEvent(EVENT_DARNAVAN_MORTAL_STRIKE, Seconds(15), Seconds(30));
break;
case EVENT_DARNAVAN_SHATTERING_THROW:
_canShatter = true;
break;
case EVENT_DARNAVAN_SUNDER_ARMOR:
DoCastVictim(SPELL_SUNDER_ARMOR);
_events.ScheduleEvent(EVENT_DARNAVAN_SUNDER_ARMOR, Seconds(3), Seconds(7));
break;
}
}
DoMeleeAttackIfReady();
}
private:
EventMap _events;
bool _canCharge;
bool _canShatter;
};
CreatureAI* GetAI(Creature* creature) const override
{
return GetIcecrownCitadelAI<npc_darnavanAI>(creature);
}
};
class spell_deathwhisper_mana_barrier : public SpellScriptLoader
{
public:
@@ -1109,7 +896,6 @@ void AddSC_boss_lady_deathwhisper()
new npc_cult_fanatic();
new npc_cult_adherent();
new npc_vengeful_shade();
new npc_darnavan();
new spell_deathwhisper_mana_barrier();
new spell_deathwhisper_dominated_mind();
new spell_deathwhisper_summon_spirits();

View File

@@ -872,43 +872,6 @@ class spell_rotface_vile_gas_trigger : public SpellScriptLoader
}
};
class spell_rotface_slime_spray : public SpellScriptLoader
{
public:
spell_rotface_slime_spray() : SpellScriptLoader("spell_rotface_slime_spray") { }
class spell_rotface_slime_spray_SpellScript : public SpellScript
{
PrepareSpellScript(spell_rotface_slime_spray_SpellScript);
void HandleResidue()
{
Player* target = GetHitPlayer();
if (!target)
return;
if (target->HasAura(SPELL_GREEN_BLIGHT_RESIDUE))
return;
uint32 questId = target->GetMap()->Is25ManRaid() ? QUEST_RESIDUE_RENDEZVOUS_25 : QUEST_RESIDUE_RENDEZVOUS_10;
if (target->GetQuestStatus(questId) != QUEST_STATUS_INCOMPLETE)
return;
target->CastSpell(target, SPELL_GREEN_BLIGHT_RESIDUE, TRIGGERED_FULL_MASK);
}
void Register() override
{
OnHit += SpellHitFn(spell_rotface_slime_spray_SpellScript::HandleResidue);
}
};
SpellScript* GetSpellScript() const override
{
return new spell_rotface_slime_spray_SpellScript();
}
};
void AddSC_boss_rotface()
{
new boss_rotface();
@@ -924,5 +887,4 @@ void AddSC_boss_rotface()
new spell_rotface_unstable_ooze_explosion();
new spell_rotface_unstable_ooze_explosion_suicide();
new spell_rotface_vile_gas_trigger();
new spell_rotface_slime_spray();
}

View File

@@ -1638,9 +1638,6 @@ class at_sindragosa_lair : public AreaTriggerScript
if (!instance->GetData(DATA_SINDRAGOSA_FROSTWYRMS) && !instance->GetGuidData(DATA_SINDRAGOSA) && instance->GetBossState(DATA_SINDRAGOSA) != DONE)
{
if (player->GetMap()->IsHeroic() && !instance->GetData(DATA_HEROIC_ATTEMPTS))
return true;
player->GetMap()->LoadGrid(SindragosaSpawnPos.GetPositionX(), SindragosaSpawnPos.GetPositionY());
if (Creature* sindragosa = player->GetMap()->SummonCreature(NPC_SINDRAGOSA, SindragosaSpawnPos))
sindragosa->AI()->DoAction(ACTION_START_FROSTWYRM);

View File

@@ -151,8 +151,6 @@ enum Misc
DATA_SUPPRESSERS_COUNT = 4
};
Position const ValithriaSpawnPos = {4210.813f, 2484.443f, 364.9558f, 0.01745329f};
class RisenArchmageCheck
{
public:

View File

@@ -29,13 +29,6 @@
#include "TemporarySummon.h"
#include "VehicleDefines.h"
// Weekly quest support
// * Deprogramming (DONE)
// * Securing the Ramparts (DONE)
// * Residue Rendezvous (DONE)
// * Blood Quickening (DONE)
// * Respite for a Tormented Soul
enum ICCTexts
{
// Highlord Tirion Fordring (at Light's Hammer)
@@ -70,9 +63,6 @@ enum ICCTexts
// Deathbound Ward
SAY_TRAP_ACTIVATE = 0,
// Rotting Frost Giant
EMOTE_DEATH_PLAGUE_WARNING = 0,
// Sister Svalna
SAY_SVALNA_KILL_CAPTAIN = 1, // happens when she kills a captain
SAY_SVALNA_KILL = 4,
@@ -103,21 +93,9 @@ enum ICCTexts
enum ICCSpells
{
// Rotting Frost Giant
SPELL_DEATH_PLAGUE = 72879,
SPELL_DEATH_PLAGUE_AURA = 72865,
SPELL_RECENTLY_INFECTED = 72884,
SPELL_DEATH_PLAGUE_KILL = 72867,
SPELL_STOMP = 64652,
SPELL_ARCTIC_BREATH = 72848,
// Frost Freeze Trap
SPELL_COLDFLAME_JETS = 70460,
// Alchemist Adrianna
SPELL_HARVEST_BLIGHT_SPECIMEN = 72155,
SPELL_HARVEST_BLIGHT_SPECIMEN25 = 72162,
// Crok Scourgebane
SPELL_ICEBOUND_ARMOR = 70714,
SPELL_SCOURGE_STRIKE = 71488,
@@ -601,78 +579,6 @@ class npc_highlord_tirion_fordring_lh : public CreatureScript
}
};
class npc_rotting_frost_giant : public CreatureScript
{
public:
npc_rotting_frost_giant() : CreatureScript("npc_rotting_frost_giant") { }
struct npc_rotting_frost_giantAI : public ScriptedAI
{
npc_rotting_frost_giantAI(Creature* creature) : ScriptedAI(creature)
{
}
void Reset() override
{
_events.Reset();
_events.ScheduleEvent(EVENT_DEATH_PLAGUE, 15000);
_events.ScheduleEvent(EVENT_STOMP, urand(5000, 8000));
_events.ScheduleEvent(EVENT_ARCTIC_BREATH, urand(10000, 15000));
}
void JustDied(Unit* /*killer*/) override
{
_events.Reset();
}
void UpdateAI(uint32 diff) override
{
if (!UpdateVictim())
return;
_events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
while (uint32 eventId = _events.ExecuteEvent())
{
switch (eventId)
{
case EVENT_DEATH_PLAGUE:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true))
{
Talk(EMOTE_DEATH_PLAGUE_WARNING, target);
DoCast(target, SPELL_DEATH_PLAGUE);
}
_events.ScheduleEvent(EVENT_DEATH_PLAGUE, 15000);
break;
case EVENT_STOMP:
DoCastVictim(SPELL_STOMP);
_events.ScheduleEvent(EVENT_STOMP, urand(15000, 18000));
break;
case EVENT_ARCTIC_BREATH:
DoCastVictim(SPELL_ARCTIC_BREATH);
_events.ScheduleEvent(EVENT_ARCTIC_BREATH, urand(26000, 33000));
break;
default:
break;
}
}
DoMeleeAttackIfReady();
}
private:
EventMap _events;
};
CreatureAI* GetAI(Creature* creature) const override
{
return GetIcecrownCitadelAI<npc_rotting_frost_giantAI>(creature);
}
};
class npc_frost_freeze_trap : public CreatureScript
{
public:
@@ -719,30 +625,6 @@ class npc_frost_freeze_trap : public CreatureScript
}
};
class npc_alchemist_adrianna : public CreatureScript
{
public:
npc_alchemist_adrianna() : CreatureScript("npc_alchemist_adrianna") { }
struct npc_alchemist_adriannaAI : public ScriptedAI
{
npc_alchemist_adriannaAI(Creature* creature) : ScriptedAI(creature) { }
bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override
{
if (!me->FindCurrentSpellBySpellId(SPELL_HARVEST_BLIGHT_SPECIMEN) && !me->FindCurrentSpellBySpellId(SPELL_HARVEST_BLIGHT_SPECIMEN25))
if (player->HasAura(SPELL_ORANGE_BLIGHT_RESIDUE) && player->HasAura(SPELL_GREEN_BLIGHT_RESIDUE))
me->CastSpell(me, SPELL_HARVEST_BLIGHT_SPECIMEN, false);
return false;
}
};
CreatureAI* GetAI(Creature* creature) const override
{
return GetIcecrownCitadelAI<npc_alchemist_adriannaAI>(creature);
}
};
class boss_sister_svalna : public CreatureScript
{
public:
@@ -1888,118 +1770,6 @@ class spell_icc_sprit_alarm : public SpellScriptLoader
}
};
class DeathPlagueTargetSelector
{
public:
explicit DeathPlagueTargetSelector(Unit* caster) : _caster(caster) { }
bool operator()(WorldObject* object) const
{
if (object == _caster)
return true;
if (object->GetTypeId() != TYPEID_PLAYER)
return true;
if (object->ToUnit()->HasAura(SPELL_RECENTLY_INFECTED) || object->ToUnit()->HasAura(SPELL_DEATH_PLAGUE_AURA))
return true;
return false;
}
private:
Unit* _caster;
};
class spell_frost_giant_death_plague : public SpellScriptLoader
{
public:
spell_frost_giant_death_plague() : SpellScriptLoader("spell_frost_giant_death_plague") { }
class spell_frost_giant_death_plague_SpellScript : public SpellScript
{
PrepareSpellScript(spell_frost_giant_death_plague_SpellScript);
// First effect
void CountTargets(std::list<WorldObject*>& targets)
{
targets.remove(GetCaster());
_failed = targets.empty();
}
// Second effect
void FilterTargets(std::list<WorldObject*>& targets)
{
// Select valid targets for jump
targets.remove_if(DeathPlagueTargetSelector(GetCaster()));
if (!targets.empty())
{
WorldObject* target = Trinity::Containers::SelectRandomContainerElement(targets);
targets.clear();
targets.push_back(target);
}
targets.push_back(GetCaster());
}
void HandleScript(SpellEffIndex effIndex)
{
PreventHitDefaultEffect(effIndex);
if (GetHitUnit() != GetCaster())
GetCaster()->CastSpell(GetHitUnit(), SPELL_DEATH_PLAGUE_AURA, true);
else if (_failed)
GetCaster()->CastSpell(GetCaster(), SPELL_DEATH_PLAGUE_KILL, true);
}
void Register() override
{
OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_frost_giant_death_plague_SpellScript::CountTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ALLY);
OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_frost_giant_death_plague_SpellScript::FilterTargets, EFFECT_1, TARGET_UNIT_SRC_AREA_ALLY);
OnEffectHitTarget += SpellEffectFn(spell_frost_giant_death_plague_SpellScript::HandleScript, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT);
}
bool _failed = false;
};
SpellScript* GetSpellScript() const override
{
return new spell_frost_giant_death_plague_SpellScript();
}
};
class spell_icc_harvest_blight_specimen : public SpellScriptLoader
{
public:
spell_icc_harvest_blight_specimen() : SpellScriptLoader("spell_icc_harvest_blight_specimen") { }
class spell_icc_harvest_blight_specimen_SpellScript : public SpellScript
{
PrepareSpellScript(spell_icc_harvest_blight_specimen_SpellScript);
void HandleScript(SpellEffIndex effIndex)
{
PreventHitDefaultEffect(effIndex);
GetHitUnit()->RemoveAurasDueToSpell(uint32(GetEffectValue()));
}
void HandleQuestComplete(SpellEffIndex /*effIndex*/)
{
GetHitUnit()->RemoveAurasDueToSpell(uint32(GetEffectValue()));
}
void Register() override
{
OnEffectHitTarget += SpellEffectFn(spell_icc_harvest_blight_specimen_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
OnEffectHitTarget += SpellEffectFn(spell_icc_harvest_blight_specimen_SpellScript::HandleQuestComplete, EFFECT_1, SPELL_EFFECT_QUEST_COMPLETE);
}
};
SpellScript* GetSpellScript() const override
{
return new spell_icc_harvest_blight_specimen_SpellScript();
}
};
class AliveCheck
{
public:
@@ -2203,20 +1973,6 @@ class at_icc_shutdown_traps : public AreaTriggerScript
}
};
class at_icc_start_blood_quickening : public AreaTriggerScript
{
public:
at_icc_start_blood_quickening() : AreaTriggerScript("at_icc_start_blood_quickening") { }
bool OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) override
{
if (InstanceScript* instance = player->GetInstanceScript())
if (instance->GetData(DATA_BLOOD_QUICKENING_STATE) == NOT_STARTED)
instance->SetData(DATA_BLOOD_QUICKENING_STATE, IN_PROGRESS);
return true;
}
};
class at_icc_start_frostwing_gauntlet : public AreaTriggerScript
{
public:
@@ -2234,9 +1990,7 @@ class at_icc_start_frostwing_gauntlet : public AreaTriggerScript
void AddSC_icecrown_citadel()
{
new npc_highlord_tirion_fordring_lh();
new npc_rotting_frost_giant();
new npc_frost_freeze_trap();
new npc_alchemist_adrianna();
new boss_sister_svalna();
new npc_crok_scourgebane();
new npc_captain_arnath();
@@ -2248,14 +2002,11 @@ void AddSC_icecrown_citadel()
new npc_arthas_teleport_visual();
new spell_icc_stoneform();
new spell_icc_sprit_alarm();
new spell_frost_giant_death_plague();
new spell_icc_harvest_blight_specimen();
new spell_trigger_spell_from_caster("spell_svalna_caress_of_death", SPELL_IMPALING_SPEAR_KILL);
new spell_svalna_revive_champion();
new spell_svalna_remove_spear();
new spell_icc_soul_missile();
new at_icc_saurfang_portal();
new at_icc_shutdown_traps();
new at_icc_start_blood_quickening();
new at_icc_start_frostwing_gauntlet();
}

View File

@@ -29,10 +29,7 @@ enum TriggerCastFlags : uint32;
uint32 const EncounterCount = 13;
uint32 const WeeklyNPCs = 9;
uint32 const MaxHeroicAttempts = 50;
// Defined in boss_valithria_dreamwalker.cpp
extern Position const ValithriaSpawnPos;
// Defined in boss_sindragosa.cpp
extern Position const SindragosaSpawnPos;
// Defined in boss_the_lich_king.cpp
@@ -106,8 +103,6 @@ enum ICDataTypes
DATA_RIMEFANG = 25,
DATA_COLDFLAME_JETS = 26,
DATA_TEAM_IN_INSTANCE = 27,
DATA_BLOOD_QUICKENING_STATE = 28,
DATA_HEROIC_ATTEMPTS = 29,
DATA_CROK_SCOURGEBANE = 30,
DATA_CAPTAIN_ARNATH = 31,
DATA_CAPTAIN_BRANDON = 32,
@@ -153,19 +148,6 @@ enum ICCreaturesIds
NPC_UTHER_THE_LIGHTBRINGER_QUEST = 38608,
NPC_LADY_SYLVANAS_WINDRUNNER_QUEST = 38609,
// Weekly quests
NPC_INFILTRATOR_MINCHAR = 38471,
NPC_KOR_KRON_LIEUTENANT = 38491,
NPC_SKYBREAKER_LIEUTENANT = 38492,
NPC_ROTTING_FROST_GIANT_10 = 38490,
NPC_ROTTING_FROST_GIANT_25 = 38494,
NPC_ALCHEMIST_ADRIANNA = 38501,
NPC_ALRIN_THE_AGILE = 38551,
NPC_INFILTRATOR_MINCHAR_BQ = 38558,
NPC_INFILTRATOR_MINCHAR_BQ_25 = 39123,
NPC_MINCHAR_BEAM_STALKER = 38557,
NPC_VALITHRIA_DREAMWALKER_QUEST = 38589,
// Lord Marrowgar
NPC_LORD_MARROWGAR = 36612,
NPC_COLDFLAME = 36672,
@@ -487,9 +469,6 @@ enum ICSharedActions
ACTION_ROTFACE_DEATH = -366272,
ACTION_CHANGE_PHASE = -366780,
// Blood-Queen Lana'thel
ACTION_KILL_MINCHAR = -379550,
// Frostwing Halls gauntlet event
ACTION_VRYKUL_DEATH = 37129,
@@ -502,29 +481,6 @@ enum ICSharedActions
ACTION_FROSTMOURNE_INTRO = -36823
};
enum ICWeekliesICC
{
QUEST_DEPROGRAMMING_10 = 24869,
QUEST_DEPROGRAMMING_25 = 24875,
QUEST_SECURING_THE_RAMPARTS_10 = 24870,
QUEST_SECURING_THE_RAMPARTS_25 = 24877,
QUEST_RESIDUE_RENDEZVOUS_10 = 24873,
QUEST_RESIDUE_RENDEZVOUS_25 = 24878,
QUEST_BLOOD_QUICKENING_10 = 24874,
QUEST_BLOOD_QUICKENING_25 = 24879,
QUEST_RESPITE_FOR_A_TORNMENTED_SOUL_10 = 24872,
QUEST_RESPITE_FOR_A_TORNMENTED_SOUL_25 = 24880
};
enum ICWorldStatesICC
{
WORLDSTATE_SHOW_TIMER = 4903,
WORLDSTATE_EXECUTION_TIME = 4904,
WORLDSTATE_SHOW_ATTEMPTS = 4940,
WORLDSTATE_ATTEMPTS_REMAINING = 4941,
WORLDSTATE_ATTEMPTS_MAX = 4942
};
enum ICAreaIds
{
AREA_ICECROWN_CITADEL = 4812

View File

@@ -44,7 +44,6 @@ enum EventIds
enum TimedEvents
{
EVENT_UPDATE_EXECUTION_TIME = 1,
EVENT_QUAKE_SHATTER = 2,
EVENT_REBUILD_PLATFORM = 3,
EVENT_RESPAWN_GUNSHIP = 4
@@ -98,27 +97,6 @@ DoorData const doorData[] =
{0, 0, DOOR_TYPE_ROOM } // END
};
// this doesnt have to only store questgivers, also can be used for related quest spawns
struct WeeklyQuest
{
uint32 creatureEntry;
uint32 questId[2]; // 10 and 25 man versions
};
// when changing the content, remember to update SetData, DATA_BLOOD_QUICKENING_STATE case for NPC_ALRIN_THE_AGILE index
WeeklyQuest const WeeklyQuestData[WeeklyNPCs] =
{
{NPC_INFILTRATOR_MINCHAR, {QUEST_DEPROGRAMMING_10, QUEST_DEPROGRAMMING_25 }}, // Deprogramming
{NPC_KOR_KRON_LIEUTENANT, {QUEST_SECURING_THE_RAMPARTS_10, QUEST_SECURING_THE_RAMPARTS_25 }}, // Securing the Ramparts
{NPC_ROTTING_FROST_GIANT_10, {QUEST_SECURING_THE_RAMPARTS_10, QUEST_SECURING_THE_RAMPARTS_25 }}, // Securing the Ramparts
{NPC_ROTTING_FROST_GIANT_25, {QUEST_SECURING_THE_RAMPARTS_10, QUEST_SECURING_THE_RAMPARTS_25 }}, // Securing the Ramparts
{NPC_ALCHEMIST_ADRIANNA, {QUEST_RESIDUE_RENDEZVOUS_10, QUEST_RESIDUE_RENDEZVOUS_25 }}, // Residue Rendezvous
{NPC_ALRIN_THE_AGILE, {QUEST_BLOOD_QUICKENING_10, QUEST_BLOOD_QUICKENING_25 }}, // Blood Quickening
{NPC_INFILTRATOR_MINCHAR_BQ, {QUEST_BLOOD_QUICKENING_10, QUEST_BLOOD_QUICKENING_25 }}, // Blood Quickening
{NPC_MINCHAR_BEAM_STALKER, {QUEST_BLOOD_QUICKENING_10, QUEST_BLOOD_QUICKENING_25 }}, // Blood Quickening
{NPC_VALITHRIA_DREAMWALKER_QUEST, {QUEST_RESPITE_FOR_A_TORNMENTED_SOUL_10, QUEST_RESPITE_FOR_A_TORNMENTED_SOUL_25}} // Respite for a Tormented Soul
};
// NPCs spawned at Light's Hammer on Lich King dead
Position const JainaSpawnPos = { -48.65278f, 2211.026f, 27.98586f, 3.124139f };
Position const MuradinSpawnPos = { -47.34549f, 2208.087f, 27.98586f, 3.106686f };
@@ -139,15 +117,12 @@ class instance_icecrown_citadel : public InstanceMapScript
LoadBossBoundaries(boundaries);
LoadDoorData(doorData);
TeamInInstance = 0;
HeroicAttempts = MaxHeroicAttempts;
IsBonedEligible = true;
IsOozeDanceEligible = true;
IsNauseaEligible = true;
IsOrbWhispererEligible = true;
ColdflameJetsState = NOT_STARTED;
UpperSpireTeleporterActiveState = NOT_STARTED;
BloodQuickeningState = NOT_STARTED;
BloodQuickeningMinutes = 0;
BloodPrinceIntro = 1;
SindragosaIntro = 1;
LadyDeathwhisperElevatorTimer = 3000;
@@ -168,15 +143,6 @@ class instance_icecrown_citadel : public InstanceMapScript
}
}
void FillInitialWorldStates(WorldPacket& data) override
{
data << uint32(WORLDSTATE_SHOW_TIMER) << uint32(BloodQuickeningState == IN_PROGRESS);
data << uint32(WORLDSTATE_EXECUTION_TIME) << uint32(BloodQuickeningMinutes);
data << uint32(WORLDSTATE_SHOW_ATTEMPTS) << uint32(instance->IsHeroic());
data << uint32(WORLDSTATE_ATTEMPTS_REMAINING) << uint32(HeroicAttempts);
data << uint32(WORLDSTATE_ATTEMPTS_MAX) << uint32(MaxHeroicAttempts);
}
void OnPlayerEnter(Player* player) override
{
if (!TeamInInstance)
@@ -318,29 +284,6 @@ class instance_icecrown_citadel : public InstanceMapScript
uint32 entry = data->id;
switch (entry)
{
case NPC_INFILTRATOR_MINCHAR:
case NPC_KOR_KRON_LIEUTENANT:
case NPC_ALCHEMIST_ADRIANNA:
case NPC_ALRIN_THE_AGILE:
case NPC_INFILTRATOR_MINCHAR_BQ:
case NPC_MINCHAR_BEAM_STALKER:
case NPC_VALITHRIA_DREAMWALKER_QUEST:
{
for (uint8 questIndex = 0; questIndex < WeeklyNPCs; ++questIndex)
{
if (WeeklyQuestData[questIndex].creatureEntry == entry)
{
uint8 diffIndex = uint8(instance->GetSpawnMode() & 1);
if (!sPoolMgr->IsSpawnedObject<Quest>(WeeklyQuestData[questIndex].questId[diffIndex]))
return 0;
break;
}
}
if (entry == NPC_KOR_KRON_LIEUTENANT && TeamInInstance == ALLIANCE)
return NPC_SKYBREAKER_LIEUTENANT;
break;
}
case NPC_HORDE_GUNSHIP_CANNON:
case NPC_ORGRIMS_HAMMER_CREW:
case NPC_SKY_REAVER_KORM_BLACKSCAR:
@@ -454,9 +397,6 @@ class instance_icecrown_citadel : public InstanceMapScript
case NPC_RIMEFANG:
case NPC_SPINESTALKER:
{
if (instance->IsHeroic() && !HeroicAttempts)
return;
if (GetBossState(DATA_SINDRAGOSA) == DONE)
return;
@@ -712,10 +652,6 @@ class instance_icecrown_citadel : public InstanceMapScript
return UpperSpireTeleporterActiveState;
case DATA_TEAM_IN_INSTANCE:
return TeamInInstance;
case DATA_BLOOD_QUICKENING_STATE:
return BloodQuickeningState;
case DATA_HEROIC_ATTEMPTS:
return HeroicAttempts;
case DATA_BLOOD_PRINCE_COUNCIL_INTRO:
return BloodPrinceIntro;
case DATA_SINDRAGOSA_INTRO:
@@ -916,39 +852,15 @@ class instance_icecrown_citadel : public InstanceMapScript
HandleGameObject(PlagueSigilGUID, state != DONE);
if (state == DONE)
CheckLichKingAvailability();
if (instance->IsHeroic())
{
if (state == FAIL && HeroicAttempts)
{
--HeroicAttempts;
DoUpdateWorldState(WORLDSTATE_ATTEMPTS_REMAINING, HeroicAttempts);
if (!HeroicAttempts)
if (Creature* putricide = instance->GetCreature(ProfessorPutricideGUID))
putricide->DespawnOrUnsummon();
}
}
break;
case DATA_BLOOD_QUEEN_LANA_THEL:
HandleGameObject(BloodwingSigilGUID, state != DONE);
if (state == DONE)
CheckLichKingAvailability();
if (instance->IsHeroic())
{
if (state == FAIL && HeroicAttempts)
{
--HeroicAttempts;
DoUpdateWorldState(WORLDSTATE_ATTEMPTS_REMAINING, HeroicAttempts);
if (!HeroicAttempts)
if (Creature* bq = instance->GetCreature(BloodQueenLanaThelGUID))
bq->DespawnOrUnsummon();
}
}
break;
case DATA_VALITHRIA_DREAMWALKER:
if (state == DONE)
{
if (sPoolMgr->IsSpawnedObject<Quest>(WeeklyQuestData[8].questId[instance->GetSpawnMode() & 1]))
instance->SummonCreature(NPC_VALITHRIA_DREAMWALKER_QUEST, ValithriaSpawnPos);
if (GameObject* teleporter = instance->GetGameObject(TeleporterSindragosaGUID))
SetTeleporterState(teleporter, true);
}
@@ -957,17 +869,6 @@ class instance_icecrown_citadel : public InstanceMapScript
HandleGameObject(FrostwingSigilGUID, state != DONE);
if (state == DONE)
CheckLichKingAvailability();
if (instance->IsHeroic())
{
if (state == FAIL && HeroicAttempts)
{
--HeroicAttempts;
DoUpdateWorldState(WORLDSTATE_ATTEMPTS_REMAINING, HeroicAttempts);
if (!HeroicAttempts)
if (Creature* sindra = instance->GetCreature(SindragosaGUID))
sindra->DespawnOrUnsummon();
}
}
break;
case DATA_THE_LICH_KING:
{
@@ -979,18 +880,6 @@ class instance_icecrown_citadel : public InstanceMapScript
if (GameObject* platform = instance->GetGameObject(ArthasPlatformGUID))
platform->SetFarVisible(state == IN_PROGRESS);
if (instance->IsHeroic())
{
if (state == FAIL && HeroicAttempts)
{
--HeroicAttempts;
DoUpdateWorldState(WORLDSTATE_ATTEMPTS_REMAINING, HeroicAttempts);
if (!HeroicAttempts)
if (Creature* theLichKing = instance->GetCreature(TheLichKingGUID))
theLichKing->DespawnOrUnsummon();
}
}
if (state == DONE)
{
if (GameObject* bolvar = instance->GetGameObject(FrozenBolvarGUID))
@@ -1055,37 +944,6 @@ class instance_icecrown_citadel : public InstanceMapScript
if (ColdflameJetsState == DONE)
SaveToDB();
break;
case DATA_BLOOD_QUICKENING_STATE:
{
// skip if nothing changes
if (BloodQuickeningState == data)
break;
// 5 is the index of Blood Quickening
if (!sPoolMgr->IsSpawnedObject<Quest>(WeeklyQuestData[5].questId[instance->GetSpawnMode() & 1]))
break;
switch (data)
{
case IN_PROGRESS:
Events.ScheduleEvent(EVENT_UPDATE_EXECUTION_TIME, 60000);
BloodQuickeningMinutes = 30;
DoUpdateWorldState(WORLDSTATE_SHOW_TIMER, 1);
DoUpdateWorldState(WORLDSTATE_EXECUTION_TIME, BloodQuickeningMinutes);
break;
case DONE:
Events.CancelEvent(EVENT_UPDATE_EXECUTION_TIME);
BloodQuickeningMinutes = 0;
DoUpdateWorldState(WORLDSTATE_SHOW_TIMER, 0);
break;
default:
break;
}
BloodQuickeningState = data;
SaveToDB();
break;
}
case DATA_UPPERSPIRE_TELE_ACT:
UpperSpireTeleporterActiveState = data;
if (UpperSpireTeleporterActiveState == DONE)
@@ -1303,17 +1161,12 @@ class instance_icecrown_citadel : public InstanceMapScript
void WriteSaveDataMore(std::ostringstream& data) override
{
data << HeroicAttempts << ' '
<< ColdflameJetsState << ' '
<< BloodQuickeningState << ' '
<< BloodQuickeningMinutes << ' '
data << ColdflameJetsState << ' '
<< UpperSpireTeleporterActiveState;
}
void ReadSaveDataMore(std::istringstream& data) override
{
data >> HeroicAttempts;
uint32 temp = 0;
data >> temp;
if (temp == IN_PROGRESS)
@@ -1321,10 +1174,6 @@ class instance_icecrown_citadel : public InstanceMapScript
else
ColdflameJetsState = temp ? DONE : NOT_STARTED;
data >> temp;
BloodQuickeningState = temp ? DONE : NOT_STARTED; // DONE means finished (not success/fail)
data >> BloodQuickeningMinutes;
data >> temp;
UpperSpireTeleporterActiveState = temp ? DONE : NOT_STARTED;
}
@@ -1353,7 +1202,7 @@ class instance_icecrown_citadel : public InstanceMapScript
else
LadyDeathwhisperElevatorTimer -= diff;
if (BloodQuickeningState != IN_PROGRESS && GetBossState(DATA_THE_LICH_KING) != IN_PROGRESS && GetBossState(DATA_ICECROWN_GUNSHIP_BATTLE) != FAIL)
if (GetBossState(DATA_THE_LICH_KING) != IN_PROGRESS && GetBossState(DATA_ICECROWN_GUNSHIP_BATTLE) != FAIL)
return;
Events.Update(diff);
@@ -1362,25 +1211,6 @@ class instance_icecrown_citadel : public InstanceMapScript
{
switch (eventId)
{
case EVENT_UPDATE_EXECUTION_TIME:
{
--BloodQuickeningMinutes;
if (BloodQuickeningMinutes)
{
Events.ScheduleEvent(EVENT_UPDATE_EXECUTION_TIME, 60000);
DoUpdateWorldState(WORLDSTATE_SHOW_TIMER, 1);
DoUpdateWorldState(WORLDSTATE_EXECUTION_TIME, BloodQuickeningMinutes);
}
else
{
BloodQuickeningState = DONE;
DoUpdateWorldState(WORLDSTATE_SHOW_TIMER, 0);
if (Creature* bq = instance->GetCreature(BloodQueenLanaThelGUID))
bq->AI()->DoAction(ACTION_KILL_MINCHAR);
}
SaveToDB();
break;
}
case EVENT_QUAKE_SHATTER:
{
if (GameObject* platform = instance->GetGameObject(ArthasPlatformGUID))
@@ -1534,9 +1364,6 @@ class instance_icecrown_citadel : public InstanceMapScript
std::set<uint32> FrostwyrmGUIDs;
std::set<uint32> SpinestalkerTrash;
std::set<uint32> RimefangTrash;
uint32 BloodQuickeningState;
uint32 HeroicAttempts;
uint16 BloodQuickeningMinutes;
uint8 BloodPrinceIntro;
uint8 SindragosaIntro;
uint32 LadyDeathwhisperElevatorTimer;