Core/Mail: Prevent returning mails sent by GMs or commands

This commit is contained in:
luis
2026-09-22 20:48:55 -03:00
parent ce8f02e48c
commit b3076a01e0
3 changed files with 15 additions and 7 deletions
+6 -1
View File
@@ -299,11 +299,16 @@ void WorldSession::HandleSendMail(WorldPackets::Mail::SendMail& sendMail)
if (mailInfo.Attachments.empty())
mailInfo.Cod = 0;
MailCheckMask mailFlags = mailInfo.Body.empty() ? MAIL_CHECK_MASK_COPIED : MAIL_CHECK_MASK_HAS_BODY;
if (player->IsGameMaster())
mailFlags |= MAIL_CHECK_MASK_NOT_RETURNABLE;
// will delete item or place to receiver mail list
draft
.AddMoney(mailInfo.SendMoney)
.AddCOD(mailInfo.Cod)
.SendMailTo(trans, MailReceiver(ObjectAccessor::FindConnectedPlayer(receiverGuid), receiverGuid.GetCounter()), MailSender(player), mailInfo.Body.empty() ? MAIL_CHECK_MASK_COPIED : MAIL_CHECK_MASK_HAS_BODY, deliver_delay);
.SendMailTo(trans, MailReceiver(ObjectAccessor::FindConnectedPlayer(receiverGuid), receiverGuid.GetCounter()), MailSender(player), mailFlags, deliver_delay);
player->SaveInventoryAndGoldToDB(trans);
CharacterDatabase.CommitTransaction(trans);
+3
View File
@@ -20,6 +20,7 @@
#include "Common.h"
#include "DatabaseEnvFwd.h"
#include "EnumFlag.h"
#include "ObjectGuid.h"
#include <map>
@@ -69,6 +70,8 @@ enum MailCheckMask : uint32
MAIL_CHECK_MASK_COMMERCE = 0x10000, ///< WoW Token mail.
};
DEFINE_ENUM_FLAG(MailCheckMask);
// gathered from Stationery.dbc
enum MailStationery
{
+6 -6
View File
@@ -36,7 +36,7 @@ using namespace Trinity::ChatCommands;
class send_commandscript : public CommandScript
{
public:
send_commandscript() : CommandScript("send_commandscript") { }
send_commandscript() : CommandScript("send_commandscript") {}
std::span<ChatCommandBuilder const> GetCommands() const override
{
@@ -83,7 +83,7 @@ public:
// msgSubject, msgText isn't NUL after prev. check
std::string subject = msgSubject;
std::string text = msgText;
std::string text = msgText;
// from console, use non-existing sender
MailSender sender(MAIL_NORMAL, handler->GetSession() ? handler->GetSession()->GetPlayer()->GetGUID().GetCounter() : UI64LIT(0), MAIL_STATIONERY_GM);
@@ -91,7 +91,7 @@ public:
/// @todo Fix poor design
CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
MailDraft(subject, text)
.SendMailTo(trans, MailReceiver(target, targetGuid.GetCounter()), sender);
.SendMailTo(trans, MailReceiver(target, targetGuid.GetCounter()), sender, MAIL_CHECK_MASK_NOT_RETURNABLE);
CharacterDatabase.CommitTransaction(trans);
@@ -128,7 +128,7 @@ public:
// msgSubject, msgText isn't NUL after prev. check
std::string subject = msgSubject;
std::string text = msgText;
std::string text = msgText;
// extract items
typedef std::pair<uint32, uint32> ItemPair;
@@ -201,7 +201,7 @@ public:
}
}
draft.SendMailTo(trans, MailReceiver(receiver, receiverGuid.GetCounter()), sender);
draft.SendMailTo(trans, MailReceiver(receiver, receiverGuid.GetCounter()), sender, MAIL_CHECK_MASK_NOT_RETURNABLE);
CharacterDatabase.CommitTransaction(trans);
std::string nameLink = handler->playerLink(receiverName);
@@ -220,7 +220,7 @@ public:
MailDraft(subject, text)
.AddMoney(money)
.SendMailTo(trans, MailReceiver(receiver.GetConnectedPlayer(), receiver.GetGUID().GetCounter()), sender);
.SendMailTo(trans, MailReceiver(receiver.GetConnectedPlayer(), receiver.GetGUID().GetCounter()), sender, MAIL_CHECK_MASK_NOT_RETURNABLE);
CharacterDatabase.CommitTransaction(trans);