/* * This file is part of the AzerothCore Project. See AUTHORS file for Copyright information * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Affero General Public License as published by the * Free Software Foundation; either version 3 of the License, or (at your * option) any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero 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 "IndividualProgression.h" #include "ScriptMgr.h" #include "ScriptedCreature.h" #include "SpellInfo.h" #include "onyxias_lair.h" ObjectData const creatureData[] = { { NPC_ONYXIA, DATA_ONYXIA }, { NPC_ONYXIA_40, DATA_ONYXIA }, { 0, 0 } // END }; class instance_onyxias_lair_40 : public InstanceMapScript { public: instance_onyxias_lair_40() : InstanceMapScript("instance_onyxias_lair", 249) {} InstanceScript* GetInstanceScript(InstanceMap* pMap) const override { return new instance_onyxias_lair_InstanceMapScript(pMap); } struct instance_onyxias_lair_InstanceMapScript : public InstanceScript { instance_onyxias_lair_InstanceMapScript(Map* pMap) : InstanceScript(pMap) {Initialize();}; std::string str_data; uint16 ManyWhelpsCounter; bool bDeepBreath; void Initialize() override { SetBossNumber(MAX_ENCOUNTER); ManyWhelpsCounter = 0; bDeepBreath = true; LoadObjectData(creatureData, nullptr); } void OnGameObjectCreate(GameObject* go) override { switch (go->GetEntry()) { case GO_WHELP_SPAWNER: if (instance->GetDifficulty() == RAID_DIFFICULTY_10MAN_HEROIC) { go->CastSpell((Unit*)nullptr, 91003); } else { go->CastSpell((Unit*)nullptr, 17646); } if (Creature* onyxia = GetCreature(DATA_ONYXIA)) { onyxia->AI()->DoAction(-1); } break; } } bool SetBossState(uint32 type, EncounterState state) override { if (!InstanceScript::SetBossState(type, state)) { return false; } if (type == DATA_ONYXIA && state == NOT_STARTED) { ManyWhelpsCounter = 0; bDeepBreath = true; } else if (type == DATA_ONYXIA && state == DONE) { DoUpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST, 7495, 1); } return true; } void SetData(uint32 uiType, uint32 /*uiData*/) override { switch (uiType) { case DATA_WHELP_SUMMONED: ++ManyWhelpsCounter; break; case DATA_DEEP_BREATH_FAILED: bDeepBreath = false; break; } } bool CheckAchievementCriteriaMeet(uint32 criteria_id, Player const* /*source*/, Unit const* /*target*/, uint32 /*miscvalue1*/) override { if (instance->GetDifficulty() == RAID_DIFFICULTY_10MAN_HEROIC) { return false; // No achievements in Onyxia 40man } switch(criteria_id) { case ACHIEV_CRITERIA_MANY_WHELPS_10_PLAYER: case ACHIEV_CRITERIA_MANY_WHELPS_25_PLAYER: return ManyWhelpsCounter >= 50; case ACHIEV_CRITERIA_DEEP_BREATH_10_PLAYER: case ACHIEV_CRITERIA_DEEP_BREATH_25_PLAYER: return bDeepBreath; } return false; } }; }; class onyxia_entrance_trigger : public AreaTriggerScript { public: onyxia_entrance_trigger() : AreaTriggerScript("onyxia_entrance_trigger") { } bool isExcludedFromProgression(Player* player) { if(!sIndividualProgression->excludeAccounts) { return false; } std::string accountName; bool accountNameFound = AccountMgr::GetName(player->GetSession()->GetAccountId(), accountName); std::regex excludedAccountsRegex (sIndividualProgression->excludedAccountsRegex); return (accountNameFound && std::regex_match(accountName, excludedAccountsRegex)); } bool OnTrigger(Player* player, AreaTrigger const* /*areaTrigger*/) override { ChatHandler handler(player->GetSession()); uint32 progressionLevel = player->GetPlayerSetting("mod-individual-progression", SETTING_PROGRESSION_STATE).value; if (player->GetLevel() <= IP_LEVEL_TBC && progressionLevel < PROGRESSION_TBC_TIER_5 && (player->HasItemCount(ITEM_DRAKEFIRE_AMULET) || isExcludedFromProgression(player))) { player->SetRaidDifficulty(RAID_DIFFICULTY_10MAN_HEROIC); player->TeleportTo(249, 29.1607f, -71.3372f, -8.18032f, 4.58f); } else if (player->GetLevel() == IP_LEVEL_WOTLK && (player->HasItemCount(ITEM_DRAKEFIRE_AMULET) || isExcludedFromProgression(player))) { player->TeleportTo(249, 29.1607f, -71.3372f, -8.18032f, 4.58f); } else if (player->GetLevel() > IP_LEVEL_TBC && player->GetLevel() < IP_LEVEL_WOTLK) { handler.PSendSysMessage("Your level is too high to enter this version of Onyxia\'s Lair."); } else if (!player->HasItemCount(ITEM_DRAKEFIRE_AMULET)) { handler.PSendSysMessage("You must have the Drakefire Amulet in your inventory to enter Onyxia\'s Lair."); } else if (player->GetLevel() <= IP_LEVEL_TBC && progressionLevel > PROGRESSION_TBC_TIER_4) { handler.PSendSysMessage("Your progression level is too high to enter this version of Onyxia\'s Lair."); } return true; } }; class global_onyxia_tuning_script : public GlobalScript { public: global_onyxia_tuning_script() : GlobalScript("global_onyxia_tuning_script") { } void OnLoadSpellCustomAttr(SpellInfo* spellInfo) override { // TODO: This is currently overriding 10 man spells switch (spellInfo->Id) { case 18435: // Flame Breath spellInfo->Effects[EFFECT_0].DieSides = 875; spellInfo->Effects[EFFECT_0].BasePoints = 3062; break; case 18500: // Wing Buffet spellInfo->Effects[EFFECT_1].DieSides = 375; spellInfo->Effects[EFFECT_1].BasePoints = 562; break; case 18392: // Fireball spellInfo->Effects[EFFECT_0].DieSides = 601; spellInfo->Effects[EFFECT_0].BasePoints = 1699; break; case 17731: // Eruption spellInfo->Effects[EFFECT_0].DieSides = 375; spellInfo->Effects[EFFECT_0].BasePoints = 656; break; case 17086: // Breath case 17087: case 17088: case 17089: case 17090: case 17091: case 17092: case 17093: case 17094: case 17095: case 17097: case 18351: case 18352: case 18353: case 18354: case 18355: case 18356: case 18357: case 18358: case 18359: case 18360: case 18361: case 18564: case 18565: case 18566: case 18567: case 18568: case 18569: case 18570: case 18571: case 18572: case 18573: case 18574: case 18575: case 18576: case 18578: case 18579: case 18580: case 18581: case 18582: case 18583: case 18584: case 18585: case 18586: case 18587: case 18588: case 18589: case 18590: case 18591: case 18592: case 18593: case 18594: case 18595: case 18596: case 18597: case 18598: case 18599: case 18600: case 18601: case 18602: case 18603: case 18604: case 18605: case 18606: case 18607: case 18617: case 18618: case 18619: case 18620: case 18621: case 18622: case 18623: case 18624: case 18625: case 18626: case 18627: case 18628: case 18609: case 18611: case 18612: case 18613: case 18614: case 18615: case 18616: case 22267: case 22268: spellInfo->Effects[EFFECT_0].DieSides = 451; //spellInfo->Effects[EFFECT_0].BasePoints = 1274; break; // Onyxian Warder case 18958: spellInfo->Effects[EFFECT_0].DieSides = 9; spellInfo->Effects[EFFECT_1].DieSides = 1; spellInfo->Effects[EFFECT_0].RealPointsPerLevel = 1.4f; spellInfo->Effects[EFFECT_1].RealPointsPerLevel = -1.2f; spellInfo->Effects[EFFECT_0].BasePoints = 55; spellInfo->Effects[EFFECT_1].BasePoints = -21; break; case 20203: spellInfo->Effects[EFFECT_0].DieSides = 133; spellInfo->Effects[EFFECT_0].BasePoints = 463; break; case 20228: spellInfo->Effects[EFFECT_0].DieSides = 225; spellInfo->Effects[EFFECT_0].BasePoints = 1387; break; case 91003: spellInfo->Targets |= TARGET_FLAG_DEST_LOCATION; spellInfo->Effects[EFFECT_0].TargetA = SpellImplicitTargetInfo(TARGET_DEST_DEST); spellInfo->RangeEntry = sSpellRangeStore.LookupEntry(13); // 50000yd spellInfo->DurationEntry = sSpellDurationStore.LookupEntry(5); break; } } }; void AddSC_instance_onyxias_lair_40() { new instance_onyxias_lair_40(); new global_onyxia_tuning_script(); new onyxia_entrance_trigger(); }