Skip to content

Commit

Permalink
Port several TBC raid progression improvements from mod_progression
Browse files Browse the repository at this point in the history
  • Loading branch information
ZhengPeiRu21 committed Mar 26, 2024
1 parent 19727d9 commit e814c79
Show file tree
Hide file tree
Showing 6 changed files with 243 additions and 0 deletions.
19 changes: 19 additions & 0 deletions conf/individualProgression.conf.dist
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
12 changes: 12 additions & 0 deletions sql/world/base/dungeon_ssc.sql
Original file line number Diff line number Diff line change
@@ -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)');
3 changes: 3 additions & 0 deletions sql/world/base/tbc_badges.sql
Original file line number Diff line number Diff line change
@@ -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
Expand Down
4 changes: 4 additions & 0 deletions src/IndividualProgression_loader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down Expand Up @@ -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();
}
108 changes: 108 additions & 0 deletions src/tbcScripts/serpentshrine_cavern.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@

/*
* Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, 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<int>("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<int>("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();
}
97 changes: 97 additions & 0 deletions src/tbcScripts/the_eye.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@

/*
* Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, 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<int>("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<int>("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();
}

0 comments on commit e814c79

Please sign in to comment.