bool Mailbox::sendItem(Item* item) const
{
std::string sender;
std::string receiver;
if (!getReceiver(item, receiver, sender)) {
return false;
}
/**No need to continue if its still empty**/
if (receiver.empty()) {
return false;
}
Player* player = g_game.getPlayerByName(receiver);
if (player) {
if (g_game.internalMoveItem(item->getParent(), player->getInbox(), INDEX_WHEREEVER,
item, item->getItemCount(), nullptr, FLAG_NOLIMIT) == RETURNVALUE_NOERROR) {
g_game.transformItem(item, item->getID() + 1);
player->onReceiveMail();
return true;
}
} else {
Player tmpPlayer(nullptr);
if (!IOLoginData::loadPlayerByName(&tmpPlayer, receiver)) {
return false;
}
if (g_game.internalMoveItem(item->getParent(), tmpPlayer.getInbox(), INDEX_WHEREEVER,
item, item->getItemCount(), nullptr, FLAG_NOLIMIT) == RETURNVALUE_NOERROR) {
g_game.transformItem(item, item->getID() + 1);
IOLoginData::savePlayer(&tmpPlayer);
return true;
}
}
return false;
}
bool Mailbox::getReceiver(Item* item, std::string& receiver, std::string& sender) const
{
const Container* container = item->getContainer();
if (container) {
for (Item* containerItem : container->getItemList()) {
if (containerItem->getID() == ITEM_LABEL && getReceiver(containerItem, receiver, sender)) {
return true;
}
}
return false;
}
const std::string& text = item->getText();
if (text.empty()) {
return false;
}
sender = item->getWriter();
receiver = getFirstLine(text);
trimString(receiver);
return true;
}