aboutsummaryrefslogtreecommitdiff
path: root/src/server/scripts
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/scripts')
-rw-r--r--src/server/scripts/CMakeLists.txt2
-rw-r--r--src/server/scripts/Commands/cs_character.cpp4
-rw-r--r--src/server/scripts/Commands/cs_cheat.cpp13
-rw-r--r--src/server/scripts/Commands/cs_debug.cpp45
-rw-r--r--src/server/scripts/Commands/cs_gm.cpp9
-rw-r--r--src/server/scripts/Commands/cs_go.cpp2
-rw-r--r--src/server/scripts/Commands/cs_gobject.cpp4
-rw-r--r--src/server/scripts/Commands/cs_guild.cpp1
-rw-r--r--src/server/scripts/Commands/cs_learn.cpp25
-rw-r--r--src/server/scripts/Commands/cs_list.cpp2
-rw-r--r--src/server/scripts/Commands/cs_lookup.cpp465
-rw-r--r--src/server/scripts/Commands/cs_misc.cpp23
-rw-r--r--src/server/scripts/Commands/cs_modify.cpp110
-rw-r--r--src/server/scripts/Commands/cs_npc.cpp14
-rw-r--r--src/server/scripts/Commands/cs_reload.cpp178
-rw-r--r--src/server/scripts/Commands/cs_reset.cpp7
-rw-r--r--src/server/scripts/Commands/cs_titles.cpp6
-rw-r--r--src/server/scripts/Commands/cs_wp.cpp64
-rw-r--r--src/server/scripts/EasternKingdoms/BaradinHold/baradin_hold.h47
-rw-r--r--src/server/scripts/EasternKingdoms/BaradinHold/boss_alizabal.cpp271
-rw-r--r--src/server/scripts/EasternKingdoms/BaradinHold/instance_baradin_hold.cpp171
-rw-r--r--src/server/scripts/EasternKingdoms/BlackwingLair/boss_nefarian.cpp3
-rw-r--r--src/server/scripts/EasternKingdoms/CMakeLists.txt23
-rw-r--r--src/server/scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp1
-rw-r--r--src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/ScarletEnclave/zone_the_scarlet_enclave.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp388
-rw-r--r--src/server/scripts/EasternKingdoms/ZulAman/boss_daakara.cpp113
-rw-r--r--src/server/scripts/EasternKingdoms/ZulAman/boss_halazzi.cpp379
-rw-r--r--src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp910
-rw-r--r--src/server/scripts/EasternKingdoms/ZulAman/boss_janalai.cpp661
-rw-r--r--src/server/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp426
-rw-r--r--src/server/scripts/EasternKingdoms/ZulAman/boss_zuljin.cpp604
-rw-r--r--src/server/scripts/EasternKingdoms/ZulAman/instance_zulaman.cpp509
-rw-r--r--src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp523
-rw-r--r--src/server/scripts/EasternKingdoms/ZulAman/zulaman.h87
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp455
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/boss_grilek.cpp54
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/boss_hakkar.cpp180
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/boss_hazzarah.cpp59
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/boss_jeklik.cpp298
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo.cpp288
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo_the_godbreaker.cpp108
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/boss_kilnara.cpp (renamed from src/server/scripts/EasternKingdoms/ZulGurub/boss_gahzranka.cpp)71
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp813
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp266
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/boss_renataki.cpp125
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/boss_thekal.cpp571
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/boss_venoxis.cpp212
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/boss_wushoolay.cpp44
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/boss_zanzil.cpp109
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp223
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h88
-rw-r--r--src/server/scripts/EasternKingdoms/boss_kruul.cpp163
-rw-r--r--src/server/scripts/EasternKingdoms/zone_arathi_highlands.cpp63
-rw-r--r--src/server/scripts/EasternKingdoms/zone_burning_steppes.cpp129
-rw-r--r--src/server/scripts/EasternKingdoms/zone_ghostlands.cpp45
-rw-r--r--src/server/scripts/EasternKingdoms/zone_hinterlands.cpp202
-rw-r--r--src/server/scripts/EasternKingdoms/zone_ironforge.cpp67
-rw-r--r--src/server/scripts/EasternKingdoms/zone_loch_modan.cpp74
-rw-r--r--src/server/scripts/EasternKingdoms/zone_redridge_mountains.cpp146
-rw-r--r--src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp185
-rw-r--r--src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp626
-rw-r--r--src/server/scripts/EasternKingdoms/zone_swamp_of_sorrows.cpp134
-rw-r--r--src/server/scripts/EasternKingdoms/zone_tirisfal_glades.cpp196
-rw-r--r--src/server/scripts/Kalimdor/CMakeLists.txt8
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/instance_hyjal.cpp4
-rw-r--r--src/server/scripts/Kalimdor/Firelands/boss_alysrazor.cpp704
-rw-r--r--src/server/scripts/Kalimdor/Firelands/firelands.h74
-rw-r--r--src/server/scripts/Kalimdor/Firelands/instance_firelands.cpp59
-rw-r--r--src/server/scripts/Kalimdor/HallsOfOrigination/boss_anraphet.cpp571
-rw-r--r--src/server/scripts/Kalimdor/HallsOfOrigination/boss_earthrager_ptah.cpp346
-rw-r--r--src/server/scripts/Kalimdor/HallsOfOrigination/boss_temple_guardian_anhuur.cpp404
-rw-r--r--src/server/scripts/Kalimdor/HallsOfOrigination/halls_of_origination.h126
-rw-r--r--src/server/scripts/Kalimdor/HallsOfOrigination/instance_halls_of_origination.cpp282
-rw-r--r--src/server/scripts/Kalimdor/zone_azshara.cpp519
-rw-r--r--src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp4
-rw-r--r--src/server/scripts/Kalimdor/zone_darkshore.cpp373
-rw-r--r--src/server/scripts/Kalimdor/zone_desolace.cpp104
-rw-r--r--src/server/scripts/Kalimdor/zone_durotar.cpp450
-rw-r--r--src/server/scripts/Kalimdor/zone_dustwallow_marsh.cpp15
-rw-r--r--src/server/scripts/Kalimdor/zone_felwood.cpp72
-rw-r--r--src/server/scripts/Kalimdor/zone_feralas.cpp232
-rw-r--r--src/server/scripts/Kalimdor/zone_moonglade.cpp10
-rw-r--r--src/server/scripts/Kalimdor/zone_mulgore.cpp122
-rw-r--r--src/server/scripts/Kalimdor/zone_orgrimmar.cpp222
-rw-r--r--src/server/scripts/Kalimdor/zone_silithus.cpp8
-rw-r--r--src/server/scripts/Kalimdor/zone_stonetalon_mountains.cpp158
-rw-r--r--src/server/scripts/Kalimdor/zone_tanaris.cpp107
-rw-r--r--src/server/scripts/Kalimdor/zone_the_barrens.cpp12
-rw-r--r--src/server/scripts/Kalimdor/zone_thousand_needles.cpp442
-rw-r--r--src/server/scripts/Kalimdor/zone_thunder_bluff.cpp24
-rw-r--r--src/server/scripts/Kalimdor/zone_ungoro_crater.cpp327
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_elder_nadox.cpp4
-rw-r--r--src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp1
-rw-r--r--src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_grand_champions.cpp16
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp2
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp24
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp2
-rw-r--r--src/server/scripts/Northrend/zone_dalaran.cpp45
-rw-r--r--src/server/scripts/OutdoorPvP/CMakeLists.txt2
-rw-r--r--src/server/scripts/OutdoorPvP/OutdoorPvPEP.cpp785
-rw-r--r--src/server/scripts/OutdoorPvP/OutdoorPvPEP.h331
-rw-r--r--src/server/scripts/Spells/spell_dk.cpp4
-rw-r--r--src/server/scripts/Spells/spell_druid.cpp126
-rw-r--r--src/server/scripts/Spells/spell_generic.cpp425
-rw-r--r--src/server/scripts/Spells/spell_hunter.cpp40
-rw-r--r--src/server/scripts/Spells/spell_mage.cpp769
-rw-r--r--src/server/scripts/Spells/spell_paladin.cpp120
-rw-r--r--src/server/scripts/Spells/spell_pet.cpp18
-rw-r--r--src/server/scripts/Spells/spell_priest.cpp174
-rw-r--r--src/server/scripts/Spells/spell_rogue.cpp76
-rw-r--r--src/server/scripts/Spells/spell_shaman.cpp470
-rw-r--r--src/server/scripts/Spells/spell_warlock.cpp240
-rw-r--r--src/server/scripts/Spells/spell_warrior.cpp136
-rw-r--r--src/server/scripts/World/item_scripts.cpp12
-rw-r--r--src/server/scripts/World/npc_professions.cpp8
-rw-r--r--src/server/scripts/World/npcs_special.cpp14
118 files changed, 7274 insertions, 14437 deletions
diff --git a/src/server/scripts/CMakeLists.txt b/src/server/scripts/CMakeLists.txt
index cf4618022b3..12e68fc5831 100644
--- a/src/server/scripts/CMakeLists.txt
+++ b/src/server/scripts/CMakeLists.txt
@@ -72,7 +72,6 @@ include_directories(
${CMAKE_SOURCE_DIR}/src/server/game/Addons
${CMAKE_SOURCE_DIR}/src/server/game/AI
${CMAKE_SOURCE_DIR}/src/server/game/AI/CoreAI
- ${CMAKE_SOURCE_DIR}/src/server/game/AI/EventAI
${CMAKE_SOURCE_DIR}/src/server/game/AI/ScriptedAI
${CMAKE_SOURCE_DIR}/src/server/game/AI/SmartScripts
${CMAKE_SOURCE_DIR}/src/server/game/AuctionHouse
@@ -88,6 +87,7 @@ include_directories(
${CMAKE_SOURCE_DIR}/src/server/game/Combat
${CMAKE_SOURCE_DIR}/src/server/game/DataStores
${CMAKE_SOURCE_DIR}/src/server/game/DungeonFinding
+ ${CMAKE_SOURCE_DIR}/src/server/game/Entities/AreaTrigger
${CMAKE_SOURCE_DIR}/src/server/game/Entities/Corpse
${CMAKE_SOURCE_DIR}/src/server/game/Entities/Creature
${CMAKE_SOURCE_DIR}/src/server/game/Entities/DynamicObject
diff --git a/src/server/scripts/Commands/cs_character.cpp b/src/server/scripts/Commands/cs_character.cpp
index e51052bc18f..2b316803029 100644
--- a/src/server/scripts/Commands/cs_character.cpp
+++ b/src/server/scripts/Commands/cs_character.cpp
@@ -277,7 +277,7 @@ public:
if (titleInfo && target->HasTitle(titleInfo))
{
- std::string name = titleInfo->name[loc];
+ std::string name = titleInfo->name;
if (name.empty())
continue;
@@ -566,7 +566,7 @@ public:
{
FactionState const& faction = itr->second;
FactionEntry const* factionEntry = sFactionStore.LookupEntry(faction.ID);
- char const* factionName = factionEntry ? factionEntry->name[loc] : "#Not found#";
+ char const* factionName = factionEntry ? factionEntry->name : "#Not found#";
ReputationRank rank = target->GetReputationMgr().GetRank(factionEntry);
std::string rankName = handler->GetTrinityString(ReputationRankStrIndex[rank]);
std::ostringstream ss;
diff --git a/src/server/scripts/Commands/cs_cheat.cpp b/src/server/scripts/Commands/cs_cheat.cpp
index 9dbc9900e58..a5199ce75b4 100644
--- a/src/server/scripts/Commands/cs_cheat.cpp
+++ b/src/server/scripts/Commands/cs_cheat.cpp
@@ -185,10 +185,11 @@ public:
std::string argstr = (char*)args;
+ Player* target = handler->GetSession()->GetPlayer();
if (!*args)
{
- argstr = (handler->GetSession()->GetPlayer()->GetCommandStatus(CHEAT_WATERWALK)) ? "off" : "on";
- if (handler->GetSession()->GetPlayer()->GetCommandStatus(CHEAT_WATERWALK))
+ argstr = (target->GetCommandStatus(CHEAT_WATERWALK)) ? "off" : "on";
+ if (target->GetCommandStatus(CHEAT_WATERWALK))
argstr = "off";
else
argstr = "on";
@@ -196,15 +197,15 @@ public:
if (argstr == "off")
{
- handler->GetSession()->GetPlayer()->SetCommandStatusOff(CHEAT_WATERWALK);
- handler->GetSession()->GetPlayer()->SetMovement(MOVE_LAND_WALK); // OFF
+ target->SetCommandStatusOff(CHEAT_WATERWALK);
+ target->SetWaterWalking(false);
handler->SendSysMessage("Waterwalking is OFF. You can't walk on water.");
return true;
}
else if (argstr == "on")
{
- handler->GetSession()->GetPlayer()->SetCommandStatusOn(CHEAT_WATERWALK);
- handler->GetSession()->GetPlayer()->SetMovement(MOVE_WATER_WALK); // ON
+ target->SetCommandStatusOn(CHEAT_WATERWALK);
+ target->SetWaterWalking(true);
handler->SendSysMessage("Waterwalking is ON. You can walk on water.");
return true;
}
diff --git a/src/server/scripts/Commands/cs_debug.cpp b/src/server/scripts/Commands/cs_debug.cpp
index 6cf27991375..3602cb1b6ee 100644
--- a/src/server/scripts/Commands/cs_debug.cpp
+++ b/src/server/scripts/Commands/cs_debug.cpp
@@ -91,6 +91,7 @@ public:
{ "areatriggers", SEC_ADMINISTRATOR, false, &HandleDebugAreaTriggersCommand, "", NULL },
{ "los", SEC_MODERATOR, false, &HandleDebugLoSCommand, "", NULL },
{ "moveflags", SEC_ADMINISTRATOR, false, &HandleDebugMoveflagsCommand, "", NULL },
+ { "phase", SEC_MODERATOR, false, &HandleDebugPhaseCommand, "", NULL },
{ NULL, SEC_PLAYER, false, NULL, "", NULL }
};
static ChatCommand commandTable[] =
@@ -237,7 +238,7 @@ public:
return false;
SellResult msg = SellResult(atoi(args));
- handler->GetSession()->GetPlayer()->SendSellError(msg, 0, 0, 0);
+ handler->GetSession()->GetPlayer()->SendSellError(msg, 0, 0);
return true;
}
@@ -311,7 +312,7 @@ public:
uint32 opcode;
parsedStream >> opcode;
- WorldPacket data(opcode, 0);
+ WorldPacket data(Opcodes(opcode), 0);
while (!parsedStream.eof())
{
@@ -417,7 +418,7 @@ public:
}
TC_LOG_DEBUG(LOG_FILTER_NETWORKIO, "Sending opcode %u", data.GetOpcode());
data.hexlike();
- player->GetSession()->SendPacket(&data);
+ player->GetSession()->SendPacket(&data, true);
handler->PSendSysMessage(LANG_COMMAND_OPCODESENT, data.GetOpcode(), unit->GetName().c_str());
return true;
}
@@ -951,8 +952,21 @@ public:
if (!*args)
return false;
- uint32 PhaseShift = atoi(args);
- handler->GetSession()->SendSetPhaseShift(PhaseShift);
+ char* t = strtok((char*)args, " ");
+ char* p = strtok(NULL, " ");
+
+ if (!t)
+ return false;
+
+ std::set<uint32> terrainswap;
+ std::set<uint32> phaseId;
+
+ terrainswap.insert((uint32)atoi(t));
+
+ if (p)
+ phaseId.insert((uint32)atoi(p));
+
+ handler->GetSession()->SendSetPhaseShift(phaseId, terrainswap);
return true;
}
@@ -1317,7 +1331,15 @@ public:
target->SetExtraUnitMovementFlags(moveFlagsExtra);
}
- target->SendMovementFlagUpdate();
+ if (target->GetTypeId() != TYPEID_PLAYER)
+ target->DestroyForNearbyPlayers(); // Force new SMSG_UPDATE_OBJECT:CreateObject
+ else
+ {
+ WorldPacket data(SMSG_PLAYER_MOVE);
+ target->WriteMovementInfo(data);
+ target->SendMessageToSet(&data, true);
+ }
+
handler->PSendSysMessage(LANG_MOVEFLAGS_SET, target->GetUnitMovementFlags(), target->GetExtraUnitMovementFlags());
}
@@ -1333,6 +1355,17 @@ public:
handler->PSendSysMessage("Waypoint SQL written to SQL Developer log");
return true;
}
+
+ static bool HandleDebugPhaseCommand(ChatHandler* handler, char const* /*args*/)
+ {
+ Unit* unit = handler->getSelectedUnit();
+ Player* player = handler->GetSession()->GetPlayer();
+ if (unit && unit->GetTypeId() == TYPEID_PLAYER)
+ player = unit->ToPlayer();
+
+ player->GetPhaseMgr().SendDebugReportToPlayer(handler->GetSession()->GetPlayer());
+ return true;
+ }
};
void AddSC_debug_commandscript()
diff --git a/src/server/scripts/Commands/cs_gm.cpp b/src/server/scripts/Commands/cs_gm.cpp
index 9c8c1b93f74..f837680d570 100644
--- a/src/server/scripts/Commands/cs_gm.cpp
+++ b/src/server/scripts/Commands/cs_gm.cpp
@@ -101,19 +101,16 @@ public:
if (!target)
target = handler->GetSession()->GetPlayer();
- WorldPacket data(12);
+ WorldPacket data;
if (strncmp(args, "on", 3) == 0)
- data.SetOpcode(SMSG_MOVE_SET_CAN_FLY);
+ target->SetCanFly(true);
else if (strncmp(args, "off", 4) == 0)
- data.SetOpcode(SMSG_MOVE_UNSET_CAN_FLY);
+ target->SetCanFly(false);
else
{
handler->SendSysMessage(LANG_USE_BOL);
return false;
}
- data.append(target->GetPackGUID());
- data << uint32(0); // unknown
- target->SendMessageToSet(&data, true);
handler->PSendSysMessage(LANG_COMMAND_FLYMODE_STATUS, handler->GetNameLink(target).c_str(), args);
return true;
}
diff --git a/src/server/scripts/Commands/cs_go.cpp b/src/server/scripts/Commands/cs_go.cpp
index d911d123ec2..8d1db74607f 100644
--- a/src/server/scripts/Commands/cs_go.cpp
+++ b/src/server/scripts/Commands/cs_go.cpp
@@ -446,7 +446,7 @@ public:
if (map->Instanceable())
{
- handler->PSendSysMessage(LANG_INVALID_ZONE_MAP, areaEntry->ID, areaEntry->area_name[handler->GetSessionDbcLocale()], map->GetId(), map->GetMapName());
+ handler->PSendSysMessage(LANG_INVALID_ZONE_MAP, areaEntry->ID, areaEntry->area_name, map->GetId(), map->GetMapName());
handler->SetSentErrorMessage(true);
return false;
}
diff --git a/src/server/scripts/Commands/cs_gobject.cpp b/src/server/scripts/Commands/cs_gobject.cpp
index 18dee2ea324..e20c4a70417 100644
--- a/src/server/scripts/Commands/cs_gobject.cpp
+++ b/src/server/scripts/Commands/cs_gobject.cpp
@@ -152,7 +152,7 @@ public:
GameObject* object = new GameObject;
uint32 guidLow = sObjectMgr->GenerateLowGuid(HIGHGUID_GAMEOBJECT);
- if (!object->Create(guidLow, objectInfo->entry, map, player->GetPhaseMaskForSpawn(), x, y, z, o, 0.0f, 0.0f, 0.0f, 0.0f, 0, GO_STATE_READY))
+ if (!object->Create(guidLow, objectInfo->entry, map, player->GetPhaseMgr().GetPhaseMaskForSpawn(), x, y, z, o, 0.0f, 0.0f, 0.0f, 0.0f, 0, GO_STATE_READY))
{
delete object;
return false;
@@ -165,7 +165,7 @@ public:
}
// fill the gameobject data and save to the db
- object->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), player->GetPhaseMaskForSpawn());
+ object->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), player->GetPhaseMgr().GetPhaseMaskForSpawn());
// this will generate a new guid if the object is in an instance
if (!object->LoadGameObjectFromDB(guidLow, map))
diff --git a/src/server/scripts/Commands/cs_guild.cpp b/src/server/scripts/Commands/cs_guild.cpp
index 9d2214c82e9..ffaf1360ad5 100644
--- a/src/server/scripts/Commands/cs_guild.cpp
+++ b/src/server/scripts/Commands/cs_guild.cpp
@@ -22,6 +22,7 @@ Comment: All guild related commands
Category: commandscripts
EndScriptData */
+#include "AchievementMgr.h"
#include "Chat.h"
#include "Language.h"
#include "Guild.h"
diff --git a/src/server/scripts/Commands/cs_learn.cpp b/src/server/scripts/Commands/cs_learn.cpp
index 4c01b89a3ae..c1bbfd8affb 100644
--- a/src/server/scripts/Commands/cs_learn.cpp
+++ b/src/server/scripts/Commands/cs_learn.cpp
@@ -397,33 +397,14 @@ public:
!skillInfo->canLink) // only prof with recipes have set
continue;
- int locale = handler->GetSessionDbcLocale();
- name = skillInfo->name[locale];
+ name = skillInfo->name;
if (name.empty())
continue;
if (!Utf8FitTo(name, namePart))
- {
- locale = 0;
- for (; locale < TOTAL_LOCALES; ++locale)
- {
- if (locale == handler->GetSessionDbcLocale())
- continue;
-
- name = skillInfo->name[locale];
- if (name.empty())
- continue;
-
- if (Utf8FitTo(name, namePart))
- break;
- }
- }
+ continue;
- if (locale < TOTAL_LOCALES)
- {
- targetSkillInfo = skillInfo;
- break;
- }
+ targetSkillInfo = skillInfo;
}
if (!targetSkillInfo)
diff --git a/src/server/scripts/Commands/cs_list.cpp b/src/server/scripts/Commands/cs_list.cpp
index 6b8ce7732c5..364746adae9 100644
--- a/src/server/scripts/Commands/cs_list.cpp
+++ b/src/server/scripts/Commands/cs_list.cpp
@@ -439,7 +439,7 @@ public:
AuraApplication const* aurApp = itr->second;
Aura const* aura = aurApp->GetBase();
- char const* name = aura->GetSpellInfo()->SpellName[handler->GetSessionDbcLocale()];
+ char const* name = aura->GetSpellInfo()->SpellName;
std::ostringstream ss_name;
ss_name << "|cffffffff|Hspell:" << aura->GetId() << "|h[" << name << "]|h|r";
diff --git a/src/server/scripts/Commands/cs_lookup.cpp b/src/server/scripts/Commands/cs_lookup.cpp
index b014eb895be..ff5ece84272 100644
--- a/src/server/scripts/Commands/cs_lookup.cpp
+++ b/src/server/scripts/Commands/cs_lookup.cpp
@@ -106,48 +106,30 @@ public:
AreaTableEntry const* areaEntry = sAreaStore.LookupEntry(areaflag);
if (areaEntry)
{
- int locale = handler->GetSessionDbcLocale();
- std::string name = areaEntry->area_name[locale];
+ std::string name = areaEntry->area_name;
if (name.empty())
continue;
if (!Utf8FitTo(name, wNamePart))
- {
- locale = 0;
- for (; locale < TOTAL_LOCALES; ++locale)
- {
- if (locale == handler->GetSessionDbcLocale())
- continue;
-
- name = areaEntry->area_name[locale];
- if (name.empty())
- continue;
-
- if (Utf8FitTo(name, wNamePart))
- break;
- }
- }
+ continue;
- if (locale < TOTAL_LOCALES)
+ if (maxResults && count++ == maxResults)
{
- if (maxResults && count++ == maxResults)
- {
- handler->PSendSysMessage(LANG_COMMAND_LOOKUP_MAX_RESULTS, maxResults);
- return true;
- }
+ handler->PSendSysMessage(LANG_COMMAND_LOOKUP_MAX_RESULTS, maxResults);
+ return true;
+ }
- // send area in "id - [name]" format
- std::ostringstream ss;
- if (handler->GetSession())
- ss << areaEntry->ID << " - |cffffffff|Harea:" << areaEntry->ID << "|h[" << name << ' ' << localeNames[locale]<< "]|h|r";
- else
- ss << areaEntry->ID << " - " << name << ' ' << localeNames[locale];
+ // send area in "id - [name]" format
+ std::ostringstream ss;
+ if (handler->GetSession())
+ ss << areaEntry->ID << " - |cffffffff|Harea:" << areaEntry->ID << "|h[" << name<< "]|h|r";
+ else
+ ss << areaEntry->ID << " - " << name;
- handler->SendSysMessage(ss.str().c_str());
+ handler->SendSysMessage(ss.str().c_str());
- if (!found)
- found = true;
- }
+ if (!found)
+ found = true;
}
}
@@ -313,77 +295,58 @@ public:
for (uint32 id = 0; id < sFactionStore.GetNumRows(); ++id)
{
- FactionEntry const* factionEntry = sFactionStore.LookupEntry(id);
- if (factionEntry)
+ if (FactionEntry const* factionEntry = sFactionStore.LookupEntry(id))
{
FactionState const* factionState = target ? target->GetReputationMgr().GetState(factionEntry) : NULL;
- int locale = handler->GetSessionDbcLocale();
- std::string name = factionEntry->name[locale];
+ std::string name = factionEntry->name;
if (name.empty())
continue;
if (!Utf8FitTo(name, wNamePart))
- {
- locale = 0;
- for (; locale < TOTAL_LOCALES; ++locale)
- {
- if (locale == handler->GetSessionDbcLocale())
- continue;
-
- name = factionEntry->name[locale];
- if (name.empty())
- continue;
-
- if (Utf8FitTo(name, wNamePart))
- break;
- }
- }
+ continue;
- if (locale < TOTAL_LOCALES)
+ if (maxResults && count++ == maxResults)
{
- if (maxResults && count++ == maxResults)
- {
- handler->PSendSysMessage(LANG_COMMAND_LOOKUP_MAX_RESULTS, maxResults);
- return true;
- }
+ handler->PSendSysMessage(LANG_COMMAND_LOOKUP_MAX_RESULTS, maxResults);
+ return true;
+ }
- // send faction in "id - [faction] rank reputation [visible] [at war] [own team] [unknown] [invisible] [inactive]" format
- // or "id - [faction] [no reputation]" format
- std::ostringstream ss;
- if (handler->GetSession())
- ss << id << " - |cffffffff|Hfaction:" << id << "|h[" << name << ' ' << localeNames[locale] << "]|h|r";
- else
- ss << id << " - " << name << ' ' << localeNames[locale];
+ // send faction in "id - [faction] rank reputation [visible] [at war] [own team] [unknown] [invisible] [inactive]" format
+ // or "id - [faction] [no reputation]" format
+ std::ostringstream ss;
+ if (handler->GetSession())
+ ss << id << " - |cffffffff|Hfaction:" << id << "|h[" << name << "]|h|r";
+ else
+ ss << id << " - " << name;
- if (factionState) // and then target != NULL also
- {
- uint32 index = target->GetReputationMgr().GetReputationRankStrIndex(factionEntry);
- std::string rankName = handler->GetTrinityString(index);
-
- ss << ' ' << rankName << "|h|r (" << target->GetReputationMgr().GetReputation(factionEntry) << ')';
-
- if (factionState->Flags & FACTION_FLAG_VISIBLE)
- ss << handler->GetTrinityString(LANG_FACTION_VISIBLE);
- if (factionState->Flags & FACTION_FLAG_AT_WAR)
- ss << handler->GetTrinityString(LANG_FACTION_ATWAR);
- if (factionState->Flags & FACTION_FLAG_PEACE_FORCED)
- ss << handler->GetTrinityString(LANG_FACTION_PEACE_FORCED);
- if (factionState->Flags & FACTION_FLAG_HIDDEN)
- ss << handler->GetTrinityString(LANG_FACTION_HIDDEN);
- if (factionState->Flags & FACTION_FLAG_INVISIBLE_FORCED)
- ss << handler->GetTrinityString(LANG_FACTION_INVISIBLE_FORCED);
- if (factionState->Flags & FACTION_FLAG_INACTIVE)
- ss << handler->GetTrinityString(LANG_FACTION_INACTIVE);
- }
- else
- ss << handler->GetTrinityString(LANG_FACTION_NOREPUTATION);
+ if (factionState) // and then target != NULL also
+ {
+ uint32 index = target->GetReputationMgr().GetReputationRankStrIndex(factionEntry);
+ std::string rankName = handler->GetTrinityString(index);
+
+ ss << ' ' << rankName << "|h|r (" << target->GetReputationMgr().GetReputation(factionEntry) << ')';
+
+ if (factionState->Flags & FACTION_FLAG_VISIBLE)
+ ss << handler->GetTrinityString(LANG_FACTION_VISIBLE);
+ if (factionState->Flags & FACTION_FLAG_AT_WAR)
+ ss << handler->GetTrinityString(LANG_FACTION_ATWAR);
+ if (factionState->Flags & FACTION_FLAG_PEACE_FORCED)
+ ss << handler->GetTrinityString(LANG_FACTION_PEACE_FORCED);
+ if (factionState->Flags & FACTION_FLAG_HIDDEN)
+ ss << handler->GetTrinityString(LANG_FACTION_HIDDEN);
+ if (factionState->Flags & FACTION_FLAG_INVISIBLE_FORCED)
+ ss << handler->GetTrinityString(LANG_FACTION_INVISIBLE_FORCED);
+ if (factionState->Flags & FACTION_FLAG_INACTIVE)
+ ss << handler->GetTrinityString(LANG_FACTION_INACTIVE);
+ }
+ else
+ ss << handler->GetTrinityString(LANG_FACTION_NOREPUTATION);
- handler->SendSysMessage(ss.str().c_str());
+ handler->SendSysMessage(ss.str().c_str());
- if (!found)
- found = true;
- }
+ if (!found)
+ found = true;
}
}
@@ -498,45 +461,27 @@ public:
ItemSetEntry const* set = sItemSetStore.LookupEntry(id);
if (set)
{
- int locale = handler->GetSessionDbcLocale();
- std::string name = set->name[locale];
+ std::string name = set->name;
if (name.empty())
continue;
if (!Utf8FitTo(name, wNamePart))
- {
- locale = 0;
- for (; locale < TOTAL_LOCALES; ++locale)
- {
- if (locale == handler->GetSessionDbcLocale())
- continue;
-
- name = set->name[locale];
- if (name.empty())
- continue;
-
- if (Utf8FitTo(name, wNamePart))
- break;
- }
- }
+ continue;
- if (locale < TOTAL_LOCALES)
+ if (maxResults && count++ == maxResults)
{
- if (maxResults && count++ == maxResults)
- {
- handler->PSendSysMessage(LANG_COMMAND_LOOKUP_MAX_RESULTS, maxResults);
- return true;
- }
+ handler->PSendSysMessage(LANG_COMMAND_LOOKUP_MAX_RESULTS, maxResults);
+ return true;
+ }
- // send item set in "id - [namedlink locale]" format
- if (handler->GetSession())
- handler->PSendSysMessage(LANG_ITEMSET_LIST_CHAT, id, id, name.c_str(), localeNames[locale]);
- else
- handler->PSendSysMessage(LANG_ITEMSET_LIST_CONSOLE, id, name.c_str(), localeNames[locale]);
+ // send item set in "id - [namedlink locale]" format
+ if (handler->GetSession())
+ handler->PSendSysMessage(LANG_ITEMSET_LIST_CHAT, id, id, name.c_str(), "");
+ else
+ handler->PSendSysMessage(LANG_ITEMSET_LIST_CONSOLE, id, name.c_str(), "");
- if (!found)
- found = true;
- }
+ if (!found)
+ found = true;
}
}
if (!found)
@@ -779,59 +724,41 @@ public:
SkillLineEntry const* skillInfo = sSkillLineStore.LookupEntry(id);
if (skillInfo)
{
- int locale = handler->GetSessionDbcLocale();
- std::string name = skillInfo->name[locale];
+ std::string name = skillInfo->name;
if (name.empty())
continue;
if (!Utf8FitTo(name, wNamePart))
- {
- locale = 0;
- for (; locale < TOTAL_LOCALES; ++locale)
- {
- if (locale == handler->GetSessionDbcLocale())
- continue;
-
- name = skillInfo->name[locale];
- if (name.empty())
- continue;
+ continue;
- if (Utf8FitTo(name, wNamePart))
- break;
- }
+ if (maxResults && count++ == maxResults)
+ {
+ handler->PSendSysMessage(LANG_COMMAND_LOOKUP_MAX_RESULTS, maxResults);
+ return true;
}
- if (locale < TOTAL_LOCALES)
+ char valStr[50] = "";
+ char const* knownStr = "";
+ if (target && target->HasSkill(id))
{
- if (maxResults && count++ == maxResults)
- {
- handler->PSendSysMessage(LANG_COMMAND_LOOKUP_MAX_RESULTS, maxResults);
- return true;
- }
-
- char valStr[50] = "";
- char const* knownStr = "";
- if (target && target->HasSkill(id))
- {
- knownStr = handler->GetTrinityString(LANG_KNOWN);
- uint32 curValue = target->GetPureSkillValue(id);
- uint32 maxValue = target->GetPureMaxSkillValue(id);
- uint32 permValue = target->GetSkillPermBonusValue(id);
- uint32 tempValue = target->GetSkillTempBonusValue(id);
-
- char const* valFormat = handler->GetTrinityString(LANG_SKILL_VALUES);
- snprintf(valStr, 50, valFormat, curValue, maxValue, permValue, tempValue);
- }
+ knownStr = handler->GetTrinityString(LANG_KNOWN);
+ uint32 curValue = target->GetPureSkillValue(id);
+ uint32 maxValue = target->GetPureMaxSkillValue(id);
+ uint32 permValue = target->GetSkillPermBonusValue(id);
+ uint32 tempValue = target->GetSkillTempBonusValue(id);
+
+ char const* valFormat = handler->GetTrinityString(LANG_SKILL_VALUES);
+ snprintf(valStr, 50, valFormat, curValue, maxValue, permValue, tempValue);
+ }
- // send skill in "id - [namedlink locale]" format
- if (handler->GetSession())
- handler->PSendSysMessage(LANG_SKILL_LIST_CHAT, id, id, name.c_str(), localeNames[locale], knownStr, valStr);
- else
- handler->PSendSysMessage(LANG_SKILL_LIST_CONSOLE, id, name.c_str(), localeNames[locale], knownStr, valStr);
+ // send skill in "id - [namedlink locale]" format
+ if (handler->GetSession())
+ handler->PSendSysMessage(LANG_SKILL_LIST_CHAT, id, id, name.c_str(), "", knownStr, valStr);
+ else
+ handler->PSendSysMessage(LANG_SKILL_LIST_CONSOLE, id, name.c_str(), "", knownStr, valStr);
- if (!found)
- found = true;
- }
+ if (!found)
+ found = true;
}
}
if (!found)
@@ -867,83 +794,63 @@ public:
SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(id);
if (spellInfo)
{
- int locale = handler->GetSessionDbcLocale();
- std::string name = spellInfo->SpellName[locale];
+ std::string name = spellInfo->SpellName;
if (name.empty())
continue;
if (!Utf8FitTo(name, wNamePart))
+ continue;
+
+ if (maxResults && count++ == maxResults)
{
- locale = 0;
- for (; locale < TOTAL_LOCALES; ++locale)
- {
- if (locale == handler->GetSessionDbcLocale())
- continue;
+ handler->PSendSysMessage(LANG_COMMAND_LOOKUP_MAX_RESULTS, maxResults);
+ return true;
+ }
- name = spellInfo->SpellName[locale];
- if (name.empty())
- continue;
+ bool known = target && target->HasSpell(id);
+ bool learn = (spellInfo->Effects[0].Effect == SPELL_EFFECT_LEARN_SPELL);
- if (Utf8FitTo(name, wNamePart))
- break;
- }
- }
+ SpellInfo const* learnSpellInfo = sSpellMgr->GetSpellInfo(spellInfo->Effects[0].TriggerSpell);
- if (locale < TOTAL_LOCALES)
- {
- if (maxResults && count++ == maxResults)
- {
- handler->PSendSysMessage(LANG_COMMAND_LOOKUP_MAX_RESULTS, maxResults);
- return true;
- }
+ uint32 talentCost = GetTalentSpellCost(id);
- bool known = target && target->HasSpell(id);
- bool learn = (spellInfo->Effects[0].Effect == SPELL_EFFECT_LEARN_SPELL);
+ bool talent = (talentCost > 0);
+ bool passive = spellInfo->IsPassive();
+ bool active = target && target->HasAura(id);
- SpellInfo const* learnSpellInfo = sSpellMgr->GetSpellInfo(spellInfo->Effects[0].TriggerSpell);
+ // unit32 used to prevent interpreting uint8 as char at output
+ // find rank of learned spell for learning spell, or talent rank
+ uint32 rank = talentCost ? talentCost : learn && learnSpellInfo ? learnSpellInfo->GetRank() : spellInfo->GetRank();
- uint32 talentCost = GetTalentSpellCost(id);
+ // send spell in "id - [name, rank N] [talent] [passive] [learn] [known]" format
+ std::ostringstream ss;
+ if (handler->GetSession())
+ ss << id << " - |cffffffff|Hspell:" << id << "|h[" << name;
+ else
+ ss << id << " - " << name;
- bool talent = (talentCost > 0);
- bool passive = spellInfo->IsPassive();
- bool active = target && target->HasAura(id);
+ // include rank in link name
+ if (rank)
+ ss << handler->GetTrinityString(LANG_SPELL_RANK) << rank;
- // unit32 used to prevent interpreting uint8 as char at output
- // find rank of learned spell for learning spell, or talent rank
- uint32 rank = talentCost ? talentCost : learn && learnSpellInfo ? learnSpellInfo->GetRank() : spellInfo->GetRank();
+ if (handler->GetSession())
+ ss << "]|h|r";
- // send spell in "id - [name, rank N] [talent] [passive] [learn] [known]" format
- std::ostringstream ss;
- if (handler->GetSession())
- ss << id << " - |cffffffff|Hspell:" << id << "|h[" << name;
- else
- ss << id << " - " << name;
-
- // include rank in link name
- if (rank)
- ss << handler->GetTrinityString(LANG_SPELL_RANK) << rank;
-
- if (handler->GetSession())
- ss << ' ' << localeNames[locale] << "]|h|r";
- else
- ss << ' ' << localeNames[locale];
-
- if (talent)
- ss << handler->GetTrinityString(LANG_TALENT);
- if (passive)
- ss << handler->GetTrinityString(LANG_PASSIVE);
- if (learn)
- ss << handler->GetTrinityString(LANG_LEARN);
- if (known)
- ss << handler->GetTrinityString(LANG_KNOWN);
- if (active)
- ss << handler->GetTrinityString(LANG_ACTIVE);
+ if (talent)
+ ss << handler->GetTrinityString(LANG_TALENT);
+ if (passive)
+ ss << handler->GetTrinityString(LANG_PASSIVE);
+ if (learn)
+ ss << handler->GetTrinityString(LANG_LEARN);
+ if (known)
+ ss << handler->GetTrinityString(LANG_KNOWN);
+ if (active)
+ ss << handler->GetTrinityString(LANG_ACTIVE);
- handler->SendSysMessage(ss.str().c_str());
+ handler->SendSysMessage(ss.str().c_str());
- if (!found)
- found = true;
- }
+ if (!found)
+ found = true;
}
}
if (!found)
@@ -965,7 +872,7 @@ public:
if (SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(id))
{
int locale = handler->GetSessionDbcLocale();
- std::string name = spellInfo->SpellName[locale];
+ std::string name = spellInfo->SpellName;
if (name.empty())
{
handler->SendSysMessage(LANG_COMMAND_NOSPELLFOUND);
@@ -1046,47 +953,29 @@ public:
TaxiNodesEntry const* nodeEntry = sTaxiNodesStore.LookupEntry(id);
if (nodeEntry)
{
- int locale = handler->GetSessionDbcLocale();
- std::string name = nodeEntry->name[locale];
+ std::string name = nodeEntry->name;
if (name.empty())
continue;
if (!Utf8FitTo(name, wNamePart))
- {
- locale = 0;
- for (; locale < TOTAL_LOCALES; ++locale)
- {
- if (locale == handler->GetSessionDbcLocale())
- continue;
-
- name = nodeEntry->name[locale];
- if (name.empty())
- continue;
-
- if (Utf8FitTo(name, wNamePart))
- break;
- }
- }
+ continue;
- if (locale < TOTAL_LOCALES)
+ if (maxResults && count++ == maxResults)
{
- if (maxResults && count++ == maxResults)
- {
- handler->PSendSysMessage(LANG_COMMAND_LOOKUP_MAX_RESULTS, maxResults);
- return true;
- }
+ handler->PSendSysMessage(LANG_COMMAND_LOOKUP_MAX_RESULTS, maxResults);
+ return true;
+ }
- // send taxinode in "id - [name] (Map:m X:x Y:y Z:z)" format
- if (handler->GetSession())
- handler->PSendSysMessage(LANG_TAXINODE_ENTRY_LIST_CHAT, id, id, name.c_str(), localeNames[locale],
- nodeEntry->map_id, nodeEntry->x, nodeEntry->y, nodeEntry->z);
- else
- handler->PSendSysMessage(LANG_TAXINODE_ENTRY_LIST_CONSOLE, id, name.c_str(), localeNames[locale],
- nodeEntry->map_id, nodeEntry->x, nodeEntry->y, nodeEntry->z);
+ // send taxinode in "id - [name] (Map:m X:x Y:y Z:z)" format
+ if (handler->GetSession())
+ handler->PSendSysMessage(LANG_TAXINODE_ENTRY_LIST_CHAT, id, id, name.c_str(), "",
+ nodeEntry->map_id, nodeEntry->x, nodeEntry->y, nodeEntry->z);
+ else
+ handler->PSendSysMessage(LANG_TAXINODE_ENTRY_LIST_CONSOLE, id, name.c_str(), "",
+ nodeEntry->map_id, nodeEntry->x, nodeEntry->y, nodeEntry->z);
- if (!found)
- found = true;
- }
+ if (!found)
+ found = true;
}
}
if (!found)
@@ -1183,53 +1072,35 @@ public:
CharTitlesEntry const* titleInfo = sCharTitlesStore.LookupEntry(id);
if (titleInfo)
{
- int locale = handler->GetSessionDbcLocale();
- std::string name = titleInfo->name[locale];
+ std::string name = titleInfo->name;
if (name.empty())
continue;
if (!Utf8FitTo(name, wNamePart))
- {
- locale = 0;
- for (; locale < TOTAL_LOCALES; ++locale)
- {
- if (locale == handler->GetSessionDbcLocale())
- continue;
-
- name = titleInfo->name[locale];
- if (name.empty())
- continue;
-
- if (Utf8FitTo(name, wNamePart))
- break;
- }
- }
+ continue;
- if (locale < TOTAL_LOCALES)
+ if (maxResults && counter == maxResults)
{
- if (maxResults && counter == maxResults)
- {
- handler->PSendSysMessage(LANG_COMMAND_LOOKUP_MAX_RESULTS, maxResults);
- return true;
- }
+ handler->PSendSysMessage(LANG_COMMAND_LOOKUP_MAX_RESULTS, maxResults);
+ return true;
+ }
- char const* knownStr = target && target->HasTitle(titleInfo) ? handler->GetTrinityString(LANG_KNOWN) : "";
+ char const* knownStr = target && target->HasTitle(titleInfo) ? handler->GetTrinityString(LANG_KNOWN) : "";
- char const* activeStr = target && target->GetUInt32Value(PLAYER_CHOSEN_TITLE) == titleInfo->bit_index
- ? handler->GetTrinityString(LANG_ACTIVE)
- : "";
+ char const* activeStr = target && target->GetUInt32Value(PLAYER_CHOSEN_TITLE) == titleInfo->bit_index
+ ? handler->GetTrinityString(LANG_ACTIVE)
+ : "";
- char titleNameStr[80];
- snprintf(titleNameStr, 80, name.c_str(), targetName);
+ char titleNameStr[80];
+ snprintf(titleNameStr, 80, name.c_str(), targetName);
- // send title in "id (idx:idx) - [namedlink locale]" format
- if (handler->GetSession())
- handler->PSendSysMessage(LANG_TITLE_LIST_CHAT, id, titleInfo->bit_index, id, titleNameStr, localeNames[locale], knownStr, activeStr);
- else
- handler->PSendSysMessage(LANG_TITLE_LIST_CONSOLE, id, titleInfo->bit_index, titleNameStr, localeNames[locale], knownStr, activeStr);
+ // send title in "id (idx:idx) - [namedlink locale]" format
+ if (handler->GetSession())
+ handler->PSendSysMessage(LANG_TITLE_LIST_CHAT, id, titleInfo->bit_index, id, titleNameStr, "", knownStr, activeStr);
+ else
+ handler->PSendSysMessage(LANG_TITLE_LIST_CONSOLE, id, titleInfo->bit_index, titleNameStr, "", knownStr, activeStr);
- ++counter;
- }
+ ++counter;
}
}
if (counter == 0) // if counter == 0 then we found nth
@@ -1260,7 +1131,7 @@ public:
{
if (MapEntry const* mapInfo = sMapStore.LookupEntry(id))
{
- std::string name = mapInfo->name[locale];
+ std::string name = mapInfo->name;
if (name.empty())
continue;
diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp
index 29014c27740..a69dd184473 100644
--- a/src/server/scripts/Commands/cs_misc.cpp
+++ b/src/server/scripts/Commands/cs_misc.cpp
@@ -111,7 +111,6 @@ public:
{ "cometome", SEC_ADMINISTRATOR, false, &HandleComeToMeCommand, "", NULL },
{ "damage", SEC_ADMINISTRATOR, false, &HandleDamageCommand, "", NULL },
{ "combatstop", SEC_GAMEMASTER, true, &HandleCombatStopCommand, "", NULL },
- { "flusharenapoints", SEC_ADMINISTRATOR, false, &HandleFlushArenaPointsCommand, "", NULL },
{ "repairitems", SEC_GAMEMASTER, true, &HandleRepairitemsCommand, "", NULL },
{ "freeze", SEC_MODERATOR, false, &HandleFreezeCommand, "", NULL },
{ "unfreeze", SEC_MODERATOR, false, &HandleUnFreezeCommand, "", NULL },
@@ -228,9 +227,9 @@ public:
handler->PSendSysMessage("no VMAP available for area info");
handler->PSendSysMessage(LANG_MAP_POSITION,
- mapId, (mapEntry ? mapEntry->name[handler->GetSessionDbcLocale()] : "<unknown>"),
- zoneId, (zoneEntry ? zoneEntry->area_name[handler->GetSessionDbcLocale()] : "<unknown>"),
- areaId, (areaEntry ? areaEntry->area_name[handler->GetSessionDbcLocale()] : "<unknown>"),
+ mapId, (mapEntry ? mapEntry->name : "<unknown>"),
+ zoneId, (zoneEntry ? zoneEntry->area_name : "<unknown>"),
+ areaId, (areaEntry ? areaEntry->area_name : "<unknown>"),
object->GetPhaseMask(),
object->GetPositionX(), object->GetPositionY(), object->GetPositionZ(), object->GetOrientation(),
cell.GridX(), cell.GridY(), cell.CellX(), cell.CellY(), object->GetInstanceId(),
@@ -1458,7 +1457,7 @@ public:
if (!target->GetSkillValue(skill))
{
- handler->PSendSysMessage(LANG_SET_SKILL_ERROR, tNameLink.c_str(), skill, skillLine->name[handler->GetSessionDbcLocale()]);
+ handler->PSendSysMessage(LANG_SET_SKILL_ERROR, tNameLink.c_str(), skill, skillLine->name);
handler->SetSentErrorMessage(true);
return false;
}
@@ -1469,7 +1468,7 @@ public:
return false;
target->SetSkill(skill, target->GetSkillStep(skill), level, max);
- handler->PSendSysMessage(LANG_SET_SKILL, skill, skillLine->name[handler->GetSessionDbcLocale()], tNameLink.c_str(), level, max);
+ handler->PSendSysMessage(LANG_SET_SKILL, skill, skillLine->name, tNameLink.c_str(), level, max);
return true;
}
@@ -1818,15 +1817,15 @@ public:
AreaTableEntry const* area = GetAreaEntryByAreaID(areaId);
if (area)
{
- areaName = area->area_name[locale];
+ areaName = area->area_name;
AreaTableEntry const* zone = GetAreaEntryByAreaID(area->zone);
if (zone)
- zoneName = zone->area_name[locale];
+ zoneName = zone->area_name;
}
if (target)
- handler->PSendSysMessage(LANG_PINFO_CHR_MAP, map->name[locale], (!zoneName.empty() ? zoneName.c_str() : "<Unknown>"), (!areaName.empty() ? areaName.c_str() : "<Unknown>"));
+ handler->PSendSysMessage(LANG_PINFO_CHR_MAP, map->name, (!zoneName.empty() ? zoneName.c_str() : "<Unknown>"), (!areaName.empty() ? areaName.c_str() : "<Unknown>"));
// Output XVII. - XX. if they are not empty
if (!guildName.empty())
@@ -2328,12 +2327,6 @@ public:
return true;
}
- static bool HandleFlushArenaPointsCommand(ChatHandler* /*handler*/, char const* /*args*/)
- {
- sArenaTeamMgr->DistributeArenaPoints();
- return true;
- }
-
static bool HandleRepairitemsCommand(ChatHandler* handler, char const* args)
{
Player* target;
diff --git a/src/server/scripts/Commands/cs_modify.cpp b/src/server/scripts/Commands/cs_modify.cpp
index 07d1e7d4b18..df2aad375d9 100644
--- a/src/server/scripts/Commands/cs_modify.cpp
+++ b/src/server/scripts/Commands/cs_modify.cpp
@@ -23,6 +23,7 @@ Category: commandscripts
EndScriptData */
#include "Chat.h"
+#include <stdlib.h>
#include "ObjectMgr.h"
#include "Opcodes.h"
#include "Pet.h"
@@ -64,11 +65,11 @@ public:
{ "mount", SEC_MODERATOR, false, &HandleModifyMountCommand, "", NULL },
{ "honor", SEC_MODERATOR, false, &HandleModifyHonorCommand, "", NULL },
{ "reputation", SEC_GAMEMASTER, false, &HandleModifyRepCommand, "", NULL },
- { "arenapoints", SEC_MODERATOR, false, &HandleModifyArenaCommand, "", NULL },
{ "drunk", SEC_MODERATOR, false, &HandleModifyDrunkCommand, "", NULL },
{ "standstate", SEC_GAMEMASTER, false, &HandleModifyStandStateCommand, "", NULL },
{ "phase", SEC_ADMINISTRATOR, false, &HandleModifyPhaseCommand, "", NULL },
{ "gender", SEC_GAMEMASTER, false, &HandleModifyGenderCommand, "", NULL },
+ { "currency", SEC_GAMEMASTER, false, &HandleModifyCurrencyCommand, "", NULL },
{ "speed", SEC_MODERATOR, false, NULL, "", modifyspeedCommandTable },
{ NULL, 0, false, NULL, "", NULL }
};
@@ -963,14 +964,14 @@ public:
target->SetUInt32Value(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP);
target->Mount(mId);
- WorldPacket data(SMSG_FORCE_RUN_SPEED_CHANGE, (8+4+1+4));
+ WorldPacket data(SMSG_MOVE_SET_RUN_SPEED, (8+4+1+4));
data.append(target->GetPackGUID());
data << (uint32)0;
data << (uint8)0; //new 2.1.0
data << float(speed);
target->SendMessageToSet(&data, true);
- data.Initialize(SMSG_FORCE_SWIM_SPEED_CHANGE, (8+4+4));
+ data.Initialize(SMSG_MOVE_SET_SWIM_SPEED, (8+4+4));
data.append(target->GetPackGUID());
data << (uint32)0;
data << float(speed);
@@ -997,19 +998,19 @@ public:
if (handler->HasLowerSecurity(target, 0))
return false;
- int32 moneyToAdd = 0;
+ int64 moneyToAdd = 0;
if (strchr(args, 'g') || strchr(args, 's') || strchr(args, 'c'))
moneyToAdd = MoneyStringToMoney(std::string(args));
else
- moneyToAdd = atoi(args);
+ moneyToAdd = atol(args);
- uint32 targetMoney = target->GetMoney();
+ uint64 targetMoney = target->GetMoney();
if (moneyToAdd < 0)
{
- int32 newmoney = int32(targetMoney) + moneyToAdd;
+ int64 newmoney = int64(targetMoney) + moneyToAdd;
- TC_LOG_DEBUG(LOG_FILTER_GENERAL, handler->GetTrinityString(LANG_CURRENT_MONEY), targetMoney, moneyToAdd, newmoney);
+ TC_LOG_DEBUG(LOG_FILTER_GENERAL, handler->GetTrinityString(LANG_CURRENT_MONEY), uint32(targetMoney), int32(moneyToAdd), uint32(newmoney));
if (newmoney <= 0)
{
handler->PSendSysMessage(LANG_YOU_TAKE_ALL_MONEY, handler->GetNameLink(target).c_str());
@@ -1020,31 +1021,32 @@ public:
}
else
{
- if (newmoney > MAX_MONEY_AMOUNT)
+ uint32 moneyToAddMsg = moneyToAdd * -1;
+ if (newmoney > int64(MAX_MONEY_AMOUNT))
newmoney = MAX_MONEY_AMOUNT;
- handler->PSendSysMessage(LANG_YOU_TAKE_MONEY, abs(moneyToAdd), handler->GetNameLink(target).c_str());
+ handler->PSendSysMessage(LANG_YOU_TAKE_MONEY, moneyToAddMsg, handler->GetNameLink(target).c_str());
if (handler->needReportToTarget(target))
- ChatHandler(target->GetSession()).PSendSysMessage(LANG_YOURS_MONEY_TAKEN, handler->GetNameLink().c_str(), abs(moneyToAdd));
+ ChatHandler(target->GetSession()).PSendSysMessage(LANG_YOURS_MONEY_TAKEN, handler->GetNameLink().c_str(), moneyToAddMsg);
target->SetMoney(newmoney);
}
}
else
{
- handler->PSendSysMessage(LANG_YOU_GIVE_MONEY, moneyToAdd, handler->GetNameLink(target).c_str());
+ handler->PSendSysMessage(LANG_YOU_GIVE_MONEY, uint32(moneyToAdd), handler->GetNameLink(target).c_str());
if (handler->needReportToTarget(target))
- ChatHandler(target->GetSession()).PSendSysMessage(LANG_YOURS_MONEY_GIVEN, handler->GetNameLink().c_str(), moneyToAdd);
+ ChatHandler(target->GetSession()).PSendSysMessage(LANG_YOURS_MONEY_GIVEN, handler->GetNameLink().c_str(), uint32(moneyToAdd));
- if (moneyToAdd >= MAX_MONEY_AMOUNT)
+ if (moneyToAdd >= int64(MAX_MONEY_AMOUNT))
moneyToAdd = MAX_MONEY_AMOUNT;
- if (targetMoney >= uint32(MAX_MONEY_AMOUNT) - moneyToAdd)
+ if (targetMoney >= uint64(MAX_MONEY_AMOUNT) - moneyToAdd)
moneyToAdd -= targetMoney;
target->ModifyMoney(moneyToAdd);
}
- TC_LOG_DEBUG(LOG_FILTER_GENERAL, handler->GetTrinityString(LANG_NEW_MONEY), targetMoney, moneyToAdd, target->GetMoney());
+ TC_LOG_DEBUG(LOG_FILTER_GENERAL, handler->GetTrinityString(LANG_NEW_MONEY), uint32(targetMoney), int32(moneyToAdd), uint32(target->GetMoney()));
return true;
}
@@ -1104,7 +1106,7 @@ public:
return true;
}
- static bool HandleModifyHonorCommand (ChatHandler* handler, const char* args)
+ static bool HandleModifyHonorCommand(ChatHandler* handler, const char* args)
{
if (!*args)
return false;
@@ -1123,9 +1125,9 @@ public:
int32 amount = (uint32)atoi(args);
- target->ModifyHonorPoints(amount);
+ target->ModifyCurrency(CURRENCY_TYPE_HONOR_POINTS, amount, true, true);
- handler->PSendSysMessage(LANG_COMMAND_MODIFY_HONOR, handler->GetNameLink(target).c_str(), target->GetHonorPoints());
+ handler->PSendSysMessage(LANG_COMMAND_MODIFY_HONOR, handler->GetNameLink(target).c_str(), target->GetCurrency(CURRENCY_TYPE_HONOR_POINTS, false));
return true;
}
@@ -1233,14 +1235,14 @@ public:
if (factionEntry->reputationListID < 0)
{
- handler->PSendSysMessage(LANG_COMMAND_FACTION_NOREP_ERROR, factionEntry->name[handler->GetSessionDbcLocale()], factionId);
+ handler->PSendSysMessage(LANG_COMMAND_FACTION_NOREP_ERROR, factionEntry->name, factionId);
handler->SetSentErrorMessage(true);
return false;
}
target->GetReputationMgr().SetOneFactionReputation(factionEntry, amount, false);
target->GetReputationMgr().SendState(target->GetReputationMgr().GetState(factionEntry));
- handler->PSendSysMessage(LANG_COMMAND_MODIFY_REP, factionEntry->name[handler->GetSessionDbcLocale()], factionId,
+ handler->PSendSysMessage(LANG_COMMAND_MODIFY_REP, factionEntry->name, factionId,
handler->GetNameLink(target).c_str(), target->GetReputationMgr().GetReputation(factionEntry));
return true;
}
@@ -1275,14 +1277,15 @@ public:
uint32 phasemask = (uint32)atoi((char*)args);
Unit* target = handler->getSelectedUnit();
- if (!target)
- target = handler->GetSession()->GetPlayer();
-
- // check online security
- else if (target->GetTypeId() == TYPEID_PLAYER && handler->HasLowerSecurity(target->ToPlayer(), 0))
- return false;
-
- target->SetPhaseMask(phasemask, true);
+ if (target)
+ {
+ if (target->GetTypeId() == TYPEID_PLAYER)
+ target->ToPlayer()->GetPhaseMgr().SetCustomPhase(phasemask);
+ else
+ target->SetPhaseMask(phasemask, true);
+ }
+ else
+ handler->GetSession()->GetPlayer()->GetPhaseMgr().SetCustomPhase(phasemask);
return true;
}
@@ -1299,28 +1302,6 @@ public:
return true;
}
- static bool HandleModifyArenaCommand(ChatHandler* handler, const char* args)
- {
- if (!*args)
- return false;
-
- Player* target = handler->getSelectedPlayer();
- if (!target)
- {
- handler->SendSysMessage(LANG_PLAYER_NOT_FOUND);
- handler->SetSentErrorMessage(true);
- return false;
- }
-
- int32 amount = (uint32)atoi(args);
-
- target->ModifyArenaPoints(amount);
-
- handler->PSendSysMessage(LANG_COMMAND_MODIFY_ARENA, handler->GetNameLink(target).c_str(), target->GetArenaPoints());
-
- return true;
- }
-
static bool HandleModifyGenderCommand(ChatHandler* handler, const char* args)
{
if (!*args)
@@ -1396,6 +1377,33 @@ public:
return true;
}
+
+ static bool HandleModifyCurrencyCommand(ChatHandler* handler, const char* args)
+ {
+ if (!*args)
+ return false;
+
+ Player* target = handler->getSelectedPlayer();
+ if (!target)
+ {
+ handler->PSendSysMessage(LANG_PLAYER_NOT_FOUND);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ uint32 currencyId = atoi(strtok((char*)args, " "));
+ const CurrencyTypesEntry* currencyType = sCurrencyTypesStore.LookupEntry(currencyId);
+ if (!currencyType)
+ return false;
+
+ uint32 amount = atoi(strtok(NULL, " "));
+ if (!amount)
+ return false;
+
+ target->ModifyCurrency(currencyId, amount, true, true);
+
+ return true;
+ }
};
void AddSC_modify_commandscript()
diff --git a/src/server/scripts/Commands/cs_npc.cpp b/src/server/scripts/Commands/cs_npc.cpp
index 56270b61c30..832f8f25158 100644
--- a/src/server/scripts/Commands/cs_npc.cpp
+++ b/src/server/scripts/Commands/cs_npc.cpp
@@ -191,13 +191,13 @@ public:
}
Creature* creature = new Creature();
- if (!creature->Create(sObjectMgr->GenerateLowGuid(HIGHGUID_UNIT), map, chr->GetPhaseMaskForSpawn(), id, 0, (uint32)teamval, x, y, z, o))
+ if (!creature->Create(sObjectMgr->GenerateLowGuid(HIGHGUID_UNIT), map, chr->GetPhaseMgr().GetPhaseMaskForSpawn(), id, 0, (uint32)teamval, x, y, z, o))
{
delete creature;
return false;
}
- creature->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), chr->GetPhaseMaskForSpawn());
+ creature->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), chr->GetPhaseMgr().GetPhaseMaskForSpawn());
uint32 db_guid = creature->GetDBTableGUIDLow();
@@ -218,6 +218,8 @@ public:
if (!*args)
return false;
+ const uint8 type = 1; // FIXME: make type (1 item, 2 currency) an argument
+
char* pitem = handler->extractKeyFromLink((char*)args, "Hitem");
if (!pitem)
{
@@ -254,13 +256,13 @@ public:
uint32 vendor_entry = vendor->GetEntry();
- if (!sObjectMgr->IsVendorItemValid(vendor_entry, itemId, maxcount, incrtime, extendedcost, handler->GetSession()->GetPlayer()))
+ if (!sObjectMgr->IsVendorItemValid(vendor_entry, itemId, maxcount, incrtime, extendedcost, type, handler->GetSession()->GetPlayer()))
{
handler->SetSentErrorMessage(true);
return false;
}
- sObjectMgr->AddVendorItem(vendor_entry, itemId, maxcount, incrtime, extendedcost);
+ sObjectMgr->AddVendorItem(vendor_entry, itemId, maxcount, incrtime, extendedcost, type);
ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(itemId);
@@ -475,7 +477,9 @@ public:
}
uint32 itemId = atol(pitem);
- if (!sObjectMgr->RemoveVendorItem(vendor->GetEntry(), itemId))
+ const uint8 type = 1; // FIXME: make type (1 item, 2 currency) an argument
+
+ if (!sObjectMgr->RemoveVendorItem(vendor->GetEntry(), itemId, type))
{
handler->PSendSysMessage(LANG_ITEM_NOT_IN_LIST, itemId);
handler->SetSentErrorMessage(true);
diff --git a/src/server/scripts/Commands/cs_reload.cpp b/src/server/scripts/Commands/cs_reload.cpp
index 5351f3edda0..6b846338ea2 100644
--- a/src/server/scripts/Commands/cs_reload.cpp
+++ b/src/server/scripts/Commands/cs_reload.cpp
@@ -26,7 +26,6 @@ EndScriptData */
#include "AchievementMgr.h"
#include "AuctionHouseMgr.h"
#include "Chat.h"
-#include "CreatureEventAIMgr.h"
#include "CreatureTextMgr.h"
#include "DisableMgr.h"
#include "Language.h"
@@ -53,7 +52,6 @@ public:
{
{ "achievement", SEC_ADMINISTRATOR, true, &HandleReloadAllAchievementCommand, "", NULL },
{ "area", SEC_ADMINISTRATOR, true, &HandleReloadAllAreaCommand, "", NULL },
- { "eventai", SEC_ADMINISTRATOR, true, &HandleReloadAllEventAICommand, "", NULL },
{ "gossips", SEC_ADMINISTRATOR, true, &HandleReloadAllGossipsCommand, "", NULL },
{ "item", SEC_ADMINISTRATOR, true, &HandleReloadAllItemCommand, "", NULL },
{ "locales", SEC_ADMINISTRATOR, true, &HandleReloadAllLocalesCommand, "", NULL },
@@ -80,8 +78,6 @@ public:
{ "conditions", SEC_ADMINISTRATOR, true, &HandleReloadConditions, "", NULL },
{ "config", SEC_ADMINISTRATOR, true, &HandleReloadConfigCommand, "", NULL },
{ "creature_text", SEC_ADMINISTRATOR, true, &HandleReloadCreatureText, "", NULL },
- { "creature_ai_scripts", SEC_ADMINISTRATOR, true, &HandleReloadEventAIScriptsCommand, "", NULL },
- { "creature_ai_texts", SEC_ADMINISTRATOR, true, &HandleReloadEventAITextsCommand, "", NULL },
{ "creature_involvedrelation", SEC_ADMINISTRATOR, true, &HandleReloadCreatureQuestInvRelationsCommand, "", NULL },
{ "creature_linked_respawn", SEC_GAMEMASTER, true, &HandleReloadLinkedRespawnCommand, "", NULL },
{ "creature_loot_template", SEC_ADMINISTRATOR, true, &HandleReloadLootTemplatesCreatureCommand, "", NULL },
@@ -104,7 +100,6 @@ public:
{ "gossip_menu_option", SEC_ADMINISTRATOR, true, &HandleReloadGossipMenuOptionCommand, "", NULL },
{ "item_enchantment_template", SEC_ADMINISTRATOR, true, &HandleReloadItemEnchantementsCommand, "", NULL },
{ "item_loot_template", SEC_ADMINISTRATOR, true, &HandleReloadLootTemplatesItemCommand, "", NULL },
- { "item_set_names", SEC_ADMINISTRATOR, true, &HandleReloadItemSetNamesCommand, "", NULL },
{ "lfg_dungeon_rewards", SEC_ADMINISTRATOR, true, &HandleReloadLfgRewardsCommand, "", NULL },
{ "locales_achievement_reward", SEC_ADMINISTRATOR, true, &HandleReloadLocalesAchievementRewardCommand, "", NULL },
{ "locales_creature", SEC_ADMINISTRATOR, true, &HandleReloadLocalesCreatureCommand, "", NULL },
@@ -112,7 +107,6 @@ public:
{ "locales_gameobject", SEC_ADMINISTRATOR, true, &HandleReloadLocalesGameobjectCommand, "", NULL },
{ "locales_gossip_menu_option", SEC_ADMINISTRATOR, true, &HandleReloadLocalesGossipMenuOptionCommand, "", NULL },
{ "locales_item", SEC_ADMINISTRATOR, true, &HandleReloadLocalesItemCommand, "", NULL },
- { "locales_item_set_name", SEC_ADMINISTRATOR, true, &HandleReloadLocalesItemSetNameCommand, "", NULL },
{ "locales_npc_text", SEC_ADMINISTRATOR, true, &HandleReloadLocalesNpcTextCommand, "", NULL },
{ "locales_page_text", SEC_ADMINISTRATOR, true, &HandleReloadLocalesPageTextCommand, "", NULL },
{ "locales_points_of_interest", SEC_ADMINISTRATOR, true, &HandleReloadLocalesPointsOfInterestCommand, "", NULL },
@@ -124,6 +118,7 @@ public:
{ "npc_trainer", SEC_ADMINISTRATOR, true, &HandleReloadNpcTrainerCommand, "", NULL },
{ "npc_vendor", SEC_ADMINISTRATOR, true, &HandleReloadNpcVendorCommand, "", NULL },
{ "page_text", SEC_ADMINISTRATOR, true, &HandleReloadPageTextsCommand, "", NULL },
+ { "phasedefinitions", SEC_ADMINISTRATOR, true, &HandleReloadPhaseDefinitionsCommand, "", NULL },
{ "pickpocketing_loot_template", SEC_ADMINISTRATOR, true, &HandleReloadLootTemplatesPickpocketingCommand, "", NULL},
{ "points_of_interest", SEC_ADMINISTRATOR, true, &HandleReloadPointsOfInterestCommand, "", NULL },
{ "prospecting_loot_template", SEC_ADMINISTRATOR, true, &HandleReloadLootTemplatesProspectingCommand, "", NULL },
@@ -182,7 +177,6 @@ public:
HandleReloadAllAchievementCommand(handler, "");
HandleReloadAllAreaCommand(handler, "");
- HandleReloadAllEventAICommand(handler, "");
HandleReloadAllLootCommand(handler, "");
HandleReloadAllNpcCommand(handler, "");
HandleReloadAllQuestCommand(handler, "");
@@ -273,13 +267,6 @@ public:
return true;
}
- static bool HandleReloadAllEventAICommand(ChatHandler* handler, const char* /*args*/)
- {
- HandleReloadEventAITextsCommand(handler, "a");
- HandleReloadEventAIScriptsCommand(handler, "a");
- return true;
- }
-
static bool HandleReloadAllSpellCommand(ChatHandler* handler, const char* /*args*/)
{
HandleReloadSkillDiscoveryTemplateCommand(handler, "a");
@@ -442,11 +429,12 @@ public:
Field* fields = result->Fetch();
- cInfo->DifficultyEntry[0] = fields[0].GetUInt32();
- cInfo->DifficultyEntry[1] = fields[1].GetUInt32();
- cInfo->DifficultyEntry[2] = fields[2].GetUInt32();
- cInfo->KillCredit[0] = fields[3].GetUInt32();
- cInfo->KillCredit[1] = fields[4].GetUInt32();
+ for (uint8 i = 0; i < MAX_DIFFICULTY - 1; ++i)
+ cInfo->DifficultyEntry[i] = fields[0 + i].GetUInt32();
+
+ for (uint8 i = 0; i < MAX_KILL_CREDIT; ++i)
+ cInfo->KillCredit[i] = fields[3 + i].GetUInt32();
+
cInfo->Modelid1 = fields[5].GetUInt32();
cInfo->Modelid2 = fields[6].GetUInt32();
cInfo->Modelid3 = fields[7].GetUInt32();
@@ -458,27 +446,27 @@ public:
cInfo->minlevel = fields[13].GetUInt8();
cInfo->maxlevel = fields[14].GetUInt8();
cInfo->expansion = fields[15].GetUInt16();
- cInfo->faction_A = fields[16].GetUInt16();
- cInfo->faction_H = fields[17].GetUInt16();
- cInfo->npcflag = fields[18].GetUInt32();
- cInfo->speed_walk = fields[19].GetFloat();
- cInfo->speed_run = fields[20].GetFloat();
- cInfo->scale = fields[21].GetFloat();
- cInfo->rank = fields[22].GetUInt8();
- cInfo->mindmg = fields[23].GetFloat();
- cInfo->maxdmg = fields[24].GetFloat();
- cInfo->dmgschool = fields[25].GetUInt8();
- cInfo->attackpower = fields[26].GetUInt32();
- cInfo->dmg_multiplier = fields[27].GetFloat();
- cInfo->baseattacktime = fields[28].GetUInt32();
- cInfo->rangeattacktime = fields[29].GetUInt32();
- cInfo->unit_class = fields[30].GetUInt8();
- cInfo->unit_flags = fields[31].GetUInt32();
- cInfo->unit_flags2 = fields[32].GetUInt32();
- cInfo->dynamicflags = fields[33].GetUInt32();
- cInfo->family = fields[34].GetUInt8();
- cInfo->trainer_type = fields[35].GetUInt8();
- cInfo->trainer_spell = fields[36].GetUInt32();
+ cInfo->expansionUnknown = fields[16].GetUInt16();
+ cInfo->faction_A = fields[17].GetUInt16();
+ cInfo->faction_H = fields[18].GetUInt16();
+ cInfo->npcflag = fields[19].GetUInt32();
+ cInfo->speed_walk = fields[20].GetFloat();
+ cInfo->speed_run = fields[21].GetFloat();
+ cInfo->scale = fields[22].GetFloat();
+ cInfo->rank = fields[23].GetUInt8();
+ cInfo->mindmg = fields[24].GetFloat();
+ cInfo->maxdmg = fields[25].GetFloat();
+ cInfo->dmgschool = fields[26].GetUInt8();
+ cInfo->attackpower = fields[27].GetUInt32();
+ cInfo->dmg_multiplier = fields[28].GetFloat();
+ cInfo->baseattacktime = fields[29].GetUInt32();
+ cInfo->rangeattacktime = fields[30].GetUInt32();
+ cInfo->unit_class = fields[31].GetUInt8();
+ cInfo->unit_flags = fields[32].GetUInt32();
+ cInfo->unit_flags2 = fields[33].GetUInt32();
+ cInfo->dynamicflags = fields[34].GetUInt32();
+ cInfo->family = fields[35].GetUInt8();
+ cInfo->trainer_type = fields[36].GetUInt8();
cInfo->trainer_class = fields[37].GetUInt8();
cInfo->trainer_race = fields[38].GetUInt8();
cInfo->minrangedmg = fields[39].GetFloat();
@@ -486,44 +474,39 @@ public:
cInfo->rangedattackpower = fields[41].GetUInt16();
cInfo->type = fields[42].GetUInt8();
cInfo->type_flags = fields[43].GetUInt32();
- cInfo->lootid = fields[44].GetUInt32();
- cInfo->pickpocketLootId = fields[45].GetUInt32();
- cInfo->SkinLootId = fields[46].GetUInt32();
+ cInfo->type_flags2 = fields[44].GetUInt32();
+ cInfo->lootid = fields[45].GetUInt32();
+ cInfo->pickpocketLootId = fields[46].GetUInt32();
+ cInfo->SkinLootId = fields[47].GetUInt32();
for (uint8 i = SPELL_SCHOOL_HOLY; i < MAX_SPELL_SCHOOL; ++i)
- cInfo->resistance[i] = fields[47 + i -1].GetUInt16();
-
- cInfo->spells[0] = fields[53].GetUInt32();
- cInfo->spells[1] = fields[54].GetUInt32();
- cInfo->spells[2] = fields[55].GetUInt32();
- cInfo->spells[3] = fields[56].GetUInt32();
- cInfo->spells[4] = fields[57].GetUInt32();
- cInfo->spells[5] = fields[58].GetUInt32();
- cInfo->spells[6] = fields[59].GetUInt32();
- cInfo->spells[7] = fields[60].GetUInt32();
- cInfo->PetSpellDataId = fields[61].GetUInt32();
- cInfo->VehicleId = fields[62].GetUInt32();
- cInfo->mingold = fields[63].GetUInt32();
- cInfo->maxgold = fields[64].GetUInt32();
- cInfo->AIName = fields[65].GetString();
- cInfo->MovementType = fields[66].GetUInt8();
- cInfo->InhabitType = fields[67].GetUInt8();
- cInfo->HoverHeight = fields[68].GetFloat();
- cInfo->ModHealth = fields[69].GetFloat();
- cInfo->ModMana = fields[70].GetFloat();
- cInfo->ModArmor = fields[71].GetFloat();
- cInfo->RacialLeader = fields[72].GetBool();
- cInfo->questItems[0] = fields[73].GetUInt32();
- cInfo->questItems[1] = fields[74].GetUInt32();
- cInfo->questItems[2] = fields[75].GetUInt32();
- cInfo->questItems[3] = fields[76].GetUInt32();
- cInfo->questItems[4] = fields[77].GetUInt32();
- cInfo->questItems[5] = fields[78].GetUInt32();
- cInfo->movementId = fields[79].GetUInt32();
- cInfo->RegenHealth = fields[80].GetBool();
- cInfo->MechanicImmuneMask = fields[81].GetUInt32();
- cInfo->flags_extra = fields[82].GetUInt32();
- cInfo->ScriptID = sObjectMgr->GetScriptId(fields[83].GetCString());
+ cInfo->resistance[i] = fields[48 + i -1].GetUInt16();
+
+ for (uint8 i = 0; i < CREATURE_MAX_SPELLS; ++i)
+ cInfo->spells[i] = fields[54 + i].GetUInt32();
+
+ cInfo->PetSpellDataId = fields[62].GetUInt32();
+ cInfo->VehicleId = fields[63].GetUInt32();
+ cInfo->mingold = fields[64].GetUInt32();
+ cInfo->maxgold = fields[65].GetUInt32();
+ cInfo->AIName = fields[66].GetString();
+ cInfo->MovementType = fields[67].GetUInt8();
+ cInfo->InhabitType = fields[68].GetUInt8();
+ cInfo->HoverHeight = fields[69].GetFloat();
+ cInfo->ModHealth = fields[70].GetFloat();
+ cInfo->ModMana = fields[71].GetFloat();
+ cInfo->ModManaExtra = fields[72].GetFloat();
+ cInfo->ModArmor = fields[73].GetFloat();
+ cInfo->RacialLeader = fields[74].GetBool();
+
+ for (uint8 i = 0; i < MAX_CREATURE_QUEST_ITEMS; ++i)
+ cInfo->questItems[i] = fields[75 + i].GetUInt32();
+
+ cInfo->movementId = fields[81].GetUInt32();
+ cInfo->RegenHealth = fields[82].GetBool();
+ cInfo->MechanicImmuneMask = fields[83].GetUInt32();
+ cInfo->flags_extra = fields[84].GetUInt32();
+ cInfo->ScriptID = sObjectMgr->GetScriptId(fields[85].GetCString());
sObjectMgr->CheckCreatureTemplate(cInfo);
}
@@ -953,14 +936,6 @@ public:
return true;
}
- static bool HandleReloadItemSetNamesCommand(ChatHandler* handler, const char* /*args*/)
- {
- TC_LOG_INFO(LOG_FILTER_GENERAL, "Re-Loading Item set names...");
- sObjectMgr->LoadItemSetNames();
- handler->SendGlobalGMSysMessage("DB table `item_set_names` reloaded.");
- return true;
- }
-
static bool HandleReloadEventScriptsCommand(ChatHandler* handler, const char* args)
{
if (sScriptMgr->IsScriptScheduled())
@@ -1014,23 +989,6 @@ public:
return true;
}
- static bool HandleReloadEventAITextsCommand(ChatHandler* handler, const char* /*args*/)
- {
-
- TC_LOG_INFO(LOG_FILTER_GENERAL, "Re-Loading Texts from `creature_ai_texts`...");
- sEventAIMgr->LoadCreatureEventAI_Texts();
- handler->SendGlobalGMSysMessage("DB table `creature_ai_texts` reloaded.");
- return true;
- }
-
- static bool HandleReloadEventAIScriptsCommand(ChatHandler* handler, const char* /*args*/)
- {
- TC_LOG_INFO(LOG_FILTER_GENERAL, "Re-Loading Scripts from `creature_ai_scripts`...");
- sEventAIMgr->LoadCreatureEventAI_Scripts();
- handler->SendGlobalGMSysMessage("DB table `creature_ai_scripts` reloaded.");
- return true;
- }
-
static bool HandleReloadSpellScriptsCommand(ChatHandler* handler, const char* args)
{
if (sScriptMgr->IsScriptScheduled())
@@ -1147,14 +1105,6 @@ public:
return true;
}
- static bool HandleReloadLocalesItemSetNameCommand(ChatHandler* handler, const char* /*args*/)
- {
- TC_LOG_INFO(LOG_FILTER_GENERAL, "Re-Loading Locales Item set name... ");
- sObjectMgr->LoadItemSetNameLocales();
- handler->SendGlobalGMSysMessage("DB table `locales_item_set_name` reloaded.");
- return true;
- }
-
static bool HandleReloadLocalesNpcTextCommand(ChatHandler* handler, const char* /*args*/)
{
TC_LOG_INFO(LOG_FILTER_GENERAL, "Re-Loading Locales NPC Text ... ");
@@ -1245,6 +1195,16 @@ public:
return true;
}
+
+ static bool HandleReloadPhaseDefinitionsCommand(ChatHandler* handler, const char* /*args*/)
+ {
+ TC_LOG_INFO(LOG_FILTER_GENERAL, "Reloading phase_definitions table...");
+ sObjectMgr->LoadPhaseDefinitions();
+ sWorld->UpdatePhaseDefinitions();
+ handler->SendGlobalGMSysMessage("Phase Definitions reloaded.");
+ return true;
+ }
+
static bool HandleReloadRBACCommand(ChatHandler* handler, const char* /*args*/)
{
TC_LOG_INFO(LOG_FILTER_GENERAL, "Reloading RBAC tables...");
diff --git a/src/server/scripts/Commands/cs_reset.cpp b/src/server/scripts/Commands/cs_reset.cpp
index c1bffc6c349..f3427401258 100644
--- a/src/server/scripts/Commands/cs_reset.cpp
+++ b/src/server/scripts/Commands/cs_reset.cpp
@@ -66,7 +66,7 @@ public:
if (target)
target->ResetAchievements();
else
- AchievementMgr::DeleteFromDB(GUID_LOPART(targetGuid));
+ AchievementMgr<Player>::DeleteFromDB(GUID_LOPART(targetGuid));
return true;
}
@@ -77,11 +77,8 @@ public:
if (!handler->extractPlayerTarget((char*)args, &target))
return false;
- target->SetHonorPoints(0);
target->SetUInt32Value(PLAYER_FIELD_KILLS, 0);
target->SetUInt32Value(PLAYER_FIELD_LIFETIME_HONORABLE_KILLS, 0);
- target->SetUInt32Value(PLAYER_FIELD_TODAY_CONTRIBUTION, 0);
- target->SetUInt32Value(PLAYER_FIELD_YESTERDAY_CONTRIBUTION, 0);
target->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_EARN_HONORABLE_KILL);
return true;
@@ -233,7 +230,7 @@ public:
if (target)
{
- target->resetTalents(true);
+ target->ResetTalents(true);
target->SendTalentsInfoData(false);
ChatHandler(target->GetSession()).SendSysMessage(LANG_RESET_TALENTS);
if (!handler->GetSession() || handler->GetSession()->GetPlayer() != target)
diff --git a/src/server/scripts/Commands/cs_titles.cpp b/src/server/scripts/Commands/cs_titles.cpp
index 4c80f669312..bad3b8c0318 100644
--- a/src/server/scripts/Commands/cs_titles.cpp
+++ b/src/server/scripts/Commands/cs_titles.cpp
@@ -96,7 +96,7 @@ public:
target->SetTitle(titleInfo); // to be sure that title now known
target->SetUInt32Value(PLAYER_CHOSEN_TITLE, titleInfo->bit_index);
- handler->PSendSysMessage(LANG_TITLE_CURRENT_RES, id, titleInfo->name[handler->GetSessionDbcLocale()], tNameLink.c_str());
+ handler->PSendSysMessage(LANG_TITLE_CURRENT_RES, id, titleInfo->name, tNameLink.c_str());
return true;
}
@@ -139,7 +139,7 @@ public:
std::string tNameLink = handler->GetNameLink(target);
char titleNameStr[80];
- snprintf(titleNameStr, 80, titleInfo->name[handler->GetSessionDbcLocale()], target->GetName().c_str());
+ snprintf(titleNameStr, 80, titleInfo->name, target->GetName().c_str());
target->SetTitle(titleInfo);
handler->PSendSysMessage(LANG_TITLE_ADD_RES, id, titleNameStr, tNameLink.c_str());
@@ -187,7 +187,7 @@ public:
std::string tNameLink = handler->GetNameLink(target);
char titleNameStr[80];
- snprintf(titleNameStr, 80, titleInfo->name[handler->GetSessionDbcLocale()], target->GetName().c_str());
+ snprintf(titleNameStr, 80, titleInfo->name, target->GetName().c_str());
handler->PSendSysMessage(LANG_TITLE_REMOVE_RES, id, titleNameStr, tNameLink.c_str());
diff --git a/src/server/scripts/Commands/cs_wp.cpp b/src/server/scripts/Commands/cs_wp.cpp
index b7a89ceb325..745cc80ab41 100644
--- a/src/server/scripts/Commands/cs_wp.cpp
+++ b/src/server/scripts/Commands/cs_wp.cpp
@@ -241,40 +241,44 @@ public:
if (!target)
{
- handler->PSendSysMessage("%s%s|r", "|cff33ffff", "You must select target.");
+ handler->PSendSysMessage("%s%s|r", "|cff33ffff", "You must select a target.");
return true;
}
- uint32 guildLow = target->GetDBTableGUIDLow();
+ uint32 guidLow = target->GetDBTableGUIDLow();
+ if (guidLow == 0)
+ {
+ handler->PSendSysMessage("%s%s|r", "|cffff33ff", "Target is not saved to DB.");
+ return true;
+ }
- if (target->GetCreatureAddon())
+ CreatureAddon const* addon = sObjectMgr->GetCreatureAddon(guidLow);
+ if (!addon || addon->path_id == 0)
{
- if (target->GetCreatureAddon()->path_id != 0)
- {
- PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_DEL_CREATURE_ADDON);
+ handler->PSendSysMessage("%s%s|r", "|cffff33ff", "Target does not have a loaded path.");
+ return true;
+ }
- stmt->setUInt32(0, guildLow);
+ PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_DEL_CREATURE_ADDON);
- WorldDatabase.Execute(stmt);
+ stmt->setUInt32(0, guidLow);
+
+ WorldDatabase.Execute(stmt);
- target->UpdateWaypointID(0);
+ target->UpdateWaypointID(0);
- stmt = WorldDatabase.GetPreparedStatement(WORLD_UPD_CREATURE_MOVEMENT_TYPE);
+ stmt = WorldDatabase.GetPreparedStatement(WORLD_UPD_CREATURE_MOVEMENT_TYPE);
- stmt->setUInt8(0, uint8(IDLE_MOTION_TYPE));
- stmt->setUInt32(1, guildLow);
+ stmt->setUInt8(0, uint8(IDLE_MOTION_TYPE));
+ stmt->setUInt32(1, guidLow);
- WorldDatabase.Execute(stmt);
+ WorldDatabase.Execute(stmt);
- target->LoadPath(0);
- target->SetDefaultMovementType(IDLE_MOTION_TYPE);
- target->GetMotionMaster()->MoveTargetedHome();
- target->GetMotionMaster()->Initialize();
- target->MonsterSay("Path unloaded.", 0, 0);
- return true;
- }
- handler->PSendSysMessage("%s%s|r", "|cffff33ff", "Target have no loaded path.");
- }
+ target->LoadPath(0);
+ target->SetDefaultMovementType(IDLE_MOTION_TYPE);
+ target->GetMotionMaster()->MoveTargetedHome();
+ target->GetMotionMaster()->Initialize();
+ target->MonsterSay("Path unloaded.", 0, 0);
return true;
}
@@ -690,7 +694,7 @@ public:
}
// re-create
Creature* wpCreature2 = new Creature;
- if (!wpCreature2->Create(sObjectMgr->GenerateLowGuid(HIGHGUID_UNIT), map, chr->GetPhaseMaskForSpawn(), VISUAL_WAYPOINT, 0, 0, chr->GetPositionX(), chr->GetPositionY(), chr->GetPositionZ(), chr->GetOrientation()))
+ if (!wpCreature2->Create(sObjectMgr->GenerateLowGuid(HIGHGUID_UNIT), map, chr->GetPhaseMgr().GetPhaseMaskForSpawn(), VISUAL_WAYPOINT, 0, 0, chr->GetPositionX(), chr->GetPositionY(), chr->GetPositionZ(), chr->GetOrientation()))
{
handler->PSendSysMessage(LANG_WAYPOINT_VP_NOTCREATED, VISUAL_WAYPOINT);
delete wpCreature2;
@@ -698,7 +702,7 @@ public:
return false;
}
- wpCreature2->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), chr->GetPhaseMaskForSpawn());
+ wpCreature2->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), chr->GetPhaseMgr().GetPhaseMaskForSpawn());
// To call _LoadGoods(); _LoadQuests(); CreateTrainerSpells();
/// @todo Should we first use "Create" then use "LoadFromDB"?
if (!wpCreature2->LoadCreatureFromDB(wpCreature2->GetDBTableGUIDLow(), map))
@@ -914,7 +918,7 @@ public:
float o = chr->GetOrientation();
Creature* wpCreature = new Creature;
- if (!wpCreature->Create(sObjectMgr->GenerateLowGuid(HIGHGUID_UNIT), map, chr->GetPhaseMaskForSpawn(), id, 0, 0, x, y, z, o))
+ if (!wpCreature->Create(sObjectMgr->GenerateLowGuid(HIGHGUID_UNIT), map, chr->GetPhaseMgr().GetPhaseMaskForSpawn(), id, 0, 0, x, y, z, o))
{
handler->PSendSysMessage(LANG_WAYPOINT_VP_NOTCREATED, id);
delete wpCreature;
@@ -930,7 +934,7 @@ public:
WorldDatabase.Execute(stmt);
- wpCreature->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), chr->GetPhaseMaskForSpawn());
+ wpCreature->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), chr->GetPhaseMgr().GetPhaseMaskForSpawn());
// To call _LoadGoods(); _LoadQuests(); CreateTrainerSpells();
if (!wpCreature->LoadCreatureFromDB(wpCreature->GetDBTableGUIDLow(), map))
{
@@ -978,14 +982,14 @@ public:
Map* map = chr->GetMap();
Creature* creature = new Creature;
- if (!creature->Create(sObjectMgr->GenerateLowGuid(HIGHGUID_UNIT), map, chr->GetPhaseMaskForSpawn(), id, 0, 0, x, y, z, o))
+ if (!creature->Create(sObjectMgr->GenerateLowGuid(HIGHGUID_UNIT), map, chr->GetPhaseMgr().GetPhaseMaskForSpawn(), id, 0, 0, x, y, z, o))
{
handler->PSendSysMessage(LANG_WAYPOINT_VP_NOTCREATED, id);
delete creature;
return false;
}
- creature->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), chr->GetPhaseMaskForSpawn());
+ creature->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), chr->GetPhaseMgr().GetPhaseMaskForSpawn());
if (!creature->LoadCreatureFromDB(creature->GetDBTableGUIDLow(), map))
{
handler->PSendSysMessage(LANG_WAYPOINT_VP_NOTCREATED, id);
@@ -1027,14 +1031,14 @@ public:
Map* map = chr->GetMap();
Creature* creature = new Creature;
- if (!creature->Create(sObjectMgr->GenerateLowGuid(HIGHGUID_UNIT), map, chr->GetPhaseMaskForSpawn(), id, 0, 0, x, y, z, o))
+ if (!creature->Create(sObjectMgr->GenerateLowGuid(HIGHGUID_UNIT), map, chr->GetPhaseMgr().GetPhaseMaskForSpawn(), id, 0, 0, x, y, z, o))
{
handler->PSendSysMessage(LANG_WAYPOINT_NOTCREATED, id);
delete creature;
return false;
}
- creature->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), chr->GetPhaseMaskForSpawn());
+ creature->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), chr->GetPhaseMgr().GetPhaseMaskForSpawn());
if (!creature->LoadCreatureFromDB(creature->GetDBTableGUIDLow(), map))
{
handler->PSendSysMessage(LANG_WAYPOINT_NOTCREATED, id);
diff --git a/src/server/scripts/EasternKingdoms/BaradinHold/baradin_hold.h b/src/server/scripts/EasternKingdoms/BaradinHold/baradin_hold.h
new file mode 100644
index 00000000000..77554d29d15
--- /dev/null
+++ b/src/server/scripts/EasternKingdoms/BaradinHold/baradin_hold.h
@@ -0,0 +1,47 @@
+/*
+* Copyright (C) 2008-2013 TrinityCore <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 3 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, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef DEF_BARADIN_HOLD_H_
+#define DEF_BARADIN_HOLD_H_
+
+#define MAX_ENCOUNTERS 3
+
+enum Creatures
+{
+ BOSS_ARGALOTH = 47120,
+ BOSS_OCCUTHAR = 52363,
+ BOSS_ALIZABAL = 55869,
+
+ NPC_EYE_OF_OCCUTHAR = 52389,
+ NPC_FOCUS_FIRE_DUMMY = 52369,
+ NPC_OCCUTHAR_EYE = 52368,
+};
+
+enum Objects
+{
+ GO_ARGALOTH_DOOR = 207619,
+ GO_OCCUTHAR_DOOR = 208953,
+};
+
+enum Data
+{
+ DATA_ARGALOTH = 1,
+ DATA_OCCUTHAR = 2,
+ DATA_ALIZABAL = 3,
+};
+
+#endif
diff --git a/src/server/scripts/EasternKingdoms/BaradinHold/boss_alizabal.cpp b/src/server/scripts/EasternKingdoms/BaradinHold/boss_alizabal.cpp
new file mode 100644
index 00000000000..d22ce24083b
--- /dev/null
+++ b/src/server/scripts/EasternKingdoms/BaradinHold/boss_alizabal.cpp
@@ -0,0 +1,271 @@
+/*
+* Copyright (C) 2008-2013 TrinityCore <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, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "baradin_hold.h"
+#include "InstanceScript.h"
+#include "ScriptMgr.h"
+#include "Player.h"
+#include "ObjectAccessor.h"
+#include "ScriptedCreature.h"
+
+enum Texts
+{
+ SAY_INTRO = 1,
+ SAY_AGGRO = 2,
+ SAY_HATE = 3,
+ SAY_SKEWER = 4,
+ SAY_SKEWER_ANNOUNCE = 5,
+ SAY_BLADE_STORM = 6,
+ SAY_SLAY = 10,
+ SAY_DEATH = 12,
+};
+
+enum Spells
+{
+ SPELL_BLADE_DANCE = 105784,
+ SPELL_BLADE_DANCE_DUMMY = 105828,
+ SPELL_SEETHING_HATE = 105067,
+ SPELL_SKEWER = 104936,
+ SPELL_BERSERK = 47008,
+};
+
+enum Actions
+{
+ ACTION_INTRO = 1,
+};
+
+enum Points
+{
+ POINT_STORM = 1,
+};
+
+enum Events
+{
+ EVENT_RANDOM_CAST = 1,
+ EVENT_STOP_STORM = 2,
+ EVENT_MOVE_STORM = 3,
+ EVENT_CAST_STORM = 4,
+};
+
+class at_alizabal_intro : public AreaTriggerScript
+{
+ public:
+ at_alizabal_intro() : AreaTriggerScript("at_alizabal_intro") { }
+
+ bool OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/)
+ {
+ if (InstanceScript* instance = player->GetInstanceScript())
+ if (Creature* alizabal = ObjectAccessor::GetCreature(*player, instance->GetData64(DATA_ALIZABAL)))
+ alizabal->AI()->DoAction(ACTION_INTRO);
+ return true;
+ }
+};
+
+class boss_alizabal : public CreatureScript
+{
+ public:
+ boss_alizabal() : CreatureScript("boss_alizabal") { }
+
+ struct boss_alizabalAI : public BossAI
+ {
+ boss_alizabalAI(Creature* creature) : BossAI(creature, DATA_ALIZABAL)
+ {
+ Intro = false;
+ Hate = false;
+ Skewer = false;
+ }
+
+ bool Intro;
+ bool Hate;
+ bool Skewer;
+
+ void Reset()
+ {
+ _Reset();
+ Hate = false;
+ Skewer = false;
+ }
+
+ void EnterCombat(Unit* /*who*/)
+ {
+ _EnterCombat();
+ Talk(SAY_AGGRO);
+ instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me);
+ events.ScheduleEvent(EVENT_RANDOM_CAST, 10000);
+ }
+
+ void JustDied(Unit* /*killer*/)
+ {
+ _JustDied();
+ Talk(SAY_DEATH);
+ instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
+ }
+
+ void KilledUnit(Unit* who)
+ {
+ if (who->GetTypeId() == TYPEID_PLAYER)
+ Talk(SAY_SLAY);
+ }
+
+ void EnterEvadeMode()
+ {
+ instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
+ me->GetMotionMaster()->MoveTargetedHome();
+ _DespawnAtEvade();
+ }
+
+ void DoAction(int32 action)
+ {
+ switch (action)
+ {
+ case ACTION_INTRO:
+ if (!Intro)
+ {
+ Talk(SAY_INTRO);
+ Intro = true;
+ }
+ break;
+ }
+ }
+
+ void MovementInform(uint32 /*type*/, uint32 pointId)
+ {
+ switch (pointId)
+ {
+ case POINT_STORM:
+ events.ScheduleEvent(EVENT_CAST_STORM, 1);
+ break;
+ }
+ }
+
+ void UpdateAI(uint32 diff)
+ {
+ if (!UpdateVictim())
+ return;
+
+ events.Update(diff);
+
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_RANDOM_CAST:
+ switch (urand(0, 1))
+ {
+ case 0:
+ if (!Skewer)
+ {
+ if (Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, 0))
+ {
+ DoCast(target, SPELL_SKEWER, true);
+ Talk(SAY_SKEWER);
+ Talk(SAY_SKEWER_ANNOUNCE, target->GetGUID());
+ }
+ Skewer = true;
+ events.ScheduleEvent(EVENT_RANDOM_CAST, urand(7000, 10000));
+ }
+ else if (!Hate)
+ {
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, NonTankTargetSelector(me)))
+ {
+ DoCast(target, SPELL_SEETHING_HATE, true);
+ Talk(SAY_HATE);
+ }
+ Hate = true;
+ events.ScheduleEvent(EVENT_RANDOM_CAST, urand(7000, 10000));
+ }
+ else if (Hate && Skewer)
+ {
+ Talk(SAY_BLADE_STORM);
+ DoCastAOE(SPELL_BLADE_DANCE_DUMMY);
+ DoCastAOE(SPELL_BLADE_DANCE);
+ events.ScheduleEvent(EVENT_RANDOM_CAST, 21000);
+ events.ScheduleEvent(EVENT_MOVE_STORM, 4050);
+ events.ScheduleEvent(EVENT_STOP_STORM, 13000);
+ }
+ break;
+ case 1:
+ if (!Hate)
+ {
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, NonTankTargetSelector(me)))
+ {
+ DoCast(target, SPELL_SEETHING_HATE, true);
+ Talk(SAY_HATE);
+ }
+ Hate = true;
+ events.ScheduleEvent(EVENT_RANDOM_CAST, urand(7000, 10000));
+ }
+ else if (!Skewer)
+ {
+ if (Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, 0))
+ {
+ DoCast(target, SPELL_SKEWER, true);
+ Talk(SAY_SKEWER);
+ Talk(SAY_SKEWER_ANNOUNCE, target->GetGUID());
+ }
+ Skewer = true;
+ events.ScheduleEvent(EVENT_RANDOM_CAST, urand(7000, 10000));
+ }
+ else if (Hate && Skewer)
+ {
+ Talk(SAY_BLADE_STORM);
+ DoCastAOE(SPELL_BLADE_DANCE_DUMMY);
+ DoCastAOE(SPELL_BLADE_DANCE);
+ events.ScheduleEvent(EVENT_RANDOM_CAST, 21000);
+ events.ScheduleEvent(EVENT_MOVE_STORM, 4050);
+ events.ScheduleEvent(EVENT_STOP_STORM, 13000);
+ }
+ break;
+ }
+ break;
+ case EVENT_MOVE_STORM:
+ me->SetSpeed(MOVE_RUN, 4.0f);
+ me->SetSpeed(MOVE_WALK, 4.0f);
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, NonTankTargetSelector(me)))
+ me->GetMotionMaster()->MovePoint(POINT_STORM, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ());
+ events.ScheduleEvent(EVENT_MOVE_STORM, 4050);
+ break;
+ case EVENT_STOP_STORM:
+ me->RemoveAura(SPELL_BLADE_DANCE);
+ me->RemoveAura(SPELL_BLADE_DANCE_DUMMY);
+ me->SetSpeed(MOVE_WALK, 1.0f);
+ me->SetSpeed(MOVE_RUN, 1.14f);
+ me->GetMotionMaster()->MoveChase(me->GetVictim());
+ Hate = false;
+ Skewer = false;
+ break;
+ case EVENT_CAST_STORM:
+ DoCastAOE(SPELL_BLADE_DANCE);
+ break;
+ }
+ }
+
+ DoMeleeAttackIfReady();
+ }
+ };
+
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return new boss_alizabalAI(creature);
+ }
+};
+
+void AddSC_boss_alizabal()
+{
+ new boss_alizabal();
+ new at_alizabal_intro();
+}
diff --git a/src/server/scripts/EasternKingdoms/BaradinHold/instance_baradin_hold.cpp b/src/server/scripts/EasternKingdoms/BaradinHold/instance_baradin_hold.cpp
new file mode 100644
index 00000000000..0e2b7107548
--- /dev/null
+++ b/src/server/scripts/EasternKingdoms/BaradinHold/instance_baradin_hold.cpp
@@ -0,0 +1,171 @@
+/*
+* Copyright (C) 2008-2013 TrinityCore <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 3 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, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "baradin_hold.h"
+#include "InstanceScript.h"
+#include "ScriptMgr.h"
+
+DoorData const doorData[] =
+{
+ {GO_ARGALOTH_DOOR, DATA_ARGALOTH, DOOR_TYPE_ROOM, BOUNDARY_NONE},
+ {GO_OCCUTHAR_DOOR, DATA_OCCUTHAR, DOOR_TYPE_ROOM, BOUNDARY_NONE},
+};
+
+class instance_baradin_hold: public InstanceMapScript
+{
+public:
+ instance_baradin_hold() : InstanceMapScript("instance_baradin_hold", 757) { }
+
+ InstanceScript* GetInstanceScript(InstanceMap* map) const
+ {
+ return new instance_baradin_hold_InstanceMapScript(map);
+ }
+
+ struct instance_baradin_hold_InstanceMapScript: public InstanceScript
+ {
+ instance_baradin_hold_InstanceMapScript(InstanceMap* map) : InstanceScript(map)
+ {
+ SetBossNumber(MAX_ENCOUNTERS);
+ LoadDoorData(doorData);
+ _argalothGUID = 0;
+ _occutharGUID = 0;
+ _alizabalGUID = 0;
+ _argalothDoor = 0;
+ _occutharDoor = 0;
+ }
+
+ void Initialize()
+ {
+ }
+
+ void OnCreatureCreate(Creature* creature)
+ {
+ switch(creature->GetEntry())
+ {
+ case BOSS_ARGALOTH:
+ _argalothGUID = creature->GetGUID();
+ break;
+ case BOSS_OCCUTHAR:
+ _occutharGUID = creature->GetGUID();
+ break;
+ case BOSS_ALIZABAL:
+ _alizabalGUID = creature->GetGUID();
+ break;
+ }
+ }
+
+ void OnGameObjectCreate(GameObject* go)
+ {
+ switch(go->GetEntry())
+ {
+ case GO_ARGALOTH_DOOR:
+ _argalothDoor = go->GetGUID();
+ AddDoor(go, true);
+ break;
+ case GO_OCCUTHAR_DOOR:
+ _occutharDoor = go->GetGUID();
+ AddDoor(go, true);
+ break;
+ }
+ }
+
+ uint64 GetData64(uint32 data) const
+ {
+ switch (data)
+ {
+ case DATA_ARGALOTH:
+ return _argalothGUID;
+ case DATA_OCCUTHAR:
+ return _occutharGUID;
+ case DATA_ALIZABAL:
+ return _alizabalGUID;
+ default:
+ break;
+ }
+
+ return 0;
+ }
+
+ void OnGameObjectRemove(GameObject* go)
+ {
+ switch(go->GetEntry())
+ {
+ case GO_ARGALOTH_DOOR:
+ AddDoor(go, false);
+ break;
+ case GO_OCCUTHAR_DOOR:
+ AddDoor(go, false);
+ break;
+ }
+ }
+
+ std::string GetSaveData()
+ {
+ OUT_SAVE_INST_DATA;
+
+ std::ostringstream saveStream;
+ saveStream << "B H " << GetBossSaveData();
+
+ 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 == 'B' && dataHead2 == 'H')
+ {
+ for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i)
+ {
+ uint32 tmpState;
+ loadStream >> tmpState;
+ if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
+ tmpState = NOT_STARTED;
+
+ SetBossState(i, EncounterState(tmpState));
+ }
+
+ } else OUT_LOAD_INST_DATA_FAIL;
+
+ OUT_LOAD_INST_DATA_COMPLETE;
+ }
+
+ private:
+ uint64 _argalothGUID;
+ uint64 _occutharGUID;
+ uint64 _alizabalGUID;
+ uint64 _argalothDoor;
+ uint64 _occutharDoor;
+ };
+};
+
+void AddSC_instance_baradin_hold()
+{
+ new instance_baradin_hold();
+}
diff --git a/src/server/scripts/EasternKingdoms/BlackwingLair/boss_nefarian.cpp b/src/server/scripts/EasternKingdoms/BlackwingLair/boss_nefarian.cpp
index 6f90f61f420..97595e55b5e 100644
--- a/src/server/scripts/EasternKingdoms/BlackwingLair/boss_nefarian.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackwingLair/boss_nefarian.cpp
@@ -263,8 +263,7 @@ public:
case EVENT_SUCCESS_1:
if (Unit* player = me->SelectNearestPlayer(60.0f))
{
- me->SetInFront(player);
- me->SendMovementFlagUpdate();
+ me->SetFacingToObject(player);
Talk(SAY_SUCCESS);
if (GameObject* portcullis1 = me->FindNearestGameObject(GO_PORTCULLIS_ACTIVE, 65.0f))
portcullis1->SetGoState(GO_STATE_ACTIVE);
diff --git a/src/server/scripts/EasternKingdoms/CMakeLists.txt b/src/server/scripts/EasternKingdoms/CMakeLists.txt
index 41d6179b169..f4f835f5768 100644
--- a/src/server/scripts/EasternKingdoms/CMakeLists.txt
+++ b/src/server/scripts/EasternKingdoms/CMakeLists.txt
@@ -17,6 +17,8 @@ set(scripts_STAT_SRCS
EasternKingdoms/AlteracValley/boss_drekthar.cpp
EasternKingdoms/AlteracValley/boss_vanndar.cpp
EasternKingdoms/AlteracValley/alterac_valley.cpp
+ EasternKingdoms/BaradinHold/boss_alizabal.cpp
+ EasternKingdoms/BaradinHold/instance_baradin_hold.cpp
EasternKingdoms/Scholomance/boss_the_ravenian.cpp
EasternKingdoms/Scholomance/boss_instructor_malicia.cpp
EasternKingdoms/Scholomance/boss_death_knight_darkreaver.cpp
@@ -33,22 +35,17 @@ set(scripts_STAT_SRCS
EasternKingdoms/Scholomance/boss_ras_frostwhisper.cpp
EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp
EasternKingdoms/zone_isle_of_queldanas.cpp
- EasternKingdoms/boss_kruul.cpp
- EasternKingdoms/ZulGurub/boss_hakkar.cpp
- EasternKingdoms/ZulGurub/boss_mandokir.cpp
- EasternKingdoms/ZulGurub/boss_marli.cpp
- EasternKingdoms/ZulGurub/boss_hazzarah.cpp
- EasternKingdoms/ZulGurub/boss_jeklik.cpp
EasternKingdoms/ZulGurub/boss_grilek.cpp
- EasternKingdoms/ZulGurub/zulgurub.h
+ EasternKingdoms/ZulGurub/boss_hazzarah.cpp
+ EasternKingdoms/ZulGurub/boss_jindo_the_godbreaker.cpp
+ EasternKingdoms/ZulGurub/boss_kilnara.cpp
+ EasternKingdoms/ZulGurub/boss_mandokir.cpp
EasternKingdoms/ZulGurub/boss_renataki.cpp
- EasternKingdoms/ZulGurub/boss_arlokk.cpp
- EasternKingdoms/ZulGurub/boss_gahzranka.cpp
EasternKingdoms/ZulGurub/boss_venoxis.cpp
- EasternKingdoms/ZulGurub/instance_zulgurub.cpp
- EasternKingdoms/ZulGurub/boss_jindo.cpp
EasternKingdoms/ZulGurub/boss_wushoolay.cpp
- EasternKingdoms/ZulGurub/boss_thekal.cpp
+ EasternKingdoms/ZulGurub/boss_zanzil.cpp
+ EasternKingdoms/ZulGurub/instance_zulgurub.cpp
+ EasternKingdoms/ZulGurub/zulgurub.h
EasternKingdoms/zone_wetlands.cpp
EasternKingdoms/zone_arathi_highlands.cpp
EasternKingdoms/Gnomeregan/instance_gnomeregan.cpp
@@ -181,7 +178,7 @@ set(scripts_STAT_SRCS
EasternKingdoms/zone_stormwind_city.cpp
EasternKingdoms/ZulAman/boss_halazzi.cpp
EasternKingdoms/ZulAman/boss_hexlord.cpp
- EasternKingdoms/ZulAman/boss_zuljin.cpp
+ EasternKingdoms/ZulAman/boss_daakara.cpp
EasternKingdoms/ZulAman/boss_akilzon.cpp
EasternKingdoms/ZulAman/instance_zulaman.cpp
EasternKingdoms/ZulAman/boss_janalai.cpp
diff --git a/src/server/scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp b/src/server/scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp
index 210fb11a269..d9e355a0a1a 100644
--- a/src/server/scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp
+++ b/src/server/scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp
@@ -242,6 +242,7 @@ class instance_deadmines : public InstanceMapScript
{
WorldPacket data(SMSG_PLAY_SOUND, 4);
data << uint32(sound);
+ data << uint64(unit->GetGUID());
unit->SendMessageToSet(&data, false);
}
};
diff --git a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp
index 0f0810e128a..373d497e077 100644
--- a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp
+++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp
@@ -1033,6 +1033,8 @@ class npc_scarlet_miner : public CreatureScript
if (Unit* car = ObjectAccessor::GetCreature(*me, carGUID))
{
me->SetFacingToObject(car);
+ car->Relocate(car->GetPositionX(), car->GetPositionY(), me->GetPositionZ() + 1);
+ car->StopMoving();
car->RemoveAura(SPELL_CART_DRAG);
}
Talk(SAY_SCARLET_MINER_1);
diff --git a/src/server/scripts/EasternKingdoms/ScarletEnclave/zone_the_scarlet_enclave.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/zone_the_scarlet_enclave.cpp
index 21b8ede86fa..03edcaa882d 100644
--- a/src/server/scripts/EasternKingdoms/ScarletEnclave/zone_the_scarlet_enclave.cpp
+++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/zone_the_scarlet_enclave.cpp
@@ -99,7 +99,7 @@ public:
FlyBackTimer = 4500;
break;
case 2:
- if (!player->isRessurectRequested())
+ if (!player->IsRessurectRequested())
{
me->HandleEmoteCommand(EMOTE_ONESHOT_CUSTOM_SPELL_01);
DoCast(player, SPELL_REVIVE, true);
diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp
index d4769d48efe..12e80339ce6 100644
--- a/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp
@@ -1,6 +1,5 @@
/*
* Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
- * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
*
* 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
@@ -16,67 +15,19 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/* ScriptData
-SDName: boss_Akilzon
-SD%Complete: 75%
-SDComment: Missing timer for Call Lightning and Sound ID's
-SQLUpdate:
-#Temporary fix for Soaring Eagles
-
-EndScriptData */
-
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
-#include "GridNotifiers.h"
-#include "GridNotifiersImpl.h"
-#include "Cell.h"
-#include "CellImpl.h"
#include "zulaman.h"
-#include "Weather.h"
-
-enum Spells
-{
- SPELL_STATIC_DISRUPTION = 43622,
- SPELL_STATIC_VISUAL = 45265,
- SPELL_CALL_LIGHTNING = 43661, // Missing timer
- SPELL_GUST_OF_WIND = 43621,
- SPELL_ELECTRICAL_STORM = 43648,
- SPELL_BERSERK = 45078,
- SPELL_ELECTRICAL_OVERLOAD = 43658,
- SPELL_EAGLE_SWOOP = 44732,
- SPELL_ZAP = 43137,
- SPELL_SAND_STORM = 25160
-};
enum Says
{
- SAY_AGGRO = 0,
- SAY_SUMMON = 1,
- SAY_INTRO = 2, // Not used in script
- SAY_ENRAGE = 3,
- SAY_KILL = 4,
- SAY_DEATH = 5
-};
-
-enum Misc
-{
- NPC_SOARING_EAGLE = 24858,
- SE_LOC_X_MAX = 400,
- SE_LOC_X_MIN = 335,
- SE_LOC_Y_MAX = 1435,
- SE_LOC_Y_MIN = 1370
-};
-
-enum Events
-{
- EVENT_STATIC_DISRUPTION = 1,
- EVENT_GUST_OF_WIND = 2,
- EVENT_CALL_LIGHTNING = 3,
- EVENT_ELECTRICAL_STORM = 4,
- EVENT_RAIN = 5,
- EVENT_SUMMON_EAGLES = 6,
- EVENT_STORM_SEQUENCE = 7,
- EVENT_ENRAGE = 8
+ SAY_AGGRO = 0,
+ SAY_PLAYER_KILL = 1,
+ EMOTE_ELECTRICAL_STORM = 2,
+ SAY_SUMMON_EAGLE = 3,
+ SAY_SUMMON_BIRDS = 4,
+ SAY_BERSERK = 5,
+ SAY_DEATH = 6
};
class boss_akilzon : public CreatureScript
@@ -86,38 +37,17 @@ class boss_akilzon : public CreatureScript
struct boss_akilzonAI : public BossAI
{
- boss_akilzonAI(Creature* creature) : BossAI(creature, DATA_AKILZONEVENT)
- {
- memset(BirdGUIDs, 0, sizeof(BirdGUIDs));
- }
+ boss_akilzonAI(Creature* creature) : BossAI(creature, DATA_AKILZON) { }
void Reset()
{
_Reset();
-
- TargetGUID = 0;
- CloudGUID = 0;
- CycloneGUID = 0;
- memset(BirdGUIDs, 0, sizeof(BirdGUIDs));
- StormCount = 0;
- isRaining = false;
-
- SetWeather(WEATHER_STATE_FINE, 0.0f);
}
void EnterCombat(Unit* /*who*/)
{
- events.ScheduleEvent(EVENT_STATIC_DISRUPTION, urand(10000, 20000)); // 10 to 20 seconds (bosskillers)
- events.ScheduleEvent(EVENT_GUST_OF_WIND, urand(20000, 30000)); // 20 to 30 seconds(bosskillers)
- events.ScheduleEvent(EVENT_CALL_LIGHTNING, urand(10000, 20000)); // totaly random timer. can't find any info on this
- events.ScheduleEvent(EVENT_ELECTRICAL_STORM, 60000); // 60 seconds(bosskillers)
- events.ScheduleEvent(EVENT_RAIN, urand(47000, 52000));
- events.ScheduleEvent(EVENT_ENRAGE, 10*MINUTE*IN_MILLISECONDS); // 10 minutes till enrage(bosskillers)
-
Talk(SAY_AGGRO);
- //DoZoneInCombat();
- if (instance)
- instance->SetData(DATA_AKILZONEVENT, IN_PROGRESS);
+ _EnterCombat();
}
void JustDied(Unit* /*killer*/)
@@ -126,92 +56,10 @@ class boss_akilzon : public CreatureScript
_JustDied();
}
- void KilledUnit(Unit* /*victim*/)
+ void KilledUnit(Unit* victim)
{
- Talk(SAY_KILL);
- }
-
- void SetWeather(uint32 weather, float grade)
- {
- Map* map = me->GetMap();
- if (!map->IsDungeon())
- return;
-
- WorldPacket data(SMSG_WEATHER, (4+4+4));
- data << uint32(weather) << float(grade) << uint8(0);
-
- map->SendToPlayers(&data);
- }
-
- void HandleStormSequence(Unit* Cloud) // 1: begin, 2-9: tick, 10: end
- {
- if (StormCount < 10 && StormCount > 1)
- {
- // deal damage
- int32 bp0 = 800;
- for (uint8 i = 2; i < StormCount; ++i)
- bp0 *= 2;
-
- CellCoord p(Trinity::ComputeCellCoord(me->GetPositionX(), me->GetPositionY()));
- Cell cell(p);
- cell.SetNoCreate();
-
- std::list<Unit*> tempUnitMap;
-
- {
- Trinity::AnyAoETargetUnitInObjectRangeCheck u_check(me, me, SIZE_OF_GRIDS);
- Trinity::UnitListSearcher<Trinity::AnyAoETargetUnitInObjectRangeCheck> searcher(me, tempUnitMap, u_check);
-
- TypeContainerVisitor<Trinity::UnitListSearcher<Trinity::AnyAoETargetUnitInObjectRangeCheck>, WorldTypeMapContainer > world_unit_searcher(searcher);
- TypeContainerVisitor<Trinity::UnitListSearcher<Trinity::AnyAoETargetUnitInObjectRangeCheck>, GridTypeMapContainer > grid_unit_searcher(searcher);
-
- cell.Visit(p, world_unit_searcher, *me->GetMap(), *me, SIZE_OF_GRIDS);
- cell.Visit(p, grid_unit_searcher, *me->GetMap(), *me, SIZE_OF_GRIDS);
- }
-
- // deal damage
- for (std::list<Unit*>::const_iterator i = tempUnitMap.begin(); i != tempUnitMap.end(); ++i)
- {
- if (Unit* target = (*i))
- {
- if (!Cloud->IsWithinDist(target, 6, false))
- Cloud->CastCustomSpell(target, SPELL_ZAP, &bp0, NULL, NULL, true, 0, 0, me->GetGUID());
- }
- }
-
- // visual
- float x, y, z;
- z = me->GetPositionZ();
- for (uint8 i = 0; i < 5+rand()%5; ++i)
- {
- x = 343.0f+rand()%60;
- y = 1380.0f+rand()%60;
- if (Unit* trigger = me->SummonTrigger(x, y, z, 0, 2000))
- {
- trigger->setFaction(35);
- trigger->SetMaxHealth(100000);
- trigger->SetHealth(100000);
- trigger->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- if (Cloud)
- Cloud->CastCustomSpell(trigger, /*43661*/SPELL_ZAP, &bp0, NULL, NULL, true, 0, 0, Cloud->GetGUID());
- }
- }
- }
-
- ++StormCount;
-
- if (StormCount > 10)
- {
- StormCount = 0; // finish
- events.ScheduleEvent(EVENT_SUMMON_EAGLES, 5000);
- me->InterruptNonMeleeSpells(false);
- CloudGUID = 0;
- if (Cloud)
- Cloud->DealDamage(Cloud, Cloud->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
- SetWeather(WEATHER_STATE_FINE, 0.0f);
- isRaining = false;
- }
- events.ScheduleEvent(EVENT_STORM_SEQUENCE, 1000);
+ if (victim->GetTypeId() == TYPEID_PLAYER)
+ Talk(SAY_PLAYER_KILL);
}
void UpdateAI(uint32 diff)
@@ -221,232 +69,30 @@ class boss_akilzon : public CreatureScript
events.Update(diff);
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+ /*
while (uint32 eventId = events.ExecuteEvent())
{
switch (eventId)
{
- case EVENT_STATIC_DISRUPTION:
- {
- Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1);
- if (!target) target = me->GetVictim();
- TargetGUID = target->GetGUID();
- DoCast(target, SPELL_STATIC_DISRUPTION, false);
- me->SetInFront(me->GetVictim());
- /*if (float dist = me->IsWithinDist3d(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 5.0f) dist = 5.0f;
- SDisruptAOEVisual_Timer = 1000 + floor(dist / 30 * 1000.0f);*/
- events.ScheduleEvent(EVENT_STATIC_DISRUPTION, urand(10000, 18000));
- break;
- }
- case EVENT_GUST_OF_WIND:
- {
- Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1);
- if (!target) target = me->GetVictim();
- DoCast(target, SPELL_GUST_OF_WIND);
- events.ScheduleEvent(EVENT_GUST_OF_WIND, urand(20000, 30000));
- break;
- }
- case EVENT_CALL_LIGHTNING:
- DoCastVictim(SPELL_CALL_LIGHTNING);
- events.ScheduleEvent(EVENT_CALL_LIGHTNING, urand(12000, 17000)); // totaly random timer. can't find any info on this
- break;
- case EVENT_ELECTRICAL_STORM:
- {
- Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50, true);
- if (!target)
- {
- EnterEvadeMode();
- return;
- }
- target->CastSpell(target, 44007, true); // cloud visual
- DoCast(target, SPELL_ELECTRICAL_STORM, false); // storm cyclon + visual
- float x, y, z;
- target->GetPosition(x, y, z);
- if (target)
- {
- target->SetDisableGravity(true);
- target->MonsterMoveWithSpeed(x, y, me->GetPositionZ()+15, 0);
- }
-
- Unit* Cloud = me->SummonTrigger(x, y, me->GetPositionZ()+16, 0, 15000);
- if (Cloud)
- {
- CloudGUID = Cloud->GetGUID();
- Cloud->SetDisableGravity(true);
- Cloud->StopMoving();
- Cloud->SetObjectScale(1.0f);
- Cloud->setFaction(35);
- Cloud->SetMaxHealth(9999999);
- Cloud->SetHealth(9999999);
- Cloud->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- }
- StormCount = 1;
- events.ScheduleEvent(EVENT_ELECTRICAL_STORM, 60000); // 60 seconds(bosskillers)
- events.ScheduleEvent(EVENT_RAIN, urand(47000, 52000));
- break;
- }
- case EVENT_RAIN:
- if (!isRaining)
- {
- SetWeather(WEATHER_STATE_HEAVY_RAIN, 0.9999f);
- isRaining = true;
- }
- else
- events.ScheduleEvent(EVENT_RAIN, 1000);
- break;
- case EVENT_STORM_SEQUENCE:
- {
- Unit* target = Unit::GetUnit(*me, CloudGUID);
- if (!target || !target->IsAlive())
- {
- EnterEvadeMode();
- return;
- }
- else if (Unit* Cyclone = Unit::GetUnit(*me, CycloneGUID))
- Cyclone->CastSpell(target, SPELL_SAND_STORM, true); // keep casting or...
- HandleStormSequence(target);
- break;
- }
- case EVENT_SUMMON_EAGLES:
- Talk(SAY_SUMMON);
-
- float x, y, z;
- me->GetPosition(x, y, z);
-
- for (uint8 i = 0; i < 8; ++i)
- {
- Unit* bird = Unit::GetUnit(*me, BirdGUIDs[i]);
- if (!bird) //they despawned on die
- {
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
- {
- x = target->GetPositionX() + irand(-10, 10);
- y = target->GetPositionY() + irand(-10, 10);
- z = target->GetPositionZ() + urand(16, 20);
- if (z > 95)
- z = 95.0f - urand(0, 5);
- }
- Creature* creature = me->SummonCreature(NPC_SOARING_EAGLE, x, y, z, 0, TEMPSUMMON_CORPSE_DESPAWN, 0);
- if (creature)
- {
- creature->AddThreat(me->GetVictim(), 1.0f);
- creature->AI()->AttackStart(me->GetVictim());
- BirdGUIDs[i] = creature->GetGUID();
- }
- }
- }
- break;
- case EVENT_ENRAGE:
- Talk(SAY_ENRAGE);
- DoCast(me, SPELL_BERSERK, true);
- events.ScheduleEvent(EVENT_ENRAGE, 600000);
- break;
default:
break;
}
}
+ */
DoMeleeAttackIfReady();
}
-
- private:
- uint64 BirdGUIDs[8];
- uint64 TargetGUID;
- uint64 CycloneGUID;
- uint64 CloudGUID;
- uint8 StormCount;
- bool isRaining;
};
CreatureAI* GetAI(Creature* creature) const
{
- return new boss_akilzonAI(creature);
- }
-};
-
-class npc_akilzon_eagle : public CreatureScript
-{
- public:
- npc_akilzon_eagle() : CreatureScript("npc_akilzon_eagle") { }
-
- struct npc_akilzon_eagleAI : public ScriptedAI
- {
- npc_akilzon_eagleAI(Creature* creature) : ScriptedAI(creature) { }
-
- uint32 EagleSwoop_Timer;
- bool arrived;
- uint64 TargetGUID;
-
- void Reset()
- {
- EagleSwoop_Timer = urand(5000, 10000);
- arrived = true;
- TargetGUID = 0;
- me->SetDisableGravity(true);
- }
-
- void EnterCombat(Unit* /*who*/)
- {
- DoZoneInCombat();
- }
-
- void MoveInLineOfSight(Unit* /*who*/) {}
-
- void MovementInform(uint32, uint32)
- {
- arrived = true;
- if (TargetGUID)
- {
- if (Unit* target = Unit::GetUnit(*me, TargetGUID))
- DoCast(target, SPELL_EAGLE_SWOOP, true);
- TargetGUID = 0;
- me->SetSpeed(MOVE_RUN, 1.2f);
- EagleSwoop_Timer = urand(5000, 10000);
- }
- }
-
- void UpdateAI(uint32 diff)
- {
- if (EagleSwoop_Timer <= diff)
- EagleSwoop_Timer = 0;
- else
- EagleSwoop_Timer -= diff;
-
- if (arrived)
- {
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
- {
- float x, y, z;
- if (EagleSwoop_Timer)
- {
- x = target->GetPositionX() + irand(-10, 10);
- y = target->GetPositionY() + irand(-10, 10);
- z = target->GetPositionZ() + urand(10, 15);
- if (z > 95)
- z = 95.0f - urand(0, 5);
- }
- else
- {
- target->GetContactPoint(me, x, y, z);
- z += 2;
- me->SetSpeed(MOVE_RUN, 5.0f);
- TargetGUID = target->GetGUID();
- }
- me->GetMotionMaster()->MovePoint(0, x, y, z);
- arrived = false;
- }
- }
- }
- };
-
- CreatureAI* GetAI(Creature* creature) const
- {
- return new npc_akilzon_eagleAI(creature);
+ return GetZulAmanAI<boss_akilzonAI>(creature);
}
};
void AddSC_boss_akilzon()
{
new boss_akilzon();
- new npc_akilzon_eagle();
}
-
diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_daakara.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_daakara.cpp
new file mode 100644
index 00000000000..64237502803
--- /dev/null
+++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_daakara.cpp
@@ -0,0 +1,113 @@
+/*
+ * Copyright (C) 2008-2013 TrinityCore <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, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "ScriptMgr.h"
+#include "ScriptedCreature.h"
+#include "zulaman.h"
+
+enum Says
+{
+ SAY_INTRO = 0,
+ SAY_AGGRO = 1,
+ SAY_PLAYER_KILL = 2,
+ SAY_FIRE_BREATH = 3,
+ SAY_TRANSFORMS_BEAR = 4,
+ SAY_TRANSFORMS_EAGLE = 5,
+ SAY_TRANSFORMS_LYNX = 6,
+ SAY_TRANSFORMS_DRAGONHAWK = 7,
+ SAY_ABSORBS_BEAR_SPIRIT = 8,
+ SAY_ABSORBS_EAGLE_SPIRIT = 9,
+ SAY_ABSORBS_LYNX_SPIRIT = 10,
+ SAY_ABSORBS_DRAGONHAWK_SPIRIT = 11,
+ SAY_DEATH = 12
+};
+
+enum Spells
+{
+};
+
+enum Events
+{
+};
+
+class boss_daakara : public CreatureScript
+{
+ public:
+
+ boss_daakara() : CreatureScript("boss_daakara") { }
+
+ struct boss_daakaraAI : public BossAI
+ {
+ boss_daakaraAI(Creature* creature) : BossAI(creature, DATA_DAAKARA) { }
+
+ void Reset()
+ {
+ _Reset();
+ }
+
+ void EnterCombat(Unit* /*who*/)
+ {
+ Talk(SAY_AGGRO);
+ _EnterCombat();
+ }
+
+ void JustDied(Unit* /*killer*/)
+ {
+ Talk(SAY_DEATH);
+ _JustDied();
+ }
+
+ void KilledUnit(Unit* victim)
+ {
+ if (victim->GetTypeId() == TYPEID_PLAYER)
+ Talk(SAY_PLAYER_KILL);
+ }
+
+ void UpdateAI(uint32 diff)
+ {
+ if (!UpdateVictim())
+ return;
+
+ events.Update(diff);
+
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+ /*
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ default:
+ break;
+ }
+ }
+ */
+
+ DoMeleeAttackIfReady();
+ }
+ };
+
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return GetZulAmanAI<boss_daakaraAI>(creature);
+ }
+};
+
+void AddSC_boss_daakara()
+{
+ new boss_daakara();
+}
diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_halazzi.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_halazzi.cpp
index dd75b80488b..76c6917c3ce 100644
--- a/src/server/scripts/EasternKingdoms/ZulAman/boss_halazzi.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_halazzi.cpp
@@ -1,6 +1,5 @@
/*
* Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
- * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
*
* 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
@@ -16,406 +15,92 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/* ScriptData
-SDName: boss_Halazzi
-SD%Complete: 80
-SDComment:
-SDCategory: Zul'Aman
-EndScriptData */
-
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "zulaman.h"
-#include "SpellInfo.h"
-
-#define YELL_AGGRO "Get on your knees and bow to da fang and claw!"
-#define SOUND_AGGRO 12020
-#define YELL_SABER_ONE "You gonna leave in pieces!"
-#define YELL_SABER_TWO "Me gonna carve ya now!"
-#define YELL_SPLIT "Me gonna carve ya now!"
-#define SOUND_SPLIT 12021
-#define YELL_MERGE "Spirit, come back to me!"
-#define SOUND_MERGE 12022
-#define YELL_KILL_ONE "You cant fight the power!"
-#define SOUND_KILL_ONE 12026
-#define YELL_KILL_TWO "You gonna fail!"
-#define SOUND_KILL_TWO 12027
-#define YELL_DEATH "Chaga... choka'jinn."
-#define SOUND_DEATH 12028
-#define YELL_BERSERK "Whatch you be doing? Pissin' yourselves..."
-#define SOUND_BERSERK 12025
-enum Spells
+enum Says
{
- SPELL_DUAL_WIELD = 29651,
- SPELL_SABER_LASH = 43267,
- SPELL_FRENZY = 43139,
- SPELL_FLAMESHOCK = 43303,
- SPELL_EARTHSHOCK = 43305,
- SPELL_TRANSFORM_SPLIT = 43142,
- SPELL_TRANSFORM_SPLIT2 = 43573,
- SPELL_TRANSFORM_MERGE = 43271,
- SPELL_SUMMON_LYNX = 43143,
- SPELL_SUMMON_TOTEM = 43302,
- SPELL_BERSERK = 45078,
- SPELL_LYNX_FRENZY = 43290, // Used by Spirit Lynx
- SPELL_SHRED_ARMOR = 43243 // Used by Spirit Lynx
+ SAY_AGGRO = 0,
+ SAY_PLAYER_KILL = 1,
+ SAY_MELEE = 2,
+ SAY_SPLIT = 3,
+ SAY_COMBINE = 4,
+ SAY_DEATH = 5
};
-enum Hal_CreatureIds
+enum Spells
{
- NPC_SPIRIT_LYNX = 24143,
- NPC_TOTEM = 24224
};
-enum PhaseHalazzi
+enum Events
{
- PHASE_NONE = 0,
- PHASE_LYNX = 1,
- PHASE_SPLIT = 2,
- PHASE_HUMAN = 3,
- PHASE_MERGE = 4,
- PHASE_ENRAGE = 5
};
class boss_halazzi : public CreatureScript
{
public:
- boss_halazzi()
- : CreatureScript("boss_halazzi")
- {
- }
+ boss_halazzi() : CreatureScript("boss_halazzi") { }
- struct boss_halazziAI : public ScriptedAI
+ struct boss_halazziAI : public BossAI
{
- boss_halazziAI(Creature* creature) : ScriptedAI(creature)
- {
- instance = creature->GetInstanceScript();
- }
-
- InstanceScript* instance;
-
- uint32 FrenzyTimer;
- uint32 SaberlashTimer;
- uint32 ShockTimer;
- uint32 TotemTimer;
- uint32 CheckTimer;
- uint32 BerserkTimer;
-
- uint32 TransformCount;
-
- PhaseHalazzi Phase;
-
- uint64 LynxGUID;
+ boss_halazziAI(Creature* creature) : BossAI(creature, DATA_HALAZZI) { }
void Reset()
{
- if (instance)
- instance->SetData(DATA_HALAZZIEVENT, NOT_STARTED);
-
- LynxGUID = 0;
- TransformCount = 0;
- BerserkTimer = 600000;
- CheckTimer = 1000;
-
- DoCast(me, SPELL_DUAL_WIELD, true);
-
- Phase = PHASE_NONE;
- EnterPhase(PHASE_LYNX);
+ _Reset();
}
void EnterCombat(Unit* /*who*/)
{
- if (instance)
- instance->SetData(DATA_HALAZZIEVENT, IN_PROGRESS);
-
- me->MonsterYell(YELL_AGGRO, LANG_UNIVERSAL, 0);
- DoPlaySoundToSet(me, SOUND_AGGRO);
-
- EnterPhase(PHASE_LYNX);
- }
-
- void JustSummoned(Creature* summon)
- {
- summon->AI()->AttackStart(me->GetVictim());
- if (summon->GetEntry() == NPC_SPIRIT_LYNX)
- LynxGUID = summon->GetGUID();
- }
-
- void DamageTaken(Unit* /*done_by*/, uint32 &damage)
- {
- if (damage >= me->GetHealth() && Phase != PHASE_ENRAGE)
- damage = 0;
- }
-
- void SpellHit(Unit*, const SpellInfo* spell)
- {
- if (spell->Id == SPELL_TRANSFORM_SPLIT2)
- EnterPhase(PHASE_HUMAN);
+ Talk(SAY_AGGRO);
+ _EnterCombat();
}
- void AttackStart(Unit* who)
+ void JustDied(Unit* /*killer*/)
{
- if (Phase != PHASE_MERGE) ScriptedAI::AttackStart(who);
+ Talk(SAY_DEATH);
+ _JustDied();
}
- void EnterPhase(PhaseHalazzi NextPhase)
+ void KilledUnit(Unit* victim)
{
- switch (NextPhase)
- {
- case PHASE_LYNX:
- case PHASE_ENRAGE:
- if (Phase == PHASE_MERGE)
- {
- DoCast(me, SPELL_TRANSFORM_MERGE, true);
- me->Attack(me->GetVictim(), true);
- me->GetMotionMaster()->MoveChase(me->GetVictim());
- }
- if (Creature* Lynx = Unit::GetCreature(*me, LynxGUID))
- Lynx->DisappearAndDie();
- me->SetMaxHealth(600000);
- me->SetHealth(600000 - 150000 * TransformCount);
- FrenzyTimer = 16000;
- SaberlashTimer = 20000;
- ShockTimer = 10000;
- TotemTimer = 12000;
- break;
- case PHASE_SPLIT:
- me->MonsterYell(YELL_SPLIT, LANG_UNIVERSAL, 0);
- DoPlaySoundToSet(me, SOUND_SPLIT);
- DoCast(me, SPELL_TRANSFORM_SPLIT, true);
- break;
- case PHASE_HUMAN:
- //DoCast(me, SPELL_SUMMON_LYNX, true);
- DoSpawnCreature(NPC_SPIRIT_LYNX, 5, 5, 0, 0, TEMPSUMMON_CORPSE_DESPAWN, 0);
- me->SetMaxHealth(400000);
- me->SetHealth(400000);
- ShockTimer = 10000;
- TotemTimer = 12000;
- break;
- case PHASE_MERGE:
- if (Unit* pLynx = Unit::GetUnit(*me, LynxGUID))
- {
- me->MonsterYell(YELL_MERGE, LANG_UNIVERSAL, 0);
- DoPlaySoundToSet(me, SOUND_MERGE);
- pLynx->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
- pLynx->GetMotionMaster()->Clear();
- pLynx->GetMotionMaster()->MoveFollow(me, 0, 0);
- me->GetMotionMaster()->Clear();
- me->GetMotionMaster()->MoveFollow(pLynx, 0, 0);
- ++TransformCount;
- }
- break;
- default:
- break;
- }
- Phase = NextPhase;
+ if (victim->GetTypeId() == TYPEID_PLAYER)
+ Talk(SAY_PLAYER_KILL);
}
- void UpdateAI(uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
- if (BerserkTimer <= diff)
- {
- me->MonsterYell(YELL_BERSERK, LANG_UNIVERSAL, 0);
- DoPlaySoundToSet(me, SOUND_BERSERK);
- DoCast(me, SPELL_BERSERK, true);
- BerserkTimer = 60000;
- } else BerserkTimer -= diff;
-
- if (Phase == PHASE_LYNX || Phase == PHASE_ENRAGE)
- {
- if (SaberlashTimer <= diff)
- {
- // A tank with more than 490 defense skills should receive no critical hit
- //DoCast(me, 41296, true);
- DoCastVictim(SPELL_SABER_LASH, true);
- //me->RemoveAurasDueToSpell(41296);
- SaberlashTimer = 30000;
- } else SaberlashTimer -= diff;
-
- if (FrenzyTimer <= diff)
- {
- DoCast(me, SPELL_FRENZY);
- FrenzyTimer = urand(10000, 15000);
- } else FrenzyTimer -= diff;
+ events.Update(diff);
- if (Phase == PHASE_LYNX)
- {
- if (CheckTimer <= diff)
- {
- if (HealthBelowPct(25 * (3 - TransformCount)))
- EnterPhase(PHASE_SPLIT);
- CheckTimer = 1000;
- } else CheckTimer -= diff;
- }
- }
-
- if (Phase == PHASE_HUMAN || Phase == PHASE_ENRAGE)
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+ /*
+ while (uint32 eventId = events.ExecuteEvent())
{
- if (TotemTimer <= diff)
+ switch (eventId)
{
- DoCast(me, SPELL_SUMMON_TOTEM);
- TotemTimer = 20000;
- } else TotemTimer -= diff;
-
- if (ShockTimer <= diff)
- {
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
- {
- if (target->IsNonMeleeSpellCasted(false))
- DoCast(target, SPELL_EARTHSHOCK);
- else
- DoCast(target, SPELL_FLAMESHOCK);
- ShockTimer = urand(10000, 15000);
- }
- } else ShockTimer -= diff;
-
- if (Phase == PHASE_HUMAN)
- {
- if (CheckTimer <= diff)
- {
- if (!HealthAbovePct(20) /*HealthBelowPct(10)*/)
- EnterPhase(PHASE_MERGE);
- else
- {
- Unit* Lynx = Unit::GetUnit(*me, LynxGUID);
- if (Lynx && !Lynx->HealthAbovePct(20) /*Lynx->HealthBelowPct(10)*/)
- EnterPhase(PHASE_MERGE);
- }
- CheckTimer = 1000;
- } else CheckTimer -= diff;
+ default:
+ break;
}
}
-
- if (Phase == PHASE_MERGE)
- {
- if (CheckTimer <= diff)
- {
- Unit* Lynx = Unit::GetUnit(*me, LynxGUID);
- if (Lynx)
- {
- Lynx->GetMotionMaster()->MoveFollow(me, 0, 0);
- me->GetMotionMaster()->MoveFollow(Lynx, 0, 0);
- if (me->IsWithinDistInMap(Lynx, 6.0f))
- {
- if (TransformCount < 3)
- EnterPhase(PHASE_LYNX);
- else
- EnterPhase(PHASE_ENRAGE);
- }
- }
- CheckTimer = 1000;
- } else CheckTimer -= diff;
- }
+ */
DoMeleeAttackIfReady();
}
-
- void KilledUnit(Unit* /*victim*/)
- {
- switch (urand(0, 1))
- {
- case 0:
- me->MonsterYell(YELL_KILL_ONE, LANG_UNIVERSAL, 0);
- DoPlaySoundToSet(me, SOUND_KILL_ONE);
- break;
-
- case 1:
- me->MonsterYell(YELL_KILL_TWO, LANG_UNIVERSAL, 0);
- DoPlaySoundToSet(me, SOUND_KILL_TWO);
- break;
- }
- }
-
- void JustDied(Unit* /*killer*/)
- {
- if (instance)
- instance->SetData(DATA_HALAZZIEVENT, DONE);
-
- me->MonsterYell(YELL_DEATH, LANG_UNIVERSAL, 0);
- DoPlaySoundToSet(me, SOUND_DEATH);
- }
};
CreatureAI* GetAI(Creature* creature) const
{
- return new boss_halazziAI(creature);
- }
-};
-
-// Spirits Lynx AI
-class npc_halazzi_lynx : public CreatureScript
-{
- public:
-
- npc_halazzi_lynx()
- : CreatureScript("npc_halazzi_lynx")
- {
- }
-
- struct npc_halazzi_lynxAI : public ScriptedAI
- {
- npc_halazzi_lynxAI(Creature* creature) : ScriptedAI(creature) {}
-
- uint32 FrenzyTimer;
- uint32 shredder_timer;
-
- void Reset()
- {
- FrenzyTimer = urand(30000, 50000); //frenzy every 30-50 seconds
- shredder_timer = 4000;
- }
-
- void DamageTaken(Unit* /*done_by*/, uint32 &damage)
- {
- if (damage >= me->GetHealth())
- damage = 0;
- }
-
- void AttackStart(Unit* who)
- {
- if (!me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE))
- ScriptedAI::AttackStart(who);
- }
-
- void EnterCombat(Unit* /*who*/) {/*DoZoneInCombat();*/}
-
- void UpdateAI(uint32 diff)
- {
- if (!UpdateVictim())
- return;
-
- if (FrenzyTimer <= diff)
- {
- DoCast(me, SPELL_LYNX_FRENZY);
- FrenzyTimer = urand(30000, 50000); //frenzy every 30-50 seconds
- } else FrenzyTimer -= diff;
-
- if (shredder_timer <= diff)
- {
- DoCastVictim(SPELL_SHRED_ARMOR);
- shredder_timer = 4000;
- } else shredder_timer -= diff;
-
- DoMeleeAttackIfReady();
- }
-
- };
-
- CreatureAI* GetAI(Creature* creature) const
- {
- return new npc_halazzi_lynxAI(creature);
+ return GetZulAmanAI<boss_halazziAI>(creature);
}
};
void AddSC_boss_halazzi()
{
new boss_halazzi();
- new npc_halazzi_lynx();
}
-
-
diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp
index 5965cadf814..5b1d194eb08 100644
--- a/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp
@@ -1,6 +1,5 @@
/*
* Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
- * Copyright (C) 2006-2007 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
*
* 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
@@ -16,499 +15,63 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/* ScriptData
-SDName: Boss_Hex_Lord_Malacrass
-SD%Complete:
-SDComment:
-SDCategory: Zul'Aman
-EndScriptData */
-
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "SpellScript.h"
#include "SpellAuraEffects.h"
#include "zulaman.h"
-#define YELL_AGGRO "Da shadow gonna fall on you... "
-#define SOUND_YELL_AGGRO 12041
-#define YELL_SPIRIT_BOLTS "Your soul gonna bleed!"
-#define SOUND_YELL_SPIRIT_BOLTS 12047
-#define YELL_DRAIN_POWER "Darkness comin\' for you"
-#define SOUND_YELL_DRAIN_POWER 12046
-#define YELL_KILL_ONE "Dis a nightmare ya don\' wake up from!"
-#define SOUND_YELL_KILL_ONE 12043
-#define YELL_KILL_TWO "Azzaga choogo zinn!"
-#define SOUND_YELL_KILL_TWO 12044
-#define YELL_DEATH "Dis not... da end of me..."
-#define SOUND_YELL_DEATH 12051
-
-#define SPELL_SPIRIT_BOLTS 43383
-#define SPELL_DRAIN_POWER 44131
-#define SPELL_SIPHON_SOUL 43501
-
-#define NPC_TEMP_TRIGGER 23920
-
-//Defines for various powers he uses after using soul drain
+enum Says
+{
+ SAY_AGGRO = 0,
+ SAY_PLAYER_KILL = 1,
+ SAY_SPIRIT_BOLTS = 2,
+ SAY_SIPHON_SOUL = 3,
+ SAY_PET_DEATH = 4,
+ SAY_DEATH = 5
+};
enum Spells
{
- // Druid
- SPELL_DR_THORNS = 43420,
- SPELL_DR_LIFEBLOOM = 43421,
- SPELL_DR_MOONFIRE = 43545,
-
- // Hunter
- SPELL_HU_EXPLOSIVE_TRAP = 43444,
- SPELL_HU_FREEZING_TRAP = 43447,
- SPELL_HU_SNAKE_TRAP = 43449,
-
- // Mage
- SPELL_MG_FIREBALL = 41383,
- SPELL_MG_FROST_NOVA = 43426,
- SPELL_MG_ICE_LANCE = 43427,
- SPELL_MG_FROSTBOLT = 43428,
-
- // Paladin
- SPELL_PA_CONSECRATION = 43429,
- SPELL_PA_AVENGING_WRATH = 43430,
- SPELL_PA_HOLY_LIGHT = 43451,
-
- // Priest
- SPELL_PR_HEAL = 41372,
- SPELL_PR_MIND_BLAST = 41374,
- SPELL_PR_SW_DEATH = 41375,
- SPELL_PR_PSYCHIC_SCREAM = 43432,
- SPELL_PR_MIND_CONTROL = 43550,
- SPELL_PR_PAIN_SUPP = 44416,
-
- // Rogue
- SPELL_RO_BLIND = 43433,
- SPELL_RO_SLICE_DICE = 43457,
- SPELL_RO_WOUND_POISON = 43461,
-
- // Shaman
- SPELL_SH_CHAIN_LIGHT = 43435,
- SPELL_SH_FIRE_NOVA = 43436,
- SPELL_SH_HEALING_WAVE = 43548,
-
- // Warlock
- SPELL_WL_CURSE_OF_DOOM = 43439,
- SPELL_WL_RAIN_OF_FIRE = 43440,
SPELL_WL_UNSTABLE_AFFL = 43522,
SPELL_WL_UNSTABLE_AFFL_DISPEL = 43523,
-
- // Warrior
- SPELL_WR_MORTAL_STRIKE = 43441,
- SPELL_WR_WHIRLWIND = 43442,
- SPELL_WR_SPELL_REFLECT = 43443
};
-#define ORIENT 1.5696f
-#define POS_Y 921.2795f
-#define POS_Z 33.8883f
-
-static float Pos_X[4] = {112.8827f, 107.8827f, 122.8827f, 127.8827f};
-
-static uint32 AddEntryList[8]=
+enum Events
{
- 24240, //Alyson Antille
- 24241, //Thurg
- 24242, //Slither
- 24243, //Lord Raadan
- 24244, //Gazakroth
- 24245, //Fenstalker
- 24246, //Darkheart
- 24247 //Koragg
-};
-
-enum AbilityTarget
-{
- ABILITY_TARGET_SELF = 0,
- ABILITY_TARGET_VICTIM = 1,
- ABILITY_TARGET_ENEMY = 2,
- ABILITY_TARGET_HEAL = 3,
- ABILITY_TARGET_BUFF = 4,
- ABILITY_TARGET_SPECIAL = 5
-};
-
-struct PlayerAbilityStruct
-{
- uint32 spell;
- AbilityTarget target;
- uint32 cooldown; //FIXME - it's never used
-};
-
-static PlayerAbilityStruct PlayerAbility[][3] =
-{
- // 1 warrior
- {{SPELL_WR_SPELL_REFLECT, ABILITY_TARGET_SELF, 10000},
- {SPELL_WR_WHIRLWIND, ABILITY_TARGET_SELF, 10000},
- {SPELL_WR_MORTAL_STRIKE, ABILITY_TARGET_VICTIM, 6000}},
- // 2 paladin
- {{SPELL_PA_CONSECRATION, ABILITY_TARGET_SELF, 10000},
- {SPELL_PA_HOLY_LIGHT, ABILITY_TARGET_HEAL, 10000},
- {SPELL_PA_AVENGING_WRATH, ABILITY_TARGET_SELF, 10000}},
- // 3 hunter
- {{SPELL_HU_EXPLOSIVE_TRAP, ABILITY_TARGET_SELF, 10000},
- {SPELL_HU_FREEZING_TRAP, ABILITY_TARGET_SELF, 10000},
- {SPELL_HU_SNAKE_TRAP, ABILITY_TARGET_SELF, 10000}},
- // 4 rogue
- {{SPELL_RO_WOUND_POISON, ABILITY_TARGET_VICTIM, 3000},
- {SPELL_RO_SLICE_DICE, ABILITY_TARGET_SELF, 10000},
- {SPELL_RO_BLIND, ABILITY_TARGET_ENEMY, 10000}},
- // 5 priest
- {{SPELL_PR_PAIN_SUPP, ABILITY_TARGET_HEAL, 10000},
- {SPELL_PR_HEAL, ABILITY_TARGET_HEAL, 10000},
- {SPELL_PR_PSYCHIC_SCREAM, ABILITY_TARGET_SELF, 10000}},
- // 5* shadow priest
- {{SPELL_PR_MIND_CONTROL, ABILITY_TARGET_ENEMY, 15000},
- {SPELL_PR_MIND_BLAST, ABILITY_TARGET_ENEMY, 5000},
- {SPELL_PR_SW_DEATH, ABILITY_TARGET_ENEMY, 10000}},
- // 7 shaman
- {{SPELL_SH_FIRE_NOVA, ABILITY_TARGET_SELF, 10000},
- {SPELL_SH_HEALING_WAVE, ABILITY_TARGET_HEAL, 10000},
- {SPELL_SH_CHAIN_LIGHT, ABILITY_TARGET_ENEMY, 8000}},
- // 8 mage
- {{SPELL_MG_FIREBALL, ABILITY_TARGET_ENEMY, 5000},
- {SPELL_MG_FROSTBOLT, ABILITY_TARGET_ENEMY, 5000},
- {SPELL_MG_ICE_LANCE, ABILITY_TARGET_SPECIAL, 2000}},
- // 9 warlock
- {{SPELL_WL_CURSE_OF_DOOM, ABILITY_TARGET_ENEMY, 10000},
- {SPELL_WL_RAIN_OF_FIRE, ABILITY_TARGET_ENEMY, 10000},
- {SPELL_WL_UNSTABLE_AFFL, ABILITY_TARGET_ENEMY, 10000}},
- // 11 druid
- {{SPELL_DR_LIFEBLOOM, ABILITY_TARGET_HEAL, 10000},
- {SPELL_DR_THORNS, ABILITY_TARGET_SELF, 10000},
- {SPELL_DR_MOONFIRE, ABILITY_TARGET_ENEMY, 8000}}
-};
-
-struct boss_hexlord_addAI : public ScriptedAI
-{
- InstanceScript* instance;
-
- boss_hexlord_addAI(Creature* creature) : ScriptedAI(creature)
- {
- instance = creature->GetInstanceScript();
- }
-
- void Reset() {}
-
- void EnterCombat(Unit* /*who*/)
- {
- DoZoneInCombat();
- }
-
- void UpdateAI(uint32 /*diff*/)
- {
- if (instance && instance->GetData(DATA_HEXLORDEVENT) != IN_PROGRESS)
- {
- EnterEvadeMode();
- return;
- }
-
- DoMeleeAttackIfReady();
- }
};
class boss_hexlord_malacrass : public CreatureScript
{
public:
- boss_hexlord_malacrass()
- : CreatureScript("boss_hexlord_malacrass")
- {
- }
+ boss_hexlord_malacrass() : CreatureScript("boss_hexlord_malacrass") { }
- struct boss_hex_lord_malacrassAI : public ScriptedAI
+ struct boss_hex_lord_malacrassAI : public BossAI
{
- boss_hex_lord_malacrassAI(Creature* creature) : ScriptedAI(creature)
- {
- instance = creature->GetInstanceScript();
- SelectAddEntry();
- for (uint8 i = 0; i < 4; ++i)
- AddGUID[i] = 0;
- }
-
- InstanceScript* instance;
-
- uint64 AddGUID[4];
- uint32 AddEntry[4];
-
- uint64 PlayerGUID;
-
- uint32 SpiritBolts_Timer;
- uint32 DrainPower_Timer;
- uint32 SiphonSoul_Timer;
- uint32 PlayerAbility_Timer;
- uint32 CheckAddState_Timer;
- uint32 ResetTimer;
-
- uint32 PlayerClass;
+ boss_hex_lord_malacrassAI(Creature* creature) : BossAI(creature, DATA_HEXLORD) { }
void Reset()
{
- if (instance)
- instance->SetData(DATA_HEXLORDEVENT, NOT_STARTED);
-
- SpiritBolts_Timer = 20000;
- DrainPower_Timer = 60000;
- SiphonSoul_Timer = 100000;
- PlayerAbility_Timer = 99999;
- CheckAddState_Timer = 5000;
- ResetTimer = 5000;
-
- SpawnAdds();
-
- me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, 46916);
- me->SetByteValue(UNIT_FIELD_BYTES_2, 0, SHEATH_STATE_MELEE);
+ _Reset();
}
void EnterCombat(Unit* /*who*/)
{
- if (instance)
- instance->SetData(DATA_HEXLORDEVENT, IN_PROGRESS);
-
- DoZoneInCombat();
- me->MonsterYell(YELL_AGGRO, LANG_UNIVERSAL, 0);
- DoPlaySoundToSet(me, SOUND_YELL_AGGRO);
-
- for (uint8 i = 0; i < 4; ++i)
- {
- Creature* creature = Unit::GetCreature(*me, AddGUID[i]);
- if (creature && creature->IsAlive())
- creature->AI()->AttackStart(me->GetVictim());
- else
- {
- EnterEvadeMode();
- break;
- }
- }
- }
-
- void KilledUnit(Unit* /*victim*/)
- {
- switch (urand(0, 1))
- {
- case 0:
- me->MonsterYell(YELL_KILL_ONE, LANG_UNIVERSAL, 0);
- DoPlaySoundToSet(me, SOUND_YELL_KILL_ONE);
- break;
- case 1:
- me->MonsterYell(YELL_KILL_TWO, LANG_UNIVERSAL, 0);
- DoPlaySoundToSet(me, SOUND_YELL_KILL_TWO);
- break;
- }
+ Talk(SAY_AGGRO);
+ _EnterCombat();
}
void JustDied(Unit* /*killer*/)
{
- if (instance)
- instance->SetData(DATA_HEXLORDEVENT, DONE);
-
- me->MonsterYell(YELL_DEATH, LANG_UNIVERSAL, 0);
- DoPlaySoundToSet(me, SOUND_YELL_DEATH);
-
- for (uint8 i = 0; i < 4; ++i)
- {
- Unit* Temp = Unit::GetUnit(*me, AddGUID[i]);
- if (Temp && Temp->IsAlive())
- Temp->DealDamage(Temp, Temp->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
- }
- }
-
- void SelectAddEntry()
- {
- std::vector<uint32> AddList;
-
- for (uint8 i = 0; i < 8; ++i)
- AddList.push_back(AddEntryList[i]);
-
- while (AddList.size() > 4)
- AddList.erase(AddList.begin()+rand()%AddList.size());
-
- uint8 i = 0;
- for (std::vector<uint32>::const_iterator itr = AddList.begin(); itr != AddList.end(); ++itr, ++i)
- AddEntry[i] = *itr;
- }
-
- void SpawnAdds()
- {
- for (uint8 i = 0; i < 4; ++i)
- {
- Creature* creature = (Unit::GetCreature((*me), AddGUID[i]));
- if (!creature || !creature->IsAlive())
- {
- if (creature) creature->setDeathState(DEAD);
- creature = me->SummonCreature(AddEntry[i], Pos_X[i], POS_Y, POS_Z, ORIENT, TEMPSUMMON_DEAD_DESPAWN, 0);
- if (creature) AddGUID[i] = creature->GetGUID();
- }
- else
- {
- creature->AI()->EnterEvadeMode();
- creature->SetPosition(Pos_X[i], POS_Y, POS_Z, ORIENT);
- creature->StopMoving();
- }
- }
- }
-
- void UpdateAI(uint32 diff)
- {
- if (!UpdateVictim())
- return;
-
- if (ResetTimer <= diff)
- {
- if (me->IsWithinDist3d(119.223f, 1035.45f, 29.4481f, 10))
- {
- EnterEvadeMode();
- return;
- }
- ResetTimer = 5000;
- } else ResetTimer -= diff;
-
- if (CheckAddState_Timer <= diff)
- {
- for (uint8 i = 0; i < 4; ++i)
- if (Creature* temp = Unit::GetCreature(*me, AddGUID[i]))
- if (temp->IsAlive() && !temp->GetVictim())
- temp->AI()->AttackStart(me->GetVictim());
-
- CheckAddState_Timer = 5000;
- } else CheckAddState_Timer -= diff;
-
- if (DrainPower_Timer <= diff)
- {
- DoCast(me, SPELL_DRAIN_POWER, true);
- me->MonsterYell(YELL_DRAIN_POWER, LANG_UNIVERSAL, 0);
- DoPlaySoundToSet(me, SOUND_YELL_DRAIN_POWER);
- DrainPower_Timer = urand(40000, 55000); // must cast in 60 sec, or buff/debuff will disappear
- } else DrainPower_Timer -= diff;
-
- if (SpiritBolts_Timer <= diff)
- {
- if (DrainPower_Timer < 12000) // channel 10 sec
- SpiritBolts_Timer = 13000; // cast drain power first
- else
- {
- DoCast(me, SPELL_SPIRIT_BOLTS, false);
- me->MonsterYell(YELL_SPIRIT_BOLTS, LANG_UNIVERSAL, 0);
- DoPlaySoundToSet(me, SOUND_YELL_SPIRIT_BOLTS);
- SpiritBolts_Timer = 40000;
- SiphonSoul_Timer = 10000; // ready to drain
- PlayerAbility_Timer = 99999;
- }
- } else SpiritBolts_Timer -= diff;
-
- if (SiphonSoul_Timer <= diff)
- {
- Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 70, true);
- Unit* trigger = DoSpawnCreature(NPC_TEMP_TRIGGER, 0, 0, 0, 0, TEMPSUMMON_TIMED_DESPAWN, 30000);
- if (!target || !trigger)
- {
- EnterEvadeMode();
- return;
- }
- else
- {
- trigger->SetDisplayId(11686);
- trigger->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- trigger->CastSpell(target, SPELL_SIPHON_SOUL, true);
- trigger->GetMotionMaster()->MoveChase(me);
-
- //DoCast(target, SPELL_SIPHON_SOUL, true);
- //me->SetUInt64Value(UNIT_FIELD_CHANNEL_OBJECT, target->GetGUID());
- //me->SetUInt32Value(UNIT_CHANNEL_SPELL, SPELL_SIPHON_SOUL);
-
- PlayerGUID = target->GetGUID();
- PlayerAbility_Timer = urand(8000, 10000);
- PlayerClass = target->getClass() - 1;
-
- if (PlayerClass == CLASS_DRUID-1)
- PlayerClass = CLASS_DRUID;
- else if (PlayerClass == CLASS_PRIEST-1 && target->HasSpell(15473))
- PlayerClass = CLASS_PRIEST; // shadow priest
-
- SiphonSoul_Timer = 99999; // buff lasts 30 sec
- }
- } else SiphonSoul_Timer -= diff;
-
- if (PlayerAbility_Timer <= diff)
- {
- //Unit* target = Unit::GetUnit(*me, PlayerGUID);
- //if (target && target->IsAlive())
- //{
- UseAbility();
- PlayerAbility_Timer = urand(8000, 10000);
- //}
- } else PlayerAbility_Timer -= diff;
-
- DoMeleeAttackIfReady();
- }
-
- void UseAbility()
- {
- uint8 random = urand(0, 2);
- Unit* target = NULL;
- switch (PlayerAbility[PlayerClass][random].target)
- {
- case ABILITY_TARGET_SELF:
- target = me;
- break;
- case ABILITY_TARGET_VICTIM:
- target = me->GetVictim();
- break;
- case ABILITY_TARGET_ENEMY:
- default:
- target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true);
- break;
- case ABILITY_TARGET_HEAL:
- target = DoSelectLowestHpFriendly(50, 0);
- break;
- case ABILITY_TARGET_BUFF:
- {
- std::list<Creature*> templist = DoFindFriendlyMissingBuff(50, PlayerAbility[PlayerClass][random].spell);
- if (!templist.empty())
- target = *(templist.begin());
- }
- break;
- }
- if (target)
- DoCast(target, PlayerAbility[PlayerClass][random].spell, false);
+ Talk(SAY_DEATH);
+ _JustDied();
}
- };
-
- CreatureAI* GetAI(Creature* creature) const
- {
- return new boss_hex_lord_malacrassAI(creature);
- }
-};
-
-#define SPELL_BLOODLUST 43578
-#define SPELL_CLEAVE 15496
-
-class boss_thurg : public CreatureScript
-{
- public:
-
- boss_thurg()
- : CreatureScript("boss_thurg")
- {
- }
-
- struct boss_thurgAI : public boss_hexlord_addAI
- {
- boss_thurgAI(Creature* creature) : boss_hexlord_addAI(creature) {}
-
- uint32 bloodlust_timer;
- uint32 cleave_timer;
-
- void Reset()
+ void KilledUnit(Unit* victim)
{
- bloodlust_timer = 15000;
- cleave_timer = 10000;
-
- boss_hexlord_addAI::Reset();
+ if (victim->GetTypeId() == TYPEID_PLAYER)
+ Talk(SAY_PLAYER_KILL);
}
void UpdateAI(uint32 diff)
@@ -516,430 +79,28 @@ class boss_thurg : public CreatureScript
if (!UpdateVictim())
return;
- if (bloodlust_timer <= diff)
- {
- std::list<Creature*> templist = DoFindFriendlyMissingBuff(50, SPELL_BLOODLUST);
- if (!templist.empty())
- {
- if (Unit* target = *(templist.begin()))
- DoCast(target, SPELL_BLOODLUST, false);
- }
- bloodlust_timer = 12000;
- } else bloodlust_timer -= diff;
-
- if (cleave_timer <= diff)
- {
- DoCastVictim(SPELL_CLEAVE, false);
- cleave_timer = 12000; //3 sec cast
- } else cleave_timer -= diff;
-
- boss_hexlord_addAI::UpdateAI(diff);
- }
- };
-
- CreatureAI* GetAI(Creature* creature) const
- {
- return new boss_thurgAI(creature);
- }
-};
+ events.Update(diff);
-#define SPELL_FLASH_HEAL 43575
-#define SPELL_DISPEL_MAGIC 43577
-
-class boss_alyson_antille : public CreatureScript
-{
- public:
-
- boss_alyson_antille()
- : CreatureScript("boss_alyson_antille")
- {
- }
-
- struct boss_alyson_antilleAI : public boss_hexlord_addAI
- {
- //Holy Priest
- boss_alyson_antilleAI(Creature* creature) : boss_hexlord_addAI(creature) {}
-
- uint32 flashheal_timer;
- uint32 dispelmagic_timer;
-
- void Reset()
- {
- flashheal_timer = 2500;
- dispelmagic_timer = 10000;
-
- //AcquireGUID();
-
- boss_hexlord_addAI::Reset();
- }
-
- void AttackStart(Unit* who)
- {
- if (!who)
+ if (me->HasUnitState(UNIT_STATE_CASTING))
return;
-
- if (who->isTargetableForAttack())
+ /*
+ while (uint32 eventId = events.ExecuteEvent())
{
- if (me->Attack(who, false))
+ switch (eventId)
{
- me->GetMotionMaster()->MoveChase(who, 20);
- me->AddThreat(who, 0.0f);
+ default:
+ break;
}
}
- }
-
- void UpdateAI(uint32 diff)
- {
- if (!UpdateVictim())
- return;
-
- if (flashheal_timer <= diff)
- {
- Unit* target = DoSelectLowestHpFriendly(99, 30000);
- if (target)
- {
- if (target->IsWithinDistInMap(me, 50))
- DoCast(target, SPELL_FLASH_HEAL, false);
- else
- {
- // bugged
- //me->GetMotionMaster()->Clear();
- //me->GetMotionMaster()->MoveChase(target, 20);
- }
- }
- else
- {
- if (urand(0, 1))
- target = DoSelectLowestHpFriendly(50, 0);
- else
- target = SelectTarget(SELECT_TARGET_RANDOM, 0);
- if (target)
- DoCast(target, SPELL_DISPEL_MAGIC, false);
- }
- flashheal_timer = 2500;
- } else flashheal_timer -= diff;
-
- /*if (dispelmagic_timer <= diff)
- {
- if (urand(0, 1))
- {
- Unit* target = SelectTarget();
+ */
- DoCast(target, SPELL_DISPEL_MAGIC, false);
- }
- else
- me->CastSpell(SelectUnit(SELECT_TARGET_RANDOM, 0), SPELL_DISPEL_MAGIC, false);
-
- dispelmagic_timer = 12000;
- } else dispelmagic_timer -= diff;*/
-
- boss_hexlord_addAI::UpdateAI(diff);
- }
- };
-
- CreatureAI* GetAI(Creature* creature) const
- {
- return new boss_alyson_antilleAI(creature);
- }
-};
-
-#define SPELL_FIREBOLT 43584
-
-struct boss_gazakrothAI : public boss_hexlord_addAI
-{
- boss_gazakrothAI(Creature* creature) : boss_hexlord_addAI(creature) {}
-
- uint32 firebolt_timer;
-
- void Reset()
- {
- firebolt_timer = 2000;
- boss_hexlord_addAI::Reset();
- }
-
- void AttackStart(Unit* who)
- {
- if (!who)
- return;
-
- if (who->isTargetableForAttack())
- {
- if (me->Attack(who, false))
- {
- me->GetMotionMaster()->MoveChase(who, 20);
- me->AddThreat(who, 0.0f);
- }
- }
- }
-
- void UpdateAI(uint32 diff)
- {
- if (!UpdateVictim())
- return;
-
- if (firebolt_timer <= diff)
- {
- DoCastVictim(SPELL_FIREBOLT, false);
- firebolt_timer = 700;
- } else firebolt_timer -= diff;
-
- boss_hexlord_addAI::UpdateAI(diff);
- }
-};
-
-#define SPELL_FLAME_BREATH 43582
-#define SPELL_THUNDERCLAP 43583
-
-class boss_lord_raadan : public CreatureScript
-{
- public:
-
- boss_lord_raadan()
- : CreatureScript("boss_lord_raadan")
- {
- }
-
- struct boss_lord_raadanAI : public boss_hexlord_addAI
- {
- boss_lord_raadanAI(Creature* creature) : boss_hexlord_addAI(creature) {}
-
- uint32 flamebreath_timer;
- uint32 thunderclap_timer;
-
- void Reset()
- {
- flamebreath_timer = 8000;
- thunderclap_timer = 13000;
-
- boss_hexlord_addAI::Reset();
-
- }
- void UpdateAI(uint32 diff)
- {
- if (!UpdateVictim())
- return;
-
- if (thunderclap_timer <= diff)
- {
- DoCastVictim(SPELL_THUNDERCLAP, false);
- thunderclap_timer = 12000;
- } else thunderclap_timer -= diff;
-
- if (flamebreath_timer <= diff)
- {
- DoCastVictim(SPELL_FLAME_BREATH, false);
- flamebreath_timer = 12000;
- } else flamebreath_timer -= diff;
-
- boss_hexlord_addAI::UpdateAI(diff);
- }
- };
-
- CreatureAI* GetAI(Creature* creature) const
- {
- return new boss_lord_raadanAI(creature);
- }
-};
-
-#define SPELL_PSYCHIC_WAIL 43590
-
-class boss_darkheart : public CreatureScript
-{
- public:
-
- boss_darkheart()
- : CreatureScript("boss_darkheart")
- {
- }
-
- struct boss_darkheartAI : public boss_hexlord_addAI
- {
- boss_darkheartAI(Creature* creature) : boss_hexlord_addAI(creature) {}
-
- uint32 psychicwail_timer;
-
- void Reset()
- {
- psychicwail_timer = 8000;
- boss_hexlord_addAI::Reset();
- }
- void UpdateAI(uint32 diff)
- {
- if (!UpdateVictim())
- return;
-
- if (psychicwail_timer <= diff)
- {
- DoCastVictim(SPELL_PSYCHIC_WAIL, false);
- psychicwail_timer = 12000;
- } else psychicwail_timer -= diff;
-
- boss_hexlord_addAI::UpdateAI(diff);
- }
- };
-
- CreatureAI* GetAI(Creature* creature) const
- {
- return new boss_darkheartAI(creature);
- }
-};
-
-#define SPELL_VENOM_SPIT 43579
-
-class boss_slither : public CreatureScript
-{
- public:
-
- boss_slither()
- : CreatureScript("boss_slither")
- {
- }
-
- struct boss_slitherAI : public boss_hexlord_addAI
- {
- boss_slitherAI(Creature* creature) : boss_hexlord_addAI(creature) {}
-
- uint32 venomspit_timer;
-
- void Reset()
- {
- venomspit_timer = 5000;
- boss_hexlord_addAI::Reset();
- }
-
- void AttackStart(Unit* who)
- {
- if (!who)
- return;
-
- if (who->isTargetableForAttack())
- {
- if (me->Attack(who, false))
- {
- me->GetMotionMaster()->MoveChase(who, 20);
- me->AddThreat(who, 0.0f);
- }
- }
- }
-
- void UpdateAI(uint32 diff)
- {
- if (!UpdateVictim())
- return;
-
- if (venomspit_timer <= diff)
- {
- if (Unit* victim = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
- DoCast(victim, SPELL_VENOM_SPIT, false);
- venomspit_timer = 2500;
- } else venomspit_timer -= diff;
-
- boss_hexlord_addAI::UpdateAI(diff);
- }
- };
-
- CreatureAI* GetAI(Creature* creature) const
- {
- return new boss_slitherAI(creature);
- }
-};
-
-//Fenstalker
-#define SPELL_VOLATILE_INFECTION 43586
-class boss_fenstalker : public CreatureScript
-{
- public:
-
- boss_fenstalker()
- : CreatureScript("boss_fenstalker")
- {
- }
-
- struct boss_fenstalkerAI : public boss_hexlord_addAI
- {
- boss_fenstalkerAI(Creature* creature) : boss_hexlord_addAI(creature) {}
-
- uint32 volatileinf_timer;
-
- void Reset()
- {
- volatileinf_timer = 15000;
- boss_hexlord_addAI::Reset();
-
- }
- void UpdateAI(uint32 diff)
- {
- if (!UpdateVictim())
- return;
-
- if (volatileinf_timer <= diff)
- {
- // core bug
- me->GetVictim()->CastSpell(me->GetVictim(), SPELL_VOLATILE_INFECTION, false);
- volatileinf_timer = 12000;
- } else volatileinf_timer -= diff;
-
- boss_hexlord_addAI::UpdateAI(diff);
- }
- };
-
- CreatureAI* GetAI(Creature* creature) const
- {
- return new boss_fenstalkerAI(creature);
- }
-};
-
-//Koragg
-#define SPELL_COLD_STARE 43593
-#define SPELL_MIGHTY_BLOW 43592
-
-class boss_koragg : public CreatureScript
-{
- public:
-
- boss_koragg()
- : CreatureScript("boss_koragg")
- {
- }
-
- struct boss_koraggAI : public boss_hexlord_addAI
- {
- boss_koraggAI(Creature* creature) : boss_hexlord_addAI(creature) {}
-
- uint32 coldstare_timer;
- uint32 mightyblow_timer;
-
- void Reset()
- {
- coldstare_timer = 15000;
- mightyblow_timer = 10000;
- boss_hexlord_addAI::Reset();
-
- }
- void UpdateAI(uint32 diff)
- {
- if (!UpdateVictim())
- return;
-
- if (mightyblow_timer <= diff)
- {
- DoCastVictim(SPELL_MIGHTY_BLOW, false);
- mightyblow_timer = 12000;
- }
- if (coldstare_timer <= diff)
- {
- if (Unit* victim = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
- DoCast(victim, SPELL_COLD_STARE, false);
- coldstare_timer = 12000;
- }
-
- boss_hexlord_addAI::UpdateAI(diff);
+ DoMeleeAttackIfReady();
}
};
CreatureAI* GetAI(Creature* creature) const
{
- return new boss_koraggAI(creature);
+ return GetZulAmanAI<boss_hex_lord_malacrassAI>(creature);
}
};
@@ -980,14 +141,5 @@ class spell_hexlord_unstable_affliction : public SpellScriptLoader
void AddSC_boss_hex_lord_malacrass()
{
new boss_hexlord_malacrass();
- new boss_thurg();
- // new boss_gazakroth();
- new boss_lord_raadan();
- new boss_darkheart();
- new boss_slither();
- new boss_fenstalker();
- new boss_koragg();
- new boss_alyson_antille();
new spell_hexlord_unstable_affliction();
}
-
diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_janalai.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_janalai.cpp
index 3b8e3d5fdb2..0521fb28101 100644
--- a/src/server/scripts/EasternKingdoms/ZulAman/boss_janalai.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_janalai.cpp
@@ -1,6 +1,5 @@
/*
* Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
- * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
*
* 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
@@ -16,693 +15,93 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/* ScriptData
-SDName: Boss_Janalai
-SD%Complete: 100
-SDComment:
-SDCategory: Zul'Aman
-EndScriptData */
-
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "zulaman.h"
-#include "GridNotifiers.h"
-#include "CellImpl.h"
-enum eEnums
+enum Says
{
- SAY_AGGRO = 0,
- SAY_FIRE_BOMBS = 1,
- SAY_SUMMON_HATCHER = 2,
- SAY_ALL_EGGS = 3,
- SAY_BERSERK = 4,
- SAY_SLAY = 5,
- SAY_DEATH = 6,
- SAY_EVENT_STRANGERS = 7,
- SAY_EVENT_FRIENDS = 8,
-
-// Jan'alai
- SPELL_FLAME_BREATH = 43140,
- SPELL_FIRE_WALL = 43113,
- SPELL_ENRAGE = 44779,
- SPELL_SUMMON_PLAYERS = 43097,
- SPELL_TELE_TO_CENTER = 43098, // coord
- SPELL_HATCH_ALL = 43144,
- SPELL_BERSERK = 45078,
-
-// -- Fire Bob Spells
- SPELL_FIRE_BOMB_CHANNEL = 42621, // last forever
- SPELL_FIRE_BOMB_THROW = 42628, // throw visual
- SPELL_FIRE_BOMB_DUMMY = 42629, // bomb visual
- SPELL_FIRE_BOMB_DAMAGE = 42630,
-
-// --Summons
- NPC_AMANI_HATCHER = 23818,
- NPC_HATCHLING = 23598, // 42493
- NPC_EGG = 23817,
- NPC_FIRE_BOMB = 23920,
-
-// -- Hatcher Spells
- SPELL_HATCH_EGG = 42471, // 43734
- SPELL_SUMMON_HATCHLING = 42493,
-
-// -- Hatchling Spells
- SPELL_FLAMEBUFFET = 43299
+ SAY_AGGRO = 0,
+ SAY_PLAYER_KILL = 1,
+ SAY_SUMMON_HATCHER = 2,
+ SAY_FIRE_BOMB = 3,
+ SAY_HATCH_ALL_EGGS = 4,
+ EMOTE_FRENZY = 5,
+ SAY_DEATH = 6
};
-const int area_dx = 44;
-const int area_dy = 51;
-
-float JanalainPos[1][3] =
+enum Spells
{
- {-33.93f, 1149.27f, 19}
};
-float FireWallCoords[4][4] =
+enum Events
{
- {-10.13f, 1149.27f, 19, 3.1415f},
- {-33.93f, 1123.90f, 19, 0.5f*3.1415f},
- {-54.80f, 1150.08f, 19, 0},
- {-33.93f, 1175.68f, 19, 1.5f*3.1415f}
};
-float hatcherway[2][5][3] =
-{
- {
- {-87.46f, 1170.09f, 6},
- {-74.41f, 1154.75f, 6},
- {-52.74f, 1153.32f, 19},
- {-33.37f, 1172.46f, 19},
- {-33.09f, 1203.87f, 19}
- },
- {
- {-86.57f, 1132.85f, 6},
- {-73.94f, 1146.00f, 6},
- {-52.29f, 1146.51f, 19},
- {-33.57f, 1125.72f, 19},
- {-34.29f, 1095.22f, 19}
- }
-};
class boss_janalai : public CreatureScript
{
public:
- boss_janalai()
- : CreatureScript("boss_janalai")
- {
- }
+ boss_janalai() : CreatureScript("boss_janalai") { }
- struct boss_janalaiAI : public ScriptedAI
+ struct boss_janalaiAI : public BossAI
{
- boss_janalaiAI(Creature* creature) : ScriptedAI(creature)
- {
- instance = creature->GetInstanceScript();
- }
-
- InstanceScript* instance;
-
- uint32 FireBreathTimer;
- uint32 BombTimer;
- uint32 BombSequenceTimer;
- uint32 BombCount;
- uint32 HatcherTimer;
- uint32 EnrageTimer;
-
- bool noeggs;
- bool enraged;
- bool isBombing;
-
- bool isFlameBreathing;
-
- uint64 FireBombGUIDs[40];
+ boss_janalaiAI(Creature* creature) : BossAI(creature, DATA_JANALAI) { }
void Reset()
{
- if (instance)
- instance->SetData(DATA_JANALAIEVENT, NOT_STARTED);
-
- FireBreathTimer = 8000;
- BombTimer = 30000;
- BombSequenceTimer = 1000;
- BombCount = 0;
- HatcherTimer = 10000;
- EnrageTimer = MINUTE*5*IN_MILLISECONDS;
-
- noeggs = false;
- isBombing =false;
- enraged = false;
-
- isFlameBreathing = false;
-
- for (uint8 i = 0; i < 40; ++i)
- FireBombGUIDs[i] = 0;
-
- HatchAllEggs(1);
- }
-
- void JustDied(Unit* /*killer*/)
- {
- Talk(SAY_DEATH);
-
- if (instance)
- instance->SetData(DATA_JANALAIEVENT, DONE);
- }
-
- void KilledUnit(Unit* /*victim*/)
- {
- Talk(SAY_SLAY);
+ _Reset();
}
void EnterCombat(Unit* /*who*/)
{
- if (instance)
- instance->SetData(DATA_JANALAIEVENT, IN_PROGRESS);
-
Talk(SAY_AGGRO);
- // DoZoneInCombat();
- }
-
- void DamageDealt(Unit* target, uint32 &damage, DamageEffectType /*damagetype*/)
- {
- if (isFlameBreathing)
- {
- if (!me->HasInArc(M_PI/6, target))
- damage = 0;
- }
- }
-
- void FireWall()
- {
- uint8 WallNum;
- Creature* wall = NULL;
- for (uint8 i = 0; i < 4; ++i)
- {
- if (i == 0 || i == 2)
- WallNum = 3;
- else
- WallNum = 2;
-
- for (uint8 j = 0; j < WallNum; j++)
- {
- if (WallNum == 3)
- wall = me->SummonCreature(NPC_FIRE_BOMB, FireWallCoords[i][0], FireWallCoords[i][1]+5*(j-1), FireWallCoords[i][2], FireWallCoords[i][3], TEMPSUMMON_TIMED_DESPAWN, 15000);
- else
- wall = me->SummonCreature(NPC_FIRE_BOMB, FireWallCoords[i][0]-2+4*j, FireWallCoords[i][1], FireWallCoords[i][2], FireWallCoords[i][3], TEMPSUMMON_TIMED_DESPAWN, 15000);
- if (wall) wall->CastSpell(wall, SPELL_FIRE_WALL, true);
- }
- }
- }
-
- void SpawnBombs()
- {
- float dx, dy;
- for (int i(0); i < 40; ++i)
- {
- dx = float(irand(-area_dx/2, area_dx/2));
- dy = float(irand(-area_dy/2, area_dy/2));
-
- Creature* bomb = DoSpawnCreature(NPC_FIRE_BOMB, dx, dy, 0, 0, TEMPSUMMON_TIMED_DESPAWN, 15000);
- if (bomb)
- FireBombGUIDs[i] = bomb->GetGUID();
- }
- BombCount = 0;
- }
-
- bool HatchAllEggs(uint32 action) //1: reset, 2: isHatching all
- {
- std::list<Creature*> templist;
- float x, y, z;
- me->GetPosition(x, y, z);
-
- {
- CellCoord pair(Trinity::ComputeCellCoord(x, y));
- Cell cell(pair);
- cell.SetNoCreate();
-
- Trinity::AllCreaturesOfEntryInRange check(me, NPC_EGG, 100);
- Trinity::CreatureListSearcher<Trinity::AllCreaturesOfEntryInRange> searcher(me, templist, check);
-
- TypeContainerVisitor<Trinity::CreatureListSearcher<Trinity::AllCreaturesOfEntryInRange>, GridTypeMapContainer> cSearcher(searcher);
-
- cell.Visit(pair, cSearcher, *me->GetMap(), *me, me->GetGridActivationRange());
- }
-
- //TC_LOG_ERROR(LOG_FILTER_TSCR, "Eggs %d at middle", templist.size());
- if (templist.empty())
- return false;
-
- for (std::list<Creature*>::const_iterator i = templist.begin(); i != templist.end(); ++i)
- {
- if (action == 1)
- (*i)->SetDisplayId(10056);
- else if (action == 2 &&(*i)->GetDisplayId() != 11686)
- (*i)->CastSpell(*i, SPELL_HATCH_EGG, false);
- }
- return true;
+ _EnterCombat();
}
- void Boom()
+ void JustDied(Unit* /*killer*/)
{
- std::list<Creature*> templist;
- float x, y, z;
- me->GetPosition(x, y, z);
-
- {
- CellCoord pair(Trinity::ComputeCellCoord(x, y));
- Cell cell(pair);
- cell.SetNoCreate();
-
- Trinity::AllCreaturesOfEntryInRange check(me, NPC_FIRE_BOMB, 100);
- Trinity::CreatureListSearcher<Trinity::AllCreaturesOfEntryInRange> searcher(me, templist, check);
-
- TypeContainerVisitor<Trinity::CreatureListSearcher<Trinity::AllCreaturesOfEntryInRange>, GridTypeMapContainer> cSearcher(searcher);
-
- cell.Visit(pair, cSearcher, *me->GetMap(), *me, me->GetGridActivationRange());
- }
- for (std::list<Creature*>::const_iterator i = templist.begin(); i != templist.end(); ++i)
- {
- (*i)->CastSpell(*i, SPELL_FIRE_BOMB_DAMAGE, true);
- (*i)->RemoveAllAuras();
- }
+ Talk(SAY_DEATH);
+ _JustDied();
}
- void HandleBombSequence()
+ void KilledUnit(Unit* victim)
{
- if (BombCount < 40)
- {
- if (Unit* FireBomb = Unit::GetUnit(*me, FireBombGUIDs[BombCount]))
- {
- FireBomb->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- DoCast(FireBomb, SPELL_FIRE_BOMB_THROW, true);
- FireBomb->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- }
- ++BombCount;
- if (BombCount == 40)
- {
- BombSequenceTimer = 5000;
- } else BombSequenceTimer = 100;
- }
- else
- {
- Boom();
- isBombing = false;
- BombTimer = urand(20000, 40000);
- me->RemoveAurasDueToSpell(SPELL_FIRE_BOMB_CHANNEL);
- if (EnrageTimer <= 10000)
- EnrageTimer = 0;
- else
- EnrageTimer -= 10000;
- }
+ if (victim->GetTypeId() == TYPEID_PLAYER)
+ Talk(SAY_PLAYER_KILL);
}
void UpdateAI(uint32 diff)
{
- if (isFlameBreathing)
- {
- if (!me->IsNonMeleeSpellCasted(false))
- isFlameBreathing = false;
- else
- return;
- }
-
- if (isBombing)
- {
- if (BombSequenceTimer <= diff)
- HandleBombSequence();
- else
- BombSequenceTimer -= diff;
- return;
- }
-
if (!UpdateVictim())
return;
- //enrage if under 25% hp before 5 min.
- if (!enraged && HealthBelowPct(25))
- EnrageTimer = 0;
-
- if (EnrageTimer <= diff)
- {
- if (!enraged)
- {
- DoCast(me, SPELL_ENRAGE, true);
- enraged = true;
- EnrageTimer = 300000;
- }
- else
- {
- Talk(SAY_BERSERK);
- DoCast(me, SPELL_BERSERK, true);
- EnrageTimer = 300000;
- }
- } else EnrageTimer -= diff;
-
- if (BombTimer <= diff)
- {
- Talk(SAY_FIRE_BOMBS);
-
- me->AttackStop();
- me->GetMotionMaster()->Clear();
- DoTeleportTo(JanalainPos[0][0], JanalainPos[0][1], JanalainPos[0][2]);
- me->StopMoving();
- DoCast(me, SPELL_FIRE_BOMB_CHANNEL, false);
- //DoTeleportPlayer(me, JanalainPos[0][0], JanalainPos[0][1], JanalainPos[0][2], 0);
- //DoCast(me, SPELL_TELE_TO_CENTER, true);
+ events.Update(diff);
- FireWall();
- SpawnBombs();
- isBombing = true;
- BombSequenceTimer = 100;
-
- //Teleport every Player into the middle
- Map* map = me->GetMap();
- if (!map->IsDungeon())
- return;
-
- Map::PlayerList const &PlayerList = map->GetPlayers();
- for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i)
- if (Player* i_pl = i->GetSource())
- if (i_pl->IsAlive())
- DoTeleportPlayer(i_pl, JanalainPos[0][0]-5+rand()%10, JanalainPos[0][1]-5+rand()%10, JanalainPos[0][2], 0);
- //DoCast(Temp, SPELL_SUMMON_PLAYERS, true) // core bug, spell does not work if too far
+ if (me->HasUnitState(UNIT_STATE_CASTING))
return;
- } else BombTimer -= diff;
-
- if (!noeggs)
+ /*
+ while (uint32 eventId = events.ExecuteEvent())
{
- if (HealthBelowPct(35))
+ switch (eventId)
{
- Talk(SAY_ALL_EGGS);
-
- me->AttackStop();
- me->GetMotionMaster()->Clear();
- DoTeleportTo(JanalainPos[0][0], JanalainPos[0][1], JanalainPos[0][2]);
- me->StopMoving();
- DoCast(me, SPELL_HATCH_ALL, false);
- HatchAllEggs(2);
- noeggs = true;
+ default:
+ break;
}
- else if (HatcherTimer <= diff)
- {
- if (HatchAllEggs(0))
- {
- Talk(SAY_SUMMON_HATCHER);
- me->SummonCreature(NPC_AMANI_HATCHER, hatcherway[0][0][0], hatcherway[0][0][1], hatcherway[0][0][2], 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000);
- me->SummonCreature(NPC_AMANI_HATCHER, hatcherway[1][0][0], hatcherway[1][0][1], hatcherway[1][0][2], 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000);
- HatcherTimer = 90000;
- }
- else
- noeggs = true;
- } else HatcherTimer -= diff;
}
-
- EnterEvadeIfOutOfCombatArea(diff);
+ */
DoMeleeAttackIfReady();
-
- if (FireBreathTimer <= diff)
- {
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
- {
- me->AttackStop();
- me->GetMotionMaster()->Clear();
- DoCast(target, SPELL_FLAME_BREATH, false);
- me->StopMoving();
- isFlameBreathing = true;
- }
- FireBreathTimer = 8000;
- } else FireBreathTimer -= diff;
}
};
CreatureAI* GetAI(Creature* creature) const
{
- return new boss_janalaiAI(creature);
+ return GetZulAmanAI<boss_janalaiAI>(creature);
}
};
-class npc_janalai_firebomb : public CreatureScript
-{
- public:
-
- npc_janalai_firebomb()
- : CreatureScript("npc_janalai_firebomb")
- {
- }
-
- struct npc_janalai_firebombAI : public ScriptedAI
- {
- npc_janalai_firebombAI(Creature* creature) : ScriptedAI(creature){}
-
- void Reset() {}
-
- void SpellHit(Unit* /*caster*/, const SpellInfo* spell)
- {
- if (spell->Id == SPELL_FIRE_BOMB_THROW)
- DoCast(me, SPELL_FIRE_BOMB_DUMMY, true);
- }
-
- void EnterCombat(Unit* /*who*/) {}
-
- void AttackStart(Unit* /*who*/) {}
-
- void MoveInLineOfSight(Unit* /*who*/) {}
-
- void UpdateAI(uint32 /*diff*/) {}
- };
-
- CreatureAI* GetAI(Creature* creature) const
- {
- return new npc_janalai_firebombAI(creature);
- }
-};
-
-class npc_janalai_hatcher : public CreatureScript
-{
- public:
-
- npc_janalai_hatcher()
- : CreatureScript("npc_janalai_hatcher")
- {
- }
-
- struct npc_janalai_hatcherAI : public ScriptedAI
- {
- npc_janalai_hatcherAI(Creature* creature) : ScriptedAI(creature)
- {
- instance = creature->GetInstanceScript();
- }
-
- InstanceScript* instance;
-
- uint32 waypoint;
- uint32 HatchNum;
- uint32 WaitTimer;
-
- bool side;
- bool hasChangedSide;
- bool isHatching;
-
- void Reset()
- {
- me->SetWalk(true);
- side =(me->GetPositionY() < 1150);
- waypoint = 0;
- isHatching = false;
- hasChangedSide = false;
- WaitTimer = 1;
- HatchNum = 0;
- }
-
- bool HatchEggs(uint32 num)
- {
- std::list<Creature*> templist;
- float x, y, z;
- me->GetPosition(x, y, z);
-
- {
- CellCoord pair(Trinity::ComputeCellCoord(x, y));
- Cell cell(pair);
- cell.SetNoCreate();
-
- Trinity::AllCreaturesOfEntryInRange check(me, 23817, 50);
- Trinity::CreatureListSearcher<Trinity::AllCreaturesOfEntryInRange> searcher(me, templist, check);
-
- TypeContainerVisitor<Trinity::CreatureListSearcher<Trinity::AllCreaturesOfEntryInRange>, GridTypeMapContainer> cSearcher(searcher);
-
- cell.Visit(pair, cSearcher, *(me->GetMap()), *me, me->GetGridActivationRange());
- }
-
- //TC_LOG_ERROR(LOG_FILTER_TSCR, "Eggs %d at %d", templist.size(), side);
-
- for (std::list<Creature*>::const_iterator i = templist.begin(); i != templist.end() && num > 0; ++i)
- if ((*i)->GetDisplayId() != 11686)
- {
- (*i)->CastSpell(*i, SPELL_HATCH_EGG, false);
- num--;
- }
-
- return num == 0; // if num == 0, no more templist
- }
-
- void EnterCombat(Unit* /*who*/) {}
- void AttackStart(Unit* /*who*/) {}
- void MoveInLineOfSight(Unit* /*who*/) {}
- void MovementInform(uint32, uint32)
- {
- if (waypoint == 5)
- {
- isHatching = true;
- HatchNum = 1;
- WaitTimer = 5000;
- }
- else
- WaitTimer = 1;
- }
-
- void UpdateAI(uint32 diff)
- {
- if (!instance || !(instance->GetData(DATA_JANALAIEVENT) == IN_PROGRESS))
- {
- me->DisappearAndDie();
- return;
- }
-
- if (!isHatching)
- {
- if (WaitTimer)
- {
- me->GetMotionMaster()->Clear();
- me->GetMotionMaster()->MovePoint(0, hatcherway[side][waypoint][0], hatcherway[side][waypoint][1], hatcherway[side][waypoint][2]);
- ++waypoint;
- WaitTimer = 0;
- }
- }
- else
- {
- if (WaitTimer <= diff)
- {
- if (HatchEggs(HatchNum))
- {
- ++HatchNum;
- WaitTimer = 10000;
- }
- else if (!hasChangedSide)
- {
- side = side ? 0 : 1;
- isHatching = false;
- waypoint = 3;
- WaitTimer = 1;
- hasChangedSide = true;
- }
- else
- me->DisappearAndDie();
-
- } else WaitTimer -= diff;
- }
- }
- };
-
- CreatureAI* GetAI(Creature* creature) const
- {
- return new npc_janalai_hatcherAI(creature);
- }
-};
-
-class npc_janalai_hatchling : public CreatureScript
-{
- public:
-
- npc_janalai_hatchling()
- : CreatureScript("npc_janalai_hatchling")
- {
- }
-
- struct npc_janalai_hatchlingAI : public ScriptedAI
- {
- npc_janalai_hatchlingAI(Creature* creature) : ScriptedAI(creature)
- {
- instance = creature->GetInstanceScript();
- }
-
- InstanceScript* instance;
- uint32 BuffetTimer;
-
- void Reset()
- {
- BuffetTimer = 7000;
- if (me->GetPositionY() > 1150)
- me->GetMotionMaster()->MovePoint(0, hatcherway[0][3][0]+rand()%4-2, 1150.0f+rand()%4-2, hatcherway[0][3][2]);
- else
- me->GetMotionMaster()->MovePoint(0, hatcherway[1][3][0]+rand()%4-2, 1150.0f+rand()%4-2, hatcherway[1][3][2]);
-
- me->SetDisableGravity(true);
- }
-
- void EnterCombat(Unit* /*who*/) {/*DoZoneInCombat();*/}
-
- void UpdateAI(uint32 diff)
- {
- if (!instance || !(instance->GetData(DATA_JANALAIEVENT) == IN_PROGRESS))
- {
- me->DisappearAndDie();
- return;
- }
-
- if (!UpdateVictim())
- return;
-
- if (BuffetTimer <= diff)
- {
- DoCastVictim(SPELL_FLAMEBUFFET, false);
- BuffetTimer = 10000;
- } else BuffetTimer -= diff;
-
- DoMeleeAttackIfReady();
- }
- };
-
- CreatureAI* GetAI(Creature* creature) const
- {
- return new npc_janalai_hatchlingAI(creature);
- }
-};
-
-class npc_janalai_egg : public CreatureScript
-{
-public:
- npc_janalai_egg(): CreatureScript("npc_janalai_egg") {}
-
- CreatureAI* GetAI(Creature* creature) const
- {
- return new npc_janalai_eggAI(creature);
- }
-
- struct npc_janalai_eggAI : public ScriptedAI
- {
- npc_janalai_eggAI(Creature* creature) : ScriptedAI(creature){}
-
- void Reset() {}
-
- void UpdateAI(uint32 /*diff*/) {}
-
- void SpellHit(Unit* /*caster*/, const SpellInfo* spell)
- {
- if (spell->Id == SPELL_HATCH_EGG)
- {
- DoCast(SPELL_SUMMON_HATCHLING);
- }
- }
- };
-
-};
-
void AddSC_boss_janalai()
{
new boss_janalai();
- new npc_janalai_firebomb();
- new npc_janalai_hatcher();
- new npc_janalai_hatchling();
- new npc_janalai_egg();
}
-
diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp
index d73612a7935..444b6447f60 100644
--- a/src/server/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp
@@ -1,6 +1,5 @@
/*
* Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
- * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
*
* 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
@@ -16,432 +15,86 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/* ScriptData
-SDName: Boss_Nalorakk
-SD%Complete: 100
-SDComment:
-SDCategory: Zul'Aman
-EndScriptData */
-
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "zulaman.h"
-#include "GridNotifiers.h"
-#include "GridNotifiersImpl.h"
-#include "CellImpl.h"
-//Trash Waves
-float NalorakkWay[8][3] =
+enum Says
{
- { 18.569f, 1414.512f, 11.42f}, // waypoint 1
- {-17.264f, 1419.551f, 12.62f},
- {-52.642f, 1419.357f, 27.31f}, // waypoint 2
- {-69.908f, 1419.721f, 27.31f},
- {-79.929f, 1395.958f, 27.31f},
- {-80.072f, 1374.555f, 40.87f}, // waypoint 3
- {-80.072f, 1314.398f, 40.87f},
- {-80.072f, 1295.775f, 48.60f} // waypoint 4
+ SAY_WAVE_1 = 0,
+ SAY_WAVE_2 = 1,
+ SAY_WAVE_3 = 2,
+ SAY_WAVE_4 = 3,
+ SAY_AGGRO = 4,
+ SAY_PLAYER_KILL = 5,
+ SAY_SURGE = 6,
+ EMOTE_SURGE = 7,
+ EMOTE_BEAR = 8,
+ SAY_BEAR = 9,
+ SAY_TROLL = 10,
+ SAY_DEATH = 11
};
-#define YELL_NALORAKK_WAVE1 "Get da move on, guards! It be killin' time!"
-#define SOUND_NALORAKK_WAVE1 12066
-#define YELL_NALORAKK_WAVE2 "Guards, go already! Who you more afraid of, dem... or me?"
-#define SOUND_NALORAKK_WAVE2 12067
-#define YELL_NALORAKK_WAVE3 "Ride now! Ride out dere and bring me back some heads!"
-#define SOUND_NALORAKK_WAVE3 12068
-#define YELL_NALORAKK_WAVE4 "I be losin' me patience! Go on: make dem wish dey was never born!"
-#define SOUND_NALORAKK_WAVE4 12069
-
-//Unimplemented SoundIDs
-/*
-#define SOUND_NALORAKK_EVENT1 12078
-#define SOUND_NALORAKK_EVENT2 12079
-*/
-
-//General defines
-#define YELL_AGGRO "You be dead soon enough!"
-#define SOUND_YELL_AGGRO 12070
-#define YELL_KILL_ONE "Mua-ha-ha! Now whatchoo got to say?"
-#define SOUND_YELL_KILL_ONE 12075
-#define YELL_KILL_TWO "Da Amani gonna rule again!"
-#define SOUND_YELL_KILL_TWO 12076
-#define YELL_DEATH "I... be waitin' on da udda side...."
-#define SOUND_YELL_DEATH 12077
-#define YELL_BERSERK "You had your chance, now it be too late!" //Never seen this being used, so just guessing from what I hear.
-#define SOUND_YELL_BERSERK 12074
-
-#define SPELL_BERSERK 45078
-
-//Defines for Troll form
-#define SPELL_BRUTALSWIPE 42384
-#define SPELL_MANGLE 42389
-#define SPELL_MANGLEEFFECT 44955
-#define SPELL_SURGE 42402
-#define SPELL_BEARFORM 42377
-
-#define YELL_SURGE "I bring da pain!"
-#define SOUND_YELL_SURGE 12071
-
-#define YELL_SHIFTEDTOTROLL "Make way for Nalorakk!"
-#define SOUND_YELL_TOTROLL 12073
-
-//Defines for Bear form
-#define SPELL_LACERATINGSLASH 42395
-#define SPELL_RENDFLESH 42397
-#define SPELL_DEAFENINGROAR 42398
+enum Spells
+{
+};
-#define YELL_SHIFTEDTOBEAR "You call on da beast, you gonna get more dan you bargain for!"
-#define SOUND_YELL_TOBEAR 12072
+enum Events
+{
+};
class boss_nalorakk : public CreatureScript
{
public:
- boss_nalorakk()
- : CreatureScript("boss_nalorakk")
- {
- }
+ boss_nalorakk() : CreatureScript("boss_nalorakk") { }
- struct boss_nalorakkAI : public ScriptedAI
+ struct boss_nalorakkAI : public BossAI
{
- boss_nalorakkAI(Creature* creature) : ScriptedAI(creature)
- {
- MoveEvent = true;
- MovePhase = 0;
- instance = creature->GetInstanceScript();
- }
-
- InstanceScript* instance;
-
- uint32 BrutalSwipe_Timer;
- uint32 Mangle_Timer;
- uint32 Surge_Timer;
-
- uint32 LaceratingSlash_Timer;
- uint32 RendFlesh_Timer;
- uint32 DeafeningRoar_Timer;
-
- uint32 ShapeShift_Timer;
- uint32 Berserk_Timer;
-
- bool inBearForm;
- bool MoveEvent;
- bool inMove;
- uint32 MovePhase;
- uint32 waitTimer;
+ boss_nalorakkAI(Creature* creature) : BossAI(creature, DATA_NALORAKK) { }
void Reset()
{
- if (MoveEvent)
- {
- me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
- inMove = false;
- waitTimer = 0;
- me->SetSpeed(MOVE_RUN, 2);
- me->SetWalk(false);
- }else
- {
- (*me).GetMotionMaster()->MovePoint(0, NalorakkWay[7][0], NalorakkWay[7][1], NalorakkWay[7][2]);
- }
-
- if (instance)
- instance->SetData(DATA_NALORAKKEVENT, NOT_STARTED);
-
- Surge_Timer = urand(15000, 20000);
- BrutalSwipe_Timer = urand(7000, 12000);
- Mangle_Timer = urand(10000, 15000);
- ShapeShift_Timer = urand(45000, 50000);
- Berserk_Timer = 600000;
-
- inBearForm = false;
- // me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, 5122); /// @todo find the correct equipment id
- }
-
- void SendAttacker(Unit* target)
- {
- std::list<Creature*> templist;
- float x, y, z;
- me->GetPosition(x, y, z);
-
- {
- CellCoord pair(Trinity::ComputeCellCoord(x, y));
- Cell cell(pair);
- cell.SetNoCreate();
-
- Trinity::AllFriendlyCreaturesInGrid check(me);
- Trinity::CreatureListSearcher<Trinity::AllFriendlyCreaturesInGrid> searcher(me, templist, check);
-
- TypeContainerVisitor<Trinity::CreatureListSearcher<Trinity::AllFriendlyCreaturesInGrid>, GridTypeMapContainer> cSearcher(searcher);
-
- cell.Visit(pair, cSearcher, *(me->GetMap()), *me, me->GetGridActivationRange());
- }
-
- if (templist.empty())
- return;
-
- for (std::list<Creature*>::const_iterator i = templist.begin(); i != templist.end(); ++i)
- {
- if ((*i) && me->IsWithinDistInMap((*i), 25))
- {
- (*i)->SetNoCallAssistance(true);
- (*i)->AI()->AttackStart(target);
- }
- }
- }
-
- void AttackStart(Unit* who)
- {
- if (!MoveEvent)
- ScriptedAI::AttackStart(who);
- }
-
- void MoveInLineOfSight(Unit* who)
- {
- if (!MoveEvent)
- {
- ScriptedAI::MoveInLineOfSight(who);
- }
- else
- {
- if (me->IsHostileTo(who))
- {
- if (!inMove)
- {
- switch (MovePhase)
- {
- case 0:
- if (me->IsWithinDistInMap(who, 50))
- {
- me->MonsterYell(YELL_NALORAKK_WAVE1, LANG_UNIVERSAL, 0);
- DoPlaySoundToSet(me, SOUND_NALORAKK_WAVE1);
-
- (*me).GetMotionMaster()->MovePoint(1, NalorakkWay[1][0], NalorakkWay[1][1], NalorakkWay[1][2]);
- MovePhase ++;
- inMove = true;
-
- SendAttacker(who);
- }
- break;
- case 2:
- if (me->IsWithinDistInMap(who, 40))
- {
- me->MonsterYell(YELL_NALORAKK_WAVE2, LANG_UNIVERSAL, 0);
- DoPlaySoundToSet(me, SOUND_NALORAKK_WAVE2);
-
- (*me).GetMotionMaster()->MovePoint(3, NalorakkWay[3][0], NalorakkWay[3][1], NalorakkWay[3][2]);
- MovePhase ++;
- inMove = true;
-
- SendAttacker(who);
- }
- break;
- case 5:
- if (me->IsWithinDistInMap(who, 40))
- {
- me->MonsterYell(YELL_NALORAKK_WAVE3, LANG_UNIVERSAL, 0);
- DoPlaySoundToSet(me, SOUND_NALORAKK_WAVE3);
-
- (*me).GetMotionMaster()->MovePoint(6, NalorakkWay[6][0], NalorakkWay[6][1], NalorakkWay[6][2]);
- MovePhase ++;
- inMove = true;
-
- SendAttacker(who);
- }
- break;
- case 7:
- if (me->IsWithinDistInMap(who, 50))
- {
- SendAttacker(who);
-
- me->MonsterYell(YELL_NALORAKK_WAVE4, LANG_UNIVERSAL, 0);
- DoPlaySoundToSet(me, SOUND_NALORAKK_WAVE4);
-
- me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
-
- MoveEvent = false;
- }
- break;
- }
- }
- }
- }
+ _Reset();
}
void EnterCombat(Unit* /*who*/)
{
- if (instance)
- instance->SetData(DATA_NALORAKKEVENT, IN_PROGRESS);
-
- me->MonsterYell(YELL_AGGRO, LANG_UNIVERSAL, 0);
- DoPlaySoundToSet(me, SOUND_YELL_AGGRO);
- DoZoneInCombat();
+ Talk(SAY_AGGRO);
+ _EnterCombat();
}
void JustDied(Unit* /*killer*/)
{
- if (instance)
- instance->SetData(DATA_NALORAKKEVENT, DONE);
-
- me->MonsterYell(YELL_DEATH, LANG_UNIVERSAL, 0);
- DoPlaySoundToSet(me, SOUND_YELL_DEATH);
+ Talk(SAY_DEATH);
+ _JustDied();
}
- void KilledUnit(Unit* /*victim*/)
+ void KilledUnit(Unit* victim)
{
- switch (urand(0, 1))
- {
- case 0:
- me->MonsterYell(YELL_KILL_ONE, LANG_UNIVERSAL, 0);
- DoPlaySoundToSet(me, SOUND_YELL_KILL_ONE);
- break;
- case 1:
- me->MonsterYell(YELL_KILL_TWO, LANG_UNIVERSAL, 0);
- DoPlaySoundToSet(me, SOUND_YELL_KILL_TWO);
- break;
- }
- }
-
- void MovementInform(uint32 type, uint32 id)
- {
- if (MoveEvent)
- {
- if (type != POINT_MOTION_TYPE)
- return;
-
- if (!inMove)
- return;
-
- if (MovePhase != id)
- return;
-
- switch (MovePhase)
- {
- case 2:
- me->SetOrientation(3.1415f*2);
- inMove = false;
- return;
- case 1:
- case 3:
- case 4:
- case 6:
- MovePhase ++;
- waitTimer = 1;
- inMove = true;
- return;
- case 5:
- me->SetOrientation(3.1415f*0.5f);
- inMove = false;
- return;
- case 7:
- me->SetOrientation(3.1415f*0.5f);
- inMove = false;
- return;
- }
-
- }
+ if (victim->GetTypeId() == TYPEID_PLAYER)
+ Talk(SAY_PLAYER_KILL);
}
void UpdateAI(uint32 diff)
{
- if (waitTimer && inMove)
- {
- if (waitTimer <= diff)
- {
- (*me).GetMotionMaster()->MovementExpired();
- (*me).GetMotionMaster()->MovePoint(MovePhase, NalorakkWay[MovePhase][0], NalorakkWay[MovePhase][1], NalorakkWay[MovePhase][2]);
- waitTimer = 0;
- } else waitTimer -= diff;
- }
-
if (!UpdateVictim())
return;
- if (Berserk_Timer <= diff)
- {
- DoCast(me, SPELL_BERSERK, true);
- me->MonsterYell(YELL_BERSERK, LANG_UNIVERSAL, 0);
- DoPlaySoundToSet(me, SOUND_YELL_BERSERK);
- Berserk_Timer = 600000;
- } else Berserk_Timer -= diff;
+ events.Update(diff);
- if (ShapeShift_Timer <= diff)
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+ /*
+ while (uint32 eventId = events.ExecuteEvent())
{
- if (inBearForm)
- {
- // me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, 5122);
- me->MonsterYell(YELL_SHIFTEDTOTROLL, LANG_UNIVERSAL, 0);
- DoPlaySoundToSet(me, SOUND_YELL_TOTROLL);
- me->RemoveAurasDueToSpell(SPELL_BEARFORM);
- Surge_Timer = urand(15000, 20000);
- BrutalSwipe_Timer = urand(7000, 12000);
- Mangle_Timer = urand(10000, 15000);
- ShapeShift_Timer = urand(45000, 50000);
- inBearForm = false;
- }
- else
+ switch (eventId)
{
- // me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, 0);
- me->MonsterYell(YELL_SHIFTEDTOBEAR, LANG_UNIVERSAL, 0);
- DoPlaySoundToSet(me, SOUND_YELL_TOBEAR);
- DoCast(me, SPELL_BEARFORM, true);
- LaceratingSlash_Timer = 2000; // dur 18s
- RendFlesh_Timer = 3000; // dur 5s
- DeafeningRoar_Timer = urand(5000, 10000); // dur 2s
- ShapeShift_Timer = urand(20000, 25000); // dur 30s
- inBearForm = true;
+ default:
+ break;
}
- } else ShapeShift_Timer -= diff;
-
- if (!inBearForm)
- {
- if (BrutalSwipe_Timer <= diff)
- {
- DoCastVictim(SPELL_BRUTALSWIPE);
- BrutalSwipe_Timer = urand(7000, 12000);
- } else BrutalSwipe_Timer -= diff;
-
- if (Mangle_Timer <= diff)
- {
- if (me->GetVictim() && !me->GetVictim()->HasAura(SPELL_MANGLEEFFECT))
- {
- DoCastVictim(SPELL_MANGLE);
- Mangle_Timer = 1000;
- }
- else Mangle_Timer = urand(10000, 15000);
- } else Mangle_Timer -= diff;
-
- if (Surge_Timer <= diff)
- {
- me->MonsterYell(YELL_SURGE, LANG_UNIVERSAL, 0);
- DoPlaySoundToSet(me, SOUND_YELL_SURGE);
- Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 45, true);
- if (target)
- DoCast(target, SPELL_SURGE);
- Surge_Timer = urand(15000, 20000);
- } else Surge_Timer -= diff;
- }
- else
- {
- if (LaceratingSlash_Timer <= diff)
- {
- DoCastVictim(SPELL_LACERATINGSLASH);
- LaceratingSlash_Timer = urand(18000, 23000);
- } else LaceratingSlash_Timer -= diff;
-
- if (RendFlesh_Timer <= diff)
- {
- DoCastVictim(SPELL_RENDFLESH);
- RendFlesh_Timer = urand(5000, 10000);
- } else RendFlesh_Timer -= diff;
-
- if (DeafeningRoar_Timer <= diff)
- {
- DoCastVictim(SPELL_DEAFENINGROAR);
- DeafeningRoar_Timer = urand(15000, 20000);
- } else DeafeningRoar_Timer -= diff;
}
+ */
DoMeleeAttackIfReady();
}
@@ -457,4 +110,3 @@ void AddSC_boss_nalorakk()
{
new boss_nalorakk();
}
-
diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_zuljin.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_zuljin.cpp
deleted file mode 100644
index 49df46df95c..00000000000
--- a/src/server/scripts/EasternKingdoms/ZulAman/boss_zuljin.cpp
+++ /dev/null
@@ -1,604 +0,0 @@
-/*
- * Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
- * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
- *
- * 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, see <http://www.gnu.org/licenses/>.
- */
-
-/* ScriptData
-SDName: Boss_ZulJin
-SD%Complete: 85%
-SDComment:
-EndScriptData */
-
-#include "ScriptMgr.h"
-#include "ScriptedCreature.h"
-#include "zulaman.h"
-#include "SpellInfo.h"
-
-enum Says
-{
- YELL_INTRO = 0,
- YELL_AGGRO = 1,
- YELL_TRANSFORM_TO_BEAR = 2,
- YELL_TRANSFORM_TO_EAGLE = 3,
- YELL_TRANSFORM_TO_LYNX = 4,
- YELL_TRANSFORM_TO_DRAGONHAWK = 5,
- YELL_FIRE_BREATH = 6,
- YELL_BERSERK = 7,
- YELL_KILL = 8,
- YELL_DEATH = 9
-};
-
-enum Spells
-{
- // Troll Form
- SPELL_WHIRLWIND = 17207,
- SPELL_GRIEVOUS_THROW = 43093, // remove debuff after full healed
- // Bear Form
- SPELL_CREEPING_PARALYSIS = 43095, // should cast on the whole raid
- SPELL_OVERPOWER = 43456, // use after melee attack dodged
- // Eagle Form
- SPELL_ENERGY_STORM = 43983, // enemy area aura, trigger 42577
- SPELL_ZAP_INFORM = 42577,
- SPELL_ZAP_DAMAGE = 43137, // 1250 damage
- SPELL_SUMMON_CYCLONE = 43112, // summon four feather vortex
- CREATURE_FEATHER_VORTEX = 24136,
- SPELL_CYCLONE_VISUAL = 43119, // trigger 43147 visual
- SPELL_CYCLONE_PASSIVE = 43120, // trigger 43121 (4y aoe) every second
- // Lynx Form
- SPELL_CLAW_RAGE_HASTE = 42583,
- SPELL_CLAW_RAGE_TRIGGER = 43149,
- SPELL_CLAW_RAGE_DAMAGE = 43150,
- SPELL_LYNX_RUSH_HASTE = 43152,
- SPELL_LYNX_RUSH_DAMAGE = 43153,
- // Dragonhawk Form
- SPELL_FLAME_WHIRL = 43213, // trigger two spells
- SPELL_FLAME_BREATH = 43215,
- SPELL_SUMMON_PILLAR = 43216, // summon 24187
- CREATURE_COLUMN_OF_FIRE = 24187,
- SPELL_PILLAR_TRIGGER = 43218, // trigger 43217
- // Cosmetic
- SPELL_SPIRIT_AURA = 42466,
- SPELL_SIPHON_SOUL = 43501,
- // Transforms:
- SPELL_SHAPE_OF_THE_BEAR = 42594, // 15% dmg
- SPELL_SHAPE_OF_THE_EAGLE = 42606,
- SPELL_SHAPE_OF_THE_LYNX = 42607, // haste melee 30%
- SPELL_SHAPE_OF_THE_DRAGONHAWK = 42608,
-
- SPELL_BERSERK = 45078
-};
-
-enum Phase
-{
- PHASE_BEAR = 0,
- PHASE_EAGLE = 1,
- PHASE_LYNX = 2,
- PHASE_DRAGONHAWK = 3,
- PHASE_TROLL = 4
-};
-
-//coords for going for changing form
-#define CENTER_X 120.148811f
-#define CENTER_Y 703.713684f
-#define CENTER_Z 45.111477f
-
-struct SpiritInfoStruct
-{
- uint32 entry;
- float x, y, z, orient;
-};
-
-static SpiritInfoStruct SpiritInfo[4] =
-{
- {23878, 147.87f, 706.51f, 45.11f, 3.04f},
- {23880, 88.95f, 705.49f, 45.11f, 6.11f},
- {23877, 137.23f, 725.98f, 45.11f, 3.71f},
- {23879, 104.29f, 726.43f, 45.11f, 5.43f}
-};
-
-struct TransformStruct
-{
- uint8 text;
- uint32 spell, unaura;
-};
-
-static TransformStruct Transform[4] =
-{
- {YELL_TRANSFORM_TO_BEAR, SPELL_SHAPE_OF_THE_BEAR, SPELL_WHIRLWIND},
- {YELL_TRANSFORM_TO_EAGLE, SPELL_SHAPE_OF_THE_EAGLE, SPELL_SHAPE_OF_THE_BEAR},
- {YELL_TRANSFORM_TO_LYNX, SPELL_SHAPE_OF_THE_LYNX, SPELL_SHAPE_OF_THE_EAGLE},
- {YELL_TRANSFORM_TO_DRAGONHAWK, SPELL_SHAPE_OF_THE_DRAGONHAWK, SPELL_SHAPE_OF_THE_LYNX}
-};
-
-class boss_zuljin : public CreatureScript
-{
- public:
-
- boss_zuljin()
- : CreatureScript("boss_zuljin")
- {
- }
-
- struct boss_zuljinAI : public ScriptedAI
- {
- boss_zuljinAI(Creature* creature) : ScriptedAI(creature), Summons(me)
- {
- instance = creature->GetInstanceScript();
- }
- InstanceScript* instance;
-
- uint64 SpiritGUID[4];
- uint64 ClawTargetGUID;
- uint64 TankGUID;
-
- uint32 Phase;
- uint32 health_20;
-
- uint32 Intro_Timer;
- uint32 Berserk_Timer;
-
- uint32 Whirlwind_Timer;
- uint32 Grievous_Throw_Timer;
-
- uint32 Creeping_Paralysis_Timer;
- uint32 Overpower_Timer;
-
- uint32 Claw_Rage_Timer;
- uint32 Lynx_Rush_Timer;
- uint32 Claw_Counter;
- uint32 Claw_Loop_Timer;
-
- uint32 Flame_Whirl_Timer;
- uint32 Flame_Breath_Timer;
- uint32 Pillar_Of_Fire_Timer;
-
- SummonList Summons;
-
- void Reset()
- {
- if (instance)
- instance->SetData(DATA_ZULJINEVENT, NOT_STARTED);
-
- Phase = 0;
-
- health_20 = me->CountPctFromMaxHealth(20);
-
- Intro_Timer = 37000;
- Berserk_Timer = 600000;
-
- Whirlwind_Timer = 7000;
- Grievous_Throw_Timer = 8000;
-
- Creeping_Paralysis_Timer = 7000;
- Overpower_Timer = 0;
-
- Claw_Rage_Timer = 5000;
- Lynx_Rush_Timer = 14000;
- Claw_Loop_Timer = 0;
- Claw_Counter = 0;
-
- Flame_Whirl_Timer = 5000;
- Flame_Breath_Timer = 6000;
- Pillar_Of_Fire_Timer = 7000;
-
- ClawTargetGUID = 0;
- TankGUID = 0;
-
- Summons.DespawnAll();
-
- me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, 33975);
- //me->SetUInt32Value(UNIT_VIRTUAL_ITEM_INFO, 218172674);
- //me->SetByteValue(UNIT_FIELD_BYTES_2, 0, SHEATH_STATE_MELEE);
- }
-
- void EnterCombat(Unit* /*who*/)
- {
- if (instance)
- instance->SetData(DATA_ZULJINEVENT, IN_PROGRESS);
-
- DoZoneInCombat();
-
- Talk(YELL_INTRO);
- SpawnAdds();
- EnterPhase(0);
- }
-
- void KilledUnit(Unit* /*victim*/)
- {
- if (Intro_Timer)
- return;
-
- Talk(YELL_KILL);
- }
-
- void JustDied(Unit* /*killer*/)
- {
- if (instance)
- instance->SetData(DATA_ZULJINEVENT, DONE);
-
- Talk(YELL_DEATH);
- Summons.DespawnEntry(CREATURE_COLUMN_OF_FIRE);
-
- if (Unit* Temp = Unit::GetUnit(*me, SpiritGUID[3]))
- Temp->SetUInt32Value(UNIT_FIELD_BYTES_1, UNIT_STAND_STATE_DEAD);
- }
-
- void AttackStart(Unit* who)
- {
- if (Phase == 2)
- AttackStartNoMove(who);
- else
- ScriptedAI::AttackStart(who);
- }
-
- void DoMeleeAttackIfReady()
- {
- if (!me->IsNonMeleeSpellCasted(false))
- {
- if (me->isAttackReady() && me->IsWithinMeleeRange(me->GetVictim()))
- {
- if (Phase == 1 && !Overpower_Timer)
- {
- uint32 health = me->GetVictim()->GetHealth();
- me->AttackerStateUpdate(me->GetVictim());
- if (me->GetVictim() && health == me->GetVictim()->GetHealth())
- {
- DoCastVictim(SPELL_OVERPOWER, false);
- Overpower_Timer = 5000;
- }
- } else me->AttackerStateUpdate(me->GetVictim());
- me->resetAttackTimer();
- }
- }
- }
-
- void SpawnAdds()
- {
- Creature* creature = NULL;
- for (uint8 i = 0; i < 4; ++i)
- {
- creature = me->SummonCreature(SpiritInfo[i].entry, SpiritInfo[i].x, SpiritInfo[i].y, SpiritInfo[i].z, SpiritInfo[i].orient, TEMPSUMMON_DEAD_DESPAWN, 0);
- if (creature)
- {
- creature->CastSpell(creature, SPELL_SPIRIT_AURA, true);
- creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
- creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- SpiritGUID[i] = creature->GetGUID();
- }
- }
- }
-
- void DespawnAdds()
- {
- for (uint8 i = 0; i < 4; ++i)
- {
- if (SpiritGUID[i])
- {
- if (Unit* temp = Unit::GetUnit(*me, SpiritGUID[i]))
- {
- temp->SetVisible(false);
- temp->setDeathState(DEAD);
- }
- }
- SpiritGUID[i] = 0;
- }
- }
-
- void JustSummoned(Creature* summon)
- {
- Summons.Summon(summon);
- }
-
- void SummonedCreatureDespawn(Creature* summon)
- {
- Summons.Despawn(summon);
- }
-
- void EnterPhase(uint32 NextPhase)
- {
- switch (NextPhase)
- {
- case 0:
- break;
- case 1:
- case 2:
- case 3:
- case 4:
- DoTeleportTo(CENTER_X, CENTER_Y, CENTER_Z, 100);
- DoResetThreat();
- me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, 0);
- me->RemoveAurasDueToSpell(Transform[Phase].unaura);
- DoCast(me, Transform[Phase].spell);
- Talk(Transform[Phase].text);
- if (Phase > 0)
- {
- if (Unit* Temp = Unit::GetUnit(*me, SpiritGUID[Phase - 1]))
- Temp->SetUInt32Value(UNIT_FIELD_BYTES_1, UNIT_STAND_STATE_DEAD);
- }
- if (Unit* Temp = Unit::GetUnit(*me, SpiritGUID[NextPhase - 1]))
- Temp->CastSpell(me, SPELL_SIPHON_SOUL, false); // should m cast on temp
- if (NextPhase == 2)
- {
- me->GetMotionMaster()->Clear();
- DoCast(me, SPELL_ENERGY_STORM, true); // enemy aura
- for (uint8 i = 0; i < 4; ++i)
- {
- Creature* Vortex = DoSpawnCreature(CREATURE_FEATHER_VORTEX, 0, 0, 0, 0, TEMPSUMMON_CORPSE_DESPAWN, 0);
- if (Vortex)
- {
- Vortex->CastSpell(Vortex, SPELL_CYCLONE_PASSIVE, true);
- Vortex->CastSpell(Vortex, SPELL_CYCLONE_VISUAL, true);
- Vortex->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- Vortex->SetSpeed(MOVE_RUN, 1.0f);
- Vortex->AI()->AttackStart(SelectTarget(SELECT_TARGET_RANDOM, 0));
- DoZoneInCombat(Vortex);
- }
- }
- }
- else
- me->AI()->AttackStart(me->GetVictim());
- if (NextPhase == 3)
- {
- me->RemoveAurasDueToSpell(SPELL_ENERGY_STORM);
- Summons.DespawnEntry(CREATURE_FEATHER_VORTEX);
- me->GetMotionMaster()->MoveChase(me->GetVictim());
- }
- break;
- default:
- break;
- }
- Phase = NextPhase;
- }
-
- void UpdateAI(uint32 diff)
- {
- if (!TankGUID)
- {
- if (!UpdateVictim())
- return;
-
- if (me->GetHealth() < health_20 * (4 - Phase))
- EnterPhase(Phase + 1);
- }
-
- if (Berserk_Timer <= diff)
- {
- DoCast(me, SPELL_BERSERK, true);
- Talk(YELL_BERSERK);
- Berserk_Timer = 60000;
- } else Berserk_Timer -= diff;
-
- switch (Phase)
- {
- case 0:
- if (Intro_Timer)
- {
- if (Intro_Timer <= diff)
- {
- Talk(YELL_AGGRO);
- Intro_Timer = 0;
- } else Intro_Timer -= diff;
- }
-
- if (Whirlwind_Timer <= diff)
- {
- DoCast(me, SPELL_WHIRLWIND);
- Whirlwind_Timer = urand(15000, 20000);
- } else Whirlwind_Timer -= diff;
-
- if (Grievous_Throw_Timer <= diff)
- {
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
- DoCast(target, SPELL_GRIEVOUS_THROW, false);
- Grievous_Throw_Timer = 10000;
- } else Grievous_Throw_Timer -= diff;
- break;
-
- case 1:
- if (Creeping_Paralysis_Timer <= diff)
- {
- DoCast(me, SPELL_CREEPING_PARALYSIS);
- Creeping_Paralysis_Timer = 20000;
- } else Creeping_Paralysis_Timer -= diff;
-
- if (Overpower_Timer <= diff)
- {
- // implemented in DoMeleeAttackIfReady()
- Overpower_Timer = 0;
- } else Overpower_Timer -= diff;
- break;
-
- case 2:
- return;
-
- case 3:
- if (Claw_Rage_Timer <= diff)
- {
- if (!TankGUID)
- {
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
- {
- TankGUID = me->GetVictim()->GetGUID();
- me->SetSpeed(MOVE_RUN, 5.0f);
- AttackStart(target); // change victim
- Claw_Rage_Timer = 0;
- Claw_Loop_Timer = 500;
- Claw_Counter = 0;
- }
- }
- else if (!Claw_Rage_Timer) // do not do this when Lynx_Rush
- {
- if (Claw_Loop_Timer <= diff)
- {
- Unit* target = me->GetVictim();
- if (!target || !target->isTargetableForAttack()) target = Unit::GetUnit(*me, TankGUID);
- if (!target || !target->isTargetableForAttack()) target = SelectTarget(SELECT_TARGET_RANDOM, 0);
- if (target)
- {
- AttackStart(target);
- if (me->IsWithinMeleeRange(target))
- {
- DoCast(target, SPELL_CLAW_RAGE_DAMAGE, true);
- ++Claw_Counter;
- if (Claw_Counter == 12)
- {
- Claw_Rage_Timer = urand(15000, 20000);
- me->SetSpeed(MOVE_RUN, 1.2f);
- AttackStart(Unit::GetUnit(*me, TankGUID));
- TankGUID = 0;
- return;
- }
- else
- Claw_Loop_Timer = 500;
- }
- }
- else
- {
- EnterEvadeMode(); // if (target)
- return;
- }
- } else Claw_Loop_Timer -= diff;
- } //if (TankGUID)
- } else Claw_Rage_Timer -= diff;
-
- if (Lynx_Rush_Timer <= diff)
- {
- if (!TankGUID)
- {
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
- {
- TankGUID = me->GetVictim()->GetGUID();
- me->SetSpeed(MOVE_RUN, 5.0f);
- AttackStart(target); // change victim
- Lynx_Rush_Timer = 0;
- Claw_Counter = 0;
- }
- }
- else if (!Lynx_Rush_Timer)
- {
- Unit* target = me->GetVictim();
- if (!target || !target->isTargetableForAttack())
- {
- target = SelectTarget(SELECT_TARGET_RANDOM, 0);
- AttackStart(target);
- }
- if (target)
- {
- if (me->IsWithinMeleeRange(target))
- {
- DoCast(target, SPELL_LYNX_RUSH_DAMAGE, true);
- ++Claw_Counter;
- if (Claw_Counter == 9)
- {
- Lynx_Rush_Timer = urand(15000, 20000);
- me->SetSpeed(MOVE_RUN, 1.2f);
- AttackStart(Unit::GetUnit(*me, TankGUID));
- TankGUID = 0;
- }
- else
- AttackStart(SelectTarget(SELECT_TARGET_RANDOM, 0));
- }
- }
- else
- {
- EnterEvadeMode(); // if (target)
- return;
- }
- } //if (TankGUID)
- } else Lynx_Rush_Timer -= diff;
-
- break;
- case 4:
- if (Flame_Whirl_Timer <= diff)
- {
- DoCast(me, SPELL_FLAME_WHIRL);
- Flame_Whirl_Timer = 12000;
- }Flame_Whirl_Timer -= diff;
-
- if (Pillar_Of_Fire_Timer <= diff)
- {
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
- DoCast(target, SPELL_SUMMON_PILLAR);
- Pillar_Of_Fire_Timer = 10000;
- } else Pillar_Of_Fire_Timer -= diff;
-
- if (Flame_Breath_Timer <= diff)
- {
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
- me->SetInFront(target);
- DoCast(me, SPELL_FLAME_BREATH);
- Flame_Breath_Timer = 10000;
- } else Flame_Breath_Timer -= diff;
- break;
-
- default:
- break;
- }
-
- if (!TankGUID)
- DoMeleeAttackIfReady();
- }
- };
-
- CreatureAI* GetAI(Creature* creature) const
- {
- return new boss_zuljinAI(creature);
- }
-};
-
-class npc_zuljin_vortex : public CreatureScript
-{
- public:
-
- npc_zuljin_vortex()
- : CreatureScript("npc_zuljin_vortex")
- {
- }
-
- struct npc_zuljin_vortexAI : public ScriptedAI
- {
- npc_zuljin_vortexAI(Creature* creature) : ScriptedAI(creature) {}
-
- void Reset() {}
-
- void EnterCombat(Unit* /*target*/) {}
-
- void SpellHit(Unit* caster, const SpellInfo* spell)
- {
- if (spell->Id == SPELL_ZAP_INFORM)
- DoCast(caster, SPELL_ZAP_DAMAGE, true);
- }
-
- void UpdateAI(uint32 /*diff*/)
- {
- //if the vortex reach the target, it change his target to another player
- if (me->IsWithinMeleeRange(me->GetVictim()))
- AttackStart(SelectTarget(SELECT_TARGET_RANDOM, 0));
- }
- };
-
- CreatureAI* GetAI(Creature* creature) const
- {
- return new npc_zuljin_vortexAI(creature);
- }
-};
-
-void AddSC_boss_zuljin()
-{
- new boss_zuljin();
- new npc_zuljin_vortex();
-}
-
diff --git a/src/server/scripts/EasternKingdoms/ZulAman/instance_zulaman.cpp b/src/server/scripts/EasternKingdoms/ZulAman/instance_zulaman.cpp
index c8409805a36..cfbbc53805f 100644
--- a/src/server/scripts/EasternKingdoms/ZulAman/instance_zulaman.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulAman/instance_zulaman.cpp
@@ -1,6 +1,5 @@
- /*
+/*
* Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
- * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
*
* 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
@@ -16,136 +15,69 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/* ScriptData
-SDName: instance_zulaman
-SD%Complete: 80
-SDComment:
-SDCategory: Zul'Aman
-EndScriptData */
-
#include "ScriptMgr.h"
#include "InstanceScript.h"
+#include "ScriptedCreature.h"
#include "zulaman.h"
-#include "Player.h"
-#include "TemporarySummon.h"
-
-enum Misc
-{
- MAX_ENCOUNTER = 7,
- RAND_VENDOR = 2,
- WORLDSTATE_SHOW_TIMER = 3104,
- WORLDSTATE_TIME_TO_SACRIFICE = 3106
-};
-
-// Chests spawn at bear/eagle/dragonhawk/lynx bosses
-// The loots depend on how many bosses have been killed, but not the entries of the chests
-// But we cannot add loots to gameobject, so we have to use the fixed loot_template
-struct SHostageInfo
-{
- uint32 npc, go; // FIXME go Not used
- float x, y, z, o;
-};
-
-static SHostageInfo HostageInfo[] =
-{
- {23790, 186648, -57, 1343, 40.77f, 3.2f}, // bear
- {23999, 187021, 400, 1414, 74.36f, 3.3f}, // eagle
- {24001, 186672, -35, 1134, 18.71f, 1.9f}, // dragonhawk
- {24024, 186667, 413, 1117, 6.32f, 3.1f} // lynx
-};
-
-Position const HarrisonJonesLoc = {120.687f, 1674.0f, 42.0217f, 1.59044f};
class instance_zulaman : public InstanceMapScript
{
public:
- instance_zulaman()
- : InstanceMapScript("instance_zulaman", 568)
- {
- }
+ instance_zulaman() : InstanceMapScript(ZulAmanScriptName, 568) { }
- struct instance_zulaman_InstanceMapScript : public InstanceScript
+ struct instance_zulaman_InstanceScript : public InstanceScript
{
- instance_zulaman_InstanceMapScript(Map* map) : InstanceScript(map) {}
-
- uint64 HarkorsSatchelGUID;
- uint64 TanzarsTrunkGUID;
- uint64 AshlisBagGUID;
- uint64 KrazsPackageGUID;
- uint64 StrangeGongGUID;
- uint64 HarrisonJonesGUID;
-
- uint64 HexLordGateGUID;
- uint64 ZulJinGateGUID;
- uint64 MassiveGateGUID;
- uint64 AkilzonDoorGUID;
- uint64 ZulJinDoorGUID;
- uint64 HalazziDoorGUID;
-
- uint32 QuestTimer;
- uint16 BossKilled;
- uint16 QuestMinute;
- uint16 ChestLooted;
-
- uint32 m_auiEncounter[MAX_ENCOUNTER];
- uint32 RandVendor[RAND_VENDOR];
-
- void Initialize()
+ instance_zulaman_InstanceScript(InstanceMap* map) : InstanceScript(map)
{
- memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
-
- HarkorsSatchelGUID = 0;
- TanzarsTrunkGUID = 0;
- AshlisBagGUID = 0;
- KrazsPackageGUID = 0;
- StrangeGongGUID = 0;
- HexLordGateGUID = 0;
- ZulJinGateGUID = 0;
- MassiveGateGUID = 0;
- AkilzonDoorGUID = 0;
- HalazziDoorGUID = 0;
- ZulJinDoorGUID = 0;
-
- HarrisonJonesGUID = 0;
-
- QuestTimer = 0;
- QuestMinute = 0;
- BossKilled = 0;
- ChestLooted = 0;
-
- for (uint8 i = 0; i < RAND_VENDOR; ++i)
- RandVendor[i] = NOT_STARTED;
-
- m_auiEncounter[DATA_GONGEVENT] = NOT_STARTED;
- }
-
- bool IsEncounterInProgress() const
- {
- for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
- if (m_auiEncounter[i] == IN_PROGRESS)
- return true;
-
- return false;
+ SetBossNumber(EncounterCount);
+
+ AkilzonGUID = 0;
+ NalorakkGUID = 0;
+ JanalaiGUID = 0;
+ HalazziGUID = 0;
+ HexLordMalacrassGUID = 0;
+ DaakaraGUID = 0;
+ VoljinGUID = 0;
+ HexLordTriggerGUID = 0;
+ SpeedRunTimer = 16;
+ ZulAmanState = NOT_STARTED;
+ ZulAmanBossCount = 0;
}
- void OnPlayerEnter(Player* /*player*/)
+ void FillInitialWorldStates(WorldPacket& packet)
{
- if (!HarrisonJonesGUID)
- instance->SummonCreature(NPC_HARRISON_JONES, HarrisonJonesLoc);
+ packet << uint32(WORLD_STATE_ZULAMAN_TIMER_ENABLED) << uint32(ZulAmanState ? 1 : 0);
+ packet << uint32(WORLD_STATE_ZULAMAN_TIMER) << uint32(SpeedRunTimer);
}
void OnCreatureCreate(Creature* creature)
{
switch (creature->GetEntry())
{
- case NPC_HARRISON_JONES:
- HarrisonJonesGUID = creature->GetGUID();
+ case NPC_AKILZON:
+ AkilzonGUID = creature->GetGUID();
+ break;
+ case NPC_NALORAKK:
+ NalorakkGUID = creature->GetGUID();
break;
case NPC_JANALAI:
- case NPC_ZULJIN:
- case NPC_HEXLORD:
+ JanalaiGUID = creature->GetGUID();
+ break;
case NPC_HALAZZI:
- case NPC_NALORAKK:
+ HalazziGUID = creature->GetGUID();
+ break;
+ case NPC_HEXLORD:
+ HexLordMalacrassGUID = creature->GetGUID();
+ break;
+ case NPC_DAAKARA:
+ DaakaraGUID = creature->GetGUID();
+ break;
+ case NPC_VOLJIN:
+ VoljinGUID = creature->GetGUID();
+ break;
+ case NPC_HEXLORD_TRIGGER:
+ HexLordTriggerGUID = creature->GetGUID();
+ break;
default:
break;
}
@@ -155,219 +87,261 @@ class instance_zulaman : public InstanceMapScript
{
switch (go->GetEntry())
{
- case GO_DOOR_HALAZZI: HalazziDoorGUID = go->GetGUID(); break;
- case GO_GATE_ZULJIN: ZulJinGateGUID = go->GetGUID(); break;
- case GO_GATE_HEXLORD: HexLordGateGUID = go->GetGUID(); break;
- case GO_MASSIVE_GATE: MassiveGateGUID = go->GetGUID(); break;
- case GO_DOOR_AKILZON: AkilzonDoorGUID = go->GetGUID(); break;
- case GO_DOOR_ZULJIN: ZulJinDoorGUID = go->GetGUID(); break;
-
- case GO_HARKORS_SATCHEL: HarkorsSatchelGUID = go->GetGUID(); break;
- case GO_TANZARS_TRUNK: TanzarsTrunkGUID = go->GetGUID(); break;
- case GO_ASHLIS_BAG: AshlisBagGUID = go->GetGUID(); break;
- case GO_KRAZS_PACKAGE: KrazsPackageGUID = go->GetGUID(); break;
- case GO_STRANGE_GONG: StrangeGongGUID = go->GetGUID(); break;
- default: break;
+ case GO_STRANGE_GONG:
+ StrangeGongGUID = go->GetGUID();
+ break;
+ case GO_MASSIVE_GATE:
+ MasiveGateGUID = go->GetGUID();
+ AddDoor(go, true);
+ if (ZulAmanState != NOT_STARTED)
+ go->SetGoState(GO_STATE_ACTIVE);
+ break;
+ default:
+ break;
}
- CheckInstanceStatus();
}
- void SummonHostage(uint8 num)
+ void OnGameObjectRemove(GameObject* go)
{
- if (!QuestMinute)
- return;
-
- Map::PlayerList const &PlayerList = instance->GetPlayers();
- if (PlayerList.isEmpty())
- return;
-
- Map::PlayerList::const_iterator i = PlayerList.begin();
- if (Player* i_pl = i->GetSource())
+ switch (go->GetEntry())
{
- if (Unit* Hostage = i_pl->SummonCreature(HostageInfo[num].npc, HostageInfo[num].x, HostageInfo[num].y, HostageInfo[num].z, HostageInfo[num].o, TEMPSUMMON_DEAD_DESPAWN, 0))
- {
- Hostage->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
- Hostage->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
- }
+ case GO_MASSIVE_GATE:
+ AddDoor(go, false);
+ break;
+ default:
+ break;
}
}
- void CheckInstanceStatus()
+ uint64 GetData64(uint32 type) const
{
- if (BossKilled >= DATA_HALAZZIEVENT)
- HandleGameObject(HexLordGateGUID, true);
+ switch (type)
+ {
+ case DATA_AKILZON:
+ return AkilzonGUID;
+ case DATA_NALORAKK:
+ return NalorakkGUID;
+ case DATA_JANALAI:
+ return JanalaiGUID;
+ case DATA_HALAZZI:
+ return HalazziGUID;
+ case DATA_HEXLORD:
+ return HexLordMalacrassGUID;
+ case DATA_DAAKARA:
+ return DaakaraGUID;
+ case DATA_HEXLORD_TRIGGER:
+ return HexLordTriggerGUID;
+ case DATA_STRANGE_GONG:
+ return StrangeGongGUID;
+ case DATA_MASSIVE_GATE:
+ return MasiveGateGUID;
+ default:
+ break;
+ }
- if (BossKilled >= DATA_HEXLORDEVENT)
- HandleGameObject(ZulJinGateGUID, true);
+ return 0;
}
- std::string GetSaveData()
+ void SetData(uint32 type, uint32 data)
{
- OUT_SAVE_INST_DATA;
-
- std::ostringstream ss;
- ss << "S " << BossKilled << ' ' << ChestLooted << ' ' << QuestMinute;
-
- OUT_SAVE_INST_DATA_COMPLETE;
- return ss.str();
+ switch (type)
+ {
+ case DATA_ZULAMAN_STATE:
+ {
+ if (data == IN_PROGRESS)
+ {
+ DoUpdateWorldState(WORLD_STATE_ZULAMAN_TIMER_ENABLED, 1);
+ DoUpdateWorldState(WORLD_STATE_ZULAMAN_TIMER, 15);
+ events.ScheduleEvent(EVENT_UPDATE_ZULAMAN_TIMER, 60000);
+ SpeedRunTimer = 15;
+ ZulAmanState = data;
+ SaveToDB();
+ }
+ break;
+ }
+ default:
+ break;
+ }
}
- void Load(const char* load)
+ uint32 GetData(uint32 type) const
{
- if (!load)
- return;
-
- std::istringstream ss(load);
- //TC_LOG_ERROR(LOG_FILTER_TSCR, "Zul'aman loaded, %s.", ss.str().c_str());
- char dataHead; // S
- uint16 data1, data2, data3;
- ss >> dataHead >> data1 >> data2 >> data3;
- //TC_LOG_ERROR(LOG_FILTER_TSCR, "Zul'aman loaded, %d %d %d.", data1, data2, data3);
- if (dataHead == 'S')
+ switch (type)
{
- BossKilled = data1;
- ChestLooted = data2;
- QuestMinute = data3;
- } else TC_LOG_ERROR(LOG_FILTER_TSCR, "Zul'aman: corrupted save data.");
+ case DATA_ZULAMAN_STATE:
+ return ZulAmanState;
+ default:
+ break;
+ }
+
+ return 0;
}
- void SetData(uint32 type, uint32 data)
+ bool SetBossState(uint32 type, EncounterState state)
{
- switch (type)
+ if (!InstanceScript::SetBossState(type, state))
+ return false;
+
+ if (state == DONE)
{
- case DATA_GONGEVENT:
- m_auiEncounter[DATA_GONGEVENT] = data;
- if (data == IN_PROGRESS)
- SaveToDB();
- else if (data == DONE)
- QuestMinute = 21;
- break;
- case DATA_NALORAKKEVENT:
- m_auiEncounter[DATA_NALORAKKEVENT] = data;
- if (data == DONE)
+ if (ZulAmanState == IN_PROGRESS && SpeedRunTimer)
{
- if (QuestMinute)
+ ++ZulAmanBossCount;
+
+ if (ZulAmanBossCount < 2)
{
- QuestMinute += 15;
- DoUpdateWorldState(WORLDSTATE_TIME_TO_SACRIFICE, QuestMinute);
+ SpeedRunTimer = SpeedRunTimer + 5;
+ DoUpdateWorldState(WORLD_STATE_ZULAMAN_TIMER, SpeedRunTimer);
}
- SummonHostage(0);
- }
- break;
- case DATA_AKILZONEVENT:
- m_auiEncounter[DATA_AKILZONEVENT] = data;
- HandleGameObject(AkilzonDoorGUID, data != IN_PROGRESS);
- if (data == DONE)
- {
- if (QuestMinute)
+ else if (ZulAmanBossCount == 4)
{
- QuestMinute += 10;
- DoUpdateWorldState(WORLDSTATE_TIME_TO_SACRIFICE, QuestMinute);
+ DoUpdateWorldState(WORLD_STATE_ZULAMAN_TIMER_ENABLED, 0);
+ events.CancelEvent(EVENT_UPDATE_ZULAMAN_TIMER);
+ ZulAmanState = DONE;
}
- SummonHostage(1);
}
- break;
- case DATA_JANALAIEVENT:
- m_auiEncounter[DATA_JANALAIEVENT] = data;
- if (data == DONE)
- SummonHostage(2);
- break;
- case DATA_HALAZZIEVENT:
- m_auiEncounter[DATA_HALAZZIEVENT] = data;
- HandleGameObject(HalazziDoorGUID, data != IN_PROGRESS);
- if (data == DONE) SummonHostage(3);
- break;
- case DATA_HEXLORDEVENT:
- m_auiEncounter[DATA_HEXLORDEVENT] = data;
- if (data == IN_PROGRESS)
- HandleGameObject(HexLordGateGUID, false);
- else if (data == NOT_STARTED)
- CheckInstanceStatus();
- break;
- case DATA_ZULJINEVENT:
- m_auiEncounter[DATA_ZULJINEVENT] = data;
- HandleGameObject(ZulJinDoorGUID, data != IN_PROGRESS);
- break;
- case DATA_CHESTLOOTED:
- ++ChestLooted;
- SaveToDB();
- break;
- case TYPE_RAND_VENDOR_1:
- RandVendor[0] = data;
- break;
- case TYPE_RAND_VENDOR_2:
- RandVendor[1] = data;
- break;
}
- if (data == DONE)
+ switch (type)
{
- ++BossKilled;
- if (QuestMinute && BossKilled >= DATA_HALAZZIEVENT)
- {
- QuestMinute = 0;
- DoUpdateWorldState(WORLDSTATE_SHOW_TIMER, 0);
- }
- CheckInstanceStatus();
- SaveToDB();
+ case DATA_AKILZON:
+ break;
+ case DATA_NALORAKK:
+ break;
+ case DATA_JANALAI:
+ break;
+ case DATA_HALAZZI:
+ case DATA_HEXLORD:
+ case DATA_DAAKARA:
+ break;
+ default:
+ break;
}
+
+ return true;
}
- uint32 GetData(uint32 type) const
+ void ProcessEvent(WorldObject* /*obj*/, uint32 eventId)
{
- switch (type)
+ switch (eventId)
{
- case DATA_GONGEVENT: return m_auiEncounter[DATA_GONGEVENT];
- case DATA_NALORAKKEVENT: return m_auiEncounter[DATA_NALORAKKEVENT];
- case DATA_AKILZONEVENT: return m_auiEncounter[DATA_AKILZONEVENT];
- case DATA_JANALAIEVENT: return m_auiEncounter[DATA_JANALAIEVENT];
- case DATA_HALAZZIEVENT: return m_auiEncounter[DATA_HALAZZIEVENT];
- case DATA_HEXLORDEVENT: return m_auiEncounter[DATA_HEXLORDEVENT];
- case DATA_ZULJINEVENT: return m_auiEncounter[DATA_ZULJINEVENT];
- case DATA_CHESTLOOTED: return ChestLooted;
- case TYPE_RAND_VENDOR_1: return RandVendor[0];
- case TYPE_RAND_VENDOR_2: return RandVendor[1];
- default: return 0;
+ case EVENT_START_ZULAMAN:
+ if (Creature* voljin = instance->GetCreature(VoljinGUID))
+ {
+ if (voljin->IsAIEnabled)
+ voljin->AI()->DoAction(ACTION_START_ZULAMAN);
+ }
+ break;
+ default:
+ break;
}
}
void Update(uint32 diff)
{
- if (QuestMinute)
+ if (events.Empty())
+ return;
+
+ events.Update(diff);
+
+ while (uint32 eventId = events.ExecuteEvent())
{
- if (QuestTimer <= diff)
+ switch (eventId)
{
- QuestMinute--;
- SaveToDB();
- QuestTimer += 60000;
- if (QuestMinute)
- {
- DoUpdateWorldState(WORLDSTATE_SHOW_TIMER, 1);
- DoUpdateWorldState(WORLDSTATE_TIME_TO_SACRIFICE, QuestMinute);
- } else DoUpdateWorldState(WORLDSTATE_SHOW_TIMER, 0);
+ case EVENT_UPDATE_ZULAMAN_TIMER:
+ SaveToDB();
+ DoUpdateWorldState(WORLD_STATE_ZULAMAN_TIMER, --SpeedRunTimer);
+ if (SpeedRunTimer)
+ events.ScheduleEvent(EVENT_UPDATE_ZULAMAN_TIMER, 60000);
+ else
+ {
+ DoUpdateWorldState(WORLD_STATE_ZULAMAN_TIMER_ENABLED, 0);
+ events.CancelEvent(EVENT_UPDATE_ZULAMAN_TIMER);
+ ZulAmanState = FAIL;
+ }
+ break;
+ default:
+ break;
}
- QuestTimer -= diff;
}
}
- uint64 GetData64(uint32 type) const
+ std::string GetSaveData()
{
- switch (type)
+ OUT_SAVE_INST_DATA;
+
+ std::ostringstream saveStream;
+ saveStream << "Z A " << GetBossSaveData() << ZulAmanState
+ << ' ' << SpeedRunTimer << ' ' << ZulAmanBossCount;
+
+ OUT_SAVE_INST_DATA_COMPLETE;
+ return saveStream.str();
+ }
+
+ void Load(char const* str)
+ {
+ if (!str)
{
- case GO_STRANGE_GONG:
- return StrangeGongGUID;
- case GO_MASSIVE_GATE:
- return MassiveGateGUID;
+ OUT_LOAD_INST_DATA_FAIL;
+ return;
}
- return 0;
+ OUT_LOAD_INST_DATA(str);
+
+ char dataHead1, dataHead2;
+
+ std::istringstream loadStream(str);
+ loadStream >> dataHead1 >> dataHead2;
+
+ if (dataHead1 == 'Z' && dataHead2 == 'A')
+ {
+ for (uint8 i = 0; i < EncounterCount; ++i)
+ {
+ uint32 tmpState;
+ loadStream >> tmpState;
+ if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
+ tmpState = NOT_STARTED;
+
+ SetBossState(i, EncounterState(tmpState));
+ }
+
+ loadStream >> ZulAmanState;
+ loadStream >> SpeedRunTimer;
+ loadStream >> ZulAmanBossCount;
+
+ if (ZulAmanState == IN_PROGRESS && SpeedRunTimer && SpeedRunTimer <= 15)
+ {
+ events.ScheduleEvent(EVENT_UPDATE_ZULAMAN_TIMER, 60000);
+ DoUpdateWorldState(WORLD_STATE_ZULAMAN_TIMER_ENABLED, 1);
+ DoUpdateWorldState(WORLD_STATE_ZULAMAN_TIMER, SpeedRunTimer);
+ }
+ }
+ else
+ OUT_LOAD_INST_DATA_FAIL;
+
+ OUT_LOAD_INST_DATA_COMPLETE;
}
+ protected:
+ EventMap events;
+ uint64 AkilzonGUID;
+ uint64 NalorakkGUID;
+ uint64 JanalaiGUID;
+ uint64 HalazziGUID;
+ uint64 HexLordMalacrassGUID;
+ uint64 DaakaraGUID;
+ uint64 VoljinGUID;
+ uint64 HexLordTriggerGUID;
+ uint64 StrangeGongGUID;
+ uint64 MasiveGateGUID;
+ uint32 SpeedRunTimer;
+ uint32 ZulAmanState;
+ uint32 ZulAmanBossCount;
};
InstanceScript* GetInstanceScript(InstanceMap* map) const
{
- return new instance_zulaman_InstanceMapScript(map);
+ return new instance_zulaman_InstanceScript(map);
}
};
@@ -375,4 +349,3 @@ void AddSC_instance_zulaman()
{
new instance_zulaman();
}
-
diff --git a/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp b/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp
index 0c2c9597cfe..8e424ef3ac4 100644
--- a/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp
@@ -1,6 +1,5 @@
/*
* Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
- * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
*
* 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
@@ -16,445 +15,210 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/* ScriptData
-SDName: Zulaman
-SD%Complete: 90
-SDComment: Forest Frog will turn into different NPC's. Workaround to prevent new entry from running this script
-SDCategory: Zul'Aman
-EndScriptData */
-
-/* ContentData
-npc_forest_frog
-EndContentData */
-
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "ScriptedGossip.h"
-#include "zulaman.h"
#include "Player.h"
-#include "SpellInfo.h"
+#include "CreatureTextMgr.h"
#include "SpellScript.h"
-
-/*######
-## npc_forest_frog
-######*/
-
-#define SPELL_REMOVE_AMANI_CURSE 43732
-#define SPELL_PUSH_MOJO 43923
-#define ENTRY_FOREST_FROG 24396
-
-class npc_forest_frog : public CreatureScript
-{
- public:
-
- npc_forest_frog()
- : CreatureScript("npc_forest_frog")
- {
- }
-
- struct npc_forest_frogAI : public ScriptedAI
- {
- npc_forest_frogAI(Creature* creature) : ScriptedAI(creature)
- {
- instance = creature->GetInstanceScript();
- }
-
- InstanceScript* instance;
-
- void Reset() {}
-
- void EnterCombat(Unit* /*who*/) {}
-
- void DoSpawnRandom()
- {
- if (instance)
- {
- uint32 cEntry = 0;
- switch (rand()%10)
- {
- case 0: cEntry = 24397; break; //Mannuth
- case 1: cEntry = 24403; break; //Deez
- case 2: cEntry = 24404; break; //Galathryn
- case 3: cEntry = 24405; break; //Adarrah
- case 4: cEntry = 24406; break; //Fudgerick
- case 5: cEntry = 24407; break; //Darwen
- case 6: cEntry = 24445; break; //Mitzi
- case 7: cEntry = 24448; break; //Christian
- case 8: cEntry = 24453; break; //Brennan
- case 9: cEntry = 24455; break; //Hollee
- }
-
- if (!instance->GetData(TYPE_RAND_VENDOR_1))
- if (rand()%10 == 1) cEntry = 24408; //Gunter
- if (!instance->GetData(TYPE_RAND_VENDOR_2))
- if (rand()%10 == 1) cEntry = 24409; //Kyren
-
- if (cEntry) me->UpdateEntry(cEntry);
-
- if (cEntry == 24408) instance->SetData(TYPE_RAND_VENDOR_1, DONE);
- if (cEntry == 24409) instance->SetData(TYPE_RAND_VENDOR_2, DONE);
- }
- }
-
- void SpellHit(Unit* caster, const SpellInfo* spell)
- {
- if (spell->Id == SPELL_REMOVE_AMANI_CURSE && caster->GetTypeId() == TYPEID_PLAYER && me->GetEntry() == ENTRY_FOREST_FROG)
- {
- //increase or decrease chance of mojo?
- if (rand()%99 == 50) DoCast(caster, SPELL_PUSH_MOJO, true);
- else DoSpawnRandom();
- }
- }
- };
-
- CreatureAI* GetAI(Creature* creature) const
- {
- return new npc_forest_frogAI(creature);
- }
-};
-
-/*######
-## npc_zulaman_hostage
-######*/
-
-#define GOSSIP_HOSTAGE1 "I am glad to help you."
-
-static uint32 HostageEntry[] = {23790, 23999, 24024, 24001};
-static uint32 ChestEntry[] = {186648, 187021, 186672, 186667};
-
-class npc_zulaman_hostage : public CreatureScript
-{
- public:
- npc_zulaman_hostage() : CreatureScript("npc_zulaman_hostage") { }
-
- struct npc_zulaman_hostageAI : public ScriptedAI
- {
- npc_zulaman_hostageAI(Creature* creature) : ScriptedAI(creature)
- {
- IsLoot = false;
- }
-
- bool IsLoot;
- uint64 PlayerGUID;
-
- void Reset() {}
-
- void EnterCombat(Unit* /*who*/) {}
-
- void JustDied(Unit* /*killer*/)
- {
- Player* player = Unit::GetPlayer(*me, PlayerGUID);
- if (player)
- player->SendLoot(me->GetGUID(), LOOT_CORPSE);
- }
-
- void UpdateAI(uint32 /*diff*/)
- {
- if (IsLoot)
- DoCast(me, 7, false);
- }
- };
-
- CreatureAI* GetAI(Creature* creature) const
- {
- return new npc_zulaman_hostageAI(creature);
- }
-
- bool OnGossipHello(Player* player, Creature* creature)
- {
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_HOSTAGE1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
- player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID());
- return true;
- }
-
- bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action)
- {
- player->PlayerTalkClass->ClearMenus();
-
- if (action == GOSSIP_ACTION_INFO_DEF + 1)
- player->CLOSE_GOSSIP_MENU();
-
- if (!creature->HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP))
- return true;
-
- creature->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
-
- InstanceScript* instance = creature->GetInstanceScript();
- if (instance)
- {
- //uint8 progress = instance->GetData(DATA_CHESTLOOTED);
- instance->SetData(DATA_CHESTLOOTED, 0);
- float x, y, z;
- creature->GetPosition(x, y, z);
- uint32 entry = creature->GetEntry();
- for (uint8 i = 0; i < 4; ++i)
- {
- if (HostageEntry[i] == entry)
- {
- creature->SummonGameObject(ChestEntry[i], x-2, y, z, 0, 0, 0, 0, 0, 0);
- break;
- }
- }
- }
- return true;
- }
-};
-
-/*######
-## npc_harrison_jones
-######*/
+#include "zulaman.h"
enum Says
{
- SAY_HARRISON_0 = 0,
- SAY_HARRISON_1 = 1,
- SAY_HARRISON_2 = 0,
- SAY_HARRISON_3 = 1
+ // Vol'jin
+ SAY_INTRO_1 = 0,
+ SAY_INTRO_2 = 1,
+ SAY_INTRO_3 = 2,
+ SAY_INTRO_4 = 3,
+ SAY_INTRO_FAIL = 4,
+
+ // Hex Lord Malacrass
+ SAY_HEXLOR_INTRO = 0
};
enum Spells
{
- SPELL_BANGING_THE_GONG = 45225,
- SPELL_STEALTH = 34189,
- SPELL_COSMETIC_SPEAR_THROW = 43647
+ // Vol'jin
+ SPELL_BANGING_THE_GONG = 45225
};
enum Events
{
- GONG_EVENT_1 = 1,
- GONG_EVENT_2 = 2,
- GONG_EVENT_3 = 3,
- GONG_EVENT_4 = 4,
- GONG_EVENT_5 = 5,
- GONG_EVENT_6 = 6,
- GONG_EVENT_7 = 7,
- GONG_EVENT_8 = 8,
- GONG_EVENT_9 = 9,
- GONG_EVENT_10 = 10,
- GONG_EVENT_11 = 11
+ EVENT_INTRO_MOVEPOINT_1 = 1,
+ EVENT_INTRO_MOVEPOINT_2 = 2,
+ EVENT_INTRO_MOVEPOINT_3 = 3,
+ EVENT_BANGING_THE_GONG = 4,
+ EVENT_START_DOOR_OPENING_1 = 5,
+ EVENT_START_DOOR_OPENING_2 = 6,
+ EVENT_START_DOOR_OPENING_3 = 7,
+ EVENT_START_DOOR_OPENING_4 = 8,
+ EVENT_START_DOOR_OPENING_5 = 9,
+ EVENT_START_DOOR_OPENING_6 = 10,
+ EVENT_START_DOOR_OPENING_7 = 11
};
-enum Waypoints
+enum Points
{
- HARRISON_MOVE_1 = 860440,
- HARRISON_MOVE_2 = 860441,
- HARRISON_MOVE_3 = 860442
+ POINT_INTRO = 1,
+ POINT_STRANGE_GONG = 2,
+ POINT_START_DOOR_OPENING_1 = 3,
+ POINT_START_DOOR_OPENING_2 = 4
};
-enum DisplayIds
+enum Misc
{
- MODEL_HARRISON_JONES_0 = 22340,
- MODEL_HARRISON_JONES_1 = 22354,
- MODEL_HARRISON_JONES_2 = 22347
+ ITEM_VIRTUAL_ITEM = 5301
};
-enum EntryIds
+Position const VoljinIntroWaypoint[4] =
{
- NPC_HARRISON_JONES_1 = 24375,
- NPC_HARRISON_JONES_2 = 24365,
- NPC_AMANISHI_GUARDIAN = 23597,
+ { 117.7349f, 1662.77f, 42.02156f, 0.0f },
+ { 132.14f, 1645.143f, 42.02158f, 0.0f },
+ { 121.8901f, 1639.118f, 42.23253f, 0.0f },
+ { 122.618f, 1639.546f, 42.11659f, 0.0f },
};
-enum Weapons
-{
- WEAPON_MACE = 5301,
- WEAPON_SPEAR = 13631
-};
-
-class npc_harrison_jones : public CreatureScript
+class npc_voljin_zulaman : public CreatureScript
{
public:
+ npc_voljin_zulaman() : CreatureScript("npc_voljin_zulaman") { }
- npc_harrison_jones()
- : CreatureScript("npc_harrison_jones")
- {
- }
-
- struct npc_harrison_jonesAI : public ScriptedAI
+ struct npc_voljin_zulamanAI : public ScriptedAI
{
- npc_harrison_jonesAI(Creature* creature) : ScriptedAI(creature)
+ npc_voljin_zulamanAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript())
{
- instance = creature->GetInstanceScript();
+ me->SetDisplayId(me->GetCreatureTemplate()->Modelid1);
+ if (_instance->GetData(DATA_ZULAMAN_STATE) == NOT_STARTED)
+ me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
}
- InstanceScript* instance;
-
- uint8 _gongEvent;
- uint32 _gongTimer;
- uint64 uiTargetGUID;
-
void Reset()
{
- _gongEvent = 0;
- _gongTimer = 0;
- uiTargetGUID = 0;
+ _gongCount = 0;
}
- void EnterCombat(Unit* /*who*/) {}
-
void sGossipSelect(Player* player, uint32 sender, uint32 action)
{
- if (me->GetCreatureTemplate()->GossipMenuId == sender && !action)
- {
- player->CLOSE_GOSSIP_MENU();
- me->SetFacingToObject(player);
+ if (_instance->GetData(DATA_ZULAMAN_STATE) != NOT_STARTED)
+ return;
+
+ if (me->GetCreatureTemplate()->GossipMenuId == sender && !action)
+ {
+ _events.Reset();
+ me->SetUInt32Value(UNIT_FIELD_MOUNTDISPLAYID, 0);
me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
- Talk(SAY_HARRISON_0);
- _gongEvent = GONG_EVENT_1;
- _gongTimer = 4000;
- }
+ me->SetUInt32Value(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_NONE);
+ _events.ScheduleEvent(EVENT_INTRO_MOVEPOINT_1, 1000);
+ Talk(SAY_INTRO_1, player->GetGUID());
+ me->SetWalk(true);
+ }
}
- void SpellHit(Unit*, const SpellInfo* spell)
+ void DoAction(int32 action)
{
- if (spell->Id == SPELL_COSMETIC_SPEAR_THROW)
+ if (action == ACTION_START_ZULAMAN)
{
- me->RemoveAllAuras();
- me->SetEntry(NPC_HARRISON_JONES_2);
- me->SetDisplayId(MODEL_HARRISON_JONES_2);
- me->SetTarget(0);
- me->SetByteValue(UNIT_FIELD_BYTES_1, 0, UNIT_STAND_STATE_DEAD);
- me->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD);
- if (instance)
- instance->SetData(DATA_GONGEVENT, DONE);
+ if (++_gongCount == 10)
+ _events.ScheduleEvent(EVENT_START_DOOR_OPENING_1, 500);
}
}
void UpdateAI(uint32 diff)
{
- if (_gongEvent)
+ _events.Update(diff);
+
+ while (uint32 eventId = _events.ExecuteEvent())
{
- if (_gongTimer <= diff)
+ switch (eventId)
{
- switch (_gongEvent)
- {
- case GONG_EVENT_1:
- me->GetMotionMaster()->MovePath(HARRISON_MOVE_1, false);
- _gongEvent = GONG_EVENT_2;
- _gongTimer = 12000;
- break;
- case GONG_EVENT_2:
- me->SetFacingTo(6.235659f);
- Talk(SAY_HARRISON_1);
- DoCast(me, SPELL_BANGING_THE_GONG);
- me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(WEAPON_MACE));
- me->SetSheath(SHEATH_STATE_MELEE);
- _gongEvent = GONG_EVENT_3;
- _gongTimer = 4000;
- break;
- case GONG_EVENT_3:
- if (GameObject* gong = me->GetMap()->GetGameObject(instance->GetData64(GO_STRANGE_GONG)))
- gong->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
- _gongEvent = GONG_EVENT_4;
- _gongTimer = 105000;
- break;
- case GONG_EVENT_4:
- me->RemoveAura(SPELL_BANGING_THE_GONG);
- if (GameObject* gong = me->GetMap()->GetGameObject(instance->GetData64(GO_STRANGE_GONG)))
- gong->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
-
- // trigger or gong will need to be scripted to set IN_PROGRESS after enough hits.
- // This is temp workaround.
- if (instance)
- instance->SetData(DATA_GONGEVENT, IN_PROGRESS); // to be removed.
+ case EVENT_INTRO_MOVEPOINT_1:
+ me->GetMotionMaster()->MovePoint(POINT_INTRO, VoljinIntroWaypoint[0]);
+ _events.ScheduleEvent(EVENT_INTRO_MOVEPOINT_2, 1000);
+ break;
+ case EVENT_INTRO_MOVEPOINT_2:
+ me->GetMotionMaster()->MovePoint(POINT_STRANGE_GONG, VoljinIntroWaypoint[1]);
+ _events.ScheduleEvent(EVENT_INTRO_MOVEPOINT_3, 4000);
+ break;
+ case EVENT_INTRO_MOVEPOINT_3:
+ Talk(SAY_INTRO_2);
+ _events.ScheduleEvent(EVENT_BANGING_THE_GONG, 3000);
+ case EVENT_BANGING_THE_GONG:
+ DoCast(me, SPELL_BANGING_THE_GONG);
+ if (GameObject* strangeGong = ObjectAccessor::GetGameObject(*me, _instance->GetData64(DATA_STRANGE_GONG)))
+ strangeGong->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
+ me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, uint32(ITEM_VIRTUAL_ITEM));
+ break;
+ case EVENT_START_DOOR_OPENING_1:
+ me->RemoveAura(SPELL_BANGING_THE_GONG);
+ _events.ScheduleEvent(EVENT_START_DOOR_OPENING_2, 500);
+ break;
+ case EVENT_START_DOOR_OPENING_2:
+ me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, uint32(0));
+ if (GameObject* strangeGong = ObjectAccessor::GetGameObject(*me, _instance->GetData64(DATA_STRANGE_GONG)))
+ strangeGong->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
+ _events.ScheduleEvent(EVENT_START_DOOR_OPENING_3, 500);
+ break;
+ case EVENT_START_DOOR_OPENING_3:
+ me->GetMotionMaster()->MovePoint(POINT_START_DOOR_OPENING_1, VoljinIntroWaypoint[2]);
+ break;
+ case EVENT_START_DOOR_OPENING_4:
+ _instance->SetData(DATA_ZULAMAN_STATE, IN_PROGRESS);
+ if (GameObject* masiveGate = ObjectAccessor::GetGameObject(*me, _instance->GetData64(DATA_MASSIVE_GATE)))
+ masiveGate->SetGoState(GO_STATE_ACTIVE);
+ _events.ScheduleEvent(EVENT_START_DOOR_OPENING_5, 3000);
+ break;
+ case EVENT_START_DOOR_OPENING_5:
+ Talk(SAY_INTRO_4);
+ _events.ScheduleEvent(EVENT_START_DOOR_OPENING_6, 6000);
+ break;
+ case EVENT_START_DOOR_OPENING_6:
+ _events.ScheduleEvent(EVENT_START_DOOR_OPENING_7, 6000);
+ break;
+ case EVENT_START_DOOR_OPENING_7:
+ if (Creature* hexLordTrigger = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_HEXLORD_TRIGGER)))
+ sCreatureTextMgr->SendChat(hexLordTrigger, SAY_HEXLOR_INTRO, 0, CHAT_MSG_ADDON, LANG_ADDON, TEXT_RANGE_MAP);
+ break;
+ default:
+ break;
+ }
+ }
+ }
- if (instance->GetData(DATA_GONGEVENT) == IN_PROGRESS)
- {
- // Players are Now Saved to instance at SPECIAL (Player should be notified?)
- me->GetMotionMaster()->MovePath(HARRISON_MOVE_2, false);
- _gongEvent = GONG_EVENT_5;
- _gongTimer = 5000;
- }
- else
- {
- _gongTimer = 1000;
- _gongEvent = GONG_EVENT_9;
- }
- break;
- case GONG_EVENT_5:
- me->SetEntry(NPC_HARRISON_JONES_1);
- me->SetDisplayId(MODEL_HARRISON_JONES_1);
- Talk(SAY_HARRISON_2);
- _gongTimer = 12000;
- _gongEvent = GONG_EVENT_6;
- break;
- case GONG_EVENT_6:
- me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_USE_STANDING);
- Talk(SAY_HARRISON_3);
- _gongTimer = 7000;
- _gongEvent = GONG_EVENT_7;
- break;
- case GONG_EVENT_7:
- if (!uiTargetGUID)
- {
- std::list<Creature*> targetList;
- GetCreatureListWithEntryInGrid(targetList, me, NPC_AMANISHI_GUARDIAN, 26.0f);
- if (!targetList.empty())
- {
- for (std::list<Creature*>::const_iterator itr = targetList.begin(); itr != targetList.end(); ++itr)
- {
- if (Creature* ptarget = *itr)
- {
- if (ptarget->GetPositionX() > 120)
- {
- ptarget->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(WEAPON_SPEAR));
- ptarget->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
- ptarget->SetReactState(REACT_PASSIVE);
- ptarget->AI()->SetData(0, 1);
- }
- else
- ptarget->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
- ptarget->SetReactState(REACT_PASSIVE);
- ptarget->AI()->SetData(0, 2);
- }
- }
- }
- }
+ void MovementInform(uint32 movementType, uint32 pointId)
+ {
+ if (movementType != POINT_MOTION_TYPE)
+ return;
- if (GameObject* gate = me->GetMap()->GetGameObject(instance->GetData64(GO_MASSIVE_GATE)))
- gate->SetGoState(GO_STATE_ACTIVE);
- _gongTimer = 2000;
- _gongEvent = GONG_EVENT_8;
- break;
- case GONG_EVENT_8:
- DoCast(me, SPELL_STEALTH);
- me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(0));
- me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE);
- me->GetMotionMaster()->MovePath(HARRISON_MOVE_3, false);
- _gongTimer = 1000;
- _gongEvent = 0;
- break;
- case GONG_EVENT_9:
- me->GetMotionMaster()->MovePoint(0, 120.687f, 1674.0f, 42.0217f);
- _gongTimer = 12000;
- _gongEvent = GONG_EVENT_10;
- break;
- case GONG_EVENT_10:
- me->SetFacingTo(1.59044f);
- _gongEvent = 11;
- _gongTimer = 6000;
- break;
- case GONG_EVENT_11:
- me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
- if (instance)
- instance->SetData(DATA_GONGEVENT, NOT_STARTED);
- _gongEvent = 0;
- _gongTimer = 1000;
- break;
- }
- }
- else
- _gongTimer -= diff;
+ switch (pointId)
+ {
+ case POINT_STRANGE_GONG:
+ if (GameObject* strangeGong = ObjectAccessor::GetGameObject(*me, _instance->GetData64(DATA_STRANGE_GONG)))
+ me->SetFacingToObject(strangeGong); // setInFront
+ break;
+ case POINT_START_DOOR_OPENING_1:
+ me->SetFacingTo(4.747295f);
+ me->GetMotionMaster()->MovePoint(POINT_START_DOOR_OPENING_2, VoljinIntroWaypoint[3]);
+ Talk(SAY_INTRO_3);
+ _events.ScheduleEvent(EVENT_START_DOOR_OPENING_4, 4500);
+ break;
+ default:
+ break;
}
}
+
+ private:
+ InstanceScript* _instance;
+ EventMap _events;
+ uint8 _gongCount;
};
CreatureAI* GetAI(Creature* creature) const
{
- return new npc_harrison_jonesAI(creature);
+ return GetZulAmanAI<npc_voljin_zulamanAI>(creature);
}
};
+// 45226 - Banging the Gong
class spell_banging_the_gong : public SpellScriptLoader
{
public:
@@ -482,11 +246,8 @@ class spell_banging_the_gong : public SpellScriptLoader
}
};
-
void AddSC_zulaman()
{
- new npc_forest_frog();
- new npc_zulaman_hostage();
- new npc_harrison_jones();
+ new npc_voljin_zulaman();
new spell_banging_the_gong();
}
diff --git a/src/server/scripts/EasternKingdoms/ZulAman/zulaman.h b/src/server/scripts/EasternKingdoms/ZulAman/zulaman.h
index c3386f8c996..8f955876986 100644
--- a/src/server/scripts/EasternKingdoms/ZulAman/zulaman.h
+++ b/src/server/scripts/EasternKingdoms/ZulAman/zulaman.h
@@ -1,6 +1,5 @@
/*
* Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
- * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
*
* 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
@@ -19,43 +18,73 @@
#ifndef DEF_ZULAMAN_H
#define DEF_ZULAMAN_H
+uint32 const EncounterCount = 6;
+#define ZulAmanScriptName "instance_zulaman"
+
enum DataTypes
{
- DATA_GONGEVENT = 0,
- DATA_NALORAKKEVENT = 1,
- DATA_AKILZONEVENT = 2,
- DATA_JANALAIEVENT = 3,
- DATA_HALAZZIEVENT = 4,
- DATA_HEXLORDEVENT = 5,
- DATA_ZULJINEVENT = 6,
- DATA_CHESTLOOTED = 7,
- TYPE_RAND_VENDOR_1 = 8,
- TYPE_RAND_VENDOR_2 = 9
+ // BossState
+ DATA_AKILZON = 0,
+ DATA_NALORAKK = 1,
+ DATA_JANALAI = 2,
+ DATA_HALAZZI = 3,
+ DATA_HEXLORD = 4,
+ DATA_DAAKARA = 5,
+
+ // Data64
+ DATA_HEXLORD_TRIGGER,
+
+ DATA_STRANGE_GONG,
+ DATA_MASSIVE_GATE,
+
+ // SetData
+ DATA_ZULAMAN_STATE
};
enum CreatureIds
{
- NPC_HARRISON_JONES = 24358,
- NPC_JANALAI = 23578,
- NPC_ZULJIN = 23863,
- NPC_HEXLORD = 24239,
- NPC_HALAZZI = 23577,
- NPC_NALORAKK = 23576
+ NPC_AKILZON = 23574,
+ NPC_NALORAKK = 23576,
+ NPC_JANALAI = 23578,
+ NPC_HALAZZI = 23577,
+ NPC_HEXLORD = 24239,
+ NPC_DAAKARA = 23863,
+
+ NPC_VOLJIN = 52924,
+ NPC_HEXLORD_TRIGGER = 24363
+};
+
+enum GameObjectIds
+{
+ GO_STRANGE_GONG = 187359,
+ GO_MASSIVE_GATE = 186728,
};
-enum GameobjectIds
+enum ZulAmanEvents
{
- GO_DOOR_HALAZZI = 186303,
- GO_GATE_ZULJIN = 186304,
- GO_GATE_HEXLORD = 186305,
- GO_MASSIVE_GATE = 186728,
- GO_DOOR_AKILZON = 186858,
- GO_DOOR_ZULJIN = 186859,
- GO_HARKORS_SATCHEL = 187021,
- GO_TANZARS_TRUNK = 186648,
- GO_ASHLIS_BAG = 186672,
- GO_KRAZS_PACKAGE = 186667,
- GO_STRANGE_GONG = 187359
+ EVENT_START_ZULAMAN = 15897,
+ EVENT_UPDATE_ZULAMAN_TIMER = 1,
};
+enum ZulAmanAction
+{
+ ACTION_START_ZULAMAN = 1
+};
+
+enum ZulAmanWorldStates
+{
+ WORLD_STATE_ZULAMAN_TIMER_ENABLED = 3104,
+ WORLD_STATE_ZULAMAN_TIMER = 3106,
+};
+
+template<class AI>
+CreatureAI* GetZulAmanAI(Creature* creature)
+{
+ if (InstanceMap* instance = creature->GetMap()->ToInstanceMap())
+ if (instance->GetInstanceScript())
+ if (instance->GetScriptId() == sObjectMgr->GetScriptId(ZulAmanScriptName))
+ return new AI(creature);
+ return NULL;
+}
+
#endif
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp
deleted file mode 100644
index 7101ad4239f..00000000000
--- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp
+++ /dev/null
@@ -1,455 +0,0 @@
-/*
- * Copyright (C) 2008-2013 TrinityCore <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, see <http://www.gnu.org/licenses/>.
- */
-
-/* ScriptData
-TCName: Boss_Arlokk
-TC%Complete: 95
-TCComment: Wrong cleave and red aura is missing not yet added.
-TCComment: Prowlers moving through wall hopefully mmaps will fix.
-TCComment: Can't test LOS until mmaps.
-TCCategory: Zul'Gurub
-EndScriptData */
-
-#include "ScriptMgr.h"
-#include "ScriptedCreature.h"
-#include "SpellInfo.h"
-#include "zulgurub.h"
-
-enum Says
-{
- SAY_AGGRO = 0,
- SAY_FEAST_PROWLER = 1,
- SAY_DEATH = 2
-};
-
-enum Spells
-{
- SPELL_SHADOW_WORD_PAIN = 24212, // Corrected
- SPELL_GOUGE = 12540, // Corrected
- SPELL_MARK_OF_ARLOKK = 24210, // triggered spell 24211 Added to spell_dbc
- SPELL_RAVAGE = 24213, // Corrected
- SPELL_CLEAVE = 25174, // Searching for right spell
- SPELL_PANTHER_TRANSFORM = 24190, // Transform to panther now used
- SPELL_SUMMON_PROWLER = 24246, // Added to Spell_dbc
- SPELL_VANISH_VISUAL = 24222, // Added
- SPELL_VANISH = 24223, // Added
- SPELL_SUPER_INVIS = 24235 // Added to Spell_dbc
-};
-
-enum Events
-{
- EVENT_SHADOW_WORD_PAIN = 1,
- EVENT_GOUGE = 2,
- EVENT_MARK_OF_ARLOKK = 3,
- EVENT_RAVAGE = 4,
- EVENT_TRANSFORM = 5,
- EVENT_VANISH = 6,
- EVENT_VANISH_2 = 7,
- EVENT_TRANSFORM_BACK = 8,
- EVENT_VISIBLE = 9,
- EVENT_SUMMON_PROWLERS = 10
-};
-
-enum Phases
-{
- PHASE_ALL = 0,
- PHASE_ONE = 1,
- PHASE_TWO = 2
-};
-
-enum Weapon
-{
- WEAPON_DAGGER = 10616
-};
-
-enum Misc
-{
- MAX_PROWLERS_PER_SIDE = 15
-};
-
-Position const PosMoveOnSpawn[1] =
-{
- { -11561.9f, -1627.868f, 41.29941f, 0.0f }
-};
-
-class boss_arlokk : public CreatureScript
-{
- public: boss_arlokk() : CreatureScript("boss_arlokk") {}
-
- struct boss_arlokkAI : public BossAI
- {
- boss_arlokkAI(Creature* creature) : BossAI(creature, DATA_ARLOKK) { }
-
- void Reset()
- {
- _summonCountA = 0;
- _summonCountB = 0;
- me->RemoveAllAuras();
- me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(WEAPON_DAGGER));
- me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, uint32(WEAPON_DAGGER));
- if (instance)
- {
- if (GameObject* gate = me->GetMap()->GetGameObject(instance->GetData64(GO_FORCEFIELD)))
- gate->SetGoState(GO_STATE_READY);
- me->SetWalk(false);
- me->GetMotionMaster()->MovePoint(0, PosMoveOnSpawn[0]);
- }
- }
-
- void JustDied(Unit* /*killer*/)
- {
- Talk(SAY_DEATH);
- me->RemoveAllAuras();
- if (instance)
- {
- if (GameObject* gate = me->GetMap()->GetGameObject(instance->GetData64(GO_FORCEFIELD)))
- gate->SetGoState(GO_STATE_ACTIVE);
- instance->SetBossState(DATA_ARLOKK, DONE);
- }
- }
-
- void EnterCombat(Unit* /*who*/)
- {
- _EnterCombat();
- events.ScheduleEvent(EVENT_SHADOW_WORD_PAIN, urand(7000, 9000), 0, PHASE_ONE);
- events.ScheduleEvent(EVENT_GOUGE, urand(12000, 15000), 0, PHASE_ONE);
- if (instance)
- events.ScheduleEvent(EVENT_SUMMON_PROWLERS, 6000, 0, PHASE_ALL);
- events.ScheduleEvent(EVENT_MARK_OF_ARLOKK, urand(9000, 11000), 0, PHASE_ALL);
- events.ScheduleEvent(EVENT_TRANSFORM, urand(15000, 20000), 0, PHASE_ONE);
- Talk(SAY_AGGRO);
-
- // Sets up list of Panther spawners to cast on
- std::list<Creature*> triggerList;
- GetCreatureListWithEntryInGrid(triggerList, me, NPC_PANTHER_TRIGGER, 100.0f);
- if (!triggerList.empty())
- {
- uint8 sideA = 0;
- uint8 sideB = 0;
- for (std::list<Creature*>::const_iterator itr = triggerList.begin(); itr != triggerList.end(); ++itr)
- {
- if (Creature* trigger = *itr)
- {
- if (trigger->GetPositionY() < -1625.0f)
- {
- _triggersSideAGUID[sideA] = trigger->GetGUID();
- ++sideA;
- }
- else
- {
- _triggersSideBGUID[sideB] = trigger->GetGUID();
- ++sideB;
- }
- }
- }
- }
- }
-
- void EnterEvadeMode()
- {
- if (instance)
- {
- if (GameObject* object = me->GetMap()->GetGameObject(instance->GetData64(GO_FORCEFIELD)))
- object->SetGoState(GO_STATE_ACTIVE);
- if (GameObject* object = me->GetMap()->GetGameObject(instance->GetData64(GO_GONG_OF_BETHEKK)))
- object->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
- instance->SetBossState(DATA_ARLOKK, NOT_STARTED);
- }
- me->DespawnOrUnsummon(4000);
- }
-
- void SetData(uint32 id, uint32 /*value*/)
- {
- if (id == 1)
- --_summonCountA;
- else if (id == 2)
- --_summonCountB;
- }
-
- void UpdateAI(uint32 diff)
- {
- if (!UpdateVictim())
- return;
-
- events.Update(diff);
-
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
-
- while (uint32 eventId = events.ExecuteEvent())
- {
- switch (eventId)
- {
- case EVENT_SHADOW_WORD_PAIN:
- DoCastVictim(SPELL_SHADOW_WORD_PAIN, true);
- events.ScheduleEvent(EVENT_SHADOW_WORD_PAIN, urand(5000, 7000), 0, PHASE_ONE);
- break;
- case EVENT_GOUGE:
- DoCastVictim(SPELL_GOUGE, true);
- break;
- case EVENT_SUMMON_PROWLERS:
- if (_summonCountA < MAX_PROWLERS_PER_SIDE)
- {
- if (Unit* trigger = me->GetUnit(*me, _triggersSideAGUID[urand(0, 4)]))
- {
- trigger->CastSpell(trigger, SPELL_SUMMON_PROWLER);
- ++_summonCountA;
- }
- }
- if (_summonCountB < MAX_PROWLERS_PER_SIDE)
- {
- if (Unit* trigger = me->GetUnit(*me, _triggersSideBGUID[urand(0, 4)]))
- {
- trigger->CastSpell(trigger, SPELL_SUMMON_PROWLER);
- ++_summonCountB;
- }
- }
- events.ScheduleEvent(EVENT_SUMMON_PROWLERS, 6000, 0, PHASE_ALL);
- break;
- case EVENT_MARK_OF_ARLOKK:
- {
- Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, urand(1, 3), 0.0f, false, -SPELL_MARK_OF_ARLOKK);
- if (!target)
- target = me->GetVictim();
- if (target)
- {
- DoCast(target, SPELL_MARK_OF_ARLOKK, true);
- Talk(SAY_FEAST_PROWLER, target->GetGUID());
- }
- events.ScheduleEvent(EVENT_MARK_OF_ARLOKK, urand(120000, 130000));
- break;
- }
- case EVENT_TRANSFORM:
- {
- DoCast(me, SPELL_PANTHER_TRANSFORM);
- me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(EQUIP_UNEQUIP));
- me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, uint32(EQUIP_UNEQUIP));
- const CreatureTemplate* cinfo = me->GetCreatureTemplate();
- me->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, (cinfo->mindmg +((cinfo->mindmg/100) * 35)));
- me->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, (cinfo->maxdmg +((cinfo->maxdmg/100) * 35)));
- me->UpdateDamagePhysical(BASE_ATTACK);
- me->AttackStop();
- DoResetThreat();
- me->SetReactState(REACT_PASSIVE);
- me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE);
- DoCast(me, SPELL_VANISH_VISUAL);
- DoCast(me, SPELL_VANISH);
- events.ScheduleEvent(EVENT_VANISH, 1000, 0, PHASE_ONE);
- break;
- }
- case EVENT_VANISH:
- DoCast(me, SPELL_SUPER_INVIS);
- me->SetWalk(false);
- if (instance)
- me->GetMotionMaster()->MovePoint(0, frand(-11551.0f, -11508.0f), frand(-1638.0f, -1617.0f), me->GetPositionZ());
- events.ScheduleEvent(EVENT_VANISH_2, 9000, 0, PHASE_ONE);
- break;
- case EVENT_VANISH_2:
- DoCast(me, SPELL_VANISH);
- DoCast(me, SPELL_SUPER_INVIS);
- events.ScheduleEvent(EVENT_VISIBLE, urand(7000, 10000), 0, PHASE_ONE);
- break;
- case EVENT_VISIBLE:
- me->SetReactState(REACT_AGGRESSIVE);
- me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE);
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
- AttackStart(target);
- me->RemoveAura(SPELL_SUPER_INVIS);
- me->RemoveAura(SPELL_VANISH);
- events.ScheduleEvent(EVENT_RAVAGE, urand(10000, 14000), 0, PHASE_TWO);
- events.ScheduleEvent(EVENT_TRANSFORM_BACK, urand(15000, 18000), 0, PHASE_TWO);
- events.SetPhase(PHASE_TWO);
- break;
- case EVENT_RAVAGE:
- DoCastVictim(SPELL_RAVAGE, true);
- events.ScheduleEvent(EVENT_RAVAGE, urand(10000, 14000), 0, PHASE_TWO);
- break;
- case EVENT_TRANSFORM_BACK:
- {
- me->RemoveAura(SPELL_PANTHER_TRANSFORM);
- DoCast(me, SPELL_VANISH_VISUAL);
- me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(WEAPON_DAGGER));
- me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, uint32(WEAPON_DAGGER));
- const CreatureTemplate* cinfo = me->GetCreatureTemplate();
- me->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, (cinfo->mindmg));
- me->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, (cinfo->maxdmg));
- me->UpdateDamagePhysical(BASE_ATTACK);
- events.ScheduleEvent(EVENT_SHADOW_WORD_PAIN, urand(4000, 7000), 0, PHASE_ONE);
- events.ScheduleEvent(EVENT_GOUGE, urand(12000, 15000), 0, PHASE_ONE);
- events.ScheduleEvent(EVENT_TRANSFORM, urand(16000, 20000), 0, PHASE_ONE);
- events.SetPhase(PHASE_ONE);
- break;
- }
- default:
- break;
- }
- }
-
- DoMeleeAttackIfReady();
- }
-
- private:
- uint8 _summonCountA;
- uint8 _summonCountB;
- uint64 _triggersSideAGUID[5];
- uint64 _triggersSideBGUID[5];
- };
-
- CreatureAI* GetAI(Creature* creature) const
- {
- return GetZulGurubAI<boss_arlokkAI>(creature);
- }
-};
-
-/*######
-## npc_zulian_prowler
-######*/
-
-enum ZulianProwlerSpells
-{
- SPELL_SNEAK_RANK_1_1 = 22766,
- SPELL_SNEAK_RANK_1_2 = 7939, // Added to Spell_dbc
- SPELL_MARK_OF_ARLOKK_TRIGGER = 24211 // Added to Spell_dbc
-};
-
-enum ZulianProwlerEvents
-{
- EVENT_ATTACK = 1
-};
-
-Position const PosProwlerCenter[1] =
-{
- { -11556.7f, -1631.344f, 41.2994f, 0.0f }
-};
-
-class npc_zulian_prowler : public CreatureScript
-{
- public: npc_zulian_prowler() : CreatureScript("npc_zulian_prowler") {}
-
- struct npc_zulian_prowlerAI : public ScriptedAI
- {
- npc_zulian_prowlerAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { }
-
- void Reset()
- {
- if (me->GetPositionY() < -1625.0f)
- _sideData = 1;
- else
- _sideData = 2;
-
- DoCast(me, SPELL_SNEAK_RANK_1_1);
- DoCast(me, SPELL_SNEAK_RANK_1_2);
-
- if (_instance)
- if (Unit* arlokk = me->GetUnit(*me, _instance->GetData64(NPC_ARLOKK)))
- me->GetMotionMaster()->MovePoint(0, arlokk->GetPositionX(), arlokk->GetPositionY(), arlokk->GetPositionZ());
- _events.ScheduleEvent(EVENT_ATTACK, 6000);
- }
-
- void EnterCombat(Unit* /*who*/)
- {
- me->GetMotionMaster()->Clear(false);
- me->RemoveAura(SPELL_SNEAK_RANK_1_1);
- me->RemoveAura(SPELL_SNEAK_RANK_1_2);
- }
-
- void SpellHit(Unit* caster, SpellInfo const* spell)
- {
- if (spell->Id == SPELL_MARK_OF_ARLOKK_TRIGGER) // Should only hit if line of sight
- me->Attack(caster, true);
- }
-
- void JustDied(Unit* /*killer*/)
- {
- if (_instance)
- {
- if (Unit* arlokk = me->GetUnit(*me, _instance->GetData64(NPC_ARLOKK)))
- {
- if (arlokk->IsAlive())
- arlokk->GetAI()->SetData(_sideData, 0);
- }
- }
- me->DespawnOrUnsummon(4000);
- }
-
- void UpdateAI(uint32 diff)
- {
- if (UpdateVictim())
- {
- DoMeleeAttackIfReady();
- return;
- }
-
- _events.Update(diff);
-
- while (uint32 eventId = _events.ExecuteEvent())
- {
- switch (eventId)
- {
- case EVENT_ATTACK:
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0.0f, 100, false))
- me->Attack(target, true);
- break;
- default:
- break;
- }
- }
- }
-
- private:
- int32 _sideData;
- EventMap _events;
- InstanceScript* _instance;
- };
-
- CreatureAI* GetAI(Creature* creature) const
- {
- return GetZulGurubAI<npc_zulian_prowlerAI>(creature);
- }
-};
-
-/*######
-## go_gong_of_bethekk
-######*/
-
-Position const PosSummonArlokk[1] =
-{
- { -11507.22f, -1628.062f, 41.38264f, 3.159046f }
-};
-
-class go_gong_of_bethekk : public GameObjectScript
-{
- public: go_gong_of_bethekk() : GameObjectScript("go_gong_of_bethekk") {}
-
- bool OnGossipHello(Player* /*player*/, GameObject* go)
- {
- if (go->GetInstanceScript())
- {
- go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
- go->SendCustomAnim(0);
- go->SummonCreature(NPC_ARLOKK, PosSummonArlokk[0], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 600000);
- }
- return true;
- }
-};
-
-void AddSC_boss_arlokk()
-{
- new boss_arlokk();
- new npc_zulian_prowler();
- new go_gong_of_bethekk();
-}
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_grilek.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_grilek.cpp
index 5fc1f10ef00..c3bfa008c08 100644
--- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_grilek.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_grilek.cpp
@@ -16,52 +16,44 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/* ScriptData
-SDName: Boss_Grilek
-SD%Complete: 100
-SDComment:
-SDCategory: Zul'Gurub
-EndScriptData */
-
+#include "ObjectMgr.h"
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "zulgurub.h"
+enum Yells
+{
+};
+
enum Spells
{
- SPELL_AVATAR = 24646, // Enrage Spell
- SPELL_GROUND_TREMOR = 6524
};
enum Events
{
- EVENT_AVATAR = 1,
- EVENT_GROUND_TREMOR = 2
};
-class boss_grilek : public CreatureScript // grilek
+class boss_grilek : public CreatureScript
{
- public: boss_grilek() : CreatureScript("boss_grilek") {}
+ public:
+ boss_grilek() : CreatureScript("boss_grilek") { }
struct boss_grilekAI : public BossAI
{
- boss_grilekAI(Creature* creature) : BossAI(creature, DATA_EDGE_OF_MADNESS) {}
+ boss_grilekAI(Creature* creature) : BossAI(creature, DATA_GRILEK)
+ {
+ }
void Reset()
{
- _Reset();
}
- void JustDied(Unit* /*killer*/)
+ void EnterCombat(Unit* /*who*/)
{
- _JustDied();
}
- void EnterCombat(Unit* /*who*/)
+ void JustDied(Unit* /*killer*/)
{
- _EnterCombat();
- events.ScheduleEvent(EVENT_AVATAR, urand(15000, 25000));
- events.ScheduleEvent(EVENT_GROUND_TREMOR, urand(15000, 25000));
}
void UpdateAI(uint32 diff)
@@ -73,31 +65,16 @@ class boss_grilek : public CreatureScript // grilek
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
-
+ /*
while (uint32 eventId = events.ExecuteEvent())
{
switch (eventId)
{
- case EVENT_AVATAR:
- DoCast(me, SPELL_AVATAR);
- if (Unit* victim = me->GetVictim())
- {
- if (DoGetThreat(victim))
- DoModifyThreatPercent(victim, -50);
- }
-
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1))
- AttackStart(target);
- events.ScheduleEvent(EVENT_AVATAR, urand(25000, 35000));
- break;
- case EVENT_GROUND_TREMOR:
- DoCastVictim(SPELL_GROUND_TREMOR, true);
- events.ScheduleEvent(EVENT_GROUND_TREMOR, urand(12000, 16000));
- break;
default:
break;
}
}
+ */
DoMeleeAttackIfReady();
}
@@ -113,4 +90,3 @@ void AddSC_boss_grilek()
{
new boss_grilek();
}
-
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_hakkar.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_hakkar.cpp
deleted file mode 100644
index 18b1bc21ea3..00000000000
--- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_hakkar.cpp
+++ /dev/null
@@ -1,180 +0,0 @@
-/*
- * Copyright (C) 2008-2013 TrinityCore <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, see <http://www.gnu.org/licenses/>.
- */
-
-/*
-Name: Boss_Hakkar
-%Complete: 95
-Comment: Blood siphon spell buggy cause of Core Issue.
-Category: Zul'Gurub
-*/
-
-#include "ScriptMgr.h"
-#include "ScriptedCreature.h"
-#include "zulgurub.h"
-
-enum Says
-{
- SAY_AGGRO = 0,
- SAY_FLEEING = 1,
- SAY_MINION_DESTROY = 2, // Where does it belong?
- SAY_PROTECT_ALTAR = 3 // Where does it belong?
-};
-
-enum Spells
-{
- SPELL_BLOOD_SIPHON = 24322, // Buggy ?
- SPELL_CORRUPTED_BLOOD = 24328,
- SPELL_CAUSE_INSANITY = 24327, // Spell needs scripting.
- SPELL_WILL_OF_HAKKAR = 24178,
- SPELL_ENRAGE = 24318,
- // The Aspects of all High Priests spells
- SPELL_ASPECT_OF_JEKLIK = 24687,
- SPELL_ASPECT_OF_VENOXIS = 24688,
- SPELL_ASPECT_OF_MARLI = 24686,
- SPELL_ASPECT_OF_THEKAL = 24689,
- SPELL_ASPECT_OF_ARLOKK = 24690
-};
-
-enum Events
-{
- EVENT_BLOOD_SIPHON = 1,
- EVENT_CORRUPTED_BLOOD = 2,
- EVENT_CAUSE_INSANITY = 3, // Spell needs scripting. Event disabled
- EVENT_WILL_OF_HAKKAR = 4,
- EVENT_ENRAGE = 5,
- // The Aspects of all High Priests events
- EVENT_ASPECT_OF_JEKLIK = 6,
- EVENT_ASPECT_OF_VENOXIS = 7,
- EVENT_ASPECT_OF_MARLI = 8,
- EVENT_ASPECT_OF_THEKAL = 9,
- EVENT_ASPECT_OF_ARLOKK = 10
-};
-
-class boss_hakkar : public CreatureScript
-{
- public: boss_hakkar() : CreatureScript("boss_hakkar") {}
-
- struct boss_hakkarAI : public BossAI
- {
- boss_hakkarAI(Creature* creature) : BossAI(creature, DATA_HAKKAR) {}
-
- void Reset()
- {
- _Reset();
- }
-
- void JustDied(Unit* /*killer*/)
- {
- _JustDied();
- }
-
- void EnterCombat(Unit* /*who*/)
- {
- _EnterCombat();
- events.ScheduleEvent(EVENT_BLOOD_SIPHON, 90000);
- events.ScheduleEvent(EVENT_CORRUPTED_BLOOD, 25000);
- events.ScheduleEvent(EVENT_CAUSE_INSANITY, 17000);
- events.ScheduleEvent(EVENT_WILL_OF_HAKKAR, 17000);
- events.ScheduleEvent(EVENT_ENRAGE, 600000);
- if (instance->GetBossState(DATA_JEKLIK) != DONE)
- events.ScheduleEvent(EVENT_ASPECT_OF_JEKLIK, 4000);
- if (instance->GetBossState(DATA_VENOXIS) != DONE)
- events.ScheduleEvent(EVENT_ASPECT_OF_VENOXIS, 7000);
- if (instance->GetBossState(DATA_MARLI) != DONE)
- events.ScheduleEvent(EVENT_ASPECT_OF_MARLI, 12000);
- if (instance->GetBossState(DATA_THEKAL) != DONE)
- events.ScheduleEvent(EVENT_ASPECT_OF_THEKAL, 8000);
- if (instance->GetBossState(DATA_ARLOKK) != DONE)
- events.ScheduleEvent(EVENT_ASPECT_OF_ARLOKK, 18000);
- Talk(SAY_AGGRO);
- }
-
- void UpdateAI(uint32 diff)
- {
- if (!UpdateVictim())
- return;
-
- events.Update(diff);
-
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
-
- while (uint32 eventId = events.ExecuteEvent())
- {
- switch (eventId)
- {
- case EVENT_BLOOD_SIPHON:
- DoCastVictim(SPELL_BLOOD_SIPHON, true);
- events.ScheduleEvent(EVENT_BLOOD_SIPHON, 90000);
- break;
- case EVENT_CORRUPTED_BLOOD:
- DoCastVictim(SPELL_CORRUPTED_BLOOD, true);
- events.ScheduleEvent(EVENT_CORRUPTED_BLOOD, urand(30000, 45000));
- break;
- case EVENT_CAUSE_INSANITY:
- // DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true), SPELL_CAUSE_INSANITY);
- // events.ScheduleEvent(EVENT_CAUSE_INSANITY, urand(35000, 45000));
- break;
- case EVENT_WILL_OF_HAKKAR:
- DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true), SPELL_WILL_OF_HAKKAR);
- events.ScheduleEvent(EVENT_WILL_OF_HAKKAR, urand(25000, 35000));
- break;
- case EVENT_ENRAGE:
- if (!me->HasAura(SPELL_ENRAGE))
- DoCast(me, SPELL_ENRAGE);
- events.ScheduleEvent(EVENT_ENRAGE, 90000);
- break;
- case EVENT_ASPECT_OF_JEKLIK:
- DoCastVictim(SPELL_ASPECT_OF_JEKLIK, true);
- events.ScheduleEvent(EVENT_ASPECT_OF_JEKLIK, urand(10000, 14000));
- break;
- case EVENT_ASPECT_OF_VENOXIS:
- DoCastVictim(SPELL_ASPECT_OF_VENOXIS, true);
- events.ScheduleEvent(EVENT_ASPECT_OF_VENOXIS, 8000);
- break;
- case EVENT_ASPECT_OF_MARLI:
- DoCastVictim(SPELL_ASPECT_OF_MARLI, true);
- events.ScheduleEvent(EVENT_ASPECT_OF_MARLI, 10000);
- break;
- case EVENT_ASPECT_OF_THEKAL:
- DoCastVictim(SPELL_ASPECT_OF_THEKAL, true);
- events.ScheduleEvent(EVENT_ASPECT_OF_THEKAL, 15000);
- break;
- case EVENT_ASPECT_OF_ARLOKK:
- DoCastVictim(SPELL_ASPECT_OF_ARLOKK, true);
- events.ScheduleEvent(EVENT_ASPECT_OF_ARLOKK, urand(10000, 15000));
- break;
- default:
- break;
- }
- }
-
- DoMeleeAttackIfReady();
- }
- };
-
- CreatureAI* GetAI(Creature* creature) const
- {
- return new boss_hakkarAI(creature);
- }
-};
-
-void AddSC_boss_hakkar()
-{
- new boss_hakkar();
-}
-
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_hazzarah.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_hazzarah.cpp
index e92d3266c45..8889af46b81 100644
--- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_hazzarah.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_hazzarah.cpp
@@ -16,54 +16,44 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/* ScriptData
-SDName: Boss_Hazzarah
-SD%Complete: 100
-SDComment:
-SDCategory: Zul'Gurub
-EndScriptData */
-
+#include "ObjectMgr.h"
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "zulgurub.h"
+enum Yells
+{
+};
+
enum Spells
{
- SPELL_MANABURN = 26046,
- SPELL_SLEEP = 24664
};
enum Events
{
- EVENT_MANABURN = 1,
- EVENT_SLEEP = 2,
- EVENT_ILLUSIONS = 3
};
class boss_hazzarah : public CreatureScript
{
- public: boss_hazzarah() : CreatureScript("boss_hazzarah") {}
+ public:
+ boss_hazzarah() : CreatureScript("boss_hazzarah") { }
struct boss_hazzarahAI : public BossAI
{
- boss_hazzarahAI(Creature* creature) : BossAI(creature, DATA_EDGE_OF_MADNESS) {}
+ boss_hazzarahAI(Creature* creature) : BossAI(creature, DATA_HAZZARAH)
+ {
+ }
void Reset()
{
- _Reset();
}
- void JustDied(Unit* /*killer*/)
+ void EnterCombat(Unit* /*who*/)
{
- _JustDied();
}
- void EnterCombat(Unit* /*who*/)
+ void JustDied(Unit* /*killer*/)
{
- _EnterCombat();
- events.ScheduleEvent(EVENT_MANABURN, urand(4000, 10000));
- events.ScheduleEvent(EVENT_SLEEP, urand(10000, 18000));
- events.ScheduleEvent(EVENT_ILLUSIONS, urand(10000, 18000));
}
void UpdateAI(uint32 diff)
@@ -75,37 +65,16 @@ class boss_hazzarah : public CreatureScript
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
-
+ /*
while (uint32 eventId = events.ExecuteEvent())
{
switch (eventId)
{
- case EVENT_MANABURN:
- DoCastVictim(SPELL_MANABURN, true);
- events.ScheduleEvent(EVENT_MANABURN, urand(8000, 16000));
- break;
- case EVENT_SLEEP:
- DoCastVictim(SPELL_SLEEP, true);
- events.ScheduleEvent(EVENT_SLEEP, urand(12000, 20000));
- break;
- case EVENT_ILLUSIONS:
- // We will summon 3 illusions that will spawn on a random gamer and attack this gamer
- // We will just use one model for the beginning
- for (uint8 i = 0; i < 3; ++i)
- {
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
- {
- Creature* Illusion = me->SummonCreature(NPC_NIGHTMARE_ILLUSION, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 30000);
- if (Illusion)
- Illusion->AI()->AttackStart(target);
- }
- }
- events.ScheduleEvent(EVENT_ILLUSIONS, urand(15000, 25000));
- break;
default:
break;
}
}
+ */
DoMeleeAttackIfReady();
}
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_jeklik.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_jeklik.cpp
deleted file mode 100644
index 2fb4e9eb4b3..00000000000
--- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_jeklik.cpp
+++ /dev/null
@@ -1,298 +0,0 @@
-/*
- * Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
- * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
- *
- * 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, see <http://www.gnu.org/licenses/>.
- */
-
-/* ScriptData
-SDName: Boss_Jeklik
-SD%Complete: 85
-SDComment: Problem in finding the right flying batriders for spawning and making them fly.
-SDCategory: Zul'Gurub
-EndScriptData */
-
-#include "ScriptMgr.h"
-#include "ScriptedCreature.h"
-#include "zulgurub.h"
-
-enum Says
-{
- SAY_AGGRO = 0,
- SAY_RAIN_FIRE = 1,
- SAY_DEATH = 2
-};
-
-enum Spells
-{
- SPELL_CHARGE = 22911,
- SPELL_SONICBURST = 23918,
- SPELL_SCREECH = 6605,
- SPELL_SHADOW_WORD_PAIN = 23952,
- SPELL_MIND_FLAY = 23953,
- SPELL_CHAIN_MIND_FLAY = 26044, // Right ID unknown. So disabled
- SPELL_GREATERHEAL = 23954,
- SPELL_BAT_FORM = 23966,
- // Batriders Spell
- SPELL_BOMB = 40332 // Wrong ID but Magmadars bomb is not working...
-};
-
-class boss_jeklik : public CreatureScript //jeklik
-{
- public: boss_jeklik() : CreatureScript("boss_jeklik") {}
-
- struct boss_jeklikAI : public BossAI
- {
- boss_jeklikAI(Creature* creature) : BossAI(creature, DATA_JEKLIK) {}
-
- uint32 Charge_Timer;
- uint32 SonicBurst_Timer;
- uint32 Screech_Timer;
- uint32 SpawnBats_Timer;
- uint32 ShadowWordPain_Timer;
- uint32 MindFlay_Timer;
- uint32 ChainMindFlay_Timer;
- uint32 GreaterHeal_Timer;
- uint32 SpawnFlyingBats_Timer;
-
- bool PhaseTwo;
-
- void Reset()
- {
- _Reset();
- Charge_Timer = 20000;
- SonicBurst_Timer = 8000;
- Screech_Timer = 13000;
- SpawnBats_Timer = 60000;
- ShadowWordPain_Timer = 6000;
- MindFlay_Timer = 11000;
- ChainMindFlay_Timer = 26000;
- GreaterHeal_Timer = 50000;
- SpawnFlyingBats_Timer = 10000;
-
- PhaseTwo = false;
- }
-
- void JustDied(Unit* /*killer*/)
- {
- _JustDied();
- Talk(SAY_DEATH);
- }
-
- void EnterCombat(Unit* /*who*/)
- {
- _EnterCombat();
- Talk(SAY_AGGRO);
- DoCast(me, SPELL_BAT_FORM);
- }
-
- void UpdateAI(uint32 diff)
- {
- if (!UpdateVictim())
- return;
-
- if (me->GetVictim() && me->IsAlive())
- {
- if (HealthAbovePct(50))
- {
- if (Charge_Timer <= diff)
- {
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
- {
- DoCast(target, SPELL_CHARGE);
- AttackStart(target);
- }
-
- Charge_Timer = urand(15000, 30000);
- } else Charge_Timer -= diff;
-
- if (SonicBurst_Timer <= diff)
- {
- DoCastVictim(SPELL_SONICBURST);
- SonicBurst_Timer = urand(8000, 13000);
- } else SonicBurst_Timer -= diff;
-
- if (Screech_Timer <= diff)
- {
- DoCastVictim(SPELL_SCREECH);
- Screech_Timer = urand(18000, 26000);
- } else Screech_Timer -= diff;
-
- if (SpawnBats_Timer <= diff)
- {
- Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0);
-
- Creature* Bat = NULL;
- Bat = me->SummonCreature(11368, -12291.6220f, -1380.2640f, 144.8304f, 5.483f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
- if (target && Bat) Bat ->AI()->AttackStart(target);
-
- Bat = me->SummonCreature(11368, -12289.6220f, -1380.2640f, 144.8304f, 5.483f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
- if (target && Bat) Bat ->AI()->AttackStart(target);
-
- Bat = me->SummonCreature(11368, -12293.6220f, -1380.2640f, 144.8304f, 5.483f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
- if (target && Bat) Bat ->AI()->AttackStart(target);
-
- Bat = me->SummonCreature(11368, -12291.6220f, -1380.2640f, 144.8304f, 5.483f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
- if (target && Bat) Bat ->AI()->AttackStart(target);
-
- Bat = me->SummonCreature(11368, -12289.6220f, -1380.2640f, 144.8304f, 5.483f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
- if (target && Bat) Bat ->AI()->AttackStart(target);
- Bat = me->SummonCreature(11368, -12293.6220f, -1380.2640f, 144.8304f, 5.483f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
- if (target && Bat) Bat ->AI()->AttackStart(target);
-
- SpawnBats_Timer = 60000;
- } else SpawnBats_Timer -= diff;
- }
- else
- {
- if (PhaseTwo)
- {
- if (ShadowWordPain_Timer <= diff)
- {
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
- {
- DoCast(target, SPELL_SHADOW_WORD_PAIN);
- ShadowWordPain_Timer = urand(12000, 18000);
- }
- }ShadowWordPain_Timer -=diff;
-
- if (MindFlay_Timer <= diff)
- {
- DoCastVictim(SPELL_MIND_FLAY);
- MindFlay_Timer = 16000;
- }MindFlay_Timer -=diff;
-
- if (ChainMindFlay_Timer <= diff)
- {
- me->InterruptNonMeleeSpells(false);
- DoCastVictim(SPELL_CHAIN_MIND_FLAY);
- ChainMindFlay_Timer = urand(15000, 30000);
- }ChainMindFlay_Timer -=diff;
-
- if (GreaterHeal_Timer <= diff)
- {
- me->InterruptNonMeleeSpells(false);
- DoCast(me, SPELL_GREATERHEAL);
- GreaterHeal_Timer = urand(25000, 35000);
- }GreaterHeal_Timer -=diff;
-
- if (SpawnFlyingBats_Timer <= diff)
- {
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
- {
- if (Creature* FlyingBat = me->SummonCreature(14965, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ()+15, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000))
- FlyingBat->AI()->AttackStart(target);
- }
-
- SpawnFlyingBats_Timer = urand(10000, 15000);
- } else SpawnFlyingBats_Timer -=diff;
- }
- else
- {
- me->SetDisplayId(15219);
- DoResetThreat();
- PhaseTwo = true;
- }
- }
-
- DoMeleeAttackIfReady();
- }
- }
- };
-
- CreatureAI* GetAI(Creature* creature) const
- {
- return new boss_jeklikAI(creature);
- }
-};
-
-//Flying Bat
-class npc_batrider : public CreatureScript
-{
- public:
-
- npc_batrider()
- : CreatureScript("npc_batrider")
- {
- }
-
- struct npc_batriderAI : public ScriptedAI
- {
- npc_batriderAI(Creature* creature) : ScriptedAI(creature)
- {
- instance = creature->GetInstanceScript();
- }
-
- InstanceScript* instance;
-
- uint32 Bomb_Timer;
- uint32 Check_Timer;
-
- void Reset()
- {
- Bomb_Timer = 2000;
- Check_Timer = 1000;
-
- me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- }
-
- void EnterCombat(Unit* /*who*/) {}
-
- void UpdateAI(uint32 diff)
- {
- if (!UpdateVictim())
- return;
-
- //Bomb_Timer
- if (Bomb_Timer <= diff)
- {
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
- {
- DoCast(target, SPELL_BOMB);
- Bomb_Timer = 5000;
- }
- } else Bomb_Timer -= diff;
-
- //Check_Timer
- if (Check_Timer <= diff)
- {
- if (instance)
- {
- if (instance->GetBossState(DATA_JEKLIK) == DONE)
- {
- me->setDeathState(JUST_DIED);
- me->RemoveCorpse();
- return;
- }
- }
-
- Check_Timer = 1000;
- } else Check_Timer -= diff;
-
- DoMeleeAttackIfReady();
- }
- };
-
- CreatureAI* GetAI(Creature* creature) const
- {
- return new npc_batriderAI(creature);
- }
-};
-
-void AddSC_boss_jeklik()
-{
- new boss_jeklik();
- new npc_batrider();
-}
-
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo.cpp
deleted file mode 100644
index 9f22bfdcbd8..00000000000
--- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo.cpp
+++ /dev/null
@@ -1,288 +0,0 @@
-/*
- * Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
- * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
- *
- * 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, see <http://www.gnu.org/licenses/>.
- */
-
-/* ScriptData
-SDName: Boss_Jin'do the Hexxer
-SD%Complete: 85
-SDComment: Mind Control not working because of core bug. Shades visible for all.
-SDCategory: Zul'Gurub
-EndScriptData */
-
-#include "ScriptMgr.h"
-#include "ScriptedCreature.h"
-#include "zulgurub.h"
-
-enum Say
-{
- SAY_AGGRO = 1
-};
-
-enum Spells
-{
- SPELL_BRAINWASHTOTEM = 24262,
- SPELL_POWERFULLHEALINGWARD = 24309, // HACKED Totem summoned by script because the spell totems will not cast.
- SPELL_HEX = 24053,
- SPELL_DELUSIONSOFJINDO = 24306,
- SPELL_SHADEOFJINDO = 24308, // HACKED
- //Healing Ward Spell
- SPELL_HEAL = 38588, // HACKED Totems are not working right. Right heal spell ID is 24311 but this spell is not casting...
- //Shade of Jindo Spell
- SPELL_SHADOWSHOCK = 19460,
- SPELL_INVISIBLE = 24699
-};
-
-enum Events
-{
- EVENT_BRAINWASHTOTEM = 1,
- EVENT_POWERFULLHEALINGWARD = 2,
- EVENT_HEX = 3,
- EVENT_DELUSIONSOFJINDO = 4,
- EVENT_TELEPORT = 5
-};
-
-Position const TeleportLoc = {-11583.7783f, -1249.4278f, 77.5471f, 4.745f};
-
-class boss_jindo : public CreatureScript
-{
- public: boss_jindo() : CreatureScript("boss_jindo") {}
-
- struct boss_jindoAI : public BossAI
- {
- boss_jindoAI(Creature* creature) : BossAI(creature, DATA_JINDO) {}
-
- void Reset()
- {
- _Reset();
- }
-
- void JustDied(Unit* /*killer*/)
- {
- _JustDied();
- }
-
- void EnterCombat(Unit* /*who*/)
- {
- _EnterCombat();
- events.ScheduleEvent(EVENT_BRAINWASHTOTEM, 20000);
- events.ScheduleEvent(EVENT_POWERFULLHEALINGWARD, 16000);
- events.ScheduleEvent(EVENT_HEX, 8000);
- events.ScheduleEvent(EVENT_DELUSIONSOFJINDO, 10000);
- events.ScheduleEvent(EVENT_TELEPORT, 5000);
- Talk(SAY_AGGRO);
- }
-
- void UpdateAI(uint32 diff)
- {
- if (!UpdateVictim())
- return;
-
- events.Update(diff);
-
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
-
- while (uint32 eventId = events.ExecuteEvent())
- {
- switch (eventId)
- {
- case EVENT_BRAINWASHTOTEM:
- DoCast(me, SPELL_BRAINWASHTOTEM);
- events.ScheduleEvent(EVENT_BRAINWASHTOTEM, urand(18000, 26000));
- break;
- case EVENT_POWERFULLHEALINGWARD: // HACK
- //DoCast(me, SPELL_POWERFULLHEALINGWARD);
- me->SummonCreature(14987, me->GetPositionX()+3, me->GetPositionY()-2, me->GetPositionZ(), 0, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 30000);
- events.ScheduleEvent(EVENT_POWERFULLHEALINGWARD, urand(14000, 20000));
- break;
- case EVENT_HEX:
- if (Unit* target = me->GetVictim())
- {
- DoCast(target, SPELL_HEX, true);
- if (DoGetThreat(target))
- DoModifyThreatPercent(target, -80);
- }
- events.ScheduleEvent(EVENT_HEX, urand(12000, 20000));
- break;
- case EVENT_DELUSIONSOFJINDO: // HACK
- // Casting the delusion curse with a shade so shade will attack the same target with the curse.
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
- {
- DoCast(target, SPELL_DELUSIONSOFJINDO);
- Creature* Shade = me->SummonCreature(NPC_SHADE_OF_JINDO, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
- if (Shade)
- Shade->AI()->AttackStart(target);
- }
- events.ScheduleEvent(EVENT_DELUSIONSOFJINDO, urand(4000, 12000));
- break;
- case EVENT_TELEPORT: // Possible HACK
- // Teleports a random player and spawns 9 Sacrificed Trolls to attack player
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
- {
- DoTeleportPlayer(target, TeleportLoc.m_positionX, TeleportLoc.m_positionY, TeleportLoc.m_positionZ, TeleportLoc.m_orientation);
- if (DoGetThreat(me->GetVictim()))
- DoModifyThreatPercent(target, -100);
- Creature* SacrificedTroll;
- SacrificedTroll = me->SummonCreature(NPC_SACRIFICED_TROLL, target->GetPositionX()+2, target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
- if (SacrificedTroll)
- SacrificedTroll->AI()->AttackStart(target);
- SacrificedTroll = me->SummonCreature(NPC_SACRIFICED_TROLL, target->GetPositionX()-2, target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
- if (SacrificedTroll)
- SacrificedTroll->AI()->AttackStart(target);
- SacrificedTroll = me->SummonCreature(NPC_SACRIFICED_TROLL, target->GetPositionX()+4, target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
- if (SacrificedTroll)
- SacrificedTroll->AI()->AttackStart(target);
- SacrificedTroll = me->SummonCreature(NPC_SACRIFICED_TROLL, target->GetPositionX()-4, target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
- if (SacrificedTroll)
- SacrificedTroll->AI()->AttackStart(target);
- SacrificedTroll = me->SummonCreature(NPC_SACRIFICED_TROLL, target->GetPositionX(), target->GetPositionY()+2, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
- if (SacrificedTroll)
- SacrificedTroll->AI()->AttackStart(target);
- SacrificedTroll = me->SummonCreature(NPC_SACRIFICED_TROLL, target->GetPositionX(), target->GetPositionY()-2, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
- if (SacrificedTroll)
- SacrificedTroll->AI()->AttackStart(target);
- SacrificedTroll = me->SummonCreature(NPC_SACRIFICED_TROLL, target->GetPositionX(), target->GetPositionY()+4, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
- if (SacrificedTroll)
- SacrificedTroll->AI()->AttackStart(target);
- SacrificedTroll = me->SummonCreature(NPC_SACRIFICED_TROLL, target->GetPositionX(), target->GetPositionY()-4, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
- if (SacrificedTroll)
- SacrificedTroll->AI()->AttackStart(target);
- SacrificedTroll = me->SummonCreature(NPC_SACRIFICED_TROLL, target->GetPositionX()+3, target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
- if (SacrificedTroll)
- SacrificedTroll->AI()->AttackStart(target);
- }
- events.ScheduleEvent(EVENT_TELEPORT, urand(15000, 23000));
- break;
- default:
- break;
- }
- }
-
- DoMeleeAttackIfReady();
- }
- };
-
- CreatureAI* GetAI(Creature* creature) const
- {
- return new boss_jindoAI(creature);
- }
-};
-
-//Healing Ward
-class npc_healing_ward : public CreatureScript
-{
- public:
-
- npc_healing_ward()
- : CreatureScript("npc_healing_ward")
- {
- }
-
- struct npc_healing_wardAI : public ScriptedAI
- {
- npc_healing_wardAI(Creature* creature) : ScriptedAI(creature)
- {
- instance = creature->GetInstanceScript();
- }
-
- uint32 Heal_Timer;
-
- InstanceScript* instance;
-
- void Reset()
- {
- Heal_Timer = 2000;
- }
-
- void EnterCombat(Unit* /*who*/)
- {
- }
-
- void UpdateAI(uint32 diff)
- {
- //Heal_Timer
- if (Heal_Timer <= diff)
- {
- if (instance)
- {
- Unit* pJindo = Unit::GetUnit(*me, instance->GetData64(DATA_JINDO));
- if (pJindo)
- DoCast(pJindo, SPELL_HEAL);
- }
- Heal_Timer = 3000;
- } else Heal_Timer -= diff;
-
- DoMeleeAttackIfReady();
- }
- };
-
- CreatureAI* GetAI(Creature* creature) const
- {
- return new npc_healing_wardAI(creature);
- }
-};
-
-//Shade of Jindo
-class npc_shade_of_jindo : public CreatureScript
-{
- public:
-
- npc_shade_of_jindo()
- : CreatureScript("npc_shade_of_jindo")
- {
- }
-
- struct npc_shade_of_jindoAI : public ScriptedAI
- {
- npc_shade_of_jindoAI(Creature* creature) : ScriptedAI(creature) {}
-
- uint32 ShadowShock_Timer;
-
- void Reset()
- {
- ShadowShock_Timer = 1000;
- DoCast(me, SPELL_INVISIBLE, true);
- }
-
- void EnterCombat(Unit* /*who*/){}
-
- void UpdateAI(uint32 diff)
- {
-
- //ShadowShock_Timer
- if (ShadowShock_Timer <= diff)
- {
- DoCastVictim(SPELL_SHADOWSHOCK);
- ShadowShock_Timer = 2000;
- } else ShadowShock_Timer -= diff;
-
- DoMeleeAttackIfReady();
- }
- };
-
- CreatureAI* GetAI(Creature* creature) const
- {
- return new npc_shade_of_jindoAI(creature);
- }
-};
-
-void AddSC_boss_jindo()
-{
- new boss_jindo();
- new npc_healing_ward();
- new npc_shade_of_jindo();
-}
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo_the_godbreaker.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo_the_godbreaker.cpp
new file mode 100644
index 00000000000..d3fff5d710e
--- /dev/null
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo_the_godbreaker.cpp
@@ -0,0 +1,108 @@
+/*
+ * Copyright (C) 2008-2013 TrinityCore <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, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "ObjectMgr.h"
+#include "ScriptMgr.h"
+#include "ScriptedCreature.h"
+#include "zulgurub.h"
+
+enum Yells
+{
+ // Jin'do the Godbreaker
+ SAY_INTRO = 0,
+ SAY_AGGRO = 1,
+ EMOTE_SHADOWS_OF_HAKKAR = 2, // ID - 97172 Shadows of Hakkar
+ SAY_JINDO_SPIRIT_PHASE = 3,
+ //SAY_PLAYER_KILL = 4, // missing data
+
+ // Spirit of Hakkar
+ SAY_SPIRIT_SPIRIT_PHASE = 0,
+ SAY_SPIRIT_DEFEATED = 1,
+
+ // Jin'do the Godbreaker - Trigger
+ SAY_JINDO_DEFEATED = 0,
+
+ // Shadow of Hakkar
+ SAY_SHADOW_DEFEATED = 0,
+};
+
+enum Spells
+{
+};
+
+enum Events
+{
+};
+
+class boss_jindo_the_godbreaker : public CreatureScript
+{
+ public:
+ boss_jindo_the_godbreaker() : CreatureScript("boss_jindo_the_godbreaker") { }
+
+ struct boss_jindo_the_godbreakerAI : public BossAI
+ {
+ boss_jindo_the_godbreakerAI(Creature* creature) : BossAI(creature, DATA_JINDO) { }
+
+ void Reset()
+ {
+ _Reset();
+ }
+
+ void EnterCombat(Unit* /*who*/)
+ {
+ _EnterCombat();
+ Talk(SAY_AGGRO);
+ }
+
+ void JustDied(Unit* /*killer*/)
+ {
+ }
+
+ void UpdateAI(uint32 diff)
+ {
+ if (!UpdateVictim())
+ return;
+
+ events.Update(diff);
+
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+ /*
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ default:
+ break;
+ }
+ }
+ */
+
+ DoMeleeAttackIfReady();
+ }
+ };
+
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return GetZulGurubAI<boss_jindo_the_godbreakerAI>(creature);
+ }
+};
+
+void AddSC_boss_jindo_the_godbreaker()
+{
+ new boss_jindo_the_godbreaker();
+}
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_gahzranka.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_kilnara.cpp
index fe9c0be49aa..eab9722b280 100644
--- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_gahzranka.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_kilnara.cpp
@@ -1,6 +1,5 @@
/*
* Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
- * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
*
* 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
@@ -16,55 +15,60 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/* ScriptData
-SDName: Boss_Gahz'ranka
-SD%Complete: 85
-SDComment: Massive Geyser with knockback not working. Spell buggy.
-SDCategory: Zul'Gurub
-EndScriptData */
-
+#include "ObjectMgr.h"
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
+#include "Spell.h"
#include "zulgurub.h"
+enum Yells
+{
+ SAY_AGGRO = 0,
+ SAY_WAVE_OF_AGONY = 1, // ID - 96457 Wave of Agony
+ SAY_TRANSFROM_1 = 2,
+ SAY_TRANSFROM_2 = 3,
+ SAY_PLAYER_KILL = 4,
+ SAY_DEATH = 5
+};
+
enum Spells
{
- SPELL_FROSTBREATH = 16099,
- SPELL_MASSIVEGEYSER = 22421, // Not working. (summon)
- SPELL_SLAM = 24326
};
enum Events
{
- EVENT_FROSTBREATH = 1,
- EVENT_MASSIVEGEYSER = 2,
- EVENT_SLAM = 3
};
-class boss_gahzranka : public CreatureScript // gahzranka
+class boss_kilnara : public CreatureScript
{
- public: boss_gahzranka() : CreatureScript("boss_gahzranka") {}
+ public:
+ boss_kilnara() : CreatureScript("boss_kilnara") { }
- struct boss_gahzrankaAI : public BossAI
+ struct boss_kilnaraAI : public BossAI
{
- boss_gahzrankaAI(Creature* creature) : BossAI(creature, DATA_GAHZRANKA) {}
+ boss_kilnaraAI(Creature* creature) : BossAI(creature, DATA_KILNARA) { }
void Reset()
{
_Reset();
}
+ void EnterCombat(Unit* /*who*/)
+ {
+ _EnterCombat();
+ Talk(SAY_AGGRO);
+ }
+
void JustDied(Unit* /*killer*/)
{
_JustDied();
+ Talk(SAY_DEATH);
}
- void EnterCombat(Unit* /*who*/)
+ void KilledUnit(Unit* victim)
{
- _EnterCombat();
- events.ScheduleEvent(EVENT_FROSTBREATH, 8000);
- events.ScheduleEvent(EVENT_MASSIVEGEYSER, 25000);
- events.ScheduleEvent(EVENT_SLAM, 17000);
+ if (victim->GetTypeId() == TYPEID_PLAYER)
+ Talk(SAY_PLAYER_KILL);
}
void UpdateAI(uint32 diff)
@@ -76,27 +80,16 @@ class boss_gahzranka : public CreatureScript // gahzranka
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
-
+ /*
while (uint32 eventId = events.ExecuteEvent())
{
switch (eventId)
{
- case EVENT_FROSTBREATH:
- DoCastVictim(SPELL_FROSTBREATH, true);
- events.ScheduleEvent(EVENT_FROSTBREATH, urand(7000, 11000));
- break;
- case EVENT_MASSIVEGEYSER:
- DoCastVictim(SPELL_MASSIVEGEYSER, true);
- events.ScheduleEvent(EVENT_MASSIVEGEYSER, urand(22000, 32000));
- break;
- case EVENT_SLAM:
- DoCastVictim(SPELL_SLAM, true);
- events.ScheduleEvent(EVENT_SLAM, urand(12000, 20000));
- break;
default:
break;
}
}
+ */
DoMeleeAttackIfReady();
}
@@ -104,11 +97,11 @@ class boss_gahzranka : public CreatureScript // gahzranka
CreatureAI* GetAI(Creature* creature) const
{
- return new boss_gahzrankaAI(creature);
+ return GetZulGurubAI<boss_kilnaraAI>(creature);
}
};
-void AddSC_boss_gahzranka()
+void AddSC_boss_kilnara()
{
- new boss_gahzranka();
+ new boss_kilnara();
}
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp
index bb27c6f7630..d7949e01184 100644
--- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp
@@ -16,97 +16,94 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/* ScriptData
-SDName: Boss_Mandokir
-SD%Complete: 90
-SDComment: Ohgan function needs improvements.
-SDCategory: Zul'Gurub
-EndScriptData */
-
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
-#include "Spell.h"
-#include "SpellAuras.h"
#include "SpellScript.h"
+#include "SpellAuraEffects.h"
+#include "Player.h"
+#include "GridNotifiers.h"
#include "zulgurub.h"
-enum Says
+enum Yells
{
- SAY_AGGRO = 0,
- SAY_DING_KILL = 1,
- SAY_WATCH = 2,
- SAY_WATCH_WHISPER = 3,
- SAY_OHGAN_DEAD = 4,
- SAY_GRATS_JINDO = 0,
+ SAY_AGGRO = 0,
+ SAY_PLAYER_KILL = 1,
+ SAY_DISMOUNT_OHGAN = 2,
+ EMOTE_DEVASTATING_SLAM = 3,
+ SAY_REANIMATE_OHGAN = 4,
+ EMOTE_FRENZY = 5,
+ SAY_FRENZY = 6,
+ SAY_DEATH = 7
};
enum Spells
{
- SPELL_CHARGE = 24408, // seen
- SPELL_OVERPOWER = 24407, // Seen
- SPELL_FEAR = 29321,
- SPELL_WHIRLWIND = 13736, // Triggers 15589
- SPELL_MORTAL_STRIKE = 16856, // Seen
- SPELL_FRENZY = 24318, // seen
- SPELL_WATCH = 24314, // seen 24315, 24316
- SPELL_WATCH_CHARGE = 24315, // Triggers 24316
- SPELL_LEVEL_UP = 24312 //
+ // Bloodlord Mandokir
+ SPELL_BLOODLORD_AURA = 96480,
+ SPELL_SUMMON_OHGAN = 96717,
+ SPELL_REANIMATE_OHGAN = 96724,
+ SPELL_DECAPITATE = 96682,
+ SPELL_BLOODLETTING = 96776,
+ SPELL_BLOODLETTING_DAMAGE = 96777,
+ SPELL_BLOODLETTING_HEAL = 96778,
+ SPELL_FRENZY = 96800,
+ SPELL_LEVEL_UP = 96662,
+ SPELL_DEVASTATING_SLAM = 96740,
+ SPELL_DEVASTATING_SLAM_TRIGGER = 96761,
+ SPELL_DEVASTATING_SLAM_DAMAGE = 97385,
+ SPELL_SPIRIT_VENGEANCE_CANCEL = 96821,
+
+ // Chained Spirit
+ SPELL_REVIVE = 96484,
+
+ // Ohgan
+ SPELL_OHGAN_HEART_VISUAL = 96727,
+ SPELL_PERMANENT_FEIGN_DEATH = 96733,
+ SPELL_CLEAR_ALL = 28471,
+ SPELL_OHGAN_ORDERS = 96721,
+ SPELL_OHGAN_ORDERS_TRIGGER = 96722
};
enum Events
{
- EVENT_CHECK_SPEAKER = 1,
- EVENT_CHECK_START = 2,
- EVENT_STARTED = 3,
- EVENT_OVERPOWER = 4,
- EVENT_MORTAL_STRIKE = 5,
- EVENT_WHIRLWIND = 6,
- EVENT_CHECK_OHGAN = 7,
- EVENT_WATCH_PLAYER = 8,
- EVENT_CHARGE_PLAYER = 9
+ // Bloodlord Mandokir
+ EVENT_SUMMON_OHGAN = 1,
+ EVENT_DECAPITATE = 2,
+ EVENT_BLOODLETTING = 3,
+ EVENT_REANIMATE_OHGAN = 4,
+ EVENT_REANIMATE_OHGAN_COOLDOWN = 5,
+ EVENT_DEVASTATING_SLAM = 6
};
-enum Misc
+enum Action
{
- MODEL_OHGAN_MOUNT = 15271,
- PATH_MANDOKIR = 492861,
- POINT_MANDOKIR_END = 24,
- CHAINED_SPIRT_COUNT = 20
+ // Bloodlord Mandokir
+ ACTION_OHGAN_IS_DEATH = 1,
+ ACTION_START_REVIVE = 2,
+
+ // Chained Spirit
+ ACTION_REVIVE = 1
};
-Position const PosSummonChainedSpirits[CHAINED_SPIRT_COUNT] =
+enum Misc
{
- { -12167.17f, -1979.330f, 133.0992f, 2.268928f },
- { -12262.74f, -1953.394f, 133.5496f, 0.593412f },
- { -12176.89f, -1983.068f, 133.7841f, 2.129302f },
- { -12226.45f, -1977.933f, 132.7982f, 1.466077f },
- { -12204.74f, -1890.431f, 135.7569f, 4.415683f },
- { -12216.70f, -1891.806f, 136.3496f, 4.677482f },
- { -12236.19f, -1892.034f, 134.1041f, 5.044002f },
- { -12248.24f, -1893.424f, 134.1182f, 5.270895f },
- { -12257.36f, -1897.663f, 133.1484f, 5.462881f },
- { -12265.84f, -1903.077f, 133.1649f, 5.654867f },
- { -12158.69f, -1972.707f, 133.8751f, 2.408554f },
- { -12178.82f, -1891.974f, 134.1786f, 3.944444f },
- { -12193.36f, -1890.039f, 135.1441f, 4.188790f },
- { -12275.59f, -1932.845f, 134.9017f, 0.174533f },
- { -12273.51f, -1941.539f, 136.1262f, 0.314159f },
- { -12247.02f, -1963.497f, 133.9476f, 0.872665f },
- { -12238.68f, -1969.574f, 133.6273f, 1.134464f },
- { -12192.78f, -1982.116f, 132.6966f, 1.919862f },
- { -12210.81f, -1979.316f, 133.8700f, 1.797689f },
- { -12283.51f, -1924.839f, 133.5170f, 0.069813f }
+ POINT_START_REVIVE = 1,
+
+ DATA_OHGANOT_SO_FAST = 5762,
+
+ FACTION_NONE = 1665
};
-Position const PosMandokir[2] =
+enum SummonGroups
{
- { -12167.8f, -1927.25f, 153.73f, 3.76991f },
- { -12197.86f, -1949.392f, 130.2745f, 0.0f }
+ SUMMON_GROUP_CHAINED_SPIRIT = 0
};
class boss_mandokir : public CreatureScript
{
- public: boss_mandokir() : CreatureScript("boss_mandokir") {}
+ public:
+
+ boss_mandokir() : CreatureScript("boss_mandokir") { }
struct boss_mandokirAI : public BossAI
{
@@ -114,115 +111,121 @@ class boss_mandokir : public CreatureScript
void Reset()
{
- if (me->GetPositionZ() > 140.0f)
- {
- _Reset();
- killCount = 0;
- me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC);
- events.ScheduleEvent(EVENT_CHECK_START, 1000);
- if (Creature* speaker = Creature::GetCreature(*me, instance->GetData64(NPC_VILEBRANCH_SPEAKER)))
- if (!speaker->IsAlive())
- speaker->Respawn(true);
- }
- summons.DespawnAll();
- me->Mount(MODEL_OHGAN_MOUNT);
- }
+ DoCastAOE(SPELL_SPIRIT_VENGEANCE_CANCEL);
- void JustDied(Unit* /*killer*/)
- {
- // Do not want to unsummon Ohgan
- for (int i = 0; i < CHAINED_SPIRT_COUNT; ++i)
- if (Creature* unsummon = Creature::GetCreature(*me, chainedSpirtGUIDs[i]))
- unsummon->DespawnOrUnsummon();
- instance->SetBossState(DATA_MANDOKIR, DONE);
- instance->SaveToDB();
+ _Reset();
+
+ me->SummonCreatureGroup(SUMMON_GROUP_CHAINED_SPIRIT);
+ _ohganotSoFast = true;
+ _reanimateOhganCooldown = false;
+ _reviveGUID = 0;
}
void EnterCombat(Unit* /*who*/)
{
_EnterCombat();
- events.ScheduleEvent(EVENT_OVERPOWER, urand(7000, 9000));
- events.ScheduleEvent(EVENT_MORTAL_STRIKE, urand(12000, 18000));
- events.ScheduleEvent(EVENT_WHIRLWIND, urand(24000, 30000));
- events.ScheduleEvent(EVENT_CHECK_OHGAN, 1000);
- events.ScheduleEvent(EVENT_WATCH_PLAYER, urand(13000, 15000));
- events.ScheduleEvent(EVENT_CHARGE_PLAYER, urand(33000, 38000));
- me->SetHomePosition(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation());
Talk(SAY_AGGRO);
- me->Dismount();
- // Summon Ohgan (Spell missing) TEMP HACK
- me->SummonCreature(NPC_OHGAN, me->GetPositionX()-3, me->GetPositionY(), me->GetPositionZ(), me->GetOrientation(), TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 35000);
- // Summon Chained Spirits
- for (int i = 0; i < CHAINED_SPIRT_COUNT; ++i)
+
+ DoCastAOE(SPELL_BLOODLORD_AURA);
+
+ if (!summons.empty())
{
- Creature* chainedSpirt = me->SummonCreature(NPC_CHAINED_SPIRT, PosSummonChainedSpirits[i], TEMPSUMMON_CORPSE_DESPAWN);
- chainedSpirtGUIDs[i] = chainedSpirt->GetGUID();
+ for (std::list<uint64>::const_iterator itr = summons.begin(); itr != summons.end(); ++itr)
+ {
+ if (Creature* chainedSpirit = ObjectAccessor::GetCreature(*me, *itr))
+ if (chainedSpirit->GetEntry() == NPC_CHAINED_SPIRIT && chainedSpirit->AI())
+ chainedSpirit->setFaction(FACTION_NONE);
+ }
}
- DoZoneInCombat();
+
+ events.ScheduleEvent(EVENT_DECAPITATE, 10000);
+ events.ScheduleEvent(EVENT_BLOODLETTING, 15000);
+ events.ScheduleEvent(EVENT_SUMMON_OHGAN, 20000);
+ events.ScheduleEvent(EVENT_DEVASTATING_SLAM, 25000);
}
- void KilledUnit(Unit* victim)
+ void JustDied(Unit* /*killer*/)
{
- if (victim->GetTypeId() != TYPEID_PLAYER)
- return;
+ DoCastAOE(SPELL_SPIRIT_VENGEANCE_CANCEL);
+ _JustDied();
+ Talk(SAY_DEATH);
+ }
- if (++killCount == 3)
+ void KilledUnit(Unit* victim)
+ {
+ if (victim->GetTypeId() == TYPEID_PLAYER)
{
- Talk(SAY_DING_KILL);
- if (Creature* jindo = Creature::GetCreature(*me, instance->GetData64(DATA_JINDO)))
- if (jindo->IsAlive())
- jindo->AI()->Talk(SAY_GRATS_JINDO);
- DoCast(me, SPELL_LEVEL_UP, true);
- killCount = 0;
+ Talk(SAY_PLAYER_KILL);
+ DoCast(SPELL_LEVEL_UP);
+ _reviveGUID = victim->GetGUID();
+ DoAction(ACTION_START_REVIVE);
}
}
- void MovementInform(uint32 type, uint32 id)
+ void DamageTaken(Unit* /*attacker*/, uint32& damage)
{
- if (type == WAYPOINT_MOTION_TYPE)
+ if (me->HealthBelowPctDamaged(20, damage) && !me->HasAura(SPELL_FRENZY))
{
- me->SetWalk(false);
- if (id == POINT_MANDOKIR_END)
- {
- me->SetHomePosition(PosMandokir[0]);
- instance->SetBossState(DATA_MANDOKIR, NOT_STARTED);
- me->DespawnOrUnsummon(6000); // No idea how to respawn on wipe.
- }
+ DoCast(me, SPELL_FRENZY, true);
+ Talk(SAY_FRENZY);
+ Talk(EMOTE_FRENZY);
}
}
- void UpdateAI(uint32 diff)
+ void DoAction(int32 action)
{
- events.Update(diff);
-
- if (!UpdateVictim())
+ switch (action)
{
- if (instance->GetBossState(DATA_MANDOKIR) == NOT_STARTED || instance->GetBossState(DATA_MANDOKIR) == SPECIAL)
+ case ACTION_OHGAN_IS_DEATH:
+ events.ScheduleEvent(EVENT_REANIMATE_OHGAN, 4000);
+ _ohganotSoFast = false;
+ break;
+ case ACTION_START_REVIVE:
{
- while (uint32 eventId = events.ExecuteEvent())
+ std::list<Creature*> creatures;
+ GetCreatureListWithEntryInGrid(creatures, me, NPC_CHAINED_SPIRIT, 200.0f);
+ creatures.remove_if(Trinity::AnyDeadUnitCheck());
+ creatures.remove_if(Trinity::UnitAuraCheck(true, SPELL_OHGAN_ORDERS_TRIGGER));
+ Trinity::Containers::RandomResizeList(creatures, 1);
+ if (creatures.empty())
+ return;
+
+ for (std::list<Creature*>::iterator itr = creatures.begin(); itr != creatures.end(); ++itr)
{
- switch (eventId)
+ if (Creature* chainedSpirit = ObjectAccessor::GetCreature(*me, (*itr)->GetGUID()))
{
- case EVENT_CHECK_START:
- if (instance->GetBossState(DATA_MANDOKIR) == SPECIAL)
- {
- me->GetMotionMaster()->MovePoint(0, PosMandokir[1].m_positionX, PosMandokir[1].m_positionY, PosMandokir[1].m_positionZ);
- events.ScheduleEvent(EVENT_STARTED, 6000);
- }
- else
- events.ScheduleEvent(EVENT_CHECK_START, 1000);
- break;
- case EVENT_STARTED:
- me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC);
- me->GetMotionMaster()->MovePath(PATH_MANDOKIR, false);
- break;
- default:
- break;
+ chainedSpirit->AI()->SetGUID(_reviveGUID);
+ chainedSpirit->AI()->DoAction(ACTION_REVIVE);
+ _reviveGUID = 0;
}
}
+ break;
}
- return;
+ default:
+ break;
+
}
+ }
+
+ uint32 GetData(uint32 type) const
+ {
+ if (type == DATA_OHGANOT_SO_FAST)
+ return _ohganotSoFast;
+
+ return 0;
+ }
+
+ void SetGUID(uint64 guid, int32 /*type = 0 */)
+ {
+ _reviveGUID = guid;
+ }
+
+ void UpdateAI(uint32 diff)
+ {
+ if (!UpdateVictim())
+ return;
+
+ events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
@@ -231,39 +234,40 @@ class boss_mandokir : public CreatureScript
{
switch (eventId)
{
- case EVENT_OVERPOWER:
- DoCastVictim(SPELL_OVERPOWER, true);
- events.ScheduleEvent(EVENT_OVERPOWER, urand(6000, 12000));
+ case EVENT_SUMMON_OHGAN:
+ me->SetUInt32Value(UNIT_FIELD_MOUNTDISPLAYID, 0);
+ DoCast(me, SPELL_SUMMON_OHGAN, true);
break;
- case EVENT_MORTAL_STRIKE:
- if (me->GetVictim() && me->GetVictim()->HealthBelowPct(50))
- DoCastVictim(SPELL_MORTAL_STRIKE, true);
- events.ScheduleEvent(EVENT_MORTAL_STRIKE, urand(12000, 18000));
+ case EVENT_DECAPITATE:
+ DoCastAOE(SPELL_DECAPITATE);
+ events.ScheduleEvent(EVENT_DECAPITATE, me->HasAura(SPELL_FRENZY) ? 17500 : 35000);
break;
- case EVENT_WHIRLWIND:
- DoCast(me, SPELL_WHIRLWIND);
- events.ScheduleEvent(EVENT_WHIRLWIND, urand(22000, 26000));
- break;
- case EVENT_CHECK_OHGAN:
- if (instance->GetBossState(DATA_OHGAN) == DONE)
+ case EVENT_BLOODLETTING:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true))
{
- DoCast(me, SPELL_FRENZY);
- Talk(SAY_OHGAN_DEAD);
+ DoCast(target, SPELL_BLOODLETTING, true);
+ me->ClearUnitState(UNIT_STATE_CASTING);
}
- else
- events.ScheduleEvent(EVENT_CHECK_OHGAN, 1000);
+ events.ScheduleEvent(EVENT_BLOODLETTING, 25000);
break;
- case EVENT_WATCH_PLAYER:
- if (Unit* player = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
+ case EVENT_REANIMATE_OHGAN:
+ if (_reanimateOhganCooldown)
+ events.ScheduleEvent(EVENT_REANIMATE_OHGAN, 1000);
+ else
{
- DoCast(player, SPELL_WATCH);
- Talk(SAY_WATCH, player->GetGUID());
+ DoCastAOE(SPELL_REANIMATE_OHGAN);
+ Talk(SAY_REANIMATE_OHGAN);
+ // Cooldown
+ _reanimateOhganCooldown = true;
+ events.ScheduleEvent(EVENT_REANIMATE_OHGAN_COOLDOWN, 20000);
}
- events.ScheduleEvent(EVENT_WATCH_PLAYER, urand(12000, 15000));
break;
- case EVENT_CHARGE_PLAYER:
- DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0, 40, true), SPELL_CHARGE);
- events.ScheduleEvent(EVENT_CHARGE_PLAYER, urand(22000, 30000));
+ case EVENT_REANIMATE_OHGAN_COOLDOWN:
+ _reanimateOhganCooldown = false;
+ break;
+ case EVENT_DEVASTATING_SLAM:
+ DoCastAOE(SPELL_DEVASTATING_SLAM_TRIGGER);
+ events.ScheduleEvent(EVENT_DEVASTATING_SLAM, 30000);
break;
default:
break;
@@ -274,8 +278,9 @@ class boss_mandokir : public CreatureScript
}
private:
- uint8 killCount;
- uint64 chainedSpirtGUIDs[CHAINED_SPIRT_COUNT];
+ bool _ohganotSoFast;
+ bool _reanimateOhganCooldown;
+ uint64 _reviveGUID;
};
CreatureAI* GetAI(Creature* creature) const
@@ -284,51 +289,58 @@ class boss_mandokir : public CreatureScript
}
};
-// Ohgan
-
-enum OhganSpells
-{
- SPELL_SUNDERARMOR = 24317
-};
-
class npc_ohgan : public CreatureScript
{
- public: npc_ohgan() : CreatureScript("npc_ohgan") {}
+ public:
+ npc_ohgan() : CreatureScript("npc_ohgan") { }
struct npc_ohganAI : public ScriptedAI
{
- npc_ohganAI(Creature* creature) : ScriptedAI(creature), instance(creature->GetInstanceScript()) { }
+ npc_ohganAI(Creature* creature) : ScriptedAI(creature)
+ {
+ _instance = me->GetInstanceScript();
+ }
- void Reset()
+ void EnterCombat(Unit* /*who*/)
{
- SunderArmor_Timer = 5000;
+ DoCastAOE(SPELL_OHGAN_ORDERS, true);
}
- void EnterCombat(Unit* /*who*/) {}
+ void DamageTaken(Unit* /*attacker*/, uint32& damage)
+ {
+ if (damage >= me->GetHealth())
+ {
+ damage = 0;
+ me->AttackStop();
+ me->SetHealth(0);
+ me->SetTarget(0);
+ DoCast(me, SPELL_CLEAR_ALL, true);
+ DoCast(me, SPELL_PERMANENT_FEIGN_DEATH);
+
+ if (Creature* mandokir = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_MANDOKIR)))
+ mandokir->AI()->DoAction(ACTION_OHGAN_IS_DEATH);
+ }
+ }
- void JustDied(Unit* /*killer*/)
+ void KilledUnit(Unit* victim)
{
- instance->SetBossState(DATA_OHGAN, DONE);
+ if (Creature* creature = victim->ToCreature())
+ {
+ if (creature->GetEntry() == NPC_CHAINED_SPIRIT)
+ DoCastAOE(SPELL_OHGAN_ORDERS, true);
+ }
}
- void UpdateAI(uint32 diff)
+ void UpdateAI(uint32 /*diff*/)
{
- // Return since we have no target
if (!UpdateVictim())
return;
- if (SunderArmor_Timer <= diff)
- {
- DoCastVictim(SPELL_SUNDERARMOR, true);
- SunderArmor_Timer = urand(10000, 15000);
- } else SunderArmor_Timer -= diff;
-
DoMeleeAttackIfReady();
}
private:
- uint32 SunderArmor_Timer;
- InstanceScript* instance;
+ InstanceScript* _instance;
};
CreatureAI* GetAI(Creature* creature) const
@@ -337,99 +349,428 @@ class npc_ohgan : public CreatureScript
}
};
-enum VilebranchSpells
-{
- SPELL_DEMORALIZING_SHOUT = 13730,
- SPELL_CLEAVE = 15284
-};
-
-class npc_vilebranch_speaker : public CreatureScript
+class npc_chained_spirit : public CreatureScript
{
- public: npc_vilebranch_speaker() : CreatureScript("npc_vilebranch_speaker") {}
+ public:
+ npc_chained_spirit() : CreatureScript("npc_chained_spirit") { }
- struct npc_vilebranch_speakerAI : public ScriptedAI
+ struct npc_chained_spiritAI : public ScriptedAI
{
- npc_vilebranch_speakerAI(Creature* creature) : ScriptedAI(creature), instance(creature->GetInstanceScript()) { }
+ npc_chained_spiritAI(Creature* creature) : ScriptedAI(creature)
+ {
+ _instance = me->GetInstanceScript();
+ me->AddUnitMovementFlag(MOVEMENTFLAG_HOVER);
+ me->SetReactState(REACT_PASSIVE); // correct?
+ }
void Reset()
{
- demoralizing_Shout_Timer = urand (2000, 4000);
- cleave_Timer = urand (5000, 8000);
+ _revivePlayerGUID = 0;
}
- void EnterCombat(Unit* /*who*/) {}
+ void SetGUID(uint64 guid, int32 /*type = 0 */)
+ {
+ _revivePlayerGUID = guid;
+ }
- void JustDied(Unit* /*killer*/)
+ void DoAction(int32 action)
{
- instance->SetBossState(DATA_MANDOKIR, SPECIAL);
+ if (action == ACTION_REVIVE)
+ {
+ Position pos;
+ if (Player* target = ObjectAccessor::GetPlayer(*me, _revivePlayerGUID))
+ {
+ target->GetNearPoint(me, pos.m_positionX, pos.m_positionY, pos.m_positionZ, 0.0f, 5.0f, target->GetAngle(me));
+ me->GetMotionMaster()->MovePoint(POINT_START_REVIVE, pos);
+ }
+ }
}
- void UpdateAI(uint32 diff)
+ void MovementInform(uint32 type, uint32 pointId)
{
- // Return since we have no target
- if (!UpdateVictim())
+ if (type != POINT_MOTION_TYPE || !_revivePlayerGUID)
return;
- if (demoralizing_Shout_Timer <= diff)
+ if (pointId == POINT_START_REVIVE)
{
- DoCast(me, SPELL_DEMORALIZING_SHOUT);
- demoralizing_Shout_Timer = urand(22000, 30000);
- } else demoralizing_Shout_Timer -= diff;
+ if (Player* target = ObjectAccessor::GetPlayer(*me, _revivePlayerGUID))
+ DoCast(target, SPELL_REVIVE);
+
+ me->DespawnOrUnsummon(2000);
+ }
+ }
+
+ void JustDied(Unit* /*killer*/)
+ {
+ Player* target = ObjectAccessor::GetPlayer(*me, _revivePlayerGUID);
+ if (!target || target->IsAlive())
+ return;
- if (cleave_Timer <= diff)
+ if (Creature* mandokir = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_MANDOKIR)))
{
- DoCastVictim(SPELL_CLEAVE, true);
- cleave_Timer = urand(6000, 9000);
- } else cleave_Timer -= diff;
+ mandokir->GetAI()->SetGUID(target->GetGUID());
+ mandokir->GetAI()->DoAction(ACTION_START_REVIVE);
+ }
- DoMeleeAttackIfReady();
+ me->DespawnOrUnsummon();
}
+ void UpdateAI(uint32 /*diff*/) { }
+
private:
- uint32 demoralizing_Shout_Timer;
- uint32 cleave_Timer;
- InstanceScript* instance;
+ InstanceScript* _instance;
+ uint64 _revivePlayerGUID;
};
CreatureAI* GetAI(Creature* creature) const
{
- return new npc_vilebranch_speakerAI(creature);
+ return GetZulGurubAI<npc_chained_spiritAI>(creature);
+ }
+};
+
+class spell_mandokir_decapitate : public SpellScriptLoader
+{
+ public:
+ spell_mandokir_decapitate() : SpellScriptLoader("spell_mandokir_decapitate") { }
+
+ class spell_mandokir_decapitate_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_mandokir_decapitate_SpellScript);
+
+ void FilterTargets(std::list<WorldObject*>& targets)
+ {
+ if (targets.empty())
+ return;
+
+ WorldObject* target = Trinity::Containers::SelectRandomContainerElement(targets);
+ targets.clear();
+ targets.push_back(target);
+ }
+
+ void HandleScript(SpellEffIndex /*effIndex*/)
+ {
+ Unit* caster = GetCaster();
+ if (Player* target = GetHitPlayer())
+ caster->CastSpell(target, uint32(GetEffectValue()), true);
+ }
+
+ void Register()
+ {
+ OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_mandokir_decapitate_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY);
+ OnEffectHitTarget += SpellEffectFn(spell_mandokir_decapitate_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_DUMMY);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_mandokir_decapitate_SpellScript();
+ }
+};
+
+class spell_mandokir_bloodletting : public SpellScriptLoader
+{
+ public:
+ spell_mandokir_bloodletting() : SpellScriptLoader("spell_mandokir_bloodletting") { }
+
+ class spell_mandokir_bloodletting_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_mandokir_bloodletting_AuraScript);
+
+ bool Validate(SpellInfo const* /*spell*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_BLOODLETTING_DAMAGE))
+ return false;
+ if (!sSpellMgr->GetSpellInfo(SPELL_BLOODLETTING_HEAL))
+ return false;
+ return true;
+ }
+
+ void HandleEffectPeriodic(AuraEffect const* aurEff)
+ {
+ Unit* target = GetTarget();
+ Unit* caster = GetCaster();
+ if (!caster)
+ return;
+
+ int32 damage = std::max<int32>(7500, target->CountPctFromCurHealth(aurEff->GetAmount()));
+
+ caster->CastCustomSpell(target, SPELL_BLOODLETTING_DAMAGE, &damage, 0, 0, true);
+ target->CastCustomSpell(caster, SPELL_BLOODLETTING_HEAL, &damage, 0, 0, true);
+ }
+
+ void Register()
+ {
+ OnEffectPeriodic += AuraEffectPeriodicFn(spell_mandokir_bloodletting_AuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_mandokir_bloodletting_AuraScript();
+ }
+};
+
+class spell_mandokir_spirit_vengeance_cancel : public SpellScriptLoader
+{
+ public:
+ spell_mandokir_spirit_vengeance_cancel() : SpellScriptLoader("spell_mandokir_spirit_vengeance_cancel") { }
+
+ class spell_mandokir_spirit_vengeance_cancel_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_mandokir_spirit_vengeance_cancel_SpellScript);
+
+ void HandleScript(SpellEffIndex /*effIndex*/)
+ {
+ if (Player* target = GetHitPlayer())
+ target->RemoveAura(uint32(GetEffectValue()));
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_mandokir_spirit_vengeance_cancel_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ OnEffectHitTarget += SpellEffectFn(spell_mandokir_spirit_vengeance_cancel_SpellScript::HandleScript, EFFECT_1, SPELL_EFFECT_DUMMY);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_mandokir_spirit_vengeance_cancel_SpellScript();
+ }
+};
+
+class DevastatingSlamTargetSelector : public std::unary_function<Unit *, bool>
+{
+ public:
+ DevastatingSlamTargetSelector(Creature* me, const Unit* victim) : _me(me), _victim(victim) {}
+
+ bool operator() (WorldObject* target)
+ {
+ if (target == _victim && _me->getThreatManager().getThreatList().size() > 1)
+ return true;
+
+ if (target->GetTypeId() != TYPEID_PLAYER)
+ return true;
+
+ return false;
+ }
+
+ Creature* _me;
+ Unit const* _victim;
+};
+
+class spell_mandokir_devastating_slam : public SpellScriptLoader
+{
+ public:
+ spell_mandokir_devastating_slam() : SpellScriptLoader("spell_mandokir_devastating_slam") { }
+
+ class spell_mandokir_devastating_slam_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_mandokir_devastating_slam_SpellScript);
+
+ void FilterTargets(std::list<WorldObject*>& targets)
+ {
+ targets.remove_if(DevastatingSlamTargetSelector(GetCaster()->ToCreature(), GetCaster()->GetVictim()));
+ if (targets.empty())
+ return;
+
+ WorldObject* target = Trinity::Containers::SelectRandomContainerElement(targets);
+ targets.clear();
+ targets.push_back(target);
+ }
+
+ void HandleScript(SpellEffIndex /*effIndex*/)
+ {
+ Unit* caster = GetCaster();
+ float angle = 0.0f;
+ float x, y, z;
+
+ if (Player* target = GetHitPlayer())
+ {
+ caster->AttackStop();
+ caster->SetOrientation(caster->GetAngle(target));
+ caster->SetFacingTo(caster->GetAngle(target));
+
+ caster->CastSpell(caster, SPELL_DEVASTATING_SLAM, false);
+
+ // HACK: Need better way for pos calculation
+ for (uint8 i = 0; i <= 50; ++i)
+ {
+ angle = float(rand_norm()) * static_cast<float>(M_PI * 35.0f / 180.0f) - static_cast<float>(M_PI * 17.5f / 180.0f);
+ caster->GetClosePoint(x, y, z, 4.0f, frand(-2.5f, 50.0f), angle);
+
+ caster->CastSpell(x, y, z, SPELL_DEVASTATING_SLAM_DAMAGE, true);
+ }
+ }
+ }
+
+ void Register()
+ {
+ OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_mandokir_devastating_slam_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY);
+ OnEffectHitTarget += SpellEffectFn(spell_mandokir_devastating_slam_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_FORCE_CAST);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_mandokir_devastating_slam_SpellScript();
}
};
-class spell_threatening_gaze : public SpellScriptLoader
+class spell_mandokir_ohgan_orders : public SpellScriptLoader
{
public:
- spell_threatening_gaze() : SpellScriptLoader("spell_threatening_gaze") { }
+ spell_mandokir_ohgan_orders() : SpellScriptLoader("spell_mandokir_ohgan_orders") { }
- class spell_threatening_gaze_AuraScript : public AuraScript
+ class spell_mandokir_ohgan_orders_SpellScript : public SpellScript
{
- PrepareAuraScript(spell_threatening_gaze_AuraScript);
+ PrepareSpellScript(spell_mandokir_ohgan_orders_SpellScript);
- void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ void FilterTargets(std::list<WorldObject*>& targets)
{
+ if (targets.empty())
+ return;
+
+ WorldObject* target = Trinity::Containers::SelectRandomContainerElement(targets);
+ targets.clear();
+ targets.push_back(target);
+ }
+
+ void HandleScript(SpellEffIndex /*effIndex*/)
+ {
+ Unit* caster = GetCaster();
+ if (Unit* target = GetHitUnit())
+ caster->CastSpell(target, uint32(GetEffectValue()), true);
+ }
+
+ void Register()
+ {
+ OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_mandokir_ohgan_orders_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY);
+ OnEffectHitTarget += SpellEffectFn(spell_mandokir_ohgan_orders_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_DUMMY);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_mandokir_ohgan_orders_SpellScript();
+ }
+};
+
+class spell_mandokir_ohgan_orders_trigger : public SpellScriptLoader
+{
+ public:
+ spell_mandokir_ohgan_orders_trigger() : SpellScriptLoader("spell_mandokir_ohgan_orders_trigger") { }
+
+ class spell_mandokir_ohgan_orders_trigger_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_mandokir_ohgan_orders_trigger_AuraScript);
+
+ void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ {
+ Unit* target = GetTarget();
if (Unit* caster = GetCaster())
- if (Unit* target = GetTarget())
- if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE && GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_DEATH)
- caster->CastSpell(target, SPELL_WATCH_CHARGE);
+ {
+ // HACK: research better way
+ caster->ClearUnitState(UNIT_STATE_CASTING);
+ caster->GetMotionMaster()->Clear();
+ caster->DeleteThreatList();
+ caster->AddThreat(target, 50000000.0f);
+ caster->TauntApply(target);
+ }
}
void Register()
{
- OnEffectRemove += AuraEffectRemoveFn(spell_threatening_gaze_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
+ AfterEffectApply += AuraEffectApplyFn(spell_mandokir_ohgan_orders_trigger_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
}
};
AuraScript* GetAuraScript() const
{
- return new spell_threatening_gaze_AuraScript();
+ return new spell_mandokir_ohgan_orders_trigger_AuraScript();
+ }
+};
+
+class spell_mandokir_reanimate_ohgan : public SpellScriptLoader
+{
+ public:
+ spell_mandokir_reanimate_ohgan() : SpellScriptLoader("spell_mandokir_reanimate_ohgan") { }
+
+ class spell_mandokir_reanimate_ohgan_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_mandokir_reanimate_ohgan_SpellScript);
+
+ void HandleScript(SpellEffIndex /*effIndex*/)
+ {
+ if (Unit* target = GetHitUnit())
+ {
+ target->RemoveAura(SPELL_PERMANENT_FEIGN_DEATH);
+ target->CastSpell(target, SPELL_OHGAN_HEART_VISUAL, true);
+ target->CastSpell((Unit*)NULL, SPELL_OHGAN_ORDERS, true);
+ }
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_mandokir_reanimate_ohgan_SpellScript::HandleScript, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_mandokir_reanimate_ohgan_SpellScript();
}
};
+class spell_clear_all : public SpellScriptLoader
+{
+ public:
+ spell_clear_all() : SpellScriptLoader("spell_clear_all") { }
+
+ class spell_clear_all_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_clear_all_SpellScript);
+
+ void HandleScript(SpellEffIndex /*effIndex*/)
+ {
+ Unit* caster = GetCaster();
+ caster->RemoveAllAurasOnDeath();
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_clear_all_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_clear_all_SpellScript();
+ }
+};
+
+class achievement_ohganot_so_fast : public AchievementCriteriaScript
+{
+ public:
+ achievement_ohganot_so_fast() : AchievementCriteriaScript("achievement_ohganot_so_fast") { }
+
+ bool OnCheck(Player* /*player*/, Unit* target)
+ {
+ return target && target->GetAI()->GetData(DATA_OHGANOT_SO_FAST);
+ }
+};
+
void AddSC_boss_mandokir()
{
new boss_mandokir();
new npc_ohgan();
- new npc_vilebranch_speaker();
- new spell_threatening_gaze();
+ new npc_chained_spirit();
+ new spell_mandokir_decapitate();
+ new spell_mandokir_bloodletting();
+ new spell_mandokir_spirit_vengeance_cancel();
+ new spell_mandokir_devastating_slam();
+ new spell_mandokir_ohgan_orders();
+ new spell_mandokir_ohgan_orders_trigger();
+ new spell_mandokir_reanimate_ohgan();
+ new spell_clear_all();
+ new achievement_ohganot_so_fast();
}
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp
deleted file mode 100644
index 3fd46bd644e..00000000000
--- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp
+++ /dev/null
@@ -1,266 +0,0 @@
-/*
- * Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
- * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
- *
- * 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, see <http://www.gnu.org/licenses/>.
- */
-
-/* ScriptData
-SDName: Boss_Marli
-SD%Complete: 80
-SDComment: Charging healers and casters not working. Perhaps wrong Spell Timers.
-SDCategory: Zul'Gurub
-EndScriptData */
-
-#include "ScriptMgr.h"
-#include "ScriptedCreature.h"
-#include "zulgurub.h"
-
-enum Says
-{
- SAY_AGGRO = 0,
- SAY_TRANSFORM = 1,
- SAY_SPIDER_SPAWN = 2,
- SAY_DEATH = 3
-};
-
-enum Spells
-{
- SPELL_CHARGE = 22911,
- SPELL_ASPECT_OF_MARLI = 24686, // A stun spell
- SPELL_ENVOLWINGWEB = 24110,
- SPELL_POISON_VOLLEY = 24099,
- SPELL_SPIDER_FORM = 24084,
- // The Spider Spell
- SPELL_LEVELUP = 24312 // Not right Spell.
-};
-
-enum Events
-{
- EVENT_SPAWN_START_SPIDERS = 1, // Phase 1
- EVENT_POISON_VOLLEY = 2, // Phase All
- EVENT_SPAWN_SPIDER = 3, // Phase All
- EVENT_CHARGE_PLAYER = 4, // Phase 3
- EVENT_ASPECT_OF_MARLI = 5, // Phase 2
- EVENT_TRANSFORM = 6, // Phase 2
- EVENT_TRANSFORM_BACK = 7 // Phase 3
-};
-
-enum Phases
-{
- PHASE_ONE = 1,
- PHASE_TWO = 2,
- PHASE_THREE = 3
-};
-
-enum ModelId
-{
- MODEL_MARLI = 15220
-};
-
-class boss_marli : public CreatureScript
-{
- public: boss_marli() : CreatureScript("boss_marli") {}
-
- struct boss_marliAI : public BossAI
- {
- boss_marliAI(Creature* creature) : BossAI(creature, DATA_MARLI) {}
-
- void Reset()
- {
- _Reset();
- }
-
- void JustDied(Unit* /*killer*/)
- {
- _JustDied();
- Talk(SAY_DEATH);
- }
-
- void EnterCombat(Unit* /*who*/)
- {
- _EnterCombat();
- events.ScheduleEvent(EVENT_SPAWN_START_SPIDERS, 1000, 0, PHASE_ONE);
- Talk(SAY_AGGRO);
- }
-
- void UpdateAI(uint32 diff)
- {
- if (!UpdateVictim())
- return;
-
- events.Update(diff);
-
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
-
- while (uint32 eventId = events.ExecuteEvent())
- {
- switch (eventId)
- {
- case EVENT_SPAWN_START_SPIDERS:
-
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
- {
- Talk(SAY_SPIDER_SPAWN);
- Creature* Spider = NULL;
- Spider = me->SummonCreature(15041, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
- if (Spider)
- Spider->AI()->AttackStart(target);
- Spider = me->SummonCreature(15041, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
- if (Spider)
- Spider->AI()->AttackStart(target);
- Spider = me->SummonCreature(15041, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
- if (Spider)
- Spider->AI()->AttackStart(target);
- Spider = me->SummonCreature(15041, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
- if (Spider)
- Spider->AI()->AttackStart(target);
- }
- events.ScheduleEvent(EVENT_ASPECT_OF_MARLI, 12000, 0, PHASE_TWO);
- events.ScheduleEvent(EVENT_TRANSFORM, 45000, 0, PHASE_TWO);
- events.ScheduleEvent(EVENT_POISON_VOLLEY, 15000);
- events.ScheduleEvent(EVENT_SPAWN_SPIDER, 30000);
- events.ScheduleEvent(EVENT_TRANSFORM, 45000, 0, PHASE_TWO);
- events.SetPhase(PHASE_TWO);
- break;
- case EVENT_POISON_VOLLEY:
- DoCastVictim(SPELL_POISON_VOLLEY, true);
- events.ScheduleEvent(EVENT_POISON_VOLLEY, urand(10000, 20000));
- break;
- case EVENT_ASPECT_OF_MARLI:
- DoCastVictim(SPELL_ASPECT_OF_MARLI, true);
- events.ScheduleEvent(EVENT_ASPECT_OF_MARLI, urand(13000, 18000), 0, PHASE_TWO);
- break;
- case EVENT_SPAWN_SPIDER:
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
- {
- Creature* Spider = me->SummonCreature(15041, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
- if (Spider)
- Spider->AI()->AttackStart(target);
- }
- events.ScheduleEvent(EVENT_SPAWN_SPIDER, urand(12000, 17000));
- break;
- case EVENT_TRANSFORM:
- {
- Talk(SAY_TRANSFORM);
- DoCast(me, SPELL_SPIDER_FORM);
- CreatureTemplate const* cinfo = me->GetCreatureTemplate();
- me->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, (cinfo->mindmg +((cinfo->mindmg/100) * 35)));
- me->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, (cinfo->maxdmg +((cinfo->maxdmg/100) * 35)));
- me->UpdateDamagePhysical(BASE_ATTACK);
- DoCastVictim(SPELL_ENVOLWINGWEB);
- if (DoGetThreat(me->GetVictim()))
- DoModifyThreatPercent(me->GetVictim(), -100);
- events.ScheduleEvent(EVENT_CHARGE_PLAYER, 1500, 0, PHASE_THREE);
- events.ScheduleEvent(EVENT_TRANSFORM_BACK, 25000, 0, PHASE_THREE);
- events.SetPhase(PHASE_THREE);
- break;
- }
- case EVENT_CHARGE_PLAYER:
- {
- Unit* target = NULL;
- int i = 0;
- while (i++ < 3) // max 3 tries to get a random target with power_mana
- {
- target = SelectTarget(SELECT_TARGET_RANDOM, 1, 100, true); // not aggro leader
- if (target && target->getPowerType() == POWER_MANA)
- break;
- }
- if (target)
- {
- DoCast(target, SPELL_CHARGE);
- AttackStart(target);
- }
- events.ScheduleEvent(EVENT_CHARGE_PLAYER, 8000, 0, PHASE_THREE);
- break;
- }
- case EVENT_TRANSFORM_BACK:
- {
- me->SetDisplayId(MODEL_MARLI);
- CreatureTemplate const* cinfo = me->GetCreatureTemplate();
- me->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, (cinfo->mindmg +((cinfo->mindmg/100) * 1)));
- me->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, (cinfo->maxdmg +((cinfo->maxdmg/100) * 1)));
- me->UpdateDamagePhysical(BASE_ATTACK);
- events.ScheduleEvent(EVENT_ASPECT_OF_MARLI, 12000, 0, PHASE_TWO);
- events.ScheduleEvent(EVENT_TRANSFORM, 45000, 0, PHASE_TWO);
- events.ScheduleEvent(EVENT_POISON_VOLLEY, 15000);
- events.ScheduleEvent(EVENT_SPAWN_SPIDER, 30000);
- events.ScheduleEvent(EVENT_TRANSFORM, urand(35000, 60000), 0, PHASE_TWO);
- events.SetPhase(PHASE_TWO);
- break;
- }
- default:
- break;
- }
- }
-
- DoMeleeAttackIfReady();
- }
- };
-
- CreatureAI* GetAI(Creature* creature) const
- {
- return new boss_marliAI(creature);
- }
-};
-
-// Spawn of Marli
-class npc_spawn_of_marli : public CreatureScript
-{
- public: npc_spawn_of_marli() : CreatureScript("npc_spawn_of_marli") {}
-
- struct npc_spawn_of_marliAI : public ScriptedAI
- {
- npc_spawn_of_marliAI(Creature* creature) : ScriptedAI(creature) {}
-
- uint32 LevelUp_Timer;
-
- void Reset()
- {
- LevelUp_Timer = 3000;
- }
-
- void EnterCombat(Unit* /*who*/)
- {
- }
-
- void UpdateAI(uint32 diff)
- {
- //Return since we have no target
- if (!UpdateVictim())
- return;
-
- //LevelUp_Timer
- if (LevelUp_Timer <= diff)
- {
- DoCast(me, SPELL_LEVELUP);
- LevelUp_Timer = 3000;
- } else LevelUp_Timer -= diff;
-
- DoMeleeAttackIfReady();
- }
- };
-
- CreatureAI* GetAI(Creature* creature) const
- {
- return new npc_spawn_of_marliAI(creature);
- }
-};
-
-void AddSC_boss_marli()
-{
- new boss_marli();
- new npc_spawn_of_marli();
-}
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_renataki.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_renataki.cpp
index 8b526c7ad82..e444f2f1c39 100644
--- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_renataki.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_renataki.cpp
@@ -16,66 +16,44 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/* ScriptData
-SDName: Boss_Renataki
-SD%Complete: 100
-SDComment:
-SDCategory: Zul'Gurub
-EndScriptData */
-
+#include "ObjectMgr.h"
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "zulgurub.h"
+enum Yells
+{
+};
+
enum Spells
{
- SPELL_AMBUSH = 34794,
- SPELL_THOUSANDBLADES = 34799
};
-enum Misc
+enum Events
{
- EQUIP_ID_MAIN_HAND = 0 //was item display id 31818, but this id does not exist
};
class boss_renataki : public CreatureScript
{
- public: boss_renataki() : CreatureScript("boss_renataki") {}
+ public:
+ boss_renataki() : CreatureScript("boss_renataki") { }
struct boss_renatakiAI : public BossAI
{
- boss_renatakiAI(Creature* creature) : BossAI(creature, DATA_EDGE_OF_MADNESS) {}
-
- uint32 Invisible_Timer;
- uint32 Ambush_Timer;
- uint32 Visible_Timer;
- uint32 Aggro_Timer;
- uint32 ThousandBlades_Timer;
-
- bool Invisible;
- bool Ambushed;
+ boss_renatakiAI(Creature* creature) : BossAI(creature, DATA_RENATAKI)
+ {
+ }
void Reset()
{
- _Reset();
- Invisible_Timer = urand(8000, 18000);
- Ambush_Timer = 3000;
- Visible_Timer = 4000;
- Aggro_Timer = urand(15000, 25000);
- ThousandBlades_Timer = urand(4000, 8000);
-
- Invisible = false;
- Ambushed = false;
}
- void JustDied(Unit* /*killer*/)
+ void EnterCombat(Unit* /*who*/)
{
- _JustDied();
}
- void EnterCombat(Unit* /*who*/)
+ void JustDied(Unit* /*killer*/)
{
- _EnterCombat();
}
void UpdateAI(uint32 diff)
@@ -83,76 +61,20 @@ class boss_renataki : public CreatureScript
if (!UpdateVictim())
return;
- //Invisible_Timer
- if (Invisible_Timer <= diff)
- {
- me->InterruptSpell(CURRENT_GENERIC_SPELL);
-
- SetEquipmentSlots(false, EQUIP_UNEQUIP, EQUIP_NO_CHANGE, EQUIP_NO_CHANGE);
- me->SetDisplayId(11686);
-
- me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- Invisible = true;
-
- Invisible_Timer = urand(15000, 30000);
- } else Invisible_Timer -= diff;
-
- if (Invisible)
- {
- if (Ambush_Timer <= diff)
- {
- Unit* target = NULL;
- target = SelectTarget(SELECT_TARGET_RANDOM, 0);
- if (target)
- {
- DoTeleportTo(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ());
- DoCast(target, SPELL_AMBUSH);
- }
-
- Ambushed = true;
- Ambush_Timer = 3000;
- } else Ambush_Timer -= diff;
- }
-
- if (Ambushed)
- {
- if (Visible_Timer <= diff)
- {
- me->InterruptSpell(CURRENT_GENERIC_SPELL);
-
- me->SetDisplayId(15268);
- SetEquipmentSlots(false, EQUIP_ID_MAIN_HAND, EQUIP_NO_CHANGE, EQUIP_NO_CHANGE);
-
- me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- Invisible = false;
+ events.Update(diff);
- Visible_Timer = 4000;
- } else Visible_Timer -= diff;
- }
-
- //Resetting some aggro so he attacks other gamers
- if (!Invisible)
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+ /*
+ while (uint32 eventId = events.ExecuteEvent())
{
- if (Aggro_Timer <= diff)
+ switch (eventId)
{
- Unit* target = NULL;
- target = SelectTarget(SELECT_TARGET_RANDOM, 1);
-
- if (DoGetThreat(me->GetVictim()))
- DoModifyThreatPercent(me->GetVictim(), -50);
-
- if (target)
- AttackStart(target);
-
- Aggro_Timer = urand(7000, 20000);
- } else Aggro_Timer -= diff;
-
- if (ThousandBlades_Timer <= diff)
- {
- DoCastVictim(SPELL_THOUSANDBLADES);
- ThousandBlades_Timer = urand(7000, 12000);
- } else ThousandBlades_Timer -= diff;
+ default:
+ break;
+ }
}
+ */
DoMeleeAttackIfReady();
}
@@ -168,4 +90,3 @@ void AddSC_boss_renataki()
{
new boss_renataki();
}
-
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_thekal.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_thekal.cpp
deleted file mode 100644
index 60d553d4a8e..00000000000
--- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_thekal.cpp
+++ /dev/null
@@ -1,571 +0,0 @@
-/*
- * Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
- * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
- *
- * 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, see <http://www.gnu.org/licenses/>.
- */
-
-/* ScriptData
-SDName: Boss_Thekal
-SD%Complete: 95
-SDComment: Almost finished.
-SDCategory: Zul'Gurub
-EndScriptData */
-
-#include "ScriptMgr.h"
-#include "ScriptedCreature.h"
-#include "zulgurub.h"
-
-enum Says
-{
- SAY_AGGRO = 0,
- SAY_DEATH = 1
-};
-
-enum Spells
-{
- SPELL_MORTALCLEAVE = 22859, // Phase 1
- SPELL_SILENCE = 22666, // Phase 1
- SPELL_TIGER_FORM = 24169, // Phase 1
- SPELL_RESURRECT = 24173, // Phase 1 // Not used in script.
- SPELL_FRENZY = 8269, // Phase 2
- SPELL_FORCEPUNCH = 24189, // Phase 2
- SPELL_CHARGE = 24193, // Phase 2
- SPELL_ENRAGE = 8269, // Phase 2
- SPELL_SUMMONTIGERS = 24183, // Phase 2
- // Zealot Lor'Khan Spells
- SPELL_SHIELD = 20545,
- SPELL_BLOODLUST = 24185,
- SPELL_GREATERHEAL = 24208,
- SPELL_DISARM = 6713,
- // Zealot Zath Spells
- SPELL_SWEEPINGSTRIKES = 18765,
- SPELL_SINISTERSTRIKE = 15581,
- SPELL_GOUGE = 12540,
- SPELL_KICK = 15614,
- SPELL_BLIND = 21060
-};
-
-enum Events
-{
- EVENT_MORTALCLEAVE = 1, // Phase 1
- EVENT_SILENCE = 2, // Phase 1
- EVENT_CHECK_TIMER = 3, // Phase 1
- EVENT_RESURRECT_TIMER = 4, // Phase 1
- EVENT_FRENZY = 5, // Phase 2
- EVENT_FORCEPUNCH = 6, // Phase 2
- EVENT_SPELL_CHARGE = 7, // Phase 2
- EVENT_ENRAGE = 8, // Phase 2
- EVENT_SUMMONTIGERS = 9 // Phase 2
-};
-
-enum Phases
-{
- PHASE_ONE = 1,
- PHASE_TWO = 2
-};
-
-class boss_thekal : public CreatureScript
-{
- public: boss_thekal() : CreatureScript("boss_thekal") {}
-
- struct boss_thekalAI : public BossAI
- {
- boss_thekalAI(Creature* creature) : BossAI(creature, DATA_THEKAL) {}
-
- bool Enraged;
- bool WasDead;
-
- void Reset()
- {
- _Reset();
- Enraged = false;
- WasDead = false;
- }
-
- void JustDied(Unit* /*killer*/)
- {
- _JustDied();
- Talk(SAY_DEATH);
- }
-
- void EnterCombat(Unit* /*who*/)
- {
- _EnterCombat();
- events.ScheduleEvent(EVENT_MORTALCLEAVE, 4000, 0, PHASE_ONE); // Phase 1
- events.ScheduleEvent(EVENT_SILENCE, 9000, 0, PHASE_ONE); // Phase 1
- events.ScheduleEvent(EVENT_CHECK_TIMER, 10000, 0, PHASE_ONE); // Phase 1
- events.ScheduleEvent(EVENT_RESURRECT_TIMER, 10000, 0, PHASE_ONE); // Phase 1
- Talk(SAY_AGGRO);
- }
-
- void JustReachedHome()
- {
- if (instance)
- instance->SetBossState(DATA_THEKAL, NOT_STARTED);
- }
-
- void UpdateAI(uint32 diff)
- {
- if (!UpdateVictim())
- return;
-
- events.Update(diff);
-
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
-
- while (uint32 eventId = events.ExecuteEvent())
- {
- switch (eventId)
- {
- case EVENT_MORTALCLEAVE:
- DoCastVictim(SPELL_MORTALCLEAVE, true);
- events.ScheduleEvent(EVENT_MORTALCLEAVE, urand(15000, 20000), 0, PHASE_ONE);
- break;
- case EVENT_SILENCE:
- DoCastVictim(SPELL_SILENCE, true);
- events.ScheduleEvent(EVENT_SILENCE, urand(20000, 25000), 0, PHASE_ONE);
- break;
- case EVENT_RESURRECT_TIMER:
- //Thekal will transform to Tiger if he died and was not resurrected after 10 seconds.
- if (WasDead)
- {
- DoCast(me, SPELL_TIGER_FORM);
- me->SetObjectScale(2.00f);
- me->SetStandState(UNIT_STAND_STATE_STAND);
- me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- me->SetFullHealth();
- const CreatureTemplate* cinfo = me->GetCreatureTemplate();
- me->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, (cinfo->mindmg +((cinfo->mindmg/100) * 40)));
- me->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, (cinfo->maxdmg +((cinfo->maxdmg/100) * 40)));
- me->UpdateDamagePhysical(BASE_ATTACK);
- DoResetThreat();
- events.ScheduleEvent(EVENT_FRENZY, 30000, 0, PHASE_TWO); // Phase 2
- events.ScheduleEvent(EVENT_FORCEPUNCH, 4000, 0, PHASE_TWO); // Phase 2
- events.ScheduleEvent(EVENT_SPELL_CHARGE, 12000, 0, PHASE_TWO); // Phase 2
- events.ScheduleEvent(EVENT_ENRAGE, 32000, 0, PHASE_TWO); // Phase 2
- events.ScheduleEvent(EVENT_SUMMONTIGERS, 25000, 0, PHASE_TWO); // Phase 2
- events.SetPhase(PHASE_TWO);
- }
- events.ScheduleEvent(EVENT_RESURRECT_TIMER, 10000, 0, PHASE_ONE);
- break;
- case EVENT_CHECK_TIMER:
- //Check_Timer for the death of LorKhan and Zath.
- if (!WasDead)
- {
- if (instance)
- {
- if (instance->GetBossState(DATA_LORKHAN) == SPECIAL)
- {
- //Resurrect LorKhan
- if (Unit* pLorKhan = Unit::GetUnit(*me, instance->GetData64(DATA_LORKHAN)))
- {
- pLorKhan->SetUInt32Value(UNIT_FIELD_BYTES_1, 0);
- pLorKhan->setFaction(14);
- pLorKhan->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- pLorKhan->SetFullHealth();
- instance->SetData(DATA_LORKHAN, DONE);
- }
- }
-
- if (instance->GetBossState(DATA_ZATH) == SPECIAL)
- {
- //Resurrect Zath
- if (Unit* pZath = Unit::GetUnit(*me, instance->GetData64(DATA_ZATH)))
- {
- pZath->SetUInt32Value(UNIT_FIELD_BYTES_1, 0);
- pZath->setFaction(14);
- pZath->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- pZath->SetFullHealth();
- instance->SetBossState(DATA_ZATH, DONE);
- }
- }
- }
- }
- events.ScheduleEvent(EVENT_CHECK_TIMER, 5000, 0, PHASE_ONE);
- break;
- case EVENT_FRENZY:
- DoCast(me, SPELL_FRENZY);
- events.ScheduleEvent(EVENT_FRENZY, 30000, 0, PHASE_TWO);
- break;
- case EVENT_FORCEPUNCH:
- DoCastVictim(SPELL_FORCEPUNCH, true);
- events.ScheduleEvent(EVENT_FORCEPUNCH, urand(16000, 21000), 0, PHASE_TWO);
- break;
- case EVENT_CHARGE:
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
- {
- DoCast(target, SPELL_CHARGE);
- DoResetThreat();
- AttackStart(target);
- }
- events.ScheduleEvent(EVENT_CHARGE, urand(15000, 22000), 0, PHASE_TWO);
- break;
- case EVENT_ENRAGE:
- if (HealthBelowPct(11) && !Enraged)
- {
- DoCast(me, SPELL_ENRAGE);
- Enraged = true;
- }
- events.ScheduleEvent(EVENT_ENRAGE, 30000);
- break;
- case EVENT_SUMMONTIGERS:
- DoCastVictim(SPELL_SUMMONTIGERS, true);
- events.ScheduleEvent(EVENT_SUMMONTIGERS, urand(10000, 14000), 0, PHASE_TWO);
- break;
- default:
- break;
- }
-
- if (me->IsFullHealth() && WasDead)
- WasDead = false;
-
- if ((events.IsInPhase(PHASE_ONE)) && !WasDead && !HealthAbovePct(5))
- {
- me->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE_PERCENT);
- me->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE);
- me->RemoveAurasByType(SPELL_AURA_PERIODIC_LEECH);
- me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- me->SetStandState(UNIT_STAND_STATE_SLEEP);
- me->AttackStop();
- if (instance)
- instance->SetBossState(DATA_THEKAL, SPECIAL);
- WasDead=true;
- }
- }
- DoMeleeAttackIfReady();
- }
- };
-
- CreatureAI* GetAI(Creature* creature) const
- {
- return new boss_thekalAI(creature);
- }
-};
-
-//Zealot Lor'Khan
-class npc_zealot_lorkhan : public CreatureScript
-{
- public: npc_zealot_lorkhan() : CreatureScript("npc_zealot_lorkhan") {}
-
- struct npc_zealot_lorkhanAI : public ScriptedAI
- {
- npc_zealot_lorkhanAI(Creature* creature) : ScriptedAI(creature)
- {
- instance = creature->GetInstanceScript();
- }
-
- uint32 Shield_Timer;
- uint32 BloodLust_Timer;
- uint32 GreaterHeal_Timer;
- uint32 Disarm_Timer;
- uint32 Check_Timer;
-
- bool FakeDeath;
-
- InstanceScript* instance;
-
- void Reset()
- {
- Shield_Timer = 1000;
- BloodLust_Timer = 16000;
- GreaterHeal_Timer = 32000;
- Disarm_Timer = 6000;
- Check_Timer = 10000;
-
- FakeDeath = false;
-
- if (instance)
- instance->SetBossState(DATA_LORKHAN, NOT_STARTED);
-
- me->SetUInt32Value(UNIT_FIELD_BYTES_1, 0);
- me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- }
-
- void EnterCombat(Unit* /*who*/)
- {
- }
-
- void UpdateAI(uint32 diff)
- {
- if (!UpdateVictim())
- return;
-
- //Shield_Timer
- if (Shield_Timer <= diff)
- {
- DoCast(me, SPELL_SHIELD);
- Shield_Timer = 61000;
- } else Shield_Timer -= diff;
-
- //BloodLust_Timer
- if (BloodLust_Timer <= diff)
- {
- DoCast(me, SPELL_BLOODLUST);
- BloodLust_Timer = 20000+rand()%8000;
- } else BloodLust_Timer -= diff;
-
- //Casting Greaterheal to Thekal or Zath if they are in meele range.
- if (GreaterHeal_Timer <= diff)
- {
- if (instance)
- {
- Unit* pThekal = Unit::GetUnit(*me, instance->GetData64(DATA_THEKAL));
- Unit* pZath = Unit::GetUnit(*me, instance->GetData64(DATA_ZATH));
-
- if (!pThekal || !pZath)
- return;
-
- switch (urand(0, 1))
- {
- case 0:
- if (me->IsWithinMeleeRange(pThekal))
- DoCast(pThekal, SPELL_GREATERHEAL);
- break;
- case 1:
- if (me->IsWithinMeleeRange(pZath))
- DoCast(pZath, SPELL_GREATERHEAL);
- break;
- }
- }
-
- GreaterHeal_Timer = 15000+rand()%5000;
- } else GreaterHeal_Timer -= diff;
-
- //Disarm_Timer
- if (Disarm_Timer <= diff)
- {
- DoCastVictim(SPELL_DISARM);
- Disarm_Timer = 15000+rand()%10000;
- } else Disarm_Timer -= diff;
-
- //Check_Timer for the death of LorKhan and Zath.
- if (!FakeDeath && Check_Timer <= diff)
- {
- if (instance)
- {
- if (instance->GetBossState(DATA_THEKAL) == SPECIAL)
- {
- //Resurrect Thekal
- if (Unit* pThekal = Unit::GetUnit(*me, instance->GetData64(DATA_THEKAL)))
- {
- pThekal->SetUInt32Value(UNIT_FIELD_BYTES_1, 0);
- pThekal->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- pThekal->setFaction(14);
- pThekal->SetFullHealth();
- }
- }
-
- if (instance->GetBossState(DATA_ZATH) == SPECIAL)
- {
- //Resurrect Zath
- if (Unit* pZath = Unit::GetUnit(*me, instance->GetData64(DATA_ZATH)))
- {
- pZath->SetUInt32Value(UNIT_FIELD_BYTES_1, 0);
- pZath->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- pZath->setFaction(14);
- pZath->SetFullHealth();
- }
- }
- }
-
- Check_Timer = 5000;
- } else Check_Timer -= diff;
-
- if (!HealthAbovePct(5))
- {
- me->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE_PERCENT);
- me->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE);
- me->RemoveAurasByType(SPELL_AURA_PERIODIC_LEECH);
- me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- me->SetStandState(UNIT_STAND_STATE_SLEEP);
- me->setFaction(35);
- me->AttackStop();
-
- if (instance)
- instance->SetBossState(DATA_LORKHAN, SPECIAL);
-
- FakeDeath = true;
- }
-
- DoMeleeAttackIfReady();
- }
- };
-
- CreatureAI* GetAI(Creature* creature) const
- {
- return new npc_zealot_lorkhanAI(creature);
- }
-};
-
-//Zealot Zath
-class npc_zealot_zath : public CreatureScript
-{
- public:
-
- npc_zealot_zath()
- : CreatureScript("npc_zealot_zath")
- {
- }
-
- struct npc_zealot_zathAI : public ScriptedAI
- {
- npc_zealot_zathAI(Creature* creature) : ScriptedAI(creature)
- {
- instance = creature->GetInstanceScript();
- }
-
- uint32 SweepingStrikes_Timer;
- uint32 SinisterStrike_Timer;
- uint32 Gouge_Timer;
- uint32 Kick_Timer;
- uint32 Blind_Timer;
- uint32 Check_Timer;
-
- bool FakeDeath;
-
- InstanceScript* instance;
-
- void Reset()
- {
- SweepingStrikes_Timer = 13000;
- SinisterStrike_Timer = 8000;
- Gouge_Timer = 25000;
- Kick_Timer = 18000;
- Blind_Timer = 5000;
- Check_Timer = 10000;
-
- FakeDeath = false;
-
- if (instance)
- instance->SetBossState(DATA_ZATH, NOT_STARTED);
-
- me->SetStandState(UNIT_STAND_STATE_STAND);
- me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- }
-
- void EnterCombat(Unit* /*who*/)
- {
- }
-
- void UpdateAI(uint32 diff)
- {
- if (!UpdateVictim())
- return;
-
- //SweepingStrikes_Timer
- if (SweepingStrikes_Timer <= diff)
- {
- DoCastVictim(SPELL_SWEEPINGSTRIKES);
- SweepingStrikes_Timer = 22000+rand()%4000;
- } else SweepingStrikes_Timer -= diff;
-
- //SinisterStrike_Timer
- if (SinisterStrike_Timer <= diff)
- {
- DoCastVictim(SPELL_SINISTERSTRIKE);
- SinisterStrike_Timer = 8000+rand()%8000;
- } else SinisterStrike_Timer -= diff;
-
- //Gouge_Timer
- if (Gouge_Timer <= diff)
- {
- DoCastVictim(SPELL_GOUGE);
-
- if (DoGetThreat(me->GetVictim()))
- DoModifyThreatPercent(me->GetVictim(), -100);
-
- Gouge_Timer = 17000+rand()%10000;
- } else Gouge_Timer -= diff;
-
- //Kick_Timer
- if (Kick_Timer <= diff)
- {
- DoCastVictim(SPELL_KICK);
- Kick_Timer = 15000+rand()%10000;
- } else Kick_Timer -= diff;
-
- //Blind_Timer
- if (Blind_Timer <= diff)
- {
- DoCastVictim(SPELL_BLIND);
- Blind_Timer = 10000+rand()%10000;
- } else Blind_Timer -= diff;
-
- //Check_Timer for the death of LorKhan and Zath.
- if (!FakeDeath && Check_Timer <= diff)
- {
- if (instance)
- {
- if (instance->GetBossState(DATA_LORKHAN) == SPECIAL)
- {
- //Resurrect LorKhan
- if (Unit* pLorKhan = Unit::GetUnit(*me, instance->GetData64(DATA_LORKHAN)))
- {
- pLorKhan->SetUInt32Value(UNIT_FIELD_BYTES_1, 0);
- pLorKhan->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- pLorKhan->setFaction(14);
- pLorKhan->SetFullHealth();
- }
- }
-
- if (instance->GetBossState(DATA_THEKAL) == SPECIAL)
- {
- //Resurrect Thekal
- if (Unit* pThekal = Unit::GetUnit(*me, instance->GetData64(DATA_THEKAL)))
- {
- pThekal->SetUInt32Value(UNIT_FIELD_BYTES_1, 0);
- pThekal->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- pThekal->setFaction(14);
- pThekal->SetFullHealth();
- }
- }
- }
-
- Check_Timer = 5000;
- } else Check_Timer -= diff;
-
- if (!HealthAbovePct(5))
- {
- me->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE_PERCENT);
- me->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE);
- me->RemoveAurasByType(SPELL_AURA_PERIODIC_LEECH);
- me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- me->SetStandState(UNIT_STAND_STATE_SLEEP);
- me->setFaction(35);
- me->AttackStop();
-
- if (instance)
- instance->SetBossState(DATA_ZATH, SPECIAL);
-
- FakeDeath = true;
- }
-
- DoMeleeAttackIfReady();
- }
- };
-
- CreatureAI* GetAI(Creature* creature) const
- {
- return new npc_zealot_zathAI(creature);
- }
-};
-
-void AddSC_boss_thekal()
-{
- new boss_thekal();
- new npc_zealot_lorkhan();
- new npc_zealot_zath();
-}
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_venoxis.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_venoxis.cpp
index 955781e3097..0e8a37c43c3 100644
--- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_venoxis.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_venoxis.cpp
@@ -22,129 +22,56 @@
#include "Spell.h"
#include "zulgurub.h"
-/*
- * @todo
- * - Fix timers (research some more)
- */
-
-enum Says
+enum Yells
{
- SAY_VENOXIS_TRANSFORM = 1, // Let the coils of hate unfurl!
- SAY_VENOXIS_DEATH = 2 // Ssserenity.. at lassst!
+ SAY_AGGRO = 0,
+ SAY_BLOODVENOM = 1, // ID - 96842 Venomous Effusion
+ SAY_TRANSFROM = 2, // ID - 97354 Blessing of the Snake God
+ SAY_WORD_OF_HETHISS = 3, // ID - 96560 Word of Hethiss
+ EMOTE_BLOODVENOM = 4, // ID - 96842 Bloodvenom
+ EMOTE_VENOM_WITHDRAWAL = 5, // ID - 96653 Venom Withdrawal
+ SAY_PLAYER_KILL = 6,
+ SAY_DEATH = 7
};
enum Spells
{
- // troll form
- SPELL_THRASH = 3391,
- SPELL_DISPEL_MAGIC = 23859,
- SPELL_RENEW = 23895,
- SPELL_HOLY_NOVA = 23858,
- SPELL_HOLY_FIRE = 23860,
- SPELL_HOLY_WRATH = 23979,
- // snake form
- SPELL_POISON_CLOUD = 23861,
- SPELL_VENOM_SPIT = 23862,
-
- SPELL_PARASITIC_SERPENT = 23865,
- SPELL_SUMMON_PARASITIC_SERPENT = 23866,
- SPELL_PARASITIC_SERPENT_TRIGGER = 23867,
- // used when swapping event-stages
- SPELL_VENOXIS_TRANSFORM = 23849, // 50% health - shapechange to cobra
- SPELL_FRENZY = 8269 // 20% health - frenzy
};
enum Events
{
- // troll form
- EVENT_THRASH = 1,
- EVENT_DISPEL_MAGIC = 2,
- EVENT_RENEW = 3,
- EVENT_HOLY_NOVA = 4,
- EVENT_HOLY_FIRE = 5,
- EVENT_HOLY_WRATH = 6,
- // phase-changing
- EVENT_TRANSFORM = 7,
- // snake form events
- EVENT_POISON_CLOUD = 8,
- EVENT_VENOM_SPIT = 9,
- EVENT_PARASITIC_SERPENT = 10,
- EVENT_FRENZY = 11,
-};
-
-enum Phases
-{
- PHASE_ONE = 1, // troll form
- PHASE_TWO = 2 // snake form
-};
-
-enum NPCs
-{
- NPC_PARASITIC_SERPENT = 14884
};
class boss_venoxis : public CreatureScript
{
- public: boss_venoxis() : CreatureScript("boss_venoxis") {}
+ public:
+ boss_venoxis() : CreatureScript("boss_venoxis") { }
struct boss_venoxisAI : public BossAI
{
- boss_venoxisAI(Creature* creature) : BossAI(creature, DATA_VENOXIS) {}
+ boss_venoxisAI(Creature* creature) : BossAI(creature, DATA_VENOXIS) { }
void Reset()
{
_Reset();
- // remove all spells and auras from previous attempts
- me->RemoveAllAuras();
- me->SetReactState(REACT_PASSIVE);
- // set some internally used variables to their defaults
- _inMeleeRange = 0;
- _transformed = false;
- _frenzied = false;
- events.SetPhase(PHASE_ONE);
- }
-
- void JustDied(Unit* /*killer*/)
- {
- _JustDied();
- Talk(SAY_VENOXIS_DEATH);
- me->RemoveAllAuras();
}
void EnterCombat(Unit* /*who*/)
{
_EnterCombat();
- me->SetReactState(REACT_AGGRESSIVE);
- // Always running events
- events.ScheduleEvent(EVENT_THRASH, 5000);
- // Phase one events (regular form)
- events.ScheduleEvent(EVENT_HOLY_NOVA, 5000, 0, PHASE_ONE);
- events.ScheduleEvent(EVENT_DISPEL_MAGIC, 35000, 0, PHASE_ONE);
- events.ScheduleEvent(EVENT_HOLY_FIRE, 10000, 0, PHASE_ONE);
- events.ScheduleEvent(EVENT_RENEW, 30000, 0, PHASE_ONE);
- events.ScheduleEvent(EVENT_HOLY_WRATH, 60000, 0, PHASE_ONE);
-
- events.SetPhase(PHASE_ONE);
+ Talk(SAY_AGGRO);
+ }
- // Set zone in combat
- DoZoneInCombat();
+ void JustDied(Unit* /*killer*/)
+ {
+ _JustDied();
+ Talk(SAY_DEATH);
}
- void DamageTaken(Unit* /*attacker*/, uint32& /*damage*/)
+ void KilledUnit(Unit* victim)
{
- // check if venoxis is ready to transform
- if (!_transformed && !HealthAbovePct(50))
- {
- _transformed = true;
- // schedule the event that changes our phase
- events.ScheduleEvent(EVENT_TRANSFORM, 100);
- }
- // we're losing health, bad, go frenzy
- else if (!_frenzied && !HealthAbovePct(20))
- {
- _frenzied = true;
- events.ScheduleEvent(EVENT_FRENZY, 100);
- }
+ if (victim->GetTypeId() == TYPEID_PLAYER)
+ Talk(SAY_PLAYER_KILL);
}
void UpdateAI(uint32 diff)
@@ -154,117 +81,26 @@ class boss_venoxis : public CreatureScript
events.Update(diff);
- // return back to main code if we're still casting
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
-
+ /*
while (uint32 eventId = events.ExecuteEvent())
{
switch (eventId)
{
- // thrash is available in all phases
- case EVENT_THRASH:
- DoCast(me, SPELL_THRASH, true);
- events.ScheduleEvent(EVENT_THRASH, urand(10000, 20000));
- break;
-
- // troll form spells and Actions (first part)
- case EVENT_DISPEL_MAGIC:
- DoCast(me, SPELL_DISPEL_MAGIC);
- events.ScheduleEvent(EVENT_DISPEL_MAGIC, urand(15000, 20000), 0, PHASE_ONE);
- break;
- case EVENT_RENEW:
- DoCast(me, SPELL_RENEW);
- events.ScheduleEvent(EVENT_RENEW, urand(25000, 30000), 0, PHASE_ONE);
- break;
- case EVENT_HOLY_NOVA:
- _inMeleeRange = 0;
-
- for (uint8 i = 0; i < 10; ++i)
- {
- if (Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, i))
- // check if target is within melee-distance
- if (me->IsWithinMeleeRange(target))
- ++_inMeleeRange;
- }
-
- // trigger spellcast only if we have 3 or more targets to affect
- if (_inMeleeRange >= 3)
- DoCastVictim(SPELL_HOLY_NOVA);
-
- events.ScheduleEvent(EVENT_HOLY_NOVA, urand(45000, 75000), 0, PHASE_ONE);
- break;
- case EVENT_HOLY_FIRE:
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
- DoCast(target, SPELL_HOLY_FIRE);
- events.ScheduleEvent(EVENT_HOLY_FIRE, urand(45000, 60000), 0, PHASE_ONE);
- break;
- case EVENT_HOLY_WRATH:
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
- DoCast(target, SPELL_HOLY_WRATH);
- events.ScheduleEvent(EVENT_HOLY_WRATH, urand(45000, 60000), 0, PHASE_ONE);
- break;
-
- //
- // snake form spells and Actions
- //
-
- case EVENT_VENOM_SPIT:
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
- DoCast(target, SPELL_VENOM_SPIT);
- events.ScheduleEvent(EVENT_VENOM_SPIT, urand(5000, 15000), 0, PHASE_TWO);
- break;
- case EVENT_POISON_CLOUD:
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
- DoCast(target, SPELL_POISON_CLOUD);
- events.ScheduleEvent(EVENT_POISON_CLOUD, urand(15000, 20000), 0, PHASE_TWO);
- break;
- case EVENT_PARASITIC_SERPENT:
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
- DoCast(target, SPELL_SUMMON_PARASITIC_SERPENT);
- events.ScheduleEvent(EVENT_PARASITIC_SERPENT, 15000, 0, PHASE_TWO);
- break;
- case EVENT_FRENZY:
- // frenzy at 20% health
- DoCast(me, SPELL_FRENZY, true);
- break;
-
- //
- // shape and phase-changing
- //
-
- case EVENT_TRANSFORM:
- // shapeshift at 50% health
- DoCast(me, SPELL_VENOXIS_TRANSFORM);
- Talk(SAY_VENOXIS_TRANSFORM);
- DoResetThreat();
-
- // phase two events (snakeform)
- events.ScheduleEvent(EVENT_VENOM_SPIT, 5000, 0, PHASE_TWO);
- events.ScheduleEvent(EVENT_POISON_CLOUD, 10000, 0, PHASE_TWO);
- events.ScheduleEvent(EVENT_PARASITIC_SERPENT, 30000, 0, PHASE_TWO);
-
- // transformed, start phase two
- events.SetPhase(PHASE_TWO);
-
- break;
default:
break;
}
}
+ */
DoMeleeAttackIfReady();
}
-
- private:
- uint8 _inMeleeRange;
- bool _transformed;
- bool _frenzied;
};
CreatureAI* GetAI(Creature* creature) const
{
- return new boss_venoxisAI(creature);
+ return GetZulGurubAI<boss_venoxisAI>(creature);
}
};
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_wushoolay.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_wushoolay.cpp
index 6fb1c682a38..0dbfad612a8 100644
--- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_wushoolay.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_wushoolay.cpp
@@ -16,52 +16,44 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/* ScriptData
-SDName: Boss_Wushoolay
-SD%Complete: 100
-SDComment:
-SDCategory: Zul'Gurub
-EndScriptData */
-
+#include "ObjectMgr.h"
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "zulgurub.h"
+enum Yells
+{
+};
+
enum Spells
{
- SPELL_LIGHTNINGCLOUD = 25033,
- SPELL_LIGHTNINGWAVE = 24819
};
enum Events
{
- EVENT_LIGHTNINGCLOUD = 1,
- EVENT_LIGHTNINGWAVE = 2
};
class boss_wushoolay : public CreatureScript
{
- public: boss_wushoolay() : CreatureScript("boss_wushoolay") {}
+ public:
+ boss_wushoolay() : CreatureScript("boss_wushoolay") { }
struct boss_wushoolayAI : public BossAI
{
- boss_wushoolayAI(Creature* creature) : BossAI(creature, DATA_EDGE_OF_MADNESS) {}
+ boss_wushoolayAI(Creature* creature) : BossAI(creature, DATA_HAZZARAH)
+ {
+ }
void Reset()
{
- _Reset();
}
- void JustDied(Unit* /*killer*/)
+ void EnterCombat(Unit* /*who*/)
{
- _JustDied();
}
- void EnterCombat(Unit* /*who*/)
+ void JustDied(Unit* /*killer*/)
{
- _EnterCombat();
- events.ScheduleEvent(EVENT_LIGHTNINGCLOUD, urand(5000, 10000));
- events.ScheduleEvent(EVENT_LIGHTNINGWAVE, urand(8000, 16000));
}
void UpdateAI(uint32 diff)
@@ -73,23 +65,16 @@ class boss_wushoolay : public CreatureScript
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
-
+ /*
while (uint32 eventId = events.ExecuteEvent())
{
switch (eventId)
{
- case EVENT_LIGHTNINGCLOUD:
- DoCastVictim(SPELL_LIGHTNINGCLOUD, true);
- events.ScheduleEvent(EVENT_LIGHTNINGCLOUD, urand(15000, 20000));
- break;
- case EVENT_LIGHTNINGWAVE:
- DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true), SPELL_LIGHTNINGWAVE);
- events.ScheduleEvent(EVENT_LIGHTNINGWAVE, urand(12000, 16000));
- break;
default:
break;
}
}
+ */
DoMeleeAttackIfReady();
}
@@ -105,4 +90,3 @@ void AddSC_boss_wushoolay()
{
new boss_wushoolay();
}
-
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_zanzil.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_zanzil.cpp
new file mode 100644
index 00000000000..f4b8cc980d4
--- /dev/null
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_zanzil.cpp
@@ -0,0 +1,109 @@
+/*
+ * Copyright (C) 2008-2013 TrinityCore <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, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "ObjectMgr.h"
+#include "ScriptMgr.h"
+#include "ScriptedCreature.h"
+#include "zulgurub.h"
+
+enum Yells
+{
+ SAY_AGGRO = 0,
+ EMOTE_ZANZIL_ZOMBIES = 1, // ID - 96319 Zanzil's Resurrection Elixir
+ SAY_ZANZIL_ZOMBIES = 2, // ID - 96319 Zanzil's Resurrection Elixir
+ EMOTE_ZANZIL_GRAVEYARD_GAS = 3, // ID - 96338 Zanzil's Graveyard Gas
+ SAY_ZANZIL_GRAVEYARD_GAS = 4, // ID - 96338 Zanzil's Graveyard Gas
+ EMOTE_ZANZIL_BERSEKER = 5, // ID - 96316 Zanzil's Resurrection Elixir
+ SAY_ZANZIL_BERSEKER = 6, // ID - 96316 Zanzil's Resurrection Elixir
+ SAY_PLAYER_KILL = 7,
+ SAY_DEATH = 8
+};
+
+enum Spells
+{
+};
+
+enum Events
+{
+};
+
+class boss_zanzil : public CreatureScript
+{
+ public:
+ boss_zanzil() : CreatureScript("boss_zanzil") { }
+
+ struct boss_zanzilAI : public BossAI
+ {
+ boss_zanzilAI(Creature* creature) : BossAI(creature, DATA_ZANZIL) { }
+
+ void Reset()
+ {
+ _Reset();
+ }
+
+ void EnterCombat(Unit* /*who*/)
+ {
+ _EnterCombat();
+ Talk(SAY_AGGRO);
+ }
+
+ void JustDied(Unit* /*killer*/)
+ {
+ _JustDied();
+ Talk(SAY_DEATH);
+ }
+
+ void KilledUnit(Unit* victim)
+ {
+ if (victim->GetTypeId() == TYPEID_PLAYER)
+ Talk(SAY_PLAYER_KILL);
+ }
+
+ void UpdateAI(uint32 diff)
+ {
+ if (!UpdateVictim())
+ return;
+
+ events.Update(diff);
+
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+ /*
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ default:
+ break;
+ }
+ }
+ */
+
+ DoMeleeAttackIfReady();
+ }
+ };
+
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return GetZulGurubAI<boss_zanzilAI>(creature);
+ }
+};
+
+void AddSC_boss_zanzil()
+{
+ new boss_zanzil();
+}
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp
index 01c5ef998f5..07655ea110c 100644
--- a/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp
@@ -16,67 +16,78 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/* ScriptData
-SDName: Instance_ZulGurub
-SD%Complete: 80
-SDComment: Missing reset function after killing a boss for Ohgan, Thekal.
-SDCategory: Zul'Gurub
-EndScriptData */
-
#include "ScriptMgr.h"
#include "InstanceScript.h"
#include "zulgurub.h"
+DoorData const doorData[] =
+{
+ { GO_VENOXIS_COIL, DATA_VENOXIS, DOOR_TYPE_ROOM, BOUNDARY_NONE },
+ { GO_ARENA_DOOR_1, DATA_MANDOKIR, DOOR_TYPE_ROOM, BOUNDARY_NONE },
+ { GO_FORCEFIELD, DATA_KILNARA, DOOR_TYPE_ROOM, BOUNDARY_NONE },
+ { GO_ZANZIL_DOOR, DATA_ZANZIL, DOOR_TYPE_ROOM, BOUNDARY_NONE },
+ //{ GO_THE_CACHE_OF_MADNESS_DOOR, DATA_xxxxxxx, DOOR_TYPE_ROOM, BOUNDARY_NONE },
+ { 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE }
+};
+
class instance_zulgurub : public InstanceMapScript
{
- public: instance_zulgurub(): InstanceMapScript(ZGScriptName, 309) {}
+ public:
+ instance_zulgurub() : InstanceMapScript(ZGScriptName, 859) { }
struct instance_zulgurub_InstanceMapScript : public InstanceScript
{
instance_zulgurub_InstanceMapScript(Map* map) : InstanceScript(map)
{
SetBossNumber(EncounterCount);
- }
-
- void Initialize()
- {
- _zealotLorkhanGUID = 0;
- _zealotZathGUID = 0;
- _highPriestTekalGUID = 0;
- _jindoTheHexxerGUID = 0;
- _vilebranchSpeakerGUID = 0;
- _arlokkGUID = 0;
- _goForcefieldGUID = 0;
- _goGongOfBethekkGUID = 0;
- }
-
- bool IsEncounterInProgress() const
- {
- // not active in Zul'Gurub
- return false;
+ LoadDoorData(doorData);
+ venoxisGUID = 0;
+ mandokirGUID = 0;
+ kilnaraGUID = 0;
+ zanzilGUID = 0;
+ jindoGUID = 0;
+ hazzarahGUID = 0;
+ renatakiGUID = 0;
+ wushoolayGUID = 0;
+ grilekGUID = 0;
+ jindoTiggerGUID = 0;
}
void OnCreatureCreate(Creature* creature)
{
switch (creature->GetEntry())
{
- case NPC_ZEALOT_LORKHAN:
- _zealotLorkhanGUID = creature->GetGUID();
+ case NPC_VENOXIS:
+ venoxisGUID = creature->GetGUID();
+ break;
+ case NPC_MANDOKIR:
+ mandokirGUID = creature->GetGUID();
+ break;
+ case NPC_KILNARA:
+ kilnaraGUID = creature->GetGUID();
+ break;
+ case NPC_ZANZIL:
+ zanzilGUID = creature->GetGUID();
+ break;
+ case NPC_JINDO:
+ jindoGUID = creature->GetGUID();
break;
- case NPC_ZEALOT_ZATH:
- _zealotZathGUID = creature->GetGUID();
+ case NPC_HAZZARAH:
+ hazzarahGUID = creature->GetGUID();
break;
- case NPC_HIGH_PRIEST_THEKAL:
- _highPriestTekalGUID = creature->GetGUID();
+ case NPC_RENATAKI:
+ renatakiGUID = creature->GetGUID();
break;
- case NPC_JINDO_THE_HEXXER:
- _jindoTheHexxerGUID = creature->GetGUID();
+ case NPC_WUSHOOLAY:
+ wushoolayGUID = creature->GetGUID();
break;
- case NPC_VILEBRANCH_SPEAKER:
- _vilebranchSpeakerGUID = creature->GetGUID();
+ case NPC_GRILEK:
+ grilekGUID = creature->GetGUID();
break;
- case NPC_ARLOKK:
- _arlokkGUID = creature->GetGUID();
+ case NPC_JINDO_TRIGGER:
+ jindoTiggerGUID = creature->GetGUID();
+ break;
+ default:
break;
}
}
@@ -85,47 +96,104 @@ class instance_zulgurub : public InstanceMapScript
{
switch (go->GetEntry())
{
+ case GO_VENOXIS_COIL:
+ case GO_ARENA_DOOR_1:
case GO_FORCEFIELD:
- _goForcefieldGUID = go->GetGUID();
- break;
- case GO_GONG_OF_BETHEKK:
- _goGongOfBethekkGUID = go->GetGUID();
- if (GetBossState(DATA_ARLOKK) == DONE)
- go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
- else
- go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
+ case GO_ZANZIL_DOOR:
+ case GO_THE_CACHE_OF_MADNESS_DOOR:
+ AddDoor(go, true);
break;
default:
break;
}
}
- uint64 GetData64(uint32 uiData) const
+ void OnGameObjectRemove(GameObject* go)
{
- switch (uiData)
+ switch (go->GetEntry())
{
- case DATA_LORKHAN:
- return _zealotLorkhanGUID;
- break;
- case DATA_ZATH:
- return _zealotZathGUID;
+ case GO_VENOXIS_COIL:
+ case GO_ARENA_DOOR_1:
+ case GO_FORCEFIELD:
+ case GO_ZANZIL_DOOR:
+ case GO_THE_CACHE_OF_MADNESS_DOOR:
+ AddDoor(go, false);
break;
- case DATA_THEKAL:
- return _highPriestTekalGUID;
+ default:
break;
+ }
+ }
+
+ bool SetBossState(uint32 type, EncounterState state)
+ {
+ if (!InstanceScript::SetBossState(type, state))
+ return false;
+
+ switch (type)
+ {
+ case DATA_VENOXIS:
+ case DATA_MANDOKIR:
+ case DATA_KILNARA:
+ case DATA_ZANZIL:
case DATA_JINDO:
- return _jindoTheHexxerGUID;
+ case DATA_HAZZARAH:
+ case DATA_RENATAKI:
+ case DATA_WUSHOOLAY:
+ case DATA_GRILEK:
break;
- case NPC_ARLOKK:
- return _arlokkGUID;
- break;
- case GO_FORCEFIELD:
- return _goForcefieldGUID;
+ default:
break;
- case GO_GONG_OF_BETHEKK:
- return _goGongOfBethekkGUID;
+ }
+
+ return true;
+ }
+
+ /*
+ void SetData(uint32 type, uint32 data)
+ {
+ switch (type)
+ {
+ }
+ }
+
+ uint32 GetData(uint32 type) const
+ {
+ switch (type)
+ {
+ }
+
+ return 0;
+ }
+ */
+
+ uint64 GetData64(uint32 type) const
+ {
+ switch (type)
+ {
+ case DATA_VENOXIS:
+ return venoxisGUID;
+ case DATA_MANDOKIR:
+ return mandokirGUID;
+ case DATA_KILNARA:
+ return kilnaraGUID;
+ case DATA_ZANZIL:
+ return zanzilGUID;
+ case DATA_JINDO:
+ return jindoGUID;
+ case DATA_HAZZARAH:
+ return hazzarahGUID;
+ case DATA_RENATAKI:
+ return renatakiGUID;
+ case DATA_WUSHOOLAY:
+ return wushoolayGUID;
+ case DATA_GRILEK:
+ return grilekGUID;
+ case DATA_JINDOR_TRIGGER:
+ return jindoTiggerGUID;
+ default:
break;
}
+
return 0;
}
@@ -140,7 +208,7 @@ class instance_zulgurub : public InstanceMapScript
return saveStream.str();
}
- void Load(const char* str)
+ void Load(char const* str)
{
if (!str)
{
@@ -157,12 +225,13 @@ class instance_zulgurub : public InstanceMapScript
if (dataHead1 == 'Z' && dataHead2 == 'G')
{
- for (uint32 i = 0; i < EncounterCount; ++i)
+ for (uint8 i = 0; i < EncounterCount; ++i)
{
uint32 tmpState;
loadStream >> tmpState;
if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
tmpState = NOT_STARTED;
+
SetBossState(i, EncounterState(tmpState));
}
}
@@ -171,18 +240,18 @@ class instance_zulgurub : public InstanceMapScript
OUT_LOAD_INST_DATA_COMPLETE;
}
- private:
- //If all High Priest bosses were killed. Lorkhan, Zath and Ohgan are added too.
- //Storing Lorkhan, Zath and Thekal because we need to cast on them later. Jindo is needed for healfunction too.
-
- uint64 _zealotLorkhanGUID;
- uint64 _zealotZathGUID;
- uint64 _highPriestTekalGUID;
- uint64 _jindoTheHexxerGUID;
- uint64 _vilebranchSpeakerGUID;
- uint64 _arlokkGUID;
- uint64 _goForcefieldGUID;
- uint64 _goGongOfBethekkGUID;
+
+ protected:
+ uint64 venoxisGUID;
+ uint64 mandokirGUID;
+ uint64 kilnaraGUID;
+ uint64 zanzilGUID;
+ uint64 jindoGUID;
+ uint64 hazzarahGUID;
+ uint64 renatakiGUID;
+ uint64 wushoolayGUID;
+ uint64 grilekGUID;
+ uint64 jindoTiggerGUID;
};
InstanceScript* GetInstanceScript(InstanceMap* map) const
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h b/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h
index 77767153a96..90f9c98497c 100644
--- a/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h
@@ -1,5 +1,6 @@
/*
* Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
*
* 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
@@ -18,51 +19,72 @@
#ifndef DEF_ZULGURUB_H
#define DEF_ZULGURUB_H
-uint32 const EncounterCount = 13;
-
#define ZGScriptName "instance_zulgurub"
+uint32 const EncounterCount = 5;
+
enum DataTypes
{
- DATA_JEKLIK = 0, // Main boss
- DATA_VENOXIS = 1, // Main boss
- DATA_MARLI = 2, // Main boss
- DATA_ARLOKK = 3, // Main boss
- DATA_THEKAL = 4, // Main boss
- DATA_HAKKAR = 5, // End boss
- DATA_MANDOKIR = 6, // Optional boss
- DATA_JINDO = 7, // Optional boss
- DATA_GAHZRANKA = 8, // Optional boss
- DATA_EDGE_OF_MADNESS = 9, // Optional Event Edge of Madness - one of: Gri'lek, Renataki, Hazza'rah, or Wushoolay
- DATA_LORKHAN = 10, // Zealot Lor'Khan add to High priest Thekal!
- DATA_ZATH = 11, // Zealot Zath add to High priest Thekal!
- DATA_OHGAN = 12, // Bloodlord Mandokir's raptor mount
- TYPE_EDGE_OF_MADNESS = 13 // Boss storage
+ DATA_VENOXIS = 0,
+ DATA_MANDOKIR = 1,
+ DATA_KILNARA = 2,
+ DATA_ZANZIL = 3,
+ DATA_JINDO = 4,
+
+ // Cache of Madness
+ DATA_HAZZARAH = 5,
+ DATA_RENATAKI = 6,
+ DATA_WUSHOOLAY = 7,
+ DATA_GRILEK = 8,
+
+ // Jin'do the Godbreaker
+ DATA_JINDOR_TRIGGER,
};
enum CreatureIds
{
- NPC_ARLOKK = 14515, // Arlokk Event
- NPC_PANTHER_TRIGGER = 15091, // Arlokk Event
- NPC_ZULIAN_PROWLER = 15101, // Arlokk Event
- NPC_ZEALOT_LORKHAN = 11347,
- NPC_ZEALOT_ZATH = 11348,
- NPC_HIGH_PRIEST_THEKAL = 14509,
- NPC_JINDO_THE_HEXXER = 11380,
- NPC_NIGHTMARE_ILLUSION = 15163,
- NPC_SHADE_OF_JINDO = 14986,
- NPC_SACRIFICED_TROLL = 14826,
- NPC_MANDOKIR = 11382, // Mandokir Event
- NPC_OHGAN = 14988, // Mandokir Event
- NPC_VILEBRANCH_SPEAKER = 11391, // Mandokir Event
- NPC_CHAINED_SPIRT = 15117 // Mandokir Event
+ NPC_VENOXIS = 52155,
+ NPC_MANDOKIR = 52151,
+ NPC_KILNARA = 52059,
+ NPC_ZANZIL = 52053,
+ NPC_JINDO = 52148,
+
+ // Cache of Madness
+ NPC_HAZZARAH = 52271,
+ NPC_RENATAKI = 52269,
+ NPC_WUSHOOLAY = 52286,
+ NPC_GRILEK = 52258,
+ // Bloodlord Mandokir
+ NPC_CHAINED_SPIRIT = 52156,
+ NPC_OHGAN = 52157,
+
+ // Jin'do the Godbreaker
+ NPC_JINDO_TRIGGER = 52150,
+ NPC_SPIRIT_OF_HAKKAR = 52222,
+ NPC_SHADOW_OF_HAKKAR = 52650
};
-enum GameobjectIds
+enum GameObjectIds
{
- GO_FORCEFIELD = 180497, // Arlokk Event
- GO_GONG_OF_BETHEKK = 180526 // Arlokk Event
+ // High Priest Venoxis
+ GO_VENOXIS_COIL = 208844,
+
+ // Bloodlord Mandokir
+ GO_ARENA_DOOR_1 = 208845,
+ GO_ARENA_DOOR_2 = 208847,
+ GO_ARENA_DOOR_3 = 208848,
+ GO_ARENA_DOOR_4 = 208846,
+ GO_ARENA_DOOR_5 = 208849,
+
+ // High Priestess Kilnara
+ GO_FORCEFIELD = 180497,
+
+ // Zanzil
+ GO_ZANZIL_DOOR = 208850,
+
+ // Cache of Madness
+ GO_THE_CACHE_OF_MADNESS_DOOR = 208843
};
template<class AI>
diff --git a/src/server/scripts/EasternKingdoms/boss_kruul.cpp b/src/server/scripts/EasternKingdoms/boss_kruul.cpp
deleted file mode 100644
index 80237b5013c..00000000000
--- a/src/server/scripts/EasternKingdoms/boss_kruul.cpp
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
- * Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
- * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
- *
- * 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, see <http://www.gnu.org/licenses/>.
- */
-
-/* ScriptData
-SDName: Boss_Kruul
-SD%Complete: 100
-SDComment: Highlord Kruul are presumably no longer in-game on regular bases, however future events could bring him back.
-SDCategory: Bosses
-EndScriptData */
-
-#include "ScriptMgr.h"
-#include "ScriptedCreature.h"
-
-enum Spells
-{
- SPELL_SHADOWVOLLEY = 21341,
- SPELL_CLEAVE = 20677,
- SPELL_THUNDERCLAP = 23931,
- SPELL_TWISTEDREFLECTION = 21063,
- SPELL_VOIDBOLT = 21066,
- SPELL_RAGE = 21340,
- SPELL_CAPTURESOUL = 21054
-};
-
-class boss_kruul : public CreatureScript
-{
-public:
- boss_kruul() : CreatureScript("boss_kruul") { }
-
- CreatureAI* GetAI(Creature* creature) const
- {
- return new boss_kruulAI (creature);
- }
-
- struct boss_kruulAI : public ScriptedAI
- {
- boss_kruulAI(Creature* creature) : ScriptedAI(creature) {}
-
- uint32 ShadowVolley_Timer;
- uint32 Cleave_Timer;
- uint32 ThunderClap_Timer;
- uint32 TwistedReflection_Timer;
- uint32 VoidBolt_Timer;
- uint32 Rage_Timer;
- uint32 Hound_Timer;
-
- void Reset()
- {
- ShadowVolley_Timer = 10000;
- Cleave_Timer = 14000;
- ThunderClap_Timer = 20000;
- TwistedReflection_Timer = 25000;
- VoidBolt_Timer = 30000;
- Rage_Timer = 60000; //Cast rage after 1 minute
- Hound_Timer = 8000;
- }
-
- void EnterCombat(Unit* /*who*/)
- {
- }
-
- void KilledUnit(Unit* /*victim*/)
- {
- // When a player, pet or totem gets killed, Lord Kazzak casts this spell to instantly regenerate 70, 000 health.
- DoCast(me, SPELL_CAPTURESOUL);
- }
-
- void SummonHounds(Unit* victim)
- {
- if (Creature* Hound = DoSpawnCreature(19207, float(irand(-9, 9)), float(irand(-9, 9)), 0, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 300000))
- Hound->AI()->AttackStart(victim);
- }
-
- void UpdateAI(uint32 diff)
- {
- //Return since we have no target
- if (!UpdateVictim())
- return;
-
- //ShadowVolley_Timer
- if (ShadowVolley_Timer <= diff)
- {
- if (urand(0, 99) < 45)
- DoCastVictim(SPELL_SHADOWVOLLEY);
-
- ShadowVolley_Timer = 5000;
- } else ShadowVolley_Timer -= diff;
-
- //Cleave_Timer
- if (Cleave_Timer <= diff)
- {
- if (urand(0, 1))
- DoCastVictim(SPELL_CLEAVE);
-
- Cleave_Timer = 10000;
- } else Cleave_Timer -= diff;
-
- //ThunderClap_Timer
- if (ThunderClap_Timer <= diff)
- {
- if (urand(0, 9) < 2)
- DoCastVictim(SPELL_THUNDERCLAP);
-
- ThunderClap_Timer = 12000;
- } else ThunderClap_Timer -= diff;
-
- //TwistedReflection_Timer
- if (TwistedReflection_Timer <= diff)
- {
- DoCastVictim(SPELL_TWISTEDREFLECTION);
- TwistedReflection_Timer = 30000;
- } else TwistedReflection_Timer -= diff;
-
- //VoidBolt_Timer
- if (VoidBolt_Timer <= diff)
- {
- if (urand(0, 9) < 4)
- DoCastVictim(SPELL_VOIDBOLT);
-
- VoidBolt_Timer = 18000;
- } else VoidBolt_Timer -= diff;
-
- //Rage_Timer
- if (Rage_Timer <= diff)
- {
- DoCast(me, SPELL_RAGE);
- Rage_Timer = 70000;
- } else Rage_Timer -= diff;
-
- //Hound_Timer
- if (Hound_Timer <= diff)
- {
- SummonHounds(me->GetVictim());
- SummonHounds(me->GetVictim());
- SummonHounds(me->GetVictim());
-
- Hound_Timer = 45000;
- } else Hound_Timer -= diff;
-
- DoMeleeAttackIfReady();
- }
- };
-};
-
-void AddSC_boss_kruul()
-{
- new boss_kruul();
-}
diff --git a/src/server/scripts/EasternKingdoms/zone_arathi_highlands.cpp b/src/server/scripts/EasternKingdoms/zone_arathi_highlands.cpp
index 872ea60ddf0..091eb5e3d93 100644
--- a/src/server/scripts/EasternKingdoms/zone_arathi_highlands.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_arathi_highlands.cpp
@@ -49,7 +49,11 @@ enum eEnums
EMOTE_PROGRESS_8 = 8,
SAY_PROGRESS_9 = 9,
- QUEST_SUNKEN_TREASURE = 665,
+ EVENT_SAY_3 = 1,
+ EVENT_SAY_6 = 2,
+ EVENT_SAY_8 = 3,
+
+ QUEST_GOGGLE_BOGGLE = 26050,
NPC_VENGEFUL_SURGE = 2776
};
@@ -74,33 +78,22 @@ class npc_professor_phizzlethorpe : public CreatureScript
switch (waypointId)
{
- case 4:
+ case 6:
Talk(SAY_PROGRESS_2, player->GetGUID());
- break;
- case 5:
- Talk(SAY_PROGRESS_3, player->GetGUID());
+ events.ScheduleEvent(EVENT_SAY_3, 3000);
break;
case 8:
Talk(EMOTE_PROGRESS_4);
- break;
- case 9:
- me->SummonCreature(NPC_VENGEFUL_SURGE, -2052.96f, -2142.49f, 20.15f, 1.0f, TEMPSUMMON_CORPSE_DESPAWN, 0);
- me->SummonCreature(NPC_VENGEFUL_SURGE, -2052.96f, -2142.49f, 20.15f, 1.0f, TEMPSUMMON_CORPSE_DESPAWN, 0);
- break;
- case 10:
- Talk(SAY_PROGRESS_5, player->GetGUID());
+ me->SummonCreature(NPC_VENGEFUL_SURGE, -2065.505f, -2136.88f, 22.20362f, 1.0f, TEMPSUMMON_CORPSE_DESPAWN, 0);
+ me->SummonCreature(NPC_VENGEFUL_SURGE, -2059.249f, -2134.88f, 21.51582f, 1.0f, TEMPSUMMON_CORPSE_DESPAWN, 0);
break;
case 11:
- Talk(SAY_PROGRESS_6, player->GetGUID());
- SetRun();
+ Talk(SAY_PROGRESS_5, player->GetGUID());
+ events.ScheduleEvent(EVENT_SAY_6, 11000);
break;
- case 19:
+ case 17:
Talk(SAY_PROGRESS_7, player->GetGUID());
- break;
- case 20:
- Talk(EMOTE_PROGRESS_8);
- Talk(SAY_PROGRESS_9, player->GetGUID());
- player->GroupEventHappens(QUEST_SUNKEN_TREASURE, me);
+ events.ScheduleEvent(EVENT_SAY_8, 6000);
break;
}
}
@@ -117,8 +110,34 @@ class npc_professor_phizzlethorpe : public CreatureScript
void UpdateAI(uint32 diff)
{
+ Player* player = GetPlayerForEscort();
+ if (!player)
+ return;
+
+ events.Update(diff);
+
+ while (uint32 event = events.ExecuteEvent())
+ {
+ switch (event)
+ {
+ case EVENT_SAY_3:
+ Talk(SAY_PROGRESS_3, player->GetGUID());
+ break;
+ case EVENT_SAY_6:
+ Talk(SAY_PROGRESS_6, player->GetGUID());
+ SetRun();
+ break;
+ case EVENT_SAY_8:
+ Talk(EMOTE_PROGRESS_8);
+ Talk(SAY_PROGRESS_9, player->GetGUID());
+ player->GroupEventHappens(QUEST_GOGGLE_BOGGLE, me);
+ break;
+ }
+ }
npc_escortAI::UpdateAI(diff);
}
+
+ EventMap events;
};
CreatureAI* GetAI(Creature* creature) const
@@ -128,13 +147,13 @@ class npc_professor_phizzlethorpe : public CreatureScript
bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest)
{
- if (quest->GetQuestId() == QUEST_SUNKEN_TREASURE)
+ if (quest->GetQuestId() == QUEST_GOGGLE_BOGGLE)
{
creature->AI()->Talk(SAY_PROGRESS_1, player->GetGUID());
if (npc_escortAI* pEscortAI = CAST_AI(npc_professor_phizzlethorpeAI, (creature->AI())))
pEscortAI->Start(false, false, player->GetGUID(), quest);
- creature->setFaction(113);
+ creature->setFaction(42);
}
return true;
}
diff --git a/src/server/scripts/EasternKingdoms/zone_burning_steppes.cpp b/src/server/scripts/EasternKingdoms/zone_burning_steppes.cpp
index 174fbb3f75a..808515269ad 100644
--- a/src/server/scripts/EasternKingdoms/zone_burning_steppes.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_burning_steppes.cpp
@@ -18,142 +18,19 @@
/* ScriptData
SDName: Burning_Steppes
-SD%Complete: 100
-SDComment: Quest support: 4224, 4866
+SD%Complete: 0
+SDComment:
SDCategory: Burning Steppes
EndScriptData */
-/* ContentData
-npc_ragged_john
-EndContentData */
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "ScriptedGossip.h"
#include "Player.h"
-/*######
-## npc_ragged_john
-######*/
-
-#define GOSSIP_HELLO "Official buisness, John. I need some information about Marsha Windsor. Tell me about the last time you saw him."
-#define GOSSIP_SELECT1 "So what did you do?"
-#define GOSSIP_SELECT2 "Start making sense, dwarf. I don't want to have anything to do with your cracker, your pappy, or any sort of 'discreditin'."
-#define GOSSIP_SELECT3 "Ironfoe?"
-#define GOSSIP_SELECT4 "Interesting... continue John."
-#define GOSSIP_SELECT5 "So that's how Windsor died..."
-#define GOSSIP_SELECT6 "So how did he die?"
-#define GOSSIP_SELECT7 "Ok so where the hell is he? Wait a minute! Are you drunk?"
-#define GOSSIP_SELECT8 "WHY is he in Blackrock Depths?"
-#define GOSSIP_SELECT9 "300? So the Dark Irons killed him and dragged him into the Depths?"
-#define GOSSIP_SELECT10 "Ahh... Ironfoe"
-#define GOSSIP_SELECT11 "Thanks, Ragged John. Your story was very uplifting and informative"
-
-class npc_ragged_john : public CreatureScript
-{
-public:
- npc_ragged_john() : CreatureScript("npc_ragged_john") { }
-
- bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action)
- {
- player->PlayerTalkClass->ClearMenus();
- switch (action)
- {
- case GOSSIP_ACTION_INFO_DEF:
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
- player->SEND_GOSSIP_MENU(2714, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+1:
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
- player->SEND_GOSSIP_MENU(2715, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+2:
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3);
- player->SEND_GOSSIP_MENU(2716, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+3:
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4);
- player->SEND_GOSSIP_MENU(2717, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+4:
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5);
- player->SEND_GOSSIP_MENU(2718, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+5:
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT6, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 6);
- player->SEND_GOSSIP_MENU(2719, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+6:
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT7, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 7);
- player->SEND_GOSSIP_MENU(2720, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+7:
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT8, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 8);
- player->SEND_GOSSIP_MENU(2721, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+8:
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT9, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 9);
- player->SEND_GOSSIP_MENU(2722, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+9:
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT10, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 10);
- player->SEND_GOSSIP_MENU(2723, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+10:
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT11, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 11);
- player->SEND_GOSSIP_MENU(2725, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+11:
- player->CLOSE_GOSSIP_MENU();
- player->AreaExploredOrEventHappens(4224);
- break;
- }
- return true;
- }
-
- bool OnGossipHello(Player* player, Creature* creature)
- {
- if (creature->IsQuestGiver())
- player->PrepareQuestMenu(creature->GetGUID());
-
- if (player->GetQuestStatus(4224) == QUEST_STATUS_INCOMPLETE)
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_HELLO, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
-
- player->SEND_GOSSIP_MENU(2713, creature->GetGUID());
- return true;
- }
-
- CreatureAI* GetAI(Creature* creature) const
- {
- return new npc_ragged_johnAI (creature);
- }
-
- struct npc_ragged_johnAI : public ScriptedAI
- {
- npc_ragged_johnAI(Creature* creature) : ScriptedAI(creature) {}
-
- void Reset() {}
-
- void MoveInLineOfSight(Unit* who)
- {
- if (who->HasAura(16468))
- {
- if (who->GetTypeId() == TYPEID_PLAYER && me->IsWithinDistInMap(who, 15) && who->isInAccessiblePlaceFor(me))
- {
- DoCast(who, 16472);
- if (Player* player = who->ToPlayer())
- player->AreaExploredOrEventHappens(4866);
- }
- }
-
- ScriptedAI::MoveInLineOfSight(who);
- }
-
- void EnterCombat(Unit* /*who*/) {}
- };
-};
void AddSC_burning_steppes()
{
- new npc_ragged_john();
+
}
diff --git a/src/server/scripts/EasternKingdoms/zone_ghostlands.cpp b/src/server/scripts/EasternKingdoms/zone_ghostlands.cpp
index 09bf6feaccd..23e67b63a1a 100644
--- a/src/server/scripts/EasternKingdoms/zone_ghostlands.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_ghostlands.cpp
@@ -19,13 +19,11 @@
/* ScriptData
SDName: Ghostlands
SD%Complete: 100
-SDComment: Quest support: 9692, 9212. Obtain Budd's Guise of Zul'aman. Vendor Rathis Tomber
+SDComment:
SDCategory: Ghostlands
EndScriptData */
/* ContentData
-npc_blood_knight_dawnstar
-npc_budd_nedreck
npc_rathis_tomber
npc_ranger_lilatha
EndContentData */
@@ -38,41 +36,6 @@ EndContentData */
#include "WorldSession.h"
/*######
-## npc_budd_nedreck
-######*/
-
-#define GOSSIP_HBN "You gave the crew disguises?"
-
-class npc_budd_nedreck : public CreatureScript
-{
-public:
- npc_budd_nedreck() : CreatureScript("npc_budd_nedreck") { }
-
- bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action)
- {
- player->PlayerTalkClass->ClearMenus();
- if (action == GOSSIP_ACTION_INFO_DEF)
- {
- player->CLOSE_GOSSIP_MENU();
- creature->CastSpell(player, 42540, false);
- }
- return true;
- }
-
- bool OnGossipHello(Player* player, Creature* creature)
- {
- if (creature->IsQuestGiver())
- player->PrepareQuestMenu(creature->GetGUID());
-
- if (player->GetQuestStatus(11166) == QUEST_STATUS_INCOMPLETE)
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_HBN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
-
- player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID());
- return true;
- }
-};
-
-/*######
## npc_rathis_tomber
######*/
@@ -98,8 +61,9 @@ public:
{
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE);
player->SEND_GOSSIP_MENU(8432, creature->GetGUID());
- }else
- player->SEND_GOSSIP_MENU(8431, creature->GetGUID());
+ }
+ else
+ player->SEND_GOSSIP_MENU(8431, creature->GetGUID());
return true;
}
@@ -219,7 +183,6 @@ public:
void AddSC_ghostlands()
{
- new npc_budd_nedreck();
new npc_rathis_tomber();
new npc_ranger_lilatha();
}
diff --git a/src/server/scripts/EasternKingdoms/zone_hinterlands.cpp b/src/server/scripts/EasternKingdoms/zone_hinterlands.cpp
index ffd31937677..8373b20bc66 100644
--- a/src/server/scripts/EasternKingdoms/zone_hinterlands.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_hinterlands.cpp
@@ -19,13 +19,12 @@
/* ScriptData
SDName: Hinterlands
SD%Complete: 100
-SDComment: Quest support: 863, 2742
+SDComment: Quest support: 836
SDCategory: The Hinterlands
EndScriptData */
/* ContentData
npc_00x09hl
-npc_rinji
EndContentData */
#include "ScriptMgr.h"
@@ -147,206 +146,7 @@ public:
};
};
-/*######
-## npc_rinji
-######*/
-
-enum eRinji
-{
- SAY_RIN_BY_OUTRUNNER = 0,
-
- SAY_RIN_FREE = 0, //from here
- SAY_RIN_HELP = 1,
- SAY_RIN_COMPLETE = 2,
- SAY_RIN_PROGRESS_1 = 3,
- SAY_RIN_PROGRESS_2 = 4,
-
- QUEST_RINJI_TRAPPED = 2742,
- NPC_RANGER = 2694,
- NPC_OUTRUNNER = 2691,
- GO_RINJI_CAGE = 142036
-};
-
-struct Location
-{
- float m_fX, m_fY, m_fZ;
-};
-
-Location m_afAmbushSpawn[] =
-{
- {191.296204f, -2839.329346f, 107.388f},
- {70.972466f, -2848.674805f, 109.459f}
-};
-
-Location m_afAmbushMoveTo[] =
-{
- {166.630386f, -2824.780273f, 108.153f},
- {70.886589f, -2874.335449f, 116.675f}
-};
-
-class npc_rinji : public CreatureScript
-{
-public:
- npc_rinji() : CreatureScript("npc_rinji") { }
-
- bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest)
- {
- if (quest->GetQuestId() == QUEST_RINJI_TRAPPED)
- {
- if (GameObject* go = creature->FindNearestGameObject(GO_RINJI_CAGE, INTERACTION_DISTANCE))
- go->UseDoorOrButton();
-
- if (npc_rinjiAI* pEscortAI = CAST_AI(npc_rinji::npc_rinjiAI, creature->AI()))
- pEscortAI->Start(false, false, player->GetGUID(), quest);
- }
- return true;
- }
-
- CreatureAI* GetAI(Creature* creature) const
- {
- return new npc_rinjiAI(creature);
- }
-
- struct npc_rinjiAI : public npc_escortAI
- {
- npc_rinjiAI(Creature* creature) : npc_escortAI(creature)
- {
- m_bIsByOutrunner = false;
- m_iSpawnId = 0;
- }
-
- bool m_bIsByOutrunner;
- uint32 m_uiPostEventCount;
- uint32 m_uiPostEventTimer;
- int m_iSpawnId;
-
- void Reset()
- {
- m_uiPostEventCount = 0;
- m_uiPostEventTimer = 3000;
- }
-
- void JustRespawned()
- {
- m_bIsByOutrunner = false;
- m_iSpawnId = 0;
-
- npc_escortAI::JustRespawned();
- }
-
- void EnterCombat(Unit* who)
- {
- if (HasEscortState(STATE_ESCORT_ESCORTING))
- {
- if (who->GetEntry() == NPC_OUTRUNNER && !m_bIsByOutrunner)
- {
- if (Creature* talker = who->ToCreature())
- talker->AI()->Talk(SAY_RIN_BY_OUTRUNNER);
- m_bIsByOutrunner = true;
- }
-
- if (rand()%4)
- return;
-
- //only if attacked and escorter is not in combat?
- Talk(SAY_RIN_HELP);
- }
- }
-
- void DoSpawnAmbush(bool bFirst)
- {
- if (!bFirst)
- m_iSpawnId = 1;
-
- me->SummonCreature(NPC_RANGER,
- m_afAmbushSpawn[m_iSpawnId].m_fX, m_afAmbushSpawn[m_iSpawnId].m_fY, m_afAmbushSpawn[m_iSpawnId].m_fZ, 0.0f,
- TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 60000);
-
- for (int i = 0; i < 2; ++i)
- {
- me->SummonCreature(NPC_OUTRUNNER,
- m_afAmbushSpawn[m_iSpawnId].m_fX, m_afAmbushSpawn[m_iSpawnId].m_fY, m_afAmbushSpawn[m_iSpawnId].m_fZ, 0.0f,
- TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 60000);
- }
- }
-
- void JustSummoned(Creature* summoned)
- {
- summoned->SetWalk(false);
- summoned->GetMotionMaster()->MovePoint(0, m_afAmbushMoveTo[m_iSpawnId].m_fX, m_afAmbushMoveTo[m_iSpawnId].m_fY, m_afAmbushMoveTo[m_iSpawnId].m_fZ);
- }
-
- void WaypointReached(uint32 waypointId)
- {
- Player* player = GetPlayerForEscort();
- if (!player)
- return;
-
- switch (waypointId)
- {
- case 1:
- Talk(SAY_RIN_FREE, player->GetGUID());
- break;
- case 7:
- DoSpawnAmbush(true);
- break;
- case 13:
- DoSpawnAmbush(false);
- break;
- case 17:
- Talk(SAY_RIN_COMPLETE, player->GetGUID());
- player->GroupEventHappens(QUEST_RINJI_TRAPPED, me);
- SetRun();
- m_uiPostEventCount = 1;
- break;
- }
- }
-
- void UpdateEscortAI(const uint32 uiDiff)
- {
- //Check if we have a current target
- if (!UpdateVictim())
- {
- if (HasEscortState(STATE_ESCORT_ESCORTING) && m_uiPostEventCount)
- {
- if (m_uiPostEventTimer <= uiDiff)
- {
- m_uiPostEventTimer = 3000;
-
- if (Player* player = GetPlayerForEscort())
- {
- switch (m_uiPostEventCount)
- {
- case 1:
- Talk(SAY_RIN_PROGRESS_1, player->GetGUID());
- ++m_uiPostEventCount;
- break;
- case 2:
- Talk(SAY_RIN_PROGRESS_2, player->GetGUID());
- m_uiPostEventCount = 0;
- break;
- }
- }
- else
- {
- me->DespawnOrUnsummon();
- return;
- }
- }
- else
- m_uiPostEventTimer -= uiDiff;
- }
-
- return;
- }
-
- DoMeleeAttackIfReady();
- }
- };
-};
-
void AddSC_hinterlands()
{
new npc_00x09hl();
- new npc_rinji();
}
diff --git a/src/server/scripts/EasternKingdoms/zone_ironforge.cpp b/src/server/scripts/EasternKingdoms/zone_ironforge.cpp
index 9a6cbb74ee5..fb5758fa5cf 100644
--- a/src/server/scripts/EasternKingdoms/zone_ironforge.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_ironforge.cpp
@@ -18,13 +18,12 @@
/* ScriptData
SDName: Ironforge
-SD%Complete: 100
-SDComment: Quest support: 3702
+SD%Complete: 0
+SDComment:
SDCategory: Ironforge
EndScriptData */
/* ContentData
-npc_royal_historian_archesonus
EndContentData */
#include "ScriptMgr.h"
@@ -32,68 +31,6 @@ EndContentData */
#include "ScriptedGossip.h"
#include "Player.h"
-/*######
-## npc_royal_historian_archesonus
-######*/
-
-#define GOSSIP_ITEM_ROYAL "I am ready to listen"
-#define GOSSIP_ITEM_ROYAL_1 "That is tragic. How did this happen?"
-#define GOSSIP_ITEM_ROYAL_2 "Interesting, continue please."
-#define GOSSIP_ITEM_ROYAL_3 "Unbelievable! How dare they??"
-#define GOSSIP_ITEM_ROYAL_4 "Of course I will help!"
-
-class npc_royal_historian_archesonus : public CreatureScript
-{
-public:
- npc_royal_historian_archesonus() : CreatureScript("npc_royal_historian_archesonus") { }
-
- bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action)
- {
- player->PlayerTalkClass->ClearMenus();
- switch (action)
- {
- case GOSSIP_ACTION_INFO_DEF:
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_ROYAL_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
- player->SEND_GOSSIP_MENU(2236, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+1:
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_ROYAL_2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
- player->SEND_GOSSIP_MENU(2237, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+2:
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_ROYAL_3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3);
- player->SEND_GOSSIP_MENU(2238, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+3:
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_ROYAL_4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4);
- player->SEND_GOSSIP_MENU(2239, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+4:
- player->CLOSE_GOSSIP_MENU();
- player->AreaExploredOrEventHappens(3702);
- break;
- }
- return true;
- }
-
- bool OnGossipHello(Player* player, Creature* creature)
- {
- if (creature->IsQuestGiver())
- player->PrepareQuestMenu(creature->GetGUID());
-
- if (player->GetQuestStatus(3702) == QUEST_STATUS_INCOMPLETE)
- {
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_ROYAL, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
- player->SEND_GOSSIP_MENU(2235, creature->GetGUID());
- }
- else
- player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID());
-
- return true;
- }
-};
-
void AddSC_ironforge()
{
- new npc_royal_historian_archesonus();
}
diff --git a/src/server/scripts/EasternKingdoms/zone_loch_modan.cpp b/src/server/scripts/EasternKingdoms/zone_loch_modan.cpp
index 5fb970fb98d..c9ad06b919c 100644
--- a/src/server/scripts/EasternKingdoms/zone_loch_modan.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_loch_modan.cpp
@@ -18,13 +18,12 @@
/* ScriptData
SDName: Loch_Modan
-SD%Complete: 100
-SDComment: Quest support: 3181
+SD%Complete: 0
+SDComment:
SDCategory: Loch Modan
EndScriptData */
/* ContentData
-npc_mountaineer_pebblebitty
EndContentData */
#include "ScriptMgr.h"
@@ -32,75 +31,6 @@ EndContentData */
#include "ScriptedGossip.h"
#include "Player.h"
-/*######
-## npc_mountaineer_pebblebitty
-######*/
-
-#define GOSSIP_MP "Open the gate please, i need to get to Searing Gorge"
-
-#define GOSSIP_MP1 "But i need to get there, now open the gate!"
-#define GOSSIP_MP2 "Ok, so what is this other way?"
-#define GOSSIP_MP3 "Doesn't matter, i'm invulnerable."
-#define GOSSIP_MP4 "Yes..."
-#define GOSSIP_MP5 "Ok, i'll try to remember that."
-#define GOSSIP_MP6 "A key? Ok!"
-
-class npc_mountaineer_pebblebitty : public CreatureScript
-{
-public:
- npc_mountaineer_pebblebitty() : CreatureScript("npc_mountaineer_pebblebitty") { }
-
- bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action)
- {
- player->PlayerTalkClass->ClearMenus();
- switch (action)
- {
- case GOSSIP_ACTION_INFO_DEF+1:
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_MP1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
- player->SEND_GOSSIP_MENU(1833, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+2:
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_MP2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3);
- player->SEND_GOSSIP_MENU(1834, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+3:
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_MP3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4);
- player->SEND_GOSSIP_MENU(1835, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+4:
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_MP4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5);
- player->SEND_GOSSIP_MENU(1836, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+5:
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_MP5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 6);
- player->SEND_GOSSIP_MENU(1837, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+6:
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_MP6, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 7);
- player->SEND_GOSSIP_MENU(1838, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+7:
- player->CLOSE_GOSSIP_MENU();
- break;
- }
- return true;
- }
-
- bool OnGossipHello(Player* player, Creature* creature)
- {
- if (creature->IsQuestGiver())
- player->PrepareQuestMenu(creature->GetGUID());
-
- if (!player->GetQuestRewardStatus(3181) == 1)
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_MP, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
-
- player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID());
-
- return true;
- }
-};
-
void AddSC_loch_modan()
{
- new npc_mountaineer_pebblebitty();
}
diff --git a/src/server/scripts/EasternKingdoms/zone_redridge_mountains.cpp b/src/server/scripts/EasternKingdoms/zone_redridge_mountains.cpp
index 55e1294d9e7..9f1c33e0b1e 100644
--- a/src/server/scripts/EasternKingdoms/zone_redridge_mountains.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_redridge_mountains.cpp
@@ -17,8 +17,8 @@
/* Script Data Start
SDName: Redridge Mountains
-SD%Complete: 100%
-SDComment: Support for quest 219.
+SD%Complete: 0
+SDComment:
Script Data End */
#include "ScriptMgr.h"
@@ -26,148 +26,6 @@ Script Data End */
#include "ScriptedEscortAI.h"
#include "Player.h"
-enum eCorporalKeeshan
-{
- QUEST_MISSING_IN_ACTION = 219,
-
- SAY_CORPORAL_1 = 0,
- SAY_CORPORAL_2 = 1,
- SAY_CORPORAL_3 = 2,
- SAY_CORPORAL_4 = 3,
- SAY_CORPORAL_5 = 4,
-
- SPELL_MOCKING_BLOW = 21008,
- SPELL_SHIELD_BASH = 11972,
-};
-
-class npc_corporal_keeshan : public CreatureScript
-{
-public:
- npc_corporal_keeshan() : CreatureScript("npc_corporal_keeshan") { }
-
- bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest)
- {
- if (quest->GetQuestId() == QUEST_MISSING_IN_ACTION)
- {
- CAST_AI(npc_corporal_keeshan::npc_corporal_keeshanAI, creature->AI())->Start(true, false, player->GetGUID(), quest);
- creature->AI()->Talk(SAY_CORPORAL_1);
- }
-
- return false;
- }
-
- CreatureAI* GetAI(Creature* creature) const
- {
- return new npc_corporal_keeshanAI(creature);
- }
-
- struct npc_corporal_keeshanAI : public npc_escortAI
- {
- npc_corporal_keeshanAI(Creature* creature) : npc_escortAI(creature) {}
-
- uint32 uiPhase;
- uint32 uiTimer;
- uint32 uiMockingBlowTimer;
- uint32 uiShieldBashTimer;
-
- void Reset()
- {
- uiTimer = 0;
- uiPhase = 0;
- uiMockingBlowTimer = 5000;
- uiShieldBashTimer = 8000;
- }
-
- void WaypointReached(uint32 waypointId)
- {
- Player* player = GetPlayerForEscort();
- if (!player)
- return;
-
- if (waypointId >= 65)
- me->SetWalk(false);
-
- switch (waypointId)
- {
- case 39:
- SetEscortPaused(true);
- uiTimer = 2000;
- uiPhase = 1;
- break;
- case 65:
- me->SetWalk(false);
- break;
- case 115:
- player->AreaExploredOrEventHappens(QUEST_MISSING_IN_ACTION);
- uiTimer = 2000;
- uiPhase = 4;
- break;
- }
- }
-
- void UpdateAI(uint32 uiDiff)
- {
- if (HasEscortState(STATE_ESCORT_NONE))
- return;
-
- npc_escortAI::UpdateAI(uiDiff);
-
- if (uiPhase)
- {
- if (uiTimer <= uiDiff)
- {
- switch (uiPhase)
- {
- case 1:
- me->SetStandState(UNIT_STAND_STATE_SIT);
- uiTimer = 1000;
- uiPhase = 2;
- break;
- case 2:
- Talk(SAY_CORPORAL_2);
- uiTimer = 15000;
- uiPhase = 3;
- break;
- case 3:
- Talk(SAY_CORPORAL_3);
- me->SetStandState(UNIT_STAND_STATE_STAND);
- SetEscortPaused(false);
- uiTimer = 0;
- uiPhase = 0;
- break;
- case 4:
- Talk(SAY_CORPORAL_4);
- uiTimer = 2500;
- uiPhase = 5;
- case 5:
- Talk(SAY_CORPORAL_5);
- uiTimer = 0;
- uiPhase = 0;
- }
- } else uiTimer -= uiDiff;
- }
-
- if (!UpdateVictim())
- return;
-
- if (uiMockingBlowTimer <= uiDiff)
- {
- DoCastVictim(SPELL_MOCKING_BLOW);
- uiMockingBlowTimer = 5000;
- } else uiMockingBlowTimer -= uiDiff;
-
- if (uiShieldBashTimer <= uiDiff)
- {
- DoCastVictim(SPELL_MOCKING_BLOW);
- uiShieldBashTimer = 8000;
- } else uiShieldBashTimer -= uiDiff;
-
- DoMeleeAttackIfReady();
- }
- };
-};
-
void AddSC_redridge_mountains()
{
- new npc_corporal_keeshan();
}
diff --git a/src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp b/src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp
index c7b35df41fd..5c7ff632c3e 100644
--- a/src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp
@@ -19,13 +19,12 @@
/* ScriptData
SDName: Silverpine_Forest
SD%Complete: 100
-SDComment: Quest support: 435, 452
+SDComment: Quest support: 435
SDCategory: Silverpine Forest
EndScriptData */
/* ContentData
npc_deathstalker_erland
-pyrewood_ambush
EndContentData */
#include "ScriptMgr.h"
@@ -136,192 +135,10 @@ public:
};
/*######
-## pyrewood_ambush
-#######*/
-
-#define QUEST_PYREWOOD_AMBUSH 452
-
-#define NPCSAY_INIT "Get ready, they'll be arriving any minute..." //not blizzlike
-#define NPCSAY_END "Thanks for your help!" //not blizzlike
-
-static float PyrewoodSpawnPoints[3][4] =
-{
- //pos_x pos_y pos_z orien
- //outside
- /*
- {-400.85f, 1513.64f, 18.67f, 0},
- {-397.32f, 1514.12f, 18.67f, 0},
- {-397.44f, 1511.09f, 18.67f, 0},
- */
- //door
- {-396.17f, 1505.86f, 19.77f, 0},
- {-396.91f, 1505.77f, 19.77f, 0},
- {-397.94f, 1504.74f, 19.77f, 0},
-};
-
-#define WAIT_SECS 6000
-
-class pyrewood_ambush : public CreatureScript
-{
-public:
- pyrewood_ambush() : CreatureScript("pyrewood_ambush") { }
-
- bool OnQuestAccept(Player* player, Creature* creature, const Quest *quest)
- {
- if (quest->GetQuestId() == QUEST_PYREWOOD_AMBUSH && !CAST_AI(pyrewood_ambush::pyrewood_ambushAI, creature->AI())->QuestInProgress)
- {
- CAST_AI(pyrewood_ambush::pyrewood_ambushAI, creature->AI())->QuestInProgress = true;
- CAST_AI(pyrewood_ambush::pyrewood_ambushAI, creature->AI())->Phase = 0;
- CAST_AI(pyrewood_ambush::pyrewood_ambushAI, creature->AI())->KillCount = 0;
- CAST_AI(pyrewood_ambush::pyrewood_ambushAI, creature->AI())->PlayerGUID = player->GetGUID();
- }
-
- return true;
- }
-
- CreatureAI* GetAI(Creature* creature) const
- {
- return new pyrewood_ambushAI (creature);
- }
-
- struct pyrewood_ambushAI : public ScriptedAI
- {
- pyrewood_ambushAI(Creature* creature) : ScriptedAI(creature), Summons(me)
- {
- QuestInProgress = false;
- }
-
- uint32 Phase;
- int8 KillCount;
- uint32 WaitTimer;
- uint64 PlayerGUID;
- SummonList Summons;
-
- bool QuestInProgress;
-
- void Reset()
- {
- WaitTimer = WAIT_SECS;
-
- if (!QuestInProgress) //fix reset values (see UpdateVictim)
- {
- Phase = 0;
- KillCount = 0;
- PlayerGUID = 0;
- Summons.DespawnAll();
- }
- }
-
- void EnterCombat(Unit* /*who*/){}
-
- void JustSummoned(Creature* summoned)
- {
- Summons.Summon(summoned);
- ++KillCount;
- }
-
- void SummonedCreatureDespawn(Creature* summoned)
- {
- Summons.Despawn(summoned);
- --KillCount;
- }
-
- void SummonCreatureWithRandomTarget(uint32 creatureId, int position)
- {
- if (Creature* summoned = me->SummonCreature(creatureId, PyrewoodSpawnPoints[position][0], PyrewoodSpawnPoints[position][1], PyrewoodSpawnPoints[position][2], PyrewoodSpawnPoints[position][3], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 15000))
- {
- Unit* target = NULL;
- if (PlayerGUID)
- if (Player* player = Unit::GetPlayer(*me, PlayerGUID))
- if (player->IsAlive() && RAND(0, 1))
- target = player;
-
- if (!target)
- target = me;
-
- summoned->setFaction(168);
- summoned->AddThreat(target, 32.0f);
- summoned->AI()->AttackStart(target);
- }
- }
-
- void JustDied(Unit* /*killer*/)
- {
- if (PlayerGUID)
- if (Player* player = Unit::GetPlayer(*me, PlayerGUID))
- if (player->GetQuestStatus(QUEST_PYREWOOD_AMBUSH) == QUEST_STATUS_INCOMPLETE)
- player->FailQuest(QUEST_PYREWOOD_AMBUSH);
- }
-
- void UpdateAI(uint32 diff)
- {
- //TC_LOG_INFO(LOG_FILTER_TSCR, "DEBUG: p(%i) k(%i) d(%u) W(%i)", Phase, KillCount, diff, WaitTimer);
-
- if (!QuestInProgress)
- return;
-
- if (KillCount && Phase < 6)
- {
- if (!UpdateVictim()) //reset() on target Despawn...
- return;
-
- DoMeleeAttackIfReady();
- return;
- }
-
- switch (Phase)
- {
- case 0:
- if (WaitTimer == WAIT_SECS)
- me->MonsterSay(NPCSAY_INIT, LANG_UNIVERSAL, 0); //no blizzlike
-
- if (WaitTimer <= diff)
- {
- WaitTimer -= diff;
- return;
- }
- break;
- case 1:
- SummonCreatureWithRandomTarget(2060, 1);
- break;
- case 2:
- SummonCreatureWithRandomTarget(2061, 2);
- SummonCreatureWithRandomTarget(2062, 0);
- break;
- case 3:
- SummonCreatureWithRandomTarget(2063, 1);
- SummonCreatureWithRandomTarget(2064, 2);
- SummonCreatureWithRandomTarget(2065, 0);
- break;
- case 4:
- SummonCreatureWithRandomTarget(2066, 1);
- SummonCreatureWithRandomTarget(2067, 0);
- SummonCreatureWithRandomTarget(2068, 2);
- break;
- case 5: //end
- if (PlayerGUID)
- {
- if (Player* player = Unit::GetPlayer(*me, PlayerGUID))
- {
- me->MonsterSay(NPCSAY_END, LANG_UNIVERSAL, 0); //not blizzlike
- player->GroupEventHappens(QUEST_PYREWOOD_AMBUSH, me);
- }
- }
- QuestInProgress = false;
- Reset();
- break;
- }
- ++Phase; //prepare next phase
- }
- };
-};
-
-/*######
## AddSC
######*/
void AddSC_silverpine_forest()
{
new npc_deathstalker_erland();
- new pyrewood_ambush();
}
diff --git a/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp b/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp
index a7074eea114..72520cf8dea 100644
--- a/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp
@@ -16,632 +16,6 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/* ScriptData
-SDName: Stormwind_City
-SD%Complete: 100
-SDComment: Quest support: 1640, 1447, 4185, 11223, 434.
-SDCategory: Stormwind City
-EndScriptData */
-
-/* ContentData
-npc_archmage_malin
-npc_bartleby
-npc_lady_katrana_prestor
-npc_tyrion
-npc_tyrion_spybot
-npc_marzon_silent_blade
-npc_lord_gregor_lescovar
-EndContentData */
-
-#include "ScriptMgr.h"
-#include "ScriptedCreature.h"
-#include "ScriptedGossip.h"
-#include "ScriptedEscortAI.h"
-#include "Player.h"
-
-/*######
-## npc_archmage_malin
-######*/
-
-#define GOSSIP_ITEM_MALIN "Can you send me to Theramore? I have an urgent message for Lady Jaina from Highlord Bolvar."
-
-class npc_archmage_malin : public CreatureScript
-{
-public:
- npc_archmage_malin() : CreatureScript("npc_archmage_malin") { }
-
- bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action)
- {
- player->PlayerTalkClass->ClearMenus();
- if (action == GOSSIP_ACTION_INFO_DEF)
- {
- player->CLOSE_GOSSIP_MENU();
- creature->CastSpell(player, 42711, true);
- }
-
- return true;
- }
-
- bool OnGossipHello(Player* player, Creature* creature)
- {
- if (creature->IsQuestGiver())
- player->PrepareQuestMenu(creature->GetGUID());
-
- if (player->GetQuestStatus(11223) == QUEST_STATUS_COMPLETE)
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_MALIN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
-
- player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID());
-
- return true;
- }
-};
-
-/*######
-## npc_bartleby
-######*/
-
-enum eBartleby
-{
- FACTION_ENEMY = 168,
- QUEST_BEAT = 1640
-};
-
-class npc_bartleby : public CreatureScript
-{
-public:
- npc_bartleby() : CreatureScript("npc_bartleby") { }
-
- bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest)
- {
- if (quest->GetQuestId() == QUEST_BEAT)
- {
- creature->setFaction(FACTION_ENEMY);
- creature->AI()->AttackStart(player);
- }
- return true;
- }
-
- CreatureAI* GetAI(Creature* creature) const
- {
- return new npc_bartlebyAI(creature);
- }
-
- struct npc_bartlebyAI : public ScriptedAI
- {
- npc_bartlebyAI(Creature* creature) : ScriptedAI(creature)
- {
- m_uiNormalFaction = creature->getFaction();
- }
-
- uint32 m_uiNormalFaction;
-
- void Reset()
- {
- if (me->getFaction() != m_uiNormalFaction)
- me->setFaction(m_uiNormalFaction);
- }
-
- void AttackedBy(Unit* pAttacker)
- {
- if (me->GetVictim())
- return;
-
- if (me->IsFriendlyTo(pAttacker))
- return;
-
- AttackStart(pAttacker);
- }
-
- void DamageTaken(Unit* pDoneBy, uint32 &uiDamage)
- {
- if (uiDamage > me->GetHealth() || me->HealthBelowPctDamaged(15, uiDamage))
- {
- //Take 0 damage
- uiDamage = 0;
-
- if (Player* player = pDoneBy->ToPlayer())
- player->AreaExploredOrEventHappens(QUEST_BEAT);
- EnterEvadeMode();
- }
- }
- };
-};
-
-/*######
-## npc_lady_katrana_prestor
-######*/
-
-#define GOSSIP_ITEM_KAT_1 "Pardon the intrusion, Lady Prestor, but Highlord Bolvar suggested that I seek your advice."
-#define GOSSIP_ITEM_KAT_2 "My apologies, Lady Prestor."
-#define GOSSIP_ITEM_KAT_3 "Begging your pardon, Lady Prestor. That was not my intent."
-#define GOSSIP_ITEM_KAT_4 "Thank you for your time, Lady Prestor."
-
-class npc_lady_katrana_prestor : public CreatureScript
-{
-public:
- npc_lady_katrana_prestor() : CreatureScript("npc_lady_katrana_prestor") { }
-
- bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action)
- {
- player->PlayerTalkClass->ClearMenus();
- switch (action)
- {
- case GOSSIP_ACTION_INFO_DEF:
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_KAT_2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
- player->SEND_GOSSIP_MENU(2694, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+1:
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_KAT_3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
- player->SEND_GOSSIP_MENU(2695, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+2:
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_KAT_4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3);
- player->SEND_GOSSIP_MENU(2696, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+3:
- player->CLOSE_GOSSIP_MENU();
- player->AreaExploredOrEventHappens(4185);
- break;
- }
- return true;
- }
-
- bool OnGossipHello(Player* player, Creature* creature)
- {
- if (creature->IsQuestGiver())
- player->PrepareQuestMenu(creature->GetGUID());
-
- if (player->GetQuestStatus(4185) == QUEST_STATUS_INCOMPLETE)
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_KAT_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
-
- player->SEND_GOSSIP_MENU(2693, creature->GetGUID());
-
- return true;
- }
-};
-
-/*######
-## npc_lord_gregor_lescovar
-######*/
-
-enum eLordGregorLescovar
-{
- SAY_GUARD_2 = 0,
- SAY_LESCOVAR_2 = 0,
- SAY_LESCOVAR_3 = 1,
- SAY_LESCOVAR_4 = 2,
- SAY_MARZON_1 = 0,
- SAY_MARZON_2 = 1,
- SAY_TYRION_2 = 1,
-
- NPC_STORMWIND_ROYAL = 1756,
- NPC_MARZON_BLADE = 1755,
- NPC_TYRION = 7766,
-
- QUEST_THE_ATTACK = 434
-};
-
-class npc_lord_gregor_lescovar : public CreatureScript
-{
-public:
- npc_lord_gregor_lescovar() : CreatureScript("npc_lord_gregor_lescovar") { }
-
- CreatureAI* GetAI(Creature* creature) const
- {
- return new npc_lord_gregor_lescovarAI(creature);
- }
-
- struct npc_lord_gregor_lescovarAI : public npc_escortAI
- {
- npc_lord_gregor_lescovarAI(Creature* creature) : npc_escortAI(creature)
- {
- creature->RestoreFaction();
- }
-
- uint32 uiTimer;
- uint32 uiPhase;
-
- uint64 MarzonGUID;
-
- void Reset()
- {
- uiTimer = 0;
- uiPhase = 0;
-
- MarzonGUID = 0;
- }
-
- void EnterEvadeMode()
- {
- me->DisappearAndDie();
-
- if (Creature* pMarzon = Unit::GetCreature(*me, MarzonGUID))
- {
- if (pMarzon->IsAlive())
- pMarzon->DisappearAndDie();
- }
- }
-
- void EnterCombat(Unit* who)
- {
- if (Creature* pMarzon = Unit::GetCreature(*me, MarzonGUID))
- {
- if (pMarzon->IsAlive() && !pMarzon->IsInCombat())
- pMarzon->AI()->AttackStart(who);
- }
- }
-
- void WaypointReached(uint32 waypointId)
- {
- switch (waypointId)
- {
- case 14:
- SetEscortPaused(true);
- Talk(SAY_LESCOVAR_2);
- uiTimer = 3000;
- uiPhase = 1;
- break;
- case 16:
- SetEscortPaused(true);
- if (Creature* pMarzon = me->SummonCreature(NPC_MARZON_BLADE, -8411.360352f, 480.069733f, 123.760895f, 4.941504f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 1000))
- {
- pMarzon->GetMotionMaster()->MovePoint(0, -8408.000977f, 468.611450f, 123.759903f);
- MarzonGUID = pMarzon->GetGUID();
- }
- uiTimer = 2000;
- uiPhase = 4;
- break;
- }
- }
- //TO-DO: We don't have movemaps, also we can't make 2 npcs walks to one point propperly (and we can not use escort ai, because they are 2 different spawns and with same entry), because of it we make them, disappear.
- void DoGuardsDisappearAndDie()
- {
- std::list<Creature*> GuardList;
- me->GetCreatureListWithEntryInGrid(GuardList, NPC_STORMWIND_ROYAL, 8.0f);
- if (!GuardList.empty())
- {
- for (std::list<Creature*>::const_iterator itr = GuardList.begin(); itr != GuardList.end(); ++itr)
- {
- if (Creature* pGuard = *itr)
- pGuard->DisappearAndDie();
- }
- }
- }
-
- void UpdateAI(uint32 uiDiff)
- {
- if (uiPhase)
- {
- if (uiTimer <= uiDiff)
- {
- switch (uiPhase)
- {
- case 1:
- if (Creature* pGuard = me->FindNearestCreature(NPC_STORMWIND_ROYAL, 8.0f, true))
- pGuard->AI()->Talk(SAY_GUARD_2);
- uiTimer = 3000;
- uiPhase = 2;
- break;
- case 2:
- DoGuardsDisappearAndDie();
- uiTimer = 2000;
- uiPhase = 3;
- break;
- case 3:
- SetEscortPaused(false);
- uiTimer = 0;
- uiPhase = 0;
- break;
- case 4:
- Talk(SAY_LESCOVAR_3);
- uiTimer = 0;
- uiPhase = 0;
- break;
- case 5:
- if (Creature* pMarzon = Unit::GetCreature(*me, MarzonGUID))
- pMarzon->AI()->Talk(SAY_MARZON_1);
- uiTimer = 3000;
- uiPhase = 6;
- break;
- case 6:
- Talk(SAY_LESCOVAR_4);
- if (Player* player = GetPlayerForEscort())
- player->AreaExploredOrEventHappens(QUEST_THE_ATTACK);
- uiTimer = 2000;
- uiPhase = 7;
- break;
- case 7:
- if (Creature* pTyrion = me->FindNearestCreature(NPC_TYRION, 20.0f, true))
- pTyrion->AI()->Talk(SAY_TYRION_2);
- if (Creature* pMarzon = Unit::GetCreature(*me, MarzonGUID))
- pMarzon->setFaction(14);
- me->setFaction(14);
- uiTimer = 0;
- uiPhase = 0;
- break;
- }
- } else uiTimer -= uiDiff;
- }
- npc_escortAI::UpdateAI(uiDiff);
-
- if (!UpdateVictim())
- return;
-
- DoMeleeAttackIfReady();
- }
- };
-};
-
-/*######
-## npc_marzon_silent_blade
-######*/
-
-class npc_marzon_silent_blade : public CreatureScript
-{
-public:
- npc_marzon_silent_blade() : CreatureScript("npc_marzon_silent_blade") { }
-
- CreatureAI* GetAI(Creature* creature) const
- {
- return new npc_marzon_silent_bladeAI(creature);
- }
-
- struct npc_marzon_silent_bladeAI : public ScriptedAI
- {
- npc_marzon_silent_bladeAI(Creature* creature) : ScriptedAI(creature)
- {
- me->SetWalk(true);
- }
-
- void Reset()
- {
- me->RestoreFaction();
- }
-
- void EnterCombat(Unit* who)
- {
- Talk(SAY_MARZON_2);
-
- if (me->IsSummon())
- {
- if (Unit* summoner = me->ToTempSummon()->GetSummoner())
- {
- if (summoner->GetTypeId() == TYPEID_UNIT && summoner->IsAlive() && !summoner->IsInCombat())
- summoner->ToCreature()->AI()->AttackStart(who);
- }
- }
- }
-
- void EnterEvadeMode()
- {
- me->DisappearAndDie();
-
- if (me->IsSummon())
- {
- if (Unit* summoner = me->ToTempSummon()->GetSummoner())
- {
- if (summoner->GetTypeId() == TYPEID_UNIT && summoner->IsAlive())
- summoner->ToCreature()->DisappearAndDie();
- }
- }
- }
-
- void MovementInform(uint32 uiType, uint32 /*uiId*/)
- {
- if (uiType != POINT_MOTION_TYPE)
- return;
-
- if (me->IsSummon())
- {
- Unit* summoner = me->ToTempSummon()->GetSummoner();
- if (summoner && summoner->GetTypeId() == TYPEID_UNIT && summoner->IsAIEnabled)
- {
- npc_lord_gregor_lescovar::npc_lord_gregor_lescovarAI* ai =
- CAST_AI(npc_lord_gregor_lescovar::npc_lord_gregor_lescovarAI, summoner->GetAI());
- if (ai)
- {
- ai->uiTimer = 2000;
- ai->uiPhase = 5;
- }
- //me->ChangeOrient(0.0f, summoner);
- }
- }
- }
-
- void UpdateAI(uint32 /*diff*/)
- {
- if (!UpdateVictim())
- return;
-
- DoMeleeAttackIfReady();
- }
- };
-};
-
-/*######
-## npc_tyrion_spybot
-######*/
-
-enum eTyrionSpybot
-{
- SAY_QUEST_ACCEPT_ATTACK = 0,
- SAY_SPYBOT_1 = 1,
- SAY_SPYBOT_2 = 2,
- SAY_SPYBOT_3 = 3,
- SAY_SPYBOT_4 = 4,
- SAY_TYRION_1 = 0,
- SAY_GUARD_1 = 1,
- SAY_LESCOVAR_1 = 3,
-
- NPC_PRIESTESS_TYRIONA = 7779,
- NPC_LORD_GREGOR_LESCOVAR = 1754,
-};
-
-class npc_tyrion_spybot : public CreatureScript
-{
-public:
- npc_tyrion_spybot() : CreatureScript("npc_tyrion_spybot") { }
-
- CreatureAI* GetAI(Creature* creature) const
- {
- return new npc_tyrion_spybotAI(creature);
- }
-
- struct npc_tyrion_spybotAI : public npc_escortAI
- {
- npc_tyrion_spybotAI(Creature* creature) : npc_escortAI(creature) {}
-
- uint32 uiTimer;
- uint32 uiPhase;
-
- void Reset()
- {
- uiTimer = 0;
- uiPhase = 0;
- }
-
- void WaypointReached(uint32 waypointId)
- {
- switch (waypointId)
- {
- case 1:
- SetEscortPaused(true);
- uiTimer = 2000;
- uiPhase = 1;
- break;
- case 5:
- SetEscortPaused(true);
- Talk(SAY_SPYBOT_1);
- uiTimer = 2000;
- uiPhase = 5;
- break;
- case 17:
- SetEscortPaused(true);
- Talk(SAY_SPYBOT_3);
- uiTimer = 3000;
- uiPhase = 8;
- break;
- }
- }
-
- void UpdateAI(uint32 uiDiff)
- {
- if (uiPhase)
- {
- if (uiTimer <= uiDiff)
- {
- switch (uiPhase)
- {
- case 1:
- Talk(SAY_QUEST_ACCEPT_ATTACK);
- uiTimer = 3000;
- uiPhase = 2;
- break;
- case 2:
- if (Creature* pTyrion = me->FindNearestCreature(NPC_TYRION, 10.0f))
- pTyrion->AI()->Talk(SAY_TYRION_1);
- uiTimer = 3000;
- uiPhase = 3;
- break;
- case 3:
- me->UpdateEntry(NPC_PRIESTESS_TYRIONA, ALLIANCE);
- uiTimer = 2000;
- uiPhase = 4;
- break;
- case 4:
- SetEscortPaused(false);
- uiPhase = 0;
- uiTimer = 0;
- break;
- case 5:
- if (Creature* pGuard = me->FindNearestCreature(NPC_STORMWIND_ROYAL, 10.0f, true))
- pGuard->AI()->Talk(SAY_GUARD_1);
- uiTimer = 3000;
- uiPhase = 6;
- break;
- case 6:
- Talk(SAY_SPYBOT_2);
- uiTimer = 3000;
- uiPhase = 7;
- break;
- case 7:
- SetEscortPaused(false);
- uiTimer = 0;
- uiPhase = 0;
- break;
- case 8:
- if (Creature* pLescovar = me->FindNearestCreature(NPC_LORD_GREGOR_LESCOVAR, 10.0f))
- pLescovar->AI()->Talk(SAY_LESCOVAR_1);
- uiTimer = 3000;
- uiPhase = 9;
- break;
- case 9:
- Talk(SAY_SPYBOT_4);
- uiTimer = 3000;
- uiPhase = 10;
- break;
- case 10:
- if (Creature* pLescovar = me->FindNearestCreature(NPC_LORD_GREGOR_LESCOVAR, 10.0f))
- {
- if (Player* player = GetPlayerForEscort())
- {
- CAST_AI(npc_lord_gregor_lescovar::npc_lord_gregor_lescovarAI, pLescovar->AI())->Start(false, false, player->GetGUID());
- CAST_AI(npc_lord_gregor_lescovar::npc_lord_gregor_lescovarAI, pLescovar->AI())->SetMaxPlayerDistance(200.0f);
- }
- }
- me->DisappearAndDie();
- uiTimer = 0;
- uiPhase = 0;
- break;
- }
- } else uiTimer -= uiDiff;
- }
- npc_escortAI::UpdateAI(uiDiff);
-
- if (!UpdateVictim())
- return;
-
- DoMeleeAttackIfReady();
- }
- };
-};
-
-/*######
-## npc_tyrion
-######*/
-
-enum eTyrion
-{
- NPC_TYRION_SPYBOT = 8856
-};
-
-class npc_tyrion : public CreatureScript
-{
-public:
- npc_tyrion() : CreatureScript("npc_tyrion") { }
-
- bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest)
- {
- if (quest->GetQuestId() == QUEST_THE_ATTACK)
- {
- if (Creature* pSpybot = creature->FindNearestCreature(NPC_TYRION_SPYBOT, 5.0f, true))
- {
- CAST_AI(npc_tyrion_spybot::npc_tyrion_spybotAI, pSpybot->AI())->Start(false, false, player->GetGUID());
- CAST_AI(npc_tyrion_spybot::npc_tyrion_spybotAI, pSpybot->AI())->SetMaxPlayerDistance(200.0f);
- }
- return true;
- }
- return false;
- }
-};
-
void AddSC_stormwind_city()
{
- new npc_archmage_malin();
- new npc_bartleby();
- new npc_lady_katrana_prestor();
- new npc_tyrion();
- new npc_tyrion_spybot();
- new npc_lord_gregor_lescovar();
- new npc_marzon_silent_blade();
}
diff --git a/src/server/scripts/EasternKingdoms/zone_swamp_of_sorrows.cpp b/src/server/scripts/EasternKingdoms/zone_swamp_of_sorrows.cpp
index c7780bb0065..110cead529e 100644
--- a/src/server/scripts/EasternKingdoms/zone_swamp_of_sorrows.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_swamp_of_sorrows.cpp
@@ -16,140 +16,6 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#include "ScriptMgr.h"
-#include "ScriptedCreature.h"
-#include "ScriptedEscortAI.h"
-#include "Player.h"
-
-/*######
-## npc_galen_goodward
-######*/
-
-enum Galen
-{
- QUEST_GALENS_ESCAPE = 1393,
-
- GO_GALENS_CAGE = 37118,
-
- SAY_PERIODIC = 0,
- SAY_QUEST_ACCEPTED = 1,
- SAY_ATTACKED = 2,
- SAY_QUEST_COMPLETE = 3,
- EMOTE_WHISPER = 4,
- EMOTE_DISAPPEAR = 5,
-};
-
-class npc_galen_goodward : public CreatureScript
-{
-public:
-
- npc_galen_goodward() : CreatureScript("npc_galen_goodward") { }
-
- bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest)
- {
- if (quest->GetQuestId() == QUEST_GALENS_ESCAPE)
- {
- CAST_AI(npc_galen_goodward::npc_galen_goodwardAI, creature->AI())->Start(false, false, player->GetGUID());
- creature->setFaction(FACTION_ESCORT_N_NEUTRAL_ACTIVE);
- creature->AI()->Talk(SAY_QUEST_ACCEPTED);
- }
- return true;
- }
-
- CreatureAI* GetAI(Creature* creature) const
- {
- return new npc_galen_goodwardAI(creature);
- }
-
- struct npc_galen_goodwardAI : public npc_escortAI
- {
- npc_galen_goodwardAI(Creature* creature) : npc_escortAI(creature)
- {
- m_uiGalensCageGUID = 0;
- Reset();
- }
-
- uint64 m_uiGalensCageGUID;
- uint32 m_uiPeriodicSay;
-
- void Reset()
- {
- m_uiPeriodicSay = 6000;
- }
-
- void EnterCombat(Unit* who)
- {
- if (HasEscortState(STATE_ESCORT_ESCORTING))
- Talk(SAY_ATTACKED, who->GetGUID());
- }
-
- void WaypointStart(uint32 uiPointId)
- {
- switch (uiPointId)
- {
- case 0:
- {
- GameObject* pCage = NULL;
- if (m_uiGalensCageGUID)
- pCage = me->GetMap()->GetGameObject(m_uiGalensCageGUID);
- else
- pCage = GetClosestGameObjectWithEntry(me, GO_GALENS_CAGE, INTERACTION_DISTANCE);
- if (pCage)
- {
- pCage->UseDoorOrButton();
- m_uiGalensCageGUID = pCage->GetGUID();
- }
- break;
- }
- case 21:
- Talk(EMOTE_DISAPPEAR);
- break;
- }
- }
-
- void WaypointReached(uint32 waypointId)
- {
- switch (waypointId)
- {
- case 0:
- if (GameObject* pCage = me->GetMap()->GetGameObject(m_uiGalensCageGUID))
- pCage->ResetDoorOrButton();
- break;
- case 20:
- if (Player* player = GetPlayerForEscort())
- {
- me->SetFacingToObject(player);
- Talk(SAY_QUEST_COMPLETE, player->GetGUID());
- Talk(EMOTE_WHISPER, player->GetGUID());
- player->GroupEventHappens(QUEST_GALENS_ESCAPE, me);
- }
- SetRun(true);
- break;
- }
- }
-
- void UpdateAI(uint32 uiDiff)
- {
- npc_escortAI::UpdateAI(uiDiff);
-
- if (HasEscortState(STATE_ESCORT_NONE))
- return;
-
- if (m_uiPeriodicSay < uiDiff)
- {
- if (!HasEscortState(STATE_ESCORT_ESCORTING))
- Talk(SAY_PERIODIC);
- m_uiPeriodicSay = 15000;
- }
- else
- m_uiPeriodicSay -= uiDiff;
-
- DoMeleeAttackIfReady();
- }
- };
-};
-
void AddSC_swamp_of_sorrows()
{
- new npc_galen_goodward();
}
diff --git a/src/server/scripts/EasternKingdoms/zone_tirisfal_glades.cpp b/src/server/scripts/EasternKingdoms/zone_tirisfal_glades.cpp
index 347dea98966..903c88ad89a 100644
--- a/src/server/scripts/EasternKingdoms/zone_tirisfal_glades.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_tirisfal_glades.cpp
@@ -16,202 +16,6 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/* ScriptData
-SDName: Tirisfal_Glades
-SD%Complete: 100
-SDComment: Quest support: 590, 1819
-SDCategory: Tirisfal Glades
-EndScriptData */
-
-/* ContentData
-npc_calvin_montague
-go_mausoleum_door
-go_mausoleum_trigger
-EndContentData */
-
-#include "ScriptMgr.h"
-#include "ScriptedCreature.h"
-#include "Player.h"
-
-/*######
-## npc_calvin_montague
-######*/
-
-enum Calvin
-{
- SAY_COMPLETE = 0,
- SPELL_DRINK = 2639, // possibly not correct spell (but iconId is correct)
- QUEST_590 = 590,
- FACTION_HOSTILE = 168
-};
-
-class npc_calvin_montague : public CreatureScript
-{
-public:
- npc_calvin_montague() : CreatureScript("npc_calvin_montague") { }
-
- bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest)
- {
- if (quest->GetQuestId() == QUEST_590)
- {
- creature->setFaction(FACTION_HOSTILE);
- creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
- CAST_AI(npc_calvin_montague::npc_calvin_montagueAI, creature->AI())->AttackStart(player);
- }
- return true;
- }
-
- CreatureAI* GetAI(Creature* creature) const
- {
- return new npc_calvin_montagueAI (creature);
- }
-
- struct npc_calvin_montagueAI : public ScriptedAI
- {
- npc_calvin_montagueAI(Creature* creature) : ScriptedAI(creature) { }
-
- uint32 m_uiPhase;
- uint32 m_uiPhaseTimer;
- uint64 m_uiPlayerGUID;
-
- void Reset()
- {
- m_uiPhase = 0;
- m_uiPhaseTimer = 5000;
- m_uiPlayerGUID = 0;
-
- me->RestoreFaction();
-
- if (!me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC))
- me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
- }
-
- void EnterCombat(Unit* /*who*/) {}
-
- void AttackedBy(Unit* pAttacker)
- {
- if (me->GetVictim() || me->IsFriendlyTo(pAttacker))
- return;
-
- AttackStart(pAttacker);
- }
-
- void DamageTaken(Unit* pDoneBy, uint32 &uiDamage)
- {
- if (uiDamage > me->GetHealth() || me->HealthBelowPctDamaged(15, uiDamage))
- {
- uiDamage = 0;
-
- me->RestoreFaction();
- me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
- me->CombatStop(true);
-
- m_uiPhase = 1;
-
- if (pDoneBy->GetTypeId() == TYPEID_PLAYER)
- m_uiPlayerGUID = pDoneBy->GetGUID();
- }
- }
-
- void UpdateAI(uint32 diff)
- {
- if (m_uiPhase)
- {
- if (m_uiPhaseTimer <= diff)
- m_uiPhaseTimer = 7500;
- else
- {
- m_uiPhaseTimer -= diff;
- return;
- }
-
- switch (m_uiPhase)
- {
- case 1:
- Talk(SAY_COMPLETE);
- ++m_uiPhase;
- break;
- case 2:
- if (Player* player = Unit::GetPlayer(*me, m_uiPlayerGUID))
- player->AreaExploredOrEventHappens(QUEST_590);
-
- DoCast(me, SPELL_DRINK, true);
- ++m_uiPhase;
- break;
- case 3:
- EnterEvadeMode();
- break;
- }
-
- return;
- }
-
- if (!UpdateVictim())
- return;
-
- DoMeleeAttackIfReady();
- }
- };
-};
-
-/*######
-## go_mausoleum_door
-## go_mausoleum_trigger
-######*/
-
-enum eMausoleum
-{
- QUEST_ULAG = 1819,
- NPC_ULAG = 6390,
- GO_TRIGGER = 104593,
- GO_DOOR = 176594
-};
-
-class go_mausoleum_door : public GameObjectScript
-{
-public:
- go_mausoleum_door() : GameObjectScript("go_mausoleum_door") { }
-
- bool OnGossipHello(Player* player, GameObject* /*go*/)
- {
- if (player->GetQuestStatus(QUEST_ULAG) != QUEST_STATUS_INCOMPLETE)
- return false;
-
- if (GameObject* pTrigger = player->FindNearestGameObject(GO_TRIGGER, 30.0f))
- {
- pTrigger->SetGoState(GO_STATE_READY);
- player->SummonCreature(NPC_ULAG, 2390.26f, 336.47f, 40.01f, 2.26f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 300000);
- return false;
- }
-
- return false;
- }
-};
-
-class go_mausoleum_trigger : public GameObjectScript
-{
-public:
- go_mausoleum_trigger() : GameObjectScript("go_mausoleum_trigger") { }
-
- bool OnGossipHello(Player* player, GameObject* go)
- {
- if (player->GetQuestStatus(QUEST_ULAG) != QUEST_STATUS_INCOMPLETE)
- return false;
-
- if (GameObject* pDoor = player->FindNearestGameObject(GO_DOOR, 30.0f))
- {
- go->SetGoState(GO_STATE_ACTIVE);
- pDoor->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND);
- return true;
- }
-
- return false;
- }
-};
-
void AddSC_tirisfal_glades()
{
- new npc_calvin_montague();
- new go_mausoleum_door();
- new go_mausoleum_trigger();
}
diff --git a/src/server/scripts/Kalimdor/CMakeLists.txt b/src/server/scripts/Kalimdor/CMakeLists.txt
index 6a54d777c1e..0e7b1f6c2b6 100644
--- a/src/server/scripts/Kalimdor/CMakeLists.txt
+++ b/src/server/scripts/Kalimdor/CMakeLists.txt
@@ -111,6 +111,14 @@ set(scripts_STAT_SRCS
Kalimdor/OnyxiasLair/boss_onyxia.cpp
Kalimdor/OnyxiasLair/onyxias_lair.h
Kalimdor/OnyxiasLair/instance_onyxias_lair.cpp
+ Kalimdor/HallsOfOrigination/halls_of_origination.h
+ Kalimdor/HallsOfOrigination/instance_halls_of_origination.cpp
+ Kalimdor/HallsOfOrigination/boss_temple_guardian_anhuur.cpp
+ Kalimdor/HallsOfOrigination/boss_earthrager_ptah.cpp
+ Kalimdor/HallsOfOrigination/boss_anraphet.cpp
+ Kalimdor/Firelands/instance_firelands.cpp
+ Kalimdor/Firelands/firelands.h
+ Kalimdor/Firelands/boss_alysrazor.cpp
)
message(" -> Prepared: Kalimdor")
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/instance_hyjal.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/instance_hyjal.cpp
index abe6da8e363..4ca583e7831 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/instance_hyjal.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/instance_hyjal.cpp
@@ -30,6 +30,7 @@ EndScriptData */
#include "Player.h"
#include "WorldPacket.h"
#include "Opcodes.h"
+#include "WorldSession.h"
enum Misc
{
@@ -221,7 +222,8 @@ public:
i->GetSource()->GetSession()->SendPacket(&packet);
WorldPacket data2(SMSG_PLAY_SOUND, 4);
- data2 << 10986;
+ data2 << uint32(10986);
+ data2 << uint64(unit->GetGUID());
i->GetSource()->GetSession()->SendPacket(&data2);
}
}
diff --git a/src/server/scripts/Kalimdor/Firelands/boss_alysrazor.cpp b/src/server/scripts/Kalimdor/Firelands/boss_alysrazor.cpp
new file mode 100644
index 00000000000..e4b947d4603
--- /dev/null
+++ b/src/server/scripts/Kalimdor/Firelands/boss_alysrazor.cpp
@@ -0,0 +1,704 @@
+/*
+ * Copyright (C) 2008-2013 TrinityCore <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, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "ObjectMgr.h"
+#include "ScriptMgr.h"
+#include "ScriptedCreature.h"
+#include "PassiveAI.h"
+#include "SpellScript.h"
+#include "MoveSplineInit.h"
+#include "Cell.h"
+#include "CellImpl.h"
+#include "GridNotifiers.h"
+#include "GridNotifiersImpl.h"
+#include "firelands.h"
+
+enum Texts
+{
+ // Egg Pile
+ EMOTE_CRACKING_EGGS = 0, // The Molten Eggs begin to crack and splinter!
+};
+
+enum Spells
+{
+ // Harbinger of Flame
+ SPELL_FIRE_IT_UP = 100093,
+ SPELL_FIEROBLAST_TRASH = 100094,
+ SPELL_FIEROCLAST_BARRAGE = 100095,
+ SPELL_FIRE_CHANNELING = 100109,
+
+ // Blazing Monstrosity
+ SPELL_RIDE_MONSTROSITY = 93970,
+ SPELL_SHARE_HEALTH_LEFT = 101502,
+ SPELL_SHARE_HEALTH_RIGHT = 101503,
+ SPELL_SLEEP_ULTRA_HIGH_PRIORITY = 99480,
+ SPELL_GENERIC_DUMMY_CAST = 100088,
+ SPELL_LEFT_SIDE_SMACK_L = 100076,
+ SPELL_RIGHT_SIDE_SMACK_L = 100078,
+ SPELL_HEAD_BONK_L = 100080,
+ SPELL_TICKLE_L = 100082,
+ SPELL_KNOCKBACK_RIGHT = 100084,
+ SPELL_KNOCKBACK_LEFT = 100085,
+ SPELL_KNOCKBACK_FORWARD = 100086,
+ SPELL_KNOCKBACK_BACK = 100087,
+ SPELL_HEAD_BONK_R = 100089,
+ SPELL_LEFT_SIDE_SMACK_R = 100090,
+ SPELL_RIGHT_SIDE_SMACK_R = 100091,
+ SPELL_TICKLE_R = 100092,
+ SPELL_MOLTEN_BARRAGE_EFFECT_L = 100071,
+ SPELL_MOLTEN_BARRAGE_LEFT = 100072,
+ SPELL_MOLTEN_BARRAGE_RIGHT = 100073,
+ SPELL_MOLTEN_BARRAGE_EFFECT_R = 100074,
+ SPELL_MOLTEN_BARRAGE_VISUAL = 100075,
+ SPELL_AGGRO_CLOSEST = 100462,
+ SPELL_INVISIBILITY_AND_STEALTH_DETECTION = 18950,
+
+ // Egg Pile
+ SPELL_SUMMON_SMOULDERING_HATCHLING = 100096,
+ SPELL_MOLTEN_EGG_TRASH_CALL_L = 100097,
+ SPELL_MOLTEN_EGG_TRASH_CALL_R = 100098,
+ SPELL_ALYSRAZOR_COSMETIC_EGG_XPLOSION = 100099,
+};
+
+#define SPELL_SHARE_HEALTH (me->GetEntry() == NPC_BLAZING_MONSTROSITY_LEFT ? SPELL_SHARE_HEALTH_LEFT : SPELL_SHARE_HEALTH_RIGHT)
+#define SPELL_MOLTEN_BARRAGE (me->GetEntry() == NPC_BLAZING_MONSTROSITY_LEFT ? SPELL_MOLTEN_BARRAGE_LEFT : SPELL_MOLTEN_BARRAGE_RIGHT)
+#define SPELL_MOLTEN_BARRAGE_EFFECT (me->GetEntry() == NPC_BLAZING_MONSTROSITY_LEFT ? SPELL_MOLTEN_BARRAGE_EFFECT_L : SPELL_MOLTEN_BARRAGE_EFFECT_R)
+
+enum Events
+{
+ // Blazing Monstrosity
+ EVENT_START_SPITTING = 1,
+ EVENT_CONTINUE_SPITTING = 2,
+
+ // Harbinger of Flame
+ EVENT_FIEROBLAST = 1,
+ EVENT_FIEROCLAST_BARRAGE = 2,
+
+ // Egg Pile
+ EVENT_SUMMON_SMOULDERING_HATCHLING = 1,
+};
+
+enum MiscData
+{
+ MODEL_INVISIBLE_STALKER = 11686,
+ ANIM_KIT_BIRD_WAKE = 1469,
+ ANIM_KIT_BIRD_TURN = 1473,
+};
+
+class RespawnEggEvent : public BasicEvent
+{
+ public:
+ explicit RespawnEggEvent(Creature* egg) : _egg(egg) { }
+
+ bool Execute(uint64 /*time*/, uint32 /*diff*/)
+ {
+ _egg->RestoreDisplayId();
+ return true;
+ }
+
+ private:
+ Creature* _egg;
+};
+
+class MoltenEggCheck
+{
+ public:
+ explicit MoltenEggCheck(Creature* pile) : _eggPile(pile) { }
+
+ bool operator()(Unit* object) const
+ {
+ if (object->GetEntry() != NPC_MOLTEN_EGG_TRASH)
+ return false;
+
+ if (object->GetDisplayId() != object->GetNativeDisplayId())
+ return false;
+
+ if (_eggPile->GetDistance2d(object) > 20.0f)
+ return false;
+
+ return true;
+ }
+
+ private:
+ Creature* _eggPile;
+};
+
+class TrashRespawnWorker
+{
+ public:
+ void operator()(Creature* creature) const
+ {
+ switch (creature->GetEntry())
+ {
+ case NPC_BLAZING_MONSTROSITY_LEFT:
+ case NPC_BLAZING_MONSTROSITY_RIGHT:
+ case NPC_EGG_PILE:
+ case NPC_HARBINGER_OF_FLAME:
+ case NPC_MOLTEN_EGG_TRASH:
+ if (!creature->IsAlive())
+ creature->Respawn(true);
+ break;
+ case NPC_SMOULDERING_HATCHLING:
+ creature->DespawnOrUnsummon();
+ break;
+ }
+ }
+};
+
+static void AlysrazorTrashEvaded(Creature* creature)
+{
+ TrashRespawnWorker check;
+ Trinity::CreatureWorker<TrashRespawnWorker> worker(creature, check);
+ creature->VisitNearbyGridObject(SIZE_OF_GRIDS, worker);
+}
+
+class npc_harbinger_of_flame : public CreatureScript
+{
+ public:
+ npc_harbinger_of_flame() : CreatureScript("npc_harbinger_of_flame") { }
+
+ struct npc_harbinger_of_flameAI : public ScriptedAI
+ {
+ npc_harbinger_of_flameAI(Creature* creature) : ScriptedAI(creature)
+ {
+ }
+
+ void EnterCombat(Unit* /*target*/)
+ {
+ if (Creature* bird = ObjectAccessor::GetCreature(*me, me->GetUInt64Value(UNIT_FIELD_CHANNEL_OBJECT)))
+ DoZoneInCombat(bird, 200.0f);
+
+ me->InterruptSpell(CURRENT_CHANNELED_SPELL);
+ _events.Reset();
+ _events.ScheduleEvent(EVENT_FIEROBLAST, 1);
+ _events.ScheduleEvent(EVENT_FIEROCLAST_BARRAGE, 6000);
+ }
+
+ void JustReachedHome()
+ {
+ AlysrazorTrashEvaded(me);
+ }
+
+ void MoveInLineOfSight(Unit* unit)
+ {
+ if (me->IsInCombat())
+ return;
+
+ if (!unit->IsCharmedOwnedByPlayerOrPlayer())
+ return;
+
+ ScriptedAI::MoveInLineOfSight(unit);
+ }
+
+ void UpdateAI(uint32 diff)
+ {
+ if (!me->IsInCombat())
+ if (!me->GetCurrentSpell(CURRENT_CHANNELED_SPELL))
+ if (Creature* fireBird = me->FindNearestCreature((me->GetHomePosition().GetPositionY() > -275.0f ? NPC_BLAZING_MONSTROSITY_LEFT : NPC_BLAZING_MONSTROSITY_RIGHT), 100.0f))
+ DoCast(fireBird, SPELL_FIRE_CHANNELING);
+
+ if (!UpdateVictim())
+ return;
+
+ _events.Update(diff);
+
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+
+ while (uint32 eventId = _events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_FIEROBLAST:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, false, -SPELL_RIDE_MONSTROSITY))
+ DoCast(target, SPELL_FIEROBLAST_TRASH);
+ _events.RescheduleEvent(EVENT_FIEROBLAST, 500); // cast time is longer, but thanks to UNIT_STATE_CASTING check it won't trigger more often (need this because this creature gets a stacking haste aura)
+ break;
+ case EVENT_FIEROCLAST_BARRAGE:
+ DoCastAOE(SPELL_FIEROCLAST_BARRAGE);
+ _events.ScheduleEvent(EVENT_FIEROCLAST_BARRAGE, urand(9000, 12000));
+ break;
+ }
+ }
+
+ DoMeleeAttackIfReady();
+ }
+
+ private:
+ EventMap _events;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return new npc_harbinger_of_flameAI(creature);
+ }
+};
+
+class npc_blazing_monstrosity : public CreatureScript
+{
+ public:
+ npc_blazing_monstrosity() : CreatureScript("npc_blazing_monstrosity") { }
+
+ struct npc_blazing_monstrosityAI : public PassiveAI
+ {
+ npc_blazing_monstrosityAI(Creature* creature) : PassiveAI(creature), _summons(creature)
+ {
+ }
+
+ void EnterEvadeMode()
+ {
+ _summons.DespawnAll();
+ _events.Reset();
+ PassiveAI::EnterEvadeMode();
+ }
+
+ void JustDied(Unit* /*killer*/)
+ {
+ _summons.DespawnAll();
+ _events.Reset();
+ }
+
+ void JustReachedHome()
+ {
+ AlysrazorTrashEvaded(me);
+ }
+
+ void EnterCombat(Unit* /*target*/)
+ {
+ DoZoneInCombat();
+ me->RemoveAurasDueToSpell(SPELL_SLEEP_ULTRA_HIGH_PRIORITY);
+ me->PlayOneShotAnimKit(ANIM_KIT_BIRD_WAKE);
+ _events.Reset();
+ _events.ScheduleEvent(EVENT_START_SPITTING, 6000);
+ _events.ScheduleEvent(EVENT_CONTINUE_SPITTING, 9000);
+ }
+
+ void PassengerBoarded(Unit* passenger, int8 /*seat*/, bool apply)
+ {
+ if (!apply)
+ return;
+
+ // Our passenger is another vehicle (boardable by players)
+ DoCast(passenger, SPELL_SHARE_HEALTH, true);
+ passenger->setFaction(35);
+ passenger->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+
+ // Hack to relocate vehicle on vehicle so exiting players are not moved under map
+ Movement::MoveSplineInit init(passenger);
+ init.DisableTransportPathTransformations();
+ init.MoveTo(0.6654003f, 0.0f, 1.9815f);
+ init.SetFacing(0.0f);
+ init.Launch();
+ }
+
+ void JustSummoned(Creature* summon)
+ {
+ _summons.Summon(summon);
+ }
+
+ void SummonedCreatureDespawn(Creature* summon)
+ {
+ _summons.Despawn(summon);
+ }
+
+ void UpdateAI(uint32 diff)
+ {
+ if (!UpdateVictim())
+ return;
+
+ _events.Update(diff);
+
+ while (uint32 eventId = _events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_START_SPITTING:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, false, -SPELL_RIDE_MONSTROSITY))
+ DoCast(target, SPELL_MOLTEN_BARRAGE);
+ break;
+ case EVENT_CONTINUE_SPITTING:
+ DoCastAOE(SPELL_MOLTEN_BARRAGE_EFFECT);
+ if (Creature* egg = me->FindNearestCreature(NPC_EGG_PILE, 100.0f))
+ egg->AI()->DoAction(me->GetEntry());
+ break;
+ }
+ }
+ }
+
+ private:
+ SummonList _summons;
+ EventMap _events;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return new npc_blazing_monstrosityAI(creature);
+ }
+};
+
+class npc_molten_barrage : public CreatureScript
+{
+ public:
+ npc_molten_barrage() : CreatureScript("npc_molten_barrage") { }
+
+ struct npc_molten_barrageAI : public NullCreatureAI
+ {
+ npc_molten_barrageAI(Creature* creature) : NullCreatureAI(creature)
+ {
+ }
+
+ void AttackStart(Unit* target)
+ {
+ if (target)
+ me->GetMotionMaster()->MoveFollow(target, 0.0f, 0.0f, MOTION_SLOT_IDLE);
+ }
+
+ void IsSummonedBy(Unit* /*summoner*/)
+ {
+ DoCastAOE(SPELL_AGGRO_CLOSEST, true);
+ DoCast(me, SPELL_MOLTEN_BARRAGE_VISUAL);
+ DoCast(me, SPELL_INVISIBILITY_AND_STEALTH_DETECTION, true);
+ }
+
+ void MovementInform(uint32 movementType, uint32 /*pointId*/)
+ {
+ if (movementType != EFFECT_MOTION_TYPE)
+ return;
+
+ DoCastAOE(SPELL_AGGRO_CLOSEST);
+ me->ClearUnitState(UNIT_STATE_CANNOT_TURN);
+ }
+ };
+
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return new npc_molten_barrageAI(creature);
+ }
+};
+
+class npc_egg_pile : public CreatureScript
+{
+ public:
+ npc_egg_pile() : CreatureScript("npc_egg_pile") { }
+
+ struct npc_egg_pileAI : public CreatureAI
+ {
+ npc_egg_pileAI(Creature* creature) : CreatureAI(creature)
+ {
+ }
+
+ void AttackStart(Unit* /*target*/) { }
+
+ void Reset()
+ {
+ me->SetReactState(REACT_PASSIVE);
+ _events.Reset();
+ _callHatchlingSpell = 0;
+ }
+
+ void JustDied(Unit* /*killer*/)
+ {
+ _events.Reset();
+ std::list<Creature*> eggs;
+ GetCreatureListWithEntryInGrid(eggs, me, NPC_MOLTEN_EGG_TRASH, 20.0f);
+ for (std::list<Creature*>::const_iterator itr = eggs.begin(); itr != eggs.end(); ++itr)
+ (*itr)->CastSpell(*itr, SPELL_ALYSRAZOR_COSMETIC_EGG_XPLOSION, TRIGGERED_FULL_MASK);
+
+ DoCast(me, SPELL_ALYSRAZOR_COSMETIC_EGG_XPLOSION, true);
+ }
+
+ void JustReachedHome()
+ {
+ AlysrazorTrashEvaded(me);
+ }
+
+ void DoAction(int32 action)
+ {
+ if (action != NPC_BLAZING_MONSTROSITY_LEFT &&
+ action != NPC_BLAZING_MONSTROSITY_RIGHT)
+ return;
+
+ if (action == NPC_BLAZING_MONSTROSITY_LEFT)
+ Talk(EMOTE_CRACKING_EGGS);
+
+ _callHatchlingSpell = (action == NPC_BLAZING_MONSTROSITY_LEFT) ? SPELL_MOLTEN_EGG_TRASH_CALL_L : SPELL_MOLTEN_EGG_TRASH_CALL_R;
+ DoZoneInCombat();
+ _events.Reset();
+ _events.ScheduleEvent(EVENT_SUMMON_SMOULDERING_HATCHLING, 1);
+ }
+
+ void UpdateAI(uint32 diff)
+ {
+ if (!UpdateVictim())
+ return;
+
+ _events.Update(diff);
+
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+
+ while (uint32 eventId = _events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_SUMMON_SMOULDERING_HATCHLING:
+ {
+ std::list<Creature*> eggs;
+ MoltenEggCheck check(me);
+ Trinity::CreatureListSearcher<MoltenEggCheck> searcher(me, eggs, check);
+ me->VisitNearbyGridObject(20.0f, searcher);
+ if (!eggs.empty())
+ {
+ Creature* egg = Trinity::Containers::SelectRandomContainerElement(eggs);
+ egg->CastSpell(egg, SPELL_SUMMON_SMOULDERING_HATCHLING, TRIGGERED_FULL_MASK);
+ egg->SetDisplayId(MODEL_INVISIBLE_STALKER);
+ egg->m_Events.AddEvent(new RespawnEggEvent(egg), egg->m_Events.CalculateTime(5000));
+ }
+
+ if (_callHatchlingSpell)
+ DoCastAOE(_callHatchlingSpell, true);
+ _events.ScheduleEvent(EVENT_SUMMON_SMOULDERING_HATCHLING, urand(6000, 10000));
+ break;
+ }
+ default:
+ break;
+ }
+ }
+
+ DoMeleeAttackIfReady();
+ }
+
+ private:
+ EventMap _events;
+ uint32 _callHatchlingSpell;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return new npc_egg_pileAI(creature);
+ }
+};
+
+class spell_alysrazor_cosmetic_egg_xplosion : public SpellScriptLoader
+{
+ public:
+ spell_alysrazor_cosmetic_egg_xplosion() : SpellScriptLoader("spell_alysrazor_cosmetic_egg_xplosion") { }
+
+ class spell_alysrazor_cosmetic_egg_xplosion_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_alysrazor_cosmetic_egg_xplosion_SpellScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sCreatureDisplayInfoStore.LookupEntry(MODEL_INVISIBLE_STALKER))
+ return false;
+ return true;
+ }
+
+ void HandleExplosion(SpellEffIndex effIndex)
+ {
+ PreventHitDefaultEffect(effIndex);
+ GetHitUnit()->SetDisplayId(MODEL_INVISIBLE_STALKER);
+ if (Creature* creature = GetHitCreature())
+ creature->DespawnOrUnsummon(4000);
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_alysrazor_cosmetic_egg_xplosion_SpellScript::HandleExplosion, EFFECT_0, SPELL_EFFECT_DUMMY);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_alysrazor_cosmetic_egg_xplosion_SpellScript();
+ }
+};
+
+class spell_alysrazor_turn_monstrosity : public SpellScriptLoader
+{
+ public:
+ spell_alysrazor_turn_monstrosity() : SpellScriptLoader("spell_alysrazor_turn_monstrosity") { }
+
+ class spell_alysrazor_turn_monstrosity_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_alysrazor_turn_monstrosity_SpellScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_GENERIC_DUMMY_CAST))
+ return false;
+ if (!sSpellMgr->GetSpellInfo(SPELL_KNOCKBACK_RIGHT))
+ return false;
+ if (!sSpellMgr->GetSpellInfo(SPELL_KNOCKBACK_LEFT))
+ return false;
+ if (!sSpellMgr->GetSpellInfo(SPELL_KNOCKBACK_FORWARD))
+ return false;
+ if (!sSpellMgr->GetSpellInfo(SPELL_KNOCKBACK_BACK))
+ return false;
+ return true;
+ }
+
+ void KnockBarrage(SpellEffIndex effIndex)
+ {
+ PreventHitDefaultEffect(effIndex);
+ GetHitUnit()->GetMotionMaster()->MoveIdle();
+ if (TempSummon* summ = GetHitUnit()->ToTempSummon())
+ if (Unit* summoner = summ->GetSummoner())
+ GetHitUnit()->CastSpell(summoner, SPELL_GENERIC_DUMMY_CAST, TRIGGERED_FULL_MASK);
+
+ float angle = 0.0f;
+ if (Unit* bird = GetCaster()->GetVehicleBase())
+ {
+ bird->SetInFront(GetHitUnit());
+ angle = bird->GetOrientation();
+ }
+
+ uint32 spellId = 0;
+ switch (GetSpellInfo()->Id)
+ {
+ case SPELL_RIGHT_SIDE_SMACK_R:
+ case SPELL_RIGHT_SIDE_SMACK_L:
+ spellId = SPELL_KNOCKBACK_RIGHT;
+ angle -= M_PI * 0.5f;
+ break;
+ case SPELL_LEFT_SIDE_SMACK_R:
+ case SPELL_LEFT_SIDE_SMACK_L:
+ spellId = SPELL_KNOCKBACK_LEFT;
+ angle += M_PI * 0.5f;
+ break;
+ case SPELL_HEAD_BONK_R:
+ case SPELL_HEAD_BONK_L:
+ spellId = SPELL_KNOCKBACK_FORWARD;
+ break;
+ case SPELL_TICKLE_R:
+ case SPELL_TICKLE_L:
+ spellId = SPELL_KNOCKBACK_BACK;
+ angle -= M_PI;
+ break;
+ }
+
+ // Cannot wait for object update to process facing spline, it's needed in next spell cast
+ GetHitUnit()->SetOrientation(angle);
+ GetHitUnit()->SetFacingTo(angle);
+ GetHitUnit()->AddUnitState(UNIT_STATE_CANNOT_TURN);
+ GetHitUnit()->CastSpell(GetHitUnit(), spellId, TRIGGERED_FULL_MASK);
+ }
+
+ void TurnBird(SpellEffIndex effIndex)
+ {
+ PreventHitDefaultEffect(effIndex);
+ GetHitUnit()->PlayOneShotAnimKit(ANIM_KIT_BIRD_TURN);
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_alysrazor_turn_monstrosity_SpellScript::KnockBarrage, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ OnEffectHitTarget += SpellEffectFn(spell_alysrazor_turn_monstrosity_SpellScript::TurnBird, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_alysrazor_turn_monstrosity_SpellScript();
+ }
+};
+
+class spell_alysrazor_aggro_closest : public SpellScriptLoader
+{
+ public:
+ spell_alysrazor_aggro_closest() : SpellScriptLoader("spell_alysrazor_aggro_closest") { }
+
+ class spell_alysrazor_aggro_closest_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_alysrazor_aggro_closest_SpellScript);
+
+ bool Load()
+ {
+ return GetCaster()->GetTypeId() == TYPEID_UNIT;
+ }
+
+ void HandleEffect(SpellEffIndex effIndex)
+ {
+ PreventHitDefaultEffect(effIndex);
+ float curThreat = GetCaster()->getThreatManager().getThreat(GetHitUnit(), true);
+ GetCaster()->getThreatManager().addThreat(GetHitUnit(), -curThreat + 50000.0f / std::min(1.0f, GetCaster()->GetDistance(GetHitUnit())));
+ }
+
+ void UpdateThreat()
+ {
+ GetCaster()->ClearUnitState(UNIT_STATE_CASTING);
+ GetCaster()->GetAI()->AttackStart(GetCaster()->ToCreature()->SelectVictim());
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_alysrazor_aggro_closest_SpellScript::HandleEffect, EFFECT_0, SPELL_EFFECT_DUMMY);
+ AfterCast += SpellCastFn(spell_alysrazor_aggro_closest_SpellScript::UpdateThreat);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_alysrazor_aggro_closest_SpellScript();
+ }
+};
+
+class spell_alysrazor_fieroblast : public SpellScriptLoader
+{
+ public:
+ spell_alysrazor_fieroblast() : SpellScriptLoader("spell_alysrazor_fieroblast") { }
+
+ class spell_alysrazor_fieroblast_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_alysrazor_fieroblast_SpellScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_FIRE_IT_UP))
+ return false;
+ return true;
+ }
+
+ void FireItUp()
+ {
+ GetCaster()->CastSpell(GetCaster(), SPELL_FIRE_IT_UP, TRIGGERED_FULL_MASK);
+ }
+
+ void Register()
+ {
+ AfterCast += SpellCastFn(spell_alysrazor_fieroblast_SpellScript::FireItUp);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_alysrazor_fieroblast_SpellScript();
+ }
+};
+
+void AddSC_boss_alysrazor()
+{
+ new npc_harbinger_of_flame();
+ new npc_blazing_monstrosity();
+ new npc_molten_barrage();
+ new npc_egg_pile();
+ new spell_alysrazor_cosmetic_egg_xplosion();
+ new spell_alysrazor_turn_monstrosity();
+ new spell_alysrazor_aggro_closest();
+ new spell_alysrazor_fieroblast();
+}
diff --git a/src/server/scripts/Kalimdor/Firelands/firelands.h b/src/server/scripts/Kalimdor/Firelands/firelands.h
new file mode 100644
index 00000000000..cf12892b2c9
--- /dev/null
+++ b/src/server/scripts/Kalimdor/Firelands/firelands.h
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2008-2013 TrinityCore <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, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef FIRELANDS_H_
+#define FIRELANDS_H_
+
+#include "Map.h"
+#include "CreatureAI.h"
+
+#define FirelandsScriptName "instance_firelands"
+
+uint32 const EncounterCount = 7;
+
+enum DataTypes
+{
+ DATA_BETH_TILAC = 0,
+ DATA_LORD_RHYOLITH = 1,
+ DATA_SHANNOX = 2,
+ DATA_ALYSRAZOR = 3,
+ DATA_BALEROC = 4,
+ DATA_MAJORDOMO_STAGHELM = 5,
+ DATA_RAGNAROS = 6,
+};
+
+enum CreatureIds
+{
+ NPC_BLAZING_MONSTROSITY_LEFT = 53786,
+ NPC_BLAZING_MONSTROSITY_RIGHT = 53791,
+ NPC_EGG_PILE = 53795,
+ NPC_HARBINGER_OF_FLAME = 53793,
+ NPC_MOLTEN_EGG_TRASH = 53914,
+ NPC_SMOULDERING_HATCHLING = 53794,
+};
+
+class DelayedAttackStartEvent : public BasicEvent
+{
+ public:
+ DelayedAttackStartEvent(Creature* owner) : _owner(owner) { }
+
+ bool Execute(uint64 /*e_time*/, uint32 /*p_time*/)
+ {
+ _owner->AI()->DoZoneInCombat(_owner, 200.0f);
+ return true;
+ }
+
+ private:
+ Creature* _owner;
+};
+
+template<class AI>
+CreatureAI* GetFirelandsAI(Creature* creature)
+{
+ if (InstanceMap* instance = creature->GetMap()->ToInstanceMap())
+ if (instance->GetInstanceScript())
+ if (instance->GetScriptId() == sObjectMgr->GetScriptId(FirelandsScriptName))
+ return new AI(creature);
+ return NULL;
+}
+
+#endif // FIRELANDS_H_
diff --git a/src/server/scripts/Kalimdor/Firelands/instance_firelands.cpp b/src/server/scripts/Kalimdor/Firelands/instance_firelands.cpp
new file mode 100644
index 00000000000..dd8b2a76093
--- /dev/null
+++ b/src/server/scripts/Kalimdor/Firelands/instance_firelands.cpp
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2008-2013 TrinityCore <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, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "ScriptMgr.h"
+#include "InstanceScript.h"
+#include "firelands.h"
+
+class instance_firelands : public InstanceMapScript
+{
+ public:
+ instance_firelands() : InstanceMapScript(FirelandsScriptName, 720) { }
+
+ struct instance_firelands_InstanceScript : public InstanceScript
+ {
+ instance_firelands_InstanceScript(InstanceMap* map) : InstanceScript(map)
+ {
+ }
+
+ void Initialize()
+ {
+ SetBossNumber(EncounterCount);
+ }
+
+ void OnCreatureCreate(Creature* creature)
+ {
+ switch (creature->GetEntry())
+ {
+ case NPC_SMOULDERING_HATCHLING:
+ // Cannot directly start attacking here as the creature is not yet on map
+ creature->m_Events.AddEvent(new DelayedAttackStartEvent(creature), creature->m_Events.CalculateTime(500));
+ break;
+ }
+ }
+ };
+
+ InstanceScript* GetInstanceScript(InstanceMap* map) const
+ {
+ return new instance_firelands_InstanceScript(map);
+ }
+};
+
+void AddSC_instance_firelands()
+{
+ new instance_firelands();
+}
diff --git a/src/server/scripts/Kalimdor/HallsOfOrigination/boss_anraphet.cpp b/src/server/scripts/Kalimdor/HallsOfOrigination/boss_anraphet.cpp
new file mode 100644
index 00000000000..953ea2b4dc2
--- /dev/null
+++ b/src/server/scripts/Kalimdor/HallsOfOrigination/boss_anraphet.cpp
@@ -0,0 +1,571 @@
+/*
+ * Copyright (C) 2008-2012 TrinityCore <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, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "ObjectMgr.h"
+#include "ScriptMgr.h"
+#include "ScriptedCreature.h"
+#include "SpellScript.h"
+#include "SpellAuraEffects.h"
+#include "GridNotifiers.h"
+#include "Player.h"
+#include "ObjectAccessor.h"
+#include "halls_of_origination.h"
+
+enum Texts
+{
+ ANRAPHET_SAY_INTRO = 0,
+ ANRAPHET_SAY_AGGRO = 1,
+ ANRAPHET_SAY_OMEGA_STANCE = 2,
+ ANRAPHET_SAY_KILL = 3,
+ ANRAPHET_SAY_DEATH = 4,
+
+ BRANN_SAY_DOOR_INTRO = 0, // Right, let's go! Just need to input the final entry sequence into the door mechanism... and...
+ BRANN_SAY_UNLOCK_DOOR = 1, // That did the trick! The control room should be right behind this... oh... wow...
+ BRANN_SAY_TROGGS = 2, // What? This isn't the control room! There's another entire defense mechanism in place, and the blasted Rock Troggs broke into here somehow. Troggs. Why did it have to be Troggs!
+ BRANN_SAY_THINK = 3, // Ok, let me think a moment.
+ BRANN_SAY_MIRRORS = 4, // Mirrors pointing all over the place.
+ BRANN_SAY_ELEMENTALS = 5, // Four platforms with huge elementals.
+ BRANN_SAY_GET_IT = 6, // I got it! I saw a tablet that mentioned this chamber. This is the Vault of Lights! Ok, simple enough. I need you adventurers to take out each of the four elementals to trigger the opening sequence for the far door!
+ BRANN_1_ELEMENTAL_DEAD = 7, // One down!
+ BRANN_2_ELEMENTAL_DEAD = 8, // Another one down! Just look at those light beams! They seem to be connecting to the far door!
+ BRANN_3_ELEMENTAL_DEAD = 9, // One more elemental to go! The door is almost open!
+ BRANN_4_ELEMENTAL_DEAD = 10, // That''s it, you''ve done it! The vault door is opening! Now we can... oh, no!
+ BRANN_SAY_ANRAPHET_DIED = 11, // We''ve done it! The control room is breached!
+ BRANN_SAY_MOMENT = 12 // Here we go! Now this should only take a moment...
+};
+
+enum Events
+{
+ EVENT_BRANN_MOVE_INTRO = 1,
+ EVENT_BRANN_UNLOCK_DOOR = 2,
+ EVENT_BRANN_THINK = 3,
+ EVENT_BRANN_SET_ORIENTATION_1 = 4,
+ EVENT_BRANN_SET_ORIENTATION_2 = 5,
+ EVENT_BRANN_SET_ORIENTATION_3 = 6,
+ EVENT_BRANN_SAY_ELEMENTALS = 7,
+ EVENT_BRANN_SAY_GET_IT = 8,
+ EVENT_BRANN_SET_ORIENTATION_4 = 9,
+
+ EVENT_ANRAPHET_APPEAR = 10,
+ EVENT_ANRAPHET_ACTIVATE = 11,
+ EVENT_ANRAPHET_DESTROY = 12,
+ EVENT_ANRAPHET_READY = 13,
+ EVENT_ANRAPHET_NEMESIS_STRIKE = 14,
+ EVENT_ANRAPHET_ALPHA_BEAMS = 15,
+ EVENT_ANRAPHET_OMEGA_STANCE = 16,
+ EVENT_ANRAPHET_CRUMBLING_RUIN = 17,
+ EVENT_ANRAPHET_ACTIVATE_OMEGA = 18
+};
+
+enum Spells
+{
+ SPELL_DESTRUCTION_PROTOCOL = 77437,
+
+ SPELL_ALPHA_BEAMS = 76184,
+ SPELL_ALPHA_BEAMS_BACK_CAST = 76912,
+
+ SPELL_CRUMBLING_RUIN = 75609,
+
+
+ SPELL_NEMESIS_STRIKE = 75604,
+
+ SPELL_OMEGA_STANCE_SUMMON = 77106,
+ SPELL_OMEGA_STANCE = 75622,
+ SPELL_OMEGA_STANCE_SPIDER_TRIGGER = 77121,
+};
+
+enum Phases
+{
+ PHASE_INTRO = 1,
+ PHASE_COMBAT = 2,
+
+ PHASE_MASK_COMBAT = (1 << PHASE_COMBAT),
+};
+
+enum Points
+{
+ POINT_ANRAPHET_ACTIVATE = 0,
+ MAX_BRANN_WAYPOINTS_INTRO = 17
+};
+
+Position const AnraphetActivatePos = {-193.656f, 366.689f, 75.91001f, 3.138207f};
+
+Position const BrannIntroWaypoint[MAX_BRANN_WAYPOINTS_INTRO] =
+{
+ {-429.583f, 367.019f, 89.79282f, 0.0f},
+ {-409.9531f, 367.0469f, 89.81111f, 0.0f},
+ {-397.8246f, 366.967f, 86.37722f, 0.0f},
+ {-383.7813f, 366.8229f, 82.07919f, 0.0f},
+ {-368.2604f, 366.7448f, 77.0984f, 0.0f},
+ {-353.6458f, 366.4896f, 75.92504f, 0.0f},
+ {-309.0608f, 366.7205f, 75.91345f, 0.0f},
+ {-276.3303f, 367.0f, 75.92413f, 0.0f},
+ {-246.5104f, 366.6389f, 75.87791f, 0.0f},
+ {-202.0417f, 366.7517f, 75.92508f, 0.0f},
+ {-187.6024f, 366.7656f, 76.23077f, 0.0f},
+ {-155.0938f, 366.783f, 86.45834f, 0.0f},
+ {-143.5694f, 366.8177f, 89.73354f, 0.0f},
+ {-128.5608f, 366.8629f, 89.74199f, 0.0f},
+ {-103.559f, 366.5938f, 89.79725f, 0.0f},
+ {-71.58507f, 367.0278f, 89.77069f, 0.0f},
+ {-35.04861f, 366.6563f, 89.77447f, 0.0f},
+};
+
+class boss_anraphet : public CreatureScript
+{
+public:
+ boss_anraphet() : CreatureScript("boss_anraphet") { }
+
+ struct boss_anraphetAI : public BossAI
+ {
+ boss_anraphetAI(Creature* creature) : BossAI(creature, DATA_ANRAPHET) { }
+
+ void ScheduleCombatEvents()
+ {
+ events.ScheduleEvent(EVENT_ANRAPHET_NEMESIS_STRIKE, 8000, 0, PHASE_COMBAT);
+ events.ScheduleEvent(EVENT_ANRAPHET_ALPHA_BEAMS, 10000, 0, PHASE_COMBAT);
+ events.ScheduleEvent(EVENT_ANRAPHET_OMEGA_STANCE, 35000, 0, PHASE_COMBAT);
+ }
+
+ void Reset()
+ {
+ _Reset();
+ me->SetWalk(false);
+ events.SetPhase(PHASE_INTRO);
+ if (instance->GetData(DATA_DEAD_ELEMENTALS) == 4)
+ {
+ // Set to combat automatically, Brann's event won't repeat
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+ events.SetPhase(PHASE_COMBAT);
+ ScheduleCombatEvents();
+ me->SetHomePosition(AnraphetActivatePos);
+ }
+ }
+
+ void EnterCombat(Unit* /*who*/)
+ {
+ instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me, 1);
+ Talk(ANRAPHET_SAY_AGGRO);
+ _EnterCombat();
+ }
+
+ void JustDied(Unit* /*killer*/)
+ {
+ instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
+ Talk(ANRAPHET_SAY_DEATH);
+
+ if (Creature* brann = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_BRANN_0_GUID)))
+ brann->AI()->DoAction(ACTION_ANRAPHET_DIED);
+
+ _JustDied();
+ }
+
+ void KilledUnit(Unit* victim)
+ {
+ if (victim->GetTypeId() == TYPEID_PLAYER)
+ Talk(ANRAPHET_SAY_KILL);
+ }
+
+ void JustReachedHome()
+ {
+ instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
+ _JustReachedHome();
+ instance->SetBossState(DATA_ANRAPHET, FAIL);
+ }
+
+ void DoAction(int32 action)
+ {
+ if (action == ACTION_ANRAPHET_INTRO)
+ events.ScheduleEvent(EVENT_ANRAPHET_APPEAR, 6000, 0, PHASE_INTRO);
+ }
+
+ void MovementInform(uint32 type, uint32 point)
+ {
+ if (type != POINT_MOTION_TYPE)
+ return;
+
+ if (point == POINT_ANRAPHET_ACTIVATE)
+ {
+ events.ScheduleEvent(EVENT_ANRAPHET_ACTIVATE, 1500, 0, PHASE_INTRO);
+ me->SetHomePosition(AnraphetActivatePos);
+ }
+ }
+
+ void UpdateAI(uint32 diff)
+ {
+ if ((events.GetPhaseMask() & PHASE_MASK_COMBAT) && (!UpdateVictim() || !CheckInRoom()))
+ return;
+
+ events.Update(diff);
+
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_ANRAPHET_APPEAR:
+ me->SetWalk(true);
+ me->GetMotionMaster()->MovePoint(POINT_ANRAPHET_ACTIVATE, AnraphetActivatePos);
+ break;
+ case EVENT_ANRAPHET_ACTIVATE:
+ me->SetWalk(false);
+ Talk(ANRAPHET_SAY_INTRO);
+ events.ScheduleEvent(EVENT_ANRAPHET_DESTROY, 17500, 0, PHASE_INTRO);
+ return;
+ case EVENT_ANRAPHET_DESTROY:
+ DoCastAOE(SPELL_DESTRUCTION_PROTOCOL);
+ events.ScheduleEvent(EVENT_ANRAPHET_READY, 6000, 0, PHASE_INTRO);
+ break;
+ case EVENT_ANRAPHET_READY:
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+ events.SetPhase(PHASE_COMBAT);
+ ScheduleCombatEvents();
+ break;
+ case EVENT_ANRAPHET_NEMESIS_STRIKE:
+ DoCastVictim(SPELL_NEMESIS_STRIKE);
+ events.ScheduleEvent(EVENT_ANRAPHET_NEMESIS_STRIKE, 21500, 0, PHASE_COMBAT);
+ break;
+ case EVENT_ANRAPHET_ALPHA_BEAMS:
+ DoCast(me, SPELL_ALPHA_BEAMS);
+ events.ScheduleEvent(EVENT_ANRAPHET_CRUMBLING_RUIN, 12500, 0, PHASE_COMBAT);
+ events.ScheduleEvent(EVENT_ANRAPHET_ALPHA_BEAMS, urand(40000, 45000), 0, PHASE_COMBAT);
+ break;
+ case EVENT_ANRAPHET_OMEGA_STANCE:
+ DoCast(me, SPELL_OMEGA_STANCE_SUMMON);
+ DoCast(me, SPELL_OMEGA_STANCE);
+ Talk(ANRAPHET_SAY_OMEGA_STANCE);
+ events.ScheduleEvent(EVENT_ANRAPHET_OMEGA_STANCE, urand(45000, 50000), 0, PHASE_COMBAT);
+ events.ScheduleEvent(EVENT_ANRAPHET_CRUMBLING_RUIN, 13000, 0, PHASE_COMBAT);
+ break;
+ case EVENT_ANRAPHET_CRUMBLING_RUIN:
+ DoCast(me, SPELL_CRUMBLING_RUIN);
+ break;
+ }
+ }
+
+ if (events.GetPhaseMask() & PHASE_MASK_COMBAT)
+ DoMeleeAttackIfReady();
+ }
+ };
+
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return GetHallsOfOriginationAI<boss_anraphetAI>(creature);
+ }
+};
+
+class npc_omega_stance : public CreatureScript
+{
+ public:
+ npc_omega_stance() : CreatureScript("npc_omega_stance") { }
+
+ struct npc_omega_stanceAI : public ScriptedAI
+ {
+ npc_omega_stanceAI(Creature* creature) : ScriptedAI(creature) { }
+
+ void IsSummonedBy(Unit* /*who*/)
+ {
+ DoCast(me, SPELL_OMEGA_STANCE_SPIDER_TRIGGER, true);
+ }
+
+ void EnterEvadeMode() { }
+ };
+
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return new npc_omega_stanceAI(creature);
+ }
+};
+
+class npc_alpha_beam : public CreatureScript
+{
+ public:
+ npc_alpha_beam() : CreatureScript("npc_alpha_beam") { }
+
+ struct npc_alpha_beamAI : public ScriptedAI
+ {
+ npc_alpha_beamAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { }
+
+ void IsSummonedBy(Unit* /*summoner*/)
+ {
+ if (Creature* anraphet = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_ANRAPHET_GUID)))
+ anraphet->CastSpell(me, SPELL_ALPHA_BEAMS_BACK_CAST);
+ }
+
+ void EnterEvadeMode() { } // Never evade
+
+ private:
+ InstanceScript* _instance;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return GetHallsOfOriginationAI<npc_alpha_beamAI>(creature);
+ }
+};
+
+class npc_brann_bronzebeard_anraphet : public CreatureScript
+{
+ public:
+ npc_brann_bronzebeard_anraphet() : CreatureScript("npc_brann_bronzebeard_anraphet") { }
+
+ struct npc_brann_bronzebeard_anraphetAI : public CreatureAI
+ {
+ npc_brann_bronzebeard_anraphetAI(Creature* creature) : CreatureAI(creature), _currentPoint(0), _instance(creature->GetInstanceScript()) { }
+
+ void sGossipSelect(Player* /*player*/, uint32 sender, uint32 action)
+ {
+ if (_instance->GetBossState(DATA_VAULT_OF_LIGHTS) == DONE)
+ return;
+
+ if (me->GetCreatureTemplate()->GossipMenuId == sender && !action)
+ {
+ _instance->SetBossState(DATA_VAULT_OF_LIGHTS, IN_PROGRESS);
+ _currentPoint = 0;
+ events.Reset();
+ me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
+ me->SetWalk(true);
+ Talk(BRANN_SAY_DOOR_INTRO);
+ events.ScheduleEvent(EVENT_BRANN_UNLOCK_DOOR, 7500);
+ }
+ }
+
+ void DoAction(int32 action)
+ {
+ switch (action)
+ {
+ case ACTION_ELEMENTAL_DIED:
+ {
+ uint32 dead = _instance->GetData(DATA_DEAD_ELEMENTALS);
+ Talk(BRANN_1_ELEMENTAL_DEAD + dead - 1);
+ if (dead == 4)
+ {
+ _instance->DoCastSpellOnPlayers(SPELL_VAULT_OF_LIGHTS_CREDIT);
+ if (Creature* anraphet = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_ANRAPHET_GUID)))
+ anraphet->AI()->DoAction(ACTION_ANRAPHET_INTRO);
+ }
+ break;
+ }
+ case ACTION_ANRAPHET_DIED:
+ me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
+ events.ScheduleEvent(EVENT_BRANN_MOVE_INTRO, 1000);
+ break;
+ }
+ }
+
+ void UpdateAI(uint32 diff)
+ {
+ events.Update(diff);
+
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_BRANN_MOVE_INTRO:
+ if (_currentPoint < MAX_BRANN_WAYPOINTS_INTRO)
+ me->GetMotionMaster()->MovePoint(_currentPoint, BrannIntroWaypoint[_currentPoint]);
+ break;
+ case EVENT_BRANN_UNLOCK_DOOR:
+ Talk(BRANN_SAY_UNLOCK_DOOR);
+ _instance->SetBossState(DATA_VAULT_OF_LIGHTS, DONE);
+ _instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_VAULT_OF_LIGHTS_EVENT);
+ events.ScheduleEvent(EVENT_BRANN_MOVE_INTRO, 3500);
+ break;
+ case EVENT_BRANN_THINK:
+ Talk(BRANN_SAY_THINK);
+ events.ScheduleEvent(EVENT_BRANN_SET_ORIENTATION_1, 6000);
+ break;
+ case EVENT_BRANN_SET_ORIENTATION_1:
+ me->SetFacingTo(5.445427f);
+ Talk(BRANN_SAY_MIRRORS);
+ events.ScheduleEvent(EVENT_BRANN_SET_ORIENTATION_2, 1000);
+ break;
+ case EVENT_BRANN_SET_ORIENTATION_2:
+ me->SetFacingTo(0.6283185f);
+ events.ScheduleEvent(EVENT_BRANN_SET_ORIENTATION_3, 2500);
+ break;
+ case EVENT_BRANN_SET_ORIENTATION_3:
+ me->SetFacingTo(0.01745329f);
+ events.ScheduleEvent(EVENT_BRANN_SAY_ELEMENTALS, 200);
+ break;
+ case EVENT_BRANN_SAY_ELEMENTALS:
+ Talk(BRANN_SAY_ELEMENTALS);
+ events.ScheduleEvent(EVENT_BRANN_SAY_GET_IT, 3500);
+ break;
+ case EVENT_BRANN_SAY_GET_IT:
+ Talk(BRANN_SAY_GET_IT);
+ me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
+ break;
+ case EVENT_BRANN_SET_ORIENTATION_4:
+ me->SetFacingTo(3.141593f);
+ break;
+ }
+ }
+ }
+
+ void MovementInform(uint32 movementType, uint32 pointId)
+ {
+ if (movementType != POINT_MOTION_TYPE)
+ return;
+
+ _currentPoint = pointId + 1;
+ uint32 delay = 1;
+
+ switch (pointId)
+ {
+ case 0:
+ Talk(BRANN_SAY_TROGGS);
+ events.ScheduleEvent(EVENT_BRANN_THINK, 15000);
+ return;
+ case 1:
+ Talk(BRANN_SAY_ANRAPHET_DIED);
+ delay = 1000;
+ break;
+ case 14:
+ Talk(BRANN_SAY_MOMENT);
+ delay = 2200;
+ break;
+ case 16:
+ events.ScheduleEvent(EVENT_BRANN_SET_ORIENTATION_4, 6000);
+ return;
+ default:
+ break;
+ }
+
+ events.ScheduleEvent(EVENT_BRANN_MOVE_INTRO, delay);
+ }
+
+ protected:
+ EventMap events;
+ uint32 _currentPoint;
+ InstanceScript* _instance;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return GetHallsOfOriginationAI<npc_brann_bronzebeard_anraphetAI>(creature);
+ }
+};
+
+class spell_anraphet_alpha_beams : public SpellScriptLoader
+{
+public:
+ spell_anraphet_alpha_beams() : SpellScriptLoader("spell_anraphet_alpha_beams") { }
+
+ class spell_anraphet_alpha_beams_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_anraphet_alpha_beams_SpellScript);
+
+ void FilterTargets(std::list<WorldObject*>& targets)
+ {
+ if (targets.empty())
+ return;
+
+ WorldObject* target = Trinity::Containers::SelectRandomContainerElement(targets);
+ targets.clear();
+ targets.push_back(target);
+ }
+
+ void Register()
+ {
+ OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_anraphet_alpha_beams_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_anraphet_alpha_beams_SpellScript();
+ }
+};
+
+class spell_anraphet_omega_stance_summon : public SpellScriptLoader
+{
+public:
+ spell_anraphet_omega_stance_summon() : SpellScriptLoader("spell_anraphet_omega_stance_summon") { }
+
+ class spell_anraphet_omega_stance_summon_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_anraphet_omega_stance_summon_SpellScript);
+
+ void ModDestHeight(SpellEffIndex /*effIndex*/)
+ {
+ Position offset = {0.0f, 0.0f, 30.0f, 0.0f};
+ const_cast<WorldLocation*>(GetExplTargetDest())->RelocateOffset(offset);
+ GetHitDest()->RelocateOffset(offset);
+ }
+
+ void Register()
+ {
+ OnEffectLaunch += SpellEffectFn(spell_anraphet_omega_stance_summon_SpellScript::ModDestHeight, EFFECT_0, SPELL_EFFECT_SUMMON);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_anraphet_omega_stance_summon_SpellScript();
+ }
+};
+
+class spell_omega_stance_spider_effect : public SpellScriptLoader
+{
+public:
+ spell_omega_stance_spider_effect() : SpellScriptLoader("spell_omega_stance_spider_effect") { }
+
+ class spell_omega_stance_spider_effect_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_omega_stance_spider_effect_SpellScript);
+
+ void SetDestPosition(SpellEffIndex effIndex)
+ {
+ // Do our own calculations for the destination position.
+ /// TODO: Remove this once we find a general rule for WorldObject::MovePosition (this spell shouldn't take the Z change into consideration)
+ Unit* caster = GetCaster();
+ float angle = float(rand_norm()) * static_cast<float>(2 * M_PI);
+ uint32 dist = caster->GetObjectSize() + GetSpellInfo()->Effects[effIndex].CalcRadius(GetCaster()) * (float)rand_norm();
+
+ float x = caster->GetPositionX() + dist * std::cos(angle);
+ float y = caster->GetPositionY() + dist * std::sin(angle);
+ float z = caster->GetMap()->GetHeight(x, y, caster->GetPositionZ());
+
+ const_cast<WorldLocation*>(GetExplTargetDest())->Relocate(x, y, z);
+ GetHitDest()->Relocate(x, y, z);
+ }
+
+ void Register()
+ {
+ OnEffectLaunch += SpellEffectFn(spell_omega_stance_spider_effect_SpellScript::SetDestPosition, EFFECT_0, SPELL_EFFECT_DUMMY);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_omega_stance_spider_effect_SpellScript();
+ }
+};
+
+void AddSC_boss_anraphet()
+{
+ new boss_anraphet();
+ new spell_anraphet_alpha_beams();
+ new npc_brann_bronzebeard_anraphet();
+ new npc_alpha_beam();
+ new spell_anraphet_omega_stance_summon();
+ new spell_omega_stance_spider_effect();
+ new npc_omega_stance();
+}
diff --git a/src/server/scripts/Kalimdor/HallsOfOrigination/boss_earthrager_ptah.cpp b/src/server/scripts/Kalimdor/HallsOfOrigination/boss_earthrager_ptah.cpp
new file mode 100644
index 00000000000..530255fddcd
--- /dev/null
+++ b/src/server/scripts/Kalimdor/HallsOfOrigination/boss_earthrager_ptah.cpp
@@ -0,0 +1,346 @@
+/*
+ * Copyright (C) 2008-2013 TrinityCore <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, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "ObjectMgr.h"
+#include "ScriptMgr.h"
+#include "ScriptedCreature.h"
+#include "SpellScript.h"
+#include "SpellAuraEffects.h"
+#include "Player.h"
+#include "Weather.h"
+#include "WorldSession.h"
+#include "halls_of_origination.h"
+
+enum Texts
+{
+ SAY_AGGRO = 0,
+ SAY_DEATH = 1,
+};
+
+enum Events
+{
+ EVENT_RAGING_SMASH = 1,
+ EVENT_FLAME_BOLT = 2,
+ EVENT_EARTH_SPIKE = 3,
+ EVENT_PTAH_EXPLODE = 4,
+ EVENT_QUICKSAND = 5,
+};
+
+enum Spells
+{
+ SPELL_RAGING_SMASH = 83650,
+ SPELL_FLAME_BOLT = 77370,
+ SPELL_EARTH_SPIKE_WARN = 94974,
+
+ SPELL_PTAH_EXPLOSION = 75519,
+ SPELL_SANDSTORM = 75491,
+
+ SPELL_SUMMON_QUICKSAND = 75550, // Spell not in DBC, no SMSG_SPELL_START/GO for it
+
+ SPELL_BEETLE_BURROW = 75463,
+
+ SPELL_SUMMON_JEWELED_SCARAB = 75462,
+ SPELL_SUMMON_DUSTBONE_HORROR = 75521,
+};
+
+enum Phases
+{
+ PHASE_NORMAL = 1,
+ PHASE_DISPERSE = 2,
+
+ PHASE_MASK_DISPERSE = (1 << PHASE_DISPERSE),
+ PHASE_MASK_NORMAL = (1 << PHASE_NORMAL),
+};
+
+enum PtahData
+{
+ DATA_SUMMON_DEATHS = 0
+};
+
+class SummonScarab : public BasicEvent
+{
+public:
+ SummonScarab(Unit* owner, InstanceScript* instance) : _owner(owner), _instance(instance) { }
+
+ bool Execute(uint64 /*execTime*/, uint32 /*diff*/)
+ {
+ if (!_instance || _instance->GetBossState(DATA_EARTHRAGER_PTAH) != IN_PROGRESS)
+ return true; // delete event
+
+ _owner->CastSpell(_owner, SPELL_SUMMON_JEWELED_SCARAB);
+ _owner->RemoveAurasDueToSpell(SPELL_BEETLE_BURROW);
+ return true;
+ }
+protected:
+ Unit* _owner;
+ InstanceScript* _instance;
+};
+
+class boss_earthrager_ptah : public CreatureScript
+{
+public:
+ boss_earthrager_ptah() : CreatureScript("boss_earthrager_ptah") { }
+
+ struct boss_earthrager_ptahAI : public BossAI
+ {
+ boss_earthrager_ptahAI(Creature* creature) : BossAI(creature, DATA_EARTHRAGER_PTAH), _summonDeaths(0), _hasDispersed(false) { }
+
+ void Cleanup()
+ {
+ std::list<Creature*> units;
+
+ GetCreatureListWithEntryInGrid(units, me, NPC_DUSTBONE_HORROR, 100.0f);
+ for (std::list<Creature*>::iterator itr = units.begin(); itr != units.end(); ++itr)
+ (*itr)->DespawnOrUnsummon();
+
+ GetCreatureListWithEntryInGrid(units, me, NPC_JEWELED_SCARAB, 100.0f);
+ for (std::list<Creature*>::iterator itr = units.begin(); itr != units.end(); ++itr)
+ (*itr)->DespawnOrUnsummon();
+ }
+
+ void SendWeather(WeatherState weather, float grade) const
+ {
+ WorldPacket data(SMSG_WEATHER, 9);
+ data << uint32(weather);
+ data << float(grade);
+ data << uint8(0);
+ SendPacketToPlayers(&data);
+ }
+
+ // Send packet to all players in Tomb of the Earthrager
+ void SendPacketToPlayers(WorldPacket const* data) const
+ {
+ Map::PlayerList const& players = me->GetMap()->GetPlayers();
+ if (!players.isEmpty())
+ for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
+ if (Player* player = itr->GetSource())
+ if (player->GetAreaId() == AREA_TOMB_OF_THE_EARTHRAGER)
+ player->GetSession()->SendPacket(data);
+ }
+
+ void Reset()
+ {
+ _summonDeaths = 0;
+ _hasDispersed = false;
+ Cleanup();
+ _Reset();
+ events.SetPhase(PHASE_NORMAL);
+ events.ScheduleEvent(EVENT_RAGING_SMASH, urand(7000, 12000), 0, PHASE_NORMAL);
+ events.ScheduleEvent(EVENT_FLAME_BOLT, 15000, 0, PHASE_NORMAL);
+ events.ScheduleEvent(EVENT_EARTH_SPIKE, urand(16000, 21000), 0, PHASE_NORMAL);
+ }
+
+ void DamageTaken(Unit* /*attacker*/, uint32& damage)
+ {
+ if (me->HealthBelowPctDamaged(50, damage) && (events.GetPhaseMask() & PHASE_MASK_NORMAL) && !_hasDispersed)
+ {
+ events.SetPhase(PHASE_DISPERSE);
+ _hasDispersed = true;
+
+ me->AttackStop();
+ DoCast(me, SPELL_SANDSTORM);
+ SendWeather(WEATHER_STATE_LIGHT_SANDSTORM, 1.0f);
+ events.ScheduleEvent(EVENT_PTAH_EXPLODE, 6000, 0, PHASE_DISPERSE);
+ events.ScheduleEvent(EVENT_QUICKSAND, 10000, 0, PHASE_DISPERSE);
+
+ std::list<Creature*> stalkers;
+ GetCreatureListWithEntryInGrid(stalkers, me, NPC_BEETLE_STALKER, 100.0f);
+ std::list<Creature*> beetlers = stalkers;
+
+ Trinity::Containers::RandomResizeList(beetlers, 9); // Holds the summoners of Jeweled Scarab
+
+ for (std::list<Creature*>::iterator itr = beetlers.begin(); itr != beetlers.end(); ++itr)
+ {
+ stalkers.remove((*itr)); // Remove it to prevent a single trigger from spawning multiple npcs.
+ (*itr)->CastSpell((*itr), SPELL_BEETLE_BURROW); // Cast visual
+ // Summon after 5 seconds.
+ (*itr)->m_Events.AddEvent(new SummonScarab((*itr), instance), (*itr)->m_Events.CalculateTime(5000));
+ }
+
+ Trinity::Containers::RandomResizeList(stalkers, 2); // Holds the summoners of Dustbone Horror
+
+ for (std::list<Creature*>::iterator itr = stalkers.begin(); itr != stalkers.end(); ++itr)
+ (*itr)->CastSpell((*itr), SPELL_SUMMON_DUSTBONE_HORROR);
+ }
+ }
+
+ void SetData(uint32 index, uint32 /*value*/)
+ {
+ if (index == DATA_SUMMON_DEATHS)
+ {
+ ++_summonDeaths;
+ if (_summonDeaths == 11) // All summons died
+ {
+ SendWeather(WEATHER_STATE_FOG, 0.0f);
+ me->RemoveAurasDueToSpell(SPELL_PTAH_EXPLOSION);
+ events.SetPhase(PHASE_NORMAL);
+ events.ScheduleEvent(EVENT_RAGING_SMASH, urand(7000, 12000), 0, PHASE_NORMAL);
+ events.ScheduleEvent(EVENT_FLAME_BOLT, 15000, 0, PHASE_NORMAL);
+ events.ScheduleEvent(EVENT_EARTH_SPIKE, urand(16000, 21000), 0, PHASE_NORMAL);
+ }
+ }
+ }
+
+ void EnterCombat(Unit* /*who*/)
+ {
+ instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me, 1);
+ Talk(SAY_AGGRO);
+ _EnterCombat();
+ }
+
+ void JustDied(Unit* /*killer*/)
+ {
+ instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
+ Talk(SAY_DEATH);
+ _JustDied();
+ Cleanup();
+ }
+
+ void JustReachedHome()
+ {
+ instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
+ _JustReachedHome();
+ instance->SetBossState(DATA_EARTHRAGER_PTAH, FAIL);
+ }
+
+ void UpdateAI(uint32 diff)
+ {
+ if (!UpdateVictim() || !CheckInRoom())
+ return;
+
+ events.Update(diff);
+
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_RAGING_SMASH:
+ DoCastVictim(SPELL_RAGING_SMASH);
+ events.ScheduleEvent(EVENT_RAGING_SMASH, urand(7000, 12000), 0, PHASE_NORMAL);
+ break;
+ case EVENT_FLAME_BOLT:
+ DoCast(me, SPELL_FLAME_BOLT);
+ events.ScheduleEvent(EVENT_FLAME_BOLT, 15000, 0, PHASE_NORMAL);
+ break;
+ case EVENT_EARTH_SPIKE:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true))
+ DoCast(target, SPELL_EARTH_SPIKE_WARN);
+ events.ScheduleEvent(EVENT_EARTH_SPIKE, urand(16000, 21000), 0, PHASE_NORMAL);
+ break;
+ case EVENT_PTAH_EXPLODE:
+ DoCast(me, SPELL_PTAH_EXPLOSION);
+ break;
+ case EVENT_QUICKSAND:
+ // Spell not in DBC, it is not cast either, according to sniffs
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true))
+ if (Creature* quicksand = me->SummonCreature(NPC_QUICKSAND, *target))
+ quicksand->SetUInt32Value(UNIT_CREATED_BY_SPELL, SPELL_SUMMON_QUICKSAND);
+ events.ScheduleEvent(EVENT_QUICKSAND, 10000, 0, PHASE_DISPERSE);
+ break;
+ }
+ }
+
+ if (events.GetPhaseMask() & PHASE_MASK_NORMAL) // Do not melee in the disperse phase
+ DoMeleeAttackIfReady();
+ }
+
+ protected:
+ uint8 _summonDeaths;
+ bool _hasDispersed;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return GetHallsOfOriginationAI<boss_earthrager_ptahAI>(creature);
+ }
+};
+
+class spell_earthrager_ptah_flame_bolt : public SpellScriptLoader
+{
+ public:
+ spell_earthrager_ptah_flame_bolt() : SpellScriptLoader("spell_earthrager_ptah_flame_bolt") { }
+
+ class spell_earthrager_ptah_flame_bolt_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_earthrager_ptah_flame_bolt_SpellScript);
+
+ void FilterTargets(std::list<WorldObject*>& targets)
+ {
+ Trinity::Containers::RandomResizeList(targets, GetCaster()->GetMap()->IsHeroic() ? 3 : 2);
+ }
+
+ void Register()
+ {
+ OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_earthrager_ptah_flame_bolt_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_earthrager_ptah_flame_bolt_SpellScript();
+ }
+};
+
+class spell_earthrager_ptah_explosion : public SpellScriptLoader
+{
+public:
+ spell_earthrager_ptah_explosion() : SpellScriptLoader("spell_earthrager_ptah_explosion") { }
+
+ class spell_earthrager_ptah_explosion_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_earthrager_ptah_explosion_AuraScript);
+
+ void SetFlags(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ {
+ if (Unit* ptah = GetCaster())
+ {
+ ptah->SetFlag(UNIT_FIELD_FLAGS, uint32(UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_UNK_29 | UNIT_FLAG_UNK_31));
+ ptah->SetFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH);
+ }
+ }
+
+ void RemoveFlags(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ {
+ if (Unit* ptah = GetCaster())
+ {
+ ptah->RemoveFlag(UNIT_FIELD_FLAGS, uint32(UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_UNK_29 | UNIT_FLAG_UNK_31));
+ ptah->RemoveFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH);
+ }
+ }
+
+ void Register()
+ {
+ OnEffectApply += AuraEffectApplyFn(spell_earthrager_ptah_explosion_AuraScript::SetFlags, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
+ OnEffectRemove += AuraEffectRemoveFn(spell_earthrager_ptah_explosion_AuraScript::RemoveFlags, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_earthrager_ptah_explosion_AuraScript();
+ }
+};
+
+void AddSC_boss_earthrager_ptah()
+{
+ new boss_earthrager_ptah();
+ new spell_earthrager_ptah_flame_bolt();
+ new spell_earthrager_ptah_explosion();
+}
diff --git a/src/server/scripts/Kalimdor/HallsOfOrigination/boss_temple_guardian_anhuur.cpp b/src/server/scripts/Kalimdor/HallsOfOrigination/boss_temple_guardian_anhuur.cpp
new file mode 100644
index 00000000000..61110a3454e
--- /dev/null
+++ b/src/server/scripts/Kalimdor/HallsOfOrigination/boss_temple_guardian_anhuur.cpp
@@ -0,0 +1,404 @@
+/*
+ * Copyright (C) 2008-2013 TrinityCore <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, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "ObjectMgr.h"
+#include "ScriptMgr.h"
+#include "ScriptedCreature.h"
+#include "SpellScript.h"
+#include "SpellAuraEffects.h"
+#include "GridNotifiers.h"
+#include "Player.h"
+#include "halls_of_origination.h"
+
+enum Texts
+{
+ SAY_AGGRO = 0,
+ SAY_SHIELD = 1,
+ EMOTE_SHIELD = 2,
+ EMOTE_UNSHIELD = 3,
+ SAY_KILL = 4,
+ SAY_DEATH = 5
+};
+
+enum Events
+{
+ EVENT_DIVINE_RECKONING = 1,
+ EVENT_BURNING_LIGHT = 2,
+ EVENT_SEAR = 3,
+};
+
+enum Spells
+{
+ SPELL_DIVINE_RECKONING = 75592,
+ SPELL_BURNING_LIGHT = 75115,
+ SPELL_REVERBERATING_HYMN = 75322,
+ SPELL_SHIELD_OF_LIGHT = 74938,
+
+ SPELL_ACTIVATE_BEACONS = 76599,
+ SPELL_TELEPORT = 74969,
+
+ SPELL_SHIELD_VISUAL_RIGHT = 83698,
+ SPELL_BEAM_OF_LIGHT_RIGHT = 76573,
+
+ SPELL_SHIELD_VISUAL_LEFT = 83697,
+ SPELL_BEAM_OF_LIGHT_LEFT = 74930,
+
+ SPELL_SEARING_LIGHT = 75194,
+};
+
+enum Phases
+{
+ PHASE_SHIELDED = 0,
+ PHASE_FIRST_SHIELD = 1, // Ready to be shielded for the first time
+ PHASE_SECOND_SHIELD = 2, // First shield already happened, ready to be shielded a second time
+ PHASE_FINAL = 3 // Already shielded twice, ready to finish the encounter normally.
+};
+
+enum Actions
+{
+ ACTION_DISABLE_BEACON,
+};
+
+class boss_temple_guardian_anhuur : public CreatureScript
+{
+public:
+ boss_temple_guardian_anhuur() : CreatureScript("boss_temple_guardian_anhuur") { }
+
+ struct boss_temple_guardian_anhuurAI : public BossAI
+ {
+ boss_temple_guardian_anhuurAI(Creature* creature) : BossAI(creature, DATA_TEMPLE_GUARDIAN_ANHUUR) { }
+
+ void CleanStalkers()
+ {
+ std::list<Creature*> stalkers;
+ GetCreatureListWithEntryInGrid(stalkers, me, NPC_CAVE_IN_STALKER, 100.0f);
+ for (std::list<Creature*>::iterator itr = stalkers.begin(); itr != stalkers.end(); ++itr)
+ {
+ (*itr)->RemoveAurasDueToSpell(SPELL_BEAM_OF_LIGHT_RIGHT);
+ (*itr)->RemoveAurasDueToSpell(SPELL_BEAM_OF_LIGHT_LEFT);
+ }
+ }
+
+ void Reset()
+ {
+ _phase = PHASE_FIRST_SHIELD;
+ _oldPhase = PHASE_FIRST_SHIELD;
+ _beacons = 0;
+ _Reset();
+ CleanStalkers();
+ me->RemoveAurasDueToSpell(SPELL_SHIELD_OF_LIGHT);
+ events.ScheduleEvent(EVENT_DIVINE_RECKONING, urand(10000, 12000));
+ events.ScheduleEvent(EVENT_BURNING_LIGHT, 12000);
+ }
+
+ void DamageTaken(Unit* /*attacker*/, uint32& damage)
+ {
+ if ((me->HealthBelowPctDamaged(66, damage) && _phase == PHASE_FIRST_SHIELD) ||
+ (me->HealthBelowPctDamaged(33, damage) && _phase == PHASE_SECOND_SHIELD))
+ {
+ _beacons = 2;
+ _phase++; // Increase the phase
+ _oldPhase = _phase;
+
+ _phase = PHASE_SHIELDED;
+
+ me->InterruptNonMeleeSpells(true);
+ me->AttackStop();
+ DoCast(me, SPELL_TELEPORT);
+
+ DoCast(me, SPELL_SHIELD_OF_LIGHT);
+ me->SetFlag(UNIT_FIELD_FLAGS, uint32(UNIT_FLAG_UNK_31));
+
+ DoCastAOE(SPELL_ACTIVATE_BEACONS);
+
+ std::list<Creature*> stalkers;
+ GameObject* door = ObjectAccessor::GetGameObject(*me, instance->GetData64(DATA_ANHUUR_DOOR));
+ GetCreatureListWithEntryInGrid(stalkers, me, NPC_CAVE_IN_STALKER, 100.0f);
+
+ stalkers.remove_if(Trinity::HeightDifferenceCheck(door, 0.0f, false)); // Target only the bottom ones
+ for (std::list<Creature*>::iterator itr = stalkers.begin(); itr != stalkers.end(); ++itr)
+ {
+ if ((*itr)->GetPositionX() > door->GetPositionX())
+ {
+ (*itr)->CastSpell((*itr), SPELL_SHIELD_VISUAL_LEFT, true);
+ (*itr)->CastSpell((*itr), SPELL_BEAM_OF_LIGHT_LEFT, true);
+ }
+ else
+ {
+ (*itr)->CastSpell((*itr), SPELL_SHIELD_VISUAL_RIGHT, true);
+ (*itr)->CastSpell((*itr), SPELL_BEAM_OF_LIGHT_RIGHT, true);
+ }
+ }
+
+ DoCast(me, SPELL_REVERBERATING_HYMN);
+
+ Talk(EMOTE_SHIELD);
+ Talk(SAY_SHIELD);
+ }
+ }
+
+ void DoAction(int32 action)
+ {
+ if (action == ACTION_DISABLE_BEACON)
+ {
+ --_beacons;
+ if (!_beacons)
+ {
+ me->RemoveAurasDueToSpell(SPELL_SHIELD_OF_LIGHT);
+ Talk(EMOTE_UNSHIELD);
+ _phase = _oldPhase;
+ }
+ }
+ }
+
+ void EnterCombat(Unit* /*who*/)
+ {
+ instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me, 1);
+ Talk(SAY_AGGRO);
+ _EnterCombat();
+ }
+
+ void JustDied(Unit* /*killer*/)
+ {
+ instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
+ Talk(SAY_DEATH);
+ _JustDied();
+ }
+
+ void KilledUnit(Unit* victim)
+ {
+ if (victim->GetTypeId() == TYPEID_PLAYER)
+ Talk(SAY_KILL);
+ }
+
+ void JustReachedHome()
+ {
+ instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
+ _JustReachedHome();
+ instance->SetBossState(DATA_TEMPLE_GUARDIAN_ANHUUR, FAIL);
+ }
+
+ void UpdateAI(uint32 diff)
+ {
+ if (!UpdateVictim() || !CheckInRoom() || me->GetCurrentSpell(CURRENT_CHANNELED_SPELL) || _phase == PHASE_SHIELDED)
+ return;
+
+ events.Update(diff);
+
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_DIVINE_RECKONING:
+ DoCastVictim(SPELL_DIVINE_RECKONING);
+ events.ScheduleEvent(EVENT_DIVINE_RECKONING, urand(10000, 12000));
+ break;
+ case EVENT_BURNING_LIGHT:
+ {
+ Unit* unit = SelectTarget(SELECT_TARGET_RANDOM, 0, NonTankTargetSelector(me));
+ if (!unit)
+ unit = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true);
+ DoCast(unit, SPELL_BURNING_LIGHT);
+ events.ScheduleEvent(EVENT_SEAR, 2000);
+ events.ScheduleEvent(EVENT_BURNING_LIGHT, 12000);
+ break;
+ }
+ case EVENT_SEAR:
+ {
+ Unit* target = me->FindNearestCreature(NPC_SEARING_LIGHT, 100.0f);
+ if (!target)
+ break;
+
+ std::list<Creature*> stalkers;
+ GetCreatureListWithEntryInGrid(stalkers, me, NPC_CAVE_IN_STALKER, 100.0f);
+ stalkers.remove_if(Trinity::HeightDifferenceCheck(ObjectAccessor::GetGameObject(*me, instance->GetData64(DATA_ANHUUR_DOOR)), 5.0f, true));
+
+ if (stalkers.empty())
+ break;
+
+ stalkers.sort(Trinity::ObjectDistanceOrderPred(target));
+
+ // Get the closest statue face (any of its eyes)
+ Creature* eye1 = stalkers.front();
+ stalkers.remove(eye1); // Remove the eye.
+ stalkers.sort(Trinity::ObjectDistanceOrderPred(eye1)); // Find the second eye.
+ Creature* eye2 = stalkers.front();
+
+ eye1->CastSpell(eye1, SPELL_SEARING_LIGHT, true);
+ eye2->CastSpell(eye2, SPELL_SEARING_LIGHT, true);
+ break;
+ }
+ }
+ }
+
+ DoMeleeAttackIfReady();
+ }
+
+ private:
+ uint8 _phase;
+ uint8 _oldPhase;
+ uint8 _beacons;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return GetHallsOfOriginationAI<boss_temple_guardian_anhuurAI>(creature);
+ }
+};
+
+class spell_anhuur_shield_of_light : public SpellScriptLoader
+{
+ public:
+ spell_anhuur_shield_of_light() : SpellScriptLoader("spell_anhuur_shield_of_light") { }
+
+ class spell_anhuur_shield_of_light_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_anhuur_shield_of_light_SpellScript);
+
+ void FilterTargets(std::list<WorldObject*>& targets)
+ {
+ if (InstanceMap* instance = GetCaster()->GetMap()->ToInstanceMap())
+ {
+ if (InstanceScript* const script = instance->GetInstanceScript())
+ {
+ if (GameObject* go = ObjectAccessor::GetGameObject(*GetCaster(), script->GetData64(DATA_ANHUUR_DOOR)))
+ {
+ targets.remove_if(Trinity::HeightDifferenceCheck(go, 5.0f, false));
+ targets.remove(GetCaster());
+ targets.sort(Trinity::ObjectDistanceOrderPred(GetCaster()));
+ targets.resize(2);
+ }
+ }
+ }
+ }
+
+ void Register()
+ {
+ OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_anhuur_shield_of_light_SpellScript::FilterTargets, EFFECT_1, TARGET_UNIT_SRC_AREA_ENTRY);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_anhuur_shield_of_light_SpellScript();
+ }
+};
+
+class spell_anhuur_disable_beacon_beams : public SpellScriptLoader
+{
+ public:
+ spell_anhuur_disable_beacon_beams() : SpellScriptLoader("spell_anhuur_disable_beacon_beams") { }
+
+ class spell_anhuur_disable_beacon_beams_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_anhuur_disable_beacon_beams_SpellScript);
+
+ void HandleScript(SpellEffIndex /*effIndex*/)
+ {
+ GetHitUnit()->RemoveAurasDueToSpell(GetEffectValue());
+ }
+
+ void Notify(SpellEffIndex /*index*/)
+ {
+ if (InstanceMap* instance = GetCaster()->GetMap()->ToInstanceMap())
+ if (InstanceScript* const script = instance->GetInstanceScript())
+ if (Creature* anhuur = instance->GetCreature(script->GetData64(DATA_ANHUUR_GUID)))
+ anhuur->AI()->DoAction(ACTION_DISABLE_BEACON);
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_anhuur_disable_beacon_beams_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ OnEffectHit += SpellEffectFn(spell_anhuur_disable_beacon_beams_SpellScript::Notify, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_anhuur_disable_beacon_beams_SpellScript();
+ }
+};
+
+class spell_anhuur_activate_beacons : public SpellScriptLoader
+{
+ public:
+ spell_anhuur_activate_beacons() : SpellScriptLoader("spell_anhuur_activate_beacons") { }
+
+ class spell_anhuur_activate_beacons_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_anhuur_activate_beacons_SpellScript);
+
+ void Activate(SpellEffIndex index)
+ {
+ PreventHitDefaultEffect(index);
+ GetHitGObj()->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_anhuur_activate_beacons_SpellScript::Activate, EFFECT_0, SPELL_EFFECT_ACTIVATE_OBJECT);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_anhuur_activate_beacons_SpellScript();
+ }
+};
+
+class spell_anhuur_divine_reckoning : public SpellScriptLoader
+{
+public:
+ spell_anhuur_divine_reckoning() : SpellScriptLoader("spell_anhuur_divine_reckoning") { }
+
+ class spell_anhuur_divine_reckoning_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_anhuur_divine_reckoning_AuraScript);
+
+ void OnPeriodic(AuraEffect const* aurEff)
+ {
+ if (Unit* caster = GetCaster())
+ {
+ CustomSpellValues values;
+ values.AddSpellMod(SPELLVALUE_BASE_POINT0, aurEff->GetAmount());
+ caster->CastCustomSpell(GetSpellInfo()->Effects[EFFECT_0].TriggerSpell, values, GetTarget());
+ }
+ }
+
+ void Register()
+ {
+ OnEffectPeriodic += AuraEffectPeriodicFn(spell_anhuur_divine_reckoning_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_anhuur_divine_reckoning_AuraScript();
+ }
+};
+
+void AddSC_boss_temple_guardian_anhuur()
+{
+ new boss_temple_guardian_anhuur();
+ new spell_anhuur_shield_of_light();
+ new spell_anhuur_disable_beacon_beams();
+ new spell_anhuur_activate_beacons();
+ new spell_anhuur_divine_reckoning();
+}
diff --git a/src/server/scripts/Kalimdor/HallsOfOrigination/halls_of_origination.h b/src/server/scripts/Kalimdor/HallsOfOrigination/halls_of_origination.h
new file mode 100644
index 00000000000..5cc83e4af9c
--- /dev/null
+++ b/src/server/scripts/Kalimdor/HallsOfOrigination/halls_of_origination.h
@@ -0,0 +1,126 @@
+/*
+ * Copyright (C) 2008-2013 TrinityCore <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, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef HALLS_OF_ORIGINATION_H
+#define HALLS_OF_ORIGINATION_H
+
+#define HoOScriptName "instance_halls_of_origination"
+
+uint32 const EncounterCount = 12;
+
+enum Data
+{
+ // Bosses
+ DATA_TEMPLE_GUARDIAN_ANHUUR,
+ DATA_EARTHRAGER_PTAH,
+ DATA_VAULT_OF_LIGHTS,
+ DATA_FIRE_WARDEN,
+ DATA_EARTH_WARDEN,
+ DATA_WATER_WARDEN,
+ DATA_AIR_WARDEN,
+ DATA_ANRAPHET,
+ DATA_ISISET,
+ DATA_AMMUNAE,
+ DATA_SETESH,
+ DATA_RAJH,
+
+ // Temple Guardian Anhuur
+ DATA_ANHUUR_GUID,
+ DATA_ANHUUR_LEFT_BEACON,
+ DATA_ANHUUR_RIGHT_BEACON,
+ DATA_ANHUUR_BRIDGE,
+ DATA_ANHUUR_DOOR,
+
+ // Anraphet
+ DATA_BRANN_0_GUID,
+ DATA_DEAD_ELEMENTALS,
+ DATA_ANRAPHET_GUID,
+};
+
+enum Creatures
+{
+ BOSS_TEMPLE_GUARDIAN_ANHUUR = 39425,
+ NPC_CAVE_IN_STALKER = 40183,
+ NPC_SEARING_LIGHT = 40283,
+
+ BOSS_EARTHRAGER_PTAH = 39428,
+ NPC_BEETLE_STALKER = 40459, // Summons both Jeweled Scarab and Dustbone Horror
+ NPC_JEWELED_SCARAB = 40458,
+ NPC_DUSTBONE_HORROR = 40450,
+ NPC_QUICKSAND = 40503, // Summoned by a spell not in dbc (75550)
+
+ BOSS_ANRAPHET = 39788,
+ NPC_FIRE_WARDEN = 39800,
+ NPC_EARTH_WARDEN = 39801,
+ NPC_WATER_WARDEN = 39802,
+ NPC_AIR_WARDEN = 39803,
+
+ WARDEN_ENTRY_DATA_DELTA = NPC_FIRE_WARDEN - DATA_FIRE_WARDEN,
+
+ NPC_BRANN_BRONZEBEARD_0 = 39908,
+ NPC_OMEGA_STANCE = 41194,
+};
+
+enum GameObjects
+{
+ GO_ANHUURS_BRIDGE = 206506,
+ GO_DOODAD_ULDUM_ELEVATOR_COL01 = 207725,
+ GO_ANHUURS_DOOR = 202307,
+ GO_ANHUURS_RIGHT_BEACON = 203136,
+ GO_ANHUURS_LEFT_BEACON = 203133,
+
+ GO_VAULT_OF_LIGHTS_DOOR = 202313,
+ GO_SUN_MIRROR = 207726,
+ GO_ANRAPHET_DOOR = 202314,
+
+ GO_DOODAD_ULDUM_LIGHTMACHINE_01 = 207375,
+ GO_DOODAD_ULDUM_LIGHTMACHINE_02 = 207374,
+ GO_DOODAD_ULDUM_LIGHTMACHINE_03 = 207377,
+ GO_DOODAD_ULDUM_LIGHTMACHINE_04 = 207376,
+
+ GO_DOODAD_ULDUM_LASERBEAMS01 = 207662, // Matches GO_DOODAD_ULDUM_LIGHTMACHINE_02
+ GO_DOODAD_ULDUM_LASERBEAMS_01 = 207663, // Matches GO_DOODAD_ULDUM_LIGHTMACHINE_01
+ GO_DOODAD_ULDUM_LASERBEAMS_02 = 207664, // Matches GO_DOODAD_ULDUM_LIGHTMACHINE_04
+ GO_DOODAD_ULDUM_LASERBEAMS_03 = 207665, // Matches GO_DOODAD_ULDUM_LIGHTMACHINE_03
+};
+
+enum Misc
+{
+ AREA_TOMB_OF_THE_EARTHRAGER = 5610,
+ ACHIEV_VAULT_OF_LIGHTS_EVENT = 24212, // Faster Than The Speed Of Light
+ SPELL_VAULT_OF_LIGHTS_CREDIT = 94067, // Not in DBC
+};
+
+enum GlobalActions
+{
+ ACTION_ANRAPHET_INTRO,
+ ACTION_ELEMENTAL_DIED,
+ ACTION_ANRAPHET_DIED,
+ ACTION_OMEGA_TRIGGER,
+};
+
+template<class AI>
+CreatureAI* GetHallsOfOriginationAI(Creature* creature)
+{
+ if (InstanceMap* instance = creature->GetMap()->ToInstanceMap())
+ if (instance->GetInstanceScript())
+ if (instance->GetScriptId() == sObjectMgr->GetScriptId(HoOScriptName))
+ return new AI(creature);
+ return NULL;
+}
+
+#endif // HALLS_OF_ORIGINATION_H
diff --git a/src/server/scripts/Kalimdor/HallsOfOrigination/instance_halls_of_origination.cpp b/src/server/scripts/Kalimdor/HallsOfOrigination/instance_halls_of_origination.cpp
new file mode 100644
index 00000000000..8c160bdc6f7
--- /dev/null
+++ b/src/server/scripts/Kalimdor/HallsOfOrigination/instance_halls_of_origination.cpp
@@ -0,0 +1,282 @@
+/*
+ * Copyright (C) 2008-2013 TrinityCore <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, 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 "halls_of_origination.h"
+#include "Player.h"
+#include "WorldPacket.h"
+#include "WorldSession.h"
+
+DoorData const doorData[] =
+{
+ {GO_ANHUURS_DOOR, DATA_TEMPLE_GUARDIAN_ANHUUR, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
+ {GO_ANHUURS_BRIDGE, DATA_TEMPLE_GUARDIAN_ANHUUR, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
+ {GO_DOODAD_ULDUM_ELEVATOR_COL01, DATA_TEMPLE_GUARDIAN_ANHUUR, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
+ {GO_VAULT_OF_LIGHTS_DOOR, DATA_VAULT_OF_LIGHTS, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
+ {GO_DOODAD_ULDUM_LIGHTMACHINE_02, DATA_EARTH_WARDEN, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
+ {GO_DOODAD_ULDUM_LASERBEAMS01, DATA_EARTH_WARDEN, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
+ {GO_DOODAD_ULDUM_LIGHTMACHINE_01, DATA_FIRE_WARDEN, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
+ {GO_DOODAD_ULDUM_LASERBEAMS_01, DATA_FIRE_WARDEN, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
+ {GO_DOODAD_ULDUM_LIGHTMACHINE_03, DATA_WATER_WARDEN, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
+ {GO_DOODAD_ULDUM_LASERBEAMS_03, DATA_WATER_WARDEN, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
+ {GO_DOODAD_ULDUM_LIGHTMACHINE_04, DATA_AIR_WARDEN, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
+ {GO_DOODAD_ULDUM_LASERBEAMS_02, DATA_AIR_WARDEN, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
+ {0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE }
+};
+
+class instance_halls_of_origination : public InstanceMapScript
+{
+ public:
+ instance_halls_of_origination() : InstanceMapScript(HoOScriptName, 644) { }
+
+ struct instance_halls_of_origination_InstanceMapScript : public InstanceScript
+ {
+ instance_halls_of_origination_InstanceMapScript(InstanceMap* map) : InstanceScript(map)
+ {
+ SetBossNumber(EncounterCount);
+ LoadDoorData(doorData);
+ TempleGuardianAnhuurGUID = 0;
+ AnhuursBridgeGUID = 0;
+ AnhuursDoorGUID = 0;
+ AnhuurRightBeaconGUID = 0;
+ AnhuurLeftBeaconGUID = 0;
+ BrannBronzebeardGUID = 0;
+ AnraphetGUID = 0;
+ AnraphetDoorGUID = 0;
+ SunMirrorGUID = 0;
+ _deadElementals = 0;
+ }
+
+ void OnGameObjectCreate(GameObject* go)
+ {
+ switch (go->GetEntry())
+ {
+ case GO_ANHUURS_BRIDGE:
+ AnhuursBridgeGUID = go->GetGUID();
+ case GO_DOODAD_ULDUM_ELEVATOR_COL01:
+ case GO_VAULT_OF_LIGHTS_DOOR:
+ case GO_DOODAD_ULDUM_LIGHTMACHINE_01:
+ case GO_DOODAD_ULDUM_LIGHTMACHINE_02:
+ case GO_DOODAD_ULDUM_LIGHTMACHINE_03:
+ case GO_DOODAD_ULDUM_LIGHTMACHINE_04:
+ case GO_DOODAD_ULDUM_LASERBEAMS01:
+ case GO_DOODAD_ULDUM_LASERBEAMS_01:
+ case GO_DOODAD_ULDUM_LASERBEAMS_02:
+ case GO_DOODAD_ULDUM_LASERBEAMS_03:
+ AddDoor(go, true);
+ break;
+ case GO_ANHUURS_DOOR:
+ AnhuursDoorGUID = go->GetGUID();
+ AddDoor(go, true);
+ break;
+ case GO_ANHUURS_RIGHT_BEACON:
+ AnhuurRightBeaconGUID = go->GetGUID();
+ break;
+ case GO_ANHUURS_LEFT_BEACON:
+ AnhuurLeftBeaconGUID = go->GetGUID();
+ break;
+ case GO_SUN_MIRROR:
+ SunMirrorGUID = go->GetGUID();
+ break;
+ case GO_ANRAPHET_DOOR:
+ AnraphetDoorGUID = go->GetGUID();
+ break;
+ }
+ }
+
+ void OnGameObjectRemove(GameObject* go)
+ {
+ switch (go->GetEntry())
+ {
+ case GO_ANHUURS_BRIDGE:
+ case GO_DOODAD_ULDUM_ELEVATOR_COL01:
+ case GO_ANHUURS_DOOR:
+ case GO_VAULT_OF_LIGHTS_DOOR:
+ case GO_DOODAD_ULDUM_LIGHTMACHINE_01:
+ case GO_DOODAD_ULDUM_LIGHTMACHINE_02:
+ case GO_DOODAD_ULDUM_LIGHTMACHINE_03:
+ case GO_DOODAD_ULDUM_LIGHTMACHINE_04:
+ case GO_DOODAD_ULDUM_LASERBEAMS01:
+ case GO_DOODAD_ULDUM_LASERBEAMS_01:
+ case GO_DOODAD_ULDUM_LASERBEAMS_02:
+ case GO_DOODAD_ULDUM_LASERBEAMS_03:
+ AddDoor(go, false);
+ break;
+ }
+ }
+
+ void OnCreatureCreate(Creature* creature)
+ {
+ switch (creature->GetEntry())
+ {
+ case BOSS_TEMPLE_GUARDIAN_ANHUUR:
+ TempleGuardianAnhuurGUID = creature->GetGUID();
+ break;
+ case NPC_BRANN_BRONZEBEARD_0:
+ BrannBronzebeardGUID = creature->GetGUID();
+ break;
+ case BOSS_ANRAPHET:
+ AnraphetGUID = creature->GetGUID();
+ break;
+ }
+ }
+
+ uint32 GetData(uint32 data) const
+ {
+ switch (data)
+ {
+ case DATA_DEAD_ELEMENTALS:
+ return _deadElementals;
+ default:
+ break;
+ }
+
+ return 0;
+ }
+
+ uint64 GetData64(uint32 index) const
+ {
+ switch (index)
+ {
+ case DATA_ANHUUR_BRIDGE:
+ return AnhuursBridgeGUID;
+ case DATA_ANHUUR_DOOR:
+ return AnhuursDoorGUID;
+ case DATA_ANHUUR_LEFT_BEACON:
+ return AnhuurLeftBeaconGUID;
+ case DATA_ANHUUR_RIGHT_BEACON:
+ return AnhuurRightBeaconGUID;
+ case DATA_ANHUUR_GUID:
+ return TempleGuardianAnhuurGUID;
+ case DATA_BRANN_0_GUID:
+ return BrannBronzebeardGUID;
+ case DATA_ANRAPHET_GUID:
+ return AnraphetGUID;
+ }
+
+ return 0;
+ }
+
+ void IncreaseDeadElementals(uint32 inc)
+ {
+ _deadElementals += inc;
+ if (_deadElementals == 4)
+ {
+ if (GameObject* mirror = instance->GetGameObject(SunMirrorGUID))
+ mirror->SetGoState(GO_STATE_ACTIVE);
+ if (GameObject* door = instance->GetGameObject(AnraphetDoorGUID))
+ door->SetGoState(GO_STATE_ACTIVE);
+ }
+ }
+
+ void OnUnitDeath(Unit* unit)
+ {
+ Creature* creature = unit->ToCreature();
+ if (!creature)
+ return;
+
+ switch (creature->GetEntry())
+ {
+ case NPC_FIRE_WARDEN:
+ case NPC_EARTH_WARDEN:
+ case NPC_WATER_WARDEN:
+ case NPC_AIR_WARDEN:
+ uint32 data = creature->GetEntry() - WARDEN_ENTRY_DATA_DELTA;
+ SetBossState(data, IN_PROGRESS); // Needs to be set to IN_PROGRESS or else the gameobjects state won't be updated
+ SetBossState(data, DONE);
+ IncreaseDeadElementals(1);
+ if (Creature* brann = instance->GetCreature(BrannBronzebeardGUID))
+ brann->AI()->DoAction(ACTION_ELEMENTAL_DIED);
+ break;
+ }
+ }
+
+ std::string GetSaveData()
+ {
+ OUT_SAVE_INST_DATA;
+
+ std::ostringstream saveStream;
+ saveStream << "H O " << GetBossSaveData() << _deadElementals;
+
+ OUT_SAVE_INST_DATA_COMPLETE;
+ return saveStream.str();
+ }
+
+ void Load(const char* str)
+ {
+ if (!str)
+ {
+ OUT_LOAD_INST_DATA_FAIL;
+ return;
+ }
+
+ OUT_LOAD_INST_DATA(str);
+
+ char dataHead1, dataHead2;
+
+ std::istringstream loadStream(str);
+ loadStream >> dataHead1 >> dataHead2;
+
+ if (dataHead1 == 'H' && dataHead2 == 'O')
+ {
+ for (uint32 i = 0; i < EncounterCount; ++i)
+ {
+ uint32 tmpState;
+ loadStream >> tmpState;
+ if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
+ tmpState = NOT_STARTED;
+ SetBossState(i, EncounterState(tmpState));
+ }
+ uint32 tmp;
+ loadStream >> tmp;
+ IncreaseDeadElementals(tmp);
+ }
+ else
+ OUT_LOAD_INST_DATA_FAIL;
+
+ OUT_LOAD_INST_DATA_COMPLETE;
+ }
+
+ protected:
+ uint64 TempleGuardianAnhuurGUID;
+ uint64 AnhuursBridgeGUID;
+ uint64 AnhuursDoorGUID;
+ uint64 AnhuurRightBeaconGUID;
+ uint64 AnhuurLeftBeaconGUID;
+ uint64 BrannBronzebeardGUID;
+ uint64 AnraphetGUID;
+ uint64 AnraphetDoorGUID;
+ uint64 SunMirrorGUID;
+ uint32 _deadElementals;
+ };
+
+ InstanceScript* GetInstanceScript(InstanceMap* map) const
+ {
+ return new instance_halls_of_origination_InstanceMapScript(map);
+ }
+};
+
+void AddSC_instance_halls_of_origination()
+{
+ new instance_halls_of_origination();
+}
diff --git a/src/server/scripts/Kalimdor/zone_azshara.cpp b/src/server/scripts/Kalimdor/zone_azshara.cpp
index 1669337b6e9..a44568e0472 100644
--- a/src/server/scripts/Kalimdor/zone_azshara.cpp
+++ b/src/server/scripts/Kalimdor/zone_azshara.cpp
@@ -16,525 +16,6 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/* ScriptData
-SDName: Azshara
-SD%Complete: 90
-SDComment: Quest support: 2744, 3141, 9364, 10994
-SDCategory: Azshara
-EndScriptData */
-
-/* ContentData
-npc_spitelashes
-npc_loramus_thalipedes
-npc_rizzle_sprysprocket
-npc_depth_charge
-EndContentData */
-
-#include "ScriptMgr.h"
-#include "ScriptedCreature.h"
-#include "ScriptedGossip.h"
-#include "Player.h"
-#include "SpellInfo.h"
-#include "WorldSession.h"
-
-/*######
-## npc_spitelashes
-######*/
-
-class npc_spitelashes : public CreatureScript
-{
-public:
- npc_spitelashes() : CreatureScript("npc_spitelashes") { }
-
- CreatureAI* GetAI(Creature* creature) const
- {
- return new npc_spitelashesAI (creature);
- }
-
- struct npc_spitelashesAI : public ScriptedAI
- {
- npc_spitelashesAI(Creature* creature) : ScriptedAI(creature) {}
-
- uint32 morphtimer;
- bool spellhit;
-
- void Reset()
- {
- morphtimer = 0;
- spellhit = false;
- }
-
- void EnterCombat(Unit* /*who*/) { }
-
- void SpellHit(Unit* unit, const SpellInfo* spell)
- {
- if (spellhit)
- return;
-
- switch (spell->Id)
- {
- case 118:
- case 12824:
- case 12825:
- case 12826:
- if (Player* player = unit->ToPlayer())
- if (player->GetQuestStatus(9364) == QUEST_STATUS_INCOMPLETE)
- {
- spellhit = true;
- DoCast(me, 29124);
- }
- break;
- default:
- break;
- }
- }
-
- void UpdateAI(uint32 diff)
- {
- // we mustn't remove the Creature in the same round in which we cast the summon spell, otherwise there will be no summons
- if (spellhit && morphtimer >= 5000)
- {
- me->DespawnOrUnsummon();
- return;
- }
- // walk 5 seconds before summoning
- if (spellhit && morphtimer<5000)
- {
- morphtimer+=diff;
- if (morphtimer >= 5000)
- {
- DoCast(me, 28406); //summon copies
- DoCast(me, 6924); //visual explosion
- }
- }
- if (!UpdateVictim())
- return;
-
- /// @todo add abilities for the different creatures
- DoMeleeAttackIfReady();
- }
- };
-
-};
-
-/*######
-## npc_loramus_thalipedes
-######*/
-
-#define GOSSIP_HELLO_LT1 "Can you help me?"
-#define GOSSIP_HELLO_LT2 "Tell me your story"
-#define GOSSIP_SELECT_LT1 "Please continue"
-#define GOSSIP_SELECT_LT2 "I do not understand"
-#define GOSSIP_SELECT_LT3 "Indeed"
-#define GOSSIP_SELECT_LT4 "I will do this with or your help, Loramus"
-#define GOSSIP_SELECT_LT5 "Yes"
-
-class npc_loramus_thalipedes : public CreatureScript
-{
-public:
- npc_loramus_thalipedes() : CreatureScript("npc_loramus_thalipedes") { }
-
- bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action)
- {
- player->PlayerTalkClass->ClearMenus();
- switch (action)
- {
- case GOSSIP_ACTION_INFO_DEF+1:
- player->CLOSE_GOSSIP_MENU();
- player->AreaExploredOrEventHappens(2744);
- break;
-
- case GOSSIP_ACTION_INFO_DEF+2:
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT_LT1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 21);
- player->SEND_GOSSIP_MENU(1813, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+21:
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT_LT2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 22);
- player->SEND_GOSSIP_MENU(1814, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+22:
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT_LT3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 23);
- player->SEND_GOSSIP_MENU(1815, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+23:
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT_LT4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 24);
- player->SEND_GOSSIP_MENU(1816, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+24:
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT_LT5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 25);
- player->SEND_GOSSIP_MENU(1817, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+25:
- player->CLOSE_GOSSIP_MENU();
- player->AreaExploredOrEventHappens(3141);
- break;
- }
- return true;
- }
-
- bool OnGossipHello(Player* player, Creature* creature)
- {
- if (creature->IsQuestGiver())
- player->PrepareQuestMenu(creature->GetGUID());
-
- if (player->GetQuestStatus(2744) == QUEST_STATUS_INCOMPLETE)
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_HELLO_LT1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
-
- if (player->GetQuestStatus(3141) == QUEST_STATUS_INCOMPLETE)
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_HELLO_LT2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2);
-
- player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID());
-
- return true;
- }
-};
-
-/*####
-# npc_rizzle_sprysprocket
-####*/
-
-enum RizzleSprysprocketData
-{
- QUEST_CHASING_THE_MOONSTONE = 10994,
-
- NPC_DEPTH_CHARGE = 23025,
-
- SPELL_RIZZLE_BLACKJACK = 39865,
- SPELL_RIZZLE_ESCAPE = 39871,
- SPELL_RIZZLE_FROST_GRENADE = 40525,
- SPELL_DEPTH_CHARGE_TRAP = 38576,
- SPELL_PERIODIC_DEPTH_CHARGE = 39912,
- SPELL_GIVE_SOUTHFURY_MOONSTONE = 39886,
-
- SAY_RIZZLE_START = 0,
- SAY_RIZZLE_GRENADE = 1,
- SAY_RIZZLE_FINAL = 2,
- MSG_ESCAPE_NOTICE = 3
-};
-
-#define GOSSIP_GET_MOONSTONE "Hand over the Southfury moonstone and I'll let you go."
-
-Position const WPs[58] =
-{
- {3691.97f, -3962.41f, 35.9118f, 3.67f},
- {3675.02f, -3960.49f, 35.9118f, 3.67f},
- {3653.19f, -3958.33f, 33.9118f, 3.59f},
- {3621.12f, -3958.51f, 29.9118f, 3.48f},
- {3604.86f, -3963, 29.9118f, 3.48f},
- {3569.94f, -3970.25f, 29.9118f, 3.44f},
- {3541.03f, -3975.64f, 29.9118f, 3.41f},
- {3510.84f, -3978.71f, 29.9118f, 3.41f},
- {3472.7f, -3997.07f, 29.9118f, 3.35f},
- {3439.15f, -4014.55f, 29.9118f, 3.29f},
- {3412.8f, -4025.87f, 29.9118f, 3.25f},
- {3384.95f, -4038.04f, 29.9118f, 3.24f},
- {3346.77f, -4052.93f, 29.9118f, 3.22f},
- {3299.56f, -4071.59f, 29.9118f, 3.20f},
- {3261.22f, -4080.38f, 30.9118f, 3.19f},
- {3220.68f, -4083.09f, 31.9118f, 3.18f},
- {3187.11f, -4070.45f, 33.9118f, 3.16f},
- {3162.78f, -4062.75f, 33.9118f, 3.15f},
- {3136.09f, -4050.32f, 33.9118f, 3.07f},
- {3119.47f, -4044.51f, 36.0363f, 3.07f},
- {3098.95f, -4019.8f, 33.9118f, 3.07f},
- {3073.07f, -4011.42f, 33.9118f, 3.07f},
- {3051.71f, -3993.37f, 33.9118f, 3.02f},
- {3027.52f, -3978.6f, 33.9118f, 3.00f},
- {3003.78f, -3960.14f, 33.9118f, 2.98f},
- {2977.99f, -3941.98f, 31.9118f, 2.96f},
- {2964.57f, -3932.07f, 30.9118f, 2.96f},
- {2947.9f, -3921.31f, 29.9118f, 2.96f},
- {2924.91f, -3910.8f, 29.9118f, 2.94f},
- {2903.04f, -3896.42f, 29.9118f, 2.93f},
- {2884.75f, -3874.03f, 29.9118f, 2.90f},
- {2868.19f, -3851.48f, 29.9118f, 2.82f},
- {2854.62f, -3819.72f, 29.9118f, 2.80f},
- {2825.53f, -3790.4f, 29.9118f, 2.744f},
- {2804.31f, -3773.05f, 29.9118f, 2.71f},
- {2769.78f, -3763.57f, 29.9118f, 2.70f},
- {2727.23f, -3745.92f, 30.9118f, 2.69f},
- {2680.12f, -3737.49f, 30.9118f, 2.67f},
- {2647.62f, -3739.94f, 30.9118f, 2.66f},
- {2616.6f, -3745.75f, 30.9118f, 2.64f},
- {2589.38f, -3731.97f, 30.9118f, 2.61f},
- {2562.94f, -3722.35f, 31.9118f, 2.56f},
- {2521.05f, -3716.6f, 31.9118f, 2.55f},
- {2485.26f, -3706.67f, 31.9118f, 2.51f},
- {2458.93f, -3696.67f, 31.9118f, 2.51f},
- {2432, -3692.03f, 31.9118f, 2.46f},
- {2399.59f, -3681.97f, 31.9118f, 2.45f},
- {2357.75f, -3666.6f, 31.9118f, 2.44f},
- {2311.99f, -3656.88f, 31.9118f, 2.94f},
- {2263.41f, -3649.55f, 31.9118f, 3.02f},
- {2209.05f, -3641.76f, 31.9118f, 2.99f},
- {2164.83f, -3637.64f, 31.9118f, 3.15f},
- {2122.42f, -3639, 31.9118f, 3.21f},
- {2075.73f, -3643.59f, 31.9118f, 3.22f},
- {2033.59f, -3649.52f, 31.9118f, 3.42f},
- {1985.22f, -3662.99f, 31.9118f, 3.42f},
- {1927.09f, -3679.56f, 33.9118f, 3.42f},
- {1873.57f, -3695.32f, 33.9118f, 3.44f}
-};
-
-class npc_rizzle_sprysprocket : public CreatureScript
-{
-public:
- npc_rizzle_sprysprocket() : CreatureScript("npc_rizzle_sprysprocket") { }
-
- bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action)
- {
- player->PlayerTalkClass->ClearMenus();
- if (action == GOSSIP_ACTION_INFO_DEF + 1 && player->GetQuestStatus(QUEST_CHASING_THE_MOONSTONE) == QUEST_STATUS_INCOMPLETE)
- {
- player->CLOSE_GOSSIP_MENU();
- creature->CastSpell(player, SPELL_GIVE_SOUTHFURY_MOONSTONE, true);
- CAST_AI(npc_rizzle_sprysprocket::npc_rizzle_sprysprocketAI, creature->AI())->MustDieTimer = 3000;
- CAST_AI(npc_rizzle_sprysprocket::npc_rizzle_sprysprocketAI, creature->AI())->MustDie = true;
- }
- return true;
- }
-
- bool OnGossipHello(Player* player, Creature* creature)
- {
- if (player->GetQuestStatus(QUEST_CHASING_THE_MOONSTONE) != QUEST_STATUS_INCOMPLETE)
- return true;
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_GET_MOONSTONE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
- player->SEND_GOSSIP_MENU(10811, creature->GetGUID());
- return true;
- }
-
- CreatureAI* GetAI(Creature* creature) const
- {
- return new npc_rizzle_sprysprocketAI (creature);
- }
-
- struct npc_rizzle_sprysprocketAI : public ScriptedAI
- {
- npc_rizzle_sprysprocketAI(Creature* creature) : ScriptedAI(creature) {}
-
- uint32 SpellEscapeTimer;
- uint32 TeleportTimer;
- uint32 CheckTimer;
- uint32 GrenadeTimer;
- uint32 MustDieTimer;
- uint32 CurrWP;
-
- uint64 PlayerGUID;
-
- bool MustDie;
- bool Escape;
- bool ContinueWP;
- bool Reached;
-
- void Reset()
- {
- SpellEscapeTimer = 1300;
- TeleportTimer = 3500;
- CheckTimer = 10000;
- GrenadeTimer = 30000;
- MustDieTimer = 3000;
- CurrWP = 0;
-
- PlayerGUID = 0;
-
- MustDie = false;
- Escape = false;
- ContinueWP = false;
- Reached = false;
- }
-
- void UpdateAI(uint32 diff)
- {
- if (MustDie)
- {
- if (MustDieTimer <= diff)
- {
- me->DespawnOrUnsummon();
- return;
- } else MustDieTimer -= diff;
- }
-
- if (!Escape)
- {
- if (!PlayerGUID)
- return;
-
- if (SpellEscapeTimer <= diff)
- {
- DoCast(me, SPELL_RIZZLE_ESCAPE, false);
- SpellEscapeTimer = 10000;
- } else SpellEscapeTimer -= diff;
-
- if (TeleportTimer <= diff)
- {
- // temp solution - unit can't be teleported by core using spelleffect 5, only players
- DoTeleportTo(3706.39f, -3969.15f, 35.9118f);
-
- //begin swimming and summon depth charges
- Player* player = Unit::GetPlayer(*me, PlayerGUID);
- if (!player)
- return;
-
- Talk(MSG_ESCAPE_NOTICE, player->GetGUID());
- DoCast(me, SPELL_PERIODIC_DEPTH_CHARGE);
- me->SetHover(true);
- me->SetSwim(true);
- me->SetSpeed(MOVE_RUN, 0.85f, true);
- me->GetMotionMaster()->MovementExpired();
- me->GetMotionMaster()->MovePoint(CurrWP, WPs[CurrWP]);
- Escape = true;
- } else TeleportTimer -= diff;
-
- return;
- }
-
- if (ContinueWP)
- {
- me->GetMotionMaster()->MovePoint(CurrWP, WPs[CurrWP]);
- ContinueWP = false;
- }
-
- if (GrenadeTimer <= diff)
- {
- Player* player = Unit::GetPlayer(*me, PlayerGUID);
- if (player)
- {
- Talk(SAY_RIZZLE_GRENADE, player->GetGUID());
- DoCast(player, SPELL_RIZZLE_FROST_GRENADE, true);
- }
- GrenadeTimer = 30000;
- } else GrenadeTimer -= diff;
-
- if (CheckTimer <= diff)
- {
- Player* player = Unit::GetPlayer(*me, PlayerGUID);
- if (!player)
- {
- me->DespawnOrUnsummon();
- return;
- }
-
- if (me->IsWithinDist(player, 10) && me->GetPositionX() > player->GetPositionX() && !Reached)
- {
- Talk(SAY_RIZZLE_FINAL);
- me->SetUInt32Value(UNIT_NPC_FLAGS, 1);
- me->setFaction(35);
- me->GetMotionMaster()->MoveIdle();
- me->RemoveAurasDueToSpell(SPELL_PERIODIC_DEPTH_CHARGE);
- Reached = true;
- }
-
- CheckTimer = 1000;
- } else CheckTimer -= diff;
-
- }
-
- void SendText(int32 iTextEntry, Player* player)
- {
- LocaleConstant loc_idx = player->GetSession()->GetSessionDbLocaleIndex();
- const char* text = sObjectMgr->GetTrinityString(iTextEntry, loc_idx);
- sWorld->SendServerMessage(SERVER_MSG_STRING, text, player);
- }
-
- void AttackStart(Unit* who)
- {
- if (!who || PlayerGUID)
- return;
-
- Player* player = who->ToPlayer();
-
- if (player && player->GetQuestStatus(QUEST_CHASING_THE_MOONSTONE) == QUEST_STATUS_INCOMPLETE)
- {
- PlayerGUID = who->GetGUID();
- Talk(SAY_RIZZLE_START);
- DoCast(who, SPELL_RIZZLE_BLACKJACK, false);
- return;
- }
- }
-
- void EnterCombat(Unit* /*who*/) {}
-
- void MovementInform(uint32 type, uint32 id)
- {
- if (type != POINT_MOTION_TYPE)
- return;
-
- if (id == 57)
- {
- me->DespawnOrUnsummon();
- return;
- }
-
- ++CurrWP;
- ContinueWP = true;
- }
- };
-};
-
-/*####
-# npc_depth_charge
-####*/
-class npc_depth_charge : public CreatureScript
-{
-public:
- npc_depth_charge() : CreatureScript("npc_depth_charge") { }
-
- CreatureAI* GetAI(Creature* creature) const
- {
- return new npc_depth_chargeAI (creature);
- }
-
- struct npc_depth_chargeAI : public ScriptedAI
- {
- npc_depth_chargeAI(Creature* creature) : ScriptedAI(creature) {}
-
- bool WeMustDie;
- uint32 WeMustDieTimer;
-
- void Reset()
- {
- me->SetHover(true);
- me->SetSwim(true);
- me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- WeMustDie = false;
- WeMustDieTimer = 1000;
- }
-
- void UpdateAI(uint32 diff)
- {
- if (WeMustDie)
- {
- if (WeMustDieTimer <= diff)
- me->DespawnOrUnsummon();
- else
- WeMustDieTimer -= diff;
- }
- return;
- }
-
- void MoveInLineOfSight(Unit* who)
- {
- if (!who)
- return;
-
- if (who->GetTypeId() == TYPEID_PLAYER && me->IsWithinDistInMap(who, 5))
- {
- DoCast(who, SPELL_DEPTH_CHARGE_TRAP);
- WeMustDie = true;
- return;
- }
- }
-
- void AttackStart(Unit* /*who*/) {}
-
- void EnterCombat(Unit* /*who*/) {}
- };
-};
-
void AddSC_azshara()
{
- new npc_spitelashes();
- new npc_loramus_thalipedes();
- new npc_rizzle_sprysprocket();
- new npc_depth_charge();
}
diff --git a/src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp b/src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp
index 9f2c39e9a27..d3ca2940205 100644
--- a/src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp
+++ b/src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp
@@ -19,7 +19,7 @@
/* ScriptData
SDName: Azuremyst_Isle
SD%Complete: 75
-SDComment: Quest support: 9283, 9537, 9582, 9554, 9531, ? (special flight path, proper model for mount missing). Injured Draenei cosmetic only, 9582.
+SDComment: Quest support: 9283, 9537, 9582, 9554, ? (special flight path, proper model for mount missing). Injured Draenei cosmetic only, 9582.
SDCategory: Azuremyst Isle
EndScriptData */
@@ -28,7 +28,6 @@ npc_draenei_survivor
npc_engineer_spark_overgrind
npc_injured_draenei
npc_magwin
-npc_geezle
go_ravager_cage
npc_death_ravager
EndContentData */
@@ -763,7 +762,6 @@ void AddSC_azuremyst_isle()
new npc_engineer_spark_overgrind();
new npc_injured_draenei();
new npc_magwin();
- new npc_geezle();
new npc_death_ravager();
new go_ravager_cage();
new npc_stillpine_capitive();
diff --git a/src/server/scripts/Kalimdor/zone_darkshore.cpp b/src/server/scripts/Kalimdor/zone_darkshore.cpp
index 1e1cffc93b7..b98c51b552e 100644
--- a/src/server/scripts/Kalimdor/zone_darkshore.cpp
+++ b/src/server/scripts/Kalimdor/zone_darkshore.cpp
@@ -16,379 +16,6 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/* ScriptData
-SDName: Darkshore
-SD%Complete: 100
-SDComment: Quest support: 731, 2078, 5321
-SDCategory: Darkshore
-EndScriptData */
-
-/* ContentData
-npc_kerlonian
-npc_prospector_remtravel
-npc_threshwackonator
-EndContentData */
-
-#include "ScriptMgr.h"
-#include "ScriptedCreature.h"
-#include "ScriptedGossip.h"
-#include "ScriptedEscortAI.h"
-#include "ScriptedFollowerAI.h"
-#include "Player.h"
-#include "SpellInfo.h"
-
-/*####
-# npc_kerlonian
-####*/
-
-enum Kerlonian
-{
- SAY_KER_START = 0,
- EMOTE_KER_SLEEP = 1,
- SAY_KER_SLEEP = 2,
- SAY_KER_ALERT_1 = 3,
- SAY_KER_END = 4,
- EMOTE_KER_AWAKEN = 5,
-
- SPELL_SLEEP_VISUAL = 25148,
- SPELL_AWAKEN = 17536,
- QUEST_SLEEPER_AWAKENED = 5321,
- NPC_LILADRIS = 11219, //attackers entries unknown
- FACTION_KER_ESCORTEE = 113
-};
-
-/// @todo make concept similar as "ringo" -escort. Find a way to run the scripted attacks, _if_ player are choosing road.
-class npc_kerlonian : public CreatureScript
-{
-public:
- npc_kerlonian() : CreatureScript("npc_kerlonian") { }
-
- bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest)
- {
- if (quest->GetQuestId() == QUEST_SLEEPER_AWAKENED)
- {
- if (npc_kerlonianAI* pKerlonianAI = CAST_AI(npc_kerlonian::npc_kerlonianAI, creature->AI()))
- {
- creature->SetStandState(UNIT_STAND_STATE_STAND);
- creature->AI()->Talk(SAY_KER_START, player->GetGUID());
- pKerlonianAI->StartFollow(player, FACTION_KER_ESCORTEE, quest);
- }
- }
-
- return true;
- }
-
- CreatureAI* GetAI(Creature* creature) const
- {
- return new npc_kerlonianAI(creature);
- }
-
- struct npc_kerlonianAI : public FollowerAI
- {
- npc_kerlonianAI(Creature* creature) : FollowerAI(creature) { }
-
- uint32 FallAsleepTimer;
-
- void Reset()
- {
- FallAsleepTimer = urand(10000, 45000);
- }
-
- void MoveInLineOfSight(Unit* who)
- {
- FollowerAI::MoveInLineOfSight(who);
-
- if (!me->GetVictim() && !HasFollowState(STATE_FOLLOW_COMPLETE) && who->GetEntry() == NPC_LILADRIS)
- {
- if (me->IsWithinDistInMap(who, INTERACTION_DISTANCE*5))
- {
- if (Player* player = GetLeaderForFollower())
- {
- if (player->GetQuestStatus(QUEST_SLEEPER_AWAKENED) == QUEST_STATUS_INCOMPLETE)
- player->GroupEventHappens(QUEST_SLEEPER_AWAKENED, me);
-
- Talk(SAY_KER_END);
- }
-
- SetFollowComplete();
- }
- }
- }
-
- void SpellHit(Unit* /*pCaster*/, const SpellInfo* pSpell)
- {
- if (HasFollowState(STATE_FOLLOW_INPROGRESS | STATE_FOLLOW_PAUSED) && pSpell->Id == SPELL_AWAKEN)
- ClearSleeping();
- }
-
- void SetSleeping()
- {
- SetFollowPaused(true);
-
- Talk(EMOTE_KER_SLEEP);
-
- Talk(SAY_KER_SLEEP);
-
- me->SetStandState(UNIT_STAND_STATE_SLEEP);
- DoCast(me, SPELL_SLEEP_VISUAL, false);
- }
-
- void ClearSleeping()
- {
- me->RemoveAurasDueToSpell(SPELL_SLEEP_VISUAL);
- me->SetStandState(UNIT_STAND_STATE_STAND);
-
- Talk(EMOTE_KER_AWAKEN);
-
- SetFollowPaused(false);
- }
-
- void UpdateFollowerAI(uint32 Diff)
- {
- if (!UpdateVictim())
- {
- if (!HasFollowState(STATE_FOLLOW_INPROGRESS))
- return;
-
- if (!HasFollowState(STATE_FOLLOW_PAUSED))
- {
- if (FallAsleepTimer <= Diff)
- {
- SetSleeping();
- FallAsleepTimer = urand(25000, 90000);
- }
- else
- FallAsleepTimer -= Diff;
- }
-
- return;
- }
-
- DoMeleeAttackIfReady();
- }
- };
-
-};
-
-/*####
-# npc_prospector_remtravel
-####*/
-
-enum Remtravel
-{
- SAY_REM_START = 0,
- SAY_REM_AGGRO = 1,
- SAY_REM_RAMP1_1 = 2,
- SAY_REM_RAMP1_2 = 3,
- SAY_REM_BOOK = 4,
- SAY_REM_TENT1_1 = 5,
- SAY_REM_TENT1_2 = 6,
- SAY_REM_MOSS = 7,
- EMOTE_REM_MOSS = 8,
- SAY_REM_MOSS_PROGRESS = 9,
- SAY_REM_PROGRESS = 10,
- SAY_REM_REMEMBER = 11,
- EMOTE_REM_END = 12,
-
- FACTION_ESCORTEE = 10,
- QUEST_ABSENT_MINDED_PT2 = 731,
- NPC_GRAVEL_SCOUT = 2158,
- NPC_GRAVEL_BONE = 2159,
- NPC_GRAVEL_GEO = 2160
-};
-
-class npc_prospector_remtravel : public CreatureScript
-{
-public:
- npc_prospector_remtravel() : CreatureScript("npc_prospector_remtravel") { }
-
- bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest)
- {
- if (quest->GetQuestId() == QUEST_ABSENT_MINDED_PT2)
- {
- if (npc_escortAI* pEscortAI = CAST_AI(npc_prospector_remtravel::npc_prospector_remtravelAI, creature->AI()))
- pEscortAI->Start(false, false, player->GetGUID());
-
- creature->setFaction(FACTION_ESCORTEE);
- }
-
- return true;
- }
-
- CreatureAI* GetAI(Creature* creature) const
- {
- return new npc_prospector_remtravelAI(creature);
- }
-
- struct npc_prospector_remtravelAI : public npc_escortAI
- {
- npc_prospector_remtravelAI(Creature* creature) : npc_escortAI(creature) {}
-
- void WaypointReached(uint32 waypointId)
- {
- if (Player* player = GetPlayerForEscort())
- {
- switch (waypointId)
- {
- case 0:
- Talk(SAY_REM_START, player->GetGUID());
- break;
- case 5:
- Talk(SAY_REM_RAMP1_1, player->GetGUID());
- break;
- case 6:
- DoSpawnCreature(NPC_GRAVEL_SCOUT, -10.0f, 5.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
- DoSpawnCreature(NPC_GRAVEL_BONE, -10.0f, 7.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
- break;
- case 9:
- Talk(SAY_REM_RAMP1_2, player->GetGUID());
- break;
- case 14:
- //depend quest rewarded?
- Talk(SAY_REM_BOOK, player->GetGUID());
- break;
- case 15:
- Talk(SAY_REM_TENT1_1, player->GetGUID());
- break;
- case 16:
- DoSpawnCreature(NPC_GRAVEL_SCOUT, -10.0f, 5.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
- DoSpawnCreature(NPC_GRAVEL_BONE, -10.0f, 7.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
- break;
- case 17:
- Talk(SAY_REM_TENT1_2, player->GetGUID());
- break;
- case 26:
- Talk(SAY_REM_MOSS, player->GetGUID());
- break;
- case 27:
- Talk(EMOTE_REM_MOSS, player->GetGUID());
- break;
- case 28:
- Talk(SAY_REM_MOSS_PROGRESS, player->GetGUID());
- break;
- case 29:
- DoSpawnCreature(NPC_GRAVEL_SCOUT, -15.0f, 3.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
- DoSpawnCreature(NPC_GRAVEL_BONE, -15.0f, 5.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
- DoSpawnCreature(NPC_GRAVEL_GEO, -15.0f, 7.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
- break;
- case 31:
- Talk(SAY_REM_PROGRESS, player->GetGUID());
- break;
- case 41:
- Talk(SAY_REM_REMEMBER, player->GetGUID());
- break;
- case 42:
- Talk(EMOTE_REM_END, player->GetGUID());
- player->GroupEventHappens(QUEST_ABSENT_MINDED_PT2, me);
- break;
- }
- }
- }
-
- void Reset() {}
-
- void EnterCombat(Unit* who)
- {
- if (urand(0, 1))
- Talk(SAY_REM_AGGRO, who->GetGUID());
- }
-
- void JustSummoned(Creature* /*pSummoned*/)
- {
- //unsure if it should be any
- //pSummoned->AI()->AttackStart(me);
- }
- };
-
-};
-
-/*####
-# npc_threshwackonator
-####*/
-
-enum Threshwackonator
-{
- EMOTE_START = 0,
- SAY_AT_CLOSE = 1,
- QUEST_GYROMAST_REV = 2078,
- NPC_GELKAK = 6667,
- FACTION_HOSTILE = 14
-};
-
-#define GOSSIP_ITEM_INSERT_KEY "[PH] Insert key"
-
-class npc_threshwackonator : public CreatureScript
-{
-public:
- npc_threshwackonator() : CreatureScript("npc_threshwackonator") { }
-
- bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action)
- {
- player->PlayerTalkClass->ClearMenus();
- if (action == GOSSIP_ACTION_INFO_DEF+1)
- {
- player->CLOSE_GOSSIP_MENU();
-
- if (npc_threshwackonatorAI* pThreshAI = CAST_AI(npc_threshwackonator::npc_threshwackonatorAI, creature->AI()))
- {
- creature->AI()->Talk(EMOTE_START);
- pThreshAI->StartFollow(player);
- }
- }
-
- return true;
- }
-
- bool OnGossipHello(Player* player, Creature* creature)
- {
- if (player->GetQuestStatus(QUEST_GYROMAST_REV) == QUEST_STATUS_INCOMPLETE)
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_INSERT_KEY, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
-
- player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID());
- return true;
- }
-
- CreatureAI* GetAI(Creature* creature) const
- {
- return new npc_threshwackonatorAI(creature);
- }
-
- struct npc_threshwackonatorAI : public FollowerAI
- {
- npc_threshwackonatorAI(Creature* creature) : FollowerAI(creature) { }
-
- void Reset() { }
-
- void MoveInLineOfSight(Unit* who)
- {
- FollowerAI::MoveInLineOfSight(who);
-
- if (!me->GetVictim() && !HasFollowState(STATE_FOLLOW_COMPLETE) && who->GetEntry() == NPC_GELKAK)
- {
- if (me->IsWithinDistInMap(who, 10.0f))
- {
- Talk(SAY_AT_CLOSE, who->GetGUID());
- DoAtEnd();
- }
- }
- }
-
- void DoAtEnd()
- {
- me->setFaction(FACTION_HOSTILE);
-
- if (Player* pHolder = GetLeaderForFollower())
- me->AI()->AttackStart(pHolder);
-
- SetFollowComplete();
- }
- };
-
-};
-
void AddSC_darkshore()
{
- new npc_kerlonian();
- new npc_prospector_remtravel();
- new npc_threshwackonator();
}
diff --git a/src/server/scripts/Kalimdor/zone_desolace.cpp b/src/server/scripts/Kalimdor/zone_desolace.cpp
index b21cb28e0d5..ab37f94ce40 100644
--- a/src/server/scripts/Kalimdor/zone_desolace.cpp
+++ b/src/server/scripts/Kalimdor/zone_desolace.cpp
@@ -19,14 +19,12 @@
/* ScriptData
SDName: Desolace
SD%Complete: 100
-SDComment: Quest support: 5561
+SDComment: Quest support: 5561, 5581
SDCategory: Desolace
EndScriptData */
/* ContentData
npc_aged_dying_ancient_kodo
-go_iruxos
-npc_dalinda_malem
go_demon_portal
EndContentData */
@@ -118,104 +116,6 @@ public:
};
/*######
-## go_iruxos
-## Hand of Iruxos
-######*/
-
-enum Iruxos
-{
- QUEST_HAND_IRUXOS = 5381,
- NPC_DEMON_SPIRIT = 11876,
-};
-
-class go_iruxos : public GameObjectScript
-{
- public:
- go_iruxos() : GameObjectScript("go_iruxos") { }
-
- bool OnGossipHello(Player* player, GameObject* go)
- {
- if (player->GetQuestStatus(QUEST_HAND_IRUXOS) == QUEST_STATUS_INCOMPLETE && !go->FindNearestCreature(NPC_DEMON_SPIRIT, 25.0f, true))
- player->SummonCreature(NPC_DEMON_SPIRIT, go->GetPositionX(), go->GetPositionY(), go->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000);
-
- return true;
- }
-};
-
-/*######
-## npc_dalinda_malem. Quest 1440
-######*/
-
-enum Dalinda
-{
- QUEST_RETURN_TO_VAHLARRIEL = 1440
-};
-
-class npc_dalinda : public CreatureScript
-{
-public:
- npc_dalinda() : CreatureScript("npc_dalinda") { }
-
- bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest)
- {
- if (quest->GetQuestId() == QUEST_RETURN_TO_VAHLARRIEL)
- {
- if (npc_escortAI* pEscortAI = CAST_AI(npc_dalinda::npc_dalindaAI, creature->AI()))
- {
- pEscortAI->Start(true, false, player->GetGUID());
- creature->setFaction(113);
- }
- }
- return true;
- }
-
- CreatureAI* GetAI(Creature* creature) const
- {
- return new npc_dalindaAI(creature);
- }
-
- struct npc_dalindaAI : public npc_escortAI
- {
- npc_dalindaAI(Creature* creature) : npc_escortAI(creature) { }
-
- void WaypointReached(uint32 waypointId)
- {
- Player* player = GetPlayerForEscort();
-
- switch (waypointId)
- {
- case 1:
- me->IsStandState();
- break;
- case 15:
- if (player)
- player->GroupEventHappens(QUEST_RETURN_TO_VAHLARRIEL, me);
- break;
- }
- }
-
- void EnterCombat(Unit* /*who*/) { }
-
- void Reset() {}
-
- void JustDied(Unit* /*killer*/)
- {
- if (Player* player = GetPlayerForEscort())
- player->FailQuest(QUEST_RETURN_TO_VAHLARRIEL);
- return;
- }
-
- void UpdateAI(uint32 Diff)
- {
- npc_escortAI::UpdateAI(Diff);
- if (!UpdateVictim())
- return;
- DoMeleeAttackIfReady();
- }
- };
-};
-
-/*######
## go_demon_portal
######*/
@@ -246,7 +146,5 @@ class go_demon_portal : public GameObjectScript
void AddSC_desolace()
{
new npc_aged_dying_ancient_kodo();
- new go_iruxos();
- new npc_dalinda();
new go_demon_portal();
}
diff --git a/src/server/scripts/Kalimdor/zone_durotar.cpp b/src/server/scripts/Kalimdor/zone_durotar.cpp
index 31b710f61a5..6b82ee99f0a 100644
--- a/src/server/scripts/Kalimdor/zone_durotar.cpp
+++ b/src/server/scripts/Kalimdor/zone_durotar.cpp
@@ -17,13 +17,12 @@
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
-#include "Vehicle.h"
#include "SpellScript.h"
#include "Player.h"
/*######
-##Quest 5441: Lazy Peons
-##npc_lazy_peon
+## Quest 25134: Lazy Peons
+## npc_lazy_peon
######*/
enum LazyPeonYells
@@ -33,10 +32,10 @@ enum LazyPeonYells
enum LazyPeon
{
- QUEST_LAZY_PEONS = 5441,
- GO_LUMBERPILE = 175784,
- SPELL_BUFF_SLEEP = 17743,
- SPELL_AWAKEN_PEON = 19938
+ QUEST_LAZY_PEONS = 25134,
+ GO_LUMBERPILE = 175784,
+ SPELL_BUFF_SLEEP = 17743,
+ SPELL_AWAKEN_PEON = 19938
};
class npc_lazy_peon : public CreatureScript
@@ -94,7 +93,7 @@ public:
if (RebuffTimer <= Diff)
{
DoCast(me, SPELL_BUFF_SLEEP);
- RebuffTimer = 300000; //Rebuff agian in 5 minutes
+ RebuffTimer = 300000; //Rebuff agian in 5 minutes
}
else
RebuffTimer -= Diff;
@@ -105,432 +104,6 @@ public:
};
};
-enum Texts
-{
- // Tiger Matriarch Credit
- SAY_MATRIARCH_AGGRO = 0,
-
- // Troll Volunteer
- SAY_VOLUNTEER_START = 0,
- SAY_VOLUNTEER_END = 1,
-};
-
-enum Spells
-{
- // Tiger Matriarch Credit
- SPELL_SUMMON_MATRIARCH = 75187,
- SPELL_NO_SUMMON_AURA = 75213,
- SPELL_DETECT_INVIS = 75180,
- SPELL_SUMMON_ZENTABRA_TRIGGER = 75212,
-
- // Tiger Matriarch
- SPELL_POUNCE = 61184,
- SPELL_FURIOUS_BITE = 75164,
- SPELL_SUMMON_ZENTABRA = 75181,
- SPELL_SPIRIT_OF_THE_TIGER_RIDER = 75166,
- SPELL_EJECT_PASSENGERS = 50630,
-
- // Troll Volunteer
- SPELL_VOLUNTEER_AURA = 75076,
- SPELL_PETACT_AURA = 74071,
- SPELL_QUEST_CREDIT = 75106,
- SPELL_MOUNTING_CHECK = 75420,
- SPELL_TURNIN = 73953,
- SPELL_AOE_TURNIN = 75107,
-
- // Vol'jin War Drums
- SPELL_MOTIVATE_1 = 75088,
- SPELL_MOTIVATE_2 = 75086,
-};
-
-enum Creatures
-{
- // Tiger Matriarch Credit
- NPC_TIGER_VEHICLE = 40305,
-
- // Troll Volunteer
- NPC_URUZIN = 40253,
- NPC_VOLUNTEER_1 = 40264,
- NPC_VOLUNTEER_2 = 40260,
-
- // Vol'jin War Drums
- NPC_CITIZEN_1 = 40256,
- NPC_CITIZEN_2 = 40257,
-};
-
-enum Events
-{
- // Tiger Matriarch Credit
- EVENT_CHECK_SUMMON_AURA = 1,
-
- // Tiger Matriarch
- EVENT_POUNCE = 2,
- EVENT_NOSUMMON = 3,
-};
-
-enum Points
-{
- POINT_URUZIN = 4026400,
-};
-
-class npc_tiger_matriarch_credit : public CreatureScript
-{
- public:
- npc_tiger_matriarch_credit() : CreatureScript("npc_tiger_matriarch_credit") { }
-
- struct npc_tiger_matriarch_creditAI : public ScriptedAI
- {
- npc_tiger_matriarch_creditAI(Creature* creature) : ScriptedAI(creature)
- {
- SetCombatMovement(false);
- events.ScheduleEvent(EVENT_CHECK_SUMMON_AURA, 2000);
- }
-
- void UpdateAI(uint32 diff)
- {
- events.Update(diff);
-
- if (events.ExecuteEvent() == EVENT_CHECK_SUMMON_AURA)
- {
- std::list<Creature*> tigers;
- GetCreatureListWithEntryInGrid(tigers, me, NPC_TIGER_VEHICLE, 15.0f);
- if (!tigers.empty())
- {
- for (std::list<Creature*>::iterator itr = tigers.begin(); itr != tigers.end(); ++itr)
- {
- if (!(*itr)->IsSummon())
- continue;
-
- if (Unit* summoner = (*itr)->ToTempSummon()->GetSummoner())
- if (!summoner->HasAura(SPELL_NO_SUMMON_AURA) && !summoner->HasAura(SPELL_SUMMON_ZENTABRA_TRIGGER)
- && !summoner->IsInCombat())
- {
- me->AddAura(SPELL_NO_SUMMON_AURA, summoner);
- me->AddAura(SPELL_DETECT_INVIS, summoner);
- summoner->CastSpell(summoner, SPELL_SUMMON_MATRIARCH, true);
- Talk(SAY_MATRIARCH_AGGRO, summoner->GetGUID());
- }
- }
- }
-
- events.ScheduleEvent(EVENT_CHECK_SUMMON_AURA, 5000);
- }
- }
-
- private:
- EventMap events;
- };
-
- CreatureAI* GetAI(Creature* creature) const
- {
- return new npc_tiger_matriarch_creditAI(creature);
- }
-};
-
-class npc_tiger_matriarch : public CreatureScript
-{
- public:
- npc_tiger_matriarch() : CreatureScript("npc_tiger_matriarch") {}
-
- struct npc_tiger_matriarchAI : public ScriptedAI
- {
- npc_tiger_matriarchAI(Creature* creature) : ScriptedAI(creature),
- _tigerGuid(0)
- {
- }
-
- void EnterCombat(Unit* /*target*/)
- {
- _events.Reset();
- _events.ScheduleEvent(EVENT_POUNCE, 100);
- _events.ScheduleEvent(EVENT_NOSUMMON, 50000);
- }
-
- void IsSummonedBy(Unit* summoner)
- {
- if (summoner->GetTypeId() != TYPEID_PLAYER || !summoner->GetVehicle())
- return;
-
- _tigerGuid = summoner->GetVehicle()->GetBase()->GetGUID();
- if (Unit* tiger = ObjectAccessor::GetUnit(*me, _tigerGuid))
- {
- me->AddThreat(tiger, 500000.0f);
- DoCast(me, SPELL_FURIOUS_BITE);
- }
- }
-
- void KilledUnit(Unit* victim)
- {
- if (victim->GetTypeId() != TYPEID_UNIT || !victim->IsSummon())
- return;
-
- if (Unit* vehSummoner = victim->ToTempSummon()->GetSummoner())
- {
- vehSummoner->RemoveAurasDueToSpell(SPELL_NO_SUMMON_AURA);
- vehSummoner->RemoveAurasDueToSpell(SPELL_DETECT_INVIS);
- vehSummoner->RemoveAurasDueToSpell(SPELL_SPIRIT_OF_THE_TIGER_RIDER);
- vehSummoner->RemoveAurasDueToSpell(SPELL_SUMMON_ZENTABRA_TRIGGER);
- }
- me->DespawnOrUnsummon();
- }
-
- void DamageTaken(Unit* attacker, uint32& damage)
- {
- if (!attacker->IsSummon())
- return;
-
- if (HealthBelowPct(20))
- {
- damage = 0;
- me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
- if (Unit* vehSummoner = attacker->ToTempSummon()->GetSummoner())
- {
- vehSummoner->AddAura(SPELL_SUMMON_ZENTABRA_TRIGGER, vehSummoner);
- vehSummoner->CastSpell(vehSummoner, SPELL_SUMMON_ZENTABRA, true);
- attacker->CastSpell(attacker, SPELL_EJECT_PASSENGERS, true);
- vehSummoner->RemoveAurasDueToSpell(SPELL_NO_SUMMON_AURA);
- vehSummoner->RemoveAurasDueToSpell(SPELL_DETECT_INVIS);
- vehSummoner->RemoveAurasDueToSpell(SPELL_SPIRIT_OF_THE_TIGER_RIDER);
- vehSummoner->RemoveAurasDueToSpell(SPELL_SUMMON_ZENTABRA_TRIGGER);
- }
-
- me->DespawnOrUnsummon();
- }
- }
-
- void UpdateAI(uint32 diff)
- {
- if (!UpdateVictim())
- return;
-
- if (!_tigerGuid)
- return;
-
- _events.Update(diff);
-
- while (uint32 eventId = _events.ExecuteEvent())
- {
- switch (eventId)
- {
- case EVENT_POUNCE:
- DoCastVictim(SPELL_POUNCE);
- _events.ScheduleEvent(EVENT_POUNCE, 30000);
- break;
- case EVENT_NOSUMMON: // Reapply SPELL_NO_SUMMON_AURA
- if (Unit* tiger = ObjectAccessor::GetUnit(*me, _tigerGuid))
- {
- if (tiger->IsSummon())
- if (Unit* vehSummoner = tiger->ToTempSummon()->GetSummoner())
- me->AddAura(SPELL_NO_SUMMON_AURA, vehSummoner);
- }
- _events.ScheduleEvent(EVENT_NOSUMMON, 50000);
- break;
- default:
- break;
- }
- }
-
- DoMeleeAttackIfReady();
- }
-
- private:
- EventMap _events;
- uint64 _tigerGuid;
- };
-
- CreatureAI* GetAI(Creature* creature) const
- {
- return new npc_tiger_matriarchAI(creature);
- }
-};
-
-// These models was found in sniff.
-/// @todo generalize these models with race from dbc
-uint32 const trollmodel[] =
-{11665, 11734, 11750, 12037, 12038, 12042, 12049, 12849, 13529, 14759, 15570, 15701,
-15702, 1882, 1897, 1976, 2025, 27286, 2734, 2735, 4084, 4085, 4087, 4089, 4231, 4357,
-4358, 4360, 4361, 4362, 4363, 4370, 4532, 4537, 4540, 4610, 6839, 7037, 9767, 9768};
-
-class npc_troll_volunteer : public CreatureScript
-{
- public:
- npc_troll_volunteer() : CreatureScript("npc_troll_volunteer") { }
-
- struct npc_troll_volunteerAI : public ScriptedAI
- {
- npc_troll_volunteerAI(Creature* creature) : ScriptedAI(creature)
- {
- }
-
- void InitializeAI()
- {
- if (me->isDead() || !me->GetOwner())
- return;
-
- Reset();
-
- switch (urand(0, 3))
- {
- case 0:
- _mountModel = 6471;
- break;
- case 1:
- _mountModel = 6473;
- break;
- case 2:
- _mountModel = 6469;
- break;
- default:
- _mountModel = 6472;
- break;
- }
- me->SetDisplayId(trollmodel[urand(0, 39)]);
- if (Player* player = me->GetOwner()->ToPlayer())
- me->GetMotionMaster()->MoveFollow(player, 5.0f, float(rand_norm() + 1.0f) * M_PI / 3.0f * 4.0f);
- }
-
- void Reset()
- {
- _complete = false;
- me->AddAura(SPELL_VOLUNTEER_AURA, me);
- me->AddAura(SPELL_MOUNTING_CHECK, me);
- DoCast(me, SPELL_PETACT_AURA);
- me->SetReactState(REACT_PASSIVE);
- Talk(SAY_VOLUNTEER_START);
- }
-
- // This is needed for mount check aura to know what mountmodel the npc got stored
- uint32 GetMountId()
- {
- return _mountModel;
- }
-
- void MovementInform(uint32 type, uint32 id)
- {
- if (type != POINT_MOTION_TYPE)
- return;
- if (id == POINT_URUZIN)
- me->DespawnOrUnsummon();
- }
-
- void SpellHit(Unit* caster, SpellInfo const* spell)
- {
- if (spell->Id == SPELL_AOE_TURNIN && caster->GetEntry() == NPC_URUZIN && !_complete)
- {
- _complete = true; // Preventing from giving credit twice
- DoCast(me, SPELL_TURNIN);
- DoCast(me, SPELL_QUEST_CREDIT);
- me->RemoveAurasDueToSpell(SPELL_MOUNTING_CHECK);
- me->Dismount();
- Talk(SAY_VOLUNTEER_END);
- me->GetMotionMaster()->MovePoint(POINT_URUZIN, caster->GetPositionX(), caster->GetPositionY(), caster->GetPositionZ());
- }
- }
-
- private:
- uint32 _mountModel;
- bool _complete;
- };
-
- CreatureAI* GetAI(Creature* creature) const
- {
- return new npc_troll_volunteerAI(creature);
- }
-};
-
-typedef npc_troll_volunteer::npc_troll_volunteerAI VolunteerAI;
-
-class spell_mount_check : public SpellScriptLoader
-{
- public:
- spell_mount_check() : SpellScriptLoader("spell_mount_check") {}
-
- class spell_mount_check_AuraScript : public AuraScript
- {
- PrepareAuraScript(spell_mount_check_AuraScript)
- bool Validate(SpellInfo const* /*spellEntry*/)
- {
- if (!sSpellMgr->GetSpellInfo(SPELL_MOUNTING_CHECK))
- return false;
- return true;
- }
-
- void HandleEffectPeriodic(AuraEffect const* /*aurEff*/)
- {
- Unit* target = GetTarget();
- Unit* owner = target->GetOwner();
-
- if (!owner)
- return;
-
- if (owner->IsMounted() && !target->IsMounted())
- {
- if (VolunteerAI* volunteerAI = CAST_AI(VolunteerAI, target->GetAI()))
- target->Mount(volunteerAI->GetMountId());
- }
- else if (!owner->IsMounted() && target->IsMounted())
- target->Dismount();
-
- target->SetSpeed(MOVE_RUN, owner->GetSpeedRate(MOVE_RUN));
- target->SetSpeed(MOVE_WALK, owner->GetSpeedRate(MOVE_WALK));
- }
-
- void Register()
- {
- OnEffectPeriodic += AuraEffectPeriodicFn(spell_mount_check_AuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
- }
- };
-
- AuraScript* GetAuraScript() const
- {
- return new spell_mount_check_AuraScript();
- }
-};
-
-class spell_voljin_war_drums : public SpellScriptLoader
-{
- public:
- spell_voljin_war_drums() : SpellScriptLoader("spell_voljin_war_drums") {}
-
- class spell_voljin_war_drums_SpellScript : public SpellScript
- {
- PrepareSpellScript(spell_voljin_war_drums_SpellScript)
- bool Validate(SpellInfo const* /*spellEntry*/)
- {
- if (!sSpellMgr->GetSpellInfo(SPELL_MOTIVATE_1))
- return false;
- if (!sSpellMgr->GetSpellInfo(SPELL_MOTIVATE_2))
- return false;
- return true;
- }
-
- void HandleDummy(SpellEffIndex /*effIndex*/)
- {
- Unit* caster = GetCaster();
- if (Unit* target = GetHitUnit())
- {
- uint32 motivate = 0;
- if (target->GetEntry() == NPC_CITIZEN_1)
- motivate = SPELL_MOTIVATE_1;
- else if (target->GetEntry() == NPC_CITIZEN_2)
- motivate = SPELL_MOTIVATE_2;
- if (motivate)
- caster->CastSpell(target, motivate, false);
- }
- }
-
- void Register()
- {
- OnEffectHitTarget += SpellEffectFn(spell_voljin_war_drums_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
- }
- };
-
- SpellScript* GetSpellScript() const
- {
- return new spell_voljin_war_drums_SpellScript();
- }
-};
-
enum VoodooSpells
{
SPELL_BREW = 16712, // Special Brew
@@ -550,9 +123,9 @@ class spell_voodoo : public SpellScriptLoader
class spell_voodoo_SpellScript : public SpellScript
{
- PrepareSpellScript(spell_voodoo_SpellScript)
+ PrepareSpellScript(spell_voodoo_SpellScript);
- bool Validate(SpellInfo const* /*spellEntry*/)
+ bool Validate(SpellInfo const* /*spell*/)
{
if (!sSpellMgr->GetSpellInfo(SPELL_BREW) || !sSpellMgr->GetSpellInfo(SPELL_GHOSTLY) ||
!sSpellMgr->GetSpellInfo(SPELL_HEX1) || !sSpellMgr->GetSpellInfo(SPELL_HEX2) ||
@@ -584,10 +157,5 @@ class spell_voodoo : public SpellScriptLoader
void AddSC_durotar()
{
new npc_lazy_peon();
- new npc_tiger_matriarch_credit();
- new npc_tiger_matriarch();
- new npc_troll_volunteer();
- new spell_mount_check();
- new spell_voljin_war_drums();
new spell_voodoo();
}
diff --git a/src/server/scripts/Kalimdor/zone_dustwallow_marsh.cpp b/src/server/scripts/Kalimdor/zone_dustwallow_marsh.cpp
index ba7c34b6c05..a85089cf588 100644
--- a/src/server/scripts/Kalimdor/zone_dustwallow_marsh.cpp
+++ b/src/server/scripts/Kalimdor/zone_dustwallow_marsh.cpp
@@ -19,16 +19,13 @@
/* ScriptData
SDName: Dustwallow_Marsh
SD%Complete: 95
-SDComment: Quest support: 11180, 558, 11126, 11142, 11174, Vendor Nat Pagle
+SDComment: Quest support: 1270, 1222, 27245
SDCategory: Dustwallow Marsh
EndScriptData */
/* ContentData
-npc_risen_husk_spirit
-npc_lady_jaina_proudmoore
-npc_nat_pagle
-npc_private_hendel
-npc_cassa_crimsonwing - handled by npc_taxi
+npc_stinky
+go_blackhoof_cage
EndContentData */
#include "ScriptMgr.h"
@@ -766,13 +763,7 @@ public:
void AddSC_dustwallow_marsh()
{
- new npc_risen_husk_spirit();
- new npc_lady_jaina_proudmoore();
- new npc_nat_pagle();
- new npc_private_hendel();
- new npc_zelfrax();
new npc_stinky();
- new npc_theramore_guard();
new spell_ooze_zap();
new spell_ooze_zap_channel_end();
new spell_energize_aoe();
diff --git a/src/server/scripts/Kalimdor/zone_felwood.cpp b/src/server/scripts/Kalimdor/zone_felwood.cpp
index 35c19ff17ba..47a6d10f67b 100644
--- a/src/server/scripts/Kalimdor/zone_felwood.cpp
+++ b/src/server/scripts/Kalimdor/zone_felwood.cpp
@@ -19,12 +19,11 @@
/* ScriptData
SDName: Felwood
SD%Complete: 95
-SDComment: Quest support: 4101, 4102
+SDComment: Quest support:
SDCategory: Felwood
EndScriptData */
/* ContentData
-npcs_riverbreeze_and_silversky
EndContentData */
#include "ScriptMgr.h"
@@ -32,75 +31,6 @@ EndContentData */
#include "ScriptedGossip.h"
#include "Player.h"
-/*######
-## npcs_riverbreeze_and_silversky
-######*/
-
-#define GOSSIP_ITEM_BEACON "Please make me a Cenarion Beacon"
-
-enum RiverbreezeAndSilversky
-{
- SPELL_CENARION_BEACON = 15120,
-
- NPC_ARATHANDRIS_SILVERSKY = 9528,
- NPC_MAYBESS_RIVERBREEZE = 9529,
-
- QUEST_CLEASING_FELWOOD_A = 4101,
- QUEST_CLEASING_FELWOOD_H = 4102
-};
-
-class npcs_riverbreeze_and_silversky : public CreatureScript
-{
-public:
- npcs_riverbreeze_and_silversky() : CreatureScript("npcs_riverbreeze_and_silversky") { }
-
- bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action)
- {
- player->PlayerTalkClass->ClearMenus();
- if (action == GOSSIP_ACTION_INFO_DEF+1)
- {
- player->CLOSE_GOSSIP_MENU();
- creature->CastSpell(player, SPELL_CENARION_BEACON, false);
- }
- return true;
- }
-
- bool OnGossipHello(Player* player, Creature* creature)
- {
- if (creature->IsQuestGiver())
- player->PrepareQuestMenu(creature->GetGUID());
-
- uint32 creatureId = creature->GetEntry();
-
- if (creatureId == NPC_ARATHANDRIS_SILVERSKY)
- {
- if (player->GetQuestRewardStatus(QUEST_CLEASING_FELWOOD_A))
- {
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_BEACON, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
- player->SEND_GOSSIP_MENU(2848, creature->GetGUID());
- } else if (player->GetTeam() == HORDE)
- player->SEND_GOSSIP_MENU(2845, creature->GetGUID());
- else
- player->SEND_GOSSIP_MENU(2844, creature->GetGUID());
- }
-
- if (creatureId == NPC_MAYBESS_RIVERBREEZE)
- {
- if (player->GetQuestRewardStatus(QUEST_CLEASING_FELWOOD_H))
- {
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_BEACON, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
- player->SEND_GOSSIP_MENU(2849, creature->GetGUID());
- } else if (player->GetTeam() == ALLIANCE)
- player->SEND_GOSSIP_MENU(2843, creature->GetGUID());
- else
- player->SEND_GOSSIP_MENU(2842, creature->GetGUID());
- }
-
- return true;
- }
-};
-
void AddSC_felwood()
{
- new npcs_riverbreeze_and_silversky();
}
diff --git a/src/server/scripts/Kalimdor/zone_feralas.cpp b/src/server/scripts/Kalimdor/zone_feralas.cpp
index 0b0130d3008..bde5e6ac25e 100644
--- a/src/server/scripts/Kalimdor/zone_feralas.cpp
+++ b/src/server/scripts/Kalimdor/zone_feralas.cpp
@@ -16,237 +16,7 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/* ScriptData
-SDName: Feralas
-SD%Complete: 100
-SDComment: Quest support: 3520, 2767, Special vendor Gregan Brewspewer
-SDCategory: Feralas
-EndScriptData */
-
-#include "ScriptMgr.h"
-#include "ScriptedCreature.h"
-#include "ScriptedEscortAI.h"
-#include "ScriptedGossip.h"
-#include "SpellScript.h"
-#include "Player.h"
-#include "WorldSession.h"
-
-/*######
-## npc_gregan_brewspewer
-######*/
-
-#define GOSSIP_HELLO "Buy somethin', will ya?"
-
-class npc_gregan_brewspewer : public CreatureScript
-{
-public:
- npc_gregan_brewspewer() : CreatureScript("npc_gregan_brewspewer") { }
-
- bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action)
- {
- player->PlayerTalkClass->ClearMenus();
- if (action == GOSSIP_ACTION_INFO_DEF+1)
- {
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE);
- player->SEND_GOSSIP_MENU(2434, creature->GetGUID());
- }
- if (action == GOSSIP_ACTION_TRADE)
- player->GetSession()->SendListInventory(creature->GetGUID());
- return true;
- }
-
- bool OnGossipHello(Player* player, Creature* creature)
- {
- if (creature->IsQuestGiver())
- player->PrepareQuestMenu(creature->GetGUID());
-
- if (creature->IsVendor() && player->GetQuestStatus(3909) == QUEST_STATUS_INCOMPLETE)
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_HELLO, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
-
- player->SEND_GOSSIP_MENU(2433, creature->GetGUID());
- return true;
- }
-
-};
-
-/*######
-## npc_oox22fe
-######*/
-
-enum OOX
-{
- SAY_OOX_START = 0,
- SAY_OOX_AGGRO = 1,
- SAY_OOX_AMBUSH = 2,
- SAY_OOX_END = 3,
-
- NPC_YETI = 7848,
- NPC_GORILLA = 5260,
- NPC_WOODPAW_REAVER = 5255,
- NPC_WOODPAW_BRUTE = 5253,
- NPC_WOODPAW_ALPHA = 5258,
- NPC_WOODPAW_MYSTIC = 5254,
-
- QUEST_RESCUE_OOX22FE = 2767,
- FACTION_ESCORTEE_A = 774,
- FACTION_ESCORTEE_H = 775
-};
-
-class npc_oox22fe : public CreatureScript
-{
-public:
- npc_oox22fe() : CreatureScript("npc_oox22fe") { }
-
- bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest)
- {
- if (quest->GetQuestId() == QUEST_RESCUE_OOX22FE)
- {
- creature->AI()->Talk(SAY_OOX_START);
- //change that the npc is not lying dead on the ground
- creature->SetStandState(UNIT_STAND_STATE_STAND);
-
- if (player->GetTeam() == ALLIANCE)
- creature->setFaction(FACTION_ESCORTEE_A);
-
- if (player->GetTeam() == HORDE)
- creature->setFaction(FACTION_ESCORTEE_H);
-
- if (npc_escortAI* pEscortAI = CAST_AI(npc_oox22fe::npc_oox22feAI, creature->AI()))
- pEscortAI->Start(true, false, player->GetGUID());
-
- }
- return true;
- }
-
- CreatureAI* GetAI(Creature* creature) const
- {
- return new npc_oox22feAI(creature);
- }
-
- struct npc_oox22feAI : public npc_escortAI
- {
- npc_oox22feAI(Creature* creature) : npc_escortAI(creature) { }
-
- void WaypointReached(uint32 waypointId)
- {
- switch (waypointId)
- {
- // First Ambush(3 Yetis)
- case 11:
- Talk(SAY_OOX_AMBUSH);
- me->SummonCreature(NPC_YETI, -4841.01f, 1593.91f, 73.42f, 3.98f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000);
- me->SummonCreature(NPC_YETI, -4837.61f, 1568.58f, 78.21f, 3.13f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000);
- me->SummonCreature(NPC_YETI, -4841.89f, 1569.95f, 76.53f, 0.68f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000);
- break;
- //Second Ambush(3 Gorillas)
- case 21:
- Talk(SAY_OOX_AMBUSH);
- me->SummonCreature(NPC_GORILLA, -4595.81f, 2005.99f, 53.08f, 3.74f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000);
- me->SummonCreature(NPC_GORILLA, -4597.53f, 2008.31f, 52.70f, 3.78f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000);
- me->SummonCreature(NPC_GORILLA, -4599.37f, 2010.59f, 52.77f, 3.84f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000);
- break;
- //Third Ambush(4 Gnolls)
- case 30:
- Talk(SAY_OOX_AMBUSH);
- me->SummonCreature(NPC_WOODPAW_REAVER, -4425.14f, 2075.87f, 47.77f, 3.77f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000);
- me->SummonCreature(NPC_WOODPAW_BRUTE, -4426.68f, 2077.98f, 47.57f, 3.77f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000);
- me->SummonCreature(NPC_WOODPAW_MYSTIC, -4428.33f, 2080.24f, 47.43f, 3.87f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000);
- me->SummonCreature(NPC_WOODPAW_ALPHA, -4430.04f, 2075.54f, 46.83f, 3.81f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000);
- break;
- case 37:
- Talk(SAY_OOX_END);
- // Award quest credit
- if (Player* player = GetPlayerForEscort())
- player->GroupEventHappens(QUEST_RESCUE_OOX22FE, me);
- break;
- }
- }
-
- void Reset()
- {
- if (!HasEscortState(STATE_ESCORT_ESCORTING))
- me->SetStandState(UNIT_STAND_STATE_DEAD);
- }
-
- void EnterCombat(Unit* /*who*/)
- {
- //For an small probability the npc says something when he get aggro
- if (urand(0, 9) > 7)
- Talk(SAY_OOX_AGGRO);
- }
-
- void JustSummoned(Creature* summoned)
- {
- summoned->AI()->AttackStart(me);
- }
- };
-
-};
-
-/*######
-## npc_screecher_spirit
-######*/
-
-class npc_screecher_spirit : public CreatureScript
-{
-public:
- npc_screecher_spirit() : CreatureScript("npc_screecher_spirit") { }
-
- bool OnGossipHello(Player* player, Creature* creature)
- {
- player->SEND_GOSSIP_MENU(2039, creature->GetGUID());
- player->TalkedToCreature(creature->GetEntry(), creature->GetGUID());
- creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
-
- return true;
- }
-
-};
-
-enum GordunniTrap
-{
- GO_GORDUNNI_DIRT_MOUND = 144064,
-};
-
-class spell_gordunni_trap : public SpellScriptLoader
-{
- public:
- spell_gordunni_trap() : SpellScriptLoader("spell_gordunni_trap") { }
-
- class spell_gordunni_trap_SpellScript : public SpellScript
- {
- PrepareSpellScript(spell_gordunni_trap_SpellScript);
-
- void HandleDummy()
- {
- if (Unit* caster = GetCaster())
- if (GameObject* chest = caster->SummonGameObject(GO_GORDUNNI_DIRT_MOUND, caster->GetPositionX(), caster->GetPositionY(), caster->GetPositionZ(), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0))
- {
- chest->SetSpellId(GetSpellInfo()->Id);
- caster->RemoveGameObject(chest, false);
- }
- }
-
- void Register()
- {
- OnCast += SpellCastFn(spell_gordunni_trap_SpellScript::HandleDummy);
- }
- };
-
- SpellScript* GetSpellScript() const
- {
- return new spell_gordunni_trap_SpellScript();
- }
-};
-
-/*######
-## AddSC
-######*/
-
void AddSC_feralas()
{
- new npc_gregan_brewspewer();
- new npc_oox22fe();
- new npc_screecher_spirit();
- new spell_gordunni_trap();
+
}
diff --git a/src/server/scripts/Kalimdor/zone_moonglade.cpp b/src/server/scripts/Kalimdor/zone_moonglade.cpp
index 5e6a0ca1ffa..bc8f9dab4ec 100644
--- a/src/server/scripts/Kalimdor/zone_moonglade.cpp
+++ b/src/server/scripts/Kalimdor/zone_moonglade.cpp
@@ -18,17 +18,13 @@
/* ScriptData
SDName: Moonglade
-SD%Complete: 100
-SDComment: Quest support: 30, 272, 5929, 5930, 10965. Special Flight Paths for Druid class.
+SD%Complete: 0
+SDComment: Quest support:
SDCategory: Moonglade
EndScriptData */
/* ContentData
-npc_bunthen_plainswind
-npc_great_bear_spirit
-npc_silva_filnaveth
-npc_clintar_spirit
-npc_clintar_dreamwalker
+npc_omen
EndContentData */
#include "ScriptMgr.h"
diff --git a/src/server/scripts/Kalimdor/zone_mulgore.cpp b/src/server/scripts/Kalimdor/zone_mulgore.cpp
index 0a068e4288e..010eaff4e22 100644
--- a/src/server/scripts/Kalimdor/zone_mulgore.cpp
+++ b/src/server/scripts/Kalimdor/zone_mulgore.cpp
@@ -19,14 +19,13 @@
/* ScriptData
SDName: Mulgore
SD%Complete: 100
-SDComment: Support for quest: 11129, 772
+SDComment: Support for quest: 11129, 861
SDCategory: Mulgore
EndScriptData */
/* ContentData
npc_skorn_whitecloud
npc_kyle_frenzied
-npc_plains_vision
EndContentData */
#include "ScriptMgr.h"
@@ -201,127 +200,8 @@ public:
};
-/*#####
-# npc_plains_vision
-######*/
-
-Position const wpPlainVision[50] =
-{
- {-2226.32f, -408.095f, -9.36235f, 0.0f},
- {-2203.04f, -437.212f, -5.72498f, 0.0f},
- {-2163.91f, -457.851f, -7.09049f, 0.0f},
- {-2123.87f, -448.137f, -9.29591f, 0.0f},
- {-2104.66f, -427.166f, -6.49513f, 0.0f},
- {-2101.48f, -422.826f, -5.3567f, 0.0f},
- {-2097.56f, -417.083f, -7.16716f, 0.0f},
- {-2084.87f, -398.626f, -9.88973f, 0.0f},
- {-2072.71f, -382.324f, -10.2488f, 0.0f},
- {-2054.05f, -356.728f, -6.22468f, 0.0f},
- {-2051.8f, -353.645f, -5.35791f, 0.0f},
- {-2049.08f, -349.912f, -6.15723f, 0.0f},
- {-2030.6f, -310.724f, -9.59302f, 0.0f},
- {-2002.15f, -249.308f, -10.8124f, 0.0f},
- {-1972.85f, -195.811f, -10.6316f, 0.0f},
- {-1940.93f, -147.652f, -11.7055f, 0.0f},
- {-1888.06f, -81.943f, -11.4404f, 0.0f},
- {-1837.05f, -34.0109f, -12.258f, 0.0f},
- {-1796.12f, -14.6462f, -10.3581f, 0.0f},
- {-1732.61f, -4.27746f, -10.0213f, 0.0f},
- {-1688.94f, -0.829945f, -11.7103f, 0.0f},
- {-1681.32f, 13.0313f, -9.48056f, 0.0f},
- {-1677.04f, 36.8349f, -7.10318f, 0.0f},
- {-1675.2f, 68.559f, -8.95384f, 0.0f},
- {-1676.57f, 89.023f, -9.65104f, 0.0f},
- {-1678.16f, 110.939f, -10.1782f, 0.0f},
- {-1677.86f, 128.681f, -5.73869f, 0.0f},
- {-1675.27f, 144.324f, -3.47916f, 0.0f},
- {-1671.7f, 163.169f, -1.23098f, 0.0f},
- {-1666.61f, 181.584f, 5.26145f, 0.0f},
- {-1661.51f, 196.154f, 8.95252f, 0.0f},
- {-1655.47f, 210.811f, 8.38727f, 0.0f},
- {-1647.07f, 226.947f, 5.27755f, 0.0f},
- {-1621.65f, 232.91f, 2.69579f, 0.0f},
- {-1600.23f, 237.641f, 2.98539f, 0.0f},
- {-1576.07f, 242.546f, 4.66541f, 0.0f},
- {-1554.57f, 248.494f, 6.60377f, 0.0f},
- {-1547.53f, 259.302f, 10.6741f, 0.0f},
- {-1541.7f, 269.847f, 16.4418f, 0.0f},
- {-1539.83f, 278.989f, 21.0597f, 0.0f},
- {-1540.16f, 290.219f, 27.8247f, 0.0f},
- {-1538.99f, 298.983f, 34.0032f, 0.0f},
- {-1540.38f, 307.337f, 41.3557f, 0.0f},
- {-1536.61f, 314.884f, 48.0179f, 0.0f},
- {-1532.42f, 323.277f, 55.6667f, 0.0f},
- {-1528.77f, 329.774f, 61.1525f, 0.0f},
- {-1525.65f, 333.18f, 63.2161f, 0.0f},
- {-1517.01f, 350.713f, 62.4286f, 0.0f},
- {-1511.39f, 362.537f, 62.4539f, 0.0f},
- {-1508.68f, 366.822f, 62.733f, 0.0f}
-};
-
-class npc_plains_vision : public CreatureScript
-{
-public:
- npc_plains_vision() : CreatureScript("npc_plains_vision") { }
-
- CreatureAI* GetAI(Creature* creature) const
- {
- return new npc_plains_visionAI (creature);
- }
-
- struct npc_plains_visionAI : public ScriptedAI
- {
- npc_plains_visionAI(Creature* creature) : ScriptedAI(creature) {}
-
- bool newWaypoint;
- uint8 WayPointId;
- uint8 amountWP;
-
- void Reset()
- {
- WayPointId = 0;
- newWaypoint = true;
- amountWP = 49;
- }
-
- void EnterCombat(Unit* /*who*/){}
-
- void MovementInform(uint32 type, uint32 id)
- {
- if (type != POINT_MOTION_TYPE)
- return;
-
- if (id < amountWP)
- {
- ++WayPointId;
- newWaypoint = true;
- }
- else
- {
- me->setDeathState(JUST_DIED);
- me->RemoveCorpse();
- }
- }
-
- void UpdateAI(uint32 /*diff*/)
- {
- if (newWaypoint)
- {
- me->GetMotionMaster()->MovePoint(WayPointId, wpPlainVision[WayPointId]);
- newWaypoint = false;
- }
- }
- };
-
-};
-
-/*#####
-#
-######*/
-
void AddSC_mulgore()
{
new npc_skorn_whitecloud();
new npc_kyle_frenzied();
- new npc_plains_vision();
}
diff --git a/src/server/scripts/Kalimdor/zone_orgrimmar.cpp b/src/server/scripts/Kalimdor/zone_orgrimmar.cpp
index a497bc82abc..ccc8bdc257a 100644
--- a/src/server/scripts/Kalimdor/zone_orgrimmar.cpp
+++ b/src/server/scripts/Kalimdor/zone_orgrimmar.cpp
@@ -18,14 +18,12 @@
/* ScriptData
SDName: Orgrimmar
-SD%Complete: 100
-SDComment: Quest support: 2460, 6566
+SD%Complete: 0
+SDComment: Quest support:
SDCategory: Orgrimmar
EndScriptData */
/* ContentData
-npc_shenthul
-npc_thrall_warchief
EndContentData */
#include "ScriptMgr.h"
@@ -33,222 +31,6 @@ EndContentData */
#include "ScriptedGossip.h"
#include "Player.h"
-/*######
-## npc_shenthul
-######*/
-
-enum Shenthul
-{
- QUEST_SHATTERED_SALUTE = 2460
-};
-
-class npc_shenthul : public CreatureScript
-{
-public:
- npc_shenthul() : CreatureScript("npc_shenthul") { }
-
- bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest)
- {
- if (quest->GetQuestId() == QUEST_SHATTERED_SALUTE)
- {
- CAST_AI(npc_shenthul::npc_shenthulAI, creature->AI())->CanTalk = true;
- CAST_AI(npc_shenthul::npc_shenthulAI, creature->AI())->PlayerGUID = player->GetGUID();
- }
- return true;
- }
-
- CreatureAI* GetAI(Creature* creature) const
- {
- return new npc_shenthulAI (creature);
- }
-
- struct npc_shenthulAI : public ScriptedAI
- {
- npc_shenthulAI(Creature* creature) : ScriptedAI(creature) {}
-
- bool CanTalk;
- bool CanEmote;
- uint32 SaluteTimer;
- uint32 ResetTimer;
- uint64 PlayerGUID;
-
- void Reset()
- {
- CanTalk = false;
- CanEmote = false;
- SaluteTimer = 6000;
- ResetTimer = 0;
- PlayerGUID = 0;
- }
-
- void EnterCombat(Unit* /*who*/) {}
-
- void UpdateAI(uint32 diff)
- {
- if (CanEmote)
- {
- if (ResetTimer <= diff)
- {
- if (Player* player = Unit::GetPlayer(*me, PlayerGUID))
- {
- if (player->GetTypeId() == TYPEID_PLAYER && player->GetQuestStatus(QUEST_SHATTERED_SALUTE) == QUEST_STATUS_INCOMPLETE)
- player->FailQuest(QUEST_SHATTERED_SALUTE);
- }
- Reset();
- } else ResetTimer -= diff;
- }
-
- if (CanTalk && !CanEmote)
- {
- if (SaluteTimer <= diff)
- {
- me->HandleEmoteCommand(EMOTE_ONESHOT_SALUTE);
- CanEmote = true;
- ResetTimer = 60000;
- } else SaluteTimer -= diff;
- }
-
- if (!UpdateVictim())
- return;
-
- DoMeleeAttackIfReady();
- }
-
- void ReceiveEmote(Player* player, uint32 emote)
- {
- if (emote == TEXT_EMOTE_SALUTE && player->GetQuestStatus(QUEST_SHATTERED_SALUTE) == QUEST_STATUS_INCOMPLETE)
- {
- if (CanEmote)
- {
- player->AreaExploredOrEventHappens(QUEST_SHATTERED_SALUTE);
- Reset();
- }
- }
- }
- };
-
-};
-
-/*######
-## npc_thrall_warchief
-######*/
-
-enum ThrallWarchief
-{
- QUEST_6566 = 6566,
-
- SPELL_CHAIN_LIGHTNING = 16033,
- SPELL_SHOCK = 16034
-};
-
-#define GOSSIP_HTW "Please share your wisdom with me, Warchief."
-#define GOSSIP_STW1 "What discoveries?"
-#define GOSSIP_STW2 "Usurper?"
-#define GOSSIP_STW3 "With all due respect, Warchief - why not allow them to be destroyed? Does this not strengthen our position?"
-#define GOSSIP_STW4 "I... I did not think of it that way, Warchief."
-#define GOSSIP_STW5 "I live only to serve, Warchief! My life is empty and meaningless without your guidance."
-#define GOSSIP_STW6 "Of course, Warchief!"
-
-/// @todo verify abilities/timers
-class npc_thrall_warchief : public CreatureScript
-{
-public:
- npc_thrall_warchief() : CreatureScript("npc_thrall_warchief") { }
-
- bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action)
- {
- player->PlayerTalkClass->ClearMenus();
- switch (action)
- {
- case GOSSIP_ACTION_INFO_DEF+1:
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_STW1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2);
- player->SEND_GOSSIP_MENU(5733, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+2:
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_STW2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+3);
- player->SEND_GOSSIP_MENU(5734, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+3:
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_STW3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+4);
- player->SEND_GOSSIP_MENU(5735, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+4:
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_STW4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+5);
- player->SEND_GOSSIP_MENU(5736, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+5:
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_STW5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+6);
- player->SEND_GOSSIP_MENU(5737, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+6:
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_STW6, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+7);
- player->SEND_GOSSIP_MENU(5738, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+7:
- player->CLOSE_GOSSIP_MENU();
- player->AreaExploredOrEventHappens(QUEST_6566);
- break;
- }
- return true;
- }
-
- bool OnGossipHello(Player* player, Creature* creature)
- {
- if (creature->IsQuestGiver())
- player->PrepareQuestMenu(creature->GetGUID());
-
- if (player->GetQuestStatus(QUEST_6566) == QUEST_STATUS_INCOMPLETE)
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_HTW, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
-
- player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID());
- return true;
- }
-
- CreatureAI* GetAI(Creature* creature) const
- {
- return new npc_thrall_warchiefAI (creature);
- }
-
- struct npc_thrall_warchiefAI : public ScriptedAI
- {
- npc_thrall_warchiefAI(Creature* creature) : ScriptedAI(creature) {}
-
- uint32 ChainLightningTimer;
- uint32 ShockTimer;
-
- void Reset()
- {
- ChainLightningTimer = 2000;
- ShockTimer = 8000;
- }
-
- void EnterCombat(Unit* /*who*/) {}
-
- void UpdateAI(uint32 diff)
- {
- if (!UpdateVictim())
- return;
-
- if (ChainLightningTimer <= diff)
- {
- DoCastVictim(SPELL_CHAIN_LIGHTNING);
- ChainLightningTimer = 9000;
- } else ChainLightningTimer -= diff;
-
- if (ShockTimer <= diff)
- {
- DoCastVictim(SPELL_SHOCK);
- ShockTimer = 15000;
- } else ShockTimer -= diff;
-
- DoMeleeAttackIfReady();
- }
- };
-
-};
-
void AddSC_orgrimmar()
{
- new npc_shenthul();
- new npc_thrall_warchief();
}
diff --git a/src/server/scripts/Kalimdor/zone_silithus.cpp b/src/server/scripts/Kalimdor/zone_silithus.cpp
index c6d92c1dcac..24e802f78ec 100644
--- a/src/server/scripts/Kalimdor/zone_silithus.cpp
+++ b/src/server/scripts/Kalimdor/zone_silithus.cpp
@@ -19,14 +19,14 @@
/* ScriptData
SDName: Silithus
SD%Complete: 100
-SDComment: Quest support: 7785, 8304, 8507.
+SDComment: Quest support: 7785, 8304.
SDCategory: Silithus
EndScriptData */
/* ContentData
npc_highlord_demitrian
npcs_rutgar_and_frankal
-quest_a_pawn_on_the_eternal_pawn
+go_wind_stone
EndContentData */
#include "ScriptMgr.h"
@@ -1505,10 +1505,6 @@ class go_wind_stone : public GameObjectScript
void AddSC_silithus()
{
- new go_crystalline_tear();
- new npc_anachronos_quest_trigger();
- new npc_anachronos_the_ancient();
- new npc_qiraj_war_spawn();
new npc_highlord_demitrian();
new npcs_rutgar_and_frankal();
new go_wind_stone();
diff --git a/src/server/scripts/Kalimdor/zone_stonetalon_mountains.cpp b/src/server/scripts/Kalimdor/zone_stonetalon_mountains.cpp
index bb24a4a6286..4c22b4fc81d 100644
--- a/src/server/scripts/Kalimdor/zone_stonetalon_mountains.cpp
+++ b/src/server/scripts/Kalimdor/zone_stonetalon_mountains.cpp
@@ -16,164 +16,6 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/* ScriptData
-SDName: Stonetalon_Mountains
-SD%Complete: 95
-SDComment: Quest support: 6627, 6523
-SDCategory: Stonetalon Mountains
-EndScriptData */
-
-/* ContentData
-npc_braug_dimspirit
-npc_kaya_flathoof
-EndContentData */
-
-#include "ScriptMgr.h"
-#include "ScriptedCreature.h"
-#include "ScriptedGossip.h"
-#include "ScriptedEscortAI.h"
-#include "Player.h"
-
-/*######
-## npc_braug_dimspirit
-######*/
-
-#define GOSSIP_HBD1 "Ysera"
-#define GOSSIP_HBD2 "Neltharion"
-#define GOSSIP_HBD3 "Nozdormu"
-#define GOSSIP_HBD4 "Alexstrasza"
-#define GOSSIP_HBD5 "Malygos"
-
-class npc_braug_dimspirit : public CreatureScript
-{
-public:
- npc_braug_dimspirit() : CreatureScript("npc_braug_dimspirit") { }
-
- bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action)
- {
- player->PlayerTalkClass->ClearMenus();
- if (action == GOSSIP_ACTION_INFO_DEF+1)
- {
- player->CLOSE_GOSSIP_MENU();
- creature->CastSpell(player, 6766, false);
-
- }
- if (action == GOSSIP_ACTION_INFO_DEF+2)
- {
- player->CLOSE_GOSSIP_MENU();
- player->AreaExploredOrEventHappens(6627);
- }
- return true;
- }
-
- bool OnGossipHello(Player* player, Creature* creature)
- {
- if (creature->IsQuestGiver())
- player->PrepareQuestMenu(creature->GetGUID());
-
- if (player->GetQuestStatus(6627) == QUEST_STATUS_INCOMPLETE)
- {
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_HBD1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_HBD2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2);
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_HBD3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_HBD4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_HBD5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
-
- player->SEND_GOSSIP_MENU(5820, creature->GetGUID());
- }
- else
- player->SEND_GOSSIP_MENU(5819, creature->GetGUID());
-
- return true;
- }
-
-};
-
-/*######
-## npc_kaya_flathoof
-######*/
-
-enum Kaya
-{
- FACTION_ESCORTEE_H = 775,
-
- NPC_GRIMTOTEM_RUFFIAN = 11910,
- NPC_GRIMTOTEM_BRUTE = 11912,
- NPC_GRIMTOTEM_SORCERER = 11913,
-
- SAY_START = 0,
- SAY_AMBUSH = 1,
- SAY_END = 2,
-
- QUEST_PROTECT_KAYA = 6523
-};
-
-class npc_kaya_flathoof : public CreatureScript
-{
-public:
- npc_kaya_flathoof() : CreatureScript("npc_kaya_flathoof") { }
-
- struct npc_kaya_flathoofAI : public npc_escortAI
- {
- npc_kaya_flathoofAI(Creature* creature) : npc_escortAI(creature) {}
-
- void WaypointReached(uint32 waypointId)
- {
- Player* player = GetPlayerForEscort();
- if (!player)
- return;
-
- switch (waypointId)
- {
- case 16:
- Talk(SAY_AMBUSH);
- me->SummonCreature(NPC_GRIMTOTEM_BRUTE, -48.53f, -503.34f, -46.31f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
- me->SummonCreature(NPC_GRIMTOTEM_RUFFIAN, -38.85f, -503.77f, -45.90f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
- me->SummonCreature(NPC_GRIMTOTEM_SORCERER, -36.37f, -496.23f, -45.71f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
- break;
- case 18:
- me->SetInFront(player);
- Talk(SAY_END);
- player->GroupEventHappens(QUEST_PROTECT_KAYA, me);
- break;
- }
- }
-
- void JustSummoned(Creature* summoned)
- {
- summoned->AI()->AttackStart(me);
- }
-
- void Reset(){}
- };
-
- bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest)
- {
- if (quest->GetQuestId() == QUEST_PROTECT_KAYA)
- {
- if (npc_escortAI* pEscortAI = CAST_AI(npc_kaya_flathoof::npc_kaya_flathoofAI, creature->AI()))
- pEscortAI->Start(true, false, player->GetGUID());
-
- creature->AI()->Talk(SAY_START);
- creature->setFaction(113);
- creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
- }
- return true;
- }
-
- CreatureAI* GetAI(Creature* creature) const
- {
- return new npc_kaya_flathoofAI(creature);
- }
-
-};
-
-/*######
-## AddSC
-######*/
-
void AddSC_stonetalon_mountains()
{
- new npc_braug_dimspirit();
- new npc_kaya_flathoof();
}
diff --git a/src/server/scripts/Kalimdor/zone_tanaris.cpp b/src/server/scripts/Kalimdor/zone_tanaris.cpp
index 06401766861..82e89a18c0e 100644
--- a/src/server/scripts/Kalimdor/zone_tanaris.cpp
+++ b/src/server/scripts/Kalimdor/zone_tanaris.cpp
@@ -19,18 +19,14 @@
/* ScriptData
SDName: Tanaris
SD%Complete: 80
-SDComment: Quest support: 648, 1560, 2954, 4005, 10277, 10279(Special flight path). Noggenfogger vendor
+SDComment: Quest support: 648, 10277, 10279(Special flight path).
SDCategory: Tanaris
EndScriptData */
/* ContentData
-npc_aquementas
npc_custodian_of_time
-npc_marin_noggenfogger
npc_steward_of_time
-npc_stone_watcher_of_norgannon
npc_OOX17
-npc_tooga
EndContentData */
#include "ScriptMgr.h"
@@ -281,39 +277,6 @@ public:
};
/*######
-## npc_marin_noggenfogger
-######*/
-
-class npc_marin_noggenfogger : public CreatureScript
-{
-public:
- npc_marin_noggenfogger() : CreatureScript("npc_marin_noggenfogger") { }
-
- bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action)
- {
- player->PlayerTalkClass->ClearMenus();
- if (action == GOSSIP_ACTION_TRADE)
- player->GetSession()->SendListInventory(creature->GetGUID());
-
- return true;
- }
-
- bool OnGossipHello(Player* player, Creature* creature)
- {
- if (creature->IsQuestGiver())
- player->PrepareQuestMenu(creature->GetGUID());
-
- if (creature->IsVendor() && player->GetQuestRewardStatus(2662))
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE);
-
- player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID());
-
- return true;
- }
-
-};
-
-/*######
## npc_steward_of_time
######*/
@@ -360,70 +323,6 @@ public:
};
/*######
-## npc_stone_watcher_of_norgannon
-######*/
-
-#define GOSSIP_ITEM_NORGANNON_1 "What function do you serve?"
-#define GOSSIP_ITEM_NORGANNON_2 "What are the Plates of Uldum?"
-#define GOSSIP_ITEM_NORGANNON_3 "Where are the Plates of Uldum?"
-#define GOSSIP_ITEM_NORGANNON_4 "Excuse me? We've been \"reschedueled for visitations\"? What does that mean?!"
-#define GOSSIP_ITEM_NORGANNON_5 "So, what's inside Uldum?"
-#define GOSSIP_ITEM_NORGANNON_6 "I will return when i have the Plates of Uldum."
-
-class npc_stone_watcher_of_norgannon : public CreatureScript
-{
-public:
- npc_stone_watcher_of_norgannon() : CreatureScript("npc_stone_watcher_of_norgannon") { }
-
- bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action)
- {
- player->PlayerTalkClass->ClearMenus();
- switch (action)
- {
- case GOSSIP_ACTION_INFO_DEF:
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_NORGANNON_2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
- player->SEND_GOSSIP_MENU(1675, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+1:
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_NORGANNON_3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2);
- player->SEND_GOSSIP_MENU(1676, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+2:
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_NORGANNON_4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+3);
- player->SEND_GOSSIP_MENU(1677, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+3:
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_NORGANNON_5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+4);
- player->SEND_GOSSIP_MENU(1678, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+4:
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_NORGANNON_6, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+5);
- player->SEND_GOSSIP_MENU(1679, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+5:
- player->CLOSE_GOSSIP_MENU();
- player->AreaExploredOrEventHappens(2954);
- break;
- }
- return true;
- }
-
- bool OnGossipHello(Player* player, Creature* creature)
- {
- if (creature->IsQuestGiver())
- player->PrepareQuestMenu(creature->GetGUID());
-
- if (player->GetQuestStatus(2954) == QUEST_STATUS_INCOMPLETE)
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_NORGANNON_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
-
- player->SEND_GOSSIP_MENU(1674, creature->GetGUID());
-
- return true;
- }
-
-};
-
-/*######
## npc_OOX17
######*/
@@ -677,11 +576,7 @@ public:
void AddSC_tanaris()
{
- new npc_aquementas();
new npc_custodian_of_time();
- new npc_marin_noggenfogger();
new npc_steward_of_time();
- new npc_stone_watcher_of_norgannon();
new npc_OOX17();
- new npc_tooga();
}
diff --git a/src/server/scripts/Kalimdor/zone_the_barrens.cpp b/src/server/scripts/Kalimdor/zone_the_barrens.cpp
index 80cb81aaaec..4cfe76a5c5a 100644
--- a/src/server/scripts/Kalimdor/zone_the_barrens.cpp
+++ b/src/server/scripts/Kalimdor/zone_the_barrens.cpp
@@ -19,16 +19,11 @@
/* ScriptData
SDName: The_Barrens
SD%Complete: 90
-SDComment: Quest support: 863, 898, 1719, 2458, 4921, 6981,
+SDComment: Quest support: 863
SDCategory: Barrens
EndScriptData */
/* ContentData
-npc_beaten_corpse
-npc_gilthares
-npc_sputtervalve
-npc_taskmaster_fizzule
-npc_twiggy_flathead
npc_wizzlecrank_shredder
EndContentData */
@@ -688,10 +683,5 @@ public:
void AddSC_the_barrens()
{
- new npc_beaten_corpse();
- new npc_gilthares();
- new npc_sputtervalve();
- new npc_taskmaster_fizzule();
- new npc_twiggy_flathead();
new npc_wizzlecrank_shredder();
}
diff --git a/src/server/scripts/Kalimdor/zone_thousand_needles.cpp b/src/server/scripts/Kalimdor/zone_thousand_needles.cpp
index b4ed931ced4..df75b045309 100644
--- a/src/server/scripts/Kalimdor/zone_thousand_needles.cpp
+++ b/src/server/scripts/Kalimdor/zone_thousand_needles.cpp
@@ -16,448 +16,6 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/* ScriptData
-SDName: Thousand Needles
-SD%Complete: 100
-SDComment: Support for Quest: 1950, 4770, 4904, 4966, 5151.
-SDCategory: Thousand Needles
-EndScriptData */
-
-/* ContentData
-npc_kanati
-npc_lakota_windsong
-npc_swiftmountain
-npc_plucky
-npc_enraged_panther
-go_panther_cage
-EndContentData */
-
-#include "ScriptMgr.h"
-#include "ScriptedCreature.h"
-#include "ScriptedGossip.h"
-#include "ScriptedEscortAI.h"
-#include "Player.h"
-
-/*#####
-# npc_kanati
-######*/
-
-enum Kanati
-{
- SAY_KAN_START = 0,
-
- QUEST_PROTECT_KANATI = 4966,
- NPC_GALAK_ASS = 10720
-};
-
-Position const GalakLoc = {-4867.387695f, -1357.353760f, -48.226f, 0.0f};
-
-class npc_kanati : public CreatureScript
-{
-public:
- npc_kanati() : CreatureScript("npc_kanati") { }
-
- bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest)
- {
- if (quest->GetQuestId() == QUEST_PROTECT_KANATI)
- if (npc_kanatiAI* pEscortAI = CAST_AI(npc_kanati::npc_kanatiAI, creature->AI()))
- pEscortAI->Start(false, false, player->GetGUID(), quest, true);
-
- return true;
- }
-
- CreatureAI* GetAI(Creature* creature) const
- {
- return new npc_kanatiAI(creature);
- }
-
- struct npc_kanatiAI : public npc_escortAI
- {
- npc_kanatiAI(Creature* creature) : npc_escortAI(creature) { }
-
- void Reset() {}
-
- void WaypointReached(uint32 waypointId)
- {
- switch (waypointId)
- {
- case 0:
- Talk(SAY_KAN_START);
- DoSpawnGalak();
- break;
- case 1:
- if (Player* player = GetPlayerForEscort())
- player->GroupEventHappens(QUEST_PROTECT_KANATI, me);
- break;
- }
- }
-
- void DoSpawnGalak()
- {
- for (int i = 0; i < 3; ++i)
- me->SummonCreature(NPC_GALAK_ASS, GalakLoc, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000);
- }
-
- void JustSummoned(Creature* summoned)
- {
- summoned->AI()->AttackStart(me);
- }
- };
-
-};
-
-/*######
-# npc_lakota_windsong
-######*/
-
-enum Lakota
-{
- SAY_LAKO_START = 0,
- SAY_LAKO_LOOK_OUT = 1,
- SAY_LAKO_HERE_COME = 2,
- SAY_LAKO_MORE = 3,
- SAY_LAKO_END = 4,
-
- QUEST_FREE_AT_LAST = 4904,
- NPC_GRIM_BANDIT = 10758,
- FACTION_ESCORTEE_LAKO = 232, //guessed
-
- ID_AMBUSH_1 = 0,
- ID_AMBUSH_2 = 2,
- ID_AMBUSH_3 = 4
-};
-
-Position const BanditLoc[6] =
-{
- {-4905.479492f, -2062.732666f, 84.352f, 0.0f},
- {-4915.201172f, -2073.528320f, 84.733f, 0.0f},
- {-4878.883301f, -1986.947876f, 91.966f, 0.0f},
- {-4877.503906f, -1966.113403f, 91.859f, 0.0f},
- {-4767.985352f, -1873.169189f, 90.192f, 0.0f},
- {-4788.861328f, -1888.007813f, 89.888f, 0.0f}
-};
-
-class npc_lakota_windsong : public CreatureScript
-{
-public:
- npc_lakota_windsong() : CreatureScript("npc_lakota_windsong") { }
-
- bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest)
- {
- if (quest->GetQuestId() == QUEST_FREE_AT_LAST)
- {
- creature->AI()->Talk(SAY_LAKO_START, player->GetGUID());
- creature->setFaction(FACTION_ESCORTEE_LAKO);
-
- if (npc_lakota_windsongAI* pEscortAI = CAST_AI(npc_lakota_windsong::npc_lakota_windsongAI, creature->AI()))
- pEscortAI->Start(false, false, player->GetGUID(), quest);
- }
- return true;
- }
-
- CreatureAI* GetAI(Creature* creature) const
- {
- return new npc_lakota_windsongAI(creature);
- }
-
- struct npc_lakota_windsongAI : public npc_escortAI
- {
- npc_lakota_windsongAI(Creature* creature) : npc_escortAI(creature) { }
-
- void Reset() {}
-
- void WaypointReached(uint32 waypointId)
- {
- switch (waypointId)
- {
- case 8:
- Talk(SAY_LAKO_LOOK_OUT);
- DoSpawnBandits(ID_AMBUSH_1);
- break;
- case 14:
- Talk(SAY_LAKO_HERE_COME);
- DoSpawnBandits(ID_AMBUSH_2);
- break;
- case 21:
- Talk(SAY_LAKO_MORE);
- DoSpawnBandits(ID_AMBUSH_3);
- break;
- case 45:
- if (Player* player = GetPlayerForEscort())
- player->GroupEventHappens(QUEST_FREE_AT_LAST, me);
- break;
- }
- }
-
- void DoSpawnBandits(int AmbushId)
- {
- for (int i = 0; i < 2; ++i)
- me->SummonCreature(NPC_GRIM_BANDIT, BanditLoc[i+AmbushId], TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 60000);
- }
- };
-
-};
-
-/*######
-# npc_paoka_swiftmountain
-######*/
-
-enum Packa
-{
- SAY_START = 0,
- SAY_WYVERN = 1,
- SAY_COMPLETE = 2,
-
- QUEST_HOMEWARD = 4770,
- NPC_WYVERN = 4107,
- FACTION_ESCORTEE = 232 //guessed
-};
-
-Position const WyvernLoc[3] =
-{
- {-4990.606f, -906.057f, -5.343f, 0.0f},
- {-4970.241f, -927.378f, -4.951f, 0.0f},
- {-4985.364f, -952.528f, -5.199f, 0.0f}
-};
-
-class npc_paoka_swiftmountain : public CreatureScript
-{
-public:
- npc_paoka_swiftmountain() : CreatureScript("npc_paoka_swiftmountain") { }
-
- bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest)
- {
- if (quest->GetQuestId() == QUEST_HOMEWARD)
- {
- creature->AI()->Talk(SAY_START, player->GetGUID());
- creature->setFaction(FACTION_ESCORTEE);
-
- if (npc_paoka_swiftmountainAI* pEscortAI = CAST_AI(npc_paoka_swiftmountain::npc_paoka_swiftmountainAI, creature->AI()))
- pEscortAI->Start(false, false, player->GetGUID(), quest);
- }
- return true;
- }
-
- CreatureAI* GetAI(Creature* creature) const
- {
- return new npc_paoka_swiftmountainAI(creature);
- }
-
- struct npc_paoka_swiftmountainAI : public npc_escortAI
- {
- npc_paoka_swiftmountainAI(Creature* creature) : npc_escortAI(creature) { }
-
- void Reset() {}
-
- void WaypointReached(uint32 waypointId)
- {
- switch (waypointId)
- {
- case 15:
- Talk(SAY_WYVERN);
- DoSpawnWyvern();
- break;
- case 26:
- Talk(SAY_COMPLETE);
- break;
- case 27:
- if (Player* player = GetPlayerForEscort())
- player->GroupEventHappens(QUEST_HOMEWARD, me);
- break;
- }
- }
-
- void DoSpawnWyvern()
- {
- for (int i = 0; i < 3; ++i)
- me->SummonCreature(NPC_WYVERN, WyvernLoc[i], TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 60000);
- }
- };
-};
-
-/*#####
-# npc_plucky
-######*/
-
-#define GOSSIP_P "Please tell me the Phrase.."
-
-enum Plucky
-{
- FACTION_FRIENDLY = 35,
- QUEST_SCOOP = 1950,
- SPELL_PLUCKY_HUMAN = 9192,
- SPELL_PLUCKY_CHICKEN = 9220
-};
-
-class npc_plucky : public CreatureScript
-{
-public:
- npc_plucky() : CreatureScript("npc_plucky") { }
-
- bool OnGossipSelect(Player* player, Creature* /*creature*/, uint32 /*sender*/, uint32 action)
- {
- player->PlayerTalkClass->ClearMenus();
- switch (action)
- {
- case GOSSIP_ACTION_INFO_DEF+1:
- player->CLOSE_GOSSIP_MENU();
- player->CompleteQuest(QUEST_SCOOP);
- break;
- }
- return true;
- }
-
- bool OnGossipHello(Player* player, Creature* creature)
- {
- if (player->GetQuestStatus(QUEST_SCOOP) == QUEST_STATUS_INCOMPLETE)
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_P, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
-
- player->SEND_GOSSIP_MENU(738, creature->GetGUID());
-
- return true;
- }
-
- CreatureAI* GetAI(Creature* creature) const
- {
- return new npc_pluckyAI(creature);
- }
-
- struct npc_pluckyAI : public ScriptedAI
- {
- npc_pluckyAI(Creature* creature) : ScriptedAI(creature) { NormFaction = creature->getFaction(); }
-
- uint32 NormFaction;
- uint32 ResetTimer;
-
- void Reset()
- {
- ResetTimer = 120000;
-
- if (me->getFaction() != NormFaction)
- me->setFaction(NormFaction);
-
- if (me->HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP))
- me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
-
- DoCast(me, SPELL_PLUCKY_CHICKEN, false);
- }
-
- void ReceiveEmote(Player* player, uint32 TextEmote)
- {
- if (player->GetQuestStatus(QUEST_SCOOP) == QUEST_STATUS_INCOMPLETE)
- {
- if (TextEmote == TEXT_EMOTE_BECKON)
- {
- me->setFaction(FACTION_FRIENDLY);
- me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
- DoCast(me, SPELL_PLUCKY_HUMAN, false);
- }
- }
-
- if (TextEmote == TEXT_EMOTE_CHICKEN)
- {
- if (me->HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP))
- return;
- else
- {
- me->setFaction(FACTION_FRIENDLY);
- me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
- DoCast(me, SPELL_PLUCKY_HUMAN, false);
- me->HandleEmoteCommand(EMOTE_ONESHOT_WAVE);
- }
- }
- }
-
- void UpdateAI(uint32 Diff)
- {
- if (me->HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP))
- {
- if (ResetTimer <= Diff)
- {
- if (!me->GetVictim())
- EnterEvadeMode();
- else
- me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
-
- return;
- }
- else
- ResetTimer -= Diff;
- }
-
- if (!UpdateVictim())
- return;
-
- DoMeleeAttackIfReady();
- }
- };
-
-};
-
-enum PantherCage
-{
- ENRAGED_PANTHER = 10992
-};
-
-class go_panther_cage : public GameObjectScript
-{
-public:
- go_panther_cage() : GameObjectScript("go_panther_cage") { }
-
- bool OnGossipHello(Player* player, GameObject* go)
- {
- go->UseDoorOrButton();
- if (player->GetQuestStatus(5151) == QUEST_STATUS_INCOMPLETE)
- {
- if (Creature* panther = go->FindNearestCreature(ENRAGED_PANTHER, 5, true))
- {
- panther->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
- panther->SetReactState(REACT_AGGRESSIVE);
- panther->AI()->AttackStart(player);
- }
- }
-
- return true;
- }
-};
-
-class npc_enraged_panther : public CreatureScript
-{
-public:
- npc_enraged_panther() : CreatureScript("npc_enraged_panther") { }
-
- CreatureAI* GetAI(Creature* creature) const
- {
- return new npc_enraged_pantherAI(creature);
- }
-
- struct npc_enraged_pantherAI : public ScriptedAI
- {
- npc_enraged_pantherAI(Creature* creature) : ScriptedAI(creature) {}
-
- void Reset()
- {
- me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
- me->SetReactState(REACT_PASSIVE);
- }
-
- void UpdateAI(uint32 /*diff*/)
- {
- if (!UpdateVictim())
- return;
-
- DoMeleeAttackIfReady();
- }
- };
-
-};
-
void AddSC_thousand_needles()
{
- new npc_kanati();
- new npc_lakota_windsong();
- new npc_paoka_swiftmountain();
- new npc_plucky();
- new npc_enraged_panther();
- new go_panther_cage();
}
diff --git a/src/server/scripts/Kalimdor/zone_thunder_bluff.cpp b/src/server/scripts/Kalimdor/zone_thunder_bluff.cpp
index f7dd842070e..74efa2ffaff 100644
--- a/src/server/scripts/Kalimdor/zone_thunder_bluff.cpp
+++ b/src/server/scripts/Kalimdor/zone_thunder_bluff.cpp
@@ -48,30 +48,6 @@ class npc_cairne_bloodhoof : public CreatureScript
public:
npc_cairne_bloodhoof() : CreatureScript("npc_cairne_bloodhoof") { }
- bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action)
- {
- player->PlayerTalkClass->ClearMenus();
- if (action == GOSSIP_SENDER_INFO)
- {
- player->CastSpell(player, 23123, false);
- player->SEND_GOSSIP_MENU(7014, creature->GetGUID());
- }
- return true;
- }
-
- bool OnGossipHello(Player* player, Creature* creature)
- {
- if (creature->IsQuestGiver())
- player->PrepareQuestMenu(creature->GetGUID());
-
- if (player->GetQuestStatus(925) == QUEST_STATUS_INCOMPLETE)
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_HCB, GOSSIP_SENDER_MAIN, GOSSIP_SENDER_INFO);
-
- player->SEND_GOSSIP_MENU(7013, creature->GetGUID());
-
- return true;
- }
-
CreatureAI* GetAI(Creature* creature) const
{
return new npc_cairne_bloodhoofAI (creature);
diff --git a/src/server/scripts/Kalimdor/zone_ungoro_crater.cpp b/src/server/scripts/Kalimdor/zone_ungoro_crater.cpp
index 221eed14afe..823fe56d364 100644
--- a/src/server/scripts/Kalimdor/zone_ungoro_crater.cpp
+++ b/src/server/scripts/Kalimdor/zone_ungoro_crater.cpp
@@ -16,333 +16,6 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/* ScriptData
-SDName: Ungoro Crater
-SD%Complete: 100
-SDComment: Support for Quest: 4245, 4491
-SDCategory: Ungoro Crater
-EndScriptData */
-
-/* ContentData
-npc_a-me
-npc_ringo
-EndContentData */
-
-#include "ScriptMgr.h"
-#include "ScriptedCreature.h"
-#include "ScriptedEscortAI.h"
-#include "ScriptedFollowerAI.h"
-#include "Player.h"
-#include "SpellInfo.h"
-
-enum AmeData
-{
- SAY_READY = 0,
- SAY_AGGRO1 = 1,
- SAY_SEARCH = 2,
- SAY_AGGRO2 = 3,
- SAY_AGGRO3 = 4,
- SAY_FINISH = 5,
-
- SPELL_DEMORALIZINGSHOUT = 13730,
-
- QUEST_CHASING_AME = 4245,
- ENTRY_TARLORD = 6519,
- ENTRY_TARLORD1 = 6519,
- ENTRY_STOMPER = 6513,
-};
-
-class npc_ame : public CreatureScript
-{
-public:
- npc_ame() : CreatureScript("npc_ame") { }
-
- bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest)
- {
- if (quest->GetQuestId() == QUEST_CHASING_AME)
- {
- CAST_AI(npc_escortAI, (creature->AI()))->Start(false, false, player->GetGUID());
- creature->AI()->Talk(SAY_READY, player->GetGUID());
- creature->SetUInt32Value(UNIT_FIELD_BYTES_1, 0);
- // Change faction so mobs attack
- creature->setFaction(113);
- }
- return true;
- }
-
- CreatureAI* GetAI(Creature* creature) const
- {
- return new npc_ameAI(creature);
- }
-
- struct npc_ameAI : public npc_escortAI
- {
- npc_ameAI(Creature* creature) : npc_escortAI(creature) {}
-
- uint32 DemoralizingShoutTimer;
-
- void WaypointReached(uint32 waypointId)
- {
- if (Player* player = GetPlayerForEscort())
- {
- switch (waypointId)
- {
- case 19:
- me->SummonCreature(ENTRY_STOMPER, -6391.69f, -1730.49f, -272.83f, 4.96f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000);
- Talk(SAY_AGGRO1, player->GetGUID());
- break;
- case 28:
- Talk(SAY_SEARCH, player->GetGUID());
- break;
- case 38:
- me->SummonCreature(ENTRY_TARLORD, -6370.75f, -1382.84f, -270.51f, 6.06f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000);
- Talk(SAY_AGGRO2, player->GetGUID());
- break;
- case 49:
- me->SummonCreature(ENTRY_TARLORD1, -6324.44f, -1181.05f, -270.17f, 4.34f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000);
- Talk(SAY_AGGRO3, player->GetGUID());
- break;
- case 55:
- Talk(SAY_FINISH, player->GetGUID());
- player->GroupEventHappens(QUEST_CHASING_AME, me);
- break;
- }
- }
- }
-
- void Reset()
- {
- DemoralizingShoutTimer = 5000;
- }
-
- void JustSummoned(Creature* summoned)
- {
- summoned->AI()->AttackStart(me);
- }
-
- void JustDied(Unit* /*killer*/)
- {
- if (Player* player = GetPlayerForEscort())
- player->FailQuest(QUEST_CHASING_AME);
- }
-
- void UpdateAI(uint32 diff)
- {
- npc_escortAI::UpdateAI(diff);
- if (!UpdateVictim())
- return;
-
- if (DemoralizingShoutTimer <= diff)
- {
- DoCastVictim(SPELL_DEMORALIZINGSHOUT);
- DemoralizingShoutTimer = 70000;
- } else DemoralizingShoutTimer -= diff;
- }
- };
-};
-
-/*####
-# npc_ringo
-####*/
-
-enum Ringo
-{
- SAY_RIN_START = 0,
-
- SAY_FAINT = 1,
-
- SAY_WAKE = 2,
-
- SAY_RIN_END_1 = 3,
- SAY_SPR_END_2 = 0,
- SAY_RIN_END_3 = 4,
- EMOTE_RIN_END_4 = 5,
- EMOTE_RIN_END_5 = 6,
- SAY_RIN_END_6 = 7,
- SAY_SPR_END_7 = 1,
- EMOTE_RIN_END_8 = 8,
-
- SPELL_REVIVE_RINGO = 15591,
- QUEST_A_LITTLE_HELP = 4491,
- NPC_SPRAGGLE = 9997,
- FACTION_ESCORTEE = 113
-};
-
-class npc_ringo : public CreatureScript
-{
-public:
- npc_ringo() : CreatureScript("npc_ringo") { }
-
- bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest)
- {
- if (quest->GetQuestId() == QUEST_A_LITTLE_HELP)
- {
- if (npc_ringoAI* ringoAI = CAST_AI(npc_ringo::npc_ringoAI, creature->AI()))
- {
- creature->SetStandState(UNIT_STAND_STATE_STAND);
- ringoAI->StartFollow(player, FACTION_ESCORTEE, quest);
- }
- }
-
- return true;
- }
-
- CreatureAI* GetAI(Creature* creature) const
- {
- return new npc_ringoAI(creature);
- }
-
- struct npc_ringoAI : public FollowerAI
- {
- npc_ringoAI(Creature* creature) : FollowerAI(creature) { }
-
- uint32 FaintTimer;
- uint32 EndEventProgress;
- uint32 EndEventTimer;
-
- uint64 SpraggleGUID;
-
- void Reset()
- {
- FaintTimer = urand(30000, 60000);
- EndEventProgress = 0;
- EndEventTimer = 1000;
- SpraggleGUID = 0;
- }
-
- void MoveInLineOfSight(Unit* who)
- {
- FollowerAI::MoveInLineOfSight(who);
-
- if (!me->GetVictim() && !HasFollowState(STATE_FOLLOW_COMPLETE) && who->GetEntry() == NPC_SPRAGGLE)
- {
- if (me->IsWithinDistInMap(who, INTERACTION_DISTANCE))
- {
- if (Player* player = GetLeaderForFollower())
- {
- if (player->GetQuestStatus(QUEST_A_LITTLE_HELP) == QUEST_STATUS_INCOMPLETE)
- player->GroupEventHappens(QUEST_A_LITTLE_HELP, me);
- }
-
- SpraggleGUID = who->GetGUID();
- SetFollowComplete(true);
- }
- }
- }
-
- void SpellHit(Unit* /*pCaster*/, const SpellInfo* pSpell)
- {
- if (HasFollowState(STATE_FOLLOW_INPROGRESS | STATE_FOLLOW_PAUSED) && pSpell->Id == SPELL_REVIVE_RINGO)
- ClearFaint();
- }
-
- void SetFaint()
- {
- if (!HasFollowState(STATE_FOLLOW_POSTEVENT))
- {
- SetFollowPaused(true);
-
- Talk(SAY_FAINT);
- }
-
- //what does actually happen here? Emote? Aura?
- me->SetStandState(UNIT_STAND_STATE_SLEEP);
- }
-
- void ClearFaint()
- {
- me->SetStandState(UNIT_STAND_STATE_STAND);
-
- if (HasFollowState(STATE_FOLLOW_POSTEVENT))
- return;
-
- Talk(SAY_WAKE);
-
- SetFollowPaused(false);
- }
-
- void UpdateFollowerAI(uint32 Diff)
- {
- if (!UpdateVictim())
- {
- if (HasFollowState(STATE_FOLLOW_POSTEVENT))
- {
- if (EndEventTimer <= Diff)
- {
- Creature* spraggle = Creature::GetCreature(*me, SpraggleGUID);
- if (!spraggle || !spraggle->IsAlive())
- {
- SetFollowComplete();
- return;
- }
-
- switch (EndEventProgress)
- {
- case 1:
- Talk(SAY_RIN_END_1);
- EndEventTimer = 3000;
- break;
- case 2:
- spraggle->AI()->Talk(SAY_SPR_END_2);
- EndEventTimer = 5000;
- break;
- case 3:
- Talk(SAY_RIN_END_3);
- EndEventTimer = 1000;
- break;
- case 4:
- Talk(EMOTE_RIN_END_4);
- SetFaint();
- EndEventTimer = 9000;
- break;
- case 5:
- Talk(EMOTE_RIN_END_5);
- ClearFaint();
- EndEventTimer = 1000;
- break;
- case 6:
- Talk(SAY_RIN_END_6);
- EndEventTimer = 3000;
- break;
- case 7:
- spraggle->AI()->Talk(SAY_SPR_END_7);
- EndEventTimer = 10000;
- break;
- case 8:
- Talk(EMOTE_RIN_END_8);
- EndEventTimer = 5000;
- break;
- case 9:
- SetFollowComplete();
- break;
- }
-
- ++EndEventProgress;
- }
- else
- EndEventTimer -= Diff;
- }
- else if (HasFollowState(STATE_FOLLOW_INPROGRESS) && !HasFollowState(STATE_FOLLOW_PAUSED))
- {
- if (FaintTimer <= Diff)
- {
- SetFaint();
- FaintTimer = urand(60000, 120000);
- }
- else
- FaintTimer -= Diff;
- }
-
- return;
- }
-
- DoMeleeAttackIfReady();
- }
- };
-};
-
void AddSC_ungoro_crater()
{
- new npc_ame();
- new npc_ringo();
}
diff --git a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_elder_nadox.cpp b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_elder_nadox.cpp
index 900d975f4bf..552009cc3e0 100644
--- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_elder_nadox.cpp
+++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_elder_nadox.cpp
@@ -176,7 +176,7 @@ class boss_elder_nadox : public CreatureScript
}
}
- if (me->HealthBelowPct(100 - AmountHealthModifier * 25))
+ if (me->HealthBelowPct(100 - AmountHealthModifier* 25))
{
Talk(EMOTE_HATCHES, me->GetGUID());
DoCast(me, SPELL_SUMMON_SWARM_GUARD);
@@ -298,7 +298,7 @@ public:
void FilterTargets(std::list<WorldObject*>& targets)
{
- targets.remove_if(GuardianCheck());
+ targets.remove_if (GuardianCheck());
}
void Register()
diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp
index f844b8feb11..0018722e01f 100644
--- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp
+++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp
@@ -20,7 +20,6 @@
#include "SpellAuraEffects.h"
#include "Spell.h"
#include "Vehicle.h"
-#include "MapManager.h"
#include "GameObjectAI.h"
#include "ScriptedCreature.h"
#include "ruby_sanctum.h"
diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_grand_champions.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_grand_champions.cpp
index 38d417ff075..a9750460bb5 100644
--- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_grand_champions.cpp
+++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_grand_champions.cpp
@@ -132,9 +132,9 @@ bool GrandChampionsOutVehicle(Creature* me)
if (pGrandChampion1 && pGrandChampion2 && pGrandChampion3)
{
- if (!pGrandChampion1->HasUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT) &&
- !pGrandChampion2->HasUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT) &&
- !pGrandChampion3->HasUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT))
+ if (!pGrandChampion1->m_movementInfo.transport.guid &&
+ !pGrandChampion2->m_movementInfo.transport.guid &&
+ !pGrandChampion3->m_movementInfo.transport.guid)
return true;
}
@@ -386,7 +386,7 @@ public:
}
}else uiPhaseTimer -= uiDiff;
- if (!UpdateVictim() || me->HasUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT))
+ if (!UpdateVictim() || me->m_movementInfo.transport.guid)
return;
if (uiInterceptTimer <= uiDiff)
@@ -530,7 +530,7 @@ public:
uiFireBallTimer = 5000;
} else uiFireBallTimer -= uiDiff;
- if (!UpdateVictim() || me->HasUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT))
+ if (!UpdateVictim() || me->m_movementInfo.transport.guid)
return;
if (uiFireBallTimer <= uiDiff)
@@ -668,7 +668,7 @@ public:
}
}else uiPhaseTimer -= uiDiff;
- if (!UpdateVictim() || me->HasUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT))
+ if (!UpdateVictim() || me->m_movementInfo.transport.guid)
return;
if (uiChainLightningTimer <= uiDiff)
@@ -814,7 +814,7 @@ public:
}
}else uiPhaseTimer -= uiDiff;
- if (!UpdateVictim() || me->HasUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT))
+ if (!UpdateVictim() || me->m_movementInfo.transport.guid)
return;
if (uiLightningArrowsTimer <= uiDiff)
@@ -962,7 +962,7 @@ public:
}
} else uiPhaseTimer -= uiDiff;
- if (!UpdateVictim() || me->HasUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT))
+ if (!UpdateVictim() || me->m_movementInfo.transport.guid)
return;
if (uiEviscerateTimer <= uiDiff)
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp
index 6d8a561a013..a213c420383 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp
@@ -355,7 +355,7 @@ class boss_lady_deathwhisper : public CreatureScript
void DamageTaken(Unit* /*damageDealer*/, uint32& damage)
{
// phase transition
- if (events.IsInPhase(PHASE_ONE) && damage > me->GetPower(POWER_MANA))
+ if (events.IsInPhase(PHASE_ONE) && damage > uint32(me->GetPower(POWER_MANA)))
{
Talk(SAY_PHASE_2);
Talk(EMOTE_PHASE_2);
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp
index 192ba06426d..42fe279ce87 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp
@@ -374,25 +374,6 @@ class NecroticPlagueTargetCheck : public std::unary_function<Unit*, bool>
uint32 _notAura2;
};
-class HeightDifferenceCheck
-{
- public:
- HeightDifferenceCheck(GameObject* go, float diff, bool reverse)
- : _baseObject(go), _difference(diff), _reverse(reverse)
- {
- }
-
- bool operator()(WorldObject* unit) const
- {
- return (unit->GetPositionZ() - _baseObject->GetPositionZ() > _difference) != _reverse;
- }
-
- private:
- GameObject* _baseObject;
- float _difference;
- bool _reverse;
-};
-
class FrozenThroneResetWorker
{
public:
@@ -1115,6 +1096,7 @@ class boss_the_lich_king : public CreatureScript
{
WorldPacket data(SMSG_PLAY_MUSIC, 4);
data << uint32(musicId);
+ data << uint64(me->GetGUID());
SendPacketToPlayers(&data);
}
@@ -1526,7 +1508,7 @@ class npc_valkyr_shadowguard : public CreatureScript
{
std::list<Creature*> triggers;
GetCreatureListWithEntryInGrid(triggers, me, NPC_WORLD_TRIGGER, 150.0f);
- triggers.remove_if(HeightDifferenceCheck(platform, 5.0f, true));
+ triggers.remove_if(Trinity::HeightDifferenceCheck(platform, 5.0f, true));
if (triggers.empty())
return;
@@ -2317,7 +2299,7 @@ class spell_the_lich_king_quake : public SpellScriptLoader
void FilterTargets(std::list<WorldObject*>& targets)
{
if (GameObject* platform = ObjectAccessor::GetGameObject(*GetCaster(), GetCaster()->GetInstanceScript()->GetData64(DATA_ARTHAS_PLATFORM)))
- targets.remove_if(HeightDifferenceCheck(platform, 5.0f, false));
+ targets.remove_if(Trinity::HeightDifferenceCheck(platform, 5.0f, false));
}
void HandleSendEvent(SpellEffIndex /*effIndex*/)
diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp
index a0ce73a9a55..00d1aac8e76 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp
@@ -531,7 +531,7 @@ class boss_flame_leviathan : public CreatureScript
}
private:
- //! Copypasta from DoSpellAttackIfReady, only difference is the target - it cannot be selected trough getVictim this way -
+ //! Copypasta from DoSpellAttackIfReady, only difference is the target - it cannot be selected trough GetVictim this way -
//! I also removed the spellInfo check
void DoBatteringRamIfReady()
{
diff --git a/src/server/scripts/Northrend/zone_dalaran.cpp b/src/server/scripts/Northrend/zone_dalaran.cpp
index d5181d68680..e629ade9f52 100644
--- a/src/server/scripts/Northrend/zone_dalaran.cpp
+++ b/src/server/scripts/Northrend/zone_dalaran.cpp
@@ -126,52 +126,7 @@ public:
}
};
-/*######
-## npc_hira_snowdawn
-######*/
-
-enum eHiraSnowdawn
-{
- SPELL_COLD_WEATHER_FLYING = 54197
-};
-
-#define GOSSIP_TEXT_TRAIN_HIRA "I seek training to ride a steed."
-
-class npc_hira_snowdawn : public CreatureScript
-{
-public:
- npc_hira_snowdawn() : CreatureScript("npc_hira_snowdawn") { }
-
- bool OnGossipHello(Player* player, Creature* creature)
- {
- if (!creature->IsVendor() || !creature->IsTrainer())
- return false;
-
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_VENDOR, GOSSIP_TEXT_TRAIN_HIRA, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRAIN);
-
- if (player->getLevel() >= 80 && player->HasSpell(SPELL_COLD_WEATHER_FLYING))
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE);
-
- player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID());
-
- return true;
- }
-
- bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action)
- {
- player->PlayerTalkClass->ClearMenus();
- if (action == GOSSIP_ACTION_TRAIN)
- player->GetSession()->SendTrainerList(creature->GetGUID());
-
- if (action == GOSSIP_ACTION_TRADE)
- player->GetSession()->SendListInventory(creature->GetGUID());
-
- return true;
- }
-};
-
void AddSC_dalaran()
{
new npc_mageguard_dalaran;
- new npc_hira_snowdawn;
}
diff --git a/src/server/scripts/OutdoorPvP/CMakeLists.txt b/src/server/scripts/OutdoorPvP/CMakeLists.txt
index 1789cbc1ffe..ef10db772c9 100644
--- a/src/server/scripts/OutdoorPvP/CMakeLists.txt
+++ b/src/server/scripts/OutdoorPvP/CMakeLists.txt
@@ -17,8 +17,6 @@ set(scripts_STAT_SRCS
OutdoorPvP/OutdoorPvPNA.cpp
OutdoorPvP/OutdoorPvPHP.cpp
OutdoorPvP/OutdoorPvPTF.h
- OutdoorPvP/OutdoorPvPEP.h
- OutdoorPvP/OutdoorPvPEP.cpp
OutdoorPvP/OutdoorPvPHP.h
OutdoorPvP/OutdoorPvPZM.h
OutdoorPvP/OutdoorPvPNA.h
diff --git a/src/server/scripts/OutdoorPvP/OutdoorPvPEP.cpp b/src/server/scripts/OutdoorPvP/OutdoorPvPEP.cpp
deleted file mode 100644
index 79755c0f57d..00000000000
--- a/src/server/scripts/OutdoorPvP/OutdoorPvPEP.cpp
+++ /dev/null
@@ -1,785 +0,0 @@
-/*
- * Copyright (C) 2008-2013 TrinityCore <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, see <http://www.gnu.org/licenses/>.
- */
-
-#include "ScriptMgr.h"
-#include "OutdoorPvPEP.h"
-#include "WorldPacket.h"
-#include "Player.h"
-#include "GameObject.h"
-#include "ObjectMgr.h"
-#include "ObjectAccessor.h"
-#include "OutdoorPvPMgr.h"
-#include "Creature.h"
-#include "Language.h"
-#include "World.h"
-#include "GossipDef.h"
-
-OPvPCapturePointEP_EWT::OPvPCapturePointEP_EWT(OutdoorPvP* pvp)
-: OPvPCapturePoint(pvp), m_TowerState(EP_TS_N), m_UnitsSummonedSide(0)
-{
- SetCapturePointData(EPCapturePoints[EP_EWT].entry, EPCapturePoints[EP_EWT].map, EPCapturePoints[EP_EWT].x, EPCapturePoints[EP_EWT].y, EPCapturePoints[EP_EWT].z, EPCapturePoints[EP_EWT].o, EPCapturePoints[EP_EWT].rot0, EPCapturePoints[EP_EWT].rot1, EPCapturePoints[EP_EWT].rot2, EPCapturePoints[EP_EWT].rot3);
- AddObject(EP_EWT_FLAGS, EPTowerFlags[EP_EWT].entry, EPTowerFlags[EP_EWT].map, EPTowerFlags[EP_EWT].x, EPTowerFlags[EP_EWT].y, EPTowerFlags[EP_EWT].z, EPTowerFlags[EP_EWT].o, EPTowerFlags[EP_EWT].rot0, EPTowerFlags[EP_EWT].rot1, EPTowerFlags[EP_EWT].rot2, EPTowerFlags[EP_EWT].rot3);
-}
-
-void OPvPCapturePointEP_EWT::ChangeState()
-{
- // if changing from controlling alliance to horde or vice versa
- if ( m_OldState == OBJECTIVESTATE_ALLIANCE && m_OldState != m_State )
- {
- sWorld->SendZoneText(EP_GraveYardZone, sObjectMgr->GetTrinityStringForDBCLocale(LANG_OPVP_EP_LOSE_EWT_A));
- ((OutdoorPvPEP*)m_PvP)->SetControlledState(EP_EWT, 0);
- }
- else if ( m_OldState == OBJECTIVESTATE_HORDE && m_OldState != m_State )
- {
- sWorld->SendZoneText(EP_GraveYardZone, sObjectMgr->GetTrinityStringForDBCLocale(LANG_OPVP_EP_LOSE_EWT_H));
- ((OutdoorPvPEP*)m_PvP)->SetControlledState(EP_EWT, 0);
- }
-
- uint32 artkit = 21;
-
- switch (m_State)
- {
- case OBJECTIVESTATE_ALLIANCE:
- m_TowerState = EP_TS_A;
- artkit = 2;
- SummonSupportUnitAtNorthpassTower(ALLIANCE);
- ((OutdoorPvPEP*)m_PvP)->SetControlledState(EP_EWT, ALLIANCE);
- if (m_OldState != m_State) sWorld->SendZoneText(EP_GraveYardZone, sObjectMgr->GetTrinityStringForDBCLocale(LANG_OPVP_EP_CAPTURE_EWT_A));
- break;
- case OBJECTIVESTATE_HORDE:
- m_TowerState = EP_TS_H;
- artkit = 1;
- SummonSupportUnitAtNorthpassTower(HORDE);
- ((OutdoorPvPEP*)m_PvP)->SetControlledState(EP_EWT, HORDE);
- if (m_OldState != m_State) sWorld->SendZoneText(EP_GraveYardZone, sObjectMgr->GetTrinityStringForDBCLocale(LANG_OPVP_EP_CAPTURE_EWT_H));
- break;
- case OBJECTIVESTATE_NEUTRAL:
- m_TowerState = EP_TS_N;
- break;
- case OBJECTIVESTATE_NEUTRAL_ALLIANCE_CHALLENGE:
- case OBJECTIVESTATE_HORDE_ALLIANCE_CHALLENGE:
- m_TowerState = EP_TS_N_A;
- break;
- case OBJECTIVESTATE_NEUTRAL_HORDE_CHALLENGE:
- case OBJECTIVESTATE_ALLIANCE_HORDE_CHALLENGE:
- m_TowerState = EP_TS_N_H;
- break;
- }
-
- GameObject* flag = HashMapHolder<GameObject>::Find(m_capturePointGUID);
- GameObject* flag2 = HashMapHolder<GameObject>::Find(m_Objects[EP_EWT_FLAGS]);
- if (flag)
- {
- flag->SetGoArtKit(artkit);
- }
- if (flag2)
- {
- flag2->SetGoArtKit(artkit);
- }
-
- UpdateTowerState();
-
- // complete quest objective
- if (m_TowerState == EP_TS_A || m_TowerState == EP_TS_H)
- SendObjectiveComplete(EP_EWT_CM, 0);
-}
-
-void OPvPCapturePointEP_EWT::SendChangePhase()
-{
- // send this too, sometimes the slider disappears, dunno why :(
- SendUpdateWorldState(EP_UI_TOWER_SLIDER_DISPLAY, 1);
- // send these updates to only the ones in this objective
- uint32 phase = (uint32)ceil((m_value + m_maxValue) / (2 * m_maxValue) * 100.0f);
- SendUpdateWorldState(EP_UI_TOWER_SLIDER_POS, phase);
- // send this too, sometimes it resets :S
- SendUpdateWorldState(EP_UI_TOWER_SLIDER_N, m_neutralValuePct);
-}
-
-void OPvPCapturePointEP_EWT::FillInitialWorldStates(WorldPacket &data)
-{
- data << EP_EWT_A << uint32(bool(m_TowerState & EP_TS_A));
- data << EP_EWT_H << uint32(bool(m_TowerState & EP_TS_H));
- data << EP_EWT_N_A << uint32(bool(m_TowerState & EP_TS_N_A));
- data << EP_EWT_N_H << uint32(bool(m_TowerState & EP_TS_N_H));
- data << EP_EWT_N << uint32(bool(m_TowerState & EP_TS_N));
-}
-
-void OPvPCapturePointEP_EWT::UpdateTowerState()
-{
- m_PvP->SendUpdateWorldState(EP_EWT_A, bool(m_TowerState & EP_TS_A));
- m_PvP->SendUpdateWorldState(EP_EWT_H, bool(m_TowerState & EP_TS_H));
- m_PvP->SendUpdateWorldState(EP_EWT_N_A, bool(m_TowerState & EP_TS_N_A));
- m_PvP->SendUpdateWorldState(EP_EWT_N_H, bool(m_TowerState & EP_TS_N_H));
- m_PvP->SendUpdateWorldState(EP_EWT_N, bool(m_TowerState & EP_TS_N));
-}
-
-bool OPvPCapturePointEP_EWT::HandlePlayerEnter(Player* player)
-{
- if (OPvPCapturePoint::HandlePlayerEnter(player))
- {
- player->SendUpdateWorldState(EP_UI_TOWER_SLIDER_DISPLAY, 1);
- uint32 phase = (uint32)ceil((m_value + m_maxValue) / (2 * m_maxValue) * 100.0f);
- player->SendUpdateWorldState(EP_UI_TOWER_SLIDER_POS, phase);
- player->SendUpdateWorldState(EP_UI_TOWER_SLIDER_N, m_neutralValuePct);
- return true;
- }
- return false;
-}
-
-void OPvPCapturePointEP_EWT::HandlePlayerLeave(Player* player)
-{
- player->SendUpdateWorldState(EP_UI_TOWER_SLIDER_DISPLAY, 0);
- OPvPCapturePoint::HandlePlayerLeave(player);
-}
-
-void OPvPCapturePointEP_EWT::SummonSupportUnitAtNorthpassTower(uint32 team)
-{
- if (m_UnitsSummonedSide != team)
- {
- m_UnitsSummonedSide = team;
- const creature_type * ct = NULL;
- if (team == ALLIANCE)
- ct=EP_EWT_Summons_A;
- else
- ct=EP_EWT_Summons_H;
-
- for (uint8 i = 0; i < EP_EWT_NUM_CREATURES; ++i)
- {
- DelCreature(i);
- AddCreature(i, ct[i].entry, ct[i].teamval, ct[i].map, ct[i].x, ct[i].y, ct[i].z, ct[i].o, 1000000);
- }
- }
-}
-
-// NPT
-OPvPCapturePointEP_NPT::OPvPCapturePointEP_NPT(OutdoorPvP* pvp)
-: OPvPCapturePoint(pvp), m_TowerState(EP_TS_N), m_SummonedGOSide(0)
-{
- SetCapturePointData(EPCapturePoints[EP_NPT].entry, EPCapturePoints[EP_NPT].map, EPCapturePoints[EP_NPT].x, EPCapturePoints[EP_NPT].y, EPCapturePoints[EP_NPT].z, EPCapturePoints[EP_NPT].o, EPCapturePoints[EP_NPT].rot0, EPCapturePoints[EP_NPT].rot1, EPCapturePoints[EP_NPT].rot2, EPCapturePoints[EP_NPT].rot3);
- AddObject(EP_NPT_FLAGS, EPTowerFlags[EP_NPT].entry, EPTowerFlags[EP_NPT].map, EPTowerFlags[EP_NPT].x, EPTowerFlags[EP_NPT].y, EPTowerFlags[EP_NPT].z, EPTowerFlags[EP_NPT].o, EPTowerFlags[EP_NPT].rot0, EPTowerFlags[EP_NPT].rot1, EPTowerFlags[EP_NPT].rot2, EPTowerFlags[EP_NPT].rot3);
-}
-
-void OPvPCapturePointEP_NPT::ChangeState()
-{
- // if changing from controlling alliance to horde or vice versa
- if ( m_OldState == OBJECTIVESTATE_ALLIANCE && m_OldState != m_State )
- {
- sWorld->SendZoneText(EP_GraveYardZone, sObjectMgr->GetTrinityStringForDBCLocale(LANG_OPVP_EP_LOSE_NPT_A));
- ((OutdoorPvPEP*)m_PvP)->SetControlledState(EP_NPT, 0);
- }
- else if ( m_OldState == OBJECTIVESTATE_HORDE && m_OldState != m_State )
- {
- sWorld->SendZoneText(EP_GraveYardZone, sObjectMgr->GetTrinityStringForDBCLocale(LANG_OPVP_EP_LOSE_NPT_H));
- ((OutdoorPvPEP*)m_PvP)->SetControlledState(EP_NPT, 0);
- }
-
- uint32 artkit = 21;
-
- switch (m_State)
- {
- case OBJECTIVESTATE_ALLIANCE:
- m_TowerState = EP_TS_A;
- artkit = 2;
- SummonGO(ALLIANCE);
- ((OutdoorPvPEP*)m_PvP)->SetControlledState(EP_NPT, ALLIANCE);
- if (m_OldState != m_State) sWorld->SendZoneText(EP_GraveYardZone, sObjectMgr->GetTrinityStringForDBCLocale(LANG_OPVP_EP_CAPTURE_NPT_A));
- break;
- case OBJECTIVESTATE_HORDE:
- m_TowerState = EP_TS_H;
- artkit = 1;
- SummonGO(HORDE);
- ((OutdoorPvPEP*)m_PvP)->SetControlledState(EP_NPT, HORDE);
- if (m_OldState != m_State) sWorld->SendZoneText(EP_GraveYardZone, sObjectMgr->GetTrinityStringForDBCLocale(LANG_OPVP_EP_CAPTURE_NPT_H));
- break;
- case OBJECTIVESTATE_NEUTRAL:
- m_TowerState = EP_TS_N;
- m_SummonedGOSide = 0;
- DelObject(EP_NPT_BUFF);
- break;
- case OBJECTIVESTATE_NEUTRAL_ALLIANCE_CHALLENGE:
- m_TowerState = EP_TS_N_A;
- break;
- case OBJECTIVESTATE_HORDE_ALLIANCE_CHALLENGE:
- m_TowerState = EP_TS_N_A;
- m_SummonedGOSide = 0;
- DelObject(EP_NPT_BUFF);
- break;
- case OBJECTIVESTATE_NEUTRAL_HORDE_CHALLENGE:
- m_TowerState = EP_TS_N_H;
- break;
- case OBJECTIVESTATE_ALLIANCE_HORDE_CHALLENGE:
- m_TowerState = EP_TS_N_H;
- m_SummonedGOSide = 0;
- DelObject(EP_NPT_BUFF);
- break;
- }
-
- GameObject* flag = HashMapHolder<GameObject>::Find(m_capturePointGUID);
- GameObject* flag2 = HashMapHolder<GameObject>::Find(m_Objects[EP_NPT_FLAGS]);
- if (flag)
- {
- flag->SetGoArtKit(artkit);
- }
- if (flag2)
- {
- flag2->SetGoArtKit(artkit);
- }
-
- UpdateTowerState();
-
- // complete quest objective
- if (m_TowerState == EP_TS_A || m_TowerState == EP_TS_H)
- SendObjectiveComplete(EP_NPT_CM, 0);
-}
-
-void OPvPCapturePointEP_NPT::SendChangePhase()
-{
- // send this too, sometimes the slider disappears, dunno why :(
- SendUpdateWorldState(EP_UI_TOWER_SLIDER_DISPLAY, 1);
- // send these updates to only the ones in this objective
- uint32 phase = (uint32)ceil((m_value + m_maxValue) / (2 * m_maxValue) * 100.0f);
- SendUpdateWorldState(EP_UI_TOWER_SLIDER_POS, phase);
- // send this too, sometimes it resets :S
- SendUpdateWorldState(EP_UI_TOWER_SLIDER_N, m_neutralValuePct);
-}
-
-void OPvPCapturePointEP_NPT::FillInitialWorldStates(WorldPacket &data)
-{
- data << EP_NPT_A << uint32(bool(m_TowerState & EP_TS_A));
- data << EP_NPT_H << uint32(bool(m_TowerState & EP_TS_H));
- data << EP_NPT_N_A << uint32(bool(m_TowerState & EP_TS_N_A));
- data << EP_NPT_N_H << uint32(bool(m_TowerState & EP_TS_N_H));
- data << EP_NPT_N << uint32(bool(m_TowerState & EP_TS_N));
-}
-
-void OPvPCapturePointEP_NPT::UpdateTowerState()
-{
- m_PvP->SendUpdateWorldState(EP_NPT_A, bool(m_TowerState & EP_TS_A));
- m_PvP->SendUpdateWorldState(EP_NPT_H, bool(m_TowerState & EP_TS_H));
- m_PvP->SendUpdateWorldState(EP_NPT_N_A, bool(m_TowerState & EP_TS_N_A));
- m_PvP->SendUpdateWorldState(EP_NPT_N_H, bool(m_TowerState & EP_TS_N_H));
- m_PvP->SendUpdateWorldState(EP_NPT_N, bool(m_TowerState & EP_TS_N));
-}
-
-bool OPvPCapturePointEP_NPT::HandlePlayerEnter(Player* player)
-{
- if (OPvPCapturePoint::HandlePlayerEnter(player))
- {
- player->SendUpdateWorldState(EP_UI_TOWER_SLIDER_DISPLAY, 1);
- uint32 phase = (uint32)ceil((m_value + m_maxValue) / (2 * m_maxValue) * 100.0f);
- player->SendUpdateWorldState(EP_UI_TOWER_SLIDER_POS, phase);
- player->SendUpdateWorldState(EP_UI_TOWER_SLIDER_N, m_neutralValuePct);
- return true;
- }
- return false;
-}
-
-void OPvPCapturePointEP_NPT::HandlePlayerLeave(Player* player)
-{
- player->SendUpdateWorldState(EP_UI_TOWER_SLIDER_DISPLAY, 0);
- OPvPCapturePoint::HandlePlayerLeave(player);
-}
-
-void OPvPCapturePointEP_NPT::SummonGO(uint32 team)
-{
- if (m_SummonedGOSide != team)
- {
- m_SummonedGOSide = team;
- DelObject(EP_NPT_BUFF);
- AddObject(EP_NPT_BUFF, EP_NPT_LordaeronShrine.entry, EP_NPT_LordaeronShrine.map, EP_NPT_LordaeronShrine.x, EP_NPT_LordaeronShrine.y, EP_NPT_LordaeronShrine.z, EP_NPT_LordaeronShrine.o, EP_NPT_LordaeronShrine.rot0, EP_NPT_LordaeronShrine.rot1, EP_NPT_LordaeronShrine.rot2, EP_NPT_LordaeronShrine.rot3);
- GameObject* go = HashMapHolder<GameObject>::Find(m_Objects[EP_NPT_BUFF]);
- if (go)
- go->SetUInt32Value(GAMEOBJECT_FACTION, (team == ALLIANCE ? 84 : 83));
- }
-}
-
-// CGT
-OPvPCapturePointEP_CGT::OPvPCapturePointEP_CGT(OutdoorPvP* pvp)
-: OPvPCapturePoint(pvp), m_TowerState(EP_TS_N), m_GraveyardSide(0)
-{
- SetCapturePointData(EPCapturePoints[EP_CGT].entry, EPCapturePoints[EP_CGT].map, EPCapturePoints[EP_CGT].x, EPCapturePoints[EP_CGT].y, EPCapturePoints[EP_CGT].z, EPCapturePoints[EP_CGT].o, EPCapturePoints[EP_CGT].rot0, EPCapturePoints[EP_CGT].rot1, EPCapturePoints[EP_CGT].rot2, EPCapturePoints[EP_CGT].rot3);
- AddObject(EP_CGT_FLAGS, EPTowerFlags[EP_CGT].entry, EPTowerFlags[EP_CGT].map, EPTowerFlags[EP_CGT].x, EPTowerFlags[EP_CGT].y, EPTowerFlags[EP_CGT].z, EPTowerFlags[EP_CGT].o, EPTowerFlags[EP_CGT].rot0, EPTowerFlags[EP_CGT].rot1, EPTowerFlags[EP_CGT].rot2, EPTowerFlags[EP_CGT].rot3);
-}
-
-void OPvPCapturePointEP_CGT::ChangeState()
-{
- // if changing from controlling alliance to horde or vice versa
- if ( m_OldState == OBJECTIVESTATE_ALLIANCE && m_OldState != m_State )
- {
- sWorld->SendZoneText(EP_GraveYardZone, sObjectMgr->GetTrinityStringForDBCLocale(LANG_OPVP_EP_LOSE_CGT_A));
- ((OutdoorPvPEP*)m_PvP)->SetControlledState(EP_CGT, 0);
- }
- else if ( m_OldState == OBJECTIVESTATE_HORDE && m_OldState != m_State )
- {
- sWorld->SendZoneText(EP_GraveYardZone, sObjectMgr->GetTrinityStringForDBCLocale(LANG_OPVP_EP_LOSE_CGT_H));
- ((OutdoorPvPEP*)m_PvP)->SetControlledState(EP_CGT, 0);
- }
-
- uint32 artkit = 21;
-
- switch (m_State)
- {
- case OBJECTIVESTATE_ALLIANCE:
- m_TowerState = EP_TS_A;
- artkit = 2;
- LinkGraveYard(ALLIANCE);
- ((OutdoorPvPEP*)m_PvP)->SetControlledState(EP_CGT, ALLIANCE);
- if (m_OldState != m_State) sWorld->SendZoneText(EP_GraveYardZone, sObjectMgr->GetTrinityStringForDBCLocale(LANG_OPVP_EP_CAPTURE_CGT_A));
- break;
- case OBJECTIVESTATE_HORDE:
- m_TowerState = EP_TS_H;
- artkit = 1;
- LinkGraveYard(HORDE);
- ((OutdoorPvPEP*)m_PvP)->SetControlledState(EP_CGT, HORDE);
- if (m_OldState != m_State) sWorld->SendZoneText(EP_GraveYardZone, sObjectMgr->GetTrinityStringForDBCLocale(LANG_OPVP_EP_CAPTURE_CGT_H));
- break;
- case OBJECTIVESTATE_NEUTRAL:
- m_TowerState = EP_TS_N;
- break;
- case OBJECTIVESTATE_NEUTRAL_ALLIANCE_CHALLENGE:
- case OBJECTIVESTATE_HORDE_ALLIANCE_CHALLENGE:
- m_TowerState = EP_TS_N_A;
- break;
- case OBJECTIVESTATE_NEUTRAL_HORDE_CHALLENGE:
- case OBJECTIVESTATE_ALLIANCE_HORDE_CHALLENGE:
- m_TowerState = EP_TS_N_H;
- break;
- }
-
- GameObject* flag = HashMapHolder<GameObject>::Find(m_capturePointGUID);
- GameObject* flag2 = HashMapHolder<GameObject>::Find(m_Objects[EP_CGT_FLAGS]);
- if (flag)
- {
- flag->SetGoArtKit(artkit);
- }
- if (flag2)
- {
- flag2->SetGoArtKit(artkit);
- }
-
- UpdateTowerState();
-
- // complete quest objective
- if (m_TowerState == EP_TS_A || m_TowerState == EP_TS_H)
- SendObjectiveComplete(EP_CGT_CM, 0);
-}
-
-void OPvPCapturePointEP_CGT::SendChangePhase()
-{
- // send this too, sometimes the slider disappears, dunno why :(
- SendUpdateWorldState(EP_UI_TOWER_SLIDER_DISPLAY, 1);
- // send these updates to only the ones in this objective
- uint32 phase = (uint32)ceil((m_value + m_maxValue) / (2 * m_maxValue) * 100.0f);
- SendUpdateWorldState(EP_UI_TOWER_SLIDER_POS, phase);
- // send this too, sometimes it resets :S
- SendUpdateWorldState(EP_UI_TOWER_SLIDER_N, m_neutralValuePct);
-}
-
-void OPvPCapturePointEP_CGT::FillInitialWorldStates(WorldPacket &data)
-{
- data << EP_CGT_A << uint32(bool(m_TowerState & EP_TS_A));
- data << EP_CGT_H << uint32(bool(m_TowerState & EP_TS_H));
- data << EP_CGT_N_A << uint32(bool(m_TowerState & EP_TS_N_A));
- data << EP_CGT_N_H << uint32(bool(m_TowerState & EP_TS_N_H));
- data << EP_CGT_N << uint32(bool(m_TowerState & EP_TS_N));
-}
-
-void OPvPCapturePointEP_CGT::UpdateTowerState()
-{
- m_PvP->SendUpdateWorldState(EP_CGT_A, bool(m_TowerState & EP_TS_A));
- m_PvP->SendUpdateWorldState(EP_CGT_H, bool(m_TowerState & EP_TS_H));
- m_PvP->SendUpdateWorldState(EP_CGT_N_A, bool(m_TowerState & EP_TS_N_A));
- m_PvP->SendUpdateWorldState(EP_CGT_N_H, bool(m_TowerState & EP_TS_N_H));
- m_PvP->SendUpdateWorldState(EP_CGT_N, bool(m_TowerState & EP_TS_N));
-}
-
-bool OPvPCapturePointEP_CGT::HandlePlayerEnter(Player* player)
-{
- if (OPvPCapturePoint::HandlePlayerEnter(player))
- {
- player->SendUpdateWorldState(EP_UI_TOWER_SLIDER_DISPLAY, 1);
- uint32 phase = (uint32)ceil((m_value + m_maxValue) / (2 * m_maxValue) * 100.0f);
- player->SendUpdateWorldState(EP_UI_TOWER_SLIDER_POS, phase);
- player->SendUpdateWorldState(EP_UI_TOWER_SLIDER_N, m_neutralValuePct);
- return true;
- }
- return false;
-}
-
-void OPvPCapturePointEP_CGT::HandlePlayerLeave(Player* player)
-{
- player->SendUpdateWorldState(EP_UI_TOWER_SLIDER_DISPLAY, 0);
- OPvPCapturePoint::HandlePlayerLeave(player);
-}
-
-void OPvPCapturePointEP_CGT::LinkGraveYard(uint32 team)
-{
- if (m_GraveyardSide != team)
- {
- m_GraveyardSide = team;
- sObjectMgr->RemoveGraveYardLink(EP_GraveYardId, EP_GraveYardZone, team, false);
- sObjectMgr->AddGraveYardLink(EP_GraveYardId, EP_GraveYardZone, team, false);
- }
-}
-
-// PWT
-OPvPCapturePointEP_PWT::OPvPCapturePointEP_PWT(OutdoorPvP* pvp)
-: OPvPCapturePoint(pvp), m_FlightMasterSpawned(0), m_TowerState(EP_TS_N)
-{
- SetCapturePointData(EPCapturePoints[EP_PWT].entry, EPCapturePoints[EP_PWT].map, EPCapturePoints[EP_PWT].x, EPCapturePoints[EP_PWT].y, EPCapturePoints[EP_PWT].z, EPCapturePoints[EP_PWT].o, EPCapturePoints[EP_PWT].rot0, EPCapturePoints[EP_PWT].rot1, EPCapturePoints[EP_PWT].rot2, EPCapturePoints[EP_PWT].rot3);
- AddObject(EP_PWT_FLAGS, EPTowerFlags[EP_PWT].entry, EPTowerFlags[EP_PWT].map, EPTowerFlags[EP_PWT].x, EPTowerFlags[EP_PWT].y, EPTowerFlags[EP_PWT].z, EPTowerFlags[EP_PWT].o, EPTowerFlags[EP_PWT].rot0, EPTowerFlags[EP_PWT].rot1, EPTowerFlags[EP_PWT].rot2, EPTowerFlags[EP_PWT].rot3);
-}
-
-void OPvPCapturePointEP_PWT::ChangeState()
-{
- // if changing from controlling alliance to horde or vice versa
- if ( m_OldState == OBJECTIVESTATE_ALLIANCE && m_OldState != m_State )
- {
- sWorld->SendZoneText(EP_GraveYardZone, sObjectMgr->GetTrinityStringForDBCLocale(LANG_OPVP_EP_LOSE_PWT_A));
- ((OutdoorPvPEP*)m_PvP)->SetControlledState(EP_PWT, 0);
- }
- else if ( m_OldState == OBJECTIVESTATE_HORDE && m_OldState != m_State )
- {
- sWorld->SendZoneText(EP_GraveYardZone, sObjectMgr->GetTrinityStringForDBCLocale(LANG_OPVP_EP_LOSE_PWT_H));
- ((OutdoorPvPEP*)m_PvP)->SetControlledState(EP_PWT, 0);
- }
-
- uint32 artkit = 21;
-
- switch (m_State)
- {
- case OBJECTIVESTATE_ALLIANCE:
- m_TowerState = EP_TS_A;
- SummonFlightMaster(ALLIANCE);
- artkit = 2;
- ((OutdoorPvPEP*)m_PvP)->SetControlledState(EP_PWT, ALLIANCE);
- if (m_OldState != m_State) sWorld->SendZoneText(EP_GraveYardZone, sObjectMgr->GetTrinityStringForDBCLocale(LANG_OPVP_EP_CAPTURE_PWT_A));
- break;
- case OBJECTIVESTATE_HORDE:
- m_TowerState = EP_TS_H;
- SummonFlightMaster(HORDE);
- artkit = 1;
- ((OutdoorPvPEP*)m_PvP)->SetControlledState(EP_PWT, HORDE);
- if (m_OldState != m_State) sWorld->SendZoneText(EP_GraveYardZone, sObjectMgr->GetTrinityStringForDBCLocale(LANG_OPVP_EP_CAPTURE_PWT_H));
- break;
- case OBJECTIVESTATE_NEUTRAL:
- m_TowerState = EP_TS_N;
- DelCreature(EP_PWT_FLIGHTMASTER);
- m_FlightMasterSpawned = 0;
- break;
- case OBJECTIVESTATE_NEUTRAL_ALLIANCE_CHALLENGE:
- m_TowerState = EP_TS_N_A;
- break;
- case OBJECTIVESTATE_HORDE_ALLIANCE_CHALLENGE:
- m_TowerState = EP_TS_N_A;
- DelCreature(EP_PWT_FLIGHTMASTER);
- m_FlightMasterSpawned = 0;
- break;
- case OBJECTIVESTATE_NEUTRAL_HORDE_CHALLENGE:
- m_TowerState = EP_TS_N_H;
- break;
- case OBJECTIVESTATE_ALLIANCE_HORDE_CHALLENGE:
- m_TowerState = EP_TS_N_H;
- DelCreature(EP_PWT_FLIGHTMASTER);
- m_FlightMasterSpawned = 0;
- break;
- }
-
- GameObject* flag = HashMapHolder<GameObject>::Find(m_capturePointGUID);
- GameObject* flag2 = HashMapHolder<GameObject>::Find(m_Objects[EP_PWT_FLAGS]);
- if (flag)
- {
- flag->SetGoArtKit(artkit);
- }
- if (flag2)
- {
- flag2->SetGoArtKit(artkit);
- }
-
- UpdateTowerState();
-
- // complete quest objective
- if (m_TowerState == EP_TS_A || m_TowerState == EP_TS_H)
- SendObjectiveComplete(EP_PWT_CM, 0);
-}
-
-void OPvPCapturePointEP_PWT::SendChangePhase()
-{
- // send this too, sometimes the slider disappears, dunno why :(
- SendUpdateWorldState(EP_UI_TOWER_SLIDER_DISPLAY, 1);
- // send these updates to only the ones in this objective
- uint32 phase = (uint32)ceil((m_value + m_maxValue) / (2 * m_maxValue) * 100.0f);
- SendUpdateWorldState(EP_UI_TOWER_SLIDER_POS, phase);
- // send this too, sometimes it resets :S
- SendUpdateWorldState(EP_UI_TOWER_SLIDER_N, m_neutralValuePct);
-}
-
-void OPvPCapturePointEP_PWT::FillInitialWorldStates(WorldPacket &data)
-{
- data << EP_PWT_A << uint32(bool(m_TowerState & EP_TS_A));
- data << EP_PWT_H << uint32(bool(m_TowerState & EP_TS_H));
- data << EP_PWT_N_A << uint32(bool(m_TowerState & EP_TS_N_A));
- data << EP_PWT_N_H << uint32(bool(m_TowerState & EP_TS_N_H));
- data << EP_PWT_N << uint32(bool(m_TowerState & EP_TS_N));
-}
-
-void OPvPCapturePointEP_PWT::UpdateTowerState()
-{
- m_PvP->SendUpdateWorldState(EP_PWT_A, bool(m_TowerState & EP_TS_A));
- m_PvP->SendUpdateWorldState(EP_PWT_H, bool(m_TowerState & EP_TS_H));
- m_PvP->SendUpdateWorldState(EP_PWT_N_A, bool(m_TowerState & EP_TS_N_A));
- m_PvP->SendUpdateWorldState(EP_PWT_N_H, bool(m_TowerState & EP_TS_N_H));
- m_PvP->SendUpdateWorldState(EP_PWT_N, bool(m_TowerState & EP_TS_N));
-}
-
-bool OPvPCapturePointEP_PWT::HandlePlayerEnter(Player* player)
-{
- if (OPvPCapturePoint::HandlePlayerEnter(player))
- {
- player->SendUpdateWorldState(EP_UI_TOWER_SLIDER_DISPLAY, 1);
- uint32 phase = (uint32)ceil((m_value + m_maxValue) / (2 * m_maxValue) * 100.0f);
- player->SendUpdateWorldState(EP_UI_TOWER_SLIDER_POS, phase);
- player->SendUpdateWorldState(EP_UI_TOWER_SLIDER_N, m_neutralValuePct);
- return true;
- }
- return false;
-}
-
-void OPvPCapturePointEP_PWT::HandlePlayerLeave(Player* player)
-{
- player->SendUpdateWorldState(EP_UI_TOWER_SLIDER_DISPLAY, 0);
- OPvPCapturePoint::HandlePlayerLeave(player);
-}
-
-void OPvPCapturePointEP_PWT::SummonFlightMaster(uint32 team)
-{
- if (m_FlightMasterSpawned != team)
- {
- m_FlightMasterSpawned = team;
- DelCreature(EP_PWT_FLIGHTMASTER);
- AddCreature(EP_PWT_FLIGHTMASTER, EP_PWT_FlightMaster.entry, team, EP_PWT_FlightMaster.map, EP_PWT_FlightMaster.x, EP_PWT_FlightMaster.y, EP_PWT_FlightMaster.z, EP_PWT_FlightMaster.o);
- /*
- // sky - we need update gso code
-
- Creature* c = HashMapHolder<Creature>::Find(m_Creatures[EP_PWT_FLIGHTMASTER]);
- //Spawn flight master as friendly to capturing team
- c->SetUInt32Value(GAMEOBJECT_FACTION, (team == ALLIANCE ? 55 : 68));
- if (c)
- {
- GossipOption gso;
- gso.Action = GOSSIP_OPTION_OUTDOORPVP;
- gso.GossipId = 0;
- gso.OptionText.assign(sObjectMgr->GetTrinityStringForDBCLocale(LANG_OPVP_EP_FLIGHT_NPT));
- gso.Id = 50;
- gso.Icon = 0;
- gso.NpcFlag = 0;
- gso.BoxMoney = 0;
- gso.Coded = false;
- c->addGossipOption(gso);
-
- gso.Action = GOSSIP_OPTION_OUTDOORPVP;
- gso.GossipId = 0;
- gso.OptionText.assign(sObjectMgr->GetTrinityStringForDBCLocale(LANG_OPVP_EP_FLIGHT_EWT));
- gso.Id = 50;
- gso.Icon = 0;
- gso.NpcFlag = 0;
- gso.BoxMoney = 0;
- gso.Coded = false;
- c->addGossipOption(gso);
-
- gso.Action = GOSSIP_OPTION_OUTDOORPVP;
- gso.GossipId = 0;
- gso.OptionText.assign(sObjectMgr->GetTrinityStringForDBCLocale(LANG_OPVP_EP_FLIGHT_CGT));
- gso.Id = 50;
- gso.Icon = 0;
- gso.NpcFlag = 0;
- gso.BoxMoney = 0;
- gso.Coded = false;
- c->addGossipOption(gso);
- }
- */
- }
-}
-
-// ep
-OutdoorPvPEP::OutdoorPvPEP()
-{
- m_TypeId = OUTDOOR_PVP_EP;
- memset(EP_Controls, 0, sizeof(EP_Controls));
- m_AllianceTowersControlled = 0;
- m_HordeTowersControlled = 0;
-}
-
-bool OutdoorPvPEP::SetupOutdoorPvP()
-{
- for (uint8 i = 0; i < EPBuffZonesNum; ++i)
- RegisterZone(EPBuffZones[i]);
-
- AddCapturePoint(new OPvPCapturePointEP_EWT(this));
- AddCapturePoint(new OPvPCapturePointEP_PWT(this));
- AddCapturePoint(new OPvPCapturePointEP_CGT(this));
- AddCapturePoint(new OPvPCapturePointEP_NPT(this));
- return true;
-}
-
-bool OutdoorPvPEP::Update(uint32 diff)
-{
- if (OutdoorPvP::Update(diff))
- {
- m_AllianceTowersControlled = 0;
- m_HordeTowersControlled = 0;
- for (int i = 0; i < EP_TOWER_NUM; ++i)
- {
- if (EP_Controls[i] == ALLIANCE)
- ++m_AllianceTowersControlled;
- else if (EP_Controls[i] == HORDE)
- ++m_HordeTowersControlled;
- SendUpdateWorldState(EP_UI_TOWER_COUNT_A, m_AllianceTowersControlled);
- SendUpdateWorldState(EP_UI_TOWER_COUNT_H, m_HordeTowersControlled);
- BuffTeams();
- }
- return true;
- }
- return false;
-}
-
-void OutdoorPvPEP::HandlePlayerEnterZone(Player* player, uint32 zone)
-{
- // add buffs
- if (player->GetTeam() == ALLIANCE)
- {
- if (m_AllianceTowersControlled && m_AllianceTowersControlled < 5)
- player->CastSpell(player, EP_AllianceBuffs[m_AllianceTowersControlled-1], true);
- }
- else
- {
- if (m_HordeTowersControlled && m_HordeTowersControlled < 5)
- player->CastSpell(player, EP_HordeBuffs[m_HordeTowersControlled-1], true);
- }
- OutdoorPvP::HandlePlayerEnterZone(player, zone);
-}
-
-void OutdoorPvPEP::HandlePlayerLeaveZone(Player* player, uint32 zone)
-{
- // remove buffs
- if (player->GetTeam() == ALLIANCE)
- {
- for (int i = 0; i < 4; ++i)
- player->RemoveAurasDueToSpell(EP_AllianceBuffs[i]);
- }
- else
- {
- for (int i = 0; i < 4; ++i)
- player->RemoveAurasDueToSpell(EP_HordeBuffs[i]);
- }
- OutdoorPvP::HandlePlayerLeaveZone(player, zone);
-}
-
-void OutdoorPvPEP::BuffTeams()
-{
- for (PlayerSet::iterator itr = m_players[0].begin(); itr != m_players[0].end(); ++itr)
- {
- if (Player* player = ObjectAccessor::FindPlayer(*itr))
- {
- for (int i = 0; i < 4; ++i)
- player->RemoveAurasDueToSpell(EP_AllianceBuffs[i]);
- if (m_AllianceTowersControlled && m_AllianceTowersControlled < 5)
- player->CastSpell(player, EP_AllianceBuffs[m_AllianceTowersControlled-1], true);
- }
- }
- for (PlayerSet::iterator itr = m_players[1].begin(); itr != m_players[1].end(); ++itr)
- {
- if (Player* player = ObjectAccessor::FindPlayer(*itr))
- {
- for (int i = 0; i < 4; ++i)
- player->RemoveAurasDueToSpell(EP_HordeBuffs[i]);
- if (m_HordeTowersControlled && m_HordeTowersControlled < 5)
- player->CastSpell(player, EP_HordeBuffs[m_HordeTowersControlled-1], true);
- }
- }
-}
-
-void OutdoorPvPEP::SetControlledState(uint32 index, uint32 state)
-{
- EP_Controls[index] = state;
-}
-
-void OutdoorPvPEP::FillInitialWorldStates(WorldPacket & data)
-{
- data << EP_UI_TOWER_COUNT_A << m_AllianceTowersControlled;
- data << EP_UI_TOWER_COUNT_H << m_HordeTowersControlled;
- data << EP_UI_TOWER_SLIDER_DISPLAY << uint32(0);
- data << EP_UI_TOWER_SLIDER_POS << uint32(50);
- data << EP_UI_TOWER_SLIDER_N << uint32(100);
- for (OPvPCapturePointMap::iterator itr = m_capturePoints.begin(); itr != m_capturePoints.end(); ++itr)
- {
- itr->second->FillInitialWorldStates(data);
- }
-}
-
-void OutdoorPvPEP::SendRemoveWorldStates(Player* player)
-{
- player->SendUpdateWorldState(EP_UI_TOWER_COUNT_A, 0);
- player->SendUpdateWorldState(EP_UI_TOWER_COUNT_H, 0);
- player->SendUpdateWorldState(EP_UI_TOWER_SLIDER_DISPLAY, 0);
- player->SendUpdateWorldState(EP_UI_TOWER_SLIDER_POS, 0);
- player->SendUpdateWorldState(EP_UI_TOWER_SLIDER_N, 0);
-
- player->SendUpdateWorldState(EP_EWT_A, 0);
- player->SendUpdateWorldState(EP_EWT_H, 0);
- player->SendUpdateWorldState(EP_EWT_N, 0);
- player->SendUpdateWorldState(EP_EWT_N_A, 0);
- player->SendUpdateWorldState(EP_EWT_N_H, 0);
-
- player->SendUpdateWorldState(EP_PWT_A, 0);
- player->SendUpdateWorldState(EP_PWT_H, 0);
- player->SendUpdateWorldState(EP_PWT_N, 0);
- player->SendUpdateWorldState(EP_PWT_N_A, 0);
- player->SendUpdateWorldState(EP_PWT_N_H, 0);
-
- player->SendUpdateWorldState(EP_NPT_A, 0);
- player->SendUpdateWorldState(EP_NPT_H, 0);
- player->SendUpdateWorldState(EP_NPT_N, 0);
- player->SendUpdateWorldState(EP_NPT_N_A, 0);
- player->SendUpdateWorldState(EP_NPT_N_H, 0);
-
- player->SendUpdateWorldState(EP_CGT_A, 0);
- player->SendUpdateWorldState(EP_CGT_H, 0);
- player->SendUpdateWorldState(EP_CGT_N, 0);
- player->SendUpdateWorldState(EP_CGT_N_A, 0);
- player->SendUpdateWorldState(EP_CGT_N_H, 0);
-}
-
-class OutdoorPvP_eastern_plaguelands : public OutdoorPvPScript
-{
- public:
-
- OutdoorPvP_eastern_plaguelands()
- : OutdoorPvPScript("outdoorpvp_ep")
- {
- }
-
- OutdoorPvP* GetOutdoorPvP() const
- {
- return new OutdoorPvPEP();
- }
-};
-
-void AddSC_outdoorpvp_ep()
-{
- new OutdoorPvP_eastern_plaguelands();
-}
diff --git a/src/server/scripts/OutdoorPvP/OutdoorPvPEP.h b/src/server/scripts/OutdoorPvP/OutdoorPvPEP.h
deleted file mode 100644
index cdd944107bc..00000000000
--- a/src/server/scripts/OutdoorPvP/OutdoorPvPEP.h
+++ /dev/null
@@ -1,331 +0,0 @@
-/*
- * Copyright (C) 2008-2013 TrinityCore <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, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef OUTDOOR_PVP_EP_
-#define OUTDOOR_PVP_EP_
-
-#include "DBCStructure.h"
-#include "OutdoorPvP.h"
-
-const uint32 EP_AllianceBuffs[4] = {11413, 11414, 11415, 1386};
-
-const uint32 EP_HordeBuffs[4] = {30880, 30683, 30682, 29520};
-
-const uint32 EP_GraveYardZone = 139;
-
-const uint32 EP_GraveYardId = 927;
-
-const uint8 EPBuffZonesNum = 3;
-
-const uint32 EP_EWT_CM = 17690;
-const uint32 EP_CGT_CM = 17689;
-const uint32 EP_NPT_CM = 17696;
-const uint32 EP_PWT_CM = 17698;
-
-const uint32 EPBuffZones[EPBuffZonesNum] = {139, 2017, 2057};
-
-enum EP_TaxiNodes
-{
- EP_CGT_Taxi = 87,
- EP_EWT_Taxi = 86,
- EP_NPT_Taxi = 85,
- EP_PWT_Taxi = 84
-};
-
-enum EP_EastwallTowerWorldStates
-{
- EP_EWT_A = 2354,
- EP_EWT_H = 2356,
- EP_EWT_N_A = 2359, // ally conquested
- EP_EWT_N_H = 2360,
- EP_EWT_N = 2361
-};
-
-enum EP_NorthpassTowerWorldStates
-{
- EP_NPT_N = 2352,
- EP_NPT_N_A = 2362,
- EP_NPT_N_H = 2363,
- EP_NPT_A = 2372,
- EP_NPT_H = 2373
-};
-
-enum EP_PlagewoodTowerWorldStates
-{
- EP_PWT_N_A = 2366,
- EP_PWT_N_H = 2353, //2367 not present! use neutral!
- EP_PWT_A = 2370,
- EP_PWT_H = 2371,
- EP_PWT_N = 2353
-};
-
-enum EP_CrownGuardTowerWorldStates
-{
- EP_CGT_N_A = 2374,
- EP_CGT_N_H = 2375,
- EP_CGT_A = 2378,
- EP_CGT_H = 2379,
- EP_CGT_N = 2355
-};
-
-enum EP_WorldStates
-{
- EP_UI_TOWER_SLIDER_DISPLAY = 2426,
- EP_UI_TOWER_SLIDER_POS = 2427,
- EP_UI_TOWER_SLIDER_N = 2428,
-
- EP_UI_TOWER_COUNT_A = 2327,
- EP_UI_TOWER_COUNT_H = 2328
-};
-
-enum EP_Summons
-{
- EP_EWT_COMMANDER = 0,
- EP_EWT_SOLDIER1,
- EP_EWT_SOLDIER2,
- EP_EWT_SOLDIER3,
- EP_EWT_SOLDIER4,
- EP_PWT_FLIGHTMASTER,
-};
-
-enum EP_GoSummons
-{
- EP_NPT_BUFF = 0,
- EP_NPT_FLAGS,
- EP_EWT_FLAGS,
- EP_CGT_FLAGS,
- EP_PWT_FLAGS
-};
-
-enum EP_Towers
-{
- EP_EWT = 0, // plaguelands 03
- EP_NPT, // plaguelands 01
- EP_PWT, // plaguelands 04
- EP_CGT, // plaguelands 02
- EP_TOWER_NUM
-};
-
-const go_type EPCapturePoints[EP_TOWER_NUM] =
-{
- {182097, 0, 2574.51f, -4794.89f, 144.704f, -1.45003f, -0.097056f, 0.095578f, -0.656229f, 0.742165f},
- {181899, 0, 3181.08f, -4379.36f, 174.123f, -2.03472f, -0.065392f, 0.119494f, -0.842275f, 0.521553f},
- {182098, 0, 2962.71f, -3042.31f, 154.789f, 2.08426f, -0.074807f, -0.113837f, 0.855928f, 0.49883f},
- {182096, 0, 1860.85f, -3731.23f, 196.716f, -2.53214f, 0.033967f, -0.131914f, 0.944741f, -0.298177f}
-};
-
-const go_type EPTowerFlags[EP_TOWER_NUM] =
-{
- {182106, 0, 2569.60f, -4772.93f, 115.399f, 2.72271f, 0.0f, 0.0f, 0.978148f, 0.207912f},
- {182106, 0, 3148.17f, -4365.51f, 145.029f, 1.53589f, 0.0f, 0.0f, 0.694658f, 0.71934f},
- {182106, 0, 2992.63f, -3022.95f, 125.593f, 3.03687f, 0.0f, 0.0f, 0.99863f, 0.052336f},
- {182106, 0, 1838.42f, -3703.56f, 167.713f, 0.890118f, 0.0f, 0.0f, 0.430511f, 0.902585f}
-};
-
-const uint32 EPTowerPlayerEnterEvents[EP_TOWER_NUM] = {10691, 10699, 10701, 10705};
-
-const uint32 EPTowerPlayerLeaveEvents[EP_TOWER_NUM] = {10692, 10698, 10700, 10704};
-
-const uint8 EP_NUM_CREATURES = 6;
-const uint8 EP_EWT_NUM_CREATURES = 5;
-
-// one lordaeron commander, 4 soldiers
-// should be spawned at EWT and follow a path, but trans-grid pathing isn't safe, so summon them directly at NPT
-const creature_type EP_EWT_Summons_A[EP_EWT_NUM_CREATURES] =
-{
- {17635, 469, 0, 3167.61f, -4352.09f, 138.20f, 4.5811f},
- {17647, 469, 0, 3172.74f, -4352.99f, 139.14f, 4.9873f},
- {17647, 469, 0, 3165.89f, -4354.46f, 138.67f, 3.7244f},
- {17647, 469, 0, 3164.65f, -4350.26f, 138.22f, 2.4794f},
- {17647, 469, 0, 3169.91f, -4349.68f, 138.37f, 0.7444f}
-};
-
-const creature_type EP_EWT_Summons_H[EP_EWT_NUM_CREATURES] =
-{
- {17995, 67, 0, 3167.61f, -4352.09f, 138.20f, 4.5811f},
- {17996, 67, 0, 3172.74f, -4352.99f, 139.14f, 4.9873f},
- {17996, 67, 0, 3165.89f, -4354.46f, 138.67f, 3.7244f},
- {17996, 67, 0, 3164.65f, -4350.26f, 138.22f, 2.4794f},
- {17996, 67, 0, 3169.91f, -4349.68f, 138.37f, 0.7444f}
-};
-
-enum EP_TowerStates
-{
- EP_TS_N = 1,
- EP_TS_N_A = 2,
- EP_TS_N_H = 4,
- EP_TS_A_P = 8,
- EP_TS_H_P = 16,
- EP_TS_A = 32,
- EP_TS_H = 64
-};
-
-// when spawning, pay attention at setting the faction manually!
-const creature_type EP_PWT_FlightMaster = {17209, 0, 0, 2987.5f, -3049.11f, 120.126f, 5.75959f};
-
-// after spawning, modify the faction so that only the controller will be able to use it with SetUInt32Value(GAMEOBJECT_FACTION, faction_id);
-const go_type EP_NPT_LordaeronShrine = {181682, 0, 3167.72f, -4355.91f, 138.785f, 1.69297f, 0.0f, 0.0f, 0.748956f, 0.66262f};
-
-class OutdoorPvPEP;
-
-class OPvPCapturePointEP_EWT : public OPvPCapturePoint
-{
- public:
-
- OPvPCapturePointEP_EWT(OutdoorPvP* pvp);
-
- void ChangeState();
-
- void SendChangePhase();
-
- void FillInitialWorldStates(WorldPacket & data);
-
- // used when player is activated/inactivated in the area
- bool HandlePlayerEnter(Player* player);
- void HandlePlayerLeave(Player* player);
-
- protected:
-
- void SummonSupportUnitAtNorthpassTower(uint32 team);
-
- void UpdateTowerState();
-
- protected:
-
- uint32 m_TowerState;
-
- uint32 m_UnitsSummonedSide;
-};
-
-class OPvPCapturePointEP_NPT : public OPvPCapturePoint
-{
- public:
-
- OPvPCapturePointEP_NPT(OutdoorPvP* pvp);
-
- void ChangeState();
-
- void SendChangePhase();
-
- void FillInitialWorldStates(WorldPacket & data);
-
- // used when player is activated/inactivated in the area
- bool HandlePlayerEnter(Player* player);
- void HandlePlayerLeave(Player* player);
-
- protected:
-
- void SummonGO(uint32 team);
-
- void UpdateTowerState();
-
- protected:
-
- uint32 m_TowerState;
-
- uint32 m_SummonedGOSide;
-};
-
-class OPvPCapturePointEP_CGT : public OPvPCapturePoint
-{
- public:
-
- OPvPCapturePointEP_CGT(OutdoorPvP* pvp);
-
- void ChangeState();
-
- void SendChangePhase();
-
- void FillInitialWorldStates(WorldPacket & data);
-
- // used when player is activated/inactivated in the area
- bool HandlePlayerEnter(Player* player);
- void HandlePlayerLeave(Player* player);
-
- protected:
-
- void LinkGraveYard(uint32 team);
-
- void UpdateTowerState();
-
- protected:
-
- uint32 m_TowerState;
-
- uint32 m_GraveyardSide;
-};
-
-class OPvPCapturePointEP_PWT : public OPvPCapturePoint
-{
- public:
-
- OPvPCapturePointEP_PWT(OutdoorPvP* pvp);
-
- void ChangeState();
-
- void SendChangePhase();
-
- void FillInitialWorldStates(WorldPacket & data);
-
- // used when player is activated/inactivated in the area
- bool HandlePlayerEnter(Player* player);
- void HandlePlayerLeave(Player* player);
-
- protected:
-
- void SummonFlightMaster(uint32 team);
-
- void UpdateTowerState();
-
- protected:
-
- uint32 m_FlightMasterSpawned;
-
- uint32 m_TowerState;
-};
-
-class OutdoorPvPEP : public OutdoorPvP
-{
- public:
-
- OutdoorPvPEP();
-
- bool SetupOutdoorPvP();
-
- void HandlePlayerEnterZone(Player* player, uint32 zone);
- void HandlePlayerLeaveZone(Player* player, uint32 zone);
-
- bool Update(uint32 diff);
-
- void FillInitialWorldStates(WorldPacket &data);
-
- void SendRemoveWorldStates(Player* player);
-
- void BuffTeams();
-
- void SetControlledState(uint32 index, uint32 state);
-
- private:
-
- // how many towers are controlled
- uint32 EP_Controls[EP_TOWER_NUM];
-
- uint32 m_AllianceTowersControlled;
- uint32 m_HordeTowersControlled;
-};
-
-#endif
diff --git a/src/server/scripts/Spells/spell_dk.cpp b/src/server/scripts/Spells/spell_dk.cpp
index 1d653656a8e..f4f7ca5fa42 100644
--- a/src/server/scripts/Spells/spell_dk.cpp
+++ b/src/server/scripts/Spells/spell_dk.cpp
@@ -48,12 +48,12 @@ enum DeathKnightSpells
SPELL_DK_UNHOLY_PRESENCE = 48265,
SPELL_DK_IMPROVED_UNHOLY_PRESENCE_TRIGGERED = 63622,
SPELL_DK_ITEM_SIGIL_VENGEFUL_HEART = 64962,
- SPELL_DK_ITEM_T8_MELEE_4P_BONUS = 64736,
+ SPELL_DK_ITEM_T8_MELEE_4P_BONUS = 64736
};
enum DeathKnightSpellIcons
{
- DK_ICON_ID_IMPROVED_DEATH_STRIKE = 2751,
+ DK_ICON_ID_IMPROVED_DEATH_STRIKE = 2751
};
// 50462 - Anti-Magic Shell (on raid member)
diff --git a/src/server/scripts/Spells/spell_druid.cpp b/src/server/scripts/Spells/spell_druid.cpp
index 160f14ff670..8fd44544fb8 100644
--- a/src/server/scripts/Spells/spell_druid.cpp
+++ b/src/server/scripts/Spells/spell_druid.cpp
@@ -29,6 +29,15 @@
enum DruidSpells
{
+ SPELL_DRUID_WRATH = 5176,
+ SPELL_DRUID_STARFIRE = 2912,
+ SPELL_DRUID_STARSURGE = 78674,
+ SPELL_DRUID_ECLIPSE_GENERAL_ENERGIZE = 89265,
+ SPELL_DRUID_STARSURGE_ENERGIZE = 86605,
+ SPELL_DRUID_LUNAR_ECLIPSE_MARKER = 67484, // Will make the yellow arrow on eclipse bar point to the blue side (lunar)
+ SPELL_DRUID_SOLAR_ECLIPSE_MARKER = 67483, // Will make the yellow arrow on eclipse bar point to the yellow side (solar)
+ SPELL_DRUID_SOLAR_ECLIPSE = 48517,
+ SPELL_DRUID_LUNAR_ECLIPSE = 48518,
SPELL_DRUID_ENRAGE_MOD_DAMAGE = 51185,
SPELL_DRUID_GLYPH_OF_TYPHOON = 62135,
SPELL_DRUID_IDOL_OF_FERAL_SHADOWS = 34241,
@@ -43,7 +52,117 @@ enum DruidSpells
SPELL_DRUID_SURVIVAL_INSTINCTS = 50322,
SPELL_DRUID_SAVAGE_ROAR = 62071,
SPELL_DRUID_TIGER_S_FURY_ENERGIZE = 51178,
- SPELL_DRUID_ITEM_T8_BALANCE_RELIC = 64950,
+ SPELL_DRUID_ITEM_T8_BALANCE_RELIC = 64950
+};
+
+// 2912, 5176, 78674 - Starfire, Wrath, and Starsurge
+class spell_dru_eclipse_energize : public SpellScriptLoader
+{
+ public:
+ spell_dru_eclipse_energize() : SpellScriptLoader("spell_dru_eclipse_energize") { }
+
+ class spell_dru_eclipse_energize_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_dru_eclipse_energize_SpellScript);
+
+ int32 energizeAmount;
+
+ bool Load()
+ {
+ if (GetCaster()->GetTypeId() != TYPEID_PLAYER)
+ return false;
+
+ if (GetCaster()->ToPlayer()->getClass() != CLASS_DRUID)
+ return false;
+
+ energizeAmount = 0;
+
+ return true;
+ }
+
+ void HandleEnergize(SpellEffIndex effIndex)
+ {
+ Player* caster = GetCaster()->ToPlayer();
+
+ // No boomy, no deal.
+ if (caster->GetPrimaryTalentTree(caster->GetActiveSpec()) != TALENT_TREE_DRUID_BALANCE)
+ return;
+
+ switch (GetSpellInfo()->Id)
+ {
+ case SPELL_DRUID_WRATH:
+ {
+ energizeAmount = -GetSpellInfo()->Effects[effIndex].BasePoints; // -13
+ // If we are set to fill the lunar side or we've just logged in with 0 power..
+ if ((!caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE_MARKER) && caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE_MARKER))
+ || caster->GetPower(POWER_ECLIPSE) == 0)
+ {
+ caster->CastCustomSpell(caster, SPELL_DRUID_ECLIPSE_GENERAL_ENERGIZE, &energizeAmount, 0, 0, true);
+ // If the energize was due to 0 power, cast the eclipse marker aura
+ if (!caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE_MARKER))
+ caster->CastSpell(caster, SPELL_DRUID_LUNAR_ECLIPSE_MARKER, true);
+ }
+ // The energizing effect brought us out of the solar eclipse, remove the aura
+ if (caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE) && caster->GetPower(POWER_ECLIPSE) <= 0)
+ caster->RemoveAurasDueToSpell(SPELL_DRUID_SOLAR_ECLIPSE);
+ break;
+ }
+ case SPELL_DRUID_STARFIRE:
+ {
+ energizeAmount = GetSpellInfo()->Effects[effIndex].BasePoints; // 20
+ // If we are set to fill the solar side or we've just logged in with 0 power..
+ if ((!caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE_MARKER) && caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE_MARKER))
+ || caster->GetPower(POWER_ECLIPSE) == 0)
+ {
+ caster->CastCustomSpell(caster, SPELL_DRUID_ECLIPSE_GENERAL_ENERGIZE, &energizeAmount, 0, 0, true);
+ // If the energize was due to 0 power, cast the eclipse marker aura
+ if (!caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE_MARKER))
+ caster->CastSpell(caster, SPELL_DRUID_SOLAR_ECLIPSE_MARKER, true);
+ }
+ // The energizing effect brought us out of the lunar eclipse, remove the aura
+ if (caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE) && caster->GetPower(POWER_ECLIPSE) >= 0)
+ caster->RemoveAura(SPELL_DRUID_LUNAR_ECLIPSE);
+ break;
+ }
+ case SPELL_DRUID_STARSURGE:
+ {
+ // If we are set to fill the solar side or we've just logged in with 0 power (confirmed with sniffs)
+ if ((!caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE_MARKER) && caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE_MARKER))
+ || caster->GetPower(POWER_ECLIPSE) == 0)
+ {
+ energizeAmount = GetSpellInfo()->Effects[effIndex].BasePoints; // 15
+ caster->CastCustomSpell(caster, SPELL_DRUID_STARSURGE_ENERGIZE, &energizeAmount, 0, 0, true);
+
+ // If the energize was due to 0 power, cast the eclipse marker aura
+ if (!caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE_MARKER))
+ caster->CastSpell(caster, SPELL_DRUID_SOLAR_ECLIPSE_MARKER, true);
+ }
+ else if (!caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE_MARKER) && caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE_MARKER))
+ {
+ energizeAmount = -GetSpellInfo()->Effects[effIndex].BasePoints; // -15
+ caster->CastCustomSpell(caster, SPELL_DRUID_STARSURGE_ENERGIZE, &energizeAmount, 0, 0, true);
+ }
+ // The energizing effect brought us out of the lunar eclipse, remove the aura
+ if (caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE) && caster->GetPower(POWER_ECLIPSE) >= 0)
+ caster->RemoveAura(SPELL_DRUID_LUNAR_ECLIPSE);
+ // The energizing effect brought us out of the solar eclipse, remove the aura
+ else if (caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE) && caster->GetPower(POWER_ECLIPSE) <= 0)
+ caster->RemoveAura(SPELL_DRUID_SOLAR_ECLIPSE);
+ break;
+ }
+ }
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_dru_eclipse_energize_SpellScript::HandleEnergize, EFFECT_1, SPELL_EFFECT_DUMMY);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_dru_eclipse_energize_SpellScript;
+ }
};
// -1850 - Dash
@@ -664,7 +783,7 @@ class spell_dru_savage_roar : public SpellScriptLoader
{
PrepareAuraScript(spell_dru_savage_roar_AuraScript);
- bool Validate(SpellInfo const* /*spell*/)
+ bool Validate(SpellInfo const* /*spellInfo*/)
{
if (!sSpellMgr->GetSpellInfo(SPELL_DRUID_SAVAGE_ROAR))
return false;
@@ -857,7 +976,7 @@ class spell_dru_swift_flight_passive : public SpellScriptLoader
void CalculateAmount(AuraEffect const* /*aurEff*/, int32 & amount, bool & /*canBeRecalculated*/)
{
if (Player* caster = GetCaster()->ToPlayer())
- if (caster->Has310Flyer(false))
+ if (caster->GetSkillValue(SKILL_RIDING) >= 375)
amount = 310;
}
@@ -988,6 +1107,7 @@ class spell_dru_t10_restoration_4p_bonus : public SpellScriptLoader
void AddSC_druid_spell_scripts()
{
new spell_dru_dash();
+ new spell_dru_eclipse_energize();
new spell_dru_enrage();
new spell_dru_glyph_of_starfire();
new spell_dru_idol_lifebloom();
diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp
index 25a969c788e..446c2d43f00 100644
--- a/src/server/scripts/Spells/spell_generic.cpp
+++ b/src/server/scripts/Spells/spell_generic.cpp
@@ -986,7 +986,7 @@ class spell_gen_parachute_ic : public SpellScriptLoader
void HandleTriggerSpell(AuraEffect const* /*aurEff*/)
{
if (Player* target = GetTarget()->ToPlayer())
- if (target->m_movementInfo.fallTime > 2000)
+ if (target->m_movementInfo.jump.fallTime > 2000)
target->CastSpell(target, SPELL_PARACHUTE_IC, true);
}
@@ -1652,61 +1652,6 @@ class spell_gen_oracle_wolvar_reputation : public SpellScriptLoader
}
};
-enum DamageReductionAura
-{
- SPELL_BLESSING_OF_SANCTUARY = 20911,
- SPELL_GREATER_BLESSING_OF_SANCTUARY = 25899,
- SPELL_RENEWED_HOPE = 63944,
- SPELL_VIGILANCE = 50720,
- SPELL_DAMAGE_REDUCTION_AURA = 68066,
-};
-
-class spell_gen_damage_reduction_aura : public SpellScriptLoader
-{
- public:
- spell_gen_damage_reduction_aura() : SpellScriptLoader("spell_gen_damage_reduction_aura") { }
-
- class spell_gen_damage_reduction_AuraScript : public AuraScript
- {
- PrepareAuraScript(spell_gen_damage_reduction_AuraScript);
-
- bool Validate(SpellInfo const* /*SpellEntry*/)
- {
- if (!sSpellMgr->GetSpellInfo(SPELL_DAMAGE_REDUCTION_AURA))
- return false;
- return true;
- }
-
- void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- Unit* target = GetTarget();
- target->CastSpell(target, SPELL_DAMAGE_REDUCTION_AURA, true);
- }
-
- void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- Unit* target = GetTarget();
- if (target->HasAura(SPELL_DAMAGE_REDUCTION_AURA) && !(target->HasAura(SPELL_BLESSING_OF_SANCTUARY) ||
- target->HasAura(SPELL_GREATER_BLESSING_OF_SANCTUARY) ||
- target->HasAura(SPELL_RENEWED_HOPE) ||
- target->HasAura(SPELL_VIGILANCE)))
- target->RemoveAurasDueToSpell(SPELL_DAMAGE_REDUCTION_AURA);
- }
-
- void Register()
- {
- OnEffectApply += AuraEffectApplyFn(spell_gen_damage_reduction_AuraScript::OnApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK);
- OnEffectRemove += AuraEffectRemoveFn(spell_gen_damage_reduction_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK);
- }
-
- };
-
- AuraScript* GetAuraScript() const
- {
- return new spell_gen_damage_reduction_AuraScript();
- }
-};
-
enum DummyTrigger
{
SPELL_PERSISTANT_SHIELD_TRIGGERED = 26470,
@@ -3087,178 +3032,6 @@ class spell_gen_summon_elemental : public SpellScriptLoader
uint32 _spellId;
};
-enum Mounts
-{
- SPELL_COLD_WEATHER_FLYING = 54197,
-
- // Magic Broom
- SPELL_MAGIC_BROOM_60 = 42680,
- SPELL_MAGIC_BROOM_100 = 42683,
- SPELL_MAGIC_BROOM_150 = 42667,
- SPELL_MAGIC_BROOM_280 = 42668,
-
- // Headless Horseman's Mount
- SPELL_HEADLESS_HORSEMAN_MOUNT_60 = 51621,
- SPELL_HEADLESS_HORSEMAN_MOUNT_100 = 48024,
- SPELL_HEADLESS_HORSEMAN_MOUNT_150 = 51617,
- SPELL_HEADLESS_HORSEMAN_MOUNT_280 = 48023,
-
- // Winged Steed of the Ebon Blade
- SPELL_WINGED_STEED_150 = 54726,
- SPELL_WINGED_STEED_280 = 54727,
-
- // Big Love Rocket
- SPELL_BIG_LOVE_ROCKET_0 = 71343,
- SPELL_BIG_LOVE_ROCKET_60 = 71344,
- SPELL_BIG_LOVE_ROCKET_100 = 71345,
- SPELL_BIG_LOVE_ROCKET_150 = 71346,
- SPELL_BIG_LOVE_ROCKET_310 = 71347,
-
- // Invincible
- SPELL_INVINCIBLE_60 = 72281,
- SPELL_INVINCIBLE_100 = 72282,
- SPELL_INVINCIBLE_150 = 72283,
- SPELL_INVINCIBLE_310 = 72284,
-
- // Blazing Hippogryph
- SPELL_BLAZING_HIPPOGRYPH_150 = 74854,
- SPELL_BLAZING_HIPPOGRYPH_280 = 74855,
-
- // Celestial Steed
- SPELL_CELESTIAL_STEED_60 = 75619,
- SPELL_CELESTIAL_STEED_100 = 75620,
- SPELL_CELESTIAL_STEED_150 = 75617,
- SPELL_CELESTIAL_STEED_280 = 75618,
- SPELL_CELESTIAL_STEED_310 = 76153,
-
- // X-53 Touring Rocket
- SPELL_X53_TOURING_ROCKET_150 = 75957,
- SPELL_X53_TOURING_ROCKET_280 = 75972,
- SPELL_X53_TOURING_ROCKET_310 = 76154,
-};
-
-class spell_gen_mount : public SpellScriptLoader
-{
- public:
- spell_gen_mount(const char* name, uint32 mount0 = 0, uint32 mount60 = 0, uint32 mount100 = 0, uint32 mount150 = 0, uint32 mount280 = 0, uint32 mount310 = 0) : SpellScriptLoader(name),
- _mount0(mount0), _mount60(mount60), _mount100(mount100), _mount150(mount150), _mount280(mount280), _mount310(mount310) { }
-
- class spell_gen_mount_SpellScript : public SpellScript
- {
- PrepareSpellScript(spell_gen_mount_SpellScript);
-
- public:
- spell_gen_mount_SpellScript(uint32 mount0, uint32 mount60, uint32 mount100, uint32 mount150, uint32 mount280, uint32 mount310) : SpellScript(),
- _mount0(mount0), _mount60(mount60), _mount100(mount100), _mount150(mount150), _mount280(mount280), _mount310(mount310) { }
-
- bool Validate(SpellInfo const* /*spell*/)
- {
- if (_mount0 && !sSpellMgr->GetSpellInfo(_mount0))
- return false;
- if (_mount60 && !sSpellMgr->GetSpellInfo(_mount60))
- return false;
- if (_mount100 && !sSpellMgr->GetSpellInfo(_mount100))
- return false;
- if (_mount150 && !sSpellMgr->GetSpellInfo(_mount150))
- return false;
- if (_mount280 && !sSpellMgr->GetSpellInfo(_mount280))
- return false;
- if (_mount310 && !sSpellMgr->GetSpellInfo(_mount310))
- return false;
- return true;
- }
-
- void HandleMount(SpellEffIndex effIndex)
- {
- PreventHitDefaultEffect(effIndex);
-
- if (Player* target = GetHitPlayer())
- {
- // Prevent stacking of mounts and client crashes upon dismounting
- target->RemoveAurasByType(SPELL_AURA_MOUNTED, 0, GetHitAura());
-
- // Triggered spell id dependent on riding skill and zone
- bool canFly = false;
- uint32 map = GetVirtualMapForMapAndZone(target->GetMapId(), target->GetZoneId());
- if (map == 530 || (map == 571 && target->HasSpell(SPELL_COLD_WEATHER_FLYING)))
- canFly = true;
-
- float x, y, z;
- target->GetPosition(x, y, z);
- uint32 areaFlag = target->GetBaseMap()->GetAreaFlag(x, y, z);
- AreaTableEntry const* area = sAreaStore.LookupEntry(areaFlag);
- if (!area || (canFly && (area->flags & AREA_FLAG_NO_FLY_ZONE)))
- canFly = false;
-
- uint32 mount = 0;
- switch (target->GetBaseSkillValue(SKILL_RIDING))
- {
- case 0:
- mount = _mount0;
- break;
- case 75:
- mount = _mount60;
- break;
- case 150:
- mount = _mount100;
- break;
- case 225:
- if (canFly)
- mount = _mount150;
- else
- mount = _mount100;
- break;
- case 300:
- if (canFly)
- {
- if (_mount310 && target->Has310Flyer(false))
- mount = _mount310;
- else
- mount = _mount280;
- }
- else
- mount = _mount100;
- break;
- default:
- break;
- }
-
- if (mount)
- {
- PreventHitAura();
- target->CastSpell(target, mount, true);
- }
- }
- }
-
- void Register()
- {
- OnEffectHitTarget += SpellEffectFn(spell_gen_mount_SpellScript::HandleMount, EFFECT_2, SPELL_EFFECT_SCRIPT_EFFECT);
- }
-
- private:
- uint32 _mount0;
- uint32 _mount60;
- uint32 _mount100;
- uint32 _mount150;
- uint32 _mount280;
- uint32 _mount310;
- };
-
- SpellScript* GetSpellScript() const
- {
- return new spell_gen_mount_SpellScript(_mount0, _mount60, _mount100, _mount150, _mount280, _mount310);
- }
-
- private:
- uint32 _mount0;
- uint32 _mount60;
- uint32 _mount100;
- uint32 _mount150;
- uint32 _mount280;
- uint32 _mount310;
-};
-
enum FoamSword
{
ITEM_FOAM_SWORD_GREEN = 45061,
@@ -3401,6 +3174,35 @@ class spell_gen_gift_of_naaru : public SpellScriptLoader
}
};
+class spell_gen_increase_stats_buff : public SpellScriptLoader
+{
+ public:
+ spell_gen_increase_stats_buff(char const* scriptName) : SpellScriptLoader(scriptName) { }
+
+ class spell_gen_increase_stats_buff_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_gen_increase_stats_buff_SpellScript);
+
+ void HandleDummy(SpellEffIndex /*effIndex*/)
+ {
+ if (GetHitUnit()->IsInRaidWith(GetCaster()))
+ GetCaster()->CastSpell(GetCaster(), GetEffectValue() + 1, true); // raid buff
+ else
+ GetCaster()->CastSpell(GetHitUnit(), GetEffectValue(), true); // single-target buff
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_gen_increase_stats_buff_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_gen_increase_stats_buff_SpellScript();
+ }
+};
+
enum Replenishment
{
SPELL_REPLENISHMENT = 57669,
@@ -3456,60 +3258,157 @@ class spell_gen_replenishment : public SpellScriptLoader
}
};
-enum ServiceUniform
+enum RunningWildMountIds
{
- SPELL_SERVICE_UNIFORM = 71450,
-
- MODEL_GOBLIN_MALE = 31002,
- MODEL_GOBLIN_FEMALE = 31003,
+ RUNNING_WILD_MODEL_MALE = 29422,
+ RUNNING_WILD_MODEL_FEMALE = 29423,
+ SPELL_ALTERED_FORM = 97709,
};
-class spell_gen_aura_service_uniform : public SpellScriptLoader
+class spell_gen_running_wild : public SpellScriptLoader
{
public:
- spell_gen_aura_service_uniform() : SpellScriptLoader("spell_gen_aura_service_uniform") { }
+ spell_gen_running_wild() : SpellScriptLoader("spell_gen_running_wild") { }
- class spell_gen_aura_service_uniform_AuraScript : public AuraScript
+ class spell_gen_running_wild_AuraScript : public AuraScript
{
- PrepareAuraScript(spell_gen_aura_service_uniform_AuraScript);
+ PrepareAuraScript(spell_gen_running_wild_AuraScript);
bool Validate(SpellInfo const* /*spell*/)
{
- if (!sSpellMgr->GetSpellInfo(SPELL_SERVICE_UNIFORM))
+ if (!sCreatureDisplayInfoStore.LookupEntry(RUNNING_WILD_MODEL_MALE))
+ return false;
+ if (!sCreatureDisplayInfoStore.LookupEntry(RUNNING_WILD_MODEL_FEMALE))
return false;
return true;
}
- void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ void HandleMount(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
{
- // Apply model goblin
Unit* target = GetTarget();
- if (target->GetTypeId() == TYPEID_PLAYER)
+ PreventDefaultAction();
+
+ target->Mount(target->getGender() == GENDER_FEMALE ? RUNNING_WILD_MODEL_FEMALE : RUNNING_WILD_MODEL_MALE, 0, 0);
+
+ // cast speed aura
+ if (MountCapabilityEntry const* mountCapability = sMountCapabilityStore.LookupEntry(aurEff->GetAmount()))
+ target->CastSpell(target, mountCapability->SpeedModSpell, TRIGGERED_FULL_MASK);
+ }
+
+ void Register()
+ {
+ OnEffectApply += AuraEffectApplyFn(spell_gen_running_wild_AuraScript::HandleMount, EFFECT_1, SPELL_AURA_MOUNTED, AURA_EFFECT_HANDLE_REAL);
+ }
+ };
+
+ class spell_gen_running_wild_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_gen_running_wild_SpellScript);
+
+ bool Validate(SpellInfo const* /*spell*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_ALTERED_FORM))
+ return false;
+ return true;
+ }
+
+ bool Load()
+ {
+ // Definitely not a good thing, but currently the only way to do something at cast start
+ // Should be replaced as soon as possible with a new hook: BeforeCastStart
+ GetCaster()->CastSpell(GetCaster(), SPELL_ALTERED_FORM, TRIGGERED_FULL_MASK);
+ return false;
+ }
+
+ void Register()
+ {
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_gen_running_wild_AuraScript();
+ }
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_gen_running_wild_SpellScript();
+ }
+};
+
+class spell_gen_two_forms : public SpellScriptLoader
+{
+ public:
+ spell_gen_two_forms() : SpellScriptLoader("spell_gen_two_forms") { }
+
+ class spell_gen_two_forms_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_gen_two_forms_SpellScript);
+
+ SpellCastResult CheckCast()
+ {
+ if (GetCaster()->IsInCombat())
{
- if (target->getGender() == GENDER_MALE)
- target->SetDisplayId(MODEL_GOBLIN_MALE);
- else
- target->SetDisplayId(MODEL_GOBLIN_FEMALE);
+ SetCustomCastResultMessage(SPELL_CUSTOM_ERROR_CANT_TRANSFORM);
+ return SPELL_FAILED_CUSTOM_ERROR;
}
+
+ // Player cannot transform to human form if he is forced to be worgen for some reason (Darkflight)
+ if (GetCaster()->GetAuraEffectsByType(SPELL_AURA_WORGEN_ALTERED_FORM).size() > 1)
+ {
+ SetCustomCastResultMessage(SPELL_CUSTOM_ERROR_CANT_TRANSFORM);
+ return SPELL_FAILED_CUSTOM_ERROR;
+ }
+
+ return SPELL_CAST_OK;
}
- void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ void HandleTransform(SpellEffIndex effIndex)
{
- Unit* target = GetTarget();
- if (target->GetTypeId() == TYPEID_PLAYER)
- target->RestoreDisplayId();
+ Unit* target = GetHitUnit();
+ PreventHitDefaultEffect(effIndex);
+ if (target->HasAuraType(SPELL_AURA_WORGEN_ALTERED_FORM))
+ target->RemoveAurasByType(SPELL_AURA_WORGEN_ALTERED_FORM);
+ else // Basepoints 1 for this aura control whether to trigger transform transition animation or not.
+ target->CastCustomSpell(SPELL_ALTERED_FORM, SPELLVALUE_BASE_POINT0, 1, target, TRIGGERED_FULL_MASK);
}
void Register()
{
- AfterEffectApply += AuraEffectRemoveFn(spell_gen_aura_service_uniform_AuraScript::OnApply, EFFECT_0, SPELL_AURA_TRANSFORM, AURA_EFFECT_HANDLE_REAL);
- AfterEffectRemove += AuraEffectRemoveFn(spell_gen_aura_service_uniform_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_TRANSFORM, AURA_EFFECT_HANDLE_REAL);
+ OnCheckCast += SpellCheckCastFn(spell_gen_two_forms_SpellScript::CheckCast);
+ OnEffectHitTarget += SpellEffectFn(spell_gen_two_forms_SpellScript::HandleTransform, EFFECT_0, SPELL_EFFECT_DUMMY);
}
};
- AuraScript* GetAuraScript() const
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_gen_two_forms_SpellScript();
+ }
+};
+
+class spell_gen_darkflight : public SpellScriptLoader
+{
+ public:
+ spell_gen_darkflight() : SpellScriptLoader("spell_gen_darkflight") { }
+
+ class spell_gen_darkflight_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_gen_darkflight_SpellScript);
+
+ void TriggerTransform()
+ {
+ GetCaster()->CastSpell(GetCaster(), SPELL_ALTERED_FORM, TRIGGERED_FULL_MASK);
+ }
+
+ void Register()
+ {
+ AfterCast += SpellCastFn(spell_gen_darkflight_SpellScript::TriggerTransform);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
{
- return new spell_gen_aura_service_uniform_AuraScript();
+ return new spell_gen_darkflight_SpellScript();
}
};
@@ -3707,7 +3606,6 @@ void AddSC_generic_spell_scripts()
new spell_gen_launch();
new spell_gen_vehicle_scaling();
new spell_gen_oracle_wolvar_reputation();
- new spell_gen_damage_reduction_aura();
new spell_gen_dummy_trigger();
new spell_gen_spirit_healer_res();
new spell_gen_gadgetzan_transporter_backfire();
@@ -3739,19 +3637,20 @@ void AddSC_generic_spell_scripts()
new spell_gen_lifebloom("spell_faction_champion_dru_lifebloom", SPELL_FACTION_CHAMPIONS_DRU_LIFEBLOOM_FINAL_HEAL);
new spell_gen_summon_elemental("spell_gen_summon_fire_elemental", SPELL_SUMMON_FIRE_ELEMENTAL);
new spell_gen_summon_elemental("spell_gen_summon_earth_elemental", SPELL_SUMMON_EARTH_ELEMENTAL);
- new spell_gen_mount("spell_magic_broom", 0, SPELL_MAGIC_BROOM_60, SPELL_MAGIC_BROOM_100, SPELL_MAGIC_BROOM_150, SPELL_MAGIC_BROOM_280);
- new spell_gen_mount("spell_headless_horseman_mount", 0, SPELL_HEADLESS_HORSEMAN_MOUNT_60, SPELL_HEADLESS_HORSEMAN_MOUNT_100, SPELL_HEADLESS_HORSEMAN_MOUNT_150, SPELL_HEADLESS_HORSEMAN_MOUNT_280);
- new spell_gen_mount("spell_winged_steed_of_the_ebon_blade", 0, 0, 0, SPELL_WINGED_STEED_150, SPELL_WINGED_STEED_280);
- new spell_gen_mount("spell_big_love_rocket", SPELL_BIG_LOVE_ROCKET_0, SPELL_BIG_LOVE_ROCKET_60, SPELL_BIG_LOVE_ROCKET_100, SPELL_BIG_LOVE_ROCKET_150, SPELL_BIG_LOVE_ROCKET_310);
- new spell_gen_mount("spell_invincible", 0, SPELL_INVINCIBLE_60, SPELL_INVINCIBLE_100, SPELL_INVINCIBLE_150, SPELL_INVINCIBLE_310);
- new spell_gen_mount("spell_blazing_hippogryph", 0, 0, 0, SPELL_BLAZING_HIPPOGRYPH_150, SPELL_BLAZING_HIPPOGRYPH_280);
- new spell_gen_mount("spell_celestial_steed", 0, SPELL_CELESTIAL_STEED_60, SPELL_CELESTIAL_STEED_100, SPELL_CELESTIAL_STEED_150, SPELL_CELESTIAL_STEED_280, SPELL_CELESTIAL_STEED_310);
- new spell_gen_mount("spell_x53_touring_rocket", 0, 0, 0, SPELL_X53_TOURING_ROCKET_150, SPELL_X53_TOURING_ROCKET_280, SPELL_X53_TOURING_ROCKET_310);
new spell_gen_upper_deck_create_foam_sword();
new spell_gen_bonked();
new spell_gen_gift_of_naaru();
+ new spell_gen_increase_stats_buff("spell_pal_blessing_of_kings");
+ new spell_gen_increase_stats_buff("spell_pal_blessing_of_might");
+ new spell_gen_increase_stats_buff("spell_dru_mark_of_the_wild");
+ new spell_gen_increase_stats_buff("spell_pri_power_word_fortitude");
+ new spell_gen_increase_stats_buff("spell_pri_shadow_protection");
+ new spell_gen_increase_stats_buff("spell_mage_arcane_brilliance");
+ new spell_gen_increase_stats_buff("spell_mage_dalaran_brilliance");
new spell_gen_replenishment();
- new spell_gen_aura_service_uniform();
+ new spell_gen_running_wild();
+ new spell_gen_two_forms();
+ new spell_gen_darkflight();
new spell_gen_orc_disguise();
new spell_gen_whisper_gulch_yogg_saron_whisper();
new spell_gen_spectator_cheer_trigger();
diff --git a/src/server/scripts/Spells/spell_hunter.cpp b/src/server/scripts/Spells/spell_hunter.cpp
index 2965d6a7a5f..98357d82d16 100644
--- a/src/server/scripts/Spells/spell_hunter.cpp
+++ b/src/server/scripts/Spells/spell_hunter.cpp
@@ -50,6 +50,7 @@ enum HunterSpells
SPELL_HUNTER_READINESS = 23989,
SPELL_HUNTER_SNIPER_TRAINING_R1 = 53302,
SPELL_HUNTER_SNIPER_TRAINING_BUFF_R1 = 64418,
+ SPELL_HUNTER_THRILL_OF_THE_HUNT = 34720,
SPELL_DRAENEI_GIFT_OF_THE_NAARU = 59543,
};
@@ -802,6 +803,44 @@ class spell_hun_target_only_pet_and_owner : public SpellScriptLoader
}
};
+// 34497 - Thrill of the Hunt
+class spell_hun_thrill_of_the_hunt : public SpellScriptLoader
+{
+ public:
+ spell_hun_thrill_of_the_hunt() : SpellScriptLoader("spell_hun_thrill_of_the_hunt") { }
+
+ class spell_hun_thrill_of_the_hunt_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_hun_thrill_of_the_hunt_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_HUNTER_THRILL_OF_THE_HUNT))
+ return false;
+ return true;
+ }
+
+ void HandleEffectProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+ int32 focus = eventInfo.GetDamageInfo()->GetSpellInfo()->CalcPowerCost(GetTarget(), SpellSchoolMask(eventInfo.GetDamageInfo()->GetSchoolMask()));
+ focus = CalculatePct(focus, aurEff->GetAmount());
+
+ GetTarget()->CastCustomSpell(GetTarget(), SPELL_HUNTER_THRILL_OF_THE_HUNT, &focus, NULL, NULL, true, NULL, aurEff);
+ }
+
+ void Register()
+ {
+ OnEffectProc += AuraEffectProcFn(spell_hun_thrill_of_the_hunt_AuraScript::HandleEffectProc, EFFECT_0, SPELL_AURA_DUMMY);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_hun_thrill_of_the_hunt_AuraScript();
+ }
+};
+
void AddSC_hunter_spell_scripts()
{
new spell_hun_aspect_of_the_beast();
@@ -820,4 +859,5 @@ void AddSC_hunter_spell_scripts()
new spell_hun_sniper_training();
new spell_hun_tame_beast();
new spell_hun_target_only_pet_and_owner();
+ new spell_hun_thrill_of_the_hunt();
}
diff --git a/src/server/scripts/Spells/spell_mage.cpp b/src/server/scripts/Spells/spell_mage.cpp
index 46c8c0bd071..caa40235ca7 100644
--- a/src/server/scripts/Spells/spell_mage.cpp
+++ b/src/server/scripts/Spells/spell_mage.cpp
@@ -25,6 +25,7 @@
#include "ScriptMgr.h"
#include "SpellScript.h"
#include "SpellAuraEffects.h"
+#include "Pet.h"
enum MageSpells
{
@@ -37,6 +38,7 @@ enum MageSpells
SPELL_MAGE_INCANTERS_ABSORBTION_TRIGGERED = 44413,
SPELL_MAGE_IGNITE = 12654,
SPELL_MAGE_MASTER_OF_ELEMENTS_ENERGIZE = 29077,
+ SPELL_MAGE_SLOW = 31589,
SPELL_MAGE_SQUIRREL_FORM = 32813,
SPELL_MAGE_GIRAFFE_FORM = 32816,
SPELL_MAGE_SERPENT_FORM = 32817,
@@ -47,6 +49,38 @@ enum MageSpells
SPELL_MAGE_SUMMON_WATER_ELEMENTAL_PERMANENT = 70908,
SPELL_MAGE_SUMMON_WATER_ELEMENTAL_TEMPORARY = 70907,
SPELL_MAGE_GLYPH_OF_BLAST_WAVE = 62126,
+
+ SPELL_MAGE_FLAMESTRIKE = 2120,
+
+ SPELL_MAGE_CHILLED_R1 = 12484,
+ SPELL_MAGE_CHILLED_R2 = 12485,
+
+ SPELL_MAGE_CONE_OF_COLD_AURA_R1 = 11190,
+ SPELL_MAGE_CONE_OF_COLD_AURA_R2 = 12489,
+ SPELL_MAGE_CONE_OF_COLD_TRIGGER_R1 = 83301,
+ SPELL_MAGE_CONE_OF_COLD_TRIGGER_R2 = 83302,
+
+ SPELL_MAGE_SHATTERED_BARRIER_R1 = 44745,
+ SPELL_MAGE_SHATTERED_BARRIER_R2 = 54787,
+ SPELL_MAGE_SHATTERED_BARRIER_FREEZE_R1 = 55080,
+ SPELL_MAGE_SHATTERED_BARRIER_FREEZE_R2 = 83073,
+
+ SPELL_MAGE_IMPROVED_MANA_GEM_TRIGGERED = 83098,
+
+ SPELL_MAGE_RING_OF_FROST_SUMMON = 82676,
+ SPELL_MAGE_RING_OF_FROST_FREEZE = 82691,
+ SPELL_MAGE_RING_OF_FROST_DUMMY = 91264,
+
+ SPELL_MAGE_FINGERS_OF_FROST = 44544
+};
+
+enum MageIcons
+{
+ ICON_MAGE_SHATTER = 976,
+ ICON_MAGE_IMPROVED_FLAMESTRIKE = 37,
+ ICON_MAGE_IMPROVED_FREEZE = 94,
+ ICON_MAGE_INCANTER_S_ABSORPTION = 2941,
+ ICON_MAGE_IMPROVED_MANA_GEM = 1036
};
// Incanter's Absorbtion
@@ -74,7 +108,7 @@ class spell_mage_incanters_absorbtion_base_AuraScript : public AuraScript
}
};
-// -11113 - Blast Wave
+// 11113 - Blast Wave
class spell_mage_blast_wave : public SpellScriptLoader
{
public:
@@ -86,21 +120,40 @@ class spell_mage_blast_wave : public SpellScriptLoader
bool Validate(SpellInfo const* /*spellInfo*/)
{
- if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_GLYPH_OF_BLAST_WAVE))
+ if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_FLAMESTRIKE))
return false;
return true;
}
- void HandleKnockBack(SpellEffIndex effIndex)
+ void CountTargets(std::list<WorldObject*>& targetList)
{
- if (GetCaster()->HasAura(SPELL_MAGE_GLYPH_OF_BLAST_WAVE))
- PreventHitDefaultEffect(effIndex);
+ _targetCount = targetList.size();
+ }
+
+ void HandleImprovedFlamestrike()
+ {
+ if (_targetCount >= 2)
+ if (AuraEffect* aurEff = GetCaster()->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_MAGE, ICON_MAGE_IMPROVED_FLAMESTRIKE, EFFECT_0))
+ if (roll_chance_i(aurEff->GetAmount()))
+ {
+ float x, y, z;
+ WorldLocation const* loc = GetExplTargetDest();
+ if (!loc)
+ return;
+
+ loc->GetPosition(x, y, z);
+ GetCaster()->CastSpell(x, y, z, SPELL_MAGE_FLAMESTRIKE, true);
+ }
}
void Register()
{
- OnEffectHitTarget += SpellEffectFn(spell_mage_blast_wave_SpellScript::HandleKnockBack, EFFECT_2, SPELL_EFFECT_KNOCK_BACK);
+ OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_mage_blast_wave_SpellScript::CountTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ENEMY);
+ AfterCast += SpellCastFn(spell_mage_blast_wave_SpellScript::HandleImprovedFlamestrike);
}
+
+ private:
+ uint32 _targetCount;
};
SpellScript* GetSpellScript() const
@@ -154,6 +207,50 @@ class spell_mage_burnout : public SpellScriptLoader
}
};
+// 42208 - Blizzard
+/// Updated 4.3.4
+class spell_mage_blizzard : public SpellScriptLoader
+{
+ public:
+ spell_mage_blizzard() : SpellScriptLoader("spell_mage_blizzard") { }
+
+ class spell_mage_blizzard_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_mage_blizzard_SpellScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_CHILLED_R1))
+ return false;
+ if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_CHILLED_R2))
+ return false;
+ return true;
+ }
+
+ void AddChillEffect(SpellEffIndex /*effIndex*/)
+ {
+ Unit* caster = GetCaster();
+ if (Unit* unitTarget = GetHitUnit())
+ {
+ if (caster->IsScriptOverriden(GetSpellInfo(), 836))
+ caster->CastSpell(unitTarget, SPELL_MAGE_CHILLED_R1, true);
+ else if (caster->IsScriptOverriden(GetSpellInfo(), 988))
+ caster->CastSpell(unitTarget, SPELL_MAGE_CHILLED_R2, true);
+ }
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_mage_blizzard_SpellScript::AddChillEffect, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_mage_blizzard_SpellScript();
+ }
+};
+
// 11958 - Cold Snap
class spell_mage_cold_snap : public SpellScriptLoader
{
@@ -201,6 +298,112 @@ class spell_mage_cold_snap : public SpellScriptLoader
}
};
+// 120 - Cone of Cold
+/// Updated 4.3.4
+class spell_mage_cone_of_cold : public SpellScriptLoader
+{
+ public:
+ spell_mage_cone_of_cold() : SpellScriptLoader("spell_mage_cone_of_cold") { }
+
+ class spell_mage_cone_of_cold_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_mage_cone_of_cold_SpellScript);
+
+ void HandleConeOfColdScript(SpellEffIndex /*effIndex*/)
+ {
+ Unit* caster = GetCaster();
+ if (Unit* unitTarget = GetHitUnit())
+ {
+ if (caster->HasAura(SPELL_MAGE_CONE_OF_COLD_AURA_R1)) // Improved Cone of Cold Rank 1
+ unitTarget->CastSpell(unitTarget, SPELL_MAGE_CONE_OF_COLD_TRIGGER_R1, true);
+ else if (caster->HasAura(SPELL_MAGE_CONE_OF_COLD_AURA_R2)) // Improved Cone of Cold Rank 2
+ unitTarget->CastSpell(unitTarget, SPELL_MAGE_CONE_OF_COLD_TRIGGER_R2, true);
+ }
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_mage_cone_of_cold_SpellScript::HandleConeOfColdScript, EFFECT_0, SPELL_EFFECT_APPLY_AURA);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_mage_cone_of_cold_SpellScript();
+ }
+};
+
+// 42955 Conjure Refreshment
+/// Updated 4.3.4
+struct ConjureRefreshmentData
+{
+ uint32 minLevel;
+ uint32 maxLevel;
+ uint32 spellId;
+};
+
+uint8 const MAX_CONJURE_REFRESHMENT_SPELLS = 7;
+ConjureRefreshmentData const _conjureData[MAX_CONJURE_REFRESHMENT_SPELLS] =
+{
+ { 33, 43, 92739 },
+ { 44, 53, 92799 },
+ { 54, 63, 92802 },
+ { 64, 73, 92805 },
+ { 74, 79, 74625 },
+ { 80, 84, 92822 },
+ { 85, 85, 92727 }
+};
+
+// 42955 - Conjure Refreshment
+class spell_mage_conjure_refreshment : public SpellScriptLoader
+{
+ public:
+ spell_mage_conjure_refreshment() : SpellScriptLoader("spell_mage_conjure_refreshment") { }
+
+ class spell_mage_conjure_refreshment_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_mage_conjure_refreshment_SpellScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ for (uint8 i = 0; i < MAX_CONJURE_REFRESHMENT_SPELLS; ++i)
+ if (!sSpellMgr->GetSpellInfo(_conjureData[i].spellId))
+ return false;
+ return true;
+ }
+
+ bool Load()
+ {
+ if (GetCaster()->GetTypeId() != TYPEID_PLAYER)
+ return false;
+ return true;
+ }
+
+ void HandleDummy(SpellEffIndex /*effIndex*/)
+ {
+ uint8 level = GetHitUnit()->getLevel();
+ for (uint8 i = 0; i < MAX_CONJURE_REFRESHMENT_SPELLS; ++i)
+ {
+ ConjureRefreshmentData const& spellData = _conjureData[i];
+ if (level < spellData.minLevel || level > spellData.maxLevel)
+ continue;
+ GetHitUnit()->CastSpell(GetHitUnit(), spellData.spellId);
+ break;
+ }
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_mage_conjure_refreshment_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_mage_conjure_refreshment_SpellScript();
+ }
+};
+
// -543 - Fire Ward
// -6143 - Frost Ward
class spell_mage_fire_frost_ward : public SpellScriptLoader
@@ -319,49 +522,115 @@ class spell_mage_focus_magic : public SpellScriptLoader
}
};
-// -11426 - Ice Barrier
-class spell_mage_ice_barrier : public SpellScriptLoader
+// 116 - Frostbolt
+/// Updated 4.3.4
+class spell_mage_frostbolt : public SpellScriptLoader
+{
+ public:
+ spell_mage_frostbolt() : SpellScriptLoader("spell_mage_frostbolt") { }
+
+ class spell_mage_frostbolt_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_mage_frostbolt_SpellScript);
+
+ void RecalculateDamage(SpellEffIndex /*effIndex*/)
+ {
+ if (GetHitUnit() && GetHitUnit()->HasAuraState(AURA_STATE_FROZEN, GetSpellInfo(), GetCaster()))
+ {
+ if (AuraEffect* aurEff = GetCaster()->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_MAGE, ICON_MAGE_SHATTER, EFFECT_1))
+ {
+ int32 damage = GetHitDamage();
+ AddPct(damage, aurEff->GetAmount());
+ SetHitDamage(damage);
+ }
+ }
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_mage_frostbolt_SpellScript::RecalculateDamage, EFFECT_1, SPELL_EFFECT_SCHOOL_DAMAGE);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_mage_frostbolt_SpellScript();
+ }
+};
+
+// -44457 - Living Bomb
+class spell_mage_living_bomb : public SpellScriptLoader
{
public:
- spell_mage_ice_barrier() : SpellScriptLoader("spell_mage_ice_barrier") { }
+ spell_mage_living_bomb() : SpellScriptLoader("spell_mage_living_bomb") { }
- class spell_mage_ice_barrier_AuraScript : public spell_mage_incanters_absorbtion_base_AuraScript
+ class spell_mage_living_bomb_AuraScript : public AuraScript
{
- PrepareAuraScript(spell_mage_ice_barrier_AuraScript);
+ PrepareAuraScript(spell_mage_living_bomb_AuraScript);
- void CalculateAmount(AuraEffect const* aurEff, int32& amount, bool& canBeRecalculated)
+ bool Validate(SpellInfo const* spellInfo)
{
- canBeRecalculated = false;
- if (Unit* caster = GetCaster())
- {
- // +80.68% from sp bonus
- float bonus = 0.8068f;
-
- bonus *= caster->SpellBaseHealingBonusDone(GetSpellInfo()->GetSchoolMask());
-
- // Glyph of Ice Barrier: its weird having a SPELLMOD_ALL_EFFECTS here but its blizzards doing :)
- // Glyph of Ice Barrier is only applied at the spell damage bonus because it was already applied to the base value in CalculateSpellDamage
- bonus = caster->ApplyEffectModifiers(GetSpellInfo(), aurEff->GetEffIndex(), bonus);
+ if (!sSpellMgr->GetSpellInfo(uint32(spellInfo->Effects[EFFECT_1].CalcValue())))
+ return false;
+ return true;
+ }
- bonus *= caster->CalculateLevelPenalty(GetSpellInfo());
+ void AfterRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
+ {
+ AuraRemoveMode removeMode = GetTargetApplication()->GetRemoveMode();
+ if (removeMode != AURA_REMOVE_BY_ENEMY_SPELL && removeMode != AURA_REMOVE_BY_EXPIRE)
+ return;
- amount += int32(bonus);
- }
+ if (Unit* caster = GetCaster())
+ caster->CastSpell(GetTarget(), uint32(aurEff->GetAmount()), true, NULL, aurEff);
}
void Register()
{
- DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_mage_ice_barrier_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB);
- AfterEffectAbsorb += AuraEffectAbsorbFn(spell_mage_ice_barrier_AuraScript::Trigger, EFFECT_0);
+ AfterEffectRemove += AuraEffectRemoveFn(spell_mage_living_bomb_AuraScript::AfterRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
}
};
AuraScript* GetAuraScript() const
{
- return new spell_mage_ice_barrier_AuraScript();
+ return new spell_mage_living_bomb_AuraScript();
}
};
+// 11426 - Ice Barrier
+/// Updated 4.3.4
+class spell_mage_ice_barrier : public SpellScriptLoader
+{
+ public:
+ spell_mage_ice_barrier() : SpellScriptLoader("spell_mage_ice_barrier") { }
+
+ class spell_mage_ice_barrier_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_mage_ice_barrier_AuraScript);
+
+ void AfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ {
+ if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_ENEMY_SPELL)
+ return;
+
+ if (GetTarget()->HasAura(SPELL_MAGE_SHATTERED_BARRIER_R1))
+ GetTarget()->CastSpell(GetTarget(), SPELL_MAGE_SHATTERED_BARRIER_FREEZE_R1, true);
+ else if (GetTarget()->HasAura(SPELL_MAGE_SHATTERED_BARRIER_R2))
+ GetTarget()->CastSpell(GetTarget(), SPELL_MAGE_SHATTERED_BARRIER_FREEZE_R2, true);
+ }
+
+ void Register()
+ {
+ AfterEffectRemove += AuraEffectRemoveFn(spell_mage_ice_barrier_AuraScript::AfterRemove, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB, AURA_EFFECT_HANDLE_REAL);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_mage_ice_barrier_AuraScript();
+ }
+};
+
// -11119 - Ignite
class spell_mage_ignite : public SpellScriptLoader
{
@@ -409,132 +678,171 @@ class spell_mage_ignite : public SpellScriptLoader
}
};
-// -44457 - Living Bomb
-class spell_mage_living_bomb : public SpellScriptLoader
+// 543 - Mage Ward
+/// Updated 4.3.4
+class spell_mage_mage_ward : public SpellScriptLoader
+{
+ public:
+ spell_mage_mage_ward() : SpellScriptLoader("spell_mage_mage_ward") { }
+
+ class spell_mage_mage_ward_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_mage_mage_ward_AuraScript);
+
+ void HandleAbsorb(AuraEffect* /*aurEff*/, DamageInfo & /*dmgInfo*/, uint32 & absorbAmount)
+ {
+ if (AuraEffect* aurEff = GetTarget()->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_GENERIC, ICON_MAGE_INCANTER_S_ABSORPTION, EFFECT_0))
+ {
+ int32 bp = CalculatePct(absorbAmount, aurEff->GetAmount());
+ GetTarget()->CastCustomSpell(GetTarget(), SPELL_MAGE_INCANTERS_ABSORBTION_TRIGGERED, &bp, NULL, NULL, true);
+ }
+ }
+
+ void Register()
+ {
+ AfterEffectAbsorb += AuraEffectAbsorbFn(spell_mage_mage_ward_AuraScript::HandleAbsorb, EFFECT_0);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_mage_mage_ward_AuraScript();
+ }
+};
+
+// 1463 - Mana Shield
+/// Updated 4.3.4
+class spell_mage_mana_shield : public SpellScriptLoader
{
public:
- spell_mage_living_bomb() : SpellScriptLoader("spell_mage_living_bomb") { }
+ spell_mage_mana_shield() : SpellScriptLoader("spell_mage_mana_shield") { }
+
+ class spell_mage_mana_shield_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_mage_mana_shield_AuraScript);
+
+ void HandleAbsorb(AuraEffect* /*aurEff*/, DamageInfo & /*dmgInfo*/, uint32 & absorbAmount)
+ {
+ if (AuraEffect* aurEff = GetTarget()->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_GENERIC, ICON_MAGE_INCANTER_S_ABSORPTION, EFFECT_0))
+ {
+ int32 bp = CalculatePct(absorbAmount, aurEff->GetAmount());
+ GetTarget()->CastCustomSpell(GetTarget(), SPELL_MAGE_INCANTERS_ABSORBTION_TRIGGERED, &bp, NULL, NULL, true);
+ }
+ }
+
+ void AfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ {
+ if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_ENEMY_SPELL)
+ GetTarget()->CastSpell(GetTarget(), SPELL_MAGE_INCANTERS_ABSORBTION_R1, true);
+ }
+
+ void Register()
+ {
+ AfterEffectManaShield += AuraEffectManaShieldFn(spell_mage_mana_shield_AuraScript::HandleAbsorb, EFFECT_0);
+ AfterEffectRemove += AuraEffectRemoveFn(spell_mage_mana_shield_AuraScript::AfterRemove, EFFECT_0, SPELL_AURA_MANA_SHIELD, AURA_EFFECT_HANDLE_REAL);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_mage_mana_shield_AuraScript();
+ }
+};
- class spell_mage_living_bomb_AuraScript : public AuraScript
+// -29074 - Master of Elements
+class spell_mage_master_of_elements : public SpellScriptLoader
+{
+ public:
+ spell_mage_master_of_elements() : SpellScriptLoader("spell_mage_master_of_elements") { }
+
+ class spell_mage_master_of_elements_AuraScript : public AuraScript
{
- PrepareAuraScript(spell_mage_living_bomb_AuraScript);
+ PrepareAuraScript(spell_mage_master_of_elements_AuraScript);
- bool Validate(SpellInfo const* spell)
+ bool Validate(SpellInfo const* /*spellInfo*/)
{
- if (!sSpellMgr->GetSpellInfo(uint32(spell->Effects[EFFECT_1].CalcValue())))
+ if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_MASTER_OF_ELEMENTS_ENERGIZE))
return false;
return true;
}
- void AfterRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
+ bool CheckProc(ProcEventInfo& eventInfo)
{
- AuraRemoveMode removeMode = GetTargetApplication()->GetRemoveMode();
- if (removeMode != AURA_REMOVE_BY_ENEMY_SPELL && removeMode != AURA_REMOVE_BY_EXPIRE)
- return;
-
- if (Unit* caster = GetCaster())
- caster->CastSpell(GetTarget(), uint32(aurEff->GetAmount()), true, NULL, aurEff);
+ return eventInfo.GetDamageInfo()->GetSpellInfo(); // eventInfo.GetSpellInfo()
}
- void Register()
- {
- AfterEffectRemove += AuraEffectRemoveFn(spell_mage_living_bomb_AuraScript::AfterRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
- }
- };
-
- AuraScript* GetAuraScript() const
- {
- return new spell_mage_living_bomb_AuraScript();
- }
-};
-
-// -1463 - Mana Shield
-class spell_mage_mana_shield : public SpellScriptLoader
-{
- public:
- spell_mage_mana_shield() : SpellScriptLoader("spell_mage_mana_shield") { }
-
- class spell_mage_mana_shield_AuraScript : public spell_mage_incanters_absorbtion_base_AuraScript
- {
- PrepareAuraScript(spell_mage_mana_shield_AuraScript);
-
- void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& canBeRecalculated)
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
{
- canBeRecalculated = false;
- if (Unit* caster = GetCaster())
- {
- // +80.53% from sp bonus
- float bonus = 0.8053f;
+ PreventDefaultAction();
- bonus *= caster->SpellBaseHealingBonusDone(GetSpellInfo()->GetSchoolMask());
- bonus *= caster->CalculateLevelPenalty(GetSpellInfo());
+ int32 mana = int32(eventInfo.GetDamageInfo()->GetSpellInfo()->CalcPowerCost(GetTarget(), eventInfo.GetDamageInfo()->GetSchoolMask()));
+ mana = CalculatePct(mana, aurEff->GetAmount());
- amount += int32(bonus);
- }
+ if (mana > 0)
+ GetTarget()->CastCustomSpell(SPELL_MAGE_MASTER_OF_ELEMENTS_ENERGIZE, SPELLVALUE_BASE_POINT0, mana, GetTarget(), true, NULL, aurEff);
}
void Register()
{
- DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_mage_mana_shield_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_MANA_SHIELD);
- AfterEffectManaShield += AuraEffectManaShieldFn(spell_mage_mana_shield_AuraScript::Trigger, EFFECT_0);
+ DoCheckProc += AuraCheckProcFn(spell_mage_master_of_elements_AuraScript::CheckProc);
+ OnEffectProc += AuraEffectProcFn(spell_mage_master_of_elements_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
}
};
AuraScript* GetAuraScript() const
{
- return new spell_mage_mana_shield_AuraScript();
+ return new spell_mage_master_of_elements_AuraScript();
}
};
-// -29074 - Master of Elements
-class spell_mage_master_of_elements : public SpellScriptLoader
+// 86181 - Nether Vortex
+class spell_mage_nether_vortex : public SpellScriptLoader
{
public:
- spell_mage_master_of_elements() : SpellScriptLoader("spell_mage_master_of_elements") { }
+ spell_mage_nether_vortex() : SpellScriptLoader("spell_mage_nether_vortex") { }
- class spell_mage_master_of_elements_AuraScript : public AuraScript
+ class spell_mage_nether_vortex_AuraScript : public AuraScript
{
- PrepareAuraScript(spell_mage_master_of_elements_AuraScript);
+ PrepareAuraScript(spell_mage_nether_vortex_AuraScript);
bool Validate(SpellInfo const* /*spellInfo*/)
{
- if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_MASTER_OF_ELEMENTS_ENERGIZE))
+ if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_SLOW))
return false;
- return true;
+ return true;
}
- bool CheckProc(ProcEventInfo& eventInfo)
+ bool DoCheck(ProcEventInfo& eventInfo)
{
- return eventInfo.GetDamageInfo()->GetSpellInfo(); // eventInfo.GetSpellInfo()
+ if (Aura* aura = eventInfo.GetProcTarget()->GetAura(SPELL_MAGE_SLOW))
+ if (aura->GetCasterGUID() != GetTarget()->GetGUID())
+ return false;
+
+ return true;
}
- void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ void HandleEffectProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
{
PreventDefaultAction();
-
- int32 mana = int32(eventInfo.GetDamageInfo()->GetSpellInfo()->CalcPowerCost(GetTarget(), eventInfo.GetDamageInfo()->GetSchoolMask()));
- mana = CalculatePct(mana, aurEff->GetAmount());
-
- if (mana > 0)
- GetTarget()->CastCustomSpell(SPELL_MAGE_MASTER_OF_ELEMENTS_ENERGIZE, SPELLVALUE_BASE_POINT0, mana, GetTarget(), true, NULL, aurEff);
+ GetTarget()->CastSpell(eventInfo.GetProcTarget(), SPELL_MAGE_SLOW, true, NULL, aurEff);
}
void Register()
{
- DoCheckProc += AuraCheckProcFn(spell_mage_master_of_elements_AuraScript::CheckProc);
- OnEffectProc += AuraEffectProcFn(spell_mage_master_of_elements_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
+ DoCheckProc += AuraCheckProcFn(spell_mage_nether_vortex_AuraScript::DoCheck);
+ OnEffectProc += AuraEffectProcFn(spell_mage_nether_vortex_AuraScript::HandleEffectProc, EFFECT_0, SPELL_AURA_DUMMY);
}
};
AuraScript* GetAuraScript() const
{
- return new spell_mage_master_of_elements_AuraScript();
+ return new spell_mage_nether_vortex_AuraScript();
}
};
enum SilvermoonPolymorph
{
- NPC_AUROSALIA = 18744,
+ NPC_AUROSALIA = 18744
};
/// @todo move out of here and rename - not a mage spell
@@ -553,7 +861,7 @@ class spell_mage_polymorph_cast_visual : public SpellScriptLoader
bool Validate(SpellInfo const* /*spellInfo*/)
{
// check if spell ids exist in dbc
- for (uint32 i = 0; i < 6; ++i)
+ for (uint32 i = 0; i < 6; i++)
if (!sSpellMgr->GetSpellInfo(PolymorhForms[i]))
return false;
return true;
@@ -568,6 +876,7 @@ class spell_mage_polymorph_cast_visual : public SpellScriptLoader
void Register()
{
+ // add dummy effect spell handler to Polymorph visual
OnEffectHitTarget += SpellEffectFn(spell_mage_polymorph_cast_visual_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
}
};
@@ -578,7 +887,7 @@ class spell_mage_polymorph_cast_visual : public SpellScriptLoader
}
};
-const uint32 spell_mage_polymorph_cast_visual::spell_mage_polymorph_cast_visual_SpellScript::PolymorhForms[6] =
+uint32 const spell_mage_polymorph_cast_visual::spell_mage_polymorph_cast_visual_SpellScript::PolymorhForms[6] =
{
SPELL_MAGE_SQUIRREL_FORM,
SPELL_MAGE_GIRAFFE_FORM,
@@ -588,6 +897,192 @@ const uint32 spell_mage_polymorph_cast_visual::spell_mage_polymorph_cast_visual_
SPELL_MAGE_SHEEP_FORM
};
+// 5405 - Replenish Mana (Mana Gem)
+/// Updated 4.3.4
+class spell_mage_replenish_mana : public SpellScriptLoader
+{
+ public:
+ spell_mage_replenish_mana() : SpellScriptLoader("spell_mage_replenish_mana") { }
+
+ class spell_mage_replenish_mana_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_mage_replenish_mana_SpellScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_IMPROVED_MANA_GEM_TRIGGERED))
+ return false;
+ return true;
+ }
+
+ void HandleImprovedManaGem()
+ {
+ if (AuraEffect* aurEff = GetCaster()->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_MAGE, ICON_MAGE_IMPROVED_MANA_GEM, EFFECT_0))
+ {
+ int32 bp = CalculatePct(GetCaster()->GetMaxPower(POWER_MANA), aurEff->GetAmount());
+ GetCaster()->CastCustomSpell(GetCaster(), SPELL_MAGE_IMPROVED_MANA_GEM_TRIGGERED, &bp, &bp, NULL, true);
+ }
+ }
+
+ void Register()
+ {
+ AfterCast += SpellCastFn(spell_mage_replenish_mana_SpellScript::HandleImprovedManaGem);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_mage_replenish_mana_SpellScript();
+ }
+};
+
+// 82676 - Ring of Frost
+/// Updated 4.3.4
+class spell_mage_ring_of_frost : public SpellScriptLoader
+{
+ public:
+ spell_mage_ring_of_frost() : SpellScriptLoader("spell_mage_ring_of_frost") { }
+
+ class spell_mage_ring_of_frost_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_mage_ring_of_frost_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_RING_OF_FROST_SUMMON))
+ return false;
+ if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_RING_OF_FROST_FREEZE))
+ return false;
+ if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_RING_OF_FROST_DUMMY))
+ return false;
+ return true;
+ }
+
+ bool Load()
+ {
+ ringOfFrost = NULL;
+ return true;
+ }
+
+ void HandleEffectPeriodic(AuraEffect const* /*aurEff*/)
+ {
+ if (ringOfFrost)
+ if (GetMaxDuration() - (int32)ringOfFrost->GetTimer() >= sSpellMgr->GetSpellInfo(SPELL_MAGE_RING_OF_FROST_DUMMY)->GetDuration())
+ GetTarget()->CastSpell(ringOfFrost->GetPositionX(), ringOfFrost->GetPositionY(), ringOfFrost->GetPositionZ(), SPELL_MAGE_RING_OF_FROST_FREEZE, true);
+ }
+
+ void Apply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ {
+ std::list<Creature*> MinionList;
+ GetTarget()->GetAllMinionsByEntry(MinionList, GetSpellInfo()->Effects[EFFECT_0].MiscValue);
+
+ // Get the last summoned RoF, save it and despawn older ones
+ for (std::list<Creature*>::iterator itr = MinionList.begin(); itr != MinionList.end(); itr++)
+ {
+ TempSummon* summon = (*itr)->ToTempSummon();
+
+ if (ringOfFrost && summon)
+ {
+ if (summon->GetTimer() > ringOfFrost->GetTimer())
+ {
+ ringOfFrost->DespawnOrUnsummon();
+ ringOfFrost = summon;
+ }
+ else
+ summon->DespawnOrUnsummon();
+ }
+ else if (summon)
+ ringOfFrost = summon;
+ }
+ }
+
+ TempSummon* ringOfFrost;
+
+ void Register()
+ {
+ OnEffectPeriodic += AuraEffectPeriodicFn(spell_mage_ring_of_frost_AuraScript::HandleEffectPeriodic, EFFECT_1, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
+ OnEffectApply += AuraEffectApplyFn(spell_mage_ring_of_frost_AuraScript::Apply, EFFECT_1, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_mage_ring_of_frost_AuraScript();
+ }
+};
+
+// 82691 - Ring of Frost (freeze efect)
+/// Updated 4.3.4
+class spell_mage_ring_of_frost_freeze : public SpellScriptLoader
+{
+ public:
+ spell_mage_ring_of_frost_freeze() : SpellScriptLoader("spell_mage_ring_of_frost_freeze") { }
+
+ class spell_mage_ring_of_frost_freeze_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_mage_ring_of_frost_freeze_SpellScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_RING_OF_FROST_SUMMON))
+ return false;
+ if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_RING_OF_FROST_FREEZE))
+ return false;
+ return true;
+ }
+
+ void FilterTargets(std::list<WorldObject*>& targets)
+ {
+ float outRadius = sSpellMgr->GetSpellInfo(SPELL_MAGE_RING_OF_FROST_SUMMON)->Effects[EFFECT_0].CalcRadius();
+ float inRadius = 4.7f;
+
+ for (std::list<WorldObject*>::iterator itr = targets.begin(); itr != targets.end(); ++itr)
+ if (Unit* unit = (*itr)->ToUnit())
+ if (unit->HasAura(SPELL_MAGE_RING_OF_FROST_DUMMY) || unit->HasAura(SPELL_MAGE_RING_OF_FROST_FREEZE) || unit->GetExactDist(GetExplTargetDest()) > outRadius || unit->GetExactDist(GetExplTargetDest()) < inRadius)
+ targets.erase(itr--);
+ }
+
+ void Register()
+ {
+ OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_mage_ring_of_frost_freeze_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ENEMY);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_mage_ring_of_frost_freeze_SpellScript();
+ }
+
+ class spell_mage_ring_of_frost_freeze_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_mage_ring_of_frost_freeze_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_RING_OF_FROST_DUMMY))
+ return false;
+ return true;
+ }
+
+ void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ {
+ if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE)
+ if (GetCaster())
+ GetCaster()->CastSpell(GetTarget(), SPELL_MAGE_RING_OF_FROST_DUMMY, true);
+ }
+
+ void Register()
+ {
+ AfterEffectRemove += AuraEffectRemoveFn(spell_mage_ring_of_frost_freeze_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_MOD_STUN, AURA_EFFECT_HANDLE_REAL);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_mage_ring_of_frost_freeze_AuraScript();
+ }
+};
+
// 31687 - Summon Water Elemental
class spell_mage_summon_water_elemental : public SpellScriptLoader
{
@@ -608,6 +1103,14 @@ class spell_mage_summon_water_elemental : public SpellScriptLoader
void HandleDummy(SpellEffIndex /*effIndex*/)
{
Unit* caster = GetCaster();
+
+ if (Player* player = caster->ToPlayer())
+ if (Guardian* elemental = player->GetGuardianPet())
+ // Check if the pet we are going to unsummon is the mage's water elemental
+ if (elemental->GetEntry() == uint32(sSpellMgr->GetSpellInfo(SPELL_MAGE_SUMMON_WATER_ELEMENTAL_TEMPORARY)->Effects[EFFECT_0].MiscValue) ||
+ elemental->GetEntry() == uint32(sSpellMgr->GetSpellInfo(SPELL_MAGE_SUMMON_WATER_ELEMENTAL_PERMANENT)->Effects[EFFECT_0].MiscValue))
+ elemental->UnSummon();
+
// Glyph of Eternal Water
if (caster->HasAura(SPELL_MAGE_GLYPH_OF_ETERNAL_WATER))
caster->CastSpell(caster, SPELL_MAGE_SUMMON_WATER_ELEMENTAL_PERMANENT, true);
@@ -617,6 +1120,7 @@ class spell_mage_summon_water_elemental : public SpellScriptLoader
void Register()
{
+ // add dummy effect spell handler to Summon Water Elemental
OnEffectHit += SpellEffectFn(spell_mage_summon_water_elemental_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
}
};
@@ -627,18 +1131,83 @@ class spell_mage_summon_water_elemental : public SpellScriptLoader
}
};
+// 33395 Water Elemental's Freeze
+/// Updated 4.3.4
+class spell_mage_water_elemental_freeze : public SpellScriptLoader
+{
+ public:
+ spell_mage_water_elemental_freeze() : SpellScriptLoader("spell_mage_water_elemental_freeze") { }
+
+ class spell_mage_water_elemental_freeze_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_mage_water_elemental_freeze_SpellScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_FINGERS_OF_FROST))
+ return false;
+ return true;
+ }
+
+ void CountTargets(std::list<WorldObject*>& targetList)
+ {
+ _didHit = !targetList.empty();
+ }
+
+ void HandleImprovedFreeze()
+ {
+ if (!_didHit)
+ return;
+
+ Unit* owner = GetCaster()->GetOwner();
+ if (!owner)
+ return;
+
+ if (AuraEffect* aurEff = owner->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_MAGE, ICON_MAGE_IMPROVED_FREEZE, EFFECT_0))
+ {
+ if (roll_chance_i(aurEff->GetAmount()))
+ owner->CastCustomSpell(SPELL_MAGE_FINGERS_OF_FROST, SPELLVALUE_AURA_STACK, 2, owner, true);
+ }
+ }
+
+ void Register()
+ {
+ OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_mage_water_elemental_freeze_SpellScript::CountTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ENEMY);
+ AfterCast += SpellCastFn(spell_mage_water_elemental_freeze_SpellScript::HandleImprovedFreeze);
+ }
+
+ private:
+ bool _didHit;
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_mage_water_elemental_freeze_SpellScript();
+ }
+};
+
void AddSC_mage_spell_scripts()
{
new spell_mage_blast_wave();
+ new spell_mage_blizzard();
new spell_mage_burnout();
new spell_mage_cold_snap();
+ new spell_mage_cone_of_cold();
+ new spell_mage_conjure_refreshment();
new spell_mage_fire_frost_ward();
new spell_mage_focus_magic();
+ new spell_mage_frostbolt();
new spell_mage_ice_barrier();
new spell_mage_ignite();
new spell_mage_living_bomb();
+ new spell_mage_mage_ward();
new spell_mage_mana_shield();
new spell_mage_master_of_elements();
+ new spell_mage_nether_vortex();
new spell_mage_polymorph_cast_visual();
+ new spell_mage_replenish_mana();
+ new spell_mage_ring_of_frost();
+ new spell_mage_ring_of_frost_freeze();
new spell_mage_summon_water_elemental();
+ new spell_mage_water_elemental_freeze();
}
diff --git a/src/server/scripts/Spells/spell_paladin.cpp b/src/server/scripts/Spells/spell_paladin.cpp
index 6be2453affb..fd4e560b1b7 100644
--- a/src/server/scripts/Spells/spell_paladin.cpp
+++ b/src/server/scripts/Spells/spell_paladin.cpp
@@ -46,6 +46,7 @@ enum PaladinSpells
SPELL_PALADIN_DIVINE_STORM_DUMMY = 54171,
SPELL_PALADIN_DIVINE_STORM_HEAL = 54172,
+ SPELL_PALADIN_EYE_FOR_AN_EYE_RANK_1 = 9799,
SPELL_PALADIN_EYE_FOR_AN_EYE_DAMAGE = 25997,
SPELL_PALADIN_FORBEARANCE = 25771,
@@ -55,6 +56,8 @@ enum PaladinSpells
SPELL_PALADIN_HAND_OF_SACRIFICE = 6940,
SPELL_PALADIN_DIVINE_SACRIFICE = 64205,
+ SPELL_PALADIN_DIVINE_PURPOSE_PROC = 90174,
+
SPELL_PALADIN_GLYPH_OF_SALVATION = 63225,
SPELL_PALADIN_RIGHTEOUS_DEFENSE_TAUNT = 31790,
@@ -66,7 +69,7 @@ enum PaladinSpells
};
// 31850 - Ardent Defender
-class spell_pal_ardent_defender : public SpellScriptLoader
+/*class spell_pal_ardent_defender : public SpellScriptLoader
{
public:
spell_pal_ardent_defender() : SpellScriptLoader("spell_pal_ardent_defender") { }
@@ -89,7 +92,7 @@ class spell_pal_ardent_defender : public SpellScriptLoader
return GetUnitOwner()->GetTypeId() == TYPEID_PLAYER;
}
- void CalculateAmount(AuraEffect const* /*aurEff*/, int32 & amount, bool & /*canBeRecalculated*/)
+ void CalculateAmount(AuraEffect const* aurEff, int32 & amount, bool & canBeRecalculated)
{
// Set absorbtion amount to unlimited
amount = -1;
@@ -139,7 +142,7 @@ class spell_pal_ardent_defender : public SpellScriptLoader
{
return new spell_pal_ardent_defender_AuraScript();
}
-};
+};*/
// 37877 - Blessing of Faith
class spell_pal_blessing_of_faith : public SpellScriptLoader
@@ -454,17 +457,16 @@ class spell_pal_eye_for_an_eye : public SpellScriptLoader
return true;
}
- void OnProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ void HandleEffectProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
{
PreventDefaultAction();
- // return damage % to attacker but < 50% own total health
- int32 damage = int32(std::min(CalculatePct(eventInfo.GetDamageInfo()->GetDamage(), aurEff->GetAmount()), GetTarget()->GetMaxHealth() / 2));
+ int32 damage = CalculatePct(eventInfo.GetDamageInfo()->GetDamage(), aurEff->GetAmount());
GetTarget()->CastCustomSpell(SPELL_PALADIN_EYE_FOR_AN_EYE_DAMAGE, SPELLVALUE_BASE_POINT0, damage, eventInfo.GetProcTarget(), true, NULL, aurEff);
}
void Register()
{
- OnEffectProc += AuraEffectProcFn(spell_pal_eye_for_an_eye_AuraScript::OnProc, EFFECT_0, SPELL_AURA_DUMMY);
+ OnEffectProc += AuraEffectProcFn(spell_pal_eye_for_an_eye_AuraScript::HandleEffectProc, EFFECT_0, m_scriptSpellId == SPELL_PALADIN_EYE_FOR_AN_EYE_RANK_1 ? SPELL_AURA_DUMMY : SPELL_AURA_PROC_TRIGGER_SPELL);
}
};
@@ -807,47 +809,105 @@ class spell_pal_righteous_defense : public SpellScriptLoader
}
};
-// 58597 - Sacred Shield
+// 85285 - Sacred Shield
class spell_pal_sacred_shield : public SpellScriptLoader
{
public:
spell_pal_sacred_shield() : SpellScriptLoader("spell_pal_sacred_shield") { }
- class spell_pal_sacred_shield_AuraScript : public AuraScript
+ class spell_pal_sacred_shield_SpellScript : public SpellScript
{
- PrepareAuraScript(spell_pal_sacred_shield_AuraScript);
+ PrepareSpellScript(spell_pal_sacred_shield_SpellScript);
- void CalculateAmount(AuraEffect const* aurEff, int32& amount, bool& /*canBeRecalculated*/)
+ SpellCastResult CheckCast()
{
- if (Unit* caster = GetCaster())
- {
- // +75.00% from sp bonus
- float bonus = CalculatePct(caster->SpellBaseHealingBonusDone(GetSpellInfo()->GetSchoolMask()), 75.0f);
+ Unit* caster = GetCaster();
+ if (caster->GetTypeId() != TYPEID_PLAYER)
+ return SPELL_FAILED_DONT_REPORT;
+
+ if (!caster->HealthBelowPct(30))
+ return SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW;
+
+ return SPELL_CAST_OK;
+ }
+
+ void Register()
+ {
+ OnCheckCast += SpellCheckCastFn(spell_pal_sacred_shield_SpellScript::CheckCast);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_pal_sacred_shield_SpellScript();
+ }
+};
+
+// 85256 - Templar's Verdict
+/// Updated 4.3.4
+class spell_pal_templar_s_verdict : public SpellScriptLoader
+{
+ public:
+ spell_pal_templar_s_verdict() : SpellScriptLoader("spell_pal_templar_s_verdict") { }
+
+ class spell_pal_templar_s_verdict_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_pal_templar_s_verdict_SpellScript);
- // Divine Guardian is only applied at the spell healing bonus because it was already applied to the base value in CalculateSpellDamage
- bonus = caster->ApplyEffectModifiers(GetSpellInfo(), aurEff->GetEffIndex(), bonus);
- bonus *= caster->CalculateLevelPenalty(GetSpellInfo());
+ bool Validate (SpellInfo const* /*spellEntry*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_PALADIN_DIVINE_PURPOSE_PROC))
+ return false;
+
+ return true;
+ }
+
+ bool Load()
+ {
+ if (GetCaster()->GetTypeId() != TYPEID_PLAYER)
+ return false;
- amount += int32(bonus);
+ if (GetCaster()->ToPlayer()->getClass() != CLASS_PALADIN)
+ return false;
- // Arena - Dampening
- if (AuraEffect const* dampening = caster->GetAuraEffect(SPELL_GENERIC_ARENA_DAMPENING, EFFECT_0))
- AddPct(amount, dampening->GetAmount());
- // Battleground - Dampening
- else if (AuraEffect const* dampening = caster->GetAuraEffect(SPELL_GENERIC_BATTLEGROUND_DAMPENING, EFFECT_0))
- AddPct(amount, dampening->GetAmount());
+ return true;
+ }
+
+ void ChangeDamage(SpellEffIndex /*effIndex*/)
+ {
+ Unit* caster = GetCaster();
+ int32 damage = GetHitDamage();
+
+ if (caster->HasAura(SPELL_PALADIN_DIVINE_PURPOSE_PROC))
+ damage *= 7.5; // 7.5*30% = 225%
+ else
+ {
+ switch (caster->GetPower(POWER_HOLY_POWER))
+ {
+ case 0: // 1 Holy Power
+ damage = damage;
+ break;
+ case 1: // 2 Holy Power
+ damage *= 3; // 3*30 = 90%
+ break;
+ case 2: // 3 Holy Power
+ damage *= 7.5; // 7.5*30% = 225%
+ break;
+ }
}
+
+ SetHitDamage(damage);
}
void Register()
{
- DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_pal_sacred_shield_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB);
+ OnEffectHitTarget += SpellEffectFn(spell_pal_templar_s_verdict_SpellScript::ChangeDamage, EFFECT_0, SPELL_EFFECT_WEAPON_PERCENT_DAMAGE);
}
};
- AuraScript* GetAuraScript() const
+ SpellScript* GetSpellScript() const
{
- return new spell_pal_sacred_shield_AuraScript();
+ return new spell_pal_templar_s_verdict_SpellScript();
}
};
@@ -897,9 +957,10 @@ class spell_pal_seal_of_righteousness : public SpellScriptLoader
}
};
+
void AddSC_paladin_spell_scripts()
{
- new spell_pal_ardent_defender();
+ //new spell_pal_ardent_defender();
new spell_pal_blessing_of_faith();
new spell_pal_blessing_of_sanctuary();
new spell_pal_divine_sacrifice();
@@ -915,5 +976,6 @@ void AddSC_paladin_spell_scripts()
new spell_pal_lay_on_hands();
new spell_pal_righteous_defense();
new spell_pal_sacred_shield();
+ new spell_pal_templar_s_verdict();
new spell_pal_seal_of_righteousness();
}
diff --git a/src/server/scripts/Spells/spell_pet.cpp b/src/server/scripts/Spells/spell_pet.cpp
index f7f59bb7e03..8c337f30ec3 100644
--- a/src/server/scripts/Spells/spell_pet.cpp
+++ b/src/server/scripts/Spells/spell_pet.cpp
@@ -1347,24 +1347,6 @@ public:
return;
if (GetCaster()->GetOwner()->ToPlayer())
{
- // Pet's base damage changes depending on happiness
- if (GetCaster()->IsPet() && GetCaster()->ToPet()->IsHunterPet())
- {
- switch (GetCaster()->ToPet()->GetHappinessState())
- {
- case HAPPY:
- // 125% of normal damage
- amount += 25.0f;
- break;
- case CONTENT:
- // 100% of normal damage, nothing to modify
- break;
- case UNHAPPY:
- // 75% of normal damage
- amount += -25.0f;
- break;
- }
- }
// Cobra Reflexes
if (AuraEffect* cobraReflexes = GetCaster()->GetAuraEffectOfRankedSpell(61682, EFFECT_0))
amount -= cobraReflexes->GetAmount();
diff --git a/src/server/scripts/Spells/spell_priest.cpp b/src/server/scripts/Spells/spell_priest.cpp
index ecaa261663e..0a7eda8dddc 100644
--- a/src/server/scripts/Spells/spell_priest.cpp
+++ b/src/server/scripts/Spells/spell_priest.cpp
@@ -30,16 +30,23 @@
enum PriestSpells
{
SPELL_PRIEST_DIVINE_AEGIS = 47753,
- SPELL_PRIEST_EMPOWERED_RENEW = 63544,
+ SPELL_PRIEST_DIVINE_TOUCH = 63544,
SPELL_PRIEST_GLYPH_OF_LIGHTWELL = 55673,
SPELL_PRIEST_GLYPH_OF_PRAYER_OF_HEALING_HEAL = 56161,
+ SPELL_PRIEST_GLYPH_OF_SHADOW = 107906,
SPELL_PRIEST_GUARDIAN_SPIRIT_HEAL = 48153,
+ SPELL_PRIEST_LEAP_OF_FAITH = 73325,
+ SPELL_PRIEST_LEAP_OF_FAITH_EFFECT = 92832,
+ SPELL_PRIEST_LEAP_OF_FAITH_EFFECT_TRIGGER = 92833,
+ SPELL_PRIEST_LEAP_OF_FAITH_TRIGGERED = 92572,
SPELL_PRIEST_MANA_LEECH_PROC = 34650,
SPELL_PRIEST_PENANCE_R1 = 47540,
SPELL_PRIEST_PENANCE_R1_DAMAGE = 47758,
SPELL_PRIEST_PENANCE_R1_HEAL = 47757,
- SPELL_PRIEST_REFLECTIVE_SHIELD_TRIGGERED = 33619,
SPELL_PRIEST_REFLECTIVE_SHIELD_R1 = 33201,
+ SPELL_PRIEST_REFLECTIVE_SHIELD_TRIGGERED = 33619,
+ SPELL_PRIEST_SHADOWFORM_VISUAL_WITHOUT_GLYPH = 107903,
+ SPELL_PRIEST_SHADOWFORM_VISUAL_WITH_GLYPH = 107904,
SPELL_PRIEST_SHADOW_WORD_DEATH = 32409,
SPELL_PRIEST_T9_HEALING_2P = 67201,
SPELL_PRIEST_VAMPIRIC_TOUCH_DISPEL = 64085,
@@ -48,7 +55,7 @@ enum PriestSpells
enum PriestSpellIcons
{
PRIEST_ICON_ID_BORROWED_TIME = 2899,
- PRIEST_ICON_ID_EMPOWERED_RENEW_TALENT = 3021,
+ PRIEST_ICON_ID_DIVINE_TOUCH_TALENT = 3021,
PRIEST_ICON_ID_PAIN_AND_SUFFERING = 2874,
};
@@ -140,7 +147,7 @@ class spell_pri_glyph_of_prayer_of_healing : public SpellScriptLoader
}
};
-// -47788 - Guardian Spirit
+// 47788 - Guardian Spirit
class spell_pri_guardian_spirit : public SpellScriptLoader
{
public:
@@ -197,6 +204,46 @@ class spell_pri_guardian_spirit : public SpellScriptLoader
}
};
+// 92833 - Leap of Faith
+class spell_pri_leap_of_faith_effect_trigger : public SpellScriptLoader
+{
+ public:
+ spell_pri_leap_of_faith_effect_trigger() : SpellScriptLoader("spell_pri_leap_of_faith_effect_trigger") { }
+
+ class spell_pri_leap_of_faith_effect_trigger_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_pri_leap_of_faith_effect_trigger_SpellScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_LEAP_OF_FAITH_EFFECT))
+ return false;
+ return true;
+ }
+
+ void HandleEffectDummy(SpellEffIndex /*effIndex*/)
+ {
+ Position destPos;
+ GetHitDest()->GetPosition(&destPos);
+
+ SpellCastTargets targets;
+ targets.SetDst(destPos);
+ targets.SetUnitTarget(GetCaster());
+ GetHitUnit()->CastSpell(targets, sSpellMgr->GetSpellInfo(GetEffectValue()), NULL);
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_pri_leap_of_faith_effect_trigger_SpellScript::HandleEffectDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_pri_leap_of_faith_effect_trigger_SpellScript();
+ }
+};
+
// -7001 - Lightwell Renew
class spell_pri_lightwell_renew : public SpellScriptLoader
{
@@ -229,7 +276,7 @@ class spell_pri_lightwell_renew : public SpellScriptLoader
}
};
-// -8129 - Mana Burn
+// 8129 - Mana Burn
class spell_pri_mana_burn : public SpellScriptLoader
{
public:
@@ -308,7 +355,7 @@ class spell_pri_mana_leech : public SpellScriptLoader
}
};
-// -49821 - Mind Sear
+// 49821 - Mind Sear
class spell_pri_mind_sear : public SpellScriptLoader
{
public:
@@ -365,7 +412,7 @@ class spell_pri_pain_and_suffering_proc : public SpellScriptLoader
}
};
-// -47540 - Penance
+// 47540 - Penance
class spell_pri_penance : public SpellScriptLoader
{
public:
@@ -547,7 +594,50 @@ class spell_pri_prayer_of_mending_heal : public SpellScriptLoader
}
};
-// -139 - Renew
+// 17 - Reflective Shield
+class spell_pri_reflective_shield_trigger : public SpellScriptLoader
+{
+ public:
+ spell_pri_reflective_shield_trigger() : SpellScriptLoader("spell_pri_reflective_shield_trigger") { }
+
+ class spell_pri_reflective_shield_trigger_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_pri_reflective_shield_trigger_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_REFLECTIVE_SHIELD_TRIGGERED) || !sSpellMgr->GetSpellInfo(SPELL_PRIEST_REFLECTIVE_SHIELD_R1))
+ return false;
+ return true;
+ }
+
+ void Trigger(AuraEffect* aurEff, DamageInfo & dmgInfo, uint32 & absorbAmount)
+ {
+ Unit* target = GetTarget();
+ if (dmgInfo.GetAttacker() == target)
+ return;
+
+ if (GetCaster())
+ if (AuraEffect* talentAurEff = target->GetAuraEffectOfRankedSpell(SPELL_PRIEST_REFLECTIVE_SHIELD_R1, EFFECT_0))
+ {
+ int32 bp = CalculatePct(absorbAmount, talentAurEff->GetAmount());
+ target->CastCustomSpell(dmgInfo.GetAttacker(), SPELL_PRIEST_REFLECTIVE_SHIELD_TRIGGERED, &bp, NULL, NULL, true, NULL, aurEff);
+ }
+ }
+
+ void Register()
+ {
+ AfterEffectAbsorb += AuraEffectAbsorbFn(spell_pri_reflective_shield_trigger_AuraScript::Trigger, EFFECT_0);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_pri_reflective_shield_trigger_AuraScript();
+ }
+};
+
+// 139 - Renew
class spell_pri_renew : public SpellScriptLoader
{
public:
@@ -557,6 +647,13 @@ class spell_pri_renew : public SpellScriptLoader
{
PrepareAuraScript(spell_pri_renew_AuraScript);
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_DIVINE_TOUCH))
+ return false;
+ return true;
+ }
+
bool Load()
{
return GetCaster() && GetCaster()->GetTypeId() == TYPEID_PLAYER;
@@ -566,14 +663,13 @@ class spell_pri_renew : public SpellScriptLoader
{
if (Unit* caster = GetCaster())
{
- // Empowered Renew
- if (AuraEffect const* empoweredRenewAurEff = caster->GetDummyAuraEffect(SPELLFAMILY_PRIEST, PRIEST_ICON_ID_EMPOWERED_RENEW_TALENT, EFFECT_1))
+ // Divine Touch
+ if (AuraEffect const* empoweredRenewAurEff = caster->GetDummyAuraEffect(SPELLFAMILY_PRIEST, PRIEST_ICON_ID_DIVINE_TOUCH_TALENT, EFFECT_0))
{
- uint32 heal = caster->SpellHealingBonusDone(GetTarget(), GetSpellInfo(), GetEffect(EFFECT_0)->GetAmount(), DOT);
+ uint32 heal = caster->SpellHealingBonusDone(GetTarget(), GetSpellInfo(), aurEff->GetAmount(), DOT);
heal = GetTarget()->SpellHealingBonusTaken(caster, GetSpellInfo(), heal, DOT);
-
- int32 basepoints0 = empoweredRenewAurEff->GetAmount() * GetEffect(EFFECT_0)->GetTotalTicks() * int32(heal) / 100;
- caster->CastCustomSpell(GetTarget(), SPELL_PRIEST_EMPOWERED_RENEW, &basepoints0, NULL, NULL, true, NULL, aurEff);
+ int32 basepoints0 = CalculatePct(int32(heal) * aurEff->GetTotalTicks(), empoweredRenewAurEff->GetAmount());
+ caster->CastCustomSpell(GetTarget(), SPELL_PRIEST_DIVINE_TOUCH, &basepoints0, NULL, NULL, true, NULL, aurEff);
}
}
}
@@ -590,7 +686,7 @@ class spell_pri_renew : public SpellScriptLoader
}
};
-// -32379 - Shadow Word Death
+// 32379 - Shadow Word Death
class spell_pri_shadow_word_death : public SpellScriptLoader
{
public:
@@ -623,7 +719,48 @@ class spell_pri_shadow_word_death : public SpellScriptLoader
}
};
-// -34914 - Vampiric Touch
+// 15473 - Shadowform
+class spell_pri_shadowform : public SpellScriptLoader
+{
+ public:
+ spell_pri_shadowform() : SpellScriptLoader("spell_pri_shadowform") { }
+
+ class spell_pri_shadowform_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_pri_shadowform_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_SHADOWFORM_VISUAL_WITHOUT_GLYPH) ||
+ !sSpellMgr->GetSpellInfo(SPELL_PRIEST_SHADOWFORM_VISUAL_WITH_GLYPH))
+ return false;
+ return true;
+ }
+
+ void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ {
+ GetTarget()->CastSpell(GetTarget(), GetTarget()->HasAura(SPELL_PRIEST_GLYPH_OF_SHADOW) ? SPELL_PRIEST_SHADOWFORM_VISUAL_WITH_GLYPH : SPELL_PRIEST_SHADOWFORM_VISUAL_WITHOUT_GLYPH, true);
+ }
+
+ void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ {
+ GetTarget()->RemoveAurasDueToSpell(GetTarget()->HasAura(SPELL_PRIEST_GLYPH_OF_SHADOW) ? SPELL_PRIEST_SHADOWFORM_VISUAL_WITH_GLYPH : SPELL_PRIEST_SHADOWFORM_VISUAL_WITHOUT_GLYPH);
+ }
+
+ void Register()
+ {
+ AfterEffectApply += AuraEffectApplyFn(spell_pri_shadowform_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_MOD_SHAPESHIFT, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK);
+ AfterEffectRemove += AuraEffectRemoveFn(spell_pri_shadowform_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_MOD_SHAPESHIFT, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_pri_shadowform_AuraScript();
+ }
+};
+
+// 34914 - Vampiric Touch
class spell_pri_vampiric_touch : public SpellScriptLoader
{
public:
@@ -633,7 +770,7 @@ class spell_pri_vampiric_touch : public SpellScriptLoader
{
PrepareAuraScript(spell_pri_vampiric_touch_AuraScript);
- bool Validate(SpellInfo const* /*spell*/)
+ bool Validate(SpellInfo const* /*spellInfo*/)
{
if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_VAMPIRIC_TOUCH_DISPEL))
return false;
@@ -669,6 +806,7 @@ void AddSC_priest_spell_scripts()
new spell_pri_divine_aegis();
new spell_pri_glyph_of_prayer_of_healing();
new spell_pri_guardian_spirit();
+ new spell_pri_leap_of_faith_effect_trigger();
new spell_pri_lightwell_renew();
new spell_pri_mana_burn();
new spell_pri_mana_leech();
@@ -677,7 +815,9 @@ void AddSC_priest_spell_scripts()
new spell_pri_penance();
new spell_pri_power_word_shield();
new spell_pri_prayer_of_mending_heal();
+ new spell_pri_reflective_shield_trigger();
new spell_pri_renew();
new spell_pri_shadow_word_death();
+ new spell_pri_shadowform();
new spell_pri_vampiric_touch();
}
diff --git a/src/server/scripts/Spells/spell_rogue.cpp b/src/server/scripts/Spells/spell_rogue.cpp
index 541bed71637..12a5afb1683 100644
--- a/src/server/scripts/Spells/spell_rogue.cpp
+++ b/src/server/scripts/Spells/spell_rogue.cpp
@@ -37,6 +37,11 @@ enum RogueSpells
SPELL_ROGUE_TRICKS_OF_THE_TRADE_PROC = 59628,
};
+enum RogueSpellIcons
+{
+ ICON_ROGUE_IMPROVED_RECUPERATE = 4819
+};
+
// 13877, 33735, (check 51211, 65956) - Blade Flurry
class spell_rog_blade_flurry : public SpellScriptLoader
{
@@ -92,7 +97,7 @@ class spell_rog_blade_flurry : public SpellScriptLoader
}
};
-// -31228 - Cheat Death
+// 31228 - Cheat Death
class spell_rog_cheat_death : public SpellScriptLoader
{
public:
@@ -155,7 +160,7 @@ class spell_rog_cheat_death : public SpellScriptLoader
}
};
-// -2818 - Deadly Poison
+// 2818 - Deadly Poison
class spell_rog_deadly_poison : public SpellScriptLoader
{
public:
@@ -201,6 +206,9 @@ class spell_rog_deadly_poison : public SpellScriptLoader
// item combat enchantments
for (uint8 slot = 0; slot < MAX_ENCHANTMENT_SLOT; ++slot)
{
+ if (slot > PRISMATIC_ENCHANTMENT_SLOT || slot < PROP_ENCHANTMENT_SLOT_0) // not holding enchantment id
+ continue;
+
SpellItemEnchantmentEntry const* enchant = sSpellItemEnchantmentStore.LookupEntry(item->GetEnchantmentId(EnchantmentSlot(slot)));
if (!enchant)
continue;
@@ -249,7 +257,7 @@ class spell_rog_deadly_poison : public SpellScriptLoader
}
};
-// -31130 - Nerves of Steel
+// 31130 - Nerves of Steel
class spell_rog_nerves_of_steel : public SpellScriptLoader
{
public:
@@ -319,7 +327,7 @@ class spell_rog_preparation : public SpellScriptLoader
{
Player* caster = GetCaster()->ToPlayer();
- //immediately finishes the cooldown on certain Rogue abilities
+ // immediately finishes the cooldown on certain Rogue abilities
const SpellCooldowns& cm = caster->GetSpellCooldownMap();
for (SpellCooldowns::const_iterator itr = cm.begin(); itr != cm.end();)
{
@@ -327,13 +335,13 @@ class spell_rog_preparation : public SpellScriptLoader
if (spellInfo->SpellFamilyName == SPELLFAMILY_ROGUE)
{
- if (spellInfo->SpellFamilyFlags[1] & SPELLFAMILYFLAG1_ROGUE_COLDB_SHADOWSTEP || // Cold Blood, Shadowstep
- spellInfo->SpellFamilyFlags[0] & SPELLFAMILYFLAG_ROGUE_VAN_EVAS_SPRINT) // Vanish, Evasion, Sprint
+ if (spellInfo->SpellFamilyFlags[1] & SPELLFAMILYFLAG1_ROGUE_COLDB_SHADOWSTEP || // Cold Blood, Shadowstep
+ spellInfo->SpellFamilyFlags[0] & SPELLFAMILYFLAG_ROGUE_VAN_EVAS_SPRINT) // Vanish, Evasion, Sprint
caster->RemoveSpellCooldown((itr++)->first, true);
else if (caster->HasAura(SPELL_ROGUE_GLYPH_OF_PREPARATION))
{
- if (spellInfo->SpellFamilyFlags[1] & SPELLFAMILYFLAG1_ROGUE_DISMANTLE || // Dismantle
- spellInfo->SpellFamilyFlags[0] & SPELLFAMILYFLAG_ROGUE_KICK || // Kick
+ if (spellInfo->SpellFamilyFlags[1] & SPELLFAMILYFLAG1_ROGUE_DISMANTLE || // Dismantle
+ spellInfo->SpellFamilyFlags[0] & SPELLFAMILYFLAG_ROGUE_KICK || // Kick
(spellInfo->SpellFamilyFlags[0] & SPELLFAMILYFLAG_ROGUE_BLADE_FLURRY && // Blade Flurry
spellInfo->SpellFamilyFlags[1] & SPELLFAMILYFLAG1_ROGUE_BLADE_FLURRY))
caster->RemoveSpellCooldown((itr++)->first, true);
@@ -360,7 +368,7 @@ class spell_rog_preparation : public SpellScriptLoader
}
};
-// -51685 - Prey on the Weak
+// 51685 - Prey on the Weak
class spell_rog_prey_on_the_weak : public SpellScriptLoader
{
public:
@@ -405,6 +413,55 @@ class spell_rog_prey_on_the_weak : public SpellScriptLoader
}
};
+// 73651 - Recuperate
+class spell_rog_recuperate : public SpellScriptLoader
+{
+ public:
+ spell_rog_recuperate() : SpellScriptLoader("spell_rog_recuperate") { }
+
+ class spell_rog_recuperate_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_rog_recuperate_AuraScript);
+
+ bool Load()
+ {
+ return GetCaster()->GetTypeId() == TYPEID_PLAYER;
+ }
+
+ void OnPeriodic(AuraEffect const* /*aurEff*/)
+ {
+ if (Unit* caster = GetCaster())
+ if (AuraEffect* effect = GetAura()->GetEffect(EFFECT_0))
+ effect->RecalculateAmount(caster);
+ }
+
+ void CalculateBonus(AuraEffect const* /*aurEff*/, int32& amount, bool& canBeRecalculated)
+ {
+ canBeRecalculated = false;
+ if (Unit* caster = GetCaster())
+ {
+ int32 baseAmount = GetSpellInfo()->Effects[EFFECT_0].CalcValue(caster) * 1000;
+ // Improved Recuperate
+ if (AuraEffect const* auraEffect = caster->GetDummyAuraEffect(SPELLFAMILY_ROGUE, ICON_ROGUE_IMPROVED_RECUPERATE, EFFECT_0))
+ baseAmount += auraEffect->GetAmount();
+
+ amount = CalculatePct(caster->GetMaxHealth(), float(baseAmount) / 1000.0f);
+ }
+ }
+
+ void Register()
+ {
+ OnEffectPeriodic += AuraEffectPeriodicFn(spell_rog_recuperate_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_HEAL);
+ DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_rog_recuperate_AuraScript::CalculateBonus, EFFECT_0, SPELL_AURA_PERIODIC_HEAL);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_rog_recuperate_AuraScript();
+ }
+};
+
// -1943 - Rupture
class spell_rog_rupture : public SpellScriptLoader
{
@@ -597,6 +654,7 @@ void AddSC_rogue_spell_scripts()
new spell_rog_nerves_of_steel();
new spell_rog_preparation();
new spell_rog_prey_on_the_weak();
+ new spell_rog_recuperate();
new spell_rog_rupture();
new spell_rog_shiv();
new spell_rog_tricks_of_the_trade();
diff --git a/src/server/scripts/Spells/spell_shaman.cpp b/src/server/scripts/Spells/spell_shaman.cpp
index 2cb1b49f245..e036a476cbd 100644
--- a/src/server/scripts/Spells/spell_shaman.cpp
+++ b/src/server/scripts/Spells/spell_shaman.cpp
@@ -30,36 +30,43 @@
enum ShamanSpells
{
+ SPELL_HUNTER_INSANITY = 95809,
+ SPELL_MAGE_TEMPORAL_DISPLACEMENT = 80354,
SPELL_SHAMAN_ANCESTRAL_AWAKENING_PROC = 52752,
SPELL_SHAMAN_BIND_SIGHT = 6277,
- SPELL_SHAMAN_CLEANSING_TOTEM_EFFECT = 52025,
SPELL_SHAMAN_EARTH_SHIELD_HEAL = 379,
+ SPELL_SHAMAN_ELEMENTAL_MASTERY = 16166,
SPELL_SHAMAN_EXHAUSTION = 57723,
- SPELL_SHAMAN_FIRE_NOVA_R1 = 1535,
SPELL_SHAMAN_FIRE_NOVA_TRIGGERED_R1 = 8349,
+ SPELL_SHAMAN_FLAME_SHOCK = 8050,
+ SPELL_SHAMAN_FOCUSED_INSIGHT = 77800,
SPELL_SHAMAN_GLYPH_OF_EARTH_SHIELD = 63279,
SPELL_SHAMAN_GLYPH_OF_HEALING_STREAM_TOTEM = 55456,
SPELL_SHAMAN_GLYPH_OF_MANA_TIDE = 55441,
SPELL_SHAMAN_GLYPH_OF_THUNDERSTORM = 62132,
+ SPELL_SHAMAN_LAVA_BURST = 51505,
SPELL_SHAMAN_LAVA_FLOWS_R1 = 51480,
- SPELL_SHAMAN_LAVA_FLOWS_TRIGGERED_R1 = 64694,
- SPELL_SHAMAN_MANA_SPRING_TOTEM_ENERGIZE = 52032,
- SPELL_SHAMAN_MANA_TIDE_TOTEM = 39609,
+ SPELL_SHAMAN_LAVA_FLOWS_TRIGGERED_R1 = 65264,
+ SPELL_SHAMAN_LAVA_SURGE = 77762,
+ SPELL_SHAMAN_LIGHTNING_SHIELD = 324,
SPELL_SHAMAN_SATED = 57724,
SPELL_SHAMAN_STORM_EARTH_AND_FIRE = 51483,
+ SPELL_SHAMAN_TELLURIC_CURRENTS = 82987,
SPELL_SHAMAN_TOTEM_EARTHBIND_EARTHGRAB = 64695,
SPELL_SHAMAN_TOTEM_EARTHBIND_TOTEM = 6474,
SPELL_SHAMAN_TOTEM_EARTHEN_POWER = 59566,
- SPELL_SHAMAN_TOTEM_HEALING_STREAM_HEAL = 52042
+ SPELL_SHAMAN_TOTEM_HEALING_STREAM_HEAL = 52042,
+ SPELL_SHAMAN_TIDAL_WAVES = 53390
};
enum ShamanSpellIcons
{
- SHAMAN_ICON_ID_RESTORATIVE_TOTEMS = 338,
- SHAMAN_ICON_ID_SHAMAN_LAVA_FLOW = 3087
+ SHAMAN_ICON_ID_SOOTHING_RAIN = 2011,
+ SHAMAN_ICON_ID_SHAMAN_LAVA_FLOW = 3087
};
-// 52759 - Ancestral Awakening (Proc)
+// 52759 - Ancestral Awakening
+/// Updated 4.3.4
class spell_sha_ancestral_awakening_proc : public SpellScriptLoader
{
public:
@@ -79,7 +86,7 @@ class spell_sha_ancestral_awakening_proc : public SpellScriptLoader
void HandleDummy(SpellEffIndex /*effIndex*/)
{
int32 damage = GetEffectValue();
- if (GetHitUnit())
+ if (GetCaster() && GetHitUnit())
GetCaster()->CastCustomSpell(GetHitUnit(), SPELL_SHAMAN_ANCESTRAL_AWAKENING_PROC, &damage, NULL, NULL, true);
}
@@ -95,51 +102,8 @@ class spell_sha_ancestral_awakening_proc : public SpellScriptLoader
}
};
-// 51474 - Astral Shift
-class spell_sha_astral_shift : public SpellScriptLoader
-{
- public:
- spell_sha_astral_shift() : SpellScriptLoader("spell_sha_astral_shift") { }
-
- class spell_sha_astral_shift_AuraScript : public AuraScript
- {
- PrepareAuraScript(spell_sha_astral_shift_AuraScript);
-
- uint32 absorbPct;
-
- bool Load()
- {
- absorbPct = GetSpellInfo()->Effects[EFFECT_0].CalcValue(GetCaster());
- return true;
- }
-
- void CalculateAmount(AuraEffect const* /*aurEff*/, int32 & amount, bool & /*canBeRecalculated*/)
- {
- // Set absorbtion amount to unlimited
- amount = -1;
- }
-
- void Absorb(AuraEffect* /*aurEff*/, DamageInfo & dmgInfo, uint32 & absorbAmount)
- {
- // reduces all damage taken while stun, fear or silence
- if (GetTarget()->GetUInt32Value(UNIT_FIELD_FLAGS) & (UNIT_FLAG_FLEEING | UNIT_FLAG_SILENCED) || (GetTarget()->GetUInt32Value(UNIT_FIELD_FLAGS) & (UNIT_FLAG_STUNNED) && GetTarget()->HasAuraWithMechanic(1<<MECHANIC_STUN)))
- absorbAmount = CalculatePct(dmgInfo.GetDamage(), absorbPct);
- }
-
- void Register()
- {
- DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_sha_astral_shift_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB);
- OnEffectAbsorb += AuraEffectAbsorbFn(spell_sha_astral_shift_AuraScript::Absorb, EFFECT_0);
- }
- };
-
- AuraScript* GetAuraScript() const
- {
- return new spell_sha_astral_shift_AuraScript();
- }
-};
-
// 2825 - Bloodlust
+/// Updated 4.3.4
class spell_sha_bloodlust : public SpellScriptLoader
{
public:
@@ -159,6 +123,8 @@ class spell_sha_bloodlust : public SpellScriptLoader
void RemoveInvalidTargets(std::list<WorldObject*>& targets)
{
targets.remove_if(Trinity::UnitAuraCheck(true, SPELL_SHAMAN_SATED));
+ targets.remove_if(Trinity::UnitAuraCheck(true, SPELL_HUNTER_INSANITY));
+ targets.remove_if(Trinity::UnitAuraCheck(true, SPELL_MAGE_TEMPORAL_DISPLACEMENT));
}
void ApplyDebuff()
@@ -182,7 +148,8 @@ class spell_sha_bloodlust : public SpellScriptLoader
}
};
-// -1064 - Chain Heal
+// 1064 - Chain Heal
+/// Updated 4.3.4
class spell_sha_chain_heal : public SpellScriptLoader
{
public:
@@ -196,6 +163,7 @@ class spell_sha_chain_heal : public SpellScriptLoader
{
firstHeal = true;
riptide = false;
+ amount = 0;
return true;
}
@@ -207,6 +175,7 @@ class spell_sha_chain_heal : public SpellScriptLoader
if (AuraEffect* aurEff = GetHitUnit()->GetAuraEffect(SPELL_AURA_PERIODIC_HEAL, SPELLFAMILY_SHAMAN, 0, 0, 0x10, GetCaster()->GetGUID()))
{
riptide = true;
+ amount = aurEff->GetSpellInfo()->Effects[EFFECT_2].CalcValue();
// Consume it
GetHitUnit()->RemoveAura(aurEff->GetBase());
}
@@ -214,7 +183,10 @@ class spell_sha_chain_heal : public SpellScriptLoader
}
// Riptide increases the Chain Heal effect by 25%
if (riptide)
- SetHitHeal(GetHitHeal() * 1.25f);
+ {
+ uint32 bonus = CalculatePct(GetHitHeal(), amount);
+ SetHitHeal(GetHitHeal() + bonus);
+ }
}
void Register()
@@ -224,6 +196,7 @@ class spell_sha_chain_heal : public SpellScriptLoader
bool firstHeal;
bool riptide;
+ uint32 amount;
};
SpellScript* GetSpellScript() const
@@ -232,42 +205,6 @@ class spell_sha_chain_heal : public SpellScriptLoader
}
};
-// 8171 - Cleansing Totem (Pulse)
-class spell_sha_cleansing_totem_pulse : public SpellScriptLoader
-{
- public:
- spell_sha_cleansing_totem_pulse() : SpellScriptLoader("spell_sha_cleansing_totem_pulse") { }
-
- class spell_sha_cleansing_totem_pulse_SpellScript : public SpellScript
- {
- PrepareSpellScript(spell_sha_cleansing_totem_pulse_SpellScript);
-
- bool Validate(SpellInfo const* /*spellInfo*/)
- {
- if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_CLEANSING_TOTEM_EFFECT))
- return false;
- return true;
- }
-
- void HandleDummy(SpellEffIndex /*effIndex*/)
- {
- int32 bp = 1;
- if (GetCaster() && GetHitUnit() && GetOriginalCaster())
- GetCaster()->CastCustomSpell(GetHitUnit(), SPELL_SHAMAN_CLEANSING_TOTEM_EFFECT, NULL, &bp, NULL, true, NULL, NULL, GetOriginalCaster()->GetGUID());
- }
-
- void Register()
- {
- OnEffectHitTarget += SpellEffectFn(spell_sha_cleansing_totem_pulse_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
- }
- };
-
- SpellScript* GetSpellScript() const
- {
- return new spell_sha_cleansing_totem_pulse_SpellScript();
- }
-};
-
// -974 - Earth Shield
class spell_sha_earth_shield : public SpellScriptLoader
{
@@ -330,7 +267,8 @@ class spell_sha_earth_shield : public SpellScriptLoader
}
};
-// 6474 - Earthbind Totem - Fix Talent: Earthen Power
+// 6474 - Earthbind Totem - Fix Talent:Earthen Power, Earth's Grasp
+/// Updated 4.3.4
class spell_sha_earthbind_totem : public SpellScriptLoader
{
public:
@@ -364,7 +302,7 @@ class spell_sha_earthbind_totem : public SpellScriptLoader
Player* owner = GetCaster()->GetCharmerOrOwnerPlayerOrPlayerItself();
if (!owner)
return;
- // Storm, Earth and Fire
+ // Earth's Grasp
if (AuraEffect* aurEff = owner->GetAuraEffectOfRankedSpell(SPELL_SHAMAN_STORM_EARTH_AND_FIRE, EFFECT_1))
{
if (roll_chance_i(aurEff->GetAmount()))
@@ -429,56 +367,68 @@ class spell_sha_earthen_power : public SpellScriptLoader
}
};
-// -1535 - Fire Nova
-class spell_sha_fire_nova : public SpellScriptLoader
+// 86185 Feedback
+class spell_sha_feedback : public SpellScriptLoader
{
public:
- spell_sha_fire_nova() : SpellScriptLoader("spell_sha_fire_nova") { }
+ spell_sha_feedback() : SpellScriptLoader("spell_sha_feedback") { }
- class spell_sha_fire_nova_SpellScript : public SpellScript
+ class spell_sha_feedback_AuraScript : public AuraScript
{
- PrepareSpellScript(spell_sha_fire_nova_SpellScript);
+ PrepareAuraScript(spell_sha_feedback_AuraScript);
- bool Validate(SpellInfo const* spellInfo)
+ bool Validate(SpellInfo const* /*spellInfo*/)
{
- if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_FIRE_NOVA_R1) || sSpellMgr->GetFirstSpellInChain(SPELL_SHAMAN_FIRE_NOVA_R1) != sSpellMgr->GetFirstSpellInChain(spellInfo->Id))
- return false;
-
- uint8 rank = sSpellMgr->GetSpellRank(spellInfo->Id);
- if (!sSpellMgr->GetSpellWithRank(SPELL_SHAMAN_FIRE_NOVA_TRIGGERED_R1, rank, true))
+ if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_ELEMENTAL_MASTERY))
return false;
return true;
}
- SpellCastResult CheckFireTotem()
+ void HandleEffectProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/)
{
- // fire totem
- if (!GetCaster()->m_SummonSlot[1])
- {
- SetCustomCastResultMessage(SPELL_CUSTOM_ERROR_MUST_HAVE_FIRE_TOTEM);
- return SPELL_FAILED_CUSTOM_ERROR;
- }
+ PreventDefaultAction(); // will prevent default effect execution
+ if (Player* target = GetTarget()->ToPlayer())
+ target->ModifySpellCooldown(SPELL_SHAMAN_ELEMENTAL_MASTERY, aurEff->GetBaseAmount());
+ }
- return SPELL_CAST_OK;
+ void Register()
+ {
+ OnEffectProc += AuraEffectProcFn(spell_sha_feedback_AuraScript::HandleEffectProc, EFFECT_0, SPELL_AURA_DUMMY);
}
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_sha_feedback_AuraScript();
+ }
+};
+
+// 1535 Fire Nova
+/// Updated 4.3.4
+class spell_sha_fire_nova : public SpellScriptLoader
+{
+ public:
+ spell_sha_fire_nova() : SpellScriptLoader("spell_sha_fire_nova") { }
+
+ class spell_sha_fire_nova_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_sha_fire_nova_SpellScript);
void HandleDummy(SpellEffIndex /*effIndex*/)
{
- if (Unit* caster = GetCaster())
+ Unit* caster = GetCaster();
+ if (Unit* target = GetHitUnit())
{
- uint8 rank = sSpellMgr->GetSpellRank(GetSpellInfo()->Id);
- if (uint32 spellId = sSpellMgr->GetSpellWithRank(SPELL_SHAMAN_FIRE_NOVA_TRIGGERED_R1, rank))
+ if (target->HasAura(SPELL_SHAMAN_FLAME_SHOCK))
{
- Creature* totem = caster->GetMap()->GetCreature(caster->m_SummonSlot[1]);
- if (totem && totem->IsTotem())
- caster->CastSpell(totem, spellId, true);
+ caster->CastSpell(target, SPELL_SHAMAN_FIRE_NOVA_TRIGGERED_R1, true);
+ target->RemoveAurasDueToSpell(SPELL_SHAMAN_FLAME_SHOCK);
}
}
}
void Register()
{
- OnCheckCast += SpellCheckCastFn(spell_sha_fire_nova_SpellScript::CheckFireTotem);
OnEffectHitTarget += SpellEffectFn(spell_sha_fire_nova_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
}
};
@@ -489,7 +439,8 @@ class spell_sha_fire_nova : public SpellScriptLoader
}
};
-// -8050 - Flame Shock
+// 8050 -Flame Shock
+/// Updated 4.3.4
class spell_sha_flame_shock : public SpellScriptLoader
{
public:
@@ -511,15 +462,17 @@ class spell_sha_flame_shock : public SpellScriptLoader
void HandleDispel(DispelInfo* /*dispelInfo*/)
{
if (Unit* caster = GetCaster())
+ {
// Lava Flows
if (AuraEffect const* aurEff = caster->GetDummyAuraEffect(SPELLFAMILY_SHAMAN, SHAMAN_ICON_ID_SHAMAN_LAVA_FLOW, EFFECT_0))
{
if (sSpellMgr->GetFirstSpellInChain(SPELL_SHAMAN_LAVA_FLOWS_R1) != sSpellMgr->GetFirstSpellInChain(aurEff->GetId()))
return;
- uint8 rank = sSpellMgr->GetSpellRank(aurEff->GetId());
- caster->CastSpell(caster, sSpellMgr->GetSpellWithRank(SPELL_SHAMAN_LAVA_FLOWS_TRIGGERED_R1, rank), true);
+ int32 basepoints = aurEff->GetAmount();
+ caster->CastCustomSpell(caster, SPELL_SHAMAN_LAVA_FLOWS_TRIGGERED_R1, &basepoints, NULL, NULL, true);
}
+ }
}
void Register()
@@ -534,7 +487,46 @@ class spell_sha_flame_shock : public SpellScriptLoader
}
};
-// 52041, 52046, 52047, 52048, 52049, 52050, 58759, 58760, 58761 - Healing Stream Totem
+// 77794 - Focused Insight
+class spell_sha_focused_insight : public SpellScriptLoader
+{
+ public:
+ spell_sha_focused_insight() : SpellScriptLoader("spell_sha_focused_insight") { }
+
+ class spell_sha_focused_insight_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_sha_focused_insight_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_FOCUSED_INSIGHT))
+ return false;
+ return true;
+ }
+
+ void HandleEffectProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/)
+ {
+ PreventDefaultAction();
+ int32 basePoints0 = aurEff->GetAmount();
+ int32 basePoints1 = aurEff->GetSpellInfo()->Effects[EFFECT_1].CalcValue();
+
+ GetTarget()->CastCustomSpell(GetTarget(), SPELL_SHAMAN_FOCUSED_INSIGHT, &basePoints0, &basePoints1, &basePoints1, true, NULL, aurEff);
+ }
+
+ void Register()
+ {
+ OnEffectProc += AuraEffectProcFn(spell_sha_focused_insight_AuraScript::HandleEffectProc, EFFECT_0, SPELL_AURA_DUMMY);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_sha_focused_insight_AuraScript();
+ }
+};
+
+// 52041 - Healing Stream Totem
+/// Updated 4.3.4
class spell_sha_healing_stream_totem : public SpellScriptLoader
{
public:
@@ -546,12 +538,10 @@ class spell_sha_healing_stream_totem : public SpellScriptLoader
bool Validate(SpellInfo const* /*spellInfo*/)
{
- if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_GLYPH_OF_HEALING_STREAM_TOTEM) || !sSpellMgr->GetSpellInfo(SPELL_SHAMAN_TOTEM_HEALING_STREAM_HEAL))
- return false;
- return true;
+ return sSpellMgr->GetSpellInfo(SPELL_SHAMAN_TOTEM_HEALING_STREAM_HEAL);
}
- void HandleDummy(SpellEffIndex /*effIndex*/)
+ void HandleDummy(SpellEffIndex /* effIndex */)
{
int32 damage = GetEffectValue();
SpellInfo const* triggeringSpell = GetTriggeringSpell();
@@ -563,14 +553,10 @@ class spell_sha_healing_stream_totem : public SpellScriptLoader
if (triggeringSpell)
damage = int32(owner->SpellHealingBonusDone(target, triggeringSpell, damage, HEAL));
- // Restorative Totems
- if (AuraEffect* dummy = owner->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_SHAMAN, SHAMAN_ICON_ID_RESTORATIVE_TOTEMS, 1))
+ // Soothing Rains
+ if (AuraEffect* dummy = owner->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_SHAMAN, SHAMAN_ICON_ID_SOOTHING_RAIN, EFFECT_0))
AddPct(damage, dummy->GetAmount());
- // Glyph of Healing Stream Totem
- if (AuraEffect const* aurEff = owner->GetAuraEffect(SPELL_SHAMAN_GLYPH_OF_HEALING_STREAM_TOTEM, EFFECT_0))
- AddPct(damage, aurEff->GetAmount());
-
damage = int32(target->SpellHealingBonusTaken(owner, triggeringSpell, damage, HEAL));
}
caster->CastCustomSpell(target, SPELL_SHAMAN_TOTEM_HEALING_STREAM_HEAL, &damage, 0, 0, true, 0, 0, GetOriginalCaster()->GetGUID());
@@ -590,6 +576,7 @@ class spell_sha_healing_stream_totem : public SpellScriptLoader
};
// 32182 - Heroism
+/// Updated 4.3.4
class spell_sha_heroism : public SpellScriptLoader
{
public:
@@ -609,6 +596,8 @@ class spell_sha_heroism : public SpellScriptLoader
void RemoveInvalidTargets(std::list<WorldObject*>& targets)
{
targets.remove_if(Trinity::UnitAuraCheck(true, SPELL_SHAMAN_EXHAUSTION));
+ targets.remove_if(Trinity::UnitAuraCheck(true, SPELL_HUNTER_INSANITY));
+ targets.remove_if(Trinity::UnitAuraCheck(true, SPELL_MAGE_TEMPORAL_DISPLACEMENT));
}
void ApplyDebuff()
@@ -633,6 +622,7 @@ class spell_sha_heroism : public SpellScriptLoader
};
// 60103 - Lava Lash
+/// Updated 4.3.4
class spell_sha_lava_lash : public SpellScriptLoader
{
public:
@@ -676,139 +666,186 @@ class spell_sha_lava_lash : public SpellScriptLoader
}
};
-// 52031, 52033, 52034, 52035, 52036, 58778, 58779, 58780 - Mana Spring Totem
-class spell_sha_mana_spring_totem : public SpellScriptLoader
+class spell_sha_lava_surge : public SpellScriptLoader
{
public:
- spell_sha_mana_spring_totem() : SpellScriptLoader("spell_sha_mana_spring_totem") { }
+ spell_sha_lava_surge() : SpellScriptLoader("spell_sha_lava_surge") { }
- class spell_sha_mana_spring_totem_SpellScript : public SpellScript
+ class spell_sha_lava_surge_AuraScript : public AuraScript
{
- PrepareSpellScript(spell_sha_mana_spring_totem_SpellScript);
+ PrepareAuraScript(spell_sha_lava_surge_AuraScript);
bool Validate(SpellInfo const* /*spellInfo*/)
{
- if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_MANA_SPRING_TOTEM_ENERGIZE))
+ if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_LAVA_SURGE))
return false;
return true;
}
+ void HandleEffectProc(AuraEffect const* /*aurEff*/, ProcEventInfo& /*eventInfo*/)
+ {
+ PreventDefaultAction();
+ GetTarget()->CastSpell(GetTarget(), SPELL_SHAMAN_LAVA_SURGE, true);
+ }
+
+ void Register()
+ {
+ OnEffectProc += AuraEffectProcFn(spell_sha_lava_surge_AuraScript::HandleEffectProc, EFFECT_0, SPELL_AURA_DUMMY);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_sha_lava_surge_AuraScript();
+ }
+};
+
+class spell_sha_lava_surge_proc : public SpellScriptLoader
+{
+ public:
+ spell_sha_lava_surge_proc() : SpellScriptLoader("spell_sha_lava_surge_proc") { }
+
+ class spell_sha_lava_surge_proc_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_sha_lava_surge_proc_SpellScript)
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_LAVA_BURST))
+ return false;
+ return true;
+ }
+
+ bool Load()
+ {
+ return GetCaster()->GetTypeId() == TYPEID_PLAYER;
+ }
+
void HandleDummy(SpellEffIndex /*effIndex*/)
{
- int32 damage = GetEffectValue();
- if (Unit* target = GetHitUnit())
- if (Unit* caster = GetCaster())
- if (target->getPowerType() == POWER_MANA)
- caster->CastCustomSpell(target, SPELL_SHAMAN_MANA_SPRING_TOTEM_ENERGIZE, &damage, 0, 0, true, 0, 0, GetOriginalCaster()->GetGUID());
+ GetCaster()->ToPlayer()->RemoveSpellCooldown(SPELL_SHAMAN_LAVA_BURST, true);
}
void Register()
{
- OnEffectHitTarget += SpellEffectFn(spell_sha_mana_spring_totem_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
+ OnEffectHitTarget += SpellEffectFn(spell_sha_lava_surge_proc_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
}
};
SpellScript* GetSpellScript() const
{
- return new spell_sha_mana_spring_totem_SpellScript();
+ return new spell_sha_lava_surge_proc_SpellScript();
}
};
-// 39610 - Mana Tide Totem
+// 16191 - Mana Tide
+/// Updated 4.3.4
class spell_sha_mana_tide_totem : public SpellScriptLoader
{
public:
spell_sha_mana_tide_totem() : SpellScriptLoader("spell_sha_mana_tide_totem") { }
- class spell_sha_mana_tide_totem_SpellScript : public SpellScript
+ class spell_sha_mana_tide_totem_AuraScript : public AuraScript
{
- PrepareSpellScript(spell_sha_mana_tide_totem_SpellScript);
+ PrepareAuraScript(spell_sha_mana_tide_totem_AuraScript);
+
+ void CalculateAmount(AuraEffect const* aurEff, int32& amount, bool& /*canBeRecalculated*/)
+ {
+ ///@TODO: Exclude the "short term" buffs from the stat value
+ if (Unit* caster = GetCaster())
+ if (Unit* owner = caster->GetOwner())
+ amount = CalculatePct(owner->GetStat(STAT_SPIRIT), aurEff->GetAmount());
+ }
+
+ void Register()
+ {
+ DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_sha_mana_tide_totem_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_MOD_STAT);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_sha_mana_tide_totem_AuraScript();
+ }
+};
+
+// 88756 - Rolling Thunder
+class spell_sha_rolling_thunder : public SpellScriptLoader
+{
+ public:
+ spell_sha_rolling_thunder() : SpellScriptLoader("spell_sha_rolling_thunder") { }
+
+ class spell_sha_rolling_thunder_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_sha_rolling_thunder_AuraScript);
bool Validate(SpellInfo const* /*spellInfo*/)
{
- if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_GLYPH_OF_MANA_TIDE) || !sSpellMgr->GetSpellInfo(SPELL_SHAMAN_MANA_TIDE_TOTEM))
+ if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_LIGHTNING_SHIELD))
return false;
return true;
}
- void HandleDummy(SpellEffIndex /*effIndex*/)
+ void HandleEffectProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/)
{
- if (Unit* caster = GetCaster())
- if (Unit* unitTarget = GetHitUnit())
- {
- if (unitTarget->getPowerType() == POWER_MANA)
- {
- int32 effValue = GetEffectValue();
- // Glyph of Mana Tide
- if (Unit* owner = caster->GetOwner())
- if (AuraEffect* dummy = owner->GetAuraEffect(SPELL_SHAMAN_GLYPH_OF_MANA_TIDE, 0))
- effValue += dummy->GetAmount();
- // Regenerate 6% of Total Mana Every 3 secs
- int32 effBasePoints0 = int32(CalculatePct(unitTarget->GetMaxPower(POWER_MANA), effValue));
- caster->CastCustomSpell(unitTarget, SPELL_SHAMAN_MANA_TIDE_TOTEM, &effBasePoints0, NULL, NULL, true, NULL, NULL, GetOriginalCaster()->GetGUID());
- }
- }
+ if (Aura* aura = GetTarget()->GetAura(SPELL_SHAMAN_LIGHTNING_SHIELD))
+ {
+ aura->SetCharges(std::min(aura->GetCharges() + 1, aurEff->GetAmount()));
+ aura->RefreshDuration();
+ }
}
void Register()
{
- OnEffectHitTarget += SpellEffectFn(spell_sha_mana_tide_totem_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
+ OnEffectProc += AuraEffectProcFn(spell_sha_rolling_thunder_AuraScript::HandleEffectProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL);
}
};
- SpellScript* GetSpellScript() const
+ AuraScript* GetAuraScript() const
{
- return new spell_sha_mana_tide_totem_SpellScript();
+ return new spell_sha_rolling_thunder_AuraScript();
}
};
-// 6495 - Sentry Totem
-class spell_sha_sentry_totem : public SpellScriptLoader
+// 82984 - Telluric Currents
+class spell_sha_telluric_currents : public SpellScriptLoader
{
public:
- spell_sha_sentry_totem() : SpellScriptLoader("spell_sha_sentry_totem") { }
+ spell_sha_telluric_currents() : SpellScriptLoader("spell_sha_telluric_currents") { }
- class spell_sha_sentry_totem_AuraScript : public AuraScript
+ class spell_sha_telluric_currents_AuraScript : public AuraScript
{
- PrepareAuraScript(spell_sha_sentry_totem_AuraScript);
+ PrepareAuraScript(spell_sha_telluric_currents_AuraScript);
- bool Validate(SpellInfo const* /*spell*/)
+ bool Validate(SpellInfo const* /*spellInfo*/)
{
- if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_BIND_SIGHT))
+ if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_TELLURIC_CURRENTS))
return false;
return true;
}
- void AfterApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ void HandleEffectProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
{
- if (Unit* caster = GetCaster())
- if (Creature* totem = caster->GetMap()->GetCreature(caster->m_SummonSlot[4]))
- if (totem->IsTotem())
- caster->CastSpell(totem, SPELL_SHAMAN_BIND_SIGHT, true);
- }
+ PreventDefaultAction();
+ int32 basePoints0 = CalculatePct(eventInfo.GetDamageInfo()->GetDamage(), aurEff->GetAmount());
- void AfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- if (Unit* caster = GetCaster())
- if (caster->GetTypeId() == TYPEID_PLAYER)
- caster->ToPlayer()->StopCastingBindSight();
+ GetTarget()->CastCustomSpell(GetTarget(), SPELL_SHAMAN_TELLURIC_CURRENTS, &basePoints0, NULL, NULL, true);
}
void Register()
{
- AfterEffectApply += AuraEffectApplyFn(spell_sha_sentry_totem_AuraScript::AfterApply, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
- AfterEffectRemove += AuraEffectRemoveFn(spell_sha_sentry_totem_AuraScript::AfterRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
+ OnEffectProc += AuraEffectProcFn(spell_sha_telluric_currents_AuraScript::HandleEffectProc, EFFECT_0, SPELL_AURA_DUMMY);
}
};
AuraScript* GetAuraScript() const
{
- return new spell_sha_sentry_totem_AuraScript();
+ return new spell_sha_telluric_currents_AuraScript();
}
};
-// -51490 - Thunderstorm
+// 51490 - Thunderstorm
class spell_sha_thunderstorm : public SpellScriptLoader
{
public:
@@ -837,23 +874,64 @@ class spell_sha_thunderstorm : public SpellScriptLoader
}
};
+// 51562 - Tidal Waves
+class spell_sha_tidal_waves : public SpellScriptLoader
+{
+ public:
+ spell_sha_tidal_waves() : SpellScriptLoader("spell_sha_tidal_waves") { }
+
+ class spell_sha_tidal_waves_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_sha_tidal_waves_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_TIDAL_WAVES))
+ return false;
+ return true;
+ }
+
+ void HandleEffectProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/)
+ {
+ PreventDefaultAction();
+ int32 basePoints0 = -aurEff->GetAmount();
+ int32 basePoints1 = aurEff->GetAmount();
+
+ GetTarget()->CastCustomSpell(GetTarget(), SPELL_SHAMAN_TIDAL_WAVES, &basePoints0, &basePoints1, NULL, true, NULL, aurEff);
+ }
+
+ void Register()
+ {
+ OnEffectProc += AuraEffectProcFn(spell_sha_tidal_waves_AuraScript::HandleEffectProc, EFFECT_0, SPELL_AURA_DUMMY);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_sha_tidal_waves_AuraScript();
+ }
+};
+
void AddSC_shaman_spell_scripts()
{
new spell_sha_ancestral_awakening_proc();
- new spell_sha_astral_shift();
new spell_sha_bloodlust();
new spell_sha_chain_heal();
- new spell_sha_cleansing_totem_pulse();
new spell_sha_earth_shield();
new spell_sha_earthbind_totem();
new spell_sha_earthen_power();
+ new spell_sha_feedback();
new spell_sha_fire_nova();
new spell_sha_flame_shock();
+ new spell_sha_focused_insight();
new spell_sha_healing_stream_totem();
new spell_sha_heroism();
new spell_sha_lava_lash();
- new spell_sha_mana_spring_totem();
+ new spell_sha_lava_surge();
+ new spell_sha_lava_surge_proc();
new spell_sha_mana_tide_totem();
- new spell_sha_sentry_totem();
+ new spell_sha_rolling_thunder();
+ new spell_sha_telluric_currents();
new spell_sha_thunderstorm();
+ new spell_sha_tidal_waves();
}
diff --git a/src/server/scripts/Spells/spell_warlock.cpp b/src/server/scripts/Spells/spell_warlock.cpp
index 0c9af2e3804..d05ee843d44 100644
--- a/src/server/scripts/Spells/spell_warlock.cpp
+++ b/src/server/scripts/Spells/spell_warlock.cpp
@@ -25,32 +25,41 @@
#include "ScriptMgr.h"
#include "SpellScript.h"
#include "SpellAuraEffects.h"
+#include "SpellAuras.h"
enum WarlockSpells
{
+ SPELL_WARLOCK_BANE_OF_DOOM_EFFECT = 18662,
SPELL_WARLOCK_CURSE_OF_DOOM_EFFECT = 18662,
+ SPELL_WARLOCK_DEMONIC_CIRCLE_ALLOW_CAST = 62388,
SPELL_WARLOCK_DEMONIC_CIRCLE_SUMMON = 48018,
SPELL_WARLOCK_DEMONIC_CIRCLE_TELEPORT = 48020,
- SPELL_WARLOCK_DEMONIC_CIRCLE_ALLOW_CAST = 62388,
- SPELL_WARLOCK_DEMONIC_EMPOWERMENT_SUCCUBUS = 54435,
- SPELL_WARLOCK_DEMONIC_EMPOWERMENT_VOIDWALKER = 54443,
SPELL_WARLOCK_DEMONIC_EMPOWERMENT_FELGUARD = 54508,
SPELL_WARLOCK_DEMONIC_EMPOWERMENT_FELHUNTER = 54509,
SPELL_WARLOCK_DEMONIC_EMPOWERMENT_IMP = 54444,
+ SPELL_WARLOCK_DEMONIC_EMPOWERMENT_SUCCUBUS = 54435,
+ SPELL_WARLOCK_DEMONIC_EMPOWERMENT_VOIDWALKER = 54443,
+ SPELL_WARLOCK_DEMON_SOUL_IMP = 79459,
+ SPELL_WARLOCK_DEMON_SOUL_FELHUNTER = 79460,
+ SPELL_WARLOCK_DEMON_SOUL_FELGUARD = 79452,
+ SPELL_WARLOCK_DEMON_SOUL_SUCCUBUS = 79453,
+ SPELL_WARLOCK_DEMON_SOUL_VOIDWALKER = 79454,
SPELL_WARLOCK_FEL_SYNERGY_HEAL = 54181,
SPELL_WARLOCK_GLYPH_OF_SIPHON_LIFE = 63106,
+ SPELL_WARLOCK_HAUNT = 48181,
+ SPELL_WARLOCK_HAUNT_HEAL = 48210,
+ SPELL_WARLOCK_IMMOLATE = 348,
SPELL_WARLOCK_IMPROVED_HEALTHSTONE_R1 = 18692,
SPELL_WARLOCK_IMPROVED_HEALTHSTONE_R2 = 18693,
- SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_R1 = 18703,
- SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_R2 = 18704,
SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_BUFF_R1 = 60955,
SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_BUFF_R2 = 60956,
- SPELL_WARLOCK_HAUNT = 48181,
- SPELL_WARLOCK_HAUNT_HEAL = 48210,
+ SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_R1 = 18703,
+ SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_R2 = 18704,
SPELL_WARLOCK_LIFE_TAP_ENERGIZE = 31818,
SPELL_WARLOCK_LIFE_TAP_ENERGIZE_2 = 32553,
- SPELL_WARLOCK_SOULSHATTER = 32835,
SPELL_WARLOCK_SIPHON_LIFE_HEAL = 63106,
+ SPELL_WARLOCK_SOULSHATTER = 32835,
+ SPELL_WARLOCK_UNSTABLE_AFFLICTION = 30108,
SPELL_WARLOCK_UNSTABLE_AFFLICTION_DISPEL = 31117
};
@@ -60,7 +69,8 @@ enum WarlockSpellIcons
WARLOCK_ICON_ID_MANA_FEED = 1982
};
-// 710, 18647 - Banish
+// 710 - Banish
+/// Updated 4.3.4
class spell_warl_banish : public SpellScriptLoader
{
public:
@@ -78,6 +88,8 @@ class spell_warl_banish : public SpellScriptLoader
void HandleBanish()
{
+ /// Casting Banish on a banished target will cancel the effect
+ /// Check if the target already has Banish, if so, do nothing.
if (Unit* target = GetHitUnit())
{
if (target->GetAuraEffect(SPELL_AURA_SCHOOL_IMMUNITY, SPELLFAMILY_WARLOCK, 0, 0x08000000, 0))
@@ -112,7 +124,42 @@ class spell_warl_banish : public SpellScriptLoader
}
};
-// 6201 - Create Healthstone (and ranks)
+// 17962 - Conflagrate - Updated to 4.3.4
+class spell_warl_conflagrate : public SpellScriptLoader
+{
+ public:
+ spell_warl_conflagrate() : SpellScriptLoader("spell_warl_conflagrate") { }
+
+ class spell_warl_conflagrate_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_warl_conflagrate_SpellScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_IMMOLATE))
+ return false;
+ return true;
+ }
+
+ void HandleHit(SpellEffIndex /*effIndex*/)
+ {
+ if (AuraEffect const* aurEff = GetHitUnit()->GetAuraEffect(SPELL_WARLOCK_IMMOLATE, EFFECT_2, GetCaster()->GetGUID()))
+ SetHitDamage(CalculatePct(aurEff->GetAmount(), GetSpellInfo()->Effects[EFFECT_1].CalcValue(GetCaster())));
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_warl_conflagrate_SpellScript::HandleHit, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_warl_conflagrate_SpellScript();
+ }
+};
+
+// 6201 - Create Healthstone
class spell_warl_create_healthstone : public SpellScriptLoader
{
public:
@@ -184,7 +231,8 @@ class spell_warl_create_healthstone : public SpellScriptLoader
}
};
-uint32 const spell_warl_create_healthstone::spell_warl_create_healthstone_SpellScript::iTypes[8][3] = {
+uint32 const spell_warl_create_healthstone::spell_warl_create_healthstone_SpellScript::iTypes[8][3] =
+{
{ 5512, 19004, 19005}, // Minor Healthstone
{ 5511, 19006, 19007}, // Lesser Healthstone
{ 5509, 19008, 19009}, // Healthstone
@@ -195,19 +243,20 @@ uint32 const spell_warl_create_healthstone::spell_warl_create_healthstone_SpellS
{36892, 36893, 36894} // Fel Healthstone
};
-// -603 - Curse of Doom
-class spell_warl_curse_of_doom : public SpellScriptLoader
+// 603 - Bane of Doom
+/// Updated 4.3.4
+class spell_warl_bane_of_doom : public SpellScriptLoader
{
public:
- spell_warl_curse_of_doom() : SpellScriptLoader("spell_warl_curse_of_doom") { }
+ spell_warl_bane_of_doom() : SpellScriptLoader("spell_warl_bane_of_doom") { }
class spell_warl_curse_of_doom_AuraScript : public AuraScript
{
PrepareAuraScript(spell_warl_curse_of_doom_AuraScript);
- bool Validate(SpellInfo const* /*spell*/)
+ bool Validate(SpellInfo const* /*spellInfo*/)
{
- if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_CURSE_OF_DOOM_EFFECT))
+ if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_BANE_OF_DOOM_EFFECT))
return false;
return true;
}
@@ -227,7 +276,7 @@ class spell_warl_curse_of_doom : public SpellScriptLoader
return;
if (GetCaster()->ToPlayer()->isHonorOrXPTarget(GetTarget()))
- GetCaster()->CastSpell(GetTarget(), SPELL_WARLOCK_CURSE_OF_DOOM_EFFECT, true, NULL, aurEff);
+ GetCaster()->CastSpell(GetTarget(), SPELL_WARLOCK_BANE_OF_DOOM_EFFECT, true, NULL, aurEff);
}
void Register()
@@ -242,7 +291,8 @@ class spell_warl_curse_of_doom : public SpellScriptLoader
}
};
-// 48018 - Demonic Circle Summon
+// 48018 - Demonic Circle: Summon
+/// Updated 4.3.4
class spell_warl_demonic_circle_summon : public SpellScriptLoader
{
public:
@@ -294,7 +344,8 @@ class spell_warl_demonic_circle_summon : public SpellScriptLoader
}
};
-// 48020 - Demonic Circle Teleport
+// 48020 - Demonic Circle: Teleport
+/// Updated 4.3.4
class spell_warl_demonic_circle_teleport : public SpellScriptLoader
{
public:
@@ -328,7 +379,75 @@ class spell_warl_demonic_circle_teleport : public SpellScriptLoader
}
};
+// 77801 - Demon Soul - Updated to 4.3.4
+class spell_warl_demon_soul : public SpellScriptLoader
+{
+ public:
+ spell_warl_demon_soul() : SpellScriptLoader("spell_warl_demon_soul") { }
+
+ class spell_warl_demon_soul_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_warl_demon_soul_SpellScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_DEMON_SOUL_IMP))
+ return false;
+ if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_DEMON_SOUL_FELHUNTER))
+ return false;
+ if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_DEMON_SOUL_FELGUARD))
+ return false;
+ if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_DEMON_SOUL_SUCCUBUS))
+ return false;
+ if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_DEMON_SOUL_VOIDWALKER))
+ return false;
+ return true;
+ }
+
+ void OnHitTarget(SpellEffIndex /*effIndex*/)
+ {
+ Unit* caster = GetCaster();
+ if (Creature* targetCreature = GetHitCreature())
+ {
+ if (targetCreature->IsPet())
+ {
+ CreatureTemplate const* ci = sObjectMgr->GetCreatureTemplate(targetCreature->GetEntry());
+ switch (ci->family)
+ {
+ case CREATURE_FAMILY_SUCCUBUS:
+ caster->CastSpell(caster, SPELL_WARLOCK_DEMON_SOUL_SUCCUBUS);
+ break;
+ case CREATURE_FAMILY_VOIDWALKER:
+ caster->CastSpell(caster, SPELL_WARLOCK_DEMON_SOUL_VOIDWALKER);
+ break;
+ case CREATURE_FAMILY_FELGUARD:
+ caster->CastSpell(caster, SPELL_WARLOCK_DEMON_SOUL_FELGUARD);
+ break;
+ case CREATURE_FAMILY_FELHUNTER:
+ caster->CastSpell(caster, SPELL_WARLOCK_DEMON_SOUL_FELHUNTER);
+ break;
+ case CREATURE_FAMILY_IMP:
+ caster->CastSpell(caster, SPELL_WARLOCK_DEMON_SOUL_IMP);
+ break;
+ }
+ }
+ }
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_warl_demon_soul_SpellScript::OnHitTarget, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_warl_demon_soul_SpellScript;
+ }
+};
+
// 47193 - Demonic Empowerment
+/// Updated 4.3.4
class spell_warl_demonic_empowerment : public SpellScriptLoader
{
public:
@@ -362,7 +481,6 @@ class spell_warl_demonic_empowerment : public SpellScriptLoader
SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(SPELL_WARLOCK_DEMONIC_EMPOWERMENT_VOIDWALKER);
int32 hp = int32(targetCreature->CountPctFromMaxHealth(GetCaster()->CalculateSpellDamage(targetCreature, spellInfo, 0)));
targetCreature->CastCustomSpell(targetCreature, SPELL_WARLOCK_DEMONIC_EMPOWERMENT_VOIDWALKER, &hp, NULL, NULL, true);
- //unitTarget->CastSpell(unitTarget, 54441, true);
break;
}
case CREATURE_FAMILY_FELGUARD:
@@ -392,6 +510,7 @@ class spell_warl_demonic_empowerment : public SpellScriptLoader
};
// 47422 - Everlasting Affliction
+/// Updated 4.3.4
class spell_warl_everlasting_affliction : public SpellScriptLoader
{
public:
@@ -421,6 +540,43 @@ class spell_warl_everlasting_affliction : public SpellScriptLoader
}
};
+// 77799 - Fel Flame - Updated to 4.3.4
+class spell_warl_fel_flame : public SpellScriptLoader
+{
+ public:
+ spell_warl_fel_flame() : SpellScriptLoader("spell_warl_fel_flame") { }
+
+ class spell_warl_fel_flame_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_warl_fel_flame_SpellScript);
+
+ void OnHitTarget(SpellEffIndex /*effIndex*/)
+ {
+ Unit* caster = GetCaster();
+ Unit* target = GetHitUnit();
+ Aura* aura = target->GetAura(SPELL_WARLOCK_UNSTABLE_AFFLICTION, caster->GetGUID());
+ if (!aura)
+ aura = target->GetAura(SPELL_WARLOCK_IMMOLATE, caster->GetGUID());
+
+ if (!aura)
+ return;
+
+ int32 newDuration = aura->GetDuration() + GetSpellInfo()->Effects[EFFECT_1].CalcValue() * 1000;
+ aura->SetDuration(std::min(newDuration, aura->GetMaxDuration()));
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_warl_fel_flame_SpellScript::OnHitTarget, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_warl_fel_flame_SpellScript;
+ }
+};
+
// -47230 - Fel Synergy
class spell_warl_fel_synergy : public SpellScriptLoader
{
@@ -464,7 +620,8 @@ class spell_warl_fel_synergy : public SpellScriptLoader
}
};
-// -48181 - Haunt
+// 48181 - Haunt
+/// Updated 4.3.4
class spell_warl_haunt : public SpellScriptLoader
{
public:
@@ -491,7 +648,7 @@ class spell_warl_haunt : public SpellScriptLoader
{
PrepareAuraScript(spell_warl_haunt_AuraScript);
- bool Validate(SpellInfo const* /*spell*/)
+ bool Validate(SpellInfo const* /*spellInfo*/)
{
if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_HAUNT_HEAL))
return false;
@@ -524,7 +681,8 @@ class spell_warl_haunt : public SpellScriptLoader
}
};
-// -755 - Health Funnel
+// 755 - Health Funnel
+/// Updated 4.3.4
class spell_warl_health_funnel : public SpellScriptLoader
{
public:
@@ -567,7 +725,8 @@ class spell_warl_health_funnel : public SpellScriptLoader
}
};
-// -1454 - Life Tap
+// 1454 - Life Tap
+/// Updated 4.3.4
class spell_warl_life_tap : public SpellScriptLoader
{
public:
@@ -582,7 +741,7 @@ class spell_warl_life_tap : public SpellScriptLoader
return GetCaster()->GetTypeId() == TYPEID_PLAYER;
}
- bool Validate(SpellInfo const* /*spell*/)
+ bool Validate(SpellInfo const* /*spellInfo*/)
{
if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_LIFE_TAP_ENERGIZE) || !sSpellMgr->GetSpellInfo(SPELL_WARLOCK_LIFE_TAP_ENERGIZE_2))
return false;
@@ -594,8 +753,8 @@ class spell_warl_life_tap : public SpellScriptLoader
Player* caster = GetCaster()->ToPlayer();
if (Unit* target = GetHitUnit())
{
- int32 damage = GetEffectValue();
- int32 mana = int32(damage + (caster->GetUInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_POS+SPELL_SCHOOL_SHADOW) * 0.5f));
+ int32 damage = caster->CountPctFromMaxHealth(GetSpellInfo()->Effects[EFFECT_2].CalcValue());
+ int32 mana = CalculatePct(damage, GetSpellInfo()->Effects[EFFECT_1].CalcValue());
// Shouldn't Appear in Combat Log
target->ModifyHealth(-damage);
@@ -607,12 +766,9 @@ class spell_warl_life_tap : public SpellScriptLoader
caster->CastCustomSpell(target, SPELL_WARLOCK_LIFE_TAP_ENERGIZE, &mana, NULL, NULL, false);
// Mana Feed
- int32 manaFeedVal = 0;
if (AuraEffect const* aurEff = caster->GetAuraEffect(SPELL_AURA_ADD_FLAT_MODIFIER, SPELLFAMILY_WARLOCK, WARLOCK_ICON_ID_MANA_FEED, 0))
- manaFeedVal = aurEff->GetAmount();
-
- if (manaFeedVal > 0)
{
+ int32 manaFeedVal = aurEff->GetAmount();
ApplyPct(manaFeedVal, mana);
caster->CastCustomSpell(caster, SPELL_WARLOCK_LIFE_TAP_ENERGIZE_2, &manaFeedVal, NULL, NULL, true, NULL);
}
@@ -621,7 +777,7 @@ class spell_warl_life_tap : public SpellScriptLoader
SpellCastResult CheckCast()
{
- if ((int32(GetCaster()->GetHealth()) > int32(GetSpellInfo()->Effects[EFFECT_0].CalcValue() + (6.3875 * GetSpellInfo()->BaseLevel))))
+ if (int32(GetCaster()->GetHealth()) > int32(GetCaster()->CountPctFromMaxHealth(GetSpellInfo()->Effects[EFFECT_2].CalcValue())))
return SPELL_CAST_OK;
return SPELL_FAILED_FIZZLE;
}
@@ -667,7 +823,8 @@ class spell_warl_ritual_of_doom_effect : public SpellScriptLoader
}
};
-// -27285 - Seed of Corruption
+// 27285 - Seed of Corruption
+/// Updated 4.3.4
class spell_warl_seed_of_corruption : public SpellScriptLoader
{
public:
@@ -782,6 +939,7 @@ class spell_warl_siphon_life : public SpellScriptLoader
};
// 29858 - Soulshatter
+/// Updated 4.3.4
class spell_warl_soulshatter : public SpellScriptLoader
{
public:
@@ -791,7 +949,7 @@ class spell_warl_soulshatter : public SpellScriptLoader
{
PrepareSpellScript(spell_warl_soulshatter_SpellScript);
- bool Validate(SpellInfo const* /*spell*/)
+ bool Validate(SpellInfo const* /*spellInfo*/)
{
if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_SOULSHATTER))
return false;
@@ -802,10 +960,8 @@ class spell_warl_soulshatter : public SpellScriptLoader
{
Unit* caster = GetCaster();
if (Unit* target = GetHitUnit())
- {
if (target->CanHaveThreatList() && target->getThreatManager().getThreat(caster) > 0.0f)
caster->CastSpell(target, SPELL_WARLOCK_SOULSHATTER, true);
- }
}
void Register()
@@ -820,7 +976,8 @@ class spell_warl_soulshatter : public SpellScriptLoader
}
};
-// -30108 - Unstable Affliction
+// 30108, 34438, 34439, 35183 - Unstable Affliction
+/// Updated 4.3.4
class spell_warl_unstable_affliction : public SpellScriptLoader
{
public:
@@ -830,7 +987,7 @@ class spell_warl_unstable_affliction : public SpellScriptLoader
{
PrepareAuraScript(spell_warl_unstable_affliction_AuraScript);
- bool Validate(SpellInfo const* /*spell*/)
+ bool Validate(SpellInfo const* /*spellInfo*/)
{
if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_UNSTABLE_AFFLICTION_DISPEL))
return false;
@@ -840,7 +997,7 @@ class spell_warl_unstable_affliction : public SpellScriptLoader
void HandleDispel(DispelInfo* dispelInfo)
{
if (Unit* caster = GetCaster())
- if (AuraEffect const* aurEff = GetEffect(EFFECT_0))
+ if (AuraEffect const* aurEff = GetEffect(EFFECT_1))
{
int32 damage = aurEff->GetAmount() * 9;
// backfire damage and silence
@@ -862,13 +1019,16 @@ class spell_warl_unstable_affliction : public SpellScriptLoader
void AddSC_warlock_spell_scripts()
{
+ new spell_warl_bane_of_doom();
new spell_warl_banish();
+ new spell_warl_conflagrate();
new spell_warl_create_healthstone();
- new spell_warl_curse_of_doom();
new spell_warl_demonic_circle_summon();
new spell_warl_demonic_circle_teleport();
new spell_warl_demonic_empowerment();
+ new spell_warl_demon_soul();
new spell_warl_everlasting_affliction();
+ new spell_warl_fel_flame();
new spell_warl_fel_synergy();
new spell_warl_haunt();
new spell_warl_health_funnel();
diff --git a/src/server/scripts/Spells/spell_warrior.cpp b/src/server/scripts/Spells/spell_warrior.cpp
index 7136f046873..a5316766239 100644
--- a/src/server/scripts/Spells/spell_warrior.cpp
+++ b/src/server/scripts/Spells/spell_warrior.cpp
@@ -31,7 +31,6 @@ enum WarriorSpells
SPELL_WARRIOR_BLOODTHIRST = 23885,
SPELL_WARRIOR_BLOODTHIRST_DAMAGE = 23881,
SPELL_WARRIOR_CHARGE = 34846,
- SPELL_WARRIOR_DAMAGE_SHIELD_DAMAGE = 59653,
SPELL_WARRIOR_DEEP_WOUNDS_RANK_1 = 12162,
SPELL_WARRIOR_DEEP_WOUNDS_RANK_2 = 12850,
SPELL_WARRIOR_DEEP_WOUNDS_RANK_3 = 12868,
@@ -42,7 +41,8 @@ enum WarriorSpells
SPELL_WARRIOR_JUGGERNAUT_CRIT_BONUS_BUFF = 65156,
SPELL_WARRIOR_JUGGERNAUT_CRIT_BONUS_TALENT = 64976,
SPELL_WARRIOR_LAST_STAND_TRIGGERED = 12976,
- SPELL_WARRIOR_SLAM = 50783,
+ SPELL_WARRIOR_RALLYING_CRY = 97463,
+ SPELL_WARRIOR_SLAM = 50782,
SPELL_WARRIOR_SWEEPING_STRIKES_EXTRA_ATTACK = 26654,
SPELL_WARRIOR_TAUNT = 355,
SPELL_WARRIOR_UNRELENTING_ASSAULT_RANK_1 = 46859,
@@ -60,10 +60,10 @@ enum WarriorSpells
enum WarriorSpellIcons
{
- WARRIOR_ICON_ID_SUDDEN_DEATH = 1989,
+ WARRIOR_ICON_ID_SUDDEN_DEATH = 1989,
};
-// 23881 - Bloodthirst
+/// Updated 4.3.4
class spell_warr_bloodthirst : public SpellScriptLoader
{
public:
@@ -105,7 +105,7 @@ class spell_warr_bloodthirst : public SpellScriptLoader
}
};
-// 23880 - Bloodthirst (Heal)
+/// Updated 4.3.4
class spell_warr_bloodthirst_heal : public SpellScriptLoader
{
public:
@@ -118,7 +118,7 @@ class spell_warr_bloodthirst_heal : public SpellScriptLoader
void HandleHeal(SpellEffIndex /*effIndex*/)
{
if (SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(SPELL_WARRIOR_BLOODTHIRST_DAMAGE))
- SetHitHeal(GetCaster()->CountPctFromMaxHealth(spellInfo->Effects[EFFECT_1].CalcValue(GetCaster())));
+ SetHitHeal(GetCaster()->CountPctFromMaxHealth(spellInfo->Effects[EFFECT_1].CalcValue(GetCaster())) / 100);
}
void Register()
@@ -133,7 +133,7 @@ class spell_warr_bloodthirst_heal : public SpellScriptLoader
}
};
-// -100 - Charge
+/// Updated 4.3.4
class spell_warr_charge : public SpellScriptLoader
{
public:
@@ -173,7 +173,7 @@ class spell_warr_charge : public SpellScriptLoader
}
};
-// 12809 - Concussion Blow
+/// Updated 4.3.4
class spell_warr_concussion_blow : public SpellScriptLoader
{
public:
@@ -200,45 +200,7 @@ class spell_warr_concussion_blow : public SpellScriptLoader
}
};
-// -58872 - Damage Shield
-class spell_warr_damage_shield : public SpellScriptLoader
-{
- public:
- spell_warr_damage_shield() : SpellScriptLoader("spell_warr_damage_shield") { }
-
- class spell_warr_damage_shield_AuraScript : public AuraScript
- {
- PrepareAuraScript(spell_warr_damage_shield_AuraScript);
-
- bool Validate(SpellInfo const* /*spellInfo*/)
- {
- if (!sSpellMgr->GetSpellInfo(SPELL_WARRIOR_DAMAGE_SHIELD_DAMAGE))
- return false;
- return true;
- }
-
- void OnProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
- {
- PreventDefaultAction();
-
- // % of amount blocked
- int32 damage = CalculatePct(int32(GetTarget()->GetShieldBlockValue()), aurEff->GetAmount());
- GetTarget()->CastCustomSpell(SPELL_WARRIOR_DAMAGE_SHIELD_DAMAGE, SPELLVALUE_BASE_POINT0, damage, eventInfo.GetProcTarget(), true, NULL, aurEff);
- }
-
- void Register()
- {
- OnEffectProc += AuraEffectProcFn(spell_warr_damage_shield_AuraScript::OnProc, EFFECT_0, SPELL_AURA_DUMMY);
- }
- };
-
- AuraScript* GetAuraScript() const
- {
- return new spell_warr_damage_shield_AuraScript();
- }
-};
-
-// -12162 - Deep Wounds
+/// Updated 4.3.4
class spell_warr_deep_wounds : public SpellScriptLoader
{
public:
@@ -293,7 +255,7 @@ class spell_warr_deep_wounds : public SpellScriptLoader
}
};
-// -5308 - Execute
+/// Updated 4.3.4
class spell_warr_execute : public SpellScriptLoader
{
public:
@@ -303,43 +265,35 @@ class spell_warr_execute : public SpellScriptLoader
{
PrepareSpellScript(spell_warr_execute_SpellScript);
- bool Validate(SpellInfo const* /*spellInfo*/)
- {
- if (!sSpellMgr->GetSpellInfo(SPELL_WARRIOR_EXECUTE) || !sSpellMgr->GetSpellInfo(SPELL_WARRIOR_GLYPH_OF_EXECUTION))
- return false;
- return true;
- }
-
- void HandleDummy(SpellEffIndex effIndex)
+ void HandleEffect(SpellEffIndex /*effIndex*/)
{
Unit* caster = GetCaster();
- if (Unit* target = GetHitUnit())
+ if (GetHitUnit())
{
SpellInfo const* spellInfo = GetSpellInfo();
- int32 rageUsed = std::min<int32>(300 - spellInfo->CalcPowerCost(caster, SpellSchoolMask(spellInfo->SchoolMask)), caster->GetPower(POWER_RAGE));
+ int32 rageUsed = std::min<int32>(200 - spellInfo->CalcPowerCost(caster, SpellSchoolMask(spellInfo->SchoolMask)), caster->GetPower(POWER_RAGE));
int32 newRage = std::max<int32>(0, caster->GetPower(POWER_RAGE) - rageUsed);
// Sudden Death rage save
if (AuraEffect* aurEff = caster->GetAuraEffect(SPELL_AURA_PROC_TRIGGER_SPELL, SPELLFAMILY_GENERIC, WARRIOR_ICON_ID_SUDDEN_DEATH, EFFECT_0))
{
- int32 ragesave = aurEff->GetSpellInfo()->Effects[EFFECT_1].CalcValue() * 10;
+ int32 ragesave = aurEff->GetSpellInfo()->Effects[EFFECT_0].CalcValue() * 10;
newRage = std::max(newRage, ragesave);
}
caster->SetPower(POWER_RAGE, uint32(newRage));
- // Glyph of Execution bonus
- if (AuraEffect* aurEff = caster->GetAuraEffect(SPELL_WARRIOR_GLYPH_OF_EXECUTION, EFFECT_0))
- rageUsed += aurEff->GetAmount() * 10;
-
- int32 bp = GetEffectValue() + int32(rageUsed * spellInfo->Effects[effIndex].DamageMultiplier + caster->GetTotalAttackPowerValue(BASE_ATTACK) * 0.2f);
- caster->CastCustomSpell(target, SPELL_WARRIOR_EXECUTE, &bp, NULL, NULL, true, NULL, NULL, GetOriginalCaster()->GetGUID());
+ /// Formula taken from the DBC: "${10+$AP*0.437*$m1/100}"
+ int32 baseDamage = int32(10 + caster->GetTotalAttackPowerValue(BASE_ATTACK) * 0.437f * GetEffectValue() / 100.0f);
+ /// Formula taken from the DBC: "${$ap*0.874*$m1/100-1} = 20 rage"
+ int32 moreDamage = int32(rageUsed * (caster->GetTotalAttackPowerValue(BASE_ATTACK) * 0.874f * GetEffectValue() / 100.0f - 1) / 200);
+ SetHitDamage(baseDamage + moreDamage);
}
}
void Register()
{
- OnEffectHitTarget += SpellEffectFn(spell_warr_execute_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
+ OnEffectHitTarget += SpellEffectFn(spell_warr_execute_SpellScript::HandleEffect, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE);
}
};
@@ -405,7 +359,7 @@ class spell_warr_intimidating_shout : public SpellScriptLoader
}
};
-// 12975 - Last Stand
+/// Updated 4.3.4
class spell_warr_last_stand : public SpellScriptLoader
{
public:
@@ -426,13 +380,14 @@ class spell_warr_last_stand : public SpellScriptLoader
{
if (Unit* caster = GetCaster())
{
- int32 healthModSpellBasePoints0 = int32(caster->CountPctFromMaxHealth(30));
+ int32 healthModSpellBasePoints0 = int32(caster->CountPctFromMaxHealth(GetEffectValue()));
caster->CastCustomSpell(caster, SPELL_WARRIOR_LAST_STAND_TRIGGERED, &healthModSpellBasePoints0, NULL, NULL, true, NULL);
}
}
void Register()
{
+ // add dummy effect spell handler to Last Stand
OnEffectHit += SpellEffectFn(spell_warr_last_stand_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
}
};
@@ -481,6 +436,47 @@ class spell_warr_overpower : public SpellScriptLoader
}
};
+// 97462 - Rallying Cry
+class spell_warr_rallying_cry : public SpellScriptLoader
+{
+ public:
+ spell_warr_rallying_cry() : SpellScriptLoader("spell_warr_rallying_cry") { }
+
+ class spell_warr_rallying_cry_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_warr_rallying_cry_SpellScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_WARRIOR_RALLYING_CRY))
+ return false;
+ return true;
+ }
+
+ bool Load()
+ {
+ return GetCaster()->GetTypeId() == TYPEID_PLAYER;
+ }
+
+ void HandleScript(SpellEffIndex /*effIndex*/)
+ {
+ int32 basePoints0 = int32(GetHitUnit()->CountPctFromMaxHealth(GetEffectValue()));
+
+ GetCaster()->CastCustomSpell(GetHitUnit(), SPELL_WARRIOR_RALLYING_CRY, &basePoints0, NULL, NULL, true);
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_warr_rallying_cry_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_DUMMY);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_warr_rallying_cry_SpellScript();
+ }
+};
+
// -772 - Rend
class spell_warr_rend : public SpellScriptLoader
{
@@ -558,7 +554,7 @@ class spell_warr_shattering_throw : public SpellScriptLoader
}
};
-// -1464 - Slam
+/// Updated 4.3.4
class spell_warr_slam : public SpellScriptLoader
{
public:
@@ -776,13 +772,13 @@ void AddSC_warrior_spell_scripts()
new spell_warr_bloodthirst_heal();
new spell_warr_charge();
new spell_warr_concussion_blow();
- new spell_warr_damage_shield();
new spell_warr_deep_wounds();
new spell_warr_execute();
new spell_warr_improved_spell_reflection();
new spell_warr_intimidating_shout();
new spell_warr_last_stand();
new spell_warr_overpower();
+ new spell_warr_rallying_cry();
new spell_warr_rend();
new spell_warr_shattering_throw();
new spell_warr_slam();
diff --git a/src/server/scripts/World/item_scripts.cpp b/src/server/scripts/World/item_scripts.cpp
index 67cf3b8d582..8eb54d46bdf 100644
--- a/src/server/scripts/World/item_scripts.cpp
+++ b/src/server/scripts/World/item_scripts.cpp
@@ -76,7 +76,7 @@ public:
return false;
// error
- player->SendEquipError(EQUIP_ERR_CANT_DO_RIGHT_NOW, item, NULL);
+ player->SendEquipError(EQUIP_ERR_CLIENT_LOCKED_OUT, item, NULL);
return true;
}
};
@@ -119,7 +119,7 @@ public:
targets.GetUnitTarget()->GetEntry() == 20748 && !targets.GetUnitTarget()->HasAura(32578))
return false;
- player->SendEquipError(EQUIP_ERR_CANT_DO_RIGHT_NOW, item, NULL);
+ player->SendEquipError(EQUIP_ERR_CLIENT_LOCKED_OUT, item, NULL);
return true;
}
};
@@ -268,15 +268,13 @@ class item_petrov_cluster_bombs : public ItemScript
public:
item_petrov_cluster_bombs() : ItemScript("item_petrov_cluster_bombs") { }
- bool OnUse(Player* player, Item* item, const SpellCastTargets & /*targets*/)
+ bool OnUse(Player* player, Item* /*item*/, const SpellCastTargets & /*targets*/)
{
if (player->GetZoneId() != ZONE_ID_HOWLING)
return false;
if (!player->GetTransport() || player->GetAreaId() != AREA_ID_SHATTERED_STRAITS)
{
- player->SendEquipError(EQUIP_ERR_NONE, item, NULL);
-
if (const SpellInfo* spellInfo = sSpellMgr->GetSpellInfo(SPELL_PETROV_BOMB))
Spell::SendCastResult(player, spellInfo, 1, SPELL_FAILED_NOT_HERE);
@@ -381,7 +379,7 @@ public:
} else
player->SendEquipError(EQUIP_ERR_OUT_OF_RANGE, item, NULL);
} else
- player->SendEquipError(EQUIP_ERR_CANT_DO_RIGHT_NOW, item, NULL);
+ player->SendEquipError(EQUIP_ERR_CLIENT_LOCKED_OUT, item, NULL);
return true;
}
};
@@ -407,7 +405,7 @@ public:
player->SendEquipError(EQUIP_ERR_OUT_OF_RANGE, item, NULL);
}
else
- player->SendEquipError(EQUIP_ERR_CANT_DO_RIGHT_NOW, item, NULL);
+ player->SendEquipError(EQUIP_ERR_CLIENT_LOCKED_OUT, item, NULL);
return true;
}
};
diff --git a/src/server/scripts/World/npc_professions.cpp b/src/server/scripts/World/npc_professions.cpp
index ff37c88adae..83826bbc4ad 100644
--- a/src/server/scripts/World/npc_professions.cpp
+++ b/src/server/scripts/World/npc_professions.cpp
@@ -214,7 +214,7 @@ int32 DoLowUnlearnCost(Player* player) //blacksmith
void ProcessCastaction(Player* player, Creature* creature, uint32 spellId, uint32 triggeredSpellId, int32 cost)
{
- if (!(spellId && player->HasSpell(spellId)) && player->HasEnoughMoney(cost))
+ if (!(spellId && player->HasSpell(spellId)) && player->HasEnoughMoney((int64)cost))
{
player->CastSpell(player, triggeredSpellId, true);
player->ModifyMoney(-cost);
@@ -352,11 +352,11 @@ void ProcessUnlearnAction(Player* player, Creature* creature, uint32 spellId, ui
{
if (EquippedOk(player, spellId))
{
- if (player->HasEnoughMoney(cost))
+ if (player->HasEnoughMoney(int64(cost)))
{
player->CastSpell(player, spellId, true);
ProfessionUnlearnSpells(player, spellId);
- player->ModifyMoney(-cost);
+ player->ModifyMoney(-int64(cost));
if (alternativeSpellId)
creature->CastSpell(player, alternativeSpellId, true);
}
@@ -364,7 +364,7 @@ void ProcessUnlearnAction(Player* player, Creature* creature, uint32 spellId, ui
player->SendBuyError(BUY_ERR_NOT_ENOUGHT_MONEY, creature, 0, 0);
}
else
- player->SendEquipError(EQUIP_ERR_CANT_DO_RIGHT_NOW, NULL, NULL);
+ player->SendEquipError(EQUIP_ERR_CLIENT_LOCKED_OUT, NULL, NULL);
player->CLOSE_GOSSIP_MENU();
}
diff --git a/src/server/scripts/World/npcs_special.cpp b/src/server/scripts/World/npcs_special.cpp
index 5301f8fa2c4..dca55306113 100644
--- a/src/server/scripts/World/npcs_special.cpp
+++ b/src/server/scripts/World/npcs_special.cpp
@@ -439,9 +439,6 @@ public:
me->Relocate(x, y, z + 0.94f);
me->SetDisableGravity(true);
me->HandleEmoteCommand(EMOTE_ONESHOT_DANCE);
- WorldPacket data; //send update position to client
- me->BuildHeartBeatMsg(&data);
- me->SendMessageToSet(&data, true);
}
void UpdateAI(uint32 diff)
@@ -468,9 +465,6 @@ public:
me->SetInFront(player);
Active = false;
- WorldPacket data;
- me->BuildHeartBeatMsg(&data);
- me->SendMessageToSet(&data, true);
switch (emote)
{
case TEXT_EMOTE_KISS:
@@ -1298,7 +1292,7 @@ public:
case GOSSIP_OPTION_LEARNDUALSPEC:
if (player->GetSpecsCount() == 1 && !(player->getLevel() < sWorld->getIntConfig(CONFIG_MIN_DUALSPEC_LEVEL)))
{
- if (!player->HasEnoughMoney(10000000))
+ if (!player->HasEnoughMoney(uint64(10000000)))
{
player->SendBuyError(BUY_ERR_NOT_ENOUGHT_MONEY, 0, 0, 0);
player->PlayerTalkClass->SendCloseGossip();
@@ -1306,7 +1300,7 @@ public:
}
else
{
- player->ModifyMoney(-10000000);
+ player->ModifyMoney(int64(-10000000));
// Cast spells that teach dual spec
// Both are also ImplicitTarget self and must be cast by player
@@ -2562,11 +2556,11 @@ public:
}
if (doSwitch)
{
- if (!player->HasEnoughMoney(EXP_COST))
+ if (!player->HasEnoughMoney(uint64(EXP_COST)))
player->SendBuyError(BUY_ERR_NOT_ENOUGHT_MONEY, 0, 0, 0);
else if (noXPGain)
{
- player->ModifyMoney(-EXP_COST);
+ player->ModifyMoney(-int64(EXP_COST));
player->RemoveFlag(PLAYER_FLAGS, PLAYER_FLAGS_NO_XP_GAIN);
}
else if (!noXPGain)