Scripts/Icecrown Citadel: Icecrown Gunship Battle

This commit is contained in:
Shauren
2014-03-23 02:01:13 +01:00
parent d2925597f2
commit a4d8a26dc7
13 changed files with 3163 additions and 79 deletions

View File

@@ -168,6 +168,7 @@ set(scripts_STAT_SRCS
Northrend/IcecrownCitadel/icecrown_citadel_teleport.cpp
Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp
Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp
Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp
Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp
Northrend/IcecrownCitadel/boss_festergut.cpp
Northrend/IcecrownCitadel/boss_rotface.cpp

File diff suppressed because it is too large Load Diff

View File

@@ -2570,38 +2570,6 @@ class spell_the_lich_king_valkyr_target_search : public SpellScriptLoader
}
};
class spell_the_lich_king_eject_all_passengers : public SpellScriptLoader
{
public:
spell_the_lich_king_eject_all_passengers() : SpellScriptLoader("spell_the_lich_king_eject_all_passengers") { }
class spell_the_lich_king_eject_all_passengers_SpellScript : public SpellScript
{
PrepareSpellScript(spell_the_lich_king_eject_all_passengers_SpellScript);
bool Load() OVERRIDE
{
return GetCaster()->IsVehicle();
}
void HandleDummy(SpellEffIndex effIndex)
{
PreventHitDefaultEffect(effIndex);
GetCaster()->GetVehicleKit()->RemoveAllPassengers();
}
void Register() OVERRIDE
{
OnEffectHitTarget += SpellEffectFn(spell_the_lich_king_eject_all_passengers_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
}
};
SpellScript* GetSpellScript() const OVERRIDE
{
return new spell_the_lich_king_eject_all_passengers_SpellScript();
}
};
class spell_the_lich_king_cast_back_to_caster : public SpellScriptLoader
{
public:
@@ -3234,7 +3202,6 @@ void AddSC_boss_the_lich_king()
new spell_the_lich_king_summon_into_air();
new spell_the_lich_king_soul_reaper();
new spell_the_lich_king_valkyr_target_search();
new spell_the_lich_king_eject_all_passengers();
new spell_the_lich_king_cast_back_to_caster();
new spell_the_lich_king_life_siphon();
new spell_the_lich_king_vile_spirits();

View File

@@ -76,7 +76,7 @@ enum DataTypes
// Encounter States/Boss GUIDs
DATA_LORD_MARROWGAR = 0,
DATA_LADY_DEATHWHISPER = 1,
DATA_GUNSHIP_EVENT = 2,
DATA_ICECROWN_GUNSHIP_BATTLE = 2,
DATA_DEATHBRINGER_SAURFANG = 3,
DATA_FESTERGUT = 4,
DATA_ROTFACE = 5,
@@ -116,6 +116,7 @@ enum DataTypes
DATA_HIGHLORD_TIRION_FORDRING = 37,
DATA_ARTHAS_PLATFORM = 38,
DATA_TERENAS_MENETHIL = 39,
DATA_ENEMY_GUNSHIP = 40
};
enum CreaturesIds
@@ -169,6 +170,33 @@ enum CreaturesIds
NPC_REANIMATED_ADHERENT = 38010,
NPC_VENGEFUL_SHADE = 38222,
// Icecrown Gunship Battle
NPC_MARTYR_STALKER_IGB_SAURFANG = 38569,
NPC_ALLIANCE_GUNSHIP_CANNON = 36838,
NPC_HORDE_GUNSHIP_CANNON = 36839,
NPC_SKYBREAKER_DECKHAND = 36970,
NPC_ORGRIMS_HAMMER_CREW = 36971,
NPC_IGB_HIGH_OVERLORD_SAURFANG = 36939,
NPC_IGB_MURADIN_BRONZEBEARD = 36948,
NPC_THE_SKYBREAKER = 37540,
NPC_ORGRIMS_HAMMER = 37215,
NPC_GUNSHIP_HULL = 37547,
NPC_TELEPORT_PORTAL = 37227,
NPC_TELEPORT_EXIT = 37488,
NPC_SKYBREAKER_SORCERER = 37116,
NPC_SKYBREAKER_RIFLEMAN = 36969,
NPC_SKYBREAKER_MORTAR_SOLDIER = 36978,
NPC_SKYBREAKER_MARINE = 36950,
NPC_SKYBREAKER_SERGEANT = 36961,
NPC_KOR_KRON_BATTLE_MAGE = 37117,
NPC_KOR_KRON_AXETHROWER = 36968,
NPC_KOR_KRON_ROCKETEER = 36982,
NPC_KOR_KRON_REAVER = 36957,
NPC_KOR_KRON_SERGEANT = 36960,
NPC_ZAFOD_BOOMBOX = 37184,
NPC_HIGH_CAPTAIN_JUSTIN_BARTLETT = 37182,
NPC_SKY_REAVER_KORM_BLACKSCAR = 37833,
// Deathbringer Saurfang
NPC_DEATHBRINGER_SAURFANG = 37813,
NPC_BLOOD_BEAST = 38508,
@@ -305,6 +333,22 @@ enum GameObjectsIds
GO_ORATORY_OF_THE_DAMNED_ENTRANCE = 201563,
GO_LADY_DEATHWHISPER_ELEVATOR = 202220,
// Icecrown Gunship Battle - Horde raid
GO_ORGRIMS_HAMMER_H = 201812,
GO_THE_SKYBREAKER_H = 201811,
GO_GUNSHIP_ARMORY_H_10N = 202178,
GO_GUNSHIP_ARMORY_H_25N = 202180,
GO_GUNSHIP_ARMORY_H_10H = 202177,
GO_GUNSHIP_ARMORY_H_25H = 202179,
// Icecrown Gunship Battle - Alliance raid
GO_ORGRIMS_HAMMER_A = 201581,
GO_THE_SKYBREAKER_A = 201580,
GO_GUNSHIP_ARMORY_A_10N = 201873,
GO_GUNSHIP_ARMORY_A_25N = 201874,
GO_GUNSHIP_ARMORY_A_10H = 201872,
GO_GUNSHIP_ARMORY_A_25H = 201875,
// Deathbringer Saurfang
GO_SAURFANG_S_DOOR = 201825,
GO_DEATHBRINGER_S_CACHE_10N = 202239,
@@ -408,6 +452,9 @@ enum AchievementCriteriaIds
enum SharedActions
{
// Icecrown Gunship Battle
ACTION_ENEMY_GUNSHIP_TALK = -369390,
// Festergut
ACTION_FESTERGUT_COMBAT = -366260,
ACTION_FESTERGUT_GAS = -366261,
@@ -459,6 +506,7 @@ enum WorldStatesICC
enum AreaIds
{
AREA_ICECROWN_CITADEL = 4812,
AREA_THE_FROZEN_THRONE = 4859
};

View File

@@ -38,7 +38,7 @@ class icecrown_citadel_teleport : public GameObjectScript
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Teleport to the Oratory of the Damned.", GOSSIP_SENDER_ICC_PORT, ORATORY_OF_THE_DAMNED_TELEPORT);
if (instance->GetBossState(DATA_LADY_DEATHWHISPER) == DONE)
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Teleport to the Rampart of Skulls.", GOSSIP_SENDER_ICC_PORT, RAMPART_OF_SKULLS_TELEPORT);
if (instance->GetBossState(DATA_GUNSHIP_EVENT) == DONE)
if (instance->GetBossState(DATA_ICECROWN_GUNSHIP_BATTLE) == DONE)
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Teleport to the Deathbringer's Rise.", GOSSIP_SENDER_ICC_PORT, DEATHBRINGER_S_RISE_TELEPORT);
if (instance->GetData(DATA_COLDFLAME_JETS) == DONE)
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Teleport to the Upper Spire.", GOSSIP_SENDER_ICC_PORT, UPPER_SPIRE_TELEPORT);

View File

@@ -15,20 +15,27 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "ObjectMgr.h"
#include "ScriptMgr.h"
#include "InstanceScript.h"
#include "ScriptedCreature.h"
#include "Map.h"
#include "PoolMgr.h"
#include "AccountMgr.h"
#include "icecrown_citadel.h"
#include "InstanceScript.h"
#include "Map.h"
#include "ObjectMgr.h"
#include "Player.h"
#include "PoolMgr.h"
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "Transport.h"
#include "TransportMgr.h"
#include "WorldPacket.h"
#include "WorldSession.h"
#include "icecrown_citadel.h"
enum EventIds
{
EVENT_PLAYERS_GUNSHIP_SPAWN = 22663,
EVENT_PLAYERS_GUNSHIP_COMBAT = 22664,
EVENT_PLAYERS_GUNSHIP_SAURFANG = 22665,
EVENT_ENEMY_GUNSHIP_COMBAT = 22860,
EVENT_ENEMY_GUNSHIP_DESPAWN = 22861,
EVENT_QUAKE = 23437,
EVENT_SECOND_REMORSELESS_WINTER = 23507,
EVENT_TELEPORT_TO_FROSTMOURNE = 23617
@@ -39,6 +46,7 @@ enum TimedEvents
EVENT_UPDATE_EXECUTION_TIME = 1,
EVENT_QUAKE_SHATTER = 2,
EVENT_REBUILD_PLATFORM = 3,
EVENT_RESPAWN_GUNSHIP = 4
};
DoorData const doorData[] =
@@ -106,6 +114,9 @@ class instance_icecrown_citadel : public InstanceMapScript
TeamInInstance = 0;
HeroicAttempts = MaxHeroicAttempts;
LadyDeathwisperElevatorGUID = 0;
GunshipGUID = 0;
EnemyGunshipGUID = 0;
GunshipArmoryGUID = 0;
DeathbringerSaurfangGUID = 0;
DeathbringerSaurfangDoorGUID = 0;
DeathbringerSaurfangEventGUID = 0;
@@ -164,6 +175,9 @@ class instance_icecrown_citadel : public InstanceMapScript
{
if (!TeamInInstance)
TeamInInstance = player->GetTeam();
if (GetBossState(DATA_LADY_DEATHWHISPER) == DONE && GetBossState(DATA_ICECROWN_GUNSHIP_BATTLE) != DONE)
SpawnGunship();
}
void OnCreatureCreate(Creature* creature) OVERRIDE
@@ -217,6 +231,10 @@ class instance_icecrown_citadel : public InstanceMapScript
case NPC_DEATHBRINGER_SAURFANG:
DeathbringerSaurfangGUID = creature->GetGUID();
break;
case NPC_ALLIANCE_GUNSHIP_CANNON:
case NPC_HORDE_GUNSHIP_CANNON:
creature->SetControlled(true, UNIT_STATE_ROOT);
break;
case NPC_SE_HIGH_OVERLORD_SAURFANG:
if (TeamInInstance == ALLIANCE)
creature->UpdateEntry(NPC_SE_MURADIN_BRONZEBEARD, ALLIANCE, creature->GetCreatureData());
@@ -341,6 +359,54 @@ class instance_icecrown_citadel : public InstanceMapScript
}
break;
}
case NPC_HORDE_GUNSHIP_CANNON:
case NPC_ORGRIMS_HAMMER_CREW:
case NPC_SKY_REAVER_KORM_BLACKSCAR:
if (TeamInInstance == ALLIANCE)
return 0;
break;
case NPC_ALLIANCE_GUNSHIP_CANNON:
case NPC_SKYBREAKER_DECKHAND:
case NPC_HIGH_CAPTAIN_JUSTIN_BARTLETT:
if (TeamInInstance == HORDE)
return 0;
break;
case NPC_ZAFOD_BOOMBOX:
if (GameObjectTemplate const* go = sObjectMgr->GetGameObjectTemplate(GO_THE_SKYBREAKER_A))
if ((TeamInInstance == ALLIANCE && data->mapid == go->moTransport.mapID) ||
(TeamInInstance == HORDE && data->mapid != go->moTransport.mapID))
return entry;
return 0;
case NPC_IGB_MURADIN_BRONZEBEARD:
if ((TeamInInstance == ALLIANCE && data->posX > 10.0f) ||
(TeamInInstance == HORDE && data->posX < 10.0f))
return entry;
return 0;
default:
break;
}
return entry;
}
uint32 GetGameObjectEntry(uint32 /*guidLow*/, uint32 entry) OVERRIDE
{
switch (entry)
{
case GO_GUNSHIP_ARMORY_H_10N:
case GO_GUNSHIP_ARMORY_H_25N:
case GO_GUNSHIP_ARMORY_H_10H:
case GO_GUNSHIP_ARMORY_H_25H:
if (TeamInInstance == ALLIANCE)
return 0;
break;
case GO_GUNSHIP_ARMORY_A_10N:
case GO_GUNSHIP_ARMORY_A_25N:
case GO_GUNSHIP_ARMORY_A_10H:
case GO_GUNSHIP_ARMORY_A_25H:
if (TeamInInstance == HORDE)
return 0;
break;
default:
break;
}
@@ -446,6 +512,20 @@ class instance_icecrown_citadel : public InstanceMapScript
go->SetGoState(GO_STATE_READY);
}
break;
case GO_THE_SKYBREAKER_H:
case GO_ORGRIMS_HAMMER_A:
EnemyGunshipGUID = go->GetGUID();
break;
case GO_GUNSHIP_ARMORY_H_10N:
case GO_GUNSHIP_ARMORY_H_25N:
case GO_GUNSHIP_ARMORY_H_10H:
case GO_GUNSHIP_ARMORY_H_25H:
case GO_GUNSHIP_ARMORY_A_10N:
case GO_GUNSHIP_ARMORY_A_25N:
case GO_GUNSHIP_ARMORY_A_10H:
case GO_GUNSHIP_ARMORY_A_25H:
GunshipArmoryGUID = go->GetGUID();
break;
case GO_SAURFANG_S_DOOR:
DeathbringerSaurfangDoorGUID = go->GetGUID();
AddDoor(go, true);
@@ -587,6 +667,10 @@ class instance_icecrown_citadel : public InstanceMapScript
case GO_ICE_WALL:
AddDoor(go, false);
break;
case GO_THE_SKYBREAKER_A:
case GO_ORGRIMS_HAMMER_H:
GunshipGUID = 0;
break;
default:
break;
}
@@ -621,6 +705,10 @@ class instance_icecrown_citadel : public InstanceMapScript
{
switch (type)
{
case DATA_ICECROWN_GUNSHIP_BATTLE:
return GunshipGUID;
case DATA_ENEMY_GUNSHIP:
return EnemyGunshipGUID;
case DATA_DEATHBRINGER_SAURFANG:
return DeathbringerSaurfangGUID;
case DATA_SAURFANG_EVENT_NPC:
@@ -691,7 +779,7 @@ class instance_icecrown_citadel : public InstanceMapScript
switch (type)
{
case DATA_LADY_DEATHWHISPER:
SetBossState(DATA_GUNSHIP_EVENT, state); // TEMP HACK UNTIL GUNSHIP SCRIPTED
{
if (state == DONE)
{
if (GameObject* elevator = instance->GetGameObject(LadyDeathwisperElevatorGUID))
@@ -699,8 +787,20 @@ class instance_icecrown_citadel : public InstanceMapScript
elevator->SetUInt32Value(GAMEOBJECT_LEVEL, 0);
elevator->SetGoState(GO_STATE_READY);
}
SpawnGunship();
}
break;
}
case DATA_ICECROWN_GUNSHIP_BATTLE:
if (state == DONE)
{
if (GameObject* loot = instance->GetGameObject(GunshipArmoryGUID))
loot->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED | GO_FLAG_NOT_SELECTABLE | GO_FLAG_NODESPAWN);
}
else if (state == FAIL)
Events.ScheduleEvent(EVENT_RESPAWN_GUNSHIP, 30000);
break;
case DATA_DEATHBRINGER_SAURFANG:
switch (state)
{
@@ -846,6 +946,17 @@ class instance_icecrown_citadel : public InstanceMapScript
return true;
}
void SpawnGunship()
{
if (!GunshipGUID)
{
SetBossState(DATA_ICECROWN_GUNSHIP_BATTLE, NOT_STARTED);
uint32 gunshipEntry = TeamInInstance == HORDE ? GO_ORGRIMS_HAMMER_H : GO_THE_SKYBREAKER_A;
if (Transport* gunship = sTransportMgr->CreateTransport(gunshipEntry, 0, instance))
GunshipGUID = gunship->GetGUID();
}
}
void SetData(uint32 type, uint32 data) OVERRIDE
{
switch (type)
@@ -1066,10 +1177,10 @@ class instance_icecrown_citadel : public InstanceMapScript
return false;
// no break
case DATA_DEATHBRINGER_SAURFANG:
if (GetBossState(DATA_GUNSHIP_EVENT) != DONE)
if (GetBossState(DATA_ICECROWN_GUNSHIP_BATTLE) != DONE)
return false;
// no break
case DATA_GUNSHIP_EVENT:
case DATA_ICECROWN_GUNSHIP_BATTLE:
if (GetBossState(DATA_LADY_DEATHWHISPER) != DONE)
return false;
// no break
@@ -1163,7 +1274,7 @@ class instance_icecrown_citadel : public InstanceMapScript
void Update(uint32 diff) OVERRIDE
{
if (BloodQuickeningState != IN_PROGRESS && GetBossState(DATA_THE_LICH_KING) != IN_PROGRESS)
if (BloodQuickeningState != IN_PROGRESS && GetBossState(DATA_THE_LICH_KING) != IN_PROGRESS && GetBossState(DATA_ICECROWN_GUNSHIP_BATTLE) != FAIL)
return;
Events.Update(diff);
@@ -1213,16 +1324,34 @@ class instance_icecrown_citadel : public InstanceMapScript
if (GameObject* wind = instance->GetGameObject(FrozenThroneWindGUID))
wind->SetGoState(GO_STATE_ACTIVE);
break;
case EVENT_RESPAWN_GUNSHIP:
SpawnGunship();
break;
default:
break;
}
}
}
void ProcessEvent(WorldObject* /*source*/, uint32 eventId) OVERRIDE
void ProcessEvent(WorldObject* source, uint32 eventId) OVERRIDE
{
switch (eventId)
{
case EVENT_ENEMY_GUNSHIP_DESPAWN:
if (GetBossState(DATA_ICECROWN_GUNSHIP_BATTLE) == DONE)
source->AddObjectToRemoveList();
break;
case EVENT_ENEMY_GUNSHIP_COMBAT:
if (Creature* captain = source->FindNearestCreature(TeamInInstance == HORDE ? NPC_IGB_HIGH_OVERLORD_SAURFANG : NPC_IGB_MURADIN_BRONZEBEARD, 100.0f))
captain->AI()->DoAction(ACTION_ENEMY_GUNSHIP_TALK);
// no break;
case EVENT_PLAYERS_GUNSHIP_SPAWN:
case EVENT_PLAYERS_GUNSHIP_COMBAT:
case EVENT_PLAYERS_GUNSHIP_SAURFANG:
if (GameObject* go = source->ToGameObject())
if (Transport* transport = go->ToTransport())
transport->EnableMovement(false);
break;
case EVENT_QUAKE:
if (GameObject* warning = instance->GetGameObject(FrozenThroneWarningGUID))
warning->SetGoState(GO_STATE_ACTIVE);
@@ -1261,6 +1390,9 @@ class instance_icecrown_citadel : public InstanceMapScript
protected:
EventMap Events;
uint64 LadyDeathwisperElevatorGUID;
uint64 GunshipGUID;
uint64 EnemyGunshipGUID;
uint64 GunshipArmoryGUID;
uint64 DeathbringerSaurfangGUID;
uint64 DeathbringerSaurfangDoorGUID;
uint64 DeathbringerSaurfangEventGUID; // Muradin Bronzebeard or High Overlord Saurfang

View File

@@ -792,37 +792,6 @@ class spell_veranus_summon : public SpellScriptLoader
}
};
/*#####
# spell_jokkum_eject_all
#####*/
class spell_jokkum_eject_all : public SpellScriptLoader
{
public: spell_jokkum_eject_all() : SpellScriptLoader("spell_jokkum_eject_all") { }
class spell_jokkum_eject_all_SpellScript : public SpellScript
{
PrepareSpellScript(spell_jokkum_eject_all_SpellScript);
void HandleScriptEffect(SpellEffIndex /* effIndex */)
{
if (Unit* caster = GetCaster())
if (caster->IsVehicle())
caster->GetVehicleKit()->RemoveAllPassengers();
}
void Register() OVERRIDE
{
OnEffectHitTarget += SpellEffectFn(spell_jokkum_eject_all_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
}
};
SpellScript* GetSpellScript() const OVERRIDE
{
return new spell_jokkum_eject_all_SpellScript();
}
};
enum CloseRift
{
SPELL_DESPAWN_RIFT = 61665
@@ -882,6 +851,5 @@ void AddSC_storm_peaks()
new npc_king_jokkum_vehicle();
new spell_jokkum_scriptcast();
new spell_veranus_summon();
new spell_jokkum_eject_all();
new spell_close_rift();
}

View File

@@ -36,6 +36,7 @@
#include "SkillDiscovery.h"
#include "SpellScript.h"
#include "SpellAuraEffects.h"
#include "Vehicle.h"
class spell_gen_absorb0_hitlimit1 : public SpellScriptLoader
{
@@ -3673,6 +3674,33 @@ class spell_gen_whisper_gulch_yogg_saron_whisper : public SpellScriptLoader
}
};
class spell_gen_eject_all_passengers : public SpellScriptLoader
{
public:
spell_gen_eject_all_passengers() : SpellScriptLoader("spell_gen_eject_all_passengers") { }
class spell_gen_eject_all_passengers_SpellScript : public SpellScript
{
PrepareSpellScript(spell_gen_eject_all_passengers_SpellScript);
void RemoveVehicleAuras()
{
if (Vehicle* vehicle = GetHitUnit()->GetVehicleKit())
vehicle->RemoveAllPassengers();
}
void Register() OVERRIDE
{
AfterHit += SpellHitFn(spell_gen_eject_all_passengers_SpellScript::RemoveVehicleAuras);
}
};
SpellScript* GetSpellScript() const OVERRIDE
{
return new spell_gen_eject_all_passengers_SpellScript();
}
};
void AddSC_generic_spell_scripts()
{
new spell_gen_absorb0_hitlimit1();
@@ -3754,4 +3782,5 @@ void AddSC_generic_spell_scripts()
new spell_gen_vendor_bark_trigger();
new spell_gen_wg_water();
new spell_gen_whisper_gulch_yogg_saron_whisper();
new spell_gen_eject_all_passengers();
}