Esempio n. 1
0
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);
        }
    }
}
Esempio n. 2
0
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);
}
Esempio n. 3
0
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;
    }
}
Esempio n. 4
0
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);
    }
}
Esempio n. 5
0
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);
}