summaryrefslogtreecommitdiff
path: root/src/server
diff options
context:
space:
mode:
Diffstat (limited to 'src/server')
-rw-r--r--src/server/game/DungeonFinding/LFGMgr.cpp11
-rw-r--r--src/server/game/DungeonFinding/LFGMgr.h2
-rw-r--r--src/server/game/Entities/Player/Player.cpp28
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp20
-rw-r--r--src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp7
-rw-r--r--src/server/scripts/Northrend/Naxxramas/naxxramas.h12
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
};