aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNay <dnpd.dd@gmail.com>2012-01-14 17:43:19 +0000
committerNay <dnpd.dd@gmail.com>2012-01-14 17:43:19 +0000
commita369594d61c688127eff7c04e2a691400416b18d (patch)
treea838bc18f3e6afd5adc2b9bb88a0f48365eebf38
parent522683bfabca985034aad1dbadd0738e1cfe2cc6 (diff)
Core/Group: Update CMSG_GROUP_RAID_CONVERT to 4.x. Based on SF sources and thanks Subv.
TODO: Test
-rwxr-xr-xsrc/server/game/Groups/Group.cpp31
-rwxr-xr-xsrc/server/game/Groups/Group.h1
-rwxr-xr-xsrc/server/game/Server/Protocol/Handlers/GroupHandler.cpp16
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp2
4 files changed, 45 insertions, 5 deletions
diff --git a/src/server/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp
index b03f853a9e4..5f1b27a5d53 100755
--- a/src/server/game/Groups/Group.cpp
+++ b/src/server/game/Groups/Group.cpp
@@ -254,6 +254,37 @@ void Group::ConvertToRaid()
player->UpdateForQuestWorldObjects();
}
+void Group::ConvertToGroup()
+{
+ if (m_memberSlots.size() > 5)
+ return; // What message error should we send?
+
+ m_groupType = GroupType(GROUPTYPE_NORMAL);
+
+ if (m_subGroupsCounts)
+ {
+ delete[] m_subGroupsCounts;
+ m_subGroupsCounts = NULL;;
+ }
+
+ if (!isBGGroup())
+ {
+ PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_GROUP_TYPE);
+
+ stmt->setUInt8(0, uint8(m_groupType));
+ stmt->setUInt32(1, m_dbStoreId);
+
+ CharacterDatabase.Execute(stmt);
+ }
+
+ SendUpdate();
+
+ // update quest related GO states (quest activity dependent from raid membership)
+ for (member_citerator citr = m_memberSlots.begin(); citr != m_memberSlots.end(); ++citr)
+ if (Player* player = ObjectAccessor::FindPlayer(citr->guid))
+ player->UpdateForQuestWorldObjects();
+}
+
bool Group::AddInvite(Player* player)
{
if (!player || player->GetGroupInvite())
diff --git a/src/server/game/Groups/Group.h b/src/server/game/Groups/Group.h
index b718246b43e..63c89069f52 100755
--- a/src/server/game/Groups/Group.h
+++ b/src/server/game/Groups/Group.h
@@ -239,6 +239,7 @@ class Group
void ConvertToLFG();
void ConvertToRaid();
+ void ConvertToGroup();
void SetBattlegroundGroup(Battleground* bg);
GroupJoinBattlegroundResult CanJoinBattlegroundQueue(Battleground const* bgOrTemplate, BattlegroundQueueTypeId bgQueueTypeId, uint32 MinPlayerCount, uint32 MaxPlayerCount, bool isRated, uint32 arenaSlot);
diff --git a/src/server/game/Server/Protocol/Handlers/GroupHandler.cpp b/src/server/game/Server/Protocol/Handlers/GroupHandler.cpp
index 101b5be0033..03c213b9bd3 100755
--- a/src/server/game/Server/Protocol/Handlers/GroupHandler.cpp
+++ b/src/server/game/Server/Protocol/Handlers/GroupHandler.cpp
@@ -548,7 +548,7 @@ void WorldSession::HandleRaidTargetUpdateOpcode(WorldPacket & recv_data)
}
}
-void WorldSession::HandleGroupRaidConvertOpcode(WorldPacket & /*recv_data*/)
+void WorldSession::HandleGroupRaidConvertOpcode(WorldPacket& recv_data)
{
sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_GROUP_RAID_CONVERT");
@@ -559,14 +559,22 @@ void WorldSession::HandleGroupRaidConvertOpcode(WorldPacket & /*recv_data*/)
if (_player->InBattleground())
return;
- /** error handling **/
+ // error handling
if (!group->IsLeader(GetPlayer()->GetGUID()) || group->GetMembersCount() < 2)
return;
- /********************/
// everything's fine, do it (is it 0 (PARTY_OP_INVITE) correct code)
SendPartyResult(PARTY_OP_INVITE, "", ERR_PARTY_RESULT_OK);
- group->ConvertToRaid();
+
+ // New 4.x: it is now possible to convert a raid to a group if member count is 5 or less
+
+ bool toRaid;
+ recv_data >> toRaid;
+
+ if (toRaid)
+ group->ConvertToRaid();
+ else
+ group->ConvertToGroup();
}
void WorldSession::HandleGroupChangeSubGroupOpcode(WorldPacket & recv_data)
diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp
index b326598ca9b..ed9035a5ece 100644
--- a/src/server/game/Server/Protocol/Opcodes.cpp
+++ b/src/server/game/Server/Protocol/Opcodes.cpp
@@ -714,7 +714,7 @@ void InitOpcodes()
//DEFINE_OPCODE_HANDLER(CMSG_SET_PVP_TITLE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER(SMSG_PVP_CREDIT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//DEFINE_OPCODE_HANDLER(SMSG_AUCTION_REMOVED_NOTIFICATION, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
- //DEFINE_OPCODE_HANDLER(CMSG_GROUP_RAID_CONVERT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGroupRaidConvertOpcode );
+ DEFINE_OPCODE_HANDLER(CMSG_GROUP_RAID_CONVERT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGroupRaidConvertOpcode );
//DEFINE_OPCODE_HANDLER(CMSG_GROUP_ASSISTANT_LEADER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGroupAssistantLeaderOpcode);
DEFINE_OPCODE_HANDLER(CMSG_BUYBACK_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleBuybackItem );
DEFINE_OPCODE_HANDLER(SMSG_SERVER_MESSAGE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );