From 540a05322fdc51ad2230a3db3873a39854b6e097 Mon Sep 17 00:00:00 2001 From: DiSlord Date: Sun, 9 Nov 2008 01:53:03 +0300 Subject: [PATCH 1/4] * Fix reset combopoints on miss/parry/immune and etc. --- src/game/Spell.cpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp index e2aed2c74..d59b37b9b 100644 --- a/src/game/Spell.cpp +++ b/src/game/Spell.cpp @@ -2528,7 +2528,18 @@ void Spell::finish(bool ok) // Clear combo at finish state if(m_caster->GetTypeId() == TYPEID_PLAYER && NeedsComboPoints(m_spellInfo)) - ((Player*)m_caster)->ClearComboPoints(); + { + // Not drop combopoints if any miss exist + bool needDrop = true; + for(std::list::iterator ihit= m_UniqueTargetInfo.begin();ihit != m_UniqueTargetInfo.end();++ihit) + if (ihit->missCondition != SPELL_MISS_NONE) + { + needDrop = false; + break; + } + if (needDrop) + ((Player*)m_caster)->ClearComboPoints(); + } // call triggered spell only at successful cast (after clear combo points -> for add some if need) if(!m_TriggerSpells.empty()) From 397d8555694f164eb3dbecbd368d059c99117192 Mon Sep 17 00:00:00 2001 From: Arthorius Date: Sun, 9 Nov 2008 09:41:31 +0300 Subject: [PATCH 2/4] [6809] Not reset display model at shapeshift aura remove if it not set at apply. This must resolve problems with model reset at warrior stance switch. Signed-off-by: VladimirMangos --- src/game/SpellAuras.cpp | 3 ++- src/shared/revision_nr.h | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/game/SpellAuras.cpp b/src/game/SpellAuras.cpp index 79a4c9eed..44d50acde 100644 --- a/src/game/SpellAuras.cpp +++ b/src/game/SpellAuras.cpp @@ -2567,7 +2567,8 @@ void Aura::HandleAuraModShapeshift(bool apply, bool Real) } else { - m_target->SetDisplayId(m_target->GetNativeDisplayId()); + if(modelid > 0) + m_target->SetDisplayId(m_target->GetNativeDisplayId()); m_target->SetByteValue(UNIT_FIELD_BYTES_2, 3, FORM_NONE); if(m_target->getClass() == CLASS_DRUID) m_target->setPowerType(POWER_MANA); diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 9b275289f..3a485697c 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 "6808" + #define REVISION_NR "6809" #endif // __REVISION_NR_H__ From ad59efb6d969e4f2359044a0394168c9861b9a48 Mon Sep 17 00:00:00 2001 From: VladimirMangos Date: Sun, 9 Nov 2008 11:01:41 +0300 Subject: [PATCH 3/4] [2008_11_09_01_mangos_command.sql] Create new command .senditems and remove from moderator level command .sendmail possibility send items. --- sql/mangos.sql | 5 +- sql/updates/2008_11_09_01_mangos_command.sql | 6 + sql/updates/Makefile.am | 2 + src/game/Chat.cpp | 3 +- src/game/Chat.h | 4 +- src/game/Level1.cpp | 80 +--------- src/game/Level3.cpp | 149 +++++++++++++++++++ 7 files changed, 171 insertions(+), 78 deletions(-) create mode 100644 sql/updates/2008_11_09_01_mangos_command.sql diff --git a/sql/mangos.sql b/sql/mangos.sql index 74ab26a2f..382abdf70 100644 --- a/sql/mangos.sql +++ b/sql/mangos.sql @@ -22,7 +22,7 @@ DROP TABLE IF EXISTS `db_version`; CREATE TABLE `db_version` ( `version` varchar(120) default NULL, - `required_2008_11_01_02_mangos_command` bit(1) default NULL + `required_2008_11_09_01_mangos_command` bit(1) default NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Used DB version notes'; -- @@ -394,7 +394,8 @@ INSERT INTO `command` VALUES ('revive',3,'Syntax: .revive\r\n\r\nRevive the selected player. If no player is selected, it will revive you.'), ('save',0,'Syntax: .save\r\n\r\nSaves your character.'), ('saveall',1,'Syntax: .saveall\r\n\r\nSave all characters in game.'), -('sendmail',1,'Syntax: .sendmail #playername "#subject" "#text" itemid1[:count1] itemid2[:count2] ... itemidN[:countN]\r\n\r\nSend a mail to a player. Subject and mail text must be in "". If for itemid not provided related count values then expected 1, if count > max items in stack then items will be send in required amount stacks. All stacks amount in mail limited to 12.'), +('senditems',3,'Syntax: .senditems #playername "#subject" "#text" itemid1[:count1] itemid2[:count2] ... itemidN[:countN]\r\n\r\nSend a mail to a player. Subject and mail text must be in "". If for itemid not provided related count values then expected 1, if count > max items in stack then items will be send in required amount stacks. All stacks amount in mail limited to 12.'), +('sendmail',1,'Syntax: .sendmail #playername "#subject" "#text"\r\n\r\nSend a mail to a player. Subject and mail text must be in "".'), ('sendmessage',3,'Syntax: .sendmessage $playername $message\r\n\r\nSend screen message to player from ADMINISTRATOR.'), ('server corpses',2,'Syntax: .server corpses\r\n\r\nTriggering corpses expire check in world.'), ('server exit',4,'Syntax: .server exit\r\n\r\nTerminate mangosd NOW.'), diff --git a/sql/updates/2008_11_09_01_mangos_command.sql b/sql/updates/2008_11_09_01_mangos_command.sql new file mode 100644 index 000000000..a0a114bc5 --- /dev/null +++ b/sql/updates/2008_11_09_01_mangos_command.sql @@ -0,0 +1,6 @@ +ALTER TABLE db_version CHANGE COLUMN required_2008_11_01_02_mangos_command required_2008_11_09_01_mangos_command bit; + +delete from `command` where `name` IN ('senditems','sendmail'); +insert into `command` (`name`, `security`, `help`) values +('senditems',3,'Syntax: .senditems #playername "#subject" "#text" itemid1[:count1] itemid2[:count2] ... itemidN[:countN]\r\n\r\nSend a mail to a player. Subject and mail text must be in "". If for itemid not provided related count values then expected 1, if count > max items in stack then items will be send in required amount stacks. All stacks amount in mail limited to 12.'), +('sendmail',1,'Syntax: .sendmail #playername "#subject" "#text"\r\n\r\nSend a mail to a player. Subject and mail text must be in "".'); diff --git a/sql/updates/Makefile.am b/sql/updates/Makefile.am index 6d6f6f9fe..697618dfd 100644 --- a/sql/updates/Makefile.am +++ b/sql/updates/Makefile.am @@ -127,6 +127,7 @@ pkgdata_DATA = \ 2008_11_07_02_realmd_realmd_db_version.sql \ 2008_11_07_03_characters_guild_bank_tab.sql \ 2008_11_07_04_realmd_account.sql \ + 2008_11_09_01_mangos_command.sql \ README ## Additional files to include when running 'make dist' @@ -235,4 +236,5 @@ EXTRA_DIST = \ 2008_11_07_02_realmd_realmd_db_version.sql \ 2008_11_07_03_characters_guild_bank_tab.sql \ 2008_11_07_04_realmd_account.sql \ + 2008_11_09_01_mangos_command.sql \ README diff --git a/src/game/Chat.cpp b/src/game/Chat.cpp index 1f2bcdd35..0389ef9ec 100644 --- a/src/game/Chat.cpp +++ b/src/game/Chat.cpp @@ -520,7 +520,8 @@ ChatCommand * ChatHandler::getCommandTable() { "password", SEC_PLAYER, false, &ChatHandler::HandlePasswordCommand, "", NULL }, { "lockaccount", SEC_PLAYER, false, &ChatHandler::HandleLockAccountCommand, "", NULL }, { "respawn", SEC_ADMINISTRATOR, false, &ChatHandler::HandleRespawnCommand, "", NULL }, - { "sendmail", SEC_MODERATOR, false, &ChatHandler::HandleSendMailCommand, "", NULL }, + { "senditems", SEC_ADMINISTRATOR, true, &ChatHandler::HandleSendItemsCommand, "", NULL }, + { "sendmail", SEC_MODERATOR, true, &ChatHandler::HandleSendMailCommand, "", NULL }, { "rename", SEC_GAMEMASTER, true, &ChatHandler::HandleRenameCommand, "", NULL }, { "loadscripts", SEC_ADMINISTRATOR, true, &ChatHandler::HandleLoadScriptsCommand, "", NULL }, { "mute", SEC_GAMEMASTER, true, &ChatHandler::HandleMuteCommand, "", NULL }, diff --git a/src/game/Chat.h b/src/game/Chat.h index 28d1b3c8e..1170ec9ff 100644 --- a/src/game/Chat.h +++ b/src/game/Chat.h @@ -114,10 +114,11 @@ class ChatHandler bool HandleGPSCommand(const char* args); bool HandleTaxiCheatCommand(const char* args); bool HandleWhispersCommand(const char* args); - bool HandleSendMailCommand(const char* args); bool HandleNameTeleCommand(const char* args); bool HandleGroupTeleCommand(const char* args); bool HandleDrunkCommand(const char* args); + bool HandleSendItemsCommand(const char* args); + bool HandleSendMailCommand(const char* args); bool HandleEventActiveListCommand(const char* args); bool HandleEventStartCommand(const char* args); @@ -413,6 +414,7 @@ class ChatHandler bool HandleSendMessageCommand(const char * args); bool HandleRepairitemsCommand(const char* args); bool HandleWaterwalkCommand(const char* args); + bool HandleSendMoneyCommand(const char* args); //! Development Commands bool HandleSetValue(const char* args); diff --git a/src/game/Level1.cpp b/src/game/Level1.cpp index 37b8b1493..3bb2475cd 100644 --- a/src/game/Level1.cpp +++ b/src/game/Level1.cpp @@ -1814,7 +1814,7 @@ bool ChatHandler::HandleSendMailCommand(const char* args) if(!*args) return false; - // format: name "subject text" "mail text" item1[:count1] item2[:count2] ... item12[:count12] + // format: name "subject text" "mail text" char* pName = strtok((char*)args, " "); if(!pName) @@ -1861,60 +1861,6 @@ bool ChatHandler::HandleSendMailCommand(const char* args) std::string subject = msgSubject; std::string text = msgText; - // extract items - typedef std::pair ItemPair; - typedef std::list< ItemPair > ItemPairs; - ItemPairs items; - - // get all tail string - char* tail = strtok(NULL, ""); - - // get from tail next item str - while(char* itemStr = strtok(tail, " ")) - { - // and get new tail - tail = strtok(NULL, ""); - - // parse item str - char* itemIdStr = strtok(itemStr, ":"); - char* itemCountStr = strtok(NULL, " "); - - uint32 item_id = atoi(itemIdStr); - if(!item_id) - return false; - - ItemPrototype const* item_proto = objmgr.GetItemPrototype(item_id); - if(!item_proto) - { - PSendSysMessage(LANG_COMMAND_ITEMIDINVALID, item_id); - SetSentErrorMessage(true); - return false; - } - - uint32 item_count = itemCountStr ? atoi(itemCountStr) : 1; - if(item_count < 1 || item_proto->MaxCount && item_count > item_proto->MaxCount) - { - PSendSysMessage(LANG_COMMAND_INVALID_ITEM_COUNT, item_count,item_id); - SetSentErrorMessage(true); - return false; - } - - while(item_count > item_proto->Stackable) - { - items.push_back(ItemPair(item_id,item_proto->Stackable)); - item_count -= item_proto->Stackable; - } - - items.push_back(ItemPair(item_id,item_count)); - - if(items.size() > MAX_MAIL_ITEMS) - { - PSendSysMessage(LANG_COMMAND_MAIL_ITEMS_LIMIT, MAX_MAIL_ITEMS); - SetSentErrorMessage(true); - return false; - } - } - if(!normalizePlayerName(name)) { SendSysMessage(LANG_PLAYER_NOT_FOUND); @@ -1930,30 +1876,16 @@ bool ChatHandler::HandleSendMailCommand(const char* args) return false; } - uint32 sender_guidlo = m_session->GetPlayer()->GetGUIDLow(); + // from console show not existed sender + uint32 sender_guidlo = m_session ? m_session->GetPlayer()->GetGUIDLow() : 0; + uint32 messagetype = MAIL_NORMAL; uint32 stationery = MAIL_STATIONERY_GM; - uint32 itemTextId = 0; - if (!text.empty()) - { - itemTextId = objmgr.CreateItemText( text ); - } + uint32 itemTextId = !text.empty() ? objmgr.CreateItemText( text ) : 0; Player *receiver = objmgr.GetPlayer(receiver_guid); - // fill mail - MailItemsInfo mi; // item list preparing - - for(ItemPairs::const_iterator itr = items.begin(); itr != items.end(); ++itr) - { - if(Item* item = Item::CreateItem(itr->first,itr->second,m_session->GetPlayer())) - { - item->SaveToDB(); // save for prevent lost at next mail load, if send fail then item will deleted - mi.AddItem(item->GetGUIDLow(), item->GetEntry(), item); - } - } - - WorldSession::SendMailTo(receiver,messagetype, stationery, sender_guidlo, GUID_LOPART(receiver_guid), subject, itemTextId, &mi, 0, 0, MAIL_CHECK_MASK_NONE); + WorldSession::SendMailTo(receiver,messagetype, stationery, sender_guidlo, GUID_LOPART(receiver_guid), subject, itemTextId, NULL, 0, 0, MAIL_CHECK_MASK_NONE); PSendSysMessage(LANG_MAIL_SENT, name.c_str()); return true; diff --git a/src/game/Level3.cpp b/src/game/Level3.cpp index 751a1bd91..622156a07 100644 --- a/src/game/Level3.cpp +++ b/src/game/Level3.cpp @@ -6125,6 +6125,155 @@ bool ChatHandler::HandleAccountSetAddonCommand(const char* args) return true; } +//Send items by mail +bool ChatHandler::HandleSendItemsCommand(const char* args) +{ + if(!*args) + return false; + + // format: name "subject text" "mail text" item1[:count1] item2[:count2] ... item12[:count12] + + char* pName = strtok((char*)args, " "); + if(!pName) + return false; + + char* tail1 = strtok(NULL, ""); + if(!tail1) + return false; + + char* msgSubject; + if(*tail1=='"') + msgSubject = strtok(tail1+1, "\""); + else + { + char* space = strtok(tail1, "\""); + if(!space) + return false; + msgSubject = strtok(NULL, "\""); + } + + if (!msgSubject) + return false; + + char* tail2 = strtok(NULL, ""); + if(!tail2) + return false; + + char* msgText; + if(*tail2=='"') + msgText = strtok(tail2+1, "\""); + else + { + char* space = strtok(tail2, "\""); + if(!space) + return false; + msgText = strtok(NULL, "\""); + } + + if (!msgText) + return false; + + // pName, msgSubject, msgText isn't NUL after prev. check + std::string name = pName; + std::string subject = msgSubject; + std::string text = msgText; + + // extract items + typedef std::pair ItemPair; + typedef std::list< ItemPair > ItemPairs; + ItemPairs items; + + // get all tail string + char* tail = strtok(NULL, ""); + + // get from tail next item str + while(char* itemStr = strtok(tail, " ")) + { + // and get new tail + tail = strtok(NULL, ""); + + // parse item str + char* itemIdStr = strtok(itemStr, ":"); + char* itemCountStr = strtok(NULL, " "); + + uint32 item_id = atoi(itemIdStr); + if(!item_id) + return false; + + ItemPrototype const* item_proto = objmgr.GetItemPrototype(item_id); + if(!item_proto) + { + PSendSysMessage(LANG_COMMAND_ITEMIDINVALID, item_id); + SetSentErrorMessage(true); + return false; + } + + uint32 item_count = itemCountStr ? atoi(itemCountStr) : 1; + if(item_count < 1 || item_proto->MaxCount && item_count > item_proto->MaxCount) + { + PSendSysMessage(LANG_COMMAND_INVALID_ITEM_COUNT, item_count,item_id); + SetSentErrorMessage(true); + return false; + } + + while(item_count > item_proto->Stackable) + { + items.push_back(ItemPair(item_id,item_proto->Stackable)); + item_count -= item_proto->Stackable; + } + + items.push_back(ItemPair(item_id,item_count)); + + if(items.size() > MAX_MAIL_ITEMS) + { + PSendSysMessage(LANG_COMMAND_MAIL_ITEMS_LIMIT, MAX_MAIL_ITEMS); + SetSentErrorMessage(true); + return false; + } + } + + if(!normalizePlayerName(name)) + { + SendSysMessage(LANG_PLAYER_NOT_FOUND); + SetSentErrorMessage(true); + return false; + } + + uint64 receiver_guid = objmgr.GetPlayerGUIDByName(name); + if(!receiver_guid) + { + SendSysMessage(LANG_PLAYER_NOT_FOUND); + SetSentErrorMessage(true); + return false; + } + + // from console show not existed sender + uint32 sender_guidlo = m_session ? m_session->GetPlayer()->GetGUIDLow() : 0; + + uint32 messagetype = MAIL_NORMAL; + uint32 stationery = MAIL_STATIONERY_GM; + uint32 itemTextId = !text.empty() ? objmgr.CreateItemText( text ) : 0; + + Player *receiver = objmgr.GetPlayer(receiver_guid); + + // fill mail + MailItemsInfo mi; // item list preparing + + for(ItemPairs::const_iterator itr = items.begin(); itr != items.end(); ++itr) + { + if(Item* item = Item::CreateItem(itr->first,itr->second,m_session ? m_session->GetPlayer() : 0)) + { + item->SaveToDB(); // save for prevent lost at next mail load, if send fail then item will deleted + mi.AddItem(item->GetGUIDLow(), item->GetEntry(), item); + } + } + + WorldSession::SendMailTo(receiver,messagetype, stationery, sender_guidlo, GUID_LOPART(receiver_guid), subject, itemTextId, &mi, 0, 0, MAIL_CHECK_MASK_NONE); + + PSendSysMessage(LANG_MAIL_SENT, name.c_str()); + return true; +} + /// Send a message to a player in game bool ChatHandler::HandleSendMessageCommand(const char* args) { From 928ea2bdcf33e5dbb3396699df6348cd15178861 Mon Sep 17 00:00:00 2001 From: Fredi Date: Mon, 3 Nov 2008 16:19:23 -0200 Subject: [PATCH 4/4] [6810] Added new command: .sendmoney player "subject" "message" money - Sends a mail with money to a player Signed-off-by: VladimirMangos --- sql/mangos.sql | 3 +- sql/updates/2008_11_09_02_mangos_command.sql | 5 ++ sql/updates/Makefile.am | 2 + src/game/Chat.cpp | 1 + src/game/Chat.h | 2 +- src/game/Level3.cpp | 89 ++++++++++++++++++++ src/shared/revision_nr.h | 2 +- 7 files changed, 101 insertions(+), 3 deletions(-) create mode 100644 sql/updates/2008_11_09_02_mangos_command.sql diff --git a/sql/mangos.sql b/sql/mangos.sql index 382abdf70..0afdf1261 100644 --- a/sql/mangos.sql +++ b/sql/mangos.sql @@ -22,7 +22,7 @@ DROP TABLE IF EXISTS `db_version`; CREATE TABLE `db_version` ( `version` varchar(120) default NULL, - `required_2008_11_09_01_mangos_command` bit(1) default NULL + `required_2008_11_09_02_mangos_command` bit(1) default NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Used DB version notes'; -- @@ -396,6 +396,7 @@ INSERT INTO `command` VALUES ('saveall',1,'Syntax: .saveall\r\n\r\nSave all characters in game.'), ('senditems',3,'Syntax: .senditems #playername "#subject" "#text" itemid1[:count1] itemid2[:count2] ... itemidN[:countN]\r\n\r\nSend a mail to a player. Subject and mail text must be in "". If for itemid not provided related count values then expected 1, if count > max items in stack then items will be send in required amount stacks. All stacks amount in mail limited to 12.'), ('sendmail',1,'Syntax: .sendmail #playername "#subject" "#text"\r\n\r\nSend a mail to a player. Subject and mail text must be in "".'), +('sendmoney','3','Syntax: .sendmoney #playername "#subject" "#text" #money\r\n\r\nSend mail with money to a player. Subject and mail text must be in "".'), ('sendmessage',3,'Syntax: .sendmessage $playername $message\r\n\r\nSend screen message to player from ADMINISTRATOR.'), ('server corpses',2,'Syntax: .server corpses\r\n\r\nTriggering corpses expire check in world.'), ('server exit',4,'Syntax: .server exit\r\n\r\nTerminate mangosd NOW.'), diff --git a/sql/updates/2008_11_09_02_mangos_command.sql b/sql/updates/2008_11_09_02_mangos_command.sql new file mode 100644 index 000000000..50cd5d9ab --- /dev/null +++ b/sql/updates/2008_11_09_02_mangos_command.sql @@ -0,0 +1,5 @@ +ALTER TABLE db_version CHANGE COLUMN required_2008_11_09_01_mangos_command required_2008_11_09_02_mangos_command bit; + +delete from `command` where `name` = 'sendmoney'; +insert into `command` (`name`, `security`, `help`) values +('sendmoney',3,'Syntax: .sendmoney #playername "#subject" "#text" #money\r\n\r\nSend mail with money to a player. Subject and mail text must be in "".'); diff --git a/sql/updates/Makefile.am b/sql/updates/Makefile.am index 697618dfd..d24d427e2 100644 --- a/sql/updates/Makefile.am +++ b/sql/updates/Makefile.am @@ -128,6 +128,7 @@ pkgdata_DATA = \ 2008_11_07_03_characters_guild_bank_tab.sql \ 2008_11_07_04_realmd_account.sql \ 2008_11_09_01_mangos_command.sql \ + 2008_11_09_02_mangos_command.sql \ README ## Additional files to include when running 'make dist' @@ -237,4 +238,5 @@ EXTRA_DIST = \ 2008_11_07_03_characters_guild_bank_tab.sql \ 2008_11_07_04_realmd_account.sql \ 2008_11_09_01_mangos_command.sql \ + 2008_11_09_02_mangos_command.sql \ README diff --git a/src/game/Chat.cpp b/src/game/Chat.cpp index 0389ef9ec..3662ad4e0 100644 --- a/src/game/Chat.cpp +++ b/src/game/Chat.cpp @@ -522,6 +522,7 @@ ChatCommand * ChatHandler::getCommandTable() { "respawn", SEC_ADMINISTRATOR, false, &ChatHandler::HandleRespawnCommand, "", NULL }, { "senditems", SEC_ADMINISTRATOR, true, &ChatHandler::HandleSendItemsCommand, "", NULL }, { "sendmail", SEC_MODERATOR, true, &ChatHandler::HandleSendMailCommand, "", NULL }, + { "sendmoney", SEC_ADMINISTRATOR, true, &ChatHandler::HandleSendMoneyCommand, "", NULL }, { "rename", SEC_GAMEMASTER, true, &ChatHandler::HandleRenameCommand, "", NULL }, { "loadscripts", SEC_ADMINISTRATOR, true, &ChatHandler::HandleLoadScriptsCommand, "", NULL }, { "mute", SEC_GAMEMASTER, true, &ChatHandler::HandleMuteCommand, "", NULL }, diff --git a/src/game/Chat.h b/src/game/Chat.h index 1170ec9ff..86f310ee5 100644 --- a/src/game/Chat.h +++ b/src/game/Chat.h @@ -119,6 +119,7 @@ class ChatHandler bool HandleDrunkCommand(const char* args); bool HandleSendItemsCommand(const char* args); bool HandleSendMailCommand(const char* args); + bool HandleSendMoneyCommand(const char* args); bool HandleEventActiveListCommand(const char* args); bool HandleEventStartCommand(const char* args); @@ -414,7 +415,6 @@ class ChatHandler bool HandleSendMessageCommand(const char * args); bool HandleRepairitemsCommand(const char* args); bool HandleWaterwalkCommand(const char* args); - bool HandleSendMoneyCommand(const char* args); //! Development Commands bool HandleSetValue(const char* args); diff --git a/src/game/Level3.cpp b/src/game/Level3.cpp index 622156a07..14de32781 100644 --- a/src/game/Level3.cpp +++ b/src/game/Level3.cpp @@ -6274,6 +6274,95 @@ bool ChatHandler::HandleSendItemsCommand(const char* args) return true; } +///Send money by mail +bool ChatHandler::HandleSendMoneyCommand(const char* args) +{ + if (!*args) + return false; + + /// format: name "subject text" "mail text" money + + char* pName = strtok((char*)args, " "); + if (!pName) + return false; + + char* tail1 = strtok(NULL, ""); + if (!tail1) + return false; + + char* msgSubject; + if (*tail1=='"') + msgSubject = strtok(tail1+1, "\""); + else + { + char* space = strtok(tail1, "\""); + if (!space) + return false; + msgSubject = strtok(NULL, "\""); + } + + if (!msgSubject) + return false; + + char* tail2 = strtok(NULL, ""); + if (!tail2) + return false; + + char* msgText; + if (*tail2=='"') + msgText = strtok(tail2+1, "\""); + else + { + char* space = strtok(tail2, "\""); + if (!space) + return false; + msgText = strtok(NULL, "\""); + } + + if (!msgText) + return false; + + int32 money = atoi(strtok(NULL, "")); + if (money <= 0) + return false; + + // pName, msgSubject, msgText isn't NUL after prev. check + std::string name = pName; + std::string subject = msgSubject; + std::string text = msgText; + + if (!normalizePlayerName(name)) + { + SendSysMessage(LANG_PLAYER_NOT_FOUND); + SetSentErrorMessage(true); + return false; + } + + uint64 receiver_guid = objmgr.GetPlayerGUIDByName(name); + if (!receiver_guid) + { + SendSysMessage(LANG_PLAYER_NOT_FOUND); + SetSentErrorMessage(true); + return false; + } + + uint32 mailId = objmgr.GenerateMailID(); + + // from console show not existed sender + uint32 sender_guidlo = m_session ? m_session->GetPlayer()->GetGUIDLow() : 0; + + uint32 messagetype = MAIL_NORMAL; + uint32 stationery = MAIL_STATIONERY_GM; + uint32 itemTextId = !text.empty() ? objmgr.CreateItemText( text ) : 0; + + Player *receiver = objmgr.GetPlayer(receiver_guid); + + WorldSession::SendMailTo(receiver,messagetype, stationery, sender_guidlo, GUID_LOPART(receiver_guid), subject, itemTextId, NULL, money, 0, MAIL_CHECK_MASK_NONE); + + PSendSysMessage(LANG_MAIL_SENT, name.c_str()); + return true; +} + /// Send a message to a player in game bool ChatHandler::HandleSendMessageCommand(const char* args) { diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 3a485697c..b5f334137 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 "6809" + #define REVISION_NR "6810" #endif // __REVISION_NR_H__