Advertisement
Guest User

[PATCH] External mail

a guest
Sep 5th, 2014
1,355
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.11 KB | None | 0 0
  1. commit 0bd0acb28a24d301d74f7f91b92021dbe5255b1c
  2. Author: kleuser75 <kleuser@gmail.com>
  3. Date:   Sun Aug 31 20:44:15 2014 +0700
  4.  
  5.     [PATCH] External mail
  6.  
  7. diff --git a/sql/updates/Other/mail_external.sql b/sql/updates/Other/mail_external.sql
  8. new file mode 100644
  9. index 0000000..8cd6a05
  10. --- /dev/null
  11. +++ b/sql/updates/Other/mail_external.sql
  12. @@ -0,0 +1,10 @@
  13. +CREATE TABLE `mail_external` (
  14. +  `id` bigint(20) unsigned NOT NULL auto_increment,
  15. +  `receiver` bigint(20) unsigned NOT NULL,
  16. +  `subject` varchar(200) default 'Support Message',
  17. +  `message` varchar(500) default 'Support Message',
  18. +  `money` bigint(20) unsigned NOT NULL default '0',
  19. +  `item` bigint(20) unsigned NOT NULL default '0',
  20. +  `item_count` bigint(20) unsigned NOT NULL default '0',
  21. +  PRIMARY KEY  (`id`)
  22. +) ENGINE=MyISAM AUTO_INCREMENT=7525 DEFAULT CHARSET=utf8;
  23. \ No newline at end of file
  24. diff --git a/src/server/game/Mails/Mail.cpp b/src/server/game/Mails/Mail.cpp
  25. index 2c65e36..684d123 100644
  26. --- a/src/server/game/Mails/Mail.cpp
  27. +++ b/src/server/game/Mails/Mail.cpp
  28. @@ -20,6 +20,7 @@
  29.  #include "Mail.h"
  30.  #include "Log.h"
  31.  #include "World.h"
  32. +#include "WorldSession.h"
  33.  #include "ObjectMgr.h"
  34.  #include "Player.h"
  35.  #include "Unit.h"
  36. @@ -281,3 +282,64 @@ void MailDraft::SendMailTo(SQLTransaction& trans, MailReceiver const& receiver,
  37.          deleteIncludedItems(temp);
  38.      }
  39.  }
  40. +
  41. +void WorldSession::SendExternalMails()
  42. +{
  43. +    TC_LOG_DEBUG("entities.player.character", "External Mail> Sending mails in queue...");
  44. +  
  45. +    PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_GET_EXTERNAL_MAIL);
  46. +    PreparedQueryResult result = CharacterDatabase.Query(stmt);
  47. +    if (!result)
  48. +    {
  49. +        TC_LOG_DEBUG("entities.player.character", "External Mail> No mails in queue...");
  50. +        return;
  51. +    }
  52. +
  53. +    SQLTransaction trans = CharacterDatabase.BeginTransaction();
  54. +
  55. +    MailDraft* mail = NULL;
  56. +
  57. +    do
  58. +    {
  59. +        Field *fields = result->Fetch();
  60. +        uint32 id = fields[0].GetUInt32();
  61. +        uint32 receiver_guid = fields[1].GetUInt32();
  62. +        std::string subject = fields[2].GetString();
  63. +        std::string body = fields[3].GetString();
  64. +        uint32 money = fields[4].GetUInt32();
  65. +        uint32 itemId = fields[5].GetUInt32();
  66. +        uint32 itemCount = fields[6].GetUInt32(); 
  67. +
  68. +        Player *receiver = ObjectAccessor::FindPlayer(receiver_guid);
  69. +
  70. +        mail = new MailDraft(subject, body);  
  71. +  
  72. +        if (money)
  73. +        {
  74. +            TC_LOG_DEBUG("entities.player.character", "External Mail> Adding money");
  75. +            mail->AddMoney(money);
  76. +        }
  77. +
  78. +        if (itemId)   
  79. +        {
  80. +             TC_LOG_DEBUG("entities.player.character", "External Mail> Adding %u of item with id %u", itemCount, itemId);
  81. +             if(Item* mailItem = Item::CreateItem(itemId, itemCount)) 
  82. +             {
  83. +                 mailItem->SaveToDB(trans);   
  84. +                 mail->AddItem(mailItem);
  85. +             }
  86. +        } 
  87. +
  88. +        mail->SendMailTo(trans, receiver ? receiver : MailReceiver(receiver_guid), MailSender(MAIL_NORMAL, 0, MAIL_STATIONERY_GM), MAIL_CHECK_MASK_RETURNED);
  89. +        delete mail;
  90. +
  91. +        stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_EXTERNAL_MAIL);
  92. +        stmt->setUInt32(0, id);
  93. +        trans->Append(stmt);
  94. +
  95. +        TC_LOG_DEBUG("entities.player.character", "External Mail> Mail sent");
  96. +   } while (result->NextRow());
  97. +  
  98. +   CharacterDatabase.CommitTransaction(trans);
  99. +   TC_LOG_DEBUG("entities.player.character", "External Mail> All Mails Sent..."); 
  100. +}
  101. \ No newline at end of file
  102. diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h
  103. index f7269ae..26d6cef 100644
  104. --- a/src/server/game/Server/WorldSession.h
  105. +++ b/src/server/game/Server/WorldSession.h
  106. @@ -340,6 +340,7 @@ class WorldSession
  107.              }
  108.          }
  109.          //used with item_page table
  110. +       static void SendExternalMails();
  111.          bool SendItemInfo(uint32 itemid, WorldPacket data);
  112.          //auction
  113.          void SendAuctionHello(uint64 guid, Creature* unit);
  114. diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp
  115. index 03531cc..d954970 100644
  116. --- a/src/server/game/World/World.cpp
  117. +++ b/src/server/game/World/World.cpp
  118. @@ -1267,6 +1267,10 @@ void World::LoadConfigSettings(bool reload)
  119.      m_int_configs[CONFIG_GUILD_DAILY_XP_CAP] = sConfigMgr->GetIntDefault("Guild.DailyXPCap", 7807500);
  120.      m_int_configs[CONFIG_GUILD_WEEKLY_REP_CAP] = sConfigMgr->GetIntDefault("Guild.WeeklyReputationCap", 4375);
  121.  
  122. +   // External Mail
  123. +    m_bool_configs[CONFIG_EXTERNAL_MAIL_ENABLE] = sConfigMgr->GetBoolDefault("External.Mail.Enable", false);
  124. +    m_int_configs[CONFIG_EXTERNAL_MAIL_INTERVAL] = sConfigMgr->GetIntDefault("External.Mail.Interval", 1);
  125. +
  126.      // misc
  127.      m_bool_configs[CONFIG_PDUMP_NO_PATHS] = sConfigMgr->GetBoolDefault("PlayerDump.DisallowPaths", true);
  128.      m_bool_configs[CONFIG_PDUMP_NO_OVERWRITE] = sConfigMgr->GetBoolDefault("PlayerDump.DisallowOverwrite", true);
  129. @@ -1826,7 +1830,9 @@ void World::SetInitialWorldSettings()
  130.      tm localTm;
  131.      localtime_r(&m_gameTime, &localTm);
  132.      mail_timer = ((((localTm.tm_hour + 20) % 24)* HOUR * IN_MILLISECONDS) / m_timers[WUPDATE_AUCTIONS].GetInterval());
  133. -                                                            //1440
  134. +    
  135. +    extmail_timer.SetInterval(m_int_configs[CONFIG_EXTERNAL_MAIL_INTERVAL] * MINUTE * IN_MILLISECONDS);
  136. +
  137.      mail_timer_expires = ((DAY * IN_MILLISECONDS) / (m_timers[WUPDATE_AUCTIONS].GetInterval()));
  138.      TC_LOG_INFO("server.loading", "Mail timer set to: " UI64FMTD ", mail return is called every " UI64FMTD " minutes", uint64(mail_timer), uint64(mail_timer_expires));
  139.  
  140. @@ -2032,7 +2038,18 @@ void World::Update(uint32 diff)
  141.  
  142.      if (m_gameTime > m_NextCurrencyReset)
  143.          ResetCurrencyWeekCap();
  144. -
  145. +        
  146. +     // Handle external mail
  147. +    if (sWorld->getBoolConfig(CONFIG_EXTERNAL_MAIL_ENABLE))
  148. +    {
  149. +        extmail_timer.Update(diff);
  150. +        if (extmail_timer.Passed())
  151. +        {
  152. +            WorldSession::SendExternalMails();
  153. +            extmail_timer.Reset();
  154. +        } 
  155. +    }
  156. +  
  157.      /// <ul><li> Handle auctions when the timer has passed
  158.      if (m_timers[WUPDATE_AUCTIONS].Passed())
  159.      {
  160. diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h
  161. index 149a07d..5611765 100644
  162. --- a/src/server/game/World/World.h
  163. +++ b/src/server/game/World/World.h
  164. @@ -168,7 +168,8 @@ enum WorldBoolConfigs
  165.      CONFIG_DUEL_RESET_COOLDOWN_ON_FINISH,
  166.      CONFIG_DUEL_RESET_COOLDOWN_ONLY_IN_ELWYNN_AND_DUROTAR,
  167.      CONFIG_DUEL_RESET_COOLDOWN_RESET_ENERGY_ON_START,
  168.      CONFIG_DUEL_RESET_COOLDOWN_MAX_ENERGY_ON_START,
  169. +   CONFIG_EXTERNAL_MAIL_ENABLE,
  170.      BOOL_CONFIG_VALUE_COUNT
  171.  };
  172.  
  173. @@ -356,6 +357,7 @@ enum WorldIntConfigs
  174.      CONFIG_BG_REWARD_WINNER_CONQUEST_LAST,
  175.      CONFIG_CREATURE_PICKPOCKET_REFILL,
  176.      CONFIG_AHBOT_UPDATE_INTERVAL,
  177. +   CONFIG_EXTERNAL_MAIL_INTERVAL,
  178.      INT_CONFIG_VALUE_COUNT
  179.  };
  180.  
  181. @@ -806,6 +808,7 @@ class World
  182.          time_t m_startTime;
  183.          time_t m_gameTime;
  184.          IntervalTimer m_timers[WUPDATE_COUNT];
  185. +       IntervalTimer extmail_timer;
  186.          time_t mail_timer;
  187.          time_t mail_timer_expires;
  188.          uint32 m_updateTime, m_updateTimeSum;
  189. diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.cpp b/src/server/shared/Database/Implementation/CharacterDatabase.cpp
  190. index adde80c..e2dd0fc 100644
  191. --- a/src/server/shared/Database/Implementation/CharacterDatabase.cpp
  192. +++ b/src/server/shared/Database/Implementation/CharacterDatabase.cpp
  193. @@ -142,6 +142,9 @@ void CharacterDatabaseConnection::DoPrepareStatements()
  194.      PrepareStatement(CHAR_UPD_MAIL_RETURNED, "UPDATE mail SET sender = ?, receiver = ?, expire_time = ?, deliver_time = ?, cod = 0, checked = ? WHERE id = ?", CONNECTION_ASYNC);
  195.      PrepareStatement(CHAR_UPD_MAIL_ITEM_RECEIVER, "UPDATE mail_items SET receiver = ? WHERE item_guid = ?", CONNECTION_ASYNC);
  196.      PrepareStatement(CHAR_UPD_ITEM_OWNER, "UPDATE item_instance SET owner_guid = ? WHERE guid = ?", CONNECTION_ASYNC);
  197. +    PrepareStatement(CHAR_GET_EXTERNAL_MAIL, "SELECT id, receiver, subject, message, money, item, item_count FROM mail_external ORDER BY id ASC", CONNECTION_SYNCH);
  198. +    PrepareStatement(CHAR_DEL_EXTERNAL_MAIL, "DELETE FROM mail_external WHERE id = ?", CONNECTION_ASYNC);
  199. +
  200.  
  201.      PrepareStatement(CHAR_SEL_ITEM_REFUNDS, "SELECT player_guid, paidMoney, paidExtendedCost FROM item_refund_instance WHERE item_guid = ? AND player_guid = ? LIMIT 1", CONNECTION_SYNCH);
  202.      PrepareStatement(CHAR_SEL_ITEM_BOP_TRADE, "SELECT allowedPlayers FROM item_soulbound_trade_data WHERE itemGuid = ? LIMIT 1", CONNECTION_SYNCH);
  203. diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.h b/src/server/shared/Database/Implementation/CharacterDatabase.h
  204. index e2a046a..fdc5ff7 100644
  205. --- a/src/server/shared/Database/Implementation/CharacterDatabase.h
  206. +++ b/src/server/shared/Database/Implementation/CharacterDatabase.h
  207. @@ -142,6 +142,8 @@ enum CharacterDatabaseStatements
  208.      CHAR_UPD_MAIL_RETURNED,
  209.      CHAR_UPD_MAIL_ITEM_RECEIVER,
  210.      CHAR_UPD_ITEM_OWNER,
  211. +    CHAR_GET_EXTERNAL_MAIL,
  212. +    CHAR_DEL_EXTERNAL_MAIL,
  213.      CHAR_SEL_ITEM_REFUNDS,
  214.      CHAR_SEL_ITEM_BOP_TRADE,
  215.      CHAR_DEL_ITEM_BOP_TRADE,
  216. diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist
  217. index c1dde25..6da38db 100644
  218. --- a/src/server/worldserver/worldserver.conf.dist
  219. +++ b/src/server/worldserver/worldserver.conf.dist
  220. @@ -2596,6 +2596,20 @@ PlayerDump.DisallowOverwrite = 1
  221.  UI.ShowQuestLevelsInDialogs = 0
  222.  
  223.  #
  224. +#    External.Mail.Enable
  225. +#        Enable external mail delivery from mail_external table.
  226. +#        Default: 0 (disabled)
  227. +#                 1 (enabled)
  228. +#
  229. +#    External.Mail.Interval
  230. +#        Mail delivery delay time for item sending from mail_external table, in minutes.
  231. +#        Default: 5 minutes
  232. +#
  233. +
  234. +External.Mail.Enable = 1
  235. +External.Mail.Interval = 5
  236. +
  237. +#
  238.  ###################################################################################################
  239.  
  240.  ###################################
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement