aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/authserver/Authentication/TOTP.cpp94
-rw-r--r--src/server/authserver/Authentication/TOTP.h29
-rw-r--r--src/server/authserver/Server/AuthSocket.cpp26
-rw-r--r--src/server/authserver/Server/AuthSocket.h1
-rw-r--r--src/server/collision/Maps/TileAssembler.cpp11
-rw-r--r--src/server/game/Chat/Chat.cpp13
-rw-r--r--src/server/game/Entities/Object/Updates/UpdateMask.h2
-rw-r--r--src/server/game/Entities/Player/Player.cpp8
-rw-r--r--src/server/game/Handlers/MiscHandler.cpp4
-rw-r--r--src/server/game/Instances/InstanceScript.h16
-rwxr-xr-xsrc/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp2
-rw-r--r--src/server/game/Spells/Auras/SpellAuras.cpp1
-rw-r--r--src/server/game/Spells/Spell.cpp1
-rw-r--r--src/server/game/Spells/SpellMgr.cpp17
-rw-r--r--src/server/game/World/World.cpp2
-rw-r--r--src/server/scripts/Commands/cs_debug.cpp30
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/SunwellPlateau/boss_eredar_twins.cpp1
-rw-r--r--src/server/scripts/EasternKingdoms/zone_western_plaguelands.cpp3
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/Ahnkahet/ahnkahet.h84
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_amanitar.cpp177
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_elder_nadox.cpp53
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_herald_volazj.cpp12
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_jedoga_shadowseeker.cpp39
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_prince_taldaram.cpp81
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/Ahnkahet/instance_ahnkahet.cpp511
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/AzjolNerub/azjol_nerub.h53
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_anubarak.cpp6
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp8
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_krikthir_the_gatewatcher.cpp13
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp297
-rw-r--r--src/server/scripts/Northrend/DraktharonKeep/drak_tharon_keep.h9
-rw-r--r--src/server/scripts/Northrend/DraktharonKeep/instance_drak_tharon_keep.cpp2
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp4
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp9
-rw-r--r--src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_bjarngrim.cpp6
-rw-r--r--src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_ionar.cpp8
-rw-r--r--src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_loken.cpp7
-rw-r--r--src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp6
-rw-r--r--src/server/scripts/Northrend/Ulduar/HallsOfLightning/halls_of_lightning.h41
-rw-r--r--src/server/scripts/Northrend/Ulduar/HallsOfLightning/instance_halls_of_lightning.cpp339
-rw-r--r--src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp1
-rw-r--r--src/server/scripts/Northrend/zone_borean_tundra.cpp5
-rw-r--r--src/server/scripts/Northrend/zone_sholazar_basin.cpp2
-rw-r--r--src/server/scripts/Outland/BlackTemple/black_temple.h96
-rw-r--r--src/server/scripts/Outland/BlackTemple/boss_bloodboil.cpp6
-rw-r--r--src/server/scripts/Outland/BlackTemple/boss_illidan.cpp36
-rw-r--r--src/server/scripts/Outland/BlackTemple/boss_mother_shahraz.cpp6
-rw-r--r--src/server/scripts/Outland/BlackTemple/boss_reliquary_of_souls.cpp14
-rw-r--r--src/server/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp139
-rw-r--r--src/server/scripts/Outland/BlackTemple/boss_supremus.cpp16
-rw-r--r--src/server/scripts/Outland/BlackTemple/boss_teron_gorefiend.cpp6
-rw-r--r--src/server/scripts/Outland/BlackTemple/boss_warlord_najentus.cpp8
-rw-r--r--src/server/scripts/Outland/BlackTemple/illidari_council.cpp47
-rw-r--r--src/server/scripts/Outland/BlackTemple/instance_black_temple.cpp544
-rw-r--r--src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_hydross_the_unstable.cpp7
-rw-r--r--src/server/scripts/Outland/GruulsLair/boss_gruul.cpp310
-rw-r--r--src/server/scripts/Outland/GruulsLair/boss_high_king_maulgar.cpp359
-rw-r--r--src/server/scripts/Outland/GruulsLair/gruuls_lair.h45
-rw-r--r--src/server/scripts/Outland/GruulsLair/instance_gruuls_lair.cpp272
-rw-r--r--src/server/scripts/Spells/spell_shaman.cpp6
-rw-r--r--src/server/shared/Cryptography/HMACSHA1.cpp5
-rw-r--r--src/server/shared/Cryptography/HMACSHA1.h1
-rw-r--r--src/server/shared/Database/Implementation/LoginDatabase.cpp2
-rw-r--r--src/server/shared/Database/QueryResult.cpp3
-rw-r--r--src/server/shared/Threading/Threading.cpp9
-rw-r--r--src/server/shared/Utilities/Util.h2
-rw-r--r--src/tools/mmaps_generator/MapBuilder.cpp32
-rw-r--r--src/tools/mmaps_generator/PathCommon.h1
-rw-r--r--src/tools/mmaps_generator/TerrainBuilder.cpp6
-rw-r--r--src/tools/vmap4_assembler/VMapAssembler.cpp5
-rw-r--r--src/tools/vmap4_extractor/gameobject_extract.cpp8
-rw-r--r--src/tools/vmap4_extractor/vmapexport.cpp8
-rw-r--r--src/tools/vmap4_extractor/wmo.cpp20
-rw-r--r--src/tools/vmap4_extractor/wmo.h1
75 files changed, 1922 insertions, 2134 deletions
diff --git a/src/server/authserver/Authentication/TOTP.cpp b/src/server/authserver/Authentication/TOTP.cpp
new file mode 100644
index 00000000000..43c97c296d9
--- /dev/null
+++ b/src/server/authserver/Authentication/TOTP.cpp
@@ -0,0 +1,94 @@
+/*
+ * 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 "TOTP.h"
+
+int base32_decode(const char* encoded, char* result, int bufSize)
+{
+ // Base32 implementation
+ // Copyright 2010 Google Inc.
+ // Author: Markus Gutschke
+ // Licensed under the Apache License, Version 2.0
+ int buffer = 0;
+ int bitsLeft = 0;
+ int count = 0;
+ for (const char *ptr = encoded; count < bufSize && *ptr; ++ptr)
+ {
+ char ch = *ptr;
+ if (ch == ' ' || ch == ' ' || ch == '\r' || ch == '\n' || ch == '-')
+ continue;
+ buffer <<= 5;
+
+ // Deal with commonly mistyped characters
+ if (ch == '0')
+ ch = 'O';
+ else if (ch == '1')
+ ch = 'L';
+ else if (ch == '8')
+ ch = 'B';
+
+ // Look up one base32 digit
+ if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z'))
+ ch = (ch & 0x1F) - 1;
+ else if (ch >= '2' && ch <= '7')
+ ch -= '2' - 26;
+ else
+ return -1;
+
+ buffer |= ch;
+ bitsLeft += 5;
+ if (bitsLeft >= 8)
+ {
+ result[count++] = buffer >> (bitsLeft - 8);
+ bitsLeft -= 8;
+ }
+ }
+
+ if (count < bufSize)
+ result[count] = '\000';
+ return count;
+}
+
+#define HMAC_RES_SIZE 20
+
+namespace TOTP
+{
+ unsigned int GenerateToken(const char* b32key)
+ {
+ size_t keySize = strlen(b32key);
+ int bufsize = (keySize + 7)/8*5;
+ char* encoded = new char[bufsize];
+ memset(encoded, 0, bufsize);
+ unsigned int hmacResSize = HMAC_RES_SIZE;
+ unsigned char hmacRes[HMAC_RES_SIZE];
+ unsigned long timestamp = time(NULL)/30;
+ unsigned char challenge[8];
+
+ for (int i = 8; i--;timestamp >>= 8)
+ challenge[i] = timestamp;
+
+ base32_decode(b32key, encoded, bufsize);
+ HMAC(EVP_sha1(), encoded, bufsize, challenge, 8, hmacRes, &hmacResSize);
+ unsigned int offset = hmacRes[19] & 0xF;
+ unsigned int truncHash = (hmacRes[offset] << 24) | (hmacRes[offset+1] << 16 )| (hmacRes[offset+2] << 8) | (hmacRes[offset+3]);
+ truncHash &= 0x7FFFFFFF;
+
+ delete[] encoded;
+
+ return truncHash % 1000000;
+ }
+}
diff --git a/src/server/authserver/Authentication/TOTP.h b/src/server/authserver/Authentication/TOTP.h
new file mode 100644
index 00000000000..3080e7c7787
--- /dev/null
+++ b/src/server/authserver/Authentication/TOTP.h
@@ -0,0 +1,29 @@
+/*
+ * 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 _TOTP_H
+#define _TOPT_H
+
+#include "openssl/hmac.h"
+#include "openssl/evp.h"
+
+namespace TOTP
+{
+ unsigned int GenerateToken(const char* b32key);
+}
+
+#endif
diff --git a/src/server/authserver/Server/AuthSocket.cpp b/src/server/authserver/Server/AuthSocket.cpp
index c2131f5dbf7..93c03e26c88 100644
--- a/src/server/authserver/Server/AuthSocket.cpp
+++ b/src/server/authserver/Server/AuthSocket.cpp
@@ -27,6 +27,7 @@
#include "RealmList.h"
#include "AuthSocket.h"
#include "AuthCodes.h"
+#include "TOTP.h"
#include "SHA1.h"
#include "openssl/crypto.h"
@@ -492,6 +493,12 @@ bool AuthSocket::_HandleLogonChallenge()
pkt.append(s.AsByteArray().get(), s.GetNumBytes()); // 32 bytes
pkt.append(unk3.AsByteArray(16).get(), 16);
uint8 securityFlags = 0;
+
+ // Check if token is used
+ _tokenKey = fields[8].GetString();
+ if (!_tokenKey.empty())
+ securityFlags = 4;
+
pkt << uint8(securityFlags); // security flags (0x0...0x04)
if (securityFlags & 0x01) // PIN input
@@ -652,6 +659,25 @@ bool AuthSocket::_HandleLogonProof()
sha.UpdateBigNumbers(&A, &M, &K, NULL);
sha.Finalize();
+ // Check auth token
+ if ((lp.securityFlags & 0x04) || !_tokenKey.empty())
+ {
+ uint8 size;
+ socket().recv((char*)&size, 1);
+ char* token = new char[size + 1];
+ token[size] = '\0';
+ socket().recv(token, size);
+ unsigned int validToken = TOTP::GenerateToken(_tokenKey.c_str());
+ unsigned int incomingToken = atoi(token);
+ delete[] token;
+ if (validToken != incomingToken)
+ {
+ char data[] = { AUTH_LOGON_PROOF, WOW_FAIL_UNKNOWN_ACCOUNT, 3, 0 };
+ socket().send(data, sizeof(data));
+ return false;
+ }
+ }
+
if (_expversion & POST_BC_EXP_FLAG) // 2.x and 3.x clients
{
sAuthLogonProof_S proof;
diff --git a/src/server/authserver/Server/AuthSocket.h b/src/server/authserver/Server/AuthSocket.h
index 6c13f85a022..c6513eaa5bf 100644
--- a/src/server/authserver/Server/AuthSocket.h
+++ b/src/server/authserver/Server/AuthSocket.h
@@ -69,6 +69,7 @@ private:
bool _authed;
std::string _login;
+ std::string _tokenKey;
// Since GetLocaleByName() is _NOT_ bijective, we have to store the locale as a string. Otherwise we can't differ
// between enUS and enGB, which is important for the patch system
diff --git a/src/server/collision/Maps/TileAssembler.cpp b/src/server/collision/Maps/TileAssembler.cpp
index 02300c0b34a..c504d750931 100644
--- a/src/server/collision/Maps/TileAssembler.cpp
+++ b/src/server/collision/Maps/TileAssembler.cpp
@@ -98,7 +98,16 @@ namespace VMAP
printf("Creating map tree for map %u...\n", map_iter->first);
BIH pTree;
- pTree.build(mapSpawns, BoundsTrait<ModelSpawn*>::getBounds);
+
+ try
+ {
+ pTree.build(mapSpawns, BoundsTrait<ModelSpawn*>::getBounds);
+ }
+ catch (std::exception& e)
+ {
+ printf("Exception ""%s"" when calling pTree.build", e.what());
+ return false;
+ }
// ===> possibly move this code to StaticMapTree class
std::map<uint32, uint32> modelNodeIdx;
diff --git a/src/server/game/Chat/Chat.cpp b/src/server/game/Chat/Chat.cpp
index 469a2b53b79..55440650993 100644
--- a/src/server/game/Chat/Chat.cpp
+++ b/src/server/game/Chat/Chat.cpp
@@ -695,13 +695,12 @@ void ChatHandler::FillMessageData(WorldPacket* data, WorldSession* session, uint
*data << uint32(0); // 2.1.0
*data << uint32(speaker->GetName().size() + 1);
*data << speaker->GetName();
- uint64 listener_guid = 0;
- *data << uint64(listener_guid);
- if (listener_guid && !IS_PLAYER_GUID(listener_guid))
- {
- *data << uint32(1); // string listener_name_length
- *data << uint8(0); // string listener_name
- }
+ *data << uint64(0); // listener_guid
+ //if (listener_guid && !IS_PLAYER_GUID(listener_guid))
+ //{
+ // *data << uint32(1); // string listener_name_length
+ // *data << uint8(0); // string listener_name
+ //}
*data << uint32(messageLength);
*data << message;
*data << uint8(0);
diff --git a/src/server/game/Entities/Object/Updates/UpdateMask.h b/src/server/game/Entities/Object/Updates/UpdateMask.h
index 8be8dfecdaf..72c9e9945d0 100644
--- a/src/server/game/Entities/Object/Updates/UpdateMask.h
+++ b/src/server/game/Entities/Object/Updates/UpdateMask.h
@@ -36,7 +36,7 @@ class UpdateMask
UpdateMask() : _fieldCount(0), _blockCount(0), _bits(NULL) { }
- UpdateMask(UpdateMask const& right)
+ UpdateMask(UpdateMask const& right) : _bits(NULL)
{
SetCount(right.GetCount());
memcpy(_bits, right._bits, sizeof(uint8) * _blockCount * 32);
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 3bfbc13c6c9..73f0d09cace 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -869,6 +869,8 @@ Player::Player(WorldSession* session): Unit(true), phaseMgr(this)
m_WeeklyQuestChanged = false;
+ m_MonthlyQuestChanged = false;
+
m_SeasonalQuestChanged = false;
SetPendingBind(0, 0);
@@ -6849,10 +6851,8 @@ void Player::CheckAreaExploreAndOutdoor()
}
else if (diff > 5)
{
- int32 exploration_percent = (100-((diff-5)*5));
- if (exploration_percent > 100)
- exploration_percent = 100;
- else if (exploration_percent < 0)
+ int32 exploration_percent = 100 - ((diff - 5) * 5);
+ if (exploration_percent < 0)
exploration_percent = 0;
XP = uint32(sObjectMgr->GetBaseXP(areaEntry->area_level)*exploration_percent/100*sWorld->getRate(RATE_XP_EXPLORE));
diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp
index 5ad39188fbd..dc3679e021f 100644
--- a/src/server/game/Handlers/MiscHandler.cpp
+++ b/src/server/game/Handlers/MiscHandler.cpp
@@ -1680,9 +1680,13 @@ void WorldSession::HandleRequestPetInfoOpcode(WorldPacket& /*recvData */)
void WorldSession::HandleSetTaxiBenchmarkOpcode(WorldPacket& recvData)
{
+ TC_LOG_DEBUG(LOG_FILTER_NETWORKIO, "WORLD: CMSG_SET_TAXI_BENCHMARK_MODE");
+
uint8 mode;
recvData >> mode;
+ mode ? _player->SetFlag(PLAYER_FLAGS, PLAYER_FLAGS_TAXI_BENCHMARK) : _player->RemoveFlag(PLAYER_FLAGS, PLAYER_FLAGS_TAXI_BENCHMARK);
+
TC_LOG_DEBUG(LOG_FILTER_NETWORKIO, "Client used \"/timetest %d\" command", mode);
}
diff --git a/src/server/game/Instances/InstanceScript.h b/src/server/game/Instances/InstanceScript.h
index 2d77f6792c6..44c149ba9ac 100644
--- a/src/server/game/Instances/InstanceScript.h
+++ b/src/server/game/Instances/InstanceScript.h
@@ -22,8 +22,6 @@
#include "ZoneScript.h"
#include "World.h"
#include "ObjectMgr.h"
-//#include "GameObject.h"
-//#include "Map.h"
#define OUT_SAVE_INST_DATA TC_LOG_DEBUG(LOG_FILTER_TSCR, "Saving Instance Data for Instance %s (Map %d, Instance Id %d)", instance->GetMapName(), instance->GetId(), instance->GetInstanceId())
#define OUT_SAVE_INST_DATA_COMPLETE TC_LOG_DEBUG(LOG_FILTER_TSCR, "Saving Instance Data for Instance %s (Map %d, Instance Id %d) completed.", instance->GetMapName(), instance->GetId(), instance->GetInstanceId())
@@ -241,4 +239,16 @@ class InstanceScript : public ZoneScript
MinionInfoMap minions;
uint32 completedEncounters; // completed encounter mask, bit indexes are DungeonEncounter.dbc boss numbers, used for packets
};
-#endif
+
+template<class AI, class T>
+AI* GetInstanceAI(T* obj, char const* scriptName)
+{
+ if (InstanceMap* instance = obj->GetMap()->ToInstanceMap())
+ if (instance->GetInstanceScript())
+ if (instance->GetScriptId() == sObjectMgr->GetScriptId(scriptName))
+ return new AI(obj);
+
+ return NULL;
+}
+
+#endif // TRINITY_INSTANCE_DATA_H
diff --git a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp
index 1e275b0be9f..31da239670b 100755
--- a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp
+++ b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp
@@ -218,6 +218,8 @@ void FlightPathMovementGenerator::DoFinalize(Player* player)
// when client side flight end early in comparison server side
player->StopMoving();
}
+
+ player->RemoveFlag(PLAYER_FLAGS, PLAYER_FLAGS_TAXI_BENCHMARK);
}
#define PLAYER_FLIGHT_SPEED 32.0f
diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp
index 4cb6fcc40e5..363446a72d3 100644
--- a/src/server/game/Spells/Auras/SpellAuras.cpp
+++ b/src/server/game/Spells/Auras/SpellAuras.cpp
@@ -2236,6 +2236,7 @@ void UnitAura::FillTargetMap(std::map<Unit*, uint8> & targets, Unit* caster)
}
case SPELL_EFFECT_APPLY_AREA_AURA_PET:
targetList.push_back(GetUnitOwner());
+ // no break
case SPELL_EFFECT_APPLY_AREA_AURA_OWNER:
{
if (Unit* owner = GetUnitOwner()->GetCharmerOrOwner())
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp
index 22da5257663..80349754585 100644
--- a/src/server/game/Spells/Spell.cpp
+++ b/src/server/game/Spells/Spell.cpp
@@ -6200,6 +6200,7 @@ SpellCastResult Spell::CheckItems()
return SPELL_FAILED_DONT_REPORT;
}
}
+ // no break
case SPELL_EFFECT_ENCHANT_ITEM_PRISMATIC:
{
Item* targetItem = m_targets.GetItemTarget();
diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp
index cb0ba654b42..b34b935e975 100644
--- a/src/server/game/Spells/SpellMgr.cpp
+++ b/src/server/game/Spells/SpellMgr.cpp
@@ -1224,7 +1224,7 @@ void SpellMgr::LoadSpellTalentRanks()
node.rank = rank + 1;
node.prev = prevSpell;
- node.next = node.rank < MAX_TALENT_RANK ? GetSpellInfo(talentInfo->RankID[rank + 1]) : NULL;
+ node.next = node.rank < MAX_TALENT_RANK ? GetSpellInfo(talentInfo->RankID[node.rank]) : NULL;
mSpellChains[spellId] = node;
mSpellInfoMap[spellId]->ChainEntry = &mSpellChains[spellId];
@@ -2858,6 +2858,9 @@ void SpellMgr::LoadSpellInfoCustomAttributes()
{
uint32 enchantId = spellInfo->Effects[j].MiscValue;
SpellItemEnchantmentEntry const* enchant = sSpellItemEnchantmentStore.LookupEntry(enchantId);
+ if (!enchant)
+ break;
+
for (uint8 s = 0; s < MAX_ITEM_ENCHANTMENT_EFFECTS; ++s)
{
if (enchant->type[s] != ITEM_ENCHANTMENT_TYPE_COMBAT_SPELL)
@@ -3386,10 +3389,6 @@ void SpellMgr::LoadSpellInfoCorrections()
case 45602: // Ride Carpet
spellInfo->Effects[EFFECT_0].BasePoints = 0; // force seat 0, vehicle doesn't have the required seat flags for "no seat specified (-1)"
break;
- case 59414: // Pulsing Shockwave Aura (Loken)
- // this flag breaks movement, remove it
- spellInfo->AttributesEx &= ~SPELL_ATTR1_CHANNELED_1;
- break;
case 61719: // Easter Lay Noblegarden Egg Aura - Interrupt flags copied from aura which this aura is linked with
spellInfo->AuraInterruptFlags = AURA_INTERRUPT_FLAG_HITBYSPELL | AURA_INTERRUPT_FLAG_TAKE_DAMAGE;
break;
@@ -3785,10 +3784,10 @@ void SpellMgr::LoadSpellInfoCorrections()
}
}
- SummonPropertiesEntry* properties = const_cast<SummonPropertiesEntry*>(sSummonPropertiesStore.LookupEntry(121));
- properties->Type = SUMMON_TYPE_TOTEM;
- properties = const_cast<SummonPropertiesEntry*>(sSummonPropertiesStore.LookupEntry(647)); // 52893
- properties->Type = SUMMON_TYPE_TOTEM;
+ if (SummonPropertiesEntry* properties = const_cast<SummonPropertiesEntry*>(sSummonPropertiesStore.LookupEntry(121)))
+ properties->Type = SUMMON_TYPE_TOTEM;
+ if (SummonPropertiesEntry* properties = const_cast<SummonPropertiesEntry*>(sSummonPropertiesStore.LookupEntry(647))) // 52893
+ properties->Type = SUMMON_TYPE_TOTEM;
TC_LOG_INFO(LOG_FILTER_SERVER_LOADING, ">> Loaded SpellInfo corrections in %u ms", GetMSTimeDiffToNow(oldMSTime));
}
diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp
index f6001e2ac7a..b92698c7daa 100644
--- a/src/server/game/World/World.cpp
+++ b/src/server/game/World/World.cpp
@@ -1141,7 +1141,7 @@ void World::LoadConfigSettings(bool reload)
///- Read the "Data" directory from the config file
std::string dataPath = sConfigMgr->GetStringDefault("DataDir", "./");
- if (dataPath.at(dataPath.length()-1) != '/' && dataPath.at(dataPath.length()-1) != '\\')
+ if (dataPath.empty() || (dataPath.at(dataPath.length()-1) != '/' && dataPath.at(dataPath.length()-1) != '\\'))
dataPath.push_back('/');
#if PLATFORM == PLATFORM_UNIX || PLATFORM == PLATFORM_APPLE
diff --git a/src/server/scripts/Commands/cs_debug.cpp b/src/server/scripts/Commands/cs_debug.cpp
index 6ef84033312..604ad76f46c 100644
--- a/src/server/scripts/Commands/cs_debug.cpp
+++ b/src/server/scripts/Commands/cs_debug.cpp
@@ -1323,7 +1323,35 @@ public:
char* mask2 = strtok(NULL, " \n");
uint32 moveFlags = (uint32)atoi(mask1);
- target->SetUnitMovementFlags(moveFlags);
+
+ static uint32 const FlagsWithHandlers = MOVEMENTFLAG_MASK_HAS_PLAYER_STATUS_OPCODE |
+ MOVEMENTFLAG_WALKING | MOVEMENTFLAG_SWIMMING |
+ MOVEMENTFLAG_SPLINE_ENABLED;
+
+ bool unhandledFlag = (moveFlags ^ target->GetUnitMovementFlags()) & ~FlagsWithHandlers;
+
+ target->SetWalk(moveFlags & MOVEMENTFLAG_WALKING);
+ target->SetDisableGravity(moveFlags & MOVEMENTFLAG_DISABLE_GRAVITY);
+ target->SetSwim(moveFlags & MOVEMENTFLAG_SWIMMING);
+ target->SetCanFly(moveFlags & MOVEMENTFLAG_CAN_FLY);
+ target->SetWaterWalking(moveFlags & MOVEMENTFLAG_WATERWALKING);
+ target->SetFeatherFall(moveFlags & MOVEMENTFLAG_FALLING_SLOW);
+ target->SetHover(moveFlags & MOVEMENTFLAG_HOVER);
+
+ if (moveFlags & (MOVEMENTFLAG_DISABLE_GRAVITY | MOVEMENTFLAG_CAN_FLY))
+ moveFlags &= ~MOVEMENTFLAG_FALLING;
+
+ if (moveFlags & MOVEMENTFLAG_ROOT)
+ {
+ target->SetControlled(true, UNIT_STATE_ROOT);
+ moveFlags &= ~MOVEMENTFLAG_MASK_MOVING;
+ }
+
+ if (target->HasUnitMovementFlag(MOVEMENTFLAG_SPLINE_ENABLED) && !(moveFlags & MOVEMENTFLAG_SPLINE_ENABLED))
+ target->StopMoving();
+
+ if (unhandledFlag)
+ target->SetUnitMovementFlags(moveFlags);
if (mask2)
{
diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp
index be2aeb9e223..caf2719eff9 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp
@@ -169,7 +169,7 @@ public:
{
if (InstanceScript* instance = go->GetInstanceScript())
if (instance->GetData(DATA_EGG_EVENT) != DONE)
- if (Creature* razor = Unit::GetCreature(*go, instance ? instance->GetData64(DATA_RAZORGORE_THE_UNTAMED) : 0))
+ if (Creature* razor = Unit::GetCreature(*go, instance->GetData64(DATA_RAZORGORE_THE_UNTAMED)))
{
razor->Attack(player, true);
player->CastSpell(razor, SPELL_MINDCONTROL);
diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_eredar_twins.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_eredar_twins.cpp
index 0e58cb85c4b..d402eccedd4 100644
--- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_eredar_twins.cpp
+++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_eredar_twins.cpp
@@ -473,6 +473,7 @@ public:
{
case SPELL_BLAZE:
target->CastSpell(target, SPELL_BLAZE_SUMMON, true);
+ break;
case SPELL_CONFLAGRATION:
case SPELL_FLAME_SEAR:
HandleTouchedSpells(target, SPELL_FLAME_TOUCHED);
diff --git a/src/server/scripts/EasternKingdoms/zone_western_plaguelands.cpp b/src/server/scripts/EasternKingdoms/zone_western_plaguelands.cpp
index 4057f4070b1..8937e896faf 100644
--- a/src/server/scripts/EasternKingdoms/zone_western_plaguelands.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_western_plaguelands.cpp
@@ -361,13 +361,12 @@ public:
break;
case 15:
Talk(SAY_WP_2);
+ break;
case 21:
Theldanis = GetClosestCreatureWithEntry(me, NPC_THEL_DANIS, 150);
if (Theldanis)
Theldanis->AI()->Talk(SAY_WP_3);
break;
- case 22:
- break;
case 23:
Ughost = me->SummonCreature(NPC_GHOST_UTHER, 971.86f, -1825.42f, 81.99f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
if (Ughost)
diff --git a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/ahnkahet.h b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/ahnkahet.h
index 8473ee1d39d..5b8cf0a4d44 100644
--- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/ahnkahet.h
+++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/ahnkahet.h
@@ -18,33 +18,71 @@
#ifndef AHNKAHET_H_
#define AHNKAHET_H_
-enum Data64
+#define AhnKahetScriptName "instance_ahnkahet"
+
+uint32 const EncounterCount = 5;
+
+enum DataTypes
+{
+ // Encounter States/Boss GUIDs
+ DATA_ELDER_NADOX = 0,
+ DATA_PRINCE_TALDARAM = 1,
+ DATA_JEDOGA_SHADOWSEEKER = 2,
+ DATA_AMANITAR = 3,
+ DATA_HERALD_VOLAZJ = 4,
+
+ // Additional Data
+ DATA_SPHERE_1 = 5,
+ DATA_SPHERE_2 = 6,
+ DATA_PRINCE_TALDARAM_PLATFORM = 7,
+ DATA_PL_JEDOGA_TARGET = 8,
+ DATA_ADD_JEDOGA_OPFER = 9,
+ DATA_ADD_JEDOGA_INITIAND = 10,
+ DATA_JEDOGA_TRIGGER_SWITCH = 11,
+ DATA_JEDOGA_RESET_INITIANDS = 12,
+ DATA_ALL_INITIAND_DEAD = 13
+};
+
+enum CreatureIds
{
- DATA_ELDER_NADOX,
- DATA_PRINCE_TALDARAM,
- DATA_JEDOGA_SHADOWSEEKER,
- DATA_HERALD_VOLAZJ,
- DATA_AMANITAR,
- DATA_SPHERE1,
- DATA_SPHERE2,
- DATA_PRINCE_TALDARAM_PLATFORM,
- DATA_PL_JEDOGA_TARGET,
- DATA_ADD_JEDOGA_OPFER,
- DATA_ADD_JEDOGA_INITIAND
+ NPC_ELDER_NADOX = 29309,
+ NPC_PRINCE_TALDARAM = 29308,
+ NPC_JEDOGA_SHADOWSEEKER = 29310,
+ NPC_AMANITAR = 30258,
+ NPC_HERALD_VOLAZJ = 29311,
+
+ // Elder Nadox
+ NPC_AHNKAHAR_GUARDIAN = 30176,
+ NPC_AHNKAHAR_SWARMER = 30178,
+
+ // Jedoga Shadowseeker
+ NPC_INITIAND = 30114,
+ NPC_JEDOGA_CONTROLLER = 30181,
+
+ // Amanitar
+ NPC_HEALTHY_MUSHROOM = 30391,
+ NPC_POISONOUS_MUSHROOM = 30435,
+
+ // Herald Volazj
+ //NPC_TWISTED_VISAGE_1 = 30621,
+ //NPC_TWISTED_VISAGE_2 = 30622,
+ //NPC_TWISTED_VISAGE_3 = 30623,
+ //NPC_TWISTED_VISAGE_4 = 30624,
+ NPC_TWISTED_VISAGE = 30625
};
-enum Data
+enum GameObjectIds
{
- DATA_ELDER_NADOX_EVENT,
- DATA_PRINCE_TALDARAM_EVENT,
- DATA_JEDOGA_SHADOWSEEKER_EVENT,
- DATA_HERALD_VOLAZJ_EVENT,
- DATA_AMANITAR_EVENT,
- DATA_SPHERE1_EVENT,
- DATA_SPHERE2_EVENT,
- DATA_JEDOGA_TRIGGER_SWITCH,
- DATA_JEDOGA_RESET_INITIANDS,
- DATA_ALL_INITIAND_DEAD
+ GO_PRINCE_TALDARAM_GATE = 192236,
+ GO_PRINCE_TALDARAM_PLATFORM = 193564,
+ GO_SPHERE_1 = 193093,
+ GO_SPHERE_2 = 193094
};
+template<class AI>
+AI* GetAhnKahetAI(Creature* creature)
+{
+ return GetInstanceAI<AI>(creature, AhnKahetScriptName);
+}
+
#endif // AHNKAHET_H_
diff --git a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_amanitar.cpp b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_amanitar.cpp
index 7a20d1f581c..7132ba825f1 100644
--- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_amanitar.cpp
+++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_amanitar.cpp
@@ -35,8 +35,6 @@ enum Spells
enum Creatures
{
- NPC_HEALTHY_MUSHROOM = 30391,
- NPC_POISONOUS_MUSHROOM = 30435,
NPC_TRIGGER = 19656
};
@@ -52,129 +50,112 @@ enum Events
class boss_amanitar : public CreatureScript
{
-public:
- boss_amanitar() : CreatureScript("boss_amanitar") { }
-
- struct boss_amanitarAI : public BossAI
- {
- boss_amanitarAI(Creature* creature) : BossAI(creature, DATA_AMANITAR) { }
+ public:
+ boss_amanitar() : CreatureScript("boss_amanitar") { }
- void Reset() OVERRIDE
+ struct boss_amanitarAI : public BossAI
{
- _Reset();
+ boss_amanitarAI(Creature* creature) : BossAI(creature, DATA_AMANITAR) { }
- me->SetMeleeDamageSchool(SPELL_SCHOOL_NATURE);
- me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_NATURE, true);
- summons.DespawnAll();
+ void Reset() OVERRIDE
+ {
+ _Reset();
+ me->SetMeleeDamageSchool(SPELL_SCHOOL_NATURE);
+ me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_NATURE, true);
+ }
- if (instance)
+ void EnterCombat(Unit* /*who*/) OVERRIDE
{
- instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_MINI);
- instance->SetData(DATA_AMANITAR_EVENT, NOT_STARTED);
+ _EnterCombat();
+
+ events.ScheduleEvent(EVENT_ROOT, urand(5, 9) * IN_MILLISECONDS);
+ events.ScheduleEvent(EVENT_BASH, urand(10, 14) * IN_MILLISECONDS);
+ events.ScheduleEvent(EVENT_BOLT, urand(15, 20) * IN_MILLISECONDS);
+ events.ScheduleEvent(EVENT_MINI, urand(12, 18) * IN_MILLISECONDS);
+ events.ScheduleEvent(EVENT_SPAWN, 5 * IN_MILLISECONDS);
}
- }
- void JustDied(Unit* /*Killer*/) OVERRIDE
- {
- if (instance)
+ void JustDied(Unit* /*killer*/) OVERRIDE
{
_JustDied();
- instance->SetData(DATA_AMANITAR_EVENT, DONE);
instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_MINI);
- summons.DespawnAll();
}
- }
-
- void EnterCombat(Unit* /*who*/) OVERRIDE
- {
- _EnterCombat();
-
- events.ScheduleEvent(EVENT_ROOT, urand(5, 9) * IN_MILLISECONDS);
- events.ScheduleEvent(EVENT_BASH, urand(10, 14) * IN_MILLISECONDS);
- events.ScheduleEvent(EVENT_BOLT, urand(15, 20) * IN_MILLISECONDS);
- events.ScheduleEvent(EVENT_MINI, urand(12, 18) * IN_MILLISECONDS);
- events.ScheduleEvent(EVENT_SPAWN, 5 * IN_MILLISECONDS);
- me->SetInCombatWithZone();
- if (instance)
- instance->SetData(DATA_AMANITAR_EVENT, IN_PROGRESS);
- }
-
- void SpawnAdds()
- {
- uint8 u = 0;
-
- for (uint8 i = 0; i < 30; ++i)
+ void SpawnAdds()
{
- Position pos;
- me->GetPosition(&pos);
- me->GetRandomNearPosition(pos, 30.0f);
- pos.m_positionZ = me->GetMap()->GetHeight(pos.GetPositionX(), pos.GetPositionY(), MAX_HEIGHT) + 2.0f;
+ uint8 u = 0;
- if (Creature* trigger = me->SummonCreature(NPC_TRIGGER, pos))
+ for (uint8 i = 0; i < 30; ++i)
{
- Creature* temp1 = trigger->FindNearestCreature(NPC_HEALTHY_MUSHROOM, 4.0f, true);
- Creature* temp2 = trigger->FindNearestCreature(NPC_POISONOUS_MUSHROOM, 4.0f, true);
- if (temp1 || temp2)
- {
- trigger->DisappearAndDie();
- }
- else
+ Position pos;
+ me->GetPosition(&pos);
+ me->GetRandomNearPosition(pos, 30.0f);
+ pos.m_positionZ = me->GetMap()->GetHeight(pos.GetPositionX(), pos.GetPositionY(), MAX_HEIGHT) + 2.0f;
+
+ if (Creature* trigger = me->SummonCreature(NPC_TRIGGER, pos))
{
- u = 1 - u;
- trigger->DisappearAndDie();
- me->SummonCreature(u > 0 ? NPC_POISONOUS_MUSHROOM : NPC_HEALTHY_MUSHROOM, pos, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 60 * IN_MILLISECONDS);
+ Creature* temp1 = trigger->FindNearestCreature(NPC_HEALTHY_MUSHROOM, 4.0f, true);
+ Creature* temp2 = trigger->FindNearestCreature(NPC_POISONOUS_MUSHROOM, 4.0f, true);
+ if (temp1 || temp2)
+ {
+ trigger->DisappearAndDie();
+ }
+ else
+ {
+ u = 1 - u;
+ trigger->DisappearAndDie();
+ me->SummonCreature(u > 0 ? NPC_POISONOUS_MUSHROOM : NPC_HEALTHY_MUSHROOM, pos, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 60 * IN_MILLISECONDS);
+ }
}
}
}
- }
- void UpdateAI(uint32 diff) OVERRIDE
- {
- if (!UpdateVictim())
- return;
+ void UpdateAI(uint32 diff) OVERRIDE
+ {
+ if (!UpdateVictim())
+ return;
- events.Update(diff);
+ events.Update(diff);
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
- while (uint32 eventId = events.ExecuteEvent())
- {
- switch (eventId)
+ while (uint32 eventId = events.ExecuteEvent())
{
- case EVENT_SPAWN:
- SpawnAdds();
- events.ScheduleEvent(EVENT_SPAWN, 20 * IN_MILLISECONDS);
- break;
- case EVENT_MINI:
- DoCast(SPELL_MINI);
- events.ScheduleEvent(EVENT_MINI, urand(25, 30) * IN_MILLISECONDS);
- break;
- case EVENT_ROOT:
- DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true), SPELL_ENTANGLING_ROOTS, true);
- events.ScheduleEvent(EVENT_ROOT, urand(10, 15) * IN_MILLISECONDS);
- break;
- case EVENT_BASH:
- DoCastVictim(SPELL_BASH);
- events.ScheduleEvent(EVENT_BASH, urand(7, 12) * IN_MILLISECONDS);
- break;
- case EVENT_BOLT:
- DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true), SPELL_VENOM_BOLT_VOLLEY, true);
- events.ScheduleEvent(EVENT_BOLT, urand(18, 22) * IN_MILLISECONDS);
- break;
- default:
- break;
+ switch (eventId)
+ {
+ case EVENT_SPAWN:
+ SpawnAdds();
+ events.ScheduleEvent(EVENT_SPAWN, 20 * IN_MILLISECONDS);
+ break;
+ case EVENT_MINI:
+ DoCast(SPELL_MINI);
+ events.ScheduleEvent(EVENT_MINI, urand(25, 30) * IN_MILLISECONDS);
+ break;
+ case EVENT_ROOT:
+ DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true), SPELL_ENTANGLING_ROOTS, true);
+ events.ScheduleEvent(EVENT_ROOT, urand(10, 15) * IN_MILLISECONDS);
+ break;
+ case EVENT_BASH:
+ DoCastVictim(SPELL_BASH);
+ events.ScheduleEvent(EVENT_BASH, urand(7, 12) * IN_MILLISECONDS);
+ break;
+ case EVENT_BOLT:
+ DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true), SPELL_VENOM_BOLT_VOLLEY, true);
+ events.ScheduleEvent(EVENT_BOLT, urand(18, 22) * IN_MILLISECONDS);
+ break;
+ default:
+ break;
+ }
}
+ DoMeleeAttackIfReady();
}
- DoMeleeAttackIfReady();
- }
- };
+ };
- CreatureAI* GetAI(Creature* creature) const OVERRIDE
- {
- return new boss_amanitarAI(creature);
- }
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return GetAhnKahetAI<boss_amanitarAI>(creature);
+ }
};
class npc_amanitar_mushrooms : public CreatureScript
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 482617cbfd5..4fa150511b5 100644
--- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_elder_nadox.cpp
+++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_elder_nadox.cpp
@@ -41,12 +41,6 @@ enum Spells
SPELL_GUARDIAN_AURA = 56151
};
-enum Creatures
-{
- NPC_AHNKAHAR_SWARMER = 30178,
- NPC_AHNKAHAR_GUARDIAN = 30176
-};
-
enum Events
{
EVENT_PLAGUE = 1,
@@ -62,38 +56,22 @@ class boss_elder_nadox : public CreatureScript
public:
boss_elder_nadox() : CreatureScript("boss_elder_nadox") { }
- struct boss_elder_nadoxAI : public ScriptedAI
+ struct boss_elder_nadoxAI : public BossAI
{
- boss_elder_nadoxAI(Creature* creature) : ScriptedAI(creature), summons(me)
- {
- instance = creature->GetInstanceScript();
- }
-
- bool GuardianDied;
- uint8 AmountHealthModifier;
- InstanceScript* instance;
- SummonList summons;
- EventMap events;
+ boss_elder_nadoxAI(Creature* creature) : BossAI(creature, DATA_ELDER_NADOX) { }
void Reset() OVERRIDE
{
- events.Reset();
- summons.DespawnAll();
-
+ _Reset();
AmountHealthModifier = 1;
GuardianDied = false;
-
- if (instance)
- instance->SetData(DATA_ELDER_NADOX_EVENT, NOT_STARTED);
}
void EnterCombat(Unit* /*who*/) OVERRIDE
{
+ _EnterCombat();
Talk(SAY_AGGRO);
- if (instance)
- instance->SetData(DATA_ELDER_NADOX_EVENT, IN_PROGRESS);
-
events.ScheduleEvent(EVENT_PLAGUE, 13 * IN_MILLISECONDS);
events.ScheduleEvent(EVENT_SUMMON_SWARMER, 10 * IN_MILLISECONDS);
@@ -104,12 +82,6 @@ class boss_elder_nadox : public CreatureScript
}
}
- void JustSummoned(Creature* summon) OVERRIDE
- {
- summons.Summon(summon);
- summon->AI()->DoZoneInCombat();
- }
-
void SummonedCreatureDies(Creature* summon, Unit* /*killer*/) OVERRIDE
{
if (summon->GetEntry() == NPC_AHNKAHAR_GUARDIAN)
@@ -124,19 +96,16 @@ class boss_elder_nadox : public CreatureScript
return 0;
}
- void KilledUnit(Unit* /*victim*/) OVERRIDE
+ void KilledUnit(Unit* who) OVERRIDE
{
- Talk(SAY_SLAY);
+ if (who->GetTypeId() == TYPEID_PLAYER)
+ Talk(SAY_SLAY);
}
void JustDied(Unit* /*killer*/) OVERRIDE
{
+ _JustDied();
Talk(SAY_DEATH);
-
- summons.DespawnAll();
-
- if (instance)
- instance->SetData(DATA_ELDER_NADOX_EVENT, DONE);
}
void UpdateAI(uint32 diff) OVERRIDE
@@ -185,11 +154,15 @@ class boss_elder_nadox : public CreatureScript
DoMeleeAttackIfReady();
}
+
+ private:
+ bool GuardianDied;
+ uint8 AmountHealthModifier;
};
CreatureAI* GetAI(Creature* creature) const OVERRIDE
{
- return new boss_elder_nadoxAI(creature);
+ return GetAhnKahetAI<boss_elder_nadoxAI>(creature);
}
};
diff --git a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_herald_volazj.cpp b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_herald_volazj.cpp
index 481df79c890..5bb68a4c886 100644
--- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_herald_volazj.cpp
+++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_herald_volazj.cpp
@@ -41,12 +41,6 @@ enum Spells
SPELL_INSANITY_PHASING_5 = 57512
};
-enum Creatures
-{
- NPC_TWISTED_VISAGE = 30625
-};
-
-
enum Yells
{
SAY_AGGRO = 0,
@@ -157,7 +151,7 @@ public:
if (instance)
{
- instance->SetData(DATA_HERALD_VOLAZJ, NOT_STARTED);
+ instance->SetBossState(DATA_HERALD_VOLAZJ, NOT_STARTED);
instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_QUICK_DEMISE_START_EVENT);
}
@@ -180,7 +174,7 @@ public:
if (instance)
{
- instance->SetData(DATA_HERALD_VOLAZJ, IN_PROGRESS);
+ instance->SetBossState(DATA_HERALD_VOLAZJ, IN_PROGRESS);
instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_QUICK_DEMISE_START_EVENT);
}
}
@@ -302,7 +296,7 @@ public:
Talk(SAY_DEATH);
if (instance)
- instance->SetData(DATA_HERALD_VOLAZJ, DONE);
+ instance->SetBossState(DATA_HERALD_VOLAZJ, DONE);
Summons.DespawnAll();
ResetPlayersPhaseMask();
diff --git a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_jedoga_shadowseeker.cpp b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_jedoga_shadowseeker.cpp
index 5095f590fdb..78513fec486 100644
--- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_jedoga_shadowseeker.cpp
+++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_jedoga_shadowseeker.cpp
@@ -46,11 +46,6 @@ enum Spells
SPELL_THUNDERSHOCK_H = 60029 // 30Y
};
-enum Creatures
-{
- NPC_JEDOGA_CONTROLLER = 30181
-};
-
const Position JedogaPosition[2] =
{
{372.330994f, -705.278015f, -0.624178f, 5.427970f},
@@ -109,7 +104,7 @@ public:
if (instance)
{
if (!bFirstTime)
- instance->SetData(DATA_JEDOGA_SHADOWSEEKER_EVENT, FAIL);
+ instance->SetBossState(DATA_JEDOGA_SHADOWSEEKER, FAIL);
instance->SetData64(DATA_PL_JEDOGA_TARGET, 0);
instance->SetData64(DATA_ADD_JEDOGA_OPFER, 0);
@@ -127,7 +122,7 @@ public:
Talk(TEXT_AGGRO);
me->SetInCombatWithZone();
- instance->SetData(DATA_JEDOGA_SHADOWSEEKER_EVENT, IN_PROGRESS);
+ instance->SetBossState(DATA_JEDOGA_SHADOWSEEKER, IN_PROGRESS);
}
void AttackStart(Unit* who) OVERRIDE
@@ -150,7 +145,7 @@ public:
{
Talk(TEXT_DEATH);
if (instance)
- instance->SetData(DATA_JEDOGA_SHADOWSEEKER_EVENT, DONE);
+ instance->SetBossState(DATA_JEDOGA_SHADOWSEEKER, DONE);
}
void DoAction(int32 action) OVERRIDE
@@ -168,7 +163,6 @@ public:
}
void MoveInLineOfSight(Unit* who) OVERRIDE
-
{
if (!instance || !who || (who->GetTypeId() == TYPEID_UNIT && who->GetEntry() == NPC_JEDOGA_CONTROLLER))
return;
@@ -179,7 +173,7 @@ public:
bPreDone = true;
}
- if (instance->GetData(DATA_JEDOGA_SHADOWSEEKER_EVENT) != IN_PROGRESS || !bOnGround)
+ if (instance->GetBossState(DATA_JEDOGA_SHADOWSEEKER) != IN_PROGRESS || !bOnGround)
return;
if (!me->GetVictim() && me->CanCreatureAttack(who))
@@ -229,7 +223,7 @@ public:
{
AttackStart(target);
instance->SetData(DATA_JEDOGA_RESET_INITIANDS, 0);
- if (instance->GetData(DATA_JEDOGA_SHADOWSEEKER_EVENT) != IN_PROGRESS)
+ if (instance->GetBossState(DATA_JEDOGA_SHADOWSEEKER) != IN_PROGRESS)
EnterCombat(target);
}
else if (!me->IsInCombat())
@@ -252,7 +246,8 @@ public:
me->GetMotionMaster()->MovePoint(0, JedogaPosition[0]);
instance->SetData(DATA_JEDOGA_TRIGGER_SWITCH, 1);
- if (instance->GetData(DATA_JEDOGA_SHADOWSEEKER_EVENT) == IN_PROGRESS) OpferRufen();
+ if (instance->GetBossState(DATA_JEDOGA_SHADOWSEEKER) == IN_PROGRESS)
+ OpferRufen();
bOnGround = false;
uiOpFerTimer = urand(15*IN_MILLISECONDS, 30*IN_MILLISECONDS);
@@ -289,7 +284,7 @@ public:
if (!instance)
return;
- if (instance->GetData(DATA_JEDOGA_SHADOWSEEKER_EVENT) != IN_PROGRESS && instance->GetData(DATA_ALL_INITIAND_DEAD))
+ if (instance->GetBossState(DATA_JEDOGA_SHADOWSEEKER) != IN_PROGRESS && instance->GetData(DATA_ALL_INITIAND_DEAD))
MoveDown();
if (bOpFerok && !bOnGround && !bCanDown) Opfern();
@@ -372,7 +367,7 @@ public:
bWalking = false;
bCheckTimer = 2*IN_MILLISECONDS;
- if (instance->GetData(DATA_JEDOGA_SHADOWSEEKER_EVENT) != IN_PROGRESS)
+ if (instance->GetBossState(DATA_JEDOGA_SHADOWSEEKER) != IN_PROGRESS)
{
me->RemoveAurasDueToSpell(SPELL_SPHERE_VISUAL);
me->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, false);
@@ -412,15 +407,13 @@ public:
instance->SetData64(DATA_PL_JEDOGA_TARGET, killer->GetGUID());
}
- void EnterCombat(Unit* who) OVERRIDE
+ void EnterCombat(Unit* /*who*/) OVERRIDE
{
- if ((instance && instance->GetData(DATA_JEDOGA_SHADOWSEEKER_EVENT) == IN_PROGRESS) || !who)
- return;
}
void AttackStart(Unit* victim) OVERRIDE
{
- if ((instance && instance->GetData(DATA_JEDOGA_SHADOWSEEKER_EVENT) == IN_PROGRESS) || !victim)
+ if ((instance && instance->GetBossState(DATA_JEDOGA_SHADOWSEEKER) == IN_PROGRESS) || !victim)
return;
ScriptedAI::AttackStart(victim);
@@ -429,7 +422,7 @@ public:
void MoveInLineOfSight(Unit* who) OVERRIDE
{
- if ((instance && instance->GetData(DATA_JEDOGA_SHADOWSEEKER_EVENT) == IN_PROGRESS) || !who)
+ if ((instance && instance->GetBossState(DATA_JEDOGA_SHADOWSEEKER) == IN_PROGRESS) || !who)
return;
ScriptedAI::MoveInLineOfSight(who);
@@ -482,14 +475,14 @@ public:
}
if (!bWalking)
{
- if (instance->GetData(DATA_JEDOGA_SHADOWSEEKER_EVENT) != IN_PROGRESS && me->HasAura(SPELL_SPHERE_VISUAL))
+ if (instance->GetBossState(DATA_JEDOGA_SHADOWSEEKER) != IN_PROGRESS && me->HasAura(SPELL_SPHERE_VISUAL))
{
me->RemoveAurasDueToSpell(SPELL_SPHERE_VISUAL);
me->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, false);
me->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_MAGIC, false);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE + UNIT_FLAG_NON_ATTACKABLE);
}
- if (instance->GetData(DATA_JEDOGA_SHADOWSEEKER_EVENT) == IN_PROGRESS && !me->HasAura(SPELL_SPHERE_VISUAL))
+ if (instance->GetBossState(DATA_JEDOGA_SHADOWSEEKER) == IN_PROGRESS && !me->HasAura(SPELL_SPHERE_VISUAL))
{
DoCast(me, SPELL_SPHERE_VISUAL, false);
me->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, true);
@@ -561,7 +554,7 @@ public:
if (!bRemoved && me->GetPositionX() > 440.0f)
{
- if (instance->GetData(DATA_PRINCE_TALDARAM_EVENT) == DONE)
+ if (instance->GetBossState(DATA_PRINCE_TALDARAM) == DONE)
{
me->InterruptNonMeleeSpells(true);
bRemoved = true;
@@ -585,7 +578,7 @@ public:
me->InterruptNonMeleeSpells(true);
bCasted2 = false;
}
- if (!bRemoved2 && instance->GetData(DATA_JEDOGA_SHADOWSEEKER_EVENT) == DONE)
+ if (!bRemoved2 && instance->GetBossState(DATA_JEDOGA_SHADOWSEEKER) == DONE)
{
me->InterruptNonMeleeSpells(true);
bRemoved2 = true;
diff --git a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_prince_taldaram.cpp b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_prince_taldaram.cpp
index 2cfc714c1f7..2f01cc734e6 100644
--- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_prince_taldaram.cpp
+++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_prince_taldaram.cpp
@@ -69,11 +69,6 @@ enum CombatPhase
VANISHED,
FEEDING
};
-enum GameObjects
-{
- GO_SPHERE1 = 193093,
- GO_SPHERE2 = 193094
-};
class boss_taldaram : public CreatureScript
{
@@ -113,13 +108,13 @@ public:
uiPhaseTimer = 0;
uiEmbraceTarget = 0;
if (instance)
- instance->SetData(DATA_PRINCE_TALDARAM_EVENT, NOT_STARTED);
+ instance->SetBossState(DATA_PRINCE_TALDARAM, NOT_STARTED);
}
void EnterCombat(Unit* /*who*/) OVERRIDE
{
if (instance)
- instance->SetData(DATA_PRINCE_TALDARAM_EVENT, IN_PROGRESS);
+ instance->SetBossState(DATA_PRINCE_TALDARAM, IN_PROGRESS);
Talk(SAY_AGGRO);
}
@@ -267,7 +262,7 @@ public:
Talk(SAY_DEATH);
if (instance)
- instance->SetData(DATA_PRINCE_TALDARAM_EVENT, DONE);
+ instance->SetBossState(DATA_PRINCE_TALDARAM, DONE);
}
void KilledUnit(Unit* victim) OVERRIDE
@@ -287,21 +282,10 @@ public:
bool CheckSpheres()
{
- if (!instance)
- return false;
-
- uint64 uiSphereGuids[2];
- uiSphereGuids[0] = instance->GetData64(DATA_SPHERE1);
- uiSphereGuids[1] = instance->GetData64(DATA_SPHERE2);
-
- for (uint8 i=0; i < 2; ++i)
- {
- GameObject* pSpheres = instance->instance->GetGameObject(uiSphereGuids[i]);
- if (!pSpheres)
+ for (uint8 i = 0; i < 2; ++i)
+ if (!instance->GetData(DATA_SPHERE_1 + i))
return false;
- if (pSpheres->GetGoState() != GO_STATE_ACTIVE)
- return false;
- }
+
RemovePrison();
return true;
}
@@ -332,7 +316,7 @@ public:
CreatureAI* GetAI(Creature* creature) const OVERRIDE
{
- return new boss_taldaramAI(creature);
+ return GetAhnKahetAI<boss_taldaramAI>(creature);
}
};
@@ -390,39 +374,38 @@ public:
class prince_taldaram_sphere : public GameObjectScript
{
-public:
- prince_taldaram_sphere() : GameObjectScript("prince_taldaram_sphere") { }
-
- bool OnGossipHello(Player* /*player*/, GameObject* go) OVERRIDE
- {
- InstanceScript* instance = go->GetInstanceScript();
- if (!instance)
- return true;
+ public:
+ prince_taldaram_sphere() : GameObjectScript("prince_taldaram_sphere") { }
- Creature* pPrinceTaldaram = Unit::GetCreature(*go, instance->GetData64(DATA_PRINCE_TALDARAM));
- if (pPrinceTaldaram && pPrinceTaldaram->IsAlive())
+ bool OnGossipHello(Player* /*player*/, GameObject* go)
{
- // maybe these are hacks :(
- go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
- go->SetGoState(GO_STATE_ACTIVE);
+ InstanceScript* instance = go->GetInstanceScript();
+ if (!instance)
+ return false;
- switch (go->GetEntry())
+ Creature* PrinceTaldaram = ObjectAccessor::GetCreature(*go, instance->GetData64(DATA_PRINCE_TALDARAM));
+ if (PrinceTaldaram && PrinceTaldaram->IsAlive())
{
- case GO_SPHERE1:
- instance->SetData(DATA_SPHERE1_EVENT, IN_PROGRESS);
- pPrinceTaldaram->AI()->Talk(SAY_1);
- break;
+ // maybe these are hacks :(
+ go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
+ go->SetGoState(GO_STATE_ACTIVE);
- case GO_SPHERE2:
- instance->SetData(DATA_SPHERE2_EVENT, IN_PROGRESS);
- pPrinceTaldaram->AI()->Talk(SAY_1);
- break;
- }
+ switch (go->GetEntry())
+ {
+ case GO_SPHERE_1:
+ instance->SetData(DATA_SPHERE_1, IN_PROGRESS);
+ PrinceTaldaram->AI()->Talk(SAY_1);
+ break;
+ case GO_SPHERE_2:
+ instance->SetData(DATA_SPHERE_2, IN_PROGRESS);
+ PrinceTaldaram->AI()->Talk(SAY_1);
+ break;
+ }
- CAST_AI(boss_taldaram::boss_taldaramAI, pPrinceTaldaram->AI())->CheckSpheres();
+ CAST_AI(boss_taldaram::boss_taldaramAI, PrinceTaldaram->AI())->CheckSpheres();
+ }
+ return true;
}
- return true;
- }
};
void AddSC_boss_taldaram()
diff --git a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/instance_ahnkahet.cpp b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/instance_ahnkahet.cpp
index a7b82583d08..7207bbd3aab 100644
--- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/instance_ahnkahet.cpp
+++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/instance_ahnkahet.cpp
@@ -20,321 +20,314 @@
#include "InstanceScript.h"
#include "ahnkahet.h"
-/* Ahn'kahet encounters:
-0 - Elder Nadox
-1 - Prince Taldaram
-2 - Jedoga Shadowseeker
-3 - Herald Volazj
-4 - Amanitar (Heroic only)
-*/
-
-#define MAX_ENCOUNTER 5
-
-enum Achievements
+DoorData const doorData[] =
{
- ACHIEV_VOLUNTEER_WORK = 2056
+ { GO_PRINCE_TALDARAM_GATE, DATA_PRINCE_TALDARAM, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
+ { 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE } // END
};
class instance_ahnkahet : public InstanceMapScript
{
-public:
- instance_ahnkahet() : InstanceMapScript("instance_ahnkahet", 619) { }
-
- struct instance_ahnkahet_InstanceScript : public InstanceScript
- {
- instance_ahnkahet_InstanceScript(Map* map) : InstanceScript(map) {}
-
- uint64 Elder_Nadox;
- uint64 Prince_Taldaram;
- uint64 Jedoga_Shadowseeker;
- uint64 Herald_Volazj;
- uint64 Amanitar;
-
- uint64 Prince_TaldaramSpheres[2];
- uint64 Prince_TaldaramPlatform;
- uint64 Prince_TaldaramGate;
-
- std::set<uint64> InitiandGUIDs;
- uint64 JedogaSacrifices;
- uint64 JedogaTarget;
+ public:
+ instance_ahnkahet() : InstanceMapScript(AhnKahetScriptName, 619) { }
- uint32 m_auiEncounter[MAX_ENCOUNTER];
- uint32 spheres[2];
+ struct instance_ahnkahet_InstanceScript : public InstanceScript
+ {
+ instance_ahnkahet_InstanceScript(Map* map) : InstanceScript(map)
+ {
+ SetBossNumber(EncounterCount);
+ LoadDoorData(doorData);
- uint8 InitiandCnt;
- uint8 switchtrigger;
+ ElderNadoxGUID = 0;
+ PrinceTaldaramGUID = 0;
+ JedogaShadowseekerGUID = 0;
+ AmanitarGUID = 0;
+ HeraldVolazjGUID = 0;
- std::string str_data;
+ PrinceTaldaramPlatformGUID = 0;
+ JedogaSacrifices = 0;
+ JedogaTarget = 0;
+ SwitchTrigger = 0;
- void Initialize() OVERRIDE
- {
- memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
- InitiandGUIDs.clear();
-
- Elder_Nadox =0;
- Prince_Taldaram =0;
- Jedoga_Shadowseeker =0;
- Herald_Volazj =0;
- Amanitar =0;
-
- spheres[0] = NOT_STARTED;
- spheres[1] = NOT_STARTED;
-
- InitiandCnt = 0;
- switchtrigger = 0;
- JedogaSacrifices = 0;
- JedogaTarget = 0;
- }
+ SpheresState[0] = 0;
+ SpheresState[1] = 0;
- bool IsEncounterInProgress() const OVERRIDE
- {
- for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
- if (m_auiEncounter[i] == IN_PROGRESS)
- return true;
+ InitiandGUIDs.clear();
+ }
- return false;
- }
+ void OnCreatureCreate(Creature* creature) OVERRIDE
+ {
+ switch (creature->GetEntry())
+ {
+ case NPC_ELDER_NADOX:
+ ElderNadoxGUID = creature->GetGUID();
+ break;
+ case NPC_PRINCE_TALDARAM:
+ PrinceTaldaramGUID = creature->GetGUID();
+ break;
+ case NPC_JEDOGA_SHADOWSEEKER:
+ JedogaShadowseekerGUID = creature->GetGUID();
+ break;
+ case NPC_AMANITAR:
+ AmanitarGUID = creature->GetGUID();
+ break;
+ case NPC_HERALD_VOLAZJ:
+ HeraldVolazjGUID = creature->GetGUID();
+ break;
+ case NPC_INITIAND:
+ InitiandGUIDs.insert(creature->GetGUID());
+ break;
+ default:
+ break;
+ }
+ }
- void OnCreatureCreate(Creature* creature) OVERRIDE
- {
- switch (creature->GetEntry())
+ void OnGameObjectCreate(GameObject* go) OVERRIDE
{
- case 29309: Elder_Nadox = creature->GetGUID(); break;
- case 29308: Prince_Taldaram = creature->GetGUID(); break;
- case 29310: Jedoga_Shadowseeker = creature->GetGUID(); break;
- case 29311: Herald_Volazj = creature->GetGUID(); break;
- case 30258: Amanitar = creature->GetGUID(); break;
- case 30114: InitiandGUIDs.insert(creature->GetGUID()); break;
+ switch (go->GetEntry())
+ {
+ case GO_PRINCE_TALDARAM_PLATFORM:
+ PrinceTaldaramPlatformGUID = go->GetGUID();
+ if (GetBossState(DATA_PRINCE_TALDARAM) == DONE)
+ HandleGameObject(0, true, go);
+ break;
+ case GO_SPHERE_1:
+ if (SpheresState[0])
+ {
+ go->SetGoState(GO_STATE_ACTIVE);
+ go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
+ }
+ else
+ go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
+ break;
+ case GO_SPHERE_2:
+ if (SpheresState[1])
+ {
+ go->SetGoState(GO_STATE_ACTIVE);
+ go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
+ }
+ else
+ go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
+ break;
+ case GO_PRINCE_TALDARAM_GATE:
+ AddDoor(go, true);
+ break;
+ default:
+ break;
+ }
}
- }
- void OnGameObjectCreate(GameObject* go) OVERRIDE
- {
- switch (go->GetEntry())
+ void OnGameObjectRemove(GameObject* go) OVERRIDE
{
- case 193564:
- Prince_TaldaramPlatform = go->GetGUID();
- if (m_auiEncounter[1] == DONE)
- HandleGameObject(0, true, go);
- break;
-
- case 193093:
- Prince_TaldaramSpheres[0] = go->GetGUID();
- if (spheres[0] == IN_PROGRESS)
- {
- go->SetGoState(GO_STATE_ACTIVE);
- go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
- }
- else
- go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
- break;
- case 193094:
- Prince_TaldaramSpheres[1] = go->GetGUID();
- if (spheres[1] == IN_PROGRESS)
- {
- go->SetGoState(GO_STATE_ACTIVE);
- go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
- }
- else
- go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
- break;
- case 192236:
- Prince_TaldaramGate = go->GetGUID(); // Web gate past Prince Taldaram
- if (m_auiEncounter[1] == DONE)
- HandleGameObject(0, true, go);
- break;
+ switch (go->GetEntry())
+ {
+ case GO_PRINCE_TALDARAM_GATE:
+ AddDoor(go, false);
+ break;
+ default:
+ break;
+ }
}
- }
- void SetData64(uint32 idx, uint64 guid) OVERRIDE
- {
- switch (idx)
+ void SetData(uint32 type, uint32 data) OVERRIDE
{
- case DATA_ADD_JEDOGA_OPFER:
- JedogaSacrifices = guid;
- break;
+ switch (type)
+ {
+ case DATA_SPHERE_1:
+ case DATA_SPHERE_2:
+ SpheresState[type - DATA_SPHERE_1] = data;
+ break;
+ case DATA_JEDOGA_TRIGGER_SWITCH:
+ SwitchTrigger = data;
+ break;
+ case DATA_JEDOGA_RESET_INITIANDS:
+ for (std::set<uint64>::const_iterator itr = InitiandGUIDs.begin(); itr != InitiandGUIDs.end(); ++itr)
+ {
+ if (Creature* creature = instance->GetCreature(*itr))
+ {
+ creature->Respawn();
+ if (!creature->IsInEvadeMode())
+ creature->AI()->EnterEvadeMode();
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ }
- case DATA_PL_JEDOGA_TARGET:
- JedogaTarget = guid;
- break;
+ uint32 GetData(uint32 type) const OVERRIDE
+ {
+ switch (type)
+ {
+ case DATA_SPHERE_1:
+ case DATA_SPHERE_2:
+ return SpheresState[type - DATA_SPHERE_1];
+ case DATA_ALL_INITIAND_DEAD:
+ for (std::set<uint64>::const_iterator itr = InitiandGUIDs.begin(); itr != InitiandGUIDs.end(); ++itr)
+ {
+ Creature* cr = instance->GetCreature(*itr);
+ if (!cr || cr->IsAlive())
+ return 0;
+ }
+ return 1;
+ case DATA_JEDOGA_TRIGGER_SWITCH:
+ return SwitchTrigger;
+ default:
+ break;
+ }
+ return 0;
}
- }
- uint64 GetData64(uint32 identifier) const OVERRIDE
- {
- switch (identifier)
+ void SetData64(uint32 type, uint64 data) OVERRIDE
{
- case DATA_ELDER_NADOX: return Elder_Nadox;
- case DATA_PRINCE_TALDARAM: return Prince_Taldaram;
- case DATA_JEDOGA_SHADOWSEEKER: return Jedoga_Shadowseeker;
- case DATA_HERALD_VOLAZJ: return Herald_Volazj;
- case DATA_AMANITAR: return Amanitar;
- case DATA_SPHERE1: return Prince_TaldaramSpheres[0];
- case DATA_SPHERE2: return Prince_TaldaramSpheres[1];
- case DATA_PRINCE_TALDARAM_PLATFORM: return Prince_TaldaramPlatform;
- case DATA_ADD_JEDOGA_INITIAND:
+ switch (type)
{
- std::vector<uint64> vInitiands;
- vInitiands.clear();
- for (std::set<uint64>::const_iterator itr = InitiandGUIDs.begin(); itr != InitiandGUIDs.end(); ++itr)
- {
- Creature* cr = instance->GetCreature(*itr);
- if (cr && cr->IsAlive())
- vInitiands.push_back(*itr);
- }
- if (vInitiands.empty())
- return 0;
- uint8 j = urand(0, vInitiands.size() -1);
- return vInitiands[j];
+ case DATA_ADD_JEDOGA_OPFER:
+ JedogaSacrifices = data;
+ break;
+ case DATA_PL_JEDOGA_TARGET:
+ JedogaTarget = data;
+ break;
+ default:
+ break;
}
- case DATA_ADD_JEDOGA_OPFER: return JedogaSacrifices;
- case DATA_PL_JEDOGA_TARGET: return JedogaTarget;
}
- return 0;
- }
- void SetData(uint32 type, uint32 data) OVERRIDE
- {
- switch (type)
+ uint64 GetData64(uint32 type) const OVERRIDE
{
- case DATA_ELDER_NADOX_EVENT:
- m_auiEncounter[0] = data;
- break;
- case DATA_PRINCE_TALDARAM_EVENT:
- if (data == DONE)
- HandleGameObject(Prince_TaldaramGate, true);
- m_auiEncounter[1] = data;
- break;
- case DATA_JEDOGA_SHADOWSEEKER_EVENT:
- m_auiEncounter[2] = data;
- if (data == DONE)
+ switch (type)
+ {
+ case DATA_ELDER_NADOX:
+ return ElderNadoxGUID;
+ case DATA_PRINCE_TALDARAM:
+ return PrinceTaldaramGUID;
+ case DATA_JEDOGA_SHADOWSEEKER:
+ return JedogaShadowseekerGUID;
+ case DATA_AMANITAR:
+ return AmanitarGUID;
+ case DATA_HERALD_VOLAZJ:
+ return HeraldVolazjGUID;
+ case DATA_PRINCE_TALDARAM_PLATFORM:
+ return PrinceTaldaramPlatformGUID;
+ case DATA_ADD_JEDOGA_INITIAND:
{
+ std::vector<uint64> vInitiands;
+ vInitiands.clear();
for (std::set<uint64>::const_iterator itr = InitiandGUIDs.begin(); itr != InitiandGUIDs.end(); ++itr)
{
Creature* cr = instance->GetCreature(*itr);
if (cr && cr->IsAlive())
- {
- cr->SetVisible(false);
- cr->setDeathState(JUST_DIED);
- cr->RemoveCorpse();
- }
+ vInitiands.push_back(*itr);
}
+ if (vInitiands.empty())
+ return 0;
+
+ return Trinity::Containers::SelectRandomContainerElement(vInitiands);
}
- break;
- case DATA_HERALD_VOLAZJ_EVENT:
- m_auiEncounter[3] = data;
- break;
- case DATA_AMANITAR_EVENT:
- m_auiEncounter[4] = data;
- break;
- case DATA_SPHERE1_EVENT:
- spheres[0] = data;
- break;
- case DATA_SPHERE2_EVENT:
- spheres[1] = data;
- break;
- case DATA_JEDOGA_TRIGGER_SWITCH:
- switchtrigger = data;
- break;
- case DATA_JEDOGA_RESET_INITIANDS:
- for (std::set<uint64>::const_iterator itr = InitiandGUIDs.begin(); itr != InitiandGUIDs.end(); ++itr)
- {
- Creature* cr = instance->GetCreature(*itr);
- if (cr)
+ case DATA_ADD_JEDOGA_OPFER:
+ return JedogaSacrifices;
+ case DATA_PL_JEDOGA_TARGET:
+ return JedogaTarget;
+ default:
+ break;
+ }
+ return 0;
+ }
+
+ bool SetBossState(uint32 type, EncounterState state) OVERRIDE
+ {
+ if (!InstanceScript::SetBossState(type, state))
+ return false;
+
+ switch (type)
+ {
+ case DATA_JEDOGA_SHADOWSEEKER:
+ if (state == DONE)
{
- cr->Respawn();
- if (!cr->IsInEvadeMode()) cr->AI()->EnterEvadeMode();
+ for (std::set<uint64>::const_iterator itr = InitiandGUIDs.begin(); itr != InitiandGUIDs.end(); ++itr)
+ {
+ if (Creature* cr = instance->GetCreature(*itr))
+ cr->DespawnOrUnsummon();
+ }
}
- }
- break;
+ break;
+ default:
+ break;
+ }
+ return true;
}
- if (data == DONE)
- SaveToDB();
- }
- uint32 GetData(uint32 type) const OVERRIDE
- {
- switch (type)
+ std::string GetSaveData() OVERRIDE
{
- case DATA_ELDER_NADOX_EVENT: return m_auiEncounter[0];
- case DATA_PRINCE_TALDARAM_EVENT: return m_auiEncounter[1];
- case DATA_JEDOGA_SHADOWSEEKER_EVENT: return m_auiEncounter[2];
- case DATA_HERALD_VOLAZJ: return m_auiEncounter[3];
- case DATA_AMANITAR_EVENT: return m_auiEncounter[4];
- case DATA_SPHERE1_EVENT: return spheres[0];
- case DATA_SPHERE2_EVENT: return spheres[1];
- case DATA_ALL_INITIAND_DEAD:
- for (std::set<uint64>::const_iterator itr = InitiandGUIDs.begin(); itr != InitiandGUIDs.end(); ++itr)
- {
- Creature* cr = instance->GetCreature(*itr);
- if (!cr || (cr && cr->IsAlive()))
- return 0;
- }
- return 1;
- case DATA_JEDOGA_TRIGGER_SWITCH: return switchtrigger;
- }
- return 0;
- }
+ OUT_SAVE_INST_DATA;
- std::string GetSaveData() OVERRIDE
- {
- OUT_SAVE_INST_DATA;
+ std::ostringstream saveStream;
+ saveStream << "A K " << GetBossSaveData() << SpheresState[0] << ' ' << SpheresState[1];
- std::ostringstream saveStream;
- saveStream << "A K " << m_auiEncounter[0] << ' ' << m_auiEncounter[1] << ' '
- << m_auiEncounter[2] << ' ' << m_auiEncounter[3] << ' ' << m_auiEncounter[4] << ' '
- << spheres[0] << ' ' << spheres[1];
+ OUT_SAVE_INST_DATA_COMPLETE;
+ return saveStream.str();
+ }
- str_data = saveStream.str();
+ void Load(char const* str) OVERRIDE
+ {
+ if (!str)
+ {
+ OUT_LOAD_INST_DATA_FAIL;
+ return;
+ }
- OUT_SAVE_INST_DATA_COMPLETE;
- return str_data;
- }
+ OUT_LOAD_INST_DATA(str);
- void Load(const char* in) OVERRIDE
- {
- if (!in)
- {
- OUT_LOAD_INST_DATA_FAIL;
- return;
- }
+ char dataHead1, dataHead2;
- OUT_LOAD_INST_DATA(in);
+ std::istringstream loadStream(str);
+ loadStream >> dataHead1 >> dataHead2;
+
+ if (dataHead1 == 'A' && dataHead2 == 'K')
+ {
+ for (uint32 i = 0; i < EncounterCount; ++i)
+ {
+ uint32 tmpState;
+ loadStream >> tmpState;
+ if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
+ tmpState = NOT_STARTED;
+ SetBossState(i, EncounterState(tmpState));
+ }
- char dataHead1, dataHead2;
- uint16 data0, data1, data2, data3, data4, data5, data6;
+ loadStream >> SpheresState[0];
+ loadStream >> SpheresState[1];
+ }
+ else
+ OUT_LOAD_INST_DATA_FAIL;
- std::istringstream loadStream(in);
- loadStream >> dataHead1 >> dataHead2 >> data0 >> data1 >> data2 >> data3 >> data4 >> data5 >> data6;
+ OUT_LOAD_INST_DATA_COMPLETE;
+ }
- if (dataHead1 == 'A' && dataHead2 == 'K')
- {
- m_auiEncounter[0] = data0;
- m_auiEncounter[1] = data1;
- m_auiEncounter[2] = data2;
- m_auiEncounter[3] = data3;
- m_auiEncounter[4] = data4;
+ protected:
+ uint64 ElderNadoxGUID;
+ uint64 PrinceTaldaramGUID;
+ uint64 JedogaShadowseekerGUID;
+ uint64 AmanitarGUID;
+ uint64 HeraldVolazjGUID;
- for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
- if (m_auiEncounter[i] == IN_PROGRESS)
- m_auiEncounter[i] = NOT_STARTED;
+ uint64 PrinceTaldaramPlatformGUID;
+ uint64 JedogaSacrifices;
+ uint64 JedogaTarget;
- spheres[0] = data5;
- spheres[1] = data6;
+ std::set<uint64> InitiandGUIDs;
- } else OUT_LOAD_INST_DATA_FAIL;
+ uint8 SpheresState[2];
+ uint8 SwitchTrigger;
+ };
- OUT_LOAD_INST_DATA_COMPLETE;
+ InstanceScript* GetInstanceScript(InstanceMap* map) const OVERRIDE
+ {
+ return new instance_ahnkahet_InstanceScript(map);
}
- };
-
- InstanceScript* GetInstanceScript(InstanceMap* map) const OVERRIDE
- {
- return new instance_ahnkahet_InstanceScript(map);
- }
};
void AddSC_instance_ahnkahet()
{
- new instance_ahnkahet();
+ new instance_ahnkahet();
}
diff --git a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/azjol_nerub.h b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/azjol_nerub.h
index 5970a85cc38..5087ed0cec3 100644
--- a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/azjol_nerub.h
+++ b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/azjol_nerub.h
@@ -15,24 +15,49 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifndef DEF_AZJOL_NERUB_H
-#define DEF_AZJOL_NERUB_H
+#ifndef AZJOL_NERUB_H_
+#define AZJOL_NERUB_H_
-enum Data64
+#define AzjolNerubScriptName "instance_azjol_nerub"
+
+uint32 const EncounterCount = 3;
+
+enum DataTypes
{
- DATA_KRIKTHIR_THE_GATEWATCHER,
- DATA_HADRONOX,
- DATA_ANUBARAK,
- DATA_WATCHER_GASHRA,
- DATA_WATCHER_SILTHIK,
- DATA_WATCHER_NARJIL
+ // Encounter States/Boss GUIDs
+ DATA_KRIKTHIR_THE_GATEWATCHER = 0,
+ DATA_HADRONOX = 1,
+ DATA_ANUBARAK = 2,
+
+ // Additional Data
+ DATA_WATCHER_GASHRA = 3,
+ DATA_WATCHER_SILTHIK = 4,
+ DATA_WATCHER_NARJIL = 5
};
-enum Data
+enum CreatureIds
{
- DATA_KRIKTHIR_THE_GATEWATCHER_EVENT,
- DATA_HADRONOX_EVENT,
- DATA_ANUBARAK_EVENT
+ NPC_KRIKTHIR = 28684,
+ NPC_HADRONOX = 28921,
+ NPC_ANUBARAK = 29120,
+
+ NPC_WATCHER_NARJIL = 28729,
+ NPC_WATCHER_GASHRA = 28730,
+ NPC_WATCHER_SILTHIK = 28731
};
-#endif
+enum GameObjectIds
+{
+ GO_KRIKTHIR_DOOR = 192395,
+ GO_ANUBARAK_DOOR_1 = 192396,
+ GO_ANUBARAK_DOOR_2 = 192397,
+ GO_ANUBARAK_DOOR_3 = 192398
+};
+
+template<class AI>
+AI* GetAzjolNerubAI(Creature* creature)
+{
+ return GetInstanceAI<AI>(creature, AzjolNerubScriptName);
+}
+
+#endif // AZJOL_NERUB_H_
diff --git a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_anubarak.cpp b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_anubarak.cpp
index 05e758f5cf9..81530265617 100644
--- a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_anubarak.cpp
+++ b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_anubarak.cpp
@@ -132,7 +132,7 @@ public:
if (instance)
{
- instance->SetData(DATA_ANUBARAK_EVENT, NOT_STARTED);
+ instance->SetBossState(DATA_ANUBARAK, NOT_STARTED);
instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
}
}
@@ -165,7 +165,7 @@ public:
void DelayEventStart()
{
if (instance)
- instance->SetData(DATA_ANUBARAK_EVENT, IN_PROGRESS);
+ instance->SetBossState(DATA_ANUBARAK, IN_PROGRESS);
}
void UpdateAI(uint32 diff) OVERRIDE
@@ -336,7 +336,7 @@ public:
Talk(SAY_DEATH);
Summons.DespawnAll();
if (instance)
- instance->SetData(DATA_ANUBARAK_EVENT, DONE);
+ instance->SetBossState(DATA_ANUBARAK, DONE);
}
void KilledUnit(Unit* victim) OVERRIDE
diff --git a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp
index 6b556f4fe4d..1664a1375ae 100644
--- a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp
+++ b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp
@@ -84,8 +84,8 @@ public:
uiDoorsTimer = urand(20*IN_MILLISECONDS, 30*IN_MILLISECONDS);
uiCheckDistanceTimer = 2*IN_MILLISECONDS;
- if (instance && (instance->GetData(DATA_HADRONOX_EVENT) != DONE && !bFirstTime))
- instance->SetData(DATA_HADRONOX_EVENT, FAIL);
+ if (instance && (instance->GetBossState(DATA_HADRONOX) != DONE && !bFirstTime))
+ instance->SetBossState(DATA_HADRONOX, FAIL);
bFirstTime = false;
}
@@ -103,13 +103,13 @@ public:
void JustDied(Unit* /*killer*/) OVERRIDE
{
if (instance)
- instance->SetData(DATA_HADRONOX_EVENT, DONE);
+ instance->SetBossState(DATA_HADRONOX, DONE);
}
void EnterCombat(Unit* /*who*/) OVERRIDE
{
if (instance)
- instance->SetData(DATA_HADRONOX_EVENT, IN_PROGRESS);
+ instance->SetBossState(DATA_HADRONOX, IN_PROGRESS);
me->SetInCombatWithZone();
}
diff --git a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_krikthir_the_gatewatcher.cpp b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_krikthir_the_gatewatcher.cpp
index 2222d16f68b..c5e40052a9d 100644
--- a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_krikthir_the_gatewatcher.cpp
+++ b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_krikthir_the_gatewatcher.cpp
@@ -105,7 +105,7 @@ public:
uiCurseFatigueTimer = 12*IN_MILLISECONDS;
if (instance)
- instance->SetData(DATA_KRIKTHIR_THE_GATEWATCHER_EVENT, NOT_STARTED);
+ instance->SetBossState(DATA_KRIKTHIR_THE_GATEWATCHER, NOT_STARTED);
}
void EnterCombat(Unit* /*who*/) OVERRIDE
@@ -115,7 +115,7 @@ public:
uiSummonTimer = 15*IN_MILLISECONDS;
if (instance)
- instance->SetData(DATA_KRIKTHIR_THE_GATEWATCHER_EVENT, IN_PROGRESS);
+ instance->SetBossState(DATA_KRIKTHIR_THE_GATEWATCHER, IN_PROGRESS);
}
void Summon()
@@ -176,7 +176,7 @@ public:
Talk(SAY_DEATH);
if (instance)
- instance->SetData(DATA_KRIKTHIR_THE_GATEWATCHER_EVENT, DONE);
+ instance->SetBossState(DATA_KRIKTHIR_THE_GATEWATCHER, DONE);
}
void KilledUnit(Unit* victim) OVERRIDE
@@ -537,15 +537,14 @@ class achievement_watch_him_die : public AchievementCriteriaScript
return false;
InstanceScript* instance = target->GetInstanceScript();
- Creature* Watcher[3];
if (!instance)
return false;
for (uint8 n = 0; n < 3; ++n)
{
- Watcher[n] = ObjectAccessor::GetCreature(*target, instance->GetData64(DATA_WATCHER_GASHRA + n));
- if (Watcher[n] && !Watcher[n]->IsAlive())
- return false;
+ if (Creature* watcher = ObjectAccessor::GetCreature(*target, instance->GetData64(DATA_WATCHER_GASHRA + n)))
+ if (!watcher->IsAlive())
+ return false;
}
return true;
diff --git a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp
index 261a2748579..b20a28b7a75 100644
--- a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp
+++ b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp
@@ -19,196 +19,171 @@
#include "InstanceScript.h"
#include "azjol_nerub.h"
-#define MAX_ENCOUNTER 3
-
-/* Azjol Nerub encounters:
-0 - Krik'thir the Gatewatcher
-1 - Hadronox
-2 - Anub'arak
-*/
+DoorData const doorData[] =
+{
+ { GO_KRIKTHIR_DOOR, DATA_KRIKTHIR_THE_GATEWATCHER, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
+ { GO_ANUBARAK_DOOR_1, DATA_ANUBARAK, DOOR_TYPE_ROOM, BOUNDARY_NONE },
+ { GO_ANUBARAK_DOOR_2, DATA_ANUBARAK, DOOR_TYPE_ROOM, BOUNDARY_NONE },
+ { GO_ANUBARAK_DOOR_3, DATA_ANUBARAK, DOOR_TYPE_ROOM, BOUNDARY_NONE },
+ { 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE } // END
+};
class instance_azjol_nerub : public InstanceMapScript
{
-public:
- instance_azjol_nerub() : InstanceMapScript("instance_azjol_nerub", 601) { }
-
- struct instance_azjol_nerub_InstanceScript : public InstanceScript
- {
- instance_azjol_nerub_InstanceScript(Map* map) : InstanceScript(map) {}
-
- uint64 uiKrikthir;
- uint64 uiHadronox;
- uint64 uiAnubarak;
- uint64 uiWatcherGashra;
- uint64 uiWatcherSilthik;
- uint64 uiWatcherNarjil;
- uint64 uiAnubarakDoor[3];
-
- uint64 uiKrikthirDoor;
-
- uint32 auiEncounter[MAX_ENCOUNTER];
-
- void Initialize() OVERRIDE
- {
- memset(&auiEncounter, 0, sizeof(auiEncounter));
- memset(&uiAnubarakDoor, 0, sizeof(uiAnubarakDoor));
-
- uiKrikthir = 0;
- uiHadronox = 0;
- uiAnubarak = 0;
- uiWatcherGashra = 0;
- uiWatcherSilthik = 0;
- uiWatcherNarjil = 0;
- uiKrikthirDoor = 0;
- }
+ public:
+ instance_azjol_nerub() : InstanceMapScript(AzjolNerubScriptName, 601) { }
- bool IsEncounterInProgress() const OVERRIDE
+ struct instance_azjol_nerub_InstanceScript : public InstanceScript
{
- for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
- if (auiEncounter[i] == IN_PROGRESS)
- return true;
-
- return false;
- }
-
- void OnCreatureCreate(Creature* creature) OVERRIDE
- {
- switch (creature->GetEntry())
+ instance_azjol_nerub_InstanceScript(Map* map) : InstanceScript(map)
{
- case 28684: uiKrikthir = creature->GetGUID(); break;
- case 28921: uiHadronox = creature->GetGUID(); break;
- case 29120: uiAnubarak = creature->GetGUID(); break;
- case 28730: uiWatcherGashra = creature->GetGUID(); break;
- case 28731: uiWatcherSilthik = creature->GetGUID(); break;
- case 28729: uiWatcherNarjil = creature->GetGUID(); break;
+ SetBossNumber(EncounterCount);
+ LoadDoorData(doorData);
+
+ KrikthirGUID = 0;
+ HadronoxGUID = 0;
+ AnubarakGUID = 0;
+ WatcherGashraGUID = 0;
+ WatcherSilthikGUID = 0;
+ WatcherNarjilGUID = 0;
}
- }
- void OnGameObjectCreate(GameObject* go) OVERRIDE
- {
- switch (go->GetEntry())
+ void OnCreatureCreate(Creature* creature) OVERRIDE
{
- case 192395:
- uiKrikthirDoor = go->GetGUID();
- if (auiEncounter[0] == DONE)
- HandleGameObject(0, true, go);
- break;
- case 192396:
- uiAnubarakDoor[0] = go->GetGUID();
- break;
- case 192397:
- uiAnubarakDoor[1] = go->GetGUID();
- break;
- case 192398:
- uiAnubarakDoor[2] = go->GetGUID();
- break;
+ switch (creature->GetEntry())
+ {
+ case NPC_KRIKTHIR:
+ KrikthirGUID = creature->GetGUID();
+ break;
+ case NPC_HADRONOX:
+ HadronoxGUID = creature->GetGUID();
+ break;
+ case NPC_ANUBARAK:
+ AnubarakGUID = creature->GetGUID();
+ break;
+ case NPC_WATCHER_NARJIL:
+ WatcherNarjilGUID = creature->GetGUID();
+ break;
+ case NPC_WATCHER_GASHRA:
+ WatcherGashraGUID = creature->GetGUID();
+ break;
+ case NPC_WATCHER_SILTHIK:
+ WatcherSilthikGUID = creature->GetGUID();
+ break;
+ default:
+ break;
+ }
}
- }
- uint64 GetData64(uint32 identifier) const OVERRIDE
- {
- switch (identifier)
+ void OnGameObjectCreate(GameObject* go) OVERRIDE
{
- case DATA_KRIKTHIR_THE_GATEWATCHER: return uiKrikthir;
- case DATA_HADRONOX: return uiHadronox;
- case DATA_ANUBARAK: return uiAnubarak;
- case DATA_WATCHER_GASHRA: return uiWatcherGashra;
- case DATA_WATCHER_SILTHIK: return uiWatcherSilthik;
- case DATA_WATCHER_NARJIL: return uiWatcherNarjil;
+ switch (go->GetEntry())
+ {
+ case GO_KRIKTHIR_DOOR:
+ case GO_ANUBARAK_DOOR_1:
+ case GO_ANUBARAK_DOOR_2:
+ case GO_ANUBARAK_DOOR_3:
+ AddDoor(go, true);
+ break;
+ default:
+ break;
+ }
}
- return 0;
- }
-
- void SetData(uint32 type, uint32 data) OVERRIDE
- {
- switch (type)
+ void OnGameObjectRemove(GameObject* go) OVERRIDE
{
- case DATA_KRIKTHIR_THE_GATEWATCHER_EVENT:
- auiEncounter[0] = data;
- if (data == DONE)
- HandleGameObject(uiKrikthirDoor, true);
- break;
- case DATA_HADRONOX_EVENT:
- auiEncounter[1] = data;
- break;
- case DATA_ANUBARAK_EVENT:
- auiEncounter[2] = data;
- if (data == IN_PROGRESS)
- for (uint8 i = 0; i < 3; ++i)
- HandleGameObject(uiAnubarakDoor[i], false);
- else if (data == NOT_STARTED || data == DONE)
- for (uint8 i = 0; i < 3; ++i)
- HandleGameObject(uiAnubarakDoor[i], true);
- break;
+ switch (go->GetEntry())
+ {
+ case GO_KRIKTHIR_DOOR:
+ case GO_ANUBARAK_DOOR_1:
+ case GO_ANUBARAK_DOOR_2:
+ case GO_ANUBARAK_DOOR_3:
+ AddDoor(go, false);
+ break;
+ default:
+ break;
+ }
}
- if (data == DONE)
+ uint64 GetData64(uint32 type) const OVERRIDE
{
- SaveToDB();
+ switch (type)
+ {
+ case DATA_KRIKTHIR_THE_GATEWATCHER:
+ return KrikthirGUID;
+ case DATA_HADRONOX:
+ return HadronoxGUID;
+ case DATA_ANUBARAK:
+ return AnubarakGUID;
+ case DATA_WATCHER_GASHRA:
+ return WatcherGashraGUID;
+ case DATA_WATCHER_SILTHIK:
+ return WatcherSilthikGUID;
+ case DATA_WATCHER_NARJIL:
+ return WatcherNarjilGUID;
+ default:
+ break;
+ }
+
+ return 0;
}
- }
- uint32 GetData(uint32 type) const OVERRIDE
- {
- switch (type)
+ std::string GetSaveData() OVERRIDE
{
- case DATA_KRIKTHIR_THE_GATEWATCHER_EVENT: return auiEncounter[0];
- case DATA_HADRONOX_EVENT: return auiEncounter[1];
- case DATA_ANUBARAK_EVENT: return auiEncounter[2];
- }
-
- return 0;
- }
-
- std::string GetSaveData() OVERRIDE
- {
- OUT_SAVE_INST_DATA;
-
- std::ostringstream saveStream;
- saveStream << "A N " << auiEncounter[0] << ' ' << auiEncounter[1] << ' '
- << auiEncounter[2];
+ OUT_SAVE_INST_DATA;
- OUT_SAVE_INST_DATA_COMPLETE;
- return saveStream.str();
- }
+ std::ostringstream saveStream;
+ saveStream << "A N " << GetBossSaveData();
- void Load(const char* in) OVERRIDE
- {
- if (!in)
- {
- OUT_LOAD_INST_DATA_FAIL;
- return;
+ OUT_SAVE_INST_DATA_COMPLETE;
+ return saveStream.str();
}
- OUT_LOAD_INST_DATA(in);
-
- char dataHead1, dataHead2;
- uint16 data0, data1, data2;
-
- std::istringstream loadStream(in);
- loadStream >> dataHead1 >> dataHead2 >> data0 >> data1 >> data2;
-
- if (dataHead1 == 'A' && dataHead2 == 'N')
+ void Load(char const* str) OVERRIDE
{
- auiEncounter[0] = data0;
- auiEncounter[1] = data1;
- auiEncounter[2] = data2;
-
- for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
- if (auiEncounter[i] == IN_PROGRESS)
- auiEncounter[i] = NOT_STARTED;
+ 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 == 'A' && dataHead2 == 'N')
+ {
+ for (uint32 i = 0; i < EncounterCount; ++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;
+ }
- } else OUT_LOAD_INST_DATA_FAIL;
+ protected:
+ uint64 KrikthirGUID;
+ uint64 HadronoxGUID;
+ uint64 AnubarakGUID;
+ uint64 WatcherGashraGUID;
+ uint64 WatcherSilthikGUID;
+ uint64 WatcherNarjilGUID;
+ };
- OUT_LOAD_INST_DATA_COMPLETE;
+ InstanceScript* GetInstanceScript(InstanceMap* map) const OVERRIDE
+ {
+ return new instance_azjol_nerub_InstanceScript(map);
}
- };
-
- InstanceScript* GetInstanceScript(InstanceMap* map) const OVERRIDE
- {
- return new instance_azjol_nerub_InstanceScript(map);
- }
};
void AddSC_instance_azjol_nerub()
diff --git a/src/server/scripts/Northrend/DraktharonKeep/drak_tharon_keep.h b/src/server/scripts/Northrend/DraktharonKeep/drak_tharon_keep.h
index 072a5f2f534..c2d957b7c0a 100644
--- a/src/server/scripts/Northrend/DraktharonKeep/drak_tharon_keep.h
+++ b/src/server/scripts/Northrend/DraktharonKeep/drak_tharon_keep.h
@@ -18,9 +18,6 @@
#ifndef DRAK_THARON_KEEP_H_
#define DRAK_THARON_KEEP_H_
-#include "Map.h"
-#include "Creature.h"
-
#define DrakTharonKeepScriptName "instance_drak_tharon_keep"
uint32 const EncounterCount = 4;
@@ -89,11 +86,7 @@ enum GameObjectIds
template<class AI>
AI* GetDrakTharonKeepAI(Creature* creature)
{
- if (InstanceMap* instance = creature->GetMap()->ToInstanceMap())
- if (instance->GetInstanceScript())
- if (instance->GetScriptId() == sObjectMgr->GetScriptId(DrakTharonKeepScriptName))
- return new AI(creature);
- return NULL;
+ return GetInstanceAI<AI>(creature, DrakTharonKeepScriptName);
}
#endif // DRAK_THARON_KEEP_H_
diff --git a/src/server/scripts/Northrend/DraktharonKeep/instance_drak_tharon_keep.cpp b/src/server/scripts/Northrend/DraktharonKeep/instance_drak_tharon_keep.cpp
index 240e27ad026..d9e34ee2af3 100644
--- a/src/server/scripts/Northrend/DraktharonKeep/instance_drak_tharon_keep.cpp
+++ b/src/server/scripts/Northrend/DraktharonKeep/instance_drak_tharon_keep.cpp
@@ -36,7 +36,7 @@ class instance_drak_tharon_keep : public InstanceMapScript
KingDredGUID = 0;
TharonJaGUID = 0;
- memset(TrollgoreInvaderSummonerGuids, 0, 4 * sizeof(uint64));
+ memset(TrollgoreInvaderSummonerGuids, 0, 3 * sizeof(uint64));
memset(NovosCrystalGUIDs, 0, 4 * sizeof(uint64));
memset(NovosSummonerGUIDs, 0, 4 * sizeof(uint64));
}
diff --git a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp
index 6408417e902..3f81b517721 100644
--- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp
@@ -714,7 +714,9 @@ class npc_jaina_or_sylvanas_escape_hor : public CreatureScript
// AI of Part2
struct npc_jaina_or_sylvanas_escape_horAI : public ScriptedAI
{
- npc_jaina_or_sylvanas_escape_horAI(Creature* creature) : ScriptedAI(creature)
+ npc_jaina_or_sylvanas_escape_horAI(Creature* creature) : ScriptedAI(creature),
+ _instance(creature->GetInstanceScript()), _lichkingGUID(0), _walltargetGUID(0),
+ _icewallGUID(0), _icewall(0), _isattackingwall(0)
{
_instance = me->GetInstanceScript();
}
diff --git a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp
index 40110b8a509..50600453368 100644
--- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp
@@ -79,20 +79,27 @@ public:
{
SetBossNumber(MAX_ENCOUNTER);
events.Reset();
+
_falricGUID = 0;
_marwynGUID = 0;
_jainaOrSylvanasPart1GUID = 0;
+ _jainaOrSylvanasPart2GUID = 0;
+ _lichkingPart1GUID = 0;
_frostwornGeneralGUID = 0;
+
_frostmourneGUID = 0;
_entranceDoorGUID = 0;
_frostwornDoorGUID = 0;
_arthasDoorGUID = 0;
+ _escapeDoorGUID = 0;
+ _caveGUID = 0;
+
_teamInInstance = 0;
_waveCount = 0;
- _mobsaticewall = 0;
_introEvent = NOT_STARTED;
_frostwornGeneral = NOT_STARTED;
_escapeevent = NOT_STARTED;
+ _mobsaticewall = 0;
}
void OnPlayerEnter(Player* player) OVERRIDE
diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_bjarngrim.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_bjarngrim.cpp
index 2077049641f..944eacda34e 100644
--- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_bjarngrim.cpp
+++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_bjarngrim.cpp
@@ -181,7 +181,7 @@ public:
SetEquipmentSlots(false, EQUIP_SWORD, EQUIP_SHIELD, EQUIP_NO_CHANGE);
if (instance)
- instance->SetData(TYPE_BJARNGRIM, NOT_STARTED);
+ instance->SetBossState(DATA_BJARNGRIM, NOT_STARTED);
}
void EnterEvadeMode() OVERRIDE
@@ -202,7 +202,7 @@ public:
me->CallForHelp(30.0f);
if (instance)
- instance->SetData(TYPE_BJARNGRIM, IN_PROGRESS);
+ instance->SetBossState(DATA_BJARNGRIM, IN_PROGRESS);
}
void KilledUnit(Unit* /*victim*/) OVERRIDE
@@ -215,7 +215,7 @@ public:
Talk(SAY_DEATH);
if (instance)
- instance->SetData(TYPE_BJARNGRIM, DONE);
+ instance->SetBossState(DATA_BJARNGRIM, DONE);
}
/// @todo remove when removal is done by the core
diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_ionar.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_ionar.cpp
index dfb21edf9af..af6beca608d 100644
--- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_ionar.cpp
+++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_ionar.cpp
@@ -116,7 +116,7 @@ public:
me->SetVisible(true);
if (instance)
- instance->SetData(TYPE_IONAR, NOT_STARTED);
+ instance->SetBossState(DATA_IONAR, NOT_STARTED);
}
void EnterCombat(Unit* /*who*/) OVERRIDE
@@ -124,7 +124,7 @@ public:
Talk(SAY_AGGRO);
if (instance)
- instance->SetData(TYPE_IONAR, IN_PROGRESS);
+ instance->SetBossState(DATA_IONAR, IN_PROGRESS);
}
void JustDied(Unit* /*killer*/) OVERRIDE
@@ -134,7 +134,7 @@ public:
lSparkList.DespawnAll();
if (instance)
- instance->SetData(TYPE_IONAR, DONE);
+ instance->SetBossState(DATA_IONAR, DONE);
}
void KilledUnit(Unit* /*victim*/) OVERRIDE
@@ -338,7 +338,7 @@ public:
void UpdateAI(uint32 uiDiff) OVERRIDE
{
// Despawn if the encounter is not running
- if (instance && instance->GetData(TYPE_IONAR) != IN_PROGRESS)
+ if (instance && instance->GetBossState(DATA_IONAR) != IN_PROGRESS)
{
me->DespawnOrUnsummon();
return;
diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_loken.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_loken.cpp
index d8ab71870a8..61687de1b58 100644
--- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_loken.cpp
+++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_loken.cpp
@@ -97,7 +97,7 @@ public:
if (instance)
{
- instance->SetData(TYPE_LOKEN, NOT_STARTED);
+ instance->SetBossState(DATA_LOKEN, NOT_STARTED);
instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMELY_DEATH_START_EVENT);
}
}
@@ -108,7 +108,7 @@ public:
if (instance)
{
- instance->SetData(TYPE_LOKEN, IN_PROGRESS);
+ instance->SetBossState(DATA_LOKEN, IN_PROGRESS);
instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMELY_DEATH_START_EVENT);
}
}
@@ -119,7 +119,7 @@ public:
if (instance)
{
- instance->SetData(TYPE_LOKEN, DONE);
+ instance->SetBossState(DATA_LOKEN, DONE);
instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_PULSING_SHOCKWAVE_AURA);
}
}
@@ -140,6 +140,7 @@ public:
if (m_uiResumePulsingShockwave_Timer <= uiDiff)
{
DoCast(me, SPELL_PULSING_SHOCKWAVE_AURA, true);
+ me->ClearUnitState(UNIT_STATE_CASTING); // this flag breaks movement
DoCast(me, SPELL_PULSING_SHOCKWAVE_N, true);
m_uiResumePulsingShockwave_Timer = 0;
diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp
index 725293a7e60..b6790a088ad 100644
--- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp
+++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp
@@ -121,7 +121,7 @@ public:
m_lGolemGUIDList.clear();
if (instance)
- instance->SetData(TYPE_VOLKHAN, NOT_STARTED);
+ instance->SetBossState(DATA_VOLKHAN, NOT_STARTED);
}
void EnterCombat(Unit* /*who*/) OVERRIDE
@@ -129,7 +129,7 @@ public:
Talk(SAY_AGGRO);
if (instance)
- instance->SetData(TYPE_VOLKHAN, IN_PROGRESS);
+ instance->SetBossState(DATA_VOLKHAN, IN_PROGRESS);
}
void AttackStart(Unit* who) OVERRIDE
@@ -151,7 +151,7 @@ public:
DespawnGolem();
if (instance)
- instance->SetData(TYPE_VOLKHAN, DONE);
+ instance->SetBossState(DATA_VOLKHAN, DONE);
}
void KilledUnit(Unit* /*victim*/) OVERRIDE
diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/halls_of_lightning.h b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/halls_of_lightning.h
index c45feab1e8a..17c049e8292 100644
--- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/halls_of_lightning.h
+++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/halls_of_lightning.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
@@ -16,22 +15,20 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifndef DEF_HALLS_OF_LIGHTNING_H
-#define DEF_HALLS_OF_LIGHTNING_H
+#ifndef HALLS_OF_LIGHTNING_H_
+#define HALLS_OF_LIGHTNING_H_
-enum Types
-{
- MAX_ENCOUNTER = 4,
+#define HoLScriptName "instance_halls_of_lightning"
- DATA_BJARNGRIM = 1,
- DATA_IONAR = 2,
- DATA_LOKEN = 3,
- DATA_VOLKHAN = 4,
+uint32 const EncounterCount = 4;
- TYPE_BJARNGRIM = 10,
- TYPE_IONAR = 11,
- TYPE_LOKEN = 12,
- TYPE_VOLKHAN = 13,
+enum DataTypes
+{
+ // Encounter States/Boss GUIDs
+ DATA_BJARNGRIM = 0,
+ DATA_VOLKHAN = 1,
+ DATA_IONAR = 2,
+ DATA_LOKEN = 3
};
enum CreaturesIds
@@ -44,11 +41,17 @@ enum CreaturesIds
enum GameObjectIds
{
- GO_BJARNGRIM_DOOR = 191416, //_doors10
- GO_VOLKHAN_DOOR = 191325, //_doors07
- GO_IONAR_DOOR = 191326, //_doors05
- GO_LOKEN_DOOR = 191324, //_doors02
+ GO_BJARNGRIM_DOOR = 191416,
+ GO_VOLKHAN_DOOR = 191325,
+ GO_IONAR_DOOR = 191326,
+ GO_LOKEN_DOOR = 191324,
GO_LOKEN_THRONE = 192654
};
-#endif
+template<class AI>
+AI* GetHallsOfLightningAI(Creature* creature)
+{
+ return GetInstanceAI<AI>(creature, HoLScriptName);
+}
+
+#endif // HALLS_OF_LIGHTNING_H_
diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/instance_halls_of_lightning.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/instance_halls_of_lightning.cpp
index e6d2ededd73..6baf5dc6d93 100644
--- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/instance_halls_of_lightning.cpp
+++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/instance_halls_of_lightning.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,240 +15,186 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/* ScriptData
-SDName: Instance_Halls_of_Lightning
-SD%Complete: 90%
-SDComment: All ready.
-SDCategory: Halls of Lightning
-EndScriptData */
-
#include "ScriptMgr.h"
#include "InstanceScript.h"
#include "halls_of_lightning.h"
-/* Halls of Lightning encounters:
-0 - General Bjarngrim
-1 - Volkhan
-2 - Ionar
-3 - Loken
-*/
+DoorData const doorData[] =
+{
+ { GO_BJARNGRIM_DOOR, DATA_BJARNGRIM, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
+ { GO_VOLKHAN_DOOR, DATA_VOLKHAN, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
+ { GO_IONAR_DOOR, DATA_IONAR, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
+ { GO_LOKEN_DOOR, DATA_LOKEN, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
+ { 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE } // END
+};
class instance_halls_of_lightning : public InstanceMapScript
{
-public:
- instance_halls_of_lightning() : InstanceMapScript("instance_halls_of_lightning", 602) { }
-
- InstanceScript* GetInstanceScript(InstanceMap* map) const OVERRIDE
- {
- return new instance_halls_of_lightning_InstanceMapScript(map);
- }
-
- struct instance_halls_of_lightning_InstanceMapScript : public InstanceScript
- {
- instance_halls_of_lightning_InstanceMapScript(Map* map) : InstanceScript(map) {}
+ public:
+ instance_halls_of_lightning() : InstanceMapScript(HoLScriptName, 602) { }
- uint32 m_auiEncounter[MAX_ENCOUNTER];
-
- uint64 m_uiGeneralBjarngrimGUID;
- uint64 m_uiIonarGUID;
- uint64 m_uiLokenGUID;
- uint64 m_uiVolkhanGUID;
-
- uint64 m_uiBjarngrimDoorGUID;
- uint64 m_uiVolkhanDoorGUID;
- uint64 m_uiIonarDoorGUID;
- uint64 m_uiLokenDoorGUID;
- uint64 m_uiLokenGlobeGUID;
-
- void Initialize() OVERRIDE
+ struct instance_halls_of_lightning_InstanceMapScript : public InstanceScript
{
- memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
+ instance_halls_of_lightning_InstanceMapScript(Map* map) : InstanceScript(map)
+ {
+ SetBossNumber(EncounterCount);
+ LoadDoorData(doorData);
- m_uiGeneralBjarngrimGUID = 0;
- m_uiVolkhanGUID = 0;
- m_uiIonarGUID = 0;
- m_uiLokenGUID = 0;
+ GeneralBjarngrimGUID = 0;
+ VolkhanGUID = 0;
+ IonarGUID = 0;
+ LokenGUID = 0;
- m_uiBjarngrimDoorGUID = 0;
- m_uiVolkhanDoorGUID = 0;
- m_uiIonarDoorGUID = 0;
- m_uiLokenDoorGUID = 0;
- m_uiLokenGlobeGUID = 0;
- }
+ LokenGlobeGUID = 0;
+ }
- void OnCreatureCreate(Creature* creature) OVERRIDE
- {
- switch (creature->GetEntry())
+ void OnCreatureCreate(Creature* creature) OVERRIDE
{
- case NPC_BJARNGRIM:
- m_uiGeneralBjarngrimGUID = creature->GetGUID();
- break;
- case NPC_VOLKHAN:
- m_uiVolkhanGUID = creature->GetGUID();
- break;
- case NPC_IONAR:
- m_uiIonarGUID = creature->GetGUID();
- break;
- case NPC_LOKEN:
- m_uiLokenGUID = creature->GetGUID();
- break;
+ switch (creature->GetEntry())
+ {
+ case NPC_BJARNGRIM:
+ GeneralBjarngrimGUID = creature->GetGUID();
+ break;
+ case NPC_VOLKHAN:
+ VolkhanGUID = creature->GetGUID();
+ break;
+ case NPC_IONAR:
+ IonarGUID = creature->GetGUID();
+ break;
+ case NPC_LOKEN:
+ LokenGUID = creature->GetGUID();
+ break;
+ default:
+ break;
+ }
}
- }
- void OnGameObjectCreate(GameObject* go) OVERRIDE
- {
- switch (go->GetEntry())
+ void OnGameObjectCreate(GameObject* go) OVERRIDE
{
- case GO_BJARNGRIM_DOOR:
- m_uiBjarngrimDoorGUID = go->GetGUID();
- if (m_auiEncounter[0] == DONE)
- go->SetGoState(GO_STATE_ACTIVE);
- else
- go->SetGoState(GO_STATE_READY);
- break;
- case GO_VOLKHAN_DOOR:
- m_uiVolkhanDoorGUID = go->GetGUID();
- if (m_auiEncounter[1] == DONE)
- go->SetGoState(GO_STATE_ACTIVE);
- else
- go->SetGoState(GO_STATE_READY);
- break;
- case GO_IONAR_DOOR:
- m_uiIonarDoorGUID = go->GetGUID();
- if (m_auiEncounter[2] == DONE)
- go->SetGoState(GO_STATE_ACTIVE);
- else
- go->SetGoState(GO_STATE_READY);
- break;
- case GO_LOKEN_DOOR:
- m_uiLokenDoorGUID = go->GetGUID();
- if (m_auiEncounter[3] == DONE)
- go->SetGoState(GO_STATE_ACTIVE);
- else
- go->SetGoState(GO_STATE_READY);
- break;
- case GO_LOKEN_THRONE:
- m_uiLokenGlobeGUID = go->GetGUID();
- break;
+ switch (go->GetEntry())
+ {
+ case GO_BJARNGRIM_DOOR:
+ case GO_VOLKHAN_DOOR:
+ case GO_IONAR_DOOR:
+ case GO_LOKEN_DOOR:
+ AddDoor(go, true);
+ break;
+ case GO_LOKEN_THRONE:
+ LokenGlobeGUID = go->GetGUID();
+ break;
+ default:
+ break;
+ }
}
- }
- void SetData(uint32 uiType, uint32 uiData) OVERRIDE
- {
- switch (uiType)
+ void OnGameObjectRemove(GameObject* go) OVERRIDE
{
- case TYPE_BJARNGRIM:
- if (uiData == DONE)
- if (GameObject* pDoor = instance->GetGameObject(m_uiBjarngrimDoorGUID))
- pDoor->SetGoState(GO_STATE_ACTIVE);
- m_auiEncounter[0] = uiData;
- break;
- case TYPE_VOLKHAN:
- if (uiData == DONE)
- if (GameObject* pDoor = instance->GetGameObject(m_uiVolkhanDoorGUID))
- pDoor->SetGoState(GO_STATE_ACTIVE);
- m_auiEncounter[1] = uiData;
- break;
- case TYPE_IONAR:
- if (uiData == DONE)
- if (GameObject* pDoor = instance->GetGameObject(m_uiIonarDoorGUID))
- pDoor->SetGoState(GO_STATE_ACTIVE);
- m_auiEncounter[2] = uiData;
- break;
- case TYPE_LOKEN:
- if (uiData == DONE)
- {
- if (GameObject* pDoor = instance->GetGameObject(m_uiLokenDoorGUID))
- pDoor->SetGoState(GO_STATE_ACTIVE);
-
- // Appears to be type 5 GO with animation. Need to figure out how this work, code below only placeholder
- if (GameObject* pGlobe = instance->GetGameObject(m_uiLokenGlobeGUID))
- pGlobe->SetGoState(GO_STATE_ACTIVE);
- }
- m_auiEncounter[3] = uiData;
- break;
+ switch (go->GetEntry())
+ {
+ case GO_BJARNGRIM_DOOR:
+ case GO_VOLKHAN_DOOR:
+ case GO_IONAR_DOOR:
+ case GO_LOKEN_DOOR:
+ AddDoor(go, false);
+ break;
+ default:
+ break;
+ }
}
- if (uiData == DONE)
- SaveToDB();
- }
-
- uint32 GetData(uint32 uiType) const OVERRIDE
- {
- switch (uiType)
+ bool SetBossState(uint32 type, EncounterState state) OVERRIDE
{
- case TYPE_BJARNGRIM:
- return m_auiEncounter[0];
- case TYPE_VOLKHAN:
- return m_auiEncounter[1];
- case TYPE_IONAR:
- return m_auiEncounter[2];
- case TYPE_LOKEN:
- return m_auiEncounter[3];
+ if (!InstanceScript::SetBossState(type, state))
+ return false;
+
+ switch (type)
+ {
+ case DATA_LOKEN:
+ if (state == DONE)
+ if (GameObject* globe = instance->GetGameObject(LokenGlobeGUID))
+ globe->SendCustomAnim(0);
+ break;
+ default:
+ break;
+ }
+
+ return true;
}
- return 0;
- }
- uint64 GetData64(uint32 uiData) const OVERRIDE
- {
- switch (uiData)
+ uint64 GetData64(uint32 type) const OVERRIDE
{
- case DATA_BJARNGRIM:
- return m_uiGeneralBjarngrimGUID;
- case DATA_VOLKHAN:
- return m_uiVolkhanGUID;
- case DATA_IONAR:
- return m_uiIonarGUID;
- case DATA_LOKEN:
- return m_uiLokenGUID;
+ switch (type)
+ {
+ case DATA_BJARNGRIM:
+ return GeneralBjarngrimGUID;
+ case DATA_VOLKHAN:
+ return VolkhanGUID;
+ case DATA_IONAR:
+ return IonarGUID;
+ case DATA_LOKEN:
+ return LokenGUID;
+ default:
+ break;
+ }
+ return 0;
}
- return 0;
- }
- std::string GetSaveData() OVERRIDE
- {
- OUT_SAVE_INST_DATA;
+ std::string GetSaveData() OVERRIDE
+ {
+ OUT_SAVE_INST_DATA;
- std::ostringstream saveStream;
- saveStream << "H L " << m_auiEncounter[0] << ' ' << m_auiEncounter[1] << ' '
- << m_auiEncounter[2] << ' ' << m_auiEncounter[3];
+ std::ostringstream saveStream;
+ saveStream << "H L " << GetBossSaveData();
- OUT_SAVE_INST_DATA_COMPLETE;
- return saveStream.str();
- }
+ OUT_SAVE_INST_DATA_COMPLETE;
+ return saveStream.str();
+ }
- void Load(const char* in) OVERRIDE
- {
- if (!in)
+ void Load(const char* str) OVERRIDE
{
- OUT_LOAD_INST_DATA_FAIL;
- return;
- }
+ if (!str)
+ {
+ OUT_LOAD_INST_DATA_FAIL;
+ return;
+ }
- OUT_LOAD_INST_DATA(in);
+ OUT_LOAD_INST_DATA(str);
- char dataHead1, dataHead2;
- uint16 data0, data1, data2, data3;
+ char dataHead1, dataHead2;
- std::istringstream loadStream(in);
- loadStream >> dataHead1 >> dataHead2 >> data0 >> data1 >> data2 >> data3;
+ std::istringstream loadStream(str);
+ loadStream >> dataHead1 >> dataHead2;
- if (dataHead1 == 'H' && dataHead2 == 'L')
- {
- m_auiEncounter[0] = data0;
- m_auiEncounter[1] = data1;
- m_auiEncounter[2] = data2;
- m_auiEncounter[3] = data3;
+ if (dataHead1 == 'H' && dataHead2 == 'L')
+ {
+ for (uint32 i = 0; i < EncounterCount; ++i)
+ {
+ uint32 tmpState;
+ loadStream >> tmpState;
+ if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
+ tmpState = NOT_STARTED;
+ SetBossState(i, EncounterState(tmpState));
+ }
+ }
+ else
+ OUT_LOAD_INST_DATA_FAIL;
- for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
- if (m_auiEncounter[i] == IN_PROGRESS)
- m_auiEncounter[i] = NOT_STARTED;
- } else OUT_LOAD_INST_DATA_FAIL;
+ OUT_LOAD_INST_DATA_COMPLETE;
+ }
- OUT_LOAD_INST_DATA_COMPLETE;
- }
- };
+ protected:
+ uint64 GeneralBjarngrimGUID;
+ uint64 VolkhanGUID;
+ uint64 IonarGUID;
+ uint64 LokenGUID;
+
+ uint64 LokenGlobeGUID;
+ };
+ InstanceScript* GetInstanceScript(InstanceMap* map) const OVERRIDE
+ {
+ return new instance_halls_of_lightning_InstanceMapScript(map);
+ }
};
void AddSC_instance_halls_of_lightning()
diff --git a/src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp b/src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp
index 025e93ac8d9..60d7570b96f 100644
--- a/src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp
+++ b/src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp
@@ -608,6 +608,7 @@ public:
if (GameObject* pMainDoor = instance->GetGameObject(uiMainDoor))
pMainDoor->SetGoState(GO_STATE_READY);
DoUpdateWorldState(WORLD_STATE_VH_PRISON_STATE, 100);
+ // no break
}
default:
SpawnPortal();
diff --git a/src/server/scripts/Northrend/zone_borean_tundra.cpp b/src/server/scripts/Northrend/zone_borean_tundra.cpp
index da8511a98d5..2b5508272d9 100644
--- a/src/server/scripts/Northrend/zone_borean_tundra.cpp
+++ b/src/server/scripts/Northrend/zone_borean_tundra.cpp
@@ -90,7 +90,7 @@ public:
}
}
- void EnterCombat(Unit* /*who*/)OVERRIDE {}
+ void EnterCombat(Unit* /*who*/) OVERRIDE {}
void UpdateAI(uint32 diff) OVERRIDE
{
@@ -119,7 +119,8 @@ public:
case 3:
DoCast(me, SPELL_EXPLODE_CART, true);
phaseTimer = 2000;
- phase = 4;
+ phase = 5; // @fixme: phase 4 is missing...
+ break;
case 5:
DoCast(me, SPELL_SUMMON_WORM, true);
if (Unit* worm = me->FindNearestCreature(26250, 3))
diff --git a/src/server/scripts/Northrend/zone_sholazar_basin.cpp b/src/server/scripts/Northrend/zone_sholazar_basin.cpp
index 86a65e98561..bf284c5138b 100644
--- a/src/server/scripts/Northrend/zone_sholazar_basin.cpp
+++ b/src/server/scripts/Northrend/zone_sholazar_basin.cpp
@@ -619,7 +619,7 @@ public:
for (uint8 i = 0; i < 3; ++i)
{
- if (quest->RequiredNpcOrGo[i] != me->GetEntry())
+ if (uint32(quest->RequiredNpcOrGo[i]) != me->GetEntry())
continue;
if (itr->second.CreatureOrGOCount[i] != 0)
diff --git a/src/server/scripts/Outland/BlackTemple/black_temple.h b/src/server/scripts/Outland/BlackTemple/black_temple.h
index 971cc36d7ba..fb529a6b522 100644
--- a/src/server/scripts/Outland/BlackTemple/black_temple.h
+++ b/src/server/scripts/Outland/BlackTemple/black_temple.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,36 +18,77 @@
#ifndef BLACK_TEMPLE_H_
#define BLACK_TEMPLE_H_
+#define BTScriptName "instance_black_temple"
+
uint32 const EncounterCount = 9;
enum DataTypes
{
- DATA_AKAMA = 1,
- DATA_AKAMA_SHADE = 2,
- DATA_GURTOGGBLOODBOILEVENT = 3,
- DATA_HIGHWARLORDNAJENTUS = 4,
- DATA_HIGHWARLORDNAJENTUSEVENT = 5,
- DATA_ILLIDANSTORMRAGE = 6,
- DATA_ILLIDANSTORMRAGEEVENT = 7,
- DATA_ILLIDARICOUNCILEVENT = 8,
- DATA_ILLIDARICOUNCIL = 9,
- DATA_LADYMALANDE = 10,
- DATA_HIGHNETHERMANCERZEREVOR = 11,
- DATA_GATHIOSTHESHATTERER = 12,
- DATA_VERASDARKSHADOW = 13,
- DATA_MOTHERSHAHRAZEVENT = 14,
- DATA_RELIQUARYOFSOULSEVENT = 15,
- DATA_SHADEOFAKAMA = 16,
- DATA_SHADEOFAKAMAEVENT = 17,
- DATA_SUPREMUS = 18,
- DATA_SUPREMUSEVENT = 19,
- DATA_TERONGOREFIENDEVENT = 20,
- DATA_GAMEOBJECT_NAJENTUS_GATE = 21,
- DATA_GAMEOBJECT_ILLIDAN_GATE = 22,
- DATA_GAMEOBJECT_ILLIDAN_DOOR_R = 23,
- DATA_GAMEOBJECT_ILLIDAN_DOOR_L = 24,
- DATA_GAMEOBJECT_SUPREMUS_DOORS = 25,
- DATA_BLOOD_ELF_COUNCIL_VOICE = 26
+ // Encounter States/Boss GUIDs
+ DATA_HIGH_WARLORD_NAJENTUS = 0,
+ DATA_SUPREMUS = 1,
+ DATA_SHADE_OF_AKAMA = 2,
+ DATA_TERON_GOREFIEND = 3,
+ DATA_GURTOGG_BLOODBOIL = 4,
+ DATA_RELIQUARY_OF_SOULS = 5,
+ DATA_MOTHER_SHAHRAZ = 6,
+ DATA_ILLIDARI_COUNCIL = 7,
+ DATA_ILLIDAN_STORMRAGE = 8,
+
+ // Additional Data
+ DATA_AKAMA_SHADE = 9,
+ DATA_AKAMA = 10,
+
+ DATA_GATHIOS_THE_SHATTERER = 11,
+ DATA_HIGH_NETHERMANCER_ZEREVOR = 12,
+ DATA_LADY_MALANDE = 13,
+ DATA_VERAS_DARKSHADOW = 14,
+ DATA_BLOOD_ELF_COUNCIL_VOICE = 15,
+
+ DATA_GO_ILLIDAN_GATE = 16,
+ DATA_GO_ILLIDAN_DOOR_R = 17,
+ DATA_GO_ILLIDAN_DOOR_L = 18
+};
+
+enum CreatureIds
+{
+ NPC_HIGH_WARLORD_NAJENTUS = 22887,
+ NPC_SUPREMUS = 22898,
+ NPC_SHADE_OF_AKAMA = 22841,
+ NPC_AKAMA_SHADE = 23191, // This is the Akama that starts the Shade of Akama encounter.
+ NPC_AKAMA = 23089, // This is the Akama that starts the Illidan encounter.
+
+ NPC_GATHIOS_THE_SHATTERER = 22949,
+ NPC_HIGH_NETHERMANCER_ZEREVOR = 22950,
+ NPC_LADY_MALANDE = 22951,
+ NPC_VERAS_DARKSHADOW = 22952,
+ NPC_ILLIDARI_COUNCIL = 23426,
+ NPC_BLOOD_ELF_COUNCIL_VOICE = 23499,
+
+ NPC_ILLIDAN_STORMRAGE = 22917
};
-#endif
+enum GameObjectIds
+{
+ GO_NAJENTUS_GATE = 185483,
+ GO_SUPREMUS_GATE = 185882,
+ GO_SHADE_OF_AKAMA_DOOR = 185478,
+ GO_TERON_DOOR_1 = 185480,
+ GO_TERON_DOOR_2 = 186153,
+ GO_GURTOGG_DOOR = 185892,
+ GO_TEMPLE_DOOR = 185479,
+ GO_MOTHER_SHAHRAZ_DOOR = 185482,
+ GO_COUNCIL_DOOR_1 = 185481,
+ GO_COUNCIL_DOOR_2 = 186152,
+ GO_ILLIDAN_GATE = 185905,
+ GO_ILLIDAN_DOOR_R = 186261,
+ GO_ILLIDAN_DOOR_L = 186262
+};
+
+template<class AI>
+AI* GetBlackTempleAI(Creature* creature)
+{
+ return GetInstanceAI<AI>(creature, BTScriptName);
+}
+
+#endif // BLACK_TEMPLE_H_
diff --git a/src/server/scripts/Outland/BlackTemple/boss_bloodboil.cpp b/src/server/scripts/Outland/BlackTemple/boss_bloodboil.cpp
index 7a11044476a..3a33885144d 100644
--- a/src/server/scripts/Outland/BlackTemple/boss_bloodboil.cpp
+++ b/src/server/scripts/Outland/BlackTemple/boss_bloodboil.cpp
@@ -96,7 +96,7 @@ public:
void Reset() OVERRIDE
{
if (instance)
- instance->SetData(DATA_GURTOGGBLOODBOILEVENT, NOT_STARTED);
+ instance->SetBossState(DATA_GURTOGG_BLOODBOIL, NOT_STARTED);
TargetGUID = 0;
@@ -124,7 +124,7 @@ public:
DoZoneInCombat();
Talk(SAY_AGGRO);
if (instance)
- instance->SetData(DATA_GURTOGGBLOODBOILEVENT, IN_PROGRESS);
+ instance->SetBossState(DATA_GURTOGG_BLOODBOIL, IN_PROGRESS);
}
void KilledUnit(Unit* /*victim*/) OVERRIDE
@@ -135,7 +135,7 @@ public:
void JustDied(Unit* /*killer*/) OVERRIDE
{
if (instance)
- instance->SetData(DATA_GURTOGGBLOODBOILEVENT, DONE);
+ instance->SetBossState(DATA_GURTOGG_BLOODBOIL, DONE);
Talk(SAY_DEATH);
}
diff --git a/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp b/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp
index f8f9bb790e0..4dedc774bb8 100644
--- a/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp
+++ b/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp
@@ -543,9 +543,9 @@ public:
if (!instance)
return;
- instance->SetData(DATA_ILLIDANSTORMRAGEEVENT, DONE); // Completed
+ instance->SetBossState(DATA_ILLIDAN_STORMRAGE, DONE);
- for (uint8 i = DATA_GAMEOBJECT_ILLIDAN_DOOR_R; i < DATA_GAMEOBJECT_ILLIDAN_DOOR_L + 1; ++i)
+ for (uint8 i = DATA_GO_ILLIDAN_DOOR_R; i < DATA_GO_ILLIDAN_DOOR_L + 1; ++i)
instance->HandleGameObject(instance->GetData64(i), true);
}
@@ -1369,12 +1369,12 @@ public:
WalkCount = 0;
if (instance)
{
- instance->SetData(DATA_ILLIDANSTORMRAGEEVENT, NOT_STARTED);
+ instance->SetBossState(DATA_ILLIDAN_STORMRAGE, NOT_STARTED);
- IllidanGUID = instance->GetData64(DATA_ILLIDANSTORMRAGE);
- GateGUID = instance->GetData64(DATA_GAMEOBJECT_ILLIDAN_GATE);
- DoorGUID[0] = instance->GetData64(DATA_GAMEOBJECT_ILLIDAN_DOOR_R);
- DoorGUID[1] = instance->GetData64(DATA_GAMEOBJECT_ILLIDAN_DOOR_L);
+ IllidanGUID = instance->GetData64(DATA_ILLIDAN_STORMRAGE);
+ GateGUID = instance->GetData64(DATA_GO_ILLIDAN_GATE);
+ DoorGUID[0] = instance->GetData64(DATA_GO_ILLIDAN_DOOR_R);
+ DoorGUID[1] = instance->GetData64(DATA_GO_ILLIDAN_DOOR_L);
if (JustCreated) // close all doors at create
{
@@ -1463,7 +1463,7 @@ public:
if (!instance)
return;
- instance->SetData(DATA_ILLIDANSTORMRAGEEVENT, IN_PROGRESS);
+ instance->SetBossState(DATA_ILLIDAN_STORMRAGE, IN_PROGRESS);
for (uint8 i = 0; i < 2; ++i)
instance->HandleGameObject(DoorGUID[i], false);
if (Creature* illidan = ObjectAccessor::GetCreature(*me, IllidanGUID))
@@ -1691,7 +1691,7 @@ public:
{
if (Check_Timer <= diff)
{
- if (instance && instance->GetData(DATA_ILLIDARICOUNCILEVENT) == DONE)
+ if (instance && instance->GetBossState(DATA_ILLIDARI_COUNCIL) == DONE)
me->SetVisible(true);
Check_Timer = 5000;
@@ -1800,18 +1800,14 @@ public:
void boss_illidan_stormrage::boss_illidan_stormrageAI::Reset()
{
if (instance)
- instance->SetData(DATA_ILLIDANSTORMRAGEEVENT, NOT_STARTED);
+ instance->SetBossState(DATA_ILLIDAN_STORMRAGE, NOT_STARTED);
- if (AkamaGUID)
+ if (Creature* akama = ObjectAccessor::GetCreature(*me, AkamaGUID))
{
- if (Creature* akama = ObjectAccessor::GetCreature(*me, AkamaGUID))
- {
- if (!akama->IsAlive())
- akama->Respawn();
- else
- akama->AI()->EnterEvadeMode();
- }
- AkamaGUID = 0;
+ if (!akama->IsAlive())
+ akama->Respawn();
+ else
+ akama->AI()->EnterEvadeMode();
}
MaievGUID = 0;
@@ -2164,7 +2160,7 @@ public:
void Reset() OVERRIDE
{
if (instance)
- IllidanGUID = instance->GetData64(DATA_ILLIDANSTORMRAGE);
+ IllidanGUID = instance->GetData64(DATA_ILLIDAN_STORMRAGE);
else
IllidanGUID = 0;
diff --git a/src/server/scripts/Outland/BlackTemple/boss_mother_shahraz.cpp b/src/server/scripts/Outland/BlackTemple/boss_mother_shahraz.cpp
index b9172be49da..aafe5f365b2 100644
--- a/src/server/scripts/Outland/BlackTemple/boss_mother_shahraz.cpp
+++ b/src/server/scripts/Outland/BlackTemple/boss_mother_shahraz.cpp
@@ -114,7 +114,7 @@ public:
void Reset() OVERRIDE
{
if (instance)
- instance->SetData(DATA_MOTHERSHAHRAZEVENT, NOT_STARTED);
+ instance->SetBossState(DATA_MOTHER_SHAHRAZ, NOT_STARTED);
for (uint8 i = 0; i<3; ++i)
TargetGUID[i] = 0;
@@ -137,7 +137,7 @@ public:
void EnterCombat(Unit* /*who*/) OVERRIDE
{
if (instance)
- instance->SetData(DATA_MOTHERSHAHRAZEVENT, IN_PROGRESS);
+ instance->SetBossState(DATA_MOTHER_SHAHRAZ, IN_PROGRESS);
DoZoneInCombat();
Talk(SAY_AGGRO);
@@ -151,7 +151,7 @@ public:
void JustDied(Unit* /*killer*/) OVERRIDE
{
if (instance)
- instance->SetData(DATA_MOTHERSHAHRAZEVENT, DONE);
+ instance->SetBossState(DATA_MOTHER_SHAHRAZ, DONE);
Talk(SAY_DEATH);
}
diff --git a/src/server/scripts/Outland/BlackTemple/boss_reliquary_of_souls.cpp b/src/server/scripts/Outland/BlackTemple/boss_reliquary_of_souls.cpp
index c7de0dea961..ab3bc98b41b 100644
--- a/src/server/scripts/Outland/BlackTemple/boss_reliquary_of_souls.cpp
+++ b/src/server/scripts/Outland/BlackTemple/boss_reliquary_of_souls.cpp
@@ -159,14 +159,13 @@ public:
void Reset() OVERRIDE
{
if (instance)
- instance->SetData(DATA_RELIQUARYOFSOULSEVENT, NOT_STARTED);
+ instance->SetBossState(DATA_RELIQUARY_OF_SOULS, NOT_STARTED);
if (EssenceGUID)
{
- if (Creature* Essence = Unit::GetCreature(*me, EssenceGUID))
- {
- Essence->DespawnOrUnsummon();
- }
+ if (Creature* essence = ObjectAccessor::GetCreature(*me, EssenceGUID))
+ essence->DespawnOrUnsummon();
+
EssenceGUID = 0;
}
@@ -178,7 +177,6 @@ public:
}
void MoveInLineOfSight(Unit* who) OVERRIDE
-
{
if (!who)
return;
@@ -200,7 +198,7 @@ public:
me->AddThreat(who, 10000.0f);
DoZoneInCombat();
if (instance)
- instance->SetData(DATA_RELIQUARYOFSOULSEVENT, IN_PROGRESS);
+ instance->SetBossState(DATA_RELIQUARY_OF_SOULS, IN_PROGRESS);
Phase = 1;
Counter = 0;
@@ -246,7 +244,7 @@ public:
void JustDied(Unit* /*killer*/) OVERRIDE
{
if (instance)
- instance->SetData(DATA_RELIQUARYOFSOULSEVENT, DONE);
+ instance->SetBossState(DATA_RELIQUARY_OF_SOULS, DONE);
}
void UpdateAI(uint32 diff) OVERRIDE
diff --git a/src/server/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp b/src/server/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp
index 4a4304bcd24..a1a965ed015 100644
--- a/src/server/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp
+++ b/src/server/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp
@@ -123,23 +123,22 @@ enum Events
EVENT_SUMMON_ASHTONGUE_SORCERER = 12,
EVENT_SUMMON_ASHTONGUE_DEFENDER = 13,
// Channeler
- EVENT_GET_SHADE_GUID = 14,
- EVENT_CHANNEL = 15,
+ EVENT_CHANNEL = 14,
// Ashtongue Sorcerer
- EVENT_SORCERER_CHANNEL = 16,
+ EVENT_SORCERER_CHANNEL = 15,
// Ashtongue Defender
- EVENT_DEBILITATING_STRIKE = 17,
- EVENT_HEROIC_STRIKE = 18,
- EVENT_SHIELD_BASH = 19,
- EVENT_WINDFURY = 20,
+ EVENT_DEBILITATING_STRIKE = 16,
+ EVENT_HEROIC_STRIKE = 17,
+ EVENT_SHIELD_BASH = 18,
+ EVENT_WINDFURY = 29,
// Ashtongue Rogue
- EVENT_DEBILITATING_POISON = 21,
- EVENT_EVISCERATE = 22,
+ EVENT_DEBILITATING_POISON = 20,
+ EVENT_EVISCERATE = 21,
// Ashtongue Elementalist
- EVENT_RAIN_OF_FIRE = 23,
- EVENT_LIGHTNING_BOLT = 24,
+ EVENT_RAIN_OF_FIRE = 22,
+ EVENT_LIGHTNING_BOLT = 23,
// Ashtongue Spiritbinder
- EVENT_SPIRIT_HEAL = 25,
+ EVENT_SPIRIT_HEAL = 24
};
struct Location
@@ -177,11 +176,11 @@ public:
if (!HasKilledAkamaAndReseting)
{
for (std::list<uint64>::const_iterator itr = Channelers.begin(); itr != Channelers.end(); ++itr)
- if (Creature* Channeler = (Unit::GetCreature(*me, *itr)))
+ if (Creature* Channeler = ObjectAccessor::GetCreature(*me, *itr))
Channeler->DespawnOrUnsummon();
for (std::list<uint64>::const_iterator itr = Spawners.begin(); itr != Spawners.end(); ++itr)
- if (Creature* Spawner = (Unit::GetCreature(*me, *itr)))
+ if (Creature* Spawner = ObjectAccessor::GetCreature(*me, *itr))
Spawner->AI()->SetData(SETDATA_DATA, SETDATA_DESPAWN_ALL_SPAWNS);
events.ScheduleEvent(EVENT_FIND_CHANNELERS_SPAWNERS, 3000);
@@ -200,16 +199,16 @@ public:
void JustDied(Unit* /*killer*/) OVERRIDE
{
if (instance)
- instance->SetData(DATA_SHADEOFAKAMAEVENT, DONE);
+ instance->SetBossState(DATA_SHADE_OF_AKAMA, DONE);
}
- void EnterCombat(Unit* /*who*/) OVERRIDE {}
+ void EnterCombat(Unit* /*who*/) OVERRIDE { }
void AttackStart(Unit* who) OVERRIDE
{
if (me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE))
{
- if (Creature* Akama = Unit::GetCreature((*me), akamaGUID))
+ if (Creature* Akama = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_AKAMA_SHADE)))
if (Akama->IsAlive())
ScriptedAI::AttackStart(Akama);
}
@@ -233,7 +232,7 @@ public:
events.ScheduleEvent(EVENT_START_ATTACK_AKAMA, 500);
events.ScheduleEvent(EVENT_SET_CHANNELERS_SPAWNERS, 1000);
me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_NONE);
- if (Creature* Akama = Unit::GetCreature((*me), akamaGUID))
+ if (Creature* Akama = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_AKAMA_SHADE)))
me->AddThreat(Akama, 10000000.0f);
}
else if (spell->Id == SPELL_SHADE_SOUL_CHANNEL_2)
@@ -269,7 +268,7 @@ public:
switch (eventId)
{
case EVENT_RESET_ENCOUNTER:
- if (Creature* Akama = Unit::GetCreature((*me), akamaGUID))
+ if (Creature* Akama = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_AKAMA_SHADE)))
if (!Akama->IsAlive())
Akama->Respawn();
break;
@@ -294,7 +293,6 @@ public:
Spawners.push_back((*itr)->GetGUID());
me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_STUN);
- akamaGUID = instance->GetData64(DATA_AKAMA_SHADE);
break;
}
default:
@@ -312,20 +310,19 @@ public:
{
for (std::list<uint64>::const_iterator itr = Channelers.begin(); itr != Channelers.end(); ++itr)
{
- if (Creature* Channeler = (Unit::GetCreature(*me, *itr)))
+ if (Creature* Channeler = ObjectAccessor::GetCreature(*me, *itr))
Channeler->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
}
for (std::list<uint64>::const_iterator itr = Spawners.begin(); itr != Spawners.end(); ++itr)
{
- if (Creature* Spawner = (Unit::GetCreature(*me, *itr)))
+ if (Creature* Spawner = ObjectAccessor::GetCreature(*me, *itr))
Spawner->AI()->SetData(SETDATA_DATA, SETDATA_START_SPAWNING);
}
-
break;
}
case EVENT_START_ATTACK_AKAMA:
- me->GetMotionMaster()->MovePoint(0, ShadeWP.x, ShadeWP.y, ShadeWP.z ,false);
+ me->GetMotionMaster()->MovePoint(0, ShadeWP.x, ShadeWP.y, ShadeWP.z, false);
events.ScheduleEvent(EVENT_START_ATTACK_AKAMA, 1000);
break;
case EVENT_ADD_THREAT:
@@ -343,7 +340,7 @@ public:
{
HasKilledAkamaAndReseting = true;
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- instance->SetData(DATA_SHADEOFAKAMAEVENT, NOT_STARTED);
+ instance->SetBossState(DATA_SHADE_OF_AKAMA, NOT_STARTED);
me->RemoveAllAurasExceptType(SPELL_AURA_DUMMY);
me->DeleteThreatList();
me->CombatStop();
@@ -351,15 +348,15 @@ public:
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
combatStarted = false;
- if (Creature* Akama = Unit::GetCreature((*me), akamaGUID))
+ if (Creature* Akama = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_AKAMA_SHADE)))
Akama->DespawnOrUnsummon();
for (std::list<uint64>::const_iterator itr = Channelers.begin(); itr != Channelers.end(); ++itr)
- if (Creature* Channeler = (Unit::GetCreature(*me, *itr)))
+ if (Creature* Channeler = ObjectAccessor::GetCreature(*me, *itr))
Channeler->DespawnOrUnsummon();
for (std::list<uint64>::const_iterator itr = Spawners.begin(); itr != Spawners.end(); ++itr)
- if (Creature* Spawner = (Unit::GetCreature(*me, *itr)))
+ if (Creature* Spawner = ObjectAccessor::GetCreature(*me, *itr))
Spawner->AI()->SetData(SETDATA_DATA, SETDATA_DESPAWN_ALL_SPAWNS);
events.ScheduleEvent(EVENT_FIND_CHANNELERS_SPAWNERS, 10000);
@@ -369,7 +366,7 @@ public:
if (!akamaReached)
{
- if (Creature* Akama = Unit::GetCreature((*me), akamaGUID))
+ if (Creature* Akama = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_AKAMA_SHADE)))
{
if (me->IsWithinDist(Akama, 2.0f, false))
{
@@ -384,7 +381,7 @@ public:
events.ScheduleEvent(EVENT_ADD_THREAT, 100);
for (std::list<uint64>::const_iterator itr = Spawners.begin(); itr != Spawners.end(); ++itr)
- if (Creature* Spawner = (Unit::GetCreature(*me, *itr)))
+ if (Creature* Spawner = ObjectAccessor::GetCreature(*me, *itr))
Spawner->AI()->SetData(SETDATA_DATA, SETDATA_STOP_SPAWNING);
}
}
@@ -401,8 +398,6 @@ public:
EventMap events;
std::list<uint64> Channelers;
std::list<uint64> Spawners;
- uint64 akamaGUID;
- uint64 ShadeGUID;
bool akamaReached;
bool combatStarted;
bool HasKilledAkamaAndReseting;
@@ -443,7 +438,7 @@ public:
void JustDied(Unit* /*killer*/) OVERRIDE
{
- if (Creature* Shade = Unit::GetCreature((*me), ShadeGUID))
+ if (Creature* Shade = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_SHADE_OF_AKAMA)))
if (Shade->IsAlive())
CAST_AI(boss_shade_of_akama::boss_shade_of_akamaAI, Shade->AI())->HasKilledAkama = true;
me->GetMotionMaster()->Clear(true);
@@ -452,17 +447,14 @@ public:
void SpellHit(Unit* /*caster*/, SpellInfo const* spell) OVERRIDE
{
- if (!StartCombat)
+ if (spell->Id == SPELL_THREAT && !StartCombat)
{
- if (spell->Id == SPELL_THREAT)
- {
- me->ClearUnitState(UNIT_STATE_ROOT);
- me->RemoveAura(SPELL_AKAMA_SOUL_CHANNEL);
- me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED);
- if (Creature* Shade = Unit::GetCreature((*me), ShadeGUID))
- Shade->RemoveAura(SPELL_AKAMA_SOUL_CHANNEL);
- StartCombat = true;
- }
+ me->ClearUnitState(UNIT_STATE_ROOT);
+ me->RemoveAura(SPELL_AKAMA_SOUL_CHANNEL);
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED);
+ if (Creature* Shade = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_SHADE_OF_AKAMA)))
+ Shade->RemoveAura(SPELL_AKAMA_SOUL_CHANNEL);
+ StartCombat = true;
}
}
@@ -485,8 +477,7 @@ public:
case EVENT_SHADE_START:
if (instance)
{
- ShadeGUID = instance->GetData64(DATA_SHADEOFAKAMA);
- instance->SetData(DATA_SHADEOFAKAMAEVENT, IN_PROGRESS);
+ instance->SetBossState(DATA_SHADE_OF_AKAMA, IN_PROGRESS);
me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
me->RemoveAura(SPELL_STEALTH);
me->SetWalk(true);
@@ -550,7 +541,6 @@ public:
private:
InstanceScript* instance;
EventMap events;
- uint64 ShadeGUID;
bool StartChannel;
bool ShadeHasDied;
bool StartCombat;
@@ -587,17 +577,16 @@ public:
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
events.ScheduleEvent(EVENT_CHANNEL, 2000);
- events.ScheduleEvent(EVENT_GET_SHADE_GUID, 1000);
}
void JustDied(Unit* /*killer*/) OVERRIDE
{
- if (Creature* Shade = (Unit::GetCreature((*me), ShadeGUID)))
+ if (Creature* Shade = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_SHADE_OF_AKAMA)))
Shade->AI()->SetData(SETDATA_DATA, SETDATA_CHANNELER_DIED);
}
- void EnterCombat(Unit* /*who*/) OVERRIDE {}
- void AttackStart(Unit* /*who*/) OVERRIDE {}
+ void EnterCombat(Unit* /*who*/) OVERRIDE { }
+ void AttackStart(Unit* /*who*/) OVERRIDE { }
void UpdateAI(uint32 diff) OVERRIDE
{
@@ -608,7 +597,7 @@ public:
switch (eventId)
{
case EVENT_CHANNEL:
- if (Creature* Shade = (Unit::GetCreature((*me), ShadeGUID)))
+ if (Creature* Shade = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_SHADE_OF_AKAMA)))
{
if (Shade->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE))
DoCast(me, SPELL_SHADE_SOUL_CHANNEL);
@@ -620,10 +609,6 @@ public:
}
events.ScheduleEvent(EVENT_CHANNEL, 2000);
break;
- case EVENT_GET_SHADE_GUID:
- if (instance)
- ShadeGUID = instance->GetData64(DATA_SHADEOFAKAMA);
- break;
default:
break;
}
@@ -633,7 +618,6 @@ public:
private:
InstanceScript* instance;
EventMap events;
- uint64 ShadeGUID;
};
CreatureAI* GetAI(Creature* creature) const OVERRIDE
@@ -764,25 +748,19 @@ public:
npc_ashtongue_sorcererAI(Creature* creature) : ScriptedAI(creature)
{
instance = creature->GetInstanceScript();
-
- if (instance)
- {
- akamaGUID = instance->GetData64(DATA_AKAMA_SHADE);
- shadeGUID = instance->GetData64(DATA_SHADEOFAKAMA);
- }
}
void Reset() OVERRIDE
{
if (!startedBanishing)
{
- if (Creature* Shade = (Unit::GetCreature((*me), shadeGUID)))
+ if (Creature* Shade = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_SHADE_OF_AKAMA)))
{
if (Shade->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE))
me->GetMotionMaster()->MovePoint(0, Shade->GetPositionX(), Shade->GetPositionY(), Shade->GetPositionZ(), false);
else
{
- if (Unit* target = me->GetCreature(*me, akamaGUID))
+ if (Unit* target = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_AKAMA_SHADE)))
AttackStart(target);
}
}
@@ -795,7 +773,7 @@ public:
void JustDied(Unit* /*killer*/) OVERRIDE
{
- if (Creature* Shade = (Unit::GetCreature((*me), shadeGUID)))
+ if (Creature* Shade = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_SHADE_OF_AKAMA)))
Shade->AI()->SetData(SETDATA_DATA, SETDATA_CHANNELER_DIED);
me->DespawnOrUnsummon(5000);
}
@@ -824,7 +802,7 @@ public:
switch (eventId)
{
case EVENT_SORCERER_CHANNEL:
- if (Creature* Shade = (Unit::GetCreature((*me), shadeGUID)))
+ if (Creature* Shade = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_SHADE_OF_AKAMA)))
{
if (Shade->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE))
{
@@ -837,7 +815,7 @@ public:
me->InterruptSpell(CURRENT_CHANNELED_SPELL);
Shade->AI()->SetData(SETDATA_DATA, SETDATA_CHANNELER_DIED);
switchToCombat = true;
- if (Unit* target = me->GetCreature(*me, akamaGUID))
+ if (Unit* target = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_AKAMA_SHADE)))
AttackStart(target);
}
}
@@ -849,7 +827,7 @@ public:
if (!startedBanishing)
{
- Creature* Shade = Unit::GetCreature((*me), shadeGUID);
+ Creature* Shade = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_SHADE_OF_AKAMA));
if (me->IsWithinDist(Shade, 20.0f, false))
{
me->StopMoving();
@@ -866,8 +844,6 @@ public:
private:
InstanceScript* instance;
EventMap events;
- uint64 akamaGUID;
- uint64 shadeGUID;
uint64 summonerGuid;
float distanceToShade;
bool startedBanishing;
@@ -894,15 +870,13 @@ public:
npc_ashtongue_defenderAI(Creature* creature) : ScriptedAI(creature)
{
instance = creature->GetInstanceScript();
- if (instance)
- akamaGUID = instance->GetData64(DATA_AKAMA_SHADE);
}
void Reset() OVERRIDE
{
summonerGuid = 0;
- if (Unit* target = me->GetCreature(*me, akamaGUID))
+ if (Unit* target = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_AKAMA_SHADE)))
AttackStart(target);
}
@@ -956,13 +930,13 @@ public:
break;
}
}
+
DoMeleeAttackIfReady();
}
private:
InstanceScript* instance;
EventMap events;
- uint64 akamaGUID;
uint64 summonerGuid;
};
@@ -986,15 +960,13 @@ public:
npc_ashtongue_rogueAI(Creature* creature) : ScriptedAI(creature)
{
instance = creature->GetInstanceScript();
- if (instance)
- akamaGUID = instance->GetData64(DATA_AKAMA_SHADE);
}
void Reset() OVERRIDE
{
summonerGuid = 0;
- if (Unit* target = me->GetCreature(*me, akamaGUID))
+ if (Unit* target = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_AKAMA_SHADE)))
AttackStart(target);
}
@@ -1038,13 +1010,13 @@ public:
break;
}
}
+
DoMeleeAttackIfReady();
}
private:
InstanceScript* instance;
EventMap events;
- uint64 akamaGUID;
uint64 summonerGuid;
};
@@ -1068,15 +1040,13 @@ public:
npc_ashtongue_elementalistAI(Creature* creature) : ScriptedAI(creature)
{
instance = creature->GetInstanceScript();
- if (instance)
- akamaGUID = instance->GetData64(DATA_AKAMA_SHADE);
}
void Reset() OVERRIDE
{
summonerGuid = 0;
- if (Unit* target = me->GetCreature(*me, akamaGUID))
+ if (Unit* target = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_AKAMA_SHADE)))
AttackStart(target);
}
@@ -1120,13 +1090,13 @@ public:
break;
}
}
+
DoMeleeAttackIfReady();
}
private:
InstanceScript* instance;
EventMap events;
- uint64 akamaGUID;
uint64 summonerGuid;
};
@@ -1150,8 +1120,6 @@ public:
npc_ashtongue_spiritbinderAI(Creature* creature) : ScriptedAI(creature)
{
instance = creature->GetInstanceScript();
- if (instance)
- akamaGUID = instance->GetData64(DATA_AKAMA_SHADE);
}
void Reset() OVERRIDE
@@ -1160,7 +1128,7 @@ public:
chainHeal = false;
summonerGuid = 0;
- if (Unit* target = me->GetCreature(*me, akamaGUID))
+ if (Unit* target = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_AKAMA_SHADE)))
AttackStart(target);
}
@@ -1224,7 +1192,6 @@ public:
private:
InstanceScript* instance;
EventMap events;
- uint64 akamaGUID;
uint64 summonerGuid;
bool spiritMend;
bool chainHeal;
diff --git a/src/server/scripts/Outland/BlackTemple/boss_supremus.cpp b/src/server/scripts/Outland/BlackTemple/boss_supremus.cpp
index fbc3e387e8e..94423f87bdf 100644
--- a/src/server/scripts/Outland/BlackTemple/boss_supremus.cpp
+++ b/src/server/scripts/Outland/BlackTemple/boss_supremus.cpp
@@ -31,7 +31,7 @@ EndScriptData */
enum Supremus
{
EMOTE_NEW_TARGET = 0,
- EMOTE_PUNCH_GROUND = 1, //Talk(EMOTE_PUNCH_GROUND);
+ EMOTE_PUNCH_GROUND = 1,
EMOTE_GROUND_CRACK = 2,
//Spells
@@ -110,11 +110,7 @@ public:
if (instance)
{
if (me->IsAlive())
- {
- instance->SetData(DATA_SUPREMUSEVENT, NOT_STARTED);
- //ToggleDoors(true);
- }
- //else ToggleDoors(false);
+ instance->SetBossState(DATA_SUPREMUS, NOT_STARTED);
}
phase = 0;
@@ -126,7 +122,7 @@ public:
void EnterCombat(Unit* /*who*/) OVERRIDE
{
if (instance)
- instance->SetData(DATA_SUPREMUSEVENT, IN_PROGRESS);
+ instance->SetBossState(DATA_SUPREMUS, IN_PROGRESS);
ChangePhase();
events.ScheduleEvent(EVENT_BERSERK, 900000, GCD_CAST);
@@ -163,10 +159,8 @@ public:
void JustDied(Unit* /*killer*/) OVERRIDE
{
if (instance)
- {
- instance->SetData(DATA_SUPREMUSEVENT, DONE);
- instance->HandleGameObject(instance->GetData64(DATA_GAMEOBJECT_SUPREMUS_DOORS), true);
- }
+ instance->SetBossState(DATA_SUPREMUS, DONE);
+
summons.DespawnAll();
}
diff --git a/src/server/scripts/Outland/BlackTemple/boss_teron_gorefiend.cpp b/src/server/scripts/Outland/BlackTemple/boss_teron_gorefiend.cpp
index a861980ae42..c02954c7b2f 100644
--- a/src/server/scripts/Outland/BlackTemple/boss_teron_gorefiend.cpp
+++ b/src/server/scripts/Outland/BlackTemple/boss_teron_gorefiend.cpp
@@ -247,7 +247,7 @@ public:
void Reset() OVERRIDE
{
if (instance)
- instance->SetData(DATA_TERONGOREFIENDEVENT, NOT_STARTED);
+ instance->SetBossState(DATA_TERON_GOREFIEND, NOT_STARTED);
IncinerateTimer = urand(20000, 31000);
SummonDoomBlossomTimer = 12000;
@@ -276,7 +276,7 @@ public:
if (me->IsWithinDistInMap(who, VISIBLE_RANGE) && me->IsWithinLOSInMap(who))
{
if (instance)
- instance->SetData(DATA_TERONGOREFIENDEVENT, IN_PROGRESS);
+ instance->SetBossState(DATA_TERON_GOREFIEND, IN_PROGRESS);
me->GetMotionMaster()->Clear(false);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
@@ -298,7 +298,7 @@ public:
void JustDied(Unit* /*killer*/) OVERRIDE
{
if (instance)
- instance->SetData(DATA_TERONGOREFIENDEVENT, DONE);
+ instance->SetBossState(DATA_TERON_GOREFIEND, DONE);
Talk(SAY_DEATH);
}
diff --git a/src/server/scripts/Outland/BlackTemple/boss_warlord_najentus.cpp b/src/server/scripts/Outland/BlackTemple/boss_warlord_najentus.cpp
index 532c66bb14a..1f4a36afad6 100644
--- a/src/server/scripts/Outland/BlackTemple/boss_warlord_najentus.cpp
+++ b/src/server/scripts/Outland/BlackTemple/boss_warlord_najentus.cpp
@@ -100,7 +100,7 @@ public:
SpineTargetGUID = 0;
if (instance)
- instance->SetData(DATA_HIGHWARLORDNAJENTUSEVENT, NOT_STARTED);
+ instance->SetBossState(DATA_HIGH_WARLORD_NAJENTUS, NOT_STARTED);
}
void KilledUnit(Unit* /*victim*/) OVERRIDE
@@ -112,7 +112,7 @@ public:
void JustDied(Unit* /*killer*/) OVERRIDE
{
if (instance)
- instance->SetData(DATA_HIGHWARLORDNAJENTUSEVENT, DONE);
+ instance->SetBossState(DATA_HIGH_WARLORD_NAJENTUS, DONE);
Talk(SAY_DEATH);
}
@@ -130,7 +130,7 @@ public:
void EnterCombat(Unit* /*who*/) OVERRIDE
{
if (instance)
- instance->SetData(DATA_HIGHWARLORDNAJENTUSEVENT, IN_PROGRESS);
+ instance->SetBossState(DATA_HIGH_WARLORD_NAJENTUS, IN_PROGRESS);
Talk(SAY_AGGRO);
DoZoneInCombat();
@@ -228,7 +228,7 @@ public:
bool OnGossipHello(Player* player, GameObject* go) OVERRIDE
{
if (InstanceScript* instance = go->GetInstanceScript())
- if (Creature* Najentus = Unit::GetCreature(*go, instance->GetData64(DATA_HIGHWARLORDNAJENTUS)))
+ if (Creature* Najentus = ObjectAccessor::GetCreature(*go, instance->GetData64(DATA_HIGH_WARLORD_NAJENTUS)))
if (CAST_AI(boss_najentus::boss_najentusAI, Najentus->AI())->RemoveImpalingSpine())
{
player->CastSpell(player, SPELL_CREATE_NAJENTUS_SPINE, true);
diff --git a/src/server/scripts/Outland/BlackTemple/illidari_council.cpp b/src/server/scripts/Outland/BlackTemple/illidari_council.cpp
index 290641437f3..05d19eb62bf 100644
--- a/src/server/scripts/Outland/BlackTemple/illidari_council.cpp
+++ b/src/server/scripts/Outland/BlackTemple/illidari_council.cpp
@@ -157,10 +157,10 @@ public:
{
if (InstanceScript* instance = me->GetInstanceScript())
{
- Council[0] = instance->GetData64(DATA_GATHIOSTHESHATTERER);
- Council[1] = instance->GetData64(DATA_VERASDARKSHADOW);
- Council[2] = instance->GetData64(DATA_LADYMALANDE);
- Council[3] = instance->GetData64(DATA_HIGHNETHERMANCERZEREVOR);
+ Council[0] = instance->GetData64(DATA_GATHIOS_THE_SHATTERER);
+ Council[1] = instance->GetData64(DATA_VERAS_DARKSHADOW);
+ Council[2] = instance->GetData64(DATA_LADY_MALANDE);
+ Council[3] = instance->GetData64(DATA_HIGH_NETHERMANCER_ZEREVOR);
} else TC_LOG_ERROR(LOG_FILTER_TSCR, ERROR_INST_DATA);
}
@@ -265,8 +265,8 @@ public:
if (instance)
{
- instance->SetData(DATA_ILLIDARICOUNCILEVENT, NOT_STARTED);
- if (Creature* VoiceTrigger = (Unit::GetCreature(*me, instance->GetData64(DATA_BLOOD_ELF_COUNCIL_VOICE))))
+ instance->SetBossState(DATA_ILLIDARI_COUNCIL, NOT_STARTED);
+ if (Creature* VoiceTrigger = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_BLOOD_ELF_COUNCIL_VOICE)))
VoiceTrigger->AI()->EnterEvadeMode();
}
@@ -289,13 +289,13 @@ public:
if (target && target->IsAlive())
{
- Council[0] = instance->GetData64(DATA_GATHIOSTHESHATTERER);
- Council[1] = instance->GetData64(DATA_HIGHNETHERMANCERZEREVOR);
- Council[2] = instance->GetData64(DATA_LADYMALANDE);
- Council[3] = instance->GetData64(DATA_VERASDARKSHADOW);
+ Council[0] = instance->GetData64(DATA_GATHIOS_THE_SHATTERER);
+ Council[1] = instance->GetData64(DATA_HIGH_NETHERMANCER_ZEREVOR);
+ Council[2] = instance->GetData64(DATA_LADY_MALANDE);
+ Council[3] = instance->GetData64(DATA_VERAS_DARKSHADOW);
// Start the event for the Voice Trigger
- if (Creature* VoiceTrigger = (Unit::GetCreature(*me, instance->GetData64(DATA_BLOOD_ELF_COUNCIL_VOICE))))
+ if (Creature* VoiceTrigger = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_BLOOD_ELF_COUNCIL_VOICE)))
{
CAST_AI(npc_blood_elf_council_voice_trigger::npc_blood_elf_council_voice_triggerAI, VoiceTrigger->AI())->LoadCouncilGUIDs();
CAST_AI(npc_blood_elf_council_voice_trigger::npc_blood_elf_council_voice_triggerAI, VoiceTrigger->AI())->EventStarted = true;
@@ -305,13 +305,13 @@ public:
{
if (Council[i])
{
- Unit* member = Unit::GetUnit(*me, Council[i]);
- if (member && member->IsAlive())
- member->ToCreature()->AI()->AttackStart(target);
+ if (Creature* member = ObjectAccessor::GetCreature(*me, Council[i]))
+ if (member->IsAlive())
+ member->AI()->AttackStart(target);
}
}
- instance->SetData(DATA_ILLIDARICOUNCILEVENT, IN_PROGRESS);
+ instance->SetBossState(DATA_ILLIDARI_COUNCIL, IN_PROGRESS);
EventBegun = true;
}
@@ -330,9 +330,9 @@ public:
{
if (instance)
{
- if (Creature* VoiceTrigger = (Unit::GetCreature(*me, instance->GetData64(DATA_BLOOD_ELF_COUNCIL_VOICE))))
+ if (Creature* VoiceTrigger = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_BLOOD_ELF_COUNCIL_VOICE)))
VoiceTrigger->DealDamage(VoiceTrigger, VoiceTrigger->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
- instance->SetData(DATA_ILLIDARICOUNCILEVENT, DONE);
+ instance->SetBossState(DATA_ILLIDARI_COUNCIL, DONE);
//me->SummonCreature(AKAMAID, 746.466980f, 304.394989f, 311.90208f, 6.272870f, TEMPSUMMON_DEAD_DESPAWN, 0);
}
me->DealDamage(me, me->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
@@ -403,9 +403,8 @@ struct boss_illidari_councilAI : public ScriptedAI
{
if (instance)
{
- Creature* Controller = (Unit::GetCreature(*me, instance->GetData64(DATA_ILLIDARICOUNCIL)));
- if (Controller)
- CAST_AI(npc_illidari_council::npc_illidari_councilAI, Controller->AI())->StartEvent(who);
+ if (Creature* controller = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_ILLIDARI_COUNCIL)))
+ CAST_AI(npc_illidari_council::npc_illidari_councilAI, controller->AI())->StartEvent(who);
}
else
{
@@ -461,10 +460,10 @@ struct boss_illidari_councilAI : public ScriptedAI
return;
}
- Council[0] = instance->GetData64(DATA_LADYMALANDE);
- Council[1] = instance->GetData64(DATA_HIGHNETHERMANCERZEREVOR);
- Council[2] = instance->GetData64(DATA_GATHIOSTHESHATTERER);
- Council[3] = instance->GetData64(DATA_VERASDARKSHADOW);
+ Council[0] = instance->GetData64(DATA_LADY_MALANDE);
+ Council[1] = instance->GetData64(DATA_HIGH_NETHERMANCER_ZEREVOR);
+ Council[2] = instance->GetData64(DATA_GATHIOS_THE_SHATTERER);
+ Council[3] = instance->GetData64(DATA_VERAS_DARKSHADOW);
LoadedGUIDs = true;
}
diff --git a/src/server/scripts/Outland/BlackTemple/instance_black_temple.cpp b/src/server/scripts/Outland/BlackTemple/instance_black_temple.cpp
index bd70ce012ba..591f28a19f3 100644
--- a/src/server/scripts/Outland/BlackTemple/instance_black_temple.cpp
+++ b/src/server/scripts/Outland/BlackTemple/instance_black_temple.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,382 +15,261 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/* ScriptData
-SDName: Instance_Black_Temple
-SD%Complete: 100
-SDComment: Instance Data Scripts and functions to acquire mobs and set encounter status for use in various Black Temple Scripts
-SDCategory: Black Temple
-EndScriptData */
-
#include "ScriptMgr.h"
#include "InstanceScript.h"
#include "black_temple.h"
-#include "Player.h"
-/* Black Temple encounters:
-0 - High Warlord Naj'entus event
-1 - Supremus Event
-2 - Shade of Akama Event
-3 - Teron Gorefiend Event
-4 - Gurtogg Bloodboil Event
-5 - Reliquary Of Souls Event
-6 - Mother Shahraz Event
-7 - Illidari Council Event
-8 - Illidan Stormrage Event
-*/
+DoorData const doorData[] =
+{
+ { GO_NAJENTUS_GATE, DATA_HIGH_WARLORD_NAJENTUS, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
+ { GO_NAJENTUS_GATE, DATA_SUPREMUS, DOOR_TYPE_ROOM, BOUNDARY_NONE },
+ { GO_SUPREMUS_GATE, DATA_SUPREMUS, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
+ { GO_SHADE_OF_AKAMA_DOOR, DATA_SHADE_OF_AKAMA, DOOR_TYPE_ROOM, BOUNDARY_NONE },
+ { GO_TERON_DOOR_1, DATA_TERON_GOREFIEND, DOOR_TYPE_ROOM, BOUNDARY_NONE },
+ { GO_TERON_DOOR_2, DATA_TERON_GOREFIEND, DOOR_TYPE_ROOM, BOUNDARY_NONE },
+ { GO_GURTOGG_DOOR, DATA_GURTOGG_BLOODBOIL, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
+ { GO_TEMPLE_DOOR, DATA_RELIQUARY_OF_SOULS, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
+ { GO_MOTHER_SHAHRAZ_DOOR, DATA_MOTHER_SHAHRAZ, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
+ { GO_COUNCIL_DOOR_1, DATA_ILLIDARI_COUNCIL, DOOR_TYPE_ROOM, BOUNDARY_NONE },
+ { GO_COUNCIL_DOOR_2, DATA_ILLIDARI_COUNCIL, DOOR_TYPE_ROOM, BOUNDARY_NONE },
+ { 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE } // END
+};
class instance_black_temple : public InstanceMapScript
{
-public:
- instance_black_temple() : InstanceMapScript("instance_black_temple", 564) { }
-
- InstanceScript* GetInstanceScript(InstanceMap* map) const OVERRIDE
- {
- return new instance_black_temple_InstanceMapScript(map);
- }
-
- struct instance_black_temple_InstanceMapScript : public InstanceScript
- {
- instance_black_temple_InstanceMapScript(Map* map) : InstanceScript(map) {}
-
- uint32 m_auiEncounter[EncounterCount];
- std::string str_data;
-
- uint64 Najentus;
- uint64 Akama; // This is the Akama that starts the Illidan encounter.
- uint64 Akama_Shade; // This is the Akama that starts the Shade of Akama encounter.
- uint64 ShadeOfAkama;
- uint64 Supremus;
- uint64 LadyMalande;
- uint64 GathiosTheShatterer;
- uint64 HighNethermancerZerevor;
- uint64 VerasDarkshadow;
- uint64 IllidariCouncil;
- uint64 BloodElfCouncilVoice;
- uint64 IllidanStormrage;
-
- uint64 NajentusGate;
- uint64 MainTempleDoors;
- uint64 ShadeOfAkamaDoor;
- uint64 CommonDoor;//Teron
- uint64 TeronDoor;
- uint64 GuurtogDoor;
- uint64 MotherDoor;
- uint64 TempleDoor;//Befor mother
- uint64 CouncilDoor;
- uint64 SimpleDoor;//council
- uint64 IllidanGate;
- uint64 IllidanDoor[2];
-
- void Initialize() OVERRIDE
- {
- memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
+ public:
+ instance_black_temple() : InstanceMapScript(BTScriptName, 564) { }
- Najentus = 0;
- Akama = 0;
- Akama_Shade = 0;
- ShadeOfAkama = 0;
- Supremus = 0;
- LadyMalande = 0;
- GathiosTheShatterer = 0;
- HighNethermancerZerevor = 0;
- VerasDarkshadow = 0;
- IllidariCouncil = 0;
- BloodElfCouncilVoice = 0;
- IllidanStormrage = 0;
-
- NajentusGate = 0;
- MainTempleDoors = 0;
- ShadeOfAkamaDoor = 0;
- CommonDoor = 0; // teron
- TeronDoor = 0;
- GuurtogDoor = 0;
- MotherDoor = 0;
- TempleDoor = 0;
- SimpleDoor = 0; // Bycouncil
- CouncilDoor = 0;
- IllidanGate = 0;
- IllidanDoor[0] = 0;
- IllidanDoor[1] = 0;
- }
-
- bool IsEncounterInProgress() const OVERRIDE
- {
- for (uint8 i = 0; i < EncounterCount; ++i)
- if (m_auiEncounter[i] == IN_PROGRESS)
- return true;
-
- return false;
- }
-
- Player* GetPlayerInMap()
+ struct instance_black_temple_InstanceMapScript : public InstanceScript
{
- Map::PlayerList const& players = instance->GetPlayers();
-
- if (!players.isEmpty())
+ instance_black_temple_InstanceMapScript(Map* map) : InstanceScript(map)
{
- for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
- {
- if (Player* player = itr->GetSource())
- return player;
- }
+ SetBossNumber(EncounterCount);
+ LoadDoorData(doorData);
+
+ NajentusGUID = 0;
+ SupremusGUID = 0;
+ ShadeOfAkamaGUID = 0;
+ AkamaShadeGUID = 0;
+ AkamaGUID = 0;
+ GathiosTheShattererGUID = 0;
+ HighNethermancerZerevorGUID = 0;
+ LadyMalandeGUID = 0;
+ VerasDarkshadowGUID = 0;
+ IllidariCouncilGUID = 0;
+ BloodElfCouncilVoiceGUID = 0;
+ IllidanStormrageGUID = 0;
+
+ IllidanGateGUID = 0;
+
+ memset(IllidanDoorGUIDs, 0, 2 * sizeof(uint64));
}
- TC_LOG_DEBUG(LOG_FILTER_TSCR, "Instance Black Temple: GetPlayerInMap, but PlayerList is empty!");
- return NULL;
- }
-
- void OnCreatureCreate(Creature* creature) OVERRIDE
- {
- switch (creature->GetEntry())
+ void OnCreatureCreate(Creature* creature) OVERRIDE
{
- case 22887: Najentus = creature->GetGUID(); break;
- case 23089: Akama = creature->GetGUID(); break;
- case 23191: Akama_Shade = creature->GetGUID(); break;
- case 22841: ShadeOfAkama = creature->GetGUID(); break;
- case 22898: Supremus = creature->GetGUID(); break;
- case 22917: IllidanStormrage = creature->GetGUID(); break;
- case 22949: GathiosTheShatterer = creature->GetGUID(); break;
- case 22950: HighNethermancerZerevor = creature->GetGUID(); break;
- case 22951: LadyMalande = creature->GetGUID(); break;
- case 22952: VerasDarkshadow = creature->GetGUID(); break;
- case 23426: IllidariCouncil = creature->GetGUID(); break;
- case 23499: BloodElfCouncilVoice = creature->GetGUID(); break;
+ switch (creature->GetEntry())
+ {
+ case NPC_HIGH_WARLORD_NAJENTUS:
+ NajentusGUID = creature->GetGUID();
+ break;
+ case NPC_SUPREMUS:
+ SupremusGUID = creature->GetGUID();
+ break;
+ case NPC_SHADE_OF_AKAMA:
+ ShadeOfAkamaGUID = creature->GetGUID();
+ break;
+ case NPC_AKAMA_SHADE:
+ AkamaShadeGUID = creature->GetGUID();
+ break;
+ case NPC_AKAMA:
+ AkamaGUID = creature->GetGUID();
+ break;
+ case NPC_GATHIOS_THE_SHATTERER:
+ GathiosTheShattererGUID = creature->GetGUID();
+ break;
+ case NPC_HIGH_NETHERMANCER_ZEREVOR:
+ HighNethermancerZerevorGUID = creature->GetGUID();
+ break;
+ case NPC_LADY_MALANDE:
+ LadyMalandeGUID = creature->GetGUID();
+ break;
+ case NPC_VERAS_DARKSHADOW:
+ VerasDarkshadowGUID = creature->GetGUID();
+ break;
+ case NPC_ILLIDARI_COUNCIL:
+ IllidariCouncilGUID = creature->GetGUID();
+ break;
+ case NPC_BLOOD_ELF_COUNCIL_VOICE:
+ BloodElfCouncilVoiceGUID = creature->GetGUID();
+ break;
+ case NPC_ILLIDAN_STORMRAGE:
+ IllidanStormrageGUID = creature->GetGUID();
+ break;
+ default:
+ break;
+ }
}
- }
- void OnGameObjectCreate(GameObject* go) OVERRIDE
- {
- switch (go->GetEntry())
+ void OnGameObjectCreate(GameObject* go) OVERRIDE
{
- case 185483:
- NajentusGate = go->GetGUID(); // Gate past Naj'entus (at the entrance to Supermoose's courtyards)
- if (m_auiEncounter[0] == DONE)
- HandleGameObject(0, true, go);
- break;
-
- case 185882:
- MainTempleDoors = go->GetGUID(); // Main Temple Doors - right past Supermoose (Supremus)
- if (m_auiEncounter[1] == DONE)
- HandleGameObject(0, true, go);
- break;
-
- case 185478:
- ShadeOfAkamaDoor = go->GetGUID();
- break;
-
- case 185480:
- CommonDoor = go->GetGUID();
- if (m_auiEncounter[3] == DONE)
- HandleGameObject(0, true, go);
- break;
-
- case 186153:
- TeronDoor = go->GetGUID();
- if (m_auiEncounter[3] == DONE)
- HandleGameObject(0, true, go);
- break;
-
- case 185892:
- GuurtogDoor = go->GetGUID();
- if (m_auiEncounter[4] == DONE)
- HandleGameObject(0, true, go);
- break;
-
- case 185479:
- TempleDoor = go->GetGUID();
- if (m_auiEncounter[5] == DONE)
- HandleGameObject(0, true, go);
- break;
-
- case 185482:
- MotherDoor = go->GetGUID();
- if (m_auiEncounter[6] == DONE)
- HandleGameObject(0, true, go);
- break;
-
- case 185481:
- CouncilDoor = go->GetGUID();
- if (m_auiEncounter[7] == DONE)
- HandleGameObject(0, true, go);
- break;
-
- case 186152:
- SimpleDoor = go->GetGUID();
- if (m_auiEncounter[7] == DONE)
- HandleGameObject(0, true, go);
- break;
-
- case 185905:
- IllidanGate = go->GetGUID(); // Gate leading to Temple Summit
- break;
-
- case 186261:
- IllidanDoor[0] = go->GetGUID(); // Right door at Temple Summit
- break;
-
- case 186262:
- IllidanDoor[1] = go->GetGUID(); // Left door at Temple Summit
- break;
+ switch (go->GetEntry())
+ {
+ case GO_NAJENTUS_GATE:
+ case GO_SUPREMUS_GATE:
+ case GO_SHADE_OF_AKAMA_DOOR:
+ case GO_TERON_DOOR_1:
+ case GO_TERON_DOOR_2:
+ case GO_GURTOGG_DOOR:
+ case GO_TEMPLE_DOOR:
+ case GO_MOTHER_SHAHRAZ_DOOR:
+ case GO_COUNCIL_DOOR_1:
+ case GO_COUNCIL_DOOR_2:
+ AddDoor(go, true);
+ break;
+ case GO_ILLIDAN_GATE:
+ IllidanGateGUID = go->GetGUID();
+ break;
+ case GO_ILLIDAN_DOOR_R:
+ IllidanDoorGUIDs[0] = go->GetGUID();
+ break;
+ case GO_ILLIDAN_DOOR_L:
+ IllidanDoorGUIDs[1] = go->GetGUID();
+ break;
+ default:
+ break;
+ }
}
- }
- uint64 GetData64(uint32 identifier) const OVERRIDE
- {
- switch (identifier)
+ void OnGameObjectRemove(GameObject* go) OVERRIDE
{
- case DATA_HIGHWARLORDNAJENTUS: return Najentus;
- case DATA_AKAMA: return Akama;
- case DATA_AKAMA_SHADE: return Akama_Shade;
- case DATA_SHADEOFAKAMA: return ShadeOfAkama;
- case DATA_SUPREMUS: return Supremus;
- case DATA_ILLIDANSTORMRAGE: return IllidanStormrage;
- case DATA_GATHIOSTHESHATTERER: return GathiosTheShatterer;
- case DATA_HIGHNETHERMANCERZEREVOR: return HighNethermancerZerevor;
- case DATA_LADYMALANDE: return LadyMalande;
- case DATA_VERASDARKSHADOW: return VerasDarkshadow;
- case DATA_ILLIDARICOUNCIL: return IllidariCouncil;
- case DATA_GAMEOBJECT_NAJENTUS_GATE: return NajentusGate;
- case DATA_GAMEOBJECT_ILLIDAN_GATE: return IllidanGate;
- case DATA_GAMEOBJECT_ILLIDAN_DOOR_R: return IllidanDoor[0];
- case DATA_GAMEOBJECT_ILLIDAN_DOOR_L: return IllidanDoor[1];
- case DATA_GAMEOBJECT_SUPREMUS_DOORS: return MainTempleDoors;
- case DATA_BLOOD_ELF_COUNCIL_VOICE: return BloodElfCouncilVoice;
+ switch (go->GetEntry())
+ {
+ case GO_NAJENTUS_GATE:
+ case GO_SUPREMUS_GATE:
+ case GO_SHADE_OF_AKAMA_DOOR:
+ case GO_TERON_DOOR_1:
+ case GO_TERON_DOOR_2:
+ case GO_GURTOGG_DOOR:
+ case GO_TEMPLE_DOOR:
+ case GO_MOTHER_SHAHRAZ_DOOR:
+ case GO_COUNCIL_DOOR_1:
+ case GO_COUNCIL_DOOR_2:
+ AddDoor(go, false);
+ break;
+ default:
+ break;
+ }
}
- return 0;
- }
-
- void SetData(uint32 type, uint32 data) OVERRIDE
- {
- switch (type)
+ uint64 GetData64(uint32 type) const OVERRIDE
{
- case DATA_HIGHWARLORDNAJENTUSEVENT:
- if (data == DONE)
- HandleGameObject(NajentusGate, true);
- m_auiEncounter[0] = data;
- break;
- case DATA_SUPREMUSEVENT:
- if (data == DONE)
- HandleGameObject(NajentusGate, true);
- m_auiEncounter[1] = data;
- break;
- case DATA_SHADEOFAKAMAEVENT:
- if (data == IN_PROGRESS)
- HandleGameObject(ShadeOfAkamaDoor, false);
- else
- HandleGameObject(ShadeOfAkamaDoor, true);
- m_auiEncounter[2] = data;
- break;
- case DATA_TERONGOREFIENDEVENT:
- if (data == IN_PROGRESS)
+ switch (type)
{
- HandleGameObject(TeronDoor, false);
- HandleGameObject(CommonDoor, false);
+ case DATA_HIGH_WARLORD_NAJENTUS:
+ return NajentusGUID;
+ case DATA_SUPREMUS:
+ return SupremusGUID;
+ case DATA_SHADE_OF_AKAMA:
+ return ShadeOfAkamaGUID;
+ case DATA_AKAMA_SHADE:
+ return AkamaShadeGUID;
+ case DATA_AKAMA:
+ return AkamaGUID;
+ case DATA_GATHIOS_THE_SHATTERER:
+ return GathiosTheShattererGUID;
+ case DATA_HIGH_NETHERMANCER_ZEREVOR:
+ return HighNethermancerZerevorGUID;
+ case DATA_LADY_MALANDE:
+ return LadyMalandeGUID;
+ case DATA_VERAS_DARKSHADOW:
+ return VerasDarkshadowGUID;
+ case DATA_ILLIDARI_COUNCIL:
+ return IllidariCouncilGUID;
+ case DATA_BLOOD_ELF_COUNCIL_VOICE:
+ return BloodElfCouncilVoiceGUID;
+ case DATA_ILLIDAN_STORMRAGE:
+ return IllidanStormrageGUID;
+ case DATA_GO_ILLIDAN_GATE:
+ return IllidanGateGUID;
+ case DATA_GO_ILLIDAN_DOOR_R:
+ return IllidanDoorGUIDs[0];
+ case DATA_GO_ILLIDAN_DOOR_L:
+ return IllidanDoorGUIDs[1];
+ default:
+ break;
}
- else
- {
- HandleGameObject(TeronDoor, true);
- HandleGameObject(CommonDoor, true);
- }
- m_auiEncounter[3] = data;
- break;
- case DATA_GURTOGGBLOODBOILEVENT:
- if (data == DONE)
- HandleGameObject(GuurtogDoor, true);
- m_auiEncounter[4] = data;
- break;
- case DATA_RELIQUARYOFSOULSEVENT:
- if (data == DONE)
- HandleGameObject(TempleDoor, true);
- m_auiEncounter[5] = data;
- break;
- case DATA_MOTHERSHAHRAZEVENT:
- if (data == DONE)
- HandleGameObject(MotherDoor, true);
- m_auiEncounter[6] = data;
- break;
- case DATA_ILLIDARICOUNCILEVENT:
- if (data == IN_PROGRESS)
- {
- HandleGameObject(CouncilDoor, false);
- HandleGameObject(SimpleDoor, false);
- }
- else
- {
- HandleGameObject(CouncilDoor, true);
- HandleGameObject(SimpleDoor, true);
- }
- m_auiEncounter[7] = data;
- break;
- case DATA_ILLIDANSTORMRAGEEVENT:
- m_auiEncounter[8] = data;
- break;
+
+ return 0;
}
- if (data == DONE)
+ std::string GetSaveData() OVERRIDE
{
OUT_SAVE_INST_DATA;
std::ostringstream saveStream;
- saveStream << m_auiEncounter[0] << ' ' << m_auiEncounter[1] << ' '
- << m_auiEncounter[2] << ' ' << m_auiEncounter[3] << ' ' << m_auiEncounter[4]
- << ' ' << m_auiEncounter[5] << ' ' << m_auiEncounter[6] << ' ' << m_auiEncounter[7]
- << ' ' << m_auiEncounter[8];
-
- str_data = saveStream.str();
+ saveStream << "B T " << GetBossSaveData();
- SaveToDB();
OUT_SAVE_INST_DATA_COMPLETE;
+ return saveStream.str();
}
- }
- uint32 GetData(uint32 type) const OVERRIDE
- {
- switch (type)
+ void Load(char const* str) OVERRIDE
{
- case DATA_HIGHWARLORDNAJENTUSEVENT: return m_auiEncounter[0];
- case DATA_SUPREMUSEVENT: return m_auiEncounter[1];
- case DATA_SHADEOFAKAMAEVENT: return m_auiEncounter[2];
- case DATA_TERONGOREFIENDEVENT: return m_auiEncounter[3];
- case DATA_GURTOGGBLOODBOILEVENT: return m_auiEncounter[4];
- case DATA_RELIQUARYOFSOULSEVENT: return m_auiEncounter[5];
- case DATA_MOTHERSHAHRAZEVENT: return m_auiEncounter[6];
- case DATA_ILLIDARICOUNCILEVENT: return m_auiEncounter[7];
- case DATA_ILLIDANSTORMRAGEEVENT: return m_auiEncounter[8];
- }
+ if (!str)
+ {
+ OUT_LOAD_INST_DATA_FAIL;
+ return;
+ }
- return 0;
- }
+ OUT_LOAD_INST_DATA(str);
- std::string GetSaveData() OVERRIDE
- {
- return str_data;
- }
+ char dataHead1, dataHead2;
- void Load(const char* in) OVERRIDE
- {
- if (!in)
- {
- OUT_LOAD_INST_DATA_FAIL;
- return;
+ std::istringstream loadStream(str);
+ loadStream >> dataHead1 >> dataHead2;
+
+ if (dataHead1 == 'B' && dataHead2 == 'T')
+ {
+ for (uint32 i = 0; i < EncounterCount; ++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;
}
- OUT_LOAD_INST_DATA(in);
+ protected:
+ uint64 NajentusGUID;
+ uint64 SupremusGUID;
+ uint64 ShadeOfAkamaGUID;
+ uint64 AkamaShadeGUID;
+ uint64 AkamaGUID;
- std::istringstream loadStream(in);
- loadStream >> m_auiEncounter[0] >> m_auiEncounter[1] >> m_auiEncounter[2]
- >> m_auiEncounter[3] >> m_auiEncounter[4] >> m_auiEncounter[5] >> m_auiEncounter[6]
- >> m_auiEncounter[7] >> m_auiEncounter[8];
+ uint64 GathiosTheShattererGUID;
+ uint64 HighNethermancerZerevorGUID;
+ uint64 LadyMalandeGUID;
+ uint64 VerasDarkshadowGUID;
- for (uint8 i = 0; i < EncounterCount; ++i)
- if (m_auiEncounter[i] == IN_PROGRESS)
- m_auiEncounter[i] = NOT_STARTED;
+ uint64 IllidariCouncilGUID;
+ uint64 BloodElfCouncilVoiceGUID;
- OUT_LOAD_INST_DATA_COMPLETE;
- }
- };
+ uint64 IllidanStormrageGUID;
+
+ uint64 IllidanGateGUID;
+ uint64 IllidanDoorGUIDs[2];
+ };
+ InstanceScript* GetInstanceScript(InstanceMap* map) const OVERRIDE
+ {
+ return new instance_black_temple_InstanceMapScript(map);
+ }
};
void AddSC_instance_black_temple()
diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_hydross_the_unstable.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_hydross_the_unstable.cpp
index db270c943e5..d6205cb3ec7 100644
--- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_hydross_the_unstable.cpp
+++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_hydross_the_unstable.cpp
@@ -94,6 +94,8 @@ public:
boss_hydross_the_unstableAI(Creature* creature) : ScriptedAI(creature), Summons(me)
{
instance = creature->GetInstanceScript();
+ beams[0] = 0;
+ beams[1] = 0;
}
InstanceScript* instance;
@@ -159,10 +161,9 @@ public:
}
void DeSummonBeams()
{
- for (uint8 i=0; i<2; ++i)
+ for (uint8 i = 0; i < 2; ++i)
{
- Creature* mob = Unit::GetCreature(*me, beams[i]);
- if (mob)
+ if (Creature* mob = Unit::GetCreature(*me, beams[i]))
{
mob->setDeathState(DEAD);
mob->RemoveCorpse();
diff --git a/src/server/scripts/Outland/GruulsLair/boss_gruul.cpp b/src/server/scripts/Outland/GruulsLair/boss_gruul.cpp
index 31f854803bc..0ae86f7c455 100644
--- a/src/server/scripts/Outland/GruulsLair/boss_gruul.cpp
+++ b/src/server/scripts/Outland/GruulsLair/boss_gruul.cpp
@@ -43,215 +43,217 @@ enum Spells
{
SPELL_GROWTH = 36300,
SPELL_CAVE_IN = 36240,
- SPELL_GROUND_SLAM = 33525, //AoE Ground Slam applying Ground Slam to everyone with a script effect (most likely the knock back, we can code it to a set knockback)
+ SPELL_GROUND_SLAM = 33525, // AoE Ground Slam applying Ground Slam to everyone with a script effect (most likely the knock back, we can code it to a set knockback)
SPELL_REVERBERATION = 36297,
SPELL_SHATTER = 33654,
SPELL_SHATTER_EFFECT = 33671,
SPELL_HURTFUL_STRIKE = 33813,
- SPELL_STONED = 33652, //Spell is self cast by target
+ SPELL_STONED = 33652, // Spell is self cast by target
SPELL_MAGNETIC_PULL = 28337,
- SPELL_KNOCK_BACK = 24199, //Knockback spell until correct implementation is made
+ SPELL_KNOCK_BACK = 24199, // Knockback spell until correct implementation is made
};
-class boss_gruul : public CreatureScript
+enum Events
{
-public:
- boss_gruul() : CreatureScript("boss_gruul") { }
+ EVENT_GROWTH = 1,
+ EVENT_CAVE_IN,
+ EVENT_CAVE_IN_STATIC,
+ EVENT_GROUND_SLAM,
+ EVENT_HURTFUL_STRIKE,
+ EVENT_REVERBERATION
+};
- CreatureAI* GetAI(Creature* creature) const OVERRIDE
- {
- return new boss_gruulAI(creature);
- }
+class boss_gruul : public CreatureScript
+{
+ public:
+ boss_gruul() : CreatureScript("boss_gruul") { }
- struct boss_gruulAI : public ScriptedAI
- {
- boss_gruulAI(Creature* creature) : ScriptedAI(creature)
+ struct boss_gruulAI : public BossAI
{
- instance = creature->GetInstanceScript();
- }
-
- InstanceScript* instance;
-
- uint32 m_uiGrowth_Timer;
- uint32 m_uiCaveIn_Timer;
- uint32 m_uiCaveIn_StaticTimer;
- uint32 m_uiGroundSlamTimer;
- uint32 m_uiHurtfulStrike_Timer;
- uint32 m_uiReverberation_Timer;
+ boss_gruulAI(Creature* creature) : BossAI(creature, DATA_GRUUL) { }
- bool m_bPerformingGroundSlam;
+ uint32 m_uiGrowth_Timer;
+ uint32 m_uiCaveIn_Timer;
+ uint32 m_uiCaveIn_StaticTimer;
+ uint32 m_uiGroundSlamTimer;
+ uint32 m_uiHurtfulStrike_Timer;
+ uint32 m_uiReverberation_Timer;
- void Reset() OVERRIDE
- {
- m_uiGrowth_Timer= 30000;
- m_uiCaveIn_Timer= 27000;
- m_uiCaveIn_StaticTimer = 30000;
- m_uiGroundSlamTimer= 35000;
- m_bPerformingGroundSlam= false;
- m_uiHurtfulStrike_Timer= 8000;
- m_uiReverberation_Timer= 60000+45000;
-
- if (instance)
- instance->SetData(DATA_GRUULEVENT, NOT_STARTED);
- }
+ bool m_bPerformingGroundSlam;
- void EnterCombat(Unit* /*who*/) OVERRIDE
- {
- Talk(SAY_AGGRO);
-
- if (instance)
- instance->SetData(DATA_GRUULEVENT, IN_PROGRESS);
- }
+ void Reset() OVERRIDE
+ {
+ _Reset();
+ m_uiGrowth_Timer= 30000;
+ m_uiCaveIn_Timer= 27000;
+ m_uiCaveIn_StaticTimer = 30000;
+ m_uiGroundSlamTimer= 35000;
+ m_bPerformingGroundSlam= false;
+ m_uiHurtfulStrike_Timer= 8000;
+ m_uiReverberation_Timer= 60000+45000;
+ }
- void KilledUnit(Unit* /*victim*/) OVERRIDE
- {
- Talk(SAY_SLAY);
- }
+ void EnterCombat(Unit* /*who*/) OVERRIDE
+ {
+ _EnterCombat();
+ Talk(SAY_AGGRO);
+ }
- void JustDied(Unit* /*killer*/) OVERRIDE
- {
- Talk(SAY_DEATH);
+ void KilledUnit(Unit* who) OVERRIDE
+ {
+ if (who->GetTypeId() == TYPEID_PLAYER)
+ Talk(SAY_SLAY);
+ }
- if (instance)
+ void JustDied(Unit* /*killer*/) OVERRIDE
{
- instance->SetData(DATA_GRUULEVENT, DONE);
- instance->HandleGameObject(instance->GetData64(DATA_GRUULDOOR), true); // Open the encounter door
+ _JustDied();
+ Talk(SAY_DEATH);
}
- }
- void SpellHitTarget(Unit* target, const SpellInfo* pSpell) OVERRIDE
- {
- //This to emulate effect1 (77) of SPELL_GROUND_SLAM, knock back to any direction
- //It's initially wrong, since this will cause fall damage, which is by comments, not intended.
- if (pSpell->Id == SPELL_GROUND_SLAM)
+ void SpellHitTarget(Unit* target, const SpellInfo* pSpell) OVERRIDE
{
- if (target->GetTypeId() == TYPEID_PLAYER)
+ //This to emulate effect1 (77) of SPELL_GROUND_SLAM, knock back to any direction
+ //It's initially wrong, since this will cause fall damage, which is by comments, not intended.
+ if (pSpell->Id == SPELL_GROUND_SLAM)
{
- switch (urand(0, 1))
+ if (target->GetTypeId() == TYPEID_PLAYER)
{
- case 0:
- target->CastSpell(target, SPELL_MAGNETIC_PULL, true, NULL, NULL, me->GetGUID());
- break;
-
- case 1:
- target->CastSpell(target, SPELL_KNOCK_BACK, true, NULL, NULL, me->GetGUID());
- break;
+ switch (urand(0, 1))
+ {
+ case 0:
+ target->CastSpell(target, SPELL_MAGNETIC_PULL, true, NULL, NULL, me->GetGUID());
+ break;
+
+ case 1:
+ target->CastSpell(target, SPELL_KNOCK_BACK, true, NULL, NULL, me->GetGUID());
+ break;
+ }
}
}
- }
- //this part should be in the core
- if (pSpell->Id == SPELL_SHATTER)
- {
- /// @todo use eventmap to kill this stuff
- //clear this, if we are still performing
- if (m_bPerformingGroundSlam)
+ //this part should be in the core
+ if (pSpell->Id == SPELL_SHATTER)
{
- m_bPerformingGroundSlam = false;
-
- //and correct movement, if not already
- if (me->GetMotionMaster()->GetCurrentMovementGeneratorType() != CHASE_MOTION_TYPE)
+ /// @todo use eventmap to kill this stuff
+ //clear this, if we are still performing
+ if (m_bPerformingGroundSlam)
{
- if (me->GetVictim())
- me->GetMotionMaster()->MoveChase(me->GetVictim());
+ m_bPerformingGroundSlam = false;
+
+ //and correct movement, if not already
+ if (me->GetMotionMaster()->GetCurrentMovementGeneratorType() != CHASE_MOTION_TYPE)
+ {
+ if (me->GetVictim())
+ me->GetMotionMaster()->MoveChase(me->GetVictim());
+ }
}
}
}
- }
-
- void UpdateAI(uint32 uiDiff) OVERRIDE
- {
- //Return since we have no target
- if (!UpdateVictim())
- return;
- // Growth
- // Gruul can cast this spell up to 30 times
- if (m_uiGrowth_Timer <= uiDiff)
+ void UpdateAI(uint32 diff) OVERRIDE
{
- Talk(EMOTE_GROW);
- DoCast(me, SPELL_GROWTH);
- m_uiGrowth_Timer = 30000;
- }
- else
- m_uiGrowth_Timer -= uiDiff;
+ if (!UpdateVictim())
+ return;
- if (m_bPerformingGroundSlam)
- {
- if (m_uiGroundSlamTimer <= uiDiff)
- {
- m_uiGroundSlamTimer =120000;
- m_uiHurtfulStrike_Timer= 8000;
+ events.Update(diff);
+
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
- if (m_uiReverberation_Timer < 10000) //Give a little time to the players to undo the damage from shatter
- m_uiReverberation_Timer += 10000;
+ /// @todo: convert this shit to eventmap
- DoCast(me, SPELL_SHATTER);
+ // Growth
+ // Gruul can cast this spell up to 30 times
+ if (m_uiGrowth_Timer <= diff)
+ {
+ Talk(EMOTE_GROW);
+ DoCast(me, SPELL_GROWTH);
+ m_uiGrowth_Timer = 30000;
}
else
- m_uiGroundSlamTimer -= uiDiff;
- }
- else
- {
- // Hurtful Strike
- if (m_uiHurtfulStrike_Timer <= uiDiff)
+ m_uiGrowth_Timer -= diff;
+
+ if (m_bPerformingGroundSlam)
{
- Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, 1);
+ if (m_uiGroundSlamTimer <= diff)
+ {
+ m_uiGroundSlamTimer =120000;
+ m_uiHurtfulStrike_Timer= 8000;
- if (target && me->IsWithinMeleeRange(me->GetVictim()))
- DoCast(target, SPELL_HURTFUL_STRIKE);
- else
- DoCastVictim(SPELL_HURTFUL_STRIKE);
+ if (m_uiReverberation_Timer < 10000) //Give a little time to the players to undo the damage from shatter
+ m_uiReverberation_Timer += 10000;
- m_uiHurtfulStrike_Timer= 8000;
+ DoCast(me, SPELL_SHATTER);
+ }
+ else
+ m_uiGroundSlamTimer -= diff;
}
else
- m_uiHurtfulStrike_Timer -= uiDiff;
-
- // Reverberation
- if (m_uiReverberation_Timer <= uiDiff)
{
- DoCastVictim(SPELL_REVERBERATION, true);
- m_uiReverberation_Timer = urand(15000, 25000);
- }
- else
- m_uiReverberation_Timer -= uiDiff;
+ // Hurtful Strike
+ if (m_uiHurtfulStrike_Timer <= diff)
+ {
+ Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, 1);
- // Cave In
- if (m_uiCaveIn_Timer <= uiDiff)
- {
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
- DoCast(target, SPELL_CAVE_IN);
+ if (target && me->IsWithinMeleeRange(me->GetVictim()))
+ DoCast(target, SPELL_HURTFUL_STRIKE);
+ else
+ DoCastVictim(SPELL_HURTFUL_STRIKE);
- if (m_uiCaveIn_StaticTimer >= 4000)
- m_uiCaveIn_StaticTimer -= 2000;
+ m_uiHurtfulStrike_Timer= 8000;
+ }
+ else
+ m_uiHurtfulStrike_Timer -= diff;
- m_uiCaveIn_Timer = m_uiCaveIn_StaticTimer;
- }
- else
- m_uiCaveIn_Timer -= uiDiff;
+ // Reverberation
+ if (m_uiReverberation_Timer <= diff)
+ {
+ DoCastVictim(SPELL_REVERBERATION, true);
+ m_uiReverberation_Timer = urand(15000, 25000);
+ }
+ else
+ m_uiReverberation_Timer -= diff;
- // Ground Slam, Gronn Lord's Grasp, Stoned, Shatter
- if (m_uiGroundSlamTimer <= uiDiff)
- {
- me->GetMotionMaster()->Clear();
- me->GetMotionMaster()->MoveIdle();
+ // Cave In
+ if (m_uiCaveIn_Timer <= diff)
+ {
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
+ DoCast(target, SPELL_CAVE_IN);
- m_bPerformingGroundSlam= true;
- m_uiGroundSlamTimer = 10000;
+ if (m_uiCaveIn_StaticTimer >= 4000)
+ m_uiCaveIn_StaticTimer -= 2000;
- DoCast(me, SPELL_GROUND_SLAM);
- }
- else
- m_uiGroundSlamTimer -= uiDiff;
+ m_uiCaveIn_Timer = m_uiCaveIn_StaticTimer;
+ }
+ else
+ m_uiCaveIn_Timer -= diff;
+
+ // Ground Slam, Gronn Lord's Grasp, Stoned, Shatter
+ if (m_uiGroundSlamTimer <= diff)
+ {
+ me->GetMotionMaster()->Clear();
+ me->GetMotionMaster()->MoveIdle();
- DoMeleeAttackIfReady();
+ m_bPerformingGroundSlam= true;
+ m_uiGroundSlamTimer = 10000;
+
+ DoCast(me, SPELL_GROUND_SLAM);
+ }
+ else
+ m_uiGroundSlamTimer -= diff;
+
+ DoMeleeAttackIfReady();
+ }
}
- }
- };
+ };
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return GetGruulsLairAI<boss_gruulAI>(creature);
+ }
};
class spell_gruul_shatter : public SpellScriptLoader
diff --git a/src/server/scripts/Outland/GruulsLair/boss_high_king_maulgar.cpp b/src/server/scripts/Outland/GruulsLair/boss_high_king_maulgar.cpp
index d216c0b02ee..dd44d764987 100644
--- a/src/server/scripts/Outland/GruulsLair/boss_high_king_maulgar.cpp
+++ b/src/server/scripts/Outland/GruulsLair/boss_high_king_maulgar.cpp
@@ -49,79 +49,35 @@ enum HighKingMaulgar
SPELL_DEATH_COIL = 33130,
SPELL_SUMMON_WFH = 33131,
- //Kiggler the Craed
+ // Kiggler the Craed
SPELL_GREATER_POLYMORPH = 33173,
SPELL_LIGHTNING_BOLT = 36152,
SPELL_ARCANE_SHOCK = 33175,
SPELL_ARCANE_EXPLOSION = 33237,
- //Blindeye the Seer
+ // Blindeye the Seer
SPELL_GREATER_PW_SHIELD = 33147,
SPELL_HEAL = 33144,
SPELL_PRAYER_OH = 33152,
- //Krosh Firehand
+ // Krosh Firehand
SPELL_GREATER_FIREBALL = 33051,
SPELL_SPELLSHIELD = 33054,
- SPELL_BLAST_WAVE = 33061
-};
+ SPELL_BLAST_WAVE = 33061,
-bool CheckAllBossDied(InstanceScript* instance, Creature* me)
-{
- if (!instance || !me)
- return false;
-
- uint64 MaulgarGUID = 0;
- uint64 KigglerGUID = 0;
- uint64 BlindeyeGUID = 0;
- uint64 OlmGUID = 0;
- uint64 KroshGUID = 0;
-
- Creature* Maulgar = NULL;
- Creature* Kiggler = NULL;
- Creature* Blindeye = NULL;
- Creature* Olm = NULL;
- Creature* Krosh = NULL;
-
- MaulgarGUID = instance->GetData64(DATA_MAULGAR);
- KigglerGUID = instance->GetData64(DATA_KIGGLERTHECRAZED);
- BlindeyeGUID = instance->GetData64(DATA_BLINDEYETHESEER);
- OlmGUID = instance->GetData64(DATA_OLMTHESUMMONER);
- KroshGUID = instance->GetData64(DATA_KROSHFIREHAND);
-
- Maulgar = (Unit::GetCreature((*me), MaulgarGUID));
- Kiggler = (Unit::GetCreature((*me), KigglerGUID));
- Blindeye = (Unit::GetCreature((*me), BlindeyeGUID));
- Olm = (Unit::GetCreature((*me), OlmGUID));
- Krosh = (Unit::GetCreature((*me), KroshGUID));
-
- if (!Maulgar || !Kiggler || !Blindeye || !Olm || !Krosh)
- return false;
-
- if (!Maulgar->IsAlive() && !Kiggler->IsAlive() && !Blindeye->IsAlive() && !Olm->IsAlive() && !Krosh->IsAlive())
- return true;
-
- return false;
-}
+ ACTION_ADD_DEATH = 1
+};
-//High King Maulgar AI
class boss_high_king_maulgar : public CreatureScript
{
public:
boss_high_king_maulgar() : CreatureScript("boss_high_king_maulgar") { }
- CreatureAI* GetAI(Creature* creature) const OVERRIDE
- {
- return new boss_high_king_maulgarAI(creature);
- }
-
struct boss_high_king_maulgarAI : public ScriptedAI
{
boss_high_king_maulgarAI(Creature* creature) : ScriptedAI(creature)
{
instance = creature->GetInstanceScript();
- for (uint8 i = 0; i < 4; ++i)
- Council[i] = 0;
}
InstanceScript* instance;
@@ -134,8 +90,6 @@ public:
bool Phase2;
- uint64 Council[4];
-
void Reset() OVERRIDE
{
ArcingSmash_Timer = 10000;
@@ -148,23 +102,7 @@ public:
Phase2 = false;
- Creature* creature = NULL;
- for (uint8 i = 0; i < 4; ++i)
- {
- if (Council[i])
- {
- creature = (Unit::GetCreature((*me), Council[i]));
- if (creature && !creature->IsAlive())
- {
- creature->Respawn();
- creature->AI()->EnterEvadeMode();
- }
- }
- }
-
- //reset encounter
- if (instance)
- instance->SetData(DATA_MAULGAREVENT, NOT_STARTED);
+ instance->SetBossState(DATA_MAULGAR, NOT_STARTED);
}
void KilledUnit(Unit* /*victim*/) OVERRIDE
@@ -176,72 +114,27 @@ public:
{
Talk(SAY_DEATH);
- if (CheckAllBossDied(instance, me))
- instance->SetData(DATA_MAULGAREVENT, DONE);
- }
-
- void AddDeath()
- {
- Talk(SAY_OGRE_DEATH);
- }
-
- void EnterCombat(Unit* who) OVERRIDE
- {
- StartEvent(who);
+ instance->SetBossState(DATA_MAULGAR, DONE);
}
- void GetCouncil()
+ void DoAction(int32 actionId)
{
- if (instance)
- {
- //get council member's guid to respawn them if needed
- Council[0] = instance->GetData64(DATA_KIGGLERTHECRAZED);
- Council[1] = instance->GetData64(DATA_BLINDEYETHESEER);
- Council[2] = instance->GetData64(DATA_OLMTHESUMMONER);
- Council[3] = instance->GetData64(DATA_KROSHFIREHAND);
- }
+ if (actionId == ACTION_ADD_DEATH)
+ Talk(SAY_OGRE_DEATH);
}
- void StartEvent(Unit* who)
+ void EnterCombat(Unit* /*who*/) OVERRIDE
{
- if (!instance)
- return;
-
- GetCouncil();
-
- Talk(SAY_AGGRO);
-
- instance->SetData64(DATA_MAULGAREVENT_TANK, who->GetGUID());
- instance->SetData(DATA_MAULGAREVENT, IN_PROGRESS);
-
DoZoneInCombat();
+ instance->SetBossState(DATA_MAULGAR, IN_PROGRESS);
+ Talk(SAY_AGGRO);
}
void UpdateAI(uint32 diff) OVERRIDE
{
- //Only if not incombat check if the event is started
- if (!me->IsInCombat() && instance && instance->GetData(DATA_MAULGAREVENT))
- {
- Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_MAULGAREVENT_TANK));
-
- if (target)
- {
- AttackStart(target);
- GetCouncil();
- }
- }
-
- //Return since we have no target
if (!UpdateVictim())
return;
- //someone evaded!
- if (instance && !instance->GetData(DATA_MAULGAREVENT))
- {
- EnterEvadeMode();
- return;
- }
-
//ArcingSmash_Timer
if (ArcingSmash_Timer <= diff)
{
@@ -301,19 +194,17 @@ public:
}
};
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return GetGruulsLairAI<boss_high_king_maulgarAI>(creature);
+ }
};
-//Olm The Summoner AI
class boss_olm_the_summoner : public CreatureScript
{
public:
boss_olm_the_summoner() : CreatureScript("boss_olm_the_summoner") { }
- CreatureAI* GetAI(Creature* creature) const OVERRIDE
- {
- return new boss_olm_the_summonerAI(creature);
- }
-
struct boss_olm_the_summonerAI : public ScriptedAI
{
boss_olm_the_summonerAI(Creature* creature) : ScriptedAI(creature)
@@ -333,9 +224,7 @@ public:
Summon_Timer = 15000;
DeathCoil_Timer = 20000;
- //reset encounter
- if (instance)
- instance->SetData(DATA_MAULGAREVENT, NOT_STARTED);
+ instance->SetBossState(DATA_MAULGAR, NOT_STARTED);
}
void AttackStart(Unit* who) OVERRIDE
@@ -353,54 +242,25 @@ public:
}
}
- void EnterCombat(Unit* who) OVERRIDE
+ void EnterCombat(Unit* /*who*/) OVERRIDE
{
- if (instance)
- {
- instance->SetData64(DATA_MAULGAREVENT_TANK, who->GetGUID());
- instance->SetData(DATA_MAULGAREVENT, IN_PROGRESS);
- }
+ DoZoneInCombat();
+ instance->SetBossState(DATA_MAULGAR, IN_PROGRESS);
}
void JustDied(Unit* /*killer*/) OVERRIDE
{
- if (instance)
- {
- Creature* Maulgar = NULL;
- Maulgar = (Unit::GetCreature((*me), instance->GetData64(DATA_MAULGAR)));
-
- if (Maulgar)
- CAST_AI(boss_high_king_maulgar::boss_high_king_maulgarAI, Maulgar->AI())->AddDeath();
+ if (Creature* maulgar = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_MAULGAR)))
+ maulgar->AI()->DoAction(ACTION_ADD_DEATH);
- if (CheckAllBossDied(instance, me))
- instance->SetData(DATA_MAULGAREVENT, DONE);
- }
+ instance->SetBossState(DATA_MAULGAR, DONE);
}
void UpdateAI(uint32 diff) OVERRIDE
{
- //Only if not incombat check if the event is started
- if (!me->IsInCombat() && instance && instance->GetData(DATA_MAULGAREVENT))
- {
- Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_MAULGAREVENT_TANK));
-
- if (target)
- {
- AttackStart(target);
- }
- }
-
- //Return since we have no target
if (!UpdateVictim())
return;
- //someone evaded!
- if (instance && !instance->GetData(DATA_MAULGAREVENT))
- {
- EnterEvadeMode();
- return;
- }
-
//DarkDecay_Timer
if (DarkDecay_Timer <= diff)
{
@@ -429,6 +289,10 @@ public:
}
};
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return GetGruulsLairAI<boss_olm_the_summonerAI>(creature);
+ }
};
//Kiggler The Crazed AI
@@ -437,11 +301,6 @@ class boss_kiggler_the_crazed : public CreatureScript
public:
boss_kiggler_the_crazed() : CreatureScript("boss_kiggler_the_crazed") { }
- CreatureAI* GetAI(Creature* creature) const OVERRIDE
- {
- return new boss_kiggler_the_crazedAI(creature);
- }
-
struct boss_kiggler_the_crazedAI : public ScriptedAI
{
boss_kiggler_the_crazedAI(Creature* creature) : ScriptedAI(creature)
@@ -463,59 +322,28 @@ public:
ArcaneShock_Timer = 20000;
ArcaneExplosion_Timer = 30000;
- //reset encounter
- if (instance)
- instance->SetData(DATA_MAULGAREVENT, NOT_STARTED);
+ instance->SetBossState(DATA_MAULGAR, NOT_STARTED);
}
- void EnterCombat(Unit* who) OVERRIDE
+ void EnterCombat(Unit* /*who*/) OVERRIDE
{
- if (instance)
- {
- instance->SetData64(DATA_MAULGAREVENT_TANK, who->GetGUID());
- instance->SetData(DATA_MAULGAREVENT, IN_PROGRESS);
- }
+ DoZoneInCombat();
+ instance->SetBossState(DATA_MAULGAR, IN_PROGRESS);
}
void JustDied(Unit* /*killer*/) OVERRIDE
{
- if (instance)
- {
- Creature* Maulgar = NULL;
- Maulgar = (Unit::GetCreature((*me), instance->GetData64(DATA_MAULGAR)));
-
- if (Maulgar)
- CAST_AI(boss_high_king_maulgar::boss_high_king_maulgarAI, Maulgar->AI())->AddDeath();
+ if (Creature* maulgar = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_MAULGAR)))
+ maulgar->AI()->DoAction(ACTION_ADD_DEATH);
- if (CheckAllBossDied(instance, me))
- instance->SetData(DATA_MAULGAREVENT, DONE);
- }
+ instance->SetBossState(DATA_MAULGAR, DONE);
}
void UpdateAI(uint32 diff) OVERRIDE
{
- //Only if not incombat check if the event is started
- if (!me->IsInCombat() && instance && instance->GetData(DATA_MAULGAREVENT))
- {
- Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_MAULGAREVENT_TANK));
-
- if (target)
- {
- AttackStart(target);
- }
- }
-
- //Return since we have no target
if (!UpdateVictim())
return;
- //someone evaded!
- if (instance && !instance->GetData(DATA_MAULGAREVENT))
- {
- EnterEvadeMode();
- return;
- }
-
//GreaterPolymorph_Timer
if (GreaterPolymorph_Timer <= diff)
{
@@ -550,19 +378,17 @@ public:
}
};
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return GetGruulsLairAI<boss_kiggler_the_crazedAI>(creature);
+ }
};
-//Blindeye The Seer AI
class boss_blindeye_the_seer : public CreatureScript
{
public:
boss_blindeye_the_seer() : CreatureScript("boss_blindeye_the_seer") { }
- CreatureAI* GetAI(Creature* creature) const OVERRIDE
- {
- return new boss_blindeye_the_seerAI(creature);
- }
-
struct boss_blindeye_the_seerAI : public ScriptedAI
{
boss_blindeye_the_seerAI(Creature* creature) : ScriptedAI(creature)
@@ -582,59 +408,28 @@ public:
Heal_Timer = urand(25000, 40000);
PrayerofHealing_Timer = urand(45000, 55000);
- //reset encounter
- if (instance)
- instance->SetData(DATA_MAULGAREVENT, NOT_STARTED);
+ instance->SetBossState(DATA_MAULGAR, NOT_STARTED);
}
- void EnterCombat(Unit* who) OVERRIDE
+ void EnterCombat(Unit* /*who*/) OVERRIDE
{
- if (instance)
- {
- instance->SetData64(DATA_MAULGAREVENT_TANK, who->GetGUID());
- instance->SetData(DATA_MAULGAREVENT, IN_PROGRESS);
- }
+ DoZoneInCombat();
+ instance->SetBossState(DATA_MAULGAR, IN_PROGRESS);
}
void JustDied(Unit* /*killer*/) OVERRIDE
{
- if (instance)
- {
- Creature* Maulgar = NULL;
- Maulgar = (Unit::GetCreature((*me), instance->GetData64(DATA_MAULGAR)));
+ if (Creature* maulgar = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_MAULGAR)))
+ maulgar->AI()->DoAction(ACTION_ADD_DEATH);
- if (Maulgar)
- CAST_AI(boss_high_king_maulgar::boss_high_king_maulgarAI, Maulgar->AI())->AddDeath();
-
- if (CheckAllBossDied(instance, me))
- instance->SetData(DATA_MAULGAREVENT, DONE);
- }
+ instance->SetBossState(DATA_MAULGAR, DONE);
}
void UpdateAI(uint32 diff) OVERRIDE
{
- //Only if not incombat check if the event is started
- if (!me->IsInCombat() && instance && instance->GetData(DATA_MAULGAREVENT))
- {
- Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_MAULGAREVENT_TANK));
-
- if (target)
- {
- AttackStart(target);
- }
- }
-
- //Return since we have no target
if (!UpdateVictim())
return;
- //someone evaded!
- if (instance && !instance->GetData(DATA_MAULGAREVENT))
- {
- EnterEvadeMode();
- return;
- }
-
//GreaterPowerWordShield_Timer
if (GreaterPowerWordShield_Timer <= diff)
{
@@ -660,19 +455,17 @@ public:
}
};
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return GetGruulsLairAI<boss_blindeye_the_seerAI>(creature);
+ }
};
-//Krosh Firehand AI
class boss_krosh_firehand : public CreatureScript
{
public:
boss_krosh_firehand() : CreatureScript("boss_krosh_firehand") { }
- CreatureAI* GetAI(Creature* creature) const OVERRIDE
- {
- return new boss_krosh_firehandAI(creature);
- }
-
struct boss_krosh_firehandAI : public ScriptedAI
{
boss_krosh_firehandAI(Creature* creature) : ScriptedAI(creature)
@@ -692,59 +485,28 @@ public:
SpellShield_Timer = 5000;
BlastWave_Timer = 20000;
- //reset encounter
- if (instance)
- instance->SetData(DATA_MAULGAREVENT, NOT_STARTED);
+ instance->SetBossState(DATA_MAULGAR, NOT_STARTED);
}
- void EnterCombat(Unit* who) OVERRIDE
+ void EnterCombat(Unit* /*who*/) OVERRIDE
{
- if (instance)
- {
- instance->SetData64(DATA_MAULGAREVENT_TANK, who->GetGUID());
- instance->SetData(DATA_MAULGAREVENT, IN_PROGRESS);
- }
+ DoZoneInCombat();
+ instance->SetBossState(DATA_MAULGAR, IN_PROGRESS);
}
void JustDied(Unit* /*killer*/) OVERRIDE
{
- if (instance)
- {
- Creature* Maulgar = NULL;
- Maulgar = (Unit::GetCreature((*me), instance->GetData64(DATA_MAULGAR)));
+ if (Creature* maulgar = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_MAULGAR)))
+ maulgar->AI()->DoAction(ACTION_ADD_DEATH);
- if (Maulgar)
- CAST_AI(boss_high_king_maulgar::boss_high_king_maulgarAI, Maulgar->AI())->AddDeath();
-
- if (CheckAllBossDied(instance, me))
- instance->SetData(DATA_MAULGAREVENT, DONE);
- }
+ instance->SetBossState(DATA_MAULGAR, DONE);
}
void UpdateAI(uint32 diff) OVERRIDE
{
- //Only if not incombat check if the event is started
- if (!me->IsInCombat() && instance && instance->GetData(DATA_MAULGAREVENT))
- {
- Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_MAULGAREVENT_TANK));
-
- if (target)
- {
- AttackStart(target);
- }
- }
-
- //Return since we have no target
if (!UpdateVictim())
return;
- //someone evaded!
- if (instance && !instance->GetData(DATA_MAULGAREVENT))
- {
- EnterEvadeMode();
- return;
- }
-
//GreaterFireball_Timer
if (GreaterFireball_Timer < diff || me->IsWithinDist(me->GetVictim(), 30))
{
@@ -783,6 +545,11 @@ public:
} else BlastWave_Timer -= diff;
}
};
+
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return GetGruulsLairAI<boss_krosh_firehandAI>(creature);
+ }
};
void AddSC_boss_high_king_maulgar()
diff --git a/src/server/scripts/Outland/GruulsLair/gruuls_lair.h b/src/server/scripts/Outland/GruulsLair/gruuls_lair.h
index 69ddba8c274..1425a19aa47 100644
--- a/src/server/scripts/Outland/GruulsLair/gruuls_lair.h
+++ b/src/server/scripts/Outland/GruulsLair/gruuls_lair.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
@@ -16,23 +15,39 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifndef DEF_GRUULS_LAIR_H
-#define DEF_GRUULS_LAIR_H
+#ifndef GRUULS_LAIR_H_
+#define GRUULS_LAIR_H_
+
+#define GLScriptName "instance_gruuls_lair"
+
+uint32 const EncounterCount = 2;
enum DataTypes
{
- DATA_BLINDEYETHESEER = 1,
- DATA_GRUULEVENT = 2,
- DATA_KIGGLERTHECRAZED = 3,
- DATA_KROSHFIREHAND = 4,
- DATA_MAULGAREVENT = 5,
- DATA_MAULGAREVENT_TANK = 6,
- DATA_OLMTHESUMMONER = 7,
- DATA_MAULGARDOOR = 8,
- DATA_GRUULDOOR = 9,
- DATA_MAULGAR = 10
+ // Encounter States/Boss GUIDs
+ DATA_MAULGAR = 0,
+ DATA_GRUUL = 1
+};
+
+enum CreatureIds
+{
+ NPC_MAULGAR = 18831,
+ NPC_KROSH_FIREHAND = 18832,
+ NPC_OLM_THE_SUMMONER = 18834,
+ NPC_KIGGLER_THE_CRAZED = 18835,
+ NPC_BLINDEYE_THE_SEER = 18836
};
-#define ERROR_INST_DATA "TSCR Error: Instance Data not set properly for Gruul's Lair instance (map 565). Encounters will be buggy."
-#endif
+enum GameObjectIds
+{
+ GO_MAULGAR_DOOR = 184468,
+ GO_GRUUL_DOOR = 184662
+};
+
+template<class AI>
+AI* GetGruulsLairAI(Creature* creature)
+{
+ return GetInstanceAI<AI>(creature, GLScriptName);
+}
+#endif // GRUULS_LAIR_H_
diff --git a/src/server/scripts/Outland/GruulsLair/instance_gruuls_lair.cpp b/src/server/scripts/Outland/GruulsLair/instance_gruuls_lair.cpp
index d8399793df4..aa8a8d01d8a 100644
--- a/src/server/scripts/Outland/GruulsLair/instance_gruuls_lair.cpp
+++ b/src/server/scripts/Outland/GruulsLair/instance_gruuls_lair.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,184 +15,165 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/* ScriptData
-SDName: Instance_Gruuls_Lair
-SD%Complete: 100
-SDComment:
-SDCategory: Gruul's Lair
-EndScriptData */
-
#include "ScriptMgr.h"
#include "InstanceScript.h"
#include "gruuls_lair.h"
-#define MAX_ENCOUNTER 2
+DoorData const doorData[] =
+{
+ { GO_MAULGAR_DOOR, DATA_MAULGAR, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
+ { GO_GRUUL_DOOR, DATA_GRUUL, DOOR_TYPE_ROOM, BOUNDARY_NONE },
+ { 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE } // END
+};
-/* Gruuls Lair encounters:
-1 - High King Maulgar event
-2 - Gruul event
-*/
+MinionData const minionData[] =
+{
+ { NPC_MAULGAR, DATA_MAULGAR },
+ { NPC_KROSH_FIREHAND, DATA_MAULGAR },
+ { NPC_OLM_THE_SUMMONER, DATA_MAULGAR },
+ { NPC_KIGGLER_THE_CRAZED, DATA_MAULGAR },
+ { NPC_BLINDEYE_THE_SEER, DATA_MAULGAR }
+};
class instance_gruuls_lair : public InstanceMapScript
{
-public:
- instance_gruuls_lair() : InstanceMapScript("instance_gruuls_lair", 565) { }
-
- InstanceScript* GetInstanceScript(InstanceMap* map) const OVERRIDE
- {
- return new instance_gruuls_lair_InstanceMapScript(map);
- }
+ public:
+ instance_gruuls_lair() : InstanceMapScript(GLScriptName, 565) { }
- struct instance_gruuls_lair_InstanceMapScript : public InstanceScript
- {
- instance_gruuls_lair_InstanceMapScript(Map* map) : InstanceScript(map) {}
-
- uint32 m_auiEncounter[MAX_ENCOUNTER];
-
- uint64 MaulgarEvent_Tank;
- uint64 KigglerTheCrazed;
- uint64 BlindeyeTheSeer;
- uint64 OlmTheSummoner;
- uint64 KroshFirehand;
- uint64 Maulgar;
-
- uint64 MaulgarDoor;
- uint64 GruulDoor;
-
- void Initialize() OVERRIDE
+ struct instance_gruuls_lair_InstanceMapScript : public InstanceScript
{
- memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
-
- MaulgarEvent_Tank = 0;
- KigglerTheCrazed = 0;
- BlindeyeTheSeer = 0;
- OlmTheSummoner = 0;
- KroshFirehand = 0;
- Maulgar = 0;
-
- MaulgarDoor = 0;
- GruulDoor = 0;
- }
-
- bool IsEncounterInProgress() const OVERRIDE
- {
- for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
- if (m_auiEncounter[i] == IN_PROGRESS)
- return true;
+ instance_gruuls_lair_InstanceMapScript(Map* map) : InstanceScript(map)
+ {
+ SetBossNumber(EncounterCount);
+ LoadDoorData(doorData);
+ LoadMinionData(minionData);
- return false;
- }
+ MaulgarGUID = 0;
+ }
- void OnCreatureCreate(Creature* creature) OVERRIDE
- {
- switch (creature->GetEntry())
+ void OnCreatureCreate(Creature* creature) OVERRIDE
{
- case 18835: KigglerTheCrazed = creature->GetGUID(); break;
- case 18836: BlindeyeTheSeer = creature->GetGUID(); break;
- case 18834: OlmTheSummoner = creature->GetGUID(); break;
- case 18832: KroshFirehand = creature->GetGUID(); break;
- case 18831: Maulgar = creature->GetGUID(); break;
+ switch (creature->GetEntry())
+ {
+ case NPC_MAULGAR:
+ MaulgarGUID = creature->GetGUID();
+ // no break;
+ case NPC_KROSH_FIREHAND:
+ case NPC_OLM_THE_SUMMONER:
+ case NPC_KIGGLER_THE_CRAZED:
+ case NPC_BLINDEYE_THE_SEER:
+ AddMinion(creature, true);
+ break;
+ default:
+ break;
+ }
}
- }
- void OnGameObjectCreate(GameObject* go) OVERRIDE
- {
- switch (go->GetEntry())
+ void OnCreatureRemove(Creature* creature) OVERRIDE
{
- case 184468:
- MaulgarDoor = go->GetGUID();
- if (m_auiEncounter[0] == DONE)
- HandleGameObject(0, true, go);
- break;
- case 184662:
- GruulDoor = go->GetGUID();
- break;
+ switch (creature->GetEntry())
+ {
+ case NPC_MAULGAR:
+ case NPC_KROSH_FIREHAND:
+ case NPC_OLM_THE_SUMMONER:
+ case NPC_KIGGLER_THE_CRAZED:
+ case NPC_BLINDEYE_THE_SEER:
+ AddMinion(creature, false);
+ break;
+ default:
+ break;
+ }
}
- }
- void SetData64(uint32 type, uint64 data) OVERRIDE
- {
- if (type == DATA_MAULGAREVENT_TANK)
- MaulgarEvent_Tank = data;
- }
-
- uint64 GetData64(uint32 identifier) const OVERRIDE
- {
- switch (identifier)
+ void OnGameObjectCreate(GameObject* go) OVERRIDE
{
- case DATA_MAULGAREVENT_TANK: return MaulgarEvent_Tank;
- case DATA_KIGGLERTHECRAZED: return KigglerTheCrazed;
- case DATA_BLINDEYETHESEER: return BlindeyeTheSeer;
- case DATA_OLMTHESUMMONER: return OlmTheSummoner;
- case DATA_KROSHFIREHAND: return KroshFirehand;
- case DATA_MAULGARDOOR: return MaulgarDoor;
- case DATA_GRUULDOOR: return GruulDoor;
- case DATA_MAULGAR: return Maulgar;
+ switch (go->GetEntry())
+ {
+ case GO_MAULGAR_DOOR:
+ case GO_GRUUL_DOOR:
+ AddDoor(go, true);
+ break;
+ default:
+ break;
+ }
}
- return 0;
- }
- void SetData(uint32 type, uint32 data) OVERRIDE
- {
- switch (type)
+ void OnGameObjectRemove(GameObject* go) OVERRIDE
{
- case DATA_MAULGAREVENT:
- if (data == DONE)
- HandleGameObject(MaulgarDoor, true);
- m_auiEncounter[0] = data;
- break;
-
- case DATA_GRUULEVENT:
- if (data == IN_PROGRESS)
- HandleGameObject(GruulDoor, false);
- else
- HandleGameObject(GruulDoor, true);
- m_auiEncounter[1] = data;
- break;
+ switch (go->GetEntry())
+ {
+ case GO_MAULGAR_DOOR:
+ case GO_GRUUL_DOOR:
+ AddDoor(go, false);
+ break;
+ default:
+ break;
+ }
}
- if (data == DONE)
- SaveToDB();
- }
-
- uint32 GetData(uint32 type) const OVERRIDE
- {
- switch (type)
+ uint64 GetData64(uint32 type) const OVERRIDE
{
- case DATA_MAULGAREVENT: return m_auiEncounter[0];
- case DATA_GRUULEVENT: return m_auiEncounter[1];
+ switch (type)
+ {
+ case DATA_MAULGAR:
+ return MaulgarGUID;
+ default:
+ break;
+ }
+ return 0;
}
- return 0;
- }
- std::string GetSaveData() OVERRIDE
- {
- OUT_SAVE_INST_DATA;
- std::ostringstream stream;
- stream << m_auiEncounter[0] << ' ' << m_auiEncounter[1];
+ std::string GetSaveData() OVERRIDE
+ {
+ OUT_SAVE_INST_DATA;
- OUT_SAVE_INST_DATA_COMPLETE;
- return stream.str();
- }
+ std::ostringstream saveStream;
+ saveStream << "G L " << GetBossSaveData();
- void Load(const char* in) OVERRIDE
- {
- if (!in)
+ OUT_SAVE_INST_DATA_COMPLETE;
+ return saveStream.str();
+ }
+
+ void Load(char const* str) OVERRIDE
{
- OUT_LOAD_INST_DATA_FAIL;
- return;
+ 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 == 'G' && dataHead2 == 'L')
+ {
+ for (uint32 i = 0; i < EncounterCount; ++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;
}
- OUT_LOAD_INST_DATA(in);
- std::istringstream stream(in);
- stream >> m_auiEncounter[0] >> m_auiEncounter[1];
- for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
- if (m_auiEncounter[i] == IN_PROGRESS) // Do not load an encounter as "In Progress" - reset it instead.
- m_auiEncounter[i] = NOT_STARTED;
- OUT_LOAD_INST_DATA_COMPLETE;
- }
- };
+ protected:
+ uint64 MaulgarGUID;
+ };
+ InstanceScript* GetInstanceScript(InstanceMap* map) const OVERRIDE
+ {
+ return new instance_gruuls_lair_InstanceMapScript(map);
+ }
};
void AddSC_instance_gruuls_lair()
diff --git a/src/server/scripts/Spells/spell_shaman.cpp b/src/server/scripts/Spells/spell_shaman.cpp
index 3bf305d73c9..caae7944f78 100644
--- a/src/server/scripts/Spells/spell_shaman.cpp
+++ b/src/server/scripts/Spells/spell_shaman.cpp
@@ -512,9 +512,9 @@ class spell_sha_flame_shock : public SpellScriptLoader
// Lava Flows
if (AuraEffect const* aurEff = caster->GetDummyAuraEffect(SPELLFAMILY_SHAMAN, SHAMAN_ICON_ID_SHAMAN_LAVA_FLOW, EFFECT_0))
{
- SpellInfo const* firstRankSpellInfo = sSpellMgr->GetSpellInfo(SPELL_SHAMAN_LAVA_FLOWS_R1);
- if (!aurEff->GetSpellInfo()->IsRankOf(firstRankSpellInfo))
- return;
+ if (SpellInfo const* firstRankSpellInfo = sSpellMgr->GetSpellInfo(SPELL_SHAMAN_LAVA_FLOWS_R1))
+ if (!aurEff->GetSpellInfo()->IsRankOf(firstRankSpellInfo))
+ return;
int32 basepoints = aurEff->GetAmount();
caster->CastCustomSpell(caster, SPELL_SHAMAN_LAVA_FLOWS_TRIGGERED_R1, &basepoints, NULL, NULL, true);
diff --git a/src/server/shared/Cryptography/HMACSHA1.cpp b/src/server/shared/Cryptography/HMACSHA1.cpp
index 62d1997ded2..c6c49f14a8e 100644
--- a/src/server/shared/Cryptography/HMACSHA1.cpp
+++ b/src/server/shared/Cryptography/HMACSHA1.cpp
@@ -36,6 +36,11 @@ void HmacHash::UpdateData(const std::string &str)
HMAC_Update(&m_ctx, (uint8 const*)str.c_str(), str.length());
}
+void HmacHash::UpdateData(const uint8* data, size_t len)
+{
+ HMAC_Update(&m_ctx, data, len);
+}
+
void HmacHash::Finalize()
{
uint32 length = 0;
diff --git a/src/server/shared/Cryptography/HMACSHA1.h b/src/server/shared/Cryptography/HMACSHA1.h
index e09e7fdb43c..04b8f7d0277 100644
--- a/src/server/shared/Cryptography/HMACSHA1.h
+++ b/src/server/shared/Cryptography/HMACSHA1.h
@@ -34,6 +34,7 @@ class HmacHash
HmacHash(uint32 len, uint8 *seed);
~HmacHash();
void UpdateData(const std::string &str);
+ void UpdateData(const uint8* data, size_t len);
void Finalize();
uint8 *ComputeHash(BigNumber* bn);
uint8 *GetDigest() { return (uint8*)m_digest; }
diff --git a/src/server/shared/Database/Implementation/LoginDatabase.cpp b/src/server/shared/Database/Implementation/LoginDatabase.cpp
index 6113dd61d70..26940c8a599 100644
--- a/src/server/shared/Database/Implementation/LoginDatabase.cpp
+++ b/src/server/shared/Database/Implementation/LoginDatabase.cpp
@@ -37,7 +37,7 @@ void LoginDatabaseConnection::DoPrepareStatements()
PrepareStatement(LOGIN_SEL_SESSIONKEY, "SELECT a.sessionkey, a.id, aa.gmlevel FROM account a LEFT JOIN account_access aa ON (a.id = aa.id) WHERE username = ?", CONNECTION_SYNCH);
PrepareStatement(LOGIN_UPD_VS, "UPDATE account SET v = ?, s = ? WHERE username = ?", CONNECTION_ASYNC);
PrepareStatement(LOGIN_UPD_LOGONPROOF, "UPDATE account SET sessionkey = ?, last_ip = ?, last_login = NOW(), locale = ?, failed_logins = 0, os = ? WHERE username = ?", CONNECTION_ASYNC);
- PrepareStatement(LOGIN_SEL_LOGONCHALLENGE, "SELECT a.sha_pass_hash, a.id, a.locked, a.lock_country, a.last_ip, aa.gmlevel, a.v, a.s FROM account a LEFT JOIN account_access aa ON (a.id = aa.id) WHERE a.username = ?", CONNECTION_SYNCH);
+ PrepareStatement(LOGIN_SEL_LOGONCHALLENGE, "SELECT a.sha_pass_hash, a.id, a.locked, a.lock_country, a.last_ip, aa.gmlevel, a.v, a.s, a.token_key FROM account a LEFT JOIN account_access aa ON (a.id = aa.id) WHERE a.username = ?", CONNECTION_SYNCH);
PrepareStatement(LOGIN_SEL_LOGON_COUNTRY, "SELECT country FROM ip2nation WHERE ip < ? ORDER BY ip DESC LIMIT 0,1", CONNECTION_SYNCH);
PrepareStatement(LOGIN_UPD_FAILEDLOGINS, "UPDATE account SET failed_logins = failed_logins + 1 WHERE username = ?", CONNECTION_ASYNC);
PrepareStatement(LOGIN_SEL_FAILEDLOGINS, "SELECT id, failed_logins FROM account WHERE username = ?", CONNECTION_SYNCH);
diff --git a/src/server/shared/Database/QueryResult.cpp b/src/server/shared/Database/QueryResult.cpp
index 4f4c0ec51f4..9413e28a0c0 100644
--- a/src/server/shared/Database/QueryResult.cpp
+++ b/src/server/shared/Database/QueryResult.cpp
@@ -60,6 +60,9 @@ m_length(NULL)
if (mysql_stmt_store_result(m_stmt))
{
TC_LOG_WARN(LOG_FILTER_SQL, "%s:mysql_stmt_store_result, cannot bind result from MySQL server. Error: %s", __FUNCTION__, mysql_stmt_error(m_stmt));
+ delete[] m_rBind;
+ delete[] m_isNull;
+ delete[] m_length;
return;
}
diff --git a/src/server/shared/Threading/Threading.cpp b/src/server/shared/Threading/Threading.cpp
index bd96c359616..34a7bf8bb9d 100644
--- a/src/server/shared/Threading/Threading.cpp
+++ b/src/server/shared/Threading/Threading.cpp
@@ -62,7 +62,7 @@ ThreadPriority::ThreadPriority()
//since we have only 7(seven) values in enum Priority
//and 3 we know already (Idle, Normal, Realtime) so
//we need to split each list [Idle...Normal] and [Normal...Realtime]
- //into ¹ piesces
+ //into piecies
const size_t _divider = 4;
size_t _div = (norm_pos - min_pos) / _divider;
if (_div == 0)
@@ -130,10 +130,13 @@ bool Thread::start()
if (m_task == 0 || m_iThreadId != 0)
return false;
+ // incRef before spawing the thread, otherwise Thread::ThreadTask() might call decRef and delete m_task
+ m_task->incReference();
+
bool res = (ACE_Thread::spawn(&Thread::ThreadTask, (void*)m_task, THREADFLAG, &m_iThreadId, &m_hThreadHandle) == 0);
- if (res)
- m_task->incReference();
+ if (!res)
+ m_task->decReference();
return res;
}
diff --git a/src/server/shared/Utilities/Util.h b/src/server/shared/Utilities/Util.h
index 5d1ce862d21..0ecc5a9f756 100644
--- a/src/server/shared/Utilities/Util.h
+++ b/src/server/shared/Utilities/Util.h
@@ -173,7 +173,7 @@ inline bool isExtendedLatinCharacter(wchar_t wchar)
return true;
if (wchar >= 0x00C0 && wchar <= 0x00D6) // LATIN CAPITAL LETTER A WITH GRAVE - LATIN CAPITAL LETTER O WITH DIAERESIS
return true;
- if (wchar >= 0x00D8 && wchar <= 0x00DF) // LATIN CAPITAL LETTER O WITH STROKE - LATIN CAPITAL LETTER THORN
+ if (wchar >= 0x00D8 && wchar <= 0x00DE) // LATIN CAPITAL LETTER O WITH STROKE - LATIN CAPITAL LETTER THORN
return true;
if (wchar == 0x00DF) // LATIN SMALL LETTER SHARP S
return true;
diff --git a/src/tools/mmaps_generator/MapBuilder.cpp b/src/tools/mmaps_generator/MapBuilder.cpp
index 06a764690ca..a8254eb5eaf 100644
--- a/src/tools/mmaps_generator/MapBuilder.cpp
+++ b/src/tools/mmaps_generator/MapBuilder.cpp
@@ -202,7 +202,10 @@ namespace MMAP
minX = INT_MIN;
minY = INT_MIN;
- float bmin[3], bmax[3], lmin[3], lmax[3];
+ float bmin[3] = { 0, 0, 0 };
+ float bmax[3] = { 0, 0, 0 };
+ float lmin[3] = { 0, 0, 0 };
+ float lmax[3] = { 0, 0, 0 };
MeshData meshData;
// make sure we process maps which don't have tiles
@@ -260,25 +263,45 @@ namespace MMAP
uint32 verticesCount, indicesCount;
if (fread(&verticesCount, sizeof(uint32), 1, file) != 1)
+ {
+ fclose(file);
return;
+ }
+
if (fread(&indicesCount, sizeof(uint32), 1, file) != 1)
+ {
+ fclose(file);
return;
+ }
float* verts = new float[verticesCount];
int* inds = new int[indicesCount];
if (fread(verts, sizeof(float), verticesCount, file) != verticesCount)
+ {
+ fclose(file);
+ delete[] verts;
+ delete[] inds;
return;
+ }
+
if (fread(inds, sizeof(int), indicesCount, file) != indicesCount)
+ {
+ fclose(file);
+ delete[] verts;
+ delete[] inds;
return;
+ }
MeshData data;
for (uint32 i = 0; i < verticesCount; ++i)
data.solidVerts.append(verts[i]);
+ delete[] verts;
for (uint32 i = 0; i < indicesCount; ++i)
data.solidTris.append(inds[i]);
+ delete[] inds;
TerrainBuilder::cleanVertices(data.solidVerts, data.solidTris);
// get bounds of current tile
@@ -659,6 +682,9 @@ namespace MMAP
if (!iv.polyMesh)
{
printf("%s alloc iv.polyMesh FIALED!\n", tileString);
+ delete[] pmmerge;
+ delete[] dmmerge;
+ delete[] tiles;
return;
}
rcMergePolyMeshes(m_rcContext, pmmerge, nmerge, *iv.polyMesh);
@@ -667,6 +693,9 @@ namespace MMAP
if (!iv.polyMeshDetail)
{
printf("%s alloc m_dmesh FIALED!\n", tileString);
+ delete[] pmmerge;
+ delete[] dmmerge;
+ delete[] tiles;
return;
}
rcMergePolyMeshDetails(m_rcContext, dmmerge, nmerge, *iv.polyMeshDetail);
@@ -674,7 +703,6 @@ namespace MMAP
// free things up
delete[] pmmerge;
delete[] dmmerge;
-
delete[] tiles;
// set polygons as walkable
diff --git a/src/tools/mmaps_generator/PathCommon.h b/src/tools/mmaps_generator/PathCommon.h
index 3e06ff58410..94a11e01730 100644
--- a/src/tools/mmaps_generator/PathCommon.h
+++ b/src/tools/mmaps_generator/PathCommon.h
@@ -114,7 +114,6 @@ namespace MMAP
const char *p = dirpath.c_str();
DIR * dirp = opendir(p);
struct dirent * dp;
- dirp = opendir(p);
while (dirp)
{
diff --git a/src/tools/mmaps_generator/TerrainBuilder.cpp b/src/tools/mmaps_generator/TerrainBuilder.cpp
index 3a87da3d4f1..5c76161c0d6 100644
--- a/src/tools/mmaps_generator/TerrainBuilder.cpp
+++ b/src/tools/mmaps_generator/TerrainBuilder.cpp
@@ -260,7 +260,8 @@ namespace MMAP
meshData.solidVerts.append(coord[1]);
}
- int indices[3], loopStart = 0, loopEnd = 0, loopInc = 0;
+ int indices[] = { 0, 0, 0 };
+ int loopStart = 0, loopEnd = 0, loopInc = 0;
getLoopVars(portion, loopStart, loopEnd, loopInc);
for (int i = loopStart; i < loopEnd; i+=loopInc)
for (int j = TOP; j <= BOTTOM; j+=1)
@@ -340,7 +341,8 @@ namespace MMAP
delete [] liquid_map;
- int indices[3], loopStart = 0, loopEnd = 0, loopInc = 0, triInc = BOTTOM-TOP;
+ int indices[] = { 0, 0, 0 };
+ int loopStart = 0, loopEnd = 0, loopInc = 0, triInc = BOTTOM-TOP;
getLoopVars(portion, loopStart, loopEnd, loopInc);
// generate triangles
diff --git a/src/tools/vmap4_assembler/VMapAssembler.cpp b/src/tools/vmap4_assembler/VMapAssembler.cpp
index bb8e324bc75..4ee6f5fce3c 100644
--- a/src/tools/vmap4_assembler/VMapAssembler.cpp
+++ b/src/tools/vmap4_assembler/VMapAssembler.cpp
@@ -5,9 +5,8 @@
int main(int argc, char* argv[])
{
- if(argc != 3)
+ if (argc != 3)
{
- //printf("\nusage: %s <raw data dir> <vmap dest dir> [config file name]\n", argv[0]);
std::cout << "usage: " << argv[0] << " <raw data dir> <vmap dest dir>" << std::endl;
return 1;
}
@@ -19,7 +18,7 @@ int main(int argc, char* argv[])
VMAP::TileAssembler* ta = new VMAP::TileAssembler(src, dest);
- if(!ta->convertWorld2())
+ if (!ta->convertWorld2())
{
std::cout << "exit with errors" << std::endl;
delete ta;
diff --git a/src/tools/vmap4_extractor/gameobject_extract.cpp b/src/tools/vmap4_extractor/gameobject_extract.cpp
index 3147469e342..af6d621248c 100644
--- a/src/tools/vmap4_extractor/gameobject_extract.cpp
+++ b/src/tools/vmap4_extractor/gameobject_extract.cpp
@@ -50,7 +50,13 @@ void ExtractGameobjectModels()
basepath += "/";
std::string path;
- FILE * model_list = fopen((basepath + "temp_gameobject_models").c_str(), "wb");
+ std::string modelListPath = basepath + "temp_gameobject_models";
+ FILE* model_list = fopen(modelListPath.c_str(), "wb");
+ if (!model_list)
+ {
+ printf("Fatal error: Could not open file %s\n", modelListPath.c_str());
+ return;
+ }
for (DBCFile::Iterator it = dbc.begin(); it != dbc.end(); ++it)
{
diff --git a/src/tools/vmap4_extractor/vmapexport.cpp b/src/tools/vmap4_extractor/vmapexport.cpp
index b650121f587..cd9f552eaee 100644
--- a/src/tools/vmap4_extractor/vmapexport.cpp
+++ b/src/tools/vmap4_extractor/vmapexport.cpp
@@ -315,16 +315,16 @@ bool ExtractSingleWmo(std::string& fname)
return true;
int p = 0;
- //Select root wmo files
+ // Select root wmo files
char const* rchr = strrchr(plain_name, '_');
- if(rchr != NULL)
+ if (rchr != NULL)
{
char cpy[4];
- strncpy((char*)cpy, rchr, 4);
+ memcpy(cpy, rchr, 4);
for (int i = 0; i < 4; ++i)
{
int m = cpy[i];
- if(isdigit(m))
+ if (isdigit(m))
p++;
}
}
diff --git a/src/tools/vmap4_extractor/wmo.cpp b/src/tools/vmap4_extractor/wmo.cpp
index 63187963550..8bf70b8ffbb 100644
--- a/src/tools/vmap4_extractor/wmo.cpp
+++ b/src/tools/vmap4_extractor/wmo.cpp
@@ -138,14 +138,12 @@ bool WMORoot::ConvertToVMAPRootWmo(FILE* pOutfile)
return true;
}
-WMORoot::~WMORoot()
-{
-}
-
WMOGroup::WMOGroup(const std::string &filename) :
filename(filename), MOPY(0), MOVI(0), MoviEx(0), MOVT(0), MOBA(0), MobaEx(0),
hlq(0), LiquEx(0), LiquBytes(0), groupName(0), descGroupName(0), mogpFlags(0),
- mopy_size(0), moba_size(0), LiquEx_size(0), nVertices(0), nTriangles(0)
+ mopy_size(0), moba_size(0), LiquEx_size(0), nVertices(0), nTriangles(0),
+ moprIdx(0), moprNItems(0), nBatchA(0), nBatchB(0), fogIdx(0), liquidType(0),
+ groupWMOID(0), liquflags(0)
{
memset(bbcorn1, 0, sizeof(bbcorn1));
memset(bbcorn2, 0, sizeof(bbcorn2));
@@ -390,7 +388,7 @@ int WMOGroup::ConvertToVMAPGroupWmo(FILE *output, WMORoot *rootWMO, bool precise
fwrite(MoviEx,2,nColTriangles*3,output);
// write vertices
- int VERT[] = {0x54524556, nColVertices*3*sizeof(float)+4, nColVertices};// "VERT"
+ int VERT[] = {0x54524556, nColVertices*3*static_cast<int>(sizeof(float))+4, nColVertices};// "VERT"
int check = 3*nColVertices;
fwrite(VERT,4,3,output);
for (uint32 i=0; i<nVertices; ++i)
@@ -404,9 +402,9 @@ int WMOGroup::ConvertToVMAPGroupWmo(FILE *output, WMORoot *rootWMO, bool precise
}
//------LIQU------------------------
- if(LiquEx_size != 0)
+ if (LiquEx_size != 0)
{
- int LIQU_h[] = {0x5551494C, sizeof(WMOLiquidHeader) + LiquEx_size + hlq->xtiles*hlq->ytiles};// "LIQU"
+ int LIQU_h[] = {0x5551494C, static_cast<int>(sizeof(WMOLiquidHeader) + LiquEx_size) + hlq->xtiles*hlq->ytiles};// "LIQU"
fwrite(LIQU_h, 4, 2, output);
// according to WoW.Dev Wiki:
@@ -441,7 +439,7 @@ int WMOGroup::ConvertToVMAPGroupWmo(FILE *output, WMORoot *rootWMO, bool precise
if (liquidEntry && liquidEntry < 21)
{
- switch (((uint8)liquidEntry - 1) & 3)
+ switch ((liquidEntry - 1) & 3)
{
case 0:
liquidEntry = ((mogpFlags & 0x80000) != 0) + 13;
@@ -455,8 +453,6 @@ int WMOGroup::ConvertToVMAPGroupWmo(FILE *output, WMORoot *rootWMO, bool precise
case 3:
liquidEntry = 20;
break;
- default:
- break;
}
}
@@ -490,7 +486,7 @@ WMOGroup::~WMOGroup()
}
WMOInstance::WMOInstance(MPQFile& f, char const* WmoInstName, uint32 mapID, uint32 tileX, uint32 tileY, FILE* pDirfile)
- : currx(0), curry(0), wmo(NULL), doodadset(0), pos(), indx(0), d3(0)
+ : currx(0), curry(0), wmo(NULL), doodadset(0), pos(), indx(0), id(0), d2(0), d3(0)
{
float ff[3];
f.read(&id, 4);
diff --git a/src/tools/vmap4_extractor/wmo.h b/src/tools/vmap4_extractor/wmo.h
index 16d55ffe7de..204e4ead0ce 100644
--- a/src/tools/vmap4_extractor/wmo.h
+++ b/src/tools/vmap4_extractor/wmo.h
@@ -53,7 +53,6 @@ public:
float bbcorn2[3];
WMORoot(std::string& filename);
- ~WMORoot();
bool open();
bool ConvertToVMAPRootWmo(FILE* output);