diff options
Diffstat (limited to 'src/server/game/Mails/Mail.h')
-rw-r--r-- | src/server/game/Mails/Mail.h | 202 |
1 files changed, 202 insertions, 0 deletions
diff --git a/src/server/game/Mails/Mail.h b/src/server/game/Mails/Mail.h new file mode 100644 index 00000000000..b0103897864 --- /dev/null +++ b/src/server/game/Mails/Mail.h @@ -0,0 +1,202 @@ +/* + * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/> + * + * Copyright (C) 2008-2010 Trinity <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#ifndef TRINITY_MAIL_H +#define TRINITY_MAIL_H + +#include "Common.h" +#include <map> + +struct AuctionEntry; +class Item; +class Object; +class Player; + +#define MAIL_BODY_ITEM_TEMPLATE 8383 // - plain letter, A Dusty Unsent Letter: 889 +#define MAX_MAIL_ITEMS 12 + +enum MailMessageType +{ + MAIL_NORMAL = 0, + MAIL_AUCTION = 2, + MAIL_CREATURE = 3, // client send CMSG_CREATURE_QUERY on this mailmessagetype + MAIL_GAMEOBJECT = 4, // client send CMSG_GAMEOBJECT_QUERY on this mailmessagetype + MAIL_ITEM = 5, // client send CMSG_ITEM_QUERY on this mailmessagetype +}; + +enum MailCheckMask +{ + MAIL_CHECK_MASK_NONE = 0x00, + MAIL_CHECK_MASK_READ = 0x01, + MAIL_CHECK_MASK_RETURNED = 0x02, /// This mail was returned. Do not allow returning mail back again. + MAIL_CHECK_MASK_COPIED = 0x04, /// This mail was copied. Do not allow making a copy of items in mail. + MAIL_CHECK_MASK_COD_PAYMENT = 0x08, + MAIL_CHECK_MASK_HAS_BODY = 0x10, /// This mail has body text. +}; + +// gathered from Stationery.dbc +enum MailStationery +{ + MAIL_STATIONERY_TEST = 1, + MAIL_STATIONERY_DEFAULT = 41, + MAIL_STATIONERY_GM = 61, + MAIL_STATIONERY_AUCTION = 62, + MAIL_STATIONERY_VAL = 64, + MAIL_STATIONERY_CHR = 65, +}; + +enum MailState +{ + MAIL_STATE_UNCHANGED = 1, + MAIL_STATE_CHANGED = 2, + MAIL_STATE_DELETED = 3 +}; + +enum MailAuctionAnswers +{ + AUCTION_OUTBIDDED = 0, + AUCTION_WON = 1, + AUCTION_SUCCESSFUL = 2, + AUCTION_EXPIRED = 3, + AUCTION_CANCELLED_TO_BIDDER = 4, + AUCTION_CANCELED = 5, + AUCTION_SALE_PENDING = 6 +}; + +class MailSender +{ + public: // Constructors + MailSender(MailMessageType messageType, uint32 sender_guidlow_or_entry, MailStationery stationery = MAIL_STATIONERY_DEFAULT) + : m_messageType(messageType), m_senderId(sender_guidlow_or_entry), m_stationery(stationery) + { + } + MailSender(Object* sender, MailStationery stationery = MAIL_STATIONERY_DEFAULT); + MailSender(AuctionEntry* sender); + public: // Accessors + MailMessageType GetMailMessageType() const { return m_messageType; } + uint32 GetSenderId() const { return m_senderId; } + MailStationery GetStationery() const { return m_stationery; } + private: + MailMessageType m_messageType; + uint32 m_senderId; // player low guid or other object entry + MailStationery m_stationery; +}; + +class MailReceiver +{ + public: // Constructors + explicit MailReceiver(uint32 receiver_lowguid) : m_receiver(NULL), m_receiver_lowguid(receiver_lowguid) {} + MailReceiver(Player* receiver); + MailReceiver(Player* receiver,uint32 receiver_lowguid); + public: // Accessors + Player* GetPlayer() const { return m_receiver; } + uint32 GetPlayerGUIDLow() const { return m_receiver_lowguid; } + private: + Player* m_receiver; + uint32 m_receiver_lowguid; +}; + +class MailDraft +{ + typedef std::map<uint32, Item*> MailItemMap; + + public: // Constructors + explicit MailDraft(uint16 mailTemplateId, bool need_items = true) + : m_mailTemplateId(mailTemplateId), m_mailTemplateItemsNeed(need_items), m_money(0), m_COD(0) + {} + MailDraft(std::string subject, std::string body) + : m_mailTemplateId(0), m_mailTemplateItemsNeed(false), m_subject(subject), m_body(body), m_money(0), m_COD(0) {} + public: // Accessors + uint16 GetMailTemplateId() const { return m_mailTemplateId; } + std::string const& GetSubject() const { return m_subject; } + uint32 GetMoney() const { return m_money; } + uint32 GetCOD() const { return m_COD; } + std::string const& GetBody() const { return m_body; } + public: // modifiers + MailDraft& AddItem(Item* item); + MailDraft& AddMoney(uint32 money) { m_money = money; return *this; } + MailDraft& AddCOD(uint32 COD) { m_COD = COD; return *this; } + public: // finishers + void SendReturnToSender(uint32 sender_acc, uint32 sender_guid, uint32 receiver_guid); + void SendMailTo(MailReceiver const& receiver, MailSender const& sender, MailCheckMask checked = MAIL_CHECK_MASK_NONE, uint32 deliver_delay = 0); + private: + void deleteIncludedItems(bool inDB = false); + void prepareItems(Player* receiver); // called from SendMailTo for generate mailTemplateBase items + + uint16 m_mailTemplateId; + bool m_mailTemplateItemsNeed; + std::string m_subject; + std::string m_body; + + MailItemMap m_items; // Keep the items in a map to avoid duplicate guids (which can happen), store only low part of guid + + uint32 m_money; + uint32 m_COD; +}; + +struct MailItemInfo +{ + uint32 item_guid; + uint32 item_template; +}; + +struct Mail +{ + uint32 messageID; + uint8 messageType; + uint8 stationery; + uint16 mailTemplateId; + uint32 sender; + uint32 receiver; + std::string subject; + std::string body; + std::vector<MailItemInfo> items; + std::vector<uint32> removedItems; + time_t expire_time; + time_t deliver_time; + uint32 money; + uint32 COD; + uint32 checked; + MailState state; + + void AddItem(uint32 itemGuidLow, uint32 item_template) + { + MailItemInfo mii; + mii.item_guid = itemGuidLow; + mii.item_template = item_template; + items.push_back(mii); + } + + bool RemoveItem(uint32 item_guid) + { + for (std::vector<MailItemInfo>::iterator itr = items.begin(); itr != items.end(); ++itr) + { + if (itr->item_guid == item_guid) + { + items.erase(itr); + return true; + } + } + return false; + } + + bool HasItems() const { return !items.empty(); } +}; + +#endif |