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;
}