Envoi d'objets dans la boîte aux lettres si sac plein
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_LI​MIT, 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]
Patch outdated il faudrait remplacer tous les fonctions en singleton comme ca
[code=cpp]sTruc->MaMethode();[/code]
au lieu de
[code=cpp]sTruc.MaMethode();[/code]
Je t'en prie fais toi plaisir Clin
@Markz.. un singleton c'est pas ça... je ne sais pas où tu a lu la définition de ce qu'est le Template Singleton en informatique Clin

Mais ta remarque est tout à fait juste. (Faut utiliser des pointeurs)
Citation :Ensuite utilisez cette fonction dans vos scripts si vous avez besoin d'ajouter des items.
Je n'ai pas bien compris cette phrase.
EN gros si tu fais une fonction qui t'ajoutes un item et que el mec n'a plsu de place ca te l’envoi par la poste.

mais c'est un USINE A GAZ ce truc (mais en principe ca marche).

Il suffit de réutiliser des appels à HandleSendItem .... et pas tout recoder...

Retourner en haut Accueil