diff options
Diffstat (limited to 'src/server/game/Groups/Group.cpp')
-rw-r--r-- | src/server/game/Groups/Group.cpp | 64 |
1 files changed, 56 insertions, 8 deletions
diff --git a/src/server/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp index fe06c172e3f..90c97562185 100644 --- a/src/server/game/Groups/Group.cpp +++ b/src/server/game/Groups/Group.cpp @@ -266,6 +266,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() && !isBFGroup()) + { + 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()) @@ -442,7 +473,7 @@ bool Group::AddMember(Player* player) // Broadcast new player group member fields to rest of the group player->SetFieldNotifyFlag(UF_FLAG_PARTY_MEMBER); - UpdateData groupData; + UpdateData groupData(player->GetMapId()); WorldPacket groupDataPacket; // Broadcast group members' fields to player @@ -453,7 +484,7 @@ bool Group::AddMember(Player* player) if (Player* member = itr->getSource()) { - if (player->HaveAtClient(member)) + if (player->HaveAtClient(member)) // must be on the same map, or shit will break { member->SetFieldNotifyFlag(UF_FLAG_PARTY_MEMBER); member->BuildValuesUpdateBlockForPlayer(&groupData, player); @@ -462,7 +493,7 @@ bool Group::AddMember(Player* player) if (member->HaveAtClient(player)) { - UpdateData newData; + UpdateData newData(player->GetMapId()); WorldPacket newDataPacket; player->BuildValuesUpdateBlockForPlayer(&newData, member); if (newData.HasData()) @@ -785,6 +816,7 @@ void Group::SendLootStartRoll(uint32 countDown, uint32 mapid, const Roll &r) data << uint32(r.itemCount); // items in stack data << uint32(countDown); // the countdown time to choose "need" or "greed" data << uint8(r.rollVoteMask); // roll type mask + data << uint8(r.totalPlayersRolling); // maybe the number of players rolling for it??? for (Roll::PlayerVote::const_iterator itr=r.playerVote.begin(); itr != r.playerVote.end(); ++itr) { @@ -815,6 +847,7 @@ void Group::SendLootStartRollToPlayer(uint32 countDown, uint32 mapId, Player* p, if (!canNeed) voteMask &= ~ROLL_FLAG_TYPE_NEED; data << uint8(voteMask); // roll type mask + data << uint8(r.totalPlayersRolling); // maybe the number of players rolling for it??? p->GetSession()->SendPacket(&data); } @@ -828,7 +861,7 @@ void Group::SendLootRoll(uint64 sourceGuid, uint64 targetGuid, uint8 rollNumber, data << uint32(roll.itemid); // the itemEntryId for the item that shall be rolled for data << uint32(roll.itemRandomSuffix); // randomSuffix data << uint32(roll.itemRandomPropId); // Item random property ID - data << uint8(rollNumber); // 0: "Need for: [item name]" > 127: "you passed on: [item name]" Roll number + data << uint32(rollNumber); // 0: "Need for: [item name]" > 127: "you passed on: [item name]" Roll number data << uint8(rollType); // 0: "Need for: [item name]" 0: "You have selected need for [item name] 1: need roll 2: greed roll data << uint8(0); // 1: "You automatically passed on: %s because you cannot loot that item." - Possibly used in need befor greed @@ -852,7 +885,7 @@ void Group::SendLootRollWon(uint64 sourceGuid, uint64 targetGuid, uint8 rollNumb data << uint32(roll.itemRandomSuffix); // randomSuffix data << uint32(roll.itemRandomPropId); // Item random property data << uint64(targetGuid); // guid of the player who won. - data << uint8(rollNumber); // rollnumber realted to SMSG_LOOT_ROLL + data << uint32(rollNumber); // rollnumber realted to SMSG_LOOT_ROLL data << uint8(rollType); // rollType related to SMSG_LOOT_ROLL for (Roll::PlayerVote::const_iterator itr = roll.playerVote.begin(); itr != roll.playerVote.end(); ++itr) @@ -1498,6 +1531,7 @@ void Group::SendUpdateToPlayer(uint64 playerGUID, MemberSlot* slot) { data << uint8(sLFGMgr->GetState(m_guid) == lfg::LFG_STATE_FINISHED_DUNGEON ? 2 : 0); // FIXME - Dungeon save status? 2 = done data << uint32(sLFGMgr->GetDungeon(m_guid)); + data << uint8(0); // 4.x new } data << uint64(m_guid); @@ -1530,7 +1564,6 @@ void Group::SendUpdateToPlayer(uint64 playerGUID, MemberSlot* slot) data << uint8(m_lootThreshold); // loot threshold data << uint8(m_dungeonDifficulty); // Dungeon Difficulty data << uint8(m_raidDifficulty); // Raid Difficulty - data << uint8(0); // 3.3 } player->GetSession()->SendPacket(&data); @@ -1553,6 +1586,21 @@ void Group::UpdatePlayerOutOfRange(Player* player) } } +void Group::BroadcastAddonMessagePacket(WorldPacket* packet, const std::string& prefix, bool ignorePlayersInBGRaid, int group, uint64 ignore) +{ + for (GroupReference* itr = GetFirstMember(); itr != NULL; itr = itr->next()) + { + Player* player = itr->getSource(); + if (!player || (ignore != 0 && player->GetGUID() == ignore) || (ignorePlayersInBGRaid && player->GetGroup() != this)) + continue; + + if (WorldSession* session = player->GetSession()) + if (session && (group == -1 || itr->getSubGroup() == group)) + if (session->IsAddonRegistered(prefix)) + session->SendPacket(packet); + } +} + void Group::BroadcastPacket(WorldPacket* packet, bool ignorePlayersInBGRaid, int group, uint64 ignore) { for (GroupReference* itr = GetFirstMember(); itr != NULL; itr = itr->next()) @@ -1767,7 +1815,7 @@ GroupJoinBattlegroundResult Group::CanJoinBattlegroundQueue(Battleground const* BattlemasterListEntry const* bgEntry = sBattlemasterListStore.LookupEntry(bgOrTemplate->GetTypeID()); if (!bgEntry) - return ERR_GROUP_JOIN_BATTLEGROUND_FAIL; // shouldn't happen + return ERR_BATTLEGROUND_JOIN_FAILED; // shouldn't happen // check for min / max count uint32 memberscount = GetMembersCount(); @@ -1832,7 +1880,7 @@ GroupJoinBattlegroundResult Group::CanJoinBattlegroundQueue(Battleground const* if (bgOrTemplate->isArena() && memberscount != MinPlayerCount) return ERR_ARENA_TEAM_PARTY_SIZE; - return GroupJoinBattlegroundResult(bgOrTemplate->GetTypeID()); + return ERR_BATTLEGROUND_NONE; } //=================================================== |