• There is NO official Otland's Discord server and NO official Otland's server list. The Otland's Staff does not manage any Discord server or server list. Moderators or administrator of any Discord server or server lists have NO connection to the Otland's Staff. Do not get scammed!

TFS 1.X+ Exhaust Equip c++

ZeroSkyer

Member
Joined
May 17, 2019
Messages
62
Reaction score
9
Location
EEUU
Hello, currently I have exhausted the equip hotkey, now I am trying to move the exhaust for each slot since the idea is to exhaust the rings and amulets but not the equip hotkey in general but I can not do it, someone who can help me?

Code used to check the exhaust
C++:
if (player->isMoveExhausted())
{
    player->sendCancelMessage("You can't equip very fast.");
    return;
}

Code to add the exhaust
C++:
player->setMoveExhaust(600);

Equip hotkey function in game.cpp
C++:
void Game::onPressHotkeyEquip(Player* player, uint16_t spriteid)
{
    Item* item;   
    const ItemType& itemType = Item::items.getItemIdByClientId(spriteid);

    if (itemType.id == 0) {
        return;
    }

    bool removed = false;
    ReturnValue ret = RETURNVALUE_NOERROR;

    if (player->isMoveExhausted())
    {
        player->sendCancelMessage("You can't equip very fast.");
        return;
    }

    if (itemType.weaponType == WEAPON_AMMO) {
        Thing* quiverThing = player->getThing(CONST_SLOT_RIGHT);
        Thing* backpackThing = player->getThing(CONST_SLOT_BACKPACK);
        if (quiverThing && backpackThing) {
            Item* quiver = quiverThing->getItem();
            Item* backpack = backpackThing->getItem();
            if (quiver && quiver->getWeaponType() == WEAPON_QUIVER && backpack) {
                item = findItemOfType(backpack->getContainer(), itemType.id);
                if (item) {
                    ret = internalMoveItem(item->getParent(), quiver->getContainer(), 0, item, item->getItemCount(), nullptr);
                }
                else {
                    ret = RETURNVALUE_NOTPOSSIBLE;
                }
            }
            else {
                ret = RETURNVALUE_NOTPOSSIBLE;
            }
        }
    } else {
        item = findItemOfType(player, itemType.id);

        if (!item) {
            item = findItemOfType(player, itemType.transformEquipTo);
            if (!item) {
                item = findItemOfType(player, itemType.transformDeEquipTo);
            }
            if (!item) {
                player->sendCancelMessage(RETURNVALUE_NOTPOSSIBLE);
                return;
            }
        }

        const ItemType& newitemType = Item::items[item->getID()];

        if (newitemType.id == 0) {
            return;
        }

        int32_t slotP = newitemType.slotPosition;
        if (itemType.weaponType == WEAPON_SHIELD || itemType.weaponType == WEAPON_QUIVER) {
            slotP = CONST_SLOT_RIGHT;
        }
        else if (hasBitSet(SLOTP_HEAD, slotP)) {
            slotP = CONST_SLOT_HEAD;
        }
        else if (hasBitSet(SLOTP_RING, slotP)) {
            slotP = CONST_SLOT_RING;
        }
        else if (hasBitSet(SLOTP_NECKLACE, slotP)) {
            slotP = CONST_SLOT_NECKLACE;
        }
        else if (hasBitSet(SLOTP_ARMOR, slotP)) {
            slotP = CONST_SLOT_ARMOR;
        }
        else if (hasBitSet(SLOTP_LEGS, slotP)) {
            slotP = CONST_SLOT_LEGS;
        }
        else if (hasBitSet(SLOTP_FEET, slotP)) {
            slotP = CONST_SLOT_FEET;
        }
        else if (hasBitSet(SLOTP_AMMO, slotP)) {
            slotP = CONST_SLOT_AMMO;
        }
        else if (hasBitSet(SLOTP_LEFT, slotP) && !hasBitSet(SLOTP_TWO_HAND, slotP)) {
            slotP = CONST_SLOT_LEFT;
        }

        if (hasBitSet(SLOTP_TWO_HAND, slotP)) {
            Thing* leftthing = player->getThing(CONST_SLOT_LEFT);
            if (leftthing) {
                Item* slotLeft_item = leftthing->getItem();
                if (slotLeft_item) {
                    if (slotLeft_item->getID() == item->getID()) {
                        removed = true;
                    }
                    ret = internalMoveItem(slotLeft_item->getParent(), player, 0, slotLeft_item, slotLeft_item->getItemCount(), nullptr);
                }
            }
            Thing* rightthing = player->getThing(CONST_SLOT_RIGHT);
            if (rightthing) {
                Item* slotRight_Item = rightthing->getItem();
                if (slotRight_Item) {
                    if (newitemType.weaponType != WEAPON_DISTANCE || slotRight_Item->getWeaponType() != WEAPON_QUIVER)
                        ret = internalMoveItem(slotRight_Item->getParent(), player, 0, slotRight_Item, slotRight_Item->getItemCount(), nullptr);
                }
                else {
                    return;
                }
            }
            if (!removed) {
                ret = internalMoveItem(item->getParent(), player, CONST_SLOT_LEFT, item, item->getItemCount(), nullptr);
            }
        }
        else if (hasBitSet(SLOTP_RING, slotP)) {
            Thing* ringthing = player->getThing(CONST_SLOT_RING);
            if (ringthing) {
                Item* slotRing_Item = ringthing->getItem();
                if (slotRing_Item) {
                    ret = internalMoveItem(slotRing_Item->getParent(), player, 0, slotRing_Item, slotRing_Item->getItemCount(), nullptr);
                    if (slotRing_Item->getID() == item->getID()) {
                        removed = true;
                    }
                }
                else {
                    return;
                }
            }
            if (!removed) {
                ret = internalMoveItem(item->getParent(), player, CONST_SLOT_RING, item, item->getItemCount(), nullptr);
            }
        }
        else if (slotP == CONST_SLOT_RIGHT) {
            Thing* rightthing = player->getThing(CONST_SLOT_RIGHT);
            if (rightthing) {
                Item* slotRight_Item = rightthing->getItem();
                if (slotRight_Item) {
                    if (slotRight_Item->getID() == item->getID()) {
                        removed = true;
                    }
                    ret = internalMoveItem(slotRight_Item->getParent(), player, 0, slotRight_Item, slotRight_Item->getItemCount(), nullptr);
                }
                else {
                    return;
                }
            }
            Thing* leftthing = player->getThing(CONST_SLOT_LEFT);
            if (leftthing) {
                Item* slotLeft_item = leftthing->getItem();
                if (slotLeft_item) {
                    ItemType& it = Item::items.getItemType(slotLeft_item->getID());
                    if (hasBitSet(SLOTP_TWO_HAND, it.slotPosition)) {
                        if (newitemType.weaponType != WEAPON_QUIVER || slotLeft_item->getWeaponType() != WEAPON_DISTANCE)
                            ret = internalMoveItem(slotLeft_item->getParent(), player, 0, slotLeft_item, slotLeft_item->getItemCount(), nullptr);
                    }
                }
                else {
                    return;
                }
            }
            if (!removed) {
                ret = internalMoveItem(item->getParent(), player, slotP, item, item->getItemCount(), nullptr);
            }
        }
        else if (slotP) {
            if (newitemType.stackable) {
                Thing* ammothing = player->getThing(slotP);
                if (ammothing) {
                    Item* ammoItem = ammothing->getItem();
                    if (ammoItem) {
                        if (ammoItem->getID() == item->getID()) {
                            if (item->getDuration() > 0 ||
                                ammoItem->getItemCount() == 100 ||
                                ammoItem->getItemCount() == player->getItemTypeCount(ammoItem->getID())) {
                                return;
                            }
                        }
                        else {
                            if (ret != RETURNVALUE_NOERROR) {
                                ret = internalMoveItem(ammoItem->getParent(), player, 0, ammoItem, ammoItem->getItemCount(), nullptr);
                            }
                        }
                    }
                    else {
                        return;
                    }
                }
                ReturnValue ret2 = player->queryAdd(slotP, *item, item->getItemCount(), 0);
                if (ret2 != RETURNVALUE_NOERROR) {
                    player->sendCancelMessage(ret2);
                    return;
                }
                if (item->getItemCount() < 100 &&
                    item->getItemCount() < player->getItemTypeCount(item->getID(), -1) &&
                    item->getDuration() <= 0) {
                    uint16_t itemId = item->getID();
                    uint16_t count = 0;
                    while (player->getItemTypeCount(item->getID())) {
                        if (count == 100) {
                            break;
                        }
                        Container* mainBP = player->getInventoryItem(CONST_SLOT_BACKPACK)->getContainer();
                        Item* _item = findItemOfType(mainBP, itemId);

                        if (!_item) {
                            break;
                        }

                        if (_item->getItemCount() > 100 - count) {
                            internalRemoveItem(_item, 100 - count);
                            count = 100;
                        }
                        else {
                            count = count + _item->getItemCount();
                            internalRemoveItem(_item, _item->getItemCount());
                        }
                    }
                    Item* newSlotitem = Item::CreateItem(itemId, count);
                    internalAddItem(player, newSlotitem, slotP, FLAG_NOLIMIT);
                    return;
                }
                else {
                    ret = internalMoveItem(item->getParent(), player, slotP, item, item->getItemCount(), nullptr);
                }
            }
            else {
                Thing* slotthing = player->getThing(slotP);
                if (slotthing) {
                    Item* slotItem = slotthing->getItem();
                    if (slotItem) {
                        ret = internalMoveItem(slotItem->getParent(), player, 0, slotItem, slotItem->getItemCount(), nullptr);
                        if (slotItem->getID() == item->getID()) {
                            removed = true;
                        }
                    }
                    else {
                        return;
                    }
                }
                if (!removed) {
                    ret = internalMoveItem(item->getParent(), player, slotP, item, item->getItemCount(), nullptr);
                }
            }
        }
    }
    
    player->setMoveExhaust(600);
    
    if (ret != RETURNVALUE_NOERROR) {
      player->sendCancelMessage(ret);
    }
    return;
}

Thanks in advance!
 
Back
Top