void Group::GroupLoot(uint64 playerGUID, Loot *loot, Creature *creature) { vector<LootItem>::iterator i; ItemPrototype const *item; uint8 itemSlot = 0; Player *player = objmgr.GetPlayer(playerGUID); Group *group = player->groupInfo.group; for (i=loot->items.begin(); i != loot->items.end(); i++, itemSlot++) { item = objmgr.GetItemPrototype(i->itemid); if (!item) { //sLog.outDebug("Group::GroupLoot: missing item prototype for item with id: %d", i->itemid); continue; } if (item->Quality > ITEM_QUALITY_NORMAL) { Roll r; uint32 newitemGUID = objmgr.GenerateLowGuid(HIGHGUID_ITEM); r.itemGUID = newitemGUID; r.itemid = i->itemid; r.itemRandomPropId = i->randomPropertyId; //a vector is filled with only near party members for (int j = 0; j < m_members.size(); j++) { Player *member = objmgr.GetPlayer(m_members[j].guid); if(!member || !member->GetSession()) continue; if (member->GetDistance2dSq(creature) < sWorld.getConfig(CONFIG_GROUP_XP_DISTANCE)) { r.playerVote[m_members[j].guid] = NOT_EMITED_YET; r.totalPlayersRolling++; } } r.loot = loot; r.itemSlot = itemSlot; group->SendLootStartRoll(newitemGUID, 60000, r); loot->items[itemSlot].is_blocked = true; creature->m_groupLootTimer = 60000; creature->lootingGroupLeaderGUID = GetLeaderGUID(); RollId.push_back(r); } } }
void LfgGroup::SendRoleCheckFail(uint8 error) { m_lfgFlags &= ~LFG_GRP_ROLECHECK; SendRoleCheckUpdate(error); for(member_citerator citr = m_memberSlots.begin(); citr != m_memberSlots.end(); ++citr) { Player *player = sObjectMgr.GetPlayer(citr->guid); if (!player || !player->GetSession()) continue; sLfgMgr.SendLfgUpdateParty(player, LFG_UPDATETYPE_ROLECHECK_FAILED); if (player->GetGUID() == GetLeaderGUID()) sLfgMgr.SendJoinResult(player, LFG_JOIN_FAILED, error); } sLfgMgr.RemoveRoleCheckGroup(this); sLfgMgr.AddCheckedGroup(this, false); }
bool Group::IsMember(uint64 guid) const { Player *player = objmgr.GetPlayer(guid); if(player) return (player->groupInfo.group == this); else { QueryResult *result = sDatabase.PQuery("SELECT `leaderGuid` FROM `group_member` WHERE `memberGuid`='%u' AND `leaderGuid`='%u'", GUID_LOPART(guid), GUID_LOPART(GetLeaderGUID())); if(result) { delete result; return true; } else return false; } }
void LfgGroup::SendRoleCheckUpdate(uint8 state) { if (state == LFG_ROLECHECK_INITIALITING) { m_lfgFlags |= LFG_GRP_ROLECHECK; ResetGroup(); if (IsInDungeon()) premadePlayers.clear(); m_roleCheck.Reset(); m_roleCheck.m_beforeCheck = GetMembersCount(); } Player *leader = sObjectMgr.GetPlayer(GetLeaderGUID()); if (!leader) return; WorldPacket data(SMSG_LFG_ROLE_CHECK_UPDATE, 6 + leader->m_lookingForGroup.queuedDungeons.size() * 4 + 1 + GetMembersCount() * 14); data << uint32(state); data << uint8(state == LFG_ROLECHECK_INITIALITING); // begining data << uint8(leader->m_lookingForGroup.queuedDungeons.size()); for (LfgDungeonList::const_iterator it = leader->m_lookingForGroup.queuedDungeons.begin(); it != leader->m_lookingForGroup.queuedDungeons.end(); ++it) data << uint32((*it)->Entry()); data << uint8(GetMembersCount()); //leader first data << uint64(GetLeaderGUID()); ProposalAnswersMap::iterator itr = m_roleCheck.m_rolesProposal.find(GetLeaderGUID()); if (itr != m_roleCheck.m_rolesProposal.end()) { data << uint8(1); //ready data << uint32(itr->second); //roles } else { data << uint8(0); //ready data << uint32(0); //roles } data << uint8(leader->getLevel()); for(member_citerator citr = m_memberSlots.begin(); citr != m_memberSlots.end(); ++citr) { Player *member = sObjectMgr.GetPlayer(citr->guid); if (!member || !member->GetSession() || member->GetGUID() == GetLeaderGUID()) continue; itr = m_roleCheck.m_rolesProposal.find(citr->guid); data << uint64(member->GetGUID()); if(itr != m_roleCheck.m_rolesProposal.end()) { data << uint8(1); data << uint32(itr->second); }else data << uint8(0) << uint32(0); data << uint8(member->getLevel()); } for(member_citerator citr = m_memberSlots.begin(); citr != m_memberSlots.end(); ++citr) { Player *plr = sObjectMgr.GetPlayer(citr->guid); if (!plr || !plr->GetSession()) continue; if(state == LFG_ROLECHECK_INITIALITING) plr->m_lookingForGroup.roles = 0; plr->GetSession()->SendPacket(&data); } }
void LfgGroup::UpdateRoleCheck(uint32 diff) { sLfgMgr.LfgLog("Updaterolecheck %u, diff %u", GetId(), diff); if (diff != 0) { m_readycheckTimer += diff; if (m_readycheckTimer >= LFG_TIMER_READY_CHECK && m_roleCheck.m_beforeCheck != m_roleCheck.m_rolesProposal.size()) { SendRoleCheckFail(LFG_ROLECHECK_MISSING_ROLE); return; } } //offline check bool offline = false; for(member_citerator citr = m_memberSlots.begin(); citr != m_memberSlots.end(); ++citr) { Player *player = sObjectMgr.GetPlayer(citr->guid); if (!player) { offline = true; break; } } if (GetMembersCount() != m_roleCheck.m_beforeCheck || offline) { SendRoleCheckFail(LFG_ROLECHECK_ABORTED); return; } // add answers for(member_citerator citr = m_memberSlots.begin(); citr != m_memberSlots.end(); ++citr) { Player *player = sObjectMgr.GetPlayer(citr->guid); if (m_roleCheck.m_rolesProposal.find(citr->guid) != m_roleCheck.m_rolesProposal.end() || !player || !player->GetSession() || player->m_lookingForGroup.roles == 0) continue; m_roleCheck.m_rolesProposal[player->GetGUID()] = player->m_lookingForGroup.roles; WorldPacket data(SMSG_LFG_ROLE_CHOSEN, 13); data << uint64(player->GetGUID()); data << uint8(1); data << uint32(player->m_lookingForGroup.roles); BroadcastPacket(&data, false); } //Offline members checked at join //Check roles if (m_roleCheck.m_beforeCheck > m_roleCheck.m_rolesProposal.size()) return; Player *leader = sObjectMgr.GetPlayer(GetLeaderGUID()); if(!leader || !leader->IsInWorld() || !m_roleCheck.TryRoles(this)) { SendRoleCheckFail(LFG_ROLECHECK_WRONG_ROLES); return; } SetAsRole(TANK, m_roleCheck.tank); SetAsRole(HEALER, m_roleCheck.heal); dps.clear(); dps = m_roleCheck.dps; //Move group to queue SendRoleCheckUpdate(LFG_ROLECHECK_FINISHED); for(member_citerator citr = m_memberSlots.begin(); citr != m_memberSlots.end(); ++citr) { Player *player = sObjectMgr.GetPlayer(citr->guid); if (!player || !player->GetSession()) continue; if (player->GetGUID() == GetLeaderGUID()) sLfgMgr.SendJoinResult(player, LFG_JOIN_OK); else { //player->m_lookingForGroup.roles = GetPlayerRole(player->GetGUID()); player->m_lookingForGroup.comment = ""; player->m_lookingForGroup.joinTime = getMSTime(); player->m_lookingForGroup.queuedDungeons = leader->m_lookingForGroup.queuedDungeons; } if (IsInDungeon()) premadePlayers.insert(player->GetGUID()); } m_lfgFlags &= ~LFG_GRP_ROLECHECK; SendUpdate(); sLfgMgr.RemoveRoleCheckGroup(this); if(GetMembersCount() == LFG_GROUP) TeleportToDungeon(); else sLfgMgr.AddCheckedGroup(this, true); }