Пример #1
0
void Pony::removeInventoryItem(quint32 id, quint32 qty)
{
    for (int i=0; i<inv.size(); i++)
    {
        if (inv[i].id == id)
        {
            sendDeleteItemRPC(owner, inv[i].index, qty);
            if (qty < inv[i].amount)
            {
                inv[i].amount -= qty;
                return;
            }
            else if (qty == inv[i].amount)
            {
                inv.removeAt(i);
                return;
            }
            else
            {
                qty -= inv[i].amount;
                inv.removeAt(i);
            }
        }
    }
}
Пример #2
0
bool Pony::tryWearItem(quint8 invSlot)
{
    //win.logMessage("Invslot is "+QString().setNum(invSlot));
    uint32_t id = -1;
    uint32_t itemSlots;
    for (int i=0; i<inv.size(); i++)
    {
        if (inv[i].index == invSlot)
        {
            id = inv[i].id;

            itemSlots = win.wearablePositionsMap[id];
            if (wornSlots & itemSlots)
            {
                win.logMessage("Can't wear item: slots occupied", udpTag);
                return false;
            }

            sendDeleteItemRPC(owner,inv[i].index,1);
            if (inv[i].amount>1)
                inv[i].amount--;
            else
                inv.removeAt(i);
            break;
        }
    }
    if (id == (uint32_t)-1)
    {
        // wtf?
        win.logMessage("Index not found", sysTag);
        return false;
    }
    wornSlots |= itemSlots;

    WearableItem item;
    item.id = id;
    item.index = wearablePositionsToSlot(itemSlots);
    //win.logMessage("Wearing at slot "+QString().setNum(item.index));
    worn << item;
    sendWearItemRPC(owner, item);

    Scene* scene = findScene(sceneName);
    if (scene->name.isEmpty())
        win.logMessage("UDP: Can't find the scene for wearItem RPC, aborting", udpTag);
    else
    {
        for (Player* dest : scene->players)
            if (dest->pony.netviewId != netviewId)
                sendWearItemRPC(this, dest, item);
    }

    return true;
}