From 77f1d3a328bde763b7acdb7573087610d2482712 Mon Sep 17 00:00:00 2001 From: Discover- Date: Sat, 17 Aug 2013 14:17:38 +0200 Subject: Core/Misc: Implement CMSG_SET_TAXI_BENCHMARK_MODE to toggle PLAYER_FLAGS_TAXI_BENCHMARK based on arguments. To enable/disable this, call '/script SetTaxiBenchmarkMode(1)' (1 = on, 0 = off). Basically debugs the taxi flight and outputs min, max and avg FPS during flight. Automatically toggled off when flight ends. --- src/server/game/Handlers/MiscHandler.cpp | 4 ++++ .../game/Movement/MovementGenerators/WaypointMovementGenerator.cpp | 2 ++ 2 files changed, 6 insertions(+) (limited to 'src') diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp index e8d781a8f60..635a01d264b 100644 --- a/src/server/game/Handlers/MiscHandler.cpp +++ b/src/server/game/Handlers/MiscHandler.cpp @@ -1613,9 +1613,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/Movement/MovementGenerators/WaypointMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp index 861b986dcdb..8056d6263c0 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 -- cgit v1.2.3 From 7e3a52bb42a6f1a7882440fce575f82b9d0fe6ec Mon Sep 17 00:00:00 2001 From: joschiwald Date: Tue, 20 Aug 2013 18:11:41 +0200 Subject: Scripts/HallsOfLightning: reworked InstanceScript --- src/server/game/Spells/SpellMgr.cpp | 4 - .../DraktharonKeep/instance_drak_tharon_keep.cpp | 2 +- .../Ulduar/HallsOfLightning/boss_bjarngrim.cpp | 6 +- .../Ulduar/HallsOfLightning/boss_ionar.cpp | 8 +- .../Ulduar/HallsOfLightning/boss_loken.cpp | 7 +- .../Ulduar/HallsOfLightning/boss_volkhan.cpp | 6 +- .../Ulduar/HallsOfLightning/halls_of_lightning.h | 48 +-- .../instance_halls_of_lightning.cpp | 338 +++++++++------------ 8 files changed, 185 insertions(+), 234 deletions(-) (limited to 'src') diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index 94454e8440d..ebf7121eb54 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -3374,10 +3374,6 @@ void SpellMgr::LoadSpellInfoCorrections() case 53313: // Entangling Roots (Rank 8) -- Nature's Grasp Proc spellInfo->CastTimeEntry = sSpellCastTimesStore.LookupEntry(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; 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/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..3659f53752c 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 - * Copyright (C) 2006-2009 ScriptDev2 * * 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,23 @@ * with this program. If not, see . */ -#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, +#include "Map.h" +#include "Creature.h" - DATA_BJARNGRIM = 1, - DATA_IONAR = 2, - DATA_LOKEN = 3, - DATA_VOLKHAN = 4, +#define HoLScriptName "instance_halls_of_lightning" - TYPE_BJARNGRIM = 10, - TYPE_IONAR = 11, - TYPE_LOKEN = 12, - TYPE_VOLKHAN = 13, +uint32 const EncounterCount = 4; + +enum DataTypes +{ + // Encounter States/Boss GUIDs + DATA_BJARNGRIM = 0, + DATA_VOLKHAN = 1, + DATA_IONAR = 2, + DATA_LOKEN = 3 }; enum CreaturesIds @@ -44,11 +44,21 @@ 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 +AI* GetHallsOfLightningAI(Creature* creature) +{ + if (InstanceMap* instance = creature->GetMap()->ToInstanceMap()) + if (instance->GetInstanceScript()) + if (instance->GetScriptId() == sObjectMgr->GetScriptId(HoLScriptName)) + return new AI(creature); + return NULL; +} + +#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..95967f3a7bc 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 - * Copyright (C) 2006-2009 ScriptDev2 * * 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,185 @@ * with this program. If not, see . */ -/* 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 }, +}; 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() -- cgit v1.2.3 From 296da5df1215692435cb6488212ca8cbf6e39925 Mon Sep 17 00:00:00 2001 From: Shauren Date: Tue, 20 Aug 2013 21:16:54 +0200 Subject: Core/Commands: Improved debug moveflags to also send associated opcodes --- src/server/scripts/Commands/cs_debug.cpp | 34 ++++++++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/server/scripts/Commands/cs_debug.cpp b/src/server/scripts/Commands/cs_debug.cpp index c01a8e95559..bb2167abbe7 100644 --- a/src/server/scripts/Commands/cs_debug.cpp +++ b/src/server/scripts/Commands/cs_debug.cpp @@ -1309,7 +1309,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) { @@ -1317,7 +1345,9 @@ public: target->SetExtraUnitMovementFlags(moveFlagsExtra); } - target->SendMovementFlagUpdate(); + if (mask2 || unhandledFlag) + target->SendMovementFlagUpdate(); + handler->PSendSysMessage(LANG_MOVEFLAGS_SET, target->GetUnitMovementFlags(), target->GetExtraUnitMovementFlags()); } -- cgit v1.2.3 From 7a14e366ac9bff8d5c56c70b56a319d906daa1e0 Mon Sep 17 00:00:00 2001 From: joschiwald Date: Tue, 20 Aug 2013 23:05:00 +0200 Subject: Scripts/AzjolNerub: reworked InstanceScript --- .../Northrend/AzjolNerub/AzjolNerub/azjol_nerub.h | 60 ++++- .../AzjolNerub/AzjolNerub/boss_anubarak.cpp | 6 +- .../AzjolNerub/AzjolNerub/boss_hadronox.cpp | 8 +- .../AzjolNerub/boss_krikthir_the_gatewatcher.cpp | 13 +- .../AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp | 297 ++++++++++----------- .../instance_halls_of_lightning.cpp | 1 + 6 files changed, 196 insertions(+), 189 deletions(-) (limited to 'src') diff --git a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/azjol_nerub.h b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/azjol_nerub.h index 5970a85cc38..ea0382cdd80 100644 --- a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/azjol_nerub.h +++ b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/azjol_nerub.h @@ -15,24 +15,56 @@ * with this program. If not, see . */ -#ifndef DEF_AZJOL_NERUB_H -#define DEF_AZJOL_NERUB_H +#ifndef AZJOL_NERUB_H_ +#define AZJOL_NERUB_H_ -enum Data64 +#include "Map.h" +#include "Creature.h" + +#define AzjolNerubScriptName "instance_azjol_nerub" + +uint32 const EncounterCount = 3; + +enum DataTypes +{ + // 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 CreatureIds { - DATA_KRIKTHIR_THE_GATEWATCHER, - DATA_HADRONOX, - DATA_ANUBARAK, - DATA_WATCHER_GASHRA, - DATA_WATCHER_SILTHIK, - DATA_WATCHER_NARJIL + NPC_KRIKTHIR = 28684, + NPC_HADRONOX = 28921, + NPC_ANUBARAK = 29120, + + NPC_WATCHER_NARJIL = 28729, + NPC_WATCHER_GASHRA = 28730, + NPC_WATCHER_SILTHIK = 28731 }; -enum Data +enum GameObjectIds { - DATA_KRIKTHIR_THE_GATEWATCHER_EVENT, - DATA_HADRONOX_EVENT, - DATA_ANUBARAK_EVENT + GO_KRIKTHIR_DOOR = 192395, + GO_ANUBARAK_DOOR_1 = 192396, + GO_ANUBARAK_DOOR_2 = 192397, + GO_ANUBARAK_DOOR_3 = 192398 }; -#endif +template +AI* GetAzjolNerubAI(Creature* creature) +{ + if (InstanceMap* instance = creature->GetMap()->ToInstanceMap()) + if (instance->GetInstanceScript()) + if (instance->GetScriptId() == sObjectMgr->GetScriptId(AzjolNerubScriptName)) + return new AI(creature); + return NULL; +} + +#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/Ulduar/HallsOfLightning/instance_halls_of_lightning.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/instance_halls_of_lightning.cpp index 95967f3a7bc..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 @@ -25,6 +25,7 @@ DoorData const doorData[] = { 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 -- cgit v1.2.3 From 62c7e309eedfb13ced4bede74ae0c84deb9f27c5 Mon Sep 17 00:00:00 2001 From: joschiwald Date: Wed, 21 Aug 2013 12:29:28 +0200 Subject: Scripts/BlackTemple: reworked InstanceScript --- .../scripts/Outland/BlackTemple/black_temple.h | 100 ++-- .../scripts/Outland/BlackTemple/boss_bloodboil.cpp | 6 +- .../scripts/Outland/BlackTemple/boss_illidan.cpp | 22 +- .../Outland/BlackTemple/boss_mother_shahraz.cpp | 6 +- .../BlackTemple/boss_reliquary_of_souls.cpp | 14 +- .../Outland/BlackTemple/boss_shade_of_akama.cpp | 18 +- .../scripts/Outland/BlackTemple/boss_supremus.cpp | 16 +- .../Outland/BlackTemple/boss_teron_gorefiend.cpp | 6 +- .../Outland/BlackTemple/boss_warlord_najentus.cpp | 8 +- .../Outland/BlackTemple/illidari_council.cpp | 47 +- .../Outland/BlackTemple/instance_black_temple.cpp | 544 ++++++++------------- 11 files changed, 350 insertions(+), 437 deletions(-) (limited to 'src') diff --git a/src/server/scripts/Outland/BlackTemple/black_temple.h b/src/server/scripts/Outland/BlackTemple/black_temple.h index 971cc36d7ba..1d3c3c3edd6 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 - * Copyright (C) 2006-2009 ScriptDev2 * * 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,81 @@ #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 +AI* GetBlackTempleAI(Creature* creature) +{ + if (InstanceMap* instance = creature->GetMap()->ToInstanceMap()) + if (instance->GetInstanceScript()) + if (instance->GetScriptId() == sObjectMgr->GetScriptId(BTScriptName)) + return new AI(creature); + return NULL; +} + +#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..3ab78d14019 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,7 +1800,7 @@ 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) { @@ -2164,7 +2164,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..664b0f6d963 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp @@ -200,7 +200,7 @@ 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 {} @@ -343,7 +343,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 +351,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, akamaGUID)) Akama->DespawnOrUnsummon(); for (std::list::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::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); @@ -485,8 +485,8 @@ public: case EVENT_SHADE_START: if (instance) { - ShadeGUID = instance->GetData64(DATA_SHADEOFAKAMA); - instance->SetData(DATA_SHADEOFAKAMAEVENT, IN_PROGRESS); + ShadeGUID = instance->GetData64(DATA_SHADE_OF_AKAMA); + instance->SetBossState(DATA_SHADE_OF_AKAMA, IN_PROGRESS); me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); me->RemoveAura(SPELL_STEALTH); me->SetWalk(true); @@ -622,7 +622,7 @@ public: break; case EVENT_GET_SHADE_GUID: if (instance) - ShadeGUID = instance->GetData64(DATA_SHADEOFAKAMA); + ShadeGUID = instance->GetData64(DATA_SHADE_OF_AKAMA); break; default: break; @@ -768,7 +768,7 @@ public: if (instance) { akamaGUID = instance->GetData64(DATA_AKAMA_SHADE); - shadeGUID = instance->GetData64(DATA_SHADEOFAKAMA); + shadeGUID = instance->GetData64(DATA_SHADE_OF_AKAMA); } } 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 - * Copyright (C) 2006-2009 ScriptDev2 * * 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 . */ -/* 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() -- cgit v1.2.3 From 1e89ae1960affb23ea5f120b0e7287c705323480 Mon Sep 17 00:00:00 2001 From: Vincent-Michael Date: Wed, 21 Aug 2013 18:46:52 +0200 Subject: Core: Fix warnings and random changes --- src/server/scripts/Northrend/zone_sholazar_basin.cpp | 2 +- .../scripts/Outland/BlackTemple/boss_illidan.cpp | 14 +++++--------- .../Outland/BlackTemple/boss_shade_of_akama.cpp | 19 ++++++++----------- 3 files changed, 14 insertions(+), 21 deletions(-) (limited to 'src') 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/boss_illidan.cpp b/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp index 3ab78d14019..4dedc774bb8 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp @@ -1802,16 +1802,12 @@ void boss_illidan_stormrage::boss_illidan_stormrageAI::Reset() if (instance) 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; 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 664b0f6d963..69602baf5d4 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp @@ -443,7 +443,7 @@ public: void JustDied(Unit* /*killer*/) OVERRIDE { - if (Creature* Shade = Unit::GetCreature((*me), ShadeGUID)) + if (Creature* Shade = ObjectAccessor::GetCreature(*me, ShadeGUID)) if (Shade->IsAlive()) CAST_AI(boss_shade_of_akama::boss_shade_of_akamaAI, Shade->AI())->HasKilledAkama = true; me->GetMotionMaster()->Clear(true); @@ -452,17 +452,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, ShadeGUID)) + Shade->RemoveAura(SPELL_AKAMA_SOUL_CHANNEL); + StartCombat = true; } } -- cgit v1.2.3 From a383885f5c39ae85b2796c8f098f9ed03b152360 Mon Sep 17 00:00:00 2001 From: joschiwald Date: Wed, 21 Aug 2013 19:43:46 +0200 Subject: Scripts/AhnKahet: reworked InstanceScript --- src/server/game/Instances/InstanceScript.h | 16 +- .../Northrend/AzjolNerub/Ahnkahet/ahnkahet.h | 84 +++- .../AzjolNerub/Ahnkahet/boss_amanitar.cpp | 177 ++++--- .../AzjolNerub/Ahnkahet/boss_elder_nadox.cpp | 53 +-- .../AzjolNerub/Ahnkahet/boss_herald_volazj.cpp | 12 +- .../Ahnkahet/boss_jedoga_shadowseeker.cpp | 37 +- .../AzjolNerub/Ahnkahet/boss_prince_taldaram.cpp | 81 ++-- .../AzjolNerub/Ahnkahet/instance_ahnkahet.cpp | 510 ++++++++++----------- .../Northrend/AzjolNerub/AzjolNerub/azjol_nerub.h | 9 +- .../Northrend/DraktharonKeep/drak_tharon_keep.h | 9 +- .../Ulduar/HallsOfLightning/halls_of_lightning.h | 9 +- .../scripts/Outland/BlackTemple/black_temple.h | 6 +- 12 files changed, 471 insertions(+), 532 deletions(-) (limited to 'src') diff --git a/src/server/game/Instances/InstanceScript.h b/src/server/game/Instances/InstanceScript.h index 1e349207b2f..943ae672046 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()) @@ -235,4 +233,16 @@ class InstanceScript : public ZoneScript MinionInfoMap minions; uint32 completedEncounters; // completed encounter mask, bit indexes are DungeonEncounter.dbc boss numbers, used for packets }; -#endif + +template +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/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 +AI* GetAhnKahetAI(Creature* creature) +{ + return GetInstanceAI(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(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 057ee41a3a0..c549de9dda1 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(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..1e1a08817ef 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); @@ -414,13 +409,11 @@ public: 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(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..432aa99af99 100644 --- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/instance_ahnkahet.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/instance_ahnkahet.cpp @@ -20,321 +20,313 @@ #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 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; - } + InitiandGUIDs.clear(); - bool IsEncounterInProgress() const OVERRIDE - { - for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) - if (m_auiEncounter[i] == IN_PROGRESS) - return true; + memset(SpheresState, 0, 2 * sizeof(uint64)); + } - 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::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::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 guid) 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 vInitiands; - vInitiands.clear(); - for (std::set::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 = guid; + break; + case DATA_PL_JEDOGA_TARGET: + JedogaTarget = guid; + 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 vInitiands; + vInitiands.clear(); for (std::set::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::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::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::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 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 ea0382cdd80..5087ed0cec3 100644 --- a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/azjol_nerub.h +++ b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/azjol_nerub.h @@ -18,9 +18,6 @@ #ifndef AZJOL_NERUB_H_ #define AZJOL_NERUB_H_ -#include "Map.h" -#include "Creature.h" - #define AzjolNerubScriptName "instance_azjol_nerub" uint32 const EncounterCount = 3; @@ -60,11 +57,7 @@ enum GameObjectIds template AI* GetAzjolNerubAI(Creature* creature) { - if (InstanceMap* instance = creature->GetMap()->ToInstanceMap()) - if (instance->GetInstanceScript()) - if (instance->GetScriptId() == sObjectMgr->GetScriptId(AzjolNerubScriptName)) - return new AI(creature); - return NULL; + return GetInstanceAI(creature, AzjolNerubScriptName); } #endif // AZJOL_NERUB_H_ 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 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(creature, DrakTharonKeepScriptName); } #endif // DRAK_THARON_KEEP_H_ 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 3659f53752c..17c049e8292 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/halls_of_lightning.h +++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/halls_of_lightning.h @@ -18,9 +18,6 @@ #ifndef HALLS_OF_LIGHTNING_H_ #define HALLS_OF_LIGHTNING_H_ -#include "Map.h" -#include "Creature.h" - #define HoLScriptName "instance_halls_of_lightning" uint32 const EncounterCount = 4; @@ -54,11 +51,7 @@ enum GameObjectIds template AI* GetHallsOfLightningAI(Creature* creature) { - if (InstanceMap* instance = creature->GetMap()->ToInstanceMap()) - if (instance->GetInstanceScript()) - if (instance->GetScriptId() == sObjectMgr->GetScriptId(HoLScriptName)) - return new AI(creature); - return NULL; + return GetInstanceAI(creature, HoLScriptName); } #endif // HALLS_OF_LIGHTNING_H_ diff --git a/src/server/scripts/Outland/BlackTemple/black_temple.h b/src/server/scripts/Outland/BlackTemple/black_temple.h index 1d3c3c3edd6..fb529a6b522 100644 --- a/src/server/scripts/Outland/BlackTemple/black_temple.h +++ b/src/server/scripts/Outland/BlackTemple/black_temple.h @@ -88,11 +88,7 @@ enum GameObjectIds template AI* GetBlackTempleAI(Creature* creature) { - if (InstanceMap* instance = creature->GetMap()->ToInstanceMap()) - if (instance->GetInstanceScript()) - if (instance->GetScriptId() == sObjectMgr->GetScriptId(BTScriptName)) - return new AI(creature); - return NULL; + return GetInstanceAI(creature, BTScriptName); } #endif // BLACK_TEMPLE_H_ -- cgit v1.2.3 From dc86e87f2577e170b83e52a88c0daafc04f996ca Mon Sep 17 00:00:00 2001 From: Vincent-Michael Date: Wed, 21 Aug 2013 19:57:47 +0200 Subject: Scripted/ShadeOfAkama: Some cleanups --- .../Outland/BlackTemple/boss_shade_of_akama.cpp | 114 ++++++++------------- 1 file changed, 42 insertions(+), 72 deletions(-) (limited to 'src') 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 69602baf5d4..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::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::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); @@ -203,13 +202,13 @@ public: 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::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::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: @@ -351,7 +348,7 @@ public: me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); combatStarted = false; - if (Creature* Akama = ObjectAccessor::GetCreature(*me, akamaGUID)) + if (Creature* Akama = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_AKAMA_SHADE))) Akama->DespawnOrUnsummon(); for (std::list::const_iterator itr = Channelers.begin(); itr != Channelers.end(); ++itr) @@ -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::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 Channelers; std::list Spawners; - uint64 akamaGUID; - uint64 ShadeGUID; bool akamaReached; bool combatStarted; bool HasKilledAkamaAndReseting; @@ -443,7 +438,7 @@ public: void JustDied(Unit* /*killer*/) OVERRIDE { - if (Creature* Shade = ObjectAccessor::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); @@ -457,7 +452,7 @@ public: 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, ShadeGUID)) + if (Creature* Shade = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_SHADE_OF_AKAMA))) Shade->RemoveAura(SPELL_AKAMA_SOUL_CHANNEL); StartCombat = true; } @@ -482,7 +477,6 @@ public: case EVENT_SHADE_START: if (instance) { - ShadeGUID = instance->GetData64(DATA_SHADE_OF_AKAMA); instance->SetBossState(DATA_SHADE_OF_AKAMA, IN_PROGRESS); me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); me->RemoveAura(SPELL_STEALTH); @@ -547,7 +541,6 @@ public: private: InstanceScript* instance; EventMap events; - uint64 ShadeGUID; bool StartChannel; bool ShadeHasDied; bool StartCombat; @@ -584,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 { @@ -605,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); @@ -617,10 +609,6 @@ public: } events.ScheduleEvent(EVENT_CHANNEL, 2000); break; - case EVENT_GET_SHADE_GUID: - if (instance) - ShadeGUID = instance->GetData64(DATA_SHADE_OF_AKAMA); - break; default: break; } @@ -630,7 +618,6 @@ public: private: InstanceScript* instance; EventMap events; - uint64 ShadeGUID; }; CreatureAI* GetAI(Creature* creature) const OVERRIDE @@ -761,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_SHADE_OF_AKAMA); - } } 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); } } @@ -792,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); } @@ -821,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)) { @@ -834,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); } } @@ -846,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(); @@ -863,8 +844,6 @@ public: private: InstanceScript* instance; EventMap events; - uint64 akamaGUID; - uint64 shadeGUID; uint64 summonerGuid; float distanceToShade; bool startedBanishing; @@ -891,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); } @@ -953,13 +930,13 @@ public: break; } } + DoMeleeAttackIfReady(); } private: InstanceScript* instance; EventMap events; - uint64 akamaGUID; uint64 summonerGuid; }; @@ -983,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); } @@ -1035,13 +1010,13 @@ public: break; } } + DoMeleeAttackIfReady(); } private: InstanceScript* instance; EventMap events; - uint64 akamaGUID; uint64 summonerGuid; }; @@ -1065,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); } @@ -1117,13 +1090,13 @@ public: break; } } + DoMeleeAttackIfReady(); } private: InstanceScript* instance; EventMap events; - uint64 akamaGUID; uint64 summonerGuid; }; @@ -1147,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 @@ -1157,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); } @@ -1221,7 +1192,6 @@ public: private: InstanceScript* instance; EventMap events; - uint64 akamaGUID; uint64 summonerGuid; bool spiritMend; bool chainHeal; -- cgit v1.2.3 From 8e833743d410e1d9d1fb44dc60df9ef1ef86e661 Mon Sep 17 00:00:00 2001 From: joschiwald Date: Thu, 22 Aug 2013 13:47:54 +0200 Subject: Scripts/GruulsLair: reworked InstanceScript Known Issue: position desynch after creature respawn --- .../AzjolNerub/Ahnkahet/instance_ahnkahet.cpp | 6 +- .../scripts/Outland/GruulsLair/boss_gruul.cpp | 310 +++++++++--------- .../Outland/GruulsLair/boss_high_king_maulgar.cpp | 359 ++++----------------- .../scripts/Outland/GruulsLair/gruuls_lair.h | 45 ++- .../Outland/GruulsLair/instance_gruuls_lair.cpp | 272 ++++++++-------- 5 files changed, 378 insertions(+), 614 deletions(-) (limited to 'src') diff --git a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/instance_ahnkahet.cpp b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/instance_ahnkahet.cpp index 432aa99af99..82b334de512 100644 --- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/instance_ahnkahet.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/instance_ahnkahet.cpp @@ -178,15 +178,15 @@ class instance_ahnkahet : public InstanceMapScript return 0; } - void SetData64(uint32 type, uint64 guid) OVERRIDE + void SetData64(uint32 type, uint64 data) OVERRIDE { switch (type) { case DATA_ADD_JEDOGA_OPFER: - JedogaSacrifices = guid; + JedogaSacrifices = data; break; case DATA_PL_JEDOGA_TARGET: - JedogaTarget = guid; + JedogaTarget = data; break; default: break; 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(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(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(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(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(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(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 - * Copyright (C) 2006-2009 ScriptDev2 * * 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 . */ -#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 +AI* GetGruulsLairAI(Creature* creature) +{ + return GetInstanceAI(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 - * Copyright (C) 2006-2009 ScriptDev2 * * 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 . */ -/* 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() -- cgit v1.2.3 From b5362c5c458cd09823b8776efa7689586071d57f Mon Sep 17 00:00:00 2001 From: Aokromes Date: Fri, 23 Aug 2013 14:47:38 +0200 Subject: Script/Ahnkahet: Fix warning --- .../scripts/Northrend/AzjolNerub/Ahnkahet/boss_jedoga_shadowseeker.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') 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 1e1a08817ef..78513fec486 100644 --- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_jedoga_shadowseeker.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_jedoga_shadowseeker.cpp @@ -407,7 +407,7 @@ public: instance->SetData64(DATA_PL_JEDOGA_TARGET, killer->GetGUID()); } - void EnterCombat(Unit* who) OVERRIDE + void EnterCombat(Unit* /*who*/) OVERRIDE { } -- cgit v1.2.3 From da693bbc8158b964f8b49ff35837a38b25f977cf Mon Sep 17 00:00:00 2001 From: Shauren Date: Fri, 23 Aug 2013 18:45:17 +0200 Subject: Scripts/Halls of Reflection: Fixed accessing uninitialized memory --- .../FrozenHalls/HallsOfReflection/halls_of_reflection.cpp | 4 +++- .../HallsOfReflection/instance_halls_of_reflection.cpp | 9 ++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) (limited to 'src') 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 -- cgit v1.2.3 From 556c478e682ed7594bdf2966d3683e517da73779 Mon Sep 17 00:00:00 2001 From: Nay Date: Fri, 23 Aug 2013 20:42:22 +0100 Subject: Tools: Fix compiler warnings --- src/tools/mmaps_generator/TerrainBuilder.cpp | 6 ++++-- src/tools/vmap4_extractor/wmo.cpp | 6 +++--- 2 files changed, 7 insertions(+), 5 deletions(-) (limited to 'src') 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_extractor/wmo.cpp b/src/tools/vmap4_extractor/wmo.cpp index 7c9f23c5a95..d7bd9ecd2f9 100644 --- a/src/tools/vmap4_extractor/wmo.cpp +++ b/src/tools/vmap4_extractor/wmo.cpp @@ -388,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(sizeof(float))+4, nColVertices};// "VERT" int check = 3*nColVertices; fwrite(VERT,4,3,output); for (uint32 i=0; ixtiles*hlq->ytiles};// "LIQU" + int LIQU_h[] = {0x5551494C, static_cast(sizeof(WMOLiquidHeader) + LiquEx_size) + hlq->xtiles*hlq->ytiles};// "LIQU" fwrite(LIQU_h, 4, 2, output); // according to WoW.Dev Wiki: -- cgit v1.2.3 From a0a377a0cec135a377d431c24291c7c5092708ab Mon Sep 17 00:00:00 2001 From: Nay Date: Sat, 24 Aug 2013 01:54:37 +0100 Subject: Scripts: Fix two issues found by Valgrind ==3400== Invalid write of size 8 ==3400== at 0x1241C32: instance_ahnkahet::GetInstanceScript(InstanceMap*) const (instance_ahnkahet.cpp:54) ... ==3400== Conditional jump or move depends on uninitialised value(s) ==3400== at 0xB5DEAE: std::tr1::_Hashtable, std::allocator >, std::_Select1st >, std::equal_to, std::tr1::hash, std::tr1::__detail::_Mod_range_hashing, std::tr1::__detail::_Default_ranged_hash, std::tr1::__detail::_Prime_rehash_policy, false, false, true>::_M_find_node(std::tr1::__detail::_Hash_node, false>*, unsigned long const&, unsigned long) const (hashtable.h:830) ==3400== by 0xBDA4CA: std::tr1::_Hashtable, std::allocator >, std::_Select1st >, std::equal_to, std::tr1::hash, std::tr1::__detail::_Mod_range_hashing, std::tr1::__detail::_Default_ranged_hash, std::tr1::__detail::_Prime_rehash_policy, false, false, true>::find(unsigned long const&) (hashtable.h:698) ==3400== by 0xBDA5BF: HashMapHolder::Find(unsigned long) (ObjectAccessor.h:67) ==3400== by 0xCB5C03: Map::GetCreature(unsigned long) (ObjectAccessor.h:114) ==3400== by 0xB6E6EF: Unit::GetCreature(WorldObject&, unsigned long) (Unit.cpp:13023) ==3400== by 0x10F0790: boss_hydross_the_unstable::boss_hydross_the_unstableAI::Reset() (boss_hydross_the_unstable.cpp:164) --- .../scripts/Northrend/AzjolNerub/Ahnkahet/instance_ahnkahet.cpp | 5 +++-- .../CoilfangReservoir/SerpentShrine/boss_hydross_the_unstable.cpp | 7 ++++--- 2 files changed, 7 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/instance_ahnkahet.cpp b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/instance_ahnkahet.cpp index 82b334de512..7207bbd3aab 100644 --- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/instance_ahnkahet.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/instance_ahnkahet.cpp @@ -49,9 +49,10 @@ class instance_ahnkahet : public InstanceMapScript JedogaTarget = 0; SwitchTrigger = 0; - InitiandGUIDs.clear(); + SpheresState[0] = 0; + SpheresState[1] = 0; - memset(SpheresState, 0, 2 * sizeof(uint64)); + InitiandGUIDs.clear(); } void OnCreatureCreate(Creature* creature) OVERRIDE 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(); -- cgit v1.2.3 From cc3055f344bee00fc3b0bc268c9b9cdac9ff3dda Mon Sep 17 00:00:00 2001 From: Nay Date: Sat, 24 Aug 2013 14:29:46 +0100 Subject: Core/Settings: Fix a crash if worldserver.conf DataDir setting is empty --- src/server/game/World/World.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index 410fbee9931..d367a659dda 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -1105,7 +1105,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.back() != '/' && dataPath.back() != '\\')) dataPath.push_back('/'); #if PLATFORM == PLATFORM_UNIX || PLATFORM == PLATFORM_APPLE -- cgit v1.2.3 From 58e6503eef9245c937004a362ab767444e9f046d Mon Sep 17 00:00:00 2001 From: Nay Date: Sat, 24 Aug 2013 15:45:00 +0100 Subject: Core/Settings: Fix build in non cpp11 compilers std::string back() was only introduced in C++11, a pity.. --- src/server/game/World/World.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index d367a659dda..52ac2d28a41 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -1105,7 +1105,7 @@ void World::LoadConfigSettings(bool reload) ///- Read the "Data" directory from the config file std::string dataPath = sConfigMgr->GetStringDefault("DataDir", "./"); - if (dataPath.empty() || (dataPath.back() != '/' && dataPath.back() != '\\')) + if (dataPath.empty() || (dataPath.at(dataPath.length()-1) != '/' && dataPath.at(dataPath.length()-1) != '\\')) dataPath.push_back('/'); #if PLATFORM == PLATFORM_UNIX || PLATFORM == PLATFORM_APPLE -- cgit v1.2.3 From 21459739c63828ae7b5a74e87cbf44703d51ce8d Mon Sep 17 00:00:00 2001 From: jackpoz Date: Sat, 24 Aug 2013 17:49:14 +0200 Subject: Fix uninitialized UpdateMask field Initialized UpdateMask::_bits to NULL in all constructors. UpdateMask(UpdateMask const& right) constructor sets the field count with SetCount() method before any field initialization. This means that SetCount() will call delete[] on the uninitialized _bits pointer field, leading to undefined behavior. --- src/server/game/Entities/Object/Updates/UpdateMask.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') 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); -- cgit v1.2.3 From 12973de799dde8f89b9049964e26ab63a960520a Mon Sep 17 00:00:00 2001 From: Nay Date: Sat, 24 Aug 2013 22:56:29 +0100 Subject: Core&Tools: Fix multiple issues found by a static code coverage tool --- src/server/collision/Maps/TileAssembler.cpp | 11 +++++++- src/server/game/Chat/Chat.cpp | 13 ++++----- src/server/game/Entities/Player/Player.cpp | 6 ++-- src/server/game/Spells/Auras/SpellAuras.cpp | 1 + src/server/game/Spells/Spell.cpp | 1 + src/server/game/Spells/SpellMgr.cpp | 13 +++++---- .../BlackwingLair/boss_razorgore.cpp | 2 +- .../SunwellPlateau/boss_eredar_twins.cpp | 1 + .../EasternKingdoms/zone_redridge_mountains.cpp | 2 ++ .../EasternKingdoms/zone_western_plaguelands.cpp | 3 +- .../Northrend/VioletHold/instance_violet_hold.cpp | 1 + .../scripts/Northrend/zone_borean_tundra.cpp | 5 ++-- src/server/scripts/Spells/spell_shaman.cpp | 6 ++-- src/server/shared/Database/QueryResult.cpp | 3 ++ src/server/shared/Utilities/Util.h | 2 +- src/tools/map_extractor/mpq_libmpq04.h | 1 + src/tools/mmaps_generator/MapBuilder.cpp | 32 ++++++++++++++++++++-- src/tools/mmaps_generator/PathCommon.h | 1 - src/tools/vmap4_assembler/VMapAssembler.cpp | 5 ++-- src/tools/vmap4_extractor/gameobject_extract.cpp | 8 +++++- src/tools/vmap4_extractor/vmapexport.cpp | 8 +++--- src/tools/vmap4_extractor/wmo.cpp | 14 ++++------ src/tools/vmap4_extractor/wmo.h | 1 - 23 files changed, 93 insertions(+), 47 deletions(-) (limited to 'src') diff --git a/src/server/collision/Maps/TileAssembler.cpp b/src/server/collision/Maps/TileAssembler.cpp index 4b61e5da40b..c0797b0fdcc 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::getBounds); + + try + { + pTree.build(mapSpawns, BoundsTrait::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 modelNodeIdx; diff --git a/src/server/game/Chat/Chat.cpp b/src/server/game/Chat/Chat.cpp index 0b18a04c5ca..f61380b6834 100644 --- a/src/server/game/Chat/Chat.cpp +++ b/src/server/game/Chat/Chat.cpp @@ -696,13 +696,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/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 2ff86f81880..8f3379ee254 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -6878,10 +6878,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/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp index 149f422554a..d7b8003f19a 100644 --- a/src/server/game/Spells/Auras/SpellAuras.cpp +++ b/src/server/game/Spells/Auras/SpellAuras.cpp @@ -2411,6 +2411,7 @@ void UnitAura::FillTargetMap(std::map & 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 539b38bdac4..b502717178e 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -6129,6 +6129,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 ebf7121eb54..e42d0f40998 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -1236,7 +1236,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]; @@ -2782,6 +2782,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) @@ -3769,10 +3772,10 @@ void SpellMgr::LoadSpellInfoCorrections() } } - SummonPropertiesEntry* properties = const_cast(sSummonPropertiesStore.LookupEntry(121)); - properties->Type = SUMMON_TYPE_TOTEM; - properties = const_cast(sSummonPropertiesStore.LookupEntry(647)); // 52893 - properties->Type = SUMMON_TYPE_TOTEM; + if (SummonPropertiesEntry* properties = const_cast(sSummonPropertiesStore.LookupEntry(121))) + properties->Type = SUMMON_TYPE_TOTEM; + if (SummonPropertiesEntry* properties = const_cast(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/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_redridge_mountains.cpp b/src/server/scripts/EasternKingdoms/zone_redridge_mountains.cpp index 20a47325a9c..6609f8a9d46 100644 --- a/src/server/scripts/EasternKingdoms/zone_redridge_mountains.cpp +++ b/src/server/scripts/EasternKingdoms/zone_redridge_mountains.cpp @@ -139,10 +139,12 @@ public: Talk(SAY_CORPORAL_4); uiTimer = 2500; uiPhase = 5; + break; case 5: Talk(SAY_CORPORAL_5); uiTimer = 0; uiPhase = 0; + break; } } else uiTimer -= uiDiff; } 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/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/Spells/spell_shaman.cpp b/src/server/scripts/Spells/spell_shaman.cpp index 3a02a8b8c09..eb717315179 100644 --- a/src/server/scripts/Spells/spell_shaman.cpp +++ b/src/server/scripts/Spells/spell_shaman.cpp @@ -521,9 +521,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; uint8 rank = aurEff->GetSpellInfo()->GetRank(); caster->CastSpell(caster, sSpellMgr->GetSpellWithRank(SPELL_SHAMAN_LAVA_FLOWS_TRIGGERED_R1, rank), true); 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/Utilities/Util.h b/src/server/shared/Utilities/Util.h index a379bfd32fc..a5b2a7b9cc2 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/map_extractor/mpq_libmpq04.h b/src/tools/map_extractor/mpq_libmpq04.h index 9f0163067c4..4691693d80d 100644 --- a/src/tools/map_extractor/mpq_libmpq04.h +++ b/src/tools/map_extractor/mpq_libmpq04.h @@ -18,6 +18,7 @@ public: mpq_archive_s *mpq_a; MPQArchive(const char* filename); + ~MPQArchive() { close(); } void close(); void GetFileListTo(vector& filelist) { 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/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 [config file name]\n", argv[0]); std::cout << "usage: " << argv[0] << " " << 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 8a1f67cd2c2..30cedfe7987 100644 --- a/src/tools/vmap4_extractor/gameobject_extract.cpp +++ b/src/tools/vmap4_extractor/gameobject_extract.cpp @@ -49,7 +49,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 89e4b850dac..82270cfaa50 100644 --- a/src/tools/vmap4_extractor/vmapexport.cpp +++ b/src/tools/vmap4_extractor/vmapexport.cpp @@ -158,16 +158,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 d7bd9ecd2f9..57161cb495a 100644 --- a/src/tools/vmap4_extractor/wmo.cpp +++ b/src/tools/vmap4_extractor/wmo.cpp @@ -136,14 +136,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)); @@ -439,7 +437,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; @@ -453,8 +451,6 @@ int WMOGroup::ConvertToVMAPGroupWmo(FILE *output, WMORoot *rootWMO, bool precise case 3: liquidEntry = 20; break; - default: - break; } } @@ -488,7 +484,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 d0333265851..fe6cef03655 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); -- cgit v1.2.3 From e96aa444b07eb6d9b96b37bcef7742ad96225fb4 Mon Sep 17 00:00:00 2001 From: jackpoz Date: Sun, 25 Aug 2013 13:48:55 +0100 Subject: Core/Threading: Fix race condition in Thread Increment the reference count of m_task in Thread::start() before spawning the actual Thread that will execute the task, otherwise the thread might finish, decRef the task and delete it. Valgrind log of the issue: Invalid read of size 8 at 0x1314CAD: ACE_Atomic_Op_GCC::operator++() (Atomic_Op_GCC_T.inl:34) by 0x15933FB: ACE_Based::Runnable::incReference() (Threading.h:36) by 0x1592D2D: ACE_Based::Thread::start() (Threading.cpp:136) by 0x1592C37: ACE_Based::Thread::Thread(ACE_Based::Runnable*) (Threading.cpp:111) by 0xF6C463: Master::Run() (Master.cpp:195) by 0xF725D0: main (Main.cpp:142) Address 0x26137278 is 8 bytes inside a block of size 24 free'd at 0x4C2B59C: operator delete(void*) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) by 0xF67FDB: RARunnable::~RARunnable() (RARunnable.cpp:55) by 0x1593441: ACE_Based::Runnable::decReference() (Threading.h:40) by 0x1592E92: ACE_Based::Thread::ThreadTask(void*) (Threading.cpp:186) by 0x515EA35: ACE_OS_Thread_Adapter::invoke() (in /usr/lib/libACE-6.0.3.so) by 0x5F19F8D: start_thread (pthread_create.c:311) by 0x6A46E1C: clone (clone.S:113) Closes #10619 --- src/server/shared/Threading/Threading.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) (limited to 'src') 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; } -- cgit v1.2.3 From ba22baebbd1394cc69366d7a19d879da43885430 Mon Sep 17 00:00:00 2001 From: raczman Date: Sun, 25 Aug 2013 14:02:40 +0100 Subject: Core/Auth: Implement time-based token for user login as described in RFC 6238. New column in account table is a base32 of token key bytes, coincidentally it is the same format Google's Authenticator Android app uses. If you want that to work, set system time on server correctly and use ntpd. Closes #10527 Signed-off-by: Nay --- sql/base/auth_database.sql | 1 + sql/updates/auth/2013_08_25_00_auth.sql | 1 + src/server/authserver/Authentication/TOTP.cpp | 94 ++++++++++++++++++++++ src/server/authserver/Authentication/TOTP.h | 29 +++++++ src/server/authserver/Server/AuthSocket.cpp | 26 ++++++ src/server/authserver/Server/AuthSocket.h | 1 + src/server/collision/Maps/TileAssembler.cpp | 2 +- src/server/shared/Cryptography/HMACSHA1.cpp | 5 ++ src/server/shared/Cryptography/HMACSHA1.h | 1 + .../Database/Implementation/LoginDatabase.cpp | 2 +- 10 files changed, 160 insertions(+), 2 deletions(-) create mode 100644 sql/updates/auth/2013_08_25_00_auth.sql create mode 100644 src/server/authserver/Authentication/TOTP.cpp create mode 100644 src/server/authserver/Authentication/TOTP.h (limited to 'src') diff --git a/sql/base/auth_database.sql b/sql/base/auth_database.sql index 1f247a6b8ef..77f997a1718 100644 --- a/sql/base/auth_database.sql +++ b/sql/base/auth_database.sql @@ -29,6 +29,7 @@ CREATE TABLE `account` ( `sessionkey` varchar(80) NOT NULL DEFAULT '', `v` varchar(64) NOT NULL DEFAULT '', `s` varchar(64) NOT NULL DEFAULT '', + `token_key` varchar(100) NOT NULL DEFAULT '', `email` varchar(254) NOT NULL DEFAULT '', `joindate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `last_ip` varchar(15) NOT NULL DEFAULT '127.0.0.1', diff --git a/sql/updates/auth/2013_08_25_00_auth.sql b/sql/updates/auth/2013_08_25_00_auth.sql new file mode 100644 index 00000000000..d1abc9eb958 --- /dev/null +++ b/sql/updates/auth/2013_08_25_00_auth.sql @@ -0,0 +1 @@ +ALTER TABLE `account` ADD COLUMN `token_key` varchar(100) NOT NULL DEFAULT '' AFTER `s`; 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 + * + * 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 . + */ + +#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 + * + * 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 . + */ + +#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 c0797b0fdcc..ddaa8cb9c67 100644 --- a/src/server/collision/Maps/TileAssembler.cpp +++ b/src/server/collision/Maps/TileAssembler.cpp @@ -105,7 +105,7 @@ namespace VMAP } catch (std::exception& e) { - printf("Exception ""%s"" when calling pTree.build", e.what()); + printf("Exception ""%s"" when calling pTree.build", e.what()); return false; } 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); -- cgit v1.2.3 From ee3d3ab1ff5589036c41c236e4fc376f11854467 Mon Sep 17 00:00:00 2001 From: jackpoz Date: Sun, 25 Aug 2013 14:04:17 +0100 Subject: Core/Player: Fix uninitialized Player field. m_MonthlyQuestChanged was initialized only when loading a Player from DB and left uninitialized when creating a new Player. Valgrind log: Conditional jump or move depends on uninitialised value(s) at 0x1148E2A: Player::_SaveMonthlyQuestStatus(Trinity::AutoPtr&) (Player.cpp:19694) by 0x1146510: Player::SaveToDB(bool) (Player.cpp:19191) by 0x14F5D5C: WorldSession::HandleCharCreateCallback(Trinity::AutoPtr, CharacterCreateInfo*) (CharacterHandler.cpp:660) Closes #10620 Signed-off-by: Nay --- src/server/game/Entities/Player/Player.cpp | 2 ++ 1 file changed, 2 insertions(+) (limited to 'src') diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 8f3379ee254..d570ecb1117 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -864,6 +864,8 @@ Player::Player(WorldSession* session): Unit(true) m_WeeklyQuestChanged = false; + m_MonthlyQuestChanged = false; + m_SeasonalQuestChanged = false; SetPendingBind(0, 0); -- cgit v1.2.3