Esempio n. 1
0
void WorldSession::HandleEquipmentSetSave(WorldPacket& data)
{
    CHECK_INWORLD_RETURN LOG_DEBUG("Received CMSG_EQUIPMENT_SET_SAVE");

    WoWGuid GUID;
    uint32 setGUID;

    data >> GUID;

    setGUID = Arcemu::Util::GUID_LOPART(GUID.GetOldGuid());

    if (setGUID == 0)
        setGUID = objmgr.GenerateEquipmentSetID();

    Arcemu::EquipmentSet* set = new Arcemu::EquipmentSet();

    set->SetGUID = setGUID;

    data >> set->SetID;
    data >> set->SetName;
    data >> set->IconName;

    for (uint32 i = EQUIPMENT_SLOT_START; i < EQUIPMENT_SLOT_END; ++i)
    {
        GUID.Clear();
        data >> GUID;
        set->ItemGUID[i] = Arcemu::Util::GUID_LOPART(GUID.GetOldGuid());
    }

    bool success;
    success = _player->GetItemInterface()->m_EquipmentSets.AddEquipmentSet(set->SetGUID, set);

    if (success)
    {
        LOG_DEBUG("Player %u successfully stored equipment set %u at slot %u ", _player->getGuidLow(), set->SetGUID, set->SetID);
        _player->SendEquipmentSetSaved(set->SetID, set->SetGUID);
    }
    else
    {
        LOG_DEBUG("Player %u couldn't store equipment set %u at slot %u ", _player->getGuidLow(), set->SetGUID, set->SetID);
    }
}
Esempio n. 2
0
void WorldSession::HandleEquipmentSetUse(WorldPacket& data)
{
    CHECK_INWORLD_RETURN LOG_DEBUG("Received CMSG_EQUIPMENT_SET_USE");

    WoWGuid GUID;
    int8 SrcBagID;
    uint8 SrcSlotID;
    uint8 result = 0;

    for (int8 i = EQUIPMENT_SLOT_START; i < EQUIPMENT_SLOT_END; ++i)
    {
        uint64 ItemGUID = 0;

        GUID.Clear();

        data >> GUID;
        data >> SrcBagID;
        data >> SrcSlotID;

        ItemGUID = GUID.GetOldGuid();

        // Let's see if we even have this item
        auto item = _player->GetItemInterface()->GetItemByGUID(ItemGUID);
        if (item == nullptr)
        {
            // Nope we don't probably WPE hack :/
            result = 1;
            continue;
        }

        int8 dstslot = i;
        int8 dstbag = static_cast<int8>(INVALID_BACKPACK_SLOT);

        // This is the best case, we already have the item equipped
        if ((SrcBagID == dstbag) && (SrcSlotID == dstslot))
            continue;

        // Let's see if we have an item in the destination slot
        auto dstslotitem = _player->GetItemInterface()->GetInventoryItem(dstslot);

        if (dstslotitem == nullptr)
        {
            // we have no item equipped in the slot, so let's equip
            AddItemResult additemresult;
            int8 EquipError = _player->GetItemInterface()->CanEquipItemInSlot(dstbag, dstslot, item->getItemProperties(), false, false);
            if (EquipError == INV_ERR_OK)
            {
                dstslotitem = _player->GetItemInterface()->SafeRemoveAndRetreiveItemFromSlot(SrcBagID, SrcSlotID, false);
                additemresult = _player->GetItemInterface()->SafeAddItem(item, dstbag, dstslot);

                if (additemresult != ADD_ITEM_RESULT_OK)
                {
                    // We failed for w/e reason, so let's revert
                    auto check = _player->GetItemInterface()->SafeAddItem(item, SrcBagID, SrcSlotID);
                    if (!check)
                    {
                        LOG_ERROR("HandleEquipmentSetUse", "Error while adding item %u to player %s twice", item->getEntry(), _player->GetNameString());
                        result = 0;
                    }
                    else
                        result = 1;
                }
            }
            else
            {
                result = 1;
            }

        }
        else
        {
            // There is something equipped so we need to swap
            if (!_player->GetItemInterface()->SwapItems(INVALID_BACKPACK_SLOT, dstslot, SrcBagID, SrcSlotID))
                result = 1;
        }

    }

    _player->SendEquipmentSetUseResult(result);
}