mirror of
https://github.com/araxiaonline/TrinityCore2.git
synced 2026-06-17 21:39:52 -04:00
Scripts: Added script for Lord Marrowgar
Added base script for Icecrown Citadel instance --HG-- branch : trunk
This commit is contained in:
@@ -14740,6 +14740,15 @@ LOCK TABLES `spell_script_names` WRITE;
|
||||
INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES
|
||||
-- generic
|
||||
( 58601, 'spell_gen_remove_flight_auras'),
|
||||
-- instances
|
||||
( 69057, 'spell_marrowgar_bone_spike_graveyard'),
|
||||
( 69140, 'spell_marrowgar_coldflame'),
|
||||
( 72705, 'spell_marrowgar_coldflame'),
|
||||
( 69147, 'spell_marrowgar_coldflame_trigger'),
|
||||
( 69075, 'spell_marrowgar_bone_storm'),
|
||||
( 70834, 'spell_marrowgar_bone_storm'),
|
||||
( 70835, 'spell_marrowgar_bone_storm'),
|
||||
( 70836, 'spell_marrowgar_bone_storm'),
|
||||
-- quest
|
||||
( 45449, 'spell_q11587_arcane_prisoner_rescue'),
|
||||
( 46023, 'spell_q11730_ultrasonic_screwdriver'),
|
||||
|
||||
@@ -2637,7 +2637,20 @@ INSERT INTO `script_texts` (`npc_entry`,`entry`,`content_default`,`content_loc1`
|
||||
(29308,-1619026,'Fresh, warm blood. It has been too long.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,0,0,0,'prince taldaram SAY_FEED2'),
|
||||
(29308,-1619027,'Your heartbeat is music to my ears.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,0,0,0,'prince taldaram SAY_VANISH1'),
|
||||
(29308,-1619028,'I am nowhere. I am everywhere. I am the watcher, unseen.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,0,0,0,'prince taldaram SAY_VANISH2'),
|
||||
|
||||
|
||||
-- -1 631 000 ICECROWN CITADEL: RAID
|
||||
-- Lord Marrowgar
|
||||
(36612,-1631000,'This is the beginning AND the end, mortals. None may enter the master''s sanctum!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,16950,1,0,0,'SAY_ENTER_ZONE'),
|
||||
(36612,-1631001,'The Scourge will wash over this world as a swarm of death and destruction!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,16941,1,0,0,'SAY_AGGRO'),
|
||||
(36612,-1631002,'BONE STORM!',NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,16946,1,0,0,'SAY_BONE_STORM'),
|
||||
(36612,-1631003,'Bound by bone!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,16947,1,0,0, 'SAY_BONESPIKE_1'),
|
||||
(36612,-1631004,'Stick Around!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,16948,1,0,0,'SAY_BONESPIKE_2'),
|
||||
(36612,-1631005,'The only escape is death!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,16949,1,0,0,'SAY_BONESPIKE_3'),
|
||||
(36612,-1631006,'More bones for the offering!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,16942,1,0,0,'SAY_KILL_1'),
|
||||
(36612,-1631007,'Languish in damnation!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,16943,1,0,0,'SAY_KILL_2'),
|
||||
(36612,-1631008,'I see... only darkness...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,16944,1,0,0,'SAY_DEATH'),
|
||||
(36612,-1631009,'THE MASTER''S RAGE COURSES THROUGH ME!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,16945,1,0,0,'SAY_BERSERK');
|
||||
|
||||
-- -1 632 000 ICECROWN CITADEL: FROZEN HALLS: FORGE OF SOULS
|
||||
-- Bronjham
|
||||
(36497,-1632001,'Finally...a captive audience!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,16595,1,0,0,'Bronjham SAY_AGGRO'),
|
||||
|
||||
@@ -826,6 +826,12 @@ UPDATE `creature_template` SET `ScriptName`='npc_argent_tournament_post' WHERE `
|
||||
UPDATE `creature_template` SET `ScriptName`='npc_alorah_and_grimmin' WHERE `entry` IN (36101,36102);
|
||||
UPDATE `creature_template` SET `ScriptName`='npc_guardian_pavilion' WHERE `entry` IN (33543,33643);
|
||||
|
||||
/* ICECROWN CITADEL */
|
||||
UPDATE `instance_template` SET `script`='instance_icecrown_citadel' WHERE `map`=631;
|
||||
UPDATE `creature_template` SET `ScriptName`='boss_lord_marrowgar' WHERE `entry`=36612;
|
||||
UPDATE `creature_template` SET `ScriptName`='npc_coldflame' WHERE `entry`=36672;
|
||||
UPDATE `creature_template` SET `ScriptName`='npc_bone_spike' WHERE `entry`=38711;
|
||||
|
||||
/* IRONFORGE */
|
||||
UPDATE `creature_template` SET `ScriptName`='npc_royal_historian_archesonus' WHERE `entry`=8879;
|
||||
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
DELETE FROM `script_texts` WHERE `entry` BETWEEN -1631999 AND -1631000;
|
||||
INSERT INTO `script_texts` (`npc_entry`,`entry`,`content_default`,`content_loc1`,`content_loc2`,`content_loc3`,`content_loc4`,`content_loc5`,`content_loc6`,`content_loc7`,`content_loc8`,`sound`,`type`,`language`,`emote`,`comment`) VALUES
|
||||
(36612,-1631000,'This is the beginning AND the end, mortals. None may enter the master''s sanctum!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,16950,1,0,0,'SAY_ENTER_ZONE'),
|
||||
(36612,-1631001,'The Scourge will wash over this world as a swarm of death and destruction!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,16941,1,0,0,'SAY_AGGRO'),
|
||||
(36612,-1631002,'BONE STORM!',NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,16946,1,0,0,'SAY_BONE_STORM'),
|
||||
(36612,-1631003,'Bound by bone!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,16947,1,0,0, 'SAY_BONESPIKE_1'),
|
||||
(36612,-1631004,'Stick Around!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,16948,1,0,0,'SAY_BONESPIKE_2'),
|
||||
(36612,-1631005,'The only escape is death!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,16949,1,0,0,'SAY_BONESPIKE_3'),
|
||||
(36612,-1631006,'More bones for the offering!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,16942,1,0,0,'SAY_KILL_1'),
|
||||
(36612,-1631007,'Languish in damnation!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,16943,1,0,0,'SAY_KILL_2'),
|
||||
(36612,-1631008,'I see... only darkness...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,16944,1,0,0,'SAY_DEATH'),
|
||||
(36612,-1631009,'THE MASTER''S RAGE COURSES THROUGH ME!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,16945,1,0,0,'SAY_BERSERK');
|
||||
@@ -0,0 +1,7 @@
|
||||
-- Lord Marrowgar
|
||||
UPDATE `creature_template` SET `ScriptName`='boss_lord_marrowgar' WHERE `entry`=36612;
|
||||
UPDATE `creature_template` SET `ScriptName`='npc_coldflame' WHERE `entry`=36672;
|
||||
UPDATE `creature_template` SET `ScriptName`='npc_bone_spike' WHERE `entry`=38711;
|
||||
|
||||
-- Instance
|
||||
UPDATE `instance_template` SET `script`='instance_icecrown_citadel' WHERE `map`=631;
|
||||
@@ -0,0 +1,13 @@
|
||||
DELETE FROM `spell_script_names` WHERE `spell_id`=69057 AND `ScriptName`='spell_marrowgar_bone_spike_graveyard';
|
||||
DELETE FROM `spell_script_names` WHERE `spell_id` IN (69140,72705) AND `ScriptName`='spell_marrowgar_coldflame';
|
||||
DELETE FROM `spell_script_names` WHERE `spell_id`=69147 AND `ScriptName`='spell_marrowgar_coldflame_trigger';
|
||||
DELETE FROM `spell_script_names` WHERE `spell_id` IN (69075,70834,70835,70836) AND `ScriptName`='spell_marrowgar_bone_storm';
|
||||
INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES
|
||||
(69057,'spell_marrowgar_bone_spike_graveyard'),
|
||||
(69140,'spell_marrowgar_coldflame'),
|
||||
(72705,'spell_marrowgar_coldflame'),
|
||||
(69147,'spell_marrowgar_coldflame_trigger'),
|
||||
(69075,'spell_marrowgar_bone_storm'),
|
||||
(70834,'spell_marrowgar_bone_storm'),
|
||||
(70835,'spell_marrowgar_bone_storm'),
|
||||
(70836,'spell_marrowgar_bone_storm');
|
||||
@@ -417,6 +417,8 @@ void AddSC_instance_halls_of_reflection(); // Halls of Reflection
|
||||
void AddSC_halls_of_reflection();
|
||||
void AddSC_boss_falric();
|
||||
void AddSC_boss_marwyn();
|
||||
void AddSC_boss_lord_marrowgar(); // Icecrown Citadel
|
||||
void AddSC_instance_icecrown_citadel();
|
||||
|
||||
void AddSC_dalaran();
|
||||
void AddSC_borean_tundra();
|
||||
@@ -1079,6 +1081,8 @@ void AddNorthrendScripts()
|
||||
AddSC_halls_of_reflection();
|
||||
AddSC_boss_falric();
|
||||
AddSC_boss_marwyn();
|
||||
AddSC_boss_lord_marrowgar(); // Icecrown Citadel
|
||||
AddSC_instance_icecrown_citadel();
|
||||
|
||||
AddSC_dalaran();
|
||||
AddSC_borean_tundra();
|
||||
|
||||
@@ -2041,6 +2041,9 @@ void Spell::EffectTriggerSpell(uint32 effIndex)
|
||||
case 57879:
|
||||
originalCaster = m_originalCaster;
|
||||
break;
|
||||
// Coldflame
|
||||
case 33801:
|
||||
return; // just make the core stfu
|
||||
}
|
||||
|
||||
// normal case
|
||||
@@ -4193,6 +4196,24 @@ void Spell::SpellDamageWeaponDmg(uint32 i)
|
||||
|
||||
switch (m_spellInfo->SpellFamilyName)
|
||||
{
|
||||
case SPELLFAMILY_GENERIC:
|
||||
{
|
||||
switch (m_spellInfo->Id)
|
||||
{
|
||||
case 69055: // Saber Lash
|
||||
case 70814: // Saber Lash
|
||||
{
|
||||
uint32 count = 0;
|
||||
for (std::list<TargetInfo>::iterator ihit = m_UniqueTargetInfo.begin(); ihit != m_UniqueTargetInfo.end(); ++ihit)
|
||||
if (ihit->effectMask & (1 << i))
|
||||
++count;
|
||||
|
||||
totalDamagePercentMod /= count;
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case SPELLFAMILY_WARRIOR:
|
||||
{
|
||||
// Devastate (player ones)
|
||||
|
||||
@@ -3841,6 +3841,18 @@ void SpellMgr::LoadSpellCustomAttr()
|
||||
spellInfo->AttributesEx |= SPELL_ATTR_EX_DISPEL_AURAS_ON_IMMUNITY;
|
||||
count++;
|
||||
break;
|
||||
case 69055: // Saber Lash
|
||||
case 70814: // Saber Lash
|
||||
spellInfo->EffectRadiusIndex[0] = 8;
|
||||
count++;
|
||||
break;
|
||||
case 69075: // Bone Storm
|
||||
case 70834: // Bone Storm
|
||||
case 70835: // Bone Storm
|
||||
case 70836: // Bone Storm
|
||||
spellInfo->EffectRadiusIndex[0] = 12;
|
||||
count++;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,523 @@
|
||||
/*
|
||||
* Copyright (C) 2008-2010 Trinity <http://www.trinitycore.org/>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#include "ScriptPCH.h"
|
||||
#include "icecrown_citadel.h"
|
||||
#include "MapManager.h"
|
||||
|
||||
enum eScriptTexts
|
||||
{
|
||||
SAY_ENTER_ZONE = -1631000,
|
||||
SAY_AGGRO = -1631001,
|
||||
SAY_BONE_STORM = -1631002,
|
||||
SAY_BONESPIKE_1 = -1631003,
|
||||
SAY_BONESPIKE_2 = -1631004,
|
||||
SAY_BONESPIKE_3 = -1631005,
|
||||
SAY_KILL_1 = -1631006,
|
||||
SAY_KILL_2 = -1631007,
|
||||
SAY_DEATH = -1631008,
|
||||
SAY_BERSERK = -1631009,
|
||||
};
|
||||
|
||||
enum eSpells
|
||||
{
|
||||
// Lord Marrowgar
|
||||
SPELL_BONE_SLICE = 69055,
|
||||
SPELL_BONE_STORM = 69076,
|
||||
SPELL_BONE_SPIKE_GRAVEYARD = 69057,
|
||||
SPELL_COLDFLAME_NORMAL = 69140,
|
||||
SPELL_COLDFLAME_BONE_STORM = 72705,
|
||||
|
||||
// Bone Spike
|
||||
SPELL_IMPALED = 69065,
|
||||
|
||||
// Coldflame
|
||||
SPELL_COLDFLAME_PASSIVE = 69145,
|
||||
};
|
||||
|
||||
enum eEvents
|
||||
{
|
||||
EVENT_BONE_SPIKE_GRAVEYARD = 1,
|
||||
EVENT_COLDFLAME = 2,
|
||||
EVENT_BONE_STORM_BEGIN = 3,
|
||||
EVENT_BONE_STORM_MOVE = 4,
|
||||
EVENT_BONE_STORM_END = 5,
|
||||
EVENT_ENABLE_BONE_SLICE = 6,
|
||||
EVENT_ENRAGE = 7,
|
||||
|
||||
EVENT_COLDFLAME_TRIGGER = 8,
|
||||
EVENT_FAIL_BONED = 9
|
||||
};
|
||||
|
||||
enum eMovementPoints
|
||||
{
|
||||
POINT_TARGET_BONESTORM_PLAYER = 36612631, // entry+mapid
|
||||
POINT_TARGET_COLDFLAME = 36672631
|
||||
};
|
||||
|
||||
class boss_lord_marrowgar : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_lord_marrowgar() : CreatureScript("boss_lord_marrowgar") { }
|
||||
|
||||
struct boss_lord_marrowgarAI : public ScriptedAI
|
||||
{
|
||||
boss_lord_marrowgarAI(Creature *pCreature) : ScriptedAI(pCreature)
|
||||
{
|
||||
uiBoneStormDuration = RAID_MODE(20000,30000,20000,30000);
|
||||
fBaseSpeed = pCreature->GetSpeedRate(MOVE_RUN);
|
||||
bIntroDone = false;
|
||||
pInstance = pCreature->GetInstanceScript();
|
||||
}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
me->SetSpeed(MOVE_RUN, fBaseSpeed, true);
|
||||
me->RemoveAurasDueToSpell(SPELL_BONE_STORM);
|
||||
events.Reset();
|
||||
events.ScheduleEvent(EVENT_ENABLE_BONE_SLICE, 10000);
|
||||
events.ScheduleEvent(EVENT_BONE_SPIKE_GRAVEYARD, urand(20000, 35000));
|
||||
events.ScheduleEvent(EVENT_COLDFLAME, urand(15000, 25000));
|
||||
events.ScheduleEvent(EVENT_BONE_STORM_BEGIN, urand(35000, 50000));
|
||||
events.ScheduleEvent(EVENT_ENRAGE, 600000);
|
||||
if (pInstance)
|
||||
pInstance->SetData(DATA_LORD_MARROWGAR, NOT_STARTED);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* who)
|
||||
{
|
||||
DoScriptText(SAY_AGGRO, me);
|
||||
|
||||
if (pInstance)
|
||||
pInstance->SetData(DATA_LORD_MARROWGAR, IN_PROGRESS);
|
||||
}
|
||||
|
||||
void JustDied(Unit* killer)
|
||||
{
|
||||
DoScriptText(SAY_DEATH, me);
|
||||
|
||||
if (pInstance)
|
||||
pInstance->SetData(DATA_LORD_MARROWGAR, DONE);
|
||||
}
|
||||
|
||||
void JustReachedHome()
|
||||
{
|
||||
if(pInstance)
|
||||
pInstance->SetData(DATA_LORD_MARROWGAR, FAIL);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit *victim)
|
||||
{
|
||||
if (victim->GetTypeId() == TYPEID_PLAYER)
|
||||
DoScriptText(RAND(SAY_KILL_1, SAY_KILL_2), me);
|
||||
}
|
||||
|
||||
void MoveInLineOfSight(Unit *who)
|
||||
{
|
||||
if (!bIntroDone && me->IsWithinDistInMap(who, 70.0f))
|
||||
{
|
||||
DoScriptText(SAY_ENTER_ZONE, me);
|
||||
bIntroDone = true;
|
||||
}
|
||||
|
||||
ScriptedAI::MoveInLineOfSight(who);
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
if (me->hasUnitState(UNIT_STAT_CASTING))
|
||||
return;
|
||||
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_BONE_SPIKE_GRAVEYARD:
|
||||
if (IsHeroic() || !me->HasAura(SPELL_BONE_STORM))
|
||||
DoCast(me, SPELL_BONE_SPIKE_GRAVEYARD);
|
||||
events.ScheduleEvent(EVENT_BONE_SPIKE_GRAVEYARD, urand(25000, 35000));
|
||||
break;
|
||||
case EVENT_COLDFLAME:
|
||||
if (!me->HasAura(SPELL_BONE_STORM))
|
||||
DoCast(me, SPELL_COLDFLAME_NORMAL);
|
||||
else
|
||||
DoCast(me, SPELL_COLDFLAME_BONE_STORM);
|
||||
events.ScheduleEvent(EVENT_COLDFLAME, urand(20000, 30000));
|
||||
break;
|
||||
case EVENT_BONE_STORM_BEGIN:
|
||||
{
|
||||
bBoneSlice = false;
|
||||
DoScriptText(SAY_BONE_STORM, me);
|
||||
events.ScheduleEvent(EVENT_BONE_STORM_END, uiBoneStormDuration+1);
|
||||
SpellEntry const *spellInfo = sSpellStore.LookupEntry(SPELL_BONE_STORM);
|
||||
if (Aura* pStorm = me->AddAura(spellInfo, 3, me))
|
||||
pStorm->SetDuration(int32(uiBoneStormDuration));
|
||||
me->FinishSpell(CURRENT_MELEE_SPELL, false);
|
||||
me->SetSpeed(MOVE_RUN, fBaseSpeed*3.0f, true);
|
||||
// no break here
|
||||
}
|
||||
case EVENT_BONE_STORM_MOVE:
|
||||
{
|
||||
events.ScheduleEvent(EVENT_BONE_STORM_MOVE, uiBoneStormDuration/3);
|
||||
Unit* pUnit = SelectUnit(SELECT_TARGET_RANDOM, 1);
|
||||
if (!pUnit)
|
||||
pUnit = SelectUnit(SELECT_TARGET_RANDOM, 0);
|
||||
if (pUnit)
|
||||
me->GetMotionMaster()->MovePoint(POINT_TARGET_BONESTORM_PLAYER, pUnit->GetPositionX(), pUnit->GetPositionY(), pUnit->GetPositionZ());
|
||||
break;
|
||||
}
|
||||
case EVENT_BONE_STORM_END:
|
||||
if (me->GetMotionMaster()->GetCurrentMovementGeneratorType() == POINT_MOTION_TYPE)
|
||||
me->GetMotionMaster()->MovementExpired();
|
||||
DoStartMovement(me->getVictim());
|
||||
me->SetSpeed(MOVE_RUN, fBaseSpeed, true);
|
||||
events.CancelEvent(EVENT_BONE_STORM_MOVE);
|
||||
events.ScheduleEvent(EVENT_ENABLE_BONE_SLICE, 10000);
|
||||
events.ScheduleEvent(EVENT_BONE_STORM_BEGIN, urand(35000, 50000));
|
||||
break;
|
||||
case EVENT_ENABLE_BONE_SLICE:
|
||||
bBoneSlice = true;
|
||||
break;
|
||||
case EVENT_ENRAGE:
|
||||
DoCast(me, SPELL_BERSERK, true);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// We should not melee attack when storming
|
||||
if (me->HasAura(SPELL_BONE_STORM))
|
||||
return;
|
||||
|
||||
// After 10 seconds since encounter start Bone Slice replaces melee attacks
|
||||
if (bBoneSlice && !me->GetCurrentSpell(CURRENT_MELEE_SPELL))
|
||||
DoCastVictim(SPELL_BONE_SLICE);
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
void MovementInform(uint32 type, uint32 id)
|
||||
{
|
||||
if (type != POINT_MOTION_TYPE || id != POINT_TARGET_BONESTORM_PLAYER)
|
||||
return;
|
||||
|
||||
// lock movement
|
||||
DoStartNoMovement(me->getVictim());
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
EventMap events;
|
||||
InstanceScript* pInstance;
|
||||
bool bIntroDone;
|
||||
uint32 uiBoneStormDuration;
|
||||
float fBaseSpeed;
|
||||
bool bBoneSlice;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* pCreature) const
|
||||
{
|
||||
return new boss_lord_marrowgarAI(pCreature);
|
||||
}
|
||||
};
|
||||
|
||||
class npc_coldflame : public CreatureScript
|
||||
{
|
||||
public:
|
||||
npc_coldflame() : CreatureScript("npc_coldflame") { }
|
||||
|
||||
struct npc_coldflameAI : public ScriptedAI
|
||||
{
|
||||
npc_coldflameAI(Creature *pCreature) : ScriptedAI(pCreature)
|
||||
{
|
||||
}
|
||||
|
||||
void IsSummonedBy(Unit* owner)
|
||||
{
|
||||
DoCast(me, SPELL_COLDFLAME_PASSIVE, true);
|
||||
float x, y, z;
|
||||
// random target case
|
||||
if (!owner->HasAura(SPELL_BONE_STORM) && owner->GetTypeId() == TYPEID_UNIT)
|
||||
{
|
||||
Creature* creOwner = owner->ToCreature();
|
||||
// select any unit but not the tank (by owners threatlist)
|
||||
Unit* target = creOwner->AI()->SelectTarget(SELECT_TARGET_RANDOM, 1, 40.0f, true);
|
||||
if (!target)
|
||||
target = creOwner->AI()->SelectTarget(SELECT_TARGET_RANDOM, 0, 40.0f, true); // or the tank if its solo
|
||||
if (!target)
|
||||
{
|
||||
me->ForcedDespawn();
|
||||
return;
|
||||
}
|
||||
|
||||
target->GetPosition(x, y, z);
|
||||
float scale = 50.0f / me->GetExactDist2d(x, y);
|
||||
x = me->GetPositionX() + (x - me->GetPositionX()) * scale;
|
||||
y = me->GetPositionY() + (y - me->GetPositionY()) * scale;
|
||||
}
|
||||
else
|
||||
{
|
||||
me->GetPosition(x, y, z);
|
||||
float ang = me->GetAngle(owner) - static_cast<float>(M_PI);
|
||||
MapManager::NormalizeOrientation(ang);
|
||||
x += 35.0f * cosf(ang);
|
||||
y += 35.0f * sinf(ang);
|
||||
}
|
||||
me->GetMotionMaster()->MovePoint(POINT_TARGET_COLDFLAME, x, y, z);
|
||||
events.ScheduleEvent(EVENT_COLDFLAME_TRIGGER, 400);
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
events.Update(diff);
|
||||
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
if (eventId == EVENT_COLDFLAME_TRIGGER)
|
||||
{
|
||||
if (me->HasAura(SPELL_COLDFLAME_PASSIVE))
|
||||
DoCast(SPELL_COLDFLAME_PASSIVE);
|
||||
events.ScheduleEvent(EVENT_COLDFLAME_TRIGGER, 400);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void MovementInform(uint32 type, uint32 id)
|
||||
{
|
||||
if (type != POINT_MOTION_TYPE || id != POINT_TARGET_COLDFLAME)
|
||||
return;
|
||||
|
||||
// stop triggering but dont despawn
|
||||
me->RemoveAura(SPELL_COLDFLAME_PASSIVE);
|
||||
}
|
||||
|
||||
private:
|
||||
EventMap events;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* pCreature) const
|
||||
{
|
||||
return new npc_coldflameAI(pCreature);
|
||||
}
|
||||
};
|
||||
|
||||
class npc_bone_spike : public CreatureScript
|
||||
{
|
||||
public:
|
||||
npc_bone_spike() : CreatureScript("npc_bone_spike") { }
|
||||
|
||||
struct npc_bone_spikeAI : public Scripted_NoMovementAI
|
||||
{
|
||||
npc_bone_spikeAI(Creature *pCreature) : Scripted_NoMovementAI(pCreature)
|
||||
{
|
||||
uiTrappedGUID = 0;
|
||||
}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
uiTrappedGUID = 0;
|
||||
}
|
||||
|
||||
void JustDied(Unit *killer)
|
||||
{
|
||||
events.Reset();
|
||||
if (Unit* trapped = Unit::GetUnit((*me), uiTrappedGUID))
|
||||
{
|
||||
trapped->RemoveAurasDueToSpell(SPELL_IMPALED);
|
||||
trapped->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE);
|
||||
}
|
||||
}
|
||||
|
||||
void KilledUnit(Unit *pVictim)
|
||||
{
|
||||
me->Kill(me);
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
if (!uiTrappedGUID)
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
Unit* trapped = Unit::GetUnit(*me, uiTrappedGUID);
|
||||
if ((trapped && trapped->isAlive() && !trapped->HasAura(SPELL_IMPALED)) || !trapped)
|
||||
me->Kill(me);
|
||||
|
||||
if (events.ExecuteEvent() == EVENT_FAIL_BONED)
|
||||
if (InstanceScript* instance = me->GetInstanceScript())
|
||||
instance->SetData(COMMAND_FAIL_BONED, 0);
|
||||
}
|
||||
|
||||
void SetTrappedUnit(Unit* unit)
|
||||
{
|
||||
uiTrappedGUID = unit->GetGUID();
|
||||
float x, y, z;
|
||||
me->GetPosition(x, y, z);
|
||||
unit->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_DROWNED);
|
||||
DoCast(unit, SPELL_IMPALED, true);
|
||||
unit->NearTeleportTo(x, y, z+3.0f, unit->GetOrientation(), false);
|
||||
events.ScheduleEvent(EVENT_FAIL_BONED, 8000);
|
||||
}
|
||||
|
||||
private:
|
||||
uint64 uiTrappedGUID;
|
||||
EventMap events;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* pCreature) const
|
||||
{
|
||||
return new npc_bone_spikeAI(pCreature);
|
||||
}
|
||||
};
|
||||
|
||||
class spell_marrowgar_coldflame : public SpellHandlerScript
|
||||
{
|
||||
public:
|
||||
spell_marrowgar_coldflame() : SpellHandlerScript("spell_marrowgar_coldflame") { }
|
||||
|
||||
class spell_marrowgar_coldflame_SpellScript : public SpellScript
|
||||
{
|
||||
void HandleScriptEffect(SpellEffIndex effIndex)
|
||||
{
|
||||
uint8 count = 1;
|
||||
if (GetSpellInfo()->Id == 72705)
|
||||
count = 4;
|
||||
|
||||
for (uint8 i = 0; i < count; ++i)
|
||||
GetCaster()->CastSpell(GetCaster(), SpellMgr::CalculateSpellEffectAmount(GetSpellInfo(), EFFECT_0)+i, true);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
EffectHandlers += EffectHandlerFn(spell_marrowgar_coldflame_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
|
||||
}
|
||||
|
||||
bool Load()
|
||||
{
|
||||
if (GetCaster()->GetEntry() != NPC_LORD_MARROWGAR)
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_marrowgar_coldflame_SpellScript();
|
||||
}
|
||||
};
|
||||
|
||||
class spell_marrowgar_bone_spike_graveyard : public SpellHandlerScript
|
||||
{
|
||||
public:
|
||||
spell_marrowgar_bone_spike_graveyard() : SpellHandlerScript("spell_marrowgar_bone_spike_graveyard") { }
|
||||
|
||||
class spell_marrowgar_bone_spike_graveyard_SpellScript : public SpellScript
|
||||
{
|
||||
void HandleApplyAura(SpellEffIndex effIndex)
|
||||
{
|
||||
CreatureAI* marrowgarAI = GetCaster()->ToCreature()->AI();
|
||||
bool yell = false;
|
||||
uint8 boneSpikeCount = GetCaster()->GetMap()->GetSpawnMode() & 1 ? 3 : 1;
|
||||
for (uint8 i = 0; i < boneSpikeCount; ++i)
|
||||
{
|
||||
// select any unit but not the tank
|
||||
Unit* target = marrowgarAI->SelectTarget(SELECT_TARGET_RANDOM, 1, 100.0f, true, -SPELL_IMPALED);
|
||||
if (!target)
|
||||
target = marrowgarAI->SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true, -SPELL_IMPALED); // or the tank if its solo
|
||||
if (!target)
|
||||
break;
|
||||
yell = true;
|
||||
//marrowgarAI->DoCast(*itr, SPELL_IMPALE); // this is the proper spell but if we use it we dont have any way to assign a victim to it
|
||||
Creature* pBone = GetCaster()->SummonCreature(NPC_BONE_SPIKE, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_CORPSE_DESPAWN);
|
||||
CAST_AI(npc_bone_spike::npc_bone_spikeAI, pBone->AI())->SetTrappedUnit(target);
|
||||
}
|
||||
|
||||
if (yell)
|
||||
DoScriptText(RAND(SAY_BONESPIKE_1, SAY_BONESPIKE_2, SAY_BONESPIKE_3), GetCaster());
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
EffectHandlers += EffectHandlerFn(spell_marrowgar_bone_spike_graveyard_SpellScript::HandleApplyAura, EFFECT_1, SPELL_EFFECT_APPLY_AURA);
|
||||
}
|
||||
|
||||
bool Load()
|
||||
{
|
||||
if (GetCaster()->GetEntry() != NPC_LORD_MARROWGAR)
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_marrowgar_bone_spike_graveyard_SpellScript();
|
||||
}
|
||||
};
|
||||
|
||||
class spell_marrowgar_bone_storm : public SpellHandlerScript
|
||||
{
|
||||
public:
|
||||
spell_marrowgar_bone_storm() : SpellHandlerScript("spell_marrowgar_bone_storm") { }
|
||||
|
||||
class spell_marrowgar_bone_storm_SpellScript : public SpellScript
|
||||
{
|
||||
void RecalculateDamage(SpellEffIndex effIndex)
|
||||
{
|
||||
int32 dmg = GetHitDamage();
|
||||
float distance = GetHitUnit()->GetExactDist2d(GetCaster());
|
||||
if (distance < 5.0f)
|
||||
return;
|
||||
|
||||
float distVar = distance >= 20.0f ? 4 : (10.0f/3.0f);
|
||||
dmg /= distance / distVar;
|
||||
SetHitDamage(dmg);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
EffectHandlers += EffectHandlerFn(spell_marrowgar_bone_storm_SpellScript::RecalculateDamage, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE);
|
||||
}
|
||||
|
||||
bool Load()
|
||||
{
|
||||
if (GetCaster()->GetEntry() != NPC_LORD_MARROWGAR)
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_marrowgar_bone_storm_SpellScript();
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_lord_marrowgar()
|
||||
{
|
||||
new boss_lord_marrowgar();
|
||||
new npc_coldflame();
|
||||
new npc_bone_spike();
|
||||
new spell_marrowgar_coldflame();
|
||||
new spell_marrowgar_bone_spike_graveyard();
|
||||
new spell_marrowgar_bone_storm();
|
||||
}
|
||||
@@ -0,0 +1,69 @@
|
||||
/*
|
||||
* Copyright (C) 2008-2010 Trinity <http://www.trinitycore.org/>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#ifndef DEF_ICECROWN_CITADEL_H
|
||||
#define DEF_ICECROWN_CITADEL_H
|
||||
|
||||
enum eSharedSpells
|
||||
{
|
||||
SPELL_BERSERK = 26662
|
||||
};
|
||||
|
||||
enum eData
|
||||
{
|
||||
DATA_LORD_MARROWGAR = 0,
|
||||
DATA_LADY_DEATHWHISPER = 1,
|
||||
DATA_GUNSHIP_EVENT = 2,
|
||||
DATA_DEATHBRINGER_SAURFANG = 3,
|
||||
DATA_FESTERGUT = 4,
|
||||
DATA_ROTFACE = 5,
|
||||
DATA_PROFESSOR_PUTRICIDE = 6,
|
||||
DATA_BLOOD_PRINCE_COUNCIL = 7,
|
||||
DATA_BLOOD_QUEEN_LANA_THEL = 8,
|
||||
DATA_VALITHRIA_DREAMWALKER = 9,
|
||||
DATA_SINDRAGOSA = 10,
|
||||
DATA_THE_LICH_KING = 11,
|
||||
|
||||
COMMAND_FAIL_BONED
|
||||
};
|
||||
|
||||
#define MAX_ENCOUNTER 12
|
||||
|
||||
enum eCreatures
|
||||
{
|
||||
NPC_LORD_MARROWGAR = 36612,
|
||||
NPC_COLDFLAME = 36672,
|
||||
NPC_BONE_SPIKE = 38711
|
||||
};
|
||||
|
||||
enum eGameobjects
|
||||
{
|
||||
DOODAD_ICECROWN_ICEWALL02 = 201910,
|
||||
ICEWALL = 201911,
|
||||
LORD_MARROWGAR_S_ENTRANCE = 201857
|
||||
};
|
||||
|
||||
enum eAchievementCriteria
|
||||
{
|
||||
CRITERIA_BONED_10N = 12775,
|
||||
CRITERIA_BONED_25N = 12962,
|
||||
CRITERIA_BONED_10H = 13393,
|
||||
CRITERIA_BONED_25H = 13394,
|
||||
};
|
||||
|
||||
#endif // DEF_ICECROWN_CITADEL_H
|
||||
@@ -0,0 +1,209 @@
|
||||
/*
|
||||
* Copyright (C) 2008-2010 Trinity <http://www.trinitycore.org/>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#include "ScriptPCH.h"
|
||||
#include "icecrown_citadel.h"
|
||||
|
||||
class instance_icecrown_citadel : public InstanceMapScript
|
||||
{
|
||||
public:
|
||||
instance_icecrown_citadel() : InstanceMapScript("instance_icecrown_citadel", 631) { }
|
||||
|
||||
struct instance_icecrown_citadel_InstanceMapScript : public InstanceScript
|
||||
{
|
||||
instance_icecrown_citadel_InstanceMapScript(Map* pMap) : InstanceScript(pMap)
|
||||
{
|
||||
memset(uiEncounterState, 0, MAX_ENCOUNTER*sizeof(uint32));
|
||||
memset(uiIcewall, 0, 2*sizeof(uint32));
|
||||
uiMarrowgarEntrance = 0;
|
||||
isBonedEgible = true;
|
||||
}
|
||||
|
||||
bool IsEncounterInProgress() const
|
||||
{
|
||||
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
|
||||
if (uiEncounterState[i] == IN_PROGRESS)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void OnGameObjectCreate(GameObject* pGo, bool add)
|
||||
{
|
||||
switch (pGo->GetEntry())
|
||||
{
|
||||
case DOODAD_ICECROWN_ICEWALL02:
|
||||
uiIcewall[0] = pGo->GetGUID();
|
||||
if (GetData(DATA_LORD_MARROWGAR) == NOT_STARTED)
|
||||
HandleGameObject(uiIcewall[0], false, pGo);
|
||||
break;
|
||||
case ICEWALL:
|
||||
uiIcewall[1] = pGo->GetGUID();
|
||||
if (GetData(DATA_LORD_MARROWGAR) == NOT_STARTED)
|
||||
HandleGameObject(uiIcewall[1], false, pGo);
|
||||
break;
|
||||
case LORD_MARROWGAR_S_ENTRANCE:
|
||||
uiMarrowgarEntrance = pGo->GetGUID();
|
||||
if (GetData(DATA_LORD_MARROWGAR) == DONE)
|
||||
HandleGameObject(uiMarrowgarEntrance, true, pGo);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
uint32 GetData(uint32 type)
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case DATA_LORD_MARROWGAR:
|
||||
case DATA_LADY_DEATHWHISPER:
|
||||
case DATA_GUNSHIP_EVENT:
|
||||
case DATA_DEATHBRINGER_SAURFANG:
|
||||
case DATA_FESTERGUT:
|
||||
case DATA_ROTFACE:
|
||||
case DATA_PROFESSOR_PUTRICIDE:
|
||||
case DATA_BLOOD_PRINCE_COUNCIL:
|
||||
case DATA_BLOOD_QUEEN_LANA_THEL:
|
||||
case DATA_VALITHRIA_DREAMWALKER:
|
||||
case DATA_SINDRAGOSA:
|
||||
case DATA_THE_LICH_KING:
|
||||
return uiEncounterState[type];
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void SetData(uint32 type, uint32 data)
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case DATA_LORD_MARROWGAR:
|
||||
uiEncounterState[type] = data;
|
||||
switch(data)
|
||||
{
|
||||
case DONE:
|
||||
HandleGameObject(uiIcewall[0], true);
|
||||
HandleGameObject(uiIcewall[1], true);
|
||||
HandleGameObject(uiMarrowgarEntrance, true);
|
||||
break;
|
||||
case NOT_STARTED:
|
||||
HandleGameObject(uiIcewall[0], false);
|
||||
HandleGameObject(uiIcewall[1], false);
|
||||
HandleGameObject(uiMarrowgarEntrance, true);
|
||||
break;
|
||||
case IN_PROGRESS:
|
||||
HandleGameObject(uiMarrowgarEntrance, false);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case DATA_LADY_DEATHWHISPER:
|
||||
case DATA_GUNSHIP_EVENT:
|
||||
case DATA_DEATHBRINGER_SAURFANG:
|
||||
case DATA_FESTERGUT:
|
||||
case DATA_ROTFACE:
|
||||
case DATA_PROFESSOR_PUTRICIDE:
|
||||
case DATA_BLOOD_PRINCE_COUNCIL:
|
||||
case DATA_BLOOD_QUEEN_LANA_THEL:
|
||||
case DATA_VALITHRIA_DREAMWALKER:
|
||||
case DATA_SINDRAGOSA:
|
||||
case DATA_THE_LICH_KING:
|
||||
uiEncounterState[type] = data;
|
||||
break;
|
||||
|
||||
case COMMAND_FAIL_BONED:
|
||||
isBonedEgible = data ? true : false;
|
||||
}
|
||||
}
|
||||
|
||||
bool CheckAchievementCriteriaMeet(uint32 criteria_id, Player const* /*source*/, Unit const* /*target*/, uint32 /*miscvalue1*/)
|
||||
{
|
||||
switch (criteria_id)
|
||||
{
|
||||
case CRITERIA_BONED_10N:
|
||||
case CRITERIA_BONED_25N:
|
||||
case CRITERIA_BONED_10H:
|
||||
case CRITERIA_BONED_25H:
|
||||
return isBonedEgible;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
std::string GetSaveData()
|
||||
{
|
||||
OUT_SAVE_INST_DATA;
|
||||
|
||||
std::ostringstream saveStream;
|
||||
saveStream << "I C ";
|
||||
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
|
||||
saveStream << uiEncounterState[i] << " ";
|
||||
|
||||
saveStream << isBonedEgible;
|
||||
|
||||
OUT_SAVE_INST_DATA_COMPLETE;
|
||||
return saveStream.str();
|
||||
}
|
||||
|
||||
void Load(const char* in)
|
||||
{
|
||||
if (!in)
|
||||
{
|
||||
OUT_LOAD_INST_DATA_FAIL;
|
||||
return;
|
||||
}
|
||||
|
||||
OUT_LOAD_INST_DATA(in);
|
||||
|
||||
char dataHead1, dataHead2;
|
||||
|
||||
std::istringstream loadStream(in);
|
||||
loadStream >> dataHead1 >> dataHead2;
|
||||
|
||||
if (dataHead1 == 'I' && dataHead2 == 'C')
|
||||
{
|
||||
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
|
||||
{
|
||||
uint32 tmpState;
|
||||
loadStream >> tmpState;
|
||||
if (tmpState == IN_PROGRESS)
|
||||
tmpState = NOT_STARTED;
|
||||
uiEncounterState[i] = tmpState;
|
||||
}
|
||||
|
||||
loadStream >> isBonedEgible;
|
||||
} else OUT_LOAD_INST_DATA_FAIL;
|
||||
|
||||
OUT_LOAD_INST_DATA_COMPLETE;
|
||||
}
|
||||
|
||||
private:
|
||||
uint32 uiEncounterState[MAX_ENCOUNTER];
|
||||
uint64 uiIcewall[2];
|
||||
uint64 uiMarrowgarEntrance;
|
||||
bool isBonedEgible;
|
||||
};
|
||||
|
||||
InstanceScript* GetInstanceScript(InstanceMap* pMap) const
|
||||
{
|
||||
return new instance_icecrown_citadel_InstanceMapScript(pMap);
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_instance_icecrown_citadel()
|
||||
{
|
||||
new instance_icecrown_citadel();
|
||||
}
|
||||
Reference in New Issue
Block a user