• 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!
  • 2026 staff recruitment is open! Check it out and consider applying!

Make runes from backpack!

Blasphemy

Well-Known Member
Joined
Jan 5, 2012
Messages
387
Reaction score
71
I'm very very noob on c++, what should I modify to make runes can conjure from anywhere in players inventory?

Thanks!


C++:
bool ConjureSpell::conjureItem(Creature* creature) const
{
    Player* player = creature->getPlayer();
    if (!player) {
        return false;
    }

    int32_t value;
    if (player->getStorageValue(666, value) || player->getStorageValue(777, value)) {
        if (value > 0) {
            player->sendCancelMessage("You cannot conjure items inside the arena.");
            return false;
        }
    }

    const uint32_t conjureCost = getManaCost(creature->getPlayer());
    const uint32_t soulCost = getSoulCost();

    if (reagentId != 0) {
        bool foundReagent = false;

        Item* item = player->getInventoryItem(CONST_SLOT_LEFT);
        if (item && item->getID() == reagentId) {
            foundReagent = true;

            // left arm conjure
            Cylinder* parent = item->getParent();
            g_game.internalRemoveItem(item);

            Item* newItem = Item::CreateItem(conjureId, conjureCount);
            if (!newItem) {
                return false;
            }

            ReturnValue ret = g_game.internalAddItem(parent, newItem);
            if (ret != RETURNVALUE_NOERROR) {
                delete newItem;
                return false;
            }

            g_game.startDecay(newItem);

            Spell::postCastSpell(player, conjureCost, soulCost);
        }

        item = player->getInventoryItem(CONST_SLOT_RIGHT);
        if (item && item->getID() == reagentId && player->getMana() >= conjureCost) {
            foundReagent = true;

            // right arm conjure
            Cylinder* parent = item->getParent();
            g_game.internalRemoveItem(item);

            Item* newItem = Item::CreateItem(conjureId, conjureCount);
            if (!newItem) {
                return false;
            }

            ReturnValue ret = g_game.internalAddItem(parent, newItem);
            if (ret != RETURNVALUE_NOERROR) {
                delete newItem;
                return false;
            }

            g_game.startDecay(newItem);

            Spell::postCastSpell(player, conjureCost, soulCost);
        }

        item = player->getInventoryItem(CONST_SLOT_AMMO);
        if (item && item->getID() == reagentId && player->getMana() >= conjureCost) {
            foundReagent = true;

            // right arm conjure
            Cylinder* parent = item->getParent();
            g_game.internalRemoveItem(item);

            Item* newItem = Item::CreateItem(conjureId, conjureCount);
            if (!newItem) {
                return false;
            }

            ReturnValue ret = g_game.internalAddItem(parent, newItem);
            if (ret != RETURNVALUE_NOERROR) {
                delete newItem;
                return false;
            }

            g_game.startDecay(newItem);

            Spell::postCastSpell(player, conjureCost, soulCost);
        }


        if (!foundReagent) {
            player->sendCancelMessage(RETURNVALUE_YOUNEEDAMAGICITEMTOCASTSPELL);
            g_game.addMagicEffect(player->getPosition(), CONST_ME_POFF);
            return false;
        }
    }
    else {
        Item* newItem = Item::CreateItem(conjureId, conjureCount);
        if (!newItem) {
            return false;
        }

        ReturnValue ret = g_game.internalPlayerAddItem(player, newItem);
        if (ret != RETURNVALUE_NOERROR) {
            delete newItem;
            return false;
        }

        g_game.startDecay(newItem);
        Spell::postCastSpell(player, conjureCost, soulCost);
    }

    postCastSpell(player, true, false);
    g_game.addMagicEffect(player->getPosition(), CONST_ME_MAGIC_RED);
    return true;
}
 
Last edited:
Back
Top