diff options
Diffstat (limited to 'src/server')
| -rw-r--r-- | src/server/game/Accounts/RBAC.h | 1 | ||||
| -rw-r--r-- | src/server/game/Handlers/MailHandler.cpp | 49 | ||||
| -rw-r--r-- | src/server/game/Handlers/NPCHandler.cpp | 7 | ||||
| -rw-r--r-- | src/server/game/Server/WorldSession.h | 2 | ||||
| -rw-r--r-- | src/server/scripts/Commands/cs_misc.cpp | 9 | 
5 files changed, 60 insertions, 8 deletions
diff --git a/src/server/game/Accounts/RBAC.h b/src/server/game/Accounts/RBAC.h index 2a10da29c20..90cee269759 100644 --- a/src/server/game/Accounts/RBAC.h +++ b/src/server/game/Accounts/RBAC.h @@ -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 diff --git a/src/server/game/Handlers/MailHandler.cpp b/src/server/game/Handlers/MailHandler.cpp index 5ab24f44a22..4cb06a1d469 100644 --- a/src/server/game/Handlers/MailHandler.cpp +++ b/src/server/game/Handlers/MailHandler.cpp @@ -29,6 +29,39 @@  #include "Item.h"  #include "AccountMgr.h" +bool WorldSession::CanOpenMailBox(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 (!CanOpenMailBox(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 (!CanOpenMailBox(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 (!CanOpenMailBox(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 (!CanOpenMailBox(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 (!CanOpenMailBox(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 (!CanOpenMailBox(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 (!CanOpenMailBox(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 (!CanOpenMailBox(mailbox))          return;      Player* player = _player; diff --git a/src/server/game/Handlers/NPCHandler.cpp b/src/server/game/Handlers/NPCHandler.cpp index df6703980d1..4d78064423c 100644 --- a/src/server/game/Handlers/NPCHandler.cpp +++ b/src/server/game/Handlers/NPCHandler.cpp @@ -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; diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 8b00cb9432e..904006e174d 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -275,6 +275,8 @@ class WorldSession          void SendTrainerList(uint64 guid, std::string const& strTitle);          void SendListInventory(uint64 guid);          void SendShowBank(uint64 guid); +        bool CanOpenMailBox(uint64 guid); +        void SendShowMailBox(uint64 guid);          void SendTabardVendorActivate(uint64 guid);          void SendSpiritResurrect();          void SendBindPoint(Creature* npc); diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp index eb45e8f49f5..094e45d91a2 100644 --- a/src/server/scripts/Commands/cs_misc.cpp +++ b/src/server/scripts/Commands/cs_misc.cpp @@ -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; @@ -2477,6 +2478,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()  | 
