diff options
Diffstat (limited to 'src/server')
| -rw-r--r-- | src/server/game/DungeonFinding/LFGMgr.cpp | 11 | ||||
| -rw-r--r-- | src/server/game/DungeonFinding/LFGMgr.h | 2 | ||||
| -rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 28 | ||||
| -rw-r--r-- | src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp | 20 | ||||
| -rw-r--r-- | src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp | 7 | ||||
| -rw-r--r-- | src/server/scripts/Northrend/Naxxramas/naxxramas.h | 12 |
6 files changed, 48 insertions, 32 deletions
diff --git a/src/server/game/DungeonFinding/LFGMgr.cpp b/src/server/game/DungeonFinding/LFGMgr.cpp index b88d04c65e..b48138a8ba 100644 --- a/src/server/game/DungeonFinding/LFGMgr.cpp +++ b/src/server/game/DungeonFinding/LFGMgr.cpp @@ -688,7 +688,7 @@ namespace lfg // xinef: dont check compatibile dungeons for already running group (bind problems) if (!isContinue) { - GetCompatibleDungeons(dungeons, players, joinData.lockmap); + GetCompatibleDungeons(dungeons, players, joinData.lockmap, rDungeonId); if (dungeons.empty()) joinData.result = grp ? LFG_JOIN_PARTY_NOT_MEET_REQS : LFG_JOIN_NOT_MEET_REQS; } @@ -1485,7 +1485,7 @@ namespace lfg @param[in] players Set of players to check their dungeon restrictions @param[out] lockMap Map of players Lock status info of given dungeons (Empty if dungeons is not empty) */ - void LFGMgr::GetCompatibleDungeons(LfgDungeonSet& dungeons, LfgGuidSet const& players, LfgLockPartyMap& lockMap) + void LFGMgr::GetCompatibleDungeons(LfgDungeonSet& dungeons, LfgGuidSet const& players, LfgLockPartyMap& lockMap, bool isRDF) { lockMap.clear(); for (LfgGuidSet::const_iterator it = players.begin(); it != players.end() && !dungeons.empty(); ++it) @@ -1496,6 +1496,9 @@ namespace lfg { uint32 dungeonId = (it2->first & 0x00FFFFFF); // Compare dungeon ids + if (it2->second == LFG_LOCKSTATUS_RAID_LOCKED && isRDF) + continue; + LfgDungeonSet::iterator itDungeon = dungeons.find(dungeonId); if (itDungeon != dungeons.end()) { @@ -1762,10 +1765,8 @@ namespace lfg else { // RDF removes all binds to that map - if (randomDungeon && !sInstanceSaveMgr->PlayerIsPermBoundToInstance(player->GetGUID(), dungeon->map, player->GetDungeonDifficulty())) - { + if (randomDungeon) sInstanceSaveMgr->PlayerUnbindInstance(player->GetGUID(), dungeon->map, player->GetDungeonDifficulty(), true); - } } playersTeleported.push_back(player); diff --git a/src/server/game/DungeonFinding/LFGMgr.h b/src/server/game/DungeonFinding/LFGMgr.h index 426f0c679a..e52bbda7dd 100644 --- a/src/server/game/DungeonFinding/LFGMgr.h +++ b/src/server/game/DungeonFinding/LFGMgr.h @@ -589,7 +589,7 @@ namespace lfg void DecreaseKicksLeft(ObjectGuid guid); void SetState(ObjectGuid guid, LfgState state); void SetCanOverrideRBState(ObjectGuid guid, bool val); - void GetCompatibleDungeons(LfgDungeonSet& dungeons, LfgGuidSet const& players, LfgLockPartyMap& lockMap); + void GetCompatibleDungeons(LfgDungeonSet& dungeons, LfgGuidSet const& players, LfgLockPartyMap& lockMap, bool isRDF = false); void _SaveToDB(ObjectGuid guid); LFGDungeonData const* GetLFGDungeon(uint32 id); diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 5bcd49fcf3..571817a42b 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -7158,18 +7158,34 @@ void Player::ApplyItemDependentAuras(Item* item, bool apply) { if (apply) { - PlayerSpellMap const& spells = GetSpellMap(); - for (auto itr = spells.begin(); itr != spells.end(); ++itr) + for (auto [spellId, playerSpell]: GetSpellMap()) { - if (itr->second->State == PLAYERSPELL_REMOVED) + if (playerSpell->State == PLAYERSPELL_REMOVED) + continue; + + SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId); + if (!spellInfo || !spellInfo->IsPassive() || spellInfo->EquippedItemClass < 0) + continue; + + if (!HasAura(spellId) && HasItemFitToSpellRequirements(spellInfo)) + AddAura(spellId, this); // no SMSG_SPELL_GO in sniff found + } + + // Check talents (they are stored separately from regular spells) + for (auto [spellId, playerTalent] : GetTalentMap()) + { + if (playerTalent->State == PLAYERSPELL_REMOVED) + continue; + + if (!(playerTalent->IsInSpec(GetActiveSpec()))) continue; - SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(itr->first); + SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId); if (!spellInfo || !spellInfo->IsPassive() || spellInfo->EquippedItemClass < 0) continue; - if (!HasAura(itr->first) && HasItemFitToSpellRequirements(spellInfo)) - AddAura(itr->first, this); // no SMSG_SPELL_GO in sniff found + if (!HasAura(spellId) && HasItemFitToSpellRequirements(spellInfo)) + AddAura(spellId, this); } } else diff --git a/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp b/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp index efe7c6956f..200a3962c7 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp @@ -683,22 +683,18 @@ public: }; }; -class at_thaddius_entrance : public AreaTriggerScript +class at_thaddius_entrance : public OnlyOnceAreaTriggerScript { public: - at_thaddius_entrance() : AreaTriggerScript("at_thaddius_entrance") { } + at_thaddius_entrance() : OnlyOnceAreaTriggerScript("at_thaddius_entrance") { } - bool OnTrigger(Player* player, AreaTrigger const* /*areaTrigger*/) override + bool _OnTrigger(Player* player, const AreaTrigger* /*trigger*/) override { - InstanceScript* instance = player->GetInstanceScript(); - if (!instance || instance->GetData(DATA_THADDIUS_INTRO) || instance->GetBossState(BOSS_THADDIUS) == DONE) - return true; - - if (Creature* thaddius = instance->GetCreature(DATA_THADDIUS_BOSS)) - thaddius->AI()->Talk(SAY_GREET); - - instance->SetData(DATA_THADDIUS_INTRO, 1); - return true; + if (InstanceScript* instance = player->GetInstanceScript()) + if (instance->GetBossState(BOSS_THADDIUS) != DONE) + if (Creature* thaddius = instance->GetCreature(DATA_THADDIUS_BOSS)) + thaddius->AI()->Talk(SAY_GREET); + return false; } }; diff --git a/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp b/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp index 77af6636bd..1530cab2e2 100644 --- a/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp +++ b/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp @@ -547,12 +547,17 @@ public: } case DONE: { + if (!horsemanKilled) // if no horsemen are found, assume wing is cleared + { + ActivateWingPortal(DATA_HORSEMAN_PORTAL); + break; + } + _events.RescheduleEvent(EVENT_AND_THEY_WOULD_ALL_GO_DOWN_TOGETHER, 15s); if (horsemanKilled != HorsemanCount) return false; - // all horsemans are killed if (Creature* cr = GetCreature(DATA_BARON_RIVENDARE_BOSS)) cr->CastSpell(cr, SPELL_THE_FOUR_HORSEMAN_CREDIT, true); diff --git a/src/server/scripts/Northrend/Naxxramas/naxxramas.h b/src/server/scripts/Northrend/Naxxramas/naxxramas.h index 6f47c4fa1c..4b790f1cca 100644 --- a/src/server/scripts/Northrend/Naxxramas/naxxramas.h +++ b/src/server/scripts/Northrend/Naxxramas/naxxramas.h @@ -75,17 +75,15 @@ enum NaxxramasData DATA_DANCE_FAIL = 301, DATA_SPORE_KILLED = 302, DATA_FRENZY_REMOVED = 303, - DATA_THADDIUS_INTRO = 304, - DATA_CHARGES_CROSSED = 305, - DATA_HUNDRED_CLUB = 306, - DATA_ABOMINATION_KILLED = 307, + DATA_CHARGES_CROSSED = 304, + DATA_HUNDRED_CLUB = 305, + DATA_ABOMINATION_KILLED = 306, }; enum NaxxramasPersistentData { - PERSISTENT_DATA_THADDIUS_INTRO = 0, - PERSISTENT_DATA_KELTHUZAD_DIALOG = 1, - PERSISTENT_DATA_IMMORTAL_FAIL = 2, + PERSISTENT_DATA_KELTHUZAD_DIALOG = 0, + PERSISTENT_DATA_IMMORTAL_FAIL = 1, PERSISTENT_DATA_COUNT }; |
