diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Groups/Group.cpp | 89 |
1 files changed, 50 insertions, 39 deletions
diff --git a/src/server/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp index 6c5b1b5c56e..bd53d8ea723 100644 --- a/src/server/game/Groups/Group.cpp +++ b/src/server/game/Groups/Group.cpp @@ -127,7 +127,7 @@ bool Group::Create(const uint64 &guid, const char * name) "VALUES ('%u','%u','%u','%u','%u','" UI64FMTD "','" UI64FMTD "','" UI64FMTD "','" UI64FMTD "','" UI64FMTD "','" UI64FMTD "','" UI64FMTD "','" UI64FMTD "','%u','%u','%u')", lowguid, GUID_LOPART(m_leaderGuid), uint32(m_lootMethod), GUID_LOPART(m_looterGuid), uint32(m_lootThreshold), m_targetIcons[0], m_targetIcons[1], m_targetIcons[2], m_targetIcons[3], m_targetIcons[4], m_targetIcons[5], m_targetIcons[6], m_targetIcons[7], uint8(m_groupType), uint32(m_dungeonDifficulty), m_raidDifficulty); - + CharacterDatabase.CommitTransaction(trans); } else if (!AddMember(guid, name)) @@ -713,9 +713,7 @@ void Group::GroupLoot(Loot *loot, WorldObject* pLootedObject) } } else - { delete r; - } } else i->is_underthreshold=1; @@ -758,9 +756,7 @@ void Group::NeedBeforeGreed(Loot *loot, WorldObject* pLootedObject) // can't broadcast the pass now. need to wait until all rolling players are known. } else - { r->playerVote[playerToRoll->GetGUID()] = NOT_EMITED_YET; - } } } } @@ -802,9 +798,7 @@ void Group::NeedBeforeGreed(Loot *loot, WorldObject* pLootedObject) } } else - { delete r; - } } else i->is_underthreshold=1; @@ -884,9 +878,7 @@ void Group::CountRollVote(const uint64& playerGUID, const uint64& Guid, uint32 N } if (roll->totalPass + roll->totalNeed + roll->totalGreed >= roll->totalPlayersRolling) - { CountTheRoll(rollI, NumberOfPlayers); - } } //called when roll timer expires @@ -912,6 +904,7 @@ void Group::CountTheRoll(Rolls::iterator rollI, uint32 NumberOfPlayers) delete roll; return; } + //end of the roll if (roll->totalNeed > 0) { @@ -1029,6 +1022,7 @@ void Group::CountTheRoll(Rolls::iterator rollI, uint32 NumberOfPlayers) if (item) item->is_blocked = false; } + RollId.erase(rollI); delete roll; } @@ -1071,8 +1065,7 @@ void Group::GetDataForXPAtKill(Unit const* victim, uint32& count,uint32& sum_lev member_with_max_level = member; uint32 gray_level = Trinity::XP::GetGrayLevel(member->getLevel()); - if (victim->getLevel() > gray_level && (!not_gray_member_with_max_level - || not_gray_member_with_max_level->getLevel() < member->getLevel())) + if (victim->getLevel() > gray_level && (!not_gray_member_with_max_level || not_gray_member_with_max_level->getLevel() < member->getLevel())) not_gray_member_with_max_level = member; } } @@ -1085,7 +1078,7 @@ void Group::SendTargetIconList(WorldSession *session) WorldPacket data(MSG_RAID_TARGET_UPDATE, (1+TARGETICONCOUNT*9)); data << uint8(1); // list targets - for (int i=0; i<TARGETICONCOUNT; ++i) + for (uint8 i = 0; i < TARGETICONCOUNT; ++i) { if (m_targetIcons[i] == 0) continue; @@ -1126,6 +1119,7 @@ void Group::SendUpdate() { if (citr->guid == citr2->guid) continue; + Player* member = sObjectMgr.GetPlayer(citr2->guid); uint8 onlineState = (member) ? MEMBER_STATUS_ONLINE : MEMBER_STATUS_OFFLINE; @@ -1138,8 +1132,10 @@ void Group::SendUpdate() data << uint8(citr2->flags); // See enum GroupMemberFlags data << uint8(citr2->roles); // Lfg Roles } + data << uint64(m_leaderGuid); // leader guid - if (GetMembersCount()-1) + + if (GetMembersCount() - 1) { data << uint8(m_lootMethod); // loot method data << uint64(m_looterGuid); // looter guid @@ -1148,6 +1144,7 @@ void Group::SendUpdate() data << uint8(m_raidDifficulty); // Raid Difficulty data << uint8(0); // 3.3 } + player->GetSession()->SendPacket(&data); } } @@ -1254,15 +1251,13 @@ bool Group::_addMember(const uint64 &guid, const char* name, uint8 group) if (player) { player->SetGroupInvite(NULL); - //if player is in group and he is being added to BG raid group, then call SetBattlegroundRaid() - if (player->GetGroup() && isBGGroup()) + if (player->GetGroup() && isBGGroup()) //if player is in group and he is being added to BG raid group, then call SetBattlegroundRaid() player->SetBattlegroundRaid(this, group); - //if player is in bg raid and we are adding him to normal group, then call SetOriginalGroup() - else if (player->GetGroup()) + else if (player->GetGroup()) //if player is in bg raid and we are adding him to normal group, then call SetOriginalGroup() player->SetOriginalGroup(this, group); - //if player is not in group, then call set group - else + else //if player is not in group, then call set group player->SetGroup(this, group); + // if the same group invites the player back, cancel the homebind timer InstanceGroupBind *bind = GetBoundInstance(player); if (bind && bind->save->GetInstanceId() == player->GetInstanceId()) @@ -1275,11 +1270,9 @@ bool Group::_addMember(const uint64 &guid, const char* name, uint8 group) m_targetIcons[i] = 0; } + // insert into the table if we're not a battleground group if (!isBGGroup()) - { - // insert into group table CharacterDatabase.PExecute("INSERT INTO group_member (guid, memberGuid, memberFlags, subgroup, roles) VALUES(%u, %u, %u, %u, %u)", GUID_LOPART(m_guid), GUID_LOPART(member.guid), member.flags, member.group, member.roles); - } return true; } @@ -1299,6 +1292,7 @@ bool Group::_removeMember(const uint64 &guid) player->SetOriginalGroup(NULL); else player->SetGroup(NULL); + player->GetSession()->SendLfgUpdateParty(LFG_UPDATETYPE_LEADER); } } @@ -1309,7 +1303,6 @@ bool Group::_removeMember(const uint64 &guid) if (slot != m_memberSlots.end()) { SubGroupCounterDecrease(slot->group); - m_memberSlots.erase(slot); } @@ -1338,7 +1331,6 @@ void Group::_setLeader(const uint64 &guid) SQLTransaction trans = CharacterDatabase.BeginTransaction(); // update the group's bound instances when changing leaders - // remove all permanent binds from the group // in the DB also remove solo binds that will be replaced with permbinds // from the new leader @@ -1390,10 +1382,15 @@ void Group::_removeRolls(const uint64 &guid) if (itr2 == roll->playerVote.end()) continue; - if (itr2->second == GREED || itr2->second == DISENCHANT) --roll->totalGreed; - if (itr2->second == NEED) --roll->totalNeed; - if (itr2->second == PASS) --roll->totalPass; - if (itr2->second != NOT_VALID) --roll->totalPlayersRolling; + if (itr2->second == GREED || itr2->second == DISENCHANT) + --roll->totalGreed; + else if (itr2->second == NEED) + --roll->totalNeed; + else if (itr2->second == PASS) + --roll->totalPass; + + if (itr2->second != NOT_VALID) + --roll->totalPlayersRolling; roll->playerVote.erase(itr2); @@ -1411,7 +1408,8 @@ bool Group::_setMembersGroup(const uint64 &guid, const uint8 &group) SubGroupCounterIncrease(group); - if (!isBGGroup()) CharacterDatabase.PExecute("UPDATE group_member SET subgroup='%u' WHERE memberGuid='%u'", group, GUID_LOPART(guid)); + if (!isBGGroup()) + CharacterDatabase.PExecute("UPDATE group_member SET subgroup='%u' WHERE memberGuid='%u'", group, GUID_LOPART(guid)); return true; } @@ -1426,6 +1424,7 @@ bool Group::_setAssistantFlag(const uint64 &guid, const bool &apply) if (!isBGGroup()) CharacterDatabase.PExecute("UPDATE group_member SET memberFlags='%u' WHERE memberGuid='%u'", slot->flags, GUID_LOPART(guid)); + return true; } @@ -1440,6 +1439,7 @@ bool Group::_setMainTank(const uint64 &guid, const bool &apply) if (!isBGGroup()) CharacterDatabase.PExecute("UPDATE group_member SET memberFlags='%u' WHERE memberGuid='%u'", slot->flags, GUID_LOPART(guid)); + return true; } @@ -1454,14 +1454,18 @@ bool Group::_setMainAssistant(const uint64 &guid, const bool &apply) if (!isBGGroup()) CharacterDatabase.PExecute("UPDATE group_member SET memberFlags='%u' WHERE memberGuid='%u'", slot->flags, GUID_LOPART(guid)); + return true; } bool Group::SameSubGroup(Player const* member1, Player const* member2) const { - if (!member1 || !member2) return false; - if (member1->GetGroup() != this || member2->GetGroup() != this) return false; - else return member1->GetSubGroup() == member2->GetSubGroup(); + if (!member1 || !member2) + return false; + if (member1->GetGroup() != this || member2->GetGroup() != this) + return false; + else + return member1->GetSubGroup() == member2->GetSubGroup(); } // allows setting subgroup for offline members @@ -1503,14 +1507,14 @@ void Group::ChangeMembersGroup(Player *player, const uint8 &group) { if (player->GetGroup() == this) player->GetGroupRef().setSubGroup(group); - //if player is in BG raid, it is possible that he is also in normal raid - and that normal raid is stored in m_originalGroup reference else { + //if player is in BG raid, it is possible that he is also in normal raid - and that normal raid is stored in m_originalGroup reference prevSubGroup = player->GetOriginalSubGroup(); player->GetOriginalGroupRef().setSubGroup(group); } - SubGroupCounterDecrease(prevSubGroup); + SubGroupCounterDecrease(prevSubGroup); SendUpdate(); } } @@ -1682,6 +1686,7 @@ void Group::SetDungeonDifficulty(Difficulty difficulty) Player *player = itr->getSource(); if (!player->GetSession() || player->getLevel() < LEVELREQUIREMENT_HEROIC) continue; + player->SetDungeonDifficulty(difficulty); player->SendDungeonDifficulty(true); } @@ -1698,6 +1703,7 @@ void Group::SetRaidDifficulty(Difficulty difficulty) Player *player = itr->getSource(); if (!player->GetSession() || player->getLevel() < LEVELREQUIREMENT_HEROIC) continue; + player->SetRaidDifficulty(difficulty); player->SendRaidDifficulty(true); } @@ -1710,7 +1716,7 @@ bool Group::InCombatToInstance(uint32 instanceId) Player *pPlayer = itr->getSource(); if (pPlayer && pPlayer->getAttackers().size() && pPlayer->GetInstanceId() == instanceId && (pPlayer->GetMap()->IsRaidOrHeroicDungeon())) for (std::set<Unit*>::const_iterator i = pPlayer->getAttackers().begin(); i != pPlayer->getAttackers().end(); ++i) - if ((*i) && (*i)->GetTypeId() == TYPEID_UNIT && (*i)->ToCreature()->GetCreatureInfo()->flags_extra & CREATURE_FLAG_EXTRA_INSTANCE_BIND) + if ((*i) && (*i)->GetTypeId() == TYPEID_UNIT && (*i)->ToCreature()->GetCreatureInfo()->flags_extra & CREATURE_FLAG_EXTRA_INSTANCE_BIND) return true; } return false; @@ -1759,15 +1765,20 @@ void Group::ResetInstances(uint8 method, bool isRaid, Player* SendMsgTo) if (SendMsgTo) { - if (isEmpty) SendMsgTo->SendResetInstanceSuccess(p->GetMapId()); - else SendMsgTo->SendResetInstanceFailed(0, p->GetMapId()); + if (isEmpty) + SendMsgTo->SendResetInstanceSuccess(p->GetMapId()); + else + SendMsgTo->SendResetInstanceFailed(0, p->GetMapId()); } if (isEmpty || method == INSTANCE_RESET_GROUP_DISBAND || method == INSTANCE_RESET_CHANGE_DIFFICULTY) { // do not reset the instance, just unbind if others are permanently bound to it - if (p->CanReset()) p->DeleteFromDB(); - else CharacterDatabase.PExecute("DELETE FROM group_instance WHERE instance = '%u'", p->GetInstanceId()); + if (p->CanReset()) + p->DeleteFromDB(); + else + CharacterDatabase.PExecute("DELETE FROM group_instance WHERE instance = '%u'", p->GetInstanceId()); + // i don't know for sure if hash_map iterators m_boundInstances[diff].erase(itr); itr = m_boundInstances[diff].begin(); |