Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- commit 0bd0acb28a24d301d74f7f91b92021dbe5255b1c
- Author: kleuser75 <kleuser@gmail.com>
- Date: Sun Aug 31 20:44:15 2014 +0700
- [PATCH] External mail
- diff --git a/sql/updates/Other/mail_external.sql b/sql/updates/Other/mail_external.sql
- new file mode 100644
- index 0000000..8cd6a05
- --- /dev/null
- +++ b/sql/updates/Other/mail_external.sql
- @@ -0,0 +1,10 @@
- +CREATE TABLE `mail_external` (
- + `id` bigint(20) unsigned NOT NULL auto_increment,
- + `receiver` bigint(20) unsigned NOT NULL,
- + `subject` varchar(200) default 'Support Message',
- + `message` varchar(500) default 'Support Message',
- + `money` bigint(20) unsigned NOT NULL default '0',
- + `item` bigint(20) unsigned NOT NULL default '0',
- + `item_count` bigint(20) unsigned NOT NULL default '0',
- + PRIMARY KEY (`id`)
- +) ENGINE=MyISAM AUTO_INCREMENT=7525 DEFAULT CHARSET=utf8;
- \ No newline at end of file
- diff --git a/src/server/game/Mails/Mail.cpp b/src/server/game/Mails/Mail.cpp
- index 2c65e36..684d123 100644
- --- a/src/server/game/Mails/Mail.cpp
- +++ b/src/server/game/Mails/Mail.cpp
- @@ -20,6 +20,7 @@
- #include "Mail.h"
- #include "Log.h"
- #include "World.h"
- +#include "WorldSession.h"
- #include "ObjectMgr.h"
- #include "Player.h"
- #include "Unit.h"
- @@ -281,3 +282,64 @@ void MailDraft::SendMailTo(SQLTransaction& trans, MailReceiver const& receiver,
- deleteIncludedItems(temp);
- }
- }
- +
- +void WorldSession::SendExternalMails()
- +{
- + TC_LOG_DEBUG("entities.player.character", "External Mail> Sending mails in queue...");
- +
- + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_GET_EXTERNAL_MAIL);
- + PreparedQueryResult result = CharacterDatabase.Query(stmt);
- + if (!result)
- + {
- + TC_LOG_DEBUG("entities.player.character", "External Mail> No mails in queue...");
- + return;
- + }
- +
- + SQLTransaction trans = CharacterDatabase.BeginTransaction();
- +
- + MailDraft* mail = NULL;
- +
- + do
- + {
- + Field *fields = result->Fetch();
- + uint32 id = fields[0].GetUInt32();
- + uint32 receiver_guid = fields[1].GetUInt32();
- + std::string subject = fields[2].GetString();
- + std::string body = fields[3].GetString();
- + uint32 money = fields[4].GetUInt32();
- + uint32 itemId = fields[5].GetUInt32();
- + uint32 itemCount = fields[6].GetUInt32();
- +
- + Player *receiver = ObjectAccessor::FindPlayer(receiver_guid);
- +
- + mail = new MailDraft(subject, body);
- +
- + if (money)
- + {
- + TC_LOG_DEBUG("entities.player.character", "External Mail> Adding money");
- + mail->AddMoney(money);
- + }
- +
- + if (itemId)
- + {
- + TC_LOG_DEBUG("entities.player.character", "External Mail> Adding %u of item with id %u", itemCount, itemId);
- + if(Item* mailItem = Item::CreateItem(itemId, itemCount))
- + {
- + mailItem->SaveToDB(trans);
- + mail->AddItem(mailItem);
- + }
- + }
- +
- + mail->SendMailTo(trans, receiver ? receiver : MailReceiver(receiver_guid), MailSender(MAIL_NORMAL, 0, MAIL_STATIONERY_GM), MAIL_CHECK_MASK_RETURNED);
- + delete mail;
- +
- + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_EXTERNAL_MAIL);
- + stmt->setUInt32(0, id);
- + trans->Append(stmt);
- +
- + TC_LOG_DEBUG("entities.player.character", "External Mail> Mail sent");
- + } while (result->NextRow());
- +
- + CharacterDatabase.CommitTransaction(trans);
- + TC_LOG_DEBUG("entities.player.character", "External Mail> All Mails Sent...");
- +}
- \ No newline at end of file
- diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h
- index f7269ae..26d6cef 100644
- --- a/src/server/game/Server/WorldSession.h
- +++ b/src/server/game/Server/WorldSession.h
- @@ -340,6 +340,7 @@ class WorldSession
- }
- }
- //used with item_page table
- + static void SendExternalMails();
- bool SendItemInfo(uint32 itemid, WorldPacket data);
- //auction
- void SendAuctionHello(uint64 guid, Creature* unit);
- diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp
- index 03531cc..d954970 100644
- --- a/src/server/game/World/World.cpp
- +++ b/src/server/game/World/World.cpp
- @@ -1267,6 +1267,10 @@ void World::LoadConfigSettings(bool reload)
- m_int_configs[CONFIG_GUILD_DAILY_XP_CAP] = sConfigMgr->GetIntDefault("Guild.DailyXPCap", 7807500);
- m_int_configs[CONFIG_GUILD_WEEKLY_REP_CAP] = sConfigMgr->GetIntDefault("Guild.WeeklyReputationCap", 4375);
- + // External Mail
- + m_bool_configs[CONFIG_EXTERNAL_MAIL_ENABLE] = sConfigMgr->GetBoolDefault("External.Mail.Enable", false);
- + m_int_configs[CONFIG_EXTERNAL_MAIL_INTERVAL] = sConfigMgr->GetIntDefault("External.Mail.Interval", 1);
- +
- // misc
- m_bool_configs[CONFIG_PDUMP_NO_PATHS] = sConfigMgr->GetBoolDefault("PlayerDump.DisallowPaths", true);
- m_bool_configs[CONFIG_PDUMP_NO_OVERWRITE] = sConfigMgr->GetBoolDefault("PlayerDump.DisallowOverwrite", true);
- @@ -1826,7 +1830,9 @@ void World::SetInitialWorldSettings()
- tm localTm;
- localtime_r(&m_gameTime, &localTm);
- mail_timer = ((((localTm.tm_hour + 20) % 24)* HOUR * IN_MILLISECONDS) / m_timers[WUPDATE_AUCTIONS].GetInterval());
- - //1440
- +
- + extmail_timer.SetInterval(m_int_configs[CONFIG_EXTERNAL_MAIL_INTERVAL] * MINUTE * IN_MILLISECONDS);
- +
- mail_timer_expires = ((DAY * IN_MILLISECONDS) / (m_timers[WUPDATE_AUCTIONS].GetInterval()));
- TC_LOG_INFO("server.loading", "Mail timer set to: " UI64FMTD ", mail return is called every " UI64FMTD " minutes", uint64(mail_timer), uint64(mail_timer_expires));
- @@ -2032,7 +2038,18 @@ void World::Update(uint32 diff)
- if (m_gameTime > m_NextCurrencyReset)
- ResetCurrencyWeekCap();
- -
- +
- + // Handle external mail
- + if (sWorld->getBoolConfig(CONFIG_EXTERNAL_MAIL_ENABLE))
- + {
- + extmail_timer.Update(diff);
- + if (extmail_timer.Passed())
- + {
- + WorldSession::SendExternalMails();
- + extmail_timer.Reset();
- + }
- + }
- +
- /// <ul><li> Handle auctions when the timer has passed
- if (m_timers[WUPDATE_AUCTIONS].Passed())
- {
- diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h
- index 149a07d..5611765 100644
- --- a/src/server/game/World/World.h
- +++ b/src/server/game/World/World.h
- @@ -168,7 +168,8 @@ enum WorldBoolConfigs
- CONFIG_DUEL_RESET_COOLDOWN_ON_FINISH,
- CONFIG_DUEL_RESET_COOLDOWN_ONLY_IN_ELWYNN_AND_DUROTAR,
- CONFIG_DUEL_RESET_COOLDOWN_RESET_ENERGY_ON_START,
- CONFIG_DUEL_RESET_COOLDOWN_MAX_ENERGY_ON_START,
- + CONFIG_EXTERNAL_MAIL_ENABLE,
- BOOL_CONFIG_VALUE_COUNT
- };
- @@ -356,6 +357,7 @@ enum WorldIntConfigs
- CONFIG_BG_REWARD_WINNER_CONQUEST_LAST,
- CONFIG_CREATURE_PICKPOCKET_REFILL,
- CONFIG_AHBOT_UPDATE_INTERVAL,
- + CONFIG_EXTERNAL_MAIL_INTERVAL,
- INT_CONFIG_VALUE_COUNT
- };
- @@ -806,6 +808,7 @@ class World
- time_t m_startTime;
- time_t m_gameTime;
- IntervalTimer m_timers[WUPDATE_COUNT];
- + IntervalTimer extmail_timer;
- time_t mail_timer;
- time_t mail_timer_expires;
- uint32 m_updateTime, m_updateTimeSum;
- diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.cpp b/src/server/shared/Database/Implementation/CharacterDatabase.cpp
- index adde80c..e2dd0fc 100644
- --- a/src/server/shared/Database/Implementation/CharacterDatabase.cpp
- +++ b/src/server/shared/Database/Implementation/CharacterDatabase.cpp
- @@ -142,6 +142,9 @@ void CharacterDatabaseConnection::DoPrepareStatements()
- PrepareStatement(CHAR_UPD_MAIL_RETURNED, "UPDATE mail SET sender = ?, receiver = ?, expire_time = ?, deliver_time = ?, cod = 0, checked = ? WHERE id = ?", CONNECTION_ASYNC);
- PrepareStatement(CHAR_UPD_MAIL_ITEM_RECEIVER, "UPDATE mail_items SET receiver = ? WHERE item_guid = ?", CONNECTION_ASYNC);
- PrepareStatement(CHAR_UPD_ITEM_OWNER, "UPDATE item_instance SET owner_guid = ? WHERE guid = ?", CONNECTION_ASYNC);
- + PrepareStatement(CHAR_GET_EXTERNAL_MAIL, "SELECT id, receiver, subject, message, money, item, item_count FROM mail_external ORDER BY id ASC", CONNECTION_SYNCH);
- + PrepareStatement(CHAR_DEL_EXTERNAL_MAIL, "DELETE FROM mail_external WHERE id = ?", CONNECTION_ASYNC);
- +
- PrepareStatement(CHAR_SEL_ITEM_REFUNDS, "SELECT player_guid, paidMoney, paidExtendedCost FROM item_refund_instance WHERE item_guid = ? AND player_guid = ? LIMIT 1", CONNECTION_SYNCH);
- PrepareStatement(CHAR_SEL_ITEM_BOP_TRADE, "SELECT allowedPlayers FROM item_soulbound_trade_data WHERE itemGuid = ? LIMIT 1", CONNECTION_SYNCH);
- diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.h b/src/server/shared/Database/Implementation/CharacterDatabase.h
- index e2a046a..fdc5ff7 100644
- --- a/src/server/shared/Database/Implementation/CharacterDatabase.h
- +++ b/src/server/shared/Database/Implementation/CharacterDatabase.h
- @@ -142,6 +142,8 @@ enum CharacterDatabaseStatements
- CHAR_UPD_MAIL_RETURNED,
- CHAR_UPD_MAIL_ITEM_RECEIVER,
- CHAR_UPD_ITEM_OWNER,
- + CHAR_GET_EXTERNAL_MAIL,
- + CHAR_DEL_EXTERNAL_MAIL,
- CHAR_SEL_ITEM_REFUNDS,
- CHAR_SEL_ITEM_BOP_TRADE,
- CHAR_DEL_ITEM_BOP_TRADE,
- diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist
- index c1dde25..6da38db 100644
- --- a/src/server/worldserver/worldserver.conf.dist
- +++ b/src/server/worldserver/worldserver.conf.dist
- @@ -2596,6 +2596,20 @@ PlayerDump.DisallowOverwrite = 1
- UI.ShowQuestLevelsInDialogs = 0
- #
- +# External.Mail.Enable
- +# Enable external mail delivery from mail_external table.
- +# Default: 0 (disabled)
- +# 1 (enabled)
- +#
- +# External.Mail.Interval
- +# Mail delivery delay time for item sending from mail_external table, in minutes.
- +# Default: 5 minutes
- +#
- +
- +External.Mail.Enable = 1
- +External.Mail.Interval = 5
- +
- +#
- ###################################################################################################
- ###################################
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement