Add mailbox command

This commit is contained in:
Carbenium
2013-12-06 19:13:40 +01:00
parent 2b8fb0d8f6
commit fa2616fe4e
8 changed files with 77 additions and 10 deletions

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,10 @@
SET @id = 775;
-- Add new permissions
DELETE FROM `rbac_permissions` WHERE `id`=@id;
INSERT INTO `rbac_permissions` (`id`, `name`) VALUES
(@id, 'Command: mailbox');
DELETE FROM `rbac_linked_permissions` WHERE `linkedId`=@id;
INSERT INTO `rbac_linked_permissions` (`id`, `linkedId`) VALUES
(196, @id);

View File

@@ -0,0 +1,5 @@
SET @id = 775;
DELETE FROM `command` WHERE `name` = 'mailbox';
INSERT INTO `command` (`name`, `permission`, `help`) VALUES
('mailbox', @id, 'Syntax: .mailbox\r\n\r\nShow your mailbox content.');

View File

@@ -678,6 +678,7 @@ enum RBACPermissions
RBAC_PERM_COMMAND_WP_UNLOAD = 772,
RBAC_PERM_COMMAND_WP_RELOAD = 773,
RBAC_PERM_COMMAND_WP_SHOW = 774,
RBAC_PERM_COMMAND_MAILBOX = 775,
// custom permissions 1000+
RBAC_PERM_MAX

View File

@@ -29,6 +29,39 @@
#include "Item.h"
#include "AccountMgr.h"
bool WorldSession::CheckMailBox(uint64 guid)
{
if (guid == GetPlayer()->GetGUID())
{
if (!HasPermission(rbac::RBAC_PERM_COMMAND_MAILBOX))
{
TC_LOG_WARN("cheat", "%s attempt open mailbox in cheating way.", GetPlayer()->GetName());
return false;
}
}
else if (IS_GAMEOBJECT_GUID(guid))
{
if(!GetPlayer()->GetGameObjectIfCanInteractWith(guid, GAMEOBJECT_TYPE_MAILBOX))
return false;
}
else if (IS_CRE_OR_VEH_OR_PET_GUID(guid))
{
Creature* creature = GetPlayer()->GetNPCIfCanInteractWith(guid, UNIT_NPC_FLAG_NONE);
if (!creature)
return false;
if (!(creature->GetCreatureTemplate()->type_flags & CREATURE_TYPEFLAGS_UNK23))
return false;
if (creature->GetOwnerGUID() != GetPlayer()->GetGUID())
return false;
}
else
return false;
return true;
}
void WorldSession::HandleSendMail(WorldPacket& recvData)
{
uint64 mailbox, unk3;
@@ -62,7 +95,7 @@ void WorldSession::HandleSendMail(WorldPacket& recvData)
// packet read complete, now do check
if (!GetPlayer()->GetGameObjectIfCanInteractWith(mailbox, GAMEOBJECT_TYPE_MAILBOX))
if (!CheckMailBox(mailbox))
return;
if (receiverName.empty())
@@ -307,7 +340,7 @@ void WorldSession::HandleMailMarkAsRead(WorldPacket& recvData)
recvData >> mailbox;
recvData >> mailId;
if (!GetPlayer()->GetGameObjectIfCanInteractWith(mailbox, GAMEOBJECT_TYPE_MAILBOX))
if (!CheckMailBox(mailbox))
return;
Player* player = _player;
@@ -331,7 +364,7 @@ void WorldSession::HandleMailDelete(WorldPacket& recvData)
recvData >> mailId;
recvData.read_skip<uint32>(); // mailTemplateId
if (!GetPlayer()->GetGameObjectIfCanInteractWith(mailbox, GAMEOBJECT_TYPE_MAILBOX))
if (!CheckMailBox(mailbox))
return;
Mail* m = _player->GetMail(mailId);
@@ -359,7 +392,7 @@ void WorldSession::HandleMailReturnToSender(WorldPacket& recvData)
recvData >> mailId;
recvData.read_skip<uint64>(); // original sender GUID for return to, not used
if (!GetPlayer()->GetGameObjectIfCanInteractWith(mailbox, GAMEOBJECT_TYPE_MAILBOX))
if (!CheckMailBox(mailbox))
return;
Player* player = _player;
@@ -424,7 +457,7 @@ void WorldSession::HandleMailTakeItem(WorldPacket& recvData)
recvData >> mailId;
recvData >> itemId; // item guid low
if (!GetPlayer()->GetGameObjectIfCanInteractWith(mailbox, GAMEOBJECT_TYPE_MAILBOX))
if (!CheckMailBox(mailbox))
return;
Player* player = _player;
@@ -518,7 +551,7 @@ void WorldSession::HandleMailTakeMoney(WorldPacket& recvData)
recvData >> mailbox;
recvData >> mailId;
if (!GetPlayer()->GetGameObjectIfCanInteractWith(mailbox, GAMEOBJECT_TYPE_MAILBOX))
if (!CheckMailBox(mailbox))
return;
Player* player = _player;
@@ -555,7 +588,7 @@ void WorldSession::HandleGetMailList(WorldPacket& recvData)
uint64 mailbox;
recvData >> mailbox;
if (!GetPlayer()->GetGameObjectIfCanInteractWith(mailbox, GAMEOBJECT_TYPE_MAILBOX))
if (!CheckMailBox(mailbox))
return;
Player* player = _player;
@@ -678,7 +711,7 @@ void WorldSession::HandleMailCreateTextItem(WorldPacket& recvData)
recvData >> mailbox;
recvData >> mailId;
if (!GetPlayer()->GetGameObjectIfCanInteractWith(mailbox, GAMEOBJECT_TYPE_MAILBOX))
if (!CheckMailBox(mailbox))
return;
Player* player = _player;

View File

@@ -103,6 +103,13 @@ void WorldSession::SendShowBank(uint64 guid)
SendPacket(&data);
}
void WorldSession::SendShowMailBox(uint64 guid)
{
WorldPacket data(SMSG_SHOW_MAILBOX, 8);
data << guid;
SendPacket(&data);
}
void WorldSession::HandleTrainerListOpcode(WorldPacket& recvData)
{
uint64 guid;

View File

@@ -275,6 +275,8 @@ class WorldSession
void SendTrainerList(uint64 guid, std::string const& strTitle);
void SendListInventory(uint64 guid);
void SendShowBank(uint64 guid);
bool CheckMailBox(uint64 guid);
void SendShowMailBox(uint64 guid);
void SendTabardVendorActivate(uint64 guid);
void SendSpiritResurrect();
void SendBindPoint(Creature* npc);

View File

@@ -94,6 +94,7 @@ public:
{ "unpossess", rbac::RBAC_PERM_COMMAND_UNPOSSESS, false, &HandleUnPossessCommand, "", NULL },
{ "unstuck", rbac::RBAC_PERM_COMMAND_UNSTUCK, true, &HandleUnstuckCommand, "", NULL },
{ "wchange", rbac::RBAC_PERM_COMMAND_WCHANGE, false, &HandleChangeWeather, "", NULL },
{ "mailbox", rbac::RBAC_PERM_COMMAND_MAILBOX, false, &HandleMailBoxCommand, "", NULL },
{ NULL, 0, false, NULL, "", NULL }
};
return commandTable;
@@ -2464,6 +2465,14 @@ public:
player->StopCastingBindSight();
return true;
}
static bool HandleMailBoxCommand(ChatHandler* handler, char const* /*args*/)
{
Player* player = handler->GetSession()->GetPlayer();
handler->GetSession()->SendShowMailBox(player->GetGUID());
return true;
}
};
void AddSC_misc_commandscript()