diff --git a/sql/mangos.sql b/sql/mangos.sql index ffb4afddb..9c8ac7114 100644 --- a/sql/mangos.sql +++ b/sql/mangos.sql @@ -24,7 +24,7 @@ CREATE TABLE `db_version` ( `version` varchar(120) default NULL, `creature_ai_version` varchar(120) default NULL, `cache_id` int(10) default '0', - `required_11549_01_mangos_spell_proc_event` bit(1) default NULL + `required_11560_01_mangos_command` bit(1) default NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Used DB version notes'; -- @@ -649,6 +649,7 @@ INSERT INTO `command` VALUES ('lookup taxinode',3,'Syntax: .lookup taxinode $substring\r\n\r\nSearch and output all taxinodes with provide $substring in name.'), ('lookup tele',1,'Syntax: .lookup tele $substring\r\n\r\nSearch and output all .tele command locations with provide $substring in name.'), ('lookup title',2,'Syntax: .lookup title $$namepart\r\n\r\nLooks up a title by $namepart, and returns all matches with their title ID\'s and index\'s.'), +('mailbox',3,'Syntax: .mailbox\r\n\r\nShow your mailbox content.'), ('maxskill',3,'Syntax: .maxskill\r\nSets all skills of the targeted player to their maximum VALUESfor its current level.'), ('modify arena',1,'Syntax: .modify arena #value\r\nAdd $amount arena points to the selected player.'), ('modify aspeed',1,'Syntax: .modify aspeed #rate\r\n\r\nModify all speeds -run,swim,run back,swim back- of the selected player to \"normalbase speed for this move type\"*rate. If no player is selected, modify your speed.\r\n\r\n #rate may range from 0.1 to 10.'), diff --git a/sql/updates/11560_01_mangos_command.sql b/sql/updates/11560_01_mangos_command.sql new file mode 100644 index 000000000..0659af83c --- /dev/null +++ b/sql/updates/11560_01_mangos_command.sql @@ -0,0 +1,6 @@ +ALTER TABLE db_version CHANGE COLUMN required_11549_01_mangos_spell_proc_event required_11560_01_mangos_command bit; + +DELETE FROM command WHERE name = 'mailbox'; + +INSERT INTO command (name, security, help) VALUES +('mailbox',3,'Syntax: .mailbox\r\n\r\nShow your mailbox content.'); diff --git a/src/game/Chat.cpp b/src/game/Chat.cpp index 7b6421dca..ab9f6ba96 100644 --- a/src/game/Chat.cpp +++ b/src/game/Chat.cpp @@ -749,6 +749,7 @@ ChatCommand * ChatHandler::getCommandTable() { "additem", SEC_ADMINISTRATOR, false, &ChatHandler::HandleAddItemCommand, "", NULL }, { "additemset", SEC_ADMINISTRATOR, false, &ChatHandler::HandleAddItemSetCommand, "", NULL }, { "bank", SEC_ADMINISTRATOR, false, &ChatHandler::HandleBankCommand, "", NULL }, + { "mailbox", SEC_ADMINISTRATOR, false, &ChatHandler::HandleMailBoxCommand, "", NULL }, { "wchange", SEC_ADMINISTRATOR, false, &ChatHandler::HandleChangeWeatherCommand, "", NULL }, { "ticket", SEC_GAMEMASTER, true, &ChatHandler::HandleTicketCommand, "", NULL }, { "delticket", SEC_GAMEMASTER, true, &ChatHandler::HandleDelTicketCommand, "", NULL }, diff --git a/src/game/Chat.h b/src/game/Chat.h index 9a8a36d7f..afd27368c 100644 --- a/src/game/Chat.h +++ b/src/game/Chat.h @@ -570,6 +570,7 @@ class MANGOS_DLL_SPEC ChatHandler bool HandleBankCommand(char* args); bool HandleChangeWeatherCommand(char* args); bool HandleKickPlayerCommand(char* args); + bool HandleMailBoxCommand(char* args); bool HandleTicketCommand(char* args); bool HandleDelTicketCommand(char* args); diff --git a/src/game/Level3.cpp b/src/game/Level3.cpp index edad06b5a..12cb224c5 100644 --- a/src/game/Level3.cpp +++ b/src/game/Level3.cpp @@ -4502,6 +4502,12 @@ bool ChatHandler::HandleBankCommand(char* /*args*/) return true; } +bool ChatHandler::HandleMailBoxCommand(char* /*args*/) +{ + m_session->SendShowMailBox(m_session->GetPlayer()->GetObjectGuid()); + return true; +} + bool ChatHandler::HandleStableCommand(char* /*args*/) { m_session->SendStablePet(m_session->GetPlayer()->GetObjectGuid()); diff --git a/src/game/MailHandler.cpp b/src/game/MailHandler.cpp index e2817d6ef..f7403de8f 100644 --- a/src/game/MailHandler.cpp +++ b/src/game/MailHandler.cpp @@ -36,6 +36,32 @@ #include "WorldPacket.h" #include "WorldSession.h" #include "Opcodes.h" +#include "Chat.h" + +bool WorldSession::CheckMailBox(ObjectGuid guid) +{ + // GM case + if (guid == GetPlayer()->GetObjectGuid()) + { + // command case will return only if player have real access to command + if (!ChatHandler(GetPlayer()).FindCommand("mailbox")) + { + DEBUG_LOG("%s attempt open mailbox in cheating way.", guid.GetString().c_str()); + return false; + } + } + // mailbox case + else + { + if (!GetPlayer()->GetGameObjectIfCanInteractWith(guid, GAMEOBJECT_TYPE_MAILBOX)) + { + DEBUG_LOG("Mailbox %s not found or you can't interact with him.", guid.GetString().c_str()); + return false; + } + } + + return true; +} /** * Handles the Packet sent by the client when sending a mail. @@ -95,7 +121,7 @@ void WorldSession::HandleSendMail(WorldPacket & recv_data ) // packet read complete, now do check - if (!GetPlayer()->GetGameObjectIfCanInteractWith(mailboxGuid, GAMEOBJECT_TYPE_MAILBOX)) + if (!CheckMailBox(mailboxGuid)) return; if (receiver.empty()) @@ -295,7 +321,7 @@ void WorldSession::HandleMailMarkAsRead(WorldPacket & recv_data ) recv_data >> mailboxGuid; recv_data >> mailId; - if (!GetPlayer()->GetGameObjectIfCanInteractWith(mailboxGuid, GAMEOBJECT_TYPE_MAILBOX)) + if (!CheckMailBox(mailboxGuid)) return; Player *pl = _player; @@ -326,7 +352,7 @@ void WorldSession::HandleMailDelete(WorldPacket & recv_data ) recv_data >> mailId; recv_data.read_skip(); // mailTemplateId - if (!GetPlayer()->GetGameObjectIfCanInteractWith(mailboxGuid, GAMEOBJECT_TYPE_MAILBOX)) + if (!CheckMailBox(mailboxGuid)) return; Player* pl = _player; @@ -362,7 +388,7 @@ void WorldSession::HandleMailReturnToSender(WorldPacket & recv_data ) recv_data >> mailId; recv_data.read_skip(); // original sender GUID for return to, not used - if (!GetPlayer()->GetGameObjectIfCanInteractWith(mailboxGuid, GAMEOBJECT_TYPE_MAILBOX)) + if (!CheckMailBox(mailboxGuid)) return; Player *pl = _player; @@ -421,7 +447,7 @@ void WorldSession::HandleMailTakeItem(WorldPacket & recv_data ) recv_data >> mailId; recv_data >> itemId; // item guid low - if (!GetPlayer()->GetGameObjectIfCanInteractWith(mailboxGuid, GAMEOBJECT_TYPE_MAILBOX)) + if (!CheckMailBox(mailboxGuid)) return; Player* pl = _player; @@ -516,7 +542,7 @@ void WorldSession::HandleMailTakeMoney(WorldPacket & recv_data ) recv_data >> mailboxGuid; recv_data >> mailId; - if (!GetPlayer()->GetGameObjectIfCanInteractWith(mailboxGuid, GAMEOBJECT_TYPE_MAILBOX)) + if (!CheckMailBox(mailboxGuid)) return; Player *pl = _player; @@ -551,7 +577,7 @@ void WorldSession::HandleGetMailList(WorldPacket & recv_data ) ObjectGuid mailboxGuid; recv_data >> mailboxGuid; - if (!GetPlayer()->GetGameObjectIfCanInteractWith(mailboxGuid, GAMEOBJECT_TYPE_MAILBOX)) + if (!CheckMailBox(mailboxGuid)) return; // client can't work with packets > max int16 value @@ -680,7 +706,7 @@ void WorldSession::HandleMailCreateTextItem(WorldPacket & recv_data ) recv_data >> mailboxGuid; recv_data >> mailId; - if (!GetPlayer()->GetGameObjectIfCanInteractWith(mailboxGuid, GAMEOBJECT_TYPE_MAILBOX)) + if (!CheckMailBox(mailboxGuid)) return; Player *pl = _player; diff --git a/src/game/NPCHandler.cpp b/src/game/NPCHandler.cpp index b09647bfd..9a7b26082 100644 --- a/src/game/NPCHandler.cpp +++ b/src/game/NPCHandler.cpp @@ -96,6 +96,13 @@ void WorldSession::SendShowBank(ObjectGuid guid) SendPacket(&data); } +void WorldSession::SendShowMailBox(ObjectGuid guid) +{ + WorldPacket data(SMSG_SHOW_MAILBOX, 8); + data << ObjectGuid(guid); + SendPacket(&data); +} + void WorldSession::HandleTrainerListOpcode( WorldPacket & recv_data ) { ObjectGuid guid; diff --git a/src/game/WorldSession.h b/src/game/WorldSession.h index 4a3b1b795..f54113e93 100644 --- a/src/game/WorldSession.h +++ b/src/game/WorldSession.h @@ -300,6 +300,8 @@ class MANGOS_DLL_SPEC WorldSession void SendListInventory(ObjectGuid guid); bool CheckBanker(ObjectGuid guid); void SendShowBank(ObjectGuid guid); + bool CheckMailBox(ObjectGuid guid); + void SendShowMailBox(ObjectGuid guid); void SendTabardVendorActivate(ObjectGuid guid); void SendSpiritResurrect(); void SendBindPoint(Creature* npc); diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index dc068027b..9b4417cd5 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "11559" + #define REVISION_NR "11560" #endif // __REVISION_NR_H__ diff --git a/src/shared/revision_sql.h b/src/shared/revision_sql.h index 41c6eefd5..8038a94c9 100644 --- a/src/shared/revision_sql.h +++ b/src/shared/revision_sql.h @@ -1,6 +1,6 @@ #ifndef __REVISION_SQL_H__ #define __REVISION_SQL_H__ #define REVISION_DB_CHARACTERS "required_11436_01_characters_character_queststatus" - #define REVISION_DB_MANGOS "required_11549_01_mangos_spell_proc_event" + #define REVISION_DB_MANGOS "required_11560_01_mangos_command" #define REVISION_DB_REALMD "required_10008_01_realmd_realmd_db_version" #endif // __REVISION_SQL_H__