From 0d5d35777655be0130b248f948470374abf4efa5 Mon Sep 17 00:00:00 2001 From: Revils Date: Fri, 28 May 2010 05:02:42 +0400 Subject: [PATCH] [9992] Fixed MSG_PARTY_ASSIGNMENT processing. Signed-off-by: VladimirMangos --- src/game/Group.cpp | 34 ++++++++++++++++++++++++++-------- src/game/Group.h | 3 +++ src/game/GroupHandler.cpp | 30 +++++++++++++++++++----------- src/shared/revision_nr.h | 2 +- 4 files changed, 49 insertions(+), 20 deletions(-) diff --git a/src/game/Group.cpp b/src/game/Group.cpp index 29d5a345b..7aa97e10b 100644 --- a/src/game/Group.cpp +++ b/src/game/Group.cpp @@ -1298,29 +1298,47 @@ bool Group::_setAssistantFlag(const uint64 &guid, const bool &state) bool Group::_setMainTank(const uint64 &guid) { - member_citerator slot = _getMemberCSlot(guid); - if(slot == m_memberSlots.end()) + if (m_mainTank == guid) return false; - if(m_mainAssistant == guid) - _setMainAssistant(0); + if (guid) + { + member_citerator slot = _getMemberCSlot(guid); + if(slot == m_memberSlots.end()) + return false; + + if(m_mainAssistant == guid) + _setMainAssistant(0); + } + m_mainTank = guid; + if(!isBGGroup()) CharacterDatabase.PExecute("UPDATE groups SET mainTank='%u' WHERE groupId='%u'", GUID_LOPART(m_mainTank), m_Id); + return true; } bool Group::_setMainAssistant(const uint64 &guid) { - member_witerator slot = _getMemberWSlot(guid); - if(slot == m_memberSlots.end()) + if (m_mainAssistant == guid) return false; - if(m_mainTank == guid) - _setMainTank(0); + if (guid) + { + member_witerator slot = _getMemberWSlot(guid); + if(slot == m_memberSlots.end()) + return false; + + if(m_mainTank == guid) + _setMainTank(0); + } + m_mainAssistant = guid; + if(!isBGGroup()) CharacterDatabase.PExecute("UPDATE groups SET mainAssistant='%u' WHERE groupId='%u'", GUID_LOPART(m_mainAssistant), m_Id); + return true; } diff --git a/src/game/Group.h b/src/game/Group.h index 979d03a7a..c9cffe335 100644 --- a/src/game/Group.h +++ b/src/game/Group.h @@ -286,6 +286,9 @@ class MANGOS_DLL_SPEC Group void ChangeMembersGroup(const uint64 &guid, uint8 group); void ChangeMembersGroup(Player *player, uint8 group); + uint64 const& GetMainTank() const { return m_mainTank; } + uint64 const& GetMainAssistant() const { return m_mainAssistant; } + void SetAssistant(uint64 guid, bool state) { if(!isRaidGroup()) diff --git a/src/game/GroupHandler.cpp b/src/game/GroupHandler.cpp index 47fede5c2..d73b2330d 100644 --- a/src/game/GroupHandler.cpp +++ b/src/game/GroupHandler.cpp @@ -555,9 +555,10 @@ void WorldSession::HandleGroupAssistantLeaderOpcode( WorldPacket & recv_data ) void WorldSession::HandlePartyAssignmentOpcode( WorldPacket & recv_data ) { - uint8 flag1, flag2; + uint8 role; + uint8 apply; uint64 guid; - recv_data >> flag1 >> flag2; + recv_data >> role >> apply; // role 0 = Main Tank, 1 = Main Assistant recv_data >> guid; DEBUG_LOG("MSG_PARTY_ASSIGNMENT"); @@ -566,21 +567,28 @@ void WorldSession::HandlePartyAssignmentOpcode( WorldPacket & recv_data ) if(!group) return; - // if(flag1) Main Assist - // 0x4 - // if(flag2) Main Tank - // 0x2 - /** error handling **/ if(!group->IsLeader(GetPlayer()->GetGUID())) return; /********************/ // everything is fine, do it - if(flag1 == 1) - group->SetMainAssistant(guid); - if(flag2 == 1) - group->SetMainTank(guid); + if (apply) + { + switch(role) + { + case 0: group->SetMainTank(guid); break; + case 1: group->SetMainAssistant(guid); break; + default: break; + } + } + else + { + if (group->GetMainTank() == guid) + group->SetMainTank(0); + if (group->GetMainAssistant() == guid) + group->SetMainAssistant(0); + } } void WorldSession::HandleRaidReadyCheckOpcode( WorldPacket & recv_data ) diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index d2573cacf..8408222e5 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "9991" + #define REVISION_NR "9992" #endif // __REVISION_NR_H__ -- 2.11.4.GIT