Ce patch permet d'envoyer l'item dans la boite aux lettres si le joueur n'a plus de place dans ses sacs.
Ensuite utilisez cette fonction dans vos scripts si vous avez besoin d'ajouter des items.
Vous pouvez également choisir d'activer ou non l'ajout de l'item dans la boite aux lettres.
src\server\game\Entities\Player\Player.cpp (Vous devez modifier cette fonction déjà présente dans l'objet Player)
[code=cpp]bool Player::AddItem(uint32 itemId, uint32 count)
{
if (count < 1)
return true;
ItemPosCountVec dest;
uint32 noSpaceForCount = 0;
uint8 msg = CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, itemId, count, &noSpaceForCount);
if (msg != EQUIP_ERR_OK)
{
count -= noSpaceForCount;
if (sWorld.getBoolConfig(CONFIG_ADDITEMMAIL_NOT_ENABLE))
{
std::string subject = "Objet recu";
std::string text = "Voici un objet recu par manque de place dans votre inventaire";
uint8 mails_count = 0;
mails_count = GetMailSize();
// extract items
typedef std::pair<uint32,uint32> ItemPair;
typedef std::list< ItemPair > ItemPairs;
ItemPairs items;
if (mails_count > 200)
{
ChatHandler(this).PSendSysMessage("Votre boite aux lettres est pleine!");
return false;
}
ItemPrototype const* item_proto = sObjectMgr.GetItemPrototype(itemId);
if (!item_proto)
{
ChatHandler(this).PSendSysMessage(LANG_COMMAND_ITEMIDINVALID, itemId);
return false;
}
if (item_proto->MaxCount > 0 && noSpaceForCount > uint32(item_proto->MaxCount))
{
ChatHandler(this).PSendSysMessage(LANG_COMMAND_INVALID_ITEM_COUNT, noSpaceForCount,itemId);
return false;
}
while (noSpaceForCount > item_proto->GetMaxStackSize())
{
items.push_back(ItemPair(itemId,item_proto->GetMaxStackSize()));
noSpaceForCount -= item_proto->GetMaxStackSize();
}
items.push_back(ItemPair(itemId,noSpaceForCount));
if (items.size() > MAX_MAIL_ITEMS)
{
ChatHandler(this).PSendSysMessage(LANG_COMMAND_MAIL_ITEMS_LIMIT, MAX_MAIL_ITEMS);
return false;
}
// from console show not existed sender
MailSender sender(MAIL_NORMAL,m_session ? GetGUIDLow() : 0, MAIL_STATIONERY_DEFAULT);
// fill mail
MailDraft draft(subject, text);
SQLTransaction trans = CharacterDatabase.BeginTransaction();
for (ItemPairs::const_iterator itr = items.begin(); itr != items.end(); ++itr)
{
if (Item* item = Item::CreateItem(itr->first,itr->second,m_session ? this : 0))
{
item->SaveToDB(trans); // save for prevent lost at next mail load, if send fail then item will deleted
draft.AddItem(item);
}
}
draft.SendMailTo(trans, MailReceiver(this,GetGUIDLow()), sender);
CharacterDatabase.CommitTransaction(trans);
ChatHandler(this).PSendSysMessage("Vous n'avez pas assez de place dans votre sac. L'objet a ete envoye dans votre boite aux lettres.");
}
else
{
ChatHandler(this).PSendSysMessage(LANG_ITEM_CANNOT_CREATE, itemId, noSpaceForCount);
return false;
}
}
Item* item = StoreNewItem(dest, itemId, true, Item::GenerateItemRandomPropertyId(itemId));
if(item && count > 0)
SendNewItem(item,count,true,false);
return true;
}[/code]
src\server\game\World\World.cpp
[code=diff]@@ -1258,6 +1258,9 @@
+
+ // MAILITEM
+ m_bool_configs[CONFIG_ADDITEMMAIL_NOT_ENABLE] = sConfig.GetBoolDefault("Mailitem.Enable", false);
sScriptMgr.OnConfigLoad(reload);
}[/code]
src\server\game\World\World.h
[code=diff]@@ -171,6 +171,8 @@
+ // MAILITEM
+ CONFIG_ADDITEMMAIL_NOT_ENABLE,
BOOL_CONFIG_VALUE_COUNT
};[/code]
src/server/worldserver/worldserver.conf.dist
[code=diff]@@ -2079,6 +2079,18 @@
+###############################################################################
+# MAILITEM
+#
+# Mailitem.Enable
+# Active le systeme d'envoi de mail si l'inventaire est plein
+# Default: 0 - off
+# 1 - on
+#
+###############################################################################
+
+Mailitem.Enable = 0
+
+###############################################################################
# CUSTOM SERVER OPTIONS
#
# PlayerStart.AllReputation[/code]