diff --git a/src/server/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp index 335df3d6d..ba03535ba 100644 --- a/src/server/game/Groups/Group.cpp +++ b/src/server/game/Groups/Group.cpp @@ -557,10 +557,6 @@ bool Group::RemoveMember(ObjectGuid guid, const RemoveMethod& method /*= GROUP_R CharacterDatabase.Execute(stmt); } - // Reevaluate group enchanter if the leaving player had enchanting skill or the player is offline - if (!player || player->GetSkillValue(SKILL_ENCHANTING)) - ResetMaxEnchantingLevel(); - // Remove player from loot rolls for (Rolls::iterator it = RollId.begin(); it != RollId.end();) { @@ -602,6 +598,12 @@ bool Group::RemoveMember(ObjectGuid guid, const RemoveMethod& method /*= GROUP_R sWorld->UpdateGlobalPlayerGroup(guid.GetCounter(), 0); } + // Reevaluate group enchanter if the leaving player had enchanting skill or the player is offline + if (!player || player->GetSkillValue(SKILL_ENCHANTING)) + { + ResetMaxEnchantingLevel(); + } + // Pick new leader if necessary bool validLeader = true; if (m_leaderGuid == guid) @@ -2057,8 +2059,11 @@ void Group::ResetMaxEnchantingLevel() for (member_citerator citr = m_memberSlots.begin(); citr != m_memberSlots.end(); ++citr) { pMember = ObjectAccessor::FindPlayer(citr->guid); - if (pMember && m_maxEnchantingLevel < pMember->GetSkillValue(SKILL_ENCHANTING)) + if (pMember && pMember->GetSession() && !pMember->GetSession()->IsSocketClosed() + && m_maxEnchantingLevel < pMember->GetSkillValue(SKILL_ENCHANTING)) + { m_maxEnchantingLevel = pMember->GetSkillValue(SKILL_ENCHANTING); + } } } diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp index 2b9460005..3e715fc0f 100644 --- a/src/server/game/Server/WorldSession.cpp +++ b/src/server/game/Server/WorldSession.cpp @@ -450,6 +450,10 @@ bool WorldSession::HandleSocketClosed() return false; } +bool WorldSession::IsSocketClosed() const { + return !m_Socket || m_Socket->IsClosed(); +} + void WorldSession::HandleTeleportTimeout(bool updateInSessions) { // pussywizard: handle teleport ack timeout diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 45da8c8e3..3b2eee0ec 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -926,6 +926,7 @@ public: // opcodes handlers void SetKicked(bool val) { _kicked = val; } void SetShouldSetOfflineInDB(bool val) { _shouldSetOfflineInDB = val; } bool GetShouldSetOfflineInDB() const { return _shouldSetOfflineInDB; } + bool IsSocketClosed() const; /*** CALLBACKS