diff --git a/conf/individualProgression.conf.dist b/conf/individualProgression.conf.dist index c49c742..2de8a34 100644 --- a/conf/individualProgression.conf.dist +++ b/conf/individualProgression.conf.dist @@ -164,6 +164,25 @@ IndividualProgression.MoltenCore.ManualRuneHandling = 1 IndividualProgression.MoltenCore.AqualEssenceCooldownReduction = 0 # +# IndividualProgression.SerpentshrineCavern.RequireAllBosses +# Description: Requires all bosses being killed before accessing Vashj's console panel. +# Default: 1 - Enabled +# 0 - Disabled +# +# + +IndividualProgression.SerpentshrineCavern.RequireAllBosses = 1 + +# +# IndividualProgression.TheEye.RequireAllBosses +# Description: Requires all bosses being killed to open the doors to Kael +# Default: 1 - Enabled +# 0 - Disabled +# +# + +IndividualProgression.TheEye.RequireAllBosses = 1 +# # IndividualProgression.FishingFix # Description: Before patch 3.1, fishing skill had progression and had to be leveled in low level zones before high level areas could add skill # In patch 3.1, it was changed to allow leveling fishing even when catching junk in high level zones, allowing progression to be skipped diff --git a/sql/world/base/dungeon_ssc.sql b/sql/world/base/dungeon_ssc.sql new file mode 100644 index 0000000..15af7e3 --- /dev/null +++ b/sql/world/base/dungeon_ssc.sql @@ -0,0 +1,12 @@ +/* SSC Bosses should only drop 2 pieces of loot - was changed to 3 pieces after WotLK release */ +DELETE FROM `creature_loot_template` WHERE (`Entry` = 21215) AND (`Item` IN (34059)); +INSERT INTO `creature_loot_template` (`Entry`, `Item`, `Reference`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES + (21215, 34059, 34059, 100, 0, 1, 0, 1, 2, 'Leotheras the Blind - (ReferenceTable)'); + +DELETE FROM `creature_loot_template` WHERE (`Entry` = 21214) AND (`Item` IN (34060)); +INSERT INTO `creature_loot_template` (`Entry`, `Item`, `Reference`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES + (21214, 34060, 34060, 100, 0, 1, 0, 1, 2, 'Fathom-Lord Karathress - (ReferenceTable)'); + +DELETE FROM `creature_loot_template` WHERE (`Entry` = 21212) AND (`Item` IN (34062)); +INSERT INTO `creature_loot_template` (`Entry`, `Item`, `Reference`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES + (21212, 34062, 34062, 100, 0, 1, 3, 1, 2, 'Lady Vashj - (ReferenceTable)'); \ No newline at end of file diff --git a/sql/world/base/tbc_badges.sql b/sql/world/base/tbc_badges.sql index e418679..b7d56da 100644 --- a/sql/world/base/tbc_badges.sql +++ b/sql/world/base/tbc_badges.sql @@ -1,3 +1,6 @@ +/* Badges of Justice were not added to raids until later patches - remove them from raid drops */ +DELETE FROM `creature_loot_template` WHERE `Entry` IN (17225, 15690, 15688, 15689, 16524, 15691, 17533, 18168, 17521, 16457, 15687, 16152, 21216, 21217, 21215, 21214, 21213, 21212, 19514, 19622, 19516, 18805) AND (`Item` IN (29434)); + /* Create alternate version of TBC Badge Vendor for pre-2.3 */ DELETE FROM `npc_vendor` WHERE `entry` = 30201; INSERT INTO `npc_vendor` (`entry`, `slot`, `item`, `maxcount`, `incrtime`, `ExtendedCost`, `VerifiedBuild`) VALUES diff --git a/src/IndividualProgression_loader.cpp b/src/IndividualProgression_loader.cpp index ea9e85c..744f925 100644 --- a/src/IndividualProgression_loader.cpp +++ b/src/IndividualProgression_loader.cpp @@ -40,6 +40,8 @@ void AddSC_mod_individual_progression_awareness(); void AddSC_mod_individual_progression_player(); void AddSC_npc_archmage_timear(); void AddSC_karazhan_70(); +void AddSC_the_eye_70(); +void AddSC_serpentshrine_cavern_70(); void Addmod_individual_progressionScripts() @@ -81,4 +83,6 @@ void Addmod_individual_progressionScripts() AddSC_mod_individual_progression_player(); AddSC_npc_archmage_timear(); AddSC_karazhan_70(); + AddSC_the_eye_70(); + AddSC_serpentshrine_cavern_70(); } diff --git a/src/tbcScripts/serpentshrine_cavern.cpp b/src/tbcScripts/serpentshrine_cavern.cpp new file mode 100644 index 0000000..5bff2e1 --- /dev/null +++ b/src/tbcScripts/serpentshrine_cavern.cpp @@ -0,0 +1,108 @@ + +/* + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license: https://github.com/azerothcore/azerothcore-wotlk/blob/master/LICENSE-AGPL3 + */ + +#include "Config.h" +#include "Player.h" +#include "ScriptMgr.h" +#include "SpellInfo.h" + +enum SSCMisc +{ + GO_LADY_VASHJ_BRIDGE_CONSOLE = 184568, + MAP_SSC = 548, + DATA_LURKER = 1, + DATA_VASHJ = 6 +}; + +class GlobalSerpentshrineScript : public GlobalScript +{ +public: + GlobalSerpentshrineScript() : GlobalScript("GlobalSerpentshrineScript") { } + + bool IsAnyBossAlive(Map* map, uint32 bossId = 0, uint32 newState = 0) + { + if (InstanceMap* instanceMap = map->ToInstanceMap()) + { + if (InstanceScript* instance = instanceMap->GetInstanceScript()) + { + uint32 bossCount = instance->GetEncounterCount() - 3; + for (uint8 id = 0; id <= bossCount; ++id) + { + if (id == bossId && newState == DONE) + { + continue; + } + + if (id == DATA_LURKER) + { + continue; + } + + if (instance->GetBossState(id) != DONE) + { + return true; + } + } + } + } + + return false; + } + + void AfterInstanceGameObjectCreate(Map* map, GameObject* go) override + { + if (sConfigMgr->GetOption("IndividualProgression.SerpentshrineCavern.RequireAllBosses", 1)) + { + if (go->GetEntry() == GO_LADY_VASHJ_BRIDGE_CONSOLE) + { + if (IsAnyBossAlive(map)) + { + go->SetGameObjectFlag(GO_FLAG_NOT_SELECTABLE); + } + } + } + } + + void OnLoadSpellCustomAttr(SpellInfo* spellInfo) override + { + switch (spellInfo->Id) + { + case 38236: // Caribdis - Spawn Spitfire Totem + spellInfo->Effects[EFFECT_0].BasePoints = 70000; + break; + } + } + + void OnBeforeSetBossState(uint32 bossId, EncounterState newState, EncounterState /*oldState*/, Map* map) override + { + if (sConfigMgr->GetOption("IndividualProgression.SerpentshrineCavern.RequireAllBosses", 1)) + { + if (map->GetEntry()->MapID == MAP_SSC) + { + if (InstanceMap* instanceMap = map->ToInstanceMap()) + { + if (InstanceScript* instance = instanceMap->GetInstanceScript()) + { + if (!IsAnyBossAlive(map, bossId, newState)) + { + if (Creature* vashj = instance->GetCreature(DATA_VASHJ)) + { + if (GameObject* console = vashj->FindNearestGameObject(GO_LADY_VASHJ_BRIDGE_CONSOLE, 600.0f)) + { + console->RemoveGameObjectFlag(GO_FLAG_NOT_SELECTABLE); + } + } + } + } + } + } + } + } +}; + +void AddSC_serpentshrine_cavern_70() +{ + new GlobalSerpentshrineScript(); +} diff --git a/src/tbcScripts/the_eye.cpp b/src/tbcScripts/the_eye.cpp new file mode 100644 index 0000000..cccdfc1 --- /dev/null +++ b/src/tbcScripts/the_eye.cpp @@ -0,0 +1,97 @@ + +/* + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license: https://github.com/azerothcore/azerothcore-wotlk/blob/master/LICENSE-AGPL3 + */ + +#include "Config.h" +#include "Player.h" +#include "ScriptMgr.h" +#include "SpellInfo.h" + +enum SSCMisc +{ + GO_RIGHT_KAEL_DOOR = 184327, + GO_LEFT_KAEL_DOOR = 184329, + MAP_TK = 550, + DATA_KAEL = 3 +}; + +class GlobalTheEyeScript : public GlobalScript +{ +public: + GlobalTheEyeScript() : GlobalScript("GlobalTheEyeScript") { } + + bool IsAnyBossAlive(Map* map, uint32 bossId = 0, uint32 newState = 0) + { + if (InstanceMap* instanceMap = map->ToInstanceMap()) + { + if (InstanceScript* instance = instanceMap->GetInstanceScript()) + { + uint32 bossCount = instance->GetEncounterCount() - 1; + for (uint8 id = 0; id < bossCount; ++id) + { + if (id == bossId && newState == DONE) + { + continue; + } + + if (instance->GetBossState(id) != DONE) + { + return true; + } + } + } + } + + return false; + } + + void AfterInstanceGameObjectCreate(Map* map, GameObject* go) override + { + if (sConfigMgr->GetOption("IndividualProgression.TheEye.RequireAllBosses", 1)) + { + if (go->GetEntry() == GO_RIGHT_KAEL_DOOR || go->GetEntry() == GO_LEFT_KAEL_DOOR) + { + if (IsAnyBossAlive(map)) + { + go->SetGoState(GO_STATE_READY); + } + } + } + } + + void OnBeforeSetBossState(uint32 bossId, EncounterState newState, EncounterState /*oldState*/, Map* map) override + { + if (sConfigMgr->GetOption("IndividualProgression.TheEye.RequireAllBosses", 1)) + { + if (map->GetEntry()->MapID == MAP_TK) + { + if (InstanceMap* instanceMap = map->ToInstanceMap()) + { + if (InstanceScript* instance = instanceMap->GetInstanceScript()) + { + if (!IsAnyBossAlive(map, bossId, newState)) + { + if (Creature* kael = instance->GetCreature(DATA_KAEL)) + { + if (GameObject* rightDoor = kael->FindNearestGameObject(GO_RIGHT_KAEL_DOOR, 600.0f)) + { + if (GameObject* leftDoor = kael->FindNearestGameObject(GO_LEFT_KAEL_DOOR, 600.0f)) + { + rightDoor->SetGoState(GO_STATE_ACTIVE); + leftDoor->SetGoState(GO_STATE_ACTIVE); + } + } + } + } + } + } + } + } + } +}; + +void AddSC_the_eye_70() +{ + new GlobalTheEyeScript(); +}